@greese/ui 1.0.0 → 1.2.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 (210) hide show
  1. package/README.md +19 -14
  2. package/dist/_maps.scss +1 -1
  3. package/dist/_tokens-base.scss +30 -6
  4. package/dist/_tokens.scss +31 -2
  5. package/dist/_utilities-table.scss +1615 -0
  6. package/dist/clipboard.d.ts +18 -0
  7. package/dist/clipboard.js +62 -0
  8. package/dist/css/Button.css +2 -2
  9. package/dist/css/Carousel.css +145 -47
  10. package/dist/css/Checkbox.css +2 -2
  11. package/dist/css/Chip.css +38 -8
  12. package/dist/css/ChoiceGroup.css +42 -1
  13. package/dist/css/Collapsible.css +1 -0
  14. package/dist/css/ColorPicker.css +84 -0
  15. package/dist/css/Combobox.css +2 -2
  16. package/dist/css/Dialog.css +24 -22
  17. package/dist/css/EditableField.css +219 -0
  18. package/dist/css/Input.css +11 -2
  19. package/dist/css/Menu.css +9 -0
  20. package/dist/css/NumberField.css +53 -8
  21. package/dist/css/NumberStepper.css +9 -0
  22. package/dist/css/OtpField.css +1 -1
  23. package/dist/css/PageTransition.css +12 -0
  24. package/dist/css/Radio.css +2 -2
  25. package/dist/css/ScrollCarousel.css +225 -0
  26. package/dist/css/SegmentedControl.css +2 -2
  27. package/dist/css/Select.css +3 -2
  28. package/dist/css/Slider.css +45 -5
  29. package/dist/css/Switch.css +6 -6
  30. package/dist/css/Text.css +14 -14
  31. package/dist/css/Textarea.css +1 -1
  32. package/dist/css/core.css +36 -6
  33. package/dist/css/resets.css +162 -0
  34. package/dist/css.d.ts +2 -0
  35. package/dist/css.js +2 -0
  36. package/dist/greese.css +990 -138
  37. package/dist/index.d.ts +2 -1
  38. package/dist/index.js +2 -1
  39. package/dist/scss/components/_Accordion.scss +2 -0
  40. package/dist/scss/components/_ActionSelect.scss +2 -0
  41. package/dist/scss/components/_Alert.scss +2 -0
  42. package/dist/scss/components/_AppBar.scss +2 -0
  43. package/dist/scss/components/_AspectRatio.scss +2 -0
  44. package/dist/scss/components/_AutoLayout.scss +2 -0
  45. package/dist/scss/components/_Avatar.scss +2 -0
  46. package/dist/scss/components/_Badge.scss +2 -0
  47. package/dist/scss/components/_Box.scss +2 -0
  48. package/dist/scss/components/_Breadcrumbs.scss +2 -0
  49. package/dist/scss/components/_Button.scss +2 -0
  50. package/dist/scss/components/_ButtonGroup.scss +2 -0
  51. package/dist/scss/components/_Card.scss +2 -0
  52. package/dist/scss/components/_Carousel.scss +2 -0
  53. package/dist/scss/components/_Center.scss +2 -0
  54. package/dist/scss/components/_ChatBubble.scss +2 -0
  55. package/dist/scss/components/_Checkbox.scss +2 -0
  56. package/dist/scss/components/_Chip.scss +2 -0
  57. package/dist/scss/components/_ChoiceGroup.scss +2 -0
  58. package/dist/scss/components/_Code.scss +2 -0
  59. package/dist/scss/components/_Collapsible.scss +2 -0
  60. package/dist/scss/components/_ColorPicker.scss +2 -0
  61. package/dist/scss/components/_Combobox.scss +2 -0
  62. package/dist/scss/components/_Container.scss +2 -0
  63. package/dist/scss/components/_Countdown.scss +2 -0
  64. package/dist/scss/components/_DateField.scss +2 -0
  65. package/dist/scss/components/_Dialog.scss +2 -0
  66. package/dist/scss/components/_Diff.scss +2 -0
  67. package/dist/scss/components/_Divider.scss +2 -0
  68. package/dist/scss/components/_Dock.scss +2 -0
  69. package/dist/scss/components/_EditableField.scss +2 -0
  70. package/dist/scss/components/_Field.scss +2 -0
  71. package/dist/scss/components/_Fieldset.scss +2 -0
  72. package/dist/scss/components/_FileInput.scss +2 -0
  73. package/dist/scss/components/_Footer.scss +2 -0
  74. package/dist/scss/components/_Grid.scss +2 -0
  75. package/dist/scss/components/_Header.scss +2 -0
  76. package/dist/scss/components/_Heading.scss +2 -0
  77. package/dist/scss/components/_Icon.scss +2 -0
  78. package/dist/scss/components/_IconButton.scss +2 -0
  79. package/dist/scss/components/_Image.scss +2 -0
  80. package/dist/scss/components/_Indicator.scss +2 -0
  81. package/dist/scss/components/_Input.scss +2 -0
  82. package/dist/scss/components/_Key.scss +2 -0
  83. package/dist/scss/components/_Link.scss +2 -0
  84. package/dist/scss/components/_List.scss +2 -0
  85. package/dist/scss/components/_Media.scss +2 -0
  86. package/dist/scss/components/_Menu.scss +2 -0
  87. package/dist/scss/components/_Motion.scss +2 -0
  88. package/dist/scss/components/_NumberField.scss +2 -0
  89. package/dist/scss/components/_NumberStepper.scss +2 -0
  90. package/dist/scss/components/_OtpField.scss +2 -0
  91. package/dist/scss/components/_PageTransition.scss +2 -0
  92. package/dist/scss/components/_Pagination.scss +2 -0
  93. package/dist/scss/components/_Popover.scss +2 -0
  94. package/dist/scss/components/_Progress.scss +2 -0
  95. package/dist/scss/components/_RadialProgress.scss +2 -0
  96. package/dist/scss/components/_Radio.scss +2 -0
  97. package/dist/scss/components/_Rating.scss +2 -0
  98. package/dist/scss/components/_ScrollCarousel.scss +2 -0
  99. package/dist/scss/components/_ScrollSpy.scss +2 -0
  100. package/dist/scss/components/_SegmentedControl.scss +2 -0
  101. package/dist/scss/components/_Select.scss +2 -0
  102. package/dist/scss/components/_Sidebar.scss +2 -0
  103. package/dist/scss/components/_Skeleton.scss +2 -0
  104. package/dist/scss/components/_Slider.scss +2 -0
  105. package/dist/scss/components/_Spacer.scss +2 -0
  106. package/dist/scss/components/_SpeedDial.scss +2 -0
  107. package/dist/scss/components/_Spinner.scss +2 -0
  108. package/dist/scss/components/_Stack.scss +2 -0
  109. package/dist/scss/components/_Stat.scss +2 -0
  110. package/dist/scss/components/_Status.scss +2 -0
  111. package/dist/scss/components/_Steps.scss +2 -0
  112. package/dist/scss/components/_Swap.scss +2 -0
  113. package/dist/scss/components/_Switch.scss +2 -0
  114. package/dist/scss/components/_Table.scss +2 -0
  115. package/dist/scss/components/_Tabs.scss +2 -0
  116. package/dist/scss/components/_Text.scss +2 -0
  117. package/dist/scss/components/_TextRotate.scss +2 -0
  118. package/dist/scss/components/_Textarea.scss +2 -0
  119. package/dist/scss/components/_ThemeProvider.scss +2 -0
  120. package/dist/scss/components/_Tile.scss +2 -0
  121. package/dist/scss/components/_Toast.scss +2 -0
  122. package/dist/scss/components/_ToggleButton.scss +2 -0
  123. package/dist/scss/components/_Tooltip.scss +2 -0
  124. package/dist/scss/components/_Type.scss +2 -0
  125. package/dist/scss/components/_Visibility.scss +2 -0
  126. package/dist/scss/components/_VisuallyHidden.scss +2 -0
  127. package/dist/shapes.d.ts +12 -1
  128. package/dist/shapes.js +11 -10
  129. package/dist/style-manifest.json +18837 -132
  130. package/dist/theme.js +6 -1
  131. package/dist/themeFiles/index.d.ts +9 -0
  132. package/dist/themeFiles/index.js +9 -0
  133. package/dist/themeFiles/scssModule.d.ts +100 -0
  134. package/dist/themeFiles/scssModule.js +384 -0
  135. package/dist/themeFiles/spec.d.ts +198 -0
  136. package/dist/themeFiles/spec.js +877 -0
  137. package/dist/tokens.css +30 -1
  138. package/dist/typography.js +1 -1
  139. package/dist/utilities.css +435 -0
  140. package/dist/utilities.d.ts +8 -0
  141. package/dist/utilities.js +75 -0
  142. package/package.json +20 -1
  143. package/src/components/AutoLayout/AutoLayout.scss +2 -26
  144. package/src/components/Carousel/Carousel.scss +122 -126
  145. package/src/components/Checkbox/Checkbox.scss +2 -2
  146. package/src/components/Chip/Chip.scss +63 -8
  147. package/src/components/ChoiceGroup/ChoiceGroup.scss +19 -1
  148. package/src/components/Collapsible/Collapsible.scss +3 -0
  149. package/src/components/ColorPicker/ColorPicker.scss +95 -0
  150. package/src/components/Combobox/Combobox.scss +4 -2
  151. package/src/components/Dialog/Dialog.scss +24 -7
  152. package/src/components/EditableField/EditableField.scss +275 -0
  153. package/src/components/Grid/Grid.scss +2 -70
  154. package/src/components/Input/Input.scss +29 -0
  155. package/src/components/Menu/Menu.scss +18 -0
  156. package/src/components/NumberField/NumberField.scss +56 -9
  157. package/src/components/NumberStepper/NumberStepper.scss +13 -0
  158. package/src/components/PageTransition/PageTransition.scss +29 -0
  159. package/src/components/Radio/Radio.scss +2 -2
  160. package/src/components/ScrollCarousel/ScrollCarousel.scss +142 -0
  161. package/src/components/Select/Select.scss +4 -0
  162. package/src/components/Slider/Slider.scss +51 -6
  163. package/src/components/Stack/Stack.scss +2 -48
  164. package/src/components/Switch/Switch.scss +9 -6
  165. package/src/components/Text/Text.scss +5 -2
  166. package/src/styles/_breakpoint-vars.scss +17 -11
  167. package/src/styles/_controls.scss +2 -2
  168. package/src/styles/_core.scss +1 -0
  169. package/src/styles/_kit.scss +483 -56
  170. package/src/styles/_layout-props.scss +197 -0
  171. package/src/styles/_manifest.scss +55 -25
  172. package/src/styles/_mixins.scss +53 -15
  173. package/src/styles/_slides.scss +112 -0
  174. package/src/styles/_utilities.scss +104 -0
  175. package/src/styles/breakpoints.test.ts +21 -1
  176. package/src/styles/entryPoints.test.ts +25 -2
  177. package/src/styles/index.scss +3 -1
  178. package/src/styles/kit.test.ts +171 -1
  179. package/src/styles/public/_breakpoints.scss +43 -0
  180. package/src/styles/public/_slides.scss +3 -0
  181. package/src/styles/public/_utilities.scss +3 -0
  182. package/src/styles/resets.scss +7 -0
  183. package/src/styles/utilities.test.ts +39 -0
  184. package/themes/bevel.css +187 -187
  185. package/themes/bevel.scss +960 -958
  186. package/themes/candy.css +87 -0
  187. package/themes/candy.scss +32 -0
  188. package/themes/extrude.css +42 -42
  189. package/themes/folio.css +200 -200
  190. package/themes/folio.scss +880 -878
  191. package/themes/forest.css +87 -0
  192. package/themes/forest.scss +32 -0
  193. package/themes/grape.css +87 -0
  194. package/themes/grape.scss +32 -0
  195. package/themes/greese.css +36 -0
  196. package/themes/greese.scss +21 -0
  197. package/themes/mono.css +87 -0
  198. package/themes/mono.scss +32 -0
  199. package/themes/ocean.css +87 -0
  200. package/themes/ocean.scss +32 -0
  201. package/themes/outline.css +18 -18
  202. package/themes/pebble.css +8 -8
  203. package/themes/ridge.css +188 -188
  204. package/themes/ridge.scss +820 -818
  205. package/themes/soft.css +11 -11
  206. package/themes/sunset.css +87 -0
  207. package/themes/sunset.scss +32 -0
  208. package/themes/ticket.css +180 -180
  209. package/themes/ticket.scss +881 -879
  210. package/themes/tilt.css +25 -25
@@ -0,0 +1,197 @@
1
+ // The layout components' responsive props, defined once: Stack, Grid and
2
+ // AutoLayout include them for the configured breakpoints, and
3
+ // `pkg:@greese/ui/scss/breakpoints` writes them again for a set measured
4
+ // against a container (@greese/authoring's panels). Writes no CSS until
5
+ // included.
6
+ @use 'sass:map';
7
+ @use 'config';
8
+ @use 'mixins';
9
+
10
+ $_column-counts: (1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12);
11
+
12
+ @function _column-tokens() {
13
+ $map: ();
14
+
15
+ @each $n in $_column-counts {
16
+ $map: map.set($map, $n, repeat(#{$n}, minmax(0, 1fr)));
17
+ }
18
+
19
+ @return $map;
20
+ }
21
+
22
+ @function _size-tokens() {
23
+ $map: (
24
+ full: #{'1 / -1'},
25
+ );
26
+
27
+ @each $n in $_column-counts {
28
+ $map: map.set($map, $n, span #{$n} / span #{$n});
29
+ }
30
+
31
+ @return $map;
32
+ }
33
+
34
+ @mixin stack($set: config.$breakpoints, $container: null) {
35
+ @include mixins.responsive-prop(
36
+ 'greese-Stack',
37
+ 'direction',
38
+ flex-direction,
39
+ (
40
+ row: row,
41
+ column: column,
42
+ row-reverse: row-reverse,
43
+ column-reverse: column-reverse,
44
+ ),
45
+ $breakpoint-set: $set,
46
+ $container: $container
47
+ );
48
+ @include mixins.responsive-prop(
49
+ 'greese-Stack',
50
+ 'gap',
51
+ gap,
52
+ mixins.space-tokens(),
53
+ $breakpoint-set: $set,
54
+ $container: $container
55
+ );
56
+ @include mixins.responsive-prop(
57
+ 'greese-Stack',
58
+ 'align',
59
+ align-items,
60
+ (
61
+ start: flex-start,
62
+ center: center,
63
+ end: flex-end,
64
+ stretch: stretch,
65
+ baseline: baseline,
66
+ ),
67
+ $breakpoint-set: $set,
68
+ $container: $container
69
+ );
70
+ @include mixins.responsive-prop(
71
+ 'greese-Stack',
72
+ 'justify',
73
+ justify-content,
74
+ (
75
+ start: flex-start,
76
+ center: center,
77
+ end: flex-end,
78
+ between: space-between,
79
+ around: space-around,
80
+ evenly: space-evenly,
81
+ ),
82
+ $breakpoint-set: $set,
83
+ $container: $container
84
+ );
85
+ @include mixins.responsive-prop(
86
+ 'greese-Stack',
87
+ 'wrap',
88
+ flex-wrap,
89
+ (
90
+ wrap: wrap,
91
+ nowrap: nowrap,
92
+ wrap-reverse: wrap-reverse,
93
+ ),
94
+ $breakpoint-set: $set,
95
+ $container: $container
96
+ );
97
+ }
98
+
99
+ @mixin grid($set: config.$breakpoints, $container: null) {
100
+ @include mixins.responsive-prop(
101
+ 'greese-Grid',
102
+ 'columns',
103
+ grid-template-columns,
104
+ _column-tokens(),
105
+ $breakpoint-set: $set,
106
+ $container: $container
107
+ );
108
+
109
+ // After `columns`, so it wins where both apply.
110
+ @include mixins.responsive-prop(
111
+ 'greese-Grid',
112
+ 'min-child',
113
+ grid-template-columns,
114
+ $template: 'repeat(auto-fill, minmax(min(VALUE, 100%), 1fr))',
115
+ $breakpoint-set: $set,
116
+ $container: $container
117
+ );
118
+ @include mixins.responsive-prop(
119
+ 'greese-Grid',
120
+ 'gap',
121
+ gap,
122
+ mixins.space-tokens(),
123
+ $breakpoint-set: $set,
124
+ $container: $container
125
+ );
126
+ @include mixins.responsive-prop(
127
+ 'greese-Grid',
128
+ 'align',
129
+ align-items,
130
+ (
131
+ start: start,
132
+ center: center,
133
+ end: end,
134
+ stretch: stretch,
135
+ ),
136
+ $breakpoint-set: $set,
137
+ $container: $container
138
+ );
139
+ @include mixins.responsive-prop(
140
+ 'greese-Grid',
141
+ 'justify',
142
+ justify-items,
143
+ (
144
+ start: start,
145
+ center: center,
146
+ end: end,
147
+ stretch: stretch,
148
+ ),
149
+ $breakpoint-set: $set,
150
+ $container: $container
151
+ );
152
+ @include mixins.responsive-prop(
153
+ 'greese-Grid',
154
+ 'size',
155
+ grid-column,
156
+ _size-tokens(),
157
+ $container-scope: '.greese-Grid--queries >',
158
+ $breakpoint-set: $set,
159
+ $container: $container
160
+ );
161
+ }
162
+
163
+ @mixin autolayout($set: config.$breakpoints, $container: null) {
164
+ // `gap` sets both gaps and tells the items the column gap.
165
+ @include mixins.responsive-prop(
166
+ 'greese-AutoLayout',
167
+ 'gap',
168
+ (column-gap, row-gap, --greese-autolayout-column-gap),
169
+ mixins.space-tokens(),
170
+ $breakpoint-set: $set,
171
+ $container: $container
172
+ );
173
+
174
+ // After `gap`, so it wins where both apply.
175
+ @include mixins.responsive-prop(
176
+ 'greese-AutoLayout',
177
+ 'row-gap',
178
+ row-gap,
179
+ mixins.space-tokens(),
180
+ $breakpoint-set: $set,
181
+ $container: $container
182
+ );
183
+ @include mixins.responsive-prop(
184
+ 'greese-AutoLayoutItem',
185
+ 'size',
186
+ --greese-autolayoutitem-s,
187
+ $breakpoint-set: $set,
188
+ $container: $container
189
+ );
190
+ @include mixins.responsive-prop(
191
+ 'greese-AutoLayoutItem',
192
+ 'max',
193
+ --greese-autolayoutitem-m,
194
+ $breakpoint-set: $set,
195
+ $container: $container
196
+ );
197
+ }
@@ -113,7 +113,7 @@ $blocks: (
113
113
  parts: ('control', 'indicator', 'indicators', 'viewport',),
114
114
  modifiers: (),
115
115
  part-modifiers: ('control': ('next', 'previous',)),
116
- variables: ('--greese-carousel-dots', '--greese-carousel-gap', '--greese-carousel-gaps', '--greese-carousel-per-view',),
116
+ variables: ('--greese-carousel-dots', '--greese-carousel-duration', '--greese-carousel-enter', '--greese-carousel-exit-mask-from', '--greese-carousel-exit-mask-image', '--greese-carousel-exit-mask-position', '--greese-carousel-exit-mask-repeat', '--greese-carousel-exit-mask-size', '--greese-carousel-exit-opacity', '--greese-carousel-exit-scale', '--greese-carousel-exit-transform', '--greese-carousel-exit-transform-origin', '--greese-carousel-exit-translate', '--greese-carousel-slide-enter', '--greese-carousel-way', '--greese-motion-carousel', '--greese-motion-carousel-back', '--greese-motion-carousel-back-exit-mask-from', '--greese-motion-carousel-back-exit-mask-image', '--greese-motion-carousel-back-exit-mask-position', '--greese-motion-carousel-back-exit-mask-repeat', '--greese-motion-carousel-back-exit-mask-size', '--greese-motion-carousel-back-exit-opacity', '--greese-motion-carousel-back-exit-scale', '--greese-motion-carousel-back-exit-transform', '--greese-motion-carousel-back-exit-transform-origin', '--greese-motion-carousel-back-exit-translate', '--greese-motion-carousel-duration', '--greese-motion-carousel-exit-mask-from', '--greese-motion-carousel-exit-mask-image', '--greese-motion-carousel-exit-mask-position', '--greese-motion-carousel-exit-mask-repeat', '--greese-motion-carousel-exit-mask-size', '--greese-motion-carousel-exit-opacity', '--greese-motion-carousel-exit-scale', '--greese-motion-carousel-exit-transform', '--greese-motion-carousel-exit-transform-origin', '--greese-motion-carousel-exit-translate', '--greese-motion-exit-mask-from', '--greese-motion-exit-mask-image', '--greese-motion-exit-mask-position', '--greese-motion-exit-mask-repeat', '--greese-motion-exit-mask-size', '--greese-motion-exit-opacity', '--greese-motion-exit-scale', '--greese-motion-exit-transform', '--greese-motion-exit-transform-origin', '--greese-motion-exit-translate',),
117
117
  ),
118
118
  'CarouselSlide': (
119
119
  parts: (),
@@ -135,21 +135,21 @@ $blocks: (
135
135
  ),
136
136
  'Checkbox': (
137
137
  parts: ('box', 'description', 'icon', 'input', 'label', 'text',),
138
- modifiers: (),
138
+ modifiers: ('size-lg', 'size-md', 'size-sm', 'size-xl', 'size-xs',),
139
139
  part-modifiers: (),
140
- variables: (),
140
+ variables: ('--greese-choice-box',),
141
141
  ),
142
142
  'Chip': (
143
143
  parts: ('icon', 'remove', 'toggle',),
144
- modifiers: ('accent', 'info', 'negative', 'neutral', 'positive', 'primary', 'secondary', 'selected', 'tertiary', 'warning',),
144
+ modifiers: ('accent', 'info', 'negative', 'neutral', 'positive', 'primary', 'secondary', 'selected', 'size-lg', 'size-md', 'size-sm', 'size-xl', 'size-xs', 'tertiary', 'warning',),
145
145
  part-modifiers: (),
146
- variables: ('--greese-chip-tone', '--greese-chip-tone-on',),
146
+ variables: ('--greese-chip-font', '--greese-chip-height', '--greese-chip-padding', '--greese-chip-remove', '--greese-chip-tone', '--greese-chip-tone-on',),
147
147
  ),
148
148
  'ChoiceGroup': (
149
149
  parts: (),
150
- modifiers: (),
150
+ modifiers: ('size-lg', 'size-md', 'size-sm', 'size-xl', 'size-xs',),
151
151
  part-modifiers: (),
152
- variables: (),
152
+ variables: ('--greese-choice-box', '--greese-choice-description-font', '--greese-choice-font', '--greese-choice-gap',),
153
153
  ),
154
154
  'Code': (
155
155
  parts: (),
@@ -164,16 +164,16 @@ $blocks: (
164
164
  variables: ('--greese-collapsible-icon-turn',),
165
165
  ),
166
166
  'ColorPicker': (
167
- parts: ('alpha', 'area', 'controls', 'hex', 'hue', 'preview', 'sliders', 'swatch', 'swatches', 'thumb',),
168
- modifiers: (),
167
+ parts: ('alpha', 'area', 'channel', 'channels', 'controls', 'fields', 'hex', 'hue', 'preview', 'sliders', 'swatch', 'swatches', 'thumb', 'tool',),
168
+ modifiers: ('size-lg', 'size-md', 'size-sm', 'size-xl', 'size-xs',),
169
169
  part-modifiers: (),
170
- variables: ('--greese-colorpicker-color', '--greese-colorpicker-current', '--greese-colorpicker-hue', '--greese-colorpicker-swatch', '--greese-colorpicker-thumb', '--greese-colorpicker-track', '--greese-colorpicker-x', '--greese-colorpicker-y',),
170
+ variables: ('--greese-colorpicker-color', '--greese-colorpicker-current', '--greese-colorpicker-font', '--greese-colorpicker-hue', '--greese-colorpicker-padding', '--greese-colorpicker-swatch', '--greese-colorpicker-thumb', '--greese-colorpicker-track', '--greese-colorpicker-x', '--greese-colorpicker-y',),
171
171
  ),
172
172
  'Combobox': (
173
173
  parts: ('empty', 'list', 'option', 'popup', 'toggle',),
174
174
  modifiers: (),
175
175
  part-modifiers: (),
176
- variables: (),
176
+ variables: ('--greese-input-height',),
177
177
  ),
178
178
  'Container': (
179
179
  parts: (),
@@ -181,6 +181,12 @@ $blocks: (
181
181
  part-modifiers: (),
182
182
  variables: (),
183
183
  ),
184
+ 'ContextMenu': (
185
+ parts: ('point',),
186
+ modifiers: (),
187
+ part-modifiers: (),
188
+ variables: (),
189
+ ),
184
190
  'Countdown': (
185
191
  parts: ('label', 'separator', 'unit',),
186
192
  modifiers: ('clock',),
@@ -197,7 +203,7 @@ $blocks: (
197
203
  parts: ('body', 'close', 'description', 'footer', 'header', 'title',),
198
204
  modifiers: ('size-full', 'size-lg', 'size-md', 'size-sm', 'size-xl',),
199
205
  part-modifiers: (),
200
- variables: ('--greese-dialog-width', '--greese-motion-backdrop', '--greese-motion-backdrop-duration', '--greese-motion-dialog', '--greese-motion-dialog-exit-mask-from', '--greese-motion-dialog-exit-mask-image', '--greese-motion-dialog-exit-mask-position', '--greese-motion-dialog-exit-mask-repeat', '--greese-motion-dialog-exit-mask-size', '--greese-motion-dialog-exit-opacity', '--greese-motion-dialog-exit-scale', '--greese-motion-dialog-exit-transform', '--greese-motion-dialog-exit-transform-origin', '--greese-motion-dialog-exit-translate', '--greese-motion-drawer', '--greese-motion-drawer-exit-mask-from', '--greese-motion-drawer-exit-mask-image', '--greese-motion-drawer-exit-mask-position', '--greese-motion-drawer-exit-mask-repeat', '--greese-motion-drawer-exit-mask-size', '--greese-motion-drawer-exit-opacity', '--greese-motion-drawer-exit-scale', '--greese-motion-drawer-exit-transform', '--greese-motion-drawer-exit-transform-origin', '--greese-motion-drawer-exit-translate', '--greese-motion-enter-ease', '--greese-motion-exit-duration', '--greese-motion-exit-ease', '--greese-motion-exit-mask-from', '--greese-motion-exit-mask-image', '--greese-motion-exit-mask-position', '--greese-motion-exit-mask-repeat', '--greese-motion-exit-mask-size', '--greese-motion-exit-opacity', '--greese-motion-exit-scale', '--greese-motion-exit-transform', '--greese-motion-exit-transform-origin', '--greese-motion-exit-translate', '--greese-motion-overlay', '--greese-motion-overlay-duration', '--greese-motion-overlay-exit-mask-from', '--greese-motion-overlay-exit-mask-image', '--greese-motion-overlay-exit-mask-position', '--greese-motion-overlay-exit-mask-repeat', '--greese-motion-overlay-exit-mask-size', '--greese-motion-overlay-exit-opacity', '--greese-motion-overlay-exit-scale', '--greese-motion-overlay-exit-transform', '--greese-motion-overlay-exit-transform-origin', '--greese-motion-overlay-exit-translate', '--greese-overlay-enter', '--greese-overlay-exit-mask-from', '--greese-overlay-exit-mask-image', '--greese-overlay-exit-mask-position', '--greese-overlay-exit-mask-repeat', '--greese-overlay-exit-mask-size', '--greese-overlay-exit-opacity', '--greese-overlay-exit-scale', '--greese-overlay-exit-transform', '--greese-overlay-exit-transform-origin', '--greese-overlay-exit-translate', '--greese-overlay-origin', '--greese-scrollbar-gap',),
206
+ variables: ('--greese-dialog-padding', '--greese-dialog-width', '--greese-motion-backdrop', '--greese-motion-backdrop-duration', '--greese-motion-dialog', '--greese-motion-dialog-exit-mask-from', '--greese-motion-dialog-exit-mask-image', '--greese-motion-dialog-exit-mask-position', '--greese-motion-dialog-exit-mask-repeat', '--greese-motion-dialog-exit-mask-size', '--greese-motion-dialog-exit-opacity', '--greese-motion-dialog-exit-scale', '--greese-motion-dialog-exit-transform', '--greese-motion-dialog-exit-transform-origin', '--greese-motion-dialog-exit-translate', '--greese-motion-drawer', '--greese-motion-drawer-exit-mask-from', '--greese-motion-drawer-exit-mask-image', '--greese-motion-drawer-exit-mask-position', '--greese-motion-drawer-exit-mask-repeat', '--greese-motion-drawer-exit-mask-size', '--greese-motion-drawer-exit-opacity', '--greese-motion-drawer-exit-scale', '--greese-motion-drawer-exit-transform', '--greese-motion-drawer-exit-transform-origin', '--greese-motion-drawer-exit-translate', '--greese-motion-enter-ease', '--greese-motion-exit-duration', '--greese-motion-exit-ease', '--greese-motion-exit-mask-from', '--greese-motion-exit-mask-image', '--greese-motion-exit-mask-position', '--greese-motion-exit-mask-repeat', '--greese-motion-exit-mask-size', '--greese-motion-exit-opacity', '--greese-motion-exit-scale', '--greese-motion-exit-transform', '--greese-motion-exit-transform-origin', '--greese-motion-exit-translate', '--greese-motion-overlay', '--greese-motion-overlay-duration', '--greese-motion-overlay-exit-mask-from', '--greese-motion-overlay-exit-mask-image', '--greese-motion-overlay-exit-mask-position', '--greese-motion-overlay-exit-mask-repeat', '--greese-motion-overlay-exit-mask-size', '--greese-motion-overlay-exit-opacity', '--greese-motion-overlay-exit-scale', '--greese-motion-overlay-exit-transform', '--greese-motion-overlay-exit-transform-origin', '--greese-motion-overlay-exit-translate', '--greese-overlay-enter', '--greese-overlay-exit-mask-from', '--greese-overlay-exit-mask-image', '--greese-overlay-exit-mask-position', '--greese-overlay-exit-mask-repeat', '--greese-overlay-exit-mask-size', '--greese-overlay-exit-opacity', '--greese-overlay-exit-scale', '--greese-overlay-exit-transform', '--greese-overlay-exit-transform-origin', '--greese-overlay-exit-translate', '--greese-overlay-origin', '--greese-scrollbar-gap',),
201
207
  ),
202
208
  'Diff': (
203
209
  parts: ('handle', 'item', 'range', 'tag',),
@@ -229,6 +235,12 @@ $blocks: (
229
235
  part-modifiers: (),
230
236
  variables: ('--greese-drawer-dir', '--greese-drawer-edge',),
231
237
  ),
238
+ 'EditableField': (
239
+ parts: ('clear', 'control', 'dial', 'dialDot', 'knob', 'label', 'none', 'number', 'picker', 'range', 'swatch', 'textarea', 'unit', 'value',),
240
+ modifiers: ('checkbox', 'column', 'radio', 'row', 'segmented', 'size-lg', 'size-md', 'size-sm', 'size-xl', 'size-xs', 'switch',),
241
+ part-modifiers: (),
242
+ variables: ('--greese-editablefield-angle', '--greese-editablefield-dial', '--greese-editablefield-height', '--greese-editablefield-swatch',),
243
+ ),
232
244
  'Embed': (
233
245
  parts: (),
234
246
  modifiers: (),
@@ -309,9 +321,9 @@ $blocks: (
309
321
  ),
310
322
  'Input': (
311
323
  parts: ('adornment', 'control',),
312
- modifiers: ('size-lg', 'size-md', 'size-sm', 'size-xl', 'size-xs',),
324
+ modifiers: ('measured', 'size-lg', 'size-md', 'size-sm', 'size-xl', 'size-xs',),
313
325
  part-modifiers: (),
314
- variables: ('--greese-input-height', '--greese-input-padding',),
326
+ variables: ('--greese-input-height', '--greese-input-padding', '--greese-input-size',),
315
327
  ),
316
328
  'Key': (
317
329
  parts: (),
@@ -362,11 +374,17 @@ $blocks: (
362
374
  variables: ('--greese-ease-ease', '--greese-ease-ease-in', '--greese-ease-ease-in-out', '--greese-ease-ease-out', '--greese-ease-in', '--greese-ease-in-out', '--greese-ease-linear', '--greese-ease-out', '--greese-motion-content', '--greese-motion-content-duration', '--greese-motion-delay', '--greese-motion-dir', '--greese-motion-distance', '--greese-motion-duration', '--greese-motion-ease', '--greese-motion-enter-ease', '--greese-motion-exit-mask-from', '--greese-motion-exit-mask-image', '--greese-motion-exit-mask-position', '--greese-motion-exit-mask-repeat', '--greese-motion-exit-mask-size', '--greese-motion-exit-opacity', '--greese-motion-exit-scale', '--greese-motion-exit-transform', '--greese-motion-exit-transform-origin', '--greese-motion-exit-translate', '--greese-motion-index', '--greese-motion-name', '--greese-motion-offset', '--greese-motion-scope', '--greese-motion-stagger', '--greese-motion-theme', '--greese-motion-wait',),
363
375
  ),
364
376
  'NumberField': (
365
- parts: ('step', 'steppers',),
366
- modifiers: (),
377
+ parts: ('clear', 'step', 'steppers',),
378
+ modifiers: ('split',),
367
379
  part-modifiers: (),
368
380
  variables: (),
369
381
  ),
382
+ 'NumberStepper': (
383
+ parts: (),
384
+ modifiers: (),
385
+ part-modifiers: (),
386
+ variables: ('--greese-numberstepper-gap',),
387
+ ),
370
388
  'OtpField': (
371
389
  parts: ('input', 'slot',),
372
390
  modifiers: ('size-lg', 'size-md', 'size-sm', 'size-xl', 'size-xs',),
@@ -375,9 +393,9 @@ $blocks: (
375
393
  ),
376
394
  'PageTransition': (
377
395
  parts: (),
378
- modifiers: ('enter-blur-in', 'enter-depth', 'enter-depth-in', 'enter-fade-down', 'enter-fade-end', 'enter-fade-in', 'enter-fade-start', 'enter-fade-up', 'enter-flip-down', 'enter-flip-left', 'enter-flip-over-down', 'enter-flip-over-left', 'enter-flip-over-right', 'enter-flip-over-up', 'enter-flip-right', 'enter-flip-up', 'enter-hinge', 'enter-iris-down', 'enter-iris-down-left', 'enter-iris-down-right', 'enter-iris-in', 'enter-iris-left', 'enter-iris-right', 'enter-iris-up', 'enter-iris-up-left', 'enter-iris-up-right', 'enter-none', 'enter-pocket-down', 'enter-pocket-down-left', 'enter-pocket-down-right', 'enter-pocket-left', 'enter-pocket-right', 'enter-pocket-up', 'enter-pocket-up-left', 'enter-pocket-up-right', 'enter-pop', 'enter-pop-in', 'enter-scale-in', 'enter-slide-down', 'enter-slide-left', 'enter-slide-right', 'enter-slide-up', 'enter-swing-in', 'enter-turn-x', 'enter-turn-y', 'enter-wipe-down', 'enter-wipe-down-left', 'enter-wipe-down-right', 'enter-wipe-left', 'enter-wipe-open-x', 'enter-wipe-open-y', 'enter-wipe-right', 'enter-wipe-up', 'enter-wipe-up-left', 'enter-wipe-up-right', 'exit-blur-out', 'exit-depth-out', 'exit-fade-out', 'exit-fade-out-down', 'exit-fade-out-up', 'exit-fall', 'exit-flip-out-down', 'exit-flip-out-left', 'exit-flip-out-right', 'exit-flip-out-up', 'exit-flip-over-out-down', 'exit-flip-over-out-left', 'exit-flip-over-out-right', 'exit-flip-over-out-up', 'exit-glow', 'exit-iris-out', 'exit-iris-out-down', 'exit-iris-out-down-left', 'exit-iris-out-down-right', 'exit-iris-out-left', 'exit-iris-out-right', 'exit-iris-out-up', 'exit-iris-out-up-left', 'exit-iris-out-up-right', 'exit-none', 'exit-pocket-out-down', 'exit-pocket-out-down-left', 'exit-pocket-out-down-right', 'exit-pocket-out-left', 'exit-pocket-out-right', 'exit-pocket-out-up', 'exit-pocket-out-up-left', 'exit-pocket-out-up-right', 'exit-pop-out', 'exit-rise', 'exit-scale-out', 'exit-squish', 'exit-swing-out', 'exit-tilt', 'exit-wipe-close-x', 'exit-wipe-close-y', 'exit-wipe-out-down', 'exit-wipe-out-down-left', 'exit-wipe-out-down-right', 'exit-wipe-out-left', 'exit-wipe-out-right', 'exit-wipe-out-up', 'exit-wipe-out-up-left', 'exit-wipe-out-up-right', 'left', 'page', 'share', 'still', 'theme', 'theme-back',),
396
+ modifiers: ('enter-blur-in', 'enter-depth', 'enter-depth-in', 'enter-fade-down', 'enter-fade-end', 'enter-fade-in', 'enter-fade-start', 'enter-fade-up', 'enter-flip-down', 'enter-flip-left', 'enter-flip-over-down', 'enter-flip-over-left', 'enter-flip-over-right', 'enter-flip-over-up', 'enter-flip-right', 'enter-flip-up', 'enter-hinge', 'enter-iris-down', 'enter-iris-down-left', 'enter-iris-down-right', 'enter-iris-in', 'enter-iris-left', 'enter-iris-right', 'enter-iris-up', 'enter-iris-up-left', 'enter-iris-up-right', 'enter-none', 'enter-pocket-down', 'enter-pocket-down-left', 'enter-pocket-down-right', 'enter-pocket-left', 'enter-pocket-right', 'enter-pocket-up', 'enter-pocket-up-left', 'enter-pocket-up-right', 'enter-pop', 'enter-pop-in', 'enter-scale-in', 'enter-slide-down', 'enter-slide-left', 'enter-slide-right', 'enter-slide-up', 'enter-swing-in', 'enter-turn-x', 'enter-turn-y', 'enter-wipe-down', 'enter-wipe-down-left', 'enter-wipe-down-right', 'enter-wipe-left', 'enter-wipe-open-x', 'enter-wipe-open-y', 'enter-wipe-right', 'enter-wipe-up', 'enter-wipe-up-left', 'enter-wipe-up-right', 'exit-blur-out', 'exit-depth-out', 'exit-fade-out', 'exit-fade-out-down', 'exit-fade-out-up', 'exit-fall', 'exit-flip-out-down', 'exit-flip-out-left', 'exit-flip-out-right', 'exit-flip-out-up', 'exit-flip-over-out-down', 'exit-flip-over-out-left', 'exit-flip-over-out-right', 'exit-flip-over-out-up', 'exit-glow', 'exit-iris-out', 'exit-iris-out-down', 'exit-iris-out-down-left', 'exit-iris-out-down-right', 'exit-iris-out-left', 'exit-iris-out-right', 'exit-iris-out-up', 'exit-iris-out-up-left', 'exit-iris-out-up-right', 'exit-none', 'exit-pocket-out-down', 'exit-pocket-out-down-left', 'exit-pocket-out-down-right', 'exit-pocket-out-left', 'exit-pocket-out-right', 'exit-pocket-out-up', 'exit-pocket-out-up-left', 'exit-pocket-out-up-right', 'exit-pop-out', 'exit-rise', 'exit-scale-out', 'exit-squish', 'exit-swing-out', 'exit-tilt', 'exit-wipe-close-x', 'exit-wipe-close-y', 'exit-wipe-out-down', 'exit-wipe-out-down-left', 'exit-wipe-out-down-right', 'exit-wipe-out-left', 'exit-wipe-out-right', 'exit-wipe-out-up', 'exit-wipe-out-up-left', 'exit-wipe-out-up-right', 'left', 'page', 'route-enter', 'route-exit', 'route-pace', 'share', 'still', 'theme', 'theme-back',),
379
397
  part-modifiers: (),
380
- variables: ('--greese-ease-out', '--greese-motion-distance', '--greese-motion-page', '--greese-motion-page-back', '--greese-motion-page-back-exit', '--greese-motion-page-duration', '--greese-motion-page-ease', '--greese-motion-page-exit', '--greese-motion-share-duration', '--greese-motion-share-ease', '--greese-page-scrolled',),
398
+ variables: ('--greese-ease-out', '--greese-motion-distance', '--greese-motion-page', '--greese-motion-page-back', '--greese-motion-page-back-exit', '--greese-motion-page-duration', '--greese-motion-page-ease', '--greese-motion-page-exit', '--greese-motion-share-duration', '--greese-motion-share-ease', '--greese-page-duration', '--greese-page-ease', '--greese-page-enter', '--greese-page-exit', '--greese-page-scrolled',),
381
399
  ),
382
400
  'Pagination': (
383
401
  parts: ('ellipsis', 'list', 'page', 'step',),
@@ -405,9 +423,9 @@ $blocks: (
405
423
  ),
406
424
  'Radio': (
407
425
  parts: ('input',),
408
- modifiers: (),
426
+ modifiers: ('size-lg', 'size-md', 'size-sm', 'size-xl', 'size-xs',),
409
427
  part-modifiers: (),
410
- variables: (),
428
+ variables: ('--greese-choice-box',),
411
429
  ),
412
430
  'Rating': (
413
431
  parts: ('choice', 'choices', 'empty', 'filled', 'icon', 'input', 'items', 'stars',),
@@ -415,6 +433,18 @@ $blocks: (
415
433
  part-modifiers: (),
416
434
  variables: ('--greese-rating-fill', '--greese-rating-off', '--greese-rating-on', '--greese-rating-size',),
417
435
  ),
436
+ 'ScrollCarousel': (
437
+ parts: ('control', 'indicator', 'indicators', 'viewport',),
438
+ modifiers: ('strip', 'vertical',),
439
+ part-modifiers: ('control': ('next', 'previous',)),
440
+ variables: ('--greese-scrollcarousel-dots', '--greese-scrollcarousel-gap', '--greese-scrollcarousel-gaps', '--greese-scrollcarousel-per-view', '--greese-scrollcarousel-size',),
441
+ ),
442
+ 'ScrollCarouselSlide': (
443
+ parts: (),
444
+ modifiers: (),
445
+ part-modifiers: (),
446
+ variables: (),
447
+ ),
418
448
  'ScrollSpy': (
419
449
  parts: (),
420
450
  modifiers: (),
@@ -464,10 +494,10 @@ $blocks: (
464
494
  variables: ('--greese-skeleton-height', '--greese-skeleton-width',),
465
495
  ),
466
496
  'Slider': (
467
- parts: (),
468
- modifiers: (),
497
+ parts: ('thumbAnchor', 'wrap',),
498
+ modifiers: ('size-lg', 'size-md', 'size-sm', 'size-xl', 'size-xs',),
469
499
  part-modifiers: (),
470
- variables: ('--greese-slider-fill', '--greese-slider-thumb', '--greese-slider-towards',),
500
+ variables: ('--greese-slider-fill', '--greese-slider-offset', '--greese-slider-ratio', '--greese-slider-thumb', '--greese-slider-towards', '--greese-slider-travel',),
471
501
  ),
472
502
  'Spacer': (
473
503
  parts: (),
@@ -537,9 +567,9 @@ $blocks: (
537
567
  ),
538
568
  'Switch': (
539
569
  parts: ('input', 'thumb', 'track',),
540
- modifiers: (),
570
+ modifiers: ('size-lg', 'size-md', 'size-sm', 'size-xl', 'size-xs',),
541
571
  part-modifiers: (),
542
- variables: (),
572
+ variables: ('--greese-choice-box',),
543
573
  ),
544
574
  'Tab': (
545
575
  parts: (),
@@ -99,13 +99,21 @@ $breakpoints: config.$breakpoints;
99
99
  /// With `$container-scope`, the same rules are emitted again under
100
100
  /// `@container`, prefixed with the scope so they win inside it.
101
101
  ///
102
+ /// With `$breakpoint-set` and `$container`, the rules are for other
103
+ /// breakpoints, measured against the nearest container of that name instead
104
+ /// of the viewport: a library's own keys, such as @greese/authoring's panel
105
+ /// breakpoints (`panelmd`), whose classes `resolveResponsive()` writes once
106
+ /// they're registered with `addContainerBreakpoints()`.
107
+ ///
102
108
  /// @param $block component root class, without the dot: 'greese-Stack'
103
109
  /// @param $prop prop segment in class and variable names: 'gap'
104
110
  /// @param $properties CSS property, or list of them, to set
105
111
  /// @param $tokens map of token key to CSS value, one class each
106
112
  /// @param $template wraps each value: 'repeat(auto-fill, minmax(VALUE, 1fr))'
107
113
  /// @param $container-scope selector prefix whose container-query variant
108
- /// applies: '.greese-Grid--container >'
114
+ /// applies: '.greese-Grid--queries >'
115
+ /// @param $breakpoint-set the breakpoints to write: the configured ones
116
+ /// @param $container a container name: the set's queries are its width
109
117
  ///
110
118
  /// Use it at the top level of a layer block, not nested in a selector.
111
119
  @mixin responsive-prop(
@@ -114,24 +122,54 @@ $breakpoints: config.$breakpoints;
114
122
  $properties,
115
123
  $tokens: (),
116
124
  $template: null,
117
- $container-scope: null
125
+ $container-scope: null,
126
+ $breakpoint-set: $breakpoints,
127
+ $container: null
118
128
  ) {
119
- @each $bp, $min in $breakpoints {
120
- @include up($bp) {
121
- @include _breakpoint-rules(
122
- $block,
123
- $prop,
124
- $bp,
125
- $properties,
126
- $tokens,
127
- $template,
128
- null
129
- );
129
+ @each $bp, $min in $breakpoint-set {
130
+ @if $container {
131
+ @if $min <= 0 {
132
+ @include _breakpoint-rules(
133
+ $block,
134
+ $prop,
135
+ $bp,
136
+ $properties,
137
+ $tokens,
138
+ $template,
139
+ null
140
+ );
141
+ } @else {
142
+ // A name the caller gives, interpolated: the pattern can't see it.
143
+ // stylelint-disable-next-line container-name-pattern
144
+ @container #{$container} (width >= #{$min}) {
145
+ @include _breakpoint-rules(
146
+ $block,
147
+ $prop,
148
+ $bp,
149
+ $properties,
150
+ $tokens,
151
+ $template,
152
+ null
153
+ );
154
+ }
155
+ }
156
+ } @else {
157
+ @include up($bp) {
158
+ @include _breakpoint-rules(
159
+ $block,
160
+ $prop,
161
+ $bp,
162
+ $properties,
163
+ $tokens,
164
+ $template,
165
+ null
166
+ );
167
+ }
130
168
  }
131
169
  }
132
170
 
133
- @if $container-scope {
134
- @each $bp, $min in $breakpoints {
171
+ @if $container-scope and not $container {
172
+ @each $bp, $min in $breakpoint-set {
135
173
  @if $min <= 0 {
136
174
  @include _breakpoint-rules(
137
175
  $block,
@@ -0,0 +1,112 @@
1
+ // The previous/next buttons and the dots that ScrollCarousel and Carousel
2
+ // share: each emits them under its own block, so either stylesheet stands
3
+ // alone.
4
+ @use 'mixins';
5
+
6
+ /// `.<block>-control` (with `--previous` and `--next`), `.<block>-indicators`
7
+ /// and `.<block>-indicator`. The buttons sit over the viewport's side edges,
8
+ /// centred on it above the dots (`--greese-<var>-dots`).
9
+ @mixin controls($block, $var) {
10
+ // Previous and next sit over the viewport's edges, centred on it.
11
+ .#{$block}-control {
12
+ position: absolute;
13
+ inset-block-start: calc(50% - 1.25rem - var(--greese-#{$var}-dots, 0px) / 2);
14
+ display: inline-grid;
15
+ place-items: center;
16
+ inline-size: 2.5rem;
17
+ block-size: 2.5rem;
18
+ padding: 0;
19
+ color: var(--greese-color-fg);
20
+ cursor: pointer;
21
+ background-color: color-mix(
22
+ in oklab,
23
+ var(--greese-color-surface-overlay) 88%,
24
+ transparent
25
+ );
26
+ border: 1px solid var(--greese-color-border);
27
+ border-radius: var(--greese-corner-round);
28
+ box-shadow: var(--greese-shadow-md);
29
+ translate: 0 -50%;
30
+ transition: opacity var(--greese-duration-fast) var(--greese-easing-standard);
31
+
32
+ @include mixins.focus-ring;
33
+ @include mixins.touch-target;
34
+
35
+ // Gone at an end: invisible, and clicks pass through to what's under it.
36
+ &:disabled {
37
+ pointer-events: none;
38
+ cursor: default;
39
+ opacity: 0;
40
+ }
41
+
42
+ > svg {
43
+ inline-size: 1.125rem;
44
+ block-size: 1.125rem;
45
+ }
46
+ }
47
+
48
+ .#{$block}:has(.#{$block}-indicators) {
49
+ --greese-#{$var}-dots: calc(0.5rem + var(--greese-space-3));
50
+ }
51
+
52
+ .#{$block}-control--previous {
53
+ inset-inline-start: var(--greese-space-2);
54
+ }
55
+
56
+ .#{$block}-control--next {
57
+ inset-inline-end: var(--greese-space-2);
58
+
59
+ > svg {
60
+ scale: -1 1;
61
+ }
62
+ }
63
+
64
+ // The chevron points to the inline start; mirror both in RTL.
65
+ .#{$block}-control:dir(rtl) > svg {
66
+ scale: -1 1;
67
+ }
68
+
69
+ .#{$block}-control--next:dir(rtl) > svg {
70
+ scale: 1;
71
+ }
72
+
73
+ .#{$block}-indicators {
74
+ display: flex;
75
+ flex-wrap: wrap;
76
+ gap: var(--greese-space-1);
77
+ justify-content: center;
78
+ }
79
+
80
+ // Each dot keeps one size; the active pill is drawn by clip-path, which
81
+ // never changes layout. A width change would: mid-scroll, every frame of
82
+ // it made WebKit re-snap the viewport and pull it back a slide.
83
+ .#{$block}-indicator {
84
+ position: relative;
85
+ inline-size: 1.5rem;
86
+ block-size: 0.5rem;
87
+ padding: 0;
88
+ cursor: pointer;
89
+ background: none;
90
+ border: 0;
91
+
92
+ @include mixins.focus-ring;
93
+ @include mixins.touch-target(24px);
94
+
95
+ &::before {
96
+ position: absolute;
97
+ inset: 0;
98
+ content: '';
99
+ background-color: var(--greese-color-border-strong);
100
+ border-radius: var(--greese-corner-pill);
101
+ clip-path: inset(0 calc(50% - 0.25rem) round var(--greese-corner-pill));
102
+ transition:
103
+ clip-path var(--greese-duration-normal) var(--greese-easing-standard),
104
+ background-color var(--greese-duration-normal) var(--greese-easing-standard);
105
+ }
106
+
107
+ &[aria-current='true']::before {
108
+ background-color: var(--greese-color-primary);
109
+ clip-path: inset(0 round var(--greese-corner-pill));
110
+ }
111
+ }
112
+ }