@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` |
|
|
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
|
-
|
|
95
|
-
|
|
96
|
-
|
|
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
|
|
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`.
|
package/kiso/docs/tokens.md
CHANGED
|
@@ -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
|
|
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` |
|
|
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
|
|
300
|
-
|
|
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**
|
|
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
|
-
|
|
110
|
-
|
|
111
|
-
.stack
|
|
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:
|
|
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 {
|
|
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
|
-
|
|
1077
|
-
|
|
1078
|
-
|
|
1079
|
-
|
|
1080
|
-
|
|
1081
|
-
|
|
1082
|
-
|
|
1083
|
-
|
|
1084
|
-
|
|
1085
|
-
|
|
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
|
-
|
|
1088
|
-
|
|
1089
|
-
|
|
1090
|
-
|
|
1091
|
-
|
|
1092
|
-
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
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
|
|
1120
|
-
left
|
|
1121
|
-
right 0 top
|
|
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
|
|
1124
|
-
left
|
|
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
|
+
}
|