@od-oneapp/uni-ui 2026.1.1301

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 (1253) hide show
  1. package/README.md +753 -0
  2. package/dist/actions-C-SEx2GS.mjs +180 -0
  3. package/dist/actions-C-SEx2GS.mjs.map +1 -0
  4. package/dist/actions-Ch7h6cYC.d.mts +50 -0
  5. package/dist/actions-Cnupw96c.d.mts +50 -0
  6. package/dist/alert-BVUF7Xzb.d.mts +22 -0
  7. package/dist/alert-BuPyEXF-.mjs +206 -0
  8. package/dist/alert-BuPyEXF-.mjs.map +1 -0
  9. package/dist/alert-CfjDnZpm.d.mts +22 -0
  10. package/dist/animated-size-container-DSKNt1Cn.mjs +106 -0
  11. package/dist/animated-size-container-DSKNt1Cn.mjs.map +1 -0
  12. package/dist/areas-CtE8w69A.mjs +144 -0
  13. package/dist/areas-CtE8w69A.mjs.map +1 -0
  14. package/dist/areas-DtGnjGuX.d.mts +22 -0
  15. package/dist/auth-nav-user-CRxDpY_7.d.mts +30 -0
  16. package/dist/auth-nav-user-DPFv8dTp.mjs +181 -0
  17. package/dist/auth-nav-user-DPFv8dTp.mjs.map +1 -0
  18. package/dist/avatar-DjiX7nT8.mjs +202 -0
  19. package/dist/avatar-DjiX7nT8.mjs.map +1 -0
  20. package/dist/badge-CGTN2VG0.d.mts +25 -0
  21. package/dist/badge-CVoIuyYX.mjs +242 -0
  22. package/dist/badge-CVoIuyYX.mjs.map +1 -0
  23. package/dist/badge-DH0tY3wJ.d.mts +25 -0
  24. package/dist/bars-CWTAPKgm.d.mts +20 -0
  25. package/dist/bars-DOLvecrq.mjs +125 -0
  26. package/dist/bars-DOLvecrq.mjs.map +1 -0
  27. package/dist/branch-BEl6eS77.mjs +323 -0
  28. package/dist/branch-BEl6eS77.mjs.map +1 -0
  29. package/dist/branch-BtdY_TLE.d.mts +58 -0
  30. package/dist/branch-Duq6cW0s.d.mts +58 -0
  31. package/dist/button-BAdq0gBE.d.mts +31 -0
  32. package/dist/button-DVOrrZLw.mjs +632 -0
  33. package/dist/button-DVOrrZLw.mjs.map +1 -0
  34. package/dist/button-DnjeAftr.d.mts +31 -0
  35. package/dist/carousel-D-J1Zgn1.d.mts +49 -0
  36. package/dist/carousel-Dx5AOW5k.mjs +345 -0
  37. package/dist/carousel-Dx5AOW5k.mjs.map +1 -0
  38. package/dist/carousel-sY0y1-or.d.mts +49 -0
  39. package/dist/chart-context-CLV35VLJ.mjs +27 -0
  40. package/dist/chart-context-CLV35VLJ.mjs.map +1 -0
  41. package/dist/checkbox-wiF-DV6q.mjs +194 -0
  42. package/dist/checkbox-wiF-DV6q.mjs.map +1 -0
  43. package/dist/code-block-Cg_XtPH7.mjs +243 -0
  44. package/dist/code-block-Cg_XtPH7.mjs.map +1 -0
  45. package/dist/collapsible-CRgTpRfr.d.mts +46 -0
  46. package/dist/collapsible-CXy4T04n.mjs +239 -0
  47. package/dist/collapsible-CXy4T04n.mjs.map +1 -0
  48. package/dist/combobox-DSrxSkSl.d.mts +79 -0
  49. package/dist/combobox-DYFh2eZf.d.mts +79 -0
  50. package/dist/combobox-uEKksQFR.mjs +410 -0
  51. package/dist/combobox-uEKksQFR.mjs.map +1 -0
  52. package/dist/command-xK3X_A9t.mjs +206 -0
  53. package/dist/command-xK3X_A9t.mjs.map +1 -0
  54. package/dist/components-ai-elements/actions/index.d.mts +5 -0
  55. package/dist/components-ai-elements/actions/index.mjs +4 -0
  56. package/dist/components-ai-elements/agent-step/index.d.mts +32 -0
  57. package/dist/components-ai-elements/agent-step/index.mjs +183 -0
  58. package/dist/components-ai-elements/agent-step/index.mjs.map +1 -0
  59. package/dist/components-ai-elements/artifact/index.d.mts +81 -0
  60. package/dist/components-ai-elements/artifact/index.mjs +153 -0
  61. package/dist/components-ai-elements/artifact/index.mjs.map +1 -0
  62. package/dist/components-ai-elements/branch/index.d.mts +5 -0
  63. package/dist/components-ai-elements/branch/index.mjs +4 -0
  64. package/dist/components-ai-elements/chain-of-thought/index.d.mts +90 -0
  65. package/dist/components-ai-elements/chain-of-thought/index.mjs +338 -0
  66. package/dist/components-ai-elements/chain-of-thought/index.mjs.map +1 -0
  67. package/dist/components-ai-elements/chat-input/index.d.mts +21 -0
  68. package/dist/components-ai-elements/chat-input/index.mjs +137 -0
  69. package/dist/components-ai-elements/chat-input/index.mjs.map +1 -0
  70. package/dist/components-ai-elements/checkpoint/index.d.mts +46 -0
  71. package/dist/components-ai-elements/checkpoint/index.mjs +161 -0
  72. package/dist/components-ai-elements/checkpoint/index.mjs.map +1 -0
  73. package/dist/components-ai-elements/code-block/index.d.mts +39 -0
  74. package/dist/components-ai-elements/code-block/index.mjs +4 -0
  75. package/dist/components-ai-elements/confirmation/index.d.mts +96 -0
  76. package/dist/components-ai-elements/confirmation/index.mjs +295 -0
  77. package/dist/components-ai-elements/confirmation/index.mjs.map +1 -0
  78. package/dist/components-ai-elements/context/index.d.mts +83 -0
  79. package/dist/components-ai-elements/context/index.mjs +456 -0
  80. package/dist/components-ai-elements/context/index.mjs.map +1 -0
  81. package/dist/components-ai-elements/conversation/index.d.mts +46 -0
  82. package/dist/components-ai-elements/conversation/index.mjs +180 -0
  83. package/dist/components-ai-elements/conversation/index.mjs.map +1 -0
  84. package/dist/components-ai-elements/custom/index.d.mts +1142 -0
  85. package/dist/components-ai-elements/custom/index.mjs +5578 -0
  86. package/dist/components-ai-elements/custom/index.mjs.map +1 -0
  87. package/dist/components-ai-elements/generative-ui/index.d.mts +4 -0
  88. package/dist/components-ai-elements/generative-ui/index.mjs +4 -0
  89. package/dist/components-ai-elements/image/index.d.mts +20 -0
  90. package/dist/components-ai-elements/image/index.mjs +121 -0
  91. package/dist/components-ai-elements/image/index.mjs.map +1 -0
  92. package/dist/components-ai-elements/inline-citation/index.d.mts +94 -0
  93. package/dist/components-ai-elements/inline-citation/index.mjs +371 -0
  94. package/dist/components-ai-elements/inline-citation/index.mjs.map +1 -0
  95. package/dist/components-ai-elements/loader/index.d.mts +24 -0
  96. package/dist/components-ai-elements/loader/index.mjs +4 -0
  97. package/dist/components-ai-elements/message/index.d.mts +153 -0
  98. package/dist/components-ai-elements/message/index.mjs +597 -0
  99. package/dist/components-ai-elements/message/index.mjs.map +1 -0
  100. package/dist/components-ai-elements/model-selector/index.d.mts +72 -0
  101. package/dist/components-ai-elements/model-selector/index.mjs +224 -0
  102. package/dist/components-ai-elements/model-selector/index.mjs.map +1 -0
  103. package/dist/components-ai-elements/open-in-chat/index.d.mts +64 -0
  104. package/dist/components-ai-elements/open-in-chat/index.mjs +502 -0
  105. package/dist/components-ai-elements/open-in-chat/index.mjs.map +1 -0
  106. package/dist/components-ai-elements/plan/index.d.mts +71 -0
  107. package/dist/components-ai-elements/plan/index.mjs +219 -0
  108. package/dist/components-ai-elements/plan/index.mjs.map +1 -0
  109. package/dist/components-ai-elements/prompt-char-counter/index.d.mts +19 -0
  110. package/dist/components-ai-elements/prompt-char-counter/index.mjs +116 -0
  111. package/dist/components-ai-elements/prompt-char-counter/index.mjs.map +1 -0
  112. package/dist/components-ai-elements/prompt-input/index.d.mts +386 -0
  113. package/dist/components-ai-elements/prompt-input/index.mjs +4 -0
  114. package/dist/components-ai-elements/queue/index.d.mts +121 -0
  115. package/dist/components-ai-elements/queue/index.mjs +284 -0
  116. package/dist/components-ai-elements/queue/index.mjs.map +1 -0
  117. package/dist/components-ai-elements/reasoning/index.d.mts +42 -0
  118. package/dist/components-ai-elements/reasoning/index.mjs +241 -0
  119. package/dist/components-ai-elements/reasoning/index.mjs.map +1 -0
  120. package/dist/components-ai-elements/shimmer/index.d.mts +23 -0
  121. package/dist/components-ai-elements/shimmer/index.mjs +4 -0
  122. package/dist/components-ai-elements/sources/index.d.mts +56 -0
  123. package/dist/components-ai-elements/sources/index.mjs +211 -0
  124. package/dist/components-ai-elements/sources/index.mjs.map +1 -0
  125. package/dist/components-ai-elements/suggestion/index.d.mts +40 -0
  126. package/dist/components-ai-elements/suggestion/index.mjs +145 -0
  127. package/dist/components-ai-elements/suggestion/index.mjs.map +1 -0
  128. package/dist/components-ai-elements/task/index.d.mts +70 -0
  129. package/dist/components-ai-elements/task/index.mjs +218 -0
  130. package/dist/components-ai-elements/task/index.mjs.map +1 -0
  131. package/dist/components-ai-elements/tool/index.d.mts +78 -0
  132. package/dist/components-ai-elements/tool/index.mjs +370 -0
  133. package/dist/components-ai-elements/tool/index.mjs.map +1 -0
  134. package/dist/components-ai-elements/tool-approval/index.d.mts +20 -0
  135. package/dist/components-ai-elements/tool-approval/index.mjs +252 -0
  136. package/dist/components-ai-elements/tool-approval/index.mjs.map +1 -0
  137. package/dist/components-ai-elements/web-preview/index.d.mts +136 -0
  138. package/dist/components-ai-elements/web-preview/index.mjs +773 -0
  139. package/dist/components-ai-elements/web-preview/index.mjs.map +1 -0
  140. package/dist/components-ai-elements-constants.d.mts +207 -0
  141. package/dist/components-ai-elements-constants.mjs +301 -0
  142. package/dist/components-ai-elements-constants.mjs.map +1 -0
  143. package/dist/components-ai-workflows/canvas/index.d.mts +22 -0
  144. package/dist/components-ai-workflows/canvas/index.mjs +135 -0
  145. package/dist/components-ai-workflows/canvas/index.mjs.map +1 -0
  146. package/dist/components-ai-workflows/connection/index.d.mts +22 -0
  147. package/dist/components-ai-workflows/connection/index.mjs +4 -0
  148. package/dist/components-ai-workflows/controls/index.d.mts +14 -0
  149. package/dist/components-ai-workflows/controls/index.mjs +89 -0
  150. package/dist/components-ai-workflows/controls/index.mjs.map +1 -0
  151. package/dist/components-ai-workflows/edge/index.d.mts +20 -0
  152. package/dist/components-ai-workflows/edge/index.mjs +102 -0
  153. package/dist/components-ai-workflows/edge/index.mjs.map +1 -0
  154. package/dist/components-ai-workflows/node/index.d.mts +3 -0
  155. package/dist/components-ai-workflows/node/index.mjs +4 -0
  156. package/dist/components-ai-workflows/panel/index.d.mts +15 -0
  157. package/dist/components-ai-workflows/panel/index.mjs +89 -0
  158. package/dist/components-ai-workflows/panel/index.mjs.map +1 -0
  159. package/dist/components-ai-workflows/resizable-node/index.d.mts +30 -0
  160. package/dist/components-ai-workflows/resizable-node/index.mjs +164 -0
  161. package/dist/components-ai-workflows/resizable-node/index.mjs.map +1 -0
  162. package/dist/components-ai-workflows/toolbar/index.d.mts +19 -0
  163. package/dist/components-ai-workflows/toolbar/index.mjs +91 -0
  164. package/dist/components-ai-workflows/toolbar/index.mjs.map +1 -0
  165. package/dist/components-auth-client-nav-user.d.mts +3 -0
  166. package/dist/components-auth-client-nav-user.mjs +4 -0
  167. package/dist/components-auth-client-providers.d.mts +13 -0
  168. package/dist/components-auth-client-providers.mjs +89 -0
  169. package/dist/components-auth-client-providers.mjs.map +1 -0
  170. package/dist/components-auth-client.d.mts +5 -0
  171. package/dist/components-auth-client.mjs +5 -0
  172. package/dist/components-auth-server.d.mts +1878 -0
  173. package/dist/components-auth-server.mjs +32769 -0
  174. package/dist/components-auth-server.mjs.map +1 -0
  175. package/dist/components-auth.d.mts +5 -0
  176. package/dist/components-auth.mjs +5 -0
  177. package/dist/components-charts/areas/index.d.mts +3 -0
  178. package/dist/components-charts/areas/index.mjs +4 -0
  179. package/dist/components-charts/bars/index.d.mts +3 -0
  180. package/dist/components-charts/bars/index.mjs +4 -0
  181. package/dist/components-charts/funnel-chart/index.d.mts +3 -0
  182. package/dist/components-charts/funnel-chart/index.mjs +4 -0
  183. package/dist/components-charts/mini-area-chart/index.d.mts +3 -0
  184. package/dist/components-charts/mini-area-chart/index.mjs +4 -0
  185. package/dist/components-charts/time-series-chart/index.d.mts +3 -0
  186. package/dist/components-charts/time-series-chart/index.mjs +4 -0
  187. package/dist/components-charts/tooltip-sync/index.d.mts +3 -0
  188. package/dist/components-charts/tooltip-sync/index.mjs +4 -0
  189. package/dist/components-charts/x-axis/index.d.mts +3 -0
  190. package/dist/components-charts/x-axis/index.mjs +4 -0
  191. package/dist/components-charts/y-axis/index.d.mts +3 -0
  192. package/dist/components-charts/y-axis/index.mjs +4 -0
  193. package/dist/components-elements-accordion.d.mts +59 -0
  194. package/dist/components-elements-accordion.mjs +275 -0
  195. package/dist/components-elements-accordion.mjs.map +1 -0
  196. package/dist/components-elements-alert.d.mts +3 -0
  197. package/dist/components-elements-alert.mjs +4 -0
  198. package/dist/components-elements-avatar.d.mts +24 -0
  199. package/dist/components-elements-avatar.mjs +4 -0
  200. package/dist/components-elements-badge.d.mts +4 -0
  201. package/dist/components-elements-badge.mjs +4 -0
  202. package/dist/components-elements-button.d.mts +4 -0
  203. package/dist/components-elements-button.mjs +4 -0
  204. package/dist/components-elements-card.d.mts +3 -0
  205. package/dist/components-elements-card.mjs +4 -0
  206. package/dist/components-elements-carousel.d.mts +5 -0
  207. package/dist/components-elements-carousel.mjs +4 -0
  208. package/dist/components-elements-chart.d.mts +24 -0
  209. package/dist/components-elements-chart.mjs +226 -0
  210. package/dist/components-elements-chart.mjs.map +1 -0
  211. package/dist/components-elements-collapsible.d.mts +3 -0
  212. package/dist/components-elements-collapsible.mjs +4 -0
  213. package/dist/components-elements-dialog.d.mts +3 -0
  214. package/dist/components-elements-dialog.mjs +4 -0
  215. package/dist/components-elements-dropdown-menu.d.mts +3 -0
  216. package/dist/components-elements-dropdown-menu.mjs +4 -0
  217. package/dist/components-elements-dynamic-breadcrumb.d.mts +16 -0
  218. package/dist/components-elements-dynamic-breadcrumb.mjs +4 -0
  219. package/dist/components-elements-empty.d.mts +18 -0
  220. package/dist/components-elements-empty.mjs +199 -0
  221. package/dist/components-elements-empty.mjs.map +1 -0
  222. package/dist/components-elements-hover-card.d.mts +3 -0
  223. package/dist/components-elements-hover-card.mjs +4 -0
  224. package/dist/components-elements-loading-dots.d.mts +3 -0
  225. package/dist/components-elements-loading-dots.mjs +4 -0
  226. package/dist/components-elements-pagination-controls.d.mts +28 -0
  227. package/dist/components-elements-pagination-controls.mjs +4 -0
  228. package/dist/components-elements-progress.d.mts +28 -0
  229. package/dist/components-elements-progress.mjs +4 -0
  230. package/dist/components-elements-resizable.d.mts +31 -0
  231. package/dist/components-elements-resizable.mjs +4 -0
  232. package/dist/components-elements-scroll-area.d.mts +3 -0
  233. package/dist/components-elements-scroll-area.mjs +4 -0
  234. package/dist/components-elements-separator.d.mts +3 -0
  235. package/dist/components-elements-separator.mjs +4 -0
  236. package/dist/components-elements-skeleton.d.mts +3 -0
  237. package/dist/components-elements-skeleton.mjs +4 -0
  238. package/dist/components-elements-status-badge.d.mts +22 -0
  239. package/dist/components-elements-status-badge.mjs +174 -0
  240. package/dist/components-elements-status-badge.mjs.map +1 -0
  241. package/dist/components-elements-table.d.mts +44 -0
  242. package/dist/components-elements-table.mjs +4 -0
  243. package/dist/components-elements-tabs.d.mts +43 -0
  244. package/dist/components-elements-tabs.mjs +435 -0
  245. package/dist/components-elements-tabs.mjs.map +1 -0
  246. package/dist/components-elements-tooltip.d.mts +3 -0
  247. package/dist/components-elements-tooltip.mjs +4 -0
  248. package/dist/components-filter/filter-list/index.d.mts +4 -0
  249. package/dist/components-filter/filter-list/index.mjs +4 -0
  250. package/dist/components-filter/filter-select/index.d.mts +4 -0
  251. package/dist/components-filter/filter-select/index.mjs +4 -0
  252. package/dist/components-forms/checkbox/index.d.mts +27 -0
  253. package/dist/components-forms/checkbox/index.mjs +4 -0
  254. package/dist/components-forms/combobox/index.d.mts +5 -0
  255. package/dist/components-forms/combobox/index.mjs +4 -0
  256. package/dist/components-forms/date-picker/index.d.mts +3 -0
  257. package/dist/components-forms/date-picker/index.mjs +4 -0
  258. package/dist/components-forms/file-upload/index.d.mts +49 -0
  259. package/dist/components-forms/file-upload/index.mjs +323 -0
  260. package/dist/components-forms/file-upload/index.mjs.map +1 -0
  261. package/dist/components-forms/input/index.d.mts +3 -0
  262. package/dist/components-forms/input/index.mjs +4 -0
  263. package/dist/components-forms/input-group/index.d.mts +5 -0
  264. package/dist/components-forms/input-group/index.mjs +4 -0
  265. package/dist/components-forms/label/index.d.mts +23 -0
  266. package/dist/components-forms/label/index.mjs +4 -0
  267. package/dist/components-forms/radio-group/index.d.mts +29 -0
  268. package/dist/components-forms/radio-group/index.mjs +215 -0
  269. package/dist/components-forms/radio-group/index.mjs.map +1 -0
  270. package/dist/components-forms/select/index.d.mts +3 -0
  271. package/dist/components-forms/select/index.mjs +4 -0
  272. package/dist/components-forms/switch/index.d.mts +30 -0
  273. package/dist/components-forms/switch/index.mjs +4 -0
  274. package/dist/components-forms/textarea/index.d.mts +19 -0
  275. package/dist/components-forms/textarea/index.mjs +4 -0
  276. package/dist/components-layout/app-sidebar/index.d.mts +47 -0
  277. package/dist/components-layout/app-sidebar/index.mjs +340 -0
  278. package/dist/components-layout/app-sidebar/index.mjs.map +1 -0
  279. package/dist/components-layout/artifact-panel/index.d.mts +3 -0
  280. package/dist/components-layout/artifact-panel/index.mjs +4 -0
  281. package/dist/components-layout/content-sidebar/index.d.mts +89 -0
  282. package/dist/components-layout/content-sidebar/index.mjs +202 -0
  283. package/dist/components-layout/content-sidebar/index.mjs.map +1 -0
  284. package/dist/components-layout/nav-app-switcher/index.d.mts +3 -0
  285. package/dist/components-layout/nav-app-switcher/index.mjs +4 -0
  286. package/dist/components-layout/nav-main/index.d.mts +30 -0
  287. package/dist/components-layout/nav-main/index.mjs +4 -0
  288. package/dist/components-layout/nav-projects/index.d.mts +18 -0
  289. package/dist/components-layout/nav-projects/index.mjs +153 -0
  290. package/dist/components-layout/nav-projects/index.mjs.map +1 -0
  291. package/dist/components-layout/nav-secondary/index.d.mts +31 -0
  292. package/dist/components-layout/nav-secondary/index.mjs +4 -0
  293. package/dist/components-layout/nav-user/index.d.mts +17 -0
  294. package/dist/components-layout/nav-user/index.mjs +4 -0
  295. package/dist/components-layout/oneapp/index.mjs +4 -0
  296. package/dist/components-layout/sidebar/index.d.mts +8 -0
  297. package/dist/components-layout/sidebar/index.mjs +4 -0
  298. package/dist/components-layout/sidebar-inset-header-portal/index.d.mts +3 -0
  299. package/dist/components-layout/sidebar-inset-header-portal/index.mjs +4 -0
  300. package/dist/components-layout/sidebar-slots/index.d.mts +3 -0
  301. package/dist/components-layout/sidebar-slots/index.mjs +4 -0
  302. package/dist/components-layout/theme-provider/index.d.mts +15 -0
  303. package/dist/components-layout/theme-provider/index.mjs +4 -0
  304. package/dist/components-layout-app-shell.d.mts +83 -0
  305. package/dist/components-layout-app-shell.mjs +185 -0
  306. package/dist/components-layout-app-shell.mjs.map +1 -0
  307. package/dist/components-layout-oneapp.d.mts +84 -0
  308. package/dist/components-layout-oneapp.mjs +4 -0
  309. package/dist/components-overlays-confirm-dialog.d.mts +38 -0
  310. package/dist/components-overlays-confirm-dialog.mjs +145 -0
  311. package/dist/components-overlays-confirm-dialog.mjs.map +1 -0
  312. package/dist/components-overlays-toast.d.mts +16 -0
  313. package/dist/components-overlays-toast.mjs +127 -0
  314. package/dist/components-overlays-toast.mjs.map +1 -0
  315. package/dist/connection-D_kWZtAX.mjs +105 -0
  316. package/dist/connection-D_kWZtAX.mjs.map +1 -0
  317. package/dist/dark-mode-B4L-MZr7.mjs +288 -0
  318. package/dist/dark-mode-B4L-MZr7.mjs.map +1 -0
  319. package/dist/dark-mode-CYb7lJ6G.d.mts +191 -0
  320. package/dist/date-range-picker-CdemRFs_.mjs +676 -0
  321. package/dist/date-range-picker-CdemRFs_.mjs.map +1 -0
  322. package/dist/dialog-Di5QhIga.d.mts +31 -0
  323. package/dist/dialog-DuluSpxA.mjs +293 -0
  324. package/dist/dialog-DuluSpxA.mjs.map +1 -0
  325. package/dist/dropdown-menu-91g1g_Cl.mjs +379 -0
  326. package/dist/dropdown-menu-91g1g_Cl.mjs.map +1 -0
  327. package/dist/dropdown-menu-CwRZCnNs.d.mts +91 -0
  328. package/dist/dynamic-breadcrumb-33t_hdEI.mjs +385 -0
  329. package/dist/dynamic-breadcrumb-33t_hdEI.mjs.map +1 -0
  330. package/dist/error-boundary-Ggc5btkU.mjs +297 -0
  331. package/dist/error-boundary-Ggc5btkU.mjs.map +1 -0
  332. package/dist/filter-list-BMT7Nrli.d.mts +27 -0
  333. package/dist/filter-list-B_9aV5Lp.mjs +279 -0
  334. package/dist/filter-list-B_9aV5Lp.mjs.map +1 -0
  335. package/dist/filter-select-COLb1S5z.d.mts +34 -0
  336. package/dist/filter-select-CYfBhJ_E.mjs +341 -0
  337. package/dist/filter-select-CYfBhJ_E.mjs.map +1 -0
  338. package/dist/fonts.d.mts +22 -0
  339. package/dist/fonts.mjs +104 -0
  340. package/dist/fonts.mjs.map +1 -0
  341. package/dist/funnel-chart-CUpUr1pl.d.mts +22 -0
  342. package/dist/funnel-chart-fdwagDvc.mjs +318 -0
  343. package/dist/funnel-chart-fdwagDvc.mjs.map +1 -0
  344. package/dist/generative-ui-renderer-D0ZgNRZF.mjs +484 -0
  345. package/dist/generative-ui-renderer-D0ZgNRZF.mjs.map +1 -0
  346. package/dist/generative-ui-renderer-D69qYK0D.d.mts +32 -0
  347. package/dist/hooks/index.d.mts +5 -0
  348. package/dist/hooks/index.mjs +6 -0
  349. package/dist/hooks/use-mobile.d.mts +6 -0
  350. package/dist/hooks/use-mobile.mjs +45 -0
  351. package/dist/hooks/use-mobile.mjs.map +1 -0
  352. package/dist/hooks/use-responsive.d.mts +13 -0
  353. package/dist/hooks/use-responsive.mjs +50 -0
  354. package/dist/hooks/use-responsive.mjs.map +1 -0
  355. package/dist/hooks/use-scroll-progress.d.mts +17 -0
  356. package/dist/hooks/use-scroll-progress.mjs +62 -0
  357. package/dist/hooks/use-scroll-progress.mjs.map +1 -0
  358. package/dist/hooks/use-toast.d.mts +21 -0
  359. package/dist/hooks/use-toast.mjs +40 -0
  360. package/dist/hooks/use-toast.mjs.map +1 -0
  361. package/dist/hover-card-BqEpbXMp.d.mts +31 -0
  362. package/dist/hover-card-nn4fjJOh.mjs +161 -0
  363. package/dist/hover-card-nn4fjJOh.mjs.map +1 -0
  364. package/dist/index-AwyfWaOP.d.mts +60 -0
  365. package/dist/index.d.mts +503 -0
  366. package/dist/index.mjs +2158 -0
  367. package/dist/index.mjs.map +1 -0
  368. package/dist/input-CT1C9DMs.d.mts +19 -0
  369. package/dist/input-D0T5jbR6.d.mts +19 -0
  370. package/dist/input-DhpkXN3J.mjs +176 -0
  371. package/dist/input-DhpkXN3J.mjs.map +1 -0
  372. package/dist/input-group-CTBpkGI9.mjs +231 -0
  373. package/dist/input-group-CTBpkGI9.mjs.map +1 -0
  374. package/dist/input-group-DcDPUaQ3.d.mts +20 -0
  375. package/dist/input-group-VSZJM_on.d.mts +20 -0
  376. package/dist/integrations-COjiOhkd.d.mts +60 -0
  377. package/dist/integrations-Doz6nfxm.d.mts +60 -0
  378. package/dist/integrations-lBG309ZD.mjs +471 -0
  379. package/dist/integrations-lBG309ZD.mjs.map +1 -0
  380. package/dist/label-DnUThLUR.mjs +148 -0
  381. package/dist/label-DnUThLUR.mjs.map +1 -0
  382. package/dist/lib/export-csv.d.mts +12 -0
  383. package/dist/lib/export-csv.mjs +63 -0
  384. package/dist/lib/export-csv.mjs.map +1 -0
  385. package/dist/lib/index.d.mts +6 -0
  386. package/dist/lib/index.mjs +7 -0
  387. package/dist/lib/resize-image.d.mts +11 -0
  388. package/dist/lib/resize-image.mjs +66 -0
  389. package/dist/lib/resize-image.mjs.map +1 -0
  390. package/dist/lib/stable-sort.d.mts +6 -0
  391. package/dist/lib/stable-sort.mjs +33 -0
  392. package/dist/lib/stable-sort.mjs.map +1 -0
  393. package/dist/lib/utils.d.mts +8 -0
  394. package/dist/lib/utils.mjs +4 -0
  395. package/dist/lib-utils.mjs +4 -0
  396. package/dist/loader-B2SF0yPJ.mjs +168 -0
  397. package/dist/loader-B2SF0yPJ.mjs.map +1 -0
  398. package/dist/loading-dots-DJfxDgv3.mjs +119 -0
  399. package/dist/loading-dots-DJfxDgv3.mjs.map +1 -0
  400. package/dist/loading-dots-DvR1lwC-.d.mts +11 -0
  401. package/dist/mini-area-chart-GIUU-ZLo.d.mts +30 -0
  402. package/dist/mini-area-chart-s5ItHBk8.mjs +225 -0
  403. package/dist/mini-area-chart-s5ItHBk8.mjs.map +1 -0
  404. package/dist/motion-DLlwbMJ0.d.mts +33 -0
  405. package/dist/motion-zelaDelJ.mjs +47 -0
  406. package/dist/motion-zelaDelJ.mjs.map +1 -0
  407. package/dist/nav-app-switcher-B1NTlYrm.d.mts +43 -0
  408. package/dist/nav-app-switcher-V7aJAC18.mjs +235 -0
  409. package/dist/nav-app-switcher-V7aJAC18.mjs.map +1 -0
  410. package/dist/nav-main-BscfzNoi.mjs +105 -0
  411. package/dist/nav-main-BscfzNoi.mjs.map +1 -0
  412. package/dist/nav-secondary-t-xeA0I4.mjs +51 -0
  413. package/dist/nav-secondary-t-xeA0I4.mjs.map +1 -0
  414. package/dist/nav-user-A4YHm3-O.mjs +193 -0
  415. package/dist/nav-user-A4YHm3-O.mjs.map +1 -0
  416. package/dist/node-BKXOPjw9.d.mts +100 -0
  417. package/dist/node-CdmDD4k-.mjs +116 -0
  418. package/dist/node-CdmDD4k-.mjs.map +1 -0
  419. package/dist/oneapp-CfwhNatF.mjs +322 -0
  420. package/dist/oneapp-CfwhNatF.mjs.map +1 -0
  421. package/dist/pagination-controls-CE3-eCxI.mjs +135 -0
  422. package/dist/pagination-controls-CE3-eCxI.mjs.map +1 -0
  423. package/dist/popover-DmWxl2lW.mjs +198 -0
  424. package/dist/popover-DmWxl2lW.mjs.map +1 -0
  425. package/dist/preview.d.mts +6 -0
  426. package/dist/progress-BWxdthl4.mjs +230 -0
  427. package/dist/progress-BWxdthl4.mjs.map +1 -0
  428. package/dist/prompt-input-SFJ9_lNw.mjs +1149 -0
  429. package/dist/prompt-input-SFJ9_lNw.mjs.map +1 -0
  430. package/dist/resizable--DaTse0W.mjs +124 -0
  431. package/dist/resizable--DaTse0W.mjs.map +1 -0
  432. package/dist/scroll-area-Bxi-Edjc.mjs +139 -0
  433. package/dist/scroll-area-Bxi-Edjc.mjs.map +1 -0
  434. package/dist/scroll-area-CDRGG59G.d.mts +19 -0
  435. package/dist/select-DI6PzHN3.mjs +411 -0
  436. package/dist/select-DI6PzHN3.mjs.map +1 -0
  437. package/dist/select-csqviwUw.d.mts +44 -0
  438. package/dist/separator-BG9BqZqg.d.mts +20 -0
  439. package/dist/separator-CNQqqwfO.d.mts +20 -0
  440. package/dist/separator-veJJBul5.mjs +118 -0
  441. package/dist/separator-veJJBul5.mjs.map +1 -0
  442. package/dist/shared-BqVcofZN.d.mts +91 -0
  443. package/dist/shared-auth.d.mts +5 -0
  444. package/dist/shared-auth.mjs +6 -0
  445. package/dist/shimmer-BLRAD4VL.mjs +102 -0
  446. package/dist/shimmer-BLRAD4VL.mjs.map +1 -0
  447. package/dist/sidebar-CPteoqnB.d.mts +163 -0
  448. package/dist/sidebar-CdWE7H3R.mjs +814 -0
  449. package/dist/sidebar-CdWE7H3R.mjs.map +1 -0
  450. package/dist/sidebar-DYgXCHqQ.d.mts +163 -0
  451. package/dist/sidebar-inset-header-portal-CIRN-lKw.mjs +153 -0
  452. package/dist/sidebar-inset-header-portal-CIRN-lKw.mjs.map +1 -0
  453. package/dist/sidebar-inset-header-portal-DjfK7xCt.d.mts +24 -0
  454. package/dist/sidebar-slots-DNCEnx5L.mjs +135 -0
  455. package/dist/sidebar-slots-DNCEnx5L.mjs.map +1 -0
  456. package/dist/sidebar-slots-OqNmzlIk.d.mts +47 -0
  457. package/dist/skeleton-ByXUFNDF.d.mts +35 -0
  458. package/dist/skeleton-aXwA3YID.mjs +211 -0
  459. package/dist/skeleton-aXwA3YID.mjs.map +1 -0
  460. package/dist/sources.css +16 -0
  461. package/dist/storybook-preview.mjs +184 -0
  462. package/dist/storybook-preview.mjs.map +1 -0
  463. package/dist/styles/colors.css +166 -0
  464. package/dist/styles/index.css +2 -0
  465. package/dist/styles/mantine.css +1024 -0
  466. package/dist/styles/spacing.css +62 -0
  467. package/dist/styles/theme.css +1687 -0
  468. package/dist/styles/typography.css +59 -0
  469. package/dist/styles/variables.css +998 -0
  470. package/dist/styles.css +1 -0
  471. package/dist/switch-BFct1r4a.mjs +223 -0
  472. package/dist/switch-BFct1r4a.mjs.map +1 -0
  473. package/dist/table-DNkLM1TB.mjs +261 -0
  474. package/dist/table-DNkLM1TB.mjs.map +1 -0
  475. package/dist/textarea-MpLFc9sB.mjs +173 -0
  476. package/dist/textarea-MpLFc9sB.mjs.map +1 -0
  477. package/dist/theme-provider-4D34sBmG.mjs +83 -0
  478. package/dist/theme-provider-4D34sBmG.mjs.map +1 -0
  479. package/dist/time-series-chart-B66xH88w.d.mts +69 -0
  480. package/dist/time-series-chart-DxnknDhW.mjs +400 -0
  481. package/dist/time-series-chart-DxnknDhW.mjs.map +1 -0
  482. package/dist/tokens/tokens.dtcg.json +4353 -0
  483. package/dist/tokens/tokens.json +895 -0
  484. package/dist/tokens-mantine-types.d.mts +3 -0
  485. package/dist/tokens-mantine-types.mjs +4 -0
  486. package/dist/tokens.css +2 -0
  487. package/dist/tokens.d.mts +9398 -0
  488. package/dist/tokens.mjs +9311 -0
  489. package/dist/tokens.mjs.map +1 -0
  490. package/dist/tooltip-B8_zKnHC.mjs +301 -0
  491. package/dist/tooltip-B8_zKnHC.mjs.map +1 -0
  492. package/dist/tooltip-BA27ygge.d.mts +44 -0
  493. package/dist/tooltip-FqB3srL-.d.mts +44 -0
  494. package/dist/tooltip-sync-Ax1GmpjC.d.mts +17 -0
  495. package/dist/tooltip-sync-DzJUgiTM.mjs +85 -0
  496. package/dist/tooltip-sync-DzJUgiTM.mjs.map +1 -0
  497. package/dist/types-B8z57DW2.d.mts +41 -0
  498. package/dist/use-artifact-panel-state-CUQTn2Uq.mjs +346 -0
  499. package/dist/use-artifact-panel-state-CUQTn2Uq.mjs.map +1 -0
  500. package/dist/use-artifact-panel-state-DPZC--sz.d.mts +150 -0
  501. package/dist/utils-BJGrUJ6T.mjs +77 -0
  502. package/dist/utils-BJGrUJ6T.mjs.map +1 -0
  503. package/dist/utils-D2bGp2p_.mjs +33 -0
  504. package/dist/utils-D2bGp2p_.mjs.map +1 -0
  505. package/dist/x-axis-BY00htJY.mjs +137 -0
  506. package/dist/x-axis-BY00htJY.mjs.map +1 -0
  507. package/dist/x-axis-Dh66iD8l.d.mts +21 -0
  508. package/dist/y-axis-DgHlVHRG.mjs +118 -0
  509. package/dist/y-axis-DgHlVHRG.mjs.map +1 -0
  510. package/dist/y-axis-DocBbrSp.d.mts +23 -0
  511. package/dist/z-index-BlBlZL-F.d.mts +10775 -0
  512. package/package.json +429 -0
  513. package/src/ai-oneapp/flow-chat/index.ts +3 -0
  514. package/src/ai-oneapp/flow-chat/node-suggestion-card.tsx +37 -0
  515. package/src/ai-oneapp/flow-chat/template-suggestion-card.tsx +49 -0
  516. package/src/ai-oneapp/flow-chat/workflow-action-toast.tsx +55 -0
  517. package/src/components/.gitkeep +0 -0
  518. package/src/components/ai-elements/__tests__/test-utils.tsx +12 -0
  519. package/src/components/ai-elements/actions/actions.stories.tsx +288 -0
  520. package/src/components/ai-elements/actions/actions.test.tsx +60 -0
  521. package/src/components/ai-elements/actions/actions.tsx +286 -0
  522. package/src/components/ai-elements/actions/index.ts +7 -0
  523. package/src/components/ai-elements/agent-step/agent-step.stories.tsx +167 -0
  524. package/src/components/ai-elements/agent-step/agent-step.tsx +206 -0
  525. package/src/components/ai-elements/agent-step/index.ts +7 -0
  526. package/src/components/ai-elements/ai-elements.constants.ts +516 -0
  527. package/src/components/ai-elements/artifact/artifact.stories.tsx +199 -0
  528. package/src/components/ai-elements/artifact/artifact.tsx +277 -0
  529. package/src/components/ai-elements/artifact/index.ts +7 -0
  530. package/src/components/ai-elements/branch/branch.stories.tsx +212 -0
  531. package/src/components/ai-elements/branch/branch.test.tsx +148 -0
  532. package/src/components/ai-elements/branch/branch.tsx +502 -0
  533. package/src/components/ai-elements/branch/index.ts +7 -0
  534. package/src/components/ai-elements/chain-of-thought/chain-of-thought.stories.tsx +172 -0
  535. package/src/components/ai-elements/chain-of-thought/chain-of-thought.tsx +505 -0
  536. package/src/components/ai-elements/chain-of-thought/index.ts +7 -0
  537. package/src/components/ai-elements/chat-input/chat-input.stories.tsx +185 -0
  538. package/src/components/ai-elements/chat-input/chat-input.tsx +201 -0
  539. package/src/components/ai-elements/chat-input/index.ts +7 -0
  540. package/src/components/ai-elements/checkpoint/checkpoint.stories.tsx +171 -0
  541. package/src/components/ai-elements/checkpoint/checkpoint.tsx +256 -0
  542. package/src/components/ai-elements/checkpoint/index.ts +7 -0
  543. package/src/components/ai-elements/code-block/code-block.stories.tsx +317 -0
  544. package/src/components/ai-elements/code-block/code-block.tsx +366 -0
  545. package/src/components/ai-elements/code-block/index.ts +7 -0
  546. package/src/components/ai-elements/confirmation/confirmation.stories.tsx +236 -0
  547. package/src/components/ai-elements/confirmation/confirmation.tsx +465 -0
  548. package/src/components/ai-elements/confirmation/index.ts +7 -0
  549. package/src/components/ai-elements/context/context.stories.tsx +80 -0
  550. package/src/components/ai-elements/context/context.tsx +585 -0
  551. package/src/components/ai-elements/context/index.ts +7 -0
  552. package/src/components/ai-elements/conversation/__tests__/conversation.test.tsx +402 -0
  553. package/src/components/ai-elements/conversation/conversation.stories.tsx +1019 -0
  554. package/src/components/ai-elements/conversation/conversation.tsx +260 -0
  555. package/src/components/ai-elements/conversation/index.ts +7 -0
  556. package/src/components/ai-elements/custom/__tests__/accessibility.test.tsx +27 -0
  557. package/src/components/ai-elements/custom/__tests__/chat-container.test.tsx +30 -0
  558. package/src/components/ai-elements/custom/__tests__/conversation-history.test.tsx +100 -0
  559. package/src/components/ai-elements/custom/__tests__/export-dropdown.test.tsx +60 -0
  560. package/src/components/ai-elements/custom/ai-label/ai-label.stories.tsx +86 -0
  561. package/src/components/ai-elements/custom/ai-label/ai-label.tsx +291 -0
  562. package/src/components/ai-elements/custom/ai-label/index.ts +7 -0
  563. package/src/components/ai-elements/custom/artifact-skeleton/artifact-skeleton.stories.tsx +155 -0
  564. package/src/components/ai-elements/custom/artifact-skeleton/artifact-skeleton.tsx +269 -0
  565. package/src/components/ai-elements/custom/artifact-skeleton/index.ts +18 -0
  566. package/src/components/ai-elements/custom/audio-player/audio-player.stories.tsx +50 -0
  567. package/src/components/ai-elements/custom/audio-player/audio-player.tsx +296 -0
  568. package/src/components/ai-elements/custom/audio-player/index.ts +1 -0
  569. package/src/components/ai-elements/custom/button-group/button-group.stories.tsx +108 -0
  570. package/src/components/ai-elements/custom/button-group/button-group.tsx +142 -0
  571. package/src/components/ai-elements/custom/button-group/index.ts +15 -0
  572. package/src/components/ai-elements/custom/chat-container/chat-container.stories.tsx +143 -0
  573. package/src/components/ai-elements/custom/chat-container/chat-container.tsx +406 -0
  574. package/src/components/ai-elements/custom/chat-container/index.ts +9 -0
  575. package/src/components/ai-elements/custom/collapsible/collapsible.stories.tsx +130 -0
  576. package/src/components/ai-elements/custom/collapsible/index.ts +11 -0
  577. package/src/components/ai-elements/custom/collapsible/use-collapsible.tsx +240 -0
  578. package/src/components/ai-elements/custom/collapsible-content/collapsible-content.stories.tsx +113 -0
  579. package/src/components/ai-elements/custom/collapsible-content/collapsible-content.tsx +141 -0
  580. package/src/components/ai-elements/custom/collapsible-content/index.ts +7 -0
  581. package/src/components/ai-elements/custom/content-placeholder/content-placeholder.stories.tsx +82 -0
  582. package/src/components/ai-elements/custom/content-placeholder/content-placeholder.tsx +319 -0
  583. package/src/components/ai-elements/custom/content-placeholder/index.ts +10 -0
  584. package/src/components/ai-elements/custom/conversation-header/conversation-header.stories.tsx +102 -0
  585. package/src/components/ai-elements/custom/conversation-header/conversation-header.tsx +202 -0
  586. package/src/components/ai-elements/custom/conversation-header/index.ts +12 -0
  587. package/src/components/ai-elements/custom/conversation-history/conversation-history.stories.tsx +191 -0
  588. package/src/components/ai-elements/custom/conversation-history/conversation-history.tsx +515 -0
  589. package/src/components/ai-elements/custom/conversation-history/index.ts +16 -0
  590. package/src/components/ai-elements/custom/diff-view/diff-view.stories.tsx +173 -0
  591. package/src/components/ai-elements/custom/diff-view/diff-view.tsx +261 -0
  592. package/src/components/ai-elements/custom/diff-view/index.ts +7 -0
  593. package/src/components/ai-elements/custom/draggable-tabs/draggable-tabs.stories.tsx +157 -0
  594. package/src/components/ai-elements/custom/draggable-tabs/draggable-tabs.tsx +311 -0
  595. package/src/components/ai-elements/custom/draggable-tabs/index.ts +7 -0
  596. package/src/components/ai-elements/custom/export-conversation/export-conversation.stories.tsx +73 -0
  597. package/src/components/ai-elements/custom/export-conversation/export-conversation.tsx +405 -0
  598. package/src/components/ai-elements/custom/export-conversation/index.ts +10 -0
  599. package/src/components/ai-elements/custom/export-dropdown/export-dropdown.stories.tsx +121 -0
  600. package/src/components/ai-elements/custom/export-dropdown/export-dropdown.tsx +315 -0
  601. package/src/components/ai-elements/custom/export-dropdown/index.ts +11 -0
  602. package/src/components/ai-elements/custom/feedback/feedback.stories.tsx +85 -0
  603. package/src/components/ai-elements/custom/feedback/feedback.tsx +425 -0
  604. package/src/components/ai-elements/custom/feedback/index.ts +13 -0
  605. package/src/components/ai-elements/custom/file-card/file-card.stories.tsx +65 -0
  606. package/src/components/ai-elements/custom/file-card/file-card.tsx +249 -0
  607. package/src/components/ai-elements/custom/file-card/index.ts +1 -0
  608. package/src/components/ai-elements/custom/file-tree/file-tree.stories.tsx +96 -0
  609. package/src/components/ai-elements/custom/file-tree/file-tree.tsx +266 -0
  610. package/src/components/ai-elements/custom/file-tree/index.ts +7 -0
  611. package/src/components/ai-elements/custom/index.ts +73 -0
  612. package/src/components/ai-elements/custom/keyboard-shortcut/index.ts +14 -0
  613. package/src/components/ai-elements/custom/keyboard-shortcut/keyboard-shortcut.stories.tsx +118 -0
  614. package/src/components/ai-elements/custom/keyboard-shortcut/keyboard-shortcut.tsx +292 -0
  615. package/src/components/ai-elements/custom/message-edit/index.ts +1 -0
  616. package/src/components/ai-elements/custom/message-edit/message-edit.stories.tsx +88 -0
  617. package/src/components/ai-elements/custom/message-edit/message-edit.tsx +225 -0
  618. package/src/components/ai-elements/custom/message-error/index.ts +7 -0
  619. package/src/components/ai-elements/custom/message-error/message-error.stories.tsx +85 -0
  620. package/src/components/ai-elements/custom/message-error/message-error.tsx +301 -0
  621. package/src/components/ai-elements/custom/message-group/index.ts +1 -0
  622. package/src/components/ai-elements/custom/message-group/message-group.stories.tsx +82 -0
  623. package/src/components/ai-elements/custom/message-group/message-group.tsx +77 -0
  624. package/src/components/ai-elements/custom/message-separator/index.ts +1 -0
  625. package/src/components/ai-elements/custom/message-separator/message-separator.stories.tsx +65 -0
  626. package/src/components/ai-elements/custom/message-separator/message-separator.tsx +132 -0
  627. package/src/components/ai-elements/custom/scroll-to-bottom/index.ts +11 -0
  628. package/src/components/ai-elements/custom/scroll-to-bottom/scroll-to-bottom.stories.tsx +116 -0
  629. package/src/components/ai-elements/custom/scroll-to-bottom/use-scroll-to-bottom.tsx +215 -0
  630. package/src/components/ai-elements/custom/snippet/index.ts +1 -0
  631. package/src/components/ai-elements/custom/snippet/snippet.stories.tsx +59 -0
  632. package/src/components/ai-elements/custom/snippet/snippet.tsx +158 -0
  633. package/src/components/ai-elements/custom/stack-trace/index.ts +1 -0
  634. package/src/components/ai-elements/custom/stack-trace/stack-trace.stories.tsx +112 -0
  635. package/src/components/ai-elements/custom/stack-trace/stack-trace.tsx +368 -0
  636. package/src/components/ai-elements/custom/terminal/index.ts +9 -0
  637. package/src/components/ai-elements/custom/terminal/terminal.stories.tsx +92 -0
  638. package/src/components/ai-elements/custom/terminal/terminal.tsx +233 -0
  639. package/src/components/ai-elements/custom/test-results/test-results.tsx +438 -0
  640. package/src/components/ai-elements/custom/thought-chain/index.ts +7 -0
  641. package/src/components/ai-elements/custom/thought-chain/thought-chain.stories.tsx +123 -0
  642. package/src/components/ai-elements/custom/thought-chain/thought-chain.tsx +246 -0
  643. package/src/components/ai-elements/custom/token-usage/index.ts +6 -0
  644. package/src/components/ai-elements/custom/token-usage/token-usage.stories.tsx +104 -0
  645. package/src/components/ai-elements/custom/token-usage/token-usage.tsx +236 -0
  646. package/src/components/ai-elements/custom/transcription/index.ts +1 -0
  647. package/src/components/ai-elements/custom/transcription/transcription.stories.tsx +80 -0
  648. package/src/components/ai-elements/custom/transcription/transcription.tsx +163 -0
  649. package/src/components/ai-elements/custom/typing-indicator/index.ts +1 -0
  650. package/src/components/ai-elements/custom/typing-indicator/typing-indicator.stories.tsx +71 -0
  651. package/src/components/ai-elements/custom/typing-indicator/typing-indicator.tsx +126 -0
  652. package/src/components/ai-elements/custom/undo-redo/index.ts +12 -0
  653. package/src/components/ai-elements/custom/undo-redo/undo-redo.stories.tsx +145 -0
  654. package/src/components/ai-elements/custom/undo-redo/use-undo-redo.tsx +324 -0
  655. package/src/components/ai-elements/custom/voice-selector/index.ts +7 -0
  656. package/src/components/ai-elements/custom/voice-selector/voice-selector.stories.tsx +67 -0
  657. package/src/components/ai-elements/custom/voice-selector/voice-selector.tsx +301 -0
  658. package/src/components/ai-elements/custom/welcome/index.ts +1 -0
  659. package/src/components/ai-elements/custom/welcome/welcome.stories.tsx +92 -0
  660. package/src/components/ai-elements/custom/welcome/welcome.tsx +213 -0
  661. package/src/components/ai-elements/generative-ui/generative-ui-renderer.stories.tsx +451 -0
  662. package/src/components/ai-elements/generative-ui/generative-ui-renderer.test.tsx +383 -0
  663. package/src/components/ai-elements/generative-ui/generative-ui-renderer.tsx +668 -0
  664. package/src/components/ai-elements/generative-ui/index.ts +21 -0
  665. package/src/components/ai-elements/image/image.stories.tsx +179 -0
  666. package/src/components/ai-elements/image/image.tsx +178 -0
  667. package/src/components/ai-elements/image/index.ts +7 -0
  668. package/src/components/ai-elements/index.ts +195 -0
  669. package/src/components/ai-elements/inline-citation/index.ts +7 -0
  670. package/src/components/ai-elements/inline-citation/inline-citation.stories.tsx +331 -0
  671. package/src/components/ai-elements/inline-citation/inline-citation.tsx +595 -0
  672. package/src/components/ai-elements/loader/index.ts +7 -0
  673. package/src/components/ai-elements/loader/loader.stories.tsx +185 -0
  674. package/src/components/ai-elements/loader/loader.tsx +177 -0
  675. package/src/components/ai-elements/message/__tests__/message.test.tsx +352 -0
  676. package/src/components/ai-elements/message/index.ts +7 -0
  677. package/src/components/ai-elements/message/message-actions.test.tsx +51 -0
  678. package/src/components/ai-elements/message/message.stories.tsx +609 -0
  679. package/src/components/ai-elements/message/message.test.tsx +52 -0
  680. package/src/components/ai-elements/message/message.tsx +1125 -0
  681. package/src/components/ai-elements/message/response.test.tsx +18 -0
  682. package/src/components/ai-elements/model-selector/index.ts +7 -0
  683. package/src/components/ai-elements/model-selector/model-selector.stories.tsx +198 -0
  684. package/src/components/ai-elements/model-selector/model-selector.tsx +406 -0
  685. package/src/components/ai-elements/modernization_walkthrough.md +51 -0
  686. package/src/components/ai-elements/open-in-chat/index.ts +7 -0
  687. package/src/components/ai-elements/open-in-chat/open-in-chat.stories.tsx +221 -0
  688. package/src/components/ai-elements/open-in-chat/open-in-chat.tsx +606 -0
  689. package/src/components/ai-elements/plan/index.ts +7 -0
  690. package/src/components/ai-elements/plan/plan.stories.tsx +233 -0
  691. package/src/components/ai-elements/plan/plan.tsx +337 -0
  692. package/src/components/ai-elements/prompt-char-counter/index.ts +7 -0
  693. package/src/components/ai-elements/prompt-char-counter/prompt-char-counter.stories.tsx +98 -0
  694. package/src/components/ai-elements/prompt-char-counter/prompt-char-counter.tsx +159 -0
  695. package/src/components/ai-elements/prompt-input/index.ts +7 -0
  696. package/src/components/ai-elements/prompt-input/prompt-input.stories.tsx +548 -0
  697. package/src/components/ai-elements/prompt-input/prompt-input.test.tsx +22 -0
  698. package/src/components/ai-elements/prompt-input/prompt-input.tsx +2112 -0
  699. package/src/components/ai-elements/queue/index.ts +7 -0
  700. package/src/components/ai-elements/queue/queue.stories.tsx +249 -0
  701. package/src/components/ai-elements/queue/queue.tsx +456 -0
  702. package/src/components/ai-elements/reasoning/index.ts +7 -0
  703. package/src/components/ai-elements/reasoning/reasoning.stories.tsx +147 -0
  704. package/src/components/ai-elements/reasoning/reasoning.tsx +356 -0
  705. package/src/components/ai-elements/shimmer/index.ts +7 -0
  706. package/src/components/ai-elements/shimmer/shimmer.stories.tsx +240 -0
  707. package/src/components/ai-elements/shimmer/shimmer.tsx +150 -0
  708. package/src/components/ai-elements/sources/index.ts +7 -0
  709. package/src/components/ai-elements/sources/sources.stories.tsx +259 -0
  710. package/src/components/ai-elements/sources/sources.test.tsx +40 -0
  711. package/src/components/ai-elements/sources/sources.tsx +327 -0
  712. package/src/components/ai-elements/suggestion/index.ts +7 -0
  713. package/src/components/ai-elements/suggestion/suggestion.stories.tsx +207 -0
  714. package/src/components/ai-elements/suggestion/suggestion.tsx +229 -0
  715. package/src/components/ai-elements/task/index.ts +7 -0
  716. package/src/components/ai-elements/task/task.stories.tsx +213 -0
  717. package/src/components/ai-elements/task/task.tsx +356 -0
  718. package/src/components/ai-elements/test-utils.tsx +28 -0
  719. package/src/components/ai-elements/tool/index.ts +7 -0
  720. package/src/components/ai-elements/tool/tool.stories.tsx +195 -0
  721. package/src/components/ai-elements/tool/tool.test.tsx +160 -0
  722. package/src/components/ai-elements/tool/tool.tsx +537 -0
  723. package/src/components/ai-elements/tool-approval/index.ts +7 -0
  724. package/src/components/ai-elements/tool-approval/tool-approval.stories.tsx +260 -0
  725. package/src/components/ai-elements/tool-approval/tool-approval.tsx +423 -0
  726. package/src/components/ai-elements/vitest.config.ts +17 -0
  727. package/src/components/ai-elements/vitest.setup.ts +6 -0
  728. package/src/components/ai-elements/web-preview/index.ts +7 -0
  729. package/src/components/ai-elements/web-preview/web-preview.stories.tsx +202 -0
  730. package/src/components/ai-elements/web-preview/web-preview.tsx +1166 -0
  731. package/src/components/ai-workflows/canvas/canvas.stories.tsx +120 -0
  732. package/src/components/ai-workflows/canvas/canvas.tsx +173 -0
  733. package/src/components/ai-workflows/canvas/index.ts +7 -0
  734. package/src/components/ai-workflows/connection/connection.stories.tsx +66 -0
  735. package/src/components/ai-workflows/connection/connection.tsx +119 -0
  736. package/src/components/ai-workflows/connection/index.ts +7 -0
  737. package/src/components/ai-workflows/controls/controls.stories.tsx +72 -0
  738. package/src/components/ai-workflows/controls/controls.tsx +132 -0
  739. package/src/components/ai-workflows/controls/index.ts +7 -0
  740. package/src/components/ai-workflows/edge/edge.stories.tsx +120 -0
  741. package/src/components/ai-workflows/edge/edge.test.tsx +47 -0
  742. package/src/components/ai-workflows/edge/edge.tsx +136 -0
  743. package/src/components/ai-workflows/edge/index.ts +7 -0
  744. package/src/components/ai-workflows/flow-constants.ts +11 -0
  745. package/src/components/ai-workflows/node/index.ts +7 -0
  746. package/src/components/ai-workflows/node/node.stories.tsx +111 -0
  747. package/src/components/ai-workflows/node/node.tsx +227 -0
  748. package/src/components/ai-workflows/panel/index.ts +7 -0
  749. package/src/components/ai-workflows/panel/panel.stories.tsx +102 -0
  750. package/src/components/ai-workflows/panel/panel.tsx +106 -0
  751. package/src/components/ai-workflows/resizable-node/index.ts +7 -0
  752. package/src/components/ai-workflows/resizable-node/resizable-node.stories.tsx +93 -0
  753. package/src/components/ai-workflows/resizable-node/resizable-node.tsx +228 -0
  754. package/src/components/ai-workflows/toolbar/index.ts +7 -0
  755. package/src/components/ai-workflows/toolbar/toolbar.stories.tsx +99 -0
  756. package/src/components/ai-workflows/toolbar/toolbar.tsx +130 -0
  757. package/src/components/auth/client/index.ts +12 -0
  758. package/src/components/auth/client/nav-user/auth-nav-user.tsx +237 -0
  759. package/src/components/auth/client/nav-user/index.ts +11 -0
  760. package/src/components/auth/client/providers/ThemeProvider.stories.tsx +59 -0
  761. package/src/components/auth/client/providers/ThemeProvider.tsx +39 -0
  762. package/src/components/auth/client/providers/index.ts +7 -0
  763. package/src/components/auth/client/providers.tsx +129 -0
  764. package/src/components/auth/index.ts +14 -0
  765. package/src/components/auth/server/account/ProfileForm.stories.tsx +105 -0
  766. package/src/components/auth/server/account/ProfileForm.tsx +236 -0
  767. package/src/components/auth/server/account/index.ts +7 -0
  768. package/src/components/auth/server/actions/index.ts +11 -0
  769. package/src/components/auth/server/actions.ts +88 -0
  770. package/src/components/auth/server/admin/AdminBulkUserActions.stories.tsx +129 -0
  771. package/src/components/auth/server/admin/AdminBulkUserActions.tsx +649 -0
  772. package/src/components/auth/server/admin/AdminDashboard.stories.tsx +215 -0
  773. package/src/components/auth/server/admin/AdminDashboard.tsx +785 -0
  774. package/src/components/auth/server/admin/AdminDevicesManager.tsx +411 -0
  775. package/src/components/auth/server/admin/AdminImpersonation.stories.tsx +121 -0
  776. package/src/components/auth/server/admin/AdminImpersonation.tsx +569 -0
  777. package/src/components/auth/server/admin/AdminPasskeysManager.tsx +393 -0
  778. package/src/components/auth/server/admin/AdminSecurityEventsViewer.tsx +395 -0
  779. package/src/components/auth/server/admin/AdminServiceAccountsManager.tsx +454 -0
  780. package/src/components/auth/server/admin/AdminSessionsManager.tsx +664 -0
  781. package/src/components/auth/server/admin/AdminTwoFactorManager.tsx +431 -0
  782. package/src/components/auth/server/admin/AdminUserCreation.stories.tsx +87 -0
  783. package/src/components/auth/server/admin/AdminUserCreation.tsx +777 -0
  784. package/src/components/auth/server/admin/AdminUserDetail.stories.tsx +178 -0
  785. package/src/components/auth/server/admin/AdminUserDetail.tsx +1044 -0
  786. package/src/components/auth/server/admin/AdminUsersList.stories.tsx +228 -0
  787. package/src/components/auth/server/admin/AdminUsersList.tsx +859 -0
  788. package/src/components/auth/server/admin/index.ts +59 -0
  789. package/src/components/auth/server/advanced/PasskeySetup.stories.tsx +70 -0
  790. package/src/components/auth/server/advanced/PasskeySetup.tsx +383 -0
  791. package/src/components/auth/server/advanced/TwoFactorSetup.stories.tsx +79 -0
  792. package/src/components/auth/server/advanced/TwoFactorSetup.tsx +459 -0
  793. package/src/components/auth/server/advanced/TwoFactorVerify.stories.tsx +69 -0
  794. package/src/components/auth/server/advanced/TwoFactorVerify.tsx +323 -0
  795. package/src/components/auth/server/advanced/index.ts +10 -0
  796. package/src/components/auth/server/api-keys/APIKeysList.stories.tsx +95 -0
  797. package/src/components/auth/server/api-keys/APIKeysList.tsx +470 -0
  798. package/src/components/auth/server/api-keys/CreateAPIKeyForm.stories.tsx +79 -0
  799. package/src/components/auth/server/api-keys/CreateAPIKeyForm.tsx +501 -0
  800. package/src/components/auth/server/api-keys/index.ts +9 -0
  801. package/src/components/auth/server/enhanced/AccountDeletionFlow.stories.tsx +115 -0
  802. package/src/components/auth/server/enhanced/AccountDeletionFlow.tsx +733 -0
  803. package/src/components/auth/server/enhanced/AnonymousSessionCreator.stories.tsx +80 -0
  804. package/src/components/auth/server/enhanced/AnonymousSessionCreator.tsx +398 -0
  805. package/src/components/auth/server/enhanced/AnonymousToAccountConverter.stories.tsx +61 -0
  806. package/src/components/auth/server/enhanced/AnonymousToAccountConverter.tsx +538 -0
  807. package/src/components/auth/server/enhanced/BackupCodesManager.stories.tsx +108 -0
  808. package/src/components/auth/server/enhanced/BackupCodesManager.tsx +718 -0
  809. package/src/components/auth/server/enhanced/BearerTokenGenerator.stories.tsx +85 -0
  810. package/src/components/auth/server/enhanced/BearerTokenGenerator.tsx +618 -0
  811. package/src/components/auth/server/enhanced/ChangePasswordForm.stories.tsx +108 -0
  812. package/src/components/auth/server/enhanced/ChangePasswordForm.tsx +313 -0
  813. package/src/components/auth/server/enhanced/DataExportRequest.stories.tsx +84 -0
  814. package/src/components/auth/server/enhanced/DataExportRequest.tsx +734 -0
  815. package/src/components/auth/server/enhanced/DeviceManagement.stories.tsx +161 -0
  816. package/src/components/auth/server/enhanced/DeviceManagement.tsx +700 -0
  817. package/src/components/auth/server/enhanced/EmailChangeVerification.stories.tsx +94 -0
  818. package/src/components/auth/server/enhanced/EmailChangeVerification.tsx +421 -0
  819. package/src/components/auth/server/enhanced/EmailOTPSignIn.stories.tsx +68 -0
  820. package/src/components/auth/server/enhanced/EmailOTPSignIn.tsx +516 -0
  821. package/src/components/auth/server/enhanced/EmailOTPVerification.stories.tsx +95 -0
  822. package/src/components/auth/server/enhanced/EmailOTPVerification.tsx +610 -0
  823. package/src/components/auth/server/enhanced/EmailVerificationRequest.stories.tsx +97 -0
  824. package/src/components/auth/server/enhanced/EmailVerificationRequest.tsx +461 -0
  825. package/src/components/auth/server/enhanced/EmailVerificationStatus.stories.tsx +96 -0
  826. package/src/components/auth/server/enhanced/EmailVerificationStatus.tsx +631 -0
  827. package/src/components/auth/server/enhanced/MagicLinkRequestForm.stories.tsx +88 -0
  828. package/src/components/auth/server/enhanced/MagicLinkRequestForm.tsx +439 -0
  829. package/src/components/auth/server/enhanced/MagicLinkStatusIndicator.stories.tsx +101 -0
  830. package/src/components/auth/server/enhanced/MagicLinkStatusIndicator.tsx +610 -0
  831. package/src/components/auth/server/enhanced/MultiSessionDashboard.stories.tsx +101 -0
  832. package/src/components/auth/server/enhanced/MultiSessionDashboard.tsx +996 -0
  833. package/src/components/auth/server/enhanced/OrganizationAuditLog.stories.tsx +86 -0
  834. package/src/components/auth/server/enhanced/OrganizationAuditLog.tsx +1006 -0
  835. package/src/components/auth/server/enhanced/PasskeyManagement.stories.tsx +102 -0
  836. package/src/components/auth/server/enhanced/PasskeyManagement.tsx +705 -0
  837. package/src/components/auth/server/enhanced/PasskeyRegistrationWizard.stories.tsx +83 -0
  838. package/src/components/auth/server/enhanced/PasskeyRegistrationWizard.tsx +566 -0
  839. package/src/components/auth/server/enhanced/PasskeySignInInterface.stories.tsx +90 -0
  840. package/src/components/auth/server/enhanced/PasskeySignInInterface.tsx +792 -0
  841. package/src/components/auth/server/enhanced/PasswordStrengthIndicator.stories.tsx +129 -0
  842. package/src/components/auth/server/enhanced/PasswordStrengthIndicator.tsx +539 -0
  843. package/src/components/auth/server/enhanced/PhoneNumberManagement.stories.tsx +103 -0
  844. package/src/components/auth/server/enhanced/PhoneNumberManagement.tsx +594 -0
  845. package/src/components/auth/server/enhanced/PhoneNumberSetupForm.stories.tsx +91 -0
  846. package/src/components/auth/server/enhanced/PhoneNumberSetupForm.tsx +518 -0
  847. package/src/components/auth/server/enhanced/PhoneSignInForm.stories.tsx +63 -0
  848. package/src/components/auth/server/enhanced/PhoneSignInForm.tsx +801 -0
  849. package/src/components/auth/server/enhanced/PhoneSignInWithSMS.stories.tsx +87 -0
  850. package/src/components/auth/server/enhanced/PhoneSignInWithSMS.tsx +886 -0
  851. package/src/components/auth/server/enhanced/PhoneVerificationForm.stories.tsx +81 -0
  852. package/src/components/auth/server/enhanced/PhoneVerificationForm.tsx +306 -0
  853. package/src/components/auth/server/enhanced/ResendVerificationEmail.stories.tsx +84 -0
  854. package/src/components/auth/server/enhanced/ResendVerificationEmail.tsx +407 -0
  855. package/src/components/auth/server/enhanced/SMSVerificationForm.stories.tsx +92 -0
  856. package/src/components/auth/server/enhanced/SMSVerificationForm.tsx +521 -0
  857. package/src/components/auth/server/enhanced/SecurityEventLog.stories.tsx +115 -0
  858. package/src/components/auth/server/enhanced/SecurityEventLog.tsx +916 -0
  859. package/src/components/auth/server/enhanced/TeamCreationWizard.stories.tsx +85 -0
  860. package/src/components/auth/server/enhanced/TeamCreationWizard.tsx +1023 -0
  861. package/src/components/auth/server/enhanced/__tests__/actions.test.ts +388 -0
  862. package/src/components/auth/server/enhanced/__tests__/more-actions.test.ts +139 -0
  863. package/src/components/auth/server/enhanced/actions.ts +1199 -0
  864. package/src/components/auth/server/enhanced/auth-enhanced-actions.ts +936 -0
  865. package/src/components/auth/server/enhanced/index.ts +37 -0
  866. package/src/components/auth/server/forms/ForgotPasswordForm.stories.tsx +82 -0
  867. package/src/components/auth/server/forms/ForgotPasswordForm.tsx +287 -0
  868. package/src/components/auth/server/forms/ResetPasswordForm.stories.tsx +79 -0
  869. package/src/components/auth/server/forms/ResetPasswordForm.tsx +217 -0
  870. package/src/components/auth/server/forms/SignInForm.stories.tsx +113 -0
  871. package/src/components/auth/server/forms/SignInForm.tsx +211 -0
  872. package/src/components/auth/server/forms/SignUpForm.stories.tsx +130 -0
  873. package/src/components/auth/server/forms/SignUpForm.tsx +243 -0
  874. package/src/components/auth/server/forms/index.ts +10 -0
  875. package/src/components/auth/server/index.ts +22 -0
  876. package/src/components/auth/server/jwt/JWTTokenManager.tsx +315 -0
  877. package/src/components/auth/server/jwt/index.ts +7 -0
  878. package/src/components/auth/server/organization/AuditLogViewer.tsx +288 -0
  879. package/src/components/auth/server/organization/CreateRoleDialog.tsx +540 -0
  880. package/src/components/auth/server/organization/EditRoleDialog.tsx +487 -0
  881. package/src/components/auth/server/organization/InviteMembers.stories.tsx +82 -0
  882. package/src/components/auth/server/organization/InviteMembers.tsx +264 -0
  883. package/src/components/auth/server/organization/MembersList.stories.tsx +117 -0
  884. package/src/components/auth/server/organization/MembersList.tsx +425 -0
  885. package/src/components/auth/server/organization/OrganizationCreation.stories.tsx +99 -0
  886. package/src/components/auth/server/organization/OrganizationCreation.tsx +293 -0
  887. package/src/components/auth/server/organization/OrganizationSettings.stories.tsx +99 -0
  888. package/src/components/auth/server/organization/OrganizationSettings.tsx +494 -0
  889. package/src/components/auth/server/organization/OrganizationSwitcher.stories.tsx +98 -0
  890. package/src/components/auth/server/organization/OrganizationSwitcher.tsx +308 -0
  891. package/src/components/auth/server/organization/PermissionMatrix.tsx +366 -0
  892. package/src/components/auth/server/organization/RoleManagement.stories.tsx +120 -0
  893. package/src/components/auth/server/organization/RoleManagement.tsx +318 -0
  894. package/src/components/auth/server/organization/index.ts +16 -0
  895. package/src/components/auth/server/session/SessionsList.stories.tsx +81 -0
  896. package/src/components/auth/server/session/SessionsList.tsx +274 -0
  897. package/src/components/auth/server/session/index.ts +7 -0
  898. package/src/components/auth/server/social/SocialLoginButtons.stories.tsx +139 -0
  899. package/src/components/auth/server/social/SocialLoginButtons.tsx +292 -0
  900. package/src/components/auth/server/social/index.ts +7 -0
  901. package/src/components/auth/server/ui/Alert.stories.tsx +97 -0
  902. package/src/components/auth/server/ui/Alert.tsx +159 -0
  903. package/src/components/auth/server/ui/Button.stories.tsx +149 -0
  904. package/src/components/auth/server/ui/Button.tsx +221 -0
  905. package/src/components/auth/server/ui/Card.stories.tsx +80 -0
  906. package/src/components/auth/server/ui/Card.tsx +51 -0
  907. package/src/components/auth/server/ui/Input.stories.tsx +143 -0
  908. package/src/components/auth/server/ui/Input.tsx +195 -0
  909. package/src/components/auth/server/ui/index.ts +18 -0
  910. package/src/components/charts/areas/areas.stories.tsx +113 -0
  911. package/src/components/charts/areas/areas.tsx +185 -0
  912. package/src/components/charts/areas/index.ts +11 -0
  913. package/src/components/charts/bars/bars.stories.tsx +109 -0
  914. package/src/components/charts/bars/bars.tsx +164 -0
  915. package/src/components/charts/bars/index.ts +11 -0
  916. package/src/components/charts/chart-context.ts +35 -0
  917. package/src/components/charts/funnel-chart/funnel-chart.stories.tsx +111 -0
  918. package/src/components/charts/funnel-chart/funnel-chart.tsx +392 -0
  919. package/src/components/charts/funnel-chart/index.ts +11 -0
  920. package/src/components/charts/index.ts +45 -0
  921. package/src/components/charts/mini-area-chart/index.ts +11 -0
  922. package/src/components/charts/mini-area-chart/mini-area-chart.stories.tsx +100 -0
  923. package/src/components/charts/mini-area-chart/mini-area-chart.tsx +244 -0
  924. package/src/components/charts/time-series-chart/index.ts +11 -0
  925. package/src/components/charts/time-series-chart/time-series-chart.stories.tsx +140 -0
  926. package/src/components/charts/time-series-chart/time-series-chart.tsx +337 -0
  927. package/src/components/charts/tooltip-sync/index.ts +11 -0
  928. package/src/components/charts/tooltip-sync/tooltip-sync.stories.tsx +89 -0
  929. package/src/components/charts/tooltip-sync/tooltip-sync.tsx +91 -0
  930. package/src/components/charts/types.ts +93 -0
  931. package/src/components/charts/use-tooltip.ts +230 -0
  932. package/src/components/charts/utils.ts +69 -0
  933. package/src/components/charts/x-axis/index.ts +11 -0
  934. package/src/components/charts/x-axis/x-axis.stories.tsx +94 -0
  935. package/src/components/charts/x-axis/x-axis.tsx +176 -0
  936. package/src/components/charts/y-axis/index.ts +7 -0
  937. package/src/components/charts/y-axis/y-axis.stories.tsx +110 -0
  938. package/src/components/charts/y-axis/y-axis.tsx +139 -0
  939. package/src/components/elements/atoms/alert/alert.stories.tsx +234 -0
  940. package/src/components/elements/atoms/alert/alert.tsx +293 -0
  941. package/src/components/elements/atoms/alert/index.ts +7 -0
  942. package/src/components/elements/atoms/avatar/avatar.stories.tsx +174 -0
  943. package/src/components/elements/atoms/avatar/avatar.tsx +274 -0
  944. package/src/components/elements/atoms/avatar/index.ts +7 -0
  945. package/src/components/elements/atoms/badge/badge.stories.tsx +186 -0
  946. package/src/components/elements/atoms/badge/badge.tsx +333 -0
  947. package/src/components/elements/atoms/badge/index.ts +7 -0
  948. package/src/components/elements/atoms/blur-image/blur-image.stories.tsx +140 -0
  949. package/src/components/elements/atoms/blur-image/blur-image.tsx +102 -0
  950. package/src/components/elements/atoms/blur-image/index.ts +7 -0
  951. package/src/components/elements/atoms/button/button.stories.tsx +776 -0
  952. package/src/components/elements/atoms/button/button.tsx +878 -0
  953. package/src/components/elements/atoms/button/index.ts +7 -0
  954. package/src/components/elements/atoms/copy-button/copy-button.stories.tsx +162 -0
  955. package/src/components/elements/atoms/copy-button/copy-button.tsx +232 -0
  956. package/src/components/elements/atoms/copy-button/index.ts +7 -0
  957. package/src/components/elements/atoms/copy-text/copy-text.stories.tsx +128 -0
  958. package/src/components/elements/atoms/copy-text/copy-text.tsx +201 -0
  959. package/src/components/elements/atoms/copy-text/index.ts +7 -0
  960. package/src/components/elements/atoms/empty-state/empty-state.stories.tsx +410 -0
  961. package/src/components/elements/atoms/empty-state/empty-state.tsx +338 -0
  962. package/src/components/elements/atoms/empty-state/index.ts +1 -0
  963. package/src/components/elements/atoms/go-back-button/go-back-button.stories.tsx +83 -0
  964. package/src/components/elements/atoms/go-back-button/go-back-button.tsx +104 -0
  965. package/src/components/elements/atoms/go-back-button/index.ts +7 -0
  966. package/src/components/elements/atoms/inline-snippet/index.ts +7 -0
  967. package/src/components/elements/atoms/inline-snippet/inline-snippet.stories.tsx +130 -0
  968. package/src/components/elements/atoms/inline-snippet/inline-snippet.tsx +140 -0
  969. package/src/components/elements/atoms/loading-dots/index.ts +1 -0
  970. package/src/components/elements/atoms/loading-dots/loading-dots.stories.tsx +274 -0
  971. package/src/components/elements/atoms/loading-dots/loading-dots.tsx +138 -0
  972. package/src/components/elements/atoms/mode-toggle/index.ts +7 -0
  973. package/src/components/elements/atoms/mode-toggle/mode-toggle.stories.tsx +67 -0
  974. package/src/components/elements/atoms/mode-toggle/mode-toggle.tsx +163 -0
  975. package/src/components/elements/atoms/progress/index.ts +7 -0
  976. package/src/components/elements/atoms/progress/progress.stories.tsx +141 -0
  977. package/src/components/elements/atoms/progress/progress.tsx +314 -0
  978. package/src/components/elements/atoms/progress-circle/index.ts +7 -0
  979. package/src/components/elements/atoms/progress-circle/progress-circle.stories.tsx +185 -0
  980. package/src/components/elements/atoms/progress-circle/progress-circle.tsx +207 -0
  981. package/src/components/elements/atoms/separator/index.ts +7 -0
  982. package/src/components/elements/atoms/separator/separator.stories.tsx +154 -0
  983. package/src/components/elements/atoms/separator/separator.tsx +169 -0
  984. package/src/components/elements/atoms/skeleton/index.ts +7 -0
  985. package/src/components/elements/atoms/skeleton/skeleton.stories.tsx +152 -0
  986. package/src/components/elements/atoms/skeleton/skeleton.tsx +336 -0
  987. package/src/components/elements/atoms/slider/index.ts +7 -0
  988. package/src/components/elements/atoms/slider/slider.stories.tsx +199 -0
  989. package/src/components/elements/atoms/slider/slider.tsx +487 -0
  990. package/src/components/elements/atoms/sonner/index.ts +7 -0
  991. package/src/components/elements/atoms/sonner/sonner.stories.tsx +408 -0
  992. package/src/components/elements/atoms/sonner/sonner.tsx +131 -0
  993. package/src/components/elements/atoms/status-badge/index.ts +7 -0
  994. package/src/components/elements/atoms/status-badge/status-badge.stories.tsx +166 -0
  995. package/src/components/elements/atoms/status-badge/status-badge.tsx +262 -0
  996. package/src/components/elements/atoms/timestamp-tooltip/index.ts +7 -0
  997. package/src/components/elements/atoms/timestamp-tooltip/timestamp-tooltip.stories.tsx +127 -0
  998. package/src/components/elements/atoms/timestamp-tooltip/timestamp-tooltip.tsx +404 -0
  999. package/src/components/elements/molecules/animated-size-container/animated-size-container.stories.tsx +165 -0
  1000. package/src/components/elements/molecules/animated-size-container/animated-size-container.tsx +125 -0
  1001. package/src/components/elements/molecules/animated-size-container/index.ts +7 -0
  1002. package/src/components/elements/molecules/avatar-stack/avatar-stack.stories.tsx +179 -0
  1003. package/src/components/elements/molecules/avatar-stack/avatar-stack.tsx +258 -0
  1004. package/src/components/elements/molecules/avatar-stack/index.ts +7 -0
  1005. package/src/components/elements/molecules/breadcrumb/breadcrumb.stories.tsx +273 -0
  1006. package/src/components/elements/molecules/breadcrumb/breadcrumb.tsx +299 -0
  1007. package/src/components/elements/molecules/breadcrumb/index.ts +7 -0
  1008. package/src/components/elements/molecules/button-group/button-group.stories.tsx +267 -0
  1009. package/src/components/elements/molecules/button-group/button-group.tsx +244 -0
  1010. package/src/components/elements/molecules/button-group/index.ts +7 -0
  1011. package/src/components/elements/molecules/collapsible/collapsible.stories.tsx +186 -0
  1012. package/src/components/elements/molecules/collapsible/collapsible.tsx +362 -0
  1013. package/src/components/elements/molecules/collapsible/index.ts +7 -0
  1014. package/src/components/elements/molecules/empty/empty.stories.tsx +182 -0
  1015. package/src/components/elements/molecules/empty/empty.tsx +230 -0
  1016. package/src/components/elements/molecules/empty/index.ts +7 -0
  1017. package/src/components/elements/molecules/pagination-controls/index.ts +8 -0
  1018. package/src/components/elements/molecules/pagination-controls/pagination-controls.stories.tsx +193 -0
  1019. package/src/components/elements/molecules/pagination-controls/pagination-controls.tsx +174 -0
  1020. package/src/components/elements/molecules/tab-select/index.ts +7 -0
  1021. package/src/components/elements/molecules/tab-select/tab-select.stories.tsx +175 -0
  1022. package/src/components/elements/molecules/tab-select/tab-select.tsx +261 -0
  1023. package/src/components/elements/molecules/tabs/index.ts +7 -0
  1024. package/src/components/elements/molecules/tabs/tabs.stories.tsx +198 -0
  1025. package/src/components/elements/molecules/tabs/tabs.tsx +744 -0
  1026. package/src/components/elements/molecules/toggle-group/index.ts +7 -0
  1027. package/src/components/elements/molecules/toggle-group/toggle-group.stories.tsx +201 -0
  1028. package/src/components/elements/molecules/toggle-group/toggle-group.tsx +236 -0
  1029. package/src/components/elements/organisms/accordion/accordion.stories.tsx +217 -0
  1030. package/src/components/elements/organisms/accordion/accordion.tsx +456 -0
  1031. package/src/components/elements/organisms/accordion/index.ts +7 -0
  1032. package/src/components/elements/organisms/card/card.stories.tsx +406 -0
  1033. package/src/components/elements/organisms/card/card.tsx +437 -0
  1034. package/src/components/elements/organisms/card/index.ts +8 -0
  1035. package/src/components/elements/organisms/card/integration-card.stories.tsx +348 -0
  1036. package/src/components/elements/organisms/card/integration-compact.stories.tsx +310 -0
  1037. package/src/components/elements/organisms/card/integrations.tsx +356 -0
  1038. package/src/components/elements/organisms/carousel/carousel.stories.tsx +182 -0
  1039. package/src/components/elements/organisms/carousel/carousel.tsx +537 -0
  1040. package/src/components/elements/organisms/carousel/index.ts +7 -0
  1041. package/src/components/elements/organisms/chart/chart.stories.tsx +147 -0
  1042. package/src/components/elements/organisms/chart/chart.tsx +317 -0
  1043. package/src/components/elements/organisms/chart/index.ts +7 -0
  1044. package/src/components/elements/organisms/command/command.stories.tsx +246 -0
  1045. package/src/components/elements/organisms/command/command.tsx +284 -0
  1046. package/src/components/elements/organisms/command/index.ts +7 -0
  1047. package/src/components/elements/organisms/dialog/dialog.stories.tsx +266 -0
  1048. package/src/components/elements/organisms/dialog/dialog.tsx +366 -0
  1049. package/src/components/elements/organisms/dialog/index.ts +7 -0
  1050. package/src/components/elements/organisms/dropdown-menu/dropdown-menu.stories.tsx +334 -0
  1051. package/src/components/elements/organisms/dropdown-menu/dropdown-menu.tsx +611 -0
  1052. package/src/components/elements/organisms/dropdown-menu/index.ts +7 -0
  1053. package/src/components/elements/organisms/dynamic-breadcrumb/dynamic-breadcrumb.stories.tsx +50 -0
  1054. package/src/components/elements/organisms/dynamic-breadcrumb/dynamic-breadcrumb.tsx +257 -0
  1055. package/src/components/elements/organisms/dynamic-breadcrumb/index.ts +7 -0
  1056. package/src/components/elements/organisms/error-boundary/error-boundary.stories.tsx +142 -0
  1057. package/src/components/elements/organisms/error-boundary/error-boundary.tsx +408 -0
  1058. package/src/components/elements/organisms/error-boundary/index.ts +7 -0
  1059. package/src/components/elements/organisms/hover-card/hover-card.stories.tsx +245 -0
  1060. package/src/components/elements/organisms/hover-card/hover-card.tsx +370 -0
  1061. package/src/components/elements/organisms/hover-card/index.ts +7 -0
  1062. package/src/components/elements/organisms/modal/index.ts +7 -0
  1063. package/src/components/elements/organisms/modal/modal.stories.tsx +189 -0
  1064. package/src/components/elements/organisms/modal/modal.tsx +266 -0
  1065. package/src/components/elements/organisms/popover/index.ts +7 -0
  1066. package/src/components/elements/organisms/popover/popover.stories.tsx +200 -0
  1067. package/src/components/elements/organisms/popover/popover.tsx +302 -0
  1068. package/src/components/elements/organisms/resizable/index.ts +7 -0
  1069. package/src/components/elements/organisms/resizable/resizable.stories.tsx +204 -0
  1070. package/src/components/elements/organisms/resizable/resizable.tsx +178 -0
  1071. package/src/components/elements/organisms/scroll-area/index.ts +7 -0
  1072. package/src/components/elements/organisms/scroll-area/scroll-area.stories.tsx +170 -0
  1073. package/src/components/elements/organisms/scroll-area/scroll-area.tsx +167 -0
  1074. package/src/components/elements/organisms/sheet/index.ts +7 -0
  1075. package/src/components/elements/organisms/sheet/sheet.stories.tsx +235 -0
  1076. package/src/components/elements/organisms/sheet/sheet.tsx +381 -0
  1077. package/src/components/elements/organisms/table/index.ts +7 -0
  1078. package/src/components/elements/organisms/table/table.stories.tsx +238 -0
  1079. package/src/components/elements/organisms/table/table.tsx +392 -0
  1080. package/src/components/elements/organisms/tooltip/index.ts +7 -0
  1081. package/src/components/elements/organisms/tooltip/tooltip.stories.tsx +205 -0
  1082. package/src/components/elements/organisms/tooltip/tooltip.tsx +547 -0
  1083. package/src/components/filter/filter-list/filter-list.stories.tsx +157 -0
  1084. package/src/components/filter/filter-list/filter-list.tsx +435 -0
  1085. package/src/components/filter/filter-list/index.ts +7 -0
  1086. package/src/components/filter/filter-select/filter-select.stories.tsx +124 -0
  1087. package/src/components/filter/filter-select/filter-select.tsx +558 -0
  1088. package/src/components/filter/filter-select/index.ts +7 -0
  1089. package/src/components/filter/index.ts +9 -0
  1090. package/src/components/filter/types.ts +70 -0
  1091. package/src/components/forms/checkbox/checkbox.stories.tsx +177 -0
  1092. package/src/components/forms/checkbox/checkbox.tsx +332 -0
  1093. package/src/components/forms/checkbox/index.ts +11 -0
  1094. package/src/components/forms/combobox/combobox.stories.tsx +224 -0
  1095. package/src/components/forms/combobox/combobox.tsx +679 -0
  1096. package/src/components/forms/combobox/index.ts +7 -0
  1097. package/src/components/forms/date-picker/calendar/calendar.stories.tsx +78 -0
  1098. package/src/components/forms/date-picker/calendar/calendar.tsx +271 -0
  1099. package/src/components/forms/date-picker/calendar/index.ts +7 -0
  1100. package/src/components/forms/date-picker/date-range-picker/date-range-picker.stories.tsx +108 -0
  1101. package/src/components/forms/date-picker/date-range-picker/date-range-picker.tsx +334 -0
  1102. package/src/components/forms/date-picker/date-range-picker/index.ts +7 -0
  1103. package/src/components/forms/date-picker/index.ts +10 -0
  1104. package/src/components/forms/date-picker/presets/index.ts +7 -0
  1105. package/src/components/forms/date-picker/presets/presets.stories.tsx +105 -0
  1106. package/src/components/forms/date-picker/presets/presets.tsx +196 -0
  1107. package/src/components/forms/date-picker/shared.ts +109 -0
  1108. package/src/components/forms/date-picker/trigger/index.ts +7 -0
  1109. package/src/components/forms/date-picker/trigger/trigger.stories.tsx +78 -0
  1110. package/src/components/forms/date-picker/trigger/trigger.tsx +195 -0
  1111. package/src/components/forms/date-picker/types.ts +63 -0
  1112. package/src/components/forms/file-upload/file-upload.stories.tsx +145 -0
  1113. package/src/components/forms/file-upload/file-upload.tsx +504 -0
  1114. package/src/components/forms/file-upload/index.ts +7 -0
  1115. package/src/components/forms/input/index.ts +7 -0
  1116. package/src/components/forms/input/input.stories.tsx +185 -0
  1117. package/src/components/forms/input/input.tsx +228 -0
  1118. package/src/components/forms/input-group/index.ts +11 -0
  1119. package/src/components/forms/input-group/input-group.stories.tsx +146 -0
  1120. package/src/components/forms/input-group/input-group.tsx +344 -0
  1121. package/src/components/forms/label/index.ts +7 -0
  1122. package/src/components/forms/label/label.stories.tsx +140 -0
  1123. package/src/components/forms/label/label.tsx +189 -0
  1124. package/src/components/forms/radio-group/index.ts +7 -0
  1125. package/src/components/forms/radio-group/radio-group.stories.tsx +233 -0
  1126. package/src/components/forms/radio-group/radio-group.tsx +476 -0
  1127. package/src/components/forms/select/index.ts +7 -0
  1128. package/src/components/forms/select/select.stories.tsx +274 -0
  1129. package/src/components/forms/select/select.tsx +654 -0
  1130. package/src/components/forms/switch/index.ts +11 -0
  1131. package/src/components/forms/switch/switch.stories.tsx +166 -0
  1132. package/src/components/forms/switch/switch.tsx +362 -0
  1133. package/src/components/forms/textarea/index.ts +7 -0
  1134. package/src/components/forms/textarea/textarea.stories.tsx +176 -0
  1135. package/src/components/forms/textarea/textarea.tsx +225 -0
  1136. package/src/components/layout/app-shell.tsx +363 -0
  1137. package/src/components/layout/app-sidebar/app-sidebar.stories.tsx +68 -0
  1138. package/src/components/layout/app-sidebar/app-sidebar.tsx +418 -0
  1139. package/src/components/layout/app-sidebar/index.ts +11 -0
  1140. package/src/components/layout/artifact-panel/artifact-panel-header.tsx +89 -0
  1141. package/src/components/layout/artifact-panel/expandable-panel.stories.tsx +484 -0
  1142. package/src/components/layout/artifact-panel/expandable-panel.tsx +289 -0
  1143. package/src/components/layout/artifact-panel/index.ts +23 -0
  1144. package/src/components/layout/artifact-panel/split-panel-layout.tsx +70 -0
  1145. package/src/components/layout/artifact-panel/types.ts +63 -0
  1146. package/src/components/layout/artifact-panel/use-artifact-panel-state.ts +101 -0
  1147. package/src/components/layout/content-sidebar/content-sidebar.stories.tsx +490 -0
  1148. package/src/components/layout/content-sidebar/content-sidebar.tsx +337 -0
  1149. package/src/components/layout/content-sidebar/index.ts +17 -0
  1150. package/src/components/layout/nav-app-switcher/index.ts +7 -0
  1151. package/src/components/layout/nav-app-switcher/nav-app-switcher.stories.tsx +138 -0
  1152. package/src/components/layout/nav-app-switcher/nav-app-switcher.tsx +282 -0
  1153. package/src/components/layout/nav-main/index.ts +11 -0
  1154. package/src/components/layout/nav-main/nav-main.stories.tsx +103 -0
  1155. package/src/components/layout/nav-main/nav-main.tsx +259 -0
  1156. package/src/components/layout/nav-projects/index.ts +11 -0
  1157. package/src/components/layout/nav-projects/nav-projects.stories.tsx +82 -0
  1158. package/src/components/layout/nav-projects/nav-projects.tsx +218 -0
  1159. package/src/components/layout/nav-secondary/index.ts +11 -0
  1160. package/src/components/layout/nav-secondary/nav-secondary.stories.tsx +81 -0
  1161. package/src/components/layout/nav-secondary/nav-secondary.tsx +145 -0
  1162. package/src/components/layout/nav-user/index.ts +11 -0
  1163. package/src/components/layout/nav-user/nav-user.stories.tsx +80 -0
  1164. package/src/components/layout/nav-user/nav-user.tsx +226 -0
  1165. package/src/components/layout/oneapp/auth-context.tsx +74 -0
  1166. package/src/components/layout/oneapp/ensure-anonymous-session.tsx +218 -0
  1167. package/src/components/layout/oneapp/index.ts +37 -0
  1168. package/src/components/layout/oneapp/microfrontend-layout.tsx +191 -0
  1169. package/src/components/layout/oneapp/types.ts +98 -0
  1170. package/src/components/layout/sidebar/index.ts +7 -0
  1171. package/src/components/layout/sidebar/sidebar.stories.tsx +170 -0
  1172. package/src/components/layout/sidebar/sidebar.tsx +945 -0
  1173. package/src/components/layout/sidebar-inset-header-portal/index.ts +8 -0
  1174. package/src/components/layout/sidebar-inset-header-portal/sidebar-inset-header-portal.stories.tsx +355 -0
  1175. package/src/components/layout/sidebar-inset-header-portal/sidebar-inset-header-portal.tsx +179 -0
  1176. package/src/components/layout/sidebar-slots/USAGE.md +163 -0
  1177. package/src/components/layout/sidebar-slots/__tests__/sidebar-slots.test.tsx +239 -0
  1178. package/src/components/layout/sidebar-slots/index.ts +9 -0
  1179. package/src/components/layout/sidebar-slots/sidebar-slots.stories.tsx +525 -0
  1180. package/src/components/layout/sidebar-slots/sidebar-slots.tsx +205 -0
  1181. package/src/components/layout/theme-provider/index.ts +11 -0
  1182. package/src/components/layout/theme-provider/theme-provider.stories.tsx +82 -0
  1183. package/src/components/layout/theme-provider/theme-provider.tsx +101 -0
  1184. package/src/components/overlays/confirm-dialog.stories.tsx +371 -0
  1185. package/src/components/overlays/confirm-dialog.tsx +201 -0
  1186. package/src/components/overlays/toast.stories.tsx +373 -0
  1187. package/src/components/overlays/toast.tsx +115 -0
  1188. package/src/constants/container.ts +183 -0
  1189. package/src/constants/index.ts +38 -0
  1190. package/src/constants/motion.ts +104 -0
  1191. package/src/fonts/Satoshi-Variable.woff2 +0 -0
  1192. package/src/fonts/Satoshi-VariableItalic.woff2 +0 -0
  1193. package/src/fonts/fonts.css +41 -0
  1194. package/src/fonts/index.ts +106 -0
  1195. package/src/hooks/.gitkeep +0 -0
  1196. package/src/hooks/ai-chat/context.tsx +294 -0
  1197. package/src/hooks/ai-chat/hooks.ts +297 -0
  1198. package/src/hooks/ai-chat/index.ts +35 -0
  1199. package/src/hooks/ai-chat/utils.ts +65 -0
  1200. package/src/hooks/index.ts +18 -0
  1201. package/src/hooks/use-mobile.ts +45 -0
  1202. package/src/hooks/use-responsive.ts +64 -0
  1203. package/src/hooks/use-scroll-progress.ts +101 -0
  1204. package/src/hooks/use-toast.ts +65 -0
  1205. package/src/index.ts +857 -0
  1206. package/src/lib/export-csv.ts +107 -0
  1207. package/src/lib/index.ts +10 -0
  1208. package/src/lib/resize-image.ts +109 -0
  1209. package/src/lib/stable-sort.ts +29 -0
  1210. package/src/lib/utils.ts +28 -0
  1211. package/src/react-19-compat.d.ts +28 -0
  1212. package/src/shared/auth/index.ts +8 -0
  1213. package/src/shared/auth/types/index.ts +163 -0
  1214. package/src/shared/auth/types.ts +196 -0
  1215. package/src/shared/auth/utils/dark-mode.ts +336 -0
  1216. package/src/shared/index.ts +5 -0
  1217. package/src/styles/_tokens.generated.scss +84 -0
  1218. package/src/styles/ai-elements.scss +9 -0
  1219. package/src/styles/base.scss +44 -0
  1220. package/src/styles/flows.scss +62 -0
  1221. package/src/styles/globals.css +627 -0
  1222. package/src/styles/index.scss +9 -0
  1223. package/src/styles/shadcn.scss +16 -0
  1224. package/src/styles/sources.css +16 -0
  1225. package/src/styles/theme.css +1687 -0
  1226. package/src/styles/theme.template.css +95 -0
  1227. package/src/tokens/accessibility.ts +494 -0
  1228. package/src/tokens/animations.ts +305 -0
  1229. package/src/tokens/aspect-ratio.ts +89 -0
  1230. package/src/tokens/blur.ts +82 -0
  1231. package/src/tokens/border-width.ts +86 -0
  1232. package/src/tokens/breakpoints.ts +150 -0
  1233. package/src/tokens/colors.ts +1199 -0
  1234. package/src/tokens/component.ts +362 -0
  1235. package/src/tokens/container.ts +42 -0
  1236. package/src/tokens/focus.ts +266 -0
  1237. package/src/tokens/form-states.ts +521 -0
  1238. package/src/tokens/grid.ts +258 -0
  1239. package/src/tokens/index.ts +1175 -0
  1240. package/src/tokens/interactions.ts +558 -0
  1241. package/src/tokens/mantine-types.ts +68 -0
  1242. package/src/tokens/opacity.ts +139 -0
  1243. package/src/tokens/palette.ts +854 -0
  1244. package/src/tokens/pseudo-elements.ts +508 -0
  1245. package/src/tokens/radius.ts +57 -0
  1246. package/src/tokens/shadows.ts +313 -0
  1247. package/src/tokens/spacing.ts +95 -0
  1248. package/src/tokens/states.ts +392 -0
  1249. package/src/tokens/structural.ts +589 -0
  1250. package/src/tokens/timing.ts +224 -0
  1251. package/src/tokens/typography.ts +242 -0
  1252. package/src/tokens/z-index.ts +184 -0
  1253. package/storybook/preview.tsx +201 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"prompt-input-SFJ9_lNw.mjs","names":[],"sources":["../src/components/ai-elements/prompt-input/prompt-input.tsx"],"sourcesContent":["/**\n * @fileoverview PromptInput Component - Premium Harmony V2\n *\n * A comprehensive AI chat input component with file attachments, speech-to-text,\n * and extensible action menus. Supports both standalone and provider-controlled modes.\n *\n * Features:\n * - Premium Harmony V2 spring physics animations with reduced motion support\n * - Touch vs desktop detection with adaptive sizing and 44px minimum touch targets\n * - CVA variants for button styles (default, outline, ghost, filled)\n * - react-dropzone integration for drag & drop file uploads\n * - Auto-expanding textarea with useTextareaAutosize hook\n * - Web Speech API integration for voice input\n * - Provider pattern for shared state across multiple inputs\n * - Inline edit mode with glow border effect and focus pulse animation\n * - Draft auto-save on idle with Mantine hooks integration\n * - Keyboard shortcuts (Cmd/Ctrl+Enter submit, Backspace remove attachment, Escape cancel)\n * - Paste and drop file handling with blob URL conversion\n *\n * @module @od-oneapp/uni-ui/components/ai-elements/prompt-input\n *\n * @component PromptInput, PromptInputProvider, PromptInputTextarea, PromptInputHeader, PromptInputFooter, PromptInputTools, PromptInputButton, PromptInputSubmit, PromptInputSpeechButton, PromptInputAttachments, PromptInputAttachment, PromptInputActionMenu, PromptInputSelect, PromptInputCommand\n *\n * @useCases\n * - AI chat interfaces with multi-modal input (text + voice + files)\n * - Inline message editing with cancel/submit actions\n * - Multi-input forms sharing attachments via provider pattern\n * - Voice-to-text dictation for accessibility\n * - Drag-and-drop file uploads with visual feedback\n * - Command palette integration for power users\n * - Mobile-optimized touch targets and gestures\n *\n * @subcomponents\n * - PromptInputProvider - Global state provider (optional)\n * - PromptInput - Form container with drag & drop support\n * - PromptInputTextarea - Auto-expanding text input\n * - PromptInputHeader - Header section for attachments\n * - PromptInputFooter - Footer section with tools and submit\n * - PromptInputTools - Tool buttons container (left side)\n * - PromptInputActions - Action buttons container (right side)\n * - PromptInputButton - Styled button with CVA variants\n * - PromptInputSubmit - Submit button with status indicator\n * - PromptInputCancelButton - Cancel button for inline mode\n * - PromptInputSpeechButton - Voice input toggle\n * - PromptInputAttachments - File attachments list\n * - PromptInputAttachment - Individual attachment display with preview\n * - PromptInputActionMenu - Dropdown for additional actions\n * - PromptInputSelect - Dropdown select for options\n * - PromptInputCommand - Command palette integration\n *\n * @variants\n * - variant: default (active), outline (tools), ghost (mic), filled (submit)\n *\n * @example\n * <PromptInput onSubmit={handleSubmit} accept=\"image/*\" multiple>\n * <PromptInputAttachments>\n * {(file) => <PromptInputAttachment data={file} />}\n * </PromptInputAttachments>\n * <PromptInputTextarea placeholder=\"Ask anything...\" />\n * <PromptInputFooter>\n * <PromptInputTools>\n * <PromptInputActionMenu>\n * <PromptInputActionMenuTrigger />\n * <PromptInputActionMenuContent>\n * <PromptInputActionAddAttachments />\n * </PromptInputActionMenuContent>\n * </PromptInputActionMenu>\n * </PromptInputTools>\n * <PromptInputActions>\n * <PromptInputSpeechButton />\n * <PromptInputSubmit status={chatStatus} />\n * </PromptInputActions>\n * </PromptInputFooter>\n * </PromptInput>\n */\n\n'use client';\n\nimport {\n Children,\n createContext,\n forwardRef,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useRef,\n useState,\n type ChangeEventHandler,\n type ClipboardEventHandler,\n type ComponentProps,\n type FormEvent,\n type FormEventHandler,\n type HTMLAttributes,\n type KeyboardEventHandler,\n type PropsWithChildren,\n type ReactNode,\n type RefObject,\n} from 'react';\n\nimport {\n useClickOutside,\n useFocusReturn,\n useHotkeys,\n useIdle,\n useMediaQuery,\n useMergedRef,\n useReducedMotion,\n useResizeObserver,\n useUncontrolled,\n} from '@mantine/hooks';\nimport { Logger } from '@repo/shared';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport {\n ArrowUpIcon,\n ImageIcon,\n Loader2Icon,\n MicIcon,\n PaperclipIcon,\n PlusIcon,\n SlidersHorizontalIcon,\n SquareIcon,\n WandSparklesIcon,\n XIcon,\n} from 'lucide-react';\nimport { AnimatePresence, motion } from 'motion/react';\nimport { nanoid } from 'nanoid';\nimport { useDropzone, type FileRejection } from 'react-dropzone';\n\nimport { cn } from '../../../lib/utils';\nimport { Button } from '../../elements/atoms/button';\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n} from '../../elements/organisms/command';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuTrigger,\n} from '../../elements/organisms/dropdown-menu';\nimport { HoverCard, HoverCardContent, HoverCardTrigger } from '../../elements/organisms/hover-card';\nimport { InputGroup, InputGroupAddon, InputGroupTextarea } from '../../forms/input-group';\nimport { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '../../forms/select';\nimport {\n AI_FOCUS,\n AI_ICON,\n AI_NESTED_RADIUS,\n AI_SPACING,\n AI_TEXT,\n AI_TRANSITION,\n SPRING_FLUID,\n SPRING_GENTLE,\n SPRING_TACTILE,\n} from '../ai-elements.constants';\n\nimport type { ChatStatus, FileUIPart } from 'ai';\n\nconst logger = new Logger('uni-ui:prompt-input');\n\n// ============================================================================\n// Utility Functions\n// ============================================================================\n\n/**\n * Converts a blob URL to a data URL by fetching and reading the blob\n */\nasync function convertBlobUrlToDataUrl(url: string): Promise<string> {\n const response = await fetch(url);\n const blob = await response.blob();\n return new Promise((resolve, reject) => {\n const reader = new FileReader();\n reader.onloadend = () => resolve(reader.result as string);\n reader.onerror = reject;\n reader.readAsDataURL(blob);\n });\n}\n\n// ============================================================================\n// useTextareaAutosize Hook (Mantine-style)\n// ============================================================================\n\nexport type UseTextareaAutosizeOptions = {\n /** Minimum number of rows */\n minRows?: number;\n /** Maximum number of rows (undefined = unlimited) */\n maxRows?: number;\n /** Line height in pixels (default: 20) */\n lineHeight?: number;\n};\n\n/**\n * Auto-resize textarea based on content using scrollHeight\n * Similar to Mantine's Textarea autosize behavior\n *\n * @param ref - Ref to the textarea element\n * @param value - Current textarea value (triggers resize on change)\n * @param options - Configuration for min/max rows\n */\nexport function useTextareaAutosize(\n ref: RefObject<HTMLTextAreaElement | null>,\n value: string,\n options: UseTextareaAutosizeOptions = {},\n) {\n const { minRows = 1, maxRows, lineHeight = 20 } = options;\n\n // Use ResizeObserver to detect container width changes\n const [containerRef, containerRect] = useResizeObserver();\n\n const adjustHeight = useCallback(() => {\n const textarea = ref.current;\n if (!textarea) return;\n\n // Store current scroll position\n const scrollTop = window.scrollY;\n\n // Reset height to calculate scrollHeight correctly\n textarea.style.height = 'auto';\n textarea.style.overflow = 'hidden';\n\n // Calculate heights based on rows\n const minHeight = minRows * lineHeight;\n const maxHeight = maxRows ? maxRows * lineHeight : Infinity;\n\n // Get the actual content height\n const { scrollHeight } = textarea;\n\n // Clamp between min and max\n const newHeight = Math.min(Math.max(scrollHeight, minHeight), maxHeight);\n\n textarea.style.height = `${newHeight}px`;\n\n // Show scrollbar if content exceeds maxHeight\n if (maxRows && scrollHeight > maxHeight) {\n textarea.style.overflow = 'auto';\n }\n\n // Restore scroll position to prevent jumping\n window.scrollTo(0, scrollTop);\n }, [ref, minRows, maxRows, lineHeight]);\n\n // Adjust height when value changes\n useEffect(() => {\n adjustHeight();\n }, [value, adjustHeight]);\n\n // Adjust height when container width changes (text might wrap differently)\n useEffect(() => {\n if (containerRect.width > 0) {\n adjustHeight();\n }\n }, [containerRect.width, adjustHeight]);\n\n // Initial adjustment on mount\n useEffect(() => {\n // Small delay to ensure styles are applied\n const timer = setTimeout(adjustHeight, 0);\n return () => clearTimeout(timer);\n }, [adjustHeight]);\n\n return { containerRef, adjustHeight };\n}\n\n// ============================================================================\n// Provider Context & Types\n// ============================================================================\n\nexport type AttachmentsContext = {\n files: (FileUIPart & { id: string })[];\n add: (files: File[] | FileList) => void;\n remove: (id: string) => void;\n clear: () => void;\n openFileDialog: () => void;\n fileInputRef: RefObject<HTMLInputElement | null>;\n /** Dropzone state - true when files are being dragged over the drop target */\n isDragActive: boolean;\n /** Dropzone state - true when dragged files match the accept criteria */\n isDragAccept: boolean;\n /** Dropzone state - true when dragged files don't match the accept criteria */\n isDragReject: boolean;\n};\n\nexport type TextInputContext = {\n value: string;\n setInput: (v: string) => void;\n clear: () => void;\n};\n\nexport type PromptInputControllerProps = {\n textInput: TextInputContext;\n attachments: AttachmentsContext;\n /** INTERNAL: Allows PromptInput to register its file textInput + \"open\" callback */\n registerFileInput: (ref: RefObject<HTMLInputElement | null>, open: () => void) => void;\n};\n\nconst PromptInputController = createContext<PromptInputControllerProps | null>(null);\nconst ProviderAttachmentsContext = createContext<AttachmentsContext | null>(null);\n\nexport const usePromptInputController = () => {\n const ctx = useContext(PromptInputController);\n if (!ctx) {\n throw new Error(\n 'Wrap your component inside <PromptInputProvider> to use usePromptInputController().',\n );\n }\n return ctx;\n};\n\n// Optional variants (do NOT throw). Useful for dual-mode components.\nconst useOptionalPromptInputController = () => useContext(PromptInputController);\n\nexport const useProviderAttachments = () => {\n const ctx = useContext(ProviderAttachmentsContext);\n if (!ctx) {\n throw new Error(\n 'Wrap your component inside <PromptInputProvider> to use useProviderAttachments().',\n );\n }\n return ctx;\n};\n\nconst useOptionalProviderAttachments = () => useContext(ProviderAttachmentsContext);\n\nexport type PromptInputProviderProps = PropsWithChildren<{\n initialInput?: string;\n /** Callback for auto-saving drafts when user goes idle (5 seconds) */\n onSaveDraft?: (text: string) => void;\n /** Idle timeout in milliseconds before saving draft (default: 5000) */\n idleTimeout?: number;\n}>;\n\n/**\n * Provides a shared PromptInput controller and attachments context so descendant PromptInput components can share text input and file attachments.\n *\n * @param initialInput - Initial text value for the shared input (defaults to an empty string)\n * @param onSaveDraft - Callback invoked when user goes idle to auto-save draft\n * @param idleTimeout - Time in milliseconds before triggering draft save (default: 5000)\n * @param children - React children that will consume the provider\n */\nexport function PromptInputProvider({\n initialInput: initialTextInput = '',\n onSaveDraft,\n idleTimeout = 5000,\n children,\n}: PromptInputProviderProps) {\n // ----- textInput state\n const [textInput, setTextInput] = useState(initialTextInput);\n const clearInput = useCallback(() => setTextInput(''), []);\n\n // Auto-save drafts when user goes idle (5 seconds by default)\n const isIdle = useIdle(idleTimeout);\n const lastSavedRef = useRef<string>('');\n\n // Save draft when user goes idle and text has changed\n useEffect(() => {\n if (isIdle && textInput && textInput !== lastSavedRef.current && onSaveDraft) {\n onSaveDraft(textInput);\n lastSavedRef.current = textInput;\n }\n }, [isIdle, textInput, onSaveDraft]);\n\n // ----- attachments state (global when wrapped)\n const [attachements, setAttachements] = useState<(FileUIPart & { id: string })[]>([]);\n const fileInputRef = useRef<HTMLInputElement | null>(null);\n const openRef = useRef<() => void>(() => {});\n\n const add = useCallback((files: File[] | FileList) => {\n const incoming = [...files];\n if (incoming.length === 0) {\n return;\n }\n\n setAttachements(prev => [\n ...prev,\n ...incoming.map(file => ({\n id: nanoid(),\n type: 'file' as const,\n url: URL.createObjectURL(file),\n mediaType: file.type,\n filename: file.name,\n })),\n ]);\n }, []);\n\n const remove = useCallback((id: string) => {\n setAttachements(prev => {\n const found = prev.find(f => f.id === id);\n if (found?.url) {\n URL.revokeObjectURL(found.url);\n }\n return prev.filter(f => f.id !== id);\n });\n }, []);\n\n const clear = useCallback(() => {\n setAttachements(prev => {\n for (const f of prev) {\n if (f.url) {\n URL.revokeObjectURL(f.url);\n }\n }\n return [];\n });\n }, []);\n\n const openFileDialog = useCallback(() => {\n openRef.current();\n }, []);\n\n // Track dropzone state from the registered PromptInput\n const [dropzoneState, _setDropzoneState] = useState({\n isDragActive: false,\n isDragAccept: false,\n isDragReject: false,\n });\n\n const attachments = useMemo<AttachmentsContext>(\n () => ({\n files: attachements,\n add,\n remove,\n clear,\n openFileDialog,\n fileInputRef,\n // Dropzone state (updated by PromptInput when registered)\n ...dropzoneState,\n }),\n [attachements, add, remove, clear, openFileDialog, dropzoneState],\n );\n\n const registerFileInput = useCallback(\n (ref: RefObject<HTMLInputElement | null>, open: () => void) => {\n fileInputRef.current = ref.current;\n openRef.current = open;\n },\n [],\n );\n\n const controller = useMemo<PromptInputControllerProps>(\n () => ({\n textInput: {\n value: textInput,\n setInput: setTextInput,\n clear: clearInput,\n },\n attachments,\n registerFileInput,\n }),\n [textInput, clearInput, attachments, registerFileInput],\n );\n\n return (\n <PromptInputController.Provider value={controller}>\n <ProviderAttachmentsContext.Provider value={attachments}>\n {children}\n </ProviderAttachmentsContext.Provider>\n </PromptInputController.Provider>\n );\n}\n\n// ============================================================================\n// Component Context & Hooks\n// ============================================================================\n\nconst LocalAttachmentsContext = createContext<AttachmentsContext | null>(null);\n\n// ============================================================================\n// Inline Mode Context\n// ============================================================================\n\ntype InlineModeContextValue = {\n inline: boolean;\n onCancel?: () => void;\n};\n\nconst InlineModeContext = createContext<InlineModeContextValue>({ inline: false });\n\n/**\n * Hook to access inline mode state from child components\n */\nexport const usePromptInputInlineMode = () => useContext(InlineModeContext);\n\nexport const usePromptInputAttachments = () => {\n // Dual-mode: prefer provider if present, otherwise use local\n const provider = useOptionalProviderAttachments();\n const local = useContext(LocalAttachmentsContext);\n const context = provider ?? local;\n if (!context) {\n throw new Error(\n 'usePromptInputAttachments must be used within a PromptInput or PromptInputProvider',\n );\n }\n return context;\n};\n\n/**\n * Hook to access the dropzone state from within PromptInput.\n * Useful for building custom drag-and-drop UI overlays.\n *\n * @example\n * ```tsx\n * function MyDropzone() {\n * const { isDragActive, isDragAccept, isDragReject } = usePromptInputDropzone();\n * return (\n * <div className={isDragActive ? 'bg-primary/10' : ''}>\n * {isDragActive ? 'Drop files here...' : 'Drag files to upload'}\n * </div>\n * );\n * }\n * ```\n */\nexport const usePromptInputDropzone = () => {\n const ctx = usePromptInputAttachments();\n return {\n /** True when files are being dragged over the drop target */\n isDragActive: ctx.isDragActive,\n /** True when dragged files match the accept criteria */\n isDragAccept: ctx.isDragAccept,\n /** True when dragged files don't match the accept criteria */\n isDragReject: ctx.isDragReject,\n };\n};\n\nexport type PromptInputAttachmentProps = HTMLAttributes<HTMLDivElement> & {\n data: FileUIPart & { id: string };\n className?: string;\n};\n\nexport function PromptInputAttachment({ data, className, ...props }: PromptInputAttachmentProps) {\n const attachments = usePromptInputAttachments();\n // Premium Harmony V2: Reduced motion support\n const reducedMotion = useReducedMotion();\n\n const filename = data.filename ?? '';\n\n const mediaType = data.mediaType.startsWith('image/') && data.url ? 'image' : 'file';\n const isImage = mediaType === 'image';\n\n const attachmentLabel = filename ?? (isImage ? 'Image' : 'Attachment');\n\n return (\n <PromptInputHoverCard>\n <HoverCardTrigger asChild>\n <div\n className={cn(\n 'group border-border hover:bg-accent hover:text-accent-foreground dark:hover:bg-accent/50 relative flex h-8 cursor-default items-center gap-1.5 border px-1.5 font-medium select-none',\n AI_NESTED_RADIUS,\n AI_TEXT.sm,\n // Premium Harmony V2: Respect reduced motion\n reducedMotion ? 'transition-none' : AI_TRANSITION.all,\n className,\n )}\n key={data.id}\n data-type={mediaType}\n data-filename={filename}\n {...props}\n >\n <div className=\"relative size-5 shrink-0\">\n <div className=\"bg-background absolute inset-0 flex size-5 items-center justify-center overflow-hidden rounded transition-opacity group-hover:opacity-0\">\n {isImage ? (\n <img\n alt={filename || 'attachment'}\n className=\"size-5 object-cover\"\n height={20}\n src={data.url}\n width={20}\n />\n ) : (\n <div className=\"text-muted-foreground flex size-5 items-center justify-center\">\n <PaperclipIcon className=\"size-3\" />\n </div>\n )}\n </div>\n <Button\n aria-label=\"Remove attachment\"\n className=\"absolute inset-0 size-5 cursor-pointer rounded p-0 opacity-0 transition-opacity group-hover:pointer-events-auto group-hover:opacity-100 [&>svg]:size-2.5\"\n onClick={(e: React.MouseEvent<HTMLButtonElement>) => {\n e.stopPropagation();\n attachments.remove(data.id);\n }}\n type=\"button\"\n variant=\"ghost\"\n >\n <XIcon />\n <span className=\"sr-only\">Remove</span>\n </Button>\n </div>\n\n <span className=\"flex-1 truncate\">{attachmentLabel}</span>\n </div>\n </HoverCardTrigger>\n <PromptInputHoverCardContent className=\"w-auto p-2\">\n <div className=\"w-auto space-y-3\">\n {isImage ? (\n <div className=\"flex max-h-96 w-96 items-center justify-center overflow-hidden rounded-md border\">\n <img\n alt={filename || 'attachment preview'}\n className=\"max-h-full max-w-full object-contain\"\n height={384}\n src={data.url}\n width={448}\n />\n </div>\n ) : null}\n <div className=\"flex items-center gap-2.5\">\n <div className=\"min-w-0 flex-1 space-y-1 px-0.5\">\n <h4 className=\"truncate text-sm leading-none font-semibold\">\n {filename ?? (isImage ? 'Image' : 'Attachment')}\n </h4>\n {data.mediaType ? (\n <p className=\"text-muted-foreground truncate font-mono text-xs\">{data.mediaType}</p>\n ) : null}\n </div>\n </div>\n </div>\n </PromptInputHoverCardContent>\n </PromptInputHoverCard>\n );\n}\n\nexport type PromptInputAttachmentsProps = Omit<HTMLAttributes<HTMLDivElement>, 'children'> & {\n children: (attachment: FileUIPart & { id: string }) => ReactNode;\n};\n\nexport function PromptInputAttachments({\n children,\n className,\n ...props\n}: PromptInputAttachmentsProps) {\n const attachments = usePromptInputAttachments();\n // Premium Harmony V2: Reduced motion support\n const reducedMotion = useReducedMotion();\n\n // Premium Harmony V2: Memoized animation variants with spring physics\n const itemVariants = useMemo(\n () => ({\n initial: { scale: 0.8, opacity: 0 },\n animate: {\n scale: 1,\n opacity: 1,\n transition: reducedMotion ? { duration: 0 } : SPRING_GENTLE,\n },\n exit: {\n scale: 0.8,\n opacity: 0,\n transition: reducedMotion ? { duration: 0 } : SPRING_FLUID,\n },\n }),\n [reducedMotion],\n );\n\n if (!attachments.files.length) {\n return null;\n }\n\n return (\n <div className={cn('flex flex-wrap items-center', AI_SPACING.xs, 'p-3', className)} {...props}>\n <AnimatePresence mode=\"popLayout\" initial={false}>\n {attachments.files.map(file => (\n <motion.div\n key={file.id}\n variants={itemVariants}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n layout={!reducedMotion}\n >\n {children(file)}\n </motion.div>\n ))}\n </AnimatePresence>\n </div>\n );\n}\n\nexport type PromptInputActionAddAttachmentsProps = ComponentProps<typeof DropdownMenuItem> & {\n label?: string;\n};\n\nexport const PromptInputActionAddAttachments = ({\n label = 'Add photos or files',\n ...props\n}: PromptInputActionAddAttachmentsProps) => {\n const attachments = usePromptInputAttachments();\n\n return (\n <DropdownMenuItem\n {...props}\n onSelect={(e: Event) => {\n e.preventDefault();\n attachments.openFileDialog();\n }}\n >\n <ImageIcon className={cn('mr-2', AI_ICON.md)} /> {label}\n </DropdownMenuItem>\n );\n};\n\nexport type PromptInputMessage = {\n text?: string;\n files?: FileUIPart[];\n};\n\nexport type PromptInputProps = Omit<HTMLAttributes<HTMLFormElement>, 'onSubmit' | 'onError'> & {\n accept?: string; // e.g., \"image/*\" or leave undefined for any\n multiple?: boolean;\n // When true, accepts drops anywhere on document. Default false (opt-in).\n globalDrop?: boolean;\n // Render a hidden input with given name and keep it in sync for native form posts. Default false.\n syncHiddenInput?: boolean;\n // Minimal constraints\n maxFiles?: number;\n maxFileSize?: number; // bytes\n /** Maximum file size in MB (convenience prop, converted to bytes internally) */\n maxFileSizeMB?: number;\n onError?: (err: { code: 'max_files' | 'max_file_size' | 'accept'; message: string }) => void;\n onSubmit: (\n message: PromptInputMessage,\n event: FormEvent<HTMLFormElement>,\n ) => void | Promise<void>;\n /**\n * Enable inline edit mode - minimal UI for editing existing messages\n * Hides wand icon, changes submit button to dark style, adds glow border\n */\n inline?: boolean;\n /**\n * Callback when cancel is triggered (Cancel button click or Escape key)\n * Only relevant when inline={true}\n */\n onCancel?: () => void;\n /** Children elements to render inside the input group */\n children?: ReactNode;\n};\n\nexport const PromptInput = ({\n className,\n accept,\n multiple,\n globalDrop,\n syncHiddenInput,\n maxFiles,\n maxFileSize,\n maxFileSizeMB,\n onError,\n onSubmit,\n inline = false,\n onCancel,\n children,\n ...props\n}: PromptInputProps) => {\n // Convert MB to bytes if maxFileSizeMB is provided\n const effectiveMaxFileSize = maxFileSizeMB ? maxFileSizeMB * 1024 * 1024 : maxFileSize;\n // Try to use a provider controller if present\n const controller = useOptionalPromptInputController();\n const usingProvider = Boolean(controller);\n // Premium Harmony V2: Reduced motion support\n const reducedMotion = useReducedMotion();\n\n // Inline mode context value\n const inlineModeValue = useMemo<InlineModeContextValue>(\n () => ({ inline, onCancel }),\n [inline, onCancel],\n );\n\n // Refs\n const inputRef = useRef<HTMLInputElement | null>(null);\n const anchorRef = useRef<HTMLSpanElement>(null);\n const formRef = useRef<HTMLFormElement | null>(null);\n\n // Find nearest form to scope drag & drop\n useEffect(() => {\n const root = anchorRef.current?.closest('form');\n if (root instanceof HTMLFormElement) {\n formRef.current = root;\n }\n }, []);\n\n // ----- Local attachments (only used when no provider)\n const [items, setItems] = useState<(FileUIPart & { id: string })[]>([]);\n const files = usingProvider && controller ? controller.attachments.files : items;\n\n const _openFileDialogLocal = useCallback(() => {\n inputRef.current?.click();\n }, []);\n\n const matchesAccept = useCallback(\n (f: File) => {\n if (!accept || accept.trim() === '') {\n return true;\n }\n if (accept.includes('image/*')) {\n return f.type.startsWith('image/');\n }\n // NOTE: keep simple; expand as needed\n return true;\n },\n [accept],\n );\n\n const addLocal = useCallback(\n (fileList: File[] | FileList) => {\n const incoming = [...fileList];\n const accepted = incoming.filter(f => matchesAccept(f));\n if (incoming.length && accepted.length === 0) {\n onError?.({\n code: 'accept',\n message: 'No files match the accepted types.',\n });\n return;\n }\n const sized = accepted.filter(f =>\n effectiveMaxFileSize ? f.size <= effectiveMaxFileSize : true,\n );\n if (accepted.length > 0 && sized.length === 0) {\n onError?.({\n code: 'max_file_size',\n message: 'All files exceed the maximum size.',\n });\n return;\n }\n\n setItems(prev => {\n const capacity =\n typeof maxFiles === 'number' ? Math.max(0, maxFiles - prev.length) : undefined;\n const capped = typeof capacity === 'number' ? sized.slice(0, capacity) : sized;\n if (typeof capacity === 'number' && sized.length > capacity) {\n onError?.({\n code: 'max_files',\n message: 'Too many files. Some were not added.',\n });\n }\n const next: (FileUIPart & { id: string })[] = capped.map(file => ({\n id: nanoid(),\n type: 'file',\n url: URL.createObjectURL(file),\n mediaType: file.type,\n filename: file.name,\n }));\n return [...prev, ...next];\n });\n },\n [matchesAccept, maxFiles, effectiveMaxFileSize, onError],\n );\n\n const removeLocal = useCallback((id: string) => {\n setItems(prev => {\n const found = prev.find(file => file.id === id);\n if (found?.url) {\n URL.revokeObjectURL(found.url);\n }\n return prev.filter(file => file.id !== id);\n });\n }, []);\n\n const clearLocal = useCallback(() => {\n setItems(prev => {\n for (const file of prev) {\n if (file.url) {\n URL.revokeObjectURL(file.url);\n }\n }\n return [];\n });\n }, []);\n\n const add = useMemo(\n () => (controller ? (files: File[] | FileList) => controller.attachments.add(files) : addLocal),\n [controller, addLocal],\n );\n\n const remove = useMemo(\n () => (controller ? (id: string) => controller.attachments.remove(id) : removeLocal),\n [controller, removeLocal],\n );\n\n const clear = useMemo(\n () => (controller ? () => controller.attachments.clear() : clearLocal),\n [controller, clearLocal],\n );\n\n // Note: File input cannot be programmatically set for security reasons\n // The syncHiddenInput prop is no longer functional\n useEffect(() => {\n if (syncHiddenInput && inputRef.current && files.length === 0) {\n inputRef.current.value = '';\n }\n }, [files, syncHiddenInput]);\n\n // ---- React Dropzone Integration ----\n // Handle accepted files from dropzone\n const onDrop = useCallback(\n (acceptedFiles: File[], fileRejections: FileRejection[]) => {\n // Handle rejections\n if (fileRejections.length > 0) {\n const firstRejection = fileRejections[0];\n if (firstRejection) {\n const errorCode = firstRejection.errors[0]?.code;\n\n if (errorCode === 'file-invalid-type') {\n onError?.({\n code: 'accept',\n message: 'File type not accepted.',\n });\n } else if (errorCode === 'file-too-large') {\n onError?.({\n code: 'max_file_size',\n message: 'File exceeds the maximum size.',\n });\n } else if (errorCode === 'too-many-files') {\n onError?.({\n code: 'max_files',\n message: 'Too many files.',\n });\n }\n }\n }\n\n // Add accepted files\n if (acceptedFiles.length > 0) {\n add(acceptedFiles);\n }\n },\n [add, onError],\n );\n\n // Configure react-dropzone\n const dropzoneOptions: any = useMemo(\n () => ({\n onDrop,\n accept: accept\n ? accept.split(',').reduce(\n (acc, type) => {\n const trimmed = type.trim();\n // Handle wildcards like \"image/*\"\n if (trimmed.includes('/*')) {\n acc[trimmed] = [];\n } else {\n // Handle specific extensions or MIME types\n acc[trimmed] = [];\n }\n return acc;\n },\n {} as Record<string, string[]>,\n )\n : undefined,\n multiple: multiple ?? true,\n maxFiles,\n maxSize: effectiveMaxFileSize,\n noClick: true, // We handle click via openFileDialog\n noKeyboard: true, // Don't interfere with textarea keyboard\n preventDropOnDocument: !globalDrop, // Only prevent if not using global drop\n }),\n [onDrop, accept, multiple, maxFiles, effectiveMaxFileSize, globalDrop],\n );\n\n const {\n getRootProps,\n getInputProps,\n isDragActive,\n isDragAccept,\n isDragReject,\n open: dropzoneOpen,\n } = useDropzone(dropzoneOptions);\n\n // Override openFileDialog to use dropzone's open when available\n const effectiveOpenFileDialog = useCallback(() => {\n dropzoneOpen();\n }, [dropzoneOpen]);\n\n // Let provider know about our hidden file input so external menus can call openFileDialog()\n useEffect(() => {\n if (!usingProvider || !controller) return;\n controller.registerFileInput(inputRef, effectiveOpenFileDialog);\n }, [usingProvider, controller, effectiveOpenFileDialog]);\n\n useEffect(\n () => () => {\n if (!usingProvider) {\n for (const f of files) {\n if (f.url) URL.revokeObjectURL(f.url);\n }\n }\n },\n [usingProvider, files],\n );\n\n const ctx = useMemo<AttachmentsContext>(\n () => ({\n files: files.map(item => ({ ...item, id: item.id })),\n add,\n remove,\n clear,\n openFileDialog: effectiveOpenFileDialog,\n fileInputRef: inputRef,\n // Dropzone state\n isDragActive,\n isDragAccept,\n isDragReject,\n }),\n [files, add, remove, clear, effectiveOpenFileDialog, isDragActive, isDragAccept, isDragReject],\n );\n\n const handleSubmit: FormEventHandler<HTMLFormElement> = event => {\n event.preventDefault();\n\n const form = event.currentTarget;\n const text =\n usingProvider && controller\n ? controller.textInput.value\n : (() => {\n const formData = new FormData(form);\n const message = formData.get('message');\n return typeof message === 'string' ? message : '';\n })();\n\n // Reset form immediately after capturing text to avoid race condition\n // where user input during async blob conversion would be lost\n if (!usingProvider) {\n form.reset();\n }\n\n // Convert blob URLs to data URLs and submit asynchronously\n const processAndSubmit = async () => {\n const convertedFiles = await Promise.all(\n files.map(async fileWithId => {\n // Exclude id from item for submission\n const item: FileUIPart = {\n type: fileWithId.type,\n url: fileWithId.url,\n mediaType: fileWithId.mediaType,\n filename: fileWithId.filename,\n };\n if (item.url.startsWith('blob:')) {\n return {\n ...item,\n url: await convertBlobUrlToDataUrl(item.url),\n };\n }\n return item;\n }),\n );\n\n try {\n const result = onSubmit({ text, files: convertedFiles }, event);\n\n // Handle both sync and async onSubmit\n if (result instanceof Promise) {\n try {\n await result;\n clear();\n if (usingProvider && controller) {\n controller.textInput.clear();\n }\n } catch {\n // Don't clear on error - user may want to retry\n }\n } else {\n // Sync function completed without throwing, clear attachments\n clear();\n if (usingProvider && controller) {\n controller.textInput.clear();\n }\n }\n } catch {\n // Don't clear on error - user may want to retry\n }\n };\n\n void processAndSubmit();\n };\n\n // Get dropzone props, excluding onSubmit to not conflict with form handler\n const { onSubmit: _dropzoneOnSubmit, ...rootProps } = getRootProps();\n\n // Render with or without local provider\n const inner = (\n <InlineModeContext.Provider value={inlineModeValue}>\n <span aria-hidden=\"true\" className=\"hidden\" ref={anchorRef} />\n {/* React Dropzone hidden file input */}\n {!inline && <input {...getInputProps()} ref={inputRef} />}\n <form className={cn('w-full', className)} onSubmit={handleSubmit} {...rootProps} {...props}>\n <InputGroup\n className={cn(\n // Figma design: white background, light gray border, 12px radius, 12px padding\n 'bg-surface text-foreground rounded-xl p-3',\n // Flex column layout - no gap so empty header doesn't add space\n 'flex flex-col items-stretch justify-between',\n // Premium Harmony V2: Respect reduced motion for transitions\n reducedMotion ? 'transition-none' : 'transition-all duration-200',\n // Override default InputGroup focus ring styles\n 'has-[[data-slot=input-group-control]:focus-visible]:ring-0',\n // Override child component padding to maintain consistent 12px wrapper padding\n '[&_[data-slot=input-group-control]]:py-0',\n '[&_[data-slot=input-group-addon]]:p-0',\n // Conditional styling based on inline mode\n inline\n ? [\n // Inline mode: always show glow border, no min-height\n 'border-primary/30 h-auto',\n // Premium Harmony V2: Semantic shadow using primary color\n 'shadow-[0_0_0_4px_color-mix(in_oklab,var(--color-primary),transparent_80%)]',\n ]\n : [\n // Default mode: gray border, min-height, focus glow\n 'border-border shadow-none',\n 'h-auto min-h-[136px]',\n 'has-[[data-slot=input-group-control]:focus-visible]:border-primary/30',\n // Focus glow with subtle pulse animation (respects reduced motion)\n 'focus-within:border-primary/30',\n !reducedMotion && 'focus-within:animate-focus-pulse',\n 'focus-within:shadow-[0_0_0_4px_color-mix(in_oklab,var(--color-primary),transparent_80%)]',\n ],\n // Visual feedback when dragging files over\n isDragActive &&\n !inline && [\n 'border-primary/50',\n 'bg-primary/5',\n 'shadow-[0_0_0_3px_color-mix(in_oklab,var(--color-primary),0.1)]',\n ],\n isDragReject && !inline && ['border-destructive/50', 'bg-destructive/5'],\n )}\n data-inline={inline ?? undefined}\n data-drag-active={isDragActive || undefined}\n data-drag-accept={isDragAccept || undefined}\n data-drag-reject={isDragReject || undefined}\n >\n {children}\n </InputGroup>\n </form>\n </InlineModeContext.Provider>\n );\n\n return usingProvider ? (\n inner\n ) : (\n <LocalAttachmentsContext.Provider value={ctx}>{inner}</LocalAttachmentsContext.Provider>\n );\n};\n\nexport type PromptInputBodyProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputBody = ({ className, ...props }: PromptInputBodyProps) => (\n <div className={cn('contents', className)} {...props} />\n);\n\nexport type PromptInputTextareaProps = ComponentProps<typeof InputGroupTextarea> & {\n /** Default value for uncontrolled mode */\n defaultValue?: string;\n /** Minimum number of rows (default: 1) */\n minRows?: number;\n /** Maximum number of rows before scrolling (default: 12, ~192px) */\n maxRows?: number;\n};\n\n/**\n * PromptInputTextarea - Auto-expanding textarea with keyboard shortcuts\n *\n * Supports both controlled (value/onChange) and uncontrolled (defaultValue) modes\n * via Mantine's useUncontrolled hook.\n *\n * @keyboard\n * - Cmd/Ctrl+Enter: Submit form\n * - Backspace (when empty): Remove last attachment\n * - Escape: Blur textarea\n */\nexport const PromptInputTextarea = forwardRef<HTMLTextAreaElement, PromptInputTextareaProps>(\n (\n {\n value: valueProp,\n defaultValue,\n onChange,\n className,\n placeholder = 'Ask me anything...',\n minRows = 1,\n maxRows = 12,\n ...props\n },\n ref,\n ) => {\n const controller = useOptionalPromptInputController();\n const attachments = usePromptInputAttachments();\n const { inline, onCancel } = usePromptInputInlineMode();\n const [isComposing, setIsComposing] = useState(false);\n const internalRef = useRef<HTMLTextAreaElement>(null);\n\n // Use Mantine's useFocusReturn to restore focus after form submission\n // This improves UX by letting users continue typing immediately after sending\n const focusReturnRef = useFocusReturn({ opened: true, shouldReturnFocus: true });\n\n // Combine forwarded ref with internal ref using Mantine's useMergedRef\n const mergedRef = useMergedRef(ref, internalRef, focusReturnRef);\n\n // Use Mantine's useUncontrolled for controlled/uncontrolled mode support\n // When controller is present, it takes precedence\n const controllerValue = controller?.textInput.value;\n const [value, handleValueChange] = useUncontrolled({\n value: controllerValue ?? (typeof valueProp === 'string' ? valueProp : undefined),\n defaultValue: defaultValue ?? '',\n finalValue: '',\n onChange: (newValue: string) => {\n if (controller) {\n controller.textInput.setInput(newValue);\n }\n },\n });\n\n // Auto-resize textarea based on content using Mantine's useResizeObserver\n const { containerRef } = useTextareaAutosize(internalRef, value, {\n minRows,\n maxRows,\n lineHeight: 20, // matches leading-5 (1.25rem = 20px)\n });\n\n // Global keyboard shortcuts using Mantine's useHotkeys\n useHotkeys(\n [\n // Cmd/Ctrl+Enter to submit\n [\n 'mod+Enter',\n () => {\n if (isComposing) return;\n const form = internalRef.current?.closest('form');\n const submitButton = form?.querySelector(\n 'button[type=\"submit\"]',\n ) as HTMLButtonElement | null;\n if (submitButton?.disabled) return;\n form?.requestSubmit();\n },\n { preventDefault: true },\n ],\n // Escape: trigger onCancel in inline mode, otherwise just blur\n [\n 'Escape',\n () => {\n if (inline && onCancel) {\n onCancel();\n } else {\n internalRef.current?.blur();\n }\n },\n ],\n ],\n [], // Empty array = don't ignore any element types (handle in textarea)\n );\n\n const handleKeyDown: KeyboardEventHandler<HTMLTextAreaElement> = e => {\n // Cmd/Ctrl+Enter to submit (Enter alone creates new line)\n if (e.key === 'Enter' && (e.metaKey || e.ctrlKey)) {\n if (isComposing || e.nativeEvent.isComposing) {\n return;\n }\n e.preventDefault();\n\n // Check if the submit button is disabled before submitting\n const { form } = e.currentTarget;\n const submitButton = form?.querySelector(\n 'button[type=\"submit\"]',\n ) as HTMLButtonElement | null;\n if (submitButton?.disabled) {\n return;\n }\n\n form?.requestSubmit();\n }\n\n // Remove last attachment when Backspace is pressed and textarea is empty\n if (e.key === 'Backspace' && e.currentTarget.value === '' && attachments.files.length > 0) {\n e.preventDefault();\n const lastAttachment = attachments.files.at(-1);\n if (lastAttachment) {\n attachments.remove(lastAttachment.id);\n }\n }\n };\n\n const handlePaste: ClipboardEventHandler<HTMLTextAreaElement> = event => {\n const { items } = event.clipboardData;\n const files: File[] = [];\n\n for (const item of items) {\n if (item.kind === 'file') {\n const file = item.getAsFile();\n if (file) {\n files.push(file);\n }\n }\n }\n\n if (files.length > 0) {\n event.preventDefault();\n attachments.add(files);\n }\n };\n\n const handleChange: ChangeEventHandler<HTMLTextAreaElement> = e => {\n handleValueChange(e.currentTarget.value);\n onChange?.(e);\n };\n\n return (\n <div ref={containerRef} className=\"flex w-full flex-1 items-start gap-1 self-start\">\n {/* Magic wand icon - hidden in inline mode */}\n {!inline && (\n <PromptInputButton variant=\"ghost\" className=\"shrink-0 opacity-80\">\n <WandSparklesIcon className={AI_ICON.md} />\n </PromptInputButton>\n )}\n <InputGroupTextarea\n ref={mergedRef}\n className={cn(\n // Auto-grow handled by useTextareaAutosize hook\n 'min-h-5 resize-none py-0',\n // Figma typography: 14px when typing, placeholder styled separately\n 'text-foreground text-sm leading-5',\n 'placeholder:text-foreground-subtle placeholder:text-xs placeholder:leading-4 placeholder:opacity-75',\n // Top margin only when wand icon is visible (aligns with icon)\n !inline && 'mt-1.5',\n className,\n )}\n name=\"message\"\n onCompositionEnd={() => setIsComposing(false)}\n onCompositionStart={() => setIsComposing(true)}\n onKeyDown={handleKeyDown}\n onPaste={handlePaste}\n placeholder={placeholder}\n value={value}\n onChange={handleChange}\n {...props}\n />\n </div>\n );\n },\n);\n\nPromptInputTextarea.displayName = 'PromptInputTextarea';\n\nexport type PromptInputHeaderProps = Omit<ComponentProps<typeof InputGroupAddon>, 'align'>;\n\nexport const PromptInputHeader = ({ className, ...props }: PromptInputHeaderProps) => (\n <InputGroupAddon\n align=\"block-end\"\n className={cn(\n 'order-first flex-wrap gap-1',\n // Hide when empty (no attachments), add spacing only when visible\n 'empty:hidden [&:not(:empty)]:mb-3',\n className,\n )}\n {...props}\n />\n);\n\nexport type PromptInputFooterProps = Omit<ComponentProps<typeof InputGroupAddon>, 'align'>;\n\nexport const PromptInputFooter = ({ className, ...props }: PromptInputFooterProps) => (\n <InputGroupAddon\n align=\"block-end\"\n className={cn('mt-3 w-full shrink-0 items-center justify-between gap-4', className)}\n {...props}\n />\n);\n\nexport type PromptInputToolsProps = HTMLAttributes<HTMLDivElement>;\n\n/**\n * Left-side tools container with 5px gap (per Figma design)\n */\nexport const PromptInputTools = ({ className, ...props }: PromptInputToolsProps) => (\n <div className={cn('flex items-center gap-[5px]', className)} {...props} />\n);\n\nexport type PromptInputActionsProps = HTMLAttributes<HTMLDivElement>;\n\n/**\n * Right-side actions container with 16px gap (per Figma design)\n * Contains mic button and send button\n */\nexport const PromptInputActions = ({ className, ...props }: PromptInputActionsProps) => (\n <div className={cn('flex items-center gap-4', className)} {...props} />\n);\n\n/**\n * Tools button component matching Figma design.\n * Shows an icon with \"Tools\" text label.\n */\nexport type PromptInputToolsButtonProps = PromptInputButtonProps & {\n label?: string;\n};\n\nexport const PromptInputToolsButton = ({\n className,\n label = 'Tools',\n children,\n ...props\n}: PromptInputToolsButtonProps) => (\n <PromptInputButton\n className={cn(\n // Figma: px-[12px] py-[6px] gap-[8px]\n AI_SPACING.xs,\n 'px-3 py-1.5',\n 'flex items-center justify-center',\n className,\n )}\n {...props}\n >\n {children ?? <SlidersHorizontalIcon className={AI_ICON.lg} />}\n <span\n className={cn('text-foreground-subtle leading-5 font-medium whitespace-nowrap', AI_TEXT.sm)}\n >\n {label}\n </span>\n </PromptInputButton>\n);\n\n/**\n * CVA variants for PromptInput buttons matching Figma AXIO.ai design\n * Premium Harmony V2: Uses AI_FOCUS for accessible focus styles\n * @see https://www.figma.com/design/9DTQx1GRsJA4zSScFUSego/AXIO.ai\n */\nexport const promptInputButtonVariants = cva(\n // Base styles - uses AI_FOCUS for consistent focus-visible behavior\n [\n 'rounded-lg text-sm font-medium transition-all duration-150',\n 'active:scale-[0.98]',\n AI_FOCUS.ring,\n ].join(' '),\n {\n variants: {\n variant: {\n // Default: Active/selected state - light blue bg\n default: ['border border-primary/20 bg-primary/10 text-primary', 'hover:bg-primary/15'],\n // Outline: Plus (+) and Tools buttons - white bg, gray border\n outline: [\n 'border border-border bg-surface text-foreground',\n 'hover:bg-surface-subtle hover:text-foreground',\n ],\n // Ghost: Mic button - transparent, no border\n ghost: ['border-0 bg-transparent text-foreground-subtle p-0', 'hover:opacity-80'],\n // Filled: Send button - blue gradient\n filled: [\n 'relative overflow-clip border border-primary text-primary-foreground',\n 'hover:opacity-90',\n 'disabled:active:scale-100',\n ],\n },\n },\n defaultVariants: {\n variant: 'outline',\n },\n },\n);\n\nexport type PromptInputButtonVariant = VariantProps<typeof promptInputButtonVariants>['variant'];\n\nexport type PromptInputButtonProps = React.ComponentProps<typeof Button> &\n VariantProps<typeof promptInputButtonVariants>;\n\nexport const PromptInputButton = ({\n variant = 'outline',\n className,\n size,\n children,\n ...props\n}: PromptInputButtonProps) => {\n // Premium Harmony V2: Touch vs desktop detection for adaptive sizing\n const isTouchDevice = useMediaQuery('(pointer: coarse)');\n\n // Ensure 44px minimum touch target on mobile (11 * 4px = 44px)\n const buttonSize =\n size ?? (Children.count(children) > 1 ? 'sm' : (isTouchDevice ? 'icon' : 'icon-sm'));\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n size={buttonSize}\n className={cn(\n promptInputButtonVariants({ variant }),\n // Ensure minimum 44px touch target on mobile\n isTouchDevice && 'min-h-11 min-w-11',\n className,\n )}\n {...props}\n >\n {children}\n </Button>\n );\n};\n\nexport type PromptInputActionMenuProps = ComponentProps<typeof DropdownMenu> & {\n /** Custom click outside handler - called when clicking outside menu AND trigger */\n onClickOutside?: () => void;\n};\n\n/**\n * PromptInputActionMenu - Dropdown menu with optional click-outside detection\n *\n * Uses Mantine's useClickOutside hook for advanced click-outside handling.\n * The default Radix behavior handles basic click-outside; use onClickOutside\n * for custom logic (e.g., closing multiple menus, analytics).\n */\nexport const PromptInputActionMenu = ({ onClickOutside, ...props }: PromptInputActionMenuProps) => {\n // Only set up click outside handler if provided\n const clickOutsideRef = useClickOutside<HTMLDivElement>(() => {\n onClickOutside?.();\n }, ['mousedown', 'touchstart']);\n\n // Wrap in a div with ref only if onClickOutside is provided\n if (onClickOutside) {\n return (\n <div ref={clickOutsideRef} className=\"contents\">\n <DropdownMenu {...props} />\n </div>\n );\n }\n\n return <DropdownMenu {...props} />;\n};\n\nexport type PromptInputActionMenuTriggerProps = PromptInputButtonProps;\n\nexport const PromptInputActionMenuTrigger = ({\n className,\n children,\n ...props\n}: PromptInputActionMenuTriggerProps) => (\n <DropdownMenuTrigger asChild>\n <PromptInputButton className={cn(AI_SPACING.xs, 'p-[7px]', className)} {...props}>\n {children ?? <PlusIcon className={AI_ICON.lg} />}\n </PromptInputButton>\n </DropdownMenuTrigger>\n);\n\nexport type PromptInputActionMenuContentProps = ComponentProps<typeof DropdownMenuContent>;\n\n/**\n * PromptInputActionMenuContent - Styled dropdown menu content\n *\n * Uses Radix's built-in click-outside handling. For advanced click-outside logic,\n * use the `onInteractOutside` prop from Radix DropdownMenuContent.\n */\nexport const PromptInputActionMenuContent = ({\n className,\n ...props\n}: PromptInputActionMenuContentProps) => (\n <DropdownMenuContent align=\"start\" className={cn(className)} {...props} />\n);\n\nexport type PromptInputActionMenuItemProps = ComponentProps<typeof DropdownMenuItem>;\nexport const PromptInputActionMenuItem = ({\n className,\n ...props\n}: PromptInputActionMenuItemProps) => <DropdownMenuItem className={cn(className)} {...props} />;\n\n// Note: Actions that perform side-effects (like opening a file dialog)\n// are provided in opt-in modules (e.g., prompt-input-attachments).\n\nexport type PromptInputSubmitProps = React.ComponentProps<typeof Button> & {\n status?: ChatStatus;\n};\n\nexport const PromptInputSubmit = ({\n className,\n status,\n children,\n ...props\n}: PromptInputSubmitProps) => {\n const { inline } = usePromptInputInlineMode();\n // Premium Harmony V2: Touch vs desktop detection\n const isTouchDevice = useMediaQuery('(pointer: coarse)');\n const reducedMotion = useReducedMotion();\n\n // Premium Harmony V2: Memoized animation variants with spring physics\n const iconVariants = useMemo(\n () => ({\n initial: { scale: 0.8, opacity: 0 },\n animate: {\n scale: 1,\n opacity: 1,\n transition: reducedMotion ? { duration: 0 } : SPRING_TACTILE,\n },\n exit: {\n scale: 0.8,\n opacity: 0,\n transition: reducedMotion ? { duration: 0 } : SPRING_FLUID,\n },\n }),\n [reducedMotion],\n );\n\n let Icon = <ArrowUpIcon className={AI_ICON.lg} />;\n let iconKey = 'arrow';\n\n if (status === 'submitted') {\n Icon = <Loader2Icon className={cn(AI_ICON.lg, !reducedMotion && 'animate-spin')} />;\n iconKey = 'loader';\n } else if (status === 'streaming') {\n Icon = <SquareIcon className={AI_ICON.lg} />;\n iconKey = 'square';\n } else if (status === 'error') {\n Icon = <XIcon className={AI_ICON.lg} />;\n iconKey = 'error';\n }\n\n // Inline mode: dark button style from Figma (node 15225:18614)\n if (inline) {\n return (\n <Button\n type=\"submit\"\n variant=\"ghost\"\n aria-label=\"Submit\"\n className={cn(\n // Compact inline CTA\n 'bg-foreground relative gap-1 overflow-clip rounded-lg border-0 py-1.5 pr-3 pl-1.5',\n 'text-background',\n 'hover:bg-foreground/90',\n 'disabled:opacity-50',\n // Premium Harmony V2: 44px minimum touch target\n isTouchDevice && 'min-h-11',\n className,\n )}\n data-testid=\"prompt-input-submit\"\n data-state={status ?? 'idle'}\n data-loading={status === 'submitted' || status === 'streaming' ? '' : undefined}\n {...props}\n >\n {children ?? (\n <>\n <AnimatePresence mode=\"wait\" initial={false}>\n <motion.div\n key={iconKey}\n variants={iconVariants}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n >\n {Icon}\n </motion.div>\n </AnimatePresence>\n <span className=\"text-xs font-medium whitespace-nowrap\">Send</span>\n </>\n )}\n </Button>\n );\n }\n\n // Default mode: blue gradient button (semantic bg-primary for gradient base)\n return (\n <Button\n type=\"submit\"\n variant=\"ghost\"\n aria-label=\"Submit\"\n className={cn(\n promptInputButtonVariants({ variant: 'filled' }),\n // Figma: pl-[6px] pr-[12px] py-[6px] gap-[4px]\n 'gap-1 py-1.5 pr-3 pl-1.5',\n // Premium Harmony V2: Semantic gradient using bg-primary\n 'from-primary to-primary bg-gradient-to-r',\n // Premium Harmony V2: 44px minimum touch target\n isTouchDevice && 'min-h-11',\n className,\n )}\n data-testid=\"prompt-input-submit\"\n data-state={status ?? 'idle'}\n data-loading={status === 'submitted' || status === 'streaming' ? '' : undefined}\n {...props}\n >\n {children ?? (\n <>\n <AnimatePresence mode=\"wait\" initial={false}>\n <motion.div\n key={iconKey}\n variants={iconVariants}\n initial=\"initial\"\n animate=\"animate\"\n exit=\"exit\"\n >\n {Icon}\n </motion.div>\n </AnimatePresence>\n <span className=\"whitespace-nowrap\">Send</span>\n </>\n )}\n {/* Subtle highlight overlay for depth */}\n <div\n className=\"pointer-events-none absolute inset-0 rounded-lg bg-gradient-to-b from-white/10 to-transparent\"\n aria-hidden=\"true\"\n />\n </Button>\n );\n};\n\nexport type PromptInputCancelButtonProps = React.ComponentProps<typeof Button>;\n\n/**\n * Cancel button for inline edit mode\n * Triggers the onCancel callback from PromptInput\n */\nexport const PromptInputCancelButton = ({\n className,\n children,\n onClick,\n ...props\n}: PromptInputCancelButtonProps) => {\n const { onCancel } = usePromptInputInlineMode();\n // Premium Harmony V2: Touch vs desktop detection\n const isTouchDevice = useMediaQuery('(pointer: coarse)');\n\n const handleClick = (e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n onCancel?.();\n };\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n className={cn(\n // Figma outline style: white bg, gray border (node 15225:18546)\n 'border-border bg-surface rounded-lg border px-3 py-1.5',\n 'text-foreground text-sm font-medium',\n 'shadow-sm',\n 'hover:bg-surface-subtle active:scale-95',\n // Premium Harmony V2: Use AI_FOCUS for consistent focus-visible styles\n AI_FOCUS.ring,\n // Premium Harmony V2: 44px minimum touch target\n isTouchDevice && 'min-h-11',\n className,\n )}\n onClick={handleClick}\n {...props}\n >\n {children ?? 'Cancel'}\n </Button>\n );\n};\n\ninterface SpeechRecognition extends EventTarget {\n continuous: boolean;\n interimResults: boolean;\n lang: string;\n start(): void;\n stop(): void;\n onstart: ((this: SpeechRecognition, ev: Event) => void) | null;\n onend: ((this: SpeechRecognition, ev: Event) => void) | null;\n onresult: ((this: SpeechRecognition, ev: SpeechRecognitionEvent) => void) | null;\n onerror: ((this: SpeechRecognition, ev: SpeechRecognitionErrorEvent) => void) | null;\n}\n\ninterface SpeechRecognitionEvent extends Event {\n results: SpeechRecognitionResultList;\n}\n\ntype SpeechRecognitionResultList = {\n readonly length: number;\n item(index: number): SpeechRecognitionResult;\n [index: number]: SpeechRecognitionResult;\n};\n\ntype SpeechRecognitionResult = {\n readonly length: number;\n item(index: number): SpeechRecognitionAlternative;\n [index: number]: SpeechRecognitionAlternative;\n isFinal: boolean;\n};\n\ntype SpeechRecognitionAlternative = {\n transcript: string;\n confidence: number;\n};\n\ninterface SpeechRecognitionErrorEvent extends Event {\n error: string;\n}\n\ndeclare global {\n interface Window {\n SpeechRecognition: {\n new (): SpeechRecognition;\n };\n webkitSpeechRecognition: {\n new (): SpeechRecognition;\n };\n }\n}\n\nexport type PromptInputSpeechButtonProps = React.ComponentProps<typeof Button> & {\n textareaRef?: RefObject<HTMLTextAreaElement | null>;\n onTranscriptionChange?: (text: string) => void;\n};\n\nexport const PromptInputSpeechButton = ({\n className,\n textareaRef,\n onTranscriptionChange,\n ...props\n}: PromptInputSpeechButtonProps) => {\n const [isListening, setIsListening] = useState(false);\n const [isReady, setIsReady] = useState(false);\n const recognitionRef = useRef<SpeechRecognition | null>(null);\n // Premium Harmony V2: Touch vs desktop detection and reduced motion support\n const isTouchDevice = useMediaQuery('(pointer: coarse)');\n const reducedMotion = useReducedMotion();\n // Store onTranscriptionChange callback in ref to prevent unnecessary effect re-runs\n const onTranscriptionChangeRef = useRef(onTranscriptionChange);\n\n // Update ref when callback changes\n useEffect(() => {\n onTranscriptionChangeRef.current = onTranscriptionChange;\n }, [onTranscriptionChange]);\n\n useEffect(() => {\n if (typeof window === 'undefined') {\n return;\n }\n\n // SpeechRecognition may not be available in all browsers\n\n const SpeechRecognitionConstructor = window.SpeechRecognition ?? window.webkitSpeechRecognition;\n\n if (!SpeechRecognitionConstructor) {\n return;\n }\n\n const speechRecognition = new SpeechRecognitionConstructor();\n\n speechRecognition.continuous = true;\n speechRecognition.interimResults = true;\n speechRecognition.lang = 'en-US';\n\n speechRecognition.onstart = () => {\n setIsListening(true);\n };\n\n speechRecognition.onend = () => {\n setIsListening(false);\n };\n\n speechRecognition.onresult = event => {\n let finalTranscript = '';\n\n for (let i = 0; i < event.results.length; i++) {\n const result = event.results[i];\n if (result?.isFinal) {\n finalTranscript += result[0]?.transcript ?? '';\n }\n }\n\n if (finalTranscript && textareaRef?.current) {\n const textarea = textareaRef.current;\n const currentValue = textarea.value;\n const newValue = currentValue + (currentValue ? ' ' : '') + finalTranscript;\n\n textarea.value = newValue;\n textarea.dispatchEvent(new Event('input', { bubbles: true }));\n onTranscriptionChangeRef.current?.(newValue);\n }\n };\n\n speechRecognition.onerror = event => {\n logger.error('Speech recognition error', { error: event.error });\n setIsListening(false);\n };\n\n recognitionRef.current = speechRecognition;\n // Use setTimeout to avoid setState in effect warning\n const timer = setTimeout(() => setIsReady(true), 0);\n\n return () => {\n clearTimeout(timer);\n if (recognitionRef.current) {\n recognitionRef.current.stop();\n }\n };\n }, [textareaRef]);\n\n const toggleListening = useCallback(() => {\n if (!recognitionRef.current) {\n return;\n }\n\n if (isListening) {\n recognitionRef.current.stop();\n } else {\n recognitionRef.current.start();\n }\n }, [isListening]);\n\n return (\n <Button\n type=\"button\"\n variant=\"ghost\"\n aria-label={isListening ? 'Stop recording' : 'Start recording'}\n className={cn(\n promptInputButtonVariants({ variant: 'ghost' }),\n // Premium Harmony V2: Respect reduced motion preference\n isListening && !reducedMotion && 'animate-pulse',\n // Premium Harmony V2: 44px minimum touch target\n isTouchDevice && 'min-h-11 min-w-11',\n className,\n )}\n disabled={!isReady}\n onClick={toggleListening}\n data-state={isListening ? 'listening' : 'idle'}\n data-ready={isReady ? '' : undefined}\n {...props}\n >\n <MicIcon className={cn('text-foreground-subtle', 'size-6')} />\n </Button>\n );\n};\n\nexport type PromptInputSelectProps = ComponentProps<typeof Select>;\n\nexport const PromptInputSelect = (props: PromptInputSelectProps) => <Select {...props} />;\n\nexport type PromptInputSelectTriggerProps = ComponentProps<typeof SelectTrigger>;\n\nexport const PromptInputSelectTrigger = ({\n className,\n ...props\n}: PromptInputSelectTriggerProps) => (\n <SelectTrigger\n className={cn(\n 'text-muted-foreground border-none bg-transparent font-medium shadow-none transition-colors',\n 'hover:bg-accent hover:text-foreground aria-expanded:bg-accent aria-expanded:text-foreground',\n className,\n )}\n {...props}\n />\n);\n\nexport type PromptInputSelectContentProps = ComponentProps<typeof SelectContent>;\n\nexport const PromptInputSelectContent = ({\n className,\n ...props\n}: PromptInputSelectContentProps) => <SelectContent className={cn(className)} {...props} />;\n\nexport type PromptInputSelectItemProps = ComponentProps<typeof SelectItem>;\n\nexport const PromptInputSelectItem = ({ className, ...props }: PromptInputSelectItemProps) => (\n <SelectItem className={cn(className)} {...props} />\n);\n\nexport type PromptInputSelectValueProps = ComponentProps<typeof SelectValue>;\n\nexport const PromptInputSelectValue = ({ className, ...props }: PromptInputSelectValueProps) => (\n <SelectValue className={cn(className)} {...props} />\n);\n\nexport type PromptInputHoverCardProps = ComponentProps<typeof HoverCard>;\n\nexport const PromptInputHoverCard = ({\n openDelay = 0,\n closeDelay = 0,\n ...props\n}: PromptInputHoverCardProps) => (\n <HoverCard closeDelay={closeDelay} openDelay={openDelay} {...props} />\n);\n\nexport type PromptInputHoverCardTriggerProps = ComponentProps<typeof HoverCardTrigger>;\n\nexport const PromptInputHoverCardTrigger = (props: PromptInputHoverCardTriggerProps) => (\n <HoverCardTrigger {...props} />\n);\n\nexport type PromptInputHoverCardContentProps = ComponentProps<typeof HoverCardContent>;\n\nexport const PromptInputHoverCardContent = ({\n align = 'start',\n ...props\n}: PromptInputHoverCardContentProps) => <HoverCardContent align={align} {...props} />;\n\nexport type PromptInputTabsListProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTabsList = ({ className, ...props }: PromptInputTabsListProps) => (\n <div className={cn(className)} {...props} />\n);\n\nexport type PromptInputTabProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTab = ({ className, ...props }: PromptInputTabProps) => (\n <div className={cn(className)} {...props} />\n);\n\nexport type PromptInputTabLabelProps = HTMLAttributes<HTMLHeadingElement>;\n\nexport const PromptInputTabLabel = ({\n className,\n children,\n ...props\n}: PromptInputTabLabelProps) => (\n <h3\n className={cn('text-muted-foreground mb-2 px-3 font-medium', AI_TEXT.xs, className)}\n {...props}\n >\n {children}\n </h3>\n);\n\nexport type PromptInputTabBodyProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTabBody = ({ className, ...props }: PromptInputTabBodyProps) => (\n <div className={cn('space-y-1', className)} {...props} />\n);\n\nexport type PromptInputTabItemProps = HTMLAttributes<HTMLDivElement>;\n\nexport const PromptInputTabItem = ({ className, ...props }: PromptInputTabItemProps) => (\n <div\n className={cn(\n 'hover:bg-accent flex items-center px-3 py-2',\n AI_SPACING.xs,\n AI_TEXT.xs,\n className,\n )}\n {...props}\n />\n);\n\nexport type PromptInputCommandProps = ComponentProps<typeof Command>;\n\nexport const PromptInputCommand = ({ className, ...props }: PromptInputCommandProps) => (\n <Command className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandInputProps = ComponentProps<typeof CommandInput>;\n\nexport const PromptInputCommandInput = ({ className, ...props }: PromptInputCommandInputProps) => (\n <CommandInput className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandListProps = ComponentProps<typeof CommandList>;\n\nexport const PromptInputCommandList = ({ className, ...props }: PromptInputCommandListProps) => (\n <CommandList className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandEmptyProps = ComponentProps<typeof CommandEmpty>;\n\nexport const PromptInputCommandEmpty = ({ className, ...props }: PromptInputCommandEmptyProps) => (\n <CommandEmpty className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandGroupProps = ComponentProps<typeof CommandGroup>;\n\nexport const PromptInputCommandGroup = ({ className, ...props }: PromptInputCommandGroupProps) => (\n <CommandGroup className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandItemProps = ComponentProps<typeof CommandItem>;\n\nexport const PromptInputCommandItem = ({ className, ...props }: PromptInputCommandItemProps) => (\n <CommandItem className={cn(className)} {...props} />\n);\n\nexport type PromptInputCommandSeparatorProps = ComponentProps<typeof CommandSeparator>;\n\nexport const PromptInputCommandSeparator = ({\n className,\n ...props\n}: PromptInputCommandSeparatorProps) => <CommandSeparator className={cn(className)} {...props} />;\n\n// ============================================================================\n// Re-exports: Mantine Hooks for Consumer Use\n// ============================================================================\n\n/**\n * Re-export Mantine hooks for consumers who want to build custom prompt input variants\n * or integrate with the PromptInput ecosystem.\n *\n * Premium Harmony V2 Additions:\n * - usePromptInputMediaQuery: Touch vs desktop detection\n * - usePromptInputReducedMotion: Accessibility motion preferences\n *\n * @example\n * ```tsx\n * import { usePromptInputHotkeys, usePromptInputClickOutside, usePromptInputMediaQuery, usePromptInputReducedMotion } from '@od-oneapp/uni-ui/components/ai-elements/prompt-input';\n *\n * // Custom component with keyboard shortcuts and responsive behavior\n * function CustomInput() {\n * const isTouchDevice = usePromptInputMediaQuery('(pointer: coarse)');\n * const reducedMotion = usePromptInputReducedMotion();\n *\n * usePromptInputHotkeys([\n * ['mod+K', () => openCommandPalette()],\n * ['Escape', () => closeInput()],\n * ]);\n *\n * return (\n * <button className={cn(isTouchDevice && 'min-h-11')}>\n * {/* ... * /}\n * </button>\n * );\n * }\n * ```\n */\nexport {\n useClickOutside as usePromptInputClickOutside,\n useFocusReturn as usePromptInputFocusReturn,\n useHotkeys as usePromptInputHotkeys,\n useIdle as usePromptInputIdle,\n useMediaQuery as usePromptInputMediaQuery,\n useMergedRef as usePromptInputMergedRef,\n useReducedMotion as usePromptInputReducedMotion,\n useUncontrolled as usePromptInputUncontrolled,\n} from '@mantine/hooks';\n"],"mappings":"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"}
@@ -0,0 +1,124 @@
1
+ 'use client';
2
+ import { t as cn } from "./utils-D2bGp2p_.mjs";
3
+ import { memo, useMemo } from "react";
4
+ import { useMediaQuery, useReducedMotion } from "@mantine/hooks";
5
+ import { cva } from "class-variance-authority";
6
+ import { GripVerticalIcon } from "lucide-react";
7
+ import { jsx } from "react/jsx-runtime";
8
+ import * as ResizablePrimitive from "react-resizable-panels";
9
+
10
+ //#region src/components/elements/organisms/resizable/resizable.tsx
11
+ /**
12
+ * @fileoverview Resizable Component - Premium Harmony V2
13
+ *
14
+ * A flexible panel layout component that allows users to resize sections via handles.
15
+ * Built on react-resizable-panels with Premium Harmony V2 design and motion standards.
16
+ * Supports horizontal and vertical orientations with touch-optimized handles.
17
+ *
18
+ * Features:
19
+ * - ES2023 syntax with modern patterns
20
+ * - Tailwind v4 CSS-first theming with CSS variables
21
+ * - Premium Harmony V2 design standards for layout and spacing
22
+ * - Touch detection with automatic sizing for mobile devices (WCAG 2.5.5)
23
+ * - Reduced motion support for accessibility
24
+ * - Orientation support (horizontal and vertical)
25
+ * - Draggable handles with visual feedback
26
+ * - Standardized focus ring using ring-primary token
27
+ * - Complete pseudo-state coverage (:hover, :focus-visible, :active)
28
+ * - Data attributes for state tracking (data-touch, data-reduced-motion)
29
+ * - Keyboard navigation for resizing via handles
30
+ * - Persistent layout support
31
+ * - Group and Panel compound component structure
32
+ *
33
+ * @module @od-oneapp/uni-ui/components/elements/organisms/resizable
34
+ * @component ResizablePanelGroup, ResizablePanel, ResizableHandle
35
+ *
36
+ * @useCases
37
+ * - Multi-pane application layouts: Sidebars, main content, and detail panels
38
+ * - Code editors: File tree, editor, and terminal sections
39
+ * - Dashboard builders: Resizable widgets and report sections
40
+ * - Admin panels: Collapsible and resizable navigation menus
41
+ * - Media players: Playlist and video player resizing
42
+ * - Split-screen views: Comparing two sets of data or content
43
+ *
44
+ * @subcomponents
45
+ * - ResizablePanelGroup - Container for resizable panels
46
+ * - ResizablePanel - Individual resizable section
47
+ * - ResizableHandle - Interaction point for resizing
48
+ *
49
+ * @variants
50
+ * - handle.size: sm, default, lg, touch
51
+ *
52
+ * @example <ResizablePanelGroup direction="horizontal"><ResizablePanel defaultSize={20}><Sidebar /></ResizablePanel><ResizableHandle withHandle /><ResizablePanel defaultSize={80}><MainContent /></ResizablePanel></ResizablePanelGroup>
53
+ */
54
+ /**
55
+ * ResizablePanelGroup component.
56
+ *
57
+ * Root container for a set of resizable panels.
58
+ * Accepts both `direction` (v3 compat) and `orientation` (v4) props.
59
+ */
60
+ const ResizablePanelGroup = ({ className, direction, orientation, ...props }) => {
61
+ const resolvedOrientation = orientation ?? direction ?? "horizontal";
62
+ return /* @__PURE__ */ jsx(ResizablePrimitive.Group, {
63
+ "data-slot": "resizable-panel-group",
64
+ "data-orientation": resolvedOrientation,
65
+ orientation: resolvedOrientation,
66
+ className: cn("flex size-full data-[orientation=vertical]:flex-col", className),
67
+ ...props
68
+ });
69
+ };
70
+ /**
71
+ * ResizablePanel component.
72
+ *
73
+ * An individual panel within a ResizablePanelGroup.
74
+ */
75
+ const ResizablePanel = ResizablePrimitive.Panel;
76
+ /**
77
+ * ResizableHandle variant definitions using CVA
78
+ */
79
+ const resizableHandleVariants = cva([
80
+ "bg-border relative flex items-center justify-center after:absolute transition-all duration-200 outline-none",
81
+ "focus-visible:ring-primary focus-visible:ring-2 focus-visible:ring-offset-2",
82
+ "aria-[orientation=vertical]:w-full aria-[orientation=vertical]:after:left-0 aria-[orientation=vertical]:after:w-full aria-[orientation=vertical]:after:translate-x-0 aria-[orientation=vertical]:after:-translate-y-1/2 [&[aria-orientation=vertical]>div]:rotate-90"
83
+ ], {
84
+ variants: { size: {
85
+ sm: "w-[0.5px] after:inset-y-0 after:left-1/2 after:w-2 after:-translate-x-1/2 aria-[orientation=vertical]:after:inset-x-0 aria-[orientation=vertical]:after:top-1/2 aria-[orientation=vertical]:h-[0.5px] aria-[orientation=vertical]:after:h-2 aria-[orientation=vertical]:after:-translate-y-1/2",
86
+ default: "w-px after:inset-y-0 after:left-1/2 after:w-4 after:-translate-x-1/2 aria-[orientation=vertical]:after:inset-x-0 aria-[orientation=vertical]:after:top-1/2 aria-[orientation=vertical]:h-px aria-[orientation=vertical]:after:h-4 aria-[orientation=vertical]:after:-translate-y-1/2",
87
+ lg: "w-0.5 after:inset-y-0 after:left-1/2 after:w-6 after:-translate-x-1/2 aria-[orientation=vertical]:after:inset-x-0 aria-[orientation=vertical]:after:top-1/2 aria-[orientation=vertical]:h-0.5 aria-[orientation=vertical]:after:h-6 aria-[orientation=vertical]:after:-translate-y-1/2",
88
+ touch: "w-1 after:inset-y-0 after:left-1/2 after:w-11 after:-translate-x-1/2 aria-[orientation=vertical]:after:inset-x-0 aria-[orientation=vertical]:after:top-1/2 aria-[orientation=vertical]:h-1 aria-[orientation=vertical]:after:h-11 aria-[orientation=vertical]:after:-translate-y-1/2"
89
+ } },
90
+ defaultVariants: { size: "default" }
91
+ });
92
+ const RESIZABLE_HANDLE_ICON_CONTAINER_CLASSNAME = "bg-border z-10 flex h-4 w-3 items-center justify-center rounded-sm border";
93
+ const RESIZABLE_HANDLE_ICON_CLASSNAME = "size-2.5";
94
+ /**
95
+ * ResizableHandle Component
96
+ *
97
+ * Interactive divider that allows users to resize adjacent panels.
98
+ */
99
+ const ResizableHandle = memo(({ className, withHandle, size, ...props }) => {
100
+ const isTouchDevice = useMediaQuery("(pointer: coarse)") ?? false;
101
+ const prefersReducedMotion = useReducedMotion() ?? false;
102
+ const effectiveSize = useMemo(() => {
103
+ if (size) return size;
104
+ return isTouchDevice ? "touch" : "default";
105
+ }, [size, isTouchDevice]);
106
+ const handleClassName = useMemo(() => cn(resizableHandleVariants({ size: effectiveSize }), className), [effectiveSize, className]);
107
+ const handleIcon = withHandle ? /* @__PURE__ */ jsx("div", {
108
+ className: RESIZABLE_HANDLE_ICON_CONTAINER_CLASSNAME,
109
+ children: /* @__PURE__ */ jsx(GripVerticalIcon, { className: RESIZABLE_HANDLE_ICON_CLASSNAME })
110
+ }) : null;
111
+ return /* @__PURE__ */ jsx(ResizablePrimitive.Separator, {
112
+ className: handleClassName,
113
+ "data-slot": "resizable-handle",
114
+ "data-touch": isTouchDevice ? "true" : "false",
115
+ "data-reduced-motion": prefersReducedMotion ? "true" : "false",
116
+ ...props,
117
+ children: handleIcon
118
+ });
119
+ });
120
+ ResizableHandle.displayName = "ResizableHandle";
121
+
122
+ //#endregion
123
+ export { resizableHandleVariants as i, ResizablePanel as n, ResizablePanelGroup as r, ResizableHandle as t };
124
+ //# sourceMappingURL=resizable--DaTse0W.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resizable--DaTse0W.mjs","names":[],"sources":["../src/components/elements/organisms/resizable/resizable.tsx"],"sourcesContent":["/**\n * @fileoverview Resizable Component - Premium Harmony V2\n *\n * A flexible panel layout component that allows users to resize sections via handles.\n * Built on react-resizable-panels with Premium Harmony V2 design and motion standards.\n * Supports horizontal and vertical orientations with touch-optimized handles.\n *\n * Features:\n * - ES2023 syntax with modern patterns\n * - Tailwind v4 CSS-first theming with CSS variables\n * - Premium Harmony V2 design standards for layout and spacing\n * - Touch detection with automatic sizing for mobile devices (WCAG 2.5.5)\n * - Reduced motion support for accessibility\n * - Orientation support (horizontal and vertical)\n * - Draggable handles with visual feedback\n * - Standardized focus ring using ring-primary token\n * - Complete pseudo-state coverage (:hover, :focus-visible, :active)\n * - Data attributes for state tracking (data-touch, data-reduced-motion)\n * - Keyboard navigation for resizing via handles\n * - Persistent layout support\n * - Group and Panel compound component structure\n *\n * @module @od-oneapp/uni-ui/components/elements/organisms/resizable\n * @component ResizablePanelGroup, ResizablePanel, ResizableHandle\n *\n * @useCases\n * - Multi-pane application layouts: Sidebars, main content, and detail panels\n * - Code editors: File tree, editor, and terminal sections\n * - Dashboard builders: Resizable widgets and report sections\n * - Admin panels: Collapsible and resizable navigation menus\n * - Media players: Playlist and video player resizing\n * - Split-screen views: Comparing two sets of data or content\n *\n * @subcomponents\n * - ResizablePanelGroup - Container for resizable panels\n * - ResizablePanel - Individual resizable section\n * - ResizableHandle - Interaction point for resizing\n *\n * @variants\n * - handle.size: sm, default, lg, touch\n *\n * @example <ResizablePanelGroup direction=\"horizontal\"><ResizablePanel defaultSize={20}><Sidebar /></ResizablePanel><ResizableHandle withHandle /><ResizablePanel defaultSize={80}><MainContent /></ResizablePanel></ResizablePanelGroup>\n */\n\n'use client';\n\nimport * as React from 'react';\nimport { memo, useMemo } from 'react';\n\nimport { useMediaQuery, useReducedMotion } from '@mantine/hooks';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { GripVerticalIcon } from 'lucide-react';\nimport * as ResizablePrimitive from 'react-resizable-panels';\n\nimport { cn } from '../../../../lib/utils';\n\n/**\n * ResizablePanelGroup component.\n *\n * Root container for a set of resizable panels.\n * Accepts both `direction` (v3 compat) and `orientation` (v4) props.\n */\nconst ResizablePanelGroup = ({\n className,\n direction,\n orientation,\n ...props\n}: React.ComponentProps<typeof ResizablePrimitive.Group> & {\n /** @deprecated Use `orientation` instead. Kept for backward compatibility. */\n direction?: 'horizontal' | 'vertical';\n}) => {\n const resolvedOrientation = orientation ?? direction ?? 'horizontal';\n return (\n <ResizablePrimitive.Group\n data-slot=\"resizable-panel-group\"\n data-orientation={resolvedOrientation}\n orientation={resolvedOrientation}\n className={cn('flex size-full data-[orientation=vertical]:flex-col', className)}\n {...props}\n />\n );\n};\n\n/**\n * ResizablePanel component.\n *\n * An individual panel within a ResizablePanelGroup.\n */\nconst ResizablePanel = ResizablePrimitive.Panel;\n\n/**\n * ResizableHandle variant definitions using CVA\n */\nconst resizableHandleVariants = cva(\n [\n 'bg-border relative flex items-center justify-center after:absolute transition-all duration-200 outline-none',\n // [Pillar 3: Pseudo-states] Enhanced focus ring using ring-primary token\n 'focus-visible:ring-primary focus-visible:ring-2 focus-visible:ring-offset-2',\n 'aria-[orientation=vertical]:w-full aria-[orientation=vertical]:after:left-0 aria-[orientation=vertical]:after:w-full aria-[orientation=vertical]:after:translate-x-0 aria-[orientation=vertical]:after:-translate-y-1/2 [&[aria-orientation=vertical]>div]:rotate-90',\n ],\n {\n variants: {\n /**\n * Size variants for handles\n * - touch: 44px hit area for WCAG 2.5.5 compliance\n */\n size: {\n sm: 'w-[0.5px] after:inset-y-0 after:left-1/2 after:w-2 after:-translate-x-1/2 aria-[orientation=vertical]:after:inset-x-0 aria-[orientation=vertical]:after:top-1/2 aria-[orientation=vertical]:h-[0.5px] aria-[orientation=vertical]:after:h-2 aria-[orientation=vertical]:after:-translate-y-1/2',\n default:\n 'w-px after:inset-y-0 after:left-1/2 after:w-4 after:-translate-x-1/2 aria-[orientation=vertical]:after:inset-x-0 aria-[orientation=vertical]:after:top-1/2 aria-[orientation=vertical]:h-px aria-[orientation=vertical]:after:h-4 aria-[orientation=vertical]:after:-translate-y-1/2',\n lg: 'w-0.5 after:inset-y-0 after:left-1/2 after:w-6 after:-translate-x-1/2 aria-[orientation=vertical]:after:inset-x-0 aria-[orientation=vertical]:after:top-1/2 aria-[orientation=vertical]:h-0.5 aria-[orientation=vertical]:after:h-6 aria-[orientation=vertical]:after:-translate-y-1/2',\n touch:\n 'w-1 after:inset-y-0 after:left-1/2 after:w-11 after:-translate-x-1/2 aria-[orientation=vertical]:after:inset-x-0 aria-[orientation=vertical]:after:top-1/2 aria-[orientation=vertical]:h-1 aria-[orientation=vertical]:after:h-11 aria-[orientation=vertical]:after:-translate-y-1/2',\n },\n },\n defaultVariants: {\n size: 'default',\n },\n },\n);\n\n// Static constants - moved outside component to prevent recreation\nconst RESIZABLE_HANDLE_ICON_CONTAINER_CLASSNAME =\n 'bg-border z-10 flex h-4 w-3 items-center justify-center rounded-sm border';\nconst RESIZABLE_HANDLE_ICON_CLASSNAME = 'size-2.5';\n\n/**\n * ResizableHandle Component\n *\n * Interactive divider that allows users to resize adjacent panels.\n */\nconst ResizableHandle = memo(\n ({\n className,\n withHandle,\n size,\n ...props\n }: React.ComponentProps<typeof ResizablePrimitive.Separator> &\n VariantProps<typeof resizableHandleVariants> & { withHandle?: boolean }) => {\n // Premium Harmony V2: Detect touch devices for adaptive behavior\n const isTouchDevice = useMediaQuery('(pointer: coarse)') ?? false;\n const prefersReducedMotion = useReducedMotion() ?? false;\n\n // Auto-apply touch size on touch devices\n const effectiveSize = useMemo(() => {\n if (size) return size;\n return isTouchDevice ? 'touch' : 'default';\n }, [size, isTouchDevice]);\n\n // Memoize className computation\n const handleClassName = useMemo(\n () => cn(resizableHandleVariants({ size: effectiveSize }), className),\n [effectiveSize, className],\n );\n\n const handleIcon = withHandle ? (\n <div className={RESIZABLE_HANDLE_ICON_CONTAINER_CLASSNAME}>\n <GripVerticalIcon className={RESIZABLE_HANDLE_ICON_CLASSNAME} />\n </div>\n ) : null;\n\n return (\n <ResizablePrimitive.Separator\n className={handleClassName}\n data-slot=\"resizable-handle\"\n data-touch={isTouchDevice ? 'true' : 'false'}\n data-reduced-motion={prefersReducedMotion ? 'true' : 'false'}\n {...props}\n >\n {handleIcon}\n </ResizablePrimitive.Separator>\n );\n },\n);\n\nResizableHandle.displayName = 'ResizableHandle';\n\nexport { ResizableHandle, resizableHandleVariants, ResizablePanel, ResizablePanelGroup };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA8DA,MAAM,uBAAuB,EAC3B,WACA,WACA,aACA,GAAG,YAIC;CACJ,MAAM,sBAAsB,eAAe,aAAa;AACxD,QACE,oBAAC,mBAAmB;EAClB,aAAU;EACV,oBAAkB;EAClB,aAAa;EACb,WAAW,GAAG,uDAAuD,UAAU;EAC/E,GAAI;GACJ;;;;;;;AASN,MAAM,iBAAiB,mBAAmB;;;;AAK1C,MAAM,0BAA0B,IAC9B;CACE;CAEA;CACA;CACD,EACD;CACE,UAAU,EAKR,MAAM;EACJ,IAAI;EACJ,SACE;EACF,IAAI;EACJ,OACE;EACH,EACF;CACD,iBAAiB,EACf,MAAM,WACP;CACF,CACF;AAGD,MAAM,4CACJ;AACF,MAAM,kCAAkC;;;;;;AAOxC,MAAM,kBAAkB,MACrB,EACC,WACA,YACA,MACA,GAAG,YAEyE;CAE5E,MAAM,gBAAgB,cAAc,oBAAoB,IAAI;CAC5D,MAAM,uBAAuB,kBAAkB,IAAI;CAGnD,MAAM,gBAAgB,cAAc;AAClC,MAAI,KAAM,QAAO;AACjB,SAAO,gBAAgB,UAAU;IAChC,CAAC,MAAM,cAAc,CAAC;CAGzB,MAAM,kBAAkB,cAChB,GAAG,wBAAwB,EAAE,MAAM,eAAe,CAAC,EAAE,UAAU,EACrE,CAAC,eAAe,UAAU,CAC3B;CAED,MAAM,aAAa,aACjB,oBAAC;EAAI,WAAW;YACd,oBAAC,oBAAiB,WAAW,kCAAmC;GAC5D,GACJ;AAEJ,QACE,oBAAC,mBAAmB;EAClB,WAAW;EACX,aAAU;EACV,cAAY,gBAAgB,SAAS;EACrC,uBAAqB,uBAAuB,SAAS;EACrD,GAAI;YAEH;GAC4B;EAGpC;AAED,gBAAgB,cAAc"}
@@ -0,0 +1,139 @@
1
+ 'use client';
2
+ import { t as cn } from "./utils-D2bGp2p_.mjs";
3
+ import * as React$1 from "react";
4
+ import { memo, useMemo } from "react";
5
+ import { useMediaQuery, useReducedMotion } from "@mantine/hooks";
6
+ import { cva } from "class-variance-authority";
7
+ import { jsx, jsxs } from "react/jsx-runtime";
8
+ import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
9
+
10
+ //#region src/components/elements/organisms/scroll-area/scroll-area.tsx
11
+ /**
12
+ * @fileoverview ScrollArea Component - Premium Harmony V2
13
+ *
14
+ * Custom scrollable area with cross-browser styling and smooth interactions.
15
+ * Built on Radix UI primitives with Premium Harmony V2 motion and accessibility standards.
16
+ * Features adaptive scrollbars for touch vs desktop and focus-visible ring support.
17
+ *
18
+ * Features:
19
+ * - ES2023 syntax with modern patterns
20
+ * - Tailwind v4 CSS-first theming with CSS variables
21
+ * - Premium Harmony V2 motion design for smooth scrolling feel
22
+ * - Touch detection with adaptive scrollbar visibility
23
+ * - Reduced motion support for accessibility
24
+ * - Complete pseudo-state coverage (:hover, :active, :focus-visible)
25
+ * - Orientation support (horizontal, vertical, both)
26
+ * - Auto-hiding scrollbars with configurable delay
27
+ * - Standardized focus ring using ring-primary token
28
+ * - WCAG compliant focus-visible pattern
29
+ * - Data attributes for state tracking (data-orientation, data-touch)
30
+ * - Semantic color tokens for consistent theming
31
+ *
32
+ * @module @od-oneapp/uni-ui/components/elements/organisms/scroll-area
33
+ * @component ScrollArea, ScrollBar
34
+ *
35
+ * @useCases
36
+ * - Content-heavy containers: Dashboards, sidebars, long lists
37
+ * - Modal/Dialog body: Constrained scrollable areas in overlays
38
+ * - Dropdown menus: Scrollable option lists with z-index management
39
+ * - Multi-pane layouts: Independent scroll areas in complex apps
40
+ * - Code viewers: Monospace text with horizontal and vertical scroll
41
+ * - Touch interfaces: Mobile-friendly scroll areas with gesture support
42
+ *
43
+ * @subcomponents
44
+ * - ScrollArea - Root container with viewport management
45
+ * - ScrollBar - Customizable scrollbar with orientation control
46
+ *
47
+ * @variants
48
+ * - orientation: vertical (default), horizontal
49
+ * - size: default, thin
50
+ */
51
+ const SCROLL_AREA_BASE_CLASSNAME = "relative overflow-hidden";
52
+ const SCROLL_AREA_VIEWPORT_BASE_CLASSNAME = "focus-visible:ring-primary focus-visible:ring-offset-background focus-visible:ring-2 focus-visible:ring-offset-2 size-full rounded-[inherit] transition-all duration-200 outline-none";
53
+ const SCROLL_BAR_THUMB_BASE_CLASSNAME = "bg-border relative flex-1 rounded-full";
54
+ /**
55
+ * ScrollArea variant definitions
56
+ */
57
+ const scrollAreaVariants = cva(SCROLL_AREA_BASE_CLASSNAME);
58
+ /**
59
+ * ScrollBar variant definitions using CVA
60
+ *
61
+ * Base styles include:
62
+ * - Flex layout for thumb positioning
63
+ * - Transition for opacity/visibility
64
+ * - Touch-optimized padding
65
+ */
66
+ const scrollBarVariants = cva("flex touch-none transition-all duration-200 select-none ease-out", {
67
+ variants: {
68
+ orientation: {
69
+ vertical: "h-full w-2.5 border-l border-l-transparent p-[1px]",
70
+ horizontal: "h-2.5 flex-col border-t border-t-transparent p-[1px]"
71
+ },
72
+ size: {
73
+ default: "",
74
+ thin: "w-1.5 h-1.5"
75
+ }
76
+ },
77
+ defaultVariants: {
78
+ orientation: "vertical",
79
+ size: "default"
80
+ }
81
+ });
82
+ /**
83
+ * ScrollArea Component
84
+ *
85
+ * Custom scrollable container with consistent styling across browsers.
86
+ */
87
+ const ScrollArea = memo(React$1.forwardRef(({ className, children, ...props }, ref) => {
88
+ return /* @__PURE__ */ jsxs(ScrollAreaPrimitive.Root, {
89
+ ref,
90
+ className: cn(scrollAreaVariants(), className),
91
+ ...props,
92
+ children: [
93
+ /* @__PURE__ */ jsx(ScrollAreaPrimitive.Viewport, {
94
+ className: SCROLL_AREA_VIEWPORT_BASE_CLASSNAME,
95
+ children
96
+ }),
97
+ /* @__PURE__ */ jsx(ScrollBar, {}),
98
+ /* @__PURE__ */ jsx(ScrollAreaPrimitive.Corner, {})
99
+ ]
100
+ });
101
+ }));
102
+ ScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;
103
+ /**
104
+ * ScrollBar Component
105
+ *
106
+ * Visual scrollbar indicator with orientation support.
107
+ * Automatically adapts visibility for touch devices.
108
+ */
109
+ const ScrollBar = memo(React$1.forwardRef(({ className, orientation = "vertical", size, ...props }, ref) => {
110
+ const isTouchDevice = useMediaQuery("(pointer: coarse)") ?? false;
111
+ const prefersReducedMotion = useReducedMotion() ?? false;
112
+ const scrollbarClassName = useMemo(() => cn(scrollBarVariants({
113
+ orientation,
114
+ size
115
+ }), isTouchDevice && "opacity-0 hover:opacity-100", prefersReducedMotion && "transition-none", className), [
116
+ orientation,
117
+ size,
118
+ isTouchDevice,
119
+ prefersReducedMotion,
120
+ className
121
+ ]);
122
+ return /* @__PURE__ */ jsx(ScrollAreaPrimitive.ScrollAreaScrollbar, {
123
+ ref,
124
+ "data-slot": "scroll-area-scrollbar",
125
+ "data-orientation": orientation,
126
+ orientation,
127
+ className: scrollbarClassName,
128
+ ...props,
129
+ children: /* @__PURE__ */ jsx(ScrollAreaPrimitive.ScrollAreaThumb, {
130
+ "data-slot": "scroll-area-thumb",
131
+ className: SCROLL_BAR_THUMB_BASE_CLASSNAME
132
+ })
133
+ });
134
+ }));
135
+ ScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;
136
+
137
+ //#endregion
138
+ export { ScrollBar as n, scrollBarVariants as r, ScrollArea as t };
139
+ //# sourceMappingURL=scroll-area-Bxi-Edjc.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scroll-area-Bxi-Edjc.mjs","names":["React"],"sources":["../src/components/elements/organisms/scroll-area/scroll-area.tsx"],"sourcesContent":["/**\n * @fileoverview ScrollArea Component - Premium Harmony V2\n *\n * Custom scrollable area with cross-browser styling and smooth interactions.\n * Built on Radix UI primitives with Premium Harmony V2 motion and accessibility standards.\n * Features adaptive scrollbars for touch vs desktop and focus-visible ring support.\n *\n * Features:\n * - ES2023 syntax with modern patterns\n * - Tailwind v4 CSS-first theming with CSS variables\n * - Premium Harmony V2 motion design for smooth scrolling feel\n * - Touch detection with adaptive scrollbar visibility\n * - Reduced motion support for accessibility\n * - Complete pseudo-state coverage (:hover, :active, :focus-visible)\n * - Orientation support (horizontal, vertical, both)\n * - Auto-hiding scrollbars with configurable delay\n * - Standardized focus ring using ring-primary token\n * - WCAG compliant focus-visible pattern\n * - Data attributes for state tracking (data-orientation, data-touch)\n * - Semantic color tokens for consistent theming\n *\n * @module @od-oneapp/uni-ui/components/elements/organisms/scroll-area\n * @component ScrollArea, ScrollBar\n *\n * @useCases\n * - Content-heavy containers: Dashboards, sidebars, long lists\n * - Modal/Dialog body: Constrained scrollable areas in overlays\n * - Dropdown menus: Scrollable option lists with z-index management\n * - Multi-pane layouts: Independent scroll areas in complex apps\n * - Code viewers: Monospace text with horizontal and vertical scroll\n * - Touch interfaces: Mobile-friendly scroll areas with gesture support\n *\n * @subcomponents\n * - ScrollArea - Root container with viewport management\n * - ScrollBar - Customizable scrollbar with orientation control\n *\n * @variants\n * - orientation: vertical (default), horizontal\n * - size: default, thin\n */\n\n'use client';\n\nimport * as React from 'react';\nimport { memo, useMemo } from 'react';\n\nimport { useMediaQuery, useReducedMotion } from '@mantine/hooks';\nimport * as ScrollAreaPrimitive from '@radix-ui/react-scroll-area';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { cn } from '../../../../lib/utils';\n\n// Static classNames - moved outside components to prevent recreation\nconst SCROLL_AREA_BASE_CLASSNAME = 'relative overflow-hidden';\nconst SCROLL_AREA_VIEWPORT_BASE_CLASSNAME =\n 'focus-visible:ring-primary focus-visible:ring-offset-background focus-visible:ring-2 focus-visible:ring-offset-2 size-full rounded-[inherit] transition-all duration-200 outline-none';\nconst SCROLL_BAR_THUMB_BASE_CLASSNAME = 'bg-border relative flex-1 rounded-full';\n\n/**\n * ScrollArea variant definitions\n */\nconst scrollAreaVariants = cva(SCROLL_AREA_BASE_CLASSNAME);\n\n/**\n * ScrollBar variant definitions using CVA\n *\n * Base styles include:\n * - Flex layout for thumb positioning\n * - Transition for opacity/visibility\n * - Touch-optimized padding\n */\nconst scrollBarVariants = cva('flex touch-none transition-all duration-200 select-none ease-out', {\n variants: {\n orientation: {\n vertical: 'h-full w-2.5 border-l border-l-transparent p-[1px]',\n horizontal: 'h-2.5 flex-col border-t border-t-transparent p-[1px]',\n },\n size: {\n default: '',\n thin: 'w-1.5 h-1.5',\n },\n },\n defaultVariants: {\n orientation: 'vertical',\n size: 'default',\n },\n});\n\n/**\n * ScrollArea Component\n *\n * Custom scrollable container with consistent styling across browsers.\n */\nconst ScrollArea = memo(\n React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.Root>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.Root>\n >(({ className, children, ...props }, ref) => {\n return (\n <ScrollAreaPrimitive.Root\n ref={ref}\n className={cn(scrollAreaVariants(), className)}\n {...props}\n >\n <ScrollAreaPrimitive.Viewport className={SCROLL_AREA_VIEWPORT_BASE_CLASSNAME}>\n {children}\n </ScrollAreaPrimitive.Viewport>\n <ScrollBar />\n <ScrollAreaPrimitive.Corner />\n </ScrollAreaPrimitive.Root>\n );\n }),\n);\n\nScrollArea.displayName = ScrollAreaPrimitive.Root.displayName;\n\n/**\n * ScrollBar Component\n *\n * Visual scrollbar indicator with orientation support.\n * Automatically adapts visibility for touch devices.\n */\nconst ScrollBar = memo(\n React.forwardRef<\n React.ElementRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar>,\n React.ComponentPropsWithoutRef<typeof ScrollAreaPrimitive.ScrollAreaScrollbar> &\n VariantProps<typeof scrollBarVariants>\n >(({ className, orientation = 'vertical', size, ...props }, ref) => {\n // Premium Harmony V2: Detect touch devices for adaptive behavior\n const isTouchDevice = useMediaQuery('(pointer: coarse)') ?? false;\n const prefersReducedMotion = useReducedMotion() ?? false;\n\n // Memoize scrollbar className\n const scrollbarClassName = useMemo(\n () =>\n cn(\n scrollBarVariants({ orientation, size }),\n // Hide scrollbars on touch devices by default (can be overridden with className)\n isTouchDevice && 'opacity-0 hover:opacity-100',\n // Disable transitions if user prefers reduced motion\n prefersReducedMotion && 'transition-none',\n className,\n ),\n [orientation, size, isTouchDevice, prefersReducedMotion, className],\n );\n\n return (\n <ScrollAreaPrimitive.ScrollAreaScrollbar\n ref={ref}\n data-slot=\"scroll-area-scrollbar\"\n data-orientation={orientation}\n orientation={orientation}\n className={scrollbarClassName}\n {...props}\n >\n <ScrollAreaPrimitive.ScrollAreaThumb\n data-slot=\"scroll-area-thumb\"\n className={SCROLL_BAR_THUMB_BASE_CLASSNAME}\n />\n </ScrollAreaPrimitive.ScrollAreaScrollbar>\n );\n }),\n);\n\nScrollBar.displayName = ScrollAreaPrimitive.ScrollAreaScrollbar.displayName;\n\nexport { ScrollArea, ScrollBar, scrollBarVariants };\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAqDA,MAAM,6BAA6B;AACnC,MAAM,sCACJ;AACF,MAAM,kCAAkC;;;;AAKxC,MAAM,qBAAqB,IAAI,2BAA2B;;;;;;;;;AAU1D,MAAM,oBAAoB,IAAI,oEAAoE;CAChG,UAAU;EACR,aAAa;GACX,UAAU;GACV,YAAY;GACb;EACD,MAAM;GACJ,SAAS;GACT,MAAM;GACP;EACF;CACD,iBAAiB;EACf,aAAa;EACb,MAAM;EACP;CACF,CAAC;;;;;;AAOF,MAAM,aAAa,KACjBA,QAAM,YAGH,EAAE,WAAW,UAAU,GAAG,SAAS,QAAQ;AAC5C,QACE,qBAAC,oBAAoB;EACd;EACL,WAAW,GAAG,oBAAoB,EAAE,UAAU;EAC9C,GAAI;;GAEJ,oBAAC,oBAAoB;IAAS,WAAW;IACtC;KAC4B;GAC/B,oBAAC,cAAY;GACb,oBAAC,oBAAoB,WAAS;;GACL;EAE7B,CACH;AAED,WAAW,cAAc,oBAAoB,KAAK;;;;;;;AAQlD,MAAM,YAAY,KAChBA,QAAM,YAIH,EAAE,WAAW,cAAc,YAAY,MAAM,GAAG,SAAS,QAAQ;CAElE,MAAM,gBAAgB,cAAc,oBAAoB,IAAI;CAC5D,MAAM,uBAAuB,kBAAkB,IAAI;CAGnD,MAAM,qBAAqB,cAEvB,GACE,kBAAkB;EAAE;EAAa;EAAM,CAAC,EAExC,iBAAiB,+BAEjB,wBAAwB,mBACxB,UACD,EACH;EAAC;EAAa;EAAM;EAAe;EAAsB;EAAU,CACpE;AAED,QACE,oBAAC,oBAAoB;EACd;EACL,aAAU;EACV,oBAAkB;EACL;EACb,WAAW;EACX,GAAI;YAEJ,oBAAC,oBAAoB;GACnB,aAAU;GACV,WAAW;IACX;GACsC;EAE5C,CACH;AAED,UAAU,cAAc,oBAAoB,oBAAoB"}
@@ -0,0 +1,19 @@
1
+
2
+ import * as React$1 from "react";
3
+ import { VariantProps } from "class-variance-authority";
4
+ import * as ScrollAreaPrimitive from "@radix-ui/react-scroll-area";
5
+ import * as class_variance_authority_types0 from "class-variance-authority/types";
6
+
7
+ //#region src/components/elements/organisms/scroll-area/scroll-area.d.ts
8
+ declare const scrollBarVariants: (props?: ({
9
+ orientation?: "horizontal" | "vertical" | null | undefined;
10
+ size?: "default" | "thin" | null | undefined;
11
+ } & class_variance_authority_types0.ClassProp) | undefined) => string;
12
+ declare const ScrollArea: React$1.NamedExoticComponent<Omit<ScrollAreaPrimitive.ScrollAreaProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & React$1.RefAttributes<HTMLDivElement>>;
13
+ declare const ScrollBar: React$1.NamedExoticComponent<Omit<ScrollAreaPrimitive.ScrollAreaScrollbarProps & React$1.RefAttributes<HTMLDivElement>, "ref"> & VariantProps<(props?: ({
14
+ orientation?: "horizontal" | "vertical" | null | undefined;
15
+ size?: "default" | "thin" | null | undefined;
16
+ } & class_variance_authority_types0.ClassProp) | undefined) => string> & React$1.RefAttributes<HTMLDivElement>>;
17
+ //#endregion
18
+ export { ScrollBar as n, scrollBarVariants as r, ScrollArea as t };
19
+ //# sourceMappingURL=scroll-area-CDRGG59G.d.mts.map