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
@@ -0,0 +1,137 @@
1
+ import { useState, useCallback } from 'react';
2
+
3
+ // ─────────────────────────────────────────────────────────────────────────────
4
+ // Types
5
+ // ─────────────────────────────────────────────────────────────────────────────
6
+
7
+ export interface UseStepperProps {
8
+ /** Total number of steps. */
9
+ totalSteps: number;
10
+ /** Initial active step (1-indexed). @default 1 */
11
+ initialStep?: number;
12
+ /**
13
+ * Controlled current step (1-indexed).
14
+ * When provided, step state is managed externally via `onStepChange`.
15
+ */
16
+ step?: number;
17
+ /** Called whenever the active step changes. */
18
+ onStepChange?: (step: number) => void;
19
+ /**
20
+ * Optional async guard called before advancing to the next step.
21
+ * Return `true` to allow the transition, `false` to block it.
22
+ * Useful for running form validation before moving forward.
23
+ */
24
+ onBeforeNext?: (currentStep: number) => boolean | Promise<boolean>;
25
+ }
26
+
27
+ export interface UseStepperReturn {
28
+ // ── State ─────────────────────────────────────────────────────────────────
29
+ /** The currently active step (1-indexed). */
30
+ currentStep: number;
31
+ /** Total number of steps. */
32
+ totalSteps: number;
33
+
34
+ // ── Flags ─────────────────────────────────────────────────────────────────
35
+ /** Whether the current step is the first step. */
36
+ isFirstStep: boolean;
37
+ /** Whether the current step is the last step. */
38
+ isLastStep: boolean;
39
+ /** Whether navigation to the previous step is possible. */
40
+ canGoPrev: boolean;
41
+ /** Whether navigation to the next step is possible. */
42
+ canGoNext: boolean;
43
+
44
+ // ── Handlers ──────────────────────────────────────────────────────────────
45
+ /**
46
+ * Advance to the next step.
47
+ * If `onBeforeNext` is provided, it is awaited first; the step only
48
+ * advances when the guard returns `true`.
49
+ */
50
+ next: () => Promise<void>;
51
+ /** Go back to the previous step (no-op if already on step 1). */
52
+ prev: () => void;
53
+ /** Jump directly to a specific step (1-indexed, clamped to valid range). */
54
+ goTo: (step: number) => void;
55
+ /** Jump to the first step. */
56
+ reset: () => void;
57
+ }
58
+
59
+ // ─────────────────────────────────────────────────────────────────────────────
60
+ // Hook
61
+ // ─────────────────────────────────────────────────────────────────────────────
62
+
63
+ /**
64
+ * Headless hook for multi-step wizard / stepper logic.
65
+ *
66
+ * @description
67
+ * Manages the active step state, navigation guards, and derived flags for
68
+ * multi-step flows. Supports both controlled and uncontrolled modes.
69
+ * Pair with the `<Stepper>` / `<Step>` visual components or any custom UI.
70
+ *
71
+ * @example
72
+ * ```tsx
73
+ * const { currentStep, totalSteps, next, prev, isFirstStep, isLastStep } =
74
+ * useStepper({ totalSteps: 3, onBeforeNext: () => form.trigger() });
75
+ * ```
76
+ */
77
+ export function useStepper({
78
+ totalSteps,
79
+ initialStep = 1,
80
+ step: controlledStep,
81
+ onStepChange,
82
+ onBeforeNext,
83
+ }: UseStepperProps): UseStepperReturn {
84
+ const [internalStep, setInternalStep] = useState(initialStep);
85
+
86
+ const isControlled = controlledStep !== undefined;
87
+ const currentStep = isControlled ? controlledStep! : internalStep;
88
+
89
+ const setStep = useCallback(
90
+ (s: number) => {
91
+ const clamped = Math.min(Math.max(1, s), totalSteps);
92
+ if (!isControlled) setInternalStep(clamped);
93
+ onStepChange?.(clamped);
94
+ },
95
+ [isControlled, onStepChange, totalSteps]
96
+ );
97
+
98
+ // ── Derived ───────────────────────────────────────────────────────────────
99
+
100
+ const isFirstStep = currentStep === 1;
101
+ const isLastStep = currentStep === totalSteps;
102
+ const canGoPrev = currentStep > 1;
103
+ const canGoNext = currentStep < totalSteps;
104
+
105
+ // ── Handlers ──────────────────────────────────────────────────────────────
106
+
107
+ const next = useCallback(async () => {
108
+ if (!canGoNext) return;
109
+ if (onBeforeNext) {
110
+ const allowed = await onBeforeNext(currentStep);
111
+ if (!allowed) return;
112
+ }
113
+ setStep(currentStep + 1);
114
+ }, [canGoNext, currentStep, onBeforeNext, setStep]);
115
+
116
+ const prev = useCallback(() => {
117
+ if (!canGoPrev) return;
118
+ setStep(currentStep - 1);
119
+ }, [canGoPrev, currentStep, setStep]);
120
+
121
+ const goTo = useCallback((s: number) => setStep(s), [setStep]);
122
+
123
+ const reset = useCallback(() => setStep(1), [setStep]);
124
+
125
+ return {
126
+ currentStep,
127
+ totalSteps,
128
+ isFirstStep,
129
+ isLastStep,
130
+ canGoPrev,
131
+ canGoNext,
132
+ next,
133
+ prev,
134
+ goTo,
135
+ reset,
136
+ };
137
+ }
@@ -10,14 +10,14 @@ import * as SwitchStories from './switch.stories';
10
10
 
11
11
  <Primary />
12
12
 
13
- ---
14
-
15
- ## Variations
16
-
17
- <Stories />
18
-
19
- ---
20
-
13
+ ---
14
+
15
+ ## Variations
16
+
17
+ <Stories />
18
+
19
+ ---
20
+
21
21
  ## AI Best Practices
22
22
 
23
23
  > [!IMPORTANT]
@@ -1,5 +1,5 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react';
2
- import { expect, userEvent, within } from 'storybook/test';
2
+ import { expect, userEvent, within } from 'storybook/test';
3
3
  import { Switch } from './switch';
4
4
  import { Label } from '../label';
5
5
  import React from 'react';
@@ -66,22 +66,22 @@ export const Sizes: Story = {
66
66
  </div>
67
67
  </div>
68
68
  ),
69
- };
70
-
71
- export const Toggle: Story = {
72
- render: () => (
73
- <div className="flex items-center space-x-2">
74
- <Switch id="play-switch" />
75
- <Label htmlFor="play-switch">Airplane Mode</Label>
76
- </div>
77
- ),
78
- play: async ({ canvasElement }) => {
79
- const canvas = within(canvasElement);
80
- const switchEl = canvas.getByRole('switch');
81
- await expect(switchEl).toHaveAttribute('aria-checked', 'false');
82
- await userEvent.click(switchEl);
83
- await expect(switchEl).toHaveAttribute('aria-checked', 'true');
84
- await userEvent.click(switchEl);
85
- await expect(switchEl).toHaveAttribute('aria-checked', 'false');
86
- },
87
- };
69
+ };
70
+
71
+ export const Toggle: Story = {
72
+ render: () => (
73
+ <div className="flex items-center space-x-2">
74
+ <Switch id="play-switch" />
75
+ <Label htmlFor="play-switch">Airplane Mode</Label>
76
+ </div>
77
+ ),
78
+ play: async ({ canvasElement }) => {
79
+ const canvas = within(canvasElement);
80
+ const switchEl = canvas.getByRole('switch');
81
+ await expect(switchEl).toHaveAttribute('aria-checked', 'false');
82
+ await userEvent.click(switchEl);
83
+ await expect(switchEl).toHaveAttribute('aria-checked', 'true');
84
+ await userEvent.click(switchEl);
85
+ await expect(switchEl).toHaveAttribute('aria-checked', 'false');
86
+ },
87
+ };
@@ -10,14 +10,14 @@ import * as TableStories from './table.stories';
10
10
 
11
11
  <Primary />
12
12
 
13
- ---
14
-
15
- ## Variations
16
-
17
- <Stories />
18
-
19
- ---
20
-
13
+ ---
14
+
15
+ ## Variations
16
+
17
+ <Stories />
18
+
19
+ ---
20
+
21
21
  ## AI Best Practices
22
22
 
23
23
  > [!IMPORTANT]
@@ -10,14 +10,14 @@ import * as TabsStories from './tabs.stories';
10
10
 
11
11
  <Primary />
12
12
 
13
- ---
14
-
15
- ## Variations
16
-
17
- <Stories />
18
-
19
- ---
20
-
13
+ ---
14
+
15
+ ## Variations
16
+
17
+ <Stories />
18
+
19
+ ---
20
+
21
21
  ## AI Best Practices
22
22
 
23
23
  > [!IMPORTANT]
@@ -1,5 +1,5 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react';
2
- import { expect, userEvent, within } from 'storybook/test';
2
+ import { expect, userEvent, within } from 'storybook/test';
3
3
  import { Tabs, TabsList, TabsTrigger, TabsContent } from './tabs';
4
4
  import { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '../card';
5
5
  import { Button } from '../button';
@@ -107,28 +107,28 @@ export const Analytics: Story = {
107
107
  </TabsContent>
108
108
  </Tabs>
109
109
  ),
110
- };
111
-
112
- export const SwitchTab: Story = {
113
- args: { defaultValue: 'account', className: 'w-[400px]' },
114
- render: (args) => (
115
- <Tabs {...args}>
116
- <TabsList className="grid w-full grid-cols-2">
117
- <TabsTrigger value="account">Account</TabsTrigger>
118
- <TabsTrigger value="password">Password</TabsTrigger>
119
- </TabsList>
120
- <TabsContent value="account"><p className="p-4 text-sm">Account content</p></TabsContent>
121
- <TabsContent value="password"><p className="p-4 text-sm">Password content</p></TabsContent>
122
- </Tabs>
123
- ),
124
- play: async ({ canvasElement }) => {
125
- const canvas = within(canvasElement);
126
- const accountTab = canvas.getByRole('tab', { name: 'Account' });
127
- const passwordTab = canvas.getByRole('tab', { name: 'Password' });
128
- await expect(accountTab).toHaveAttribute('aria-selected', 'true');
129
- await expect(passwordTab).toHaveAttribute('aria-selected', 'false');
130
- await userEvent.click(passwordTab);
131
- await expect(passwordTab).toHaveAttribute('aria-selected', 'true');
132
- await expect(accountTab).toHaveAttribute('aria-selected', 'false');
133
- },
134
- };
110
+ };
111
+
112
+ export const SwitchTab: Story = {
113
+ args: { defaultValue: 'account', className: 'w-[400px]' },
114
+ render: (args) => (
115
+ <Tabs {...args}>
116
+ <TabsList className="grid w-full grid-cols-2">
117
+ <TabsTrigger value="account">Account</TabsTrigger>
118
+ <TabsTrigger value="password">Password</TabsTrigger>
119
+ </TabsList>
120
+ <TabsContent value="account"><p className="p-4 text-sm">Account content</p></TabsContent>
121
+ <TabsContent value="password"><p className="p-4 text-sm">Password content</p></TabsContent>
122
+ </Tabs>
123
+ ),
124
+ play: async ({ canvasElement }) => {
125
+ const canvas = within(canvasElement);
126
+ const accountTab = canvas.getByRole('tab', { name: 'Account' });
127
+ const passwordTab = canvas.getByRole('tab', { name: 'Password' });
128
+ await expect(accountTab).toHaveAttribute('aria-selected', 'true');
129
+ await expect(passwordTab).toHaveAttribute('aria-selected', 'false');
130
+ await userEvent.click(passwordTab);
131
+ await expect(passwordTab).toHaveAttribute('aria-selected', 'true');
132
+ await expect(accountTab).toHaveAttribute('aria-selected', 'false');
133
+ },
134
+ };
@@ -10,14 +10,14 @@ import * as TextareaStories from './textarea.stories';
10
10
 
11
11
  <Primary />
12
12
 
13
- ---
14
-
15
- ## Variations
16
-
17
- <Stories />
18
-
19
- ---
20
-
13
+ ---
14
+
15
+ ## Variations
16
+
17
+ <Stories />
18
+
19
+ ---
20
+
21
21
  ## AI Best Practices
22
22
 
23
23
  > [!IMPORTANT]
@@ -10,14 +10,14 @@ import * as TimelineStories from './timeline.stories';
10
10
 
11
11
  <Primary />
12
12
 
13
- ---
14
-
15
- ## Variations
16
-
17
- <Stories />
18
-
19
- ---
20
-
13
+ ---
14
+
15
+ ## Variations
16
+
17
+ <Stories />
18
+
19
+ ---
20
+
21
21
  ## AI Best Practices
22
22
 
23
23
  > [!IMPORTANT]
@@ -10,14 +10,14 @@ import * as ToggleStories from './toggle.stories';
10
10
 
11
11
  <Primary />
12
12
 
13
- ---
14
-
15
- ## Variations
16
-
17
- <Stories />
18
-
19
- ---
20
-
13
+ ---
14
+
15
+ ## Variations
16
+
17
+ <Stories />
18
+
19
+ ---
20
+
21
21
  ## AI Best Practices
22
22
 
23
23
  > [!IMPORTANT]
@@ -10,14 +10,14 @@ import * as ToggleGroupStories from './toggle-group.stories';
10
10
 
11
11
  <Primary />
12
12
 
13
- ---
14
-
15
- ## Variations
16
-
17
- <Stories />
18
-
19
- ---
20
-
13
+ ---
14
+
15
+ ## Variations
16
+
17
+ <Stories />
18
+
19
+ ---
20
+
21
21
  ## AI Best Practices
22
22
 
23
23
  > [!IMPORTANT]
@@ -10,14 +10,14 @@ import * as TooltipStories from './tooltip.stories';
10
10
 
11
11
  <Primary />
12
12
 
13
- ---
14
-
15
- ## Variations
16
-
17
- <Stories />
18
-
19
- ---
20
-
13
+ ---
14
+
15
+ ## Variations
16
+
17
+ <Stories />
18
+
19
+ ---
20
+
21
21
  ## AI Best Practices
22
22
 
23
23
  > [!IMPORTANT]
@@ -1 +1,4 @@
1
- export * from './tree-view';
1
+ export { TreeView } from './tree-view';
2
+ export type { TreeViewProps } from './tree-view';
3
+ export { useTreeView } from './use-tree-view';
4
+ export type { TreeNode, UseTreeViewProps, UseTreeViewReturn } from './use-tree-view';
@@ -10,14 +10,14 @@ import * as TreeViewStories from './tree-view.stories';
10
10
 
11
11
  <Primary />
12
12
 
13
- ---
14
-
15
- ## Variations
16
-
17
- <Stories />
18
-
19
- ---
20
-
13
+ ---
14
+
15
+ ## Variations
16
+
17
+ <Stories />
18
+
19
+ ---
20
+
21
21
  ## AI Best Practices
22
22
 
23
23
  > [!IMPORTANT]
@@ -1,7 +1,9 @@
1
1
  import type { Meta, StoryObj } from '@storybook/react';
2
2
  import { TreeView } from './tree-view';
3
- import { Folder, File, Code, Database, Globe } from 'lucide-react';
4
- import React from 'react';
3
+ import { useTreeView, type TreeNode } from './use-tree-view';
4
+ import { Folder, File, Code, Database, Globe, ChevronRight, ChevronDown } from 'lucide-react';
5
+ import React, { useState } from 'react';
6
+ import { cn } from '../../shared/utils';
5
7
 
6
8
  const meta: Meta<typeof TreeView> = {
7
9
  title: 'UI/TreeView',
@@ -12,7 +14,7 @@ const meta: Meta<typeof TreeView> = {
12
14
  export default meta;
13
15
  type Story = StoryObj<typeof TreeView>;
14
16
 
15
- const fileTree = [
17
+ const fileTree: TreeNode[] = [
16
18
  {
17
19
  id: "root",
18
20
  label: "Project",
@@ -54,7 +56,111 @@ export const Default: Story = {
54
56
  },
55
57
  render: (args) => (
56
58
  <div className="w-[300px] rounded-lg border p-4">
57
- <TreeView {...args} onSelect={(node) => console.log("Selected:", node)} />
59
+ <TreeView {...args} onNodeSelect={(node) => console.log("Selected:", node)} />
58
60
  </div>
59
61
  ),
60
62
  };
63
+
64
+ /**
65
+ * ## useTreeView — Headless Hook
66
+ *
67
+ * Use `useTreeView` when you need the full tree logic (expand/collapse,
68
+ * keyboard navigation, selection) but want to render a completely custom UI.
69
+ * The example below renders a flat indented list with custom styling instead
70
+ * of the default `<TreeView>` component.
71
+ *
72
+ * ```tsx
73
+ * import { useTreeView } from '@xertica/ui/tree-view';
74
+ *
75
+ * const { expanded, effectiveSelectedId, toggleExpand, handleSelect, handleKeyDown, getNodeRef } =
76
+ * useTreeView({ data, onNodeSelect });
77
+ * ```
78
+ */
79
+ export const HeadlessHook: Story = {
80
+ name: 'useTreeView (headless)',
81
+ render: () => {
82
+ const [selectedId, setSelectedId] = useState<string | undefined>(undefined);
83
+
84
+ const {
85
+ expanded,
86
+ effectiveSelectedId,
87
+ getNodeRef,
88
+ toggleExpand,
89
+ handleSelect,
90
+ handleKeyDown,
91
+ } = useTreeView({
92
+ data: fileTree,
93
+ defaultExpanded: ['root', 'src'],
94
+ selectedNodeId: selectedId,
95
+ onNodeSelect: (node) => {
96
+ setSelectedId(node.id);
97
+ console.log('Selected:', node.label);
98
+ },
99
+ });
100
+
101
+ const renderNode = (node: TreeNode, level: number): React.ReactNode => {
102
+ const hasChildren = !!(node.children?.length);
103
+ const isExpanded = expanded.has(node.id);
104
+ const isSelected = node.id === effectiveSelectedId;
105
+
106
+ return (
107
+ <div key={node.id}>
108
+ <button
109
+ ref={getNodeRef(node.id)}
110
+ role="treeitem"
111
+ aria-expanded={hasChildren ? isExpanded : undefined}
112
+ aria-selected={isSelected}
113
+ tabIndex={isSelected ? 0 : -1}
114
+ onClick={() => {
115
+ if (hasChildren) toggleExpand(node.id);
116
+ handleSelect(node);
117
+ }}
118
+ onKeyDown={(e) => handleKeyDown(e, node)}
119
+ style={{ paddingLeft: `${level * 16 + 8}px` }}
120
+ className={cn(
121
+ 'flex w-full items-center gap-1.5 rounded py-1 pr-2 text-left text-sm transition-colors',
122
+ 'hover:bg-accent focus:outline-none focus-visible:ring-2 focus-visible:ring-ring',
123
+ isSelected
124
+ ? 'bg-primary text-primary-foreground font-semibold'
125
+ : 'text-foreground'
126
+ )}
127
+ >
128
+ {hasChildren ? (
129
+ <span className="flex-shrink-0">
130
+ {isExpanded
131
+ ? <ChevronDown className="h-3.5 w-3.5" />
132
+ : <ChevronRight className="h-3.5 w-3.5" />}
133
+ </span>
134
+ ) : (
135
+ <span className="w-3.5 flex-shrink-0" />
136
+ )}
137
+ {node.icon && <span className="flex-shrink-0 opacity-70">{node.icon}</span>}
138
+ <span>{node.label}</span>
139
+ </button>
140
+
141
+ {hasChildren && isExpanded && (
142
+ <div role="group">
143
+ {node.children!.map((child) => renderNode(child, level + 1))}
144
+ </div>
145
+ )}
146
+ </div>
147
+ );
148
+ };
149
+
150
+ return (
151
+ <div className="w-[280px] space-y-1 rounded-xl border bg-card p-3 shadow-sm">
152
+ <p className="mb-2 px-2 text-xs font-semibold uppercase tracking-wider text-muted-foreground">
153
+ Explorer
154
+ </p>
155
+ <div role="tree">
156
+ {fileTree.map((node) => renderNode(node, 0))}
157
+ </div>
158
+ {selectedId && (
159
+ <p className="mt-3 border-t pt-2 px-2 text-xs text-muted-foreground">
160
+ Selected: <span className="font-medium text-foreground">{selectedId}</span>
161
+ </p>
162
+ )}
163
+ </div>
164
+ );
165
+ },
166
+ };