@evinvest/uikit 0.30.0 → 0.32.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (403) hide show
  1. package/README.md +267 -73
  2. package/dist/{chunk-3IPB4QQJ.js → chunk-35SPIU4U.js} +10 -6
  3. package/dist/chunk-35SPIU4U.js.map +1 -0
  4. package/dist/components/{accordion.js → atomic/accordion.js} +3 -3
  5. package/dist/components/atomic/accordion.js.map +1 -0
  6. package/dist/components/{alert-dialog.js → atomic/alert-dialog.js} +11 -10
  7. package/dist/components/atomic/alert-dialog.js.map +1 -0
  8. package/dist/components/{alert.js → atomic/alert.js} +2 -2
  9. package/dist/components/atomic/alert.js.map +1 -0
  10. package/dist/components/atomic/animated-number-columns.js +105 -0
  11. package/dist/components/atomic/animated-number-columns.js.map +1 -0
  12. package/dist/components/{avatar.js → atomic/avatar.js} +2 -2
  13. package/dist/components/atomic/avatar.js.map +1 -0
  14. package/dist/components/{badge.js → atomic/badge.js} +4 -4
  15. package/dist/components/atomic/badge.js.map +1 -0
  16. package/dist/components/{band.js → atomic/band.js} +2 -2
  17. package/dist/components/atomic/band.js.map +1 -0
  18. package/dist/components/{breadcrumb.js → atomic/breadcrumb.js} +3 -3
  19. package/dist/components/atomic/breadcrumb.js.map +1 -0
  20. package/dist/components/{button-group.js → atomic/button-group.js} +3 -3
  21. package/dist/components/atomic/button-group.js.map +1 -0
  22. package/dist/components/{button.js → atomic/button.js} +7 -15
  23. package/dist/components/atomic/button.js.map +1 -0
  24. package/dist/components/{calendar.js → atomic/calendar.js} +2 -2
  25. package/dist/components/atomic/calendar.js.map +1 -0
  26. package/dist/components/{card.js → atomic/card.js} +2 -2
  27. package/dist/components/atomic/card.js.map +1 -0
  28. package/dist/components/{checkbox.js → atomic/checkbox.js} +4 -4
  29. package/dist/components/atomic/checkbox.js.map +1 -0
  30. package/dist/components/{collapsible.js → atomic/collapsible.js} +1 -1
  31. package/dist/components/atomic/collapsible.js.map +1 -0
  32. package/dist/components/{command.js → atomic/command.js} +9 -7
  33. package/dist/components/atomic/command.js.map +1 -0
  34. package/dist/components/{container.js → atomic/container.js} +2 -2
  35. package/dist/components/atomic/container.js.map +1 -0
  36. package/dist/components/{context-menu.js → atomic/context-menu.js} +62 -14
  37. package/dist/components/atomic/context-menu.js.map +1 -0
  38. package/dist/components/{dialog.js → atomic/dialog.js} +11 -10
  39. package/dist/components/atomic/dialog.js.map +1 -0
  40. package/dist/components/{drawer.js → atomic/drawer.js} +10 -8
  41. package/dist/components/atomic/drawer.js.map +1 -0
  42. package/dist/components/{dropdown-menu.js → atomic/dropdown-menu.js} +74 -15
  43. package/dist/components/atomic/dropdown-menu.js.map +1 -0
  44. package/dist/components/{empty.js → atomic/empty.js} +2 -2
  45. package/dist/components/atomic/empty.js.map +1 -0
  46. package/dist/components/atomic/field-context.js.map +1 -0
  47. package/dist/components/atomic/form-row.js +51 -0
  48. package/dist/components/atomic/form-row.js.map +1 -0
  49. package/dist/components/{hover-card.js → atomic/hover-card.js} +8 -8
  50. package/dist/components/atomic/hover-card.js.map +1 -0
  51. package/dist/components/{info-tip.js → atomic/info-tip.js} +10 -10
  52. package/dist/components/atomic/info-tip.js.map +1 -0
  53. package/dist/components/{input-otp.js → atomic/input-otp.js} +3 -3
  54. package/dist/components/atomic/input-otp.js.map +1 -0
  55. package/dist/components/{input.js → atomic/input.js} +3 -3
  56. package/dist/components/atomic/input.js.map +1 -0
  57. package/dist/components/{kbd.js → atomic/kbd.js} +2 -2
  58. package/dist/components/atomic/kbd.js.map +1 -0
  59. package/dist/components/atomic/key-value.js +68 -0
  60. package/dist/components/atomic/key-value.js.map +1 -0
  61. package/dist/components/{label.js → atomic/label.js} +2 -2
  62. package/dist/components/atomic/label.js.map +1 -0
  63. package/dist/components/{menubar.js → atomic/menubar.js} +48 -14
  64. package/dist/components/atomic/menubar.js.map +1 -0
  65. package/dist/components/{native-select.js → atomic/native-select.js} +6 -7
  66. package/dist/components/atomic/native-select.js.map +1 -0
  67. package/dist/components/{navigation-menu.js → atomic/navigation-menu.js} +11 -12
  68. package/dist/components/atomic/navigation-menu.js.map +1 -0
  69. package/dist/components/{pagination.js → atomic/pagination.js} +1 -1
  70. package/dist/components/atomic/pagination.js.map +1 -0
  71. package/dist/components/{popover.js → atomic/popover.js} +10 -10
  72. package/dist/components/atomic/popover.js.map +1 -0
  73. package/dist/components/{progress.js → atomic/progress.js} +2 -2
  74. package/dist/components/atomic/progress.js.map +1 -0
  75. package/dist/components/{radio-group.js → atomic/radio-group.js} +4 -4
  76. package/dist/components/atomic/radio-group.js.map +1 -0
  77. package/dist/components/{scroll-area.js → atomic/scroll-area.js} +2 -2
  78. package/dist/components/atomic/scroll-area.js.map +1 -0
  79. package/dist/components/{section-descriptor.js → atomic/section-descriptor.js} +2 -2
  80. package/dist/components/atomic/section-descriptor.js.map +1 -0
  81. package/dist/components/{select-listbox.js → atomic/select-listbox.js} +1 -1
  82. package/dist/components/atomic/select-listbox.js.map +1 -0
  83. package/dist/components/{select.js → atomic/select.js} +26 -16
  84. package/dist/components/atomic/select.js.map +1 -0
  85. package/dist/components/{separator.js → atomic/separator.js} +2 -2
  86. package/dist/components/atomic/separator.js.map +1 -0
  87. package/dist/components/{sheet.js → atomic/sheet.js} +11 -10
  88. package/dist/components/atomic/sheet.js.map +1 -0
  89. package/dist/components/{sidebar.js → atomic/sidebar.js} +5 -5
  90. package/dist/components/atomic/sidebar.js.map +1 -0
  91. package/dist/components/{skeleton.js → atomic/skeleton.js} +2 -2
  92. package/dist/components/atomic/skeleton.js.map +1 -0
  93. package/dist/components/{slider.js → atomic/slider.js} +3 -3
  94. package/dist/components/atomic/slider.js.map +1 -0
  95. package/dist/components/{sonner.js → atomic/sonner.js} +2 -2
  96. package/dist/components/atomic/sonner.js.map +1 -0
  97. package/dist/components/{spinner.js → atomic/spinner.js} +1 -1
  98. package/dist/components/atomic/spinner.js.map +1 -0
  99. package/dist/components/atomic/status-item.js +42 -0
  100. package/dist/components/atomic/status-item.js.map +1 -0
  101. package/dist/components/{switch.js → atomic/switch.js} +4 -4
  102. package/dist/components/atomic/switch.js.map +1 -0
  103. package/dist/components/{table.js → atomic/table.js} +2 -2
  104. package/dist/components/atomic/table.js.map +1 -0
  105. package/dist/components/{tabs.js → atomic/tabs.js} +4 -4
  106. package/dist/components/atomic/tabs.js.map +1 -0
  107. package/dist/components/{textarea.js → atomic/textarea.js} +3 -3
  108. package/dist/components/atomic/textarea.js.map +1 -0
  109. package/dist/components/{toggle-group.js → atomic/toggle-group.js} +2 -2
  110. package/dist/components/atomic/toggle-group.js.map +1 -0
  111. package/dist/components/{toggle.js → atomic/toggle.js} +3 -3
  112. package/dist/components/atomic/toggle.js.map +1 -0
  113. package/dist/components/{tooltip.js → atomic/tooltip.js} +8 -8
  114. package/dist/components/atomic/tooltip.js.map +1 -0
  115. package/dist/components/atomic/use-count-tween.js +42 -0
  116. package/dist/components/atomic/use-count-tween.js.map +1 -0
  117. package/dist/components/derived/animated-number.js +157 -0
  118. package/dist/components/derived/animated-number.js.map +1 -0
  119. package/dist/components/{carousel.js → derived/carousel.js} +4 -4
  120. package/dist/components/derived/carousel.js.map +1 -0
  121. package/dist/components/derived/command-palette.js +119 -0
  122. package/dist/components/derived/command-palette.js.map +1 -0
  123. package/dist/components/derived/confirm-dialog.js +123 -0
  124. package/dist/components/derived/confirm-dialog.js.map +1 -0
  125. package/dist/components/{date-time-picker.js → derived/date-time-picker.js} +8 -8
  126. package/dist/components/derived/date-time-picker.js.map +1 -0
  127. package/dist/components/{field.js → derived/field.js} +6 -6
  128. package/dist/components/derived/field.js.map +1 -0
  129. package/dist/components/{form.js → derived/form.js} +4 -4
  130. package/dist/components/derived/form.js.map +1 -0
  131. package/dist/components/derived/icon-button.js +35 -0
  132. package/dist/components/derived/icon-button.js.map +1 -0
  133. package/dist/components/{input-group.js → derived/input-group.js} +5 -5
  134. package/dist/components/derived/input-group.js.map +1 -0
  135. package/dist/components/{item.js → derived/item.js} +4 -4
  136. package/dist/components/derived/item.js.map +1 -0
  137. package/dist/components/derived/popover-form.js +60 -0
  138. package/dist/components/derived/popover-form.js.map +1 -0
  139. package/dist/components/derived/settings.js +94 -0
  140. package/dist/components/derived/settings.js.map +1 -0
  141. package/dist/components/shell/account-list.js +128 -0
  142. package/dist/components/shell/account-list.js.map +1 -0
  143. package/dist/components/shell/account-menu-profile.js +114 -0
  144. package/dist/components/shell/account-menu-profile.js.map +1 -0
  145. package/dist/components/shell/account-menu.js +97 -0
  146. package/dist/components/shell/account-menu.js.map +1 -0
  147. package/dist/components/shell/account-settings-dialog.js +84 -0
  148. package/dist/components/shell/account-settings-dialog.js.map +1 -0
  149. package/dist/components/{app-shell.js → shell/app-shell.js} +10 -1
  150. package/dist/components/shell/app-shell.js.map +1 -0
  151. package/dist/components/shell/aside.js +140 -0
  152. package/dist/components/shell/aside.js.map +1 -0
  153. package/dist/components/{auth-wall.js → shell/auth-wall.js} +1 -1
  154. package/dist/components/shell/auth-wall.js.map +1 -0
  155. package/dist/components/{bottom-tab-bar.js → shell/bottom-tab-bar.js} +1 -1
  156. package/dist/components/shell/bottom-tab-bar.js.map +1 -0
  157. package/dist/components/shell/chat-composer.js +141 -0
  158. package/dist/components/shell/chat-composer.js.map +1 -0
  159. package/dist/components/shell/chat-message.js +195 -0
  160. package/dist/components/shell/chat-message.js.map +1 -0
  161. package/dist/components/shell/chat-panel.js +137 -0
  162. package/dist/components/shell/chat-panel.js.map +1 -0
  163. package/dist/components/shell/chat-stream-text.js +69 -0
  164. package/dist/components/shell/chat-stream-text.js.map +1 -0
  165. package/dist/components/shell/chat-typing.js +26 -0
  166. package/dist/components/shell/chat-typing.js.map +1 -0
  167. package/dist/components/{footer.js → shell/footer.js} +1 -1
  168. package/dist/components/shell/footer.js.map +1 -0
  169. package/dist/components/shell/header-controls.js +149 -0
  170. package/dist/components/shell/header-controls.js.map +1 -0
  171. package/dist/components/{list-rows.js → shell/list-rows.js} +1 -1
  172. package/dist/components/shell/list-rows.js.map +1 -0
  173. package/dist/components/{logo.js → shell/logo.js} +1 -1
  174. package/dist/components/shell/logo.js.map +1 -0
  175. package/dist/components/{mobile-app-bar.js → shell/mobile-app-bar.js} +1 -1
  176. package/dist/components/shell/mobile-app-bar.js.map +1 -0
  177. package/dist/components/{nav-badge.js → shell/nav-badge.js} +1 -1
  178. package/dist/components/shell/nav-badge.js.map +1 -0
  179. package/dist/components/shell/nav-collapse.js +142 -0
  180. package/dist/components/shell/nav-collapse.js.map +1 -0
  181. package/dist/components/shell/nav-link.js.map +1 -0
  182. package/dist/components/shell/nav-model.js.map +1 -0
  183. package/dist/components/{page-frame.js → shell/page-frame.js} +3 -6
  184. package/dist/components/shell/page-frame.js.map +1 -0
  185. package/dist/components/{resource-error.js → shell/resource-error.js} +4 -4
  186. package/dist/components/shell/resource-error.js.map +1 -0
  187. package/dist/components/shell/section-nav.js +139 -0
  188. package/dist/components/shell/section-nav.js.map +1 -0
  189. package/dist/components/shell/settled.js.map +1 -0
  190. package/dist/components/shell/shell-icons.js.map +1 -0
  191. package/dist/components/{shell-nav.js → shell/shell-nav.js} +81 -39
  192. package/dist/components/shell/shell-nav.js.map +1 -0
  193. package/dist/components/shell/smart-header.js +53 -0
  194. package/dist/components/shell/smart-header.js.map +1 -0
  195. package/dist/components/{status-screen.js → shell/status-screen.js} +3 -3
  196. package/dist/components/shell/status-screen.js.map +1 -0
  197. package/dist/components/{system-banner.js → shell/system-banner.js} +23 -13
  198. package/dist/components/shell/system-banner.js.map +1 -0
  199. package/dist/components/{top-bar.js → shell/top-bar.js} +5 -4
  200. package/dist/components/shell/top-bar.js.map +1 -0
  201. package/dist/components/shell/use-shell-nav.js.map +1 -0
  202. package/dist/components/shell/workspace-tab.js +140 -0
  203. package/dist/components/shell/workspace-tab.js.map +1 -0
  204. package/dist/generated/accent.js +2 -2
  205. package/dist/generated/accent.js.map +1 -1
  206. package/dist/generated/account-list.js +35 -0
  207. package/dist/generated/account-list.js.map +1 -0
  208. package/dist/generated/account-settings-dialog.js +27 -0
  209. package/dist/generated/account-settings-dialog.js.map +1 -0
  210. package/dist/generated/alert-dialog.js +1 -1
  211. package/dist/generated/alert-dialog.js.map +1 -1
  212. package/dist/generated/alert.js +2 -2
  213. package/dist/generated/alert.js.map +1 -1
  214. package/dist/generated/aside.js +36 -0
  215. package/dist/generated/aside.js.map +1 -0
  216. package/dist/generated/badge.js +7 -6
  217. package/dist/generated/badge.js.map +1 -1
  218. package/dist/generated/band.js +1 -1
  219. package/dist/generated/band.js.map +1 -1
  220. package/dist/generated/breadcrumb.js +2 -2
  221. package/dist/generated/breadcrumb.js.map +1 -1
  222. package/dist/generated/button-group.js +2 -2
  223. package/dist/generated/button-group.js.map +1 -1
  224. package/dist/generated/button.js +4 -4
  225. package/dist/generated/button.js.map +1 -1
  226. package/dist/generated/card.js +6 -6
  227. package/dist/generated/card.js.map +1 -1
  228. package/dist/generated/chat-composer.js +21 -0
  229. package/dist/generated/chat-composer.js.map +1 -0
  230. package/dist/generated/chat-message.js +86 -0
  231. package/dist/generated/chat-message.js.map +1 -0
  232. package/dist/generated/chat-typing.js +9 -0
  233. package/dist/generated/chat-typing.js.map +1 -0
  234. package/dist/generated/command-palette.js +17 -0
  235. package/dist/generated/command-palette.js.map +1 -0
  236. package/dist/generated/command.js +2 -2
  237. package/dist/generated/command.js.map +1 -1
  238. package/dist/generated/confirm-dialog.js +28 -0
  239. package/dist/generated/confirm-dialog.js.map +1 -0
  240. package/dist/generated/context-menu.js +1 -1
  241. package/dist/generated/context-menu.js.map +1 -1
  242. package/dist/generated/date-time-picker.js +1 -1
  243. package/dist/generated/date-time-picker.js.map +1 -1
  244. package/dist/generated/dialog.js +1 -1
  245. package/dist/generated/dialog.js.map +1 -1
  246. package/dist/generated/drawer.js +1 -1
  247. package/dist/generated/drawer.js.map +1 -1
  248. package/dist/generated/dropdown-menu.js +1 -1
  249. package/dist/generated/dropdown-menu.js.map +1 -1
  250. package/dist/generated/form-row.js +17 -0
  251. package/dist/generated/form-row.js.map +1 -0
  252. package/dist/generated/header-controls.js +56 -0
  253. package/dist/generated/header-controls.js.map +1 -0
  254. package/dist/generated/icon-button.js +13 -0
  255. package/dist/generated/icon-button.js.map +1 -0
  256. package/dist/generated/key-value.js +15 -0
  257. package/dist/generated/key-value.js.map +1 -0
  258. package/dist/generated/menubar.js +1 -1
  259. package/dist/generated/menubar.js.map +1 -1
  260. package/dist/generated/navigation-menu.js +1 -1
  261. package/dist/generated/navigation-menu.js.map +1 -1
  262. package/dist/generated/popover-form.js +13 -0
  263. package/dist/generated/popover-form.js.map +1 -0
  264. package/dist/generated/section-label.js +10 -0
  265. package/dist/generated/section-label.js.map +1 -0
  266. package/dist/generated/select.js +15 -3
  267. package/dist/generated/select.js.map +1 -1
  268. package/dist/generated/settings.js +36 -0
  269. package/dist/generated/settings.js.map +1 -0
  270. package/dist/generated/sheet.js +1 -1
  271. package/dist/generated/sheet.js.map +1 -1
  272. package/dist/generated/slider.js +1 -1
  273. package/dist/generated/slider.js.map +1 -1
  274. package/dist/generated/smart-header.js +11 -0
  275. package/dist/generated/smart-header.js.map +1 -0
  276. package/dist/generated/sonner.js +4 -4
  277. package/dist/generated/sonner.js.map +1 -1
  278. package/dist/generated/status-item.js +17 -0
  279. package/dist/generated/status-item.js.map +1 -0
  280. package/dist/generated/system-banner.js +33 -0
  281. package/dist/generated/system-banner.js.map +1 -0
  282. package/dist/generated/top-bar.js +9 -0
  283. package/dist/generated/top-bar.js.map +1 -0
  284. package/dist/generated/workspace-tab.js +17 -0
  285. package/dist/generated/workspace-tab.js.map +1 -0
  286. package/dist/icons/select-chevron.js.map +1 -0
  287. package/dist/icons/ui-icons.js +77 -0
  288. package/dist/icons/ui-icons.js.map +1 -0
  289. package/dist/index.d.ts +852 -156
  290. package/dist/index.js +96 -76
  291. package/dist/lib/cn.js +8 -1
  292. package/dist/lib/cn.js.map +1 -1
  293. package/dist/lib/number-parts.js +90 -0
  294. package/dist/lib/number-parts.js.map +1 -0
  295. package/dist/palette-cli.js +1 -1
  296. package/dist/palette.d.ts +6 -4
  297. package/dist/palette.js +3 -1
  298. package/dist/primitives/dismissable-layer.js +76 -4
  299. package/dist/primitives/dismissable-layer.js.map +1 -1
  300. package/dist/primitives/focus-scope.js +20 -5
  301. package/dist/primitives/focus-scope.js.map +1 -1
  302. package/dist/primitives/use-floating.js +16 -1
  303. package/dist/primitives/use-floating.js.map +1 -1
  304. package/dist/primitives/use-reduced-motion.js +20 -0
  305. package/dist/primitives/use-reduced-motion.js.map +1 -0
  306. package/package.json +2 -2
  307. package/styles/ev.css +281 -49
  308. package/styles/theme.css +335 -39
  309. package/styles/tokens.css +643 -103
  310. package/dist/chunk-3IPB4QQJ.js.map +0 -1
  311. package/dist/components/accordion.js.map +0 -1
  312. package/dist/components/account-menu.js +0 -70
  313. package/dist/components/account-menu.js.map +0 -1
  314. package/dist/components/alert-dialog.js.map +0 -1
  315. package/dist/components/alert.js.map +0 -1
  316. package/dist/components/app-shell.js.map +0 -1
  317. package/dist/components/auth-wall.js.map +0 -1
  318. package/dist/components/avatar.js.map +0 -1
  319. package/dist/components/badge.js.map +0 -1
  320. package/dist/components/band.js.map +0 -1
  321. package/dist/components/bottom-tab-bar.js.map +0 -1
  322. package/dist/components/breadcrumb.js.map +0 -1
  323. package/dist/components/button-group.js.map +0 -1
  324. package/dist/components/button.js.map +0 -1
  325. package/dist/components/calendar.js.map +0 -1
  326. package/dist/components/card.js.map +0 -1
  327. package/dist/components/carousel.js.map +0 -1
  328. package/dist/components/checkbox.js.map +0 -1
  329. package/dist/components/collapsible.js.map +0 -1
  330. package/dist/components/command.js.map +0 -1
  331. package/dist/components/container.js.map +0 -1
  332. package/dist/components/context-menu.js.map +0 -1
  333. package/dist/components/date-time-picker.js.map +0 -1
  334. package/dist/components/dialog.js.map +0 -1
  335. package/dist/components/drawer.js.map +0 -1
  336. package/dist/components/dropdown-menu.js.map +0 -1
  337. package/dist/components/empty.js.map +0 -1
  338. package/dist/components/field-context.js.map +0 -1
  339. package/dist/components/field.js.map +0 -1
  340. package/dist/components/footer.js.map +0 -1
  341. package/dist/components/form.js.map +0 -1
  342. package/dist/components/hover-card.js.map +0 -1
  343. package/dist/components/info-tip.js.map +0 -1
  344. package/dist/components/input-group.js.map +0 -1
  345. package/dist/components/input-otp.js.map +0 -1
  346. package/dist/components/input.js.map +0 -1
  347. package/dist/components/item.js.map +0 -1
  348. package/dist/components/kbd.js.map +0 -1
  349. package/dist/components/label.js.map +0 -1
  350. package/dist/components/list-rows.js.map +0 -1
  351. package/dist/components/logo.js.map +0 -1
  352. package/dist/components/menubar.js.map +0 -1
  353. package/dist/components/mobile-app-bar.js.map +0 -1
  354. package/dist/components/native-select.js.map +0 -1
  355. package/dist/components/nav-badge.js.map +0 -1
  356. package/dist/components/nav-link.js.map +0 -1
  357. package/dist/components/nav-model.js.map +0 -1
  358. package/dist/components/navigation-menu.js.map +0 -1
  359. package/dist/components/page-frame.js.map +0 -1
  360. package/dist/components/pagination.js.map +0 -1
  361. package/dist/components/popover.js.map +0 -1
  362. package/dist/components/progress.js.map +0 -1
  363. package/dist/components/radio-group.js.map +0 -1
  364. package/dist/components/resource-error.js.map +0 -1
  365. package/dist/components/scroll-area.js.map +0 -1
  366. package/dist/components/section-descriptor.js.map +0 -1
  367. package/dist/components/section-nav.js +0 -86
  368. package/dist/components/section-nav.js.map +0 -1
  369. package/dist/components/select-chevron.js.map +0 -1
  370. package/dist/components/select-listbox.js.map +0 -1
  371. package/dist/components/select.js.map +0 -1
  372. package/dist/components/separator.js.map +0 -1
  373. package/dist/components/settled.js.map +0 -1
  374. package/dist/components/sheet.js.map +0 -1
  375. package/dist/components/shell-icons.js.map +0 -1
  376. package/dist/components/shell-nav.js.map +0 -1
  377. package/dist/components/sidebar.js.map +0 -1
  378. package/dist/components/skeleton.js.map +0 -1
  379. package/dist/components/slider.js.map +0 -1
  380. package/dist/components/sonner.js.map +0 -1
  381. package/dist/components/spinner.js.map +0 -1
  382. package/dist/components/status-screen.js.map +0 -1
  383. package/dist/components/switch.js.map +0 -1
  384. package/dist/components/system-banner.js.map +0 -1
  385. package/dist/components/table.js.map +0 -1
  386. package/dist/components/tabs.js.map +0 -1
  387. package/dist/components/terminal.js +0 -206
  388. package/dist/components/terminal.js.map +0 -1
  389. package/dist/components/textarea.js.map +0 -1
  390. package/dist/components/toggle-group.js.map +0 -1
  391. package/dist/components/toggle.js.map +0 -1
  392. package/dist/components/tooltip.js.map +0 -1
  393. package/dist/components/top-bar.js.map +0 -1
  394. package/dist/components/use-shell-nav.js.map +0 -1
  395. package/dist/generated/terminal.js +0 -70
  396. package/dist/generated/terminal.js.map +0 -1
  397. /package/dist/components/{field-context.js → atomic/field-context.js} +0 -0
  398. /package/dist/components/{nav-link.js → shell/nav-link.js} +0 -0
  399. /package/dist/components/{nav-model.js → shell/nav-model.js} +0 -0
  400. /package/dist/components/{settled.js → shell/settled.js} +0 -0
  401. /package/dist/components/{shell-icons.js → shell/shell-icons.js} +0 -0
  402. /package/dist/components/{use-shell-nav.js → shell/use-shell-nav.js} +0 -0
  403. /package/dist/{components → icons}/select-chevron.js +0 -0
package/dist/index.js CHANGED
@@ -9,79 +9,99 @@ export { usePresence } from "./primitives/presence.js";
9
9
  export { useRovingFocus } from "./primitives/use-roving-focus.js";
10
10
  export { useHoverIntent } from "./primitives/use-hover-intent.js";
11
11
  export { mergeRefs } from "./primitives/merge-refs.js";
12
- export { Alert, AlertTitle, AlertDescription } from "./components/alert.js";
13
- export { Avatar, AvatarImage, AvatarFallback } from "./components/avatar.js";
14
- export { Badge } from "./components/badge.js";
15
- export { Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, BreadcrumbSeparator, BreadcrumbEllipsis, } from "./components/breadcrumb.js";
16
- export { Button, buttonVariants } from "./components/button.js";
17
- export { ButtonGroup, ButtonGroupText, ButtonGroupSeparator, } from "./components/button-group.js";
18
- export { Card, CardHeader, CardTitle, CardDescription, CardAction, CardContent, CardFooter, } from "./components/card.js";
19
- export { Empty, EmptyHeader, EmptyMedia, EmptyTitle, EmptyDescription, EmptyContent, } from "./components/empty.js";
20
- export { AuthWall } from "./components/auth-wall.js";
21
- export { Field, FieldSet, FieldLegend, FieldGroup, FieldContent, FieldLabel, FieldTitle, FieldDescription, FieldSeparator, FieldError, } from "./components/field.js";
22
- export { SectionDescriptor } from "./components/section-descriptor.js";
23
- export { Footer } from "./components/footer.js";
24
- export { Input } from "./components/input.js";
25
- export { Textarea } from "./components/textarea.js";
26
- export { Label } from "./components/label.js";
27
- export { Logo } from "./components/logo.js";
28
- export { InputGroup, InputGroupAddon, InputGroupButton, InputGroupText, InputGroupInput, InputGroupTextarea, } from "./components/input-group.js";
29
- export { Item, ItemMedia, ItemContent, ItemTitle, ItemDescription, ItemActions, ItemHeader, ItemFooter, ItemGroup, ItemSeparator, } from "./components/item.js";
30
- export { Kbd, KbdGroup } from "./components/kbd.js";
31
- export { Pagination, PaginationContent, PaginationItem, PaginationLink, PaginationPrevious, PaginationNext, PaginationEllipsis, } from "./components/pagination.js";
32
- export { Progress } from "./components/progress.js";
33
- export { Separator } from "./components/separator.js";
34
- export { Skeleton } from "./components/skeleton.js";
35
- export { Spinner } from "./components/spinner.js";
36
- export { StatusScreen, NotFound, Forbidden, ServerError, statusCtaClass, } from "./components/status-screen.js";
37
- export { Table, TableHeader, TableBody, TableFooter, TableRow, TableHead, TableCell, TableCaption, TableCard, } from "./components/table.js";
38
- export { ListRows, ListRow, ListRowLabel, ListRowValue, } from "./components/list-rows.js";
39
- export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "./components/accordion.js";
40
- export { Collapsible, CollapsibleContent, CollapsibleTrigger, } from "./components/collapsible.js";
41
- export { Container, } from "./components/container.js";
42
- export { Check, Display, Eyebrow, Prose, Section, SectionHead, Stat, } from "./components/band.js";
43
- export { Tabs, TabsContent, TabsList, TabsTrigger, } from "./components/tabs.js";
44
- export { Toggle, toggleVariants, } from "./components/toggle.js";
45
- export { ToggleGroup, ToggleGroupItem, } from "./components/toggle-group.js";
46
- export { Switch, } from "./components/switch.js";
47
- export { Checkbox, } from "./components/checkbox.js";
48
- export { RadioGroup, RadioGroupItem, } from "./components/radio-group.js";
49
- export { Slider, } from "./components/slider.js";
50
- export { ScrollArea, ScrollBar, } from "./components/scroll-area.js";
51
- export { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInset, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, useSidebar, } from "./components/sidebar.js";
52
- export { Carousel, CarouselContent, CarouselEdgeFade, CarouselItem, CarouselNext, CarouselPrevious, } from "./components/carousel.js";
53
- export { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, } from "./components/input-otp.js";
54
- export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "./components/tooltip.js";
55
- export { Popover, PopoverAnchor, PopoverContent, PopoverTrigger, } from "./components/popover.js";
56
- export { InfoTip, InfoTipContent, InfoTipTrigger, } from "./components/info-tip.js";
57
- export { HoverCard, HoverCardContent, HoverCardTrigger, } from "./components/hover-card.js";
58
- export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from "./components/dropdown-menu.js";
59
- export { ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, } from "./components/context-menu.js";
60
- export { Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, } from "./components/menubar.js";
61
- export { NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, navigationMenuTriggerStyle, } from "./components/navigation-menu.js";
62
- export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, } from "./components/dialog.js";
63
- export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogTitle, AlertDialogTrigger, } from "./components/alert-dialog.js";
64
- export { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetTitle, SheetTrigger, } from "./components/sheet.js";
65
- export { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerTitle, DrawerTrigger, } from "./components/drawer.js";
66
- export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue, } from "./components/select.js";
67
- export { NativeSelect, NativeSelectGroup, NativeSelectOption, } from "./components/native-select.js";
68
- export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, } from "./components/command.js";
69
- export { Calendar, } from "./components/calendar.js";
70
- export { DateTimePicker, } from "./components/date-time-picker.js";
71
- export { Toaster, toast, } from "./components/sonner.js";
72
- export { Form, FormControl, FormDescription, FormItem, FormLabel, FormMessage, } from "./components/form.js";
73
- export { OpenOrdersEmpty, OrderBook, OrderBookHead, OrderBookRow, OrderBookSpread, OrderForm, OrderFormRow, OrderFormSubmit, Terminal, TerminalChart, TerminalPane, TerminalPaneBody, TerminalPaneHeader, TerminalTicker, TickerStat, TradesTapeRow, } from "./components/terminal.js";
74
- export { AppShell } from "./components/app-shell.js";
75
- export { isNavItemActive, isPlainLeftClick, navItemMatch, resolveActiveNavItem, } from "./components/nav-model.js";
76
- export { usePendingNavigation } from "./components/use-shell-nav.js";
77
- export { ShellNav } from "./components/shell-nav.js";
78
- export { NavBadge, NavDot } from "./components/nav-badge.js";
79
- export { BottomTabBar } from "./components/bottom-tab-bar.js";
80
- export { TopBar } from "./components/top-bar.js";
81
- export { AccountMenu } from "./components/account-menu.js";
82
- export { MobileAppBar } from "./components/mobile-app-bar.js";
83
- export { PageFrame, PageHeading, SectionLabel } from "./components/page-frame.js";
84
- export { SectionNav } from "./components/section-nav.js";
85
- export { ResourceError } from "./components/resource-error.js";
86
- export { SystemBanner } from "./components/system-banner.js";
87
- export { Settled } from "./components/settled.js";
12
+ export { Alert, AlertTitle, AlertDescription } from "./components/atomic/alert.js";
13
+ export { Avatar, AvatarImage, AvatarFallback } from "./components/atomic/avatar.js";
14
+ export { Badge } from "./components/atomic/badge.js";
15
+ export { Breadcrumb, BreadcrumbList, BreadcrumbItem, BreadcrumbLink, BreadcrumbPage, BreadcrumbSeparator, BreadcrumbEllipsis, } from "./components/atomic/breadcrumb.js";
16
+ export { Button, buttonVariants } from "./components/atomic/button.js";
17
+ export { ButtonGroup, ButtonGroupText, ButtonGroupSeparator, } from "./components/atomic/button-group.js";
18
+ export { Card, CardHeader, CardTitle, CardDescription, CardAction, CardContent, CardFooter, } from "./components/atomic/card.js";
19
+ export { Empty, EmptyHeader, EmptyMedia, EmptyTitle, EmptyDescription, EmptyContent, } from "./components/atomic/empty.js";
20
+ export { AuthWall } from "./components/shell/auth-wall.js";
21
+ export { Field, FieldSet, FieldLegend, FieldGroup, FieldContent, FieldLabel, FieldTitle, FieldDescription, FieldSeparator, FieldError, } from "./components/derived/field.js";
22
+ export { SectionDescriptor } from "./components/atomic/section-descriptor.js";
23
+ export { Footer } from "./components/shell/footer.js";
24
+ export { Input } from "./components/atomic/input.js";
25
+ export { Textarea } from "./components/atomic/textarea.js";
26
+ export { Label } from "./components/atomic/label.js";
27
+ export { Logo } from "./components/shell/logo.js";
28
+ export { InputGroup, InputGroupAddon, InputGroupButton, InputGroupText, InputGroupInput, InputGroupTextarea, } from "./components/derived/input-group.js";
29
+ export { Item, ItemMedia, ItemContent, ItemTitle, ItemDescription, ItemActions, ItemHeader, ItemFooter, ItemGroup, ItemSeparator, } from "./components/derived/item.js";
30
+ export { Kbd, KbdGroup } from "./components/atomic/kbd.js";
31
+ export { Pagination, PaginationContent, PaginationItem, PaginationLink, PaginationPrevious, PaginationNext, PaginationEllipsis, } from "./components/atomic/pagination.js";
32
+ export { Progress } from "./components/atomic/progress.js";
33
+ export { Separator } from "./components/atomic/separator.js";
34
+ export { Skeleton } from "./components/atomic/skeleton.js";
35
+ export { Spinner } from "./components/atomic/spinner.js";
36
+ export { StatusScreen, NotFound, Forbidden, ServerError, statusCtaClass, } from "./components/shell/status-screen.js";
37
+ export { Table, TableHeader, TableBody, TableFooter, TableRow, TableHead, TableCell, TableCaption, TableCard, } from "./components/atomic/table.js";
38
+ export { ListRows, ListRow, ListRowLabel, ListRowValue, } from "./components/shell/list-rows.js";
39
+ export { Accordion, AccordionContent, AccordionItem, AccordionTrigger, } from "./components/atomic/accordion.js";
40
+ export { Collapsible, CollapsibleContent, CollapsibleTrigger, } from "./components/atomic/collapsible.js";
41
+ export { Container, } from "./components/atomic/container.js";
42
+ export { Check, Display, Eyebrow, Prose, Section, SectionHead, Stat, } from "./components/atomic/band.js";
43
+ export { Tabs, TabsContent, TabsList, TabsTrigger, } from "./components/atomic/tabs.js";
44
+ export { Toggle, toggleVariants, } from "./components/atomic/toggle.js";
45
+ export { ToggleGroup, ToggleGroupItem, } from "./components/atomic/toggle-group.js";
46
+ export { Switch, } from "./components/atomic/switch.js";
47
+ export { Checkbox, } from "./components/atomic/checkbox.js";
48
+ export { RadioGroup, RadioGroupItem, } from "./components/atomic/radio-group.js";
49
+ export { Slider, } from "./components/atomic/slider.js";
50
+ export { ScrollArea, ScrollBar, } from "./components/atomic/scroll-area.js";
51
+ export { Sidebar, SidebarContent, SidebarFooter, SidebarGroup, SidebarGroupContent, SidebarGroupLabel, SidebarHeader, SidebarInset, SidebarMenu, SidebarMenuButton, SidebarMenuItem, SidebarProvider, SidebarRail, SidebarSeparator, SidebarTrigger, useSidebar, } from "./components/atomic/sidebar.js";
52
+ export { Carousel, CarouselContent, CarouselEdgeFade, CarouselItem, CarouselNext, CarouselPrevious, } from "./components/derived/carousel.js";
53
+ export { InputOTP, InputOTPGroup, InputOTPSeparator, InputOTPSlot, } from "./components/atomic/input-otp.js";
54
+ export { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "./components/atomic/tooltip.js";
55
+ export { Popover, PopoverAnchor, PopoverContent, PopoverTrigger, } from "./components/atomic/popover.js";
56
+ export { InfoTip, InfoTipContent, InfoTipTrigger, } from "./components/atomic/info-tip.js";
57
+ export { HoverCard, HoverCardContent, HoverCardTrigger, } from "./components/atomic/hover-card.js";
58
+ export { DropdownMenu, DropdownMenuCheckboxItem, DropdownMenuContent, DropdownMenuGroup, DropdownMenuItem, DropdownMenuLabel, DropdownMenuPortal, DropdownMenuRadioGroup, DropdownMenuRadioItem, DropdownMenuSeparator, DropdownMenuShortcut, DropdownMenuSub, DropdownMenuSubContent, DropdownMenuSubTrigger, DropdownMenuTrigger, } from "./components/atomic/dropdown-menu.js";
59
+ export { ContextMenu, ContextMenuCheckboxItem, ContextMenuContent, ContextMenuGroup, ContextMenuItem, ContextMenuLabel, ContextMenuPortal, ContextMenuRadioGroup, ContextMenuRadioItem, ContextMenuSeparator, ContextMenuShortcut, ContextMenuSub, ContextMenuSubContent, ContextMenuSubTrigger, ContextMenuTrigger, } from "./components/atomic/context-menu.js";
60
+ export { Menubar, MenubarCheckboxItem, MenubarContent, MenubarGroup, MenubarItem, MenubarLabel, MenubarMenu, MenubarRadioGroup, MenubarRadioItem, MenubarSeparator, MenubarShortcut, MenubarSub, MenubarSubContent, MenubarSubTrigger, MenubarTrigger, } from "./components/atomic/menubar.js";
61
+ export { NavigationMenu, NavigationMenuContent, NavigationMenuIndicator, NavigationMenuItem, NavigationMenuLink, NavigationMenuList, NavigationMenuTrigger, NavigationMenuViewport, navigationMenuTriggerStyle, } from "./components/atomic/navigation-menu.js";
62
+ export { Dialog, DialogClose, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogOverlay, DialogPortal, DialogTitle, DialogTrigger, } from "./components/atomic/dialog.js";
63
+ export { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogOverlay, AlertDialogTitle, AlertDialogTrigger, } from "./components/atomic/alert-dialog.js";
64
+ export { Sheet, SheetClose, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetOverlay, SheetTitle, SheetTrigger, } from "./components/atomic/sheet.js";
65
+ export { Drawer, DrawerClose, DrawerContent, DrawerDescription, DrawerFooter, DrawerHeader, DrawerOverlay, DrawerTitle, DrawerTrigger, } from "./components/atomic/drawer.js";
66
+ export { Select, SelectContent, SelectGroup, SelectItem, SelectLabel, SelectSeparator, SelectTrigger, SelectValue, } from "./components/atomic/select.js";
67
+ export { NativeSelect, NativeSelectGroup, NativeSelectOption, } from "./components/atomic/native-select.js";
68
+ export { Command, CommandDialog, CommandEmpty, CommandGroup, CommandInput, CommandItem, CommandList, CommandSeparator, CommandShortcut, } from "./components/atomic/command.js";
69
+ export { Calendar, } from "./components/atomic/calendar.js";
70
+ export { DateTimePicker, } from "./components/derived/date-time-picker.js";
71
+ export { Toaster, toast, } from "./components/atomic/sonner.js";
72
+ export { Form, FormControl, FormDescription, FormItem, FormLabel, FormMessage, } from "./components/derived/form.js";
73
+ export { AppShell } from "./components/shell/app-shell.js";
74
+ export { isNavItemActive, isPlainLeftClick, navItemMatch, resolveActiveNavItem, } from "./components/shell/nav-model.js";
75
+ export { usePendingNavigation } from "./components/shell/use-shell-nav.js";
76
+ export { ShellNav } from "./components/shell/shell-nav.js";
77
+ export { NavBadge, NavDot } from "./components/shell/nav-badge.js";
78
+ export { BottomTabBar } from "./components/shell/bottom-tab-bar.js";
79
+ export { TopBar } from "./components/shell/top-bar.js";
80
+ export { AccountMenu } from "./components/shell/account-menu.js";
81
+ export { MobileAppBar } from "./components/shell/mobile-app-bar.js";
82
+ export { PageFrame, PageHeading, SectionLabel } from "./components/shell/page-frame.js";
83
+ export { SectionNav } from "./components/shell/section-nav.js";
84
+ export { ResourceError } from "./components/shell/resource-error.js";
85
+ export { SystemBanner } from "./components/shell/system-banner.js";
86
+ export { Settled } from "./components/shell/settled.js";
87
+ export { AnimatedNumber } from "./components/derived/animated-number.js";
88
+ export { useCountTween } from "./components/atomic/use-count-tween.js";
89
+ export { IconButton } from "./components/derived/icon-button.js";
90
+ export { StatusItem, StatusDot } from "./components/atomic/status-item.js";
91
+ export { WorkspaceTabs, WorkspaceTab } from "./components/shell/workspace-tab.js";
92
+ export { KeyValue } from "./components/atomic/key-value.js";
93
+ export { FormRow } from "./components/atomic/form-row.js";
94
+ export { SettingsLayout, SettingsSection, SettingsRow } from "./components/derived/settings.js";
95
+ export { AccountSettingsDialog } from "./components/shell/account-settings-dialog.js";
96
+ export { ConfirmDialog } from "./components/derived/confirm-dialog.js";
97
+ export { AccountList, AccountListItem } from "./components/shell/account-list.js";
98
+ export { PopoverForm } from "./components/derived/popover-form.js";
99
+ export { CommandPalette, useCommandPaletteShortcut } from "./components/derived/command-palette.js";
100
+ export { HeaderBalance, HeaderSearch, NotificationBell } from "./components/shell/header-controls.js";
101
+ export { SmartHeader } from "./components/shell/smart-header.js";
102
+ export { AsideHeader, AsidePanel, AsideRail } from "./components/shell/aside.js";
103
+ export { ChatAttachment, ChatBubble, ChatMarker, ChatMessage } from "./components/shell/chat-message.js";
104
+ export { ChatStreamText } from "./components/shell/chat-stream-text.js";
105
+ export { ChatTyping } from "./components/shell/chat-typing.js";
106
+ export { ChatComposer, ModelChip } from "./components/shell/chat-composer.js";
107
+ export { ChatDock, ChatPanel } from "./components/shell/chat-panel.js";
package/dist/lib/cn.js CHANGED
@@ -1,5 +1,12 @@
1
1
  import { clsx } from "clsx";
2
- import { twMerge } from "tailwind-merge";
2
+ import { extendTailwindMerge } from "tailwind-merge";
3
+ const twMerge = extendTailwindMerge({
4
+ extend: {
5
+ classGroups: {
6
+ "font-size": [{ text: ["caption", "body-s", "body", "body-l", "h3", "h2", "h1", "figure-m", "figure-l"] }]
7
+ }
8
+ }
9
+ });
3
10
  function cn(...inputs) {
4
11
  if (inputs.length === 2 && typeof inputs[0] === "string" && !inputs[1]) {
5
12
  return inputs[0];
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/lib/cn.ts"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { twMerge } from \"tailwind-merge\";\n\n/**\n * Fuses class fragments into one string with real Tailwind conflict resolution:\n * `clsx` drops falsy fragments and joins the rest, `tailwind-merge` resolves\n * conflicting utilities so the rightmost wins (`cn(\"p-4\", \"p-2\") === \"p-2\"`). A\n * caller's `className` override, passed last, therefore beats the base classes.\n *\n * `twMerge` parses every utility on every render, and the overwhelmingly common\n * call is one kit constant plus a `className` override that is absent — so that\n * call returns the constant untouched.\n *\n * The Rust mirror is the `cn!` macro in `ev_lib::uikit` (`tailwind_fuse::tw_merge!`).\n */\nexport function cn(...inputs: ClassValue[]): string {\n if (inputs.length === 2 && typeof inputs[0] === \"string\" && !inputs[1]) {\n return inputs[0];\n }\n return twMerge(clsx(inputs));\n}\n"],"mappings":"AAAA,SAAS,YAA6B;AACtC,SAAS,eAAe;AAcjB,SAAS,MAAM,QAA8B;AAClD,MAAI,OAAO,WAAW,KAAK,OAAO,OAAO,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG;AACtE,WAAO,OAAO,CAAC;AAAA,EACjB;AACA,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;","names":[]}
1
+ {"version":3,"sources":["../../src/lib/cn.ts"],"sourcesContent":["import { clsx, type ClassValue } from \"clsx\";\nimport { extendTailwindMerge } from \"tailwind-merge\";\n\n// The kit's own type scale (theme.css `--text-*`). tailwind-merge only knows\n// t-shirt sizes as font sizes, so `text-body` would be filed under text colour\n// and dropped by a later `text-ink`. The Rust mirror is `fuse` in ev_lib_classes.\nconst twMerge = extendTailwindMerge({\n extend: {\n classGroups: {\n \"font-size\": [{ text: [\"caption\", \"body-s\", \"body\", \"body-l\", \"h3\", \"h2\", \"h1\", \"figure-m\", \"figure-l\"] }],\n },\n },\n});\n\n/**\n * Fuses class fragments into one string with real Tailwind conflict resolution:\n * `clsx` drops falsy fragments and joins the rest, `tailwind-merge` resolves\n * conflicting utilities so the rightmost wins (`cn(\"p-4\", \"p-2\") === \"p-2\"`). A\n * caller's `className` override, passed last, therefore beats the base classes.\n *\n * `twMerge` parses every utility on every render, and the overwhelmingly common\n * call is one kit constant plus a `className` override that is absent — so that\n * call returns the constant untouched.\n *\n * The Rust mirror is the `cn!` macro in `ev_lib::uikit` (`tailwind_fuse::tw_merge!`).\n */\nexport function cn(...inputs: ClassValue[]): string {\n if (inputs.length === 2 && typeof inputs[0] === \"string\" && !inputs[1]) {\n return inputs[0];\n }\n return twMerge(clsx(inputs));\n}\n"],"mappings":"AAAA,SAAS,YAA6B;AACtC,SAAS,2BAA2B;AAKpC,MAAM,UAAU,oBAAoB;AAAA,EAClC,QAAQ;AAAA,IACN,aAAa;AAAA,MACX,aAAa,CAAC,EAAE,MAAM,CAAC,WAAW,UAAU,QAAQ,UAAU,MAAM,MAAM,MAAM,YAAY,UAAU,EAAE,CAAC;AAAA,IAC3G;AAAA,EACF;AACF,CAAC;AAcM,SAAS,MAAM,QAA8B;AAClD,MAAI,OAAO,WAAW,KAAK,OAAO,OAAO,CAAC,MAAM,YAAY,CAAC,OAAO,CAAC,GAAG;AACtE,WAAO,OAAO,CAAC;AAAA,EACjB;AACA,SAAO,QAAQ,KAAK,MAAM,CAAC;AAC7B;","names":[]}
@@ -0,0 +1,90 @@
1
+ function digitGlyphs(formatter) {
2
+ const { numberingSystem } = formatter.resolvedOptions();
3
+ const plain = new Intl.NumberFormat("en", { useGrouping: false, numberingSystem });
4
+ return Array.from({ length: 10 }, (_, d) => plain.format(d));
5
+ }
6
+ function splitNumber(formatter, value, glyphs) {
7
+ const values = new Map(glyphs.map((glyph, digit) => [glyph, digit]));
8
+ const raw = formatter.formatToParts(value);
9
+ const integerDigits = raw.filter((p) => p.type === "integer").reduce((n, p) => n + Array.from(p.value).length, 0);
10
+ const parts = [];
11
+ const seen = /* @__PURE__ */ new Map();
12
+ const textKey = (type, side2) => {
13
+ const id = `${type}:${side2}`;
14
+ const n = seen.get(id) ?? 0;
15
+ seen.set(id, n + 1);
16
+ return `${id}:${n}`;
17
+ };
18
+ let side = "pre";
19
+ let placed = 0;
20
+ let fractionAt = 0;
21
+ for (const { type, value: text } of raw) {
22
+ if (type === "integer") {
23
+ side = "post";
24
+ for (const char of Array.from(text)) {
25
+ const digit = values.get(char);
26
+ const place = integerDigits - 1 - placed;
27
+ placed += 1;
28
+ parts.push(
29
+ digit === void 0 ? { kind: "text", key: textKey("integer", side), text: char } : { kind: "digit", key: `int:${place}`, digit }
30
+ );
31
+ }
32
+ } else if (type === "fraction") {
33
+ for (const char of Array.from(text)) {
34
+ const digit = values.get(char);
35
+ const at = fractionAt;
36
+ fractionAt += 1;
37
+ parts.push(
38
+ digit === void 0 ? { kind: "text", key: textKey("fraction", side), text: char } : { kind: "digit", key: `frac:${at}`, digit }
39
+ );
40
+ }
41
+ } else if (type === "group") {
42
+ parts.push({ kind: "text", key: `group:${integerDigits - 1 - placed}`, text });
43
+ } else if (type === "decimal") {
44
+ side = "post";
45
+ parts.push({ kind: "text", key: "decimal", text });
46
+ } else {
47
+ parts.push({ kind: "text", key: textKey(type, side), text });
48
+ }
49
+ }
50
+ return parts;
51
+ }
52
+ function rollStep(from, to, direction) {
53
+ const up = ((to - from) % 10 + 10) % 10;
54
+ const down = (10 - up) % 10;
55
+ if (direction === 1) return up;
56
+ if (direction === -1) return -down;
57
+ return up <= down ? up : -down;
58
+ }
59
+ function resolveDirection(trend, from, to) {
60
+ if (trend !== void 0) return trend;
61
+ return to > from ? 1 : to < from ? -1 : 0;
62
+ }
63
+ function mergeItems(previous, next, animate) {
64
+ const known = new Set(previous.map((item) => item.part.key));
65
+ const result = next.map((part) => ({
66
+ part,
67
+ exiting: false,
68
+ fresh: animate && !known.has(part.key)
69
+ }));
70
+ if (!animate) return result;
71
+ const nextKeys = new Set(next.map((part) => part.key));
72
+ let anchor = -1;
73
+ for (const item of previous) {
74
+ if (nextKeys.has(item.part.key)) {
75
+ anchor = result.findIndex((r) => r.part.key === item.part.key);
76
+ } else {
77
+ anchor += 1;
78
+ result.splice(anchor, 0, { part: item.part, exiting: true, fresh: false });
79
+ }
80
+ }
81
+ return result;
82
+ }
83
+ export {
84
+ digitGlyphs,
85
+ mergeItems,
86
+ resolveDirection,
87
+ rollStep,
88
+ splitNumber
89
+ };
90
+ //# sourceMappingURL=number-parts.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/number-parts.ts"],"sourcesContent":["/** A digit column or a fixed piece of a formatted number, with a stable identity across values. */\nexport type NumberPart =\n | { kind: \"digit\"; key: string; digit: number }\n | { kind: \"text\"; key: string; text: string };\n\nexport type RollDirection = 1 | -1 | 0;\n\n/** The ten digit glyphs of the formatter's numbering system (\"٠\"..\"٩\" in Arabic locales). */\nexport function digitGlyphs(formatter: Intl.NumberFormat): readonly string[] {\n const { numberingSystem } = formatter.resolvedOptions();\n const plain = new Intl.NumberFormat(\"en\", { useGrouping: false, numberingSystem });\n return Array.from({ length: 10 }, (_, d) => plain.format(d));\n}\n\n/**\n * Splits a formatted number into parts keyed by what they are, not where they\n * sit in the string. Integer digits are keyed by place value counted from the\n * right, fraction digits by position after the point: adding a leading digit\n * (9 -> 10) leaves every existing column's key alone, so React keeps those\n * nodes and only the new place enters. Everything else is keyed by type, the\n * side of the integer it sits on, and its order among same-type parts there.\n */\nexport function splitNumber(\n formatter: Intl.NumberFormat,\n value: number,\n glyphs: readonly string[],\n): NumberPart[] {\n const values = new Map(glyphs.map((glyph, digit) => [glyph, digit] as const));\n const raw = formatter.formatToParts(value);\n const integerDigits = raw\n .filter((p) => p.type === \"integer\")\n .reduce((n, p) => n + Array.from(p.value).length, 0);\n\n const parts: NumberPart[] = [];\n const seen = new Map<string, number>();\n const textKey = (type: string, side: string): string => {\n const id = `${type}:${side}`;\n const n = seen.get(id) ?? 0;\n seen.set(id, n + 1);\n return `${id}:${n}`;\n };\n let side = \"pre\";\n let placed = 0;\n let fractionAt = 0;\n\n for (const { type, value: text } of raw) {\n if (type === \"integer\") {\n side = \"post\";\n for (const char of Array.from(text)) {\n const digit = values.get(char);\n const place = integerDigits - 1 - placed;\n placed += 1;\n parts.push(\n digit === undefined\n ? { kind: \"text\", key: textKey(\"integer\", side), text: char }\n : { kind: \"digit\", key: `int:${place}`, digit },\n );\n }\n } else if (type === \"fraction\") {\n for (const char of Array.from(text)) {\n const digit = values.get(char);\n const at = fractionAt;\n fractionAt += 1;\n parts.push(\n digit === undefined\n ? { kind: \"text\", key: textKey(\"fraction\", side), text: char }\n : { kind: \"digit\", key: `frac:${at}`, digit },\n );\n }\n } else if (type === \"group\") {\n parts.push({ kind: \"text\", key: `group:${integerDigits - 1 - placed}`, text });\n } else if (type === \"decimal\") {\n side = \"post\";\n parts.push({ kind: \"text\", key: \"decimal\", text });\n } else {\n parts.push({ kind: \"text\", key: textKey(type, side), text });\n }\n }\n return parts;\n}\n\n/**\n * Signed number of steps a digit column travels. `1` always goes up (9 -> 0\n * wraps forward), `-1` always down, `0` takes the shorter way (a tie goes up).\n */\nexport function rollStep(from: number, to: number, direction: RollDirection): number {\n const up = (((to - from) % 10) + 10) % 10;\n const down = (10 - up) % 10;\n if (direction === 1) return up;\n if (direction === -1) return -down;\n return up <= down ? up : -down;\n}\n\n/** Which way the whole number moved: `trend` when given, else the sign of the change. */\nexport function resolveDirection(\n trend: RollDirection | undefined,\n from: number,\n to: number,\n): RollDirection {\n if (trend !== undefined) return trend;\n return to > from ? 1 : to < from ? -1 : 0;\n}\n\nexport interface NumberItem {\n part: NumberPart;\n /** Still on screen only to finish its exit; no longer in the value. */\n exiting: boolean;\n /** Enters from zero width; false for the first render and for reduced motion. */\n fresh: boolean;\n}\n\n/**\n * Carries the previous items into the next value. A key that is gone stays as\n * an exiting item in its old position (after the nearest surviving neighbour\n * to its left), so it can collapse instead of vanishing. A key that comes back\n * while exiting is reused, not remounted.\n */\nexport function mergeItems(\n previous: readonly NumberItem[],\n next: readonly NumberPart[],\n animate: boolean,\n): NumberItem[] {\n const known = new Set(previous.map((item) => item.part.key));\n const result: NumberItem[] = next.map((part) => ({\n part,\n exiting: false,\n fresh: animate && !known.has(part.key),\n }));\n if (!animate) return result;\n\n const nextKeys = new Set(next.map((part) => part.key));\n let anchor = -1;\n for (const item of previous) {\n if (nextKeys.has(item.part.key)) {\n anchor = result.findIndex((r) => r.part.key === item.part.key);\n } else {\n anchor += 1;\n result.splice(anchor, 0, { part: item.part, exiting: true, fresh: false });\n }\n }\n return result;\n}\n"],"mappings":"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","names":["side"]}
@@ -4,7 +4,7 @@ import {
4
4
  brandFromToml,
5
5
  readContract,
6
6
  renderPalette
7
- } from "./chunk-3IPB4QQJ.js";
7
+ } from "./chunk-35SPIU4U.js";
8
8
 
9
9
  // src/palette/cli.ts
10
10
  import { readFileSync, writeFileSync } from "fs";
package/dist/palette.d.ts CHANGED
@@ -13,7 +13,9 @@ interface Contract {
13
13
  derivedFrom: Readonly<Record<string, readonly string[]>>;
14
14
  }
15
15
  /** The rule the derived tokens live on — see `theme.css`, the contract half of `tokens.css`. */
16
- declare const DERIVED_SCOPE = ":where(:root, .dark, .light, [data-brand])";
16
+ declare const DERIVED_SCOPE = ":where(:root, .dark, .light, [data-brand], [data-theme])";
17
+ /** The same scopes in another order: the button faces and chips, derived the same way. */
18
+ declare const FACES_SCOPE = ":where([data-theme], [data-brand], .light, .dark, :root)";
17
19
  interface CssRule {
18
20
  selector: string;
19
21
  /** Custom properties declared directly in the rule, in source order. */
@@ -38,7 +40,7 @@ interface BrandConfig {
38
40
  /** `--brand-font-<role>`: a family name per role; unset roles keep the kit's. */
39
41
  fonts?: Partial<Record<FontRole, string>>;
40
42
  }
41
- type FontRole = "sans" | "display" | "mono";
43
+ type FontRole = "sans" | "serif" | "mono";
42
44
  declare const FONT_ROLES: readonly FontRole[];
43
45
  /** Every problem with a brand file at once, so one run fixes them all. */
44
46
  declare class PaletteError extends Error {
@@ -48,7 +50,7 @@ declare class PaletteError extends Error {
48
50
  /**
49
51
  * Reads the aquafix `brand.toml` shape: `[colors.light]` and `[colors.dark]`
50
52
  * keyed by contract name, optional top-level `mark` / `mark-aspect`, and the
51
- * family names in `[fonts]` (`sans` or `text`, `display`, `mono`). The rest of
53
+ * family names in `[fonts]` (`sans` or `text`, `serif`, `mono`). The rest of
52
54
  * `[fonts]` and every other table (`[print]`, …) belong to other tools and are
53
55
  * ignored — loading the font files is the site's job, not the palette's.
54
56
  */
@@ -77,4 +79,4 @@ interface TomlTable {
77
79
  }
78
80
  declare function parseToml(text: string): TomlTable;
79
81
 
80
- export { type BrandConfig, type Contract, type CssRule, DERIVED_SCOPE, FONT_ROLES, type FontRole, POLARITIES, PaletteError, type PolarityName, type TomlTable, type TomlValue, brandFromToml, parseToml, readContract, readRules, renderPalette, validateBrand };
82
+ export { type BrandConfig, type Contract, type CssRule, DERIVED_SCOPE, FACES_SCOPE, FONT_ROLES, type FontRole, POLARITIES, PaletteError, type PolarityName, type TomlTable, type TomlValue, brandFromToml, parseToml, readContract, readRules, renderPalette, validateBrand };
package/dist/palette.js CHANGED
@@ -1,5 +1,6 @@
1
1
  import {
2
2
  DERIVED_SCOPE,
3
+ FACES_SCOPE,
3
4
  FONT_ROLES,
4
5
  POLARITIES,
5
6
  PaletteError,
@@ -9,9 +10,10 @@ import {
9
10
  readRules,
10
11
  renderPalette,
11
12
  validateBrand
12
- } from "./chunk-3IPB4QQJ.js";
13
+ } from "./chunk-35SPIU4U.js";
13
14
  export {
14
15
  DERIVED_SCOPE,
16
+ FACES_SCOPE,
15
17
  FONT_ROLES,
16
18
  POLARITIES,
17
19
  PaletteError,
@@ -7,11 +7,15 @@ function isStore(value) {
7
7
  }
8
8
  function sharedStore() {
9
9
  const existing = Reflect.get(globalThis, STORE_KEY);
10
- if (isStore(existing)) return existing;
10
+ if (isStore(existing)) {
11
+ existing.listeners ??= /* @__PURE__ */ new Set();
12
+ return existing;
13
+ }
11
14
  const store2 = {
12
15
  stack: [],
13
16
  info: /* @__PURE__ */ new WeakMap(),
14
17
  seen: /* @__PURE__ */ new WeakMap(),
18
+ listeners: /* @__PURE__ */ new Set(),
15
19
  snapshot: (event) => {
16
20
  if (!store2.seen.has(event)) store2.seen.set(event, store2.stack.slice());
17
21
  }
@@ -55,6 +59,10 @@ function push(layer) {
55
59
  const firstChild = stack.findIndex((other) => isDescendant(other, layer));
56
60
  if (firstChild < 0) stack.push(layer);
57
61
  else stack.splice(firstChild, 0, layer);
62
+ notify();
63
+ }
64
+ function notify() {
65
+ for (const listener of store.listeners) listener();
58
66
  }
59
67
  function pop(layer) {
60
68
  const { stack } = store;
@@ -64,21 +72,84 @@ function pop(layer) {
64
72
  window.removeEventListener("keydown", store.snapshot, true);
65
73
  window.removeEventListener("pointerdown", store.snapshot, true);
66
74
  }
75
+ notify();
67
76
  }
68
77
  const ParentLayerContext = React.createContext(null);
78
+ const renderedModal = /* @__PURE__ */ new WeakMap();
79
+ const waitingForParent = /* @__PURE__ */ new WeakMap();
80
+ function liftAbove(child, parent) {
81
+ const node = child.current;
82
+ const parentNode = parent.current;
83
+ if (!node || !parentNode) return false;
84
+ if (!(parentNode.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_PRECEDING)) return true;
85
+ const view = node.ownerDocument.defaultView;
86
+ if (!view) return true;
87
+ const parentZ = Number.parseInt(view.getComputedStyle(parentNode).zIndex, 10);
88
+ const ownZ = Number.parseInt(view.getComputedStyle(node).zIndex, 10);
89
+ if (Number.isNaN(parentZ) || Number.isNaN(ownZ) || ownZ > parentZ) return true;
90
+ node.style.zIndex = String(parentZ + 2);
91
+ const scrim = node.previousElementSibling;
92
+ if (renderedModal.get(child) && scrim instanceof HTMLElement && scrim.dataset["slot"]?.endsWith("overlay")) {
93
+ scrim.style.zIndex = String(parentZ + 1);
94
+ }
95
+ return true;
96
+ }
97
+ function modalBelow(layer) {
98
+ const { stack } = store;
99
+ const index = stack.indexOf(layer);
100
+ const below = index < 0 ? stack : stack.slice(0, index);
101
+ return below.some((other) => other !== layer && store.info.get(other)?.modal === true);
102
+ }
103
+ function subscribe(listener) {
104
+ store.listeners.add(listener);
105
+ return () => store.listeners.delete(listener);
106
+ }
107
+ const CLEAR_SCRIM = Object.freeze({ backgroundColor: "transparent" });
108
+ function useModalScrimStyle(layer) {
109
+ const parent = React.useContext(ParentLayerContext);
110
+ const below = React.useSyncExternalStore(
111
+ subscribe,
112
+ () => modalBelow(layer),
113
+ () => false
114
+ );
115
+ return below || parent?.modalAbove === true ? CLEAR_SCRIM : void 0;
116
+ }
69
117
  function DismissableLayerScope({ layer, children }) {
70
- return /* @__PURE__ */ jsx(ParentLayerContext.Provider, { value: layer, children });
118
+ const outer = React.useContext(ParentLayerContext);
119
+ const outerModal = outer?.modalAbove ?? false;
120
+ const value = React.useMemo(
121
+ () => ({ layer, modalAbove: outerModal || renderedModal.get(layer) === true }),
122
+ [layer, outerModal]
123
+ );
124
+ return /* @__PURE__ */ jsx(ParentLayerContext.Provider, { value, children });
71
125
  }
72
126
  function useDismissableLayer(opts) {
73
127
  const { enabled, onDismiss, exclude, pointerOutside = true, modal = false } = opts;
74
- const parent = React.useContext(ParentLayerContext);
128
+ const parent = React.useContext(ParentLayerContext)?.layer ?? null;
75
129
  const ref = React.useRef(null);
130
+ renderedModal.set(ref, modal);
76
131
  const onDismissRef = React.useRef(onDismiss);
77
132
  const excludeRef = React.useRef(exclude);
78
133
  React.useEffect(() => {
79
134
  onDismissRef.current = onDismiss;
80
135
  excludeRef.current = exclude;
81
136
  });
137
+ React.useLayoutEffect(() => {
138
+ if (!enabled) return;
139
+ const waiting = waitingForParent.get(ref);
140
+ if (waiting) {
141
+ waitingForParent.delete(ref);
142
+ for (const child of waiting) liftAbove(child, ref);
143
+ }
144
+ if (parent && !liftAbove(ref, parent)) {
145
+ const siblings = waitingForParent.get(parent) ?? /* @__PURE__ */ new Set();
146
+ siblings.add(ref);
147
+ waitingForParent.set(parent, siblings);
148
+ }
149
+ return () => {
150
+ if (parent) waitingForParent.get(parent)?.delete(ref);
151
+ };
152
+ }, [enabled, parent]);
82
153
  React.useEffect(() => {
83
154
  if (!enabled) return;
84
155
  store.info.set(ref, { parent, modal });
@@ -108,6 +179,7 @@ function useDismissableLayer(opts) {
108
179
  export {
109
180
  DismissableLayerScope,
110
181
  LAYER_IGNORE_ATTR,
111
- useDismissableLayer
182
+ useDismissableLayer,
183
+ useModalScrimStyle
112
184
  };
113
185
  //# sourceMappingURL=dismissable-layer.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/primitives/dismissable-layer.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\ntype LayerRef = React.RefObject<HTMLDivElement | null>;\n\ninterface LayerInfo {\n /** The layer this one was rendered inside, from context — not the one below it on the stack. */\n parent: LayerRef | null;\n modal: boolean;\n}\n\ninterface LayerStore {\n // The open layers, bottom first. An overlay opened inside another (a Select\n // in a Dialog, a Popover in a Drawer) is portaled out of its parent's\n // subtree, so \"outside the parent\" would include it: the stack is what tells\n // a nested layer from the rest of the page.\n stack: LayerRef[];\n info: WeakMap<LayerRef, LayerInfo>;\n // The stack as it stood when an event started its trip. By the time the\n // document hears an Escape, a React `onKeyDown` on the way (a Select's, a\n // consumer's) may already have closed the top layer and — a discrete update\n // commits synchronously — popped it, so the layer below would find itself\n // on top and close on the same key; a pointer-down can close an upper modal\n // the same way and lift its barrier mid-flight. Taken in the window's\n // capture phase, which runs before any DOM listener, React's root included.\n seen: WeakMap<Event, LayerRef[]>;\n snapshot: (event: Event) => void;\n}\n\n// One stack per page, not per module copy: a micro-frontend that bundles its\n// own uikit must see the host's layers, and the host its. Versioned, so a copy\n// with a different store shape keeps to itself instead of misreading this one.\nconst STORE_KEY = Symbol.for(\"@evinvest/uikit/dismissable-layers@1\");\n\nfunction isStore(value: unknown): value is LayerStore {\n return typeof value === \"object\" && value !== null && \"stack\" in value && Array.isArray(value.stack);\n}\n\nfunction sharedStore(): LayerStore {\n const existing: unknown = Reflect.get(globalThis, STORE_KEY);\n if (isStore(existing)) return existing;\n const store: LayerStore = {\n stack: [],\n info: new WeakMap(),\n seen: new WeakMap(),\n snapshot: (event) => {\n if (!store.seen.has(event)) store.seen.set(event, store.stack.slice());\n },\n };\n Reflect.set(globalThis, STORE_KEY, store);\n return store;\n}\n\nconst store = sharedStore();\n\n/**\n * Elements carrying this attribute are outside every layer without being a\n * click away from any: a press there dismisses nothing (the toaster).\n */\nexport const LAYER_IGNORE_ATTR = \"data-dismissable-layer-ignore\";\n\nfunction layersAt(event: Event): LayerRef[] {\n // An event dispatched where the window never sees it falls back to the live stack.\n return store.seen.get(event) ?? store.stack;\n}\n\nfunction isPointerOutside(own: LayerRef, event: PointerEvent): boolean {\n const target = event.target;\n if (!(target instanceof Node)) return false;\n const el = target instanceof Element ? target : target.parentElement;\n if (el?.closest(`[${LAYER_IGNORE_ATTR}]`)) return false;\n const layers = layersAt(event);\n const index = layers.indexOf(own);\n // Not on the stack (a listener outliving its cleanup): nothing is above it.\n if (index < 0) return true;\n const above = layers.slice(index + 1);\n // A modal above is a barrier: whatever the press landed on — its scrim, its\n // panel, a toast over it — the modal answers for it, not the layers below.\n if (above.some((layer) => store.info.get(layer)?.modal === true)) return false;\n return !above.some((layer) => layer.current?.contains(target) ?? false);\n}\n\nfunction ownsEscape(own: LayerRef, event: KeyboardEvent): boolean {\n const layers = layersAt(event);\n return layers[layers.length - 1] === own;\n}\n\nfunction isDescendant(layer: LayerRef, ancestor: LayerRef): boolean {\n for (let p = store.info.get(layer)?.parent ?? null; p; p = store.info.get(p)?.parent ?? null) {\n if (p === ancestor) return true;\n }\n return false;\n}\n\nfunction push(layer: LayerRef) {\n const { stack } = store;\n if (stack.length === 0) {\n window.addEventListener(\"keydown\", store.snapshot, true);\n window.addEventListener(\"pointerdown\", store.snapshot, true);\n }\n // Children's effects run before their parent's, so a layer opened in the\n // same commit as one nested in it (`defaultOpen` on both, a shared `open`)\n // arrives second: it goes below its first descendant, not on top.\n const firstChild = stack.findIndex((other) => isDescendant(other, layer));\n if (firstChild < 0) stack.push(layer);\n else stack.splice(firstChild, 0, layer);\n}\n\nfunction pop(layer: LayerRef) {\n const { stack } = store;\n const index = stack.indexOf(layer);\n if (index >= 0) stack.splice(index, 1);\n if (stack.length === 0) {\n window.removeEventListener(\"keydown\", store.snapshot, true);\n window.removeEventListener(\"pointerdown\", store.snapshot, true);\n }\n}\n\nconst ParentLayerContext = React.createContext<LayerRef | null>(null);\n\n/**\n * Marks `children` as rendered inside `layer` (the ref `useDismissableLayer`\n * returned), so a layer among them always stacks above it — even when both\n * open in the same commit. Wrap the overlay's content in it.\n */\nexport function DismissableLayerScope({ layer, children }: { layer: LayerRef; children?: React.ReactNode }) {\n return <ParentLayerContext.Provider value={layer}>{children}</ParentLayerContext.Provider>;\n}\n\n/** Why a layer is being dismissed: the event itself, for a caller that treats keys and pointers apart. */\nexport type DismissEvent = PointerEvent | KeyboardEvent;\n\n/**\n * Calls `onDismiss` on Escape or on a pointer-down outside the layer — the\n * dep-light core of every overlay's \"click away to close\". Pass refs to any\n * nodes that should NOT count as outside (e.g. the trigger), via `exclude`.\n *\n * Layers stack: a layer rendered inside another's `DismissableLayerScope`\n * sits above it, the rest in the order they opened. Escape dismisses only the\n * topmost layer, and a pointer-down inside a layer above this one is not\n * outside it — so a Select's list inside a Dialog closes the list, not the\n * Dialog. The Escape goes to the layer that was on top when the key was\n * pressed, even if a handler on its way closed that layer first.\n *\n * `modal: true` makes the layer a barrier: while it is open, the layers below\n * ignore every pointer-down — a press on its scrim closes it alone. Elements\n * marked with `LAYER_IGNORE_ATTR` (the toaster) are outside no layer.\n *\n * `pointerOutside: false` keeps the layer on the stack (it takes Escape, and\n * the layers below see a pointer-down inside it as inside) but leaves outside\n * clicks to the caller — for an overlay whose own scrim is what \"outside\"\n * means (Drawer, CommandDialog).\n *\n * The stack is shared through `globalThis`, so every copy of this module on\n * the page sees one stack; parent links need one React context, so they hold\n * within a copy only.\n *\n * Mirrors the dismiss behaviour Rust expresses with a full-screen backdrop.\n */\nexport function useDismissableLayer(opts: {\n enabled: boolean;\n onDismiss: (event: DismissEvent) => void;\n exclude?: Array<React.RefObject<Element | null>>;\n /** Dismiss on a pointer-down outside the layer. Default `true`. */\n pointerOutside?: boolean;\n /** Bar the layers below from pointer-downs while open. Default `false`. */\n modal?: boolean;\n}): React.RefObject<HTMLDivElement | null> {\n const { enabled, onDismiss, exclude, pointerOutside = true, modal = false } = opts;\n const parent = React.useContext(ParentLayerContext);\n const ref = React.useRef<HTMLDivElement | null>(null);\n const onDismissRef = React.useRef(onDismiss);\n // Callers pass `exclude` inline, a new array each render: read through a ref,\n // or the effect would re-run and move this layer to the top of the stack.\n const excludeRef = React.useRef(exclude);\n React.useEffect(() => {\n onDismissRef.current = onDismiss;\n excludeRef.current = exclude;\n });\n\n React.useEffect(() => {\n if (!enabled) return;\n store.info.set(ref, { parent, modal });\n push(ref);\n\n function onPointerDown(event: PointerEvent) {\n const target = event.target;\n if (!(target instanceof Node)) return;\n if (ref.current && ref.current.contains(target)) return;\n for (const r of excludeRef.current ?? []) {\n if (r.current && r.current.contains(target)) return;\n }\n if (isPointerOutside(ref, event)) onDismissRef.current(event);\n }\n\n function onKeyDown(event: KeyboardEvent) {\n if (event.key === \"Escape\" && ownsEscape(ref, event)) onDismissRef.current(event);\n }\n\n if (pointerOutside) document.addEventListener(\"pointerdown\", onPointerDown, true);\n document.addEventListener(\"keydown\", onKeyDown);\n return () => {\n pop(ref);\n document.removeEventListener(\"pointerdown\", onPointerDown, true);\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [enabled, pointerOutside, modal, parent]);\n\n return ref;\n}\n"],"mappings":"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","names":["store"]}
1
+ {"version":3,"sources":["../../src/primitives/dismissable-layer.tsx"],"sourcesContent":["\"use client\";\n\nimport * as React from \"react\";\n\ntype LayerRef = React.RefObject<HTMLDivElement | null>;\n\ninterface LayerInfo {\n /** The layer this one was rendered inside, from context — not the one below it on the stack. */\n parent: LayerRef | null;\n modal: boolean;\n}\n\ninterface LayerStore {\n // The open layers, bottom first. An overlay opened inside another (a Select\n // in a Dialog, a Popover in a Drawer) is portaled out of its parent's\n // subtree, so \"outside the parent\" would include it: the stack is what tells\n // a nested layer from the rest of the page.\n stack: LayerRef[];\n info: WeakMap<LayerRef, LayerInfo>;\n // The stack as it stood when an event started its trip. By the time the\n // document hears an Escape, a React `onKeyDown` on the way (a Select's, a\n // consumer's) may already have closed the top layer and — a discrete update\n // commits synchronously — popped it, so the layer below would find itself\n // on top and close on the same key; a pointer-down can close an upper modal\n // the same way and lift its barrier mid-flight. Taken in the window's\n // capture phase, which runs before any DOM listener, React's root included.\n seen: WeakMap<Event, LayerRef[]>;\n snapshot: (event: Event) => void;\n // Who to tell when the stack changes (a modal asks whether another modal is\n // below it, to decide whether it draws the scrim).\n listeners: Set<() => void>;\n}\n\n// One stack per page, not per module copy: a micro-frontend that bundles its\n// own uikit must see the host's layers, and the host its. Versioned, so a copy\n// with an incompatible store shape keeps to itself instead of misreading this one.\nconst STORE_KEY = Symbol.for(\"@evinvest/uikit/dismissable-layers@1\");\n\nfunction isStore(value: unknown): value is LayerStore {\n return typeof value === \"object\" && value !== null && \"stack\" in value && Array.isArray(value.stack);\n}\n\nfunction sharedStore(): LayerStore {\n const existing: unknown = Reflect.get(globalThis, STORE_KEY);\n if (isStore(existing)) {\n // an older copy created the store: it never notifies, so only this copy's listeners hear changes\n existing.listeners ??= new Set();\n return existing;\n }\n const store: LayerStore = {\n stack: [],\n info: new WeakMap(),\n seen: new WeakMap(),\n listeners: new Set(),\n snapshot: (event) => {\n if (!store.seen.has(event)) store.seen.set(event, store.stack.slice());\n },\n };\n Reflect.set(globalThis, STORE_KEY, store);\n return store;\n}\n\nconst store = sharedStore();\n\n/**\n * Elements carrying this attribute are outside every layer without being a\n * click away from any: a press there dismisses nothing (the toaster).\n */\nexport const LAYER_IGNORE_ATTR = \"data-dismissable-layer-ignore\";\n\nfunction layersAt(event: Event): LayerRef[] {\n // An event dispatched where the window never sees it falls back to the live stack.\n return store.seen.get(event) ?? store.stack;\n}\n\nfunction isPointerOutside(own: LayerRef, event: PointerEvent): boolean {\n const target = event.target;\n if (!(target instanceof Node)) return false;\n const el = target instanceof Element ? target : target.parentElement;\n if (el?.closest(`[${LAYER_IGNORE_ATTR}]`)) return false;\n const layers = layersAt(event);\n const index = layers.indexOf(own);\n // Not on the stack (a listener outliving its cleanup): nothing is above it.\n if (index < 0) return true;\n const above = layers.slice(index + 1);\n // A modal above is a barrier: whatever the press landed on — its scrim, its\n // panel, a toast over it — the modal answers for it, not the layers below.\n if (above.some((layer) => store.info.get(layer)?.modal === true)) return false;\n return !above.some((layer) => layer.current?.contains(target) ?? false);\n}\n\nfunction ownsEscape(own: LayerRef, event: KeyboardEvent): boolean {\n const layers = layersAt(event);\n return layers[layers.length - 1] === own;\n}\n\nfunction isDescendant(layer: LayerRef, ancestor: LayerRef): boolean {\n for (let p = store.info.get(layer)?.parent ?? null; p; p = store.info.get(p)?.parent ?? null) {\n if (p === ancestor) return true;\n }\n return false;\n}\n\nfunction push(layer: LayerRef) {\n const { stack } = store;\n if (stack.length === 0) {\n window.addEventListener(\"keydown\", store.snapshot, true);\n window.addEventListener(\"pointerdown\", store.snapshot, true);\n }\n // Children's effects run before their parent's, so a layer opened in the\n // same commit as one nested in it (`defaultOpen` on both, a shared `open`)\n // arrives second: it goes below its first descendant, not on top.\n const firstChild = stack.findIndex((other) => isDescendant(other, layer));\n if (firstChild < 0) stack.push(layer);\n else stack.splice(firstChild, 0, layer);\n notify();\n}\n\nfunction notify() {\n for (const listener of store.listeners) listener();\n}\n\nfunction pop(layer: LayerRef) {\n const { stack } = store;\n const index = stack.indexOf(layer);\n if (index >= 0) stack.splice(index, 1);\n if (stack.length === 0) {\n window.removeEventListener(\"keydown\", store.snapshot, true);\n window.removeEventListener(\"pointerdown\", store.snapshot, true);\n }\n notify();\n}\n\ninterface ParentLayer {\n layer: LayerRef;\n /** This layer or one above it in the React tree is a modal. */\n modalAbove: boolean;\n}\n\nconst ParentLayerContext = React.createContext<ParentLayer | null>(null);\n\n// Whether each layer asked for `modal`, known from its first render. The stack\n// learns it only in an effect, too late for the scope below a layer opened in\n// the same commit to tell its children that a modal is under them.\nconst renderedModal = new WeakMap<LayerRef, boolean>();\n\n// Layers waiting for their parent's node: a child's layout effect runs before\n// the parent's ref is attached when both open in one commit.\nconst waitingForParent = new WeakMap<LayerRef, Set<LayerRef>>();\n\n/**\n * Children's portals mount before their parent's when both open in one\n * commit, so with equal `z-index` the parent paints over the child and its\n * scrim. Lifts `child` (and the scrim rendered just before it) over `parent`\n * only in that case, so overlays that do not share a tree keep the stacking\n * their classes give them. Returns false while a node is still missing.\n */\nfunction liftAbove(child: LayerRef, parent: LayerRef): boolean {\n const node = child.current;\n const parentNode = parent.current;\n if (!node || !parentNode) return false;\n if (!(parentNode.compareDocumentPosition(node) & Node.DOCUMENT_POSITION_PRECEDING)) return true;\n const view = node.ownerDocument.defaultView;\n if (!view) return true;\n const parentZ = Number.parseInt(view.getComputedStyle(parentNode).zIndex, 10);\n const ownZ = Number.parseInt(view.getComputedStyle(node).zIndex, 10);\n if (Number.isNaN(parentZ) || Number.isNaN(ownZ) || ownZ > parentZ) return true;\n node.style.zIndex = String(parentZ + 2);\n const scrim = node.previousElementSibling;\n // Only a modal renders its own scrim just before its panel; for anything\n // else that sibling belongs to someone else.\n if (renderedModal.get(child) && scrim instanceof HTMLElement && scrim.dataset[\"slot\"]?.endsWith(\"overlay\")) {\n scrim.style.zIndex = String(parentZ + 1);\n }\n return true;\n}\n\nfunction modalBelow(layer: LayerRef): boolean {\n const { stack } = store;\n const index = stack.indexOf(layer);\n // Not on the stack yet (first render) or no longer (exiting): whatever modals\n // are open are, or were, under it.\n const below = index < 0 ? stack : stack.slice(0, index);\n return below.some((other) => other !== layer && store.info.get(other)?.modal === true);\n}\n\nfunction subscribe(listener: () => void): () => void {\n store.listeners.add(listener);\n return () => store.listeners.delete(listener);\n}\n\nconst CLEAR_SCRIM: React.CSSProperties = Object.freeze({ backgroundColor: \"transparent\" });\n\n/**\n * The inline style for a modal's scrim. One scrim darkens the page however\n * many modals are stacked: the lowest draws it, the ones above get a clear\n * one (it still sits under their panel and catches presses for their layer),\n * so the panel below stays readable between the scrim and the top modal.\n * Pass the layer `useDismissableLayer` returned.\n */\nexport function useModalScrimStyle(layer: LayerRef): React.CSSProperties | undefined {\n const parent = React.useContext(ParentLayerContext);\n const below = React.useSyncExternalStore(\n subscribe,\n () => modalBelow(layer),\n () => false,\n );\n return below || parent?.modalAbove === true ? CLEAR_SCRIM : undefined;\n}\n\n/**\n * Marks `children` as rendered inside `layer` (the ref `useDismissableLayer`\n * returned), so a layer among them always stacks above it — even when both\n * open in the same commit. Wrap the overlay's content in it.\n */\nexport function DismissableLayerScope({ layer, children }: { layer: LayerRef; children?: React.ReactNode }) {\n const outer = React.useContext(ParentLayerContext);\n const outerModal = outer?.modalAbove ?? false;\n const value = React.useMemo<ParentLayer>(\n () => ({ layer, modalAbove: outerModal || renderedModal.get(layer) === true }),\n [layer, outerModal],\n );\n return <ParentLayerContext.Provider value={value}>{children}</ParentLayerContext.Provider>;\n}\n\n/** Why a layer is being dismissed: the event itself, for a caller that treats keys and pointers apart. */\nexport type DismissEvent = PointerEvent | KeyboardEvent;\n\n/**\n * Calls `onDismiss` on Escape or on a pointer-down outside the layer — the\n * dep-light core of every overlay's \"click away to close\". Pass refs to any\n * nodes that should NOT count as outside (e.g. the trigger), via `exclude`.\n *\n * Layers stack: a layer rendered inside another's `DismissableLayerScope`\n * sits above it, the rest in the order they opened. Escape dismisses only the\n * topmost layer, and a pointer-down inside a layer above this one is not\n * outside it — so a Select's list inside a Dialog closes the list, not the\n * Dialog. The Escape goes to the layer that was on top when the key was\n * pressed, even if a handler on its way closed that layer first.\n *\n * `modal: true` makes the layer a barrier: while it is open, the layers below\n * ignore every pointer-down — a press on its scrim closes it alone. Elements\n * marked with `LAYER_IGNORE_ATTR` (the toaster) are outside no layer.\n *\n * `pointerOutside: false` keeps the layer on the stack (it takes Escape, and\n * the layers below see a pointer-down inside it as inside) but leaves outside\n * clicks to the caller — for an overlay whose own scrim is what \"outside\"\n * means (Drawer, CommandDialog).\n *\n * The stack is shared through `globalThis`, so every copy of this module on\n * the page sees one stack; parent links need one React context, so they hold\n * within a copy only.\n *\n * Mirrors the dismiss behaviour Rust expresses with a full-screen backdrop.\n */\nexport function useDismissableLayer(opts: {\n enabled: boolean;\n onDismiss: (event: DismissEvent) => void;\n exclude?: Array<React.RefObject<Element | null>>;\n /** Dismiss on a pointer-down outside the layer. Default `true`. */\n pointerOutside?: boolean;\n /** Bar the layers below from pointer-downs while open. Default `false`. */\n modal?: boolean;\n}): React.RefObject<HTMLDivElement | null> {\n const { enabled, onDismiss, exclude, pointerOutside = true, modal = false } = opts;\n const parent = React.useContext(ParentLayerContext)?.layer ?? null;\n const ref = React.useRef<HTMLDivElement | null>(null);\n // Idempotent per ref, so safe in render; see `renderedModal`.\n renderedModal.set(ref, modal);\n const onDismissRef = React.useRef(onDismiss);\n // Callers pass `exclude` inline, a new array each render: read through a ref,\n // or the effect would re-run and move this layer to the top of the stack.\n const excludeRef = React.useRef(exclude);\n React.useEffect(() => {\n onDismissRef.current = onDismiss;\n excludeRef.current = exclude;\n });\n\n React.useLayoutEffect(() => {\n if (!enabled) return;\n // Late children first (they ran before this layer's ref existed), then this\n // layer against its own parent.\n const waiting = waitingForParent.get(ref);\n if (waiting) {\n waitingForParent.delete(ref);\n for (const child of waiting) liftAbove(child, ref);\n }\n if (parent && !liftAbove(ref, parent)) {\n const siblings = waitingForParent.get(parent) ?? new Set<LayerRef>();\n siblings.add(ref);\n waitingForParent.set(parent, siblings);\n }\n return () => {\n if (parent) waitingForParent.get(parent)?.delete(ref);\n };\n }, [enabled, parent]);\n\n React.useEffect(() => {\n if (!enabled) return;\n store.info.set(ref, { parent, modal });\n push(ref);\n\n function onPointerDown(event: PointerEvent) {\n const target = event.target;\n if (!(target instanceof Node)) return;\n if (ref.current && ref.current.contains(target)) return;\n for (const r of excludeRef.current ?? []) {\n if (r.current && r.current.contains(target)) return;\n }\n if (isPointerOutside(ref, event)) onDismissRef.current(event);\n }\n\n function onKeyDown(event: KeyboardEvent) {\n if (event.key === \"Escape\" && ownsEscape(ref, event)) onDismissRef.current(event);\n }\n\n if (pointerOutside) document.addEventListener(\"pointerdown\", onPointerDown, true);\n document.addEventListener(\"keydown\", onKeyDown);\n return () => {\n pop(ref);\n document.removeEventListener(\"pointerdown\", onPointerDown, true);\n document.removeEventListener(\"keydown\", onKeyDown);\n };\n }, [enabled, pointerOutside, modal, parent]);\n\n return ref;\n}\n"],"mappings":"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","names":["store"]}