anentrypoint-design 0.0.204 → 0.0.206
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 +81 -37
- package/dist/247420.css +81 -37
- package/dist/247420.js +12 -12
- package/package.json +1 -1
- package/src/components/community.js +8 -1
- package/src/components/content.js +6 -2
- package/src/kits/os/freddie/pages-tools.js +1 -1
- package/src/markdown.js +10 -0
- package/src/markdown-cache-perf-test.js +0 -173
package/app-shell.css
CHANGED
|
@@ -41,7 +41,7 @@ body {
|
|
|
41
41
|
-webkit-font-smoothing: antialiased;
|
|
42
42
|
text-rendering: optimizeLegibility;
|
|
43
43
|
}
|
|
44
|
-
::selection { background: var(--
|
|
44
|
+
::selection { background: color-mix(in oklab, var(--accent) 24%, var(--bg-2)); color: var(--fg); }
|
|
45
45
|
|
|
46
46
|
/* Every root has a CQ container so fluid type can resolve to a meaningful inline-size. */
|
|
47
47
|
.app, [class*="kit-"], .ds-stage {
|
|
@@ -534,41 +534,61 @@ body.canvas-host { background: transparent !important; }
|
|
|
534
534
|
grid-template-columns: minmax(80px, 12ch) minmax(0, 1fr) auto;
|
|
535
535
|
gap: var(--space-3);
|
|
536
536
|
align-items: baseline;
|
|
537
|
-
padding:
|
|
537
|
+
padding: 16px 22px;
|
|
538
538
|
background: var(--bg);
|
|
539
539
|
border-radius: var(--r-2);
|
|
540
540
|
color: var(--fg);
|
|
541
541
|
position: relative;
|
|
542
|
-
|
|
542
|
+
/* Only background + the leading rail animate; padding/size never change on
|
|
543
|
+
interaction, so they are deliberately absent (a padding transition here was
|
|
544
|
+
dead and misleading). */
|
|
545
|
+
transition: background var(--dur-snap) var(--ease);
|
|
543
546
|
}
|
|
544
|
-
.row + .row { margin-top:
|
|
547
|
+
.row + .row { margin-top: 2px; }
|
|
545
548
|
.row::before {
|
|
546
549
|
content: '';
|
|
547
|
-
position: absolute; left:
|
|
548
|
-
|
|
549
|
-
|
|
550
|
+
position: absolute; left: 7px; top: 0; bottom: 0; width: 3px;
|
|
551
|
+
margin: auto 0;
|
|
552
|
+
height: 0; /* collapsed by default; reveals from centre */
|
|
553
|
+
background: var(--rule-strong);
|
|
554
|
+
border-radius: var(--r-pill);
|
|
555
|
+
opacity: 0;
|
|
556
|
+
transition: height var(--dur-base) var(--ease), opacity var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
|
|
550
557
|
}
|
|
551
558
|
/* A clickable row (onClick -> role=button, or a link row) is interactive, so it
|
|
552
559
|
carries a pointer cursor; without this the click affordance is invisible. */
|
|
553
560
|
.row[role="button"], a.row { cursor: pointer; }
|
|
554
|
-
|
|
555
|
-
|
|
561
|
+
/* Hover reveals the rail (grows from centre) only on interactive rows — a static
|
|
562
|
+
row should not signal an affordance it does not have. */
|
|
563
|
+
.row[role="button"]:hover, a.row:hover { background: var(--bg-2); }
|
|
564
|
+
.row[role="button"]:hover::before, a.row:hover::before { height: 56%; opacity: 1; }
|
|
556
565
|
.row.active { background: color-mix(in oklab, var(--accent) 10%, var(--bg-2)); }
|
|
557
|
-
.row.active::before { background: var(--accent); }
|
|
566
|
+
.row.active::before { height: 64%; opacity: 1; background: var(--accent); }
|
|
567
|
+
.row.active .title { color: var(--accent); }
|
|
558
568
|
.row.row-state-disabled { opacity: 0.5; pointer-events: none; }
|
|
559
569
|
.row.row-state-error { background: color-mix(in oklab, var(--flame) 10%, var(--bg-2)); }
|
|
560
|
-
.row.row-state-error::before { background: var(--flame); }
|
|
570
|
+
.row.row-state-error::before { height: 64%; opacity: 1; background: var(--flame); }
|
|
561
571
|
/* rail tones — a persistent status colour on the leading rail (the ::before
|
|
562
|
-
bar).
|
|
572
|
+
bar). Always shown (a status indicator, not a hover affordance). Active/error
|
|
573
|
+
still win via their own rules below in source order. */
|
|
574
|
+
.row.rail-green::before,
|
|
575
|
+
.row.rail-purple::before,
|
|
576
|
+
.row.rail-flame::before { height: 56%; opacity: 1; }
|
|
563
577
|
.row.rail-green::before { background: var(--accent); }
|
|
564
578
|
.row.rail-purple::before { background: var(--purple-2, #7F18A4); }
|
|
565
579
|
.row.rail-flame::before { background: var(--flame); }
|
|
566
580
|
.row-grid { /* explicit grid-template-columns set inline */ }
|
|
581
|
+
/* A row with no leading code/index drops the empty first column so the title
|
|
582
|
+
takes the full width instead of wrapping in the narrow code gutter. */
|
|
583
|
+
.row.row-nocode { grid-template-columns: minmax(0, 1fr) auto; }
|
|
567
584
|
|
|
568
|
-
.row .code { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); }
|
|
569
|
-
.row .title { font-family: var(--ff-body); font-weight: 600; font-size: var(--fs-lg); display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
|
|
585
|
+
.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; }
|
|
586
|
+
.row .title { font-family: var(--ff-body); font-weight: 600; font-size: var(--fs-lg); line-height: var(--lh-snug, 1.3); display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; min-width: 0; }
|
|
587
|
+
.row .title .sub { font-family: var(--ff-body); font-weight: 400; font-size: var(--fs-sm); color: var(--fg-3); }
|
|
570
588
|
.row .sub { font-family: var(--ff-body); font-weight: 400; font-size: var(--fs-sm); color: var(--fg-3); }
|
|
571
|
-
.row .meta { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); text-align: right; }
|
|
589
|
+
.row .meta { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; align-self: center; }
|
|
590
|
+
/* WorksList meta pairs a label with a disclosure chevron, inline-aligned. */
|
|
591
|
+
.ds-works-meta { display: inline-flex; align-items: center; gap: .4em; }
|
|
572
592
|
|
|
573
593
|
a.row { text-decoration: none; }
|
|
574
594
|
|
|
@@ -1920,36 +1940,43 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
|
|
|
1920
1940
|
.chat-msg:nth-child(n+4) { animation-delay: 0.15s; }
|
|
1921
1941
|
}
|
|
1922
1942
|
|
|
1943
|
+
/* Calm composer (claude.ai/code): ONE bordered rounded-rect shell holding the
|
|
1944
|
+
context line, a borderless textarea, the hint, and an inline send button -
|
|
1945
|
+
not a stadium pill + a floating round send. The shell carries the border and
|
|
1946
|
+
the focus ring; the textarea fills it transparently. flex-wrap lets the
|
|
1947
|
+
context line and hint occupy their own rows above/below the input row. */
|
|
1923
1948
|
.chat-composer {
|
|
1924
|
-
display: flex; align-items: flex-end; gap:
|
|
1925
|
-
padding: var(--space-
|
|
1926
|
-
|
|
1949
|
+
display: flex; align-items: flex-end; flex-wrap: wrap; gap: var(--space-2);
|
|
1950
|
+
padding: var(--space-2) var(--space-2) var(--space-2) var(--space-3);
|
|
1951
|
+
background: var(--bg);
|
|
1952
|
+
border: var(--bw-hair) solid var(--rule);
|
|
1953
|
+
border-radius: var(--r-2);
|
|
1927
1954
|
flex-shrink: 0;
|
|
1955
|
+
transition: border-color var(--dur-snap) var(--ease), box-shadow var(--dur-snap) var(--ease);
|
|
1956
|
+
}
|
|
1957
|
+
.chat-composer:focus-within {
|
|
1958
|
+
border-color: var(--accent);
|
|
1959
|
+
box-shadow: 0 0 0 2px color-mix(in oklab, var(--accent) 18%, transparent);
|
|
1928
1960
|
}
|
|
1929
1961
|
.chat-composer textarea {
|
|
1930
|
-
flex: 1; padding:
|
|
1931
|
-
background:
|
|
1932
|
-
border:
|
|
1962
|
+
flex: 1; min-width: 0; padding: 8px 4px;
|
|
1963
|
+
background: none; color: var(--fg);
|
|
1964
|
+
border: none; border-radius: 0;
|
|
1933
1965
|
font-family: inherit; font-size: var(--fs-sm);
|
|
1934
|
-
line-height: 1.
|
|
1935
|
-
min-height:
|
|
1966
|
+
line-height: 1.45; resize: none;
|
|
1967
|
+
min-height: 28px; max-height: 200px;
|
|
1936
1968
|
box-sizing: border-box; overflow-y: auto;
|
|
1937
1969
|
scrollbar-width: thin;
|
|
1938
1970
|
}
|
|
1939
1971
|
.chat-composer textarea::placeholder { color: var(--fg-3); }
|
|
1940
|
-
.chat-composer textarea:focus {
|
|
1941
|
-
background: var(--bg-2);
|
|
1942
|
-
border-color: var(--accent);
|
|
1943
|
-
box-shadow: 0 0 0 2px color-mix(in oklab, var(--accent) 20%, transparent);
|
|
1944
|
-
outline: none;
|
|
1945
|
-
}
|
|
1972
|
+
.chat-composer textarea:focus { background: none; border: none; box-shadow: none; outline: none; }
|
|
1946
1973
|
.chat-composer .send {
|
|
1947
|
-
width:
|
|
1974
|
+
width: 36px; height: 36px; border-radius: var(--r-1);
|
|
1948
1975
|
background: var(--accent); color: var(--accent-fg);
|
|
1949
1976
|
border: 0; cursor: pointer;
|
|
1950
1977
|
display: inline-flex; align-items: center; justify-content: center;
|
|
1951
1978
|
flex-shrink: 0;
|
|
1952
|
-
transition: background var(--dur-snap, .15s) var(--ease, ease)
|
|
1979
|
+
transition: background var(--dur-snap, .15s) var(--ease, ease);
|
|
1953
1980
|
}
|
|
1954
1981
|
.chat-composer .send:disabled { opacity: .5; cursor: not-allowed; }
|
|
1955
1982
|
/* Ghost icon buttons in the toolbar (attach / emoji / more) — NOT the round
|
|
@@ -1963,8 +1990,8 @@ table tr.clickable:focus-visible td { background: var(--bg-2); }
|
|
|
1963
1990
|
transition: background var(--dur-snap, .15s) var(--ease, ease), color var(--dur-snap, .15s) var(--ease, ease);
|
|
1964
1991
|
}
|
|
1965
1992
|
.composer-btn:hover { background: color-mix(in oklab, var(--fg) 8%, transparent); color: var(--fg); }
|
|
1966
|
-
.chat-composer .send:hover {
|
|
1967
|
-
.chat-composer .send:active {
|
|
1993
|
+
.chat-composer .send:hover { filter: brightness(1.08); }
|
|
1994
|
+
.chat-composer .send:active { filter: brightness(0.94); }
|
|
1968
1995
|
.chat-composer .send:focus-visible,
|
|
1969
1996
|
.composer-btn:focus-visible {
|
|
1970
1997
|
outline: 2px solid var(--accent);
|
|
@@ -2821,6 +2848,12 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
|
|
|
2821
2848
|
.ws-shell.ws-no-pane.ws-pane-collapsed.ws-no-sessions { grid-template-columns: var(--ws-rail-w) 1fr var(--ws-pane-w); grid-template-areas: "rail content pane"; }
|
|
2822
2849
|
.ws-shell.ws-rail-collapsed { --ws-rail-w: var(--ws-rail-w-collapsed); }
|
|
2823
2850
|
.ws-shell.ws-pane-collapsed { --ws-pane-w: 0px; }
|
|
2851
|
+
/* Ease the rail/pane collapse. Track COUNT stays stable on collapse (only a
|
|
2852
|
+
width var flips), so grid-template-columns is animatable; reduced-motion
|
|
2853
|
+
drops it to an instant swap. */
|
|
2854
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
2855
|
+
.ws-shell { transition: grid-template-columns var(--dur-base) var(--ease); }
|
|
2856
|
+
}
|
|
2824
2857
|
|
|
2825
2858
|
/* Rail (left nav) */
|
|
2826
2859
|
.ws-rail {
|
|
@@ -2891,9 +2924,17 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
|
|
|
2891
2924
|
|
|
2892
2925
|
/* Content column */
|
|
2893
2926
|
.ws-content { grid-area: content; min-width: 0; min-height: 0; display: flex; flex-direction: column; }
|
|
2894
|
-
|
|
2927
|
+
/* Crumb band is the top chrome of the content column: a stable height so the
|
|
2928
|
+
top edge aligns with the rail head, and a left gutter matching .ws-main so
|
|
2929
|
+
the trail text is not flush against the rail border. */
|
|
2930
|
+
.ws-crumb { flex: 0 0 auto; min-height: 48px; padding: 0 var(--space-4); display: flex; align-items: center; gap: var(--space-1); border-bottom: var(--bw-hair) solid var(--bg-3); }
|
|
2895
2931
|
.ws-crumb-main { flex: 1 1 auto; min-width: 0; }
|
|
2896
|
-
|
|
2932
|
+
/* Content column gutter. Claude-Code-class calm: file grid / dashboard / event
|
|
2933
|
+
list / history get a generous, consistent inner gutter instead of butting
|
|
2934
|
+
against the 1px column borders. The chat tab opts out via .ws-main--flush
|
|
2935
|
+
because the chat thread carries its own --measure gutter. */
|
|
2936
|
+
.ws-main { flex: 1; min-height: 0; overflow: auto; display: flex; flex-direction: column; padding: var(--space-4) var(--space-5); }
|
|
2937
|
+
.ws-main.ws-main--flush { padding: 0; }
|
|
2897
2938
|
.ws-main:focus { outline: none; }
|
|
2898
2939
|
|
|
2899
2940
|
/* Right context pane */
|
|
@@ -2938,8 +2979,11 @@ input[type="password"]:not(:placeholder-shown) + .input-clear {
|
|
|
2938
2979
|
.ws-rail-collapsed .ws-rail-item-label, .ws-rail-collapsed .ws-rail-brand { display: none; }
|
|
2939
2980
|
/* Tap-scrim behind an open drawer; dismiss on click. Hidden unless a drawer
|
|
2940
2981
|
is open so it never blocks the content area on desktop. */
|
|
2941
|
-
|
|
2942
|
-
|
|
2982
|
+
/* Scrim is always present on mobile so it can FADE with the drawer instead of
|
|
2983
|
+
hard-appearing via a display toggle; pointer-events gate keeps it inert
|
|
2984
|
+
while closed. Reduced-motion users get the global transition kill -> instant. */
|
|
2985
|
+
.ws-scrim { display: block; opacity: 0; pointer-events: none; position: fixed; inset: 0; z-index: 41; background: color-mix(in srgb, var(--fg) 38%, transparent); transition: opacity var(--dur-base) var(--ease); }
|
|
2986
|
+
.ws-shell.ws-sessions-open .ws-scrim, .ws-shell.ws-pane-open .ws-scrim { opacity: 1; pointer-events: auto; }
|
|
2943
2987
|
/* The mobile drawer-toggle affordances live in the crumb bar. */
|
|
2944
2988
|
.ws-drawer-toggle { display: inline-flex; }
|
|
2945
2989
|
}
|
package/dist/247420.css
CHANGED
|
@@ -442,7 +442,7 @@
|
|
|
442
442
|
-webkit-font-smoothing: antialiased;
|
|
443
443
|
text-rendering: optimizeLegibility;
|
|
444
444
|
}
|
|
445
|
-
.ds-247420 ::selection { background: var(--
|
|
445
|
+
.ds-247420 ::selection { background: color-mix(in oklab, var(--accent) 24%, var(--bg-2)); color: var(--fg); }
|
|
446
446
|
|
|
447
447
|
/* Every root has a CQ container so fluid type can resolve to a meaningful inline-size. */
|
|
448
448
|
.ds-247420 .app, .ds-247420[class*="kit-"], .ds-247420 .ds-stage {
|
|
@@ -935,41 +935,61 @@
|
|
|
935
935
|
grid-template-columns: minmax(80px, 12ch) minmax(0, 1fr) auto;
|
|
936
936
|
gap: var(--space-3);
|
|
937
937
|
align-items: baseline;
|
|
938
|
-
padding:
|
|
938
|
+
padding: 16px 22px;
|
|
939
939
|
background: var(--bg);
|
|
940
940
|
border-radius: var(--r-2);
|
|
941
941
|
color: var(--fg);
|
|
942
942
|
position: relative;
|
|
943
|
-
|
|
943
|
+
/* Only background + the leading rail animate; padding/size never change on
|
|
944
|
+
interaction, so they are deliberately absent (a padding transition here was
|
|
945
|
+
dead and misleading). */
|
|
946
|
+
transition: background var(--dur-snap) var(--ease);
|
|
944
947
|
}
|
|
945
|
-
.ds-247420 .row + .row { margin-top:
|
|
948
|
+
.ds-247420 .row + .row { margin-top: 2px; }
|
|
946
949
|
.ds-247420 .row::before {
|
|
947
950
|
content: '';
|
|
948
|
-
position: absolute; left:
|
|
949
|
-
|
|
950
|
-
|
|
951
|
+
position: absolute; left: 7px; top: 0; bottom: 0; width: 3px;
|
|
952
|
+
margin: auto 0;
|
|
953
|
+
height: 0; /* collapsed by default; reveals from centre */
|
|
954
|
+
background: var(--rule-strong);
|
|
955
|
+
border-radius: var(--r-pill);
|
|
956
|
+
opacity: 0;
|
|
957
|
+
transition: height var(--dur-base) var(--ease), opacity var(--dur-snap) var(--ease), background var(--dur-snap) var(--ease);
|
|
951
958
|
}
|
|
952
959
|
/* A clickable row (onClick -> role=button, or a link row) is interactive, so it
|
|
953
960
|
carries a pointer cursor; without this the click affordance is invisible. */
|
|
954
961
|
.ds-247420 .row[role="button"], .ds-247420 a.row { cursor: pointer; }
|
|
955
|
-
|
|
956
|
-
|
|
962
|
+
/* Hover reveals the rail (grows from centre) only on interactive rows — a static
|
|
963
|
+
row should not signal an affordance it does not have. */
|
|
964
|
+
.ds-247420 .row[role="button"]:hover, .ds-247420 a.row:hover { background: var(--bg-2); }
|
|
965
|
+
.ds-247420 .row[role="button"]:hover::before, .ds-247420 a.row:hover::before { height: 56%; opacity: 1; }
|
|
957
966
|
.ds-247420 .row.active { background: color-mix(in oklab, var(--accent) 10%, var(--bg-2)); }
|
|
958
|
-
.ds-247420 .row.active::before { background: var(--accent); }
|
|
967
|
+
.ds-247420 .row.active::before { height: 64%; opacity: 1; background: var(--accent); }
|
|
968
|
+
.ds-247420 .row.active .title { color: var(--accent); }
|
|
959
969
|
.ds-247420 .row.row-state-disabled { opacity: 0.5; pointer-events: none; }
|
|
960
970
|
.ds-247420 .row.row-state-error { background: color-mix(in oklab, var(--flame) 10%, var(--bg-2)); }
|
|
961
|
-
.ds-247420 .row.row-state-error::before { background: var(--flame); }
|
|
971
|
+
.ds-247420 .row.row-state-error::before { height: 64%; opacity: 1; background: var(--flame); }
|
|
962
972
|
/* rail tones — a persistent status colour on the leading rail (the ::before
|
|
963
|
-
bar).
|
|
973
|
+
bar). Always shown (a status indicator, not a hover affordance). Active/error
|
|
974
|
+
still win via their own rules below in source order. */
|
|
975
|
+
.ds-247420 .row.rail-green::before,
|
|
976
|
+
.ds-247420 .row.rail-purple::before,
|
|
977
|
+
.ds-247420 .row.rail-flame::before { height: 56%; opacity: 1; }
|
|
964
978
|
.ds-247420 .row.rail-green::before { background: var(--accent); }
|
|
965
979
|
.ds-247420 .row.rail-purple::before { background: var(--purple-2, #7F18A4); }
|
|
966
980
|
.ds-247420 .row.rail-flame::before { background: var(--flame); }
|
|
967
981
|
.ds-247420 .row-grid { /* explicit grid-template-columns set inline */ }
|
|
982
|
+
/* A row with no leading code/index drops the empty first column so the title
|
|
983
|
+
takes the full width instead of wrapping in the narrow code gutter. */
|
|
984
|
+
.ds-247420 .row.row-nocode { grid-template-columns: minmax(0, 1fr) auto; }
|
|
968
985
|
|
|
969
|
-
.ds-247420 .row .code { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); }
|
|
970
|
-
.ds-247420 .row .title { font-family: var(--ff-body); font-weight: 600; font-size: var(--fs-lg); display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; }
|
|
986
|
+
.ds-247420 .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; }
|
|
987
|
+
.ds-247420 .row .title { font-family: var(--ff-body); font-weight: 600; font-size: var(--fs-lg); line-height: var(--lh-snug, 1.3); display: flex; align-items: baseline; gap: 10px; flex-wrap: wrap; min-width: 0; }
|
|
988
|
+
.ds-247420 .row .title .sub { font-family: var(--ff-body); font-weight: 400; font-size: var(--fs-sm); color: var(--fg-3); }
|
|
971
989
|
.ds-247420 .row .sub { font-family: var(--ff-body); font-weight: 400; font-size: var(--fs-sm); color: var(--fg-3); }
|
|
972
|
-
.ds-247420 .row .meta { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); text-align: right; }
|
|
990
|
+
.ds-247420 .row .meta { font-family: var(--ff-mono); font-size: var(--fs-xs); color: var(--fg-3); text-align: right; font-variant-numeric: tabular-nums; white-space: nowrap; align-self: center; }
|
|
991
|
+
/* WorksList meta pairs a label with a disclosure chevron, inline-aligned. */
|
|
992
|
+
.ds-247420 .ds-works-meta { display: inline-flex; align-items: center; gap: .4em; }
|
|
973
993
|
|
|
974
994
|
.ds-247420 a.row { text-decoration: none; }
|
|
975
995
|
|
|
@@ -2321,36 +2341,43 @@
|
|
|
2321
2341
|
.ds-247420 .chat-msg:nth-child(n+4) { animation-delay: 0.15s; }
|
|
2322
2342
|
}
|
|
2323
2343
|
|
|
2344
|
+
/* Calm composer (claude.ai/code): ONE bordered rounded-rect shell holding the
|
|
2345
|
+
context line, a borderless textarea, the hint, and an inline send button -
|
|
2346
|
+
not a stadium pill + a floating round send. The shell carries the border and
|
|
2347
|
+
the focus ring; the textarea fills it transparently. flex-wrap lets the
|
|
2348
|
+
context line and hint occupy their own rows above/below the input row. */
|
|
2324
2349
|
.ds-247420 .chat-composer {
|
|
2325
|
-
display: flex; align-items: flex-end; gap:
|
|
2326
|
-
padding: var(--space-
|
|
2327
|
-
|
|
2350
|
+
display: flex; align-items: flex-end; flex-wrap: wrap; gap: var(--space-2);
|
|
2351
|
+
padding: var(--space-2) var(--space-2) var(--space-2) var(--space-3);
|
|
2352
|
+
background: var(--bg);
|
|
2353
|
+
border: var(--bw-hair) solid var(--rule);
|
|
2354
|
+
border-radius: var(--r-2);
|
|
2328
2355
|
flex-shrink: 0;
|
|
2356
|
+
transition: border-color var(--dur-snap) var(--ease), box-shadow var(--dur-snap) var(--ease);
|
|
2357
|
+
}
|
|
2358
|
+
.ds-247420 .chat-composer:focus-within {
|
|
2359
|
+
border-color: var(--accent);
|
|
2360
|
+
box-shadow: 0 0 0 2px color-mix(in oklab, var(--accent) 18%, transparent);
|
|
2329
2361
|
}
|
|
2330
2362
|
.ds-247420 .chat-composer textarea {
|
|
2331
|
-
flex: 1; padding:
|
|
2332
|
-
background:
|
|
2333
|
-
border:
|
|
2363
|
+
flex: 1; min-width: 0; padding: 8px 4px;
|
|
2364
|
+
background: none; color: var(--fg);
|
|
2365
|
+
border: none; border-radius: 0;
|
|
2334
2366
|
font-family: inherit; font-size: var(--fs-sm);
|
|
2335
|
-
line-height: 1.
|
|
2336
|
-
min-height:
|
|
2367
|
+
line-height: 1.45; resize: none;
|
|
2368
|
+
min-height: 28px; max-height: 200px;
|
|
2337
2369
|
box-sizing: border-box; overflow-y: auto;
|
|
2338
2370
|
scrollbar-width: thin;
|
|
2339
2371
|
}
|
|
2340
2372
|
.ds-247420 .chat-composer textarea::placeholder { color: var(--fg-3); }
|
|
2341
|
-
.ds-247420 .chat-composer textarea:focus {
|
|
2342
|
-
background: var(--bg-2);
|
|
2343
|
-
border-color: var(--accent);
|
|
2344
|
-
box-shadow: 0 0 0 2px color-mix(in oklab, var(--accent) 20%, transparent);
|
|
2345
|
-
outline: none;
|
|
2346
|
-
}
|
|
2373
|
+
.ds-247420 .chat-composer textarea:focus { background: none; border: none; box-shadow: none; outline: none; }
|
|
2347
2374
|
.ds-247420 .chat-composer .send {
|
|
2348
|
-
width:
|
|
2375
|
+
width: 36px; height: 36px; border-radius: var(--r-1);
|
|
2349
2376
|
background: var(--accent); color: var(--accent-fg);
|
|
2350
2377
|
border: 0; cursor: pointer;
|
|
2351
2378
|
display: inline-flex; align-items: center; justify-content: center;
|
|
2352
2379
|
flex-shrink: 0;
|
|
2353
|
-
transition: background var(--dur-snap, .15s) var(--ease, ease)
|
|
2380
|
+
transition: background var(--dur-snap, .15s) var(--ease, ease);
|
|
2354
2381
|
}
|
|
2355
2382
|
.ds-247420 .chat-composer .send:disabled { opacity: .5; cursor: not-allowed; }
|
|
2356
2383
|
/* Ghost icon buttons in the toolbar (attach / emoji / more) — NOT the round
|
|
@@ -2364,8 +2391,8 @@
|
|
|
2364
2391
|
transition: background var(--dur-snap, .15s) var(--ease, ease), color var(--dur-snap, .15s) var(--ease, ease);
|
|
2365
2392
|
}
|
|
2366
2393
|
.ds-247420 .composer-btn:hover { background: color-mix(in oklab, var(--fg) 8%, transparent); color: var(--fg); }
|
|
2367
|
-
.ds-247420 .chat-composer .send:hover {
|
|
2368
|
-
.ds-247420 .chat-composer .send:active {
|
|
2394
|
+
.ds-247420 .chat-composer .send:hover { filter: brightness(1.08); }
|
|
2395
|
+
.ds-247420 .chat-composer .send:active { filter: brightness(0.94); }
|
|
2369
2396
|
.ds-247420 .chat-composer .send:focus-visible,
|
|
2370
2397
|
.ds-247420 .composer-btn:focus-visible {
|
|
2371
2398
|
outline: 2px solid var(--accent);
|
|
@@ -3213,6 +3240,12 @@
|
|
|
3213
3240
|
.ds-247420 .ws-shell.ws-no-pane.ws-pane-collapsed.ws-no-sessions { grid-template-columns: var(--ws-rail-w) 1fr var(--ws-pane-w); grid-template-areas: "rail content pane"; }
|
|
3214
3241
|
.ds-247420 .ws-shell.ws-rail-collapsed { --ws-rail-w: var(--ws-rail-w-collapsed); }
|
|
3215
3242
|
.ds-247420 .ws-shell.ws-pane-collapsed { --ws-pane-w: 0px; }
|
|
3243
|
+
/* Ease the rail/pane collapse. Track COUNT stays stable on collapse (only a
|
|
3244
|
+
width var flips), so grid-template-columns is animatable; reduced-motion
|
|
3245
|
+
drops it to an instant swap. */
|
|
3246
|
+
@media (prefers-reduced-motion: no-preference) {
|
|
3247
|
+
.ds-247420 .ws-shell { transition: grid-template-columns var(--dur-base) var(--ease); }
|
|
3248
|
+
}
|
|
3216
3249
|
|
|
3217
3250
|
/* Rail (left nav) */
|
|
3218
3251
|
.ds-247420 .ws-rail {
|
|
@@ -3283,9 +3316,17 @@
|
|
|
3283
3316
|
|
|
3284
3317
|
/* Content column */
|
|
3285
3318
|
.ds-247420 .ws-content { grid-area: content; min-width: 0; min-height: 0; display: flex; flex-direction: column; }
|
|
3286
|
-
|
|
3319
|
+
/* Crumb band is the top chrome of the content column: a stable height so the
|
|
3320
|
+
top edge aligns with the rail head, and a left gutter matching .ws-main so
|
|
3321
|
+
the trail text is not flush against the rail border. */
|
|
3322
|
+
.ds-247420 .ws-crumb { flex: 0 0 auto; min-height: 48px; padding: 0 var(--space-4); display: flex; align-items: center; gap: var(--space-1); border-bottom: var(--bw-hair) solid var(--bg-3); }
|
|
3287
3323
|
.ds-247420 .ws-crumb-main { flex: 1 1 auto; min-width: 0; }
|
|
3288
|
-
|
|
3324
|
+
/* Content column gutter. Claude-Code-class calm: file grid / dashboard / event
|
|
3325
|
+
list / history get a generous, consistent inner gutter instead of butting
|
|
3326
|
+
against the 1px column borders. The chat tab opts out via .ws-main--flush
|
|
3327
|
+
because the chat thread carries its own --measure gutter. */
|
|
3328
|
+
.ds-247420 .ws-main { flex: 1; min-height: 0; overflow: auto; display: flex; flex-direction: column; padding: var(--space-4) var(--space-5); }
|
|
3329
|
+
.ds-247420 .ws-main.ws-main--flush { padding: 0; }
|
|
3289
3330
|
.ds-247420 .ws-main:focus { outline: none; }
|
|
3290
3331
|
|
|
3291
3332
|
/* Right context pane */
|
|
@@ -3330,8 +3371,11 @@
|
|
|
3330
3371
|
.ds-247420 .ws-rail-collapsed .ws-rail-item-label, .ds-247420 .ws-rail-collapsed .ws-rail-brand { display: none; }
|
|
3331
3372
|
/* Tap-scrim behind an open drawer; dismiss on click. Hidden unless a drawer
|
|
3332
3373
|
is open so it never blocks the content area on desktop. */
|
|
3333
|
-
|
|
3334
|
-
|
|
3374
|
+
/* Scrim is always present on mobile so it can FADE with the drawer instead of
|
|
3375
|
+
hard-appearing via a display toggle; pointer-events gate keeps it inert
|
|
3376
|
+
while closed. Reduced-motion users get the global transition kill -> instant. */
|
|
3377
|
+
.ds-247420 .ws-scrim { display: block; opacity: 0; pointer-events: none; position: fixed; inset: 0; z-index: 41; background: color-mix(in srgb, var(--fg) 38%, transparent); transition: opacity var(--dur-base) var(--ease); }
|
|
3378
|
+
.ds-247420 .ws-shell.ws-sessions-open .ws-scrim, .ds-247420 .ws-shell.ws-pane-open .ws-scrim { opacity: 1; pointer-events: auto; }
|
|
3335
3379
|
/* The mobile drawer-toggle affordances live in the crumb bar. */
|
|
3336
3380
|
.ds-247420 .ws-drawer-toggle { display: inline-flex; }
|
|
3337
3381
|
}
|