@estiva-app/ui 0.37.2 → 0.39.0

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.
Files changed (50) hide show
  1. package/dist/AppShell.d.ts +5 -2
  2. package/dist/AppShell.d.ts.map +1 -1
  3. package/dist/AttachmentCard.d.ts.map +1 -1
  4. package/dist/Kbd.d.ts +7 -1
  5. package/dist/Kbd.d.ts.map +1 -1
  6. package/dist/Lightbox.d.ts.map +1 -1
  7. package/dist/SectionLabel.d.ts.map +1 -1
  8. package/dist/Sidebar.d.ts +7 -1
  9. package/dist/Sidebar.d.ts.map +1 -1
  10. package/dist/Toast.d.ts.map +1 -1
  11. package/dist/TopBar.d.ts +5 -2
  12. package/dist/TopBar.d.ts.map +1 -1
  13. package/dist/cn.d.ts.map +1 -1
  14. package/dist/eslint/index.js +1 -0
  15. package/dist/eslint/index.js.map +2 -2
  16. package/dist/eslint/no-restyled-part.d.ts.map +1 -1
  17. package/dist/index.js +486 -477
  18. package/dist/index.js.map +4 -4
  19. package/dist/looks.d.ts +2 -2
  20. package/dist/looks.d.ts.map +1 -1
  21. package/package.json +2 -1
  22. package/registry.json +62 -43
  23. package/src/AppShell.mdx +11 -3
  24. package/src/AppShell.stories.tsx +23 -12
  25. package/src/AppShell.test.tsx +20 -0
  26. package/src/AppShell.tsx +43 -24
  27. package/src/AttachmentCard.tsx +0 -1
  28. package/src/CommandPalette.tsx +1 -1
  29. package/src/ErrorBoundary.mdx +2 -2
  30. package/src/Kbd.tsx +10 -1
  31. package/src/Lightbox.tsx +4 -2
  32. package/src/Menu.tsx +1 -1
  33. package/src/MenuItem.stories.tsx +4 -9
  34. package/src/Popover.stories.tsx +3 -0
  35. package/src/SectionLabel.tsx +2 -0
  36. package/src/Select.tsx +2 -2
  37. package/src/Sidebar.tsx +10 -2
  38. package/src/TextInput.test.tsx +1 -1
  39. package/src/Toast.tsx +7 -6
  40. package/src/Tooltip.stories.tsx +9 -9
  41. package/src/Tooltip.test.tsx +1 -1
  42. package/src/Tooltip.tsx +3 -3
  43. package/src/TopBar.mdx +6 -4
  44. package/src/TopBar.tsx +6 -3
  45. package/src/cn.ts +1 -1
  46. package/src/eslint/no-restyled-part.ts +1 -0
  47. package/src/looks.ts +2 -2
  48. package/stories/TokensPage.tsx +17 -3
  49. package/tailwind-preset.js +10 -0
  50. package/tokens.css +144 -0
package/dist/looks.d.ts CHANGED
@@ -11,7 +11,7 @@
11
11
  * much room it takes stay in the part.
12
12
  */
13
13
  /** A field's box: TextInput and Textarea. The hairline strengthens on hover; focus comes after it, so a focused field keeps its colour under the pointer. */
14
- export declare const FIELD_BOX_CLASSES = "bg-bg-inset border border-border-default hover:border-border-strong focus:border-border-focus rounded-lg";
14
+ export declare const FIELD_BOX_CLASSES = "bg-bg-field border border-border-field shadow-field hover:border-border-strong focus:border-border-focus rounded-lg";
15
15
  /** What a field's words look like, typed or waiting: TextInput, Textarea and Select. */
16
16
  export declare const FIELD_TEXT_CLASSES = "text-text-primary placeholder:text-text-muted";
17
17
  /** A field that cannot be used: TextInput, Textarea and Select. */
@@ -24,7 +24,7 @@ export declare const FIELD_SIZE_CLASSES: {
24
24
  readonly small: "h-6 min-h-6 px-2 text-caption";
25
25
  };
26
26
  /** The box around an input that sits inside it, before its focus look: SearchInput and ChipInput. */
27
- export declare const FIELD_SHELL_CLASSES = "bg-bg-inset border border-border-default hover:border-border-strong rounded-lg transition-colors";
27
+ export declare const FIELD_SHELL_CLASSES = "bg-bg-field border border-border-field shadow-field hover:border-border-strong rounded-lg transition-colors";
28
28
  /** A panel that floats over the page: Menu's panel and Tooltip. */
29
29
  export declare const FLOATING_SURFACE_CLASSES = "rounded-lg border border-border-default bg-bg-elevated shadow-lg";
30
30
  /** A chip's words: Chip's label and Reaction's count. */
@@ -1 +1 @@
1
- {"version":3,"file":"looks.d.ts","sourceRoot":"","sources":["../src/looks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,6JAA6J;AAC7J,eAAO,MAAM,iBAAiB,6GAA6G,CAAA;AAE3I,wFAAwF;AACxF,eAAO,MAAM,kBAAkB,kDAAkD,CAAA;AAEjF,mEAAmE;AACnE,eAAO,MAAM,sBAAsB,qFAAqF,CAAA;AAExH,wEAAwE;AACxE,eAAO,MAAM,wBAAwB,4DAA4D,CAAA;AAEjG,kJAAkJ;AAClJ,eAAO,MAAM,kBAAkB;;;CAGrB,CAAA;AAEV,qGAAqG;AACrG,eAAO,MAAM,mBAAmB,qGAAqG,CAAA;AAErI,mEAAmE;AACnE,eAAO,MAAM,wBAAwB,qEAAqE,CAAA;AAE1G,yDAAyD;AACzD,eAAO,MAAM,iBAAiB,0FAA0F,CAAA;AAExH,4FAA4F;AAC5F,eAAO,MAAM,kBAAkB,8EAA8E,CAAA"}
1
+ {"version":3,"file":"looks.d.ts","sourceRoot":"","sources":["../src/looks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,6JAA6J;AAC7J,eAAO,MAAM,iBAAiB,wHAAwH,CAAA;AAEtJ,wFAAwF;AACxF,eAAO,MAAM,kBAAkB,kDAAkD,CAAA;AAEjF,mEAAmE;AACnE,eAAO,MAAM,sBAAsB,qFAAqF,CAAA;AAExH,wEAAwE;AACxE,eAAO,MAAM,wBAAwB,4DAA4D,CAAA;AAEjG,kJAAkJ;AAClJ,eAAO,MAAM,kBAAkB;;;CAGrB,CAAA;AAEV,qGAAqG;AACrG,eAAO,MAAM,mBAAmB,gHAAgH,CAAA;AAEhJ,mEAAmE;AACnE,eAAO,MAAM,wBAAwB,qEAAqE,CAAA;AAE1G,yDAAyD;AACzD,eAAO,MAAM,iBAAiB,0FAA0F,CAAA;AAExH,4FAA4F;AAC5F,eAAO,MAAM,kBAAkB,8EAA8E,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@estiva-app/ui",
3
- "version": "0.37.2",
3
+ "version": "0.39.0",
4
4
  "description": "Estiva's design tokens (the contract) and a small set of primitives (a convenience) for every Estiva app.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -53,6 +53,7 @@
53
53
  "test:watch": "vitest --project unit",
54
54
  "test:a11y": "vitest run --project storybook-signal --project storybook-ship",
55
55
  "test:stories": "vitest run --project storybook-draw",
56
+ "test:docs": "node scripts/docs-pages-draw.mjs",
56
57
  "typecheck": "tsc --noEmit",
57
58
  "prelint": "node build.mjs",
58
59
  "lint": "eslint .",
package/registry.json CHANGED
@@ -4,7 +4,7 @@
4
4
  "kind": "package",
5
5
  "repo": "estiva-ui",
6
6
  "package": "@estiva-app/ui",
7
- "packageVersion": "0.37.2",
7
+ "packageVersion": "0.39.0",
8
8
  "exports": 88,
9
9
  "typeExports": 97,
10
10
  "files": null
@@ -21,12 +21,12 @@
21
21
  "kind": "component",
22
22
  "importPath": "@estiva-app/ui",
23
23
  "sourceFile": "src/AppShell.tsx",
24
- "purpose": "The frame of an app, in the two manners that pair: `solid` — the structured frame, a solid TopBar over a Sidebar and the content beside it — and `floating` — the TopBar floating over the top edge, a Rail standing on the background, and the content living in the rounded card.",
24
+ "purpose": "The frame of an app, in three manners: `solid` — the structured frame, a solid TopBar over a Sidebar and the content beside it — `inset` — the same frame the other way round, the TopBar and the Sidebar standing on the ground and the content a lighter card beside them — and `floating` — the TopBar floating over the top edge, a Rail standing on the background, and the content living in the rounded card.",
25
25
  "purposeFrom": "page",
26
26
  "props": [
27
27
  {
28
28
  "name": "variant",
29
- "takes": "solid | floating",
29
+ "takes": "solid | floating | inset",
30
30
  "required": false,
31
31
  "note": null
32
32
  },
@@ -78,7 +78,8 @@
78
78
  "prop": "variant",
79
79
  "values": [
80
80
  "solid",
81
- "floating"
81
+ "floating",
82
+ "inset"
82
83
  ]
83
84
  }
84
85
  ],
@@ -952,7 +953,7 @@
952
953
  "app": null,
953
954
  "looks": [
954
955
  "bg-bg-elevated border border-border-subtle rounded-md",
955
- "bg-bg-inset border border-border-default hover:border-border-strong rounded-lg transition-colors focus-within:border-border-focus focus-within:hover:border-border-focus cursor-text signal:transition-shadow signal:focus-within:shadow-focus-ring",
956
+ "bg-bg-field border border-border-field shadow-field hover:border-border-strong rounded-lg transition-colors focus-within:border-border-focus focus-within:hover:border-border-focus cursor-text signal:transition-shadow signal:focus-within:shadow-focus-ring",
956
957
  "focus-within:border-border-focus focus-within:hover:border-border-focus cursor-text signal:transition-shadow signal:focus-within:shadow-focus-ring",
957
958
  "text-body-2 border-none bg-transparent text-text-primary placeholder:text-text-muted outline-none"
958
959
  ]
@@ -1889,7 +1890,7 @@
1889
1890
  "docPage": null,
1890
1891
  "app": null,
1891
1892
  "looks": [
1892
- "text-menu signal:font-mono signal:text-small signal:tracking-wider"
1893
+ "text-menu signal:font-mono signal:text-small signal:tracking-wider leaf:font-mono leaf:text-small leaf:tracking-wider"
1893
1894
  ]
1894
1895
  },
1895
1896
  {
@@ -2607,9 +2608,23 @@
2607
2608
  "takes": "text",
2608
2609
  "required": false,
2609
2610
  "note": null
2611
+ },
2612
+ {
2613
+ "name": "tone",
2614
+ "takes": "default | tooltip",
2615
+ "required": false,
2616
+ "note": "`tooltip` draws the key in the tooltip's own key colours, for a theme whose tooltip is darker than its page (Katerina, 27 September)."
2617
+ }
2618
+ ],
2619
+ "variants": [
2620
+ {
2621
+ "prop": "tone",
2622
+ "values": [
2623
+ "default",
2624
+ "tooltip"
2625
+ ]
2610
2626
  }
2611
2627
  ],
2612
- "variants": [],
2613
2628
  "ownsBehaviours": [],
2614
2629
  "status": "stable",
2615
2630
  "migrationStage": null,
@@ -2618,10 +2633,12 @@
2618
2633
  "docPage": "src/Kbd.mdx",
2619
2634
  "app": null,
2620
2635
  "looks": [
2621
- "whitespace-nowrap rounded-sm border border-border-strong bg-bg-inset font-sans text-caption text-text-secondary signal:border-b-2 signal:bg-bg-wash signal:font-mono signal:text-small ship:border-b-2 ship:bg-bg-wash ship:font-mono ship:text-small",
2636
+ "whitespace-nowrap rounded-sm border border-border-strong bg-bg-inset font-sans text-caption text-text-secondary signal:border-b-2 signal:bg-bg-wash signal:font-mono signal:text-small ship:border-b-2 ship:bg-bg-wash ship:font-mono ship:text-small leaf:font-mono leaf:text-small",
2637
+ "whitespace-nowrap rounded-sm border border-border-strong bg-bg-inset font-sans text-caption text-text-secondary signal:border-b-2 signal:bg-bg-wash signal:font-mono signal:text-small ship:border-b-2 ship:bg-bg-wash ship:font-mono ship:text-small leaf:font-mono leaf:text-small border-border-tooltip-key bg-bg-tooltip-key text-text-tooltip-key signal:bg-bg-tooltip-key ship:bg-bg-tooltip-key",
2622
2638
  "whitespace-nowrap rounded-sm border border-border-strong bg-bg-inset font-sans text-caption text-text-secondary",
2623
2639
  "signal:border-b-2 signal:bg-bg-wash signal:font-mono signal:text-small",
2624
- "ship:border-b-2 ship:bg-bg-wash ship:font-mono ship:text-small"
2640
+ "ship:border-b-2 ship:bg-bg-wash ship:font-mono ship:text-small",
2641
+ "border-border-tooltip-key bg-bg-tooltip-key text-text-tooltip-key signal:bg-bg-tooltip-key ship:bg-bg-tooltip-key"
2625
2642
  ]
2626
2643
  },
2627
2644
  {
@@ -2696,7 +2713,7 @@
2696
2713
  "docPage": "src/Lightbox.mdx",
2697
2714
  "app": null,
2698
2715
  "looks": [
2699
- "rounded-full bg-bg-elevated border border-border-strong text-text-secondary hover:text-text-primary"
2716
+ "rounded-full bg-bg-tooltip border border-border-tooltip-key text-text-tooltip-key hover:text-text-tooltip"
2700
2717
  ]
2701
2718
  },
2702
2719
  {
@@ -4184,7 +4201,7 @@
4184
4201
  "docPage": "src/SearchInput.mdx",
4185
4202
  "app": null,
4186
4203
  "looks": [
4187
- "bg-bg-inset border border-border-default hover:border-border-strong rounded-lg transition-colors focus-within:border-border-strong",
4204
+ "bg-bg-field border border-border-field shadow-field hover:border-border-strong rounded-lg transition-colors focus-within:border-border-strong",
4188
4205
  "text-input-value bg-transparent text-text-primary placeholder:text-text-muted outline-none"
4189
4206
  ]
4190
4207
  },
@@ -4339,13 +4356,14 @@
4339
4356
  "docPage": "src/SectionLabel.mdx",
4340
4357
  "app": null,
4341
4358
  "looks": [
4342
- "text-h5 leading-3 signal:font-mono signal:text-small signal:uppercase signal:tracking-widest text-text-secondary",
4343
- "text-h5 leading-3 signal:font-mono signal:text-small signal:uppercase signal:tracking-widest text-text-secondary truncate",
4344
- "text-h5 leading-3 signal:font-mono signal:text-small signal:uppercase signal:tracking-widest text-text-muted",
4345
- "text-h5 leading-3 signal:font-mono signal:text-small signal:uppercase signal:tracking-widest text-text-muted truncate",
4346
- "text-h5 leading-3 signal:font-mono signal:text-small signal:uppercase signal:tracking-widest text-text-primary",
4347
- "text-h5 leading-3 signal:font-mono signal:text-small signal:uppercase signal:tracking-widest text-text-primary truncate",
4348
- "text-h5 leading-3 signal:font-mono signal:text-small signal:uppercase signal:tracking-widest"
4359
+ "text-h5 leading-3 signal:font-mono signal:text-small signal:uppercase signal:tracking-widest leaf:font-mono leaf:text-small leaf:uppercase leaf:tracking-widest text-text-secondary",
4360
+ "text-h5 leading-3 signal:font-mono signal:text-small signal:uppercase signal:tracking-widest leaf:font-mono leaf:text-small leaf:uppercase leaf:tracking-widest text-text-secondary truncate",
4361
+ "text-h5 leading-3 signal:font-mono signal:text-small signal:uppercase signal:tracking-widest leaf:font-mono leaf:text-small leaf:uppercase leaf:tracking-widest text-text-muted",
4362
+ "text-h5 leading-3 signal:font-mono signal:text-small signal:uppercase signal:tracking-widest leaf:font-mono leaf:text-small leaf:uppercase leaf:tracking-widest text-text-muted truncate",
4363
+ "text-h5 leading-3 signal:font-mono signal:text-small signal:uppercase signal:tracking-widest leaf:font-mono leaf:text-small leaf:uppercase leaf:tracking-widest text-text-primary",
4364
+ "text-h5 leading-3 signal:font-mono signal:text-small signal:uppercase signal:tracking-widest leaf:font-mono leaf:text-small leaf:uppercase leaf:tracking-widest text-text-primary truncate",
4365
+ "text-h5 leading-3 signal:font-mono signal:text-small signal:uppercase signal:tracking-widest",
4366
+ "leaf:font-mono leaf:text-small leaf:uppercase leaf:tracking-widest"
4349
4367
  ]
4350
4368
  },
4351
4369
  {
@@ -4468,15 +4486,15 @@
4468
4486
  "docPage": "src/Select.mdx",
4469
4487
  "app": null,
4470
4488
  "looks": [
4471
- "rounded-lg border bg-bg-inset text-left border-border-default outline-none transition-colors text-text-primary placeholder:text-text-muted disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled focus-visible:border-border-focus aria-expanded:border-border-focus signal:transition-shadow signal:focus-visible:shadow-focus-ring text-input-value",
4472
- "rounded-lg border bg-bg-inset text-left border-border-default outline-none transition-colors text-text-primary placeholder:text-text-muted disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled focus-visible:border-border-focus aria-expanded:border-border-focus signal:transition-shadow signal:focus-visible:shadow-focus-ring text-caption",
4473
- "rounded-lg border bg-bg-inset text-left border-border-default outline-none transition-colors text-text-primary placeholder:text-text-muted disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled cursor-not-allowed bg-bg-disabled text-text-disabled focus-visible:border-border-focus aria-expanded:border-border-focus signal:transition-shadow signal:focus-visible:shadow-focus-ring text-input-value",
4474
- "rounded-lg border bg-bg-inset text-left border-border-default outline-none transition-colors text-text-primary placeholder:text-text-muted disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled cursor-not-allowed bg-bg-disabled text-text-disabled focus-visible:border-border-focus aria-expanded:border-border-focus signal:transition-shadow signal:focus-visible:shadow-focus-ring text-caption",
4475
- "rounded-lg border bg-bg-inset text-left border-border-default outline-none transition-colors text-text-primary placeholder:text-text-muted hover:border-border-strong focus-visible:hover:border-border-focus aria-expanded:hover:border-border-focus disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled focus-visible:border-border-focus aria-expanded:border-border-focus signal:transition-shadow signal:focus-visible:shadow-focus-ring text-input-value",
4476
- "rounded-lg border bg-bg-inset text-left border-border-default outline-none transition-colors text-text-primary placeholder:text-text-muted hover:border-border-strong focus-visible:hover:border-border-focus aria-expanded:hover:border-border-focus disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled focus-visible:border-border-focus aria-expanded:border-border-focus signal:transition-shadow signal:focus-visible:shadow-focus-ring text-caption",
4477
- "rounded-lg border bg-bg-inset text-left border-border-default outline-none transition-colors text-text-primary placeholder:text-text-muted hover:border-border-strong focus-visible:hover:border-border-focus aria-expanded:hover:border-border-focus disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled cursor-not-allowed bg-bg-disabled text-text-disabled focus-visible:border-border-focus aria-expanded:border-border-focus signal:transition-shadow signal:focus-visible:shadow-focus-ring text-input-value",
4478
- "rounded-lg border bg-bg-inset text-left border-border-default outline-none transition-colors text-text-primary placeholder:text-text-muted hover:border-border-strong focus-visible:hover:border-border-focus aria-expanded:hover:border-border-focus disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled cursor-not-allowed bg-bg-disabled text-text-disabled focus-visible:border-border-focus aria-expanded:border-border-focus signal:transition-shadow signal:focus-visible:shadow-focus-ring text-caption",
4479
- "rounded-lg border bg-bg-inset text-left"
4489
+ "rounded-lg border bg-bg-field shadow-field text-left border-border-field outline-none transition-colors text-text-primary placeholder:text-text-muted disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled focus-visible:border-border-focus aria-expanded:border-border-focus signal:transition-shadow signal:focus-visible:shadow-focus-ring text-input-value",
4490
+ "rounded-lg border bg-bg-field shadow-field text-left border-border-field outline-none transition-colors text-text-primary placeholder:text-text-muted disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled focus-visible:border-border-focus aria-expanded:border-border-focus signal:transition-shadow signal:focus-visible:shadow-focus-ring text-caption",
4491
+ "rounded-lg border bg-bg-field shadow-field text-left border-border-field outline-none transition-colors text-text-primary placeholder:text-text-muted disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled cursor-not-allowed bg-bg-disabled text-text-disabled focus-visible:border-border-focus aria-expanded:border-border-focus signal:transition-shadow signal:focus-visible:shadow-focus-ring text-input-value",
4492
+ "rounded-lg border bg-bg-field shadow-field text-left border-border-field outline-none transition-colors text-text-primary placeholder:text-text-muted disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled cursor-not-allowed bg-bg-disabled text-text-disabled focus-visible:border-border-focus aria-expanded:border-border-focus signal:transition-shadow signal:focus-visible:shadow-focus-ring text-caption",
4493
+ "rounded-lg border bg-bg-field shadow-field text-left border-border-field outline-none transition-colors text-text-primary placeholder:text-text-muted hover:border-border-strong focus-visible:hover:border-border-focus aria-expanded:hover:border-border-focus disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled focus-visible:border-border-focus aria-expanded:border-border-focus signal:transition-shadow signal:focus-visible:shadow-focus-ring text-input-value",
4494
+ "rounded-lg border bg-bg-field shadow-field text-left border-border-field outline-none transition-colors text-text-primary placeholder:text-text-muted hover:border-border-strong focus-visible:hover:border-border-focus aria-expanded:hover:border-border-focus disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled focus-visible:border-border-focus aria-expanded:border-border-focus signal:transition-shadow signal:focus-visible:shadow-focus-ring text-caption",
4495
+ "rounded-lg border bg-bg-field shadow-field text-left border-border-field outline-none transition-colors text-text-primary placeholder:text-text-muted hover:border-border-strong focus-visible:hover:border-border-focus aria-expanded:hover:border-border-focus disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled cursor-not-allowed bg-bg-disabled text-text-disabled focus-visible:border-border-focus aria-expanded:border-border-focus signal:transition-shadow signal:focus-visible:shadow-focus-ring text-input-value",
4496
+ "rounded-lg border bg-bg-field shadow-field text-left border-border-field outline-none transition-colors text-text-primary placeholder:text-text-muted hover:border-border-strong focus-visible:hover:border-border-focus aria-expanded:hover:border-border-focus disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled cursor-not-allowed bg-bg-disabled text-text-disabled focus-visible:border-border-focus aria-expanded:border-border-focus signal:transition-shadow signal:focus-visible:shadow-focus-ring text-caption",
4497
+ "rounded-lg border bg-bg-field shadow-field text-left"
4480
4498
  ]
4481
4499
  },
4482
4500
  {
@@ -4723,7 +4741,7 @@
4723
4741
  "docPage": "src/Textarea.mdx",
4724
4742
  "app": null,
4725
4743
  "looks": [
4726
- "bg-bg-inset border border-border-default hover:border-border-strong focus:border-border-focus rounded-lg text-input-value text-text-primary placeholder:text-text-muted resize-none outline-none transition-colors disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled signal:transition-shadow signal:focus:shadow-focus-ring"
4744
+ "bg-bg-field border border-border-field shadow-field hover:border-border-strong focus:border-border-focus rounded-lg text-input-value text-text-primary placeholder:text-text-muted resize-none outline-none transition-colors disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled signal:transition-shadow signal:focus:shadow-focus-ring"
4727
4745
  ]
4728
4746
  },
4729
4747
  {
@@ -4764,8 +4782,8 @@
4764
4782
  "docPage": "src/TextInput.mdx",
4765
4783
  "app": null,
4766
4784
  "looks": [
4767
- "bg-bg-inset border border-border-default hover:border-border-strong focus:border-border-focus rounded-lg text-input-value text-text-primary placeholder:text-text-muted outline-none transition-colors disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled signal:transition-shadow signal:focus:shadow-focus-ring",
4768
- "bg-bg-inset border border-border-default hover:border-border-strong focus:border-border-focus rounded-lg text-caption text-text-primary placeholder:text-text-muted outline-none transition-colors disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled signal:transition-shadow signal:focus:shadow-focus-ring"
4785
+ "bg-bg-field border border-border-field shadow-field hover:border-border-strong focus:border-border-focus rounded-lg text-input-value text-text-primary placeholder:text-text-muted outline-none transition-colors disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled signal:transition-shadow signal:focus:shadow-focus-ring",
4786
+ "bg-bg-field border border-border-field shadow-field hover:border-border-strong focus:border-border-focus rounded-lg text-caption text-text-primary placeholder:text-text-muted outline-none transition-colors disabled:pointer-events-none disabled:bg-bg-disabled disabled:text-text-disabled signal:transition-shadow signal:focus:shadow-focus-ring"
4769
4787
  ]
4770
4788
  },
4771
4789
  {
@@ -4847,11 +4865,11 @@
4847
4865
  "docPage": "src/Toast.mdx",
4848
4866
  "app": null,
4849
4867
  "looks": [
4850
- "bg-success-muted signal:bg-bg-inset signal:border signal:border-border-default signal:shadow-md",
4851
- "bg-accent-muted signal:bg-bg-inset signal:border signal:border-border-default signal:shadow-md",
4852
- "bg-bg-inset border border-border-subtle signal:border-border-default signal:shadow-md",
4853
- "bg-warning-muted signal:bg-bg-inset signal:border signal:border-border-default signal:shadow-md",
4854
- "bg-error-muted signal:bg-bg-inset signal:border signal:border-border-default signal:shadow-md"
4868
+ "bg-success-muted signal:bg-bg-inset signal:border signal:border-border-default signal:shadow-md leaf:bg-bg-inset leaf:border leaf:border-border-default leaf:shadow-md",
4869
+ "bg-accent-muted signal:bg-bg-inset signal:border signal:border-border-default signal:shadow-md leaf:bg-bg-inset leaf:border leaf:border-border-default leaf:shadow-md",
4870
+ "bg-bg-inset border border-border-subtle signal:border-border-default signal:shadow-md leaf:bg-bg-inset leaf:border leaf:border-border-default leaf:shadow-md",
4871
+ "bg-warning-muted signal:bg-bg-inset signal:border signal:border-border-default signal:shadow-md leaf:bg-bg-inset leaf:border leaf:border-border-default leaf:shadow-md",
4872
+ "bg-error-muted signal:bg-bg-inset signal:border signal:border-border-default signal:shadow-md leaf:bg-bg-inset leaf:border leaf:border-border-default leaf:shadow-md"
4855
4873
  ]
4856
4874
  },
4857
4875
  {
@@ -4896,11 +4914,11 @@
4896
4914
  "docPage": null,
4897
4915
  "app": null,
4898
4916
  "looks": [
4899
- "bg-success-muted signal:bg-bg-inset signal:border signal:border-border-default signal:shadow-md",
4900
- "bg-accent-muted signal:bg-bg-inset signal:border signal:border-border-default signal:shadow-md",
4901
- "bg-bg-inset border border-border-subtle signal:border-border-default signal:shadow-md",
4902
- "bg-warning-muted signal:bg-bg-inset signal:border signal:border-border-default signal:shadow-md",
4903
- "bg-error-muted signal:bg-bg-inset signal:border signal:border-border-default signal:shadow-md"
4917
+ "bg-success-muted signal:bg-bg-inset signal:border signal:border-border-default signal:shadow-md leaf:bg-bg-inset leaf:border leaf:border-border-default leaf:shadow-md",
4918
+ "bg-accent-muted signal:bg-bg-inset signal:border signal:border-border-default signal:shadow-md leaf:bg-bg-inset leaf:border leaf:border-border-default leaf:shadow-md",
4919
+ "bg-bg-inset border border-border-subtle signal:border-border-default signal:shadow-md leaf:bg-bg-inset leaf:border leaf:border-border-default leaf:shadow-md",
4920
+ "bg-warning-muted signal:bg-bg-inset signal:border signal:border-border-default signal:shadow-md leaf:bg-bg-inset leaf:border leaf:border-border-default leaf:shadow-md",
4921
+ "bg-error-muted signal:bg-bg-inset signal:border signal:border-border-default signal:shadow-md leaf:bg-bg-inset leaf:border leaf:border-border-default leaf:shadow-md"
4904
4922
  ]
4905
4923
  },
4906
4924
  {
@@ -5316,7 +5334,7 @@
5316
5334
  "docPage": "src/Tooltip.mdx",
5317
5335
  "app": null,
5318
5336
  "looks": [
5319
- "rounded-lg border border-border-default bg-bg-elevated shadow-lg"
5337
+ "rounded-lg border border-border-default bg-bg-elevated shadow-lg border-border-tooltip bg-bg-tooltip"
5320
5338
  ]
5321
5339
  },
5322
5340
  {
@@ -5395,7 +5413,7 @@
5395
5413
  "props": [
5396
5414
  {
5397
5415
  "name": "variant",
5398
- "takes": "solid | floating",
5416
+ "takes": "solid | floating | inset",
5399
5417
  "required": false,
5400
5418
  "note": null
5401
5419
  },
@@ -5435,7 +5453,8 @@
5435
5453
  "prop": "variant",
5436
5454
  "values": [
5437
5455
  "solid",
5438
- "floating"
5456
+ "floating",
5457
+ "inset"
5439
5458
  ]
5440
5459
  }
5441
5460
  ],
package/src/AppShell.mdx CHANGED
@@ -5,14 +5,18 @@ import * as AppShellStories from './AppShell.stories'
5
5
 
6
6
  # AppShell
7
7
 
8
- The frame of an app, in the two manners that pair: **`solid`** — the
9
- structured frame, a solid TopBar over a Sidebar and the content beside
10
- it — and **`floating`** — the TopBar floating over the top edge, a Rail
8
+ The frame of an app, in three manners: **`solid`** — the structured
9
+ frame, a solid TopBar over a Sidebar and the content beside it —
10
+ **`inset`** — the same frame the other way round, the TopBar and the
11
+ Sidebar standing on the ground and the content a lighter card beside
12
+ them — and **`floating`** — the TopBar floating over the top edge, a Rail
11
13
  standing on the background, and the content living in the rounded card.
12
14
  Layout only: no data, no routes.
13
15
 
14
16
  <Canvas of={AppShellStories.Solid} />
15
17
 
18
+ <Canvas of={AppShellStories.Inset} />
19
+
16
20
  <Canvas of={AppShellStories.Floating} />
17
21
 
18
22
  ## When
@@ -20,6 +24,10 @@ Layout only: no data, no routes.
20
24
  - **`solid` + Sidebar** — a place-by-place app: labelled entries, counts,
21
25
  groups. Sidebar and main scroll independently, so a long list never
22
26
  scrolls the navigation away.
27
+ - **`inset` + Sidebar** — the same place-by-place app, when its pages
28
+ read as one sheet on a desk: the content is a card 16px from the right
29
+ and bottom, with 8px corners, and the Sidebar drops its line and surface
30
+ by itself. Any theme: the ground and the card are its base and surface.
23
31
  - **`floating` + Rail** — an app with a handful of top-level places and
24
32
  its content in one card; the `menu` button in the bar collapses the
25
33
  rail (the collapsing stays the app's).
@@ -66,9 +66,7 @@ const rail = (
66
66
  export const Solid: Story = {
67
67
  render: (args) => (
68
68
  <AppShell {...args} logo="Estiva" search={<SearchInput shortcut="Ctrl+K" className="w-[290px]" />} identity={identity} nav={sidebar}>
69
- <div className="flex h-full items-center justify-center">
70
- <EmptyState message="Nothing here yet." />
71
- </div>
69
+ <EmptyState message="Nothing here yet." />
72
70
  </AppShell>
73
71
  ),
74
72
  }
@@ -92,9 +90,26 @@ export const SolidScrolls: Story = {
92
90
  export const SolidWithBanner: Story = {
93
91
  render: (args) => (
94
92
  <AppShell {...args} logo="Estiva" identity={identity} nav={sidebar} banner={<Banner tone="ok">Public key copied.</Banner>}>
95
- <div className="flex h-full items-center justify-center">
96
- <EmptyState message="Nothing here yet." />
97
- </div>
93
+ <EmptyState message="Nothing here yet." />
94
+ </AppShell>
95
+ ),
96
+ }
97
+
98
+ /** The structured frame the other way round: the bar and the sidebar on the ground, the content a lighter card beside them. */
99
+ export const Inset: Story = {
100
+ args: { variant: 'inset' },
101
+ render: (args) => (
102
+ <AppShell {...args} logo="Estiva" search={<SearchInput shortcut="Ctrl+K" className="w-[290px]" />} identity={identity} nav={sidebar}>
103
+ <EmptyState message="Nothing here yet." />
104
+ </AppShell>
105
+ ),
106
+ }
107
+
108
+ export const InsetWithBanner: Story = {
109
+ args: { variant: 'inset' },
110
+ render: (args) => (
111
+ <AppShell {...args} logo="Estiva" identity={identity} nav={sidebar} banner={<Banner tone="ok">Public key copied.</Banner>}>
112
+ <EmptyState message="Nothing here yet." />
98
113
  </AppShell>
99
114
  ),
100
115
  }
@@ -111,9 +126,7 @@ export const Floating: Story = {
111
126
  identity={identity}
112
127
  nav={rail}
113
128
  >
114
- <div className="flex h-full items-center justify-center">
115
- <EmptyState message="Nothing here yet." />
116
- </div>
129
+ <EmptyState message="Nothing here yet." />
117
130
  </AppShell>
118
131
  ),
119
132
  }
@@ -130,9 +143,7 @@ export const FloatingWithBanner: Story = {
130
143
  nav={rail}
131
144
  banner={<Banner tone="info">A new version is available. Reload when convenient.</Banner>}
132
145
  >
133
- <div className="flex h-full items-center justify-center">
134
- <EmptyState message="Nothing here yet." />
135
- </div>
146
+ <EmptyState message="Nothing here yet." />
136
147
  </AppShell>
137
148
  ),
138
149
  }
@@ -9,6 +9,7 @@
9
9
  import { afterEach, describe, expect, it } from 'vitest'
10
10
  import { cleanup, render, screen } from '@testing-library/react'
11
11
  import { AppShell } from './AppShell'
12
+ import { Sidebar } from './Sidebar'
12
13
 
13
14
  afterEach(cleanup)
14
15
 
@@ -26,6 +27,25 @@ describe('AppShell', () => {
26
27
  expect(main.className).not.toContain('overflow-y-auto')
27
28
  })
28
29
 
30
+ it('stands the sidebar on the ground and makes the content a panel in the inset manner, and only there', () => {
31
+ const frame = (variant: 'solid' | 'inset') =>
32
+ render(
33
+ <AppShell variant={variant} nav={<Sidebar>Rows</Sidebar>}>
34
+ <p>Page</p>
35
+ </AppShell>,
36
+ )
37
+ const { unmount } = frame('solid')
38
+ expect(screen.getByRole('navigation').className).toContain('border-r')
39
+ expect(screen.getByRole('banner').className).toContain('border-b')
40
+ unmount()
41
+ frame('inset')
42
+ expect(screen.getByRole('navigation').className).not.toMatch(/border-r|bg-bg-surface/)
43
+ expect(screen.getByRole('banner').className).not.toMatch(/border-b|bg-bg-surface/)
44
+ const panel = screen.getByRole('main').closest('.rounded-lg')
45
+ expect(panel?.className).toContain('bg-bg-surface')
46
+ expect(panel?.className).toContain('mr-4')
47
+ })
48
+
29
49
  it('leaves the floating manner’s card as it was', () => {
30
50
  render(
31
51
  <AppShell variant="floating" nav={<nav>Nav</nav>}>
package/src/AppShell.tsx CHANGED
@@ -1,10 +1,12 @@
1
1
  import type { ReactNode } from 'react'
2
2
  import { cn } from './cn'
3
+ import { Card } from './Card'
3
4
  import { ScrollArea } from './ScrollArea'
5
+ import { SidebarOnGround } from './Sidebar'
4
6
  import { TopBar } from './TopBar'
5
7
 
6
8
  /**
7
- * The frame of an app, in the two manners that pair with the TopBar's
9
+ * The frame of an app, in the manners that pair with the TopBar's
8
10
  * (Katerina, 2026-09-02: the two shells go together — the solid bar with
9
11
  * the sidebar, the floating bar with the rail):
10
12
  *
@@ -15,6 +17,9 @@ import { TopBar } from './TopBar'
15
17
  * edge, the rail stands on the app background, and the content lives
16
18
  * in the rounded card beside it (2026-09-02, the floating app's frame
17
19
  * geometry; its collapse animation and launcher stay in the app).
20
+ * - `inset` — the structured frame, the other way round: the TopBar and
21
+ * the Sidebar stand on the ground, and the content is a lighter card
22
+ * beside them (Katerina, 28 September: Linear's layout, in any theme).
18
23
  *
19
24
  * The banner belongs to the content area (her ruling, 2026-09-02): it
20
25
  * renders at the top of the main column — inside the card, in the
@@ -24,7 +29,7 @@ import { TopBar } from './TopBar'
24
29
  * has no data and no routes.
25
30
  */
26
31
  export interface AppShellProps {
27
- variant?: 'solid' | 'floating'
32
+ variant?: 'solid' | 'floating' | 'inset'
28
33
  /** The top bar's menu button, in an app whose navigation collapses. */
29
34
  menu?: ReactNode
30
35
  /** The top bar's left: the app's logo mark, or its name as text. */
@@ -42,6 +47,7 @@ export interface AppShellProps {
42
47
 
43
48
  export function AppShell({ variant = 'solid', menu, logo, search, identity, banner, nav, children }: AppShellProps) {
44
49
  const bar = <TopBar variant={variant} menu={menu} logo={logo} search={search} right={identity} />
50
+ const inset = variant === 'inset'
45
51
 
46
52
  if (variant === 'floating') {
47
53
  return (
@@ -66,6 +72,30 @@ export function AppShell({ variant = 'solid', menu, logo, search, identity, bann
66
72
  )
67
73
  }
68
74
 
75
+ const column = (
76
+ <>
77
+ {banner}
78
+ {/* The frame owns the page's scrollbar (Katerina, 2026-09-09: the
79
+ Issues page still had a native bar — D40 said everywhere, and the
80
+ one place every page passes through had been left out). A
81
+ `ScrollArea` here means no page can forget it. The content box is
82
+ at least the viewport's height and grows with a tall page, so Base
83
+ UI sees its size change (the morning's phantom bar was a content
84
+ box it could not watch); `main` fills it as a flex column. The
85
+ page contract (the AppShell page says it): a page is a flex
86
+ child of `main` — `flex-1` to fill and scroll here; `flex-1
87
+ min-h-0 [contain:size]` to take exactly the frame's height and
88
+ scroll inside itself, as Ship's detail grids do — and the outer
89
+ region, with nothing to scroll, passes the wheel through. Never
90
+ `h-full`: a box that is *at least* the viewport's height gives a
91
+ percentage nothing to resolve against — measured, all four Ship
92
+ pages, 2026-09-09. */}
93
+ <ScrollArea className="min-h-0 flex-1" contentClassName="flex min-h-full flex-col">
94
+ <main className="flex min-w-0 flex-1 flex-col">{children}</main>
95
+ </ScrollArea>
96
+ </>
97
+ )
98
+
69
99
  return (
70
100
  /* `relative overflow-hidden` is the seal the floating manner already has
71
101
  (and the ScrollArea's own root is `relative`, so an absolutely placed
@@ -79,28 +109,17 @@ export function AppShell({ variant = 'solid', menu, logo, search, identity, bann
79
109
  <div className="relative flex h-full min-h-0 flex-col overflow-hidden bg-bg-base text-text-primary">
80
110
  {bar}
81
111
  <div className="flex min-h-0 flex-1">
82
- {nav}
83
- <div className="flex min-h-0 min-w-0 flex-1 flex-col">
84
- {banner}
85
- {/* The frame owns the page's scrollbar (Katerina, 2026-09-09: the
86
- Issues page still had a native bar — D40 said everywhere, and the
87
- one place every page passes through had been left out). A
88
- `ScrollArea` here means no page can forget it. The content box is
89
- at least the viewport's height and grows with a tall page, so Base
90
- UI sees its size change (the morning's phantom bar was a content
91
- box it could not watch); `main` fills it as a flex column. The
92
- page contract (the AppShell page says it): a page is a flex
93
- child of `main` — `flex-1` to fill and scroll here; `flex-1
94
- min-h-0 [contain:size]` to take exactly the frame's height and
95
- scroll inside itself, as Ship's detail grids do — and the outer
96
- region, with nothing to scroll, passes the wheel through. Never
97
- `h-full`: a box that is *at least* the viewport's height gives a
98
- percentage nothing to resolve against — measured, all four Ship
99
- pages, 2026-09-09. */}
100
- <ScrollArea className="min-h-0 flex-1" contentClassName="flex min-h-full flex-col">
101
- <main className="flex min-w-0 flex-1 flex-col">{children}</main>
102
- </ScrollArea>
103
- </div>
112
+ <SidebarOnGround.Provider value={inset}>{nav}</SidebarOnGround.Provider>
113
+ {/* `inset`: the content is a card on the ground, the Card's own surface look,
114
+ 16px from the right and bottom as the floating card is, 8px corners (Katerina,
115
+ 28 September). */}
116
+ {inset ? (
117
+ <Card fill="surface" clip className="mb-4 mr-4 flex min-h-0 min-w-0 flex-1 flex-col">
118
+ {column}
119
+ </Card>
120
+ ) : (
121
+ <div className="flex min-h-0 min-w-0 flex-1 flex-col">{column}</div>
122
+ )}
104
123
  </div>
105
124
  </div>
106
125
  )
@@ -390,7 +390,6 @@ export function AttachmentCard({
390
390
  {/* On Base UI's Button, as InputChip's ✕ is (Katerina, 2026-09-14): IconButton is a 24px square
391
391
  that fills on hover, and this is Peek's 20px round badge on the card's corner. */}
392
392
  {onRemove && (
393
- // @estiva-escape(no-copied-look): N4 (Katerina, 24 September: record only): the small round button Lightbox's close also draws; a part if a third appears
394
393
  <BaseButton
395
394
  type="button"
396
395
  aria-label={`Remove ${name}`}
@@ -175,7 +175,7 @@ type Key = [key: string, word: string]
175
175
  function Footer({ keys }: { keys: Key[] }) {
176
176
  const { where } = usePalette('The footer')
177
177
  return (
178
- <div className="flex h-9 shrink-0 items-center gap-4 border-t border-border-subtle px-5 text-caption text-text-secondary signal:font-mono signal:text-small signal:text-text-muted">
178
+ <div className="flex h-9 shrink-0 items-center gap-4 border-t border-border-subtle px-5 text-caption text-text-secondary signal:font-mono signal:text-small signal:text-text-muted leaf:font-mono leaf:text-small">
179
179
  <span className="min-w-0 flex-1 truncate">{where}</span>
180
180
  {keys.map(([key, word]) => (
181
181
  <span key={key} className="flex shrink-0 items-center gap-1.5">
@@ -16,7 +16,7 @@ page keeps working.
16
16
  - Around each part of the page that can break on its own: a column, a panel,
17
17
  a conversation — and once around the whole app.
18
18
  - `label` says what it holds, in the message and the console line: "Something
19
- went wrong in the {label}."
19
+ went wrong in the \{label\}."
20
20
  - `fallbackClassName` is the room the message fills where no flex column
21
21
  holds it: the whole screen, for the app's own.
22
22
  - `frame` draws the message inside a frame of yours, in the same place.
@@ -48,7 +48,7 @@ import { ErrorBoundary } from '@estiva-app/ui'
48
48
  is given and centres itself in it.
49
49
  - Try again draws the part again. If what broke is still broken, the message
50
50
  comes back.
51
- - A crash is written to the console: "{label} crashed:", the error, and where
51
+ - A crash is written to the console: "\{label\} crashed:", the error, and where
52
52
  it happened.
53
53
 
54
54
  ## What it owns
package/src/Kbd.tsx CHANGED
@@ -24,15 +24,24 @@ import { cn } from './cn'
24
24
  export interface KbdProps {
25
25
  children: ReactNode
26
26
  className?: string
27
+ /**
28
+ * `tooltip` draws the key in the tooltip's own key colours, for a theme whose
29
+ * tooltip is darker than its page (Katerina, 27 September). `Tooltip` passes it
30
+ * for its shortcut; nothing else needs to.
31
+ */
32
+ tone?: 'default' | 'tooltip'
27
33
  }
28
34
 
29
- export function Kbd({ children, className }: KbdProps) {
35
+ export function Kbd({ children, className, tone = 'default' }: KbdProps) {
30
36
  return (
31
37
  <kbd
32
38
  className={cn(
33
39
  'inline-flex shrink-0 items-center justify-center whitespace-nowrap rounded-sm border border-border-strong bg-bg-inset px-1 py-px font-sans text-caption text-text-secondary',
34
40
  'signal:border-b-2 signal:pt-[2px] signal:pb-px signal:bg-bg-wash signal:font-mono signal:text-small',
35
41
  'ship:border-b-2 ship:pt-[2px] ship:pb-px ship:bg-bg-wash ship:font-mono ship:text-small',
42
+ // Leaf sets its keys in mono, as Signal does (Katerina, 28 September): the type, not the key's shape.
43
+ 'leaf:font-mono leaf:text-small',
44
+ tone === 'tooltip' && 'border-border-tooltip-key bg-bg-tooltip-key text-text-tooltip-key signal:bg-bg-tooltip-key ship:bg-bg-tooltip-key',
36
45
  className,
37
46
  )}
38
47
  >
package/src/Lightbox.tsx CHANGED
@@ -74,10 +74,12 @@ export function Lightbox({ src, alt, onClose, className }: LightboxProps) {
74
74
  onClick={(e) => e.stopPropagation()}
75
75
  className={cn('max-w-full max-h-full object-contain rounded-lg', className)}
76
76
  />
77
- {/* @estiva-escape(no-copied-look): N4 (Katerina, 24 September: record only): the small round button AttachmentCard's remove also draws; a part if a third appears */}
77
+ {/* On the dark scrim in every theme, so it wears the tooltip's dark colours (Katerina,
78
+ 28 September: Leaf's white circle stood out); in the other themes they are the
79
+ elevated ground, the strong line and the secondary text it always had. */}
78
80
  <Dialog.Close
79
81
  aria-label="Close"
80
- className="absolute top-4 right-4 size-8 rounded-full bg-bg-elevated border border-border-strong flex items-center justify-center text-text-secondary hover:text-text-primary"
82
+ className="absolute top-4 right-4 size-8 rounded-full bg-bg-tooltip border border-border-tooltip-key flex items-center justify-center text-text-tooltip-key hover:text-text-tooltip"
81
83
  >
82
84
  <IconX size={16} stroke={1.5} />
83
85
  </Dialog.Close>
package/src/Menu.tsx CHANGED
@@ -552,7 +552,7 @@ export function EnterHint({ target }: { target?: string }) {
552
552
  <span className="flex shrink-0 items-center gap-1.5 text-text-muted">
553
553
  <Kbd>↩ Enter</Kbd>
554
554
  {target && (
555
- <span className="text-menu signal:font-mono signal:text-small signal:tracking-wider">{target}</span>
555
+ <span className="text-menu signal:font-mono signal:text-small signal:tracking-wider leaf:font-mono leaf:text-small leaf:tracking-wider">{target}</span>
556
556
  )}
557
557
  </span>
558
558
  )