@xenosystem/elements-react 0.0.4 → 0.0.5
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.
- package/LICENSE +18 -18
- package/README.md +41 -41
- package/dist/containers/Chip.js +1 -1
- package/dist/containers/Panel.js +1 -1
- package/package.json +58 -58
- package/src/chrome-separated.css +132 -132
- package/src/chrome-unified.css +72 -72
- package/src/containers/Badges.css +116 -116
- package/src/containers/avatar.css +70 -70
- package/src/containers/card.css +75 -75
- package/src/containers/chip.css +103 -103
- package/src/containers/list-row.css +132 -132
- package/src/containers/message-bubble.css +112 -112
- package/src/containers/panel.css +125 -120
- package/src/containers/table.css +102 -102
- package/src/containers/tile.css +17 -17
- package/src/content/callout.css +77 -77
- package/src/content/caret.css +30 -30
- package/src/content/code-block.css +159 -159
- package/src/content/collapsible.css +80 -80
- package/src/content/inline-code.css +14 -14
- package/src/content/model-picker.css +219 -219
- package/src/content/source-card.css +99 -99
- package/src/content/sources-disclosure.css +118 -118
- package/src/controls.css +453 -453
- package/src/fonts.css +34 -34
- package/src/forms/Checkbox.css +114 -114
- package/src/forms/RadioGroup.css +115 -115
- package/src/goo.css +97 -97
- package/src/icon-motion.css +1909 -1909
- package/src/layout/ResizablePanel.css +79 -79
- package/src/nav/sidebar.css +296 -296
- package/src/overlays/date-time-picker.css +238 -238
- package/src/overlays/menu.css +195 -195
- package/src/overlays/modal.css +167 -167
- package/src/overlays/picker-field.css +81 -81
- package/src/overlays/pill-filter.css +129 -129
- package/src/overlays/reveal.css +56 -56
- package/src/overlays/segmented-control.css +185 -185
- package/src/overlays/tabs.css +143 -143
- package/src/overlays/tooltip.css +126 -126
- package/src/scrollbar.css +184 -184
- package/src/size.css +179 -179
- package/src/status/progress-bar.css +88 -88
- package/src/status/spinner.css +33 -33
- package/src/status/statusindicator.css +65 -65
- package/src/status/steptimeline.css +137 -137
- package/src/status/thinkingcube.css +75 -75
- package/src/xeno-element.css +60 -60
- package/src/xeno-elements.css +71 -71
- package/src/xeno-theme.css +112 -112
package/src/containers/table.css
CHANGED
|
@@ -1,102 +1,102 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Dense table styles — the locked grammar for Table / DataTable. CSS-first: appearance is driven by
|
|
3
|
-
* the `xeno-*` classes plus the `data-align` / `data-selection` seams, reading only the theme custom
|
|
4
|
-
* properties from `xeno-theme.css`. Border-collapse with hairline BOTTOM row rules only — no vertical
|
|
5
|
-
* rules, no zebra striping. Monochrome throughout; no literal colours.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
.xeno-table {
|
|
9
|
-
width: 100%;
|
|
10
|
-
border-collapse: collapse;
|
|
11
|
-
font-size: 0.9em;
|
|
12
|
-
color: var(--xeno-text);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
.xeno-th,
|
|
16
|
-
.xeno-td {
|
|
17
|
-
padding: 6px 11px;
|
|
18
|
-
text-align: left;
|
|
19
|
-
vertical-align: middle;
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
.xeno-th {
|
|
23
|
-
color: var(--xeno-muted);
|
|
24
|
-
font-weight: 600;
|
|
25
|
-
font-size: 0.85em;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/* Bottom border only on rows — the sole rule; header row divider comes for free. */
|
|
29
|
-
.xeno-tr {
|
|
30
|
-
border-bottom: 1px solid var(--xeno-border);
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
/* ── Tracking a row ───────────────────────────────────────────────────────────────────
|
|
34
|
-
* A dense table is READ by running your eye along a line, and until now nothing under the pointer
|
|
35
|
-
* answered — which is what makes a table feel like a picture of data instead of data.
|
|
36
|
-
*
|
|
37
|
-
* The restraint here is deliberate and is the opposite of the choice made for the toggles: no flood,
|
|
38
|
-
* no travel. You cross a dozen rows in a second while scanning, and anything with a 300ms gesture
|
|
39
|
-
* would still be arriving when you have already left. A wash that is simply THERE is the correct
|
|
40
|
-
* answer; the only thing that moves is a hairline on the leading edge, and it moves in 140ms.
|
|
41
|
-
*
|
|
42
|
-
* Body rows only. The header is not a row you track, and neither is the empty-state row — there is
|
|
43
|
-
* nothing under the pointer there to answer for. */
|
|
44
|
-
.xeno-tbody .xeno-tr:hover:not(:has(.xeno-table-empty)) {
|
|
45
|
-
background: var(--xeno-hover);
|
|
46
|
-
}
|
|
47
|
-
|
|
48
|
-
/* Selection axis — a step ABOVE the hover wash, not the same token. They used to share
|
|
49
|
-
`--xeno-hover`, so once rows answered the pointer a hovered row and a selected row were the same
|
|
50
|
-
colour, and the selection stopped meaning anything. */
|
|
51
|
-
.xeno-tr[data-selection='on'] {
|
|
52
|
-
background: var(--xeno-control);
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/* The leading-edge mark: a hairline that grows from the middle of the row, on hover and on selection.
|
|
56
|
-
It lives on the first cell rather than the row, because a `<tr>` is not a reliable containing block
|
|
57
|
-
under `border-collapse` — cells are. */
|
|
58
|
-
.xeno-tbody .xeno-tr > :first-child {
|
|
59
|
-
position: relative;
|
|
60
|
-
}
|
|
61
|
-
.xeno-tbody .xeno-tr > :first-child::before {
|
|
62
|
-
content: '';
|
|
63
|
-
position: absolute;
|
|
64
|
-
left: 0;
|
|
65
|
-
top: 0;
|
|
66
|
-
bottom: 0;
|
|
67
|
-
width: 2px;
|
|
68
|
-
background: var(--xeno-text);
|
|
69
|
-
border-radius: var(--xeno-radius-hair, 1.5px);
|
|
70
|
-
transform: scaleY(0);
|
|
71
|
-
transform-origin: center;
|
|
72
|
-
}
|
|
73
|
-
.xeno-tbody .xeno-tr:hover:not(:has(.xeno-table-empty)) > :first-child::before,
|
|
74
|
-
.xeno-tbody .xeno-tr[data-selection='on'] > :first-child::before {
|
|
75
|
-
transform: scaleY(1);
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/* Alignment overrides (data-* seam). */
|
|
79
|
-
.xeno-th[data-align='center'],
|
|
80
|
-
.xeno-td[data-align='center'] {
|
|
81
|
-
text-align: center;
|
|
82
|
-
}
|
|
83
|
-
.xeno-th[data-align='right'],
|
|
84
|
-
.xeno-td[data-align='right'] {
|
|
85
|
-
text-align: right;
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/* Empty state — muted, roomy, column-spanning. */
|
|
89
|
-
.xeno-table-empty {
|
|
90
|
-
padding: 18px 11px;
|
|
91
|
-
color: var(--xeno-muted);
|
|
92
|
-
text-align: center;
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
@media (prefers-reduced-motion: no-preference) {
|
|
96
|
-
.xeno-tr {
|
|
97
|
-
transition: background var(--xeno-dur) var(--xeno-ease);
|
|
98
|
-
}
|
|
99
|
-
.xeno-tbody .xeno-tr > :first-child::before {
|
|
100
|
-
transition: transform var(--xeno-dur) var(--xeno-ease);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
1
|
+
/*
|
|
2
|
+
* Dense table styles — the locked grammar for Table / DataTable. CSS-first: appearance is driven by
|
|
3
|
+
* the `xeno-*` classes plus the `data-align` / `data-selection` seams, reading only the theme custom
|
|
4
|
+
* properties from `xeno-theme.css`. Border-collapse with hairline BOTTOM row rules only — no vertical
|
|
5
|
+
* rules, no zebra striping. Monochrome throughout; no literal colours.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
.xeno-table {
|
|
9
|
+
width: 100%;
|
|
10
|
+
border-collapse: collapse;
|
|
11
|
+
font-size: 0.9em;
|
|
12
|
+
color: var(--xeno-text);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
.xeno-th,
|
|
16
|
+
.xeno-td {
|
|
17
|
+
padding: 6px 11px;
|
|
18
|
+
text-align: left;
|
|
19
|
+
vertical-align: middle;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
.xeno-th {
|
|
23
|
+
color: var(--xeno-muted);
|
|
24
|
+
font-weight: 600;
|
|
25
|
+
font-size: 0.85em;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* Bottom border only on rows — the sole rule; header row divider comes for free. */
|
|
29
|
+
.xeno-tr {
|
|
30
|
+
border-bottom: 1px solid var(--xeno-border);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/* ── Tracking a row ───────────────────────────────────────────────────────────────────
|
|
34
|
+
* A dense table is READ by running your eye along a line, and until now nothing under the pointer
|
|
35
|
+
* answered — which is what makes a table feel like a picture of data instead of data.
|
|
36
|
+
*
|
|
37
|
+
* The restraint here is deliberate and is the opposite of the choice made for the toggles: no flood,
|
|
38
|
+
* no travel. You cross a dozen rows in a second while scanning, and anything with a 300ms gesture
|
|
39
|
+
* would still be arriving when you have already left. A wash that is simply THERE is the correct
|
|
40
|
+
* answer; the only thing that moves is a hairline on the leading edge, and it moves in 140ms.
|
|
41
|
+
*
|
|
42
|
+
* Body rows only. The header is not a row you track, and neither is the empty-state row — there is
|
|
43
|
+
* nothing under the pointer there to answer for. */
|
|
44
|
+
.xeno-tbody .xeno-tr:hover:not(:has(.xeno-table-empty)) {
|
|
45
|
+
background: var(--xeno-hover);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/* Selection axis — a step ABOVE the hover wash, not the same token. They used to share
|
|
49
|
+
`--xeno-hover`, so once rows answered the pointer a hovered row and a selected row were the same
|
|
50
|
+
colour, and the selection stopped meaning anything. */
|
|
51
|
+
.xeno-tr[data-selection='on'] {
|
|
52
|
+
background: var(--xeno-control);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* The leading-edge mark: a hairline that grows from the middle of the row, on hover and on selection.
|
|
56
|
+
It lives on the first cell rather than the row, because a `<tr>` is not a reliable containing block
|
|
57
|
+
under `border-collapse` — cells are. */
|
|
58
|
+
.xeno-tbody .xeno-tr > :first-child {
|
|
59
|
+
position: relative;
|
|
60
|
+
}
|
|
61
|
+
.xeno-tbody .xeno-tr > :first-child::before {
|
|
62
|
+
content: '';
|
|
63
|
+
position: absolute;
|
|
64
|
+
left: 0;
|
|
65
|
+
top: 0;
|
|
66
|
+
bottom: 0;
|
|
67
|
+
width: 2px;
|
|
68
|
+
background: var(--xeno-text);
|
|
69
|
+
border-radius: var(--xeno-radius-hair, 1.5px);
|
|
70
|
+
transform: scaleY(0);
|
|
71
|
+
transform-origin: center;
|
|
72
|
+
}
|
|
73
|
+
.xeno-tbody .xeno-tr:hover:not(:has(.xeno-table-empty)) > :first-child::before,
|
|
74
|
+
.xeno-tbody .xeno-tr[data-selection='on'] > :first-child::before {
|
|
75
|
+
transform: scaleY(1);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/* Alignment overrides (data-* seam). */
|
|
79
|
+
.xeno-th[data-align='center'],
|
|
80
|
+
.xeno-td[data-align='center'] {
|
|
81
|
+
text-align: center;
|
|
82
|
+
}
|
|
83
|
+
.xeno-th[data-align='right'],
|
|
84
|
+
.xeno-td[data-align='right'] {
|
|
85
|
+
text-align: right;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/* Empty state — muted, roomy, column-spanning. */
|
|
89
|
+
.xeno-table-empty {
|
|
90
|
+
padding: 18px 11px;
|
|
91
|
+
color: var(--xeno-muted);
|
|
92
|
+
text-align: center;
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
96
|
+
.xeno-tr {
|
|
97
|
+
transition: background var(--xeno-dur) var(--xeno-ease);
|
|
98
|
+
}
|
|
99
|
+
.xeno-tbody .xeno-tr > :first-child::before {
|
|
100
|
+
transition: transform var(--xeno-dur) var(--xeno-ease);
|
|
101
|
+
}
|
|
102
|
+
}
|
package/src/containers/tile.css
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Tile — a square icon tile. Rounded square (radius-md), a surface ground, a hairline border, and a
|
|
3
|
-
* centred glyph in muted ink. The box edge arrives as an inline `--xeno-tile-size` var. No literal
|
|
4
|
-
* colours; monochrome shell.
|
|
5
|
-
*/
|
|
6
|
-
.xeno-tile {
|
|
7
|
-
display: inline-flex;
|
|
8
|
-
align-items: center;
|
|
9
|
-
justify-content: center;
|
|
10
|
-
flex: 0 0 auto;
|
|
11
|
-
width: var(--xeno-tile-size, 32px);
|
|
12
|
-
height: var(--xeno-tile-size, 32px);
|
|
13
|
-
color: var(--xeno-muted);
|
|
14
|
-
background: var(--xeno-surface);
|
|
15
|
-
border: 1px solid var(--xeno-border);
|
|
16
|
-
border-radius: var(--xeno-radius-md);
|
|
17
|
-
}
|
|
1
|
+
/*
|
|
2
|
+
* Tile — a square icon tile. Rounded square (radius-md), a surface ground, a hairline border, and a
|
|
3
|
+
* centred glyph in muted ink. The box edge arrives as an inline `--xeno-tile-size` var. No literal
|
|
4
|
+
* colours; monochrome shell.
|
|
5
|
+
*/
|
|
6
|
+
.xeno-tile {
|
|
7
|
+
display: inline-flex;
|
|
8
|
+
align-items: center;
|
|
9
|
+
justify-content: center;
|
|
10
|
+
flex: 0 0 auto;
|
|
11
|
+
width: var(--xeno-tile-size, 32px);
|
|
12
|
+
height: var(--xeno-tile-size, 32px);
|
|
13
|
+
color: var(--xeno-muted);
|
|
14
|
+
background: var(--xeno-surface);
|
|
15
|
+
border: 1px solid var(--xeno-border);
|
|
16
|
+
border-radius: var(--xeno-radius-md);
|
|
17
|
+
}
|
package/src/content/callout.css
CHANGED
|
@@ -1,77 +1,77 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* <Callout> — a left-ruled blockquote. Monochrome by default (muted italic ink, hairline rule); the
|
|
3
|
-
* `danger` tone is the sole exception, swapping the rule and the glyph to `--xeno-danger`. Tokens only.
|
|
4
|
-
*
|
|
5
|
-
* The rule is a pseudo-element rather than a `border-left` for one reason: a border cannot be scaled
|
|
6
|
-
* from its top edge, and the entrance below is the rule DRAWING DOWN. Everything else about it is
|
|
7
|
-
* identical — 2px wide, flush left, the same total 14px inset to the text.
|
|
8
|
-
*/
|
|
9
|
-
.xeno-callout {
|
|
10
|
-
position: relative;
|
|
11
|
-
margin: 0;
|
|
12
|
-
padding-left: 14px;
|
|
13
|
-
color: var(--xeno-muted);
|
|
14
|
-
font-style: italic;
|
|
15
|
-
}
|
|
16
|
-
.xeno-callout::before {
|
|
17
|
-
content: '';
|
|
18
|
-
position: absolute;
|
|
19
|
-
left: 0;
|
|
20
|
-
top: 0;
|
|
21
|
-
bottom: 0;
|
|
22
|
-
width: 2px;
|
|
23
|
-
background: var(--xeno-border);
|
|
24
|
-
/* Square: at 2px wide a 1.5px radius is 75% of the width, which is a capsule, not a corner. */
|
|
25
|
-
border-radius: 0;
|
|
26
|
-
transform-origin: top center;
|
|
27
|
-
}
|
|
28
|
-
.xeno-callout[data-tone='danger']::before {
|
|
29
|
-
background: var(--xeno-danger);
|
|
30
|
-
}
|
|
31
|
-
|
|
32
|
-
/* The flex row exists ONLY when there is a glyph. Without one the children stay direct descendants of
|
|
33
|
-
the blockquote, so a run of `<p>`s lays out as prose rather than as a row of flex items. */
|
|
34
|
-
.xeno-callout[data-icon] {
|
|
35
|
-
display: flex;
|
|
36
|
-
align-items: flex-start;
|
|
37
|
-
gap: 9px;
|
|
38
|
-
}
|
|
39
|
-
.xeno-callout-icon {
|
|
40
|
-
display: inline-flex;
|
|
41
|
-
flex: none;
|
|
42
|
-
margin-top: 1px; /* optical: the glyph's box sits a hair above the italic x-height */
|
|
43
|
-
color: var(--xeno-muted);
|
|
44
|
-
}
|
|
45
|
-
.xeno-callout[data-tone='danger'] .xeno-callout-icon {
|
|
46
|
-
color: var(--xeno-danger);
|
|
47
|
-
}
|
|
48
|
-
.xeno-callout-body {
|
|
49
|
-
min-width: 0;
|
|
50
|
-
}
|
|
51
|
-
|
|
52
|
-
/* ── Entrance ─────────────────────────────────────────────────────────────────────────
|
|
53
|
-
* The rule leads and the text follows it in. Two tracks rather than one fade, because the rule IS the
|
|
54
|
-
* callout's form — a block that simply fades up could be any block, while a rule drawing down from the
|
|
55
|
-
* top is unmistakably this one. The rule takes longer than the text on purpose: it is still arriving
|
|
56
|
-
* as the words settle, so the two read as one gesture instead of two. */
|
|
57
|
-
.xeno-callout[data-enter] {
|
|
58
|
-
animation: xeno-callout-in var(--xeno-dur-entrance, 240ms) var(--xeno-ease) both;
|
|
59
|
-
}
|
|
60
|
-
.xeno-callout[data-enter]::before {
|
|
61
|
-
animation: xeno-callout-rule 320ms var(--xeno-ease-expo, cubic-bezier(0.16, 1, 0.3, 1)) both;
|
|
62
|
-
}
|
|
63
|
-
@keyframes xeno-callout-in {
|
|
64
|
-
from { opacity: 0; translate: 5px 0; }
|
|
65
|
-
to { opacity: 1; translate: 0 0; }
|
|
66
|
-
}
|
|
67
|
-
@keyframes xeno-callout-rule {
|
|
68
|
-
from { scale: 1 0; }
|
|
69
|
-
to { scale: 1 1; }
|
|
70
|
-
}
|
|
71
|
-
|
|
72
|
-
@media (prefers-reduced-motion: reduce) {
|
|
73
|
-
.xeno-callout[data-enter],
|
|
74
|
-
.xeno-callout[data-enter]::before {
|
|
75
|
-
animation: none;
|
|
76
|
-
}
|
|
77
|
-
}
|
|
1
|
+
/*
|
|
2
|
+
* <Callout> — a left-ruled blockquote. Monochrome by default (muted italic ink, hairline rule); the
|
|
3
|
+
* `danger` tone is the sole exception, swapping the rule and the glyph to `--xeno-danger`. Tokens only.
|
|
4
|
+
*
|
|
5
|
+
* The rule is a pseudo-element rather than a `border-left` for one reason: a border cannot be scaled
|
|
6
|
+
* from its top edge, and the entrance below is the rule DRAWING DOWN. Everything else about it is
|
|
7
|
+
* identical — 2px wide, flush left, the same total 14px inset to the text.
|
|
8
|
+
*/
|
|
9
|
+
.xeno-callout {
|
|
10
|
+
position: relative;
|
|
11
|
+
margin: 0;
|
|
12
|
+
padding-left: 14px;
|
|
13
|
+
color: var(--xeno-muted);
|
|
14
|
+
font-style: italic;
|
|
15
|
+
}
|
|
16
|
+
.xeno-callout::before {
|
|
17
|
+
content: '';
|
|
18
|
+
position: absolute;
|
|
19
|
+
left: 0;
|
|
20
|
+
top: 0;
|
|
21
|
+
bottom: 0;
|
|
22
|
+
width: 2px;
|
|
23
|
+
background: var(--xeno-border);
|
|
24
|
+
/* Square: at 2px wide a 1.5px radius is 75% of the width, which is a capsule, not a corner. */
|
|
25
|
+
border-radius: 0;
|
|
26
|
+
transform-origin: top center;
|
|
27
|
+
}
|
|
28
|
+
.xeno-callout[data-tone='danger']::before {
|
|
29
|
+
background: var(--xeno-danger);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/* The flex row exists ONLY when there is a glyph. Without one the children stay direct descendants of
|
|
33
|
+
the blockquote, so a run of `<p>`s lays out as prose rather than as a row of flex items. */
|
|
34
|
+
.xeno-callout[data-icon] {
|
|
35
|
+
display: flex;
|
|
36
|
+
align-items: flex-start;
|
|
37
|
+
gap: 9px;
|
|
38
|
+
}
|
|
39
|
+
.xeno-callout-icon {
|
|
40
|
+
display: inline-flex;
|
|
41
|
+
flex: none;
|
|
42
|
+
margin-top: 1px; /* optical: the glyph's box sits a hair above the italic x-height */
|
|
43
|
+
color: var(--xeno-muted);
|
|
44
|
+
}
|
|
45
|
+
.xeno-callout[data-tone='danger'] .xeno-callout-icon {
|
|
46
|
+
color: var(--xeno-danger);
|
|
47
|
+
}
|
|
48
|
+
.xeno-callout-body {
|
|
49
|
+
min-width: 0;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* ── Entrance ─────────────────────────────────────────────────────────────────────────
|
|
53
|
+
* The rule leads and the text follows it in. Two tracks rather than one fade, because the rule IS the
|
|
54
|
+
* callout's form — a block that simply fades up could be any block, while a rule drawing down from the
|
|
55
|
+
* top is unmistakably this one. The rule takes longer than the text on purpose: it is still arriving
|
|
56
|
+
* as the words settle, so the two read as one gesture instead of two. */
|
|
57
|
+
.xeno-callout[data-enter] {
|
|
58
|
+
animation: xeno-callout-in var(--xeno-dur-entrance, 240ms) var(--xeno-ease) both;
|
|
59
|
+
}
|
|
60
|
+
.xeno-callout[data-enter]::before {
|
|
61
|
+
animation: xeno-callout-rule 320ms var(--xeno-ease-expo, cubic-bezier(0.16, 1, 0.3, 1)) both;
|
|
62
|
+
}
|
|
63
|
+
@keyframes xeno-callout-in {
|
|
64
|
+
from { opacity: 0; translate: 5px 0; }
|
|
65
|
+
to { opacity: 1; translate: 0 0; }
|
|
66
|
+
}
|
|
67
|
+
@keyframes xeno-callout-rule {
|
|
68
|
+
from { scale: 1 0; }
|
|
69
|
+
to { scale: 1 1; }
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
@media (prefers-reduced-motion: reduce) {
|
|
73
|
+
.xeno-callout[data-enter],
|
|
74
|
+
.xeno-callout[data-enter]::before {
|
|
75
|
+
animation: none;
|
|
76
|
+
}
|
|
77
|
+
}
|
package/src/content/caret.css
CHANGED
|
@@ -1,30 +1,30 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* <Caret> — a thin streaming caret. A hairline `--xeno-text` block, `radius-hair` corners, sized to the
|
|
3
|
-
* line via `1em`. It blinks only under `prefers-reduced-motion: no-preference`; otherwise it holds solid.
|
|
4
|
-
*/
|
|
5
|
-
.xeno-caret {
|
|
6
|
-
display: inline-block;
|
|
7
|
-
width: 2px;
|
|
8
|
-
height: 1em;
|
|
9
|
-
margin-left: 1px;
|
|
10
|
-
vertical-align: text-bottom;
|
|
11
|
-
background: var(--xeno-text);
|
|
12
|
-
border-radius: var(--xeno-radius-hair);
|
|
13
|
-
}
|
|
14
|
-
|
|
15
|
-
@media (prefers-reduced-motion: no-preference) {
|
|
16
|
-
.xeno-caret {
|
|
17
|
-
animation: xeno-caret-blink 1s steps(1, end) infinite;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
@keyframes xeno-caret-blink {
|
|
22
|
-
0%,
|
|
23
|
-
50% {
|
|
24
|
-
opacity: 1;
|
|
25
|
-
}
|
|
26
|
-
50.01%,
|
|
27
|
-
100% {
|
|
28
|
-
opacity: 0;
|
|
29
|
-
}
|
|
30
|
-
}
|
|
1
|
+
/*
|
|
2
|
+
* <Caret> — a thin streaming caret. A hairline `--xeno-text` block, `radius-hair` corners, sized to the
|
|
3
|
+
* line via `1em`. It blinks only under `prefers-reduced-motion: no-preference`; otherwise it holds solid.
|
|
4
|
+
*/
|
|
5
|
+
.xeno-caret {
|
|
6
|
+
display: inline-block;
|
|
7
|
+
width: 2px;
|
|
8
|
+
height: 1em;
|
|
9
|
+
margin-left: 1px;
|
|
10
|
+
vertical-align: text-bottom;
|
|
11
|
+
background: var(--xeno-text);
|
|
12
|
+
border-radius: var(--xeno-radius-hair);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
16
|
+
.xeno-caret {
|
|
17
|
+
animation: xeno-caret-blink 1s steps(1, end) infinite;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
@keyframes xeno-caret-blink {
|
|
22
|
+
0%,
|
|
23
|
+
50% {
|
|
24
|
+
opacity: 1;
|
|
25
|
+
}
|
|
26
|
+
50.01%,
|
|
27
|
+
100% {
|
|
28
|
+
opacity: 0;
|
|
29
|
+
}
|
|
30
|
+
}
|