@momoi-labs/kiso 0.11.0 → 0.12.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.
@@ -69,7 +69,7 @@ it is a section with a heading, not a Card.
69
69
  This is the shared panel contract. Card, [Table](table.md) wrapper,
70
70
  [ModalDialog](modal-dialog.md), [Drawer](drawer.md),
71
71
  [CommandPalette](command-palette.md), and code or log blocks are **panels**:
72
- square (`--radius-surface`) with corner marks. Popover, DropdownMenu, Toast,
72
+ square (`--radius-surface`) with corner marks by default. Popover, DropdownMenu, Toast,
73
73
  Alert, and Tooltip are transient chrome, not panels: they keep a small radius
74
74
  and carry no marks.
75
75
 
@@ -91,11 +91,11 @@ accidental.
91
91
 
92
92
  The gap is the mark. Close it and this is just a thicker border.
93
93
 
94
- Marks go on every panel, without exception. There is no rounded mode and no
95
- `data-corners` attribute; the corner language was decided once and is not a
96
- per-product setting.
94
+ Applications can change panel borders, radii, mark shapes, and mark sizes
95
+ with the [appearance attributes](../tokens.md#appearance-attributes).
96
+ Without these attributes, panels keep the square frame and tick marks.
97
97
 
98
- Draw them on one pseudo-element inset by `calc(-1 * (var(--corner-mark-tick) +
98
+ Draw default ticks on one pseudo-element inset by `calc(-1 * (var(--corner-mark-tick) +
99
99
  var(--corner-mark-gap)))`, so no markup and no images are needed. If the panel
100
100
  scrolls, move `overflow` to an inner element — the marks sit just outside the
101
101
  frame and a scrolling wrapper clips them away.
@@ -27,7 +27,7 @@ Drawer Root
27
27
 
28
28
  Content uses `--color-elevated-surface`, `--color-foreground`,
29
29
  `--color-border`, `--spacing-lg` padding, `--radius-surface`, and
30
- `--shadow-lg`. The scrim uses `--color-overlay`. Panels are square (`--radius-surface`) and carry corner marks. See
30
+ `--shadow-lg`. The scrim uses `--color-overlay`. Panels are square (`--radius-surface`) and carry corner marks by default. See
31
31
  [Card](card.md#corner-marks) for the shared panel contract.
32
32
  Entry/exit uses `--motion-duration-normal` and `--motion-easing-standard`, with
33
33
  no travel under reduced motion.
@@ -26,7 +26,7 @@ Dialog Root
26
26
  Content uses `--color-elevated-surface`, `--color-foreground`,
27
27
  `--color-border`, `--radius-surface`, `--spacing-lg` padding, and
28
28
  `--shadow-lg`. A Dialog is a panel: it carries corner marks. The scrim uses
29
- `--color-overlay`. Panels are square (`--radius-surface`) and carry corner marks. See
29
+ `--color-overlay`. Panels are square (`--radius-surface`) and carry corner marks by default. See
30
30
  [Card](card.md#corner-marks) for the shared panel contract.
31
31
  Overlay transitions use `--motion-duration-normal` and
32
32
  `--motion-easing-standard`.
@@ -277,9 +277,9 @@ Layout sizes: `--size-sidebar` (248px) is the shell navigation column;
277
277
  `--size-icon-sm` (14px), `--size-icon-md` (16px, the default), and
278
278
  `--size-icon-lg` (20px).
279
279
 
280
- ## Corners: marks, not radius
280
+ ## Corners and appearance
281
281
 
282
- Panels are square. `--radius-surface` is `0px`, and a panel's corner treatment
282
+ Panels are square by default. `--radius-surface` is `0px`, and a panel's corner treatment
283
283
  is a **corner mark** instead: two 1px ticks per corner, each lying along the
284
284
  frame line it extends and stopping `--corner-mark-gap` short of it, so the mark
285
285
  points at the corner without touching it.
@@ -296,8 +296,8 @@ the paint and makes the hollow centre explicit rather than accidental.
296
296
 
297
297
  The gap **is** the mark. Close it and this is just a thicker border.
298
298
 
299
- Marks appear on every panel, without exception. There is no rounded mode and no
300
- `data-corners` attribute — the choice was made once, here.
299
+ Marks appear on panels by default. Applications can select another treatment
300
+ with the appearance attributes below.
301
301
 
302
302
  The remaining radii only take the bite off controls:
303
303
 
@@ -308,7 +308,38 @@ The remaining radii only take the bite off controls:
308
308
  | `--radius-md` | 4px | **Buttons, inputs, menu items** — the control default. |
309
309
  | `--radius-lg` | 5px | Segmented tracks and other control groups. |
310
310
  | `--radius-full` | 9999px | Pills, dots, switches, avatars. |
311
- | `--radius-surface` | 0px | **Panels, cards, tables, dialogs** — always. |
311
+ | `--radius-surface` | 0px | **Panels, cards, tables, dialogs** by default. |
312
+
313
+ ### Appearance attributes
314
+
315
+ Set these attributes on `<html>` so they also reach portalled dialogs and menus.
316
+ They ship in `@momoi-labs/kiso/ui.css`, which React's stylesheet imports.
317
+ No gallery CSS or JavaScript is required.
318
+
319
+ | Attribute | Values | Default when omitted |
320
+ | --- | --- | --- |
321
+ | `data-border-style` | `square`, `soft`, `round`, `asym`, `rail`, `dash`, `bevel`, `double`, `base`, `offset` | Square panels and existing control radii |
322
+ | `data-corner-size` | `off`, `small`, `medium`, `large` | `medium` |
323
+ | `data-corner-marks` | `none`, `ticks`, `brackets`, `arcs`, `dots` | `ticks` |
324
+ | `data-mark-size` | `small`, `medium`, `large` | `medium` |
325
+
326
+ `data-corner-size` scales the radii selected by `data-border-style`: `off`
327
+ sets them to zero; `small`, `medium`, and `large` use 0.5, 1, and 1.5 times
328
+ that style's radii. Square panels stay square and their control radii stay
329
+ unchanged unless the size is `off`. Size does not hide marks; use
330
+ `data-corner-marks="none"` for that.
331
+
332
+ Mark sizes set `--corner-mark-tick` and `--corner-mark-gap` to 2px/1px,
333
+ 4px/2px, or 8px/4px. Border styles override the existing radius tokens.
334
+ The generated token defaults remain unchanged.
335
+
336
+ ```html
337
+ <html lang="en" data-accent="terracotta" data-border-style="soft"
338
+ data-corner-size="small" data-corner-marks="arcs" data-mark-size="medium">
339
+ ```
340
+
341
+ Keep scrolling on `.log-scroll`, `.table-scroll`, dialog bodies, and
342
+ `pre > code`. The outer frame owns the marks, which extend outside it.
312
343
 
313
344
  ## Hatch
314
345
 
package/kiso/ui.css CHANGED
@@ -798,6 +798,7 @@ table.table { width: 100%; border-collapse: collapse; font-size: var(--type-size
798
798
  }
799
799
 
800
800
  .palette {
801
+ position: relative;
801
802
  width: 100%; max-width: 560px;
802
803
  background: var(--color-popover);
803
804
  border: 1px solid var(--color-border);
@@ -1072,59 +1073,171 @@ pre code { display: block; overflow-x: auto; padding: 0; background: none; borde
1072
1073
  }
1073
1074
 
1074
1075
 
1075
- /* ===========================================================================
1076
- Corner marks — the "blueprint" corner treatment
1077
- ---------------------------------------------------------------------------
1078
- An open registration mark on each corner: two 1px ticks, each lying along
1079
- the frame line it extends and stopping `--corner-mark-gap` short of it, so
1080
- the mark points at the corner without touching it.
1081
-
1082
- Deliberately two ticks and not four. A full cross puts its other two arms
1083
- directly on top of the panel border, where they are invisible — the mark
1084
- read as a bracket anyway. Dropping them halves the paint and makes the
1085
- hollow centre explicit instead of accidental.
1076
+ /* Appearance attributes. Set these on html to include portalled content. */
1077
+ :root {
1078
+ --appearance-scale: 1;
1079
+ --appearance-square-scale: 1;
1080
+ --appearance-panel-shadow: 0 0 transparent;
1081
+ --appearance-panel-border: solid;
1082
+ }
1083
+ [data-corner-size="off"] { --appearance-scale: 0; --appearance-square-scale: 0; }
1084
+ [data-corner-size="small"] { --appearance-scale: .5; }
1085
+ [data-corner-size="medium"] { --appearance-scale: 1; }
1086
+ [data-corner-size="large"] { --appearance-scale: 1.5; }
1087
+ [data-border-style] {
1088
+ --appearance-base-radius: 8px;
1089
+ --appearance-control-base: 4px;
1090
+ --appearance-panel-border: solid;
1091
+ --appearance-panel-shadow: 0 0 transparent;
1092
+ --appearance-overlay-content: none;
1093
+ --appearance-footer-start: var(--radius-surface);
1094
+ --appearance-overlay-inset: 0;
1095
+ --appearance-overlay-border: 0;
1096
+ --appearance-overlay-radius: var(--appearance-corners);
1097
+ --radius-surface: calc(var(--appearance-base-radius) * var(--appearance-scale));
1098
+ --radius-md: calc(var(--appearance-control-base) * var(--appearance-scale));
1099
+ --radius-xs: calc(var(--radius-md) / 2);
1100
+ --radius-sm: calc(var(--radius-md) * .75);
1101
+ --radius-lg: calc(var(--radius-md) * 1.25);
1102
+ --appearance-corners: var(--radius-surface);
1103
+ --appearance-control-corners: var(--radius-md);
1104
+ }
1105
+ [data-border-style="square"] {
1106
+ --appearance-base-radius: 0px;
1107
+ --radius-xs: calc(2px * var(--appearance-square-scale));
1108
+ --radius-sm: calc(3px * var(--appearance-square-scale));
1109
+ --radius-md: calc(4px * var(--appearance-square-scale));
1110
+ --radius-lg: calc(5px * var(--appearance-square-scale));
1111
+ }
1112
+ [data-border-style="soft"] { --appearance-base-radius: 8px; }
1113
+ [data-border-style="round"] { --appearance-base-radius: 16px; --appearance-control-base: 8px; }
1114
+ [data-border-style="asym"] {
1115
+ --appearance-footer-start: calc(3px * var(--appearance-scale));
1116
+ --appearance-base-radius: 12px;
1117
+ --appearance-control-base: 6px;
1118
+ --appearance-corners: var(--radius-surface) calc(3px * var(--appearance-scale));
1119
+ --appearance-control-corners: var(--radius-md) calc(2px * var(--appearance-scale));
1120
+ }
1121
+ [data-border-style="rail"] { --appearance-overlay-content: ""; --appearance-base-radius: 6px; --appearance-control-base: 3px; --appearance-panel-shadow: inset 3px 0 var(--color-border-strong); }
1122
+ [data-border-style="dash"] { --appearance-panel-border: dashed; }
1123
+ [data-border-style="bevel"] { --appearance-overlay-content: ""; --appearance-panel-shadow: inset 1px 1px 1px var(--color-shadow-contact), inset -1px -1px var(--color-border-strong); }
1124
+ [data-border-style="double"] { --appearance-overlay-content: ""; --appearance-overlay-inset: 3px; --appearance-overlay-border: 1px solid var(--color-border); --appearance-overlay-radius: max(0px, calc(var(--radius-surface) - 3px)); }
1125
+ [data-border-style="base"] { --appearance-overlay-content: "";
1126
+ /* Match the outer frame so the thick base covers its bottom hairline. */
1127
+ --appearance-overlay-inset: -1px;
1128
+ --appearance-panel-shadow: inset 0 -3px var(--color-border-strong);
1129
+ }
1130
+ [data-border-style="offset"] { --appearance-overlay-content: "";
1131
+ --appearance-overlay-inset: -1px;
1132
+ /* An opaque, hard shadow keeps underlying content out of the offset. */
1133
+ --appearance-panel-shadow: 3px 3px 0 0 var(--color-border-strong);
1134
+ }
1135
+
1136
+ :where([data-border-style]) :is(.card, .dialog, .table-wrap, .logview, .marked, .palette, pre) {
1137
+ border-radius: var(--appearance-corners);
1138
+ border-style: var(--appearance-panel-border);
1139
+ }
1140
+ /* Paint decorative edges above table headers and panel footers. */
1141
+ :is(.card, .dialog, .table-wrap, .logview, .marked, .palette, pre)::before {
1142
+ content: var(--appearance-overlay-content, none);
1143
+ position: absolute;
1144
+ inset: var(--appearance-overlay-inset);
1145
+ border: var(--appearance-overlay-border);
1146
+ border-radius: var(--appearance-overlay-radius);
1147
+ box-shadow: var(--appearance-panel-shadow);
1148
+ pointer-events: none;
1149
+ z-index: 1;
1150
+ }
1151
+ :where([data-border-style]) .palette { overflow: visible; }
1152
+ :where([data-border-style]) .palette-list { border-end-start-radius: var(--radius-surface); border-end-end-radius: var(--radius-surface); }
1153
+ :where([data-border-style]) :is(.card-footer, .dialog-footer) {
1154
+ border-end-start-radius: var(--appearance-footer-start);
1155
+ border-end-end-radius: var(--radius-surface);
1156
+ }
1157
+ :where([data-border-style]) :is(.btn:not(.btn-xs), .input, .select, .textarea, .nav-item, .menu-item) {
1158
+ border-radius: var(--appearance-control-corners);
1159
+ }
1086
1160
 
1087
- Eight 1px gradient bars on one pseudo-element. No markup, no images, and
1088
- `--corner-mark: 0` removes them entirely.
1089
- =========================================================================== */
1090
- .card::after,
1091
- .dialog::after,
1092
- .table-wrap::after,
1093
- .logview::after,
1094
- .marked::after,
1095
- pre::after {
1161
+ [data-mark-size="small"] { --corner-mark-tick: 2px; --corner-mark-gap: 1px; }
1162
+ [data-mark-size="medium"] { --corner-mark-tick: 4px; --corner-mark-gap: 2px; }
1163
+ [data-mark-size="large"] { --corner-mark-tick: 8px; --corner-mark-gap: 4px; }
1164
+ [data-corner-marks] {
1165
+ --corner-mark: 1;
1166
+ --appearance-palette-marks: "";
1167
+ --appearance-mark-mask: none;
1168
+ --appearance-mark-bg: transparent;
1169
+ --appearance-mark-inset: initial;
1170
+ --appearance-mark-images: initial;
1171
+ }
1172
+ [data-corner-marks="none"] { --corner-mark: 0; }
1173
+ :is(.card, .dialog, .table-wrap, .logview, .marked, .palette, pre)::after {
1096
1174
  content: "";
1097
1175
  position: absolute;
1098
- /* Reach far enough out that a tick clears the frame by the gap. */
1099
- inset: calc(-1 * (var(--corner-mark-tick) + var(--corner-mark-gap)));
1100
1176
  pointer-events: none;
1101
1177
  opacity: var(--corner-mark);
1102
1178
  background-repeat: no-repeat;
1103
- background-image:
1104
- linear-gradient(var(--color-corner-mark), var(--color-corner-mark)),
1105
- linear-gradient(var(--color-corner-mark), var(--color-corner-mark)),
1106
- linear-gradient(var(--color-corner-mark), var(--color-corner-mark)),
1107
- linear-gradient(var(--color-corner-mark), var(--color-corner-mark)),
1108
- linear-gradient(var(--color-corner-mark), var(--color-corner-mark)),
1109
- linear-gradient(var(--color-corner-mark), var(--color-corner-mark)),
1110
- linear-gradient(var(--color-corner-mark), var(--color-corner-mark)),
1111
- linear-gradient(var(--color-corner-mark), var(--color-corner-mark));
1112
1179
  background-size:
1113
1180
  var(--corner-mark-tick) 1px, 1px var(--corner-mark-tick),
1114
1181
  var(--corner-mark-tick) 1px, 1px var(--corner-mark-tick),
1115
1182
  var(--corner-mark-tick) 1px, 1px var(--corner-mark-tick),
1116
1183
  var(--corner-mark-tick) 1px, 1px var(--corner-mark-tick);
1117
- /* The offset lands each tick exactly on the 1px frame line it extends. */
1118
1184
  background-position:
1119
- left 0 top calc(var(--corner-mark-tick) + var(--corner-mark-gap)),
1120
- left calc(var(--corner-mark-tick) + var(--corner-mark-gap)) top 0,
1121
- right 0 top calc(var(--corner-mark-tick) + var(--corner-mark-gap)),
1185
+ left 0 top calc(var(--corner-mark-tick) + var(--corner-mark-gap)),
1186
+ left calc(var(--corner-mark-tick) + var(--corner-mark-gap)) top 0,
1187
+ right 0 top calc(var(--corner-mark-tick) + var(--corner-mark-gap)),
1122
1188
  right calc(var(--corner-mark-tick) + var(--corner-mark-gap)) top 0,
1123
- left 0 bottom calc(var(--corner-mark-tick) + var(--corner-mark-gap)),
1124
- left calc(var(--corner-mark-tick) + var(--corner-mark-gap)) bottom 0,
1189
+ left 0 bottom calc(var(--corner-mark-tick) + var(--corner-mark-gap)),
1190
+ left calc(var(--corner-mark-tick) + var(--corner-mark-gap)) bottom 0,
1125
1191
  right 0 bottom calc(var(--corner-mark-tick) + var(--corner-mark-gap)),
1126
1192
  right calc(var(--corner-mark-tick) + var(--corner-mark-gap)) bottom 0;
1127
- }
1193
+ inset: var(--appearance-mark-inset, calc(-1 * (var(--corner-mark-tick) + var(--corner-mark-gap))));
1194
+ background-image: var(--appearance-mark-images,
1195
+ linear-gradient(var(--color-corner-mark), var(--color-corner-mark)),
1196
+ linear-gradient(var(--color-corner-mark), var(--color-corner-mark)),
1197
+ linear-gradient(var(--color-corner-mark), var(--color-corner-mark)),
1198
+ linear-gradient(var(--color-corner-mark), var(--color-corner-mark)),
1199
+ linear-gradient(var(--color-corner-mark), var(--color-corner-mark)),
1200
+ linear-gradient(var(--color-corner-mark), var(--color-corner-mark)),
1201
+ linear-gradient(var(--color-corner-mark), var(--color-corner-mark)),
1202
+ linear-gradient(var(--color-corner-mark), var(--color-corner-mark)));
1203
+ background-color: var(--appearance-mark-bg, transparent);
1204
+ mask-image: var(--appearance-mark-mask, none);
1205
+ mask-size: calc(var(--corner-mark-tick) + 1px) calc(var(--corner-mark-tick) + 1px);
1206
+ mask-position: left top, right top, left bottom, right bottom;
1207
+ mask-repeat: no-repeat;
1208
+ }
1209
+
1210
+ [data-corner-marks="brackets"] {
1211
+ --appearance-mark-images: none;
1212
+ --appearance-mark-bg: var(--color-corner-mark);
1213
+ --appearance-mark-inset: calc(-1 * (var(--corner-mark-gap) + 1px));
1214
+ --appearance-mark-mask: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2010%2010%22%3E%3Cg%20transform%3D%22%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%222%22%20%3E%3Cpath%20d%3D%22M.5%209.5V.5H9.5%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"),
1215
+ url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2010%2010%22%3E%3Cg%20transform%3D%22translate%2810%200%29%20scale%28-1%201%29%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%222%22%20%3E%3Cpath%20d%3D%22M.5%209.5V.5H9.5%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"),
1216
+ url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2010%2010%22%3E%3Cg%20transform%3D%22translate%280%2010%29%20scale%281%20-1%29%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%222%22%20%3E%3Cpath%20d%3D%22M.5%209.5V.5H9.5%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"),
1217
+ url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2010%2010%22%3E%3Cg%20transform%3D%22translate%2810%2010%29%20scale%28-1%20-1%29%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%222%22%20%3E%3Cpath%20d%3D%22M.5%209.5V.5H9.5%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
1218
+ }
1219
+
1220
+ [data-corner-marks="arcs"] {
1221
+ --appearance-mark-images: none;
1222
+ --appearance-mark-bg: var(--color-corner-mark);
1223
+ --appearance-mark-inset: calc(-1 * (var(--corner-mark-gap) + 1px));
1224
+ --appearance-mark-mask: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2010%2010%22%3E%3Cg%20transform%3D%22%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%222%22%20%3E%3Cpath%20d%3D%22M.5%209.5Q.5%20.5%209.5%20.5%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"),
1225
+ url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2010%2010%22%3E%3Cg%20transform%3D%22translate%2810%200%29%20scale%28-1%201%29%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%222%22%20%3E%3Cpath%20d%3D%22M.5%209.5Q.5%20.5%209.5%20.5%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"),
1226
+ url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2010%2010%22%3E%3Cg%20transform%3D%22translate%280%2010%29%20scale%281%20-1%29%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%222%22%20%3E%3Cpath%20d%3D%22M.5%209.5Q.5%20.5%209.5%20.5%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"),
1227
+ url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2010%2010%22%3E%3Cg%20transform%3D%22translate%2810%2010%29%20scale%28-1%20-1%29%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%222%22%20%3E%3Cpath%20d%3D%22M.5%209.5Q.5%20.5%209.5%20.5%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
1228
+ }
1229
+
1230
+ [data-corner-marks="dots"] {
1231
+ --appearance-mark-images: none;
1232
+ --appearance-mark-bg: var(--color-corner-mark);
1233
+ --appearance-mark-inset: calc(-1 * (var(--corner-mark-gap) + 1px));
1234
+ --appearance-mark-mask: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2010%2010%22%3E%3Cg%20transform%3D%22%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%222%22%20%3E%3Ccircle%20cx%3D%225%22%20cy%3D%225%22%20r%3D%223%22%20fill%3D%22black%22%20stroke%3D%22none%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"),
1235
+ url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2010%2010%22%3E%3Cg%20transform%3D%22translate%2810%200%29%20scale%28-1%201%29%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%222%22%20%3E%3Ccircle%20cx%3D%225%22%20cy%3D%225%22%20r%3D%223%22%20fill%3D%22black%22%20stroke%3D%22none%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"),
1236
+ url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2010%2010%22%3E%3Cg%20transform%3D%22translate%280%2010%29%20scale%281%20-1%29%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%222%22%20%3E%3Ccircle%20cx%3D%225%22%20cy%3D%225%22%20r%3D%223%22%20fill%3D%22black%22%20stroke%3D%22none%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E"),
1237
+ url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%2010%2010%22%3E%3Cg%20transform%3D%22translate%2810%2010%29%20scale%28-1%20-1%29%22%20fill%3D%22none%22%20stroke%3D%22black%22%20stroke-width%3D%222%22%20%3E%3Ccircle%20cx%3D%225%22%20cy%3D%225%22%20r%3D%223%22%20fill%3D%22black%22%20stroke%3D%22none%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
1238
+ }
1239
+
1240
+ .palette::after { content: var(--appearance-palette-marks, none); }
1128
1241
  .marked { position: relative; }
1129
1242
 
1130
1243
  /* ===========================================================================
@@ -1305,3 +1418,13 @@ button.step-row:focus-visible { outline: 2px solid var(--color-focus); outline-o
1305
1418
  @media (pointer: coarse) {
1306
1419
  .chart-series-button { min-height: var(--size-touch-min); min-width: var(--size-touch-min); }
1307
1420
  }
1421
+
1422
+ /* Respect reduced motion in every consumer, including React controls. */
1423
+ @media (prefers-reduced-motion: reduce) {
1424
+ *,
1425
+ *::before,
1426
+ *::after {
1427
+ animation: none !important;
1428
+ transition: none !important;
1429
+ }
1430
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@momoi-labs/kiso",
3
- "version": "0.11.0",
3
+ "version": "0.12.0",
4
4
  "description": "Kiso design-system contracts and generated design tokens",
5
5
  "license": "MIT",
6
6
  "repository": {