themelia-ui 3.0.0 → 3.1.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 (709) hide show
  1. package/.agents/skills/themelia-ui/SKILL.md +27 -29
  2. package/.agents/skills/themelia-ui/references/api-compatibility.md +3 -3
  3. package/.agents/skills/themelia-ui/references/composition.md +2 -18
  4. package/.agents/skills/themelia-ui/references/framework-wiring.md +8 -8
  5. package/.agents/skills/themelia-ui/references/imports.md +104 -104
  6. package/.agents/skills/themelia-ui/references/installation.md +55 -27
  7. package/.agents/skills/themelia-ui/references/migration.md +136 -5
  8. package/.agents/skills/themelia-ui/references/provider-and-scoping.md +13 -19
  9. package/.agents/skills/themelia-ui/references/theming.md +170 -131
  10. package/.agents/skills/themelia-ui/references/troubleshooting.md +62 -27
  11. package/.agents/skills/themelia-ui/references/verification.md +2 -3
  12. package/CHANGELOG.md +187 -0
  13. package/README.md +45 -60
  14. package/dist/accordion-CHuzMmWL.js +143 -0
  15. package/dist/{action-menu-BNLURfMK.js → action-menu-BwiL_F6I.js} +35 -33
  16. package/dist/{alert-dialog-BMVo6Z-8.js → alert-dialog-Bmo1YrTm.js} +1 -1
  17. package/dist/avatar-Dc_BNYfB.js +93 -0
  18. package/dist/badge-VlJVZjdm.js +45 -0
  19. package/dist/base/accordion.js +1 -1
  20. package/dist/base/action-menu.js +1 -1
  21. package/dist/base/alert-dialog.js +1 -1
  22. package/dist/base/aspect-ratio.js +3 -1
  23. package/dist/base/avatar.js +1 -1
  24. package/dist/base/badge.js +2 -2
  25. package/dist/base/batch-action-bar.js +1 -1
  26. package/dist/base/buttons.js +1 -1
  27. package/dist/base/cards.js +1 -1
  28. package/dist/base/carousel.js +6 -4
  29. package/dist/base/chart.js +1 -1
  30. package/dist/base/choice-inputs.js +1 -1
  31. package/dist/base/combobox.js +1 -1
  32. package/dist/base/command.js +1 -1
  33. package/dist/base/context-menu.js +22 -21
  34. package/dist/base/copyable.js +1 -1
  35. package/dist/base/date-pickers.js +1 -1
  36. package/dist/base/dialog.js +1 -1
  37. package/dist/base/display.js +1 -1
  38. package/dist/base/dropdown-menu.js +1 -1
  39. package/dist/base/feedback.js +1 -1
  40. package/dist/base/forms-numeric.js +1 -1
  41. package/dist/base/forms.js +1 -1
  42. package/dist/base/hover-card.js +26 -23
  43. package/dist/base/input-group.js +1 -1
  44. package/dist/base/item.js +1 -1
  45. package/dist/base/label.js +1 -1
  46. package/dist/base/menubar.js +20 -14
  47. package/dist/base/navigation-menu.js +47 -38
  48. package/dist/base/navigation.js +1 -1
  49. package/dist/base/otp-input.js +36 -30
  50. package/dist/base/overlay.js +1 -1
  51. package/dist/base/popover-menu.js +1 -1
  52. package/dist/base/popover.js +1 -1
  53. package/dist/base/qr-code.js +51 -47
  54. package/dist/base/repeaters.js +1 -1
  55. package/dist/base/resizable.js +2 -0
  56. package/dist/base/sheet.js +1 -1
  57. package/dist/base/sidebar.js +1 -1
  58. package/dist/base/skeleton.js +1 -1
  59. package/dist/base/spinner.js +1 -1
  60. package/dist/base/structure.js +1 -1
  61. package/dist/base/table.js +1 -1
  62. package/dist/base/text-inputs.js +1 -1
  63. package/dist/base/timeline.js +1 -1
  64. package/dist/base/toaster.js +1 -1
  65. package/dist/base/toggle.js +21 -15
  66. package/dist/base/toolbar.js +1 -1
  67. package/dist/base/tooltip.js +1 -1
  68. package/dist/base/typography.js +2 -2
  69. package/dist/base/upload.js +1 -1
  70. package/dist/base/value-inputs.js +1 -1
  71. package/dist/{batch-action-bar-BZYNKXdV.js → batch-action-bar-DZVMVW83.js} +11 -8
  72. package/dist/{admin/patterns → blocks/admin}/access.js +79 -76
  73. package/dist/blocks/admin/commerce.js +2493 -0
  74. package/dist/{patterns → blocks}/analytics.js +312 -303
  75. package/dist/{patterns → blocks}/onboarding.js +27 -23
  76. package/dist/{patterns → blocks}/timelines.js +1 -1
  77. package/dist/buttons-BX2JfL5X.js +173 -0
  78. package/dist/cards-DdiICdMM.js +279 -0
  79. package/dist/chart-BkK3Xm10.js +201 -0
  80. package/dist/choice-inputs-CCw-0gD6.js +694 -0
  81. package/dist/combobox-Byu8N-Oe.js +274 -0
  82. package/dist/command-CnB_IZSo.js +156 -0
  83. package/dist/comments-C6Y_ddMt.js +1443 -0
  84. package/dist/components/base/action-menu/action-menu.d.ts +1 -1
  85. package/dist/components/base/action-menu/action-menu.types.d.ts +2 -2
  86. package/dist/components/base/avatar/avatar.d.ts +5 -2
  87. package/dist/components/base/badge/badge.d.ts +10 -10
  88. package/dist/components/base/badge/badge.variants.d.ts +1 -2
  89. package/dist/components/base/badge/index.d.ts +1 -2
  90. package/dist/components/base/buttons/button.d.ts +9 -8
  91. package/dist/components/base/buttons/button.types.d.ts +2 -2
  92. package/dist/components/base/buttons/index.d.ts +1 -1
  93. package/dist/components/base/buttons/text-button.d.ts +1 -1
  94. package/dist/components/base/cards/card-actions.d.ts +1 -1
  95. package/dist/components/base/cards/card.d.ts +3 -1
  96. package/dist/components/base/cards/partials/card-header.d.ts +2 -1
  97. package/dist/components/base/choice-inputs/choice.types.d.ts +2 -2
  98. package/dist/components/base/choice-inputs/partials/choice-parts.d.ts +3 -3
  99. package/dist/components/base/command/command.d.ts +5 -2
  100. package/dist/components/base/display/icon-badge.d.ts +5 -3
  101. package/dist/components/base/display/index.d.ts +1 -1
  102. package/dist/components/base/display/metadata-list.d.ts +6 -6
  103. package/dist/components/base/display/metadata-value.d.ts +1 -1
  104. package/dist/components/base/display/separator.d.ts +2 -2
  105. package/dist/components/base/feedback/alert.d.ts +3 -2
  106. package/dist/components/base/feedback/empty.d.ts +5 -4
  107. package/dist/components/base/feedback/progress-circle.d.ts +2 -2
  108. package/dist/components/base/feedback/progress.d.ts +3 -1
  109. package/dist/components/base/input-group/input-group.d.ts +8 -10
  110. package/dist/components/base/item/item.d.ts +2 -2
  111. package/dist/components/base/overlay/index.d.ts +1 -1
  112. package/dist/components/base/overlay/overlay.types.d.ts +7 -5
  113. package/dist/components/base/qr-code/qr-code.d.ts +4 -4
  114. package/dist/components/base/sheet/sheet.d.ts +1 -1
  115. package/dist/components/base/sidebar/sidebar.d.ts +9 -13
  116. package/dist/components/base/spinner/spinner.d.ts +2 -2
  117. package/dist/components/base/structure/adaptive-grid.d.ts +3 -3
  118. package/dist/components/base/structure/bleed.d.ts +3 -2
  119. package/dist/components/base/structure/grid.d.ts +2 -2
  120. package/dist/components/base/structure/index.d.ts +1 -1
  121. package/dist/components/base/structure/split.d.ts +3 -3
  122. package/dist/components/base/structure/stack.d.ts +5 -5
  123. package/dist/components/base/structure/structure.maps.d.ts +2 -1
  124. package/dist/components/base/structure/structure.types.d.ts +10 -4
  125. package/dist/components/base/toggle/toggle.d.ts +2 -2
  126. package/dist/components/base/toolbar/toolbar.d.ts +3 -3
  127. package/dist/components/base/typography/index.d.ts +2 -0
  128. package/dist/components/base/typography/rich-text/rich-text.variants.d.ts +9 -0
  129. package/dist/components/base/typography/text/index.d.ts +1 -0
  130. package/dist/components/base/typography/text/text.d.ts +15 -8
  131. package/dist/components/base/typography/text/text.variants.d.ts +41 -0
  132. package/dist/components/base/value-inputs/color-input.d.ts +1 -7
  133. package/dist/components/base/value-inputs/slider.d.ts +2 -7
  134. package/dist/components/{admin/patterns → blocks/admin}/commerce/vendor-profile.d.ts +2 -1
  135. package/dist/components/{patterns → blocks}/analytics/analytics.strings.d.ts +2 -5
  136. package/dist/components/features/actions/action-adapters.d.ts +3 -3
  137. package/dist/components/features/actions/actions.types.d.ts +3 -5
  138. package/dist/components/features/actions/index.d.ts +1 -1
  139. package/dist/components/features/activities/activities-feed.d.ts +1 -1
  140. package/dist/components/features/activities/activities.types.d.ts +4 -4
  141. package/dist/components/features/activities/activity-parts.d.ts +3 -3
  142. package/dist/components/features/activities/activity-row.d.ts +4 -4
  143. package/dist/components/features/activities/index.d.ts +1 -1
  144. package/dist/components/features/ai-chat/ai-chat.types.d.ts +10 -3
  145. package/dist/components/features/ai-chat/ai-message-surfaces.d.ts +1 -1
  146. package/dist/components/features/ai-chat/ai-work-surfaces.d.ts +1 -1
  147. package/dist/components/features/combobox/combobox.strings.d.ts +2 -2
  148. package/dist/components/features/event-calendar/event-calendar.types.d.ts +3 -0
  149. package/dist/components/features/media-library/index.d.ts +1 -1
  150. package/dist/components/features/media-library/media-library-parts.d.ts +4 -3
  151. package/dist/components/features/media-library/media-library-views.d.ts +4 -3
  152. package/dist/components/features/media-library/media-library.d.ts +1 -1
  153. package/dist/components/features/media-library/media-library.strings.d.ts +12 -13
  154. package/dist/components/features/media-library/media-library.types.d.ts +11 -9
  155. package/dist/components/features/media-library/media-resource-gallery.d.ts +1 -1
  156. package/dist/components/features/media-library/use-media-library.d.ts +1 -4
  157. package/dist/components/features/overlays/action-overlay-frame.d.ts +1 -1
  158. package/dist/components/features/overlays/index.d.ts +1 -1
  159. package/dist/components/features/overlays/overlay-parts.d.ts +3 -3
  160. package/dist/components/features/overlays/overlays.types.d.ts +8 -7
  161. package/dist/components/features/rich-text-editor/index.d.ts +0 -1
  162. package/dist/components/features/table/data-table-body.d.ts +1 -1
  163. package/dist/components/features/table/data-table-expanded-row.d.ts +27 -0
  164. package/dist/components/features/table/data-table-header.d.ts +1 -1
  165. package/dist/components/features/table/data-table-size.d.ts +1 -1
  166. package/dist/components/features/table/data-table.d.ts +1 -1
  167. package/dist/components/features/table/index.d.ts +1 -1
  168. package/dist/components/features/table/table-helpers.d.ts +9 -3
  169. package/dist/components/features/table/table.strings.d.ts +11 -0
  170. package/dist/components/features/table/table.types.d.ts +60 -2
  171. package/dist/components/features/theme-tweaker/index.d.ts +1 -1
  172. package/dist/components/features/theme-tweaker/theme-tweaker.strings.d.ts +1 -1
  173. package/dist/components/features/theme-tweaker/theme-tweaker.types.d.ts +6 -10
  174. package/dist/components/features/theme-tweaker/theme-tweaker.utils.d.ts +22 -6
  175. package/dist/components/layout/app-shell/topbar-sidebar-layout.d.ts +1 -1
  176. package/dist/components/layout/auth/auth.d.ts +1 -1
  177. package/dist/components/layout/auth/auth.types.d.ts +1 -1
  178. package/dist/components/primitives/value.d.ts +3 -1
  179. package/dist/containers-B8d8U9GS.js +2 -0
  180. package/dist/{copyable-H1TUEY-H.js → copyable-D9Okb1w6.js} +12 -11
  181. package/dist/core.css +2 -2
  182. package/dist/css/access.css +2 -1
  183. package/dist/css/accordion.css +2 -1
  184. package/dist/css/action-menu.css +2 -1
  185. package/dist/css/activities.css +2 -1
  186. package/dist/css/ai-chat.css +2 -1
  187. package/dist/css/analytics.css +2 -1
  188. package/dist/css/app-shell.css +2 -1
  189. package/dist/css/aspect-ratio.css +2 -1
  190. package/dist/css/async-preview.css +2 -1
  191. package/dist/css/auth.css +2 -1
  192. package/dist/css/avatar.css +2 -1
  193. package/dist/css/badge.css +2 -1
  194. package/dist/css/batch-action-bar.css +2 -1
  195. package/dist/css/buttons.css +2 -1
  196. package/dist/css/cards.css +2 -1
  197. package/dist/css/carousel.css +2 -1
  198. package/dist/css/chart.css +2 -1
  199. package/dist/css/choice-inputs.css +2 -1
  200. package/dist/css/combobox.css +2 -1
  201. package/dist/css/combobox2.css +2 -1
  202. package/dist/css/command.css +2 -1
  203. package/dist/css/comments.css +2 -1
  204. package/dist/css/commerce.css +2 -1
  205. package/dist/css/containers.css +2 -1
  206. package/dist/css/copyable.css +2 -1
  207. package/dist/css/data-view.css +2 -1
  208. package/dist/css/date-pickers.css +2 -1
  209. package/dist/css/display.css +2 -1
  210. package/dist/css/dropdown-menu.css +2 -1
  211. package/dist/css/event-calendar.css +2 -1
  212. package/dist/css/feedback.css +2 -1
  213. package/dist/css/filters.css +2 -1
  214. package/dist/css/forms-numeric.css +2 -1
  215. package/dist/css/forms.css +2 -1
  216. package/dist/css/global-search.css +2 -1
  217. package/dist/css/header.css +2 -1
  218. package/dist/css/hover-card.css +2 -1
  219. package/dist/css/input-group.css +2 -1
  220. package/dist/css/item.css +2 -1
  221. package/dist/css/kanban.css +2 -1
  222. package/dist/css/label.css +2 -1
  223. package/dist/css/map.css +2 -1
  224. package/dist/css/media-library.css +2 -1
  225. package/dist/css/mentions.css +2 -1
  226. package/dist/css/menubar.css +2 -1
  227. package/dist/css/navigation-menu.css +2 -1
  228. package/dist/css/navigation.css +2 -1
  229. package/dist/css/navigation2.css +2 -1
  230. package/dist/css/onboarding.css +2 -1
  231. package/dist/css/otp-input.css +2 -1
  232. package/dist/css/overlay.css +2 -1
  233. package/dist/css/overlays.css +2 -1
  234. package/dist/css/page.css +2 -1
  235. package/dist/css/popover-menu.css +2 -1
  236. package/dist/css/popover.css +2 -1
  237. package/dist/css/primitives.css +2 -1
  238. package/dist/css/products.css +2 -1
  239. package/dist/css/qr-code.css +2 -1
  240. package/dist/css/repeaters.css +2 -1
  241. package/dist/css/resizable.css +2 -1
  242. package/dist/css/resource-assignment.css +2 -1
  243. package/dist/css/resource.css +2 -1
  244. package/dist/css/rich-text-editor.css +2 -1
  245. package/dist/css/schema-form.css +2 -1
  246. package/dist/css/sidebar.css +2 -1
  247. package/dist/css/sidebar2.css +2 -1
  248. package/dist/css/skeleton.css +2 -1
  249. package/dist/css/spinner.css +2 -1
  250. package/dist/css/structure.css +2 -1
  251. package/dist/css/sync.css +2 -1
  252. package/dist/css/table.css +2 -1
  253. package/dist/css/table2.css +2 -1
  254. package/dist/css/text-inputs.css +2 -1
  255. package/dist/css/theme-tweaker.css +2 -1
  256. package/dist/css/timeline.css +2 -1
  257. package/dist/css/timelines.css +2 -1
  258. package/dist/css/toaster.css +2 -1
  259. package/dist/css/toggle.css +2 -1
  260. package/dist/css/toolbar.css +2 -1
  261. package/dist/css/tooltip.css +2 -1
  262. package/dist/css/typography.css +2 -1
  263. package/dist/css/upload.css +2 -1
  264. package/dist/css/value-inputs.css +2 -1
  265. package/dist/css/workspace.css +2 -1
  266. package/dist/css-graph.json +1027 -0
  267. package/dist/date-pickers-C2HgjpFU.js +685 -0
  268. package/dist/{dialog-CtFCuTUF.js → dialog-0nRFg5Zs.js} +1 -1
  269. package/dist/display-BGN834xV.js +664 -0
  270. package/dist/dropdown-menu-Br8kvjrF.js +235 -0
  271. package/dist/empty.js +0 -0
  272. package/dist/features/actions.js +6 -6
  273. package/dist/features/activities.js +219 -216
  274. package/dist/features/ai-chat.js +593 -565
  275. package/dist/features/async-preview.js +105 -286
  276. package/dist/features/combobox.js +119 -117
  277. package/dist/features/comments.js +1 -1
  278. package/dist/features/data-view.js +56 -55
  279. package/dist/features/event-calendar.js +189 -185
  280. package/dist/features/filters.js +1 -1
  281. package/dist/features/global-search.js +259 -260
  282. package/dist/features/kanban.js +39 -37
  283. package/dist/features/map.js +357 -354
  284. package/dist/features/media-library.js +931 -931
  285. package/dist/features/mentions.js +1 -1
  286. package/dist/features/overlays.js +1 -1
  287. package/dist/features/products.js +950 -942
  288. package/dist/features/resource-assignment.js +39 -37
  289. package/dist/features/resource.js +70 -71
  290. package/dist/features/rich-text-editor.js +2 -2
  291. package/dist/features/schema-form.js +342 -338
  292. package/dist/features/sync.js +14 -12
  293. package/dist/features/table.js +1 -1
  294. package/dist/features/theme-tweaker.js +1002 -962
  295. package/dist/feedback-D4qVsKlD.js +430 -0
  296. package/dist/{filters-DOLKRSmb.js → filters-geLuSlFL.js} +386 -383
  297. package/dist/forms-NxbJK4Mh.js +250 -0
  298. package/dist/forms-numeric-C6NMdj6G.js +582 -0
  299. package/dist/index.js +2 -2
  300. package/dist/input-group-HS_Z0Ei_.js +119 -0
  301. package/dist/item-CuUJyETl.js +150 -0
  302. package/dist/{label-DumoMDm6.js → label-HOBXAscw.js} +7 -5
  303. package/dist/layout/app-shell.js +4 -2
  304. package/dist/layout/auth.js +102 -100
  305. package/dist/layout/header.js +190 -180
  306. package/dist/layout/navigation.js +1 -1
  307. package/dist/layout/page.js +18 -16
  308. package/dist/layout/settings.js +2 -2
  309. package/dist/layout/sidebar.js +43 -43
  310. package/dist/layout/workspace.js +71 -69
  311. package/dist/lib/action-presentation.d.ts +3 -3
  312. package/dist/lib/component-vocabulary.d.ts +2 -2
  313. package/dist/lib/css-length.d.ts +2 -0
  314. package/dist/lib/responsive.d.ts +1 -1
  315. package/dist/lib/theming/index.d.ts +1 -0
  316. package/dist/lib/theming/recipes.d.ts +2 -2
  317. package/dist/lib/theming/themes/dense.d.ts +3 -0
  318. package/dist/lib/theming/themes/editorial.d.ts +3 -0
  319. package/dist/lib/theming/themes/index.d.ts +8 -0
  320. package/dist/lib/theming/themes/pair.d.ts +7 -0
  321. package/dist/lib/theming/themes/sharp.d.ts +3 -0
  322. package/dist/lib/theming/themes/soft.d.ts +3 -0
  323. package/dist/lib/theming/themes/types.d.ts +12 -0
  324. package/dist/lib/ui-provider/index.d.ts +1 -1
  325. package/dist/lib/ui-provider/scope.d.ts +5 -8
  326. package/dist/lib/ui-provider/tokens.d.ts +11 -3
  327. package/dist/lib/ui-provider/tokens.generated.d.ts +6 -4
  328. package/dist/lib/ui-provider/types.d.ts +17 -19
  329. package/dist/{mentions-BbsEHlcH.js → mentions-oeYNv_j1.js} +113 -111
  330. package/dist/navigation-BTX5Ti0Z.js +622 -0
  331. package/dist/navigation-WYKjDhZq.js +216 -0
  332. package/dist/overlay-C8RAgi2_.js +356 -0
  333. package/dist/{overlays-DvVoS3td.js → overlays-9BxwFTou.js} +77 -75
  334. package/dist/popover-CA7SP_iz.js +127 -0
  335. package/dist/popover-menu-DcLeiw9r.js +192 -0
  336. package/dist/{primitives-D0bdDozz.js → primitives-BskKlf35.js} +181 -178
  337. package/dist/primitives.js +1 -1
  338. package/dist/profiles/admin.json +6 -36
  339. package/dist/profiles/general.json +6 -96
  340. package/dist/repeaters-DfptvbGA.js +445 -0
  341. package/dist/rich-text-editor-D_Ppm8yh.js +491 -0
  342. package/dist/{sheet-CKcmRbJ9.js → sheet-D-DVZH_b.js} +3 -3
  343. package/dist/sidebar-DXQOy_Cb.js +421 -0
  344. package/dist/skeleton-CubvHel9.js +173 -0
  345. package/dist/spinner-Tc1QCnxM.js +30 -0
  346. package/dist/{structure-D0WGQAP3.js → structure-B9Y5NkP_.js} +15 -22
  347. package/dist/style.css +1 -1
  348. package/dist/styles/TOKENS.md +115 -275
  349. package/dist/styles/animation.css +114 -0
  350. package/dist/styles/base.css +7 -6
  351. package/dist/styles/fields.css +45 -63
  352. package/dist/styles/focus.css +12 -0
  353. package/dist/styles/forced-colors.css +11 -10
  354. package/dist/styles/index.css +23 -30
  355. package/dist/styles/map.css +45 -34
  356. package/dist/styles/mentions.css +14 -52
  357. package/dist/styles/overlays.css +7 -7
  358. package/dist/styles/tailwind.css +76 -127
  359. package/dist/styles/targets.css +3 -3
  360. package/dist/styles/theme/colour.css +86 -0
  361. package/dist/styles/theme/density.css +31 -0
  362. package/dist/styles/theme/elevation.css +9 -0
  363. package/dist/styles/theme/layout.css +18 -0
  364. package/dist/styles/theme/motion.css +18 -0
  365. package/dist/styles/theme/shape.css +12 -0
  366. package/dist/styles/theme/size.css +10 -0
  367. package/dist/styles/theme/spacing.css +11 -0
  368. package/dist/styles/theme/typography.css +20 -0
  369. package/dist/styles/tone.css +61 -0
  370. package/dist/table-DT_20ity.js +1262 -0
  371. package/dist/table-Ds_eO9av.js +191 -0
  372. package/dist/tailwind.css +76 -127
  373. package/dist/text-inputs-BboE77nZ.js +395 -0
  374. package/dist/theming-C5ygF5uf.js +292 -0
  375. package/dist/theming.js +2 -2
  376. package/dist/{timeline-BdaGRyj-.js → timeline-BRZbSdhf.js} +57 -49
  377. package/dist/{timelines-BB7550mz.js → timelines-DczZKW5p.js} +69 -67
  378. package/dist/{toaster-bBMgXm8z.js → toaster-CXL8L7Mm.js} +106 -99
  379. package/dist/tokens.json +1027 -636
  380. package/dist/toolbar-DBK-c4yy.js +74 -0
  381. package/dist/tooltip-BPYP-jUm.js +76 -0
  382. package/dist/{typography-BkxEiwQ1.js → typography-DmeR05Er.js} +87 -53
  383. package/dist/{ui-provider-Cmoq6i_D.js → ui-provider-DpzLUD12.js} +117 -69
  384. package/dist/ui-provider.js +1 -1
  385. package/dist/upload-C_6mlbfl.js +968 -0
  386. package/dist/use-async-preview-BFwf9ElY.js +188 -0
  387. package/dist/value-inputs-CnO6RZeT.js +728 -0
  388. package/docs/README.md +2 -2
  389. package/docs/build/recipes.md +10992 -10628
  390. package/docs/generated/component-index.json +11133 -11624
  391. package/docs/generated/components/INDEX.md +5 -5
  392. package/docs/generated/components/base--accordion.md +51 -2
  393. package/docs/generated/components/base--action-menu.md +14 -15
  394. package/docs/generated/components/base--alert-dialog.md +3 -4
  395. package/docs/generated/components/base--aspect-ratio.md +3 -4
  396. package/docs/generated/components/base--avatar.md +7 -7
  397. package/docs/generated/components/base--badge.md +159 -27
  398. package/docs/generated/components/base--batch-action-bar.md +6 -7
  399. package/docs/generated/components/base--buttons.md +151 -47
  400. package/docs/generated/components/base--cards.md +107 -14
  401. package/docs/generated/components/base--carousel.md +1 -2
  402. package/docs/generated/components/base--chart.md +44 -8
  403. package/docs/generated/components/base--choice-inputs.md +10 -11
  404. package/docs/generated/components/base--combobox.md +3 -4
  405. package/docs/generated/components/base--command.md +6 -6
  406. package/docs/generated/components/base--context-menu.md +1 -2
  407. package/docs/generated/components/base--copyable.md +6 -7
  408. package/docs/generated/components/base--date-pickers.md +6 -7
  409. package/docs/generated/components/base--dialog.md +6 -7
  410. package/docs/generated/components/base--direction.md +1 -1
  411. package/docs/generated/components/base--display.md +234 -54
  412. package/docs/generated/components/base--dropdown-menu.md +6 -7
  413. package/docs/generated/components/base--feedback.md +71 -18
  414. package/docs/generated/components/base--forms-numeric.md +6 -7
  415. package/docs/generated/components/base--forms.md +12 -13
  416. package/docs/generated/components/base--hover-card.md +3 -4
  417. package/docs/generated/components/base--input-group.md +27 -30
  418. package/docs/generated/components/base--item.md +8 -9
  419. package/docs/generated/components/base--label.md +2 -3
  420. package/docs/generated/components/base--menubar.md +2 -4
  421. package/docs/generated/components/base--navigation-menu.md +2 -3
  422. package/docs/generated/components/base--navigation.md +2 -3
  423. package/docs/generated/components/base--otp-input.md +3 -4
  424. package/docs/generated/components/base--overlay.md +56 -47
  425. package/docs/generated/components/base--popover-menu.md +7 -8
  426. package/docs/generated/components/base--popover.md +9 -10
  427. package/docs/generated/components/base--qr-code.md +7 -8
  428. package/docs/generated/components/base--repeaters.md +6 -7
  429. package/docs/generated/components/base--resizable.md +2 -3
  430. package/docs/generated/components/base--sheet.md +12 -13
  431. package/docs/generated/components/base--sidebar.md +9 -11
  432. package/docs/generated/components/base--skeleton.md +6 -7
  433. package/docs/generated/components/base--slot.md +1 -1
  434. package/docs/generated/components/base--spinner.md +5 -7
  435. package/docs/generated/components/base--structure.md +264 -65
  436. package/docs/generated/components/base--table.md +61 -3
  437. package/docs/generated/components/base--text-inputs.md +17 -18
  438. package/docs/generated/components/base--timeline.md +45 -4
  439. package/docs/generated/components/base--toaster.md +43 -12
  440. package/docs/generated/components/base--toggle.md +11 -12
  441. package/docs/generated/components/base--toolbar.md +7 -8
  442. package/docs/generated/components/base--tooltip.md +5 -6
  443. package/docs/generated/components/base--typography.md +279 -32
  444. package/docs/generated/components/base--upload.md +8 -9
  445. package/docs/generated/components/base--value-inputs.md +9 -38
  446. package/docs/generated/components/{admin--patterns--access.md → blocks--admin--access.md} +5 -6
  447. package/docs/generated/components/{admin--patterns--commerce.md → blocks--admin--commerce.md} +40 -41
  448. package/docs/generated/components/{patterns--analytics.md → blocks--analytics.md} +13 -14
  449. package/docs/generated/components/{patterns--onboarding.md → blocks--onboarding.md} +6 -7
  450. package/docs/generated/components/{patterns--timelines.md → blocks--timelines.md} +6 -7
  451. package/docs/generated/components/features--actions.md +8 -18
  452. package/docs/generated/components/features--activities.md +31 -32
  453. package/docs/generated/components/features--ai-chat.md +15 -15
  454. package/docs/generated/components/features--async-preview.md +5 -6
  455. package/docs/generated/components/features--combobox.md +4 -5
  456. package/docs/generated/components/features--comments.md +0 -1
  457. package/docs/generated/components/features--data-view.md +4 -5
  458. package/docs/generated/components/features--event-calendar.md +1 -2
  459. package/docs/generated/components/features--filters.md +1 -2
  460. package/docs/generated/components/features--global-search.md +1 -2
  461. package/docs/generated/components/features--kanban.md +1 -2
  462. package/docs/generated/components/features--map.md +1 -2
  463. package/docs/generated/components/features--media-library.md +37 -38
  464. package/docs/generated/components/features--mentions.md +7 -7
  465. package/docs/generated/components/features--overlays.md +21 -22
  466. package/docs/generated/components/features--products.md +10 -11
  467. package/docs/generated/components/features--resource-assignment.md +2 -3
  468. package/docs/generated/components/features--resource.md +3 -4
  469. package/docs/generated/components/features--rich-text-editor.md +4 -13
  470. package/docs/generated/components/features--schema-form.md +1 -2
  471. package/docs/generated/components/features--sync.md +2 -3
  472. package/docs/generated/components/features--table.md +162 -12
  473. package/docs/generated/components/features--theme-tweaker.md +30 -15
  474. package/docs/generated/components/forms.md +2 -2
  475. package/docs/generated/components/layout--app-shell.md +10 -11
  476. package/docs/generated/components/layout--auth.md +8 -9
  477. package/docs/generated/components/layout--containers.md +0 -1
  478. package/docs/generated/components/layout--header.md +2 -3
  479. package/docs/generated/components/layout--navigation.md +0 -1
  480. package/docs/generated/components/layout--page.md +3 -4
  481. package/docs/generated/components/layout--settings.md +0 -1
  482. package/docs/generated/components/layout--sidebar.md +6 -7
  483. package/docs/generated/components/layout--workspace.md +3 -4
  484. package/docs/generated/components/primitives.md +128 -17
  485. package/docs/generated/components/theming.md +147 -4
  486. package/docs/generated/components/ui-provider.md +95 -77
  487. package/docs/generated/imports.md +104 -104
  488. package/docs/generated/migration-broad-imports.json +267 -90
  489. package/docs/generated/migration-broad-imports.md +266 -101
  490. package/docs/generated/migration-codemod.json +365 -70
  491. package/docs/generated/migration.md +665 -95
  492. package/docs/generated/profiles.md +27 -27
  493. package/docs/generated/public-api.md +104 -102
  494. package/docs/generated/recipes.json +585 -810
  495. package/docs/learn/api-compatibility.md +3 -3
  496. package/docs/learn/composition.md +2 -18
  497. package/docs/learn/framework-wiring.md +8 -8
  498. package/docs/learn/installation.md +55 -27
  499. package/docs/learn/migration.md +136 -5
  500. package/docs/learn/provider-and-scoping.md +13 -19
  501. package/docs/learn/theming.md +170 -131
  502. package/docs/learn/troubleshooting.md +62 -27
  503. package/docs/learn/verification.md +2 -3
  504. package/package.json +39 -473
  505. package/scripts/consumer/codemod.mjs +51 -12
  506. package/scripts/consumer/find-component.mjs +2 -4
  507. package/src/styles/TOKENS.md +115 -275
  508. package/dist/accordion-6YPJ9XRO.js +0 -135
  509. package/dist/admin/patterns/access.css +0 -15
  510. package/dist/admin/patterns/commerce.css +0 -29
  511. package/dist/admin/patterns/commerce.js +0 -2493
  512. package/dist/avatar-CS7zow2q.js +0 -85
  513. package/dist/badge-CxOuTfVr.js +0 -63
  514. package/dist/base/accordion.css +0 -3
  515. package/dist/base/action-menu.css +0 -6
  516. package/dist/base/alert-dialog.css +0 -4
  517. package/dist/base/aspect-ratio.css +0 -2
  518. package/dist/base/avatar.css +0 -4
  519. package/dist/base/badge.css +0 -2
  520. package/dist/base/batch-action-bar.css +0 -5
  521. package/dist/base/buttons.css +0 -4
  522. package/dist/base/cards.css +0 -13
  523. package/dist/base/carousel.css +0 -5
  524. package/dist/base/chart.css +0 -2
  525. package/dist/base/choice-inputs.css +0 -10
  526. package/dist/base/combobox.css +0 -3
  527. package/dist/base/command.css +0 -9
  528. package/dist/base/context-menu.css +0 -2
  529. package/dist/base/copyable.css +0 -6
  530. package/dist/base/date-pickers.css +0 -11
  531. package/dist/base/dialog.css +0 -4
  532. package/dist/base/display.css +0 -8
  533. package/dist/base/dropdown-menu.css +0 -2
  534. package/dist/base/feedback.css +0 -5
  535. package/dist/base/forms-numeric.css +0 -12
  536. package/dist/base/forms.css +0 -14
  537. package/dist/base/hover-card.css +0 -2
  538. package/dist/base/input-group.css +0 -6
  539. package/dist/base/item.css +0 -9
  540. package/dist/base/label.css +0 -3
  541. package/dist/base/menubar.css +0 -2
  542. package/dist/base/navigation-menu.css +0 -2
  543. package/dist/base/navigation.css +0 -12
  544. package/dist/base/otp-input.css +0 -9
  545. package/dist/base/overlay.css +0 -4
  546. package/dist/base/popover-menu.css +0 -11
  547. package/dist/base/popover.css +0 -3
  548. package/dist/base/qr-code.css +0 -2
  549. package/dist/base/repeaters.css +0 -18
  550. package/dist/base/resizable.css +0 -2
  551. package/dist/base/sheet.css +0 -4
  552. package/dist/base/sidebar.css +0 -12
  553. package/dist/base/skeleton.css +0 -9
  554. package/dist/base/spinner.css +0 -2
  555. package/dist/base/structure.css +0 -2
  556. package/dist/base/table.css +0 -3
  557. package/dist/base/text-inputs.css +0 -2
  558. package/dist/base/timeline.css +0 -9
  559. package/dist/base/toaster.css +0 -2
  560. package/dist/base/toggle.css +0 -2
  561. package/dist/base/toolbar.css +0 -5
  562. package/dist/base/tooltip.css +0 -2
  563. package/dist/base/typography.css +0 -2
  564. package/dist/base/upload.css +0 -10
  565. package/dist/base/value-inputs.css +0 -14
  566. package/dist/buttons-CqXKWty3.js +0 -179
  567. package/dist/cards-C6Ulbkw7.js +0 -271
  568. package/dist/chart-nomhJ87z.js +0 -193
  569. package/dist/choice-inputs-OUDn0kQw.js +0 -680
  570. package/dist/combobox-C8oP92bT.js +0 -266
  571. package/dist/command-Bp3B6pUu.js +0 -143
  572. package/dist/comments-CAnDlyXO.js +0 -1438
  573. package/dist/components/admin/patterns/index.d.ts +0 -2
  574. package/dist/components/features/rich-text-editor/exec-command-engine.d.ts +0 -2
  575. package/dist/components/patterns/index.d.ts +0 -3
  576. package/dist/css/styles.css +0 -1
  577. package/dist/date-pickers-DOwIT-Nk.js +0 -661
  578. package/dist/display-B3Q17h5z.js +0 -645
  579. package/dist/dropdown-menu-TyNLCLML.js +0 -223
  580. package/dist/features/actions.css +0 -11
  581. package/dist/features/activities.css +0 -25
  582. package/dist/features/ai-chat.css +0 -14
  583. package/dist/features/async-preview.css +0 -10
  584. package/dist/features/combobox.css +0 -12
  585. package/dist/features/comments.css +0 -24
  586. package/dist/features/data-view.css +0 -31
  587. package/dist/features/event-calendar.css +0 -17
  588. package/dist/features/filters.css +0 -24
  589. package/dist/features/global-search.css +0 -19
  590. package/dist/features/kanban.css +0 -7
  591. package/dist/features/map.css +0 -15
  592. package/dist/features/media-library.css +0 -27
  593. package/dist/features/mentions.css +0 -17
  594. package/dist/features/overlays.css +0 -11
  595. package/dist/features/products.css +0 -29
  596. package/dist/features/resource-assignment.css +0 -14
  597. package/dist/features/resource.css +0 -15
  598. package/dist/features/rich-text-editor.css +0 -8
  599. package/dist/features/schema-form.css +0 -22
  600. package/dist/features/sync.css +0 -11
  601. package/dist/features/table.css +0 -20
  602. package/dist/features/theme-tweaker.css +0 -27
  603. package/dist/feedback-DRerHGuV.js +0 -469
  604. package/dist/forms-CPrGGif_.js +0 -242
  605. package/dist/forms-numeric-CPVsL7Vf.js +0 -569
  606. package/dist/index.css +0 -3
  607. package/dist/input-group-BYe0rhoB.js +0 -126
  608. package/dist/item-B3yQ26as.js +0 -146
  609. package/dist/layout/app-shell.css +0 -13
  610. package/dist/layout/auth.css +0 -14
  611. package/dist/layout/containers.css +0 -2
  612. package/dist/layout/header.css +0 -20
  613. package/dist/layout/navigation.css +0 -11
  614. package/dist/layout/page.css +0 -15
  615. package/dist/layout/settings.css +0 -16
  616. package/dist/layout/sidebar.css +0 -16
  617. package/dist/layout/workspace.css +0 -15
  618. package/dist/navigation-CsqTA16F.js +0 -614
  619. package/dist/navigation-DzxzPuwg.js +0 -202
  620. package/dist/overlay-WQOsLd69.js +0 -345
  621. package/dist/patterns/analytics.css +0 -15
  622. package/dist/patterns/onboarding.css +0 -11
  623. package/dist/patterns/timelines.css +0 -11
  624. package/dist/popover-DriLnIFc.js +0 -123
  625. package/dist/popover-menu-C2UCMAe7.js +0 -189
  626. package/dist/primitives.css +0 -3
  627. package/dist/repeaters-DuP1N0nw.js +0 -438
  628. package/dist/rich-text-editor-BQXFe9oN.js +0 -595
  629. package/dist/sidebar-D0N6ckJL.js +0 -412
  630. package/dist/skeleton-DGR9df28.js +0 -172
  631. package/dist/spinner-CUAVFecI.js +0 -52
  632. package/dist/styles/FACTORS.md +0 -36
  633. package/dist/styles/SCOPES.md +0 -86
  634. package/dist/styles/themes/default.css +0 -164
  635. package/dist/styles/theming/animation.css +0 -143
  636. package/dist/styles/theming/colors.css +0 -97
  637. package/dist/styles/theming/feedback.css +0 -17
  638. package/dist/styles/theming/field.css +0 -21
  639. package/dist/styles/theming/focus.css +0 -88
  640. package/dist/styles/theming/layers.css +0 -13
  641. package/dist/styles/theming/layout.css +0 -21
  642. package/dist/styles/theming/motion.css +0 -42
  643. package/dist/styles/theming/overlay.css +0 -52
  644. package/dist/styles/theming/sizing.css +0 -118
  645. package/dist/styles/theming/text.css +0 -30
  646. package/dist/styles/theming/typography.css +0 -26
  647. package/dist/styles/tokens/components.css +0 -22
  648. package/dist/styles/tokens/foundation.css +0 -80
  649. package/dist/styles/tokens/layout.css +0 -19
  650. package/dist/styles/tokens/palette.css +0 -88
  651. package/dist/styles/tokens/primitives.css +0 -18
  652. package/dist/styles/tokens/states.css +0 -77
  653. package/dist/table-BC4qqsUb.js +0 -180
  654. package/dist/table-BHDpjajL.js +0 -982
  655. package/dist/text-inputs-DF_lD7pA.js +0 -385
  656. package/dist/theming-D6KRU7hO.js +0 -104
  657. package/dist/toolbar-DWRywF0R.js +0 -68
  658. package/dist/tooltip-t1VQQ2tZ.js +0 -73
  659. package/dist/upload-B38YZeFJ.js +0 -938
  660. package/dist/value-inputs-Q4ymjXlV.js +0 -716
  661. package/src/styles/FACTORS.md +0 -36
  662. package/src/styles/SCOPES.md +0 -86
  663. /package/dist/components/{admin/patterns → blocks/admin}/access/admin.strings.d.ts +0 -0
  664. /package/dist/components/{admin/patterns → blocks/admin}/access/credential-list.d.ts +0 -0
  665. /package/dist/components/{admin/patterns → blocks/admin}/access/index.d.ts +0 -0
  666. /package/dist/components/{admin/patterns → blocks/admin}/access/role-permissions.d.ts +0 -0
  667. /package/dist/components/{admin/patterns → blocks/admin}/access/sensitive-action.d.ts +0 -0
  668. /package/dist/components/{admin/patterns → blocks/admin}/commerce/account.d.ts +0 -0
  669. /package/dist/components/{admin/patterns → blocks/admin}/commerce/address-lines.d.ts +0 -0
  670. /package/dist/components/{admin/patterns → blocks/admin}/commerce/booking.d.ts +0 -0
  671. /package/dist/components/{admin/patterns → blocks/admin}/commerce/cart.d.ts +0 -0
  672. /package/dist/components/{admin/patterns → blocks/admin}/commerce/commerce.strings.d.ts +0 -0
  673. /package/dist/components/{admin/patterns → blocks/admin}/commerce/commerce.types.d.ts +0 -0
  674. /package/dist/components/{admin/patterns → blocks/admin}/commerce/format-amount.d.ts +0 -0
  675. /package/dist/components/{admin/patterns → blocks/admin}/commerce/index.d.ts +0 -0
  676. /package/dist/components/{admin/patterns → blocks/admin}/commerce/inventory-section.d.ts +0 -0
  677. /package/dist/components/{admin/patterns → blocks/admin}/commerce/invoice.d.ts +0 -0
  678. /package/dist/components/{admin/patterns → blocks/admin}/commerce/loyalty.d.ts +0 -0
  679. /package/dist/components/{admin/patterns → blocks/admin}/commerce/order-customer.d.ts +0 -0
  680. /package/dist/components/{admin/patterns → blocks/admin}/commerce/order-detail.d.ts +0 -0
  681. /package/dist/components/{admin/patterns → blocks/admin}/commerce/order-line-item.d.ts +0 -0
  682. /package/dist/components/{admin/patterns → blocks/admin}/commerce/order-transactions.d.ts +0 -0
  683. /package/dist/components/{admin/patterns → blocks/admin}/commerce/order.d.ts +0 -0
  684. /package/dist/components/{admin/patterns → blocks/admin}/commerce/seo-listing.d.ts +0 -0
  685. /package/dist/components/{admin/patterns → blocks/admin}/commerce/seo-score.d.ts +0 -0
  686. /package/dist/components/{admin/patterns → blocks/admin}/commerce/summary-panel.d.ts +0 -0
  687. /package/dist/components/{patterns → blocks}/analytics/activity-heatmap.d.ts +0 -0
  688. /package/dist/components/{patterns → blocks}/analytics/analytics.types.d.ts +0 -0
  689. /package/dist/components/{patterns → blocks}/analytics/chart-card.d.ts +0 -0
  690. /package/dist/components/{patterns → blocks}/analytics/format-metric-value.d.ts +0 -0
  691. /package/dist/components/{patterns → blocks}/analytics/index.d.ts +0 -0
  692. /package/dist/components/{patterns → blocks}/analytics/metric-bar.d.ts +0 -0
  693. /package/dist/components/{patterns → blocks}/analytics/metric-comparison.d.ts +0 -0
  694. /package/dist/components/{patterns → blocks}/analytics/metric-gradient.d.ts +0 -0
  695. /package/dist/components/{patterns → blocks}/analytics/metric-grid.d.ts +0 -0
  696. /package/dist/components/{patterns → blocks}/analytics/metric-micro-grid.d.ts +0 -0
  697. /package/dist/components/{patterns → blocks}/analytics/metric-skeleton.d.ts +0 -0
  698. /package/dist/components/{patterns → blocks}/analytics/metric-trend-chip.d.ts +0 -0
  699. /package/dist/components/{patterns → blocks}/analytics/metric.d.ts +0 -0
  700. /package/dist/components/{patterns → blocks}/analytics/time-ruler.d.ts +0 -0
  701. /package/dist/components/{patterns → blocks}/onboarding/checklist.d.ts +0 -0
  702. /package/dist/components/{patterns → blocks}/onboarding/index.d.ts +0 -0
  703. /package/dist/components/{patterns → blocks}/onboarding/onboarding.strings.d.ts +0 -0
  704. /package/dist/components/{patterns → blocks}/timelines/changelog-timeline.d.ts +0 -0
  705. /package/dist/components/{patterns → blocks}/timelines/index.d.ts +0 -0
  706. /package/dist/components/{patterns → blocks}/timelines/milestones-timeline.d.ts +0 -0
  707. /package/dist/components/{patterns → blocks}/timelines/steps.d.ts +0 -0
  708. /package/dist/components/{patterns → blocks}/timelines/timelines.strings.d.ts +0 -0
  709. /package/dist/styles/{theming/breakpoints.css → breakpoints.css} +0 -0
@@ -1,146 +1,188 @@
1
1
  # Theming
2
2
 
3
- A theme sets the **global contract** and stops there. Most rebrands begin with the palette,
4
- semantic colours, radii and shadows of the default theme; the contract also covers type,
5
- spacing, motion, focus and layering. `src/styles/TOKENS.md` (`node_modules/themelia-ui/src/styles/TOKENS.md`)
6
- names the token for each role.
7
-
8
- Component tokens are not the theming surface: most are a `var()` off the contract, and the
9
- rest is geometry no theme would touch. Override one only where a module reference names it
10
- as an extension point.
3
+ The theme is about eighty variables, declared once at `:root` in `src/styles/theme/`. Each
4
+ colour holds both modes as `light-dark(light, dark)`, and every length, shadow, tint and
5
+ duration comes as a pair. Components derive everything else where they use it, so a value
6
+ you set anywhere reaches every component below it. `src/styles/TOKENS.md` (`node_modules/themelia-ui/src/styles/TOKENS.md`)
7
+ names the variable for each role.
11
8
 
12
9
  ## Setting a theme
13
10
 
14
- Where an override has to be declared depends on the kind of token.
15
-
16
- A **raw input** (`--radius`, `--radius-sm`, a font stack, a palette step, a scale factor) is
17
- declared once at `:root` and inherits everywhere. The semantic colours resolve through the
18
- palette (`--primary` is `--brand-600` in light and `--brand-350` in dark), so a rebrand that
19
- sets palette steps reaches every scope:
11
+ Set the variables you change on `:root`. A colour takes a `light-dark()` pair, or one value
12
+ for both modes:
20
13
 
21
14
  ```css
22
15
  :root {
23
- --brand-600: oklch(0.55 0.19 250);
24
- --brand-350: oklch(0.72 0.14 250);
25
- --radius: 1rem;
26
- --radius-sm: 0.5rem;
16
+ --primary: light-dark(oklch(0.55 0.19 250), oklch(0.72 0.14 250));
17
+ --primary-foreground: light-dark(oklch(0.985 0 0), oklch(0.2 0.03 250));
18
+ --radius: 0.75rem;
19
+ --radius-sm: 0.375rem;
20
+ --font-sans: "Your interface font", sans-serif;
27
21
  }
28
22
  ```
29
23
 
30
- A **semantic** token (`--primary`, `--background`, `--border`) is declared again at every
31
- scope boundary: `:root`, `[data-ui-scope]`, `[data-density]`, `[data-theme]`, `.light` and
32
- `.dark`. Every provider renders a boundary, so a semantic set on `:root` alone stops at the
33
- first one. Declare it at the same list, which reaches every scope and the popups portalled to
34
- `<body>`:
24
+ That one block reaches every region, including popups portalled to `<body>` and a dark
25
+ region inside a light page: nothing below `:root` declares a colour again.
26
+
27
+ The same values work on any element, for a region of their own:
35
28
 
36
29
  ```css
37
- :root, [data-ui-scope], [data-density], [data-theme], .light, .dark {
38
- --primary: oklch(0.55 0.19 250);
30
+ .marketing {
31
+ --primary: oklch(0.6 0.2 30);
39
32
  }
40
33
  ```
41
34
 
42
- That rule applies in light and dark alike. For a separate dark value, follow it with a rule
43
- on the dark selectors shown in `SCOPES.md` (`node_modules/themelia-ui/src/styles/SCOPES.md`).
35
+ A provider takes them as config and writes them on its own element:
36
+
37
+ ```tsx fragment — shape only, not a program
38
+ <UIProvider config={{ theme: { colors: { primary: "light-dark(#2563eb, #60a5fa)" } } }}>
39
+ ```
40
+
41
+ Colours passed this way reach the provider's subtree. A popup portalled to `<body>` leaves
42
+ that subtree; render it into the provider with `UIPortalHost` (see
43
+ [Provider and scoping](provider-and-scoping.md#portals-and-scopes)), or set the value on
44
+ `:root` instead.
44
45
 
45
- A provider takes the same values as config and writes them on its own element:
46
+ ## Ready-made themes
47
+
48
+ Four themes ship with the kit, each a style rather than a colour: Soft (large corners,
49
+ diffuse shadows, comfortable spacing), Sharp (square corners, hairlines, no shadows), Dense
50
+ (compact spacing and small corners, for data) and Editorial (serif headings on warm paper, a
51
+ step larger type). Each is a `ThemePreset`: a `label`, a `description`, and the provider
52
+ `config` it sets. That config reaches past colour to radii, shadows and border weight, density,
53
+ typography, motion and component defaults, such as the card surface. Every theme's colours
54
+ hold WCAG AA contrast in both modes, as the kit's own do.
46
55
 
47
56
  ```tsx fragment — shape only, not a program
48
- <UIProvider config={{ theme: { colors: { primary: "oklch(0.55 0.19 250)" } } }}>
57
+ import { themes } from "themelia-ui/theming"
58
+
59
+ <UIProvider config={themes.sharp.config}>
60
+ ```
61
+
62
+ Switching themes is handing the provider another theme's config. Keep the choice in state,
63
+ and wrap the application in `UIPortalHost`, so menus and popovers, which portal to `<body>`,
64
+ take the theme too:
65
+
66
+ ```tsx fragment — shape only, not a program
67
+ const [name, setName] = useState<ThemeName>("soft")
68
+
69
+ <UIProvider config={themes[name].config}>
70
+ <UIPortalHost>
71
+ <App onThemeChange={setName} />
72
+ </UIPortalHost>
73
+ </UIProvider>
49
74
  ```
50
75
 
51
- Colours passed this way reach the provider's subtree down to the next boundary: a nested
52
- provider, `Scope` or `data-density` region declares the kit's colours again, and popups
53
- portalled outside the provider never see them. `theme.palette` reaches every boundary inside
54
- the provider, because each one derives its colours from the palette.
76
+ A nested provider themes one region the same way. Settings of your own go beside a theme's:
77
+ `config={{ ...themes.dense.config, formatting: { locale: "de-DE" } }}`.
55
78
 
56
- For a subtree, use a scope boundary rather than a bare element; see
57
- [Provider and scoping](provider-and-scoping.md#scope--tokens-only). Derived tokens resolve
58
- **where they are declared**, so a variable set on an element that is not a boundary is set
59
- and never read.
79
+ A theme of your own is the same shape. Start from one of these and change what you need:
80
+
81
+ ```tsx fragment — shape only, not a program
82
+ const brand: ThemePreset = {
83
+ label: "Brand",
84
+ description: "Our product's look.",
85
+ config: {
86
+ ...themes.sharp.config,
87
+ density: "comfortable",
88
+ theme: {
89
+ ...themes.sharp.config.theme,
90
+ colors: {
91
+ ...themes.sharp.config.theme?.colors,
92
+ primary: "light-dark(oklch(0.5 0.19 15), oklch(0.76 0.13 15))",
93
+ "primary-foreground": "light-dark(oklch(0.985 0 0), oklch(0.2 0.05 15))",
94
+ },
95
+ },
96
+ },
97
+ }
98
+ ```
99
+
100
+ A square theme should set `defaults.card.surface` to `"card"`: the default `framed` surface is
101
+ a band that follows the corner, and with no corner to follow it reads as a box in a box. Write
102
+ a zero radius as `0px`: the kit subtracts lengths from the radii, and `calc()` cannot subtract
103
+ a length from a bare `0`. Write no shadow as `0 0 transparent`, not `none`: a popup lists
104
+ `--shadow-lg` after its hairline, and `none` cannot stand in a list, so the popup would lose
105
+ its edge.
106
+
107
+ To edit a theme's colours and variables visually, load them into the theme editor with
108
+ `themeFromConfig(themes.soft.config.theme)` from `themelia-ui/features/theme-tweaker`; the
109
+ editor exports the result as CSS or provider config.
60
110
 
61
111
  ## Start with the shared controls
62
112
 
63
- Most layout adjustments need only the surface insets, row insets, density factor, font
64
- family and the two radii. They follow a component's role rather than its name:
113
+ Most adjustments need only these, and they follow a component's role rather than its name:
65
114
 
66
115
  ```css
67
116
  :root {
68
- --surface-x: 1.25rem;
69
- --surface-y: 1rem;
70
- --row-x: 0.75rem;
71
- --row-y: 0.5rem;
72
- --font-sans: "Your interface font", sans-serif;
73
- --radius: 0.75rem; /* containers */
74
- --radius-sm: 0.375rem; /* what sits inside them — set both, nothing derives it */
117
+ --padding: 1.25rem; /* container insets: cards, dialogs, sheets, popovers */
118
+ --padding-sm: 0.625rem; /* item insets: rows, cells, chips, fields */
119
+ --gap: 1.25rem; /* between groups: fields, cards, sections */
120
+ --gap-sm: 0.625rem; /* inside a group: icon and label, title and description */
121
+ --control-height: 2.25rem;
122
+ --radius: 0.75rem; /* containers */
123
+ --radius-sm: 0.375rem; /* what sits inside them; nothing derives one from the other */
75
124
  }
76
125
  ```
77
126
 
78
- - Cards, framed ContentBlocks and overlay bodies share the surface X/Y insets.
79
- - Overlay headers and footers use the same horizontal inset and 75% of the vertical inset;
80
- the header adds a small optical inset above its title.
81
- - Menus and option lists inset their rows by `--space-md`, the difference between the two
82
- radii, so rows sit concentric.
83
- - Dark mode inherits the chosen fonts.
127
+ - A nested corner is the container's radius less its inset, computed where it is used, so
128
+ menus and option lists keep their rows concentric at any radius.
129
+ - A density preset sets the four lengths and the two control heights on its region (see
130
+ [Scale and density](#scale-and-density)); a value you set on `:root` applies where no preset
131
+ is in effect.
84
132
 
85
133
  **Fonts.** The kit ships Geist for text and Geist Mono for code and identifiers (SIL OFL 1.1),
86
134
  as variable-weight woff2 files beside `core.css`, one per script. A browser downloads a file
87
135
  only when text in that script renders in that family, so a theme that sets `--font-sans` and
88
- `--font-mono` to its own fonts downloads none of them.
136
+ `--font-mono` to its own fonts downloads none of them. `--font-heading` is unset by default,
137
+ and headings fall back to the interface font.
89
138
 
90
139
  Compose title and description regions with CardHeader, ContentBlock or OverlayHeader, action
91
140
  regions with CardFooter or OverlayFooter, and label/value facts with MetadataList. These
92
141
  components own their spacing, so the application does not reproduce it.
93
- `--content-block-p` and `--overlay-region-p` override one surface's inset locally; leave them
94
- unset so the surface follows the theme.
95
142
 
96
- ## Scale
143
+ ## Scale and density
97
144
 
98
- Three factors, and no per-module ones:
145
+ Controls take two sizes, `default` and `sm`. A denser or roomier region is a scope instead,
146
+ so everything inside it moves together:
99
147
 
100
- | Factor | Multiplies |
101
- |---|---|
102
- | `--scale` | everything; the other two default to it |
103
- | `--density-scale` | spacing, control heights and row rhythm, rounded to whole pixels |
104
- | `--text-scale` | the type scale, control labels included |
148
+ | Setting | Moves |
149
+ | --- | --- |
150
+ | `density` | the four lengths and the two control heights; type keeps its size |
151
+ | `scale` | the same, the two icon sizes, and type |
152
+ | `typography.scale` | type alone, through `--text-scale` |
105
153
 
106
- Setting `--scale` alone moves the whole system. `UIProvider`'s `typography.scale` sets
107
- `--text-scale` for a scope without changing its geometry.
108
- `src/styles/FACTORS.md` (`node_modules/themelia-ui/src/styles/FACTORS.md`) is the reference.
109
-
110
- Named `density` presets set only `--density-scale`, so compact and comfortable regions
111
- change spacing, control heights and row rhythm without resizing readable type. Controls are
112
- 34, 30 and 24px at the default and 32, 28 and 23px under `compact`. Use `scale` when the
113
- whole scoped UI should move together.
154
+ ```tsx fragment — shape only, not a program
155
+ <UIProvider config={{ density: "compact" }}>
156
+ <UIProvider config={{ scale: 1.125 }}>
157
+ <UIProvider config={{ typography: { scale: 0.875 } }}>
158
+ ```
114
159
 
115
- All three are raw inputs: set them on `:root`, with a `density` preset, or on a boundary such
116
- as [`Scope`](provider-and-scoping.md#scope--tokens-only). On a plain nested element nothing
117
- re-derives from them.
160
+ The provider computes `scale` in JavaScript and writes the lengths themselves, rounded to
161
+ whole pixels, so no length is multiplied twice. A density preset also works without a
162
+ provider: any element can carry `data-density="compact"` or `"comfortable"`.
118
163
 
119
- A single module cannot be scaled on its own; scale a region with a scope instead, and use the
120
- three factors rather than reconstructing component calculations.
164
+ A preset sets its lengths on the region. To change a length under one preset, set it for
165
+ that preset: `[data-density="compact"] { --padding: 0.625rem; }`.
121
166
 
122
167
  ## Dark mode
123
168
 
124
- The kit answers three signals: a `.dark` class, `data-theme="dark"`, and
125
- `prefers-color-scheme: dark` when no explicit scheme is set. A dark-only override should
126
- answer all three, because an app that toggles a class and an app that sets an attribute are
127
- both normal. Use the selectors in `SCOPES.md` (`node_modules/themelia-ui/src/styles/SCOPES.md`), which also reach
128
- the bare boundaries nested under a dark ancestor.
129
-
130
- A bare boundary under an explicit dark ancestor (a `Scope`, a `data-density` region, or a
131
- nested provider on the default `system` scheme) resolves the dark values. An explicit light
132
- island inside a dark tree keeps its own boundary light, but a bare boundary inside that
133
- island resolves dark again; give it its own `data-theme`, or use `UIScope`, which writes the
134
- resolved scheme on each boundary it renders.
169
+ Colours switch through `color-scheme`, which the kit sets from three signals: a `.dark` or
170
+ `.light` class, `data-theme="dark"` or `"light"`, and, with neither, the operating system's
171
+ preference. Each colour's `light-dark()` pair resolves on the element that paints it, so a
172
+ dark region inside a light page needs only `data-theme="dark"` (or a nested provider with
173
+ `colorScheme: "dark"`) on its container, and a light island inside a dark page the same.
135
174
 
136
- In CSS Modules, `.dark` is hashed like any other class. Write a dark rule as
137
- `:global(.dark)`, or it matches nothing and the theme silently does not apply.
175
+ A value of your own switches the same way: write `light-dark()` in the value, never a rule
176
+ under `.dark` or `@media (prefers-color-scheme: dark)`, which would miss a dark region inside
177
+ a light page.
138
178
 
139
179
  ## Editing a theme at runtime
140
180
 
141
181
  `ThemeTweaker` (`themelia-ui/features/theme-tweaker`) lets people change appearance, accent
142
182
  colour, density, corners and font while the app runs, and exports CSS theme values and
143
183
  provider configuration separately. Mount it as a floating button, a full-page route, or both.
184
+ The exported stylesheet is one `:root` block in which each colour it changed is a
185
+ `light-dark()` pair.
144
186
 
145
187
  The application owns the theme and provider state, above its router:
146
188
 
@@ -155,7 +197,6 @@ import { UIProvider, type UIConfig } from "themelia-ui/ui-provider"
155
197
  import {
156
198
  ThemeTweaker, createTheme, themeToStyle, useAppliedTheme, type ThemeDefinition,
157
199
  } from "themelia-ui/features/theme-tweaker"
158
- import "themelia-ui/features/theme-tweaker.css"
159
200
 
160
201
  export function ThemedApp({ children }: { children: ReactNode }) {
161
202
  const [theme, setTheme] = useState<ThemeDefinition>(() => createTheme())
@@ -195,10 +236,11 @@ const overrides = deriveThemePalette({ primary: "#3b82f6" })
195
236
  // { "--primary": "#3b82f6", "--primary-foreground": "oklch(0.18 0.01 260)", … }
196
237
  ```
197
238
 
198
- The keys are semantic custom properties, so write them at the boundary list or pass them to
199
- a `Scope`'s `vars`. The derived values stay CSS
200
- (`color-mix(in oklch, var(--primary) 10%, var(--background))` rather than a computed
201
- literal), so they keep following the tokens they derive from.
239
+ The keys are theme variables, so write them on `:root` or pass them to a `Scope`'s `vars`.
240
+ The derived values stay CSS (`color-mix(in oklch, var(--primary) 10%, var(--background))`
241
+ rather than a computed literal), so they keep following the variables they derive from.
242
+ Derive one set for each mode and pair them, as the ThemeTweaker does, when the two should
243
+ differ.
202
244
 
203
245
  `readableForeground(background)` **measures** WCAG contrast against both candidates and
204
246
  returns the better one, with the ratio and whether it clears AA:
@@ -215,64 +257,61 @@ Both functions are also re-exported from `features/theme-tweaker`.
215
257
 
216
258
  ## Design tokens (DTCG)
217
259
 
218
- `themelia-ui/tokens.json` is the contract in [W3C DTCG][dtcg] format, for Figma and
219
- tools like Style Dictionary. Colours are OKLCH objects with a `hex` fallback:
260
+ `themelia-ui/tokens.json` is the theme in [W3C DTCG][dtcg] format, for Figma and tools like
261
+ Style Dictionary. Each colour is a token in `theme.light` and one in `theme.dark`; every other
262
+ variable is written once in `theme.light` and aliased from `theme.dark`. Colours are OKLCH
263
+ objects with a `hex` fallback:
220
264
 
221
265
  ```json
222
266
  { "$value": { "colorSpace": "oklch", "components": [0.45, 0.124, 167.35], "hex": "#006a47" } }
223
267
  ```
224
268
 
225
- Two kinds of value are left out, and the file lists each one under its `$extensions`:
226
-
227
- - **Mixed colours.** `--destructive-accent` and the inverse steps are `color-mix()` over
228
- other tokens; DTCG has no type for a mix, and resolving one would bake one theme's value in.
229
- - **Shadows.** Each is a multi-layer shadow whose colour is a `color-mix()`; resolving it
230
- would bake one theme's ink in.
269
+ Shadows, durations, the easing curve and the font stacks carry their DTCG types. The two tint
270
+ strengths are percentages, which DTCG cannot express, and the unset font roles have no value;
271
+ the file lists them under its `$extensions`.
231
272
 
232
273
  [dtcg]: https://www.designtokens.org/TR/drafts/format/
233
274
 
234
275
  ## Tailwind CSS v4
235
276
 
236
277
  The kit ships no Tailwind and needs none. If your application already uses Tailwind v4,
237
- import the bridge after Tailwind and the kit's stylesheet, and its utilities resolve against
238
- this contract:
278
+ import the bridge after Tailwind, and its utilities resolve against the theme:
239
279
 
240
280
  ```css
241
281
  @import "tailwindcss";
242
- @import "themelia-ui/core.css";
243
282
  @import "themelia-ui/tailwind.css";
244
283
  ```
245
284
 
246
- `bg-primary` is `var(--primary)`, `rounded-sm` is the kit's inner radius, `p-md` is
247
- `var(--space-md)`, and `text-sm` is `calc(0.875rem * var(--text-scale, var(--scale)))`. The
248
- container radius has no named utility (`rounded` stays Tailwind's own), so write
249
- `rounded-(--radius)`. Every utility reads the token **at the element**, so a `.dark`
250
- subtree, a `[data-density="compact"]` scope, a nested `UIProvider` and a provider's
251
- `theme.radiusSm` or `typography.fonts` all move Tailwind's output the way they move the
252
- kit's own.
253
-
254
- **Import the bridge even if you never write a kit-token utility.** Both projects descend
255
- from shadcn, so custom-property names collide: `--radius-sm`, `--text-xs` through
256
- `--text-2xl`, `--shadow-*`, `--font-sans/serif/mono`, `--leading-*`, `--tracking-*`,
257
- `--ease-*` and `--animate-*`. Tailwind emits its defaults onto `:root` inside `@layer theme`,
258
- and when the kit's layers are declared first, that layer sits **above** the kit's `tokens`
259
- layer. Every module stylesheet imports `core.css` too, so which comes first depends on the
260
- order your application imports its CSS. Without the bridge, Tailwind can win every shared
261
- name, among them:
285
+ The kit's own CSS arrives with its components. Do not `@import` `themelia-ui/style.css` or
286
+ `themelia-ui/core.css` here as well: that inlines a second copy.
287
+
288
+ `bg-primary` is `var(--primary)`, `rounded` is the container radius and `rounded-sm` the
289
+ item radius, `p-padding` and `gap-gap-sm` are the kit's lengths, and `text-sm` is
290
+ `calc(0.875rem * var(--text-scale))`, which follows the type factor as Text does. Every
291
+ utility reads the variable **at the element**, so a dark region, a `[data-density="compact"]`
292
+ scope, a nested `UIProvider` and a provider's `theme.radiusSm` or `typography.fonts` all move
293
+ Tailwind's output the way they move the kit's own.
294
+
295
+ **Import the bridge even if you never write a kit utility.** Both projects descend from
296
+ shadcn, so custom-property names collide: `--radius`, `--radius-sm`, `--shadow`,
297
+ `--shadow-lg`, `--text-xs` through `--text-2xl` and the font stacks. Tailwind emits its
298
+ defaults onto `:root` inside `@layer theme`, and depending on the order your application
299
+ imports its CSS, that layer can sit above the kit's `tokens` layer. Without the bridge,
300
+ Tailwind can win every shared name:
262
301
 
263
302
  | what | kit | Tailwind takes it to |
264
303
  | --- | --- | --- |
265
- | `--radius-sm` | `0.5rem`, the kit's inner radius | `0.25rem` |
266
- | `--text-sm` | `calc(0.875rem * var(--text-scale, var(--scale)))` | `0.875rem`, and **scoped type scaling stops working** |
304
+ | `--radius-sm` | `0.5rem`, the kit's item radius | `0.25rem` |
305
+ | `--shadow-lg` | the kit's floating shadow | Tailwind's `shadow-lg` |
267
306
  | `--font-sans` | Geist first | Tailwind's system stack |
268
- | `--animate-pulse` | `pulse 2s var(--ease-in-out) infinite` | `pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite` |
269
307
 
270
- The symptom is a slightly wrong radius and a density control that stops working, not an
271
- error. The bridge restates those names with the kit's own definitions, so Tailwind's
272
- override becomes a no-op in either order. It is generated from the same public tokens.
308
+ The symptom is a slightly wrong radius or shadow, not an error. The bridge restates those
309
+ names with the kit's own values, so Tailwind's override becomes a no-op in either order. It is
310
+ generated from the theme. The kit declares nothing in Tailwind's `--animate-*` namespace, so
311
+ `animate-spin` and its neighbours stay Tailwind's own.
273
312
 
274
- The bridge is two theme declarations and nothing else: no rules and no utilities, and
275
- Tailwind drops every key no utility uses, so it costs nothing you do not use. Keys that read
276
- a kit token or a formula are `@theme inline`, so they resolve at the element; the restated
277
- literals (the inner radius, font stacks, leading, easing) are a plain `@theme`, so their
278
- utilities read the variable and follow a theme that moves it.
313
+ The bridge is theme declarations and nothing else: no rules and no utilities, and Tailwind
314
+ drops every key no utility uses, so it costs nothing you do not use. Keys that read a kit
315
+ variable or a formula are `@theme inline`, so they resolve at the element; the restated
316
+ literals (the radii, shadows and font stacks) are a plain `@theme`, so their utilities read
317
+ the variable and follow a theme that moves it.
@@ -2,9 +2,19 @@
2
2
 
3
3
  ## A component is unstyled
4
4
 
5
- The JavaScript imports no CSS. Import the module's stylesheet beside the JavaScript subpath,
6
- or `themelia-ui/style.css` once. `core.css` alone supplies tokens but no component rules. See
7
- [Loading the CSS](installation.md#loading-the-css).
5
+ A component brings its own CSS in a bundler. When it arrives unstyled:
6
+
7
+ - **Server rendering with Vite** (Astro, React Router, TanStack Start, Vike): add
8
+ `themelia-ui`, and any installed package that imports it, to `ssr.noExternal`. See
9
+ [Server rendering with Vite](installation.md#server-rendering-with-vite).
10
+ - **Parcel:** set `"@parcel/resolver-default": { "packageExports": true }`.
11
+ - **Custom resolve conditions:** a bundler config that sets its own conditions replaces the
12
+ defaults, and the kit's CSS resolves only under `module`. Keep it: in Vite 6 or later,
13
+ spread `defaultClientConditions` into `resolve.conditions` and `defaultServerConditions`
14
+ into `ssr.resolve.conditions` (both exported from `vite`); in esbuild, add `module` to
15
+ `conditions`.
16
+ - **No bundler:** link `style.css`. See
17
+ [Loading the CSS](installation.md#loading-the-css).
8
18
 
9
19
  Overrides need no `!important` or selector escalation: the kit's rules are layered, and
10
20
  unlayered application CSS beats them.
@@ -12,15 +22,36 @@ unlayered application CSS beats them.
12
22
  ## Node throws on a `.css` import
13
23
 
14
24
  `ERR_UNKNOWN_FILE_EXTENSION` for a `.css` file means Node is running one of your own modules
15
- that imports a stylesheet, without a bundler. The kit's JavaScript imports none. Import the
16
- stylesheets where your bundler or framework processes CSS, or map `\.css$` to a stub in a
17
- test runner that runs your modules directly.
25
+ that imports a stylesheet, without a bundler. The kit's own CSS imports resolve to an empty
26
+ module in Node. Import your stylesheets where your bundler or framework processes CSS, or map
27
+ `\.css$` to a stub in a test runner that runs your modules directly.
18
28
 
19
29
  ## Jest: `Cannot use import statement outside a module`
20
30
 
21
31
  The package is ES modules, and Jest transforms nothing in `node_modules` by default. Exempt
22
32
  the package in `transformIgnorePatterns`. See [In Node](installation.md#in-node).
23
33
 
34
+ ## Jest: `Cannot find module '#core.css'`
35
+
36
+ Jest resolves the package's `imports` map from 29.4 onwards. Upgrade Jest.
37
+
38
+ ## A build fails on a `.css` file
39
+
40
+ A bundler that resolves the package's `module` condition bundles its CSS as well. A server
41
+ build with no CSS handling, such as a webpack or Rollup config without a CSS loader, fails on
42
+ it. Leave the package external in that build, so Node loads it with no CSS, or add a loader
43
+ that ignores `.css`. A client build needs a CSS loader too; with one in place, remove any
44
+ `<link>` to a kit stylesheet, since the CSS now arrives with the components.
45
+
46
+ ## The kit's CSS loads twice
47
+
48
+ Components bring their own CSS, so an application that also imports `themelia-ui/style.css`
49
+ or a module stylesheet from JavaScript, or `@import`s one into its own CSS, ships the same
50
+ rules twice. Remove those imports: the upgrade codemod removes the JavaScript ones and lists
51
+ the rest. A JavaScript import of `themelia-ui/core.css` is harmless, since bundlers keep one
52
+ copy. A page whose JavaScript is bundled that also links a kit stylesheet with an HTML
53
+ `<link>` loads it twice as well; remove the `<link>`.
54
+
24
55
  ## A subpath does not resolve
25
56
 
26
57
  There are no tier barrels such as `themelia-ui/base`. Use the generated
@@ -30,7 +61,10 @@ There are no tier barrels such as `themelia-ui/base`. Use the generated
30
61
  node node_modules/themelia-ui/scripts/consumer/find-component.mjs "what the UI must do"
31
62
  ```
32
63
 
33
- Import the returned exact module path and its returned CSS path.
64
+ Import the returned module path; in a bundled app its CSS comes with it.
65
+
66
+ Parcel reads a package's `exports` only with `"@parcel/resolver-default": { "packageExports":
67
+ true }` in the application's `package.json`.
34
68
 
35
69
  ## An optional peer is missing
36
70
 
@@ -40,23 +74,20 @@ listed there, report it as a package containment defect.
40
74
 
41
75
  ## A theme or density override does not apply
42
76
 
43
- Derived tokens are declared at every scope boundary (`:root`, `[data-ui-scope]`,
44
- `[data-density]`, `[data-theme]`, `.light` and `.dark`) and resolve there. Which selector an
45
- override needs depends on the token:
46
-
47
- - **Raw inputs**, such as the radii, font stacks, palette steps, `--scale`,
48
- `--density-scale` and `--text-scale`, are declared at `:root` only, so a value set on
49
- `:root` reaches every scope. Inside a `data-density` preset region, the preset's
50
- `--density-scale` applies instead.
51
- - **Semantic colours** such as `--primary` and `--background` are re-declared at every
52
- boundary. Set on `:root` alone, they stop at the first boundary, and every provider renders
53
- one. Declare them at the boundary list, or pass them through provider config.
54
- - **A provider's `theme.colors`** is written on the provider's own element, so a nested
55
- provider, `Scope` or `data-density` region inside it declares the kit's colours again. For
56
- colours that must reach every region, use the boundary list, or set palette steps
57
- (`theme.palette`), which each nested boundary derives its colours from.
58
- - **A plain element** that is not a boundary sets the variable, and nothing re-derives from
59
- it: the derived values were resolved above it. Wrap the region in `Scope`.
77
+ Every theme variable is declared once, at `:root`, and inherits from wherever you set it. When
78
+ an override does not show:
79
+
80
+ - **Is it the theme's name?** A 3.0 name such as `--space-md`, `--control-h` or
81
+ `--primary-10` is gone; the codemod renames or reports each one, and
82
+ `src/styles/TOKENS.md` (`node_modules/themelia-ui/src/styles/TOKENS.md`) names the variable for every role.
83
+ - **Is a density preset in effect?** A `data-density` region (or a provider's `density`) sets
84
+ the lengths and control heights on its element, so a value set further out does not reach
85
+ inside it. Set the value for the preset too: `[data-density="compact"] { --padding: … }`.
86
+ - **Is it a colour set to one value?** One value applies in both modes. For a separate dark
87
+ value, write `light-dark(light, dark)`; a rule under `.dark` misses a dark region inside a
88
+ light page.
89
+ - **Is it in a portalled popup?** A value set on a provider or a region reaches its subtree,
90
+ and a popup portalled to `<body>` leaves it; see the next section.
60
91
 
61
92
  See [Theming](theming.md#setting-a-theme) and
62
93
  [Provider and scoping](provider-and-scoping.md).
@@ -66,8 +97,8 @@ See [Theming](theming.md#setting-a-theme) and
66
97
  Popups portal to `<body>` by default, outside any nested scope, so they miss its density,
67
98
  colour scheme and token overrides. Wrap the region in `UIPortalHost` so its popups render
68
99
  inside the scope, or pass the component a `container`. A root provider with a
69
- `documentTarget` mirrors only `data-theme` and `data-density` to the document; token
70
- overrides that `<body>` popups must see belong in CSS at the scope boundaries. See
100
+ `documentTarget` mirrors only `data-theme` and `data-density` to the document; a value that
101
+ `<body>` popups must see belongs on `:root`. See
71
102
  [Provider and scoping](provider-and-scoping.md#portals-and-scopes).
72
103
 
73
104
  ## A controlled component appears frozen
@@ -87,9 +118,13 @@ element's semantics while applying the component's behaviour and geometry.
87
118
 
88
119
  Use `CSPProvider` with the request nonce. For a policy that forbids style elements entirely,
89
120
  set `disableStyleElements` and serve the documented Base UI behaviour rules from an external
90
- stylesheet. The module stylesheets themselves are ordinary static CSS. See
121
+ stylesheet. The kit's stylesheets are ordinary static CSS. See
91
122
  [Provider and scoping](provider-and-scoping.md#strict-content-security-policy).
92
123
 
124
+ In a bundled app the kit's CSS follows your own pipeline: stylesheet files in production,
125
+ while a dev server or `style-loader` that injects `<style>` elements needs the nonce, as your
126
+ own CSS does.
127
+
93
128
  ## The design looks inconsistent after overrides
94
129
 
95
130
  Override global semantic tokens first: colour roles, radius, spacing and density,
@@ -45,7 +45,6 @@ the module and token before adding a local patch: the package may be missing a d
45
45
 
46
46
  Read the changelog (`node_modules/themelia-ui/CHANGELOG.md`), run the package's codemod when a release names one
47
47
  (`node node_modules/themelia-ui/scripts/consumer/codemod.mjs --dry-run src/`), and let the
48
- application's own type-check compare the installed declarations. Within a major, a removal
49
- keeps a deprecated alias until the next major unless keeping it would be unsafe or
50
- incorrect; a major may remove names outright, and its migration guide lists each one. See
48
+ application's own type-check compare the installed declarations. Removed names have no
49
+ compatibility alias in 3.1; its migration guide lists each replacement. See
51
50
  [API compatibility](api-compatibility.md).