anentrypoint-design 0.0.155 → 0.0.157
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/app-shell.css +159 -54
- package/colors_and_type.css +16 -7
- package/dist/247420.css +174 -59
- package/dist/247420.js +12 -12
- package/package.json +1 -1
- package/src/components/chat.js +10 -4
- package/src/components/content.js +2 -2
- package/src/components/shell.js +33 -20
- package/src/kits/os/theme.css +13 -13
package/app-shell.css
CHANGED
|
@@ -59,6 +59,12 @@ h2, .t-h2 { font-family: var(--ff-body); font-size: var(--fs-h2); line-height: v
|
|
|
59
59
|
h3, .t-h3 { font-family: var(--ff-body); font-size: var(--fs-h3); line-height: var(--lh-snug); letter-spacing: -0.01em; font-weight: 600; margin: 0; }
|
|
60
60
|
h4, .t-h4 { font-family: var(--ff-body); font-size: var(--fs-h4); line-height: var(--lh-snug); font-weight: 600; margin: 0; }
|
|
61
61
|
|
|
62
|
+
/* App/chrome typescale opt-in: compact heading ceiling for application UIs. */
|
|
63
|
+
[data-typescale="app"] h1, [data-typescale="app"] .t-h1 { font-size: var(--fs-h1-app); line-height: 1.15; }
|
|
64
|
+
[data-typescale="app"] h2, [data-typescale="app"] .t-h2 { font-size: var(--fs-h2-app); }
|
|
65
|
+
[data-typescale="app"] h3, [data-typescale="app"] .t-h3 { font-size: var(--fs-h3-app); }
|
|
66
|
+
[data-typescale="app"] h4, [data-typescale="app"] .t-h4 { font-size: var(--fs-h4-app); }
|
|
67
|
+
|
|
62
68
|
.t-hero { font-family: var(--ff-body); font-size: var(--fs-hero); line-height: var(--lh-tight); letter-spacing: var(--tr-tighter); font-weight: 600; margin: 0; }
|
|
63
69
|
.t-mega { font-family: var(--ff-body); font-size: var(--fs-mega); line-height: 0.95; letter-spacing: var(--tr-tighter); font-weight: 600; margin: 0; }
|
|
64
70
|
|
|
@@ -149,6 +155,11 @@ pre .n { color: var(--green-2); }
|
|
|
149
155
|
.app {
|
|
150
156
|
display: flex; flex-direction: column;
|
|
151
157
|
min-height: 100vh;
|
|
158
|
+
/* Definite height so the flex column resolves height:100% for descendants
|
|
159
|
+
(e.g. a full-height chat) at every breakpoint, not just where a desktop
|
|
160
|
+
media override happened to set explicit heights. dvh tracks mobile chrome. */
|
|
161
|
+
min-height: 100dvh;
|
|
162
|
+
height: 100dvh;
|
|
152
163
|
background: var(--bg);
|
|
153
164
|
color: var(--fg);
|
|
154
165
|
/* Notched-device safe area padding (no-op on devices without notches) */
|
|
@@ -290,11 +301,22 @@ pre .n { color: var(--green-2); }
|
|
|
290
301
|
align-self: stretch;
|
|
291
302
|
height: 100%;
|
|
292
303
|
}
|
|
293
|
-
.app-main > * { min-height: 0;
|
|
304
|
+
.app-main > * { min-height: 0; }
|
|
305
|
+
/* The main region scrolls its own overflow at every breakpoint (previously
|
|
306
|
+
only ≥901px), so a fixed-height .app never clips route content and inner
|
|
307
|
+
panels don't fight the page scroll. */
|
|
308
|
+
.app-main { overflow-y: auto; }
|
|
309
|
+
/* Reserve the scrollbar track so routes with/without overflow don't shift
|
|
310
|
+
the layout horizontally when the bar appears. */
|
|
311
|
+
.app-main { scrollbar-gutter: stable; }
|
|
312
|
+
/* Jump-target anchors clear the inner-scroll top edge (no chrome overlap,
|
|
313
|
+
but a little breathing room when deep-linked within .app-main). */
|
|
314
|
+
.app-main [id] { scroll-margin-top: var(--space-4); }
|
|
315
|
+
/* Full-height route children fill the region instead of scrolling the page. */
|
|
294
316
|
.app-main > .chat,
|
|
295
317
|
.app-main > .chat-area,
|
|
296
318
|
.app-main > .ds-file-stage,
|
|
297
|
-
.app-main > .grow { flex
|
|
319
|
+
.app-main > .grow { flex: 1 1 auto; min-height: 0; }
|
|
298
320
|
.app-main.narrow { max-width: var(--measure-narrow); margin: 0 auto; }
|
|
299
321
|
|
|
300
322
|
@media (min-width: 1400px) {
|
|
@@ -428,9 +450,11 @@ pre .n { color: var(--green-2); }
|
|
|
428
450
|
Panel — soft tonal container, no border decoration
|
|
429
451
|
============================================================ */
|
|
430
452
|
.panel {
|
|
431
|
-
background: var(--bg);
|
|
453
|
+
background: var(--panel-1, var(--bg-2));
|
|
432
454
|
border-radius: var(--r-3);
|
|
433
455
|
margin: 0 0 var(--space-5);
|
|
456
|
+
padding: var(--space-3);
|
|
457
|
+
box-shadow: var(--panel-shadow);
|
|
434
458
|
position: relative;
|
|
435
459
|
}
|
|
436
460
|
.panel.panel-inline { background: var(--bg-2); padding: var(--space-3) var(--space-3); }
|
|
@@ -1429,7 +1453,6 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
|
|
|
1429
1453
|
.chat {
|
|
1430
1454
|
display: flex; flex-direction: column;
|
|
1431
1455
|
flex: 1; min-height: 0; gap: var(--space-3);
|
|
1432
|
-
padding-bottom: calc(var(--app-status-h, 42px) + var(--space-2));
|
|
1433
1456
|
}
|
|
1434
1457
|
.chat-head {
|
|
1435
1458
|
display: flex; align-items: baseline; gap: 8px;
|
|
@@ -1440,6 +1463,7 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
|
|
|
1440
1463
|
margin-bottom: var(--space-2);
|
|
1441
1464
|
}
|
|
1442
1465
|
.chat-head .dot { width: 8px; height: 8px; border-radius: 50%; background: var(--accent); flex-shrink: 0; }
|
|
1466
|
+
.chat-head .ds-chat-title,
|
|
1443
1467
|
.chat-head > span:nth-child(2) {
|
|
1444
1468
|
font-family: var(--ff-body); font-size: var(--fs-h4);
|
|
1445
1469
|
font-weight: 600; color: var(--fg);
|
|
@@ -1453,21 +1477,21 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
|
|
|
1453
1477
|
flex: 1; min-height: 0; overflow-y: auto;
|
|
1454
1478
|
padding: var(--space-2) 0;
|
|
1455
1479
|
scrollbar-width: thin; scrollbar-color: var(--bg-3) transparent;
|
|
1456
|
-
|
|
1480
|
+
}
|
|
1481
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
1482
|
+
.chat-thread { scroll-behavior: smooth; }
|
|
1457
1483
|
}
|
|
1458
1484
|
.chat-thread::-webkit-scrollbar { width: 8px; }
|
|
1459
1485
|
.chat-thread::-webkit-scrollbar-thumb { background: var(--bg-3); border-radius: 4px; }
|
|
1460
|
-
.chat-
|
|
1461
|
-
|
|
1462
|
-
|
|
1486
|
+
.chat-empty {
|
|
1487
|
+
margin: auto;
|
|
1488
|
+
text-align: center;
|
|
1463
1489
|
color: var(--fg-3);
|
|
1464
1490
|
font-family: var(--ff-mono);
|
|
1465
|
-
font-size: var(--fs-sm);
|
|
1466
|
-
text-align: center;
|
|
1467
|
-
margin: auto;
|
|
1468
|
-
opacity: 0.6;
|
|
1469
1491
|
pointer-events: none;
|
|
1470
1492
|
}
|
|
1493
|
+
.chat-empty-title { font-size: var(--fs-sm); margin: 0 0 var(--space-1); }
|
|
1494
|
+
.chat-empty-sub { font-size: var(--fs-tiny); margin: 0; opacity: .7; }
|
|
1471
1495
|
|
|
1472
1496
|
.chat-msg { display: flex; gap: 12px; align-items: flex-start; padding: 6px 0; position: relative; min-width: 0; }
|
|
1473
1497
|
.chat-msg.you { flex-direction: row-reverse; }
|
|
@@ -1501,10 +1525,10 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
|
|
|
1501
1525
|
|
|
1502
1526
|
.chat-bubble {
|
|
1503
1527
|
padding: 10px 14px; background: var(--bg-2); color: var(--fg);
|
|
1504
|
-
|
|
1528
|
+
max-width: 100%;
|
|
1529
|
+
border-radius: var(--r-2); line-height: 1.55;
|
|
1505
1530
|
word-wrap: break-word; overflow-wrap: anywhere;
|
|
1506
1531
|
font-size: var(--fs-sm);
|
|
1507
|
-
max-width: clamp(220px, min(75vw, 28em), 480px);
|
|
1508
1532
|
min-width: 0;
|
|
1509
1533
|
transition: transform 0.12s ease, box-shadow 0.12s ease;
|
|
1510
1534
|
}
|
|
@@ -1788,27 +1812,34 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
|
|
|
1788
1812
|
box-shadow: 0 0 0 2px color-mix(in oklab, var(--accent) 20%, transparent);
|
|
1789
1813
|
outline: none;
|
|
1790
1814
|
}
|
|
1791
|
-
.chat-composer .send
|
|
1792
|
-
.chat-composer button {
|
|
1815
|
+
.chat-composer .send {
|
|
1793
1816
|
width: 44px; height: 44px; border-radius: 50%;
|
|
1794
1817
|
background: var(--accent); color: var(--accent-fg);
|
|
1795
|
-
border: 0; cursor: pointer;
|
|
1818
|
+
border: 0; cursor: pointer;
|
|
1796
1819
|
display: inline-flex; align-items: center; justify-content: center;
|
|
1797
|
-
flex-shrink: 0;
|
|
1820
|
+
flex-shrink: 0;
|
|
1798
1821
|
transition: background var(--dur-snap, .15s) var(--ease, ease), transform .1s ease;
|
|
1799
|
-
will-change: transform; contain: layout style paint;
|
|
1800
1822
|
}
|
|
1801
|
-
.chat-composer .send:
|
|
1802
|
-
|
|
1803
|
-
.
|
|
1804
|
-
.
|
|
1823
|
+
.chat-composer .send:disabled { opacity: .5; cursor: not-allowed; }
|
|
1824
|
+
/* Ghost icon buttons in the toolbar (attach / emoji / more) — NOT the round
|
|
1825
|
+
accent send button. */
|
|
1826
|
+
.composer-btn {
|
|
1827
|
+
width: 40px; height: 40px; border-radius: 50%;
|
|
1828
|
+
background: transparent; color: var(--fg-3);
|
|
1829
|
+
border: 0; cursor: pointer;
|
|
1830
|
+
display: inline-flex; align-items: center; justify-content: center;
|
|
1831
|
+
flex-shrink: 0;
|
|
1832
|
+
transition: background var(--dur-snap, .15s) var(--ease, ease), color var(--dur-snap, .15s) var(--ease, ease);
|
|
1833
|
+
}
|
|
1834
|
+
.composer-btn:hover { background: color-mix(in oklab, var(--fg) 8%, transparent); color: var(--fg); }
|
|
1835
|
+
.chat-composer .send:hover { transform: scale(1.04); }
|
|
1836
|
+
.chat-composer .send:active { transform: scale(0.96); }
|
|
1805
1837
|
.chat-composer .send:focus-visible,
|
|
1806
|
-
.
|
|
1838
|
+
.composer-btn:focus-visible {
|
|
1807
1839
|
outline: 2px solid var(--accent);
|
|
1808
1840
|
outline-offset: 2px;
|
|
1809
1841
|
}
|
|
1810
|
-
.chat-composer .send:disabled
|
|
1811
|
-
.chat-composer button:disabled {
|
|
1842
|
+
.chat-composer .send:disabled {
|
|
1812
1843
|
background: var(--bg-3); color: var(--fg-3); cursor: not-allowed; transform: none;
|
|
1813
1844
|
}
|
|
1814
1845
|
|
|
@@ -1953,13 +1984,17 @@ button:active:not(:disabled) {
|
|
|
1953
1984
|
transform: scale(0.98);
|
|
1954
1985
|
}
|
|
1955
1986
|
|
|
1956
|
-
/* Enhanced hover transitions
|
|
1987
|
+
/* Enhanced hover transitions — transition only the properties that actually
|
|
1988
|
+
change (not `all`, which animates layout and is a perf trap), and drop the
|
|
1989
|
+
blanket `will-change` (it forces a permanent compositor layer per element). */
|
|
1957
1990
|
.btn, .btn-primary, .btn-ghost,
|
|
1958
1991
|
button, a.row, .row,
|
|
1959
1992
|
.chip, [role="button"],
|
|
1960
1993
|
input[type="checkbox"], input[type="radio"] {
|
|
1961
|
-
transition:
|
|
1962
|
-
|
|
1994
|
+
transition: background-color var(--dur-snap) var(--ease),
|
|
1995
|
+
color var(--dur-snap) var(--ease),
|
|
1996
|
+
box-shadow var(--dur-snap) var(--ease),
|
|
1997
|
+
transform var(--dur-snap) var(--ease);
|
|
1963
1998
|
}
|
|
1964
1999
|
|
|
1965
2000
|
/* Prevent double-tap zoom on buttons (iOS) */
|
|
@@ -2100,6 +2135,9 @@ input[type="text"],
|
|
|
2100
2135
|
input[type="email"],
|
|
2101
2136
|
input[type="password"],
|
|
2102
2137
|
input[type="number"],
|
|
2138
|
+
input[type="search"],
|
|
2139
|
+
input[type="url"],
|
|
2140
|
+
input[type="tel"],
|
|
2103
2141
|
textarea,
|
|
2104
2142
|
select {
|
|
2105
2143
|
transition: background var(--dur-snap) var(--ease),
|
|
@@ -2111,10 +2149,74 @@ input[type="text"]::placeholder,
|
|
|
2111
2149
|
input[type="email"]::placeholder,
|
|
2112
2150
|
input[type="password"]::placeholder,
|
|
2113
2151
|
input[type="number"]::placeholder,
|
|
2152
|
+
input[type="search"]::placeholder,
|
|
2153
|
+
input[type="url"]::placeholder,
|
|
2114
2154
|
textarea::placeholder {
|
|
2115
2155
|
color: var(--fg-3);
|
|
2116
2156
|
}
|
|
2117
2157
|
|
|
2158
|
+
/* ── Field controls: themed base for TextField / Select / SearchInput ──
|
|
2159
|
+
Root fix: previously only `transition` was set, so themed apps got
|
|
2160
|
+
browser-default white boxes in dark mode and labels collided with inputs
|
|
2161
|
+
because `.ds-field` had no layout. */
|
|
2162
|
+
.ds-field {
|
|
2163
|
+
display: flex;
|
|
2164
|
+
flex-direction: column;
|
|
2165
|
+
gap: var(--space-1, 6px);
|
|
2166
|
+
align-items: stretch;
|
|
2167
|
+
width: 100%;
|
|
2168
|
+
}
|
|
2169
|
+
.ds-field-label {
|
|
2170
|
+
font-size: var(--fs-sm, 14px);
|
|
2171
|
+
color: var(--fg-2);
|
|
2172
|
+
line-height: 1.3;
|
|
2173
|
+
}
|
|
2174
|
+
.ds-field-hint {
|
|
2175
|
+
font-size: var(--fs-tiny, 13px);
|
|
2176
|
+
color: var(--fg-3);
|
|
2177
|
+
line-height: 1.35;
|
|
2178
|
+
}
|
|
2179
|
+
.ds-field-count {
|
|
2180
|
+
font-size: var(--fs-tiny, 13px);
|
|
2181
|
+
color: var(--fg-3);
|
|
2182
|
+
align-self: flex-end;
|
|
2183
|
+
}
|
|
2184
|
+
|
|
2185
|
+
.ds-field input,
|
|
2186
|
+
.ds-field textarea,
|
|
2187
|
+
.ds-field .ds-select,
|
|
2188
|
+
.ds-search-input {
|
|
2189
|
+
width: 100%;
|
|
2190
|
+
box-sizing: border-box;
|
|
2191
|
+
font: inherit;
|
|
2192
|
+
color: var(--fg);
|
|
2193
|
+
background: var(--bg-2);
|
|
2194
|
+
border: 0;
|
|
2195
|
+
box-shadow: inset 0 0 0 var(--bw-hair, 1px) var(--rule);
|
|
2196
|
+
border-radius: var(--r-2, 10px);
|
|
2197
|
+
padding: 10px 14px;
|
|
2198
|
+
}
|
|
2199
|
+
.ds-field textarea { min-height: calc(4 * 1.5em); resize: vertical; }
|
|
2200
|
+
.ds-search-input::placeholder { color: var(--fg-3); }
|
|
2201
|
+
|
|
2202
|
+
.ds-field input:focus-visible,
|
|
2203
|
+
.ds-field textarea:focus-visible,
|
|
2204
|
+
.ds-field .ds-select:focus-visible,
|
|
2205
|
+
.ds-search-input:focus-visible {
|
|
2206
|
+
outline: none;
|
|
2207
|
+
box-shadow: inset 0 0 0 2px var(--accent);
|
|
2208
|
+
}
|
|
2209
|
+
.ds-field input:disabled,
|
|
2210
|
+
.ds-field textarea:disabled,
|
|
2211
|
+
.ds-field .ds-select:disabled {
|
|
2212
|
+
opacity: .55;
|
|
2213
|
+
cursor: not-allowed;
|
|
2214
|
+
}
|
|
2215
|
+
.ds-field input[aria-invalid="true"],
|
|
2216
|
+
.ds-field textarea[aria-invalid="true"] {
|
|
2217
|
+
box-shadow: inset 0 0 0 var(--bw-hair, 1px) var(--flame, #d64545);
|
|
2218
|
+
}
|
|
2219
|
+
|
|
2118
2220
|
/* Clear button for text inputs */
|
|
2119
2221
|
input[type="text"]:not(:placeholder-shown) + .input-clear,
|
|
2120
2222
|
input[type="email"]:not(:placeholder-shown) + .input-clear,
|
|
@@ -2163,9 +2265,10 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
|
|
|
2163
2265
|
}
|
|
2164
2266
|
.skip-to-main:focus { top: 10px; }
|
|
2165
2267
|
|
|
2166
|
-
/* Reduced motion preferences
|
|
2268
|
+
/* Reduced motion preferences — scoped to the DS surface so it doesn't reach
|
|
2269
|
+
into and neutralize the host document's own motion. */
|
|
2167
2270
|
@media (prefers-reduced-motion: reduce) {
|
|
2168
|
-
* {
|
|
2271
|
+
.ds-247420 *, .app * {
|
|
2169
2272
|
animation-duration: 0.01ms !important;
|
|
2170
2273
|
animation-iteration-count: 1 !important;
|
|
2171
2274
|
transition-duration: 0.01ms !important;
|
|
@@ -2173,19 +2276,14 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
|
|
|
2173
2276
|
}
|
|
2174
2277
|
|
|
2175
2278
|
/* ────────────────────────────────────────────────────────────
|
|
2176
|
-
Performance
|
|
2279
|
+
Performance
|
|
2177
2280
|
────────────────────────────────────────────────────────────── */
|
|
2178
2281
|
|
|
2179
|
-
/*
|
|
2180
|
-
|
|
2181
|
-
a
|
|
2182
|
-
|
|
2183
|
-
|
|
2184
|
-
}
|
|
2185
|
-
|
|
2186
|
-
/* Contain layout repaints on self-contained components */
|
|
2187
|
-
.panel, .row, .chip, .btn, button {
|
|
2188
|
-
contain: layout style paint;
|
|
2282
|
+
/* Limit layout/style containment to self-contained components. `paint` is
|
|
2283
|
+
intentionally omitted — it clips focus rings, tooltips and dropdowns that
|
|
2284
|
+
emanate from a contained .row/.btn. */
|
|
2285
|
+
.panel, .row {
|
|
2286
|
+
contain: layout style;
|
|
2189
2287
|
}
|
|
2190
2288
|
|
|
2191
2289
|
/* ────────────────────────────────────────────────────────────
|
|
@@ -2195,11 +2293,14 @@ button:hover, [role="button"]:hover {
|
|
|
2195
2293
|
@media (hover: none) and (pointer: coarse) {
|
|
2196
2294
|
/* Mobile devices: larger touch targets, faster responses */
|
|
2197
2295
|
.btn, .btn-primary, .btn-ghost,
|
|
2198
|
-
button, a.row, [role="button"]
|
|
2296
|
+
button, a.row, [role="button"],
|
|
2297
|
+
.ds-icon-btn, .composer-btn {
|
|
2199
2298
|
min-height: 48px;
|
|
2200
2299
|
min-width: 48px;
|
|
2201
2300
|
padding: 12px 20px;
|
|
2202
2301
|
}
|
|
2302
|
+
/* Icon buttons stay square — the padding bump above would distort them. */
|
|
2303
|
+
.ds-icon-btn, .composer-btn { padding: 0; }
|
|
2203
2304
|
|
|
2204
2305
|
/* Remove hover effects on touch devices (use active instead) */
|
|
2205
2306
|
.btn:hover, .btn-primary:hover, .btn-ghost:hover {
|
|
@@ -2222,12 +2323,9 @@ button:hover, [role="button"]:hover {
|
|
|
2222
2323
|
Theme Transition Smoothness
|
|
2223
2324
|
────────────────────────────────────────────────────────────── */
|
|
2224
2325
|
|
|
2225
|
-
|
|
2226
|
-
|
|
2227
|
-
|
|
2228
|
-
}
|
|
2229
|
-
|
|
2230
|
-
body {
|
|
2326
|
+
/* Scoped to the DS wrapper so the design system never reaches out and
|
|
2327
|
+
animates the host document's html/body. */
|
|
2328
|
+
.ds-247420, .app {
|
|
2231
2329
|
transition: background-color var(--dur-base) var(--ease),
|
|
2232
2330
|
color var(--dur-base) var(--ease);
|
|
2233
2331
|
}
|
|
@@ -2498,12 +2596,19 @@ body {
|
|
|
2498
2596
|
.app-topbar .brand { margin-left: 44px; }
|
|
2499
2597
|
}
|
|
2500
2598
|
|
|
2501
|
-
/* Desktop:
|
|
2502
|
-
|
|
2599
|
+
/* Desktop: the app shell is exactly viewport-height and contains its own
|
|
2600
|
+
scroll, so only .app-main (and the side rail) scroll — never the page too.
|
|
2601
|
+
Pinning .app to 100dvh + overflow:hidden is what prevents the double
|
|
2602
|
+
scrollbar that a min-height:100vh shell + inner overflow:auto produces.
|
|
2603
|
+
.app-body fills the gap between topbar/crumb and status via flex:1 rather
|
|
2604
|
+
than a hand-computed calc() that drifts from the real chrome heights. */
|
|
2503
2605
|
@media (min-width: 901px) {
|
|
2504
|
-
.app
|
|
2505
|
-
|
|
2506
|
-
.
|
|
2606
|
+
.app { height: 100dvh; min-height: 0; overflow: hidden; }
|
|
2607
|
+
/* Embedded shell (freddie WM window) fills its container, not the viewport. */
|
|
2608
|
+
.fd-root .app { height: 100%; overflow: visible; }
|
|
2609
|
+
.app-body { min-height: 0; flex: 1 1 auto; }
|
|
2610
|
+
.app-side-shell { overflow-y: auto; min-height: 0; }
|
|
2611
|
+
.app-main { overflow-y: auto; min-height: 0; }
|
|
2507
2612
|
}
|
|
2508
2613
|
|
|
2509
2614
|
/* Mobile (≤480) status bar compact; hide tail item */
|
package/colors_and_type.css
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
Source-of-truth tokens. Component sheet lives in app-shell.css.
|
|
5
5
|
============================================================ */
|
|
6
6
|
|
|
7
|
-
@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,400;0,500;0,600;0,700;1,400;1,700&
|
|
7
|
+
@import url('https://fonts.googleapis.com/css2?family=Inter:wght@300;400;500;600;700&family=JetBrains+Mono:ital,wght@0,400;0,500;0,600;0,700;1,400;1,700&display=swap');
|
|
8
8
|
|
|
9
9
|
:root {
|
|
10
10
|
/* Tree view indentation tokens */
|
|
@@ -66,12 +66,11 @@
|
|
|
66
66
|
--panel-accent-2: var(--accent-bright, var(--accent));
|
|
67
67
|
--panel-shadow: 0 1px 0 color-mix(in oklab, var(--fg) 6%, transparent), 0 4px 14px color-mix(in oklab, var(--fg) 8%, transparent);
|
|
68
68
|
|
|
69
|
-
/* Type —
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
--ff-
|
|
73
|
-
--ff-
|
|
74
|
-
--ff-body: 'Space Grotesk', system-ui, sans-serif;
|
|
69
|
+
/* Type — Inter for everything non-mono. The display/narrow aliases stay so
|
|
70
|
+
consumers that reference them keep working; they resolve to the body font. */
|
|
71
|
+
--ff-display: 'Inter', system-ui, sans-serif;
|
|
72
|
+
--ff-narrow: 'Inter', system-ui, sans-serif;
|
|
73
|
+
--ff-body: 'Inter', system-ui, sans-serif;
|
|
75
74
|
--ff-mono: 'JetBrains Mono', ui-monospace, Menlo, Consolas, monospace;
|
|
76
75
|
|
|
77
76
|
--fs-micro: 12px;
|
|
@@ -88,6 +87,15 @@
|
|
|
88
87
|
--fs-hero: clamp(42px, 7cqi, 96px);
|
|
89
88
|
--fs-mega: clamp(56px, 11cqi, 168px);
|
|
90
89
|
|
|
90
|
+
/* App/chrome typescale: the default heading scale above is tuned for
|
|
91
|
+
marketing/hero layouts (h1 up to 64px). Application chrome — page titles,
|
|
92
|
+
panel headers — needs a compact ceiling so a PageHeader title doesn't
|
|
93
|
+
dwarf the content. Opt in with `data-typescale="app"` on a container. */
|
|
94
|
+
--fs-h1-app: clamp(22px, 2.4cqi, 30px);
|
|
95
|
+
--fs-h2-app: clamp(19px, 2cqi, 24px);
|
|
96
|
+
--fs-h3-app: clamp(17px, 1.8cqi, 20px);
|
|
97
|
+
--fs-h4-app: clamp(15px, 1.6cqi, 17px);
|
|
98
|
+
|
|
91
99
|
--lh-tight: 1.05;
|
|
92
100
|
--lh-snug: 1.2;
|
|
93
101
|
--lh-base: 1.55;
|
|
@@ -193,6 +201,7 @@ select:focus-visible {
|
|
|
193
201
|
|
|
194
202
|
[data-theme="ink"],
|
|
195
203
|
[data-theme="dark"] {
|
|
204
|
+
color-scheme: dark;
|
|
196
205
|
--bg: var(--ink);
|
|
197
206
|
--bg-2: var(--ink-2);
|
|
198
207
|
--bg-3: #464650;
|