@evinvest/uikit 0.31.0 → 0.33.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 (485) hide show
  1. package/README.md +23 -12
  2. package/dist/components/{accordion.js → atomic/accordion.js} +5 -4
  3. package/dist/components/atomic/accordion.js.map +1 -0
  4. package/dist/components/{alert-dialog.js → atomic/alert-dialog.js} +9 -9
  5. package/dist/components/atomic/alert-dialog.js.map +1 -0
  6. package/dist/components/{alert.js → atomic/alert.js} +6 -6
  7. package/dist/components/atomic/alert.js.map +1 -0
  8. package/dist/components/{animated-number-columns.js → atomic/animated-number-columns.js} +1 -1
  9. package/dist/components/atomic/animated-number-columns.js.map +1 -0
  10. package/dist/components/{avatar.js → atomic/avatar.js} +2 -2
  11. package/dist/components/atomic/avatar.js.map +1 -0
  12. package/dist/components/atomic/badge.js +26 -0
  13. package/dist/components/atomic/badge.js.map +1 -0
  14. package/dist/components/{band.js → atomic/band.js} +2 -2
  15. package/dist/components/atomic/band.js.map +1 -0
  16. package/dist/components/{breadcrumb.js → atomic/breadcrumb.js} +10 -12
  17. package/dist/components/atomic/breadcrumb.js.map +1 -0
  18. package/dist/components/{button-group.js → atomic/button-group.js} +3 -3
  19. package/dist/components/atomic/button-group.js.map +1 -0
  20. package/dist/components/{button.js → atomic/button.js} +8 -7
  21. package/dist/components/atomic/button.js.map +1 -0
  22. package/dist/components/{calendar.js → atomic/calendar.js} +12 -27
  23. package/dist/components/atomic/calendar.js.map +1 -0
  24. package/dist/components/{card.js → atomic/card.js} +2 -2
  25. package/dist/components/atomic/card.js.map +1 -0
  26. package/dist/components/{checkbox.js → atomic/checkbox.js} +6 -5
  27. package/dist/components/atomic/checkbox.js.map +1 -0
  28. package/dist/components/{collapsible.js → atomic/collapsible.js} +1 -1
  29. package/dist/components/atomic/collapsible.js.map +1 -0
  30. package/dist/components/{command.js → atomic/command.js} +11 -26
  31. package/dist/components/atomic/command.js.map +1 -0
  32. package/dist/components/{container.js → atomic/container.js} +2 -2
  33. package/dist/components/atomic/container.js.map +1 -0
  34. package/dist/components/{context-menu.js → atomic/context-menu.js} +15 -22
  35. package/dist/components/atomic/context-menu.js.map +1 -0
  36. package/dist/components/{dialog.js → atomic/dialog.js} +13 -11
  37. package/dist/components/atomic/dialog.js.map +1 -0
  38. package/dist/components/{drawer.js → atomic/drawer.js} +8 -8
  39. package/dist/components/atomic/drawer.js.map +1 -0
  40. package/dist/components/{dropdown-menu.js → atomic/dropdown-menu.js} +16 -24
  41. package/dist/components/atomic/dropdown-menu.js.map +1 -0
  42. package/dist/components/{empty.js → atomic/empty.js} +2 -2
  43. package/dist/components/atomic/empty.js.map +1 -0
  44. package/dist/components/atomic/field-context.js.map +1 -0
  45. package/dist/components/{form-row.js → atomic/form-row.js} +2 -2
  46. package/dist/components/atomic/form-row.js.map +1 -0
  47. package/dist/components/{hover-card.js → atomic/hover-card.js} +8 -8
  48. package/dist/components/atomic/hover-card.js.map +1 -0
  49. package/dist/components/{info-tip.js → atomic/info-tip.js} +18 -19
  50. package/dist/components/atomic/info-tip.js.map +1 -0
  51. package/dist/components/{input-otp.js → atomic/input-otp.js} +5 -4
  52. package/dist/components/atomic/input-otp.js.map +1 -0
  53. package/dist/components/{input.js → atomic/input.js} +3 -3
  54. package/dist/components/atomic/input.js.map +1 -0
  55. package/dist/components/{kbd.js → atomic/kbd.js} +2 -2
  56. package/dist/components/atomic/kbd.js.map +1 -0
  57. package/dist/components/{key-value.js → atomic/key-value.js} +8 -7
  58. package/dist/components/atomic/key-value.js.map +1 -0
  59. package/dist/components/{label.js → atomic/label.js} +2 -2
  60. package/dist/components/atomic/label.js.map +1 -0
  61. package/dist/components/{menubar.js → atomic/menubar.js} +16 -27
  62. package/dist/components/atomic/menubar.js.map +1 -0
  63. package/dist/components/{native-select.js → atomic/native-select.js} +5 -5
  64. package/dist/components/atomic/native-select.js.map +1 -0
  65. package/dist/components/{navigation-menu.js → atomic/navigation-menu.js} +12 -20
  66. package/dist/components/atomic/navigation-menu.js.map +1 -0
  67. package/dist/components/{pagination.js → atomic/pagination.js} +19 -20
  68. package/dist/components/atomic/pagination.js.map +1 -0
  69. package/dist/components/{popover.js → atomic/popover.js} +10 -10
  70. package/dist/components/atomic/popover.js.map +1 -0
  71. package/dist/components/{progress.js → atomic/progress.js} +2 -2
  72. package/dist/components/atomic/progress.js.map +1 -0
  73. package/dist/components/{radio-group.js → atomic/radio-group.js} +8 -7
  74. package/dist/components/atomic/radio-group.js.map +1 -0
  75. package/dist/components/{scroll-area.js → atomic/scroll-area.js} +2 -2
  76. package/dist/components/atomic/scroll-area.js.map +1 -0
  77. package/dist/components/{section-descriptor.js → atomic/section-descriptor.js} +7 -10
  78. package/dist/components/atomic/section-descriptor.js.map +1 -0
  79. package/dist/components/{select-listbox.js → atomic/select-listbox.js} +3 -3
  80. package/dist/components/atomic/select-listbox.js.map +1 -0
  81. package/dist/components/{select.js → atomic/select.js} +15 -23
  82. package/dist/components/atomic/select.js.map +1 -0
  83. package/dist/components/{separator.js → atomic/separator.js} +2 -2
  84. package/dist/components/atomic/separator.js.map +1 -0
  85. package/dist/components/{sheet.js → atomic/sheet.js} +13 -11
  86. package/dist/components/atomic/sheet.js.map +1 -0
  87. package/dist/components/{sidebar.js → atomic/sidebar.js} +11 -30
  88. package/dist/components/atomic/sidebar.js.map +1 -0
  89. package/dist/components/{skeleton.js → atomic/skeleton.js} +2 -2
  90. package/dist/components/atomic/skeleton.js.map +1 -0
  91. package/dist/components/{slider.js → atomic/slider.js} +3 -3
  92. package/dist/components/atomic/slider.js.map +1 -0
  93. package/dist/components/{sonner.js → atomic/sonner.js} +22 -20
  94. package/dist/components/atomic/sonner.js.map +1 -0
  95. package/dist/components/atomic/spinner.js +26 -0
  96. package/dist/components/atomic/spinner.js.map +1 -0
  97. package/dist/components/{status-item.js → atomic/status-item.js} +2 -2
  98. package/dist/components/atomic/status-item.js.map +1 -0
  99. package/dist/components/{switch.js → atomic/switch.js} +4 -4
  100. package/dist/components/atomic/switch.js.map +1 -0
  101. package/dist/components/{table.js → atomic/table.js} +2 -2
  102. package/dist/components/atomic/table.js.map +1 -0
  103. package/dist/components/{tabs.js → atomic/tabs.js} +4 -4
  104. package/dist/components/atomic/tabs.js.map +1 -0
  105. package/dist/components/{textarea.js → atomic/textarea.js} +3 -3
  106. package/dist/components/atomic/textarea.js.map +1 -0
  107. package/dist/components/{toggle-group.js → atomic/toggle-group.js} +4 -4
  108. package/dist/components/atomic/toggle-group.js.map +1 -0
  109. package/dist/components/{toggle.js → atomic/toggle.js} +5 -8
  110. package/dist/components/atomic/toggle.js.map +1 -0
  111. package/dist/components/{tooltip.js → atomic/tooltip.js} +8 -8
  112. package/dist/components/atomic/tooltip.js.map +1 -0
  113. package/dist/components/{use-count-tween.js → atomic/use-count-tween.js} +1 -1
  114. package/dist/components/atomic/use-count-tween.js.map +1 -0
  115. package/dist/components/{animated-number.js → derived/animated-number.js} +5 -5
  116. package/dist/components/derived/animated-number.js.map +1 -0
  117. package/dist/components/{carousel.js → derived/carousel.js} +10 -10
  118. package/dist/components/derived/carousel.js.map +1 -0
  119. package/dist/components/{command-palette.js → derived/command-palette.js} +14 -13
  120. package/dist/components/derived/command-palette.js.map +1 -0
  121. package/dist/components/{confirm-dialog.js → derived/confirm-dialog.js} +15 -20
  122. package/dist/components/derived/confirm-dialog.js.map +1 -0
  123. package/dist/components/{date-time-picker.js → derived/date-time-picker.js} +18 -22
  124. package/dist/components/derived/date-time-picker.js.map +1 -0
  125. package/dist/components/{field.js → derived/field.js} +6 -6
  126. package/dist/components/derived/field.js.map +1 -0
  127. package/dist/components/{form.js → derived/form.js} +4 -5
  128. package/dist/components/derived/form.js.map +1 -0
  129. package/dist/components/{icon-button.js → derived/icon-button.js} +4 -4
  130. package/dist/components/derived/icon-button.js.map +1 -0
  131. package/dist/components/{input-group.js → derived/input-group.js} +5 -5
  132. package/dist/components/derived/input-group.js.map +1 -0
  133. package/dist/components/{item.js → derived/item.js} +4 -5
  134. package/dist/components/derived/item.js.map +1 -0
  135. package/dist/components/{popover-form.js → derived/popover-form.js} +9 -8
  136. package/dist/components/derived/popover-form.js.map +1 -0
  137. package/dist/components/{settings.js → derived/settings.js} +7 -7
  138. package/dist/components/derived/settings.js.map +1 -0
  139. package/dist/components/{account-list.js → shell/account-list.js} +5 -5
  140. package/dist/components/shell/account-list.js.map +1 -0
  141. package/dist/components/{account-menu-profile.js → shell/account-menu-profile.js} +7 -7
  142. package/dist/components/shell/account-menu-profile.js.map +1 -0
  143. package/dist/components/{account-menu.js → shell/account-menu.js} +4 -4
  144. package/dist/components/shell/account-menu.js.map +1 -0
  145. package/dist/components/{account-settings-dialog.js → shell/account-settings-dialog.js} +9 -8
  146. package/dist/components/shell/account-settings-dialog.js.map +1 -0
  147. package/dist/components/{app-shell.js → shell/app-shell.js} +1 -1
  148. package/dist/components/shell/app-shell.js.map +1 -0
  149. package/dist/components/{aside.js → shell/aside.js} +12 -10
  150. package/dist/components/shell/aside.js.map +1 -0
  151. package/dist/components/{auth-wall.js → shell/auth-wall.js} +4 -6
  152. package/dist/components/shell/auth-wall.js.map +1 -0
  153. package/dist/components/{bottom-tab-bar.js → shell/bottom-tab-bar.js} +4 -4
  154. package/dist/components/shell/bottom-tab-bar.js.map +1 -0
  155. package/dist/components/{chat-composer.js → shell/chat-composer.js} +16 -14
  156. package/dist/components/shell/chat-composer.js.map +1 -0
  157. package/dist/components/{chat-message.js → shell/chat-message.js} +4 -4
  158. package/dist/components/shell/chat-message.js.map +1 -0
  159. package/dist/components/{chat-panel.js → shell/chat-panel.js} +3 -3
  160. package/dist/components/shell/chat-panel.js.map +1 -0
  161. package/dist/components/shell/chat-stream-text.js.map +1 -0
  162. package/dist/components/{chat-typing.js → shell/chat-typing.js} +4 -3
  163. package/dist/components/shell/chat-typing.js.map +1 -0
  164. package/dist/components/{footer.js → shell/footer.js} +27 -25
  165. package/dist/components/shell/footer.js.map +1 -0
  166. package/dist/components/{header-controls.js → shell/header-controls.js} +25 -23
  167. package/dist/components/shell/header-controls.js.map +1 -0
  168. package/dist/components/shell/hotbar.js +158 -0
  169. package/dist/components/shell/hotbar.js.map +1 -0
  170. package/dist/components/{list-rows.js → shell/list-rows.js} +1 -1
  171. package/dist/components/shell/list-rows.js.map +1 -0
  172. package/dist/components/{logo.js → shell/logo.js} +4 -3
  173. package/dist/components/shell/logo.js.map +1 -0
  174. package/dist/components/{mobile-app-bar.js → shell/mobile-app-bar.js} +5 -5
  175. package/dist/components/shell/mobile-app-bar.js.map +1 -0
  176. package/dist/components/{nav-badge.js → shell/nav-badge.js} +1 -1
  177. package/dist/components/shell/nav-badge.js.map +1 -0
  178. package/dist/components/{nav-collapse.js → shell/nav-collapse.js} +8 -7
  179. package/dist/components/shell/nav-collapse.js.map +1 -0
  180. package/dist/components/shell/nav-link.js.map +1 -0
  181. package/dist/components/shell/nav-model.js.map +1 -0
  182. package/dist/components/{page-frame.js → shell/page-frame.js} +2 -2
  183. package/dist/components/shell/page-frame.js.map +1 -0
  184. package/dist/components/{resource-error.js → shell/resource-error.js} +5 -5
  185. package/dist/components/shell/resource-error.js.map +1 -0
  186. package/dist/components/{section-nav.js → shell/section-nav.js} +4 -4
  187. package/dist/components/shell/section-nav.js.map +1 -0
  188. package/dist/components/shell/settled.js.map +1 -0
  189. package/dist/components/shell/shell-icons.js +42 -0
  190. package/dist/components/shell/shell-icons.js.map +1 -0
  191. package/dist/components/{shell-nav.js → shell/shell-nav.js} +5 -5
  192. package/dist/components/shell/shell-nav.js.map +1 -0
  193. package/dist/components/{smart-header.js → shell/smart-header.js} +2 -2
  194. package/dist/components/shell/smart-header.js.map +1 -0
  195. package/dist/components/shell/status-screen.js +145 -0
  196. package/dist/components/shell/status-screen.js.map +1 -0
  197. package/dist/components/{system-banner.js → shell/system-banner.js} +8 -8
  198. package/dist/components/shell/system-banner.js.map +1 -0
  199. package/dist/components/{top-bar.js → shell/top-bar.js} +2 -2
  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/{workspace-tab.js → shell/workspace-tab.js} +6 -5
  203. package/dist/components/shell/workspace-tab.js.map +1 -0
  204. package/dist/generated/accent.js +10 -10
  205. package/dist/generated/accent.js.map +1 -1
  206. package/dist/generated/accordion.js +6 -2
  207. package/dist/generated/accordion.js.map +1 -1
  208. package/dist/generated/account-list.js +4 -4
  209. package/dist/generated/account-list.js.map +1 -1
  210. package/dist/generated/account-settings-dialog.js +6 -2
  211. package/dist/generated/account-settings-dialog.js.map +1 -1
  212. package/dist/generated/alert-dialog.js +1 -1
  213. package/dist/generated/alert-dialog.js.map +1 -1
  214. package/dist/generated/alert.js +3 -10
  215. package/dist/generated/alert.js.map +1 -1
  216. package/dist/generated/aside.js +7 -0
  217. package/dist/generated/aside.js.map +1 -1
  218. package/dist/generated/badge.js +2 -11
  219. package/dist/generated/badge.js.map +1 -1
  220. package/dist/generated/band.js +10 -10
  221. package/dist/generated/band.js.map +1 -1
  222. package/dist/generated/breadcrumb.js +1 -1
  223. package/dist/generated/breadcrumb.js.map +1 -1
  224. package/dist/generated/button-group.js +3 -3
  225. package/dist/generated/button-group.js.map +1 -1
  226. package/dist/generated/button.js +4 -20
  227. package/dist/generated/button.js.map +1 -1
  228. package/dist/generated/calendar.js +5 -5
  229. package/dist/generated/calendar.js.map +1 -1
  230. package/dist/generated/card.js +1 -1
  231. package/dist/generated/card.js.map +1 -1
  232. package/dist/generated/carousel.js +1 -1
  233. package/dist/generated/carousel.js.map +1 -1
  234. package/dist/generated/chat-composer.js +9 -2
  235. package/dist/generated/chat-composer.js.map +1 -1
  236. package/dist/generated/chat-message.js +25 -19
  237. package/dist/generated/chat-message.js.map +1 -1
  238. package/dist/generated/checkbox.js +1 -1
  239. package/dist/generated/checkbox.js.map +1 -1
  240. package/dist/generated/command-palette.js +10 -1
  241. package/dist/generated/command-palette.js.map +1 -1
  242. package/dist/generated/command.js +8 -6
  243. package/dist/generated/command.js.map +1 -1
  244. package/dist/generated/confirm-dialog.js +8 -8
  245. package/dist/generated/confirm-dialog.js.map +1 -1
  246. package/dist/generated/context-menu.js +7 -5
  247. package/dist/generated/context-menu.js.map +1 -1
  248. package/dist/generated/copy.js +97 -0
  249. package/dist/generated/copy.js.map +1 -0
  250. package/dist/generated/date-time-picker.js +10 -0
  251. package/dist/generated/date-time-picker.js.map +1 -1
  252. package/dist/generated/dialog.js +2 -2
  253. package/dist/generated/dialog.js.map +1 -1
  254. package/dist/generated/drawer.js +6 -6
  255. package/dist/generated/drawer.js.map +1 -1
  256. package/dist/generated/dropdown-menu.js +7 -5
  257. package/dist/generated/dropdown-menu.js.map +1 -1
  258. package/dist/generated/empty.js +5 -5
  259. package/dist/generated/empty.js.map +1 -1
  260. package/dist/generated/field.js +9 -7
  261. package/dist/generated/field.js.map +1 -1
  262. package/dist/generated/footer.js +45 -0
  263. package/dist/generated/footer.js.map +1 -0
  264. package/dist/generated/header-controls.js +5 -10
  265. package/dist/generated/header-controls.js.map +1 -1
  266. package/dist/generated/hover-card.js +1 -1
  267. package/dist/generated/hover-card.js.map +1 -1
  268. package/dist/generated/icon-button.js +4 -2
  269. package/dist/generated/icon-button.js.map +1 -1
  270. package/dist/generated/icons.js +36 -0
  271. package/dist/generated/icons.js.map +1 -0
  272. package/dist/generated/info-tip.js +5 -0
  273. package/dist/generated/info-tip.js.map +1 -0
  274. package/dist/generated/input-group.js +10 -10
  275. package/dist/generated/input-group.js.map +1 -1
  276. package/dist/generated/input-otp.js +2 -2
  277. package/dist/generated/input-otp.js.map +1 -1
  278. package/dist/generated/input.js +4 -4
  279. package/dist/generated/input.js.map +1 -1
  280. package/dist/generated/item.js +11 -11
  281. package/dist/generated/item.js.map +1 -1
  282. package/dist/generated/kbd.js +1 -1
  283. package/dist/generated/kbd.js.map +1 -1
  284. package/dist/generated/key-value.js +7 -1
  285. package/dist/generated/key-value.js.map +1 -1
  286. package/dist/generated/label.js +1 -1
  287. package/dist/generated/label.js.map +1 -1
  288. package/dist/generated/logo.js +9 -0
  289. package/dist/generated/logo.js.map +1 -0
  290. package/dist/generated/menu.js +7 -0
  291. package/dist/generated/menu.js.map +1 -0
  292. package/dist/generated/menubar.js +10 -8
  293. package/dist/generated/menubar.js.map +1 -1
  294. package/dist/generated/navigation-menu.js +11 -5
  295. package/dist/generated/navigation-menu.js.map +1 -1
  296. package/dist/generated/orientation.js +5 -0
  297. package/dist/generated/orientation.js.map +1 -0
  298. package/dist/generated/pagination.js +15 -0
  299. package/dist/generated/pagination.js.map +1 -0
  300. package/dist/generated/popover-form.js +5 -0
  301. package/dist/generated/popover-form.js.map +1 -1
  302. package/dist/generated/popover.js +1 -1
  303. package/dist/generated/popover.js.map +1 -1
  304. package/dist/generated/primitives.js +7 -0
  305. package/dist/generated/primitives.js.map +1 -0
  306. package/dist/generated/radio-group.js +5 -1
  307. package/dist/generated/radio-group.js.map +1 -1
  308. package/dist/generated/section-descriptor.js +7 -0
  309. package/dist/generated/section-descriptor.js.map +1 -0
  310. package/dist/generated/select.js +16 -10
  311. package/dist/generated/select.js.map +1 -1
  312. package/dist/generated/settings.js +2 -7
  313. package/dist/generated/settings.js.map +1 -1
  314. package/dist/generated/sheet.js +1 -1
  315. package/dist/generated/sheet.js.map +1 -1
  316. package/dist/generated/sidebar.js +24 -12
  317. package/dist/generated/sidebar.js.map +1 -1
  318. package/dist/generated/size.js +12 -0
  319. package/dist/generated/size.js.map +1 -0
  320. package/dist/generated/skeleton.js +1 -1
  321. package/dist/generated/skeleton.js.map +1 -1
  322. package/dist/generated/slider.js +2 -2
  323. package/dist/generated/slider.js.map +1 -1
  324. package/dist/generated/slot.js +5 -0
  325. package/dist/generated/slot.js.map +1 -0
  326. package/dist/generated/smart-header.js +2 -0
  327. package/dist/generated/smart-header.js.map +1 -1
  328. package/dist/generated/sonner.js +11 -13
  329. package/dist/generated/sonner.js.map +1 -1
  330. package/dist/generated/spinner.js +5 -0
  331. package/dist/generated/spinner.js.map +1 -0
  332. package/dist/generated/status-screen.js +27 -0
  333. package/dist/generated/status-screen.js.map +1 -0
  334. package/dist/generated/switch.js +2 -2
  335. package/dist/generated/switch.js.map +1 -1
  336. package/dist/generated/system-banner.js +6 -16
  337. package/dist/generated/system-banner.js.map +1 -1
  338. package/dist/generated/table.js +9 -9
  339. package/dist/generated/table.js.map +1 -1
  340. package/dist/generated/tabs.js +2 -2
  341. package/dist/generated/tabs.js.map +1 -1
  342. package/dist/generated/textarea.js +1 -1
  343. package/dist/generated/textarea.js.map +1 -1
  344. package/dist/generated/toggle-group.js +9 -0
  345. package/dist/generated/toggle-group.js.map +1 -0
  346. package/dist/generated/toggle.js +1 -9
  347. package/dist/generated/toggle.js.map +1 -1
  348. package/dist/generated/tone.js +12 -0
  349. package/dist/generated/tone.js.map +1 -0
  350. package/dist/generated/tooltip.js +1 -1
  351. package/dist/generated/tooltip.js.map +1 -1
  352. package/dist/generated/workspace-tab.js +3 -3
  353. package/dist/generated/workspace-tab.js.map +1 -1
  354. package/dist/icons/icon-shapes.js +10 -0
  355. package/dist/icons/icon-shapes.js.map +1 -0
  356. package/dist/{components → icons}/select-chevron.js +2 -1
  357. package/dist/icons/select-chevron.js.map +1 -0
  358. package/dist/icons/ui-icons.js +23 -0
  359. package/dist/icons/ui-icons.js.map +1 -0
  360. package/dist/index.d.ts +203 -155
  361. package/dist/index.js +97 -96
  362. package/dist/lib/cn.js +1 -0
  363. package/dist/lib/cn.js.map +1 -1
  364. package/dist/primitives/use-floating.js.map +1 -1
  365. package/dist/primitives/use-roving-focus.js.map +1 -1
  366. package/package.json +2 -2
  367. package/styles/ev.css +13 -76
  368. package/styles/theme.css +133 -66
  369. package/styles/tokens.css +157 -149
  370. package/dist/components/accordion.js.map +0 -1
  371. package/dist/components/account-list.js.map +0 -1
  372. package/dist/components/account-menu-profile.js.map +0 -1
  373. package/dist/components/account-menu.js.map +0 -1
  374. package/dist/components/account-settings-dialog.js.map +0 -1
  375. package/dist/components/alert-dialog.js.map +0 -1
  376. package/dist/components/alert.js.map +0 -1
  377. package/dist/components/animated-number-columns.js.map +0 -1
  378. package/dist/components/animated-number.js.map +0 -1
  379. package/dist/components/app-shell.js.map +0 -1
  380. package/dist/components/aside.js.map +0 -1
  381. package/dist/components/auth-wall.js.map +0 -1
  382. package/dist/components/avatar.js.map +0 -1
  383. package/dist/components/badge.js +0 -25
  384. package/dist/components/badge.js.map +0 -1
  385. package/dist/components/band.js.map +0 -1
  386. package/dist/components/bottom-tab-bar.js.map +0 -1
  387. package/dist/components/breadcrumb.js.map +0 -1
  388. package/dist/components/button-group.js.map +0 -1
  389. package/dist/components/button.js.map +0 -1
  390. package/dist/components/calendar.js.map +0 -1
  391. package/dist/components/card.js.map +0 -1
  392. package/dist/components/carousel.js.map +0 -1
  393. package/dist/components/chat-composer.js.map +0 -1
  394. package/dist/components/chat-message.js.map +0 -1
  395. package/dist/components/chat-panel.js.map +0 -1
  396. package/dist/components/chat-stream-text.js.map +0 -1
  397. package/dist/components/chat-typing.js.map +0 -1
  398. package/dist/components/checkbox.js.map +0 -1
  399. package/dist/components/collapsible.js.map +0 -1
  400. package/dist/components/command-palette.js.map +0 -1
  401. package/dist/components/command.js.map +0 -1
  402. package/dist/components/confirm-dialog.js.map +0 -1
  403. package/dist/components/container.js.map +0 -1
  404. package/dist/components/context-menu.js.map +0 -1
  405. package/dist/components/date-time-picker.js.map +0 -1
  406. package/dist/components/dialog.js.map +0 -1
  407. package/dist/components/drawer.js.map +0 -1
  408. package/dist/components/dropdown-menu.js.map +0 -1
  409. package/dist/components/empty.js.map +0 -1
  410. package/dist/components/field-context.js.map +0 -1
  411. package/dist/components/field.js.map +0 -1
  412. package/dist/components/footer.js.map +0 -1
  413. package/dist/components/form-row.js.map +0 -1
  414. package/dist/components/form.js.map +0 -1
  415. package/dist/components/header-controls.js.map +0 -1
  416. package/dist/components/hover-card.js.map +0 -1
  417. package/dist/components/icon-button.js.map +0 -1
  418. package/dist/components/info-tip.js.map +0 -1
  419. package/dist/components/input-group.js.map +0 -1
  420. package/dist/components/input-otp.js.map +0 -1
  421. package/dist/components/input.js.map +0 -1
  422. package/dist/components/item.js.map +0 -1
  423. package/dist/components/kbd.js.map +0 -1
  424. package/dist/components/key-value.js.map +0 -1
  425. package/dist/components/label.js.map +0 -1
  426. package/dist/components/list-rows.js.map +0 -1
  427. package/dist/components/logo.js.map +0 -1
  428. package/dist/components/menubar.js.map +0 -1
  429. package/dist/components/mobile-app-bar.js.map +0 -1
  430. package/dist/components/native-select.js.map +0 -1
  431. package/dist/components/nav-badge.js.map +0 -1
  432. package/dist/components/nav-collapse.js.map +0 -1
  433. package/dist/components/nav-link.js.map +0 -1
  434. package/dist/components/nav-model.js.map +0 -1
  435. package/dist/components/navigation-menu.js.map +0 -1
  436. package/dist/components/page-frame.js.map +0 -1
  437. package/dist/components/pagination.js.map +0 -1
  438. package/dist/components/popover-form.js.map +0 -1
  439. package/dist/components/popover.js.map +0 -1
  440. package/dist/components/progress.js.map +0 -1
  441. package/dist/components/radio-group.js.map +0 -1
  442. package/dist/components/resource-error.js.map +0 -1
  443. package/dist/components/scroll-area.js.map +0 -1
  444. package/dist/components/section-descriptor.js.map +0 -1
  445. package/dist/components/section-nav.js.map +0 -1
  446. package/dist/components/select-chevron.js.map +0 -1
  447. package/dist/components/select-listbox.js.map +0 -1
  448. package/dist/components/select.js.map +0 -1
  449. package/dist/components/separator.js.map +0 -1
  450. package/dist/components/settings.js.map +0 -1
  451. package/dist/components/settled.js.map +0 -1
  452. package/dist/components/sheet.js.map +0 -1
  453. package/dist/components/shell-icons.js +0 -57
  454. package/dist/components/shell-icons.js.map +0 -1
  455. package/dist/components/shell-nav.js.map +0 -1
  456. package/dist/components/sidebar.js.map +0 -1
  457. package/dist/components/skeleton.js.map +0 -1
  458. package/dist/components/slider.js.map +0 -1
  459. package/dist/components/smart-header.js.map +0 -1
  460. package/dist/components/sonner.js.map +0 -1
  461. package/dist/components/spinner.js +0 -23
  462. package/dist/components/spinner.js.map +0 -1
  463. package/dist/components/status-item.js.map +0 -1
  464. package/dist/components/status-screen.js +0 -145
  465. package/dist/components/status-screen.js.map +0 -1
  466. package/dist/components/switch.js.map +0 -1
  467. package/dist/components/system-banner.js.map +0 -1
  468. package/dist/components/table.js.map +0 -1
  469. package/dist/components/tabs.js.map +0 -1
  470. package/dist/components/textarea.js.map +0 -1
  471. package/dist/components/toggle-group.js.map +0 -1
  472. package/dist/components/toggle.js.map +0 -1
  473. package/dist/components/tooltip.js.map +0 -1
  474. package/dist/components/top-bar.js.map +0 -1
  475. package/dist/components/ui-icons.js +0 -77
  476. package/dist/components/ui-icons.js.map +0 -1
  477. package/dist/components/use-count-tween.js.map +0 -1
  478. package/dist/components/use-shell-nav.js.map +0 -1
  479. package/dist/components/workspace-tab.js.map +0 -1
  480. /package/dist/components/{field-context.js → atomic/field-context.js} +0 -0
  481. /package/dist/components/{chat-stream-text.js → shell/chat-stream-text.js} +0 -0
  482. /package/dist/components/{nav-link.js → shell/nav-link.js} +0 -0
  483. /package/dist/components/{nav-model.js → shell/nav-model.js} +0 -0
  484. /package/dist/components/{settled.js → shell/settled.js} +0 -0
  485. /package/dist/components/{use-shell-nav.js → shell/use-shell-nav.js} +0 -0
@@ -1,27 +1,23 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
- import { cn } from "../lib/cn.js";
5
- import { focusCandidates } from "../primitives/focus-scope.js";
6
- import { useControllableState } from "../primitives/use-controllable-state.js";
7
- import { buttonVariants } from "./button.js";
8
- import { Calendar } from "./calendar.js";
9
- import { Input } from "./input.js";
10
- import { Popover, PopoverContent, PopoverTrigger } from "./popover.js";
4
+ import { cn } from "../../lib/cn.js";
5
+ import { focusCandidates } from "../../primitives/focus-scope.js";
6
+ import { useControllableState } from "../../primitives/use-controllable-state.js";
7
+ import { buttonVariants } from "../atomic/button.js";
8
+ import { Calendar } from "../atomic/calendar.js";
9
+ import { Input } from "../atomic/input.js";
10
+ import { Popover, PopoverContent, PopoverTrigger } from "../atomic/popover.js";
11
11
  import {
12
12
  DATE_TIME_PICKER_CLEAR,
13
13
  DATE_TIME_PICKER_CONTENT,
14
14
  DATE_TIME_PICKER_TIME,
15
15
  DATE_TIME_PICKER_TIME_INPUT,
16
16
  DATE_TIME_PICKER_TIME_SEPARATOR,
17
- DATE_TIME_PICKER_TRIGGER
18
- } from "../generated/date-time-picker.js";
19
- const CALENDAR_ICON = [
20
- "M8 2v4",
21
- "M16 2v4",
22
- "M3 10h18",
23
- "M5 4h14a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V6a2 2 0 0 1 2-2z"
24
- ];
17
+ DATE_TIME_PICKER_TRIGGER,
18
+ DATE_TIME_PICKER_LABELS
19
+ } from "../../generated/date-time-picker.js";
20
+ import { iconShapes } from "../../icons/icon-shapes.js";
25
21
  function CalendarIcon() {
26
22
  return /* @__PURE__ */ jsx(
27
23
  "svg",
@@ -37,7 +33,7 @@ function CalendarIcon() {
37
33
  strokeLinecap: "round",
38
34
  strokeLinejoin: "round",
39
35
  "aria-hidden": true,
40
- children: CALENDAR_ICON.map((d) => /* @__PURE__ */ jsx("path", { d }, d))
36
+ children: iconShapes("calendar")
41
37
  }
42
38
  );
43
39
  }
@@ -56,7 +52,7 @@ function XIcon() {
56
52
  strokeLinecap: "round",
57
53
  strokeLinejoin: "round",
58
54
  "aria-hidden": true,
59
- children: /* @__PURE__ */ jsx("path", { d: "M18 6 6 18M6 6l12 12" })
55
+ children: iconShapes("x")
60
56
  }
61
57
  );
62
58
  }
@@ -214,7 +210,7 @@ function DateTimePicker({
214
210
  {
215
211
  "data-slot": "date-time-picker-content",
216
212
  role: "dialog",
217
- "aria-label": labels.dialog ?? "Choose date and time",
213
+ "aria-label": labels.dialog ?? DATE_TIME_PICKER_LABELS.dialog,
218
214
  align,
219
215
  onBlur: onContentBlur,
220
216
  onKeyDown: onContentKeyDown,
@@ -245,7 +241,7 @@ function DateTimePicker({
245
241
  className: DATE_TIME_PICKER_TIME_INPUT,
246
242
  ref: hoursRef,
247
243
  "data-slot": "date-time-picker-hours",
248
- "aria-label": labels.hours ?? "Hours",
244
+ "aria-label": labels.hours ?? DATE_TIME_PICKER_LABELS.hours,
249
245
  value: pad(value?.getHours() ?? 0),
250
246
  disabled,
251
247
  onChange: onHours
@@ -260,7 +256,7 @@ function DateTimePicker({
260
256
  onFocus: selectAll,
261
257
  className: DATE_TIME_PICKER_TIME_INPUT,
262
258
  "data-slot": "date-time-picker-minutes",
263
- "aria-label": labels.minutes ?? "Minutes",
259
+ "aria-label": labels.minutes ?? DATE_TIME_PICKER_LABELS.minutes,
264
260
  value: pad(value?.getMinutes() ?? 0),
265
261
  disabled,
266
262
  onChange: onMinutes
@@ -274,7 +270,7 @@ function DateTimePicker({
274
270
  "data-slot": "date-time-picker-clear",
275
271
  disabled,
276
272
  onClick: onClear,
277
- children: labels.clear ?? "Clear"
273
+ children: labels.clear ?? DATE_TIME_PICKER_LABELS.clear
278
274
  }
279
275
  ),
280
276
  /* @__PURE__ */ jsx(
@@ -283,7 +279,7 @@ function DateTimePicker({
283
279
  type: "button",
284
280
  className: buttonVariants({ variant: "ghost", size: "sm", icon: true }),
285
281
  "data-slot": "date-time-picker-close",
286
- "aria-label": labels.close ?? "Close",
282
+ "aria-label": labels.close ?? DATE_TIME_PICKER_LABELS.close,
287
283
  disabled,
288
284
  onClick: () => setOpen(false),
289
285
  children: /* @__PURE__ */ jsx(XIcon, {})
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/derived/date-time-picker.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { focusCandidates } from \"../../primitives/focus-scope\";\nimport { useControllableState } from \"../../primitives/use-controllable-state\";\nimport { buttonVariants } from \"../atomic/button\";\nimport { Calendar } from \"../atomic/calendar\";\nimport { Input } from \"../atomic/input\";\nimport { Popover, PopoverContent, PopoverTrigger } from \"../atomic/popover\";\nimport {\n DATE_TIME_PICKER_CLEAR,\n DATE_TIME_PICKER_CONTENT,\n DATE_TIME_PICKER_TIME,\n DATE_TIME_PICKER_TIME_INPUT,\n DATE_TIME_PICKER_TIME_SEPARATOR,\n DATE_TIME_PICKER_TRIGGER,\n DATE_TIME_PICKER_LABELS,\n} from \"../../generated/date-time-picker\";\nimport { iconShapes } from \"../../icons/icon-shapes\";\n\nfunction CalendarIcon() {\n return (\n <svg\n className=\"size-4\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n {iconShapes(\"calendar\")}\n </svg>\n );\n}\n\nfunction XIcon() {\n return (\n <svg\n className=\"size-4\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n {iconShapes(\"x\")}\n </svg>\n );\n}\n\nconst pad = (n: number): string => String(n).padStart(2, \"0\");\n\n// The value always carries whole minutes: seconds/ms are dropped on every write.\nfunction atMinute(d: Date): Date {\n return new Date(d.getFullYear(), d.getMonth(), d.getDate(), d.getHours(), d.getMinutes());\n}\n\n/** Inclusive clamp at minute precision. */\nfunction clampMoment(d: Date, min: Date | undefined, max: Date | undefined): Date {\n const lo = min && atMinute(min);\n const hi = max && atMinute(max);\n if (lo && d.getTime() < lo.getTime()) return lo;\n if (hi && d.getTime() > hi.getTime()) return hi;\n return d;\n}\n\n/**\n * Parses the digits an operator typed into an hours/minutes field. `null`\n * (nothing typed, or no digit at all) keeps the last value.\n *\n * The LAST two digits win: the field is controlled, so what the browser hands\n * over is the old value plus the keystroke (\"01\" + \"5\" = \"015\"), and the\n * freshest digits are the ones the operator meant.\n */\nfunction parseField(raw: string, max: number): number | null {\n const digits = raw.replace(/\\D/g, \"\").slice(-2);\n if (digits === \"\") return null;\n return Math.min(Number(digits), max);\n}\n\n// A focused field is replaced, not appended to: with the whole value selected,\n// \"1\" then \"5\" reads as 15.\nconst selectAll = (e: React.FocusEvent<HTMLInputElement>) => e.currentTarget.select();\n\nfunction isoLabel(d: Date): string {\n return `${d.getFullYear().toString().padStart(4, \"0\")}-${pad(d.getMonth() + 1)}-${pad(\n d.getDate(),\n )} ${pad(d.getHours())}:${pad(d.getMinutes())}`;\n}\n\n/** The picker's own strings; every one defaults to English. */\nexport interface DateTimePickerLabels {\n /** `aria-label` of the calendar's previous-month button; \"Previous month\". */\n previousMonth?: string;\n /** `aria-label` of the calendar's next-month button; \"Next month\". */\n nextMonth?: string;\n /** `aria-label` of the hours input; \"Hours\". */\n hours?: string;\n /** `aria-label` of the minutes input; \"Minutes\". */\n minutes?: string;\n /** Text of the clear button; \"Clear\". */\n clear?: string;\n /** `aria-label` of the popover dialog; \"Choose date and time\". */\n dialog?: string;\n /** `aria-label` of the close button; \"Close\". */\n close?: string;\n}\n\nexport interface DateTimePickerProps\n extends React.AriaAttributes,\n Pick<React.ComponentProps<\"button\">, \"onFocus\" | \"onBlur\"> {\n /** Controlled value; `null` = empty. Local-zone `Date` (seconds/ms are zeroed on every change). */\n value?: Date | null;\n /** Uncontrolled seed; default `null`. */\n defaultValue?: Date | null;\n onChange?: (value: Date | null) => void;\n /** Earliest allowed moment (inclusive, minute precision). */\n min?: Date;\n /** Latest allowed moment (inclusive, minute precision). */\n max?: Date;\n /**\n * BCP-47 tag for the trigger label and calendar captions (`Intl`). Absent →\n * `YYYY-MM-DD HH:MM` and English captions, like the Rust port.\n */\n locale?: string;\n /** Overrides the trigger label entirely (e.g. the cabinet's `formatMoment`). */\n format?: (value: Date) => string;\n /** Shown on the trigger while empty; default \"\". */\n placeholder?: string;\n labels?: DateTimePickerLabels;\n disabled?: boolean;\n /** Renders a hidden `<input name>` carrying unix seconds (\"\" when empty) for plain forms. */\n name?: string;\n /**\n * \"Today\" for the calendar highlight and as the day a typed time lands on\n * while empty; default `new Date()`.\n */\n today?: Date;\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** `PopoverContent` alignment; default \"start\". */\n align?: \"start\" | \"center\" | \"end\";\n /** Fused onto the trigger. */\n className?: string;\n /** Put on the trigger, so a `FieldLabel`'s `htmlFor` reaches it. */\n id?: string;\n}\n\n/**\n * A date + time field over the kit's own bricks: an outline trigger opening a\n * popover with the `Calendar` and two numeric hours/minutes inputs — no native\n * `datetime-local`, so the browser's locale popup never appears.\n *\n * Every edit reports through `onChange`; the popover stays open after a day\n * click (the operator still sets the time) and closes on clear or on the close\n * button (which keeps the value). Opening moves focus into the hours field;\n * closing hands it back to the trigger unless the operator already focused\n * something else. Any other `aria-*` prop, `onFocus` and `onBlur` land on the\n * trigger.\n */\nexport function DateTimePicker({\n value: valueProp,\n defaultValue = null,\n onChange,\n min,\n max,\n locale,\n format,\n placeholder = \"\",\n labels = {},\n disabled = false,\n name,\n today = new Date(),\n open,\n defaultOpen = false,\n onOpenChange,\n align = \"start\",\n className,\n id,\n ...rest\n}: DateTimePickerProps) {\n const [value, setValue] = useControllableState<Date | null>({\n ...(valueProp !== undefined ? { value: valueProp } : {}),\n defaultValue,\n ...(onChange ? { onChange } : {}),\n });\n const [isOpen, setOpen] = useControllableState<boolean>({\n ...(open !== undefined ? { value: open } : {}),\n defaultValue: defaultOpen,\n ...(onOpenChange ? { onChange: onOpenChange } : {}),\n });\n\n const rootRef = React.useRef<HTMLDivElement | null>(null);\n const hoursRef = React.useRef<HTMLInputElement | null>(null);\n const focusTrigger = () =>\n rootRef.current?.querySelector<HTMLElement>(\"[data-slot=date-time-picker-trigger]\")?.focus();\n // The content lives in a Portal, so the native tab order would skip it.\n React.useEffect(() => {\n if (!isOpen) return;\n hoursRef.current?.focus();\n return () => {\n const active = document.activeElement;\n const content = hoursRef.current?.closest(\"[data-slot=date-time-picker-content]\");\n const lost = !active || active === document.body || !!content?.contains(active);\n if (lost) focusTrigger();\n };\n }, [isOpen]);\n\n const emit = (next: Date) => setValue(clampMoment(atMinute(next), min, max));\n // A fresh copy of the moment a typed time edits: the value, or midnight of\n // `today` while empty — never the consumer's own `Date` instance.\n const base = () =>\n value\n ? new Date(value.getTime())\n : new Date(today.getFullYear(), today.getMonth(), today.getDate());\n\n const onSelect = (day: Date) =>\n emit(\n new Date(\n day.getFullYear(),\n day.getMonth(),\n day.getDate(),\n value?.getHours() ?? 0,\n value?.getMinutes() ?? 0,\n ),\n );\n const onHours = (e: React.ChangeEvent<HTMLInputElement>) => {\n const hour = parseField(e.target.value, 23);\n if (hour === null) return;\n const next = base();\n next.setHours(hour);\n emit(next);\n };\n const onMinutes = (e: React.ChangeEvent<HTMLInputElement>) => {\n const minute = parseField(e.target.value, 59);\n if (minute === null) return;\n const next = base();\n next.setMinutes(minute);\n emit(next);\n };\n const onClear = () => {\n setValue(null);\n setOpen(false);\n };\n // The content is portalled to the end of <body>, so Tab from its last\n // control (and Shift+Tab from its first) has nowhere to go: focus falls out\n // of the document and the dialog stays open over the page. Those two edges\n // close the popover and hand focus back to the trigger — the document's tab\n // order then continues from where the operator started. Middle controls keep\n // the browser's default. Not a trap: the popover is non-modal.\n const onContentKeyDown = (e: React.KeyboardEvent<HTMLDivElement>) => {\n if (e.key !== \"Tab\") return;\n const items = focusCandidates(e.currentTarget);\n const edge = e.shiftKey ? items[0] : items[items.length - 1];\n if (!edge || e.target !== edge) return;\n e.preventDefault();\n setOpen(false);\n focusTrigger();\n };\n // Focus moving elsewhere by pointer or script (the dismissable layer only\n // watches Escape and outside pointerdown). A null `relatedTarget` is the\n // window losing focus (alt-tab), not the operator leaving: keep the popover\n // for their return. Tab-out never reaches here — `onContentKeyDown` closes\n // first.\n const onContentBlur = (e: React.FocusEvent<HTMLDivElement>) => {\n const next = e.relatedTarget;\n if (!(next instanceof Node)) return;\n if (e.currentTarget.contains(next) || rootRef.current?.contains(next)) return;\n setOpen(false);\n };\n\n const label = value\n ? format\n ? format(value)\n : locale\n ? // The fields are 24-hour, so the label is too — even where the locale\n // would default to 12-hour (\"2:05 PM\" over a \"14\" hours field).\n new Intl.DateTimeFormat(locale, {\n dateStyle: \"medium\",\n timeStyle: \"short\",\n hourCycle: \"h23\",\n }).format(value)\n : isoLabel(value)\n : placeholder;\n\n return (\n <div data-slot=\"date-time-picker\" ref={rootRef}>\n <Popover open={isOpen} onOpenChange={setOpen}>\n <PopoverTrigger\n type=\"button\"\n data-slot=\"date-time-picker-trigger\"\n data-placeholder={value ? undefined : \"true\"}\n aria-haspopup=\"dialog\"\n className={cn(\n buttonVariants({ variant: \"outline\", size: \"md\" }),\n DATE_TIME_PICKER_TRIGGER,\n className,\n )}\n disabled={disabled}\n {...(id !== undefined ? { id } : {})}\n {...rest}\n >\n <CalendarIcon />\n <span>{label}</span>\n </PopoverTrigger>\n {name !== undefined && (\n <input\n type=\"hidden\"\n name={name}\n value={value ? String(Math.floor(value.getTime() / 1000)) : \"\"}\n />\n )}\n <PopoverContent\n data-slot=\"date-time-picker-content\"\n role=\"dialog\"\n aria-label={labels.dialog ?? DATE_TIME_PICKER_LABELS.dialog}\n align={align}\n onBlur={onContentBlur}\n onKeyDown={onContentKeyDown}\n className={DATE_TIME_PICKER_CONTENT}\n >\n <Calendar\n {...(value ? { selected: value } : {})}\n onSelect={onSelect}\n // The content remounts on every open, so this lands on the value's month.\n defaultMonth={value ?? min ?? today}\n today={today}\n disabled={disabled}\n {...(min ? { min } : {})}\n {...(max ? { max } : {})}\n {...(locale !== undefined ? { locale } : {})}\n {...(labels.previousMonth !== undefined\n ? { previousMonthLabel: labels.previousMonth }\n : {})}\n {...(labels.nextMonth !== undefined ? { nextMonthLabel: labels.nextMonth } : {})}\n />\n <div className={DATE_TIME_PICKER_TIME} data-slot=\"date-time-picker-time\">\n <Input\n type=\"text\"\n inputMode=\"numeric\"\n onFocus={selectAll}\n className={DATE_TIME_PICKER_TIME_INPUT}\n ref={hoursRef}\n data-slot=\"date-time-picker-hours\"\n aria-label={labels.hours ?? DATE_TIME_PICKER_LABELS.hours}\n value={pad(value?.getHours() ?? 0)}\n disabled={disabled}\n onChange={onHours}\n />\n <span className={DATE_TIME_PICKER_TIME_SEPARATOR} aria-hidden>\n :\n </span>\n <Input\n type=\"text\"\n inputMode=\"numeric\"\n onFocus={selectAll}\n className={DATE_TIME_PICKER_TIME_INPUT}\n data-slot=\"date-time-picker-minutes\"\n aria-label={labels.minutes ?? DATE_TIME_PICKER_LABELS.minutes}\n value={pad(value?.getMinutes() ?? 0)}\n disabled={disabled}\n onChange={onMinutes}\n />\n <button\n type=\"button\"\n className={buttonVariants({ variant: \"ghost\", size: \"sm\", className: DATE_TIME_PICKER_CLEAR })}\n data-slot=\"date-time-picker-clear\"\n disabled={disabled}\n onClick={onClear}\n >\n {labels.clear ?? DATE_TIME_PICKER_LABELS.clear}\n </button>\n <button\n type=\"button\"\n className={buttonVariants({ variant: \"ghost\", size: \"sm\", icon: true })}\n data-slot=\"date-time-picker-close\"\n aria-label={labels.close ?? DATE_TIME_PICKER_LABELS.close}\n disabled={disabled}\n onClick={() => setOpen(false)}\n >\n <XIcon />\n </button>\n </div>\n </PopoverContent>\n </Popover>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1,11 +1,11 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } 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 { walkElements } from "../primitives/walk-elements.js";
7
- import { isLabelable, markLabelable } from "../primitives/labelable.js";
8
- import { FieldControlContext, useFieldClaims } from "./field-context.js";
4
+ import { cn } from "../../lib/cn.js";
5
+ import { Label } from "../atomic/label.js";
6
+ import { walkElements } from "../../primitives/walk-elements.js";
7
+ import { isLabelable, markLabelable } from "../../primitives/labelable.js";
8
+ import { FieldControlContext, useFieldClaims } from "../atomic/field-context.js";
9
9
  import {
10
10
  FIELD_BASE,
11
11
  FIELD_SET,
@@ -20,7 +20,7 @@ import {
20
20
  FIELD_SEPARATOR_CONTENT,
21
21
  FIELD_ERROR,
22
22
  fieldOrientation
23
- } from "../generated/field.js";
23
+ } from "../../generated/field.js";
24
24
  function FieldSet({ className, ...props }) {
25
25
  return /* @__PURE__ */ jsx(
26
26
  "fieldset",
@@ -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\";\nimport type { FieldLegendVariant } 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?: FieldLegendVariant }) {\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);
@@ -38,7 +38,6 @@ function FormLabel({
38
38
  return /* @__PURE__ */ jsx(
39
39
  Label,
40
40
  {
41
- "data-slot": "form-label",
42
41
  "data-error": !!error,
43
42
  className: cn("data-[error=true]:text-accent-error", className),
44
43
  htmlFor: formItemId,
@@ -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-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,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":[]}
@@ -1,9 +1,9 @@
1
1
  import { jsx, jsxs } from "react/jsx-runtime";
2
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 "./button.js";
6
- import { Tooltip, TooltipContent, TooltipTrigger } from "./tooltip.js";
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
7
  const IconButton = React.forwardRef(function IconButton2({ variant = "ghost", size = "md", pressed, tooltip, className, type = "button", ...props }, ref) {
8
8
  const button = /* @__PURE__ */ jsx(
9
9
  "button",
@@ -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\";\nimport type { IconButtonVariant } from \"../../generated/icon-button\";\n\nexport type { IconButtonSize };\nexport type { IconButtonVariant };\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":"AAiCI,cAkBA,YAlBA;AAjCJ,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB,SAAS,kBAAkB,qBAAqB,6BAAkD;AAClG,SAAS,sBAAsB;AAC/B,SAAS,SAAS,gBAAgB,sBAAsB;AAwBjD,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",
@@ -36,7 +36,6 @@ function ItemSeparator({
36
36
  return /* @__PURE__ */ jsx(
37
37
  Separator,
38
38
  {
39
- "data-slot": "item-separator",
40
39
  orientation: "horizontal",
41
40
  className: cn(ITEM_SEPARATOR, className),
42
41
  ...props
@@ -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 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":"AA2BI;AA3BJ,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB,SAAS,YAAY;AACrB,SAAS,iBAAiB;AAC1B;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,OAIK;AAIA,SAAS,UAAU,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC9E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAU;AAAA,MACV,WAAW,GAAG,YAAY,SAAS;AAAA,MAClC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,cAAc;AAAA,EAC5B;AAAA,EACA,GAAG;AACL,GAA2C;AACzC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAY;AAAA,MACZ,WAAW,GAAG,gBAAgB,SAAS;AAAA,MACtC,GAAG;AAAA;AAAA,EACN;AAEJ;AAQO,SAAS,KAAK;AAAA,EACnB;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP,UAAU;AAAA,EACV,GAAG;AACL,GAAc;AACZ,QAAM,OAAO,UAAU,OAAO;AAC9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAc;AAAA,MACd,aAAW;AAAA,MACX,WAAW,GAAG,WAAW,aAAa,OAAO,GAAG,UAAU,IAAI,GAAG,SAAS;AAAA,MACzE,GAAI;AAAA;AAAA,EACP;AAEJ;AAMO,SAAS,UAAU;AAAA,EACxB;AAAA,EACA,UAAU;AAAA,EACV,GAAG;AACL,GAAmB;AACjB,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAc;AAAA,MACd,WAAW,GAAG,iBAAiB,kBAAkB,OAAO,GAAG,SAAS;AAAA,MACnE,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,cAAc,SAAS;AAAA,MACpC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,UAAU,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC9E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,YAAY,SAAS;AAAA,MAClC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA,GAAG;AACL,GAA8B;AAC5B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,kBAAkB,SAAS;AAAA,MACxC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,cAAc,SAAS;AAAA,MACpC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,aAAa,SAAS;AAAA,MACnC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,WAAW;AAAA,EACzB;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,aAAa,SAAS;AAAA,MACnC,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]}
@@ -1,17 +1,18 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
- import { cn } from "../lib/cn.js";
4
+ import { cn } from "../../lib/cn.js";
5
5
  import {
6
6
  POPOVER_FORM_ACTIONS,
7
7
  POPOVER_FORM_CONTENT,
8
8
  POPOVER_FORM_FIELDS,
9
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 "./button.js";
14
- import { Popover, PopoverContent, PopoverTrigger } from "./popover.js";
10
+ POPOVER_FORM_TITLE,
11
+ POPOVER_FORM_LABELS
12
+ } from "../../generated/popover-form.js";
13
+ import { useControllableState } from "../../primitives/use-controllable-state.js";
14
+ import { Button } from "../atomic/button.js";
15
+ import { Popover, PopoverContent, PopoverTrigger } from "../atomic/popover.js";
15
16
  function PopoverForm({
16
17
  open,
17
18
  defaultOpen = false,
@@ -46,8 +47,8 @@ function PopoverForm({
46
47
  /* @__PURE__ */ jsx("h3", { id: titleId, className: POPOVER_FORM_TITLE, children: title }),
47
48
  /* @__PURE__ */ jsx("div", { className: POPOVER_FORM_FIELDS, children }),
48
49
  /* @__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" })
50
+ /* @__PURE__ */ jsx(Button, { type: "reset", variant: "ghost", size: "sm", children: labels.reset ?? POPOVER_FORM_LABELS.reset }),
51
+ /* @__PURE__ */ jsx(Button, { type: "submit", variant: "primary", size: "sm", children: labels.submit ?? POPOVER_FORM_LABELS.submit })
51
52
  ] })
52
53
  ]
53
54
  }
@@ -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 POPOVER_FORM_LABELS,\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 ?? POPOVER_FORM_LABELS.reset}\n </Button>\n <Button type=\"submit\" variant=\"primary\" size=\"sm\">\n {labels.submit ?? POPOVER_FORM_LABELS.submit}\n </Button>\n </div>\n </form>\n </PopoverContent>\n </Popover>\n );\n}\n"],"mappings":";AA2DM,cAeI,YAfJ;AAzDN,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB;AAAA,EACE;AAAA,EACA;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,oBAAoB,OACvC;AAAA,YACA,oBAAC,UAAO,MAAK,UAAS,SAAQ,WAAU,MAAK,MAC1C,iBAAO,UAAU,oBAAoB,QACxC;AAAA,aACF;AAAA;AAAA;AAAA,IACF,GACF;AAAA,KACF;AAEJ;","names":[]}
@@ -1,7 +1,7 @@
1
1
  "use client";
2
2
  import { jsx, jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
- import { cn } from "../lib/cn.js";
4
+ import { cn } from "../../lib/cn.js";
5
5
  import {
6
6
  SETTINGS_LAYOUT,
7
7
  SETTINGS_MAIN,
@@ -16,10 +16,10 @@ import {
16
16
  SETTINGS_SECTION_HEADER,
17
17
  SETTINGS_SECTION_HEADER_FLUSH,
18
18
  SETTINGS_SECTION_HEADING,
19
- SETTINGS_SECTION_TITLE,
20
- settingsSectionToneClasses
21
- } from "../generated/settings.js";
22
- import { FormRow } from "./form-row.js";
19
+ SETTINGS_SECTION_TITLE
20
+ } from "../../generated/settings.js";
21
+ import { toneClasses } from "../../generated/tone.js";
22
+ import { FormRow } from "../atomic/form-row.js";
23
23
  function SettingsLayout({ nav, className, children, ...props }) {
24
24
  return /* @__PURE__ */ jsxs(
25
25
  "div",
@@ -41,7 +41,7 @@ function SettingsSection({
41
41
  title,
42
42
  description,
43
43
  action,
44
- tone = "default",
44
+ tone = "neutral",
45
45
  flush = false,
46
46
  className,
47
47
  children,
@@ -56,7 +56,7 @@ function SettingsSection({
56
56
  "aria-labelledby": headingId,
57
57
  className: cn(
58
58
  SETTINGS_SECTION_BASE,
59
- settingsSectionToneClasses[tone],
59
+ toneClasses[tone],
60
60
  className
61
61
  ),
62
62
  ...props,
@@ -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} from \"../../generated/settings\";\nimport { toneClasses, type Tone } from \"../../generated/tone\";\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 /** `error` draws the destructive-zone edge. */\n tone?: Tone;\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 = \"neutral\",\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 toneClasses[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":";AAkCI,SAQE,KARF;AAhCJ,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,OACK;AACP,SAAS,mBAA8B;AACvC,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,YAAY,IAAI;AAAA,QAChB;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":[]}
@@ -18,11 +18,11 @@ import {
18
18
  ACCOUNT_LIST_ITEM_RADIO,
19
19
  ACCOUNT_LIST_ITEM_TEXT,
20
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 "./avatar.js";
25
- import { UiIcon } from "./ui-icons.js";
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
26
  const AccountListContext = React.createContext(null);
27
27
  function AccountList({
28
28
  value,
@@ -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":[]}
@@ -1,9 +1,9 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
- import { cn } from "../lib/cn.js";
5
- import { Avatar, AvatarFallback } from "./avatar.js";
6
- import { Badge } from "./badge.js";
4
+ import { cn } from "../../lib/cn.js";
5
+ import { Avatar, AvatarFallback } from "../atomic/avatar.js";
6
+ import { Badge } from "../atomic/badge.js";
7
7
  import {
8
8
  DropdownMenuItem,
9
9
  DropdownMenuRadioGroup,
@@ -12,9 +12,9 @@ import {
12
12
  DropdownMenuSub,
13
13
  DropdownMenuSubContent,
14
14
  DropdownMenuSubTrigger
15
- } from "./dropdown-menu.js";
16
- import { Switch } from "./switch.js";
17
- import { UiIcon } from "./ui-icons.js";
15
+ } from "../atomic/dropdown-menu.js";
16
+ import { Switch } from "../atomic/switch.js";
17
+ import { UiIcon } from "../../icons/ui-icons.js";
18
18
  function ProfileTabs({
19
19
  tabs,
20
20
  value,
@@ -44,7 +44,7 @@ function ProfileTabs({
44
44
  onClick: () => onChange(t.id),
45
45
  onKeyDown: (e) => move(e, i),
46
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",
47
+ "-mb-px h-(--control-h-sm) flex-1 border-b px-3 text-body font-medium outline-none focus-visible:ring-2 focus-visible:ring-ring",
48
48
  selected ? "border-primary text-ink" : "border-transparent text-ink-mid hover:text-ink"
49
49
  ),
50
50
  children: t.label
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/shell/account-menu-profile.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { Avatar, AvatarFallback } from \"../atomic/avatar\";\nimport { Badge } from \"../atomic/badge\";\nimport {\n DropdownMenuItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from \"../atomic/dropdown-menu\";\nimport { Switch } from \"../atomic/switch\";\nimport { UiIcon } from \"../../icons/ui-icons\";\n\nexport interface AccountMenuTab {\n id: string;\n label: React.ReactNode;\n /** Shown instead of the menu body when this tab is current; the first tab is always the menu itself. */\n content?: React.ReactNode;\n}\n\nexport interface AccountMenuProfile {\n /** Under the name on the profile card, e.g. \"Free\". */\n plan?: string;\n /** Makes the card a menu item that runs this and closes the menu, e.g. to open the account settings. */\n onOpenProfile?: () => void;\n tabs?: readonly AccountMenuTab[];\n /** Names the tab row for assistive tech. Default `\"Sections\"`. */\n tabsLabel?: string;\n /** Current tab id (controlled). */\n tab?: string;\n onTabChange?: (id: string) => void;\n /** A row with a short value badge on the right (\"EN\"); picking it runs `onSelect`. */\n language?: { label: string; value: string; onSelect?: () => void };\n /** A row with a switch; the menu closes after a toggle. */\n darkTheme?: { label: string; checked: boolean; onCheckedChange: (checked: boolean) => void };\n /** A submenu of radio options; the current one's label shows on the row. */\n colorTheme?: {\n label: string;\n value: string;\n options: readonly { id: string; label: string }[];\n onValueChange: (id: string) => void;\n };\n /** Glyphs for the rows, so the kit carries no icon set. */\n icons?: { language?: React.ReactNode; darkTheme?: React.ReactNode; colorTheme?: React.ReactNode };\n}\n\n/**\n * The tabs are `menuitemradio` items in a group, not a tablist: a menu may only\n * hold items, and this way the menu's own arrow-key roving reaches them.\n * Selecting one does not close the menu.\n */\nexport function ProfileTabs({\n tabs,\n value,\n onChange,\n label = \"Sections\",\n}: {\n tabs: readonly AccountMenuTab[];\n value: string;\n onChange: (id: string) => void;\n label?: string | undefined;\n}) {\n const move = (e: React.KeyboardEvent<HTMLButtonElement>, index: number) => {\n const step = e.key === \"ArrowRight\" ? 1 : e.key === \"ArrowLeft\" ? -1 : 0;\n if (step === 0) return;\n // Up and Down belong to the menu; Left and Right stay in the row.\n e.stopPropagation();\n e.preventDefault();\n const target = (index + step + tabs.length) % tabs.length;\n const next = tabs[target];\n if (!next) return;\n onChange(next.id);\n e.currentTarget.parentElement?.querySelectorAll<HTMLElement>('[role=\"menuitemradio\"]')[target]?.focus();\n };\n return (\n <div role=\"group\" aria-label={label} data-slot=\"account-menu-tabs\" className=\"flex border-b border-border-subtle\">\n {tabs.map((t, i) => {\n const selected = t.id === value;\n return (\n <button\n key={t.id}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={selected}\n tabIndex={-1}\n onClick={() => onChange(t.id)}\n onKeyDown={(e) => move(e, i)}\n className={cn(\n \"-mb-px h-(--control-h-sm) flex-1 border-b px-3 text-body font-medium outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n selected ? \"border-primary text-ink\" : \"border-transparent text-ink-mid hover:text-ink\",\n )}\n >\n {t.label}\n </button>\n );\n })}\n </div>\n );\n}\n\nexport function ProfileCard({\n name,\n plan,\n initials,\n onOpen,\n}: {\n name: string;\n plan?: string | undefined;\n initials: string;\n onOpen?: (() => void) | undefined;\n}) {\n const content = (\n <>\n <Avatar className=\"size-14 shrink-0 rounded-full\">\n <AvatarFallback className=\"font-serif text-h2 font-light text-ink\">{initials.slice(0, 1)}</AvatarFallback>\n </Avatar>\n <span className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className=\"truncate text-body font-medium text-ink\">{name}</span>\n {plan && <span className=\"text-caption text-ink-soft\">{plan}</span>}\n </span>\n {onOpen && <UiIcon name=\"chevron-right\" className=\"size-4 text-ink-soft\" />}\n </>\n );\n if (!onOpen) {\n return (\n <div data-slot=\"account-menu-card\" className=\"flex w-full items-center gap-2.5 p-2\">\n {content}\n </div>\n );\n }\n // A real menu item: it joins the arrow-key order and closes the menu, so a dialog opened from it is not left under the menu.\n return (\n <DropdownMenuItem data-slot=\"account-menu-card\" className=\"h-auto gap-2.5 p-2\" onClick={onOpen}>\n {content}\n </DropdownMenuItem>\n );\n}\n\nexport function ProfileSettingRows({ profile }: { profile: AccountMenuProfile }) {\n const { language, darkTheme, colorTheme, icons } = profile;\n if (!language && !darkTheme && !colorTheme) return null;\n const currentColor = colorTheme?.options.find((o) => o.id === colorTheme.value)?.label;\n return (\n <>\n <DropdownMenuSeparator />\n {language && (\n <DropdownMenuItem onClick={() => language.onSelect?.()}>\n {icons?.language}\n <span className=\"flex-1\">{language.label}</span>\n <Badge>{language.value}</Badge>\n </DropdownMenuItem>\n )}\n {darkTheme && (\n <DropdownMenuItem\n role=\"menuitemcheckbox\"\n aria-checked={darkTheme.checked}\n onClick={() => darkTheme.onCheckedChange(!darkTheme.checked)}\n >\n {icons?.darkTheme}\n <span className=\"flex-1\">{darkTheme.label}</span>\n {/* Presentational: the row is the control, so the switch stays out of the tab order. */}\n <Switch checked={darkTheme.checked} tabIndex={-1} aria-hidden className=\"pointer-events-none\" />\n </DropdownMenuItem>\n )}\n {colorTheme && (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger>\n {icons?.colorTheme}\n <span className=\"flex-1\">{colorTheme.label}</span>\n {currentColor && <span className=\"text-body-s text-ink-soft\">{currentColor}</span>}\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n <DropdownMenuRadioGroup value={colorTheme.value} onValueChange={colorTheme.onValueChange}>\n {colorTheme.options.map((o) => (\n <DropdownMenuRadioItem key={o.id} value={o.id}>\n {o.label}\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n )}\n </>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1,8 +1,8 @@
1
1
  "use client";
2
2
  import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
- import { cn } from "../lib/cn.js";
5
- import { Avatar, AvatarFallback } from "./avatar.js";
4
+ import { cn } from "../../lib/cn.js";
5
+ import { Avatar, AvatarFallback } from "../atomic/avatar.js";
6
6
  import {
7
7
  DropdownMenu,
8
8
  DropdownMenuContent,
@@ -11,8 +11,8 @@ import {
11
11
  DropdownMenuLabel,
12
12
  DropdownMenuSeparator,
13
13
  DropdownMenuTrigger
14
- } from "./dropdown-menu.js";
15
- import { useControllableState } from "../primitives/use-controllable-state.js";
14
+ } from "../atomic/dropdown-menu.js";
15
+ import { useControllableState } from "../../primitives/use-controllable-state.js";
16
16
  import {
17
17
  ProfileCard,
18
18
  ProfileSettingRows,
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/shell/account-menu.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { Avatar, AvatarFallback } from \"../atomic/avatar\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"../atomic/dropdown-menu\";\nimport type { NavGroup } from \"./nav-model\";\nimport { useControllableState } from \"../../primitives/use-controllable-state\";\nimport {\n ProfileCard,\n ProfileSettingRows,\n ProfileTabs,\n type AccountMenuProfile,\n type AccountMenuTab,\n} from \"./account-menu-profile\";\n\nexport type { AccountMenuProfile, AccountMenuTab };\n\nexport interface AccountMenuLabels {\n /** Accessible name of the trigger. Default `\"Account\"`. */\n trigger?: string;\n /** Default `\"Manage account\"`. */\n manage?: string;\n /** Default `\"Switch account\"`. */\n switchAccount?: string;\n /** Default `\"Sign out\"`. */\n signOut?: string;\n}\n\nexport interface AccountMenuProps {\n account: { name?: string | null | undefined; email: string };\n /** The account center, on the identity provider's origin; no item without it. */\n manageHref?: string | undefined;\n /** A full page load to the sign-in that offers the account chooser. */\n switchHref: string;\n /** The service's own entries, between the account center and switching. Draws `label`, `icon`, `external`. */\n groups?: readonly NavGroup[];\n onSignOut: () => void;\n linkComponent?: React.ElementType;\n labels?: AccountMenuLabels;\n /**\n * The wide profile form: tabs, a profile card, language and theme rows. Absent,\n * the menu is the compact one it always was.\n */\n profile?: AccountMenuProfile;\n className?: string;\n}\n\nconst initials = (account: AccountMenuProps[\"account\"]) => {\n const words = account.name?.trim().split(/\\s+/).filter(Boolean) ?? [];\n const letters = words.length > 0 ? words.slice(0, 2).map(w => Array.from(w)[0]) : [Array.from(account.email)[0]];\n return letters.join(\"\").toUpperCase();\n};\n\n/**\n * Who is signed in, top right. The order is fixed — the account, the account\n * center, the service's groups, switching, signing out — so every service's\n * menu reads the same; a service adds groups and nothing else.\n */\nexport function AccountMenu({\n account,\n manageHref,\n switchHref,\n groups = [],\n onSignOut,\n linkComponent,\n labels = {},\n profile,\n className,\n}: AccountMenuProps) {\n const Link = linkComponent ?? \"a\";\n const tabs = profile?.tabs ?? [];\n const [tab, setTab] = useControllableState<string>({\n ...(profile?.tab !== undefined ? { value: profile.tab } : {}),\n defaultValue: tabs[0]?.id ?? \"\",\n ...(profile?.onTabChange ? { onChange: profile.onTabChange } : {}),\n });\n const otherTab = tabs.length > 0 && tab !== tabs[0]?.id ? tabs.find((t) => t.id === tab) : undefined;\n return (\n <DropdownMenu>\n <DropdownMenuTrigger\n data-slot=\"account-menu-trigger\"\n aria-label={labels.trigger ?? \"Account\"}\n className={cn(\"rounded-full outline-none focus-visible:ring-2 focus-visible:ring-ring\", className)}\n >\n <Avatar>\n <AvatarFallback className=\"text-xs font-medium text-ink\">{initials(account)}</AvatarFallback>\n </Avatar>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className={profile ? \"w-75\" : \"w-64\"}>\n {tabs.length > 0 && <ProfileTabs tabs={tabs} value={tab} onChange={setTab} label={profile?.tabsLabel} />}\n {otherTab ? (\n otherTab.content\n ) : (\n <>\n {profile ? (\n <ProfileCard\n name={account.name || account.email}\n plan={profile.plan}\n initials={initials(account)}\n onOpen={profile.onOpenProfile}\n />\n ) : (\n <DropdownMenuLabel className=\"flex flex-col\">\n {account.name && <span className=\"truncate text-ink\">{account.name}</span>}\n <span className=\"truncate font-normal text-ink-soft\">{account.email}</span>\n </DropdownMenuLabel>\n )}\n {profile && <DropdownMenuSeparator />}\n {manageHref && (\n <DropdownMenuItem asChild>\n <a href={manageHref}>{labels.manage ?? \"Manage account\"}</a>\n </DropdownMenuItem>\n )}\n {groups.map(group => (\n <React.Fragment key={group.id}>\n <DropdownMenuSeparator />\n <DropdownMenuGroup>\n {group.label && <DropdownMenuLabel className=\"text-xs text-ink-soft\">{group.label}</DropdownMenuLabel>}\n {group.items.map(item => {\n const Item = item.external ? \"a\" : Link;\n const Icon = item.icon;\n return (\n <DropdownMenuItem key={item.id} asChild>\n <Item href={item.href}>\n {Icon && <Icon className=\"size-4\" />}\n {item.label}\n </Item>\n </DropdownMenuItem>\n );\n })}\n </DropdownMenuGroup>\n </React.Fragment>\n ))}\n {profile && <ProfileSettingRows profile={profile} />}\n <DropdownMenuSeparator />\n <DropdownMenuItem asChild>\n <a href={switchHref}>{labels.switchAccount ?? \"Switch account\"}</a>\n </DropdownMenuItem>\n <DropdownMenuItem variant={profile ? \"destructive\" : \"neutral\"} onClick={onSignOut}>\n {labels.signOut ?? \"Sign out\"}\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"mappings":"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","names":[]}