@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,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 { useControllableState } from "../primitives/use-controllable-state.js";
6
- import { useRovingFocus } from "../primitives/use-roving-focus.js";
7
- import { TABS_ROOT, TABS_LIST, TABS_TRIGGER, TABS_CONTENT } from "../generated/tabs.js";
4
+ import { cn } from "../../lib/cn.js";
5
+ import { useControllableState } from "../../primitives/use-controllable-state.js";
6
+ import { useRovingFocus } from "../../primitives/use-roving-focus.js";
7
+ import { TABS_ROOT, TABS_LIST, TABS_TRIGGER, TABS_CONTENT } from "../../generated/tabs.js";
8
8
  const TabsContext = React.createContext(null);
9
9
  function useTabs() {
10
10
  const ctx = React.useContext(TabsContext);
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/atomic/tabs.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { useControllableState } from \"../../primitives/use-controllable-state\";\nimport { useRovingFocus } from \"../../primitives/use-roving-focus\";\nimport { TABS_ROOT, TABS_LIST, TABS_TRIGGER, TABS_CONTENT } from \"../../generated/tabs\";\nimport type { Orientation } from \"../../generated/orientation\";\n\n\ninterface TabsContextValue {\n value: string;\n setValue: (next: string) => void;\n orientation: Orientation;\n}\n\nconst TabsContext = React.createContext<TabsContextValue | null>(null);\n\nfunction useTabs(): TabsContextValue {\n const ctx = React.useContext(TabsContext);\n if (!ctx) throw new Error(\"Tabs parts must be used within <Tabs>\");\n return ctx;\n}\n\nexport interface TabsProps\n extends Omit<React.ComponentProps<\"div\">, \"onChange\"> {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n orientation?: Orientation;\n}\n\nexport function Tabs({\n className,\n value,\n defaultValue = \"\",\n onValueChange,\n orientation = \"horizontal\",\n children,\n ...props\n}: TabsProps) {\n const [active, setValue] = useControllableState<string>({\n ...(value !== undefined ? { value } : {}),\n defaultValue,\n ...(onValueChange ? { onChange: onValueChange } : {}),\n });\n return (\n <TabsContext.Provider value={{ value: active, setValue, orientation }}>\n <div\n data-slot=\"tabs\"\n data-orientation={orientation}\n className={cn(TABS_ROOT, className)}\n {...props}\n >\n {children}\n </div>\n </TabsContext.Provider>\n );\n}\n\nexport function TabsList({\n className,\n children,\n onKeyDown,\n ...props\n}: React.ComponentProps<\"div\">) {\n const { orientation } = useTabs();\n const items = React.Children.toArray(children);\n const { activeIndex, setActiveIndex, onKeyDown: rovingKeyDown } =\n useRovingFocus({\n count: items.length,\n orientation: orientation === \"vertical\" ? \"vertical\" : \"horizontal\",\n });\n return (\n <div\n role=\"tablist\"\n data-slot=\"tabs-list\"\n aria-orientation={orientation}\n className={cn(TABS_LIST, className)}\n onKeyDown={(e) => {\n onKeyDown?.(e);\n rovingKeyDown(e);\n }}\n {...props}\n >\n {items.map((child, index) =>\n React.isValidElement(child)\n ? React.cloneElement(child as React.ReactElement<TabsTriggerInternal>, {\n __index: index,\n __isFocusItem: index === activeIndex,\n __onFocusItem: () => setActiveIndex(index),\n })\n : child,\n )}\n </div>\n );\n}\n\ninterface TabsTriggerInternal {\n __index?: number;\n __isFocusItem?: boolean;\n __onFocusItem?: () => void;\n}\n\nexport interface TabsTriggerProps\n extends React.ComponentProps<\"button\">,\n TabsTriggerInternal {\n value: string;\n}\n\nexport function TabsTrigger({\n className,\n value,\n onClick,\n onFocus,\n __isFocusItem,\n __onFocusItem,\n ...props\n}: TabsTriggerProps) {\n const { value: active, setValue } = useTabs();\n const selected = active === value;\n return (\n <button\n type=\"button\"\n role=\"tab\"\n data-slot=\"tabs-trigger\"\n data-state={selected ? \"active\" : \"inactive\"}\n aria-selected={selected}\n tabIndex={__isFocusItem ? 0 : -1}\n className={cn(TABS_TRIGGER, className)}\n onClick={(e) => {\n onClick?.(e);\n __onFocusItem?.();\n setValue(value);\n }}\n onFocus={(e) => {\n onFocus?.(e);\n __onFocusItem?.();\n }}\n {...props}\n />\n );\n}\n\nexport interface TabsContentProps extends React.ComponentProps<\"div\"> {\n value: string;\n}\n\nexport function TabsContent({\n className,\n value,\n children,\n ...props\n}: TabsContentProps) {\n const { value: active } = useTabs();\n if (active !== value) return null;\n return (\n <div\n role=\"tabpanel\"\n data-slot=\"tabs-content\"\n data-state=\"active\"\n className={cn(TABS_CONTENT, className)}\n {...props}\n >\n {children}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1,9 +1,9 @@
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 { TEXTAREA_BASE, textareaSizeClasses } from "../generated/textarea.js";
6
- import { markLabelable } from "../primitives/labelable.js";
4
+ import { cn } from "../../lib/cn.js";
5
+ import { TEXTAREA_BASE, textareaSizeClasses } from "../../generated/textarea.js";
6
+ import { markLabelable } from "../../primitives/labelable.js";
7
7
  import { useFieldControlId } from "./field-context.js";
8
8
  function Textarea({ className, id, size = "md", ...props }) {
9
9
  return /* @__PURE__ */ jsx(
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/atomic/textarea.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { TEXTAREA_BASE, textareaSizeClasses, type TextareaSize } from \"../../generated/textarea\";\nimport { markLabelable } from \"../../primitives/labelable\";\nimport { useFieldControlId } from \"./field-context\";\n\nexport type { TextareaSize };\n\nexport interface TextareaProps extends React.ComponentProps<\"textarea\"> {\n size?: TextareaSize;\n}\n\nexport function Textarea({ className, id, size = \"md\", ...props }: TextareaProps) {\n return (\n <textarea\n data-slot=\"textarea\"\n data-size={size}\n id={useFieldControlId(id)}\n className={cn(TEXTAREA_BASE, textareaSizeClasses[size], className)}\n {...props}\n />\n );\n}\n\nmarkLabelable(Textarea);\n"],"mappings":";AAgBI;AAdJ,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB,SAAS,eAAe,2BAA8C;AACtE,SAAS,qBAAqB;AAC9B,SAAS,yBAAyB;AAQ3B,SAAS,SAAS,EAAE,WAAW,IAAI,OAAO,MAAM,GAAG,MAAM,GAAkB;AAChF,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,aAAW;AAAA,MACX,IAAI,kBAAkB,EAAE;AAAA,MACxB,WAAW,GAAG,eAAe,oBAAoB,IAAI,GAAG,SAAS;AAAA,MAChE,GAAG;AAAA;AAAA,EACN;AAEJ;AAEA,cAAc,QAAQ;","names":[]}
@@ -1,8 +1,8 @@
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 { useControllableState } from "../primitives/use-controllable-state.js";
4
+ import { cn } from "../../lib/cn.js";
5
+ import { useControllableState } from "../../primitives/use-controllable-state.js";
6
6
  import {
7
7
  toggleVariants
8
8
  } from "./toggle.js";
@@ -52,7 +52,7 @@ function ToggleGroup({
52
52
  "data-variant": variant,
53
53
  "data-size": size,
54
54
  className: cn(
55
- "group/toggle-group flex w-fit items-center rounded-md data-[variant=outline]:shadow-xs",
55
+ "group/toggle-group flex w-fit items-center rounded-control data-[variant=outline]:shadow-xs",
56
56
  className
57
57
  ),
58
58
  ...props,
@@ -86,7 +86,7 @@ function ToggleGroupItem({
86
86
  toggleVariants({ variant: resolvedVariant, size: resolvedSize }),
87
87
  // `flex-auto`, not shadcn's `flex-1`: the group is `w-fit`, and basis-0 items
88
88
  // make Chrome split it into equal columns, so a longer label overflows its cell.
89
- "min-w-0 flex-auto shrink-0 rounded-none shadow-none first:rounded-l-md last:rounded-r-md focus:z-10 focus-visible:z-10 data-[variant=outline]:-ml-px data-[variant=outline]:first:ml-0 data-[state=on]:z-10",
89
+ "min-w-0 flex-auto shrink-0 rounded-none shadow-none first:rounded-l-control last:rounded-r-control focus:z-10 focus-visible:z-10 data-[variant=outline]:-ml-px data-[variant=outline]:first:ml-0 data-[state=on]:z-10",
90
90
  className
91
91
  ),
92
92
  onClick: (e) => {
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/atomic/toggle-group.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { useControllableState } from \"../../primitives/use-controllable-state\";\nimport {\n toggleVariants,\n type ToggleVariant,\n type ToggleSize,\n} from \"./toggle\";\nimport type { ToggleGroupType } from \"../../generated/toggle-group\";\n\ntype ToggleGroupContextValue = {\n variant: ToggleVariant;\n size: ToggleSize;\n value: string[];\n toggle: (itemValue: string) => void;\n};\n\nconst ToggleGroupContext = React.createContext<ToggleGroupContextValue>({\n variant: \"bare\",\n size: \"md\",\n value: [],\n toggle: () => {},\n});\n\nexport interface ToggleGroupProps\n extends Omit<React.ComponentProps<\"div\">, \"onChange\"> {\n variant?: ToggleVariant;\n size?: ToggleSize;\n type?: ToggleGroupType;\n value?: string | string[];\n defaultValue?: string | string[];\n onValueChange?: (value: string | string[]) => void;\n}\n\nfunction toArray(v: string | string[] | undefined): string[] {\n if (v === undefined) return [];\n return Array.isArray(v) ? v : v === \"\" ? [] : [v];\n}\n\nexport function ToggleGroup({\n className,\n variant = \"bare\",\n size = \"md\",\n type = \"single\",\n value,\n defaultValue,\n onValueChange,\n children,\n ...props\n}: ToggleGroupProps) {\n const [selected, setSelected] = useControllableState<string[]>({\n ...(value !== undefined ? { value: toArray(value) } : {}),\n defaultValue: toArray(defaultValue),\n onChange: (next) =>\n onValueChange?.(type === \"single\" ? (next[0] ?? \"\") : next),\n });\n\n const toggle = React.useCallback(\n (itemValue: string) => {\n if (type === \"single\") {\n setSelected(selected.includes(itemValue) ? [] : [itemValue]);\n } else {\n setSelected(\n selected.includes(itemValue)\n ? selected.filter((v) => v !== itemValue)\n : [...selected, itemValue],\n );\n }\n },\n [type, selected, setSelected],\n );\n\n return (\n <div\n data-slot=\"toggle-group\"\n data-variant={variant}\n data-size={size}\n className={cn(\n \"group/toggle-group flex w-fit items-center rounded-control data-[variant=outline]:shadow-xs\",\n className,\n )}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ variant, size, value: selected, toggle }}>\n {children}\n </ToggleGroupContext.Provider>\n </div>\n );\n}\n\nexport interface ToggleGroupItemProps\n extends Omit<React.ComponentProps<\"button\">, \"value\" | \"onChange\"> {\n value: string;\n variant?: ToggleVariant;\n size?: ToggleSize;\n}\n\nexport function ToggleGroupItem({\n className,\n children,\n value,\n variant,\n size,\n onClick,\n ...props\n}: ToggleGroupItemProps) {\n const context = React.useContext(ToggleGroupContext);\n const resolvedVariant = context.variant || variant || \"bare\";\n const resolvedSize = context.size || size || \"md\";\n const on = context.value.includes(value);\n\n return (\n <button\n type=\"button\"\n data-slot=\"toggle-group-item\"\n data-variant={resolvedVariant}\n data-size={resolvedSize}\n data-state={on ? \"on\" : \"off\"}\n aria-pressed={on}\n className={cn(\n toggleVariants({ variant: resolvedVariant, size: resolvedSize }),\n // `flex-auto`, not shadcn's `flex-1`: the group is `w-fit`, and basis-0 items\n // make Chrome split it into equal columns, so a longer label overflows its cell.\n \"min-w-0 flex-auto shrink-0 rounded-none shadow-none first:rounded-l-control last:rounded-r-control focus:z-10 focus-visible:z-10 data-[variant=outline]:-ml-px data-[variant=outline]:first:ml-0 data-[state=on]:z-10\",\n className,\n )}\n onClick={(e) => {\n onClick?.(e);\n context.toggle(value);\n }}\n {...props}\n >\n {children}\n </button>\n );\n}\n"],"mappings":";AAqFM;AAnFN,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB,SAAS,4BAA4B;AACrC;AAAA,EACE;AAAA,OAGK;AAUP,MAAM,qBAAqB,MAAM,cAAuC;AAAA,EACtE,SAAS;AAAA,EACT,MAAM;AAAA,EACN,OAAO,CAAC;AAAA,EACR,QAAQ,MAAM;AAAA,EAAC;AACjB,CAAC;AAYD,SAAS,QAAQ,GAA4C;AAC3D,MAAI,MAAM,OAAW,QAAO,CAAC;AAC7B,SAAO,MAAM,QAAQ,CAAC,IAAI,IAAI,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;AAClD;AAEO,SAAS,YAAY;AAAA,EAC1B;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAqB;AACnB,QAAM,CAAC,UAAU,WAAW,IAAI,qBAA+B;AAAA,IAC7D,GAAI,UAAU,SAAY,EAAE,OAAO,QAAQ,KAAK,EAAE,IAAI,CAAC;AAAA,IACvD,cAAc,QAAQ,YAAY;AAAA,IAClC,UAAU,CAAC,SACT,gBAAgB,SAAS,WAAY,KAAK,CAAC,KAAK,KAAM,IAAI;AAAA,EAC9D,CAAC;AAED,QAAM,SAAS,MAAM;AAAA,IACnB,CAAC,cAAsB;AACrB,UAAI,SAAS,UAAU;AACrB,oBAAY,SAAS,SAAS,SAAS,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC;AAAA,MAC7D,OAAO;AACL;AAAA,UACE,SAAS,SAAS,SAAS,IACvB,SAAS,OAAO,CAAC,MAAM,MAAM,SAAS,IACtC,CAAC,GAAG,UAAU,SAAS;AAAA,QAC7B;AAAA,MACF;AAAA,IACF;AAAA,IACA,CAAC,MAAM,UAAU,WAAW;AAAA,EAC9B;AAEA,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,gBAAc;AAAA,MACd,aAAW;AAAA,MACX,WAAW;AAAA,QACT;AAAA,QACA;AAAA,MACF;AAAA,MACC,GAAG;AAAA,MAEJ,8BAAC,mBAAmB,UAAnB,EAA4B,OAAO,EAAE,SAAS,MAAM,OAAO,UAAU,OAAO,GAC1E,UACH;AAAA;AAAA,EACF;AAEJ;AASO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAyB;AACvB,QAAM,UAAU,MAAM,WAAW,kBAAkB;AACnD,QAAM,kBAAkB,QAAQ,WAAW,WAAW;AACtD,QAAM,eAAe,QAAQ,QAAQ,QAAQ;AAC7C,QAAM,KAAK,QAAQ,MAAM,SAAS,KAAK;AAEvC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAU;AAAA,MACV,gBAAc;AAAA,MACd,aAAW;AAAA,MACX,cAAY,KAAK,OAAO;AAAA,MACxB,gBAAc;AAAA,MACd,WAAW;AAAA,QACT,eAAe,EAAE,SAAS,iBAAiB,MAAM,aAAa,CAAC;AAAA;AAAA;AAAA,QAG/D;AAAA,QACA;AAAA,MACF;AAAA,MACA,SAAS,CAAC,MAAM;AACd,kBAAU,CAAC;AACX,gBAAQ,OAAO,KAAK;AAAA,MACtB;AAAA,MACC,GAAG;AAAA,MAEH;AAAA;AAAA,EACH;AAEJ;","names":[]}
@@ -1,19 +1,16 @@
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 { useControllableState } from "../primitives/use-controllable-state.js";
6
- import {
7
- TOGGLE_BASE,
8
- toggleSizeClasses,
9
- toggleVariantClasses
10
- } from "../generated/toggle.js";
4
+ import { cn } from "../../lib/cn.js";
5
+ import { useControllableState } from "../../primitives/use-controllable-state.js";
6
+ import { sizeClasses } from "../../generated/size.js";
7
+ import { TOGGLE_BASE, toggleVariantClasses } from "../../generated/toggle.js";
11
8
  function toggleVariants({
12
9
  variant = "bare",
13
10
  size = "md",
14
11
  className
15
12
  } = {}) {
16
- return cn(TOGGLE_BASE, toggleVariantClasses[variant], toggleSizeClasses[size], className);
13
+ return cn(TOGGLE_BASE, toggleVariantClasses[variant], sizeClasses[size], className);
17
14
  }
18
15
  function Toggle({
19
16
  className,
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/atomic/toggle.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { useControllableState } from \"../../primitives/use-controllable-state\";\nimport { sizeClasses, type Size } from \"../../generated/size\";\nimport { TOGGLE_BASE, toggleVariantClasses, type ToggleVariant } from \"../../generated/toggle\";\n\nexport type ToggleSize = Size;\nexport type { ToggleVariant };\n\nexport interface ToggleVariantsOptions {\n variant?: ToggleVariant;\n size?: ToggleSize;\n className?: string;\n}\n\n/**\n * Returns the fused canonical toggle class string. Reused by `toggle-group` so\n * its items adopt the same styling, mirroring Rust's `toggle_classes`.\n */\nexport function toggleVariants({\n variant = \"bare\",\n size = \"md\",\n className,\n}: ToggleVariantsOptions = {}): string {\n return cn(TOGGLE_BASE, toggleVariantClasses[variant], sizeClasses[size], className);\n}\n\nexport interface ToggleProps\n extends Omit<React.ComponentProps<\"button\">, \"onChange\"> {\n variant?: ToggleVariant;\n size?: ToggleSize;\n pressed?: boolean;\n defaultPressed?: boolean;\n onPressedChange?: (pressed: boolean) => void;\n}\n\nexport function Toggle({\n className,\n variant = \"bare\",\n size = \"md\",\n pressed,\n defaultPressed = false,\n onPressedChange,\n onClick,\n ...props\n}: ToggleProps) {\n const [on, setOn] = useControllableState<boolean>({\n ...(pressed !== undefined ? { value: pressed } : {}),\n defaultValue: defaultPressed,\n ...(onPressedChange ? { onChange: onPressedChange } : {}),\n });\n return (\n <button\n type=\"button\"\n data-slot=\"toggle\"\n data-state={on ? \"on\" : \"off\"}\n aria-pressed={on}\n className={cn(toggleVariants({ variant, size }), className)}\n onClick={(e) => {\n onClick?.(e);\n setOn(!on);\n }}\n {...props}\n />\n );\n}\n"],"mappings":";AAsDI;AApDJ,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB,SAAS,4BAA4B;AACrC,SAAS,mBAA8B;AACvC,SAAS,aAAa,4BAAgD;AAe/D,SAAS,eAAe;AAAA,EAC7B,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AACF,IAA2B,CAAC,GAAW;AACrC,SAAO,GAAG,aAAa,qBAAqB,OAAO,GAAG,YAAY,IAAI,GAAG,SAAS;AACpF;AAWO,SAAS,OAAO;AAAA,EACrB;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP;AAAA,EACA,iBAAiB;AAAA,EACjB;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAgB;AACd,QAAM,CAAC,IAAI,KAAK,IAAI,qBAA8B;AAAA,IAChD,GAAI,YAAY,SAAY,EAAE,OAAO,QAAQ,IAAI,CAAC;AAAA,IAClD,cAAc;AAAA,IACd,GAAI,kBAAkB,EAAE,UAAU,gBAAgB,IAAI,CAAC;AAAA,EACzD,CAAC;AACD,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,aAAU;AAAA,MACV,cAAY,KAAK,OAAO;AAAA,MACxB,gBAAc;AAAA,MACd,WAAW,GAAG,eAAe,EAAE,SAAS,KAAK,CAAC,GAAG,SAAS;AAAA,MAC1D,SAAS,CAAC,MAAM;AACd,kBAAU,CAAC;AACX,cAAM,CAAC,EAAE;AAAA,MACX;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]}
@@ -1,14 +1,14 @@
1
1
  "use client";
2
2
  import { Fragment, jsx } from "react/jsx-runtime";
3
3
  import * as React from "react";
4
- import { cn } from "../lib/cn.js";
5
- import { useControllableState } from "../primitives/use-controllable-state.js";
6
- import { useFloating } from "../primitives/use-floating.js";
7
- import { usePresence } from "../primitives/presence.js";
8
- import { mergeRefs } from "../primitives/merge-refs.js";
9
- import { Portal } from "../primitives/portal.js";
10
- import { Slot } from "../primitives/slot.js";
11
- import { TOOLTIP_CONTENT } from "../generated/tooltip.js";
4
+ import { cn } from "../../lib/cn.js";
5
+ import { useControllableState } from "../../primitives/use-controllable-state.js";
6
+ import { useFloating } from "../../primitives/use-floating.js";
7
+ import { usePresence } from "../../primitives/presence.js";
8
+ import { mergeRefs } from "../../primitives/merge-refs.js";
9
+ import { Portal } from "../../primitives/portal.js";
10
+ import { Slot } from "../../primitives/slot.js";
11
+ import { TOOLTIP_CONTENT } from "../../generated/tooltip.js";
12
12
  const TooltipContext = React.createContext(null);
13
13
  function useTooltip() {
14
14
  const ctx = React.useContext(TooltipContext);
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/atomic/tooltip.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { useControllableState } from \"../../primitives/use-controllable-state\";\nimport { useFloating } from \"../../primitives/use-floating\";\nimport { usePresence } from \"../../primitives/presence\";\nimport { mergeRefs } from \"../../primitives/merge-refs\";\nimport { Portal } from \"../../primitives/portal\";\nimport { Slot } from \"../../primitives/slot\";\nimport { TOOLTIP_CONTENT } from \"../../generated/tooltip\";\nimport type { Side } from \"../../generated/primitives\";\n\ninterface TooltipContextValue {\n open: boolean;\n setOpen: (next: boolean) => void;\n anchorRef: React.RefObject<HTMLElement | null>;\n}\n\nconst TooltipContext = React.createContext<TooltipContextValue | null>(null);\n\nfunction useTooltip(): TooltipContextValue {\n const ctx = React.useContext(TooltipContext);\n if (!ctx) throw new Error(\"Tooltip parts must be used within <Tooltip>\");\n return ctx;\n}\n\nexport interface TooltipProviderProps {\n children?: React.ReactNode;\n}\n\nexport function TooltipProvider({ children }: TooltipProviderProps) {\n return <>{children}</>;\n}\n\nexport interface TooltipProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n children?: React.ReactNode;\n}\n\nexport function Tooltip({ open, defaultOpen = false, onOpenChange, children }: TooltipProps) {\n const [isOpen, setOpen] = useControllableState<boolean>({\n ...(open !== undefined ? { value: open } : {}),\n defaultValue: defaultOpen,\n ...(onOpenChange ? { onChange: onOpenChange } : {}),\n });\n const anchorRef = React.useRef<HTMLElement | null>(null);\n return (\n <TooltipProvider>\n <TooltipContext.Provider value={{ open: isOpen, setOpen, anchorRef }}>\n {children}\n </TooltipContext.Provider>\n </TooltipProvider>\n );\n}\n\nexport interface TooltipTriggerProps extends React.ComponentProps<\"button\"> {\n asChild?: boolean;\n}\n\nexport function TooltipTrigger({\n asChild = false,\n onPointerEnter,\n onPointerLeave,\n onFocus,\n onBlur,\n ...props\n}: TooltipTriggerProps) {\n const { setOpen, anchorRef } = useTooltip();\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n data-slot=\"tooltip-trigger\"\n ref={anchorRef as React.Ref<never>}\n onPointerEnter={(e: React.PointerEvent<HTMLButtonElement>) => {\n onPointerEnter?.(e);\n setOpen(true);\n }}\n onPointerLeave={(e: React.PointerEvent<HTMLButtonElement>) => {\n onPointerLeave?.(e);\n setOpen(false);\n }}\n onFocus={(e: React.FocusEvent<HTMLButtonElement>) => {\n onFocus?.(e);\n setOpen(true);\n }}\n onBlur={(e: React.FocusEvent<HTMLButtonElement>) => {\n onBlur?.(e);\n setOpen(false);\n }}\n {...(props as Record<string, unknown>)}\n />\n );\n}\n\nexport interface TooltipContentProps extends React.ComponentProps<\"div\"> {\n side?: Side;\n sideOffset?: number;\n}\n\nexport function TooltipContent({\n className,\n side: sideProp = \"top\",\n sideOffset = 0,\n children,\n ...props\n}: TooltipContentProps) {\n const { open, anchorRef } = useTooltip();\n const { isPresent, ref: presRef } = usePresence(open);\n const { floatingRef, style, side } = useFloating({\n anchorRef,\n open,\n side: sideProp,\n offset: sideOffset,\n });\n if (!isPresent) return null;\n return (\n <Portal>\n <div\n data-slot=\"tooltip-content\"\n role=\"tooltip\"\n data-state={open ? \"open\" : \"closed\"}\n data-side={side}\n ref={mergeRefs(floatingRef, presRef)}\n style={style}\n className={cn(TOOLTIP_CONTENT, className)}\n {...(props as Record<string, unknown>)}\n >\n {children}\n </div>\n </Portal>\n );\n}\n"],"mappings":";AAgCS;AA9BT,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB,SAAS,4BAA4B;AACrC,SAAS,mBAAmB;AAC5B,SAAS,mBAAmB;AAC5B,SAAS,iBAAiB;AAC1B,SAAS,cAAc;AACvB,SAAS,YAAY;AACrB,SAAS,uBAAuB;AAShC,MAAM,iBAAiB,MAAM,cAA0C,IAAI;AAE3E,SAAS,aAAkC;AACzC,QAAM,MAAM,MAAM,WAAW,cAAc;AAC3C,MAAI,CAAC,IAAK,OAAM,IAAI,MAAM,6CAA6C;AACvE,SAAO;AACT;AAMO,SAAS,gBAAgB,EAAE,SAAS,GAAyB;AAClE,SAAO,gCAAG,UAAS;AACrB;AASO,SAAS,QAAQ,EAAE,MAAM,cAAc,OAAO,cAAc,SAAS,GAAiB;AAC3F,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,YAAY,MAAM,OAA2B,IAAI;AACvD,SACE,oBAAC,mBACC,8BAAC,eAAe,UAAf,EAAwB,OAAO,EAAE,MAAM,QAAQ,SAAS,UAAU,GAChE,UACH,GACF;AAEJ;AAMO,SAAS,eAAe;AAAA,EAC7B,UAAU;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAwB;AACtB,QAAM,EAAE,SAAS,UAAU,IAAI,WAAW;AAC1C,QAAM,OAAO,UAAU,OAAO;AAC9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,KAAK;AAAA,MACL,gBAAgB,CAAC,MAA6C;AAC5D,yBAAiB,CAAC;AAClB,gBAAQ,IAAI;AAAA,MACd;AAAA,MACA,gBAAgB,CAAC,MAA6C;AAC5D,yBAAiB,CAAC;AAClB,gBAAQ,KAAK;AAAA,MACf;AAAA,MACA,SAAS,CAAC,MAA2C;AACnD,kBAAU,CAAC;AACX,gBAAQ,IAAI;AAAA,MACd;AAAA,MACA,QAAQ,CAAC,MAA2C;AAClD,iBAAS,CAAC;AACV,gBAAQ,KAAK;AAAA,MACf;AAAA,MACC,GAAI;AAAA;AAAA,EACP;AAEJ;AAOO,SAAS,eAAe;AAAA,EAC7B;AAAA,EACA,MAAM,WAAW;AAAA,EACjB,aAAa;AAAA,EACb;AAAA,EACA,GAAG;AACL,GAAwB;AACtB,QAAM,EAAE,MAAM,UAAU,IAAI,WAAW;AACvC,QAAM,EAAE,WAAW,KAAK,QAAQ,IAAI,YAAY,IAAI;AACpD,QAAM,EAAE,aAAa,OAAO,KAAK,IAAI,YAAY;AAAA,IAC/C;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,QAAQ;AAAA,EACV,CAAC;AACD,MAAI,CAAC,UAAW,QAAO;AACvB,SACE,oBAAC,UACC;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,MAAK;AAAA,MACL,cAAY,OAAO,SAAS;AAAA,MAC5B,aAAW;AAAA,MACX,KAAK,UAAU,aAAa,OAAO;AAAA,MACnC;AAAA,MACA,WAAW,GAAG,iBAAiB,SAAS;AAAA,MACvC,GAAI;AAAA,MAEJ;AAAA;AAAA,EACH,GACF;AAEJ;","names":[]}
@@ -1,6 +1,6 @@
1
1
  "use client";
2
2
  import * as React from "react";
3
- import { useReducedMotion } from "../primitives/use-reduced-motion.js";
3
+ import { useReducedMotion } from "../../primitives/use-reduced-motion.js";
4
4
  const easeOutCubic = (p) => 1 - (1 - p) ** 3;
5
5
  function useCountTween(value, options = {}) {
6
6
  const { duration = 800, easing = easeOutCubic, from = 0, animateOnMount = false } = options;
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/atomic/use-count-tween.ts"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { useReducedMotion } from \"../../primitives/use-reduced-motion\";\n\nexport interface CountTweenOptions {\n /** Milliseconds from the old value to the new one. Default `800`. */\n duration?: number;\n /** Maps progress 0..1 to eased progress 0..1. Default ease-out cubic. */\n easing?: (progress: number) => number;\n /** Count up from here on the first render. Default `0`; only read with `animateOnMount`. */\n from?: number;\n /** Tween on the first render too. Off by default so the server markup is the final value. */\n animateOnMount?: boolean;\n}\n\nconst easeOutCubic = (p: number): number => 1 - (1 - p) ** 3;\n\n/**\n * The number a count-up is showing right now, for custom renderers (charts,\n * labels). It returns `value` itself on the first render and whenever nothing\n * is in flight, so a server render prints the final figure. A new `value`\n * mid-flight restarts from what is on screen. Reduced motion returns `value`\n * with no frames at all.\n */\nexport function useCountTween(value: number, options: CountTweenOptions = {}): number {\n const { duration = 800, easing = easeOutCubic, from = 0, animateOnMount = false } = options;\n const reduced = useReducedMotion();\n const [shown, setShown] = React.useState(value);\n // The frame loop reads the on-screen value without being a dependency of itself.\n const onScreen = React.useRef(value);\n const mounted = React.useRef(false);\n const easingRef = React.useRef(easing);\n easingRef.current = easing;\n\n React.useLayoutEffect(() => {\n const first = !mounted.current;\n mounted.current = true;\n const start = first ? (animateOnMount ? from : value) : onScreen.current;\n const paint = (v: number) => {\n onScreen.current = v;\n setShown(v);\n };\n if (reduced || duration <= 0 || start === value || !Number.isFinite(start) || !Number.isFinite(value)) {\n paint(value);\n return;\n }\n paint(start);\n let frame = 0;\n let t0: number | null = null;\n const tick = (now: number) => {\n t0 ??= now;\n const p = Math.min(1, (now - t0) / duration);\n paint(p >= 1 ? value : start + (value - start) * easingRef.current(p));\n if (p < 1) frame = requestAnimationFrame(tick);\n };\n frame = requestAnimationFrame(tick);\n return () => cancelAnimationFrame(frame);\n }, [value, duration, reduced, animateOnMount, from]);\n\n return reduced ? value : shown;\n}\n"],"mappings":";AAEA,YAAY,WAAW;AACvB,SAAS,wBAAwB;AAajC,MAAM,eAAe,CAAC,MAAsB,KAAK,IAAI,MAAM;AASpD,SAAS,cAAc,OAAe,UAA6B,CAAC,GAAW;AACpF,QAAM,EAAE,WAAW,KAAK,SAAS,cAAc,OAAO,GAAG,iBAAiB,MAAM,IAAI;AACpF,QAAM,UAAU,iBAAiB;AACjC,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,KAAK;AAE9C,QAAM,WAAW,MAAM,OAAO,KAAK;AACnC,QAAM,UAAU,MAAM,OAAO,KAAK;AAClC,QAAM,YAAY,MAAM,OAAO,MAAM;AACrC,YAAU,UAAU;AAEpB,QAAM,gBAAgB,MAAM;AAC1B,UAAM,QAAQ,CAAC,QAAQ;AACvB,YAAQ,UAAU;AAClB,UAAM,QAAQ,QAAS,iBAAiB,OAAO,QAAS,SAAS;AACjE,UAAM,QAAQ,CAAC,MAAc;AAC3B,eAAS,UAAU;AACnB,eAAS,CAAC;AAAA,IACZ;AACA,QAAI,WAAW,YAAY,KAAK,UAAU,SAAS,CAAC,OAAO,SAAS,KAAK,KAAK,CAAC,OAAO,SAAS,KAAK,GAAG;AACrG,YAAM,KAAK;AACX;AAAA,IACF;AACA,UAAM,KAAK;AACX,QAAI,QAAQ;AACZ,QAAI,KAAoB;AACxB,UAAM,OAAO,CAAC,QAAgB;AAC5B,aAAO;AACP,YAAM,IAAI,KAAK,IAAI,IAAI,MAAM,MAAM,QAAQ;AAC3C,YAAM,KAAK,IAAI,QAAQ,SAAS,QAAQ,SAAS,UAAU,QAAQ,CAAC,CAAC;AACrE,UAAI,IAAI,EAAG,SAAQ,sBAAsB,IAAI;AAAA,IAC/C;AACA,YAAQ,sBAAsB,IAAI;AAClC,WAAO,MAAM,qBAAqB,KAAK;AAAA,EACzC,GAAG,CAAC,OAAO,UAAU,SAAS,gBAAgB,IAAI,CAAC;AAEnD,SAAO,UAAU,QAAQ;AAC3B;","names":[]}
@@ -1,16 +1,16 @@
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";
4
+ import { cn } from "../../lib/cn.js";
5
5
  import {
6
6
  digitGlyphs,
7
7
  mergeItems,
8
8
  resolveDirection,
9
9
  splitNumber
10
- } from "../lib/number-parts.js";
11
- import { useReducedMotion } from "../primitives/use-reduced-motion.js";
12
- import { EDGE_MS, SPIN_MS, Slot } from "./animated-number-columns.js";
13
- import { useCountTween } from "./use-count-tween.js";
10
+ } from "../../lib/number-parts.js";
11
+ import { useReducedMotion } from "../../primitives/use-reduced-motion.js";
12
+ import { EDGE_MS, SPIN_MS, Slot } from "../atomic/animated-number-columns.js";
13
+ import { useCountTween } from "../atomic/use-count-tween.js";
14
14
  function AnimatedNumber({
15
15
  value,
16
16
  format,
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/derived/animated-number.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport {\n digitGlyphs,\n mergeItems,\n resolveDirection,\n splitNumber,\n type NumberItem,\n type RollDirection,\n} from \"../../lib/number-parts\";\nimport { useReducedMotion } from \"../../primitives/use-reduced-motion\";\nimport { EDGE_MS, SPIN_MS, Slot } from \"../atomic/animated-number-columns\";\nimport { useCountTween } from \"../atomic/use-count-tween\";\n\nexport interface AnimatedNumberProps\n extends Omit<React.HTMLAttributes<HTMLSpanElement>, \"children\" | \"prefix\"> {\n value: number;\n /** Passed to `Intl.NumberFormat`: currency, percent, compact, `signDisplay`... */\n format?: Intl.NumberFormatOptions;\n locales?: Intl.LocalesArgument;\n /** `roll`: digit columns spin. `count`: the number is tweened and re-formatted each frame. Default `roll`. */\n mode?: \"roll\" | \"count\";\n /**\n * Roll only. `1` every column spins up, `-1` down, `0` each column takes its\n * shorter way. Default: up when the value rose, down when it fell.\n */\n trend?: RollDirection;\n /** Milliseconds one change takes: the spin in `roll` (default 750), the whole tween in `count` (default 800). */\n duration?: number;\n prefix?: React.ReactNode;\n suffix?: React.ReactNode;\n /** Announce each new value politely. Off by default: a ticker would talk over the page. */\n live?: boolean;\n /** Animate the first render from `from`. The server markup still prints `value`. */\n animateOnMount?: boolean;\n /** The first-render start with `animateOnMount`. Default `0`. */\n from?: number;\n}\n\n/**\n * A number that animates when `value` changes. `roll` (default) spins each\n * digit column like an odometer; `count` tweens the number itself. Both format\n * with `Intl.NumberFormat`, inherit font and colour, and swap instantly under\n * `prefers-reduced-motion`. The final formatted value is in the DOM once, as\n * text for assistive tech and for copying; the moving glyphs are `aria-hidden`.\n */\nexport function AnimatedNumber({\n value,\n format,\n locales,\n mode = \"roll\",\n trend,\n duration,\n prefix,\n suffix,\n live = false,\n animateOnMount = false,\n from = 0,\n className,\n style,\n ...props\n}: AnimatedNumberProps) {\n // Callers pass `format` inline; keying on its content keeps one formatter per distinct options.\n const formatKey = JSON.stringify(format ?? null);\n const localeKey = Array.isArray(locales) ? locales.join(\",\") : String(locales ?? \"\");\n const formatter = React.useMemo(\n () => new Intl.NumberFormat(locales, format),\n [localeKey, formatKey],\n );\n const text = formatter.format(value);\n return (\n <span\n data-slot=\"animated-number\"\n data-mode={mode}\n className={cn(\"relative inline-flex items-baseline tabular-nums\", className)}\n style={style}\n {...props}\n >\n {prefix}\n <span\n data-slot=\"animated-number-text\"\n className=\"sr-only\"\n aria-live={live ? \"polite\" : undefined}\n aria-atomic={live ? true : undefined}\n >\n {text}\n </span>\n <span aria-hidden className=\"inline-flex select-none items-baseline\">\n {mode === \"count\" ? (\n <CountView\n value={value}\n formatter={formatter}\n from={from}\n animateOnMount={animateOnMount}\n {...(duration === undefined ? {} : { duration })}\n />\n ) : (\n <RollView\n value={value}\n formatter={formatter}\n from={from}\n animateOnMount={animateOnMount}\n spin={duration ?? SPIN_MS}\n {...(trend === undefined ? {} : { trend })}\n />\n )}\n </span>\n {suffix}\n </span>\n );\n}\n\ninterface CountViewProps {\n value: number;\n formatter: Intl.NumberFormat;\n from: number;\n animateOnMount: boolean;\n duration?: number;\n}\n\nfunction CountView({ value, formatter, from, animateOnMount, duration }: CountViewProps) {\n const shown = useCountTween(value, {\n from,\n animateOnMount,\n ...(duration === undefined ? {} : { duration }),\n });\n return <span>{formatter.format(shown)}</span>;\n}\n\ninterface RollState {\n formatter: Intl.NumberFormat;\n value: number;\n direction: RollDirection;\n items: NumberItem[];\n}\n\ninterface RollViewProps {\n value: number;\n formatter: Intl.NumberFormat;\n trend?: RollDirection;\n spin: number;\n from: number;\n animateOnMount: boolean;\n}\n\n// With `animateOnMount` the first client commit shows `from` and the value\n// arrives two frames later: one frame is not enough for the browser to have\n// painted `from` and so have a start for the transition.\nfunction useMountLead(enabled: boolean): boolean {\n const [lead, setLead] = React.useState(false);\n const started = React.useRef(false);\n React.useLayoutEffect(() => {\n if (!enabled || started.current) return;\n started.current = true;\n setLead(true);\n let inner = 0;\n const outer = requestAnimationFrame(() => {\n inner = requestAnimationFrame(() => setLead(false));\n });\n return () => {\n cancelAnimationFrame(outer);\n cancelAnimationFrame(inner);\n started.current = false;\n setLead(false);\n };\n }, [enabled]);\n return lead;\n}\n\nfunction RollView({ value, formatter, trend, spin, from, animateOnMount }: RollViewProps) {\n const motion = !useReducedMotion();\n const lead = useMountLead(animateOnMount && motion);\n const target = lead ? from : value;\n const glyphs = React.useMemo(() => digitGlyphs(formatter), [formatter]);\n const [state, setState] = React.useState<RollState>(() => ({\n formatter,\n value: target,\n direction: 0,\n items: splitNumber(formatter, target, glyphs).map((part) => ({ part, exiting: false, fresh: false })),\n }));\n\n let current = state;\n if (state.formatter !== formatter || state.value !== target) {\n const sameFormat = state.formatter === formatter;\n // `lead` is a jump to `from`, not a change the reader should watch.\n const animate = motion && sameFormat && !lead;\n current = {\n formatter,\n value: target,\n direction: sameFormat ? resolveDirection(trend, state.value, target) : 0,\n items: mergeItems(state.items, splitNumber(formatter, target, glyphs), animate),\n };\n setState(current);\n }\n\n const leaving = current.items.some((item) => item.exiting);\n React.useEffect(() => {\n if (!leaving) return;\n const id = setTimeout(\n () => setState((s) => ({ ...s, items: s.items.filter((item) => !item.exiting) })),\n EDGE_MS + 50,\n );\n return () => clearTimeout(id);\n }, [leaving, current.items]);\n\n return (\n <>\n {current.items.map((item) => (\n <Slot\n key={item.part.key}\n item={item}\n glyphs={glyphs}\n direction={current.direction}\n motion={motion}\n spin={spin}\n />\n ))}\n </>\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 { Button } from "./button.js";
6
- import { useControllableState } from "../primitives/use-controllable-state.js";
4
+ import { cn } from "../../lib/cn.js";
5
+ import { Button } from "../atomic/button.js";
6
+ import { useControllableState } from "../../primitives/use-controllable-state.js";
7
7
  import {
8
8
  CAROUSEL_CONTENT_TRACK,
9
9
  CAROUSEL_CONTENT_TRACK_HORIZONTAL,
@@ -19,7 +19,9 @@ import {
19
19
  CAROUSEL_NEXT_VERTICAL,
20
20
  CAROUSEL_PREVIOUS_HORIZONTAL,
21
21
  CAROUSEL_PREVIOUS_VERTICAL
22
- } from "../generated/carousel.js";
22
+ } from "../../generated/carousel.js";
23
+ import * as copy from "../../generated/copy.js";
24
+ import { iconShapes } from "../../icons/icon-shapes.js";
23
25
  const CarouselContext = React.createContext(null);
24
26
  function useCarousel() {
25
27
  const context = React.useContext(CarouselContext);
@@ -176,7 +178,6 @@ function CarouselPrevious({
176
178
  return /* @__PURE__ */ jsxs(
177
179
  Button,
178
180
  {
179
- "data-slot": "carousel-previous",
180
181
  variant,
181
182
  size,
182
183
  icon,
@@ -200,10 +201,10 @@ function CarouselPrevious({
200
201
  strokeLinecap: "round",
201
202
  strokeLinejoin: "round",
202
203
  "aria-hidden": "true",
203
- children: /* @__PURE__ */ jsx("path", { d: "m15 18-6-6 6-6" })
204
+ children: iconShapes("chevron-left")
204
205
  }
205
206
  ),
206
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Previous slide" })
207
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: copy.CAROUSEL_PREVIOUS })
207
208
  ]
208
209
  }
209
210
  );
@@ -219,7 +220,6 @@ function CarouselNext({
219
220
  return /* @__PURE__ */ jsxs(
220
221
  Button,
221
222
  {
222
- "data-slot": "carousel-next",
223
223
  variant,
224
224
  size,
225
225
  icon,
@@ -243,10 +243,10 @@ function CarouselNext({
243
243
  strokeLinecap: "round",
244
244
  strokeLinejoin: "round",
245
245
  "aria-hidden": "true",
246
- children: /* @__PURE__ */ jsx("path", { d: "m9 18 6-6-6-6" })
246
+ children: iconShapes("chevron-right")
247
247
  }
248
248
  ),
249
- /* @__PURE__ */ jsx("span", { className: "sr-only", children: "Next slide" })
249
+ /* @__PURE__ */ jsx("span", { className: "sr-only", children: copy.CAROUSEL_NEXT })
250
250
  ]
251
251
  }
252
252
  );
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/derived/carousel.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport { Button, type ButtonProps } from \"../atomic/button\";\nimport { useControllableState } from \"../../primitives/use-controllable-state\";\nimport {\n CAROUSEL_CONTENT_TRACK,\n CAROUSEL_CONTENT_TRACK_HORIZONTAL,\n CAROUSEL_CONTENT_TRACK_VERTICAL,\n CAROUSEL_CONTENT_VIEWPORT,\n CAROUSEL_EDGE_FADE_NEXT,\n CAROUSEL_EDGE_FADE_PREV,\n CAROUSEL_ITEM,\n CAROUSEL_ITEM_HORIZONTAL,\n CAROUSEL_ITEM_VERTICAL,\n CAROUSEL_NAV,\n CAROUSEL_NEXT_HORIZONTAL,\n CAROUSEL_NEXT_VERTICAL,\n CAROUSEL_PREVIOUS_HORIZONTAL,\n CAROUSEL_PREVIOUS_VERTICAL,\n} from \"../../generated/carousel\";\nimport type { Orientation } from \"../../generated/orientation\";\nimport * as copy from \"../../generated/copy\";\nimport { iconShapes } from \"../../icons/icon-shapes\";\n\n\ntype CarouselContextProps = {\n orientation: Orientation;\n index: number;\n count: number;\n setCount: (count: number) => void;\n scrollPrev: () => void;\n scrollNext: () => void;\n canScrollPrev: boolean;\n canScrollNext: boolean;\n};\n\nconst CarouselContext = React.createContext<CarouselContextProps | null>(null);\n\nfunction useCarousel() {\n const context = React.useContext(CarouselContext);\n if (!context) {\n throw new Error(\"useCarousel must be used within a <Carousel />\");\n }\n return context;\n}\n\nexport interface CarouselProps extends React.ComponentProps<\"div\"> {\n orientation?: Orientation;\n index?: number;\n defaultIndex?: number;\n onIndexChange?: (index: number) => void;\n}\n\nexport function Carousel({\n orientation = \"horizontal\",\n index: indexProp,\n defaultIndex = 0,\n onIndexChange,\n className,\n children,\n onKeyDown,\n ...props\n}: CarouselProps) {\n const [index, setIndex] = useControllableState<number>({\n value: indexProp,\n defaultValue: defaultIndex,\n onChange: onIndexChange,\n });\n const [count, setCount] = React.useState(0);\n\n const canScrollPrev = index > 0;\n const canScrollNext = index < count - 1;\n\n const scrollPrev = React.useCallback(() => {\n if (index > 0) setIndex(index - 1);\n }, [index, setIndex]);\n\n const scrollNext = React.useCallback(() => {\n if (index < count - 1) setIndex(index + 1);\n }, [index, count, setIndex]);\n\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n if (event.key === \"ArrowLeft\") {\n event.preventDefault();\n scrollPrev();\n } else if (event.key === \"ArrowRight\") {\n event.preventDefault();\n scrollNext();\n }\n onKeyDown?.(event);\n };\n\n return (\n <CarouselContext.Provider\n value={{\n orientation,\n index,\n count,\n setCount,\n scrollPrev,\n scrollNext,\n canScrollPrev,\n canScrollNext,\n }}\n >\n <div\n onKeyDownCapture={handleKeyDown}\n className={cn(\"relative\", className)}\n role=\"region\"\n aria-roledescription=\"carousel\"\n tabIndex={0}\n data-slot=\"carousel\"\n {...props}\n >\n {children}\n </div>\n </CarouselContext.Provider>\n );\n}\n\nexport function CarouselContent({\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\">) {\n const { orientation, index, setCount } = useCarousel();\n const childCount = React.Children.count(children);\n\n React.useEffect(() => {\n setCount(childCount);\n }, [childCount, setCount]);\n\n // drag/momentum: omitted vs embla — see README Limitations\n const transform =\n orientation === \"horizontal\"\n ? `translate3d(-${index * 100}%, 0, 0)`\n : `translate3d(0, -${index * 100}%, 0)`;\n\n return (\n <div className={CAROUSEL_CONTENT_VIEWPORT} data-slot=\"carousel-content\">\n <div\n className={cn(\n CAROUSEL_CONTENT_TRACK,\n orientation === \"horizontal\"\n ? CAROUSEL_CONTENT_TRACK_HORIZONTAL\n : CAROUSEL_CONTENT_TRACK_VERTICAL,\n className,\n )}\n style={{ transform }}\n {...props}\n >\n {children}\n </div>\n </div>\n );\n}\n\nexport function CarouselItem({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n const { orientation } = useCarousel();\n\n return (\n <div\n role=\"group\"\n aria-roledescription=\"slide\"\n data-slot=\"carousel-item\"\n className={cn(\n CAROUSEL_ITEM,\n orientation === \"horizontal\" ? CAROUSEL_ITEM_HORIZONTAL : CAROUSEL_ITEM_VERTICAL,\n className,\n )}\n {...props}\n />\n );\n}\n\n/**\n * Netflix-style edge scrims that dissolve the current slide into the surface\n * colour, signalling adjacent slides without revealing them. Each side shows\n * only when there is somewhere to scroll. Drop inside a <Carousel>.\n */\nexport function CarouselEdgeFade({\n className,\n}: {\n className?: string;\n}) {\n const { canScrollPrev, canScrollNext } = useCarousel();\n\n return (\n <>\n <div\n aria-hidden\n className={cn(\n CAROUSEL_EDGE_FADE_PREV,\n canScrollPrev ? \"opacity-100\" : \"opacity-0\",\n className,\n )}\n />\n <div\n aria-hidden\n className={cn(\n CAROUSEL_EDGE_FADE_NEXT,\n canScrollNext ? \"opacity-100\" : \"opacity-0\",\n className,\n )}\n />\n </>\n );\n}\n\nexport function CarouselPrevious({\n className,\n variant = \"outline\",\n size = \"md\",\n icon = true,\n ...props\n}: ButtonProps) {\n const { orientation, scrollPrev, canScrollPrev } = useCarousel();\n\n return (\n <Button\n variant={variant}\n size={size}\n icon={icon}\n className={cn(\n CAROUSEL_NAV,\n orientation === \"horizontal\"\n ? CAROUSEL_PREVIOUS_HORIZONTAL\n : CAROUSEL_PREVIOUS_VERTICAL,\n className,\n )}\n disabled={!canScrollPrev}\n onClick={scrollPrev}\n {...props}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {iconShapes(\"chevron-left\")}\n </svg>\n <span className=\"sr-only\">{copy.CAROUSEL_PREVIOUS}</span>\n </Button>\n );\n}\n\nexport function CarouselNext({\n className,\n variant = \"outline\",\n size = \"md\",\n icon = true,\n ...props\n}: ButtonProps) {\n const { orientation, scrollNext, canScrollNext } = useCarousel();\n\n return (\n <Button\n variant={variant}\n size={size}\n icon={icon}\n className={cn(\n CAROUSEL_NAV,\n orientation === \"horizontal\"\n ? CAROUSEL_NEXT_HORIZONTAL\n : CAROUSEL_NEXT_VERTICAL,\n className,\n )}\n disabled={!canScrollNext}\n onClick={scrollNext}\n {...props}\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n {iconShapes(\"chevron-right\")}\n </svg>\n <span className=\"sr-only\">{copy.CAROUSEL_NEXT}</span>\n </Button>\n );\n}\n"],"mappings":";AA2GM,SAsFF,UAtFE,KAsFF,YAtFE;AAzGN,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB,SAAS,cAAgC;AACzC,SAAS,4BAA4B;AACrC;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;AAEP,YAAY,UAAU;AACtB,SAAS,kBAAkB;AAc3B,MAAM,kBAAkB,MAAM,cAA2C,IAAI;AAE7E,SAAS,cAAc;AACrB,QAAM,UAAU,MAAM,WAAW,eAAe;AAChD,MAAI,CAAC,SAAS;AACZ,UAAM,IAAI,MAAM,gDAAgD;AAAA,EAClE;AACA,SAAO;AACT;AASO,SAAS,SAAS;AAAA,EACvB,cAAc;AAAA,EACd,OAAO;AAAA,EACP,eAAe;AAAA,EACf;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAkB;AAChB,QAAM,CAAC,OAAO,QAAQ,IAAI,qBAA6B;AAAA,IACrD,OAAO;AAAA,IACP,cAAc;AAAA,IACd,UAAU;AAAA,EACZ,CAAC;AACD,QAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,SAAS,CAAC;AAE1C,QAAM,gBAAgB,QAAQ;AAC9B,QAAM,gBAAgB,QAAQ,QAAQ;AAEtC,QAAM,aAAa,MAAM,YAAY,MAAM;AACzC,QAAI,QAAQ,EAAG,UAAS,QAAQ,CAAC;AAAA,EACnC,GAAG,CAAC,OAAO,QAAQ,CAAC;AAEpB,QAAM,aAAa,MAAM,YAAY,MAAM;AACzC,QAAI,QAAQ,QAAQ,EAAG,UAAS,QAAQ,CAAC;AAAA,EAC3C,GAAG,CAAC,OAAO,OAAO,QAAQ,CAAC;AAE3B,QAAM,gBAAgB,CAAC,UAA+C;AACpE,QAAI,MAAM,QAAQ,aAAa;AAC7B,YAAM,eAAe;AACrB,iBAAW;AAAA,IACb,WAAW,MAAM,QAAQ,cAAc;AACrC,YAAM,eAAe;AACrB,iBAAW;AAAA,IACb;AACA,gBAAY,KAAK;AAAA,EACnB;AAEA,SACE;AAAA,IAAC,gBAAgB;AAAA,IAAhB;AAAA,MACC,OAAO;AAAA,QACL;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,MAEA;AAAA,QAAC;AAAA;AAAA,UACC,kBAAkB;AAAA,UAClB,WAAW,GAAG,YAAY,SAAS;AAAA,UACnC,MAAK;AAAA,UACL,wBAAqB;AAAA,UACrB,UAAU;AAAA,UACV,aAAU;AAAA,UACT,GAAG;AAAA,UAEH;AAAA;AAAA,MACH;AAAA;AAAA,EACF;AAEJ;AAEO,SAAS,gBAAgB;AAAA,EAC9B;AAAA,EACA;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,QAAM,EAAE,aAAa,OAAO,SAAS,IAAI,YAAY;AACrD,QAAM,aAAa,MAAM,SAAS,MAAM,QAAQ;AAEhD,QAAM,UAAU,MAAM;AACpB,aAAS,UAAU;AAAA,EACrB,GAAG,CAAC,YAAY,QAAQ,CAAC;AAGzB,QAAM,YACJ,gBAAgB,eACZ,gBAAgB,QAAQ,GAAG,aAC3B,mBAAmB,QAAQ,GAAG;AAEpC,SACE,oBAAC,SAAI,WAAW,2BAA2B,aAAU,oBACnD;AAAA,IAAC;AAAA;AAAA,MACC,WAAW;AAAA,QACT;AAAA,QACA,gBAAgB,eACZ,oCACA;AAAA,QACJ;AAAA,MACF;AAAA,MACA,OAAO,EAAE,UAAU;AAAA,MAClB,GAAG;AAAA,MAEH;AAAA;AAAA,EACH,GACF;AAEJ;AAEO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,QAAM,EAAE,YAAY,IAAI,YAAY;AAEpC,SACE;AAAA,IAAC;AAAA;AAAA,MACC,MAAK;AAAA,MACL,wBAAqB;AAAA,MACrB,aAAU;AAAA,MACV,WAAW;AAAA,QACT;AAAA,QACA,gBAAgB,eAAe,2BAA2B;AAAA,QAC1D;AAAA,MACF;AAAA,MACC,GAAG;AAAA;AAAA,EACN;AAEJ;AAOO,SAAS,iBAAiB;AAAA,EAC/B;AACF,GAEG;AACD,QAAM,EAAE,eAAe,cAAc,IAAI,YAAY;AAErD,SACE,iCACE;AAAA;AAAA,MAAC;AAAA;AAAA,QACC,eAAW;AAAA,QACX,WAAW;AAAA,UACT;AAAA,UACA,gBAAgB,gBAAgB;AAAA,UAChC;AAAA,QACF;AAAA;AAAA,IACF;AAAA,IACA;AAAA,MAAC;AAAA;AAAA,QACC,eAAW;AAAA,QACX,WAAW;AAAA,UACT;AAAA,UACA,gBAAgB,gBAAgB;AAAA,UAChC;AAAA,QACF;AAAA;AAAA,IACF;AAAA,KACF;AAEJ;AAEO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP,GAAG;AACL,GAAgB;AACd,QAAM,EAAE,aAAa,YAAY,cAAc,IAAI,YAAY;AAE/D,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,gBAAgB,eACZ,+BACA;AAAA,QACJ;AAAA,MACF;AAAA,MACA,UAAU,CAAC;AAAA,MACX,SAAS;AAAA,MACR,GAAG;AAAA,MAEJ;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,QAAO;AAAA,YACP,aAAY;AAAA,YACZ,eAAc;AAAA,YACd,gBAAe;AAAA,YACf,eAAY;AAAA,YAEX,qBAAW,cAAc;AAAA;AAAA,QAC5B;AAAA,QACA,oBAAC,UAAK,WAAU,WAAW,eAAK,mBAAkB;AAAA;AAAA;AAAA,EACpD;AAEJ;AAEO,SAAS,aAAa;AAAA,EAC3B;AAAA,EACA,UAAU;AAAA,EACV,OAAO;AAAA,EACP,OAAO;AAAA,EACP,GAAG;AACL,GAAgB;AACd,QAAM,EAAE,aAAa,YAAY,cAAc,IAAI,YAAY;AAE/D,SACE;AAAA,IAAC;AAAA;AAAA,MACC;AAAA,MACA;AAAA,MACA;AAAA,MACA,WAAW;AAAA,QACT;AAAA,QACA,gBAAgB,eACZ,2BACA;AAAA,QACJ;AAAA,MACF;AAAA,MACA,UAAU,CAAC;AAAA,MACX,SAAS;AAAA,MACR,GAAG;AAAA,MAEJ;AAAA;AAAA,UAAC;AAAA;AAAA,YACC,OAAM;AAAA,YACN,SAAQ;AAAA,YACR,MAAK;AAAA,YACL,QAAO;AAAA,YACP,aAAY;AAAA,YACZ,eAAc;AAAA,YACd,gBAAe;AAAA,YACf,eAAY;AAAA,YAEX,qBAAW,eAAe;AAAA;AAAA,QAC7B;AAAA,QACA,oBAAC,UAAK,WAAU,WAAW,eAAK,eAAc;AAAA;AAAA;AAAA,EAChD;AAEJ;","names":[]}
@@ -8,10 +8,11 @@ import {
8
8
  COMMAND_PALETTE_HINTS,
9
9
  COMMAND_PALETTE_LABEL,
10
10
  COMMAND_PALETTE_LIST,
11
- COMMAND_PALETTE_TITLE
12
- } from "../generated/command-palette.js";
13
- import { cn } from "../lib/cn.js";
14
- import { useControllableState } from "../primitives/use-controllable-state.js";
11
+ COMMAND_PALETTE_TITLE,
12
+ COMMAND_PALETTE_LABELS
13
+ } from "../../generated/command-palette.js";
14
+ import { cn } from "../../lib/cn.js";
15
+ import { useControllableState } from "../../primitives/use-controllable-state.js";
15
16
  import {
16
17
  Command,
17
18
  CommandEmpty,
@@ -21,9 +22,9 @@ import {
21
22
  CommandList,
22
23
  CommandSeparator,
23
24
  CommandShortcut
24
- } from "./command.js";
25
- import { Dialog, DialogContent, DialogTitle } from "./dialog.js";
26
- import { Kbd } from "./kbd.js";
25
+ } from "../atomic/command.js";
26
+ import { Dialog, DialogContent, DialogTitle } from "../atomic/dialog.js";
27
+ import { Kbd } from "../atomic/kbd.js";
27
28
  function CommandPalette({
28
29
  open,
29
30
  defaultOpen = false,
@@ -43,11 +44,11 @@ function CommandPalette({
43
44
  showCloseButton: false,
44
45
  className: cn(COMMAND_PALETTE_CONTENT, className),
45
46
  children: [
46
- /* @__PURE__ */ jsx(DialogTitle, { className: COMMAND_PALETTE_TITLE, children: labels.title ?? "Command palette" }),
47
+ /* @__PURE__ */ jsx(DialogTitle, { className: COMMAND_PALETTE_TITLE, children: labels.title ?? COMMAND_PALETTE_LABELS.title }),
47
48
  /* @__PURE__ */ jsxs(Command, { className: COMMAND_PALETTE_COMMAND, children: [
48
- /* @__PURE__ */ jsx(CommandInput, { placeholder: labels.placeholder ?? "Type a command or search\u2026" }),
49
+ /* @__PURE__ */ jsx(CommandInput, { placeholder: labels.placeholder ?? COMMAND_PALETTE_LABELS.placeholder }),
49
50
  /* @__PURE__ */ jsxs(CommandList, { className: COMMAND_PALETTE_LIST, children: [
50
- /* @__PURE__ */ jsx(CommandEmpty, { children: labels.empty ?? "No results." }),
51
+ /* @__PURE__ */ jsx(CommandEmpty, { children: labels.empty ?? COMMAND_PALETTE_LABELS.empty }),
51
52
  groups.map((group, i) => /* @__PURE__ */ jsxs(React.Fragment, { children: [
52
53
  i > 0 && /* @__PURE__ */ jsx(CommandSeparator, {}),
53
54
  /* @__PURE__ */ jsx(CommandGroup, { ...group.heading !== void 0 ? { heading: group.heading } : {}, children: group.items.map((item) => /* @__PURE__ */ jsxs(
@@ -78,15 +79,15 @@ function CommandPalette({
78
79
  children: [
79
80
  /* @__PURE__ */ jsxs("span", { className: COMMAND_PALETTE_HINT, children: [
80
81
  /* @__PURE__ */ jsx(Kbd, { children: "\u2191\u2193" }),
81
- labels.navigate ?? "navigate"
82
+ labels.navigate ?? COMMAND_PALETTE_LABELS.navigate
82
83
  ] }),
83
84
  /* @__PURE__ */ jsxs("span", { className: COMMAND_PALETTE_HINT, children: [
84
85
  /* @__PURE__ */ jsx(Kbd, { children: "\u21B5" }),
85
- labels.select ?? "select"
86
+ labels.select ?? COMMAND_PALETTE_LABELS.select
86
87
  ] }),
87
88
  /* @__PURE__ */ jsxs("span", { className: COMMAND_PALETTE_HINT, children: [
88
89
  /* @__PURE__ */ jsx(Kbd, { children: "esc" }),
89
- labels.close ?? "close"
90
+ labels.close ?? COMMAND_PALETTE_LABELS.close
90
91
  ] })
91
92
  ]
92
93
  }
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/derived/command-palette.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n COMMAND_PALETTE_COMMAND,\n COMMAND_PALETTE_CONTENT,\n COMMAND_PALETTE_HINT,\n COMMAND_PALETTE_HINTS,\n COMMAND_PALETTE_LABEL,\n COMMAND_PALETTE_LIST,\n COMMAND_PALETTE_TITLE,\n COMMAND_PALETTE_LABELS,\n} from \"../../generated/command-palette\";\nimport { cn } from \"../../lib/cn\";\nimport { useControllableState } from \"../../primitives/use-controllable-state\";\nimport {\n Command,\n CommandEmpty,\n CommandGroup,\n CommandInput,\n CommandItem,\n CommandList,\n CommandSeparator,\n CommandShortcut,\n} from \"../atomic/command\";\nimport { Dialog, DialogContent, DialogTitle } from \"../atomic/dialog\";\nimport { Kbd } from \"../atomic/kbd\";\n\nexport interface CommandPaletteItem {\n id: string;\n label: string;\n icon?: React.ReactNode;\n /** Shown at the row end, e.g. \"⌘N\". */\n shortcut?: string;\n /** Extra words the search matches besides the label. */\n keywords?: readonly string[];\n disabled?: boolean;\n onSelect: () => void;\n}\n\nexport interface CommandPaletteGroup {\n id: string;\n heading?: string;\n items: readonly CommandPaletteItem[];\n}\n\nexport interface CommandPaletteLabels {\n /** Names the dialog for assistive tech. Default `\"Command palette\"`. */\n title?: string;\n placeholder?: string;\n empty?: string;\n navigate?: string;\n select?: string;\n close?: string;\n}\n\nexport interface CommandPaletteProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n groups: readonly CommandPaletteGroup[];\n labels?: CommandPaletteLabels;\n className?: string;\n}\n\n// Built on Dialog + Command rather than the kit's CommandDialog: that one has no accessible\n// name and no footer, and both need Dialog's title and focus wiring.\n/**\n * Search-and-run over a list of actions. Choosing a row runs it and closes the\n * palette. Pair it with `useCommandPaletteShortcut` for ⌘K / Ctrl+K.\n */\nexport function CommandPalette({\n open,\n defaultOpen = false,\n onOpenChange,\n groups,\n labels = {},\n className,\n}: CommandPaletteProps) {\n const [isOpen, setOpen] = useControllableState<boolean>({\n ...(open !== undefined ? { value: open } : {}),\n defaultValue: defaultOpen,\n ...(onOpenChange ? { onChange: onOpenChange } : {}),\n });\n return (\n <Dialog open={isOpen} onOpenChange={setOpen}>\n <DialogContent\n showCloseButton={false}\n className={cn(COMMAND_PALETTE_CONTENT, className)}\n >\n <DialogTitle className={COMMAND_PALETTE_TITLE}>{labels.title ?? COMMAND_PALETTE_LABELS.title}</DialogTitle>\n <Command className={COMMAND_PALETTE_COMMAND}>\n <CommandInput placeholder={labels.placeholder ?? COMMAND_PALETTE_LABELS.placeholder} />\n <CommandList className={COMMAND_PALETTE_LIST}>\n <CommandEmpty>{labels.empty ?? COMMAND_PALETTE_LABELS.empty}</CommandEmpty>\n {groups.map((group, i) => (\n <React.Fragment key={group.id}>\n {i > 0 && <CommandSeparator />}\n <CommandGroup {...(group.heading !== undefined ? { heading: group.heading } : {})}>\n {group.items.map((item) => (\n <CommandItem\n key={item.id}\n value={[item.label, ...(item.keywords ?? [])].join(\" \")}\n disabled={item.disabled ?? false}\n onSelect={() => {\n setOpen(false);\n item.onSelect();\n }}\n >\n {item.icon}\n <span className={COMMAND_PALETTE_LABEL}>{item.label}</span>\n {item.shortcut !== undefined && <CommandShortcut>{item.shortcut}</CommandShortcut>}\n </CommandItem>\n ))}\n </CommandGroup>\n </React.Fragment>\n ))}\n </CommandList>\n </Command>\n <div\n data-slot=\"command-palette-hints\"\n className={COMMAND_PALETTE_HINTS}\n >\n <span className={COMMAND_PALETTE_HINT}>\n <Kbd>↑↓</Kbd>\n {labels.navigate ?? COMMAND_PALETTE_LABELS.navigate}\n </span>\n <span className={COMMAND_PALETTE_HINT}>\n <Kbd>↵</Kbd>\n {labels.select ?? COMMAND_PALETTE_LABELS.select}\n </span>\n <span className={COMMAND_PALETTE_HINT}>\n <Kbd>esc</Kbd>\n {labels.close ?? COMMAND_PALETTE_LABELS.close}\n </span>\n </div>\n </DialogContent>\n </Dialog>\n );\n}\n\n/**\n * Calls `onTrigger` on ⌘K (Mac) or Ctrl+K, and keeps the browser from taking\n * the key (Chrome focuses the address bar on Ctrl+K in some layouts). Matches the\n * physical key (`code`), so it also works on a Russian or other non-Latin layout.\n */\nexport function useCommandPaletteShortcut(onTrigger: () => void, enabled = true): void {\n // Latest callback without re-binding the listener on every render.\n const ref = React.useRef(onTrigger);\n React.useEffect(() => {\n ref.current = onTrigger;\n });\n React.useEffect(() => {\n if (!enabled) return;\n const onKeyDown = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && !e.altKey && !e.shiftKey && e.code === \"KeyK\") {\n e.preventDefault();\n // A held key would toggle the palette open and shut.\n if (!e.repeat) ref.current();\n }\n };\n document.addEventListener(\"keydown\", onKeyDown);\n return () => document.removeEventListener(\"keydown\", onKeyDown);\n }, [enabled]);\n}\n"],"mappings":"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","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
  CONFIRM_DIALOG_CONTENT,
7
7
  CONFIRM_DIALOG_DESCRIPTION,
@@ -13,9 +13,10 @@ import {
13
13
  CONFIRM_DIALOG_SPINNER,
14
14
  CONFIRM_DIALOG_TEXT,
15
15
  CONFIRM_DIALOG_TITLE,
16
- confirmDialogIconToneClasses
17
- } from "../generated/confirm-dialog.js";
18
- import { useControllableState } from "../primitives/use-controllable-state.js";
16
+ CONFIRM_DIALOG_LABELS
17
+ } from "../../generated/confirm-dialog.js";
18
+ import { toneClasses } from "../../generated/tone.js";
19
+ import { useControllableState } from "../../primitives/use-controllable-state.js";
19
20
  import {
20
21
  AlertDialog,
21
22
  AlertDialogContent,
@@ -24,10 +25,10 @@ import {
24
25
  AlertDialogHeader,
25
26
  AlertDialogTitle,
26
27
  AlertDialogTrigger
27
- } from "./alert-dialog.js";
28
- import { buttonVariants } from "./button.js";
29
- import { Spinner } from "./spinner.js";
30
- import { UiIcon } from "./ui-icons.js";
28
+ } from "../atomic/alert-dialog.js";
29
+ import { buttonVariants } from "../atomic/button.js";
30
+ import { Spinner } from "../atomic/spinner.js";
31
+ import { UiIcon } from "../../icons/ui-icons.js";
31
32
  function ConfirmDialog({
32
33
  open,
33
34
  defaultOpen = false,
@@ -35,7 +36,7 @@ function ConfirmDialog({
35
36
  trigger,
36
37
  title,
37
38
  description,
38
- tone = "default",
39
+ tone = "neutral",
39
40
  confirmLabel,
40
41
  onConfirm,
41
42
  icon,
@@ -49,7 +50,7 @@ function ConfirmDialog({
49
50
  });
50
51
  const [pending, setPending] = React.useState(false);
51
52
  const [error, setError] = React.useState(null);
52
- const danger = tone === "danger";
53
+ const danger = tone === "error";
53
54
  React.useEffect(() => {
54
55
  if (isOpen) setError(null);
55
56
  }, [isOpen]);
@@ -68,20 +69,14 @@ function ConfirmDialog({
68
69
  setOpen(false);
69
70
  } catch (e) {
70
71
  setPending(false);
71
- setError(e instanceof Error && e.message ? e.message : labels.error ?? "Something went wrong");
72
+ setError(e instanceof Error && e.message ? e.message : labels.error ?? CONFIRM_DIALOG_LABELS.error);
72
73
  }
73
74
  };
74
75
  return /* @__PURE__ */ jsxs(AlertDialog, { open: isOpen, onOpenChange: change, children: [
75
76
  trigger != null && /* @__PURE__ */ jsx(AlertDialogTrigger, { asChild: true, children: trigger }),
76
- /* @__PURE__ */ jsxs(AlertDialogContent, { className: cn(CONFIRM_DIALOG_CONTENT, className), children: [
77
+ /* @__PURE__ */ jsxs(AlertDialogContent, { className: cn(CONFIRM_DIALOG_CONTENT, toneClasses[tone], className), children: [
77
78
  /* @__PURE__ */ jsxs(AlertDialogHeader, { className: CONFIRM_DIALOG_HEADER, children: [
78
- /* @__PURE__ */ jsx(
79
- "span",
80
- {
81
- className: cn(CONFIRM_DIALOG_ICON, confirmDialogIconToneClasses[tone]),
82
- children: icon ?? /* @__PURE__ */ jsx(UiIcon, { name: "alert" })
83
- }
84
- ),
79
+ /* @__PURE__ */ jsx("span", { className: CONFIRM_DIALOG_ICON, children: icon ?? /* @__PURE__ */ jsx(UiIcon, { name: "alert" }) }),
85
80
  /* @__PURE__ */ jsxs("div", { className: CONFIRM_DIALOG_TEXT, children: [
86
81
  /* @__PURE__ */ jsx(AlertDialogTitle, { className: CONFIRM_DIALOG_TITLE, children: title }),
87
82
  description != null && /* @__PURE__ */ jsx(AlertDialogDescription, { className: CONFIRM_DIALOG_DESCRIPTION, children: description }),
@@ -96,7 +91,7 @@ function ConfirmDialog({
96
91
  "aria-disabled": pending,
97
92
  onClick: () => change(false),
98
93
  className: cn(buttonVariants({ variant: "ghost", size: "xs" }), CONFIRM_DIALOG_PENDING),
99
- children: labels.cancel ?? "Cancel"
94
+ children: labels.cancel ?? CONFIRM_DIALOG_LABELS.cancel
100
95
  }
101
96
  ),
102
97
  /* @__PURE__ */ jsxs(
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/components/derived/confirm-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../../lib/cn\";\nimport {\n CONFIRM_DIALOG_CONTENT,\n CONFIRM_DIALOG_DESCRIPTION,\n CONFIRM_DIALOG_ERROR,\n CONFIRM_DIALOG_FOOTER,\n CONFIRM_DIALOG_HEADER,\n CONFIRM_DIALOG_ICON,\n CONFIRM_DIALOG_PENDING,\n CONFIRM_DIALOG_SPINNER,\n CONFIRM_DIALOG_TEXT,\n CONFIRM_DIALOG_TITLE,\n CONFIRM_DIALOG_LABELS,\n} from \"../../generated/confirm-dialog\";\nimport { toneClasses, type Tone } from \"../../generated/tone\";\nimport { useControllableState } from \"../../primitives/use-controllable-state\";\nimport {\n AlertDialog,\n AlertDialogContent,\n AlertDialogDescription,\n AlertDialogFooter,\n AlertDialogHeader,\n AlertDialogTitle,\n AlertDialogTrigger,\n} from \"../atomic/alert-dialog\";\nimport { buttonVariants } from \"../atomic/button\";\nimport { Spinner } from \"../atomic/spinner\";\nimport { UiIcon } from \"../../icons/ui-icons\";\n\nexport interface ConfirmDialogLabels {\n cancel?: string;\n /** Shown when `onConfirm` rejects with something that has no message. */\n error?: string;\n}\n\nexport interface ConfirmDialogProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** Opens the dialog; wrapped with `asChild`, so pass one button. */\n trigger?: React.ReactNode;\n title: React.ReactNode;\n description?: React.ReactNode;\n tone?: Tone;\n confirmLabel: React.ReactNode;\n /**\n * Resolve to close the dialog. While a returned promise is pending both\n * buttons are disabled and Escape and outside clicks do nothing; a rejection\n * keeps the dialog open and shows its message under the text.\n */\n onConfirm: () => void | Promise<void>;\n /** Replaces the tone's glyph. */\n icon?: React.ReactNode;\n labels?: ConfirmDialogLabels;\n className?: string;\n}\n\nexport function ConfirmDialog({\n open,\n defaultOpen = false,\n onOpenChange,\n trigger,\n title,\n description,\n tone = \"neutral\",\n confirmLabel,\n onConfirm,\n icon,\n labels = {},\n className,\n}: ConfirmDialogProps) {\n const [isOpen, setOpen] = useControllableState<boolean>({\n ...(open !== undefined ? { value: open } : {}),\n defaultValue: defaultOpen,\n ...(onOpenChange ? { onChange: onOpenChange } : {}),\n });\n const [pending, setPending] = React.useState(false);\n const [error, setError] = React.useState<string | null>(null);\n const danger = tone === \"error\";\n // A controlled parent can reopen the dialog without going through `change`.\n React.useEffect(() => {\n if (isOpen) setError(null);\n }, [isOpen]);\n\n const change = (next: boolean) => {\n if (pending) return;\n if (next) setError(null);\n setOpen(next);\n };\n\n const confirm = async () => {\n if (pending) return;\n setError(null);\n setPending(true);\n try {\n await onConfirm();\n setPending(false);\n setOpen(false);\n } catch (e) {\n setPending(false);\n setError(e instanceof Error && e.message ? e.message : (labels.error ?? CONFIRM_DIALOG_LABELS.error));\n }\n };\n\n return (\n <AlertDialog open={isOpen} onOpenChange={change}>\n {trigger != null && <AlertDialogTrigger asChild>{trigger}</AlertDialogTrigger>}\n <AlertDialogContent className={cn(CONFIRM_DIALOG_CONTENT, toneClasses[tone], className)}>\n <AlertDialogHeader className={CONFIRM_DIALOG_HEADER}>\n <span className={CONFIRM_DIALOG_ICON}>\n {icon ?? <UiIcon name=\"alert\" />}\n </span>\n <div className={CONFIRM_DIALOG_TEXT}>\n <AlertDialogTitle className={CONFIRM_DIALOG_TITLE}>{title}</AlertDialogTitle>\n {description != null && (\n <AlertDialogDescription className={CONFIRM_DIALOG_DESCRIPTION}>{description}</AlertDialogDescription>\n )}\n {error !== null && (\n <p role=\"alert\" className={CONFIRM_DIALOG_ERROR}>\n {error}\n </p>\n )}\n </div>\n </AlertDialogHeader>\n <AlertDialogFooter className={CONFIRM_DIALOG_FOOTER}>\n {/* aria-disabled, not disabled: a disabled button that holds focus drops it to <body> and Tab leaves the dialog. */}\n <button\n type=\"button\"\n aria-disabled={pending}\n onClick={() => change(false)}\n className={cn(buttonVariants({ variant: \"ghost\", size: \"xs\" }), CONFIRM_DIALOG_PENDING)}\n >\n {labels.cancel ?? CONFIRM_DIALOG_LABELS.cancel}\n </button>\n <button\n type=\"button\"\n aria-disabled={pending}\n aria-busy={pending}\n onClick={confirm}\n className={cn(buttonVariants({ variant: danger ? \"destructive\" : \"primary\", size: \"xs\" }), CONFIRM_DIALOG_PENDING)}\n >\n {pending && <Spinner className={CONFIRM_DIALOG_SPINNER} />}\n {confirmLabel}\n </button>\n </AlertDialogFooter>\n </AlertDialogContent>\n </AlertDialog>\n );\n}\n"],"mappings":"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","names":[]}