@treasuryspatial/surface-primitives 0.0.0-stage → 0.1.1
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 +65 -2
- package/dist/index.d.ts +195 -0
- package/dist/index.js +822 -0
- package/dist/index.js.map +7 -0
- package/package.json +49 -4
package/README.md
CHANGED
|
@@ -1,3 +1,66 @@
|
|
|
1
|
-
#
|
|
1
|
+
# @treasuryspatial/surface-primitives
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Treasury's neutral surface primitives: React, styled-components 6, styled from
|
|
4
|
+
`@treasuryspatial/treasury-design-tokens` only. No product or route logic.
|
|
5
|
+
|
|
6
|
+
```tsx
|
|
7
|
+
import { TreasurySurface, TreasurySectionHeader, TreasuryButton, TreasuryContractFailure } from '@treasuryspatial/surface-primitives';
|
|
8
|
+
```
|
|
9
|
+
|
|
10
|
+
| Export | What it is |
|
|
11
|
+
| --- | --- |
|
|
12
|
+
| `TreasurySurface` | bordered section; `tone` default / raised / muted / danger, `padding` none / sm / md / lg |
|
|
13
|
+
| `TreasuryStack`, `TreasuryInline` | grid and wrapping-row layout helpers |
|
|
14
|
+
| `TreasurySectionHeader` | eyebrow, title, subtitle, action |
|
|
15
|
+
| `TreasuryBadge` | status label; `tone` neutral / accent / success / warning / danger |
|
|
16
|
+
| `TreasuryButton` | primary / secondary / quiet / danger; a link when `href` is set |
|
|
17
|
+
| `TreasuryMetric` | label, value, detail |
|
|
18
|
+
| `TreasuryKeyValueList` | definition list of label/value rows |
|
|
19
|
+
| `TreasuryTable*` | table container, table, head, body, row, header cell, cell |
|
|
20
|
+
| `TreasuryEmptyState` | dashed frame with title, message, action |
|
|
21
|
+
| `TreasuryContractFailure` | the visible failure block (`role="alert"`) for a missing contract |
|
|
22
|
+
| `TreasuryContractIssues` | renders a list of issues as a contract failure, or nothing when the list is empty |
|
|
23
|
+
| `resolveTreasuryTokens` | the tokens with a component's `tokens` overrides merged in |
|
|
24
|
+
| `TreasuryPersonChip` | headshot (`imageUrl`) or initials, name, one-line `role`; a link when `href` is set (0.1.1) |
|
|
25
|
+
| `TreasuryStepper` | ordered stages; `currentId` makes earlier steps done and later ones upcoming, `complete` makes all done (0.1.1) |
|
|
26
|
+
| `TreasurySectionTabs` | underline tabs between the sections of one page or form, each with an optional completeness dot (0.1.1) |
|
|
27
|
+
| `TreasuryProgress` | "n of m" as text and a bar, `role="progressbar"` (0.1.1) |
|
|
28
|
+
|
|
29
|
+
### Contracts of the 0.1.1 additions
|
|
30
|
+
|
|
31
|
+
Each checks its props with an exported `getTreasury*Issues` function and renders a visible contract failure when
|
|
32
|
+
they break. A person chip needs a name. A stepper needs unique steps, and `currentId` must be one of them or null.
|
|
33
|
+
Section tabs need a unique active id that exists, an `ariaLabel`, and an `href` or `onSelect` for every tab.
|
|
34
|
+
Progress needs whole numbers with `0 ≤ value ≤ max` and `max > 0`. State shown by colour (step status,
|
|
35
|
+
completeness) is also given as visually hidden text.
|
|
36
|
+
|
|
37
|
+
### `TreasurySectionTabs` is not `PageTabs` or `ModeBar`
|
|
38
|
+
|
|
39
|
+
`@treasuryspatial/top-bar` keeps the bar's own switches. Its `PageTabs` move between the pages of a site (routes)
|
|
40
|
+
and its `ModeBar` switches one mode of a workspace. `TreasurySectionTabs` moves between the sections of one page
|
|
41
|
+
or form (the eight onboarding sections) and carries a completeness mark per tab. It sits in the page, under the
|
|
42
|
+
bar, and never in it. Use top-bar for pages and modes; use this for sections.
|
|
43
|
+
|
|
44
|
+
```tsx
|
|
45
|
+
<TreasurySectionTabs ariaLabel="Onboarding sections" activeId={section} linkComponent={Link}
|
|
46
|
+
tabs={[{ id: 'profile', label: 'Profile', href: '#profile', completeness: 'complete' }, …]} />
|
|
47
|
+
<TreasuryStepper steps={stages} currentId="assessment" />
|
|
48
|
+
<TreasuryProgress label="Setup" value={4} max={8} unit="sections complete" />
|
|
49
|
+
<TreasuryPersonChip name="Jen Carlile" role="Workflows & Operations" />
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
Helpers: `getTreasuryInitials`, `getTreasuryStepStatuses`, `formatTreasuryProgress`.
|
|
53
|
+
|
|
54
|
+
- **Peers:** React ≥ 18, styled-components ^6.1, `@treasuryspatial/treasury-design-tokens`.
|
|
55
|
+
- **Bundle:** one ESM file with a `'use client'` banner; declarations under `dist/`.
|
|
56
|
+
|
|
57
|
+
## Release
|
|
58
|
+
|
|
59
|
+
```bash
|
|
60
|
+
npm ci
|
|
61
|
+
npm run build
|
|
62
|
+
npm test
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
Bump `version` and merge to `main`: the **publish-npm** workflow publishes it with npm trusted publishing. The
|
|
66
|
+
first version of a package that is not on npm yet is published once by hand by the scope owner (`npm publish`).
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import type { ComponentType, HTMLAttributeAnchorTarget, HTMLAttributes, MouseEventHandler, ReactNode, TableHTMLAttributes } from "react";
|
|
2
|
+
import { type DeepPartial, type TreasuryDesignTokens } from "@treasuryspatial/treasury-design-tokens";
|
|
3
|
+
export type TreasuryTone = "neutral" | "accent" | "success" | "warning" | "danger";
|
|
4
|
+
export type TreasurySurfaceTone = "default" | "raised" | "muted" | "danger";
|
|
5
|
+
export type TreasurySurfacePadding = "none" | "sm" | "md" | "lg";
|
|
6
|
+
export type TreasuryTokenOverrides = DeepPartial<TreasuryDesignTokens>;
|
|
7
|
+
export interface TreasuryTokenProps {
|
|
8
|
+
tokens?: TreasuryTokenOverrides;
|
|
9
|
+
}
|
|
10
|
+
export declare const resolveTreasuryTokens: (tokens?: TreasuryTokenOverrides) => TreasuryDesignTokens;
|
|
11
|
+
export interface TreasurySurfaceProps extends HTMLAttributes<HTMLElement>, TreasuryTokenProps {
|
|
12
|
+
children?: ReactNode;
|
|
13
|
+
padding?: TreasurySurfacePadding;
|
|
14
|
+
tone?: TreasurySurfaceTone;
|
|
15
|
+
}
|
|
16
|
+
export declare function TreasurySurface({ children, padding, tone, tokens, ...props }: TreasurySurfaceProps): import("react").JSX.Element;
|
|
17
|
+
export declare const TreasuryStack: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Merged<Omit<import("react").DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
|
|
18
|
+
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
19
|
+
}, {
|
|
20
|
+
$gap?: keyof TreasuryDesignTokens["spacing"];
|
|
21
|
+
}>> & string;
|
|
22
|
+
export declare const TreasuryInline: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Merged<Omit<import("react").DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
|
|
23
|
+
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
24
|
+
}, {
|
|
25
|
+
$gap?: keyof TreasuryDesignTokens["spacing"];
|
|
26
|
+
}>> & string;
|
|
27
|
+
export interface TreasurySectionHeaderProps extends TreasuryTokenProps {
|
|
28
|
+
action?: ReactNode;
|
|
29
|
+
eyebrow?: ReactNode;
|
|
30
|
+
subtitle?: ReactNode;
|
|
31
|
+
title: ReactNode;
|
|
32
|
+
}
|
|
33
|
+
export declare function TreasurySectionHeader({ action, eyebrow, subtitle, title, tokens, }: TreasurySectionHeaderProps): import("react").JSX.Element;
|
|
34
|
+
export interface TreasuryBadgeProps extends HTMLAttributes<HTMLSpanElement>, TreasuryTokenProps {
|
|
35
|
+
tone?: TreasuryTone;
|
|
36
|
+
}
|
|
37
|
+
export declare function TreasuryBadge({ tone, tokens, ...props }: TreasuryBadgeProps): import("react").JSX.Element;
|
|
38
|
+
export type TreasuryButtonVariant = "primary" | "secondary" | "quiet" | "danger";
|
|
39
|
+
export interface TreasuryButtonProps extends TreasuryTokenProps {
|
|
40
|
+
ariaLabel?: string;
|
|
41
|
+
children?: ReactNode;
|
|
42
|
+
className?: string;
|
|
43
|
+
disabled?: boolean;
|
|
44
|
+
href?: string;
|
|
45
|
+
icon?: ReactNode;
|
|
46
|
+
onClick?: MouseEventHandler<HTMLElement>;
|
|
47
|
+
rel?: string;
|
|
48
|
+
target?: HTMLAttributeAnchorTarget;
|
|
49
|
+
type?: "button" | "submit" | "reset";
|
|
50
|
+
variant?: TreasuryButtonVariant;
|
|
51
|
+
}
|
|
52
|
+
export declare function TreasuryButton({ ariaLabel, children, className, disabled, href, icon, onClick, rel, target, tokens, type, variant, }: TreasuryButtonProps): import("react").JSX.Element;
|
|
53
|
+
export interface TreasuryMetricProps extends HTMLAttributes<HTMLDivElement>, TreasuryTokenProps {
|
|
54
|
+
label: ReactNode;
|
|
55
|
+
value: ReactNode;
|
|
56
|
+
detail?: ReactNode;
|
|
57
|
+
}
|
|
58
|
+
export declare function TreasuryMetric({ detail, label, tokens, value, ...props }: TreasuryMetricProps): import("react").JSX.Element;
|
|
59
|
+
export type TreasuryKeyValueItem = {
|
|
60
|
+
key: string;
|
|
61
|
+
label: ReactNode;
|
|
62
|
+
value: ReactNode;
|
|
63
|
+
};
|
|
64
|
+
export interface TreasuryKeyValueListProps extends TreasuryTokenProps {
|
|
65
|
+
items: TreasuryKeyValueItem[];
|
|
66
|
+
}
|
|
67
|
+
export declare function TreasuryKeyValueList({ items, tokens }: TreasuryKeyValueListProps): import("react").JSX.Element;
|
|
68
|
+
export declare const TreasuryTableContainer: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<HTMLAttributes<HTMLDivElement>, HTMLDivElement>, "style"> & {
|
|
69
|
+
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
70
|
+
}> & string;
|
|
71
|
+
export declare const TreasuryTable: import("styled-components/dist/types").IStyledComponentBase<"web", import("styled-components/dist/types").Merged<Omit<import("react").DetailedHTMLProps<TableHTMLAttributes<HTMLTableElement>, HTMLTableElement>, "style"> & {
|
|
72
|
+
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
73
|
+
}, TableHTMLAttributes<HTMLTableElement>>> & string;
|
|
74
|
+
export declare const TreasuryTableHead: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<HTMLAttributes<HTMLTableSectionElement>, HTMLTableSectionElement>, "style"> & {
|
|
75
|
+
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
76
|
+
}> & string;
|
|
77
|
+
export declare const TreasuryTableBody: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<HTMLAttributes<HTMLTableSectionElement>, HTMLTableSectionElement>, "style"> & {
|
|
78
|
+
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
79
|
+
}> & string;
|
|
80
|
+
export declare const TreasuryTableRow: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<HTMLAttributes<HTMLTableRowElement>, HTMLTableRowElement>, "style"> & {
|
|
81
|
+
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
82
|
+
}> & string;
|
|
83
|
+
export declare const TreasuryTableHeaderCell: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").ThHTMLAttributes<HTMLTableHeaderCellElement>, HTMLTableHeaderCellElement>, "style"> & {
|
|
84
|
+
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
85
|
+
}> & string;
|
|
86
|
+
export declare const TreasuryTableCell: import("styled-components/dist/types").IStyledComponentBase<"web", Omit<import("react").DetailedHTMLProps<import("react").TdHTMLAttributes<HTMLTableDataCellElement>, HTMLTableDataCellElement>, "style"> & {
|
|
87
|
+
style?: import("react").CSSProperties | import("styled-components/dist/types").CSSPropertiesWithVars | undefined;
|
|
88
|
+
}> & string;
|
|
89
|
+
export interface TreasuryEmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, "title">, TreasuryTokenProps {
|
|
90
|
+
action?: ReactNode;
|
|
91
|
+
message?: ReactNode;
|
|
92
|
+
title: ReactNode;
|
|
93
|
+
}
|
|
94
|
+
export declare function TreasuryEmptyState({ action, message, title, tokens, ...props }: TreasuryEmptyStateProps): import("react").JSX.Element;
|
|
95
|
+
export interface TreasuryContractFailureProps extends TreasuryTokenProps {
|
|
96
|
+
action?: ReactNode;
|
|
97
|
+
details?: ReactNode;
|
|
98
|
+
title?: ReactNode;
|
|
99
|
+
}
|
|
100
|
+
export declare function TreasuryContractFailure({ action, details, title, tokens, }: TreasuryContractFailureProps): import("react").JSX.Element;
|
|
101
|
+
/** Renders `issues` as a contract failure, or null when there are none: `const failure = treasuryContractIssues(...)`. */
|
|
102
|
+
export declare function TreasuryContractIssues({ issues, title, tokens, }: {
|
|
103
|
+
issues: string[];
|
|
104
|
+
title: ReactNode;
|
|
105
|
+
} & TreasuryTokenProps): import("react").JSX.Element | null;
|
|
106
|
+
export interface TreasuryPersonChipProps extends TreasuryTokenProps {
|
|
107
|
+
name: string;
|
|
108
|
+
/** One line: specialty, title, "lead". */
|
|
109
|
+
role?: ReactNode;
|
|
110
|
+
/** Headshot URL. Without one the chip shows the name's initials. */
|
|
111
|
+
imageUrl?: string | null;
|
|
112
|
+
href?: string;
|
|
113
|
+
className?: string;
|
|
114
|
+
}
|
|
115
|
+
/** First letter of the first and last words, upper-cased: "John Manoochehri" → "JM", "Maria" → "M". */
|
|
116
|
+
export declare function getTreasuryInitials(name: string): string;
|
|
117
|
+
export declare function getTreasuryPersonChipIssues(props: {
|
|
118
|
+
name?: unknown;
|
|
119
|
+
}): string[];
|
|
120
|
+
export declare function TreasuryPersonChip({ className, href, imageUrl, name, role, tokens }: TreasuryPersonChipProps): import("react").JSX.Element;
|
|
121
|
+
export type TreasuryStepStatus = "done" | "current" | "upcoming";
|
|
122
|
+
export interface TreasuryStep {
|
|
123
|
+
id: string;
|
|
124
|
+
label: ReactNode;
|
|
125
|
+
}
|
|
126
|
+
export interface TreasuryStepperProps extends TreasuryTokenProps {
|
|
127
|
+
steps: TreasuryStep[];
|
|
128
|
+
/** The stage in progress. null = not started (all upcoming). */
|
|
129
|
+
currentId: string | null;
|
|
130
|
+
/** Every stage done (the engagement closed). */
|
|
131
|
+
complete?: boolean;
|
|
132
|
+
/** Accessible name of the list; default "Stages". */
|
|
133
|
+
ariaLabel?: string;
|
|
134
|
+
className?: string;
|
|
135
|
+
}
|
|
136
|
+
/** Steps before `currentId` are done, `currentId` is current, the rest upcoming; `complete` makes all done. */
|
|
137
|
+
export declare function getTreasuryStepStatuses(steps: TreasuryStep[], currentId: string | null, complete?: boolean): TreasuryStepStatus[];
|
|
138
|
+
export declare function getTreasuryStepperIssues(props: {
|
|
139
|
+
steps?: TreasuryStep[];
|
|
140
|
+
currentId?: unknown;
|
|
141
|
+
complete?: boolean;
|
|
142
|
+
}): string[];
|
|
143
|
+
export declare function TreasuryStepper({ ariaLabel, className, complete, currentId, steps, tokens }: TreasuryStepperProps): import("react").JSX.Element;
|
|
144
|
+
export type TreasurySectionCompleteness = "complete" | "partial" | "empty";
|
|
145
|
+
export interface TreasurySectionTab {
|
|
146
|
+
id: string;
|
|
147
|
+
label: ReactNode;
|
|
148
|
+
/** Anchor or route of the section. Without it the tab is a button that calls onSelect. */
|
|
149
|
+
href?: string;
|
|
150
|
+
/** Omit for no dot. */
|
|
151
|
+
completeness?: TreasurySectionCompleteness;
|
|
152
|
+
}
|
|
153
|
+
type TreasuryLinkLike = ComponentType<{
|
|
154
|
+
href: string;
|
|
155
|
+
className?: string;
|
|
156
|
+
children?: ReactNode;
|
|
157
|
+
"aria-current"?: "true" | "page" | "location";
|
|
158
|
+
}>;
|
|
159
|
+
export interface TreasurySectionTabsProps extends TreasuryTokenProps {
|
|
160
|
+
tabs: TreasurySectionTab[];
|
|
161
|
+
activeId: string;
|
|
162
|
+
/** Called with the tab id; required for tabs without href. */
|
|
163
|
+
onSelect?: (id: string) => void;
|
|
164
|
+
/** Accessible name of the row ("Onboarding sections"). */
|
|
165
|
+
ariaLabel: string;
|
|
166
|
+
/** Next.js Link or similar for href tabs; defaults to <a>. */
|
|
167
|
+
linkComponent?: TreasuryLinkLike;
|
|
168
|
+
className?: string;
|
|
169
|
+
}
|
|
170
|
+
export declare function getTreasurySectionTabsIssues(props: {
|
|
171
|
+
tabs?: TreasurySectionTab[];
|
|
172
|
+
activeId?: unknown;
|
|
173
|
+
onSelect?: unknown;
|
|
174
|
+
ariaLabel?: unknown;
|
|
175
|
+
}): string[];
|
|
176
|
+
export declare function TreasurySectionTabs({ activeId, ariaLabel, className, linkComponent, onSelect, tabs, tokens, }: TreasurySectionTabsProps): import("react").JSX.Element;
|
|
177
|
+
export interface TreasuryProgressProps extends TreasuryTokenProps {
|
|
178
|
+
value: number;
|
|
179
|
+
max: number;
|
|
180
|
+
/** What is counted, after "n of m": "sections complete". */
|
|
181
|
+
unit?: string;
|
|
182
|
+
/** A heading on the left of the count ("Setup"). */
|
|
183
|
+
label?: ReactNode;
|
|
184
|
+
/** Default true. */
|
|
185
|
+
showBar?: boolean;
|
|
186
|
+
className?: string;
|
|
187
|
+
}
|
|
188
|
+
export declare function getTreasuryProgressIssues(props: {
|
|
189
|
+
value?: unknown;
|
|
190
|
+
max?: unknown;
|
|
191
|
+
}): string[];
|
|
192
|
+
/** "4 of 8 sections complete". */
|
|
193
|
+
export declare function formatTreasuryProgress(value: number, max: number, unit?: string): string;
|
|
194
|
+
export declare function TreasuryProgress({ className, label, max, showBar, tokens, unit, value }: TreasuryProgressProps): import("react").JSX.Element;
|
|
195
|
+
export {};
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,822 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
|
|
3
|
+
// src/index.tsx
|
|
4
|
+
import styled, { css } from "styled-components";
|
|
5
|
+
import {
|
|
6
|
+
createTreasuryDesignTokens
|
|
7
|
+
} from "@treasuryspatial/treasury-design-tokens";
|
|
8
|
+
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
9
|
+
var resolveTreasuryTokens = (tokens) => createTreasuryDesignTokens(tokens);
|
|
10
|
+
var toneColors = (tone, tokens) => {
|
|
11
|
+
if (tone === "accent") {
|
|
12
|
+
return {
|
|
13
|
+
background: tokens.colors.accentSoft,
|
|
14
|
+
border: tokens.colors.accent,
|
|
15
|
+
text: tokens.colors.accentStrong
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
if (tone === "success") {
|
|
19
|
+
return {
|
|
20
|
+
background: tokens.colors.successSoft,
|
|
21
|
+
border: tokens.colors.success,
|
|
22
|
+
text: tokens.colors.success
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
if (tone === "warning") {
|
|
26
|
+
return {
|
|
27
|
+
background: tokens.colors.warningSoft,
|
|
28
|
+
border: tokens.colors.warning,
|
|
29
|
+
text: tokens.colors.warning
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
if (tone === "danger") {
|
|
33
|
+
return {
|
|
34
|
+
background: tokens.colors.dangerSoft,
|
|
35
|
+
border: tokens.colors.danger,
|
|
36
|
+
text: tokens.colors.danger
|
|
37
|
+
};
|
|
38
|
+
}
|
|
39
|
+
return {
|
|
40
|
+
background: tokens.colors.surfaceRaised,
|
|
41
|
+
border: tokens.colors.borderMuted,
|
|
42
|
+
text: tokens.colors.textMuted
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
var surfaceBackground = (tone, tokens) => {
|
|
46
|
+
if (tone === "raised") return tokens.colors.surfaceRaised;
|
|
47
|
+
if (tone === "muted") return tokens.colors.canvas;
|
|
48
|
+
if (tone === "danger") return tokens.colors.dangerSoft;
|
|
49
|
+
return tokens.colors.surface;
|
|
50
|
+
};
|
|
51
|
+
var surfaceBorder = (tone, tokens) => {
|
|
52
|
+
if (tone === "danger") return tokens.colors.danger;
|
|
53
|
+
return tokens.colors.borderMuted;
|
|
54
|
+
};
|
|
55
|
+
var paddingFor = (padding, tokens) => {
|
|
56
|
+
if (padding === "none") return "0";
|
|
57
|
+
if (padding === "sm") return tokens.spacing.md;
|
|
58
|
+
if (padding === "lg") return tokens.spacing.xl;
|
|
59
|
+
return tokens.spacing.lg;
|
|
60
|
+
};
|
|
61
|
+
var BaseSurface = styled.section`
|
|
62
|
+
background: ${({ $tone, $tokens }) => surfaceBackground($tone, $tokens)};
|
|
63
|
+
border: 1px solid ${({ $tone, $tokens }) => surfaceBorder($tone, $tokens)};
|
|
64
|
+
border-radius: ${({ $tokens }) => $tokens.radii.md};
|
|
65
|
+
color: ${({ $tokens }) => $tokens.colors.text};
|
|
66
|
+
display: block;
|
|
67
|
+
padding: ${({ $padding, $tokens }) => paddingFor($padding, $tokens)};
|
|
68
|
+
`;
|
|
69
|
+
function TreasurySurface({
|
|
70
|
+
children,
|
|
71
|
+
padding = "md",
|
|
72
|
+
tone = "default",
|
|
73
|
+
tokens,
|
|
74
|
+
...props
|
|
75
|
+
}) {
|
|
76
|
+
return /* @__PURE__ */ jsx(BaseSurface, { $padding: padding, $tone: tone, $tokens: resolveTreasuryTokens(tokens), ...props, children });
|
|
77
|
+
}
|
|
78
|
+
var TreasuryStack = styled.div`
|
|
79
|
+
display: grid;
|
|
80
|
+
gap: ${({ $gap = "lg" }) => createTreasuryDesignTokens().spacing[$gap]};
|
|
81
|
+
`;
|
|
82
|
+
var TreasuryInline = styled.div`
|
|
83
|
+
align-items: center;
|
|
84
|
+
display: flex;
|
|
85
|
+
flex-wrap: wrap;
|
|
86
|
+
gap: ${({ $gap = "sm" }) => createTreasuryDesignTokens().spacing[$gap]};
|
|
87
|
+
`;
|
|
88
|
+
var SectionHeaderRoot = styled.div`
|
|
89
|
+
align-items: flex-start;
|
|
90
|
+
display: flex;
|
|
91
|
+
gap: ${({ $tokens }) => $tokens.spacing.lg};
|
|
92
|
+
justify-content: space-between;
|
|
93
|
+
min-width: 0;
|
|
94
|
+
`;
|
|
95
|
+
var SectionHeaderCopy = styled.div`
|
|
96
|
+
display: grid;
|
|
97
|
+
gap: ${({ $tokens }) => $tokens.spacing.xs};
|
|
98
|
+
min-width: 0;
|
|
99
|
+
`;
|
|
100
|
+
var Eyebrow = styled.div`
|
|
101
|
+
color: ${({ $tokens }) => $tokens.colors.textSubtle};
|
|
102
|
+
font-family: ${({ $tokens }) => $tokens.typography.family.body};
|
|
103
|
+
font-size: ${({ $tokens }) => $tokens.typography.size.xs};
|
|
104
|
+
font-weight: ${({ $tokens }) => $tokens.typography.weight.semibold};
|
|
105
|
+
letter-spacing: ${({ $tokens }) => $tokens.typography.letterSpacing.caps};
|
|
106
|
+
text-transform: uppercase;
|
|
107
|
+
`;
|
|
108
|
+
var SectionTitle = styled.h2`
|
|
109
|
+
color: ${({ $tokens }) => $tokens.colors.text};
|
|
110
|
+
font-family: ${({ $tokens }) => $tokens.typography.family.heading};
|
|
111
|
+
font-size: ${({ $tokens }) => $tokens.typography.size.xl};
|
|
112
|
+
font-weight: ${({ $tokens }) => $tokens.typography.weight.medium};
|
|
113
|
+
letter-spacing: ${({ $tokens }) => $tokens.typography.letterSpacing.tight};
|
|
114
|
+
line-height: 1.18;
|
|
115
|
+
margin: 0;
|
|
116
|
+
`;
|
|
117
|
+
var SectionSubtitle = styled.p`
|
|
118
|
+
color: ${({ $tokens }) => $tokens.colors.textMuted};
|
|
119
|
+
font-family: ${({ $tokens }) => $tokens.typography.family.body};
|
|
120
|
+
font-size: ${({ $tokens }) => $tokens.typography.size.sm};
|
|
121
|
+
line-height: 1.5;
|
|
122
|
+
margin: 0;
|
|
123
|
+
`;
|
|
124
|
+
function TreasurySectionHeader({
|
|
125
|
+
action,
|
|
126
|
+
eyebrow,
|
|
127
|
+
subtitle,
|
|
128
|
+
title,
|
|
129
|
+
tokens
|
|
130
|
+
}) {
|
|
131
|
+
const resolvedTokens = resolveTreasuryTokens(tokens);
|
|
132
|
+
return /* @__PURE__ */ jsxs(SectionHeaderRoot, { $tokens: resolvedTokens, children: [
|
|
133
|
+
/* @__PURE__ */ jsxs(SectionHeaderCopy, { $tokens: resolvedTokens, children: [
|
|
134
|
+
eyebrow ? /* @__PURE__ */ jsx(Eyebrow, { $tokens: resolvedTokens, children: eyebrow }) : null,
|
|
135
|
+
/* @__PURE__ */ jsx(SectionTitle, { $tokens: resolvedTokens, children: title }),
|
|
136
|
+
subtitle ? /* @__PURE__ */ jsx(SectionSubtitle, { $tokens: resolvedTokens, children: subtitle }) : null
|
|
137
|
+
] }),
|
|
138
|
+
action ? /* @__PURE__ */ jsx("div", { children: action }) : null
|
|
139
|
+
] });
|
|
140
|
+
}
|
|
141
|
+
var Badge = styled.span`
|
|
142
|
+
${({ $tone, $tokens }) => {
|
|
143
|
+
const colors = toneColors($tone, $tokens);
|
|
144
|
+
return css`
|
|
145
|
+
background: ${colors.background};
|
|
146
|
+
border-color: ${colors.border};
|
|
147
|
+
color: ${colors.text};
|
|
148
|
+
`;
|
|
149
|
+
}}
|
|
150
|
+
align-items: center;
|
|
151
|
+
border: 1px solid;
|
|
152
|
+
border-radius: ${({ $tokens }) => $tokens.radii.sm};
|
|
153
|
+
display: inline-flex;
|
|
154
|
+
font-family: ${({ $tokens }) => $tokens.typography.family.body};
|
|
155
|
+
font-size: ${({ $tokens }) => $tokens.typography.size.xs};
|
|
156
|
+
font-weight: ${({ $tokens }) => $tokens.typography.weight.medium};
|
|
157
|
+
line-height: 1;
|
|
158
|
+
min-height: 24px;
|
|
159
|
+
padding: 0 ${({ $tokens }) => $tokens.spacing.sm};
|
|
160
|
+
white-space: nowrap;
|
|
161
|
+
`;
|
|
162
|
+
function TreasuryBadge({ tone = "neutral", tokens, ...props }) {
|
|
163
|
+
return /* @__PURE__ */ jsx(Badge, { $tone: tone, $tokens: resolveTreasuryTokens(tokens), ...props });
|
|
164
|
+
}
|
|
165
|
+
var buttonVariant = (variant, tokens) => {
|
|
166
|
+
if (variant === "primary") {
|
|
167
|
+
return css`
|
|
168
|
+
background: ${tokens.colors.accent};
|
|
169
|
+
border-color: ${tokens.colors.accent};
|
|
170
|
+
color: ${tokens.colors.inverseText};
|
|
171
|
+
`;
|
|
172
|
+
}
|
|
173
|
+
if (variant === "danger") {
|
|
174
|
+
return css`
|
|
175
|
+
background: ${tokens.colors.danger};
|
|
176
|
+
border-color: ${tokens.colors.danger};
|
|
177
|
+
color: ${tokens.colors.inverseText};
|
|
178
|
+
`;
|
|
179
|
+
}
|
|
180
|
+
if (variant === "quiet") {
|
|
181
|
+
return css`
|
|
182
|
+
background: transparent;
|
|
183
|
+
border-color: transparent;
|
|
184
|
+
color: ${tokens.colors.textMuted};
|
|
185
|
+
`;
|
|
186
|
+
}
|
|
187
|
+
return css`
|
|
188
|
+
background: ${tokens.colors.surface};
|
|
189
|
+
border-color: ${tokens.colors.border};
|
|
190
|
+
color: ${tokens.colors.text};
|
|
191
|
+
`;
|
|
192
|
+
};
|
|
193
|
+
var buttonCss = css`
|
|
194
|
+
${({ $tokens, $variant }) => buttonVariant($variant, $tokens)}
|
|
195
|
+
align-items: center;
|
|
196
|
+
border: 1px solid;
|
|
197
|
+
border-radius: ${({ $tokens }) => $tokens.radii.md};
|
|
198
|
+
cursor: pointer;
|
|
199
|
+
display: inline-flex;
|
|
200
|
+
font-family: ${({ $tokens }) => $tokens.typography.family.body};
|
|
201
|
+
font-size: ${({ $tokens }) => $tokens.typography.size.sm};
|
|
202
|
+
font-weight: ${({ $tokens }) => $tokens.typography.weight.medium};
|
|
203
|
+
gap: ${({ $tokens }) => $tokens.spacing.sm};
|
|
204
|
+
justify-content: center;
|
|
205
|
+
line-height: 1;
|
|
206
|
+
min-height: 36px;
|
|
207
|
+
padding: 0 ${({ $tokens }) => $tokens.spacing.lg};
|
|
208
|
+
text-decoration: none;
|
|
209
|
+
transition:
|
|
210
|
+
background ${({ $tokens }) => $tokens.motion.quick} ${({ $tokens }) => $tokens.motion.easing},
|
|
211
|
+
border-color ${({ $tokens }) => $tokens.motion.quick} ${({ $tokens }) => $tokens.motion.easing},
|
|
212
|
+
color ${({ $tokens }) => $tokens.motion.quick} ${({ $tokens }) => $tokens.motion.easing};
|
|
213
|
+
white-space: nowrap;
|
|
214
|
+
|
|
215
|
+
&:disabled,
|
|
216
|
+
&[aria-disabled="true"] {
|
|
217
|
+
cursor: not-allowed;
|
|
218
|
+
opacity: 0.48;
|
|
219
|
+
}
|
|
220
|
+
`;
|
|
221
|
+
var Button = styled.button`
|
|
222
|
+
${buttonCss}
|
|
223
|
+
`;
|
|
224
|
+
var ButtonLink = styled.a`
|
|
225
|
+
${buttonCss}
|
|
226
|
+
`;
|
|
227
|
+
function TreasuryButton({
|
|
228
|
+
ariaLabel,
|
|
229
|
+
children,
|
|
230
|
+
className,
|
|
231
|
+
disabled,
|
|
232
|
+
href,
|
|
233
|
+
icon,
|
|
234
|
+
onClick,
|
|
235
|
+
rel,
|
|
236
|
+
target,
|
|
237
|
+
tokens,
|
|
238
|
+
type = "button",
|
|
239
|
+
variant = "secondary"
|
|
240
|
+
}) {
|
|
241
|
+
const resolvedTokens = resolveTreasuryTokens(tokens);
|
|
242
|
+
if (href) {
|
|
243
|
+
return /* @__PURE__ */ jsxs(
|
|
244
|
+
ButtonLink,
|
|
245
|
+
{
|
|
246
|
+
$tokens: resolvedTokens,
|
|
247
|
+
$variant: variant,
|
|
248
|
+
"aria-disabled": disabled,
|
|
249
|
+
"aria-label": ariaLabel,
|
|
250
|
+
className,
|
|
251
|
+
href: disabled ? void 0 : href,
|
|
252
|
+
onClick,
|
|
253
|
+
rel,
|
|
254
|
+
target,
|
|
255
|
+
children: [
|
|
256
|
+
icon,
|
|
257
|
+
children
|
|
258
|
+
]
|
|
259
|
+
}
|
|
260
|
+
);
|
|
261
|
+
}
|
|
262
|
+
return /* @__PURE__ */ jsxs(
|
|
263
|
+
Button,
|
|
264
|
+
{
|
|
265
|
+
$tokens: resolvedTokens,
|
|
266
|
+
$variant: variant,
|
|
267
|
+
"aria-label": ariaLabel,
|
|
268
|
+
className,
|
|
269
|
+
disabled,
|
|
270
|
+
onClick,
|
|
271
|
+
type,
|
|
272
|
+
children: [
|
|
273
|
+
icon,
|
|
274
|
+
children
|
|
275
|
+
]
|
|
276
|
+
}
|
|
277
|
+
);
|
|
278
|
+
}
|
|
279
|
+
var MetricRoot = styled.div`
|
|
280
|
+
border: 1px solid ${({ $tokens }) => $tokens.colors.borderMuted};
|
|
281
|
+
border-radius: ${({ $tokens }) => $tokens.radii.md};
|
|
282
|
+
display: grid;
|
|
283
|
+
gap: ${({ $tokens }) => $tokens.spacing.xs};
|
|
284
|
+
padding: ${({ $tokens }) => $tokens.spacing.lg};
|
|
285
|
+
`;
|
|
286
|
+
var MetricValue = styled.div`
|
|
287
|
+
color: ${({ $tokens }) => $tokens.colors.text};
|
|
288
|
+
font-family: ${({ $tokens }) => $tokens.typography.family.heading};
|
|
289
|
+
font-size: ${({ $tokens }) => $tokens.typography.size.xl};
|
|
290
|
+
font-weight: ${({ $tokens }) => $tokens.typography.weight.medium};
|
|
291
|
+
line-height: 1.1;
|
|
292
|
+
`;
|
|
293
|
+
function TreasuryMetric({ detail, label, tokens, value, ...props }) {
|
|
294
|
+
const resolvedTokens = resolveTreasuryTokens(tokens);
|
|
295
|
+
return /* @__PURE__ */ jsxs(MetricRoot, { $tokens: resolvedTokens, ...props, children: [
|
|
296
|
+
/* @__PURE__ */ jsx(Eyebrow, { $tokens: resolvedTokens, children: label }),
|
|
297
|
+
/* @__PURE__ */ jsx(MetricValue, { $tokens: resolvedTokens, children: value }),
|
|
298
|
+
detail ? /* @__PURE__ */ jsx(SectionSubtitle, { $tokens: resolvedTokens, children: detail }) : null
|
|
299
|
+
] });
|
|
300
|
+
}
|
|
301
|
+
var KeyValueList = styled.dl`
|
|
302
|
+
display: grid;
|
|
303
|
+
gap: ${({ $tokens }) => $tokens.spacing.sm};
|
|
304
|
+
margin: 0;
|
|
305
|
+
`;
|
|
306
|
+
var KeyValueRow = styled.div`
|
|
307
|
+
display: grid;
|
|
308
|
+
gap: ${({ $tokens }) => $tokens.spacing.sm};
|
|
309
|
+
grid-template-columns: minmax(120px, 0.36fr) minmax(0, 1fr);
|
|
310
|
+
|
|
311
|
+
@media (max-width: 620px) {
|
|
312
|
+
grid-template-columns: 1fr;
|
|
313
|
+
}
|
|
314
|
+
`;
|
|
315
|
+
var KeyTerm = styled.dt`
|
|
316
|
+
color: ${({ $tokens }) => $tokens.colors.textSubtle};
|
|
317
|
+
font-family: ${({ $tokens }) => $tokens.typography.family.body};
|
|
318
|
+
font-size: ${({ $tokens }) => $tokens.typography.size.sm};
|
|
319
|
+
`;
|
|
320
|
+
var KeyValue = styled.dd`
|
|
321
|
+
color: ${({ $tokens }) => $tokens.colors.text};
|
|
322
|
+
font-family: ${({ $tokens }) => $tokens.typography.family.body};
|
|
323
|
+
font-size: ${({ $tokens }) => $tokens.typography.size.sm};
|
|
324
|
+
margin: 0;
|
|
325
|
+
min-width: 0;
|
|
326
|
+
`;
|
|
327
|
+
function TreasuryKeyValueList({ items, tokens }) {
|
|
328
|
+
const resolvedTokens = resolveTreasuryTokens(tokens);
|
|
329
|
+
return /* @__PURE__ */ jsx(KeyValueList, { $tokens: resolvedTokens, children: items.map((item) => /* @__PURE__ */ jsxs(KeyValueRow, { $tokens: resolvedTokens, children: [
|
|
330
|
+
/* @__PURE__ */ jsx(KeyTerm, { $tokens: resolvedTokens, children: item.label }),
|
|
331
|
+
/* @__PURE__ */ jsx(KeyValue, { $tokens: resolvedTokens, children: item.value })
|
|
332
|
+
] }, item.key)) });
|
|
333
|
+
}
|
|
334
|
+
var TreasuryTableContainer = styled.div`
|
|
335
|
+
overflow-x: auto;
|
|
336
|
+
width: 100%;
|
|
337
|
+
`;
|
|
338
|
+
var TreasuryTable = styled.table`
|
|
339
|
+
border-collapse: collapse;
|
|
340
|
+
min-width: 100%;
|
|
341
|
+
`;
|
|
342
|
+
var TreasuryTableHead = styled.thead``;
|
|
343
|
+
var TreasuryTableBody = styled.tbody``;
|
|
344
|
+
var TreasuryTableRow = styled.tr``;
|
|
345
|
+
var TreasuryTableHeaderCell = styled.th`
|
|
346
|
+
border-bottom: 1px solid ${createTreasuryDesignTokens().colors.border};
|
|
347
|
+
color: ${createTreasuryDesignTokens().colors.textSubtle};
|
|
348
|
+
font-family: ${createTreasuryDesignTokens().typography.family.body};
|
|
349
|
+
font-size: ${createTreasuryDesignTokens().typography.size.xs};
|
|
350
|
+
font-weight: ${createTreasuryDesignTokens().typography.weight.semibold};
|
|
351
|
+
letter-spacing: ${createTreasuryDesignTokens().typography.letterSpacing.caps};
|
|
352
|
+
padding: ${createTreasuryDesignTokens().spacing.md};
|
|
353
|
+
text-align: left;
|
|
354
|
+
text-transform: uppercase;
|
|
355
|
+
`;
|
|
356
|
+
var TreasuryTableCell = styled.td`
|
|
357
|
+
border-bottom: 1px solid ${createTreasuryDesignTokens().colors.borderMuted};
|
|
358
|
+
color: ${createTreasuryDesignTokens().colors.text};
|
|
359
|
+
font-family: ${createTreasuryDesignTokens().typography.family.body};
|
|
360
|
+
font-size: ${createTreasuryDesignTokens().typography.size.sm};
|
|
361
|
+
padding: ${createTreasuryDesignTokens().spacing.md};
|
|
362
|
+
vertical-align: top;
|
|
363
|
+
`;
|
|
364
|
+
var EmptyRoot = styled.div`
|
|
365
|
+
align-items: center;
|
|
366
|
+
border: 1px dashed ${({ $tokens }) => $tokens.colors.border};
|
|
367
|
+
border-radius: ${({ $tokens }) => $tokens.radii.md};
|
|
368
|
+
display: grid;
|
|
369
|
+
gap: ${({ $tokens }) => $tokens.spacing.md};
|
|
370
|
+
justify-items: start;
|
|
371
|
+
padding: ${({ $tokens }) => $tokens.spacing.xl};
|
|
372
|
+
`;
|
|
373
|
+
function TreasuryEmptyState({ action, message, title, tokens, ...props }) {
|
|
374
|
+
const resolvedTokens = resolveTreasuryTokens(tokens);
|
|
375
|
+
return /* @__PURE__ */ jsxs(EmptyRoot, { $tokens: resolvedTokens, ...props, children: [
|
|
376
|
+
/* @__PURE__ */ jsx(SectionTitle, { $tokens: resolvedTokens, children: title }),
|
|
377
|
+
message ? /* @__PURE__ */ jsx(SectionSubtitle, { $tokens: resolvedTokens, children: message }) : null,
|
|
378
|
+
action
|
|
379
|
+
] });
|
|
380
|
+
}
|
|
381
|
+
var FailureRoot = styled(TreasurySurface)`
|
|
382
|
+
border-width: 2px;
|
|
383
|
+
`;
|
|
384
|
+
var FailureTitle = styled.h2`
|
|
385
|
+
color: ${({ $tokens }) => $tokens.colors.danger};
|
|
386
|
+
font-family: ${({ $tokens }) => $tokens.typography.family.heading};
|
|
387
|
+
font-size: ${({ $tokens }) => $tokens.typography.size.lg};
|
|
388
|
+
font-weight: ${({ $tokens }) => $tokens.typography.weight.semibold};
|
|
389
|
+
margin: 0;
|
|
390
|
+
`;
|
|
391
|
+
var FailureDetails = styled.div`
|
|
392
|
+
color: ${({ $tokens }) => $tokens.colors.danger};
|
|
393
|
+
font-family: ${({ $tokens }) => $tokens.typography.family.body};
|
|
394
|
+
font-size: ${({ $tokens }) => $tokens.typography.size.sm};
|
|
395
|
+
line-height: 1.5;
|
|
396
|
+
|
|
397
|
+
ul {
|
|
398
|
+
margin: 0;
|
|
399
|
+
padding-left: 1.2em;
|
|
400
|
+
}
|
|
401
|
+
`;
|
|
402
|
+
function TreasuryContractFailure({
|
|
403
|
+
action,
|
|
404
|
+
details,
|
|
405
|
+
title = "Treasury UI contract failure",
|
|
406
|
+
tokens
|
|
407
|
+
}) {
|
|
408
|
+
const resolvedTokens = resolveTreasuryTokens(tokens);
|
|
409
|
+
return /* @__PURE__ */ jsxs(FailureRoot, { "data-treasury-contract-failure": "", role: "alert", tokens, tone: "danger", children: [
|
|
410
|
+
/* @__PURE__ */ jsx(FailureTitle, { $tokens: resolvedTokens, children: title }),
|
|
411
|
+
details ? /* @__PURE__ */ jsx(FailureDetails, { $tokens: resolvedTokens, children: details }) : null,
|
|
412
|
+
action
|
|
413
|
+
] });
|
|
414
|
+
}
|
|
415
|
+
function TreasuryContractIssues({
|
|
416
|
+
issues,
|
|
417
|
+
title,
|
|
418
|
+
tokens
|
|
419
|
+
}) {
|
|
420
|
+
if (!issues.length) return null;
|
|
421
|
+
return /* @__PURE__ */ jsx(
|
|
422
|
+
TreasuryContractFailure,
|
|
423
|
+
{
|
|
424
|
+
details: /* @__PURE__ */ jsx("ul", { children: issues.map((issue) => /* @__PURE__ */ jsx("li", { children: issue }, issue)) }),
|
|
425
|
+
title,
|
|
426
|
+
tokens
|
|
427
|
+
}
|
|
428
|
+
);
|
|
429
|
+
}
|
|
430
|
+
var VisuallyHidden = styled.span`
|
|
431
|
+
border: 0;
|
|
432
|
+
clip: rect(0 0 0 0);
|
|
433
|
+
height: 1px;
|
|
434
|
+
margin: -1px;
|
|
435
|
+
overflow: hidden;
|
|
436
|
+
padding: 0;
|
|
437
|
+
position: absolute;
|
|
438
|
+
white-space: nowrap;
|
|
439
|
+
width: 1px;
|
|
440
|
+
`;
|
|
441
|
+
var duplicateValues = (values) => [...new Set(values.filter((value, index) => values.indexOf(value) !== index))];
|
|
442
|
+
function getTreasuryInitials(name) {
|
|
443
|
+
const words = name.trim().split(/\s+/).filter(Boolean);
|
|
444
|
+
if (!words.length) return "";
|
|
445
|
+
const first = words[0][0] ?? "";
|
|
446
|
+
const last = words.length > 1 ? words[words.length - 1][0] ?? "" : "";
|
|
447
|
+
return `${first}${last}`.toUpperCase();
|
|
448
|
+
}
|
|
449
|
+
var PersonRoot = styled.div`
|
|
450
|
+
align-items: center;
|
|
451
|
+
background: ${({ $tokens }) => $tokens.colors.surfaceRaised};
|
|
452
|
+
border: 1px solid ${({ $tokens }) => $tokens.colors.borderMuted};
|
|
453
|
+
border-radius: ${({ $tokens }) => $tokens.radii.sm};
|
|
454
|
+
color: inherit;
|
|
455
|
+
display: inline-flex;
|
|
456
|
+
gap: ${({ $tokens }) => $tokens.spacing.sm};
|
|
457
|
+
max-width: 100%;
|
|
458
|
+
min-width: 0;
|
|
459
|
+
padding: ${({ $tokens }) => `${$tokens.spacing.xs} ${$tokens.spacing.md} ${$tokens.spacing.xs} ${$tokens.spacing.xs}`};
|
|
460
|
+
text-decoration: none;
|
|
461
|
+
|
|
462
|
+
a&:hover {
|
|
463
|
+
border-color: ${({ $tokens }) => $tokens.colors.accent};
|
|
464
|
+
}
|
|
465
|
+
`;
|
|
466
|
+
var Avatar = styled.span`
|
|
467
|
+
align-items: center;
|
|
468
|
+
background: ${({ $tokens }) => $tokens.colors.accentSoft};
|
|
469
|
+
border-radius: 50%;
|
|
470
|
+
color: ${({ $tokens }) => $tokens.colors.accentStrong};
|
|
471
|
+
display: inline-flex;
|
|
472
|
+
flex: 0 0 auto;
|
|
473
|
+
font-family: ${({ $tokens }) => $tokens.typography.family.body};
|
|
474
|
+
font-size: ${({ $tokens }) => $tokens.typography.size.xs};
|
|
475
|
+
font-weight: ${({ $tokens }) => $tokens.typography.weight.medium};
|
|
476
|
+
height: 28px;
|
|
477
|
+
justify-content: center;
|
|
478
|
+
overflow: hidden;
|
|
479
|
+
width: 28px;
|
|
480
|
+
|
|
481
|
+
img {
|
|
482
|
+
height: 100%;
|
|
483
|
+
object-fit: cover;
|
|
484
|
+
width: 100%;
|
|
485
|
+
}
|
|
486
|
+
`;
|
|
487
|
+
var PersonText = styled.span`
|
|
488
|
+
display: grid;
|
|
489
|
+
font-family: ${({ $tokens }) => $tokens.typography.family.body};
|
|
490
|
+
line-height: 1.3;
|
|
491
|
+
min-width: 0;
|
|
492
|
+
`;
|
|
493
|
+
var PersonName = styled.span`
|
|
494
|
+
color: ${({ $tokens }) => $tokens.colors.text};
|
|
495
|
+
font-size: ${({ $tokens }) => $tokens.typography.size.sm};
|
|
496
|
+
font-weight: ${({ $tokens }) => $tokens.typography.weight.medium};
|
|
497
|
+
overflow: hidden;
|
|
498
|
+
text-overflow: ellipsis;
|
|
499
|
+
white-space: nowrap;
|
|
500
|
+
`;
|
|
501
|
+
var PersonRole = styled.span`
|
|
502
|
+
color: ${({ $tokens }) => $tokens.colors.textSubtle};
|
|
503
|
+
font-size: ${({ $tokens }) => $tokens.typography.size.xs};
|
|
504
|
+
overflow: hidden;
|
|
505
|
+
text-overflow: ellipsis;
|
|
506
|
+
white-space: nowrap;
|
|
507
|
+
`;
|
|
508
|
+
function getTreasuryPersonChipIssues(props) {
|
|
509
|
+
return typeof props.name === "string" && props.name.trim() ? [] : ["Person chip has no name."];
|
|
510
|
+
}
|
|
511
|
+
function TreasuryPersonChip({ className, href, imageUrl, name, role, tokens }) {
|
|
512
|
+
const issues = getTreasuryPersonChipIssues({ name });
|
|
513
|
+
if (issues.length) return /* @__PURE__ */ jsx(TreasuryContractIssues, { issues, title: "Person chip contract failure", tokens });
|
|
514
|
+
const resolvedTokens = resolveTreasuryTokens(tokens);
|
|
515
|
+
return /* @__PURE__ */ jsxs(
|
|
516
|
+
PersonRoot,
|
|
517
|
+
{
|
|
518
|
+
$tokens: resolvedTokens,
|
|
519
|
+
as: href ? "a" : "div",
|
|
520
|
+
className,
|
|
521
|
+
"data-treasury-person": "",
|
|
522
|
+
...href ? { href } : {},
|
|
523
|
+
children: [
|
|
524
|
+
/* @__PURE__ */ jsx(Avatar, { $tokens: resolvedTokens, "aria-hidden": "true", children: imageUrl ? /* @__PURE__ */ jsx("img", { alt: "", src: imageUrl }) : getTreasuryInitials(name) }),
|
|
525
|
+
/* @__PURE__ */ jsxs(PersonText, { $tokens: resolvedTokens, children: [
|
|
526
|
+
/* @__PURE__ */ jsx(PersonName, { $tokens: resolvedTokens, children: name }),
|
|
527
|
+
role ? /* @__PURE__ */ jsx(PersonRole, { $tokens: resolvedTokens, children: role }) : null
|
|
528
|
+
] })
|
|
529
|
+
]
|
|
530
|
+
}
|
|
531
|
+
);
|
|
532
|
+
}
|
|
533
|
+
function getTreasuryStepStatuses(steps, currentId, complete = false) {
|
|
534
|
+
if (complete) return steps.map(() => "done");
|
|
535
|
+
const currentIndex = currentId === null ? -1 : steps.findIndex((step) => step.id === currentId);
|
|
536
|
+
return steps.map((_, index) => {
|
|
537
|
+
if (currentIndex < 0) return "upcoming";
|
|
538
|
+
if (index < currentIndex) return "done";
|
|
539
|
+
return index === currentIndex ? "current" : "upcoming";
|
|
540
|
+
});
|
|
541
|
+
}
|
|
542
|
+
function getTreasuryStepperIssues(props) {
|
|
543
|
+
const issues = [];
|
|
544
|
+
const steps = Array.isArray(props.steps) ? props.steps : [];
|
|
545
|
+
const ids = steps.map((step) => step.id);
|
|
546
|
+
if (!steps.length) issues.push("Stepper has no steps.");
|
|
547
|
+
if (ids.some((id) => typeof id !== "string" || !id)) issues.push("Stepper has a step with an empty id.");
|
|
548
|
+
for (const id of duplicateValues(ids)) issues.push(`Stepper repeats step ${JSON.stringify(id)}.`);
|
|
549
|
+
if (props.currentId !== null && props.currentId !== void 0 && !ids.includes(props.currentId)) {
|
|
550
|
+
issues.push(`Stepper current step ${JSON.stringify(props.currentId)} is not one of its steps.`);
|
|
551
|
+
}
|
|
552
|
+
return issues;
|
|
553
|
+
}
|
|
554
|
+
var StepList = styled.ol`
|
|
555
|
+
display: grid;
|
|
556
|
+
gap: ${({ $tokens }) => $tokens.spacing.xs};
|
|
557
|
+
grid-template-columns: repeat(auto-fit, minmax(72px, 1fr));
|
|
558
|
+
list-style: none;
|
|
559
|
+
margin: 0;
|
|
560
|
+
padding: 0;
|
|
561
|
+
`;
|
|
562
|
+
var StepItem = styled.li`
|
|
563
|
+
color: ${({ $status, $tokens }) => $status === "current" ? $tokens.colors.accentStrong : $tokens.colors.textSubtle};
|
|
564
|
+
display: grid;
|
|
565
|
+
font-family: ${({ $tokens }) => $tokens.typography.family.body};
|
|
566
|
+
font-size: ${({ $tokens }) => $tokens.typography.size.xs};
|
|
567
|
+
font-weight: ${({ $status, $tokens }) => $status === "current" ? $tokens.typography.weight.medium : $tokens.typography.weight.regular};
|
|
568
|
+
gap: 6px;
|
|
569
|
+
line-height: 1.3;
|
|
570
|
+
text-align: center;
|
|
571
|
+
`;
|
|
572
|
+
var StepBar = styled.span`
|
|
573
|
+
background: ${({ $status, $tokens }) => $status === "done" ? $tokens.colors.accent : $status === "current" ? $tokens.colors.accentStrong : $tokens.colors.borderMuted};
|
|
574
|
+
border-radius: ${({ $tokens }) => $tokens.radii.sm};
|
|
575
|
+
display: block;
|
|
576
|
+
height: 6px;
|
|
577
|
+
`;
|
|
578
|
+
var STEP_STATUS_TEXT = { done: "done", current: "current", upcoming: "upcoming" };
|
|
579
|
+
function TreasuryStepper({ ariaLabel = "Stages", className, complete, currentId, steps, tokens }) {
|
|
580
|
+
const issues = getTreasuryStepperIssues({ complete, currentId, steps });
|
|
581
|
+
if (issues.length) return /* @__PURE__ */ jsx(TreasuryContractIssues, { issues, title: "Stepper contract failure", tokens });
|
|
582
|
+
const resolvedTokens = resolveTreasuryTokens(tokens);
|
|
583
|
+
const statuses = getTreasuryStepStatuses(steps, currentId, complete);
|
|
584
|
+
return /* @__PURE__ */ jsx(StepList, { $tokens: resolvedTokens, "aria-label": ariaLabel, className, children: steps.map((step, index) => /* @__PURE__ */ jsxs(
|
|
585
|
+
StepItem,
|
|
586
|
+
{
|
|
587
|
+
$status: statuses[index],
|
|
588
|
+
$tokens: resolvedTokens,
|
|
589
|
+
"aria-current": statuses[index] === "current" ? "step" : void 0,
|
|
590
|
+
"data-status": statuses[index],
|
|
591
|
+
children: [
|
|
592
|
+
/* @__PURE__ */ jsx(StepBar, { $status: statuses[index], $tokens: resolvedTokens }),
|
|
593
|
+
/* @__PURE__ */ jsxs("span", { children: [
|
|
594
|
+
step.label,
|
|
595
|
+
/* @__PURE__ */ jsxs(VisuallyHidden, { children: [
|
|
596
|
+
", ",
|
|
597
|
+
STEP_STATUS_TEXT[statuses[index]]
|
|
598
|
+
] })
|
|
599
|
+
] })
|
|
600
|
+
]
|
|
601
|
+
},
|
|
602
|
+
step.id
|
|
603
|
+
)) });
|
|
604
|
+
}
|
|
605
|
+
function getTreasurySectionTabsIssues(props) {
|
|
606
|
+
const issues = [];
|
|
607
|
+
const tabs = Array.isArray(props.tabs) ? props.tabs : [];
|
|
608
|
+
const ids = tabs.map((tab) => tab.id);
|
|
609
|
+
if (!tabs.length) issues.push("Section tabs have no tabs.");
|
|
610
|
+
if (!props.ariaLabel) issues.push("Section tabs have no ariaLabel.");
|
|
611
|
+
if (ids.some((id) => typeof id !== "string" || !id)) issues.push("Section tabs have a tab with an empty id.");
|
|
612
|
+
for (const id of duplicateValues(ids)) issues.push(`Section tabs repeat ${JSON.stringify(id)}.`);
|
|
613
|
+
if (!ids.includes(props.activeId)) issues.push(`Section tabs active id ${JSON.stringify(props.activeId)} is not one of the tabs.`);
|
|
614
|
+
for (const tab of tabs) {
|
|
615
|
+
if (!tab.href && typeof props.onSelect !== "function") issues.push(`Section tab ${JSON.stringify(tab.id)} has neither href nor onSelect.`);
|
|
616
|
+
if (tab.completeness !== void 0 && !["complete", "partial", "empty"].includes(tab.completeness)) {
|
|
617
|
+
issues.push(`Section tab ${JSON.stringify(tab.id)} completeness ${JSON.stringify(tab.completeness)} is not complete, partial or empty.`);
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
return issues;
|
|
621
|
+
}
|
|
622
|
+
var SectionTabsRow = styled.nav`
|
|
623
|
+
background: ${({ $tokens }) => $tokens.colors.surface};
|
|
624
|
+
border-bottom: 1px solid ${({ $tokens }) => $tokens.colors.borderMuted};
|
|
625
|
+
display: flex;
|
|
626
|
+
gap: ${({ $tokens }) => $tokens.spacing.xs};
|
|
627
|
+
overflow-x: auto;
|
|
628
|
+
padding: 0 ${({ $tokens }) => $tokens.spacing.lg};
|
|
629
|
+
scrollbar-width: thin;
|
|
630
|
+
`;
|
|
631
|
+
var sectionTabCss = css`
|
|
632
|
+
align-items: center;
|
|
633
|
+
background: transparent;
|
|
634
|
+
border: 0;
|
|
635
|
+
border-bottom: 2px solid ${({ $active, $tokens }) => $active ? $tokens.colors.accent : "transparent"};
|
|
636
|
+
color: ${({ $active, $tokens }) => $active ? $tokens.colors.text : $tokens.colors.textMuted};
|
|
637
|
+
cursor: pointer;
|
|
638
|
+
display: inline-flex;
|
|
639
|
+
flex: 0 0 auto;
|
|
640
|
+
font-family: ${({ $tokens }) => $tokens.typography.family.body};
|
|
641
|
+
font-size: ${({ $tokens }) => $tokens.typography.size.sm};
|
|
642
|
+
font-weight: ${({ $active, $tokens }) => $active ? $tokens.typography.weight.medium : $tokens.typography.weight.regular};
|
|
643
|
+
gap: 6px;
|
|
644
|
+
margin-bottom: -1px;
|
|
645
|
+
padding: ${({ $tokens }) => `${$tokens.spacing.md} ${$tokens.spacing.sm}`};
|
|
646
|
+
text-decoration: none;
|
|
647
|
+
white-space: nowrap;
|
|
648
|
+
|
|
649
|
+
&:hover {
|
|
650
|
+
color: ${({ $tokens }) => $tokens.colors.text};
|
|
651
|
+
}
|
|
652
|
+
|
|
653
|
+
&:focus-visible {
|
|
654
|
+
outline: 2px solid ${({ $tokens }) => $tokens.colors.accent};
|
|
655
|
+
outline-offset: -2px;
|
|
656
|
+
}
|
|
657
|
+
`;
|
|
658
|
+
var SectionTabButton = styled.button`
|
|
659
|
+
${sectionTabCss}
|
|
660
|
+
`;
|
|
661
|
+
var SectionTabLinkFrame = styled.span`
|
|
662
|
+
display: inline-flex;
|
|
663
|
+
flex: 0 0 auto;
|
|
664
|
+
|
|
665
|
+
a {
|
|
666
|
+
${sectionTabCss}
|
|
667
|
+
}
|
|
668
|
+
`;
|
|
669
|
+
var CompletenessDot = styled.span`
|
|
670
|
+
background: ${({ $state, $tokens }) => $state === "complete" ? $tokens.colors.accent : $state === "partial" ? $tokens.colors.warning : $tokens.colors.border};
|
|
671
|
+
border-radius: 50%;
|
|
672
|
+
display: inline-block;
|
|
673
|
+
flex: 0 0 auto;
|
|
674
|
+
height: 7px;
|
|
675
|
+
width: 7px;
|
|
676
|
+
`;
|
|
677
|
+
var COMPLETENESS_TEXT = {
|
|
678
|
+
complete: "complete",
|
|
679
|
+
partial: "partly complete",
|
|
680
|
+
empty: "not started"
|
|
681
|
+
};
|
|
682
|
+
function TreasurySectionTabs({
|
|
683
|
+
activeId,
|
|
684
|
+
ariaLabel,
|
|
685
|
+
className,
|
|
686
|
+
linkComponent,
|
|
687
|
+
onSelect,
|
|
688
|
+
tabs,
|
|
689
|
+
tokens
|
|
690
|
+
}) {
|
|
691
|
+
const issues = getTreasurySectionTabsIssues({ activeId, ariaLabel, onSelect, tabs });
|
|
692
|
+
if (issues.length) return /* @__PURE__ */ jsx(TreasuryContractIssues, { issues, title: "Section tabs contract failure", tokens });
|
|
693
|
+
const resolvedTokens = resolveTreasuryTokens(tokens);
|
|
694
|
+
const Link = linkComponent ?? ((props) => /* @__PURE__ */ jsx("a", { ...props }));
|
|
695
|
+
return /* @__PURE__ */ jsx(SectionTabsRow, { $tokens: resolvedTokens, "aria-label": ariaLabel, className, children: tabs.map((tab) => {
|
|
696
|
+
const active = tab.id === activeId;
|
|
697
|
+
const content = /* @__PURE__ */ jsxs(Fragment, { children: [
|
|
698
|
+
tab.completeness ? /* @__PURE__ */ jsx(CompletenessDot, { $state: tab.completeness, $tokens: resolvedTokens, "aria-hidden": "true" }) : null,
|
|
699
|
+
tab.label,
|
|
700
|
+
tab.completeness ? /* @__PURE__ */ jsxs(VisuallyHidden, { children: [
|
|
701
|
+
", ",
|
|
702
|
+
COMPLETENESS_TEXT[tab.completeness]
|
|
703
|
+
] }) : null
|
|
704
|
+
] });
|
|
705
|
+
return tab.href ? /* @__PURE__ */ jsx(SectionTabLinkFrame, { $active: active, $tokens: resolvedTokens, "data-completeness": tab.completeness, children: /* @__PURE__ */ jsx(Link, { "aria-current": active ? "true" : void 0, href: tab.href, children: content }) }, tab.id) : /* @__PURE__ */ jsx(
|
|
706
|
+
SectionTabButton,
|
|
707
|
+
{
|
|
708
|
+
$active: active,
|
|
709
|
+
$tokens: resolvedTokens,
|
|
710
|
+
"aria-current": active ? "true" : void 0,
|
|
711
|
+
"data-completeness": tab.completeness,
|
|
712
|
+
onClick: () => onSelect?.(tab.id),
|
|
713
|
+
type: "button",
|
|
714
|
+
children: content
|
|
715
|
+
},
|
|
716
|
+
tab.id
|
|
717
|
+
);
|
|
718
|
+
}) });
|
|
719
|
+
}
|
|
720
|
+
function getTreasuryProgressIssues(props) {
|
|
721
|
+
const issues = [];
|
|
722
|
+
const { max, value } = props;
|
|
723
|
+
if (!Number.isInteger(max) || max <= 0) issues.push(`Progress max ${JSON.stringify(max)} is not a whole number above 0.`);
|
|
724
|
+
else if (!Number.isInteger(value) || value < 0 || value > max) {
|
|
725
|
+
issues.push(`Progress value ${JSON.stringify(value)} is not a whole number from 0 to ${max}.`);
|
|
726
|
+
}
|
|
727
|
+
return issues;
|
|
728
|
+
}
|
|
729
|
+
function formatTreasuryProgress(value, max, unit) {
|
|
730
|
+
return `${value} of ${max}${unit ? ` ${unit}` : ""}`;
|
|
731
|
+
}
|
|
732
|
+
var ProgressRoot = styled.div`
|
|
733
|
+
display: grid;
|
|
734
|
+
font-family: ${({ $tokens }) => $tokens.typography.family.body};
|
|
735
|
+
gap: ${({ $tokens }) => $tokens.spacing.xs};
|
|
736
|
+
`;
|
|
737
|
+
var ProgressText = styled.div`
|
|
738
|
+
align-items: baseline;
|
|
739
|
+
display: flex;
|
|
740
|
+
gap: ${({ $tokens }) => $tokens.spacing.md};
|
|
741
|
+
justify-content: space-between;
|
|
742
|
+
`;
|
|
743
|
+
var ProgressLabel = styled.span`
|
|
744
|
+
color: ${({ $tokens }) => $tokens.colors.text};
|
|
745
|
+
font-size: ${({ $tokens }) => $tokens.typography.size.sm};
|
|
746
|
+
font-weight: ${({ $tokens }) => $tokens.typography.weight.medium};
|
|
747
|
+
`;
|
|
748
|
+
var ProgressCount = styled.span`
|
|
749
|
+
color: ${({ $complete, $tokens }) => $complete ? $tokens.colors.success : $tokens.colors.textMuted};
|
|
750
|
+
font-size: ${({ $tokens }) => $tokens.typography.size.sm};
|
|
751
|
+
font-variant-numeric: tabular-nums;
|
|
752
|
+
`;
|
|
753
|
+
var ProgressTrack = styled.div`
|
|
754
|
+
background: ${({ $tokens }) => $tokens.colors.borderMuted};
|
|
755
|
+
border-radius: ${({ $tokens }) => $tokens.radii.sm};
|
|
756
|
+
height: 6px;
|
|
757
|
+
overflow: hidden;
|
|
758
|
+
`;
|
|
759
|
+
var ProgressFill = styled.div`
|
|
760
|
+
background: ${({ $complete, $tokens }) => $complete ? $tokens.colors.success : $tokens.colors.accent};
|
|
761
|
+
height: 100%;
|
|
762
|
+
`;
|
|
763
|
+
function TreasuryProgress({ className, label, max, showBar = true, tokens, unit, value }) {
|
|
764
|
+
const issues = getTreasuryProgressIssues({ max, value });
|
|
765
|
+
if (issues.length) return /* @__PURE__ */ jsx(TreasuryContractIssues, { issues, title: "Progress contract failure", tokens });
|
|
766
|
+
const resolvedTokens = resolveTreasuryTokens(tokens);
|
|
767
|
+
const complete = value === max;
|
|
768
|
+
const text = formatTreasuryProgress(value, max, unit);
|
|
769
|
+
return /* @__PURE__ */ jsxs(
|
|
770
|
+
ProgressRoot,
|
|
771
|
+
{
|
|
772
|
+
$tokens: resolvedTokens,
|
|
773
|
+
"aria-valuemax": max,
|
|
774
|
+
"aria-valuemin": 0,
|
|
775
|
+
"aria-valuenow": value,
|
|
776
|
+
"aria-valuetext": text,
|
|
777
|
+
className,
|
|
778
|
+
"data-complete": complete ? "" : void 0,
|
|
779
|
+
role: "progressbar",
|
|
780
|
+
children: [
|
|
781
|
+
/* @__PURE__ */ jsxs(ProgressText, { $tokens: resolvedTokens, children: [
|
|
782
|
+
label ? /* @__PURE__ */ jsx(ProgressLabel, { $tokens: resolvedTokens, children: label }) : /* @__PURE__ */ jsx("span", {}),
|
|
783
|
+
/* @__PURE__ */ jsx(ProgressCount, { $complete: complete, $tokens: resolvedTokens, children: text })
|
|
784
|
+
] }),
|
|
785
|
+
showBar ? /* @__PURE__ */ jsx(ProgressTrack, { $tokens: resolvedTokens, "aria-hidden": "true", children: /* @__PURE__ */ jsx(ProgressFill, { $complete: complete, $tokens: resolvedTokens, style: { width: `${value / max * 100}%` } }) }) : null
|
|
786
|
+
]
|
|
787
|
+
}
|
|
788
|
+
);
|
|
789
|
+
}
|
|
790
|
+
export {
|
|
791
|
+
TreasuryBadge,
|
|
792
|
+
TreasuryButton,
|
|
793
|
+
TreasuryContractFailure,
|
|
794
|
+
TreasuryContractIssues,
|
|
795
|
+
TreasuryEmptyState,
|
|
796
|
+
TreasuryInline,
|
|
797
|
+
TreasuryKeyValueList,
|
|
798
|
+
TreasuryMetric,
|
|
799
|
+
TreasuryPersonChip,
|
|
800
|
+
TreasuryProgress,
|
|
801
|
+
TreasurySectionHeader,
|
|
802
|
+
TreasurySectionTabs,
|
|
803
|
+
TreasuryStack,
|
|
804
|
+
TreasuryStepper,
|
|
805
|
+
TreasurySurface,
|
|
806
|
+
TreasuryTable,
|
|
807
|
+
TreasuryTableBody,
|
|
808
|
+
TreasuryTableCell,
|
|
809
|
+
TreasuryTableContainer,
|
|
810
|
+
TreasuryTableHead,
|
|
811
|
+
TreasuryTableHeaderCell,
|
|
812
|
+
TreasuryTableRow,
|
|
813
|
+
formatTreasuryProgress,
|
|
814
|
+
getTreasuryInitials,
|
|
815
|
+
getTreasuryPersonChipIssues,
|
|
816
|
+
getTreasuryProgressIssues,
|
|
817
|
+
getTreasurySectionTabsIssues,
|
|
818
|
+
getTreasuryStepStatuses,
|
|
819
|
+
getTreasuryStepperIssues,
|
|
820
|
+
resolveTreasuryTokens
|
|
821
|
+
};
|
|
822
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../src/index.tsx"],
|
|
4
|
+
"sourcesContent": ["// @treasuryspatial/surface-primitives \u2014 Treasury's neutral surface primitives. Styled from\n// @treasuryspatial/treasury-design-tokens only; every component takes `tokens` overrides. Nothing here knows a\n// product or a route. The contract-failure block lives at this level so every kit package (and a consuming\n// surface) can fail visibly without a quiet fallback.\n\nimport type {\n ComponentType,\n HTMLAttributeAnchorTarget,\n HTMLAttributes,\n MouseEventHandler,\n ReactNode,\n TableHTMLAttributes,\n} from \"react\";\nimport styled, { css } from \"styled-components\";\nimport {\n createTreasuryDesignTokens,\n type DeepPartial,\n type TreasuryDesignTokens,\n} from \"@treasuryspatial/treasury-design-tokens\";\n\nexport type TreasuryTone = \"neutral\" | \"accent\" | \"success\" | \"warning\" | \"danger\";\nexport type TreasurySurfaceTone = \"default\" | \"raised\" | \"muted\" | \"danger\";\nexport type TreasurySurfacePadding = \"none\" | \"sm\" | \"md\" | \"lg\";\n\nexport type TreasuryTokenOverrides = DeepPartial<TreasuryDesignTokens>;\n\nexport interface TreasuryTokenProps {\n tokens?: TreasuryTokenOverrides;\n}\n\nexport const resolveTreasuryTokens = (tokens?: TreasuryTokenOverrides): TreasuryDesignTokens =>\n createTreasuryDesignTokens(tokens);\n\nconst toneColors = (tone: TreasuryTone, tokens: TreasuryDesignTokens) => {\n if (tone === \"accent\") {\n return {\n background: tokens.colors.accentSoft,\n border: tokens.colors.accent,\n text: tokens.colors.accentStrong,\n };\n }\n\n if (tone === \"success\") {\n return {\n background: tokens.colors.successSoft,\n border: tokens.colors.success,\n text: tokens.colors.success,\n };\n }\n\n if (tone === \"warning\") {\n return {\n background: tokens.colors.warningSoft,\n border: tokens.colors.warning,\n text: tokens.colors.warning,\n };\n }\n\n if (tone === \"danger\") {\n return {\n background: tokens.colors.dangerSoft,\n border: tokens.colors.danger,\n text: tokens.colors.danger,\n };\n }\n\n return {\n background: tokens.colors.surfaceRaised,\n border: tokens.colors.borderMuted,\n text: tokens.colors.textMuted,\n };\n};\n\nconst surfaceBackground = (tone: TreasurySurfaceTone, tokens: TreasuryDesignTokens) => {\n if (tone === \"raised\") return tokens.colors.surfaceRaised;\n if (tone === \"muted\") return tokens.colors.canvas;\n if (tone === \"danger\") return tokens.colors.dangerSoft;\n return tokens.colors.surface;\n};\n\nconst surfaceBorder = (tone: TreasurySurfaceTone, tokens: TreasuryDesignTokens) => {\n if (tone === \"danger\") return tokens.colors.danger;\n return tokens.colors.borderMuted;\n};\n\nconst paddingFor = (padding: TreasurySurfacePadding, tokens: TreasuryDesignTokens) => {\n if (padding === \"none\") return \"0\";\n if (padding === \"sm\") return tokens.spacing.md;\n if (padding === \"lg\") return tokens.spacing.xl;\n return tokens.spacing.lg;\n};\n\nconst BaseSurface = styled.section<{\n $padding: TreasurySurfacePadding;\n $tone: TreasurySurfaceTone;\n $tokens: TreasuryDesignTokens;\n}>`\n background: ${({ $tone, $tokens }) => surfaceBackground($tone, $tokens)};\n border: 1px solid ${({ $tone, $tokens }) => surfaceBorder($tone, $tokens)};\n border-radius: ${({ $tokens }) => $tokens.radii.md};\n color: ${({ $tokens }) => $tokens.colors.text};\n display: block;\n padding: ${({ $padding, $tokens }) => paddingFor($padding, $tokens)};\n`;\n\nexport interface TreasurySurfaceProps\n extends HTMLAttributes<HTMLElement>,\n TreasuryTokenProps {\n children?: ReactNode;\n padding?: TreasurySurfacePadding;\n tone?: TreasurySurfaceTone;\n}\n\nexport function TreasurySurface({\n children,\n padding = \"md\",\n tone = \"default\",\n tokens,\n ...props\n}: TreasurySurfaceProps) {\n return (\n <BaseSurface $padding={padding} $tone={tone} $tokens={resolveTreasuryTokens(tokens)} {...props}>\n {children}\n </BaseSurface>\n );\n}\n\nexport const TreasuryStack = styled.div<{ $gap?: keyof TreasuryDesignTokens[\"spacing\"] }>`\n display: grid;\n gap: ${({ $gap = \"lg\" }) => createTreasuryDesignTokens().spacing[$gap]};\n`;\n\nexport const TreasuryInline = styled.div<{ $gap?: keyof TreasuryDesignTokens[\"spacing\"] }>`\n align-items: center;\n display: flex;\n flex-wrap: wrap;\n gap: ${({ $gap = \"sm\" }) => createTreasuryDesignTokens().spacing[$gap]};\n`;\n\nexport interface TreasurySectionHeaderProps extends TreasuryTokenProps {\n action?: ReactNode;\n eyebrow?: ReactNode;\n subtitle?: ReactNode;\n title: ReactNode;\n}\n\nconst SectionHeaderRoot = styled.div<{ $tokens: TreasuryDesignTokens }>`\n align-items: flex-start;\n display: flex;\n gap: ${({ $tokens }) => $tokens.spacing.lg};\n justify-content: space-between;\n min-width: 0;\n`;\n\nconst SectionHeaderCopy = styled.div<{ $tokens: TreasuryDesignTokens }>`\n display: grid;\n gap: ${({ $tokens }) => $tokens.spacing.xs};\n min-width: 0;\n`;\n\nconst Eyebrow = styled.div<{ $tokens: TreasuryDesignTokens }>`\n color: ${({ $tokens }) => $tokens.colors.textSubtle};\n font-family: ${({ $tokens }) => $tokens.typography.family.body};\n font-size: ${({ $tokens }) => $tokens.typography.size.xs};\n font-weight: ${({ $tokens }) => $tokens.typography.weight.semibold};\n letter-spacing: ${({ $tokens }) => $tokens.typography.letterSpacing.caps};\n text-transform: uppercase;\n`;\n\nconst SectionTitle = styled.h2<{ $tokens: TreasuryDesignTokens }>`\n color: ${({ $tokens }) => $tokens.colors.text};\n font-family: ${({ $tokens }) => $tokens.typography.family.heading};\n font-size: ${({ $tokens }) => $tokens.typography.size.xl};\n font-weight: ${({ $tokens }) => $tokens.typography.weight.medium};\n letter-spacing: ${({ $tokens }) => $tokens.typography.letterSpacing.tight};\n line-height: 1.18;\n margin: 0;\n`;\n\nconst SectionSubtitle = styled.p<{ $tokens: TreasuryDesignTokens }>`\n color: ${({ $tokens }) => $tokens.colors.textMuted};\n font-family: ${({ $tokens }) => $tokens.typography.family.body};\n font-size: ${({ $tokens }) => $tokens.typography.size.sm};\n line-height: 1.5;\n margin: 0;\n`;\n\nexport function TreasurySectionHeader({\n action,\n eyebrow,\n subtitle,\n title,\n tokens,\n}: TreasurySectionHeaderProps) {\n const resolvedTokens = resolveTreasuryTokens(tokens);\n\n return (\n <SectionHeaderRoot $tokens={resolvedTokens}>\n <SectionHeaderCopy $tokens={resolvedTokens}>\n {eyebrow ? <Eyebrow $tokens={resolvedTokens}>{eyebrow}</Eyebrow> : null}\n <SectionTitle $tokens={resolvedTokens}>{title}</SectionTitle>\n {subtitle ? <SectionSubtitle $tokens={resolvedTokens}>{subtitle}</SectionSubtitle> : null}\n </SectionHeaderCopy>\n {action ? <div>{action}</div> : null}\n </SectionHeaderRoot>\n );\n}\n\nexport interface TreasuryBadgeProps extends HTMLAttributes<HTMLSpanElement>, TreasuryTokenProps {\n tone?: TreasuryTone;\n}\n\nconst Badge = styled.span<{ $tone: TreasuryTone; $tokens: TreasuryDesignTokens }>`\n ${({ $tone, $tokens }) => {\n const colors = toneColors($tone, $tokens);\n return css`\n background: ${colors.background};\n border-color: ${colors.border};\n color: ${colors.text};\n `;\n }}\n align-items: center;\n border: 1px solid;\n border-radius: ${({ $tokens }) => $tokens.radii.sm};\n display: inline-flex;\n font-family: ${({ $tokens }) => $tokens.typography.family.body};\n font-size: ${({ $tokens }) => $tokens.typography.size.xs};\n font-weight: ${({ $tokens }) => $tokens.typography.weight.medium};\n line-height: 1;\n min-height: 24px;\n padding: 0 ${({ $tokens }) => $tokens.spacing.sm};\n white-space: nowrap;\n`;\n\nexport function TreasuryBadge({ tone = \"neutral\", tokens, ...props }: TreasuryBadgeProps) {\n return <Badge $tone={tone} $tokens={resolveTreasuryTokens(tokens)} {...props} />;\n}\n\nexport type TreasuryButtonVariant = \"primary\" | \"secondary\" | \"quiet\" | \"danger\";\n\nconst buttonVariant = (variant: TreasuryButtonVariant, tokens: TreasuryDesignTokens) => {\n if (variant === \"primary\") {\n return css`\n background: ${tokens.colors.accent};\n border-color: ${tokens.colors.accent};\n color: ${tokens.colors.inverseText};\n `;\n }\n\n if (variant === \"danger\") {\n return css`\n background: ${tokens.colors.danger};\n border-color: ${tokens.colors.danger};\n color: ${tokens.colors.inverseText};\n `;\n }\n\n if (variant === \"quiet\") {\n return css`\n background: transparent;\n border-color: transparent;\n color: ${tokens.colors.textMuted};\n `;\n }\n\n return css`\n background: ${tokens.colors.surface};\n border-color: ${tokens.colors.border};\n color: ${tokens.colors.text};\n `;\n};\n\nconst buttonCss = css<{\n $tokens: TreasuryDesignTokens;\n $variant: TreasuryButtonVariant;\n}>`\n ${({ $tokens, $variant }) => buttonVariant($variant, $tokens)}\n align-items: center;\n border: 1px solid;\n border-radius: ${({ $tokens }) => $tokens.radii.md};\n cursor: pointer;\n display: inline-flex;\n font-family: ${({ $tokens }) => $tokens.typography.family.body};\n font-size: ${({ $tokens }) => $tokens.typography.size.sm};\n font-weight: ${({ $tokens }) => $tokens.typography.weight.medium};\n gap: ${({ $tokens }) => $tokens.spacing.sm};\n justify-content: center;\n line-height: 1;\n min-height: 36px;\n padding: 0 ${({ $tokens }) => $tokens.spacing.lg};\n text-decoration: none;\n transition:\n background ${({ $tokens }) => $tokens.motion.quick} ${({ $tokens }) => $tokens.motion.easing},\n border-color ${({ $tokens }) => $tokens.motion.quick} ${({ $tokens }) => $tokens.motion.easing},\n color ${({ $tokens }) => $tokens.motion.quick} ${({ $tokens }) => $tokens.motion.easing};\n white-space: nowrap;\n\n &:disabled,\n &[aria-disabled=\"true\"] {\n cursor: not-allowed;\n opacity: 0.48;\n }\n`;\n\nconst Button = styled.button<{\n $tokens: TreasuryDesignTokens;\n $variant: TreasuryButtonVariant;\n}>`\n ${buttonCss}\n`;\n\nconst ButtonLink = styled.a<{\n $tokens: TreasuryDesignTokens;\n $variant: TreasuryButtonVariant;\n}>`\n ${buttonCss}\n`;\n\nexport interface TreasuryButtonProps extends TreasuryTokenProps {\n ariaLabel?: string;\n children?: ReactNode;\n className?: string;\n disabled?: boolean;\n href?: string;\n icon?: ReactNode;\n onClick?: MouseEventHandler<HTMLElement>;\n rel?: string;\n target?: HTMLAttributeAnchorTarget;\n type?: \"button\" | \"submit\" | \"reset\";\n variant?: TreasuryButtonVariant;\n}\n\nexport function TreasuryButton({\n ariaLabel,\n children,\n className,\n disabled,\n href,\n icon,\n onClick,\n rel,\n target,\n tokens,\n type = \"button\",\n variant = \"secondary\",\n}: TreasuryButtonProps) {\n const resolvedTokens = resolveTreasuryTokens(tokens);\n\n if (href) {\n return (\n <ButtonLink\n $tokens={resolvedTokens}\n $variant={variant}\n aria-disabled={disabled}\n aria-label={ariaLabel}\n className={className}\n href={disabled ? undefined : href}\n onClick={onClick as MouseEventHandler<HTMLAnchorElement>}\n rel={rel}\n target={target}\n >\n {icon}\n {children}\n </ButtonLink>\n );\n }\n\n return (\n <Button\n $tokens={resolvedTokens}\n $variant={variant}\n aria-label={ariaLabel}\n className={className}\n disabled={disabled}\n onClick={onClick as MouseEventHandler<HTMLButtonElement>}\n type={type}\n >\n {icon}\n {children}\n </Button>\n );\n}\n\nexport interface TreasuryMetricProps extends HTMLAttributes<HTMLDivElement>, TreasuryTokenProps {\n label: ReactNode;\n value: ReactNode;\n detail?: ReactNode;\n}\n\nconst MetricRoot = styled.div<{ $tokens: TreasuryDesignTokens }>`\n border: 1px solid ${({ $tokens }) => $tokens.colors.borderMuted};\n border-radius: ${({ $tokens }) => $tokens.radii.md};\n display: grid;\n gap: ${({ $tokens }) => $tokens.spacing.xs};\n padding: ${({ $tokens }) => $tokens.spacing.lg};\n`;\n\nconst MetricValue = styled.div<{ $tokens: TreasuryDesignTokens }>`\n color: ${({ $tokens }) => $tokens.colors.text};\n font-family: ${({ $tokens }) => $tokens.typography.family.heading};\n font-size: ${({ $tokens }) => $tokens.typography.size.xl};\n font-weight: ${({ $tokens }) => $tokens.typography.weight.medium};\n line-height: 1.1;\n`;\n\nexport function TreasuryMetric({ detail, label, tokens, value, ...props }: TreasuryMetricProps) {\n const resolvedTokens = resolveTreasuryTokens(tokens);\n\n return (\n <MetricRoot $tokens={resolvedTokens} {...props}>\n <Eyebrow $tokens={resolvedTokens}>{label}</Eyebrow>\n <MetricValue $tokens={resolvedTokens}>{value}</MetricValue>\n {detail ? <SectionSubtitle $tokens={resolvedTokens}>{detail}</SectionSubtitle> : null}\n </MetricRoot>\n );\n}\n\nexport type TreasuryKeyValueItem = {\n key: string;\n label: ReactNode;\n value: ReactNode;\n};\n\nexport interface TreasuryKeyValueListProps extends TreasuryTokenProps {\n items: TreasuryKeyValueItem[];\n}\n\nconst KeyValueList = styled.dl<{ $tokens: TreasuryDesignTokens }>`\n display: grid;\n gap: ${({ $tokens }) => $tokens.spacing.sm};\n margin: 0;\n`;\n\nconst KeyValueRow = styled.div<{ $tokens: TreasuryDesignTokens }>`\n display: grid;\n gap: ${({ $tokens }) => $tokens.spacing.sm};\n grid-template-columns: minmax(120px, 0.36fr) minmax(0, 1fr);\n\n @media (max-width: 620px) {\n grid-template-columns: 1fr;\n }\n`;\n\nconst KeyTerm = styled.dt<{ $tokens: TreasuryDesignTokens }>`\n color: ${({ $tokens }) => $tokens.colors.textSubtle};\n font-family: ${({ $tokens }) => $tokens.typography.family.body};\n font-size: ${({ $tokens }) => $tokens.typography.size.sm};\n`;\n\nconst KeyValue = styled.dd<{ $tokens: TreasuryDesignTokens }>`\n color: ${({ $tokens }) => $tokens.colors.text};\n font-family: ${({ $tokens }) => $tokens.typography.family.body};\n font-size: ${({ $tokens }) => $tokens.typography.size.sm};\n margin: 0;\n min-width: 0;\n`;\n\nexport function TreasuryKeyValueList({ items, tokens }: TreasuryKeyValueListProps) {\n const resolvedTokens = resolveTreasuryTokens(tokens);\n\n return (\n <KeyValueList $tokens={resolvedTokens}>\n {items.map((item) => (\n <KeyValueRow $tokens={resolvedTokens} key={item.key}>\n <KeyTerm $tokens={resolvedTokens}>{item.label}</KeyTerm>\n <KeyValue $tokens={resolvedTokens}>{item.value}</KeyValue>\n </KeyValueRow>\n ))}\n </KeyValueList>\n );\n}\n\nexport const TreasuryTableContainer = styled.div`\n overflow-x: auto;\n width: 100%;\n`;\n\nexport const TreasuryTable = styled.table<TableHTMLAttributes<HTMLTableElement>>`\n border-collapse: collapse;\n min-width: 100%;\n`;\n\nexport const TreasuryTableHead = styled.thead``;\nexport const TreasuryTableBody = styled.tbody``;\nexport const TreasuryTableRow = styled.tr``;\n\nexport const TreasuryTableHeaderCell = styled.th`\n border-bottom: 1px solid ${createTreasuryDesignTokens().colors.border};\n color: ${createTreasuryDesignTokens().colors.textSubtle};\n font-family: ${createTreasuryDesignTokens().typography.family.body};\n font-size: ${createTreasuryDesignTokens().typography.size.xs};\n font-weight: ${createTreasuryDesignTokens().typography.weight.semibold};\n letter-spacing: ${createTreasuryDesignTokens().typography.letterSpacing.caps};\n padding: ${createTreasuryDesignTokens().spacing.md};\n text-align: left;\n text-transform: uppercase;\n`;\n\nexport const TreasuryTableCell = styled.td`\n border-bottom: 1px solid ${createTreasuryDesignTokens().colors.borderMuted};\n color: ${createTreasuryDesignTokens().colors.text};\n font-family: ${createTreasuryDesignTokens().typography.family.body};\n font-size: ${createTreasuryDesignTokens().typography.size.sm};\n padding: ${createTreasuryDesignTokens().spacing.md};\n vertical-align: top;\n`;\n\nexport interface TreasuryEmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\">, TreasuryTokenProps {\n action?: ReactNode;\n message?: ReactNode;\n title: ReactNode;\n}\n\nconst EmptyRoot = styled.div<{ $tokens: TreasuryDesignTokens }>`\n align-items: center;\n border: 1px dashed ${({ $tokens }) => $tokens.colors.border};\n border-radius: ${({ $tokens }) => $tokens.radii.md};\n display: grid;\n gap: ${({ $tokens }) => $tokens.spacing.md};\n justify-items: start;\n padding: ${({ $tokens }) => $tokens.spacing.xl};\n`;\n\nexport function TreasuryEmptyState({ action, message, title, tokens, ...props }: TreasuryEmptyStateProps) {\n const resolvedTokens = resolveTreasuryTokens(tokens);\n\n return (\n <EmptyRoot $tokens={resolvedTokens} {...props}>\n <SectionTitle $tokens={resolvedTokens}>{title}</SectionTitle>\n {message ? <SectionSubtitle $tokens={resolvedTokens}>{message}</SectionSubtitle> : null}\n {action}\n </EmptyRoot>\n );\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// Contract failure: the one way a kit package or a surface reports a missing contract (no manifest, no record,\n// no definition). It is loud by design; consumers fix the integration rather than style this away.\n\nexport interface TreasuryContractFailureProps extends TreasuryTokenProps {\n action?: ReactNode;\n details?: ReactNode;\n title?: ReactNode;\n}\n\nconst FailureRoot = styled(TreasurySurface)`\n border-width: 2px;\n`;\n\nconst FailureTitle = styled.h2<{ $tokens: TreasuryDesignTokens }>`\n color: ${({ $tokens }) => $tokens.colors.danger};\n font-family: ${({ $tokens }) => $tokens.typography.family.heading};\n font-size: ${({ $tokens }) => $tokens.typography.size.lg};\n font-weight: ${({ $tokens }) => $tokens.typography.weight.semibold};\n margin: 0;\n`;\n\nconst FailureDetails = styled.div<{ $tokens: TreasuryDesignTokens }>`\n color: ${({ $tokens }) => $tokens.colors.danger};\n font-family: ${({ $tokens }) => $tokens.typography.family.body};\n font-size: ${({ $tokens }) => $tokens.typography.size.sm};\n line-height: 1.5;\n\n ul {\n margin: 0;\n padding-left: 1.2em;\n }\n`;\n\nexport function TreasuryContractFailure({\n action,\n details,\n title = \"Treasury UI contract failure\",\n tokens,\n}: TreasuryContractFailureProps) {\n const resolvedTokens = resolveTreasuryTokens(tokens);\n\n return (\n <FailureRoot data-treasury-contract-failure=\"\" role=\"alert\" tokens={tokens} tone=\"danger\">\n <FailureTitle $tokens={resolvedTokens}>{title}</FailureTitle>\n {details ? <FailureDetails $tokens={resolvedTokens}>{details}</FailureDetails> : null}\n {action}\n </FailureRoot>\n );\n}\n\n/** Renders `issues` as a contract failure, or null when there are none: `const failure = treasuryContractIssues(...)`. */\nexport function TreasuryContractIssues({\n issues,\n title,\n tokens,\n}: { issues: string[]; title: ReactNode } & TreasuryTokenProps) {\n if (!issues.length) return null;\n\n return (\n <TreasuryContractFailure\n details={\n <ul>\n {issues.map((issue) => (\n <li key={issue}>{issue}</li>\n ))}\n </ul>\n }\n title={title}\n tokens={tokens}\n />\n );\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// Visually hidden text for state that is otherwise shown only by colour (step status, completeness dots).\n\nconst VisuallyHidden = styled.span`\n border: 0;\n clip: rect(0 0 0 0);\n height: 1px;\n margin: -1px;\n overflow: hidden;\n padding: 0;\n position: absolute;\n white-space: nowrap;\n width: 1px;\n`;\n\nconst duplicateValues = (values: string[]) => [...new Set(values.filter((value, index) => values.indexOf(value) !== index))];\n\n// ---------------------------------------------------------------------------------------------------------------\n// TreasuryPersonChip: a headshot (or initials), a name and a one-line role. Avatars are the one circle in the kit.\n\nexport interface TreasuryPersonChipProps extends TreasuryTokenProps {\n name: string;\n /** One line: specialty, title, \"lead\". */\n role?: ReactNode;\n /** Headshot URL. Without one the chip shows the name's initials. */\n imageUrl?: string | null;\n href?: string;\n className?: string;\n}\n\n/** First letter of the first and last words, upper-cased: \"John Manoochehri\" \u2192 \"JM\", \"Maria\" \u2192 \"M\". */\nexport function getTreasuryInitials(name: string): string {\n const words = name.trim().split(/\\s+/).filter(Boolean);\n if (!words.length) return \"\";\n const first = words[0][0] ?? \"\";\n const last = words.length > 1 ? words[words.length - 1][0] ?? \"\" : \"\";\n return `${first}${last}`.toUpperCase();\n}\n\nconst PersonRoot = styled.div<{ $tokens: TreasuryDesignTokens }>`\n align-items: center;\n background: ${({ $tokens }) => $tokens.colors.surfaceRaised};\n border: 1px solid ${({ $tokens }) => $tokens.colors.borderMuted};\n border-radius: ${({ $tokens }) => $tokens.radii.sm};\n color: inherit;\n display: inline-flex;\n gap: ${({ $tokens }) => $tokens.spacing.sm};\n max-width: 100%;\n min-width: 0;\n padding: ${({ $tokens }) => `${$tokens.spacing.xs} ${$tokens.spacing.md} ${$tokens.spacing.xs} ${$tokens.spacing.xs}`};\n text-decoration: none;\n\n a&:hover {\n border-color: ${({ $tokens }) => $tokens.colors.accent};\n }\n`;\n\nconst Avatar = styled.span<{ $tokens: TreasuryDesignTokens }>`\n align-items: center;\n background: ${({ $tokens }) => $tokens.colors.accentSoft};\n border-radius: 50%;\n color: ${({ $tokens }) => $tokens.colors.accentStrong};\n display: inline-flex;\n flex: 0 0 auto;\n font-family: ${({ $tokens }) => $tokens.typography.family.body};\n font-size: ${({ $tokens }) => $tokens.typography.size.xs};\n font-weight: ${({ $tokens }) => $tokens.typography.weight.medium};\n height: 28px;\n justify-content: center;\n overflow: hidden;\n width: 28px;\n\n img {\n height: 100%;\n object-fit: cover;\n width: 100%;\n }\n`;\n\nconst PersonText = styled.span<{ $tokens: TreasuryDesignTokens }>`\n display: grid;\n font-family: ${({ $tokens }) => $tokens.typography.family.body};\n line-height: 1.3;\n min-width: 0;\n`;\n\nconst PersonName = styled.span<{ $tokens: TreasuryDesignTokens }>`\n color: ${({ $tokens }) => $tokens.colors.text};\n font-size: ${({ $tokens }) => $tokens.typography.size.sm};\n font-weight: ${({ $tokens }) => $tokens.typography.weight.medium};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nconst PersonRole = styled.span<{ $tokens: TreasuryDesignTokens }>`\n color: ${({ $tokens }) => $tokens.colors.textSubtle};\n font-size: ${({ $tokens }) => $tokens.typography.size.xs};\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n`;\n\nexport function getTreasuryPersonChipIssues(props: { name?: unknown }): string[] {\n return typeof props.name === \"string\" && props.name.trim() ? [] : [\"Person chip has no name.\"];\n}\n\nexport function TreasuryPersonChip({ className, href, imageUrl, name, role, tokens }: TreasuryPersonChipProps) {\n const issues = getTreasuryPersonChipIssues({ name });\n if (issues.length) return <TreasuryContractIssues issues={issues} title=\"Person chip contract failure\" tokens={tokens} />;\n\n const resolvedTokens = resolveTreasuryTokens(tokens);\n\n return (\n <PersonRoot\n $tokens={resolvedTokens}\n as={href ? \"a\" : \"div\"}\n className={className}\n data-treasury-person=\"\"\n {...(href ? { href } : {})}\n >\n <Avatar $tokens={resolvedTokens} aria-hidden=\"true\">\n {imageUrl ? <img alt=\"\" src={imageUrl} /> : getTreasuryInitials(name)}\n </Avatar>\n <PersonText $tokens={resolvedTokens}>\n <PersonName $tokens={resolvedTokens}>{name}</PersonName>\n {role ? <PersonRole $tokens={resolvedTokens}>{role}</PersonRole> : null}\n </PersonText>\n </PersonRoot>\n );\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// TreasuryStepper: ordered stages, each done, current or upcoming, derived from one `currentId`.\n\nexport type TreasuryStepStatus = \"done\" | \"current\" | \"upcoming\";\n\nexport interface TreasuryStep {\n id: string;\n label: ReactNode;\n}\n\nexport interface TreasuryStepperProps extends TreasuryTokenProps {\n steps: TreasuryStep[];\n /** The stage in progress. null = not started (all upcoming). */\n currentId: string | null;\n /** Every stage done (the engagement closed). */\n complete?: boolean;\n /** Accessible name of the list; default \"Stages\". */\n ariaLabel?: string;\n className?: string;\n}\n\n/** Steps before `currentId` are done, `currentId` is current, the rest upcoming; `complete` makes all done. */\nexport function getTreasuryStepStatuses(\n steps: TreasuryStep[],\n currentId: string | null,\n complete = false,\n): TreasuryStepStatus[] {\n if (complete) return steps.map(() => \"done\");\n const currentIndex = currentId === null ? -1 : steps.findIndex((step) => step.id === currentId);\n return steps.map((_, index) => {\n if (currentIndex < 0) return \"upcoming\";\n if (index < currentIndex) return \"done\";\n return index === currentIndex ? \"current\" : \"upcoming\";\n });\n}\n\nexport function getTreasuryStepperIssues(props: { steps?: TreasuryStep[]; currentId?: unknown; complete?: boolean }): string[] {\n const issues: string[] = [];\n const steps = Array.isArray(props.steps) ? props.steps : [];\n const ids = steps.map((step) => step.id);\n if (!steps.length) issues.push(\"Stepper has no steps.\");\n if (ids.some((id) => typeof id !== \"string\" || !id)) issues.push(\"Stepper has a step with an empty id.\");\n for (const id of duplicateValues(ids)) issues.push(`Stepper repeats step ${JSON.stringify(id)}.`);\n if (props.currentId !== null && props.currentId !== undefined && !ids.includes(props.currentId as string)) {\n issues.push(`Stepper current step ${JSON.stringify(props.currentId)} is not one of its steps.`);\n }\n return issues;\n}\n\nconst StepList = styled.ol<{ $tokens: TreasuryDesignTokens }>`\n display: grid;\n gap: ${({ $tokens }) => $tokens.spacing.xs};\n grid-template-columns: repeat(auto-fit, minmax(72px, 1fr));\n list-style: none;\n margin: 0;\n padding: 0;\n`;\n\nconst StepItem = styled.li<{ $status: TreasuryStepStatus; $tokens: TreasuryDesignTokens }>`\n color: ${({ $status, $tokens }) => ($status === \"current\" ? $tokens.colors.accentStrong : $tokens.colors.textSubtle)};\n display: grid;\n font-family: ${({ $tokens }) => $tokens.typography.family.body};\n font-size: ${({ $tokens }) => $tokens.typography.size.xs};\n font-weight: ${({ $status, $tokens }) => ($status === \"current\" ? $tokens.typography.weight.medium : $tokens.typography.weight.regular)};\n gap: 6px;\n line-height: 1.3;\n text-align: center;\n`;\n\nconst StepBar = styled.span<{ $status: TreasuryStepStatus; $tokens: TreasuryDesignTokens }>`\n background: ${({ $status, $tokens }) =>\n $status === \"done\" ? $tokens.colors.accent : $status === \"current\" ? $tokens.colors.accentStrong : $tokens.colors.borderMuted};\n border-radius: ${({ $tokens }) => $tokens.radii.sm};\n display: block;\n height: 6px;\n`;\n\nconst STEP_STATUS_TEXT: Record<TreasuryStepStatus, string> = { done: \"done\", current: \"current\", upcoming: \"upcoming\" };\n\nexport function TreasuryStepper({ ariaLabel = \"Stages\", className, complete, currentId, steps, tokens }: TreasuryStepperProps) {\n const issues = getTreasuryStepperIssues({ complete, currentId, steps });\n if (issues.length) return <TreasuryContractIssues issues={issues} title=\"Stepper contract failure\" tokens={tokens} />;\n\n const resolvedTokens = resolveTreasuryTokens(tokens);\n const statuses = getTreasuryStepStatuses(steps, currentId, complete);\n\n return (\n <StepList $tokens={resolvedTokens} aria-label={ariaLabel} className={className}>\n {steps.map((step, index) => (\n <StepItem\n $status={statuses[index]}\n $tokens={resolvedTokens}\n aria-current={statuses[index] === \"current\" ? \"step\" : undefined}\n data-status={statuses[index]}\n key={step.id}\n >\n <StepBar $status={statuses[index]} $tokens={resolvedTokens} />\n <span>\n {step.label}\n <VisuallyHidden>, {STEP_STATUS_TEXT[statuses[index]]}</VisuallyHidden>\n </span>\n </StepItem>\n ))}\n </StepList>\n );\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// TreasurySectionTabs: underline tabs between the SECTIONS of one page or form, each with an optional\n// completeness dot. Not top-bar's PageTabs (which move between pages of a site) and not its ModeBar (one mode of a\n// workspace): those stay in @treasuryspatial/top-bar. This row sits in the page, under the bar.\n\nexport type TreasurySectionCompleteness = \"complete\" | \"partial\" | \"empty\";\n\nexport interface TreasurySectionTab {\n id: string;\n label: ReactNode;\n /** Anchor or route of the section. Without it the tab is a button that calls onSelect. */\n href?: string;\n /** Omit for no dot. */\n completeness?: TreasurySectionCompleteness;\n}\n\ntype TreasuryLinkLike = ComponentType<{\n href: string;\n className?: string;\n children?: ReactNode;\n \"aria-current\"?: \"true\" | \"page\" | \"location\";\n}>;\n\nexport interface TreasurySectionTabsProps extends TreasuryTokenProps {\n tabs: TreasurySectionTab[];\n activeId: string;\n /** Called with the tab id; required for tabs without href. */\n onSelect?: (id: string) => void;\n /** Accessible name of the row (\"Onboarding sections\"). */\n ariaLabel: string;\n /** Next.js Link or similar for href tabs; defaults to <a>. */\n linkComponent?: TreasuryLinkLike;\n className?: string;\n}\n\nexport function getTreasurySectionTabsIssues(props: {\n tabs?: TreasurySectionTab[];\n activeId?: unknown;\n onSelect?: unknown;\n ariaLabel?: unknown;\n}): string[] {\n const issues: string[] = [];\n const tabs = Array.isArray(props.tabs) ? props.tabs : [];\n const ids = tabs.map((tab) => tab.id);\n if (!tabs.length) issues.push(\"Section tabs have no tabs.\");\n if (!props.ariaLabel) issues.push(\"Section tabs have no ariaLabel.\");\n if (ids.some((id) => typeof id !== \"string\" || !id)) issues.push(\"Section tabs have a tab with an empty id.\");\n for (const id of duplicateValues(ids)) issues.push(`Section tabs repeat ${JSON.stringify(id)}.`);\n if (!ids.includes(props.activeId as string)) issues.push(`Section tabs active id ${JSON.stringify(props.activeId)} is not one of the tabs.`);\n for (const tab of tabs) {\n if (!tab.href && typeof props.onSelect !== \"function\") issues.push(`Section tab ${JSON.stringify(tab.id)} has neither href nor onSelect.`);\n if (tab.completeness !== undefined && ![\"complete\", \"partial\", \"empty\"].includes(tab.completeness)) {\n issues.push(`Section tab ${JSON.stringify(tab.id)} completeness ${JSON.stringify(tab.completeness)} is not complete, partial or empty.`);\n }\n }\n return issues;\n}\n\nconst SectionTabsRow = styled.nav<{ $tokens: TreasuryDesignTokens }>`\n background: ${({ $tokens }) => $tokens.colors.surface};\n border-bottom: 1px solid ${({ $tokens }) => $tokens.colors.borderMuted};\n display: flex;\n gap: ${({ $tokens }) => $tokens.spacing.xs};\n overflow-x: auto;\n padding: 0 ${({ $tokens }) => $tokens.spacing.lg};\n scrollbar-width: thin;\n`;\n\nconst sectionTabCss = css<{ $active: boolean; $tokens: TreasuryDesignTokens }>`\n align-items: center;\n background: transparent;\n border: 0;\n border-bottom: 2px solid ${({ $active, $tokens }) => ($active ? $tokens.colors.accent : \"transparent\")};\n color: ${({ $active, $tokens }) => ($active ? $tokens.colors.text : $tokens.colors.textMuted)};\n cursor: pointer;\n display: inline-flex;\n flex: 0 0 auto;\n font-family: ${({ $tokens }) => $tokens.typography.family.body};\n font-size: ${({ $tokens }) => $tokens.typography.size.sm};\n font-weight: ${({ $active, $tokens }) => ($active ? $tokens.typography.weight.medium : $tokens.typography.weight.regular)};\n gap: 6px;\n margin-bottom: -1px;\n padding: ${({ $tokens }) => `${$tokens.spacing.md} ${$tokens.spacing.sm}`};\n text-decoration: none;\n white-space: nowrap;\n\n &:hover {\n color: ${({ $tokens }) => $tokens.colors.text};\n }\n\n &:focus-visible {\n outline: 2px solid ${({ $tokens }) => $tokens.colors.accent};\n outline-offset: -2px;\n }\n`;\n\nconst SectionTabButton = styled.button<{ $active: boolean; $tokens: TreasuryDesignTokens }>`\n ${sectionTabCss}\n`;\n\nconst SectionTabLinkFrame = styled.span<{ $active: boolean; $tokens: TreasuryDesignTokens }>`\n display: inline-flex;\n flex: 0 0 auto;\n\n a {\n ${sectionTabCss}\n }\n`;\n\nconst CompletenessDot = styled.span<{ $state: TreasurySectionCompleteness; $tokens: TreasuryDesignTokens }>`\n background: ${({ $state, $tokens }) =>\n $state === \"complete\" ? $tokens.colors.accent : $state === \"partial\" ? $tokens.colors.warning : $tokens.colors.border};\n border-radius: 50%;\n display: inline-block;\n flex: 0 0 auto;\n height: 7px;\n width: 7px;\n`;\n\nconst COMPLETENESS_TEXT: Record<TreasurySectionCompleteness, string> = {\n complete: \"complete\",\n partial: \"partly complete\",\n empty: \"not started\",\n};\n\nexport function TreasurySectionTabs({\n activeId,\n ariaLabel,\n className,\n linkComponent,\n onSelect,\n tabs,\n tokens,\n}: TreasurySectionTabsProps) {\n const issues = getTreasurySectionTabsIssues({ activeId, ariaLabel, onSelect, tabs });\n if (issues.length) return <TreasuryContractIssues issues={issues} title=\"Section tabs contract failure\" tokens={tokens} />;\n\n const resolvedTokens = resolveTreasuryTokens(tokens);\n const Link: TreasuryLinkLike = linkComponent ?? ((props) => <a {...props} />);\n\n return (\n <SectionTabsRow $tokens={resolvedTokens} aria-label={ariaLabel} className={className}>\n {tabs.map((tab) => {\n const active = tab.id === activeId;\n const content = (\n <>\n {tab.completeness ? <CompletenessDot $state={tab.completeness} $tokens={resolvedTokens} aria-hidden=\"true\" /> : null}\n {tab.label}\n {tab.completeness ? <VisuallyHidden>, {COMPLETENESS_TEXT[tab.completeness]}</VisuallyHidden> : null}\n </>\n );\n\n return tab.href ? (\n <SectionTabLinkFrame $active={active} $tokens={resolvedTokens} data-completeness={tab.completeness} key={tab.id}>\n <Link aria-current={active ? \"true\" : undefined} href={tab.href}>\n {content}\n </Link>\n </SectionTabLinkFrame>\n ) : (\n <SectionTabButton\n $active={active}\n $tokens={resolvedTokens}\n aria-current={active ? \"true\" : undefined}\n data-completeness={tab.completeness}\n key={tab.id}\n onClick={() => onSelect?.(tab.id)}\n type=\"button\"\n >\n {content}\n </SectionTabButton>\n );\n })}\n </SectionTabsRow>\n );\n}\n\n// ---------------------------------------------------------------------------------------------------------------\n// TreasuryProgress: n of m, as text and a bar.\n\nexport interface TreasuryProgressProps extends TreasuryTokenProps {\n value: number;\n max: number;\n /** What is counted, after \"n of m\": \"sections complete\". */\n unit?: string;\n /** A heading on the left of the count (\"Setup\"). */\n label?: ReactNode;\n /** Default true. */\n showBar?: boolean;\n className?: string;\n}\n\nexport function getTreasuryProgressIssues(props: { value?: unknown; max?: unknown }): string[] {\n const issues: string[] = [];\n const { max, value } = props;\n if (!Number.isInteger(max) || (max as number) <= 0) issues.push(`Progress max ${JSON.stringify(max)} is not a whole number above 0.`);\n else if (!Number.isInteger(value) || (value as number) < 0 || (value as number) > (max as number)) {\n issues.push(`Progress value ${JSON.stringify(value)} is not a whole number from 0 to ${max}.`);\n }\n return issues;\n}\n\n/** \"4 of 8 sections complete\". */\nexport function formatTreasuryProgress(value: number, max: number, unit?: string): string {\n return `${value} of ${max}${unit ? ` ${unit}` : \"\"}`;\n}\n\nconst ProgressRoot = styled.div<{ $tokens: TreasuryDesignTokens }>`\n display: grid;\n font-family: ${({ $tokens }) => $tokens.typography.family.body};\n gap: ${({ $tokens }) => $tokens.spacing.xs};\n`;\n\nconst ProgressText = styled.div<{ $tokens: TreasuryDesignTokens }>`\n align-items: baseline;\n display: flex;\n gap: ${({ $tokens }) => $tokens.spacing.md};\n justify-content: space-between;\n`;\n\nconst ProgressLabel = styled.span<{ $tokens: TreasuryDesignTokens }>`\n color: ${({ $tokens }) => $tokens.colors.text};\n font-size: ${({ $tokens }) => $tokens.typography.size.sm};\n font-weight: ${({ $tokens }) => $tokens.typography.weight.medium};\n`;\n\nconst ProgressCount = styled.span<{ $complete: boolean; $tokens: TreasuryDesignTokens }>`\n color: ${({ $complete, $tokens }) => ($complete ? $tokens.colors.success : $tokens.colors.textMuted)};\n font-size: ${({ $tokens }) => $tokens.typography.size.sm};\n font-variant-numeric: tabular-nums;\n`;\n\nconst ProgressTrack = styled.div<{ $tokens: TreasuryDesignTokens }>`\n background: ${({ $tokens }) => $tokens.colors.borderMuted};\n border-radius: ${({ $tokens }) => $tokens.radii.sm};\n height: 6px;\n overflow: hidden;\n`;\n\nconst ProgressFill = styled.div<{ $complete: boolean; $tokens: TreasuryDesignTokens }>`\n background: ${({ $complete, $tokens }) => ($complete ? $tokens.colors.success : $tokens.colors.accent)};\n height: 100%;\n`;\n\nexport function TreasuryProgress({ className, label, max, showBar = true, tokens, unit, value }: TreasuryProgressProps) {\n const issues = getTreasuryProgressIssues({ max, value });\n if (issues.length) return <TreasuryContractIssues issues={issues} title=\"Progress contract failure\" tokens={tokens} />;\n\n const resolvedTokens = resolveTreasuryTokens(tokens);\n const complete = value === max;\n const text = formatTreasuryProgress(value, max, unit);\n\n return (\n <ProgressRoot\n $tokens={resolvedTokens}\n aria-valuemax={max}\n aria-valuemin={0}\n aria-valuenow={value}\n aria-valuetext={text}\n className={className}\n data-complete={complete ? \"\" : undefined}\n role=\"progressbar\"\n >\n <ProgressText $tokens={resolvedTokens}>\n {label ? <ProgressLabel $tokens={resolvedTokens}>{label}</ProgressLabel> : <span />}\n <ProgressCount $complete={complete} $tokens={resolvedTokens}>\n {text}\n </ProgressCount>\n </ProgressText>\n {showBar ? (\n <ProgressTrack $tokens={resolvedTokens} aria-hidden=\"true\">\n <ProgressFill $complete={complete} $tokens={resolvedTokens} style={{ width: `${(value / max) * 100}%` }} />\n </ProgressTrack>\n ) : null}\n </ProgressRoot>\n );\n}\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,51 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@treasuryspatial/surface-primitives",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
|
|
3
|
+
"version": "0.1.1",
|
|
4
|
+
"description": "Treasury's neutral surface primitives (React, styled-components 6): surface, section header, badge, button, metric, key/value list, table shell, empty state and the visible contract-failure block.",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"main": "./dist/index.js",
|
|
7
|
+
"module": "./dist/index.js",
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
9
|
+
"exports": {
|
|
10
|
+
".": {
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
12
|
+
"import": "./dist/index.js",
|
|
13
|
+
"default": "./dist/index.js"
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
"files": [
|
|
17
|
+
"dist",
|
|
18
|
+
"README.md"
|
|
19
|
+
],
|
|
20
|
+
"sideEffects": false,
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "node ../../scripts/kit-siblings.mjs && rm -rf dist && node ../../scripts/kit-bundle.mjs build && tsc -p tsconfig.json",
|
|
23
|
+
"typecheck": "node ../../scripts/kit-siblings.mjs && tsc -p tsconfig.json --noEmit",
|
|
24
|
+
"test": "rm -rf dist-test && node ../../scripts/kit-bundle.mjs test && node --test dist-test/*.test.cjs",
|
|
25
|
+
"prepublishOnly": "npm run build && npm test"
|
|
26
|
+
},
|
|
27
|
+
"peerDependencies": {
|
|
28
|
+
"react": ">=18",
|
|
29
|
+
"styled-components": "^6.1.0",
|
|
30
|
+
"@treasuryspatial/treasury-design-tokens": "^0.1.0"
|
|
31
|
+
},
|
|
32
|
+
"devDependencies": {
|
|
33
|
+
"@types/node": "^20.17.30",
|
|
34
|
+
"@types/react": "^18.3.3",
|
|
35
|
+
"@types/react-dom": "^18.3.0",
|
|
36
|
+
"esbuild": "^0.23.1",
|
|
37
|
+
"react": "^18.3.1",
|
|
38
|
+
"react-dom": "^18.3.1",
|
|
39
|
+
"styled-components": "^6.1.19",
|
|
40
|
+
"typescript": "^5.8.3"
|
|
41
|
+
},
|
|
42
|
+
"repository": {
|
|
43
|
+
"type": "git",
|
|
44
|
+
"url": "git+https://github.com/TREASURY-SPATIAL-DATA/UI.git",
|
|
45
|
+
"directory": "packages/surface-primitives"
|
|
46
|
+
},
|
|
47
|
+
"license": "MIT",
|
|
48
|
+
"publishConfig": {
|
|
49
|
+
"access": "public"
|
|
50
|
+
}
|
|
51
|
+
}
|