@@ -19,6 +19,10 @@ import { cn } from '@/lib/utils';
1919import { useTranslations } from 'next-intl' ;
2020import { useSearchParams } from 'next/navigation' ;
2121import { SendToMenu } from '@/components/ui/send-to-menu' ;
22+ import { IconTransform } from '@tabler/icons-react' ;
23+ import { ToolPageHeader } from '@/components/tools/tool-page-header' ;
24+ import { RevealItem } from '@/components/dashboard/dashboard-reveal' ;
25+ import { CATEGORY_ACCENT } from '@/components/dashboard/types' ;
2226
2327type Mode = 'encode' | 'decode' ;
2428
@@ -152,39 +156,44 @@ export function Base64Layout() {
152156 const outputCharCount = output . length ;
153157
154158 return (
155- < div className = "flex flex-col h-full gap-4" >
156- { /* Header */ }
157- < div className = "flex flex-col sm:flex-row items-start sm:items-center justify-between gap-3 shrink-0 md:hidden" >
158- < div >
159- < h1 className = "text-lg font-semibold tracking-tight" > { t ( 'title' ) } </ h1 >
160- < p className = "text-xs text-muted-foreground" > { t ( 'subtitle' ) } </ p >
161- </ div >
162- < div className = "flex items-center gap-2" >
163- < Button
164- variant = "outline"
165- size = "sm"
166- className = "gap-1.5 text-xs"
167- onClick = { ( ) => fileInputRef . current ?. click ( ) }
168- >
169- < Upload className = "h-3.5 w-3.5" />
170- { t ( 'upload' ) }
171- </ Button >
172- < input
173- ref = { fileInputRef }
174- type = "file"
175- accept = ".txt,.b64,.base64,.json,.xml,.html,.css,.js,.ts,.md"
176- className = "hidden"
177- onChange = { ( e ) => {
178- const file = e . target . files ?. [ 0 ] ;
179- if ( file ) handleFileUpload ( file ) ;
180- e . target . value = '' ;
181- } }
182- />
183- < Button variant = "outline" size = "sm" className = "gap-1.5 text-xs" onClick = { handleClear } >
184- < Trash2 className = "h-3.5 w-3.5" />
185- { t ( 'clear' ) }
186- </ Button >
187- </ div >
159+ < div className = "relative flex flex-col h-full gap-4 overflow-hidden dashboard-grid-bg" >
160+ < div className = "dash-ambient -z-10" aria-hidden />
161+
162+ < RevealItem index = { 0 } >
163+ < ToolPageHeader
164+ icon = { IconTransform }
165+ title = { t ( 'title' ) }
166+ description = { t ( 'subtitle' ) }
167+ accent = { CATEGORY_ACCENT . Converters }
168+ />
169+ </ RevealItem >
170+
171+ { /* Mobile upload/clear actions */ }
172+ < div className = "flex items-center gap-2 shrink-0 md:hidden" >
173+ < Button
174+ variant = "outline"
175+ size = "sm"
176+ className = "gap-1.5 text-xs"
177+ onClick = { ( ) => fileInputRef . current ?. click ( ) }
178+ >
179+ < Upload className = "h-3.5 w-3.5" />
180+ { t ( 'upload' ) }
181+ </ Button >
182+ < input
183+ ref = { fileInputRef }
184+ type = "file"
185+ accept = ".txt,.b64,.base64,.json,.xml,.html,.css,.js,.ts,.md"
186+ className = "hidden"
187+ onChange = { ( e ) => {
188+ const file = e . target . files ?. [ 0 ] ;
189+ if ( file ) handleFileUpload ( file ) ;
190+ e . target . value = '' ;
191+ } }
192+ />
193+ < Button variant = "outline" size = "sm" className = "gap-1.5 text-xs" onClick = { handleClear } >
194+ < Trash2 className = "h-3.5 w-3.5" />
195+ { t ( 'clear' ) }
196+ </ Button >
188197 </ div >
189198
190199 { /* Mode Toggle */ }
0 commit comments