anentrypoint-design 0.0.156 → 0.0.158
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 -55
- package/colors_and_type.css +18 -8
- package/dist/247420.css +176 -61
- package/dist/247420.js +12 -12
- package/package.json +1 -1
- package/src/components/chat.js +10 -4
- package/src/components/content.js +6 -3
- package/src/components/shell.js +57 -39
- 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 */
|
|
@@ -33,6 +33,7 @@
|
|
|
33
33
|
--mascot: #E84B8A;
|
|
34
34
|
--mascot-2: #FF3CA7;
|
|
35
35
|
--mascot-tint: #F5D2DF;
|
|
36
|
+
--mascot-deep: #B81F63;
|
|
36
37
|
|
|
37
38
|
/* Signals */
|
|
38
39
|
--sun: #F5C344;
|
|
@@ -53,7 +54,7 @@
|
|
|
53
54
|
|
|
54
55
|
--accent: var(--green);
|
|
55
56
|
--accent-fg: var(--paper);
|
|
56
|
-
--accent-tint: color-mix(in oklab, var(--accent)
|
|
57
|
+
--accent-tint: color-mix(in oklab, var(--accent) 26%, var(--bg));
|
|
57
58
|
|
|
58
59
|
--panel-bg: var(--bg);
|
|
59
60
|
--panel-bg-2: var(--bg-2);
|
|
@@ -68,12 +69,11 @@
|
|
|
68
69
|
--panel-accent-2: var(--accent-bright, var(--accent));
|
|
69
70
|
--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
71
|
|
|
71
|
-
/* Type —
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
--ff-
|
|
75
|
-
--ff-
|
|
76
|
-
--ff-body: 'Space Grotesk', system-ui, sans-serif;
|
|
72
|
+
/* Type — Inter for everything non-mono. The display/narrow aliases stay so
|
|
73
|
+
consumers that reference them keep working; they resolve to the body font. */
|
|
74
|
+
--ff-display: 'Inter', system-ui, sans-serif;
|
|
75
|
+
--ff-narrow: 'Inter', system-ui, sans-serif;
|
|
76
|
+
--ff-body: 'Inter', system-ui, sans-serif;
|
|
77
77
|
--ff-mono: 'JetBrains Mono', ui-monospace, Menlo, Consolas, monospace;
|
|
78
78
|
|
|
79
79
|
--fs-micro: 12px;
|
|
@@ -90,6 +90,15 @@
|
|
|
90
90
|
--fs-hero: clamp(42px, 7cqi, 96px);
|
|
91
91
|
--fs-mega: clamp(56px, 11cqi, 168px);
|
|
92
92
|
|
|
93
|
+
/* App/chrome typescale: the default heading scale above is tuned for
|
|
94
|
+
marketing/hero layouts (h1 up to 64px). Application chrome — page titles,
|
|
95
|
+
panel headers — needs a compact ceiling so a PageHeader title doesn't
|
|
96
|
+
dwarf the content. Opt in with `data-typescale="app"` on a container. */
|
|
97
|
+
--fs-h1-app: clamp(22px, 2.4cqi, 30px);
|
|
98
|
+
--fs-h2-app: clamp(19px, 2cqi, 24px);
|
|
99
|
+
--fs-h3-app: clamp(17px, 1.8cqi, 20px);
|
|
100
|
+
--fs-h4-app: clamp(15px, 1.6cqi, 17px);
|
|
101
|
+
|
|
93
102
|
--lh-tight: 1.05;
|
|
94
103
|
--lh-snug: 1.2;
|
|
95
104
|
--lh-base: 1.55;
|
|
@@ -195,6 +204,7 @@
|
|
|
195
204
|
|
|
196
205
|
.ds-247420[data-theme="ink"],
|
|
197
206
|
.ds-247420[data-theme="dark"] {
|
|
207
|
+
color-scheme: dark;
|
|
198
208
|
--bg: var(--ink);
|
|
199
209
|
--bg-2: var(--ink-2);
|
|
200
210
|
--bg-3: #464650;
|
|
@@ -381,6 +391,12 @@
|
|
|
381
391
|
.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
392
|
.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
393
|
|
|
394
|
+
/* App/chrome typescale opt-in: compact heading ceiling for application UIs. */
|
|
395
|
+
.ds-247420[data-typescale="app"] h1, .ds-247420[data-typescale="app"] .t-h1 { font-size: var(--fs-h1-app); line-height: 1.15; }
|
|
396
|
+
.ds-247420[data-typescale="app"] h2, .ds-247420[data-typescale="app"] .t-h2 { font-size: var(--fs-h2-app); }
|
|
397
|
+
.ds-247420[data-typescale="app"] h3, .ds-247420[data-typescale="app"] .t-h3 { font-size: var(--fs-h3-app); }
|
|
398
|
+
.ds-247420[data-typescale="app"] h4, .ds-247420[data-typescale="app"] .t-h4 { font-size: var(--fs-h4-app); }
|
|
399
|
+
|
|
384
400
|
.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
401
|
.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
402
|
|
|
@@ -471,6 +487,11 @@
|
|
|
471
487
|
.ds-247420 .app {
|
|
472
488
|
display: flex; flex-direction: column;
|
|
473
489
|
min-height: 100vh;
|
|
490
|
+
/* Definite height so the flex column resolves height:100% for descendants
|
|
491
|
+
(e.g. a full-height chat) at every breakpoint, not just where a desktop
|
|
492
|
+
media override happened to set explicit heights. dvh tracks mobile chrome. */
|
|
493
|
+
min-height: 100dvh;
|
|
494
|
+
height: 100dvh;
|
|
474
495
|
background: var(--bg);
|
|
475
496
|
color: var(--fg);
|
|
476
497
|
/* Notched-device safe area padding (no-op on devices without notches) */
|
|
@@ -612,17 +633,22 @@
|
|
|
612
633
|
align-self: stretch;
|
|
613
634
|
height: 100%;
|
|
614
635
|
}
|
|
615
|
-
.ds-247420 .app-main > * { min-height: 0;
|
|
636
|
+
.ds-247420 .app-main > * { min-height: 0; }
|
|
637
|
+
/* The main region scrolls its own overflow at every breakpoint (previously
|
|
638
|
+
only ≥901px), so a fixed-height .app never clips route content and inner
|
|
639
|
+
panels don't fight the page scroll. */
|
|
640
|
+
.ds-247420 .app-main { overflow-y: auto; }
|
|
616
641
|
/* Reserve the scrollbar track so routes with/without overflow don't shift
|
|
617
642
|
the layout horizontally when the bar appears. */
|
|
618
643
|
.ds-247420 .app-main { scrollbar-gutter: stable; }
|
|
619
644
|
/* Jump-target anchors clear the inner-scroll top edge (no chrome overlap,
|
|
620
645
|
but a little breathing room when deep-linked within .app-main). */
|
|
621
646
|
.ds-247420 .app-main [id] { scroll-margin-top: var(--space-4); }
|
|
647
|
+
/* Full-height route children fill the region instead of scrolling the page. */
|
|
622
648
|
.ds-247420 .app-main > .chat,
|
|
623
649
|
.ds-247420 .app-main > .chat-area,
|
|
624
650
|
.ds-247420 .app-main > .ds-file-stage,
|
|
625
|
-
.ds-247420 .app-main > .grow { flex
|
|
651
|
+
.ds-247420 .app-main > .grow { flex: 1 1 auto; min-height: 0; }
|
|
626
652
|
.ds-247420 .app-main.narrow { max-width: var(--measure-narrow); margin: 0 auto; }
|
|
627
653
|
|
|
628
654
|
@media (min-width: 1400px) {
|
|
@@ -756,9 +782,11 @@
|
|
|
756
782
|
Panel — soft tonal container, no border decoration
|
|
757
783
|
============================================================ */
|
|
758
784
|
.ds-247420 .panel {
|
|
759
|
-
background: var(--bg);
|
|
785
|
+
background: var(--panel-1, var(--bg-2));
|
|
760
786
|
border-radius: var(--r-3);
|
|
761
787
|
margin: 0 0 var(--space-5);
|
|
788
|
+
padding: var(--space-3);
|
|
789
|
+
box-shadow: var(--panel-shadow);
|
|
762
790
|
position: relative;
|
|
763
791
|
}
|
|
764
792
|
.ds-247420 .panel.panel-inline { background: var(--bg-2); padding: var(--space-3) var(--space-3); }
|
|
@@ -1052,9 +1080,8 @@
|
|
|
1052
1080
|
Mobile Portrait Breakpoint (480px and below)
|
|
1053
1081
|
────────────────────────────────────────────────────────────────────── */
|
|
1054
1082
|
@media (max-width: 480px) {
|
|
1055
|
-
/* App Layout
|
|
1056
|
-
|
|
1057
|
-
.ds-247420 .app-body.no-side { grid-template-columns: 1fr; }
|
|
1083
|
+
/* App Layout: single-column + drawer is handled once in the ≤900px block;
|
|
1084
|
+
no need to re-declare grid-template-columns here (was a redundant !important). */
|
|
1058
1085
|
|
|
1059
1086
|
/* Topbar Navigation */
|
|
1060
1087
|
.ds-247420 .app-topbar {
|
|
@@ -1065,9 +1092,16 @@
|
|
|
1065
1092
|
padding: 12px 10px;
|
|
1066
1093
|
min-height: 44px;
|
|
1067
1094
|
}
|
|
1095
|
+
/* Keep primary nav reachable on small screens (apps without a sidebar have
|
|
1096
|
+
no other entry point). Compact it and let it scroll horizontally rather
|
|
1097
|
+
than hiding it entirely. */
|
|
1068
1098
|
.ds-247420 .app-topbar nav {
|
|
1069
|
-
display:
|
|
1099
|
+
display: flex; gap: 2px;
|
|
1100
|
+
overflow-x: auto; scrollbar-width: none; -webkit-overflow-scrolling: touch;
|
|
1101
|
+
max-width: 60vw;
|
|
1070
1102
|
}
|
|
1103
|
+
.ds-247420 .app-topbar nav::-webkit-scrollbar { display: none; }
|
|
1104
|
+
.ds-247420 .app-topbar nav a { padding: 10px 8px; white-space: nowrap; }
|
|
1071
1105
|
.ds-247420 .brand { font-size: var(--fs-tiny); font-weight: 600; }
|
|
1072
1106
|
|
|
1073
1107
|
/* Search */
|
|
@@ -1757,7 +1791,6 @@
|
|
|
1757
1791
|
.ds-247420 .chat {
|
|
1758
1792
|
display: flex; flex-direction: column;
|
|
1759
1793
|
flex: 1; min-height: 0; gap: var(--space-3);
|
|
1760
|
-
padding-bottom: calc(var(--app-status-h, 42px) + var(--space-2));
|
|
1761
1794
|
}
|
|
1762
1795
|
.ds-247420 .chat-head {
|
|
1763
1796
|
display: flex; align-items: baseline; gap: 8px;
|
|
@@ -1768,6 +1801,7 @@
|
|
|
1768
1801
|
margin-bottom: var(--space-2);
|
|
1769
1802
|
}
|
|
1770
1803
|
.ds-247420 .chat-head .dot { width: 8px; height: 8px; border-radius: 50%; background: var(--accent); flex-shrink: 0; }
|
|
1804
|
+
.ds-247420 .chat-head .ds-chat-title,
|
|
1771
1805
|
.ds-247420 .chat-head > span:nth-child(2) {
|
|
1772
1806
|
font-family: var(--ff-body); font-size: var(--fs-h4);
|
|
1773
1807
|
font-weight: 600; color: var(--fg);
|
|
@@ -1781,21 +1815,21 @@
|
|
|
1781
1815
|
flex: 1; min-height: 0; overflow-y: auto;
|
|
1782
1816
|
padding: var(--space-2) 0;
|
|
1783
1817
|
scrollbar-width: thin; scrollbar-color: var(--bg-3) transparent;
|
|
1784
|
-
|
|
1818
|
+
}
|
|
1819
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
1820
|
+
.ds-247420 .chat-thread { scroll-behavior: smooth; }
|
|
1785
1821
|
}
|
|
1786
1822
|
.ds-247420 .chat-thread::-webkit-scrollbar { width: 8px; }
|
|
1787
1823
|
.ds-247420 .chat-thread::-webkit-scrollbar-thumb { background: var(--bg-3); border-radius: 4px; }
|
|
1788
|
-
.ds-247420 .chat-
|
|
1789
|
-
|
|
1790
|
-
|
|
1824
|
+
.ds-247420 .chat-empty {
|
|
1825
|
+
margin: auto;
|
|
1826
|
+
text-align: center;
|
|
1791
1827
|
color: var(--fg-3);
|
|
1792
1828
|
font-family: var(--ff-mono);
|
|
1793
|
-
font-size: var(--fs-sm);
|
|
1794
|
-
text-align: center;
|
|
1795
|
-
margin: auto;
|
|
1796
|
-
opacity: 0.6;
|
|
1797
1829
|
pointer-events: none;
|
|
1798
1830
|
}
|
|
1831
|
+
.ds-247420 .chat-empty-title { font-size: var(--fs-sm); margin: 0 0 var(--space-1); }
|
|
1832
|
+
.ds-247420 .chat-empty-sub { font-size: var(--fs-tiny); margin: 0; opacity: .7; }
|
|
1799
1833
|
|
|
1800
1834
|
.ds-247420 .chat-msg { display: flex; gap: 12px; align-items: flex-start; padding: 6px 0; position: relative; min-width: 0; }
|
|
1801
1835
|
.ds-247420 .chat-msg.you { flex-direction: row-reverse; }
|
|
@@ -1829,10 +1863,10 @@
|
|
|
1829
1863
|
|
|
1830
1864
|
.ds-247420 .chat-bubble {
|
|
1831
1865
|
padding: 10px 14px; background: var(--bg-2); color: var(--fg);
|
|
1832
|
-
|
|
1866
|
+
max-width: 100%;
|
|
1867
|
+
border-radius: var(--r-2); line-height: 1.55;
|
|
1833
1868
|
word-wrap: break-word; overflow-wrap: anywhere;
|
|
1834
1869
|
font-size: var(--fs-sm);
|
|
1835
|
-
max-width: clamp(220px, min(75vw, 28em), 480px);
|
|
1836
1870
|
min-width: 0;
|
|
1837
1871
|
transition: transform 0.12s ease, box-shadow 0.12s ease;
|
|
1838
1872
|
}
|
|
@@ -2116,27 +2150,34 @@
|
|
|
2116
2150
|
box-shadow: 0 0 0 2px color-mix(in oklab, var(--accent) 20%, transparent);
|
|
2117
2151
|
outline: none;
|
|
2118
2152
|
}
|
|
2119
|
-
.ds-247420 .chat-composer .send
|
|
2120
|
-
.ds-247420 .chat-composer button {
|
|
2153
|
+
.ds-247420 .chat-composer .send {
|
|
2121
2154
|
width: 44px; height: 44px; border-radius: 50%;
|
|
2122
2155
|
background: var(--accent); color: var(--accent-fg);
|
|
2123
|
-
border: 0; cursor: pointer;
|
|
2156
|
+
border: 0; cursor: pointer;
|
|
2124
2157
|
display: inline-flex; align-items: center; justify-content: center;
|
|
2125
|
-
flex-shrink: 0;
|
|
2158
|
+
flex-shrink: 0;
|
|
2126
2159
|
transition: background var(--dur-snap, .15s) var(--ease, ease), transform .1s ease;
|
|
2127
|
-
will-change: transform; contain: layout style paint;
|
|
2128
2160
|
}
|
|
2129
|
-
.ds-247420 .chat-composer .send:
|
|
2130
|
-
|
|
2131
|
-
|
|
2132
|
-
.ds-247420 .
|
|
2161
|
+
.ds-247420 .chat-composer .send:disabled { opacity: .5; cursor: not-allowed; }
|
|
2162
|
+
/* Ghost icon buttons in the toolbar (attach / emoji / more) — NOT the round
|
|
2163
|
+
accent send button. */
|
|
2164
|
+
.ds-247420 .composer-btn {
|
|
2165
|
+
width: 40px; height: 40px; border-radius: 50%;
|
|
2166
|
+
background: transparent; color: var(--fg-3);
|
|
2167
|
+
border: 0; cursor: pointer;
|
|
2168
|
+
display: inline-flex; align-items: center; justify-content: center;
|
|
2169
|
+
flex-shrink: 0;
|
|
2170
|
+
transition: background var(--dur-snap, .15s) var(--ease, ease), color var(--dur-snap, .15s) var(--ease, ease);
|
|
2171
|
+
}
|
|
2172
|
+
.ds-247420 .composer-btn:hover { background: color-mix(in oklab, var(--fg) 8%, transparent); color: var(--fg); }
|
|
2173
|
+
.ds-247420 .chat-composer .send:hover { transform: scale(1.04); }
|
|
2174
|
+
.ds-247420 .chat-composer .send:active { transform: scale(0.96); }
|
|
2133
2175
|
.ds-247420 .chat-composer .send:focus-visible,
|
|
2134
|
-
.ds-247420 .
|
|
2176
|
+
.ds-247420 .composer-btn:focus-visible {
|
|
2135
2177
|
outline: 2px solid var(--accent);
|
|
2136
2178
|
outline-offset: 2px;
|
|
2137
2179
|
}
|
|
2138
|
-
.ds-247420 .chat-composer .send:disabled
|
|
2139
|
-
.ds-247420 .chat-composer button:disabled {
|
|
2180
|
+
.ds-247420 .chat-composer .send:disabled {
|
|
2140
2181
|
background: var(--bg-3); color: var(--fg-3); cursor: not-allowed; transform: none;
|
|
2141
2182
|
}
|
|
2142
2183
|
|
|
@@ -2148,7 +2189,8 @@
|
|
|
2148
2189
|
border-radius: 50%; flex-shrink: 0;
|
|
2149
2190
|
}
|
|
2150
2191
|
.ds-247420 .aicat-meta { display: flex; flex-direction: column; font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); }
|
|
2151
|
-
.ds-247420 .aicat-meta .name { color: var(--mascot); font-weight: 600; }
|
|
2192
|
+
.ds-247420 .aicat-meta .name { color: var(--mascot-deep, var(--mascot)); font-weight: 600; }
|
|
2193
|
+
.ds-247420[data-theme="dark"] .aicat-meta .name, .ds-247420[data-theme="ink"] .aicat-meta .name { color: var(--mascot); }
|
|
2152
2194
|
|
|
2153
2195
|
/* ============================================================
|
|
2154
2196
|
Sidebar polish: hide zero-count badges; tonal active state;
|
|
@@ -2277,10 +2319,14 @@
|
|
|
2277
2319
|
transform: scale(0.98);
|
|
2278
2320
|
}
|
|
2279
2321
|
|
|
2280
|
-
/* Enhanced hover transitions
|
|
2322
|
+
/* Enhanced hover transitions — transition only the properties that actually
|
|
2323
|
+
change (not `all`, which animates layout and is a perf trap), and drop the
|
|
2324
|
+
blanket `will-change` (it forces a permanent compositor layer per element). */
|
|
2281
2325
|
.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
|
-
|
|
2326
|
+
transition: background-color var(--dur-snap) var(--ease),
|
|
2327
|
+
color var(--dur-snap) var(--ease),
|
|
2328
|
+
box-shadow var(--dur-snap) var(--ease),
|
|
2329
|
+
transform var(--dur-snap) var(--ease);
|
|
2284
2330
|
}
|
|
2285
2331
|
|
|
2286
2332
|
/* Prevent double-tap zoom on buttons (iOS) */
|
|
@@ -2421,6 +2467,9 @@
|
|
|
2421
2467
|
.ds-247420 input[type="email"],
|
|
2422
2468
|
.ds-247420 input[type="password"],
|
|
2423
2469
|
.ds-247420 input[type="number"],
|
|
2470
|
+
.ds-247420 input[type="search"],
|
|
2471
|
+
.ds-247420 input[type="url"],
|
|
2472
|
+
.ds-247420 input[type="tel"],
|
|
2424
2473
|
.ds-247420 textarea,
|
|
2425
2474
|
.ds-247420 select {
|
|
2426
2475
|
transition: background var(--dur-snap) var(--ease),
|
|
@@ -2432,10 +2481,74 @@
|
|
|
2432
2481
|
.ds-247420 input[type="email"]::placeholder,
|
|
2433
2482
|
.ds-247420 input[type="password"]::placeholder,
|
|
2434
2483
|
.ds-247420 input[type="number"]::placeholder,
|
|
2484
|
+
.ds-247420 input[type="search"]::placeholder,
|
|
2485
|
+
.ds-247420 input[type="url"]::placeholder,
|
|
2435
2486
|
.ds-247420 textarea::placeholder {
|
|
2436
2487
|
color: var(--fg-3);
|
|
2437
2488
|
}
|
|
2438
2489
|
|
|
2490
|
+
/* ── Field controls: themed base for TextField / Select / SearchInput ──
|
|
2491
|
+
Root fix: previously only `transition` was set, so themed apps got
|
|
2492
|
+
browser-default white boxes in dark mode and labels collided with inputs
|
|
2493
|
+
because `.ds-field` had no layout. */
|
|
2494
|
+
.ds-247420 .ds-field {
|
|
2495
|
+
display: flex;
|
|
2496
|
+
flex-direction: column;
|
|
2497
|
+
gap: var(--space-1, 6px);
|
|
2498
|
+
align-items: stretch;
|
|
2499
|
+
width: 100%;
|
|
2500
|
+
}
|
|
2501
|
+
.ds-247420 .ds-field-label {
|
|
2502
|
+
font-size: var(--fs-sm, 14px);
|
|
2503
|
+
color: var(--fg-2);
|
|
2504
|
+
line-height: 1.3;
|
|
2505
|
+
}
|
|
2506
|
+
.ds-247420 .ds-field-hint {
|
|
2507
|
+
font-size: var(--fs-tiny, 13px);
|
|
2508
|
+
color: var(--fg-3);
|
|
2509
|
+
line-height: 1.35;
|
|
2510
|
+
}
|
|
2511
|
+
.ds-247420 .ds-field-count {
|
|
2512
|
+
font-size: var(--fs-tiny, 13px);
|
|
2513
|
+
color: var(--fg-3);
|
|
2514
|
+
align-self: flex-end;
|
|
2515
|
+
}
|
|
2516
|
+
|
|
2517
|
+
.ds-247420 .ds-field input,
|
|
2518
|
+
.ds-247420 .ds-field textarea,
|
|
2519
|
+
.ds-247420 .ds-field .ds-select,
|
|
2520
|
+
.ds-247420 .ds-search-input {
|
|
2521
|
+
width: 100%;
|
|
2522
|
+
box-sizing: border-box;
|
|
2523
|
+
font: inherit;
|
|
2524
|
+
color: var(--fg);
|
|
2525
|
+
background: var(--bg-2);
|
|
2526
|
+
border: 0;
|
|
2527
|
+
box-shadow: inset 0 0 0 var(--bw-hair, 1px) var(--rule);
|
|
2528
|
+
border-radius: var(--r-2, 10px);
|
|
2529
|
+
padding: 10px 14px;
|
|
2530
|
+
}
|
|
2531
|
+
.ds-247420 .ds-field textarea { min-height: calc(4 * 1.5em); resize: vertical; }
|
|
2532
|
+
.ds-247420 .ds-search-input::placeholder { color: var(--fg-3); }
|
|
2533
|
+
|
|
2534
|
+
.ds-247420 .ds-field input:focus-visible,
|
|
2535
|
+
.ds-247420 .ds-field textarea:focus-visible,
|
|
2536
|
+
.ds-247420 .ds-field .ds-select:focus-visible,
|
|
2537
|
+
.ds-247420 .ds-search-input:focus-visible {
|
|
2538
|
+
outline: none;
|
|
2539
|
+
box-shadow: inset 0 0 0 2px var(--accent);
|
|
2540
|
+
}
|
|
2541
|
+
.ds-247420 .ds-field input:disabled,
|
|
2542
|
+
.ds-247420 .ds-field textarea:disabled,
|
|
2543
|
+
.ds-247420 .ds-field .ds-select:disabled {
|
|
2544
|
+
opacity: .55;
|
|
2545
|
+
cursor: not-allowed;
|
|
2546
|
+
}
|
|
2547
|
+
.ds-247420 .ds-field input[aria-invalid="true"],
|
|
2548
|
+
.ds-247420 .ds-field textarea[aria-invalid="true"] {
|
|
2549
|
+
box-shadow: inset 0 0 0 var(--bw-hair, 1px) var(--flame, #d64545);
|
|
2550
|
+
}
|
|
2551
|
+
|
|
2439
2552
|
/* Clear button for text inputs */
|
|
2440
2553
|
.ds-247420 input[type="text"]:not(:placeholder-shown) + .input-clear,
|
|
2441
2554
|
.ds-247420 input[type="email"]:not(:placeholder-shown) + .input-clear,
|
|
@@ -2484,9 +2597,10 @@
|
|
|
2484
2597
|
}
|
|
2485
2598
|
.ds-247420 .skip-to-main:focus { top: 10px; }
|
|
2486
2599
|
|
|
2487
|
-
/* Reduced motion preferences
|
|
2600
|
+
/* Reduced motion preferences — scoped to the DS surface so it doesn't reach
|
|
2601
|
+
into and neutralize the host document's own motion. */
|
|
2488
2602
|
@media (prefers-reduced-motion: reduce) {
|
|
2489
|
-
.ds-247420 * {
|
|
2603
|
+
.ds-247420 *, .ds-247420 .app * {
|
|
2490
2604
|
animation-duration: 0.01ms !important;
|
|
2491
2605
|
animation-iteration-count: 1 !important;
|
|
2492
2606
|
transition-duration: 0.01ms !important;
|
|
@@ -2494,17 +2608,14 @@
|
|
|
2494
2608
|
}
|
|
2495
2609
|
|
|
2496
2610
|
/* ────────────────────────────────────────────────────────────
|
|
2497
|
-
Performance
|
|
2611
|
+
Performance
|
|
2498
2612
|
────────────────────────────────────────────────────────────── */
|
|
2499
2613
|
|
|
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;
|
|
2614
|
+
/* Limit layout/style containment to self-contained components. `paint` is
|
|
2615
|
+
intentionally omitted — it clips focus rings, tooltips and dropdowns that
|
|
2616
|
+
emanate from a contained .row/.btn. */
|
|
2617
|
+
.ds-247420 .panel, .ds-247420 .row {
|
|
2618
|
+
contain: layout style;
|
|
2508
2619
|
}
|
|
2509
2620
|
|
|
2510
2621
|
/* ────────────────────────────────────────────────────────────
|
|
@@ -2513,11 +2624,13 @@
|
|
|
2513
2624
|
|
|
2514
2625
|
@media (hover: none) and (pointer: coarse) {
|
|
2515
2626
|
/* 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"] {
|
|
2627
|
+
.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
2628
|
min-height: 48px;
|
|
2518
2629
|
min-width: 48px;
|
|
2519
2630
|
padding: 12px 20px;
|
|
2520
2631
|
}
|
|
2632
|
+
/* Icon buttons stay square — the padding bump above would distort them. */
|
|
2633
|
+
.ds-247420 .ds-icon-btn, .ds-247420 .composer-btn { padding: 0; }
|
|
2521
2634
|
|
|
2522
2635
|
/* Remove hover effects on touch devices (use active instead) */
|
|
2523
2636
|
.ds-247420 .btn:hover, .ds-247420 .btn-primary:hover, .ds-247420 .btn-ghost:hover {
|
|
@@ -2540,12 +2653,9 @@
|
|
|
2540
2653
|
Theme Transition Smoothness
|
|
2541
2654
|
────────────────────────────────────────────────────────────── */
|
|
2542
2655
|
|
|
2543
|
-
|
|
2544
|
-
|
|
2545
|
-
|
|
2546
|
-
}
|
|
2547
|
-
|
|
2548
|
-
.ds-247420 body {
|
|
2656
|
+
/* Scoped to the DS wrapper so the design system never reaches out and
|
|
2657
|
+
animates the host document's html/body. */
|
|
2658
|
+
.ds-247420, .ds-247420 .app {
|
|
2549
2659
|
transition: background-color var(--dur-base) var(--ease),
|
|
2550
2660
|
color var(--dur-base) var(--ease);
|
|
2551
2661
|
}
|
|
@@ -2781,7 +2891,12 @@
|
|
|
2781
2891
|
padding: 10px 12px;
|
|
2782
2892
|
}
|
|
2783
2893
|
.ds-247420 .app-side .group { width: 100%; }
|
|
2784
|
-
|
|
2894
|
+
/* Keep the crumb on mobile — apps mount contextual controls (model picker,
|
|
2895
|
+
actions, live status) in crumb-right, so hiding it strands them. Collapse
|
|
2896
|
+
the breadcrumb trail/leaf instead and let the right cluster wrap. */
|
|
2897
|
+
.ds-247420 .app-crumb { display: flex; flex-wrap: wrap; gap: var(--space-2); padding: 8px 12px; }
|
|
2898
|
+
.ds-247420 .app-crumb > .sep, .ds-247420 .app-crumb > span:not(.crumb-right):not(.leaf) { display: none; }
|
|
2899
|
+
.ds-247420 .app-crumb .crumb-right { margin-left: 0; }
|
|
2785
2900
|
.ds-247420 .chat-head { padding: var(--space-2) var(--space-3) var(--space-2); margin-bottom: var(--space-2); }
|
|
2786
2901
|
.ds-247420 .app-main { padding-left: var(--space-3); padding-right: var(--space-3); }
|
|
2787
2902
|
}
|