anentrypoint-design 0.0.322 → 0.0.324
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/README.md +22 -2
- package/app-shell.css +24 -4782
- package/colors_and_type.css +43 -0
- package/dist/247420.css +74 -3
- package/dist/247420.js +16 -16
- package/package.json +14 -8
- package/src/bootstrap.js +10 -1
- package/src/components/chat-message-parts.js +355 -0
- package/src/components/chat.js +23 -320
- package/src/components/data-density.js +15 -10
- package/src/components/files-modals.js +14 -2
- package/src/components/files.js +5 -1
- package/src/components/freddie/helpers.js +46 -8
- package/src/css/app-shell/base.css +157 -0
- package/src/css/app-shell/catalog-theme.css +144 -0
- package/src/css/app-shell/chat-basic.css +12 -0
- package/src/css/app-shell/chat-polish.css +459 -0
- package/src/css/app-shell/data-density.css +150 -0
- package/src/css/app-shell/files.css +709 -0
- package/src/css/app-shell/hero-content.css +407 -0
- package/src/css/app-shell/kits-appended.css +361 -0
- package/src/css/app-shell/loading-alerts.css +120 -0
- package/src/css/app-shell/panel-row.css +177 -0
- package/src/css/app-shell/primitives.css +197 -0
- package/src/css/app-shell/responsive.css +266 -0
- package/src/css/app-shell/responsive2-workspace.css +465 -0
- package/src/css/app-shell/row-print.css +75 -0
- package/src/css/app-shell/sidebar-misc.css +79 -0
- package/src/css/app-shell/states-interactions.css +696 -0
- package/src/css/app-shell/topbar.css +319 -0
- package/src/deck-stage.js +6 -4
- package/src/highlight.js +20 -4
- package/src/index.js +15 -5
- package/src/kits/os/freddie/pages-chat.js +1 -1
- package/src/kits/os/freddie/pages-core.js +1 -1
- package/src/kits/os/freddie/pages-os.js +1 -1
- package/src/kits/os/freddie/pages-tools.js +1 -1
- package/src/kits/os/wm.js +38 -0
- package/src/kits/slides/deck-stage-overlay.js +68 -0
- package/src/kits/slides/deck-stage-state.js +81 -0
- package/src/kits/slides/deck-stage-style.js +117 -0
- package/src/kits/slides/deck-stage.js +167 -0
- package/src/kits/slides/index.js +5 -0
- package/src/markdown.js +89 -11
- package/src/kits/os/freddie/helpers.js +0 -33
|
@@ -0,0 +1,407 @@
|
|
|
1
|
+
/* ============================================================
|
|
2
|
+
Hero
|
|
3
|
+
============================================================ */
|
|
4
|
+
/* Signature hero — asymmetric editorial header. Title spans wide; the body +
|
|
5
|
+
actions sit offset in a narrower right column on desktop, stacked on mobile.
|
|
6
|
+
No centered stack. */
|
|
7
|
+
.ds-hero {
|
|
8
|
+
padding: var(--space-9) 0 var(--space-8);
|
|
9
|
+
display: grid; gap: var(--space-5) var(--space-5);
|
|
10
|
+
grid-template-columns: minmax(0, 1.6fr) minmax(0, 1fr);
|
|
11
|
+
grid-template-areas: 'title title' 'body aside';
|
|
12
|
+
align-items: start;
|
|
13
|
+
max-width: var(--measure-wide);
|
|
14
|
+
position: relative; isolation: isolate;
|
|
15
|
+
}
|
|
16
|
+
.ds-hero-head { grid-area: title; display: grid; gap: var(--space-3); }
|
|
17
|
+
.ds-hero-body { grid-area: body; }
|
|
18
|
+
/* The right column carries its own visual weight — a spined, halftone-
|
|
19
|
+
textured card holding the badge/stat cluster and the CTAs — so the
|
|
20
|
+
asymmetric grid reads as a deliberate composition, not leftover space
|
|
21
|
+
beside the narrow body copy. Stretches to the body column's height. */
|
|
22
|
+
.ds-hero-aside {
|
|
23
|
+
grid-area: aside; position: relative; isolation: isolate;
|
|
24
|
+
align-self: stretch; display: flex; flex-direction: column;
|
|
25
|
+
justify-content: space-between; gap: var(--space-5);
|
|
26
|
+
background: var(--bg-2);
|
|
27
|
+
border-radius: 0 var(--r-2) var(--r-2) 0;
|
|
28
|
+
padding: var(--space-5) var(--space-5) var(--space-5) calc(var(--space-4) + var(--bw-chunk));
|
|
29
|
+
}
|
|
30
|
+
.ds-hero-aside::before {
|
|
31
|
+
content: ''; position: absolute; left: 0; top: 0; bottom: 0;
|
|
32
|
+
width: var(--bw-chunk); background: var(--accent);
|
|
33
|
+
border-radius: var(--bw-chunk) 0 0 var(--bw-chunk);
|
|
34
|
+
}
|
|
35
|
+
.ds-hero-stats { display: flex; flex-direction: column; gap: var(--space-2); }
|
|
36
|
+
.ds-hero-stat {
|
|
37
|
+
font-family: var(--ff-mono); font-size: var(--fs-sm);
|
|
38
|
+
color: var(--fg-2); letter-spacing: var(--tr-tight);
|
|
39
|
+
padding-bottom: var(--space-2); border-bottom: var(--bw-hair) solid var(--bg-3);
|
|
40
|
+
}
|
|
41
|
+
.ds-hero-stat:last-child { border-bottom: 0; padding-bottom: 0; }
|
|
42
|
+
.ds-hero-title {
|
|
43
|
+
font-family: var(--ff-display); font-weight: 700;
|
|
44
|
+
font-size: clamp(40px, 9cqi, 116px);
|
|
45
|
+
line-height: 0.96; letter-spacing: var(--tr-tighter);
|
|
46
|
+
margin: 0; max-width: 16ch; text-wrap: balance;
|
|
47
|
+
}
|
|
48
|
+
.ds-hero-body {
|
|
49
|
+
font-family: var(--ff-body); font-size: var(--fs-xl);
|
|
50
|
+
line-height: 1.45; margin: 0; max-width: 46ch;
|
|
51
|
+
color: var(--fg-2);
|
|
52
|
+
}
|
|
53
|
+
/* The lead phrase in the title — printed in the electric lead, not glowing. */
|
|
54
|
+
.ds-hero-accent { color: var(--accent-ink); font-weight: 700; }
|
|
55
|
+
.ds-hero-actions {
|
|
56
|
+
display: flex; gap: var(--space-2, 10px); flex-wrap: wrap;
|
|
57
|
+
align-self: start; margin-top: var(--space-hair, 4px);
|
|
58
|
+
}
|
|
59
|
+
/* Container-queried (the whole shell is; a 500px pane on a wide viewport
|
|
60
|
+
would keep the two-column grid under a width @media). Left-aligned stack —
|
|
61
|
+
no centering — preserving the asymmetric intent. */
|
|
62
|
+
@container (max-width: 900px) {
|
|
63
|
+
.ds-hero {
|
|
64
|
+
grid-template-columns: minmax(0, 1fr);
|
|
65
|
+
grid-template-areas: 'title' 'body' 'aside';
|
|
66
|
+
align-items: start;
|
|
67
|
+
padding: var(--space-7) 0 var(--space-6);
|
|
68
|
+
}
|
|
69
|
+
.ds-hero-aside {
|
|
70
|
+
border-radius: var(--r-2); flex-direction: row; flex-wrap: wrap;
|
|
71
|
+
justify-content: flex-start; align-items: center;
|
|
72
|
+
}
|
|
73
|
+
.ds-hero-stats { flex-direction: row; flex-wrap: wrap; }
|
|
74
|
+
.ds-hero-stat { border-bottom: 0; padding-bottom: 0; }
|
|
75
|
+
}
|
|
76
|
+
.ds-chat-title { margin: 0; font-size: inherit; }
|
|
77
|
+
|
|
78
|
+
/* ============================================================
|
|
79
|
+
Section grouping
|
|
80
|
+
============================================================ */
|
|
81
|
+
.ds-section { margin: var(--space-8) 0; }
|
|
82
|
+
/* Compact section (e.g. a PageHeader used as a page's first element): no large
|
|
83
|
+
leading margin, modest trailing margin — top-aligns without consumer overrides. */
|
|
84
|
+
.ds-section-compact { margin-top: 0; margin-bottom: var(--space-4); }
|
|
85
|
+
.ds-section > h3 {
|
|
86
|
+
font-family: var(--ff-body); font-weight: 600; font-size: var(--fs-h3);
|
|
87
|
+
margin: 0 0 var(--space-5);
|
|
88
|
+
letter-spacing: -0.01em;
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
@media (max-width: 900px) {
|
|
92
|
+
.ds-section { margin: var(--space-4) 0; }
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/* ============================================================
|
|
96
|
+
Print texture — the signature surface treatment. Opt-in overlay that
|
|
97
|
+
reads as risograph/newsprint grain, layered above the surface fill but
|
|
98
|
+
below content. Faint by default so type stays crisp; reduced-data and
|
|
99
|
+
reduced-motion are unaffected (texture is static).
|
|
100
|
+
============================================================ */
|
|
101
|
+
.ds-grain { position: relative; isolation: isolate; }
|
|
102
|
+
.ds-grain::after {
|
|
103
|
+
content: ''; position: absolute; inset: 0; z-index: -1;
|
|
104
|
+
pointer-events: none;
|
|
105
|
+
background-image: var(--grain);
|
|
106
|
+
background-size: 160px 160px;
|
|
107
|
+
opacity: var(--grain-opacity);
|
|
108
|
+
mix-blend-mode: var(--grain-blend);
|
|
109
|
+
}
|
|
110
|
+
/* ============================================================
|
|
111
|
+
Marquee / ticker — brand kinetic device ("always open 24/7"). The track
|
|
112
|
+
holds two identical runs so the loop is seamless; reduced-motion freezes it
|
|
113
|
+
to a single static run. Editorial, not a decorative flourish.
|
|
114
|
+
============================================================ */
|
|
115
|
+
.ds-marquee {
|
|
116
|
+
overflow: hidden; width: 100%;
|
|
117
|
+
border-block: var(--bw-rule) solid var(--fg);
|
|
118
|
+
padding: var(--space-2) 0;
|
|
119
|
+
font-family: var(--ff-display); font-weight: 600;
|
|
120
|
+
text-transform: uppercase; letter-spacing: var(--tr-caps);
|
|
121
|
+
}
|
|
122
|
+
.ds-marquee-track {
|
|
123
|
+
display: inline-flex; gap: var(--space-5);
|
|
124
|
+
white-space: nowrap; will-change: transform;
|
|
125
|
+
animation: ds-marquee-run 28s linear infinite;
|
|
126
|
+
}
|
|
127
|
+
.ds-marquee-item { display: inline-flex; align-items: center; gap: var(--space-5); }
|
|
128
|
+
.ds-marquee-sep { color: var(--accent-ink); }
|
|
129
|
+
.ds-marquee:hover .ds-marquee-track,
|
|
130
|
+
.ds-marquee:focus-within .ds-marquee-track,
|
|
131
|
+
.ds-marquee:active .ds-marquee-track { animation-play-state: paused; }
|
|
132
|
+
@keyframes ds-marquee-run {
|
|
133
|
+
from { transform: translateX(0); }
|
|
134
|
+
to { transform: translateX(-50%); }
|
|
135
|
+
}
|
|
136
|
+
/* Touch has no hover-pause; slow the ticker so it burns less attention. */
|
|
137
|
+
@media (hover: none), (pointer: coarse) {
|
|
138
|
+
.ds-marquee-track { animation-duration: 40s; }
|
|
139
|
+
}
|
|
140
|
+
@media (prefers-reduced-motion: reduce) {
|
|
141
|
+
/* Static: wrap to a readable strip instead of a frozen half-offscreen run. */
|
|
142
|
+
.ds-marquee-track { animation: none; flex-wrap: wrap; white-space: normal; }
|
|
143
|
+
.ds-marquee-run-b { display: none; }
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/* ============================================================
|
|
147
|
+
Install — single CLI command card
|
|
148
|
+
============================================================ */
|
|
149
|
+
.cli {
|
|
150
|
+
display: flex; align-items: center; gap: 14px;
|
|
151
|
+
overflow-x: auto;
|
|
152
|
+
padding: 20px 24px;
|
|
153
|
+
background: var(--ink); color: var(--paper);
|
|
154
|
+
border-radius: var(--r-3);
|
|
155
|
+
font-family: var(--ff-mono); font-size: var(--fs-lg);
|
|
156
|
+
}
|
|
157
|
+
.cli .prompt { color: var(--green-2); }
|
|
158
|
+
.cli .cmd { flex: 1; min-width: 0; overflow-x: auto; white-space: nowrap; color: var(--paper); }
|
|
159
|
+
.cli .copy {
|
|
160
|
+
padding: 8px 16px; background: transparent; color: var(--paper);
|
|
161
|
+
font-size: var(--fs-tiny); text-transform: uppercase; letter-spacing: var(--tr-caps);
|
|
162
|
+
cursor: pointer; box-shadow: inset 0 0 0 1px var(--rule-strong);
|
|
163
|
+
border-radius: var(--r-pill);
|
|
164
|
+
}
|
|
165
|
+
.cli .copy:hover { background: var(--fg-3); }
|
|
166
|
+
|
|
167
|
+
/* Multi-line CLI block: when .cli holds .ds-cli-row / .ds-cli-comment children
|
|
168
|
+
(quickstart scripts, multi-command snippets — see CliBlock in
|
|
169
|
+
src/components/content.js) it stacks as a column instead of the
|
|
170
|
+
single-line install row. */
|
|
171
|
+
.cli:has(.ds-cli-row),
|
|
172
|
+
.cli:has(.ds-cli-comment) {
|
|
173
|
+
flex-direction: column; align-items: stretch; gap: 0;
|
|
174
|
+
font-size: var(--fs-sm); line-height: 1.6;
|
|
175
|
+
}
|
|
176
|
+
.ds-cli-row {
|
|
177
|
+
display: flex; gap: 10px;
|
|
178
|
+
font-family: var(--ff-mono); font-size: 13px; line-height: 1.6;
|
|
179
|
+
padding: 3px 0;
|
|
180
|
+
}
|
|
181
|
+
.ds-cli-row .prompt { color: var(--green-2); flex: 0 0 auto; user-select: none; }
|
|
182
|
+
.ds-cli-row .cmd { flex: 1 1 auto; white-space: pre-wrap; word-break: break-word; color: var(--paper); }
|
|
183
|
+
.ds-cli-comment {
|
|
184
|
+
color: var(--fg-3);
|
|
185
|
+
font-family: var(--ff-mono); font-size: var(--fs-tiny); line-height: 1.6;
|
|
186
|
+
padding: 3px 0; white-space: pre-wrap; word-break: break-word;
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
/* ============================================================
|
|
190
|
+
Receipt — key/value table
|
|
191
|
+
============================================================ */
|
|
192
|
+
table.kv { width: 100%; border-collapse: collapse; }
|
|
193
|
+
table.kv td {
|
|
194
|
+
padding: 8px 0;
|
|
195
|
+
font-family: var(--ff-body); font-size: var(--fs-sm);
|
|
196
|
+
}
|
|
197
|
+
table.kv tr + tr td { border-top: 1px solid var(--rule); }
|
|
198
|
+
table.kv td:first-child {
|
|
199
|
+
color: var(--fg-3);
|
|
200
|
+
font-size: var(--fs-xs);
|
|
201
|
+
text-transform: uppercase; letter-spacing: var(--tr-caps);
|
|
202
|
+
width: 14ch;
|
|
203
|
+
}
|
|
204
|
+
table.kv td:last-child {
|
|
205
|
+
font-weight: 600;
|
|
206
|
+
overflow-wrap: anywhere; min-width: 0;
|
|
207
|
+
}
|
|
208
|
+
/* Tiny screens: stack the key over the value instead of squeezing a 14ch
|
|
209
|
+
label column beside long unbroken values (URLs, hashes). */
|
|
210
|
+
@media (max-width: 400px) {
|
|
211
|
+
table.kv td { display: block; width: auto; padding: 4px 0; }
|
|
212
|
+
table.kv td:first-child { padding-top: 8px; }
|
|
213
|
+
table.kv tr + tr td { border-top: 0; }
|
|
214
|
+
table.kv tr + tr td:first-child { border-top: 1px solid var(--rule); }
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
/* ============================================================
|
|
218
|
+
Generic table
|
|
219
|
+
============================================================ */
|
|
220
|
+
table {
|
|
221
|
+
width: 100%; border-collapse: collapse;
|
|
222
|
+
font-family: var(--ff-body); font-size: var(--fs-sm);
|
|
223
|
+
/* A data grid, not a card: a tight --r-0 corner (was --r-3/22px, which read
|
|
224
|
+
as a rounded card). Cells drop to 8px 12px for a dense, scannable row
|
|
225
|
+
(was 12/14 x 16 => ~43px rows). Density scales the vertical padding. */
|
|
226
|
+
border-radius: var(--r-0); overflow: hidden;
|
|
227
|
+
}
|
|
228
|
+
table th {
|
|
229
|
+
text-align: left;
|
|
230
|
+
padding: calc(var(--space-2) * var(--density)) var(--space-2-75);
|
|
231
|
+
font-size: var(--fs-tiny); font-weight: 600;
|
|
232
|
+
color: var(--fg-3); text-transform: uppercase; letter-spacing: var(--tr-caps);
|
|
233
|
+
background: var(--bg-2);
|
|
234
|
+
}
|
|
235
|
+
table td { padding: calc(var(--space-2) * var(--density)) var(--space-2-75); border-top: 1px solid var(--rule); }
|
|
236
|
+
table tr.clickable { cursor: pointer; }
|
|
237
|
+
table tr.clickable:hover td { background: var(--bg-2); }
|
|
238
|
+
table tr.clickable:focus-visible {
|
|
239
|
+
outline: var(--focus-w) solid var(--focus-color);
|
|
240
|
+
outline-offset: -2px;
|
|
241
|
+
}
|
|
242
|
+
table tr.clickable:focus-visible td { background: var(--bg-2); }
|
|
243
|
+
|
|
244
|
+
/* Table() striped/compact opt-in density modifiers (webgeist g-table parity).
|
|
245
|
+
Scoped under .ds-table-wrap so they never leak onto an unrelated bare
|
|
246
|
+
<table> a consumer hand-rolls outside this component. */
|
|
247
|
+
.ds-table-wrap.is-striped table tr:nth-child(even) td { background: var(--bg-2); }
|
|
248
|
+
.ds-table-wrap.is-striped table tr.clickable:nth-child(even):hover td,
|
|
249
|
+
.ds-table-wrap.is-striped table tr.clickable:nth-child(even):focus-visible td { background: var(--bg-3, var(--bg-2)); }
|
|
250
|
+
.ds-table-wrap.is-compact table th { padding: var(--space-1-5, 5px) var(--space-2, 8px); }
|
|
251
|
+
.ds-table-wrap.is-compact table td { padding: var(--space-1-5, 5px) var(--space-2, 8px); }
|
|
252
|
+
|
|
253
|
+
/* ============================================================
|
|
254
|
+
Changelog
|
|
255
|
+
============================================================ */
|
|
256
|
+
.ds-changelog-row {
|
|
257
|
+
grid-template-columns: minmax(110px, 14ch) minmax(60px, 9ch) minmax(0, 1fr) !important;
|
|
258
|
+
}
|
|
259
|
+
.ds-changelog-ver {
|
|
260
|
+
font-family: var(--ff-body); font-weight: 600; font-size: var(--fs-sm);
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/* ============================================================
|
|
264
|
+
Works
|
|
265
|
+
============================================================ */
|
|
266
|
+
.work-detail {
|
|
267
|
+
padding: var(--space-4) var(--space-5) var(--space-5);
|
|
268
|
+
margin: 4px 0 var(--space-2);
|
|
269
|
+
background: var(--bg-2);
|
|
270
|
+
border-radius: var(--r-3);
|
|
271
|
+
display: flex; flex-direction: column; gap: var(--space-3);
|
|
272
|
+
}
|
|
273
|
+
.ds-work-body { margin: 0; max-width: 60ch; }
|
|
274
|
+
.ds-work-actions { display: flex; gap: 10px; flex-wrap: wrap; }
|
|
275
|
+
|
|
276
|
+
/* ============================================================
|
|
277
|
+
Manifesto / pull moment
|
|
278
|
+
============================================================ */
|
|
279
|
+
.ds-manifesto { max-width: 60ch; }
|
|
280
|
+
.ds-manifesto-para {
|
|
281
|
+
font-family: var(--ff-body); font-size: var(--fs-lg);
|
|
282
|
+
line-height: var(--lh-long); margin: 0 0 var(--space-3);
|
|
283
|
+
}
|
|
284
|
+
.ds-manifesto-para.dim { color: var(--fg-3); }
|
|
285
|
+
|
|
286
|
+
/* ============================================================
|
|
287
|
+
Currently shipping dots
|
|
288
|
+
============================================================ */
|
|
289
|
+
.ds-dot { display: inline-block; width: 8px; height: 8px; border-radius: 50%; background: currentColor; flex-shrink: 0; vertical-align: middle; }
|
|
290
|
+
.ds-dot-on { color: var(--green-2); }
|
|
291
|
+
.ds-dot-off { color: var(--fg-3); }
|
|
292
|
+
.ds-dot-live { color: var(--green-2); }
|
|
293
|
+
.ds-dot-idle { color: var(--fg-3); }
|
|
294
|
+
|
|
295
|
+
/* ============================================================
|
|
296
|
+
KPI
|
|
297
|
+
============================================================ */
|
|
298
|
+
.kpi {
|
|
299
|
+
display: grid; grid-template-columns: repeat(auto-fit, minmax(160px, 1fr));
|
|
300
|
+
gap: var(--space-2);
|
|
301
|
+
}
|
|
302
|
+
.kpi-card {
|
|
303
|
+
/* Was --space-5 (32px) pad + --r-3 (22px) — four cards ate a full fold. A
|
|
304
|
+
16px pad on a --r-1 corner keeps them prominent but dense; the number drops
|
|
305
|
+
from a 48px marketing display to a 32px app-scale figure. */
|
|
306
|
+
padding: var(--space-3);
|
|
307
|
+
background: var(--bg-2);
|
|
308
|
+
border-radius: var(--r-1);
|
|
309
|
+
}
|
|
310
|
+
.kpi-card .num {
|
|
311
|
+
font-family: var(--ff-body); font-weight: 600;
|
|
312
|
+
font-size: clamp(22px, 3cqi, 32px); line-height: 1;
|
|
313
|
+
letter-spacing: var(--tr-tight);
|
|
314
|
+
}
|
|
315
|
+
.kpi-card .lbl {
|
|
316
|
+
font-size: var(--fs-xs); color: var(--fg-3);
|
|
317
|
+
font-weight: 600; margin-top: 8px;
|
|
318
|
+
letter-spacing: var(--tr-caps); text-transform: uppercase;
|
|
319
|
+
}
|
|
320
|
+
.kpi-foot {
|
|
321
|
+
display: flex; align-items: center; justify-content: space-between;
|
|
322
|
+
margin-top: var(--space-2);
|
|
323
|
+
}
|
|
324
|
+
.kpi-delta {
|
|
325
|
+
display: inline-flex; align-items: center; gap: var(--space-hair);
|
|
326
|
+
font-size: var(--fs-xs); font-weight: 600;
|
|
327
|
+
}
|
|
328
|
+
.kpi-delta-up { color: var(--green); }
|
|
329
|
+
.kpi-delta-down { color: var(--danger); }
|
|
330
|
+
.ds-sparkline path { stroke: currentColor; }
|
|
331
|
+
.ds-sparkline-up { color: var(--success); }
|
|
332
|
+
.ds-sparkline-down { color: var(--danger); }
|
|
333
|
+
|
|
334
|
+
/* ============================================================
|
|
335
|
+
BarChart
|
|
336
|
+
============================================================ */
|
|
337
|
+
.ds-barchart { display: flex; flex-direction: column; gap: var(--space-2); }
|
|
338
|
+
.ds-barchart-row {
|
|
339
|
+
display: grid; grid-template-columns: minmax(90px, 25%) 1fr auto;
|
|
340
|
+
align-items: center; gap: var(--space-2);
|
|
341
|
+
}
|
|
342
|
+
.ds-barchart-label { font-size: var(--fs-sm); color: var(--fg-2); }
|
|
343
|
+
.ds-barchart-track {
|
|
344
|
+
/* 6px unifies with the system's other bar tracks (.ds-upload-bar,
|
|
345
|
+
.ds-bar-bg); was --space-2 (8px), the lone thicker slab in the bar family. */
|
|
346
|
+
height: var(--space-1-75); border-radius: var(--r-pill);
|
|
347
|
+
background: var(--bg-3); overflow: hidden;
|
|
348
|
+
}
|
|
349
|
+
.ds-barchart-fill {
|
|
350
|
+
height: 100%; width: var(--bar-pct, 0%);
|
|
351
|
+
background: var(--fg-3); border-radius: var(--r-pill);
|
|
352
|
+
}
|
|
353
|
+
.ds-barchart-fill.is-active { background: var(--accent); }
|
|
354
|
+
.ds-barchart-value {
|
|
355
|
+
font-size: var(--fs-xs); font-weight: 600; color: var(--fg-3);
|
|
356
|
+
font-variant-numeric: tabular-nums;
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/* ============================================================
|
|
360
|
+
Empty state
|
|
361
|
+
============================================================ */
|
|
362
|
+
.empty {
|
|
363
|
+
/* Was --space-8 (96px) — an empty list spent 192px of vertical space on
|
|
364
|
+
nothing. --space-6 (48px) still centres a message with air, without the
|
|
365
|
+
empty state dominating the fold. Mobile drops it further (below). */
|
|
366
|
+
padding: var(--space-6);
|
|
367
|
+
text-align: center;
|
|
368
|
+
color: var(--fg-3);
|
|
369
|
+
background: var(--bg-2);
|
|
370
|
+
border-radius: var(--r-1);
|
|
371
|
+
font-size: var(--fs-sm);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/* ============================================================
|
|
375
|
+
Form
|
|
376
|
+
============================================================ */
|
|
377
|
+
.row-form {
|
|
378
|
+
display: grid; gap: 12px;
|
|
379
|
+
padding: var(--space-5);
|
|
380
|
+
background: var(--bg-2);
|
|
381
|
+
border-radius: var(--r-3);
|
|
382
|
+
}
|
|
383
|
+
.row-form input,
|
|
384
|
+
.row-form textarea {
|
|
385
|
+
font-family: inherit; font-size: var(--fs-sm);
|
|
386
|
+
padding: 12px 16px;
|
|
387
|
+
background: var(--bg); color: var(--fg);
|
|
388
|
+
border: 0; border-radius: var(--r-2);
|
|
389
|
+
box-shadow: inset 0 0 0 1px var(--rule);
|
|
390
|
+
}
|
|
391
|
+
.row-form input:focus-visible,
|
|
392
|
+
.row-form textarea:focus-visible { box-shadow: var(--focus-ring-inset); }
|
|
393
|
+
|
|
394
|
+
/* Field char counter (TextField maxLength) */
|
|
395
|
+
.ds-field-count {
|
|
396
|
+
font-size: var(--fs-tiny, 13px);
|
|
397
|
+
color: var(--fg-3, var(--fg-2));
|
|
398
|
+
text-align: right;
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
/* Multi-column form layout (Form columns prop) */
|
|
402
|
+
.row-form[data-columns="2"] { grid-template-columns: repeat(2, 1fr); }
|
|
403
|
+
.row-form[data-columns="3"] { grid-template-columns: repeat(3, 1fr); }
|
|
404
|
+
@media (max-width: 600px) {
|
|
405
|
+
.row-form[data-columns="2"],
|
|
406
|
+
.row-form[data-columns="3"] { grid-template-columns: 1fr; }
|
|
407
|
+
}
|