@smwb/ui-react 2.8.0 → 2.9.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 (239) hide show
  1. package/AI_LESS_OVERRIDES.md +84 -21
  2. package/AI_THEMING.md +72 -28
  3. package/README.md +654 -0
  4. package/dist/assets/styles/less/components/appBar/appBar.entry.css +1 -1
  5. package/dist/assets/styles/less/components/button/button.entry.css +1 -1
  6. package/dist/assets/styles/less/components/checkbox/checkbox.entry.css +1 -1
  7. package/dist/assets/styles/less/components/chip/chip.entry.css +1 -1
  8. package/dist/assets/styles/less/components/commandPalette/commandPalette.entry.css +1 -0
  9. package/dist/assets/styles/less/components/composer/composer.entry.css +1 -0
  10. package/dist/assets/styles/less/components/dagView/dagView.entry.css +1 -0
  11. package/dist/assets/styles/less/components/diffStat/diffStat.entry.css +1 -0
  12. package/dist/assets/styles/less/components/kbd/kbd.entry.css +1 -0
  13. package/dist/assets/styles/less/components/list/list.entry.css +1 -1
  14. package/dist/assets/styles/less/components/qrCode/qrCode.entry.css +1 -0
  15. package/dist/assets/styles/less/components/radioButton/radioButton.entry.css +1 -1
  16. package/dist/assets/styles/less/components/selectField/selectField.entry.css +1 -1
  17. package/dist/assets/styles/less/components/sidebar/sidebar.entry.css +1 -1
  18. package/dist/assets/styles/less/components/statusDot/statusDot.entry.css +1 -0
  19. package/dist/assets/styles/less/components/swimlanes/swimlanes.entry.css +1 -0
  20. package/dist/assets/styles/less/components/tabGroups/tabGroups.entry.css +1 -0
  21. package/dist/assets/styles/less/components/tabs/tab/tab.entry.css +1 -1
  22. package/dist/assets/styles/less/components/tabs/tabPanel/tabPanel.entry.css +1 -0
  23. package/dist/assets/styles/less/components/tabs/tabs.entry.css +1 -1
  24. package/dist/assets/styles/less/components/textField/textField.entry.css +1 -1
  25. package/dist/assets/styles/less/components/toggle/toggle.entry.css +1 -1
  26. package/dist/assets/styles/less/components/treeView/treeView.entry.css +1 -1
  27. package/dist/assets/styles/less/tokens.entry.css +1 -1
  28. package/dist/components/dataDisplay/chat/chat.d.ts +43 -1
  29. package/dist/components/dataDisplay/chat/chat.js +179 -150
  30. package/dist/components/dataDisplay/chat/chat.js.map +1 -1
  31. package/dist/components/dataDisplay/chat/chatComposer.d.ts +17 -0
  32. package/dist/components/dataDisplay/chat/chatComposer.js +31 -29
  33. package/dist/components/dataDisplay/chat/chatComposer.js.map +1 -1
  34. package/dist/components/dataDisplay/chat/index.d.ts +1 -1
  35. package/dist/components/dataDisplay/chat/utils.d.ts +14 -0
  36. package/dist/components/dataDisplay/chat/utils.js.map +1 -1
  37. package/dist/components/dataDisplay/dagView/dagLayout.d.ts +74 -0
  38. package/dist/components/dataDisplay/dagView/dagLayout.js +289 -0
  39. package/dist/components/dataDisplay/dagView/dagLayout.js.map +1 -0
  40. package/dist/components/dataDisplay/dagView/dagView.d.ts +157 -0
  41. package/dist/components/dataDisplay/dagView/dagView.js +543 -0
  42. package/dist/components/dataDisplay/dagView/dagView.js.map +1 -0
  43. package/dist/components/dataDisplay/dagView/index.d.ts +4 -0
  44. package/dist/components/dataDisplay/dagView/panZoom.d.ts +75 -0
  45. package/dist/components/dataDisplay/dagView/panZoom.js +171 -0
  46. package/dist/components/dataDisplay/dagView/panZoom.js.map +1 -0
  47. package/dist/components/dataDisplay/diffStat/diffStat.d.ts +54 -0
  48. package/dist/components/dataDisplay/diffStat/diffStat.js +63 -0
  49. package/dist/components/dataDisplay/diffStat/diffStat.js.map +1 -0
  50. package/dist/components/dataDisplay/diffStat/index.d.ts +2 -0
  51. package/dist/components/dataDisplay/kbd/index.d.ts +4 -0
  52. package/dist/components/dataDisplay/kbd/kbd.d.ts +40 -0
  53. package/dist/components/dataDisplay/kbd/kbd.js +27 -0
  54. package/dist/components/dataDisplay/kbd/kbd.js.map +1 -0
  55. package/dist/components/dataDisplay/kbd/kbdKeys.d.ts +18 -0
  56. package/dist/components/dataDisplay/kbd/kbdKeys.js +72 -0
  57. package/dist/components/dataDisplay/kbd/kbdKeys.js.map +1 -0
  58. package/dist/components/dataDisplay/list/listItem.d.ts +34 -0
  59. package/dist/components/dataDisplay/list/listItem.js +47 -24
  60. package/dist/components/dataDisplay/list/listItem.js.map +1 -1
  61. package/dist/components/dataDisplay/qrCode/index.d.ts +2 -0
  62. package/dist/components/dataDisplay/qrCode/qrCode.d.ts +28 -0
  63. package/dist/components/dataDisplay/qrCode/qrCode.js +78 -0
  64. package/dist/components/dataDisplay/qrCode/qrCode.js.map +1 -0
  65. package/dist/components/dataDisplay/qrCode/qrCodePath.d.ts +7 -0
  66. package/dist/components/dataDisplay/qrCode/qrCodePath.js +20 -0
  67. package/dist/components/dataDisplay/qrCode/qrCodePath.js.map +1 -0
  68. package/dist/components/dataDisplay/statusDot/index.d.ts +2 -0
  69. package/dist/components/dataDisplay/statusDot/statusDot.d.ts +35 -0
  70. package/dist/components/dataDisplay/statusDot/statusDot.js +30 -0
  71. package/dist/components/dataDisplay/statusDot/statusDot.js.map +1 -0
  72. package/dist/components/dataDisplay/swimlanes/index.d.ts +2 -0
  73. package/dist/components/dataDisplay/swimlanes/swimlanes.d.ts +53 -0
  74. package/dist/components/dataDisplay/swimlanes/swimlanes.js +357 -0
  75. package/dist/components/dataDisplay/swimlanes/swimlanes.js.map +1 -0
  76. package/dist/components/dataDisplay/treeView/treeView.d.ts +17 -1
  77. package/dist/components/dataDisplay/treeView/treeView.js +113 -92
  78. package/dist/components/dataDisplay/treeView/treeView.js.map +1 -1
  79. package/dist/components/feedBack/modal/modal.js +84 -63
  80. package/dist/components/feedBack/modal/modal.js.map +1 -1
  81. package/dist/components/inputs/button/button.d.ts +13 -1
  82. package/dist/components/inputs/button/button.js +57 -51
  83. package/dist/components/inputs/button/button.js.map +1 -1
  84. package/dist/components/inputs/composer/composer.d.ts +149 -0
  85. package/dist/components/inputs/composer/composer.js +219 -0
  86. package/dist/components/inputs/composer/composer.js.map +1 -0
  87. package/dist/components/inputs/composer/composerFiles.d.ts +26 -0
  88. package/dist/components/inputs/composer/composerFiles.js +19 -0
  89. package/dist/components/inputs/composer/composerFiles.js.map +1 -0
  90. package/dist/components/inputs/composer/composerKeys.d.ts +29 -0
  91. package/dist/components/inputs/composer/composerKeys.js +7 -0
  92. package/dist/components/inputs/composer/composerKeys.js.map +1 -0
  93. package/dist/components/inputs/composer/index.d.ts +3 -0
  94. package/dist/components/layout/sheet/sheet.d.ts +12 -0
  95. package/dist/components/layout/sheet/sheet.js +152 -137
  96. package/dist/components/layout/sheet/sheet.js.map +1 -1
  97. package/dist/components/layout/tabGroups/index.d.ts +4 -0
  98. package/dist/components/layout/tabGroups/tabGroups.d.ts +94 -0
  99. package/dist/components/layout/tabGroups/tabGroups.js +783 -0
  100. package/dist/components/layout/tabGroups/tabGroups.js.map +1 -0
  101. package/dist/components/layout/tabGroups/tabGroupsFocus.d.ts +55 -0
  102. package/dist/components/layout/tabGroups/tabGroupsFocus.js +199 -0
  103. package/dist/components/layout/tabGroups/tabGroupsFocus.js.map +1 -0
  104. package/dist/components/layout/tabGroups/tabGroupsLayout.d.ts +250 -0
  105. package/dist/components/layout/tabGroups/tabGroupsLayout.js +497 -0
  106. package/dist/components/layout/tabGroups/tabGroupsLayout.js.map +1 -0
  107. package/dist/components/navigation/appBar/appBar.d.ts +22 -0
  108. package/dist/components/navigation/appBar/appBar.js +31 -26
  109. package/dist/components/navigation/appBar/appBar.js.map +1 -1
  110. package/dist/components/navigation/commandPalette/commandPalette.d.ts +111 -0
  111. package/dist/components/navigation/commandPalette/commandPalette.js +337 -0
  112. package/dist/components/navigation/commandPalette/commandPalette.js.map +1 -0
  113. package/dist/components/navigation/commandPalette/commandPaletteFilter.d.ts +11 -0
  114. package/dist/components/navigation/commandPalette/commandPaletteFilter.js +16 -0
  115. package/dist/components/navigation/commandPalette/commandPaletteFilter.js.map +1 -0
  116. package/dist/components/navigation/commandPalette/commandPaletteNavigation.d.ts +13 -0
  117. package/dist/components/navigation/commandPalette/commandPaletteNavigation.js +38 -0
  118. package/dist/components/navigation/commandPalette/commandPaletteNavigation.js.map +1 -0
  119. package/dist/components/navigation/commandPalette/commandPaletteTypes.d.ts +39 -0
  120. package/dist/components/navigation/commandPalette/index.d.ts +4 -0
  121. package/dist/components/navigation/sidebar/sidebar.d.ts +10 -0
  122. package/dist/components/navigation/sidebar/sidebar.js +61 -59
  123. package/dist/components/navigation/sidebar/sidebar.js.map +1 -1
  124. package/dist/components/navigation/tabs/index.d.ts +3 -1
  125. package/dist/components/navigation/tabs/tab/tab.d.ts +88 -1
  126. package/dist/components/navigation/tabs/tab/tab.js +121 -42
  127. package/dist/components/navigation/tabs/tab/tab.js.map +1 -1
  128. package/dist/components/navigation/tabs/tabPanel/tabPanel.d.ts +19 -0
  129. package/dist/components/navigation/tabs/tabPanel/tabPanel.js +27 -0
  130. package/dist/components/navigation/tabs/tabPanel/tabPanel.js.map +1 -0
  131. package/dist/components/navigation/tabs/tabs.d.ts +75 -5
  132. package/dist/components/navigation/tabs/tabs.js +369 -145
  133. package/dist/components/navigation/tabs/tabs.js.map +1 -1
  134. package/dist/components/navigation/tabs/tabs.utils.d.ts +20 -0
  135. package/dist/components/navigation/tabs/tabs.utils.js +11 -0
  136. package/dist/components/navigation/tabs/tabs.utils.js.map +1 -0
  137. package/dist/components/navigation/tabs/tabsContext.d.ts +11 -0
  138. package/dist/components/navigation/tabs/tabsContext.js +6 -0
  139. package/dist/components/navigation/tabs/tabsContext.js.map +1 -0
  140. package/dist/headless/components/dataDisplay/chat/chat.js +179 -150
  141. package/dist/headless/components/dataDisplay/chat/chat.js.map +1 -1
  142. package/dist/headless/components/dataDisplay/chat/chatComposer.js +31 -29
  143. package/dist/headless/components/dataDisplay/chat/chatComposer.js.map +1 -1
  144. package/dist/headless/components/dataDisplay/chat/utils.js.map +1 -1
  145. package/dist/headless/components/dataDisplay/dagView/dagLayout.js +289 -0
  146. package/dist/headless/components/dataDisplay/dagView/dagLayout.js.map +1 -0
  147. package/dist/headless/components/dataDisplay/dagView/dagView.js +541 -0
  148. package/dist/headless/components/dataDisplay/dagView/dagView.js.map +1 -0
  149. package/dist/headless/components/dataDisplay/dagView/panZoom.js +171 -0
  150. package/dist/headless/components/dataDisplay/dagView/panZoom.js.map +1 -0
  151. package/dist/headless/components/dataDisplay/diffStat/diffStat.js +61 -0
  152. package/dist/headless/components/dataDisplay/diffStat/diffStat.js.map +1 -0
  153. package/dist/headless/components/dataDisplay/kbd/kbd.js +25 -0
  154. package/dist/headless/components/dataDisplay/kbd/kbd.js.map +1 -0
  155. package/dist/headless/components/dataDisplay/kbd/kbdKeys.js +72 -0
  156. package/dist/headless/components/dataDisplay/kbd/kbdKeys.js.map +1 -0
  157. package/dist/headless/components/dataDisplay/list/listItem.js +47 -24
  158. package/dist/headless/components/dataDisplay/list/listItem.js.map +1 -1
  159. package/dist/headless/components/dataDisplay/qrCode/qrCode.js +76 -0
  160. package/dist/headless/components/dataDisplay/qrCode/qrCode.js.map +1 -0
  161. package/dist/headless/components/dataDisplay/qrCode/qrCodePath.js +20 -0
  162. package/dist/headless/components/dataDisplay/qrCode/qrCodePath.js.map +1 -0
  163. package/dist/headless/components/dataDisplay/statusDot/statusDot.js +28 -0
  164. package/dist/headless/components/dataDisplay/statusDot/statusDot.js.map +1 -0
  165. package/dist/headless/components/dataDisplay/swimlanes/swimlanes.js +355 -0
  166. package/dist/headless/components/dataDisplay/swimlanes/swimlanes.js.map +1 -0
  167. package/dist/headless/components/dataDisplay/treeView/treeView.js +113 -92
  168. package/dist/headless/components/dataDisplay/treeView/treeView.js.map +1 -1
  169. package/dist/headless/components/feedBack/modal/modal.js +85 -64
  170. package/dist/headless/components/feedBack/modal/modal.js.map +1 -1
  171. package/dist/headless/components/inputs/button/button.js +56 -50
  172. package/dist/headless/components/inputs/button/button.js.map +1 -1
  173. package/dist/headless/components/inputs/composer/composer.js +217 -0
  174. package/dist/headless/components/inputs/composer/composer.js.map +1 -0
  175. package/dist/headless/components/inputs/composer/composerFiles.js +19 -0
  176. package/dist/headless/components/inputs/composer/composerFiles.js.map +1 -0
  177. package/dist/headless/components/inputs/composer/composerKeys.js +7 -0
  178. package/dist/headless/components/inputs/composer/composerKeys.js.map +1 -0
  179. package/dist/headless/components/layout/sheet/sheet.js +160 -145
  180. package/dist/headless/components/layout/sheet/sheet.js.map +1 -1
  181. package/dist/headless/components/layout/tabGroups/tabGroups.js +781 -0
  182. package/dist/headless/components/layout/tabGroups/tabGroups.js.map +1 -0
  183. package/dist/headless/components/layout/tabGroups/tabGroupsFocus.js +199 -0
  184. package/dist/headless/components/layout/tabGroups/tabGroupsFocus.js.map +1 -0
  185. package/dist/headless/components/layout/tabGroups/tabGroupsLayout.js +497 -0
  186. package/dist/headless/components/layout/tabGroups/tabGroupsLayout.js.map +1 -0
  187. package/dist/headless/components/navigation/appBar/appBar.js +35 -30
  188. package/dist/headless/components/navigation/appBar/appBar.js.map +1 -1
  189. package/dist/headless/components/navigation/commandPalette/commandPalette.js +335 -0
  190. package/dist/headless/components/navigation/commandPalette/commandPalette.js.map +1 -0
  191. package/dist/headless/components/navigation/commandPalette/commandPaletteFilter.js +16 -0
  192. package/dist/headless/components/navigation/commandPalette/commandPaletteFilter.js.map +1 -0
  193. package/dist/headless/components/navigation/commandPalette/commandPaletteNavigation.js +38 -0
  194. package/dist/headless/components/navigation/commandPalette/commandPaletteNavigation.js.map +1 -0
  195. package/dist/headless/components/navigation/sidebar/sidebar.js +56 -54
  196. package/dist/headless/components/navigation/sidebar/sidebar.js.map +1 -1
  197. package/dist/headless/components/navigation/tabs/tab/tab.js +121 -42
  198. package/dist/headless/components/navigation/tabs/tab/tab.js.map +1 -1
  199. package/dist/headless/components/navigation/tabs/tabPanel/tabPanel.js +25 -0
  200. package/dist/headless/components/navigation/tabs/tabPanel/tabPanel.js.map +1 -0
  201. package/dist/headless/components/navigation/tabs/tabs.js +369 -145
  202. package/dist/headless/components/navigation/tabs/tabs.js.map +1 -1
  203. package/dist/headless/components/navigation/tabs/tabs.utils.js +11 -0
  204. package/dist/headless/components/navigation/tabs/tabs.utils.js.map +1 -0
  205. package/dist/headless/components/navigation/tabs/tabsContext.js +6 -0
  206. package/dist/headless/components/navigation/tabs/tabsContext.js.map +1 -0
  207. package/dist/headless/hooks/useFocusTrap.js +24 -21
  208. package/dist/headless/hooks/useFocusTrap.js.map +1 -1
  209. package/dist/headless/hooks/useKeyboardShortcut.js +19 -0
  210. package/dist/headless/hooks/useKeyboardShortcut.js.map +1 -0
  211. package/dist/headless/index.js +360 -316
  212. package/dist/headless/index.js.map +1 -1
  213. package/dist/headless/utils/keyboardShortcut.js +49 -0
  214. package/dist/headless/utils/keyboardShortcut.js.map +1 -0
  215. package/dist/headless/utils/linkAttrs.js +13 -0
  216. package/dist/headless/utils/linkAttrs.js.map +1 -0
  217. package/dist/headless/utils/restoreFocus.js +10 -0
  218. package/dist/headless/utils/restoreFocus.js.map +1 -0
  219. package/dist/hooks/useFocusTrap.d.ts +6 -1
  220. package/dist/hooks/useFocusTrap.js +24 -21
  221. package/dist/hooks/useFocusTrap.js.map +1 -1
  222. package/dist/hooks/useKeyboardShortcut.d.ts +30 -0
  223. package/dist/hooks/useKeyboardShortcut.js +19 -0
  224. package/dist/hooks/useKeyboardShortcut.js.map +1 -0
  225. package/dist/index.cjs +3 -2
  226. package/dist/index.cjs.map +1 -1
  227. package/dist/index.d.ts +24 -3
  228. package/dist/index.js +360 -316
  229. package/dist/index.js.map +1 -1
  230. package/dist/utils/keyboardShortcut.d.ts +12 -0
  231. package/dist/utils/keyboardShortcut.js +49 -0
  232. package/dist/utils/keyboardShortcut.js.map +1 -0
  233. package/dist/utils/linkAttrs.d.ts +13 -0
  234. package/dist/utils/linkAttrs.js +13 -0
  235. package/dist/utils/linkAttrs.js.map +1 -0
  236. package/dist/utils/restoreFocus.d.ts +8 -0
  237. package/dist/utils/restoreFocus.js +10 -0
  238. package/dist/utils/restoreFocus.js.map +1 -0
  239. package/package.json +5 -3
@@ -2,6 +2,8 @@
2
2
  AUDIENCE: AI agent (not human). Dense, exact, copy-paste ready.
3
3
  TOPIC: compile-time customization of @smwb/ui-react via Less overrides.
4
4
  Companion: AI_THEMING.md (runtime CSS vars + component props).
5
+ SCOPE: documents BOTH @smwb/ui-react and @smwb/ui-solid — ui-solid ships
6
+ no AI_*.md of its own, so nothing here is React-specific.
5
7
  -->
6
8
 
7
9
  # AI_LESS_OVERRIDES — Less override mechanism
@@ -45,10 +47,10 @@ hook is `theme.config`.
45
47
 
46
48
  ```less
47
49
  // theme.config (consumer)
48
- @smui-spacing-unit: 8px; // double every gap/padding/margin
49
- @smui-radius-md: 2px; // sharper corners library-wide
50
- @primaryColor: @md-teal-500; // pull brand from the MD palette
51
- @cardPadding: @smui-space-xxl;
50
+ @smui-spacing-unit: 8px; // double every gap/padding/margin
51
+ @smui-radius-md: 2px; // sharper corners library-wide
52
+ @primaryColor: @md-teal-500; // pull brand from the MD palette
53
+ @cardPadding: @smui-space-xxl;
52
54
  ```
53
55
 
54
56
  `site.variables.less` (`@smwb/ui-styles/less/site/globals/site.variables.less`)
@@ -57,17 +59,17 @@ first-party theming.
57
59
 
58
60
  ## Token catalog (authoritative files)
59
61
 
60
- | Layer | File | Tokens |
61
- |---|---|---|
62
- | MD palette | `@smwb/ui-styles/less/foundation/palette.less` | `@md-<color>-<shade>` |
63
- | Spacing | `@smwb/ui-styles/less/foundation/spacing.less` | `@smui-spacing-unit`, `@smui-space-*` + mixins |
64
- | Radius | `@smwb/ui-styles/less/foundation/radius.less` | `@smui-radius-*` |
65
- | Elevation | `@smwb/ui-styles/less/foundation/elevation.less` | `@smui-elevation-*` + mixin |
66
- | Breakpoints | `@smwb/ui-styles/less/foundation/breakpoints.less` | `@smui-bp-*`, `@xs..@xl` + media mixins |
67
- | Control sizing | `@smwb/ui-styles/less/foundation/sizing.less` | `@smui-control-*`, `@smui-selection-*`, `@smui-icon-*` |
68
- | Semantic colors + per-component vars | `@smwb/ui-styles/less/default/globals/default.variables.less` | `@primaryColor`, `@secondaryColor`, `@errorColor`, … and component vars |
69
- | Dark theme vars | same file, `*Dark` suffixed | e.g. `@primaryColorDark` |
70
- | Runtime exposure | `@smwb/ui-styles/less/variables.less` | `:root { --smui-* }` |
62
+ | Layer | File | Tokens |
63
+ | ------------------------------------ | ------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
64
+ | MD palette | `@smwb/ui-styles/less/foundation/palette.less` | `@md-<color>-<shade>` |
65
+ | Spacing | `@smwb/ui-styles/less/foundation/spacing.less` | `@smui-spacing-unit`, `@smui-space-*` + mixins |
66
+ | Radius | `@smwb/ui-styles/less/foundation/radius.less` | `@smui-radius-*` |
67
+ | Elevation | `@smwb/ui-styles/less/foundation/elevation.less` | `@smui-elevation-*` + mixin |
68
+ | Breakpoints | `@smwb/ui-styles/less/foundation/breakpoints.less` | `@smui-bp-*`, `@xs..@xl` + media mixins |
69
+ | Control sizing | `@smwb/ui-styles/less/foundation/sizing.less` | `@smui-control-h-*` (consumed — see "Control sizing" below), `@smui-control-font-sm/lg` (TextField/SelectField), `@smui-selection-*` (checkbox/radio box edges); `@smui-control-px-*`, `@smui-icon-*`, `@smui-control-font-md` reserved (defined, not consumed) |
70
+ | Semantic colors + per-component vars | `@smwb/ui-styles/less/default/globals/default.variables.less` | `@primaryColor`, `@secondaryColor`, `@errorColor`, … and component vars |
71
+ | Dark theme vars | same file, `*Dark` suffixed | e.g. `@primaryColorDark` |
72
+ | Runtime exposure | `@smwb/ui-styles/less/variables.less` | `:root { --smui-* }` |
71
73
 
72
74
  To enumerate any group exactly, grep the source (always current):
73
75
 
@@ -120,10 +122,69 @@ Detached-ruleset mixins:
120
122
 
121
123
  ### Control sizing (`foundation/sizing.less`)
122
124
 
123
- `@smui-control-h-sm|md|lg` (32/40/48), `@smui-control-px-sm|md|lg`,
124
- `@smui-control-font-sm|md|lg`, `@smui-selection-sm|md|lg` (16/18/22),
125
- `@smui-icon-sm|md|lg` (18/20/24). Component `size` props map to
126
- `*_size-sm|md|lg` classes that read these.
125
+ `@smui-control-h-sm|md|lg` (32/40/48) are the control heights. Wired
126
+ consumers read them uniformly as
127
+ `min-height: var(--smui-control-h-<step>, @smui-control-h-<step>);`:
128
+
129
+ | Component | Selector wired to the token | Step |
130
+ | ---------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------- | ------------ |
131
+ | Button | `.smwb-button.smwb-small` / `.smwb-medium` / `.smwb-large` | sm/md/lg |
132
+ | TextField (outlined) | `.smwb-text-field__input:not(.smwb-text-field__input--inline)` (base = md); `.smwb-text-field_size-small` / `_size-large` variants of the same | md / sm / lg |
133
+ | SelectField (outlined) | `.smwb-select-field:not(.smwb-select-field--inline)` (base = md); the same under `.smwb-text-field_size-small` / `_size-large` ancestors | md / sm / lg |
134
+ | Chip | base `.smwb-chip` | sm |
135
+ | Checkbox | `.smwb-checkbox_size-small` / `-medium` / `-large` (row) | sm/md/lg |
136
+ | RadioButton | `.smwb-radio_size-small` / `-medium` / `-large` (row) | sm/md/lg |
137
+ | Toggle | `.smwb-toggle__wrapper:has(.smwb-toggle_size-small)` / `-medium` / `-large` (row — the size class rides the switch, `:has()` reaches the row) | sm/md/lg |
138
+
139
+ ButtonGroup forwards `size` to Button and inherits. The class
140
+ conventions: Button and exempt FloatingButton use
141
+ `.smwb-small|medium|large`; exempt Avatar emits a third convention,
142
+ `smwb-avatar_${size}` (`avatar.tsx`), and reads none of the tokens;
143
+ TextField/SelectField/Chip and the selection controls use
144
+ `*_size-small|large` — TextField's medium emits no class
145
+ (base rule = md), Chip has no `large`, Checkbox/RadioButton/Toggle emit
146
+ all three.
147
+
148
+ **Variant exemptions (wired components that do NOT read the tokens):**
149
+ `--filled` TextField keeps `content-box`, its padding summing with
150
+ `min-height: 0` (the shrunk resting label needs the 23px top
151
+ padding); `--filled` SelectField only resets `min-height: 0` and keeps
152
+ its own padding — `.smwb-select-field` is `border-box` in both
153
+ variants; `--inline` TextField/SelectField are excluded by the
154
+ `:not(--inline)` guard; RadioButton's md box is a hardcoded 20px — off
155
+ the 16/18/22 `@smui-selection-*` scale (its sm/lg boxes DO read
156
+ `@smui-selection-sm/lg`); Chip `_size-small` is a constant 24px, below
157
+ the scale; the Toggle switch geometry (track, thumb) is not scaled.
158
+
159
+ **Component exemptions (not wired, do not add without a design
160
+ decision):** FloatingButton (Material FAB diameters 56/48/40, extended
161
+ 48/40/34, are their own scale), Avatar (identity badge 24/40/56, not a
162
+ control), Pagination (own item scale 32/26), ProgressIndicator
163
+ (indicator diameter 28px), StatusDot (decorative dot, and `_size-sm` is
164
+ a different suffix), Slider (`size` scales track thickness/thumb
165
+ diameter), Modal (`size` is dialog width), Rating (`size?: number` is a
166
+ pixel value), DatePicker/TimePicker/DateTimePicker (compose TextField +
167
+ Button, so they inherit the tokens).
168
+
169
+ **Reserved (defined, NOT consumed — do not claim otherwise):**
170
+ `@smui-control-px-*` and `@smui-icon-*` have no readers anywhere;
171
+ `@smui-control-font-md` is unconsumed (`-sm`/`-lg` are read by the
172
+ TextField/SelectField sm/lg rules); `@smui-selection-*` is read only by
173
+ the checkbox box edges (all three steps) and the radio sm/lg box edges —
174
+ Toggle reads none.
175
+
176
+ **Default deltas (accepted breaking changes — never "restore" these by
177
+ hardcoding heights):** Button sm/md/lg grew ≈27.5/33/38.5 → 32/40/48;
178
+ outlined TextField sm/md/lg shrank 40/56/55 → 32/40/48 (SelectField
179
+ 40/56/56 → 32/40/48, border-box: the padding calc adds up to the token
180
+ exactly); Checkbox/RadioButton/Toggle rows previously had no
181
+ `min-height` — md rows are now floored at 40px.
182
+
183
+ This mapping is machine-enforced:
184
+ `packages/styles/scripts/check-control-heights.mjs` (in
185
+ `@smwb/ui-styles`' `lint`, gating CI) re-renders `components.less` with
186
+ `@smui-control-h-md: 44px` and asserts exactly the wired selectors
187
+ above change. Editing either side without the other fails the lint cube.
127
188
 
128
189
  ### Semantic colors (`default.variables.less`)
129
190
 
@@ -151,7 +212,9 @@ grep -nE '^@[a-z][A-Za-z0-9]+:' @smwb/ui-styles/less/default/globals/default.var
151
212
  @smui-spacing-unit: 6px;
152
213
 
153
214
  // 2. Flatter corners everywhere
154
- @smui-radius-md: 2px; @smui-radius-lg: 4px; @smui-radius-xl: 6px;
215
+ @smui-radius-md: 2px;
216
+ @smui-radius-lg: 4px;
217
+ @smui-radius-xl: 6px;
155
218
 
156
219
  // 3. Rebrand from the MD palette (cascades to all primary usages)
157
220
  @primaryColor: @md-indigo-600;
@@ -159,7 +222,7 @@ grep -nE '^@[a-z][A-Za-z0-9]+:' @smwb/ui-styles/less/default/globals/default.var
159
222
 
160
223
  // 4. Retune ONE component without touching others
161
224
  @cardPadding: @smui-space-xxl;
162
- @tooltipBg: @md-blueGrey-800;
225
+ @tooltipBg: @md-blueGrey-800;
163
226
 
164
227
  // 5. Soften elevation globally
165
228
  @smui-elevation-2: @smui-elevation-1;
package/AI_THEMING.md CHANGED
@@ -3,6 +3,8 @@
3
3
  TOPIC: changing component appearance in @smwb/ui-react — at runtime
4
4
  (CSS custom properties) and via component props.
5
5
  Companion: AI_LESS_OVERRIDES.md (compile-time Less tokens).
6
+ SCOPE: documents BOTH @smwb/ui-react and @smwb/ui-solid — ui-solid ships
7
+ no AI_*.md of its own, so nothing here is React-specific.
6
8
  -->
7
9
 
8
10
  # AI_THEMING — change component appearance
@@ -40,8 +42,14 @@ shared sheet (`tokens.entry.less`), at zero specificity:
40
42
  `:root` or any subtree (cascades):
41
43
 
42
44
  ```css
43
- :root { --smui-primaryColor: #00695c; --smui-radius-md: 2px; }
44
- .dense-area { --smui-space-md: 8px; --smui-space-lg: 12px; }
45
+ :root {
46
+ --smui-primaryColor: #00695c;
47
+ --smui-radius-md: 2px;
48
+ }
49
+ .dense-area {
50
+ --smui-space-md: 8px;
51
+ --smui-space-lg: 12px;
52
+ }
45
53
  ```
46
54
 
47
55
  - **Precedence**: against the per-component CSS a `:root` override
@@ -62,17 +70,26 @@ Groups exposed: `--smui-primaryColor*`, full semantic set
62
70
  surface/text (`--smui-surfaceBackground`, `--smui-onSurfaceColor`,
63
71
  `--smui-dividerColor`, …), per-component (`--smui-tooltipBg`,
64
72
  `--smui-menuTextColor`, `--smui-tableBorderColor`, …), spacing
65
- (`--smui-space-*`, `--smui-spacing-unit`), `--smui-radius-*`,
73
+ (`--smui-space-*`, `--smui-spacing-unit`), control heights
74
+ (`--smui-control-h-sm|md|lg` — read by the wired controls listed in
75
+ AI_LESS_OVERRIDES "Control sizing"; the exempt components and the
76
+ `--filled`/`--inline` variants do NOT respond), `--smui-radius-*`,
66
77
  `--smui-elevation-*`, `--smui-bp-*`.
67
78
 
68
79
  ## 2. Component props (appearance)
69
80
 
70
81
  Standardized vocabulary (rollout in progress across the library):
71
82
 
72
- - `size?: "small" | "medium" | "large"` — control density. Emits
73
- `*_size-sm|md|lg`, reads `@smui-control-*` (see AI_LESS_OVERRIDES).
83
+ - `size?: "small" | "medium" | "large"` — control density. Emits the
84
+ component's size class; on wired components (Button, TextField,
85
+ SelectField, Chip, Checkbox, RadioButton, Toggle — the exact
86
+ selectors and exemptions are in AI_LESS_OVERRIDES "Control sizing")
87
+ the wired rule reads `@smui-control-h-*` at compile time and
88
+ `--smui-control-h-*` at runtime (for Chip that is the base
89
+ `.smwb-chip` rule — its `_size-small` class pins 24px and does not
90
+ read the token).
74
91
  - `color?: "primary" | "secondary" | "error" | "success" | "warning"
75
- | "info"` — semantic color, resolves through `--smui-<name>Color*`.
92
+ | "info"` — semantic color, resolves through `--smui-<name>Color*`.
76
93
  - `variant?: …` — structural style; component-specific values.
77
94
 
78
95
  Authoritative per-component prop surface = the exported `*Props`
@@ -85,24 +102,24 @@ grep -nE 'export interface .*Props|size\?|color\?|variant\?' \
85
102
 
86
103
  Representative current values:
87
104
 
88
- | Component | variant | color | size | other appearance props |
89
- |---|---|---|---|---|
90
- | Button | contained\|text\|outlined | (colorTheme:primary) | small\|medium\|large | `fullWidth`, `icon`, `iconProps` |
91
- | FloatingButton | default\|extended | primary\|secondary\|error\|success\|warning\|info | small\|medium\|large | `type` |
92
- | Chip | filled\|outlined | — | — | `icon`, `deleteIcon`, `selected` |
93
- | TextField | outlined\|filled | — | — | `startAdornment`, `endAdornment`, `inline`, `fullWidth` |
94
- | SelectField | outlined\|filled | — | — | `chips`, `search`, `endAdornment`, `optionRenderer` |
95
- | Card | filled\|elevated\|outlined | — | — | `disabled` |
96
- | Avatar | circular\|rounded\|square | (`color` = bg of fallback) | small\|medium\|large \| px | — |
97
- | Badge | inside\|outside | primary\|success\|danger | — | `vertical`, `horizontal` |
98
- | Skeleton | text\|circular\|rounded\|rectangular | — | (`width`/`height`) | `animation` |
99
- | Pagination | — | — | small\|medium | `showFirstButton`, `showLastButton` |
100
- | Message | outlined\|filled\|left-accent | (`type`: success/error/warning/info) | — | `onClose` |
101
- | Modal | — | — | small\|large\|fullscreen | `backdrop`, `animation` |
102
- | ProgressIndicator | circular\|linear | — | — | `type` det/indet, `progressValue` |
103
- | Divider | fullWidth\|inset\|middle | — | — | `orientation`, `textAlign` |
104
- | Slider | continuous\|discrete | — | — | `withTicks`, `valueField` |
105
- | Tabs/Tab | — | — | — | `scrollable`, `stacked`, `icon` |
105
+ | Component | variant | color | size | other appearance props |
106
+ | ----------------- | ------------------------------------ | ------------------------------------------------- | -------------------------- | ------------------------------------------------------- |
107
+ | Button | contained\|text\|outlined | (colorTheme:primary) | small\|medium\|large | `fullWidth`, `icon`, `iconProps` |
108
+ | FloatingButton | default\|extended | primary\|secondary\|error\|success\|warning\|info | small\|medium\|large | `type` |
109
+ | Chip | filled\|outlined | — | — | `icon`, `deleteIcon`, `selected` |
110
+ | TextField | outlined\|filled | — | — | `startAdornment`, `endAdornment`, `inline`, `fullWidth` |
111
+ | SelectField | outlined\|filled | — | — | `chips`, `search`, `endAdornment`, `optionRenderer` |
112
+ | Card | filled\|elevated\|outlined | — | — | `disabled` |
113
+ | Avatar | circular\|rounded\|square | (`color` = bg of fallback) | small\|medium\|large \| px | — |
114
+ | Badge | inside\|outside | primary\|success\|danger | — | `vertical`, `horizontal` |
115
+ | Skeleton | text\|circular\|rounded\|rectangular | — | (`width`/`height`) | `animation` |
116
+ | Pagination | — | — | small\|medium | `showFirstButton`, `showLastButton` |
117
+ | Message | outlined\|filled\|left-accent | (`type`: success/error/warning/info) | — | `onClose` |
118
+ | Modal | — | — | small\|large\|fullscreen | `backdrop`, `animation` |
119
+ | ProgressIndicator | circular\|linear | — | — | `type` det/indet, `progressValue` |
120
+ | Divider | fullWidth\|inset\|middle | — | — | `orientation`, `textAlign` |
121
+ | Slider | continuous\|discrete | — | — | `withTicks`, `valueField` |
122
+ | Tabs/Tab | — | — | — | `scrollable`, `stacked`, `icon` |
106
123
 
107
124
  (The exported `*Props` interface is the source of truth; this table is
108
125
  a navigational summary, not exhaustive.)
@@ -133,20 +150,47 @@ grep -oE 'var\(--smui-[a-zA-Z0-9-]+' @smwb/ui-styles/less/components/<name>/<nam
133
150
 
134
151
  ```css
135
152
  /* B. Tooltip: dark slate, at runtime, no rebuild */
136
- :root { --smui-tooltipBg: #37474f; --smui-tooltipTextColor: #fff; }
153
+ :root {
154
+ --smui-tooltipBg: #37474f;
155
+ --smui-tooltipTextColor: #fff;
156
+ }
137
157
  ```
138
158
 
139
159
  ```tsx
140
160
  // C. FloatingButton: semantic color + size via props
141
- <FloatingButton color="success" size="large" variant="extended">Save</FloatingButton>
161
+ <FloatingButton color="success" size="large" variant="extended">
162
+ Save
163
+ </FloatingButton>
142
164
  ```
143
165
 
144
166
  ```css
145
167
  /* D. Scope a denser theme to a region (runtime, cascades) */
146
- .compact { --smui-space-md: 8px; --smui-space-lg: 12px;
147
- --smui-control-h-md: 32px; }
168
+ .compact {
169
+ --smui-space-md: 8px;
170
+ --smui-space-lg: 12px;
171
+ --smui-control-h-md: 32px;
172
+ }
148
173
  ```
149
174
 
175
+ > Recipe D is live for control heights: `--smui-control-h-sm|md|lg` are
176
+ > declared in the `.smui-tokens-light()` mixin ONLY (`variables.less`)
177
+ > — density is theme-independent, and the light `:root` block applies
178
+ > under `data-theme="dark"` too (same precedent as `--smui-space-*` /
179
+ > `--smui-radius-*`); re-declaring them in the dark mixin would add a
180
+ > higher-specificity `:root[data-theme="dark"]` copy that silently
181
+ > resets a consumer's global `:root` density override in dark mode —
182
+ > and read via
183
+ > `var(--smui-control-h-*, @smui-control-h-*)` by Button, TextField,
184
+ > SelectField, Chip, Checkbox, RadioButton and Toggle (exact selectors
185
+ > and the machine-checked list: AI_LESS_OVERRIDES "Control sizing"). So
186
+ > density is overridable BOTH at compile time (`@smui-control-h-md` in
187
+ > `theme.config`, see AI_LESS_OVERRIDES) and at runtime per subtree as
188
+ > above. Exempt and do not expect a response: `--filled` and `--inline`
189
+ > TextField/SelectField, FloatingButton, Avatar, Pagination,
190
+ > ProgressIndicator, StatusDot, Slider, Modal, Rating. The pickers
191
+ > (DatePicker/TimePicker/DateTimePicker) have no wiring of their own —
192
+ > they inherit through their inner TextField + Button.
193
+
150
194
  ```less
151
195
  // E. Whole-library rebrand (compile-time) — see AI_LESS_OVERRIDES recipes
152
196
  @primaryColor: @md-deepPurple-600;