@scttlnd/fintech-design-system 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/AGENTS.md +1 -1
- package/README.md +9 -3
- package/dist/components/Badge.d.mts +9 -0
- package/dist/components/Badge.mjs +18 -0
- package/dist/components/Badge.mjs.map +1 -0
- package/dist/components/Button.d.mts +6 -0
- package/dist/components/Button.mjs +14 -0
- package/dist/components/Button.mjs.map +1 -0
- package/dist/components/Field.d.mts +20 -0
- package/dist/components/Field.mjs +57 -0
- package/dist/components/Field.mjs.map +1 -0
- package/dist/components/Menu.d.mts +18 -0
- package/dist/components/Menu.mjs +109 -0
- package/dist/components/Menu.mjs.map +1 -0
- package/dist/components/Meter.d.mts +39 -0
- package/dist/components/Meter.mjs +82 -0
- package/dist/components/Meter.mjs.map +1 -0
- package/dist/components/Metric.d.mts +17 -0
- package/dist/components/Metric.mjs +34 -0
- package/dist/components/Metric.mjs.map +1 -0
- package/dist/components/Notice.d.mts +16 -0
- package/dist/components/Notice.mjs +48 -0
- package/dist/components/Notice.mjs.map +1 -0
- package/dist/components/Panel.d.mts +13 -0
- package/dist/components/Panel.mjs +42 -0
- package/dist/components/Panel.mjs.map +1 -0
- package/dist/index.d.mts +10 -125
- package/dist/index.mjs +9 -365
- package/dist/lib/cn.d.mts +2 -0
- package/dist/lib/cn.mjs +7 -0
- package/dist/lib/cn.mjs.map +1 -0
- package/package.json +18 -3
- package/styles/components/badge.css +33 -0
- package/styles/components/button.css +45 -0
- package/styles/components/empty-state.css +20 -0
- package/styles/components/eyebrow.css +11 -0
- package/styles/components/field.css +59 -0
- package/styles/components/grain.css +245 -0
- package/styles/components/menu.css +74 -0
- package/styles/components/meter.css +62 -0
- package/styles/components/metric.css +28 -0
- package/styles/components/notice.css +34 -0
- package/styles/components/panel.css +42 -0
- package/styles/components/tone.css +15 -0
- package/styles/components.css +11 -367
- package/styles/index.css +2 -43
- package/styles/themes/funder.css +76 -8
- package/styles/themes/investor.css +76 -8
- package/styles/themes/portare.css +90 -22
- package/styles/tokens.css +88 -23
- package/dist/index.mjs.map +0 -1
package/styles/tokens.css
CHANGED
|
@@ -1,25 +1,90 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
1
|
+
@layer fds {
|
|
2
|
+
:root {
|
|
3
|
+
--fds-background: #08090b;
|
|
4
|
+
--fds-foreground: #f4f4f5;
|
|
5
|
+
--fds-muted: #a1a1aa;
|
|
6
|
+
--fds-muted-strong: #d4d4d8;
|
|
7
|
+
--fds-line: #27272a;
|
|
8
|
+
--fds-line-soft: #1b1b1f;
|
|
9
|
+
--fds-panel: #101114;
|
|
10
|
+
--fds-panel-raised: #15161a;
|
|
11
|
+
--fds-panel-soft: #0c0d10;
|
|
12
|
+
--fds-accent: #7dd3fc;
|
|
13
|
+
--fds-accent-strong: #38bdf8;
|
|
14
|
+
--fds-on-accent: #08090b;
|
|
15
|
+
--fds-success: #86efac;
|
|
16
|
+
--fds-warn: #fbbf24;
|
|
17
|
+
--fds-danger: #fda4af;
|
|
18
|
+
--fds-radius-md: 0.625rem;
|
|
19
|
+
--fds-font-sans:
|
|
20
|
+
Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
:root {
|
|
24
|
+
--fds-radius-lg: 0.75rem;
|
|
25
|
+
--fds-radius-sm: 0.375rem;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/* Phase 0 foundations. Spacing retains the retired showcase's 4px scale. */
|
|
29
|
+
:root {
|
|
30
|
+
--fds-space-1: 4px;
|
|
31
|
+
--fds-space-2: 8px;
|
|
32
|
+
--fds-space-3: 12px;
|
|
33
|
+
--fds-space-4: 16px;
|
|
34
|
+
--fds-space-5: 20px;
|
|
35
|
+
--fds-space-6: 24px;
|
|
36
|
+
--fds-space-7: 28px;
|
|
37
|
+
--fds-space-8: 32px;
|
|
38
|
+
--fds-text-xs: 0.75rem;
|
|
39
|
+
--fds-text-sm: 0.875rem;
|
|
40
|
+
--fds-text-base: 1rem;
|
|
41
|
+
--fds-text-lg: 1.125rem;
|
|
42
|
+
--fds-text-xl: 1.25rem;
|
|
43
|
+
--fds-text-2xl: 1.5rem;
|
|
44
|
+
--fds-leading-tight: 1.25;
|
|
45
|
+
--fds-leading-normal: 1.5;
|
|
46
|
+
--fds-leading-relaxed: 1.75;
|
|
47
|
+
--fds-font-mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
|
|
48
|
+
--fds-numeric: tabular-nums;
|
|
49
|
+
--fds-control-h: 2.75rem;
|
|
50
|
+
--fds-control-h-sm: 2.75rem;
|
|
51
|
+
--fds-focus-ring: var(--fds-accent);
|
|
52
|
+
--fds-shadow-popover: 0 10px 30px rgb(0 0 0 / 0.25);
|
|
53
|
+
--fds-shadow-dialog: 0 24px 64px rgb(0 0 0 / 0.4);
|
|
54
|
+
--fds-overlay: rgb(0 0 0 / 0.6);
|
|
55
|
+
--fds-z-dropdown: 30;
|
|
56
|
+
--fds-z-sticky: 20;
|
|
57
|
+
--fds-z-overlay: 40;
|
|
58
|
+
--fds-z-modal: 50;
|
|
59
|
+
--fds-z-toast: 60;
|
|
60
|
+
--fds-z-tooltip: 70;
|
|
61
|
+
--fds-duration-fast: 0.15s;
|
|
62
|
+
--fds-duration-base: 0.2s;
|
|
63
|
+
--fds-ease-out: cubic-bezier(0.16, 1, 0.3, 1);
|
|
64
|
+
--fds-on-danger: var(--fds-background);
|
|
65
|
+
--fds-on-success: var(--fds-background);
|
|
66
|
+
--fds-chart-1: #7dd3fc;
|
|
67
|
+
--fds-chart-2: #c4b5fd;
|
|
68
|
+
--fds-chart-3: #fbbf24;
|
|
69
|
+
--fds-chart-4: #fda4af;
|
|
70
|
+
--fds-chart-5: #86efac;
|
|
71
|
+
--fds-chart-6: #67e8f9;
|
|
72
|
+
--fds-chart-grid: #71717a;
|
|
73
|
+
--fds-chart-positive: var(--fds-success);
|
|
74
|
+
--fds-chart-negative: var(--fds-danger);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
@media (min-width: 640px) and (pointer: fine) {
|
|
78
|
+
:root {
|
|
79
|
+
--fds-control-h: 2.25rem;
|
|
80
|
+
--fds-control-h-sm: 2rem;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
21
83
|
|
|
22
|
-
:
|
|
23
|
-
|
|
24
|
-
|
|
84
|
+
@media (prefers-reduced-motion: reduce) {
|
|
85
|
+
:root {
|
|
86
|
+
--fds-duration-fast: 0s;
|
|
87
|
+
--fds-duration-base: 0s;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
25
90
|
}
|
package/dist/index.mjs.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../src/lib/cn.ts","../src/components/Button.tsx","../src/components/Panel.tsx","../src/components/Metric.tsx","../src/components/Badge.tsx","../src/components/Notice.tsx","../src/components/Field.tsx","../src/components/Meter.tsx","../src/components/Menu.tsx"],"sourcesContent":["export function cn(...classes: Array<string | false | null | undefined>): string {\n return classes.filter(Boolean).join(\" \");\n}\n","import type { ButtonHTMLAttributes } from \"react\";\nimport { cn } from \"../lib/cn.js\";\n\nexport interface ButtonProps extends ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: \"primary\" | \"secondary\" | \"ghost\";\n}\n\nexport function Button({ variant = \"primary\", className, type = \"button\", ...props }: ButtonProps) {\n return (\n <button\n type={type}\n className={cn(\"fds-button\", `fds-button--${variant}`, className)}\n {...props}\n />\n );\n}\n","import { useId, type ElementType, type HTMLAttributes, type ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.js\";\n\nexport interface PanelProps extends Omit<HTMLAttributes<HTMLElement>, \"title\"> {\n title: ReactNode;\n eyebrow?: ReactNode;\n help?: ReactNode;\n /** Optional trailing action area (buttons, menu). */\n action?: ReactNode;\n /** Heading element for the title. Defaults to h2; pick the level that fits the page outline. */\n headingLevel?: 2 | 3 | 4;\n}\n\n/** Titled surface with optional eyebrow, help text and action. Renders a labelled `<section>`. */\nexport function Panel({\n title,\n eyebrow,\n help,\n action,\n headingLevel = 2,\n className,\n children,\n ...props\n}: PanelProps) {\n const headingId = useId();\n const Heading = `h${headingLevel}` as ElementType;\n return (\n <section aria-labelledby={headingId} className={cn(\"fds-panel\", className)} {...props}>\n <header className=\"fds-panel__header\">\n <div className=\"fds-panel__heading\">\n {eyebrow ? <p className=\"fds-eyebrow\">{eyebrow}</p> : null}\n <Heading id={headingId} className=\"fds-panel__title\">\n {title}\n </Heading>\n {help ? <p className=\"fds-panel__help\">{help}</p> : null}\n </div>\n {action ? <div className=\"fds-panel__action\">{action}</div> : null}\n </header>\n {children}\n </section>\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.js\";\n\nexport type Tone = \"neutral\" | \"accent\" | \"success\" | \"warn\" | \"danger\";\n\nexport interface MetricProps extends HTMLAttributes<HTMLDivElement> {\n label: ReactNode;\n /** Pre-formatted value. Formatting and calculation belong to the consuming app. */\n value: ReactNode;\n tone?: Tone;\n}\n\n/** Label/value tile for pre-formatted figures. Does no number formatting or arithmetic. */\nexport function Metric({ label, value, tone = \"neutral\", className, ...props }: MetricProps) {\n return (\n <div className={cn(\"fds-metric\", className)} {...props}>\n <p className=\"fds-metric__label\">{label}</p>\n <p className={cn(\"fds-metric__value\", `fds-tone--${tone}`)}>{value}</p>\n </div>\n );\n}\n\nexport interface KeyValueProps extends HTMLAttributes<HTMLDivElement> {\n label: ReactNode;\n value: ReactNode;\n}\n\n/** Quieter label/value pair for detail views. */\nexport function KeyValue({ label, value, className, ...props }: KeyValueProps) {\n return (\n <div className={cn(\"fds-keyvalue\", className)} {...props}>\n <p className=\"fds-metric__label\">{label}</p>\n <p className=\"fds-keyvalue__value\">{value}</p>\n </div>\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.js\";\nimport type { Tone } from \"./Metric.js\";\n\nexport interface BadgeProps extends HTMLAttributes<HTMLSpanElement> {\n tone?: Tone;\n icon?: ReactNode;\n}\n\n/** Compact status/label chip. Never rely on tone alone: include meaningful text. */\nexport function Badge({ tone = \"neutral\", icon, className, children, ...props }: BadgeProps) {\n return (\n <span className={cn(\"fds-badge\", `fds-badge--${tone}`, className)} {...props}>\n {icon ? (\n <span aria-hidden=\"true\" className=\"fds-badge__icon\">\n {icon}\n </span>\n ) : null}\n {children}\n </span>\n );\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.js\";\n\nexport interface NoticeProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n tone?: \"info\" | \"success\" | \"warn\" | \"danger\";\n title?: ReactNode;\n action?: ReactNode;\n}\n\n/** Inline message. `danger` announces as an alert; other tones as polite status. */\nexport function Notice({\n tone = \"info\",\n title,\n action,\n className,\n children,\n role,\n ...props\n}: NoticeProps) {\n return (\n <div\n role={role ?? (tone === \"danger\" ? \"alert\" : \"status\")}\n className={cn(\"fds-notice\", `fds-notice--${tone}`, className)}\n {...props}\n >\n <div className=\"fds-notice__body\">\n {title ? <p className=\"fds-notice__title\">{title}</p> : null}\n {children ? <div className=\"fds-notice__text\">{children}</div> : null}\n </div>\n {action ? <div className=\"fds-notice__action\">{action}</div> : null}\n </div>\n );\n}\n\nexport interface EmptyStateProps extends Omit<HTMLAttributes<HTMLDivElement>, \"title\"> {\n title: ReactNode;\n description?: ReactNode;\n action?: ReactNode;\n}\n\n/** Placeholder for lists or panels with no data, with an optional next step. */\nexport function EmptyState({ title, description, action, className, ...props }: EmptyStateProps) {\n return (\n <div className={cn(\"fds-empty\", className)} {...props}>\n <p className=\"fds-empty__title\">{title}</p>\n {description ? <p className=\"fds-empty__description\">{description}</p> : null}\n {action ? <div className=\"fds-empty__action\">{action}</div> : null}\n </div>\n );\n}\n","import {\n useId,\n type InputHTMLAttributes,\n type ReactNode,\n type SelectHTMLAttributes,\n type TextareaHTMLAttributes,\n} from \"react\";\nimport { cn } from \"../lib/cn.js\";\n\nexport interface FieldControlProps {\n id: string;\n \"aria-describedby\"?: string;\n \"aria-invalid\"?: true;\n}\n\nexport interface FieldProps {\n label: ReactNode;\n hint?: ReactNode;\n error?: ReactNode;\n className?: string;\n /** Render prop so the control receives the generated id and aria wiring. */\n children: (control: FieldControlProps) => ReactNode;\n}\n\n/** Label + hint + error wrapper that wires `id`, `aria-describedby` and `aria-invalid`. */\nexport function Field({ label, hint, error, className, children }: FieldProps) {\n const id = useId();\n const hintId = `${id}-hint`;\n const errorId = `${id}-error`;\n const describedBy = [hint ? hintId : null, error ? errorId : null].filter(Boolean).join(\" \");\n const control: FieldControlProps = { id };\n if (describedBy) control[\"aria-describedby\"] = describedBy;\n if (error) control[\"aria-invalid\"] = true;\n return (\n <div className={cn(\"fds-field\", className)}>\n <label className=\"fds-field__label\" htmlFor={id}>\n {label}\n </label>\n {children(control)}\n {hint ? (\n <p className=\"fds-field__hint\" id={hintId}>\n {hint}\n </p>\n ) : null}\n {error ? (\n <p className=\"fds-field__error\" id={errorId}>\n {error}\n </p>\n ) : null}\n </div>\n );\n}\n\nexport function Input({ className, ...props }: InputHTMLAttributes<HTMLInputElement>) {\n return <input className={cn(\"fds-control\", className)} {...props} />;\n}\n\nexport function Select({ className, ...props }: SelectHTMLAttributes<HTMLSelectElement>) {\n return <select className={cn(\"fds-control\", className)} {...props} />;\n}\n\nexport function Textarea({ className, ...props }: TextareaHTMLAttributes<HTMLTextAreaElement>) {\n return <textarea className={cn(\"fds-control fds-control--multiline\", className)} {...props} />;\n}\n","import type { HTMLAttributes, ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.js\";\n\nexport interface MeterProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n /** Accessible name; required because the bar itself has no text. */\n label: string;\n /** Current value within `min`..`max`. Values outside are clamped for display. */\n value: number;\n min?: number;\n max?: number;\n /** Optional human-readable value for assistive tech, e.g. \"72 of 100\". */\n valueText?: string;\n}\n\nconst clamp = (n: number, lo: number, hi: number) => Math.min(Math.max(n, lo), hi);\n\n/** Horizontal bar for a bounded score or share. Display only: no domain logic. */\nexport function Meter({\n label,\n value,\n min = 0,\n max = 100,\n valueText,\n className,\n ...props\n}: MeterProps) {\n const span = max - min;\n const ratio = span > 0 ? clamp((value - min) / span, 0, 1) : 0;\n return (\n <div\n role=\"meter\"\n aria-label={label}\n aria-valuemin={min}\n aria-valuemax={max}\n aria-valuenow={clamp(value, min, max)}\n aria-valuetext={valueText}\n className={cn(\"fds-meter\", className)}\n {...props}\n >\n <div className=\"fds-meter__fill\" style={{ width: `${ratio * 100}%` }} />\n </div>\n );\n}\n\nexport interface SegmentedMeterProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n label: string;\n /** Number of filled segments. */\n value: number;\n segments?: number;\n valueText?: string;\n}\n\n/** Discrete scale (for example a 1-7 risk indicator). */\nexport function SegmentedMeter({\n label,\n value,\n segments = 7,\n valueText,\n className,\n ...props\n}: SegmentedMeterProps) {\n const filled = clamp(Math.round(value), 0, segments);\n return (\n <div\n role=\"meter\"\n aria-label={label}\n aria-valuemin={0}\n aria-valuemax={segments}\n aria-valuenow={filled}\n aria-valuetext={valueText}\n className={cn(\"fds-segmeter\", className)}\n {...props}\n >\n {Array.from({ length: segments }, (_, index) => (\n <span\n key={index}\n className={cn(\"fds-segmeter__segment\", index < filled && \"fds-segmeter__segment--on\")}\n />\n ))}\n </div>\n );\n}\n\nexport interface DistributionItem {\n label: ReactNode;\n value: number;\n}\n\nexport interface DistributionListProps extends Omit<HTMLAttributes<HTMLDivElement>, \"children\"> {\n items: readonly DistributionItem[];\n /** Maximum rows shown; the remainder is summarised via `renderOverflow`. */\n limit?: number;\n /** Formats the value text. Consumer owns units and locale. */\n formatValue?: (value: number) => ReactNode;\n /** Shown when there is nothing positive to display. */\n empty?: ReactNode;\n renderOverflow?: (hidden: number) => ReactNode;\n}\n\n/** Ranked list of share bars, scaled relative to the largest row. */\nexport function DistributionList({\n items,\n limit = 5,\n formatValue = (v) => String(v),\n empty,\n renderOverflow,\n className,\n ...props\n}: DistributionListProps) {\n const sorted = [...items].sort((a, b) => b.value - a.value);\n const top = sorted.slice(0, limit);\n const max = top[0]?.value ?? 0;\n if (max <= 0) return empty ? <p className=\"fds-distribution__empty\">{empty}</p> : null;\n const hidden = sorted.length - top.length;\n return (\n <div className={cn(\"fds-distribution\", className)} {...props}>\n <ul className=\"fds-distribution__list\">\n {top.map((item, index) => (\n <li key={index} className=\"fds-distribution__row\">\n <div className=\"fds-distribution__meta\">\n <span className=\"fds-distribution__label\">{item.label}</span>\n <span className=\"fds-distribution__value\">{formatValue(item.value)}</span>\n </div>\n <div aria-hidden=\"true\" className=\"fds-meter fds-meter--thin\">\n <div\n className=\"fds-meter__fill\"\n style={{ width: `${(Math.max(item.value, 0) / max) * 100}%` }}\n />\n </div>\n </li>\n ))}\n </ul>\n {hidden > 0 && renderOverflow ? (\n <p className=\"fds-distribution__overflow\">{renderOverflow(hidden)}</p>\n ) : null}\n </div>\n );\n}\n","import { useEffect, useId, useRef, useState, type KeyboardEvent, type ReactNode } from \"react\";\nimport { cn } from \"../lib/cn.js\";\n\nexport interface MenuItem {\n label: string;\n tone?: \"danger\";\n disabled?: boolean;\n onSelect: () => void;\n}\n\nexport interface MenuProps {\n /** Accessible name of the trigger button. */\n ariaLabel: string;\n items: readonly MenuItem[];\n /** Trigger content. Defaults to a vertical-ellipsis glyph. */\n trigger?: ReactNode;\n className?: string;\n}\n\n/** Action menu: closes on outside press and Escape (returning focus), arrow-key navigation. */\nexport function Menu({ ariaLabel, items, trigger, className }: MenuProps) {\n const [open, setOpen] = useState(false);\n const rootRef = useRef<HTMLDivElement>(null);\n const triggerRef = useRef<HTMLButtonElement>(null);\n const menuId = useId();\n\n useEffect(() => {\n if (!open) return;\n const onPointerDown = (event: MouseEvent | TouchEvent) => {\n if (!rootRef.current?.contains(event.target as Node)) setOpen(false);\n };\n document.addEventListener(\"mousedown\", onPointerDown);\n document.addEventListener(\"touchstart\", onPointerDown);\n return () => {\n document.removeEventListener(\"mousedown\", onPointerDown);\n document.removeEventListener(\"touchstart\", onPointerDown);\n };\n }, [open]);\n\n useEffect(() => {\n if (open)\n rootRef.current?.querySelector<HTMLElement>('[role=\"menuitem\"]:not(:disabled)')?.focus();\n }, [open]);\n\n const onKeyDown = (event: KeyboardEvent<HTMLDivElement>) => {\n if (!open) return;\n if (event.key === \"Escape\") {\n event.stopPropagation();\n setOpen(false);\n triggerRef.current?.focus();\n return;\n }\n const enabled = Array.from(\n rootRef.current?.querySelectorAll<HTMLElement>('[role=\"menuitem\"]:not(:disabled)') ?? [],\n );\n if (enabled.length === 0) return;\n const current = enabled.indexOf(document.activeElement as HTMLElement);\n const move = (next: number) => {\n event.preventDefault();\n enabled[(next + enabled.length) % enabled.length]?.focus();\n };\n if (event.key === \"ArrowDown\") move(current + 1);\n else if (event.key === \"ArrowUp\") move(current < 0 ? enabled.length - 1 : current - 1);\n else if (event.key === \"Home\") move(0);\n else if (event.key === \"End\") move(enabled.length - 1);\n else if (event.key === \"Tab\") setOpen(false);\n };\n\n return (\n <div className={cn(\"fds-menu\", className)} onKeyDown={onKeyDown} ref={rootRef}>\n <button\n aria-controls={open ? menuId : undefined}\n aria-expanded={open}\n aria-haspopup=\"menu\"\n aria-label={ariaLabel}\n className=\"fds-menu__trigger\"\n onClick={() => setOpen((value) => !value)}\n ref={triggerRef}\n type=\"button\"\n >\n {trigger ?? (\n <svg aria-hidden=\"true\" focusable=\"false\" height=\"16\" viewBox=\"0 0 16 16\" width=\"16\">\n <circle cx=\"3\" cy=\"8\" fill=\"currentColor\" r=\"1.4\" />\n <circle cx=\"8\" cy=\"8\" fill=\"currentColor\" r=\"1.4\" />\n <circle cx=\"13\" cy=\"8\" fill=\"currentColor\" r=\"1.4\" />\n </svg>\n )}\n </button>\n {open ? (\n <div className=\"fds-menu__list\" id={menuId} role=\"menu\">\n {items.map((item) => (\n <button\n className={cn(\"fds-menu__item\", item.tone === \"danger\" && \"fds-menu__item--danger\")}\n disabled={item.disabled}\n key={item.label}\n onClick={() => {\n setOpen(false);\n triggerRef.current?.focus();\n item.onSelect();\n }}\n role=\"menuitem\"\n type=\"button\"\n >\n {item.label}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n );\n}\n"],"mappings":";;;AAAA,SAAgB,GAAG,GAAG,SAA2D;CAC/E,OAAO,QAAQ,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;AACzC;;ACKA,SAAgB,OAAO,EAAE,UAAU,WAAW,WAAW,OAAO,UAAU,GAAG,SAAsB;CACjG,OACE,oBAAC,UAAD;EACQ;EACN,WAAW,GAAG,cAAc,eAAe,WAAW,SAAS;EAC/D,GAAI;CACL,CAAA;AAEL;;;ACDA,SAAgB,MAAM,EACpB,OACA,SACA,MACA,QACA,eAAe,GACf,WACA,UACA,GAAG,SACU;CACb,MAAM,YAAY,MAAM;CACxB,MAAM,UAAU,IAAI;CACpB,OACE,qBAAC,WAAD;EAAS,mBAAiB;EAAW,WAAW,GAAG,aAAa,SAAS;EAAG,GAAI;EAAhF,UAAA,CACE,qBAAC,UAAD;GAAQ,WAAU;GAAlB,UAAA,CACE,qBAAC,OAAD;IAAK,WAAU;IAAf,UAAA;KACG,UAAU,oBAAC,KAAD;MAAG,WAAU;MAAe,UAAA;KAAW,CAAA,IAAI;KACtD,oBAAC,SAAD;MAAS,IAAI;MAAW,WAAU;MAC/B,UAAA;KACM,CAAA;KACR,OAAO,oBAAC,KAAD;MAAG,WAAU;MAAmB,UAAA;KAAQ,CAAA,IAAI;IACjD;GACJ,CAAA,GAAA,SAAS,oBAAC,OAAD;IAAK,WAAU;IAAqB,UAAA;GAAY,CAAA,IAAI,IACxD;EACP,CAAA,GAAA,QACM;;AAEb;;;AC5BA,SAAgB,OAAO,EAAE,OAAO,OAAO,OAAO,WAAW,WAAW,GAAG,SAAsB;CAC3F,OACE,qBAAC,OAAD;EAAK,WAAW,GAAG,cAAc,SAAS;EAAG,GAAI;EAAjD,UAAA,CACE,oBAAC,KAAD;GAAG,WAAU;GAAqB,UAAA;EAAS,CAAA,GAC3C,oBAAC,KAAD;GAAG,WAAW,GAAG,qBAAqB,aAAa,MAAM;GAAI,UAAA;EAAS,CAAA,CACnE;;AAET;;AAQA,SAAgB,SAAS,EAAE,OAAO,OAAO,WAAW,GAAG,SAAwB;CAC7E,OACE,qBAAC,OAAD;EAAK,WAAW,GAAG,gBAAgB,SAAS;EAAG,GAAI;EAAnD,UAAA,CACE,oBAAC,KAAD;GAAG,WAAU;GAAqB,UAAA;EAAS,CAAA,GAC3C,oBAAC,KAAD;GAAG,WAAU;GAAuB,UAAA;EAAS,CAAA,CAC1C;;AAET;;;ACzBA,SAAgB,MAAM,EAAE,OAAO,WAAW,MAAM,WAAW,UAAU,GAAG,SAAqB;CAC3F,OACE,qBAAC,QAAD;EAAM,WAAW,GAAG,aAAa,cAAc,QAAQ,SAAS;EAAG,GAAI;EAAvE,UAAA,CACG,OACC,oBAAC,QAAD;GAAM,eAAY;GAAO,WAAU;GAChC,UAAA;EACG,CAAA,IACJ,MACH,QACG;;AAEV;;;ACXA,SAAgB,OAAO,EACrB,OAAO,QACP,OACA,QACA,WACA,UACA,MACA,GAAG,SACW;CACd,OACE,qBAAC,OAAD;EACE,MAAM,SAAS,SAAS,WAAW,UAAU;EAC7C,WAAW,GAAG,cAAc,eAAe,QAAQ,SAAS;EAC5D,GAAI;EAHN,UAAA,CAKE,qBAAC,OAAD;GAAK,WAAU;GAAf,UAAA,CACG,QAAQ,oBAAC,KAAD;IAAG,WAAU;IAAqB,UAAA;GAAS,CAAA,IAAI,MACvD,WAAW,oBAAC,OAAD;IAAK,WAAU;IAAoB;GAAc,CAAA,IAAI,IAC9D;EACJ,CAAA,GAAA,SAAS,oBAAC,OAAD;GAAK,WAAU;GAAsB,UAAA;EAAY,CAAA,IAAI,IAC5D;;AAET;;AASA,SAAgB,WAAW,EAAE,OAAO,aAAa,QAAQ,WAAW,GAAG,SAA0B;CAC/F,OACE,qBAAC,OAAD;EAAK,WAAW,GAAG,aAAa,SAAS;EAAG,GAAI;EAAhD,UAAA;GACE,oBAAC,KAAD;IAAG,WAAU;IAAoB,UAAA;GAAS,CAAA;GACzC,cAAc,oBAAC,KAAD;IAAG,WAAU;IAA0B,UAAA;GAAe,CAAA,IAAI;GACxE,SAAS,oBAAC,OAAD;IAAK,WAAU;IAAqB,UAAA;GAAY,CAAA,IAAI;EAC3D;;AAET;;;ACxBA,SAAgB,MAAM,EAAE,OAAO,MAAM,OAAO,WAAW,YAAwB;CAC7E,MAAM,KAAK,MAAM;CACjB,MAAM,SAAS,GAAG,GAAG;CACrB,MAAM,UAAU,GAAG,GAAG;CACtB,MAAM,cAAc,CAAC,OAAO,SAAS,MAAM,QAAQ,UAAU,IAAI,CAAC,CAAC,OAAO,OAAO,CAAC,CAAC,KAAK,GAAG;CAC3F,MAAM,UAA6B,EAAE,GAAG;CACxC,IAAI,aAAa,QAAQ,sBAAsB;CAC/C,IAAI,OAAO,QAAQ,kBAAkB;CACrC,OACE,qBAAC,OAAD;EAAK,WAAW,GAAG,aAAa,SAAS;EAAzC,UAAA;GACE,oBAAC,SAAD;IAAO,WAAU;IAAmB,SAAS;IAC1C,UAAA;GACI,CAAA;GACN,SAAS,OAAO;GAChB,OACC,oBAAC,KAAD;IAAG,WAAU;IAAkB,IAAI;IAChC,UAAA;GACA,CAAA,IACD;GACH,QACC,oBAAC,KAAD;IAAG,WAAU;IAAmB,IAAI;IACjC,UAAA;GACA,CAAA,IACD;EACD;;AAET;AAEA,SAAgB,MAAM,EAAE,WAAW,GAAG,SAAgD;CACpF,OAAO,oBAAC,SAAD;EAAO,WAAW,GAAG,eAAe,SAAS;EAAG,GAAI;CAAQ,CAAA;AACrE;AAEA,SAAgB,OAAO,EAAE,WAAW,GAAG,SAAkD;CACvF,OAAO,oBAAC,UAAD;EAAQ,WAAW,GAAG,eAAe,SAAS;EAAG,GAAI;CAAQ,CAAA;AACtE;AAEA,SAAgB,SAAS,EAAE,WAAW,GAAG,SAAsD;CAC7F,OAAO,oBAAC,YAAD;EAAU,WAAW,GAAG,sCAAsC,SAAS;EAAG,GAAI;CAAQ,CAAA;AAC/F;;ACjDA,MAAM,SAAS,GAAW,IAAY,OAAe,KAAK,IAAI,KAAK,IAAI,GAAG,EAAE,GAAG,EAAE;;AAGjF,SAAgB,MAAM,EACpB,OACA,OACA,MAAM,GACN,MAAM,KACN,WACA,WACA,GAAG,SACU;CACb,MAAM,OAAO,MAAM;CACnB,MAAM,QAAQ,OAAO,IAAI,OAAO,QAAQ,OAAO,MAAM,GAAG,CAAC,IAAI;CAC7D,OACE,oBAAC,OAAD;EACE,MAAK;EACL,cAAY;EACZ,iBAAe;EACf,iBAAe;EACf,iBAAe,MAAM,OAAO,KAAK,GAAG;EACpC,kBAAgB;EAChB,WAAW,GAAG,aAAa,SAAS;EACpC,GAAI;EAEJ,UAAA,oBAAC,OAAD;GAAK,WAAU;GAAkB,OAAO,EAAE,OAAO,GAAG,QAAQ,IAAI,GAAG;EAAI,CAAA;CACpE,CAAA;AAET;;AAWA,SAAgB,eAAe,EAC7B,OACA,OACA,WAAW,GACX,WACA,WACA,GAAG,SACmB;CACtB,MAAM,SAAS,MAAM,KAAK,MAAM,KAAK,GAAG,GAAG,QAAQ;CACnD,OACE,oBAAC,OAAD;EACE,MAAK;EACL,cAAY;EACZ,iBAAe;EACf,iBAAe;EACf,iBAAe;EACf,kBAAgB;EAChB,WAAW,GAAG,gBAAgB,SAAS;EACvC,GAAI;EAEH,UAAA,MAAM,KAAK,EAAE,QAAQ,SAAS,IAAI,GAAG,UACpC,oBAAC,QAAD,EAEE,WAAW,GAAG,yBAAyB,QAAQ,UAAU,2BAA2B,EACrF,GAFM,KAEN,CACF;CACE,CAAA;AAET;;AAmBA,SAAgB,iBAAiB,EAC/B,OACA,QAAQ,GACR,eAAe,MAAM,OAAO,CAAC,GAC7B,OACA,gBACA,WACA,GAAG,SACqB;CACxB,MAAM,SAAS,CAAC,GAAG,KAAK,CAAC,CAAC,MAAM,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;CAC1D,MAAM,MAAM,OAAO,MAAM,GAAG,KAAK;CACjC,MAAM,MAAM,IAAI,EAAE,EAAE,SAAS;CAC7B,IAAI,OAAO,GAAG,OAAO,QAAQ,oBAAC,KAAD;EAAG,WAAU;EAA2B,UAAA;CAAS,CAAA,IAAI;CAClF,MAAM,SAAS,OAAO,SAAS,IAAI;CACnC,OACE,qBAAC,OAAD;EAAK,WAAW,GAAG,oBAAoB,SAAS;EAAG,GAAI;EAAvD,UAAA,CACE,oBAAC,MAAD;GAAI,WAAU;GACX,UAAA,IAAI,KAAK,MAAM,UACd,qBAAC,MAAD;IAAgB,WAAU;IAA1B,UAAA,CACE,qBAAC,OAAD;KAAK,WAAU;KAAf,UAAA,CACE,oBAAC,QAAD;MAAM,WAAU;MAA2B,UAAA,KAAK;KAAY,CAAA,GAC5D,oBAAC,QAAD;MAAM,WAAU;MAA2B,UAAA,YAAY,KAAK,KAAK;KAAQ,CAAA,CACtE;IACL,CAAA,GAAA,oBAAC,OAAD;KAAK,eAAY;KAAO,WAAU;KAChC,UAAA,oBAAC,OAAD;MACE,WAAU;MACV,OAAO,EAAE,OAAO,GAAI,KAAK,IAAI,KAAK,OAAO,CAAC,IAAI,MAAO,IAAI,GAAG;KAC7D,CAAA;IACE,CAAA,CACH;GAXK,GAAA,KAWL,CACL;EACC,CAAA,GACH,SAAS,KAAK,iBACb,oBAAC,KAAD;GAAG,WAAU;GAA8B,UAAA,eAAe,MAAM;EAAK,CAAA,IACnE,IACD;;AAET;;;ACrHA,SAAgB,KAAK,EAAE,WAAW,OAAO,SAAS,aAAwB;CACxE,MAAM,CAAC,MAAM,WAAW,SAAS,KAAK;CACtC,MAAM,UAAU,OAAuB,IAAI;CAC3C,MAAM,aAAa,OAA0B,IAAI;CACjD,MAAM,SAAS,MAAM;CAErB,gBAAgB;EACd,IAAI,CAAC,MAAM;EACX,MAAM,iBAAiB,UAAmC;GACxD,IAAI,CAAC,QAAQ,SAAS,SAAS,MAAM,MAAc,GAAG,QAAQ,KAAK;EACrE;EACA,SAAS,iBAAiB,aAAa,aAAa;EACpD,SAAS,iBAAiB,cAAc,aAAa;EACrD,aAAa;GACX,SAAS,oBAAoB,aAAa,aAAa;GACvD,SAAS,oBAAoB,cAAc,aAAa;EAC1D;CACF,GAAG,CAAC,IAAI,CAAC;CAET,gBAAgB;EACd,IAAI,MACF,QAAQ,SAAS,cAA2B,oCAAkC,CAAC,EAAE,MAAM;CAC3F,GAAG,CAAC,IAAI,CAAC;CAET,MAAM,aAAa,UAAyC;EAC1D,IAAI,CAAC,MAAM;EACX,IAAI,MAAM,QAAQ,UAAU;GAC1B,MAAM,gBAAgB;GACtB,QAAQ,KAAK;GACb,WAAW,SAAS,MAAM;GAC1B;EACF;EACA,MAAM,UAAU,MAAM,KACpB,QAAQ,SAAS,iBAA8B,oCAAkC,KAAK,CAAC,CACzF;EACA,IAAI,QAAQ,WAAW,GAAG;EAC1B,MAAM,UAAU,QAAQ,QAAQ,SAAS,aAA4B;EACrE,MAAM,QAAQ,SAAiB;GAC7B,MAAM,eAAe;GACrB,SAAS,OAAO,QAAQ,UAAU,QAAQ,OAAO,EAAE,MAAM;EAC3D;EACA,IAAI,MAAM,QAAQ,aAAa,KAAK,UAAU,CAAC;OAC1C,IAAI,MAAM,QAAQ,WAAW,KAAK,UAAU,IAAI,QAAQ,SAAS,IAAI,UAAU,CAAC;OAChF,IAAI,MAAM,QAAQ,QAAQ,KAAK,CAAC;OAChC,IAAI,MAAM,QAAQ,OAAO,KAAK,QAAQ,SAAS,CAAC;OAChD,IAAI,MAAM,QAAQ,OAAO,QAAQ,KAAK;CAC7C;CAEA,OACE,qBAAC,OAAD;EAAK,WAAW,GAAG,YAAY,SAAS;EAAc;EAAW,KAAK;EAAtE,UAAA,CACE,oBAAC,UAAD;GACE,iBAAe,OAAO,SAAS,KAAA;GAC/B,iBAAe;GACf,iBAAc;GACd,cAAY;GACZ,WAAU;GACV,eAAe,SAAS,UAAU,CAAC,KAAK;GACxC,KAAK;GACL,MAAK;GAEJ,UAAA,WACC,qBAAC,OAAD;IAAK,eAAY;IAAO,WAAU;IAAQ,QAAO;IAAK,SAAQ;IAAY,OAAM;IAAhF,UAAA;KACE,oBAAC,UAAD;MAAQ,IAAG;MAAI,IAAG;MAAI,MAAK;MAAe,GAAE;KAAO,CAAA;KACnD,oBAAC,UAAD;MAAQ,IAAG;MAAI,IAAG;MAAI,MAAK;MAAe,GAAE;KAAO,CAAA;KACnD,oBAAC,UAAD;MAAQ,IAAG;MAAK,IAAG;MAAI,MAAK;MAAe,GAAE;KAAO,CAAA;IACjD;;EAED,CAAA,GACP,OACC,oBAAC,OAAD;GAAK,WAAU;GAAiB,IAAI;GAAQ,MAAK;GAC9C,UAAA,MAAM,KAAK,SACV,oBAAC,UAAD;IACE,WAAW,GAAG,kBAAkB,KAAK,SAAS,YAAY,wBAAwB;IAClF,UAAU,KAAK;IAEf,eAAe;KACb,QAAQ,KAAK;KACb,WAAW,SAAS,MAAM;KAC1B,KAAK,SAAS;IAChB;IACA,MAAK;IACL,MAAK;IAEJ,UAAA,KAAK;GACA,GAVD,KAAK,KAUJ,CACT;EACE,CAAA,IACH,IACD;;AAET"}
|