@slotted/styles 0.0.0-stage → 0.1.0-beta.1

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 (254) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +10 -2
  3. package/package.json +276 -3
  4. package/src/accordion/accordion.css +96 -0
  5. package/src/accordion/accordion.tokens.json +14 -0
  6. package/src/action-bar/action-bar.css +455 -0
  7. package/src/action-bar/action-bar.tokens.json +50 -0
  8. package/src/action-sheet/action-sheet.css +462 -0
  9. package/src/action-sheet/action-sheet.tokens.json +59 -0
  10. package/src/alert/alert.css +764 -0
  11. package/src/alert/alert.tokens.json +77 -0
  12. package/src/app-shell/app-shell.css +1899 -0
  13. package/src/app-shell/app-shell.tokens.json +88 -0
  14. package/src/aspect-ratio/aspect-ratio.css +131 -0
  15. package/src/aspect-ratio/aspect-ratio.tokens.json +1 -0
  16. package/src/attachment/attachment.css +906 -0
  17. package/src/attachment/attachment.tokens.json +85 -0
  18. package/src/avatar/avatar.css +598 -0
  19. package/src/avatar/avatar.tokens.json +64 -0
  20. package/src/avatar-group/avatar-group.css +268 -0
  21. package/src/avatar-group/avatar-group.tokens.json +16 -0
  22. package/src/badge/badge.css +462 -0
  23. package/src/badge/badge.tokens.json +58 -0
  24. package/src/breadcrumb/breadcrumb.css +441 -0
  25. package/src/breadcrumb/breadcrumb.tokens.json +50 -0
  26. package/src/button/button.css +754 -0
  27. package/src/button/button.tokens.json +72 -0
  28. package/src/button-group/button-group.css +455 -0
  29. package/src/button-group/button-group.tokens.json +11 -0
  30. package/src/calendar/calendar.css +846 -0
  31. package/src/calendar/calendar.tokens.json +67 -0
  32. package/src/card/card.css +602 -0
  33. package/src/card/card.tokens.json +68 -0
  34. package/src/carousel/carousel.css +860 -0
  35. package/src/carousel/carousel.tokens.json +62 -0
  36. package/src/cascader/cascader.css +1320 -0
  37. package/src/cascader/cascader.tokens.json +103 -0
  38. package/src/chart/chart.css +1473 -0
  39. package/src/chart/chart.tokens.json +107 -0
  40. package/src/checkbox/checkbox.css +1011 -0
  41. package/src/checkbox/checkbox.tokens.json +102 -0
  42. package/src/checkbox-group/checkbox-group.css +70 -0
  43. package/src/checkbox-group/checkbox-group.tokens.json +6 -0
  44. package/src/code-block/code-block.css +555 -0
  45. package/src/code-block/code-block.tokens.json +69 -0
  46. package/src/collapsible/collapsible.css +546 -0
  47. package/src/collapsible/collapsible.tokens.json +55 -0
  48. package/src/color-picker/color-picker.css +607 -0
  49. package/src/color-picker/color-picker.tokens.json +58 -0
  50. package/src/column-manager/column-manager.css +452 -0
  51. package/src/column-manager/column-manager.tokens.json +43 -0
  52. package/src/combobox/combobox.css +1048 -0
  53. package/src/combobox/combobox.tokens.json +112 -0
  54. package/src/command-palette/command-palette.css +1000 -0
  55. package/src/command-palette/command-palette.tokens.json +75 -0
  56. package/src/container/container.css +198 -0
  57. package/src/container/container.tokens.json +18 -0
  58. package/src/context-menu/context-menu.css +104 -0
  59. package/src/context-menu/context-menu.tokens.json +11 -0
  60. package/src/currency-field/currency-field.css +787 -0
  61. package/src/currency-field/currency-field.tokens.json +80 -0
  62. package/src/dashboard-grid/dashboard-grid.css +748 -0
  63. package/src/dashboard-grid/dashboard-grid.tokens.json +67 -0
  64. package/src/data-grid/data-grid.css +2484 -0
  65. package/src/data-grid/data-grid.tokens.json +100 -0
  66. package/src/data-list/data-list.css +455 -0
  67. package/src/data-list/data-list.tokens.json +35 -0
  68. package/src/date-field/date-field.css +560 -0
  69. package/src/date-field/date-field.tokens.json +80 -0
  70. package/src/date-picker/date-picker.css +420 -0
  71. package/src/date-picker/date-picker.tokens.json +49 -0
  72. package/src/date-range-picker/date-range-picker.css +983 -0
  73. package/src/date-range-picker/date-range-picker.tokens.json +109 -0
  74. package/src/datetime-field/datetime-field.css +850 -0
  75. package/src/datetime-field/datetime-field.tokens.json +91 -0
  76. package/src/datetime-picker/datetime-picker.css +843 -0
  77. package/src/datetime-picker/datetime-picker.tokens.json +78 -0
  78. package/src/datetime-range-picker/datetime-range-picker.css +1375 -0
  79. package/src/datetime-range-picker/datetime-range-picker.tokens.json +135 -0
  80. package/src/description-list/description-list.css +675 -0
  81. package/src/description-list/description-list.tokens.json +66 -0
  82. package/src/detail-panel/detail-panel.css +329 -0
  83. package/src/detail-panel/detail-panel.tokens.json +33 -0
  84. package/src/dialog/dialog.css +968 -0
  85. package/src/dialog/dialog.tokens.json +66 -0
  86. package/src/divider/divider.css +131 -0
  87. package/src/divider/divider.tokens.json +18 -0
  88. package/src/drawer/drawer.css +1303 -0
  89. package/src/drawer/drawer.tokens.json +75 -0
  90. package/src/entity-picker/entity-picker.css +1367 -0
  91. package/src/entity-picker/entity-picker.tokens.json +118 -0
  92. package/src/event-calendar/event-calendar.css +2148 -0
  93. package/src/event-calendar/event-calendar.tokens.json +87 -0
  94. package/src/field/field.css +707 -0
  95. package/src/field/field.tokens.json +58 -0
  96. package/src/field-group/field-group.css +226 -0
  97. package/src/field-group/field-group.tokens.json +33 -0
  98. package/src/filter-bar/filter-bar.css +1306 -0
  99. package/src/filter-bar/filter-bar.tokens.json +78 -0
  100. package/src/form/form.css +218 -0
  101. package/src/form/form.tokens.json +32 -0
  102. package/src/fullscreen/fullscreen.css +376 -0
  103. package/src/fullscreen/fullscreen.tokens.json +50 -0
  104. package/src/grid/grid.css +173 -0
  105. package/src/grid/grid.tokens.json +20 -0
  106. package/src/highlight/highlight.css +135 -0
  107. package/src/highlight/highlight.tokens.json +16 -0
  108. package/src/hover-card/hover-card.css +93 -0
  109. package/src/hover-card/hover-card.tokens.json +17 -0
  110. package/src/icon/icon.css +136 -0
  111. package/src/icon/icon.tokens.json +14 -0
  112. package/src/image/image.css +449 -0
  113. package/src/image/image.tokens.json +27 -0
  114. package/src/import-export-center/import-export-center.css +1175 -0
  115. package/src/import-export-center/import-export-center.tokens.json +84 -0
  116. package/src/inline/inline.css +149 -0
  117. package/src/inline/inline.tokens.json +14 -0
  118. package/src/inline-message/inline-message.css +396 -0
  119. package/src/inline-message/inline-message.tokens.json +19 -0
  120. package/src/kbd/kbd.css +490 -0
  121. package/src/kbd/kbd.tokens.json +40 -0
  122. package/src/link/link.css +237 -0
  123. package/src/link/link.tokens.json +25 -0
  124. package/src/list/list.css +240 -0
  125. package/src/list/list.tokens.json +42 -0
  126. package/src/list-item/list-item.css +937 -0
  127. package/src/list-item/list-item.tokens.json +114 -0
  128. package/src/listbox/listbox.css +674 -0
  129. package/src/listbox/listbox.tokens.json +72 -0
  130. package/src/loading-overlay/loading-overlay.css +730 -0
  131. package/src/loading-overlay/loading-overlay.tokens.json +48 -0
  132. package/src/markdown/markdown.css +168 -0
  133. package/src/markdown/markdown.tokens.json +18 -0
  134. package/src/menu/menu.css +817 -0
  135. package/src/menu/menu.tokens.json +78 -0
  136. package/src/menubar/menubar.css +170 -0
  137. package/src/menubar/menubar.tokens.json +32 -0
  138. package/src/message/message.css +1453 -0
  139. package/src/message/message.tokens.json +85 -0
  140. package/src/message-scroller/message-scroller.css +371 -0
  141. package/src/message-scroller/message-scroller.tokens.json +47 -0
  142. package/src/multi-select/multi-select.css +1427 -0
  143. package/src/multi-select/multi-select.tokens.json +114 -0
  144. package/src/navigation-menu/navigation-menu.css +1029 -0
  145. package/src/navigation-menu/navigation-menu.tokens.json +70 -0
  146. package/src/notification-center/notification-center.css +856 -0
  147. package/src/notification-center/notification-center.tokens.json +84 -0
  148. package/src/number-field/number-field.css +794 -0
  149. package/src/number-field/number-field.tokens.json +80 -0
  150. package/src/otp-input/otp-input.css +525 -0
  151. package/src/otp-input/otp-input.tokens.json +69 -0
  152. package/src/page/page.css +179 -0
  153. package/src/page/page.tokens.json +20 -0
  154. package/src/page-header/page-header.css +1181 -0
  155. package/src/page-header/page-header.tokens.json +71 -0
  156. package/src/pagination/pagination.css +500 -0
  157. package/src/pagination/pagination.tokens.json +56 -0
  158. package/src/popover/popover.css +526 -0
  159. package/src/popover/popover.tokens.json +60 -0
  160. package/src/progress-indicator/progress-indicator.css +1584 -0
  161. package/src/progress-indicator/progress-indicator.tokens.json +50 -0
  162. package/src/prompt-composer/prompt-composer.css +680 -0
  163. package/src/prompt-composer/prompt-composer.tokens.json +99 -0
  164. package/src/prose/prose.css +733 -0
  165. package/src/prose/prose.tokens.json +79 -0
  166. package/src/radio-group/radio-group.css +778 -0
  167. package/src/radio-group/radio-group.tokens.json +103 -0
  168. package/src/rating/rating.css +1071 -0
  169. package/src/rating/rating.tokens.json +88 -0
  170. package/src/result-state/result-state.css +980 -0
  171. package/src/result-state/result-state.tokens.json +63 -0
  172. package/src/runtime-properties.mjs +321 -0
  173. package/src/saved-views/saved-views.css +394 -0
  174. package/src/saved-views/saved-views.tokens.json +41 -0
  175. package/src/scroll-area/scroll-area.css +481 -0
  176. package/src/scroll-area/scroll-area.tokens.json +15 -0
  177. package/src/section/section.css +177 -0
  178. package/src/section/section.tokens.json +39 -0
  179. package/src/segmented-control/segmented-control.css +564 -0
  180. package/src/segmented-control/segmented-control.tokens.json +67 -0
  181. package/src/select/select.css +1593 -0
  182. package/src/select/select.tokens.json +110 -0
  183. package/src/side-navigation/side-navigation.css +1096 -0
  184. package/src/side-navigation/side-navigation.tokens.json +87 -0
  185. package/src/skeleton/skeleton.css +431 -0
  186. package/src/skeleton/skeleton.tokens.json +29 -0
  187. package/src/slider/slider.css +792 -0
  188. package/src/slider/slider.tokens.json +75 -0
  189. package/src/sparkline/sparkline.css +282 -0
  190. package/src/sparkline/sparkline.tokens.json +45 -0
  191. package/src/spinner/spinner.css +224 -0
  192. package/src/spinner/spinner.tokens.json +8 -0
  193. package/src/split-button/split-button.css +253 -0
  194. package/src/split-button/split-button.tokens.json +12 -0
  195. package/src/splitter/splitter.css +336 -0
  196. package/src/splitter/splitter.tokens.json +24 -0
  197. package/src/stack/stack.css +128 -0
  198. package/src/stack/stack.tokens.json +14 -0
  199. package/src/stat-card/stat-card.css +641 -0
  200. package/src/stat-card/stat-card.tokens.json +95 -0
  201. package/src/status-indicator/status-indicator.css +481 -0
  202. package/src/status-indicator/status-indicator.tokens.json +38 -0
  203. package/src/stepper/stepper.css +629 -0
  204. package/src/stepper/stepper.tokens.json +72 -0
  205. package/src/switch/switch.css +703 -0
  206. package/src/switch/switch.tokens.json +75 -0
  207. package/src/table/table.css +1482 -0
  208. package/src/table/table.tokens.json +69 -0
  209. package/src/table-of-contents/table-of-contents.css +533 -0
  210. package/src/table-of-contents/table-of-contents.tokens.json +53 -0
  211. package/src/tabs/tabs.css +998 -0
  212. package/src/tabs/tabs.tokens.json +82 -0
  213. package/src/tag/tag.css +768 -0
  214. package/src/tag/tag.tokens.json +85 -0
  215. package/src/tags-input/tags-input.css +757 -0
  216. package/src/tags-input/tags-input.tokens.json +84 -0
  217. package/src/text-field/text-field.css +900 -0
  218. package/src/text-field/text-field.tokens.json +87 -0
  219. package/src/textarea/textarea.css +365 -0
  220. package/src/textarea/textarea.tokens.json +59 -0
  221. package/src/time-field/time-field.css +719 -0
  222. package/src/time-field/time-field.tokens.json +86 -0
  223. package/src/time-picker/time-picker.css +665 -0
  224. package/src/time-picker/time-picker.tokens.json +66 -0
  225. package/src/time-range-picker/time-range-picker.css +1287 -0
  226. package/src/time-range-picker/time-range-picker.tokens.json +134 -0
  227. package/src/timeline/timeline.css +1596 -0
  228. package/src/timeline/timeline.tokens.json +96 -0
  229. package/src/toast/toast.css +943 -0
  230. package/src/toast/toast.tokens.json +90 -0
  231. package/src/toggle/toggle.css +290 -0
  232. package/src/toggle/toggle.tokens.json +54 -0
  233. package/src/toggle-group/toggle-group.css +463 -0
  234. package/src/toggle-group/toggle-group.tokens.json +54 -0
  235. package/src/toolbar/toolbar.css +434 -0
  236. package/src/toolbar/toolbar.tokens.json +49 -0
  237. package/src/tooltip/tooltip.css +368 -0
  238. package/src/tooltip/tooltip.tokens.json +39 -0
  239. package/src/top-navigation/top-navigation.css +1287 -0
  240. package/src/top-navigation/top-navigation.tokens.json +91 -0
  241. package/src/tour/tour.css +680 -0
  242. package/src/tour/tour.tokens.json +67 -0
  243. package/src/transfer/transfer.css +571 -0
  244. package/src/transfer/transfer.tokens.json +49 -0
  245. package/src/tree/tree.css +1000 -0
  246. package/src/tree/tree.tokens.json +80 -0
  247. package/src/typography/typography.css +211 -0
  248. package/src/typography/typography.tokens.json +31 -0
  249. package/src/upload/upload.css +1706 -0
  250. package/src/upload/upload.tokens.json +123 -0
  251. package/src/visually-hidden/visually-hidden.css +52 -0
  252. package/src/visually-hidden/visually-hidden.tokens.json +1 -0
  253. package/src/wizard/wizard.css +740 -0
  254. package/src/wizard/wizard.tokens.json +63 -0
@@ -0,0 +1,58 @@
1
+ [
2
+ "--slotted-control-font-family",
3
+ "--slotted-control-font-size-lg",
4
+ "--slotted-control-font-size-md",
5
+ "--slotted-control-font-size-sm",
6
+ "--slotted-control-height-lg",
7
+ "--slotted-control-height-md",
8
+ "--slotted-control-height-sm",
9
+ "--slotted-control-icon-size-md",
10
+ "--slotted-control-icon-size-sm",
11
+ "--slotted-control-inner-size-md",
12
+ "--slotted-control-inner-size-sm",
13
+ "--slotted-control-radius",
14
+ "--slotted-control-transition-duration",
15
+ "--slotted-control-transition-easing",
16
+ "--slotted-disabled-foreground",
17
+ "--slotted-field-action-color",
18
+ "--slotted-field-action-color-active",
19
+ "--slotted-field-action-color-hover",
20
+ "--slotted-field-action-radius",
21
+ "--slotted-field-column-gap",
22
+ "--slotted-field-counter-color",
23
+ "--slotted-field-counter-invalid-color",
24
+ "--slotted-field-font-family",
25
+ "--slotted-field-header-gap",
26
+ "--slotted-field-help-color",
27
+ "--slotted-field-help-radius",
28
+ "--slotted-field-help-surface-active",
29
+ "--slotted-field-help-surface-hover",
30
+ "--slotted-field-icon-size-min",
31
+ "--slotted-field-label-color",
32
+ "--slotted-field-label-font-weight",
33
+ "--slotted-field-label-inline-size",
34
+ "--slotted-field-line-height",
35
+ "--slotted-field-mark-color",
36
+ "--slotted-field-mark-gap",
37
+ "--slotted-field-mark-text-color",
38
+ "--slotted-field-row-gap",
39
+ "--slotted-focus-ring-color",
40
+ "--slotted-focus-ring-offset",
41
+ "--slotted-focus-ring-width",
42
+ "--slotted-font-size-xs",
43
+ "--slotted-font-weight-medium",
44
+ "--slotted-font-weight-regular",
45
+ "--slotted-line-height-sm",
46
+ "--slotted-space-1",
47
+ "--slotted-space-2",
48
+ "--slotted-space-3",
49
+ "--slotted-space-5",
50
+ "--slotted-target-comfortable",
51
+ "--slotted-target-min",
52
+ "--slotted-text",
53
+ "--slotted-text-muted",
54
+ "--slotted-tone-accent-text",
55
+ "--slotted-tone-danger-text",
56
+ "--slotted-tone-secondary-subtle-active",
57
+ "--slotted-tone-secondary-subtle-hover"
58
+ ]
@@ -0,0 +1,226 @@
1
+ @layer slotted.components {
2
+ /**
3
+ * ── The group ──────────────────────────────────────────────────────────
4
+ *
5
+ * A set of fields under one name. The element is a native `fieldset` and the
6
+ * name is a native `legend`, which is the technique the APG's naming practice
7
+ * calls for under its Rule 3: the `group` role and the accessible name both
8
+ * arrive without a single ARIA attribute, and `disabled` on the fieldset
9
+ * disables every control inside it with nothing passed down.
10
+ *
11
+ * The user agent's own fieldset carries a border, a padding and a
12
+ * `min-inline-size: min-content` that no form wants; all three are removed
13
+ * here, and the last of them is the one that matters — without it a group
14
+ * refuses to shrink below the width of its widest control, and a form in a
15
+ * drawer overflows.
16
+ *
17
+ * The fieldset stays a block. A `legend` inside a grid or flex container is
18
+ * laid out by rules of its own in every engine, so the grid that holds the
19
+ * fields is a `content` element the family draws, and the legend never
20
+ * competes with it.
21
+ */
22
+ [data-ui='field-group'][data-part='root'] {
23
+ --_font-size: var(--slotted-control-font-size-lg, 14px);
24
+ /** Legend to its own description, and description to error. */
25
+ --_message-gap: var(--slotted-field-group-message-gap, var(--slotted-space-2, 0.25rem));
26
+ /**
27
+ * The last thing said about the set, to the first field in it. One step
28
+ * wider than the distance between two fields, which is the correction the
29
+ * first capture asked for: held at the same value, the description read as
30
+ * belonging to the field under it rather than to the set.
31
+ */
32
+ --_content-gap: var(--slotted-field-group-content-gap, var(--slotted-space-7, 1.25rem));
33
+ /** One field to the next. */
34
+ --_field-gap: var(--slotted-field-group-field-gap, var(--slotted-space-6, 1rem));
35
+
36
+ border: 0;
37
+ display: block;
38
+ font-family: var(
39
+ --slotted-field-group-font-family,
40
+ var(--slotted-control-font-family, sans-serif)
41
+ );
42
+ margin: 0;
43
+ min-inline-size: 0;
44
+ padding: 0;
45
+ }
46
+
47
+ /* Legend, then what is said about the set, then the set. */
48
+ [data-ui='field-group'][data-part='root'] > * + * {
49
+ margin-block-start: var(--_message-gap);
50
+ }
51
+
52
+ /* `inline-message` zeroes its root's margin at the weight of the rule above,
53
+ so the order the two stylesheets load in decided the gap; a third
54
+ attribute decides it here. */
55
+ [data-ui='field-group'][data-part='root'] > * + [data-ui='inline-message'] {
56
+ margin-block-start: var(--_message-gap);
57
+ }
58
+
59
+ [data-ui='field-group'][data-part='root'] > [data-part='content'] {
60
+ margin-block-start: var(--_content-gap);
61
+ }
62
+
63
+ /* ── Size ─────────────────────────────────────────────────────────────
64
+ *
65
+ * The same three steps a field has, and for the same reason: a group in a
66
+ * dense table shrinks with the controls it holds. The legend reads the control
67
+ * type scale one step above the field label it sits over — the difference
68
+ * between a legend and a label at the same step is weight rather than size,
69
+ * because a third type scale would be a fourth thing for a theme to retune.
70
+ */
71
+
72
+ [data-ui='field-group'][data-part='root'][data-size='sm'] {
73
+ --_font-size: var(--slotted-control-font-size-md, 13px);
74
+ }
75
+
76
+ [data-ui='field-group'][data-part='root'][data-size='md'] {
77
+ --_font-size: var(--slotted-control-font-size-lg, 14px);
78
+ }
79
+
80
+ [data-ui='field-group'][data-part='root'][data-size='lg'] {
81
+ --_font-size: var(--slotted-control-font-size-lg, 14px);
82
+ }
83
+
84
+ /* ── The legend ───────────────────────────────────────────────────────
85
+ *
86
+ * The name of the set. The user agent gives a legend an inline padding of its
87
+ * own so it can sit inside the border that is no longer there.
88
+ *
89
+ * It holds whatever the page puts in it, which is what lets GOV.UK's
90
+ * recommendation work: on a page asking one question, the legend contains the
91
+ * page's `h1`, so a reader hears the question once rather than twice.
92
+ */
93
+ [data-ui='field-group'] > [data-part='legend'] {
94
+ color: var(--slotted-field-group-legend-color, var(--slotted-text));
95
+ display: block;
96
+ font-size: var(--_font-size);
97
+ font-weight: var(
98
+ --slotted-field-group-legend-font-weight,
99
+ var(--slotted-font-weight-semibold, 600)
100
+ );
101
+ line-height: var(--slotted-field-group-line-height, var(--slotted-line-height-sm, 1.45));
102
+ padding: 0;
103
+ transition: color var(--slotted-control-transition-duration)
104
+ var(--slotted-control-transition-easing);
105
+ }
106
+
107
+ /**
108
+ * The necessity marker, drawn on the legend for the same reason a field draws
109
+ * it on the label: a set where one answer is required says so where its name
110
+ * is. The glyph takes the danger ink and the words do not, which is the field
111
+ * family's decision applied to the element one level up.
112
+ */
113
+ [data-ui='field-group'] > [data-part='legend'] > [data-part='mark'] {
114
+ color: var(--slotted-field-group-mark-color, var(--slotted-tone-danger-text));
115
+ margin-inline-start: var(--slotted-field-group-mark-gap, var(--slotted-space-2, 0.25rem));
116
+ overflow-wrap: normal;
117
+ /* Its own bidi run, for the reason the field's marker records: a Latin
118
+ legend in a right-to-left document is one left-to-right run, and a marker
119
+ that joined it lost the distance written as `margin-inline-start`. */
120
+ unicode-bidi: isolate;
121
+ }
122
+
123
+ /**
124
+ * A heading inside the legend. GOV.UK recommends it on a page that asks one
125
+ * question — the legend holds the page's `h1`, so a reader hears the question
126
+ * once rather than twice — and a user agent's own heading margins would put
127
+ * the necessity marker on a line of its own below it.
128
+ *
129
+ * The heading keeps its own type. The legend steps with the controls it
130
+ * names, and a page heading is a page's decision rather than a control's; a
131
+ * `font: inherit` here would shrink every question page's title to the size
132
+ * of a form label.
133
+ */
134
+ [data-ui='field-group'] > [data-part='legend'] > :is(h1, h2, h3, h4, h5, h6) {
135
+ display: inline;
136
+ font-family: var(
137
+ --slotted-font-family-heading,
138
+ var(--slotted-font-family-sans, ui-sans-serif, system-ui, sans-serif)
139
+ );
140
+ margin: 0;
141
+ }
142
+
143
+ [data-ui='field-group']:is([data-necessity='optional'], [data-necessity='words'])
144
+ > [data-part='legend']
145
+ > [data-part='mark'] {
146
+ color: var(--slotted-field-group-mark-text-color, var(--slotted-text-muted));
147
+ font-size: var(--slotted-control-font-size-sm, 12px);
148
+ font-weight: var(--slotted-font-weight-regular, 400);
149
+ }
150
+
151
+ /**
152
+ * A message with nothing to say is withdrawn rather than left as an empty
153
+ * line, and `[data-reserve]` is the exception a form uses to keep the fields
154
+ * below from moving when the error arrives. The same two rules the field
155
+ * writes, because the group holds the same two messages.
156
+ */
157
+ [data-ui='field-group']
158
+ > [data-ui='inline-message']:not([data-reserve]):has([data-part='text']:empty) {
159
+ display: none;
160
+ }
161
+
162
+ /**
163
+ * The type of what a group says, and it is the field's (F1): one step under
164
+ * the smallest control type, from the type scale, and one weight up for an
165
+ * outcome — an error or a success — over the help. A set and the fields
166
+ * inside it are read as one form, so the two families state one rule. The
167
+ * selector carries the root's part so it outweighs the message family's own
168
+ * root rule, which has the same two attributes.
169
+ */
170
+ [data-ui='field-group'][data-part='root'] > [data-ui='inline-message'] {
171
+ font-size: var(--slotted-font-size-xs, 0.75rem);
172
+ }
173
+
174
+ [data-ui='field-group'][data-part='root'] > [data-ui='inline-message'][data-tone='danger'],
175
+ [data-ui='field-group'][data-part='root'] > [data-ui='inline-message'][data-tone='success'] {
176
+ font-weight: var(--slotted-font-weight-medium, 500);
177
+ }
178
+
179
+ /* ── The set ──────────────────────────────────────────────────────────
180
+ *
181
+ * The fields, in a column or in a row. `orientation` here means what it means
182
+ * in every other family in this library — the direction the children flow —
183
+ * which is why the field's own label axis is called `labelPlacement` rather
184
+ * than borrowing the word.
185
+ *
186
+ * A row wraps. `--slotted-field-group-track-min` is the width a field is
187
+ * given before the row breaks, and it is a line length rather than a step on
188
+ * a scale: `14rem` holds a date, a document number or a short name at the `md`
189
+ * step without the control clipping what is being typed into it.
190
+ */
191
+ [data-ui='field-group'] > [data-part='content'] {
192
+ display: flex;
193
+ flex-direction: column;
194
+ gap: var(--_field-gap);
195
+ min-inline-size: 0;
196
+ }
197
+
198
+ [data-ui='field-group'][data-orientation='horizontal'] > [data-part='content'] {
199
+ flex-direction: row;
200
+ flex-wrap: wrap;
201
+ }
202
+
203
+ [data-ui='field-group'][data-orientation='horizontal'] > [data-part='content'] > * {
204
+ flex: 1 1 var(--slotted-field-group-track-min, 14rem);
205
+ min-inline-size: 0;
206
+ }
207
+
208
+ /* ── Disabled ─────────────────────────────────────────────────────────
209
+ *
210
+ * The platform disables the controls; the family mutes the words. A legend is
211
+ * not a control, so nothing in the fieldset's own `disabled` reaches it, and a
212
+ * section that turned off while keeping its name at full strength reads as a
213
+ * section that is still available.
214
+ *
215
+ * The fields inside are muted by the group providing `disabled` to them, not
216
+ * by a descendant selector: a field used outside a group would then have no
217
+ * disabled appearance at all, which is the defect
218
+ * `docs/history/designs/2026-08-31-field-aware-controls-design.md` records.
219
+ */
220
+ [data-ui='field-group'][data-part='root'][data-disabled] > [data-part='legend'],
221
+ [data-ui='field-group'][data-part='root'][data-disabled]
222
+ > [data-part='legend']
223
+ > [data-part='mark'] {
224
+ color: var(--slotted-disabled-foreground);
225
+ }
226
+ }
@@ -0,0 +1,33 @@
1
+ [
2
+ "--slotted-control-font-family",
3
+ "--slotted-control-font-size-lg",
4
+ "--slotted-control-font-size-md",
5
+ "--slotted-control-font-size-sm",
6
+ "--slotted-control-transition-duration",
7
+ "--slotted-control-transition-easing",
8
+ "--slotted-disabled-foreground",
9
+ "--slotted-field-group-content-gap",
10
+ "--slotted-field-group-field-gap",
11
+ "--slotted-field-group-font-family",
12
+ "--slotted-field-group-legend-color",
13
+ "--slotted-field-group-legend-font-weight",
14
+ "--slotted-field-group-line-height",
15
+ "--slotted-field-group-mark-color",
16
+ "--slotted-field-group-mark-gap",
17
+ "--slotted-field-group-mark-text-color",
18
+ "--slotted-field-group-message-gap",
19
+ "--slotted-field-group-track-min",
20
+ "--slotted-font-family-heading",
21
+ "--slotted-font-family-sans",
22
+ "--slotted-font-size-xs",
23
+ "--slotted-font-weight-medium",
24
+ "--slotted-font-weight-regular",
25
+ "--slotted-font-weight-semibold",
26
+ "--slotted-line-height-sm",
27
+ "--slotted-space-2",
28
+ "--slotted-space-6",
29
+ "--slotted-space-7",
30
+ "--slotted-text",
31
+ "--slotted-text-muted",
32
+ "--slotted-tone-danger-text"
33
+ ]