@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
package/styles/tokens.css CHANGED
@@ -23,17 +23,21 @@
23
23
  * accent-trace · accent-debug · accent-info · accent-warn · accent-error
24
24
  * primary-ink — the primary role as ink on a surface, where the
25
25
  * fill and the readable value are different colours;
26
- * primary-hover · primary-border — the solid button's states
26
+ * primary-hover · accent-*-hover — a solid fill's hover, derived;
27
+ * primary-border — the primary button's edge;
28
+ * on-secondary — the ink, derived
27
29
  * positive-ink · accent-info-ink — a quiet status role as text on
28
30
  * a surface; derived from the role and the ink, a palette may pin
29
31
  * them. warn and error are text in their own colour
30
- * FACES button-primary-* · button-danger-* ({bg,hover,border,ink}) and
31
- * chip-{neutral,primary,positive,info,warn,error}-{bg,border}:
32
- * what a Button or Badge paints, pinned per theme by EV and
32
+ * FACES button-danger-* ({bg,hover,border,ink}) and
33
+ * tint-{neutral,primary,positive,info,warn,error,trace,debug}-{fill,edge}:
34
+ * what a Button or a toned chip, toast or banner paints, pinned per theme by EV and
33
35
  * derived for a brand. Not part of what a brand file owes.
34
36
  * TYPE text-caption · body-s · body · body-l · h3 · h2 · h1 ·
35
- * figure-m · figure-l (size and line height); fonts
36
- * SCALARS radius · control-radius · chip-radius · control-* · display-scale ·
37
+ * figure-m · figure-l (size and line height), derived from
38
+ * body-{size,step,leading} and display-{base,step,leading} ·
39
+ * figure-leading · display-scale; fonts
40
+ * SCALARS radius · control-radius · chip-radius · control-* · disabled-opacity · body-* · display-* · figure-leading ·
37
41
  * page-* · shell-* · depth-* (behind shadow-card/elevated/overlay)
38
42
  * MOTION ev-ease-* · ev-dur-* · ev-rise · ev-stagger(-section)
39
43
  * CHARTS chart-1 … chart-6
@@ -720,6 +724,11 @@
720
724
  --radius-lg: var(--radius);
721
725
  --radius-xl: calc(var(--radius) + 4px);
722
726
  --radius-2xl: calc(var(--radius) + 8px);
727
+ /* the roles the kit's tables name; the steps above are the consumer's */
728
+ --radius-control: var(--control-radius);
729
+ --radius-panel: var(--radius);
730
+ --radius-chip: var(--chip-radius);
731
+ --radius-row: calc(var(--radius) - 4px); /* concentric inside a panel's p-1 */
723
732
 
724
733
  /* The names stay, the values are per theme: u2 is flat (`--depth-*` is a
725
734
  * zero shadow), Oldschool brings the ladder back in ev.css. */
@@ -727,25 +736,25 @@
727
736
  --shadow-elevated: var(--depth-elevated);
728
737
  --shadow-overlay: var(--depth-overlay);
729
738
 
730
- /* Type scale: size / line-height in pairs, the Figma text styles. */
731
- --text-caption: 0.6875rem;
732
- --text-caption--line-height: 0.875rem;
733
- --text-body-s: 0.75rem;
734
- --text-body-s--line-height: 1rem;
735
- --text-body: 0.8125rem;
736
- --text-body--line-height: 1.125rem;
737
- --text-body-l: 0.875rem;
738
- --text-body-l--line-height: 1.25rem;
739
- --text-h3: 0.875rem;
740
- --text-h3--line-height: 1.25rem;
741
- --text-h2: 1.5rem;
742
- --text-h2--line-height: 1.875rem;
743
- --text-h1: 2rem;
744
- --text-h1--line-height: 2.375rem;
745
- --text-figure-m: 1.25rem;
746
- --text-figure-m--line-height: 1.5rem;
747
- --text-figure-l: 1.75rem;
748
- --text-figure-l--line-height: 2rem;
739
+ /* Type scale: two even-step ramps off the geometry rule's inputs (docs/spec/roles.md). */
740
+ --text-caption: calc(var(--body-size) - 2 * var(--body-step));
741
+ --text-caption--line-height: calc(var(--body-leading) - 4 * var(--body-step));
742
+ --text-body-s: calc(var(--body-size) - var(--body-step));
743
+ --text-body-s--line-height: calc(var(--body-leading) - 2 * var(--body-step));
744
+ --text-body: var(--body-size);
745
+ --text-body--line-height: var(--body-leading);
746
+ --text-body-l: calc(var(--body-size) + var(--body-step));
747
+ --text-body-l--line-height: calc(var(--body-leading) + 2 * var(--body-step));
748
+ --text-h3: calc(var(--body-size) + var(--body-step));
749
+ --text-h3--line-height: calc(var(--body-leading) + 2 * var(--body-step));
750
+ --text-h2: calc((var(--display-base) + 2 * var(--display-step)) * var(--display-scale));
751
+ --text-h2--line-height: calc((var(--display-base) + 2 * var(--display-step) + var(--display-leading)) * var(--display-scale));
752
+ --text-h1: calc((var(--display-base) + 4 * var(--display-step)) * var(--display-scale));
753
+ --text-h1--line-height: calc((var(--display-base) + 4 * var(--display-step) + var(--display-leading)) * var(--display-scale));
754
+ --text-figure-m: calc((var(--display-base) + var(--display-step)) * var(--display-scale));
755
+ --text-figure-m--line-height: calc((var(--display-base) + var(--display-step) + var(--figure-leading)) * var(--display-scale));
756
+ --text-figure-l: calc((var(--display-base) + 3 * var(--display-step)) * var(--display-scale));
757
+ --text-figure-l--line-height: calc((var(--display-base) + 3 * var(--display-step) + var(--figure-leading)) * var(--display-scale));
749
758
 
750
759
  /* The families are parameters, apart from the colour contract: a brand scope
751
760
  * sets `--brand-font-sans`, `--brand-font-serif` and `--brand-font-mono`
@@ -804,38 +813,51 @@
804
813
  --color-positive-ink: var(--positive-ink);
805
814
  --color-accent-trace: var(--accent-trace);
806
815
  --color-on-accent-trace: var(--on-accent-trace);
816
+ --color-accent-trace-hover: var(--accent-trace-hover);
807
817
  --color-accent-debug: var(--accent-debug);
808
818
  --color-on-accent-debug: var(--on-accent-debug);
819
+ --color-accent-debug-hover: var(--accent-debug-hover);
809
820
  --color-accent-info: var(--accent-info);
810
821
  --color-on-accent-info: var(--on-accent-info);
822
+ --color-accent-info-hover: var(--accent-info-hover);
811
823
  --color-accent-info-ink: var(--accent-info-ink);
812
824
  --color-accent-warn: var(--accent-warn);
813
825
  --color-on-accent-warn: var(--on-accent-warn);
826
+ --color-accent-warn-hover: var(--accent-warn-hover);
814
827
  --color-accent-error: var(--accent-error);
815
828
  --color-on-accent-error: var(--on-accent-error);
829
+ --color-accent-error-hover: var(--accent-error-hover);
816
830
 
817
- /* component faces: derived below, pinned per theme by EV, so `bg-button-primary-bg`
818
- * and `border-chip-error-border` are real utilities the class merge understands */
819
- --color-button-primary-bg: var(--button-primary-bg);
820
- --color-button-primary-hover: var(--button-primary-hover);
821
- --color-button-primary-border: var(--button-primary-border);
822
- --color-button-primary-ink: var(--button-primary-ink);
831
+ /* component faces: derived below, pinned per theme by EV, so `bg-button-danger-bg`
832
+ * and `border-tint-error-edge` are real utilities the class merge understands */
823
833
  --color-button-danger-bg: var(--button-danger-bg);
824
834
  --color-button-danger-hover: var(--button-danger-hover);
825
835
  --color-button-danger-border: var(--button-danger-border);
826
836
  --color-button-danger-ink: var(--button-danger-ink);
827
- --color-chip-neutral-bg: var(--chip-neutral-bg);
828
- --color-chip-neutral-border: var(--chip-neutral-border);
829
- --color-chip-primary-bg: var(--chip-primary-bg);
830
- --color-chip-primary-border: var(--chip-primary-border);
831
- --color-chip-positive-bg: var(--chip-positive-bg);
832
- --color-chip-positive-border: var(--chip-positive-border);
833
- --color-chip-info-bg: var(--chip-info-bg);
834
- --color-chip-info-border: var(--chip-info-border);
835
- --color-chip-warn-bg: var(--chip-warn-bg);
836
- --color-chip-warn-border: var(--chip-warn-border);
837
- --color-chip-error-bg: var(--chip-error-bg);
838
- --color-chip-error-border: var(--chip-error-border);
837
+ --color-tint-neutral-fill: var(--tint-neutral-fill);
838
+ --color-tint-neutral-edge: var(--tint-neutral-edge);
839
+ --color-tint-neutral-wash: var(--tint-neutral-wash);
840
+ --color-tint-primary-fill: var(--tint-primary-fill);
841
+ --color-tint-primary-edge: var(--tint-primary-edge);
842
+ --color-tint-primary-wash: var(--tint-primary-wash);
843
+ --color-tint-positive-fill: var(--tint-positive-fill);
844
+ --color-tint-positive-edge: var(--tint-positive-edge);
845
+ --color-tint-positive-wash: var(--tint-positive-wash);
846
+ --color-tint-info-fill: var(--tint-info-fill);
847
+ --color-tint-info-edge: var(--tint-info-edge);
848
+ --color-tint-info-wash: var(--tint-info-wash);
849
+ --color-tint-warn-fill: var(--tint-warn-fill);
850
+ --color-tint-warn-edge: var(--tint-warn-edge);
851
+ --color-tint-warn-wash: var(--tint-warn-wash);
852
+ --color-tint-error-fill: var(--tint-error-fill);
853
+ --color-tint-error-edge: var(--tint-error-edge);
854
+ --color-tint-error-wash: var(--tint-error-wash);
855
+ --color-tint-trace-fill: var(--tint-trace-fill);
856
+ --color-tint-trace-edge: var(--tint-trace-edge);
857
+ --color-tint-trace-wash: var(--tint-trace-wash);
858
+ --color-tint-debug-fill: var(--tint-debug-fill);
859
+ --color-tint-debug-edge: var(--tint-debug-edge);
860
+ --color-tint-debug-wash: var(--tint-debug-wash);
839
861
 
840
862
  /* charts — distinguishable hues carrying no significance */
841
863
  --color-chart-1: var(--chart-1);
@@ -875,7 +897,14 @@
875
897
  * side — ink over white needs ~47% to clear it, dark lands near 4:1. */
876
898
  --input: color-mix(in srgb, var(--ink) 48%, transparent);
877
899
  --ring: var(--primary-ink);
878
- --primary-hover: color-mix(in srgb, var(--primary) 95%, black);
900
+ --on-secondary: var(--ink);
901
+ /* a solid fill's hover moves away from its label, so the label only gains contrast */
902
+ --primary-hover: color-mix(in srgb, rgb(from var(--on-primary) calc(255 - r) calc(255 - g) calc(255 - b)) var(--tint-hover), var(--primary));
903
+ --accent-trace-hover: color-mix(in srgb, rgb(from var(--on-accent-trace) calc(255 - r) calc(255 - g) calc(255 - b)) var(--tint-hover), var(--accent-trace));
904
+ --accent-debug-hover: color-mix(in srgb, rgb(from var(--on-accent-debug) calc(255 - r) calc(255 - g) calc(255 - b)) var(--tint-hover), var(--accent-debug));
905
+ --accent-info-hover: color-mix(in srgb, rgb(from var(--on-accent-info) calc(255 - r) calc(255 - g) calc(255 - b)) var(--tint-hover), var(--accent-info));
906
+ --accent-warn-hover: color-mix(in srgb, rgb(from var(--on-accent-warn) calc(255 - r) calc(255 - g) calc(255 - b)) var(--tint-hover), var(--accent-warn));
907
+ --accent-error-hover: color-mix(in srgb, rgb(from var(--on-accent-error) calc(255 - r) calc(255 - g) calc(255 - b)) var(--tint-hover), var(--accent-error));
879
908
  --primary-border: color-mix(in srgb, var(--primary-ink) 55%, transparent);
880
909
  /* the quiet status roles as text on a surface: a fill is a shape, and as text
881
910
  * it reads far below AA on a light plane. warn and error have none: they are
@@ -890,31 +919,40 @@
890
919
  * same scopes, listed in another order so the contract reader finds one rule
891
920
  * per selector. */
892
921
  :where([data-theme], [data-brand], .light, .dark, :root) {
893
- /* primary is an outline button, danger the same in the error role */
894
- --button-primary-bg: transparent;
895
- --button-primary-hover: var(--hover);
896
- --button-primary-border: color-mix(in srgb, var(--ink) 60%, transparent);
897
- --button-primary-ink: var(--ink);
922
+ /* danger is an outline in the error role */
898
923
  --button-danger-bg: transparent;
899
- --button-danger-hover: color-mix(in srgb, var(--accent-error) 10%, transparent);
924
+ --button-danger-hover: color-mix(in srgb, var(--accent-error) var(--tint-hover), transparent);
900
925
  --button-danger-border: var(--accent-error);
901
926
  --button-danger-ink: var(--accent-error);
902
927
 
903
- /* chips (Badge, status pills). The source is the colour the label wears, so
904
- * the edge and the label are one hue; --chip-fill and --chip-edge are in the
905
- * geometry. */
906
- --chip-neutral-bg: var(--hover);
907
- --chip-neutral-border: var(--border);
908
- --chip-primary-bg: color-mix(in srgb, var(--primary-ink) var(--chip-fill), transparent);
909
- --chip-primary-border: color-mix(in srgb, var(--primary-ink) var(--chip-edge), transparent);
910
- --chip-positive-bg: color-mix(in srgb, var(--positive-ink) var(--chip-fill), transparent);
911
- --chip-positive-border: color-mix(in srgb, var(--positive-ink) var(--chip-edge), transparent);
912
- --chip-info-bg: color-mix(in srgb, var(--accent-info-ink) var(--chip-fill), transparent);
913
- --chip-info-border: color-mix(in srgb, var(--accent-info-ink) var(--chip-edge), transparent);
914
- --chip-warn-bg: color-mix(in srgb, var(--accent-warn) var(--chip-fill), transparent);
915
- --chip-warn-border: color-mix(in srgb, var(--accent-warn) var(--chip-edge), transparent);
916
- --chip-error-bg: color-mix(in srgb, var(--accent-error) var(--chip-fill), transparent);
917
- --chip-error-border: color-mix(in srgb, var(--accent-error) var(--chip-edge), transparent);
928
+ /* a tone worn as a tint: a chip's fill and edge are the tone's ink at
929
+ * --tint-fill and --tint-edge, so the edge and the label are one hue, and an
930
+ * area's wash is it at --tint-wash. warn and error are their own ink
931
+ * (docs/spec/accents.md). */
932
+ --tint-neutral-fill: var(--hover);
933
+ --tint-neutral-edge: var(--border);
934
+ --tint-neutral-wash: transparent;
935
+ --tint-primary-fill: color-mix(in srgb, var(--primary-ink) var(--tint-fill), transparent);
936
+ --tint-primary-edge: color-mix(in srgb, var(--primary-ink) var(--tint-edge), transparent);
937
+ --tint-primary-wash: color-mix(in srgb, var(--primary-ink) var(--tint-wash), transparent);
938
+ --tint-positive-fill: color-mix(in srgb, var(--positive-ink) var(--tint-fill), transparent);
939
+ --tint-positive-edge: color-mix(in srgb, var(--positive-ink) var(--tint-edge), transparent);
940
+ --tint-positive-wash: color-mix(in srgb, var(--positive-ink) var(--tint-wash), transparent);
941
+ --tint-info-fill: color-mix(in srgb, var(--accent-info-ink) var(--tint-fill), transparent);
942
+ --tint-info-edge: color-mix(in srgb, var(--accent-info-ink) var(--tint-edge), transparent);
943
+ --tint-info-wash: color-mix(in srgb, var(--accent-info-ink) var(--tint-wash), transparent);
944
+ --tint-warn-fill: color-mix(in srgb, var(--accent-warn) var(--tint-fill), transparent);
945
+ --tint-warn-edge: color-mix(in srgb, var(--accent-warn) var(--tint-edge), transparent);
946
+ --tint-warn-wash: color-mix(in srgb, var(--accent-warn) var(--tint-wash), transparent);
947
+ --tint-error-fill: color-mix(in srgb, var(--accent-error) var(--tint-fill), transparent);
948
+ --tint-error-edge: color-mix(in srgb, var(--accent-error) var(--tint-edge), transparent);
949
+ --tint-error-wash: color-mix(in srgb, var(--accent-error) var(--tint-wash), transparent);
950
+ --tint-trace-fill: color-mix(in srgb, var(--accent-trace) var(--tint-fill), transparent);
951
+ --tint-trace-edge: color-mix(in srgb, var(--accent-trace) var(--tint-edge), transparent);
952
+ --tint-trace-wash: color-mix(in srgb, var(--accent-trace) var(--tint-wash), transparent);
953
+ --tint-debug-fill: color-mix(in srgb, var(--accent-debug) var(--tint-fill), transparent);
954
+ --tint-debug-edge: color-mix(in srgb, var(--accent-debug) var(--tint-edge), transparent);
955
+ --tint-debug-wash: color-mix(in srgb, var(--accent-debug) var(--tint-wash), transparent);
918
956
  }
919
957
 
920
958
  /* Geometry. A `[data-brand]` scope is a theme root of its own, so it restarts
@@ -924,22 +962,37 @@
924
962
  --radius: 0.375rem; /* panels and menus */
925
963
  /* control geometry, so a consumer reshapes every button/input at once */
926
964
  --control-radius: 0.25rem;
965
+ --control-h: 2.25rem;
966
+ --control-step: 0.25rem;
967
+ --control-inset: 1rem; /* the md rung's side inset; every other rung's moves with its height */
927
968
  --chip-radius: 0.25rem;
928
- /* how much of its ink a chip's fill and edge take, for a brand that pins
929
- * nothing: an outline by default, a tint where a theme raises the fill */
930
- --chip-fill: 0%;
931
- --chip-edge: 50%;
969
+ --disabled-opacity: 0.5;
970
+ /* how much of its ink a tint's fill and edge take: an outline by default, a
971
+ * tinted pill where a theme raises the fill; and a tone's pointed-at row or face */
972
+ --tint-fill: 0%;
973
+ --tint-edge: 50%;
974
+ --tint-hover: 10%;
975
+ /* how much of its ink an area in a tone (a banner, an alert) is washed with:
976
+ * an area needs a body to read as content, where a chip reads as an outline.
977
+ * At 10 % Light's positive and warn labels fall under their floor. */
978
+ --tint-wash: 6%;
932
979
  /* u2 is flat: depth is surface steps and hairlines. Never `none` — inside
933
980
  * Tailwind's comma-separated box-shadow list it invalidates the whole
934
981
  * declaration, and the focus ring goes with it. */
935
982
  --depth-card: 0 0 #0000;
936
983
  --depth-elevated: 0 0 #0000;
937
984
  --depth-overlay: 0 0 #0000;
938
- --control-py: 0.5rem;
939
- /* the Xl (call-to-action) button reads all three */
985
+ /* the Xl (call-to-action) rung's inset and text */
940
986
  --control-px: 2rem;
941
987
  --control-text: 1rem;
942
- /* multiplies the display type scale (uikit <Display>) */
988
+ /* the type ramps: text steps 1 px, display steps 4 px, a scale over the display tier */
989
+ --body-size: 0.8125rem;
990
+ --body-step: 0.0625rem;
991
+ --body-leading: 1.125rem;
992
+ --display-base: 1rem;
993
+ --display-step: 0.25rem;
994
+ --display-leading: 0.375rem; /* h1, h2 */
995
+ --figure-leading: 0.25rem; /* figure-m, figure-l */
943
996
  --display-scale: 1;
944
997
  /* the vertical rhythm of a full-bleed <Section>; `tight` is the sub-page one */
945
998
  --band-py: 2.25rem;
@@ -983,6 +1036,24 @@
983
1036
  */
984
1037
  }
985
1038
 
1039
+ /* The control height and inset ramps a `Size` step names, re-derived on every
1040
+ * scope that may set `--control-h`. Pin one step to bend the ramp. */
1041
+ :where(:root, [data-brand], [data-theme]) {
1042
+ --control-h-2xs: calc(var(--control-h) - 3 * var(--control-step));
1043
+ --control-h-xs: calc(var(--control-h) - 2 * var(--control-step));
1044
+ --control-h-sm: calc(var(--control-h) - var(--control-step));
1045
+ --control-h-md: var(--control-h);
1046
+ --control-h-lg: calc(var(--control-h) + var(--control-step));
1047
+ --control-h-xl: calc(var(--control-h) + 3 * var(--control-step));
1048
+ --control-h-touch: max(var(--control-h-lg), 2.75rem); /* the 44 px pointer-target floor (WCAG 2.5.5) */
1049
+ --control-inset-xs: calc(var(--control-h-xs) - var(--control-h) + var(--control-inset));
1050
+ --control-inset-sm: calc(var(--control-h-sm) - var(--control-h) + var(--control-inset));
1051
+ --control-inset-md: var(--control-inset);
1052
+ --control-inset-lg: calc(var(--control-h-lg) - var(--control-h) + var(--control-inset));
1053
+ --control-inset-xl: var(--control-px);
1054
+ --control-inset-touch: calc(var(--control-h-touch) - var(--control-h) + var(--control-inset));
1055
+ }
1056
+
986
1057
  :root {
987
1058
  /* shell offset — viewport space reserved by whatever shell hosts the app.
988
1059
  Standalone apps get 0; a hosting shell overrides on :root. Size
@@ -1051,7 +1122,6 @@
1051
1122
  --background: #0d0d0f;
1052
1123
  --card: #151518;
1053
1124
  --secondary: #1c1c20;
1054
- --on-secondary: var(--ink);
1055
1125
  --popover: #252529;
1056
1126
  --muted: #070709;
1057
1127
  --hover: #e6e1d30f;
@@ -1075,13 +1145,11 @@
1075
1145
 
1076
1146
  /* brand and primary. A fill and an ink are different jobs (docs/spec/accents.md):
1077
1147
  * --primary carries white at 4.62:1 and reads as a shape on every plane (3.30:1
1078
- * on the popover); --primary-ink is the teal that reads as text (4.96:1 there).
1079
- * Figma's hover #18998b is 3.52:1 under white, so #127c71 (5.06:1) is pinned. */
1148
+ * on the popover); --primary-ink is the teal that reads as text (4.96:1 there). */
1080
1149
  --brand: #0d1627;
1081
1150
  --primary: #138377;
1082
1151
  --on-primary: #ffffff;
1083
1152
  --primary-ink: #35a395;
1084
- --primary-hover: #127c71;
1085
1153
  --primary-border: #35a3958c;
1086
1154
 
1087
1155
  /* status. Fills carry the dark label (white fails 3:1–3.4:1 on these); the
@@ -1107,29 +1175,6 @@
1107
1175
  --chart-4: #e68aaf;
1108
1176
  --chart-5: #2e9e5c;
1109
1177
  --chart-6: #988eef;
1110
-
1111
- --button-primary-bg: #e6e1d300;
1112
- --button-primary-hover: #e6e1d314;
1113
- --button-primary-border: #e6e1d399;
1114
- --button-primary-ink: #e6e1d3;
1115
- --button-danger-bg: #f05b5200;
1116
- --button-danger-hover: #f05b521a;
1117
- --button-danger-border: #f05b52;
1118
- --button-danger-ink: var(--accent-error);
1119
-
1120
- /* chips are outlines: a transparent fill and the label's hue at 50 % */
1121
- --chip-neutral-bg: var(--hover);
1122
- --chip-neutral-border: var(--border);
1123
- --chip-primary-bg: #35a39500;
1124
- --chip-primary-border: #35a3958c;
1125
- --chip-positive-bg: #2e9e5c00;
1126
- --chip-positive-border: #4abf7680;
1127
- --chip-info-bg: #4990d800;
1128
- --chip-info-border: #6ca6e480;
1129
- --chip-warn-bg: #f5c84e00;
1130
- --chip-warn-border: #f5c84e80;
1131
- --chip-error-bg: #f05b5200;
1132
- --chip-error-border: #f05b5280;
1133
1178
  }
1134
1179
 
1135
1180
  /* ── u2 Light ────────────────────────────────────────────────── */
@@ -1139,7 +1184,6 @@
1139
1184
  --background: #efebdf;
1140
1185
  --card: #f6f3eb;
1141
1186
  --secondary: #fbfaf6;
1142
- --on-secondary: var(--ink);
1143
1187
  --popover: #ffffff;
1144
1188
  --muted: #e6e1d3;
1145
1189
  --hover: #0d0d0f0d;
@@ -1161,7 +1205,6 @@
1161
1205
  --primary: #138377;
1162
1206
  --on-primary: #ffffff;
1163
1207
  --primary-ink: #116f65;
1164
- --primary-hover: #116f65;
1165
1208
  --primary-border: #116f658c;
1166
1209
 
1167
1210
  /* Figma's positive #228a4e carries neither label at 4.5:1 (white 4.36, dark
@@ -1190,29 +1233,6 @@
1190
1233
  --chart-4: #b74679;
1191
1234
  --chart-5: #228a4e;
1192
1235
  --chart-6: #6d5acc;
1193
-
1194
- --button-primary-bg: #0d0d0f00;
1195
- --button-primary-hover: #0d0d0f0f;
1196
- --button-primary-border: #0d0d0fa6;
1197
- --button-primary-ink: #080e1a;
1198
- --button-danger-bg: #db383400;
1199
- --button-danger-hover: #db383414;
1200
- --button-danger-border: #db3834;
1201
- --button-danger-ink: var(--accent-error);
1202
-
1203
- /* the solid hue at 50 % (warning 60 %), where Dark uses the ink's */
1204
- --chip-neutral-bg: var(--hover);
1205
- --chip-neutral-border: var(--border);
1206
- --chip-primary-bg: #13837700;
1207
- --chip-primary-border: #116f658c;
1208
- --chip-positive-bg: #228a4e00;
1209
- --chip-positive-border: #228a4e80;
1210
- --chip-info-bg: #2d79c200;
1211
- --chip-info-border: #2d79c280;
1212
- --chip-warn-bg: #a77f1200;
1213
- --chip-warn-border: #a77f1299;
1214
- --chip-error-bg: #db383400;
1215
- --chip-error-border: #db383480;
1216
1236
  }
1217
1237
 
1218
1238
  /* ── Oldschool ───────────────────────────────────────────────── *
@@ -1232,7 +1252,6 @@
1232
1252
  --background: #070d18;
1233
1253
  --card: #16233c;
1234
1254
  --secondary: #0d1526;
1235
- --on-secondary: var(--ink);
1236
1255
  --popover: #1d2c49;
1237
1256
  --muted: #26375c;
1238
1257
  --hover: #e6e1d312;
@@ -1254,7 +1273,6 @@
1254
1273
  --primary: #138377;
1255
1274
  --on-primary: #ffffff;
1256
1275
  --primary-ink: #35a395;
1257
- --primary-hover: #127c71;
1258
1276
  --primary-border: #35a39500;
1259
1277
 
1260
1278
  --positive: #2e9e5c;
@@ -1279,31 +1297,21 @@
1279
1297
  --chart-5: #2e9e5c;
1280
1298
  --chart-6: #988eef;
1281
1299
 
1282
- /* filled buttons. The danger label stays dark: white on #f05b52 is 3.32:1. */
1283
- --button-primary-bg: #138377;
1284
- --button-primary-hover: #127c71;
1285
- --button-primary-border: #138377;
1286
- --button-primary-ink: #ffffff;
1287
- --button-danger-bg: #f05b52;
1288
- --button-danger-hover: #f06c61;
1289
- --button-danger-border: #f05b52;
1290
- --button-danger-ink: #070d18;
1291
-
1292
- /* chips are tinted pills with no edge */
1293
- --chip-neutral-bg: var(--hover);
1294
- --chip-neutral-border: #e6e1d300;
1300
+ /* danger is a fill */
1301
+ --button-danger-bg: var(--accent-error);
1302
+ --button-danger-hover: var(--accent-error-hover);
1303
+ --button-danger-border: var(--accent-error);
1304
+ --button-danger-ink: var(--on-accent-error);
1305
+
1306
+ /* tints are pills with no edge */
1307
+ --tint-fill: 18%;
1308
+ --tint-edge: 0%;
1309
+ --tint-neutral-edge: transparent;
1295
1310
  /* Figma tints the accent chip 16 %, which leaves its teal label at 4.03:1 on
1296
1311
  * the card; 8 % holds 4.56:1 */
1297
- --chip-primary-bg: #35a39514;
1298
- --chip-primary-border: #35a39500;
1299
- --chip-positive-bg: #2e9e5c2e;
1300
- --chip-positive-border: #4abf7600;
1301
- --chip-info-bg: #4990d82e;
1302
- --chip-info-border: #6ca6e400;
1303
- --chip-warn-bg: #f5c84e29;
1304
- --chip-warn-border: #f5c84e00;
1305
- --chip-error-bg: #f05b522e;
1306
- --chip-error-border: #f06c6100;
1312
+ --tint-primary-fill: color-mix(in srgb, var(--primary-ink) 8%, transparent);
1313
+ /* at 18 % the info label reads 4.43:1 on its fill; 16 % clears 4.5:1 */
1314
+ --tint-info-fill: color-mix(in srgb, var(--accent-info-ink) 16%, transparent);
1307
1315
 
1308
1316
  --radius: 0.5rem;
1309
1317
  --control-radius: 0.375rem;
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/accordion.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { useControllableState } from \"../primitives/use-controllable-state\";\nimport {\n ACCORDION_CONTENT,\n ACCORDION_CONTENT_INNER,\n ACCORDION_HEADER,\n ACCORDION_ITEM,\n ACCORDION_TRIGGER,\n} from \"../generated/accordion\";\n\ntype AccordionType = \"single\" | \"multiple\";\n\ninterface AccordionContextValue {\n isOpen: (value: string) => boolean;\n toggle: (value: string) => void;\n}\n\nconst AccordionContext = React.createContext<AccordionContextValue | null>(null);\n\nfunction useAccordion(): AccordionContextValue {\n const ctx = React.useContext(AccordionContext);\n if (!ctx) throw new Error(\"Accordion parts must be used within <Accordion>\");\n return ctx;\n}\n\nconst ItemContext = React.createContext<string | null>(null);\n\nfunction useItemValue(): string {\n const value = React.useContext(ItemContext);\n if (value === null)\n throw new Error(\"AccordionTrigger/Content must be used within <AccordionItem>\");\n return value;\n}\n\nexport interface AccordionProps\n extends Omit<React.ComponentProps<\"div\">, \"onChange\"> {\n type?: AccordionType;\n collapsible?: boolean;\n value?: string[];\n defaultValue?: string[];\n onValueChange?: (value: string[]) => void;\n}\n\nexport function Accordion({\n type = \"single\",\n collapsible = false,\n value,\n defaultValue = [],\n onValueChange,\n children,\n ...props\n}: AccordionProps) {\n const [open, setOpen] = useControllableState<string[]>({\n ...(value !== undefined ? { value } : {}),\n defaultValue,\n ...(onValueChange ? { onChange: onValueChange } : {}),\n });\n\n const isOpen = (v: string) => open.includes(v);\n const toggle = (v: string) => {\n if (type === \"multiple\") {\n setOpen(open.includes(v) ? open.filter((x) => x !== v) : [...open, v]);\n return;\n }\n if (open.includes(v)) setOpen(collapsible ? [] : open);\n else setOpen([v]);\n };\n\n return (\n <AccordionContext.Provider value={{ isOpen, toggle }}>\n <div data-slot=\"accordion\" {...props}>\n {children}\n </div>\n </AccordionContext.Provider>\n );\n}\n\nexport interface AccordionItemProps extends React.ComponentProps<\"div\"> {\n value: string;\n}\n\nexport function AccordionItem({\n className,\n value,\n children,\n ...props\n}: AccordionItemProps) {\n return (\n <ItemContext.Provider value={value}>\n <div\n data-slot=\"accordion-item\"\n className={cn(ACCORDION_ITEM, className)}\n {...props}\n >\n {children}\n </div>\n </ItemContext.Provider>\n );\n}\n\nexport function AccordionTrigger({\n className,\n children,\n onClick,\n ...props\n}: React.ComponentProps<\"button\">) {\n const { isOpen, toggle } = useAccordion();\n const value = useItemValue();\n const open = isOpen(value);\n return (\n <h3 className={ACCORDION_HEADER} data-slot=\"accordion-header\">\n <button\n type=\"button\"\n data-slot=\"accordion-trigger\"\n data-state={open ? \"open\" : \"closed\"}\n aria-expanded={open}\n className={cn(ACCORDION_TRIGGER, className)}\n onClick={(e) => {\n onClick?.(e);\n toggle(value);\n }}\n {...props}\n >\n {children}\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className=\"text-ink-soft pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200\"\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n </button>\n </h3>\n );\n}\n\nexport function AccordionContent({\n className,\n children,\n ...props\n}: React.ComponentProps<\"div\">) {\n const { isOpen } = useAccordion();\n const value = useItemValue();\n if (!isOpen(value)) return null;\n return (\n <div\n data-slot=\"accordion-content\"\n data-state=\"open\"\n className={ACCORDION_CONTENT}\n {...props}\n >\n <div className={cn(ACCORDION_CONTENT_INNER, className)}>{children}</div>\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/account-list.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport {\n ACCOUNT_LIST_BASE,\n ACCOUNT_LIST_ITEM_ACTIONS,\n ACCOUNT_LIST_ITEM_AVATAR,\n ACCOUNT_LIST_ITEM_AVATAR_FALLBACK,\n ACCOUNT_LIST_ITEM_BADGES,\n ACCOUNT_LIST_ITEM_BASE,\n ACCOUNT_LIST_ITEM_CHECK,\n ACCOUNT_LIST_ITEM_CHECK_HIDDEN,\n ACCOUNT_LIST_ITEM_CHECKED,\n ACCOUNT_LIST_ITEM_DISABLED,\n ACCOUNT_LIST_ITEM_FIGURE,\n ACCOUNT_LIST_ITEM_HANDLE,\n ACCOUNT_LIST_ITEM_NAME,\n ACCOUNT_LIST_ITEM_RADIO,\n ACCOUNT_LIST_ITEM_TEXT,\n ACCOUNT_LIST_ITEM_UNCHECKED,\n} from \"../generated/account-list\";\nimport { cn } from \"../lib/cn\";\nimport { useControllableState } from \"../primitives/use-controllable-state\";\nimport { Avatar, AvatarFallback } from \"./avatar\";\nimport { UiIcon } from \"./ui-icons\";\n\ninterface AccountListContextValue {\n value: string;\n setValue: (next: string) => void;\n}\n\nconst AccountListContext = React.createContext<AccountListContextValue | null>(null);\n\nexport interface AccountListProps extends Omit<React.ComponentProps<\"div\">, \"onChange\" | \"defaultValue\"> {\n value?: string;\n defaultValue?: string;\n onValueChange?: (value: string) => void;\n /** Accessible name of the group, e.g. \"Accounts\". */\n \"aria-label\": string;\n}\n\n/**\n * Pick the account you act as: one is current, arrows move and select\n * (radio-group semantics), so the current account is the only tab stop.\n */\nexport function AccountList({\n value,\n defaultValue = \"\",\n onValueChange,\n className,\n onKeyDown,\n ...props\n}: AccountListProps) {\n const [current, setValue] = useControllableState<string>({\n ...(value !== undefined ? { value } : {}),\n defaultValue,\n ...(onValueChange ? { onChange: onValueChange } : {}),\n });\n\n const move = (e: React.KeyboardEvent<HTMLDivElement>) => {\n const forward = e.key === \"ArrowDown\" || e.key === \"ArrowRight\";\n const back = e.key === \"ArrowUp\" || e.key === \"ArrowLeft\";\n if (!forward && !back) return;\n const radios = Array.from(\n e.currentTarget.querySelectorAll<HTMLButtonElement>('[role=\"radio\"]:not(:disabled)'),\n );\n const at = radios.indexOf(document.activeElement as HTMLButtonElement);\n if (at < 0) return;\n e.preventDefault();\n const next = radios[(at + (forward ? 1 : -1) + radios.length) % radios.length];\n next?.focus();\n next?.click();\n };\n\n return (\n <AccountListContext.Provider value={{ value: current, setValue }}>\n <div\n role=\"radiogroup\"\n data-slot=\"account-list\"\n className={cn(ACCOUNT_LIST_BASE, className)}\n onKeyDown={(e) => {\n onKeyDown?.(e);\n if (!e.defaultPrevented) move(e);\n }}\n {...props}\n />\n </AccountListContext.Provider>\n );\n}\n\nexport interface AccountListItemProps extends Omit<React.ComponentProps<\"div\">, \"value\" | \"title\"> {\n value: string;\n name: React.ReactNode;\n /** A line under the name: handle, email. */\n handle?: React.ReactNode;\n /** Replaces the initial-in-a-square default. */\n avatar?: React.ReactNode;\n /** Role badges after the name block. */\n badges?: React.ReactNode;\n /** A figure at the end, set in the serif face: a balance. */\n figure?: React.ReactNode;\n /** Controls beside the row (a menu button); they cannot live inside the radio. */\n actions?: React.ReactNode;\n disabled?: boolean;\n}\n\nexport function AccountListItem({\n value,\n name,\n handle,\n avatar,\n badges,\n figure,\n actions,\n disabled,\n className,\n ...props\n}: AccountListItemProps) {\n const ctx = React.useContext(AccountListContext);\n if (!ctx) throw new Error(\"AccountListItem must be used within <AccountList>\");\n const checked = ctx.value === value;\n const initial = typeof name === \"string\" ? name.trim().charAt(0).toUpperCase() : \"\";\n return (\n <div\n data-slot=\"account-list-item\"\n data-state={checked ? \"checked\" : \"unchecked\"}\n className={cn(\n ACCOUNT_LIST_ITEM_BASE,\n checked ? ACCOUNT_LIST_ITEM_CHECKED : ACCOUNT_LIST_ITEM_UNCHECKED,\n disabled && ACCOUNT_LIST_ITEM_DISABLED,\n className,\n )}\n {...props}\n >\n <button\n type=\"button\"\n role=\"radio\"\n aria-checked={checked}\n disabled={disabled}\n // Until one is chosen every radio is a tab stop, or the group could not be entered.\n tabIndex={checked || ctx.value === \"\" ? 0 : -1}\n onClick={() => ctx.setValue(value)}\n className={ACCOUNT_LIST_ITEM_RADIO}\n >\n {avatar ?? (\n <Avatar className={ACCOUNT_LIST_ITEM_AVATAR}>\n <AvatarFallback className={ACCOUNT_LIST_ITEM_AVATAR_FALLBACK}>{initial}</AvatarFallback>\n </Avatar>\n )}\n <span className={ACCOUNT_LIST_ITEM_TEXT}>\n <span className={ACCOUNT_LIST_ITEM_NAME}>{name}</span>\n {handle != null && <span className={ACCOUNT_LIST_ITEM_HANDLE}>{handle}</span>}\n </span>\n {badges != null && <span className={ACCOUNT_LIST_ITEM_BADGES}>{badges}</span>}\n {figure != null && <span className={ACCOUNT_LIST_ITEM_FIGURE}>{figure}</span>}\n <span className={cn(ACCOUNT_LIST_ITEM_CHECK, !checked && ACCOUNT_LIST_ITEM_CHECK_HIDDEN)} aria-hidden>\n <UiIcon name=\"check\" />\n </span>\n </button>\n {actions != null && <div className={ACCOUNT_LIST_ITEM_ACTIONS}>{actions}</div>}\n </div>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/account-menu-profile.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { Avatar, AvatarFallback } from \"./avatar\";\nimport { Badge } from \"./badge\";\nimport {\n DropdownMenuItem,\n DropdownMenuRadioGroup,\n DropdownMenuRadioItem,\n DropdownMenuSeparator,\n DropdownMenuSub,\n DropdownMenuSubContent,\n DropdownMenuSubTrigger,\n} from \"./dropdown-menu\";\nimport { Switch } from \"./switch\";\nimport { UiIcon } from \"./ui-icons\";\n\nexport interface AccountMenuTab {\n id: string;\n label: React.ReactNode;\n /** Shown instead of the menu body when this tab is current; the first tab is always the menu itself. */\n content?: React.ReactNode;\n}\n\nexport interface AccountMenuProfile {\n /** Under the name on the profile card, e.g. \"Free\". */\n plan?: string;\n /** Makes the card a menu item that runs this and closes the menu, e.g. to open the account settings. */\n onOpenProfile?: () => void;\n tabs?: readonly AccountMenuTab[];\n /** Names the tab row for assistive tech. Default `\"Sections\"`. */\n tabsLabel?: string;\n /** Current tab id (controlled). */\n tab?: string;\n onTabChange?: (id: string) => void;\n /** A row with a short value badge on the right (\"EN\"); picking it runs `onSelect`. */\n language?: { label: string; value: string; onSelect?: () => void };\n /** A row with a switch; the menu closes after a toggle. */\n darkTheme?: { label: string; checked: boolean; onCheckedChange: (checked: boolean) => void };\n /** A submenu of radio options; the current one's label shows on the row. */\n colorTheme?: {\n label: string;\n value: string;\n options: readonly { id: string; label: string }[];\n onValueChange: (id: string) => void;\n };\n /** Glyphs for the rows, so the kit carries no icon set. */\n icons?: { language?: React.ReactNode; darkTheme?: React.ReactNode; colorTheme?: React.ReactNode };\n}\n\n/**\n * The tabs are `menuitemradio` items in a group, not a tablist: a menu may only\n * hold items, and this way the menu's own arrow-key roving reaches them.\n * Selecting one does not close the menu.\n */\nexport function ProfileTabs({\n tabs,\n value,\n onChange,\n label = \"Sections\",\n}: {\n tabs: readonly AccountMenuTab[];\n value: string;\n onChange: (id: string) => void;\n label?: string | undefined;\n}) {\n const move = (e: React.KeyboardEvent<HTMLButtonElement>, index: number) => {\n const step = e.key === \"ArrowRight\" ? 1 : e.key === \"ArrowLeft\" ? -1 : 0;\n if (step === 0) return;\n // Up and Down belong to the menu; Left and Right stay in the row.\n e.stopPropagation();\n e.preventDefault();\n const target = (index + step + tabs.length) % tabs.length;\n const next = tabs[target];\n if (!next) return;\n onChange(next.id);\n e.currentTarget.parentElement?.querySelectorAll<HTMLElement>('[role=\"menuitemradio\"]')[target]?.focus();\n };\n return (\n <div role=\"group\" aria-label={label} data-slot=\"account-menu-tabs\" className=\"flex border-b border-border-subtle\">\n {tabs.map((t, i) => {\n const selected = t.id === value;\n return (\n <button\n key={t.id}\n type=\"button\"\n role=\"menuitemradio\"\n aria-checked={selected}\n tabIndex={-1}\n onClick={() => onChange(t.id)}\n onKeyDown={(e) => move(e, i)}\n className={cn(\n \"-mb-px h-8 flex-1 border-b px-3 text-body font-medium outline-none focus-visible:ring-2 focus-visible:ring-ring\",\n selected ? \"border-primary text-ink\" : \"border-transparent text-ink-mid hover:text-ink\",\n )}\n >\n {t.label}\n </button>\n );\n })}\n </div>\n );\n}\n\nexport function ProfileCard({\n name,\n plan,\n initials,\n onOpen,\n}: {\n name: string;\n plan?: string | undefined;\n initials: string;\n onOpen?: (() => void) | undefined;\n}) {\n const content = (\n <>\n <Avatar className=\"size-14 shrink-0 rounded-full\">\n <AvatarFallback className=\"font-serif text-h2 font-light text-ink\">{initials.slice(0, 1)}</AvatarFallback>\n </Avatar>\n <span className=\"flex min-w-0 flex-1 flex-col gap-0.5\">\n <span className=\"truncate text-body font-medium text-ink\">{name}</span>\n {plan && <span className=\"text-caption text-ink-soft\">{plan}</span>}\n </span>\n {onOpen && <UiIcon name=\"chevron-right\" className=\"size-4 text-ink-soft\" />}\n </>\n );\n if (!onOpen) {\n return (\n <div data-slot=\"account-menu-card\" className=\"flex w-full items-center gap-2.5 p-2\">\n {content}\n </div>\n );\n }\n // A real menu item: it joins the arrow-key order and closes the menu, so a dialog opened from it is not left under the menu.\n return (\n <DropdownMenuItem data-slot=\"account-menu-card\" className=\"h-auto gap-2.5 p-2\" onClick={onOpen}>\n {content}\n </DropdownMenuItem>\n );\n}\n\nexport function ProfileSettingRows({ profile }: { profile: AccountMenuProfile }) {\n const { language, darkTheme, colorTheme, icons } = profile;\n if (!language && !darkTheme && !colorTheme) return null;\n const currentColor = colorTheme?.options.find((o) => o.id === colorTheme.value)?.label;\n return (\n <>\n <DropdownMenuSeparator />\n {language && (\n <DropdownMenuItem onClick={() => language.onSelect?.()}>\n {icons?.language}\n <span className=\"flex-1\">{language.label}</span>\n <Badge>{language.value}</Badge>\n </DropdownMenuItem>\n )}\n {darkTheme && (\n <DropdownMenuItem\n role=\"menuitemcheckbox\"\n aria-checked={darkTheme.checked}\n onClick={() => darkTheme.onCheckedChange(!darkTheme.checked)}\n >\n {icons?.darkTheme}\n <span className=\"flex-1\">{darkTheme.label}</span>\n {/* Presentational: the row is the control, so the switch stays out of the tab order. */}\n <Switch checked={darkTheme.checked} tabIndex={-1} aria-hidden className=\"pointer-events-none\" />\n </DropdownMenuItem>\n )}\n {colorTheme && (\n <DropdownMenuSub>\n <DropdownMenuSubTrigger>\n {icons?.colorTheme}\n <span className=\"flex-1\">{colorTheme.label}</span>\n {currentColor && <span className=\"text-body-s text-ink-soft\">{currentColor}</span>}\n </DropdownMenuSubTrigger>\n <DropdownMenuSubContent>\n <DropdownMenuRadioGroup value={colorTheme.value} onValueChange={colorTheme.onValueChange}>\n {colorTheme.options.map((o) => (\n <DropdownMenuRadioItem key={o.id} value={o.id}>\n {o.label}\n </DropdownMenuRadioItem>\n ))}\n </DropdownMenuRadioGroup>\n </DropdownMenuSubContent>\n </DropdownMenuSub>\n )}\n </>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/account-menu.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { Avatar, AvatarFallback } from \"./avatar\";\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from \"./dropdown-menu\";\nimport type { NavGroup } from \"./nav-model\";\nimport { useControllableState } from \"../primitives/use-controllable-state\";\nimport {\n ProfileCard,\n ProfileSettingRows,\n ProfileTabs,\n type AccountMenuProfile,\n type AccountMenuTab,\n} from \"./account-menu-profile\";\n\nexport type { AccountMenuProfile, AccountMenuTab };\n\nexport interface AccountMenuLabels {\n /** Accessible name of the trigger. Default `\"Account\"`. */\n trigger?: string;\n /** Default `\"Manage account\"`. */\n manage?: string;\n /** Default `\"Switch account\"`. */\n switchAccount?: string;\n /** Default `\"Sign out\"`. */\n signOut?: string;\n}\n\nexport interface AccountMenuProps {\n account: { name?: string | null | undefined; email: string };\n /** The account center, on the identity provider's origin; no item without it. */\n manageHref?: string | undefined;\n /** A full page load to the sign-in that offers the account chooser. */\n switchHref: string;\n /** The service's own entries, between the account center and switching. Draws `label`, `icon`, `external`. */\n groups?: readonly NavGroup[];\n onSignOut: () => void;\n linkComponent?: React.ElementType;\n labels?: AccountMenuLabels;\n /**\n * The wide profile form: tabs, a profile card, language and theme rows. Absent,\n * the menu is the compact one it always was.\n */\n profile?: AccountMenuProfile;\n className?: string;\n}\n\nconst initials = (account: AccountMenuProps[\"account\"]) => {\n const words = account.name?.trim().split(/\\s+/).filter(Boolean) ?? [];\n const letters = words.length > 0 ? words.slice(0, 2).map(w => Array.from(w)[0]) : [Array.from(account.email)[0]];\n return letters.join(\"\").toUpperCase();\n};\n\n/**\n * Who is signed in, top right. The order is fixed — the account, the account\n * center, the service's groups, switching, signing out — so every service's\n * menu reads the same; a service adds groups and nothing else.\n */\nexport function AccountMenu({\n account,\n manageHref,\n switchHref,\n groups = [],\n onSignOut,\n linkComponent,\n labels = {},\n profile,\n className,\n}: AccountMenuProps) {\n const Link = linkComponent ?? \"a\";\n const tabs = profile?.tabs ?? [];\n const [tab, setTab] = useControllableState<string>({\n ...(profile?.tab !== undefined ? { value: profile.tab } : {}),\n defaultValue: tabs[0]?.id ?? \"\",\n ...(profile?.onTabChange ? { onChange: profile.onTabChange } : {}),\n });\n const otherTab = tabs.length > 0 && tab !== tabs[0]?.id ? tabs.find((t) => t.id === tab) : undefined;\n return (\n <DropdownMenu>\n <DropdownMenuTrigger\n data-slot=\"account-menu-trigger\"\n aria-label={labels.trigger ?? \"Account\"}\n className={cn(\"rounded-full outline-none focus-visible:ring-2 focus-visible:ring-ring\", className)}\n >\n <Avatar>\n <AvatarFallback className=\"text-xs font-medium text-ink\">{initials(account)}</AvatarFallback>\n </Avatar>\n </DropdownMenuTrigger>\n <DropdownMenuContent align=\"end\" className={profile ? \"w-75\" : \"w-64\"}>\n {tabs.length > 0 && <ProfileTabs tabs={tabs} value={tab} onChange={setTab} label={profile?.tabsLabel} />}\n {otherTab ? (\n otherTab.content\n ) : (\n <>\n {profile ? (\n <ProfileCard\n name={account.name || account.email}\n plan={profile.plan}\n initials={initials(account)}\n onOpen={profile.onOpenProfile}\n />\n ) : (\n <DropdownMenuLabel className=\"flex flex-col\">\n {account.name && <span className=\"truncate text-ink\">{account.name}</span>}\n <span className=\"truncate font-normal text-ink-soft\">{account.email}</span>\n </DropdownMenuLabel>\n )}\n {profile && <DropdownMenuSeparator />}\n {manageHref && (\n <DropdownMenuItem asChild>\n <a href={manageHref}>{labels.manage ?? \"Manage account\"}</a>\n </DropdownMenuItem>\n )}\n {groups.map(group => (\n <React.Fragment key={group.id}>\n <DropdownMenuSeparator />\n <DropdownMenuGroup>\n {group.label && <DropdownMenuLabel className=\"text-xs text-ink-soft\">{group.label}</DropdownMenuLabel>}\n {group.items.map(item => {\n const Item = item.external ? \"a\" : Link;\n const Icon = item.icon;\n return (\n <DropdownMenuItem key={item.id} asChild>\n <Item href={item.href}>\n {Icon && <Icon className=\"size-4\" />}\n {item.label}\n </Item>\n </DropdownMenuItem>\n );\n })}\n </DropdownMenuGroup>\n </React.Fragment>\n ))}\n {profile && <ProfileSettingRows profile={profile} />}\n <DropdownMenuSeparator />\n <DropdownMenuItem asChild>\n <a href={switchHref}>{labels.switchAccount ?? \"Switch account\"}</a>\n </DropdownMenuItem>\n <DropdownMenuItem variant={profile ? \"destructive\" : \"neutral\"} onClick={onSignOut}>\n {labels.signOut ?? \"Sign out\"}\n </DropdownMenuItem>\n </>\n )}\n </DropdownMenuContent>\n </DropdownMenu>\n );\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/account-settings-dialog.tsx"],"sourcesContent":["import * as React from \"react\";\nimport {\n ACCOUNT_SETTINGS_DIALOG_CLOSE,\n ACCOUNT_SETTINGS_DIALOG_CONTENT,\n ACCOUNT_SETTINGS_DIALOG_DESCRIPTION,\n ACCOUNT_SETTINGS_DIALOG_ENTRY,\n ACCOUNT_SETTINGS_DIALOG_FOOTER,\n ACCOUNT_SETTINGS_DIALOG_HEADING,\n ACCOUNT_SETTINGS_DIALOG_LIST,\n ACCOUNT_SETTINGS_DIALOG_PANE,\n ACCOUNT_SETTINGS_DIALOG_PANEL,\n ACCOUNT_SETTINGS_DIALOG_SIDEBAR,\n ACCOUNT_SETTINGS_DIALOG_TABS,\n ACCOUNT_SETTINGS_DIALOG_TITLE,\n} from \"../generated/account-settings-dialog\";\nimport { cn } from \"../lib/cn\";\nimport { Dialog, DialogClose, DialogContent, DialogDescription, DialogTitle } from \"./dialog\";\nimport { Tabs, TabsContent, TabsList, TabsTrigger } from \"./tabs\";\nimport { IconButton } from \"./icon-button\";\nimport { UiIcon } from \"./ui-icons\";\n\nexport interface AccountSettingsSection {\n id: string;\n label: React.ReactNode;\n icon?: React.ReactNode;\n content: React.ReactNode;\n}\n\nexport interface AccountSettingsDialogLabels {\n /** The close button. Default `\"Close\"`. */\n close?: string;\n}\n\nexport interface AccountSettingsDialogProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n /** The heading of the content pane. */\n title: React.ReactNode;\n description?: React.ReactNode;\n /** One sidebar entry each; the active one's `content` fills the pane. */\n sections: readonly AccountSettingsSection[];\n value?: string;\n defaultValue?: string;\n onValueChange?: (id: string) => void;\n /** Pinned under the sidebar entries: sign out, language. */\n sidebarFooter?: React.ReactNode;\n labels?: AccountSettingsDialogLabels;\n className?: string;\n}\n\n/**\n * The account modal: a vertical tab rail on the left, the active section on\n * the right. Sections are the caller's, so Profile and Security (or any other)\n * are built from `SettingsSection` and `SettingsRow` inside `content`.\n */\nexport function AccountSettingsDialog({\n open,\n defaultOpen,\n onOpenChange,\n title,\n description,\n sections,\n value,\n defaultValue,\n onValueChange,\n sidebarFooter,\n labels = {},\n className,\n}: AccountSettingsDialogProps) {\n const first = sections[0]?.id ?? \"\";\n return (\n <Dialog\n {...(open !== undefined ? { open } : {})}\n {...(defaultOpen !== undefined ? { defaultOpen } : {})}\n {...(onOpenChange ? { onOpenChange } : {})}\n >\n <DialogContent\n showCloseButton={false}\n className={cn(ACCOUNT_SETTINGS_DIALOG_CONTENT, className)}\n >\n <Tabs\n orientation=\"vertical\"\n {...(value !== undefined ? { value } : { defaultValue: defaultValue ?? first })}\n {...(onValueChange ? { onValueChange } : {})}\n className={ACCOUNT_SETTINGS_DIALOG_TABS}\n >\n <div className={ACCOUNT_SETTINGS_DIALOG_SIDEBAR}>\n <TabsList className={ACCOUNT_SETTINGS_DIALOG_LIST}>\n {sections.map((s) => (\n <TabsTrigger key={s.id} value={s.id} className={ACCOUNT_SETTINGS_DIALOG_ENTRY}>\n {s.icon}\n {s.label}\n </TabsTrigger>\n ))}\n </TabsList>\n {sidebarFooter != null && (\n <div className={ACCOUNT_SETTINGS_DIALOG_FOOTER}>{sidebarFooter}</div>\n )}\n </div>\n <div className={ACCOUNT_SETTINGS_DIALOG_PANE}>\n <div className={ACCOUNT_SETTINGS_DIALOG_HEADING}>\n <DialogTitle className={ACCOUNT_SETTINGS_DIALOG_TITLE}>{title}</DialogTitle>\n {description != null && (\n <DialogDescription className={ACCOUNT_SETTINGS_DIALOG_DESCRIPTION}>{description}</DialogDescription>\n )}\n </div>\n {sections.map((s) => (\n <TabsContent key={s.id} value={s.id} className={ACCOUNT_SETTINGS_DIALOG_PANEL}>\n {s.content}\n </TabsContent>\n ))}\n </div>\n </Tabs>\n <DialogClose asChild>\n <IconButton aria-label={labels.close ?? \"Close\"} className={ACCOUNT_SETTINGS_DIALOG_CLOSE}>\n <UiIcon name=\"x\" />\n </IconButton>\n </DialogClose>\n </DialogContent>\n </Dialog>\n );\n}\n"],"mappings":"AAwFY,cAEI,YAFJ;AAxFZ,YAAY,WAAW;AACvB;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,OACK;AACP,SAAS,UAAU;AACnB,SAAS,QAAQ,aAAa,eAAe,mBAAmB,mBAAmB;AACnF,SAAS,MAAM,aAAa,UAAU,mBAAmB;AACzD,SAAS,kBAAkB;AAC3B,SAAS,cAAc;AAqChB,SAAS,sBAAsB;AAAA,EACpC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,SAAS,CAAC;AAAA,EACV;AACF,GAA+B;AAC7B,QAAM,QAAQ,SAAS,CAAC,GAAG,MAAM;AACjC,SACE;AAAA,IAAC;AAAA;AAAA,MACE,GAAI,SAAS,SAAY,EAAE,KAAK,IAAI,CAAC;AAAA,MACrC,GAAI,gBAAgB,SAAY,EAAE,YAAY,IAAI,CAAC;AAAA,MACnD,GAAI,eAAe,EAAE,aAAa,IAAI,CAAC;AAAA,MAExC;AAAA,QAAC;AAAA;AAAA,UACC,iBAAiB;AAAA,UACjB,WAAW,GAAG,iCAAiC,SAAS;AAAA,UAExD;AAAA;AAAA,cAAC;AAAA;AAAA,gBACC,aAAY;AAAA,gBACX,GAAI,UAAU,SAAY,EAAE,MAAM,IAAI,EAAE,cAAc,gBAAgB,MAAM;AAAA,gBAC5E,GAAI,gBAAgB,EAAE,cAAc,IAAI,CAAC;AAAA,gBAC1C,WAAW;AAAA,gBAEX;AAAA,uCAAC,SAAI,WAAW,iCACd;AAAA,wCAAC,YAAS,WAAW,8BAClB,mBAAS,IAAI,CAAC,MACb,qBAAC,eAAuB,OAAO,EAAE,IAAI,WAAW,+BAC7C;AAAA,wBAAE;AAAA,sBACF,EAAE;AAAA,yBAFa,EAAE,EAGpB,CACD,GACH;AAAA,oBACC,iBAAiB,QAChB,oBAAC,SAAI,WAAW,gCAAiC,yBAAc;AAAA,qBAEnE;AAAA,kBACA,qBAAC,SAAI,WAAW,8BACd;AAAA,yCAAC,SAAI,WAAW,iCACd;AAAA,0CAAC,eAAY,WAAW,+BAAgC,iBAAM;AAAA,sBAC7D,eAAe,QACd,oBAAC,qBAAkB,WAAW,qCAAsC,uBAAY;AAAA,uBAEpF;AAAA,oBACC,SAAS,IAAI,CAAC,MACb,oBAAC,eAAuB,OAAO,EAAE,IAAI,WAAW,+BAC7C,YAAE,WADa,EAAE,EAEpB,CACD;AAAA,qBACH;AAAA;AAAA;AAAA,YACF;AAAA,YACA,oBAAC,eAAY,SAAO,MAClB,8BAAC,cAAW,cAAY,OAAO,SAAS,SAAS,WAAW,+BAC1D,8BAAC,UAAO,MAAK,KAAI,GACnB,GACF;AAAA;AAAA;AAAA,MACF;AAAA;AAAA,EACF;AAEJ;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/alert-dialog.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport { buttonVariants } from \"./button\";\nimport { useControllableState } from \"../primitives/use-controllable-state\";\nimport { DismissableLayerScope, useDismissableLayer, useModalScrimStyle } from \"../primitives/dismissable-layer\";\nimport { useFocusScope } from \"../primitives/focus-scope\";\nimport { usePresence } from \"../primitives/presence\";\nimport { mergeRefs } from \"../primitives/merge-refs\";\nimport { Portal } from \"../primitives/portal\";\nimport { Slot } from \"../primitives/slot\";\nimport {\n ALERT_DIALOG_CONTENT,\n ALERT_DIALOG_DESCRIPTION,\n ALERT_DIALOG_FOOTER,\n ALERT_DIALOG_HEADER,\n ALERT_DIALOG_OVERLAY,\n ALERT_DIALOG_TITLE,\n} from \"../generated/alert-dialog\";\n\ninterface AlertDialogContextValue {\n open: boolean;\n setOpen: (next: boolean) => void;\n triggerRef: React.RefObject<HTMLElement | null>;\n}\n\nconst AlertDialogContext = React.createContext<AlertDialogContextValue | null>(null);\n\nfunction useAlertDialog(): AlertDialogContextValue {\n const ctx = React.useContext(AlertDialogContext);\n if (!ctx) throw new Error(\"AlertDialog parts must be used within <AlertDialog>\");\n return ctx;\n}\n\nexport interface AlertDialogProps {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n children?: React.ReactNode;\n}\n\nexport function AlertDialog({ open, defaultOpen = false, onOpenChange, children }: AlertDialogProps) {\n const [isOpen, setOpen] = useControllableState<boolean>({\n ...(open !== undefined ? { value: open } : {}),\n defaultValue: defaultOpen,\n ...(onOpenChange ? { onChange: onOpenChange } : {}),\n });\n const triggerRef = React.useRef<HTMLElement | null>(null);\n return (\n <AlertDialogContext.Provider value={{ open: isOpen, setOpen, triggerRef }}>\n {children}\n </AlertDialogContext.Provider>\n );\n}\n\nexport interface AlertDialogTriggerProps extends React.ComponentProps<\"button\"> {\n asChild?: boolean;\n}\n\nexport function AlertDialogTrigger({ asChild = false, onClick, ...props }: AlertDialogTriggerProps) {\n const { open, setOpen, triggerRef } = useAlertDialog();\n const Comp = asChild ? Slot : \"button\";\n return (\n <Comp\n data-slot=\"alert-dialog-trigger\"\n aria-expanded={open}\n ref={triggerRef as React.Ref<HTMLButtonElement>}\n onClick={(e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n setOpen(true);\n }}\n {...(props as Record<string, unknown>)}\n />\n );\n}\n\nexport interface AlertDialogOverlayProps extends React.ComponentProps<\"div\"> {}\n\nexport function AlertDialogOverlay({ className, ...props }: AlertDialogOverlayProps) {\n const { open } = useAlertDialog();\n // No onClick: the content's dismissable layer already closes on the\n // pointer-down that lands here, and a second path called onOpenChange(false)\n // twice for one press whenever the overlay was still hit by the click\n // (a host that closes later, CSS without the closed-state pointer-events).\n return (\n <div\n data-slot=\"alert-dialog-overlay\"\n data-state={open ? \"open\" : \"closed\"}\n className={cn(ALERT_DIALOG_OVERLAY, className)}\n {...(props as Record<string, unknown>)}\n />\n );\n}\n\nexport interface AlertDialogContentProps extends React.ComponentProps<\"div\"> {}\n\nexport function AlertDialogContent({ className, children, ...props }: AlertDialogContentProps) {\n const { open, setOpen, triggerRef } = useAlertDialog();\n const { isPresent, ref: presRef } = usePresence(open);\n const focusRef = useFocusScope(open, { returnFocusTo: triggerRef });\n const dismissRef = useDismissableLayer({\n enabled: open,\n onDismiss: () => setOpen(false),\n exclude: [triggerRef],\n modal: true,\n });\n const scrimStyle = useModalScrimStyle(dismissRef);\n if (!isPresent) return null;\n return (\n <Portal>\n <AlertDialogOverlay style={scrimStyle} />\n <div\n data-slot=\"alert-dialog-content\"\n role=\"alertdialog\"\n aria-modal=\"true\"\n data-state={open ? \"open\" : \"closed\"}\n ref={mergeRefs(focusRef, dismissRef, presRef as React.Ref<HTMLDivElement>)}\n className={cn(ALERT_DIALOG_CONTENT, className)}\n {...(props as Record<string, unknown>)}\n >\n <DismissableLayerScope layer={dismissRef}>{children}</DismissableLayerScope>\n </div>\n </Portal>\n );\n}\n\nexport function AlertDialogHeader({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-header\"\n className={cn(ALERT_DIALOG_HEADER, className)}\n {...props}\n />\n );\n}\n\nexport function AlertDialogFooter({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-dialog-footer\"\n className={cn(ALERT_DIALOG_FOOTER, className)}\n {...props}\n />\n );\n}\n\nexport function AlertDialogTitle({ className, ...props }: React.ComponentProps<\"h2\">) {\n return (\n <h2\n data-slot=\"alert-dialog-title\"\n className={cn(ALERT_DIALOG_TITLE, className)}\n {...props}\n />\n );\n}\n\nexport function AlertDialogDescription({ className, ...props }: React.ComponentProps<\"p\">) {\n return (\n <p\n data-slot=\"alert-dialog-description\"\n className={cn(ALERT_DIALOG_DESCRIPTION, className)}\n {...props}\n />\n );\n}\n\nexport interface AlertDialogActionProps extends React.ComponentProps<\"button\"> {}\n\nexport function AlertDialogAction({ className, onClick, ...props }: AlertDialogActionProps) {\n const { setOpen } = useAlertDialog();\n return (\n <button\n data-slot=\"alert-dialog-action\"\n className={cn(buttonVariants(), className)}\n onClick={(e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n setOpen(false);\n }}\n {...(props as Record<string, unknown>)}\n />\n );\n}\n\nexport interface AlertDialogCancelProps extends React.ComponentProps<\"button\"> {}\n\nexport function AlertDialogCancel({ className, onClick, ...props }: AlertDialogCancelProps) {\n const { setOpen } = useAlertDialog();\n return (\n <button\n data-slot=\"alert-dialog-cancel\"\n className={cn(buttonVariants({ variant: \"outline\" }), className)}\n onClick={(e: React.MouseEvent<HTMLButtonElement>) => {\n onClick?.(e);\n setOpen(false);\n }}\n {...(props as Record<string, unknown>)}\n />\n );\n}\n"],"mappings":"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","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/alert.tsx"],"sourcesContent":["import * as React from \"react\";\nimport { cn } from \"../lib/cn\";\nimport {\n ALERT_BASE,\n ALERT_DESCRIPTION,\n ALERT_TITLE,\n alertVariants,\n type AlertVariant,\n} from \"../generated/alert\";\n\nexport type { AlertVariant };\n\nexport interface AlertProps extends React.ComponentProps<\"div\"> {\n variant?: AlertVariant;\n}\n\nexport function Alert({ className, variant = \"neutral\", ...props }: AlertProps) {\n return (\n <div\n data-slot=\"alert\"\n role=\"alert\"\n className={cn(ALERT_BASE, alertVariants[variant], className)}\n {...props}\n />\n );\n}\n\nexport function AlertTitle({ className, ...props }: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-title\"\n className={cn(ALERT_TITLE, className)}\n {...props}\n />\n );\n}\n\nexport function AlertDescription({\n className,\n ...props\n}: React.ComponentProps<\"div\">) {\n return (\n <div\n data-slot=\"alert-description\"\n className={cn(ALERT_DESCRIPTION, className)}\n {...props}\n />\n );\n}\n"],"mappings":"AAkBI;AAlBJ,YAAY,WAAW;AACvB,SAAS,UAAU;AACnB;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OAEK;AAQA,SAAS,MAAM,EAAE,WAAW,UAAU,WAAW,GAAG,MAAM,GAAe;AAC9E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,MAAK;AAAA,MACL,WAAW,GAAG,YAAY,cAAc,OAAO,GAAG,SAAS;AAAA,MAC1D,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,WAAW,EAAE,WAAW,GAAG,MAAM,GAAgC;AAC/E,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,aAAa,SAAS;AAAA,MACnC,GAAG;AAAA;AAAA,EACN;AAEJ;AAEO,SAAS,iBAAiB;AAAA,EAC/B;AAAA,EACA,GAAG;AACL,GAAgC;AAC9B,SACE;AAAA,IAAC;AAAA;AAAA,MACC,aAAU;AAAA,MACV,WAAW,GAAG,mBAAmB,SAAS;AAAA,MACzC,GAAG;AAAA;AAAA,EACN;AAEJ;","names":[]}
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/components/animated-number-columns.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\nimport type { NumberItem, RollDirection } from \"../lib/number-parts\";\nimport { rollStep } from \"../lib/number-parts\";\n\n// The JS side has to know when an entering or leaving column is done, so these\n// are literals rather than `--ev-dur-*` (400ms is the nearest token).\nexport const EDGE_MS = 350;\nconst EDGE_EASE = \"var(--ev-ease-out, cubic-bezier(0.22, 1, 0.36, 1))\";\nexport const SPIN_MS = 750;\n// A damped spring (zeta .72, ~4% overshoot) sampled for `linear()`.\nconst SPRING =\n \"linear(0, 0.097, 0.301, 0.521, 0.712, 0.855, 0.95, 1.005, 1.031, 1.038, 1.035, 1.028, 1.019, 1.012, 1.006, 1.002, 1, 0.999, 1, 1, 1)\";\nconst WINDOW_EDGE = \"0.25em\";\nconst WINDOW_MASK = `linear-gradient(to bottom, transparent 0, black ${WINDOW_EDGE}, black calc(100% - ${WINDOW_EDGE}), transparent 100%)`;\n\nfunction spinEasing(): string {\n const springy = typeof CSS !== \"undefined\" && typeof CSS.supports === \"function\" && CSS.supports(\"transition-timing-function\", SPRING);\n return springy ? SPRING : EDGE_EASE;\n}\n\ninterface SlotProps {\n item: NumberItem;\n glyphs: readonly string[];\n direction: RollDirection;\n motion: boolean;\n spin: number;\n}\n\n/** One part of the number; collapses to zero width to enter or leave, so its neighbours slide. */\nexport function Slot({ item, glyphs, direction, motion, spin }: SlotProps) {\n const ref = React.useRef<HTMLSpanElement>(null);\n const [open, setOpen] = React.useState(!item.fresh);\n React.useLayoutEffect(() => {\n if (open) return;\n // Reading layout makes the browser style the collapsed state, so opening it is a transition.\n void ref.current?.offsetWidth;\n setOpen(true);\n }, [open]);\n const collapsed = item.exiting || !open;\n const { part } = item;\n return (\n <span\n ref={ref}\n data-slot=\"animated-number-part\"\n data-state={collapsed ? \"collapsed\" : \"open\"}\n style={{\n display: \"inline-grid\",\n gridTemplateColumns: collapsed ? \"0fr\" : \"1fr\",\n opacity: collapsed ? 0 : 1,\n transition: motion\n ? `grid-template-columns ${EDGE_MS}ms ${EDGE_EASE}, opacity ${EDGE_MS}ms ${EDGE_EASE}`\n : undefined,\n }}\n >\n <span style={{ minWidth: 0, overflowX: \"clip\", whiteSpace: \"pre\" }}>\n {part.kind === \"digit\" ? (\n <Digit digit={part.digit} glyphs={glyphs} direction={direction} motion={motion} spin={spin} />\n ) : (\n part.text\n )}\n </span>\n </span>\n );\n}\n\ninterface SpinState {\n digit: number;\n /** Index into the unbounded strip; the glyph at index i is `i mod 10`. */\n at: number;\n lo: number;\n hi: number;\n animate: boolean;\n /** Sign of the last move, for `data-roll`. */\n step: number;\n}\n\nconst settle = (digit: number): SpinState => ({ digit, at: digit, lo: digit, hi: digit, animate: false, step: 0 });\n\nconst glyphIndex = (i: number): number => ((i % 10) + 10) % 10;\n\ninterface DigitProps {\n digit: number;\n glyphs: readonly string[];\n direction: RollDirection;\n motion: boolean;\n spin: number;\n}\n\n/**\n * A clipped one-line window over a strip of digits. The strip is unbounded,\n * so a forced direction wraps (9 -> 0 going up lands on index 10) and a column\n * never rewinds through the digits in between. Only the cells between where it\n * was and where it is going exist in the DOM; when the transition ends it is\n * rebased to 0..9 without a transition.\n */\nfunction Digit({ digit, glyphs, direction, motion, spin }: DigitProps) {\n const [state, setState] = React.useState<SpinState>(() => settle(digit));\n let s = state;\n if (s.digit !== digit) {\n if (motion) {\n const step = rollStep(s.digit, digit, direction);\n const at = s.at + step;\n s = { digit, at, lo: Math.min(s.lo, at), hi: Math.max(s.hi, at), animate: true, step };\n } else {\n s = settle(digit);\n }\n setState(s);\n }\n const moving = s.lo !== s.hi;\n const cells = Array.from({ length: s.hi - s.lo + 1 }, (_, n) => s.lo + n);\n return (\n <span\n data-slot=\"animated-number-digit\"\n data-roll={moving ? (s.step > 0 ? \"up\" : \"down\") : \"rest\"}\n style={{\n position: \"relative\",\n display: \"inline-block\",\n overflow: \"clip\",\n paddingBlock: WINDOW_EDGE,\n marginBlock: `-${WINDOW_EDGE}`,\n ...(moving ? { maskImage: WINDOW_MASK } : {}),\n }}\n >\n <span style={{ display: \"block\", visibility: \"hidden\" }}>{glyphs[0]}</span>\n <span\n onTransitionEnd={(e) => {\n if (e.target === e.currentTarget && e.propertyName === \"transform\") setState(settle(digit));\n }}\n style={{\n position: \"absolute\",\n insetInline: 0,\n top: WINDOW_EDGE,\n transform: `translateY(calc(${-s.at} * 1lh))`,\n transition: s.animate ? `transform ${spin}ms ${spinEasing()}` : \"none\",\n }}\n >\n {cells.map((i) => (\n <span\n key={i}\n style={{ position: \"absolute\", insetInline: 0, top: `calc(${i} * 1lh)`, height: \"1lh\", textAlign: \"center\" }}\n >\n {glyphs[glyphIndex(i)]}\n </span>\n ))}\n </span>\n </span>\n );\n}\n"],"mappings":"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","names":[]}