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/dist/247420.css
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
Source-of-truth tokens. Component sheet lives in app-shell.css.
|
|
7
7
|
============================================================ */
|
|
8
8
|
|
|
9
|
-
@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:ital,wght@0,400;0,500;0,600;0,700;1,400;1,700&
|
|
9
|
+
@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');
|
|
10
10
|
|
|
11
11
|
.ds-247420 {
|
|
12
12
|
/* Tree view indentation tokens */
|
|
@@ -68,12 +68,11 @@
|
|
|
68
68
|
--panel-accent-2: var(--accent-bright, var(--accent));
|
|
69
69
|
--panel-shadow: 0 1px 0 color-mix(in oklab, var(--fg) 6%, transparent), 0 4px 14px color-mix(in oklab, var(--fg) 8%, transparent);
|
|
70
70
|
|
|
71
|
-
/* Type —
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
--ff-
|
|
75
|
-
--ff-
|
|
76
|
-
--ff-body: 'Space Grotesk', system-ui, sans-serif;
|
|
71
|
+
/* Type — Inter for everything non-mono. The display/narrow aliases stay so
|
|
72
|
+
consumers that reference them keep working; they resolve to the body font. */
|
|
73
|
+
--ff-display: 'Inter', system-ui, sans-serif;
|
|
74
|
+
--ff-narrow: 'Inter', system-ui, sans-serif;
|
|
75
|
+
--ff-body: 'Inter', system-ui, sans-serif;
|
|
77
76
|
--ff-mono: 'JetBrains Mono', ui-monospace, Menlo, Consolas, monospace;
|
|
78
77
|
|
|
79
78
|
--fs-micro: 12px;
|
|
@@ -90,6 +89,15 @@
|
|
|
90
89
|
--fs-hero: clamp(42px, 7cqi, 96px);
|
|
91
90
|
--fs-mega: clamp(56px, 11cqi, 168px);
|
|
92
91
|
|
|
92
|
+
/* App/chrome typescale: the default heading scale above is tuned for
|
|
93
|
+
marketing/hero layouts (h1 up to 64px). Application chrome — page titles,
|
|
94
|
+
panel headers — needs a compact ceiling so a PageHeader title doesn't
|
|
95
|
+
dwarf the content. Opt in with `data-typescale="app"` on a container. */
|
|
96
|
+
--fs-h1-app: clamp(22px, 2.4cqi, 30px);
|
|
97
|
+
--fs-h2-app: clamp(19px, 2cqi, 24px);
|
|
98
|
+
--fs-h3-app: clamp(17px, 1.8cqi, 20px);
|
|
99
|
+
--fs-h4-app: clamp(15px, 1.6cqi, 17px);
|
|
100
|
+
|
|
93
101
|
--lh-tight: 1.05;
|
|
94
102
|
--lh-snug: 1.2;
|
|
95
103
|
--lh-base: 1.55;
|
|
@@ -195,6 +203,7 @@
|
|
|
195
203
|
|
|
196
204
|
.ds-247420[data-theme="ink"],
|
|
197
205
|
.ds-247420[data-theme="dark"] {
|
|
206
|
+
color-scheme: dark;
|
|
198
207
|
--bg: var(--ink);
|
|
199
208
|
--bg-2: var(--ink-2);
|
|
200
209
|
--bg-3: #464650;
|
|
@@ -381,6 +390,12 @@
|
|
|
381
390
|
.ds-247420 h3, .ds-247420 .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; }
|
|
382
391
|
.ds-247420 h4, .ds-247420 .t-h4 { font-family: var(--ff-body); font-size: var(--fs-h4); line-height: var(--lh-snug); font-weight: 600; margin: 0; }
|
|
383
392
|
|
|
393
|
+
/* App/chrome typescale opt-in: compact heading ceiling for application UIs. */
|
|
394
|
+
.ds-247420[data-typescale="app"] h1, .ds-247420[data-typescale="app"] .t-h1 { font-size: var(--fs-h1-app); line-height: 1.15; }
|
|
395
|
+
.ds-247420[data-typescale="app"] h2, .ds-247420[data-typescale="app"] .t-h2 { font-size: var(--fs-h2-app); }
|
|
396
|
+
.ds-247420[data-typescale="app"] h3, .ds-247420[data-typescale="app"] .t-h3 { font-size: var(--fs-h3-app); }
|
|
397
|
+
.ds-247420[data-typescale="app"] h4, .ds-247420[data-typescale="app"] .t-h4 { font-size: var(--fs-h4-app); }
|
|
398
|
+
|
|
384
399
|
.ds-247420 .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; }
|
|
385
400
|
.ds-247420 .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; }
|
|
386
401
|
|
|
@@ -471,6 +486,11 @@
|
|
|
471
486
|
.ds-247420 .app {
|
|
472
487
|
display: flex; flex-direction: column;
|
|
473
488
|
min-height: 100vh;
|
|
489
|
+
/* Definite height so the flex column resolves height:100% for descendants
|
|
490
|
+
(e.g. a full-height chat) at every breakpoint, not just where a desktop
|
|
491
|
+
media override happened to set explicit heights. dvh tracks mobile chrome. */
|
|
492
|
+
min-height: 100dvh;
|
|
493
|
+
height: 100dvh;
|
|
474
494
|
background: var(--bg);
|
|
475
495
|
color: var(--fg);
|
|
476
496
|
/* Notched-device safe area padding (no-op on devices without notches) */
|
|
@@ -612,11 +632,22 @@
|
|
|
612
632
|
align-self: stretch;
|
|
613
633
|
height: 100%;
|
|
614
634
|
}
|
|
615
|
-
.ds-247420 .app-main > * { min-height: 0;
|
|
635
|
+
.ds-247420 .app-main > * { min-height: 0; }
|
|
636
|
+
/* The main region scrolls its own overflow at every breakpoint (previously
|
|
637
|
+
only ≥901px), so a fixed-height .app never clips route content and inner
|
|
638
|
+
panels don't fight the page scroll. */
|
|
639
|
+
.ds-247420 .app-main { overflow-y: auto; }
|
|
640
|
+
/* Reserve the scrollbar track so routes with/without overflow don't shift
|
|
641
|
+
the layout horizontally when the bar appears. */
|
|
642
|
+
.ds-247420 .app-main { scrollbar-gutter: stable; }
|
|
643
|
+
/* Jump-target anchors clear the inner-scroll top edge (no chrome overlap,
|
|
644
|
+
but a little breathing room when deep-linked within .app-main). */
|
|
645
|
+
.ds-247420 .app-main [id] { scroll-margin-top: var(--space-4); }
|
|
646
|
+
/* Full-height route children fill the region instead of scrolling the page. */
|
|
616
647
|
.ds-247420 .app-main > .chat,
|
|
617
648
|
.ds-247420 .app-main > .chat-area,
|
|
618
649
|
.ds-247420 .app-main > .ds-file-stage,
|
|
619
|
-
.ds-247420 .app-main > .grow { flex
|
|
650
|
+
.ds-247420 .app-main > .grow { flex: 1 1 auto; min-height: 0; }
|
|
620
651
|
.ds-247420 .app-main.narrow { max-width: var(--measure-narrow); margin: 0 auto; }
|
|
621
652
|
|
|
622
653
|
@media (min-width: 1400px) {
|
|
@@ -750,9 +781,11 @@
|
|
|
750
781
|
Panel — soft tonal container, no border decoration
|
|
751
782
|
============================================================ */
|
|
752
783
|
.ds-247420 .panel {
|
|
753
|
-
background: var(--bg);
|
|
784
|
+
background: var(--panel-1, var(--bg-2));
|
|
754
785
|
border-radius: var(--r-3);
|
|
755
786
|
margin: 0 0 var(--space-5);
|
|
787
|
+
padding: var(--space-3);
|
|
788
|
+
box-shadow: var(--panel-shadow);
|
|
756
789
|
position: relative;
|
|
757
790
|
}
|
|
758
791
|
.ds-247420 .panel.panel-inline { background: var(--bg-2); padding: var(--space-3) var(--space-3); }
|
|
@@ -1751,7 +1784,6 @@
|
|
|
1751
1784
|
.ds-247420 .chat {
|
|
1752
1785
|
display: flex; flex-direction: column;
|
|
1753
1786
|
flex: 1; min-height: 0; gap: var(--space-3);
|
|
1754
|
-
padding-bottom: calc(var(--app-status-h, 42px) + var(--space-2));
|
|
1755
1787
|
}
|
|
1756
1788
|
.ds-247420 .chat-head {
|
|
1757
1789
|
display: flex; align-items: baseline; gap: 8px;
|
|
@@ -1762,6 +1794,7 @@
|
|
|
1762
1794
|
margin-bottom: var(--space-2);
|
|
1763
1795
|
}
|
|
1764
1796
|
.ds-247420 .chat-head .dot { width: 8px; height: 8px; border-radius: 50%; background: var(--accent); flex-shrink: 0; }
|
|
1797
|
+
.ds-247420 .chat-head .ds-chat-title,
|
|
1765
1798
|
.ds-247420 .chat-head > span:nth-child(2) {
|
|
1766
1799
|
font-family: var(--ff-body); font-size: var(--fs-h4);
|
|
1767
1800
|
font-weight: 600; color: var(--fg);
|
|
@@ -1775,21 +1808,21 @@
|
|
|
1775
1808
|
flex: 1; min-height: 0; overflow-y: auto;
|
|
1776
1809
|
padding: var(--space-2) 0;
|
|
1777
1810
|
scrollbar-width: thin; scrollbar-color: var(--bg-3) transparent;
|
|
1778
|
-
|
|
1811
|
+
}
|
|
1812
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
1813
|
+
.ds-247420 .chat-thread { scroll-behavior: smooth; }
|
|
1779
1814
|
}
|
|
1780
1815
|
.ds-247420 .chat-thread::-webkit-scrollbar { width: 8px; }
|
|
1781
1816
|
.ds-247420 .chat-thread::-webkit-scrollbar-thumb { background: var(--bg-3); border-radius: 4px; }
|
|
1782
|
-
.ds-247420 .chat-
|
|
1783
|
-
|
|
1784
|
-
|
|
1817
|
+
.ds-247420 .chat-empty {
|
|
1818
|
+
margin: auto;
|
|
1819
|
+
text-align: center;
|
|
1785
1820
|
color: var(--fg-3);
|
|
1786
1821
|
font-family: var(--ff-mono);
|
|
1787
|
-
font-size: var(--fs-sm);
|
|
1788
|
-
text-align: center;
|
|
1789
|
-
margin: auto;
|
|
1790
|
-
opacity: 0.6;
|
|
1791
1822
|
pointer-events: none;
|
|
1792
1823
|
}
|
|
1824
|
+
.ds-247420 .chat-empty-title { font-size: var(--fs-sm); margin: 0 0 var(--space-1); }
|
|
1825
|
+
.ds-247420 .chat-empty-sub { font-size: var(--fs-tiny); margin: 0; opacity: .7; }
|
|
1793
1826
|
|
|
1794
1827
|
.ds-247420 .chat-msg { display: flex; gap: 12px; align-items: flex-start; padding: 6px 0; position: relative; min-width: 0; }
|
|
1795
1828
|
.ds-247420 .chat-msg.you { flex-direction: row-reverse; }
|
|
@@ -1823,10 +1856,10 @@
|
|
|
1823
1856
|
|
|
1824
1857
|
.ds-247420 .chat-bubble {
|
|
1825
1858
|
padding: 10px 14px; background: var(--bg-2); color: var(--fg);
|
|
1826
|
-
|
|
1859
|
+
max-width: 100%;
|
|
1860
|
+
border-radius: var(--r-2); line-height: 1.55;
|
|
1827
1861
|
word-wrap: break-word; overflow-wrap: anywhere;
|
|
1828
1862
|
font-size: var(--fs-sm);
|
|
1829
|
-
max-width: clamp(220px, min(75vw, 28em), 480px);
|
|
1830
1863
|
min-width: 0;
|
|
1831
1864
|
transition: transform 0.12s ease, box-shadow 0.12s ease;
|
|
1832
1865
|
}
|
|
@@ -2110,27 +2143,34 @@
|
|
|
2110
2143
|
box-shadow: 0 0 0 2px color-mix(in oklab, var(--accent) 20%, transparent);
|
|
2111
2144
|
outline: none;
|
|
2112
2145
|
}
|
|
2113
|
-
.ds-247420 .chat-composer .send
|
|
2114
|
-
.ds-247420 .chat-composer button {
|
|
2146
|
+
.ds-247420 .chat-composer .send {
|
|
2115
2147
|
width: 44px; height: 44px; border-radius: 50%;
|
|
2116
2148
|
background: var(--accent); color: var(--accent-fg);
|
|
2117
|
-
border: 0; cursor: pointer;
|
|
2149
|
+
border: 0; cursor: pointer;
|
|
2118
2150
|
display: inline-flex; align-items: center; justify-content: center;
|
|
2119
|
-
flex-shrink: 0;
|
|
2151
|
+
flex-shrink: 0;
|
|
2120
2152
|
transition: background var(--dur-snap, .15s) var(--ease, ease), transform .1s ease;
|
|
2121
|
-
will-change: transform; contain: layout style paint;
|
|
2122
2153
|
}
|
|
2123
|
-
.ds-247420 .chat-composer .send:
|
|
2124
|
-
|
|
2125
|
-
|
|
2126
|
-
.ds-247420 .
|
|
2154
|
+
.ds-247420 .chat-composer .send:disabled { opacity: .5; cursor: not-allowed; }
|
|
2155
|
+
/* Ghost icon buttons in the toolbar (attach / emoji / more) — NOT the round
|
|
2156
|
+
accent send button. */
|
|
2157
|
+
.ds-247420 .composer-btn {
|
|
2158
|
+
width: 40px; height: 40px; border-radius: 50%;
|
|
2159
|
+
background: transparent; color: var(--fg-3);
|
|
2160
|
+
border: 0; cursor: pointer;
|
|
2161
|
+
display: inline-flex; align-items: center; justify-content: center;
|
|
2162
|
+
flex-shrink: 0;
|
|
2163
|
+
transition: background var(--dur-snap, .15s) var(--ease, ease), color var(--dur-snap, .15s) var(--ease, ease);
|
|
2164
|
+
}
|
|
2165
|
+
.ds-247420 .composer-btn:hover { background: color-mix(in oklab, var(--fg) 8%, transparent); color: var(--fg); }
|
|
2166
|
+
.ds-247420 .chat-composer .send:hover { transform: scale(1.04); }
|
|
2167
|
+
.ds-247420 .chat-composer .send:active { transform: scale(0.96); }
|
|
2127
2168
|
.ds-247420 .chat-composer .send:focus-visible,
|
|
2128
|
-
.ds-247420 .
|
|
2169
|
+
.ds-247420 .composer-btn:focus-visible {
|
|
2129
2170
|
outline: 2px solid var(--accent);
|
|
2130
2171
|
outline-offset: 2px;
|
|
2131
2172
|
}
|
|
2132
|
-
.ds-247420 .chat-composer .send:disabled
|
|
2133
|
-
.ds-247420 .chat-composer button:disabled {
|
|
2173
|
+
.ds-247420 .chat-composer .send:disabled {
|
|
2134
2174
|
background: var(--bg-3); color: var(--fg-3); cursor: not-allowed; transform: none;
|
|
2135
2175
|
}
|
|
2136
2176
|
|
|
@@ -2271,10 +2311,14 @@
|
|
|
2271
2311
|
transform: scale(0.98);
|
|
2272
2312
|
}
|
|
2273
2313
|
|
|
2274
|
-
/* Enhanced hover transitions
|
|
2314
|
+
/* Enhanced hover transitions — transition only the properties that actually
|
|
2315
|
+
change (not `all`, which animates layout and is a perf trap), and drop the
|
|
2316
|
+
blanket `will-change` (it forces a permanent compositor layer per element). */
|
|
2275
2317
|
.ds-247420 .btn, .ds-247420 .btn-primary, .ds-247420 .btn-ghost, .ds-247420 button, .ds-247420 a.row, .ds-247420 .row, .ds-247420 .chip, .ds-247420[role="button"], .ds-247420 input[type="checkbox"], .ds-247420 input[type="radio"] {
|
|
2276
|
-
transition:
|
|
2277
|
-
|
|
2318
|
+
transition: background-color var(--dur-snap) var(--ease),
|
|
2319
|
+
color var(--dur-snap) var(--ease),
|
|
2320
|
+
box-shadow var(--dur-snap) var(--ease),
|
|
2321
|
+
transform var(--dur-snap) var(--ease);
|
|
2278
2322
|
}
|
|
2279
2323
|
|
|
2280
2324
|
/* Prevent double-tap zoom on buttons (iOS) */
|
|
@@ -2415,6 +2459,9 @@
|
|
|
2415
2459
|
.ds-247420 input[type="email"],
|
|
2416
2460
|
.ds-247420 input[type="password"],
|
|
2417
2461
|
.ds-247420 input[type="number"],
|
|
2462
|
+
.ds-247420 input[type="search"],
|
|
2463
|
+
.ds-247420 input[type="url"],
|
|
2464
|
+
.ds-247420 input[type="tel"],
|
|
2418
2465
|
.ds-247420 textarea,
|
|
2419
2466
|
.ds-247420 select {
|
|
2420
2467
|
transition: background var(--dur-snap) var(--ease),
|
|
@@ -2426,10 +2473,74 @@
|
|
|
2426
2473
|
.ds-247420 input[type="email"]::placeholder,
|
|
2427
2474
|
.ds-247420 input[type="password"]::placeholder,
|
|
2428
2475
|
.ds-247420 input[type="number"]::placeholder,
|
|
2476
|
+
.ds-247420 input[type="search"]::placeholder,
|
|
2477
|
+
.ds-247420 input[type="url"]::placeholder,
|
|
2429
2478
|
.ds-247420 textarea::placeholder {
|
|
2430
2479
|
color: var(--fg-3);
|
|
2431
2480
|
}
|
|
2432
2481
|
|
|
2482
|
+
/* ── Field controls: themed base for TextField / Select / SearchInput ──
|
|
2483
|
+
Root fix: previously only `transition` was set, so themed apps got
|
|
2484
|
+
browser-default white boxes in dark mode and labels collided with inputs
|
|
2485
|
+
because `.ds-field` had no layout. */
|
|
2486
|
+
.ds-247420 .ds-field {
|
|
2487
|
+
display: flex;
|
|
2488
|
+
flex-direction: column;
|
|
2489
|
+
gap: var(--space-1, 6px);
|
|
2490
|
+
align-items: stretch;
|
|
2491
|
+
width: 100%;
|
|
2492
|
+
}
|
|
2493
|
+
.ds-247420 .ds-field-label {
|
|
2494
|
+
font-size: var(--fs-sm, 14px);
|
|
2495
|
+
color: var(--fg-2);
|
|
2496
|
+
line-height: 1.3;
|
|
2497
|
+
}
|
|
2498
|
+
.ds-247420 .ds-field-hint {
|
|
2499
|
+
font-size: var(--fs-tiny, 13px);
|
|
2500
|
+
color: var(--fg-3);
|
|
2501
|
+
line-height: 1.35;
|
|
2502
|
+
}
|
|
2503
|
+
.ds-247420 .ds-field-count {
|
|
2504
|
+
font-size: var(--fs-tiny, 13px);
|
|
2505
|
+
color: var(--fg-3);
|
|
2506
|
+
align-self: flex-end;
|
|
2507
|
+
}
|
|
2508
|
+
|
|
2509
|
+
.ds-247420 .ds-field input,
|
|
2510
|
+
.ds-247420 .ds-field textarea,
|
|
2511
|
+
.ds-247420 .ds-field .ds-select,
|
|
2512
|
+
.ds-247420 .ds-search-input {
|
|
2513
|
+
width: 100%;
|
|
2514
|
+
box-sizing: border-box;
|
|
2515
|
+
font: inherit;
|
|
2516
|
+
color: var(--fg);
|
|
2517
|
+
background: var(--bg-2);
|
|
2518
|
+
border: 0;
|
|
2519
|
+
box-shadow: inset 0 0 0 var(--bw-hair, 1px) var(--rule);
|
|
2520
|
+
border-radius: var(--r-2, 10px);
|
|
2521
|
+
padding: 10px 14px;
|
|
2522
|
+
}
|
|
2523
|
+
.ds-247420 .ds-field textarea { min-height: calc(4 * 1.5em); resize: vertical; }
|
|
2524
|
+
.ds-247420 .ds-search-input::placeholder { color: var(--fg-3); }
|
|
2525
|
+
|
|
2526
|
+
.ds-247420 .ds-field input:focus-visible,
|
|
2527
|
+
.ds-247420 .ds-field textarea:focus-visible,
|
|
2528
|
+
.ds-247420 .ds-field .ds-select:focus-visible,
|
|
2529
|
+
.ds-247420 .ds-search-input:focus-visible {
|
|
2530
|
+
outline: none;
|
|
2531
|
+
box-shadow: inset 0 0 0 2px var(--accent);
|
|
2532
|
+
}
|
|
2533
|
+
.ds-247420 .ds-field input:disabled,
|
|
2534
|
+
.ds-247420 .ds-field textarea:disabled,
|
|
2535
|
+
.ds-247420 .ds-field .ds-select:disabled {
|
|
2536
|
+
opacity: .55;
|
|
2537
|
+
cursor: not-allowed;
|
|
2538
|
+
}
|
|
2539
|
+
.ds-247420 .ds-field input[aria-invalid="true"],
|
|
2540
|
+
.ds-247420 .ds-field textarea[aria-invalid="true"] {
|
|
2541
|
+
box-shadow: inset 0 0 0 var(--bw-hair, 1px) var(--flame, #d64545);
|
|
2542
|
+
}
|
|
2543
|
+
|
|
2433
2544
|
/* Clear button for text inputs */
|
|
2434
2545
|
.ds-247420 input[type="text"]:not(:placeholder-shown) + .input-clear,
|
|
2435
2546
|
.ds-247420 input[type="email"]:not(:placeholder-shown) + .input-clear,
|
|
@@ -2478,9 +2589,10 @@
|
|
|
2478
2589
|
}
|
|
2479
2590
|
.ds-247420 .skip-to-main:focus { top: 10px; }
|
|
2480
2591
|
|
|
2481
|
-
/* Reduced motion preferences
|
|
2592
|
+
/* Reduced motion preferences — scoped to the DS surface so it doesn't reach
|
|
2593
|
+
into and neutralize the host document's own motion. */
|
|
2482
2594
|
@media (prefers-reduced-motion: reduce) {
|
|
2483
|
-
.ds-247420 * {
|
|
2595
|
+
.ds-247420 *, .ds-247420 .app * {
|
|
2484
2596
|
animation-duration: 0.01ms !important;
|
|
2485
2597
|
animation-iteration-count: 1 !important;
|
|
2486
2598
|
transition-duration: 0.01ms !important;
|
|
@@ -2488,17 +2600,14 @@
|
|
|
2488
2600
|
}
|
|
2489
2601
|
|
|
2490
2602
|
/* ────────────────────────────────────────────────────────────
|
|
2491
|
-
Performance
|
|
2603
|
+
Performance
|
|
2492
2604
|
────────────────────────────────────────────────────────────── */
|
|
2493
2605
|
|
|
2494
|
-
/*
|
|
2495
|
-
|
|
2496
|
-
|
|
2497
|
-
|
|
2498
|
-
|
|
2499
|
-
/* Contain layout repaints on self-contained components */
|
|
2500
|
-
.ds-247420 .panel, .ds-247420 .row, .ds-247420 .chip, .ds-247420 .btn, .ds-247420 button {
|
|
2501
|
-
contain: layout style paint;
|
|
2606
|
+
/* Limit layout/style containment to self-contained components. `paint` is
|
|
2607
|
+
intentionally omitted — it clips focus rings, tooltips and dropdowns that
|
|
2608
|
+
emanate from a contained .row/.btn. */
|
|
2609
|
+
.ds-247420 .panel, .ds-247420 .row {
|
|
2610
|
+
contain: layout style;
|
|
2502
2611
|
}
|
|
2503
2612
|
|
|
2504
2613
|
/* ────────────────────────────────────────────────────────────
|
|
@@ -2507,11 +2616,13 @@
|
|
|
2507
2616
|
|
|
2508
2617
|
@media (hover: none) and (pointer: coarse) {
|
|
2509
2618
|
/* Mobile devices: larger touch targets, faster responses */
|
|
2510
|
-
.ds-247420 .btn, .ds-247420 .btn-primary, .ds-247420 .btn-ghost, .ds-247420 button, .ds-247420 a.row, .ds-247420[role="button"] {
|
|
2619
|
+
.ds-247420 .btn, .ds-247420 .btn-primary, .ds-247420 .btn-ghost, .ds-247420 button, .ds-247420 a.row, .ds-247420[role="button"], .ds-247420 .ds-icon-btn, .ds-247420 .composer-btn {
|
|
2511
2620
|
min-height: 48px;
|
|
2512
2621
|
min-width: 48px;
|
|
2513
2622
|
padding: 12px 20px;
|
|
2514
2623
|
}
|
|
2624
|
+
/* Icon buttons stay square — the padding bump above would distort them. */
|
|
2625
|
+
.ds-247420 .ds-icon-btn, .ds-247420 .composer-btn { padding: 0; }
|
|
2515
2626
|
|
|
2516
2627
|
/* Remove hover effects on touch devices (use active instead) */
|
|
2517
2628
|
.ds-247420 .btn:hover, .ds-247420 .btn-primary:hover, .ds-247420 .btn-ghost:hover {
|
|
@@ -2534,12 +2645,9 @@
|
|
|
2534
2645
|
Theme Transition Smoothness
|
|
2535
2646
|
────────────────────────────────────────────────────────────── */
|
|
2536
2647
|
|
|
2537
|
-
|
|
2538
|
-
|
|
2539
|
-
|
|
2540
|
-
}
|
|
2541
|
-
|
|
2542
|
-
.ds-247420 body {
|
|
2648
|
+
/* Scoped to the DS wrapper so the design system never reaches out and
|
|
2649
|
+
animates the host document's html/body. */
|
|
2650
|
+
.ds-247420, .ds-247420 .app {
|
|
2543
2651
|
transition: background-color var(--dur-base) var(--ease),
|
|
2544
2652
|
color var(--dur-base) var(--ease);
|
|
2545
2653
|
}
|
|
@@ -2810,12 +2918,19 @@
|
|
|
2810
2918
|
.ds-247420 .app-topbar .brand { margin-left: 44px; }
|
|
2811
2919
|
}
|
|
2812
2920
|
|
|
2813
|
-
/* Desktop:
|
|
2814
|
-
|
|
2921
|
+
/* Desktop: the app shell is exactly viewport-height and contains its own
|
|
2922
|
+
scroll, so only .app-main (and the side rail) scroll — never the page too.
|
|
2923
|
+
Pinning .app to 100dvh + overflow:hidden is what prevents the double
|
|
2924
|
+
scrollbar that a min-height:100vh shell + inner overflow:auto produces.
|
|
2925
|
+
.app-body fills the gap between topbar/crumb and status via flex:1 rather
|
|
2926
|
+
than a hand-computed calc() that drifts from the real chrome heights. */
|
|
2815
2927
|
@media (min-width: 901px) {
|
|
2816
|
-
.ds-247420 .app
|
|
2817
|
-
|
|
2818
|
-
.ds-247420 .
|
|
2928
|
+
.ds-247420 .app { height: 100dvh; min-height: 0; overflow: hidden; }
|
|
2929
|
+
/* Embedded shell (freddie WM window) fills its container, not the viewport. */
|
|
2930
|
+
.ds-247420 .fd-root .app { height: 100%; overflow: visible; }
|
|
2931
|
+
.ds-247420 .app-body { min-height: 0; flex: 1 1 auto; }
|
|
2932
|
+
.ds-247420 .app-side-shell { overflow-y: auto; min-height: 0; }
|
|
2933
|
+
.ds-247420 .app-main { overflow-y: auto; min-height: 0; }
|
|
2819
2934
|
}
|
|
2820
2935
|
|
|
2821
2936
|
/* Mobile (≤480) status bar compact; hide tail item */
|