@bison-lab/payload-blocks 3.5.0 → 3.20.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.
@@ -1 +1 @@
1
- {"version":3,"file":"admin.mjs","names":[],"sources":["../src/admin/link-field.tsx","../src/admin/min-rows-array-field.tsx"],"sourcesContent":["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"],"mappings":"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"}
1
+ {"version":3,"file":"admin.mjs","names":["CSS"],"sources":["../src/admin/link-field.tsx","../src/admin/min-rows-array-field.tsx","../src/admin/nav-items-field.tsx"],"sourcesContent":["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} from \"@payloadcms/ui\";\nimport { ConfirmDialog, LinkGlyph, MegaGlyph, TypeCard, TypeCards } from \"@bison-lab/admin-ui\";\nimport { themeHeadFromDoc, type ThemeDoc } from \"@bison-lab/payload-core/theme\";\nimport { FloatingNavBlock } from \"@bison-lab/ui\";\nimport type { BlocksFieldClientComponent } from \"payload\";\nimport { useEffect, useMemo, useRef, useState } 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(/\\[data-theme=\"dark\"\\]/g, `${THEME_SCOPE}[data-theme=\"dark\"]`);\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 collectPageIds(items: NavRow[]): 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 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<NavRow[]>({ path });\n const items = Array.isArray(itemsField.value) ? itemsField.value : [];\n const { addFieldRow, replaceFieldRow, removeFieldRow, moveFieldRow } = useForm();\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 [menu, setMenu] = useState<number | null>(null);\n const [atTop, setAtTop] = useState(true);\n const sentinel = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (selected >= items.length) setSelected(Math.max(0, items.length - 1));\n }, [items.length, selected]);\n\n useEffect(() => {\n const el = sentinel.current;\n if (!el) return;\n const leave = () => setAtTop(false);\n const enter = () => setAtTop(true);\n el.addEventListener(\"nav-items-preview-leave\", leave);\n el.addEventListener(\"nav-items-preview-enter\", enter);\n const io = new IntersectionObserver(([entry]) => {\n if (entry) setAtTop(entry.isIntersecting);\n });\n io.observe(el);\n return () => {\n el.removeEventListener(\"nav-items-preview-leave\", leave);\n el.removeEventListener(\"nav-items-preview-enter\", enter);\n io.disconnect();\n };\n }, []);\n\n const current = items[selected];\n const [pages, setPages] = useState<Map<string, LinkPageDoc>>(() => new Map());\n const pageIds = useMemo(() => collectPageIds(items).sort().join(\",\"), [items]);\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 openItem =\n atTop && current?.blockType === \"megaMenu\" && current.label ? current.label : undefined;\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 setRow(name: string, value: unknown) {\n itemsField.setValue(\n items.map((row, i) => (i === selected ? { ...row, [name]: value } : row)),\n );\n }\n\n function setPanel(patch: Partial<MegaPanel>) {\n if (current?.blockType !== \"megaMenu\") return;\n setRow(\"panel\", { ...(current.panel ?? emptyPanel()), ...patch });\n }\n\n function setColumns(columns: MegaColumn[]) {\n const next = columns.map((column, i) => (i === 0 ? { ...column, divider: false } : column));\n setPanel({ columns: next });\n }\n\n function onPreviewClick(event: React.MouseEvent) {\n const target = event.target as HTMLElement;\n const labelled = target.closest(\"[data-preview-item]\")?.getAttribute(\"data-preview-item\");\n const label = labelled ?? items.find((row) => row.label && target.textContent?.includes(row.label))?.label;\n if (!label) return;\n const index = items.findIndex((row) => row.label === label);\n if (index >= 0) setSelected(index);\n }\n\n const [themeCss, setThemeCss] = useState(\"\");\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 || !doc) return;\n setThemeCss(scopeThemeCss(themeHeadFromDoc(doc, THEME_SEED).css));\n })\n .catch(() => undefined);\n return () => {\n cancelled = true;\n };\n }, [endpoint]);\n\n void field;\n\n return (\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 <aside className=\"bl-nav-items__rail\">\n <div className=\"bl-nav-items__rail-head\">\n <p className=\"bl-nav-items__kicker\">Header navigation</p>\n <h2>Menu items</h2>\n </div>\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 <span className=\"bl-nav-items__badge\" data-kind={row.blockType} aria-hidden>\n {row.blockType === \"megaMenu\" ? <MegaGlyph /> : <LinkGlyph />}\n </span>\n <button type=\"button\" className=\"bl-nav-items__rail-label\" onClick={() => setSelected(index)}>\n {row.label || \"Untitled\"}\n </button>\n {readOnly ? null : (\n <div className=\"bl-nav-items__menu\">\n <button\n type=\"button\"\n aria-label={`${row.label || \"Item\"} actions`}\n onClick={() => setMenu(menu === index ? null : index)}\n >\n ⋯\n </button>\n {menu === index ? (\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 setSelected(index - 1);\n setMenu(null);\n }}\n >\n Move up\n </button>\n <button\n type=\"button\"\n disabled={index === items.length - 1}\n onClick={() => {\n moveFieldRow({ path, moveFromIndex: index, moveToIndex: index + 1 });\n setSelected(index + 1);\n setMenu(null);\n }}\n >\n Move down\n </button>\n <button\n type=\"button\"\n className=\"bl-nav-kit__danger\"\n onClick={() => {\n removeFieldRow({ path, rowIndex: index });\n setMenu(null);\n }}\n >\n Delete\n </button>\n </div>\n ) : null}\n </div>\n )}\n </div>\n {index === selected ? (\n <div className=\"bl-nav-items__rail-edit\">\n <TypeCards compact>\n <TypeCard icon={<LinkGlyph />} label=\"Link\" onClick={() => requestType(\"navLink\")} />\n <TypeCard icon={<MegaGlyph />} label=\"Mega\" onClick={() => requestType(\"megaMenu\")} />\n </TypeCards>\n <ItemBasics path={path} index={index} readOnly={readOnly} />\n </div>\n ) : null}\n </li>\n ))}\n </ul>\n {readOnly ? null : (\n <button type=\"button\" className=\"bl-nav-items__add\" onClick={() => setAdding(true)}>\n Add item\n </button>\n )}\n </aside>\n\n <div className=\"bl-nav-items__main\">\n <div\n className=\"bl-nav-items__sentinel\"\n data-testid=\"nav-items-preview-sentinel\"\n ref={sentinel}\n aria-hidden\n />\n <div data-preview-chrome data-sticky=\"true\" className=\"bl-nav-items__preview\" onClick={onPreviewClick}>\n <FloatingNavBlock\n items={previewItems}\n hideOnScroll={false}\n breakpoint=\"lg\"\n openItem={openItem}\n className=\"bl-nav-items__bar\"\n />\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 onColumns={setColumns}\n onPanel={setPanel}\n />\n ) : current ? (\n <p className=\"bl-nav-items__empty\">\n A plain link is edited in the rail: label, destination, and new tab.\n </p>\n ) : (\n <p className=\"bl-nav-items__empty\">Add a link or a mega menu to start the header.</p>\n )}\n </div>\n\n {adding ? (\n <div className=\"bl-nav-kit__modal\" role=\"dialog\" aria-labelledby=\"bl-nav-add-title\">\n <div className=\"bl-nav-kit__modal-card\">\n <h2 id=\"bl-nav-add-title\">Add menu item</h2>\n <TypeCards>\n <TypeCard\n icon={<LinkGlyph />}\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={<MegaGlyph />}\n label=\"Mega menu\"\n description=\"A dropdown of columns, sections, and an optional footer.\"\n onClick={() => add(\"megaMenu\")}\n />\n </TypeCards>\n <button type=\"button\" className=\"bl-nav-items__add\" onClick={() => setAdding(false)}>\n Cancel\n </button>\n </div>\n </div>\n ) : null}\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 );\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 <label className=\"bl-nav-items__field\">\n <span>Label</span>\n <input\n value={label.value ?? \"\"}\n disabled={readOnly}\n onChange={(event) => label.setValue(event.target.value)}\n />\n </label>\n <ComposedLinkField\n path={`${path}.${index}._index-0`}\n parentPath={`${path}.${index}`}\n readOnly={readOnly}\n />\n <label className=\"bl-nav-items__check\">\n <input\n type=\"checkbox\"\n checked={Boolean(newTab.value)}\n disabled={readOnly}\n onChange={(event) => newTab.setValue(event.target.checked)}\n />\n Open in a new tab\n </label>\n </div>\n );\n}\n\nfunction MegaEditor({\n path,\n index,\n panel,\n readOnly,\n onColumns,\n onPanel,\n}: {\n path: string;\n index: number;\n panel: MegaPanel;\n readOnly: boolean;\n onColumns: (columns: MegaColumn[]) => void;\n onPanel: (patch: Partial<MegaPanel>) => void;\n}) {\n const columns = panel.columns ?? [];\n const columnsError = useField({ path: `${path}.${index}.panel.columns` });\n\n return (\n <div className=\"bl-nav-items__mega\">\n <label className=\"bl-nav-items__field\">\n <span>Dropdown width</span>\n <select\n value={panel.maxWidth ?? \"standard\"}\n disabled={readOnly}\n onChange={(event) =>\n onPanel({ maxWidth: event.target.value as MegaPanel[\"maxWidth\"] })\n }\n >\n <option value=\"narrow\">Narrow</option>\n <option value=\"standard\">Standard</option>\n <option value=\"wide\">Wide</option>\n </select>\n </label>\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 <fieldset\n key={columnIndex}\n className=\"bl-nav-items__column\"\n aria-label={`Column ${columnIndex + 1}`}\n >\n <legend>Column {columnIndex + 1}</legend>\n <div className=\"bl-nav-items__column-settings\">\n <label className=\"bl-nav-items__field\">\n <span>Width</span>\n <select\n value={column.width ?? \"100\"}\n disabled={readOnly}\n onChange={(event) =>\n onColumns(\n columns.map((row, i) =>\n i === columnIndex ? { ...row, width: event.target.value } : row,\n ),\n )\n }\n >\n {WIDTHS.map((width) => (\n <option key={width} value={width}>\n {width}%\n </option>\n ))}\n </select>\n </label>\n {columnIndex > 0 ? (\n <label className=\"bl-nav-items__check\">\n <input\n type=\"checkbox\"\n checked={Boolean(column.divider)}\n disabled={readOnly}\n onChange={(event) =>\n onColumns(\n columns.map((row, i) =>\n i === columnIndex ? { ...row, divider: event.target.checked } : row,\n ),\n )\n }\n />\n Draw a line on the left of this column\n </label>\n ) : null}\n </div>\n {(column.sections ?? []).map((section, sectionIndex) => (\n <SectionEditor\n key={sectionIndex}\n path={path}\n itemIndex={index}\n columnIndex={columnIndex}\n sectionIndex={sectionIndex}\n section={section}\n readOnly={readOnly}\n onChange={(next) =>\n onColumns(\n columns.map((row, i) =>\n i === columnIndex\n ? {\n ...row,\n sections: (row.sections ?? []).map((entry, j) =>\n j === sectionIndex ? next : entry,\n ),\n }\n : row,\n ),\n )\n }\n />\n ))}\n {readOnly || (column.sections?.length ?? 0) >= 8 ? null : (\n <button\n type=\"button\"\n className=\"bl-nav-items__add\"\n onClick={() =>\n onColumns(\n columns.map((row, i) =>\n i === columnIndex\n ? { ...row, sections: [...(row.sections ?? []), emptySection()] }\n : row,\n ),\n )\n }\n >\n Add section\n </button>\n )}\n </fieldset>\n ))}\n </div>\n {readOnly || columns.length >= 4 ? null : (\n <button\n type=\"button\"\n className=\"bl-nav-items__add\"\n onClick={() => onColumns([...columns, { ...emptyColumn(), width: \"25\" }])}\n >\n Add column\n </button>\n )}\n <FieldError\n path={columnsError.path}\n showError={columnsError.showError}\n message={columnsError.errorMessage}\n />\n\n <div className=\"bl-nav-items__footer\">\n <h3>Footer</h3>\n <div className=\"bl-nav-items__footer-grid\">\n <div>\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 <label className=\"bl-nav-items__field\">\n <span>Label</span>\n <FooterText path={`${path}.${index}.panel.footer.overview.label`} readOnly={readOnly} />\n </label>\n </div>\n <div>\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 <label className=\"bl-nav-items__field\">\n <span>Label</span>\n <FooterText path={`${path}.${index}.panel.footer.cta.label`} readOnly={readOnly} />\n </label>\n </div>\n </div>\n </div>\n </div>\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 SectionEditor({\n path,\n itemIndex,\n columnIndex,\n sectionIndex,\n section,\n readOnly,\n onChange,\n}: {\n path: string;\n itemIndex: number;\n columnIndex: number;\n sectionIndex: number;\n section: MegaSection;\n readOnly: boolean;\n onChange: (section: MegaSection) => void;\n}) {\n const links = section.links ?? [];\n return (\n <div className=\"bl-nav-items__section\">\n <label className=\"bl-nav-items__field\">\n <span>Eyebrow</span>\n <input\n value={section.eyebrow ?? \"\"}\n disabled={readOnly}\n onChange={(event) => onChange({ ...section, eyebrow: event.target.value })}\n />\n </label>\n <TypeCards compact>\n <TypeCard\n label=\"Featured\"\n active={section.display === \"featured\"}\n disabled={readOnly}\n onClick={() => onChange({ ...section, display: \"featured\" })}\n />\n <TypeCard\n label=\"List\"\n active={section.display !== \"featured\"}\n disabled={readOnly}\n onClick={() => onChange({ ...section, display: \"list\" })}\n />\n </TypeCards>\n <label className=\"bl-nav-items__check\">\n <input\n type=\"checkbox\"\n checked={section.hideDescriptionsOnMobile !== false}\n disabled={readOnly}\n onChange={(event) =>\n onChange({ ...section, hideDescriptionsOnMobile: event.target.checked })\n }\n />\n Hide descriptions on mobile\n </label>\n {links.map((link, linkIndex) => (\n <div key={linkIndex} className=\"bl-nav-items__link\">\n <label className=\"bl-nav-items__field\">\n <span>Label</span>\n <input\n value={String(link.label ?? \"\")}\n disabled={readOnly}\n onChange={(event) =>\n onChange({\n ...section,\n links: links.map((row, i) =>\n i === linkIndex ? { ...row, label: event.target.value } : row,\n ),\n })\n }\n />\n </label>\n <ComposedLinkField\n path={`${path}.${itemIndex}.panel.columns.${columnIndex}.sections.${sectionIndex}.links.${linkIndex}._index-0`}\n parentPath={`${path}.${itemIndex}.panel.columns.${columnIndex}.sections.${sectionIndex}.links.${linkIndex}`}\n readOnly={readOnly}\n />\n </div>\n ))}\n {readOnly ? null : (\n <button\n type=\"button\"\n className=\"bl-nav-items__add\"\n onClick={() =>\n onChange({\n ...section,\n links: [...links, { label: \"New link\", type: \"page\", page: null, href: null }],\n })\n }\n >\n Add link\n </button>\n )}\n </div>\n );\n}\n\nconst CSS = `\n.bl-nav-items{display:grid;grid-template-columns:minmax(16rem,20rem) minmax(0,1fr);gap:0;border:1px solid var(--theme-elevation-150);border-radius:var(--style-radius-s);background:var(--theme-elevation-0);color:var(--theme-elevation-800);font-family:var(--font-body)}\n.bl-nav-items__rail{border-right:1px solid var(--theme-elevation-150);padding:1rem;min-width:0}\n.bl-nav-items__rail-head h2{margin:.15rem 0 0;font-size:14px}\n.bl-nav-items__kicker{margin:0;font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--theme-elevation-500)}\n.bl-nav-items__list{list-style:none;margin:0;padding:0}\n.bl-nav-items__list li{border:1px solid transparent;border-radius:8px;margin:.4rem 0}\n.bl-nav-items__list li[data-selected=\"true\"]{border-color:var(--theme-elevation-250);background:var(--theme-elevation-50)}\n.bl-nav-items__rail-row{display:grid;grid-template-columns:28px 1fr auto;gap:.5rem;align-items:center;padding:.5rem}\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-100);color:var(--theme-elevation-600)}\n.bl-nav-items__badge[data-kind=\"megaMenu\"]{background:color-mix(in srgb,var(--brand-primary,var(--theme-success-500)) 16%,var(--theme-elevation-50));color:var(--brand-primary,var(--theme-success-500))}\n.bl-nav-items__rail-edit{padding:0 .6rem .75rem}\n.bl-nav-items__add{width:100%;margin-top:.6rem;border:1px dashed var(--theme-elevation-250);background:transparent;border-radius:8px;padding:.65rem;color:var(--theme-elevation-700);cursor:pointer}\n.bl-nav-items__main{min-width:0;padding:1rem 1.25rem 2rem}\n.bl-nav-items__sentinel{height:1px}\n.bl-nav-items__preview{position:sticky;top:0;z-index:5;background:var(--theme-elevation-0);padding:.75rem 0 1rem}\n.bl-nav-items__bar{position:relative !important;inset:auto !important;pointer-events:auto !important;transform:none !important}\n.bl-nav-items__columns{display:grid;gap:.75rem;align-items:start}\n.bl-nav-items__column{border:1px solid var(--theme-elevation-150);border-radius:10px;padding:.75rem;margin:0;min-width:0}\n.bl-nav-items__column legend{font-weight:700;padding:0 .25rem}\n.bl-nav-items__column-settings{display:grid;grid-template-columns:1fr auto;gap:.6rem;align-items:end;margin-bottom:.75rem}\n.bl-nav-items__field{display:flex;flex-direction:column;gap:.35rem;font-size:12px;font-weight:700;margin:.5rem 0}\n.bl-nav-items__field input,.bl-nav-items__field select{font:inherit;font-weight:400;padding:.5rem .6rem;border:1px solid var(--theme-elevation-150);border-radius:var(--style-radius-s);background:var(--theme-input-bg);color:inherit}\n.bl-nav-items__check{display:flex;align-items:center;gap:.5rem;font-size:13px;font-weight:500}\n.bl-nav-items__section,.bl-nav-items__link{border:1px solid var(--theme-elevation-100);border-radius:8px;padding:.6rem;margin:.5rem 0}\n.bl-nav-items__footer{margin-top:1.25rem;border:1px solid var(--theme-elevation-150);border-radius:10px;padding:1rem}\n.bl-nav-items__footer-grid{display:grid;grid-template-columns:1fr 1fr;gap:1rem}\n.bl-nav-items__empty{color:var(--theme-elevation-500)}\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:1.4rem;z-index:6;min-width:8rem;padding:.2rem;border:1px solid var(--theme-elevation-150);border-radius:8px;background:var(--theme-elevation-0);box-shadow:0 8px 24px var(--theme-overlay)}\n.bl-nav-items__menu-pop button{display:block;width:100%;text-align:left;border:0;background:transparent;padding:.4rem .5rem;border-radius:6px;color:inherit;cursor:pointer}\n@media(max-width:800px){.bl-nav-items{grid-template-columns:1fr}.bl-nav-items__footer-grid,.bl-nav-items__columns{grid-template-columns:minmax(0,1fr) !important}}\n`;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoCA,MAAM,QAAQ;AACd,MAAM,cAAc;AACpB,MAAM,cACJ;AACF,MAAM,WAAW;AACjB,MAAM,cACJ;AACF,MAAM,UACJ;AAEF,MAAM,kBAAkB;AACxB,MAAM,eAAe;;AAGrB,MAAM,WAAW;;;;;AAQjB,SAAS,aAAa,SAAiB;CACrC,MAAM,OAAO,QACV,MAAM,IAAI,CACV,QAAQ,YAAY,CAAC,QAAQ,WAAW,UAAU,CAAC,CACnD,KAAK,IAAI;CACZ,MAAM,MAAM,SAAkB,OAAO,GAAG,KAAK,GAAG,SAAS;AACzD,QAAO;EAAE,MAAM,GAAG,OAAO;EAAE,MAAM,GAAG,OAAO;EAAE,MAAM,GAAG,OAAO;EAAE;;AAGjE,SAAS,SAAS,MAA2B;AAC3C,QAAO,KAAK,OAAO,IAAI,KAAK,SAAS;;AAGvC,MAAa,aAAsC,EAAE,OAAO,MAAM,eAAe;CAG/E,MAAM,UAAU,cAAc,IAAI;CAClC,MAAM,QAAQ,cAAc,aAAa,QAAQ,EAAE,CAAC,QAAQ,CAAC;CAE7D,MAAM,OAAO,SAA0B,EAAE,MAAM,MAAM,MAAM,CAAC;CAC5D,MAAM,OAAO,SAA+C,EAAE,MAAM,MAAM,MAAM,CAAC;CACjF,MAAM,OAAO,SAAwB,EAAE,MAAM,MAAM,MAAM,CAAC;CAE1D,MAAM,YAAY,MAAM,OAAO,MAC5B,MACC,EAAE,SAAS,kBAAkB,EAAE,SAAS,OAC3C;CACD,MAAM,aACJ,OAAO,WAAW,eAAe,WAAW,UAAU,aAAa;CACrE,MAAM,WAAW,QAAQ,WAAW,SAAS;CAE7C,MAAM,EAAE,WAAW,WAAW;CAC9B,MAAM,WACJ,OAAO,YAAY,MAAM,MAAM,EAAE,SAAS,WAAW,EAAE,OAAO,cAAc;CAC9E,MAAM,WAAW,GAAG,OAAO,YAAY,OAAO,OAAO,IAAI,GAAG;CAE5D,MAAM,KAAK,OAAO;CAClB,MAAM,UAAU,GAAG,GAAG;CACtB,MAAM,SAAS,GAAG,GAAG;CACrB,MAAM,WAAW,OAAyB,KAAK;CAE/C,MAAM,CAAC,OAAO,YAAY,SAAS,GAAG;CACtC,MAAM,CAAC,MAAM,WAAW,SAAS,MAAM;CACvC,MAAM,CAAC,SAAS,cAAc,SAAS,MAAM;CAC7C,MAAM,CAAC,SAAS,cAAc,SAAwB,EAAE,CAAC;CACzD,MAAM,CAAC,QAAQ,aAAa,SAAS,GAAG;CACxC,MAAM,CAAC,WAAW,gBAAgB,SAAS,MAAM;;CAEjD,MAAM,CAAC,QAAQ,aAAa,SAA+D,KAAK;;CAEhG,MAAM,QAAQ,uBAAO,IAAI,KAA0B,CAAC;CACpD,MAAM,YAAY,OAAO,EAAE;CAI3B,MAAM,WAAW,WAAW;EAAE,MAAM,KAAK;EAAO,MAAM,KAAK;EAAO,MAAM,KAAK;EAAO,CAAC;CACrF,MAAM,OACJ,aAAa,aAAc,KAAK,QAAQ,aAAa,OAAQ,KAAK,QAAQ,SAAS;CAErF,MAAM,YAAY,KAAK;CACvB,MAAM,SAAS,aAAa,OAAO,cAAc,WAAW,OAAO;AAEnE,iBAAgB;AACd,MAAI,SAAS,QAAQ;AACnB,aAAU,KAAK;AACf;;AAEF,MAAI,aAAa,OAAO,cAAc,UAAU;AAC9C,aAAU;IAAE,KAAK;IAAW,SAAS;IAAO,CAAC;AAC7C;;EAEF,MAAM,SAAS,MAAM,QAAQ,IAAI,OAAO,OAAO,CAAC;AAChD,MAAI,QAAQ;AACV,aAAU;IAAE,KAAK;IAAQ,SAAS;IAAO,CAAC;AAC1C;;EAEF,IAAI,YAAY;AAChB,QAAM,GAAG,SAAS,GAAG,OAAO,WAAW,EAAE,aAAa,WAAW,CAAC,CAC/D,KAAK,OAAO,aAAa;AACxB,OAAI,UAAW;AACf,OAAI,CAAC,SAAS,IAAI;AAChB,cAAU;KAAE,KAAK;KAAM,SAAS;KAAM,CAAC;AACvC;;GAEF,MAAM,MAAO,MAAM,SAAS,MAAM;AAClC,SAAM,QAAQ,IAAI,OAAO,IAAI,GAAG,EAAE,IAAI;AACtC,OAAI,CAAC,UAAW,WAAU;IAAE;IAAK,SAAS;IAAO,CAAC;IAClD,CACD,YAAY;AACX,OAAI,CAAC,UAAW,WAAU;IAAE,KAAK;IAAM,SAAS;IAAM,CAAC;IACvD;AACJ,eAAa;AACX,eAAY;;IAEb;EAAC;EAAM;EAAW;EAAQ;EAAS,CAAC;CAEvC,MAAM,UAAU,MAAM,MAAM;CAC5B,MAAM,UAAU,SAAS,KAAK,QAAQ;AAEtC,iBAAgB;AACd,MAAI,CAAC,QAAQ,QAAS;EACtB,MAAM,MAAO,UAAU,WAAW;AAClC,aAAW,KAAK;EAChB,MAAM,QAAQ,iBAAiB;GAC7B,MAAM,SAAS,IAAI,gBAAgB;IACjC,OAAO;IACP,OAAO,OAAO,aAAa;IAC3B,MAAM;IACN,0BAA0B;IAC3B,CAAC;AACF,OAAI,QAAS,QAAO,IAAI,SAAS,SAAS,UAAU,QAAQ;AAC5D,SAAM,GAAG,SAAS,GAAG,OAAO,UAAU,IAAI,EAAE,aAAa,WAAW,CAAC,CAClE,MAAM,aAAc,SAAS,KAAK,SAAS,MAAM,GAAG,EAAE,MAAM,EAAE,EAAE,CAAE,CAClE,MAAM,SAAmC;AACxC,QAAI,QAAQ,UAAU,QAAS;IAC/B,MAAM,OAAO,KAAK,QAAQ,EAAE;AAC5B,SAAK,MAAM,OAAO,KAAM,OAAM,QAAQ,IAAI,OAAO,IAAI,GAAG,EAAE,IAAI;AAC9D,eAAW,KAAK;AAChB,eAAW,MAAM;KACjB,CACD,YAAY;AACX,QAAI,QAAQ,UAAU,QAAS;AAC/B,eAAW,EAAE,CAAC;AACd,eAAW,MAAM;KACjB;KACH,gBAAgB;AACnB,eAAa,aAAa,MAAM;IAC/B;EAAC;EAAM;EAAS;EAAS;EAAU;EAAS,CAAC;AAEhD,iBAAgB;AACd,MAAI,aAAa,SAAS,SAAS;AACjC,YAAS,QAAQ,OAAO;AACxB,gBAAa,MAAM;;IAEpB,CAAC,WAAW,KAAK,CAAC;CAErB,MAAM,UAAoB,UACtB,CAAC;EAAE,MAAM;EAAO,MAAM;EAAS,CAAC,GAChC,QAAQ,KAAK,SAAS;EAAE,MAAM;EAAQ,MAAM;EAAK,EAAE;CAEvD,SAAS,OAAO,QAAgB;AAC9B,MAAI,OAAO,SAAS,QAAQ;AAC1B,SAAM,QAAQ,IAAI,OAAO,OAAO,KAAK,GAAG,EAAE,OAAO,KAAK;AACtD,QAAK,SAAS,OAAO;AACrB,QAAK,SAAS,OAAO,KAAK,GAAG;AAC7B,QAAK,SAAS,KAAK;SACd;AACL,QAAK,SAAS,WAAW;AACzB,QAAK,SAAS,OAAO,KAAK;AAC1B,QAAK,SAAS,KAAK;;AAErB,WAAS,GAAG;AACZ,UAAQ,MAAM;AACd,YAAU,GAAG;;CAGf,SAAS,QAAQ;AACf,OAAK,SAAS,OAAO;AACrB,OAAK,SAAS,KAAK;AACnB,OAAK,SAAS,KAAK;AACnB,YAAU,KAAK;AACf,eAAa,KAAK;;CAGpB,SAAS,UAAU,OAA8C;AAC/D,MAAI,MAAM,QAAQ,aAAa;AAC7B,SAAM,gBAAgB;AACtB,OAAI,CAAC,MAAM;AACT,YAAQ,KAAK;AACb;;AAEF,cAAW,MAAO,QAAQ,UAAU,IAAI,KAAK,QAAQ,SAAS,GAAI;aACzD,MAAM,QAAQ,WAAW;AAClC,SAAM,gBAAgB;AACtB,cAAW,MACT,QAAQ,SAAU,KAAK,IAAI,QAAQ,SAAS,IAAI,IAAI,IAAK,GAC1D;aACQ,MAAM,QAAQ,SAAS;AAChC,OAAI,CAAC,KAAM;AACX,SAAM,gBAAgB;GACtB,MAAM,OAAO,QAAQ,WAAW,QAAQ;AACxC,OAAI,KAAM,QAAO,KAAK;aACb,MAAM,QAAQ,UAAU;AACjC,OAAI,CAAC,KAAM;AACX,SAAM,gBAAgB;AACtB,SAAM,iBAAiB;AACvB,WAAQ,MAAM;AACd,aAAU,GAAG;;;CAIjB,MAAM,QAAQ,aAAa,aAAa,OAAO;CAC/C,MAAM,WAAW,UAAU,KAAK,OAAO,GAAG,GAAG,UAAU,WAAW,KAAA;AAElE,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACE,oBAAC,SAAD;IAAO,MAAK;IAAgB,YAAW;cACpCA;IACK,CAAA;GACR,oBAAC,YAAD;IAAY,SAAS;IAAS,OAAO;IAAiB;IAAY,CAAA;GAClE,qBAAC,OAAD;IAAK,WAAU;cAAf;KACG,SAAS,SACR,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,QAAD;MAAM,WAAU;gBAAsB;MAAW,CAAA,EACjD,oBAAC,QAAD;MAAM,WAAU;gBACb,QAAQ,MACP,qBAAA,UAAA,EAAA,UAAA,CACG,OAAO,OAAO,IAAI,aAAkC,OAAO,IAAI,GAAG,EACnE,oBAAC,QAAD;OAAM,WAAU;iBAAuB,SAAS,OAAO,IAAI;OAAQ,CAAA,CAClE,EAAA,CAAA,GACD,QAAQ,UACV,QAAQ,OAAO,OAAO,KAEtB;MAEG,CAAA,CACN,EAAA,CAAA,GACD,SAAS,aACX,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,QAAD;MAAM,WAAU;gBAAsB;MAAe,CAAA,EACrD,oBAAC,QAAD;MAAM,WAAU;gBAAwB,KAAK;MAAa,CAAA,CACzD,EAAA,CAAA,GAEH,oBAAC,SAAD;MACE,KAAK;MACL,IAAI;MACJ,MAAK;MACL,MAAK;MACL,WAAU;MACV,aAAa;MACb,cAAa;MACb,UAAU;MACV,OAAO;MACP,iBAAe;MACf,iBAAe;MACf,qBAAkB;MAClB,yBAAuB;MACvB,WAAW,UAAU;AACnB,gBAAS,MAAM,OAAO,MAAM;AAC5B,iBAAU,GAAG;AACb,eAAQ,KAAK;;MAEf,eAAe,QAAQ,KAAK;MAC5B,cAAc,QAAQ,MAAM;MACjB;MACX,CAAA;KAEH,QAAQ,CAAC,WACR,oBAAC,UAAD;MACE,MAAK;MACL,WAAU;MACV,cAAW;MACX,SAAS;gBACV;MAEQ,CAAA,GACP;KACH,QAAQ,CAAC,OACR,qBAAC,MAAD;MAAI,IAAI;MAAQ,MAAK;MAAU,WAAU;gBAAzC,CACG,QAAQ,KAAK,QAAQ,MACpB,oBAAC,MAAD;OAEE,IAAI,GAAG,GAAG,UAAU;OACpB,MAAK;OACL,iBAAe,MAAM;OACrB,WAAU;OACV,cAAc,UAAU;AACtB,cAAM,gBAAgB;AACtB,eAAO,OAAO;;OAEhB,oBAAoB,UAAU,EAAE;iBAE/B,OAAO,SAAS,SACf,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,QAAD,EAAA,UACG,OAAO,OAAO,KAAK,aAAkC,OAAO,KAAK,GAAG,EAChE,CAAA,EACP,oBAAC,QAAD;QAAM,WAAU;kBAAuB,SAAS,OAAO,KAAK;QAAQ,CAAA,CACnE,EAAA,CAAA,GAEH,qBAAA,UAAA,EAAA,UAAA,CACE,oBAAC,QAAD,EAAA,UAAM,oBAAuB,CAAA,EAC7B,oBAAC,QAAD;QAAM,WAAU;kBAAuB,OAAO;QAAY,CAAA,CACzD,EAAA,CAAA;OAEF,EAxBE,OAAO,SAAS,SAAS,OAAO,OAAO,KAAK,GAAG,GAAG,OAAO,KAwB3D,CACL,EACD,QAAQ,WAAW,KAAK,CAAC,UACxB,oBAAC,MAAD;OAAI,MAAK;OAAe,WAAU;iBAC/B;OACE,CAAA,GACH,KACD;UACH;KACA;;GACL,SAAS,UAAU,WAAW,OAAO,WAAW,OAAO,KAAK,YAAY,WACvE,oBAAC,OAAD;IAAK,MAAK;IAAS,WAAU;cAC1B,OAAO,UAAU,UAAU;IACxB,CAAA,GACJ;GACJ,oBAAC,kBAAD;IAAkB,aAAa;IAAa,MAAM,MAAM;IAAQ,CAAA;GAChE,oBAAC,YAAD;IACE,MAAM,MAAM;IACZ,WAAW,MAAM;IACjB,SAAS,MAAM;IACf,CAAA;GACE;;;;AAKV,MAAMA,QAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC1VZ,MAAa,qBAAgD,UAAU;CACrE,MAAM,EAAE,OAAO,MAAM,kBAAkB;CACvC,MAAM,UAAU,MAAM,YAAY,MAAM,WAAW,IAAI;CAEvD,MAAM,EAAE,OAAO,EAAE,KAAK,SAAS;EAC7B,SAAS;EACT,sBAAsB;EACvB,CAAC;CACF,MAAM,EAAE,MAAM,MAAM,gBAAgB;CAEpC,MAAM,UAAU,OAAuB,KAAK;CAC5C,MAAM,aAAa,OAAO,MAAM;AAiChC,QACE,oBAAC,OAAD;EAAK,KAAK;EAAS,gBAhCE,aACpB,UAA4C;GAC3C,MAAM,SAAS,MAAM;AACrB,OAAI,EAAE,kBAAkB,SAAU;GAElC,MAAM,UAAU,OAAO,QAAQ,yBAAyB;AACxD,OAAI,SAAS;IAGX,MAAM,QAAQ,QAAQ,QAAQ,8BAA8B;AAC5D,eAAW,UACT,UAAU,QAAQ,UAAU,QAAQ,SAAS,cAAc,eAAe;AAC5E;;AAGF,OAAI,CAAC,OAAO,QAAQ,yBAAyB,CAAE;AAC/C,OAAI,CAAC,WAAW,WAAW,KAAK,SAAS,QAAS;AAElD,SAAM,gBAAgB;AACtB,SAAM,iBAAiB;AACvB,SAAM,MACJ,EAAE,8BAA8B;IAC9B,OAAO;IACP,OAAO,SAAS,OAAO,SAAS,KAAK,SAAS,IAC5C,EAAE,UAAU,IAAI,iBAAiB,cAAc;IAClD,CAAC,CACH;KAEH;GAAC;GAAO,KAAK;GAAU;GAAS,KAAK;GAAQ;GAAE,CAChD;YAIG,oBAAC,YAAD,EAAY,GAAI,OAAS,CAAA;EACrB,CAAA;;;;;;;AASV,SAAS,SACP,OACA,SACA,UACoB;AAEpB,QAAO,YADO,UAAU,IAAI,MAAM,QAAQ,SAAS,MAAM,QAAQ,UACvC,SAAS,IAAI,YAAY,MAAM,OAAO,SAAS;;AAG3E,SAAS,YAAY,OAAgB,UAAsC;AACzE,KAAI,OAAO,UAAU,SAAU,QAAO;AACtC,KAAI,SAAS,OAAO,UAAU,UAAU;EACtC,MAAM,aAAa;AACnB,SAAO,WAAW,aAAa,WAAW,MAAM,OAAO,OAAO,WAAW,CAAC;;;;;AC1C9E,MAAM,SAAS;CAAC;CAAM;CAAM;CAAM;CAAM;CAAM;CAAM;AAEpD,MAAM,WAAW;CACf,MAAM;CACN,QAAQ;EACN;GAAE,MAAM;GAAQ,MAAM;GAAS;EAC/B;GAAE,MAAM;GAAQ,MAAM;GAAgB,YAAY;GAAS;EAC3D;GAAE,MAAM;GAAQ,MAAM;GAAQ;EAC/B;CACF;AAED,MAAM,sBAAmC;CACvC,SAAS;CACT,0BAA0B;CAC1B,OAAO,EAAE;CACV;AAED,MAAM,qBAAiC;CACrC,OAAO;CACP,SAAS;CACT,UAAU,CAAC,cAAc,CAAC;CAC3B;AAED,MAAM,oBAA+B;CACnC,UAAU;CACV,SAAS,CAAC,aAAa,CAAC;CACxB,QAAQ;EAAE,UAAU,EAAE;EAAE,KAAK,EAAE;EAAE;CAClC;AAED,MAAM,mBAA4C;CAChD,WAAW;CACX,OAAO;CACP,MAAM;CACN,MAAM;CACN,MAAM;CACN,QAAQ;CACT;AAED,MAAM,mBAA4C;CAChD,WAAW;CACX,OAAO;CACP,MAAM;CACN,MAAM;CACN,MAAM;CACN,QAAQ;CACR,OAAO,YAAY;CACpB;AAED,SAAS,cAAc,KAAa;AAClC,QAAO;EACL,MAAM,IAAI;EACV,MAAM,IAAI;EACV,MAAM,IAAI;EACV,QAAQ,IAAI;EACZ,OAAO,IAAI;EACZ;;;AAIH,MAAM,aAAqD;CACzD,cAAc;CACd,gBAAgB;CAChB,aAAa;CACb,gBAAgB;CAChB,cAAc;CACd,kBAAkB;CAClB,WAAW;CACX,cAAc;CACd,cAAc;CACd,QAAQ;CACR,QAAQ;CACR,QAAQ;CACR,SAAS;CACT,UAAU;CACV,aAAa;CACb,aAAa;EAAE,QAAQ;EAAK,QAAQ;EAAK,UAAU;EAAK,MAAM;EAAK;CACpE;AAED,MAAM,cAAc;AAEpB,SAAS,cAAc,KAAa;AAClC,QAAO,IACJ,QAAQ,UAAU,YAAY,CAC9B,QAAQ,0BAA0B,GAAG,YAAY,qBAAqB;;AAG3E,SAAS,SAAS,OAA+B;AAC/C,KAAI,SAAS,KAAM,QAAO;AAC1B,KAAI,OAAO,UAAU,UAAU;EAC7B,MAAM,KAAM,MAAsB;AAClC,SAAO,MAAM,OAAO,OAAO,OAAO,GAAG;;AAEvC,QAAO,OAAO,MAAM;;AAGtB,SAAS,eAAe,OAA2B;CACjD,MAAM,sBAAM,IAAI,KAAa;CAC7B,MAAM,QAAQ,SAAuE;EACnF,MAAM,KAAK,SAAS,MAAM,KAAK;AAC/B,MAAI,GAAI,KAAI,IAAI,GAAG;;AAErB,MAAK,MAAM,OAAO,OAAO;AACvB,OAAK,IAAI;EACT,MAAM,QAAQ,IAAI;AAClB,OAAK,OAAO,QAAQ,SAAS;AAC7B,OAAK,OAAO,QAAQ,IAAI;AACxB,OAAK,MAAM,UAAU,OAAO,WAAW,EAAE,CACvC,MAAK,MAAM,WAAW,OAAO,YAAY,EAAE,CACzC,MAAK,MAAM,QAAQ,QAAQ,SAAS,EAAE,CAAE,MAAK,KAAK;;AAIxD,QAAO,CAAC,GAAG,IAAI;;AAGjB,SAAS,kBAAkB,EACzB,MACA,YACA,YAKC;AACD,QACE,oBAAC,iBAAiB,UAAlB;EAA2B,OAAO;YAChC,oBAAC,WAAD;GACE,OAAO;GACD;GACM;GACZ,WAAU;GACV,YAAY;GACF;GACV,CAAA;EACwB,CAAA;;AAIhC,MAAa,iBAA6C,EAAE,OAAO,MAAM,eAAe;CACtF,MAAM,aAAa,SAAmB,EAAE,MAAM,CAAC;CAC/C,MAAM,QAAQ,MAAM,QAAQ,WAAW,MAAM,GAAG,WAAW,QAAQ,EAAE;CACrE,MAAM,EAAE,aAAa,iBAAiB,gBAAgB,iBAAiB,SAAS;CAChF,MAAM,EAAE,WAAW,WAAW;CAC9B,MAAM,WAAW,GAAG,OAAO,YAAY,OAAO,OAAO;CAErD,MAAM,CAAC,UAAU,eAAe,SAAS,EAAE;CAC3C,MAAM,CAAC,QAAQ,aAAa,SAAS,MAAM;CAC3C,MAAM,CAAC,eAAe,oBAAoB,SAAS,MAAM;CACzD,MAAM,CAAC,MAAM,WAAW,SAAwB,KAAK;CACrD,MAAM,CAAC,OAAO,YAAY,SAAS,KAAK;CACxC,MAAM,WAAW,OAAuB,KAAK;AAE7C,iBAAgB;AACd,MAAI,YAAY,MAAM,OAAQ,aAAY,KAAK,IAAI,GAAG,MAAM,SAAS,EAAE,CAAC;IACvE,CAAC,MAAM,QAAQ,SAAS,CAAC;AAE5B,iBAAgB;EACd,MAAM,KAAK,SAAS;AACpB,MAAI,CAAC,GAAI;EACT,MAAM,cAAc,SAAS,MAAM;EACnC,MAAM,cAAc,SAAS,KAAK;AAClC,KAAG,iBAAiB,2BAA2B,MAAM;AACrD,KAAG,iBAAiB,2BAA2B,MAAM;EACrD,MAAM,KAAK,IAAI,sBAAsB,CAAC,WAAW;AAC/C,OAAI,MAAO,UAAS,MAAM,eAAe;IACzC;AACF,KAAG,QAAQ,GAAG;AACd,eAAa;AACX,MAAG,oBAAoB,2BAA2B,MAAM;AACxD,MAAG,oBAAoB,2BAA2B,MAAM;AACxD,MAAG,YAAY;;IAEhB,EAAE,CAAC;CAEN,MAAM,UAAU,MAAM;CACtB,MAAM,CAAC,OAAO,YAAY,+BAAyC,IAAI,KAAK,CAAC;CAC7E,MAAM,UAAU,cAAc,eAAe,MAAM,CAAC,MAAM,CAAC,KAAK,IAAI,EAAE,CAAC,MAAM,CAAC;AAC9E,iBAAgB;EACd,MAAM,MAAM,UAAU,QAAQ,MAAM,IAAI,GAAG,EAAE;AAC7C,MAAI,IAAI,WAAW,EAAG;EACtB,IAAI,YAAY;AAChB,UAAQ,IACN,IAAI,KAAK,OACP,MAAM,GAAG,SAAS,SAAS,GAAG,WAAW,EAAE,aAAa,WAAW,CAAC,CAAC,MAAM,aACzE,SAAS,KAAM,SAAS,MAAM,GAA4B,KAC3D,CACF,CACF,CACE,MAAM,SAAS;AACd,OAAI,UAAW;AACf,kBAAe;IACb,MAAM,uBAAO,IAAI,KAA0B;AAC3C,SAAK,MAAM,OAAO,KAChB,KAAI,KAAK,MAAM,KAAM,MAAK,IAAI,OAAO,IAAI,GAAG,EAAE,IAAI;AAEpD,WAAO;KACP;IACF,CACD,YAAY,KAAA,EAAU;AACzB,eAAa;AACX,eAAY;;IAEb,CAAC,SAAS,SAAS,CAAC;CAEvB,MAAM,eAAe,cAEjB,sBAAsB,OAAO,EAC3B,cAAc,SAAS,wBAAwB,MAAM,MAAM,EAC5D,CAAC,EACJ,CAAC,OAAO,MAAM,CACf;CACD,MAAM,WACJ,SAAS,SAAS,cAAc,cAAc,QAAQ,QAAQ,QAAQ,QAAQ,KAAA;CAEhF,SAAS,IAAI,WAAmC;EAC9C,MAAM,OAAO,cAAc,YAAY,WAAW,GAAG,WAAW;AAMhE,cAAY;GAAE;GAAM,YAAY;GAAM;GAAW,eAL3B,OAAO,YAC3B,OAAO,QAAQ,KAAK,CACjB,QAAQ,CAAC,SAAS,QAAQ,YAAY,CACtC,KAAK,CAAC,KAAK,WAAW,CAAC,KAAK;IAAE;IAAO,OAAO;IAAM,cAAc;IAAO,CAAC,CAAC,CAC7E;GAC+D,CAAC;AACjE,cAAY,MAAM,OAAO;AACzB,YAAU,MAAM;;CAGlB,SAAS,eAAe;AACtB,MAAI,CAAC,QAAS;AACd,kBAAgB;GACd;GACA,YAAY;GACZ,UAAU;GACV,WAAW;GACX,eAAe;IACb,OAAO;KAAE,OAAO,QAAQ;KAAO,OAAO;KAAM;IAC5C,MAAM;KAAE,OAAO,QAAQ;KAAM,OAAO;KAAM;IAC1C,MAAM;KAAE,OAAO,QAAQ;KAAM,OAAO;KAAM;IAC1C,MAAM;KAAE,OAAO,QAAQ;KAAM,OAAO;KAAM;IAC1C,QAAQ;KAAE,OAAO,QAAQ;KAAQ,OAAO;KAAM;IAC/C;GACF,CAAC;AACF,mBAAiB,MAAM;;CAGzB,SAAS,eAAe;AACtB,MAAI,CAAC,QAAS;AACd,kBAAgB;GACd;GACA,YAAY;GACZ,UAAU;GACV,WAAW;GACX,eAAe;IACb,GAAG,OAAO,YACR,OAAO,QAAQ,cAAc,QAAQ,CAAC,CAAC,KAAK,CAAC,KAAK,WAAW,CAC3D,KACA;KAAE;KAAO,OAAO;KAAM,CACvB,CAAC,CACH;IACD,OAAO;KAAE,OAAO,YAAY;KAAE,OAAO;KAAM;IAC5C;GACF,CAAC;;CAGJ,SAAS,YAAY,MAA8B;AACjD,MAAI,CAAC,WAAW,QAAQ,cAAc,KAAM;AAC5C,MAAI,QAAQ,cAAc,cAAc,SAAS,WAAW;AAC1D,oBAAiB,KAAK;AACtB;;AAEF,gBAAc;;CAGhB,SAAS,OAAO,MAAc,OAAgB;AAC5C,aAAW,SACT,MAAM,KAAK,KAAK,MAAO,MAAM,WAAW;GAAE,GAAG;IAAM,OAAO;GAAO,GAAG,IAAK,CAC1E;;CAGH,SAAS,SAAS,OAA2B;AAC3C,MAAI,SAAS,cAAc,WAAY;AACvC,SAAO,SAAS;GAAE,GAAI,QAAQ,SAAS,YAAY;GAAG,GAAG;GAAO,CAAC;;CAGnE,SAAS,WAAW,SAAuB;AAEzC,WAAS,EAAE,SADE,QAAQ,KAAK,QAAQ,MAAO,MAAM,IAAI;GAAE,GAAG;GAAQ,SAAS;GAAO,GAAG,OAAQ,EACjE,CAAC;;CAG7B,SAAS,eAAe,OAAyB;EAC/C,MAAM,SAAS,MAAM;EAErB,MAAM,QADW,OAAO,QAAQ,sBAAsB,EAAE,aAAa,oBAAoB,IAC/D,MAAM,MAAM,QAAQ,IAAI,SAAS,OAAO,aAAa,SAAS,IAAI,MAAM,CAAC,EAAE;AACrG,MAAI,CAAC,MAAO;EACZ,MAAM,QAAQ,MAAM,WAAW,QAAQ,IAAI,UAAU,MAAM;AAC3D,MAAI,SAAS,EAAG,aAAY,MAAM;;CAGpC,MAAM,CAAC,UAAU,eAAe,SAAS,GAAG;AAC5C,iBAAgB;EACd,IAAI,YAAY;AAChB,QAAM,GAAG,SAAS,yBAAyB,EAAE,aAAa,WAAW,CAAC,CACnE,MAAM,aAAc,SAAS,KAAM,SAAS,MAAM,GAAyB,KAAM,CACjF,MAAM,QAAQ;AACb,OAAI,aAAa,CAAC,IAAK;AACvB,eAAY,cAAc,iBAAiB,KAAK,WAAW,CAAC,IAAI,CAAC;IACjE,CACD,YAAY,KAAA,EAAU;AACzB,eAAa;AACX,eAAY;;IAEb,CAAC,SAAS,CAAC;AAId,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACE,oBAAC,SAAD;IAAO,MAAK;IAAe,YAAW;cACnC;IACK,CAAA;GACP,WAAW,oBAAC,SAAD;IAAO,MAAK;IAAqB,YAAW;cAAW;IAAiB,CAAA,GAAG;GAEvF,qBAAC,SAAD;IAAO,WAAU;cAAjB;KACE,qBAAC,OAAD;MAAK,WAAU;gBAAf,CACE,oBAAC,KAAD;OAAG,WAAU;iBAAuB;OAAqB,CAAA,EACzD,oBAAC,MAAD,EAAA,UAAI,cAAe,CAAA,CACf;;KACN,oBAAC,MAAD;MAAI,WAAU;MAAqB,cAAW;gBAC3C,MAAM,KAAK,KAAK,UACf,qBAAC,MAAD;OAAkC,iBAAe,UAAU,WAAW,SAAS;iBAA/E,CACE,qBAAC,OAAD;QAAK,WAAU;kBAAf;SACE,oBAAC,QAAD;UAAM,WAAU;UAAsB,aAAW,IAAI;UAAW,eAAA;oBAC7D,IAAI,cAAc,aAAa,oBAAC,WAAD,EAAa,CAAA,GAAG,oBAAC,WAAD,EAAa,CAAA;UACxD,CAAA;SACP,oBAAC,UAAD;UAAQ,MAAK;UAAS,WAAU;UAA2B,eAAe,YAAY,MAAM;oBACzF,IAAI,SAAS;UACP,CAAA;SACR,WAAW,OACV,qBAAC,OAAD;UAAK,WAAU;oBAAf,CACE,oBAAC,UAAD;WACE,MAAK;WACL,cAAY,GAAG,IAAI,SAAS,OAAO;WACnC,eAAe,QAAQ,SAAS,QAAQ,OAAO,MAAM;qBACtD;WAEQ,CAAA,EACR,SAAS,QACR,qBAAC,OAAD;WAAK,WAAU;qBAAf;YACE,oBAAC,UAAD;aACE,MAAK;aACL,UAAU,UAAU;aACpB,eAAe;AACb,2BAAa;eAAE;eAAM,eAAe;eAAO,aAAa,QAAQ;eAAG,CAAC;AACpE,0BAAY,QAAQ,EAAE;AACtB,sBAAQ,KAAK;;uBAEhB;aAEQ,CAAA;YACT,oBAAC,UAAD;aACE,MAAK;aACL,UAAU,UAAU,MAAM,SAAS;aACnC,eAAe;AACb,2BAAa;eAAE;eAAM,eAAe;eAAO,aAAa,QAAQ;eAAG,CAAC;AACpE,0BAAY,QAAQ,EAAE;AACtB,sBAAQ,KAAK;;uBAEhB;aAEQ,CAAA;YACT,oBAAC,UAAD;aACE,MAAK;aACL,WAAU;aACV,eAAe;AACb,6BAAe;eAAE;eAAM,UAAU;eAAO,CAAC;AACzC,sBAAQ,KAAK;;uBAEhB;aAEQ,CAAA;YACL;eACJ,KACA;;SAEJ;WACL,UAAU,WACT,qBAAC,OAAD;QAAK,WAAU;kBAAf,CACE,qBAAC,WAAD;SAAW,SAAA;mBAAX,CACE,oBAAC,UAAD;UAAU,MAAM,oBAAC,WAAD,EAAa,CAAA;UAAE,OAAM;UAAO,eAAe,YAAY,UAAU;UAAI,CAAA,EACrF,oBAAC,UAAD;UAAU,MAAM,oBAAC,WAAD,EAAa,CAAA;UAAE,OAAM;UAAO,eAAe,YAAY,WAAW;UAAI,CAAA,CAC5E;YACZ,oBAAC,YAAD;SAAkB;SAAa;SAAiB;SAAY,CAAA,CACxD;YACJ,KACD;SAjEI,OAAO,IAAI,MAAM,MAAM,CAiE3B,CACL;MACC,CAAA;KACJ,WAAW,OACV,oBAAC,UAAD;MAAQ,MAAK;MAAS,WAAU;MAAoB,eAAe,UAAU,KAAK;gBAAE;MAE3E,CAAA;KAEL;;GAER,qBAAC,OAAD;IAAK,WAAU;cAAf;KACE,oBAAC,OAAD;MACE,WAAU;MACV,eAAY;MACZ,KAAK;MACL,eAAA;MACA,CAAA;KACF,oBAAC,OAAD;MAAK,uBAAA;MAAoB,eAAY;MAAO,WAAU;MAAwB,SAAS;gBACrF,oBAAC,kBAAD;OACE,OAAO;OACP,cAAc;OACd,YAAW;OACD;OACV,WAAU;OACV,CAAA;MACE,CAAA;KAEL,SAAS,cAAc,aACtB,oBAAC,YAAD;MACQ;MACN,OAAO;MACP,OAAO,QAAQ,SAAS,YAAY;MACpC,UAAU,QAAQ,SAAS;MAC3B,WAAW;MACX,SAAS;MACT,CAAA,GACA,UACF,oBAAC,KAAD;MAAG,WAAU;gBAAsB;MAE/B,CAAA,GAEJ,oBAAC,KAAD;MAAG,WAAU;gBAAsB;MAAkD,CAAA;KAEnF;;GAEL,SACC,oBAAC,OAAD;IAAK,WAAU;IAAoB,MAAK;IAAS,mBAAgB;cAC/D,qBAAC,OAAD;KAAK,WAAU;eAAf;MACE,oBAAC,MAAD;OAAI,IAAG;iBAAmB;OAAkB,CAAA;MAC5C,qBAAC,WAAD,EAAA,UAAA,CACE,oBAAC,UAAD;OACE,MAAM,oBAAC,WAAD,EAAa,CAAA;OACnB,OAAM;OACN,aAAY;OACZ,eAAe,IAAI,UAAU;OAC7B,CAAA,EACF,oBAAC,UAAD;OACE,MAAM,oBAAC,WAAD,EAAa,CAAA;OACnB,OAAM;OACN,aAAY;OACZ,eAAe,IAAI,WAAW;OAC9B,CAAA,CACQ,EAAA,CAAA;MACZ,oBAAC,UAAD;OAAQ,MAAK;OAAS,WAAU;OAAoB,eAAe,UAAU,MAAM;iBAAE;OAE5E,CAAA;MACL;;IACF,CAAA,GACJ;GAEJ,oBAAC,eAAD;IACE,MAAM;IACN,OAAM;IACN,aAAY;IACZ,cAAa;IACb,gBAAgB,iBAAiB,MAAM;IACvC,WAAW;cACZ;IAEe,CAAA;GACZ;;;AAIV,SAAS,WAAW,EAClB,MACA,OACA,YAKC;CACD,MAAM,QAAQ,SAAiB,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,SAAS,CAAC;CAClE,MAAM,SAAS,SAAkB,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,UAAU,CAAC;AACrE,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACE,qBAAC,SAAD;IAAO,WAAU;cAAjB,CACE,oBAAC,QAAD,EAAA,UAAM,SAAY,CAAA,EAClB,oBAAC,SAAD;KACE,OAAO,MAAM,SAAS;KACtB,UAAU;KACV,WAAW,UAAU,MAAM,SAAS,MAAM,OAAO,MAAM;KACvD,CAAA,CACI;;GACR,oBAAC,mBAAD;IACE,MAAM,GAAG,KAAK,GAAG,MAAM;IACvB,YAAY,GAAG,KAAK,GAAG;IACb;IACV,CAAA;GACF,qBAAC,SAAD;IAAO,WAAU;cAAjB,CACE,oBAAC,SAAD;KACE,MAAK;KACL,SAAS,QAAQ,OAAO,MAAM;KAC9B,UAAU;KACV,WAAW,UAAU,OAAO,SAAS,MAAM,OAAO,QAAQ;KAC1D,CAAA,EAAA,oBAEI;;GACJ;;;AAIV,SAAS,WAAW,EAClB,MACA,OACA,OACA,UACA,WACA,WAQC;CACD,MAAM,UAAU,MAAM,WAAW,EAAE;CACnC,MAAM,eAAe,SAAS,EAAE,MAAM,GAAG,KAAK,GAAG,MAAM,iBAAiB,CAAC;AAEzE,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACE,qBAAC,SAAD;IAAO,WAAU;cAAjB,CACE,oBAAC,QAAD,EAAA,UAAM,kBAAqB,CAAA,EAC3B,qBAAC,UAAD;KACE,OAAO,MAAM,YAAY;KACzB,UAAU;KACV,WAAW,UACT,QAAQ,EAAE,UAAU,MAAM,OAAO,OAAgC,CAAC;eAJtE;MAOE,oBAAC,UAAD;OAAQ,OAAM;iBAAS;OAAe,CAAA;MACtC,oBAAC,UAAD;OAAQ,OAAM;iBAAW;OAAiB,CAAA;MAC1C,oBAAC,UAAD;OAAQ,OAAM;iBAAO;OAAa,CAAA;MAC3B;OACH;;GAER,oBAAC,OAAD;IACE,WAAU;IACV,eAAY;IACZ,OAAO,EAAE,qBAAqB,6BAA6B;cAE1D,QAAQ,KAAK,QAAQ,gBACpB,qBAAC,YAAD;KAEE,WAAU;KACV,cAAY,UAAU,cAAc;eAHtC;MAKE,qBAAC,UAAD,EAAA,UAAA,CAAQ,WAAQ,cAAc,EAAW,EAAA,CAAA;MACzC,qBAAC,OAAD;OAAK,WAAU;iBAAf,CACE,qBAAC,SAAD;QAAO,WAAU;kBAAjB,CACE,oBAAC,QAAD,EAAA,UAAM,SAAY,CAAA,EAClB,oBAAC,UAAD;SACE,OAAO,OAAO,SAAS;SACvB,UAAU;SACV,WAAW,UACT,UACE,QAAQ,KAAK,KAAK,MAChB,MAAM,cAAc;UAAE,GAAG;UAAK,OAAO,MAAM,OAAO;UAAO,GAAG,IAC7D,CACF;mBAGF,OAAO,KAAK,UACX,qBAAC,UAAD;UAAoB,OAAO;oBAA3B,CACG,OAAM,IACA;YAFI,MAEJ,CACT;SACK,CAAA,CACH;WACP,cAAc,IACb,qBAAC,SAAD;QAAO,WAAU;kBAAjB,CACE,oBAAC,SAAD;SACE,MAAK;SACL,SAAS,QAAQ,OAAO,QAAQ;SAChC,UAAU;SACV,WAAW,UACT,UACE,QAAQ,KAAK,KAAK,MAChB,MAAM,cAAc;UAAE,GAAG;UAAK,SAAS,MAAM,OAAO;UAAS,GAAG,IACjE,CACF;SAEH,CAAA,EAAA,yCAEI;YACN,KACA;;OACJ,OAAO,YAAY,EAAE,EAAE,KAAK,SAAS,iBACrC,oBAAC,eAAD;OAEQ;OACN,WAAW;OACE;OACC;OACL;OACC;OACV,WAAW,SACT,UACE,QAAQ,KAAK,KAAK,MAChB,MAAM,cACF;QACE,GAAG;QACH,WAAW,IAAI,YAAY,EAAE,EAAE,KAAK,OAAO,MACzC,MAAM,eAAe,OAAO,MAC7B;QACF,GACD,IACL,CACF;OAEH,EArBK,aAqBL,CACF;MACD,aAAa,OAAO,UAAU,UAAU,MAAM,IAAI,OACjD,oBAAC,UAAD;OACE,MAAK;OACL,WAAU;OACV,eACE,UACE,QAAQ,KAAK,KAAK,MAChB,MAAM,cACF;QAAE,GAAG;QAAK,UAAU,CAAC,GAAI,IAAI,YAAY,EAAE,EAAG,cAAc,CAAC;QAAE,GAC/D,IACL,CACF;iBAEJ;OAEQ,CAAA;MAEF;OAtFJ,YAsFI,CACX;IACE,CAAA;GACL,YAAY,QAAQ,UAAU,IAAI,OACjC,oBAAC,UAAD;IACE,MAAK;IACL,WAAU;IACV,eAAe,UAAU,CAAC,GAAG,SAAS;KAAE,GAAG,aAAa;KAAE,OAAO;KAAM,CAAC,CAAC;cAC1E;IAEQ,CAAA;GAEX,oBAAC,YAAD;IACE,MAAM,aAAa;IACnB,WAAW,aAAa;IACxB,SAAS,aAAa;IACtB,CAAA;GAEF,qBAAC,OAAD;IAAK,WAAU;cAAf,CACE,oBAAC,MAAD,EAAA,UAAI,UAAW,CAAA,EACf,qBAAC,OAAD;KAAK,WAAU;eAAf,CACE,qBAAC,OAAD,EAAA,UAAA;MACE,oBAAC,MAAD,EAAA,UAAI,iBAAkB,CAAA;MACtB,oBAAC,mBAAD;OACE,MAAM,GAAG,KAAK,GAAG,MAAM;OACvB,YAAY,GAAG,KAAK,GAAG,MAAM;OACnB;OACV,CAAA;MACF,qBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,oBAAC,QAAD,EAAA,UAAM,SAAY,CAAA,EAClB,oBAAC,YAAD;QAAY,MAAM,GAAG,KAAK,GAAG,MAAM;QAAyC;QAAY,CAAA,CAClF;;MACJ,EAAA,CAAA,EACN,qBAAC,OAAD,EAAA,UAAA;MACE,oBAAC,MAAD,EAAA,UAAI,kBAAmB,CAAA;MACvB,oBAAC,mBAAD;OACE,MAAM,GAAG,KAAK,GAAG,MAAM;OACvB,YAAY,GAAG,KAAK,GAAG,MAAM;OACnB;OACV,CAAA;MACF,qBAAC,SAAD;OAAO,WAAU;iBAAjB,CACE,oBAAC,QAAD,EAAA,UAAM,SAAY,CAAA,EAClB,oBAAC,YAAD;QAAY,MAAM,GAAG,KAAK,GAAG,MAAM;QAAoC;QAAY,CAAA,CAC7E;;MACJ,EAAA,CAAA,CACF;OACF;;GACF;;;AAIV,SAAS,WAAW,EAAE,MAAM,YAAiD;CAC3E,MAAM,QAAQ,SAAiB,EAAE,MAAM,CAAC;AACxC,QACE,oBAAC,SAAD;EACE,OAAO,MAAM,SAAS;EACtB,UAAU;EACV,WAAW,UAAU,MAAM,SAAS,MAAM,OAAO,MAAM;EACvD,CAAA;;AAIN,SAAS,cAAc,EACrB,MACA,WACA,aACA,cACA,SACA,UACA,YASC;CACD,MAAM,QAAQ,QAAQ,SAAS,EAAE;AACjC,QACE,qBAAC,OAAD;EAAK,WAAU;YAAf;GACE,qBAAC,SAAD;IAAO,WAAU;cAAjB,CACE,oBAAC,QAAD,EAAA,UAAM,WAAc,CAAA,EACpB,oBAAC,SAAD;KACE,OAAO,QAAQ,WAAW;KAC1B,UAAU;KACV,WAAW,UAAU,SAAS;MAAE,GAAG;MAAS,SAAS,MAAM,OAAO;MAAO,CAAC;KAC1E,CAAA,CACI;;GACR,qBAAC,WAAD;IAAW,SAAA;cAAX,CACE,oBAAC,UAAD;KACE,OAAM;KACN,QAAQ,QAAQ,YAAY;KAC5B,UAAU;KACV,eAAe,SAAS;MAAE,GAAG;MAAS,SAAS;MAAY,CAAC;KAC5D,CAAA,EACF,oBAAC,UAAD;KACE,OAAM;KACN,QAAQ,QAAQ,YAAY;KAC5B,UAAU;KACV,eAAe,SAAS;MAAE,GAAG;MAAS,SAAS;MAAQ,CAAC;KACxD,CAAA,CACQ;;GACZ,qBAAC,SAAD;IAAO,WAAU;cAAjB,CACE,oBAAC,SAAD;KACE,MAAK;KACL,SAAS,QAAQ,6BAA6B;KAC9C,UAAU;KACV,WAAW,UACT,SAAS;MAAE,GAAG;MAAS,0BAA0B,MAAM,OAAO;MAAS,CAAC;KAE1E,CAAA,EAAA,8BAEI;;GACP,MAAM,KAAK,MAAM,cAChB,qBAAC,OAAD;IAAqB,WAAU;cAA/B,CACE,qBAAC,SAAD;KAAO,WAAU;eAAjB,CACE,oBAAC,QAAD,EAAA,UAAM,SAAY,CAAA,EAClB,oBAAC,SAAD;MACE,OAAO,OAAO,KAAK,SAAS,GAAG;MAC/B,UAAU;MACV,WAAW,UACT,SAAS;OACP,GAAG;OACH,OAAO,MAAM,KAAK,KAAK,MACrB,MAAM,YAAY;QAAE,GAAG;QAAK,OAAO,MAAM,OAAO;QAAO,GAAG,IAC3D;OACF,CAAC;MAEJ,CAAA,CACI;QACR,oBAAC,mBAAD;KACE,MAAM,GAAG,KAAK,GAAG,UAAU,iBAAiB,YAAY,YAAY,aAAa,SAAS,UAAU;KACpG,YAAY,GAAG,KAAK,GAAG,UAAU,iBAAiB,YAAY,YAAY,aAAa,SAAS;KACtF;KACV,CAAA,CACE;MArBI,UAqBJ,CACN;GACD,WAAW,OACV,oBAAC,UAAD;IACE,MAAK;IACL,WAAU;IACV,eACE,SAAS;KACP,GAAG;KACH,OAAO,CAAC,GAAG,OAAO;MAAE,OAAO;MAAY,MAAM;MAAQ,MAAM;MAAM,MAAM;MAAM,CAAC;KAC/E,CAAC;cAEL;IAEQ,CAAA;GAEP;;;AAIV,MAAM,MAAM"}
@@ -0,0 +1,203 @@
1
+ "use client";
2
+ import { r as renderLinkWith } from "./link-32261jXB.mjs";
3
+ import { jsx } from "react/jsx-runtime";
4
+ import { MegaMenuPanel, megaMenuToFloatingNavItems } from "@bison-lab/ui";
5
+ //#region src/fields/link.ts
6
+ /**
7
+ * The package's resolver: a published, populated page is `/<slug>`; an
8
+ * external link is its `href` as typed.
9
+ *
10
+ * A page that did not populate is `null`: Payload hands the public read the
11
+ * bare id when the reader may not see the page, which is what an unpublished
12
+ * page looks like from the site. A populated page whose `_status` is `draft`
13
+ * is `null` too, for a read that can see drafts. A row from before links had
14
+ * a `type` is an external link by `linkTypeOf`, here, in the stock fields'
15
+ * conditions and in the picker alike: the site keeps rendering its `href`,
16
+ * the admin shows it as an External chip, and the site's migration to
17
+ * `type: external` only makes the stored row say what every reader already
18
+ * assumes.
19
+ */
20
+ function resolveLink(link) {
21
+ if (!link) return null;
22
+ if (linkTypeOf(link) === "page") {
23
+ const page = link.page;
24
+ if (!page || typeof page !== "object") return null;
25
+ if (page._status === "draft") return null;
26
+ return page.slug ? `/${page.slug}` : null;
27
+ }
28
+ return link.href ? link.href : null;
29
+ }
30
+ /**
31
+ * Preview resolver for the Header items kit. `LinkField` stores a page as
32
+ * its id; the public `resolveLink` treats that as unpublished. The editor
33
+ * looks the id up (or uses a populated draft) so the sticky bar still
34
+ * shows the destination the picker chose.
35
+ */
36
+ function resolveAdminPreviewLink(link, pages) {
37
+ const live = resolveLink(link);
38
+ if (live) return live;
39
+ if (!link || linkTypeOf(link) !== "page") return null;
40
+ const page = link.page;
41
+ if (page && typeof page === "object") return page.slug ? `/${page.slug}` : null;
42
+ if (page == null) return null;
43
+ const doc = pages.get(String(page));
44
+ return doc?.slug ? `/${doc.slug}` : null;
45
+ }
46
+ /**
47
+ * Which of the two stored destinations a row is using. `type` decides; a row
48
+ * with no `type` yet (saved before links had one) is read by what it holds,
49
+ * an `href` making it external, the same reading `resolveLink` and the picker
50
+ * make, so all three agree on every row.
51
+ */
52
+ function linkTypeOf(link) {
53
+ if (link?.type === "external") return "external";
54
+ if (link?.type === "page") return "page";
55
+ return link?.href ? "external" : "page";
56
+ }
57
+ //#endregion
58
+ //#region src/blocks/mega-menu/rem-width.ts
59
+ /**
60
+ * The one rule for a typed panel width, shared by the config's validator and
61
+ * the renderer's reader so the two cannot drift: if the validator accepted a
62
+ * value the renderer dropped, the editor would be back to a width that
63
+ * silently does nothing. React-free, because `config.ts` ships from the Node
64
+ * entry.
65
+ */
66
+ const REM_WIDTH = /^\s*(\d+(?:\.\d+)?)\s*(rem)?\s*$/;
67
+ /** "30" and "30rem" both mean 30rem; anything else is not a width. */
68
+ function remWidth(value) {
69
+ const match = REM_WIDTH.exec(value ?? "");
70
+ return match ? `${Number(match[1])}rem` : null;
71
+ }
72
+ //#endregion
73
+ //#region src/blocks/mega-menu/component.tsx
74
+ /**
75
+ * A menu link needs both halves. Unlike a call to action, a link whose page
76
+ * is missing or unpublished is dropped rather than shown as text: a menu
77
+ * item that goes nowhere is worse than one fewer item.
78
+ */
79
+ function completeLink(row, resolve) {
80
+ const href = resolve(row);
81
+ if (!row.label || !href) return null;
82
+ return {
83
+ label: row.label,
84
+ href,
85
+ ...row.description ? { description: row.description } : {},
86
+ ...row.variant ? { variant: row.variant } : {},
87
+ ...row.icon ? { icon: row.icon } : {},
88
+ ...row.newTab ? { newTab: true } : {}
89
+ };
90
+ }
91
+ /**
92
+ * The row as `MegaMenuPanel` data, or `null` when there is nothing to open:
93
+ * no columns, or columns whose links are not yet complete. Draft saves skip
94
+ * validation, so a live preview genuinely hands this half-built rows.
95
+ * `resolve` turns each link's page into a path; the package's own is the
96
+ * default.
97
+ */
98
+ function megaMenuPanelFromRow(row, resolve = resolveLink) {
99
+ const panel = row.panel;
100
+ if (!panel?.columns?.length) return null;
101
+ const custom = Boolean(panel.customWidths);
102
+ const columns = [];
103
+ for (const column of panel.columns) {
104
+ const sections = [];
105
+ for (const section of column.sections ?? []) {
106
+ const links = (section.links ?? []).map((link) => completeLink(link, resolve)).filter((link) => link !== null);
107
+ if (!links.length) continue;
108
+ sections.push({
109
+ ...section.eyebrow ? { eyebrow: section.eyebrow } : {},
110
+ display: section.display ?? "list",
111
+ hideDescriptionsOnMobile: section.hideDescriptionsOnMobile ?? true,
112
+ links
113
+ });
114
+ }
115
+ columns.push({
116
+ ...custom && column.customWidth ? { customWidth: column.customWidth } : { width: Number(column.width ?? "100") },
117
+ ...column.divider ? { divider: true } : {},
118
+ sections
119
+ });
120
+ }
121
+ if (!columns.some((column) => column.sections.length)) return null;
122
+ const overview = footerLink(panel.footer?.overview, resolve);
123
+ const cta = footerLink(panel.footer?.cta, resolve);
124
+ return {
125
+ maxWidth: remWidth(panel.customMaxWidth) ?? panel.maxWidth ?? "standard",
126
+ columns,
127
+ footer: {
128
+ ...overview ? { overview } : {},
129
+ ...cta ? { cta } : {}
130
+ }
131
+ };
132
+ }
133
+ /** A footer link, complete, or nothing: same rule as `completeLink`. */
134
+ function footerLink(row, resolve) {
135
+ const href = row ? resolve(row) : null;
136
+ if (!row?.label || !href) return null;
137
+ return {
138
+ label: row.label,
139
+ href,
140
+ ...row.newTab ? { newTab: true } : {}
141
+ };
142
+ }
143
+ /**
144
+ * One panel, standing alone: what a live preview shows while the row is being
145
+ * edited. A whole header goes through `headerItemsFromBlocks` instead.
146
+ */
147
+ function MegaMenuBlockRenderer({ block, linkComponent, resolveLink: resolve, variants, icons }) {
148
+ const panel = megaMenuPanelFromRow(block, resolve);
149
+ if (!panel) return null;
150
+ return /* @__PURE__ */ jsx(MegaMenuPanel, {
151
+ ...panel,
152
+ variants,
153
+ icons,
154
+ renderLink: renderLinkWith(linkComponent)
155
+ });
156
+ }
157
+ //#endregion
158
+ //#region src/blocks/mega-menu/header.tsx
159
+ /**
160
+ * A global's `items` as `FloatingNavBlock` items, so a site's header is one
161
+ * call. Rows the bar cannot show are dropped rather than rendered broken: a
162
+ * row with no label, a mega menu with nothing to open, and any block type a
163
+ * site added that this package does not know.
164
+ *
165
+ * A `navLink` row's `newTab` is not carried: `FloatingNavItem` has no such
166
+ * field, because the bar renders its own links. A bar item whose page is
167
+ * missing or unpublished is dropped, like a panel link. A mega menu's
168
+ * landing page goes through the same resolver: unpublished or missing
169
+ * pages omit the trigger `href` and keep the panel.
170
+ */
171
+ function headerItemsFromBlocks(blocks, { variants, icons, isActive, linkComponent, resolveLink: resolve = resolveLink } = {}) {
172
+ const items = [];
173
+ for (const row of blocks) {
174
+ if (!row.label) continue;
175
+ if (row.blockType === "navLink") {
176
+ const href = resolve(row);
177
+ if (!href) continue;
178
+ items.push({
179
+ label: row.label,
180
+ href
181
+ });
182
+ } else if (row.blockType === "megaMenu") {
183
+ const panel = megaMenuPanelFromRow(row, resolve);
184
+ if (!panel) continue;
185
+ const href = resolve(row);
186
+ items.push({
187
+ label: row.label,
188
+ ...href ? { href } : {},
189
+ panel
190
+ });
191
+ }
192
+ }
193
+ return megaMenuToFloatingNavItems({ items }, {
194
+ isActive,
195
+ variants,
196
+ icons,
197
+ ...linkComponent ? { renderLink: renderLinkWith(linkComponent) } : {}
198
+ });
199
+ }
200
+ //#endregion
201
+ export { resolveAdminPreviewLink as a, linkTypeOf as i, MegaMenuBlockRenderer as n, resolveLink as o, megaMenuPanelFromRow as r, headerItemsFromBlocks as t };
202
+
203
+ //# sourceMappingURL=header-CznT9Uwv.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header-CznT9Uwv.mjs","names":[],"sources":["../src/fields/link.ts","../src/blocks/mega-menu/rem-width.ts","../src/blocks/mega-menu/component.tsx","../src/blocks/mega-menu/header.tsx"],"sourcesContent":["import type { Condition, Field, GroupField, RowField } from \"payload\";\n\n/**\n * The import-map path of the link picker, `LinkField` in\n * `@bison-lab/payload-blocks/admin`.\n *\n * It sits on the row that holds a link's `type`, `page` and `href`, and\n * replaces those three inputs with one box: type to search published pages,\n * or paste a URL. Referenced here by package specifier, like\n * `MIN_ROWS_ARRAY_FIELD`; a site picks it up with `payload generate:importmap`.\n * Until it does, Payload logs the missing entry and renders the row as\n * nothing (a custom `Field` with no component behind it is an empty element,\n * not the stock fields), so the step is part of adopting this release.\n */\nexport const LINK_FIELD = \"@bison-lab/payload-blocks/admin#LinkField\";\n\nexport type LinkType = \"page\" | \"external\";\n\n/**\n * A page as the `page` relationship populates it: what `resolveLink` reads,\n * and what the picker shows. A site's generated `Page` is assignable to it.\n * `_status` is absent on a collection without drafts, which counts as\n * published.\n */\nexport interface LinkPageDoc {\n id: number | string;\n title?: string | null;\n slug?: string | null;\n _status?: (\"draft\" | \"published\") | null;\n}\n\n/** Where a link goes: the three fields the picker writes. */\nexport interface LinkDestination {\n /** `page` unless the editor pasted a URL. Rows saved before links had a type carry only `href`. */\n type?: LinkType | null;\n /** The page's id, or the page itself once a `depth >= 1` read populates it. */\n page?: LinkPageDoc | number | string | null;\n /** The pasted URL of an external link. */\n href?: string | null;\n}\n\n/** The shape `linkField`/`linkFields` produce once Payload generates types. */\nexport interface LinkValue extends LinkDestination {\n label?: string | null;\n newTab?: boolean | null;\n}\n\n/**\n * Turns a link's destination into the `href` a renderer emits, or `null`\n * when there is nothing to point at, in which case the renderer shows the\n * label as text. A site passes its own (`RenderBlocks`' `resolveLink`) when\n * a page's path is not `/<slug>`: the package has no way to know a site's\n * routes, the same reason it takes an `imageComponent`.\n */\nexport type ResolveLink = (link: LinkDestination) => string | null;\n\n/**\n * The package's resolver: a published, populated page is `/<slug>`; an\n * external link is its `href` as typed.\n *\n * A page that did not populate is `null`: Payload hands the public read the\n * bare id when the reader may not see the page, which is what an unpublished\n * page looks like from the site. A populated page whose `_status` is `draft`\n * is `null` too, for a read that can see drafts. A row from before links had\n * a `type` is an external link by `linkTypeOf`, here, in the stock fields'\n * conditions and in the picker alike: the site keeps rendering its `href`,\n * the admin shows it as an External chip, and the site's migration to\n * `type: external` only makes the stored row say what every reader already\n * assumes.\n */\nexport function resolveLink(\n link: LinkDestination | null | undefined,\n): string | null {\n if (!link) return null;\n if (linkTypeOf(link) === \"page\") {\n const page = link.page;\n if (!page || typeof page !== \"object\") return null;\n if (page._status === \"draft\") return null;\n return page.slug ? `/${page.slug}` : null;\n }\n return link.href ? link.href : null;\n}\n\n/**\n * Preview resolver for the Header items kit. `LinkField` stores a page as\n * its id; the public `resolveLink` treats that as unpublished. The editor\n * looks the id up (or uses a populated draft) so the sticky bar still\n * shows the destination the picker chose.\n */\nexport function resolveAdminPreviewLink(\n link: LinkDestination | null | undefined,\n pages: ReadonlyMap<string, LinkPageDoc>,\n): string | null {\n const live = resolveLink(link);\n if (live) return live;\n if (!link || linkTypeOf(link) !== \"page\") return null;\n const page = link.page;\n if (page && typeof page === \"object\") {\n return page.slug ? `/${page.slug}` : null;\n }\n if (page == null) return null;\n const doc = pages.get(String(page));\n return doc?.slug ? `/${doc.slug}` : null;\n}\n\n/**\n * Which of the two stored destinations a row is using. `type` decides; a row\n * with no `type` yet (saved before links had one) is read by what it holds,\n * an `href` making it external, the same reading `resolveLink` and the picker\n * make, so all three agree on every row.\n */\nexport function linkTypeOf(link: LinkDestination | null | undefined): LinkType {\n if (link?.type === \"external\") return \"external\";\n if (link?.type === \"page\") return \"page\";\n return link?.href ? \"external\" : \"page\";\n}\n\nconst whenPage: Condition = (_data, siblingData) =>\n linkTypeOf(siblingData as LinkDestination) === \"page\";\n\nconst whenExternal: Condition = (_data, siblingData) =>\n linkTypeOf(siblingData as LinkDestination) === \"external\";\n\nexport interface LinkDestinationOptions {\n /** Require a destination. Defaults to `false`. */\n required?: boolean;\n /** The collection a page link points into. Defaults to `pages`. */\n pagesCollection?: string;\n}\n\n/**\n * Where a link goes, as stored: `type`, `page` and `href` in one row.\n *\n * The row carries the picker (`LINK_FIELD`), which replaces all three inputs\n * with one box. The stored fields are the website template's shape and stay\n * editable on their own: `page` shows for a page link, `href` for an external\n * one, and `required` binds whichever is active, since Payload skips\n * validation on a field whose condition is false. `page` offers published\n * rows only, and Payload re-checks that on publish, so a page that was\n * unpublished after being picked has to be picked again or republished.\n */\nexport function linkDestinationFields({\n required = false,\n pagesCollection = \"pages\",\n}: LinkDestinationOptions = {}): RowField[] {\n return [\n {\n type: \"row\",\n admin: { components: { Field: LINK_FIELD } },\n fields: [\n {\n name: \"type\",\n type: \"radio\",\n label: \"Goes to\",\n defaultValue: \"page\",\n options: [\n { label: \"Page\", value: \"page\" },\n { label: \"URL\", value: \"external\" },\n ],\n admin: { layout: \"horizontal\" },\n },\n {\n name: \"page\",\n type: \"relationship\",\n relationTo: pagesCollection,\n required,\n filterOptions: { _status: { equals: \"published\" } },\n admin: { condition: whenPage },\n },\n {\n name: \"href\",\n type: \"text\",\n label: \"URL\",\n required,\n admin: {\n condition: whenExternal,\n description:\n 'A full URL (\"https://example.com\"), \"mailto:\" or \"tel:\", or a site path (\"/contact\").',\n },\n },\n ],\n },\n ];\n}\n\nexport interface LinkFieldsOptions extends LinkDestinationOptions {\n /** Require the label and destination. Defaults to `false`. */\n required?: boolean;\n /** Wording for the visible text field. Defaults to \"Label\". */\n labelFieldLabel?: string;\n}\n\n/**\n * The fields a call to action is made of, unwrapped: the destination row,\n * then the label and the new-tab flag.\n *\n * `newTab` drives `target=\"_blank\"` *and* the matching `rel`, which is why no\n * renderer takes one without the other.\n */\nexport function linkFields({\n required = false,\n labelFieldLabel = \"Label\",\n pagesCollection,\n}: LinkFieldsOptions = {}): Field[] {\n return [\n ...linkDestinationFields({ required, pagesCollection }),\n { name: \"label\", type: \"text\", label: labelFieldLabel, required },\n {\n name: \"newTab\",\n type: \"checkbox\",\n label: \"Open in a new tab\",\n defaultValue: false,\n },\n ];\n}\n\nexport interface LinkFieldOptions extends LinkFieldsOptions {\n /** Field name. Defaults to `link`. */\n name?: string;\n label?: GroupField[\"label\"];\n admin?: GroupField[\"admin\"];\n}\n\n/** `linkFields()` as one named group, for a block with a single CTA. */\nexport function linkField({\n name = \"link\",\n label,\n admin,\n ...rest\n}: LinkFieldOptions = {}): GroupField {\n return {\n name,\n type: \"group\",\n fields: linkFields(rest),\n ...(label === undefined ? {} : { label }),\n ...(admin === undefined ? {} : { admin }),\n };\n}\n","/**\n * The one rule for a typed panel width, shared by the config's validator and\n * the renderer's reader so the two cannot drift: if the validator accepted a\n * value the renderer dropped, the editor would be back to a width that\n * silently does nothing. React-free, because `config.ts` ships from the Node\n * entry.\n */\nconst REM_WIDTH = /^\\s*(\\d+(?:\\.\\d+)?)\\s*(rem)?\\s*$/;\n\n/** \"30\" and \"30rem\" both mean 30rem; anything else is not a width. */\nexport function remWidth(\n value: string | null | undefined,\n): `${number}rem` | null {\n const match = REM_WIDTH.exec(value ?? \"\");\n return match ? (`${Number(match[1])}rem` as `${number}rem`) : null;\n}\n","import {\n MegaMenuPanel,\n type MegaMenuColumn,\n type MegaMenuIcons,\n type MegaMenuLink,\n type MegaMenuPanelData,\n type MegaMenuSection,\n type MegaMenuVariants,\n type MegaMenuWidth,\n} from \"@bison-lab/ui\";\n\nimport { resolveLink, type LinkValue, type ResolveLink } from \"../../fields/link\";\nimport { renderLinkWith } from \"../../link\";\nimport type { BlockRendererProps } from \"../../render-blocks\";\nimport type { MegaMenuBlockData, MegaMenuLinkData } from \"../../types\";\nimport { remWidth } from \"./rem-width\";\n\n/**\n * A menu link needs both halves. Unlike a call to action, a link whose page\n * is missing or unpublished is dropped rather than shown as text: a menu\n * item that goes nowhere is worse than one fewer item.\n */\nfunction completeLink(\n row: MegaMenuLinkData,\n resolve: ResolveLink,\n): MegaMenuLink | null {\n const href = resolve(row);\n if (!row.label || !href) return null;\n return {\n label: row.label,\n href,\n ...(row.description ? { description: row.description } : {}),\n ...(row.variant ? { variant: row.variant } : {}),\n ...(row.icon ? { icon: row.icon } : {}),\n ...(row.newTab ? { newTab: true } : {}),\n };\n}\n\n/**\n * The row as `MegaMenuPanel` data, or `null` when there is nothing to open:\n * no columns, or columns whose links are not yet complete. Draft saves skip\n * validation, so a live preview genuinely hands this half-built rows.\n * `resolve` turns each link's page into a path; the package's own is the\n * default.\n */\nexport function megaMenuPanelFromRow(\n row: MegaMenuBlockData,\n resolve: ResolveLink = resolveLink,\n): MegaMenuPanelData | null {\n const panel = row.panel;\n if (!panel?.columns?.length) return null;\n const custom = Boolean(panel.customWidths);\n\n const columns: MegaMenuColumn[] = [];\n for (const column of panel.columns) {\n const sections: MegaMenuSection[] = [];\n for (const section of column.sections ?? []) {\n const links = (section.links ?? [])\n .map((link) => completeLink(link, resolve))\n .filter((link): link is MegaMenuLink => link !== null);\n if (!links.length) continue;\n sections.push({\n ...(section.eyebrow ? { eyebrow: section.eyebrow } : {}),\n display: section.display ?? \"list\",\n hideDescriptionsOnMobile: section.hideDescriptionsOnMobile ?? true,\n links,\n });\n }\n columns.push({\n ...(custom && column.customWidth\n ? { customWidth: column.customWidth }\n : { width: Number(column.width ?? \"100\") as MegaMenuWidth }),\n ...(column.divider ? { divider: true } : {}),\n sections,\n });\n }\n if (!columns.some((column) => column.sections.length)) return null;\n\n const overview = footerLink(panel.footer?.overview, resolve);\n const cta = footerLink(panel.footer?.cta, resolve);\n // Independent of the column checkbox: the config gates only `customWidth`\n // on it, and the help text promises a typed panel width is used.\n const customMax = remWidth(panel.customMaxWidth);\n\n return {\n maxWidth: customMax ?? panel.maxWidth ?? \"standard\",\n columns,\n footer: {\n ...(overview ? { overview } : {}),\n ...(cta ? { cta } : {}),\n },\n };\n}\n\n/** A footer link, complete, or nothing: same rule as `completeLink`. */\nfunction footerLink(\n row: LinkValue | undefined,\n resolve: ResolveLink,\n): { label: string; href: string; newTab?: true } | null {\n const href = row ? resolve(row) : null;\n if (!row?.label || !href) return null;\n return {\n label: row.label,\n href,\n ...(row.newTab ? { newTab: true } : {}),\n };\n}\n\nexport interface MegaMenuBlockRendererProps\n extends BlockRendererProps<MegaMenuBlockData> {\n /** The look behind each `variants` value the site passed to `megaMenuBlock`. */\n variants?: MegaMenuVariants;\n /** The glyph behind each `icons` value the site passed to `megaMenuBlock`. */\n icons?: MegaMenuIcons;\n}\n\n/**\n * One panel, standing alone: what a live preview shows while the row is being\n * edited. A whole header goes through `headerItemsFromBlocks` instead.\n */\nexport function MegaMenuBlockRenderer({\n block,\n linkComponent,\n resolveLink: resolve,\n variants,\n icons,\n}: MegaMenuBlockRendererProps) {\n const panel = megaMenuPanelFromRow(block, resolve);\n if (!panel) return null;\n return (\n <MegaMenuPanel\n {...panel}\n variants={variants}\n icons={icons}\n renderLink={renderLinkWith(linkComponent)}\n />\n );\n}\n","import {\n megaMenuToFloatingNavItems,\n type FloatingNavItem,\n type MegaMenuIcons,\n type MegaMenuItem,\n type MegaMenuVariants,\n} from \"@bison-lab/ui\";\n\nimport { resolveLink, type ResolveLink } from \"../../fields/link\";\nimport { renderLinkWith, type BlockLinkComponent } from \"../../link\";\nimport type { MegaMenuBlockData, NavLinkBlockData } from \"../../types\";\nimport { megaMenuPanelFromRow } from \"./component\";\n\n/** A row of a header global's `items`: either block, or whatever else a site added. */\nexport type HeaderBlockRow = MegaMenuBlockData | NavLinkBlockData;\n\nexport interface HeaderItemsOptions {\n variants?: MegaMenuVariants;\n icons?: MegaMenuIcons;\n /** Marks the current section; receives each item's `href`. */\n isActive?: (href: string) => boolean;\n /** The site's link adapter, applied to every link inside the panels. */\n linkComponent?: BlockLinkComponent;\n /** The site's resolver for page links; defaults to the package's `resolveLink`. */\n resolveLink?: ResolveLink;\n}\n\n/**\n * A global's `items` as `FloatingNavBlock` items, so a site's header is one\n * call. Rows the bar cannot show are dropped rather than rendered broken: a\n * row with no label, a mega menu with nothing to open, and any block type a\n * site added that this package does not know.\n *\n * A `navLink` row's `newTab` is not carried: `FloatingNavItem` has no such\n * field, because the bar renders its own links. A bar item whose page is\n * missing or unpublished is dropped, like a panel link. A mega menu's\n * landing page goes through the same resolver: unpublished or missing\n * pages omit the trigger `href` and keep the panel.\n */\nexport function headerItemsFromBlocks(\n blocks: HeaderBlockRow[],\n {\n variants,\n icons,\n isActive,\n linkComponent,\n resolveLink: resolve = resolveLink,\n }: HeaderItemsOptions = {},\n): FloatingNavItem[] {\n const items: MegaMenuItem[] = [];\n for (const row of blocks) {\n if (!row.label) continue;\n if (row.blockType === \"navLink\") {\n const href = resolve(row);\n if (!href) continue;\n items.push({ label: row.label, href });\n } else if (row.blockType === \"megaMenu\") {\n const panel = megaMenuPanelFromRow(row, resolve);\n if (!panel) continue;\n const href = resolve(row);\n items.push({\n label: row.label,\n ...(href ? { href } : {}),\n panel,\n });\n }\n }\n return megaMenuToFloatingNavItems(\n { items },\n {\n isActive,\n variants,\n icons,\n ...(linkComponent ? { renderLink: renderLinkWith(linkComponent) } : {}),\n },\n );\n}\n"],"mappings":"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"}
package/dist/index.d.mts CHANGED
@@ -1,3 +1,4 @@
1
+ import { colorTokenField, lookField } from "@bison-lab/payload-core/theme";
1
2
  import { ArrayFieldValidation, Block, CollectionSlug, Condition, Field, GroupField, RowField, TextFieldSingleValidation, UploadField } from "payload";
2
3
 
3
4
  //#region src/blocks/hero/config.d.ts
@@ -190,6 +191,13 @@ type ResolveLink = (link: LinkDestination) => string | null;
190
191
  * assumes.
191
192
  */
192
193
  declare function resolveLink(link: LinkDestination | null | undefined): string | null;
194
+ /**
195
+ * Preview resolver for the Header items kit. `LinkField` stores a page as
196
+ * its id; the public `resolveLink` treats that as unpublished. The editor
197
+ * looks the id up (or uses a populated draft) so the sticky bar still
198
+ * shows the destination the picker chose.
199
+ */
200
+ declare function resolveAdminPreviewLink(link: LinkDestination | null | undefined, pages: ReadonlyMap<string, LinkPageDoc>): string | null;
193
201
  /**
194
202
  * Which of the two stored destinations a row is using. `type` decides; a row
195
203
  * with no `type` yet (saved before links had one) is read by what it holds,
@@ -300,6 +308,25 @@ declare const MIN_ROWS_ARRAY_FIELD = "@bison-lab/payload-blocks/admin#MinRowsArr
300
308
  /** Empty rows for an array's `defaultValue`, so a block opens at its minimum. */
301
309
  declare function emptyRows(count: number): Record<string, never>[];
302
310
  //#endregion
311
+ //#region src/fields/nav-items.d.ts
312
+ /**
313
+ * The import-map path of the header-items kit editor, `NavItemsField` in
314
+ * `@bison-lab/payload-blocks/admin`.
315
+ *
316
+ * It sits on `createNavigation`'s `header.items` blocks field and replaces
317
+ * Payload's stock blocks UI. Referenced here by package specifier, like
318
+ * `LINK_FIELD`; a site picks it up with `payload generate:importmap`.
319
+ * Until it does, Payload logs the missing entry and renders the field as
320
+ * nothing (a custom `Field` with no component behind it is an empty
321
+ * element, not the stock blocks UI), so the step is part of adopting this
322
+ * release (SPI-99).
323
+ *
324
+ * Bar behaviour (hide on scroll, viewport, default panel width) stays on
325
+ * BIS-64. Payload's left nav stays until BIS-90. New page blocks still
326
+ * ship stock nesting until those issues adopt this kit.
327
+ */
328
+ declare const NAV_ITEMS_FIELD = "@bison-lab/payload-blocks/admin#NavItemsField";
329
+ //#endregion
303
330
  //#region src/media.d.ts
304
331
  /**
305
332
  * The upload side of the boundary.
@@ -532,9 +559,9 @@ interface MegaMenuColumnData {
532
559
  sections?: MegaMenuSectionData[] | null;
533
560
  id?: string | null;
534
561
  }
535
- interface MegaMenuBlockData extends BlockRow<"megaMenu"> {
562
+ interface MegaMenuBlockData extends BlockRow<"megaMenu">, LinkDestination {
536
563
  label?: string | null;
537
- href?: string | null;
564
+ newTab?: boolean | null;
538
565
  panel?: {
539
566
  maxWidth?: ("narrow" | "standard" | "wide") | null;
540
567
  columns?: MegaMenuColumnData[] | null;
@@ -623,5 +650,5 @@ declare function sampleImage({
623
650
  alt
624
651
  }: SampleImageOptions): MediaDoc;
625
652
  //#endregion
626
- export { type BisonBlockData, type BisonBlockType, type BlockSamples, FaqColumnsBlock, type FaqColumnsBlockData, type FaqColumnsItemData, type HeadingFieldsOptions, HeroBlock, type HeroBlockData, type ImageFieldOptions, LINK_FIELD, LinkBlock, type LinkDestination, type LinkDestinationOptions, type LinkFieldOptions, type LinkFieldsOptions, type LinkPageDoc, type LinkType, type LinkValue, MEGA_MENU_WIDTHS, MIN_ROWS_ARRAY_FIELD, type MediaDoc, type MediaValue, type MegaMenuBlockData, type MegaMenuBlockOptions, type MegaMenuColumnData, type MegaMenuLinkData, type MegaMenuOption, type MegaMenuSectionData, type MegaMenuWidthValue, NapBlock, type NapBlockData, type NapDepartmentData, type NavLinkBlockData, ProcessStepsBlock, type ProcessStepsBlockData, type ProcessStepsItemData, type ResolveLink, type ResolvedMedia, RichTextBlock, type RichTextBlockData, type RichTextContent, type SampleImageOptions, ShowcasePanelsBlock, type ShowcasePanelsBlockData, type ShowcasePanelsItemData, StatsBandBlock, type StatsBandBlockData, type StatsBandItemData, TestimonialMasonryBlock, type TestimonialMasonryBlockData, type TestimonialMasonryItemData, blockSamples, emptyRows, headingFields, imageField, linkDestinationFields, linkField, linkFields, linkTypeOf, megaMenuBlock, megaMenuSampleOptions, resolveLink, resolveMedia, sampleImage, validateColumnWidths, validateRemWidth };
653
+ export { type BisonBlockData, type BisonBlockType, type BlockSamples, FaqColumnsBlock, type FaqColumnsBlockData, type FaqColumnsItemData, type HeadingFieldsOptions, HeroBlock, type HeroBlockData, type ImageFieldOptions, LINK_FIELD, LinkBlock, type LinkDestination, type LinkDestinationOptions, type LinkFieldOptions, type LinkFieldsOptions, type LinkPageDoc, type LinkType, type LinkValue, MEGA_MENU_WIDTHS, MIN_ROWS_ARRAY_FIELD, type MediaDoc, type MediaValue, type MegaMenuBlockData, type MegaMenuBlockOptions, type MegaMenuColumnData, type MegaMenuLinkData, type MegaMenuOption, type MegaMenuSectionData, type MegaMenuWidthValue, NAV_ITEMS_FIELD, NapBlock, type NapBlockData, type NapDepartmentData, type NavLinkBlockData, ProcessStepsBlock, type ProcessStepsBlockData, type ProcessStepsItemData, type ResolveLink, type ResolvedMedia, RichTextBlock, type RichTextBlockData, type RichTextContent, type SampleImageOptions, ShowcasePanelsBlock, type ShowcasePanelsBlockData, type ShowcasePanelsItemData, StatsBandBlock, type StatsBandBlockData, type StatsBandItemData, TestimonialMasonryBlock, type TestimonialMasonryBlockData, type TestimonialMasonryItemData, blockSamples, colorTokenField, emptyRows, headingFields, imageField, linkDestinationFields, linkField, linkFields, linkTypeOf, lookField, megaMenuBlock, megaMenuSampleOptions, resolveAdminPreviewLink, resolveLink, resolveMedia, sampleImage, validateColumnWidths, validateRemWidth };
627
654
  //# sourceMappingURL=index.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.mts","names":[],"sources":["../src/blocks/hero/config.ts","../src/blocks/rich-text/config.ts","../src/blocks/showcase-panels/config.ts","../src/blocks/process-steps/config.ts","../src/blocks/faq-columns/config.ts","../src/blocks/testimonial-masonry/config.ts","../src/blocks/nap/config.ts","../src/blocks/stats-band/config.ts","../src/blocks/mega-menu/config.ts","../src/fields/image.ts","../src/fields/link.ts","../src/fields/heading.ts","../src/fields/min-rows.ts","../src/media.ts","../src/types.ts","../src/samples.ts","../src/blocks/mega-menu/sample.ts","../src/sample-image.ts"],"mappings":"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"}
1
+ {"version":3,"file":"index.d.mts","names":[],"sources":["../src/blocks/hero/config.ts","../src/blocks/rich-text/config.ts","../src/blocks/showcase-panels/config.ts","../src/blocks/process-steps/config.ts","../src/blocks/faq-columns/config.ts","../src/blocks/testimonial-masonry/config.ts","../src/blocks/nap/config.ts","../src/blocks/stats-band/config.ts","../src/blocks/mega-menu/config.ts","../src/fields/image.ts","../src/fields/link.ts","../src/fields/heading.ts","../src/fields/min-rows.ts","../src/fields/nav-items.ts","../src/media.ts","../src/types.ts","../src/samples.ts","../src/blocks/mega-menu/sample.ts","../src/sample-image.ts"],"mappings":";;;;;;;AAcA;;;;;;cAAa,SAAA,EAAW,KAAA;;;;cCXX,aAAA,EAAe,KAAA;;;;cCGf,mBAAA,EAAqB,KAAA;;;;cCArB,iBAAA,EAAmB,KAAA;;;;cCCnB,eAAA,EAAiB,KAAA;;;;cCCjB,uBAAA,EAAyB,KAAA;;;;;;ALMtC;;;;;cMFa,QAAA,EAAU,KAAA;;;;;;AJNvB;;;;;cKyCa,cAAA,EAAgB,KAAA;;;;;;APjC7B;;;;;;;;ACXA;;;UO0BiB,cAAA;EACf,KAAA;EACA,KAAA;AAAA;AAAA,UAGe,oBAAA;EN5BJ;EM8BX,QAAA,GAAW,cAAA;;EAEX,KAAA,GAAQ,cAAA;AAAA;;cAIG,gBAAA;AAAA,KACD,kBAAA,WAA6B,gBAAA;ALrCzC;;;;;;;AAAA,cK4Da,oBAAA,EAAsB,oBAAA;AJ3DnC;AAAA,cIuGa,gBAAA,EAAkB,yBAAA;AAAA,iBAqBf,aAAA,CAAA;EACd,QAAA;EACA;AAAA,IACC,oBAAA,GAA4B,KAAA;;cA6KlB,SAAA,EAAW,KAAA;;;;;;ARrSxB;;KSPK,gBAAA,GAAmB,OAAA,CACtB,WAAA;EACE,OAAA;EAAiB,UAAA,EAAY,cAAA;AAAA;AAAA,UAGhB,iBAAA,SAA0B,OAAA,CAAQ,gBAAA;;ARTnD;;;EQcE,UAAA,GAAa,cAAA;AAAA;;;;APXf;;;;;iBOsBgB,UAAA,CAAW,SAAA,GAAW,iBAAA,GAAyB,gBAAA;;;;;;ATd/D;;;;;;;;ACXA;cSWa,UAAA;AAAA,KAED,QAAA;;;;;;ARVZ;UQkBiB,WAAA;EACf,EAAA;EACA,KAAA;EACA,IAAA;EACA,OAAA;AAAA;;UAIe,eAAA;EP0BhB;EOxBC,IAAA,GAAO,QAAA;EP5BuB;EO8B9B,IAAA,GAAO,WAAA;;EAEP,IAAA;AAAA;AN/BF;AAAA,UMmCiB,SAAA,SAAkB,eAAA;EACjC,KAAA;EACA,MAAA;AAAA;;;;ALpCF;;;;KK8CY,WAAA,IAAe,IAAA,EAAM,eAAA;;;;AJ1CjC;;;;;;;;ACmCA;;;iBGuBgB,WAAA,CACd,IAAA,EAAM,eAAA;;;;;AF1CR;;iBE4DgB,uBAAA,CACd,IAAA,EAAM,eAAA,qBACN,KAAA,EAAO,WAAA,SAAoB,WAAA;;;AFzD7B;;;;iBE6EgB,UAAA,CAAW,IAAA,EAAM,eAAA,sBAAqC,QAAA;AAAA,UAYrD,sBAAA;EFrFf;EEuFA,QAAA;EFvFsB;EEyFtB,eAAA;AAAA;;;;;AFpFF;;;;;AAuBA;;iBE2EgB,qBAAA,CAAA;EACd,QAAA;EACA;AAAA,IACC,sBAAA,GAA8B,QAAA;AAAA,UAyChB,iBAAA,SAA0B,sBAAA;EF1G1C;EE4GC,QAAA;EF1E4C;EE4E5C,eAAA;AAAA;;AF1DF;;;;;;iBEoEgB,UAAA,CAAA;EACd,QAAA;EACA,eAAA;EACA;AAAA,IACC,iBAAA,GAAyB,KAAA;AAAA,UAaX,gBAAA,SAAyB,iBAAA;EFlFN;EEoFlC,IAAA;EACA,KAAA,GAAQ,UAAA;EACR,KAAA,GAAQ,UAAA;AAAA;;iBAIM,SAAA,CAAA;EACd,IAAA;EACA,KAAA;EACA,KAAA;EAAA,GACG;AAAA,IACF,gBAAA,GAAwB,UAAA;;;UCnOV,oBAAA;;EAEf,QAAA;EXUW;EWRX,kBAAA;;;;;;EAMA,SAAA,GAAY,SAAA;AAAA;;;;;;;;ATNd;iBSiBgB,aAAA,CAAA;EACd,QAAA;EACA,kBAAA;EACA;AAAA,IACC,oBAAA,GAA4B,KAAA;;;;;;;AXb/B;;;;;;;;ACXA;;;;;;cWea,oBAAA;;iBAIG,SAAA,CAAU,KAAA,WAAgB,MAAA;;;;;;;AZR1C;;;;;;;;ACXA;;;;cYaa,eAAA;;;;;;;AbFb;;;;;;;;ACXA;;;;;;;UaiBiB,QAAA;EACf,GAAA;EACA,GAAA;EACA,KAAA;EACA,MAAA;AAAA;;KAIU,UAAA,qBAA+B,QAAA;;UAG1B,aAAA;EACf,GAAA;EACA,GAAA;EACA,KAAA;EACA,MAAA;AAAA;;;AV5BF;;;;;;;;ACCA;;iBS8CgB,YAAA,CAAa,KAAA,EAAO,UAAA,GAAa,aAAA;;;;;AdxCjD;;;;;;;;ACXA;;;;;;;;ACGA;;;;;UaqBU,QAAA;EACR,EAAA;EACA,SAAA;EACA,SAAA,EAAW,CAAA;AAAA;;;;;UAOI,eAAA;EACf,IAAA;IACE,IAAA;IACA,QAAA;IACA,SAAA;IACA,MAAA;IACA,MAAA;IACA,OAAA;EAAA;AAAA;AAAA,UAIa,aAAA,SAAsB,QAAA;EACrC,OAAA;EACA,OAAA;EACA,IAAA;EACA,IAAA;EACA,KAAA,GAAQ,UAAA;EACR,KAAA,GAAQ,SAAA;AAAA;AAAA,UAGO,iBAAA,SAA0B,QAAA;EACzC,OAAA,GAAU,eAAA;AAAA;AAAA,UAGK,sBAAA;EACf,KAAA;EACA,OAAA;EACA,KAAA,GAAQ,UAAA;EACR,IAAA;EACA,OAAA;EACA,EAAA;AAAA;AAAA,UAGe,uBAAA,SAAgC,QAAA;EAC/C,KAAA,GAAQ,sBAAA;EACR,SAAA;EACA,YAAA;EACA,kBAAA;AAAA;AAAA,UAGe,oBAAA;EACf,KAAA;EACA,WAAA;EACA,KAAA,GAAQ,UAAA;EACR,EAAA;AAAA;AAAA,UAGe,qBAAA,SAA8B,QAAA;EAC7C,KAAA,GAAQ,oBAAA;EACR,kBAAA;EACA,WAAA;EACA,mBAAA;EACA,YAAA;AAAA;AAAA,UAGe,kBAAA;EACf,QAAA;EPnD4E;EOqD5E,MAAA;EACA,EAAA;AAAA;AAAA,UAGe,mBAAA,SAA4B,QAAA;EAC3C,OAAA;EACA,KAAA;EACA,WAAA;EACA,KAAA,GAAQ,kBAAA;EPrCG;EOuCX,GAAA;IACE,KAAA;IACA,QAAA;IACA,MAAA;EAAA,IACE,eAAA;EACJ,MAAA;EACA,IAAA;EACA,WAAA;AAAA;AAAA,UAGe,0BAAA;EACf,OAAA;EACA,MAAA;IACE,IAAA;IACA,KAAA;IACA,MAAA,GAAS,UAAA;EAAA;EAEX,EAAA;AAAA;AAAA,UAGe,2BAAA,SACP,QAAA;EACR,OAAA;EACA,KAAA;EACA,WAAA;EACA,KAAA,GAAQ,0BAAA;EACR,IAAA,GAAO,SAAA;EACP,eAAA;EACA,cAAA;AAAA;AAAA,UAGe,iBAAA;EACf,KAAA;EACA,KAAA;EACA,IAAA;EACA,IAAA;EACA,EAAA;AAAA;AAAA,UAGe,kBAAA,SAA2B,QAAA;EAC1C,OAAA;EACA,KAAA;EACA,WAAA;EACA,KAAA,GAAQ,iBAAA;EN7Ic;EM+ItB,OAAA;EACA,IAAA;EACA,KAAA;EACA,OAAA;AAAA;AAAA,UAGe,iBAAA;EACf,IAAA;EACA,cAAA;EACA,SAAA;EACA,YAAA;EACA,EAAA;AAAA;AAAA,UAGe,YAAA,SAAqB,QAAA;EACpC,YAAA;EACA,YAAA;EACA,OAAA;IACE,aAAA;IACA,eAAA;IACA,aAAA;IACA,UAAA;IACA,cAAA;EAAA;EAEF,WAAA,GAAc,iBAAA;EACd,GAAA;EACA,QAAA;EACA,YAAA;EACA,UAAA;AAAA;AAAA,UAGe,gBAAA,SAAyB,SAAA;EACxC,WAAA;EN1J6E;EM4J7E,OAAA;;EAEA,IAAA;EACA,EAAA;AAAA;AAAA,UAGe,mBAAA;EACf,OAAA;EACA,OAAA;EACA,wBAAA;EACA,KAAA,GAAQ,gBAAA;EACR,EAAA;AAAA;AAAA,UAGe,kBAAA;EACf,KAAA;EACA,WAAA;EACA,OAAA;EACA,QAAA,GAAW,mBAAA;EACX,EAAA;AAAA;AAAA,UAGe,iBAAA,SAA0B,QAAA,cAAsB,eAAA;EAC/D,KAAA;EACA,MAAA;EACA,KAAA;IACE,QAAA;IACA,OAAA,GAAU,kBAAA;IACV,MAAA;MACE,QAAA,GAAW,SAAA;MACX,GAAA,GAAM,SAAA;IAAA;IAER,YAAA,mBLpLF;IKsLE,cAAA;EAAA;AAAA;AAAA,UAIa,gBAAA,SAAyB,QAAA,aAAqB,SAAA;;KAGnD,cAAA,GACR,aAAA,GACA,iBAAA,GACA,uBAAA,GACA,qBAAA,GACA,mBAAA,GACA,2BAAA,GACA,YAAA,GACA,kBAAA,GACA,iBAAA,GACA,gBAAA;;KAGQ,cAAA,GAAiB,cAAA;;;;;;AfhO7B;KgBCY,YAAA,WACJ,cAAA,GAAiB,OAAA,CAAQ,cAAA;EAAkB,SAAA,EAAW,CAAA;AAAA;;;Afb9D;;;;;;;;ACGA;;;;;cc4Ba,YAAA,EAAc,YAAA;;;;;;AhBpB3B;;ciBNa,qBAAA;;;;;;;;;;;;UCNI,kBAAA;;EAEf,KAAA;EACA,KAAA;EACA,MAAA;;EAEA,GAAA;AAAA;;;;AjBLF;;;;;;;;ACGA;;iBgB0BgB,WAAA,CAAA;EACd,KAAA;EACA,KAAA;EACA,MAAA;EACA;AAAA,GACC,kBAAA,GAAqB,QAAA"}