xertica-ui 2.1.11 → 2.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/CHANGELOG.md +24 -3
  2. package/README.md +1 -1
  3. package/bin/cli.ts +7 -4
  4. package/bin/language-config.ts +79 -19
  5. package/components/pages/template-content/TemplateContent.tsx +204 -218
  6. package/dist/ThemeContext-BblcjQup.cjs +1855 -0
  7. package/dist/ThemeContext-BgclCB35.js +1856 -0
  8. package/dist/ThemeContext-Bo-W2WZH.js +1856 -0
  9. package/dist/ThemeContext-CP3a0jxy.cjs +1855 -0
  10. package/dist/ThemeContext-DQUOeziy.cjs +1855 -0
  11. package/dist/ThemeContext-GeEBTJ3q.cjs +1621 -0
  12. package/dist/ThemeContext-JyLK9B1o.js +1622 -0
  13. package/dist/ThemeContext-ept8jhXI.js +1856 -0
  14. package/dist/VerifyEmailPage-BIBOKV7Z.js +3214 -0
  15. package/dist/VerifyEmailPage-BiRm7Nh4.cjs +3213 -0
  16. package/dist/VerifyEmailPage-Bvfv8HVQ.js +3214 -0
  17. package/dist/VerifyEmailPage-D-FRj5TU.cjs +3213 -0
  18. package/dist/VerifyEmailPage-RrUApqBN.js +3214 -0
  19. package/dist/VerifyEmailPage-VoMI7MYH.cjs +3213 -0
  20. package/dist/VerifyEmailPage-hdB8JQGv.cjs +3213 -0
  21. package/dist/VerifyEmailPage-vYHbYK3q.js +3214 -0
  22. package/dist/XerticaProvider-AChwphCO.cjs +48 -0
  23. package/dist/XerticaProvider-AbWlr7Af.cjs +48 -0
  24. package/dist/XerticaProvider-BSyFrmC0.js +49 -0
  25. package/dist/XerticaProvider-CUYJZc32.js +49 -0
  26. package/dist/XerticaProvider-CWs6EwNa.js +49 -0
  27. package/dist/XerticaProvider-CiNKjMx1.cjs +48 -0
  28. package/dist/XerticaProvider-D5lLumH-.js +49 -0
  29. package/dist/XerticaProvider-qQUDop71.cjs +48 -0
  30. package/dist/XerticaXLogo-8TTzBjHw.cjs +251 -0
  31. package/dist/XerticaXLogo-B2svDGZh.cjs +251 -0
  32. package/dist/XerticaXLogo-BWaag64t.js +252 -0
  33. package/dist/XerticaXLogo-CFuIlYFH.js +252 -0
  34. package/dist/XerticaXLogo-ChryA6xj.js +252 -0
  35. package/dist/XerticaXLogo-CowGv7BC.js +252 -0
  36. package/dist/XerticaXLogo-DTee_y8X.cjs +251 -0
  37. package/dist/XerticaXLogo-kslQ8Tk_.cjs +251 -0
  38. package/dist/brand.cjs.js +2 -2
  39. package/dist/brand.es.js +2 -2
  40. package/dist/cli.js +54 -12
  41. package/dist/hooks.cjs.js +1 -1
  42. package/dist/hooks.es.js +1 -1
  43. package/dist/i18n.d.ts +2 -1
  44. package/dist/index.cjs.js +5 -5
  45. package/dist/index.es.js +5 -5
  46. package/dist/layout.cjs.js +1 -1
  47. package/dist/layout.es.js +1 -1
  48. package/dist/pages.cjs.js +1 -1
  49. package/dist/pages.es.js +1 -1
  50. package/dist/sidebar-B3EYhli0.cjs +800 -0
  51. package/dist/sidebar-B9NR0lCe.cjs +800 -0
  52. package/dist/sidebar-BvF5I2Ue.cjs +800 -0
  53. package/dist/sidebar-CRMiBtAi.js +801 -0
  54. package/dist/sidebar-CZ2mWaMM.cjs +800 -0
  55. package/dist/sidebar-CplprZpM.js +801 -0
  56. package/dist/sidebar-KIS0C2JH.js +801 -0
  57. package/dist/sidebar-OTO_up7Z.js +801 -0
  58. package/dist/xertica-ui.css +1 -1
  59. package/docs/architecture-improvements.md +11 -31
  60. package/docs/architecture.md +15 -4
  61. package/docs/i18n.md +112 -64
  62. package/docs/llms.md +1 -1
  63. package/guidelines/Guidelines.md +15 -8
  64. package/llms-compact.txt +1 -1
  65. package/llms-full.txt +5 -2
  66. package/llms.txt +1 -1
  67. package/package.json +1 -1
  68. package/templates/CLAUDE.md +165 -180
  69. package/templates/guidelines/Guidelines.md +17 -7
  70. package/templates/package.json +2 -2
  71. package/templates/src/app/App.tsx +1 -1
  72. package/templates/src/features/auth/ui/ForgotPasswordContent.tsx +9 -7
  73. package/templates/src/features/auth/ui/LoginContent.tsx +10 -8
  74. package/templates/src/features/auth/ui/ResetPasswordContent.tsx +179 -177
  75. package/templates/src/features/auth/ui/SocialLoginButtons.tsx +9 -4
  76. package/templates/src/features/auth/ui/VerifyEmailContent.tsx +84 -82
  77. package/templates/src/features/template/ui/CrudTemplate.tsx +115 -100
  78. package/templates/src/features/template/ui/DashboardTemplate.tsx +110 -94
  79. package/templates/src/features/template/ui/FormTemplate.tsx +117 -117
  80. package/templates/src/features/template/ui/LoginTemplate.tsx +59 -52
  81. package/templates/src/features/template/ui/TemplateContent.tsx +1314 -1193
  82. package/templates/src/i18n.ts +54 -7
  83. package/templates/src/locales/en/common.json +21 -0
  84. package/templates/src/locales/en/components/activityCard.json +10 -0
  85. package/templates/src/locales/en/components/assistant.json +119 -0
  86. package/templates/src/locales/en/components/media.json +29 -0
  87. package/templates/src/locales/en/components/notificationCard.json +5 -0
  88. package/templates/src/locales/en/components/profileCard.json +8 -0
  89. package/templates/src/locales/en/components/projectCard.json +10 -0
  90. package/templates/src/locales/en/components/sidebar.json +14 -0
  91. package/templates/src/locales/en/components/stats.json +8 -0
  92. package/templates/src/locales/en/components/team.json +14 -0
  93. package/templates/src/locales/en/errors.json +9 -0
  94. package/templates/src/locales/en/languageSelector.json +7 -0
  95. package/templates/src/locales/en/nav.json +6 -0
  96. package/templates/src/locales/en/pages/crudTemplate.json +25 -0
  97. package/templates/src/locales/en/pages/dashboardTemplate.json +20 -0
  98. package/templates/src/locales/en/pages/forgotPassword.json +10 -0
  99. package/templates/src/locales/en/pages/formTemplate.json +16 -0
  100. package/templates/src/locales/en/pages/home.json +7 -0
  101. package/templates/src/locales/en/pages/login.json +15 -0
  102. package/templates/src/locales/en/pages/loginTemplate.json +9 -0
  103. package/templates/src/locales/en/pages/resetPassword.json +18 -0
  104. package/templates/src/locales/en/pages/templates.json +317 -0
  105. package/templates/src/locales/en/pages/verifyEmail.json +12 -0
  106. package/templates/src/locales/en/themeToggle.json +6 -0
  107. package/templates/src/locales/es/common.json +21 -0
  108. package/templates/src/locales/es/components/activityCard.json +10 -0
  109. package/templates/src/locales/es/components/assistant.json +119 -0
  110. package/templates/src/locales/es/components/media.json +29 -0
  111. package/templates/src/locales/es/components/notificationCard.json +5 -0
  112. package/templates/src/locales/es/components/profileCard.json +8 -0
  113. package/templates/src/locales/es/components/projectCard.json +10 -0
  114. package/templates/src/locales/es/components/sidebar.json +14 -0
  115. package/templates/src/locales/es/components/stats.json +8 -0
  116. package/templates/src/locales/es/components/team.json +14 -0
  117. package/templates/src/locales/es/errors.json +9 -0
  118. package/templates/src/locales/es/languageSelector.json +7 -0
  119. package/templates/src/locales/es/nav.json +6 -0
  120. package/templates/src/locales/es/pages/crudTemplate.json +25 -0
  121. package/templates/src/locales/es/pages/dashboardTemplate.json +20 -0
  122. package/templates/src/locales/es/pages/forgotPassword.json +10 -0
  123. package/templates/src/locales/es/pages/formTemplate.json +16 -0
  124. package/templates/src/locales/es/pages/home.json +7 -0
  125. package/templates/src/locales/es/pages/login.json +15 -0
  126. package/templates/src/locales/es/pages/loginTemplate.json +9 -0
  127. package/templates/src/locales/es/pages/resetPassword.json +18 -0
  128. package/templates/src/locales/es/pages/templates.json +317 -0
  129. package/templates/src/locales/es/pages/verifyEmail.json +12 -0
  130. package/templates/src/locales/es/themeToggle.json +6 -0
  131. package/templates/src/locales/pt-BR/common.json +21 -0
  132. package/templates/src/locales/pt-BR/components/activityCard.json +10 -0
  133. package/templates/src/locales/pt-BR/components/assistant.json +119 -0
  134. package/templates/src/locales/pt-BR/components/media.json +29 -0
  135. package/templates/src/locales/pt-BR/components/notificationCard.json +5 -0
  136. package/templates/src/locales/pt-BR/components/profileCard.json +8 -0
  137. package/templates/src/locales/pt-BR/components/projectCard.json +10 -0
  138. package/templates/src/locales/pt-BR/components/sidebar.json +14 -0
  139. package/templates/src/locales/pt-BR/components/stats.json +8 -0
  140. package/templates/src/locales/pt-BR/components/team.json +14 -0
  141. package/templates/src/locales/pt-BR/errors.json +9 -0
  142. package/templates/src/locales/pt-BR/languageSelector.json +7 -0
  143. package/templates/src/locales/pt-BR/nav.json +6 -0
  144. package/templates/src/locales/pt-BR/pages/crudTemplate.json +25 -0
  145. package/templates/src/locales/pt-BR/pages/dashboardTemplate.json +20 -0
  146. package/templates/src/locales/pt-BR/pages/forgotPassword.json +10 -0
  147. package/templates/src/locales/pt-BR/pages/formTemplate.json +16 -0
  148. package/templates/src/locales/pt-BR/pages/home.json +7 -0
  149. package/templates/src/locales/pt-BR/pages/login.json +15 -0
  150. package/templates/src/locales/pt-BR/pages/loginTemplate.json +9 -0
  151. package/templates/src/locales/pt-BR/pages/resetPassword.json +18 -0
  152. package/templates/src/locales/pt-BR/pages/templates.json +317 -0
  153. package/templates/src/locales/pt-BR/pages/verifyEmail.json +12 -0
  154. package/templates/src/locales/pt-BR/themeToggle.json +6 -0
  155. package/templates/src/pages/AssistantPage.tsx +464 -463
  156. package/templates/vite.config.ts +35 -5
  157. package/templates/src/locales/en.json +0 -306
  158. package/templates/src/locales/es.json +0 -306
  159. package/templates/src/locales/pt-BR.json +0 -306
@@ -129,7 +129,7 @@ export function TemplateContent() {
129
129
 
130
130
  const handleFormSubmit = (e: React.FormEvent) => {
131
131
  e.preventDefault();
132
- toast.success('Form submitted successfully!');
132
+ toast.success(t('templates.formSubmitSuccess'));
133
133
  };
134
134
 
135
135
  return (
@@ -144,8 +144,8 @@ export function TemplateContent() {
144
144
  showThemeToggle={true}
145
145
  showLanguageSelector={true}
146
146
  breadcrumbs={[
147
- { label: 'Design System', href: '/home', icon: <Home className="w-4 h-4" /> },
148
- { label: 'Página de Template' },
147
+ { label: t('nav.designSystem'), href: '/home', icon: <Home className="w-4 h-4" /> },
148
+ { label: t('templates.breadcrumb') },
149
149
  ]}
150
150
  renderLink={(href, props) => <Link to={href} {...props} />}
151
151
  />
@@ -157,36 +157,36 @@ export function TemplateContent() {
157
157
  <div className="max-w-6xl mx-auto space-y-8">
158
158
  {/* Page header */}
159
159
  <PageHeader
160
- title="Página de Template"
161
- subtitle="Template completo com componentes do Design System"
160
+ title={t('templates.title')}
161
+ subtitle={t('templates.subtitle')}
162
162
  />
163
163
 
164
164
  {/* Page Header Example */}
165
165
  <section>
166
- <h3 className="mb-4">Header with Breadcrumbs</h3>
166
+ <h3 className="mb-4">{t('templates.headerWithBreadcrumbs.sectionTitle')}</h3>
167
167
  <Card>
168
168
  <CardHeader>
169
- <CardTitle>Main Header</CardTitle>
170
- <CardDescription>Example of Header with 4-level breadcrumbs</CardDescription>
169
+ <CardTitle>{t('templates.headerWithBreadcrumbs.cardTitle')}</CardTitle>
170
+ <CardDescription>{t('templates.headerWithBreadcrumbs.cardDescription')}</CardDescription>
171
171
  </CardHeader>
172
172
  <CardContent className="p-0 border-t bg-background overflow-hidden rounded-b-[var(--radius-lg)]">
173
173
  <Header
174
174
  className="border-b"
175
175
  breadcrumbs={[
176
- { label: 'Dashboard', href: '#', icon: <Home className="w-4 h-4" /> },
177
- { label: 'Settings', href: '#', icon: <Settings className="w-4 h-4" /> },
178
- { label: 'Users', href: '#', icon: <Users className="w-4 h-4" /> },
179
- { label: 'Access Profile' },
176
+ { label: t('templates.headerWithBreadcrumbs.breadcrumbs.dashboard'), href: '#', icon: <Home className="w-4 h-4" /> },
177
+ { label: t('templates.headerWithBreadcrumbs.breadcrumbs.settings'), href: '#', icon: <Settings className="w-4 h-4" /> },
178
+ { label: t('templates.headerWithBreadcrumbs.breadcrumbs.users'), href: '#', icon: <Users className="w-4 h-4" /> },
179
+ { label: t('templates.headerWithBreadcrumbs.breadcrumbs.accessProfile') },
180
180
  ]}
181
181
  showLanguageSelector={true}
182
182
  showThemeToggle={true}
183
183
  />
184
184
  <div className="p-6 min-h-[200px]">
185
- <h4 className="text-lg font-semibold mb-2">Example Content</h4>
185
+ <h4 className="text-lg font-semibold mb-2">{t('templates.headerWithBreadcrumbs.exampleContentTitle')}</h4>
186
186
  <p className="text-muted-foreground">
187
- Neste exemplo, o componente <strong>Header</strong> principal da aplicação
188
- agora suporta receber um array de breadcrumbs para navegações complexas com
189
- mais de 3 níveis.
187
+ {t('templates.headerWithBreadcrumbs.exampleContentDescriptionPart1')}
188
+ <strong>Header</strong>
189
+ {t('templates.headerWithBreadcrumbs.exampleContentDescriptionPart2')}
190
190
  </p>
191
191
  </div>
192
192
  </CardContent>
@@ -197,31 +197,26 @@ export function TemplateContent() {
197
197
 
198
198
  {/* Alert Examples */}
199
199
  <section>
200
- <h3 className="mb-4">Alertas</h3>
200
+ <h3 className="mb-4">{t('templates.sections.alerts')}</h3>
201
201
  <div className="grid gap-4 md:grid-cols-2">
202
202
  <Alert variant="info">
203
- <AlertTitle>Informação</AlertTitle>
204
- <AlertDescription>
205
- Este é um exemplo de alerta informativo usando os componentes do Design
206
- System.
207
- </AlertDescription>
203
+ <AlertTitle>{t('templates.alerts.infoTitle')}</AlertTitle>
204
+ <AlertDescription>{t('templates.alerts.infoDescription')}</AlertDescription>
208
205
  </Alert>
209
206
 
210
207
  <Alert variant="destructive">
211
- <AlertTitle>Erro</AlertTitle>
212
- <AlertDescription>
213
- Ocorreu um erro ao processar sua solicitação.
214
- </AlertDescription>
208
+ <AlertTitle>{t('templates.alerts.errorTitle')}</AlertTitle>
209
+ <AlertDescription>{t('templates.alerts.errorDescription')}</AlertDescription>
215
210
  </Alert>
216
211
 
217
212
  <Alert variant="success">
218
- <AlertTitle>Sucesso</AlertTitle>
219
- <AlertDescription>Operação realizada com sucesso!</AlertDescription>
213
+ <AlertTitle>{t('templates.alerts.successTitle')}</AlertTitle>
214
+ <AlertDescription>{t('templates.alerts.successDescription')}</AlertDescription>
220
215
  </Alert>
221
216
 
222
217
  <Alert variant="warning">
223
- <AlertTitle>Aviso</AlertTitle>
224
- <AlertDescription>Atenção: Esta ação não pode ser desfeita.</AlertDescription>
218
+ <AlertTitle>{t('templates.alerts.warningTitle')}</AlertTitle>
219
+ <AlertDescription>{t('templates.alerts.warningDescription')}</AlertDescription>
225
220
  </Alert>
226
221
  </div>
227
222
  </section>
@@ -230,14 +225,14 @@ export function TemplateContent() {
230
225
 
231
226
  {/* Cards & Tabs */}
232
227
  <section>
233
- <h3 className="mb-4">Cards & Abas</h3>
228
+ <h3 className="mb-4">{t('templates.sections.cardsAndTabs')}</h3>
234
229
 
235
230
  <Tabs defaultValue="overview" className="w-full">
236
231
  <TabsList className="grid w-full grid-cols-4">
237
- <TabsTrigger value="overview">Visão Geral</TabsTrigger>
238
- <TabsTrigger value="forms">Formulários</TabsTrigger>
239
- <TabsTrigger value="data">Dados</TabsTrigger>
240
- <TabsTrigger value="settings">Configurações</TabsTrigger>
232
+ <TabsTrigger value="overview">{t('templates.tabs.overview')}</TabsTrigger>
233
+ <TabsTrigger value="forms">{t('templates.tabs.forms')}</TabsTrigger>
234
+ <TabsTrigger value="data">{t('templates.tabs.data')}</TabsTrigger>
235
+ <TabsTrigger value="settings">{t('templates.tabs.settings')}</TabsTrigger>
241
236
  </TabsList>
242
237
 
243
238
  {/* Overview Tab */}
@@ -245,8 +240,8 @@ export function TemplateContent() {
245
240
  <div className="grid gap-4 md:grid-cols-3">
246
241
  <Card>
247
242
  <CardHeader>
248
- <CardTitle>Total de Usuários</CardTitle>
249
- <CardDescription>Últimos 30 dias</CardDescription>
243
+ <CardTitle>{t('stats.totalUsers')}</CardTitle>
244
+ <CardDescription>{t('stats.last30Days')}</CardDescription>
250
245
  </CardHeader>
251
246
  <CardContent>
252
247
  <div className="text-foreground">
@@ -262,8 +257,8 @@ export function TemplateContent() {
262
257
 
263
258
  <Card>
264
259
  <CardHeader>
265
- <CardTitle>Receita Total</CardTitle>
266
- <CardDescription>Mês atual</CardDescription>
260
+ <CardTitle>{t('stats.totalRevenue')}</CardTitle>
261
+ <CardDescription>{t('stats.currentMonth')}</CardDescription>
267
262
  </CardHeader>
268
263
  <CardContent>
269
264
  <div className="text-foreground">
@@ -279,8 +274,8 @@ export function TemplateContent() {
279
274
 
280
275
  <Card>
281
276
  <CardHeader>
282
- <CardTitle>Taxa de Conversão</CardTitle>
283
- <CardDescription>Semana atual</CardDescription>
277
+ <CardTitle>{t('stats.conversionRate')}</CardTitle>
278
+ <CardDescription>{t('stats.currentWeek')}</CardDescription>
284
279
  </CardHeader>
285
280
  <CardContent>
286
281
  <div className="text-foreground">
@@ -297,13 +292,13 @@ export function TemplateContent() {
297
292
 
298
293
  <Card>
299
294
  <CardHeader>
300
- <CardTitle>Progresso & Sliders</CardTitle>
301
- <CardDescription>Exemplo de componentes de progresso</CardDescription>
295
+ <CardTitle>{t('templates.overview.progressTitle')}</CardTitle>
296
+ <CardDescription>{t('templates.overview.progressDescription')}</CardDescription>
302
297
  </CardHeader>
303
298
  <CardContent className="space-y-6">
304
299
  <div className="space-y-2">
305
300
  <div className="flex items-center justify-between">
306
- <Label>Progresso do Projeto</Label>
301
+ <Label>{t('templates.overview.projectProgress')}</Label>
307
302
  <span className="[font-size:var(--text-small)] text-muted-foreground">
308
303
  {progress}%
309
304
  </span>
@@ -329,7 +324,7 @@ export function TemplateContent() {
329
324
 
330
325
  <div className="space-y-2">
331
326
  <div className="flex items-center justify-between">
332
- <Label>Volume</Label>
327
+ <Label>{t('templates.overview.volume')}</Label>
333
328
  <span className="[font-size:var(--text-small)] text-muted-foreground">
334
329
  {sliderValue[0]}%
335
330
  </span>
@@ -341,7 +336,7 @@ export function TemplateContent() {
341
336
  max={100}
342
337
  step={1}
343
338
  className="w-full"
344
- aria-label="Volume"
339
+ aria-label={t('templates.overview.volume')}
345
340
  />
346
341
  </div>
347
342
  </CardContent>
@@ -352,70 +347,68 @@ export function TemplateContent() {
352
347
  <TabsContent value="forms" className="space-y-4">
353
348
  <Card>
354
349
  <CardHeader>
355
- <CardTitle>Formulário de Cadastro</CardTitle>
356
- <CardDescription>
357
- Preencha os campos abaixo para criar uma nova conta
358
- </CardDescription>
350
+ <CardTitle>{t('templates.forms.registrationTitle')}</CardTitle>
351
+ <CardDescription>{t('templates.forms.registrationDescription')}</CardDescription>
359
352
  </CardHeader>
360
353
  <CardContent>
361
354
  <form onSubmit={handleFormSubmit} className="space-y-4">
362
355
  <div className="grid gap-4 md:grid-cols-2">
363
356
  <div className="space-y-2">
364
- <Label htmlFor="firstName">Nome</Label>
365
- <Input id="firstName" placeholder="João" />
357
+ <Label htmlFor="firstName">{t('templates.forms.firstName')}</Label>
358
+ <Input id="firstName" placeholder={t('templates.forms.firstNamePlaceholder')} />
366
359
  </div>
367
360
  <div className="space-y-2">
368
- <Label htmlFor="lastName">Sobrenome</Label>
369
- <Input id="lastName" placeholder="Silva" />
361
+ <Label htmlFor="lastName">{t('templates.forms.lastName')}</Label>
362
+ <Input id="lastName" placeholder={t('templates.forms.lastNamePlaceholder')} />
370
363
  </div>
371
364
  </div>
372
365
 
373
366
  <div className="space-y-2">
374
- <Label htmlFor="email">E-mail</Label>
367
+ <Label htmlFor="email">{t('templates.forms.email')}</Label>
375
368
  <div className="relative">
376
369
  <Mail className="absolute left-3 top-3 h-4 w-4 text-muted-foreground" />
377
370
  <Input
378
371
  id="email"
379
372
  type="email"
380
- placeholder="john@example.com"
373
+ placeholder={t('templates.forms.emailPlaceholder')}
381
374
  className="pl-10"
382
375
  />
383
376
  </div>
384
377
  </div>
385
378
 
386
379
  <div className="space-y-2">
387
- <Label htmlFor="phone">Telefone</Label>
380
+ <Label htmlFor="phone">{t('templates.forms.phone')}</Label>
388
381
  <div className="relative">
389
382
  <Phone className="absolute left-3 top-3 h-4 w-4 text-muted-foreground" />
390
383
  <Input
391
384
  id="phone"
392
385
  type="tel"
393
- placeholder="(11) 99999-9999"
386
+ placeholder={t('templates.forms.phonePlaceholder')}
394
387
  className="pl-10"
395
388
  />
396
389
  </div>
397
390
  </div>
398
391
 
399
392
  <div className="space-y-2">
400
- <Label htmlFor="role">Função</Label>
393
+ <Label htmlFor="role">{t('templates.forms.role')}</Label>
401
394
  <Select>
402
395
  <SelectTrigger id="role">
403
- <SelectValue placeholder="Selecione uma função" />
396
+ <SelectValue placeholder={t('templates.forms.rolePlaceholder')} />
404
397
  </SelectTrigger>
405
398
  <SelectContent>
406
- <SelectItem value="developer">Desenvolvedor</SelectItem>
407
- <SelectItem value="designer">Designer</SelectItem>
408
- <SelectItem value="manager">Gerente</SelectItem>
409
- <SelectItem value="analyst">Analista</SelectItem>
399
+ <SelectItem value="developer">{t('templates.forms.roles.developer')}</SelectItem>
400
+ <SelectItem value="designer">{t('templates.forms.roles.designer')}</SelectItem>
401
+ <SelectItem value="manager">{t('templates.forms.roles.manager')}</SelectItem>
402
+ <SelectItem value="analyst">{t('templates.forms.roles.analyst')}</SelectItem>
410
403
  </SelectContent>
411
404
  </Select>
412
405
  </div>
413
406
 
414
407
  <div className="space-y-2">
415
- <Label htmlFor="bio">Biografia</Label>
408
+ <Label htmlFor="bio">{t('templates.forms.bio')}</Label>
416
409
  <Textarea
417
410
  id="bio"
418
- placeholder="Conte-nos um pouco sobre você..."
411
+ placeholder={t('templates.forms.bioPlaceholder')}
419
412
  rows={4}
420
413
  />
421
414
  </div>
@@ -423,27 +416,27 @@ export function TemplateContent() {
423
416
  <Separator />
424
417
 
425
418
  <div className="space-y-4">
426
- <h4>Preferências</h4>
419
+ <h4>{t('templates.forms.preferences')}</h4>
427
420
 
428
421
  <div className="space-y-3">
429
422
  <div className="flex items-center space-x-2">
430
423
  <Checkbox id="newsletter" />
431
424
  <Label htmlFor="newsletter" className="font-normal">
432
- Receber newsletter por e-mail
425
+ {t('templates.forms.newsletter')}
433
426
  </Label>
434
427
  </div>
435
428
 
436
429
  <div className="flex items-center space-x-2">
437
430
  <Checkbox id="notifications" />
438
431
  <Label htmlFor="notifications" className="font-normal">
439
- Ativar notificações push
432
+ {t('templates.forms.pushNotifications')}
440
433
  </Label>
441
434
  </div>
442
435
 
443
436
  <div className="flex items-center space-x-2">
444
437
  <Checkbox id="updates" />
445
438
  <Label htmlFor="updates" className="font-normal">
446
- Receber atualizações sobre novos recursos
439
+ {t('templates.forms.featureUpdates')}
447
440
  </Label>
448
441
  </div>
449
442
  </div>
@@ -451,24 +444,24 @@ export function TemplateContent() {
451
444
  <Separator />
452
445
 
453
446
  <div className="space-y-3">
454
- <Label>Tipo de Conta</Label>
455
- <RadioGroup defaultValue="personal" aria-label="Tipo de Conta">
447
+ <Label>{t('templates.forms.accountType')}</Label>
448
+ <RadioGroup defaultValue="personal" aria-label={t('templates.forms.accountType')}>
456
449
  <div className="flex items-center space-x-2">
457
450
  <RadioGroupItem value="personal" id="personal" />
458
451
  <Label htmlFor="personal" className="font-normal">
459
- Pessoal
452
+ {t('templates.forms.accountPersonal')}
460
453
  </Label>
461
454
  </div>
462
455
  <div className="flex items-center space-x-2">
463
456
  <RadioGroupItem value="business" id="business" />
464
457
  <Label htmlFor="business" className="font-normal">
465
- Empresarial
458
+ {t('templates.forms.accountBusiness')}
466
459
  </Label>
467
460
  </div>
468
461
  <div className="flex items-center space-x-2">
469
462
  <RadioGroupItem value="enterprise" id="enterprise" />
470
463
  <Label htmlFor="enterprise" className="font-normal">
471
- Corporativo
464
+ {t('templates.forms.accountEnterprise')}
472
465
  </Label>
473
466
  </div>
474
467
  </RadioGroup>
@@ -477,8 +470,8 @@ export function TemplateContent() {
477
470
  </form>
478
471
  </CardContent>
479
472
  <CardFooter className="flex justify-between">
480
- <Button variant="outline">Cancelar</Button>
481
- <Button onClick={handleFormSubmit}>Criar Conta</Button>
473
+ <Button variant="outline">{t('templates.forms.cancel')}</Button>
474
+ <Button onClick={handleFormSubmit}>{t('templates.forms.createAccount')}</Button>
482
475
  </CardFooter>
483
476
  </Card>
484
477
  </TabsContent>
@@ -488,16 +481,16 @@ export function TemplateContent() {
488
481
  <SectionErrorBoundary>
489
482
  <Card>
490
483
  <CardHeader>
491
- <CardTitle>Lista de Usuários</CardTitle>
492
- <CardDescription>Gerenciar usuários do sistema</CardDescription>
484
+ <CardTitle>{t('templates.data.title')}</CardTitle>
485
+ <CardDescription>{t('templates.data.description')}</CardDescription>
493
486
  </CardHeader>
494
487
  <CardContent>
495
488
  <div className="mb-4">
496
489
  <div className="relative">
497
490
  <Search className="absolute left-3 top-3 h-4 w-4 text-muted-foreground" />
498
491
  <Input
499
- placeholder="Buscar usuários..."
500
- aria-label="Buscar usuários"
492
+ placeholder={t('templates.data.searchPlaceholder')}
493
+ aria-label={t('templates.data.searchPlaceholder')}
501
494
  className="pl-10"
502
495
  />
503
496
  </div>
@@ -569,10 +562,10 @@ export function TemplateContent() {
569
562
  </p>
570
563
  <div className="flex gap-2">
571
564
  <Button variant="outline" size="sm">
572
- Previous
565
+ {t('common.previous')}
573
566
  </Button>
574
567
  <Button variant="outline" size="sm">
575
- Next
568
+ {t('common.next')}
576
569
  </Button>
577
570
  </div>
578
571
  </CardFooter>
@@ -584,15 +577,15 @@ export function TemplateContent() {
584
577
  <TabsContent value="settings" className="space-y-4">
585
578
  <Card>
586
579
  <CardHeader>
587
- <CardTitle>Configurações do Sistema</CardTitle>
588
- <CardDescription>Gerenciar configurações gerais</CardDescription>
580
+ <CardTitle>{t('templates.settings.title')}</CardTitle>
581
+ <CardDescription>{t('templates.settings.description')}</CardDescription>
589
582
  </CardHeader>
590
583
  <CardContent className="space-y-6">
591
584
  <div className="flex items-center justify-between">
592
585
  <div className="space-y-1">
593
- <Label htmlFor="dark-mode">Dark Mode</Label>
586
+ <Label htmlFor="dark-mode">{t('templates.settings.darkMode')}</Label>
594
587
  <p className="text-muted-foreground">
595
- Enable dark theme in the interface
588
+ {t('templates.settings.darkModeDescription')}
596
589
  </p>
597
590
  </div>
598
591
  <Switch
@@ -606,9 +599,9 @@ export function TemplateContent() {
606
599
 
607
600
  <div className="flex items-center justify-between">
608
601
  <div className="space-y-1">
609
- <Label htmlFor="email-notifications">Email Notifications</Label>
602
+ <Label htmlFor="email-notifications">{t('templates.settings.emailNotifications')}</Label>
610
603
  <p className="text-muted-foreground">
611
- Receive important updates by email
604
+ {t('templates.settings.emailNotificationsDescription')}
612
605
  </p>
613
606
  </div>
614
607
  <Switch id="email-notifications" defaultChecked />
@@ -618,9 +611,9 @@ export function TemplateContent() {
618
611
 
619
612
  <div className="flex items-center justify-between">
620
613
  <div className="space-y-1">
621
- <Label htmlFor="push-notifications">Push Notifications</Label>
614
+ <Label htmlFor="push-notifications">{t('templates.settings.pushNotifications')}</Label>
622
615
  <p className="text-muted-foreground">
623
- Receive instant notifications in the browser
616
+ {t('templates.settings.pushNotificationsDescription')}
624
617
  </p>
625
618
  </div>
626
619
  <Switch id="push-notifications" />
@@ -629,15 +622,15 @@ export function TemplateContent() {
629
622
  <Separator />
630
623
 
631
624
  <div className="space-y-3">
632
- <Label>Language</Label>
625
+ <Label>{t('templates.settings.language')}</Label>
633
626
  <Select defaultValue="pt-br">
634
- <SelectTrigger aria-label="Idioma do sistema">
627
+ <SelectTrigger aria-label={t('templates.settings.language')}>
635
628
  <SelectValue />
636
629
  </SelectTrigger>
637
630
  <SelectContent>
638
- <SelectItem value="pt-br">Portuguese (Brazil)</SelectItem>
639
- <SelectItem value="en">English</SelectItem>
640
- <SelectItem value="es">Spanish</SelectItem>
631
+ <SelectItem value="pt-br">{t('templates.settings.languages.ptBR')}</SelectItem>
632
+ <SelectItem value="en">{t('templates.settings.languages.en')}</SelectItem>
633
+ <SelectItem value="es">{t('templates.settings.languages.es')}</SelectItem>
641
634
  </SelectContent>
642
635
  </Select>
643
636
  </div>
@@ -645,26 +638,26 @@ export function TemplateContent() {
645
638
  <Separator />
646
639
 
647
640
  <div className="space-y-3">
648
- <Label>Time Zone</Label>
641
+ <Label>{t('templates.settings.timezone')}</Label>
649
642
  <Select defaultValue="america-sao-paulo">
650
- <SelectTrigger aria-label="Fuso horário">
643
+ <SelectTrigger aria-label={t('templates.settings.timezone')}>
651
644
  <SelectValue />
652
645
  </SelectTrigger>
653
646
  <SelectContent>
654
647
  <SelectItem value="america-sao-paulo">
655
- America/Sao Paulo (GMT-3)
648
+ {t('templates.settings.timezones.saoPaulo')}
656
649
  </SelectItem>
657
650
  <SelectItem value="america-new-york">
658
- America/New York (GMT-5)
651
+ {t('templates.settings.timezones.newYork')}
659
652
  </SelectItem>
660
- <SelectItem value="europe-london">Europe/London (GMT+0)</SelectItem>
653
+ <SelectItem value="europe-london">{t('templates.settings.timezones.london')}</SelectItem>
661
654
  </SelectContent>
662
655
  </Select>
663
656
  </div>
664
657
  </CardContent>
665
658
  <CardFooter className="flex justify-between">
666
- <Button variant="outline">Restaurar Padrões</Button>
667
- <Button>Salvar Alterações</Button>
659
+ <Button variant="outline">{t('templates.settings.restoreDefaults')}</Button>
660
+ <Button>{t('templates.settings.saveChanges')}</Button>
668
661
  </CardFooter>
669
662
  </Card>
670
663
  </TabsContent>
@@ -675,15 +668,15 @@ export function TemplateContent() {
675
668
 
676
669
  {/* Button Variants */}
677
670
  <section>
678
- <h3 className="mb-4">Botões</h3>
671
+ <h3 className="mb-4">{t('templates.sections.buttons')}</h3>
679
672
  <Card>
680
673
  <CardHeader>
681
- <CardTitle>Variações de Botão</CardTitle>
682
- <CardDescription>Diferentes estilos e tamanhos de botões</CardDescription>
674
+ <CardTitle>{t('templates.buttons.title')}</CardTitle>
675
+ <CardDescription>{t('templates.buttons.description')}</CardDescription>
683
676
  </CardHeader>
684
677
  <CardContent className="space-y-6">
685
678
  <div className="space-y-3">
686
- <Label>Variants</Label>
679
+ <Label>{t('templates.buttons.variants')}</Label>
687
680
  <div className="flex flex-wrap gap-3">
688
681
  <Button variant="default">Default</Button>
689
682
  <Button variant="secondary">Secondary</Button>
@@ -697,12 +690,12 @@ export function TemplateContent() {
697
690
  <Separator />
698
691
 
699
692
  <div className="space-y-3">
700
- <Label>Sizes</Label>
693
+ <Label>{t('templates.buttons.sizes')}</Label>
701
694
  <div className="flex flex-wrap items-center gap-3">
702
695
  <Button size="sm">Small</Button>
703
696
  <Button size="default">Default</Button>
704
697
  <Button size="lg">Large</Button>
705
- <Button size="icon" aria-label="Configurações">
698
+ <Button size="icon" aria-label={t('nav.settings')}>
706
699
  <Settings className="h-4 w-4" />
707
700
  </Button>
708
701
  </div>
@@ -711,19 +704,19 @@ export function TemplateContent() {
711
704
  <Separator />
712
705
 
713
706
  <div className="space-y-3">
714
- <Label>With Icons</Label>
707
+ <Label>{t('templates.buttons.withIcons')}</Label>
715
708
  <div className="flex flex-wrap gap-3">
716
709
  <Button>
717
710
  <User className="mr-2 h-4 w-4" />
718
- Profile
711
+ {t('templates.buttons.profile')}
719
712
  </Button>
720
713
  <Button variant="secondary">
721
714
  <Mail className="mr-2 h-4 w-4" />
722
- Messages
715
+ {t('templates.buttons.messages')}
723
716
  </Button>
724
717
  <Button variant="outline">
725
718
  <Calendar className="mr-2 h-4 w-4" />
726
- Schedule
719
+ {t('templates.buttons.schedule')}
727
720
  </Button>
728
721
  </div>
729
722
  </div>
@@ -731,11 +724,11 @@ export function TemplateContent() {
731
724
  <Separator />
732
725
 
733
726
  <div className="space-y-3">
734
- <Label>States</Label>
727
+ <Label>{t('templates.buttons.states')}</Label>
735
728
  <div className="flex flex-wrap gap-3">
736
- <Button disabled>Disabled</Button>
729
+ <Button disabled>{t('templates.buttons.disabled')}</Button>
737
730
  <Button variant="outline" disabled>
738
- Outline Disabled
731
+ {t('templates.buttons.outlineDisabled')}
739
732
  </Button>
740
733
  </div>
741
734
  </div>
@@ -747,22 +740,20 @@ export function TemplateContent() {
747
740
 
748
741
  {/* Badges */}
749
742
  <section>
750
- <h3 className="mb-4">Badges</h3>
743
+ <h3 className="mb-4">{t('templates.sections.badges')}</h3>
751
744
  <Card>
752
745
  <CardHeader>
753
- <CardTitle>Variações de Badge</CardTitle>
754
- <CardDescription>
755
- Estilos diferentes de badge para status e tags
756
- </CardDescription>
746
+ <CardTitle>{t('templates.badges.title')}</CardTitle>
747
+ <CardDescription>{t('templates.badges.description')}</CardDescription>
757
748
  </CardHeader>
758
749
  <CardContent>
759
750
  <div className="flex flex-wrap gap-3">
760
- <Badge variant="default">Padrão</Badge>
761
- <Badge variant="secondary">Secundário</Badge>
762
- <Badge variant="outline">Contorno</Badge>
763
- <Badge variant="destructive">Destrutivo</Badge>
764
- <Badge className="bg-success text-success-foreground">Sucesso</Badge>
765
- <Badge className="bg-warning text-warning-foreground">Aviso</Badge>
751
+ <Badge variant="default">Default</Badge>
752
+ <Badge variant="secondary">Secondary</Badge>
753
+ <Badge variant="outline">Outline</Badge>
754
+ <Badge variant="destructive">Destructive</Badge>
755
+ <Badge className="bg-success text-success-foreground">Success</Badge>
756
+ <Badge className="bg-warning text-warning-foreground">Warning</Badge>
766
757
  <Badge className="bg-info text-info-foreground">Info</Badge>
767
758
  </div>
768
759
  </CardContent>
@@ -773,41 +764,41 @@ export function TemplateContent() {
773
764
 
774
765
  {/* Dialogs */}
775
766
  <section>
776
- <h3 className="mb-4">Diálogos</h3>
767
+ <h3 className="mb-4">{t('templates.sections.dialogs')}</h3>
777
768
  <div className="grid gap-4 md:grid-cols-2">
778
769
  <Card>
779
770
  <CardHeader>
780
- <CardTitle>Diálogo</CardTitle>
781
- <CardDescription>Um modal interativo básico</CardDescription>
771
+ <CardTitle>{t('templates.dialogs.dialogTitle')}</CardTitle>
772
+ <CardDescription>{t('templates.dialogs.dialogDescription')}</CardDescription>
782
773
  </CardHeader>
783
774
  <CardContent className="flex justify-center py-6">
784
775
  <Dialog>
785
776
  <DialogTrigger asChild>
786
- <Button variant="outline">Editar Perfil</Button>
777
+ <Button variant="outline">{t('templates.dialogs.editProfile')}</Button>
787
778
  </DialogTrigger>
788
779
  <DialogContent className="sm:max-w-[425px]">
789
780
  <DialogHeader>
790
- <DialogTitle>Editar Perfil</DialogTitle>
781
+ <DialogTitle>{t('templates.dialogs.editProfile')}</DialogTitle>
791
782
  <DialogDescription>
792
- Faça alterações no seu perfil aqui. Clique em salvar quando terminar.
783
+ {t('templates.dialogs.editProfileDescription')}
793
784
  </DialogDescription>
794
785
  </DialogHeader>
795
786
  <div className="grid gap-4 py-4">
796
787
  <div className="grid grid-cols-4 items-center gap-4">
797
788
  <Label htmlFor="name" className="text-right">
798
- Nome
789
+ {t('templates.dialogs.name')}
799
790
  </Label>
800
791
  <Input id="name" defaultValue="John Doe" className="col-span-3" />
801
792
  </div>
802
793
  <div className="grid grid-cols-4 items-center gap-4">
803
794
  <Label htmlFor="username" className="text-right">
804
- Usuário
795
+ {t('templates.dialogs.username')}
805
796
  </Label>
806
797
  <Input id="username" defaultValue="@johndoe" className="col-span-3" />
807
798
  </div>
808
799
  </div>
809
800
  <DialogFooter>
810
- <Button type="submit">Atualizar</Button>
801
+ <Button type="submit">{t('templates.dialogs.update')}</Button>
811
802
  </DialogFooter>
812
803
  </DialogContent>
813
804
  </Dialog>
@@ -816,26 +807,25 @@ export function TemplateContent() {
816
807
 
817
808
  <Card>
818
809
  <CardHeader>
819
- <CardTitle>Alerta de Diálogo</CardTitle>
820
- <CardDescription>Um alerta para decisões importantes</CardDescription>
810
+ <CardTitle>{t('templates.dialogs.alertDialogTitle')}</CardTitle>
811
+ <CardDescription>{t('templates.dialogs.alertDialogDescription')}</CardDescription>
821
812
  </CardHeader>
822
813
  <CardContent className="flex justify-center py-6">
823
814
  <AlertDialog>
824
815
  <AlertDialogTrigger asChild>
825
- <Button variant="destructive">Excluir Conta</Button>
816
+ <Button variant="destructive">{t('templates.dialogs.deleteAccount')}</Button>
826
817
  </AlertDialogTrigger>
827
818
  <AlertDialogContent className="sm:max-w-[425px]">
828
819
  <AlertDialogHeader>
829
- <AlertDialogTitle>Você tem certeza absoluta?</AlertDialogTitle>
820
+ <AlertDialogTitle>{t('templates.dialogs.areYouSure')}</AlertDialogTitle>
830
821
  <AlertDialogDescription>
831
- Esta ação não pode ser desfeita. Isso excluirá permanentemente sua
832
- conta e removerá seus dados de nossos servidores.
822
+ {t('templates.dialogs.deleteWarning')}
833
823
  </AlertDialogDescription>
834
824
  </AlertDialogHeader>
835
825
  <AlertDialogFooter>
836
- <AlertDialogCancel>Cancelar</AlertDialogCancel>
826
+ <AlertDialogCancel>{t('templates.dialogs.cancel')}</AlertDialogCancel>
837
827
  <AlertDialogAction className="bg-destructive text-destructive-foreground hover:bg-destructive/90">
838
- Continuar
828
+ {t('templates.dialogs.continue')}
839
829
  </AlertDialogAction>
840
830
  </AlertDialogFooter>
841
831
  </AlertDialogContent>
@@ -856,17 +846,15 @@ export function TemplateContent() {
856
846
 
857
847
  {/* Header Variations */}
858
848
  <section>
859
- <h3 className="mb-4">Variações de Cabeçalho</h3>
849
+ <h3 className="mb-4">{t('templates.headerVariations.sectionTitle')}</h3>
860
850
  <Card>
861
851
  <CardHeader>
862
- <CardTitle>Configurações do Cabeçalho Principal</CardTitle>
863
- <CardDescription>
864
- O Header é focado em navegação (breadcrumbs) e ações contextuais rápidas.
865
- </CardDescription>
852
+ <CardTitle>{t('templates.headerVariations.cardTitle')}</CardTitle>
853
+ <CardDescription>{t('templates.headerVariations.cardDescription')}</CardDescription>
866
854
  </CardHeader>
867
855
  <CardContent className="space-y-6">
868
856
  <div className="p-4 border rounded-[var(--radius-lg)] bg-muted/30">
869
- <h4 className="text-sm font-semibold mb-4">Elementos Visíveis</h4>
857
+ <h4 className="text-sm font-semibold mb-4">{t('templates.headerVariations.visibleElements')}</h4>
870
858
  <div className="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-3 gap-6">
871
859
  <div className="flex items-center space-x-2">
872
860
  <Switch
@@ -875,7 +863,7 @@ export function TemplateContent() {
875
863
  onCheckedChange={setShowHeaderActions}
876
864
  />
877
865
  <Label htmlFor="header-actions" className="cursor-pointer">
878
- Botões de Ação
866
+ {t('templates.headerVariations.actionButtons')}
879
867
  </Label>
880
868
  </div>
881
869
  <div className="flex items-center space-x-2">
@@ -885,7 +873,7 @@ export function TemplateContent() {
885
873
  onCheckedChange={setShowHeaderBreadcrumbs}
886
874
  />
887
875
  <Label htmlFor="header-bread" className="cursor-pointer">
888
- Breadcrumbs
876
+ {t('templates.headerVariations.breadcrumbsLabel')}
889
877
  </Label>
890
878
  </div>
891
879
  </div>
@@ -893,20 +881,20 @@ export function TemplateContent() {
893
881
 
894
882
  <div className="relative border rounded-[var(--radius-lg)] bg-muted/10 overflow-hidden shadow-inner">
895
883
  <div className="p-4 bg-background/50 border-b text-xs font-mono text-muted-foreground">
896
- Visualização
884
+ {t('templates.headerVariations.preview')}
897
885
  </div>
898
886
  <Header
899
- title={!showHeaderBreadcrumbs ? 'Página Atual' : undefined}
887
+ title={!showHeaderBreadcrumbs ? t('templates.headerVariations.currentPage') : undefined}
900
888
  breadcrumbs={
901
889
  showHeaderBreadcrumbs
902
890
  ? [
903
891
  {
904
- label: 'Xertica UI',
892
+ label: t('templates.headerVariations.breadcrumbBrand'),
905
893
  href: '#',
906
894
  icon: <Home className="w-4 h-4" />,
907
895
  },
908
- { label: 'Configurações', href: '#' },
909
- { label: 'Perfil' },
896
+ { label: t('templates.headerVariations.breadcrumbSettings'), href: '#' },
897
+ { label: t('templates.headerVariations.breadcrumbProfile') },
910
898
  ]
911
899
  : undefined
912
900
  }
@@ -916,20 +904,20 @@ export function TemplateContent() {
916
904
  {
917
905
  id: 'notify',
918
906
  icon: <Bell className="w-5 h-5" />,
919
- onClick: () => toast('Notificações abertas'),
907
+ onClick: () => toast(t('templates.headerVariations.notificationsOpenedToast')),
920
908
  },
921
909
  {
922
910
  id: 'mail',
923
- label: 'Mensagens',
911
+ label: t('templates.headerVariations.messagesLabel'),
924
912
  icon: <Mail className="w-5 h-5" />,
925
- onClick: () => toast('Mensagens abertas'),
913
+ onClick: () => toast(t('templates.headerVariations.messagesOpenedToast')),
926
914
  },
927
915
  ]
928
916
  : undefined
929
917
  }
930
918
  />
931
919
  <div className="h-32 flex items-center justify-center text-muted-foreground text-sm italic">
932
- Área de Conteúdo da Página
920
+ {t('templates.headerVariations.contentArea')}
933
921
  </div>
934
922
  </div>
935
923
  </CardContent>
@@ -940,23 +928,21 @@ export function TemplateContent() {
940
928
 
941
929
  {/* Sidebar Variations */}
942
930
  <section>
943
- <h3 className="mb-4">Variações da Sidebar</h3>
931
+ <h3 className="mb-4">{t('templates.sections.sidebarVariations')}</h3>
944
932
  <Card>
945
933
  <CardHeader>
946
- <CardTitle>Sidebar Modo Assistente vs Padrão</CardTitle>
947
- <CardDescription>
948
- A Sidebar suporta flexibilidade através da propriedade variant.
949
- </CardDescription>
934
+ <CardTitle>{t('templates.sidebar.title')}</CardTitle>
935
+ <CardDescription>{t('templates.sidebar.description')}</CardDescription>
950
936
  </CardHeader>
951
937
  <CardContent>
952
938
  <Tabs defaultValue="assistant" className="w-full">
953
939
  <TabsList className="mb-4">
954
- <TabsTrigger value="assistant">Modo Assistente</TabsTrigger>
955
- <TabsTrigger value="default">Modo Padrão</TabsTrigger>
940
+ <TabsTrigger value="assistant">{t('templates.sidebar.assistantMode')}</TabsTrigger>
941
+ <TabsTrigger value="default">{t('templates.sidebar.defaultMode')}</TabsTrigger>
956
942
  </TabsList>
957
943
 
958
944
  <div className="mb-6 p-4 border rounded-[var(--radius-lg)] bg-muted/30">
959
- <h4 className="text-sm font-semibold mb-4">Configurações do Rodapé</h4>
945
+ <h4 className="text-sm font-semibold mb-4">{t('templates.sidebarControls.footerSettings')}</h4>
960
946
  <div className="flex flex-wrap gap-6 mt-2">
961
947
  <div className="flex items-center space-x-2">
962
948
  <Switch
@@ -965,7 +951,7 @@ export function TemplateContent() {
965
951
  onCheckedChange={setShowSidebarUser}
966
952
  />
967
953
  <Label htmlFor="show-user" className="cursor-pointer">
968
- Perfil do Usuário
954
+ {t('templates.sidebarControls.userProfile')}
969
955
  </Label>
970
956
  </div>
971
957
  <div className="flex items-center space-x-2">
@@ -975,7 +961,7 @@ export function TemplateContent() {
975
961
  onCheckedChange={setShowSidebarSettings}
976
962
  />
977
963
  <Label htmlFor="show-settings" className="cursor-pointer">
978
- Configurações
964
+ {t('templates.sidebarControls.settings')}
979
965
  </Label>
980
966
  </div>
981
967
  <div className="flex items-center space-x-2">
@@ -985,14 +971,14 @@ export function TemplateContent() {
985
971
  onCheckedChange={setShowSidebarLogout}
986
972
  />
987
973
  <Label htmlFor="show-logout" className="cursor-pointer">
988
- Botão de Sair
974
+ {t('templates.sidebarControls.logoutButton')}
989
975
  </Label>
990
976
  </div>
991
977
  </div>
992
978
 
993
979
  <div className="mt-6 pt-6 border-t">
994
980
  <div className="flex items-center justify-between mb-4">
995
- <h4 className="text-sm font-semibold">Largura da Sidebar (Desktop)</h4>
981
+ <h4 className="text-sm font-semibold">{t('templates.sidebarControls.sidebarWidthDesktop')}</h4>
996
982
  <span className="text-xs font-mono bg-muted px-2 py-1 rounded">
997
983
  {sidebarWidth}px
998
984
  </span>
@@ -1008,7 +994,7 @@ export function TemplateContent() {
1008
994
  max={450}
1009
995
  step={10}
1010
996
  className="flex-1"
1011
- aria-label="Largura da Sidebar"
997
+ aria-label={t('templates.sidebarControls.sidebarWidthAriaLabel')}
1012
998
  />
1013
999
  <span className="text-xs text-muted-foreground w-12">450px</span>
1014
1000
  </div>
@@ -1025,35 +1011,35 @@ export function TemplateContent() {
1025
1011
  width={sidebarWidth}
1026
1012
  onToggle={() => {}}
1027
1013
  user={{ email: 'admin@xertica.com' }}
1028
- onLogout={() => toast('Saiu')}
1014
+ onLogout={() => toast(t('templates.sidebar.logoutToast'))}
1029
1015
  location={{ pathname: '/assistant/current' }}
1030
1016
  navigate={() => {}}
1031
1017
  variant="assistant"
1032
1018
  search={{
1033
1019
  show: true,
1034
- placeholder: 'Buscar tópicos...',
1020
+ placeholder: t('templates.sidebar.searchTopicsPlaceholder'),
1035
1021
  filter: {
1036
1022
  show: true,
1037
1023
  content: (
1038
1024
  <div className="p-2 space-y-2">
1039
1025
  <div className="text-xs font-semibold uppercase text-muted-foreground px-2">
1040
- Filtrar por Status
1026
+ {t('templates.sidebarControls.filterByStatus')}
1041
1027
  </div>
1042
1028
  <div className="flex flex-wrap gap-2 p-1">
1043
1029
  <Badge className="bg-sidebar-foreground/20 text-sidebar-foreground border-none cursor-pointer hover:bg-sidebar-foreground/30">
1044
- Ativo
1030
+ {t('templates.sidebarControls.filterActive')}
1045
1031
  </Badge>
1046
1032
  <Badge
1047
1033
  variant="outline"
1048
1034
  className="text-sidebar-foreground/70 border-sidebar-foreground/20 cursor-pointer hover:bg-sidebar-foreground/10"
1049
1035
  >
1050
- Arquivado
1036
+ {t('templates.sidebarControls.filterArchived')}
1051
1037
  </Badge>
1052
1038
  <Badge
1053
1039
  variant="outline"
1054
1040
  className="text-sidebar-foreground/70 border-sidebar-foreground/20 cursor-pointer hover:bg-sidebar-foreground/10"
1055
1041
  >
1056
- Pendente
1042
+ {t('templates.sidebarControls.filterPending')}
1057
1043
  </Badge>
1058
1044
  </div>
1059
1045
  </div>
@@ -1065,48 +1051,48 @@ export function TemplateContent() {
1065
1051
  content: (
1066
1052
  <Button className="w-full bg-sidebar-primary hover:bg-sidebar-primary/90 text-sidebar-primary-foreground shadow-lg font-bold border-none transition-all duration-300 transform hover:scale-[1.02] active:scale-[0.98]">
1067
1053
  <Plus className="w-4 h-4 mr-2" />
1068
- Nova Conversa
1054
+ {t('templates.sidebar.newConversation')}
1069
1055
  </Button>
1070
1056
  ),
1071
1057
  }}
1072
1058
  navigationGroups={[
1073
1059
  {
1074
1060
  id: 'recent',
1075
- label: 'Recentes',
1061
+ label: t('templates.sidebar.recent'),
1076
1062
  icon: Clock,
1077
1063
  items: [
1078
1064
  {
1079
1065
  path: '/assistant/refatoracao',
1080
- label: 'Refatoração da Sidebar',
1081
- description: 'Ativo agora',
1066
+ label: t('templates.sidebar.items.sidebarRefactor'),
1067
+ description: t('templates.sidebar.items.sidebarRefactorDescription'),
1082
1068
  actions: [
1083
1069
  {
1084
- label: 'Renomear',
1070
+ label: t('templates.sidebar.actions.rename'),
1085
1071
  icon: FileEdit,
1086
- onClick: () => toast('Abrir renomear...'),
1072
+ onClick: () => toast(t('templates.sidebar.actions.renameToast')),
1087
1073
  },
1088
1074
  {
1089
- label: 'Mover',
1075
+ label: t('templates.sidebar.actions.move'),
1090
1076
  icon: ArrowRightLeft,
1091
1077
  children: [
1092
1078
  {
1093
- label: 'Projetos Ativos',
1094
- onClick: () => toast('Movido para Projetos Ativos'),
1079
+ label: t('templates.sidebar.actions.moveActive'),
1080
+ onClick: () => toast(t('templates.sidebar.actions.moveActiveToast')),
1095
1081
  },
1096
1082
  {
1097
- label: 'Monitoramento',
1098
- onClick: () => toast('Movido para Monitoramento'),
1083
+ label: t('templates.sidebar.actions.moveMonitoring'),
1084
+ onClick: () => toast(t('templates.sidebar.actions.moveMonitoringToast')),
1099
1085
  },
1100
1086
  {
1101
- label: 'Arquivar',
1102
- onClick: () => toast('Movido para Arquivo'),
1087
+ label: t('templates.sidebar.actions.moveArchive'),
1088
+ onClick: () => toast(t('templates.sidebar.actions.moveArchiveToast')),
1103
1089
  },
1104
1090
  ],
1105
1091
  },
1106
1092
  {
1107
- label: 'Limpar',
1093
+ label: t('templates.sidebar.actions.clear'),
1108
1094
  icon: Trash2,
1109
- onClick: () => toast('Histórico Limpo!'),
1095
+ onClick: () => toast(t('templates.sidebar.actions.clearToast')),
1110
1096
  variant: 'destructive',
1111
1097
  },
1112
1098
  ],
@@ -1115,24 +1101,24 @@ export function TemplateContent() {
1115
1101
  },
1116
1102
  {
1117
1103
  id: 'projects',
1118
- label: 'Monitoramento de Projetos',
1104
+ label: t('templates.sidebar.constructionMonitoring'),
1119
1105
  icon: Map,
1120
1106
  actions: [
1121
1107
  {
1122
- label: 'Nova Categoria',
1108
+ label: t('templates.sidebar.actions.newCategory'),
1123
1109
  icon: Plus,
1124
- onClick: () => toast('Criar nova categoria...'),
1110
+ onClick: () => toast(t('templates.sidebar.actions.newCategoryToast')),
1125
1111
  },
1126
1112
  {
1127
- label: 'Arquivar Grupo',
1113
+ label: t('templates.sidebar.actions.archiveGroup'),
1128
1114
  icon: Archive,
1129
- onClick: () => toast('Arquivando grupo...'),
1115
+ onClick: () => toast(t('templates.sidebar.actions.archiveGroupToast')),
1130
1116
  },
1131
1117
  ],
1132
1118
  items: [
1133
1119
  {
1134
1120
  path: '/assistant/br163',
1135
- label: 'Restauração BR-163',
1121
+ label: t('templates.sidebar.items.br163Restoration'),
1136
1122
  icon: () => (
1137
1123
  <div className="w-2 h-2 rounded-full bg-yellow-500" />
1138
1124
  ),
@@ -1143,7 +1129,7 @@ export function TemplateContent() {
1143
1129
  className="h-1.5 bg-sidebar-foreground/10"
1144
1130
  />
1145
1131
  <div className="flex justify-between items-center text-[10px] text-sidebar-foreground/60">
1146
- <span>Cuiabá, MT</span>
1132
+ <span>{t('templates.sidebar.items.br163Location')}</span>
1147
1133
  <span>67%</span>
1148
1134
  </div>
1149
1135
  </div>
@@ -1163,7 +1149,7 @@ export function TemplateContent() {
1163
1149
  style={{ left: `${sidebarWidth}px` }}
1164
1150
  >
1165
1151
  <p className="text-muted-foreground text-center">
1166
- Conteúdo do Modo Assistente
1152
+ {t('templates.sidebar.assistantContent')}
1167
1153
  </p>
1168
1154
  </div>
1169
1155
  </div>
@@ -1183,15 +1169,15 @@ export function TemplateContent() {
1183
1169
  email: 'admin@xertica.com',
1184
1170
  avatar: 'https://github.com/shadcn.png',
1185
1171
  }}
1186
- onLogout={() => toast('Saiu')}
1187
- onSettingsClick={() => toast('Configurações clicadas')}
1172
+ onLogout={() => toast(t('templates.sidebar.logoutToast'))}
1173
+ onSettingsClick={() => toast(t('templates.sidebar.settingsClickedToast'))}
1188
1174
  location={{ pathname: '/home' }}
1189
1175
  navigate={() => {}}
1190
1176
  variant="default"
1191
1177
  routes={[
1192
- { path: '/home', label: 'Início', icon: Home },
1193
- { path: '/dashboard', label: 'Dashboard', icon: Users },
1194
- { path: '/settings', label: 'Configurações', icon: Settings },
1178
+ { path: '/home', label: t('templates.sidebar.routes.home'), icon: Home },
1179
+ { path: '/dashboard', label: t('templates.sidebar.routes.dashboard'), icon: Users },
1180
+ { path: '/settings', label: t('templates.sidebar.routes.settings'), icon: Settings },
1195
1181
  ]}
1196
1182
  footer={{
1197
1183
  showUser: showSidebarUser,
@@ -1204,7 +1190,7 @@ export function TemplateContent() {
1204
1190
  style={{ left: `${sidebarWidth}px` }}
1205
1191
  >
1206
1192
  <p className="text-muted-foreground text-center">
1207
- Navegação Tradicional do Sistema
1193
+ {t('templates.sidebar.defaultContent')}
1208
1194
  </p>
1209
1195
  </div>
1210
1196
  </div>
@@ -1219,23 +1205,23 @@ export function TemplateContent() {
1219
1205
  {/* Footer Note */}
1220
1206
  <Card className="mt-8">
1221
1207
  <CardHeader>
1222
- <CardTitle>Template Pronto para CLI</CardTitle>
1223
- <CardDescription>Como usar este template</CardDescription>
1208
+ <CardTitle>{t('templates.footer.title')}</CardTitle>
1209
+ <CardDescription>{t('templates.footer.subtitle')}</CardDescription>
1224
1210
  </CardHeader>
1225
1211
  <CardContent className="space-y-4">
1226
1212
  <p className="text-muted-foreground">
1227
- Este template está pronto para ser usado como base para novos projetos. Todos os
1228
- componentes usam as variáveis CSS definidas em{' '}
1213
+ {t('templates.footer.descriptionPart1')}
1229
1214
  <code className="bg-muted px-2 py-1 rounded-[var(--radius-sm)] [font-size:var(--text-small)]">
1230
- /styles/xertica/tokens.css
1215
+ xertica-ui
1231
1216
  </code>
1232
- and follow the Xertica UI CLI-first architecture.
1217
+ {t('templates.footer.descriptionPart2')}
1233
1218
  </p>
1234
1219
  <Alert variant="info">
1235
- <AlertTitle>Dica</AlertTitle>
1220
+ <AlertTitle>{t('templates.footer.tipTitle')}</AlertTitle>
1236
1221
  <AlertDescription>
1237
- Copie este arquivo como ponto de partida para suas páginas. Todos os
1238
- componentes são reutilizáveis e customizáveis através de variáveis CSS.
1222
+ {t('templates.footer.tipDescriptionPart1')}
1223
+ <code className="bg-muted px-1 rounded">styles/xertica/tokens.css</code>
1224
+ {t('templates.footer.tipDescriptionPart2')}
1239
1225
  </AlertDescription>
1240
1226
  </Alert>
1241
1227
  </CardContent>