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 CHANGED
@@ -41,7 +41,7 @@ body {
41
41
  -webkit-font-smoothing: antialiased;
42
42
  text-rendering: optimizeLegibility;
43
43
  }
44
- ::selection { background: var(--mascot); color: var(--ink); }
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: 18px 22px;
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
- transition: background var(--dur-snap) var(--ease), padding var(--dur-base) var(--ease);
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: 4px; }
547
+ .row + .row { margin-top: 2px; }
545
548
  .row::before {
546
549
  content: '';
547
- position: absolute; left: 6px; top: 22%; bottom: 22%; width: 3px;
548
- background: transparent; border-radius: 3px;
549
- transition: background var(--dur-snap) var(--ease);
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
- .row:hover { background: var(--bg-2); }
555
- .row:hover::before { background: var(--rule-strong); }
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). Active/hover/error still win via their own rules below source order. */
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: 8px;
1925
- padding: var(--space-3) 0 0;
1926
- border-top: 1px solid color-mix(in oklab, var(--fg) 8%, transparent);
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: 12px 16px;
1931
- background: var(--bg-2); color: var(--fg);
1932
- border: 1px solid transparent; border-radius: var(--r-pill);
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.4; resize: none;
1935
- min-height: 44px; max-height: 200px;
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: 44px; height: 44px; border-radius: 50%;
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), transform .1s 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 { transform: scale(1.04); }
1967
- .chat-composer .send:active { transform: scale(0.96); }
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
- .ws-crumb { flex: 0 0 auto; display: flex; align-items: center; gap: var(--space-1); border-bottom: var(--bw-hair) solid var(--bg-3); }
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
- .ws-main { flex: 1; min-height: 0; overflow: auto; display: flex; flex-direction: column; }
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
- .ws-scrim { display: none; position: fixed; inset: 0; z-index: 41; background: color-mix(in srgb, var(--fg) 38%, transparent); }
2942
- .ws-shell.ws-sessions-open .ws-scrim, .ws-shell.ws-pane-open .ws-scrim { display: block; }
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(--mascot); color: var(--ink); }
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: 18px 22px;
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
- transition: background var(--dur-snap) var(--ease), padding var(--dur-base) var(--ease);
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: 4px; }
948
+ .ds-247420 .row + .row { margin-top: 2px; }
946
949
  .ds-247420 .row::before {
947
950
  content: '';
948
- position: absolute; left: 6px; top: 22%; bottom: 22%; width: 3px;
949
- background: transparent; border-radius: 3px;
950
- transition: background var(--dur-snap) var(--ease);
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
- .ds-247420 .row:hover { background: var(--bg-2); }
956
- .ds-247420 .row:hover::before { background: var(--rule-strong); }
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). Active/hover/error still win via their own rules below source order. */
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: 8px;
2326
- padding: var(--space-3) 0 0;
2327
- border-top: 1px solid color-mix(in oklab, var(--fg) 8%, transparent);
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: 12px 16px;
2332
- background: var(--bg-2); color: var(--fg);
2333
- border: 1px solid transparent; border-radius: var(--r-pill);
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.4; resize: none;
2336
- min-height: 44px; max-height: 200px;
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: 44px; height: 44px; border-radius: 50%;
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), transform .1s 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 { transform: scale(1.04); }
2368
- .ds-247420 .chat-composer .send:active { transform: scale(0.96); }
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
- .ds-247420 .ws-crumb { flex: 0 0 auto; display: flex; align-items: center; gap: var(--space-1); border-bottom: var(--bw-hair) solid var(--bg-3); }
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
- .ds-247420 .ws-main { flex: 1; min-height: 0; overflow: auto; display: flex; flex-direction: column; }
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
- .ds-247420 .ws-scrim { display: none; position: fixed; inset: 0; z-index: 41; background: color-mix(in srgb, var(--fg) 38%, transparent); }
3334
- .ds-247420 .ws-shell.ws-sessions-open .ws-scrim, .ds-247420 .ws-shell.ws-pane-open .ws-scrim { display: block; }
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
  }