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,4 +1,6 @@
1
- import React, { useState, useEffect, useRef } from 'react';
1
+ import React from 'react';
2
+ import { type MockResponse } from '../../shared/assistant-utils';
3
+ import { useAssistant } from './use-assistant';
2
4
  import { motion, AnimatePresence } from 'framer-motion';
3
5
  import {
4
6
  MessageSquare,
@@ -241,8 +243,6 @@ export type AssistantTab = 'chat' | 'historico' | 'favoritos';
241
243
  // Component Props
242
244
  // ============================================================================
243
245
 
244
- import { gerarResposta, type MockResponse } from '../../shared/assistant-utils';
245
-
246
246
  export interface XerticaAssistantProps {
247
247
  /**
248
248
  * Layout mode for the assistant panel
@@ -310,6 +310,12 @@ export interface XerticaAssistantProps {
310
310
  */
311
311
  suggestions?: Suggestion[];
312
312
 
313
+ /**
314
+ * Subtitle shown below the user's name in the empty state.
315
+ * @default 'Como posso ajudar?'
316
+ */
317
+ welcomeMessage?: string;
318
+
313
319
  /**
314
320
  * Callback fired when the user sends a message
315
321
  */
@@ -480,6 +486,7 @@ export function XerticaAssistant({
480
486
  customResponses = [],
481
487
  responseGenerator,
482
488
  richSuggestions = [],
489
+ welcomeMessage = 'Como posso ajudar?',
483
490
  onRichAction,
484
491
  onEvaluation,
485
492
  feedbackOptions,
@@ -493,368 +500,70 @@ export function XerticaAssistant({
493
500
  enableSearch = true,
494
501
  }: XerticaAssistantProps) {
495
502
  // ============================================================================
496
- // State Management
497
- // ============================================================================
498
-
499
- const isFullPage = mode === 'fullPage';
500
- const [internalIsExpanded, setInternalIsExpanded] = useState(controlledIsExpanded ?? true);
501
- const isExpanded = controlledIsExpanded ?? internalIsExpanded;
502
-
503
- const [isMobile, setIsMobile] = useState(false);
504
- useEffect(() => {
505
- const handleResize = () => setIsMobile(window.innerWidth < 768);
506
- handleResize();
507
- window.addEventListener('resize', handleResize);
508
- return () => window.removeEventListener('resize', handleResize);
509
- }, []);
510
-
511
- const [abaSelecionada, setAbaSelecionada] = useState<AssistantTab>(defaultTab);
512
- const [mensagens, setMensagens] = useState<Message[]>(initialMessages);
513
- const [mensagem, setMensagem] = useState('');
514
- const [conversas, setConversas] = useState<Conversation[]>(savedConversations);
515
- const [conversaAtual, setConversaAtual] = useState<string | null>(null);
516
- const [copiedId, setCopiedId] = useState<string | null>(null);
517
- const [generatingPodcastId, setGeneratingPodcastId] = useState<string | null>(null);
518
- const [executingCommand, setExecutingCommand] = useState<string | null>(null);
519
- const [savedSearches, setSavedSearches] = useState<string[]>([]);
520
- const [editingDocument, setEditingDocument] = useState<{
521
- content: string;
522
- title: string;
523
- } | null>(null);
524
- const [showMoreSuggestions, setShowMoreSuggestions] = useState(false);
525
- const [evaluationState, setEvaluationState] = useState<{
526
- isOpen: boolean;
527
- messageId: string | null;
528
- type: 'dislike' | null;
529
- category?: string | null;
530
- reason: string;
531
- }>({
532
- isOpen: false,
533
- messageId: null,
534
- type: null,
535
- category: null,
536
- reason: ''
537
- });
538
-
539
- // ============================================================================
540
- // Refs
541
- // ============================================================================
542
-
543
- const messagesEndRef = useRef<HTMLDivElement>(null);
544
- const fileInputRef = useRef<HTMLInputElement>(null);
545
- const audioInputRef = useRef<HTMLInputElement>(null);
546
-
547
- // ============================================================================
548
- // Sugestões padrão
549
- // ============================================================================
550
-
551
- const defaultSuggestions: Suggestion[] = [
552
- { id: '1', text: 'Me ajude a criar um documento profissional' },
553
- { id: '2', text: 'Buscar nos meus arquivos por "relatório"' },
554
- { id: '3', text: 'Resuma as conversas importantes desta semana' },
555
- { id: '4', text: 'Crie um podcast sobre o último projeto' },
556
- ];
557
-
558
- const sugestoes = propSuggestions ?? defaultSuggestions;
559
-
560
- // API Key Validation removed
561
-
562
-
563
- // ============================================================================
564
- // Effects
565
- // ============================================================================
566
-
567
- // Auto-scroll ao adicionar mensagens
568
- useEffect(() => {
569
- if (messagesEndRef.current && abaSelecionada === 'chat') {
570
- messagesEndRef.current.scrollIntoView({ behavior: 'smooth' });
571
- }
572
- }, [mensagens, abaSelecionada]);
573
-
574
- // Sincronizar mensagens iniciais apenas quando elas mudarem e não forem vazias
575
- useEffect(() => {
576
- if (initialMessages && initialMessages.length > 0) {
577
- setMensagens(initialMessages);
578
- }
579
- }, [initialMessages]);
580
-
581
- // ============================================================================
582
- // Handlers
583
- // ============================================================================
584
-
585
- const handleToggle = () => {
586
- if (onToggle) {
587
- onToggle();
588
- } else {
589
- setInternalIsExpanded(!internalIsExpanded);
590
- }
591
- };
592
-
593
- const handleExpandWithTab = (tab: AssistantTab) => {
594
- setAbaSelecionada(tab);
595
- if (onToggle) {
596
- onToggle();
597
- } else {
598
- setInternalIsExpanded(true);
599
- }
600
- };
601
-
602
- const handleEnviarMensagem = async (arg?: string | ActionType) => {
603
- let msgToSend = mensagem;
604
-
605
- // Check if argument is a message text (from simple string) or ActionType
606
- if (typeof arg === 'string' && !['document', 'podcast', 'search'].includes(arg)) {
607
- msgToSend = arg;
608
- }
609
-
610
- if (!msgToSend.trim() || isProcessing) return;
611
-
612
- const novaMensagem: Message = {
613
- id: `msg-${Date.now()}`,
614
- type: 'user',
615
- content: msgToSend,
616
- timestamp: new Date(),
617
- isFavorite: false,
618
- };
619
-
620
- setMensagens(prev => [...prev, novaMensagem]);
621
-
622
-
623
- if (onSendMessage) {
624
- onSendMessage(msgToSend);
625
- }
626
-
627
- if (demoMode || responseGenerator) {
628
- const mensagemAtual = msgToSend;
629
- setTimeout(async () => {
630
- let resposta: string | Partial<Message>;
631
-
632
- if (responseGenerator) {
633
- resposta = await responseGenerator(mensagemAtual);
634
- } else {
635
- resposta = gerarResposta(mensagemAtual, customResponses);
636
- }
637
-
638
- let novaMensagemIA: Message = {
639
- id: `msg-${Date.now()}-ia`,
640
- type: 'assistant',
641
- content: '',
642
- timestamp: new Date(),
643
- isFavorite: false
644
- };
645
-
646
- if (typeof resposta === 'string') {
647
- novaMensagemIA.content = resposta;
648
- } else {
649
- novaMensagemIA = { ...novaMensagemIA, ...resposta };
650
- }
651
-
652
- setMensagens(prev => [...prev, novaMensagemIA]);
653
- }, 1000 + Math.random() * 1000);
654
- }
655
-
656
- setMensagem('');
657
- };
658
-
659
- const handleToggleFavorite = (messageId: string) => {
660
- setMensagens(prev =>
661
- prev.map(msg =>
662
- msg.id === messageId ? { ...msg, isFavorite: !msg.isFavorite } : msg
663
- )
664
- );
665
- };
666
-
667
- const handleCopyMessage = async (content: string, messageId: string) => {
668
- try {
669
- // Try modern Clipboard API first
670
- if (navigator.clipboard && navigator.clipboard.writeText) {
671
- try {
672
- await navigator.clipboard.writeText(content);
673
- setCopiedId(messageId);
674
- setTimeout(() => setCopiedId(null), 2000);
675
- } catch (clipboardError: any) {
676
- // If clipboard API fails due to permissions, fall back to execCommand
677
- if (clipboardError.name === 'NotAllowedError' || clipboardError.message.includes('permissions policy')) {
678
- throw new Error('Clipboard permission denied, falling back');
679
- }
680
- throw clipboardError;
681
- }
682
- } else {
683
- throw new Error('Clipboard API not available');
684
- }
685
- } catch (err) {
686
- // Fallback for browsers that don't support Clipboard API or when permissions are denied
687
- try {
688
- const textArea = document.createElement('textarea');
689
- textArea.value = content;
690
- textArea.style.position = 'fixed';
691
- textArea.style.left = '-999999px';
692
- textArea.style.top = '-999999px';
693
- document.body.appendChild(textArea);
694
- textArea.focus();
695
- textArea.select();
696
-
697
- const successful = document.execCommand('copy');
698
- document.body.removeChild(textArea);
699
-
700
- if (successful) {
701
- setCopiedId(messageId);
702
- setTimeout(() => setCopiedId(null), 2000);
703
- } else {
704
- console.error('Falha ao copiar: execCommand returned false');
705
- }
706
- } catch (fallbackErr) {
707
- console.error('Falha ao copiar:', fallbackErr);
708
- }
709
- }
710
- };
711
-
712
- const handleGeneratePodcast = async (messageId: string, content: string) => {
713
- setGeneratingPodcastId(messageId);
714
-
715
- // Simulação de geração de podcast
716
- setTimeout(() => {
717
- setMensagens(prev =>
718
- prev.map(msg =>
719
- msg.id === messageId
720
- ? {
721
- ...msg,
722
- attachmentType: 'podcast',
723
- attachmentName: 'Podcast - ' + content.substring(0, 30) + '...',
724
- audioUrl: 'data:audio/mpeg;base64,//uQx...' // Mock
725
- }
726
- : msg
727
- )
728
- );
729
- setGeneratingPodcastId(null);
730
- }, 2000);
731
- };
732
-
733
- const handleDownloadDocument = (content: string, fileName: string) => {
734
- const blob = new Blob([content], { type: 'text/markdown' });
735
- const url = URL.createObjectURL(blob);
736
- const a = document.createElement('a');
737
- a.href = url;
738
- a.download = fileName.endsWith('.md') ? fileName : fileName + '.md';
739
- document.body.appendChild(a);
740
- a.click();
741
- document.body.removeChild(a);
742
- URL.revokeObjectURL(url);
743
- };
744
-
745
- const handleDownloadPodcast = (audioUrl: string, fileName: string) => {
746
- const a = document.createElement('a');
747
- a.href = audioUrl;
748
- a.download = fileName.endsWith('.mp3') ? fileName : fileName + '.mp3';
749
- document.body.appendChild(a);
750
- a.click();
751
- document.body.removeChild(a);
752
- };
753
-
754
- const handleEditDocument = (content: string, title: string) => {
755
- setEditingDocument({ content, title });
756
- };
757
-
758
- const handleNovaConversa = () => {
759
- setMensagens([]);
760
- setConversaAtual(null);
761
- setAbaSelecionada('chat');
762
- };
763
-
764
- const handleSelecionarConversa = (conversaId: string) => {
765
- const conversa = conversas.find(c => c.id === conversaId);
766
- if (conversa) {
767
- setMensagens(conversa.messages);
768
- setConversaAtual(conversaId);
769
- setAbaSelecionada('chat');
770
- }
771
- };
772
-
773
- const handleToggleFavoritaConversa = (conversaId: string) => {
774
- setConversas(prev =>
775
- prev.map(conv =>
776
- conv.id === conversaId ? { ...conv, isFavorite: !conv.isFavorite } : conv
777
- )
778
- );
779
- };
780
-
781
- const handleOpenSearchResult = (result: SearchResult) => {
782
- console.log('Abrir resultado:', result);
783
- // Implementar lógica de navegação ou abertura de resultado
784
- };
785
-
786
- const handleExecuteSearchCommand = async (
787
- commandId: string,
788
- searchTerm: string,
789
- results: SearchResult[],
790
- messageId: string
791
- ) => {
792
- setExecutingCommand(commandId);
793
-
794
- // Simular execução de comando
795
- setTimeout(() => {
796
- if (commandId === '5') {
797
- setSavedSearches(prev => [...prev, messageId]);
798
- }
799
- setExecutingCommand(null);
800
- }, 1500);
801
- };
802
-
803
- const handleRichSuggestionClick = (suggestion: Suggestion) => {
804
- if (onRichAction) {
805
- onRichAction(suggestion.id, suggestion.text);
806
- } else {
807
- // Fallback: send as message
808
- handleEnviarMensagem(suggestion.text);
809
- }
810
- setShowMoreSuggestions(false);
811
- };
812
-
813
- const handleEvaluationClick = (messageId: string, type: 'like' | 'dislike') => {
814
- if (type === 'like') {
815
- if (onEvaluation) onEvaluation(messageId, 'like');
816
- // Update local state
817
- setMensagens(prev => prev.map(m => m.id === messageId ? { ...m, evaluation: 'like' } : m));
818
- toast.success("Obrigado por avaliar positivamente!");
819
- }
820
- };
821
-
822
- const openFeedbackDialog = (messageId: string, category: string | null) => {
823
- setEvaluationState({
824
- isOpen: true,
825
- messageId,
826
- type: 'dislike',
827
- category,
828
- reason: ''
829
- });
830
- };
831
-
832
- const handleSubmitDislike = () => {
833
- if (evaluationState.messageId) {
834
- const finalReason = evaluationState.category
835
- ? (evaluationState.reason ? `${evaluationState.category}: ${evaluationState.reason}` : evaluationState.category)
836
- : evaluationState.reason;
837
-
838
- if (onEvaluation) {
839
- onEvaluation(evaluationState.messageId, 'dislike', finalReason);
840
- }
841
-
842
- // Update local state
843
- setMensagens(prev => prev.map(m => m.id === evaluationState.messageId ? { ...m, evaluation: 'dislike', evaluationReason: finalReason } : m));
844
- toast.success("Obrigado pelo seu feedback. Vamos melhorar.");
845
- }
846
- setEvaluationState({ isOpen: false, messageId: null, type: null, category: null, reason: '' });
847
- };
848
-
849
- // ============================================================================
850
- // Computations
503
+ // State & Logic — delegated to useAssistant hook
851
504
  // ============================================================================
852
505
 
853
- const conversasFiltradas = conversas.filter(conversa => {
854
- if (abaSelecionada === 'favoritos') {
855
- return conversa.isFavorite;
856
- }
857
- return true;
506
+ const {
507
+ isFullPage,
508
+ isExpanded,
509
+ isMobile,
510
+ abaSelecionada,
511
+ setAbaSelecionada,
512
+ mensagens,
513
+ setMensagens,
514
+ mensagem,
515
+ setMensagem,
516
+ conversas,
517
+ conversaAtual,
518
+ conversasFiltradas,
519
+ copiedId,
520
+ generatingPodcastId,
521
+ executingCommand,
522
+ savedSearches,
523
+ editingDocument,
524
+ setEditingDocument,
525
+ showMoreSuggestions,
526
+ setShowMoreSuggestions,
527
+ evaluationState,
528
+ setEvaluationState,
529
+ sugestoes,
530
+ messagesEndRef,
531
+ fileInputRef,
532
+ audioInputRef,
533
+ handleToggle,
534
+ handleExpandWithTab,
535
+ handleEnviarMensagem,
536
+ handleToggleFavorite,
537
+ handleCopyMessage,
538
+ handleGeneratePodcast,
539
+ handleDownloadDocument,
540
+ handleDownloadPodcast,
541
+ handleEditDocument,
542
+ handleNovaConversa,
543
+ handleSelecionarConversa,
544
+ handleToggleFavoritaConversa,
545
+ handleOpenSearchResult,
546
+ handleExecuteSearchCommand,
547
+ handleRichSuggestionClick,
548
+ handleEvaluationClick,
549
+ openFeedbackDialog,
550
+ handleSubmitDislike,
551
+ } = useAssistant({
552
+ mode,
553
+ isExpanded: controlledIsExpanded,
554
+ onToggle,
555
+ defaultTab,
556
+ demoMode,
557
+ customResponses,
558
+ initialMessages,
559
+ savedConversations,
560
+ suggestions: propSuggestions,
561
+ onSendMessage,
562
+ isProcessing,
563
+ responseGenerator,
564
+ richSuggestions,
565
+ onRichAction,
566
+ onEvaluation,
858
567
  });
859
568
 
860
569
  // ============================================================================
@@ -927,53 +636,53 @@ export function XerticaAssistant({
927
636
  width: isFullPage ? '100%' : containerWidth,
928
637
  } : undefined}
929
638
  >
930
- {/* Document Editor Overlay */}
931
- {editingDocument && !isFullPage && (
932
- <div
933
- className={cn(
934
- "flex flex-col border-border bg-background overflow-hidden transition-all duration-300",
935
- isMobile ? "fixed inset-0 z-[110] w-full h-[100dvh]" : "absolute top-0 bottom-0 right-full w-[800px] border-l border-r border-border shadow-[-25px_0_50px_-15px_rgba(0,0,0,0.15)] z-[90]"
936
- )}
937
- style={{ maxWidth: isMobile ? 'none' : `calc(100vw - ${containerWidth})` }}
938
- >
939
- <div className="h-full flex flex-col">
940
- {/* Header Toolbar */}
941
- <div className="px-4 h-[64px] border-b border-border bg-card flex items-center justify-between">
942
- <div className="flex items-center gap-3">
943
- <div className="p-2 bg-primary/10 rounded-md">
944
- <FileText className="w-4 h-4 text-primary" />
639
+ {/* Document Editor Overlay */}
640
+ {editingDocument && !isFullPage && (
641
+ <div
642
+ className={cn(
643
+ "flex flex-col border-border bg-background overflow-hidden transition-all duration-300",
644
+ isMobile ? "fixed inset-0 z-[110] w-full h-[100dvh]" : "absolute top-0 bottom-0 right-full w-[800px] border-l border-r border-border shadow-[-25px_0_50px_-15px_rgba(0,0,0,0.15)] z-[90]"
645
+ )}
646
+ style={{ maxWidth: isMobile ? 'none' : `calc(100vw - ${containerWidth})` }}
647
+ >
648
+ <div className="h-full flex flex-col">
649
+ {/* Header Toolbar */}
650
+ <div className="px-4 h-[64px] border-b border-border bg-card flex items-center justify-between">
651
+ <div className="flex items-center gap-3">
652
+ <div className="p-2 bg-primary/10 rounded-md">
653
+ <FileText className="w-4 h-4 text-primary" />
654
+ </div>
655
+ <h3 className="font-semibold text-card-foreground text-sm">{editingDocument.title}</h3>
945
656
  </div>
946
- <h3 className="font-semibold text-card-foreground text-sm">{editingDocument.title}</h3>
657
+ <Button
658
+ variant="ghost"
659
+ size="icon"
660
+ className="h-8 w-8 rounded-full"
661
+ onClick={() => setEditingDocument(null)}
662
+ aria-label="Fechar editor de documento"
663
+ >
664
+ <X className="w-4 h-4" />
665
+ </Button>
666
+ </div>
667
+
668
+ {/* Rich Text Editor */}
669
+ <div className="flex-1 bg-muted/20 p-0 sm:p-6 overflow-hidden">
670
+ <RichTextEditor
671
+ value={editingDocument.content || ''}
672
+ onChange={(newVal) => setEditingDocument(editingDocument ? { ...editingDocument, content: newVal } : null)}
673
+ placeholder="Comece a digitar o conteúdo do seu documento aqui..."
674
+ className="max-w-4xl mx-auto h-full"
675
+ actionButton={
676
+ <Button size="sm" className="gap-2 h-8">
677
+ <Check className="w-3.5 h-3.5" />
678
+ Salvar
679
+ </Button>
680
+ }
681
+ />
947
682
  </div>
948
- <Button
949
- variant="ghost"
950
- size="icon"
951
- className="h-8 w-8 rounded-full"
952
- onClick={() => setEditingDocument(null)}
953
- aria-label="Fechar editor de documento"
954
- >
955
- <X className="w-4 h-4" />
956
- </Button>
957
- </div>
958
-
959
- {/* Rich Text Editor */}
960
- <div className="flex-1 bg-muted/20 p-0 sm:p-6 overflow-hidden">
961
- <RichTextEditor
962
- value={editingDocument.content || ''}
963
- onChange={(newVal) => setEditingDocument(prev => prev ? { ...prev, content: newVal } : null)}
964
- placeholder="Comece a digitar o conteúdo do seu documento aqui..."
965
- className="max-w-4xl mx-auto h-full"
966
- actionButton={
967
- <Button size="sm" className="gap-2 h-8">
968
- <Check className="w-3.5 h-3.5" />
969
- Salvar
970
- </Button>
971
- }
972
- />
973
683
  </div>
974
684
  </div>
975
- </div>
976
- )}
685
+ )}
977
686
  {/* Header - Toggle Button - Apenas visível quando não está em fullPage */}
978
687
  {!isFullPage && (
979
688
  <div
@@ -1187,63 +896,63 @@ export function XerticaAssistant({
1187
896
  Olá, {userName}
1188
897
  </h3>
1189
898
  <p className="text-muted-foreground">
1190
- Como posso ajudar?
899
+ {welcomeMessage}
1191
900
  </p>
1192
901
  </div>
1193
902
 
1194
903
  {/* Suggestions */}
1195
- <div className="px-4 pb-4 space-y-2">
1196
- {sugestoes.map((sugestao) => (
1197
- <button
1198
- key={sugestao.id}
1199
- onClick={() => handleEnviarMensagem(sugestao.text)}
1200
- className="w-full p-3 text-left rounded-[var(--radius-card)] bg-muted text-foreground transition-colors duration-200 hover:bg-muted/80"
1201
- >
1202
- {sugestao.text}
1203
- </button>
1204
- ))}
904
+ {(sugestoes.length > 0 || richSuggestions.length > 0) && (
905
+ <div className="px-4 pb-4 space-y-2">
906
+ {sugestoes.map((sugestao) => (
907
+ <button
908
+ key={sugestao.id}
909
+ onClick={() => handleEnviarMensagem(sugestao.text)}
910
+ className="w-full p-3 text-left rounded-[var(--radius-card)] bg-muted text-foreground transition-colors duration-200 hover:bg-muted/80"
911
+ >
912
+ {sugestao.text}
913
+ </button>
914
+ ))}
1205
915
 
1206
- {!showMoreSuggestions ? (
1207
- <Button
1208
- variant="ghost"
1209
- size="sm"
1210
- onClick={() => setShowMoreSuggestions(true)}
1211
- className="w-full justify-start text-muted-foreground"
1212
- >
1213
- <MoreHorizontal className="w-4 h-4 mr-2" />
1214
- Mais sugestões
1215
- </Button>
1216
- ) : (
1217
- <div className="space-y-2 pt-2 border-t border-border mt-2 animate-in slide-in-from-top-2">
1218
- {richSuggestions.length > 0 ? (
1219
- richSuggestions.map((sugestao) => (
1220
- <button
1221
- key={sugestao.id}
1222
- onClick={() => handleRichSuggestionClick(sugestao)}
1223
- className="w-full p-3 text-left rounded-[var(--radius-card)] bg-muted/50 border border-border text-foreground transition-all duration-200 hover:bg-primary/5 hover:border-primary/50 group"
1224
- >
1225
- <div className="flex items-center gap-2">
1226
- {sugestao.id.includes('chart') && <BarChart3 className="w-4 h-4 text-primary" />}
1227
- {sugestao.id.includes('table') && <TableIcon className="w-4 h-4 text-primary" />}
1228
- <span className="font-medium">{sugestao.text}</span>
1229
- </div>
1230
- </button>
1231
- ))
916
+ {richSuggestions.length > 0 && (
917
+ !showMoreSuggestions ? (
918
+ <Button
919
+ variant="ghost"
920
+ size="sm"
921
+ onClick={() => setShowMoreSuggestions(true)}
922
+ className="w-full justify-start text-muted-foreground"
923
+ >
924
+ <MoreHorizontal className="w-4 h-4 mr-2" />
925
+ Mais sugestões
926
+ </Button>
1232
927
  ) : (
1233
- <p className="text-sm text-muted-foreground text-center py-2">Nenhuma sugestão extra.</p>
1234
- )}
1235
- <Button
1236
- variant="ghost"
1237
- size="sm"
1238
- onClick={() => setShowMoreSuggestions(false)}
1239
- className="w-full justify-center text-muted-foreground mt-2"
1240
- >
1241
- <ChevronLeft className="w-4 h-4 mr-2" />
1242
- Voltar
1243
- </Button>
1244
- </div>
1245
- )}
1246
- </div>
928
+ <div className="space-y-2 pt-2 border-t border-border mt-2 animate-in slide-in-from-top-2">
929
+ {richSuggestions.map((sugestao) => (
930
+ <button
931
+ key={sugestao.id}
932
+ onClick={() => handleRichSuggestionClick(sugestao)}
933
+ className="w-full p-3 text-left rounded-[var(--radius-card)] bg-muted/50 border border-border text-foreground transition-all duration-200 hover:bg-primary/5 hover:border-primary/50 group"
934
+ >
935
+ <div className="flex items-center gap-2">
936
+ {sugestao.id.includes('chart') && <BarChart3 className="w-4 h-4 text-primary" />}
937
+ {sugestao.id.includes('table') && <TableIcon className="w-4 h-4 text-primary" />}
938
+ <span className="font-medium">{sugestao.text}</span>
939
+ </div>
940
+ </button>
941
+ ))}
942
+ <Button
943
+ variant="ghost"
944
+ size="sm"
945
+ onClick={() => setShowMoreSuggestions(false)}
946
+ className="w-full justify-center text-muted-foreground mt-2"
947
+ >
948
+ <ChevronLeft className="w-4 h-4 mr-2" />
949
+ Voltar
950
+ </Button>
951
+ </div>
952
+ )
953
+ )}
954
+ </div>
955
+ )}
1247
956
  </div>
1248
957
  ) : (
1249
958
  <ScrollArea className="flex-1 min-h-0 overflow-x-hidden [&_[data-radix-scroll-area-viewport]>div]:!block">
@@ -1264,14 +973,14 @@ export function XerticaAssistant({
1264
973
 
1265
974
  <div className={cn(
1266
975
  "flex flex-col min-w-0 transition-all duration-300",
1267
- msg.type === 'user'
1268
- ? "max-w-[85%] md:max-w-[70%] items-end w-fit"
976
+ msg.type === 'user'
977
+ ? "max-w-[85%] md:max-w-[70%] items-end w-fit"
1269
978
  : cn(
1270
- "items-start",
1271
- (msg.tableData || msg.chartData || msg.searchResults || msg.attachmentType === 'document')
1272
- ? "w-full max-w-full"
1273
- : "w-fit max-w-[95%] md:max-w-[90%]"
1274
- )
979
+ "items-start",
980
+ (msg.tableData || msg.chartData || msg.searchResults || msg.attachmentType === 'document')
981
+ ? "w-full max-w-full"
982
+ : "w-fit max-w-[95%] md:max-w-[90%]"
983
+ )
1275
984
  )}>
1276
985
  <div
1277
986
  className={cn(
@@ -1590,15 +1299,15 @@ export function XerticaAssistant({
1590
1299
 
1591
1300
 
1592
1301
  {enablePodcastGeneration && msg.type === 'assistant' && msg.attachmentType !== 'podcast' && (
1593
- <Button
1594
- variant="ghost"
1595
- size="sm"
1596
- onClick={() => handleGeneratePodcast(msg.id, msg.content)}
1597
- disabled={generatingPodcastId === msg.id}
1598
- className="h-6 w-6 p-0 disabled:opacity-50 text-muted-foreground"
1599
- title="Gerar Podcast"
1600
- aria-label="Gerar Podcast"
1601
- >
1302
+ <Button
1303
+ variant="ghost"
1304
+ size="sm"
1305
+ onClick={() => handleGeneratePodcast(msg.id, msg.content)}
1306
+ disabled={generatingPodcastId === msg.id}
1307
+ className="h-6 w-6 p-0 disabled:opacity-50 text-muted-foreground"
1308
+ title="Gerar Podcast"
1309
+ aria-label="Gerar Podcast"
1310
+ >
1602
1311
  {generatingPodcastId === msg.id ? (
1603
1312
  <Loader2 className="w-3 h-3 animate-spin" />
1604
1313
  ) : (
@@ -1810,7 +1519,7 @@ export function XerticaAssistant({
1810
1519
  onSubmit={handleEnviarMensagem}
1811
1520
  onFileUpload={enableFileAttachment ? () => fileInputRef.current?.click() : undefined}
1812
1521
  onAudioUpload={enableAudioInput ? () => audioInputRef.current?.click() : undefined}
1813
- placeholder="Envie uma mensagem para Xertica"
1522
+ placeholder="Envie uma mensagem"
1814
1523
  disabled={isProcessing}
1815
1524
  isFullPage={isFullPage}
1816
1525
  enableAudioInput={enableAudioInput}