@bison-lab/admin-ui 3.22.0 → 3.24.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,7 +1,13 @@
1
1
  # `@bison-lab/admin-ui`
2
2
 
3
- Payload-free kit primitives for CMS field editors: type cards, confirm
4
- dialogs, and the glyphs a rail uses. Field adapters in
3
+ Payload-free kit primitives for CMS field editors: type cards, dialogs
4
+ (outline Cancel in a footer row, optional primary confirm), buttons,
5
+ checkbox, input, switch, textarea, a stacked `Field`/`Label` (12px/700,
6
+ 8px above the control), `Kicker` (uppercase eyebrow), `Fold` (accordion
7
+ that keeps its own open state and leaves children mounted), `Stack` (locked
8
+ 12px column gap for a list of folds and the add button after them), a Radix
9
+ select (not a native `<select>`), and the glyphs a rail uses. Wrap a screen
10
+ in `KitProvider` once so those styles mount. Field adapters in
5
11
  `@bison-lab/payload-blocks/admin` (and later `@bison-lab/payload-core/admin`)
6
12
  compose them and own `useField` / `useForm`.
7
13
 
package/dist/index.d.mts CHANGED
@@ -1,7 +1,149 @@
1
1
 
2
2
  import * as react_jsx_runtime0 from "react/jsx-runtime";
3
- import { ReactNode } from "react";
3
+ import { Checkbox as Checkbox$1, Select as Select$1, Switch as Switch$1 } from "radix-ui";
4
+ import * as react from "react";
5
+ import { ButtonHTMLAttributes, ComponentPropsWithoutRef, HTMLAttributes, InputHTMLAttributes, ReactNode, TextareaHTMLAttributes } from "react";
4
6
 
7
+ //#region src/badge.d.ts
8
+ declare const BADGE_VARIANTS: readonly ["primary", "secondary", "success", "danger", "warning", "info", "neutral-subtle", "neutral-strong"];
9
+ type BadgeVariant = (typeof BADGE_VARIANTS)[number];
10
+ type BadgeCommon = {
11
+ variant?: BadgeVariant;
12
+ className?: string;
13
+ };
14
+ type BadgeProps = (BadgeCommon & {
15
+ as?: "span";
16
+ } & HTMLAttributes<HTMLSpanElement>) | (BadgeCommon & {
17
+ as: "button";
18
+ } & ButtonHTMLAttributes<HTMLButtonElement>);
19
+ /** Pill status. Span by default; pass `as="button"` for a clickable chip. Label case is the caller's. */
20
+ declare function Badge({
21
+ variant,
22
+ as,
23
+ className,
24
+ ...props
25
+ }: BadgeProps): react_jsx_runtime0.JSX.Element;
26
+ //#endregion
27
+ //#region src/button.d.ts
28
+ type ButtonVariant = "primary" | "secondary" | "outline" | "ghost" | "danger";
29
+ declare function Button({
30
+ variant,
31
+ className,
32
+ type,
33
+ children,
34
+ ...props
35
+ }: ButtonHTMLAttributes<HTMLButtonElement> & {
36
+ variant?: ButtonVariant;
37
+ }): react_jsx_runtime0.JSX.Element;
38
+ //#endregion
39
+ //#region src/checkbox.d.ts
40
+ declare function Checkbox({
41
+ className,
42
+ ...props
43
+ }: ComponentPropsWithoutRef<typeof Checkbox$1.Root>): react_jsx_runtime0.JSX.Element;
44
+ //#endregion
45
+ //#region src/provider.d.ts
46
+ /** A `#rrggbb` the kit may write onto `--bl-kit-accent`. Anything else is ignored. */
47
+ declare function kitAccent(value: string | undefined): string | undefined;
48
+ /**
49
+ * Mount once around kit chrome. Primitives read these styles; they do not
50
+ * inject them. Pass `accent` to set `--bl-kit-accent` on `:root` so portaled
51
+ * dialogs and selects follow it. Sites can also set that variable themselves.
52
+ */
53
+ declare function KitProvider({
54
+ children,
55
+ accent
56
+ }: {
57
+ children: ReactNode;
58
+ accent?: string;
59
+ }): react_jsx_runtime0.JSX.Element;
60
+ //#endregion
61
+ //#region src/label.d.ts
62
+ type FieldTag = "label" | "div";
63
+ /** Stack a label above its control. The label class owns type; this owns the 8px gap. */
64
+ declare function Field({
65
+ as: Tag,
66
+ className,
67
+ ...props
68
+ }: HTMLAttributes<HTMLElement> & {
69
+ as?: FieldTag;
70
+ }): react_jsx_runtime0.JSX.Element;
71
+ /** Visible field name. Sit this in `Field` above the control — do not restyle per screen. */
72
+ declare function Label({
73
+ className,
74
+ ...props
75
+ }: HTMLAttributes<HTMLSpanElement>): react_jsx_runtime0.JSX.Element;
76
+ //#endregion
77
+ //#region src/kicker.d.ts
78
+ /** Uppercase eyebrow. MainHead, the preview note, and later chrome all use this. */
79
+ declare function Kicker({
80
+ className,
81
+ ...props
82
+ }: HTMLAttributes<HTMLParagraphElement>): react_jsx_runtime0.JSX.Element;
83
+ //#endregion
84
+ //#region src/fold.d.ts
85
+ type FoldAction = {
86
+ label: string;
87
+ onClick: () => void;
88
+ disabled?: boolean;
89
+ danger?: boolean;
90
+ };
91
+ type FoldTone = "light" | "dark";
92
+ declare function Fold({
93
+ title,
94
+ tone,
95
+ badge,
96
+ meta,
97
+ actions,
98
+ defaultOpen,
99
+ open: openProp,
100
+ onOpenChange,
101
+ className,
102
+ children
103
+ }: {
104
+ title: string;
105
+ tone?: FoldTone;
106
+ badge?: ReactNode;
107
+ meta?: ReactNode | ((open: boolean) => ReactNode);
108
+ actions?: FoldAction[];
109
+ defaultOpen?: boolean;
110
+ open?: boolean;
111
+ onOpenChange?: (open: boolean) => void;
112
+ className?: string;
113
+ children?: ReactNode;
114
+ }): react_jsx_runtime0.JSX.Element;
115
+ //#endregion
116
+ //#region src/stack.d.ts
117
+ /** Vertical list with a locked gap — sections in a column, links in a section, and their add buttons. */
118
+ declare function Stack({
119
+ className,
120
+ ...props
121
+ }: HTMLAttributes<HTMLDivElement>): react_jsx_runtime0.JSX.Element;
122
+ //#endregion
123
+ //#region src/dialog.d.ts
124
+ type DialogConfirmVariant = Extract<ButtonVariant, "primary" | "danger">;
125
+ declare function Dialog({
126
+ open,
127
+ title,
128
+ children,
129
+ cancelLabel,
130
+ onCancel,
131
+ confirmLabel,
132
+ onConfirm,
133
+ confirmVariant,
134
+ confirmDisabled
135
+ }: {
136
+ open: boolean;
137
+ title: string;
138
+ children: ReactNode;
139
+ cancelLabel?: string;
140
+ onCancel: () => void;
141
+ confirmLabel?: string;
142
+ onConfirm?: () => void;
143
+ confirmVariant?: DialogConfirmVariant;
144
+ confirmDisabled?: boolean;
145
+ }): react_jsx_runtime0.JSX.Element | null;
146
+ //#endregion
5
147
  //#region src/confirm-dialog.d.ts
6
148
  declare function ConfirmDialog({
7
149
  open,
@@ -10,7 +152,8 @@ declare function ConfirmDialog({
10
152
  cancelLabel,
11
153
  confirmLabel,
12
154
  onCancel,
13
- onConfirm
155
+ onConfirm,
156
+ confirmVariant
14
157
  }: {
15
158
  open: boolean;
16
159
  title: string;
@@ -19,9 +162,35 @@ declare function ConfirmDialog({
19
162
  confirmLabel: string;
20
163
  onCancel: () => void;
21
164
  onConfirm: () => void;
22
- }): react_jsx_runtime0.JSX.Element | null;
165
+ confirmVariant?: DialogConfirmVariant;
166
+ }): react_jsx_runtime0.JSX.Element;
167
+ //#endregion
168
+ //#region src/input.d.ts
169
+ declare function Input({
170
+ className,
171
+ ...props
172
+ }: InputHTMLAttributes<HTMLInputElement>): react_jsx_runtime0.JSX.Element;
173
+ //#endregion
174
+ //#region src/switch.d.ts
175
+ declare function Switch({
176
+ className,
177
+ ...props
178
+ }: ComponentPropsWithoutRef<typeof Switch$1.Root>): react_jsx_runtime0.JSX.Element;
179
+ //#endregion
180
+ //#region src/textarea.d.ts
181
+ declare function Textarea({
182
+ className,
183
+ ...props
184
+ }: TextareaHTMLAttributes<HTMLTextAreaElement>): react_jsx_runtime0.JSX.Element;
23
185
  //#endregion
24
186
  //#region src/glyphs.d.ts
187
+ type ItemKind = "navLink" | "megaMenu";
188
+ /** Rail / type-card mark. The kit owns the badge; pass `kind` only. */
189
+ declare function KindGlyph({
190
+ kind
191
+ }: {
192
+ kind: ItemKind;
193
+ }): react_jsx_runtime0.JSX.Element;
25
194
  declare function LinkGlyph(): react_jsx_runtime0.JSX.Element;
26
195
  declare function MegaGlyph(): react_jsx_runtime0.JSX.Element;
27
196
  //#endregion
@@ -49,6 +218,22 @@ declare function TypeCard({
49
218
  disabled?: boolean;
50
219
  }): react_jsx_runtime0.JSX.Element;
51
220
  //#endregion
221
+ //#region src/select.d.ts
222
+ declare const Select: react.FC<Select$1.SelectProps>;
223
+ declare const SelectValue: react.ForwardRefExoticComponent<Select$1.SelectValueProps & react.RefAttributes<HTMLSpanElement>>;
224
+ declare function SelectTrigger({
225
+ children,
226
+ ...props
227
+ }: ComponentPropsWithoutRef<typeof Select$1.Trigger>): react_jsx_runtime0.JSX.Element;
228
+ declare function SelectContent({
229
+ children,
230
+ ...props
231
+ }: ComponentPropsWithoutRef<typeof Select$1.Content>): react_jsx_runtime0.JSX.Element;
232
+ declare function SelectItem({
233
+ children,
234
+ ...props
235
+ }: ComponentPropsWithoutRef<typeof Select$1.Item>): react_jsx_runtime0.JSX.Element;
236
+ //#endregion
52
237
  //#region src/workspace.d.ts
53
238
  /**
54
239
  * Presentational workspace chrome. Surfaces come from the adapter CSS
@@ -65,6 +250,7 @@ declare function MainHead({
65
250
  description?: ReactNode;
66
251
  children?: ReactNode;
67
252
  }): react_jsx_runtime0.JSX.Element;
253
+ /** Aside chrome only. The adapter supplies children — nothing here is a link list. */
68
254
  declare function ItemRail({
69
255
  children
70
256
  }: {
@@ -81,5 +267,5 @@ declare function Canvas({
81
267
  children: ReactNode;
82
268
  }): react_jsx_runtime0.JSX.Element;
83
269
  //#endregion
84
- export { Canvas, ConfirmDialog, ItemRail, LinkGlyph, MainHead, MegaGlyph, RailSlot, TypeCard, TypeCards };
270
+ export { BADGE_VARIANTS, Badge, type BadgeVariant, Button, Canvas, Checkbox, ConfirmDialog, Dialog, Field, Fold, type FoldAction, type FoldTone, Input, ItemRail, Kicker, KindGlyph, KitProvider, Label, LinkGlyph, MainHead, MegaGlyph, RailSlot, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Stack, Switch, Textarea, TypeCard, TypeCards, kitAccent };
85
271
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/confirm-dialog.tsx","../src/glyphs.tsx","../src/type-cards.tsx","../src/workspace.tsx"],"mappings":";;;;;iBAIgB,aAAA,CAAA;EACd,IAAA;EACA,KAAA;EACA,QAAA;EACA,WAAA;EACA,YAAA;EACA,QAAA;EACA;AAAA;EAEA,IAAA;EACA,KAAA;EACA,QAAA,EAAU,SAAA;EACV,WAAA;EACA,YAAA;EACA,QAAA;EACA,SAAA;AAAA,IACD,kBAAA,CAAA,GAAA,CAAA,OAAA;;;iBCpBe,SAAA,CAAA,GAAS,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAST,SAAA,CAAA,GAAS,kBAAA,CAAA,GAAA,CAAA,OAAA;;;iBCLT,SAAA,CAAA;EACd,OAAA;EACA;AAAA;EAEA,OAAA;EACA,QAAA,EAAU,SAAA;AAAA,IACX,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBASe,QAAA,CAAA;EACd,IAAA;EACA,KAAA;EACA,WAAA;EACA,OAAA;EACA,MAAA;EACA;AAAA;EAEA,IAAA,GAAO,SAAA;EACP,KAAA;EACA,WAAA;EACA,OAAA;EACA,MAAA;EACA,QAAA;AAAA,IACD,kBAAA,CAAA,GAAA,CAAA,OAAA;;;;;;AF7BD;iBGEgB,QAAA,CAAA;EACd,MAAA;EACA,KAAA;EACA,WAAA;EACA;AAAA;EAEA,MAAA,GAAS,SAAA;EACT,KAAA,EAAO,SAAA;EACP,WAAA,GAAc,SAAA;EACd,QAAA,GAAW,SAAA;AAAA,IACZ,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAae,QAAA,CAAA;EAAW;AAAA;EAAc,QAAA,EAAU,SAAA;AAAA,IAAW,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAI9C,QAAA,CAAA;EAAW;AAAA;EAAc,QAAA,EAAU,SAAA;AAAA,IAAW,kBAAA,CAAA,GAAA,CAAA,OAAA;AAAA,iBAI9C,MAAA,CAAA;EAAS;AAAA;EAAc,QAAA,EAAU,SAAA;AAAA,IAAW,kBAAA,CAAA,GAAA,CAAA,OAAA"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/badge.tsx","../src/button.tsx","../src/checkbox.tsx","../src/provider.tsx","../src/label.tsx","../src/kicker.tsx","../src/fold.tsx","../src/stack.tsx","../src/dialog.tsx","../src/confirm-dialog.tsx","../src/input.tsx","../src/switch.tsx","../src/textarea.tsx","../src/glyphs.tsx","../src/type-cards.tsx","../src/select.tsx","../src/workspace.tsx"],"mappings":"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"}
package/dist/index.mjs CHANGED
@@ -1,22 +1,166 @@
1
1
  "use client";
2
- import { jsx, jsxs } from "react/jsx-runtime";
2
+ import { Fragment, jsx, jsxs } from "react/jsx-runtime";
3
+ import { Checkbox as Checkbox$1, Select as Select$1, Switch as Switch$1 } from "radix-ui";
4
+ import { useId, useState } from "react";
5
+ //#region src/badge.tsx
6
+ const BADGE_VARIANTS = [
7
+ "primary",
8
+ "secondary",
9
+ "success",
10
+ "danger",
11
+ "warning",
12
+ "info",
13
+ "neutral-subtle",
14
+ "neutral-strong"
15
+ ];
16
+ /** Pill status. Span by default; pass `as="button"` for a clickable chip. Label case is the caller's. */
17
+ function Badge({ variant = "neutral-subtle", as, className, ...props }) {
18
+ const Tag = as ?? "span";
19
+ return /* @__PURE__ */ jsx(Tag, {
20
+ className: [
21
+ "bl-nav-kit__badge",
22
+ `bl-nav-kit__badge--${variant}`,
23
+ className
24
+ ].filter(Boolean).join(" "),
25
+ ...Tag === "button" ? { type: "button" } : {},
26
+ ...props
27
+ });
28
+ }
29
+ //#endregion
30
+ //#region src/button.tsx
31
+ function Button({ variant = "primary", className, type = "button", children, ...props }) {
32
+ return /* @__PURE__ */ jsx("button", {
33
+ type,
34
+ className: [
35
+ "bl-nav-kit__btn",
36
+ `bl-nav-kit__btn--${variant}`,
37
+ className
38
+ ].filter(Boolean).join(" "),
39
+ ...props,
40
+ children
41
+ });
42
+ }
43
+ //#endregion
44
+ //#region src/checkbox.tsx
45
+ function Checkbox({ className, ...props }) {
46
+ return /* @__PURE__ */ jsx(Checkbox$1.Root, {
47
+ className: ["bl-nav-kit__checkbox", className].filter(Boolean).join(" "),
48
+ ...props,
49
+ children: /* @__PURE__ */ jsx(Checkbox$1.Indicator, {
50
+ className: "bl-nav-kit__checkbox-mark",
51
+ "aria-hidden": true,
52
+ children: /* @__PURE__ */ jsx("svg", {
53
+ viewBox: "0 0 24 24",
54
+ fill: "none",
55
+ "aria-hidden": true,
56
+ children: /* @__PURE__ */ jsx("path", {
57
+ d: "M20 6 9 17l-5-5",
58
+ stroke: "currentColor",
59
+ strokeWidth: "2.25",
60
+ strokeLinecap: "round",
61
+ strokeLinejoin: "round"
62
+ })
63
+ })
64
+ })
65
+ });
66
+ }
67
+ //#endregion
3
68
  //#region src/styles.tsx
4
69
  const CSS = `
5
70
  .bl-nav-kit__types{display:grid;grid-template-columns:1fr 1fr;gap:12px}
6
71
  .bl-nav-kit__types--compact{margin:0 0 10px;gap:6px}
7
- .bl-nav-kit__type{border:1px solid var(--line2,#444854);background:#1b1d22;border-radius:10px;padding:16px;text-align:left;color:inherit;cursor:pointer;font:inherit}
8
- .bl-nav-kit__types--compact .bl-nav-kit__type{display:flex;align-items:center;justify-content:center;gap:8px;border-radius:7px;padding:8px 6px;font-size:12px;background:#15171b}
9
- .bl-nav-kit__type small{display:block;margin-top:.3rem;color:var(--muted,var(--theme-elevation-500));font-weight:400}
10
- .bl-nav-kit__type-icon{display:grid;place-items:center;width:2rem;height:2rem;border-radius:7px;background:#292c33;margin-bottom:.5rem}
11
- .bl-nav-kit__types--compact .bl-nav-kit__type-icon{margin-bottom:0;width:1.25rem;height:1.25rem;background:transparent}
12
- .bl-nav-kit__type:hover{border-color:var(--pink,#e60088)}
13
- .bl-nav-kit__type.is-active,.bl-nav-kit__types--compact .bl-nav-kit__type.is-active{border-color:var(--pink,#e60088);background:#261722}
14
- .bl-nav-kit__modal{position:fixed;inset:0;z-index:30;display:grid;place-items:center;background:var(--theme-overlay)}
15
- .bl-nav-kit__modal-card{width:min(36rem,calc(100vw - 2rem));background:var(--theme-elevation-0);border:1px solid var(--theme-elevation-150);border-radius:12px;padding:1.25rem}
16
- .bl-nav-kit__modal-card h2{margin:0 0 .75rem}
17
- .bl-nav-kit__modal-card p{margin:0}
18
- .bl-nav-kit__modal-actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1rem}
19
- .bl-nav-kit__danger{color:var(--theme-error-500)}
72
+ .bl-nav-kit__type{display:flex;flex-direction:column;align-items:stretch;gap:0;border:1px solid var(--theme-elevation-150,#e4e4e7);background:var(--theme-elevation-50,#f4f4f5);border-radius:10px;padding:16px;text-align:left;color:var(--theme-elevation-800,#27272a);cursor:pointer;font:inherit}
73
+ .bl-nav-kit__type-row{display:flex;align-items:center;gap:12px;min-width:0}
74
+ .bl-nav-kit__types--compact .bl-nav-kit__type{align-items:center;justify-content:center;border-radius:7px;padding:8px 6px;font-size:12px;background:var(--theme-elevation-0,#fff)}
75
+ .bl-nav-kit__type small{display:block;margin-top:.3rem;color:var(--theme-elevation-500,#71717a);font-weight:400}
76
+ .bl-nav-kit__type-icon{display:grid;place-items:center;width:2rem;height:2rem;border-radius:7px;background:var(--theme-elevation-150,#e4e4e7);flex:none}
77
+ .bl-nav-kit__glyph{width:28px;height:28px;display:grid;place-items:center;border-radius:7px;background:var(--theme-elevation-150,#e4e4e7);color:var(--theme-elevation-800,#27272a);flex:none}
78
+ .bl-nav-kit__glyph[data-kind="megaMenu"]{background:color-mix(in srgb,var(--bl-kit-accent,#2563eb) 18%,var(--theme-elevation-0,#fff));color:var(--bl-kit-accent,#2563eb)}
79
+ .bl-nav-kit__type-icon .bl-nav-kit__glyph{width:100%;height:100%;background:transparent;color:inherit}
80
+ .bl-nav-kit__types--compact .bl-nav-kit__type-icon{width:1.25rem;height:1.25rem;background:transparent}
81
+ .bl-nav-kit__type:hover{border-color:var(--bl-kit-accent,var(--brand-primary,var(--pink,#2563eb)))}
82
+ .bl-nav-kit__type.is-active,.bl-nav-kit__types--compact .bl-nav-kit__type.is-active{border-color:var(--bl-kit-accent,var(--brand-primary,var(--pink,#2563eb)));background:color-mix(in srgb,var(--bl-kit-accent,#2563eb) 12%,var(--theme-elevation-0,#fff))}
83
+ .bl-nav-kit__modal{position:fixed;inset:0;z-index:50;display:grid;place-items:center;background:var(--theme-overlay,rgba(0,0,0,.62));font:14px/1.45 Inter,ui-sans-serif,system-ui,sans-serif;color:var(--theme-elevation-800,#27272a)}
84
+ .bl-nav-kit__modal-card{width:min(36rem,calc(100vw - 2rem));background:var(--theme-elevation-0,#fff);border:1px solid var(--theme-elevation-150,#e4e4e7);border-radius:12px;padding:1.25rem 0 0;overflow:hidden;box-shadow:0 12px 32px rgba(0,0,0,.45)}
85
+ .bl-nav-kit__modal-card h2{margin:0 1.25rem .75rem;font-size:18px}
86
+ .bl-nav-kit__modal-card p{margin:0;color:var(--theme-elevation-500,#71717a)}
87
+ .bl-nav-kit__modal-body{min-width:0;padding:0 1.25rem}
88
+ .bl-nav-kit__modal-actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1.25rem;padding:1rem 1.25rem;border-top:1px solid var(--theme-elevation-150,#e4e4e7)}
89
+ .bl-nav-kit__danger{color:var(--theme-error-500,#ff7381)}
90
+ .bl-nav-kit__btn{display:inline-flex;align-items:center;justify-content:center;min-height:38px;padding:8px 14px;border-radius:8px;font:14px/1.45 Inter,ui-sans-serif,system-ui,sans-serif;font-weight:550;cursor:pointer}
91
+ .bl-nav-kit__btn:disabled{opacity:.5;cursor:not-allowed}
92
+ .bl-nav-kit__btn--primary{border:0;background:var(--bl-kit-accent,var(--brand-primary,var(--pink,#2563eb)));color:#fff}
93
+ .bl-nav-kit__btn--primary:hover{filter:brightness(1.08)}
94
+ .bl-nav-kit__btn--secondary{border:0;background:var(--theme-elevation-800,#27272a);color:var(--theme-elevation-0,#fff)}
95
+ .bl-nav-kit__btn--secondary:hover{filter:brightness(1.08)}
96
+ .bl-nav-kit__btn--outline{border:1px solid var(--theme-elevation-250,#d4d4d8);background:transparent;color:var(--theme-elevation-800,#27272a)}
97
+ .bl-nav-kit__btn--outline:hover{border-color:var(--bl-kit-accent,var(--brand-primary,var(--pink,#2563eb)))}
98
+ .bl-nav-kit__btn--ghost{border:1px solid transparent;background:transparent;color:var(--theme-elevation-800,#27272a)}
99
+ .bl-nav-kit__btn--ghost:hover{background:var(--theme-elevation-100,#f4f4f5)}
100
+ .bl-nav-kit__btn--danger{border:1px solid var(--theme-error-500,#ff7381);background:color-mix(in srgb,var(--theme-error-500,#ff7381) 16%,var(--theme-elevation-0,#fff));color:var(--theme-error-500,#ff7381)}
101
+ .bl-nav-kit__btn--danger:hover{background:color-mix(in srgb,var(--theme-error-500,#ff7381) 24%,var(--theme-elevation-0,#fff))}
102
+ .bl-nav-kit__input,.bl-nav-kit__textarea{width:100%;min-height:38px;padding:8px 10px;border:1px solid var(--theme-elevation-150,#e4e4e7);border-radius:8px;background:var(--theme-input-bg,var(--theme-elevation-0,#fff));color:var(--theme-elevation-800,#27272a);font:14px/1.45 Inter,ui-sans-serif,system-ui,sans-serif}
103
+ .bl-nav-kit__textarea{min-height:5.5rem;resize:vertical}
104
+ .bl-nav-kit__input:hover,.bl-nav-kit__textarea:hover,.bl-nav-kit__input:focus,.bl-nav-kit__textarea:focus{border-color:var(--bl-kit-accent,var(--brand-primary,var(--pink,#2563eb)));outline:none}
105
+ .bl-nav-kit__input:disabled,.bl-nav-kit__textarea:disabled{opacity:.5;cursor:not-allowed}
106
+ .bl-nav-kit__input::placeholder,.bl-nav-kit__textarea::placeholder{color:var(--theme-elevation-500,#71717a)}
107
+ .bl-nav-kit__check{display:flex;align-items:center;gap:10px;font:14px/1.45 Inter,ui-sans-serif,system-ui,sans-serif;color:var(--theme-elevation-800,#27272a);cursor:pointer}
108
+ .bl-nav-kit__check:has(.bl-nav-kit__checkbox[data-disabled]){opacity:.5;cursor:not-allowed}
109
+ .bl-nav-kit__checkbox{position:relative;width:18px;height:18px;flex:none;border:1px solid var(--theme-elevation-250,#a1a1aa);border-radius:3px;background:var(--theme-elevation-0,#fff);color:#fff;cursor:pointer;padding:0}
110
+ .bl-nav-kit__checkbox:hover,.bl-nav-kit__checkbox[data-state="checked"]{border-color:var(--bl-kit-accent,var(--brand-primary,var(--pink,#2563eb)))}
111
+ .bl-nav-kit__checkbox[data-state="checked"]{background:var(--bl-kit-accent,var(--brand-primary,var(--pink,#2563eb)))}
112
+ .bl-nav-kit__checkbox[data-disabled]{opacity:.5;cursor:not-allowed}
113
+ .bl-nav-kit__checkbox-mark{position:absolute;inset:0;display:grid;place-items:center}
114
+ .bl-nav-kit__checkbox-mark svg{width:12px;height:12px;display:block}
115
+ .bl-nav-kit__switch{width:40px;height:22px;flex:none;padding:0;border:0;border-radius:999px;background:var(--theme-elevation-250,#d4d4d8);position:relative;cursor:pointer}
116
+ .bl-nav-kit__switch[data-state="checked"]{background:var(--bl-kit-accent,var(--brand-primary,var(--pink,#2563eb)))}
117
+ .bl-nav-kit__switch[data-disabled]{opacity:.5;cursor:not-allowed}
118
+ .bl-nav-kit__switch-thumb{display:block;width:18px;height:18px;border-radius:999px;background:#fff;transform:translateX(2px);transition:transform .12s ease}
119
+ .bl-nav-kit__switch[data-state="checked"] .bl-nav-kit__switch-thumb{transform:translateX(20px)}
120
+ .bl-nav-kit__select-trigger{display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;min-height:38px;padding:8px 10px;border:1px solid var(--theme-elevation-150,#e4e4e7);border-radius:8px;background:var(--theme-input-bg,var(--theme-elevation-0,#fff));color:var(--theme-elevation-800,#27272a);font:14px/1.45 Inter,ui-sans-serif,system-ui,sans-serif;text-align:left;cursor:pointer}
121
+ .bl-nav-kit__select-trigger:hover,.bl-nav-kit__select-trigger[data-state="open"]{border-color:var(--bl-kit-accent,var(--brand-primary,var(--pink,#2563eb)))}
122
+ .bl-nav-kit__select-trigger[data-disabled]{opacity:.5;cursor:not-allowed}
123
+ .bl-nav-kit__select-value{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
124
+ .bl-nav-kit__select-chevron{flex:none;color:var(--theme-elevation-500,#71717a);display:grid;place-items:center}
125
+ .bl-nav-kit__select-content{z-index:10050;min-width:var(--radix-select-trigger-width);background:var(--theme-elevation-0,#fff);border:1px solid var(--theme-elevation-150,#e4e4e7);border-radius:10px;padding:4px;box-shadow:0 12px 32px rgba(0,0,0,.45);color:var(--theme-elevation-800,#27272a);font:14px/1.45 Inter,ui-sans-serif,system-ui,sans-serif}
126
+ .bl-nav-kit__select-viewport{display:grid;gap:2px}
127
+ .bl-nav-kit__select-item{position:relative;display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 10px;border-radius:7px;cursor:pointer;outline:none;font:inherit}
128
+ .bl-nav-kit__select-item[data-highlighted],.bl-nav-kit__select-item[data-state="checked"]{background:color-mix(in srgb,var(--bl-kit-accent,#2563eb) 12%,var(--theme-elevation-0,#fff))}
129
+ .bl-nav-kit__select-item[data-disabled]{opacity:.45;pointer-events:none}
130
+ .bl-nav-kit__select-check{flex:none;color:var(--bl-kit-accent,var(--brand-primary,var(--pink,#2563eb)));display:grid;place-items:center}
131
+ .bl-nav-kit__field{display:flex;flex-direction:column;align-items:stretch;gap:8px;margin:0 0 16px}
132
+ .bl-nav-kit__label{display:block;font:12px/1.2 Inter,ui-sans-serif,system-ui,sans-serif;font-weight:700;color:inherit}
133
+ .bl-nav-kit__badge{display:inline-flex;align-items:center;font-family:Inter,ui-sans-serif,system-ui,sans-serif;font-size:10px;font-weight:700;line-height:1.2;padding:.32rem .55rem;border:0;border-radius:999px;background:transparent;color:inherit}
134
+ button.bl-nav-kit__badge{cursor:pointer;font-family:Inter,ui-sans-serif,system-ui,sans-serif;font-size:10px;font-weight:700;line-height:1.2}
135
+ .bl-nav-kit__badge--primary{background:var(--bl-kit-accent,var(--brand-primary,#2563eb));color:#fff}
136
+ .bl-nav-kit__badge--secondary{background:#71717a;color:#fff}
137
+ .bl-nav-kit__badge--success{background:#16a34a;color:#fff}
138
+ .bl-nav-kit__badge--danger{background:#e5484d;color:#fff}
139
+ .bl-nav-kit__badge--warning{background:#d97706;color:#fff}
140
+ .bl-nav-kit__badge--info{background:#0889b2;color:#fff}
141
+ .bl-nav-kit__badge--neutral-subtle{background:var(--theme-elevation-150,#e4e4e7);color:var(--theme-elevation-800,#27272a)}
142
+ .bl-nav-kit__badge--neutral-strong{background:var(--theme-elevation-800,#27272a);color:var(--theme-elevation-0,#fff)}
143
+ .bl-nav-kit__kicker{margin:0;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted,#989daa);font-weight:800}
144
+ .bl-nav-kit__fold{border:1px solid var(--theme-elevation-150,#e4e4e7);overflow:visible;margin:0;min-width:0;color:var(--theme-elevation-800,#27272a)}
145
+ .bl-nav-kit__fold--light{background:var(--theme-elevation-50,#f4f4f5);border-color:var(--theme-elevation-150,#e4e4e7);border-radius:12px}
146
+ .bl-nav-kit__fold--dark{background:var(--theme-elevation-0,#fff);border-radius:10px}
147
+ .bl-nav-kit__fold-head{padding:12px 14px;display:flex;align-items:center;justify-content:space-between;gap:10px;border-bottom:1px solid var(--theme-elevation-150,#e4e4e7)}
148
+ .bl-nav-kit__fold--light .bl-nav-kit__fold-head{background:var(--theme-elevation-100,#f4f4f5)}
149
+ .bl-nav-kit__fold[data-open="false"] .bl-nav-kit__fold-head{border-bottom:0}
150
+ .bl-nav-kit__fold-toggle{flex:1;display:flex;align-items:center;gap:8px;min-width:0;border:0;background:transparent;padding:0;text-align:left;color:inherit;cursor:pointer;font:inherit}
151
+ .bl-nav-kit__fold-chevron{flex:none;transition:transform .12s ease}
152
+ .bl-nav-kit__fold[data-open="false"] .bl-nav-kit__fold-chevron{transform:rotate(-90deg)}
153
+ .bl-nav-kit__fold-title{font-size:13px;font-weight:700}
154
+ .bl-nav-kit__fold-badge{font-size:11px;color:var(--theme-elevation-800,#27272a);background:var(--theme-elevation-150,#e4e4e7);border-radius:999px;padding:3px 8px}
155
+ .bl-nav-kit__fold-toggle > small{color:var(--theme-elevation-500,#71717a)}
156
+ .bl-nav-kit__fold-body{padding:16px}
157
+ .bl-nav-kit__fold-body[hidden]{display:none}
158
+ .bl-nav-kit__stack{display:flex;flex-direction:column;gap:12px}
159
+ .bl-nav-kit__fold-menu{position:relative}
160
+ .bl-nav-kit__fold-menu > button{border:0;background:transparent;color:inherit;cursor:pointer}
161
+ .bl-nav-kit__fold-menu-pop{position:absolute;right:0;top:34px;z-index:12;min-width:140px;padding:4px;border:1px solid var(--theme-elevation-150,#e4e4e7);border-radius:8px;background:var(--theme-elevation-0,#fff)}
162
+ .bl-nav-kit__fold-menu-pop button{display:block;width:100%;text-align:left;border:0;background:transparent;padding:7px 8px;border-radius:6px;color:var(--theme-elevation-800,#27272a);cursor:pointer}
163
+ .bl-nav-kit__fold-menu-pop button:disabled{opacity:.45;cursor:not-allowed}
20
164
  `;
21
165
  function KitStyles() {
22
166
  return /* @__PURE__ */ jsx("style", {
@@ -26,41 +170,238 @@ function KitStyles() {
26
170
  });
27
171
  }
28
172
  //#endregion
29
- //#region src/confirm-dialog.tsx
30
- function ConfirmDialog({ open, title, children, cancelLabel, confirmLabel, onCancel, onConfirm }) {
173
+ //#region src/provider.tsx
174
+ const ACCENT = /^#[0-9A-Fa-f]{6}$/;
175
+ /** A `#rrggbb` the kit may write onto `--bl-kit-accent`. Anything else is ignored. */
176
+ function kitAccent(value) {
177
+ return value && ACCENT.test(value) ? value : void 0;
178
+ }
179
+ /**
180
+ * Mount once around kit chrome. Primitives read these styles; they do not
181
+ * inject them. Pass `accent` to set `--bl-kit-accent` on `:root` so portaled
182
+ * dialogs and selects follow it. Sites can also set that variable themselves.
183
+ */
184
+ function KitProvider({ children, accent }) {
185
+ const hex = kitAccent(accent);
186
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
187
+ /* @__PURE__ */ jsx(KitStyles, {}),
188
+ hex ? /* @__PURE__ */ jsx("style", {
189
+ href: "bl-admin-ui-accent",
190
+ precedence: "high",
191
+ children: `:root{--bl-kit-accent:${hex};--pink:${hex};--brand-primary:${hex}}`
192
+ }) : null,
193
+ children
194
+ ] });
195
+ }
196
+ //#endregion
197
+ //#region src/label.tsx
198
+ /** Stack a label above its control. The label class owns type; this owns the 8px gap. */
199
+ function Field({ as: Tag = "label", className, ...props }) {
200
+ return /* @__PURE__ */ jsx(Tag, {
201
+ className: ["bl-nav-kit__field", className].filter(Boolean).join(" "),
202
+ ...props
203
+ });
204
+ }
205
+ /** Visible field name. Sit this in `Field` above the control — do not restyle per screen. */
206
+ function Label({ className, ...props }) {
207
+ return /* @__PURE__ */ jsx("span", {
208
+ className: ["bl-nav-kit__label", className].filter(Boolean).join(" "),
209
+ ...props
210
+ });
211
+ }
212
+ //#endregion
213
+ //#region src/kicker.tsx
214
+ /** Uppercase eyebrow. MainHead, the preview note, and later chrome all use this. */
215
+ function Kicker({ className, ...props }) {
216
+ return /* @__PURE__ */ jsx("p", {
217
+ className: ["bl-nav-kit__kicker", className].filter(Boolean).join(" "),
218
+ ...props
219
+ });
220
+ }
221
+ //#endregion
222
+ //#region src/fold.tsx
223
+ function Fold({ title, tone = "light", badge, meta, actions, defaultOpen = true, open: openProp, onOpenChange, className, children }) {
224
+ const controlled = openProp !== void 0;
225
+ const [uncontrolled, setUncontrolled] = useState(defaultOpen);
226
+ const [menu, setMenu] = useState(false);
227
+ const open = controlled ? openProp : uncontrolled;
228
+ function setOpen(next) {
229
+ if (!controlled) setUncontrolled(next);
230
+ onOpenChange?.(next);
231
+ }
232
+ const metaNode = typeof meta === "function" ? meta(open) : meta;
233
+ const badgeNode = badge == null ? null : typeof badge === "string" || typeof badge === "number" ? /* @__PURE__ */ jsx("span", {
234
+ className: "bl-nav-kit__fold-badge",
235
+ children: badge
236
+ }) : badge;
237
+ return /* @__PURE__ */ jsxs("section", {
238
+ role: "group",
239
+ "aria-label": title,
240
+ "data-open": open ? "true" : "false",
241
+ className: [
242
+ "bl-nav-kit__fold",
243
+ `bl-nav-kit__fold--${tone}`,
244
+ className
245
+ ].filter(Boolean).join(" "),
246
+ children: [/* @__PURE__ */ jsxs("div", {
247
+ className: "bl-nav-kit__fold-head",
248
+ children: [/* @__PURE__ */ jsxs("button", {
249
+ type: "button",
250
+ className: "bl-nav-kit__fold-toggle",
251
+ "aria-expanded": open,
252
+ "aria-label": open ? `Collapse ${title}` : `Expand ${title}`,
253
+ onClick: () => setOpen(!open),
254
+ children: [
255
+ /* @__PURE__ */ jsx("svg", {
256
+ className: "bl-nav-kit__fold-chevron",
257
+ viewBox: "0 0 24 24",
258
+ width: "14",
259
+ height: "14",
260
+ fill: "none",
261
+ stroke: "currentColor",
262
+ strokeWidth: "2",
263
+ "aria-hidden": true,
264
+ children: /* @__PURE__ */ jsx("path", { d: "m6 9 6 6 6-6" })
265
+ }),
266
+ /* @__PURE__ */ jsx("strong", {
267
+ className: "bl-nav-kit__fold-title",
268
+ children: title
269
+ }),
270
+ badgeNode,
271
+ metaNode
272
+ ]
273
+ }), actions?.length ? /* @__PURE__ */ jsxs("div", {
274
+ className: "bl-nav-kit__fold-menu",
275
+ children: [/* @__PURE__ */ jsx("button", {
276
+ type: "button",
277
+ "aria-label": `${title} actions`,
278
+ onClick: () => setMenu((next) => !next),
279
+ children: "⋯"
280
+ }), menu ? /* @__PURE__ */ jsx("div", {
281
+ className: "bl-nav-kit__fold-menu-pop",
282
+ children: actions.map((action) => /* @__PURE__ */ jsx("button", {
283
+ type: "button",
284
+ disabled: action.disabled,
285
+ className: action.danger ? "bl-nav-kit__danger" : void 0,
286
+ onClick: () => {
287
+ action.onClick();
288
+ setMenu(false);
289
+ },
290
+ children: action.label
291
+ }, action.label))
292
+ }) : null]
293
+ }) : null]
294
+ }), /* @__PURE__ */ jsx("div", {
295
+ className: "bl-nav-kit__fold-body",
296
+ hidden: !open,
297
+ children
298
+ })]
299
+ });
300
+ }
301
+ //#endregion
302
+ //#region src/stack.tsx
303
+ /** Vertical list with a locked gap — sections in a column, links in a section, and their add buttons. */
304
+ function Stack({ className, ...props }) {
305
+ return /* @__PURE__ */ jsx("div", {
306
+ className: ["bl-nav-kit__stack", className].filter(Boolean).join(" "),
307
+ ...props
308
+ });
309
+ }
310
+ //#endregion
311
+ //#region src/dialog.tsx
312
+ function Dialog({ open, title, children, cancelLabel = "Cancel", onCancel, confirmLabel, onConfirm, confirmVariant = "primary", confirmDisabled = false }) {
313
+ const titleId = useId();
31
314
  if (!open) return null;
32
- return /* @__PURE__ */ jsxs("div", {
315
+ return /* @__PURE__ */ jsx("div", {
33
316
  className: "bl-nav-kit__modal",
34
317
  role: "dialog",
35
- "aria-labelledby": "bl-admin-confirm-title",
36
- children: [/* @__PURE__ */ jsx(KitStyles, {}), /* @__PURE__ */ jsxs("div", {
318
+ "aria-modal": "true",
319
+ "aria-labelledby": titleId,
320
+ children: /* @__PURE__ */ jsxs("div", {
37
321
  className: "bl-nav-kit__modal-card",
38
322
  children: [
39
323
  /* @__PURE__ */ jsx("h2", {
40
- id: "bl-admin-confirm-title",
324
+ id: titleId,
41
325
  children: title
42
326
  }),
43
- /* @__PURE__ */ jsx("p", { children }),
327
+ /* @__PURE__ */ jsx("div", {
328
+ className: "bl-nav-kit__modal-body",
329
+ children
330
+ }),
44
331
  /* @__PURE__ */ jsxs("div", {
45
332
  className: "bl-nav-kit__modal-actions",
46
- children: [/* @__PURE__ */ jsx("button", {
47
- type: "button",
333
+ children: [/* @__PURE__ */ jsx(Button, {
334
+ variant: "outline",
48
335
  onClick: onCancel,
49
336
  children: cancelLabel
50
- }), /* @__PURE__ */ jsx("button", {
51
- type: "button",
52
- className: "bl-nav-kit__danger",
337
+ }), confirmLabel && onConfirm ? /* @__PURE__ */ jsx(Button, {
338
+ variant: confirmVariant,
53
339
  onClick: onConfirm,
340
+ disabled: confirmDisabled,
54
341
  children: confirmLabel
55
- })]
342
+ }) : null]
56
343
  })
57
344
  ]
58
- })]
345
+ })
346
+ });
347
+ }
348
+ //#endregion
349
+ //#region src/confirm-dialog.tsx
350
+ function ConfirmDialog({ open, title, children, cancelLabel, confirmLabel, onCancel, onConfirm, confirmVariant = "primary" }) {
351
+ return /* @__PURE__ */ jsx(Dialog, {
352
+ open,
353
+ title,
354
+ cancelLabel,
355
+ confirmLabel,
356
+ confirmVariant,
357
+ onCancel,
358
+ onConfirm,
359
+ children: /* @__PURE__ */ jsx("p", { children })
360
+ });
361
+ }
362
+ //#endregion
363
+ //#region src/input.tsx
364
+ function Input({ className, ...props }) {
365
+ return /* @__PURE__ */ jsx("input", {
366
+ className: ["bl-nav-kit__input", className].filter(Boolean).join(" "),
367
+ ...props
368
+ });
369
+ }
370
+ //#endregion
371
+ //#region src/switch.tsx
372
+ function Switch({ className, ...props }) {
373
+ return /* @__PURE__ */ jsx(Switch$1.Root, {
374
+ className: ["bl-nav-kit__switch", className].filter(Boolean).join(" "),
375
+ ...props,
376
+ children: /* @__PURE__ */ jsx(Switch$1.Thumb, { className: "bl-nav-kit__switch-thumb" })
377
+ });
378
+ }
379
+ //#endregion
380
+ //#region src/textarea.tsx
381
+ function Textarea({ className, ...props }) {
382
+ return /* @__PURE__ */ jsx("textarea", {
383
+ className: ["bl-nav-kit__textarea", className].filter(Boolean).join(" "),
384
+ ...props
59
385
  });
60
386
  }
61
387
  //#endregion
62
388
  //#region src/glyphs.tsx
389
+ /** Rail / type-card mark. The kit owns the badge; pass `kind` only. */
390
+ function KindGlyph({ kind }) {
391
+ return /* @__PURE__ */ jsx("span", {
392
+ className: "bl-nav-kit__glyph",
393
+ "data-kind": kind,
394
+ "aria-hidden": true,
395
+ children: kind === "megaMenu" ? /* @__PURE__ */ jsx(MegaMark, {}) : /* @__PURE__ */ jsx(LinkMark, {})
396
+ });
397
+ }
63
398
  function LinkGlyph() {
399
+ return /* @__PURE__ */ jsx(KindGlyph, { kind: "navLink" });
400
+ }
401
+ function MegaGlyph() {
402
+ return /* @__PURE__ */ jsx(KindGlyph, { kind: "megaMenu" });
403
+ }
404
+ function LinkMark() {
64
405
  return /* @__PURE__ */ jsxs("svg", {
65
406
  xmlns: "http://www.w3.org/2000/svg",
66
407
  width: "16",
@@ -74,7 +415,7 @@ function LinkGlyph() {
74
415
  children: [/* @__PURE__ */ jsx("path", { d: "M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71" }), /* @__PURE__ */ jsx("path", { d: "M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71" })]
75
416
  });
76
417
  }
77
- function MegaGlyph() {
418
+ function MegaMark() {
78
419
  return /* @__PURE__ */ jsxs("svg", {
79
420
  xmlns: "http://www.w3.org/2000/svg",
80
421
  width: "16",
@@ -101,9 +442,9 @@ function MegaGlyph() {
101
442
  //#endregion
102
443
  //#region src/type-cards.tsx
103
444
  function TypeCards({ compact, children }) {
104
- return /* @__PURE__ */ jsxs("div", {
445
+ return /* @__PURE__ */ jsx("div", {
105
446
  className: compact ? "bl-nav-kit__types bl-nav-kit__types--compact" : "bl-nav-kit__types",
106
- children: [/* @__PURE__ */ jsx(KitStyles, {}), children]
447
+ children
107
448
  });
108
449
  }
109
450
  function TypeCard({ icon, label, description, onClick, active, disabled }) {
@@ -112,15 +453,83 @@ function TypeCard({ icon, label, description, onClick, active, disabled }) {
112
453
  className: active ? "bl-nav-kit__type is-active" : "bl-nav-kit__type",
113
454
  disabled,
114
455
  onClick,
115
- children: [
116
- icon ? /* @__PURE__ */ jsx("span", {
456
+ children: [/* @__PURE__ */ jsxs("span", {
457
+ className: "bl-nav-kit__type-row",
458
+ children: [icon ? /* @__PURE__ */ jsx("span", {
117
459
  className: "bl-nav-kit__type-icon",
118
460
  "aria-hidden": true,
119
461
  children: icon
120
- }) : null,
121
- label,
122
- description ? /* @__PURE__ */ jsx("small", { children: description }) : null
123
- ]
462
+ }) : null, label]
463
+ }), description ? /* @__PURE__ */ jsx("small", { children: description }) : null]
464
+ });
465
+ }
466
+ //#endregion
467
+ //#region src/select.tsx
468
+ const Select = Select$1.Root;
469
+ const SelectValue = Select$1.Value;
470
+ function SelectTrigger({ children, ...props }) {
471
+ return /* @__PURE__ */ jsxs(Select$1.Trigger, {
472
+ className: "bl-nav-kit__select-trigger",
473
+ ...props,
474
+ children: [/* @__PURE__ */ jsx("span", {
475
+ className: "bl-nav-kit__select-value",
476
+ children
477
+ }), /* @__PURE__ */ jsx("span", {
478
+ className: "bl-nav-kit__select-chevron",
479
+ "aria-hidden": true,
480
+ children: /* @__PURE__ */ jsx(ChevronGlyph, {})
481
+ })]
482
+ });
483
+ }
484
+ function SelectContent({ children, ...props }) {
485
+ return /* @__PURE__ */ jsx(Select$1.Portal, { children: /* @__PURE__ */ jsx(Select$1.Content, {
486
+ className: "bl-nav-kit__select-content",
487
+ position: "popper",
488
+ sideOffset: 6,
489
+ ...props,
490
+ children: /* @__PURE__ */ jsx(Select$1.Viewport, {
491
+ className: "bl-nav-kit__select-viewport",
492
+ children
493
+ })
494
+ }) });
495
+ }
496
+ function SelectItem({ children, ...props }) {
497
+ return /* @__PURE__ */ jsxs(Select$1.Item, {
498
+ className: "bl-nav-kit__select-item",
499
+ ...props,
500
+ children: [/* @__PURE__ */ jsx(Select$1.ItemText, { children }), /* @__PURE__ */ jsx(Select$1.ItemIndicator, {
501
+ className: "bl-nav-kit__select-check",
502
+ "aria-hidden": true,
503
+ children: /* @__PURE__ */ jsx(CheckGlyph, {})
504
+ })]
505
+ });
506
+ }
507
+ function ChevronGlyph() {
508
+ return /* @__PURE__ */ jsx("svg", {
509
+ xmlns: "http://www.w3.org/2000/svg",
510
+ width: "16",
511
+ height: "16",
512
+ viewBox: "0 0 24 24",
513
+ fill: "none",
514
+ stroke: "currentColor",
515
+ strokeWidth: "2",
516
+ strokeLinecap: "round",
517
+ strokeLinejoin: "round",
518
+ children: /* @__PURE__ */ jsx("path", { d: "m6 9 6 6 6-6" })
519
+ });
520
+ }
521
+ function CheckGlyph() {
522
+ return /* @__PURE__ */ jsx("svg", {
523
+ xmlns: "http://www.w3.org/2000/svg",
524
+ width: "14",
525
+ height: "14",
526
+ viewBox: "0 0 24 24",
527
+ fill: "none",
528
+ stroke: "currentColor",
529
+ strokeWidth: "2",
530
+ strokeLinecap: "round",
531
+ strokeLinejoin: "round",
532
+ children: /* @__PURE__ */ jsx("path", { d: "M20 6 9 17l-5-5" })
124
533
  });
125
534
  }
126
535
  //#endregion
@@ -133,15 +542,13 @@ function MainHead({ kicker, title, description, children }) {
133
542
  return /* @__PURE__ */ jsxs("header", {
134
543
  className: "bl-workspace__main-head",
135
544
  children: [/* @__PURE__ */ jsxs("div", { children: [
136
- kicker ? /* @__PURE__ */ jsx("p", {
137
- className: "bl-workspace__kicker",
138
- children: kicker
139
- }) : null,
545
+ kicker ? /* @__PURE__ */ jsx(Kicker, { children: kicker }) : null,
140
546
  /* @__PURE__ */ jsx("h1", { children: title }),
141
547
  description ? /* @__PURE__ */ jsx("p", { children: description }) : null
142
548
  ] }), children]
143
549
  });
144
550
  }
551
+ /** Aside chrome only. The adapter supplies children — nothing here is a link list. */
145
552
  function ItemRail({ children }) {
146
553
  return /* @__PURE__ */ jsx("aside", {
147
554
  className: "bl-workspace__rail",
@@ -161,6 +568,6 @@ function Canvas({ children }) {
161
568
  });
162
569
  }
163
570
  //#endregion
164
- export { Canvas, ConfirmDialog, ItemRail, LinkGlyph, MainHead, MegaGlyph, RailSlot, TypeCard, TypeCards };
571
+ export { BADGE_VARIANTS, Badge, Button, Canvas, Checkbox, ConfirmDialog, Dialog, Field, Fold, Input, ItemRail, Kicker, KindGlyph, KitProvider, Label, LinkGlyph, MainHead, MegaGlyph, RailSlot, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Stack, Switch, Textarea, TypeCard, TypeCards, kitAccent };
165
572
 
166
573
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/styles.tsx","../src/confirm-dialog.tsx","../src/glyphs.tsx","../src/type-cards.tsx","../src/workspace.tsx"],"sourcesContent":["const CSS = `\n.bl-nav-kit__types{display:grid;grid-template-columns:1fr 1fr;gap:12px}\n.bl-nav-kit__types--compact{margin:0 0 10px;gap:6px}\n.bl-nav-kit__type{border:1px solid var(--line2,#444854);background:#1b1d22;border-radius:10px;padding:16px;text-align:left;color:inherit;cursor:pointer;font:inherit}\n.bl-nav-kit__types--compact .bl-nav-kit__type{display:flex;align-items:center;justify-content:center;gap:8px;border-radius:7px;padding:8px 6px;font-size:12px;background:#15171b}\n.bl-nav-kit__type small{display:block;margin-top:.3rem;color:var(--muted,var(--theme-elevation-500));font-weight:400}\n.bl-nav-kit__type-icon{display:grid;place-items:center;width:2rem;height:2rem;border-radius:7px;background:#292c33;margin-bottom:.5rem}\n.bl-nav-kit__types--compact .bl-nav-kit__type-icon{margin-bottom:0;width:1.25rem;height:1.25rem;background:transparent}\n.bl-nav-kit__type:hover{border-color:var(--pink,#e60088)}\n.bl-nav-kit__type.is-active,.bl-nav-kit__types--compact .bl-nav-kit__type.is-active{border-color:var(--pink,#e60088);background:#261722}\n.bl-nav-kit__modal{position:fixed;inset:0;z-index:30;display:grid;place-items:center;background:var(--theme-overlay)}\n.bl-nav-kit__modal-card{width:min(36rem,calc(100vw - 2rem));background:var(--theme-elevation-0);border:1px solid var(--theme-elevation-150);border-radius:12px;padding:1.25rem}\n.bl-nav-kit__modal-card h2{margin:0 0 .75rem}\n.bl-nav-kit__modal-card p{margin:0}\n.bl-nav-kit__modal-actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1rem}\n.bl-nav-kit__danger{color:var(--theme-error-500)}\n`;\n\nexport function KitStyles() {\n return (\n <style href=\"bl-admin-ui\" precedence=\"default\">\n {CSS}\n </style>\n );\n}\n","import type { ReactNode } from \"react\";\n\nimport { KitStyles } from \"./styles\";\n\nexport function ConfirmDialog({\n open,\n title,\n children,\n cancelLabel,\n confirmLabel,\n onCancel,\n onConfirm,\n}: {\n open: boolean;\n title: string;\n children: ReactNode;\n cancelLabel: string;\n confirmLabel: string;\n onCancel: () => void;\n onConfirm: () => void;\n}) {\n if (!open) return null;\n return (\n <div className=\"bl-nav-kit__modal\" role=\"dialog\" aria-labelledby=\"bl-admin-confirm-title\">\n <KitStyles />\n <div className=\"bl-nav-kit__modal-card\">\n <h2 id=\"bl-admin-confirm-title\">{title}</h2>\n <p>{children}</p>\n <div className=\"bl-nav-kit__modal-actions\">\n <button type=\"button\" onClick={onCancel}>\n {cancelLabel}\n </button>\n <button type=\"button\" className=\"bl-nav-kit__danger\" onClick={onConfirm}>\n {confirmLabel}\n </button>\n </div>\n </div>\n </div>\n );\n}\n","export function LinkGlyph() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" />\n <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" />\n </svg>\n );\n}\n\nexport function MegaGlyph() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M9 3v18\" />\n <path d=\"M15 3v18\" />\n </svg>\n );\n}\n","import type { ReactNode } from \"react\";\n\nimport { KitStyles } from \"./styles\";\n\nexport function TypeCards({\n compact,\n children,\n}: {\n compact?: boolean;\n children: ReactNode;\n}) {\n return (\n <div className={compact ? \"bl-nav-kit__types bl-nav-kit__types--compact\" : \"bl-nav-kit__types\"}>\n <KitStyles />\n {children}\n </div>\n );\n}\n\nexport function TypeCard({\n icon,\n label,\n description,\n onClick,\n active,\n disabled,\n}: {\n icon?: ReactNode;\n label: string;\n description?: string;\n onClick: () => void;\n active?: boolean;\n disabled?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n className={active ? \"bl-nav-kit__type is-active\" : \"bl-nav-kit__type\"}\n disabled={disabled}\n onClick={onClick}\n >\n {icon ? (\n <span className=\"bl-nav-kit__type-icon\" aria-hidden>\n {icon}\n </span>\n ) : null}\n {label}\n {description ? <small>{description}</small> : null}\n </button>\n );\n}\n","import type { ReactNode } from \"react\";\n\n/**\n * Presentational workspace chrome. Surfaces come from the adapter CSS\n * (Payload theme tokens). Field adapters own form writes.\n */\nexport function MainHead({\n kicker,\n title,\n description,\n children,\n}: {\n kicker?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n children?: ReactNode;\n}) {\n return (\n <header className=\"bl-workspace__main-head\">\n <div>\n {kicker ? <p className=\"bl-workspace__kicker\">{kicker}</p> : null}\n <h1>{title}</h1>\n {description ? <p>{description}</p> : null}\n </div>\n {children}\n </header>\n );\n}\n\nexport function ItemRail({ children }: { children: ReactNode }) {\n return <aside className=\"bl-workspace__rail\">{children}</aside>;\n}\n\nexport function RailSlot({ children }: { children: ReactNode }) {\n return <div className=\"bl-workspace__rail-slot\">{children}</div>;\n}\n\nexport function Canvas({ children }: { children: ReactNode }) {\n return <div className=\"bl-workspace__canvas\">{children}</div>;\n}\n"],"mappings":";;;AAAA,MAAM,MAAM;;;;;;;;;;;;;;;;;AAkBZ,SAAgB,YAAY;AAC1B,QACE,oBAAC,SAAD;EAAO,MAAK;EAAc,YAAW;YAClC;EACK,CAAA;;;;AClBZ,SAAgB,cAAc,EAC5B,MACA,OACA,UACA,aACA,cACA,UACA,aASC;AACD,KAAI,CAAC,KAAM,QAAO;AAClB,QACE,qBAAC,OAAD;EAAK,WAAU;EAAoB,MAAK;EAAS,mBAAgB;YAAjE,CACE,oBAAC,WAAD,EAAa,CAAA,EACb,qBAAC,OAAD;GAAK,WAAU;aAAf;IACE,oBAAC,MAAD;KAAI,IAAG;eAA0B;KAAW,CAAA;IAC5C,oBAAC,KAAD,EAAI,UAAa,CAAA;IACjB,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,oBAAC,UAAD;MAAQ,MAAK;MAAS,SAAS;gBAC5B;MACM,CAAA,EACT,oBAAC,UAAD;MAAQ,MAAK;MAAS,WAAU;MAAqB,SAAS;gBAC3D;MACM,CAAA,CACL;;IACF;KACF;;;;;ACrCV,SAAgB,YAAY;AAC1B,QACE,qBAAC,OAAD;EAAK,OAAM;EAA6B,OAAM;EAAK,QAAO;EAAK,SAAQ;EAAY,MAAK;EAAO,QAAO;EAAe,aAAY;EAAI,eAAc;EAAQ,gBAAe;YAA1K,CACE,oBAAC,QAAD,EAAM,GAAE,+DAAgE,CAAA,EACxE,oBAAC,QAAD,EAAM,GAAE,gEAAiE,CAAA,CACrE;;;AAIV,SAAgB,YAAY;AAC1B,QACE,qBAAC,OAAD;EAAK,OAAM;EAA6B,OAAM;EAAK,QAAO;EAAK,SAAQ;EAAY,MAAK;EAAO,QAAO;EAAe,aAAY;EAAI,eAAc;EAAQ,gBAAe;YAA1K;GACE,oBAAC,QAAD;IAAM,OAAM;IAAK,QAAO;IAAK,GAAE;IAAI,GAAE;IAAI,IAAG;IAAM,CAAA;GAClD,oBAAC,QAAD,EAAM,GAAE,WAAY,CAAA;GACpB,oBAAC,QAAD,EAAM,GAAE,YAAa,CAAA;GACjB;;;;;ACXV,SAAgB,UAAU,EACxB,SACA,YAIC;AACD,QACE,qBAAC,OAAD;EAAK,WAAW,UAAU,iDAAiD;YAA3E,CACE,oBAAC,WAAD,EAAa,CAAA,EACZ,SACG;;;AAIV,SAAgB,SAAS,EACvB,MACA,OACA,aACA,SACA,QACA,YAQC;AACD,QACE,qBAAC,UAAD;EACE,MAAK;EACL,WAAW,SAAS,+BAA+B;EACzC;EACD;YAJX;GAMG,OACC,oBAAC,QAAD;IAAM,WAAU;IAAwB,eAAA;cACrC;IACI,CAAA,GACL;GACH;GACA,cAAc,oBAAC,SAAD,EAAA,UAAQ,aAAoB,CAAA,GAAG;GACvC;;;;;;;;;AC1Cb,SAAgB,SAAS,EACvB,QACA,OACA,aACA,YAMC;AACD,QACE,qBAAC,UAAD;EAAQ,WAAU;YAAlB,CACE,qBAAC,OAAD,EAAA,UAAA;GACG,SAAS,oBAAC,KAAD;IAAG,WAAU;cAAwB;IAAW,CAAA,GAAG;GAC7D,oBAAC,MAAD,EAAA,UAAK,OAAW,CAAA;GACf,cAAc,oBAAC,KAAD,EAAA,UAAI,aAAgB,CAAA,GAAG;GAClC,EAAA,CAAA,EACL,SACM;;;AAIb,SAAgB,SAAS,EAAE,YAAqC;AAC9D,QAAO,oBAAC,SAAD;EAAO,WAAU;EAAsB;EAAiB,CAAA;;AAGjE,SAAgB,SAAS,EAAE,YAAqC;AAC9D,QAAO,oBAAC,OAAD;EAAK,WAAU;EAA2B;EAAe,CAAA;;AAGlE,SAAgB,OAAO,EAAE,YAAqC;AAC5D,QAAO,oBAAC,OAAD;EAAK,WAAU;EAAwB;EAAe,CAAA"}
1
+ {"version":3,"file":"index.mjs","names":["CheckboxPrimitive","SwitchPrimitive","SelectPrimitive"],"sources":["../src/badge.tsx","../src/button.tsx","../src/checkbox.tsx","../src/styles.tsx","../src/provider.tsx","../src/label.tsx","../src/kicker.tsx","../src/fold.tsx","../src/stack.tsx","../src/dialog.tsx","../src/confirm-dialog.tsx","../src/input.tsx","../src/switch.tsx","../src/textarea.tsx","../src/glyphs.tsx","../src/type-cards.tsx","../src/select.tsx","../src/workspace.tsx"],"sourcesContent":["import type { ButtonHTMLAttributes, HTMLAttributes } from \"react\";\n\nexport const BADGE_VARIANTS = [\n \"primary\",\n \"secondary\",\n \"success\",\n \"danger\",\n \"warning\",\n \"info\",\n \"neutral-subtle\",\n \"neutral-strong\",\n] as const;\n\nexport type BadgeVariant = (typeof BADGE_VARIANTS)[number];\n\ntype BadgeCommon = {\n variant?: BadgeVariant;\n className?: string;\n};\n\nexport type BadgeProps =\n | (BadgeCommon & { as?: \"span\" } & HTMLAttributes<HTMLSpanElement>)\n | (BadgeCommon & { as: \"button\" } & ButtonHTMLAttributes<HTMLButtonElement>);\n\n/** Pill status. Span by default; pass `as=\"button\"` for a clickable chip. Label case is the caller's. */\nexport function Badge({ variant = \"neutral-subtle\", as, className, ...props }: BadgeProps) {\n const Tag = as ?? \"span\";\n return (\n <Tag\n className={[\"bl-nav-kit__badge\", `bl-nav-kit__badge--${variant}`, className].filter(Boolean).join(\" \")}\n {...(Tag === \"button\" ? { type: \"button\" } : {})}\n {...props}\n />\n );\n}\n","import type { ButtonHTMLAttributes } from \"react\";\n\nexport type ButtonVariant = \"primary\" | \"secondary\" | \"outline\" | \"ghost\" | \"danger\";\n\nexport function Button({\n variant = \"primary\",\n className,\n type = \"button\",\n children,\n ...props\n}: ButtonHTMLAttributes<HTMLButtonElement> & { variant?: ButtonVariant }) {\n return (\n <button\n type={type}\n className={[\"bl-nav-kit__btn\", `bl-nav-kit__btn--${variant}`, className].filter(Boolean).join(\" \")}\n {...props}\n >\n {children}\n </button>\n );\n}\n","import type { ComponentPropsWithoutRef } from \"react\";\nimport { Checkbox as CheckboxPrimitive } from \"radix-ui\";\n\nexport function Checkbox({\n className,\n ...props\n}: ComponentPropsWithoutRef<typeof CheckboxPrimitive.Root>) {\n return (\n <CheckboxPrimitive.Root className={[\"bl-nav-kit__checkbox\", className].filter(Boolean).join(\" \")} {...props}>\n <CheckboxPrimitive.Indicator className=\"bl-nav-kit__checkbox-mark\" aria-hidden>\n <svg viewBox=\"0 0 24 24\" fill=\"none\" aria-hidden>\n <path\n d=\"M20 6 9 17l-5-5\"\n stroke=\"currentColor\"\n strokeWidth=\"2.25\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n </CheckboxPrimitive.Indicator>\n </CheckboxPrimitive.Root>\n );\n}\n","const CSS = `\n.bl-nav-kit__types{display:grid;grid-template-columns:1fr 1fr;gap:12px}\n.bl-nav-kit__types--compact{margin:0 0 10px;gap:6px}\n.bl-nav-kit__type{display:flex;flex-direction:column;align-items:stretch;gap:0;border:1px solid var(--theme-elevation-150,#e4e4e7);background:var(--theme-elevation-50,#f4f4f5);border-radius:10px;padding:16px;text-align:left;color:var(--theme-elevation-800,#27272a);cursor:pointer;font:inherit}\n.bl-nav-kit__type-row{display:flex;align-items:center;gap:12px;min-width:0}\n.bl-nav-kit__types--compact .bl-nav-kit__type{align-items:center;justify-content:center;border-radius:7px;padding:8px 6px;font-size:12px;background:var(--theme-elevation-0,#fff)}\n.bl-nav-kit__type small{display:block;margin-top:.3rem;color:var(--theme-elevation-500,#71717a);font-weight:400}\n.bl-nav-kit__type-icon{display:grid;place-items:center;width:2rem;height:2rem;border-radius:7px;background:var(--theme-elevation-150,#e4e4e7);flex:none}\n.bl-nav-kit__glyph{width:28px;height:28px;display:grid;place-items:center;border-radius:7px;background:var(--theme-elevation-150,#e4e4e7);color:var(--theme-elevation-800,#27272a);flex:none}\n.bl-nav-kit__glyph[data-kind=\"megaMenu\"]{background:color-mix(in srgb,var(--bl-kit-accent,#2563eb) 18%,var(--theme-elevation-0,#fff));color:var(--bl-kit-accent,#2563eb)}\n.bl-nav-kit__type-icon .bl-nav-kit__glyph{width:100%;height:100%;background:transparent;color:inherit}\n.bl-nav-kit__types--compact .bl-nav-kit__type-icon{width:1.25rem;height:1.25rem;background:transparent}\n.bl-nav-kit__type:hover{border-color:var(--bl-kit-accent,var(--brand-primary,var(--pink,#2563eb)))}\n.bl-nav-kit__type.is-active,.bl-nav-kit__types--compact .bl-nav-kit__type.is-active{border-color:var(--bl-kit-accent,var(--brand-primary,var(--pink,#2563eb)));background:color-mix(in srgb,var(--bl-kit-accent,#2563eb) 12%,var(--theme-elevation-0,#fff))}\n.bl-nav-kit__modal{position:fixed;inset:0;z-index:50;display:grid;place-items:center;background:var(--theme-overlay,rgba(0,0,0,.62));font:14px/1.45 Inter,ui-sans-serif,system-ui,sans-serif;color:var(--theme-elevation-800,#27272a)}\n.bl-nav-kit__modal-card{width:min(36rem,calc(100vw - 2rem));background:var(--theme-elevation-0,#fff);border:1px solid var(--theme-elevation-150,#e4e4e7);border-radius:12px;padding:1.25rem 0 0;overflow:hidden;box-shadow:0 12px 32px rgba(0,0,0,.45)}\n.bl-nav-kit__modal-card h2{margin:0 1.25rem .75rem;font-size:18px}\n.bl-nav-kit__modal-card p{margin:0;color:var(--theme-elevation-500,#71717a)}\n.bl-nav-kit__modal-body{min-width:0;padding:0 1.25rem}\n.bl-nav-kit__modal-actions{display:flex;justify-content:flex-end;gap:.5rem;margin-top:1.25rem;padding:1rem 1.25rem;border-top:1px solid var(--theme-elevation-150,#e4e4e7)}\n.bl-nav-kit__danger{color:var(--theme-error-500,#ff7381)}\n.bl-nav-kit__btn{display:inline-flex;align-items:center;justify-content:center;min-height:38px;padding:8px 14px;border-radius:8px;font:14px/1.45 Inter,ui-sans-serif,system-ui,sans-serif;font-weight:550;cursor:pointer}\n.bl-nav-kit__btn:disabled{opacity:.5;cursor:not-allowed}\n.bl-nav-kit__btn--primary{border:0;background:var(--bl-kit-accent,var(--brand-primary,var(--pink,#2563eb)));color:#fff}\n.bl-nav-kit__btn--primary:hover{filter:brightness(1.08)}\n.bl-nav-kit__btn--secondary{border:0;background:var(--theme-elevation-800,#27272a);color:var(--theme-elevation-0,#fff)}\n.bl-nav-kit__btn--secondary:hover{filter:brightness(1.08)}\n.bl-nav-kit__btn--outline{border:1px solid var(--theme-elevation-250,#d4d4d8);background:transparent;color:var(--theme-elevation-800,#27272a)}\n.bl-nav-kit__btn--outline:hover{border-color:var(--bl-kit-accent,var(--brand-primary,var(--pink,#2563eb)))}\n.bl-nav-kit__btn--ghost{border:1px solid transparent;background:transparent;color:var(--theme-elevation-800,#27272a)}\n.bl-nav-kit__btn--ghost:hover{background:var(--theme-elevation-100,#f4f4f5)}\n.bl-nav-kit__btn--danger{border:1px solid var(--theme-error-500,#ff7381);background:color-mix(in srgb,var(--theme-error-500,#ff7381) 16%,var(--theme-elevation-0,#fff));color:var(--theme-error-500,#ff7381)}\n.bl-nav-kit__btn--danger:hover{background:color-mix(in srgb,var(--theme-error-500,#ff7381) 24%,var(--theme-elevation-0,#fff))}\n.bl-nav-kit__input,.bl-nav-kit__textarea{width:100%;min-height:38px;padding:8px 10px;border:1px solid var(--theme-elevation-150,#e4e4e7);border-radius:8px;background:var(--theme-input-bg,var(--theme-elevation-0,#fff));color:var(--theme-elevation-800,#27272a);font:14px/1.45 Inter,ui-sans-serif,system-ui,sans-serif}\n.bl-nav-kit__textarea{min-height:5.5rem;resize:vertical}\n.bl-nav-kit__input:hover,.bl-nav-kit__textarea:hover,.bl-nav-kit__input:focus,.bl-nav-kit__textarea:focus{border-color:var(--bl-kit-accent,var(--brand-primary,var(--pink,#2563eb)));outline:none}\n.bl-nav-kit__input:disabled,.bl-nav-kit__textarea:disabled{opacity:.5;cursor:not-allowed}\n.bl-nav-kit__input::placeholder,.bl-nav-kit__textarea::placeholder{color:var(--theme-elevation-500,#71717a)}\n.bl-nav-kit__check{display:flex;align-items:center;gap:10px;font:14px/1.45 Inter,ui-sans-serif,system-ui,sans-serif;color:var(--theme-elevation-800,#27272a);cursor:pointer}\n.bl-nav-kit__check:has(.bl-nav-kit__checkbox[data-disabled]){opacity:.5;cursor:not-allowed}\n.bl-nav-kit__checkbox{position:relative;width:18px;height:18px;flex:none;border:1px solid var(--theme-elevation-250,#a1a1aa);border-radius:3px;background:var(--theme-elevation-0,#fff);color:#fff;cursor:pointer;padding:0}\n.bl-nav-kit__checkbox:hover,.bl-nav-kit__checkbox[data-state=\"checked\"]{border-color:var(--bl-kit-accent,var(--brand-primary,var(--pink,#2563eb)))}\n.bl-nav-kit__checkbox[data-state=\"checked\"]{background:var(--bl-kit-accent,var(--brand-primary,var(--pink,#2563eb)))}\n.bl-nav-kit__checkbox[data-disabled]{opacity:.5;cursor:not-allowed}\n.bl-nav-kit__checkbox-mark{position:absolute;inset:0;display:grid;place-items:center}\n.bl-nav-kit__checkbox-mark svg{width:12px;height:12px;display:block}\n.bl-nav-kit__switch{width:40px;height:22px;flex:none;padding:0;border:0;border-radius:999px;background:var(--theme-elevation-250,#d4d4d8);position:relative;cursor:pointer}\n.bl-nav-kit__switch[data-state=\"checked\"]{background:var(--bl-kit-accent,var(--brand-primary,var(--pink,#2563eb)))}\n.bl-nav-kit__switch[data-disabled]{opacity:.5;cursor:not-allowed}\n.bl-nav-kit__switch-thumb{display:block;width:18px;height:18px;border-radius:999px;background:#fff;transform:translateX(2px);transition:transform .12s ease}\n.bl-nav-kit__switch[data-state=\"checked\"] .bl-nav-kit__switch-thumb{transform:translateX(20px)}\n.bl-nav-kit__select-trigger{display:flex;align-items:center;justify-content:space-between;gap:8px;width:100%;min-height:38px;padding:8px 10px;border:1px solid var(--theme-elevation-150,#e4e4e7);border-radius:8px;background:var(--theme-input-bg,var(--theme-elevation-0,#fff));color:var(--theme-elevation-800,#27272a);font:14px/1.45 Inter,ui-sans-serif,system-ui,sans-serif;text-align:left;cursor:pointer}\n.bl-nav-kit__select-trigger:hover,.bl-nav-kit__select-trigger[data-state=\"open\"]{border-color:var(--bl-kit-accent,var(--brand-primary,var(--pink,#2563eb)))}\n.bl-nav-kit__select-trigger[data-disabled]{opacity:.5;cursor:not-allowed}\n.bl-nav-kit__select-value{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.bl-nav-kit__select-chevron{flex:none;color:var(--theme-elevation-500,#71717a);display:grid;place-items:center}\n.bl-nav-kit__select-content{z-index:10050;min-width:var(--radix-select-trigger-width);background:var(--theme-elevation-0,#fff);border:1px solid var(--theme-elevation-150,#e4e4e7);border-radius:10px;padding:4px;box-shadow:0 12px 32px rgba(0,0,0,.45);color:var(--theme-elevation-800,#27272a);font:14px/1.45 Inter,ui-sans-serif,system-ui,sans-serif}\n.bl-nav-kit__select-viewport{display:grid;gap:2px}\n.bl-nav-kit__select-item{position:relative;display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 10px;border-radius:7px;cursor:pointer;outline:none;font:inherit}\n.bl-nav-kit__select-item[data-highlighted],.bl-nav-kit__select-item[data-state=\"checked\"]{background:color-mix(in srgb,var(--bl-kit-accent,#2563eb) 12%,var(--theme-elevation-0,#fff))}\n.bl-nav-kit__select-item[data-disabled]{opacity:.45;pointer-events:none}\n.bl-nav-kit__select-check{flex:none;color:var(--bl-kit-accent,var(--brand-primary,var(--pink,#2563eb)));display:grid;place-items:center}\n.bl-nav-kit__field{display:flex;flex-direction:column;align-items:stretch;gap:8px;margin:0 0 16px}\n.bl-nav-kit__label{display:block;font:12px/1.2 Inter,ui-sans-serif,system-ui,sans-serif;font-weight:700;color:inherit}\n.bl-nav-kit__badge{display:inline-flex;align-items:center;font-family:Inter,ui-sans-serif,system-ui,sans-serif;font-size:10px;font-weight:700;line-height:1.2;padding:.32rem .55rem;border:0;border-radius:999px;background:transparent;color:inherit}\nbutton.bl-nav-kit__badge{cursor:pointer;font-family:Inter,ui-sans-serif,system-ui,sans-serif;font-size:10px;font-weight:700;line-height:1.2}\n.bl-nav-kit__badge--primary{background:var(--bl-kit-accent,var(--brand-primary,#2563eb));color:#fff}\n.bl-nav-kit__badge--secondary{background:#71717a;color:#fff}\n.bl-nav-kit__badge--success{background:#16a34a;color:#fff}\n.bl-nav-kit__badge--danger{background:#e5484d;color:#fff}\n.bl-nav-kit__badge--warning{background:#d97706;color:#fff}\n.bl-nav-kit__badge--info{background:#0889b2;color:#fff}\n.bl-nav-kit__badge--neutral-subtle{background:var(--theme-elevation-150,#e4e4e7);color:var(--theme-elevation-800,#27272a)}\n.bl-nav-kit__badge--neutral-strong{background:var(--theme-elevation-800,#27272a);color:var(--theme-elevation-0,#fff)}\n.bl-nav-kit__kicker{margin:0;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--muted,#989daa);font-weight:800}\n.bl-nav-kit__fold{border:1px solid var(--theme-elevation-150,#e4e4e7);overflow:visible;margin:0;min-width:0;color:var(--theme-elevation-800,#27272a)}\n.bl-nav-kit__fold--light{background:var(--theme-elevation-50,#f4f4f5);border-color:var(--theme-elevation-150,#e4e4e7);border-radius:12px}\n.bl-nav-kit__fold--dark{background:var(--theme-elevation-0,#fff);border-radius:10px}\n.bl-nav-kit__fold-head{padding:12px 14px;display:flex;align-items:center;justify-content:space-between;gap:10px;border-bottom:1px solid var(--theme-elevation-150,#e4e4e7)}\n.bl-nav-kit__fold--light .bl-nav-kit__fold-head{background:var(--theme-elevation-100,#f4f4f5)}\n.bl-nav-kit__fold[data-open=\"false\"] .bl-nav-kit__fold-head{border-bottom:0}\n.bl-nav-kit__fold-toggle{flex:1;display:flex;align-items:center;gap:8px;min-width:0;border:0;background:transparent;padding:0;text-align:left;color:inherit;cursor:pointer;font:inherit}\n.bl-nav-kit__fold-chevron{flex:none;transition:transform .12s ease}\n.bl-nav-kit__fold[data-open=\"false\"] .bl-nav-kit__fold-chevron{transform:rotate(-90deg)}\n.bl-nav-kit__fold-title{font-size:13px;font-weight:700}\n.bl-nav-kit__fold-badge{font-size:11px;color:var(--theme-elevation-800,#27272a);background:var(--theme-elevation-150,#e4e4e7);border-radius:999px;padding:3px 8px}\n.bl-nav-kit__fold-toggle > small{color:var(--theme-elevation-500,#71717a)}\n.bl-nav-kit__fold-body{padding:16px}\n.bl-nav-kit__fold-body[hidden]{display:none}\n.bl-nav-kit__stack{display:flex;flex-direction:column;gap:12px}\n.bl-nav-kit__fold-menu{position:relative}\n.bl-nav-kit__fold-menu > button{border:0;background:transparent;color:inherit;cursor:pointer}\n.bl-nav-kit__fold-menu-pop{position:absolute;right:0;top:34px;z-index:12;min-width:140px;padding:4px;border:1px solid var(--theme-elevation-150,#e4e4e7);border-radius:8px;background:var(--theme-elevation-0,#fff)}\n.bl-nav-kit__fold-menu-pop button{display:block;width:100%;text-align:left;border:0;background:transparent;padding:7px 8px;border-radius:6px;color:var(--theme-elevation-800,#27272a);cursor:pointer}\n.bl-nav-kit__fold-menu-pop button:disabled{opacity:.45;cursor:not-allowed}\n`;\n\nexport function KitStyles() {\n return (\n <style href=\"bl-admin-ui\" precedence=\"default\">\n {CSS}\n </style>\n );\n}\n","import type { ReactNode } from \"react\";\n\nimport { KitStyles } from \"./styles\";\n\nconst ACCENT = /^#[0-9A-Fa-f]{6}$/;\n\n/** A `#rrggbb` the kit may write onto `--bl-kit-accent`. Anything else is ignored. */\nexport function kitAccent(value: string | undefined): string | undefined {\n return value && ACCENT.test(value) ? value : undefined;\n}\n\n/**\n * Mount once around kit chrome. Primitives read these styles; they do not\n * inject them. Pass `accent` to set `--bl-kit-accent` on `:root` so portaled\n * dialogs and selects follow it. Sites can also set that variable themselves.\n */\nexport function KitProvider({\n children,\n accent,\n}: {\n children: ReactNode;\n accent?: string;\n}) {\n const hex = kitAccent(accent);\n return (\n <>\n <KitStyles />\n {hex ? (\n <style href=\"bl-admin-ui-accent\" precedence=\"high\">\n {`:root{--bl-kit-accent:${hex};--pink:${hex};--brand-primary:${hex}}`}\n </style>\n ) : null}\n {children}\n </>\n );\n}\n","import type { HTMLAttributes } from \"react\";\n\ntype FieldTag = \"label\" | \"div\";\n\n/** Stack a label above its control. The label class owns type; this owns the 8px gap. */\nexport function Field({\n as: Tag = \"label\",\n className,\n ...props\n}: HTMLAttributes<HTMLElement> & { as?: FieldTag }) {\n return <Tag className={[\"bl-nav-kit__field\", className].filter(Boolean).join(\" \")} {...props} />;\n}\n\n/** Visible field name. Sit this in `Field` above the control — do not restyle per screen. */\nexport function Label({ className, ...props }: HTMLAttributes<HTMLSpanElement>) {\n return <span className={[\"bl-nav-kit__label\", className].filter(Boolean).join(\" \")} {...props} />;\n}\n","import type { HTMLAttributes } from \"react\";\n\n/** Uppercase eyebrow. MainHead, the preview note, and later chrome all use this. */\nexport function Kicker({ className, ...props }: HTMLAttributes<HTMLParagraphElement>) {\n return <p className={[\"bl-nav-kit__kicker\", className].filter(Boolean).join(\" \")} {...props} />;\n}\n","import { useState, type ReactNode } from \"react\";\n\nexport type FoldAction = {\n label: string;\n onClick: () => void;\n disabled?: boolean;\n danger?: boolean;\n};\n\nexport type FoldTone = \"light\" | \"dark\";\n\nexport function Fold({\n title,\n tone = \"light\",\n badge,\n meta,\n actions,\n defaultOpen = true,\n open: openProp,\n onOpenChange,\n className,\n children,\n}: {\n title: string;\n tone?: FoldTone;\n badge?: ReactNode;\n meta?: ReactNode | ((open: boolean) => ReactNode);\n actions?: FoldAction[];\n defaultOpen?: boolean;\n open?: boolean;\n onOpenChange?: (open: boolean) => void;\n className?: string;\n children?: ReactNode;\n}) {\n const controlled = openProp !== undefined;\n const [uncontrolled, setUncontrolled] = useState(defaultOpen);\n const [menu, setMenu] = useState(false);\n const open = controlled ? openProp : uncontrolled;\n\n function setOpen(next: boolean) {\n if (!controlled) setUncontrolled(next);\n onOpenChange?.(next);\n }\n\n const metaNode = typeof meta === \"function\" ? meta(open) : meta;\n const badgeNode =\n badge == null\n ? null\n : typeof badge === \"string\" || typeof badge === \"number\" ? (\n <span className=\"bl-nav-kit__fold-badge\">{badge}</span>\n ) : (\n badge\n );\n\n return (\n <section\n role=\"group\"\n aria-label={title}\n data-open={open ? \"true\" : \"false\"}\n className={[\"bl-nav-kit__fold\", `bl-nav-kit__fold--${tone}`, className].filter(Boolean).join(\" \")}\n >\n <div className=\"bl-nav-kit__fold-head\">\n <button\n type=\"button\"\n className=\"bl-nav-kit__fold-toggle\"\n aria-expanded={open}\n aria-label={open ? `Collapse ${title}` : `Expand ${title}`}\n onClick={() => setOpen(!open)}\n >\n <svg\n className=\"bl-nav-kit__fold-chevron\"\n viewBox=\"0 0 24 24\"\n width=\"14\"\n height=\"14\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n aria-hidden\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n <strong className=\"bl-nav-kit__fold-title\">{title}</strong>\n {badgeNode}\n {metaNode}\n </button>\n {actions?.length ? (\n <div className=\"bl-nav-kit__fold-menu\">\n <button type=\"button\" aria-label={`${title} actions`} onClick={() => setMenu((next) => !next)}>\n ⋯\n </button>\n {menu ? (\n <div className=\"bl-nav-kit__fold-menu-pop\">\n {actions.map((action) => (\n <button\n key={action.label}\n type=\"button\"\n disabled={action.disabled}\n className={action.danger ? \"bl-nav-kit__danger\" : undefined}\n onClick={() => {\n action.onClick();\n setMenu(false);\n }}\n >\n {action.label}\n </button>\n ))}\n </div>\n ) : null}\n </div>\n ) : null}\n </div>\n <div className=\"bl-nav-kit__fold-body\" hidden={!open}>\n {children}\n </div>\n </section>\n );\n}\n","import type { HTMLAttributes } from \"react\";\n\n/** Vertical list with a locked gap — sections in a column, links in a section, and their add buttons. */\nexport function Stack({ className, ...props }: HTMLAttributes<HTMLDivElement>) {\n return <div className={[\"bl-nav-kit__stack\", className].filter(Boolean).join(\" \")} {...props} />;\n}\n","import { useId, type ReactNode } from \"react\";\n\nimport { Button, type ButtonVariant } from \"./button\";\n\nexport type DialogConfirmVariant = Extract<ButtonVariant, \"primary\" | \"danger\">;\n\nexport function Dialog({\n open,\n title,\n children,\n cancelLabel = \"Cancel\",\n onCancel,\n confirmLabel,\n onConfirm,\n confirmVariant = \"primary\",\n confirmDisabled = false,\n}: {\n open: boolean;\n title: string;\n children: ReactNode;\n cancelLabel?: string;\n onCancel: () => void;\n confirmLabel?: string;\n onConfirm?: () => void;\n confirmVariant?: DialogConfirmVariant;\n confirmDisabled?: boolean;\n}) {\n const titleId = useId();\n if (!open) return null;\n return (\n <div className=\"bl-nav-kit__modal\" role=\"dialog\" aria-modal=\"true\" aria-labelledby={titleId}>\n <div className=\"bl-nav-kit__modal-card\">\n <h2 id={titleId}>{title}</h2>\n <div className=\"bl-nav-kit__modal-body\">{children}</div>\n <div className=\"bl-nav-kit__modal-actions\">\n <Button variant=\"outline\" onClick={onCancel}>\n {cancelLabel}\n </Button>\n {confirmLabel && onConfirm ? (\n <Button variant={confirmVariant} onClick={onConfirm} disabled={confirmDisabled}>\n {confirmLabel}\n </Button>\n ) : null}\n </div>\n </div>\n </div>\n );\n}\n","import type { ReactNode } from \"react\";\n\nimport { Dialog, type DialogConfirmVariant } from \"./dialog\";\n\nexport function ConfirmDialog({\n open,\n title,\n children,\n cancelLabel,\n confirmLabel,\n onCancel,\n onConfirm,\n confirmVariant = \"primary\",\n}: {\n open: boolean;\n title: string;\n children: ReactNode;\n cancelLabel: string;\n confirmLabel: string;\n onCancel: () => void;\n onConfirm: () => void;\n confirmVariant?: DialogConfirmVariant;\n}) {\n return (\n <Dialog\n open={open}\n title={title}\n cancelLabel={cancelLabel}\n confirmLabel={confirmLabel}\n confirmVariant={confirmVariant}\n onCancel={onCancel}\n onConfirm={onConfirm}\n >\n <p>{children}</p>\n </Dialog>\n );\n}\n","import type { InputHTMLAttributes } from \"react\";\n\nexport function Input({ className, ...props }: InputHTMLAttributes<HTMLInputElement>) {\n return <input className={[\"bl-nav-kit__input\", className].filter(Boolean).join(\" \")} {...props} />;\n}\n","import type { ComponentPropsWithoutRef } from \"react\";\nimport { Switch as SwitchPrimitive } from \"radix-ui\";\n\nexport function Switch({ className, ...props }: ComponentPropsWithoutRef<typeof SwitchPrimitive.Root>) {\n return (\n <SwitchPrimitive.Root className={[\"bl-nav-kit__switch\", className].filter(Boolean).join(\" \")} {...props}>\n <SwitchPrimitive.Thumb className=\"bl-nav-kit__switch-thumb\" />\n </SwitchPrimitive.Root>\n );\n}\n","import type { TextareaHTMLAttributes } from \"react\";\n\nexport function Textarea({ className, ...props }: TextareaHTMLAttributes<HTMLTextAreaElement>) {\n return <textarea className={[\"bl-nav-kit__textarea\", className].filter(Boolean).join(\" \")} {...props} />;\n}\n","export type ItemKind = \"navLink\" | \"megaMenu\";\n\n/** Rail / type-card mark. The kit owns the badge; pass `kind` only. */\nexport function KindGlyph({ kind }: { kind: ItemKind }) {\n return (\n <span className=\"bl-nav-kit__glyph\" data-kind={kind} aria-hidden>\n {kind === \"megaMenu\" ? <MegaMark /> : <LinkMark />}\n </span>\n );\n}\n\nexport function LinkGlyph() {\n return <KindGlyph kind=\"navLink\" />;\n}\n\nexport function MegaGlyph() {\n return <KindGlyph kind=\"megaMenu\" />;\n}\n\nfunction LinkMark() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M10 13a5 5 0 0 0 7.54.54l3-3a5 5 0 0 0-7.07-7.07l-1.72 1.71\" />\n <path d=\"M14 11a5 5 0 0 0-7.54-.54l-3 3a5 5 0 0 0 7.07 7.07l1.71-1.71\" />\n </svg>\n );\n}\n\nfunction MegaMark() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect width=\"18\" height=\"18\" x=\"3\" y=\"3\" rx=\"2\" />\n <path d=\"M9 3v18\" />\n <path d=\"M15 3v18\" />\n </svg>\n );\n}\n","import type { ReactNode } from \"react\";\n\nexport function TypeCards({\n compact,\n children,\n}: {\n compact?: boolean;\n children: ReactNode;\n}) {\n return (\n <div className={compact ? \"bl-nav-kit__types bl-nav-kit__types--compact\" : \"bl-nav-kit__types\"}>\n {children}\n </div>\n );\n}\n\nexport function TypeCard({\n icon,\n label,\n description,\n onClick,\n active,\n disabled,\n}: {\n icon?: ReactNode;\n label: string;\n description?: string;\n onClick: () => void;\n active?: boolean;\n disabled?: boolean;\n}) {\n return (\n <button\n type=\"button\"\n className={active ? \"bl-nav-kit__type is-active\" : \"bl-nav-kit__type\"}\n disabled={disabled}\n onClick={onClick}\n >\n <span className=\"bl-nav-kit__type-row\">\n {icon ? (\n <span className=\"bl-nav-kit__type-icon\" aria-hidden>\n {icon}\n </span>\n ) : null}\n {label}\n </span>\n {description ? <small>{description}</small> : null}\n </button>\n );\n}\n","import type { ComponentPropsWithoutRef } from \"react\";\nimport { Select as SelectPrimitive } from \"radix-ui\";\n\nexport const Select = SelectPrimitive.Root;\nexport const SelectValue = SelectPrimitive.Value;\n\nexport function SelectTrigger({\n children,\n ...props\n}: ComponentPropsWithoutRef<typeof SelectPrimitive.Trigger>) {\n return (\n <SelectPrimitive.Trigger className=\"bl-nav-kit__select-trigger\" {...props}>\n <span className=\"bl-nav-kit__select-value\">{children}</span>\n <span className=\"bl-nav-kit__select-chevron\" aria-hidden>\n <ChevronGlyph />\n </span>\n </SelectPrimitive.Trigger>\n );\n}\n\nexport function SelectContent({\n children,\n ...props\n}: ComponentPropsWithoutRef<typeof SelectPrimitive.Content>) {\n return (\n <SelectPrimitive.Portal>\n <SelectPrimitive.Content\n className=\"bl-nav-kit__select-content\"\n position=\"popper\"\n sideOffset={6}\n {...props}\n >\n <SelectPrimitive.Viewport className=\"bl-nav-kit__select-viewport\">{children}</SelectPrimitive.Viewport>\n </SelectPrimitive.Content>\n </SelectPrimitive.Portal>\n );\n}\n\nexport function SelectItem({\n children,\n ...props\n}: ComponentPropsWithoutRef<typeof SelectPrimitive.Item>) {\n return (\n <SelectPrimitive.Item className=\"bl-nav-kit__select-item\" {...props}>\n <SelectPrimitive.ItemText>{children}</SelectPrimitive.ItemText>\n <SelectPrimitive.ItemIndicator className=\"bl-nav-kit__select-check\" aria-hidden>\n <CheckGlyph />\n </SelectPrimitive.ItemIndicator>\n </SelectPrimitive.Item>\n );\n}\n\nfunction ChevronGlyph() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n\nfunction CheckGlyph() {\n return (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <path d=\"M20 6 9 17l-5-5\" />\n </svg>\n );\n}\n","import type { ReactNode } from \"react\";\n\nimport { Kicker } from \"./kicker\";\n\n/**\n * Presentational workspace chrome. Surfaces come from the adapter CSS\n * (Payload theme tokens). Field adapters own form writes.\n */\nexport function MainHead({\n kicker,\n title,\n description,\n children,\n}: {\n kicker?: ReactNode;\n title: ReactNode;\n description?: ReactNode;\n children?: ReactNode;\n}) {\n return (\n <header className=\"bl-workspace__main-head\">\n <div>\n {kicker ? <Kicker>{kicker}</Kicker> : null}\n <h1>{title}</h1>\n {description ? <p>{description}</p> : null}\n </div>\n {children}\n </header>\n );\n}\n\n/** Aside chrome only. The adapter supplies children — nothing here is a link list. */\nexport function ItemRail({ children }: { children: ReactNode }) {\n return <aside className=\"bl-workspace__rail\">{children}</aside>;\n}\n\nexport function RailSlot({ children }: { children: ReactNode }) {\n return <div className=\"bl-workspace__rail-slot\">{children}</div>;\n}\n\nexport function Canvas({ children }: { children: ReactNode }) {\n return <div className=\"bl-workspace__canvas\">{children}</div>;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bison-lab/admin-ui",
3
- "version": "3.22.0",
3
+ "version": "3.24.0",
4
4
  "description": "Payload-free admin kit primitives for Bison Lab CMS fields",
5
5
  "homepage": "https://components.bisonlab.ai",
6
6
  "repository": {
@@ -29,6 +29,7 @@
29
29
  },
30
30
  "devDependencies": {
31
31
  "@testing-library/react": "^16.3.2",
32
+ "@testing-library/user-event": "^14.6.1",
32
33
  "@types/react": "^19.2.14",
33
34
  "@types/react-dom": "^19.2.3",
34
35
  "jsdom": "^29.0.1",
@@ -41,6 +42,9 @@
41
42
  "publishConfig": {
42
43
  "access": "public"
43
44
  },
45
+ "dependencies": {
46
+ "radix-ui": "^1.4.3"
47
+ },
44
48
  "scripts": {
45
49
  "build": "tsdown",
46
50
  "dev": "tsdown --watch",