@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.
Files changed (157) hide show
  1. package/README.md +12 -9
  2. package/base.css +43 -0
  3. package/dist/AppShell.d.ts +39 -0
  4. package/dist/AppShell.d.ts.map +1 -0
  5. package/dist/Avatar.d.ts +7 -2
  6. package/dist/Avatar.d.ts.map +1 -1
  7. package/dist/AvatarGroup.d.ts +23 -0
  8. package/dist/AvatarGroup.d.ts.map +1 -0
  9. package/dist/Banner.d.ts +19 -0
  10. package/dist/Banner.d.ts.map +1 -0
  11. package/dist/Breadcrumb.d.ts +28 -0
  12. package/dist/Breadcrumb.d.ts.map +1 -0
  13. package/dist/Checkbox.d.ts +18 -0
  14. package/dist/Checkbox.d.ts.map +1 -0
  15. package/dist/ChipInput.d.ts +57 -0
  16. package/dist/ChipInput.d.ts.map +1 -0
  17. package/dist/ConfirmDialog.d.ts +22 -0
  18. package/dist/ConfirmDialog.d.ts.map +1 -0
  19. package/dist/DialogShell.d.ts +9 -2
  20. package/dist/DialogShell.d.ts.map +1 -1
  21. package/dist/EditableText.d.ts +56 -0
  22. package/dist/EditableText.d.ts.map +1 -0
  23. package/dist/IdentityMenu.d.ts +58 -0
  24. package/dist/IdentityMenu.d.ts.map +1 -0
  25. package/dist/Menu.d.ts +82 -0
  26. package/dist/Menu.d.ts.map +1 -0
  27. package/dist/NavItem.d.ts +26 -0
  28. package/dist/NavItem.d.ts.map +1 -0
  29. package/dist/Person.d.ts +26 -0
  30. package/dist/Person.d.ts.map +1 -0
  31. package/dist/PersonTrigger.d.ts +23 -0
  32. package/dist/PersonTrigger.d.ts.map +1 -0
  33. package/dist/Property.d.ts +24 -0
  34. package/dist/Property.d.ts.map +1 -0
  35. package/dist/Rail.d.ts +18 -0
  36. package/dist/Rail.d.ts.map +1 -0
  37. package/dist/RailItem.d.ts +23 -0
  38. package/dist/RailItem.d.ts.map +1 -0
  39. package/dist/SearchInput.d.ts +21 -0
  40. package/dist/SearchInput.d.ts.map +1 -0
  41. package/dist/SectionHeader.d.ts +34 -0
  42. package/dist/SectionHeader.d.ts.map +1 -0
  43. package/dist/SectionLabel.d.ts +19 -0
  44. package/dist/SectionLabel.d.ts.map +1 -0
  45. package/dist/Select.d.ts +42 -5
  46. package/dist/Select.d.ts.map +1 -1
  47. package/dist/Sidebar.d.ts +18 -0
  48. package/dist/Sidebar.d.ts.map +1 -0
  49. package/dist/Tabs.d.ts +34 -0
  50. package/dist/Tabs.d.ts.map +1 -0
  51. package/dist/Toast.d.ts +48 -0
  52. package/dist/Toast.d.ts.map +1 -0
  53. package/dist/Tooltip.d.ts +3 -1
  54. package/dist/Tooltip.d.ts.map +1 -1
  55. package/dist/TopBar.d.ts +33 -0
  56. package/dist/TopBar.d.ts.map +1 -0
  57. package/dist/cn.d.ts +14 -4
  58. package/dist/cn.d.ts.map +1 -1
  59. package/dist/index.d.ts +23 -0
  60. package/dist/index.d.ts.map +1 -1
  61. package/dist/index.js +1254 -106
  62. package/dist/index.js.map +4 -4
  63. package/package.json +5 -2
  64. package/src/AppShell.mdx +66 -0
  65. package/src/AppShell.stories.tsx +117 -0
  66. package/src/AppShell.tsx +77 -0
  67. package/src/Avatar.initials.test.ts +21 -0
  68. package/src/Avatar.mdx +49 -0
  69. package/src/Avatar.tsx +12 -9
  70. package/src/AvatarGroup.mdx +39 -0
  71. package/src/AvatarGroup.stories.tsx +56 -0
  72. package/src/AvatarGroup.tsx +42 -0
  73. package/src/Banner.mdx +45 -0
  74. package/src/Banner.stories.tsx +35 -0
  75. package/src/Banner.tsx +35 -0
  76. package/src/Breadcrumb.mdx +52 -0
  77. package/src/Breadcrumb.stories.tsx +42 -0
  78. package/src/Breadcrumb.tsx +106 -0
  79. package/src/Button.mdx +57 -0
  80. package/src/Checkbox.mdx +44 -0
  81. package/src/Checkbox.stories.tsx +49 -0
  82. package/src/Checkbox.tsx +46 -0
  83. package/src/Chip.mdx +43 -0
  84. package/src/ChipInput.mdx +68 -0
  85. package/src/ChipInput.stories.tsx +99 -0
  86. package/src/ChipInput.tsx +247 -0
  87. package/src/ConfirmDialog.mdx +51 -0
  88. package/src/ConfirmDialog.stories.tsx +63 -0
  89. package/src/ConfirmDialog.tsx +55 -0
  90. package/src/DialogShell.mdx +68 -0
  91. package/src/DialogShell.tsx +12 -5
  92. package/src/Divider.mdx +41 -0
  93. package/src/EditableText.mdx +59 -0
  94. package/src/EditableText.stories.tsx +63 -0
  95. package/src/EditableText.tsx +169 -0
  96. package/src/EmptyState.mdx +41 -0
  97. package/src/Field.mdx +39 -0
  98. package/src/IconButton.mdx +47 -0
  99. package/src/IdentityMenu.mdx +62 -0
  100. package/src/IdentityMenu.stories.tsx +52 -0
  101. package/src/IdentityMenu.tsx +159 -0
  102. package/src/Menu.mdx +111 -0
  103. package/src/Menu.stories.tsx +66 -0
  104. package/src/Menu.tsx +172 -0
  105. package/src/MenuItem.mdx +55 -0
  106. package/src/MenuItem.stories.tsx +98 -0
  107. package/src/NavItem.mdx +53 -0
  108. package/src/NavItem.stories.tsx +36 -0
  109. package/src/NavItem.tsx +53 -0
  110. package/src/Person.mdx +44 -0
  111. package/src/Person.stories.tsx +43 -0
  112. package/src/Person.tsx +39 -0
  113. package/src/PersonTrigger.mdx +51 -0
  114. package/src/PersonTrigger.stories.tsx +30 -0
  115. package/src/PersonTrigger.tsx +62 -0
  116. package/src/Property.mdx +51 -0
  117. package/src/Property.stories.tsx +91 -0
  118. package/src/Property.tsx +44 -0
  119. package/src/Rail.tsx +26 -0
  120. package/src/RailItem.mdx +50 -0
  121. package/src/RailItem.stories.tsx +37 -0
  122. package/src/RailItem.tsx +53 -0
  123. package/src/SearchInput.mdx +39 -0
  124. package/src/SearchInput.stories.tsx +24 -0
  125. package/src/SearchInput.tsx +45 -0
  126. package/src/SectionHeader.mdx +52 -0
  127. package/src/SectionHeader.stories.tsx +66 -0
  128. package/src/SectionHeader.tsx +85 -0
  129. package/src/SectionLabel.mdx +42 -0
  130. package/src/SectionLabel.stories.tsx +31 -0
  131. package/src/SectionLabel.tsx +28 -0
  132. package/src/Select.fit.test.ts +97 -0
  133. package/src/Select.mdx +71 -0
  134. package/src/Select.stories.tsx +95 -0
  135. package/src/Select.tsx +123 -15
  136. package/src/Sidebar.mdx +56 -0
  137. package/src/Sidebar.stories.tsx +50 -0
  138. package/src/Sidebar.tsx +32 -0
  139. package/src/Skeleton.mdx +39 -0
  140. package/src/Tabs.mdx +53 -0
  141. package/src/Tabs.stories.tsx +91 -0
  142. package/src/Tabs.tsx +73 -0
  143. package/src/TextInput.mdx +39 -0
  144. package/src/Textarea.mdx +36 -0
  145. package/src/Toast.mdx +54 -0
  146. package/src/Toast.stories.tsx +87 -0
  147. package/src/Toast.tsx +169 -0
  148. package/src/Tooltip.mdx +51 -0
  149. package/src/Tooltip.tsx +4 -2
  150. package/src/TopBar.mdx +62 -0
  151. package/src/TopBar.stories.tsx +96 -0
  152. package/src/TopBar.tsx +57 -0
  153. package/src/cn.test.ts +27 -0
  154. package/src/cn.ts +25 -5
  155. package/src/index.ts +23 -0
  156. package/tailwind-preset.js +4 -3
  157. package/tokens.css +4 -0
@@ -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, Home
8
- * and End jump, Enter and Space pick, Escape closes and returns focus to the
9
- * trigger, Tab closes, a click outside closes, a scroll or resize closes
10
- * (the list is fixed to where the trigger was). Two sizes; `disabled`
11
- * explains nothing by itself wrap it in a tooltip that does.
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
@@ -1 +1 @@
1
- {"version":3,"file":"Select.d.ts","sourceRoot":"","sources":["../src/Select.tsx"],"names":[],"mappings":"AACA,OAAO,EAAgF,KAAK,SAAS,EAAE,MAAM,OAAO,CAAA;AAIpH;;;;;;;;;;GAUG;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,wBAAgB,MAAM,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAgB,EAAE,SAAS,EAAE,WAAuB,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,WAAW,+BAgK1I"}
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"}
@@ -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
@@ -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,+BAkCnF"}
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"}
@@ -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
- * Peek's `cn`: clsx for the conditionals, tailwind-merge for the conflicts.
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
- * Remember the pitfall the README records: a custom text-size class in a
6
- * merged list is dropped when a `text-{colour}` follows it. Inside this
7
- * package, sizes are arbitrary values (`text-[12px]`), never the token class.
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;;;;;;GAMG;AACH,wBAAgB,EAAE,CAAC,GAAG,MAAM,EAAE,UAAU,EAAE,UAEzC"}
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
@@ -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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"}