@askrjs/themes 0.0.8 → 0.0.10

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 (479) hide show
  1. package/README.md +19 -13
  2. package/THEMING.md +24 -18
  3. package/dist/components/_internal/block-layout.d.ts +49 -0
  4. package/dist/components/_internal/block-layout.js +210 -0
  5. package/dist/components/_internal/block-layout.js.map +1 -0
  6. package/dist/components/_internal/jsx.js.map +1 -1
  7. package/dist/components/_internal/style.js +25 -1
  8. package/dist/components/_internal/style.js.map +1 -1
  9. package/dist/components/alert/alert.js +2 -2
  10. package/dist/components/alert/alert.js.map +1 -1
  11. package/dist/components/alert/alert.types.d.ts +0 -1
  12. package/dist/components/aside/aside.d.ts +7 -0
  13. package/dist/components/aside/aside.js +16 -0
  14. package/dist/components/aside/aside.js.map +1 -0
  15. package/dist/components/aside/aside.types.d.ts +6 -0
  16. package/dist/components/aside/index.d.ts +2 -0
  17. package/dist/components/aspect-ratio/aspect-ratio.js +1 -1
  18. package/dist/components/aspect-ratio/aspect-ratio.js.map +1 -1
  19. package/dist/components/badge/index.d.ts +1 -2
  20. package/dist/components/block/block.d.ts +2 -3
  21. package/dist/components/block/block.js +16 -46
  22. package/dist/components/block/block.js.map +1 -1
  23. package/dist/components/block/block.types.d.ts +13 -23
  24. package/dist/components/block/index.d.ts +3 -3
  25. package/dist/components/brand/brand.d.ts +9 -0
  26. package/dist/components/brand/brand.js +49 -0
  27. package/dist/components/brand/brand.js.map +1 -0
  28. package/dist/components/brand/brand.types.d.ts +31 -0
  29. package/dist/components/brand/index.d.ts +2 -0
  30. package/dist/components/card/card.d.ts +3 -3
  31. package/dist/components/card/card.js +6 -11
  32. package/dist/components/card/card.js.map +1 -1
  33. package/dist/components/card/card.types.d.ts +10 -12
  34. package/dist/components/card/index.d.ts +2 -2
  35. package/dist/components/catalog.d.ts +156 -0
  36. package/dist/components/catalog.js +723 -0
  37. package/dist/components/catalog.js.map +1 -0
  38. package/dist/components/container/container.d.ts +2 -3
  39. package/dist/components/container/container.js +8 -71
  40. package/dist/components/container/container.js.map +1 -1
  41. package/dist/components/container/container.types.d.ts +5 -24
  42. package/dist/components/container/index.d.ts +2 -3
  43. package/dist/components/empty-state/empty-state.js +34 -28
  44. package/dist/components/empty-state/empty-state.js.map +1 -1
  45. package/dist/components/empty-state/empty-state.types.d.ts +3 -6
  46. package/dist/components/field/field.js +4 -2
  47. package/dist/components/field/field.js.map +1 -1
  48. package/dist/components/field/field.types.d.ts +1 -0
  49. package/dist/components/footer/footer.d.ts +13 -0
  50. package/dist/components/footer/footer.js +86 -0
  51. package/dist/components/footer/footer.js.map +1 -0
  52. package/dist/components/footer/footer.types.d.ts +37 -0
  53. package/dist/components/footer/index.d.ts +2 -0
  54. package/dist/components/grid/grid.d.ts +7 -0
  55. package/dist/components/grid/grid.js +76 -0
  56. package/dist/components/grid/grid.js.map +1 -0
  57. package/dist/components/grid/grid.types.d.ts +19 -0
  58. package/dist/components/grid/index.d.ts +2 -0
  59. package/dist/components/header/header.js +9 -6
  60. package/dist/components/header/header.js.map +1 -1
  61. package/dist/components/header/header.types.d.ts +5 -5
  62. package/dist/components/header/index.d.ts +2 -0
  63. package/dist/components/main/index.d.ts +2 -0
  64. package/dist/components/main/main.d.ts +7 -0
  65. package/dist/components/main/main.js +17 -0
  66. package/dist/components/main/main.js.map +1 -0
  67. package/dist/components/main/main.types.d.ts +6 -0
  68. package/dist/components/nav/index.d.ts +2 -2
  69. package/dist/components/nav/nav.d.ts +8 -6
  70. package/dist/components/nav/nav.js +93 -58
  71. package/dist/components/nav/nav.js.map +1 -1
  72. package/dist/components/nav/nav.types.d.ts +16 -20
  73. package/dist/components/navbar/index.d.ts +4 -5
  74. package/dist/components/navbar/navbar.d.ts +3 -38
  75. package/dist/components/navbar/navbar.js +102 -198
  76. package/dist/components/navbar/navbar.js.map +1 -1
  77. package/dist/components/navbar/navbar.types.d.ts +14 -24
  78. package/dist/components/page/index.d.ts +2 -0
  79. package/dist/components/page/page.d.ts +7 -0
  80. package/dist/components/page/page.js +22 -0
  81. package/dist/components/page/page.js.map +1 -0
  82. package/dist/components/page/page.types.d.ts +6 -0
  83. package/dist/components/page-header/index.d.ts +2 -0
  84. package/dist/components/page-header/page-header.d.ts +7 -0
  85. package/dist/components/page-header/page-header.js +37 -0
  86. package/dist/components/page-header/page-header.js.map +1 -0
  87. package/dist/components/page-header/page-header.types.d.ts +10 -0
  88. package/dist/components/section/index.d.ts +2 -3
  89. package/dist/components/section/section.d.ts +2 -3
  90. package/dist/components/section/section.js +7 -30
  91. package/dist/components/section/section.js.map +1 -1
  92. package/dist/components/section/section.types.d.ts +3 -20
  93. package/dist/components/separator/index.d.ts +1 -2
  94. package/dist/components/sidebar/index.d.ts +2 -0
  95. package/dist/components/sidebar/sidebar.d.ts +17 -2
  96. package/dist/components/sidebar/sidebar.js +115 -211
  97. package/dist/components/sidebar/sidebar.js.map +1 -1
  98. package/dist/components/sidebar/sidebar.types.d.ts +21 -23
  99. package/dist/components/skeleton/index.d.ts +1 -2
  100. package/dist/components/skeleton/skeleton.js +12 -1
  101. package/dist/components/skeleton/skeleton.js.map +1 -1
  102. package/dist/components/skeleton/skeleton.types.d.ts +2 -0
  103. package/dist/components/spinner/index.d.ts +1 -1
  104. package/dist/components/spinner/spinner.js +6 -3
  105. package/dist/components/spinner/spinner.js.map +1 -1
  106. package/dist/components/spinner/spinner.types.d.ts +3 -1
  107. package/dist/components/stat/index.d.ts +2 -0
  108. package/dist/components/stat/stat.d.ts +10 -0
  109. package/dist/components/stat/stat.js +52 -0
  110. package/dist/components/stat/stat.js.map +1 -0
  111. package/dist/components/stat/stat.types.d.ts +24 -0
  112. package/dist/components/text/index.d.ts +2 -0
  113. package/dist/components/text/text.d.ts +7 -0
  114. package/dist/components/text/text.js +28 -0
  115. package/dist/components/text/text.js.map +1 -0
  116. package/dist/components/text/text.types.d.ts +26 -0
  117. package/dist/components/theme/theme.js +97 -18
  118. package/dist/components/theme/theme.js.map +1 -1
  119. package/dist/components/toolbar/index.d.ts +2 -0
  120. package/dist/components/toolbar/toolbar.d.ts +7 -0
  121. package/dist/components/toolbar/toolbar.js +30 -0
  122. package/dist/components/toolbar/toolbar.js.map +1 -0
  123. package/dist/components/toolbar/toolbar.types.d.ts +9 -0
  124. package/dist/components.d.ts +60 -0
  125. package/dist/components.js +35 -0
  126. package/dist/controls.d.ts +2 -2
  127. package/dist/controls.js +3 -3
  128. package/dist/core.d.ts +36 -0
  129. package/dist/core.js +19 -0
  130. package/dist/navs.d.ts +3 -15
  131. package/dist/navs.js +2 -8
  132. package/dist/overlays.d.ts +2 -2
  133. package/dist/overlays.js +2 -2
  134. package/dist/surfaces.d.ts +10 -8
  135. package/dist/surfaces.js +6 -4
  136. package/dist/themes/default/index.css +3691 -3959
  137. package/package.json +239 -73
  138. package/src/components/_internal/block-layout.ts +354 -0
  139. package/src/components/_internal/jsx.ts +18 -6
  140. package/src/components/_internal/style.ts +42 -4
  141. package/src/components/alert/alert.tsx +1 -2
  142. package/src/components/alert/alert.types.ts +0 -1
  143. package/src/components/aside/aside.tsx +12 -0
  144. package/src/components/aside/aside.types.ts +3 -0
  145. package/src/components/aside/index.ts +2 -0
  146. package/src/components/aspect-ratio/aspect-ratio.tsx +1 -1
  147. package/src/components/badge/index.ts +0 -1
  148. package/src/components/block/block.a11y.ts +0 -6
  149. package/src/components/block/block.tsx +40 -56
  150. package/src/components/block/block.types.ts +59 -41
  151. package/src/components/block/index.ts +1 -10
  152. package/src/components/brand/brand.tsx +61 -0
  153. package/src/components/brand/brand.types.ts +39 -0
  154. package/src/components/brand/index.ts +2 -0
  155. package/src/components/card/card.tsx +6 -18
  156. package/src/components/card/card.types.ts +9 -11
  157. package/src/components/card/index.ts +2 -3
  158. package/src/components/catalog.tsx +713 -0
  159. package/src/components/container/container.a11y.ts +0 -5
  160. package/src/components/container/container.tsx +18 -128
  161. package/src/components/container/container.types.ts +3 -32
  162. package/src/components/container/index.ts +1 -8
  163. package/src/components/empty-state/empty-state.tsx +17 -35
  164. package/src/components/empty-state/empty-state.types.ts +3 -5
  165. package/src/components/field/field.tsx +3 -1
  166. package/src/components/field/field.types.ts +1 -0
  167. package/src/components/footer/footer.tsx +88 -0
  168. package/src/components/footer/footer.types.ts +40 -0
  169. package/src/components/footer/index.ts +10 -0
  170. package/src/components/grid/grid.tsx +113 -0
  171. package/src/components/grid/grid.types.ts +20 -0
  172. package/src/components/grid/index.ts +2 -0
  173. package/src/components/header/header.tsx +10 -7
  174. package/src/components/header/header.types.ts +4 -4
  175. package/src/components/header/index.ts +1 -2
  176. package/src/components/main/index.ts +2 -0
  177. package/src/components/main/main.tsx +12 -0
  178. package/src/components/main/main.types.ts +3 -0
  179. package/src/components/nav/index.ts +7 -9
  180. package/src/components/nav/nav.tsx +153 -110
  181. package/src/components/nav/nav.types.ts +26 -27
  182. package/src/components/navbar/index.ts +4 -11
  183. package/src/components/navbar/navbar.tsx +104 -251
  184. package/src/components/navbar/navbar.types.ts +16 -42
  185. package/src/components/page/index.ts +2 -0
  186. package/src/components/page/page.tsx +17 -0
  187. package/src/components/page/page.types.ts +3 -0
  188. package/src/components/page-header/index.ts +2 -0
  189. package/src/components/page-header/page-header.tsx +29 -0
  190. package/src/components/page-header/page-header.types.ts +7 -0
  191. package/src/components/section/index.ts +1 -7
  192. package/src/components/section/section.a11y.ts +0 -1
  193. package/src/components/section/section.tsx +9 -35
  194. package/src/components/section/section.types.ts +2 -22
  195. package/src/components/separator/index.ts +4 -9
  196. package/src/components/sidebar/index.ts +27 -5
  197. package/src/components/sidebar/sidebar.tsx +145 -317
  198. package/src/components/sidebar/sidebar.types.ts +21 -28
  199. package/src/components/skeleton/index.ts +1 -2
  200. package/src/components/skeleton/skeleton.tsx +33 -1
  201. package/src/components/skeleton/skeleton.types.ts +2 -0
  202. package/src/components/spinner/index.ts +1 -1
  203. package/src/components/spinner/spinner.tsx +7 -2
  204. package/src/components/spinner/spinner.types.ts +3 -0
  205. package/src/components/stat/index.ts +2 -0
  206. package/src/components/stat/stat.tsx +47 -0
  207. package/src/components/stat/stat.types.ts +24 -0
  208. package/src/components/text/index.ts +2 -0
  209. package/src/components/text/text.tsx +39 -0
  210. package/src/components/text/text.types.ts +35 -0
  211. package/src/components/theme/theme.tsx +163 -21
  212. package/src/components/toolbar/index.ts +2 -0
  213. package/src/components/toolbar/toolbar.tsx +24 -0
  214. package/src/components/toolbar/toolbar.types.ts +6 -0
  215. package/src/components.ts +289 -0
  216. package/src/controls.ts +69 -2
  217. package/src/core.ts +42 -0
  218. package/src/navs.ts +9 -24
  219. package/src/overlays.ts +101 -59
  220. package/src/parity.ts +125 -0
  221. package/src/surfaces.ts +60 -13
  222. package/src/themes/default/index.css +11 -14
  223. package/src/themes/default/styles/actions/button-group.css +6 -6
  224. package/src/themes/default/styles/actions/button.css +98 -60
  225. package/src/themes/default/styles/actions/toggle-group.css +61 -25
  226. package/src/themes/default/styles/base/text.css +87 -0
  227. package/src/themes/default/styles/base/typography.css +24 -117
  228. package/src/themes/default/styles/base/utilities.css +0 -250
  229. package/src/themes/default/styles/disclosure/accordion.css +35 -28
  230. package/src/themes/default/styles/display/alert.css +7 -7
  231. package/src/themes/default/styles/display/avatar.css +7 -1
  232. package/src/themes/default/styles/display/badge.css +10 -10
  233. package/src/themes/default/styles/display/card.css +10 -47
  234. package/src/themes/default/styles/display/catalog.css +753 -0
  235. package/src/themes/default/styles/display/coverage.css +30 -305
  236. package/src/themes/default/styles/display/progress-circle.css +2 -0
  237. package/src/themes/default/styles/display/scroll-area.css +29 -24
  238. package/src/themes/default/styles/display/spinner.css +38 -1
  239. package/src/themes/default/styles/display/stat.css +21 -0
  240. package/src/themes/default/styles/display/table.css +39 -12
  241. package/src/themes/default/styles/display/virtual-list.css +24 -13
  242. package/src/themes/default/styles/display/virtual-table.css +58 -36
  243. package/src/themes/default/styles/forms/checkbox.css +12 -21
  244. package/src/themes/default/styles/forms/input-group.css +2 -1
  245. package/src/themes/default/styles/forms/input.css +11 -12
  246. package/src/themes/default/styles/forms/radio-group.css +44 -27
  247. package/src/themes/default/styles/forms/select.css +33 -35
  248. package/src/themes/default/styles/forms/slider.css +61 -47
  249. package/src/themes/default/styles/forms/switch.css +18 -23
  250. package/src/themes/default/styles/forms/textarea.css +12 -12
  251. package/src/themes/default/styles/layout/block.css +96 -12
  252. package/src/themes/default/styles/layout/grid.css +78 -0
  253. package/src/themes/default/styles/layout/layout.css +502 -772
  254. package/src/themes/default/styles/layout/patterns.css +0 -155
  255. package/src/themes/default/styles/navigation/nav.css +104 -154
  256. package/src/themes/default/styles/overlays/alert-dialog.css +2 -2
  257. package/src/themes/default/styles/overlays/dialog.css +76 -22
  258. package/src/themes/default/styles/overlays/dropdown.css +108 -31
  259. package/src/themes/default/styles/overlays/hover-card.css +39 -17
  260. package/src/themes/default/styles/overlays/menubar.css +223 -0
  261. package/src/themes/default/styles/overlays/popover.css +69 -23
  262. package/src/themes/default/styles/overlays/toast.css +91 -33
  263. package/src/themes/default/styles/overlays/tooltip.css +88 -14
  264. package/src/themes/default/styles/shell/brand.css +48 -0
  265. package/src/themes/default/styles/shell/footer.css +72 -0
  266. package/src/themes/default/styles/shell/header.css +7 -50
  267. package/src/themes/default/styles/shell/navbar.css +226 -453
  268. package/src/themes/default/styles/shell/sidebar.css +243 -829
  269. package/src/themes/default/tokens.css +145 -98
  270. package/templates/theme/index.css +11 -14
  271. package/templates/theme/styles/actions/button-group.css +6 -6
  272. package/templates/theme/styles/actions/button.css +98 -60
  273. package/templates/theme/styles/actions/toggle-group.css +61 -25
  274. package/templates/theme/styles/base/text.css +87 -0
  275. package/templates/theme/styles/base/typography.css +24 -117
  276. package/templates/theme/styles/disclosure/accordion.css +35 -28
  277. package/templates/theme/styles/display/alert.css +7 -7
  278. package/templates/theme/styles/display/avatar.css +7 -1
  279. package/templates/theme/styles/display/badge.css +10 -10
  280. package/templates/theme/styles/display/card.css +10 -47
  281. package/templates/theme/styles/display/catalog.css +753 -0
  282. package/templates/theme/styles/display/coverage.css +30 -305
  283. package/templates/theme/styles/display/scroll-area.css +29 -24
  284. package/templates/theme/styles/display/spinner.css +38 -1
  285. package/templates/theme/styles/display/stat.css +21 -0
  286. package/templates/theme/styles/display/table.css +39 -12
  287. package/templates/theme/styles/display/virtual-list.css +24 -13
  288. package/templates/theme/styles/display/virtual-table.css +58 -36
  289. package/templates/theme/styles/forms/checkbox.css +12 -21
  290. package/templates/theme/styles/forms/input.css +11 -12
  291. package/templates/theme/styles/forms/radio-group.css +44 -27
  292. package/templates/theme/styles/forms/select.css +33 -35
  293. package/templates/theme/styles/forms/slider.css +61 -47
  294. package/templates/theme/styles/forms/switch.css +18 -23
  295. package/templates/theme/styles/forms/textarea.css +12 -12
  296. package/templates/theme/styles/layout/block.css +96 -12
  297. package/templates/theme/styles/layout/grid.css +78 -0
  298. package/templates/theme/styles/layout/layout.css +676 -1
  299. package/templates/theme/styles/layout/patterns.css +0 -155
  300. package/templates/theme/styles/navigation/nav.css +104 -154
  301. package/templates/theme/styles/overlays/alert-dialog.css +2 -2
  302. package/templates/theme/styles/overlays/dialog.css +76 -22
  303. package/templates/theme/styles/overlays/dropdown.css +108 -31
  304. package/templates/theme/styles/overlays/hover-card.css +39 -17
  305. package/templates/theme/styles/overlays/menubar.css +223 -0
  306. package/templates/theme/styles/overlays/popover.css +69 -23
  307. package/templates/theme/styles/overlays/toast.css +80 -33
  308. package/templates/theme/styles/overlays/tooltip.css +88 -14
  309. package/templates/theme/styles/shell/brand.css +48 -0
  310. package/templates/theme/styles/shell/footer.css +72 -0
  311. package/templates/theme/styles/shell/header.css +7 -50
  312. package/templates/theme/styles/shell/navbar.css +226 -453
  313. package/templates/theme/styles/shell/sidebar.css +197 -779
  314. package/templates/theme/tokens.css +145 -98
  315. package/dist/components/_internal/box-layout.js +0 -116
  316. package/dist/components/_internal/box-layout.js.map +0 -1
  317. package/dist/components/_internal/layout.d.ts +0 -9
  318. package/dist/components/_internal/layout.js +0 -147
  319. package/dist/components/_internal/layout.js.map +0 -1
  320. package/dist/components/badge/badge.a11y.d.ts +0 -17
  321. package/dist/components/block/block.a11y.d.ts +0 -20
  322. package/dist/components/box/box.a11y.d.ts +0 -14
  323. package/dist/components/box/box.d.ts +0 -9
  324. package/dist/components/box/box.js +0 -36
  325. package/dist/components/box/box.js.map +0 -1
  326. package/dist/components/box/box.types.d.ts +0 -72
  327. package/dist/components/box/index.d.ts +0 -3
  328. package/dist/components/breadcrumb/breadcrumb.a11y.d.ts +0 -17
  329. package/dist/components/breadcrumb/breadcrumb.a11y.js +0 -15
  330. package/dist/components/breadcrumb/breadcrumb.a11y.js.map +0 -1
  331. package/dist/components/breadcrumb/breadcrumb.d.ts +0 -18
  332. package/dist/components/breadcrumb/breadcrumb.js +0 -113
  333. package/dist/components/breadcrumb/breadcrumb.js.map +0 -1
  334. package/dist/components/breadcrumb/breadcrumb.types.d.ts +0 -65
  335. package/dist/components/breadcrumb/index.d.ts +0 -3
  336. package/dist/components/container/container.a11y.d.ts +0 -19
  337. package/dist/components/flex/flex.a11y.d.ts +0 -22
  338. package/dist/components/flex/flex.d.ts +0 -9
  339. package/dist/components/flex/flex.js +0 -115
  340. package/dist/components/flex/flex.js.map +0 -1
  341. package/dist/components/flex/flex.types.d.ts +0 -42
  342. package/dist/components/flex/index.d.ts +0 -3
  343. package/dist/components/header/header.a11y.d.ts +0 -14
  344. package/dist/components/header/header.a11y.js +0 -12
  345. package/dist/components/header/header.a11y.js.map +0 -1
  346. package/dist/components/inline/index.d.ts +0 -8
  347. package/dist/components/inline/index.js +0 -13
  348. package/dist/components/inline/index.js.map +0 -1
  349. package/dist/components/list-group/index.d.ts +0 -2
  350. package/dist/components/list-group/list-group.d.ts +0 -9
  351. package/dist/components/list-group/list-group.js +0 -43
  352. package/dist/components/list-group/list-group.js.map +0 -1
  353. package/dist/components/list-group/list-group.types.d.ts +0 -32
  354. package/dist/components/navbar/navbar-panel.js +0 -42
  355. package/dist/components/navbar/navbar-panel.js.map +0 -1
  356. package/dist/components/navbar/navbar.context.js +0 -13
  357. package/dist/components/navbar/navbar.context.js.map +0 -1
  358. package/dist/components/navbar/navbar.render.js +0 -26
  359. package/dist/components/navbar/navbar.render.js.map +0 -1
  360. package/dist/components/navbar/navbar.shared.js +0 -18
  361. package/dist/components/navbar/navbar.shared.js.map +0 -1
  362. package/dist/components/pagination/index.d.ts +0 -2
  363. package/dist/components/pagination/pagination.d.ts +0 -11
  364. package/dist/components/pagination/pagination.js +0 -95
  365. package/dist/components/pagination/pagination.js.map +0 -1
  366. package/dist/components/pagination/pagination.types.d.ts +0 -40
  367. package/dist/components/section/section.a11y.d.ts +0 -15
  368. package/dist/components/separator/separator.a11y.d.ts +0 -17
  369. package/dist/components/separator/separator.a11y.js +0 -15
  370. package/dist/components/separator/separator.a11y.js.map +0 -1
  371. package/dist/components/shell/index.d.ts +0 -3
  372. package/dist/components/shell/shell-nav.types.d.ts +0 -7
  373. package/dist/components/shell/shell-panel.js +0 -54
  374. package/dist/components/shell/shell-panel.js.map +0 -1
  375. package/dist/components/shell/shell-responsive.js +0 -118
  376. package/dist/components/shell/shell-responsive.js.map +0 -1
  377. package/dist/components/shell/shell.a11y.d.ts +0 -23
  378. package/dist/components/shell/shell.a11y.js +0 -23
  379. package/dist/components/shell/shell.a11y.js.map +0 -1
  380. package/dist/components/shell/shell.d.ts +0 -13
  381. package/dist/components/shell/shell.js +0 -69
  382. package/dist/components/shell/shell.js.map +0 -1
  383. package/dist/components/shell/shell.types.d.ts +0 -58
  384. package/dist/components/sidebar/sidebar-panel.d.ts +0 -7
  385. package/dist/components/sidebar/sidebar-panel.js +0 -49
  386. package/dist/components/sidebar/sidebar-panel.js.map +0 -1
  387. package/dist/components/sidebar/sidebar-toggle.d.ts +0 -7
  388. package/dist/components/sidebar/sidebar-toggle.js +0 -8
  389. package/dist/components/sidebar/sidebar-toggle.js.map +0 -1
  390. package/dist/components/sidebar/sidebar.context.js +0 -21
  391. package/dist/components/sidebar/sidebar.context.js.map +0 -1
  392. package/dist/components/sidebar/sidebar.shared.js +0 -12
  393. package/dist/components/sidebar/sidebar.shared.js.map +0 -1
  394. package/dist/components/skeleton/skeleton.a11y.d.ts +0 -16
  395. package/dist/components/spacer/index.d.ts +0 -3
  396. package/dist/components/spacer/spacer.a11y.d.ts +0 -17
  397. package/dist/components/spacer/spacer.d.ts +0 -8
  398. package/dist/components/spacer/spacer.js +0 -49
  399. package/dist/components/spacer/spacer.js.map +0 -1
  400. package/dist/components/spacer/spacer.types.d.ts +0 -26
  401. package/dist/components/stack/index.d.ts +0 -3
  402. package/dist/components/stack/stack.a11y.d.ts +0 -18
  403. package/dist/components/stack/stack.d.ts +0 -8
  404. package/dist/components/stack/stack.js +0 -16
  405. package/dist/components/stack/stack.js.map +0 -1
  406. package/dist/components/stack/stack.types.d.ts +0 -22
  407. package/dist/feedback.d.ts +0 -5
  408. package/dist/feedback.js +0 -4
  409. package/dist/layouts.d.ts +0 -25
  410. package/dist/layouts.js +0 -11
  411. package/dist/shells.d.ts +0 -16
  412. package/dist/shells.js +0 -11
  413. package/src/components/_internal/box-layout.ts +0 -164
  414. package/src/components/_internal/layout.ts +0 -211
  415. package/src/components/box/box.a11y.ts +0 -11
  416. package/src/components/box/box.tsx +0 -38
  417. package/src/components/box/box.types.ts +0 -76
  418. package/src/components/box/index.ts +0 -11
  419. package/src/components/breadcrumb/breadcrumb.a11y.ts +0 -15
  420. package/src/components/breadcrumb/breadcrumb.tsx +0 -123
  421. package/src/components/breadcrumb/breadcrumb.types.ts +0 -74
  422. package/src/components/breadcrumb/index.ts +0 -24
  423. package/src/components/flex/flex.a11y.ts +0 -19
  424. package/src/components/flex/flex.tsx +0 -162
  425. package/src/components/flex/flex.types.ts +0 -51
  426. package/src/components/flex/index.ts +0 -16
  427. package/src/components/inline/index.tsx +0 -28
  428. package/src/components/list-group/index.ts +0 -7
  429. package/src/components/list-group/list-group.tsx +0 -74
  430. package/src/components/list-group/list-group.types.ts +0 -32
  431. package/src/components/navbar/navbar-panel.tsx +0 -62
  432. package/src/components/navbar/navbar.context.ts +0 -22
  433. package/src/components/navbar/navbar.render.tsx +0 -32
  434. package/src/components/navbar/navbar.shared.ts +0 -21
  435. package/src/components/pagination/index.ts +0 -8
  436. package/src/components/pagination/pagination.tsx +0 -158
  437. package/src/components/pagination/pagination.types.ts +0 -41
  438. package/src/components/shell/index.ts +0 -16
  439. package/src/components/shell/shell-nav.types.ts +0 -3
  440. package/src/components/shell/shell-panel.tsx +0 -85
  441. package/src/components/shell/shell-responsive.tsx +0 -246
  442. package/src/components/shell/shell.a11y.ts +0 -20
  443. package/src/components/shell/shell.tsx +0 -74
  444. package/src/components/shell/shell.types.ts +0 -71
  445. package/src/components/sidebar/sidebar-panel.tsx +0 -67
  446. package/src/components/sidebar/sidebar-toggle.tsx +0 -5
  447. package/src/components/sidebar/sidebar.context.ts +0 -40
  448. package/src/components/sidebar/sidebar.shared.ts +0 -12
  449. package/src/components/spacer/index.ts +0 -9
  450. package/src/components/spacer/spacer.a11y.ts +0 -14
  451. package/src/components/spacer/spacer.tsx +0 -61
  452. package/src/components/spacer/spacer.types.ts +0 -31
  453. package/src/components/stack/index.ts +0 -3
  454. package/src/components/stack/stack.a11y.ts +0 -15
  455. package/src/components/stack/stack.tsx +0 -13
  456. package/src/components/stack/stack.types.ts +0 -22
  457. package/src/feedback.ts +0 -6
  458. package/src/layouts.ts +0 -19
  459. package/src/shells.ts +0 -13
  460. package/src/themes/default/styles/actions/toggle.css +0 -50
  461. package/src/themes/default/styles/disclosure/collapsible.css +0 -58
  462. package/src/themes/default/styles/display/list-group.css +0 -84
  463. package/src/themes/default/styles/forms/form.css +0 -5
  464. package/src/themes/default/styles/layout/responsive-layout.css +0 -230
  465. package/src/themes/default/styles/navigation/breadcrumb.css +0 -45
  466. package/src/themes/default/styles/navigation/menu.css +0 -203
  467. package/src/themes/default/styles/navigation/menubar.css +0 -255
  468. package/src/themes/default/styles/navigation/pagination.css +0 -91
  469. package/src/themes/default/styles/shell/theme.css +0 -37
  470. package/templates/theme/styles/actions/toggle.css +0 -50
  471. package/templates/theme/styles/disclosure/collapsible.css +0 -58
  472. package/templates/theme/styles/display/list-group.css +0 -84
  473. package/templates/theme/styles/forms/form.css +0 -5
  474. package/templates/theme/styles/layout/responsive-layout.css +0 -230
  475. package/templates/theme/styles/navigation/breadcrumb.css +0 -45
  476. package/templates/theme/styles/navigation/menu.css +0 -203
  477. package/templates/theme/styles/navigation/menubar.css +0 -255
  478. package/templates/theme/styles/navigation/pagination.css +0 -91
  479. package/templates/theme/styles/shell/theme.css +0 -37
@@ -1,9 +1,10 @@
1
- import { ProgressCircle } from "@askrjs/ui";
1
+ import { ProgressCircle, ProgressCircleIndicator } from "@askrjs/ui";
2
2
  import type { SpinnerProps } from "./spinner.types";
3
3
 
4
4
  export function Spinner(props: SpinnerProps): JSX.Element {
5
5
  const {
6
6
  label,
7
+ size,
7
8
  "aria-label": ariaLabel,
8
9
  ...rest
9
10
  } = props as SpinnerProps & {
@@ -14,8 +15,12 @@ export function Spinner(props: SpinnerProps): JSX.Element {
14
15
  <ProgressCircle
15
16
  {...rest}
16
17
  aria-label={ariaLabel ?? label ?? "Loading"}
18
+ data-spinner="true"
19
+ data-size={size && size !== "md" ? size : undefined}
17
20
  value={null}
18
21
  getValueLabel={() => label ?? "Loading"}
19
- />
22
+ >
23
+ <ProgressCircleIndicator />
24
+ </ProgressCircle>
20
25
  );
21
26
  }
@@ -1,7 +1,10 @@
1
1
  import type { ProgressCircleProps } from "@askrjs/ui";
2
2
 
3
+ export type SpinnerSize = "sm" | "md" | "lg";
4
+
3
5
  export type SpinnerOwnProps = Omit<ProgressCircleProps, "value" | "getValueLabel"> & {
4
6
  label?: string;
7
+ size?: SpinnerSize;
5
8
  };
6
9
 
7
10
  export type SpinnerProps = SpinnerOwnProps;
@@ -0,0 +1,2 @@
1
+ export { Stat, StatDescription, StatLabel, StatValue } from "./stat";
2
+ export type * from "./stat.types";
@@ -0,0 +1,47 @@
1
+ import { classes } from "../_internal/classes";
2
+ import { mergeProps } from "../_internal/merge-props";
3
+ import type { StatDescriptionProps, StatLabelProps, StatProps, StatValueProps } from "./stat.types";
4
+
5
+ export function Stat(props: StatProps): JSX.Element {
6
+ const { children, class: className, ref, ...rest } = props;
7
+ const finalProps = mergeProps(rest, {
8
+ ref,
9
+ class: classes("stat", className),
10
+ "data-slot": "stat",
11
+ });
12
+
13
+ return <div {...finalProps}>{children}</div>;
14
+ }
15
+
16
+ export function StatLabel(props: StatLabelProps): JSX.Element {
17
+ const { children, class: className, ref, ...rest } = props;
18
+ const finalProps = mergeProps(rest, {
19
+ ref,
20
+ class: classes("stat-label", className),
21
+ "data-slot": "stat-label",
22
+ });
23
+
24
+ return <p {...finalProps}>{children}</p>;
25
+ }
26
+
27
+ export function StatValue(props: StatValueProps): JSX.Element {
28
+ const { children, class: className, ref, ...rest } = props;
29
+ const finalProps = mergeProps(rest, {
30
+ ref,
31
+ class: classes("stat-value", className),
32
+ "data-slot": "stat-value",
33
+ });
34
+
35
+ return <p {...finalProps}>{children}</p>;
36
+ }
37
+
38
+ export function StatDescription(props: StatDescriptionProps): JSX.Element {
39
+ const { children, class: className, ref, ...rest } = props;
40
+ const finalProps = mergeProps(rest, {
41
+ ref,
42
+ class: classes("stat-description", className),
43
+ "data-slot": "stat-description",
44
+ });
45
+
46
+ return <p {...finalProps}>{children}</p>;
47
+ }
@@ -0,0 +1,24 @@
1
+ import type { Ref } from "@askrjs/askr/foundations/utilities";
2
+
3
+ type DivProps = Omit<JSX.IntrinsicElements["div"], "children" | "ref">;
4
+ type ParagraphProps = Omit<JSX.IntrinsicElements["p"], "children" | "ref">;
5
+
6
+ export type StatProps = DivProps & {
7
+ children?: unknown;
8
+ ref?: Ref<HTMLDivElement>;
9
+ };
10
+
11
+ export type StatLabelProps = ParagraphProps & {
12
+ children?: unknown;
13
+ ref?: Ref<HTMLParagraphElement>;
14
+ };
15
+
16
+ export type StatValueProps = ParagraphProps & {
17
+ children?: unknown;
18
+ ref?: Ref<HTMLParagraphElement>;
19
+ };
20
+
21
+ export type StatDescriptionProps = ParagraphProps & {
22
+ children?: unknown;
23
+ ref?: Ref<HTMLParagraphElement>;
24
+ };
@@ -0,0 +1,2 @@
1
+ export { Text } from "./text";
2
+ export type * from "./text.types";
@@ -0,0 +1,39 @@
1
+ import { classes } from "../_internal/classes";
2
+ import { mergeProps } from "../_internal/merge-props";
3
+ import type { TextElement, TextProps } from "./text.types";
4
+
5
+ const DEFAULT_ELEMENT = "p";
6
+
7
+ export function Text<TElement extends TextElement = "p">(props: TextProps<TElement>): JSX.Element {
8
+ const {
9
+ as,
10
+ size = "md",
11
+ tone = "default",
12
+ weight,
13
+ font,
14
+ numeric,
15
+ wrap,
16
+ truncate,
17
+ children,
18
+ class: classProp,
19
+ className,
20
+ ref,
21
+ ...rest
22
+ } = props as TextProps<TextElement> & { class?: unknown; className?: unknown };
23
+
24
+ const finalProps = mergeProps(rest, {
25
+ ref,
26
+ class: classes("text", classProp, className),
27
+ "data-slot": "text",
28
+ "data-size": size,
29
+ "data-tone": tone,
30
+ "data-weight": weight,
31
+ "data-font": font && font !== "body" ? font : undefined,
32
+ "data-numeric": numeric && numeric !== "normal" ? numeric : undefined,
33
+ "data-wrap": wrap,
34
+ "data-truncate": truncate ? "true" : undefined,
35
+ });
36
+
37
+ const Element = (as ?? DEFAULT_ELEMENT) as keyof JSX.IntrinsicElements;
38
+ return <Element {...finalProps}>{children}</Element>;
39
+ }
@@ -0,0 +1,35 @@
1
+ import type { Ref } from "@askrjs/askr/foundations/utilities";
2
+
3
+ export type TextElement = "p" | "span" | "div" | "strong";
4
+ export type TextSize = "sm" | "md" | "lg";
5
+ export type TextTone =
6
+ | "default"
7
+ | "muted"
8
+ | "subtle"
9
+ | "inverse"
10
+ | "success"
11
+ | "warning"
12
+ | "danger"
13
+ | "info";
14
+ export type TextWeight = "normal" | "medium" | "semibold" | "bold";
15
+ export type TextFont = "body" | "mono";
16
+ export type TextNumeric = "normal" | "tabular";
17
+ export type TextWrap = "normal" | "nowrap" | "anywhere";
18
+
19
+ type TextIntrinsicProps<TElement extends TextElement> = Omit<
20
+ JSX.IntrinsicElements[TElement],
21
+ "children" | "ref"
22
+ >;
23
+
24
+ export type TextProps<TElement extends TextElement = "p"> = TextIntrinsicProps<TElement> & {
25
+ as?: TElement;
26
+ size?: TextSize;
27
+ tone?: TextTone;
28
+ weight?: TextWeight;
29
+ font?: TextFont;
30
+ numeric?: TextNumeric;
31
+ wrap?: TextWrap;
32
+ truncate?: boolean;
33
+ children?: unknown;
34
+ ref?: Ref<HTMLElement>;
35
+ };
@@ -1,4 +1,4 @@
1
- import { defineContext, readContext, state } from "@askrjs/askr";
1
+ import { defineContext, getSignal, readContext, state } from "@askrjs/askr";
2
2
  import type { JSXElement } from "@askrjs/askr/foundations/structures";
3
3
  import { resource } from "@askrjs/askr/resources";
4
4
  import { Button } from "@askrjs/ui";
@@ -65,6 +65,12 @@ export const CAT_THEME_OPTIONS: readonly ThemeOption[] = [
65
65
  ];
66
66
 
67
67
  const DEFAULT_STORAGE_KEY = "askr-theme";
68
+ const STATIC_CHILDREN = Symbol.for("askr.static-children");
69
+ const STATIC_CHILD_SLOTS_CACHE = Symbol.for("__askrStaticChildSlots");
70
+ // Passive mount sync should not overwrite a newer user/provider-initiated change.
71
+ let rootThemeRevision = 0;
72
+ let explicitRootThemeOwner: symbol | undefined;
73
+ const registeredProviderSignals = new WeakSet<AbortSignal>();
68
74
 
69
75
  const ThemeContext = defineContext<ThemeContextValue>({
70
76
  theme: () => "system",
@@ -85,12 +91,29 @@ export function ThemeProvider(props: ThemeProviderProps): JSX.Element {
85
91
  storageKey = DEFAULT_STORAGE_KEY,
86
92
  } = props;
87
93
 
94
+ const providerId = state<symbol>(Symbol("ThemeProvider"))();
95
+ const providerSignal = getSignal();
88
96
  const themeState = state<ThemeName>(readStoredTheme(storageKey) ?? defaultTheme);
89
97
  const currentTheme = themeState();
90
98
 
99
+ if (!registeredProviderSignals.has(providerSignal)) {
100
+ registeredProviderSignals.add(providerSignal);
101
+ providerSignal.addEventListener(
102
+ "abort",
103
+ () => {
104
+ if (explicitRootThemeOwner === providerId) {
105
+ explicitRootThemeOwner = undefined;
106
+ }
107
+ },
108
+ { once: true },
109
+ );
110
+ }
111
+
91
112
  const setTheme = (nextTheme: ThemeName) => {
92
113
  themeState.set(nextTheme);
93
114
  writeStoredTheme(storageKey, nextTheme);
115
+ explicitRootThemeOwner = providerId;
116
+ rootThemeRevision += 1;
94
117
  syncThemeRoot(nextTheme);
95
118
  };
96
119
 
@@ -103,14 +126,15 @@ export function ThemeProvider(props: ThemeProviderProps): JSX.Element {
103
126
 
104
127
  return (
105
128
  <ThemeContext.Scope value={value}>
106
- <ThemeRootSync theme={currentTheme} />
129
+ <ThemeRootSync providerId={providerId} theme={currentTheme} />
107
130
  <div data-slot="theme-provider">{children}</div>
108
131
  </ThemeContext.Scope>
109
132
  );
110
133
  }
111
134
 
112
- function ThemeRootSync(props: { theme: ThemeName }): JSX.Element | null {
113
- const { theme } = props;
135
+ function ThemeRootSync(props: { providerId: symbol; theme: ThemeName }): JSX.Element | null {
136
+ const { providerId, theme } = props;
137
+ const expectedRootThemeRevision = rootThemeRevision;
114
138
 
115
139
  resource(
116
140
  ({ signal }: { signal: AbortSignal }) => {
@@ -121,7 +145,11 @@ function ThemeRootSync(props: { theme: ThemeName }): JSX.Element | null {
121
145
 
122
146
  const timeoutId = window.setTimeout(() => {
123
147
  if (!signal.aborted) {
124
- syncThemeRoot(theme);
148
+ syncThemeRoot(theme, {
149
+ expectedRevision: expectedRootThemeRevision,
150
+ passive: true,
151
+ providerId,
152
+ });
125
153
  }
126
154
  }, 0);
127
155
 
@@ -144,20 +172,23 @@ function ThemeRootSync(props: { theme: ThemeName }): JSX.Element | null {
144
172
  export function ThemePicker(props: ThemePickerProps): JSX.Element {
145
173
  const theme = useTheme();
146
174
  const { themes = theme.themes, label = "Theme", ...rest } = props;
175
+ const currentTheme = theme.theme();
147
176
 
148
177
  return (
149
178
  <select
150
179
  {...rest}
151
180
  aria-label={rest["aria-label"] ?? label}
152
181
  data-slot="theme-picker"
153
- value={theme.theme()}
182
+ value={currentTheme}
154
183
  onChange={(event: Event) => {
155
- const target = event.currentTarget as HTMLSelectElement;
156
- theme.setTheme(target.value as ThemeName);
184
+ const target = getThemePickerTarget(event);
185
+ if (target) {
186
+ theme.setTheme(target.value as ThemeName);
187
+ }
157
188
  }}
158
189
  >
159
190
  {themes.map((option) => (
160
- <option key={option.value} value={option.value}>
191
+ <option key={option.value} value={option.value} selected={option.value === currentTheme}>
161
192
  {option.label}
162
193
  </option>
163
194
  ))}
@@ -165,6 +196,23 @@ export function ThemePicker(props: ThemePickerProps): JSX.Element {
165
196
  );
166
197
  }
167
198
 
199
+ function getThemePickerTarget(event: Event): HTMLSelectElement | null {
200
+ if (typeof HTMLSelectElement === "undefined") {
201
+ return null;
202
+ }
203
+
204
+ const path = typeof event.composedPath === "function" ? event.composedPath() : [];
205
+ const candidates = [event.target, event.currentTarget, ...path];
206
+
207
+ for (const candidate of candidates) {
208
+ if (candidate instanceof HTMLSelectElement) {
209
+ return candidate;
210
+ }
211
+ }
212
+
213
+ return null;
214
+ }
215
+
168
216
  export function ThemeToggle(props: ThemeToggleProps): JSX.Element {
169
217
  const theme = useTheme();
170
218
  const {
@@ -178,7 +226,7 @@ export function ThemeToggle(props: ThemeToggleProps): JSX.Element {
178
226
  } = props;
179
227
 
180
228
  const currentTheme = theme.theme();
181
- const nextTheme = getNextTheme(currentTheme, themes);
229
+ const nextTheme = getNextTheme(currentTheme, themes, getResolvedSystemTheme());
182
230
  const renderContext = { theme: currentTheme, nextTheme };
183
231
  const ariaLabel = (rest as Record<string, unknown>)["aria-label"];
184
232
  const themedIcon = resolveThemeToggleIcon(currentTheme, nextTheme, {
@@ -186,9 +234,15 @@ export function ThemeToggle(props: ThemeToggleProps): JSX.Element {
186
234
  darkIcon,
187
235
  systemIcon,
188
236
  });
189
- const renderedIcon = cloneThemeToggleIcon(themedIcon);
237
+ const renderedIcon = cloneThemeToggleIcon(themedIcon, currentTheme);
238
+ const renderedIconSlots =
239
+ renderThemeToggleIconSlots(currentTheme, {
240
+ lightIcon,
241
+ darkIcon,
242
+ systemIcon,
243
+ }) ?? renderedIcon;
190
244
  const content =
191
- typeof children === "function" ? children(renderContext) : (children ?? renderedIcon);
245
+ typeof children === "function" ? children(renderContext) : (children ?? renderedIconSlots);
192
246
 
193
247
  return (
194
248
  <Button
@@ -199,7 +253,9 @@ export function ThemeToggle(props: ThemeToggleProps): JSX.Element {
199
253
  data-next-theme={nextTheme}
200
254
  onPress={(event) => {
201
255
  onPress?.(event);
202
- if (!event.defaultPrevented) theme.setTheme(nextTheme);
256
+ if (!event.defaultPrevented && !Object.is(nextTheme, currentTheme)) {
257
+ theme.setTheme(nextTheme);
258
+ }
203
259
  }}
204
260
  >
205
261
  <span data-slot="theme-toggle-content">{content}</span>
@@ -207,12 +263,29 @@ export function ThemeToggle(props: ThemeToggleProps): JSX.Element {
207
263
  );
208
264
  }
209
265
 
210
- function getNextTheme(currentTheme: ThemeName, themes: readonly ThemeName[]): ThemeName {
266
+ function getNextTheme(
267
+ currentTheme: ThemeName,
268
+ themes: readonly ThemeName[],
269
+ resolvedSystemTheme: "light" | "dark" = "light",
270
+ ): ThemeName {
211
271
  if (themes.length === 0) return currentTheme;
212
272
  const index = themes.indexOf(currentTheme);
273
+ if (index < 0 && currentTheme === "system") {
274
+ if (themes.includes("light") && themes.includes("dark")) {
275
+ return resolvedSystemTheme === "dark" ? "light" : "dark";
276
+ }
277
+ }
213
278
  return themes[index >= 0 && index < themes.length - 1 ? index + 1 : 0]!;
214
279
  }
215
280
 
281
+ function getResolvedSystemTheme(): "light" | "dark" {
282
+ if (typeof window === "undefined" || typeof window.matchMedia !== "function") {
283
+ return "light";
284
+ }
285
+
286
+ return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
287
+ }
288
+
216
289
  function getThemeIcon(
217
290
  theme: ThemeName,
218
291
  icons: Pick<ThemeToggleProps, "lightIcon" | "darkIcon" | "systemIcon">,
@@ -231,6 +304,37 @@ export function resolveThemeToggleIcon(
231
304
  return getThemeIcon(theme, icons) ?? getThemeIcon(nextTheme, icons);
232
305
  }
233
306
 
307
+ function renderThemeToggleIconSlots(
308
+ theme: ThemeName,
309
+ icons: Pick<ThemeToggleProps, "lightIcon" | "darkIcon" | "systemIcon">,
310
+ ): unknown {
311
+ if (getThemeIcon(theme, icons) === undefined) {
312
+ return undefined;
313
+ }
314
+
315
+ const slots = [
316
+ ["light", icons.lightIcon],
317
+ ["dark", icons.darkIcon],
318
+ ["system", icons.systemIcon],
319
+ ] as const;
320
+ const availableSlots = slots.filter(([, icon]) => icon !== undefined && icon !== null);
321
+
322
+ if (availableSlots.length <= 1) {
323
+ return undefined;
324
+ }
325
+
326
+ return availableSlots.map(([slotTheme, icon]) => (
327
+ <span
328
+ key={slotTheme}
329
+ data-slot="theme-toggle-icon"
330
+ data-theme-toggle-icon={slotTheme}
331
+ hidden={slotTheme === theme ? undefined : true}
332
+ >
333
+ {cloneThemeToggleIcon(icon, slotTheme)}
334
+ </span>
335
+ ));
336
+ }
337
+
234
338
  function isJSXElement(value: unknown): value is JSXElement {
235
339
  return (
236
340
  typeof value === "object" &&
@@ -241,27 +345,64 @@ function isJSXElement(value: unknown): value is JSXElement {
241
345
  );
242
346
  }
243
347
 
244
- function cloneThemeToggleIcon(icon: unknown): unknown {
348
+ function cloneThemeToggleIcon(icon: unknown, key?: string): unknown {
349
+ if (Array.isArray(icon)) {
350
+ const clonedChildren = icon.map((child) => cloneThemeToggleIcon(child));
351
+ if ((icon as Record<symbol, unknown>)[STATIC_CHILDREN] === true) {
352
+ Object.defineProperty(clonedChildren, STATIC_CHILDREN, {
353
+ value: true,
354
+ configurable: true,
355
+ });
356
+ }
357
+ return clonedChildren;
358
+ }
359
+
245
360
  if (!isJSXElement(icon)) return icon;
246
361
 
247
362
  const props = icon.props as Record<string, unknown> | undefined;
248
- if (!props || Object.keys(props).length === 0) {
249
- return icon;
363
+ const clonedProps = props ? { ...props } : {};
364
+
365
+ if ("children" in clonedProps) {
366
+ clonedProps.children = cloneThemeToggleIcon(clonedProps.children);
250
367
  }
251
368
 
252
- return {
369
+ const iconKey = (icon.key ?? key ?? null) as string | number | null;
370
+ const clonedIcon = {
253
371
  ...icon,
254
- props: { ...props },
372
+ key: iconKey,
373
+ props: clonedProps,
255
374
  };
375
+
376
+ delete (clonedIcon as Record<symbol, unknown>)[STATIC_CHILD_SLOTS_CACHE];
377
+ return clonedIcon;
256
378
  }
257
379
 
258
- function syncThemeRoot(themeChoice: ThemeName | null | undefined): void {
380
+ function syncThemeRoot(
381
+ themeChoice: ThemeName | null | undefined,
382
+ options?: { expectedRevision?: number; passive?: boolean; providerId?: symbol },
383
+ ): void {
259
384
  if (typeof document === "undefined") {
260
385
  return;
261
386
  }
262
387
 
263
388
  const html = document.documentElement;
264
389
 
390
+ if (
391
+ options?.passive &&
392
+ options.expectedRevision !== undefined &&
393
+ options.expectedRevision !== rootThemeRevision
394
+ ) {
395
+ return;
396
+ }
397
+
398
+ if (
399
+ options?.passive &&
400
+ explicitRootThemeOwner !== undefined &&
401
+ explicitRootThemeOwner !== options.providerId
402
+ ) {
403
+ return;
404
+ }
405
+
265
406
  if (themeChoice == null) {
266
407
  html.removeAttribute("data-theme");
267
408
  html.removeAttribute("data-theme-choice");
@@ -280,7 +421,8 @@ function syncThemeRoot(themeChoice: ThemeName | null | undefined): void {
280
421
  function readStoredTheme(storageKey: string): ThemeName | undefined {
281
422
  if (typeof window === "undefined") return undefined;
282
423
  try {
283
- return (window.localStorage.getItem(storageKey) as ThemeName | null) ?? undefined;
424
+ const storedTheme = window.localStorage.getItem(storageKey);
425
+ return storedTheme ? (storedTheme as ThemeName) : undefined;
284
426
  } catch {
285
427
  return undefined;
286
428
  }
@@ -0,0 +1,2 @@
1
+ export { Toolbar } from "./toolbar";
2
+ export type { ToolbarProps } from "./toolbar.types";
@@ -0,0 +1,24 @@
1
+ import { Block } from "../block";
2
+ import type { ToolbarProps } from "./toolbar.types";
3
+
4
+ export function Toolbar(props: ToolbarProps): JSX.Element {
5
+ const { title, actions, ...rest } = props;
6
+
7
+ return (
8
+ <Block
9
+ rowFrom="md"
10
+ align={{ base: "start", md: "center" }}
11
+ justify="between"
12
+ gap="md"
13
+ {...rest}
14
+ data-slot="toolbar"
15
+ >
16
+ <h2 data-slot="toolbar-title">{title}</h2>
17
+ {actions !== undefined ? (
18
+ <Block direction="row" gap="sm" data-slot="toolbar-actions">
19
+ {actions}
20
+ </Block>
21
+ ) : null}
22
+ </Block>
23
+ );
24
+ }
@@ -0,0 +1,6 @@
1
+ import type { BlockDivProps } from "../block";
2
+
3
+ export type ToolbarProps = BlockDivProps & {
4
+ title: unknown;
5
+ actions?: unknown;
6
+ };