xertica-ui 2.2.0 → 2.3.0

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 (1057) hide show
  1. package/CHANGELOG.md +28 -1
  2. package/README.md +27 -3
  3. package/assets/xertica-logo.svg +37 -37
  4. package/assets/xertica-x-logo.svg +20 -20
  5. package/bin/cli.ts +477 -70
  6. package/bin/generate-tokens.ts +262 -262
  7. package/bin/language-config.ts +361 -361
  8. package/components/assets/xertica-orbe-animation.ts +1162 -1162
  9. package/components/assistant/code-block/code-block.stories.tsx +57 -57
  10. package/components/assistant/code-block/code-block.test.tsx +44 -44
  11. package/components/assistant/code-block/index.ts +1 -1
  12. package/components/assistant/formatted-document/formatted-document.stories.tsx +51 -51
  13. package/components/assistant/formatted-document/formatted-document.test.tsx +42 -42
  14. package/components/assistant/formatted-document/index.ts +1 -1
  15. package/components/assistant/index.ts +6 -6
  16. package/components/assistant/markdown-message/MarkdownMessage.tsx +152 -152
  17. package/components/assistant/markdown-message/index.ts +1 -1
  18. package/components/assistant/markdown-message/markdown-message.stories.tsx +50 -50
  19. package/components/assistant/markdown-message/markdown-message.test.tsx +33 -33
  20. package/components/assistant/modern-chat-input/ModernChatInput.tsx +554 -554
  21. package/components/assistant/modern-chat-input/index.ts +1 -1
  22. package/components/assistant/modern-chat-input/modern-chat-input.stories.tsx +131 -131
  23. package/components/assistant/modern-chat-input/modern-chat-input.test.tsx +79 -79
  24. package/components/assistant/xertica-assistant/index.ts +3 -3
  25. package/components/assistant/xertica-assistant/parts/AssistantTypingIndicator.tsx +41 -41
  26. package/components/assistant/xertica-assistant/parts/index.ts +16 -16
  27. package/components/assistant/xertica-assistant/types.ts +134 -134
  28. package/components/assistant/xertica-assistant/xertica-assistant.stories.tsx +407 -407
  29. package/components/assistant/xertica-assistant/xertica-assistant.test.tsx +65 -65
  30. package/components/blocks/card-patterns/ActivityCardSkeleton.tsx +56 -56
  31. package/components/blocks/card-patterns/FeatureCard.tsx +109 -109
  32. package/components/blocks/card-patterns/FeatureCardSkeleton.tsx +63 -63
  33. package/components/blocks/card-patterns/NotificationCardSkeleton.tsx +81 -81
  34. package/components/blocks/card-patterns/ProfileCardSkeleton.tsx +69 -69
  35. package/components/blocks/card-patterns/ProjectCardSkeleton.tsx +72 -72
  36. package/components/blocks/card-patterns/QuickActionCard.tsx +68 -68
  37. package/components/blocks/card-patterns/QuickActionCardSkeleton.tsx +44 -44
  38. package/components/blocks/card-patterns/card-patterns.mdx +123 -123
  39. package/components/blocks/index.ts +1 -1
  40. package/components/brand/branding/branding.stories.tsx +57 -57
  41. package/components/brand/index.ts +6 -6
  42. package/components/brand/language-selector/LanguageSelector.tsx +102 -102
  43. package/components/brand/language-selector/index.ts +1 -1
  44. package/components/brand/language-selector/language-selector.mdx +126 -126
  45. package/components/brand/language-selector/language-selector.stories.tsx +114 -114
  46. package/components/brand/language-selector/language-selector.test.tsx +101 -101
  47. package/components/brand/theme-toggle/index.ts +1 -1
  48. package/components/brand/theme-toggle/theme-toggle.stories.tsx +34 -34
  49. package/components/brand/theme-toggle/theme-toggle.test.tsx +34 -34
  50. package/components/brand/xertica-logo/XerticaLogo.stories.tsx +82 -82
  51. package/components/brand/xertica-logo/XerticaLogo.tsx +104 -104
  52. package/components/brand/xertica-logo/index.ts +1 -1
  53. package/components/brand/xertica-logo/xertica-logo.test.tsx +26 -26
  54. package/components/brand/xertica-orbe/XerticaOrbe.tsx +1927 -1927
  55. package/components/brand/xertica-orbe/index.ts +1 -1
  56. package/components/brand/xertica-orbe/xertica-orbe.stories.tsx +40 -40
  57. package/components/brand/xertica-orbe/xertica-orbe.test.tsx +19 -19
  58. package/components/brand/xertica-provider/XerticaProvider.tsx +112 -112
  59. package/components/brand/xertica-provider/index.ts +1 -1
  60. package/components/brand/xertica-provider/xertica-provider.mdx +61 -61
  61. package/components/brand/xertica-provider/xertica-provider.test.tsx +74 -74
  62. package/components/brand/xertica-xlogo/XerticaXLogo.stories.tsx +79 -79
  63. package/components/brand/xertica-xlogo/XerticaXLogo.tsx +65 -65
  64. package/components/brand/xertica-xlogo/index.ts +1 -1
  65. package/components/brand/xertica-xlogo/xertica-xlogo.test.tsx +16 -16
  66. package/components/examples/ApiKeyMapExample.tsx +71 -71
  67. package/components/examples/DrawingMapExample.tsx +565 -565
  68. package/components/examples/FilterableMapExample.tsx +393 -393
  69. package/components/examples/LocationPickerExample.tsx +348 -348
  70. package/components/examples/MapExamples.tsx +268 -268
  71. package/components/examples/MapGmpExample.tsx +169 -169
  72. package/components/examples/MapShowcase.tsx +471 -471
  73. package/components/examples/RouteMapExamples.tsx +329 -329
  74. package/components/examples/SidebarLogoExample.tsx +65 -65
  75. package/components/examples/SimpleFilterableMap.tsx +219 -219
  76. package/components/examples/index.ts +45 -45
  77. package/components/figma/ImageWithFallback.tsx +27 -27
  78. package/components/hooks/index.ts +13 -13
  79. package/components/hooks/use-layout-shortcuts.ts +43 -43
  80. package/components/layout/header/header.stories.tsx +204 -204
  81. package/components/layout/header/header.test.tsx +75 -75
  82. package/components/layout/header/header.tsx +349 -349
  83. package/components/layout/header/index.ts +1 -1
  84. package/components/layout/index.ts +2 -2
  85. package/components/layout/sidebar/index.ts +3 -3
  86. package/components/layout/sidebar/sidebar.mdx +1 -1
  87. package/components/layout/sidebar/sidebar.stories.tsx +586 -586
  88. package/components/layout/sidebar/sidebar.test.tsx +76 -76
  89. package/components/layout/sidebar/use-sidebar.ts +104 -104
  90. package/components/media/audio-player/AudioPlayer.stories.tsx +124 -124
  91. package/components/media/audio-player/AudioPlayer.test.tsx +106 -106
  92. package/components/media/audio-player/AudioPlayer.tsx +1 -1
  93. package/components/media/audio-player/index.ts +1 -1
  94. package/components/media/audio-player/use-audio-player.ts +312 -312
  95. package/components/media/index.ts +3 -3
  96. package/components/media/video-player/VideoPlayer.stories.tsx +98 -98
  97. package/components/media/video-player/VideoPlayer.test.tsx +73 -73
  98. package/components/media/video-player/index.ts +1 -1
  99. package/components/pages/forgot-password-page/ForgotPasswordPage.stories.tsx +24 -24
  100. package/components/pages/forgot-password-page/ForgotPasswordPage.tsx +188 -188
  101. package/components/pages/forgot-password-page/forgot-password-page.test.tsx +45 -45
  102. package/components/pages/forgot-password-page/index.ts +1 -1
  103. package/components/pages/home-content/HomeContent.stories.tsx +43 -43
  104. package/components/pages/home-content/HomeContent.tsx +1 -1
  105. package/components/pages/home-content/home-content.mdx +62 -62
  106. package/components/pages/home-content/index.ts +1 -1
  107. package/components/pages/home-page/HomePage.stories.tsx +39 -39
  108. package/components/pages/home-page/home-page.mdx +53 -53
  109. package/components/pages/home-page/home-page.test.tsx +53 -53
  110. package/components/pages/home-page/index.ts +1 -1
  111. package/components/pages/index.ts +8 -8
  112. package/components/pages/login-page/LoginPage.stories.tsx +39 -39
  113. package/components/pages/login-page/index.ts +1 -1
  114. package/components/pages/login-page/login-page.test.tsx +63 -63
  115. package/components/pages/reset-password-page/ResetPasswordPage.stories.tsx +24 -24
  116. package/components/pages/reset-password-page/index.ts +1 -1
  117. package/components/pages/template-content/TemplateContent.stories.tsx +43 -43
  118. package/components/pages/template-content/TemplateContent.tsx +1 -1
  119. package/components/pages/template-content/index.ts +1 -1
  120. package/components/pages/template-content/template-content.mdx +61 -61
  121. package/components/pages/template-page/TemplatePage.stories.tsx +39 -39
  122. package/components/pages/template-page/TemplatePage.tsx +62 -62
  123. package/components/pages/template-page/index.ts +1 -1
  124. package/components/pages/template-page/template-page.mdx +53 -53
  125. package/components/pages/template-page/template-page.test.tsx +52 -52
  126. package/components/pages/verify-email-page/VerifyEmailPage.stories.tsx +41 -41
  127. package/components/pages/verify-email-page/index.ts +1 -1
  128. package/components/public-api-smoke.test.tsx +52 -52
  129. package/components/shared/CustomTooltipContent.tsx +48 -48
  130. package/components/shared/assistant-utils.test.ts +16 -16
  131. package/components/shared/assistant-utils.ts +225 -225
  132. package/components/shared/error-boundary.stories.tsx +132 -132
  133. package/components/shared/error-boundary.tsx +154 -154
  134. package/components/shared/error-fallbacks.tsx +226 -226
  135. package/components/shared/layout-constants.ts +8 -8
  136. package/components/shared/navigation.ts +35 -35
  137. package/components/shared/use-mobile.test.ts +16 -16
  138. package/components/shared/use-mobile.ts +36 -36
  139. package/components/shared/utils.test.ts +14 -14
  140. package/components/shared/utils.ts +6 -6
  141. package/components/ui/accordion/accordion.mdx +8 -8
  142. package/components/ui/accordion/accordion.stories.tsx +105 -105
  143. package/components/ui/accordion/accordion.test.tsx +59 -59
  144. package/components/ui/accordion/accordion.tsx +77 -77
  145. package/components/ui/accordion/index.ts +1 -1
  146. package/components/ui/alert/alert.mdx +8 -8
  147. package/components/ui/alert/alert.stories.tsx +86 -86
  148. package/components/ui/alert/alert.test.tsx +53 -53
  149. package/components/ui/alert/alert.tsx +93 -93
  150. package/components/ui/alert/index.ts +1 -1
  151. package/components/ui/alert-dialog/alert-dialog.mdx +8 -8
  152. package/components/ui/alert-dialog/alert-dialog.stories.tsx +84 -84
  153. package/components/ui/alert-dialog/alert-dialog.test.tsx +70 -70
  154. package/components/ui/alert-dialog/alert-dialog.tsx +149 -149
  155. package/components/ui/alert-dialog/index.ts +1 -1
  156. package/components/ui/aspect-ratio/aspect-ratio.mdx +8 -8
  157. package/components/ui/aspect-ratio/aspect-ratio.stories.tsx +46 -46
  158. package/components/ui/aspect-ratio/aspect-ratio.test.tsx +28 -28
  159. package/components/ui/aspect-ratio/aspect-ratio.tsx +20 -20
  160. package/components/ui/aspect-ratio/index.ts +1 -1
  161. package/components/ui/assistant-chart/AssistantChart.tsx +64 -64
  162. package/components/ui/assistant-chart/assistant-chart.mdx +8 -8
  163. package/components/ui/assistant-chart/assistant-chart.stories.tsx +44 -44
  164. package/components/ui/assistant-chart/assistant-chart.test.tsx +46 -46
  165. package/components/ui/assistant-chart/index.ts +1 -1
  166. package/components/ui/avatar/avatar.mdx +8 -8
  167. package/components/ui/avatar/avatar.stories.tsx +86 -86
  168. package/components/ui/avatar/avatar.test.tsx +55 -55
  169. package/components/ui/avatar/avatar.tsx +71 -71
  170. package/components/ui/avatar/index.ts +1 -1
  171. package/components/ui/badge/badge.mdx +8 -8
  172. package/components/ui/badge/badge.stories.tsx +72 -72
  173. package/components/ui/badge/badge.test.tsx +40 -40
  174. package/components/ui/badge/badge.tsx +58 -58
  175. package/components/ui/badge/index.ts +1 -1
  176. package/components/ui/breadcrumb/breadcrumb.mdx +8 -8
  177. package/components/ui/breadcrumb/breadcrumb.stories.tsx +123 -123
  178. package/components/ui/breadcrumb/breadcrumb.test.tsx +70 -70
  179. package/components/ui/breadcrumb/breadcrumb.tsx +114 -114
  180. package/components/ui/breadcrumb/index.ts +1 -1
  181. package/components/ui/button/button.mdx +8 -8
  182. package/components/ui/button/button.stories.tsx +183 -183
  183. package/components/ui/button/button.test.tsx +64 -64
  184. package/components/ui/button/button.tsx +98 -98
  185. package/components/ui/button/index.ts +1 -1
  186. package/components/ui/calendar/calendar.mdx +8 -8
  187. package/components/ui/calendar/calendar.stories.tsx +108 -108
  188. package/components/ui/calendar/calendar.test.tsx +53 -53
  189. package/components/ui/calendar/calendar.tsx +230 -230
  190. package/components/ui/calendar/index.ts +1 -1
  191. package/components/ui/card/card.mdx +8 -8
  192. package/components/ui/card/card.stories.tsx +301 -301
  193. package/components/ui/card/card.test.tsx +55 -55
  194. package/components/ui/card/card.tsx +83 -83
  195. package/components/ui/card/index.ts +1 -1
  196. package/components/ui/carousel/carousel.mdx +8 -8
  197. package/components/ui/carousel/carousel.stories.tsx +80 -80
  198. package/components/ui/carousel/carousel.test.tsx +75 -75
  199. package/components/ui/carousel/carousel.tsx +242 -242
  200. package/components/ui/carousel/index.ts +1 -1
  201. package/components/ui/chart/chart.mdx +8 -8
  202. package/components/ui/chart/chart.stories.tsx +1328 -1328
  203. package/components/ui/chart/chart.test.tsx +178 -178
  204. package/components/ui/chart/chart.tsx +2232 -2232
  205. package/components/ui/chart/index.ts +1 -1
  206. package/components/ui/checkbox/checkbox.mdx +8 -8
  207. package/components/ui/checkbox/checkbox.stories.tsx +109 -109
  208. package/components/ui/checkbox/checkbox.test.tsx +49 -49
  209. package/components/ui/checkbox/checkbox.tsx +68 -68
  210. package/components/ui/checkbox/index.ts +1 -1
  211. package/components/ui/collapsible/collapsible.mdx +8 -8
  212. package/components/ui/collapsible/collapsible.stories.tsx +45 -45
  213. package/components/ui/collapsible/collapsible.test.tsx +51 -51
  214. package/components/ui/collapsible/collapsible.tsx +32 -32
  215. package/components/ui/collapsible/index.ts +1 -1
  216. package/components/ui/command/command.mdx +8 -8
  217. package/components/ui/command/command.stories.tsx +134 -134
  218. package/components/ui/command/command.test.tsx +48 -48
  219. package/components/ui/command/command.tsx +163 -163
  220. package/components/ui/command/index.ts +1 -1
  221. package/components/ui/context-menu/context-menu.mdx +8 -8
  222. package/components/ui/context-menu/context-menu.stories.tsx +76 -76
  223. package/components/ui/context-menu/context-menu.test.tsx +61 -61
  224. package/components/ui/context-menu/context-menu.tsx +236 -236
  225. package/components/ui/context-menu/index.ts +1 -1
  226. package/components/ui/dialog/dialog.mdx +8 -8
  227. package/components/ui/dialog/dialog.stories.tsx +174 -174
  228. package/components/ui/dialog/dialog.test.tsx +78 -78
  229. package/components/ui/dialog/dialog.tsx +189 -189
  230. package/components/ui/dialog/index.ts +1 -1
  231. package/components/ui/drawer/drawer.mdx +8 -8
  232. package/components/ui/drawer/drawer.stories.tsx +71 -71
  233. package/components/ui/drawer/drawer.test.tsx +67 -67
  234. package/components/ui/drawer/drawer.tsx +146 -146
  235. package/components/ui/drawer/index.ts +1 -1
  236. package/components/ui/dropdown-menu/dropdown-menu.mdx +8 -8
  237. package/components/ui/dropdown-menu/dropdown-menu.stories.tsx +156 -156
  238. package/components/ui/dropdown-menu/dropdown-menu.test.tsx +62 -62
  239. package/components/ui/dropdown-menu/dropdown-menu.tsx +240 -240
  240. package/components/ui/dropdown-menu/index.ts +1 -1
  241. package/components/ui/empty/empty.mdx +8 -8
  242. package/components/ui/empty/empty.stories.tsx +85 -85
  243. package/components/ui/empty/empty.test.tsx +31 -31
  244. package/components/ui/empty/empty.tsx +88 -88
  245. package/components/ui/empty/index.ts +1 -1
  246. package/components/ui/file-upload/file-upload.mdx +8 -8
  247. package/components/ui/file-upload/file-upload.stories.tsx +144 -144
  248. package/components/ui/file-upload/file-upload.test.tsx +65 -65
  249. package/components/ui/file-upload/file-upload.tsx +142 -142
  250. package/components/ui/file-upload/index.ts +2 -2
  251. package/components/ui/file-upload/use-file-upload.ts +177 -177
  252. package/components/ui/form/form.stories.tsx +85 -85
  253. package/components/ui/form/form.test.tsx +75 -75
  254. package/components/ui/form/form.tsx +163 -163
  255. package/components/ui/form/index.ts +1 -1
  256. package/components/ui/google-maps-loader/google-maps-loader.test.tsx +35 -35
  257. package/components/ui/google-maps-loader/google-maps-loader.tsx +465 -465
  258. package/components/ui/google-maps-loader/index.ts +1 -1
  259. package/components/ui/hover-card/hover-card.mdx +8 -8
  260. package/components/ui/hover-card/hover-card.stories.tsx +61 -61
  261. package/components/ui/hover-card/hover-card.test.tsx +48 -48
  262. package/components/ui/hover-card/hover-card.tsx +50 -50
  263. package/components/ui/hover-card/index.ts +1 -1
  264. package/components/ui/index.ts +400 -400
  265. package/components/ui/input/index.ts +1 -1
  266. package/components/ui/input/input.mdx +8 -8
  267. package/components/ui/input/input.stories.tsx +153 -153
  268. package/components/ui/input/input.test.tsx +47 -47
  269. package/components/ui/input/input.tsx +57 -57
  270. package/components/ui/input-otp/index.ts +1 -1
  271. package/components/ui/input-otp/input-otp.mdx +8 -8
  272. package/components/ui/input-otp/input-otp.stories.tsx +120 -120
  273. package/components/ui/input-otp/input-otp.test.tsx +74 -74
  274. package/components/ui/input-otp/input-otp.tsx +101 -101
  275. package/components/ui/label/index.ts +1 -1
  276. package/components/ui/label/label.mdx +8 -8
  277. package/components/ui/label/label.stories.tsx +74 -74
  278. package/components/ui/label/label.test.tsx +45 -45
  279. package/components/ui/label/label.tsx +53 -53
  280. package/components/ui/map/index.ts +1 -1
  281. package/components/ui/map/map.mdx +8 -8
  282. package/components/ui/map/map.stories.tsx +86 -86
  283. package/components/ui/map/map.test.tsx +82 -82
  284. package/components/ui/map/map.tsx +506 -506
  285. package/components/ui/map/mock.test.tsx +13 -13
  286. package/components/ui/map-config/index.ts +1 -1
  287. package/components/ui/map-config/map-config.ts +18 -18
  288. package/components/ui/map-layers/index.ts +1 -1
  289. package/components/ui/map-layers/map-layers.test.tsx +48 -48
  290. package/components/ui/map-layers/map-layers.tsx +126 -126
  291. package/components/ui/map.exports/index.ts +1 -1
  292. package/components/ui/map.exports/map.exports.ts +31 -31
  293. package/components/ui/menubar/index.ts +1 -1
  294. package/components/ui/menubar/menubar.mdx +8 -8
  295. package/components/ui/menubar/menubar.stories.tsx +130 -130
  296. package/components/ui/menubar/menubar.test.tsx +53 -53
  297. package/components/ui/menubar/menubar.tsx +265 -265
  298. package/components/ui/navigation-menu/index.ts +1 -1
  299. package/components/ui/navigation-menu/navigation-menu.mdx +8 -8
  300. package/components/ui/navigation-menu/navigation-menu.stories.tsx +126 -126
  301. package/components/ui/navigation-menu/navigation-menu.test.tsx +47 -47
  302. package/components/ui/navigation-menu/navigation-menu.tsx +165 -165
  303. package/components/ui/notification-badge/index.ts +1 -1
  304. package/components/ui/notification-badge/notification-badge.mdx +8 -8
  305. package/components/ui/notification-badge/notification-badge.stories.tsx +66 -66
  306. package/components/ui/notification-badge/notification-badge.test.tsx +61 -61
  307. package/components/ui/notification-badge/notification-badge.tsx +91 -91
  308. package/components/ui/page-header/index.ts +1 -1
  309. package/components/ui/page-header/page-header.stories.tsx +69 -69
  310. package/components/ui/page-header/page-header.test.tsx +37 -37
  311. package/components/ui/page-header/page-header.tsx +124 -124
  312. package/components/ui/pagination/index.ts +3 -3
  313. package/components/ui/pagination/pagination.mdx +8 -8
  314. package/components/ui/pagination/pagination.stories.tsx +210 -210
  315. package/components/ui/pagination/pagination.test.tsx +63 -63
  316. package/components/ui/pagination/pagination.tsx +140 -140
  317. package/components/ui/pagination/use-pagination.ts +173 -173
  318. package/components/ui/popover/index.ts +1 -1
  319. package/components/ui/popover/popover.mdx +8 -8
  320. package/components/ui/popover/popover.stories.tsx +73 -73
  321. package/components/ui/popover/popover.test.tsx +48 -48
  322. package/components/ui/popover/popover.tsx +54 -54
  323. package/components/ui/progress/index.ts +1 -1
  324. package/components/ui/progress/progress.mdx +8 -8
  325. package/components/ui/progress/progress.stories.tsx +55 -55
  326. package/components/ui/progress/progress.test.tsx +23 -23
  327. package/components/ui/progress/progress.tsx +68 -68
  328. package/components/ui/radio-group/index.ts +1 -1
  329. package/components/ui/radio-group/radio-group.mdx +8 -8
  330. package/components/ui/radio-group/radio-group.stories.tsx +114 -114
  331. package/components/ui/radio-group/radio-group.test.tsx +78 -78
  332. package/components/ui/radio-group/radio-group.tsx +93 -93
  333. package/components/ui/rating/index.ts +1 -1
  334. package/components/ui/rating/rating.mdx +8 -8
  335. package/components/ui/rating/rating.stories.tsx +50 -50
  336. package/components/ui/rating/rating.test.tsx +48 -48
  337. package/components/ui/rating/rating.tsx +145 -145
  338. package/components/ui/resizable/index.ts +1 -1
  339. package/components/ui/resizable/resizable.mdx +8 -8
  340. package/components/ui/resizable/resizable.stories.tsx +88 -88
  341. package/components/ui/resizable/resizable.test.tsx +61 -61
  342. package/components/ui/resizable/resizable.tsx +452 -452
  343. package/components/ui/rich-text-editor/index.ts +7 -7
  344. package/components/ui/rich-text-editor/rich-text-editor.stories.tsx +290 -290
  345. package/components/ui/rich-text-editor/rich-text-editor.test.tsx +86 -86
  346. package/components/ui/rich-text-editor/rich-text-editor.tsx +634 -634
  347. package/components/ui/rich-text-editor/use-rich-text-editor.ts +453 -453
  348. package/components/ui/route-map/index.ts +1 -1
  349. package/components/ui/route-map/route-map.mdx +8 -8
  350. package/components/ui/route-map/route-map.stories.tsx +48 -48
  351. package/components/ui/route-map/route-map.test.tsx +108 -108
  352. package/components/ui/route-map/route-map.tsx +349 -349
  353. package/components/ui/scroll-area/index.ts +1 -1
  354. package/components/ui/scroll-area/scroll-area.mdx +8 -8
  355. package/components/ui/scroll-area/scroll-area.stories.tsx +31 -31
  356. package/components/ui/scroll-area/scroll-area.test.tsx +27 -27
  357. package/components/ui/scroll-area/scroll-area.tsx +70 -70
  358. package/components/ui/search/index.ts +1 -1
  359. package/components/ui/search/search.mdx +8 -8
  360. package/components/ui/search/search.stories.tsx +107 -107
  361. package/components/ui/search/search.test.tsx +67 -67
  362. package/components/ui/search/search.tsx +141 -141
  363. package/components/ui/select/index.ts +1 -1
  364. package/components/ui/select/select.mdx +8 -8
  365. package/components/ui/select/select.stories.tsx +163 -163
  366. package/components/ui/select/select.test.tsx +99 -99
  367. package/components/ui/select/select.tsx +195 -195
  368. package/components/ui/separator/index.ts +1 -1
  369. package/components/ui/separator/separator.mdx +8 -8
  370. package/components/ui/separator/separator.stories.tsx +55 -55
  371. package/components/ui/separator/separator.test.tsx +23 -23
  372. package/components/ui/separator/separator.tsx +39 -39
  373. package/components/ui/sheet/index.ts +1 -1
  374. package/components/ui/sheet/sheet.mdx +8 -8
  375. package/components/ui/sheet/sheet.stories.tsx +93 -93
  376. package/components/ui/sheet/sheet.test.tsx +62 -62
  377. package/components/ui/sheet/sheet.tsx +149 -149
  378. package/components/ui/simple-map/index.ts +1 -1
  379. package/components/ui/simple-map/simple-map.mdx +8 -8
  380. package/components/ui/simple-map/simple-map.stories.tsx +44 -44
  381. package/components/ui/simple-map/simple-map.test.tsx +36 -36
  382. package/components/ui/simple-map/simple-map.tsx +92 -92
  383. package/components/ui/skeleton/index.ts +1 -1
  384. package/components/ui/skeleton/skeleton.mdx +8 -8
  385. package/components/ui/skeleton/skeleton.stories.tsx +36 -36
  386. package/components/ui/skeleton/skeleton.test.tsx +19 -19
  387. package/components/ui/skeleton/skeleton.tsx +25 -25
  388. package/components/ui/slider/index.ts +1 -1
  389. package/components/ui/slider/slider.mdx +8 -8
  390. package/components/ui/slider/slider.stories.tsx +44 -44
  391. package/components/ui/slider/slider.test.tsx +25 -25
  392. package/components/ui/slider/slider.tsx +66 -66
  393. package/components/ui/sonner/index.ts +1 -1
  394. package/components/ui/sonner/sonner.mdx +8 -8
  395. package/components/ui/sonner/sonner.stories.tsx +41 -41
  396. package/components/ui/sonner/sonner.test.tsx +24 -24
  397. package/components/ui/sonner/sonner.tsx +74 -74
  398. package/components/ui/stats-card/stats-card-skeleton.tsx +62 -62
  399. package/components/ui/stats-card/stats-card.mdx +8 -8
  400. package/components/ui/stats-card/stats-card.test.tsx +34 -34
  401. package/components/ui/stats-card/stats-card.tsx +93 -93
  402. package/components/ui/stepper/index.ts +3 -3
  403. package/components/ui/stepper/stepper.mdx +8 -8
  404. package/components/ui/stepper/stepper.stories.tsx +171 -171
  405. package/components/ui/stepper/stepper.test.tsx +47 -47
  406. package/components/ui/stepper/stepper.tsx +190 -190
  407. package/components/ui/stepper/use-stepper.ts +139 -139
  408. package/components/ui/switch/index.ts +1 -1
  409. package/components/ui/switch/switch.mdx +8 -8
  410. package/components/ui/switch/switch.stories.tsx +93 -93
  411. package/components/ui/switch/switch.test.tsx +44 -44
  412. package/components/ui/switch/switch.tsx +70 -70
  413. package/components/ui/table/index.ts +1 -1
  414. package/components/ui/table/table.mdx +8 -8
  415. package/components/ui/table/table.stories.tsx +114 -114
  416. package/components/ui/table/table.test.tsx +43 -43
  417. package/components/ui/table/table.tsx +104 -104
  418. package/components/ui/tabs/index.ts +1 -1
  419. package/components/ui/tabs/tabs.mdx +8 -8
  420. package/components/ui/tabs/tabs.stories.tsx +140 -140
  421. package/components/ui/tabs/tabs.test.tsx +50 -50
  422. package/components/ui/tabs/tabs.tsx +66 -66
  423. package/components/ui/textarea/index.ts +1 -1
  424. package/components/ui/textarea/textarea.mdx +8 -8
  425. package/components/ui/textarea/textarea.stories.tsx +69 -69
  426. package/components/ui/textarea/textarea.test.tsx +41 -41
  427. package/components/ui/textarea/textarea.tsx +61 -61
  428. package/components/ui/timeline/index.ts +1 -1
  429. package/components/ui/timeline/timeline.mdx +8 -8
  430. package/components/ui/timeline/timeline.stories.tsx +97 -97
  431. package/components/ui/timeline/timeline.test.tsx +53 -53
  432. package/components/ui/timeline/timeline.tsx +124 -124
  433. package/components/ui/toggle/index.ts +1 -1
  434. package/components/ui/toggle/toggle.mdx +8 -8
  435. package/components/ui/toggle/toggle.stories.tsx +56 -56
  436. package/components/ui/toggle/toggle.test.tsx +32 -32
  437. package/components/ui/toggle/toggle.tsx +55 -55
  438. package/components/ui/toggle-group/index.ts +1 -1
  439. package/components/ui/toggle-group/toggle-group.mdx +8 -8
  440. package/components/ui/toggle-group/toggle-group.stories.tsx +66 -66
  441. package/components/ui/toggle-group/toggle-group.test.tsx +47 -47
  442. package/components/ui/toggle-group/toggle-group.tsx +79 -79
  443. package/components/ui/tooltip/index.ts +1 -1
  444. package/components/ui/tooltip/tooltip.mdx +8 -8
  445. package/components/ui/tooltip/tooltip.stories.tsx +83 -83
  446. package/components/ui/tooltip/tooltip.test.tsx +39 -39
  447. package/components/ui/tooltip/tooltip.tsx +69 -69
  448. package/components/ui/tree-view/index.ts +4 -4
  449. package/components/ui/tree-view/tree-view.mdx +8 -8
  450. package/components/ui/tree-view/tree-view.stories.tsx +154 -154
  451. package/components/ui/tree-view/tree-view.test.tsx +58 -58
  452. package/components/ui/tree-view/tree-view.tsx +171 -171
  453. package/components/ui/tree-view/use-tree-view.ts +237 -237
  454. package/contexts/ApiKeyContext.test.tsx +26 -26
  455. package/contexts/ApiKeyContext.tsx +196 -196
  456. package/contexts/AssistenteContext.test.tsx +17 -17
  457. package/contexts/AssistenteContext.tsx +113 -113
  458. package/contexts/AuthContext.tsx +118 -118
  459. package/contexts/BrandColorsContext.test.tsx +21 -21
  460. package/contexts/BrandColorsContext.tsx +251 -251
  461. package/contexts/LanguageContext.test.tsx +121 -121
  462. package/contexts/LanguageContext.tsx +251 -251
  463. package/contexts/LayoutContext.test.tsx +29 -29
  464. package/contexts/LayoutContext.tsx +140 -140
  465. package/contexts/ThemeContext.test.tsx +38 -38
  466. package/contexts/ThemeContext.tsx +111 -111
  467. package/contexts/index.ts +8 -8
  468. package/contexts/theme-data.ts +340 -340
  469. package/dist/{AssistantChart-BAx9VQvb.cjs → AssistantChart-Bdd44uBn.cjs} +388 -127
  470. package/dist/{AssistantChart-CVko2A1W.js → AssistantChart-CFhDdGyU.js} +391 -130
  471. package/dist/AssistantChart-COGiOV-g.cjs +3541 -0
  472. package/dist/AssistantChart-CWX1OWNM.js +3373 -0
  473. package/dist/{AssistantChart-CVzmmhx4.js → AssistantChart-C_hwFRRr.js} +4 -4
  474. package/dist/{AssistantChart-BAudAfne.cjs → AssistantChart-CldVCVDe.cjs} +5 -5
  475. package/dist/{AssistantChart-BP8upjMk.js → AssistantChart-Cu3m7RBo.js} +5 -5
  476. package/dist/AssistantChart-CxGjH7Qk.js +3477 -0
  477. package/dist/AssistantChart-DIpshm3i.js +4784 -0
  478. package/dist/AssistantChart-D_PTeu8P.cjs +3503 -0
  479. package/dist/{AssistantChart-9w31gdAb.cjs → AssistantChart-DoZCyS5r.cjs} +4 -4
  480. package/dist/AssistantChart-zjsy2GaZ.cjs +4810 -0
  481. package/dist/AudioPlayer-9psiEucT.cjs +1282 -0
  482. package/dist/AudioPlayer-B1lt5cPl.cjs +989 -0
  483. package/dist/AudioPlayer-BZ7bibzU.cjs +982 -0
  484. package/dist/AudioPlayer-BpRPS4-1.cjs +1277 -0
  485. package/dist/AudioPlayer-C12BjQBV.cjs +997 -0
  486. package/dist/{AudioPlayer-1ypwE2Wh.cjs → AudioPlayer-CFeV8t-5.cjs} +1 -1
  487. package/dist/{AudioPlayer-DuKXrCfy.js → AudioPlayer-CGRUtUdN.js} +1 -1
  488. package/dist/AudioPlayer-Coly3q5R.js +1278 -0
  489. package/dist/AudioPlayer-CySJIyvL.js +937 -0
  490. package/dist/AudioPlayer-DMcG_c7L.js +990 -0
  491. package/dist/AudioPlayer-DcFKRJE_.js +998 -0
  492. package/dist/AudioPlayer-Dp2bD1Gk.js +1278 -0
  493. package/dist/AudioPlayer-IAU5q5T1.cjs +936 -0
  494. package/dist/AudioPlayer-e8LfNoqO.js +983 -0
  495. package/dist/BrandColorsContext-565dDHd5.js +660 -0
  496. package/dist/BrandColorsContext-BcJbtkqn.cjs +659 -0
  497. package/dist/BrandColorsContext-DZT7JjeD.js +659 -0
  498. package/dist/BrandColorsContext-awnBCmC4.cjs +666 -0
  499. package/dist/{xertica-assistant-Qp3ydksa.cjs → CodeBlock-7TTgmdGG.cjs} +263 -51
  500. package/dist/{xertica-assistant-gnCJdcZY.js → CodeBlock-BeSt1h5P.js} +219 -7
  501. package/dist/CodeBlock-BgfYL_rD.cjs +2094 -0
  502. package/dist/CodeBlock-BlcqlA9M.cjs +2094 -0
  503. package/dist/CodeBlock-Bnmeu5ez.cjs +2094 -0
  504. package/dist/CodeBlock-BtfPlbAI.js +2078 -0
  505. package/dist/CodeBlock-CIySIuYr.js +2078 -0
  506. package/dist/CodeBlock-CuPtUM-7.cjs +2094 -0
  507. package/dist/CodeBlock-D6ffWXgc.js +2078 -0
  508. package/dist/CodeBlock-D8dcwbit.cjs +2094 -0
  509. package/dist/CodeBlock-DMZrFnlw.cjs +2094 -0
  510. package/dist/CodeBlock-DYkTfR0f.js +221 -0
  511. package/dist/CodeBlock-DlBehYN8.js +2078 -0
  512. package/dist/CodeBlock-DnYNI8rQ.js +2078 -0
  513. package/dist/CodeBlock-DvKWbSnE.cjs +2094 -0
  514. package/dist/CodeBlock-DwMCfkFY.js +2078 -0
  515. package/dist/CodeBlock-Dy6CNYyj.js +2078 -0
  516. package/dist/CodeBlock-EOvp9cVu.cjs +223 -0
  517. package/dist/CodeBlock-U1pPOQI7.cjs +2094 -0
  518. package/dist/CodeBlock-f_GpNhEB.js +2078 -0
  519. package/dist/CodeBlock-oB6u8nI1.js +2078 -0
  520. package/dist/CodeBlock-tZC31B73.cjs +2094 -0
  521. package/dist/CustomTooltipContent-BhdIeBEg.cjs +54 -0
  522. package/dist/CustomTooltipContent-CNbVB2NS.js +33 -0
  523. package/dist/FeatureCard-BZ4CYxFf.cjs +497 -0
  524. package/dist/FeatureCard-CxC-7C-C.cjs +300 -0
  525. package/dist/FeatureCard-DNycVGwT.js +485 -0
  526. package/dist/FeatureCard-DbHWCb4E.js +301 -0
  527. package/dist/FeatureCardSkeleton-DZqc96mt.js +27 -0
  528. package/dist/FeatureCardSkeleton-pTa0YNKP.cjs +29 -0
  529. package/dist/ImageWithFallback-CGtidP6B.cjs +4542 -0
  530. package/dist/ImageWithFallback-lsg3pdFg.js +4508 -0
  531. package/dist/{LanguageContext-DvUt5jBg.cjs → LanguageContext-B_KFTCzT.cjs} +2 -2
  532. package/dist/{LanguageContext-BwhwC3G2.js → LanguageContext-CS14yCpi.js} +2 -2
  533. package/dist/LanguageSelector-B5YfbHra.js +231 -0
  534. package/dist/LanguageSelector-D6uacAIM.cjs +230 -0
  535. package/dist/LayoutContext-B45-e9DI.cjs +93 -0
  536. package/dist/LayoutContext-BAql6ZRY.js +97 -0
  537. package/dist/LayoutContext-BEq_-n98.cjs +96 -0
  538. package/dist/LayoutContext-Bav3UMEA.js +94 -0
  539. package/dist/LayoutContext-BvK-ggDa.cjs +96 -0
  540. package/dist/LayoutContext-DNl1xSoX.js +92 -0
  541. package/dist/{ThemeContext-ept8jhXI.js → ThemeContext-BWq9ACPo.js} +8 -13
  542. package/dist/ThemeContext-BXjrgUjW.js +1917 -0
  543. package/dist/{ThemeContext-Bo-W2WZH.js → ThemeContext-BgclCB35.js} +3 -3
  544. package/dist/{ThemeContext-CP3a0jxy.cjs → ThemeContext-Bmod0Cg2.cjs} +8 -13
  545. package/dist/ThemeContext-BoH4NLfN.js +734 -0
  546. package/dist/{ThemeContext-BbBNoFTG.js → ThemeContext-C2EwAPDt.js} +2 -2
  547. package/dist/{ThemeContext-U4dEYc6C.cjs → ThemeContext-CGk3KK0k.cjs} +1 -8
  548. package/dist/ThemeContext-CMD3z2Dz.cjs +1930 -0
  549. package/dist/{ThemeContext-D3LzacmG.js → ThemeContext-CQSo4Iwc.js} +1 -8
  550. package/dist/{ThemeContext-BblcjQup.cjs → ThemeContext-DQUOeziy.cjs} +3 -3
  551. package/dist/ThemeContext-j5aGtPky.cjs +1924 -0
  552. package/dist/ThemeContext-r69W20Xg.cjs +733 -0
  553. package/dist/{ThemeContext-Cmr8Ex8H.cjs → ThemeContext-vTjumZeM.cjs} +2 -2
  554. package/dist/ThemeContext-x_F2zsnv.js +1923 -0
  555. package/dist/{VerifyEmailPage-BRSP-Pwt.cjs → VerifyEmailPage--1Vurewl.cjs} +3 -3
  556. package/dist/{VerifyEmailPage-BE-L9mB7.js → VerifyEmailPage-1WwWczAn.js} +12 -22
  557. package/dist/{VerifyEmailPage-DF2ilhum.cjs → VerifyEmailPage-B4peJjAT.cjs} +356 -334
  558. package/dist/{VerifyEmailPage-CR7kb5df.cjs → VerifyEmailPage-BComraR7.cjs} +12 -22
  559. package/dist/{VerifyEmailPage-BiRm7Nh4.cjs → VerifyEmailPage-By3Jf__L.cjs} +348 -329
  560. package/dist/VerifyEmailPage-ByerOcm4.cjs +3232 -0
  561. package/dist/{VerifyEmailPage-CbgjOF0v.js → VerifyEmailPage-C0c2e5n0.js} +7 -7
  562. package/dist/{VerifyEmailPage-EhudUdqF.js → VerifyEmailPage-C5TNQTBa.js} +355 -343
  563. package/dist/{VerifyEmailPage-Dt7zgA4w.cjs → VerifyEmailPage-CFLMls1p.cjs} +4 -4
  564. package/dist/{VerifyEmailPage-vYHbYK3q.js → VerifyEmailPage-CJLz3jrn.js} +347 -338
  565. package/dist/VerifyEmailPage-COiyNl1y.js +2825 -0
  566. package/dist/{VerifyEmailPage-DMBh4NM9.cjs → VerifyEmailPage-CYXtbKi3.cjs} +1 -1
  567. package/dist/{VerifyEmailPage-DTtFfC-J.js → VerifyEmailPage-CgMxRb4z.js} +3 -3
  568. package/dist/VerifyEmailPage-CqKsR2v8.js +2827 -0
  569. package/dist/{VerifyEmailPage-Bae2cBXT.cjs → VerifyEmailPage-Cwi3kbol.cjs} +7 -7
  570. package/dist/{VerifyEmailPage-BIBOKV7Z.js → VerifyEmailPage-DSBMRHtl.js} +36 -41
  571. package/dist/{VerifyEmailPage-hdB8JQGv.cjs → VerifyEmailPage-De6bQjrz.cjs} +36 -41
  572. package/dist/VerifyEmailPage-DgIid028.js +3223 -0
  573. package/dist/VerifyEmailPage-DjQKRlUS.cjs +2824 -0
  574. package/dist/{VerifyEmailPage-CdYPSJoO.js → VerifyEmailPage-DvMLZgFt.js} +1 -1
  575. package/dist/{VerifyEmailPage-C_ihbcth.js → VerifyEmailPage-MTD7AG1Z.js} +4 -4
  576. package/dist/{VerifyEmailPage-Bvfv8HVQ.js → VerifyEmailPage-RrUApqBN.js} +3 -3
  577. package/dist/{VerifyEmailPage-D-FRj5TU.cjs → VerifyEmailPage-VoMI7MYH.cjs} +3 -3
  578. package/dist/VerifyEmailPage-s-1X3LDJ.cjs +2826 -0
  579. package/dist/XerticaOrbe-KL1RBHzw.cjs +1354 -0
  580. package/dist/XerticaOrbe-Uk2JML1-.cjs +1927 -0
  581. package/dist/XerticaOrbe-jA5T2iOk.js +1925 -0
  582. package/dist/XerticaOrbe-zwS1p2a8.js +1355 -0
  583. package/dist/XerticaProvider-6btlAlzc.js +17 -0
  584. package/dist/{XerticaProvider-siSt9uG2.js → XerticaProvider-B7EVH-NF.js} +2 -2
  585. package/dist/{XerticaProvider-CjQAQPcn.cjs → XerticaProvider-BIrqfZ-i.cjs} +11 -8
  586. package/dist/XerticaProvider-BNoNOxQ5.cjs +16 -0
  587. package/dist/{XerticaProvider-CWgby5mY.js → XerticaProvider-BSyFrmC0.js} +1 -1
  588. package/dist/XerticaProvider-BlY2limY.cjs +38 -0
  589. package/dist/{XerticaProvider-CWs6EwNa.js → XerticaProvider-C1DKnvLh.js} +4 -4
  590. package/dist/{XerticaProvider-AbWlr7Af.cjs → XerticaProvider-CBGc4EMA.cjs} +4 -4
  591. package/dist/{XerticaProvider-BITjgC5p.js → XerticaProvider-CEoWMTxu.js} +2 -2
  592. package/dist/{XerticaProvider-AChwphCO.cjs → XerticaProvider-CiNKjMx1.cjs} +1 -1
  593. package/dist/{XerticaProvider-By8q3Roe.cjs → XerticaProvider-CllrbMEJ.cjs} +2 -2
  594. package/dist/{XerticaProvider-B8CaV7xu.cjs → XerticaProvider-D-yNhF94.cjs} +1 -1
  595. package/dist/XerticaProvider-DDuiIcKo.js +39 -0
  596. package/dist/{XerticaProvider-D5lLumH-.js → XerticaProvider-DUOJg9iX.js} +10 -10
  597. package/dist/{XerticaProvider-DQtvJU7m.js → XerticaProvider-DYq4JWtg.js} +1 -1
  598. package/dist/{XerticaProvider-qQUDop71.cjs → XerticaProvider-Dl_b72_l.cjs} +11 -8
  599. package/dist/{XerticaProvider-CUYJZc32.js → XerticaProvider-Dt5HEzbQ.js} +10 -10
  600. package/dist/{XerticaProvider-CW9hpCdF.cjs → XerticaProvider-ET0ihewn.cjs} +2 -2
  601. package/dist/XerticaProvider-cI9hSs27.cjs +38 -0
  602. package/dist/XerticaProvider-hSwhNQex.js +39 -0
  603. package/dist/{XerticaXLogo-8TTzBjHw.cjs → XerticaXLogo-B2svDGZh.cjs} +1 -1
  604. package/dist/{XerticaXLogo-ChryA6xj.js → XerticaXLogo-B7xQ5dhi.js} +1 -1
  605. package/dist/{XerticaXLogo-CziKMQil.cjs → XerticaXLogo-CQUUjXoH.cjs} +8 -8
  606. package/dist/{XerticaXLogo-DfUvz-lD.js → XerticaXLogo-Cmsp-Eey.js} +9 -9
  607. package/dist/{XerticaXLogo-CFuIlYFH.js → XerticaXLogo-CowGv7BC.js} +1 -1
  608. package/dist/{XerticaXLogo-DHz5SugF.js → XerticaXLogo-DZbo4vOE.js} +12 -12
  609. package/dist/{XerticaXLogo-kslQ8Tk_.cjs → XerticaXLogo-Zw2B276b.cjs} +1 -1
  610. package/dist/{XerticaXLogo-CU-U-GP4.cjs → XerticaXLogo-bvZSgwGF.cjs} +13 -7
  611. package/dist/{XerticaXLogo-BWaag64t.js → XerticaXLogo-mqjoBiLI.js} +12 -12
  612. package/dist/{XerticaXLogo-DTee_y8X.cjs → XerticaXLogo-uQgwns_E.cjs} +13 -7
  613. package/dist/alert-dialog-BOje--vD.js +847 -0
  614. package/dist/alert-dialog-BtEuQqrg.cjs +870 -0
  615. package/dist/{alert-dialog-yckpaOpy.cjs → alert-dialog-DSKByiKZ.cjs} +3 -3
  616. package/dist/alert-dialog-DhwPioBa.cjs +885 -0
  617. package/dist/alert-dialog-DqlRW_An.js +831 -0
  618. package/dist/{alert-dialog-iDe5VE5o.js → alert-dialog-s-vmNkJ_.js} +3 -3
  619. package/dist/assistant.cjs.js +8 -4
  620. package/dist/assistant.es.js +5 -11
  621. package/dist/avatar-3kO2Anrp.js +54 -0
  622. package/dist/avatar-BCM7YQRC.cjs +77 -0
  623. package/dist/blocks.cjs.js +9 -4
  624. package/dist/blocks.es.js +2 -16
  625. package/dist/brand.cjs.js +10 -5
  626. package/dist/brand.es.js +3 -11
  627. package/dist/breadcrumb-BKtHF4gk.cjs +98 -0
  628. package/dist/breadcrumb-CqJ7bHY5.js +161 -0
  629. package/dist/breadcrumb-ifNsA7Zl.js +90 -0
  630. package/dist/breadcrumb-m9Hb2_XN.cjs +177 -0
  631. package/dist/button-0BlA47It.cjs +85 -0
  632. package/dist/button-DZHzN1Gd.js +62 -0
  633. package/dist/cli.js +391 -66
  634. package/dist/components/assistant/xertica-assistant/hooks/index.d.ts +6 -0
  635. package/dist/components/assistant/xertica-assistant/hooks/use-assistant-conversations.d.ts +21 -0
  636. package/dist/components/assistant/xertica-assistant/hooks/use-assistant-messages.d.ts +49 -0
  637. package/dist/components/assistant/xertica-assistant/hooks/use-assistant-suggestions.d.ts +16 -0
  638. package/dist/components/blocks/audio-player/AudioPlayer.d.ts +35 -0
  639. package/dist/components/blocks/audio-player/index.d.ts +1 -0
  640. package/dist/components/blocks/document-editor/DocumentEditor.d.ts +26 -0
  641. package/dist/components/blocks/document-editor/index.d.ts +1 -0
  642. package/dist/components/blocks/podcast-player/PodcastPlayer.d.ts +41 -0
  643. package/dist/components/blocks/podcast-player/index.d.ts +1 -0
  644. package/dist/components/ui/chart/parts/chart-dashboard.d.ts +113 -0
  645. package/dist/components/ui/chart/parts/chart-metric.d.ts +118 -0
  646. package/dist/components/ui/chart/parts/chart-primitives.d.ts +101 -0
  647. package/dist/components/ui/chart/parts/chart-shared.d.ts +20 -0
  648. package/dist/components/ui/chart/parts/chart-utils.d.ts +12 -0
  649. package/dist/components/ui/chart/parts/index.d.ts +5 -0
  650. package/dist/dropdown-menu-BDB5CmQs.cjs +247 -0
  651. package/dist/dropdown-menu-BMcykFDf.cjs +225 -0
  652. package/dist/dropdown-menu-DQidbKBD.js +231 -0
  653. package/dist/dropdown-menu-Dn_eV2Xb.js +190 -0
  654. package/dist/google-maps-loader-BCe58h9D.js +308 -0
  655. package/dist/google-maps-loader-BFWp6VPd.js +287 -0
  656. package/dist/google-maps-loader-BKcdgFbu.cjs +312 -0
  657. package/dist/{google-maps-loader-t2IlYBzw.js → google-maps-loader-CTYySAun.js} +4 -0
  658. package/dist/google-maps-loader-CumCNXeG.js +312 -0
  659. package/dist/{google-maps-loader-BqsYL48U.cjs → google-maps-loader-Y-QkD-Li.cjs} +5 -0
  660. package/dist/google-maps-loader-casMyxlo.cjs +316 -0
  661. package/dist/google-maps-loader-eS3uQ5TA.cjs +287 -0
  662. package/dist/header-Cgy6vYPk.cjs +731 -0
  663. package/dist/header-DRlT4jgI.js +715 -0
  664. package/dist/header-Dux00SI4.cjs +731 -0
  665. package/dist/header-EkGKXPsD.js +715 -0
  666. package/dist/header-WfEywpyc.cjs +731 -0
  667. package/dist/header-tifNQn2U.js +715 -0
  668. package/dist/hooks.cjs.js +12 -8
  669. package/dist/hooks.es.js +10 -27
  670. package/dist/index-9GWd0qxq.cjs +12 -0
  671. package/dist/index-BabBx2pa.js +6 -0
  672. package/dist/index-BhapVLVj.js +8 -0
  673. package/dist/{index-D3RLKRAs.cjs → index-COtD8bRW.cjs} +1 -1
  674. package/dist/index-D6fxYEY8.cjs +7 -0
  675. package/dist/index-DAIp0_HK.js +8 -0
  676. package/dist/index-DW5tYe26.js +8 -0
  677. package/dist/index-GA__GvnG.cjs +7 -0
  678. package/dist/index.cjs.js +37 -32
  679. package/dist/index.es.js +30 -363
  680. package/dist/index.umd.js +1043 -470
  681. package/dist/input-2R4loU86.js +127 -0
  682. package/dist/input-C_UiS2Py.cjs +152 -0
  683. package/dist/input-DWANSKGb.cjs +145 -0
  684. package/dist/input-cc-PTD4R.js +123 -0
  685. package/dist/layout.cjs.js +10 -6
  686. package/dist/layout.es.js +7 -9
  687. package/dist/media.cjs.js +8 -3
  688. package/dist/media.es.js +1 -6
  689. package/dist/pages.cjs.js +8 -3
  690. package/dist/pages.es.js +1 -11
  691. package/dist/progress-C7Lti5wo.js +80 -0
  692. package/dist/progress-Cqwxbqs1.cjs +103 -0
  693. package/dist/progress-DPtzoVV8.js +175 -0
  694. package/dist/progress-EeaoqqUs.cjs +191 -0
  695. package/dist/rich-text-editor-0mraWT5y.cjs +2376 -0
  696. package/dist/rich-text-editor-B-IkcPD0.js +2874 -0
  697. package/dist/rich-text-editor-B6jMRLzk.cjs +1939 -0
  698. package/dist/rich-text-editor-B8_oYcIR.js +1730 -0
  699. package/dist/rich-text-editor-B9UbSXNb.js +1203 -0
  700. package/dist/rich-text-editor-BYuRBNBU.js +2373 -0
  701. package/dist/rich-text-editor-Bb9pySTs.cjs +2374 -0
  702. package/dist/rich-text-editor-BcL6L3cm.cjs +2374 -0
  703. package/dist/rich-text-editor-BoVZYtTs.cjs +2391 -0
  704. package/dist/rich-text-editor-Bp3zQqMC.js +2954 -0
  705. package/dist/rich-text-editor-CMgSN_w2.js +1189 -0
  706. package/dist/rich-text-editor-CPV1lEPH.cjs +1748 -0
  707. package/dist/rich-text-editor-CeucBdIv.cjs +2971 -0
  708. package/dist/rich-text-editor-CoKqbCtu.cjs +1799 -0
  709. package/dist/rich-text-editor-Cw56T_mB.js +2356 -0
  710. package/dist/rich-text-editor-Cyt8qs2b.js +1921 -0
  711. package/dist/rich-text-editor-D6H84OcX.cjs +1220 -0
  712. package/dist/rich-text-editor-D76gD-QI.js +2328 -0
  713. package/dist/rich-text-editor-DKkokOnA.js +1781 -0
  714. package/dist/rich-text-editor-DNsdpN64.cjs +2359 -0
  715. package/dist/rich-text-editor-DfG8bCyY.js +2358 -0
  716. package/dist/rich-text-editor-DqLICivI.js +2832 -0
  717. package/dist/rich-text-editor-DxO1Hz3a.cjs +2903 -0
  718. package/dist/rich-text-editor-Dxjw31Z4.js +2341 -0
  719. package/dist/rich-text-editor-DzP0Epmb.js +2356 -0
  720. package/dist/rich-text-editor-bRkNoeZY.cjs +2891 -0
  721. package/dist/rich-text-editor-lyYE2ZG5.cjs +1207 -0
  722. package/dist/rich-text-editor-skplNlBM.cjs +2345 -0
  723. package/dist/select-Bkbr0f-Z.cjs +162 -0
  724. package/dist/select-CH6v_KcQ.cjs +161 -0
  725. package/dist/select-CvIVdX2n.js +145 -0
  726. package/dist/select-D-xvCZK2.js +130 -0
  727. package/dist/{sidebar-CplprZpM.js → sidebar-3XyzjVBw.js} +40 -49
  728. package/dist/{sidebar-OTO_up7Z.js → sidebar-B6SlKZYN.js} +40 -49
  729. package/dist/{sidebar-CmvwjnVb.js → sidebar-BViy8Eeu.js} +17 -9
  730. package/dist/{sidebar-Dz7bd3zP.js → sidebar-BbVIQvlP.js} +1 -1
  731. package/dist/{sidebar-CVUGHOS_.cjs → sidebar-BxGXsDAd.cjs} +16 -8
  732. package/dist/sidebar-CK_0ZQHj.cjs +803 -0
  733. package/dist/{sidebar-KIS0C2JH.js → sidebar-CRMiBtAi.js} +1 -1
  734. package/dist/sidebar-CUuOvYhK.js +787 -0
  735. package/dist/{sidebar-zowjejT2.cjs → sidebar-CZ2mWaMM.cjs} +1 -1
  736. package/dist/{sidebar-CA6_ek3f.js → sidebar-CrQDDdcz.js} +24 -33
  737. package/dist/{sidebar-BvF5I2Ue.cjs → sidebar-DAaY8bRU.cjs} +24 -33
  738. package/dist/sidebar-DQj1z3jG.cjs +758 -0
  739. package/dist/sidebar-Djn5syhi.cjs +786 -0
  740. package/dist/{sidebar-B3EYhli0.cjs → sidebar-DyYvgyBj.cjs} +41 -46
  741. package/dist/sidebar-LluMXfam.js +759 -0
  742. package/dist/sidebar-_rT7rBMk.js +787 -0
  743. package/dist/{sidebar-B9NR0lCe.cjs → sidebar-nzPoVHBQ.cjs} +41 -46
  744. package/dist/{sidebar-C5B_LHek.cjs → sidebar-q7P2Godd.cjs} +1 -1
  745. package/dist/skeleton-DjiHerJn.cjs +87 -0
  746. package/dist/skeleton-DtR5tkYe.js +78 -0
  747. package/dist/slider-B00b9SVK.cjs +78 -0
  748. package/dist/slider-Bc5Hd0y1.js +56 -0
  749. package/dist/slider-DQCNUUMj.js +56 -0
  750. package/dist/slider-N7hFFj6X.cjs +73 -0
  751. package/dist/sonner-B-jWlik1.cjs +68 -0
  752. package/dist/sonner-C9tiqj4f.js +47 -0
  753. package/dist/tooltip-D8n9UYoU.cjs +72 -0
  754. package/dist/tooltip-Ded96neP.cjs +137 -0
  755. package/dist/tooltip-HDOoD2-0.js +120 -0
  756. package/dist/tooltip-RtbSmPYJ.js +48 -0
  757. package/dist/ui.cjs.js +23 -18
  758. package/dist/ui.es.js +16 -303
  759. package/dist/use-audio-player-B31J-aqh.cjs +187 -0
  760. package/dist/use-audio-player-B78fd2ct.js +188 -0
  761. package/dist/use-audio-player-BkmEmj8Q.js +185 -0
  762. package/dist/use-audio-player-CLFTWFW1.cjs +184 -0
  763. package/dist/use-audio-player-CLLn00I6.js +188 -0
  764. package/dist/use-audio-player-DGvhPrgR.cjs +190 -0
  765. package/dist/{use-audio-player-Dn1NR9xN.cjs → use-audio-player-NKsWyjWu.cjs} +7 -3
  766. package/dist/{use-audio-player-Bkh23vQ3.js → use-audio-player-nv8ZSGa1.js} +7 -3
  767. package/dist/use-file-upload-BcjEo2S5.js +404 -0
  768. package/dist/use-file-upload-CRJR68Tj.cjs +403 -0
  769. package/dist/use-mobile-B0hNy_Y6.cjs +4303 -0
  770. package/dist/use-mobile-BXuYROXM.js +4202 -0
  771. package/dist/use-mobile-Bbd51ASU.cjs +4392 -0
  772. package/dist/use-mobile-BdXTRb0Z.cjs +51 -0
  773. package/dist/use-mobile-Bk6CX-TC.js +4359 -0
  774. package/dist/use-mobile-BvYdisLP.js +4202 -0
  775. package/dist/use-mobile-BzuxjzNX.cjs +4392 -0
  776. package/dist/use-mobile-CG2-SdXV.cjs +4235 -0
  777. package/dist/use-mobile-CKb5pqTs.js +4269 -0
  778. package/dist/use-mobile-CYuAuGDl.js +4202 -0
  779. package/dist/use-mobile-CaENcqm-.js +4508 -0
  780. package/dist/use-mobile-CbrYgJGJ.js +4203 -0
  781. package/dist/use-mobile-Cd4xPrKq.cjs +46 -0
  782. package/dist/use-mobile-Ce2cBAQe.js +29 -0
  783. package/dist/use-mobile-DMOvImGQ.cjs +4542 -0
  784. package/dist/use-mobile-DRB3BQgD.cjs +4235 -0
  785. package/dist/use-mobile-DZvv7QMR.js +4359 -0
  786. package/dist/use-mobile-DdI_TXam.cjs +4235 -0
  787. package/dist/use-mobile-DlceKf8a.js +4359 -0
  788. package/dist/use-mobile-DsOnow1o.cjs +4236 -0
  789. package/dist/use-mobile-Kcj6jSnK.cjs +4392 -0
  790. package/dist/use-mobile-bnKcua_i.js +4202 -0
  791. package/dist/use-mobile-j4w2Jrf1.js +30 -0
  792. package/dist/use-mobile-ncXBeE2z.cjs +4235 -0
  793. package/dist/use-rich-text-editor-DjiddBGv.js +282 -0
  794. package/dist/use-rich-text-editor-lpeswbCs.cjs +281 -0
  795. package/dist/xertica-assistant-B687qEPU.js +2165 -0
  796. package/dist/xertica-assistant-BdiZag0h.js +2187 -0
  797. package/dist/xertica-assistant-CrgTb6Hs.cjs +2155 -0
  798. package/dist/xertica-assistant-DCsnQyi5.js +2156 -0
  799. package/dist/xertica-assistant-DUBpmEgo.cjs +2186 -0
  800. package/dist/{xertica-assistant-Bj3vBCq_.cjs → xertica-assistant-V_IdW4WF.cjs} +27 -9
  801. package/dist/{xertica-assistant-BMqdyRVi.js → xertica-assistant-ciJaWqm1.js} +28 -10
  802. package/dist/{xertica-assistant-B1IaHXnB.cjs → xertica-assistant-dyP7KHM5.cjs} +533 -392
  803. package/dist/xertica-assistant-sOHwTgIP.cjs +2172 -0
  804. package/dist/{xertica-assistant-DPsESB6t.js → xertica-assistant-yX1CFBBo.js} +535 -394
  805. package/dist/xertica-ui.css +2 -2
  806. package/docs/ai-usage.md +195 -195
  807. package/docs/components/accordion.md +109 -109
  808. package/docs/components/alert-dialog.md +127 -127
  809. package/docs/components/alert.md +106 -106
  810. package/docs/components/aspect-ratio.md +58 -58
  811. package/docs/components/assistant-chart.md +47 -47
  812. package/docs/components/assistant.md +2 -0
  813. package/docs/components/audio-player.md +167 -167
  814. package/docs/components/avatar.md +101 -101
  815. package/docs/components/badge.md +84 -84
  816. package/docs/components/breadcrumb.md +104 -104
  817. package/docs/components/button.md +156 -156
  818. package/docs/components/calendar.md +141 -141
  819. package/docs/components/card.md +245 -245
  820. package/docs/components/carousel.md +100 -100
  821. package/docs/components/chart.md +638 -638
  822. package/docs/components/checkbox.md +88 -88
  823. package/docs/components/code-block.md +105 -105
  824. package/docs/components/collapsible.md +86 -86
  825. package/docs/components/command.md +113 -113
  826. package/docs/components/context-menu.md +81 -81
  827. package/docs/components/dialog.md +198 -198
  828. package/docs/components/drawer.md +105 -105
  829. package/docs/components/dropdown-menu.md +127 -127
  830. package/docs/components/empty.md +127 -127
  831. package/docs/components/error-boundary.md +191 -191
  832. package/docs/components/file-upload.md +189 -189
  833. package/docs/components/floating-media-wrapper.md +63 -63
  834. package/docs/components/form.md +177 -177
  835. package/docs/components/formatted-document.md +105 -105
  836. package/docs/components/google-maps-loader.md +44 -44
  837. package/docs/components/header.md +177 -177
  838. package/docs/components/hover-card.md +86 -86
  839. package/docs/components/image-with-fallback.md +107 -107
  840. package/docs/components/input-otp.md +95 -95
  841. package/docs/components/input.md +130 -130
  842. package/docs/components/label.md +69 -69
  843. package/docs/components/language-selector.md +172 -172
  844. package/docs/components/map-layers.md +138 -138
  845. package/docs/components/map.md +84 -84
  846. package/docs/components/markdown-message.md +47 -47
  847. package/docs/components/menubar.md +89 -89
  848. package/docs/components/modern-chat-input.md +164 -164
  849. package/docs/components/navigation-menu.md +83 -83
  850. package/docs/components/notification-badge.md +78 -78
  851. package/docs/components/page-header.md +93 -93
  852. package/docs/components/pages.md +309 -309
  853. package/docs/components/pagination.md +334 -334
  854. package/docs/components/popover.md +116 -116
  855. package/docs/components/progress.md +103 -103
  856. package/docs/components/radio-group.md +133 -133
  857. package/docs/components/rating.md +77 -77
  858. package/docs/components/resizable.md +84 -84
  859. package/docs/components/rich-text-editor.md +255 -255
  860. package/docs/components/route-map.md +124 -124
  861. package/docs/components/scroll-area.md +58 -58
  862. package/docs/components/search.md +87 -87
  863. package/docs/components/select.md +144 -144
  864. package/docs/components/separator.md +58 -58
  865. package/docs/components/sheet.md +122 -122
  866. package/docs/components/sidebar.md +314 -314
  867. package/docs/components/simple-map.md +51 -51
  868. package/docs/components/skeleton.md +99 -99
  869. package/docs/components/slider.md +84 -84
  870. package/docs/components/sonner.md +115 -115
  871. package/docs/components/stats-card.md +120 -120
  872. package/docs/components/stepper.md +268 -268
  873. package/docs/components/switch.md +106 -106
  874. package/docs/components/table.md +138 -138
  875. package/docs/components/tabs.md +117 -117
  876. package/docs/components/textarea.md +86 -86
  877. package/docs/components/theme-toggle.md +73 -73
  878. package/docs/components/timeline.md +121 -121
  879. package/docs/components/toggle-group.md +68 -68
  880. package/docs/components/toggle.md +62 -62
  881. package/docs/components/tooltip.md +116 -116
  882. package/docs/components/tree-view.md +238 -238
  883. package/docs/components/use-mobile.md +96 -96
  884. package/docs/components/video-player.md +68 -68
  885. package/docs/components/xertica-logo.md +36 -36
  886. package/docs/components/xertica-orbe.md +35 -35
  887. package/docs/components/xertica-provider.md +65 -65
  888. package/docs/components/xertica-xlogo.md +35 -35
  889. package/docs/decision-tree.md +293 -293
  890. package/docs/form-sizing.md +162 -162
  891. package/docs/getting-started.md +24 -12
  892. package/docs/i18n.md +476 -476
  893. package/docs/installation.md +267 -267
  894. package/docs/layout.md +143 -143
  895. package/docs/patterns/analytics.md +194 -194
  896. package/docs/patterns/crud.md +149 -149
  897. package/docs/patterns/dashboard.md +138 -138
  898. package/docs/patterns/detail-page.md +296 -296
  899. package/docs/patterns/form.md +241 -241
  900. package/docs/patterns/login.md +156 -156
  901. package/docs/patterns/settings.md +368 -368
  902. package/docs/patterns/wizard.md +213 -213
  903. package/hooks/useTheme.test.tsx +16 -16
  904. package/hooks/useTheme.ts +4 -4
  905. package/imports/Podcast.tsx +540 -540
  906. package/imports/XerticaAi.tsx +46 -46
  907. package/imports/XerticaX.tsx +15 -15
  908. package/imports/svg-aueiaqngck.ts +20 -20
  909. package/imports/svg-v9krss1ozd.ts +23 -23
  910. package/imports/svg-vhrdofe3qe.ts +6 -6
  911. package/llms-compact.txt +2 -1
  912. package/llms.txt +2 -1
  913. package/mcp/resources.json +22 -22
  914. package/mcp/tools.json +35 -35
  915. package/package.json +10 -4
  916. package/scripts/ai-validator.ts +91 -91
  917. package/scripts/cleanup-case-dupes.ts +62 -62
  918. package/scripts/generate-ai-manifests.ts +107 -107
  919. package/styles/globals.css +13 -13
  920. package/styles/xertica/app-overrides/chat.css +61 -61
  921. package/styles/xertica/app-overrides/scrollbar.css +33 -33
  922. package/styles/xertica/base.css +84 -71
  923. package/styles/xertica/integrations/google-maps.css +76 -76
  924. package/styles/xertica/integrations/sonner.css +73 -73
  925. package/styles/xertica/theme-map.css +102 -99
  926. package/styles/xertica/tokens.css +240 -236
  927. package/templates/.prettierignore +4 -4
  928. package/templates/.prettierrc +10 -10
  929. package/templates/CLAUDE.md +116 -131
  930. package/templates/eslint.config.js +26 -26
  931. package/templates/package.json +3 -3
  932. package/templates/postcss.config.js +6 -6
  933. package/templates/src/app/components/AppLayout.tsx +55 -55
  934. package/templates/src/app/components/AuthGuard.tsx +82 -82
  935. package/templates/src/app/context/AuthContext.tsx +108 -108
  936. package/templates/src/features/assistant/data/mock.ts +75 -75
  937. package/templates/src/features/assistant/hooks/useAssistantConfig.ts +20 -20
  938. package/templates/src/features/auth/index.ts +4 -4
  939. package/templates/src/features/auth/ui/AuthPageShell.tsx +32 -32
  940. package/templates/src/features/auth/ui/ForgotPasswordContent.tsx +9 -7
  941. package/templates/src/features/auth/ui/LoginContent.tsx +10 -8
  942. package/templates/src/features/auth/ui/ResetPasswordContent.tsx +17 -15
  943. package/templates/src/features/auth/ui/SocialLoginButtons.tsx +9 -4
  944. package/templates/src/features/auth/ui/VerifyEmailContent.tsx +11 -9
  945. package/templates/src/features/home/data/mock.ts +35 -35
  946. package/templates/src/features/home/hooks/useFeatureCards.ts +20 -20
  947. package/templates/src/features/home/store/dashboardStore.ts +25 -25
  948. package/templates/src/features/home/ui/HomeContent.tsx +1 -1
  949. package/templates/src/features/template/index.ts +5 -5
  950. package/templates/src/features/template/ui/CrudTemplate.tsx +115 -115
  951. package/templates/src/features/template/ui/DashboardTemplate.tsx +110 -110
  952. package/templates/src/features/template/ui/FormTemplate.tsx +117 -117
  953. package/templates/src/features/template/ui/LoginTemplate.tsx +59 -59
  954. package/templates/src/features/template/ui/TemplateContent.tsx +1314 -1314
  955. package/templates/src/i18n.ts +124 -124
  956. package/templates/src/locales/en/common.json +21 -21
  957. package/templates/src/locales/en/components/activityCard.json +10 -10
  958. package/templates/src/locales/en/components/assistant.json +119 -105
  959. package/templates/src/locales/en/components/media.json +29 -29
  960. package/templates/src/locales/en/components/notificationCard.json +5 -5
  961. package/templates/src/locales/en/components/profileCard.json +8 -8
  962. package/templates/src/locales/en/components/projectCard.json +10 -10
  963. package/templates/src/locales/en/components/sidebar.json +14 -14
  964. package/templates/src/locales/en/components/stats.json +8 -8
  965. package/templates/src/locales/en/components/team.json +14 -14
  966. package/templates/src/locales/en/errors.json +9 -9
  967. package/templates/src/locales/en/languageSelector.json +7 -7
  968. package/templates/src/locales/en/nav.json +6 -6
  969. package/templates/src/locales/en/pages/crudTemplate.json +25 -25
  970. package/templates/src/locales/en/pages/dashboardTemplate.json +20 -20
  971. package/templates/src/locales/en/pages/forgotPassword.json +10 -0
  972. package/templates/src/locales/en/pages/formTemplate.json +16 -16
  973. package/templates/src/locales/en/pages/home.json +7 -7
  974. package/templates/src/locales/en/pages/login.json +15 -15
  975. package/templates/src/locales/en/pages/loginTemplate.json +9 -9
  976. package/templates/src/locales/en/pages/resetPassword.json +18 -18
  977. package/templates/src/locales/en/pages/templates.json +317 -317
  978. package/templates/src/locales/en/pages/verifyEmail.json +12 -12
  979. package/templates/src/locales/en/themeToggle.json +6 -6
  980. package/templates/src/locales/es/common.json +21 -21
  981. package/templates/src/locales/es/components/activityCard.json +10 -10
  982. package/templates/src/locales/es/components/assistant.json +119 -105
  983. package/templates/src/locales/es/components/media.json +29 -29
  984. package/templates/src/locales/es/components/notificationCard.json +5 -5
  985. package/templates/src/locales/es/components/profileCard.json +8 -8
  986. package/templates/src/locales/es/components/projectCard.json +10 -10
  987. package/templates/src/locales/es/components/sidebar.json +14 -14
  988. package/templates/src/locales/es/components/stats.json +8 -8
  989. package/templates/src/locales/es/components/team.json +14 -14
  990. package/templates/src/locales/es/errors.json +9 -9
  991. package/templates/src/locales/es/languageSelector.json +7 -7
  992. package/templates/src/locales/es/nav.json +6 -6
  993. package/templates/src/locales/es/pages/crudTemplate.json +25 -25
  994. package/templates/src/locales/es/pages/dashboardTemplate.json +20 -20
  995. package/templates/src/locales/es/pages/forgotPassword.json +10 -0
  996. package/templates/src/locales/es/pages/formTemplate.json +16 -16
  997. package/templates/src/locales/es/pages/home.json +7 -7
  998. package/templates/src/locales/es/pages/login.json +15 -15
  999. package/templates/src/locales/es/pages/loginTemplate.json +9 -9
  1000. package/templates/src/locales/es/pages/resetPassword.json +18 -18
  1001. package/templates/src/locales/es/pages/templates.json +317 -317
  1002. package/templates/src/locales/es/pages/verifyEmail.json +12 -12
  1003. package/templates/src/locales/es/themeToggle.json +6 -6
  1004. package/templates/src/locales/pt-BR/common.json +21 -21
  1005. package/templates/src/locales/pt-BR/components/activityCard.json +10 -10
  1006. package/templates/src/locales/pt-BR/components/assistant.json +119 -105
  1007. package/templates/src/locales/pt-BR/components/media.json +29 -29
  1008. package/templates/src/locales/pt-BR/components/notificationCard.json +5 -5
  1009. package/templates/src/locales/pt-BR/components/profileCard.json +8 -8
  1010. package/templates/src/locales/pt-BR/components/projectCard.json +10 -10
  1011. package/templates/src/locales/pt-BR/components/sidebar.json +14 -14
  1012. package/templates/src/locales/pt-BR/components/stats.json +8 -8
  1013. package/templates/src/locales/pt-BR/components/team.json +14 -14
  1014. package/templates/src/locales/pt-BR/errors.json +9 -9
  1015. package/templates/src/locales/pt-BR/languageSelector.json +7 -7
  1016. package/templates/src/locales/pt-BR/nav.json +6 -6
  1017. package/templates/src/locales/pt-BR/pages/crudTemplate.json +25 -25
  1018. package/templates/src/locales/pt-BR/pages/dashboardTemplate.json +20 -20
  1019. package/templates/src/locales/pt-BR/pages/forgotPassword.json +10 -0
  1020. package/templates/src/locales/pt-BR/pages/formTemplate.json +16 -16
  1021. package/templates/src/locales/pt-BR/pages/home.json +7 -7
  1022. package/templates/src/locales/pt-BR/pages/login.json +15 -15
  1023. package/templates/src/locales/pt-BR/pages/loginTemplate.json +9 -9
  1024. package/templates/src/locales/pt-BR/pages/resetPassword.json +18 -18
  1025. package/templates/src/locales/pt-BR/pages/templates.json +317 -317
  1026. package/templates/src/locales/pt-BR/pages/verifyEmail.json +12 -12
  1027. package/templates/src/locales/pt-BR/themeToggle.json +6 -6
  1028. package/templates/src/main.tsx +11 -11
  1029. package/templates/src/pages/AssistantPage.tsx +37 -36
  1030. package/templates/src/pages/ForgotPasswordPage.tsx +6 -6
  1031. package/templates/src/pages/LoginPage.tsx +10 -10
  1032. package/templates/src/pages/ResetPasswordPage.tsx +6 -6
  1033. package/templates/src/pages/TemplatePage.tsx +28 -28
  1034. package/templates/src/pages/VerifyEmailPage.tsx +6 -6
  1035. package/templates/src/shared/config/navigation.ts +19 -19
  1036. package/templates/src/shared/error-boundary.tsx +154 -154
  1037. package/templates/src/shared/error-fallbacks.tsx +226 -226
  1038. package/templates/src/shared/lib/auth.ts +20 -20
  1039. package/templates/src/shared/types/auth.ts +3 -3
  1040. package/templates/src/styles/index.css +95 -95
  1041. package/templates/src/styles/xertica/tokens.css +240 -236
  1042. package/templates/tsconfig.json +25 -25
  1043. package/templates/tsconfig.node.json +12 -12
  1044. package/templates/vite-env.d.ts +1 -1
  1045. package/templates/vite.config.ts +1 -1
  1046. package/utils/color-utils.ts +72 -72
  1047. package/utils/demo-responses.test.ts +10 -10
  1048. package/utils/demo-responses.ts +151 -151
  1049. package/utils/gemini.test.ts +25 -25
  1050. package/utils/gemini.ts +155 -155
  1051. package/dist/ThemeContext-CpqYShLq.cjs +0 -324
  1052. package/dist/ThemeContext-Du2nE1PL.js +0 -325
  1053. package/dist/ThemeContext-GeEBTJ3q.cjs +0 -1621
  1054. package/dist/ThemeContext-JyLK9B1o.js +0 -1622
  1055. package/dist/index-CkTUgOwX.js +0 -8
  1056. package/dist/{rich-text-editor-BmsjY03B.js → rich-text-editor-DgF8s7xW.js} +26 -26
  1057. package/dist/{rich-text-editor-GS2kpTAK.cjs → rich-text-editor-mWoaSCE4.cjs} +26 -26
@@ -1,1314 +1,1314 @@
1
- import React, { useState } from 'react';
2
- import {
3
- Button,
4
- Input,
5
- Label,
6
- Card,
7
- CardHeader,
8
- CardTitle,
9
- CardDescription,
10
- CardContent,
11
- CardFooter,
12
- Tabs,
13
- TabsContent,
14
- TabsList,
15
- TabsTrigger,
16
- Badge,
17
- Alert,
18
- AlertDescription,
19
- AlertTitle,
20
- Checkbox,
21
- RadioGroup,
22
- RadioGroupItem,
23
- Switch,
24
- Select,
25
- SelectContent,
26
- SelectItem,
27
- SelectTrigger,
28
- SelectValue,
29
- Textarea,
30
- Progress,
31
- Separator,
32
- Table,
33
- TableBody,
34
- TableCell,
35
- TableHead,
36
- TableHeader,
37
- TableRow,
38
- Slider,
39
- ScrollArea,
40
- Dialog,
41
- DialogTrigger,
42
- DialogContent,
43
- DialogHeader,
44
- DialogTitle,
45
- DialogDescription,
46
- DialogFooter,
47
- AlertDialog,
48
- AlertDialogTrigger,
49
- AlertDialogContent,
50
- AlertDialogHeader,
51
- AlertDialogTitle,
52
- AlertDialogDescription,
53
- AlertDialogFooter,
54
- AlertDialogAction,
55
- AlertDialogCancel,
56
- Pagination,
57
- PaginationContent,
58
- PaginationItem,
59
- PaginationLink,
60
- PaginationNext,
61
- PaginationPrevious,
62
- PaginationEllipsis,
63
- Stepper,
64
- Step,
65
- TreeView,
66
- RichTextEditor,
67
- usePagination,
68
- useStepper,
69
- } from 'xertica-ui/ui';
70
- import { Header, Sidebar } from 'xertica-ui/layout';
71
- import { useLayout } from 'xertica-ui/hooks';
72
- import { toast } from 'sonner';
73
- import { Link } from 'react-router-dom';
74
- import { Trans, useTranslation } from 'react-i18next';
75
- import {
76
- Settings,
77
- User,
78
- Mail,
79
- Phone,
80
- Calendar,
81
- Search,
82
- PanelLeft,
83
- Home,
84
- Users,
85
- Plus,
86
- Trash2,
87
- Archive,
88
- ArrowRightLeft,
89
- FileEdit,
90
- Clock,
91
- Map,
92
- } from 'lucide-react';
93
-
94
- export function TemplateContent() {
95
- const { t } = useTranslation();
96
-
97
- // ── TreeView demo data (built inside the component so labels react to language switches) ──
98
- const treeData = [
99
- {
100
- id: 'components',
101
- label: t('templates.enhanced.treeView.nodes.components'),
102
- children: [
103
- {
104
- id: 'ui',
105
- label: t('templates.enhanced.treeView.nodes.ui'),
106
- children: [
107
- { id: 'button', label: t('templates.enhanced.treeView.nodes.button') },
108
- { id: 'input', label: t('templates.enhanced.treeView.nodes.input') },
109
- { id: 'pagination', label: t('templates.enhanced.treeView.nodes.pagination') },
110
- ],
111
- },
112
- {
113
- id: 'layout',
114
- label: t('templates.enhanced.treeView.nodes.layout'),
115
- children: [
116
- { id: 'sidebar', label: t('templates.enhanced.treeView.nodes.sidebar') },
117
- { id: 'header', label: t('templates.enhanced.treeView.nodes.header') },
118
- ],
119
- },
120
- ],
121
- },
122
- {
123
- id: 'hooks',
124
- label: t('templates.enhanced.treeView.nodes.hooks'),
125
- // Hook identifiers stay as code — not translated.
126
- children: [
127
- { id: 'use-pagination', label: 'usePagination' },
128
- { id: 'use-stepper', label: 'useStepper' },
129
- { id: 'use-tree-view', label: 'useTreeView' },
130
- ],
131
- },
132
- ];
133
- const { sidebarExpanded, sidebarWidth } = useLayout();
134
- const [progress, setProgress] = useState(45);
135
- const [sliderValue, setSliderValue] = useState([50]);
136
- const [switchEnabled, setSwitchEnabled] = useState(false);
137
- const [richText, setRichText] = useState('');
138
-
139
- // Dialog demo inputs (controlled so they re-localise on language switch).
140
- // Seeded lazily from `t(...)` so the initial value reflects the current
141
- // language at first render; subsequent language switches don't overwrite
142
- // user edits.
143
- const [dialogName, setDialogName] = useState(() => t('templates.dialogs.nameDefaultValue'));
144
- const [dialogUsername, setDialogUsername] = useState(() =>
145
- t('templates.dialogs.usernameDefaultValue')
146
- );
147
-
148
- // ── Pagination demo ─────────────────────────────────────────────────────────
149
- const { currentPage, totalPages, items, next, prev, goTo, canGoPrev, canGoNext } = usePagination({
150
- totalItems: 120,
151
- pageSize: 10,
152
- });
153
-
154
- // ── Stepper demo ────────────────────────────────────────────────────────────
155
- const {
156
- currentStep,
157
- next: stepNext,
158
- prev: stepPrev,
159
- isFirstStep,
160
- isLastStep,
161
- } = useStepper({ totalSteps: 3 });
162
-
163
- const handleFormSubmit = (e: React.FormEvent) => {
164
- e.preventDefault();
165
- toast.success(t('templates.formSubmitSuccess'));
166
- };
167
-
168
- return (
169
- <div
170
- style={{
171
- paddingLeft: sidebarExpanded ? `${sidebarWidth}px` : '80px',
172
- }}
173
- className="flex-1 flex flex-col overflow-hidden transition-all duration-300"
174
- >
175
- <Header
176
- showThemeToggle={true}
177
- showLanguageSelector={true}
178
- breadcrumbs={[
179
- { label: t('nav.designSystem'), href: '/home' },
180
- { label: t('templates.breadcrumb') },
181
- ]}
182
- renderLink={(href: string, props: any) => <Link to={href} {...props} />}
183
- />
184
-
185
- <main className="flex-1 overflow-hidden bg-muted">
186
- <ScrollArea className="h-full">
187
- <div className="p-2 sm:p-4 md:p-6">
188
- <div className="max-w-6xl mx-auto space-y-8">
189
- <div className="space-y-2">
190
- <h2>{t('templates.title')}</h2>
191
- <p className="text-muted-foreground">{t('templates.subtitle')}</p>
192
- </div>
193
-
194
- {/* Alert Examples */}
195
- <section>
196
- <h3 className="mb-4">{t('templates.sections.alerts')}</h3>
197
- <div className="grid gap-4 md:grid-cols-2">
198
- <Alert variant="info">
199
- <AlertTitle>{t('templates.alerts.infoTitle')}</AlertTitle>
200
- <AlertDescription>{t('templates.alerts.infoDescription')}</AlertDescription>
201
- </Alert>
202
-
203
- <Alert variant="destructive">
204
- <AlertTitle>{t('templates.alerts.errorTitle')}</AlertTitle>
205
- <AlertDescription>{t('templates.alerts.errorDescription')}</AlertDescription>
206
- </Alert>
207
-
208
- <Alert variant="success">
209
- <AlertTitle>{t('templates.alerts.successTitle')}</AlertTitle>
210
- <AlertDescription>{t('templates.alerts.successDescription')}</AlertDescription>
211
- </Alert>
212
-
213
- <Alert variant="warning">
214
- <AlertTitle>{t('templates.alerts.warningTitle')}</AlertTitle>
215
- <AlertDescription>{t('templates.alerts.warningDescription')}</AlertDescription>
216
- </Alert>
217
- </div>
218
- </section>
219
-
220
- <Separator className="my-8" />
221
-
222
- {/* Cards & Tabs */}
223
- <section>
224
- <h3 className="mb-4">{t('templates.sections.cardsAndTabs')}</h3>
225
-
226
- <Tabs defaultValue="overview" className="w-full">
227
- <TabsList className="grid w-full grid-cols-4">
228
- <TabsTrigger value="overview">{t('templates.tabs.overview')}</TabsTrigger>
229
- <TabsTrigger value="forms">{t('templates.tabs.forms')}</TabsTrigger>
230
- <TabsTrigger value="data">{t('templates.tabs.data')}</TabsTrigger>
231
- <TabsTrigger value="settings">{t('templates.tabs.settings')}</TabsTrigger>
232
- </TabsList>
233
-
234
- {/* Overview Tab */}
235
- <TabsContent value="overview" className="space-y-4">
236
- <div className="grid gap-4 md:grid-cols-3">
237
- <Card>
238
- <CardHeader>
239
- <CardTitle>{t('stats.totalUsers')}</CardTitle>
240
- <CardDescription>{t('stats.last30Days')}</CardDescription>
241
- </CardHeader>
242
- <CardContent>
243
- <div className="text-foreground">
244
- <span className="[font-size:var(--text-stats)] [font-weight:var(--font-weight-bold)]">
245
- {t('templates.overview.totalUsersDemoValue')}
246
- </span>
247
- <Badge variant="default" className="ml-2">
248
- +12%
249
- </Badge>
250
- </div>
251
- </CardContent>
252
- </Card>
253
-
254
- <Card>
255
- <CardHeader>
256
- <CardTitle>{t('stats.totalRevenue')}</CardTitle>
257
- <CardDescription>{t('stats.currentMonth')}</CardDescription>
258
- </CardHeader>
259
- <CardContent>
260
- <div className="text-foreground">
261
- <span className="[font-size:var(--text-stats)] [font-weight:var(--font-weight-bold)]">
262
- {t('templates.overview.revenueDemoValue')}
263
- </span>
264
- <Badge variant="secondary" className="ml-2">
265
- +8%
266
- </Badge>
267
- </div>
268
- </CardContent>
269
- </Card>
270
-
271
- <Card>
272
- <CardHeader>
273
- <CardTitle>{t('stats.conversionRate')}</CardTitle>
274
- <CardDescription>{t('stats.currentWeek')}</CardDescription>
275
- </CardHeader>
276
- <CardContent>
277
- <div className="text-foreground">
278
- <span className="[font-size:var(--text-stats)] [font-weight:var(--font-weight-bold)]">
279
- {t('templates.overview.conversionRateDemoValue')}
280
- </span>
281
- <Badge variant="outline" className="ml-2">
282
- -2%
283
- </Badge>
284
- </div>
285
- </CardContent>
286
- </Card>
287
- </div>
288
-
289
- <Card>
290
- <CardHeader>
291
- <CardTitle>{t('templates.overview.progressTitle')}</CardTitle>
292
- <CardDescription>
293
- {t('templates.overview.progressDescription')}
294
- </CardDescription>
295
- </CardHeader>
296
- <CardContent className="space-y-6">
297
- <div className="space-y-2">
298
- <div className="flex items-center justify-between">
299
- <Label>{t('templates.overview.projectProgress')}</Label>
300
- <span className="[font-size:var(--text-small)] text-muted-foreground">
301
- {progress}%
302
- </span>
303
- </div>
304
- <Progress value={progress} className="w-full" />
305
- <div className="flex gap-2">
306
- <Button
307
- size="sm"
308
- onClick={() => setProgress(Math.max(0, progress - 10))}
309
- >
310
- -10%
311
- </Button>
312
- <Button
313
- size="sm"
314
- onClick={() => setProgress(Math.min(100, progress + 10))}
315
- >
316
- +10%
317
- </Button>
318
- </div>
319
- </div>
320
-
321
- <Separator />
322
-
323
- <div className="space-y-2">
324
- <div className="flex items-center justify-between">
325
- <Label>{t('templates.overview.volume')}</Label>
326
- <span className="[font-size:var(--text-small)] text-muted-foreground">
327
- {sliderValue[0]}%
328
- </span>
329
- </div>
330
- <Slider
331
- value={sliderValue}
332
- onValueChange={setSliderValue}
333
- min={0}
334
- max={100}
335
- step={1}
336
- className="w-full"
337
- />
338
- </div>
339
- </CardContent>
340
- </Card>
341
- </TabsContent>
342
-
343
- {/* Forms Tab */}
344
- <TabsContent value="forms" className="space-y-4">
345
- <Card>
346
- <CardHeader>
347
- <CardTitle>{t('templates.forms.registrationTitle')}</CardTitle>
348
- <CardDescription>
349
- {t('templates.forms.registrationDescription')}
350
- </CardDescription>
351
- </CardHeader>
352
- <CardContent>
353
- <form onSubmit={handleFormSubmit} className="space-y-4">
354
- <div className="grid gap-4 md:grid-cols-2">
355
- <div className="space-y-2">
356
- <Label htmlFor="firstName">{t('templates.forms.firstName')}</Label>
357
- <Input
358
- id="firstName"
359
- placeholder={t('templates.forms.firstNamePlaceholder')}
360
- />
361
- </div>
362
- <div className="space-y-2">
363
- <Label htmlFor="lastName">{t('templates.forms.lastName')}</Label>
364
- <Input
365
- id="lastName"
366
- placeholder={t('templates.forms.lastNamePlaceholder')}
367
- />
368
- </div>
369
- </div>
370
-
371
- <div className="space-y-2">
372
- <Label htmlFor="email">{t('templates.forms.email')}</Label>
373
- <div className="relative">
374
- <Mail className="absolute left-3 top-3 h-4 w-4 text-muted-foreground" />
375
- <Input
376
- id="email"
377
- type="email"
378
- placeholder={t('templates.forms.emailPlaceholder')}
379
- className="pl-10"
380
- />
381
- </div>
382
- </div>
383
-
384
- <div className="space-y-2">
385
- <Label htmlFor="phone">{t('templates.forms.phone')}</Label>
386
- <div className="relative">
387
- <Phone className="absolute left-3 top-3 h-4 w-4 text-muted-foreground" />
388
- <Input
389
- id="phone"
390
- type="tel"
391
- placeholder={t('templates.forms.phonePlaceholder')}
392
- className="pl-10"
393
- />
394
- </div>
395
- </div>
396
-
397
- <div className="space-y-2">
398
- <Label htmlFor="role">{t('templates.forms.role')}</Label>
399
- <Select>
400
- <SelectTrigger id="role">
401
- <SelectValue placeholder={t('templates.forms.rolePlaceholder')} />
402
- </SelectTrigger>
403
- <SelectContent>
404
- <SelectItem value="developer">
405
- {t('templates.forms.roles.developer')}
406
- </SelectItem>
407
- <SelectItem value="designer">
408
- {t('templates.forms.roles.designer')}
409
- </SelectItem>
410
- <SelectItem value="manager">
411
- {t('templates.forms.roles.manager')}
412
- </SelectItem>
413
- <SelectItem value="analyst">
414
- {t('templates.forms.roles.analyst')}
415
- </SelectItem>
416
- </SelectContent>
417
- </Select>
418
- </div>
419
-
420
- <div className="space-y-2">
421
- <Label htmlFor="bio">{t('templates.forms.bio')}</Label>
422
- <Textarea
423
- id="bio"
424
- placeholder={t('templates.forms.bioPlaceholder')}
425
- rows={4}
426
- />
427
- </div>
428
-
429
- <Separator />
430
-
431
- <div className="space-y-4">
432
- <h4>{t('templates.forms.preferences')}</h4>
433
-
434
- <div className="space-y-3">
435
- <div className="flex items-center space-x-2">
436
- <Checkbox id="newsletter" />
437
- <Label htmlFor="newsletter" className="font-normal">
438
- {t('templates.forms.newsletter')}
439
- </Label>
440
- </div>
441
-
442
- <div className="flex items-center space-x-2">
443
- <Checkbox id="notifications" />
444
- <Label htmlFor="notifications" className="font-normal">
445
- {t('templates.forms.pushNotifications')}
446
- </Label>
447
- </div>
448
-
449
- <div className="flex items-center space-x-2">
450
- <Checkbox id="updates" />
451
- <Label htmlFor="updates" className="font-normal">
452
- {t('templates.forms.featureUpdates')}
453
- </Label>
454
- </div>
455
- </div>
456
-
457
- <Separator />
458
-
459
- <div className="space-y-3">
460
- <Label>{t('templates.forms.accountType')}</Label>
461
- <RadioGroup defaultValue="personal">
462
- <div className="flex items-center space-x-2">
463
- <RadioGroupItem value="personal" id="personal" />
464
- <Label htmlFor="personal" className="font-normal">
465
- {t('templates.forms.accountPersonal')}
466
- </Label>
467
- </div>
468
- <div className="flex items-center space-x-2">
469
- <RadioGroupItem value="business" id="business" />
470
- <Label htmlFor="business" className="font-normal">
471
- {t('templates.forms.accountBusiness')}
472
- </Label>
473
- </div>
474
- <div className="flex items-center space-x-2">
475
- <RadioGroupItem value="enterprise" id="enterprise" />
476
- <Label htmlFor="enterprise" className="font-normal">
477
- {t('templates.forms.accountEnterprise')}
478
- </Label>
479
- </div>
480
- </RadioGroup>
481
- </div>
482
- </div>
483
- </form>
484
- </CardContent>
485
- <CardFooter className="flex justify-between">
486
- <Button variant="outline">{t('templates.forms.cancel')}</Button>
487
- <Button onClick={handleFormSubmit}>
488
- {t('templates.forms.createAccount')}
489
- </Button>
490
- </CardFooter>
491
- </Card>
492
- </TabsContent>
493
-
494
- {/* Data Tab */}
495
- <TabsContent value="data" className="space-y-4">
496
- <Card>
497
- <CardHeader>
498
- <CardTitle>{t('templates.data.title')}</CardTitle>
499
- <CardDescription>{t('templates.data.description')}</CardDescription>
500
- </CardHeader>
501
- <CardContent>
502
- <div className="mb-4">
503
- <div className="relative">
504
- <Search className="absolute left-3 top-3 h-4 w-4 text-muted-foreground" />
505
- <Input
506
- placeholder={t('templates.data.searchPlaceholder')}
507
- className="pl-10"
508
- />
509
- </div>
510
- </div>
511
-
512
- <div className="rounded-[var(--radius-lg)] border border-border overflow-hidden">
513
- <Table>
514
- <TableHeader>
515
- <TableRow>
516
- <TableHead>{t('templates.data.headers.name')}</TableHead>
517
- <TableHead>{t('templates.data.headers.email')}</TableHead>
518
- <TableHead>{t('templates.data.headers.role')}</TableHead>
519
- <TableHead>{t('templates.data.headers.status')}</TableHead>
520
- <TableHead className="text-right">
521
- {t('templates.data.headers.actions')}
522
- </TableHead>
523
- </TableRow>
524
- </TableHeader>
525
- <TableBody>
526
- <TableRow>
527
- <TableCell>Ana Silva</TableCell>
528
- <TableCell>{`ana.silva@${t('templates.data.demoEmailDomain')}`}</TableCell>
529
- <TableCell>{t('templates.data.roles.developerFemale')}</TableCell>
530
- <TableCell>
531
- <Badge variant="default">
532
- {t('templates.data.status.active')}
533
- </Badge>
534
- </TableCell>
535
- <TableCell className="text-right">
536
- <Button variant="ghost" size="sm">
537
- {t('templates.data.edit')}
538
- </Button>
539
- </TableCell>
540
- </TableRow>
541
- <TableRow>
542
- <TableCell>Bruno Costa</TableCell>
543
- <TableCell>{`bruno.costa@${t('templates.data.demoEmailDomain')}`}</TableCell>
544
- <TableCell>{t('templates.data.roles.designer')}</TableCell>
545
- <TableCell>
546
- <Badge variant="default">
547
- {t('templates.data.status.active')}
548
- </Badge>
549
- </TableCell>
550
- <TableCell className="text-right">
551
- <Button variant="ghost" size="sm">
552
- {t('templates.data.edit')}
553
- </Button>
554
- </TableCell>
555
- </TableRow>
556
- <TableRow>
557
- <TableCell>Carla Oliveira</TableCell>
558
- <TableCell>{`carla.oliveira@${t('templates.data.demoEmailDomain')}`}</TableCell>
559
- <TableCell>{t('templates.data.roles.manager')}</TableCell>
560
- <TableCell>
561
- <Badge variant="secondary">
562
- {t('templates.data.status.away')}
563
- </Badge>
564
- </TableCell>
565
- <TableCell className="text-right">
566
- <Button variant="ghost" size="sm">
567
- {t('templates.data.edit')}
568
- </Button>
569
- </TableCell>
570
- </TableRow>
571
- <TableRow>
572
- <TableCell>Diego Santos</TableCell>
573
- <TableCell>{`diego.santos@${t('templates.data.demoEmailDomain')}`}</TableCell>
574
- <TableCell>{t('templates.data.roles.analyst')}</TableCell>
575
- <TableCell>
576
- <Badge variant="outline">
577
- {t('templates.data.status.inactive')}
578
- </Badge>
579
- </TableCell>
580
- <TableCell className="text-right">
581
- <Button variant="ghost" size="sm">
582
- {t('templates.data.edit')}
583
- </Button>
584
- </TableCell>
585
- </TableRow>
586
- </TableBody>
587
- </Table>
588
- </div>
589
- </CardContent>
590
- <CardFooter className="flex justify-between items-center">
591
- <p className="text-muted-foreground">
592
- {t('templates.data.showing', { count: 4, total: 127 })}
593
- </p>
594
- <div className="flex gap-2">
595
- <Button variant="outline" size="sm">
596
- {t('templates.data.previous')}
597
- </Button>
598
- <Button variant="outline" size="sm">
599
- {t('templates.data.next')}
600
- </Button>
601
- </div>
602
- </CardFooter>
603
- </Card>
604
- </TabsContent>
605
-
606
- {/* Settings Tab */}
607
- <TabsContent value="settings" className="space-y-4">
608
- <Card>
609
- <CardHeader>
610
- <CardTitle>{t('templates.settings.title')}</CardTitle>
611
- <CardDescription>{t('templates.settings.description')}</CardDescription>
612
- </CardHeader>
613
- <CardContent className="space-y-6">
614
- <div className="flex items-center justify-between">
615
- <div className="space-y-1">
616
- <Label>{t('templates.settings.darkMode')}</Label>
617
- <p className="text-muted-foreground">
618
- {t('templates.settings.darkModeDescription')}
619
- </p>
620
- </div>
621
- <Switch checked={switchEnabled} onCheckedChange={setSwitchEnabled} />
622
- </div>
623
-
624
- <Separator />
625
-
626
- <div className="flex items-center justify-between">
627
- <div className="space-y-1">
628
- <Label>{t('templates.settings.emailNotifications')}</Label>
629
- <p className="text-muted-foreground">
630
- {t('templates.settings.emailNotificationsDescription')}
631
- </p>
632
- </div>
633
- <Switch defaultChecked />
634
- </div>
635
-
636
- <Separator />
637
-
638
- <div className="flex items-center justify-between">
639
- <div className="space-y-1">
640
- <Label>{t('templates.settings.pushNotifications')}</Label>
641
- <p className="text-muted-foreground">
642
- {t('templates.settings.pushNotificationsDescription')}
643
- </p>
644
- </div>
645
- <Switch />
646
- </div>
647
-
648
- <Separator />
649
-
650
- <div className="space-y-3">
651
- <Label>{t('templates.settings.language')}</Label>
652
- <Select defaultValue="pt-br">
653
- <SelectTrigger>
654
- <SelectValue />
655
- </SelectTrigger>
656
- <SelectContent>
657
- <SelectItem value="pt-br">
658
- {t('templates.settings.languages.ptBR')}
659
- </SelectItem>
660
- <SelectItem value="en">
661
- {t('templates.settings.languages.en')}
662
- </SelectItem>
663
- <SelectItem value="es">
664
- {t('templates.settings.languages.es')}
665
- </SelectItem>
666
- </SelectContent>
667
- </Select>
668
- </div>
669
-
670
- <Separator />
671
-
672
- <div className="space-y-3">
673
- <Label>{t('templates.settings.timezone')}</Label>
674
- <Select defaultValue="america-sao-paulo">
675
- <SelectTrigger>
676
- <SelectValue />
677
- </SelectTrigger>
678
- <SelectContent>
679
- <SelectItem value="america-sao-paulo">
680
- {t('templates.settings.timezones.saoPaulo')}
681
- </SelectItem>
682
- <SelectItem value="america-new-york">
683
- {t('templates.settings.timezones.newYork')}
684
- </SelectItem>
685
- <SelectItem value="europe-london">
686
- {t('templates.settings.timezones.london')}
687
- </SelectItem>
688
- </SelectContent>
689
- </Select>
690
- </div>
691
- </CardContent>
692
- <CardFooter className="flex justify-between">
693
- <Button variant="outline">{t('templates.settings.restoreDefaults')}</Button>
694
- <Button>{t('templates.settings.saveChanges')}</Button>
695
- </CardFooter>
696
- </Card>
697
- </TabsContent>
698
- </Tabs>
699
- </section>
700
-
701
- <Separator className="my-8" />
702
-
703
- {/* Button Variants */}
704
- <section>
705
- <h3 className="mb-4">{t('templates.sections.buttons')}</h3>
706
- <Card>
707
- <CardHeader>
708
- <CardTitle>{t('templates.buttons.title')}</CardTitle>
709
- <CardDescription>{t('templates.buttons.description')}</CardDescription>
710
- </CardHeader>
711
- <CardContent className="space-y-6">
712
- <div className="space-y-3">
713
- <Label>{t('templates.buttons.variants')}</Label>
714
- <div className="flex flex-wrap gap-3">
715
- <Button variant="default">
716
- {t('templates.buttons.variantLabels.default')}
717
- </Button>
718
- <Button variant="secondary">
719
- {t('templates.buttons.variantLabels.secondary')}
720
- </Button>
721
- <Button variant="outline">
722
- {t('templates.buttons.variantLabels.outline')}
723
- </Button>
724
- <Button variant="ghost">
725
- {t('templates.buttons.variantLabels.ghost')}
726
- </Button>
727
- <Button variant="link">{t('templates.buttons.variantLabels.link')}</Button>
728
- <Button variant="destructive">
729
- {t('templates.buttons.variantLabels.destructive')}
730
- </Button>
731
- </div>
732
- </div>
733
-
734
- <Separator />
735
-
736
- <div className="space-y-3">
737
- <Label>{t('templates.buttons.sizes')}</Label>
738
- <div className="flex flex-wrap items-center gap-3">
739
- <Button size="sm">{t('templates.buttons.sizeLabels.small')}</Button>
740
- <Button size="default">{t('templates.buttons.sizeLabels.default')}</Button>
741
- <Button size="lg">{t('templates.buttons.sizeLabels.large')}</Button>
742
- <Button size="icon">
743
- <Settings className="h-4 w-4" />
744
- </Button>
745
- </div>
746
- </div>
747
-
748
- <Separator />
749
-
750
- <div className="space-y-3">
751
- <Label>{t('templates.buttons.withIcons')}</Label>
752
- <div className="flex flex-wrap gap-3">
753
- <Button>
754
- <User className="mr-2 h-4 w-4" />
755
- {t('templates.buttons.profile')}
756
- </Button>
757
- <Button variant="secondary">
758
- <Mail className="mr-2 h-4 w-4" />
759
- {t('templates.buttons.messages')}
760
- </Button>
761
- <Button variant="outline">
762
- <Calendar className="mr-2 h-4 w-4" />
763
- {t('templates.buttons.schedule')}
764
- </Button>
765
- </div>
766
- </div>
767
-
768
- <Separator />
769
-
770
- <div className="space-y-3">
771
- <Label>{t('templates.buttons.states')}</Label>
772
- <div className="flex flex-wrap gap-3">
773
- <Button disabled>{t('templates.buttons.disabled')}</Button>
774
- <Button variant="outline" disabled>
775
- {t('templates.buttons.outlineDisabled')}
776
- </Button>
777
- </div>
778
- </div>
779
- </CardContent>
780
- </Card>
781
- </section>
782
-
783
- <Separator className="my-8" />
784
-
785
- {/* Badges */}
786
- <section>
787
- <h3 className="mb-4">{t('templates.sections.badges')}</h3>
788
- <Card>
789
- <CardHeader>
790
- <CardTitle>{t('templates.badges.title')}</CardTitle>
791
- <CardDescription>{t('templates.badges.description')}</CardDescription>
792
- </CardHeader>
793
- <CardContent>
794
- <div className="flex flex-wrap gap-3">
795
- <Badge variant="default">{t('templates.badges.labels.default')}</Badge>
796
- <Badge variant="secondary">{t('templates.badges.labels.secondary')}</Badge>
797
- <Badge variant="outline">{t('templates.badges.labels.outline')}</Badge>
798
- <Badge variant="destructive">
799
- {t('templates.badges.labels.destructive')}
800
- </Badge>
801
- <Badge className="bg-success text-success-foreground">
802
- {t('templates.badges.labels.success')}
803
- </Badge>
804
- <Badge className="bg-warning text-warning-foreground">
805
- {t('templates.badges.labels.warning')}
806
- </Badge>
807
- <Badge className="bg-info text-info-foreground">
808
- {t('templates.badges.labels.info')}
809
- </Badge>
810
- </div>
811
- </CardContent>
812
- </Card>
813
- </section>
814
-
815
- <Separator className="my-8" />
816
-
817
- {/* Dialogs */}
818
- <section>
819
- <h3 className="mb-4">{t('templates.sections.dialogs')}</h3>
820
- <div className="grid gap-4 md:grid-cols-2">
821
- <Card>
822
- <CardHeader>
823
- <CardTitle>{t('templates.dialogs.dialogTitle')}</CardTitle>
824
- <CardDescription>{t('templates.dialogs.dialogDescription')}</CardDescription>
825
- </CardHeader>
826
- <CardContent className="flex justify-center py-6">
827
- <Dialog>
828
- <DialogTrigger asChild>
829
- <Button variant="outline">{t('templates.dialogs.editProfile')}</Button>
830
- </DialogTrigger>
831
- <DialogContent className="sm:max-w-[425px]">
832
- <DialogHeader>
833
- <DialogTitle>{t('templates.dialogs.editProfile')}</DialogTitle>
834
- <DialogDescription>
835
- {t('templates.dialogs.editProfileDescription')}
836
- </DialogDescription>
837
- </DialogHeader>
838
- <div className="grid gap-4 py-4">
839
- <div className="grid grid-cols-4 items-center gap-4">
840
- <Label htmlFor="name" className="text-right">
841
- {t('templates.dialogs.name')}
842
- </Label>
843
- <Input
844
- id="name"
845
- value={dialogName}
846
- onChange={e => setDialogName(e.target.value)}
847
- className="col-span-3"
848
- />
849
- </div>
850
- <div className="grid grid-cols-4 items-center gap-4">
851
- <Label htmlFor="username" className="text-right">
852
- {t('templates.dialogs.username')}
853
- </Label>
854
- <Input
855
- id="username"
856
- value={dialogUsername}
857
- onChange={e => setDialogUsername(e.target.value)}
858
- className="col-span-3"
859
- />
860
- </div>
861
- </div>
862
- <DialogFooter>
863
- <Button type="submit">{t('templates.dialogs.update')}</Button>
864
- </DialogFooter>
865
- </DialogContent>
866
- </Dialog>
867
- </CardContent>
868
- </Card>
869
-
870
- <Card>
871
- <CardHeader>
872
- <CardTitle>{t('templates.dialogs.alertDialogTitle')}</CardTitle>
873
- <CardDescription>
874
- {t('templates.dialogs.alertDialogDescription')}
875
- </CardDescription>
876
- </CardHeader>
877
- <CardContent className="flex justify-center py-6">
878
- <AlertDialog>
879
- <AlertDialogTrigger asChild>
880
- <Button variant="destructive">
881
- {t('templates.dialogs.deleteAccount')}
882
- </Button>
883
- </AlertDialogTrigger>
884
- <AlertDialogContent className="sm:max-w-[425px]">
885
- <AlertDialogHeader>
886
- <AlertDialogTitle>
887
- {t('templates.dialogs.areYouSure')}
888
- </AlertDialogTitle>
889
- <AlertDialogDescription>
890
- {t('templates.dialogs.deleteWarning')}
891
- </AlertDialogDescription>
892
- </AlertDialogHeader>
893
- <AlertDialogFooter>
894
- <AlertDialogCancel>{t('templates.dialogs.cancel')}</AlertDialogCancel>
895
- <AlertDialogAction className="bg-destructive text-destructive-foreground hover:bg-destructive/90">
896
- {t('templates.dialogs.continue')}
897
- </AlertDialogAction>
898
- </AlertDialogFooter>
899
- </AlertDialogContent>
900
- </AlertDialog>
901
- </CardContent>
902
- </Card>
903
- </div>
904
- </section>
905
-
906
- <Separator className="my-8" />
907
-
908
- {/* Sidebar Variations */}
909
- <section>
910
- <h3 className="mb-4">{t('templates.sections.sidebarVariations')}</h3>
911
- <Card>
912
- <CardHeader>
913
- <CardTitle>{t('templates.sidebar.title')}</CardTitle>
914
- <CardDescription>{t('templates.sidebar.description')}</CardDescription>
915
- </CardHeader>
916
- <CardContent>
917
- <Tabs defaultValue="assistant" className="w-full">
918
- <TabsList className="mb-4">
919
- <TabsTrigger value="assistant">
920
- {t('templates.sidebar.assistantMode')}
921
- </TabsTrigger>
922
- <TabsTrigger value="default">
923
- {t('templates.sidebar.defaultMode')}
924
- </TabsTrigger>
925
- </TabsList>
926
-
927
- <TabsContent value="assistant">
928
- <div
929
- className="relative h-[600px] border rounded-[var(--radius-lg)] bg-muted/20 overflow-hidden"
930
- style={{ transform: 'translateZ(0)' }}
931
- >
932
- <Sidebar
933
- expanded={true}
934
- width={sidebarWidth}
935
- onToggle={() => {}}
936
- user={{ email: 'admin@xertica.com' }}
937
- onLogout={() => toast(t('templates.sidebar.logoutToast'))}
938
- location={{ pathname: '/assistant/current' }}
939
- navigate={() => {}}
940
- variant="assistant"
941
- search={{
942
- show: true,
943
- placeholder: t('templates.sidebar.searchTopicsPlaceholder'),
944
- }}
945
- fixedArea={{
946
- show: true,
947
- content: (
948
- <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]">
949
- <Plus className="w-4 h-4 mr-2" />
950
- {t('templates.sidebar.newConversation')}
951
- </Button>
952
- ),
953
- }}
954
- navigationGroups={[
955
- {
956
- id: 'recent',
957
- label: t('templates.sidebar.recent'),
958
- icon: Clock,
959
- items: [
960
- {
961
- path: '/assistant/refatoracao',
962
- label: t('templates.sidebar.items.sidebarRefactor'),
963
- icon: PanelLeft,
964
- description: t(
965
- 'templates.sidebar.items.sidebarRefactorDescription'
966
- ),
967
- actions: [
968
- {
969
- label: t('templates.sidebar.actions.rename'),
970
- icon: FileEdit,
971
- onClick: () =>
972
- toast(t('templates.sidebar.actions.renameToast')),
973
- },
974
- {
975
- label: t('templates.sidebar.actions.move'),
976
- icon: ArrowRightLeft,
977
- children: [
978
- {
979
- label: t('templates.sidebar.actions.moveActive'),
980
- onClick: () =>
981
- toast(
982
- t('templates.sidebar.actions.moveActiveToast')
983
- ),
984
- },
985
- {
986
- label: t('templates.sidebar.actions.moveMonitoring'),
987
- onClick: () =>
988
- toast(
989
- t('templates.sidebar.actions.moveMonitoringToast')
990
- ),
991
- },
992
- {
993
- label: t('templates.sidebar.actions.moveArchive'),
994
- onClick: () =>
995
- toast(
996
- t('templates.sidebar.actions.moveArchiveToast')
997
- ),
998
- },
999
- ],
1000
- },
1001
- {
1002
- label: t('templates.sidebar.actions.clear'),
1003
- icon: Trash2,
1004
- onClick: () =>
1005
- toast(t('templates.sidebar.actions.clearToast')),
1006
- variant: 'destructive',
1007
- },
1008
- ],
1009
- },
1010
- ],
1011
- },
1012
- {
1013
- id: 'projects',
1014
- label: t('templates.sidebar.constructionMonitoring'),
1015
- icon: Map,
1016
- actions: [
1017
- {
1018
- label: t('templates.sidebar.actions.newCategory'),
1019
- icon: Plus,
1020
- onClick: () =>
1021
- toast(t('templates.sidebar.actions.newCategoryToast')),
1022
- },
1023
- {
1024
- label: t('templates.sidebar.actions.archiveGroup'),
1025
- icon: Archive,
1026
- onClick: () =>
1027
- toast(t('templates.sidebar.actions.archiveGroupToast')),
1028
- },
1029
- ],
1030
- items: [
1031
- {
1032
- path: '/assistant/br163',
1033
- label: t('templates.sidebar.items.br163Restoration'),
1034
- icon: () => (
1035
- <div className="w-2 h-2 rounded-full bg-yellow-500" />
1036
- ),
1037
- description: (
1038
- <div className="space-y-1.5 min-w-[160px]">
1039
- <Progress
1040
- value={67}
1041
- className="h-1.5 bg-sidebar-foreground/10"
1042
- />
1043
- <div className="flex justify-between items-center text-[10px] text-sidebar-foreground/60">
1044
- <span>{t('templates.sidebar.items.br163Location')}</span>
1045
- <span>67%</span>
1046
- </div>
1047
- </div>
1048
- ),
1049
- },
1050
- ],
1051
- },
1052
- ]}
1053
- />
1054
- <div
1055
- className="absolute inset-y-0 right-0 p-8 flex items-center justify-center transition-all duration-300"
1056
- style={{ left: `${sidebarWidth}px` }}
1057
- >
1058
- <p className="text-muted-foreground text-center">
1059
- {t('templates.sidebar.assistantContent')}
1060
- </p>
1061
- </div>
1062
- </div>
1063
- </TabsContent>
1064
-
1065
- <TabsContent value="default">
1066
- <div
1067
- className="relative h-[600px] border rounded-[var(--radius-lg)] bg-muted/20 overflow-hidden"
1068
- style={{ transform: 'translateZ(0)' }}
1069
- >
1070
- <Sidebar
1071
- expanded={true}
1072
- width={sidebarWidth}
1073
- onToggle={() => {}}
1074
- user={{
1075
- name: 'Ariel Santos',
1076
- email: 'admin@xertica.com',
1077
- avatar: 'https://github.com/shadcn.png',
1078
- }}
1079
- onLogout={() => toast(t('templates.sidebar.logoutToast'))}
1080
- onSettingsClick={() =>
1081
- toast(t('templates.sidebar.settingsClickedToast'))
1082
- }
1083
- location={{ pathname: '/home' }}
1084
- navigate={() => {}}
1085
- variant="default"
1086
- routes={[
1087
- { path: '/home', label: t('templates.sidebar.routes.home'), icon: Home },
1088
- {
1089
- path: '/dashboard',
1090
- label: t('templates.sidebar.routes.dashboard'),
1091
- icon: Users,
1092
- },
1093
- {
1094
- path: '/settings',
1095
- label: t('templates.sidebar.routes.settings'),
1096
- icon: Settings,
1097
- },
1098
- ]}
1099
- />
1100
- <div
1101
- className="absolute inset-y-0 right-0 p-8 flex items-center justify-center transition-all duration-300"
1102
- style={{ left: `${sidebarWidth}px` }}
1103
- >
1104
- <p className="text-muted-foreground text-center">
1105
- {t('templates.sidebar.defaultContent')}
1106
- </p>
1107
- </div>
1108
- </div>
1109
- </TabsContent>
1110
- </Tabs>
1111
- </CardContent>
1112
- </Card>
1113
- </section>
1114
-
1115
- <Separator className="my-8" />
1116
-
1117
- {/* ── v2.2.0 Components ──────────────────────────────────── */}
1118
- <Separator className="my-8" />
1119
-
1120
- <section>
1121
- <h3 className="mb-4">{t('templates.sections.enhancedComponents')}</h3>
1122
- <div className="space-y-6">
1123
- {/* Pagination com disabled */}
1124
- <Card>
1125
- <CardHeader>
1126
- <CardTitle>{t('templates.enhanced.pagination.title')}</CardTitle>
1127
- <CardDescription>
1128
- <Trans
1129
- i18nKey="templates.enhanced.pagination.description"
1130
- components={{ code: <code className="bg-muted px-1 rounded text-xs" /> }}
1131
- />
1132
- </CardDescription>
1133
- </CardHeader>
1134
- <CardContent className="space-y-4">
1135
- <p className="text-sm text-muted-foreground">
1136
- {t('templates.enhanced.pagination.pageOfTotal', {
1137
- current: currentPage,
1138
- total: totalPages,
1139
- })}
1140
- </p>
1141
- <Pagination>
1142
- <PaginationContent>
1143
- <PaginationItem>
1144
- <PaginationPrevious
1145
- href="#"
1146
- onClick={e => {
1147
- e.preventDefault();
1148
- prev();
1149
- }}
1150
- disabled={!canGoPrev}
1151
- />
1152
- </PaginationItem>
1153
- {items.map((item) =>
1154
- item.type === 'ellipsis' ? (
1155
- <PaginationItem key={item.key}>
1156
- <PaginationEllipsis />
1157
- </PaginationItem>
1158
- ) : (
1159
- <PaginationItem key={item.page}>
1160
- <PaginationLink
1161
- href="#"
1162
- isActive={item.page === currentPage}
1163
- onClick={e => {
1164
- e.preventDefault();
1165
- goTo(item.page);
1166
- }}
1167
- >
1168
- {item.page}
1169
- </PaginationLink>
1170
- </PaginationItem>
1171
- )
1172
- )}
1173
- <PaginationItem>
1174
- <PaginationNext
1175
- href="#"
1176
- onClick={e => {
1177
- e.preventDefault();
1178
- next();
1179
- }}
1180
- disabled={!canGoNext}
1181
- />
1182
- </PaginationItem>
1183
- </PaginationContent>
1184
- </Pagination>
1185
- </CardContent>
1186
- </Card>
1187
-
1188
- {/* Stepper com ARIA */}
1189
- <Card>
1190
- <CardHeader>
1191
- <CardTitle>{t('templates.enhanced.stepper.title')}</CardTitle>
1192
- <CardDescription>
1193
- <Trans
1194
- i18nKey="templates.enhanced.stepper.description"
1195
- components={{ code: <code className="bg-muted px-1 rounded text-xs" /> }}
1196
- />
1197
- </CardDescription>
1198
- </CardHeader>
1199
- <CardContent className="space-y-4">
1200
- <Stepper currentStep={currentStep}>
1201
- <Step
1202
- step={1}
1203
- label={t('templates.enhanced.stepper.step1Label')}
1204
- description={t('templates.enhanced.stepper.step1Description')}
1205
- />
1206
- <Step
1207
- step={2}
1208
- label={t('templates.enhanced.stepper.step2Label')}
1209
- description={t('templates.enhanced.stepper.step2Description')}
1210
- />
1211
- <Step
1212
- step={3}
1213
- label={t('templates.enhanced.stepper.step3Label')}
1214
- description={t('templates.enhanced.stepper.step3Description')}
1215
- />
1216
- </Stepper>
1217
- <div className="flex gap-2 pt-2">
1218
- <Button
1219
- variant="outline"
1220
- size="sm"
1221
- onClick={stepPrev}
1222
- disabled={isFirstStep}
1223
- >
1224
- {t('templates.enhanced.stepper.previous')}
1225
- </Button>
1226
- <Button size="sm" onClick={stepNext} disabled={isLastStep}>
1227
- {isLastStep
1228
- ? t('templates.enhanced.stepper.finish')
1229
- : t('templates.enhanced.stepper.next')}
1230
- </Button>
1231
- </div>
1232
- </CardContent>
1233
- </Card>
1234
-
1235
- {/* TreeView com ariaLabel */}
1236
- <Card>
1237
- <CardHeader>
1238
- <CardTitle>{t('templates.enhanced.treeView.title')}</CardTitle>
1239
- <CardDescription>
1240
- <Trans
1241
- i18nKey="templates.enhanced.treeView.description"
1242
- components={{ code: <code className="bg-muted px-1 rounded text-xs" /> }}
1243
- />
1244
- </CardDescription>
1245
- </CardHeader>
1246
- <CardContent>
1247
- <TreeView
1248
- data={treeData}
1249
- aria-label={t('templates.enhanced.treeView.ariaLabel')}
1250
- defaultExpanded={['components', 'ui']}
1251
- onNodeSelect={node =>
1252
- console.log(t('templates.enhanced.treeView.selectedConsoleLog'), node.label)
1253
- }
1254
- className="max-w-xs border border-border rounded-[var(--radius-lg)] p-2"
1255
- />
1256
- </CardContent>
1257
- </Card>
1258
-
1259
- {/* RichTextEditor sem Auto-save */}
1260
- <Card>
1261
- <CardHeader>
1262
- <CardTitle>{t('templates.enhanced.richText.title')}</CardTitle>
1263
- <CardDescription>
1264
- <Trans
1265
- i18nKey="templates.enhanced.richText.description"
1266
- components={{ code: <code className="bg-muted px-1 rounded text-xs" /> }}
1267
- />
1268
- </CardDescription>
1269
- </CardHeader>
1270
- <CardContent className="h-64">
1271
- <RichTextEditor
1272
- value={richText}
1273
- onChange={setRichText}
1274
- placeholder={t('templates.enhanced.richText.placeholder')}
1275
- showWordCount
1276
- showCharacterCount
1277
- allowSearch={false}
1278
- />
1279
- </CardContent>
1280
- </Card>
1281
- </div>
1282
- </section>
1283
-
1284
- {/* Footer Note */}
1285
- <Card className="mt-8">
1286
- <CardHeader>
1287
- <CardTitle>{t('templates.footer.title')}</CardTitle>
1288
- <CardDescription>{t('templates.footer.subtitle')}</CardDescription>
1289
- </CardHeader>
1290
- <CardContent className="space-y-4">
1291
- <p className="text-muted-foreground">
1292
- {t('templates.footer.descriptionPart1')}
1293
- <code className="bg-muted px-2 py-1 rounded-[var(--radius-sm)] [font-size:var(--text-small)]">
1294
- xertica-ui
1295
- </code>
1296
- {t('templates.footer.descriptionPart2')}
1297
- </p>
1298
- <Alert variant="info">
1299
- <AlertTitle>{t('templates.footer.tipTitle')}</AlertTitle>
1300
- <AlertDescription>
1301
- {t('templates.footer.tipDescriptionPart1')}
1302
- <code className="bg-muted px-1 rounded">styles/xertica/tokens.css</code>
1303
- {t('templates.footer.tipDescriptionPart2')}
1304
- </AlertDescription>
1305
- </Alert>
1306
- </CardContent>
1307
- </Card>
1308
- </div>
1309
- </div>
1310
- </ScrollArea>
1311
- </main>
1312
- </div>
1313
- );
1314
- }
1
+ import React, { useState } from 'react';
2
+ import {
3
+ Button,
4
+ Input,
5
+ Label,
6
+ Card,
7
+ CardHeader,
8
+ CardTitle,
9
+ CardDescription,
10
+ CardContent,
11
+ CardFooter,
12
+ Tabs,
13
+ TabsContent,
14
+ TabsList,
15
+ TabsTrigger,
16
+ Badge,
17
+ Alert,
18
+ AlertDescription,
19
+ AlertTitle,
20
+ Checkbox,
21
+ RadioGroup,
22
+ RadioGroupItem,
23
+ Switch,
24
+ Select,
25
+ SelectContent,
26
+ SelectItem,
27
+ SelectTrigger,
28
+ SelectValue,
29
+ Textarea,
30
+ Progress,
31
+ Separator,
32
+ Table,
33
+ TableBody,
34
+ TableCell,
35
+ TableHead,
36
+ TableHeader,
37
+ TableRow,
38
+ Slider,
39
+ ScrollArea,
40
+ Dialog,
41
+ DialogTrigger,
42
+ DialogContent,
43
+ DialogHeader,
44
+ DialogTitle,
45
+ DialogDescription,
46
+ DialogFooter,
47
+ AlertDialog,
48
+ AlertDialogTrigger,
49
+ AlertDialogContent,
50
+ AlertDialogHeader,
51
+ AlertDialogTitle,
52
+ AlertDialogDescription,
53
+ AlertDialogFooter,
54
+ AlertDialogAction,
55
+ AlertDialogCancel,
56
+ Pagination,
57
+ PaginationContent,
58
+ PaginationItem,
59
+ PaginationLink,
60
+ PaginationNext,
61
+ PaginationPrevious,
62
+ PaginationEllipsis,
63
+ Stepper,
64
+ Step,
65
+ TreeView,
66
+ RichTextEditor,
67
+ usePagination,
68
+ useStepper,
69
+ } from 'xertica-ui/ui';
70
+ import { Header, Sidebar } from 'xertica-ui/layout';
71
+ import { useLayout } from 'xertica-ui/hooks';
72
+ import { toast } from 'sonner';
73
+ import { Link } from 'react-router-dom';
74
+ import { Trans, useTranslation } from 'react-i18next';
75
+ import {
76
+ Settings,
77
+ User,
78
+ Mail,
79
+ Phone,
80
+ Calendar,
81
+ Search,
82
+ PanelLeft,
83
+ Home,
84
+ Users,
85
+ Plus,
86
+ Trash2,
87
+ Archive,
88
+ ArrowRightLeft,
89
+ FileEdit,
90
+ Clock,
91
+ Map,
92
+ } from 'lucide-react';
93
+
94
+ export function TemplateContent() {
95
+ const { t } = useTranslation();
96
+
97
+ // ── TreeView demo data (built inside the component so labels react to language switches) ──
98
+ const treeData = [
99
+ {
100
+ id: 'components',
101
+ label: t('templates.enhanced.treeView.nodes.components'),
102
+ children: [
103
+ {
104
+ id: 'ui',
105
+ label: t('templates.enhanced.treeView.nodes.ui'),
106
+ children: [
107
+ { id: 'button', label: t('templates.enhanced.treeView.nodes.button') },
108
+ { id: 'input', label: t('templates.enhanced.treeView.nodes.input') },
109
+ { id: 'pagination', label: t('templates.enhanced.treeView.nodes.pagination') },
110
+ ],
111
+ },
112
+ {
113
+ id: 'layout',
114
+ label: t('templates.enhanced.treeView.nodes.layout'),
115
+ children: [
116
+ { id: 'sidebar', label: t('templates.enhanced.treeView.nodes.sidebar') },
117
+ { id: 'header', label: t('templates.enhanced.treeView.nodes.header') },
118
+ ],
119
+ },
120
+ ],
121
+ },
122
+ {
123
+ id: 'hooks',
124
+ label: t('templates.enhanced.treeView.nodes.hooks'),
125
+ // Hook identifiers stay as code — not translated.
126
+ children: [
127
+ { id: 'use-pagination', label: 'usePagination' },
128
+ { id: 'use-stepper', label: 'useStepper' },
129
+ { id: 'use-tree-view', label: 'useTreeView' },
130
+ ],
131
+ },
132
+ ];
133
+ const { sidebarExpanded, sidebarWidth } = useLayout();
134
+ const [progress, setProgress] = useState(45);
135
+ const [sliderValue, setSliderValue] = useState([50]);
136
+ const [switchEnabled, setSwitchEnabled] = useState(false);
137
+ const [richText, setRichText] = useState('');
138
+
139
+ // Dialog demo inputs (controlled so they re-localise on language switch).
140
+ // Seeded lazily from `t(...)` so the initial value reflects the current
141
+ // language at first render; subsequent language switches don't overwrite
142
+ // user edits.
143
+ const [dialogName, setDialogName] = useState(() => t('templates.dialogs.nameDefaultValue'));
144
+ const [dialogUsername, setDialogUsername] = useState(() =>
145
+ t('templates.dialogs.usernameDefaultValue')
146
+ );
147
+
148
+ // ── Pagination demo ─────────────────────────────────────────────────────────
149
+ const { currentPage, totalPages, items, next, prev, goTo, canGoPrev, canGoNext } = usePagination({
150
+ totalItems: 120,
151
+ pageSize: 10,
152
+ });
153
+
154
+ // ── Stepper demo ────────────────────────────────────────────────────────────
155
+ const {
156
+ currentStep,
157
+ next: stepNext,
158
+ prev: stepPrev,
159
+ isFirstStep,
160
+ isLastStep,
161
+ } = useStepper({ totalSteps: 3 });
162
+
163
+ const handleFormSubmit = (e: React.FormEvent) => {
164
+ e.preventDefault();
165
+ toast.success(t('templates.formSubmitSuccess'));
166
+ };
167
+
168
+ return (
169
+ <div
170
+ style={{
171
+ paddingLeft: sidebarExpanded ? `${sidebarWidth}px` : '80px',
172
+ }}
173
+ className="flex-1 flex flex-col overflow-hidden transition-all duration-300"
174
+ >
175
+ <Header
176
+ showThemeToggle={true}
177
+ showLanguageSelector={true}
178
+ breadcrumbs={[
179
+ { label: t('nav.designSystem'), href: '/home' },
180
+ { label: t('templates.breadcrumb') },
181
+ ]}
182
+ renderLink={(href: string, props: any) => <Link to={href} {...props} />}
183
+ />
184
+
185
+ <main className="flex-1 overflow-hidden bg-muted">
186
+ <ScrollArea className="h-full">
187
+ <div className="p-5 sm:p-4 md:p-6">
188
+ <div className="max-w-6xl mx-auto space-y-8">
189
+ <div className="space-y-2">
190
+ <h2>{t('templates.title')}</h2>
191
+ <p className="text-muted-foreground">{t('templates.subtitle')}</p>
192
+ </div>
193
+
194
+ {/* Alert Examples */}
195
+ <section>
196
+ <h3 className="mb-4">{t('templates.sections.alerts')}</h3>
197
+ <div className="grid gap-4 md:grid-cols-2">
198
+ <Alert variant="info">
199
+ <AlertTitle>{t('templates.alerts.infoTitle')}</AlertTitle>
200
+ <AlertDescription>{t('templates.alerts.infoDescription')}</AlertDescription>
201
+ </Alert>
202
+
203
+ <Alert variant="destructive">
204
+ <AlertTitle>{t('templates.alerts.errorTitle')}</AlertTitle>
205
+ <AlertDescription>{t('templates.alerts.errorDescription')}</AlertDescription>
206
+ </Alert>
207
+
208
+ <Alert variant="success">
209
+ <AlertTitle>{t('templates.alerts.successTitle')}</AlertTitle>
210
+ <AlertDescription>{t('templates.alerts.successDescription')}</AlertDescription>
211
+ </Alert>
212
+
213
+ <Alert variant="warning">
214
+ <AlertTitle>{t('templates.alerts.warningTitle')}</AlertTitle>
215
+ <AlertDescription>{t('templates.alerts.warningDescription')}</AlertDescription>
216
+ </Alert>
217
+ </div>
218
+ </section>
219
+
220
+ <Separator className="my-8" />
221
+
222
+ {/* Cards & Tabs */}
223
+ <section>
224
+ <h3 className="mb-4">{t('templates.sections.cardsAndTabs')}</h3>
225
+
226
+ <Tabs defaultValue="overview" className="w-full">
227
+ <TabsList className="grid w-full grid-cols-4">
228
+ <TabsTrigger value="overview">{t('templates.tabs.overview')}</TabsTrigger>
229
+ <TabsTrigger value="forms">{t('templates.tabs.forms')}</TabsTrigger>
230
+ <TabsTrigger value="data">{t('templates.tabs.data')}</TabsTrigger>
231
+ <TabsTrigger value="settings">{t('templates.tabs.settings')}</TabsTrigger>
232
+ </TabsList>
233
+
234
+ {/* Overview Tab */}
235
+ <TabsContent value="overview" className="space-y-4">
236
+ <div className="grid gap-4 md:grid-cols-3">
237
+ <Card>
238
+ <CardHeader>
239
+ <CardTitle>{t('stats.totalUsers')}</CardTitle>
240
+ <CardDescription>{t('stats.last30Days')}</CardDescription>
241
+ </CardHeader>
242
+ <CardContent>
243
+ <div className="text-foreground">
244
+ <span className="[font-size:var(--text-stats)] [font-weight:var(--font-weight-bold)]">
245
+ {t('templates.overview.totalUsersDemoValue')}
246
+ </span>
247
+ <Badge variant="default" className="ml-2">
248
+ +12%
249
+ </Badge>
250
+ </div>
251
+ </CardContent>
252
+ </Card>
253
+
254
+ <Card>
255
+ <CardHeader>
256
+ <CardTitle>{t('stats.totalRevenue')}</CardTitle>
257
+ <CardDescription>{t('stats.currentMonth')}</CardDescription>
258
+ </CardHeader>
259
+ <CardContent>
260
+ <div className="text-foreground">
261
+ <span className="[font-size:var(--text-stats)] [font-weight:var(--font-weight-bold)]">
262
+ {t('templates.overview.revenueDemoValue')}
263
+ </span>
264
+ <Badge variant="secondary" className="ml-2">
265
+ +8%
266
+ </Badge>
267
+ </div>
268
+ </CardContent>
269
+ </Card>
270
+
271
+ <Card>
272
+ <CardHeader>
273
+ <CardTitle>{t('stats.conversionRate')}</CardTitle>
274
+ <CardDescription>{t('stats.currentWeek')}</CardDescription>
275
+ </CardHeader>
276
+ <CardContent>
277
+ <div className="text-foreground">
278
+ <span className="[font-size:var(--text-stats)] [font-weight:var(--font-weight-bold)]">
279
+ {t('templates.overview.conversionRateDemoValue')}
280
+ </span>
281
+ <Badge variant="outline" className="ml-2">
282
+ -2%
283
+ </Badge>
284
+ </div>
285
+ </CardContent>
286
+ </Card>
287
+ </div>
288
+
289
+ <Card>
290
+ <CardHeader>
291
+ <CardTitle>{t('templates.overview.progressTitle')}</CardTitle>
292
+ <CardDescription>
293
+ {t('templates.overview.progressDescription')}
294
+ </CardDescription>
295
+ </CardHeader>
296
+ <CardContent className="space-y-6">
297
+ <div className="space-y-2">
298
+ <div className="flex items-center justify-between">
299
+ <Label>{t('templates.overview.projectProgress')}</Label>
300
+ <span className="[font-size:var(--text-small)] text-muted-foreground">
301
+ {progress}%
302
+ </span>
303
+ </div>
304
+ <Progress value={progress} className="w-full" />
305
+ <div className="flex gap-2">
306
+ <Button
307
+ size="sm"
308
+ onClick={() => setProgress(Math.max(0, progress - 10))}
309
+ >
310
+ -10%
311
+ </Button>
312
+ <Button
313
+ size="sm"
314
+ onClick={() => setProgress(Math.min(100, progress + 10))}
315
+ >
316
+ +10%
317
+ </Button>
318
+ </div>
319
+ </div>
320
+
321
+ <Separator />
322
+
323
+ <div className="space-y-2">
324
+ <div className="flex items-center justify-between">
325
+ <Label>{t('templates.overview.volume')}</Label>
326
+ <span className="[font-size:var(--text-small)] text-muted-foreground">
327
+ {sliderValue[0]}%
328
+ </span>
329
+ </div>
330
+ <Slider
331
+ value={sliderValue}
332
+ onValueChange={setSliderValue}
333
+ min={0}
334
+ max={100}
335
+ step={1}
336
+ className="w-full"
337
+ />
338
+ </div>
339
+ </CardContent>
340
+ </Card>
341
+ </TabsContent>
342
+
343
+ {/* Forms Tab */}
344
+ <TabsContent value="forms" className="space-y-4">
345
+ <Card>
346
+ <CardHeader>
347
+ <CardTitle>{t('templates.forms.registrationTitle')}</CardTitle>
348
+ <CardDescription>
349
+ {t('templates.forms.registrationDescription')}
350
+ </CardDescription>
351
+ </CardHeader>
352
+ <CardContent>
353
+ <form onSubmit={handleFormSubmit} className="space-y-4">
354
+ <div className="grid gap-4 md:grid-cols-2">
355
+ <div className="space-y-2">
356
+ <Label htmlFor="firstName">{t('templates.forms.firstName')}</Label>
357
+ <Input
358
+ id="firstName"
359
+ placeholder={t('templates.forms.firstNamePlaceholder')}
360
+ />
361
+ </div>
362
+ <div className="space-y-2">
363
+ <Label htmlFor="lastName">{t('templates.forms.lastName')}</Label>
364
+ <Input
365
+ id="lastName"
366
+ placeholder={t('templates.forms.lastNamePlaceholder')}
367
+ />
368
+ </div>
369
+ </div>
370
+
371
+ <div className="space-y-2">
372
+ <Label htmlFor="email">{t('templates.forms.email')}</Label>
373
+ <div className="relative">
374
+ <Mail className="absolute left-3 top-3 h-4 w-4 text-muted-foreground" />
375
+ <Input
376
+ id="email"
377
+ type="email"
378
+ placeholder={t('templates.forms.emailPlaceholder')}
379
+ className="pl-10"
380
+ />
381
+ </div>
382
+ </div>
383
+
384
+ <div className="space-y-2">
385
+ <Label htmlFor="phone">{t('templates.forms.phone')}</Label>
386
+ <div className="relative">
387
+ <Phone className="absolute left-3 top-3 h-4 w-4 text-muted-foreground" />
388
+ <Input
389
+ id="phone"
390
+ type="tel"
391
+ placeholder={t('templates.forms.phonePlaceholder')}
392
+ className="pl-10"
393
+ />
394
+ </div>
395
+ </div>
396
+
397
+ <div className="space-y-2">
398
+ <Label htmlFor="role">{t('templates.forms.role')}</Label>
399
+ <Select>
400
+ <SelectTrigger id="role">
401
+ <SelectValue placeholder={t('templates.forms.rolePlaceholder')} />
402
+ </SelectTrigger>
403
+ <SelectContent>
404
+ <SelectItem value="developer">
405
+ {t('templates.forms.roles.developer')}
406
+ </SelectItem>
407
+ <SelectItem value="designer">
408
+ {t('templates.forms.roles.designer')}
409
+ </SelectItem>
410
+ <SelectItem value="manager">
411
+ {t('templates.forms.roles.manager')}
412
+ </SelectItem>
413
+ <SelectItem value="analyst">
414
+ {t('templates.forms.roles.analyst')}
415
+ </SelectItem>
416
+ </SelectContent>
417
+ </Select>
418
+ </div>
419
+
420
+ <div className="space-y-2">
421
+ <Label htmlFor="bio">{t('templates.forms.bio')}</Label>
422
+ <Textarea
423
+ id="bio"
424
+ placeholder={t('templates.forms.bioPlaceholder')}
425
+ rows={4}
426
+ />
427
+ </div>
428
+
429
+ <Separator />
430
+
431
+ <div className="space-y-4">
432
+ <h4>{t('templates.forms.preferences')}</h4>
433
+
434
+ <div className="space-y-3">
435
+ <div className="flex items-center space-x-2">
436
+ <Checkbox id="newsletter" />
437
+ <Label htmlFor="newsletter" className="font-normal">
438
+ {t('templates.forms.newsletter')}
439
+ </Label>
440
+ </div>
441
+
442
+ <div className="flex items-center space-x-2">
443
+ <Checkbox id="notifications" />
444
+ <Label htmlFor="notifications" className="font-normal">
445
+ {t('templates.forms.pushNotifications')}
446
+ </Label>
447
+ </div>
448
+
449
+ <div className="flex items-center space-x-2">
450
+ <Checkbox id="updates" />
451
+ <Label htmlFor="updates" className="font-normal">
452
+ {t('templates.forms.featureUpdates')}
453
+ </Label>
454
+ </div>
455
+ </div>
456
+
457
+ <Separator />
458
+
459
+ <div className="space-y-3">
460
+ <Label>{t('templates.forms.accountType')}</Label>
461
+ <RadioGroup defaultValue="personal">
462
+ <div className="flex items-center space-x-2">
463
+ <RadioGroupItem value="personal" id="personal" />
464
+ <Label htmlFor="personal" className="font-normal">
465
+ {t('templates.forms.accountPersonal')}
466
+ </Label>
467
+ </div>
468
+ <div className="flex items-center space-x-2">
469
+ <RadioGroupItem value="business" id="business" />
470
+ <Label htmlFor="business" className="font-normal">
471
+ {t('templates.forms.accountBusiness')}
472
+ </Label>
473
+ </div>
474
+ <div className="flex items-center space-x-2">
475
+ <RadioGroupItem value="enterprise" id="enterprise" />
476
+ <Label htmlFor="enterprise" className="font-normal">
477
+ {t('templates.forms.accountEnterprise')}
478
+ </Label>
479
+ </div>
480
+ </RadioGroup>
481
+ </div>
482
+ </div>
483
+ </form>
484
+ </CardContent>
485
+ <CardFooter className="flex justify-between">
486
+ <Button variant="outline">{t('templates.forms.cancel')}</Button>
487
+ <Button onClick={handleFormSubmit}>
488
+ {t('templates.forms.createAccount')}
489
+ </Button>
490
+ </CardFooter>
491
+ </Card>
492
+ </TabsContent>
493
+
494
+ {/* Data Tab */}
495
+ <TabsContent value="data" className="space-y-4">
496
+ <Card>
497
+ <CardHeader>
498
+ <CardTitle>{t('templates.data.title')}</CardTitle>
499
+ <CardDescription>{t('templates.data.description')}</CardDescription>
500
+ </CardHeader>
501
+ <CardContent>
502
+ <div className="mb-4">
503
+ <div className="relative">
504
+ <Search className="absolute left-3 top-3 h-4 w-4 text-muted-foreground" />
505
+ <Input
506
+ placeholder={t('templates.data.searchPlaceholder')}
507
+ className="pl-10"
508
+ />
509
+ </div>
510
+ </div>
511
+
512
+ <div className="rounded-[var(--radius-lg)] border border-border overflow-hidden">
513
+ <Table>
514
+ <TableHeader>
515
+ <TableRow>
516
+ <TableHead>{t('templates.data.headers.name')}</TableHead>
517
+ <TableHead>{t('templates.data.headers.email')}</TableHead>
518
+ <TableHead>{t('templates.data.headers.role')}</TableHead>
519
+ <TableHead>{t('templates.data.headers.status')}</TableHead>
520
+ <TableHead className="text-right">
521
+ {t('templates.data.headers.actions')}
522
+ </TableHead>
523
+ </TableRow>
524
+ </TableHeader>
525
+ <TableBody>
526
+ <TableRow>
527
+ <TableCell>Ana Silva</TableCell>
528
+ <TableCell>{`ana.silva@${t('templates.data.demoEmailDomain')}`}</TableCell>
529
+ <TableCell>{t('templates.data.roles.developerFemale')}</TableCell>
530
+ <TableCell>
531
+ <Badge variant="default">
532
+ {t('templates.data.status.active')}
533
+ </Badge>
534
+ </TableCell>
535
+ <TableCell className="text-right">
536
+ <Button variant="ghost" size="sm">
537
+ {t('templates.data.edit')}
538
+ </Button>
539
+ </TableCell>
540
+ </TableRow>
541
+ <TableRow>
542
+ <TableCell>Bruno Costa</TableCell>
543
+ <TableCell>{`bruno.costa@${t('templates.data.demoEmailDomain')}`}</TableCell>
544
+ <TableCell>{t('templates.data.roles.designer')}</TableCell>
545
+ <TableCell>
546
+ <Badge variant="default">
547
+ {t('templates.data.status.active')}
548
+ </Badge>
549
+ </TableCell>
550
+ <TableCell className="text-right">
551
+ <Button variant="ghost" size="sm">
552
+ {t('templates.data.edit')}
553
+ </Button>
554
+ </TableCell>
555
+ </TableRow>
556
+ <TableRow>
557
+ <TableCell>Carla Oliveira</TableCell>
558
+ <TableCell>{`carla.oliveira@${t('templates.data.demoEmailDomain')}`}</TableCell>
559
+ <TableCell>{t('templates.data.roles.manager')}</TableCell>
560
+ <TableCell>
561
+ <Badge variant="secondary">
562
+ {t('templates.data.status.away')}
563
+ </Badge>
564
+ </TableCell>
565
+ <TableCell className="text-right">
566
+ <Button variant="ghost" size="sm">
567
+ {t('templates.data.edit')}
568
+ </Button>
569
+ </TableCell>
570
+ </TableRow>
571
+ <TableRow>
572
+ <TableCell>Diego Santos</TableCell>
573
+ <TableCell>{`diego.santos@${t('templates.data.demoEmailDomain')}`}</TableCell>
574
+ <TableCell>{t('templates.data.roles.analyst')}</TableCell>
575
+ <TableCell>
576
+ <Badge variant="outline">
577
+ {t('templates.data.status.inactive')}
578
+ </Badge>
579
+ </TableCell>
580
+ <TableCell className="text-right">
581
+ <Button variant="ghost" size="sm">
582
+ {t('templates.data.edit')}
583
+ </Button>
584
+ </TableCell>
585
+ </TableRow>
586
+ </TableBody>
587
+ </Table>
588
+ </div>
589
+ </CardContent>
590
+ <CardFooter className="flex justify-between items-center">
591
+ <p className="text-muted-foreground">
592
+ {t('templates.data.showing', { count: 4, total: 127 })}
593
+ </p>
594
+ <div className="flex gap-2">
595
+ <Button variant="outline" size="sm">
596
+ {t('templates.data.previous')}
597
+ </Button>
598
+ <Button variant="outline" size="sm">
599
+ {t('templates.data.next')}
600
+ </Button>
601
+ </div>
602
+ </CardFooter>
603
+ </Card>
604
+ </TabsContent>
605
+
606
+ {/* Settings Tab */}
607
+ <TabsContent value="settings" className="space-y-4">
608
+ <Card>
609
+ <CardHeader>
610
+ <CardTitle>{t('templates.settings.title')}</CardTitle>
611
+ <CardDescription>{t('templates.settings.description')}</CardDescription>
612
+ </CardHeader>
613
+ <CardContent className="space-y-6">
614
+ <div className="flex items-center justify-between">
615
+ <div className="space-y-1">
616
+ <Label>{t('templates.settings.darkMode')}</Label>
617
+ <p className="text-muted-foreground">
618
+ {t('templates.settings.darkModeDescription')}
619
+ </p>
620
+ </div>
621
+ <Switch checked={switchEnabled} onCheckedChange={setSwitchEnabled} />
622
+ </div>
623
+
624
+ <Separator />
625
+
626
+ <div className="flex items-center justify-between">
627
+ <div className="space-y-1">
628
+ <Label>{t('templates.settings.emailNotifications')}</Label>
629
+ <p className="text-muted-foreground">
630
+ {t('templates.settings.emailNotificationsDescription')}
631
+ </p>
632
+ </div>
633
+ <Switch defaultChecked />
634
+ </div>
635
+
636
+ <Separator />
637
+
638
+ <div className="flex items-center justify-between">
639
+ <div className="space-y-1">
640
+ <Label>{t('templates.settings.pushNotifications')}</Label>
641
+ <p className="text-muted-foreground">
642
+ {t('templates.settings.pushNotificationsDescription')}
643
+ </p>
644
+ </div>
645
+ <Switch />
646
+ </div>
647
+
648
+ <Separator />
649
+
650
+ <div className="space-y-3">
651
+ <Label>{t('templates.settings.language')}</Label>
652
+ <Select defaultValue="pt-br">
653
+ <SelectTrigger>
654
+ <SelectValue />
655
+ </SelectTrigger>
656
+ <SelectContent>
657
+ <SelectItem value="pt-br">
658
+ {t('templates.settings.languages.ptBR')}
659
+ </SelectItem>
660
+ <SelectItem value="en">
661
+ {t('templates.settings.languages.en')}
662
+ </SelectItem>
663
+ <SelectItem value="es">
664
+ {t('templates.settings.languages.es')}
665
+ </SelectItem>
666
+ </SelectContent>
667
+ </Select>
668
+ </div>
669
+
670
+ <Separator />
671
+
672
+ <div className="space-y-3">
673
+ <Label>{t('templates.settings.timezone')}</Label>
674
+ <Select defaultValue="america-sao-paulo">
675
+ <SelectTrigger>
676
+ <SelectValue />
677
+ </SelectTrigger>
678
+ <SelectContent>
679
+ <SelectItem value="america-sao-paulo">
680
+ {t('templates.settings.timezones.saoPaulo')}
681
+ </SelectItem>
682
+ <SelectItem value="america-new-york">
683
+ {t('templates.settings.timezones.newYork')}
684
+ </SelectItem>
685
+ <SelectItem value="europe-london">
686
+ {t('templates.settings.timezones.london')}
687
+ </SelectItem>
688
+ </SelectContent>
689
+ </Select>
690
+ </div>
691
+ </CardContent>
692
+ <CardFooter className="flex justify-between">
693
+ <Button variant="outline">{t('templates.settings.restoreDefaults')}</Button>
694
+ <Button>{t('templates.settings.saveChanges')}</Button>
695
+ </CardFooter>
696
+ </Card>
697
+ </TabsContent>
698
+ </Tabs>
699
+ </section>
700
+
701
+ <Separator className="my-8" />
702
+
703
+ {/* Button Variants */}
704
+ <section>
705
+ <h3 className="mb-4">{t('templates.sections.buttons')}</h3>
706
+ <Card>
707
+ <CardHeader>
708
+ <CardTitle>{t('templates.buttons.title')}</CardTitle>
709
+ <CardDescription>{t('templates.buttons.description')}</CardDescription>
710
+ </CardHeader>
711
+ <CardContent className="space-y-6">
712
+ <div className="space-y-3">
713
+ <Label>{t('templates.buttons.variants')}</Label>
714
+ <div className="flex flex-wrap gap-3">
715
+ <Button variant="default">
716
+ {t('templates.buttons.variantLabels.default')}
717
+ </Button>
718
+ <Button variant="secondary">
719
+ {t('templates.buttons.variantLabels.secondary')}
720
+ </Button>
721
+ <Button variant="outline">
722
+ {t('templates.buttons.variantLabels.outline')}
723
+ </Button>
724
+ <Button variant="ghost">
725
+ {t('templates.buttons.variantLabels.ghost')}
726
+ </Button>
727
+ <Button variant="link">{t('templates.buttons.variantLabels.link')}</Button>
728
+ <Button variant="destructive">
729
+ {t('templates.buttons.variantLabels.destructive')}
730
+ </Button>
731
+ </div>
732
+ </div>
733
+
734
+ <Separator />
735
+
736
+ <div className="space-y-3">
737
+ <Label>{t('templates.buttons.sizes')}</Label>
738
+ <div className="flex flex-wrap items-center gap-3">
739
+ <Button size="sm">{t('templates.buttons.sizeLabels.small')}</Button>
740
+ <Button size="default">{t('templates.buttons.sizeLabels.default')}</Button>
741
+ <Button size="lg">{t('templates.buttons.sizeLabels.large')}</Button>
742
+ <Button size="icon">
743
+ <Settings className="h-4 w-4" />
744
+ </Button>
745
+ </div>
746
+ </div>
747
+
748
+ <Separator />
749
+
750
+ <div className="space-y-3">
751
+ <Label>{t('templates.buttons.withIcons')}</Label>
752
+ <div className="flex flex-wrap gap-3">
753
+ <Button>
754
+ <User className="mr-2 h-4 w-4" />
755
+ {t('templates.buttons.profile')}
756
+ </Button>
757
+ <Button variant="secondary">
758
+ <Mail className="mr-2 h-4 w-4" />
759
+ {t('templates.buttons.messages')}
760
+ </Button>
761
+ <Button variant="outline">
762
+ <Calendar className="mr-2 h-4 w-4" />
763
+ {t('templates.buttons.schedule')}
764
+ </Button>
765
+ </div>
766
+ </div>
767
+
768
+ <Separator />
769
+
770
+ <div className="space-y-3">
771
+ <Label>{t('templates.buttons.states')}</Label>
772
+ <div className="flex flex-wrap gap-3">
773
+ <Button disabled>{t('templates.buttons.disabled')}</Button>
774
+ <Button variant="outline" disabled>
775
+ {t('templates.buttons.outlineDisabled')}
776
+ </Button>
777
+ </div>
778
+ </div>
779
+ </CardContent>
780
+ </Card>
781
+ </section>
782
+
783
+ <Separator className="my-8" />
784
+
785
+ {/* Badges */}
786
+ <section>
787
+ <h3 className="mb-4">{t('templates.sections.badges')}</h3>
788
+ <Card>
789
+ <CardHeader>
790
+ <CardTitle>{t('templates.badges.title')}</CardTitle>
791
+ <CardDescription>{t('templates.badges.description')}</CardDescription>
792
+ </CardHeader>
793
+ <CardContent>
794
+ <div className="flex flex-wrap gap-3">
795
+ <Badge variant="default">{t('templates.badges.labels.default')}</Badge>
796
+ <Badge variant="secondary">{t('templates.badges.labels.secondary')}</Badge>
797
+ <Badge variant="outline">{t('templates.badges.labels.outline')}</Badge>
798
+ <Badge variant="destructive">
799
+ {t('templates.badges.labels.destructive')}
800
+ </Badge>
801
+ <Badge className="bg-success text-success-foreground">
802
+ {t('templates.badges.labels.success')}
803
+ </Badge>
804
+ <Badge className="bg-warning text-warning-foreground">
805
+ {t('templates.badges.labels.warning')}
806
+ </Badge>
807
+ <Badge className="bg-info text-info-foreground">
808
+ {t('templates.badges.labels.info')}
809
+ </Badge>
810
+ </div>
811
+ </CardContent>
812
+ </Card>
813
+ </section>
814
+
815
+ <Separator className="my-8" />
816
+
817
+ {/* Dialogs */}
818
+ <section>
819
+ <h3 className="mb-4">{t('templates.sections.dialogs')}</h3>
820
+ <div className="grid gap-4 md:grid-cols-2">
821
+ <Card>
822
+ <CardHeader>
823
+ <CardTitle>{t('templates.dialogs.dialogTitle')}</CardTitle>
824
+ <CardDescription>{t('templates.dialogs.dialogDescription')}</CardDescription>
825
+ </CardHeader>
826
+ <CardContent className="flex justify-center py-6">
827
+ <Dialog>
828
+ <DialogTrigger asChild>
829
+ <Button variant="outline">{t('templates.dialogs.editProfile')}</Button>
830
+ </DialogTrigger>
831
+ <DialogContent className="sm:max-w-[425px]">
832
+ <DialogHeader>
833
+ <DialogTitle>{t('templates.dialogs.editProfile')}</DialogTitle>
834
+ <DialogDescription>
835
+ {t('templates.dialogs.editProfileDescription')}
836
+ </DialogDescription>
837
+ </DialogHeader>
838
+ <div className="grid gap-4 py-4">
839
+ <div className="grid grid-cols-4 items-center gap-4">
840
+ <Label htmlFor="name" className="text-right">
841
+ {t('templates.dialogs.name')}
842
+ </Label>
843
+ <Input
844
+ id="name"
845
+ value={dialogName}
846
+ onChange={e => setDialogName(e.target.value)}
847
+ className="col-span-3"
848
+ />
849
+ </div>
850
+ <div className="grid grid-cols-4 items-center gap-4">
851
+ <Label htmlFor="username" className="text-right">
852
+ {t('templates.dialogs.username')}
853
+ </Label>
854
+ <Input
855
+ id="username"
856
+ value={dialogUsername}
857
+ onChange={e => setDialogUsername(e.target.value)}
858
+ className="col-span-3"
859
+ />
860
+ </div>
861
+ </div>
862
+ <DialogFooter>
863
+ <Button type="submit">{t('templates.dialogs.update')}</Button>
864
+ </DialogFooter>
865
+ </DialogContent>
866
+ </Dialog>
867
+ </CardContent>
868
+ </Card>
869
+
870
+ <Card>
871
+ <CardHeader>
872
+ <CardTitle>{t('templates.dialogs.alertDialogTitle')}</CardTitle>
873
+ <CardDescription>
874
+ {t('templates.dialogs.alertDialogDescription')}
875
+ </CardDescription>
876
+ </CardHeader>
877
+ <CardContent className="flex justify-center py-6">
878
+ <AlertDialog>
879
+ <AlertDialogTrigger asChild>
880
+ <Button variant="destructive">
881
+ {t('templates.dialogs.deleteAccount')}
882
+ </Button>
883
+ </AlertDialogTrigger>
884
+ <AlertDialogContent className="sm:max-w-[425px]">
885
+ <AlertDialogHeader>
886
+ <AlertDialogTitle>
887
+ {t('templates.dialogs.areYouSure')}
888
+ </AlertDialogTitle>
889
+ <AlertDialogDescription>
890
+ {t('templates.dialogs.deleteWarning')}
891
+ </AlertDialogDescription>
892
+ </AlertDialogHeader>
893
+ <AlertDialogFooter>
894
+ <AlertDialogCancel>{t('templates.dialogs.cancel')}</AlertDialogCancel>
895
+ <AlertDialogAction className="bg-destructive text-destructive-foreground hover:bg-destructive/90">
896
+ {t('templates.dialogs.continue')}
897
+ </AlertDialogAction>
898
+ </AlertDialogFooter>
899
+ </AlertDialogContent>
900
+ </AlertDialog>
901
+ </CardContent>
902
+ </Card>
903
+ </div>
904
+ </section>
905
+
906
+ <Separator className="my-8" />
907
+
908
+ {/* Sidebar Variations */}
909
+ <section>
910
+ <h3 className="mb-4">{t('templates.sections.sidebarVariations')}</h3>
911
+ <Card>
912
+ <CardHeader>
913
+ <CardTitle>{t('templates.sidebar.title')}</CardTitle>
914
+ <CardDescription>{t('templates.sidebar.description')}</CardDescription>
915
+ </CardHeader>
916
+ <CardContent>
917
+ <Tabs defaultValue="assistant" className="w-full">
918
+ <TabsList className="mb-4">
919
+ <TabsTrigger value="assistant">
920
+ {t('templates.sidebar.assistantMode')}
921
+ </TabsTrigger>
922
+ <TabsTrigger value="default">
923
+ {t('templates.sidebar.defaultMode')}
924
+ </TabsTrigger>
925
+ </TabsList>
926
+
927
+ <TabsContent value="assistant">
928
+ <div
929
+ className="relative h-[600px] border rounded-[var(--radius-lg)] bg-muted/20 overflow-hidden"
930
+ style={{ transform: 'translateZ(0)' }}
931
+ >
932
+ <Sidebar
933
+ expanded={true}
934
+ width={sidebarWidth}
935
+ onToggle={() => {}}
936
+ user={{ email: 'admin@xertica.com' }}
937
+ onLogout={() => toast(t('templates.sidebar.logoutToast'))}
938
+ location={{ pathname: '/assistant/current' }}
939
+ navigate={() => {}}
940
+ variant="assistant"
941
+ search={{
942
+ show: true,
943
+ placeholder: t('templates.sidebar.searchTopicsPlaceholder'),
944
+ }}
945
+ fixedArea={{
946
+ show: true,
947
+ content: (
948
+ <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]">
949
+ <Plus className="w-4 h-4 mr-2" />
950
+ {t('templates.sidebar.newConversation')}
951
+ </Button>
952
+ ),
953
+ }}
954
+ navigationGroups={[
955
+ {
956
+ id: 'recent',
957
+ label: t('templates.sidebar.recent'),
958
+ icon: Clock,
959
+ items: [
960
+ {
961
+ path: '/assistant/refatoracao',
962
+ label: t('templates.sidebar.items.sidebarRefactor'),
963
+ icon: PanelLeft,
964
+ description: t(
965
+ 'templates.sidebar.items.sidebarRefactorDescription'
966
+ ),
967
+ actions: [
968
+ {
969
+ label: t('templates.sidebar.actions.rename'),
970
+ icon: FileEdit,
971
+ onClick: () =>
972
+ toast(t('templates.sidebar.actions.renameToast')),
973
+ },
974
+ {
975
+ label: t('templates.sidebar.actions.move'),
976
+ icon: ArrowRightLeft,
977
+ children: [
978
+ {
979
+ label: t('templates.sidebar.actions.moveActive'),
980
+ onClick: () =>
981
+ toast(
982
+ t('templates.sidebar.actions.moveActiveToast')
983
+ ),
984
+ },
985
+ {
986
+ label: t('templates.sidebar.actions.moveMonitoring'),
987
+ onClick: () =>
988
+ toast(
989
+ t('templates.sidebar.actions.moveMonitoringToast')
990
+ ),
991
+ },
992
+ {
993
+ label: t('templates.sidebar.actions.moveArchive'),
994
+ onClick: () =>
995
+ toast(
996
+ t('templates.sidebar.actions.moveArchiveToast')
997
+ ),
998
+ },
999
+ ],
1000
+ },
1001
+ {
1002
+ label: t('templates.sidebar.actions.clear'),
1003
+ icon: Trash2,
1004
+ onClick: () =>
1005
+ toast(t('templates.sidebar.actions.clearToast')),
1006
+ variant: 'destructive',
1007
+ },
1008
+ ],
1009
+ },
1010
+ ],
1011
+ },
1012
+ {
1013
+ id: 'projects',
1014
+ label: t('templates.sidebar.constructionMonitoring'),
1015
+ icon: Map,
1016
+ actions: [
1017
+ {
1018
+ label: t('templates.sidebar.actions.newCategory'),
1019
+ icon: Plus,
1020
+ onClick: () =>
1021
+ toast(t('templates.sidebar.actions.newCategoryToast')),
1022
+ },
1023
+ {
1024
+ label: t('templates.sidebar.actions.archiveGroup'),
1025
+ icon: Archive,
1026
+ onClick: () =>
1027
+ toast(t('templates.sidebar.actions.archiveGroupToast')),
1028
+ },
1029
+ ],
1030
+ items: [
1031
+ {
1032
+ path: '/assistant/br163',
1033
+ label: t('templates.sidebar.items.br163Restoration'),
1034
+ icon: () => (
1035
+ <div className="w-2 h-2 rounded-full bg-yellow-500" />
1036
+ ),
1037
+ description: (
1038
+ <div className="space-y-1.5 min-w-[160px]">
1039
+ <Progress
1040
+ value={67}
1041
+ className="h-1.5 bg-sidebar-foreground/10"
1042
+ />
1043
+ <div className="flex justify-between items-center text-[10px] text-sidebar-foreground/60">
1044
+ <span>{t('templates.sidebar.items.br163Location')}</span>
1045
+ <span>67%</span>
1046
+ </div>
1047
+ </div>
1048
+ ),
1049
+ },
1050
+ ],
1051
+ },
1052
+ ]}
1053
+ />
1054
+ <div
1055
+ className="absolute inset-y-0 right-0 p-8 flex items-center justify-center transition-all duration-300"
1056
+ style={{ left: `${sidebarWidth}px` }}
1057
+ >
1058
+ <p className="text-muted-foreground text-center">
1059
+ {t('templates.sidebar.assistantContent')}
1060
+ </p>
1061
+ </div>
1062
+ </div>
1063
+ </TabsContent>
1064
+
1065
+ <TabsContent value="default">
1066
+ <div
1067
+ className="relative h-[600px] border rounded-[var(--radius-lg)] bg-muted/20 overflow-hidden"
1068
+ style={{ transform: 'translateZ(0)' }}
1069
+ >
1070
+ <Sidebar
1071
+ expanded={true}
1072
+ width={sidebarWidth}
1073
+ onToggle={() => {}}
1074
+ user={{
1075
+ name: 'Ariel Santos',
1076
+ email: 'admin@xertica.com',
1077
+ avatar: 'https://github.com/shadcn.png',
1078
+ }}
1079
+ onLogout={() => toast(t('templates.sidebar.logoutToast'))}
1080
+ onSettingsClick={() =>
1081
+ toast(t('templates.sidebar.settingsClickedToast'))
1082
+ }
1083
+ location={{ pathname: '/home' }}
1084
+ navigate={() => {}}
1085
+ variant="default"
1086
+ routes={[
1087
+ { path: '/home', label: t('templates.sidebar.routes.home'), icon: Home },
1088
+ {
1089
+ path: '/dashboard',
1090
+ label: t('templates.sidebar.routes.dashboard'),
1091
+ icon: Users,
1092
+ },
1093
+ {
1094
+ path: '/settings',
1095
+ label: t('templates.sidebar.routes.settings'),
1096
+ icon: Settings,
1097
+ },
1098
+ ]}
1099
+ />
1100
+ <div
1101
+ className="absolute inset-y-0 right-0 p-8 flex items-center justify-center transition-all duration-300"
1102
+ style={{ left: `${sidebarWidth}px` }}
1103
+ >
1104
+ <p className="text-muted-foreground text-center">
1105
+ {t('templates.sidebar.defaultContent')}
1106
+ </p>
1107
+ </div>
1108
+ </div>
1109
+ </TabsContent>
1110
+ </Tabs>
1111
+ </CardContent>
1112
+ </Card>
1113
+ </section>
1114
+
1115
+ <Separator className="my-8" />
1116
+
1117
+ {/* ── v2.2.1 Components ──────────────────────────────────── */}
1118
+ <Separator className="my-8" />
1119
+
1120
+ <section>
1121
+ <h3 className="mb-4">{t('templates.sections.enhancedComponents')}</h3>
1122
+ <div className="space-y-6">
1123
+ {/* Pagination com disabled */}
1124
+ <Card>
1125
+ <CardHeader>
1126
+ <CardTitle>{t('templates.enhanced.pagination.title')}</CardTitle>
1127
+ <CardDescription>
1128
+ <Trans
1129
+ i18nKey="templates.enhanced.pagination.description"
1130
+ components={{ code: <code className="bg-muted px-1 rounded text-xs" /> }}
1131
+ />
1132
+ </CardDescription>
1133
+ </CardHeader>
1134
+ <CardContent className="space-y-4">
1135
+ <p className="text-sm text-muted-foreground">
1136
+ {t('templates.enhanced.pagination.pageOfTotal', {
1137
+ current: currentPage,
1138
+ total: totalPages,
1139
+ })}
1140
+ </p>
1141
+ <Pagination>
1142
+ <PaginationContent>
1143
+ <PaginationItem>
1144
+ <PaginationPrevious
1145
+ href="#"
1146
+ onClick={e => {
1147
+ e.preventDefault();
1148
+ prev();
1149
+ }}
1150
+ disabled={!canGoPrev}
1151
+ />
1152
+ </PaginationItem>
1153
+ {items.map((item) =>
1154
+ item.type === 'ellipsis' ? (
1155
+ <PaginationItem key={item.key}>
1156
+ <PaginationEllipsis />
1157
+ </PaginationItem>
1158
+ ) : (
1159
+ <PaginationItem key={item.page}>
1160
+ <PaginationLink
1161
+ href="#"
1162
+ isActive={item.page === currentPage}
1163
+ onClick={e => {
1164
+ e.preventDefault();
1165
+ goTo(item.page);
1166
+ }}
1167
+ >
1168
+ {item.page}
1169
+ </PaginationLink>
1170
+ </PaginationItem>
1171
+ )
1172
+ )}
1173
+ <PaginationItem>
1174
+ <PaginationNext
1175
+ href="#"
1176
+ onClick={e => {
1177
+ e.preventDefault();
1178
+ next();
1179
+ }}
1180
+ disabled={!canGoNext}
1181
+ />
1182
+ </PaginationItem>
1183
+ </PaginationContent>
1184
+ </Pagination>
1185
+ </CardContent>
1186
+ </Card>
1187
+
1188
+ {/* Stepper com ARIA */}
1189
+ <Card>
1190
+ <CardHeader>
1191
+ <CardTitle>{t('templates.enhanced.stepper.title')}</CardTitle>
1192
+ <CardDescription>
1193
+ <Trans
1194
+ i18nKey="templates.enhanced.stepper.description"
1195
+ components={{ code: <code className="bg-muted px-1 rounded text-xs" /> }}
1196
+ />
1197
+ </CardDescription>
1198
+ </CardHeader>
1199
+ <CardContent className="space-y-4">
1200
+ <Stepper currentStep={currentStep}>
1201
+ <Step
1202
+ step={1}
1203
+ label={t('templates.enhanced.stepper.step1Label')}
1204
+ description={t('templates.enhanced.stepper.step1Description')}
1205
+ />
1206
+ <Step
1207
+ step={2}
1208
+ label={t('templates.enhanced.stepper.step2Label')}
1209
+ description={t('templates.enhanced.stepper.step2Description')}
1210
+ />
1211
+ <Step
1212
+ step={3}
1213
+ label={t('templates.enhanced.stepper.step3Label')}
1214
+ description={t('templates.enhanced.stepper.step3Description')}
1215
+ />
1216
+ </Stepper>
1217
+ <div className="flex gap-2 pt-2">
1218
+ <Button
1219
+ variant="outline"
1220
+ size="sm"
1221
+ onClick={stepPrev}
1222
+ disabled={isFirstStep}
1223
+ >
1224
+ {t('templates.enhanced.stepper.previous')}
1225
+ </Button>
1226
+ <Button size="sm" onClick={stepNext} disabled={isLastStep}>
1227
+ {isLastStep
1228
+ ? t('templates.enhanced.stepper.finish')
1229
+ : t('templates.enhanced.stepper.next')}
1230
+ </Button>
1231
+ </div>
1232
+ </CardContent>
1233
+ </Card>
1234
+
1235
+ {/* TreeView com ariaLabel */}
1236
+ <Card>
1237
+ <CardHeader>
1238
+ <CardTitle>{t('templates.enhanced.treeView.title')}</CardTitle>
1239
+ <CardDescription>
1240
+ <Trans
1241
+ i18nKey="templates.enhanced.treeView.description"
1242
+ components={{ code: <code className="bg-muted px-1 rounded text-xs" /> }}
1243
+ />
1244
+ </CardDescription>
1245
+ </CardHeader>
1246
+ <CardContent>
1247
+ <TreeView
1248
+ data={treeData}
1249
+ aria-label={t('templates.enhanced.treeView.ariaLabel')}
1250
+ defaultExpanded={['components', 'ui']}
1251
+ onNodeSelect={node =>
1252
+ console.log(t('templates.enhanced.treeView.selectedConsoleLog'), node.label)
1253
+ }
1254
+ className="max-w-xs border border-border rounded-[var(--radius-lg)] p-2"
1255
+ />
1256
+ </CardContent>
1257
+ </Card>
1258
+
1259
+ {/* RichTextEditor sem Auto-save */}
1260
+ <Card>
1261
+ <CardHeader>
1262
+ <CardTitle>{t('templates.enhanced.richText.title')}</CardTitle>
1263
+ <CardDescription>
1264
+ <Trans
1265
+ i18nKey="templates.enhanced.richText.description"
1266
+ components={{ code: <code className="bg-muted px-1 rounded text-xs" /> }}
1267
+ />
1268
+ </CardDescription>
1269
+ </CardHeader>
1270
+ <CardContent className="h-64">
1271
+ <RichTextEditor
1272
+ value={richText}
1273
+ onChange={setRichText}
1274
+ placeholder={t('templates.enhanced.richText.placeholder')}
1275
+ showWordCount
1276
+ showCharacterCount
1277
+ allowSearch={false}
1278
+ />
1279
+ </CardContent>
1280
+ </Card>
1281
+ </div>
1282
+ </section>
1283
+
1284
+ {/* Footer Note */}
1285
+ <Card className="mt-8">
1286
+ <CardHeader>
1287
+ <CardTitle>{t('templates.footer.title')}</CardTitle>
1288
+ <CardDescription>{t('templates.footer.subtitle')}</CardDescription>
1289
+ </CardHeader>
1290
+ <CardContent className="space-y-4">
1291
+ <p className="text-muted-foreground">
1292
+ {t('templates.footer.descriptionPart1')}
1293
+ <code className="bg-muted px-2 py-1 rounded-[var(--radius-sm)] [font-size:var(--text-small)]">
1294
+ xertica-ui
1295
+ </code>
1296
+ {t('templates.footer.descriptionPart2')}
1297
+ </p>
1298
+ <Alert variant="info">
1299
+ <AlertTitle>{t('templates.footer.tipTitle')}</AlertTitle>
1300
+ <AlertDescription>
1301
+ {t('templates.footer.tipDescriptionPart1')}
1302
+ <code className="bg-muted px-1 rounded">styles/xertica/tokens.css</code>
1303
+ {t('templates.footer.tipDescriptionPart2')}
1304
+ </AlertDescription>
1305
+ </Alert>
1306
+ </CardContent>
1307
+ </Card>
1308
+ </div>
1309
+ </div>
1310
+ </ScrollArea>
1311
+ </main>
1312
+ </div>
1313
+ );
1314
+ }