@momoi-labs/kiso 0.11.0 → 0.12.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.
@@ -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
 
@@ -80,7 +80,7 @@ it, so the mark points at the corner without touching it.
80
80
  | Token | Value | Meaning |
81
81
  | --- | --- | --- |
82
82
  | `--color-corner-mark` | `--color-border-strong` | Tick colour. |
83
- | `--corner-mark` | `1` | Opacity: marks on (`1`) or off (`0`). |
83
+ | `--corner-mark` | `1` | Marks on (`1`) or off (`0`). Off marks also drop their inset, so they add no overflow to a scroll container around the panel. |
84
84
  | `--corner-mark-tick` | 4px | Length of one tick. |
85
85
  | `--corner-mark-gap` | 2px | Distance from tick end to the frame. |
86
86
 
@@ -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,16 +277,16 @@ 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.
286
286
 
287
287
  | Token | Value | Meaning |
288
288
  | --- | --- | --- |
289
- | `--corner-mark` | `1` | Opacity: marks on (`1`) or off (`0`). |
289
+ | `--corner-mark` | `1` | Marks on (`1`) or off (`0`). Off marks also drop their inset, so they add no overflow to a scroll container around the panel. |
290
290
  | `--corner-mark-tick` | 4px | Length of one tick. |
291
291
  | `--corner-mark-gap` | 2px | Distance from tick end to the frame. |
292
292
 
@@ -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
@@ -106,9 +106,11 @@ a, .link {
106
106
  a:hover, .link:hover { text-decoration: underline; }
107
107
 
108
108
  /* --- layout helpers ------------------------------------------------------ */
109
- .stack { display: grid; gap: var(--spacing-lg); }
110
- .stack-sm{ display: grid; gap: var(--spacing-sm); }
111
- .stack-xs{ display: grid; gap: var(--spacing-xs); }
109
+ /* One explicit column of minmax(0, 1fr), so a wide table, chart, or log line
110
+ inside a stack cannot widen the page; it scrolls or wraps in place instead. */
111
+ .stack { display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--spacing-lg); }
112
+ .stack-sm{ display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--spacing-sm); }
113
+ .stack-xs{ display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--spacing-xs); }
112
114
  .row { display: flex; align-items: center; gap: var(--spacing-sm); }
113
115
  .row-md { display: flex; align-items: center; gap: var(--spacing-md); }
114
116
  .row-wrap{ display: flex; align-items: center; gap: var(--spacing-sm); flex-wrap: wrap; }
@@ -667,6 +669,9 @@ table.table { width: 100%; border-collapse: collapse; font-size: var(--type-size
667
669
  .table .col-tight { width: 1%; white-space: nowrap; }
668
670
  .th-sort { display: inline-flex; align-items: center; gap: var(--spacing-xs); cursor: pointer; background: none; border: 0; font: inherit; color: inherit; padding: 0; }
669
671
  .table-toolbar { display: flex; align-items: center; gap: var(--spacing-sm); padding: var(--spacing-md); border-bottom: 1px solid var(--color-border); }
672
+ /* In a toolbar a select is an accessory to the search, not a form field, so
673
+ it takes only what its longest option needs. */
674
+ .table-toolbar > .select { width: auto; flex: none; }
670
675
  .table-footer { display: flex; align-items: center; justify-content: space-between; gap: var(--spacing-md); padding: var(--spacing-sm) var(--spacing-md); border-top: 1px solid var(--color-border); font-size: var(--type-size-label); color: var(--color-muted-foreground); }
671
676
 
672
677
  /* ===========================================================================
@@ -682,12 +687,16 @@ table.table { width: 100%; border-collapse: collapse; font-size: var(--type-size
682
687
  font-size: var(--type-size-body);
683
688
  font-weight: var(--type-weight-medium);
684
689
  color: var(--color-muted-foreground);
690
+ white-space: nowrap; /* a strip that scrolls sideways must not wrap "Last run" */
685
691
  cursor: pointer;
686
692
  }
687
693
  .tabs button:hover { color: var(--color-foreground); }
688
694
  .tabs button[aria-selected="true"] { color: var(--color-foreground); }
695
+ /* The underline stays inside the button, just above the strip's border, so a
696
+ strip that scrolls sideways has no extra pixel of block overflow to draw a
697
+ scrollbar for. */
689
698
  .tabs button[aria-selected="true"]::after {
690
- content: ""; position: absolute; inset-inline: 0; bottom: -1px; height: 2px;
699
+ content: ""; position: absolute; inset-inline: 0; bottom: 0; height: 2px;
691
700
  background: var(--color-primary);
692
701
  border-radius: var(--radius-full);
693
702
  }
@@ -798,6 +807,7 @@ table.table { width: 100%; border-collapse: collapse; font-size: var(--type-size
798
807
  }
799
808
 
800
809
  .palette {
810
+ position: relative;
801
811
  width: 100%; max-width: 560px;
802
812
  background: var(--color-popover);
803
813
  border: 1px solid var(--color-border);
@@ -988,7 +998,7 @@ table.table { width: 100%; border-collapse: collapse; font-size: var(--type-size
988
998
  font-weight: var(--type-weight-medium);
989
999
  }
990
1000
 
991
- .page { padding: var(--spacing-xl); display: grid; gap: var(--spacing-xl); align-content: start; max-width: var(--size-content-max); }
1001
+ .page { padding: var(--spacing-xl); display: grid; grid-template-columns: minmax(0, 1fr); gap: var(--spacing-xl); align-content: start; min-width: 0; max-width: var(--size-content-max); }
992
1002
  .page-header { display: grid; gap: var(--spacing-2xs); }
993
1003
 
994
1004
  /* ===========================================================================
@@ -1066,65 +1076,188 @@ pre code { display: block; overflow-x: auto; padding: 0; background: none; borde
1066
1076
  .chip-action { min-width: var(--size-touch-min); height: var(--size-touch-min); }
1067
1077
  }
1068
1078
 
1079
+ /* Narrow viewports: the sidebar stacks above main as compact navigation
1080
+ instead of disappearing, since it may be the only way to reach a
1081
+ destination. It keeps its own scroller so a long list does not push the
1082
+ page down. */
1069
1083
  @media (max-width: 1023px) {
1070
1084
  .app-shell { grid-template-columns: 1fr; }
1071
- .sidebar { display: none; }
1085
+ .sidebar {
1086
+ position: static; height: auto; max-height: 40vh;
1087
+ border-inline-end: 0;
1088
+ border-block-end: 1px solid var(--color-sidebar-border);
1089
+ }
1072
1090
  }
1073
1091
 
1074
1092
 
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.
1093
+ /* Appearance attributes. Set these on html to include portalled content. */
1094
+ :root {
1095
+ --appearance-scale: 1;
1096
+ --appearance-square-scale: 1;
1097
+ --appearance-panel-shadow: 0 0 transparent;
1098
+ --appearance-panel-border: solid;
1099
+ }
1100
+ [data-corner-size="off"] { --appearance-scale: 0; --appearance-square-scale: 0; }
1101
+ [data-corner-size="small"] { --appearance-scale: .5; }
1102
+ [data-corner-size="medium"] { --appearance-scale: 1; }
1103
+ [data-corner-size="large"] { --appearance-scale: 1.5; }
1104
+ [data-border-style] {
1105
+ --appearance-base-radius: 8px;
1106
+ --appearance-control-base: 4px;
1107
+ --appearance-panel-border: solid;
1108
+ --appearance-panel-shadow: 0 0 transparent;
1109
+ --appearance-overlay-content: none;
1110
+ --appearance-footer-start: var(--radius-surface);
1111
+ --appearance-overlay-inset: 0;
1112
+ --appearance-overlay-border: 0;
1113
+ --appearance-overlay-radius: var(--appearance-corners);
1114
+ --radius-surface: calc(var(--appearance-base-radius) * var(--appearance-scale));
1115
+ --radius-md: calc(var(--appearance-control-base) * var(--appearance-scale));
1116
+ --radius-xs: calc(var(--radius-md) / 2);
1117
+ --radius-sm: calc(var(--radius-md) * .75);
1118
+ --radius-lg: calc(var(--radius-md) * 1.25);
1119
+ --appearance-corners: var(--radius-surface);
1120
+ --appearance-control-corners: var(--radius-md);
1121
+ }
1122
+ [data-border-style="square"] {
1123
+ --appearance-base-radius: 0px;
1124
+ --radius-xs: calc(2px * var(--appearance-square-scale));
1125
+ --radius-sm: calc(3px * var(--appearance-square-scale));
1126
+ --radius-md: calc(4px * var(--appearance-square-scale));
1127
+ --radius-lg: calc(5px * var(--appearance-square-scale));
1128
+ }
1129
+ [data-border-style="soft"] { --appearance-base-radius: 8px; }
1130
+ [data-border-style="round"] { --appearance-base-radius: 16px; --appearance-control-base: 8px; }
1131
+ [data-border-style="asym"] {
1132
+ --appearance-footer-start: calc(3px * var(--appearance-scale));
1133
+ --appearance-base-radius: 12px;
1134
+ --appearance-control-base: 6px;
1135
+ --appearance-corners: var(--radius-surface) calc(3px * var(--appearance-scale));
1136
+ --appearance-control-corners: var(--radius-md) calc(2px * var(--appearance-scale));
1137
+ }
1138
+ [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); }
1139
+ [data-border-style="dash"] { --appearance-panel-border: dashed; }
1140
+ [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); }
1141
+ [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)); }
1142
+ [data-border-style="base"] { --appearance-overlay-content: "";
1143
+ /* Match the outer frame so the thick base covers its bottom hairline. */
1144
+ --appearance-overlay-inset: -1px;
1145
+ --appearance-panel-shadow: inset 0 -3px var(--color-border-strong);
1146
+ }
1147
+ [data-border-style="offset"] { --appearance-overlay-content: "";
1148
+ --appearance-overlay-inset: -1px;
1149
+ /* An opaque, hard shadow keeps underlying content out of the offset. */
1150
+ --appearance-panel-shadow: 3px 3px 0 0 var(--color-border-strong);
1151
+ }
1152
+
1153
+ :where([data-border-style]) :is(.card, .dialog, .table-wrap, .logview, .marked, .palette, pre) {
1154
+ border-radius: var(--appearance-corners);
1155
+ border-style: var(--appearance-panel-border);
1156
+ }
1157
+ /* Paint decorative edges above table headers and panel footers. */
1158
+ :is(.card, .dialog, .table-wrap, .logview, .marked, .palette, pre)::before {
1159
+ content: var(--appearance-overlay-content, none);
1160
+ position: absolute;
1161
+ inset: var(--appearance-overlay-inset);
1162
+ border: var(--appearance-overlay-border);
1163
+ border-radius: var(--appearance-overlay-radius);
1164
+ box-shadow: var(--appearance-panel-shadow);
1165
+ pointer-events: none;
1166
+ z-index: 1;
1167
+ }
1168
+ :where([data-border-style]) .palette { overflow: visible; }
1169
+ :where([data-border-style]) .palette-list { border-end-start-radius: var(--radius-surface); border-end-end-radius: var(--radius-surface); }
1170
+ :where([data-border-style]) :is(.card-footer, .dialog-footer) {
1171
+ border-end-start-radius: var(--appearance-footer-start);
1172
+ border-end-end-radius: var(--radius-surface);
1173
+ }
1174
+ :where([data-border-style]) :is(.btn:not(.btn-xs), .input, .select, .textarea, .nav-item, .menu-item) {
1175
+ border-radius: var(--appearance-control-corners);
1176
+ }
1086
1177
 
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 {
1178
+ [data-mark-size="small"] { --corner-mark-tick: 2px; --corner-mark-gap: 1px; }
1179
+ [data-mark-size="medium"] { --corner-mark-tick: 4px; --corner-mark-gap: 2px; }
1180
+ [data-mark-size="large"] { --corner-mark-tick: 8px; --corner-mark-gap: 4px; }
1181
+ [data-corner-marks] {
1182
+ --corner-mark: 1;
1183
+ --appearance-palette-marks: "";
1184
+ --appearance-mark-mask: none;
1185
+ --appearance-mark-bg: transparent;
1186
+ --appearance-mark-inset: initial;
1187
+ --appearance-mark-images: initial;
1188
+ }
1189
+ [data-corner-marks="none"] { --corner-mark: 0; }
1190
+ :is(.card, .dialog, .table-wrap, .logview, .marked, .palette, pre)::after {
1096
1191
  content: "";
1097
1192
  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
1193
  pointer-events: none;
1101
1194
  opacity: var(--corner-mark);
1102
1195
  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
1196
  background-size:
1113
1197
  var(--corner-mark-tick) 1px, 1px var(--corner-mark-tick),
1114
1198
  var(--corner-mark-tick) 1px, 1px var(--corner-mark-tick),
1115
1199
  var(--corner-mark-tick) 1px, 1px var(--corner-mark-tick),
1116
1200
  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
1201
  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)),
1202
+ left 0 top calc(var(--corner-mark-tick) + var(--corner-mark-gap)),
1203
+ left calc(var(--corner-mark-tick) + var(--corner-mark-gap)) top 0,
1204
+ right 0 top calc(var(--corner-mark-tick) + var(--corner-mark-gap)),
1122
1205
  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,
1206
+ left 0 bottom calc(var(--corner-mark-tick) + var(--corner-mark-gap)),
1207
+ left calc(var(--corner-mark-tick) + var(--corner-mark-gap)) bottom 0,
1125
1208
  right 0 bottom calc(var(--corner-mark-tick) + var(--corner-mark-gap)),
1126
1209
  right calc(var(--corner-mark-tick) + var(--corner-mark-gap)) bottom 0;
1127
- }
1210
+ /* Marks that are off (`--corner-mark: 0`) also collapse the inset to 0, so
1211
+ the pseudo-element stops reaching outside the frame and a scroll container
1212
+ around the panel does not scroll for marks nobody sees. */
1213
+ inset: calc(var(--corner-mark, 1) * var(--appearance-mark-inset, calc(-1 * (var(--corner-mark-tick) + var(--corner-mark-gap)))));
1214
+ background-image: var(--appearance-mark-images,
1215
+ linear-gradient(var(--color-corner-mark), var(--color-corner-mark)),
1216
+ linear-gradient(var(--color-corner-mark), var(--color-corner-mark)),
1217
+ linear-gradient(var(--color-corner-mark), var(--color-corner-mark)),
1218
+ linear-gradient(var(--color-corner-mark), var(--color-corner-mark)),
1219
+ linear-gradient(var(--color-corner-mark), var(--color-corner-mark)),
1220
+ linear-gradient(var(--color-corner-mark), var(--color-corner-mark)),
1221
+ linear-gradient(var(--color-corner-mark), var(--color-corner-mark)),
1222
+ linear-gradient(var(--color-corner-mark), var(--color-corner-mark)));
1223
+ background-color: var(--appearance-mark-bg, transparent);
1224
+ mask-image: var(--appearance-mark-mask, none);
1225
+ mask-size: calc(var(--corner-mark-tick) + 1px) calc(var(--corner-mark-tick) + 1px);
1226
+ mask-position: left top, right top, left bottom, right bottom;
1227
+ mask-repeat: no-repeat;
1228
+ }
1229
+
1230
+ [data-corner-marks="brackets"] {
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%3Cpath%20d%3D%22M.5%209.5V.5H9.5%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%3Cpath%20d%3D%22M.5%209.5V.5H9.5%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%3Cpath%20d%3D%22M.5%209.5V.5H9.5%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%3Cpath%20d%3D%22M.5%209.5V.5H9.5%22%2F%3E%3C%2Fg%3E%3C%2Fsvg%3E");
1238
+ }
1239
+
1240
+ [data-corner-marks="arcs"] {
1241
+ --appearance-mark-images: none;
1242
+ --appearance-mark-bg: var(--color-corner-mark);
1243
+ --appearance-mark-inset: calc(-1 * (var(--corner-mark-gap) + 1px));
1244
+ --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"),
1245
+ 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"),
1246
+ 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"),
1247
+ 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");
1248
+ }
1249
+
1250
+ [data-corner-marks="dots"] {
1251
+ --appearance-mark-images: none;
1252
+ --appearance-mark-bg: var(--color-corner-mark);
1253
+ --appearance-mark-inset: calc(-1 * (var(--corner-mark-gap) + 1px));
1254
+ --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"),
1255
+ 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"),
1256
+ 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"),
1257
+ 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");
1258
+ }
1259
+
1260
+ .palette::after { content: var(--appearance-palette-marks, none); }
1128
1261
  .marked { position: relative; }
1129
1262
 
1130
1263
  /* ===========================================================================
@@ -1305,3 +1438,13 @@ button.step-row:focus-visible { outline: 2px solid var(--color-focus); outline-o
1305
1438
  @media (pointer: coarse) {
1306
1439
  .chart-series-button { min-height: var(--size-touch-min); min-width: var(--size-touch-min); }
1307
1440
  }
1441
+
1442
+ /* Respect reduced motion in every consumer, including React controls. */
1443
+ @media (prefers-reduced-motion: reduce) {
1444
+ *,
1445
+ *::before,
1446
+ *::after {
1447
+ animation: none !important;
1448
+ transition: none !important;
1449
+ }
1450
+ }
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.1",
4
4
  "description": "Kiso design-system contracts and generated design tokens",
5
5
  "license": "MIT",
6
6
  "repository": {