@xenosystem/elements-react 0.0.4 → 0.0.6
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/overlays/modal.css
CHANGED
|
@@ -1,167 +1,167 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* Modal / Sheet — the locked floating-window overlay. CSS-first: the placement is driven by the
|
|
3
|
-
* `data-variant` attribute on the scrim and the card, everything else is tokens from `xeno-theme.css`.
|
|
4
|
-
* Depth is a hairline border + one soft (uncoloured) shadow; the scrim tints from `--xeno-canvas` so it
|
|
5
|
-
* stays monochrome in both themes. No literal colours, no coloured glow.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
/* ── Scrim / overlay ─────────────────────────────────────────────────────────────── */
|
|
9
|
-
.xeno-modal-overlay {
|
|
10
|
-
position: fixed;
|
|
11
|
-
inset: 0;
|
|
12
|
-
z-index: 1000;
|
|
13
|
-
display: flex;
|
|
14
|
-
align-items: center;
|
|
15
|
-
justify-content: center;
|
|
16
|
-
padding: 24px;
|
|
17
|
-
background: color-mix(in srgb, var(--xeno-canvas) 72%, transparent);
|
|
18
|
-
-webkit-backdrop-filter: blur(4px);
|
|
19
|
-
backdrop-filter: blur(4px);
|
|
20
|
-
}
|
|
21
|
-
.xeno-modal-overlay[data-variant='sheet'] {
|
|
22
|
-
align-items: flex-end;
|
|
23
|
-
padding: 0;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
/* ── Card ────────────────────────────────────────────────────────────────────────── */
|
|
27
|
-
/*
|
|
28
|
-
* The card is a chrome stack, like a panel — §"Panel Structure"'s construction, floated. Every value
|
|
29
|
-
* comes from `--xeno-chrome-*`, so the same DOM renders as a shell carrying three plates with 2px
|
|
30
|
-
* gaps (`separated`) or as one clipped card with hairline dividers and a soft shadow (`unified`).
|
|
31
|
-
*/
|
|
32
|
-
.xeno-modal {
|
|
33
|
-
display: flex;
|
|
34
|
-
flex-direction: column;
|
|
35
|
-
gap: var(--xeno-chrome-gap);
|
|
36
|
-
padding: var(--xeno-chrome-inset);
|
|
37
|
-
width: min(92vw, 480px);
|
|
38
|
-
max-height: min(85vh, 640px);
|
|
39
|
-
background: var(--xeno-chrome-shell);
|
|
40
|
-
border: 1px solid var(--xeno-chrome-border);
|
|
41
|
-
border-radius: var(--xeno-chrome-radius);
|
|
42
|
-
box-shadow: var(--xeno-chrome-shadow);
|
|
43
|
-
outline: none;
|
|
44
|
-
overflow: hidden;
|
|
45
|
-
}
|
|
46
|
-
.xeno-modal[data-variant='sheet'] {
|
|
47
|
-
width: 100%;
|
|
48
|
-
max-width: 640px;
|
|
49
|
-
max-height: 85vh;
|
|
50
|
-
border-bottom: none;
|
|
51
|
-
/* radius only on the top corners — it meets the bottom edge */
|
|
52
|
-
border-radius: var(--xeno-chrome-radius) var(--xeno-chrome-radius) 0 0;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/* ── Header (title + close) ──────────────────────────────────────────────────────── */
|
|
56
|
-
.xeno-modal-header {
|
|
57
|
-
flex: 0 0 auto;
|
|
58
|
-
display: flex;
|
|
59
|
-
align-items: center;
|
|
60
|
-
gap: 8px;
|
|
61
|
-
padding: var(--xeno-chrome-dialog-header-pad);
|
|
62
|
-
background: var(--xeno-chrome-plate);
|
|
63
|
-
-webkit-backdrop-filter: var(--xeno-chrome-plate-filter);
|
|
64
|
-
backdrop-filter: var(--xeno-chrome-plate-filter);
|
|
65
|
-
border-bottom: var(--xeno-chrome-divider);
|
|
66
|
-
}
|
|
67
|
-
.xeno-modal-title {
|
|
68
|
-
min-width: 0;
|
|
69
|
-
margin: 0;
|
|
70
|
-
font-size: var(--xeno-chrome-dialog-title-size);
|
|
71
|
-
font-weight: var(--xeno-chrome-dialog-title-weight);
|
|
72
|
-
letter-spacing: 0.03em;
|
|
73
|
-
line-height: 1.3;
|
|
74
|
-
color: var(--xeno-text);
|
|
75
|
-
overflow: hidden;
|
|
76
|
-
text-overflow: ellipsis;
|
|
77
|
-
white-space: nowrap;
|
|
78
|
-
}
|
|
79
|
-
/* Pushes the close button to the trailing edge, with or without a title. */
|
|
80
|
-
.xeno-modal-close {
|
|
81
|
-
flex: 0 0 auto;
|
|
82
|
-
margin-inline-start: auto;
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
/* ── Body (the one scroll region) ────────────────────────────────────────────────── */
|
|
86
|
-
.xeno-modal-body {
|
|
87
|
-
flex: 1 1 auto;
|
|
88
|
-
min-height: 0;
|
|
89
|
-
overflow-y: auto;
|
|
90
|
-
padding: var(--xeno-chrome-dialog-body-pad);
|
|
91
|
-
background: var(--xeno-chrome-body);
|
|
92
|
-
color: var(--xeno-text);
|
|
93
|
-
font-size: var(--xeno-chrome-dialog-body-size);
|
|
94
|
-
line-height: 1.55;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/* ── Footer (right-aligned actions) ──────────────────────────────────────────────── */
|
|
98
|
-
.xeno-modal-footer {
|
|
99
|
-
flex: 0 0 auto;
|
|
100
|
-
display: flex;
|
|
101
|
-
align-items: center;
|
|
102
|
-
justify-content: flex-end;
|
|
103
|
-
gap: var(--xeno-chrome-dialog-footer-gap);
|
|
104
|
-
padding: var(--xeno-chrome-dialog-footer-pad);
|
|
105
|
-
background: var(--xeno-chrome-plate);
|
|
106
|
-
border-top: var(--xeno-chrome-divider);
|
|
107
|
-
}
|
|
108
|
-
|
|
109
|
-
/* ── Motion (transform/opacity only; opt-in) ─────────────────────────────────────── */
|
|
110
|
-
@media (prefers-reduced-motion: no-preference) {
|
|
111
|
-
.xeno-modal-overlay {
|
|
112
|
-
animation: xeno-modal-scrim-in var(--xeno-dur) var(--xeno-ease);
|
|
113
|
-
}
|
|
114
|
-
.xeno-modal {
|
|
115
|
-
animation: xeno-modal-pop-in calc(var(--xeno-dur) * 1.4) var(--xeno-ease);
|
|
116
|
-
}
|
|
117
|
-
.xeno-modal[data-variant='sheet'] {
|
|
118
|
-
animation: xeno-modal-sheet-in calc(var(--xeno-dur) * 1.7) var(--xeno-ease);
|
|
119
|
-
}
|
|
120
|
-
}
|
|
121
|
-
|
|
122
|
-
@keyframes xeno-modal-scrim-in {
|
|
123
|
-
from {
|
|
124
|
-
opacity: 0;
|
|
125
|
-
}
|
|
126
|
-
to {
|
|
127
|
-
opacity: 1;
|
|
128
|
-
}
|
|
129
|
-
}
|
|
130
|
-
@keyframes xeno-modal-pop-in {
|
|
131
|
-
from {
|
|
132
|
-
opacity: 0;
|
|
133
|
-
transform: translateY(8px) scale(0.985);
|
|
134
|
-
}
|
|
135
|
-
to {
|
|
136
|
-
opacity: 1;
|
|
137
|
-
transform: none;
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
@keyframes xeno-modal-sheet-in {
|
|
141
|
-
from {
|
|
142
|
-
transform: translateY(100%);
|
|
143
|
-
}
|
|
144
|
-
to {
|
|
145
|
-
transform: translateY(0);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
|
|
149
|
-
/*
|
|
150
|
-
* §4 "Radius Is Per-Corner, Not Per-Element": a corner is rounded only where the surface meets
|
|
151
|
-
* NOTHING. Each plate faces its neighbour across the 2px gap, so the facing corners are SQUARE — a
|
|
152
|
-
* uniform radius on every plate is the tell that this section was skipped, and it was.
|
|
153
|
-
*
|
|
154
|
-
* Declared on first/last child rather than per plate so a stack with no header, or no footer, still
|
|
155
|
-
* presents a rounded outer edge instead of a square one against the rounded shell.
|
|
156
|
-
*/
|
|
157
|
-
.xeno-modal > * {
|
|
158
|
-
border-radius: 0;
|
|
159
|
-
}
|
|
160
|
-
.xeno-modal > :first-child {
|
|
161
|
-
border-top-left-radius: var(--xeno-chrome-radius-plate);
|
|
162
|
-
border-top-right-radius: var(--xeno-chrome-radius-plate);
|
|
163
|
-
}
|
|
164
|
-
.xeno-modal > :last-child {
|
|
165
|
-
border-bottom-left-radius: var(--xeno-chrome-radius-plate);
|
|
166
|
-
border-bottom-right-radius: var(--xeno-chrome-radius-plate);
|
|
167
|
-
}
|
|
1
|
+
/*
|
|
2
|
+
* Modal / Sheet — the locked floating-window overlay. CSS-first: the placement is driven by the
|
|
3
|
+
* `data-variant` attribute on the scrim and the card, everything else is tokens from `xeno-theme.css`.
|
|
4
|
+
* Depth is a hairline border + one soft (uncoloured) shadow; the scrim tints from `--xeno-canvas` so it
|
|
5
|
+
* stays monochrome in both themes. No literal colours, no coloured glow.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
/* ── Scrim / overlay ─────────────────────────────────────────────────────────────── */
|
|
9
|
+
.xeno-modal-overlay {
|
|
10
|
+
position: fixed;
|
|
11
|
+
inset: 0;
|
|
12
|
+
z-index: 1000;
|
|
13
|
+
display: flex;
|
|
14
|
+
align-items: center;
|
|
15
|
+
justify-content: center;
|
|
16
|
+
padding: 24px;
|
|
17
|
+
background: color-mix(in srgb, var(--xeno-canvas) 72%, transparent);
|
|
18
|
+
-webkit-backdrop-filter: blur(4px);
|
|
19
|
+
backdrop-filter: blur(4px);
|
|
20
|
+
}
|
|
21
|
+
.xeno-modal-overlay[data-variant='sheet'] {
|
|
22
|
+
align-items: flex-end;
|
|
23
|
+
padding: 0;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/* ── Card ────────────────────────────────────────────────────────────────────────── */
|
|
27
|
+
/*
|
|
28
|
+
* The card is a chrome stack, like a panel — §"Panel Structure"'s construction, floated. Every value
|
|
29
|
+
* comes from `--xeno-chrome-*`, so the same DOM renders as a shell carrying three plates with 2px
|
|
30
|
+
* gaps (`separated`) or as one clipped card with hairline dividers and a soft shadow (`unified`).
|
|
31
|
+
*/
|
|
32
|
+
.xeno-modal {
|
|
33
|
+
display: flex;
|
|
34
|
+
flex-direction: column;
|
|
35
|
+
gap: var(--xeno-chrome-gap);
|
|
36
|
+
padding: var(--xeno-chrome-inset);
|
|
37
|
+
width: min(92vw, 480px);
|
|
38
|
+
max-height: min(85vh, 640px);
|
|
39
|
+
background: var(--xeno-chrome-shell);
|
|
40
|
+
border: 1px solid var(--xeno-chrome-border);
|
|
41
|
+
border-radius: var(--xeno-chrome-radius);
|
|
42
|
+
box-shadow: var(--xeno-chrome-shadow);
|
|
43
|
+
outline: none;
|
|
44
|
+
overflow: hidden;
|
|
45
|
+
}
|
|
46
|
+
.xeno-modal[data-variant='sheet'] {
|
|
47
|
+
width: 100%;
|
|
48
|
+
max-width: 640px;
|
|
49
|
+
max-height: 85vh;
|
|
50
|
+
border-bottom: none;
|
|
51
|
+
/* radius only on the top corners — it meets the bottom edge */
|
|
52
|
+
border-radius: var(--xeno-chrome-radius) var(--xeno-chrome-radius) 0 0;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/* ── Header (title + close) ──────────────────────────────────────────────────────── */
|
|
56
|
+
.xeno-modal-header {
|
|
57
|
+
flex: 0 0 auto;
|
|
58
|
+
display: flex;
|
|
59
|
+
align-items: center;
|
|
60
|
+
gap: 8px;
|
|
61
|
+
padding: var(--xeno-chrome-dialog-header-pad);
|
|
62
|
+
background: var(--xeno-chrome-plate);
|
|
63
|
+
-webkit-backdrop-filter: var(--xeno-chrome-plate-filter);
|
|
64
|
+
backdrop-filter: var(--xeno-chrome-plate-filter);
|
|
65
|
+
border-bottom: var(--xeno-chrome-divider);
|
|
66
|
+
}
|
|
67
|
+
.xeno-modal-title {
|
|
68
|
+
min-width: 0;
|
|
69
|
+
margin: 0;
|
|
70
|
+
font-size: var(--xeno-chrome-dialog-title-size);
|
|
71
|
+
font-weight: var(--xeno-chrome-dialog-title-weight);
|
|
72
|
+
letter-spacing: 0.03em;
|
|
73
|
+
line-height: 1.3;
|
|
74
|
+
color: var(--xeno-text);
|
|
75
|
+
overflow: hidden;
|
|
76
|
+
text-overflow: ellipsis;
|
|
77
|
+
white-space: nowrap;
|
|
78
|
+
}
|
|
79
|
+
/* Pushes the close button to the trailing edge, with or without a title. */
|
|
80
|
+
.xeno-modal-close {
|
|
81
|
+
flex: 0 0 auto;
|
|
82
|
+
margin-inline-start: auto;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/* ── Body (the one scroll region) ────────────────────────────────────────────────── */
|
|
86
|
+
.xeno-modal-body {
|
|
87
|
+
flex: 1 1 auto;
|
|
88
|
+
min-height: 0;
|
|
89
|
+
overflow-y: auto;
|
|
90
|
+
padding: var(--xeno-chrome-dialog-body-pad);
|
|
91
|
+
background: var(--xeno-chrome-body);
|
|
92
|
+
color: var(--xeno-text);
|
|
93
|
+
font-size: var(--xeno-chrome-dialog-body-size);
|
|
94
|
+
line-height: 1.55;
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
/* ── Footer (right-aligned actions) ──────────────────────────────────────────────── */
|
|
98
|
+
.xeno-modal-footer {
|
|
99
|
+
flex: 0 0 auto;
|
|
100
|
+
display: flex;
|
|
101
|
+
align-items: center;
|
|
102
|
+
justify-content: flex-end;
|
|
103
|
+
gap: var(--xeno-chrome-dialog-footer-gap);
|
|
104
|
+
padding: var(--xeno-chrome-dialog-footer-pad);
|
|
105
|
+
background: var(--xeno-chrome-plate);
|
|
106
|
+
border-top: var(--xeno-chrome-divider);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/* ── Motion (transform/opacity only; opt-in) ─────────────────────────────────────── */
|
|
110
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
111
|
+
.xeno-modal-overlay {
|
|
112
|
+
animation: xeno-modal-scrim-in var(--xeno-dur) var(--xeno-ease);
|
|
113
|
+
}
|
|
114
|
+
.xeno-modal {
|
|
115
|
+
animation: xeno-modal-pop-in calc(var(--xeno-dur) * 1.4) var(--xeno-ease);
|
|
116
|
+
}
|
|
117
|
+
.xeno-modal[data-variant='sheet'] {
|
|
118
|
+
animation: xeno-modal-sheet-in calc(var(--xeno-dur) * 1.7) var(--xeno-ease);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
@keyframes xeno-modal-scrim-in {
|
|
123
|
+
from {
|
|
124
|
+
opacity: 0;
|
|
125
|
+
}
|
|
126
|
+
to {
|
|
127
|
+
opacity: 1;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
@keyframes xeno-modal-pop-in {
|
|
131
|
+
from {
|
|
132
|
+
opacity: 0;
|
|
133
|
+
transform: translateY(8px) scale(0.985);
|
|
134
|
+
}
|
|
135
|
+
to {
|
|
136
|
+
opacity: 1;
|
|
137
|
+
transform: none;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
@keyframes xeno-modal-sheet-in {
|
|
141
|
+
from {
|
|
142
|
+
transform: translateY(100%);
|
|
143
|
+
}
|
|
144
|
+
to {
|
|
145
|
+
transform: translateY(0);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/*
|
|
150
|
+
* §4 "Radius Is Per-Corner, Not Per-Element": a corner is rounded only where the surface meets
|
|
151
|
+
* NOTHING. Each plate faces its neighbour across the 2px gap, so the facing corners are SQUARE — a
|
|
152
|
+
* uniform radius on every plate is the tell that this section was skipped, and it was.
|
|
153
|
+
*
|
|
154
|
+
* Declared on first/last child rather than per plate so a stack with no header, or no footer, still
|
|
155
|
+
* presents a rounded outer edge instead of a square one against the rounded shell.
|
|
156
|
+
*/
|
|
157
|
+
.xeno-modal > * {
|
|
158
|
+
border-radius: 0;
|
|
159
|
+
}
|
|
160
|
+
.xeno-modal > :first-child {
|
|
161
|
+
border-top-left-radius: var(--xeno-chrome-radius-plate);
|
|
162
|
+
border-top-right-radius: var(--xeno-chrome-radius-plate);
|
|
163
|
+
}
|
|
164
|
+
.xeno-modal > :last-child {
|
|
165
|
+
border-bottom-left-radius: var(--xeno-chrome-radius-plate);
|
|
166
|
+
border-bottom-right-radius: var(--xeno-chrome-radius-plate);
|
|
167
|
+
}
|
|
@@ -1,81 +1,81 @@
|
|
|
1
|
-
/*
|
|
2
|
-
* PickerField — a form field that reveals a panel with the chat's "Scheduled" open/close animation:
|
|
3
|
-
* the panel slides DOWN from behind the field (clipped by the popover's overflow) while its content
|
|
4
|
-
* fades up a beat later, so nothing pops. Reverses on close. Monochrome, tokens only, motion is
|
|
5
|
-
* transform/opacity behind the reduce guard.
|
|
6
|
-
*/
|
|
7
|
-
|
|
8
|
-
.xeno-field {
|
|
9
|
-
position: relative;
|
|
10
|
-
display: inline-block;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
/* ── Trigger (the field itself) ──────────────────────────────────────────────────── */
|
|
14
|
-
.xeno-field-trigger {
|
|
15
|
-
display: inline-flex;
|
|
16
|
-
align-items: center;
|
|
17
|
-
gap: 8px;
|
|
18
|
-
min-width: 156px;
|
|
19
|
-
height: 34px;
|
|
20
|
-
padding: 0 10px;
|
|
21
|
-
font-family: inherit;
|
|
22
|
-
font-size: 13px;
|
|
23
|
-
color: var(--xeno-text);
|
|
24
|
-
background: var(--xeno-canvas);
|
|
25
|
-
border: 1px solid var(--xeno-border);
|
|
26
|
-
border-radius: var(--xeno-radius-md);
|
|
27
|
-
cursor: pointer;
|
|
28
|
-
transition:
|
|
29
|
-
border-color var(--xeno-dur) ease,
|
|
30
|
-
background var(--xeno-dur) ease;
|
|
31
|
-
}
|
|
32
|
-
.xeno-field-trigger:hover {
|
|
33
|
-
border-color: var(--xeno-muted);
|
|
34
|
-
}
|
|
35
|
-
.xeno-field-trigger[data-open='true'] {
|
|
36
|
-
border-color: var(--xeno-muted);
|
|
37
|
-
background: var(--xeno-hover);
|
|
38
|
-
}
|
|
39
|
-
.xeno-field-trigger:focus-visible {
|
|
40
|
-
outline: none;
|
|
41
|
-
box-shadow:
|
|
42
|
-
0 0 0 2px var(--xeno-canvas),
|
|
43
|
-
0 0 0 4px var(--xeno-border);
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
.xeno-field-icon {
|
|
47
|
-
display: inline-flex;
|
|
48
|
-
color: var(--xeno-muted);
|
|
49
|
-
}
|
|
50
|
-
.xeno-field-label {
|
|
51
|
-
color: var(--xeno-muted);
|
|
52
|
-
font-size: 12px;
|
|
53
|
-
}
|
|
54
|
-
.xeno-field-value {
|
|
55
|
-
flex: 1 1 auto;
|
|
56
|
-
min-width: 0;
|
|
57
|
-
text-align: left;
|
|
58
|
-
white-space: nowrap;
|
|
59
|
-
overflow: hidden;
|
|
60
|
-
text-overflow: ellipsis;
|
|
61
|
-
font-variant-numeric: tabular-nums;
|
|
62
|
-
}
|
|
63
|
-
.xeno-field-value[data-placeholder='true'] {
|
|
64
|
-
color: var(--xeno-muted);
|
|
65
|
-
}
|
|
66
|
-
.xeno-field-chevron {
|
|
67
|
-
display: inline-flex;
|
|
68
|
-
color: var(--xeno-muted);
|
|
69
|
-
transform: rotate(90deg); /* chevron-right → points down when closed */
|
|
70
|
-
transition: transform var(--xeno-dur) ease;
|
|
71
|
-
}
|
|
72
|
-
.xeno-field-trigger[data-open='true'] .xeno-field-chevron {
|
|
73
|
-
transform: rotate(-90deg); /* points up when open */
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
/* The reveal itself (the unfolding panel) lives in reveal.css — PickerField composes <Reveal>. */
|
|
77
|
-
@media (prefers-reduced-motion: reduce) {
|
|
78
|
-
.xeno-field-chevron {
|
|
79
|
-
transition: none;
|
|
80
|
-
}
|
|
81
|
-
}
|
|
1
|
+
/*
|
|
2
|
+
* PickerField — a form field that reveals a panel with the chat's "Scheduled" open/close animation:
|
|
3
|
+
* the panel slides DOWN from behind the field (clipped by the popover's overflow) while its content
|
|
4
|
+
* fades up a beat later, so nothing pops. Reverses on close. Monochrome, tokens only, motion is
|
|
5
|
+
* transform/opacity behind the reduce guard.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
.xeno-field {
|
|
9
|
+
position: relative;
|
|
10
|
+
display: inline-block;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
/* ── Trigger (the field itself) ──────────────────────────────────────────────────── */
|
|
14
|
+
.xeno-field-trigger {
|
|
15
|
+
display: inline-flex;
|
|
16
|
+
align-items: center;
|
|
17
|
+
gap: 8px;
|
|
18
|
+
min-width: 156px;
|
|
19
|
+
height: 34px;
|
|
20
|
+
padding: 0 10px;
|
|
21
|
+
font-family: inherit;
|
|
22
|
+
font-size: 13px;
|
|
23
|
+
color: var(--xeno-text);
|
|
24
|
+
background: var(--xeno-canvas);
|
|
25
|
+
border: 1px solid var(--xeno-border);
|
|
26
|
+
border-radius: var(--xeno-radius-md);
|
|
27
|
+
cursor: pointer;
|
|
28
|
+
transition:
|
|
29
|
+
border-color var(--xeno-dur) ease,
|
|
30
|
+
background var(--xeno-dur) ease;
|
|
31
|
+
}
|
|
32
|
+
.xeno-field-trigger:hover {
|
|
33
|
+
border-color: var(--xeno-muted);
|
|
34
|
+
}
|
|
35
|
+
.xeno-field-trigger[data-open='true'] {
|
|
36
|
+
border-color: var(--xeno-muted);
|
|
37
|
+
background: var(--xeno-hover);
|
|
38
|
+
}
|
|
39
|
+
.xeno-field-trigger:focus-visible {
|
|
40
|
+
outline: none;
|
|
41
|
+
box-shadow:
|
|
42
|
+
0 0 0 2px var(--xeno-canvas),
|
|
43
|
+
0 0 0 4px var(--xeno-border);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
.xeno-field-icon {
|
|
47
|
+
display: inline-flex;
|
|
48
|
+
color: var(--xeno-muted);
|
|
49
|
+
}
|
|
50
|
+
.xeno-field-label {
|
|
51
|
+
color: var(--xeno-muted);
|
|
52
|
+
font-size: 12px;
|
|
53
|
+
}
|
|
54
|
+
.xeno-field-value {
|
|
55
|
+
flex: 1 1 auto;
|
|
56
|
+
min-width: 0;
|
|
57
|
+
text-align: left;
|
|
58
|
+
white-space: nowrap;
|
|
59
|
+
overflow: hidden;
|
|
60
|
+
text-overflow: ellipsis;
|
|
61
|
+
font-variant-numeric: tabular-nums;
|
|
62
|
+
}
|
|
63
|
+
.xeno-field-value[data-placeholder='true'] {
|
|
64
|
+
color: var(--xeno-muted);
|
|
65
|
+
}
|
|
66
|
+
.xeno-field-chevron {
|
|
67
|
+
display: inline-flex;
|
|
68
|
+
color: var(--xeno-muted);
|
|
69
|
+
transform: rotate(90deg); /* chevron-right → points down when closed */
|
|
70
|
+
transition: transform var(--xeno-dur) ease;
|
|
71
|
+
}
|
|
72
|
+
.xeno-field-trigger[data-open='true'] .xeno-field-chevron {
|
|
73
|
+
transform: rotate(-90deg); /* points up when open */
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/* The reveal itself (the unfolding panel) lives in reveal.css — PickerField composes <Reveal>. */
|
|
77
|
+
@media (prefers-reduced-motion: reduce) {
|
|
78
|
+
.xeno-field-chevron {
|
|
79
|
+
transition: none;
|
|
80
|
+
}
|
|
81
|
+
}
|