anentrypoint-design 0.0.156 → 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 +141 -49
- package/colors_and_type.css +16 -7
- package/dist/247420.css +156 -54
- 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,17 +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; }
|
|
616
640
|
/* Reserve the scrollbar track so routes with/without overflow don't shift
|
|
617
641
|
the layout horizontally when the bar appears. */
|
|
618
642
|
.ds-247420 .app-main { scrollbar-gutter: stable; }
|
|
619
643
|
/* Jump-target anchors clear the inner-scroll top edge (no chrome overlap,
|
|
620
644
|
but a little breathing room when deep-linked within .app-main). */
|
|
621
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. */
|
|
622
647
|
.ds-247420 .app-main > .chat,
|
|
623
648
|
.ds-247420 .app-main > .chat-area,
|
|
624
649
|
.ds-247420 .app-main > .ds-file-stage,
|
|
625
|
-
.ds-247420 .app-main > .grow { flex
|
|
650
|
+
.ds-247420 .app-main > .grow { flex: 1 1 auto; min-height: 0; }
|
|
626
651
|
.ds-247420 .app-main.narrow { max-width: var(--measure-narrow); margin: 0 auto; }
|
|
627
652
|
|
|
628
653
|
@media (min-width: 1400px) {
|
|
@@ -756,9 +781,11 @@
|
|
|
756
781
|
Panel — soft tonal container, no border decoration
|
|
757
782
|
============================================================ */
|
|
758
783
|
.ds-247420 .panel {
|
|
759
|
-
background: var(--bg);
|
|
784
|
+
background: var(--panel-1, var(--bg-2));
|
|
760
785
|
border-radius: var(--r-3);
|
|
761
786
|
margin: 0 0 var(--space-5);
|
|
787
|
+
padding: var(--space-3);
|
|
788
|
+
box-shadow: var(--panel-shadow);
|
|
762
789
|
position: relative;
|
|
763
790
|
}
|
|
764
791
|
.ds-247420 .panel.panel-inline { background: var(--bg-2); padding: var(--space-3) var(--space-3); }
|
|
@@ -1757,7 +1784,6 @@
|
|
|
1757
1784
|
.ds-247420 .chat {
|
|
1758
1785
|
display: flex; flex-direction: column;
|
|
1759
1786
|
flex: 1; min-height: 0; gap: var(--space-3);
|
|
1760
|
-
padding-bottom: calc(var(--app-status-h, 42px) + var(--space-2));
|
|
1761
1787
|
}
|
|
1762
1788
|
.ds-247420 .chat-head {
|
|
1763
1789
|
display: flex; align-items: baseline; gap: 8px;
|
|
@@ -1768,6 +1794,7 @@
|
|
|
1768
1794
|
margin-bottom: var(--space-2);
|
|
1769
1795
|
}
|
|
1770
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,
|
|
1771
1798
|
.ds-247420 .chat-head > span:nth-child(2) {
|
|
1772
1799
|
font-family: var(--ff-body); font-size: var(--fs-h4);
|
|
1773
1800
|
font-weight: 600; color: var(--fg);
|
|
@@ -1781,21 +1808,21 @@
|
|
|
1781
1808
|
flex: 1; min-height: 0; overflow-y: auto;
|
|
1782
1809
|
padding: var(--space-2) 0;
|
|
1783
1810
|
scrollbar-width: thin; scrollbar-color: var(--bg-3) transparent;
|
|
1784
|
-
|
|
1811
|
+
}
|
|
1812
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
1813
|
+
.ds-247420 .chat-thread { scroll-behavior: smooth; }
|
|
1785
1814
|
}
|
|
1786
1815
|
.ds-247420 .chat-thread::-webkit-scrollbar { width: 8px; }
|
|
1787
1816
|
.ds-247420 .chat-thread::-webkit-scrollbar-thumb { background: var(--bg-3); border-radius: 4px; }
|
|
1788
|
-
.ds-247420 .chat-
|
|
1789
|
-
|
|
1790
|
-
|
|
1817
|
+
.ds-247420 .chat-empty {
|
|
1818
|
+
margin: auto;
|
|
1819
|
+
text-align: center;
|
|
1791
1820
|
color: var(--fg-3);
|
|
1792
1821
|
font-family: var(--ff-mono);
|
|
1793
|
-
font-size: var(--fs-sm);
|
|
1794
|
-
text-align: center;
|
|
1795
|
-
margin: auto;
|
|
1796
|
-
opacity: 0.6;
|
|
1797
1822
|
pointer-events: none;
|
|
1798
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; }
|
|
1799
1826
|
|
|
1800
1827
|
.ds-247420 .chat-msg { display: flex; gap: 12px; align-items: flex-start; padding: 6px 0; position: relative; min-width: 0; }
|
|
1801
1828
|
.ds-247420 .chat-msg.you { flex-direction: row-reverse; }
|
|
@@ -1829,10 +1856,10 @@
|
|
|
1829
1856
|
|
|
1830
1857
|
.ds-247420 .chat-bubble {
|
|
1831
1858
|
padding: 10px 14px; background: var(--bg-2); color: var(--fg);
|
|
1832
|
-
|
|
1859
|
+
max-width: 100%;
|
|
1860
|
+
border-radius: var(--r-2); line-height: 1.55;
|
|
1833
1861
|
word-wrap: break-word; overflow-wrap: anywhere;
|
|
1834
1862
|
font-size: var(--fs-sm);
|
|
1835
|
-
max-width: clamp(220px, min(75vw, 28em), 480px);
|
|
1836
1863
|
min-width: 0;
|
|
1837
1864
|
transition: transform 0.12s ease, box-shadow 0.12s ease;
|
|
1838
1865
|
}
|
|
@@ -2116,27 +2143,34 @@
|
|
|
2116
2143
|
box-shadow: 0 0 0 2px color-mix(in oklab, var(--accent) 20%, transparent);
|
|
2117
2144
|
outline: none;
|
|
2118
2145
|
}
|
|
2119
|
-
.ds-247420 .chat-composer .send
|
|
2120
|
-
.ds-247420 .chat-composer button {
|
|
2146
|
+
.ds-247420 .chat-composer .send {
|
|
2121
2147
|
width: 44px; height: 44px; border-radius: 50%;
|
|
2122
2148
|
background: var(--accent); color: var(--accent-fg);
|
|
2123
|
-
border: 0; cursor: pointer;
|
|
2149
|
+
border: 0; cursor: pointer;
|
|
2124
2150
|
display: inline-flex; align-items: center; justify-content: center;
|
|
2125
|
-
flex-shrink: 0;
|
|
2151
|
+
flex-shrink: 0;
|
|
2126
2152
|
transition: background var(--dur-snap, .15s) var(--ease, ease), transform .1s ease;
|
|
2127
|
-
will-change: transform; contain: layout style paint;
|
|
2128
2153
|
}
|
|
2129
|
-
.ds-247420 .chat-composer .send:
|
|
2130
|
-
|
|
2131
|
-
|
|
2132
|
-
.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); }
|
|
2133
2168
|
.ds-247420 .chat-composer .send:focus-visible,
|
|
2134
|
-
.ds-247420 .
|
|
2169
|
+
.ds-247420 .composer-btn:focus-visible {
|
|
2135
2170
|
outline: 2px solid var(--accent);
|
|
2136
2171
|
outline-offset: 2px;
|
|
2137
2172
|
}
|
|
2138
|
-
.ds-247420 .chat-composer .send:disabled
|
|
2139
|
-
.ds-247420 .chat-composer button:disabled {
|
|
2173
|
+
.ds-247420 .chat-composer .send:disabled {
|
|
2140
2174
|
background: var(--bg-3); color: var(--fg-3); cursor: not-allowed; transform: none;
|
|
2141
2175
|
}
|
|
2142
2176
|
|
|
@@ -2277,10 +2311,14 @@
|
|
|
2277
2311
|
transform: scale(0.98);
|
|
2278
2312
|
}
|
|
2279
2313
|
|
|
2280
|
-
/* 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). */
|
|
2281
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"] {
|
|
2282
|
-
transition:
|
|
2283
|
-
|
|
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);
|
|
2284
2322
|
}
|
|
2285
2323
|
|
|
2286
2324
|
/* Prevent double-tap zoom on buttons (iOS) */
|
|
@@ -2421,6 +2459,9 @@
|
|
|
2421
2459
|
.ds-247420 input[type="email"],
|
|
2422
2460
|
.ds-247420 input[type="password"],
|
|
2423
2461
|
.ds-247420 input[type="number"],
|
|
2462
|
+
.ds-247420 input[type="search"],
|
|
2463
|
+
.ds-247420 input[type="url"],
|
|
2464
|
+
.ds-247420 input[type="tel"],
|
|
2424
2465
|
.ds-247420 textarea,
|
|
2425
2466
|
.ds-247420 select {
|
|
2426
2467
|
transition: background var(--dur-snap) var(--ease),
|
|
@@ -2432,10 +2473,74 @@
|
|
|
2432
2473
|
.ds-247420 input[type="email"]::placeholder,
|
|
2433
2474
|
.ds-247420 input[type="password"]::placeholder,
|
|
2434
2475
|
.ds-247420 input[type="number"]::placeholder,
|
|
2476
|
+
.ds-247420 input[type="search"]::placeholder,
|
|
2477
|
+
.ds-247420 input[type="url"]::placeholder,
|
|
2435
2478
|
.ds-247420 textarea::placeholder {
|
|
2436
2479
|
color: var(--fg-3);
|
|
2437
2480
|
}
|
|
2438
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
|
+
|
|
2439
2544
|
/* Clear button for text inputs */
|
|
2440
2545
|
.ds-247420 input[type="text"]:not(:placeholder-shown) + .input-clear,
|
|
2441
2546
|
.ds-247420 input[type="email"]:not(:placeholder-shown) + .input-clear,
|
|
@@ -2484,9 +2589,10 @@
|
|
|
2484
2589
|
}
|
|
2485
2590
|
.ds-247420 .skip-to-main:focus { top: 10px; }
|
|
2486
2591
|
|
|
2487
|
-
/* 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. */
|
|
2488
2594
|
@media (prefers-reduced-motion: reduce) {
|
|
2489
|
-
.ds-247420 * {
|
|
2595
|
+
.ds-247420 *, .ds-247420 .app * {
|
|
2490
2596
|
animation-duration: 0.01ms !important;
|
|
2491
2597
|
animation-iteration-count: 1 !important;
|
|
2492
2598
|
transition-duration: 0.01ms !important;
|
|
@@ -2494,17 +2600,14 @@
|
|
|
2494
2600
|
}
|
|
2495
2601
|
|
|
2496
2602
|
/* ────────────────────────────────────────────────────────────
|
|
2497
|
-
Performance
|
|
2603
|
+
Performance
|
|
2498
2604
|
────────────────────────────────────────────────────────────── */
|
|
2499
2605
|
|
|
2500
|
-
/*
|
|
2501
|
-
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
|
-
|
|
2505
|
-
/* Contain layout repaints on self-contained components */
|
|
2506
|
-
.ds-247420 .panel, .ds-247420 .row, .ds-247420 .chip, .ds-247420 .btn, .ds-247420 button {
|
|
2507
|
-
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;
|
|
2508
2611
|
}
|
|
2509
2612
|
|
|
2510
2613
|
/* ────────────────────────────────────────────────────────────
|
|
@@ -2513,11 +2616,13 @@
|
|
|
2513
2616
|
|
|
2514
2617
|
@media (hover: none) and (pointer: coarse) {
|
|
2515
2618
|
/* Mobile devices: larger touch targets, faster responses */
|
|
2516
|
-
.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 {
|
|
2517
2620
|
min-height: 48px;
|
|
2518
2621
|
min-width: 48px;
|
|
2519
2622
|
padding: 12px 20px;
|
|
2520
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; }
|
|
2521
2626
|
|
|
2522
2627
|
/* Remove hover effects on touch devices (use active instead) */
|
|
2523
2628
|
.ds-247420 .btn:hover, .ds-247420 .btn-primary:hover, .ds-247420 .btn-ghost:hover {
|
|
@@ -2540,12 +2645,9 @@
|
|
|
2540
2645
|
Theme Transition Smoothness
|
|
2541
2646
|
────────────────────────────────────────────────────────────── */
|
|
2542
2647
|
|
|
2543
|
-
|
|
2544
|
-
|
|
2545
|
-
|
|
2546
|
-
}
|
|
2547
|
-
|
|
2548
|
-
.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 {
|
|
2549
2651
|
transition: background-color var(--dur-base) var(--ease),
|
|
2550
2652
|
color var(--dur-base) var(--ease);
|
|
2551
2653
|
}
|