xertica-ui 2.1.3 → 2.1.4

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 (404) hide show
  1. package/CHANGELOG.md +15 -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/components/assistant/index.ts +6 -6
  6. package/components/assistant/xertica-assistant/parts/AssistantCollapsedView.tsx +97 -0
  7. package/components/assistant/xertica-assistant/parts/AssistantConversationList.tsx +104 -0
  8. package/components/assistant/xertica-assistant/parts/AssistantDocumentEditor.tsx +81 -0
  9. package/components/assistant/xertica-assistant/parts/AssistantFeedbackDialog.tsx +86 -0
  10. package/components/assistant/xertica-assistant/parts/AssistantHeader.tsx +77 -0
  11. package/components/assistant/xertica-assistant/parts/AssistantMessageBubble.tsx +573 -0
  12. package/components/assistant/xertica-assistant/parts/AssistantTabBar.tsx +65 -0
  13. package/components/assistant/xertica-assistant/parts/AssistantTypingIndicator.tsx +41 -0
  14. package/components/assistant/xertica-assistant/parts/AssistantWelcomeScreen.tsx +98 -0
  15. package/components/assistant/xertica-assistant/parts/index.ts +16 -0
  16. package/components/assistant/xertica-assistant/types.ts +139 -0
  17. package/components/assistant/xertica-assistant/use-assistant.ts +5 -10
  18. package/components/assistant/xertica-assistant/xertica-assistant.tsx +125 -1096
  19. package/components/blocks/card-patterns/ActivityCard.tsx +72 -72
  20. package/components/blocks/card-patterns/FeatureCard.tsx +100 -100
  21. package/components/blocks/card-patterns/NotificationCard.tsx +127 -127
  22. package/components/blocks/card-patterns/ProfileCard.tsx +84 -84
  23. package/components/blocks/card-patterns/ProjectCard.tsx +89 -89
  24. package/components/blocks/card-patterns/QuickActionCard.tsx +62 -62
  25. package/components/blocks/card-patterns/card-patterns.stories.tsx +445 -445
  26. package/components/blocks/card-patterns/index.ts +17 -17
  27. package/components/blocks/index.ts +1 -1
  28. package/components/brand/index.ts +6 -6
  29. package/components/brand/theme-toggle/ThemeToggle.tsx +8 -27
  30. package/components/brand/xertica-provider/XerticaProvider.tsx +48 -48
  31. package/components/brand/xertica-provider/xertica-provider.mdx +61 -61
  32. package/components/brand/xertica-provider/xertica-provider.test.tsx +52 -52
  33. package/components/examples/MapExamples.tsx +282 -282
  34. package/components/examples/SimpleFilterableMap.tsx +191 -191
  35. package/components/examples/index.ts +51 -51
  36. package/components/figma/ImageWithFallback.tsx +27 -27
  37. package/components/hooks/index.ts +10 -7
  38. package/components/hooks/use-layout-shortcuts.ts +46 -0
  39. package/components/index.ts +5 -5
  40. package/components/layout/header/header.test.tsx +8 -8
  41. package/components/layout/header/header.tsx +4 -4
  42. package/components/layout/index.ts +2 -2
  43. package/components/layout/sidebar/sidebar.mdx +1 -1
  44. package/components/layout/sidebar/sidebar.test.tsx +11 -11
  45. package/components/layout/sidebar/sidebar.tsx +1 -31
  46. package/components/layout/sidebar/use-sidebar.ts +2 -11
  47. package/components/media/FloatingMediaWrapper.tsx +11 -11
  48. package/components/media/audio-player/AudioPlayer.tsx +140 -215
  49. package/components/media/audio-player/use-audio-player.ts +298 -0
  50. package/components/media/index.ts +3 -3
  51. package/components/pages/home-content/HomeContent.tsx +7 -7
  52. package/components/pages/home-content/home-content.mdx +62 -62
  53. package/components/pages/home-page/HomePage.stories.tsx +39 -39
  54. package/components/pages/home-page/home-page.mdx +53 -53
  55. package/components/pages/index.ts +8 -8
  56. package/components/pages/template-content/template-content.mdx +61 -61
  57. package/components/pages/template-page/TemplatePage.stories.tsx +39 -39
  58. package/components/pages/template-page/template-page.mdx +53 -53
  59. package/components/public-api-smoke.test.tsx +52 -52
  60. package/components/shared/CustomTooltipContent.tsx +52 -0
  61. package/components/shared/assistant-utils.ts +43 -43
  62. package/components/ui/accordion/accordion.mdx +8 -8
  63. package/components/ui/accordion/accordion.stories.tsx +53 -53
  64. package/components/ui/alert/alert.mdx +8 -8
  65. package/components/ui/alert-dialog/alert-dialog.mdx +8 -8
  66. package/components/ui/aspect-ratio/aspect-ratio.mdx +8 -8
  67. package/components/ui/assistant-chart/assistant-chart.mdx +8 -8
  68. package/components/ui/avatar/avatar.mdx +8 -8
  69. package/components/ui/badge/badge.mdx +8 -8
  70. package/components/ui/badge/badge.tsx +9 -9
  71. package/components/ui/breadcrumb/breadcrumb.mdx +8 -8
  72. package/components/ui/button/button.mdx +8 -8
  73. package/components/ui/calendar/calendar.mdx +8 -8
  74. package/components/ui/calendar/calendar.tsx +258 -258
  75. package/components/ui/card/card.mdx +8 -8
  76. package/components/ui/card/card.stories.tsx +245 -245
  77. package/components/ui/carousel/carousel.mdx +8 -8
  78. package/components/ui/chart/chart.mdx +8 -8
  79. package/components/ui/chart/chart.stories.tsx +1303 -1303
  80. package/components/ui/chart/chart.test.tsx +154 -154
  81. package/components/ui/chart/chart.tsx +2367 -2367
  82. package/components/ui/checkbox/checkbox.mdx +8 -8
  83. package/components/ui/checkbox/checkbox.stories.tsx +20 -20
  84. package/components/ui/collapsible/collapsible.mdx +8 -8
  85. package/components/ui/command/command.mdx +8 -8
  86. package/components/ui/context-menu/context-menu.mdx +8 -8
  87. package/components/ui/dialog/dialog.mdx +8 -8
  88. package/components/ui/drawer/drawer.mdx +8 -8
  89. package/components/ui/dropdown-menu/dropdown-menu.mdx +8 -8
  90. package/components/ui/empty/empty.mdx +8 -8
  91. package/components/ui/file-upload/file-upload.mdx +8 -8
  92. package/components/ui/google-maps-loader/google-maps-loader.tsx +2 -2
  93. package/components/ui/hover-card/hover-card.mdx +8 -8
  94. package/components/ui/input/input.mdx +8 -8
  95. package/components/ui/input-otp/input-otp.mdx +8 -8
  96. package/components/ui/input-otp/input-otp.stories.tsx +6 -6
  97. package/components/ui/label/label.mdx +8 -8
  98. package/components/ui/map/map.mdx +8 -8
  99. package/components/ui/map/map.stories.tsx +51 -51
  100. package/components/ui/map/map.tsx +2 -2
  101. package/components/ui/menubar/menubar.mdx +8 -8
  102. package/components/ui/navigation-menu/navigation-menu.mdx +8 -8
  103. package/components/ui/notification-badge/notification-badge.mdx +8 -8
  104. package/components/ui/pagination/pagination.mdx +8 -8
  105. package/components/ui/popover/popover.mdx +8 -8
  106. package/components/ui/progress/progress.mdx +8 -8
  107. package/components/ui/progress/progress.tsx +68 -68
  108. package/components/ui/radio-group/radio-group.mdx +8 -8
  109. package/components/ui/rating/rating.mdx +8 -8
  110. package/components/ui/resizable/resizable.mdx +8 -8
  111. package/components/ui/route-map/route-map.mdx +8 -8
  112. package/components/ui/route-map/route-map.stories.tsx +54 -54
  113. package/components/ui/route-map/route-map.tsx +2 -2
  114. package/components/ui/scroll-area/scroll-area.mdx +8 -8
  115. package/components/ui/search/search.mdx +8 -8
  116. package/components/ui/select/select.mdx +8 -8
  117. package/components/ui/select/select.stories.tsx +9 -9
  118. package/components/ui/separator/separator.mdx +8 -8
  119. package/components/ui/sheet/sheet.mdx +8 -8
  120. package/components/ui/sheet/sheet.stories.tsx +95 -95
  121. package/components/ui/simple-map/simple-map.mdx +8 -8
  122. package/components/ui/simple-map/simple-map.stories.tsx +48 -48
  123. package/components/ui/skeleton/skeleton.mdx +8 -8
  124. package/components/ui/slider/slider.mdx +8 -8
  125. package/components/ui/sonner/sonner.mdx +8 -8
  126. package/components/ui/stats-card/stats-card.mdx +8 -8
  127. package/components/ui/stepper/stepper.mdx +8 -8
  128. package/components/ui/switch/switch.mdx +8 -8
  129. package/components/ui/switch/switch.stories.tsx +20 -20
  130. package/components/ui/table/table.mdx +8 -8
  131. package/components/ui/tabs/tabs.mdx +8 -8
  132. package/components/ui/tabs/tabs.stories.tsx +26 -26
  133. package/components/ui/textarea/textarea.mdx +8 -8
  134. package/components/ui/timeline/timeline.mdx +8 -8
  135. package/components/ui/toggle/toggle.mdx +8 -8
  136. package/components/ui/toggle-group/toggle-group.mdx +8 -8
  137. package/components/ui/tooltip/tooltip.mdx +8 -8
  138. package/components/ui/tree-view/tree-view.mdx +8 -8
  139. package/components.json +1512 -1512
  140. package/contexts/ApiKeyContext.tsx +72 -72
  141. package/contexts/AssistenteContext.tsx +17 -54
  142. package/contexts/BrandColorsContext.tsx +32 -43
  143. package/contexts/LanguageContext.tsx +13 -13
  144. package/contexts/LayoutContext.test.tsx +11 -11
  145. package/contexts/LayoutContext.tsx +24 -50
  146. package/contexts/ThemeContext.tsx +26 -26
  147. package/contexts/theme-data.ts +4 -4
  148. package/dist/{AssistantChart-DoZCyS5r.cjs → AssistantChart-9w31gdAb.cjs} +4 -4
  149. package/dist/{AssistantChart-CldVCVDe.cjs → AssistantChart-BAudAfne.cjs} +5 -5
  150. package/dist/{use-mobile-DRB3BQgD.cjs → AssistantChart-BAx9VQvb.cjs} +209 -1070
  151. package/dist/{AssistantChart-Cu3m7RBo.js → AssistantChart-BP8upjMk.js} +5 -5
  152. package/dist/{use-mobile-BvYdisLP.js → AssistantChart-CVko2A1W.js} +171 -1025
  153. package/dist/{AssistantChart-C_hwFRRr.js → AssistantChart-CVzmmhx4.js} +4 -4
  154. package/dist/{AudioPlayer-C12BjQBV.cjs → AudioPlayer-1ypwE2Wh.cjs} +126 -187
  155. package/dist/{AudioPlayer-DcFKRJE_.js → AudioPlayer-DuKXrCfy.js} +80 -141
  156. package/dist/CustomTooltipContent-DHjkY0ww.js +40 -0
  157. package/dist/CustomTooltipContent-c_K-DWRr.cjs +56 -0
  158. package/dist/{ThemeContext-BoH4NLfN.js → LanguageContext-BwhwC3G2.js} +27 -104
  159. package/dist/{ThemeContext-r69W20Xg.cjs → LanguageContext-DvUt5jBg.cjs} +27 -104
  160. package/dist/{LayoutContext-BvK-ggDa.cjs → LayoutContext-BDmcZfMH.cjs} +8 -20
  161. package/dist/{LayoutContext-BAql6ZRY.js → LayoutContext-dbQvdC4O.js} +8 -20
  162. package/dist/{ThemeContext-C2EwAPDt.js → ThemeContext-BbBNoFTG.js} +2 -2
  163. package/dist/{ThemeContext-vTjumZeM.cjs → ThemeContext-Cmr8Ex8H.cjs} +2 -2
  164. package/dist/ThemeContext-RTy1m2Uq.js +82 -0
  165. package/dist/ThemeContext-bSzuOit2.cjs +81 -0
  166. package/dist/VerifyEmailPage-BE-L9mB7.js +2828 -0
  167. package/dist/{VerifyEmailPage-Cwi3kbol.cjs → VerifyEmailPage-Bae2cBXT.cjs} +7 -7
  168. package/dist/VerifyEmailPage-CR7kb5df.cjs +2827 -0
  169. package/dist/{VerifyEmailPage-C0c2e5n0.js → VerifyEmailPage-C_ihbcth.js} +6 -6
  170. package/dist/VerifyEmailPage-CbgjOF0v.js +2828 -0
  171. package/dist/{VerifyEmailPage-DvMLZgFt.js → VerifyEmailPage-CdYPSJoO.js} +1 -1
  172. package/dist/{VerifyEmailPage-CYXtbKi3.cjs → VerifyEmailPage-DMBh4NM9.cjs} +1 -1
  173. package/dist/VerifyEmailPage-Dt7zgA4w.cjs +2827 -0
  174. package/dist/{XerticaProvider-CEoWMTxu.js → XerticaProvider-BITjgC5p.js} +2 -2
  175. package/dist/{XerticaProvider-CllrbMEJ.cjs → XerticaProvider-By8q3Roe.cjs} +2 -2
  176. package/dist/{XerticaProvider-cI9hSs27.cjs → XerticaProvider-CW9hpCdF.cjs} +9 -8
  177. package/dist/{XerticaProvider-DDuiIcKo.js → XerticaProvider-siSt9uG2.js} +5 -4
  178. package/dist/{LanguageSelector-D6uacAIM.cjs → XerticaXLogo-D8jf0SNv.cjs} +86 -102
  179. package/dist/{LanguageSelector-B5YfbHra.js → XerticaXLogo-fAJMy3H4.js} +87 -103
  180. package/dist/{alert-dialog-s-vmNkJ_.js → alert-dialog-iDe5VE5o.js} +3 -3
  181. package/dist/{alert-dialog-DSKByiKZ.cjs → alert-dialog-yckpaOpy.cjs} +3 -3
  182. package/dist/assistant.cjs.js +1 -1
  183. package/dist/assistant.es.js +1 -1
  184. package/dist/brand.cjs.js +2 -2
  185. package/dist/brand.es.js +2 -2
  186. package/dist/components/assistant/xertica-assistant/parts/AssistantCollapsedView.d.ts +13 -0
  187. package/dist/components/assistant/xertica-assistant/parts/AssistantConversationList.d.ts +16 -0
  188. package/dist/components/assistant/xertica-assistant/parts/AssistantDocumentEditor.d.ts +17 -0
  189. package/dist/components/assistant/xertica-assistant/parts/AssistantFeedbackDialog.d.ts +19 -0
  190. package/dist/components/assistant/xertica-assistant/parts/AssistantHeader.d.ts +11 -0
  191. package/dist/components/assistant/xertica-assistant/parts/AssistantMessageBubble.d.ts +29 -0
  192. package/dist/components/assistant/xertica-assistant/parts/AssistantTabBar.d.ts +13 -0
  193. package/dist/components/assistant/xertica-assistant/parts/AssistantTypingIndicator.d.ts +4 -0
  194. package/dist/components/assistant/xertica-assistant/parts/AssistantWelcomeScreen.d.ts +17 -0
  195. package/dist/components/assistant/xertica-assistant/parts/index.d.ts +16 -0
  196. package/dist/components/assistant/xertica-assistant/types.d.ts +106 -0
  197. package/dist/components/assistant/xertica-assistant/use-assistant.d.ts +1 -2
  198. package/dist/components/assistant/xertica-assistant/xertica-assistant.d.ts +2 -96
  199. package/dist/components/hooks/index.d.ts +3 -0
  200. package/dist/components/hooks/use-layout-shortcuts.d.ts +22 -0
  201. package/dist/components/media/audio-player/AudioPlayer.d.ts +4 -1
  202. package/dist/components/media/audio-player/use-audio-player.d.ts +72 -0
  203. package/dist/components/shared/CustomTooltipContent.d.ts +20 -0
  204. package/dist/components/ui/alert/alert.d.ts +1 -1
  205. package/dist/components/ui/badge/badge.d.ts +1 -1
  206. package/dist/components/ui/button/button.d.ts +2 -2
  207. package/dist/contexts/AssistenteContext.d.ts +10 -49
  208. package/dist/{google-maps-loader-Y-QkD-Li.cjs → google-maps-loader-BqsYL48U.cjs} +0 -5
  209. package/dist/{google-maps-loader-CTYySAun.js → google-maps-loader-t2IlYBzw.js} +0 -4
  210. package/dist/hooks.cjs.js +30 -10
  211. package/dist/hooks.es.js +25 -4
  212. package/dist/index-CkTUgOwX.js +8 -0
  213. package/dist/{index-COtD8bRW.cjs → index-D3RLKRAs.cjs} +1 -1
  214. package/dist/index.cjs.js +11 -11
  215. package/dist/index.es.js +11 -11
  216. package/dist/index.umd.js +454 -1027
  217. package/dist/layout.cjs.js +3 -10
  218. package/dist/layout.es.js +3 -10
  219. package/dist/media.cjs.js +1 -1
  220. package/dist/media.es.js +1 -1
  221. package/dist/pages.cjs.js +1 -1
  222. package/dist/pages.es.js +1 -1
  223. package/dist/{sidebar-CK_0ZQHj.cjs → sidebar-CVUGHOS_.cjs} +10 -57
  224. package/dist/{sidebar-CUuOvYhK.js → sidebar-CmvwjnVb.js} +10 -40
  225. package/dist/ui.cjs.js +4 -4
  226. package/dist/ui.es.js +4 -4
  227. package/dist/use-audio-player-Bkh23vQ3.js +177 -0
  228. package/dist/use-audio-player-Dn1NR9xN.cjs +176 -0
  229. package/dist/utils/color-utils.d.ts +51 -0
  230. package/dist/{xertica-assistant-dyP7KHM5.cjs → xertica-assistant-B1IaHXnB.cjs} +388 -529
  231. package/dist/xertica-assistant-BMqdyRVi.js +2082 -0
  232. package/dist/xertica-assistant-Bj3vBCq_.cjs +2081 -0
  233. package/dist/{xertica-assistant-yX1CFBBo.js → xertica-assistant-DPsESB6t.js} +390 -531
  234. package/dist/{CodeBlock-BgfYL_rD.cjs → xertica-assistant-Qp3ydksa.cjs} +51 -263
  235. package/dist/{CodeBlock-DnYNI8rQ.js → xertica-assistant-gnCJdcZY.js} +7 -219
  236. package/dist/xertica-ui.css +2 -2
  237. package/docs/architecture-improvements.md +463 -0
  238. package/docs/architecture.md +1 -1
  239. package/docs/components/assistant-chart.md +1 -1
  240. package/docs/components/audio-player.md +46 -0
  241. package/docs/components/branding.md +251 -0
  242. package/docs/components/calendar.md +154 -154
  243. package/docs/components/card-patterns.md +337 -337
  244. package/docs/components/card.md +235 -235
  245. package/docs/components/code-block.md +108 -0
  246. package/docs/components/formatted-document.md +113 -0
  247. package/docs/components/hooks.md +430 -0
  248. package/docs/components/image-with-fallback.md +106 -0
  249. package/docs/components/map-layers.md +140 -0
  250. package/docs/components/map.md +84 -84
  251. package/docs/components/modern-chat-input.md +163 -0
  252. package/docs/components/pages.md +351 -0
  253. package/docs/components/xertica-provider.md +24 -24
  254. package/docs/decision-tree.md +287 -287
  255. package/docs/doc-audit.md +223 -0
  256. package/docs/getting-started.md +154 -0
  257. package/docs/llms.md +25 -5
  258. package/docs/patterns/detail-page.md +276 -0
  259. package/docs/patterns/settings.md +346 -0
  260. package/docs/patterns/wizard.md +217 -0
  261. package/guidelines/Guidelines.md +252 -252
  262. package/hooks/useTheme.ts +3 -3
  263. package/imports/Podcast.tsx +388 -388
  264. package/imports/XerticaAi.tsx +45 -45
  265. package/imports/XerticaX.tsx +19 -19
  266. package/imports/svg-aueiaqngck.ts +11 -11
  267. package/imports/svg-v9krss1ozd.ts +16 -16
  268. package/imports/svg-vhrdofe3qe.ts +5 -5
  269. package/llms-compact.txt +327 -327
  270. package/llms.txt +160 -160
  271. package/package.json +203 -203
  272. package/styles/xertica/app-overrides/chat.css +61 -61
  273. package/styles/xertica/app-overrides/scrollbar.css +33 -33
  274. package/styles/xertica/integrations/google-maps.css +76 -76
  275. package/styles/xertica/integrations/sonner.css +73 -73
  276. package/templates/CLAUDE.md +182 -182
  277. package/templates/guidelines/Guidelines.md +325 -325
  278. package/templates/package.json +2 -2
  279. package/templates/src/features/auth/index.ts +4 -4
  280. package/templates/src/features/auth/ui/AuthPageShell.tsx +34 -34
  281. package/templates/src/features/auth/ui/ForgotPasswordContent.tsx +70 -70
  282. package/templates/src/features/auth/ui/LoginContent.tsx +90 -90
  283. package/templates/src/features/auth/ui/ResetPasswordContent.tsx +151 -151
  284. package/templates/src/features/auth/ui/SocialLoginButtons.tsx +59 -59
  285. package/templates/src/features/auth/ui/VerifyEmailContent.tsx +82 -82
  286. package/templates/src/features/home/index.ts +1 -1
  287. package/templates/src/features/home/ui/HomeContent.tsx +100 -100
  288. package/templates/src/features/template/index.ts +5 -5
  289. package/templates/src/features/template/ui/CrudTemplate.tsx +3 -3
  290. package/templates/src/features/template/ui/DashboardTemplate.tsx +3 -3
  291. package/templates/src/features/template/ui/FormTemplate.tsx +120 -120
  292. package/templates/src/features/template/ui/LoginTemplate.tsx +3 -3
  293. package/templates/src/pages/AssistantPage.tsx +328 -328
  294. package/templates/src/pages/ForgotPasswordPage.tsx +6 -6
  295. package/templates/src/pages/HomePage.tsx +57 -57
  296. package/templates/src/pages/LoginPage.tsx +10 -10
  297. package/templates/src/pages/ResetPasswordPage.tsx +6 -6
  298. package/templates/src/pages/TemplatePage.tsx +30 -30
  299. package/templates/src/pages/VerifyEmailPage.tsx +6 -6
  300. package/templates/src/shared/config/navigation.ts +20 -20
  301. package/templates/src/shared/lib/auth.ts +20 -20
  302. package/templates/src/shared/types/auth.ts +3 -3
  303. package/templates/tsconfig.json +5 -5
  304. package/utils/color-utils.ts +72 -0
  305. package/utils/gemini.ts +140 -140
  306. package/dist/AudioPlayer-B1lt5cPl.cjs +0 -989
  307. package/dist/AudioPlayer-BZ7bibzU.cjs +0 -982
  308. package/dist/AudioPlayer-DMcG_c7L.js +0 -990
  309. package/dist/AudioPlayer-e8LfNoqO.js +0 -983
  310. package/dist/CodeBlock-7TTgmdGG.cjs +0 -2094
  311. package/dist/CodeBlock-BeSt1h5P.js +0 -2078
  312. package/dist/CodeBlock-BlcqlA9M.cjs +0 -2094
  313. package/dist/CodeBlock-Bnmeu5ez.cjs +0 -2094
  314. package/dist/CodeBlock-BtfPlbAI.js +0 -2078
  315. package/dist/CodeBlock-CIySIuYr.js +0 -2078
  316. package/dist/CodeBlock-CuPtUM-7.cjs +0 -2094
  317. package/dist/CodeBlock-D6ffWXgc.js +0 -2078
  318. package/dist/CodeBlock-D8dcwbit.cjs +0 -2094
  319. package/dist/CodeBlock-DMZrFnlw.cjs +0 -2094
  320. package/dist/CodeBlock-DlBehYN8.js +0 -2078
  321. package/dist/CodeBlock-DvKWbSnE.cjs +0 -2094
  322. package/dist/CodeBlock-DwMCfkFY.js +0 -2078
  323. package/dist/CodeBlock-Dy6CNYyj.js +0 -2078
  324. package/dist/CodeBlock-U1pPOQI7.cjs +0 -2094
  325. package/dist/CodeBlock-f_GpNhEB.js +0 -2078
  326. package/dist/CodeBlock-oB6u8nI1.js +0 -2078
  327. package/dist/CodeBlock-tZC31B73.cjs +0 -2094
  328. package/dist/ImageWithFallback-CGtidP6B.cjs +0 -4542
  329. package/dist/ImageWithFallback-lsg3pdFg.js +0 -4508
  330. package/dist/XerticaOrbe-KL1RBHzw.cjs +0 -1354
  331. package/dist/XerticaOrbe-zwS1p2a8.js +0 -1355
  332. package/dist/XerticaProvider-6btlAlzc.js +0 -17
  333. package/dist/XerticaProvider-BNoNOxQ5.cjs +0 -16
  334. package/dist/XerticaProvider-BlY2limY.cjs +0 -38
  335. package/dist/XerticaProvider-hSwhNQex.js +0 -39
  336. package/dist/breadcrumb-CqJ7bHY5.js +0 -161
  337. package/dist/breadcrumb-m9Hb2_XN.cjs +0 -177
  338. package/dist/components/blocks/audio-player/AudioPlayer.d.ts +0 -35
  339. package/dist/components/blocks/audio-player/index.d.ts +0 -1
  340. package/dist/components/blocks/document-editor/DocumentEditor.d.ts +0 -26
  341. package/dist/components/blocks/document-editor/index.d.ts +0 -1
  342. package/dist/components/blocks/podcast-player/PodcastPlayer.d.ts +0 -41
  343. package/dist/components/blocks/podcast-player/index.d.ts +0 -1
  344. package/dist/dropdown-menu-BDB5CmQs.cjs +0 -247
  345. package/dist/dropdown-menu-DQidbKBD.js +0 -231
  346. package/dist/google-maps-loader-BFWp6VPd.js +0 -287
  347. package/dist/google-maps-loader-eS3uQ5TA.cjs +0 -287
  348. package/dist/header-Cgy6vYPk.cjs +0 -731
  349. package/dist/header-DRlT4jgI.js +0 -715
  350. package/dist/header-Dux00SI4.cjs +0 -731
  351. package/dist/header-EkGKXPsD.js +0 -715
  352. package/dist/header-WfEywpyc.cjs +0 -731
  353. package/dist/header-tifNQn2U.js +0 -715
  354. package/dist/index-BhapVLVj.js +0 -8
  355. package/dist/index-D6fxYEY8.cjs +0 -7
  356. package/dist/index-DW5tYe26.js +0 -8
  357. package/dist/input-2R4loU86.js +0 -127
  358. package/dist/input-DWANSKGb.cjs +0 -145
  359. package/dist/rich-text-editor-0mraWT5y.cjs +0 -2376
  360. package/dist/rich-text-editor-B6jMRLzk.cjs +0 -1939
  361. package/dist/rich-text-editor-B8_oYcIR.js +0 -1730
  362. package/dist/rich-text-editor-B9UbSXNb.js +0 -1203
  363. package/dist/rich-text-editor-BYuRBNBU.js +0 -2373
  364. package/dist/rich-text-editor-Bb9pySTs.cjs +0 -2374
  365. package/dist/rich-text-editor-BcL6L3cm.cjs +0 -2374
  366. package/dist/rich-text-editor-BoVZYtTs.cjs +0 -2391
  367. package/dist/rich-text-editor-CPV1lEPH.cjs +0 -1748
  368. package/dist/rich-text-editor-CoKqbCtu.cjs +0 -1799
  369. package/dist/rich-text-editor-Cw56T_mB.js +0 -2356
  370. package/dist/rich-text-editor-Cyt8qs2b.js +0 -1921
  371. package/dist/rich-text-editor-D6H84OcX.cjs +0 -1220
  372. package/dist/rich-text-editor-D76gD-QI.js +0 -2328
  373. package/dist/rich-text-editor-DKkokOnA.js +0 -1781
  374. package/dist/rich-text-editor-DNsdpN64.cjs +0 -2359
  375. package/dist/rich-text-editor-DfG8bCyY.js +0 -2358
  376. package/dist/rich-text-editor-Dxjw31Z4.js +0 -2341
  377. package/dist/rich-text-editor-DzP0Epmb.js +0 -2356
  378. package/dist/rich-text-editor-skplNlBM.cjs +0 -2345
  379. package/dist/select-Bkbr0f-Z.cjs +0 -162
  380. package/dist/select-CvIVdX2n.js +0 -145
  381. package/dist/slider-Bc5Hd0y1.js +0 -56
  382. package/dist/slider-N7hFFj6X.cjs +0 -73
  383. package/dist/tooltip-Ded96neP.cjs +0 -137
  384. package/dist/tooltip-HDOoD2-0.js +0 -120
  385. package/dist/use-mobile-B0hNy_Y6.cjs +0 -4303
  386. package/dist/use-mobile-BXuYROXM.js +0 -4202
  387. package/dist/use-mobile-Bbd51ASU.cjs +0 -4392
  388. package/dist/use-mobile-Bk6CX-TC.js +0 -4359
  389. package/dist/use-mobile-BzuxjzNX.cjs +0 -4392
  390. package/dist/use-mobile-CG2-SdXV.cjs +0 -4235
  391. package/dist/use-mobile-CKb5pqTs.js +0 -4269
  392. package/dist/use-mobile-CYuAuGDl.js +0 -4202
  393. package/dist/use-mobile-CaENcqm-.js +0 -4508
  394. package/dist/use-mobile-CbrYgJGJ.js +0 -4203
  395. package/dist/use-mobile-DMOvImGQ.cjs +0 -4542
  396. package/dist/use-mobile-DZvv7QMR.js +0 -4359
  397. package/dist/use-mobile-DdI_TXam.cjs +0 -4235
  398. package/dist/use-mobile-DlceKf8a.js +0 -4359
  399. package/dist/use-mobile-DsOnow1o.cjs +0 -4236
  400. package/dist/use-mobile-Kcj6jSnK.cjs +0 -4392
  401. package/dist/use-mobile-bnKcua_i.js +0 -4202
  402. package/dist/use-mobile-ncXBeE2z.cjs +0 -4235
  403. package/dist/{rich-text-editor-DgF8s7xW.js → rich-text-editor-BmsjY03B.js} +26 -26
  404. package/dist/{rich-text-editor-mWoaSCE4.cjs → rich-text-editor-GS2kpTAK.cjs} +26 -26
@@ -1,72 +1,72 @@
1
- "use client"
2
-
3
- import * as React from "react"
4
- import { Card, CardHeader, CardTitle, CardContent, CardAction } from "../../ui/card"
5
- import { Avatar, AvatarFallback, AvatarImage } from "../../ui/avatar"
6
- import { Badge } from "../../ui/badge"
7
- import { cn } from "../../shared/utils"
8
-
9
- export interface ActivityItem {
10
- id: string
11
- user: { name: string; avatar?: string; initials: string }
12
- action: string
13
- target: string
14
- time: string
15
- type?: "create" | "update" | "delete" | "comment" | "deploy"
16
- }
17
-
18
- export interface ActivityCardProps extends React.HTMLAttributes<HTMLDivElement> {
19
- title?: string
20
- items: ActivityItem[]
21
- action?: React.ReactNode
22
- maxItems?: number
23
- }
24
-
25
- const activityTypeBadge: Record<NonNullable<ActivityItem["type"]>, { label: string; variant: React.ComponentProps<typeof Badge>["variant"] }> = {
26
- create: { label: "Criado", variant: "success" },
27
- update: { label: "Atualizado", variant: "info" },
28
- delete: { label: "Removido", variant: "destructive" },
29
- comment: { label: "Comentou", variant: "secondary" },
30
- deploy: { label: "Deploy", variant: "default" },
31
- }
32
-
33
- export function ActivityCard({ title = "Atividade Recente", items, action, maxItems = 5, className, ...props }: ActivityCardProps) {
34
- const visible = items.slice(0, maxItems)
35
-
36
- return (
37
- <Card className={cn("w-full", className)} {...props}>
38
- <CardHeader>
39
- <CardTitle>{title}</CardTitle>
40
- {action && <CardAction>{action}</CardAction>}
41
- </CardHeader>
42
- <CardContent className="px-6 pb-6">
43
- <ul className="space-y-4">
44
- {visible.map((item) => {
45
- const badge = item.type ? activityTypeBadge[item.type] : null
46
- return (
47
- <li key={item.id} className="flex items-start gap-3">
48
- <Avatar className="size-8 shrink-0">
49
- {item.user.avatar && <AvatarImage src={item.user.avatar} alt={item.user.name} />}
50
- <AvatarFallback className="text-xs">{item.user.initials}</AvatarFallback>
51
- </Avatar>
52
- <div className="flex-1 min-w-0">
53
- <p className="text-sm leading-snug">
54
- <span className="font-medium">{item.user.name}</span>
55
- {" "}{item.action}{" "}
56
- <span className="font-medium">{item.target}</span>
57
- </p>
58
- <p className="text-xs text-muted-foreground mt-0.5">{item.time}</p>
59
- </div>
60
- {badge && (
61
- <Badge variant={badge.variant} className="shrink-0 text-xs">
62
- {badge.label}
63
- </Badge>
64
- )}
65
- </li>
66
- )
67
- })}
68
- </ul>
69
- </CardContent>
70
- </Card>
71
- )
72
- }
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { Card, CardHeader, CardTitle, CardContent, CardAction } from "../../ui/card"
5
+ import { Avatar, AvatarFallback, AvatarImage } from "../../ui/avatar"
6
+ import { Badge } from "../../ui/badge"
7
+ import { cn } from "../../shared/utils"
8
+
9
+ export interface ActivityItem {
10
+ id: string
11
+ user: { name: string; avatar?: string; initials: string }
12
+ action: string
13
+ target: string
14
+ time: string
15
+ type?: "create" | "update" | "delete" | "comment" | "deploy"
16
+ }
17
+
18
+ export interface ActivityCardProps extends React.HTMLAttributes<HTMLDivElement> {
19
+ title?: string
20
+ items: ActivityItem[]
21
+ action?: React.ReactNode
22
+ maxItems?: number
23
+ }
24
+
25
+ const activityTypeBadge: Record<NonNullable<ActivityItem["type"]>, { label: string; variant: React.ComponentProps<typeof Badge>["variant"] }> = {
26
+ create: { label: "Criado", variant: "success" },
27
+ update: { label: "Atualizado", variant: "info" },
28
+ delete: { label: "Removido", variant: "destructive" },
29
+ comment: { label: "Comentou", variant: "secondary" },
30
+ deploy: { label: "Deploy", variant: "default" },
31
+ }
32
+
33
+ export function ActivityCard({ title = "Atividade Recente", items, action, maxItems = 5, className, ...props }: ActivityCardProps) {
34
+ const visible = items.slice(0, maxItems)
35
+
36
+ return (
37
+ <Card className={cn("w-full", className)} {...props}>
38
+ <CardHeader>
39
+ <CardTitle>{title}</CardTitle>
40
+ {action && <CardAction>{action}</CardAction>}
41
+ </CardHeader>
42
+ <CardContent className="px-6 pb-6">
43
+ <ul className="space-y-4">
44
+ {visible.map((item) => {
45
+ const badge = item.type ? activityTypeBadge[item.type] : null
46
+ return (
47
+ <li key={item.id} className="flex items-start gap-3">
48
+ <Avatar className="size-8 shrink-0">
49
+ {item.user.avatar && <AvatarImage src={item.user.avatar} alt={item.user.name} />}
50
+ <AvatarFallback className="text-xs">{item.user.initials}</AvatarFallback>
51
+ </Avatar>
52
+ <div className="flex-1 min-w-0">
53
+ <p className="text-sm leading-snug">
54
+ <span className="font-medium">{item.user.name}</span>
55
+ {" "}{item.action}{" "}
56
+ <span className="font-medium">{item.target}</span>
57
+ </p>
58
+ <p className="text-xs text-muted-foreground mt-0.5">{item.time}</p>
59
+ </div>
60
+ {badge && (
61
+ <Badge variant={badge.variant} className="shrink-0 text-xs">
62
+ {badge.label}
63
+ </Badge>
64
+ )}
65
+ </li>
66
+ )
67
+ })}
68
+ </ul>
69
+ </CardContent>
70
+ </Card>
71
+ )
72
+ }
@@ -1,100 +1,100 @@
1
- "use client"
2
-
3
- import * as React from "react"
4
- import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from "../../ui/card"
5
- import { Button } from "../../ui/button"
6
- import { Badge } from "../../ui/badge"
7
- import { cn } from "../../shared/utils"
8
-
9
- export type FeatureCardColor =
10
- | "primary"
11
- | "chart-1"
12
- | "chart-2"
13
- | "chart-3"
14
- | "chart-4"
15
- | "chart-5"
16
- | "success"
17
- | "info"
18
- | "warning"
19
- | "destructive"
20
-
21
- const colorTokens: Record<FeatureCardColor, { bg: string; icon: string }> = {
22
- primary: { bg: "bg-primary/10", icon: "text-primary" },
23
- "chart-1": { bg: "bg-[var(--chart-1)]/15", icon: "text-[var(--chart-1)]" },
24
- "chart-2": { bg: "bg-[var(--chart-2)]/15", icon: "text-[var(--chart-2)]" },
25
- "chart-3": { bg: "bg-[var(--chart-3)]/15", icon: "text-[var(--chart-3)]" },
26
- "chart-4": { bg: "bg-[var(--chart-4)]/15", icon: "text-[var(--chart-4)]" },
27
- "chart-5": { bg: "bg-[var(--chart-5)]/15", icon: "text-[var(--chart-5)]" },
28
- success: { bg: "bg-success/10", icon: "text-success" },
29
- info: { bg: "bg-info/10", icon: "text-info" },
30
- warning: { bg: "bg-warning/10", icon: "text-warning" },
31
- destructive: { bg: "bg-destructive/10", icon: "text-destructive" },
32
- }
33
-
34
- export interface FeatureCardProps extends React.HTMLAttributes<HTMLDivElement> {
35
- title: string
36
- description: string
37
- icon: React.ReactNode
38
- color?: FeatureCardColor
39
- badge?: string
40
- badgeVariant?: React.ComponentProps<typeof Badge>["variant"]
41
- actionLabel?: string
42
- actionVariant?: React.ComponentProps<typeof Button>["variant"]
43
- onAction?: () => void
44
- }
45
-
46
- export function FeatureCard({
47
- title,
48
- description,
49
- icon,
50
- color = "primary",
51
- badge,
52
- badgeVariant = "default",
53
- actionLabel,
54
- actionVariant = "outline",
55
- onAction,
56
- className,
57
- ...props
58
- }: FeatureCardProps) {
59
- const { bg, icon: iconColor } = colorTokens[color]
60
-
61
- return (
62
- <Card
63
- className={cn(
64
- "flex flex-col h-full hover:shadow-md transition-shadow duration-200",
65
- className,
66
- )}
67
- {...props}
68
- >
69
- <CardHeader>
70
- <div className="flex items-center gap-3">
71
- <div className={cn("p-2 rounded-[var(--radius)] shrink-0", bg)}>
72
- <div className={cn("size-6 flex items-center justify-center [&>svg]:size-6", iconColor)}>
73
- {icon}
74
- </div>
75
- </div>
76
- <div className="flex flex-wrap items-center gap-x-2 gap-y-1 min-w-0">
77
- <CardTitle className="text-sm">{title}</CardTitle>
78
- {badge && (
79
- <Badge variant={badgeVariant} className="text-xs">
80
- {badge}
81
- </Badge>
82
- )}
83
- </div>
84
- </div>
85
- </CardHeader>
86
-
87
- <CardContent className="flex-1">
88
- <CardDescription className="text-sm leading-relaxed">{description}</CardDescription>
89
- </CardContent>
90
-
91
- {actionLabel && (
92
- <CardFooter>
93
- <Button variant={actionVariant} className="w-full" onClick={onAction}>
94
- {actionLabel}
95
- </Button>
96
- </CardFooter>
97
- )}
98
- </Card>
99
- )
100
- }
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { Card, CardHeader, CardTitle, CardDescription, CardContent, CardFooter } from "../../ui/card"
5
+ import { Button } from "../../ui/button"
6
+ import { Badge } from "../../ui/badge"
7
+ import { cn } from "../../shared/utils"
8
+
9
+ export type FeatureCardColor =
10
+ | "primary"
11
+ | "chart-1"
12
+ | "chart-2"
13
+ | "chart-3"
14
+ | "chart-4"
15
+ | "chart-5"
16
+ | "success"
17
+ | "info"
18
+ | "warning"
19
+ | "destructive"
20
+
21
+ const colorTokens: Record<FeatureCardColor, { bg: string; icon: string }> = {
22
+ primary: { bg: "bg-primary/10", icon: "text-primary" },
23
+ "chart-1": { bg: "bg-[var(--chart-1)]/15", icon: "text-[var(--chart-1)]" },
24
+ "chart-2": { bg: "bg-[var(--chart-2)]/15", icon: "text-[var(--chart-2)]" },
25
+ "chart-3": { bg: "bg-[var(--chart-3)]/15", icon: "text-[var(--chart-3)]" },
26
+ "chart-4": { bg: "bg-[var(--chart-4)]/15", icon: "text-[var(--chart-4)]" },
27
+ "chart-5": { bg: "bg-[var(--chart-5)]/15", icon: "text-[var(--chart-5)]" },
28
+ success: { bg: "bg-success/10", icon: "text-success" },
29
+ info: { bg: "bg-info/10", icon: "text-info" },
30
+ warning: { bg: "bg-warning/10", icon: "text-warning" },
31
+ destructive: { bg: "bg-destructive/10", icon: "text-destructive" },
32
+ }
33
+
34
+ export interface FeatureCardProps extends React.HTMLAttributes<HTMLDivElement> {
35
+ title: string
36
+ description: string
37
+ icon: React.ReactNode
38
+ color?: FeatureCardColor
39
+ badge?: string
40
+ badgeVariant?: React.ComponentProps<typeof Badge>["variant"]
41
+ actionLabel?: string
42
+ actionVariant?: React.ComponentProps<typeof Button>["variant"]
43
+ onAction?: () => void
44
+ }
45
+
46
+ export function FeatureCard({
47
+ title,
48
+ description,
49
+ icon,
50
+ color = "primary",
51
+ badge,
52
+ badgeVariant = "default",
53
+ actionLabel,
54
+ actionVariant = "outline",
55
+ onAction,
56
+ className,
57
+ ...props
58
+ }: FeatureCardProps) {
59
+ const { bg, icon: iconColor } = colorTokens[color]
60
+
61
+ return (
62
+ <Card
63
+ className={cn(
64
+ "flex flex-col h-full hover:shadow-md transition-shadow duration-200",
65
+ className,
66
+ )}
67
+ {...props}
68
+ >
69
+ <CardHeader>
70
+ <div className="flex items-center gap-3">
71
+ <div className={cn("p-2 rounded-[var(--radius)] shrink-0", bg)}>
72
+ <div className={cn("size-6 flex items-center justify-center [&>svg]:size-6", iconColor)}>
73
+ {icon}
74
+ </div>
75
+ </div>
76
+ <div className="flex flex-wrap items-center gap-x-2 gap-y-1 min-w-0">
77
+ <CardTitle className="text-sm">{title}</CardTitle>
78
+ {badge && (
79
+ <Badge variant={badgeVariant} className="text-xs">
80
+ {badge}
81
+ </Badge>
82
+ )}
83
+ </div>
84
+ </div>
85
+ </CardHeader>
86
+
87
+ <CardContent className="flex-1">
88
+ <CardDescription className="text-sm leading-relaxed">{description}</CardDescription>
89
+ </CardContent>
90
+
91
+ {actionLabel && (
92
+ <CardFooter>
93
+ <Button variant={actionVariant} className="w-full" onClick={onAction}>
94
+ {actionLabel}
95
+ </Button>
96
+ </CardFooter>
97
+ )}
98
+ </Card>
99
+ )
100
+ }
@@ -1,127 +1,127 @@
1
- "use client"
2
-
3
- import * as React from "react"
4
- import { Card, CardHeader, CardTitle, CardContent, CardFooter, CardAction } from "../../ui/card"
5
- import { Avatar, AvatarFallback, AvatarImage } from "../../ui/avatar"
6
- import { Badge } from "../../ui/badge"
7
- import { Button } from "../../ui/button"
8
- import { cn } from "../../shared/utils"
9
-
10
- export type NotificationType = "info" | "warning" | "success" | "error" | "default"
11
-
12
- export interface NotificationItem {
13
- id: string
14
- title: string
15
- message: string
16
- time: string
17
- read?: boolean
18
- type?: NotificationType
19
- user?: { name: string; initials: string; avatar?: string }
20
- }
21
-
22
- export interface NotificationCardProps extends React.HTMLAttributes<HTMLDivElement> {
23
- title?: string
24
- items: NotificationItem[]
25
- unreadCount?: number
26
- onMarkAllRead?: () => void
27
- onViewAll?: () => void
28
- maxItems?: number
29
- }
30
-
31
- const typeVariant: Record<NotificationType, React.ComponentProps<typeof Badge>["variant"]> = {
32
- info: "info",
33
- warning: "warning",
34
- success: "success",
35
- error: "destructive",
36
- default: "secondary",
37
- }
38
-
39
- export function NotificationCard({
40
- title = "Notificações",
41
- items,
42
- unreadCount,
43
- onMarkAllRead,
44
- onViewAll,
45
- maxItems = 4,
46
- className,
47
- ...props
48
- }: NotificationCardProps) {
49
- const visible = items.slice(0, maxItems)
50
- const count = unreadCount ?? items.filter((i) => !i.read).length
51
-
52
- return (
53
- <Card className={cn("w-full", className)} {...props}>
54
- <CardHeader>
55
- <div className="flex items-center gap-2">
56
- <CardTitle>{title}</CardTitle>
57
- {count > 0 && (
58
- <Badge variant="destructive" className="h-5 text-[11px] px-1.5">{count}</Badge>
59
- )}
60
- </div>
61
- {onMarkAllRead && count > 0 && (
62
- <CardAction>
63
- <Button variant="ghost" size="sm" className="text-xs h-7" onClick={onMarkAllRead}>
64
- Marcar todas como lidas
65
- </Button>
66
- </CardAction>
67
- )}
68
- </CardHeader>
69
-
70
- <CardContent className="px-0 pb-0">
71
- <ul className="divide-y divide-border">
72
- {visible.map((item) => (
73
- <li
74
- key={item.id}
75
- className={cn(
76
- "flex items-start gap-3 px-6 py-3 transition-colors",
77
- !item.read && "bg-muted/40",
78
- )}
79
- >
80
- {item.user ? (
81
- <Avatar className="size-8 shrink-0 mt-0.5">
82
- {item.user.avatar && <AvatarImage src={item.user.avatar} alt={item.user.name} />}
83
- <AvatarFallback className="text-xs">{item.user.initials}</AvatarFallback>
84
- </Avatar>
85
- ) : (
86
- <div className="size-8 shrink-0 mt-0.5 rounded-full bg-muted flex items-center justify-center">
87
- <div className={cn(
88
- "size-2 rounded-full",
89
- item.type === "error" ? "bg-destructive" :
90
- item.type === "warning" ? "bg-warning" :
91
- item.type === "success" ? "bg-success" :
92
- item.type === "info" ? "bg-info" : "bg-muted-foreground",
93
- )} />
94
- </div>
95
- )}
96
-
97
- <div className="flex-1 min-w-0">
98
- <div className="flex items-center justify-between gap-2">
99
- <p className="text-sm font-medium truncate">{item.title}</p>
100
- {item.type && item.type !== "default" && (
101
- <Badge variant={typeVariant[item.type]} className="text-[10px] px-1.5 h-4 shrink-0">
102
- {item.type}
103
- </Badge>
104
- )}
105
- </div>
106
- <p className="text-xs text-muted-foreground line-clamp-2 mt-0.5">{item.message}</p>
107
- <p className="text-[11px] text-muted-foreground/70 mt-1">{item.time}</p>
108
- </div>
109
-
110
- {!item.read && (
111
- <div className="size-2 rounded-full bg-primary shrink-0 mt-2" />
112
- )}
113
- </li>
114
- ))}
115
- </ul>
116
- </CardContent>
117
-
118
- {onViewAll && (
119
- <CardFooter className="pt-2">
120
- <Button variant="ghost" size="sm" className="w-full text-xs" onClick={onViewAll}>
121
- Ver todas as notificações
122
- </Button>
123
- </CardFooter>
124
- )}
125
- </Card>
126
- )
127
- }
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { Card, CardHeader, CardTitle, CardContent, CardFooter, CardAction } from "../../ui/card"
5
+ import { Avatar, AvatarFallback, AvatarImage } from "../../ui/avatar"
6
+ import { Badge } from "../../ui/badge"
7
+ import { Button } from "../../ui/button"
8
+ import { cn } from "../../shared/utils"
9
+
10
+ export type NotificationType = "info" | "warning" | "success" | "error" | "default"
11
+
12
+ export interface NotificationItem {
13
+ id: string
14
+ title: string
15
+ message: string
16
+ time: string
17
+ read?: boolean
18
+ type?: NotificationType
19
+ user?: { name: string; initials: string; avatar?: string }
20
+ }
21
+
22
+ export interface NotificationCardProps extends React.HTMLAttributes<HTMLDivElement> {
23
+ title?: string
24
+ items: NotificationItem[]
25
+ unreadCount?: number
26
+ onMarkAllRead?: () => void
27
+ onViewAll?: () => void
28
+ maxItems?: number
29
+ }
30
+
31
+ const typeVariant: Record<NotificationType, React.ComponentProps<typeof Badge>["variant"]> = {
32
+ info: "info",
33
+ warning: "warning",
34
+ success: "success",
35
+ error: "destructive",
36
+ default: "secondary",
37
+ }
38
+
39
+ export function NotificationCard({
40
+ title = "Notificações",
41
+ items,
42
+ unreadCount,
43
+ onMarkAllRead,
44
+ onViewAll,
45
+ maxItems = 4,
46
+ className,
47
+ ...props
48
+ }: NotificationCardProps) {
49
+ const visible = items.slice(0, maxItems)
50
+ const count = unreadCount ?? items.filter((i) => !i.read).length
51
+
52
+ return (
53
+ <Card className={cn("w-full", className)} {...props}>
54
+ <CardHeader>
55
+ <div className="flex items-center gap-2">
56
+ <CardTitle>{title}</CardTitle>
57
+ {count > 0 && (
58
+ <Badge variant="destructive" className="h-5 text-[11px] px-1.5">{count}</Badge>
59
+ )}
60
+ </div>
61
+ {onMarkAllRead && count > 0 && (
62
+ <CardAction>
63
+ <Button variant="ghost" size="sm" className="text-xs h-7" onClick={onMarkAllRead}>
64
+ Marcar todas como lidas
65
+ </Button>
66
+ </CardAction>
67
+ )}
68
+ </CardHeader>
69
+
70
+ <CardContent className="px-0 pb-0">
71
+ <ul className="divide-y divide-border">
72
+ {visible.map((item) => (
73
+ <li
74
+ key={item.id}
75
+ className={cn(
76
+ "flex items-start gap-3 px-6 py-3 transition-colors",
77
+ !item.read && "bg-muted/40",
78
+ )}
79
+ >
80
+ {item.user ? (
81
+ <Avatar className="size-8 shrink-0 mt-0.5">
82
+ {item.user.avatar && <AvatarImage src={item.user.avatar} alt={item.user.name} />}
83
+ <AvatarFallback className="text-xs">{item.user.initials}</AvatarFallback>
84
+ </Avatar>
85
+ ) : (
86
+ <div className="size-8 shrink-0 mt-0.5 rounded-full bg-muted flex items-center justify-center">
87
+ <div className={cn(
88
+ "size-2 rounded-full",
89
+ item.type === "error" ? "bg-destructive" :
90
+ item.type === "warning" ? "bg-warning" :
91
+ item.type === "success" ? "bg-success" :
92
+ item.type === "info" ? "bg-info" : "bg-muted-foreground",
93
+ )} />
94
+ </div>
95
+ )}
96
+
97
+ <div className="flex-1 min-w-0">
98
+ <div className="flex items-center justify-between gap-2">
99
+ <p className="text-sm font-medium truncate">{item.title}</p>
100
+ {item.type && item.type !== "default" && (
101
+ <Badge variant={typeVariant[item.type]} className="text-[10px] px-1.5 h-4 shrink-0">
102
+ {item.type}
103
+ </Badge>
104
+ )}
105
+ </div>
106
+ <p className="text-xs text-muted-foreground line-clamp-2 mt-0.5">{item.message}</p>
107
+ <p className="text-[11px] text-muted-foreground/70 mt-1">{item.time}</p>
108
+ </div>
109
+
110
+ {!item.read && (
111
+ <div className="size-2 rounded-full bg-primary shrink-0 mt-2" />
112
+ )}
113
+ </li>
114
+ ))}
115
+ </ul>
116
+ </CardContent>
117
+
118
+ {onViewAll && (
119
+ <CardFooter className="pt-2">
120
+ <Button variant="ghost" size="sm" className="w-full text-xs" onClick={onViewAll}>
121
+ Ver todas as notificações
122
+ </Button>
123
+ </CardFooter>
124
+ )}
125
+ </Card>
126
+ )
127
+ }