@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.
- package/dist/AppShell.d.ts +5 -2
- package/dist/AppShell.d.ts.map +1 -1
- package/dist/AttachmentCard.d.ts.map +1 -1
- package/dist/Kbd.d.ts +7 -1
- package/dist/Kbd.d.ts.map +1 -1
- package/dist/Lightbox.d.ts.map +1 -1
- package/dist/SectionLabel.d.ts.map +1 -1
- package/dist/Sidebar.d.ts +7 -1
- package/dist/Sidebar.d.ts.map +1 -1
- package/dist/Toast.d.ts.map +1 -1
- package/dist/TopBar.d.ts +5 -2
- package/dist/TopBar.d.ts.map +1 -1
- package/dist/cn.d.ts.map +1 -1
- package/dist/eslint/index.js +1 -0
- package/dist/eslint/index.js.map +2 -2
- package/dist/eslint/no-restyled-part.d.ts.map +1 -1
- package/dist/index.js +486 -477
- package/dist/index.js.map +4 -4
- package/dist/looks.d.ts +2 -2
- package/dist/looks.d.ts.map +1 -1
- package/package.json +2 -1
- package/registry.json +62 -43
- package/src/AppShell.mdx +11 -3
- package/src/AppShell.stories.tsx +23 -12
- package/src/AppShell.test.tsx +20 -0
- package/src/AppShell.tsx +43 -24
- package/src/AttachmentCard.tsx +0 -1
- package/src/CommandPalette.tsx +1 -1
- package/src/ErrorBoundary.mdx +2 -2
- package/src/Kbd.tsx +10 -1
- package/src/Lightbox.tsx +4 -2
- package/src/Menu.tsx +1 -1
- package/src/MenuItem.stories.tsx +4 -9
- package/src/Popover.stories.tsx +3 -0
- package/src/SectionLabel.tsx +2 -0
- package/src/Select.tsx +2 -2
- package/src/Sidebar.tsx +10 -2
- package/src/TextInput.test.tsx +1 -1
- package/src/Toast.tsx +7 -6
- package/src/Tooltip.stories.tsx +9 -9
- package/src/Tooltip.test.tsx +1 -1
- package/src/Tooltip.tsx +3 -3
- package/src/TopBar.mdx +6 -4
- package/src/TopBar.tsx +6 -3
- package/src/cn.ts +1 -1
- package/src/eslint/no-restyled-part.ts +1 -0
- package/src/looks.ts +2 -2
- package/stories/TokensPage.tsx +17 -3
- package/tailwind-preset.js +10 -0
- 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-
|
|
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-
|
|
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. */
|
package/dist/looks.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"looks.d.ts","sourceRoot":"","sources":["../src/looks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,6JAA6J;AAC7J,eAAO,MAAM,iBAAiB,
|
|
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.
|
|
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.
|
|
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
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
4472
|
-
"rounded-lg border bg-bg-
|
|
4473
|
-
"rounded-lg border bg-bg-
|
|
4474
|
-
"rounded-lg border bg-bg-
|
|
4475
|
-
"rounded-lg border bg-bg-
|
|
4476
|
-
"rounded-lg border bg-bg-
|
|
4477
|
-
"rounded-lg border bg-bg-
|
|
4478
|
-
"rounded-lg border bg-bg-
|
|
4479
|
-
"rounded-lg border bg-bg-
|
|
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-
|
|
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-
|
|
4768
|
-
"bg-bg-
|
|
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
|
|
9
|
-
|
|
10
|
-
|
|
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).
|
package/src/AppShell.stories.tsx
CHANGED
|
@@ -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
|
-
<
|
|
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
|
-
<
|
|
96
|
-
|
|
97
|
-
|
|
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
|
-
<
|
|
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
|
-
<
|
|
134
|
-
<EmptyState message="Nothing here yet." />
|
|
135
|
-
</div>
|
|
146
|
+
<EmptyState message="Nothing here yet." />
|
|
136
147
|
</AppShell>
|
|
137
148
|
),
|
|
138
149
|
}
|
package/src/AppShell.test.tsx
CHANGED
|
@@ -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
|
|
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
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
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
|
)
|
package/src/AttachmentCard.tsx
CHANGED
|
@@ -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}`}
|
package/src/CommandPalette.tsx
CHANGED
|
@@ -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">
|
package/src/ErrorBoundary.mdx
CHANGED
|
@@ -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
|
-
{/*
|
|
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-
|
|
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
|
)
|