xertica-ui 2.1.2 → 2.1.3

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 (402) hide show
  1. package/CHANGELOG.md +31 -0
  2. package/README.md +1 -1
  3. package/assets/xertica-logo.svg +37 -37
  4. package/assets/xertica-x-logo.svg +20 -20
  5. package/bin/cli.ts +1 -1
  6. package/bin/generate-tokens.ts +13 -7
  7. package/components/assistant/index.ts +6 -6
  8. package/components/assistant/xertica-assistant/index.ts +2 -0
  9. package/components/assistant/xertica-assistant/use-assistant.ts +564 -0
  10. package/components/assistant/xertica-assistant/xertica-assistant.stories.tsx +200 -0
  11. package/components/assistant/xertica-assistant/xertica-assistant.tsx +183 -474
  12. package/components/blocks/card-patterns/ActivityCard.tsx +72 -72
  13. package/components/blocks/card-patterns/FeatureCard.tsx +100 -100
  14. package/components/blocks/card-patterns/NotificationCard.tsx +127 -127
  15. package/components/blocks/card-patterns/ProfileCard.tsx +84 -84
  16. package/components/blocks/card-patterns/ProjectCard.tsx +89 -89
  17. package/components/blocks/card-patterns/QuickActionCard.tsx +62 -62
  18. package/components/blocks/card-patterns/card-patterns.stories.tsx +445 -445
  19. package/components/blocks/card-patterns/index.ts +17 -17
  20. package/components/blocks/index.ts +1 -1
  21. package/components/brand/index.ts +6 -6
  22. package/components/brand/xertica-provider/XerticaProvider.tsx +48 -48
  23. package/components/brand/xertica-provider/xertica-provider.mdx +61 -61
  24. package/components/brand/xertica-provider/xertica-provider.test.tsx +52 -52
  25. package/components/examples/MapExamples.tsx +282 -282
  26. package/components/examples/SimpleFilterableMap.tsx +191 -191
  27. package/components/examples/index.ts +51 -51
  28. package/components/figma/ImageWithFallback.tsx +27 -27
  29. package/components/hooks/index.ts +7 -7
  30. package/components/index.ts +5 -5
  31. package/components/layout/header/header.test.tsx +8 -8
  32. package/components/layout/header/header.tsx +4 -4
  33. package/components/layout/index.ts +2 -2
  34. package/components/layout/sidebar/index.ts +2 -0
  35. package/components/layout/sidebar/sidebar.mdx +1 -1
  36. package/components/layout/sidebar/sidebar.stories.tsx +160 -8
  37. package/components/layout/sidebar/sidebar.test.tsx +11 -11
  38. package/components/layout/sidebar/sidebar.tsx +610 -471
  39. package/components/layout/sidebar/use-sidebar.ts +113 -0
  40. package/components/media/FloatingMediaWrapper.tsx +11 -11
  41. package/components/media/audio-player/AudioPlayer.tsx +22 -22
  42. package/components/media/index.ts +3 -3
  43. package/components/pages/home-content/HomeContent.tsx +7 -7
  44. package/components/pages/home-content/home-content.mdx +62 -62
  45. package/components/pages/home-page/HomePage.stories.tsx +39 -39
  46. package/components/pages/home-page/HomePage.tsx +1 -1
  47. package/components/pages/home-page/home-page.mdx +53 -53
  48. package/components/pages/index.ts +8 -8
  49. package/components/pages/template-content/TemplateContent.tsx +5 -5
  50. package/components/pages/template-content/template-content.mdx +61 -61
  51. package/components/pages/template-page/TemplatePage.stories.tsx +39 -39
  52. package/components/pages/template-page/TemplatePage.tsx +5 -5
  53. package/components/pages/template-page/template-page.mdx +53 -53
  54. package/components/public-api-smoke.test.tsx +52 -52
  55. package/components/shared/assistant-utils.ts +43 -43
  56. package/components/shared/layout-constants.ts +1 -1
  57. package/components/ui/accordion/accordion.mdx +8 -8
  58. package/components/ui/accordion/accordion.stories.tsx +53 -53
  59. package/components/ui/alert/alert.mdx +8 -8
  60. package/components/ui/alert-dialog/alert-dialog.mdx +8 -8
  61. package/components/ui/aspect-ratio/aspect-ratio.mdx +8 -8
  62. package/components/ui/assistant-chart/assistant-chart.mdx +8 -8
  63. package/components/ui/avatar/avatar.mdx +8 -8
  64. package/components/ui/badge/badge.mdx +8 -8
  65. package/components/ui/badge/badge.tsx +9 -9
  66. package/components/ui/breadcrumb/breadcrumb.mdx +8 -8
  67. package/components/ui/button/button.mdx +8 -8
  68. package/components/ui/calendar/calendar.mdx +8 -8
  69. package/components/ui/calendar/calendar.tsx +258 -258
  70. package/components/ui/card/card.mdx +8 -8
  71. package/components/ui/card/card.stories.tsx +245 -245
  72. package/components/ui/carousel/carousel.mdx +8 -8
  73. package/components/ui/chart/chart.mdx +8 -8
  74. package/components/ui/chart/chart.stories.tsx +1303 -344
  75. package/components/ui/chart/chart.test.tsx +154 -154
  76. package/components/ui/chart/chart.tsx +2367 -1494
  77. package/components/ui/checkbox/checkbox.mdx +8 -8
  78. package/components/ui/checkbox/checkbox.stories.tsx +20 -20
  79. package/components/ui/collapsible/collapsible.mdx +8 -8
  80. package/components/ui/command/command.mdx +8 -8
  81. package/components/ui/context-menu/context-menu.mdx +8 -8
  82. package/components/ui/dialog/dialog.mdx +8 -8
  83. package/components/ui/drawer/drawer.mdx +8 -8
  84. package/components/ui/dropdown-menu/dropdown-menu.mdx +8 -8
  85. package/components/ui/empty/empty.mdx +8 -8
  86. package/components/ui/file-upload/file-upload.mdx +8 -8
  87. package/components/ui/file-upload/file-upload.stories.tsx +100 -0
  88. package/components/ui/file-upload/file-upload.tsx +14 -74
  89. package/components/ui/file-upload/index.ts +1 -0
  90. package/components/ui/file-upload/use-file-upload.ts +181 -0
  91. package/components/ui/google-maps-loader/google-maps-loader.tsx +2 -2
  92. package/components/ui/hover-card/hover-card.mdx +8 -8
  93. package/components/ui/input/input.mdx +8 -8
  94. package/components/ui/input-otp/input-otp.mdx +8 -8
  95. package/components/ui/input-otp/input-otp.stories.tsx +6 -6
  96. package/components/ui/label/label.mdx +8 -8
  97. package/components/ui/map/map.mdx +8 -8
  98. package/components/ui/map/map.stories.tsx +51 -51
  99. package/components/ui/map/map.tsx +2 -2
  100. package/components/ui/menubar/menubar.mdx +8 -8
  101. package/components/ui/navigation-menu/navigation-menu.mdx +8 -8
  102. package/components/ui/notification-badge/notification-badge.mdx +8 -8
  103. package/components/ui/pagination/index.ts +2 -0
  104. package/components/ui/pagination/pagination.mdx +8 -8
  105. package/components/ui/pagination/pagination.stories.tsx +94 -0
  106. package/components/ui/pagination/use-pagination.ts +194 -0
  107. package/components/ui/popover/popover.mdx +8 -8
  108. package/components/ui/progress/progress.mdx +8 -8
  109. package/components/ui/progress/progress.tsx +68 -68
  110. package/components/ui/radio-group/radio-group.mdx +8 -8
  111. package/components/ui/rating/rating.mdx +8 -8
  112. package/components/ui/resizable/resizable.mdx +8 -8
  113. package/components/ui/rich-text-editor/index.ts +2 -0
  114. package/components/ui/rich-text-editor/rich-text-editor.stories.tsx +129 -1
  115. package/components/ui/rich-text-editor/rich-text-editor.tsx +86 -305
  116. package/components/ui/rich-text-editor/use-rich-text-editor.ts +439 -0
  117. package/components/ui/route-map/route-map.mdx +8 -8
  118. package/components/ui/route-map/route-map.stories.tsx +54 -54
  119. package/components/ui/route-map/route-map.tsx +2 -2
  120. package/components/ui/scroll-area/scroll-area.mdx +8 -8
  121. package/components/ui/search/search.mdx +8 -8
  122. package/components/ui/select/select.mdx +8 -8
  123. package/components/ui/select/select.stories.tsx +9 -9
  124. package/components/ui/separator/separator.mdx +8 -8
  125. package/components/ui/sheet/sheet.mdx +8 -8
  126. package/components/ui/sheet/sheet.stories.tsx +95 -95
  127. package/components/ui/simple-map/simple-map.mdx +8 -8
  128. package/components/ui/simple-map/simple-map.stories.tsx +48 -48
  129. package/components/ui/skeleton/skeleton.mdx +8 -8
  130. package/components/ui/slider/slider.mdx +8 -8
  131. package/components/ui/sonner/sonner.mdx +8 -8
  132. package/components/ui/stats-card/stats-card.mdx +8 -8
  133. package/components/ui/stepper/index.ts +3 -1
  134. package/components/ui/stepper/stepper.mdx +8 -8
  135. package/components/ui/stepper/stepper.stories.tsx +116 -0
  136. package/components/ui/stepper/stepper.tsx +4 -4
  137. package/components/ui/stepper/use-stepper.ts +137 -0
  138. package/components/ui/switch/switch.mdx +8 -8
  139. package/components/ui/switch/switch.stories.tsx +20 -20
  140. package/components/ui/table/table.mdx +8 -8
  141. package/components/ui/tabs/tabs.mdx +8 -8
  142. package/components/ui/tabs/tabs.stories.tsx +26 -26
  143. package/components/ui/textarea/textarea.mdx +8 -8
  144. package/components/ui/timeline/timeline.mdx +8 -8
  145. package/components/ui/toggle/toggle.mdx +8 -8
  146. package/components/ui/toggle-group/toggle-group.mdx +8 -8
  147. package/components/ui/tooltip/tooltip.mdx +8 -8
  148. package/components/ui/tree-view/index.ts +4 -1
  149. package/components/ui/tree-view/tree-view.mdx +8 -8
  150. package/components/ui/tree-view/tree-view.stories.tsx +110 -4
  151. package/components/ui/tree-view/tree-view.tsx +17 -125
  152. package/components/ui/tree-view/use-tree-view.ts +229 -0
  153. package/components.json +1512 -1512
  154. package/contexts/ApiKeyContext.tsx +72 -72
  155. package/contexts/BrandColorsContext.tsx +26 -26
  156. package/contexts/LanguageContext.tsx +13 -13
  157. package/contexts/LayoutContext.test.tsx +11 -11
  158. package/contexts/LayoutContext.tsx +29 -29
  159. package/contexts/ThemeContext.tsx +26 -26
  160. package/contexts/theme-data.ts +4 -4
  161. package/dist/{AssistantChart-CVzmmhx4.js → AssistantChart-C_hwFRRr.js} +4 -4
  162. package/dist/{AssistantChart-BAx9VQvb.cjs → AssistantChart-CldVCVDe.cjs} +311 -94
  163. package/dist/{AssistantChart-CVko2A1W.js → AssistantChart-Cu3m7RBo.js} +314 -97
  164. package/dist/{AssistantChart-9w31gdAb.cjs → AssistantChart-DoZCyS5r.cjs} +4 -4
  165. package/dist/AudioPlayer-B1lt5cPl.cjs +989 -0
  166. package/dist/AudioPlayer-BZ7bibzU.cjs +982 -0
  167. package/dist/AudioPlayer-C12BjQBV.cjs +997 -0
  168. package/dist/AudioPlayer-DMcG_c7L.js +990 -0
  169. package/dist/AudioPlayer-DcFKRJE_.js +998 -0
  170. package/dist/AudioPlayer-e8LfNoqO.js +983 -0
  171. package/dist/{xertica-assistant-Qp3ydksa.cjs → CodeBlock-7TTgmdGG.cjs} +263 -51
  172. package/dist/{xertica-assistant-gnCJdcZY.js → CodeBlock-BeSt1h5P.js} +219 -7
  173. package/dist/CodeBlock-BgfYL_rD.cjs +2094 -0
  174. package/dist/CodeBlock-BlcqlA9M.cjs +2094 -0
  175. package/dist/CodeBlock-Bnmeu5ez.cjs +2094 -0
  176. package/dist/CodeBlock-BtfPlbAI.js +2078 -0
  177. package/dist/CodeBlock-CIySIuYr.js +2078 -0
  178. package/dist/CodeBlock-CuPtUM-7.cjs +2094 -0
  179. package/dist/CodeBlock-D6ffWXgc.js +2078 -0
  180. package/dist/CodeBlock-D8dcwbit.cjs +2094 -0
  181. package/dist/CodeBlock-DMZrFnlw.cjs +2094 -0
  182. package/dist/CodeBlock-DlBehYN8.js +2078 -0
  183. package/dist/CodeBlock-DnYNI8rQ.js +2078 -0
  184. package/dist/CodeBlock-DvKWbSnE.cjs +2094 -0
  185. package/dist/CodeBlock-DwMCfkFY.js +2078 -0
  186. package/dist/CodeBlock-Dy6CNYyj.js +2078 -0
  187. package/dist/CodeBlock-U1pPOQI7.cjs +2094 -0
  188. package/dist/CodeBlock-f_GpNhEB.js +2078 -0
  189. package/dist/CodeBlock-oB6u8nI1.js +2078 -0
  190. package/dist/CodeBlock-tZC31B73.cjs +2094 -0
  191. package/dist/ImageWithFallback-CGtidP6B.cjs +4542 -0
  192. package/dist/ImageWithFallback-lsg3pdFg.js +4508 -0
  193. package/dist/LanguageSelector-B5YfbHra.js +231 -0
  194. package/dist/LanguageSelector-D6uacAIM.cjs +230 -0
  195. package/dist/LayoutContext-BAql6ZRY.js +97 -0
  196. package/dist/LayoutContext-BvK-ggDa.cjs +96 -0
  197. package/dist/ThemeContext-BoH4NLfN.js +734 -0
  198. package/dist/{ThemeContext-BbBNoFTG.js → ThemeContext-C2EwAPDt.js} +2 -2
  199. package/dist/ThemeContext-r69W20Xg.cjs +733 -0
  200. package/dist/{ThemeContext-Cmr8Ex8H.cjs → ThemeContext-vTjumZeM.cjs} +2 -2
  201. package/dist/{VerifyEmailPage-BE-L9mB7.js → VerifyEmailPage-C0c2e5n0.js} +7 -7
  202. package/dist/{VerifyEmailPage-DMBh4NM9.cjs → VerifyEmailPage-CYXtbKi3.cjs} +1 -1
  203. package/dist/{VerifyEmailPage-CR7kb5df.cjs → VerifyEmailPage-Cwi3kbol.cjs} +7 -7
  204. package/dist/{VerifyEmailPage-CdYPSJoO.js → VerifyEmailPage-DvMLZgFt.js} +1 -1
  205. package/dist/XerticaOrbe-KL1RBHzw.cjs +1354 -0
  206. package/dist/XerticaOrbe-zwS1p2a8.js +1355 -0
  207. package/dist/XerticaProvider-6btlAlzc.js +17 -0
  208. package/dist/XerticaProvider-BNoNOxQ5.cjs +16 -0
  209. package/dist/XerticaProvider-BlY2limY.cjs +38 -0
  210. package/dist/{XerticaProvider-BITjgC5p.js → XerticaProvider-CEoWMTxu.js} +2 -2
  211. package/dist/{XerticaProvider-By8q3Roe.cjs → XerticaProvider-CllrbMEJ.cjs} +2 -2
  212. package/dist/XerticaProvider-DDuiIcKo.js +39 -0
  213. package/dist/XerticaProvider-cI9hSs27.cjs +38 -0
  214. package/dist/XerticaProvider-hSwhNQex.js +39 -0
  215. package/dist/{alert-dialog-yckpaOpy.cjs → alert-dialog-DSKByiKZ.cjs} +3 -3
  216. package/dist/{alert-dialog-iDe5VE5o.js → alert-dialog-s-vmNkJ_.js} +3 -3
  217. package/dist/assistant.cjs.js +2 -1
  218. package/dist/assistant.es.js +3 -2
  219. package/dist/brand.cjs.js +1 -1
  220. package/dist/brand.es.js +1 -1
  221. package/dist/breadcrumb-CqJ7bHY5.js +161 -0
  222. package/dist/breadcrumb-m9Hb2_XN.cjs +177 -0
  223. package/dist/cli.js +14 -8
  224. package/dist/components/assistant/xertica-assistant/index.d.ts +2 -0
  225. package/dist/components/assistant/xertica-assistant/use-assistant.d.ts +126 -0
  226. package/dist/components/assistant/xertica-assistant/xertica-assistant.d.ts +7 -2
  227. package/dist/components/blocks/audio-player/AudioPlayer.d.ts +35 -0
  228. package/dist/components/blocks/audio-player/index.d.ts +1 -0
  229. package/dist/components/blocks/document-editor/DocumentEditor.d.ts +26 -0
  230. package/dist/components/blocks/document-editor/index.d.ts +1 -0
  231. package/dist/components/blocks/podcast-player/PodcastPlayer.d.ts +41 -0
  232. package/dist/components/blocks/podcast-player/index.d.ts +1 -0
  233. package/dist/components/layout/sidebar/index.d.ts +2 -0
  234. package/dist/components/layout/sidebar/sidebar.d.ts +80 -0
  235. package/dist/components/layout/sidebar/use-sidebar.d.ts +22 -0
  236. package/dist/components/shared/layout-constants.d.ts +1 -1
  237. package/dist/components/ui/button/button.d.ts +1 -1
  238. package/dist/components/ui/chart/chart.d.ts +162 -5
  239. package/dist/components/ui/file-upload/file-upload.d.ts +2 -0
  240. package/dist/components/ui/file-upload/index.d.ts +1 -0
  241. package/dist/components/ui/file-upload/use-file-upload.d.ts +49 -0
  242. package/dist/components/ui/pagination/index.d.ts +2 -0
  243. package/dist/components/ui/pagination/use-pagination.d.ts +78 -0
  244. package/dist/components/ui/rich-text-editor/index.d.ts +2 -0
  245. package/dist/components/ui/rich-text-editor/use-rich-text-editor.d.ts +107 -0
  246. package/dist/components/ui/stepper/index.d.ts +3 -1
  247. package/dist/components/ui/stepper/stepper.d.ts +2 -2
  248. package/dist/components/ui/stepper/use-stepper.d.ts +60 -0
  249. package/dist/components/ui/tree-view/index.d.ts +4 -1
  250. package/dist/components/ui/tree-view/tree-view.d.ts +4 -6
  251. package/dist/components/ui/tree-view/use-tree-view.d.ts +60 -0
  252. package/dist/dropdown-menu-BDB5CmQs.cjs +247 -0
  253. package/dist/dropdown-menu-DQidbKBD.js +231 -0
  254. package/dist/google-maps-loader-BFWp6VPd.js +287 -0
  255. package/dist/{google-maps-loader-t2IlYBzw.js → google-maps-loader-CTYySAun.js} +4 -0
  256. package/dist/{google-maps-loader-BqsYL48U.cjs → google-maps-loader-Y-QkD-Li.cjs} +5 -0
  257. package/dist/google-maps-loader-eS3uQ5TA.cjs +287 -0
  258. package/dist/header-Cgy6vYPk.cjs +731 -0
  259. package/dist/header-DRlT4jgI.js +715 -0
  260. package/dist/header-Dux00SI4.cjs +731 -0
  261. package/dist/header-EkGKXPsD.js +715 -0
  262. package/dist/header-WfEywpyc.cjs +731 -0
  263. package/dist/header-tifNQn2U.js +715 -0
  264. package/dist/hooks.cjs.js +1 -1
  265. package/dist/hooks.es.js +1 -1
  266. package/dist/index-BhapVLVj.js +8 -0
  267. package/dist/{index-D3RLKRAs.cjs → index-COtD8bRW.cjs} +1 -1
  268. package/dist/index-D6fxYEY8.cjs +7 -0
  269. package/dist/index-DW5tYe26.js +8 -0
  270. package/dist/index.cjs.js +19 -8
  271. package/dist/index.es.js +39 -28
  272. package/dist/index.umd.js +1043 -470
  273. package/dist/input-2R4loU86.js +127 -0
  274. package/dist/input-DWANSKGb.cjs +145 -0
  275. package/dist/layout.cjs.js +89 -1
  276. package/dist/layout.es.js +90 -2
  277. package/dist/pages.cjs.js +1 -1
  278. package/dist/pages.es.js +1 -1
  279. package/dist/rich-text-editor-0mraWT5y.cjs +2376 -0
  280. package/dist/rich-text-editor-B6jMRLzk.cjs +1939 -0
  281. package/dist/rich-text-editor-B8_oYcIR.js +1730 -0
  282. package/dist/rich-text-editor-B9UbSXNb.js +1203 -0
  283. package/dist/rich-text-editor-BYuRBNBU.js +2373 -0
  284. package/dist/rich-text-editor-Bb9pySTs.cjs +2374 -0
  285. package/dist/rich-text-editor-BcL6L3cm.cjs +2374 -0
  286. package/dist/rich-text-editor-BoVZYtTs.cjs +2391 -0
  287. package/dist/rich-text-editor-CPV1lEPH.cjs +1748 -0
  288. package/dist/rich-text-editor-CoKqbCtu.cjs +1799 -0
  289. package/dist/rich-text-editor-Cw56T_mB.js +2356 -0
  290. package/dist/rich-text-editor-Cyt8qs2b.js +1921 -0
  291. package/dist/rich-text-editor-D6H84OcX.cjs +1220 -0
  292. package/dist/rich-text-editor-D76gD-QI.js +2328 -0
  293. package/dist/rich-text-editor-DKkokOnA.js +1781 -0
  294. package/dist/rich-text-editor-DNsdpN64.cjs +2359 -0
  295. package/dist/rich-text-editor-DfG8bCyY.js +2358 -0
  296. package/dist/rich-text-editor-DgF8s7xW.js +2949 -0
  297. package/dist/rich-text-editor-Dxjw31Z4.js +2341 -0
  298. package/dist/rich-text-editor-DzP0Epmb.js +2356 -0
  299. package/dist/rich-text-editor-mWoaSCE4.cjs +2966 -0
  300. package/dist/rich-text-editor-skplNlBM.cjs +2345 -0
  301. package/dist/select-Bkbr0f-Z.cjs +162 -0
  302. package/dist/select-CvIVdX2n.js +145 -0
  303. package/dist/sidebar-CK_0ZQHj.cjs +803 -0
  304. package/dist/sidebar-CUuOvYhK.js +787 -0
  305. package/dist/slider-Bc5Hd0y1.js +56 -0
  306. package/dist/slider-N7hFFj6X.cjs +73 -0
  307. package/dist/tooltip-Ded96neP.cjs +137 -0
  308. package/dist/tooltip-HDOoD2-0.js +120 -0
  309. package/dist/ui.cjs.js +14 -4
  310. package/dist/ui.es.js +26 -16
  311. package/dist/use-mobile-B0hNy_Y6.cjs +4303 -0
  312. package/dist/use-mobile-BXuYROXM.js +4202 -0
  313. package/dist/use-mobile-Bbd51ASU.cjs +4392 -0
  314. package/dist/use-mobile-Bk6CX-TC.js +4359 -0
  315. package/dist/use-mobile-BvYdisLP.js +4202 -0
  316. package/dist/use-mobile-BzuxjzNX.cjs +4392 -0
  317. package/dist/use-mobile-CG2-SdXV.cjs +4235 -0
  318. package/dist/use-mobile-CKb5pqTs.js +4269 -0
  319. package/dist/use-mobile-CYuAuGDl.js +4202 -0
  320. package/dist/use-mobile-CaENcqm-.js +4508 -0
  321. package/dist/use-mobile-CbrYgJGJ.js +4203 -0
  322. package/dist/use-mobile-DMOvImGQ.cjs +4542 -0
  323. package/dist/use-mobile-DRB3BQgD.cjs +4235 -0
  324. package/dist/use-mobile-DZvv7QMR.js +4359 -0
  325. package/dist/use-mobile-DdI_TXam.cjs +4235 -0
  326. package/dist/use-mobile-DlceKf8a.js +4359 -0
  327. package/dist/use-mobile-DsOnow1o.cjs +4236 -0
  328. package/dist/use-mobile-Kcj6jSnK.cjs +4392 -0
  329. package/dist/use-mobile-bnKcua_i.js +4202 -0
  330. package/dist/use-mobile-ncXBeE2z.cjs +4235 -0
  331. package/dist/{xertica-assistant-B1IaHXnB.cjs → xertica-assistant-dyP7KHM5.cjs} +533 -392
  332. package/dist/{xertica-assistant-DPsESB6t.js → xertica-assistant-yX1CFBBo.js} +535 -394
  333. package/dist/xertica-ui.css +2 -2
  334. package/docs/ai-usage.md +28 -10
  335. package/docs/architecture.md +76 -0
  336. package/docs/components/assistant.md +159 -0
  337. package/docs/components/calendar.md +154 -154
  338. package/docs/components/card-patterns.md +337 -337
  339. package/docs/components/card.md +235 -235
  340. package/docs/components/chart.md +354 -39
  341. package/docs/components/file-upload.md +119 -2
  342. package/docs/components/map.md +84 -84
  343. package/docs/components/pagination.md +187 -0
  344. package/docs/components/rich-text-editor.md +164 -0
  345. package/docs/components/sidebar.md +153 -4
  346. package/docs/components/stepper.md +157 -12
  347. package/docs/components/tree-view.md +164 -6
  348. package/docs/components/xertica-provider.md +24 -24
  349. package/docs/decision-tree.md +287 -287
  350. package/docs/getting-started.md +1 -1
  351. package/docs/guidelines.md +14 -8
  352. package/docs/layout.md +2 -2
  353. package/docs/llms.md +4 -4
  354. package/guidelines/Guidelines.md +252 -250
  355. package/hooks/useTheme.ts +3 -3
  356. package/imports/Podcast.tsx +388 -388
  357. package/imports/XerticaAi.tsx +45 -45
  358. package/imports/XerticaX.tsx +19 -19
  359. package/imports/svg-aueiaqngck.ts +11 -11
  360. package/imports/svg-v9krss1ozd.ts +16 -16
  361. package/imports/svg-vhrdofe3qe.ts +5 -5
  362. package/llms-compact.txt +327 -327
  363. package/llms.txt +160 -160
  364. package/package.json +203 -203
  365. package/styles/xertica/app-overrides/chat.css +61 -61
  366. package/styles/xertica/app-overrides/scrollbar.css +33 -33
  367. package/styles/xertica/integrations/google-maps.css +76 -76
  368. package/styles/xertica/integrations/sonner.css +73 -73
  369. package/styles/xertica/tokens.css +41 -12
  370. package/templates/CLAUDE.md +182 -172
  371. package/templates/guidelines/Guidelines.md +325 -313
  372. package/templates/package.json +3 -3
  373. package/templates/src/features/auth/index.ts +4 -4
  374. package/templates/src/features/auth/ui/AuthPageShell.tsx +34 -34
  375. package/templates/src/features/auth/ui/ForgotPasswordContent.tsx +70 -70
  376. package/templates/src/features/auth/ui/LoginContent.tsx +90 -90
  377. package/templates/src/features/auth/ui/ResetPasswordContent.tsx +151 -151
  378. package/templates/src/features/auth/ui/SocialLoginButtons.tsx +59 -59
  379. package/templates/src/features/auth/ui/VerifyEmailContent.tsx +82 -82
  380. package/templates/src/features/home/index.ts +1 -1
  381. package/templates/src/features/home/ui/HomeContent.tsx +100 -100
  382. package/templates/src/features/template/index.ts +5 -5
  383. package/templates/src/features/template/ui/CrudTemplate.tsx +3 -3
  384. package/templates/src/features/template/ui/DashboardTemplate.tsx +3 -3
  385. package/templates/src/features/template/ui/FormTemplate.tsx +120 -120
  386. package/templates/src/features/template/ui/LoginTemplate.tsx +3 -3
  387. package/templates/src/pages/AssistantPage.tsx +328 -328
  388. package/templates/src/pages/ForgotPasswordPage.tsx +6 -6
  389. package/templates/src/pages/HomePage.tsx +57 -57
  390. package/templates/src/pages/LoginPage.tsx +10 -10
  391. package/templates/src/pages/ResetPasswordPage.tsx +6 -6
  392. package/templates/src/pages/TemplatePage.tsx +30 -30
  393. package/templates/src/pages/VerifyEmailPage.tsx +6 -6
  394. package/templates/src/shared/config/navigation.ts +20 -20
  395. package/templates/src/shared/lib/auth.ts +20 -20
  396. package/templates/src/shared/types/auth.ts +3 -3
  397. package/templates/src/styles/xertica/tokens.css +39 -10
  398. package/templates/tsconfig.json +5 -5
  399. package/utils/gemini.ts +140 -140
  400. package/dist/VerifyEmailPage-Bae2cBXT.cjs +0 -2827
  401. package/dist/VerifyEmailPage-CbgjOF0v.js +0 -2828
  402. package/dist/index-CkTUgOwX.js +0 -8
@@ -1,192 +1,192 @@
1
- import React, { useState } from 'react';
2
- import { Map } from '../ui/map';
3
- import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../ui/card';
4
- import { Badge } from '../ui/badge';
5
- import { Checkbox } from '../ui/checkbox';
6
- import { Label } from '../ui/label';
7
-
8
- /**
9
- * Exemplo simples de mapa com marcadores de EMOJI e filtro
10
- * Demonstra uso de emojis com fundo branco para contraste
11
- * IMPORTANTE: Marcadores com emojis usam fundo branco (#FFFFFF)
12
- */
13
-
14
- // Dados de exemplo com emojis e fundo branco
15
- const locations = [
16
- {
17
- position: { lat: -23.5505, lng: -46.6333 },
18
- label: '🍕',
19
- title: 'Pizzaria do Bairro',
20
- info: 'Melhor pizza artesanal',
21
- color: '#FFFFFF', // Fundo branco para emojis
22
- iconColor: '#000000', // Texto preto para emojis (melhor contraste)
23
- category: 'food',
24
- },
25
- {
26
- position: { lat: -23.5485, lng: -46.6350 },
27
- label: '🍣',
28
- title: 'Sushi Premium',
29
- info: 'Culinária japonesa autêntica',
30
- color: '#FFFFFF',
31
- iconColor: '#000000',
32
- category: 'food',
33
- },
34
- {
35
- position: { lat: -23.5475, lng: -46.6361 },
36
- label: '🏨',
37
- title: 'Hotel Luxo',
38
- info: '5 estrelas com spa',
39
- color: '#FFFFFF',
40
- iconColor: '#000000',
41
- category: 'hotel',
42
- },
43
- {
44
- position: { lat: -23.5530, lng: -46.6340 },
45
- label: '🏩',
46
- title: 'Hotel Boutique',
47
- info: 'Design contemporâneo',
48
- color: '#FFFFFF',
49
- iconColor: '#000000',
50
- category: 'hotel',
51
- },
52
- {
53
- position: { lat: -23.5613, lng: -46.6563 },
54
- label: '🌳',
55
- title: 'Parque Ibirapuera',
56
- info: 'Maior parque da cidade',
57
- color: '#FFFFFF',
58
- iconColor: '#000000',
59
- category: 'attraction',
60
- },
61
- {
62
- position: { lat: -23.5558, lng: -46.6396 },
63
- label: '🎨',
64
- title: 'MASP',
65
- info: 'Museu de Arte',
66
- color: '#FFFFFF',
67
- iconColor: '#000000',
68
- category: 'attraction',
69
- },
70
- {
71
- position: { lat: -23.5465, lng: -46.6400 },
72
- label: '🛍️',
73
- title: 'Shopping Center',
74
- info: 'Mais de 300 lojas',
75
- color: '#FFFFFF',
76
- iconColor: '#000000',
77
- category: 'shopping',
78
- },
79
- {
80
- position: { lat: -23.5495, lng: -46.6345 },
81
- label: '☕',
82
- title: 'Café Artesanal',
83
- info: 'Café especial e brunch',
84
- color: '#FFFFFF',
85
- iconColor: '#000000',
86
- category: 'cafe',
87
- },
88
- ];
89
-
90
- export function SimpleFilterableMap() {
91
- const [filters, setFilters] = useState({
92
- food: true,
93
- hotel: true,
94
- attraction: true,
95
- shopping: true,
96
- cafe: true,
97
- });
98
-
99
- // Filtrar marcadores
100
- const filteredMarkers = locations
101
- .filter(loc => filters[loc.category as keyof typeof filters])
102
- .map(loc => ({
103
- position: loc.position,
104
- label: loc.label,
105
- title: loc.title,
106
- info: loc.info,
107
- customColor: loc.color, // Sempre branco para emojis
108
- iconColor: loc.iconColor, // Texto preto para emojis
109
- }));
110
-
111
- const toggleFilter = (category: keyof typeof filters) => {
112
- setFilters(prev => ({ ...prev, [category]: !prev[category] }));
113
- };
114
-
115
- const filterConfig = [
116
- { id: 'food', label: 'Restaurantes', emoji: '🍕', color: 'var(--destructive)', count: locations.filter(l => l.category === 'food').length },
117
- { id: 'hotel', label: 'Hotéis', emoji: '🏨', color: 'var(--info)', count: locations.filter(l => l.category === 'hotel').length },
118
- { id: 'attraction', label: 'Atrações', emoji: '🌳', color: 'var(--success)', count: locations.filter(l => l.category === 'attraction').length },
119
- { id: 'shopping', label: 'Compras', emoji: '🛍️', color: 'var(--warning)', count: locations.filter(l => l.category === 'shopping').length },
120
- { id: 'cafe', label: 'Cafés', emoji: '☕', color: 'var(--primary)', count: locations.filter(l => l.category === 'cafe').length },
121
- ];
122
-
123
- return (
124
- <Card>
125
- <CardHeader>
126
- <div className="flex items-center justify-between">
127
- <CardTitle>Mapa com Emojis</CardTitle>
128
- <Badge variant="secondary">
129
- {filteredMarkers.length} de {locations.length} locais
130
- </Badge>
131
- </div>
132
- <CardDescription>
133
- Marcadores com emojis em fundo branco - Selecione as categorias para visualizar
134
- </CardDescription>
135
- </CardHeader>
136
- <CardContent className="space-y-4">
137
- {/* Filtros Compactos com Checkboxes */}
138
- <div className="flex flex-wrap gap-4 p-3 rounded-lg border bg-muted">
139
- {filterConfig.map(filter => (
140
- <div key={filter.id} className="flex items-center space-x-2">
141
- <Checkbox
142
- id={filter.id}
143
- checked={filters[filter.id as keyof typeof filters]}
144
- onCheckedChange={() => toggleFilter(filter.id as keyof typeof filters)}
145
- />
146
- <Label htmlFor={filter.id} className="flex items-center gap-2 cursor-pointer text-sm">
147
- <span className="text-base">{filter.emoji}</span>
148
- <span>{filter.label}</span>
149
- <Badge variant="outline" className="text-xs h-4 px-1">
150
- {filter.count}
151
- </Badge>
152
- </Label>
153
- </div>
154
- ))}
155
- </div>
156
-
157
- {/* Mapa */}
158
- <Map
159
- center={{ lat: -23.5505, lng: -46.6333 }}
160
- zoom={14}
161
- markers={filteredMarkers}
162
- height="450px"
163
- zoomControl={true}
164
- fullscreenControl={true}
165
- />
166
-
167
- {/* Legenda */}
168
- <div className="flex flex-wrap gap-3 justify-center pt-3 border-t border-border">
169
- {filterConfig.map(filter => (
170
- <div
171
- key={filter.id}
172
- className="flex items-center gap-2 px-3 py-1 rounded-lg"
173
- style={{
174
- backgroundColor: filters[filter.id as keyof typeof filters]
175
- ? `color-mix(in srgb, ${filter.color}, transparent 85%)`
176
- : 'var(--muted)',
177
- opacity: filters[filter.id as keyof typeof filters] ? 1 : 0.5,
178
- }}
179
- >
180
- <div
181
- className="w-3 h-3 rounded-full"
182
- style={{ backgroundColor: filter.color }}
183
- />
184
- <span className="text-base">{filter.emoji}</span>
185
- <span className="text-sm">{filter.label}</span>
186
- </div>
187
- ))}
188
- </div>
189
- </CardContent>
190
- </Card>
191
- );
1
+ import React, { useState } from 'react';
2
+ import { Map } from '../ui/map';
3
+ import { Card, CardContent, CardDescription, CardHeader, CardTitle } from '../ui/card';
4
+ import { Badge } from '../ui/badge';
5
+ import { Checkbox } from '../ui/checkbox';
6
+ import { Label } from '../ui/label';
7
+
8
+ /**
9
+ * Exemplo simples de mapa com marcadores de EMOJI e filtro
10
+ * Demonstra uso de emojis com fundo branco para contraste
11
+ * IMPORTANTE: Marcadores com emojis usam fundo branco (#FFFFFF)
12
+ */
13
+
14
+ // Dados de exemplo com emojis e fundo branco
15
+ const locations = [
16
+ {
17
+ position: { lat: -23.5505, lng: -46.6333 },
18
+ label: '🍕',
19
+ title: 'Pizzaria do Bairro',
20
+ info: 'Melhor pizza artesanal',
21
+ color: '#FFFFFF', // Fundo branco para emojis
22
+ iconColor: '#000000', // Texto preto para emojis (melhor contraste)
23
+ category: 'food',
24
+ },
25
+ {
26
+ position: { lat: -23.5485, lng: -46.6350 },
27
+ label: '🍣',
28
+ title: 'Sushi Premium',
29
+ info: 'Culinária japonesa autêntica',
30
+ color: '#FFFFFF',
31
+ iconColor: '#000000',
32
+ category: 'food',
33
+ },
34
+ {
35
+ position: { lat: -23.5475, lng: -46.6361 },
36
+ label: '🏨',
37
+ title: 'Hotel Luxo',
38
+ info: '5 estrelas com spa',
39
+ color: '#FFFFFF',
40
+ iconColor: '#000000',
41
+ category: 'hotel',
42
+ },
43
+ {
44
+ position: { lat: -23.5530, lng: -46.6340 },
45
+ label: '🏩',
46
+ title: 'Hotel Boutique',
47
+ info: 'Design contemporâneo',
48
+ color: '#FFFFFF',
49
+ iconColor: '#000000',
50
+ category: 'hotel',
51
+ },
52
+ {
53
+ position: { lat: -23.5613, lng: -46.6563 },
54
+ label: '🌳',
55
+ title: 'Parque Ibirapuera',
56
+ info: 'Maior parque da cidade',
57
+ color: '#FFFFFF',
58
+ iconColor: '#000000',
59
+ category: 'attraction',
60
+ },
61
+ {
62
+ position: { lat: -23.5558, lng: -46.6396 },
63
+ label: '🎨',
64
+ title: 'MASP',
65
+ info: 'Museu de Arte',
66
+ color: '#FFFFFF',
67
+ iconColor: '#000000',
68
+ category: 'attraction',
69
+ },
70
+ {
71
+ position: { lat: -23.5465, lng: -46.6400 },
72
+ label: '🛍️',
73
+ title: 'Shopping Center',
74
+ info: 'Mais de 300 lojas',
75
+ color: '#FFFFFF',
76
+ iconColor: '#000000',
77
+ category: 'shopping',
78
+ },
79
+ {
80
+ position: { lat: -23.5495, lng: -46.6345 },
81
+ label: '☕',
82
+ title: 'Café Artesanal',
83
+ info: 'Café especial e brunch',
84
+ color: '#FFFFFF',
85
+ iconColor: '#000000',
86
+ category: 'cafe',
87
+ },
88
+ ];
89
+
90
+ export function SimpleFilterableMap() {
91
+ const [filters, setFilters] = useState({
92
+ food: true,
93
+ hotel: true,
94
+ attraction: true,
95
+ shopping: true,
96
+ cafe: true,
97
+ });
98
+
99
+ // Filtrar marcadores
100
+ const filteredMarkers = locations
101
+ .filter(loc => filters[loc.category as keyof typeof filters])
102
+ .map(loc => ({
103
+ position: loc.position,
104
+ label: loc.label,
105
+ title: loc.title,
106
+ info: loc.info,
107
+ customColor: loc.color, // Sempre branco para emojis
108
+ iconColor: loc.iconColor, // Texto preto para emojis
109
+ }));
110
+
111
+ const toggleFilter = (category: keyof typeof filters) => {
112
+ setFilters(prev => ({ ...prev, [category]: !prev[category] }));
113
+ };
114
+
115
+ const filterConfig = [
116
+ { id: 'food', label: 'Restaurantes', emoji: '🍕', color: 'var(--destructive)', count: locations.filter(l => l.category === 'food').length },
117
+ { id: 'hotel', label: 'Hotéis', emoji: '🏨', color: 'var(--info)', count: locations.filter(l => l.category === 'hotel').length },
118
+ { id: 'attraction', label: 'Atrações', emoji: '🌳', color: 'var(--success)', count: locations.filter(l => l.category === 'attraction').length },
119
+ { id: 'shopping', label: 'Compras', emoji: '🛍️', color: 'var(--warning)', count: locations.filter(l => l.category === 'shopping').length },
120
+ { id: 'cafe', label: 'Cafés', emoji: '☕', color: 'var(--primary)', count: locations.filter(l => l.category === 'cafe').length },
121
+ ];
122
+
123
+ return (
124
+ <Card>
125
+ <CardHeader>
126
+ <div className="flex items-center justify-between">
127
+ <CardTitle>Mapa com Emojis</CardTitle>
128
+ <Badge variant="secondary">
129
+ {filteredMarkers.length} de {locations.length} locais
130
+ </Badge>
131
+ </div>
132
+ <CardDescription>
133
+ Marcadores com emojis em fundo branco - Selecione as categorias para visualizar
134
+ </CardDescription>
135
+ </CardHeader>
136
+ <CardContent className="space-y-4">
137
+ {/* Filtros Compactos com Checkboxes */}
138
+ <div className="flex flex-wrap gap-4 p-3 rounded-lg border bg-muted">
139
+ {filterConfig.map(filter => (
140
+ <div key={filter.id} className="flex items-center space-x-2">
141
+ <Checkbox
142
+ id={filter.id}
143
+ checked={filters[filter.id as keyof typeof filters]}
144
+ onCheckedChange={() => toggleFilter(filter.id as keyof typeof filters)}
145
+ />
146
+ <Label htmlFor={filter.id} className="flex items-center gap-2 cursor-pointer text-sm">
147
+ <span className="text-base">{filter.emoji}</span>
148
+ <span>{filter.label}</span>
149
+ <Badge variant="outline" className="text-xs h-4 px-1">
150
+ {filter.count}
151
+ </Badge>
152
+ </Label>
153
+ </div>
154
+ ))}
155
+ </div>
156
+
157
+ {/* Mapa */}
158
+ <Map
159
+ center={{ lat: -23.5505, lng: -46.6333 }}
160
+ zoom={14}
161
+ markers={filteredMarkers}
162
+ height="450px"
163
+ zoomControl={true}
164
+ fullscreenControl={true}
165
+ />
166
+
167
+ {/* Legenda */}
168
+ <div className="flex flex-wrap gap-3 justify-center pt-3 border-t border-border">
169
+ {filterConfig.map(filter => (
170
+ <div
171
+ key={filter.id}
172
+ className="flex items-center gap-2 px-3 py-1 rounded-lg"
173
+ style={{
174
+ backgroundColor: filters[filter.id as keyof typeof filters]
175
+ ? `color-mix(in srgb, ${filter.color}, transparent 85%)`
176
+ : 'var(--muted)',
177
+ opacity: filters[filter.id as keyof typeof filters] ? 1 : 0.5,
178
+ }}
179
+ >
180
+ <div
181
+ className="w-3 h-3 rounded-full"
182
+ style={{ backgroundColor: filter.color }}
183
+ />
184
+ <span className="text-base">{filter.emoji}</span>
185
+ <span className="text-sm">{filter.label}</span>
186
+ </div>
187
+ ))}
188
+ </div>
189
+ </CardContent>
190
+ </Card>
191
+ );
192
192
  }
@@ -1,52 +1,52 @@
1
- /**
2
- * Map Examples - Index
3
- *
4
- * Exportação centralizada de todos os exemplos de Map
5
- */
6
-
7
- // Exemplos básicos
8
- export {
9
- StoreDeliveryMap,
10
- FavoritePlacesMap,
11
- CompanyOfficesMap,
12
- ServiceZoneMap,
13
- CompactMapsGrid
14
- } from './MapExamples';
15
-
16
- // Exemplos de rotas
17
- export {
18
- DeliveryRouteMap,
19
- TouristRouteMap,
20
- TransportModeComparison,
21
- MultiStopDeliveryRoute,
22
- RouteMapShowcase
23
- } from './RouteMapExamples';
24
-
25
- // Exemplos avançados
26
- export {
27
- LocationPickerExample,
28
- DeliveryAddressSelector
29
- } from './LocationPickerExample';
30
-
31
- // Exemplo com filtros
32
- export {
33
- FilterableMapExample,
34
- markerGroups,
35
- type MarkerGroupId
36
- } from './FilterableMapExample';
37
-
38
- // Exemplo simples com filtros
39
- export { SimpleFilterableMap } from './SimpleFilterableMap';
40
-
41
- // Showcase completo
42
- export { MapShowcase } from './MapShowcase';
43
-
44
- /**
45
- * Uso:
46
- *
47
- * import { StoreDeliveryMap, LocationPickerExample } from '@/components/examples';
48
- *
49
- * ou
50
- *
51
- * import { StoreDeliveryMap } from '@/components/examples/MapExamples';
1
+ /**
2
+ * Map Examples - Index
3
+ *
4
+ * Exportação centralizada de todos os exemplos de Map
5
+ */
6
+
7
+ // Exemplos básicos
8
+ export {
9
+ StoreDeliveryMap,
10
+ FavoritePlacesMap,
11
+ CompanyOfficesMap,
12
+ ServiceZoneMap,
13
+ CompactMapsGrid
14
+ } from './MapExamples';
15
+
16
+ // Exemplos de rotas
17
+ export {
18
+ DeliveryRouteMap,
19
+ TouristRouteMap,
20
+ TransportModeComparison,
21
+ MultiStopDeliveryRoute,
22
+ RouteMapShowcase
23
+ } from './RouteMapExamples';
24
+
25
+ // Exemplos avançados
26
+ export {
27
+ LocationPickerExample,
28
+ DeliveryAddressSelector
29
+ } from './LocationPickerExample';
30
+
31
+ // Exemplo com filtros
32
+ export {
33
+ FilterableMapExample,
34
+ markerGroups,
35
+ type MarkerGroupId
36
+ } from './FilterableMapExample';
37
+
38
+ // Exemplo simples com filtros
39
+ export { SimpleFilterableMap } from './SimpleFilterableMap';
40
+
41
+ // Showcase completo
42
+ export { MapShowcase } from './MapShowcase';
43
+
44
+ /**
45
+ * Uso:
46
+ *
47
+ * import { StoreDeliveryMap, LocationPickerExample } from '@/components/examples';
48
+ *
49
+ * ou
50
+ *
51
+ * import { StoreDeliveryMap } from '@/components/examples/MapExamples';
52
52
  */
@@ -1,27 +1,27 @@
1
- import React, { useState } from 'react'
2
-
3
- const ERROR_IMG_SRC =
4
- 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODgiIGhlaWdodD0iODgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBvcGFjaXR5PSIuMyIgZmlsbD0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIzLjciPjxyZWN0IHg9IjE2IiB5PSIxNiIgd2lkdGg9IjU2IiBoZWlnaHQ9IjU2IiByeD0iNiIvPjxwYXRoIGQ9Im0xNiA1OCAxNi0xOCAzMiAzMiIvPjxjaXJjbGUgY3g9IjUzIiBjeT0iMzUiIHI9IjciLz48L3N2Zz4KCg=='
5
-
6
- export function ImageWithFallback(props: React.ImgHTMLAttributes<HTMLImageElement>) {
7
- const [didError, setDidError] = useState(false)
8
-
9
- const handleError = () => {
10
- setDidError(true)
11
- }
12
-
13
- const { src, alt, style, className, ...rest } = props
14
-
15
- return didError ? (
16
- <div
17
- className={`inline-block bg-gray-100 text-center align-middle ${className ?? ''}`}
18
- style={style}
19
- >
20
- <div className="flex items-center justify-center w-full h-full">
21
- <img src={ERROR_IMG_SRC} alt="Error loading image" {...rest} data-original-url={src} />
22
- </div>
23
- </div>
24
- ) : (
25
- <img src={src} alt={alt} className={className} style={style} {...rest} onError={handleError} />
26
- )
27
- }
1
+ import React, { useState } from 'react'
2
+
3
+ const ERROR_IMG_SRC =
4
+ 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iODgiIGhlaWdodD0iODgiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgc3Ryb2tlPSIjMDAwIiBzdHJva2UtbGluZWpvaW49InJvdW5kIiBvcGFjaXR5PSIuMyIgZmlsbD0ibm9uZSIgc3Ryb2tlLXdpZHRoPSIzLjciPjxyZWN0IHg9IjE2IiB5PSIxNiIgd2lkdGg9IjU2IiBoZWlnaHQ9IjU2IiByeD0iNiIvPjxwYXRoIGQ9Im0xNiA1OCAxNi0xOCAzMiAzMiIvPjxjaXJjbGUgY3g9IjUzIiBjeT0iMzUiIHI9IjciLz48L3N2Zz4KCg=='
5
+
6
+ export function ImageWithFallback(props: React.ImgHTMLAttributes<HTMLImageElement>) {
7
+ const [didError, setDidError] = useState(false)
8
+
9
+ const handleError = () => {
10
+ setDidError(true)
11
+ }
12
+
13
+ const { src, alt, style, className, ...rest } = props
14
+
15
+ return didError ? (
16
+ <div
17
+ className={`inline-block bg-gray-100 text-center align-middle ${className ?? ''}`}
18
+ style={style}
19
+ >
20
+ <div className="flex items-center justify-center w-full h-full">
21
+ <img src={ERROR_IMG_SRC} alt="Error loading image" {...rest} data-original-url={src} />
22
+ </div>
23
+ </div>
24
+ ) : (
25
+ <img src={src} alt={alt} className={className} style={style} {...rest} onError={handleError} />
26
+ )
27
+ }
@@ -1,7 +1,7 @@
1
- export * from '../../contexts/LayoutContext';
2
- export * from '../../contexts/ThemeContext';
3
- export * from '../../contexts/LanguageContext';
4
- export * from '../../contexts/BrandColorsContext';
5
- export * from '../../contexts/AssistenteContext';
6
- export * from '../../contexts/ApiKeyContext';
7
- export { useMobile, useIsMobile } from '../shared/use-mobile';
1
+ export * from '../../contexts/LayoutContext';
2
+ export * from '../../contexts/ThemeContext';
3
+ export * from '../../contexts/LanguageContext';
4
+ export * from '../../contexts/BrandColorsContext';
5
+ export * from '../../contexts/AssistenteContext';
6
+ export * from '../../contexts/ApiKeyContext';
7
+ export { useMobile, useIsMobile } from '../shared/use-mobile';
@@ -30,10 +30,10 @@ export type {
30
30
  } from './assistant/xertica-assistant/xertica-assistant';
31
31
 
32
32
  // ============================================================================
33
- // Page Components
34
- // ============================================================================
35
-
36
- export * from './pages';
33
+ // Page Components
34
+ // ============================================================================
35
+
36
+ export * from './pages';
37
37
 
38
38
  // UI Components - All available via /components/ui/index.ts
39
39
  export * from './ui';
@@ -74,4 +74,4 @@ export { FloatingMediaWrapper } from './media/FloatingMediaWrapper';
74
74
  // PodcastPlayer was consolidated into AudioPlayer via colorVariant="primary" prop
75
75
 
76
76
  // Demo utilities (for templates)
77
- export { gerarResposta, gerarResposta as generateDemoResponse } from './shared/assistant-utils';
77
+ export { gerarResposta, gerarResposta as generateDemoResponse } from './shared/assistant-utils';
@@ -31,14 +31,14 @@ vi.mock('../../ui/dropdown-menu', () => ({
31
31
  DropdownMenuPortal: ({ children }: any) => <>{children}</>,
32
32
  }));
33
33
 
34
- describe('Header', () => {
35
- it('renders without a LayoutProvider', () => {
36
- render(<Header title="Standalone" />);
37
-
38
- expect(screen.getByText('Standalone')).toBeInTheDocument();
39
- });
40
-
41
- it('renders correctly with title', () => {
34
+ describe('Header', () => {
35
+ it('renders without a LayoutProvider', () => {
36
+ render(<Header title="Standalone" />);
37
+
38
+ expect(screen.getByText('Standalone')).toBeInTheDocument();
39
+ });
40
+
41
+ it('renders correctly with title', () => {
42
42
  render(
43
43
  <LayoutProvider>
44
44
  <Header title="Dashboard" />
@@ -21,7 +21,7 @@ import {
21
21
  } from '../../ui/dropdown-menu';
22
22
  import { Avatar, AvatarFallback, AvatarImage } from '../../ui/avatar';
23
23
 
24
- import { useOptionalLayout } from '../../../contexts/LayoutContext';
24
+ import { useOptionalLayout } from '../../../contexts/LayoutContext';
25
25
 
26
26
  /**
27
27
  * Breadcrumb entry for the header navigation.
@@ -161,9 +161,9 @@ export function Header({
161
161
  onLogoutClick,
162
162
  renderLink,
163
163
  breadcrumbSlot,
164
- }: HeaderProps) {
165
- const layout = useOptionalLayout();
166
- const toggleSidebar = layout?.toggleSidebar ?? (() => {});
164
+ }: HeaderProps) {
165
+ const layout = useOptionalLayout();
166
+ const toggleSidebar = layout?.toggleSidebar ?? (() => {});
167
167
 
168
168
  return (
169
169
  <header className={`bg-card text-foreground shadow-sm border-b border-border px-[24px] h-[64px] flex-shrink-0 flex items-center ${className || ''}`}>
@@ -1,2 +1,2 @@
1
- export * from './sidebar';
2
- export * from './header';
1
+ export * from './sidebar';
2
+ export * from './header';
@@ -1 +1,3 @@
1
1
  export * from './sidebar';
2
+ export { useSidebar } from './use-sidebar';
3
+ export type { UseSidebarProps } from './use-sidebar';
@@ -76,7 +76,7 @@ The expansion state is automatically persisted in a cookie (`sidebar_state`), en
76
76
  The Sidebar should ideally be synchronized with the `useLayout()` hook to ensure the main application container adjusts its padding accordingly.
77
77
 
78
78
  ```tsx
79
- import { Sidebar } from 'xertica-ui/layout';
79
+ import { Sidebar } from 'xertica-ui/layout';
80
80
  import { useLayout } from 'xertica-ui/hooks';
81
81
 
82
82
  const { sidebarExpanded, toggleSidebar, sidebarWidth } = useLayout();