anentrypoint-design 0.0.311 → 0.0.313
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 +231 -32
- package/chat.css +9 -0
- package/colors_and_type.css +23 -7
- package/community.css +11 -11
- package/dist/247420.css +328 -62
- package/dist/247420.js +15 -15
- package/package.json +1 -1
- package/src/components/agent-chat.js +2 -1
- package/src/components/chat.js +1 -3
- package/src/components/content.js +28 -12
- package/src/components/editor-primitives.js +27 -1
- package/src/components/files.js +19 -7
- package/src/components/sessions.js +14 -2
- package/src/components/shell.js +15 -5
package/app-shell.css
CHANGED
|
@@ -319,13 +319,19 @@ body.canvas-host { background: transparent !important; }
|
|
|
319
319
|
}
|
|
320
320
|
.app-side a {
|
|
321
321
|
display: grid; grid-template-columns: 18px 1fr auto;
|
|
322
|
-
gap:
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
322
|
+
gap: var(--space-2-5); align-items: center;
|
|
323
|
+
/* Dense rounded-rect nav row (was a 44px pill with 12px 14px padding — tall
|
|
324
|
+
and consumer-shaped). A --r-1 rounded rect at ~34px reads as compact app
|
|
325
|
+
chrome; the full 44px touch target is restored under pointer:coarse below. */
|
|
326
|
+
padding: var(--space-2) var(--space-2-5);
|
|
327
|
+
min-height: 34px;
|
|
328
|
+
border-radius: var(--r-1);
|
|
326
329
|
color: var(--fg-2);
|
|
327
330
|
margin-bottom: 2px;
|
|
328
331
|
}
|
|
332
|
+
@media (pointer: coarse) {
|
|
333
|
+
.app-side a { min-height: 44px; padding: var(--space-2-75) var(--space-3); }
|
|
334
|
+
}
|
|
329
335
|
.app-side a:hover { background: var(--bg-2); color: var(--fg); }
|
|
330
336
|
.app-side a:focus-visible {
|
|
331
337
|
outline: var(--focus-w) solid var(--focus-color);
|
|
@@ -448,10 +454,16 @@ body.canvas-host { background: transparent !important; }
|
|
|
448
454
|
============================================================ */
|
|
449
455
|
.btn, .btn-primary, .btn-ghost {
|
|
450
456
|
display: inline-flex; align-items: center; justify-content: center; gap: 6px;
|
|
451
|
-
padding:
|
|
457
|
+
/* Fixed height + horizontal-only padding: the control height is exact and
|
|
458
|
+
alignable (flex centres the label vertically), the way webgeist snaps every
|
|
459
|
+
control to a height ladder. Default is the --ctl-md rung; --btn-sm/--btn-lg
|
|
460
|
+
retune height + h-padding + font per size. Density scales the ladder. */
|
|
461
|
+
height: var(--ctl-md); min-height: var(--ctl-md);
|
|
462
|
+
padding: 0 var(--space-2-75);
|
|
452
463
|
font-family: var(--ff-body);
|
|
453
464
|
font-weight: 600; font-size: var(--fs-sm);
|
|
454
465
|
text-decoration: none;
|
|
466
|
+
white-space: nowrap;
|
|
455
467
|
cursor: pointer;
|
|
456
468
|
/* Rounded-rect app chrome, not a marketing-page stadium CTA.
|
|
457
469
|
Shape vocabulary: r-1/r-2 = actionable buttons, icon-buttons, and
|
|
@@ -484,6 +496,33 @@ body.canvas-host { background: transparent !important; }
|
|
|
484
496
|
outline-offset: var(--focus-offset);
|
|
485
497
|
}
|
|
486
498
|
|
|
499
|
+
/* Button size ladder — the size prop on Btn() (sm | md | lg). md is the base
|
|
500
|
+
rule above; sm/lg retune height (off the --ctl-* ladder), horizontal padding,
|
|
501
|
+
and font-size so a size swap is one class, never inline padding overrides
|
|
502
|
+
(the old preview faked sizes with style=). Applies to every variant. */
|
|
503
|
+
.btn-sm, .btn-sm.btn-primary, .btn-sm.btn-ghost {
|
|
504
|
+
height: var(--ctl-sm); min-height: var(--ctl-sm);
|
|
505
|
+
padding: 0 var(--space-2); font-size: var(--fs-tiny); gap: var(--space-1);
|
|
506
|
+
}
|
|
507
|
+
.btn-lg, .btn-lg.btn-primary, .btn-lg.btn-ghost {
|
|
508
|
+
height: var(--ctl-lg); min-height: var(--ctl-lg);
|
|
509
|
+
padding: 0 var(--space-4); font-size: var(--fs-body); gap: var(--space-2);
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
/* App-mode quiet interactions — the marketing hover-lift (translateY + shadow)
|
|
513
|
+
and the .row .meta slide read as decorative float on a dense working surface.
|
|
514
|
+
Under [data-typescale="app"], state changes are background/border-only: crisp,
|
|
515
|
+
no motion, no elevation. Marketing surfaces (no data-typescale) keep the lift. */
|
|
516
|
+
[data-typescale="app"] .btn:hover,
|
|
517
|
+
[data-typescale="app"] .btn-primary:hover,
|
|
518
|
+
[data-typescale="app"] .btn-ghost:hover { transform: none; box-shadow: none; }
|
|
519
|
+
[data-typescale="app"] .btn:active,
|
|
520
|
+
[data-typescale="app"] .btn-primary:active,
|
|
521
|
+
[data-typescale="app"] .btn-ghost:active { transform: none; }
|
|
522
|
+
[data-typescale="app"] .panel { transition: box-shadow var(--dur-snap) var(--ease), border-color var(--dur-snap) var(--ease); }
|
|
523
|
+
[data-typescale="app"] a.row:hover .meta,
|
|
524
|
+
[data-typescale="app"] .row[role="button"]:hover .meta { transform: none; }
|
|
525
|
+
|
|
487
526
|
/* ============================================================
|
|
488
527
|
IconButton — square icon-only button
|
|
489
528
|
============================================================ */
|
|
@@ -521,6 +560,10 @@ body.canvas-host { background: transparent !important; }
|
|
|
521
560
|
border-radius: var(--r-pill);
|
|
522
561
|
background: var(--bg-3); color: var(--fg-2);
|
|
523
562
|
}
|
|
563
|
+
/* Badge size ladder — sm for dense inline counts, lg for prominent markers.
|
|
564
|
+
Base (above) stays the 18px default. */
|
|
565
|
+
.ds-badge.ds-badge--sm { min-width: 14px; height: 14px; padding: 0 var(--space-1); font-size: 10px; }
|
|
566
|
+
.ds-badge.ds-badge--lg { min-width: 22px; height: 22px; padding: 0 var(--space-2); font-size: var(--fs-tiny); }
|
|
524
567
|
/* Canonical tone names are tone-success / tone-error / tone-neutral. Every
|
|
525
568
|
other tone name grouped into the same rule below (tone-green/tone-live,
|
|
526
569
|
tone-flame, tone-wip, tone-sun/tone-yellow, tone-ok/tone-miss) is a
|
|
@@ -544,7 +587,7 @@ body.canvas-host { background: transparent !important; }
|
|
|
544
587
|
.ds-badge.tone-orange { background: color-mix(in oklab, var(--flame) 30%, var(--sun) 70%); color: var(--ink); }
|
|
545
588
|
|
|
546
589
|
.chip {
|
|
547
|
-
display: inline-flex; align-items: center; gap:
|
|
590
|
+
display: inline-flex; align-items: center; gap: var(--space-1-75);
|
|
548
591
|
padding: 3px 10px;
|
|
549
592
|
background: var(--bg-2); color: var(--fg-2);
|
|
550
593
|
font-family: var(--ff-body);
|
|
@@ -552,6 +595,17 @@ body.canvas-host { background: transparent !important; }
|
|
|
552
595
|
letter-spacing: var(--tr-caps); text-transform: uppercase;
|
|
553
596
|
border-radius: var(--r-pill);
|
|
554
597
|
}
|
|
598
|
+
/* Chip size ladder — sm for dense toolbars/table cells, lg for prominent
|
|
599
|
+
status. tone-* colouring (below) is orthogonal to size. */
|
|
600
|
+
.chip.chip--sm { padding: var(--space-half) var(--space-2); font-size: var(--fs-micro); gap: var(--space-1); }
|
|
601
|
+
.chip.chip--lg { padding: var(--space-1-75) var(--space-2-75); font-size: var(--fs-xs); }
|
|
602
|
+
/* Tag variant — a rectangular, sentence-case chip for dense data (table cells,
|
|
603
|
+
inline labels) where the all-caps pill reads too shouty and space-hungry.
|
|
604
|
+
Keeps the tone-* palette; drops the caps + pill for a tight --r-0 corner. */
|
|
605
|
+
.chip.chip--tag {
|
|
606
|
+
text-transform: none; letter-spacing: 0; font-weight: 500;
|
|
607
|
+
border-radius: var(--r-0); padding: var(--space-half) var(--space-2);
|
|
608
|
+
}
|
|
555
609
|
/* Same canonical/legacy-alias grouping as .ds-badge above. */
|
|
556
610
|
.chip.tone-green, .chip.tone-live, .chip.tone-success, .chip.tone-ok {
|
|
557
611
|
background: var(--green-tint); color: var(--green-deep);
|
|
@@ -621,6 +675,17 @@ body.canvas-host { background: transparent !important; }
|
|
|
621
675
|
}
|
|
622
676
|
.panel.panel-inline { background: var(--bg-2); padding: var(--space-3) var(--space-3); }
|
|
623
677
|
.panel.panel-wide { background: transparent; box-shadow: none; border: none; }
|
|
678
|
+
/* Dense panel — a compact container for app surfaces (inspector sections,
|
|
679
|
+
sidebars) that want the .panel look without the roomy 16px pad + 24px stack
|
|
680
|
+
gap. Tighter corner + padding + head, so it sits between .panel and the
|
|
681
|
+
flush editor .ds-ep-panel. */
|
|
682
|
+
.panel.panel--dense {
|
|
683
|
+
padding: var(--space-2); margin-bottom: var(--space-2-75);
|
|
684
|
+
border-radius: var(--r-1);
|
|
685
|
+
}
|
|
686
|
+
.panel.panel--dense .panel-head { padding: var(--space-1-5) var(--space-2); }
|
|
687
|
+
.panel.panel--dense .panel-body { padding: var(--space-1-5) var(--space-2) var(--space-2); }
|
|
688
|
+
.panel.panel--dense .panel-body > * + * { margin-top: var(--space-2); }
|
|
624
689
|
.panel-head {
|
|
625
690
|
display: flex; align-items: baseline; justify-content: space-between;
|
|
626
691
|
/* Shares the .panel-body 16px side padding so the caps label and the body
|
|
@@ -650,9 +715,13 @@ body.canvas-host { background: transparent !important; }
|
|
|
650
715
|
grid-template-columns: minmax(80px, 12ch) minmax(0, 1fr) auto;
|
|
651
716
|
gap: var(--space-3);
|
|
652
717
|
align-items: baseline;
|
|
653
|
-
|
|
718
|
+
/* App density is the BASE: a list row is quiet working chrome, so it defaults
|
|
719
|
+
to the compact 12px/16px rhythm (density-scaled) rather than the old
|
|
720
|
+
16px/24px marketing padding. .row--lede restores the roomier marketing
|
|
721
|
+
voice for editorial index pages. */
|
|
722
|
+
padding: calc(var(--space-2-75) * var(--density)) var(--space-3);
|
|
654
723
|
background: var(--bg);
|
|
655
|
-
border-radius: var(--r-
|
|
724
|
+
border-radius: var(--r-1);
|
|
656
725
|
color: var(--fg);
|
|
657
726
|
position: relative;
|
|
658
727
|
/* Only background + the leading rail animate; padding/size never change on
|
|
@@ -730,8 +799,14 @@ a.row:hover .meta, .row[role="button"]:hover .meta { color: var(--accent-ink); t
|
|
|
730
799
|
.row.row-nocode { grid-template-columns: minmax(0, 1fr) auto; }
|
|
731
800
|
|
|
732
801
|
.row .code { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); font-variant-numeric: tabular-nums; letter-spacing: 0.01em; }
|
|
733
|
-
|
|
802
|
+
/* Title defaults to the quiet app voice (fs-sm/500) — the 18px/600 marketing
|
|
803
|
+
voice is now opt-in via .row--lede. */
|
|
804
|
+
.row .title { font-family: var(--ff-body); font-weight: 500; font-size: var(--fs-sm); line-height: var(--lh-snug); display: flex; align-items: baseline; gap: var(--space-2-5); flex-wrap: wrap; min-width: 0; }
|
|
734
805
|
.row .title .sub { font-family: var(--ff-body); font-weight: 400; font-size: var(--fs-sm); color: var(--fg-3); }
|
|
806
|
+
/* Marketing/editorial index row — restores the roomier padding + larger title
|
|
807
|
+
the default carried before app-scale became the base. */
|
|
808
|
+
.row--lede { padding: var(--space-3) var(--space-4); }
|
|
809
|
+
.row--lede .title { font-size: var(--fs-lg); font-weight: 600; }
|
|
735
810
|
/* App typescale: list rows are quiet working chrome (the 18px/600 default is a
|
|
736
811
|
marketing-surface voice). One size for ALL app list rows - matches
|
|
737
812
|
.ds-file-row/.ds-session-title at fs-sm/500; values mirror the kit's own
|
|
@@ -970,16 +1045,19 @@ table.kv td:last-child {
|
|
|
970
1045
|
table {
|
|
971
1046
|
width: 100%; border-collapse: collapse;
|
|
972
1047
|
font-family: var(--ff-body); font-size: var(--fs-sm);
|
|
973
|
-
|
|
1048
|
+
/* A data grid, not a card: a tight --r-0 corner (was --r-3/22px, which read
|
|
1049
|
+
as a rounded card). Cells drop to 8px 12px for a dense, scannable row
|
|
1050
|
+
(was 12/14 x 16 => ~43px rows). Density scales the vertical padding. */
|
|
1051
|
+
border-radius: var(--r-0); overflow: hidden;
|
|
974
1052
|
}
|
|
975
1053
|
table th {
|
|
976
1054
|
text-align: left;
|
|
977
|
-
padding:
|
|
1055
|
+
padding: calc(var(--space-2) * var(--density)) var(--space-2-75);
|
|
978
1056
|
font-size: var(--fs-tiny); font-weight: 600;
|
|
979
1057
|
color: var(--fg-3); text-transform: uppercase; letter-spacing: var(--tr-caps);
|
|
980
1058
|
background: var(--bg-2);
|
|
981
1059
|
}
|
|
982
|
-
table td { padding:
|
|
1060
|
+
table td { padding: calc(var(--space-2) * var(--density)) var(--space-2-75); border-top: 1px solid var(--rule); }
|
|
983
1061
|
table tr.clickable { cursor: pointer; }
|
|
984
1062
|
table tr.clickable:hover td { background: var(--bg-2); }
|
|
985
1063
|
table tr.clickable:focus-visible {
|
|
@@ -1047,13 +1125,16 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
|
|
|
1047
1125
|
gap: var(--space-2);
|
|
1048
1126
|
}
|
|
1049
1127
|
.kpi-card {
|
|
1050
|
-
|
|
1128
|
+
/* Was --space-5 (32px) pad + --r-3 (22px) — four cards ate a full fold. A
|
|
1129
|
+
16px pad on a --r-1 corner keeps them prominent but dense; the number drops
|
|
1130
|
+
from a 48px marketing display to a 32px app-scale figure. */
|
|
1131
|
+
padding: var(--space-3);
|
|
1051
1132
|
background: var(--bg-2);
|
|
1052
|
-
border-radius: var(--r-
|
|
1133
|
+
border-radius: var(--r-1);
|
|
1053
1134
|
}
|
|
1054
1135
|
.kpi-card .num {
|
|
1055
1136
|
font-family: var(--ff-body); font-weight: 600;
|
|
1056
|
-
font-size: clamp(
|
|
1137
|
+
font-size: clamp(22px, 3cqi, 32px); line-height: 1;
|
|
1057
1138
|
letter-spacing: var(--tr-tight);
|
|
1058
1139
|
}
|
|
1059
1140
|
.kpi-card .lbl {
|
|
@@ -1102,11 +1183,14 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
|
|
|
1102
1183
|
Empty state
|
|
1103
1184
|
============================================================ */
|
|
1104
1185
|
.empty {
|
|
1105
|
-
|
|
1186
|
+
/* Was --space-8 (96px) — an empty list spent 192px of vertical space on
|
|
1187
|
+
nothing. --space-6 (48px) still centres a message with air, without the
|
|
1188
|
+
empty state dominating the fold. Mobile drops it further (below). */
|
|
1189
|
+
padding: var(--space-6);
|
|
1106
1190
|
text-align: center;
|
|
1107
1191
|
color: var(--fg-3);
|
|
1108
1192
|
background: var(--bg-2);
|
|
1109
|
-
border-radius: var(--r-
|
|
1193
|
+
border-radius: var(--r-1);
|
|
1110
1194
|
font-size: var(--fs-sm);
|
|
1111
1195
|
}
|
|
1112
1196
|
|
|
@@ -1447,7 +1531,8 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
|
|
|
1447
1531
|
background: var(--bg); color: var(--fg);
|
|
1448
1532
|
border: var(--bw-hair) solid var(--rule); border-radius: var(--r-1);
|
|
1449
1533
|
}
|
|
1450
|
-
.ds-file-controls .ds-file-filter-
|
|
1534
|
+
.ds-file-controls .ds-file-filter-wrap { flex: 0 1 220px; display: contents; }
|
|
1535
|
+
.ds-file-controls .ds-file-filter-wrap .ds-file-filter-input { flex: 0 1 220px; }
|
|
1451
1536
|
.ds-file-filter-input:focus-visible { outline: none; box-shadow: var(--focus-ring-inset); }
|
|
1452
1537
|
.ds-file-sort { display: flex; gap: var(--space-2); padding: 0 var(--space-2) var(--space-1); }
|
|
1453
1538
|
.ds-file-sort-btn {
|
|
@@ -2118,6 +2203,54 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
|
|
|
2118
2203
|
.ds-preview-meta { display: none; }
|
|
2119
2204
|
}
|
|
2120
2205
|
|
|
2206
|
+
/* ============================================================
|
|
2207
|
+
Catalog / demo shell — a shared, compact framing for the preview/*.html
|
|
2208
|
+
component galleries, so each preview stops hand-rolling its own <style>
|
|
2209
|
+
(body padding, section margins, demo boxes). Mirrors webgeist's dense
|
|
2210
|
+
catalog: a 240px sticky sidebar + capped main + a hairline-bordered,
|
|
2211
|
+
flex-wrapping .ds-demo cell that packs variants inline and reflows.
|
|
2212
|
+
============================================================ */
|
|
2213
|
+
.ds-catalog { display: flex; min-height: 100vh; gap: 0; }
|
|
2214
|
+
.ds-catalog-side {
|
|
2215
|
+
width: 240px; flex-shrink: 0;
|
|
2216
|
+
border-right: var(--bw-hair) solid var(--rule);
|
|
2217
|
+
padding: var(--space-3);
|
|
2218
|
+
position: sticky; top: 0; height: 100vh; overflow-y: auto;
|
|
2219
|
+
}
|
|
2220
|
+
.ds-catalog-side h1 { font-size: var(--fs-lg); margin: 0 0 var(--space-1); }
|
|
2221
|
+
.ds-catalog-side .subtitle { font-size: var(--fs-micro); color: var(--fg-3); margin: 0 0 var(--space-4); }
|
|
2222
|
+
.ds-catalog-side nav h4 {
|
|
2223
|
+
font-size: var(--fs-micro); text-transform: uppercase; letter-spacing: var(--tr-label);
|
|
2224
|
+
color: var(--fg-3); margin: var(--space-3) 0 var(--space-1);
|
|
2225
|
+
}
|
|
2226
|
+
.ds-catalog-side nav a {
|
|
2227
|
+
display: block; padding: var(--space-half) 0; font-size: var(--fs-tiny);
|
|
2228
|
+
color: var(--fg-2); text-decoration: none;
|
|
2229
|
+
}
|
|
2230
|
+
.ds-catalog-side nav a:hover { color: var(--accent-ink); }
|
|
2231
|
+
.ds-catalog-main { flex: 1; padding: var(--space-5); max-width: var(--measure-wide); min-width: 0; }
|
|
2232
|
+
.ds-catalog-section { margin-bottom: var(--space-5); padding-top: var(--space-3); border-top: var(--bw-hair) solid var(--rule); }
|
|
2233
|
+
.ds-catalog-section > h2 { font-size: var(--fs-h3-app); margin: 0 0 var(--space-3); }
|
|
2234
|
+
|
|
2235
|
+
/* The gallery cell: a hairline-bordered, flex-wrapping bin that packs a
|
|
2236
|
+
component's variants inline and reflows — the signature "showcase" frame. */
|
|
2237
|
+
.ds-demo {
|
|
2238
|
+
border: var(--bw-hair) solid var(--rule);
|
|
2239
|
+
border-radius: var(--r-1);
|
|
2240
|
+
padding: var(--space-3);
|
|
2241
|
+
display: flex; flex-wrap: wrap; align-items: center; gap: var(--space-2);
|
|
2242
|
+
background: var(--bg);
|
|
2243
|
+
}
|
|
2244
|
+
.ds-demo + .ds-demo { margin-top: var(--space-2-75); }
|
|
2245
|
+
.ds-demo-label { font-size: var(--fs-xs); font-weight: 500; margin: 0 0 var(--space-1); }
|
|
2246
|
+
.ds-demo-desc { font-size: var(--fs-tiny); color: var(--fg-3); margin: 0 0 var(--space-2); }
|
|
2247
|
+
|
|
2248
|
+
@media (max-width: 768px) {
|
|
2249
|
+
.ds-catalog { flex-direction: column; }
|
|
2250
|
+
.ds-catalog-side { width: 100%; height: auto; position: static; border-right: 0; border-bottom: var(--bw-hair) solid var(--rule); }
|
|
2251
|
+
.ds-catalog-main { padding: var(--space-3); }
|
|
2252
|
+
}
|
|
2253
|
+
|
|
2121
2254
|
/* -- File browser UX affordances ---------------------------- */
|
|
2122
2255
|
/* Toolbar filter input — compact search box. */
|
|
2123
2256
|
.ds-filter-input {
|
|
@@ -2615,10 +2748,13 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
|
|
|
2615
2748
|
re-declare it; the sizing block now states the truth). */
|
|
2616
2749
|
line-height: 1.5; resize: none;
|
|
2617
2750
|
min-height: 28px; max-height: 200px;
|
|
2618
|
-
box-sizing: border-box;
|
|
2751
|
+
box-sizing: border-box;
|
|
2752
|
+
/* Always auto, not focus-only: a capped-height composer that loses focus
|
|
2753
|
+
while scrolled must still show its scrollbar - otherwise once the field
|
|
2754
|
+
blurs there is zero cue that content exists below the fold. */
|
|
2755
|
+
overflow-y: auto;
|
|
2619
2756
|
scrollbar-width: thin;
|
|
2620
2757
|
}
|
|
2621
|
-
.chat-composer textarea:focus { overflow-y: auto; }
|
|
2622
2758
|
.chat-composer textarea::placeholder { color: var(--fg-3); }
|
|
2623
2759
|
.chat-composer textarea:focus { background: none; border: none; box-shadow: none; outline: none; }
|
|
2624
2760
|
.chat-composer .send {
|
|
@@ -2982,19 +3118,61 @@ input[type="checkbox"], input[type="radio"] {
|
|
|
2982
3118
|
Enhanced Form Inputs
|
|
2983
3119
|
-------------------------------------------------------------- */
|
|
2984
3120
|
|
|
2985
|
-
input
|
|
2986
|
-
|
|
2987
|
-
input
|
|
2988
|
-
|
|
2989
|
-
input
|
|
2990
|
-
|
|
2991
|
-
input
|
|
2992
|
-
|
|
2993
|
-
|
|
3121
|
+
/* Base chrome for any BARE native control (outside .ds-field/.row-form/.input):
|
|
3122
|
+
the same editorial tonal-fill + printed-baseline-rule as .ds-field, so a raw
|
|
3123
|
+
<input> is never a browser-default white box in dark mode. The guards are
|
|
3124
|
+
wrapped in :where() so they add ZERO specificity — the whole selector stays
|
|
3125
|
+
at (0,1,1), exactly like `.ds-field input`, so the later .ds-field / .ds-field--sm
|
|
3126
|
+
/ .row-form descendant rules win by source order instead of being out-specified
|
|
3127
|
+
(a bare :not(.input) counts as a class and would beat every .ds-field rule,
|
|
3128
|
+
which clobbered the size variants). */
|
|
3129
|
+
input[type="text"]:where(:not(.input):not(.ds-search-input)),
|
|
3130
|
+
input[type="email"]:where(:not(.input):not(.ds-search-input)),
|
|
3131
|
+
input[type="password"]:where(:not(.input):not(.ds-search-input)),
|
|
3132
|
+
input[type="number"]:where(:not(.input):not(.ds-search-input)),
|
|
3133
|
+
input[type="search"]:where(:not(.input):not(.ds-search-input)),
|
|
3134
|
+
input[type="url"]:where(:not(.input):not(.ds-search-input)),
|
|
3135
|
+
input[type="tel"]:where(:not(.input):not(.ds-search-input)),
|
|
3136
|
+
textarea:where(:not(.input)),
|
|
3137
|
+
select:where(:not(.ds-select)) {
|
|
3138
|
+
font: inherit; color: var(--fg);
|
|
3139
|
+
background: var(--bg-2);
|
|
3140
|
+
border: 0;
|
|
3141
|
+
box-shadow: inset 0 0 0 var(--bw-hair, 1px) var(--rule),
|
|
3142
|
+
inset 0 calc(-1 * var(--bw-rule)) 0 var(--rule-strong);
|
|
3143
|
+
border-radius: var(--r-1);
|
|
3144
|
+
padding: 0 var(--space-3);
|
|
2994
3145
|
transition: background var(--dur-snap) var(--ease),
|
|
2995
3146
|
border-color var(--dur-snap) var(--ease),
|
|
2996
3147
|
box-shadow var(--dur-snap) var(--ease);
|
|
2997
3148
|
}
|
|
3149
|
+
/* Single-line bare controls snap to the field height; textarea keeps auto
|
|
3150
|
+
height with symmetric padding (its content decides the box). */
|
|
3151
|
+
input[type="text"]:where(:not(.input):not(.ds-search-input)),
|
|
3152
|
+
input[type="email"]:where(:not(.input):not(.ds-search-input)),
|
|
3153
|
+
input[type="password"]:where(:not(.input):not(.ds-search-input)),
|
|
3154
|
+
input[type="number"]:where(:not(.input):not(.ds-search-input)),
|
|
3155
|
+
input[type="search"]:where(:not(.input):not(.ds-search-input)),
|
|
3156
|
+
input[type="url"]:where(:not(.input):not(.ds-search-input)),
|
|
3157
|
+
input[type="tel"]:where(:not(.input):not(.ds-search-input)),
|
|
3158
|
+
select:where(:not(.ds-select)) {
|
|
3159
|
+
height: var(--field-height);
|
|
3160
|
+
}
|
|
3161
|
+
textarea:where(:not(.input)) { padding: var(--space-2) var(--space-3); min-height: calc(4 * 1.5em); }
|
|
3162
|
+
input[type="text"]:where(:not(.input):not(.ds-search-input)):focus-visible,
|
|
3163
|
+
input[type="email"]:where(:not(.input):not(.ds-search-input)):focus-visible,
|
|
3164
|
+
input[type="password"]:where(:not(.input):not(.ds-search-input)):focus-visible,
|
|
3165
|
+
input[type="number"]:where(:not(.input):not(.ds-search-input)):focus-visible,
|
|
3166
|
+
input[type="search"]:where(:not(.input):not(.ds-search-input)):focus-visible,
|
|
3167
|
+
input[type="url"]:where(:not(.input):not(.ds-search-input)):focus-visible,
|
|
3168
|
+
input[type="tel"]:where(:not(.input):not(.ds-search-input)):focus-visible,
|
|
3169
|
+
textarea:where(:not(.input)):focus-visible,
|
|
3170
|
+
select:where(:not(.ds-select)):focus-visible {
|
|
3171
|
+
outline: none;
|
|
3172
|
+
background: var(--bg);
|
|
3173
|
+
box-shadow: inset 0 0 0 var(--bw-hair, 1px) var(--rule),
|
|
3174
|
+
inset 0 calc(-1 * var(--bw-chunk)) 0 var(--accent);
|
|
3175
|
+
}
|
|
2998
3176
|
|
|
2999
3177
|
input[type="text"]::placeholder,
|
|
3000
3178
|
input[type="email"]::placeholder,
|
|
@@ -3127,12 +3305,33 @@ hr.rule-dotted { border-top: 1px dotted var(--rule-strong); }
|
|
|
3127
3305
|
the electric lead on focus, instead of a uniform hairline box. */
|
|
3128
3306
|
box-shadow: inset 0 0 0 var(--bw-hair, 1px) var(--rule),
|
|
3129
3307
|
inset 0 calc(-1 * var(--bw-rule)) 0 var(--rule-strong);
|
|
3130
|
-
|
|
3131
|
-
|
|
3308
|
+
/* Tighter corner than the old --r-2 (14px): a dense pro control, not a soft
|
|
3309
|
+
consumer box. Single-line controls snap to --field-height with h-only
|
|
3310
|
+
padding so they align pixel-exact with buttons on the same --ctl-md rung. */
|
|
3311
|
+
border-radius: var(--r-1);
|
|
3312
|
+
height: var(--field-height);
|
|
3313
|
+
padding: 0 var(--space-3);
|
|
3132
3314
|
transition: box-shadow var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
|
|
3133
3315
|
}
|
|
3134
|
-
|
|
3316
|
+
/* textarea is multi-line: height is auto (min-height instead), keep symmetric
|
|
3317
|
+
vertical padding so text doesn't sit flush to the top edge. */
|
|
3318
|
+
.ds-field textarea { height: auto; min-height: calc(4 * 1.5em); padding: var(--space-2) var(--space-3); resize: vertical; }
|
|
3319
|
+
|
|
3320
|
+
/* Field size ladder (size prop on TextField/Select/SearchInput). md == base.
|
|
3321
|
+
sm/lg retune height + h-padding + font off the --ctl-* ladder, matching the
|
|
3322
|
+
button ladder so a form of mixed controls stays on one rhythm. */
|
|
3323
|
+
.ds-field--sm input, .ds-field--sm .ds-select, .ds-field--sm .ds-search-input {
|
|
3324
|
+
height: var(--ctl-sm); padding: 0 var(--space-2-5); font-size: var(--fs-tiny);
|
|
3325
|
+
}
|
|
3326
|
+
.ds-field--sm textarea { height: auto; padding: var(--space-1-75) var(--space-2-5); font-size: var(--fs-tiny); }
|
|
3327
|
+
.ds-field--lg input, .ds-field--lg .ds-select, .ds-field--lg .ds-search-input {
|
|
3328
|
+
height: var(--ctl-lg); padding: 0 var(--space-4); font-size: var(--fs-body);
|
|
3329
|
+
}
|
|
3330
|
+
.ds-field--lg textarea { height: auto; padding: var(--space-2-5) var(--space-4); font-size: var(--fs-body); }
|
|
3135
3331
|
.ds-search-input::placeholder { color: var(--fg-3); }
|
|
3332
|
+
/* Only present when SearchInput is passed resultCount - transparent to any
|
|
3333
|
+
flex/grid layout the bare input previously sat in directly. */
|
|
3334
|
+
.ds-search-input-wrap { display: contents; }
|
|
3136
3335
|
|
|
3137
3336
|
.ds-field input:focus-visible,
|
|
3138
3337
|
.ds-field textarea:focus-visible,
|
package/chat.css
CHANGED
|
@@ -389,6 +389,15 @@
|
|
|
389
389
|
.ds-session-head .ds-search-input { min-height: 44px; }
|
|
390
390
|
}
|
|
391
391
|
.ds-session-list, .ds-session-groups { flex: 1; min-height: 0; overflow-y: auto; padding: var(--space-2); }
|
|
392
|
+
.ds-session-loadmore {
|
|
393
|
+
width: 100%; margin-top: var(--space-1); padding: 8px 12px;
|
|
394
|
+
font-size: var(--fs-sm); font-family: inherit; color: var(--fg-3);
|
|
395
|
+
background: none; border: var(--bw-hair) dashed var(--rule); border-radius: var(--r-1);
|
|
396
|
+
cursor: pointer; text-align: center;
|
|
397
|
+
}
|
|
398
|
+
.ds-session-loadmore:hover { color: var(--fg); border-color: var(--fg-3); }
|
|
399
|
+
.ds-session-loadmore:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: var(--focus-offset); }
|
|
400
|
+
@media (pointer: coarse) { .ds-session-loadmore { min-height: 44px; } }
|
|
392
401
|
/* Grouped rows (Today/Yesterday/...) lay out like the flat list; the section
|
|
393
402
|
label sticks to the top of the scroll area for Claude-Desktop-style headers. */
|
|
394
403
|
.ds-session-group { display: flex; flex-direction: column; }
|
package/colors_and_type.css
CHANGED
|
@@ -184,7 +184,9 @@
|
|
|
184
184
|
--space-1-75: 6px;
|
|
185
185
|
--space-2: 8px;
|
|
186
186
|
--space-2-5: 10px;
|
|
187
|
+
--space-2-75: 12px; /* fills the 10->16 hole (row-form gap, dense cell pad) */
|
|
187
188
|
--space-3: 16px;
|
|
189
|
+
--space-3-5: 20px; /* fills the 16->24 hole (settings body, mono block pad) */
|
|
188
190
|
--space-4: 24px;
|
|
189
191
|
--space-5: 32px;
|
|
190
192
|
--space-6: 48px;
|
|
@@ -258,6 +260,19 @@
|
|
|
258
260
|
--size-base: 42px;
|
|
259
261
|
--size-lg: 56px;
|
|
260
262
|
|
|
263
|
+
/* Dense control-height ladder — the actual heights front-door controls
|
|
264
|
+
(buttons, fields, rows) snap to, one rung tighter than the --size-*
|
|
265
|
+
chrome scale so app UI reads compact instead of marketing-scale. Density
|
|
266
|
+
scales them so [data-density=compact/spacious] moves every control at once.
|
|
267
|
+
Mirrors webgeist's 30/38/46 button ladder, retuned for this system. */
|
|
268
|
+
--ctl-sm: calc(28px * var(--density));
|
|
269
|
+
--ctl-md: calc(34px * var(--density));
|
|
270
|
+
--ctl-lg: calc(42px * var(--density));
|
|
271
|
+
/* The canonical single-line input/select/searchfield height (== --ctl-md)
|
|
272
|
+
and the default list-row min-height, both density-aware. */
|
|
273
|
+
--field-height: var(--ctl-md);
|
|
274
|
+
--row-height: calc(40px * var(--density));
|
|
275
|
+
|
|
261
276
|
/* Unified focus-ring tokens (single source for the design system). Outset
|
|
262
277
|
rings (the default) tokenize colour+width+offset; bordered text fields use
|
|
263
278
|
the inset variant. Deliberate negative offsets on edge-flush/clipping
|
|
@@ -287,25 +302,26 @@
|
|
|
287
302
|
outline-offset: var(--focus-offset);
|
|
288
303
|
}
|
|
289
304
|
|
|
290
|
-
/* Link focus-visible
|
|
305
|
+
/* Link focus-visible — all route through the single --focus-* token set so a
|
|
306
|
+
focus retune (colour/width/offset) happens in one place, never per selector. */
|
|
291
307
|
a:focus-visible,
|
|
292
308
|
[role="link"]:focus-visible {
|
|
293
|
-
outline:
|
|
294
|
-
outline-offset:
|
|
309
|
+
outline: var(--focus-w) solid var(--focus-color);
|
|
310
|
+
outline-offset: var(--focus-offset);
|
|
295
311
|
}
|
|
296
312
|
|
|
297
313
|
/* Form inputs with focus-visible */
|
|
298
314
|
input:focus-visible,
|
|
299
315
|
textarea:focus-visible,
|
|
300
316
|
select:focus-visible {
|
|
301
|
-
outline:
|
|
302
|
-
outline-offset:
|
|
317
|
+
outline: var(--focus-w) solid var(--focus-color);
|
|
318
|
+
outline-offset: var(--focus-offset);
|
|
303
319
|
}
|
|
304
320
|
|
|
305
321
|
/* Interactive element focus-visible */
|
|
306
322
|
[tabindex]:focus-visible {
|
|
307
|
-
outline:
|
|
308
|
-
outline-offset:
|
|
323
|
+
outline: var(--focus-w) solid var(--focus-color);
|
|
324
|
+
outline-offset: var(--focus-offset);
|
|
309
325
|
}
|
|
310
326
|
|
|
311
327
|
[data-theme="ink"],
|
package/community.css
CHANGED
|
@@ -297,7 +297,7 @@
|
|
|
297
297
|
background: color-mix(in oklab, var(--fg) 8%, transparent);
|
|
298
298
|
}
|
|
299
299
|
.cm-cat-add:focus-visible {
|
|
300
|
-
outline:
|
|
300
|
+
outline: var(--focus-w) solid var(--focus-color);
|
|
301
301
|
outline-offset: 2px;
|
|
302
302
|
}
|
|
303
303
|
|
|
@@ -480,7 +480,7 @@
|
|
|
480
480
|
background: color-mix(in oklab, var(--fg) 10%, transparent);
|
|
481
481
|
}
|
|
482
482
|
.cm-ch-action-btn:focus-visible {
|
|
483
|
-
outline:
|
|
483
|
+
outline: var(--focus-w) solid var(--focus-color);
|
|
484
484
|
outline-offset: 2px;
|
|
485
485
|
}
|
|
486
486
|
|
|
@@ -1063,44 +1063,44 @@
|
|
|
1063
1063
|
.cm-server-icon:focus-visible,
|
|
1064
1064
|
.cm-server-back:focus-visible,
|
|
1065
1065
|
.cm-server-add:focus-visible {
|
|
1066
|
-
outline:
|
|
1066
|
+
outline: var(--focus-w) solid var(--focus-color);
|
|
1067
1067
|
outline-offset: 2px;
|
|
1068
1068
|
border-radius: var(--r-2);
|
|
1069
1069
|
}
|
|
1070
1070
|
|
|
1071
1071
|
.cm-channel-item:focus-visible {
|
|
1072
|
-
outline:
|
|
1072
|
+
outline: var(--focus-w) solid var(--focus-color);
|
|
1073
1073
|
outline-offset: -2px;
|
|
1074
1074
|
border-radius: var(--r-1);
|
|
1075
1075
|
}
|
|
1076
1076
|
|
|
1077
1077
|
.cm-server-header:focus-visible,
|
|
1078
1078
|
.cm-category-header:focus-visible {
|
|
1079
|
-
outline:
|
|
1079
|
+
outline: var(--focus-w) solid var(--focus-color);
|
|
1080
1080
|
outline-offset: -2px;
|
|
1081
1081
|
}
|
|
1082
1082
|
|
|
1083
1083
|
.cm-member-item:focus-visible {
|
|
1084
|
-
outline:
|
|
1084
|
+
outline: var(--focus-w) solid var(--focus-color);
|
|
1085
1085
|
outline-offset: -2px;
|
|
1086
1086
|
border-radius: var(--r-1);
|
|
1087
1087
|
}
|
|
1088
1088
|
|
|
1089
1089
|
.cm-vs-btn:focus-visible,
|
|
1090
1090
|
.cm-user-btn:focus-visible {
|
|
1091
|
-
outline:
|
|
1091
|
+
outline: var(--focus-w) solid var(--focus-color);
|
|
1092
1092
|
outline-offset: 2px;
|
|
1093
1093
|
border-radius: var(--r-1);
|
|
1094
1094
|
}
|
|
1095
1095
|
|
|
1096
1096
|
/* ThreadPanel / Forum / Page interactive elements */
|
|
1097
1097
|
.cm-tp-item:focus-visible,
|
|
1098
|
-
.cm-forum-item:focus-visible { outline:
|
|
1098
|
+
.cm-forum-item:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: -2px; border-radius: var(--r-1); }
|
|
1099
1099
|
.cm-tp-new:focus-visible,
|
|
1100
1100
|
.cm-tp-close:focus-visible,
|
|
1101
1101
|
.cm-forum-new:focus-visible,
|
|
1102
1102
|
.cm-forum-sort:focus-visible,
|
|
1103
|
-
.cm-page-edit:focus-visible { outline:
|
|
1103
|
+
.cm-page-edit:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: 2px; border-radius: var(--r-1); }
|
|
1104
1104
|
.cm-forum-search:focus-visible { outline: none; box-shadow: inset 0 0 0 2px var(--accent-ink); }
|
|
1105
1105
|
|
|
1106
1106
|
/* ---------- mobile header ---------- */
|
|
@@ -1129,7 +1129,7 @@
|
|
|
1129
1129
|
border-radius: var(--r-1);
|
|
1130
1130
|
}
|
|
1131
1131
|
.cm-mh-btn:hover { background: var(--panel-3); }
|
|
1132
|
-
.cm-mh-btn:focus-visible { outline:
|
|
1132
|
+
.cm-mh-btn:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: 2px; }
|
|
1133
1133
|
.cm-mh-title {
|
|
1134
1134
|
flex: 1 1 auto;
|
|
1135
1135
|
min-width: 0;
|
|
@@ -1174,7 +1174,7 @@
|
|
|
1174
1174
|
border-radius: var(--r-1);
|
|
1175
1175
|
}
|
|
1176
1176
|
.cm-rb-cancel:hover { background: var(--panel-3); color: var(--fg); }
|
|
1177
|
-
.cm-rb-cancel:focus-visible { outline:
|
|
1177
|
+
.cm-rb-cancel:focus-visible { outline: var(--focus-w) solid var(--focus-color); outline-offset: 1px; }
|
|
1178
1178
|
|
|
1179
1179
|
/* ---------- banner ---------- */
|
|
1180
1180
|
.cm-banner {
|