@evinvest/uikit 0.30.0 → 0.32.0

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 (403) hide show
  1. package/README.md +267 -73
  2. package/dist/{chunk-3IPB4QQJ.js → chunk-35SPIU4U.js} +10 -6
  3. package/dist/chunk-35SPIU4U.js.map +1 -0
  4. package/dist/components/{accordion.js → atomic/accordion.js} +3 -3
  5. package/dist/components/atomic/accordion.js.map +1 -0
  6. package/dist/components/{alert-dialog.js → atomic/alert-dialog.js} +11 -10
  7. package/dist/components/atomic/alert-dialog.js.map +1 -0
  8. package/dist/components/{alert.js → atomic/alert.js} +2 -2
  9. package/dist/components/atomic/alert.js.map +1 -0
  10. package/dist/components/atomic/animated-number-columns.js +105 -0
  11. package/dist/components/atomic/animated-number-columns.js.map +1 -0
  12. package/dist/components/{avatar.js → atomic/avatar.js} +2 -2
  13. package/dist/components/atomic/avatar.js.map +1 -0
  14. package/dist/components/{badge.js → atomic/badge.js} +4 -4
  15. package/dist/components/atomic/badge.js.map +1 -0
  16. package/dist/components/{band.js → atomic/band.js} +2 -2
  17. package/dist/components/atomic/band.js.map +1 -0
  18. package/dist/components/{breadcrumb.js → atomic/breadcrumb.js} +3 -3
  19. package/dist/components/atomic/breadcrumb.js.map +1 -0
  20. package/dist/components/{button-group.js → atomic/button-group.js} +3 -3
  21. package/dist/components/atomic/button-group.js.map +1 -0
  22. package/dist/components/{button.js → atomic/button.js} +7 -15
  23. package/dist/components/atomic/button.js.map +1 -0
  24. package/dist/components/{calendar.js → atomic/calendar.js} +2 -2
  25. package/dist/components/atomic/calendar.js.map +1 -0
  26. package/dist/components/{card.js → atomic/card.js} +2 -2
  27. package/dist/components/atomic/card.js.map +1 -0
  28. package/dist/components/{checkbox.js → atomic/checkbox.js} +4 -4
  29. package/dist/components/atomic/checkbox.js.map +1 -0
  30. package/dist/components/{collapsible.js → atomic/collapsible.js} +1 -1
  31. package/dist/components/atomic/collapsible.js.map +1 -0
  32. package/dist/components/{command.js → atomic/command.js} +9 -7
  33. package/dist/components/atomic/command.js.map +1 -0
  34. package/dist/components/{container.js → atomic/container.js} +2 -2
  35. package/dist/components/atomic/container.js.map +1 -0
  36. package/dist/components/{context-menu.js → atomic/context-menu.js} +62 -14
  37. package/dist/components/atomic/context-menu.js.map +1 -0
  38. package/dist/components/{dialog.js → atomic/dialog.js} +11 -10
  39. package/dist/components/atomic/dialog.js.map +1 -0
  40. package/dist/components/{drawer.js → atomic/drawer.js} +10 -8
  41. package/dist/components/atomic/drawer.js.map +1 -0
  42. package/dist/components/{dropdown-menu.js → atomic/dropdown-menu.js} +74 -15
  43. package/dist/components/atomic/dropdown-menu.js.map +1 -0
  44. package/dist/components/{empty.js → atomic/empty.js} +2 -2
  45. package/dist/components/atomic/empty.js.map +1 -0
  46. package/dist/components/atomic/field-context.js.map +1 -0
  47. package/dist/components/atomic/form-row.js +51 -0
  48. package/dist/components/atomic/form-row.js.map +1 -0
  49. package/dist/components/{hover-card.js → atomic/hover-card.js} +8 -8
  50. package/dist/components/atomic/hover-card.js.map +1 -0
  51. package/dist/components/{info-tip.js → atomic/info-tip.js} +10 -10
  52. package/dist/components/atomic/info-tip.js.map +1 -0
  53. package/dist/components/{input-otp.js → atomic/input-otp.js} +3 -3
  54. package/dist/components/atomic/input-otp.js.map +1 -0
  55. package/dist/components/{input.js → atomic/input.js} +3 -3
  56. package/dist/components/atomic/input.js.map +1 -0
  57. package/dist/components/{kbd.js → atomic/kbd.js} +2 -2
  58. package/dist/components/atomic/kbd.js.map +1 -0
  59. package/dist/components/atomic/key-value.js +68 -0
  60. package/dist/components/atomic/key-value.js.map +1 -0
  61. package/dist/components/{label.js → atomic/label.js} +2 -2
  62. package/dist/components/atomic/label.js.map +1 -0
  63. package/dist/components/{menubar.js → atomic/menubar.js} +48 -14
  64. package/dist/components/atomic/menubar.js.map +1 -0
  65. package/dist/components/{native-select.js → atomic/native-select.js} +6 -7
  66. package/dist/components/atomic/native-select.js.map +1 -0
  67. package/dist/components/{navigation-menu.js → atomic/navigation-menu.js} +11 -12
  68. package/dist/components/atomic/navigation-menu.js.map +1 -0
  69. package/dist/components/{pagination.js → atomic/pagination.js} +1 -1
  70. package/dist/components/atomic/pagination.js.map +1 -0
  71. package/dist/components/{popover.js → atomic/popover.js} +10 -10
  72. package/dist/components/atomic/popover.js.map +1 -0
  73. package/dist/components/{progress.js → atomic/progress.js} +2 -2
  74. package/dist/components/atomic/progress.js.map +1 -0
  75. package/dist/components/{radio-group.js → atomic/radio-group.js} +4 -4
  76. package/dist/components/atomic/radio-group.js.map +1 -0
  77. package/dist/components/{scroll-area.js → atomic/scroll-area.js} +2 -2
  78. package/dist/components/atomic/scroll-area.js.map +1 -0
  79. package/dist/components/{section-descriptor.js → atomic/section-descriptor.js} +2 -2
  80. package/dist/components/atomic/section-descriptor.js.map +1 -0
  81. package/dist/components/{select-listbox.js → atomic/select-listbox.js} +1 -1
  82. package/dist/components/atomic/select-listbox.js.map +1 -0
  83. package/dist/components/{select.js → atomic/select.js} +26 -16
  84. package/dist/components/atomic/select.js.map +1 -0
  85. package/dist/components/{separator.js → atomic/separator.js} +2 -2
  86. package/dist/components/atomic/separator.js.map +1 -0
  87. package/dist/components/{sheet.js → atomic/sheet.js} +11 -10
  88. package/dist/components/atomic/sheet.js.map +1 -0
  89. package/dist/components/{sidebar.js → atomic/sidebar.js} +5 -5
  90. package/dist/components/atomic/sidebar.js.map +1 -0
  91. package/dist/components/{skeleton.js → atomic/skeleton.js} +2 -2
  92. package/dist/components/atomic/skeleton.js.map +1 -0
  93. package/dist/components/{slider.js → atomic/slider.js} +3 -3
  94. package/dist/components/atomic/slider.js.map +1 -0
  95. package/dist/components/{sonner.js → atomic/sonner.js} +2 -2
  96. package/dist/components/atomic/sonner.js.map +1 -0
  97. package/dist/components/{spinner.js → atomic/spinner.js} +1 -1
  98. package/dist/components/atomic/spinner.js.map +1 -0
  99. package/dist/components/atomic/status-item.js +42 -0
  100. package/dist/components/atomic/status-item.js.map +1 -0
  101. package/dist/components/{switch.js → atomic/switch.js} +4 -4
  102. package/dist/components/atomic/switch.js.map +1 -0
  103. package/dist/components/{table.js → atomic/table.js} +2 -2
  104. package/dist/components/atomic/table.js.map +1 -0
  105. package/dist/components/{tabs.js → atomic/tabs.js} +4 -4
  106. package/dist/components/atomic/tabs.js.map +1 -0
  107. package/dist/components/{textarea.js → atomic/textarea.js} +3 -3
  108. package/dist/components/atomic/textarea.js.map +1 -0
  109. package/dist/components/{toggle-group.js → atomic/toggle-group.js} +2 -2
  110. package/dist/components/atomic/toggle-group.js.map +1 -0
  111. package/dist/components/{toggle.js → atomic/toggle.js} +3 -3
  112. package/dist/components/atomic/toggle.js.map +1 -0
  113. package/dist/components/{tooltip.js → atomic/tooltip.js} +8 -8
  114. package/dist/components/atomic/tooltip.js.map +1 -0
  115. package/dist/components/atomic/use-count-tween.js +42 -0
  116. package/dist/components/atomic/use-count-tween.js.map +1 -0
  117. package/dist/components/derived/animated-number.js +157 -0
  118. package/dist/components/derived/animated-number.js.map +1 -0
  119. package/dist/components/{carousel.js → derived/carousel.js} +4 -4
  120. package/dist/components/derived/carousel.js.map +1 -0
  121. package/dist/components/derived/command-palette.js +119 -0
  122. package/dist/components/derived/command-palette.js.map +1 -0
  123. package/dist/components/derived/confirm-dialog.js +123 -0
  124. package/dist/components/derived/confirm-dialog.js.map +1 -0
  125. package/dist/components/{date-time-picker.js → derived/date-time-picker.js} +8 -8
  126. package/dist/components/derived/date-time-picker.js.map +1 -0
  127. package/dist/components/{field.js → derived/field.js} +6 -6
  128. package/dist/components/derived/field.js.map +1 -0
  129. package/dist/components/{form.js → derived/form.js} +4 -4
  130. package/dist/components/derived/form.js.map +1 -0
  131. package/dist/components/derived/icon-button.js +35 -0
  132. package/dist/components/derived/icon-button.js.map +1 -0
  133. package/dist/components/{input-group.js → derived/input-group.js} +5 -5
  134. package/dist/components/derived/input-group.js.map +1 -0
  135. package/dist/components/{item.js → derived/item.js} +4 -4
  136. package/dist/components/derived/item.js.map +1 -0
  137. package/dist/components/derived/popover-form.js +60 -0
  138. package/dist/components/derived/popover-form.js.map +1 -0
  139. package/dist/components/derived/settings.js +94 -0
  140. package/dist/components/derived/settings.js.map +1 -0
  141. package/dist/components/shell/account-list.js +128 -0
  142. package/dist/components/shell/account-list.js.map +1 -0
  143. package/dist/components/shell/account-menu-profile.js +114 -0
  144. package/dist/components/shell/account-menu-profile.js.map +1 -0
  145. package/dist/components/shell/account-menu.js +97 -0
  146. package/dist/components/shell/account-menu.js.map +1 -0
  147. package/dist/components/shell/account-settings-dialog.js +84 -0
  148. package/dist/components/shell/account-settings-dialog.js.map +1 -0
  149. package/dist/components/{app-shell.js → shell/app-shell.js} +10 -1
  150. package/dist/components/shell/app-shell.js.map +1 -0
  151. package/dist/components/shell/aside.js +140 -0
  152. package/dist/components/shell/aside.js.map +1 -0
  153. package/dist/components/{auth-wall.js → shell/auth-wall.js} +1 -1
  154. package/dist/components/shell/auth-wall.js.map +1 -0
  155. package/dist/components/{bottom-tab-bar.js → shell/bottom-tab-bar.js} +1 -1
  156. package/dist/components/shell/bottom-tab-bar.js.map +1 -0
  157. package/dist/components/shell/chat-composer.js +141 -0
  158. package/dist/components/shell/chat-composer.js.map +1 -0
  159. package/dist/components/shell/chat-message.js +195 -0
  160. package/dist/components/shell/chat-message.js.map +1 -0
  161. package/dist/components/shell/chat-panel.js +137 -0
  162. package/dist/components/shell/chat-panel.js.map +1 -0
  163. package/dist/components/shell/chat-stream-text.js +69 -0
  164. package/dist/components/shell/chat-stream-text.js.map +1 -0
  165. package/dist/components/shell/chat-typing.js +26 -0
  166. package/dist/components/shell/chat-typing.js.map +1 -0
  167. package/dist/components/{footer.js → shell/footer.js} +1 -1
  168. package/dist/components/shell/footer.js.map +1 -0
  169. package/dist/components/shell/header-controls.js +149 -0
  170. package/dist/components/shell/header-controls.js.map +1 -0
  171. package/dist/components/{list-rows.js → shell/list-rows.js} +1 -1
  172. package/dist/components/shell/list-rows.js.map +1 -0
  173. package/dist/components/{logo.js → shell/logo.js} +1 -1
  174. package/dist/components/shell/logo.js.map +1 -0
  175. package/dist/components/{mobile-app-bar.js → shell/mobile-app-bar.js} +1 -1
  176. package/dist/components/shell/mobile-app-bar.js.map +1 -0
  177. package/dist/components/{nav-badge.js → shell/nav-badge.js} +1 -1
  178. package/dist/components/shell/nav-badge.js.map +1 -0
  179. package/dist/components/shell/nav-collapse.js +142 -0
  180. package/dist/components/shell/nav-collapse.js.map +1 -0
  181. package/dist/components/shell/nav-link.js.map +1 -0
  182. package/dist/components/shell/nav-model.js.map +1 -0
  183. package/dist/components/{page-frame.js → shell/page-frame.js} +3 -6
  184. package/dist/components/shell/page-frame.js.map +1 -0
  185. package/dist/components/{resource-error.js → shell/resource-error.js} +4 -4
  186. package/dist/components/shell/resource-error.js.map +1 -0
  187. package/dist/components/shell/section-nav.js +139 -0
  188. package/dist/components/shell/section-nav.js.map +1 -0
  189. package/dist/components/shell/settled.js.map +1 -0
  190. package/dist/components/shell/shell-icons.js.map +1 -0
  191. package/dist/components/{shell-nav.js → shell/shell-nav.js} +81 -39
  192. package/dist/components/shell/shell-nav.js.map +1 -0
  193. package/dist/components/shell/smart-header.js +53 -0
  194. package/dist/components/shell/smart-header.js.map +1 -0
  195. package/dist/components/{status-screen.js → shell/status-screen.js} +3 -3
  196. package/dist/components/shell/status-screen.js.map +1 -0
  197. package/dist/components/{system-banner.js → shell/system-banner.js} +23 -13
  198. package/dist/components/shell/system-banner.js.map +1 -0
  199. package/dist/components/{top-bar.js → shell/top-bar.js} +5 -4
  200. package/dist/components/shell/top-bar.js.map +1 -0
  201. package/dist/components/shell/use-shell-nav.js.map +1 -0
  202. package/dist/components/shell/workspace-tab.js +140 -0
  203. package/dist/components/shell/workspace-tab.js.map +1 -0
  204. package/dist/generated/accent.js +2 -2
  205. package/dist/generated/accent.js.map +1 -1
  206. package/dist/generated/account-list.js +35 -0
  207. package/dist/generated/account-list.js.map +1 -0
  208. package/dist/generated/account-settings-dialog.js +27 -0
  209. package/dist/generated/account-settings-dialog.js.map +1 -0
  210. package/dist/generated/alert-dialog.js +1 -1
  211. package/dist/generated/alert-dialog.js.map +1 -1
  212. package/dist/generated/alert.js +2 -2
  213. package/dist/generated/alert.js.map +1 -1
  214. package/dist/generated/aside.js +36 -0
  215. package/dist/generated/aside.js.map +1 -0
  216. package/dist/generated/badge.js +7 -6
  217. package/dist/generated/badge.js.map +1 -1
  218. package/dist/generated/band.js +1 -1
  219. package/dist/generated/band.js.map +1 -1
  220. package/dist/generated/breadcrumb.js +2 -2
  221. package/dist/generated/breadcrumb.js.map +1 -1
  222. package/dist/generated/button-group.js +2 -2
  223. package/dist/generated/button-group.js.map +1 -1
  224. package/dist/generated/button.js +4 -4
  225. package/dist/generated/button.js.map +1 -1
  226. package/dist/generated/card.js +6 -6
  227. package/dist/generated/card.js.map +1 -1
  228. package/dist/generated/chat-composer.js +21 -0
  229. package/dist/generated/chat-composer.js.map +1 -0
  230. package/dist/generated/chat-message.js +86 -0
  231. package/dist/generated/chat-message.js.map +1 -0
  232. package/dist/generated/chat-typing.js +9 -0
  233. package/dist/generated/chat-typing.js.map +1 -0
  234. package/dist/generated/command-palette.js +17 -0
  235. package/dist/generated/command-palette.js.map +1 -0
  236. package/dist/generated/command.js +2 -2
  237. package/dist/generated/command.js.map +1 -1
  238. package/dist/generated/confirm-dialog.js +28 -0
  239. package/dist/generated/confirm-dialog.js.map +1 -0
  240. package/dist/generated/context-menu.js +1 -1
  241. package/dist/generated/context-menu.js.map +1 -1
  242. package/dist/generated/date-time-picker.js +1 -1
  243. package/dist/generated/date-time-picker.js.map +1 -1
  244. package/dist/generated/dialog.js +1 -1
  245. package/dist/generated/dialog.js.map +1 -1
  246. package/dist/generated/drawer.js +1 -1
  247. package/dist/generated/drawer.js.map +1 -1
  248. package/dist/generated/dropdown-menu.js +1 -1
  249. package/dist/generated/dropdown-menu.js.map +1 -1
  250. package/dist/generated/form-row.js +17 -0
  251. package/dist/generated/form-row.js.map +1 -0
  252. package/dist/generated/header-controls.js +56 -0
  253. package/dist/generated/header-controls.js.map +1 -0
  254. package/dist/generated/icon-button.js +13 -0
  255. package/dist/generated/icon-button.js.map +1 -0
  256. package/dist/generated/key-value.js +15 -0
  257. package/dist/generated/key-value.js.map +1 -0
  258. package/dist/generated/menubar.js +1 -1
  259. package/dist/generated/menubar.js.map +1 -1
  260. package/dist/generated/navigation-menu.js +1 -1
  261. package/dist/generated/navigation-menu.js.map +1 -1
  262. package/dist/generated/popover-form.js +13 -0
  263. package/dist/generated/popover-form.js.map +1 -0
  264. package/dist/generated/section-label.js +10 -0
  265. package/dist/generated/section-label.js.map +1 -0
  266. package/dist/generated/select.js +15 -3
  267. package/dist/generated/select.js.map +1 -1
  268. package/dist/generated/settings.js +36 -0
  269. package/dist/generated/settings.js.map +1 -0
  270. package/dist/generated/sheet.js +1 -1
  271. package/dist/generated/sheet.js.map +1 -1
  272. package/dist/generated/slider.js +1 -1
  273. package/dist/generated/slider.js.map +1 -1
  274. package/dist/generated/smart-header.js +11 -0
  275. package/dist/generated/smart-header.js.map +1 -0
  276. package/dist/generated/sonner.js +4 -4
  277. package/dist/generated/sonner.js.map +1 -1
  278. package/dist/generated/status-item.js +17 -0
  279. package/dist/generated/status-item.js.map +1 -0
  280. package/dist/generated/system-banner.js +33 -0
  281. package/dist/generated/system-banner.js.map +1 -0
  282. package/dist/generated/top-bar.js +9 -0
  283. package/dist/generated/top-bar.js.map +1 -0
  284. package/dist/generated/workspace-tab.js +17 -0
  285. package/dist/generated/workspace-tab.js.map +1 -0
  286. package/dist/icons/select-chevron.js.map +1 -0
  287. package/dist/icons/ui-icons.js +77 -0
  288. package/dist/icons/ui-icons.js.map +1 -0
  289. package/dist/index.d.ts +852 -156
  290. package/dist/index.js +96 -76
  291. package/dist/lib/cn.js +8 -1
  292. package/dist/lib/cn.js.map +1 -1
  293. package/dist/lib/number-parts.js +90 -0
  294. package/dist/lib/number-parts.js.map +1 -0
  295. package/dist/palette-cli.js +1 -1
  296. package/dist/palette.d.ts +6 -4
  297. package/dist/palette.js +3 -1
  298. package/dist/primitives/dismissable-layer.js +76 -4
  299. package/dist/primitives/dismissable-layer.js.map +1 -1
  300. package/dist/primitives/focus-scope.js +20 -5
  301. package/dist/primitives/focus-scope.js.map +1 -1
  302. package/dist/primitives/use-floating.js +16 -1
  303. package/dist/primitives/use-floating.js.map +1 -1
  304. package/dist/primitives/use-reduced-motion.js +20 -0
  305. package/dist/primitives/use-reduced-motion.js.map +1 -0
  306. package/package.json +2 -2
  307. package/styles/ev.css +281 -49
  308. package/styles/theme.css +335 -39
  309. package/styles/tokens.css +643 -103
  310. package/dist/chunk-3IPB4QQJ.js.map +0 -1
  311. package/dist/components/accordion.js.map +0 -1
  312. package/dist/components/account-menu.js +0 -70
  313. package/dist/components/account-menu.js.map +0 -1
  314. package/dist/components/alert-dialog.js.map +0 -1
  315. package/dist/components/alert.js.map +0 -1
  316. package/dist/components/app-shell.js.map +0 -1
  317. package/dist/components/auth-wall.js.map +0 -1
  318. package/dist/components/avatar.js.map +0 -1
  319. package/dist/components/badge.js.map +0 -1
  320. package/dist/components/band.js.map +0 -1
  321. package/dist/components/bottom-tab-bar.js.map +0 -1
  322. package/dist/components/breadcrumb.js.map +0 -1
  323. package/dist/components/button-group.js.map +0 -1
  324. package/dist/components/button.js.map +0 -1
  325. package/dist/components/calendar.js.map +0 -1
  326. package/dist/components/card.js.map +0 -1
  327. package/dist/components/carousel.js.map +0 -1
  328. package/dist/components/checkbox.js.map +0 -1
  329. package/dist/components/collapsible.js.map +0 -1
  330. package/dist/components/command.js.map +0 -1
  331. package/dist/components/container.js.map +0 -1
  332. package/dist/components/context-menu.js.map +0 -1
  333. package/dist/components/date-time-picker.js.map +0 -1
  334. package/dist/components/dialog.js.map +0 -1
  335. package/dist/components/drawer.js.map +0 -1
  336. package/dist/components/dropdown-menu.js.map +0 -1
  337. package/dist/components/empty.js.map +0 -1
  338. package/dist/components/field-context.js.map +0 -1
  339. package/dist/components/field.js.map +0 -1
  340. package/dist/components/footer.js.map +0 -1
  341. package/dist/components/form.js.map +0 -1
  342. package/dist/components/hover-card.js.map +0 -1
  343. package/dist/components/info-tip.js.map +0 -1
  344. package/dist/components/input-group.js.map +0 -1
  345. package/dist/components/input-otp.js.map +0 -1
  346. package/dist/components/input.js.map +0 -1
  347. package/dist/components/item.js.map +0 -1
  348. package/dist/components/kbd.js.map +0 -1
  349. package/dist/components/label.js.map +0 -1
  350. package/dist/components/list-rows.js.map +0 -1
  351. package/dist/components/logo.js.map +0 -1
  352. package/dist/components/menubar.js.map +0 -1
  353. package/dist/components/mobile-app-bar.js.map +0 -1
  354. package/dist/components/native-select.js.map +0 -1
  355. package/dist/components/nav-badge.js.map +0 -1
  356. package/dist/components/nav-link.js.map +0 -1
  357. package/dist/components/nav-model.js.map +0 -1
  358. package/dist/components/navigation-menu.js.map +0 -1
  359. package/dist/components/page-frame.js.map +0 -1
  360. package/dist/components/pagination.js.map +0 -1
  361. package/dist/components/popover.js.map +0 -1
  362. package/dist/components/progress.js.map +0 -1
  363. package/dist/components/radio-group.js.map +0 -1
  364. package/dist/components/resource-error.js.map +0 -1
  365. package/dist/components/scroll-area.js.map +0 -1
  366. package/dist/components/section-descriptor.js.map +0 -1
  367. package/dist/components/section-nav.js +0 -86
  368. package/dist/components/section-nav.js.map +0 -1
  369. package/dist/components/select-chevron.js.map +0 -1
  370. package/dist/components/select-listbox.js.map +0 -1
  371. package/dist/components/select.js.map +0 -1
  372. package/dist/components/separator.js.map +0 -1
  373. package/dist/components/settled.js.map +0 -1
  374. package/dist/components/sheet.js.map +0 -1
  375. package/dist/components/shell-icons.js.map +0 -1
  376. package/dist/components/shell-nav.js.map +0 -1
  377. package/dist/components/sidebar.js.map +0 -1
  378. package/dist/components/skeleton.js.map +0 -1
  379. package/dist/components/slider.js.map +0 -1
  380. package/dist/components/sonner.js.map +0 -1
  381. package/dist/components/spinner.js.map +0 -1
  382. package/dist/components/status-screen.js.map +0 -1
  383. package/dist/components/switch.js.map +0 -1
  384. package/dist/components/system-banner.js.map +0 -1
  385. package/dist/components/table.js.map +0 -1
  386. package/dist/components/tabs.js.map +0 -1
  387. package/dist/components/terminal.js +0 -206
  388. package/dist/components/terminal.js.map +0 -1
  389. package/dist/components/textarea.js.map +0 -1
  390. package/dist/components/toggle-group.js.map +0 -1
  391. package/dist/components/toggle.js.map +0 -1
  392. package/dist/components/tooltip.js.map +0 -1
  393. package/dist/components/top-bar.js.map +0 -1
  394. package/dist/components/use-shell-nav.js.map +0 -1
  395. package/dist/generated/terminal.js +0 -70
  396. package/dist/generated/terminal.js.map +0 -1
  397. /package/dist/components/{field-context.js → atomic/field-context.js} +0 -0
  398. /package/dist/components/{nav-link.js → shell/nav-link.js} +0 -0
  399. /package/dist/components/{nav-model.js → shell/nav-model.js} +0 -0
  400. /package/dist/components/{settled.js → shell/settled.js} +0 -0
  401. /package/dist/components/{shell-icons.js → shell/shell-icons.js} +0 -0
  402. /package/dist/components/{use-shell-nav.js → shell/use-shell-nav.js} +0 -0
  403. /package/dist/{components → icons}/select-chevron.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/derived/field.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { Label } from \"../atomic/label\";\nimport { walkElements } from \"../../primitives/walk-elements\";\nimport { isLabelable, markLabelable } from \"../../primitives/labelable\";\nimport { FieldControlContext, useFieldClaims } from \"../atomic/field-context\";\nimport {\n FIELD_BASE,\n FIELD_SET,\n FIELD_LEGEND,\n FIELD_GROUP,\n FIELD_CONTENT,\n FIELD_LABEL,\n FIELD_TITLE,\n FIELD_DESCRIPTION,\n FIELD_SEPARATOR,\n FIELD_SEPARATOR_LINE,\n FIELD_SEPARATOR_CONTENT,\n FIELD_ERROR,\n fieldOrientation,\n type FieldOrientation,\n} from \"../../generated/field\";\n\nexport type { FieldOrientation };\n\nexport function FieldSet({ className, ...props }: React.ComponentProps<\"fieldset\">) {\n return (\n <fieldset\n data-slot=\"field-set\"\n className={cn(FIELD_SET, className)}\n {...props}\n />\n );\n}\n\nexport function FieldLegend({\n className,\n variant = \"legend\",\n ...props\n}: React.ComponentProps<\"legend\"> & { variant?: \"legend\" | \"label\" }) {\n return (\n <legend\n data-slot=\"field-legend\"\n data-variant={variant}\n className={cn(FIELD_LEGEND, className)}\n {...props}\n />\n );\n}\n\nexport function FieldGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-group\"\n className={cn(FIELD_GROUP, className)}\n {...props}\n />\n );\n}\n\n/**\n * A labelled control. `Field` mints one id and hands it to both ends: its\n * `FieldLabel` takes it as `for`, and the kit's `Input`, `Textarea`,\n * `NativeSelect`, `SelectTrigger`, `Checkbox` and `Switch` take it as `id` —\n * each only when the caller passed none. `controlId` names the id instead of\n * minting one. One control per `Field`: a field that holds two has to name\n * their ids by hand, or both would claim the one id (a development warning\n * says so).\n */\nexport function Field({\n className,\n orientation = \"vertical\",\n controlId,\n ...props\n}: React.ComponentProps<\"div\"> & { orientation?: FieldOrientation; controlId?: string }) {\n const minted = React.useId();\n const claim = useFieldClaims();\n const id = controlId ?? minted;\n const control = React.useMemo(() => ({ id, claim }), [id, claim]);\n return (\n <FieldControlContext.Provider value={control}>\n <div\n role=\"group\"\n data-slot=\"field\"\n data-orientation={orientation}\n className={cn(FIELD_BASE, fieldOrientation[orientation], className)}\n {...props}\n />\n </FieldControlContext.Provider>\n );\n}\n\nmarkLabelable(Field);\n\nexport function FieldContent({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-content\"\n className={cn(FIELD_CONTENT, className)}\n {...props}\n />\n );\n}\n\nexport interface FieldLabelProps extends Omit<React.ComponentProps<typeof Label>, \"htmlFor\"> {\n /** `null` opts out of the `Field`'s id: the label then has no `for` at all. */\n htmlFor?: string | null;\n}\n\n/**\n * Takes its `Field`'s id as `for` unless it wraps a control itself — a label\n * around an `<input>` already labels it, and a `for` pointing elsewhere would\n * steal the click. A control inside a component of yours is invisible to that\n * check; pass `htmlFor={null}` there.\n */\nexport function FieldLabel({ className, htmlFor, children, ...props }: FieldLabelProps) {\n const field = React.useContext(FieldControlContext);\n const target = htmlFor === null ? undefined : (htmlFor ?? (wrapsControl(children) ? undefined : field?.id));\n return (\n <Label\n data-slot=\"field-label\"\n htmlFor={target}\n className={cn(FIELD_LABEL, className)}\n {...props}\n >\n {children}\n </Label>\n );\n}\n\n// The labelable elements (HTML's list, less `output`/`meter`/`progress`, which a\n// field label never wraps) and the kit's controls that render one — plus a\n// nested `Field`, the choice-card shape, whose control is labelled by its own.\n// The kit's controls carry a mark (`primitives/labelable`) rather than sitting\n// in a set here: a set would import every control into every page with a Field.\nconst LABELABLE_TAGS = new Set([\"input\", \"select\", \"textarea\", \"button\"]);\n\nfunction wrapsControl(children: React.ReactNode): boolean {\n let found = false;\n walkElements(children, (element) => {\n if (found) return false;\n const { type } = element;\n const props = element.props as { type?: unknown };\n if (typeof type === \"string\" ? LABELABLE_TAGS.has(type) && props.type !== \"hidden\" : isLabelable(type)) {\n found = true;\n }\n return !found;\n });\n return found;\n}\n\nexport function FieldTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"field-label\"\n className={cn(FIELD_TITLE, className)}\n {...props}\n />\n );\n}\n\nexport function FieldDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"field-description\"\n className={cn(FIELD_DESCRIPTION, className)}\n {...props}\n />\n );\n}\n\nexport function FieldSeparator({\n children,\n className,\n ...props\n}: React.ComponentProps<\"div\"> & { children?: React.ReactNode }) {\n return (\n <div\n data-slot=\"field-separator\"\n data-content={!!children}\n className={cn(FIELD_SEPARATOR, className)}\n {...props}\n >\n <div role=\"separator\" className={FIELD_SEPARATOR_LINE} />\n {children && (\n <span\n className={FIELD_SEPARATOR_CONTENT}\n data-slot=\"field-separator-content\"\n >\n {children}\n </span>\n )}\n </div>\n );\n}\n\nexport function FieldError({\n className,\n children,\n errors,\n ...props\n}: React.ComponentProps<\"div\"> & {\n errors?: Array<{ message?: string } | undefined>;\n}) {\n const content = React.useMemo(() => {\n if (children) {\n return children;\n }\n\n if (!errors) {\n return null;\n }\n\n if (errors?.length === 1 && errors[0]?.message) {\n return errors[0].message;\n }\n\n return (\n <ul className=\"ml-4 flex list-disc flex-col gap-1\">\n {errors.map(\n (error, index) => error?.message && <li key={index}>{error.message}</li>,\n )}\n </ul>\n );\n }, [children, errors]);\n\n if (!content) {\n return null;\n }\n\n return (\n <div\n role=\"alert\"\n data-slot=\"field-error\"\n className={cn(FIELD_ERROR, className)}\n {...props}\n >\n {content}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1,10 +1,10 @@
1
1
  "use client";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
- import { cn } from "../lib/cn.js";
5
- import { Label } from "./label.js";
6
- import { Slot } from "../primitives/slot.js";
7
- import { FORM_DESCRIPTION, FORM_ITEM, FORM_MESSAGE } from "../generated/form.js";
4
+ import { cn } from "../../lib/cn.js";
5
+ import { Label } from "../atomic/label.js";
6
+ import { Slot } from "../../primitives/slot.js";
7
+ import { FORM_DESCRIPTION, FORM_ITEM, FORM_MESSAGE } from "../../generated/form.js";
8
8
  const FormItemContext = React.createContext(null);
9
9
  function useFormItem() {
10
10
  const ctx = React.useContext(FormItemContext);
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/derived/form.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { Label } from \"../atomic/label\";\nimport { Slot } from \"../../primitives/slot\";\nimport { FORM_DESCRIPTION, FORM_ITEM, FORM_MESSAGE } from \"../../generated/form\";\n\n/**\n * Dep-light, presentational form primitives. We keep the ARIA id-wiring of\n * shadcn's form (label/control/description/message share an id so\n * `aria-describedby`/`id` line up) but drop `react-hook-form`'s state engine:\n * validation and field state are the consumer's job. `FormItem` mints an id via\n * `React.useId` and exposes it through `FormItemContext`.\n */\ntype FormItemContextValue = {\n id: string;\n formItemId: string;\n formDescriptionId: string;\n formMessageId: string;\n};\n\nconst FormItemContext = React.createContext<FormItemContextValue | null>(null);\n\nfunction useFormItem(): FormItemContextValue {\n const ctx = React.useContext(FormItemContext);\n if (!ctx) {\n throw new Error(\"Form parts must be used within <FormItem>\");\n }\n return ctx;\n}\n\nexport function Form({ ...props }: React.ComponentProps<\"form\">) {\n return <form data-slot=\"form\" {...props} />;\n}\n\nexport function FormItem({ className, ...props }: React.ComponentProps<\"div\">) {\n const id = React.useId();\n const value = React.useMemo<FormItemContextValue>(\n () => ({\n id,\n formItemId: `${id}-form-item`,\n formDescriptionId: `${id}-form-item-description`,\n formMessageId: `${id}-form-item-message`,\n }),\n [id],\n );\n\n return (\n <FormItemContext.Provider value={value}>\n <div data-slot=\"form-item\" className={cn(FORM_ITEM, className)} {...props} />\n </FormItemContext.Provider>\n );\n}\n\nexport function FormLabel({\n className,\n error,\n ...props\n}: React.ComponentProps<typeof Label> & { error?: boolean }) {\n const { formItemId } = useFormItem();\n\n return (\n <Label\n data-slot=\"form-label\"\n data-error={!!error}\n className={cn(\"data-[error=true]:text-accent-error\", className)}\n htmlFor={formItemId}\n {...props}\n />\n );\n}\n\nexport function FormControl({\n error,\n ...props\n}: React.ComponentProps<typeof Slot> & { error?: boolean }) {\n const { formItemId, formDescriptionId, formMessageId } = useFormItem();\n\n return (\n <Slot\n data-slot=\"form-control\"\n id={formItemId}\n aria-describedby={\n !error ? `${formDescriptionId}` : `${formDescriptionId} ${formMessageId}`\n }\n aria-invalid={!!error}\n {...props}\n />\n );\n}\n\nexport function FormDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n const { formDescriptionId } = useFormItem();\n\n return (\n <p\n data-slot=\"form-description\"\n id={formDescriptionId}\n className={cn(FORM_DESCRIPTION, className)}\n {...props}\n />\n );\n}\n\nexport function FormMessage({ className, children, ...props }: React.ComponentProps<\"p\">) {\n const { formMessageId } = useFormItem();\n\n if (!children) {\n return null;\n }\n\n return (\n <p\n data-slot=\"form-message\"\n id={formMessageId}\n className={cn(FORM_MESSAGE, className)}\n {...props}\n >\n {children}\n </p>\n );\n}\n"],"mappings":";AAiCS;AA/BT,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB,SAAS,aAAa;AACtB,SAAS,YAAY;AACrB,SAAS,kBAAkB,WAAW,oBAAoB;AAgB1D,MAAM,kBAAkB,MAAM,cAA2C,IAAI;AAE7E,SAAS,cAAoC;AAC3C,QAAM,MAAM,MAAM,WAAW,eAAe;AAC5C,MAAI,CAAC,KAAK;AACR,UAAM,IAAI,MAAM,2CAA2C;AAAA,EAC7D;AACA,SAAO;AACT;AAEO,SAAS,KAAK,EAAE,GAAG,MAAM,GAAiC;AAC/D,SAAO,oBAAC,UAAK,aAAU,QAAQ,GAAG,OAAO;AAC3C;AAEO,SAAS,SAAS,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC7E,QAAM,KAAK,MAAM,MAAM;AACvB,QAAM,QAAQ,MAAM;AAAA,IAClB,OAAO;AAAA,MACL;AAAA,MACA,YAAY,GAAG,EAAE;AAAA,MACjB,mBAAmB,GAAG,EAAE;AAAA,MACxB,eAAe,GAAG,EAAE;AAAA,IACtB;AAAA,IACA,CAAC,EAAE;AAAA,EACL;AAEA,SACE,oBAAC,gBAAgB,UAAhB,EAAyB,OACxB,8BAAC,SAAI,aAAU,aAAY,WAAW,GAAG,WAAW,SAAS,GAAI,GAAG,OAAO,GAC7E;AAEJ;AAEO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAA6D;AAC3D,QAAM,EAAE,WAAW,IAAI,YAAY;AAEnC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,cAAY,CAAC,CAAC;AAAA,MACd,WAAW,GAAG,uCAAuC,SAAS;AAAA,MAC9D,SAAS;AAAA,MACR,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,GAAG;AACL,GAA4D;AAC1D,QAAM,EAAE,YAAY,mBAAmB,cAAc,IAAI,YAAY;AAErE,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,IAAI;AAAA,MACJ,oBACE,CAAC,QAAQ,GAAG,iBAAiB,KAAK,GAAG,iBAAiB,IAAI,aAAa;AAAA,MAEzE,gBAAc,CAAC,CAAC;AAAA,MACf,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,gBAAgB,EAAE,WAAW,GAAG,MAAM,GAA8B;AAClF,QAAM,EAAE,kBAAkB,IAAI,YAAY;AAE1C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,IAAI;AAAA,MACJ,WAAW,GAAG,kBAAkB,SAAS;AAAA,MACxC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,YAAY,EAAE,WAAW,UAAU,GAAG,MAAM,GAA8B;AACxF,QAAM,EAAE,cAAc,IAAI,YAAY;AAEtC,MAAI,CAAC,UAAU;AACb,WAAO;AAAA,EACT;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,IAAI;AAAA,MACJ,WAAW,GAAG,cAAc,SAAS;AAAA,MACpC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;","names":[]}
@@ -0,0 +1,35 @@
1
+ import { jsx, jsxs } from "react/jsx-runtime";
2
+ import * as React from "react";
3
+ import { cn } from "../../lib/cn.js";
4
+ import { ICON_BUTTON_BASE, ICON_BUTTON_PRESSED, iconButtonSizeClasses } from "../../generated/icon-button.js";
5
+ import { buttonVariants } from "../atomic/button.js";
6
+ import { Tooltip, TooltipContent, TooltipTrigger } from "../atomic/tooltip.js";
7
+ const IconButton = React.forwardRef(function IconButton2({ variant = "ghost", size = "md", pressed, tooltip, className, type = "button", ...props }, ref) {
8
+ const button = /* @__PURE__ */ jsx(
9
+ "button",
10
+ {
11
+ ref,
12
+ type,
13
+ "data-slot": "icon-button",
14
+ "data-variant": variant,
15
+ "aria-pressed": pressed,
16
+ className: cn(
17
+ buttonVariants({ variant, size, icon: true }),
18
+ iconButtonSizeClasses[size],
19
+ ICON_BUTTON_BASE,
20
+ pressed && ICON_BUTTON_PRESSED,
21
+ className
22
+ ),
23
+ ...props
24
+ }
25
+ );
26
+ if (tooltip === void 0) return button;
27
+ return /* @__PURE__ */ jsxs(Tooltip, { children: [
28
+ /* @__PURE__ */ jsx(TooltipTrigger, { asChild: true, children: button }),
29
+ /* @__PURE__ */ jsx(TooltipContent, { children: tooltip })
30
+ ] });
31
+ });
32
+ export {
33
+ IconButton
34
+ };
35
+ //# sourceMappingURL=icon-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/derived/icon-button.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { ICON_BUTTON_BASE, ICON_BUTTON_PRESSED, iconButtonSizeClasses, type IconButtonSize } from \"../../generated/icon-button\";\nimport { buttonVariants } from \"../atomic/button\";\nimport { Tooltip, TooltipContent, TooltipTrigger } from \"../atomic/tooltip\";\n\nexport type { IconButtonSize };\nexport type IconButtonVariant = \"outline\" | \"ghost\";\n\nexport interface IconButtonProps extends Omit<React.ComponentPropsWithoutRef<\"button\">, \"aria-label\" | \"children\"> {\n /** Required: a glyph alone names nothing. */\n \"aria-label\": string;\n /** The glyph, 16 px. */\n children: React.ReactNode;\n variant?: IconButtonVariant;\n size?: IconButtonSize;\n /** Toggled on: the active fill, and `aria-pressed` for assistive tech. */\n pressed?: boolean;\n /** Shown in a Tooltip on hover and focus. */\n tooltip?: React.ReactNode;\n}\n\n/**\n * A square button holding one glyph. It forwards its ref (also on React 18,\n * where function components drop `ref`) so it can be the child of any\n * `asChild` trigger; with a `tooltip` the same element anchors the tooltip.\n */\nexport const IconButton = React.forwardRef<HTMLButtonElement, IconButtonProps>(function IconButton(\n { variant = \"ghost\", size = \"md\", pressed, tooltip, className, type = \"button\", ...props },\n ref,\n) {\n const button = (\n <button\n ref={ref}\n type={type}\n data-slot=\"icon-button\"\n data-variant={variant}\n aria-pressed={pressed}\n className={cn(\n buttonVariants({ variant, size, icon: true }),\n iconButtonSizeClasses[size],\n ICON_BUTTON_BASE,\n pressed && ICON_BUTTON_PRESSED,\n className,\n )}\n {...props}\n />\n );\n if (tooltip === undefined) return button;\n return (\n <Tooltip>\n <TooltipTrigger asChild>{button}</TooltipTrigger>\n <TooltipContent>{tooltip}</TooltipContent>\n </Tooltip>\n );\n});\n"],"mappings":"AAgCI,cAkBA,YAlBA;AAhCJ,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB,SAAS,kBAAkB,qBAAqB,6BAAkD;AAClG,SAAS,sBAAsB;AAC/B,SAAS,SAAS,gBAAgB,sBAAsB;AAuBjD,MAAM,aAAa,MAAM,WAA+C,SAASA,YACtF,EAAE,UAAU,SAAS,OAAO,MAAM,SAAS,SAAS,WAAW,OAAO,UAAU,GAAG,MAAM,GACzF,KACA;AACA,QAAM,SACJ;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA,aAAU;AAAA,MACV,gBAAc;AAAA,MACd,gBAAc;AAAA,MACd,WAAW;AAAA,QACT,eAAe,EAAE,SAAS,MAAM,MAAM,KAAK,CAAC;AAAA,QAC5C,sBAAsB,IAAI;AAAA,QAC1B;AAAA,QACA,WAAW;AAAA,QACX;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEF,MAAI,YAAY,OAAW,QAAO;AAClC,SACE,qBAAC,WACC;AAAA,wBAAC,kBAAe,SAAO,MAAE,kBAAO;AAAA,IAChC,oBAAC,kBAAgB,mBAAQ;AAAA,KAC3B;AAEJ,CAAC;","names":["IconButton"]}
@@ -1,10 +1,10 @@
1
1
  "use client";
2
2
  import { jsx } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
- import { cn } from "../lib/cn.js";
5
- import { Button } from "./button.js";
6
- import { Input } from "./input.js";
7
- import { Textarea } from "./textarea.js";
4
+ import { cn } from "../../lib/cn.js";
5
+ import { Button } from "../atomic/button.js";
6
+ import { Input } from "../atomic/input.js";
7
+ import { Textarea } from "../atomic/textarea.js";
8
8
  import {
9
9
  INPUT_GROUP_ADDON_BASE,
10
10
  INPUT_GROUP_BASE,
@@ -14,7 +14,7 @@ import {
14
14
  INPUT_GROUP_TEXTAREA_CONTROL,
15
15
  inputGroupAddonAligns,
16
16
  inputGroupButtonSizes
17
- } from "../generated/input-group.js";
17
+ } from "../../generated/input-group.js";
18
18
  function InputGroup({
19
19
  className,
20
20
  ...props
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/derived/input-group.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { Button, type ButtonProps } from \"../atomic/button\";\nimport { Input } from \"../atomic/input\";\nimport { Textarea } from \"../atomic/textarea\";\nimport {\n INPUT_GROUP_ADDON_BASE,\n INPUT_GROUP_BASE,\n INPUT_GROUP_BUTTON_BASE,\n INPUT_GROUP_INPUT_CONTROL,\n INPUT_GROUP_TEXT,\n INPUT_GROUP_TEXTAREA_CONTROL,\n inputGroupAddonAligns,\n inputGroupButtonSizes,\n type InputGroupAddonAlign,\n type InputGroupButtonSize,\n} from \"../../generated/input-group\";\n\nexport type { InputGroupAddonAlign, InputGroupButtonSize };\n\nexport function InputGroup({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"input-group\"\n role=\"group\"\n className={cn(INPUT_GROUP_BASE, className)}\n {...props}\n />\n );\n}\n\nexport interface InputGroupAddonProps extends React.ComponentProps<\"div\"> {\n align?: InputGroupAddonAlign;\n}\n\nexport function InputGroupAddon({\n className,\n align = \"inline-start\",\n ...props\n}: InputGroupAddonProps) {\n return (\n <div\n role=\"group\"\n data-slot=\"input-group-addon\"\n data-align={align}\n className={cn(\n INPUT_GROUP_ADDON_BASE,\n inputGroupAddonAligns[align],\n className,\n )}\n onClick={(e) => {\n if ((e.target as HTMLElement).closest(\"button\")) return;\n e.currentTarget.parentElement?.querySelector(\"input\")?.focus();\n }}\n {...props}\n />\n );\n}\n\nexport interface InputGroupButtonProps\n extends Omit<ButtonProps, \"size\"> {\n size?: InputGroupButtonSize;\n}\n\nexport function InputGroupButton({\n className,\n type = \"button\",\n variant = \"ghost\",\n size = \"xs\",\n ...props\n}: InputGroupButtonProps) {\n return (\n <Button\n type={type}\n data-size={size}\n variant={variant}\n className={cn(\n INPUT_GROUP_BUTTON_BASE,\n inputGroupButtonSizes[size],\n className,\n )}\n {...props}\n />\n );\n}\n\nexport function InputGroupText({\n className,\n ...props\n}: React.ComponentProps<\"span\">) {\n return (\n <span\n className={cn(INPUT_GROUP_TEXT, className)}\n {...props}\n />\n );\n}\n\n// The group, not the control, owns the height, so the control takes neither the\n// kit's `size` nor the native one `Input` gave up for it.\nexport function InputGroupInput({\n className,\n ...props\n}: Omit<React.ComponentProps<\"input\">, \"size\">) {\n return (\n <Input\n data-slot=\"input-group-control\"\n className={cn(INPUT_GROUP_INPUT_CONTROL, className)}\n {...props}\n />\n );\n}\n\nexport function InputGroupTextarea({\n className,\n ...props\n}: React.ComponentProps<\"textarea\">) {\n return (\n <Textarea\n data-slot=\"input-group-control\"\n className={cn(INPUT_GROUP_TEXTAREA_CONTROL, className)}\n {...props}\n />\n );\n}\n"],"mappings":";AA2BI;AAzBJ,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB,SAAS,cAAgC;AACzC,SAAS,aAAa;AACtB,SAAS,gBAAgB;AACzB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAGK;AAIA,SAAS,WAAW;AAAA,EACzB;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,MAAK;AAAA,MACL,WAAW,GAAG,kBAAkB,SAAS;AAAA,MACxC,GAAG;AAAA;AAAA,EACN;AAEJ;AAMO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA,QAAQ;AAAA,EACR,GAAG;AACL,GAAyB;AACvB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAU;AAAA,MACV,cAAY;AAAA,MACZ,WAAW;AAAA,QACT;AAAA,QACA,sBAAsB,KAAK;AAAA,QAC3B;AAAA,MACF;AAAA,MACA,SAAS,CAAC,MAAM;AACd,YAAK,EAAE,OAAuB,QAAQ,QAAQ,EAAG;AACjD,UAAE,cAAc,eAAe,cAAc,OAAO,GAAG,MAAM;AAAA,MAC/D;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAOO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA,OAAO;AAAA,EACP,UAAU;AAAA,EACV,OAAO;AAAA,EACP,GAAG;AACL,GAA0B;AACxB,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA,aAAW;AAAA,MACX;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,sBAAsB,IAAI;AAAA,QAC1B;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA,GAAG;AACL,GAAiC;AAC/B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,WAAW,GAAG,kBAAkB,SAAS;AAAA,MACxC,GAAG;AAAA;AAAA,EACN;AAEJ;AAIO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA,GAAG;AACL,GAAgD;AAC9C,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,2BAA2B,SAAS;AAAA,MACjD,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA,GAAG;AACL,GAAqC;AACnC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,8BAA8B,SAAS;AAAA,MACpD,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]}
@@ -1,8 +1,8 @@
1
1
  import { jsx } from "react/jsx-runtime";
2
2
  import * as React from "react";
3
- import { cn } from "../lib/cn.js";
4
- import { Slot } from "../primitives/slot.js";
5
- import { Separator } from "./separator.js";
3
+ import { cn } from "../../lib/cn.js";
4
+ import { Slot } from "../../primitives/slot.js";
5
+ import { Separator } from "../atomic/separator.js";
6
6
  import {
7
7
  ITEM_ACTIONS,
8
8
  ITEM_BASE,
@@ -17,7 +17,7 @@ import {
17
17
  itemMediaVariants,
18
18
  itemSizes,
19
19
  itemVariants
20
- } from "../generated/item.js";
20
+ } from "../../generated/item.js";
21
21
  function ItemGroup({ className, ...props }) {
22
22
  return /* @__PURE__ */ jsx(
23
23
  "div",
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/derived/item.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { Slot } from \"../../primitives/slot\";\nimport { Separator } from \"../atomic/separator\";\nimport {\n ITEM_ACTIONS,\n ITEM_BASE,\n ITEM_CONTENT,\n ITEM_DESCRIPTION,\n ITEM_FOOTER,\n ITEM_GROUP,\n ITEM_HEADER,\n ITEM_MEDIA_BASE,\n ITEM_SEPARATOR,\n ITEM_TITLE,\n itemMediaVariants,\n itemSizes,\n itemVariants,\n type ItemMediaVariant,\n type ItemSize,\n type ItemVariant,\n} from \"../../generated/item\";\n\nexport type { ItemMediaVariant, ItemSize, ItemVariant };\n\nexport function ItemGroup({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n role=\"list\"\n data-slot=\"item-group\"\n className={cn(ITEM_GROUP, className)}\n {...props}\n />\n );\n}\n\nexport function ItemSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof Separator>) {\n return (\n <Separator\n data-slot=\"item-separator\"\n orientation=\"horizontal\"\n className={cn(ITEM_SEPARATOR, className)}\n {...props}\n />\n );\n}\n\nexport interface ItemProps extends React.ComponentProps<\"div\"> {\n variant?: ItemVariant;\n size?: ItemSize;\n asChild?: boolean;\n}\n\nexport function Item({\n className,\n variant = \"bare\",\n size = \"md\",\n asChild = false,\n ...props\n}: ItemProps) {\n const Comp = asChild ? Slot : \"div\";\n return (\n <Comp\n data-slot=\"item\"\n data-variant={variant}\n data-size={size}\n className={cn(ITEM_BASE, itemVariants[variant], itemSizes[size], className)}\n {...(props as Record<string, unknown>)}\n />\n );\n}\n\nexport interface ItemMediaProps extends React.ComponentProps<\"div\"> {\n variant?: ItemMediaVariant;\n}\n\nexport function ItemMedia({\n className,\n variant = \"bare\",\n ...props\n}: ItemMediaProps) {\n return (\n <div\n data-slot=\"item-media\"\n data-variant={variant}\n className={cn(ITEM_MEDIA_BASE, itemMediaVariants[variant], className)}\n {...props}\n />\n );\n}\n\nexport function ItemContent({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-content\"\n className={cn(ITEM_CONTENT, className)}\n {...props}\n />\n );\n}\n\nexport function ItemTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-title\"\n className={cn(ITEM_TITLE, className)}\n {...props}\n />\n );\n}\n\nexport function ItemDescription({\n className,\n ...props\n}: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"item-description\"\n className={cn(ITEM_DESCRIPTION, className)}\n {...props}\n />\n );\n}\n\nexport function ItemActions({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-actions\"\n className={cn(ITEM_ACTIONS, className)}\n {...props}\n />\n );\n}\n\nexport function ItemHeader({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-header\"\n className={cn(ITEM_HEADER, className)}\n {...props}\n />\n );\n}\n\nexport function ItemFooter({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"item-footer\"\n className={cn(ITEM_FOOTER, className)}\n {...props}\n />\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,60 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { cn } from "../../lib/cn.js";
5
+ import {
6
+ POPOVER_FORM_ACTIONS,
7
+ POPOVER_FORM_CONTENT,
8
+ POPOVER_FORM_FIELDS,
9
+ POPOVER_FORM_FORM,
10
+ POPOVER_FORM_TITLE
11
+ } from "../../generated/popover-form.js";
12
+ import { useControllableState } from "../../primitives/use-controllable-state.js";
13
+ import { Button } from "../atomic/button.js";
14
+ import { Popover, PopoverContent, PopoverTrigger } from "../atomic/popover.js";
15
+ function PopoverForm({
16
+ open,
17
+ defaultOpen = false,
18
+ onOpenChange,
19
+ trigger,
20
+ title,
21
+ children,
22
+ onSubmit,
23
+ onReset,
24
+ labels = {},
25
+ className
26
+ }) {
27
+ const [isOpen, setOpen] = useControllableState({
28
+ ...open !== void 0 ? { value: open } : {},
29
+ defaultValue: defaultOpen,
30
+ ...onOpenChange ? { onChange: onOpenChange } : {}
31
+ });
32
+ const titleId = React.useId();
33
+ return /* @__PURE__ */ jsxs(Popover, { open: isOpen, onOpenChange: setOpen, children: [
34
+ /* @__PURE__ */ jsx(PopoverTrigger, { asChild: true, children: trigger }),
35
+ /* @__PURE__ */ jsx(PopoverContent, { align: "start", className: cn(POPOVER_FORM_CONTENT, className), "aria-labelledby": titleId, role: "dialog", children: /* @__PURE__ */ jsxs(
36
+ "form",
37
+ {
38
+ className: POPOVER_FORM_FORM,
39
+ onSubmit: (e) => {
40
+ e.preventDefault();
41
+ onSubmit?.(e);
42
+ setOpen(false);
43
+ },
44
+ onReset: () => onReset?.(),
45
+ children: [
46
+ /* @__PURE__ */ jsx("h3", { id: titleId, className: POPOVER_FORM_TITLE, children: title }),
47
+ /* @__PURE__ */ jsx("div", { className: POPOVER_FORM_FIELDS, children }),
48
+ /* @__PURE__ */ jsxs("div", { className: POPOVER_FORM_ACTIONS, children: [
49
+ /* @__PURE__ */ jsx(Button, { type: "reset", variant: "ghost", size: "sm", children: labels.reset ?? "Reset" }),
50
+ /* @__PURE__ */ jsx(Button, { type: "submit", variant: "primary", size: "sm", children: labels.submit ?? "Apply" })
51
+ ] })
52
+ ]
53
+ }
54
+ ) })
55
+ ] });
56
+ }
57
+ export {
58
+ PopoverForm
59
+ };
60
+ //# sourceMappingURL=popover-form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/derived/popover-form.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport {\n POPOVER_FORM_ACTIONS,\n POPOVER_FORM_CONTENT,\n POPOVER_FORM_FIELDS,\n POPOVER_FORM_FORM,\n POPOVER_FORM_TITLE,\n} from \"../../generated/popover-form\";\nimport { useControllableState } from \"../../primitives/use-controllable-state\";\nimport { Button } from \"../atomic/button\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../atomic/popover\";\n\nexport interface PopoverFormLabels {\n submit?: string;\n reset?: string;\n}\n\nexport interface PopoverFormProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** The button that opens the form; wrapped with `asChild`, so pass one element. */\n trigger: React.ReactNode;\n title: React.ReactNode;\n /** The fields: `Field`s with an `Input`, `Select` or `Checkbox`. */\n children: React.ReactNode;\n /** Called on submit; the popover closes afterwards. */\n onSubmit?: (event: React.FormEvent<HTMLFormElement>) => void;\n /** Called when Reset is pressed; native fields are reset by the browser first. */\n onReset?: () => void;\n labels?: PopoverFormLabels;\n className?: string;\n}\n\n/** A filter-style form in a popover: a title, fields, Reset and Apply. */\nexport function PopoverForm({\n open,\n defaultOpen = false,\n onOpenChange,\n trigger,\n title,\n children,\n onSubmit,\n onReset,\n labels = {},\n className,\n}: PopoverFormProps) {\n const [isOpen, setOpen] = useControllableState<boolean>({\n ...(open !== undefined ? { value: open } : {}),\n defaultValue: defaultOpen,\n ...(onOpenChange ? { onChange: onOpenChange } : {}),\n });\n const titleId = React.useId();\n return (\n <Popover open={isOpen} onOpenChange={setOpen}>\n <PopoverTrigger asChild>{trigger}</PopoverTrigger>\n <PopoverContent align=\"start\" className={cn(POPOVER_FORM_CONTENT, className)} aria-labelledby={titleId} role=\"dialog\">\n <form\n className={POPOVER_FORM_FORM}\n onSubmit={(e) => {\n e.preventDefault();\n onSubmit?.(e);\n setOpen(false);\n }}\n onReset={() => onReset?.()}\n >\n <h3 id={titleId} className={POPOVER_FORM_TITLE}>\n {title}\n </h3>\n <div className={POPOVER_FORM_FIELDS}>{children}</div>\n <div className={POPOVER_FORM_ACTIONS}>\n <Button type=\"reset\" variant=\"ghost\" size=\"sm\">\n {labels.reset ?? \"Reset\"}\n </Button>\n <Button type=\"submit\" variant=\"primary\" size=\"sm\">\n {labels.submit ?? \"Apply\"}\n </Button>\n </div>\n </form>\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":";AA0DM,cAeI,YAfJ;AAxDN,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,4BAA4B;AACrC,SAAS,cAAc;AACvB,SAAS,SAAS,gBAAgB,sBAAsB;AAyBjD,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,cAAc;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS,CAAC;AAAA,EACV;AACF,GAAqB;AACnB,QAAM,CAAC,QAAQ,OAAO,IAAI,qBAA8B;AAAA,IACtD,GAAI,SAAS,SAAY,EAAE,OAAO,KAAK,IAAI,CAAC;AAAA,IAC5C,cAAc;AAAA,IACd,GAAI,eAAe,EAAE,UAAU,aAAa,IAAI,CAAC;AAAA,EACnD,CAAC;AACD,QAAM,UAAU,MAAM,MAAM;AAC5B,SACE,qBAAC,WAAQ,MAAM,QAAQ,cAAc,SACnC;AAAA,wBAAC,kBAAe,SAAO,MAAE,mBAAQ;AAAA,IACjC,oBAAC,kBAAe,OAAM,SAAQ,WAAW,GAAG,sBAAsB,SAAS,GAAG,mBAAiB,SAAS,MAAK,UAC3G;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,QACX,UAAU,CAAC,MAAM;AACf,YAAE,eAAe;AACjB,qBAAW,CAAC;AACZ,kBAAQ,KAAK;AAAA,QACf;AAAA,QACA,SAAS,MAAM,UAAU;AAAA,QAEzB;AAAA,8BAAC,QAAG,IAAI,SAAS,WAAW,oBACzB,iBACH;AAAA,UACA,oBAAC,SAAI,WAAW,qBAAsB,UAAS;AAAA,UAC/C,qBAAC,SAAI,WAAW,sBACd;AAAA,gCAAC,UAAO,MAAK,SAAQ,SAAQ,SAAQ,MAAK,MACvC,iBAAO,SAAS,SACnB;AAAA,YACA,oBAAC,UAAO,MAAK,UAAS,SAAQ,WAAU,MAAK,MAC1C,iBAAO,UAAU,SACpB;AAAA,aACF;AAAA;AAAA;AAAA,IACF,GACF;AAAA,KACF;AAEJ;","names":[]}
@@ -0,0 +1,94 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { cn } from "../../lib/cn.js";
5
+ import {
6
+ SETTINGS_LAYOUT,
7
+ SETTINGS_MAIN,
8
+ SETTINGS_NAV,
9
+ SETTINGS_ROW_INLINE,
10
+ SETTINGS_SECTION_ACTION,
11
+ SETTINGS_SECTION_BASE,
12
+ SETTINGS_SECTION_BODY,
13
+ SETTINGS_SECTION_BODY_FLUSH,
14
+ SETTINGS_SECTION_BODY_PADDED,
15
+ SETTINGS_SECTION_DESCRIPTION,
16
+ SETTINGS_SECTION_HEADER,
17
+ SETTINGS_SECTION_HEADER_FLUSH,
18
+ SETTINGS_SECTION_HEADING,
19
+ SETTINGS_SECTION_TITLE,
20
+ settingsSectionToneClasses
21
+ } from "../../generated/settings.js";
22
+ import { FormRow } from "../atomic/form-row.js";
23
+ function SettingsLayout({ nav, className, children, ...props }) {
24
+ return /* @__PURE__ */ jsxs(
25
+ "div",
26
+ {
27
+ "data-slot": "settings-layout",
28
+ className: cn(
29
+ SETTINGS_LAYOUT,
30
+ className
31
+ ),
32
+ ...props,
33
+ children: [
34
+ /* @__PURE__ */ jsx("div", { "data-slot": "settings-nav", className: SETTINGS_NAV, children: nav }),
35
+ /* @__PURE__ */ jsx("div", { "data-slot": "settings-main", className: SETTINGS_MAIN, children })
36
+ ]
37
+ }
38
+ );
39
+ }
40
+ function SettingsSection({
41
+ title,
42
+ description,
43
+ action,
44
+ tone = "default",
45
+ flush = false,
46
+ className,
47
+ children,
48
+ ...props
49
+ }) {
50
+ const headingId = React.useId();
51
+ return /* @__PURE__ */ jsxs(
52
+ "section",
53
+ {
54
+ "data-slot": "settings-section",
55
+ "data-tone": tone,
56
+ "aria-labelledby": headingId,
57
+ className: cn(
58
+ SETTINGS_SECTION_BASE,
59
+ settingsSectionToneClasses[tone],
60
+ className
61
+ ),
62
+ ...props,
63
+ children: [
64
+ /* @__PURE__ */ jsxs("header", { className: cn(SETTINGS_SECTION_HEADER, flush && SETTINGS_SECTION_HEADER_FLUSH), children: [
65
+ /* @__PURE__ */ jsxs("div", { className: SETTINGS_SECTION_HEADING, children: [
66
+ /* @__PURE__ */ jsx("h3", { id: headingId, className: SETTINGS_SECTION_TITLE, children: title }),
67
+ description != null && /* @__PURE__ */ jsx("p", { className: SETTINGS_SECTION_DESCRIPTION, children: description })
68
+ ] }),
69
+ action != null && /* @__PURE__ */ jsx("div", { className: SETTINGS_SECTION_ACTION, children: action })
70
+ ] }),
71
+ children != null && /* @__PURE__ */ jsx("div", { className: cn(SETTINGS_SECTION_BODY, flush ? SETTINGS_SECTION_BODY_FLUSH : SETTINGS_SECTION_BODY_PADDED), children })
72
+ ]
73
+ }
74
+ );
75
+ }
76
+ function SettingsRow({ inline = false, className, ...props }) {
77
+ return /* @__PURE__ */ jsx(
78
+ FormRow,
79
+ {
80
+ "data-inline": inline,
81
+ className: cn(
82
+ inline && SETTINGS_ROW_INLINE,
83
+ className
84
+ ),
85
+ ...props
86
+ }
87
+ );
88
+ }
89
+ export {
90
+ SettingsLayout,
91
+ SettingsRow,
92
+ SettingsSection
93
+ };
94
+ //# sourceMappingURL=settings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/derived/settings.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport {\n SETTINGS_LAYOUT,\n SETTINGS_MAIN,\n SETTINGS_NAV,\n SETTINGS_ROW_INLINE,\n SETTINGS_SECTION_ACTION,\n SETTINGS_SECTION_BASE,\n SETTINGS_SECTION_BODY,\n SETTINGS_SECTION_BODY_FLUSH,\n SETTINGS_SECTION_BODY_PADDED,\n SETTINGS_SECTION_DESCRIPTION,\n SETTINGS_SECTION_HEADER,\n SETTINGS_SECTION_HEADER_FLUSH,\n SETTINGS_SECTION_HEADING,\n SETTINGS_SECTION_TITLE,\n settingsSectionToneClasses,\n type SettingsSectionTone,\n} from \"../../generated/settings\";\nimport { FormRow, type FormRowProps } from \"../atomic/form-row\";\n\nexport interface SettingsLayoutProps extends Omit<React.ComponentProps<\"div\">, \"title\"> {\n /** The section rail (`SectionNav`), 256 wide from `lg` up and on top below it. */\n nav: React.ReactNode;\n}\n\n/**\n * Rail on the left, cards in the main column; centres a 1408 px measure. The column is a\n * div: `AppShell` already renders the page's `<main>`.\n */\nexport function SettingsLayout({ nav, className, children, ...props }: SettingsLayoutProps) {\n return (\n <div\n data-slot=\"settings-layout\"\n className={cn(\n SETTINGS_LAYOUT,\n className,\n )}\n {...props}\n >\n <div data-slot=\"settings-nav\" className={SETTINGS_NAV}>\n {nav}\n </div>\n <div data-slot=\"settings-main\" className={SETTINGS_MAIN}>\n {children}\n </div>\n </div>\n );\n}\n\nexport interface SettingsSectionProps extends Omit<React.ComponentProps<\"section\">, \"title\"> {\n title: React.ReactNode;\n description?: React.ReactNode;\n /** Top-right control, e.g. a \"Create team\" button. */\n action?: React.ReactNode;\n /** `danger` draws the destructive-zone edge. */\n tone?: SettingsSectionTone;\n /** Rows run edge to edge with their hairlines; otherwise the body is padded. */\n flush?: boolean;\n}\n\n/** A settings card: title, a line saying what it is for, then the body. */\nexport function SettingsSection({\n title,\n description,\n action,\n tone = \"default\",\n flush = false,\n className,\n children,\n ...props\n}: SettingsSectionProps) {\n const headingId = React.useId();\n return (\n <section\n data-slot=\"settings-section\"\n data-tone={tone}\n aria-labelledby={headingId}\n className={cn(\n SETTINGS_SECTION_BASE,\n settingsSectionToneClasses[tone],\n className,\n )}\n {...props}\n >\n <header className={cn(SETTINGS_SECTION_HEADER, flush && SETTINGS_SECTION_HEADER_FLUSH)}>\n <div className={SETTINGS_SECTION_HEADING}>\n <h3 id={headingId} className={SETTINGS_SECTION_TITLE}>\n {title}\n </h3>\n {description != null && <p className={SETTINGS_SECTION_DESCRIPTION}>{description}</p>}\n </div>\n {action != null && <div className={SETTINGS_SECTION_ACTION}>{action}</div>}\n </header>\n {children != null && (\n <div className={cn(SETTINGS_SECTION_BODY, flush ? SETTINGS_SECTION_BODY_FLUSH : SETTINGS_SECTION_BODY_PADDED)}>\n {children}\n </div>\n )}\n </section>\n );\n}\n\nexport interface SettingsRowProps extends FormRowProps {\n /** Keeps label and control on one line at every width, control at the end: for a switch or a button. */\n inline?: boolean;\n}\n\n/** A `FormRow` for settings; `inline` suits toggles. */\nexport function SettingsRow({ inline = false, className, ...props }: SettingsRowProps) {\n return (\n <FormRow\n data-inline={inline}\n className={cn(\n inline && SETTINGS_ROW_INLINE,\n className,\n )}\n {...props}\n />\n );\n}\n"],"mappings":";AAmCI,SAQE,KARF;AAjCJ,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AACP,SAAS,eAAkC;AAWpC,SAAS,eAAe,EAAE,KAAK,WAAW,UAAU,GAAG,MAAM,GAAwB;AAC1F,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA,4BAAC,SAAI,aAAU,gBAAe,WAAW,cACtC,eACH;AAAA,QACA,oBAAC,SAAI,aAAU,iBAAgB,WAAW,eACvC,UACH;AAAA;AAAA;AAAA,EACF;AAEJ;AAcO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA,OAAO;AAAA,EACP,QAAQ;AAAA,EACR;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAyB;AACvB,QAAM,YAAY,MAAM,MAAM;AAC9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,aAAW;AAAA,MACX,mBAAiB;AAAA,MACjB,WAAW;AAAA,QACT;AAAA,QACA,2BAA2B,IAAI;AAAA,QAC/B;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEJ;AAAA,6BAAC,YAAO,WAAW,GAAG,yBAAyB,SAAS,6BAA6B,GACnF;AAAA,+BAAC,SAAI,WAAW,0BACd;AAAA,gCAAC,QAAG,IAAI,WAAW,WAAW,wBAC3B,iBACH;AAAA,YACC,eAAe,QAAQ,oBAAC,OAAE,WAAW,8BAA+B,uBAAY;AAAA,aACnF;AAAA,UACC,UAAU,QAAQ,oBAAC,SAAI,WAAW,yBAA0B,kBAAO;AAAA,WACtE;AAAA,QACC,YAAY,QACX,oBAAC,SAAI,WAAW,GAAG,uBAAuB,QAAQ,8BAA8B,4BAA4B,GACzG,UACH;AAAA;AAAA;AAAA,EAEJ;AAEJ;AAQO,SAAS,YAAY,EAAE,SAAS,OAAO,WAAW,GAAG,MAAM,GAAqB;AACrF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,eAAa;AAAA,MACb,WAAW;AAAA,QACT,UAAU;AAAA,QACV;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]}
@@ -0,0 +1,128 @@
1
+ "use client";
2
+ import { jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import {
5
+ ACCOUNT_LIST_BASE,
6
+ ACCOUNT_LIST_ITEM_ACTIONS,
7
+ ACCOUNT_LIST_ITEM_AVATAR,
8
+ ACCOUNT_LIST_ITEM_AVATAR_FALLBACK,
9
+ ACCOUNT_LIST_ITEM_BADGES,
10
+ ACCOUNT_LIST_ITEM_BASE,
11
+ ACCOUNT_LIST_ITEM_CHECK,
12
+ ACCOUNT_LIST_ITEM_CHECK_HIDDEN,
13
+ ACCOUNT_LIST_ITEM_CHECKED,
14
+ ACCOUNT_LIST_ITEM_DISABLED,
15
+ ACCOUNT_LIST_ITEM_FIGURE,
16
+ ACCOUNT_LIST_ITEM_HANDLE,
17
+ ACCOUNT_LIST_ITEM_NAME,
18
+ ACCOUNT_LIST_ITEM_RADIO,
19
+ ACCOUNT_LIST_ITEM_TEXT,
20
+ ACCOUNT_LIST_ITEM_UNCHECKED
21
+ } from "../../generated/account-list.js";
22
+ import { cn } from "../../lib/cn.js";
23
+ import { useControllableState } from "../../primitives/use-controllable-state.js";
24
+ import { Avatar, AvatarFallback } from "../atomic/avatar.js";
25
+ import { UiIcon } from "../../icons/ui-icons.js";
26
+ const AccountListContext = React.createContext(null);
27
+ function AccountList({
28
+ value,
29
+ defaultValue = "",
30
+ onValueChange,
31
+ className,
32
+ onKeyDown,
33
+ ...props
34
+ }) {
35
+ const [current, setValue] = useControllableState({
36
+ ...value !== void 0 ? { value } : {},
37
+ defaultValue,
38
+ ...onValueChange ? { onChange: onValueChange } : {}
39
+ });
40
+ const move = (e) => {
41
+ const forward = e.key === "ArrowDown" || e.key === "ArrowRight";
42
+ const back = e.key === "ArrowUp" || e.key === "ArrowLeft";
43
+ if (!forward && !back) return;
44
+ const radios = Array.from(
45
+ e.currentTarget.querySelectorAll('[role="radio"]:not(:disabled)')
46
+ );
47
+ const at = radios.indexOf(document.activeElement);
48
+ if (at < 0) return;
49
+ e.preventDefault();
50
+ const next = radios[(at + (forward ? 1 : -1) + radios.length) % radios.length];
51
+ next?.focus();
52
+ next?.click();
53
+ };
54
+ return /* @__PURE__ */ jsx(AccountListContext.Provider, { value: { value: current, setValue }, children: /* @__PURE__ */ jsx(
55
+ "div",
56
+ {
57
+ role: "radiogroup",
58
+ "data-slot": "account-list",
59
+ className: cn(ACCOUNT_LIST_BASE, className),
60
+ onKeyDown: (e) => {
61
+ onKeyDown?.(e);
62
+ if (!e.defaultPrevented) move(e);
63
+ },
64
+ ...props
65
+ }
66
+ ) });
67
+ }
68
+ function AccountListItem({
69
+ value,
70
+ name,
71
+ handle,
72
+ avatar,
73
+ badges,
74
+ figure,
75
+ actions,
76
+ disabled,
77
+ className,
78
+ ...props
79
+ }) {
80
+ const ctx = React.useContext(AccountListContext);
81
+ if (!ctx) throw new Error("AccountListItem must be used within <AccountList>");
82
+ const checked = ctx.value === value;
83
+ const initial = typeof name === "string" ? name.trim().charAt(0).toUpperCase() : "";
84
+ return /* @__PURE__ */ jsxs(
85
+ "div",
86
+ {
87
+ "data-slot": "account-list-item",
88
+ "data-state": checked ? "checked" : "unchecked",
89
+ className: cn(
90
+ ACCOUNT_LIST_ITEM_BASE,
91
+ checked ? ACCOUNT_LIST_ITEM_CHECKED : ACCOUNT_LIST_ITEM_UNCHECKED,
92
+ disabled && ACCOUNT_LIST_ITEM_DISABLED,
93
+ className
94
+ ),
95
+ ...props,
96
+ children: [
97
+ /* @__PURE__ */ jsxs(
98
+ "button",
99
+ {
100
+ type: "button",
101
+ role: "radio",
102
+ "aria-checked": checked,
103
+ disabled,
104
+ tabIndex: checked || ctx.value === "" ? 0 : -1,
105
+ onClick: () => ctx.setValue(value),
106
+ className: ACCOUNT_LIST_ITEM_RADIO,
107
+ children: [
108
+ avatar ?? /* @__PURE__ */ jsx(Avatar, { className: ACCOUNT_LIST_ITEM_AVATAR, children: /* @__PURE__ */ jsx(AvatarFallback, { className: ACCOUNT_LIST_ITEM_AVATAR_FALLBACK, children: initial }) }),
109
+ /* @__PURE__ */ jsxs("span", { className: ACCOUNT_LIST_ITEM_TEXT, children: [
110
+ /* @__PURE__ */ jsx("span", { className: ACCOUNT_LIST_ITEM_NAME, children: name }),
111
+ handle != null && /* @__PURE__ */ jsx("span", { className: ACCOUNT_LIST_ITEM_HANDLE, children: handle })
112
+ ] }),
113
+ badges != null && /* @__PURE__ */ jsx("span", { className: ACCOUNT_LIST_ITEM_BADGES, children: badges }),
114
+ figure != null && /* @__PURE__ */ jsx("span", { className: ACCOUNT_LIST_ITEM_FIGURE, children: figure }),
115
+ /* @__PURE__ */ jsx("span", { className: cn(ACCOUNT_LIST_ITEM_CHECK, !checked && ACCOUNT_LIST_ITEM_CHECK_HIDDEN), "aria-hidden": true, children: /* @__PURE__ */ jsx(UiIcon, { name: "check" }) })
116
+ ]
117
+ }
118
+ ),
119
+ actions != null && /* @__PURE__ */ jsx("div", { className: ACCOUNT_LIST_ITEM_ACTIONS, children: actions })
120
+ ]
121
+ }
122
+ );
123
+ }
124
+ export {
125
+ AccountList,
126
+ AccountListItem
127
+ };
128
+ //# sourceMappingURL=account-list.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/shell/account-list.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n ACCOUNT_LIST_BASE,\n ACCOUNT_LIST_ITEM_ACTIONS,\n ACCOUNT_LIST_ITEM_AVATAR,\n ACCOUNT_LIST_ITEM_AVATAR_FALLBACK,\n ACCOUNT_LIST_ITEM_BADGES,\n ACCOUNT_LIST_ITEM_BASE,\n ACCOUNT_LIST_ITEM_CHECK,\n ACCOUNT_LIST_ITEM_CHECK_HIDDEN,\n ACCOUNT_LIST_ITEM_CHECKED,\n ACCOUNT_LIST_ITEM_DISABLED,\n ACCOUNT_LIST_ITEM_FIGURE,\n ACCOUNT_LIST_ITEM_HANDLE,\n ACCOUNT_LIST_ITEM_NAME,\n ACCOUNT_LIST_ITEM_RADIO,\n ACCOUNT_LIST_ITEM_TEXT,\n ACCOUNT_LIST_ITEM_UNCHECKED,\n} from \"../../generated/account-list\";\nimport { cn } from \"../../lib/cn\";\nimport { useControllableState } from \"../../primitives/use-controllable-state\";\nimport { Avatar, AvatarFallback } from \"../atomic/avatar\";\nimport { UiIcon } from \"../../icons/ui-icons\";\n\ninterface AccountListContextValue {\n value: string;\n setValue: (next: string) => void;\n}\n\nconst AccountListContext = React.createContext<AccountListContextValue | null>(null);\n\nexport interface AccountListProps extends Omit<React.ComponentProps<\"div\">, \"onChange\" | \"defaultValue\"> {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n /** Accessible name of the group, e.g. \"Accounts\". */\n \"aria-label\": string;\n}\n\n/**\n * Pick the account you act as: one is current, arrows move and select\n * (radio-group semantics), so the current account is the only tab stop.\n */\nexport function AccountList({\n value,\n defaultValue = \"\",\n onValueChange,\n className,\n onKeyDown,\n ...props\n}: AccountListProps) {\n const [current, setValue] = useControllableState<string>({\n ...(value !== undefined ? { value } : {}),\n defaultValue,\n ...(onValueChange ? { onChange: onValueChange } : {}),\n });\n\n const move = (e: React.KeyboardEvent<HTMLDivElement>) => {\n const forward = e.key === \"ArrowDown\" || e.key === \"ArrowRight\";\n const back = e.key === \"ArrowUp\" || e.key === \"ArrowLeft\";\n if (!forward && !back) return;\n const radios = Array.from(\n e.currentTarget.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]:not(:disabled)'),\n );\n const at = radios.indexOf(document.activeElement as HTMLButtonElement);\n if (at < 0) return;\n e.preventDefault();\n const next = radios[(at + (forward ? 1 : -1) + radios.length) % radios.length];\n next?.focus();\n next?.click();\n };\n\n return (\n <AccountListContext.Provider value={{ value: current, setValue }}>\n <div\n role=\"radiogroup\"\n data-slot=\"account-list\"\n className={cn(ACCOUNT_LIST_BASE, className)}\n onKeyDown={(e) => {\n onKeyDown?.(e);\n if (!e.defaultPrevented) move(e);\n }}\n {...props}\n />\n </AccountListContext.Provider>\n );\n}\n\nexport interface AccountListItemProps extends Omit<React.ComponentProps<\"div\">, \"value\" | \"title\"> {\n value: string;\n name: React.ReactNode;\n /** A line under the name: handle, email. */\n handle?: React.ReactNode;\n /** Replaces the initial-in-a-square default. */\n avatar?: React.ReactNode;\n /** Role badges after the name block. */\n badges?: React.ReactNode;\n /** A figure at the end, set in the serif face: a balance. */\n figure?: React.ReactNode;\n /** Controls beside the row (a menu button); they cannot live inside the radio. */\n actions?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport function AccountListItem({\n value,\n name,\n handle,\n avatar,\n badges,\n figure,\n actions,\n disabled,\n className,\n ...props\n}: AccountListItemProps) {\n const ctx = React.useContext(AccountListContext);\n if (!ctx) throw new Error(\"AccountListItem must be used within <AccountList>\");\n const checked = ctx.value === value;\n const initial = typeof name === \"string\" ? name.trim().charAt(0).toUpperCase() : \"\";\n return (\n <div\n data-slot=\"account-list-item\"\n data-state={checked ? \"checked\" : \"unchecked\"}\n className={cn(\n ACCOUNT_LIST_ITEM_BASE,\n checked ? ACCOUNT_LIST_ITEM_CHECKED : ACCOUNT_LIST_ITEM_UNCHECKED,\n disabled && ACCOUNT_LIST_ITEM_DISABLED,\n className,\n )}\n {...props}\n >\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={checked}\n disabled={disabled}\n // Until one is chosen every radio is a tab stop, or the group could not be entered.\n tabIndex={checked || ctx.value === \"\" ? 0 : -1}\n onClick={() => ctx.setValue(value)}\n className={ACCOUNT_LIST_ITEM_RADIO}\n >\n {avatar ?? (\n <Avatar className={ACCOUNT_LIST_ITEM_AVATAR}>\n <AvatarFallback className={ACCOUNT_LIST_ITEM_AVATAR_FALLBACK}>{initial}</AvatarFallback>\n </Avatar>\n )}\n <span className={ACCOUNT_LIST_ITEM_TEXT}>\n <span className={ACCOUNT_LIST_ITEM_NAME}>{name}</span>\n {handle != null && <span className={ACCOUNT_LIST_ITEM_HANDLE}>{handle}</span>}\n </span>\n {badges != null && <span className={ACCOUNT_LIST_ITEM_BADGES}>{badges}</span>}\n {figure != null && <span className={ACCOUNT_LIST_ITEM_FIGURE}>{figure}</span>}\n <span className={cn(ACCOUNT_LIST_ITEM_CHECK, !checked && ACCOUNT_LIST_ITEM_CHECK_HIDDEN)} aria-hidden>\n <UiIcon name=\"check\" />\n </span>\n </button>\n {actions != null && <div className={ACCOUNT_LIST_ITEM_ACTIONS}>{actions}</div>}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -0,0 +1,114 @@
1
+ "use client";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import * as React from "react";
4
+ import { cn } from "../../lib/cn.js";
5
+ import { Avatar, AvatarFallback } from "../atomic/avatar.js";
6
+ import { Badge } from "../atomic/badge.js";
7
+ import {
8
+ DropdownMenuItem,
9
+ DropdownMenuRadioGroup,
10
+ DropdownMenuRadioItem,
11
+ DropdownMenuSeparator,
12
+ DropdownMenuSub,
13
+ DropdownMenuSubContent,
14
+ DropdownMenuSubTrigger
15
+ } from "../atomic/dropdown-menu.js";
16
+ import { Switch } from "../atomic/switch.js";
17
+ import { UiIcon } from "../../icons/ui-icons.js";
18
+ function ProfileTabs({
19
+ tabs,
20
+ value,
21
+ onChange,
22
+ label = "Sections"
23
+ }) {
24
+ const move = (e, index) => {
25
+ const step = e.key === "ArrowRight" ? 1 : e.key === "ArrowLeft" ? -1 : 0;
26
+ if (step === 0) return;
27
+ e.stopPropagation();
28
+ e.preventDefault();
29
+ const target = (index + step + tabs.length) % tabs.length;
30
+ const next = tabs[target];
31
+ if (!next) return;
32
+ onChange(next.id);
33
+ e.currentTarget.parentElement?.querySelectorAll('[role="menuitemradio"]')[target]?.focus();
34
+ };
35
+ return /* @__PURE__ */ jsx("div", { role: "group", "aria-label": label, "data-slot": "account-menu-tabs", className: "flex border-b border-border-subtle", children: tabs.map((t, i) => {
36
+ const selected = t.id === value;
37
+ return /* @__PURE__ */ jsx(
38
+ "button",
39
+ {
40
+ type: "button",
41
+ role: "menuitemradio",
42
+ "aria-checked": selected,
43
+ tabIndex: -1,
44
+ onClick: () => onChange(t.id),
45
+ onKeyDown: (e) => move(e, i),
46
+ className: cn(
47
+ "-mb-px h-8 flex-1 border-b px-3 text-body font-medium outline-none focus-visible:ring-2 focus-visible:ring-ring",
48
+ selected ? "border-primary text-ink" : "border-transparent text-ink-mid hover:text-ink"
49
+ ),
50
+ children: t.label
51
+ },
52
+ t.id
53
+ );
54
+ }) });
55
+ }
56
+ function ProfileCard({
57
+ name,
58
+ plan,
59
+ initials,
60
+ onOpen
61
+ }) {
62
+ const content = /* @__PURE__ */ jsxs(Fragment, { children: [
63
+ /* @__PURE__ */ jsx(Avatar, { className: "size-14 shrink-0 rounded-full", children: /* @__PURE__ */ jsx(AvatarFallback, { className: "font-serif text-h2 font-light text-ink", children: initials.slice(0, 1) }) }),
64
+ /* @__PURE__ */ jsxs("span", { className: "flex min-w-0 flex-1 flex-col gap-0.5", children: [
65
+ /* @__PURE__ */ jsx("span", { className: "truncate text-body font-medium text-ink", children: name }),
66
+ plan && /* @__PURE__ */ jsx("span", { className: "text-caption text-ink-soft", children: plan })
67
+ ] }),
68
+ onOpen && /* @__PURE__ */ jsx(UiIcon, { name: "chevron-right", className: "size-4 text-ink-soft" })
69
+ ] });
70
+ if (!onOpen) {
71
+ return /* @__PURE__ */ jsx("div", { "data-slot": "account-menu-card", className: "flex w-full items-center gap-2.5 p-2", children: content });
72
+ }
73
+ return /* @__PURE__ */ jsx(DropdownMenuItem, { "data-slot": "account-menu-card", className: "h-auto gap-2.5 p-2", onClick: onOpen, children: content });
74
+ }
75
+ function ProfileSettingRows({ profile }) {
76
+ const { language, darkTheme, colorTheme, icons } = profile;
77
+ if (!language && !darkTheme && !colorTheme) return null;
78
+ const currentColor = colorTheme?.options.find((o) => o.id === colorTheme.value)?.label;
79
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
80
+ /* @__PURE__ */ jsx(DropdownMenuSeparator, {}),
81
+ language && /* @__PURE__ */ jsxs(DropdownMenuItem, { onClick: () => language.onSelect?.(), children: [
82
+ icons?.language,
83
+ /* @__PURE__ */ jsx("span", { className: "flex-1", children: language.label }),
84
+ /* @__PURE__ */ jsx(Badge, { children: language.value })
85
+ ] }),
86
+ darkTheme && /* @__PURE__ */ jsxs(
87
+ DropdownMenuItem,
88
+ {
89
+ role: "menuitemcheckbox",
90
+ "aria-checked": darkTheme.checked,
91
+ onClick: () => darkTheme.onCheckedChange(!darkTheme.checked),
92
+ children: [
93
+ icons?.darkTheme,
94
+ /* @__PURE__ */ jsx("span", { className: "flex-1", children: darkTheme.label }),
95
+ /* @__PURE__ */ jsx(Switch, { checked: darkTheme.checked, tabIndex: -1, "aria-hidden": true, className: "pointer-events-none" })
96
+ ]
97
+ }
98
+ ),
99
+ colorTheme && /* @__PURE__ */ jsxs(DropdownMenuSub, { children: [
100
+ /* @__PURE__ */ jsxs(DropdownMenuSubTrigger, { children: [
101
+ icons?.colorTheme,
102
+ /* @__PURE__ */ jsx("span", { className: "flex-1", children: colorTheme.label }),
103
+ currentColor && /* @__PURE__ */ jsx("span", { className: "text-body-s text-ink-soft", children: currentColor })
104
+ ] }),
105
+ /* @__PURE__ */ jsx(DropdownMenuSubContent, { children: /* @__PURE__ */ jsx(DropdownMenuRadioGroup, { value: colorTheme.value, onValueChange: colorTheme.onValueChange, children: colorTheme.options.map((o) => /* @__PURE__ */ jsx(DropdownMenuRadioItem, { value: o.id, children: o.label }, o.id)) }) })
106
+ ] })
107
+ ] });
108
+ }
109
+ export {
110
+ ProfileCard,
111
+ ProfileSettingRows,
112
+ ProfileTabs
113
+ };
114
+ //# sourceMappingURL=account-menu-profile.js.map