@estiva-app/ui 0.1.0 → 0.3.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/README.md +12 -9
- package/base.css +43 -0
- package/dist/AppShell.d.ts +39 -0
- package/dist/AppShell.d.ts.map +1 -0
- package/dist/Avatar.d.ts +7 -2
- package/dist/Avatar.d.ts.map +1 -1
- package/dist/AvatarGroup.d.ts +23 -0
- package/dist/AvatarGroup.d.ts.map +1 -0
- package/dist/Banner.d.ts +19 -0
- package/dist/Banner.d.ts.map +1 -0
- package/dist/Breadcrumb.d.ts +28 -0
- package/dist/Breadcrumb.d.ts.map +1 -0
- package/dist/Checkbox.d.ts +18 -0
- package/dist/Checkbox.d.ts.map +1 -0
- package/dist/ChipInput.d.ts +57 -0
- package/dist/ChipInput.d.ts.map +1 -0
- package/dist/ConfirmDialog.d.ts +22 -0
- package/dist/ConfirmDialog.d.ts.map +1 -0
- package/dist/DialogShell.d.ts +9 -2
- package/dist/DialogShell.d.ts.map +1 -1
- package/dist/EditableText.d.ts +56 -0
- package/dist/EditableText.d.ts.map +1 -0
- package/dist/IdentityMenu.d.ts +58 -0
- package/dist/IdentityMenu.d.ts.map +1 -0
- package/dist/Menu.d.ts +82 -0
- package/dist/Menu.d.ts.map +1 -0
- package/dist/NavItem.d.ts +26 -0
- package/dist/NavItem.d.ts.map +1 -0
- package/dist/Person.d.ts +26 -0
- package/dist/Person.d.ts.map +1 -0
- package/dist/PersonTrigger.d.ts +23 -0
- package/dist/PersonTrigger.d.ts.map +1 -0
- package/dist/Property.d.ts +24 -0
- package/dist/Property.d.ts.map +1 -0
- package/dist/Rail.d.ts +18 -0
- package/dist/Rail.d.ts.map +1 -0
- package/dist/RailItem.d.ts +23 -0
- package/dist/RailItem.d.ts.map +1 -0
- package/dist/SearchInput.d.ts +21 -0
- package/dist/SearchInput.d.ts.map +1 -0
- package/dist/SectionHeader.d.ts +34 -0
- package/dist/SectionHeader.d.ts.map +1 -0
- package/dist/SectionLabel.d.ts +19 -0
- package/dist/SectionLabel.d.ts.map +1 -0
- package/dist/Select.d.ts +42 -5
- package/dist/Select.d.ts.map +1 -1
- package/dist/Sidebar.d.ts +18 -0
- package/dist/Sidebar.d.ts.map +1 -0
- package/dist/Tabs.d.ts +34 -0
- package/dist/Tabs.d.ts.map +1 -0
- package/dist/Toast.d.ts +48 -0
- package/dist/Toast.d.ts.map +1 -0
- package/dist/Tooltip.d.ts +3 -1
- package/dist/Tooltip.d.ts.map +1 -1
- package/dist/TopBar.d.ts +33 -0
- package/dist/TopBar.d.ts.map +1 -0
- package/dist/cn.d.ts +14 -4
- package/dist/cn.d.ts.map +1 -1
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1254 -106
- package/dist/index.js.map +4 -4
- package/package.json +5 -2
- package/src/AppShell.mdx +66 -0
- package/src/AppShell.stories.tsx +117 -0
- package/src/AppShell.tsx +77 -0
- package/src/Avatar.initials.test.ts +21 -0
- package/src/Avatar.mdx +49 -0
- package/src/Avatar.tsx +12 -9
- package/src/AvatarGroup.mdx +39 -0
- package/src/AvatarGroup.stories.tsx +56 -0
- package/src/AvatarGroup.tsx +42 -0
- package/src/Banner.mdx +45 -0
- package/src/Banner.stories.tsx +35 -0
- package/src/Banner.tsx +35 -0
- package/src/Breadcrumb.mdx +52 -0
- package/src/Breadcrumb.stories.tsx +42 -0
- package/src/Breadcrumb.tsx +106 -0
- package/src/Button.mdx +57 -0
- package/src/Checkbox.mdx +44 -0
- package/src/Checkbox.stories.tsx +49 -0
- package/src/Checkbox.tsx +46 -0
- package/src/Chip.mdx +43 -0
- package/src/ChipInput.mdx +68 -0
- package/src/ChipInput.stories.tsx +99 -0
- package/src/ChipInput.tsx +247 -0
- package/src/ConfirmDialog.mdx +51 -0
- package/src/ConfirmDialog.stories.tsx +63 -0
- package/src/ConfirmDialog.tsx +55 -0
- package/src/DialogShell.mdx +68 -0
- package/src/DialogShell.tsx +12 -5
- package/src/Divider.mdx +41 -0
- package/src/EditableText.mdx +59 -0
- package/src/EditableText.stories.tsx +63 -0
- package/src/EditableText.tsx +169 -0
- package/src/EmptyState.mdx +41 -0
- package/src/Field.mdx +39 -0
- package/src/IconButton.mdx +47 -0
- package/src/IdentityMenu.mdx +62 -0
- package/src/IdentityMenu.stories.tsx +52 -0
- package/src/IdentityMenu.tsx +159 -0
- package/src/Menu.mdx +111 -0
- package/src/Menu.stories.tsx +66 -0
- package/src/Menu.tsx +172 -0
- package/src/MenuItem.mdx +55 -0
- package/src/MenuItem.stories.tsx +98 -0
- package/src/NavItem.mdx +53 -0
- package/src/NavItem.stories.tsx +36 -0
- package/src/NavItem.tsx +53 -0
- package/src/Person.mdx +44 -0
- package/src/Person.stories.tsx +43 -0
- package/src/Person.tsx +39 -0
- package/src/PersonTrigger.mdx +51 -0
- package/src/PersonTrigger.stories.tsx +30 -0
- package/src/PersonTrigger.tsx +62 -0
- package/src/Property.mdx +51 -0
- package/src/Property.stories.tsx +91 -0
- package/src/Property.tsx +44 -0
- package/src/Rail.tsx +26 -0
- package/src/RailItem.mdx +50 -0
- package/src/RailItem.stories.tsx +37 -0
- package/src/RailItem.tsx +53 -0
- package/src/SearchInput.mdx +39 -0
- package/src/SearchInput.stories.tsx +24 -0
- package/src/SearchInput.tsx +45 -0
- package/src/SectionHeader.mdx +52 -0
- package/src/SectionHeader.stories.tsx +66 -0
- package/src/SectionHeader.tsx +85 -0
- package/src/SectionLabel.mdx +42 -0
- package/src/SectionLabel.stories.tsx +31 -0
- package/src/SectionLabel.tsx +28 -0
- package/src/Select.fit.test.ts +97 -0
- package/src/Select.mdx +71 -0
- package/src/Select.stories.tsx +95 -0
- package/src/Select.tsx +123 -15
- package/src/Sidebar.mdx +56 -0
- package/src/Sidebar.stories.tsx +50 -0
- package/src/Sidebar.tsx +32 -0
- package/src/Skeleton.mdx +39 -0
- package/src/Tabs.mdx +53 -0
- package/src/Tabs.stories.tsx +91 -0
- package/src/Tabs.tsx +73 -0
- package/src/TextInput.mdx +39 -0
- package/src/Textarea.mdx +36 -0
- package/src/Toast.mdx +54 -0
- package/src/Toast.stories.tsx +87 -0
- package/src/Toast.tsx +169 -0
- package/src/Tooltip.mdx +51 -0
- package/src/Tooltip.tsx +4 -2
- package/src/TopBar.mdx +62 -0
- package/src/TopBar.stories.tsx +96 -0
- package/src/TopBar.tsx +57 -0
- package/src/cn.test.ts +27 -0
- package/src/cn.ts +25 -5
- package/src/index.ts +23 -0
- package/tailwind-preset.js +4 -3
- package/tokens.css +4 -0
package/dist/Person.d.ts
ADDED
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A face beside a name. Ship's Person (2026-09-01), which was Peek's minus
|
|
3
|
+
* the projection type it took its profile from: this one is handed the two
|
|
4
|
+
* strings and nothing else, so it cannot be handed a key. Peek keeps a
|
|
5
|
+
* wrapper that resolves the profile, the way its Avatar wrapper resolves the
|
|
6
|
+
* picture.
|
|
7
|
+
*
|
|
8
|
+
* A face beside a name needs no caption (Peek's rulings), and someone nobody
|
|
9
|
+
* has published a name for gets the `fallback` — an em dash by default, the
|
|
10
|
+
* same mark a property with no value uses — rather than the key back on
|
|
11
|
+
* screen to say it. Pass "Anonymous" where the unnamed person is *you*, and
|
|
12
|
+
* you know who that is.
|
|
13
|
+
*
|
|
14
|
+
* The text size is the caller's, so the face and the words are always set
|
|
15
|
+
* together — see the Sizes story.
|
|
16
|
+
*/
|
|
17
|
+
export interface PersonProps {
|
|
18
|
+
name?: string;
|
|
19
|
+
picture?: string;
|
|
20
|
+
/** Shown in place of a missing name. */
|
|
21
|
+
fallback?: string;
|
|
22
|
+
size?: number;
|
|
23
|
+
className?: string;
|
|
24
|
+
}
|
|
25
|
+
export declare function Person({ name, picture, fallback, size, className }: PersonProps): import("react").JSX.Element;
|
|
26
|
+
//# sourceMappingURL=Person.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Person.d.ts","sourceRoot":"","sources":["../src/Person.tsx"],"names":[],"mappings":"AAGA;;;;;;;;;;;;;;;GAeG;AACH,MAAM,WAAW,WAAW;IAC1B,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,wCAAwC;IACxC,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,IAAI,CAAC,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAc,EAAE,IAAS,EAAE,SAAS,EAAE,EAAE,WAAW,+BAU1F"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ComponentPropsWithRef } from 'react';
|
|
2
|
+
import { type PersonProps } from './Person';
|
|
3
|
+
/**
|
|
4
|
+
* The person, as the button that opens the account menu.
|
|
5
|
+
*
|
|
6
|
+
* Two shapes, one component (Katerina, 2026-09-01):
|
|
7
|
+
*
|
|
8
|
+
* - the row — face · name · chevron on a 32px button with a hover fill, as
|
|
9
|
+
* Ship's top bar draws it. The chevron is 14px, the small-control size.
|
|
10
|
+
* - `compact` — the face alone, as Peek's top bar draws it: no chevron, no
|
|
11
|
+
* padding, and no hover fill, because the face fills the whole control and
|
|
12
|
+
* a fill would have nowhere to show.
|
|
13
|
+
*
|
|
14
|
+
* What it opens — the menu and everything in it — stays in the app.
|
|
15
|
+
*/
|
|
16
|
+
export interface PersonTriggerProps extends Omit<PersonProps, 'className'>, Omit<ComponentPropsWithRef<'button'>, 'children'> {
|
|
17
|
+
/** Whether what it opens is open — the row shape holds its hover fill while so. */
|
|
18
|
+
open?: boolean;
|
|
19
|
+
/** Face only — no chevron, no hover fill. Defaults the face to 36px; the row shape to 22px. */
|
|
20
|
+
compact?: boolean;
|
|
21
|
+
}
|
|
22
|
+
export declare function PersonTrigger({ name, picture, fallback, size, open, compact, className, ...props }: PersonTriggerProps): import("react").JSX.Element;
|
|
23
|
+
//# sourceMappingURL=PersonTrigger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"PersonTrigger.d.ts","sourceRoot":"","sources":["../src/PersonTrigger.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,OAAO,CAAA;AAIlD,OAAO,EAAU,KAAK,WAAW,EAAE,MAAM,UAAU,CAAA;AAEnD;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,kBACf,SAAQ,IAAI,CAAC,WAAW,EAAE,WAAW,CAAC,EACpC,IAAI,CAAC,qBAAqB,CAAC,QAAQ,CAAC,EAAE,UAAU,CAAC;IACnD,mFAAmF;IACnF,IAAI,CAAC,EAAE,OAAO,CAAA;IACd,+FAA+F;IAC/F,OAAO,CAAC,EAAE,OAAO,CAAA;CAClB;AAED,wBAAgB,aAAa,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAY,EAAE,OAAe,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,kBAAkB,+BAiCtI"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* A labelled property row — "Status", "Lead", and whatever else a page
|
|
4
|
+
* declares (2026-09-01). Both apps carried one, and they had already
|
|
5
|
+
* drifted: Peek's label was `text-xs` — a Tailwind default with the wrong
|
|
6
|
+
* line-height, not the caption token — and Ship's had grown a layout Peek's
|
|
7
|
+
* lacked. One component, both layouts, the token:
|
|
8
|
+
*
|
|
9
|
+
* - `row` — Peek's: a 68px label column that lines the values up into a
|
|
10
|
+
* column of their own; `text-secondary` rather than muted because a
|
|
11
|
+
* property label is content, not a placeholder.
|
|
12
|
+
* - `stacked` — Ship's rail: the label above a full-width control. The label
|
|
13
|
+
* is the `menu` token (9px / 115% / 500), uppercase and letter-spaced —
|
|
14
|
+
* its own voice, deliberately not SectionLabel's (unmerged, Katerina
|
|
15
|
+
* 2026-09-01). A literal string, not merged, so the token size survives.
|
|
16
|
+
*/
|
|
17
|
+
export interface PropertyProps {
|
|
18
|
+
label: string;
|
|
19
|
+
layout?: 'row' | 'stacked';
|
|
20
|
+
children: ReactNode;
|
|
21
|
+
className?: string;
|
|
22
|
+
}
|
|
23
|
+
export declare function Property({ label, layout, children, className }: PropertyProps): import("react").JSX.Element;
|
|
24
|
+
//# sourceMappingURL=Property.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Property.d.ts","sourceRoot":"","sources":["../src/Property.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,KAAK,GAAG,SAAS,CAAA;IAC1B,QAAQ,EAAE,SAAS,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,QAAQ,CAAC,EAAE,KAAK,EAAE,MAAc,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,aAAa,+BAkBrF"}
|
package/dist/Rail.d.ts
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* The icon rail: a 64px strip of RailItems (the shell of Peek's NavRail,
|
|
4
|
+
* 2026-09-02 — its entries and their routes stayed in the app).
|
|
5
|
+
*
|
|
6
|
+
* It has no border and no surface of its own — it stands on the app
|
|
7
|
+
* background, beside whatever card or column the app draws. Collapsing
|
|
8
|
+
* is the caller's: the rail does not know about the burger, it only gets
|
|
9
|
+
* given less room (or none) to stand in. Desktop only.
|
|
10
|
+
*/
|
|
11
|
+
export interface RailProps {
|
|
12
|
+
/** Names the navigation region for assistive tech. */
|
|
13
|
+
'aria-label'?: string;
|
|
14
|
+
children: ReactNode;
|
|
15
|
+
className?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function Rail({ 'aria-label': ariaLabel, children, className }: RailProps): import("react").JSX.Element;
|
|
18
|
+
//# sourceMappingURL=Rail.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Rail.d.ts","sourceRoot":"","sources":["../src/Rail.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC;;;;;;;;GAQG;AACH,MAAM,WAAW,SAAS;IACxB,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,SAAS,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,IAAI,CAAC,EAAE,YAAY,EAAE,SAAwB,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,SAAS,+BAM9F"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { ComponentPropsWithoutRef, ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* One tile of an icon rail: the icon in its hover tile, a 9px label
|
|
4
|
+
* under it (Peek's NavItem, 2026-09-02, verbatim — minus the router).
|
|
5
|
+
*
|
|
6
|
+
* The original computed its own active state from the route and rendered
|
|
7
|
+
* a router link; neither belongs in a shared component. This one takes
|
|
8
|
+
* `active` and renders an anchor — a router app keeps a thin wrapper
|
|
9
|
+
* that does its own matching and intercepts the click.
|
|
10
|
+
*
|
|
11
|
+
* Active is `bg-selected` on the tile — some themes also give the icon
|
|
12
|
+
* their interactive colour.
|
|
13
|
+
*/
|
|
14
|
+
export interface RailItemProps extends Omit<ComponentPropsWithoutRef<'a'>, 'href'> {
|
|
15
|
+
href: string;
|
|
16
|
+
/** 16px, stroke 1.5. */
|
|
17
|
+
icon: ReactNode;
|
|
18
|
+
label: string;
|
|
19
|
+
active?: boolean;
|
|
20
|
+
className?: string;
|
|
21
|
+
}
|
|
22
|
+
export declare function RailItem({ href, icon, label, active, className, ...props }: RailItemProps): import("react").JSX.Element;
|
|
23
|
+
//# sourceMappingURL=RailItem.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RailItem.d.ts","sourceRoot":"","sources":["../src/RailItem.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGhE;;;;;;;;;;;GAWG;AACH,MAAM,WAAW,aAAc,SAAQ,IAAI,CAAC,wBAAwB,CAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAChF,IAAI,EAAE,MAAM,CAAA;IACZ,wBAAwB;IACxB,IAAI,EAAE,SAAS,CAAA;IACf,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,CAAC,EAAE,OAAO,CAAA;IAChB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,QAAQ,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,MAAc,EAAE,SAAS,EAAE,GAAG,KAAK,EAAE,EAAE,aAAa,+BA4BjG"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { type InputHTMLAttributes } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Peek's SearchInput (2026-09-01), verbatim: an inset field with a hairline
|
|
4
|
+
* border that strengthens on focus, and an optional keyboard hint at the
|
|
5
|
+
* right edge — under Signal, the hint becomes the mono `kbd` chip with the
|
|
6
|
+
* thicker bottom edge.
|
|
7
|
+
*
|
|
8
|
+
* The one product string — Peek's default placeholder "Search Peek..." —
|
|
9
|
+
* stays in Peek; the default here says only "Search…".
|
|
10
|
+
*
|
|
11
|
+
* In Peek's top bar this is a launcher affordance rather than a live field:
|
|
12
|
+
* the input is `pointer-events-none` and clicking the surround opens the
|
|
13
|
+
* command launcher. The component is the same either way.
|
|
14
|
+
*/
|
|
15
|
+
export interface SearchInputProps extends Omit<InputHTMLAttributes<HTMLInputElement>, 'className'> {
|
|
16
|
+
/** A keyboard hint drawn at the right edge, e.g. "⌘ K". */
|
|
17
|
+
shortcut?: string;
|
|
18
|
+
className?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function SearchInput({ shortcut, className, placeholder, ...props }: SearchInputProps): import("react").JSX.Element;
|
|
21
|
+
//# sourceMappingURL=SearchInput.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SearchInput.d.ts","sourceRoot":"","sources":["../src/SearchInput.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,mBAAmB,EAAE,MAAM,OAAO,CAAA;AAGhD;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,WAAW,CAAC;IAChG,2DAA2D;IAC3D,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,WAAW,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,WAAuB,EAAE,GAAG,KAAK,EAAE,EAAE,gBAAgB,+BAsBvG"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* The 32px row a section starts with (Peek's SectionHeader, 2026-09-01):
|
|
4
|
+
* a SectionLabel, an optional collapse chevron that makes the whole row the
|
|
5
|
+
* toggle, and actions that appear only while the row is hovered, as
|
|
6
|
+
* IconButtons with tooltips.
|
|
7
|
+
*
|
|
8
|
+
* One API change from Peek's original, safe because no call site used the
|
|
9
|
+
* old shape yet: the two hard-wired action slots (add, sort) became
|
|
10
|
+
* `actions` — the caller brings the icon, the tooltip and the handler; the
|
|
11
|
+
* header owns the hover reveal and stops the click from also toggling the
|
|
12
|
+
* section. Peek's add/sort pair is the WithActions story, in its original
|
|
13
|
+
* order.
|
|
14
|
+
*/
|
|
15
|
+
export interface SectionAction {
|
|
16
|
+
/** 16px, stroke 1.5. */
|
|
17
|
+
icon: ReactNode;
|
|
18
|
+
tooltip: string;
|
|
19
|
+
onClick: () => void;
|
|
20
|
+
}
|
|
21
|
+
export interface SectionHeaderProps {
|
|
22
|
+
title: string;
|
|
23
|
+
/** Collapsible: draws the chevron and makes the whole row the toggle. */
|
|
24
|
+
chevron?: boolean;
|
|
25
|
+
isExpanded?: boolean;
|
|
26
|
+
onToggle?: () => void;
|
|
27
|
+
/** Right-aligned, in the order given. */
|
|
28
|
+
actions?: SectionAction[];
|
|
29
|
+
/** `hover` reveals the actions only while the row is hovered; `always` keeps them. */
|
|
30
|
+
showActions?: 'hover' | 'always';
|
|
31
|
+
className?: string;
|
|
32
|
+
}
|
|
33
|
+
export declare function SectionHeader({ title, chevron, isExpanded, onToggle, actions, showActions, className }: SectionHeaderProps): import("react").JSX.Element;
|
|
34
|
+
//# sourceMappingURL=SectionHeader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SectionHeader.d.ts","sourceRoot":"","sources":["../src/SectionHeader.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAY,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAMhD;;;;;;;;;;;;GAYG;AACH,MAAM,WAAW,aAAa;IAC5B,wBAAwB;IACxB,IAAI,EAAE,SAAS,CAAA;IACf,OAAO,EAAE,MAAM,CAAA;IACf,OAAO,EAAE,MAAM,IAAI,CAAA;CACpB;AAED,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,MAAM,CAAA;IACb,yEAAyE;IACzE,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,UAAU,CAAC,EAAE,OAAO,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,yCAAyC;IACzC,OAAO,CAAC,EAAE,aAAa,EAAE,CAAA;IACzB,sFAAsF;IACtF,WAAW,CAAC,EAAE,OAAO,GAAG,QAAQ,CAAA;IAChC,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,aAAa,CAAC,EAAE,KAAK,EAAE,OAAe,EAAE,UAAiB,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAqB,EAAE,SAAS,EAAE,EAAE,kBAAkB,+BA6CnJ"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* THE section-title label — every section heading (sidebar sections, menu
|
|
4
|
+
* headings, panel titles) renders through this span, so a style change is
|
|
5
|
+
* one edit. Peek's original, verbatim: 12px / 12px / 500, primary text
|
|
6
|
+
* (Peek's ruling 2026-07-23: labels stay primary), the mono uppercase
|
|
7
|
+
* micro-label under Signal. Metrics as arbitrary values for the tw-merge
|
|
8
|
+
* reason the README records.
|
|
9
|
+
*
|
|
10
|
+
* Deliberately NOT the same thing as Property's stacked field label (the
|
|
11
|
+
* 9px `menu`-token one): they were merged for a day and unmerged by
|
|
12
|
+
* Katerina's ruling (2026-09-01) — a section title and a field label are
|
|
13
|
+
* different voices, at different sizes, on purpose.
|
|
14
|
+
*/
|
|
15
|
+
export declare function SectionLabel({ children, className }: {
|
|
16
|
+
children: ReactNode;
|
|
17
|
+
className?: string;
|
|
18
|
+
}): import("react").JSX.Element;
|
|
19
|
+
//# sourceMappingURL=SectionLabel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SectionLabel.d.ts","sourceRoot":"","sources":["../src/SectionLabel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,+BAWhG"}
|
package/dist/Select.d.ts
CHANGED
|
@@ -4,11 +4,17 @@ import { type ReactNode } from 'react';
|
|
|
4
4
|
* carry a `leading` node — an avatar beside a person's name — shown in the
|
|
5
5
|
* trigger and in the list.
|
|
6
6
|
*
|
|
7
|
-
* A button that opens a portalled listbox under itself: arrows move
|
|
8
|
-
*
|
|
9
|
-
*
|
|
10
|
-
* (the list is fixed to where
|
|
11
|
-
*
|
|
7
|
+
* A button that opens a portalled listbox under itself: arrows move (and keep
|
|
8
|
+
* the active option scrolled into view), Home and End jump, Enter and Space
|
|
9
|
+
* pick, Escape closes and returns focus to the trigger, Tab closes, a click
|
|
10
|
+
* outside closes, a PAGE scroll or resize closes (the list is fixed to where
|
|
11
|
+
* the trigger was) — a scroll *inside* the list is the list's own business
|
|
12
|
+
* and must not dismiss it. The menu keeps itself on screen: clamped to the
|
|
13
|
+
* viewport's sides, height capped to the space it actually has, opening
|
|
14
|
+
* upward when the room below is worse than the room above (Katerina,
|
|
15
|
+
* 2026-09-01 — the files-panel picker was cut right and bottom, and its own
|
|
16
|
+
* scroll closed it). Two sizes; `disabled` explains nothing by itself — wrap
|
|
17
|
+
* it in a tooltip that does.
|
|
12
18
|
*/
|
|
13
19
|
export interface SelectOption {
|
|
14
20
|
value: string;
|
|
@@ -26,5 +32,36 @@ export interface SelectProps {
|
|
|
26
32
|
disabled?: boolean;
|
|
27
33
|
className?: string;
|
|
28
34
|
}
|
|
35
|
+
/**
|
|
36
|
+
* Where a menu of this size goes, given its anchor and the viewport — pure,
|
|
37
|
+
* so the geometry is testable without a browser.
|
|
38
|
+
*
|
|
39
|
+
* Left is clamped inside the viewport with an 8px margin. Height is capped
|
|
40
|
+
* at 288px (the old `max-h-72`) but never taller than the space it opens
|
|
41
|
+
* into; when the room below the anchor is smaller than both the content and
|
|
42
|
+
* the room above, the menu opens UPWARD (anchored to the trigger's top via
|
|
43
|
+
* `bottom`). The 120px floor keeps a menu usable even in a cramped corner —
|
|
44
|
+
* scrollable beats invisible.
|
|
45
|
+
*/
|
|
46
|
+
export declare function fitMenu({ anchor, menu, viewport, }: {
|
|
47
|
+
anchor: {
|
|
48
|
+
left: number;
|
|
49
|
+
top: number;
|
|
50
|
+
bottom: number;
|
|
51
|
+
};
|
|
52
|
+
menu: {
|
|
53
|
+
width: number;
|
|
54
|
+
contentHeight: number;
|
|
55
|
+
};
|
|
56
|
+
viewport: {
|
|
57
|
+
width: number;
|
|
58
|
+
height: number;
|
|
59
|
+
};
|
|
60
|
+
}): {
|
|
61
|
+
left: number;
|
|
62
|
+
top?: number;
|
|
63
|
+
bottom?: number;
|
|
64
|
+
maxHeight: number;
|
|
65
|
+
};
|
|
29
66
|
export declare function Select({ value, onChange, options, size, ariaLabel, placeholder, disabled, className }: SelectProps): import("react").JSX.Element;
|
|
30
67
|
//# sourceMappingURL=Select.d.ts.map
|
package/dist/Select.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Select.d.ts","sourceRoot":"","sources":["../src/Select.tsx"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"Select.d.ts","sourceRoot":"","sources":["../src/Select.tsx"],"names":[],"mappings":"AACA,OAAO,EAAiG,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAIrI;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,KAAK,EAAE,MAAM,CAAA;IACb,yDAAyD;IACzD,OAAO,CAAC,EAAE,SAAS,CAAA;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAA;IACb,QAAQ,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,CAAA;IACjC,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAA;IAClB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,OAAO,CAAC,EACtB,MAAM,EACN,IAAI,EACJ,QAAQ,GACT,EAAE;IACD,MAAM,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;IACrD,IAAI,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,aAAa,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9C,QAAQ,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAA;CAC5C,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,CAYrE;AAED,wBAAgB,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAgB,EAAE,SAAS,EAAE,WAAuB,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,WAAW,+BAqO1I"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* The navigation column: 240px, a hairline on its right, the surface
|
|
4
|
+
* behind it, scrolling independently of the content beside it (the shell
|
|
5
|
+
* of Ship's Sidebar, 2026-09-02 — its contents stayed in the app).
|
|
6
|
+
*
|
|
7
|
+
* What goes inside is the caller's: NavItem rows, a SectionLabel heading
|
|
8
|
+
* in a 32px row over a group. Desktop only — there is no narrow-screen
|
|
9
|
+
* drawer.
|
|
10
|
+
*/
|
|
11
|
+
export interface SidebarProps {
|
|
12
|
+
/** Names the navigation region for assistive tech. */
|
|
13
|
+
'aria-label'?: string;
|
|
14
|
+
children: ReactNode;
|
|
15
|
+
className?: string;
|
|
16
|
+
}
|
|
17
|
+
export declare function Sidebar({ 'aria-label': ariaLabel, children, className }: SidebarProps): import("react").JSX.Element;
|
|
18
|
+
//# sourceMappingURL=Sidebar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Sidebar.d.ts","sourceRoot":"","sources":["../src/Sidebar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY;IAC3B,sDAAsD;IACtD,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB,QAAQ,EAAE,SAAS,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,OAAO,CAAC,EAAE,YAAY,EAAE,SAAuB,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,YAAY,+BAYnG"}
|
package/dist/Tabs.d.ts
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* A row of tabs. Ship's Tabs (2026-09-01), which was Peek's TopicTabs with
|
|
4
|
+
* the topic-specific ids taken out.
|
|
5
|
+
*
|
|
6
|
+
* A selected tab is a neutral fill (bg-active), not the accent tint —
|
|
7
|
+
* Katerina's ruling (2026-08-27), extended to every app (2026-09-01). Two
|
|
8
|
+
* sizes: `default` is 14px, a little more room; `small` is Peek's own
|
|
9
|
+
* geometry (its inline `fontSize: 12` was the caption token spelled by hand).
|
|
10
|
+
*
|
|
11
|
+
* A tab's count is the sidebar's number, not a chip (Katerina, 2026-09-01,
|
|
12
|
+
* superseding the chip ruling of 2026-08-26): mono, caption size, muted,
|
|
13
|
+
* tabular — the one way a number sits beside a label everywhere. A count of
|
|
14
|
+
* `0` is still drawn ("Assigned to me 0" is an answer); an absent count draws
|
|
15
|
+
* nothing.
|
|
16
|
+
*/
|
|
17
|
+
export interface TabDef<T extends string> {
|
|
18
|
+
id: T;
|
|
19
|
+
label: string;
|
|
20
|
+
/** Shown as a muted mono number after the label. Absent draws nothing; 0 is drawn. */
|
|
21
|
+
count?: number;
|
|
22
|
+
/** 16px, stroke 1.5. */
|
|
23
|
+
icon?: ReactNode;
|
|
24
|
+
}
|
|
25
|
+
export interface TabsProps<T extends string> {
|
|
26
|
+
tabs: TabDef<T>[];
|
|
27
|
+
active: T;
|
|
28
|
+
onChange: (id: T) => void;
|
|
29
|
+
/** `default` 14px; `small` 12px, the denser geometry. */
|
|
30
|
+
size?: 'default' | 'small';
|
|
31
|
+
className?: string;
|
|
32
|
+
}
|
|
33
|
+
export declare function Tabs<T extends string>({ tabs, active, onChange, size, className }: TabsProps<T>): import("react").JSX.Element;
|
|
34
|
+
//# sourceMappingURL=Tabs.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Tabs.d.ts","sourceRoot":"","sources":["../src/Tabs.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC;;;;;;;;;;;;;;GAcG;AACH,MAAM,WAAW,MAAM,CAAC,CAAC,SAAS,MAAM;IACtC,EAAE,EAAE,CAAC,CAAA;IACL,KAAK,EAAE,MAAM,CAAA;IACb,sFAAsF;IACtF,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,wBAAwB;IACxB,IAAI,CAAC,EAAE,SAAS,CAAA;CACjB;AAED,MAAM,WAAW,SAAS,CAAC,CAAC,SAAS,MAAM;IACzC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,EAAE,CAAA;IACjB,MAAM,EAAE,CAAC,CAAA;IACT,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,IAAI,CAAA;IACzB,yDAAyD;IACzD,IAAI,CAAC,EAAE,SAAS,GAAG,OAAO,CAAA;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,IAAI,CAAC,CAAC,SAAS,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,IAAgB,EAAE,SAAS,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,+BAoC3G"}
|
package/dist/Toast.d.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* Peek's Toast (Figma: Alert) and its provider (2026-09-01), verbatim.
|
|
4
|
+
*
|
|
5
|
+
* The pill: three types — `success`, `brand`, `neutral` — an optional leading
|
|
6
|
+
* circle-check, an optional action on the right. Under Signal every toast is
|
|
7
|
+
* the same dark overlay pill; the type lives in the icon's colour and glow,
|
|
8
|
+
* not the surface.
|
|
9
|
+
*
|
|
10
|
+
* The provider owns positioning (bottom-left), the portal, and auto-dismiss
|
|
11
|
+
* (5 s; pass `durationMs: 0` to keep one up). One toast at a time — a new
|
|
12
|
+
* one replaces the standing one, it does not queue.
|
|
13
|
+
*/
|
|
14
|
+
export type ToastType = 'success' | 'brand' | 'neutral';
|
|
15
|
+
export interface ToastProps {
|
|
16
|
+
label: string;
|
|
17
|
+
/** Visual variant per Figma (Alert component): success, brand, or neutral. */
|
|
18
|
+
type?: ToastType;
|
|
19
|
+
/** Show the leading circle-check icon. Defaults to true. */
|
|
20
|
+
leadingIcon?: boolean;
|
|
21
|
+
/** When set together with onAction, renders a clickable action on the right side. */
|
|
22
|
+
actionLabel?: string;
|
|
23
|
+
onAction?: () => void;
|
|
24
|
+
className?: string;
|
|
25
|
+
}
|
|
26
|
+
export declare function Toast({ label, type, leadingIcon, actionLabel, onAction, className }: ToastProps): import("react").JSX.Element;
|
|
27
|
+
export interface ToastOptions {
|
|
28
|
+
label: string;
|
|
29
|
+
/** Visual variant per Figma (Alert component). Defaults to 'neutral'. */
|
|
30
|
+
type?: ToastType;
|
|
31
|
+
/** When set, renders a clickable action on the right side. */
|
|
32
|
+
actionLabel?: string;
|
|
33
|
+
onAction?: () => void;
|
|
34
|
+
/** Show the leading circle-check icon. Defaults to true. */
|
|
35
|
+
leadingIcon?: boolean;
|
|
36
|
+
/** Auto-dismiss after this many ms. Defaults to 5000. Pass 0 to disable. */
|
|
37
|
+
durationMs?: number;
|
|
38
|
+
}
|
|
39
|
+
interface ToastValue {
|
|
40
|
+
showToast: (opts: ToastOptions) => void;
|
|
41
|
+
dismissToast: () => void;
|
|
42
|
+
}
|
|
43
|
+
export declare function ToastProvider({ children }: {
|
|
44
|
+
children: ReactNode;
|
|
45
|
+
}): import("react").JSX.Element;
|
|
46
|
+
export declare function useToast(): ToastValue;
|
|
47
|
+
export {};
|
|
48
|
+
//# sourceMappingURL=Toast.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Toast.d.ts","sourceRoot":"","sources":["../src/Toast.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAwE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAK5G;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,OAAO,GAAG,SAAS,CAAA;AAEvD,MAAM,WAAW,UAAU;IACzB,KAAK,EAAE,MAAM,CAAA;IACb,8EAA8E;IAC9E,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,qFAAqF;IACrF,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAsBD,wBAAgB,KAAK,CAAC,EAAE,KAAK,EAAE,IAAgB,EAAE,WAAkB,EAAE,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,UAAU,+BAkClH;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,yEAAyE;IACzE,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,8DAA8D;IAC9D,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAA;IACrB,4DAA4D;IAC5D,WAAW,CAAC,EAAE,OAAO,CAAA;IACrB,4EAA4E;IAC5E,UAAU,CAAC,EAAE,MAAM,CAAA;CACpB;AAMD,UAAU,UAAU;IAClB,SAAS,EAAE,CAAC,IAAI,EAAE,YAAY,KAAK,IAAI,CAAA;IACvC,YAAY,EAAE,MAAM,IAAI,CAAA;CACzB;AAMD,wBAAgB,aAAa,CAAC,EAAE,QAAQ,EAAE,EAAE;IAAE,QAAQ,EAAE,SAAS,CAAA;CAAE,+BAiDlE;AAED,wBAAgB,QAAQ,IAAI,UAAU,CAIrC"}
|
package/dist/Tooltip.d.ts
CHANGED
|
@@ -16,7 +16,9 @@ export declare function Tooltip({ label, className }: TooltipProps): import("rea
|
|
|
16
16
|
export interface WithTooltipProps {
|
|
17
17
|
label: string;
|
|
18
18
|
placement?: 'top' | 'bottom';
|
|
19
|
+
/** Extra classes on the wrapper — e.g. `min-w-0 shrink` so a truncating label keeps truncating inside it. */
|
|
20
|
+
wrapperClassName?: string;
|
|
19
21
|
children: ReactNode;
|
|
20
22
|
}
|
|
21
|
-
export declare function WithTooltip({ label, placement, children }: WithTooltipProps): import("react").JSX.Element;
|
|
23
|
+
export declare function WithTooltip({ label, placement, wrapperClassName, children }: WithTooltipProps): import("react").JSX.Element;
|
|
22
24
|
//# sourceMappingURL=Tooltip.d.ts.map
|
package/dist/Tooltip.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../src/Tooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAI1G;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,YAAY,+BAMzD;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAA;IAC5B,QAAQ,EAAE,SAAS,CAAA;CACpB;AAKD,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,SAAiB,EAAE,QAAQ,EAAE,EAAE,gBAAgB,+
|
|
1
|
+
{"version":3,"file":"Tooltip.d.ts","sourceRoot":"","sources":["../src/Tooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAsE,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAI1G;;;;;;;;GAQG;AACH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,OAAO,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,YAAY,+BAMzD;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAA;IACb,SAAS,CAAC,EAAE,KAAK,GAAG,QAAQ,CAAA;IAC5B,6GAA6G;IAC7G,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,QAAQ,EAAE,SAAS,CAAA;CACpB;AAKD,wBAAgB,WAAW,CAAC,EAAE,KAAK,EAAE,SAAiB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,EAAE,gBAAgB,+BAkCrG"}
|
package/dist/TopBar.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
/**
|
|
3
|
+
* The 52px top bar, in two manners:
|
|
4
|
+
*
|
|
5
|
+
* - `solid` — in flow: a hairline under it, the surface behind it, the
|
|
6
|
+
* frame's first row (2026-09-02, verbatim from the structured app; its
|
|
7
|
+
* product title moved to the caller).
|
|
8
|
+
* - `floating` — an overlay: absolute over the content, no border and no
|
|
9
|
+
* background, and the bar itself ignores the pointer — only its clusters
|
|
10
|
+
* catch clicks, so the content underneath stays reachable (2026-09-02,
|
|
11
|
+
* verbatim from the floating app).
|
|
12
|
+
*
|
|
13
|
+
* Geometry both apps agreed on before extraction: 52px tall, `pl-5
|
|
14
|
+
* pr-[26px]`, right cluster `gap-[6px]`. The left region is two slots
|
|
15
|
+
* side by side — `menu` (the menu button, in an app whose navigation
|
|
16
|
+
* collapses) and `logo` (the mark or name beside it; Katerina,
|
|
17
|
+
* 2026-09-02). This component does not know who you are or what is being
|
|
18
|
+
* searched; it only knows where those go.
|
|
19
|
+
*/
|
|
20
|
+
export interface TopBarProps {
|
|
21
|
+
variant?: 'solid' | 'floating';
|
|
22
|
+
/** Far left: the menu button, in an app whose navigation collapses. Stays the caller's — the bar only places it. */
|
|
23
|
+
menu?: ReactNode;
|
|
24
|
+
/** Beside the menu button: the app's logo mark, or its name as text. */
|
|
25
|
+
logo?: ReactNode;
|
|
26
|
+
/** The centre: a search field, or a launcher affordance — or nothing; the slot holds its place. */
|
|
27
|
+
search?: ReactNode;
|
|
28
|
+
/** The right cluster — an `IdentityMenu` and its neighbours. */
|
|
29
|
+
right?: ReactNode;
|
|
30
|
+
className?: string;
|
|
31
|
+
}
|
|
32
|
+
export declare function TopBar({ variant, menu, logo, search, right, className }: TopBarProps): import("react").JSX.Element;
|
|
33
|
+
//# sourceMappingURL=TopBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TopBar.d.ts","sourceRoot":"","sources":["../src/TopBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAA;AAGtC;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,WAAW;IAC1B,OAAO,CAAC,EAAE,OAAO,GAAG,UAAU,CAAA;IAC9B,oHAAoH;IACpH,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,wEAAwE;IACxE,IAAI,CAAC,EAAE,SAAS,CAAA;IAChB,mGAAmG;IACnG,MAAM,CAAC,EAAE,SAAS,CAAA;IAClB,gEAAgE;IAChE,KAAK,CAAC,EAAE,SAAS,CAAA;IACjB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB;AAED,wBAAgB,MAAM,CAAC,EAAE,OAAiB,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,WAAW,+BAsB9F"}
|
package/dist/cn.d.ts
CHANGED
|
@@ -1,10 +1,20 @@
|
|
|
1
1
|
import { type ClassValue } from 'clsx';
|
|
2
2
|
/**
|
|
3
|
-
*
|
|
3
|
+
* The preset's type ramp, by name, so tailwind-merge can classify the token
|
|
4
|
+
* classes as sizes. Stock tailwind-merge has never heard of `text-body-2`,
|
|
5
|
+
* files it under text-COLOUR, and lets `text-text-primary` in the same
|
|
6
|
+
* merged list knock it out — the trap Katerina's Tabs review confirmed by
|
|
7
|
+
* measurement (2026-09-01), and the reason shared components used to spell
|
|
8
|
+
* sizes as arbitrary values. Naming the ramp here retires that rule for
|
|
9
|
+
* everything using this cn — the package and, since the 2026-09-01 dedupe,
|
|
10
|
+
* both apps.
|
|
4
11
|
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
12
|
+
* Must match `tailwind-preset.js` `fontSize` key for key; `cn.test.ts`
|
|
13
|
+
* asserts it (the preset imports node-only modules, so it cannot be
|
|
14
|
+
* imported here without dragging them into the browser bundle).
|
|
8
15
|
*/
|
|
16
|
+
declare const FONT_SIZE_TOKENS: string[];
|
|
17
|
+
/** Merge class names, last-one-wins on conflicting Tailwind utilities. */
|
|
9
18
|
export declare function cn(...inputs: ClassValue[]): string;
|
|
19
|
+
export { FONT_SIZE_TOKENS as _fontSizeTokens };
|
|
10
20
|
//# sourceMappingURL=cn.d.ts.map
|
package/dist/cn.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cn.d.ts","sourceRoot":"","sources":["../src/cn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,UAAU,EAAE,MAAM,MAAM,CAAA;AAG5C
|
|
1
|
+
{"version":3,"file":"cn.d.ts","sourceRoot":"","sources":["../src/cn.ts"],"names":[],"mappings":"AAAA,OAAO,EAAQ,KAAK,UAAU,EAAE,MAAM,MAAM,CAAA;AAG5C;;;;;;;;;;;;;GAaG;AACH,QAAA,MAAM,gBAAgB,UAIrB,CAAA;AAMD,0EAA0E;AAC1E,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC;AAED,OAAO,EAAE,gBAAgB,IAAI,eAAe,EAAE,CAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -9,18 +9,41 @@
|
|
|
9
9
|
* `src/` still ships in the tarball, so stepping into a component lands on the
|
|
10
10
|
* TypeScript that produced it.
|
|
11
11
|
*/
|
|
12
|
+
export { AppShell, type AppShellProps } from './AppShell';
|
|
12
13
|
export { Avatar, hueFor, initialsFor, type AvatarProps } from './Avatar';
|
|
14
|
+
export { AvatarGroup, type AvatarGroupMember, type AvatarGroupProps } from './AvatarGroup';
|
|
15
|
+
export { Banner, type BannerProps, type BannerTone } from './Banner';
|
|
13
16
|
export { Button, type ButtonProps, type ButtonSize, type ButtonVariant } from './Button';
|
|
17
|
+
export { Checkbox, type CheckboxProps } from './Checkbox';
|
|
14
18
|
export { Chip, type ChipProps, type ChipType } from './Chip';
|
|
19
|
+
export { ChipInput, InputChip, type ChipInputOption, type ChipInputProps, type InputChipProps } from './ChipInput';
|
|
15
20
|
export { IconButton, type IconButtonProps, type IconButtonVariant } from './IconButton';
|
|
21
|
+
export { IdentityMenu, IdentityPanel, type Identity, type IdentityMenuProps, type IdentityPanelProps } from './IdentityMenu';
|
|
16
22
|
export { Tooltip, WithTooltip, type TooltipProps, type WithTooltipProps } from './Tooltip';
|
|
17
23
|
export { Field, type FieldProps } from './Field';
|
|
18
24
|
export { Select, type SelectOption, type SelectProps } from './Select';
|
|
19
25
|
export { TextInput, type TextInputProps } from './TextInput';
|
|
20
26
|
export { Textarea, type TextareaProps } from './Textarea';
|
|
27
|
+
export { ConfirmDialog, type ConfirmDialogProps } from './ConfirmDialog';
|
|
21
28
|
export { DialogShell, type DialogShellProps } from './DialogShell';
|
|
22
29
|
export { Divider, type DividerProps } from './Divider';
|
|
30
|
+
export { EditableText, type EditableTextProps } from './EditableText';
|
|
23
31
|
export { EmptyState, type EmptyStateProps } from './EmptyState';
|
|
24
32
|
export { SkeletonBar, SkeletonList, SkeletonRow } from './Skeleton';
|
|
33
|
+
export { Breadcrumb, type BreadcrumbProps, type Crumb } from './Breadcrumb';
|
|
34
|
+
export { EnterHint, Menu, MenuItem, MenuRow, MenuSection, type MenuItemProps, type MenuProps } from './Menu';
|
|
35
|
+
export { NavItem, type NavItemProps } from './NavItem';
|
|
36
|
+
export { Person, type PersonProps } from './Person';
|
|
37
|
+
export { Rail, type RailProps } from './Rail';
|
|
38
|
+
export { RailItem, type RailItemProps } from './RailItem';
|
|
39
|
+
export { Sidebar, type SidebarProps } from './Sidebar';
|
|
40
|
+
export { TopBar, type TopBarProps } from './TopBar';
|
|
41
|
+
export { PersonTrigger, type PersonTriggerProps } from './PersonTrigger';
|
|
42
|
+
export { Property, type PropertyProps } from './Property';
|
|
43
|
+
export { SearchInput, type SearchInputProps } from './SearchInput';
|
|
44
|
+
export { SectionHeader, type SectionAction, type SectionHeaderProps } from './SectionHeader';
|
|
45
|
+
export { SectionLabel } from './SectionLabel';
|
|
46
|
+
export { Tabs, type TabDef, type TabsProps } from './Tabs';
|
|
47
|
+
export { Toast, ToastProvider, useToast, type ToastOptions, type ToastProps, type ToastType } from './Toast';
|
|
25
48
|
export { cn } from './cn';
|
|
26
49
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAA;AACxE,OAAO,EAAE,MAAM,EAAE,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,KAAK,aAAa,EAAE,MAAM,UAAU,CAAA;AACxF,OAAO,EAAE,IAAI,EAAE,KAAK,SAAS,EAAE,KAAK,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAC5D,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,KAAK,iBAAiB,EAAE,MAAM,cAAc,CAAA;AACvF,OAAO,EAAE,OAAO,EAAE,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,gBAAgB,EAAE,MAAM,WAAW,CAAA;AAC1F,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,SAAS,CAAA;AAChD,OAAO,EAAE,MAAM,EAAE,KAAK,YAAY,EAAE,KAAK,WAAW,EAAE,MAAM,UAAU,CAAA;AACtE,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,aAAa,CAAA;AAC5D,OAAO,EAAE,QAAQ,EAAE,KAAK,aAAa,EAAE,MAAM,YAAY,CAAA;AACzD,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,eAAe,CAAA;AAClE,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,WAAW,CAAA;AACtD,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,cAAc,CAAA;AAC/D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAA;AACnE,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|