@bison-lab/payload-blocks 3.24.0 → 3.26.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/dist/admin.d.mts.map +1 -1
- package/dist/admin.mjs +91 -112
- package/dist/admin.mjs.map +1 -1
- package/package.json +3 -3
package/dist/admin.d.mts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.d.mts","names":[],"sources":["../src/admin/admin-workspace.tsx","../src/admin/link-field.tsx","../src/admin/min-rows-array-field.tsx","../src/admin/nav-items-field.tsx"],"mappings":";;;;;;;;AAWA;iBAAgB,cAAA,CAAe,KAAA,EAAO,uBAAA,GAAuB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;
|
|
1
|
+
{"version":3,"file":"admin.d.mts","names":[],"sources":["../src/admin/admin-workspace.tsx","../src/admin/link-field.tsx","../src/admin/min-rows-array-field.tsx","../src/admin/nav-items-field.tsx"],"mappings":";;;;;;;;AAWA;iBAAgB,cAAA,CAAe,KAAA,EAAO,uBAAA,GAAuB,kBAAA,CAAA,GAAA,CAAA,OAAA;;;cCmDhD,SAAA,EAAW,uBAAA;;;;;;ADnDxB;;;;;;;;;;;;;ACmDA;;;cCvCa,iBAAA,EAAmB,yBAAA;;;cC8NnB,aAAA,EAAe,0BAAA"}
|
package/dist/admin.mjs
CHANGED
|
@@ -2,9 +2,9 @@
|
|
|
2
2
|
import "./link-32261jXB.mjs";
|
|
3
3
|
import { a as linkTypeOf, n as headerItemsFromBlocks, o as resolveAdminPreviewLink } from "./header-CTMSB4C0.mjs";
|
|
4
4
|
import { Fragment, jsx, jsxs } from "react/jsx-runtime";
|
|
5
|
-
import { ArrayField, DefaultEditView, FieldDescription, FieldError,
|
|
5
|
+
import { ArrayField, DefaultEditView, FieldDescription, FieldError, FieldPathContext, toast, useConfig, useField, useFieldPath, useForm, useTheme, useTranslation } from "@payloadcms/ui";
|
|
6
|
+
import { Badge, Button, Canvas, Checkbox, ConfirmDialog, Dialog, Field, Fold, Input, ItemRail, Kicker, KindGlyph, KitProvider, Label, MainHead, RailSlot, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Stack, Textarea, TypeCard, TypeCards } from "@bison-lab/admin-ui";
|
|
6
7
|
import { useCallback, useEffect, useId, useMemo, useRef, useState } from "react";
|
|
7
|
-
import { Button, Canvas, Checkbox, ConfirmDialog, Dialog, Field, Fold, Input, ItemRail, Kicker, KindGlyph, KitProvider, Label, MainHead, RailSlot, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Stack, Textarea, TypeCard, TypeCards } from "@bison-lab/admin-ui";
|
|
8
8
|
import { resolveThemeIdentity, themeHeadFromDoc } from "@bison-lab/payload-core/theme";
|
|
9
9
|
//#region src/admin/workspace-css.ts
|
|
10
10
|
/**
|
|
@@ -126,11 +126,8 @@ function AdminWorkspace(props) {
|
|
|
126
126
|
* picker knows to warn that a page chosen earlier has since been unpublished
|
|
127
127
|
* or deleted.
|
|
128
128
|
*
|
|
129
|
-
*
|
|
130
|
-
*
|
|
131
|
-
* in a `<style href precedence>`, which React 19 hoists into the head and
|
|
132
|
-
* dedupes across instances. Payload 3's admin is React 19 (`@payloadcms/ui`
|
|
133
|
-
* peers `react ^19`), so that is the only React this entry runs under.
|
|
129
|
+
* Kit chrome (`Field`, `Label`, `Input`, `Badge`, `Button`) under
|
|
130
|
+
* `KitProvider`. Payload's field hooks still write `type` / `page` / `href`.
|
|
134
131
|
*/
|
|
135
132
|
const LABEL = "Goes to";
|
|
136
133
|
const PLACEHOLDER = "Search pages, or paste a URL";
|
|
@@ -339,99 +336,100 @@ const LinkField = ({ field, path, readOnly }) => {
|
|
|
339
336
|
}
|
|
340
337
|
const error = linkType === "external" ? href : page;
|
|
341
338
|
const activeId = active >= 0 && open ? `${id}-option-${active}` : void 0;
|
|
342
|
-
return /* @__PURE__ */ jsxs(
|
|
343
|
-
|
|
339
|
+
return /* @__PURE__ */ jsx(KitProvider, { children: /* @__PURE__ */ jsxs(Field, {
|
|
340
|
+
as: "div",
|
|
341
|
+
className: "bl-link-field",
|
|
344
342
|
children: [
|
|
345
|
-
/* @__PURE__ */
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
children: CSS$1
|
|
349
|
-
}),
|
|
350
|
-
/* @__PURE__ */ jsx(FieldLabel, {
|
|
351
|
-
htmlFor: inputId,
|
|
352
|
-
label: LABEL,
|
|
353
|
-
required
|
|
343
|
+
/* @__PURE__ */ jsxs(Label, {
|
|
344
|
+
id: `${id}-label`,
|
|
345
|
+
children: [LABEL, required ? " *" : ""]
|
|
354
346
|
}),
|
|
355
347
|
/* @__PURE__ */ jsxs("div", {
|
|
356
|
-
className: "bl-
|
|
357
|
-
children: [
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
348
|
+
className: "bl-nav-kit__picker",
|
|
349
|
+
children: [kind === "page" ? /* @__PURE__ */ jsxs("div", {
|
|
350
|
+
className: "bl-nav-kit__picker-control",
|
|
351
|
+
children: [
|
|
352
|
+
/* @__PURE__ */ jsx(Badge, {
|
|
353
|
+
variant: "neutral-subtle",
|
|
354
|
+
children: "Page"
|
|
355
|
+
}),
|
|
356
|
+
/* @__PURE__ */ jsx("span", { children: stored?.doc ? /* @__PURE__ */ jsxs(Fragment, { children: [String(stored.doc[titleKey] ?? stored.doc.id), /* @__PURE__ */ jsx("span", {
|
|
357
|
+
className: "bl-nav-kit__picker-path",
|
|
365
358
|
children: pagePath(stored.doc)
|
|
366
|
-
})] }) : stored?.missing ? `Page ${String(pageId)}` : "…"
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
359
|
+
})] }) : stored?.missing ? `Page ${String(pageId)}` : "…" }),
|
|
360
|
+
readOnly ? null : /* @__PURE__ */ jsx(Button, {
|
|
361
|
+
variant: "ghost",
|
|
362
|
+
"aria-label": "Clear",
|
|
363
|
+
onClick: clear,
|
|
364
|
+
children: "×"
|
|
365
|
+
})
|
|
366
|
+
]
|
|
367
|
+
}) : kind === "external" ? /* @__PURE__ */ jsxs("div", {
|
|
368
|
+
className: "bl-nav-kit__picker-control",
|
|
369
|
+
children: [
|
|
370
|
+
/* @__PURE__ */ jsx(Badge, {
|
|
371
|
+
variant: "neutral-subtle",
|
|
372
|
+
children: "External"
|
|
373
|
+
}),
|
|
374
|
+
/* @__PURE__ */ jsx("span", { children: href.value }),
|
|
375
|
+
readOnly ? null : /* @__PURE__ */ jsx(Button, {
|
|
376
|
+
variant: "ghost",
|
|
377
|
+
"aria-label": "Clear",
|
|
378
|
+
onClick: clear,
|
|
379
|
+
children: "×"
|
|
380
|
+
})
|
|
381
|
+
]
|
|
382
|
+
}) : /* @__PURE__ */ jsx(Input, {
|
|
383
|
+
ref: inputRef,
|
|
384
|
+
id: inputId,
|
|
385
|
+
role: "combobox",
|
|
386
|
+
placeholder: PLACEHOLDER,
|
|
387
|
+
autoComplete: "off",
|
|
388
|
+
disabled: readOnly,
|
|
389
|
+
value: query,
|
|
390
|
+
"aria-labelledby": `${id}-label`,
|
|
391
|
+
"aria-expanded": open,
|
|
392
|
+
"aria-controls": listId,
|
|
393
|
+
"aria-autocomplete": "list",
|
|
394
|
+
"aria-activedescendant": activeId,
|
|
395
|
+
onChange: (event) => {
|
|
396
|
+
setQuery(event.target.value);
|
|
397
|
+
setActive(-1);
|
|
398
|
+
setOpen(true);
|
|
399
|
+
},
|
|
400
|
+
onFocus: () => setOpen(true),
|
|
401
|
+
onBlur: () => setOpen(false),
|
|
402
|
+
onKeyDown
|
|
403
|
+
}), open && !kind ? /* @__PURE__ */ jsxs("ul", {
|
|
404
|
+
id: listId,
|
|
405
|
+
role: "listbox",
|
|
406
|
+
className: "bl-nav-kit__picker-menu",
|
|
407
|
+
children: [options.map((option, i) => /* @__PURE__ */ jsx("li", {
|
|
408
|
+
id: `${id}-option-${i}`,
|
|
409
|
+
role: "option",
|
|
410
|
+
"aria-selected": i === active,
|
|
411
|
+
className: "bl-nav-kit__picker-option",
|
|
412
|
+
onMouseDown: (event) => {
|
|
413
|
+
event.preventDefault();
|
|
414
|
+
choose(option);
|
|
391
415
|
},
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
className: "bl-link-field__menu",
|
|
407
|
-
children: [options.map((option, i) => /* @__PURE__ */ jsx("li", {
|
|
408
|
-
id: `${id}-option-${i}`,
|
|
409
|
-
role: "option",
|
|
410
|
-
"aria-selected": i === active,
|
|
411
|
-
className: "bl-link-field__option",
|
|
412
|
-
onMouseDown: (event) => {
|
|
413
|
-
event.preventDefault();
|
|
414
|
-
choose(option);
|
|
415
|
-
},
|
|
416
|
-
onMouseEnter: () => setActive(i),
|
|
417
|
-
children: option.kind === "page" ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", { children: String(option.page[titleKey] ?? option.page.id) }), /* @__PURE__ */ jsx("span", {
|
|
418
|
-
className: "bl-link-field__path",
|
|
419
|
-
children: pagePath(option.page)
|
|
420
|
-
})] }) : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", { children: "Link to this URL" }), /* @__PURE__ */ jsx("span", {
|
|
421
|
-
className: "bl-link-field__path",
|
|
422
|
-
children: option.href
|
|
423
|
-
})] })
|
|
424
|
-
}, option.kind === "page" ? String(option.page.id) : option.href)), options.length === 0 && !loading ? /* @__PURE__ */ jsx("li", {
|
|
425
|
-
role: "presentation",
|
|
426
|
-
className: "bl-link-field__empty",
|
|
427
|
-
children: NO_MATCH
|
|
428
|
-
}) : null]
|
|
429
|
-
}) : null
|
|
430
|
-
]
|
|
416
|
+
onMouseEnter: () => setActive(i),
|
|
417
|
+
children: option.kind === "page" ? /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", { children: String(option.page[titleKey] ?? option.page.id) }), /* @__PURE__ */ jsx("span", {
|
|
418
|
+
className: "bl-nav-kit__picker-path",
|
|
419
|
+
children: pagePath(option.page)
|
|
420
|
+
})] }) : /* @__PURE__ */ jsxs(Fragment, { children: [/* @__PURE__ */ jsx("span", { children: "Link to this URL" }), /* @__PURE__ */ jsx("span", {
|
|
421
|
+
className: "bl-nav-kit__picker-path",
|
|
422
|
+
children: option.href
|
|
423
|
+
})] })
|
|
424
|
+
}, option.kind === "page" ? String(option.page.id) : option.href)), options.length === 0 && !loading ? /* @__PURE__ */ jsx("li", {
|
|
425
|
+
role: "presentation",
|
|
426
|
+
className: "bl-nav-kit__picker-option",
|
|
427
|
+
children: NO_MATCH
|
|
428
|
+
}) : null]
|
|
429
|
+
}) : null]
|
|
431
430
|
}),
|
|
432
431
|
kind === "page" && stored && (stored.missing || stored.doc?._status === "draft") ? /* @__PURE__ */ jsx("div", {
|
|
433
432
|
role: "status",
|
|
434
|
-
className: "bl-link-field__warning",
|
|
435
433
|
children: stored.missing ? MISSING : UNPUBLISHED
|
|
436
434
|
}) : null,
|
|
437
435
|
/* @__PURE__ */ jsx(FieldDescription, {
|
|
@@ -444,27 +442,8 @@ const LinkField = ({ field, path, readOnly }) => {
|
|
|
444
442
|
message: error.errorMessage
|
|
445
443
|
})
|
|
446
444
|
]
|
|
447
|
-
});
|
|
445
|
+
}) });
|
|
448
446
|
};
|
|
449
|
-
/** Theme variables only: a literal colour would be right in one theme and wrong in the other. */
|
|
450
|
-
const CSS$1 = `
|
|
451
|
-
.bl-link-field__control{position:relative;display:flex;align-items:center;gap:calc(var(--base) * .4);min-height:calc(var(--base) * 2);padding:calc(var(--base) * .25) calc(var(--base) * .6);border:1px solid var(--theme-elevation-150);border-radius:var(--style-radius-s);background:var(--theme-input-bg);color:var(--theme-elevation-800);font-family:var(--font-body)}
|
|
452
|
-
.bl-link-field__control:focus-within{border-color:var(--theme-elevation-400);box-shadow:0 0 0 1px var(--theme-elevation-400)}
|
|
453
|
-
.bl-link-field__input{flex:1;min-width:0;border:0;background:transparent;color:inherit;font:inherit;outline:none}
|
|
454
|
-
.bl-link-field__input::placeholder{color:var(--theme-elevation-400)}
|
|
455
|
-
.bl-link-field__input:disabled{color:var(--theme-elevation-400)}
|
|
456
|
-
.bl-link-field__kind{flex:none;padding:2px 6px;border-radius:var(--style-radius-s);background:var(--theme-elevation-100);color:var(--theme-elevation-600);font-size:10.5px;letter-spacing:.05em;text-transform:uppercase}
|
|
457
|
-
.bl-link-field__value{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}
|
|
458
|
-
.bl-link-field__path{margin-left:calc(var(--base) * .4);color:var(--theme-elevation-500);font-family:var(--font-mono);font-size:11.5px;font-weight:400}
|
|
459
|
-
.bl-link-field__clear{flex:none;width:calc(var(--base) * 1.2);height:calc(var(--base) * 1.2);border:0;border-radius:var(--style-radius-s);background:transparent;color:var(--theme-elevation-500);font-size:18px;line-height:1;cursor:pointer}
|
|
460
|
-
.bl-link-field__clear:hover,.bl-link-field__clear:focus-visible{background:var(--theme-elevation-100);color:var(--theme-elevation-800);outline:none}
|
|
461
|
-
.bl-link-field__menu{position:absolute;left:-1px;right:-1px;top:calc(100% + 4px);z-index:10;margin:0;padding:calc(var(--base) * .2) 0;list-style:none;border:1px solid var(--theme-elevation-150);border-radius:var(--style-radius-s);background:var(--theme-elevation-0);box-shadow:0 8px 24px var(--theme-overlay)}
|
|
462
|
-
.bl-link-field__option{display:flex;justify-content:space-between;gap:calc(var(--base) * .6);padding:calc(var(--base) * .35) calc(var(--base) * .6);cursor:pointer}
|
|
463
|
-
.bl-link-field__option[aria-selected="true"]{background:var(--theme-elevation-100)}
|
|
464
|
-
.bl-link-field__empty{padding:calc(var(--base) * .5) calc(var(--base) * .6);color:var(--theme-elevation-500)}
|
|
465
|
-
.bl-link-field__warning{display:flex;align-items:baseline;gap:calc(var(--base) * .3);margin-top:calc(var(--base) * .3);color:var(--theme-warning-600);font-size:12px}
|
|
466
|
-
.bl-link-field__warning::before{content:"";flex:none;width:8px;height:8px;border-radius:50%;background:var(--theme-warning-500);transform:translateY(-1px)}
|
|
467
|
-
`;
|
|
468
447
|
//#endregion
|
|
469
448
|
//#region src/admin/min-rows-array-field.tsx
|
|
470
449
|
/**
|
package/dist/admin.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin.mjs","names":["CSS"],"sources":["../src/admin/workspace-css.ts","../src/admin/admin-workspace.tsx","../src/admin/link-field.tsx","../src/admin/min-rows-array-field.tsx","../src/admin/nav-items-field.tsx"],"sourcesContent":["/**\n * Payload Edit View → mockup workspace. Scoped to the document that\n * opted in (Header first). Theme, Pages, and other collections stay\n * Payload's form. Surfaces follow Payload elevation so Light / Dark\n * match the admin header toggle.\n *\n * A second kit editor reuses this file by opting into the same view;\n * do not copy Header selectors into that editor.\n */\nexport const ADMIN_WORKSPACE_CSS = `\n.global-edit--navigation{\n --bg:var(--theme-bg,var(--theme-elevation-0));--panel:var(--theme-elevation-50);--panel2:var(--theme-elevation-100);--panel3:var(--theme-elevation-150);\n --line:var(--theme-elevation-150);--line2:var(--theme-elevation-250);\n --text:var(--theme-text,var(--theme-elevation-800));--muted:var(--theme-elevation-500);--muted2:var(--theme-elevation-400,var(--theme-elevation-500));\n --pink:var(--bl-kit-accent,#e60088);--pink2:#ff2da5;--danger:#ff8aa9;\n --brand-primary:var(--bl-kit-accent,var(--pink));\n --gutter-h:0;--main-gutter-h-left:0;--main-gutter-h-right:0;\n --sidebar-gutter-h-left:0;--sidebar-gutter-h-right:0;\n background:var(--bg);color:var(--text);\n display:flex;flex-direction:column;flex:1;min-height:0;height:auto;\n overflow:hidden;\n}\n/* Own the viewport with flex. The edit view already sits under\n AppHeader inside the wrap; a viewport height here pushes the\n Header button past the fold. */\n.template-default:has(.global-edit--navigation){\n height:100dvh;max-height:100dvh;min-height:0;overflow:hidden;\n}\n.template-default:has(.global-edit--navigation) .template-default__wrap{\n display:flex;flex-direction:column;min-height:0;height:100%;overflow:hidden;\n}\n.template-default:has(.global-edit--navigation) .app-header{\n flex:none;\n}\n.global-edit--navigation form,.global-edit--navigation .gutter--left,.global-edit--navigation .gutter--right{\n padding:0;margin:0;\n}\n.global-edit--navigation form{\n flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden;height:100%;\n}\n/* Payload's main pane is content-sized. Stretch it — and only the kit\n field — so the rail and canvas reach the bottom of the browser.\n Do not flex every .field-type: hidden cta/bar siblings would steal\n height, and height:100% beats a viewport min-height on .bl-nav-items. */\n.global-edit--navigation .doc-controls + div,\n.global-edit--navigation .doc-controls + div > div,\n.global-edit--navigation .document-fields,\n.global-edit--navigation .document-fields__main,\n.global-edit--navigation .document-fields__edit,\n.global-edit--navigation .document-fields__fields,\n.global-edit--navigation .render-fields:has(.bl-nav-items),\n.global-edit--navigation .group-field:has(.bl-nav-items),\n.global-edit--navigation .group-field:has(.bl-nav-items) .group-field__wrap{\n display:flex;flex-direction:column;flex:1;min-height:0;height:100%;\n overflow:hidden;padding:0;margin:0;border:0;max-width:none;width:100%;\n}\n.global-edit--navigation .render-fields:has(.bl-nav-items){gap:0}\n.global-edit--navigation .field-label,.global-edit--navigation .field-label__label,\n.global-edit--navigation .field-description,.global-edit--navigation .field__description,\n.global-edit--navigation .group-field__title,.global-edit--navigation .tabs-field{display:none}\n.global-edit--navigation .bl-nav-items .field-label,.global-edit--navigation .bl-nav-items .field-label__label{display:block}\n.global-edit--navigation .live-preview,.global-edit--navigation .live-preview-window,\n.global-edit--navigation [class*=\"LivePreview\"]{display:none !important}\n.global-edit--navigation .doc-header{\n background:var(--bg);border-bottom:1px solid var(--line);padding:10px 24px;min-height:0;flex:none;\n}\n.global-edit--navigation .doc-controls{\n background:var(--bg);border-bottom:1px solid var(--line);padding:12px;min-height:0;\n flex:none;position:sticky;top:0;z-index:6;\n}\n.global-edit--navigation .doc-controls:before,.global-edit--navigation .doc-controls:after{\n display:none;content:none;backdrop-filter:none;\n}\n.global-edit--navigation .doc-controls__wrapper{height:auto;min-height:0}\n.global-edit--navigation .doc-controls__content{padding:0}\n.global-edit--navigation .doc-controls__controls-wrapper{background:var(--bg);border-top-color:var(--line)}\n.global-edit--navigation .doc-header__title,.global-edit--navigation .doc-controls .doc-title{font-size:16px;font-weight:700;color:var(--text)}\n.global-edit--navigation .btn--style-primary,.global-edit--navigation .btn.btn--style-primary{\n background:var(--pink);border-color:var(--pink);color:#fff;\n}\n.global-edit--navigation .bl-nav-items{\n display:grid;grid-template-columns:300px minmax(0,1fr);\n grid-template-rows:minmax(0,1fr);\n flex:1;min-height:0;height:100%;overflow:hidden;align-self:stretch;\n}\n@media(max-width:1280px){.global-edit--navigation .bl-nav-items{grid-template-columns:250px minmax(0,1fr)}}\n@media(max-width:850px){.global-edit--navigation .bl-nav-items{grid-template-columns:1fr}}\n`;\n","\"use client\";\n\nimport { DefaultEditView } from \"@payloadcms/ui\";\nimport type { DocumentViewClientProps } from \"payload\";\n\nimport { ADMIN_WORKSPACE_CSS } from \"./workspace-css\";\n\n/**\n * Wraps Payload's DefaultEditView so Header (and later kit editors)\n * become the mockup workspace. Does not mount a second Form.\n */\nexport function AdminWorkspace(props: DocumentViewClientProps) {\n return (\n <>\n <style href=\"bl-admin-workspace\" precedence=\"high\">\n {ADMIN_WORKSPACE_CSS}\n </style>\n <DefaultEditView {...props} />\n </>\n );\n}\n","import {\n FieldDescription,\n FieldError,\n FieldLabel,\n useConfig,\n useField,\n useFieldPath,\n} from \"@payloadcms/ui\";\nimport type { ClientField, RowFieldClientComponent } from \"payload\";\nimport { useEffect, useId, useMemo, useRef, useState } from \"react\";\n\nimport { linkTypeOf, type LinkPageDoc, type LinkType } from \"../fields/link\";\n\n/**\n * The link picker: one box in place of a link's `type`, `page` and `href`.\n *\n * Type to search the pages collection by its title field; each result shows\n * its path. Paste anything that can only be a destination (`http`, `mailto:`,\n * `tel:`, or a site path starting with `/`) and the one offer is to link to\n * it. Choosing writes the stored shape through Payload's `useField`, so the\n * document saves exactly what the stock fields would have saved, and the\n * chosen state shows a Page or External chip with a clear button.\n *\n * The search asks the collection's REST endpoint for `_status: published`\n * rows, so the draft rule is the server's and is applied on every keystroke.\n * A stored page is fetched by id without that filter, which is how the\n * picker knows to warn that a page chosen earlier has since been unpublished\n * or deleted.\n *\n * Painted with Payload's own theme variables and nothing else, so it reads\n * in both admin themes without a stylesheet of its own; the rules ride along\n * in a `<style href precedence>`, which React 19 hoists into the head and\n * dedupes across instances. Payload 3's admin is React 19 (`@payloadcms/ui`\n * peers `react ^19`), so that is the only React this entry runs under.\n */\n\nconst LABEL = \"Goes to\";\nconst PLACEHOLDER = \"Search pages, or paste a URL\";\nconst DESCRIPTION =\n \"Published pages only. Paste a URL, or a path like /find-a-doctor, to link anywhere else.\";\nconst NO_MATCH = \"No published page matches. Paste a URL to link outside the site.\";\nconst UNPUBLISHED =\n \"This page is no longer published. The site shows this link as plain text, and this document cannot be published until you pick another page or publish that one again.\";\nconst MISSING =\n \"This page no longer exists. Pick another page or paste a URL before publishing.\";\n\nconst SEARCH_DELAY_MS = 200;\nconst SEARCH_LIMIT = 8;\n\n/** Text an editor could only mean as a destination, never as a page title. */\nconst URL_LIKE = /^(https?:\\/\\/|mailto:|tel:|\\/)/i;\n\ntype Option = { kind: \"page\"; page: LinkPageDoc } | { kind: \"url\"; href: string };\n\n/**\n * A row has no name, so its `path` ends in `_index-N` and its fields sit at\n * the parent's level, the way Payload's `getFieldPaths` places them.\n */\nfunction siblingPaths(rowPath: string) {\n const base = rowPath\n .split(\".\")\n .filter((segment) => !segment.startsWith(\"_index-\"))\n .join(\".\");\n const at = (name: string) => (base ? `${base}.${name}` : name);\n return { type: at(\"type\"), page: at(\"page\"), href: at(\"href\") };\n}\n\nfunction pagePath(page: LinkPageDoc): string {\n return page.slug ? `/${page.slug}` : \"\";\n}\n\nexport const LinkField: RowFieldClientComponent = ({ field, path, readOnly }) => {\n // Payload re-renders a custom field with a stale `path` prop while rows are\n // reordered; the context, when there is one, is the row's current path.\n const rowPath = useFieldPath() ?? path;\n const paths = useMemo(() => siblingPaths(rowPath), [rowPath]);\n\n const type = useField<LinkType | null>({ path: paths.type });\n const page = useField<LinkPageDoc | number | string | null>({ path: paths.page });\n const href = useField<string | null>({ path: paths.href });\n\n const pageField = field.fields.find(\n (f): f is Extract<ClientField, { type: \"relationship\" }> =>\n f.type === \"relationship\" && f.name === \"page\",\n );\n const collection =\n typeof pageField?.relationTo === \"string\" ? pageField.relationTo : \"pages\";\n const required = Boolean(pageField?.required);\n\n const { config } = useConfig();\n const titleKey =\n config.collections.find((c) => c.slug === collection)?.admin?.useAsTitle ?? \"id\";\n const endpoint = `${config.serverURL}${config.routes.api}/${collection}`;\n\n const id = useId();\n const inputId = `${id}-input`;\n const listId = `${id}-list`;\n const inputRef = useRef<HTMLInputElement>(null);\n\n const [query, setQuery] = useState(\"\");\n const [open, setOpen] = useState(false);\n const [loading, setLoading] = useState(false);\n const [results, setResults] = useState<LinkPageDoc[]>([]);\n const [active, setActive] = useState(-1);\n const [focusNext, setFocusNext] = useState(false);\n /** The stored page, looked up; `missing` when the id no longer answers. */\n const [stored, setStored] = useState<{ doc: LinkPageDoc | null; missing: boolean } | null>(null);\n /** Pages seen in search results, so choosing one needs no second request. */\n const known = useRef(new Map<string, LinkPageDoc>());\n const searchSeq = useRef(0);\n\n // Which destination the row holds, by the same reading as the stock fields'\n // conditions and `resolveLink`; `null` is nothing chosen yet.\n const linkType = linkTypeOf({ type: type.value, page: page.value, href: href.value });\n const kind: LinkType | null =\n linkType === \"external\" ? (href.value ? \"external\" : null) : page.value ? \"page\" : null;\n\n const pageValue = page.value;\n const pageId = pageValue && typeof pageValue === \"object\" ? null : pageValue;\n\n useEffect(() => {\n if (kind !== \"page\") {\n setStored(null);\n return;\n }\n if (pageValue && typeof pageValue === \"object\") {\n setStored({ doc: pageValue, missing: false });\n return;\n }\n const cached = known.current.get(String(pageId));\n if (cached) {\n setStored({ doc: cached, missing: false });\n return;\n }\n let cancelled = false;\n fetch(`${endpoint}/${pageId}?depth=0`, { credentials: \"include\" })\n .then(async (response) => {\n if (cancelled) return;\n if (!response.ok) {\n setStored({ doc: null, missing: true });\n return;\n }\n const doc = (await response.json()) as LinkPageDoc;\n known.current.set(String(doc.id), doc);\n if (!cancelled) setStored({ doc, missing: false });\n })\n .catch(() => {\n if (!cancelled) setStored({ doc: null, missing: true });\n });\n return () => {\n cancelled = true;\n };\n }, [kind, pageValue, pageId, endpoint]);\n\n const trimmed = query.trim();\n const urlLike = URL_LIKE.test(trimmed);\n\n useEffect(() => {\n if (!open || urlLike) return;\n const seq = (searchSeq.current += 1);\n setLoading(true);\n const timer = setTimeout(() => {\n const params = new URLSearchParams({\n depth: \"0\",\n limit: String(SEARCH_LIMIT),\n sort: titleKey,\n \"where[_status][equals]\": \"published\",\n });\n if (trimmed) params.set(`where[${titleKey}][like]`, trimmed);\n fetch(`${endpoint}?${params.toString()}`, { credentials: \"include\" })\n .then((response) => (response.ok ? response.json() : { docs: [] }))\n .then((body: { docs?: LinkPageDoc[] }) => {\n if (seq !== searchSeq.current) return;\n const docs = body.docs ?? [];\n for (const doc of docs) known.current.set(String(doc.id), doc);\n setResults(docs);\n setLoading(false);\n })\n .catch(() => {\n if (seq !== searchSeq.current) return;\n setResults([]);\n setLoading(false);\n });\n }, SEARCH_DELAY_MS);\n return () => clearTimeout(timer);\n }, [open, urlLike, trimmed, endpoint, titleKey]);\n\n useEffect(() => {\n if (focusNext && inputRef.current) {\n inputRef.current.focus();\n setFocusNext(false);\n }\n }, [focusNext, kind]);\n\n const options: Option[] = urlLike\n ? [{ kind: \"url\", href: trimmed }]\n : results.map((doc) => ({ kind: \"page\", page: doc }));\n\n function choose(option: Option) {\n if (option.kind === \"page\") {\n known.current.set(String(option.page.id), option.page);\n type.setValue(\"page\");\n page.setValue(option.page.id);\n href.setValue(null);\n } else {\n type.setValue(\"external\");\n href.setValue(option.href);\n page.setValue(null);\n }\n setQuery(\"\");\n setOpen(false);\n setActive(-1);\n }\n\n function clear() {\n type.setValue(\"page\");\n page.setValue(null);\n href.setValue(null);\n setStored(null);\n setFocusNext(true);\n }\n\n function onKeyDown(event: React.KeyboardEvent<HTMLInputElement>) {\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n if (!open) {\n setOpen(true);\n return;\n }\n setActive((i) => (options.length ? (i + 1) % options.length : -1));\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n setActive((i) =>\n options.length ? (i <= 0 ? options.length - 1 : i - 1) : -1,\n );\n } else if (event.key === \"Enter\") {\n if (!open) return;\n event.preventDefault();\n const pick = options[active] ?? options[0];\n if (pick) choose(pick);\n } else if (event.key === \"Escape\") {\n if (!open) return;\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n setActive(-1);\n }\n }\n\n const error = linkType === \"external\" ? href : page;\n const activeId = active >= 0 && open ? `${id}-option-${active}` : undefined;\n\n return (\n <div className=\"field-type bl-link-field\">\n <style href=\"bl-link-field\" precedence=\"default\">\n {CSS}\n </style>\n <FieldLabel htmlFor={inputId} label={LABEL} required={required} />\n <div className=\"bl-link-field__control\">\n {kind === \"page\" ? (\n <>\n <span className=\"bl-link-field__kind\">Page</span>\n <span className=\"bl-link-field__value\">\n {stored?.doc ? (\n <>\n {String(stored.doc[titleKey as keyof LinkPageDoc] ?? stored.doc.id)}\n <span className=\"bl-link-field__path\">{pagePath(stored.doc)}</span>\n </>\n ) : stored?.missing ? (\n `Page ${String(pageId)}`\n ) : (\n \"…\"\n )}\n </span>\n </>\n ) : kind === \"external\" ? (\n <>\n <span className=\"bl-link-field__kind\">External</span>\n <span className=\"bl-link-field__value\">{href.value}</span>\n </>\n ) : (\n <input\n ref={inputRef}\n id={inputId}\n type=\"text\"\n role=\"combobox\"\n className=\"bl-link-field__input\"\n placeholder={PLACEHOLDER}\n autoComplete=\"off\"\n disabled={readOnly}\n value={query}\n aria-expanded={open}\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeId}\n onChange={(event) => {\n setQuery(event.target.value);\n setActive(-1);\n setOpen(true);\n }}\n onFocus={() => setOpen(true)}\n onBlur={() => setOpen(false)}\n onKeyDown={onKeyDown}\n />\n )}\n {kind && !readOnly ? (\n <button\n type=\"button\"\n className=\"bl-link-field__clear\"\n aria-label=\"Clear\"\n onClick={clear}\n >\n ×\n </button>\n ) : null}\n {open && !kind ? (\n <ul id={listId} role=\"listbox\" className=\"bl-link-field__menu\">\n {options.map((option, i) => (\n <li\n key={option.kind === \"page\" ? String(option.page.id) : option.href}\n id={`${id}-option-${i}`}\n role=\"option\"\n aria-selected={i === active}\n className=\"bl-link-field__option\"\n onMouseDown={(event) => {\n event.preventDefault();\n choose(option);\n }}\n onMouseEnter={() => setActive(i)}\n >\n {option.kind === \"page\" ? (\n <>\n <span>\n {String(option.page[titleKey as keyof LinkPageDoc] ?? option.page.id)}\n </span>\n <span className=\"bl-link-field__path\">{pagePath(option.page)}</span>\n </>\n ) : (\n <>\n <span>Link to this URL</span>\n <span className=\"bl-link-field__path\">{option.href}</span>\n </>\n )}\n </li>\n ))}\n {options.length === 0 && !loading ? (\n <li role=\"presentation\" className=\"bl-link-field__empty\">\n {NO_MATCH}\n </li>\n ) : null}\n </ul>\n ) : null}\n </div>\n {kind === \"page\" && stored && (stored.missing || stored.doc?._status === \"draft\") ? (\n <div role=\"status\" className=\"bl-link-field__warning\">\n {stored.missing ? MISSING : UNPUBLISHED}\n </div>\n ) : null}\n <FieldDescription description={DESCRIPTION} path={paths.page} />\n <FieldError\n path={error.path}\n showError={error.showError}\n message={error.errorMessage}\n />\n </div>\n );\n};\n\n/** Theme variables only: a literal colour would be right in one theme and wrong in the other. */\nconst CSS = `\n.bl-link-field__control{position:relative;display:flex;align-items:center;gap:calc(var(--base) * .4);min-height:calc(var(--base) * 2);padding:calc(var(--base) * .25) calc(var(--base) * .6);border:1px solid var(--theme-elevation-150);border-radius:var(--style-radius-s);background:var(--theme-input-bg);color:var(--theme-elevation-800);font-family:var(--font-body)}\n.bl-link-field__control:focus-within{border-color:var(--theme-elevation-400);box-shadow:0 0 0 1px var(--theme-elevation-400)}\n.bl-link-field__input{flex:1;min-width:0;border:0;background:transparent;color:inherit;font:inherit;outline:none}\n.bl-link-field__input::placeholder{color:var(--theme-elevation-400)}\n.bl-link-field__input:disabled{color:var(--theme-elevation-400)}\n.bl-link-field__kind{flex:none;padding:2px 6px;border-radius:var(--style-radius-s);background:var(--theme-elevation-100);color:var(--theme-elevation-600);font-size:10.5px;letter-spacing:.05em;text-transform:uppercase}\n.bl-link-field__value{flex:1;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:500}\n.bl-link-field__path{margin-left:calc(var(--base) * .4);color:var(--theme-elevation-500);font-family:var(--font-mono);font-size:11.5px;font-weight:400}\n.bl-link-field__clear{flex:none;width:calc(var(--base) * 1.2);height:calc(var(--base) * 1.2);border:0;border-radius:var(--style-radius-s);background:transparent;color:var(--theme-elevation-500);font-size:18px;line-height:1;cursor:pointer}\n.bl-link-field__clear:hover,.bl-link-field__clear:focus-visible{background:var(--theme-elevation-100);color:var(--theme-elevation-800);outline:none}\n.bl-link-field__menu{position:absolute;left:-1px;right:-1px;top:calc(100% + 4px);z-index:10;margin:0;padding:calc(var(--base) * .2) 0;list-style:none;border:1px solid var(--theme-elevation-150);border-radius:var(--style-radius-s);background:var(--theme-elevation-0);box-shadow:0 8px 24px var(--theme-overlay)}\n.bl-link-field__option{display:flex;justify-content:space-between;gap:calc(var(--base) * .6);padding:calc(var(--base) * .35) calc(var(--base) * .6);cursor:pointer}\n.bl-link-field__option[aria-selected=\"true\"]{background:var(--theme-elevation-100)}\n.bl-link-field__empty{padding:calc(var(--base) * .5) calc(var(--base) * .6);color:var(--theme-elevation-500)}\n.bl-link-field__warning{display:flex;align-items:baseline;gap:calc(var(--base) * .3);margin-top:calc(var(--base) * .3);color:var(--theme-warning-600);font-size:12px}\n.bl-link-field__warning::before{content:\"\";flex:none;width:8px;height:8px;border-radius:50%;background:var(--theme-warning-500);transform:translateY(-1px)}\n`;\n","import { ArrayField, toast, useField, useTranslation } from \"@payloadcms/ui\";\nimport type { ArrayFieldClientComponent, ArrayFieldClientProps } from \"payload\";\nimport { useCallback, useRef } from \"react\";\n\n/**\n * Payload's array field, with *Remove* refused once the rows are down to\n * `minRows`.\n *\n * This wraps the stock `ArrayField` rather than re-implementing it, so every\n * upstream behaviour (sorting, copy/paste, collapse, localisation) stays put\n * and a Payload upgrade carries it along. The catch is where the row menu\n * lives: Payload portals it into `document.body`, out of reach of any CSS or\n * form context this wrapper could scope. What still reaches the wrapper is\n * the React event: synthetic events bubble through portals along the\n * component tree, so a capture handler here sees the click on *Remove*\n * before the menu's own handler does, and can stop it.\n *\n * Because the menu is portaled, the DOM cannot say whether a given *Remove*\n * belongs to this array or to an array nested inside one of its rows. The\n * trigger that opened the menu *is* in the DOM, though, and every menu opens\n * from its trigger. So the handler remembers, per menu opening, whether the\n * trigger sat directly in this field, and only gates the *Remove* that follows.\n */\nexport const MinRowsArrayField: ArrayFieldClientComponent = (props) => {\n const { field, path: pathFromProps } = props;\n const minRows = field.minRows ?? (field.required ? 1 : 0);\n\n const { rows = [] } = useField({\n hasRows: true,\n potentiallyStalePath: pathFromProps,\n });\n const { i18n, t } = useTranslation();\n\n const rootRef = useRef<HTMLDivElement>(null);\n const menuIsOurs = useRef(false);\n\n const onClickCapture = useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const trigger = target.closest(\".array-actions__button\");\n if (trigger) {\n // The nearest array or blocks field around the trigger is the field\n // whose menu is opening. Ours is the first one inside the wrapper.\n const owner = trigger.closest(\".array-field, .blocks-field\");\n menuIsOurs.current =\n owner !== null && owner === rootRef.current?.querySelector(\".array-field\");\n return;\n }\n\n if (!target.closest(\".array-actions__remove\")) return;\n if (!menuIsOurs.current || rows.length > minRows) return;\n\n event.preventDefault();\n event.stopPropagation();\n toast.error(\n t(\"validation:requiresAtLeast\", {\n count: minRows,\n label: rowLabel(field, minRows, i18n.language) ??\n t(minRows > 1 ? \"general:rows\" : \"general:row\"),\n }),\n );\n },\n [field, i18n.language, minRows, rows.length, t],\n );\n\n return (\n <div ref={rootRef} onClickCapture={onClickCapture}>\n <ArrayField {...props} />\n </div>\n );\n};\n\n/**\n * The word for a row, as Payload's own \"requires at least\" banner picks it:\n * the plural label above one, the singular otherwise, the field label failing\n * both. Client-side labels are static — a string or a per-language record.\n */\nfunction rowLabel(\n field: ArrayFieldClientProps[\"field\"],\n minRows: number,\n language: string,\n): string | undefined {\n const label = minRows > 1 ? field.labels?.plural : field.labels?.singular;\n return staticLabel(label, language) ?? staticLabel(field.label, language);\n}\n\nfunction staticLabel(label: unknown, language: string): string | undefined {\n if (typeof label === \"string\") return label;\n if (label && typeof label === \"object\") {\n const byLanguage = label as Record<string, string | undefined>;\n return byLanguage[language] ?? byLanguage.en ?? Object.values(byLanguage)[0];\n }\n return undefined;\n}\n","import {\n FieldError,\n FieldPathContext,\n useConfig,\n useField,\n useForm,\n useTheme,\n} from \"@payloadcms/ui\";\nimport {\n Button,\n Canvas,\n Checkbox,\n ConfirmDialog,\n Dialog,\n Field,\n Fold,\n Input,\n ItemRail,\n KitProvider,\n Kicker,\n Label,\n KindGlyph,\n MainHead,\n RailSlot,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Textarea,\n Stack,\n TypeCard,\n TypeCards,\n type FoldAction,\n} from \"@bison-lab/admin-ui\";\nimport {\n resolveThemeIdentity,\n themeHeadFromDoc,\n type ThemeDoc,\n type ThemeIdentityFallback,\n} from \"@bison-lab/payload-core/theme\";\nimport type { BlocksFieldClientComponent } from \"payload\";\nimport { useEffect, useMemo, useState, type ReactNode } from \"react\";\n\nimport { headerItemsFromBlocks, type HeaderBlockRow } from \"../blocks/mega-menu/header\";\nimport {\n resolveAdminPreviewLink,\n type LinkDestination,\n type LinkPageDoc,\n} from \"../fields/link\";\nimport { LinkField } from \"./link-field\";\n\n/**\n * Kit editor for `header.items`. Replaces Payload's stock blocks UI.\n * Primitives come from `@bison-lab/admin-ui`.\n */\n\ntype NavRow = HeaderBlockRow & { id?: string | null; panel?: MegaPanel | null };\n\ninterface MegaPanel {\n maxWidth?: \"narrow\" | \"standard\" | \"wide\" | null;\n columns?: MegaColumn[] | null;\n footer?: {\n overview?: Record<string, unknown>;\n cta?: Record<string, unknown>;\n };\n}\n\ninterface MegaColumn {\n width?: string | null;\n divider?: boolean | null;\n sections?: MegaSection[] | null;\n}\n\ninterface MegaSection {\n eyebrow?: string | null;\n display?: \"featured\" | \"list\" | null;\n hideDescriptionsOnMobile?: boolean | null;\n links?: Record<string, unknown>[] | null;\n}\n\nconst WIDTHS = [\"25\", \"33\", \"50\", \"66\", \"75\", \"100\"] as const;\n\nconst LINK_ROW = {\n type: \"row\" as const,\n fields: [\n { name: \"type\", type: \"radio\" },\n { name: \"page\", type: \"relationship\", relationTo: \"pages\" },\n { name: \"href\", type: \"text\" },\n ],\n};\n\nconst emptySection = (): MegaSection => ({\n display: \"list\",\n hideDescriptionsOnMobile: true,\n links: [],\n});\n\nconst emptyColumn = (): MegaColumn => ({\n width: \"100\",\n divider: false,\n sections: [emptySection()],\n});\n\nconst emptyPanel = (): MegaPanel => ({\n maxWidth: \"standard\",\n columns: [emptyColumn()],\n footer: { overview: {}, cta: {} },\n});\n\nconst emptyLink = (): Record<string, unknown> => ({\n blockType: \"navLink\",\n label: \"New item\",\n type: \"page\",\n page: null,\n href: null,\n newTab: false,\n});\n\nconst emptyMega = (): Record<string, unknown> => ({\n blockType: \"megaMenu\",\n label: \"New item\",\n type: \"page\",\n page: null,\n href: null,\n newTab: false,\n panel: emptyPanel(),\n});\n\nfunction destinationOf(row: NavRow) {\n return {\n type: row.type,\n page: row.page,\n href: row.href,\n newTab: row.newTab,\n label: row.label,\n };\n}\n\n/** Missing Theme fields so `themeHeadFromDoc` can run; the fetched document wins. */\nconst THEME_SEED: Parameters<typeof themeHeadFromDoc>[1] = {\n brandPrimary: \"#1e3a5f\",\n brandSecondary: \"#2d9d6e\",\n brandAccent: \"#e89b20\",\n brandHighlight: \"#7c3aed\",\n brandSuccess: \"#22c55e\",\n brandDestructive: \"#b91c1c\",\n greyScale: \"slate\",\n darkSelector: '[data-theme=\"dark\"]',\n defaultTheme: \"system\",\n radius: \"rounded\",\n shadow: \"subtle\",\n motion: \"smooth\",\n density: \"default\",\n fontBody: \"inter\",\n fontHeading: \"playfair-display\",\n fontWeights: { normal: 400, medium: 500, semibold: 600, bold: 700 },\n};\n\nconst THEME_SCOPE = \".bl-nav-items\";\n\nfunction scopeThemeCss(css: string) {\n return css\n .replace(/:root/g, THEME_SCOPE)\n .replace(\n /\\[data-theme=\"dark\"\\]/g,\n `${THEME_SCOPE}[data-theme=\"dark\"], ${THEME_SCOPE} [data-theme=\"dark\"]`,\n );\n}\n\nfunction identityFallbackFromConfig(config: {\n globals?: { slug?: string; admin?: { custom?: { identityFallback?: ThemeIdentityFallback } } }[];\n}): ThemeIdentityFallback | undefined {\n return config.globals?.find((global) => global.slug === \"theme\")?.admin?.custom?.identityFallback;\n}\n\nfunction lockupSrc(\n asset: { url: string; alt: string } | null | undefined,\n serverURL: string,\n): { url: string; alt: string } | null {\n if (!asset?.url) return null;\n const url =\n /^https?:\\/\\//.test(asset.url) || asset.url.startsWith(\"/\")\n ? asset.url\n : `${serverURL}/${asset.url}`;\n return { url, alt: asset.alt };\n}\n\nfunction pageIdOf(value: unknown): string | null {\n if (value == null) return null;\n if (typeof value === \"object\") {\n const id = (value as LinkPageDoc).id;\n return id == null ? null : String(id);\n }\n return String(value);\n}\n\nfunction ctaPathFromItems(itemsPath: string) {\n return itemsPath.endsWith(\".items\") ? `${itemsPath.slice(0, -\".items\".length)}.cta` : \"header.cta\";\n}\n\nfunction collectPageIds(items: NavRow[], extra?: LinkDestination | Record<string, unknown> | null): string[] {\n const ids = new Set<string>();\n const take = (link: LinkDestination | Record<string, unknown> | null | undefined) => {\n const id = pageIdOf(link?.page);\n if (id) ids.add(id);\n };\n take(extra);\n for (const row of items) {\n take(row);\n const panel = row.panel;\n take(panel?.footer?.overview);\n take(panel?.footer?.cta);\n for (const column of panel?.columns ?? []) {\n for (const section of column.sections ?? []) {\n for (const link of section.links ?? []) take(link);\n }\n }\n }\n return [...ids];\n}\n\nfunction ComposedLinkField({\n path,\n parentPath,\n readOnly,\n}: {\n path: string;\n parentPath: string;\n readOnly?: boolean;\n}) {\n return (\n <FieldPathContext.Provider value={path}>\n <LinkField\n field={LINK_ROW as never}\n path={path}\n parentPath={parentPath}\n indexPath=\"0\"\n schemaPath={path}\n readOnly={readOnly}\n />\n </FieldPathContext.Provider>\n );\n}\n\nexport const NavItemsField: BlocksFieldClientComponent = ({ field, path, readOnly }) => {\n const itemsField = useField({ path, hasRows: true });\n const { addFieldRow, replaceFieldRow, getDataByPath } = useForm();\n // Blocks store a row count on `value`; rows live in form data.\n const rowCount = Array.isArray(itemsField.rows) ? itemsField.rows.length : itemsField.value;\n const fromPath = getDataByPath?.(path);\n const items: NavRow[] = Array.isArray(fromPath)\n ? (fromPath as NavRow[])\n : Array.isArray(itemsField.value)\n ? (itemsField.value as NavRow[])\n : [];\n void rowCount;\n const ctaPath = ctaPathFromItems(path);\n const ctaField = useField<Record<string, unknown>>({ path: ctaPath });\n const ctaEnabled = useField<boolean>({ path: `${ctaPath}.enabled` });\n const ctaLabel = useField<string>({ path: `${ctaPath}.label` });\n const ctaPage = useField({ path: `${ctaPath}.page` });\n const ctaHrefField = useField<string>({ path: `${ctaPath}.href` });\n const ctaType = useField<string>({ path: `${ctaPath}.type` });\n const ctaSnapshot = (ctaField.value ?? {}) as LinkDestination & {\n enabled?: boolean | null;\n label?: string | null;\n };\n const cta = {\n ...ctaSnapshot,\n enabled: ctaEnabled.value ?? ctaSnapshot.enabled,\n label: ctaLabel.value ?? ctaSnapshot.label,\n page: ctaPage.value ?? ctaSnapshot.page,\n href: ctaHrefField.value ?? ctaSnapshot.href,\n type: ctaType.value ?? ctaSnapshot.type,\n };\n const ctaOn = cta.enabled !== false && Boolean(cta.label || cta.page || cta.href || cta.enabled);\n const { config } = useConfig();\n const endpoint = `${config.serverURL}${config.routes.api}`;\n\n const [selected, setSelected] = useState(0);\n const [adding, setAdding] = useState(false);\n const [confirmSwitch, setConfirmSwitch] = useState(false);\n const { theme, setTheme } = useTheme();\n const previewDark = theme === \"dark\";\n const identityFallback = identityFallbackFromConfig(config);\n\n useEffect(() => {\n if (selected >= items.length) setSelected(Math.max(0, items.length - 1));\n }, [items.length, selected]);\n\n const current = items[selected];\n const [pages, setPages] = useState<Map<string, LinkPageDoc>>(() => new Map());\n const pageIds = useMemo(() => collectPageIds(items, cta).sort().join(\",\"), [items, cta]);\n useEffect(() => {\n const ids = pageIds ? pageIds.split(\",\") : [];\n if (ids.length === 0) return;\n let cancelled = false;\n Promise.all(\n ids.map((id) =>\n fetch(`${endpoint}/pages/${id}?depth=0`, { credentials: \"include\" }).then((response) =>\n response.ok ? (response.json() as Promise<LinkPageDoc>) : null,\n ),\n ),\n )\n .then((docs) => {\n if (cancelled) return;\n setPages(() => {\n const next = new Map<string, LinkPageDoc>();\n for (const doc of docs) {\n if (doc?.id != null) next.set(String(doc.id), doc);\n }\n return next;\n });\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n }, [pageIds, endpoint]);\n\n const previewItems = useMemo(\n () =>\n headerItemsFromBlocks(items, {\n resolveLink: (link) => resolveAdminPreviewLink(link, pages),\n }),\n [items, pages],\n );\n const [hoverItem, setHoverItem] = useState<string | null>(null);\n const openItem =\n hoverItem && items.some((row) => row.label === hoverItem && row.blockType === \"megaMenu\")\n ? hoverItem\n : undefined;\n const openRow = items.find((row) => row.label === openItem && row.blockType === \"megaMenu\");\n const openIndex = openRow ? items.indexOf(openRow) : -1;\n\n function add(blockType: \"navLink\" | \"megaMenu\") {\n const seed = blockType === \"navLink\" ? emptyLink() : emptyMega();\n const subFieldState = Object.fromEntries(\n Object.entries(seed)\n .filter(([key]) => key !== \"blockType\")\n .map(([key, value]) => [key, { value, valid: true, initialValue: value }]),\n );\n addFieldRow({ path, schemaPath: path, blockType, subFieldState });\n setSelected(items.length);\n setAdding(false);\n }\n\n function switchToLink() {\n if (!current) return;\n replaceFieldRow({\n path,\n schemaPath: path,\n rowIndex: selected,\n blockType: \"navLink\",\n subFieldState: {\n label: { value: current.label, valid: true },\n type: { value: current.type, valid: true },\n page: { value: current.page, valid: true },\n href: { value: current.href, valid: true },\n newTab: { value: current.newTab, valid: true },\n },\n });\n setConfirmSwitch(false);\n }\n\n function switchToMega() {\n if (!current) return;\n replaceFieldRow({\n path,\n schemaPath: path,\n rowIndex: selected,\n blockType: \"megaMenu\",\n subFieldState: {\n ...Object.fromEntries(\n Object.entries(destinationOf(current)).map(([key, value]) => [\n key,\n { value, valid: true },\n ]),\n ),\n panel: { value: emptyPanel(), valid: true },\n },\n });\n }\n\n function requestType(next: \"navLink\" | \"megaMenu\") {\n if (!current || current.blockType === next) return;\n if (current.blockType === \"megaMenu\" && next === \"navLink\") {\n setConfirmSwitch(true);\n return;\n }\n switchToMega();\n }\n\n function onPreviewClick(event: React.MouseEvent) {\n const target = event.target as HTMLElement;\n if (target.closest(\"a[href]\")) event.preventDefault();\n const label = target.closest(\"[data-preview-item]\")?.getAttribute(\"data-preview-item\");\n if (!label) return;\n const index = items.findIndex((row) => row.label === label);\n if (index >= 0) {\n setSelected(index);\n setHoverItem(label);\n }\n }\n\n const [themeCss, setThemeCss] = useState(\"\");\n const [lockup, setLockup] = useState<{ url: string; alt: string } | null>(() =>\n lockupSrc(identityFallback?.lockup, config.serverURL),\n );\n useEffect(() => {\n let cancelled = false;\n fetch(`${endpoint}/globals/theme?depth=1`, { credentials: \"include\" })\n .then((response) => (response.ok ? (response.json() as Promise<ThemeDoc>) : null))\n .then((doc) => {\n if (cancelled) return;\n if (doc) setThemeCss(scopeThemeCss(themeHeadFromDoc(doc, THEME_SEED).css));\n setLockup(lockupSrc(resolveThemeIdentity(doc, identityFallback).lockup, config.serverURL));\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n }, [config.serverURL, endpoint, identityFallback]);\n const ctaHref = resolveAdminPreviewLink(cta as LinkDestination, pages);\n\n void field;\n\n return (\n <KitProvider>\n <div className=\"bl-nav-items field-type\">\n <style href=\"bl-nav-items\" precedence=\"default\">\n {CSS}\n </style>\n {themeCss ? <style href=\"bl-nav-items-theme\" precedence=\"default\">{themeCss}</style> : null}\n\n <ItemRail>\n <div className=\"bl-nav-items__rail-body\">\n <ul className=\"bl-nav-items__list\" aria-label=\"Menu items\">\n {items.map((row, index) => (\n <li key={String(row.id ?? index)} data-selected={index === selected ? \"true\" : \"false\"}>\n <div className=\"bl-nav-items__rail-row\">\n <KindGlyph kind={row.blockType === \"megaMenu\" ? \"megaMenu\" : \"navLink\"} />\n <button type=\"button\" className=\"bl-nav-items__rail-label\" onClick={() => setSelected(index)}>\n {row.label || \"Untitled\"}\n </button>\n {readOnly ? null : (\n <RowMenu\n label={row.label || \"Item\"}\n index={index}\n count={items.length}\n path={path}\n onMoved={(to) => setSelected(to)}\n />\n )}\n </div>\n {index === selected ? (\n <div className=\"bl-nav-items__rail-edit\">\n <TypeCards compact>\n <TypeCard\n icon={<KindGlyph kind=\"navLink\" />}\n label=\"Link\"\n active={row.blockType === \"navLink\"}\n onClick={() => requestType(\"navLink\")}\n />\n <TypeCard\n icon={<KindGlyph kind=\"megaMenu\" />}\n label=\"Mega\"\n active={row.blockType === \"megaMenu\"}\n onClick={() => requestType(\"megaMenu\")}\n />\n </TypeCards>\n <ItemBasics path={path} index={index} readOnly={readOnly} />\n </div>\n ) : null}\n </li>\n ))}\n </ul>\n {readOnly ? null : (\n <Button variant=\"outline\" className=\"bl-nav-items__add\" onClick={() => setAdding(true)}>\n Add item\n </Button>\n )}\n </div>\n <RailSlot>\n <HeaderCta path={ctaPath} readOnly={readOnly} />\n </RailSlot>\n </ItemRail>\n\n <Canvas>\n {current?.blockType === \"megaMenu\" ? (\n <MainHead\n kicker=\"Editing mega menu\"\n title={current.label || \"Menu items\"}\n description=\"Configure the dropdown layout, sections, links, and footer.\"\n />\n ) : items.length === 0 ? (\n <MainHead\n kicker=\"Header\"\n title=\"Menu items\"\n description=\"Add a link or a mega menu to start the header.\"\n />\n ) : null}\n <div\n className=\"bl-nav-items__preview-block\"\n data-preview-chrome\n data-sticky=\"true\"\n data-theme={previewDark ? \"dark\" : \"light\"}\n onClick={onPreviewClick}\n onMouseLeave={(event) => {\n const next = event.relatedTarget;\n if (next instanceof Node && event.currentTarget.contains(next)) return;\n setHoverItem(null);\n }}\n >\n <div className=\"bl-nav-items__preview\">\n <Kicker>This is just a preview</Kicker>\n <PreviewNav\n items={items\n .filter((row) => row.label)\n .map((row) => {\n const mapped = previewItems.find((item) => item.label === row.label);\n return {\n label: row.label!,\n href: mapped?.href ?? resolveAdminPreviewLink(row, pages) ?? undefined,\n content: row.blockType === \"megaMenu\" ? true : mapped?.content,\n items: mapped?.items,\n };\n })}\n lockup={lockup}\n onLockupError={() => {\n const next = lockupSrc(identityFallback?.lockup, config.serverURL);\n setLockup((current) => (current?.url === next?.url ? null : next));\n }}\n actions={\n <>\n <PreviewThemeToggle\n dark={previewDark}\n onToggle={() => setTheme(previewDark ? \"light\" : \"dark\")}\n />\n {ctaOn && ctaHref && cta.label ? (\n <a href={ctaHref} className=\"bl-nav-items__preview-cta\">\n {cta.label}\n </a>\n ) : null}\n </>\n }\n openItem={openItem}\n onItemEnter={(label) => setHoverItem(label)}\n />\n </div>\n {openRow ? (\n <div\n className=\"bl-nav-items__preview-stage\"\n data-testid=\"nav-items-preview-mega\"\n onMouseEnter={() => openItem && setHoverItem(openItem)}\n >\n <PreviewMega path={path} index={openIndex} row={openRow} pages={pages} />\n </div>\n ) : null}\n </div>\n\n {current?.blockType === \"megaMenu\" ? (\n <MegaEditor\n path={path}\n index={selected}\n panel={current.panel ?? emptyPanel()}\n readOnly={Boolean(readOnly)}\n />\n ) : items.length === 0 ? (\n <p className=\"bl-nav-items__empty\">Add a link or a mega menu to start the header.</p>\n ) : null}\n </Canvas>\n\n <Dialog open={adding} title=\"Add menu item\" onCancel={() => setAdding(false)}>\n <TypeCards>\n <TypeCard\n icon={<KindGlyph kind=\"navLink\" />}\n label=\"Plain link\"\n description=\"A bar item that goes to a page or URL.\"\n onClick={() => add(\"navLink\")}\n />\n <TypeCard\n icon={<KindGlyph kind=\"megaMenu\" />}\n label=\"Mega menu\"\n description=\"A dropdown of columns, sections, and an optional footer.\"\n onClick={() => add(\"megaMenu\")}\n />\n </TypeCards>\n </Dialog>\n\n <ConfirmDialog\n open={confirmSwitch}\n title=\"Switch to a plain link?\"\n cancelLabel=\"Keep mega menu\"\n confirmLabel=\"Switch to link\"\n onCancel={() => setConfirmSwitch(false)}\n onConfirm={switchToLink}\n >\n This drops the columns, sections, and footer. The label and destination stay.\n </ConfirmDialog>\n </div>\n </KitProvider>\n );\n};\n\nfunction PreviewThemeToggle({ dark, onToggle }: { dark: boolean; onToggle: () => void }) {\n return (\n <button\n type=\"button\"\n className=\"bl-nav-items__preview-theme\"\n aria-label={dark ? \"Switch to light mode\" : \"Switch to dark mode\"}\n onClick={(event) => {\n event.stopPropagation();\n onToggle();\n }}\n >\n {dark ? (\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" aria-hidden>\n <path d=\"M21 14.5A8.5 8.5 0 1 1 9.5 3 7 7 0 0 0 21 14.5z\" />\n </svg>\n ) : (\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <path d=\"M12 3v2M12 19v2M3 12h2M19 12h2M5.6 5.6l1.4 1.4M17 17l1.4 1.4M18.4 5.6 17 7M7 17l-1.4 1.4\" />\n </svg>\n )}\n </button>\n );\n}\n\n/**\n * Kit island, not `FloatingNavBlock`. Payload admin does not load the\n * site Tailwind preset or `BisonProvider`; the live block (and\n * `ThemeToggle`) throw or render unstyled there. Theme Identity still\n * comes from `/api/globals/theme`. The public header stays\n * `headerFromNavigation` → `FloatingNavBlock` (SPI-99).\n */\nfunction PreviewNav({\n items,\n lockup,\n onLockupError,\n actions,\n openItem,\n onItemEnter,\n}: {\n items: { label: string; href?: string; content?: unknown; items?: unknown[] }[];\n lockup: { url: string; alt: string } | null;\n onLockupError: () => void;\n actions?: ReactNode;\n openItem?: string;\n onItemEnter?: (label: string) => void;\n}) {\n return (\n <nav\n aria-label=\"Main\"\n className=\"bl-nav-items__preview-nav\"\n data-open-item={openItem ?? \"\"}\n data-has-logo={lockup ? \"yes\" : \"no\"}\n data-has-actions={actions ? \"yes\" : \"no\"}\n >\n <div className=\"bl-nav-items__preview-logo\">\n {lockup ? (\n <img src={lockup.url} alt={lockup.alt} height={20} onError={onLockupError} />\n ) : null}\n </div>\n <div className=\"bl-nav-items__preview-links\">\n {items.map((item) => (\n <button\n key={item.label}\n type=\"button\"\n className={\n openItem === item.label\n ? \"bl-nav-items__preview-link is-open\"\n : \"bl-nav-items__preview-link\"\n }\n data-preview-item={item.label}\n data-href={item.href ?? \"\"}\n aria-label={`Preview ${item.label}`}\n onMouseEnter={() => onItemEnter?.(item.label)}\n >\n {item.label}\n {item.content || item.items?.length ? <PreviewChevron /> : null}\n </button>\n ))}\n </div>\n <div className=\"bl-nav-items__preview-actions\">{actions}</div>\n </nav>\n );\n}\n\nconst PREVIEW_MAX_WIDTH = { narrow: \"22rem\", standard: \"42rem\", wide: \"48rem\" } as const;\n\nconst PREVIEW_TRACKS: Record<string, number> = {\n \"25\": 3,\n \"33\": 4,\n \"50\": 6,\n \"66\": 8,\n \"75\": 9,\n \"100\": 12,\n};\n\nfunction previewColumnTrack(width: string | null | undefined) {\n const key = String(width ?? \"100\");\n return `minmax(0, ${PREVIEW_TRACKS[key] ?? Math.max(1, Number(key) || 1)}fr)`;\n}\n\nfunction PreviewMega({\n path,\n index,\n row,\n pages,\n}: {\n path: string;\n index: number;\n row: NavRow;\n pages: ReadonlyMap<string, LinkPageDoc>;\n}) {\n const panel = row.panel;\n const columns = panel?.columns ?? [];\n const maxWidthField = useField<string>({ path: `${path}.${index}.panel.maxWidth` });\n const width0 = useField<string>({ path: `${path}.${index}.panel.columns.0.width` });\n const width1 = useField<string>({ path: `${path}.${index}.panel.columns.1.width` });\n const width2 = useField<string>({ path: `${path}.${index}.panel.columns.2.width` });\n const width3 = useField<string>({ path: `${path}.${index}.panel.columns.3.width` });\n const divider1 = useField<boolean>({ path: `${path}.${index}.panel.columns.1.divider` });\n const divider2 = useField<boolean>({ path: `${path}.${index}.panel.columns.2.divider` });\n const divider3 = useField<boolean>({ path: `${path}.${index}.panel.columns.3.divider` });\n const liveWidths = [width0.value, width1.value, width2.value, width3.value];\n const liveDividers = [undefined, divider1.value, divider2.value, divider3.value];\n const maxWidthKey = (maxWidthField.value ?? panel?.maxWidth ?? \"standard\") as keyof typeof PREVIEW_MAX_WIDTH;\n const maxWidth = PREVIEW_MAX_WIDTH[maxWidthKey] ?? PREVIEW_MAX_WIDTH.standard;\n const complete = columns.some((column) =>\n (column.sections ?? []).some((section) =>\n (section.links ?? []).some((link) => {\n const item = link as LinkDestination & { label?: string | null };\n return Boolean(item.label && resolveAdminPreviewLink(item, pages));\n }),\n ),\n );\n const overview = panel?.footer?.overview as (LinkDestination & { label?: string | null }) | undefined;\n const cta = panel?.footer?.cta as (LinkDestination & { label?: string | null }) | undefined;\n const overviewHref = overview ? resolveAdminPreviewLink(overview, pages) : null;\n const ctaHref = cta ? resolveAdminPreviewLink(cta, pages) : null;\n const showFooter = Boolean((overview?.label && overviewHref) || (cta?.label && ctaHref));\n\n return (\n <div className=\"bl-nav-items__mega-preview\" style={{ maxWidth }}>\n {complete ? (\n <div\n className=\"bl-nav-items__preview-columns\"\n style={{\n gridTemplateColumns: columns\n .map((column, columnIndex) => previewColumnTrack(liveWidths[columnIndex] ?? column.width))\n .join(\" \"),\n }}\n >\n {columns.map((column, columnIndex) => (\n <div\n key={columnIndex}\n className={\n columnIndex > 0 && Boolean(liveDividers[columnIndex] ?? column.divider)\n ? \"bl-nav-items__preview-col has-border\"\n : \"bl-nav-items__preview-col\"\n }\n >\n {(column.sections ?? []).map((section, sectionIndex) => {\n const links = (section.links ?? []).flatMap((link, linkIndex) => {\n const item = link as LinkDestination & {\n label?: string | null;\n description?: string | null;\n };\n const href = resolveAdminPreviewLink(item, pages);\n if (!item.label || !href) return [];\n const featured = section.display === \"featured\";\n return [\n <div\n key={`${sectionIndex}-${linkIndex}`}\n className={featured ? \"bl-nav-items__preview-featured\" : \"bl-nav-items__preview-list-row\"}\n >\n {featured ? (\n <>\n <div className=\"title\">{item.label}</div>\n {item.description ? <small>{item.description}</small> : null}\n </>\n ) : (\n <div>\n <strong>{item.label}</strong>\n {item.description ? <small>{item.description}</small> : null}\n </div>\n )}\n </div>,\n ];\n });\n return (\n <div key={sectionIndex}>\n {section.eyebrow ? <div className=\"bl-nav-items__preview-eyebrow\">{section.eyebrow}</div> : null}\n {links.length ? links : <div className=\"bl-nav-items__preview-empty\">Empty section</div>}\n </div>\n );\n })}\n </div>\n ))}\n </div>\n ) : (\n <div className=\"bl-nav-items__preview-empty\">No complete links in this menu yet.</div>\n )}\n {showFooter ? (\n <div className=\"bl-nav-items__preview-footer\">\n {overview?.label && overviewHref ? <a href={overviewHref}>{overview.label}</a> : <span />}\n {cta?.label && ctaHref ? <span className=\"cta\">{cta.label}</span> : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction HeaderCta({ path, readOnly }: { path: string; readOnly?: boolean }) {\n const group = useField({ path });\n const enabled = useField<boolean>({ path: `${path}.enabled` });\n const label = useField<string>({ path: `${path}.label` });\n const page = useField({ path: `${path}.page` });\n const href = useField<string>({ path: `${path}.href` });\n const newTab = useField<boolean>({ path: `${path}.newTab` });\n const on =\n enabled.value === true ||\n (enabled.value !== false && Boolean(label.value || page.value || href.value));\n\n function setEnabled(next: boolean) {\n enabled.setValue(next);\n if (!next) {\n label.setValue(\"\");\n page.setValue(null);\n href.setValue(null);\n newTab.setValue(false);\n }\n }\n\n return (\n <fieldset className=\"bl-nav-items__header-cta\" aria-label=\"Header button\">\n <div className=\"bl-nav-items__header-cta-head\">\n <div>\n <h3>Header button</h3>\n <p>The pill on the right of the bar.</p>\n </div>\n </div>\n <CheckLabel\n className=\"bl-nav-items__header-cta-toggle\"\n checked={on}\n disabled={readOnly}\n onCheckedChange={setEnabled}\n >\n Show Header button\n </CheckLabel>\n {on ? (\n <>\n <Field>\n <Label>\n Label{\" \"}\n <span className=\"bl-nav-items__req\" aria-hidden>\n *\n </span>\n </Label>\n <Input\n value={label.value ?? \"\"}\n disabled={readOnly}\n onChange={(event) => label.setValue(event.target.value)}\n />\n </Field>\n <ComposedLinkField path={`${path}._index-0`} parentPath={path} readOnly={readOnly} />\n <CheckLabel\n checked={Boolean(newTab.value)}\n disabled={readOnly}\n onCheckedChange={(checked) => newTab.setValue(checked)}\n >\n Open in a new tab\n </CheckLabel>\n </>\n ) : null}\n <FieldError path={group.path} showError={group.showError} message={group.errorMessage} />\n </fieldset>\n );\n}\n\nfunction ItemBasics({\n path,\n index,\n readOnly,\n}: {\n path: string;\n index: number;\n readOnly?: boolean;\n}) {\n const label = useField<string>({ path: `${path}.${index}.label` });\n const newTab = useField<boolean>({ path: `${path}.${index}.newTab` });\n return (\n <div className=\"bl-nav-items__basics\">\n <Field>\n <Label>Label</Label>\n <Input\n value={label.value ?? \"\"}\n disabled={readOnly}\n onChange={(event) => label.setValue(event.target.value)}\n />\n </Field>\n <ComposedLinkField\n path={`${path}.${index}._index-0`}\n parentPath={`${path}.${index}`}\n readOnly={readOnly}\n />\n <CheckLabel\n checked={Boolean(newTab.value)}\n disabled={readOnly}\n onCheckedChange={(checked) => newTab.setValue(checked)}\n >\n Open in a new tab\n </CheckLabel>\n </div>\n );\n}\n\nfunction MegaEditor({\n path,\n index,\n panel,\n readOnly,\n}: {\n path: string;\n index: number;\n panel: MegaPanel;\n readOnly: boolean;\n}) {\n const { addFieldRow } = useForm();\n const columns = panel.columns ?? [];\n const columnsError = useField({ path: `${path}.${index}.panel.columns` });\n const columnsPath = `${path}.${index}.panel.columns`;\n const maxWidth = useField<string>({ path: `${path}.${index}.panel.maxWidth` });\n\n return (\n <div className=\"bl-nav-items__mega\">\n <div className=\"bl-nav-items__builder-head\">\n <div>\n <h2>Menu content</h2>\n <p>Set each column’s width here. The header preview is what shows the live layout.</p>\n </div>\n <label className=\"bl-nav-items__tool\">\n Panel width\n <Select\n value={maxWidth.value ?? panel.maxWidth ?? \"standard\"}\n disabled={readOnly}\n onValueChange={(value) => maxWidth.setValue(value)}\n >\n <SelectTrigger aria-label=\"Panel width\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"narrow\">Narrow</SelectItem>\n <SelectItem value=\"standard\">Standard</SelectItem>\n <SelectItem value=\"wide\">Wide</SelectItem>\n </SelectContent>\n </Select>\n </label>\n </div>\n\n <div\n className=\"bl-nav-items__columns\"\n data-testid=\"nav-items-columns\"\n style={{ gridTemplateColumns: \"repeat(2, minmax(0, 1fr))\" }}\n >\n {columns.map((column, columnIndex) => (\n <ColumnEditor\n key={columnIndex}\n path={path}\n itemIndex={index}\n columnIndex={columnIndex}\n column={column}\n readOnly={readOnly}\n columnCount={columns.length}\n />\n ))}\n </div>\n {readOnly || columns.length >= 4 ? null : (\n <Button\n variant=\"outline\"\n className=\"bl-nav-items__add-column\"\n onClick={() => {\n addFieldRow({\n path: columnsPath,\n schemaPath: columnsPath,\n subFieldState: {\n width: { value: \"25\", valid: true },\n divider: { value: true, valid: true },\n },\n });\n addFieldRow({\n path: `${columnsPath}.${columns.length}.sections`,\n schemaPath: `${columnsPath}.${columns.length}.sections`,\n subFieldState: {\n display: { value: \"list\", valid: true },\n hideDescriptionsOnMobile: { value: true, valid: true },\n },\n });\n }}\n >\n + Add column\n </Button>\n )}\n <FieldError\n path={columnsError.path}\n showError={columnsError.showError}\n message={columnsError.errorMessage}\n />\n\n <section className=\"bl-nav-items__footer\">\n <div className=\"bl-nav-items__footer-head\">\n <div>\n <h3>Footer</h3>\n <p>\n Optional links displayed below the menu columns. The overview is the section’s own\n landing page so it stays reachable from the bar.\n </p>\n </div>\n </div>\n <div className=\"bl-nav-items__footer-body\">\n <div className=\"bl-nav-items__footer-card\">\n <h4>Overview link</h4>\n <ComposedLinkField\n path={`${path}.${index}.panel.footer.overview._index-0`}\n parentPath={`${path}.${index}.panel.footer.overview`}\n readOnly={readOnly}\n />\n <Field>\n <Label>Label</Label>\n <FooterText path={`${path}.${index}.panel.footer.overview.label`} readOnly={readOnly} />\n </Field>\n </div>\n <div className=\"bl-nav-items__footer-card\">\n <h4>Call to action</h4>\n <ComposedLinkField\n path={`${path}.${index}.panel.footer.cta._index-0`}\n parentPath={`${path}.${index}.panel.footer.cta`}\n readOnly={readOnly}\n />\n <Field>\n <Label>Label</Label>\n <FooterText path={`${path}.${index}.panel.footer.cta.label`} readOnly={readOnly} />\n </Field>\n </div>\n </div>\n </section>\n </div>\n );\n}\n\nfunction RowMenu({\n label,\n index,\n count,\n path,\n allowRemove = true,\n onMoved,\n}: {\n label: string;\n index: number;\n count: number;\n path: string;\n allowRemove?: boolean;\n onMoved?: (to: number) => void;\n}) {\n const [open, setOpen] = useState(false);\n const { moveFieldRow, removeFieldRow } = useForm();\n return (\n <div className=\"bl-nav-items__menu\">\n <button type=\"button\" aria-label={`${label} actions`} onClick={() => setOpen((next) => !next)}>\n ⋯\n </button>\n {open ? (\n <div className=\"bl-nav-items__menu-pop\">\n <button\n type=\"button\"\n disabled={index === 0}\n onClick={() => {\n moveFieldRow({ path, moveFromIndex: index, moveToIndex: index - 1 });\n onMoved?.(index - 1);\n setOpen(false);\n }}\n >\n Move up\n </button>\n <button\n type=\"button\"\n disabled={index === count - 1}\n onClick={() => {\n moveFieldRow({ path, moveFromIndex: index, moveToIndex: index + 1 });\n onMoved?.(index + 1);\n setOpen(false);\n }}\n >\n Move down\n </button>\n {allowRemove ? (\n <button\n type=\"button\"\n className=\"bl-nav-kit__danger\"\n onClick={() => {\n removeFieldRow({ path, rowIndex: index });\n setOpen(false);\n }}\n >\n Delete\n </button>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction useRowActions({\n index,\n count,\n path,\n allowRemove = true,\n onMoved,\n readOnly,\n}: {\n index: number;\n count: number;\n path: string;\n allowRemove?: boolean;\n onMoved?: (to: number) => void;\n readOnly?: boolean;\n}): FoldAction[] | undefined {\n const { moveFieldRow, removeFieldRow } = useForm();\n if (readOnly) return undefined;\n const actions: FoldAction[] = [\n {\n label: \"Move up\",\n disabled: index === 0,\n onClick: () => {\n moveFieldRow({ path, moveFromIndex: index, moveToIndex: index - 1 });\n onMoved?.(index - 1);\n },\n },\n {\n label: \"Move down\",\n disabled: index === count - 1,\n onClick: () => {\n moveFieldRow({ path, moveFromIndex: index, moveToIndex: index + 1 });\n onMoved?.(index + 1);\n },\n },\n ];\n if (allowRemove) {\n actions.push({\n label: \"Delete\",\n danger: true,\n onClick: () => removeFieldRow({ path, rowIndex: index }),\n });\n }\n return actions;\n}\n\nfunction MegaLinkEditor({\n path,\n arrayPath,\n index,\n count,\n label,\n readOnly,\n}: {\n path: string;\n arrayPath: string;\n index: number;\n count: number;\n label?: string | null;\n readOnly: boolean;\n}) {\n const description = useField<string>({ path: `${path}.description` });\n const newTab = useField<boolean>({ path: `${path}.newTab` });\n const name = label?.trim() || \"Untitled\";\n const actions = useRowActions({ index, count, path: arrayPath, readOnly });\n return (\n <Fold title={name} tone=\"dark\" actions={actions}>\n <Field>\n <Label>Label</Label>\n <FooterText path={`${path}.label`} readOnly={readOnly} />\n </Field>\n <ComposedLinkField path={`${path}._index-0`} parentPath={path} readOnly={readOnly} />\n <Field>\n <Label>Description</Label>\n <Textarea\n value={description.value ?? \"\"}\n disabled={readOnly}\n rows={2}\n onChange={(event) => description.setValue(event.target.value)}\n />\n </Field>\n <CheckLabel\n checked={Boolean(newTab.value)}\n disabled={readOnly}\n onCheckedChange={(checked) => newTab.setValue(checked)}\n >\n Open in a new tab\n </CheckLabel>\n </Fold>\n );\n}\n\nfunction FooterText({ path, readOnly }: { path: string; readOnly: boolean }) {\n const field = useField<string>({ path });\n return (\n <Input\n value={field.value ?? \"\"}\n disabled={readOnly}\n onChange={(event) => field.setValue(event.target.value)}\n />\n );\n}\n\nfunction PreviewChevron() {\n return (\n <svg\n className=\"bl-nav-items__preview-chevron\"\n viewBox=\"0 0 24 24\"\n width=\"12\"\n height=\"12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n\nfunction CheckLabel({\n checked,\n disabled,\n onCheckedChange,\n children,\n className,\n}: {\n checked: boolean;\n disabled?: boolean;\n onCheckedChange: (checked: boolean) => void;\n children: ReactNode;\n className?: string;\n}) {\n return (\n <label className={[\"bl-nav-items__check\", className].filter(Boolean).join(\" \")}>\n <Checkbox\n checked={checked}\n disabled={disabled}\n onCheckedChange={(value) => onCheckedChange(value === true)}\n />\n {children}\n </label>\n );\n}\n\nfunction ColumnEditor({\n path,\n itemIndex,\n columnIndex,\n column,\n readOnly,\n columnCount,\n}: {\n path: string;\n itemIndex: number;\n columnIndex: number;\n column: MegaColumn;\n readOnly: boolean;\n columnCount: number;\n}) {\n const { addFieldRow } = useForm();\n const width = useField<string>({ path: `${path}.${itemIndex}.panel.columns.${columnIndex}.width` });\n const divider = useField<boolean>({ path: `${path}.${itemIndex}.panel.columns.${columnIndex}.divider` });\n const columnsPath = `${path}.${itemIndex}.panel.columns`;\n const sectionsPath = `${path}.${itemIndex}.panel.columns.${columnIndex}.sections`;\n const sections = column.sections ?? [];\n const columnName = `Column ${columnIndex + 1}`;\n const actions = useRowActions({\n index: columnIndex,\n count: columnCount,\n path: columnsPath,\n allowRemove: columnCount > 1,\n readOnly,\n });\n\n return (\n <Fold\n title={columnName}\n tone=\"light\"\n badge={`${width.value ?? column.width ?? \"100\"}%`}\n meta={(open) =>\n open ? null : (\n <small>\n {sections.length} {sections.length === 1 ? \"section\" : \"sections\"}\n </small>\n )\n }\n actions={actions}\n >\n <Stack>\n <div className=\"bl-nav-items__column-settings\">\n <Field>\n <Label>Width</Label>\n <Select\n value={width.value ?? column.width ?? \"100\"}\n disabled={readOnly}\n onValueChange={(value) => width.setValue(value)}\n >\n <SelectTrigger aria-label=\"Width\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {WIDTHS.map((option) => (\n <SelectItem key={option} value={option}>\n {option}%\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </Field>\n {columnIndex > 0 ? (\n <CheckLabel\n checked={Boolean(divider.value ?? column.divider)}\n disabled={readOnly}\n onCheckedChange={(checked) => divider.setValue(checked)}\n >\n Draw a line on the left\n </CheckLabel>\n ) : null}\n </div>\n {sections.map((section, sectionIndex) => (\n <SectionEditor\n key={sectionIndex}\n path={path}\n itemIndex={itemIndex}\n columnIndex={columnIndex}\n sectionIndex={sectionIndex}\n section={section}\n readOnly={readOnly}\n sectionCount={sections.length}\n />\n ))}\n {readOnly || sections.length >= 8 ? null : (\n <Button\n variant=\"outline\"\n className=\"bl-nav-items__add-section\"\n onClick={() =>\n addFieldRow({\n path: sectionsPath,\n schemaPath: sectionsPath,\n subFieldState: {\n display: { value: \"list\", valid: true },\n hideDescriptionsOnMobile: { value: true, valid: true },\n },\n })\n }\n >\n + Add section to this column\n </Button>\n )}\n </Stack>\n </Fold>\n );\n}\n\nfunction SectionEditor({\n path,\n itemIndex,\n columnIndex,\n sectionIndex,\n section,\n readOnly,\n sectionCount,\n}: {\n path: string;\n itemIndex: number;\n columnIndex: number;\n sectionIndex: number;\n section: MegaSection;\n readOnly: boolean;\n sectionCount: number;\n}) {\n const { addFieldRow } = useForm();\n const base = `${path}.${itemIndex}.panel.columns.${columnIndex}.sections.${sectionIndex}`;\n const sectionsPath = `${path}.${itemIndex}.panel.columns.${columnIndex}.sections`;\n const display = useField<\"featured\" | \"list\">({ path: `${base}.display` });\n const eyebrow = useField<string>({ path: `${base}.eyebrow` });\n const hideMobile = useField<boolean>({ path: `${base}.hideDescriptionsOnMobile` });\n const links = section.links ?? [];\n const featured = (display.value ?? section.display) === \"featured\";\n const sectionName = eyebrow.value || section.eyebrow || \"Untitled section\";\n const actions = useRowActions({\n index: sectionIndex,\n count: sectionCount,\n path: sectionsPath,\n readOnly,\n });\n return (\n <Fold\n title={sectionName}\n tone=\"dark\"\n meta={(open) => (\n <>\n <small>{featured ? \"featured\" : \"list\"}</small>\n {open ? null : (\n <small>\n {links.length} {links.length === 1 ? \"link\" : \"links\"}\n </small>\n )}\n </>\n )}\n actions={actions}\n >\n <Stack>\n <div className=\"bl-nav-items__section-settings\">\n <Field>\n <Label>Eyebrow</Label>\n <Input\n value={eyebrow.value ?? section.eyebrow ?? \"\"}\n disabled={readOnly}\n placeholder=\"Optional heading\"\n onChange={(event) => eyebrow.setValue(event.target.value)}\n />\n </Field>\n <Field as=\"div\">\n <Label>Display</Label>\n <div className=\"bl-nav-items__seg\">\n <button\n type=\"button\"\n className={featured ? \"is-active\" : undefined}\n disabled={readOnly}\n onClick={() => display.setValue(\"featured\")}\n >\n Featured\n </button>\n <button\n type=\"button\"\n className={!featured ? \"is-active\" : undefined}\n disabled={readOnly}\n onClick={() => display.setValue(\"list\")}\n >\n List\n </button>\n </div>\n </Field>\n <CheckLabel\n checked={(hideMobile.value ?? section.hideDescriptionsOnMobile) !== false}\n disabled={readOnly}\n onCheckedChange={(checked) => hideMobile.setValue(checked)}\n >\n Hide descriptions on mobile\n </CheckLabel>\n </div>\n {links.map((link, linkIndex) => (\n <MegaLinkEditor\n key={linkIndex}\n path={`${base}.links.${linkIndex}`}\n arrayPath={`${base}.links`}\n index={linkIndex}\n count={links.length}\n label={(link as { label?: string | null }).label}\n readOnly={readOnly}\n />\n ))}\n {readOnly ? null : (\n <Button\n variant=\"outline\"\n className=\"bl-nav-items__inline-add\"\n onClick={() =>\n addFieldRow({\n path: `${base}.links`,\n schemaPath: `${base}.links`,\n subFieldState: {\n label: { value: \"New link\", valid: true },\n type: { value: \"page\", valid: true },\n },\n })\n }\n >\n + Add link\n </Button>\n )}\n </Stack>\n </Fold>\n );\n}\n\nconst CSS = `\n.bl-nav-items{--bg:var(--theme-bg,var(--theme-elevation-0,#fff));--panel:var(--theme-elevation-50,#f4f4f5);--panel2:var(--theme-elevation-100,#e4e4e7);--line:var(--theme-elevation-150,#e4e4e7);--line2:var(--theme-elevation-250,#d4d4d8);--text:var(--theme-text,var(--theme-elevation-800,#18181b));--muted:var(--theme-elevation-500,#71717a);--pink:var(--bl-kit-accent,#e60088);display:grid;grid-template-columns:300px minmax(0,1fr);grid-template-rows:minmax(0,1fr);min-height:0;background:var(--bg);color:var(--text);font:14px/1.45 Inter,ui-sans-serif,system-ui,sans-serif}\n.bl-nav-items button:not([class*=\"bl-nav-kit\"]),.bl-nav-items input:not([class*=\"bl-nav-kit\"]),.bl-nav-items select:not([class*=\"bl-nav-kit\"]),.bl-nav-items textarea:not([class*=\"bl-nav-kit\"]){font:inherit;color:inherit}\n.bl-workspace__rail{border-right:1px solid var(--line);background:var(--theme-elevation-50,var(--panel));min-width:0;min-height:0;height:100%;display:flex;flex-direction:column;overflow:hidden}\n.bl-nav-items__rail-body{padding:12px;flex:1;min-height:0;overflow:auto}\n.bl-workspace__rail-slot{flex:none;min-height:0;max-height:100%;overflow:auto;border-top:1px solid var(--line);background:var(--theme-elevation-0,var(--bg));padding:14px 12px 16px}\n.bl-nav-items__header-cta{margin:0;padding:0;border:0;min-width:0}\n.bl-nav-items__header-cta-head{display:flex;align-items:flex-start;gap:10px;margin-bottom:10px}\n.bl-nav-items__header-cta-head h3{margin:0;font-size:14px}\n.bl-nav-items__header-cta-head p{margin:3px 0 0;color:var(--muted);font-size:12px}\n.bl-nav-items__req{color:var(--pink)}\n.bl-nav-items__list{list-style:none;margin:0;padding:0}\n.bl-nav-items__list li{border:1px solid transparent;border-radius:9px;margin-bottom:7px}\n.bl-nav-items__list li[data-selected=\"true\"]{border-color:var(--line2);background:var(--theme-elevation-100,var(--panel2))}\n.bl-nav-items__rail-row{display:grid;grid-template-columns:20px 1fr auto;gap:8px;align-items:center;padding:6px 8px}\n.bl-nav-items__rail-label{border:0;background:transparent;text-align:left;font:inherit;font-weight:650;color:inherit;cursor:pointer;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.bl-nav-items__badge{width:28px;height:28px;display:grid;place-items:center;border-radius:7px;background:var(--theme-elevation-150,var(--line));color:var(--theme-elevation-800,var(--text))}\n.bl-nav-items__badge[data-kind=\"megaMenu\"]{background:color-mix(in srgb,var(--pink) 22%,var(--theme-elevation-0,var(--bg)));color:var(--pink)}\n.bl-nav-items__rail-edit{display:block;border-top:1px solid var(--line);padding:10px}\n.bl-nav-items__add,.bl-nav-items__add-section,.bl-nav-items__add-column,.bl-nav-items__inline-add{width:100%}\n.bl-nav-items__add-column{margin-top:12px}\n.bl-workspace__canvas{min-width:0;min-height:0;height:100%;overflow:auto;padding:0 28px 44px;max-width:1250px;margin:0 auto;width:100%}\n.bl-workspace__main-head{padding:18px 0 14px;display:flex;justify-content:space-between;align-items:flex-start}\n.bl-workspace__main-head h1{font-size:20px;margin:2px 0 4px}\n.bl-workspace__main-head p{margin:0;color:var(--muted)}\n.bl-nav-items__preview-block{position:sticky;top:0;z-index:20;background:transparent;padding:0;overflow:visible}\n.bl-nav-items__preview{padding:16px;display:flex;flex-direction:column;gap:16px;background:var(--panel);border:1px solid var(--line);border-radius:12px;overflow:visible}\n.bl-nav-items__preview-theme{border:0;background:transparent;color:inherit;width:36px;height:36px;display:grid;place-items:center;border-radius:8px;cursor:pointer;flex:none}\n.bl-nav-items__preview-theme:hover{background:#24242b}\n.bl-nav-items__preview-block[data-theme=\"dark\"] .bl-nav-items__preview-logo img{filter:invert(1) hue-rotate(180deg)}\n.bl-nav-items__preview-block[data-theme=\"light\"] .bl-nav-items__preview-nav{background:rgba(255,255,255,.92);border-color:#d8dbe2}\n.bl-nav-items__preview-block[data-theme=\"light\"] .bl-nav-items__preview-link{color:#1b1d22}\n.bl-nav-items__preview-block[data-theme=\"light\"] .bl-nav-items__preview-link.is-open{background:#eceef2}\n.bl-nav-items__preview-block[data-theme=\"light\"] .bl-nav-items__preview-theme{color:#1b1d22}\n.bl-nav-items__preview-block[data-theme=\"light\"] .bl-nav-items__preview-theme:hover{background:#eceef2}\n.bl-nav-items__preview-block[data-theme=\"light\"] .bl-nav-items__mega-preview{background:#fff;color:#1b1d22}\n.bl-nav-items__preview-block[data-theme=\"light\"] .bl-nav-items__preview-footer{background:#f4f5f7}\n.bl-nav-items__preview-stage{position:absolute;left:0;right:0;top:100%;z-index:21;padding:8px 0 0;pointer-events:auto}\n.bl-nav-items__mega-preview{margin:0 auto;background:#18191d;border:1px solid var(--line);border-radius:8px;box-shadow:0 12px 32px rgba(0,0,0,.4);overflow:hidden}\n.bl-nav-items__preview-columns{display:grid;gap:24px;padding:16px}\n.bl-nav-items__preview-col{padding:0;min-width:0}\n.bl-nav-items__preview-col.has-border{border-left:1px solid var(--line);padding-left:24px}\n.bl-nav-items__preview-eyebrow{font-size:12px;font-weight:650;color:#afb3bd;text-transform:uppercase;letter-spacing:.04em;margin:0 8px 8px}\n.bl-nav-items__preview-list-row{display:flex;gap:12px;align-items:flex-start;padding:8px}\n.bl-nav-items__preview-list-row strong{display:block}\n.bl-nav-items__preview-list-row small,.bl-nav-items__preview-featured small{display:block;color:#aeb2bc;margin-top:2px}\n.bl-nav-items__preview-featured{padding:12px}\n.bl-nav-items__preview-featured .title{font-size:16px;font-weight:650}\n.bl-nav-items__preview-empty{color:var(--muted);font-size:13px;padding:28px;text-align:center}\n.bl-nav-items__preview-footer{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 16px;background:#1f2126;border-top:1px solid var(--line)}\n.bl-nav-items__preview-footer a{color:var(--pink2,#ff2da5);text-decoration:underline;text-underline-offset:2px;font-weight:650;font-size:13px}\n.bl-nav-items__preview-footer .cta{background:var(--pink);padding:8px 12px;border-radius:8px;color:#fff;font-weight:650;font-size:13px}\n.bl-nav-items__preview-nav{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:center;gap:24px;padding:12px 16px 12px 20px;overflow:hidden;border:1px solid var(--line);border-radius:12px;background:rgba(20,21,24,.85)}\n.bl-nav-items__preview-logo{justify-self:start;min-width:0;display:flex;align-items:center}\n.bl-nav-items__preview-logo img{height:20px;width:auto;display:block}\n.bl-nav-items__preview-links{display:flex;align-items:center;justify-content:center;gap:4px;min-width:0}\n.bl-nav-items__preview-link{display:inline-flex;align-items:center;gap:4px;color:#d7dae0;background:none;border:0;padding:8px 12px;border-radius:8px;font-weight:550;cursor:pointer;white-space:nowrap}\n.bl-nav-items__preview-link.is-open{background:#24242b}\n.bl-nav-items__preview-chevron{flex:none;width:12px;height:12px;transition:transform .2s}\n.bl-nav-items__preview-link.is-open .bl-nav-items__preview-chevron{transform:rotate(180deg)}\n.bl-nav-items__preview-actions{justify-self:end;display:flex;align-items:center;justify-content:flex-end;gap:8px}\n.bl-nav-items__preview-cta{flex:none;background:var(--pink);border:0;border-radius:8px;color:#fff;font-weight:650;font-size:13px;padding:8px 12px;white-space:nowrap;text-decoration:none}\n.bl-nav-items__builder-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin:26px 0 10px}\n.bl-nav-items__builder-head h2{font-size:18px;margin:0}\n.bl-nav-items__builder-head p{margin:3px 0 0;color:var(--muted);font-size:13px}\n.bl-nav-items__builder-tools{display:flex;gap:10px;align-items:center;flex-wrap:wrap}\n.bl-nav-items__tool{display:flex;align-items:center;gap:8px;color:var(--muted);font-size:12px}\n.bl-nav-items__tool .bl-nav-kit__select-trigger{width:auto;min-width:160px}\n.bl-nav-items__columns{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;align-items:start}\n.bl-nav-items__columns:has(> :only-child){grid-template-columns:minmax(0,1fr)}\n.bl-nav-items__column-settings{display:grid;grid-template-columns:1fr;gap:10px;padding:10px;background:var(--theme-elevation-50,var(--panel));border:1px solid var(--line);border-radius:9px;align-items:center}\n.bl-nav-items__column-settings .bl-nav-kit__field{margin:0}\n.bl-nav-items__column-settings .bl-nav-kit__select-trigger{width:100%}\n.bl-nav-items__check{display:flex;align-items:center;gap:12px;font-size:13px;font-weight:500;color:var(--text)}\n.bl-nav-items__header-cta .bl-nav-items__check{gap:16px}\n.bl-nav-items__header-cta-toggle{margin-bottom:20px}\n.bl-nav-items__seg{display:grid;grid-template-columns:1fr 1fr;gap:6px}\n.bl-nav-items__seg button{border:1px solid var(--line2);background:var(--theme-elevation-50,var(--panel));border-radius:7px;padding:8px 6px;font-size:12px;color:inherit;cursor:pointer}\n.bl-nav-items__seg button.is-active{border-color:var(--pink);background:color-mix(in srgb,var(--pink) 16%,var(--theme-elevation-0,var(--bg)))}\n.bl-nav-items__section-settings{padding:10px 12px;border:1px solid var(--line);background:var(--theme-elevation-50,var(--panel));border-radius:9px}\n.bl-nav-items__footer,.bl-nav-items__panel{margin-top:18px;border:1px solid var(--line2);background:var(--theme-elevation-50,var(--panel));border-radius:12px;overflow:hidden}\n.bl-nav-items__footer-head,.bl-nav-items__panel-head{display:flex;align-items:flex-start;justify-content:space-between;padding:14px 16px;border-bottom:1px solid var(--line);gap:12px}\n.bl-nav-items__footer-head h3,.bl-nav-items__panel-head h3{margin:0;font-size:16px}\n.bl-nav-items__footer-head p,.bl-nav-items__panel-head p{margin:3px 0 0;color:var(--muted);font-size:12px}\n.bl-nav-items__footer-body,.bl-nav-items__panel-body{padding:14px 16px}\n.bl-nav-items__footer-body{display:grid;grid-template-columns:1fr 1fr;gap:14px}\n.bl-nav-items__footer-card{background:var(--theme-elevation-0,var(--bg));border:1px solid var(--line);border-radius:10px;padding:14px}\n.bl-nav-items__footer-card h4{margin:0 0 12px;font-size:14px}\n.bl-nav-items__panel-body{max-width:480px}\n.bl-nav-items__empty{color:var(--muted);font-size:13px;padding:28px;text-align:center}\n.bl-nav-items__menu{position:relative}\n.bl-nav-items__menu > button{border:0;background:transparent;color:inherit;cursor:pointer}\n.bl-nav-items__menu-pop{position:absolute;right:0;top:34px;z-index:12;min-width:140px;padding:4px;border:1px solid var(--line2);border-radius:8px;background:var(--theme-elevation-50,var(--panel))}\n.bl-nav-items__menu-pop button{display:block;width:100%;text-align:left;border:0;background:transparent;padding:7px 8px;border-radius:6px;color:var(--text);cursor:pointer}\n.bl-nav-items .field-label,.bl-nav-items .field-label__label{display:block !important;margin:0;padding:0;font:12px/1.2 Inter,ui-sans-serif,system-ui,sans-serif;font-weight:700;color:inherit}\n.bl-nav-items .field-description,.bl-nav-items .field__description{display:none !important}\n.bl-nav-items .bl-link-field{display:flex;flex-direction:column;gap:8px;margin:0 0 16px}\n.bl-nav-items .bl-link-field__control{background:var(--theme-input-bg,var(--theme-elevation-0,#fff));border:1px solid var(--theme-elevation-250,var(--line2));border-radius:8px;min-height:auto;padding:8px 10px;color:var(--text);box-shadow:none}\n.bl-nav-items .bl-link-field__kind{background:var(--theme-elevation-150,var(--line));color:var(--theme-elevation-800,var(--text));border-radius:999px;padding:3px 7px}\n.bl-nav-items .bl-link-field__kind:first-letter{text-transform:uppercase}\n@media(max-width:1280px){.bl-nav-items{grid-template-columns:250px minmax(0,1fr)}}\n@media(max-width:850px){.bl-nav-items{grid-template-columns:1fr}.bl-nav-items__footer-body,.bl-nav-items__columns,.bl-nav-items__columns:has(> :only-child){grid-template-columns:minmax(0,1fr) !important}}\n`;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"admin.mjs","names":[],"sources":["../src/admin/workspace-css.ts","../src/admin/admin-workspace.tsx","../src/admin/link-field.tsx","../src/admin/min-rows-array-field.tsx","../src/admin/nav-items-field.tsx"],"sourcesContent":["/**\n * Payload Edit View → mockup workspace. Scoped to the document that\n * opted in (Header first). Theme, Pages, and other collections stay\n * Payload's form. Surfaces follow Payload elevation so Light / Dark\n * match the admin header toggle.\n *\n * A second kit editor reuses this file by opting into the same view;\n * do not copy Header selectors into that editor.\n */\nexport const ADMIN_WORKSPACE_CSS = `\n.global-edit--navigation{\n --bg:var(--theme-bg,var(--theme-elevation-0));--panel:var(--theme-elevation-50);--panel2:var(--theme-elevation-100);--panel3:var(--theme-elevation-150);\n --line:var(--theme-elevation-150);--line2:var(--theme-elevation-250);\n --text:var(--theme-text,var(--theme-elevation-800));--muted:var(--theme-elevation-500);--muted2:var(--theme-elevation-400,var(--theme-elevation-500));\n --pink:var(--bl-kit-accent,#e60088);--pink2:#ff2da5;--danger:#ff8aa9;\n --brand-primary:var(--bl-kit-accent,var(--pink));\n --gutter-h:0;--main-gutter-h-left:0;--main-gutter-h-right:0;\n --sidebar-gutter-h-left:0;--sidebar-gutter-h-right:0;\n background:var(--bg);color:var(--text);\n display:flex;flex-direction:column;flex:1;min-height:0;height:auto;\n overflow:hidden;\n}\n/* Own the viewport with flex. The edit view already sits under\n AppHeader inside the wrap; a viewport height here pushes the\n Header button past the fold. */\n.template-default:has(.global-edit--navigation){\n height:100dvh;max-height:100dvh;min-height:0;overflow:hidden;\n}\n.template-default:has(.global-edit--navigation) .template-default__wrap{\n display:flex;flex-direction:column;min-height:0;height:100%;overflow:hidden;\n}\n.template-default:has(.global-edit--navigation) .app-header{\n flex:none;\n}\n.global-edit--navigation form,.global-edit--navigation .gutter--left,.global-edit--navigation .gutter--right{\n padding:0;margin:0;\n}\n.global-edit--navigation form{\n flex:1;min-height:0;display:flex;flex-direction:column;overflow:hidden;height:100%;\n}\n/* Payload's main pane is content-sized. Stretch it — and only the kit\n field — so the rail and canvas reach the bottom of the browser.\n Do not flex every .field-type: hidden cta/bar siblings would steal\n height, and height:100% beats a viewport min-height on .bl-nav-items. */\n.global-edit--navigation .doc-controls + div,\n.global-edit--navigation .doc-controls + div > div,\n.global-edit--navigation .document-fields,\n.global-edit--navigation .document-fields__main,\n.global-edit--navigation .document-fields__edit,\n.global-edit--navigation .document-fields__fields,\n.global-edit--navigation .render-fields:has(.bl-nav-items),\n.global-edit--navigation .group-field:has(.bl-nav-items),\n.global-edit--navigation .group-field:has(.bl-nav-items) .group-field__wrap{\n display:flex;flex-direction:column;flex:1;min-height:0;height:100%;\n overflow:hidden;padding:0;margin:0;border:0;max-width:none;width:100%;\n}\n.global-edit--navigation .render-fields:has(.bl-nav-items){gap:0}\n.global-edit--navigation .field-label,.global-edit--navigation .field-label__label,\n.global-edit--navigation .field-description,.global-edit--navigation .field__description,\n.global-edit--navigation .group-field__title,.global-edit--navigation .tabs-field{display:none}\n.global-edit--navigation .bl-nav-items .field-label,.global-edit--navigation .bl-nav-items .field-label__label{display:block}\n.global-edit--navigation .live-preview,.global-edit--navigation .live-preview-window,\n.global-edit--navigation [class*=\"LivePreview\"]{display:none !important}\n.global-edit--navigation .doc-header{\n background:var(--bg);border-bottom:1px solid var(--line);padding:10px 24px;min-height:0;flex:none;\n}\n.global-edit--navigation .doc-controls{\n background:var(--bg);border-bottom:1px solid var(--line);padding:12px;min-height:0;\n flex:none;position:sticky;top:0;z-index:6;\n}\n.global-edit--navigation .doc-controls:before,.global-edit--navigation .doc-controls:after{\n display:none;content:none;backdrop-filter:none;\n}\n.global-edit--navigation .doc-controls__wrapper{height:auto;min-height:0}\n.global-edit--navigation .doc-controls__content{padding:0}\n.global-edit--navigation .doc-controls__controls-wrapper{background:var(--bg);border-top-color:var(--line)}\n.global-edit--navigation .doc-header__title,.global-edit--navigation .doc-controls .doc-title{font-size:16px;font-weight:700;color:var(--text)}\n.global-edit--navigation .btn--style-primary,.global-edit--navigation .btn.btn--style-primary{\n background:var(--pink);border-color:var(--pink);color:#fff;\n}\n.global-edit--navigation .bl-nav-items{\n display:grid;grid-template-columns:300px minmax(0,1fr);\n grid-template-rows:minmax(0,1fr);\n flex:1;min-height:0;height:100%;overflow:hidden;align-self:stretch;\n}\n@media(max-width:1280px){.global-edit--navigation .bl-nav-items{grid-template-columns:250px minmax(0,1fr)}}\n@media(max-width:850px){.global-edit--navigation .bl-nav-items{grid-template-columns:1fr}}\n`;\n","\"use client\";\n\nimport { DefaultEditView } from \"@payloadcms/ui\";\nimport type { DocumentViewClientProps } from \"payload\";\n\nimport { ADMIN_WORKSPACE_CSS } from \"./workspace-css\";\n\n/**\n * Wraps Payload's DefaultEditView so Header (and later kit editors)\n * become the mockup workspace. Does not mount a second Form.\n */\nexport function AdminWorkspace(props: DocumentViewClientProps) {\n return (\n <>\n <style href=\"bl-admin-workspace\" precedence=\"high\">\n {ADMIN_WORKSPACE_CSS}\n </style>\n <DefaultEditView {...props} />\n </>\n );\n}\n","import { Badge, Button, Field, Input, KitProvider, Label } from \"@bison-lab/admin-ui\";\nimport { FieldDescription, FieldError, useConfig, useField, useFieldPath } from \"@payloadcms/ui\";\nimport type { ClientField, RowFieldClientComponent } from \"payload\";\nimport { useEffect, useId, useMemo, useRef, useState } from \"react\";\n\nimport { linkTypeOf, type LinkPageDoc, type LinkType } from \"../fields/link\";\n\n/**\n * The link picker: one box in place of a link's `type`, `page` and `href`.\n *\n * Type to search the pages collection by its title field; each result shows\n * its path. Paste anything that can only be a destination (`http`, `mailto:`,\n * `tel:`, or a site path starting with `/`) and the one offer is to link to\n * it. Choosing writes the stored shape through Payload's `useField`, so the\n * document saves exactly what the stock fields would have saved, and the\n * chosen state shows a Page or External chip with a clear button.\n *\n * The search asks the collection's REST endpoint for `_status: published`\n * rows, so the draft rule is the server's and is applied on every keystroke.\n * A stored page is fetched by id without that filter, which is how the\n * picker knows to warn that a page chosen earlier has since been unpublished\n * or deleted.\n *\n * Kit chrome (`Field`, `Label`, `Input`, `Badge`, `Button`) under\n * `KitProvider`. Payload's field hooks still write `type` / `page` / `href`.\n */\n\nconst LABEL = \"Goes to\";\nconst PLACEHOLDER = \"Search pages, or paste a URL\";\nconst DESCRIPTION =\n \"Published pages only. Paste a URL, or a path like /find-a-doctor, to link anywhere else.\";\nconst NO_MATCH = \"No published page matches. Paste a URL to link outside the site.\";\nconst UNPUBLISHED =\n \"This page is no longer published. The site shows this link as plain text, and this document cannot be published until you pick another page or publish that one again.\";\nconst MISSING =\n \"This page no longer exists. Pick another page or paste a URL before publishing.\";\n\nconst SEARCH_DELAY_MS = 200;\nconst SEARCH_LIMIT = 8;\n\n/** Text an editor could only mean as a destination, never as a page title. */\nconst URL_LIKE = /^(https?:\\/\\/|mailto:|tel:|\\/)/i;\n\ntype Option = { kind: \"page\"; page: LinkPageDoc } | { kind: \"url\"; href: string };\n\n/**\n * A row has no name, so its `path` ends in `_index-N` and its fields sit at\n * the parent's level, the way Payload's `getFieldPaths` places them.\n */\nfunction siblingPaths(rowPath: string) {\n const base = rowPath\n .split(\".\")\n .filter((segment) => !segment.startsWith(\"_index-\"))\n .join(\".\");\n const at = (name: string) => (base ? `${base}.${name}` : name);\n return { type: at(\"type\"), page: at(\"page\"), href: at(\"href\") };\n}\n\nfunction pagePath(page: LinkPageDoc): string {\n return page.slug ? `/${page.slug}` : \"\";\n}\n\nexport const LinkField: RowFieldClientComponent = ({ field, path, readOnly }) => {\n // Payload re-renders a custom field with a stale `path` prop while rows are\n // reordered; the context, when there is one, is the row's current path.\n const rowPath = useFieldPath() ?? path;\n const paths = useMemo(() => siblingPaths(rowPath), [rowPath]);\n\n const type = useField<LinkType | null>({ path: paths.type });\n const page = useField<LinkPageDoc | number | string | null>({ path: paths.page });\n const href = useField<string | null>({ path: paths.href });\n\n const pageField = field.fields.find(\n (f): f is Extract<ClientField, { type: \"relationship\" }> =>\n f.type === \"relationship\" && f.name === \"page\",\n );\n const collection =\n typeof pageField?.relationTo === \"string\" ? pageField.relationTo : \"pages\";\n const required = Boolean(pageField?.required);\n\n const { config } = useConfig();\n const titleKey =\n config.collections.find((c) => c.slug === collection)?.admin?.useAsTitle ?? \"id\";\n const endpoint = `${config.serverURL}${config.routes.api}/${collection}`;\n\n const id = useId();\n const inputId = `${id}-input`;\n const listId = `${id}-list`;\n const inputRef = useRef<HTMLInputElement>(null);\n\n const [query, setQuery] = useState(\"\");\n const [open, setOpen] = useState(false);\n const [loading, setLoading] = useState(false);\n const [results, setResults] = useState<LinkPageDoc[]>([]);\n const [active, setActive] = useState(-1);\n const [focusNext, setFocusNext] = useState(false);\n /** The stored page, looked up; `missing` when the id no longer answers. */\n const [stored, setStored] = useState<{ doc: LinkPageDoc | null; missing: boolean } | null>(null);\n /** Pages seen in search results, so choosing one needs no second request. */\n const known = useRef(new Map<string, LinkPageDoc>());\n const searchSeq = useRef(0);\n\n // Which destination the row holds, by the same reading as the stock fields'\n // conditions and `resolveLink`; `null` is nothing chosen yet.\n const linkType = linkTypeOf({ type: type.value, page: page.value, href: href.value });\n const kind: LinkType | null =\n linkType === \"external\" ? (href.value ? \"external\" : null) : page.value ? \"page\" : null;\n\n const pageValue = page.value;\n const pageId = pageValue && typeof pageValue === \"object\" ? null : pageValue;\n\n useEffect(() => {\n if (kind !== \"page\") {\n setStored(null);\n return;\n }\n if (pageValue && typeof pageValue === \"object\") {\n setStored({ doc: pageValue, missing: false });\n return;\n }\n const cached = known.current.get(String(pageId));\n if (cached) {\n setStored({ doc: cached, missing: false });\n return;\n }\n let cancelled = false;\n fetch(`${endpoint}/${pageId}?depth=0`, { credentials: \"include\" })\n .then(async (response) => {\n if (cancelled) return;\n if (!response.ok) {\n setStored({ doc: null, missing: true });\n return;\n }\n const doc = (await response.json()) as LinkPageDoc;\n known.current.set(String(doc.id), doc);\n if (!cancelled) setStored({ doc, missing: false });\n })\n .catch(() => {\n if (!cancelled) setStored({ doc: null, missing: true });\n });\n return () => {\n cancelled = true;\n };\n }, [kind, pageValue, pageId, endpoint]);\n\n const trimmed = query.trim();\n const urlLike = URL_LIKE.test(trimmed);\n\n useEffect(() => {\n if (!open || urlLike) return;\n const seq = (searchSeq.current += 1);\n setLoading(true);\n const timer = setTimeout(() => {\n const params = new URLSearchParams({\n depth: \"0\",\n limit: String(SEARCH_LIMIT),\n sort: titleKey,\n \"where[_status][equals]\": \"published\",\n });\n if (trimmed) params.set(`where[${titleKey}][like]`, trimmed);\n fetch(`${endpoint}?${params.toString()}`, { credentials: \"include\" })\n .then((response) => (response.ok ? response.json() : { docs: [] }))\n .then((body: { docs?: LinkPageDoc[] }) => {\n if (seq !== searchSeq.current) return;\n const docs = body.docs ?? [];\n for (const doc of docs) known.current.set(String(doc.id), doc);\n setResults(docs);\n setLoading(false);\n })\n .catch(() => {\n if (seq !== searchSeq.current) return;\n setResults([]);\n setLoading(false);\n });\n }, SEARCH_DELAY_MS);\n return () => clearTimeout(timer);\n }, [open, urlLike, trimmed, endpoint, titleKey]);\n\n useEffect(() => {\n if (focusNext && inputRef.current) {\n inputRef.current.focus();\n setFocusNext(false);\n }\n }, [focusNext, kind]);\n\n const options: Option[] = urlLike\n ? [{ kind: \"url\", href: trimmed }]\n : results.map((doc) => ({ kind: \"page\", page: doc }));\n\n function choose(option: Option) {\n if (option.kind === \"page\") {\n known.current.set(String(option.page.id), option.page);\n type.setValue(\"page\");\n page.setValue(option.page.id);\n href.setValue(null);\n } else {\n type.setValue(\"external\");\n href.setValue(option.href);\n page.setValue(null);\n }\n setQuery(\"\");\n setOpen(false);\n setActive(-1);\n }\n\n function clear() {\n type.setValue(\"page\");\n page.setValue(null);\n href.setValue(null);\n setStored(null);\n setFocusNext(true);\n }\n\n function onKeyDown(event: React.KeyboardEvent<HTMLInputElement>) {\n if (event.key === \"ArrowDown\") {\n event.preventDefault();\n if (!open) {\n setOpen(true);\n return;\n }\n setActive((i) => (options.length ? (i + 1) % options.length : -1));\n } else if (event.key === \"ArrowUp\") {\n event.preventDefault();\n setActive((i) =>\n options.length ? (i <= 0 ? options.length - 1 : i - 1) : -1,\n );\n } else if (event.key === \"Enter\") {\n if (!open) return;\n event.preventDefault();\n const pick = options[active] ?? options[0];\n if (pick) choose(pick);\n } else if (event.key === \"Escape\") {\n if (!open) return;\n event.preventDefault();\n event.stopPropagation();\n setOpen(false);\n setActive(-1);\n }\n }\n\n const error = linkType === \"external\" ? href : page;\n const activeId = active >= 0 && open ? `${id}-option-${active}` : undefined;\n\n return (\n <KitProvider>\n <Field as=\"div\" className=\"bl-link-field\">\n <Label id={`${id}-label`}>\n {LABEL}\n {required ? \" *\" : \"\"}\n </Label>\n <div className=\"bl-nav-kit__picker\">\n {kind === \"page\" ? (\n <div className=\"bl-nav-kit__picker-control\">\n <Badge variant=\"neutral-subtle\">Page</Badge>\n <span>\n {stored?.doc ? (\n <>\n {String(stored.doc[titleKey as keyof LinkPageDoc] ?? stored.doc.id)}\n <span className=\"bl-nav-kit__picker-path\">{pagePath(stored.doc)}</span>\n </>\n ) : stored?.missing ? (\n `Page ${String(pageId)}`\n ) : (\n \"…\"\n )}\n </span>\n {readOnly ? null : (\n <Button variant=\"ghost\" aria-label=\"Clear\" onClick={clear}>\n ×\n </Button>\n )}\n </div>\n ) : kind === \"external\" ? (\n <div className=\"bl-nav-kit__picker-control\">\n <Badge variant=\"neutral-subtle\">External</Badge>\n <span>{href.value}</span>\n {readOnly ? null : (\n <Button variant=\"ghost\" aria-label=\"Clear\" onClick={clear}>\n ×\n </Button>\n )}\n </div>\n ) : (\n <Input\n ref={inputRef}\n id={inputId}\n role=\"combobox\"\n placeholder={PLACEHOLDER}\n autoComplete=\"off\"\n disabled={readOnly}\n value={query}\n aria-labelledby={`${id}-label`}\n aria-expanded={open}\n aria-controls={listId}\n aria-autocomplete=\"list\"\n aria-activedescendant={activeId}\n onChange={(event) => {\n setQuery(event.target.value);\n setActive(-1);\n setOpen(true);\n }}\n onFocus={() => setOpen(true)}\n onBlur={() => setOpen(false)}\n onKeyDown={onKeyDown}\n />\n )}\n {open && !kind ? (\n <ul id={listId} role=\"listbox\" className=\"bl-nav-kit__picker-menu\">\n {options.map((option, i) => (\n <li\n key={option.kind === \"page\" ? String(option.page.id) : option.href}\n id={`${id}-option-${i}`}\n role=\"option\"\n aria-selected={i === active}\n className=\"bl-nav-kit__picker-option\"\n onMouseDown={(event) => {\n event.preventDefault();\n choose(option);\n }}\n onMouseEnter={() => setActive(i)}\n >\n {option.kind === \"page\" ? (\n <>\n <span>\n {String(option.page[titleKey as keyof LinkPageDoc] ?? option.page.id)}\n </span>\n <span className=\"bl-nav-kit__picker-path\">{pagePath(option.page)}</span>\n </>\n ) : (\n <>\n <span>Link to this URL</span>\n <span className=\"bl-nav-kit__picker-path\">{option.href}</span>\n </>\n )}\n </li>\n ))}\n {options.length === 0 && !loading ? (\n <li role=\"presentation\" className=\"bl-nav-kit__picker-option\">\n {NO_MATCH}\n </li>\n ) : null}\n </ul>\n ) : null}\n </div>\n {kind === \"page\" && stored && (stored.missing || stored.doc?._status === \"draft\") ? (\n <div role=\"status\">{stored.missing ? MISSING : UNPUBLISHED}</div>\n ) : null}\n <FieldDescription description={DESCRIPTION} path={paths.page} />\n <FieldError path={error.path} showError={error.showError} message={error.errorMessage} />\n </Field>\n </KitProvider>\n );\n};\n","import { ArrayField, toast, useField, useTranslation } from \"@payloadcms/ui\";\nimport type { ArrayFieldClientComponent, ArrayFieldClientProps } from \"payload\";\nimport { useCallback, useRef } from \"react\";\n\n/**\n * Payload's array field, with *Remove* refused once the rows are down to\n * `minRows`.\n *\n * This wraps the stock `ArrayField` rather than re-implementing it, so every\n * upstream behaviour (sorting, copy/paste, collapse, localisation) stays put\n * and a Payload upgrade carries it along. The catch is where the row menu\n * lives: Payload portals it into `document.body`, out of reach of any CSS or\n * form context this wrapper could scope. What still reaches the wrapper is\n * the React event: synthetic events bubble through portals along the\n * component tree, so a capture handler here sees the click on *Remove*\n * before the menu's own handler does, and can stop it.\n *\n * Because the menu is portaled, the DOM cannot say whether a given *Remove*\n * belongs to this array or to an array nested inside one of its rows. The\n * trigger that opened the menu *is* in the DOM, though, and every menu opens\n * from its trigger. So the handler remembers, per menu opening, whether the\n * trigger sat directly in this field, and only gates the *Remove* that follows.\n */\nexport const MinRowsArrayField: ArrayFieldClientComponent = (props) => {\n const { field, path: pathFromProps } = props;\n const minRows = field.minRows ?? (field.required ? 1 : 0);\n\n const { rows = [] } = useField({\n hasRows: true,\n potentiallyStalePath: pathFromProps,\n });\n const { i18n, t } = useTranslation();\n\n const rootRef = useRef<HTMLDivElement>(null);\n const menuIsOurs = useRef(false);\n\n const onClickCapture = useCallback(\n (event: React.MouseEvent<HTMLDivElement>) => {\n const target = event.target;\n if (!(target instanceof Element)) return;\n\n const trigger = target.closest(\".array-actions__button\");\n if (trigger) {\n // The nearest array or blocks field around the trigger is the field\n // whose menu is opening. Ours is the first one inside the wrapper.\n const owner = trigger.closest(\".array-field, .blocks-field\");\n menuIsOurs.current =\n owner !== null && owner === rootRef.current?.querySelector(\".array-field\");\n return;\n }\n\n if (!target.closest(\".array-actions__remove\")) return;\n if (!menuIsOurs.current || rows.length > minRows) return;\n\n event.preventDefault();\n event.stopPropagation();\n toast.error(\n t(\"validation:requiresAtLeast\", {\n count: minRows,\n label: rowLabel(field, minRows, i18n.language) ??\n t(minRows > 1 ? \"general:rows\" : \"general:row\"),\n }),\n );\n },\n [field, i18n.language, minRows, rows.length, t],\n );\n\n return (\n <div ref={rootRef} onClickCapture={onClickCapture}>\n <ArrayField {...props} />\n </div>\n );\n};\n\n/**\n * The word for a row, as Payload's own \"requires at least\" banner picks it:\n * the plural label above one, the singular otherwise, the field label failing\n * both. Client-side labels are static — a string or a per-language record.\n */\nfunction rowLabel(\n field: ArrayFieldClientProps[\"field\"],\n minRows: number,\n language: string,\n): string | undefined {\n const label = minRows > 1 ? field.labels?.plural : field.labels?.singular;\n return staticLabel(label, language) ?? staticLabel(field.label, language);\n}\n\nfunction staticLabel(label: unknown, language: string): string | undefined {\n if (typeof label === \"string\") return label;\n if (label && typeof label === \"object\") {\n const byLanguage = label as Record<string, string | undefined>;\n return byLanguage[language] ?? byLanguage.en ?? Object.values(byLanguage)[0];\n }\n return undefined;\n}\n","import {\n FieldError,\n FieldPathContext,\n useConfig,\n useField,\n useForm,\n useTheme,\n} from \"@payloadcms/ui\";\nimport {\n Button,\n Canvas,\n Checkbox,\n ConfirmDialog,\n Dialog,\n Field,\n Fold,\n Input,\n ItemRail,\n KitProvider,\n Kicker,\n Label,\n KindGlyph,\n MainHead,\n RailSlot,\n Select,\n SelectContent,\n SelectItem,\n SelectTrigger,\n SelectValue,\n Textarea,\n Stack,\n TypeCard,\n TypeCards,\n type FoldAction,\n} from \"@bison-lab/admin-ui\";\nimport {\n resolveThemeIdentity,\n themeHeadFromDoc,\n type ThemeDoc,\n type ThemeIdentityFallback,\n} from \"@bison-lab/payload-core/theme\";\nimport type { BlocksFieldClientComponent } from \"payload\";\nimport { useEffect, useMemo, useState, type ReactNode } from \"react\";\n\nimport { headerItemsFromBlocks, type HeaderBlockRow } from \"../blocks/mega-menu/header\";\nimport {\n resolveAdminPreviewLink,\n type LinkDestination,\n type LinkPageDoc,\n} from \"../fields/link\";\nimport { LinkField } from \"./link-field\";\n\n/**\n * Kit editor for `header.items`. Replaces Payload's stock blocks UI.\n * Primitives come from `@bison-lab/admin-ui`.\n */\n\ntype NavRow = HeaderBlockRow & { id?: string | null; panel?: MegaPanel | null };\n\ninterface MegaPanel {\n maxWidth?: \"narrow\" | \"standard\" | \"wide\" | null;\n columns?: MegaColumn[] | null;\n footer?: {\n overview?: Record<string, unknown>;\n cta?: Record<string, unknown>;\n };\n}\n\ninterface MegaColumn {\n width?: string | null;\n divider?: boolean | null;\n sections?: MegaSection[] | null;\n}\n\ninterface MegaSection {\n eyebrow?: string | null;\n display?: \"featured\" | \"list\" | null;\n hideDescriptionsOnMobile?: boolean | null;\n links?: Record<string, unknown>[] | null;\n}\n\nconst WIDTHS = [\"25\", \"33\", \"50\", \"66\", \"75\", \"100\"] as const;\n\nconst LINK_ROW = {\n type: \"row\" as const,\n fields: [\n { name: \"type\", type: \"radio\" },\n { name: \"page\", type: \"relationship\", relationTo: \"pages\" },\n { name: \"href\", type: \"text\" },\n ],\n};\n\nconst emptySection = (): MegaSection => ({\n display: \"list\",\n hideDescriptionsOnMobile: true,\n links: [],\n});\n\nconst emptyColumn = (): MegaColumn => ({\n width: \"100\",\n divider: false,\n sections: [emptySection()],\n});\n\nconst emptyPanel = (): MegaPanel => ({\n maxWidth: \"standard\",\n columns: [emptyColumn()],\n footer: { overview: {}, cta: {} },\n});\n\nconst emptyLink = (): Record<string, unknown> => ({\n blockType: \"navLink\",\n label: \"New item\",\n type: \"page\",\n page: null,\n href: null,\n newTab: false,\n});\n\nconst emptyMega = (): Record<string, unknown> => ({\n blockType: \"megaMenu\",\n label: \"New item\",\n type: \"page\",\n page: null,\n href: null,\n newTab: false,\n panel: emptyPanel(),\n});\n\nfunction destinationOf(row: NavRow) {\n return {\n type: row.type,\n page: row.page,\n href: row.href,\n newTab: row.newTab,\n label: row.label,\n };\n}\n\n/** Missing Theme fields so `themeHeadFromDoc` can run; the fetched document wins. */\nconst THEME_SEED: Parameters<typeof themeHeadFromDoc>[1] = {\n brandPrimary: \"#1e3a5f\",\n brandSecondary: \"#2d9d6e\",\n brandAccent: \"#e89b20\",\n brandHighlight: \"#7c3aed\",\n brandSuccess: \"#22c55e\",\n brandDestructive: \"#b91c1c\",\n greyScale: \"slate\",\n darkSelector: '[data-theme=\"dark\"]',\n defaultTheme: \"system\",\n radius: \"rounded\",\n shadow: \"subtle\",\n motion: \"smooth\",\n density: \"default\",\n fontBody: \"inter\",\n fontHeading: \"playfair-display\",\n fontWeights: { normal: 400, medium: 500, semibold: 600, bold: 700 },\n};\n\nconst THEME_SCOPE = \".bl-nav-items\";\n\nfunction scopeThemeCss(css: string) {\n return css\n .replace(/:root/g, THEME_SCOPE)\n .replace(\n /\\[data-theme=\"dark\"\\]/g,\n `${THEME_SCOPE}[data-theme=\"dark\"], ${THEME_SCOPE} [data-theme=\"dark\"]`,\n );\n}\n\nfunction identityFallbackFromConfig(config: {\n globals?: { slug?: string; admin?: { custom?: { identityFallback?: ThemeIdentityFallback } } }[];\n}): ThemeIdentityFallback | undefined {\n return config.globals?.find((global) => global.slug === \"theme\")?.admin?.custom?.identityFallback;\n}\n\nfunction lockupSrc(\n asset: { url: string; alt: string } | null | undefined,\n serverURL: string,\n): { url: string; alt: string } | null {\n if (!asset?.url) return null;\n const url =\n /^https?:\\/\\//.test(asset.url) || asset.url.startsWith(\"/\")\n ? asset.url\n : `${serverURL}/${asset.url}`;\n return { url, alt: asset.alt };\n}\n\nfunction pageIdOf(value: unknown): string | null {\n if (value == null) return null;\n if (typeof value === \"object\") {\n const id = (value as LinkPageDoc).id;\n return id == null ? null : String(id);\n }\n return String(value);\n}\n\nfunction ctaPathFromItems(itemsPath: string) {\n return itemsPath.endsWith(\".items\") ? `${itemsPath.slice(0, -\".items\".length)}.cta` : \"header.cta\";\n}\n\nfunction collectPageIds(items: NavRow[], extra?: LinkDestination | Record<string, unknown> | null): string[] {\n const ids = new Set<string>();\n const take = (link: LinkDestination | Record<string, unknown> | null | undefined) => {\n const id = pageIdOf(link?.page);\n if (id) ids.add(id);\n };\n take(extra);\n for (const row of items) {\n take(row);\n const panel = row.panel;\n take(panel?.footer?.overview);\n take(panel?.footer?.cta);\n for (const column of panel?.columns ?? []) {\n for (const section of column.sections ?? []) {\n for (const link of section.links ?? []) take(link);\n }\n }\n }\n return [...ids];\n}\n\nfunction ComposedLinkField({\n path,\n parentPath,\n readOnly,\n}: {\n path: string;\n parentPath: string;\n readOnly?: boolean;\n}) {\n return (\n <FieldPathContext.Provider value={path}>\n <LinkField\n field={LINK_ROW as never}\n path={path}\n parentPath={parentPath}\n indexPath=\"0\"\n schemaPath={path}\n readOnly={readOnly}\n />\n </FieldPathContext.Provider>\n );\n}\n\nexport const NavItemsField: BlocksFieldClientComponent = ({ field, path, readOnly }) => {\n const itemsField = useField({ path, hasRows: true });\n const { addFieldRow, replaceFieldRow, getDataByPath } = useForm();\n // Blocks store a row count on `value`; rows live in form data.\n const rowCount = Array.isArray(itemsField.rows) ? itemsField.rows.length : itemsField.value;\n const fromPath = getDataByPath?.(path);\n const items: NavRow[] = Array.isArray(fromPath)\n ? (fromPath as NavRow[])\n : Array.isArray(itemsField.value)\n ? (itemsField.value as NavRow[])\n : [];\n void rowCount;\n const ctaPath = ctaPathFromItems(path);\n const ctaField = useField<Record<string, unknown>>({ path: ctaPath });\n const ctaEnabled = useField<boolean>({ path: `${ctaPath}.enabled` });\n const ctaLabel = useField<string>({ path: `${ctaPath}.label` });\n const ctaPage = useField({ path: `${ctaPath}.page` });\n const ctaHrefField = useField<string>({ path: `${ctaPath}.href` });\n const ctaType = useField<string>({ path: `${ctaPath}.type` });\n const ctaSnapshot = (ctaField.value ?? {}) as LinkDestination & {\n enabled?: boolean | null;\n label?: string | null;\n };\n const cta = {\n ...ctaSnapshot,\n enabled: ctaEnabled.value ?? ctaSnapshot.enabled,\n label: ctaLabel.value ?? ctaSnapshot.label,\n page: ctaPage.value ?? ctaSnapshot.page,\n href: ctaHrefField.value ?? ctaSnapshot.href,\n type: ctaType.value ?? ctaSnapshot.type,\n };\n const ctaOn = cta.enabled !== false && Boolean(cta.label || cta.page || cta.href || cta.enabled);\n const { config } = useConfig();\n const endpoint = `${config.serverURL}${config.routes.api}`;\n\n const [selected, setSelected] = useState(0);\n const [adding, setAdding] = useState(false);\n const [confirmSwitch, setConfirmSwitch] = useState(false);\n const { theme, setTheme } = useTheme();\n const previewDark = theme === \"dark\";\n const identityFallback = identityFallbackFromConfig(config);\n\n useEffect(() => {\n if (selected >= items.length) setSelected(Math.max(0, items.length - 1));\n }, [items.length, selected]);\n\n const current = items[selected];\n const [pages, setPages] = useState<Map<string, LinkPageDoc>>(() => new Map());\n const pageIds = useMemo(() => collectPageIds(items, cta).sort().join(\",\"), [items, cta]);\n useEffect(() => {\n const ids = pageIds ? pageIds.split(\",\") : [];\n if (ids.length === 0) return;\n let cancelled = false;\n Promise.all(\n ids.map((id) =>\n fetch(`${endpoint}/pages/${id}?depth=0`, { credentials: \"include\" }).then((response) =>\n response.ok ? (response.json() as Promise<LinkPageDoc>) : null,\n ),\n ),\n )\n .then((docs) => {\n if (cancelled) return;\n setPages(() => {\n const next = new Map<string, LinkPageDoc>();\n for (const doc of docs) {\n if (doc?.id != null) next.set(String(doc.id), doc);\n }\n return next;\n });\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n }, [pageIds, endpoint]);\n\n const previewItems = useMemo(\n () =>\n headerItemsFromBlocks(items, {\n resolveLink: (link) => resolveAdminPreviewLink(link, pages),\n }),\n [items, pages],\n );\n const [hoverItem, setHoverItem] = useState<string | null>(null);\n const openItem =\n hoverItem && items.some((row) => row.label === hoverItem && row.blockType === \"megaMenu\")\n ? hoverItem\n : undefined;\n const openRow = items.find((row) => row.label === openItem && row.blockType === \"megaMenu\");\n const openIndex = openRow ? items.indexOf(openRow) : -1;\n\n function add(blockType: \"navLink\" | \"megaMenu\") {\n const seed = blockType === \"navLink\" ? emptyLink() : emptyMega();\n const subFieldState = Object.fromEntries(\n Object.entries(seed)\n .filter(([key]) => key !== \"blockType\")\n .map(([key, value]) => [key, { value, valid: true, initialValue: value }]),\n );\n addFieldRow({ path, schemaPath: path, blockType, subFieldState });\n setSelected(items.length);\n setAdding(false);\n }\n\n function switchToLink() {\n if (!current) return;\n replaceFieldRow({\n path,\n schemaPath: path,\n rowIndex: selected,\n blockType: \"navLink\",\n subFieldState: {\n label: { value: current.label, valid: true },\n type: { value: current.type, valid: true },\n page: { value: current.page, valid: true },\n href: { value: current.href, valid: true },\n newTab: { value: current.newTab, valid: true },\n },\n });\n setConfirmSwitch(false);\n }\n\n function switchToMega() {\n if (!current) return;\n replaceFieldRow({\n path,\n schemaPath: path,\n rowIndex: selected,\n blockType: \"megaMenu\",\n subFieldState: {\n ...Object.fromEntries(\n Object.entries(destinationOf(current)).map(([key, value]) => [\n key,\n { value, valid: true },\n ]),\n ),\n panel: { value: emptyPanel(), valid: true },\n },\n });\n }\n\n function requestType(next: \"navLink\" | \"megaMenu\") {\n if (!current || current.blockType === next) return;\n if (current.blockType === \"megaMenu\" && next === \"navLink\") {\n setConfirmSwitch(true);\n return;\n }\n switchToMega();\n }\n\n function onPreviewClick(event: React.MouseEvent) {\n const target = event.target as HTMLElement;\n if (target.closest(\"a[href]\")) event.preventDefault();\n const label = target.closest(\"[data-preview-item]\")?.getAttribute(\"data-preview-item\");\n if (!label) return;\n const index = items.findIndex((row) => row.label === label);\n if (index >= 0) {\n setSelected(index);\n setHoverItem(label);\n }\n }\n\n const [themeCss, setThemeCss] = useState(\"\");\n const [lockup, setLockup] = useState<{ url: string; alt: string } | null>(() =>\n lockupSrc(identityFallback?.lockup, config.serverURL),\n );\n useEffect(() => {\n let cancelled = false;\n fetch(`${endpoint}/globals/theme?depth=1`, { credentials: \"include\" })\n .then((response) => (response.ok ? (response.json() as Promise<ThemeDoc>) : null))\n .then((doc) => {\n if (cancelled) return;\n if (doc) setThemeCss(scopeThemeCss(themeHeadFromDoc(doc, THEME_SEED).css));\n setLockup(lockupSrc(resolveThemeIdentity(doc, identityFallback).lockup, config.serverURL));\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n }, [config.serverURL, endpoint, identityFallback]);\n const ctaHref = resolveAdminPreviewLink(cta as LinkDestination, pages);\n\n void field;\n\n return (\n <KitProvider>\n <div className=\"bl-nav-items field-type\">\n <style href=\"bl-nav-items\" precedence=\"default\">\n {CSS}\n </style>\n {themeCss ? <style href=\"bl-nav-items-theme\" precedence=\"default\">{themeCss}</style> : null}\n\n <ItemRail>\n <div className=\"bl-nav-items__rail-body\">\n <ul className=\"bl-nav-items__list\" aria-label=\"Menu items\">\n {items.map((row, index) => (\n <li key={String(row.id ?? index)} data-selected={index === selected ? \"true\" : \"false\"}>\n <div className=\"bl-nav-items__rail-row\">\n <KindGlyph kind={row.blockType === \"megaMenu\" ? \"megaMenu\" : \"navLink\"} />\n <button type=\"button\" className=\"bl-nav-items__rail-label\" onClick={() => setSelected(index)}>\n {row.label || \"Untitled\"}\n </button>\n {readOnly ? null : (\n <RowMenu\n label={row.label || \"Item\"}\n index={index}\n count={items.length}\n path={path}\n onMoved={(to) => setSelected(to)}\n />\n )}\n </div>\n {index === selected ? (\n <div className=\"bl-nav-items__rail-edit\">\n <TypeCards compact>\n <TypeCard\n icon={<KindGlyph kind=\"navLink\" />}\n label=\"Link\"\n active={row.blockType === \"navLink\"}\n onClick={() => requestType(\"navLink\")}\n />\n <TypeCard\n icon={<KindGlyph kind=\"megaMenu\" />}\n label=\"Mega\"\n active={row.blockType === \"megaMenu\"}\n onClick={() => requestType(\"megaMenu\")}\n />\n </TypeCards>\n <ItemBasics path={path} index={index} readOnly={readOnly} />\n </div>\n ) : null}\n </li>\n ))}\n </ul>\n {readOnly ? null : (\n <Button variant=\"outline\" className=\"bl-nav-items__add\" onClick={() => setAdding(true)}>\n Add item\n </Button>\n )}\n </div>\n <RailSlot>\n <HeaderCta path={ctaPath} readOnly={readOnly} />\n </RailSlot>\n </ItemRail>\n\n <Canvas>\n {current?.blockType === \"megaMenu\" ? (\n <MainHead\n kicker=\"Editing mega menu\"\n title={current.label || \"Menu items\"}\n description=\"Configure the dropdown layout, sections, links, and footer.\"\n />\n ) : items.length === 0 ? (\n <MainHead\n kicker=\"Header\"\n title=\"Menu items\"\n description=\"Add a link or a mega menu to start the header.\"\n />\n ) : null}\n <div\n className=\"bl-nav-items__preview-block\"\n data-preview-chrome\n data-sticky=\"true\"\n data-theme={previewDark ? \"dark\" : \"light\"}\n onClick={onPreviewClick}\n onMouseLeave={(event) => {\n const next = event.relatedTarget;\n if (next instanceof Node && event.currentTarget.contains(next)) return;\n setHoverItem(null);\n }}\n >\n <div className=\"bl-nav-items__preview\">\n <Kicker>This is just a preview</Kicker>\n <PreviewNav\n items={items\n .filter((row) => row.label)\n .map((row) => {\n const mapped = previewItems.find((item) => item.label === row.label);\n return {\n label: row.label!,\n href: mapped?.href ?? resolveAdminPreviewLink(row, pages) ?? undefined,\n content: row.blockType === \"megaMenu\" ? true : mapped?.content,\n items: mapped?.items,\n };\n })}\n lockup={lockup}\n onLockupError={() => {\n const next = lockupSrc(identityFallback?.lockup, config.serverURL);\n setLockup((current) => (current?.url === next?.url ? null : next));\n }}\n actions={\n <>\n <PreviewThemeToggle\n dark={previewDark}\n onToggle={() => setTheme(previewDark ? \"light\" : \"dark\")}\n />\n {ctaOn && ctaHref && cta.label ? (\n <a href={ctaHref} className=\"bl-nav-items__preview-cta\">\n {cta.label}\n </a>\n ) : null}\n </>\n }\n openItem={openItem}\n onItemEnter={(label) => setHoverItem(label)}\n />\n </div>\n {openRow ? (\n <div\n className=\"bl-nav-items__preview-stage\"\n data-testid=\"nav-items-preview-mega\"\n onMouseEnter={() => openItem && setHoverItem(openItem)}\n >\n <PreviewMega path={path} index={openIndex} row={openRow} pages={pages} />\n </div>\n ) : null}\n </div>\n\n {current?.blockType === \"megaMenu\" ? (\n <MegaEditor\n path={path}\n index={selected}\n panel={current.panel ?? emptyPanel()}\n readOnly={Boolean(readOnly)}\n />\n ) : items.length === 0 ? (\n <p className=\"bl-nav-items__empty\">Add a link or a mega menu to start the header.</p>\n ) : null}\n </Canvas>\n\n <Dialog open={adding} title=\"Add menu item\" onCancel={() => setAdding(false)}>\n <TypeCards>\n <TypeCard\n icon={<KindGlyph kind=\"navLink\" />}\n label=\"Plain link\"\n description=\"A bar item that goes to a page or URL.\"\n onClick={() => add(\"navLink\")}\n />\n <TypeCard\n icon={<KindGlyph kind=\"megaMenu\" />}\n label=\"Mega menu\"\n description=\"A dropdown of columns, sections, and an optional footer.\"\n onClick={() => add(\"megaMenu\")}\n />\n </TypeCards>\n </Dialog>\n\n <ConfirmDialog\n open={confirmSwitch}\n title=\"Switch to a plain link?\"\n cancelLabel=\"Keep mega menu\"\n confirmLabel=\"Switch to link\"\n onCancel={() => setConfirmSwitch(false)}\n onConfirm={switchToLink}\n >\n This drops the columns, sections, and footer. The label and destination stay.\n </ConfirmDialog>\n </div>\n </KitProvider>\n );\n};\n\nfunction PreviewThemeToggle({ dark, onToggle }: { dark: boolean; onToggle: () => void }) {\n return (\n <button\n type=\"button\"\n className=\"bl-nav-items__preview-theme\"\n aria-label={dark ? \"Switch to light mode\" : \"Switch to dark mode\"}\n onClick={(event) => {\n event.stopPropagation();\n onToggle();\n }}\n >\n {dark ? (\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" aria-hidden>\n <path d=\"M21 14.5A8.5 8.5 0 1 1 9.5 3 7 7 0 0 0 21 14.5z\" />\n </svg>\n ) : (\n <svg viewBox=\"0 0 24 24\" width=\"18\" height=\"18\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" aria-hidden>\n <circle cx=\"12\" cy=\"12\" r=\"4\" />\n <path d=\"M12 3v2M12 19v2M3 12h2M19 12h2M5.6 5.6l1.4 1.4M17 17l1.4 1.4M18.4 5.6 17 7M7 17l-1.4 1.4\" />\n </svg>\n )}\n </button>\n );\n}\n\n/**\n * Kit island, not `FloatingNavBlock`. Payload admin does not load the\n * site Tailwind preset or `BisonProvider`; the live block (and\n * `ThemeToggle`) throw or render unstyled there. Theme Identity still\n * comes from `/api/globals/theme`. The public header stays\n * `headerFromNavigation` → `FloatingNavBlock` (SPI-99).\n */\nfunction PreviewNav({\n items,\n lockup,\n onLockupError,\n actions,\n openItem,\n onItemEnter,\n}: {\n items: { label: string; href?: string; content?: unknown; items?: unknown[] }[];\n lockup: { url: string; alt: string } | null;\n onLockupError: () => void;\n actions?: ReactNode;\n openItem?: string;\n onItemEnter?: (label: string) => void;\n}) {\n return (\n <nav\n aria-label=\"Main\"\n className=\"bl-nav-items__preview-nav\"\n data-open-item={openItem ?? \"\"}\n data-has-logo={lockup ? \"yes\" : \"no\"}\n data-has-actions={actions ? \"yes\" : \"no\"}\n >\n <div className=\"bl-nav-items__preview-logo\">\n {lockup ? (\n <img src={lockup.url} alt={lockup.alt} height={20} onError={onLockupError} />\n ) : null}\n </div>\n <div className=\"bl-nav-items__preview-links\">\n {items.map((item) => (\n <button\n key={item.label}\n type=\"button\"\n className={\n openItem === item.label\n ? \"bl-nav-items__preview-link is-open\"\n : \"bl-nav-items__preview-link\"\n }\n data-preview-item={item.label}\n data-href={item.href ?? \"\"}\n aria-label={`Preview ${item.label}`}\n onMouseEnter={() => onItemEnter?.(item.label)}\n >\n {item.label}\n {item.content || item.items?.length ? <PreviewChevron /> : null}\n </button>\n ))}\n </div>\n <div className=\"bl-nav-items__preview-actions\">{actions}</div>\n </nav>\n );\n}\n\nconst PREVIEW_MAX_WIDTH = { narrow: \"22rem\", standard: \"42rem\", wide: \"48rem\" } as const;\n\nconst PREVIEW_TRACKS: Record<string, number> = {\n \"25\": 3,\n \"33\": 4,\n \"50\": 6,\n \"66\": 8,\n \"75\": 9,\n \"100\": 12,\n};\n\nfunction previewColumnTrack(width: string | null | undefined) {\n const key = String(width ?? \"100\");\n return `minmax(0, ${PREVIEW_TRACKS[key] ?? Math.max(1, Number(key) || 1)}fr)`;\n}\n\nfunction PreviewMega({\n path,\n index,\n row,\n pages,\n}: {\n path: string;\n index: number;\n row: NavRow;\n pages: ReadonlyMap<string, LinkPageDoc>;\n}) {\n const panel = row.panel;\n const columns = panel?.columns ?? [];\n const maxWidthField = useField<string>({ path: `${path}.${index}.panel.maxWidth` });\n const width0 = useField<string>({ path: `${path}.${index}.panel.columns.0.width` });\n const width1 = useField<string>({ path: `${path}.${index}.panel.columns.1.width` });\n const width2 = useField<string>({ path: `${path}.${index}.panel.columns.2.width` });\n const width3 = useField<string>({ path: `${path}.${index}.panel.columns.3.width` });\n const divider1 = useField<boolean>({ path: `${path}.${index}.panel.columns.1.divider` });\n const divider2 = useField<boolean>({ path: `${path}.${index}.panel.columns.2.divider` });\n const divider3 = useField<boolean>({ path: `${path}.${index}.panel.columns.3.divider` });\n const liveWidths = [width0.value, width1.value, width2.value, width3.value];\n const liveDividers = [undefined, divider1.value, divider2.value, divider3.value];\n const maxWidthKey = (maxWidthField.value ?? panel?.maxWidth ?? \"standard\") as keyof typeof PREVIEW_MAX_WIDTH;\n const maxWidth = PREVIEW_MAX_WIDTH[maxWidthKey] ?? PREVIEW_MAX_WIDTH.standard;\n const complete = columns.some((column) =>\n (column.sections ?? []).some((section) =>\n (section.links ?? []).some((link) => {\n const item = link as LinkDestination & { label?: string | null };\n return Boolean(item.label && resolveAdminPreviewLink(item, pages));\n }),\n ),\n );\n const overview = panel?.footer?.overview as (LinkDestination & { label?: string | null }) | undefined;\n const cta = panel?.footer?.cta as (LinkDestination & { label?: string | null }) | undefined;\n const overviewHref = overview ? resolveAdminPreviewLink(overview, pages) : null;\n const ctaHref = cta ? resolveAdminPreviewLink(cta, pages) : null;\n const showFooter = Boolean((overview?.label && overviewHref) || (cta?.label && ctaHref));\n\n return (\n <div className=\"bl-nav-items__mega-preview\" style={{ maxWidth }}>\n {complete ? (\n <div\n className=\"bl-nav-items__preview-columns\"\n style={{\n gridTemplateColumns: columns\n .map((column, columnIndex) => previewColumnTrack(liveWidths[columnIndex] ?? column.width))\n .join(\" \"),\n }}\n >\n {columns.map((column, columnIndex) => (\n <div\n key={columnIndex}\n className={\n columnIndex > 0 && Boolean(liveDividers[columnIndex] ?? column.divider)\n ? \"bl-nav-items__preview-col has-border\"\n : \"bl-nav-items__preview-col\"\n }\n >\n {(column.sections ?? []).map((section, sectionIndex) => {\n const links = (section.links ?? []).flatMap((link, linkIndex) => {\n const item = link as LinkDestination & {\n label?: string | null;\n description?: string | null;\n };\n const href = resolveAdminPreviewLink(item, pages);\n if (!item.label || !href) return [];\n const featured = section.display === \"featured\";\n return [\n <div\n key={`${sectionIndex}-${linkIndex}`}\n className={featured ? \"bl-nav-items__preview-featured\" : \"bl-nav-items__preview-list-row\"}\n >\n {featured ? (\n <>\n <div className=\"title\">{item.label}</div>\n {item.description ? <small>{item.description}</small> : null}\n </>\n ) : (\n <div>\n <strong>{item.label}</strong>\n {item.description ? <small>{item.description}</small> : null}\n </div>\n )}\n </div>,\n ];\n });\n return (\n <div key={sectionIndex}>\n {section.eyebrow ? <div className=\"bl-nav-items__preview-eyebrow\">{section.eyebrow}</div> : null}\n {links.length ? links : <div className=\"bl-nav-items__preview-empty\">Empty section</div>}\n </div>\n );\n })}\n </div>\n ))}\n </div>\n ) : (\n <div className=\"bl-nav-items__preview-empty\">No complete links in this menu yet.</div>\n )}\n {showFooter ? (\n <div className=\"bl-nav-items__preview-footer\">\n {overview?.label && overviewHref ? <a href={overviewHref}>{overview.label}</a> : <span />}\n {cta?.label && ctaHref ? <span className=\"cta\">{cta.label}</span> : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction HeaderCta({ path, readOnly }: { path: string; readOnly?: boolean }) {\n const group = useField({ path });\n const enabled = useField<boolean>({ path: `${path}.enabled` });\n const label = useField<string>({ path: `${path}.label` });\n const page = useField({ path: `${path}.page` });\n const href = useField<string>({ path: `${path}.href` });\n const newTab = useField<boolean>({ path: `${path}.newTab` });\n const on =\n enabled.value === true ||\n (enabled.value !== false && Boolean(label.value || page.value || href.value));\n\n function setEnabled(next: boolean) {\n enabled.setValue(next);\n if (!next) {\n label.setValue(\"\");\n page.setValue(null);\n href.setValue(null);\n newTab.setValue(false);\n }\n }\n\n return (\n <fieldset className=\"bl-nav-items__header-cta\" aria-label=\"Header button\">\n <div className=\"bl-nav-items__header-cta-head\">\n <div>\n <h3>Header button</h3>\n <p>The pill on the right of the bar.</p>\n </div>\n </div>\n <CheckLabel\n className=\"bl-nav-items__header-cta-toggle\"\n checked={on}\n disabled={readOnly}\n onCheckedChange={setEnabled}\n >\n Show Header button\n </CheckLabel>\n {on ? (\n <>\n <Field>\n <Label>\n Label{\" \"}\n <span className=\"bl-nav-items__req\" aria-hidden>\n *\n </span>\n </Label>\n <Input\n value={label.value ?? \"\"}\n disabled={readOnly}\n onChange={(event) => label.setValue(event.target.value)}\n />\n </Field>\n <ComposedLinkField path={`${path}._index-0`} parentPath={path} readOnly={readOnly} />\n <CheckLabel\n checked={Boolean(newTab.value)}\n disabled={readOnly}\n onCheckedChange={(checked) => newTab.setValue(checked)}\n >\n Open in a new tab\n </CheckLabel>\n </>\n ) : null}\n <FieldError path={group.path} showError={group.showError} message={group.errorMessage} />\n </fieldset>\n );\n}\n\nfunction ItemBasics({\n path,\n index,\n readOnly,\n}: {\n path: string;\n index: number;\n readOnly?: boolean;\n}) {\n const label = useField<string>({ path: `${path}.${index}.label` });\n const newTab = useField<boolean>({ path: `${path}.${index}.newTab` });\n return (\n <div className=\"bl-nav-items__basics\">\n <Field>\n <Label>Label</Label>\n <Input\n value={label.value ?? \"\"}\n disabled={readOnly}\n onChange={(event) => label.setValue(event.target.value)}\n />\n </Field>\n <ComposedLinkField\n path={`${path}.${index}._index-0`}\n parentPath={`${path}.${index}`}\n readOnly={readOnly}\n />\n <CheckLabel\n checked={Boolean(newTab.value)}\n disabled={readOnly}\n onCheckedChange={(checked) => newTab.setValue(checked)}\n >\n Open in a new tab\n </CheckLabel>\n </div>\n );\n}\n\nfunction MegaEditor({\n path,\n index,\n panel,\n readOnly,\n}: {\n path: string;\n index: number;\n panel: MegaPanel;\n readOnly: boolean;\n}) {\n const { addFieldRow } = useForm();\n const columns = panel.columns ?? [];\n const columnsError = useField({ path: `${path}.${index}.panel.columns` });\n const columnsPath = `${path}.${index}.panel.columns`;\n const maxWidth = useField<string>({ path: `${path}.${index}.panel.maxWidth` });\n\n return (\n <div className=\"bl-nav-items__mega\">\n <div className=\"bl-nav-items__builder-head\">\n <div>\n <h2>Menu content</h2>\n <p>Set each column’s width here. The header preview is what shows the live layout.</p>\n </div>\n <label className=\"bl-nav-items__tool\">\n Panel width\n <Select\n value={maxWidth.value ?? panel.maxWidth ?? \"standard\"}\n disabled={readOnly}\n onValueChange={(value) => maxWidth.setValue(value)}\n >\n <SelectTrigger aria-label=\"Panel width\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n <SelectItem value=\"narrow\">Narrow</SelectItem>\n <SelectItem value=\"standard\">Standard</SelectItem>\n <SelectItem value=\"wide\">Wide</SelectItem>\n </SelectContent>\n </Select>\n </label>\n </div>\n\n <div\n className=\"bl-nav-items__columns\"\n data-testid=\"nav-items-columns\"\n style={{ gridTemplateColumns: \"repeat(2, minmax(0, 1fr))\" }}\n >\n {columns.map((column, columnIndex) => (\n <ColumnEditor\n key={columnIndex}\n path={path}\n itemIndex={index}\n columnIndex={columnIndex}\n column={column}\n readOnly={readOnly}\n columnCount={columns.length}\n />\n ))}\n </div>\n {readOnly || columns.length >= 4 ? null : (\n <Button\n variant=\"outline\"\n className=\"bl-nav-items__add-column\"\n onClick={() => {\n addFieldRow({\n path: columnsPath,\n schemaPath: columnsPath,\n subFieldState: {\n width: { value: \"25\", valid: true },\n divider: { value: true, valid: true },\n },\n });\n addFieldRow({\n path: `${columnsPath}.${columns.length}.sections`,\n schemaPath: `${columnsPath}.${columns.length}.sections`,\n subFieldState: {\n display: { value: \"list\", valid: true },\n hideDescriptionsOnMobile: { value: true, valid: true },\n },\n });\n }}\n >\n + Add column\n </Button>\n )}\n <FieldError\n path={columnsError.path}\n showError={columnsError.showError}\n message={columnsError.errorMessage}\n />\n\n <section className=\"bl-nav-items__footer\">\n <div className=\"bl-nav-items__footer-head\">\n <div>\n <h3>Footer</h3>\n <p>\n Optional links displayed below the menu columns. The overview is the section’s own\n landing page so it stays reachable from the bar.\n </p>\n </div>\n </div>\n <div className=\"bl-nav-items__footer-body\">\n <div className=\"bl-nav-items__footer-card\">\n <h4>Overview link</h4>\n <ComposedLinkField\n path={`${path}.${index}.panel.footer.overview._index-0`}\n parentPath={`${path}.${index}.panel.footer.overview`}\n readOnly={readOnly}\n />\n <Field>\n <Label>Label</Label>\n <FooterText path={`${path}.${index}.panel.footer.overview.label`} readOnly={readOnly} />\n </Field>\n </div>\n <div className=\"bl-nav-items__footer-card\">\n <h4>Call to action</h4>\n <ComposedLinkField\n path={`${path}.${index}.panel.footer.cta._index-0`}\n parentPath={`${path}.${index}.panel.footer.cta`}\n readOnly={readOnly}\n />\n <Field>\n <Label>Label</Label>\n <FooterText path={`${path}.${index}.panel.footer.cta.label`} readOnly={readOnly} />\n </Field>\n </div>\n </div>\n </section>\n </div>\n );\n}\n\nfunction RowMenu({\n label,\n index,\n count,\n path,\n allowRemove = true,\n onMoved,\n}: {\n label: string;\n index: number;\n count: number;\n path: string;\n allowRemove?: boolean;\n onMoved?: (to: number) => void;\n}) {\n const [open, setOpen] = useState(false);\n const { moveFieldRow, removeFieldRow } = useForm();\n return (\n <div className=\"bl-nav-items__menu\">\n <button type=\"button\" aria-label={`${label} actions`} onClick={() => setOpen((next) => !next)}>\n ⋯\n </button>\n {open ? (\n <div className=\"bl-nav-items__menu-pop\">\n <button\n type=\"button\"\n disabled={index === 0}\n onClick={() => {\n moveFieldRow({ path, moveFromIndex: index, moveToIndex: index - 1 });\n onMoved?.(index - 1);\n setOpen(false);\n }}\n >\n Move up\n </button>\n <button\n type=\"button\"\n disabled={index === count - 1}\n onClick={() => {\n moveFieldRow({ path, moveFromIndex: index, moveToIndex: index + 1 });\n onMoved?.(index + 1);\n setOpen(false);\n }}\n >\n Move down\n </button>\n {allowRemove ? (\n <button\n type=\"button\"\n className=\"bl-nav-kit__danger\"\n onClick={() => {\n removeFieldRow({ path, rowIndex: index });\n setOpen(false);\n }}\n >\n Delete\n </button>\n ) : null}\n </div>\n ) : null}\n </div>\n );\n}\n\nfunction useRowActions({\n index,\n count,\n path,\n allowRemove = true,\n onMoved,\n readOnly,\n}: {\n index: number;\n count: number;\n path: string;\n allowRemove?: boolean;\n onMoved?: (to: number) => void;\n readOnly?: boolean;\n}): FoldAction[] | undefined {\n const { moveFieldRow, removeFieldRow } = useForm();\n if (readOnly) return undefined;\n const actions: FoldAction[] = [\n {\n label: \"Move up\",\n disabled: index === 0,\n onClick: () => {\n moveFieldRow({ path, moveFromIndex: index, moveToIndex: index - 1 });\n onMoved?.(index - 1);\n },\n },\n {\n label: \"Move down\",\n disabled: index === count - 1,\n onClick: () => {\n moveFieldRow({ path, moveFromIndex: index, moveToIndex: index + 1 });\n onMoved?.(index + 1);\n },\n },\n ];\n if (allowRemove) {\n actions.push({\n label: \"Delete\",\n danger: true,\n onClick: () => removeFieldRow({ path, rowIndex: index }),\n });\n }\n return actions;\n}\n\nfunction MegaLinkEditor({\n path,\n arrayPath,\n index,\n count,\n label,\n readOnly,\n}: {\n path: string;\n arrayPath: string;\n index: number;\n count: number;\n label?: string | null;\n readOnly: boolean;\n}) {\n const description = useField<string>({ path: `${path}.description` });\n const newTab = useField<boolean>({ path: `${path}.newTab` });\n const name = label?.trim() || \"Untitled\";\n const actions = useRowActions({ index, count, path: arrayPath, readOnly });\n return (\n <Fold title={name} tone=\"dark\" actions={actions}>\n <Field>\n <Label>Label</Label>\n <FooterText path={`${path}.label`} readOnly={readOnly} />\n </Field>\n <ComposedLinkField path={`${path}._index-0`} parentPath={path} readOnly={readOnly} />\n <Field>\n <Label>Description</Label>\n <Textarea\n value={description.value ?? \"\"}\n disabled={readOnly}\n rows={2}\n onChange={(event) => description.setValue(event.target.value)}\n />\n </Field>\n <CheckLabel\n checked={Boolean(newTab.value)}\n disabled={readOnly}\n onCheckedChange={(checked) => newTab.setValue(checked)}\n >\n Open in a new tab\n </CheckLabel>\n </Fold>\n );\n}\n\nfunction FooterText({ path, readOnly }: { path: string; readOnly: boolean }) {\n const field = useField<string>({ path });\n return (\n <Input\n value={field.value ?? \"\"}\n disabled={readOnly}\n onChange={(event) => field.setValue(event.target.value)}\n />\n );\n}\n\nfunction PreviewChevron() {\n return (\n <svg\n className=\"bl-nav-items__preview-chevron\"\n viewBox=\"0 0 24 24\"\n width=\"12\"\n height=\"12\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden\n >\n <path d=\"m6 9 6 6 6-6\" />\n </svg>\n );\n}\n\nfunction CheckLabel({\n checked,\n disabled,\n onCheckedChange,\n children,\n className,\n}: {\n checked: boolean;\n disabled?: boolean;\n onCheckedChange: (checked: boolean) => void;\n children: ReactNode;\n className?: string;\n}) {\n return (\n <label className={[\"bl-nav-items__check\", className].filter(Boolean).join(\" \")}>\n <Checkbox\n checked={checked}\n disabled={disabled}\n onCheckedChange={(value) => onCheckedChange(value === true)}\n />\n {children}\n </label>\n );\n}\n\nfunction ColumnEditor({\n path,\n itemIndex,\n columnIndex,\n column,\n readOnly,\n columnCount,\n}: {\n path: string;\n itemIndex: number;\n columnIndex: number;\n column: MegaColumn;\n readOnly: boolean;\n columnCount: number;\n}) {\n const { addFieldRow } = useForm();\n const width = useField<string>({ path: `${path}.${itemIndex}.panel.columns.${columnIndex}.width` });\n const divider = useField<boolean>({ path: `${path}.${itemIndex}.panel.columns.${columnIndex}.divider` });\n const columnsPath = `${path}.${itemIndex}.panel.columns`;\n const sectionsPath = `${path}.${itemIndex}.panel.columns.${columnIndex}.sections`;\n const sections = column.sections ?? [];\n const columnName = `Column ${columnIndex + 1}`;\n const actions = useRowActions({\n index: columnIndex,\n count: columnCount,\n path: columnsPath,\n allowRemove: columnCount > 1,\n readOnly,\n });\n\n return (\n <Fold\n title={columnName}\n tone=\"light\"\n badge={`${width.value ?? column.width ?? \"100\"}%`}\n meta={(open) =>\n open ? null : (\n <small>\n {sections.length} {sections.length === 1 ? \"section\" : \"sections\"}\n </small>\n )\n }\n actions={actions}\n >\n <Stack>\n <div className=\"bl-nav-items__column-settings\">\n <Field>\n <Label>Width</Label>\n <Select\n value={width.value ?? column.width ?? \"100\"}\n disabled={readOnly}\n onValueChange={(value) => width.setValue(value)}\n >\n <SelectTrigger aria-label=\"Width\">\n <SelectValue />\n </SelectTrigger>\n <SelectContent>\n {WIDTHS.map((option) => (\n <SelectItem key={option} value={option}>\n {option}%\n </SelectItem>\n ))}\n </SelectContent>\n </Select>\n </Field>\n {columnIndex > 0 ? (\n <CheckLabel\n checked={Boolean(divider.value ?? column.divider)}\n disabled={readOnly}\n onCheckedChange={(checked) => divider.setValue(checked)}\n >\n Draw a line on the left\n </CheckLabel>\n ) : null}\n </div>\n {sections.map((section, sectionIndex) => (\n <SectionEditor\n key={sectionIndex}\n path={path}\n itemIndex={itemIndex}\n columnIndex={columnIndex}\n sectionIndex={sectionIndex}\n section={section}\n readOnly={readOnly}\n sectionCount={sections.length}\n />\n ))}\n {readOnly || sections.length >= 8 ? null : (\n <Button\n variant=\"outline\"\n className=\"bl-nav-items__add-section\"\n onClick={() =>\n addFieldRow({\n path: sectionsPath,\n schemaPath: sectionsPath,\n subFieldState: {\n display: { value: \"list\", valid: true },\n hideDescriptionsOnMobile: { value: true, valid: true },\n },\n })\n }\n >\n + Add section to this column\n </Button>\n )}\n </Stack>\n </Fold>\n );\n}\n\nfunction SectionEditor({\n path,\n itemIndex,\n columnIndex,\n sectionIndex,\n section,\n readOnly,\n sectionCount,\n}: {\n path: string;\n itemIndex: number;\n columnIndex: number;\n sectionIndex: number;\n section: MegaSection;\n readOnly: boolean;\n sectionCount: number;\n}) {\n const { addFieldRow } = useForm();\n const base = `${path}.${itemIndex}.panel.columns.${columnIndex}.sections.${sectionIndex}`;\n const sectionsPath = `${path}.${itemIndex}.panel.columns.${columnIndex}.sections`;\n const display = useField<\"featured\" | \"list\">({ path: `${base}.display` });\n const eyebrow = useField<string>({ path: `${base}.eyebrow` });\n const hideMobile = useField<boolean>({ path: `${base}.hideDescriptionsOnMobile` });\n const links = section.links ?? [];\n const featured = (display.value ?? section.display) === \"featured\";\n const sectionName = eyebrow.value || section.eyebrow || \"Untitled section\";\n const actions = useRowActions({\n index: sectionIndex,\n count: sectionCount,\n path: sectionsPath,\n readOnly,\n });\n return (\n <Fold\n title={sectionName}\n tone=\"dark\"\n meta={(open) => (\n <>\n <small>{featured ? \"featured\" : \"list\"}</small>\n {open ? null : (\n <small>\n {links.length} {links.length === 1 ? \"link\" : \"links\"}\n </small>\n )}\n </>\n )}\n actions={actions}\n >\n <Stack>\n <div className=\"bl-nav-items__section-settings\">\n <Field>\n <Label>Eyebrow</Label>\n <Input\n value={eyebrow.value ?? section.eyebrow ?? \"\"}\n disabled={readOnly}\n placeholder=\"Optional heading\"\n onChange={(event) => eyebrow.setValue(event.target.value)}\n />\n </Field>\n <Field as=\"div\">\n <Label>Display</Label>\n <div className=\"bl-nav-items__seg\">\n <button\n type=\"button\"\n className={featured ? \"is-active\" : undefined}\n disabled={readOnly}\n onClick={() => display.setValue(\"featured\")}\n >\n Featured\n </button>\n <button\n type=\"button\"\n className={!featured ? \"is-active\" : undefined}\n disabled={readOnly}\n onClick={() => display.setValue(\"list\")}\n >\n List\n </button>\n </div>\n </Field>\n <CheckLabel\n checked={(hideMobile.value ?? section.hideDescriptionsOnMobile) !== false}\n disabled={readOnly}\n onCheckedChange={(checked) => hideMobile.setValue(checked)}\n >\n Hide descriptions on mobile\n </CheckLabel>\n </div>\n {links.map((link, linkIndex) => (\n <MegaLinkEditor\n key={linkIndex}\n path={`${base}.links.${linkIndex}`}\n arrayPath={`${base}.links`}\n index={linkIndex}\n count={links.length}\n label={(link as { label?: string | null }).label}\n readOnly={readOnly}\n />\n ))}\n {readOnly ? null : (\n <Button\n variant=\"outline\"\n className=\"bl-nav-items__inline-add\"\n onClick={() =>\n addFieldRow({\n path: `${base}.links`,\n schemaPath: `${base}.links`,\n subFieldState: {\n label: { value: \"New link\", valid: true },\n type: { value: \"page\", valid: true },\n },\n })\n }\n >\n + Add link\n </Button>\n )}\n </Stack>\n </Fold>\n );\n}\n\nconst CSS = `\n.bl-nav-items{--bg:var(--theme-bg,var(--theme-elevation-0,#fff));--panel:var(--theme-elevation-50,#f4f4f5);--panel2:var(--theme-elevation-100,#e4e4e7);--line:var(--theme-elevation-150,#e4e4e7);--line2:var(--theme-elevation-250,#d4d4d8);--text:var(--theme-text,var(--theme-elevation-800,#18181b));--muted:var(--theme-elevation-500,#71717a);--pink:var(--bl-kit-accent,#e60088);display:grid;grid-template-columns:300px minmax(0,1fr);grid-template-rows:minmax(0,1fr);min-height:0;background:var(--bg);color:var(--text);font:14px/1.45 Inter,ui-sans-serif,system-ui,sans-serif}\n.bl-nav-items button:not([class*=\"bl-nav-kit\"]),.bl-nav-items input:not([class*=\"bl-nav-kit\"]),.bl-nav-items select:not([class*=\"bl-nav-kit\"]),.bl-nav-items textarea:not([class*=\"bl-nav-kit\"]){font:inherit;color:inherit}\n.bl-workspace__rail{border-right:1px solid var(--line);background:var(--theme-elevation-50,var(--panel));min-width:0;min-height:0;height:100%;display:flex;flex-direction:column;overflow:hidden}\n.bl-nav-items__rail-body{padding:12px;flex:1;min-height:0;overflow:auto}\n.bl-workspace__rail-slot{flex:none;min-height:0;max-height:100%;overflow:auto;border-top:1px solid var(--line);background:var(--theme-elevation-0,var(--bg));padding:14px 12px 16px}\n.bl-nav-items__header-cta{margin:0;padding:0;border:0;min-width:0}\n.bl-nav-items__header-cta-head{display:flex;align-items:flex-start;gap:10px;margin-bottom:10px}\n.bl-nav-items__header-cta-head h3{margin:0;font-size:14px}\n.bl-nav-items__header-cta-head p{margin:3px 0 0;color:var(--muted);font-size:12px}\n.bl-nav-items__req{color:var(--pink)}\n.bl-nav-items__list{list-style:none;margin:0;padding:0}\n.bl-nav-items__list li{border:1px solid transparent;border-radius:9px;margin-bottom:7px}\n.bl-nav-items__list li[data-selected=\"true\"]{border-color:var(--line2);background:var(--theme-elevation-100,var(--panel2))}\n.bl-nav-items__rail-row{display:grid;grid-template-columns:20px 1fr auto;gap:8px;align-items:center;padding:6px 8px}\n.bl-nav-items__rail-label{border:0;background:transparent;text-align:left;font:inherit;font-weight:650;color:inherit;cursor:pointer;min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}\n.bl-nav-items__badge{width:28px;height:28px;display:grid;place-items:center;border-radius:7px;background:var(--theme-elevation-150,var(--line));color:var(--theme-elevation-800,var(--text))}\n.bl-nav-items__badge[data-kind=\"megaMenu\"]{background:color-mix(in srgb,var(--pink) 22%,var(--theme-elevation-0,var(--bg)));color:var(--pink)}\n.bl-nav-items__rail-edit{display:block;border-top:1px solid var(--line);padding:10px}\n.bl-nav-items__add,.bl-nav-items__add-section,.bl-nav-items__add-column,.bl-nav-items__inline-add{width:100%}\n.bl-nav-items__add-column{margin-top:12px}\n.bl-workspace__canvas{min-width:0;min-height:0;height:100%;overflow:auto;padding:0 28px 44px;max-width:1250px;margin:0 auto;width:100%}\n.bl-workspace__main-head{padding:18px 0 14px;display:flex;justify-content:space-between;align-items:flex-start}\n.bl-workspace__main-head h1{font-size:20px;margin:2px 0 4px}\n.bl-workspace__main-head p{margin:0;color:var(--muted)}\n.bl-nav-items__preview-block{position:sticky;top:0;z-index:20;background:transparent;padding:0;overflow:visible}\n.bl-nav-items__preview{padding:16px;display:flex;flex-direction:column;gap:16px;background:var(--panel);border:1px solid var(--line);border-radius:12px;overflow:visible}\n.bl-nav-items__preview-theme{border:0;background:transparent;color:inherit;width:36px;height:36px;display:grid;place-items:center;border-radius:8px;cursor:pointer;flex:none}\n.bl-nav-items__preview-theme:hover{background:#24242b}\n.bl-nav-items__preview-block[data-theme=\"dark\"] .bl-nav-items__preview-logo img{filter:invert(1) hue-rotate(180deg)}\n.bl-nav-items__preview-block[data-theme=\"light\"] .bl-nav-items__preview-nav{background:rgba(255,255,255,.92);border-color:#d8dbe2}\n.bl-nav-items__preview-block[data-theme=\"light\"] .bl-nav-items__preview-link{color:#1b1d22}\n.bl-nav-items__preview-block[data-theme=\"light\"] .bl-nav-items__preview-link.is-open{background:#eceef2}\n.bl-nav-items__preview-block[data-theme=\"light\"] .bl-nav-items__preview-theme{color:#1b1d22}\n.bl-nav-items__preview-block[data-theme=\"light\"] .bl-nav-items__preview-theme:hover{background:#eceef2}\n.bl-nav-items__preview-block[data-theme=\"light\"] .bl-nav-items__mega-preview{background:#fff;color:#1b1d22}\n.bl-nav-items__preview-block[data-theme=\"light\"] .bl-nav-items__preview-footer{background:#f4f5f7}\n.bl-nav-items__preview-stage{position:absolute;left:0;right:0;top:100%;z-index:21;padding:8px 0 0;pointer-events:auto}\n.bl-nav-items__mega-preview{margin:0 auto;background:#18191d;border:1px solid var(--line);border-radius:8px;box-shadow:0 12px 32px rgba(0,0,0,.4);overflow:hidden}\n.bl-nav-items__preview-columns{display:grid;gap:24px;padding:16px}\n.bl-nav-items__preview-col{padding:0;min-width:0}\n.bl-nav-items__preview-col.has-border{border-left:1px solid var(--line);padding-left:24px}\n.bl-nav-items__preview-eyebrow{font-size:12px;font-weight:650;color:#afb3bd;text-transform:uppercase;letter-spacing:.04em;margin:0 8px 8px}\n.bl-nav-items__preview-list-row{display:flex;gap:12px;align-items:flex-start;padding:8px}\n.bl-nav-items__preview-list-row strong{display:block}\n.bl-nav-items__preview-list-row small,.bl-nav-items__preview-featured small{display:block;color:#aeb2bc;margin-top:2px}\n.bl-nav-items__preview-featured{padding:12px}\n.bl-nav-items__preview-featured .title{font-size:16px;font-weight:650}\n.bl-nav-items__preview-empty{color:var(--muted);font-size:13px;padding:28px;text-align:center}\n.bl-nav-items__preview-footer{display:flex;align-items:center;justify-content:space-between;gap:12px;padding:12px 16px;background:#1f2126;border-top:1px solid var(--line)}\n.bl-nav-items__preview-footer a{color:var(--pink2,#ff2da5);text-decoration:underline;text-underline-offset:2px;font-weight:650;font-size:13px}\n.bl-nav-items__preview-footer .cta{background:var(--pink);padding:8px 12px;border-radius:8px;color:#fff;font-weight:650;font-size:13px}\n.bl-nav-items__preview-nav{display:grid;grid-template-columns:minmax(0,1fr) auto minmax(0,1fr);align-items:center;gap:24px;padding:12px 16px 12px 20px;overflow:hidden;border:1px solid var(--line);border-radius:12px;background:rgba(20,21,24,.85)}\n.bl-nav-items__preview-logo{justify-self:start;min-width:0;display:flex;align-items:center}\n.bl-nav-items__preview-logo img{height:20px;width:auto;display:block}\n.bl-nav-items__preview-links{display:flex;align-items:center;justify-content:center;gap:4px;min-width:0}\n.bl-nav-items__preview-link{display:inline-flex;align-items:center;gap:4px;color:#d7dae0;background:none;border:0;padding:8px 12px;border-radius:8px;font-weight:550;cursor:pointer;white-space:nowrap}\n.bl-nav-items__preview-link.is-open{background:#24242b}\n.bl-nav-items__preview-chevron{flex:none;width:12px;height:12px;transition:transform .2s}\n.bl-nav-items__preview-link.is-open .bl-nav-items__preview-chevron{transform:rotate(180deg)}\n.bl-nav-items__preview-actions{justify-self:end;display:flex;align-items:center;justify-content:flex-end;gap:8px}\n.bl-nav-items__preview-cta{flex:none;background:var(--pink);border:0;border-radius:8px;color:#fff;font-weight:650;font-size:13px;padding:8px 12px;white-space:nowrap;text-decoration:none}\n.bl-nav-items__builder-head{display:flex;align-items:flex-start;justify-content:space-between;gap:16px;margin:26px 0 10px}\n.bl-nav-items__builder-head h2{font-size:18px;margin:0}\n.bl-nav-items__builder-head p{margin:3px 0 0;color:var(--muted);font-size:13px}\n.bl-nav-items__builder-tools{display:flex;gap:10px;align-items:center;flex-wrap:wrap}\n.bl-nav-items__tool{display:flex;align-items:center;gap:8px;color:var(--muted);font-size:12px}\n.bl-nav-items__tool .bl-nav-kit__select-trigger{width:auto;min-width:160px}\n.bl-nav-items__columns{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px;align-items:start}\n.bl-nav-items__columns:has(> :only-child){grid-template-columns:minmax(0,1fr)}\n.bl-nav-items__column-settings{display:grid;grid-template-columns:1fr;gap:10px;padding:10px;background:var(--theme-elevation-50,var(--panel));border:1px solid var(--line);border-radius:9px;align-items:center}\n.bl-nav-items__column-settings .bl-nav-kit__field{margin:0}\n.bl-nav-items__column-settings .bl-nav-kit__select-trigger{width:100%}\n.bl-nav-items__check{display:flex;align-items:center;gap:12px;font-size:13px;font-weight:500;color:var(--text)}\n.bl-nav-items__header-cta .bl-nav-items__check{gap:16px}\n.bl-nav-items__header-cta-toggle{margin-bottom:20px}\n.bl-nav-items__seg{display:grid;grid-template-columns:1fr 1fr;gap:6px}\n.bl-nav-items__seg button{border:1px solid var(--line2);background:var(--theme-elevation-50,var(--panel));border-radius:7px;padding:8px 6px;font-size:12px;color:inherit;cursor:pointer}\n.bl-nav-items__seg button.is-active{border-color:var(--pink);background:color-mix(in srgb,var(--pink) 16%,var(--theme-elevation-0,var(--bg)))}\n.bl-nav-items__section-settings{padding:10px 12px;border:1px solid var(--line);background:var(--theme-elevation-50,var(--panel));border-radius:9px}\n.bl-nav-items__footer,.bl-nav-items__panel{margin-top:18px;border:1px solid var(--line2);background:var(--theme-elevation-50,var(--panel));border-radius:12px;overflow:hidden}\n.bl-nav-items__footer-head,.bl-nav-items__panel-head{display:flex;align-items:flex-start;justify-content:space-between;padding:14px 16px;border-bottom:1px solid var(--line);gap:12px}\n.bl-nav-items__footer-head h3,.bl-nav-items__panel-head h3{margin:0;font-size:16px}\n.bl-nav-items__footer-head p,.bl-nav-items__panel-head p{margin:3px 0 0;color:var(--muted);font-size:12px}\n.bl-nav-items__footer-body,.bl-nav-items__panel-body{padding:14px 16px}\n.bl-nav-items__footer-body{display:grid;grid-template-columns:1fr 1fr;gap:14px}\n.bl-nav-items__footer-card{background:var(--theme-elevation-0,var(--bg));border:1px solid var(--line);border-radius:10px;padding:14px}\n.bl-nav-items__footer-card h4{margin:0 0 12px;font-size:14px}\n.bl-nav-items__panel-body{max-width:480px}\n.bl-nav-items__empty{color:var(--muted);font-size:13px;padding:28px;text-align:center}\n.bl-nav-items__menu{position:relative}\n.bl-nav-items__menu > button{border:0;background:transparent;color:inherit;cursor:pointer}\n.bl-nav-items__menu-pop{position:absolute;right:0;top:34px;z-index:12;min-width:140px;padding:4px;border:1px solid var(--line2);border-radius:8px;background:var(--theme-elevation-50,var(--panel))}\n.bl-nav-items__menu-pop button{display:block;width:100%;text-align:left;border:0;background:transparent;padding:7px 8px;border-radius:6px;color:var(--text);cursor:pointer}\n.bl-nav-items .field-label,.bl-nav-items .field-label__label{display:block !important;margin:0;padding:0;font:12px/1.2 Inter,ui-sans-serif,system-ui,sans-serif;font-weight:700;color:inherit}\n.bl-nav-items .field-description,.bl-nav-items .field__description{display:none !important}\n.bl-nav-items .bl-link-field{display:flex;flex-direction:column;gap:8px;margin:0 0 16px}\n.bl-nav-items .bl-link-field__control{background:var(--theme-input-bg,var(--theme-elevation-0,#fff));border:1px solid var(--theme-elevation-250,var(--line2));border-radius:8px;min-height:auto;padding:8px 10px;color:var(--text);box-shadow:none}\n.bl-nav-items .bl-link-field__kind{background:var(--theme-elevation-150,var(--line));color:var(--theme-elevation-800,var(--text));border-radius:999px;padding:3px 7px}\n.bl-nav-items .bl-link-field__kind:first-letter{text-transform:uppercase}\n@media(max-width:1280px){.bl-nav-items{grid-template-columns:250px minmax(0,1fr)}}\n@media(max-width:850px){.bl-nav-items{grid-template-columns:1fr}.bl-nav-items__footer-body,.bl-nav-items__columns,.bl-nav-items__columns:has(> :only-child){grid-template-columns:minmax(0,1fr) !important}}\n`;\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@bison-lab/payload-blocks",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.26.0",
|
|
4
4
|
"description": "Payload CMS block configs and renderers for the Bison Lab marketing blocks",
|
|
5
5
|
"homepage": "https://components.bisonlab.ai",
|
|
6
6
|
"repository": {
|
|
@@ -36,7 +36,7 @@
|
|
|
36
36
|
"dist"
|
|
37
37
|
],
|
|
38
38
|
"dependencies": {
|
|
39
|
-
"@bison-lab/admin-ui": "3.
|
|
39
|
+
"@bison-lab/admin-ui": "3.26.0"
|
|
40
40
|
},
|
|
41
41
|
"peerDependencies": {
|
|
42
42
|
"@bison-lab/payload-core": "^3.0.0",
|
|
@@ -79,7 +79,7 @@
|
|
|
79
79
|
"tsdown": "^0.21.0",
|
|
80
80
|
"typescript": "^5.9.3",
|
|
81
81
|
"vitest": "^4.1.2",
|
|
82
|
-
"@bison-lab/payload-core": "3.
|
|
82
|
+
"@bison-lab/payload-core": "3.26.0",
|
|
83
83
|
"@bison-lab/ui": "3.22.0"
|
|
84
84
|
},
|
|
85
85
|
"publishConfig": {
|