@ohhwells/bridge 0.1.48 → 0.1.49-next.115
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +12 -0
- package/dist/index.cjs +1321 -483
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +28 -4
- package/dist/index.d.ts +28 -4
- package/dist/index.js +1169 -337
- package/dist/index.js.map +1 -1
- package/dist/styles.css +135 -18
- package/package.json +1 -1
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/OhhwellsBridge.tsx","../src/linkHrefStore.ts","../src/useLinkHrefGuardian.ts","../src/ui/SchedulingWidget.tsx","../src/ui/EmailCaptureModal.tsx","../src/ui/toggle-group.tsx","../node_modules/clsx/dist/clsx.mjs","../node_modules/tailwind-merge/src/lib/utils.ts","../node_modules/tailwind-merge/src/lib/class-group-utils.ts","../node_modules/tailwind-merge/src/lib/lru-cache.ts","../node_modules/tailwind-merge/src/lib/parse-class-name.ts","../node_modules/tailwind-merge/src/lib/sort-modifiers.ts","../node_modules/tailwind-merge/src/lib/config-utils.ts","../node_modules/tailwind-merge/src/lib/merge-classlist.ts","../node_modules/tailwind-merge/src/lib/tw-join.ts","../node_modules/tailwind-merge/src/lib/create-tailwind-merge.ts","../node_modules/tailwind-merge/src/lib/from-theme.ts","../node_modules/tailwind-merge/src/lib/validators.ts","../node_modules/tailwind-merge/src/lib/default-config.ts","../node_modules/tailwind-merge/src/lib/merge-configs.ts","../node_modules/tailwind-merge/src/lib/extend-tailwind-merge.ts","../node_modules/tailwind-merge/src/lib/tw-merge.ts","../src/lib/utils.ts","../node_modules/class-variance-authority/dist/index.mjs","../src/ui/toggle.tsx","../src/ui/drag-handle.tsx","../src/ui/custom-toolbar.tsx","../src/ui/item-action-toolbar.tsx","../src/ui/tooltip.tsx","../src/ui/item-interaction-layer.tsx","../src/ui/MediaOverlay.tsx","../src/ui/button.tsx","../src/ui/CarouselOverlay.tsx","../src/lib/session-search.ts","../src/lib/sections.ts","../src/ui/link-modal/linkModal.utils.ts","../src/lib/prefetch-sections.ts","../src/lib/scroll-to-section.ts","../src/ui/link-modal/LinkPopover.tsx","../src/ui/dialog.tsx","../src/ui/link-modal/LinkEditorPanel.tsx","../src/ui/link-modal/DestinationBreadcrumb.tsx","../src/ui/link-modal/SectionTreeItem.tsx","../src/ui/link-modal/UrlOrPageInput.tsx","../src/ui/input.tsx","../src/ui/label.tsx","../src/ui/link-modal/SectionPickerOverlay.tsx","../src/ui/link-modal/useLinkModalState.ts","../src/ui/link-modal/devFixtures.ts","../src/lib/nav-tree.ts","../src/lib/nav-items.ts","../src/lib/footer-items.ts","../src/lib/item-drag-interaction.ts","../src/lib/nav-dnd.ts","../src/useNavItemDrag.ts","../src/lib/carousel.ts","../src/ui/navbar-container-chrome.tsx","../src/ui/drop-indicator.tsx","../src/ui/badge.tsx"],"sourcesContent":["'use client'\nimport React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { flushSync } from 'react-dom'\nimport { enforceLinkHrefs, setStoredLinkHref } from './linkHrefStore'\nimport { useLinkHrefGuardian } from './useLinkHrefGuardian'\nimport { SchedulingWidget } from './ui/SchedulingWidget'\nimport { ToggleGroup, ToggleGroupItem } from './ui/toggle-group'\nimport { DragHandle } from './ui/drag-handle'\nimport { CustomToolbar, CustomToolbarButton, CustomToolbarDivider } from './ui/custom-toolbar'\nimport { ItemActionToolbar } from './ui/item-action-toolbar'\nimport { ItemInteractionLayer, type ItemInteractionState } from './ui/item-interaction-layer'\nimport { MediaOverlay, type MediaElementType, type MediaHover } from './ui/MediaOverlay'\nimport { CarouselOverlay, type CarouselHover } from './ui/CarouselOverlay'\n\nconst PRIMARY = '#0885FE'\nconst IMAGE_FADE_MS = 300\n\nfunction runOpacityFade(el: HTMLElement, onDone: () => void) {\n const anim = el.animate([{ opacity: 0 }, { opacity: 1 }], {\n duration: IMAGE_FADE_MS,\n easing: 'ease',\n fill: 'forwards',\n })\n let finished = false\n const finish = () => {\n if (finished) return\n finished = true\n anim.cancel()\n el.style.opacity = ''\n onDone()\n }\n anim.finished.then(finish).catch(finish)\n window.setTimeout(finish, IMAGE_FADE_MS + 100)\n}\n\n/** After load: unmount skeleton (onReady), then fade <img> in. */\nfunction fadeInImageElement(img: HTMLElement, onReady: () => void) {\n onReady()\n img.style.opacity = '0'\n runOpacityFade(img, () => {\n img.style.opacity = ''\n })\n}\n\n/**\n * Swap an editable <img> to a new URL.\n * Must clear `srcset` / `sizes` first — next/image keeps responsive candidates that would\n * otherwise win over `src` and leave the old (optimized) image on screen.\n */\nfunction applyEditableImageSrc(img: HTMLImageElement, url: string) {\n img.removeAttribute('srcset')\n img.removeAttribute('sizes')\n img.src = url\n}\n\n/** After load: unmount skeleton, fade new background layer in so text stays visible. */\nfunction fadeInBgImage(el: HTMLElement, url: string, onReady: () => void) {\n const prevPos = el.style.position\n if (!prevPos || prevPos === 'static') el.style.position = 'relative'\n\n const layer = document.createElement('div')\n layer.setAttribute('data-ohw-bg-fade-layer', '')\n Object.assign(layer.style, {\n position: 'absolute',\n inset: '0',\n zIndex: '0',\n backgroundImage: `url('${url}')`,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n backgroundRepeat: 'no-repeat',\n opacity: '0',\n pointerEvents: 'none',\n })\n el.prepend(layer)\n\n onReady()\n\n runOpacityFade(layer, () => {\n el.style.backgroundImage = `url('${url}')`\n layer.remove()\n if (!prevPos || prevPos === 'static') el.style.position = prevPos\n })\n}\nimport { createPortal } from 'react-dom'\nimport { usePathname, useRouter, useSearchParams } from 'next/navigation'\nimport { isEditSessionActive } from './lib/session-search'\nimport { prefetchSectionsForPaths, mergePrefetchedSections, loadAllSectionsManifest } from './lib/prefetch-sections'\nimport { collectSectionsFromDom, type SectionNode } from './lib/sections'\nimport { scrollToHashSectionWhenReady } from './lib/scroll-to-section'\nimport { normalizePath, parseTarget, resolvePage, getSectionsForPath } from './ui/link-modal/linkModal.utils'\nimport { LinkPopover } from './ui/link-modal/LinkPopover'\nimport {\n DEV_SECTIONS_BY_PATH,\n DEV_SITE_PAGES,\n shouldUseDevFixtures,\n} from './ui/link-modal/devFixtures'\nimport type { LinkPage } from './ui/link-modal/types'\nimport {\n getNavbarExistingTargets,\n insertNavbarItem,\n isNavbarHrefKey,\n listNavbarItems,\n NAV_COUNT_KEY,\n NAV_ORDER_KEY,\n reconcileNavbarItemsFromContent,\n} from './lib/nav-items'\nimport { applyFooterOrder, FOOTER_ORDER_KEY, buildColumnDropSlots, buildLinkDropSlots, findFooterColumnForLink, hitTestColumnDropSlot, hitTestLinkDropSlot, isFooterHrefKey, listFooterColumns, listFooterLinksInColumn, planFooterColumnMove, planFooterLinkMove, reconcileFooterOrderFromContent, type FooterDropSlot } from './lib/footer-items'\nimport {\n armFooterPressDrag,\n clearTextSelection,\n disableNativeHrefDrag,\n lockFooterDuringDrag,\n unlockFooterDragInteraction,\n} from './lib/item-drag-interaction'\nimport { hitTestNavDropSlot } from './lib/nav-dnd'\nimport { useNavItemDrag } from './useNavItemDrag'\nimport {\n CAROUSEL_ATTR,\n applyCarouselNode,\n applyCarouselValue,\n listCarouselKeys,\n readCarouselValue,\n} from './lib/carousel'\nimport type { CarouselSlide } from './lib/carousel'\nimport { NavbarContainerChrome } from './ui/navbar-container-chrome'\nimport { DropIndicator } from './ui/drop-indicator'\nimport { Badge } from './ui/badge'\nimport { Link } from 'lucide-react'\n\ntype FooterDragKind = 'link' | 'column'\n\ntype FooterDragSession = {\n kind: FooterDragKind\n /** Dragged link href-key (link drag). */\n hrefKey: string | null\n /** Dragged column element (column drag). */\n columnEl: HTMLElement | null\n sourceColumnIndex: number\n wasSelected: boolean\n draggedEl: HTMLElement\n /** Last pointer position during drag (dragend clientX/Y are often 0). */\n lastClientX: number\n lastClientY: number\n /** Last hit-tested drop slot — preferred commit target. */\n activeSlot: FooterDropSlot | null\n}\ntype LinkPopoverSession = {\n key: string\n mode?: 'create' | 'edit'\n target?: string\n intent?: 'add-nav'\n}\n\ntype EditableNode = { key: string; type: string; text: string }\ntype InsertedSection = { type: string; insertAfter: string; scheduleId?: string | null; pagePath?: string }\n\nfunction getSectionsTracker(): HTMLElement {\n let el = document.querySelector<HTMLElement>('[data-ohw-sections-tracker]')\n if (!el) {\n el = document.createElement('div')\n el.setAttribute('data-ohw-sections-tracker', '')\n el.style.display = 'none'\n document.body.appendChild(el)\n }\n return el\n}\n\nfunction updateSectionScheduleId(insertAfter: string, scheduleId: string | null): string {\n const tracker = getSectionsTracker()\n let sections: InsertedSection[] = []\n try { sections = JSON.parse(tracker.textContent || '[]') } catch { /* ignore */ }\n const currentPath = window.location.pathname\n const updated = sections.map((s) => {\n if (s.type !== 'scheduling' || s.insertAfter !== insertAfter) return s\n if (s.pagePath && s.pagePath !== currentPath) return s\n return { ...s, scheduleId }\n })\n tracker.textContent = JSON.stringify(updated)\n return tracker.textContent ?? '[]'\n}\n\nfunction schedulingSectionId(insertAfter: string): string {\n return `scheduling-${insertAfter}`\n}\n\nconst INSERT_BEFORE_MARKER = ':before:'\n\nfunction parseSchedulingInsertAfter(insertAfter: string): { anchor: string; insertBefore: string | null } {\n const idx = insertAfter.indexOf(INSERT_BEFORE_MARKER)\n if (idx < 0) return { anchor: insertAfter, insertBefore: null }\n return {\n anchor: insertAfter.slice(0, idx),\n insertBefore: insertAfter.slice(idx + INSERT_BEFORE_MARKER.length),\n }\n}\n\nfunction resolveSchedulingInsert(\n insertAfter: string,\n explicitInsertBefore?: string | null,\n): { effectiveInsertAfter: string; insertBefore: string | null } {\n const parsed = parseSchedulingInsertAfter(insertAfter)\n const insertBefore = explicitInsertBefore ?? parsed.insertBefore\n const effectiveInsertAfter =\n insertBefore && parsed.insertBefore === null\n ? `${insertAfter}${INSERT_BEFORE_MARKER}${insertBefore}`\n : insertAfter\n return { effectiveInsertAfter, insertBefore }\n}\n\nfunction getSchedulingMountPoint(insertAfter: string): HTMLElement | null {\n const { anchor } = parseSchedulingInsertAfter(insertAfter)\n let anchorEl = document.querySelector<HTMLElement>(`[data-ohw-section=\"${anchor}\"]`)\n // Legacy entries used insertAfter=\"scheduling\" when all widgets shared that section id\n if (!anchorEl && anchor === 'scheduling') {\n const widgets = Array.from(document.querySelectorAll<HTMLElement>('[data-ohw-section^=\"scheduling-\"]'))\n anchorEl = widgets.at(-1) ?? null\n }\n if (!anchorEl) return null\n return anchorEl.closest<HTMLElement>('[data-ohw-section-container=\"scheduling\"]') ?? anchorEl\n}\n\nfunction schedulingMountDepth(insertAfter: string): number {\n if (!insertAfter.includes(INSERT_BEFORE_MARKER)) return 0\n return insertAfter.split(INSERT_BEFORE_MARKER).length - 1\n}\n\nfunction mountSchedulingFromTracker(notifyOnConnect = false): void {\n const tracker = getSectionsTracker()\n let entries: InsertedSection[] = []\n try { entries = JSON.parse(tracker.textContent || '[]') } catch { return }\n const currentPath = window.location.pathname\n const pageEntries = entries.filter((e) => !e.pagePath || e.pagePath === currentPath)\n mountSchedulingEntries(pageEntries, notifyOnConnect)\n}\n\nfunction getPageSchedulingEntries(raw: string | undefined | null): InsertedSection[] {\n if (!raw) return []\n try {\n const entries = JSON.parse(raw) as InsertedSection[]\n const currentPath = window.location.pathname\n return entries.filter((e) => e.type === 'scheduling' && (!e.pagePath || e.pagePath === currentPath))\n } catch { return [] }\n}\n\nfunction isSchedulingWidgetMissing(entry: InsertedSection): boolean {\n const { effectiveInsertAfter } = resolveSchedulingInsert(entry.insertAfter)\n return !document.querySelector(`[data-ohw-section=\"${schedulingSectionId(effectiveInsertAfter)}\"]`)\n}\n\nfunction hasMissingSchedulingWidgets(entries: InsertedSection[]): boolean {\n return entries.some(isSchedulingWidgetMissing)\n}\n\nfunction retryMissingSchedulingMounts(entries: InsertedSection[], notifyOnConnect: boolean | ((entry: InsertedSection) => boolean) = false): void {\n if (!hasMissingSchedulingWidgets(entries)) return\n mountSchedulingEntries(entries, notifyOnConnect)\n}\n\nfunction initSectionsFromContent(content: Record<string, string>, removeExisting = false): void {\n const raw = content['__ohw_sections']\n if (!raw) return\n try {\n if (removeExisting) {\n document.querySelectorAll<HTMLElement>('[data-ohw-section-container=\"scheduling\"]').forEach((el) => el.remove())\n }\n const inEditor = typeof window !== 'undefined' && window.self !== window.top\n if (inEditor) getSectionsTracker().textContent = raw\n const pageEntries = getPageSchedulingEntries(raw)\n // Detect widgets already in DOM before our mount attempts (vibe-coder placed).\n const preExisting = pageEntries.filter((e) => !isSchedulingWidgetMissing(e))\n // In edit mode, sections without a saved scheduleId notify on auto-connect so\n // the draft is updated and save validation doesn't incorrectly block.\n const notifyForEntry = inEditor ? (e: InsertedSection) => !e.scheduleId : false\n mountSchedulingEntries(pageEntries, notifyForEntry)\n // One-shot retries for anchors that appear after Next.js hydration.\n requestAnimationFrame(() => retryMissingSchedulingMounts(pageEntries, notifyForEntry))\n setTimeout(() => retryMissingSchedulingMounts(pageEntries, notifyForEntry), 250)\n // Proactively send ow:schedule-config to widgets that were already in the DOM\n // so they can initialize without waiting for a reactive request.\n for (const entry of preExisting) {\n window.postMessage({ type: 'ow:schedule-config', insertAfter: entry.insertAfter, scheduleId: entry.scheduleId ?? null }, '*')\n }\n } catch { /* ignore */ }\n}\n\nfunction mountSchedulingWidget(\n insertAfter: string,\n notifyOnConnect = false,\n scheduleId?: string | null,\n explicitInsertBefore?: string | null,\n): boolean {\n const { effectiveInsertAfter, insertBefore } = resolveSchedulingInsert(insertAfter, explicitInsertBefore)\n const sectionId = schedulingSectionId(effectiveInsertAfter)\n if (document.querySelector(`[data-ohw-section=\"${sectionId}\"]`)) return false\n\n const mountPoint = getSchedulingMountPoint(effectiveInsertAfter)\n if (!mountPoint) return false\n\n const container = document.createElement('div')\n container.dataset.ohwSectionContainer = 'scheduling'\n\n if (insertBefore) {\n const beforeAnchor = document.querySelector<HTMLElement>(`[data-ohw-section=\"${insertBefore}\"]`)\n const beforePoint = beforeAnchor?.closest<HTMLElement>('[data-ohw-section-container=\"scheduling\"]') ?? beforeAnchor\n if (!beforePoint) return false\n beforePoint.insertAdjacentElement('beforebegin', container)\n } else {\n let tail: Element = mountPoint\n while ((tail.nextElementSibling as HTMLElement | null)?.dataset.ohwSectionContainer === 'scheduling') {\n tail = tail.nextElementSibling!\n }\n tail.insertAdjacentElement('afterend', container)\n }\n\n const root = createRoot(container)\n flushSync(() => {\n root.render(\n <SchedulingWidget\n notifyOnConnect={notifyOnConnect}\n initialScheduleId={scheduleId}\n insertAfter={effectiveInsertAfter}\n />,\n )\n })\n\n const tracker = getSectionsTracker()\n let sections: InsertedSection[] = []\n try { sections = JSON.parse(tracker.textContent || '[]') } catch { /* ignore */ }\n const inEditor = typeof window !== 'undefined' && window.self !== window.top\n if (inEditor && !sections.find((s) => s.type === 'scheduling' && s.insertAfter === effectiveInsertAfter)) {\n sections.push({\n type: 'scheduling',\n insertAfter: effectiveInsertAfter,\n pagePath: window.location.pathname,\n ...(scheduleId ? { scheduleId } : {}),\n })\n tracker.textContent = JSON.stringify(sections)\n }\n return true\n}\n\n/** Mount scheduling widgets in dependency order (parent anchor must exist before child). */\nfunction mountSchedulingEntries(entries: InsertedSection[], notifyOnConnect: boolean | ((entry: InsertedSection) => boolean) = false) {\n const pending = entries\n .filter((e) => e.type === 'scheduling')\n .sort((a, b) => schedulingMountDepth(a.insertAfter) - schedulingMountDepth(b.insertAfter))\n for (let attempt = 0; attempt < pending.length + 1 && pending.length > 0; attempt++) {\n for (let i = pending.length - 1; i >= 0; i--) {\n const entry = pending[i]\n const shouldNotify = typeof notifyOnConnect === 'function' ? notifyOnConnect(entry) : notifyOnConnect\n if (mountSchedulingWidget(entry.insertAfter, shouldNotify, entry.scheduleId)) {\n pending.splice(i, 1)\n }\n }\n }\n}\n\nfunction getLinkHref(el: HTMLElement): string {\n const anchor = el instanceof HTMLAnchorElement ? el : el.querySelector<HTMLAnchorElement>('a')\n return anchor?.getAttribute('href') ?? ''\n}\n\nfunction applyLinkHref(el: HTMLElement, val: string) {\n const anchor = el instanceof HTMLAnchorElement ? el : el.querySelector<HTMLAnchorElement>('a')\n if (anchor) anchor.setAttribute('href', val)\n}\n\nfunction getEditMeasureEl(editable: HTMLElement): HTMLElement {\n return editable.closest<HTMLAnchorElement>('[data-ohw-href-key]') ?? editable\n}\n\nfunction isDragHandleDisabled(el: HTMLElement): boolean {\n const carriers = [\n el.closest<HTMLElement>('[data-ohw-href-key]'),\n el.closest<HTMLElement>('[data-ohw-editable]'),\n ]\n return carriers.some((carrier) => {\n if (!carrier) return false\n const raw = carrier.getAttribute('data-ohw-drag-disabled')\n return raw === 'true' || raw === ''\n })\n}\n\n/** Same gate as drag-handle visibility / drag-start — grab cursor must match this. */\nfunction canDragNavigationItem(anchor: HTMLElement): boolean {\n const { key, disabled } = getNavigationItemReorderState(anchor)\n return Boolean(key) && !disabled\n}\n\nfunction syncNavigationDragCursorAttrs() {\n document\n .querySelectorAll<HTMLElement>('nav [data-ohw-href-key], footer [data-ohw-href-key]')\n .forEach((el) => {\n if (!isNavigationItem(el) || !canDragNavigationItem(el)) {\n el.removeAttribute('data-ohw-can-drag')\n return\n }\n el.setAttribute('data-ohw-can-drag', '')\n })\n}\n\nfunction collectEditableNodes(extraContent?: Record<string, string>): EditableNode[] {\n const nodes = Array.from(document.querySelectorAll<HTMLElement>('[data-ohw-editable]')).map((el) => {\n if (el.dataset.ohwEditable === 'image') {\n const img = el instanceof HTMLImageElement ? el : el.querySelector<HTMLImageElement>('img')\n return { key: el.dataset.ohwKey ?? '', type: 'image', text: img?.src ?? '' }\n }\n if (el.dataset.ohwEditable === 'bg-image') {\n const raw = el.style.backgroundImage\n const url = raw.replace(/^url\\(['\"]?/, '').replace(/['\"]?\\)$/, '')\n return { key: el.dataset.ohwKey ?? '', type: 'bg-image', text: url }\n }\n if (el.dataset.ohwEditable === 'video') {\n return { key: el.dataset.ohwKey ?? '', type: 'video', text: getVideoEl(el)?.src ?? '' }\n }\n if (el.dataset.ohwEditable === 'link') {\n return { key: el.dataset.ohwKey ?? '', type: 'link', text: getLinkHref(el) }\n }\n return {\n key: el.dataset.ohwKey ?? '',\n type: el.dataset.ohwEditable ?? 'text',\n text: el.dataset.ohwEditable === 'plain' ? (el.innerText ?? '') : el.innerHTML,\n }\n })\n\n document.querySelectorAll<HTMLElement>('[data-ohw-href-key]').forEach((el) => {\n const key = el.getAttribute('data-ohw-href-key') ?? ''\n if (!key) return\n nodes.push({ key, type: 'link', text: getLinkHref(el) })\n })\n\n // Structural order keys live in edit content, not in DOM data attributes.\n if (extraContent) {\n for (const key of [NAV_ORDER_KEY, FOOTER_ORDER_KEY, NAV_COUNT_KEY]) {\n const text = extraContent[key]\n if (typeof text === 'string' && text.length > 0) {\n nodes.push({ key, type: 'meta', text })\n }\n }\n }\n\n // Video playback settings ride alongside the src as their own nodes.\n document.querySelectorAll<HTMLElement>('[data-ohw-editable=\"video\"]').forEach((el) => {\n const key = el.dataset.ohwKey ?? ''\n const video = getVideoEl(el)\n if (!key || !video) return\n nodes.push({ key: `${key}${VIDEO_AUTOPLAY_SUFFIX}`, type: 'video-setting', text: String(video.autoplay) })\n nodes.push({ key: `${key}${VIDEO_MUTED_SUFFIX}`, type: 'video-setting', text: String(video.muted) })\n })\n\n // Carousels persist their whole slide array as one JSON node under the container's key.\n for (const key of listCarouselKeys()) {\n nodes.push({ key, type: 'carousel', text: JSON.stringify(readCarouselValue(key)) })\n }\n\n // Cloned editables (e.g. marquee tracks) share one key — report each key once.\n const seen = new Set<string>()\n return nodes.filter((node) => {\n if (!node.key) return true\n if (seen.has(node.key)) return false\n seen.add(node.key)\n return true\n })\n}\n\n/** Editable types that support click/drag-drop replace. */\nfunction isMediaEditable(el: HTMLElement): boolean {\n const t = el.dataset.ohwEditable\n return t === 'image' || t === 'bg-image' || t === 'video'\n}\n\nconst MEDIA_SELECTOR =\n '[data-ohw-editable=\"image\"], [data-ohw-editable=\"bg-image\"], [data-ohw-editable=\"video\"]'\nconst NON_MEDIA_SELECTOR =\n '[data-ohw-editable]:not([data-ohw-editable=\"image\"]):not([data-ohw-editable=\"bg-image\"]):not([data-ohw-editable=\"video\"])'\n\nfunction getVideoEl(el: HTMLElement): HTMLVideoElement | null {\n return el instanceof HTMLVideoElement ? el : el.querySelector<HTMLVideoElement>('video')\n}\n\n// Autoplay/muted are per-video settings the studio owner can toggle, so they persist as\n// their own draft nodes derived from the video's key.\nconst VIDEO_AUTOPLAY_SUFFIX = '__ohw_autoplay'\nconst VIDEO_MUTED_SUFFIX = '__ohw_muted'\n\n/**\n * Drive playback and controls from the element's own flags.\n *\n * Controls are hidden only for true background media — autoplay AND muted — because that is\n * the one combination that actually starts on its own. Everything else needs a way to press\n * play: autoplay-off never starts, and browsers refuse to autoplay audible video, so an\n * unmuted+autoplay clip just sits there paused. In both cases we expose native controls.\n */\nfunction isBackgroundVideo(video: HTMLVideoElement): boolean {\n return video.autoplay && video.muted\n}\n\nfunction syncVideoPlayback(video: HTMLVideoElement) {\n const background = isBackgroundVideo(video)\n\n video.controls = !background\n\n // Still attempt playback whenever autoplay is on; if the browser blocks it (unmuted), the\n // rejection is expected and the visible controls are the fallback.\n if (video.autoplay) void video.play().catch(() => {})\n else video.pause()\n}\n\n/**\n * Pin the box the video currently occupies so a replacement can't reflow the page.\n *\n * An editable video is typically authored with a width and an *auto* height, which means its\n * intrinsic aspect ratio decides the height — so swapping in a taller clip grows the element\n * and pushes the rest of the layout down. Locking the rendered aspect ratio holds the box, and\n * `object-fit: contain` fits the whole clip inside it (letterboxed) rather than cropping it.\n */\nfunction lockVideoBox(video: HTMLVideoElement) {\n const { width, height } = video.getBoundingClientRect()\n\n if (width > 0 && height > 0 && !video.style.aspectRatio) {\n video.style.aspectRatio = `${width} / ${height}`\n }\n\n // `fill` is the UA default — only override when the author hasn't chosen a fit themselves.\n if (getComputedStyle(video).objectFit === 'fill') {\n video.style.objectFit = 'contain'\n }\n\n // `contain` letterboxes a clip whose ratio differs from the box, and a video element is\n // transparent by default — so without a backdrop the bars show whatever sits behind it.\n // Brand token with a black fallback, since black is the convention for letterboxing.\n const fit = video.style.objectFit || getComputedStyle(video).objectFit\n const bg = getComputedStyle(video).backgroundColor\n const isTransparent = bg === 'rgba(0, 0, 0, 0)' || bg === 'transparent' || !bg\n\n if (fit === 'contain' && isTransparent) {\n video.style.backgroundColor = 'var(--color-dark, #000)'\n }\n}\n\n/**\n * Replaced videos loop and play inline. The owner's autoplay/muted choices — and therefore\n * whether controls show — are preserved across a source swap.\n */\nfunction applyVideoSrc(video: HTMLVideoElement, url: string) {\n const { autoplay, muted } = video\n\n // Must run BEFORE the src swap, while the element still has the old video's dimensions.\n lockVideoBox(video)\n\n video.src = url\n video.loop = true\n video.playsInline = true\n video.autoplay = autoplay\n video.muted = muted\n video.load()\n syncVideoPlayback(video)\n}\n\n/**\n * Applies an `<key>__ohw_autoplay` / `__ohw_muted` draft node onto its video. Returns false\n * if the key isn't a video-setting node, so callers can fall through to normal handling.\n */\nfunction applyVideoSettingNode(key: string, val: string): boolean {\n const isAutoplay = key.endsWith(VIDEO_AUTOPLAY_SUFFIX)\n const isMuted = key.endsWith(VIDEO_MUTED_SUFFIX)\n\n if (!isAutoplay && !isMuted) return false\n\n const suffixLen = (isAutoplay ? VIDEO_AUTOPLAY_SUFFIX : VIDEO_MUTED_SUFFIX).length\n const baseKey = key.slice(0, key.length - suffixLen)\n const on = val === 'true'\n\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${baseKey}\"]`).forEach((el) => {\n const video = getVideoEl(el)\n if (!video) return\n if (isAutoplay) video.autoplay = on\n else video.muted = on\n syncVideoPlayback(video)\n })\n\n return true\n}\n\nfunction applyLinkByKey(key: string, val: string) {\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${key}\"]`).forEach((el) => {\n if (el.dataset.ohwEditable === 'link') applyLinkHref(el, val)\n })\n const hrefAnchors = document.querySelectorAll<HTMLElement>(`[data-ohw-href-key=\"${key}\"]`)\n if (hrefAnchors.length > 0) {\n setStoredLinkHref(key, val)\n hrefAnchors.forEach((el) => applyLinkHref(el, val))\n }\n}\n\nfunction isInsideLinkEditor(target: HTMLElement) {\n return Boolean(\n target.closest('[data-ohw-link-popover-root]') ||\n target.closest('[data-ohw-link-modal-root]') ||\n target.closest('[data-ohw-link-page-dropdown]') ||\n target.closest('[data-ohw-section-picker]') ||\n target.closest('[data-ohw-navbar-container-chrome]') ||\n target.closest('[data-ohw-navbar-add-button]') ||\n target.closest('[data-slot=\"popover-content\"]') ||\n target.closest('[data-slot=\"dialog-content\"]') ||\n target.closest('[data-slot=\"dialog-overlay\"]')\n )\n}\n\nfunction getHrefKeyFromElement(el: HTMLElement | null): { anchor: HTMLElement; key: string } | null {\n if (!el) return null\n const anchor = el.closest<HTMLElement>('[data-ohw-href-key]')\n if (!anchor) return null\n const key = anchor.getAttribute('data-ohw-href-key')\n if (!key) return null\n return { anchor, key }\n}\n\nfunction isNavbarButton(el: HTMLElement): boolean {\n return Boolean(el.closest('[data-ohw-role=\"navbar-button\"]'))\n}\n\nfunction getNavigationItemAnchor(el: HTMLElement): HTMLElement | null {\n const anchor = el.matches('[data-ohw-href-key]')\n ? el\n : el.closest<HTMLElement>('[data-ohw-href-key]')\n if (!anchor) return null\n if (!anchor.querySelector('[data-ohw-editable=\"text\"]')) return null\n return anchor\n}\n\nfunction isNavigationItem(el: HTMLElement): boolean {\n return getNavigationItemAnchor(el) !== null\n}\n\nfunction getNavigationItemAddHintTarget(anchor: HTMLElement): HTMLElement {\n const items = listNavigationItems()\n const idx = items.indexOf(anchor)\n if (idx >= 0 && idx < items.length - 1) return items[idx + 1]!\n return anchor\n}\n\nfunction listNavigationItems(): HTMLElement[] {\n return Array.from(\n document.querySelectorAll<HTMLElement>('nav [data-ohw-href-key], footer [data-ohw-href-key]')\n ).filter((el) => isNavigationItem(el))\n}\n\nfunction getNavigationItemReorderState(anchor: HTMLElement): { key: string | null; disabled: boolean } {\n if (isNavbarButton(anchor)) return { key: null, disabled: false }\n return getReorderHandleStateFromAnchor(anchor)\n}\n\nfunction getReorderHandleState(el: HTMLElement): { key: string | null; disabled: boolean } {\n const linkEl = el.closest<HTMLAnchorElement>('[data-ohw-href-key]')\n if (!linkEl || getNavigationItemAnchor(linkEl)) return { key: null, disabled: false }\n return getReorderHandleStateFromAnchor(linkEl)\n}\n\nfunction getReorderHandleStateFromAnchor(anchor: HTMLElement): { key: string | null; disabled: boolean } {\n const key = anchor.getAttribute('data-ohw-href-key')\n if (!key) return { key: null, disabled: false }\n return { key, disabled: isDragHandleDisabled(anchor) }\n}\n\nfunction clearHrefKeyHover(anchor: HTMLElement) {\n anchor.removeAttribute('data-ohw-hovered')\n anchor.querySelectorAll<HTMLElement>('[data-ohw-hovered]').forEach((el) => {\n el.removeAttribute('data-ohw-hovered')\n })\n}\n\nfunction isInsideNavigationItem(el: HTMLElement): boolean {\n return getNavigationItemAnchor(el) !== null\n}\n\nfunction getNavigationRoot(el: HTMLElement): HTMLElement | null {\n const explicit = el.closest<HTMLElement>('[data-ohw-nav-root]')\n if (explicit) return explicit\n return el.closest<HTMLElement>('nav, footer, aside')\n}\n\nfunction countFooterNavItems(el: HTMLElement): number {\n return Array.from(el.querySelectorAll<HTMLElement>('[data-ohw-href-key]')).filter(isNavigationItem).length\n}\n\n/** Nearest footer ancestor that groups 2+ items (column), else the footer itself — never a single-item wrapper. */\nfunction findFooterItemGroup(item: HTMLElement): HTMLElement | null {\n const explicit = item.closest<HTMLElement>('[data-ohw-footer-col], [data-ohw-footer-column]')\n if (explicit) return explicit\n\n const footer = item.closest<HTMLElement>('footer')\n if (!footer) return null\n\n let node = item.parentElement\n while (node && node !== footer) {\n if (countFooterNavItems(node) >= 2) return node\n node = node.parentElement\n }\n return footer\n}\n\nfunction isNavigationRoot(el: HTMLElement): boolean {\n return el.hasAttribute('data-ohw-nav-root') || el.matches('nav, footer, aside')\n}\n\nfunction isInferredFooterGroup(el: HTMLElement): boolean {\n const footer = el.closest('footer')\n if (!footer || el === footer) return false\n if (el.hasAttribute('data-ohw-footer-col') || el.hasAttribute('data-ohw-footer-column')) return true\n return countFooterNavItems(el) >= 2\n}\n\nfunction isNavigationContainer(el: HTMLElement): boolean {\n return (\n el.hasAttribute('data-ohw-nav-container') ||\n el.hasAttribute('data-ohw-footer-col') ||\n el.hasAttribute('data-ohw-footer-column') ||\n isNavigationRoot(el) ||\n isInferredFooterGroup(el)\n )\n}\n\nfunction isNavbarLinksContainer(el: HTMLElement): boolean {\n return el.hasAttribute('data-ohw-nav-container')\n}\n\nfunction getFooterColumn(el: HTMLElement): HTMLElement | null {\n return el.closest<HTMLElement>('[data-ohw-footer-col], [data-ohw-footer-column]')\n}\n\n/** Resolve footer column frame selection (gap / padding clicks), never individual items. */\nfunction resolveFooterColumnSelectionTarget(\n target: HTMLElement,\n clientX: number,\n clientY: number\n): HTMLElement | null {\n if (getNavigationItemAnchor(target)) return null\n const column = getFooterColumn(target)\n if (!column) return null\n if (isPointOverNavItem(column, clientX, clientY)) return null\n return column\n}\n\nfunction isPointOverNavigation(x: number, y: number): boolean {\n const roots = new Set<HTMLElement>()\n const navRoot =\n document.querySelector<HTMLElement>('[data-ohw-nav-root]') ??\n document.querySelector<HTMLElement>('nav')\n if (navRoot) roots.add(navRoot)\n const footer = document.querySelector<HTMLElement>('footer')\n if (footer) roots.add(footer)\n\n for (const root of roots) {\n const r = root.getBoundingClientRect()\n if (x >= r.left && x <= r.right && y >= r.top && y <= r.bottom) return true\n }\n return false\n}\n\nfunction findHoveredNavOrFooterContainer(x: number, y: number): HTMLElement | null {\n const candidates = [\n ...document.querySelectorAll<HTMLElement>('[data-ohw-nav-container]'),\n ...listFooterColumns(),\n ]\n for (const container of candidates) {\n const r = container.getBoundingClientRect()\n if (x < r.left || x > r.right || y < r.top || y > r.bottom) continue\n if (isPointOverNavItem(container, x, y)) continue\n return container\n }\n return null\n}\n\nfunction isPointOverNavItem(container: HTMLElement, x: number, y: number): boolean {\n return Array.from(container.querySelectorAll<HTMLElement>('[data-ohw-href-key]')).some((el) => {\n if (!isNavigationItem(el) || isNavbarButton(el)) return false\n const itemRect = el.getBoundingClientRect()\n return (\n x >= itemRect.left &&\n x <= itemRect.right &&\n y >= itemRect.top &&\n y <= itemRect.bottom\n )\n })\n}\n\n/** Resolve top-level navbar frame selection (links row), never items / book CTA / logo. */\nfunction resolveNavContainerSelectionTarget(\n target: HTMLElement,\n clientX: number,\n clientY: number\n): HTMLElement | null {\n if (getNavigationItemAnchor(target)) return null\n if (target.closest('[data-ohw-role=\"navbar-button\"]')) return null\n // Brand/logo link (no href-key) should not activate the links frame\n const plainLink = target.closest('a')\n if (\n plainLink &&\n !plainLink.hasAttribute('data-ohw-href-key') &&\n !plainLink.closest('[data-ohw-nav-container]')\n ) {\n return null\n }\n\n const fromClosest = target.closest<HTMLElement>('[data-ohw-nav-container]')\n if (fromClosest && !isPointOverNavItem(fromClosest, clientX, clientY)) {\n return fromClosest\n }\n\n const navRoot = target.closest<HTMLElement>('[data-ohw-nav-root]')\n if (!navRoot) return null\n\n const container = navRoot.querySelector<HTMLElement>('[data-ohw-nav-container]')\n if (!container || isPointOverNavItem(container, clientX, clientY)) return null\n\n // Empty nav padding / middle grid column (event target is the root itself)\n if (target === navRoot || target.hasAttribute('data-ohw-nav-root')) {\n return container\n }\n\n return null\n}\n\nfunction getNavigationSelectionParent(el: HTMLElement): HTMLElement | null {\n if (isNavigationItem(el)) {\n const explicit = el.closest<HTMLElement>('[data-ohw-nav-container]')\n if (explicit) return explicit\n const footerColumn = getFooterColumn(el)\n if (footerColumn) return footerColumn\n const footerGroup = findFooterItemGroup(el)\n if (footerGroup) return footerGroup\n return getNavigationRoot(el)\n }\n if (\n el.hasAttribute('data-ohw-nav-container') ||\n el.hasAttribute('data-ohw-footer-col') ||\n el.hasAttribute('data-ohw-footer-column') ||\n isInferredFooterGroup(el)\n ) {\n return getNavigationRoot(el)\n }\n return null\n}\n\n/** Same-level peers for sibling-hint chrome when an item is Active. */\nfunction collectNavigationItemSiblingHintRects(selected: HTMLElement): DOMRect[] {\n if (!isNavigationItem(selected)) return []\n\n const footerColumn = getFooterColumn(selected)\n if (footerColumn) {\n return listFooterLinksInColumn(footerColumn)\n .filter((link) => link !== selected)\n .map((link) => link.getBoundingClientRect())\n }\n\n const navContainer = selected.closest<HTMLElement>('[data-ohw-nav-container], [data-ohw-nav-drawer]')\n if (navContainer) {\n return Array.from(navContainer.querySelectorAll<HTMLElement>('[data-ohw-href-key]'))\n .filter((el) => isNavigationItem(el) && el !== selected)\n .map((el) => el.getBoundingClientRect())\n }\n\n return listNavigationItems()\n .filter((el) => el !== selected)\n .map((el) => el.getBoundingClientRect())\n}\n\nfunction placeCaretAtPoint(el: HTMLElement, x: number, y: number) {\n const selection = window.getSelection()\n if (!selection) return\n\n // Item-interaction chrome sits above the editable and steals caretRangeFromPoint —\n // temporarily ignore pointer hit-testing so the caret lands in the text under the cursor.\n const overlays = Array.from(\n document.querySelectorAll<HTMLElement>(\n '[data-ohw-item-drag-surface], [data-ohw-item-interaction], [data-ohw-drag-handle-container], [data-ohw-item-toolbar-anchor]',\n ),\n )\n const prevPointerEvents = overlays.map((node) => node.style.pointerEvents)\n for (const node of overlays) node.style.pointerEvents = 'none'\n\n try {\n if (typeof document.caretRangeFromPoint === 'function') {\n const range = document.caretRangeFromPoint(x, y)\n if (range && el.contains(range.startContainer)) {\n selection.removeAllRanges()\n selection.addRange(range)\n return\n }\n }\n\n const caretPositionFromPoint = (\n document as Document & {\n caretPositionFromPoint?: (px: number, py: number) => { offsetNode: Node; offset: number } | null\n }\n ).caretPositionFromPoint\n if (typeof caretPositionFromPoint === 'function') {\n const position = caretPositionFromPoint(x, y)\n if (position && el.contains(position.offsetNode)) {\n const range = document.createRange()\n range.setStart(position.offsetNode, position.offset)\n range.collapse(true)\n selection.removeAllRanges()\n selection.addRange(range)\n }\n }\n } finally {\n overlays.forEach((node, i) => {\n node.style.pointerEvents = prevPointerEvents[i] ?? ''\n })\n }\n}\n\nfunction selectAllTextInEditable(el: HTMLElement) {\n const selection = window.getSelection()\n if (!selection) return\n const range = document.createRange()\n range.selectNodeContents(el)\n selection.removeAllRanges()\n selection.addRange(range)\n}\n\nfunction getNavigationLabelEditable(target: HTMLElement): { editable: HTMLElement; navAnchor: HTMLElement } | null {\n const editable = target.closest<HTMLElement>('[data-ohw-editable=\"text\"]')\n if (!editable) return null\n const hrefCtx = getHrefKeyFromElement(editable)\n const navAnchor = hrefCtx ? getNavigationItemAnchor(hrefCtx.anchor) : null\n if (!navAnchor) return null\n return { editable, navAnchor }\n}\n\ntype ActivateOptions = { caretX?: number; caretY?: number }\n\ntype ToolbarVariant = 'none' | 'rich-text' | 'link-action' | 'select-frame'\n\nfunction collectSections(): SectionNode[] {\n return collectSectionsFromDom()\n}\n\nconst FORCE_PSEUDO_STATES: Array<{ pseudo: string; state: string }> = [\n { pseudo: ':hover', state: 'hover' },\n { pseudo: ':focus', state: 'focus' },\n { pseudo: ':focus-visible', state: 'focus-visible' },\n { pseudo: ':active', state: 'active' },\n]\n\n// For a :hover rule, generates a suppressor that freezes affected elements at their\n// current computed values when not in hover state. This prevents\n// the native :hover CSS from firing in edit mode without touching the template CSS.\nfunction buildHoverSuppressor(rule: CSSStyleRule): string | null {\n const props: string[] = []\n for (let i = 0; i < rule.style.length; i++) props.push(rule.style.item(i))\n if (props.length === 0) return null\n\n const suppressorSelectors: string[] = []\n for (const sel of rule.selectorText.split(',').map(s => s.trim())) {\n if (!sel.includes(':hover')) continue\n const idx = sel.indexOf(':hover')\n suppressorSelectors.push(\n sel.slice(0, idx) + '[data-ohw-editable-state]:not([data-ohw-active-state=\"hover\"])' + sel.slice(idx)\n )\n }\n if (suppressorSelectors.length === 0) return null\n\n // Find a live element matching the descendant part to read its base computed values.\n // collectStateRules() runs at init / route-change, before the cursor is over any card,\n // so getComputedStyle reflects the non-hover (base) state.\n const firstSel = rule.selectorText.split(',')[0].trim()\n const hoverIdx = firstSel.indexOf(':hover')\n const descendantPart = firstSel.slice(hoverIdx + ':hover'.length).trim()\n let targetEl: Element | null = null\n try {\n targetEl = descendantPart\n ? document.querySelector(`[data-ohw-editable-state] ${descendantPart}`)\n : document.querySelector('[data-ohw-editable-state]')\n } catch { return null }\n if (!targetEl) return null\n\n const cs = getComputedStyle(targetEl as HTMLElement)\n const decls = props.map(p => `${p}: ${cs.getPropertyValue(p)} !important`).join('; ')\n return `${suppressorSelectors.join(', ')} { ${decls} }`\n}\n\nfunction applyStateViews(container: HTMLElement, state: string) {\n container.querySelectorAll<HTMLElement>('[data-ohw-state-view]').forEach((view) => {\n view.style.display = view.getAttribute('data-ohw-state-view') === state ? 'block' : 'none'\n })\n}\n\nfunction resetStateViews() {\n document.querySelectorAll<HTMLElement>('[data-ohw-state-view]').forEach((el) => {\n el.style.display = ''\n })\n}\n\n// Reads pseudo-state rules from the page's own stylesheets and returns:\n// 1. [data-ohw-force-*] activator rules (replace :hover/:focus etc. with the force attribute)\n// 2. :hover suppressor rules (lock base computed values so native hover can't fire in edit mode)\n// Template CSS needs no modifications — the bridge handles suppression automatically.\nfunction collectStateRules(): string {\n const lines: string[] = []\n function processRules(rules: CSSRuleList) {\n for (const rule of Array.from(rules)) {\n if (rule instanceof CSSStyleRule) {\n let text = rule.cssText\n let matched = false\n for (const { pseudo, state } of FORCE_PSEUDO_STATES) {\n if (text.includes(pseudo)) {\n text = text.replace(new RegExp(pseudo.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') + '(?![\\\\w-])', 'g'), `[data-ohw-active-state=\"${state}\"]`)\n if (pseudo === ':hover') {\n const suppressor = buildHoverSuppressor(rule)\n if (suppressor) lines.push(suppressor)\n }\n matched = true\n }\n }\n if (matched) lines.push(text)\n } else if ('cssRules' in rule) {\n processRules((rule as CSSMediaRule).cssRules)\n }\n }\n }\n for (const sheet of Array.from(document.styleSheets)) {\n try { processRules(sheet.cssRules) } catch { /* cross-origin — skip */ }\n }\n return lines.join('\\n')\n}\n\nconst SAFE_TAGS = new Set([\n 'B', 'I', 'U', 'S', 'STRIKE', 'STRONG', 'EM', 'BR', 'P', 'DIV', 'SPAN', 'OL', 'UL', 'LI',\n])\n\nfunction sanitizeHtml(html: string): string {\n const doc = new DOMParser().parseFromString(`<body>${html}</body>`, 'text/html')\n function walk(parent: Element) {\n for (const child of Array.from(parent.childNodes)) {\n if (child.nodeType !== Node.ELEMENT_NODE) continue\n const el = child as Element\n if (!SAFE_TAGS.has(el.tagName)) {\n parent.replaceChild(document.createTextNode(el.textContent ?? ''), el)\n } else {\n // styleWithCSS (handleCommand) applies bold/italic/underline/strikeThrough as inline\n // styles rather than semantic tags — preserve them explicitly or they're silently\n // dropped along with every other attribute below, and never survive a reload.\n const htmlEl = el as HTMLElement\n const textAlign = htmlEl.style?.textAlign || el.getAttribute('align') || ''\n const fontWeight = htmlEl.style?.fontWeight || ''\n const fontStyle = htmlEl.style?.fontStyle || ''\n const textDecorationLine = htmlEl.style?.textDecorationLine || htmlEl.style?.textDecoration || ''\n for (const attr of Array.from(el.attributes)) el.removeAttribute(attr.name)\n if (textAlign) htmlEl.style.textAlign = textAlign\n if (fontWeight) htmlEl.style.fontWeight = fontWeight\n if (fontStyle) htmlEl.style.fontStyle = fontStyle\n if (textDecorationLine) htmlEl.style.textDecorationLine = textDecorationLine\n walk(el)\n }\n }\n }\n walk(doc.body)\n return doc.body.innerHTML\n}\n\nconst ICONS: Record<string, string> = {\n bold: '<path d=\"M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\"/><path d=\"M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\"/>',\n italic: '<line x1=\"19\" y1=\"4\" x2=\"10\" y2=\"4\"/><line x1=\"14\" y1=\"20\" x2=\"5\" y2=\"20\"/><line x1=\"15\" y1=\"4\" x2=\"9\" y2=\"20\"/>',\n underline: '<path d=\"M6 4v6a6 6 0 0 0 12 0V4\"/><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\"/>',\n strikeThrough: '<path d=\"M16 4H9a3 3 0 0 0-2.83 4\"/><path d=\"M14 12a4 4 0 0 1 0 8H6\"/><line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"/>',\n justifyLeft: '<line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\"/><line x1=\"15\" y1=\"12\" x2=\"3\" y2=\"12\"/><line x1=\"17\" y1=\"18\" x2=\"3\" y2=\"18\"/>',\n justifyCenter: '<line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\"/><line x1=\"17\" y1=\"12\" x2=\"7\" y2=\"12\"/><line x1=\"19\" y1=\"18\" x2=\"5\" y2=\"18\"/>',\n justifyRight: '<line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\"/><line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\"/><line x1=\"21\" y1=\"18\" x2=\"7\" y2=\"18\"/>',\n insertUnorderedList:\n '<line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\"/>' +\n '<line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\"/><line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\"/><line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\"/>',\n insertOrderedList:\n '<line x1=\"10\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"10\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"10\" y1=\"18\" x2=\"21\" y2=\"18\"/>' +\n '<path d=\"M4 6h1v4\"/><path d=\"M4 10h2\"/><path d=\"M6 18H4c0-1 2-2 2-3s-1-1.5-2-1\"/>',\n}\n\nconst TOOLBAR_PILL_PADDING = 2\nconst TOOLBAR_TOGGLE_GAP = 4\n\n/** Padding between the element box and the blue selection stroke (Figma inset). */\nconst SELECTION_CHROME_GAP = 4\n/** Gap between the outer edge of the blue stroke and the toolbar — same for action + text fills. */\nconst TOOLBAR_STROKE_GAP = 4\n/** FloatingToolbar is positioned from the element rect, so include chrome padding. */\nconst TOOLBAR_OFFSET_FROM_ELEMENT = SELECTION_CHROME_GAP + TOOLBAR_STROKE_GAP\n\nconst TOOLBAR_GROUPS: Array<Array<{ cmd: string; title: string }>> = [\n [\n { cmd: 'bold', title: 'Bold' },\n { cmd: 'italic', title: 'Italic' },\n { cmd: 'underline', title: 'Underline' },\n { cmd: 'strikeThrough', title: 'Strikethrough' },\n ],\n [\n { cmd: 'justifyLeft', title: 'Align Left' },\n { cmd: 'justifyCenter', title: 'Align Center' },\n { cmd: 'justifyRight', title: 'Align Right' },\n ],\n [\n { cmd: 'insertUnorderedList', title: 'Bullet List' },\n { cmd: 'insertOrderedList', title: 'Numbered List' },\n ],\n]\n\nfunction EditGlowChrome({\n rect,\n elRef,\n reorderHrefKey,\n dragDisabled = false,\n hideHandle = false,\n}: {\n rect: DOMRect\n elRef: React.Ref<HTMLDivElement>\n reorderHrefKey: string | null\n dragDisabled?: boolean\n hideHandle?: boolean\n}) {\n const GAP = SELECTION_CHROME_GAP\n return (\n <div\n ref={elRef}\n data-ohw-edit-chrome=\"\"\n style={{\n position: 'fixed',\n top: rect.top - GAP,\n left: rect.left - GAP,\n width: rect.width + GAP * 2,\n height: rect.height + GAP * 2,\n pointerEvents: 'none',\n zIndex: 2147483646,\n }}\n >\n <div\n style={{\n position: 'absolute',\n inset: 0,\n border: '2px solid var(--ohw-primary, #0885FE)',\n borderRadius: 8,\n boxShadow: '0 0 0 4px color-mix(in srgb, var(--ohw-primary, #0885FE) 12%, transparent)',\n pointerEvents: 'none',\n }}\n />\n {reorderHrefKey && !hideHandle && (\n <div\n data-ohw-drag-handle-container=\"\"\n data-ohw-drag-disabled={dragDisabled ? '' : undefined}\n style={{\n position: 'absolute',\n left: 0,\n top: '50%',\n transform: 'translate(calc(-100% - 7px), -50%)',\n pointerEvents: dragDisabled ? 'none' : 'auto',\n }}\n >\n <DragHandle\n aria-label={`Reorder ${reorderHrefKey}`}\n disabled={dragDisabled}\n aria-disabled={dragDisabled}\n />\n </div>\n )}\n </div>\n )\n}\n\ntype ParentScroll = { iframeOffsetTop: number; headerH: number; canvasH: number }\n\n/** Visible iframe region in parent viewport, expressed in iframe-local coordinates. */\nfunction getIframeVisibleClip(parentScroll: ParentScroll | null): { top: number; bottom: number } | null {\n if (!parentScroll) return null\n const { iframeOffsetTop, headerH: visibleCanvasTop, canvasH } = parentScroll\n const clipTop = Math.max(0, visibleCanvasTop - iframeOffsetTop)\n const clipBottom = Math.min(\n window.innerHeight,\n visibleCanvasTop + canvasH - iframeOffsetTop\n )\n return { top: clipTop, bottom: Math.max(clipTop, clipBottom) }\n}\n\nfunction applyVisibleViewport(el: HTMLElement, parentScroll: ParentScroll | null) {\n const clip = getIframeVisibleClip(parentScroll)\n const top = clip?.top ?? 0\n const height = clip ? clip.bottom - clip.top : window.innerHeight\n el.style.top = `${top}px`\n el.style.height = `${height}px`\n}\n\n/** Min margin from iframe edges — matches prototype ClampedToolbarRow. */\nconst TOOLBAR_EDGE_MARGIN = 4\n\nfunction clampToolbarToClip(\n top: number,\n transform: string,\n rect: DOMRect,\n clip: { top: number; bottom: number },\n approxH: number,\n gap: number\n): { top: number; transform: string } {\n const isAbove = transform.includes('translateY(-100%)')\n let visualTop = isAbove ? top - approxH : top\n let visualBottom = isAbove ? top : top + approxH\n const minTop = clip.top + gap\n const maxBottom = clip.bottom - gap\n\n if (visualTop >= minTop && visualBottom <= maxBottom) {\n return { top, transform }\n }\n\n const belowTop = rect.bottom + gap\n if (belowTop + approxH <= maxBottom && belowTop >= minTop) {\n return { top: belowTop, transform: 'translateX(-50%)' }\n }\n\n const aboveTop = rect.top - gap\n if (aboveTop - approxH >= minTop && aboveTop <= maxBottom) {\n return { top: aboveTop, transform: 'translateX(-50%) translateY(-100%)' }\n }\n\n if (belowTop + approxH <= maxBottom) {\n return { top: belowTop, transform: 'translateX(-50%)' }\n }\n\n const pinnedTop = Math.min(maxBottom - approxH, Math.max(minTop, clip.top + gap))\n return { top: pinnedTop + approxH, transform: 'translateX(-50%) translateY(-100%)' }\n}\n\nfunction clampToolbarLeft(centerX: number, toolbarWidth: number): number {\n const half = toolbarWidth / 2\n return Math.max(\n TOOLBAR_EDGE_MARGIN + half,\n Math.min(centerX, window.innerWidth - TOOLBAR_EDGE_MARGIN - half)\n )\n}\n\nfunction calcToolbarPos(rect: DOMRect, parentScroll: ParentScroll | null, toolbarW = 306) {\n // Offset from the element box so the gap to the blue stroke matches ItemInteractionLayer\n // (chromeGap + strokeGap). Action toolbar measures from the chrome edge; this measures\n // from the element, so both visual gaps stay equal.\n const GAP = TOOLBAR_OFFSET_FROM_ELEMENT\n const APPROX_H = 32\n const clip = getIframeVisibleClip(parentScroll)\n const clipTop = clip?.top ?? 0\n const canvasTopInIframe = parentScroll != null ? parentScroll.headerH - parentScroll.iframeOffsetTop : 0\n\n const visibleTop = rect.top - canvasTopInIframe\n const visibleBottom = rect.bottom - canvasTopInIframe\n\n // Three-state machine:\n // above — block top is in view; toolbar rides above the block\n // sticky — block top has scrolled past the canvas top; toolbar pins to canvas top edge\n // flip — exit from sticky only: block bottom approaches toolbar height,\n // meaning there's no more block content to anchor over; toolbar\n // attaches to block bottom and rides off-screen with it\n //\n // Short blocks (height ≤ APPROX_H + GAP) never enter sticky so never flip —\n // toolbar just rides above until the block is out of view.\n const isTall = rect.height > APPROX_H + GAP\n\n // When the anchor sits near the visible top (e.g. navbar CTA), flip below instead of clipping.\n const spaceAbove = rect.top - (clipTop + GAP)\n const fitsAbove = spaceAbove >= APPROX_H + GAP\n\n let top: number\n let transform: string\n\n if ((visibleTop > 0 || !isTall) && fitsAbove) {\n // Above phase\n top = rect.top - GAP\n transform = 'translateX(-50%) translateY(-100%)'\n } else if (visibleTop > 0 || !isTall) {\n // Above preferred but no room — flip below anchor (navbar buttons at page top)\n top = rect.bottom + GAP\n transform = 'translateX(-50%)'\n } else if (visibleBottom > APPROX_H + GAP) {\n // Sticky phase — pin to visible canvas top inside iframe (never negative)\n top = clipTop + GAP\n transform = 'translateX(-50%)'\n } else {\n // Flip phase — exit from sticky\n top = rect.bottom + GAP\n transform = 'translateX(-50%)'\n }\n\n if (clip) {\n const clamped = clampToolbarToClip(top, transform, rect, clip, APPROX_H, GAP)\n top = clamped.top\n transform = clamped.transform\n }\n\n const rawLeft = rect.left + rect.width / 2\n const left = clampToolbarLeft(rawLeft, toolbarW)\n return { top, left, transform }\n}\n\nfunction resolveItemInteractionState(\n rect: DOMRect,\n parentScroll: ParentScroll | null\n): Extract<ItemInteractionState, 'active-top' | 'active-bottom'> {\n const { transform } = calcToolbarPos(rect, parentScroll, 120)\n return transform.includes('translateY(-100%)') ? 'active-top' : 'active-bottom'\n}\n\n// Use the range boundary, not sel.anchorNode: after execCommand mutates the DOM (e.g.\n// toggling bold while italic/underline are also active), the browser can reposition the\n// anchor to sit at the container between sibling formatting spans rather than inside\n// them — walking from that container misses the still-applied sibling formats entirely.\n// Resolve to an actual child adjacent to the boundary instead.\nfunction resolveSelectionStartElement(sel: Selection | null): HTMLElement | null {\n if (!sel || sel.rangeCount === 0) return null\n const range = sel.getRangeAt(0)\n let startNode: Node = range.startContainer\n if (startNode.nodeType === Node.ELEMENT_NODE) {\n const el = startNode as Element\n startNode = el.childNodes[range.startOffset] ?? el.childNodes[range.startOffset - 1] ?? el\n }\n return startNode.nodeType === Node.TEXT_NODE ? startNode.parentElement : (startNode as HTMLElement)\n}\n\n// Bold/italic: check computed style (inherited, so the innermost element already reflects\n// any ancestor) AND semantic tag names — some design systems reset <b>/<strong>/<i>/<em>\n// to neutral weight/style, which would otherwise hide them from a computed-style-only\n// check. Underline/strike/list membership aren't inherited computed properties, so those\n// still need the ancestor walk regardless.\nfunction detectActiveFormats(startEl: HTMLElement, activeRoot: HTMLElement): Set<string> {\n const formats = new Set<string>()\n\n const cs = getComputedStyle(startEl)\n const weight = parseInt(cs.fontWeight, 10)\n let hasBold = cs.fontWeight === 'bold' || (!Number.isNaN(weight) && weight >= 600)\n let hasItalic = cs.fontStyle === 'italic' || cs.fontStyle === 'oblique'\n let hasUnderline = false\n let hasStrike = false\n let hasUl = false\n let hasOl = false\n for (let el: HTMLElement | null = startEl; el; el = el.parentElement) {\n if (el.tagName === 'B' || el.tagName === 'STRONG') hasBold = true\n if (el.tagName === 'I' || el.tagName === 'EM') hasItalic = true\n const decoration = getComputedStyle(el).textDecorationLine\n if (decoration.includes('underline') || el.tagName === 'U' || el.tagName === 'INS') hasUnderline = true\n if (decoration.includes('line-through') || el.tagName === 'S' || el.tagName === 'STRIKE' || el.tagName === 'DEL') hasStrike = true\n if (el.tagName === 'UL') hasUl = true\n if (el.tagName === 'OL') hasOl = true\n if (el === activeRoot) break\n }\n if (hasBold) formats.add('bold')\n if (hasItalic) formats.add('italic')\n if (hasUnderline) formats.add('underline')\n if (hasStrike) formats.add('strikeThrough')\n if (hasUl) formats.add('insertUnorderedList')\n if (hasOl) formats.add('insertOrderedList')\n\n // Alignment — derive from computed textAlign on the selection's block element.\n const block = startEl.closest<HTMLElement>('div, p, h1, h2, h3, h4, h5, h6, li, td, th') ?? startEl\n const align = getComputedStyle(block).textAlign\n if (align === 'center') formats.add('justifyCenter')\n else if (align === 'right' || align === 'end') formats.add('justifyRight')\n else formats.add('justifyLeft')\n\n return formats\n}\n\nfunction setsEqual(a: Set<string>, b: Set<string>): boolean {\n if (a.size !== b.size) return false\n for (const item of a) {\n if (!b.has(item)) return false\n }\n return true\n}\n\n// Character offset of (node, offset) relative to root's full text content — stable across\n// the DOM surgery execCommand does (splitting/merging/rewrapping text nodes), unlike a\n// saved Range or node reference, which goes stale the moment its nodes are replaced.\nfunction textOffsetInRoot(root: HTMLElement, node: Node, offset: number): number {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT)\n let total = 0\n let current: Node | null\n while ((current = walker.nextNode())) {\n if (current === node) return total + offset\n total += (current.textContent ?? '').length\n }\n return total\n}\n\n// Inverse of textOffsetInRoot: walks root's CURRENT text nodes (post-mutation) to find the\n// (node, offset) point at a given character offset, for reconstructing a Range afterward.\nfunction pointAtTextOffset(root: HTMLElement, targetOffset: number): { node: Node; offset: number } | null {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT)\n let total = 0\n let current: Node | null\n let last: Node | null = null\n while ((current = walker.nextNode())) {\n const len = (current.textContent ?? '').length\n if (total + len >= targetOffset) return { node: current, offset: targetOffset - total }\n total += len\n last = current\n }\n return last ? { node: last, offset: (last.textContent ?? '').length } : null\n}\n\nfunction FloatingToolbar({\n rect,\n parentScroll,\n elRef,\n onCommand,\n activeCommands,\n showEditLink,\n onEditLink,\n}: {\n rect: DOMRect\n parentScroll: ParentScroll | null\n elRef: React.Ref<HTMLDivElement>\n onCommand: (cmd: string) => void\n activeCommands: Set<string>\n showEditLink?: boolean\n onEditLink?: () => void\n}) {\n const localRef = React.useRef<HTMLDivElement | null>(null)\n const [measuredW, setMeasuredW] = React.useState(330)\n\n const setRefs = React.useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node\n if (typeof elRef === 'function') elRef(node)\n else if (elRef) (elRef as React.MutableRefObject<HTMLDivElement | null>).current = node\n if (node) {\n const w = node.offsetWidth\n if (w > 0) setMeasuredW(w)\n }\n },\n [elRef]\n )\n\n React.useLayoutEffect(() => {\n const node = localRef.current\n if (!node) return\n const update = () => {\n const w = node.offsetWidth\n if (w > 0) setMeasuredW(w)\n }\n update()\n const ro = new ResizeObserver(update)\n ro.observe(node)\n return () => ro.disconnect()\n }, [showEditLink, activeCommands])\n\n const { top, left, transform } = calcToolbarPos(rect, parentScroll, measuredW)\n\n return (\n <div\n ref={setRefs}\n style={{\n position: 'fixed',\n top,\n left,\n transform,\n zIndex: 2147483647,\n pointerEvents: 'auto',\n }}\n >\n <CustomToolbar>\n {TOOLBAR_GROUPS.map((btns, gi) => (\n <React.Fragment key={gi}>\n {gi > 0 && <CustomToolbarDivider />}\n {btns.map((btn) => {\n const isActive = activeCommands.has(btn.cmd)\n return (\n <CustomToolbarButton\n key={btn.cmd}\n title={btn.title}\n active={isActive}\n onMouseDown={(e) => {\n e.preventDefault()\n onCommand(btn.cmd)\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={isActive && gi > 0 ? { filter: 'drop-shadow(0 0 0.5px currentColor)' } : undefined}\n dangerouslySetInnerHTML={{ __html: ICONS[btn.cmd] }}\n aria-hidden\n />\n </CustomToolbarButton>\n )\n })}\n </React.Fragment>\n ))}\n {showEditLink ? (\n <CustomToolbarButton\n type=\"button\"\n title=\"Edit link\"\n onMouseDown={(e) => {\n e.preventDefault()\n e.stopPropagation()\n onEditLink?.()\n }}\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}\n >\n <Link className=\"size-4 shrink-0\" aria-hidden />\n </CustomToolbarButton>\n ) : null}\n </CustomToolbar>\n </div>\n )\n}\n\n// State preview pattern:\n// - Pseudo-class states: data-ohw-editable-state=\"hover\" — bridge forces via CSS injection + data-ohw-active-state attr\n// - Non-pseudo states (future): parent wrapper + children with data-ohw-state=\"success|error|default\"\nfunction deriveStates(attr: string): string[] {\n if (!attr) return []\n return ['Default', ...attr.split(',').map((s) => s.trim().charAt(0).toUpperCase() + s.trim().slice(1))]\n}\n\nfunction StateToggle({\n rect,\n activeState,\n states,\n onStateChange,\n}: {\n rect: DOMRect\n activeState: string\n states: string[]\n onStateChange: (state: string) => void\n}) {\n return (\n <ToggleGroup\n data-ohw-state-toggle=\"\"\n data-ohw-bridge=\"\"\n value={activeState}\n onValueChange={onStateChange}\n onMouseDown={(e: React.MouseEvent) => e.preventDefault()}\n className=\"fixed z-2147483647 pointer-events-auto shadow-popover\"\n style={{\n top: rect.top + 8,\n left: rect.right - 8,\n transform: 'translateX(-100%)',\n }}\n >\n {states.map((state) => (\n <ToggleGroupItem key={state} value={state} size=\"sm\">\n {state}\n </ToggleGroupItem>\n ))}\n </ToggleGroup>\n )\n}\n\nconst contentCache = new Map<string, Record<string, string>>()\n\nfunction resolveSubdomain(subdomainFromQuery: string | null): string {\n if (subdomainFromQuery) return subdomainFromQuery\n if (typeof window !== 'undefined') {\n const parts = window.location.hostname.split('.')\n if (parts.length >= 3 && parts[0] !== 'www') return parts[0]\n }\n const siteUrl = process.env.NEXT_PUBLIC_SITE_URL as string | undefined\n if (siteUrl) {\n try {\n const host = new URL(siteUrl).hostname\n const siteParts = host.split('.')\n if (siteParts.length >= 3 && siteParts[0] !== 'www') return siteParts[0]\n } catch { /* ignore */ }\n }\n return ''\n}\n\nexport function OhhwellsBridge() {\n const pathname = usePathname()\n const router = useRouter()\n const searchParams = useSearchParams()\n const isEditMode = isEditSessionActive()\n\n const [bridgeRoot, setBridgeRoot] = useState<HTMLElement | null>(null)\n useEffect(() => {\n const figtreeFontId = 'ohw-figtree-font'\n if (!document.getElementById(figtreeFontId)) {\n const preconnect1 = Object.assign(document.createElement('link'), { rel: 'preconnect', href: 'https://fonts.googleapis.com' })\n const preconnect2 = Object.assign(document.createElement('link'), { rel: 'preconnect', href: 'https://fonts.gstatic.com', crossOrigin: '' })\n const stylesheet = Object.assign(document.createElement('link'), {\n id: figtreeFontId,\n rel: 'stylesheet',\n // Inter is loaded alongside Figtree for the media overlay's Replace button. The bridge\n // renders inside the customer's document, so it cannot assume any font is present — an\n // unloaded family would silently fall back to whatever the template happens to use.\n href: 'https://fonts.googleapis.com/css2?family=Figtree:ital,wght@0,300..900;1,300..900&family=Inter:wght@400;500;600&display=swap',\n })\n document.head.append(preconnect1, preconnect2, stylesheet)\n }\n\n const el = document.createElement('div')\n el.setAttribute('data-ohw-bridge-root', '')\n el.setAttribute('data-ohw-bridge', '')\n el.className = 'font-sans'\n document.body.appendChild(el)\n setBridgeRoot(el)\n return () => { el.remove() }\n }, [])\n\n const subdomainFromQuery = searchParams.get('subdomain')\n const subdomain = resolveSubdomain(subdomainFromQuery)\n\n useLinkHrefGuardian(pathname, subdomain, isEditMode)\n\n const postToParent = useCallback((data: Record<string, unknown>) => {\n if (typeof window !== 'undefined' && window.parent !== window) {\n window.parent.postMessage(data, '*')\n }\n }, [])\n\n const [fetchState, setFetchState] = useState<'idle' | 'loading' | 'done'>('idle')\n const autoSaveTimers = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map())\n\n const activeElRef = useRef<HTMLElement | null>(null)\n /** True while any primary-button pointer press is held down anywhere in the document. */\n const pointerHeldRef = useRef(false)\n const selectedElRef = useRef<HTMLElement | null>(null)\n /** Stable identity for selection — React remounts recycle nodes by index after DnD. */\n const selectedHrefKeyRef = useRef<string | null>(null)\n const selectedFooterColAttrRef = useRef<string | null>(null)\n const originalContentRef = useRef<string | null>(null)\n const activeStateElRef = useRef<HTMLElement | null>(null)\n const parentScrollRef = useRef<{ iframeOffsetTop: number; headerH: number; canvasH: number } | null>(null)\n const visibleViewportRef = useRef<HTMLDivElement | null>(null)\n const [dialogPortalContainer, setDialogPortalContainer] = useState<HTMLElement | null>(null)\n const attachVisibleViewport = useCallback((node: HTMLDivElement | null) => {\n visibleViewportRef.current = node\n setDialogPortalContainer(node)\n if (node) applyVisibleViewport(node, parentScrollRef.current)\n }, [])\n const toolbarElRef = useRef<HTMLDivElement | null>(null)\n const glowElRef = useRef<HTMLDivElement | null>(null)\n const hoveredImageRef = useRef<HTMLElement | null>(null)\n const hoveredImageHasTextOverlapRef = useRef(false)\n // Which element the CURRENT drag is over. Tracked separately from hoveredImageRef because a\n // plain mouse-hover already sets that one — so keying the drag-over post off it alone meant\n // `isDragOver: true` was never sent when you mouse-hovered a target before dragging onto it.\n const dragOverElRef = useRef<HTMLElement | null>(null)\n // The overlay now renders here rather than in the parent, so hover needs to be render state,\n // not just a ref. `hoveredImageRef` stays as the hit-test's own bookkeeping (sticky pinning,\n // unhover debounce); this mirrors it for React.\n const [mediaHover, setMediaHover] = useState<MediaHover | null>(null)\n // Carousel hover chrome (the \"Edit gallery\" button). Independent of mediaHover: carousel\n // slides are no longer per-slide `data-ohw-editable`, so they don't flow through the media\n // hit-test. Tracked as render state so the button can position over the container.\n const [carouselHover, setCarouselHover] = useState<CarouselHover | null>(null)\n // Keys currently uploading → the box to draw their skeleton over. Driven by\n // `ow:image-uploading` from the parent (which owns the authenticated upload). The rect is\n // pinned at upload start because the element is mid-swap and the cursor may wander off it.\n // `fadingOut` is set once the replacement decodes, so the skeleton dissolves rather than pops.\n const [uploadingRects, setUploadingRects] = useState<\n Record<string, { rect: MediaHover['rect']; fadingOut?: boolean }>\n >({})\n const hoveredGapRef = useRef<{ insertAfter: string; insertBefore: string | null } | null>(null)\n const imageUnhoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const imageShowTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const editStylesRef = useRef<{ base: HTMLStyleElement; forceHover: HTMLStyleElement; stateViews: HTMLStyleElement } | null>(null)\n const activateRef = useRef<(el: HTMLElement, options?: ActivateOptions) => void>(() => {})\n const deactivateRef = useRef<() => void>(() => {})\n const selectRef = useRef<(anchor: HTMLElement) => void>(() => {})\n const selectFrameRef = useRef<(el: HTMLElement) => void>(() => {})\n const deselectRef = useRef<() => void>(() => {})\n const reselectNavigationItemRef = useRef<(navAnchor: HTMLElement) => void>(() => {})\n const commitNavigationTextEditRef = useRef<(navAnchor: HTMLElement) => void>(() => {})\n const refreshActiveCommandsRef = useRef<() => void>(() => {})\n const postToParentRef = useRef(postToParent)\n postToParentRef.current = postToParent\n const sectionsLoadedRef = useRef(false)\n const pendingScheduleConfigRequests = useRef<string[]>([])\n\n const [toolbarRect, setToolbarRect] = useState<DOMRect | null>(null)\n const [toolbarVariant, setToolbarVariant] = useState<ToolbarVariant>('none')\n const toolbarVariantRef = useRef<ToolbarVariant>('none')\n toolbarVariantRef.current = toolbarVariant\n const [selectedIsCta, setSelectedIsCta] = useState(false)\n const [reorderHrefKey, setReorderHrefKey] = useState<string | null>(null)\n const [reorderDragDisabled, setReorderDragDisabled] = useState(false)\n const [toggleState, setToggleState] = useState<{ rect: DOMRect; activeState: string; states: string[] } | null>(null)\n const [maxBadge, setMaxBadge] = useState<{ rect: DOMRect; current: number; max: number } | null>(null)\n const [activeCommands, setActiveCommands] = useState<Set<string>>(new Set())\n const [sectionGap, setSectionGap] = useState<{ insertAfter: string; insertBefore: string | null; y: number } | null>(null)\n const [toolbarShowEditLink, setToolbarShowEditLink] = useState(false)\n const hoveredNavContainerRef = useRef<HTMLElement | null>(null)\n const [hoveredNavContainerRect, setHoveredNavContainerRect] = useState<DOMRect | null>(null)\n const hoveredItemElRef = useRef<HTMLElement | null>(null)\n const [hoveredItemRect, setHoveredItemRect] = useState<DOMRect | null>(null)\n const siblingHintElRef = useRef<HTMLElement | null>(null)\n const [siblingHintRect, setSiblingHintRect] = useState<DOMRect | null>(null)\n const [siblingHintRects, setSiblingHintRects] = useState<DOMRect[]>([])\n const [isItemDragging, setIsItemDragging] = useState(false)\n const [isFooterFrameSelection, setIsFooterFrameSelection] = useState(false)\n const footerDragRef = useRef<FooterDragSession | null>(null)\n const [footerDropSlots, setFooterDropSlots] = useState<FooterDropSlot[]>([])\n const [activeFooterDropIndex, setActiveFooterDropIndex] = useState<number | null>(null)\n const [draggedItemRect, setDraggedItemRect] = useState<DOMRect | null>(null)\n const footerPointerDragRef = useRef<{\n el: HTMLElement\n kind: FooterDragKind\n startX: number\n startY: number\n pointerId: number\n wasSelected: boolean\n started: boolean\n } | null>(null)\n const suppressNextClickRef = useRef(false)\n /** Extra window so a trailing click after end→front drops can't steal selection. */\n const suppressClickUntilRef = useRef(0)\n const [linkPopover, setLinkPopover] = useState<LinkPopoverSession | null>(null)\n const linkPopoverSessionRef = useRef<LinkPopoverSession | null>(null)\n const addNavAfterAnchorRef = useRef<HTMLElement | null>(null)\n const editContentRef = useRef<Record<string, string>>({})\n const [sitePages, setSitePages] = useState<LinkPage[]>([])\n const [sectionsByPath, setSectionsByPath] = useState<Record<string, SectionNode[]>>({})\n const sectionsPrefetchGenRef = useRef(0)\n const setLinkPopoverRef = useRef(setLinkPopover)\n const linkPopoverPanelRef = useRef<HTMLDivElement>(null)\n const linkPopoverOpenRef = useRef(false)\n const linkPopoverGraceUntilRef = useRef(0)\n setLinkPopoverRef.current = setLinkPopover\n linkPopoverSessionRef.current = linkPopover\n\n const {\n navDragRef,\n navDropSlots,\n activeNavDropIndex,\n startNavLinkDrag,\n commitNavDrag,\n onNavDragOver,\n armNavPressFromChrome,\n refreshNavDragVisualsRef,\n } = useNavItemDrag({\n isEditMode,\n editContentRef,\n selectedElRef,\n activeElRef,\n footerDragRef,\n suppressNextClickRef,\n suppressClickUntilRef,\n siblingHintElRef,\n postToParentRef,\n deselectRef,\n selectRef,\n deactivateRef,\n setLinkPopover: () => setLinkPopover(null),\n linkPopoverOpenRef,\n setIsItemDragging,\n setDraggedItemRect,\n setSiblingHintRect,\n setSiblingHintRects,\n setToolbarRect,\n getNavigationItemAnchor,\n isDragHandleDisabled,\n isNavbarButton,\n })\n\n const bumpLinkPopoverGrace = () => {\n linkPopoverGraceUntilRef.current = Date.now() + 350\n }\n\n const runSectionsPrefetch = useCallback((pages: LinkPage[]) => {\n if (!isEditMode || shouldUseDevFixtures() || pages.length === 0) return\n\n const gen = ++sectionsPrefetchGenRef.current\n const paths = pages.map((p) => p.path)\n\n void prefetchSectionsForPaths(paths).then((fetched) => {\n if (gen !== sectionsPrefetchGenRef.current) return\n if (process.env.NODE_ENV === 'development') {\n console.info('[ohhwells-bridge] Sections prefetched for', Object.keys(fetched).join(', ') || '(none)')\n }\n setSectionsByPath((prev) =>\n mergePrefetchedSections(\n prev,\n fetched,\n typeof window !== 'undefined' ? window.location.pathname : pathname,\n collectSections()\n )\n )\n })\n }, [isEditMode, pathname])\n\n const runSectionsPrefetchRef = useRef(runSectionsPrefetch)\n runSectionsPrefetchRef.current = runSectionsPrefetch\n\n // ImageOverlay lives in the parent frame above the iframe — dismiss it while the link\n // popover is open so the overlay cannot cover popover UI at overlapping coordinates.\n // Scroll lock is owned by LinkPopover (skips locking while the section picker is active).\n useEffect(() => {\n if (!linkPopover) {\n document.documentElement.removeAttribute('data-ohw-link-popover-open')\n return\n }\n\n document.documentElement.setAttribute('data-ohw-link-popover-open', '')\n\n // Drop all item interaction chrome so Active/hover/sibling never paint over the modal.\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n siblingHintElRef.current = null\n setSiblingHintRect(null)\n setSiblingHintRects([])\n if (selectedElRef.current || toolbarVariantRef.current !== 'none') {\n deselectRef.current()\n }\n\n if (hoveredImageRef.current) {\n hoveredImageRef.current = null\n hoveredImageHasTextOverlapRef.current = false\n }\n hoveredGapRef.current = null\n setSectionGap(null)\n setMediaHover(null)\n postToParent({ type: 'ow:link-modal-lock', locked: true })\n\n const html = document.documentElement\n const body = document.body\n const prevHtmlOverflow = html.style.overflow\n const prevBodyOverflow = body.style.overflow\n html.style.overflow = 'hidden'\n body.style.overflow = 'hidden'\n\n const preventBackgroundScroll = (e: Event) => {\n const target = e.target\n if (target instanceof Element && target.closest('[data-ohw-link-modal-root], [data-slot=\"dialog-overlay\"]')) {\n return\n }\n e.preventDefault()\n }\n\n const scrollOpts = { passive: false, capture: true } as const\n document.addEventListener('wheel', preventBackgroundScroll, scrollOpts)\n document.addEventListener('touchmove', preventBackgroundScroll, scrollOpts)\n\n postToParent({ type: 'ow:image-unhover' })\n\n return () => {\n document.documentElement.removeAttribute('data-ohw-link-popover-open')\n postToParent({ type: 'ow:link-modal-lock', locked: false })\n html.style.overflow = prevHtmlOverflow\n body.style.overflow = prevBodyOverflow\n document.removeEventListener('wheel', preventBackgroundScroll, scrollOpts)\n document.removeEventListener('touchmove', preventBackgroundScroll, scrollOpts)\n }\n }, [linkPopover, postToParent])\n\n // Site pages from canvas editor parent — dedicated listener so we don't miss ow:site-pages.\n useEffect(() => {\n if (!isEditMode) return\n\n const useFixtures = shouldUseDevFixtures()\n if (useFixtures) {\n setSitePages(DEV_SITE_PAGES)\n setSectionsByPath(DEV_SECTIONS_BY_PATH)\n if (process.env.NODE_ENV === 'development') {\n console.info('[ohhwells-bridge] Dev fixtures loaded (ohw-fixtures=1)')\n }\n }\n\n const onSitePages = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:site-pages' || !Array.isArray(e.data.pages)) return\n if (useFixtures) return\n const mapped = (e.data.pages as Array<{ path: string; title: string }>).map((p) => ({\n path: p.path,\n title: p.title,\n }))\n setSitePages(mapped)\n runSectionsPrefetchRef.current(mapped)\n }\n\n window.addEventListener('message', onSitePages)\n if (!useFixtures) postToParent({ type: 'ow:request-site-pages' })\n\n return () => window.removeEventListener('message', onSitePages)\n }, [isEditMode, postToParent])\n\n // Bootstrap sections from template manifest immediately in edit mode (before ow:site-pages).\n useEffect(() => {\n if (!isEditMode || shouldUseDevFixtures()) return\n void loadAllSectionsManifest().then((manifest) => {\n if (Object.keys(manifest).length === 0) return\n setSectionsByPath((prev) => ({ ...manifest, ...prev }))\n })\n }, [isEditMode])\n\n // Full-height iframe (parent scrolls): handleScroll won't fire because window.scroll\n // doesn't propagate from parent → iframe. Use visualViewport events instead to re-fetch\n // In the VibeCanvasEditor the iframe is full-height and the parent window scrolls,\n // so window.scroll never fires inside the iframe. Use visualViewport events to keep\n // rects current when the parent scrolls.\n useEffect(() => {\n const update = () => {\n const el = activeElRef.current ?? selectedElRef.current\n if (el) setToolbarRect(getEditMeasureEl(el).getBoundingClientRect())\n setToggleState((prev) => {\n if (!prev || !activeStateElRef.current) return prev\n return { ...prev, rect: activeStateElRef.current.getBoundingClientRect() }\n })\n setSectionGap((prev) => {\n if (!prev) return prev\n const anchor = document.querySelector<HTMLElement>(`[data-ohw-section=\"${prev.insertAfter}\"]`)\n if (!anchor) return prev\n return { ...prev, y: anchor.getBoundingClientRect().bottom }\n })\n }\n const vvp = window.visualViewport\n if (!vvp) return\n vvp.addEventListener('scroll', update)\n vvp.addEventListener('resize', update)\n return () => {\n vvp.removeEventListener('scroll', update)\n vvp.removeEventListener('resize', update)\n }\n }, [])\n\n const refreshStateRules = useCallback(() => {\n editStylesRef.current?.forceHover &&\n (editStylesRef.current.forceHover.textContent = collectStateRules())\n }, [])\n\n // Respond to a single ow:request-schedule-config by looking up the tracker.\n // If no entry exists, adopts the widget (adds to tracker, notifies parent in edit mode).\n const processConfigRequest = useCallback((insertAfterVal: string) => {\n const tracker = getSectionsTracker()\n let entries: InsertedSection[] = []\n try { entries = JSON.parse(tracker.textContent || '[]') } catch {}\n const path = window.location.pathname\n const entry = entries.find(\n (e) => e.type === 'scheduling' && e.insertAfter === insertAfterVal && (!e.pagePath || e.pagePath === path)\n )\n if (entry) {\n window.postMessage({ type: 'ow:schedule-config', insertAfter: insertAfterVal, scheduleId: entry.scheduleId ?? null }, '*')\n return\n }\n // Widget has no saved record: adopt it so the connect flow works.\n const newEntry: InsertedSection = { type: 'scheduling', insertAfter: insertAfterVal, pagePath: path }\n entries.push(newEntry)\n tracker.textContent = JSON.stringify(entries)\n if (isEditMode) {\n postToParentRef.current({ type: 'ow:change', nodes: [{ key: '__ohw_sections', text: tracker.textContent }] })\n }\n window.postMessage({ type: 'ow:schedule-config', insertAfter: insertAfterVal, scheduleId: null }, '*')\n }, [isEditMode])\n\n const deactivate = useCallback(() => {\n const el = activeElRef.current\n if (!el) return\n\n // Always send the final content to the parent on deactivate so ow:exit-edit\n // can flush it immediately — regardless of whether the 400ms timer fired.\n const key = el.dataset.ohwKey\n if (key) {\n const timer = autoSaveTimers.current.get(key)\n if (timer !== undefined) {\n clearTimeout(timer)\n autoSaveTimers.current.delete(key)\n }\n const html = sanitizeHtml(el.innerHTML)\n const original = originalContentRef.current ?? ''\n if (html !== sanitizeHtml(original)) {\n postToParentRef.current({ type: 'ow:change', nodes: [{ key, text: html }] })\n const h = document.documentElement.scrollHeight\n if (h > 50) postToParentRef.current({ type: 'ow:height', height: h })\n }\n }\n\n el.removeAttribute('contenteditable')\n el.removeAttribute('data-ohw-editing')\n activeElRef.current = null\n setReorderHrefKey(null)\n setReorderDragDisabled(false)\n if (!selectedElRef.current) {\n setToolbarRect(null)\n setToolbarVariant('none')\n }\n setMaxBadge(null)\n setActiveCommands(new Set())\n setToolbarShowEditLink(false)\n postToParent({ type: 'ow:exit-edit' })\n }, [postToParent])\n\n const clearSelectedAttr = useCallback(() => {\n document.querySelectorAll<HTMLElement>('[data-ohw-selected]').forEach((el) => {\n el.removeAttribute('data-ohw-selected')\n })\n }, [])\n\n const deselect = useCallback(() => {\n clearSelectedAttr()\n selectedElRef.current = null\n selectedHrefKeyRef.current = null\n selectedFooterColAttrRef.current = null\n setSelectedIsCta(false)\n setReorderHrefKey(null)\n setReorderDragDisabled(false)\n setIsFooterFrameSelection(false)\n siblingHintElRef.current = null\n setSiblingHintRect(null)\n setSiblingHintRects([])\n setIsItemDragging(false)\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n if (!activeElRef.current) {\n setToolbarRect(null)\n setToolbarVariant('none')\n }\n }, [clearSelectedAttr])\n\n const markSelected = useCallback((el: HTMLElement) => {\n clearSelectedAttr()\n el.setAttribute('data-ohw-selected', '')\n }, [clearSelectedAttr])\n\n const resolveHrefKeyElement = useCallback((hrefKey: string): HTMLElement | null => {\n if (isFooterHrefKey(hrefKey)) {\n return document.querySelector<HTMLElement>(\n `footer [data-ohw-href-key=\"${CSS.escape(hrefKey)}\"]`\n )\n }\n if (isNavbarHrefKey(hrefKey)) {\n const desktop = document.querySelector<HTMLElement>('[data-ohw-nav-container]')\n const drawer = document.querySelector<HTMLElement>('[data-ohw-nav-drawer]')\n return (\n desktop?.querySelector<HTMLElement>(`[data-ohw-href-key=\"${CSS.escape(hrefKey)}\"]`) ??\n drawer?.querySelector<HTMLElement>(`[data-ohw-href-key=\"${CSS.escape(hrefKey)}\"]`) ??\n document.querySelector<HTMLElement>(`[data-ohw-href-key=\"${CSS.escape(hrefKey)}\"]`)\n )\n }\n return document.querySelector<HTMLElement>(\n `[data-ohw-href-key=\"${CSS.escape(hrefKey)}\"]`\n )\n }, [])\n\n /** Re-bind selection to the live node for selectedHrefKey after DOM reorder / React remount. */\n const resyncSelectedNavigationItem = useCallback(() => {\n const hrefKey = selectedHrefKeyRef.current\n if (hrefKey) {\n const link = resolveHrefKeyElement(hrefKey)\n if (!link || !isNavigationItem(link)) return\n selectedElRef.current = link\n const { key, disabled } = getNavigationItemReorderState(link)\n setReorderHrefKey(key)\n setReorderDragDisabled(disabled)\n setIsFooterFrameSelection(false)\n setToolbarVariant('link-action')\n setToolbarRect(link.getBoundingClientRect())\n setSiblingHintRects(collectNavigationItemSiblingHintRects(link))\n return\n }\n\n const colAttr = selectedFooterColAttrRef.current\n if (colAttr != null) {\n const column =\n document.querySelector<HTMLElement>(`[data-ohw-footer-col=\"${CSS.escape(colAttr)}\"]`) ??\n listFooterColumns()[Number(colAttr)] ??\n null\n if (!column || !isNavigationContainer(column)) return\n selectedElRef.current = column\n setIsFooterFrameSelection(true)\n setToolbarVariant('select-frame')\n setToolbarRect(column.getBoundingClientRect())\n setSiblingHintRects(\n listFooterColumns()\n .filter((c) => c !== column)\n .map((c) => c.getBoundingClientRect())\n )\n }\n }, [resolveHrefKeyElement])\n\n const reselectNavigationItem = useCallback((navAnchor: HTMLElement) => {\n selectedElRef.current = navAnchor\n selectedHrefKeyRef.current = navAnchor.getAttribute('data-ohw-href-key')\n selectedFooterColAttrRef.current = null\n markSelected(navAnchor)\n setSelectedIsCta(isNavbarButton(navAnchor))\n const { key, disabled } = getNavigationItemReorderState(navAnchor)\n setReorderHrefKey(key)\n setReorderDragDisabled(disabled)\n setToolbarVariant('link-action')\n setToolbarRect(navAnchor.getBoundingClientRect())\n setSiblingHintRects(collectNavigationItemSiblingHintRects(navAnchor))\n setToolbarShowEditLink(false)\n setActiveCommands(new Set())\n }, [markSelected])\n\n const commitNavigationTextEdit = useCallback((navAnchor: HTMLElement) => {\n const el = activeElRef.current\n if (!el) return\n const key = el.dataset.ohwKey\n if (key) {\n const timer = autoSaveTimers.current.get(key)\n if (timer !== undefined) {\n clearTimeout(timer)\n autoSaveTimers.current.delete(key)\n }\n const html = sanitizeHtml(el.innerHTML)\n const original = originalContentRef.current ?? ''\n if (html !== sanitizeHtml(original)) {\n postToParent({ type: 'ow:change', nodes: [{ key, text: html }] })\n const h = document.documentElement.scrollHeight\n if (h > 50) postToParent({ type: 'ow:height', height: h })\n }\n }\n el.removeAttribute('contenteditable')\n el.removeAttribute('data-ohw-editing')\n activeElRef.current = null\n setMaxBadge(null)\n setActiveCommands(new Set())\n setToolbarShowEditLink(false)\n postToParent({ type: 'ow:exit-edit' })\n reselectNavigationItem(navAnchor)\n }, [postToParent, reselectNavigationItem])\n\n const handleAddTopLevelNavItem = useCallback(() => {\n const items = listNavbarItems()\n addNavAfterAnchorRef.current = items[items.length - 1] ?? null\n deselectRef.current()\n deactivateRef.current()\n bumpLinkPopoverGrace()\n setLinkPopover({\n key: '__add-nav__',\n mode: 'create',\n intent: 'add-nav',\n })\n }, [])\n\n const clearFooterDragVisuals = useCallback(() => {\n footerDragRef.current = null\n setSiblingHintRects([])\n setFooterDropSlots([])\n setActiveFooterDropIndex(null)\n setDraggedItemRect(null)\n setIsItemDragging(false)\n unlockFooterDragInteraction()\n }, [])\n\n const refreshFooterDragVisuals = useCallback((session: FooterDragSession, activeSlot: FooterDropSlot | null, clientX?: number, clientY?: number) => {\n const dragged = session.draggedEl\n setDraggedItemRect(dragged.getBoundingClientRect())\n\n if (typeof clientX === 'number' && typeof clientY === 'number') {\n session.lastClientX = clientX\n session.lastClientY = clientY\n }\n session.activeSlot = activeSlot\n\n // During drag, siblings stay in default state — only drop indicators show placement.\n setSiblingHintRects([])\n\n if (session.kind === 'link') {\n const columns = listFooterColumns()\n const slots: FooterDropSlot[] = []\n columns.forEach((col, i) => {\n slots.push(...buildLinkDropSlots(col, i))\n })\n setFooterDropSlots(slots)\n const activeIdx = activeSlot ? slots.findIndex(s => s.columnIndex === activeSlot.columnIndex && s.insertIndex === activeSlot.insertIndex) : -1\n setActiveFooterDropIndex(activeIdx >= 0 ? activeIdx : null)\n return\n }\n\n const slots = buildColumnDropSlots()\n setFooterDropSlots(slots)\n const activeIdx = activeSlot ? slots.findIndex(s => s.insertIndex === activeSlot.insertIndex) : -1\n setActiveFooterDropIndex(activeIdx >= 0 ? activeIdx : null)\n }, [])\n\n const refreshFooterDragVisualsRef = useRef(refreshFooterDragVisuals)\n refreshFooterDragVisualsRef.current = refreshFooterDragVisuals\n const commitFooterDragRef = useRef<(x?: number, y?: number) => void>(() => { })\n const beginFooterDragRef = useRef<(session: FooterDragSession) => void>(() => { })\n\n const beginFooterDrag = useCallback(\n (session: FooterDragSession) => {\n const rect = session.draggedEl.getBoundingClientRect()\n session.lastClientX = session.lastClientX || rect.left + rect.width / 2\n session.lastClientY = session.lastClientY || rect.top + rect.height / 2\n session.activeSlot = session.activeSlot ?? null\n\n footerDragRef.current = session\n setIsItemDragging(true)\n lockFooterDuringDrag()\n siblingHintElRef.current = null\n setSiblingHintRect(null)\n\n // Hide toolbar while dragging; keep selection chrome via dragging state when selected\n if (session.wasSelected && selectedElRef.current === session.draggedEl) {\n setToolbarRect(rect)\n }\n\n const initialSlot = session.kind === 'link' && session.hrefKey ? hitTestLinkDropSlot(session.lastClientX, session.lastClientY, session.hrefKey) : hitTestColumnDropSlot(session.lastClientX, session.lastClientY)\n\n refreshFooterDragVisuals(session, initialSlot, session.lastClientX, session.lastClientY)\n },\n [refreshFooterDragVisuals]\n )\n beginFooterDragRef.current = beginFooterDrag\n\n const commitFooterDrag = useCallback(\n (clientX?: number, clientY?: number) => {\n const session = footerDragRef.current\n if (!session) {\n clearFooterDragVisuals()\n return\n }\n\n // Prefer tracked slot / last pointer — HTML5 dragend often reports clientX/Y as 0\n const x = typeof clientX === 'number' && (clientX !== 0 || clientY !== 0) ? clientX : session.lastClientX\n const y = typeof clientY === 'number' && (clientX !== 0 || clientY !== 0) ? clientY : session.lastClientY\n\n let nextOrder: string[][] | null = null\n const slot = session.activeSlot ?? (session.kind === 'link' && session.hrefKey ? hitTestLinkDropSlot(x, y, session.hrefKey) : session.kind === 'column' ? hitTestColumnDropSlot(x, y) : null)\n\n if (session.kind === 'link' && session.hrefKey && slot) {\n nextOrder = planFooterLinkMove(session.hrefKey, slot.columnIndex, slot.insertIndex)\n } else if (session.kind === 'column' && slot) {\n nextOrder = planFooterColumnMove(session.sourceColumnIndex, slot.insertIndex)\n }\n\n const wasSelected = session.wasSelected\n const draggedEl = session.draggedEl\n const hrefKey = session.hrefKey\n\n // applyFooterOrder moves links between column nodes rather than the column\n // nodes themselves, so track where the dragged column's content lands.\n let movedColumnIndex: number | null = null\n if (session.kind === 'column' && slot && nextOrder) {\n let adjusted = slot.insertIndex\n if (session.sourceColumnIndex < slot.insertIndex) adjusted -= 1\n movedColumnIndex = Math.max(0, Math.min(adjusted, nextOrder.length - 1))\n }\n\n const applySelectionAfterDrop = () => {\n // Keep selection only when the drag started on an already-selected item.\n if (!wasSelected) {\n deselectRef.current()\n return\n }\n\n // Prefer stable identity keys — React remounts footer markup by index after a\n // drop, so `draggedEl` / column shell index can point at the wrong item.\n if (hrefKey) {\n selectedHrefKeyRef.current = hrefKey\n selectedFooterColAttrRef.current = null\n const link = resolveHrefKeyElement(hrefKey)\n if (link && isNavigationItem(link)) {\n selectRef.current(link)\n return\n }\n }\n\n if (movedColumnIndex !== null && nextOrder) {\n const colKeys = nextOrder[movedColumnIndex] ?? []\n let column: HTMLElement | null = null\n for (const key of colKeys) {\n const link = document.querySelector<HTMLElement>(\n `footer [data-ohw-href-key=\"${CSS.escape(key)}\"]`\n )\n if (link) {\n column = findFooterColumnForLink(link)\n if (column) break\n }\n }\n if (!column) column = listFooterColumns()[movedColumnIndex] ?? null\n if (column && isNavigationContainer(column)) {\n selectFrameRef.current(column)\n return\n }\n }\n\n if (document.body.contains(draggedEl)) {\n if (isNavigationItem(draggedEl)) {\n selectRef.current(draggedEl)\n return\n }\n if (isNavigationContainer(draggedEl)) {\n selectFrameRef.current(draggedEl)\n return\n }\n }\n\n deselectRef.current()\n }\n\n if (nextOrder) {\n const orderJson = JSON.stringify(nextOrder)\n // Persist into edit content BEFORE mutating DOM so MutationObserver reconcile\n // cannot revert the move using a stale order.\n editContentRef.current = {\n ...editContentRef.current,\n [FOOTER_ORDER_KEY]: orderJson\n }\n applyFooterOrder(nextOrder)\n document.querySelectorAll<HTMLElement>('footer [data-ohw-href-key]').forEach(disableNativeHrefDrag)\n postToParentRef.current({\n type: 'ow:change',\n nodes: [{ key: FOOTER_ORDER_KEY, text: orderJson }]\n })\n // Update selection chrome BEFORE clearing isItemDragging. Otherwise toolbarRect\n // still points at the vacated slot — the item that shifted into the old position\n // (appears as \"active on the item before the dropped one\").\n applySelectionAfterDrop()\n clearFooterDragVisuals()\n // React may remount footer markup from static content — re-apply, then reselect.\n requestAnimationFrame(() => {\n if (editContentRef.current[FOOTER_ORDER_KEY] === orderJson) {\n applyFooterOrder(nextOrder)\n document.querySelectorAll<HTMLElement>('footer [data-ohw-href-key]').forEach(disableNativeHrefDrag)\n }\n applySelectionAfterDrop()\n // Second frame: catch React commit that recycles nodes by index.\n requestAnimationFrame(() => {\n if (editContentRef.current[FOOTER_ORDER_KEY] === orderJson) {\n applyFooterOrder(nextOrder)\n }\n resyncSelectedNavigationItem()\n })\n })\n return\n }\n\n applySelectionAfterDrop()\n clearFooterDragVisuals()\n },\n [clearFooterDragVisuals, resolveHrefKeyElement, resyncSelectedNavigationItem]\n )\n commitFooterDragRef.current = commitFooterDrag\n\n const startFooterLinkDrag = useCallback(\n (anchor: HTMLElement, clientX: number, clientY: number, wasSelected: boolean) => {\n const hrefKey = anchor.getAttribute('data-ohw-href-key')\n if (!hrefKey || !isFooterHrefKey(hrefKey)) return false\n const column = findFooterColumnForLink(anchor)\n const columns = listFooterColumns()\n beginFooterDrag({\n kind: 'link',\n hrefKey,\n columnEl: column,\n sourceColumnIndex: column ? columns.indexOf(column) : 0,\n wasSelected,\n draggedEl: anchor,\n lastClientX: clientX,\n lastClientY: clientY,\n activeSlot: null\n })\n return true\n },\n [beginFooterDrag]\n )\n\n const startFooterColumnDrag = useCallback(\n (columnEl: HTMLElement, clientX: number, clientY: number, wasSelected: boolean) => {\n const columns = listFooterColumns()\n const idx = columns.indexOf(columnEl)\n if (idx < 0) return false\n beginFooterDrag({\n kind: 'column',\n hrefKey: null,\n columnEl,\n sourceColumnIndex: idx,\n wasSelected,\n draggedEl: columnEl,\n lastClientX: clientX,\n lastClientY: clientY,\n activeSlot: null\n })\n return true\n },\n [beginFooterDrag]\n )\n\n const handleItemDragStart = useCallback(\n (e?: React.DragEvent) => {\n const selected = selectedElRef.current\n if (!selected) {\n setIsItemDragging(true)\n return\n }\n\n const clientX = e?.clientX ?? selected.getBoundingClientRect().left + 8\n const clientY = e?.clientY ?? selected.getBoundingClientRect().top + 8\n\n if (startFooterLinkDrag(selected, clientX, clientY, true)) return\n\n if (selected.hasAttribute('data-ohw-footer-col') || (isInferredFooterGroup(selected) && selected.closest('footer'))) {\n if (startFooterColumnDrag(selected, clientX, clientY, true)) return\n }\n\n if (startNavLinkDrag(selected, clientX, clientY, true)) return\n\n siblingHintElRef.current = null\n setSiblingHintRect(null)\n setIsItemDragging(true)\n },\n [startFooterColumnDrag, startFooterLinkDrag, startNavLinkDrag]\n )\n\n const handleItemDragEnd = useCallback(\n (e?: React.DragEvent) => {\n if (footerDragRef.current) {\n // dragend coordinates are unreliable in most browsers — omit so commit uses tracked slot\n const x = e?.clientX\n const y = e?.clientY\n if (typeof x === 'number' && typeof y === 'number' && (x !== 0 || y !== 0)) {\n commitFooterDrag(x, y)\n } else {\n commitFooterDrag()\n }\n return\n }\n if (navDragRef.current) {\n const x = e?.clientX\n const y = e?.clientY\n if (typeof x === 'number' && typeof y === 'number' && (x !== 0 || y !== 0)) {\n commitNavDrag(x, y)\n } else {\n commitNavDrag()\n }\n return\n }\n setIsItemDragging(false)\n },\n [commitFooterDrag, commitNavDrag, navDragRef]\n )\n\n const handleItemChromePointerDown = useCallback((e: React.PointerEvent) => {\n if (e.button !== 0) return\n const selected = selectedElRef.current\n if (!selected) return\n const hrefKey = selected.getAttribute('data-ohw-href-key')\n if (hrefKey && isFooterHrefKey(hrefKey)) {\n footerPointerDragRef.current = {\n el: selected,\n kind: 'link',\n startX: e.clientX,\n startY: e.clientY,\n pointerId: e.pointerId,\n wasSelected: true,\n started: false\n }\n return\n }\n if (selected.hasAttribute('data-ohw-footer-col') || (isInferredFooterGroup(selected) && selected.closest('footer'))) {\n footerPointerDragRef.current = {\n el: selected,\n kind: 'column',\n startX: e.clientX,\n startY: e.clientY,\n pointerId: e.pointerId,\n wasSelected: true,\n started: false\n }\n return\n }\n if (armNavPressFromChrome(selected, e.clientX, e.clientY, e.pointerId)) return\n }, [armNavPressFromChrome])\n\n const handleItemChromeClick = useCallback((clientX: number, clientY: number) => {\n // Real press-drag already ran — swallow the trailing click.\n if (suppressNextClickRef.current || Date.now() < suppressClickUntilRef.current) {\n suppressNextClickRef.current = false\n return\n }\n const selected = selectedElRef.current\n if (!selected || !isNavigationItem(selected)) return\n const editable = selected.querySelector<HTMLElement>('[data-ohw-editable=\"text\"]') ?? selected.querySelector<HTMLElement>('[data-ohw-editable]')\n if (!editable) return\n activateRef.current(editable, { caretX: clientX, caretY: clientY })\n }, [])\n\n reselectNavigationItemRef.current = reselectNavigationItem\n commitNavigationTextEditRef.current = commitNavigationTextEdit\n\n const select = useCallback((anchor: HTMLElement) => {\n if (!isNavigationItem(anchor)) return\n if (activeElRef.current) deactivate()\n selectedElRef.current = anchor\n selectedHrefKeyRef.current = anchor.getAttribute('data-ohw-href-key')\n selectedFooterColAttrRef.current = null\n markSelected(anchor)\n setSelectedIsCta(isNavbarButton(anchor))\n clearHrefKeyHover(anchor)\n // Parent stays Default — no frame/column hover chrome while an item is Active.\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n setHoveredItemRect(null)\n hoveredItemElRef.current = null\n siblingHintElRef.current = null\n setSiblingHintRect(null)\n setSiblingHintRects(collectNavigationItemSiblingHintRects(anchor))\n setIsItemDragging(false)\n const { key, disabled } = getNavigationItemReorderState(anchor)\n setReorderHrefKey(key)\n setReorderDragDisabled(disabled)\n setIsFooterFrameSelection(false)\n setToolbarVariant('link-action')\n setToolbarRect(anchor.getBoundingClientRect())\n setToolbarShowEditLink(false)\n setActiveCommands(new Set())\n }, [deactivate, markSelected])\n\n const selectFrame = useCallback((el: HTMLElement) => {\n if (!isNavigationContainer(el)) return\n if (activeElRef.current) deactivate()\n const isFooterColumn =\n el.hasAttribute('data-ohw-footer-col') ||\n Boolean(el.closest('footer') && isInferredFooterGroup(el))\n selectedElRef.current = el\n selectedHrefKeyRef.current = null\n selectedFooterColAttrRef.current = isFooterColumn\n ? (el.getAttribute('data-ohw-footer-col') ?? String(listFooterColumns().indexOf(el)))\n : null\n markSelected(el)\n setSelectedIsCta(false)\n clearHrefKeyHover(el)\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n setHoveredItemRect(null)\n hoveredItemElRef.current = null\n siblingHintElRef.current = null\n setSiblingHintRect(null)\n setSiblingHintRects(\n isFooterColumn\n ? listFooterColumns()\n .filter((column) => column !== el)\n .map((column) => column.getBoundingClientRect())\n : []\n )\n setIsItemDragging(false)\n setReorderHrefKey(null)\n setReorderDragDisabled(false)\n setIsFooterFrameSelection(isFooterColumn)\n setToolbarVariant('select-frame')\n setToolbarRect(el.getBoundingClientRect())\n setToolbarShowEditLink(false)\n setActiveCommands(new Set())\n }, [deactivate, markSelected])\n\n const activate = useCallback((el: HTMLElement, options?: ActivateOptions) => {\n if (activeElRef.current === el) return\n clearSelectedAttr()\n selectedElRef.current = null\n selectedHrefKeyRef.current = null\n selectedFooterColAttrRef.current = null\n setSelectedIsCta(false)\n deactivate()\n // Clear any image overlay so it doesn't block interaction with other text elements.\n if (hoveredImageRef.current) {\n hoveredImageRef.current = null\n setMediaHover(null)\n }\n setToolbarVariant('rich-text')\n siblingHintElRef.current = null\n setSiblingHintRect(null)\n setSiblingHintRects([])\n setIsItemDragging(false)\n // A drag-select gesture on plain (not-yet-active) text produces a real selection before\n // this runs. Chrome clobbers/collapses it when the host is freshly made contenteditable\n // and focused below — capture it now so it can be restored afterward.\n const preActivationSelection = window.getSelection()\n const preservedRange =\n preActivationSelection &&\n preActivationSelection.rangeCount > 0 &&\n !preActivationSelection.isCollapsed &&\n el.contains(preActivationSelection.getRangeAt(0).commonAncestorContainer)\n ? preActivationSelection.getRangeAt(0).cloneRange()\n : null\n el.setAttribute('contenteditable', 'true')\n el.setAttribute('data-ohw-editing', '')\n el.removeAttribute('data-ohw-hovered')\n el.closest<HTMLElement>('[data-ohw-href-key]')?.removeAttribute('data-ohw-hovered')\n activeElRef.current = el\n originalContentRef.current = el.innerHTML\n el.focus({ preventScroll: true })\n if (preservedRange) {\n const selection = window.getSelection()\n selection?.removeAllRanges()\n selection?.addRange(preservedRange)\n } else if (options?.caretX !== undefined && options?.caretY !== undefined) {\n const { caretX, caretY } = options\n placeCaretAtPoint(el, caretX, caretY)\n // Some browsers clobber the selection during/after focus — re-apply once layout settles.\n requestAnimationFrame(() => {\n if (activeElRef.current === el) placeCaretAtPoint(el, caretX, caretY)\n })\n } else {\n // Ensure a blinking caret is visible even when activation had no click point.\n const selection = window.getSelection()\n if (selection && selection.rangeCount === 0) {\n const range = document.createRange()\n range.selectNodeContents(el)\n range.collapse(false)\n selection.removeAllRanges()\n selection.addRange(range)\n }\n }\n setToolbarShowEditLink(Boolean(getHrefKeyFromElement(el)))\n\n const navAnchor = getNavigationItemAnchor(el)\n if (navAnchor) {\n setReorderHrefKey(null)\n setReorderDragDisabled(false)\n } else {\n const { key: reorderKey, disabled: reorderDisabled } = getReorderHandleState(el)\n setReorderHrefKey(reorderKey)\n setReorderDragDisabled(reorderDisabled)\n }\n\n setToolbarRect(getEditMeasureEl(el).getBoundingClientRect())\n postToParent({ type: 'ow:enter-edit', key: el.dataset.ohwKey })\n // selectionchange timing varies by browser — refresh after the frame to guarantee\n // active toolbar commands reflect the cursor state on the very first click.\n requestAnimationFrame(() => refreshActiveCommandsRef.current())\n }, [clearSelectedAttr, deactivate, postToParent])\n\n activateRef.current = activate\n deactivateRef.current = deactivate\n selectRef.current = select\n selectFrameRef.current = selectFrame\n deselectRef.current = deselect\n\n // Fetch saved content once per subdomain (cached in module-level Map so remounts are free).\n // In edit mode, hydration comes from the canvas editor via ow:hydrate — skip the public fetch.\n useLayoutEffect(() => {\n if (!subdomain || isEditMode) {\n setFetchState('done')\n return\n }\n\n const applyContent = (content: Record<string, string>): Promise<void> => {\n const imageLoads: Promise<void>[] = []\n\n for (const [key, val] of Object.entries(content)) {\n if (key === '__ohw_sections') continue\n if (applyVideoSettingNode(key, val)) continue\n if (applyCarouselNode(key, val)) continue\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${key}\"]`).forEach((el) => {\n if (el.dataset.ohwEditable === 'image') {\n const img = el instanceof HTMLImageElement ? el : el.querySelector<HTMLImageElement>('img')\n if (img && img.src !== val) {\n applyEditableImageSrc(img, val)\n imageLoads.push(new Promise<void>((resolve) => {\n img.onload = () => resolve()\n img.onerror = () => resolve()\n }))\n }\n } else if (el.dataset.ohwEditable === 'bg-image') {\n const next = `url('${val}')`\n if (el.style.backgroundImage !== next) el.style.backgroundImage = next\n } else if (el.dataset.ohwEditable === 'video') {\n // Guard on src so re-hydrating doesn't restart playback from frame 0.\n const video = getVideoEl(el)\n if (video && video.src !== val) {\n applyVideoSrc(video, val)\n imageLoads.push(new Promise<void>((resolve) => {\n video.onloadeddata = () => resolve()\n video.onerror = () => resolve()\n }))\n }\n } else if (el.dataset.ohwEditable === 'link') {\n applyLinkHref(el, val)\n } else if (el.innerHTML !== val) {\n el.innerHTML = val\n }\n })\n applyLinkByKey(key, val)\n }\n\n // TopNav only SSR-renders globalContent.nav — inject editor-added items from saved content.\n reconcileNavbarItemsFromContent(content)\n reconcileFooterOrderFromContent(content)\n enforceLinkHrefs()\n\n // Mount scheduling widgets after page content is applied so anchors exist in the DOM.\n initSectionsFromContent(content, true)\n sectionsLoadedRef.current = true\n pendingScheduleConfigRequests.current.splice(0).forEach(processConfigRequest)\n\n return imageLoads.length > 0 ? Promise.all(imageLoads).then(() => {}) : Promise.resolve()\n }\n\n const cached = contentCache.get(subdomain)\n if (cached) {\n applyContent(cached).finally(() => setFetchState('done'))\n return\n }\n\n let cancelled = false\n setFetchState('loading')\n const apiUrl = process.env.NEXT_PUBLIC_FLOWOPS_API_URL ?? 'https://flowops-backend-staging-2yfdh7pwpq-as.a.run.app'\n fetch(`${apiUrl}/api/public/sites/${subdomain}/content`, { cache: 'no-store' })\n .then((r) => (r.ok ? r.json() : null))\n .then((data) => {\n if (cancelled) return\n const content = (data?.content as Record<string, string>) ?? {}\n contentCache.set(subdomain, content)\n return applyContent(content)\n })\n .catch(() => {})\n .finally(() => {\n if (!cancelled) setFetchState('done')\n })\n\n return () => { cancelled = true }\n // pathname intentionally excluded — this effect should only run on true mount\n // (hard refresh / first visit) or subdomain change, and fetches once per subdomain\n // via the module-level contentCache. Re-applying content to newly navigated pages is\n // handled by the MutationObserver effect below; re-running this effect on every\n // client-side navigation was needlessly cycling fetchState and flashing the loader.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [subdomain, isEditMode])\n\n // Re-apply cached content whenever new DOM nodes appear (handles Next.js page navigation\n // where page elements commit after the fetch effect already ran).\n useEffect(() => {\n if (!subdomain || isEditMode) return\n\n let debounceTimer: ReturnType<typeof setTimeout> | null = null\n let observer: MutationObserver | null = null\n const applyFromCache = () => {\n const content = contentCache.get(subdomain)\n if (!content) return\n\n retryMissingSchedulingMounts(getPageSchedulingEntries(content['__ohw_sections']), false)\n\n // Disconnect while we mutate — el.innerHTML/src writes are themselves DOM\n // mutations, and re-applying the same value can fail to round-trip byte-for-byte\n // (entity encoding, hydration comment markers, attribute quoting, etc.), which would\n // otherwise re-trigger this observer forever.\n observer?.disconnect()\n try {\n for (const [key, val] of Object.entries(content)) {\n if (key === '__ohw_sections') continue\n if (applyVideoSettingNode(key, val)) continue\n if (applyCarouselNode(key, val)) continue\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${key}\"]`).forEach((el) => {\n if (el.dataset.ohwEditable === 'image') {\n const img = el instanceof HTMLImageElement ? el : el.querySelector<HTMLImageElement>('img')\n if (img && img.src !== val) applyEditableImageSrc(img, val)\n } else if (el.dataset.ohwEditable === 'bg-image') {\n const next = `url('${val}')`\n if (el.style.backgroundImage !== next) el.style.backgroundImage = next\n } else if (el.dataset.ohwEditable === 'video') {\n const video = getVideoEl(el)\n if (video && video.src !== val) applyVideoSrc(video, val)\n } else if (el.dataset.ohwEditable === 'link') {\n applyLinkHref(el, val)\n } else if (el.innerHTML !== val) {\n el.innerHTML = val\n }\n })\n applyLinkByKey(key, val)\n }\n reconcileNavbarItemsFromContent(content)\n reconcileFooterOrderFromContent(content)\n } finally {\n observer?.observe(document.body, { childList: true, subtree: true })\n }\n enforceLinkHrefs()\n }\n\n const scheduleApply = () => {\n if (debounceTimer) clearTimeout(debounceTimer)\n debounceTimer = setTimeout(applyFromCache, 150)\n }\n\n // Apply immediately on navigation — the cache read is synchronous, so there's no\n // reason to wait out the debounce here. The debounce is only for the observer\n // catching nodes that mount slightly after this effect runs.\n applyFromCache()\n observer = new MutationObserver(scheduleApply)\n observer.observe(document.body, { childList: true, subtree: true })\n return () => {\n observer?.disconnect()\n if (debounceTimer) clearTimeout(debounceTimer)\n }\n }, [subdomain, isEditMode, pathname])\n\n // Toggle the layout loader (React-owned DOM — never remove it imperatively)\n useLayoutEffect(() => {\n const el = document.getElementById('ohw-loader')\n if (!el) return\n const visible = Boolean(subdomain) && fetchState !== 'done'\n el.style.display = visible ? 'flex' : 'none'\n }, [subdomain, fetchState])\n\n // Navigation sync — always active when embedded\n useEffect(() => {\n postToParent({ type: 'ow:navigation', path: pathname })\n }, [pathname, postToParent])\n\n // Close link modal when the template page changes — except during add-nav / section picker flows.\n useEffect(() => {\n if (!isEditMode) return\n if (linkPopoverSessionRef.current?.intent === 'add-nav') return\n if (document.querySelector('[data-ohw-section-picker]')) return\n setLinkPopover(null)\n deselectRef.current()\n deactivateRef.current()\n }, [pathname, isEditMode])\n\n // Re-inject navbar / footer order after React re-renders layout; sync grab cursors.\n useEffect(() => {\n const contentForNav = () => {\n if (isEditMode) return editContentRef.current\n if (!subdomain) return {}\n return contentCache.get(subdomain) ?? {}\n }\n\n const observeRoots = () =>\n [document.querySelector('nav'), document.querySelector('footer')].filter(\n (el): el is HTMLElement => Boolean(el)\n )\n\n const roots = observeRoots()\n if (roots.length === 0) {\n reconcileNavbarItemsFromContent(contentForNav())\n reconcileFooterOrderFromContent(contentForNav())\n if (isEditMode) syncNavigationDragCursorAttrs()\n return\n }\n\n let rafId: number | null = null\n let applying = false\n let observer: MutationObserver | null = null\n\n const attach = () => {\n for (const root of observeRoots()) {\n observer?.observe(root, { childList: true, subtree: true })\n }\n }\n\n const run = () => {\n if (footerDragRef.current || navDragRef.current || applying) return\n applying = true\n observer?.disconnect()\n try {\n const content = contentForNav()\n reconcileNavbarItemsFromContent(content)\n reconcileFooterOrderFromContent(content)\n // Keep footer / nav links non-draggable so native <a> drag doesn't steal clicks.\n document.querySelectorAll<HTMLElement>('footer [data-ohw-href-key]').forEach((el) => {\n if (isFooterHrefKey(el.getAttribute('data-ohw-href-key'))) {\n disableNativeHrefDrag(el)\n }\n })\n document\n .querySelectorAll<HTMLElement>(\n 'nav [data-ohw-href-key], [data-ohw-nav-container] [data-ohw-href-key], [data-ohw-nav-drawer] [data-ohw-href-key]'\n )\n .forEach((el) => {\n if (isNavbarHrefKey(el.getAttribute('data-ohw-href-key'))) {\n disableNativeHrefDrag(el)\n }\n })\n // React remounts recycle nodes by index — rebind selection to the live href-key node.\n resyncSelectedNavigationItem()\n if (isEditMode) syncNavigationDragCursorAttrs()\n } finally {\n applying = false\n // Re-attach after our own DOM writes so React TopNav/Footer resets still re-trigger.\n attach()\n }\n }\n\n const schedule = () => {\n if (applying || rafId != null) return\n rafId = requestAnimationFrame(() => {\n rafId = null\n run()\n })\n }\n\n observer = new MutationObserver(schedule)\n run()\n return () => {\n if (rafId != null) cancelAnimationFrame(rafId)\n observer?.disconnect()\n }\n }, [isEditMode, pathname, subdomain, fetchState, resyncSelectedNavigationItem])\n\n // Report full document height so the parent can size the iframe to content (edit mode only).\n // Uses document.body.scrollHeight — more reliable than documentElement when html has overflow quirks.\n // Listens for WIDTH changes only (desktop↔mobile switch re-lays out content at a different height).\n // Height-only resize events (parent setting iframeHeight) are intentionally ignored to prevent loops.\n useEffect(() => {\n if (!isEditMode) return\n\n const measure = () => {\n const h = document.body.scrollHeight\n if (h > 50) postToParent({ type: 'ow:height', height: h })\n }\n\n const t1 = setTimeout(measure, 50)\n const t2 = setTimeout(measure, 500)\n\n let lastWidth = window.innerWidth\n let resizeTimer: ReturnType<typeof setTimeout> | null = null\n const handleResize = () => {\n if (window.innerWidth === lastWidth) return\n lastWidth = window.innerWidth\n if (resizeTimer) clearTimeout(resizeTimer)\n resizeTimer = setTimeout(measure, 150)\n }\n window.addEventListener('resize', handleResize)\n\n return () => {\n clearTimeout(t1)\n clearTimeout(t2)\n if (resizeTimer) clearTimeout(resizeTimer)\n window.removeEventListener('resize', handleResize)\n }\n }, [pathname, isEditMode, postToParent])\n\n // Preserve ?subdomain on internal navigation when using query-param mode (not hostname mode)\n useEffect(() => {\n if (!subdomainFromQuery || isEditMode) return\n\n const handleClick = (e: MouseEvent) => {\n const anchor = (e.target as HTMLElement).closest<HTMLAnchorElement>('a')\n if (!anchor || anchor.target === '_blank' || e.defaultPrevented) return\n\n const href = anchor.getAttribute('href')\n if (!href || /^(https?:|mailto:|tel:|#)/.test(href)) return\n\n const url = new URL(href, window.location.origin)\n if (url.searchParams.has('subdomain')) return\n\n e.preventDefault()\n url.searchParams.set('subdomain', subdomainFromQuery)\n router.push(url.pathname + url.search)\n }\n\n document.addEventListener('click', handleClick, true)\n return () => document.removeEventListener('click', handleClick, true)\n }, [subdomainFromQuery, isEditMode, router])\n\n // Edit mode bridge — listeners stay mounted; only tear down when leaving edit mode\n useEffect(() => {\n if (!isEditMode) {\n editStylesRef.current?.base.remove()\n editStylesRef.current?.forceHover.remove()\n editStylesRef.current?.stateViews.remove()\n editStylesRef.current = null\n document.querySelectorAll<HTMLElement>('[data-ohw-can-drag]').forEach((el) => {\n el.removeAttribute('data-ohw-can-drag')\n })\n return\n }\n\n const existing = editStylesRef.current\n let initialVh = window.innerHeight\n if (existing?.base.textContent) {\n const match = existing.base.textContent.match(/\\.min-h-screen[^{]*\\{[^}]*min-height:\\s*(\\d+)px/)\n if (match) initialVh = parseInt(match[1]!, 10)\n }\n\n const baseCss = `\n html { height: auto !important; }\n body { height: auto !important; min-height: 0 !important; overflow: hidden !important; }\n .min-h-screen, .min-h-svh, .min-h-dvh { min-height: ${initialVh}px !important; }\n .h-screen, .h-svh, .h-dvh { height: ${initialVh}px !important; }\n [style*=\"100vh\"] { min-height: ${initialVh}px !important; height: ${initialVh}px !important; }\n [style*=\"100svh\"] { min-height: ${initialVh}px !important; height: ${initialVh}px !important; }\n [style*=\"100dvh\"] { min-height: ${initialVh}px !important; height: ${initialVh}px !important; }\n [data-ohw-editable] {\n display: block;\n }\n /* Body text (no item-action toolbar) — first click enters text edit → I-beam.\n Exclude select-first nav/footer labels so grab/default on [data-ohw-href-key] can win. */\n [data-ohw-editable]:not([contenteditable]):not([data-ohw-editable=\"image\"]):not([data-ohw-editable=\"bg-image\"]):not([data-ohw-editable=\"video\"]):not([data-ohw-editable=\"link\"]):not(:is([data-ohw-href-key] *)) {\n cursor: text !important;\n }\n /* Select-first items: default arrow; grab only when drag-start is allowed (data-ohw-can-drag). */\n [data-ohw-href-key]:not([data-ohw-selected]),\n [data-ohw-href-key]:not([data-ohw-selected]) * {\n cursor: default !important;\n }\n [data-ohw-href-key][data-ohw-can-drag]:not([data-ohw-selected]),\n [data-ohw-href-key][data-ohw-can-drag]:not([data-ohw-selected]) * {\n cursor: grab !important;\n }\n /* Selected (action-toolbar) — next click enters text edit at caret. */\n [data-ohw-href-key][data-ohw-selected],\n [data-ohw-href-key][data-ohw-selected] * {\n cursor: text !important;\n }\n [data-ohw-editable=\"image\"], [data-ohw-editable=\"image\"] *,\n [data-ohw-editable=\"video\"], [data-ohw-editable=\"video\"] *,\n [data-ohw-editable=\"bg-image\"], [data-ohw-editable=\"bg-image\"] * { cursor: pointer !important; }\n [data-ohw-editable=\"link\"], [data-ohw-editable=\"link\"] * { cursor: pointer !important; }\n [data-ohw-hovered]:not([contenteditable]):not([data-ohw-href-key]) {\n outline: 2px dashed ${PRIMARY} !important;\n outline-offset: 4px;\n }\n [data-ohw-href-key] [data-ohw-hovered],\n [data-ohw-href-key][data-ohw-hovered],\n nav [data-ohw-href-key] [data-ohw-hovered],\n footer [data-ohw-href-key] [data-ohw-hovered] {\n outline: none !important;\n outline-offset: 0 !important;\n }\n /* Editor chrome owns selection — suppress native focus rings on nav/footer items. */\n nav [data-ohw-href-key]:focus,\n nav [data-ohw-href-key]:focus-visible,\n nav [data-ohw-href-key]:focus-within,\n footer [data-ohw-href-key]:focus,\n footer [data-ohw-href-key]:focus-visible,\n footer [data-ohw-href-key]:focus-within,\n nav [data-ohw-href-key] [data-ohw-editable]:focus,\n nav [data-ohw-href-key] [data-ohw-editable]:focus-visible,\n footer [data-ohw-href-key] [data-ohw-editable]:focus,\n footer [data-ohw-href-key] [data-ohw-editable]:focus-visible {\n outline: none !important;\n outline-offset: 0 !important;\n box-shadow: none !important;\n }\n /* Text edit wins over grab/default (must beat [data-ohw-can-drag] *). */\n [data-ohw-editing],\n [data-ohw-editing] *,\n [data-ohw-editable][contenteditable],\n [data-ohw-editable][contenteditable] *,\n nav [data-ohw-href-key] [data-ohw-editable][contenteditable],\n nav [data-ohw-href-key] [data-ohw-editable][contenteditable] *,\n footer [data-ohw-href-key] [data-ohw-editable][contenteditable],\n footer [data-ohw-href-key] [data-ohw-editable][contenteditable] * {\n outline: none !important;\n caret-color: ${PRIMARY} !important;\n cursor: text !important;\n }\n [data-ohw-editable][contenteditable]::selection,\n [data-ohw-editable][contenteditable] *::selection { background: ${PRIMARY}59 !important; }\n [data-ohw-editable-state], [data-ohw-editable-state] * { pointer-events: none !important; }\n [data-ohw-editable-state][data-ohw-active-state] [data-ohw-editable] { pointer-events: auto !important; }\n [data-ohw-editable-state][data-ohw-active-state][data-ohw-editable] { pointer-events: auto !important; }\n `\n\n if (!existing) {\n // Capture the initial iframe viewport height before the parent adjusts it.\n // Freezing min-h-screen / h-screen to this px value lets hero sections keep their\n // full-viewport design while preventing the 100vh feedback loop when the iframe grows.\n const base = document.createElement('style')\n base.setAttribute('data-ohw-edit-style', '')\n const forceHover = document.createElement('style')\n forceHover.setAttribute('data-ohw-active-state-style', '')\n const stateViews = document.createElement('style')\n stateViews.setAttribute('data-ohw-state-views-style', '')\n stateViews.textContent = `\n [data-ohw-state-view]:not([data-ohw-state-view=\"default\"]) { display: none; }\n [data-ohw-state-view=\"default\"] [data-ohw-editable] { pointer-events: auto !important; }\n [data-ohw-state-hovered] { outline: 2px dashed ${PRIMARY} !important; outline-offset: 4px; }\n [data-ohw-state-hovered]:has([data-ohw-hovered]) { outline: none !important; }\n `\n document.head.appendChild(base)\n document.head.appendChild(forceHover)\n document.head.appendChild(stateViews)\n editStylesRef.current = { base, forceHover, stateViews }\n }\n editStylesRef.current!.base.textContent = baseCss\n\n syncNavigationDragCursorAttrs()\n\n refreshStateRules()\n\n const handleClick = (e: MouseEvent) => {\n if (suppressNextClickRef.current || Date.now() < suppressClickUntilRef.current) {\n suppressNextClickRef.current = false\n e.preventDefault()\n e.stopPropagation()\n return\n }\n const target = e.target as HTMLElement\n if (target.closest('[data-ohw-toolbar]')) return\n if (target.closest('[data-ohw-state-toggle]')) return\n if (target.closest('[data-ohw-max-badge]')) return\n if (isInsideLinkEditor(target)) return\n if (target.closest('[data-ohw-edit-chrome], [data-ohw-item-interaction], [data-ohw-drag-handle-container], [data-slot=\"drag-handle\"]')) {\n // Item chrome drag surface: click without drag enters text edit\n if (target.closest('[data-ohw-item-drag-surface]')) {\n e.preventDefault()\n e.stopPropagation()\n const selected = selectedElRef.current\n if (selected && isNavigationItem(selected)) {\n const editable = selected.querySelector<HTMLElement>('[data-ohw-editable=\"text\"]') ?? selected.querySelector<HTMLElement>('[data-ohw-editable]')\n if (editable) {\n activateRef.current(editable, {\n caretX: e.clientX,\n caretY: e.clientY\n })\n }\n } else if (selected?.hasAttribute('data-ohw-footer-col')) {\n // Selected column chrome covers its links — route the click to the link under it\n const link = listFooterLinksInColumn(selected).find(el => {\n const r = el.getBoundingClientRect()\n return e.clientX >= r.left && e.clientX <= r.right && e.clientY >= r.top && e.clientY <= r.bottom\n })\n if (link) selectRef.current(link)\n }\n return\n }\n const navFromChrome = resolveNavContainerSelectionTarget(target, e.clientX, e.clientY)\n if (navFromChrome) {\n e.preventDefault()\n e.stopPropagation()\n selectFrameRef.current(navFromChrome)\n return\n }\n const footerFromChrome = resolveFooterColumnSelectionTarget(target, e.clientX, e.clientY)\n if (footerFromChrome) {\n e.preventDefault()\n e.stopPropagation()\n selectFrameRef.current(footerFromChrome)\n return\n }\n e.preventDefault()\n e.stopPropagation()\n return\n }\n\n // Clicks inside the active editable reposition the caret / select text — do not exit edit.\n // Must preventDefault: nav items are <a href>, and without it the browser navigates.\n if (activeElRef.current) {\n const active = activeElRef.current\n const inActive = active === target || active.contains(target)\n const navAnchor = getNavigationItemAnchor(active)\n const inActiveNav = Boolean(\n navAnchor && (navAnchor === target || navAnchor.contains(target))\n )\n if (inActive || inActiveNav) {\n e.preventDefault()\n e.stopPropagation()\n // Single click: place caret (default was blocked). Multi-click: dblclick handler /\n // native selection expand — don't override. A drag-select gesture also ends in a\n // click here (mousedown/mouseup on the same target) — don't collapse that selection.\n const selection = window.getSelection()\n const hasRangeSelection = Boolean(selection && !selection.isCollapsed)\n if (e.detail < 2 && !hasRangeSelection) {\n placeCaretAtPoint(active, e.clientX, e.clientY)\n refreshActiveCommandsRef.current()\n }\n return\n }\n }\n\n const editable = target.closest<HTMLElement>('[data-ohw-editable]')\n if (editable) {\n if (editable.dataset.ohwEditable === 'link') {\n e.preventDefault()\n e.stopPropagation()\n deselectRef.current()\n deactivateRef.current()\n bumpLinkPopoverGrace()\n setLinkPopoverRef.current({\n key: editable.dataset.ohwKey ?? '',\n mode: 'edit',\n target: getLinkHref(editable),\n })\n return\n }\n if (isMediaEditable(editable)) {\n e.preventDefault()\n e.stopPropagation()\n postToParentRef.current({ type: 'ow:image-pick', key: editable.dataset.ohwKey ?? '', elementType: editable.dataset.ohwEditable ?? 'image' })\n return\n }\n\n const hrefCtx = getHrefKeyFromElement(editable)\n const navAnchor = hrefCtx ? getNavigationItemAnchor(hrefCtx.anchor) : null\n if (navAnchor) {\n e.preventDefault()\n e.stopPropagation()\n if (selectedElRef.current === navAnchor) {\n // Second+ click of a double/triple-click — handled by dblclick (select all text).\n if (e.detail >= 2) return\n activateRef.current(editable, { caretX: e.clientX, caretY: e.clientY })\n return\n }\n selectRef.current(navAnchor)\n return\n }\n\n e.preventDefault()\n e.stopPropagation()\n activateRef.current(editable)\n return\n }\n\n const hrefAnchor = getNavigationItemAnchor(target)\n if (hrefAnchor) {\n e.preventDefault()\n e.stopPropagation()\n if (selectedElRef.current === hrefAnchor) {\n const textEditable = hrefAnchor.querySelector<HTMLElement>('[data-ohw-editable=\"text\"]') ?? hrefAnchor.querySelector<HTMLElement>('[data-ohw-editable]')\n if (textEditable) {\n activateRef.current(textEditable, {\n caretX: e.clientX,\n caretY: e.clientY\n })\n }\n return\n }\n selectRef.current(hrefAnchor)\n return\n }\n\n // Footer column: click on empty column area (gap between links) selects the column frame\n const footerColClick = target.closest<HTMLElement>('[data-ohw-footer-col]')\n if (footerColClick) {\n e.preventDefault()\n e.stopPropagation()\n selectFrameRef.current(footerColClick)\n return\n }\n\n // Select the links row container: gap clicks, empty padding in the flex row,\n // or empty space on the nav root (outside logo / book CTA).\n const navContainerToSelect = resolveNavContainerSelectionTarget(target, e.clientX, e.clientY)\n if (navContainerToSelect) {\n e.preventDefault()\n e.stopPropagation()\n selectFrameRef.current(navContainerToSelect)\n return\n }\n\n const footerColumnToSelect = resolveFooterColumnSelectionTarget(target, e.clientX, e.clientY)\n if (footerColumnToSelect) {\n e.preventDefault()\n e.stopPropagation()\n selectFrameRef.current(footerColumnToSelect)\n return\n }\n\n const selectedContainer = selectedElRef.current\n if (selectedContainer && isNavigationContainer(selectedContainer)) {\n const navItem = getNavigationItemAnchor(target)\n if (!navItem && (selectedContainer === target || selectedContainer.contains(target))) {\n e.preventDefault()\n e.stopPropagation()\n return\n }\n }\n\n // Don't deactivate if user drag-selected text from inside the editable to outside\n if (activeElRef.current) {\n const sel = window.getSelection()\n if (sel && !sel.isCollapsed) {\n const range = sel.getRangeAt(0)\n if (activeElRef.current.contains(range.commonAncestorContainer)) return\n }\n }\n\n const anchor = target.closest('a')\n if (anchor) e.preventDefault()\n\n if (Date.now() < linkPopoverGraceUntilRef.current) return\n\n if (linkPopoverOpenRef.current && activeElRef.current) {\n const hrefCtx = getHrefKeyFromElement(activeElRef.current)\n if (hrefCtx && (hrefCtx.anchor === target || hrefCtx.anchor.contains(target))) return\n }\n\n if (linkPopoverOpenRef.current && selectedElRef.current) {\n const selected = selectedElRef.current\n if (selected === target || selected.contains(target)) return\n }\n\n if (linkPopoverOpenRef.current) {\n setLinkPopoverRef.current(null)\n return\n }\n\n deselectRef.current()\n deactivateRef.current()\n }\n\n const handleDblClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement\n if (target.closest('[data-ohw-toolbar]')) return\n if (target.closest('[data-ohw-state-toggle]')) return\n if (target.closest('[data-ohw-max-badge]')) return\n if (isInsideLinkEditor(target)) return\n if (target.closest('[data-ohw-edit-chrome], [data-ohw-item-interaction], [data-ohw-drag-handle-container], [data-slot=\"drag-handle\"]')) {\n return\n }\n\n const navLabel = getNavigationLabelEditable(target)\n if (!navLabel) return\n\n const { editable } = navLabel\n e.preventDefault()\n e.stopPropagation()\n\n if (activeElRef.current !== editable) {\n activateRef.current(editable)\n }\n\n requestAnimationFrame(() => {\n selectAllTextInEditable(editable)\n refreshActiveCommandsRef.current()\n })\n }\n\n const handleMouseOver = (e: MouseEvent) => {\n if (document.documentElement.hasAttribute('data-ohw-section-picking')) return\n\n const target = e.target as HTMLElement\n\n // Don't paint hover chrome over / under an open link modal.\n if (linkPopoverOpenRef.current) {\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n return\n }\n\n // Navbar links row — empty padding only (never while over a link).\n // Suppress while a nav/footer frame is already selected.\n if (toolbarVariantRef.current !== 'select-frame') {\n const navContainer = target.closest<HTMLElement>('[data-ohw-nav-container]')\n if (navContainer && !getNavigationItemAnchor(target)) {\n hoveredNavContainerRef.current = navContainer\n setHoveredNavContainerRect(navContainer.getBoundingClientRect())\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n return\n }\n if (!target.closest('[data-ohw-nav-container]')) {\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n }\n }\n\n // Prefer the link item — never paint column hover while the pointer is over a footer/nav link.\n const navAnchor = getNavigationItemAnchor(target)\n if (navAnchor) {\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n const selected = selectedElRef.current\n // Only skip the selected *item* itself — a selected parent column must not\n // suppress hover chrome on its child links.\n if (selected === navAnchor) return\n clearHrefKeyHover(navAnchor)\n hoveredItemElRef.current = navAnchor\n setHoveredItemRect(navAnchor.getBoundingClientRect())\n return\n }\n\n // Footer column chrome in empty column space (gaps / padding).\n // Allowed even while a child item is Active — dashed column hover still applies.\n const footerCol =\n target.closest<HTMLElement>('[data-ohw-footer-col]') ??\n target.closest<HTMLElement>('[data-ohw-footer-column]')\n if (footerCol) {\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n if (selectedElRef.current === footerCol) return\n hoveredItemElRef.current = footerCol\n setHoveredItemRect(footerCol.getBoundingClientRect())\n return\n }\n\n const editable = target.closest<HTMLElement>('[data-ohw-editable]')\n if (!editable) return\n const selected = selectedElRef.current\n if (selected && (selected === editable || selected.contains(editable))) return\n if (!isMediaEditable(editable) && !editable.hasAttribute('contenteditable')) {\n const hoverTarget = editable.closest<HTMLElement>('[data-ohw-href-key]') ?? editable\n if (hoverTarget.hasAttribute('data-ohw-href-key')) {\n clearHrefKeyHover(hoverTarget)\n hoveredItemElRef.current = hoverTarget\n setHoveredItemRect(hoverTarget.getBoundingClientRect())\n } else if (!isInsideNavigationItem(editable)) {\n hoverTarget.setAttribute('data-ohw-hovered', '')\n }\n }\n }\n\n const handleMouseOut = (e: MouseEvent) => {\n const target = e.target as HTMLElement\n\n if (target.closest('[data-ohw-nav-container], [data-ohw-footer-col], [data-ohw-footer-column]')) {\n const related = e.relatedTarget instanceof Element ? e.relatedTarget : null\n if (related?.closest('[data-ohw-nav-container], [data-ohw-footer-col], [data-ohw-footer-column], [data-ohw-navbar-container-chrome], [data-ohw-navbar-add-button]')) {\n return\n }\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n }\n\n const footerCol =\n target.closest<HTMLElement>('[data-ohw-footer-col]') ??\n target.closest<HTMLElement>('[data-ohw-footer-column]')\n if (footerCol && hoveredItemElRef.current === footerCol) {\n const related = e.relatedTarget instanceof Element ? e.relatedTarget : null\n if (related?.closest('[data-ohw-drag-handle-container], [data-ohw-item-interaction]')) return\n if (\n related?.closest('[data-ohw-footer-col], [data-ohw-footer-column]') === footerCol\n ) {\n return\n }\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n return\n }\n\n const navAnchor = getNavigationItemAnchor(target)\n if (navAnchor) {\n const related = e.relatedTarget instanceof Element ? e.relatedTarget : null\n if (related?.closest('[data-ohw-drag-handle-container], [data-ohw-item-interaction]')) return\n if (related && navAnchor.contains(related)) return\n if (hoveredItemElRef.current === navAnchor) {\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n }\n return\n }\n\n const editable = target.closest<HTMLElement>('[data-ohw-editable]')\n if (!editable) return\n const related = e.relatedTarget instanceof Element ? e.relatedTarget : null\n if (related?.closest('[data-ohw-drag-handle-container], [data-ohw-item-interaction]')) return\n if (!isMediaEditable(editable)) {\n const hoverTarget = editable.closest<HTMLElement>('[data-ohw-href-key]') ?? editable\n if (hoverTarget.hasAttribute('data-ohw-href-key')) {\n if (!related?.closest('[data-ohw-href-key]')) {\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n }\n } else {\n hoverTarget.removeAttribute('data-ohw-hovered')\n }\n }\n }\n\n // Parent canvas editor sends root-viewport coords via ow:pointer-sync; in-iframe mouse events are local.\n const toProbeCoords = (clientX: number, clientY: number, fromParentViewport: boolean) => {\n if (!fromParentViewport) return { x: clientX, y: clientY }\n const frame = window.frameElement as HTMLElement | null\n if (!frame) return { x: clientX, y: clientY }\n const fr = frame.getBoundingClientRect()\n return {\n x: clientX - fr.left - frame.clientLeft,\n y: clientY - fr.top - frame.clientTop,\n }\n }\n\n const uploadLockedTracks = new Set<HTMLElement>()\n\n const resumeAnimTracks = () => {\n document.querySelectorAll<HTMLElement>('[data-ohw-hover-paused]').forEach((el) => {\n if (!uploadLockedTracks.has(el)) el.removeAttribute('data-ohw-hover-paused')\n })\n }\n\n // Returns the element's rect clipped to any overflow-hidden/clip ancestor boundaries.\n // Needed when an image (e.g. height:auto logo) overflows a fixed-height container.\n const getVisibleRect = (el: HTMLElement) => {\n const r = el.getBoundingClientRect()\n let top = r.top, left = r.left, bottom = r.bottom, right = r.right\n let parent = el.parentElement\n while (parent) {\n const style = getComputedStyle(parent)\n if (style.overflowY === 'hidden' || style.overflowY === 'clip' || style.overflowX === 'hidden' || style.overflowX === 'clip') {\n const pr = parent.getBoundingClientRect()\n top = Math.max(top, pr.top)\n bottom = Math.min(bottom, pr.bottom)\n left = Math.max(left, pr.left)\n right = Math.min(right, pr.right)\n }\n if (parent === document.documentElement) break\n parent = parent.parentElement\n }\n return { top, left, width: Math.max(0, right - left), height: Math.max(0, bottom - top) }\n }\n\n // Was `postImageHover` — same call sites, same hit-test, but the overlay now lives in this\n // document so the hover lands in local state instead of being marshalled to the parent.\n const showImageHover = (imgEl: HTMLElement, isDragOver = false, forceTextOverlap?: boolean) => {\n const r = getVisibleRect(imgEl)\n const hasTextOverlap = forceTextOverlap ?? false\n hoveredImageHasTextOverlapRef.current = hasTextOverlap\n // `elementType` drives the overlay's label/icon and the file-picker `accept`, so video\n // rides the same channel as image rather than a parallel ow:video-* protocol.\n const video = imgEl.dataset.ohwEditable === 'video' ? getVideoEl(imgEl) : null\n setMediaHover({\n key: imgEl.dataset.ohwKey ?? '',\n rect: { top: r.top, left: r.left, width: r.width, height: r.height },\n elementType: (imgEl.dataset.ohwEditable as MediaElementType) ?? 'image',\n hasTextOverlap,\n isDragOver,\n ...(video ? { videoAutoplay: video.autoplay, videoMuted: video.muted } : {}),\n })\n const track = imgEl.closest<HTMLElement>('[data-ohw-hover-pause]')\n if (track) track.setAttribute('data-ohw-hover-paused', '')\n }\n\n const clearImageHover = () => setMediaHover(null)\n\n // Bbox hit-test works with pointer-events:none on hover-card children; elementFromPoint does not.\n const findImageAtPoint = (clientX: number, clientY: number, fromParentViewport: boolean) => {\n const { x, y } = toProbeCoords(clientX, clientY, fromParentViewport)\n const images = Array.from(document.querySelectorAll<HTMLElement>(MEDIA_SELECTOR))\n const matches: HTMLElement[] = []\n for (let i = images.length - 1; i >= 0; i--) {\n const el = images[i]\n\n // State-aware filtering: only offer Replace for media that belongs to the active card state.\n // data-ohw-state=\"default\" → only in default (non-hover) editing\n // data-ohw-state=\"hover\" → only in hover editing (data-ohw-active-state=\"hover\")\n // When the image element IS the hover-card itself (base media), treat it as state=\"default\".\n const ownerCard = el.closest<HTMLElement>('[data-ohw-editable-state]')\n if (ownerCard) {\n const inHoverState = ownerCard.getAttribute('data-ohw-active-state') === 'hover'\n const elState = el.dataset.ohwState\n if (el === ownerCard && inHoverState) continue\n if (elState === 'default' && inHoverState) continue\n if (elState === 'hover' && !inHoverState) continue\n }\n\n const r = getVisibleRect(el)\n if (x >= r.left && x <= r.left + r.width && y >= r.top && y <= r.top + r.height) matches.push(el)\n }\n if (matches.length === 0) return null\n // Prefer explicit element media (<img>/<video>) over bg-image sections when both overlap at\n // the cursor. A logo image (e.g. 1100×1107) can be larger by area than its bg-image container\n // (1823×280), so pure smallest-area would wrongly pick the container. Type priority fixes this.\n const imageTypeMatches = matches.filter(\n el => el.dataset.ohwEditable === 'image' || el.dataset.ohwEditable === 'video'\n )\n const candidatePool = imageTypeMatches.length > 0 ? imageTypeMatches : matches\n const smallest = candidatePool.reduce((best, el) => {\n const br = getVisibleRect(best)\n const er = getVisibleRect(el)\n return er.width * er.height < br.width * br.height ? el : best\n })\n const pinned = hoveredImageRef.current\n // Only apply sticky if the pinned element is in the same candidate pool.\n // If pinned is a bg-image but there are now image-type matches, skip sticky so\n // the more specific image-type element is returned.\n if (pinned && candidatePool.includes(pinned)) {\n const pr = getVisibleRect(pinned)\n const stickyPad = 48\n const withinPad =\n x >= pr.left - stickyPad &&\n x <= pr.left + pr.width + stickyPad &&\n y >= pr.top - stickyPad &&\n y <= pr.top + pr.height + stickyPad\n // Keep pinned while cursor is near it so moving toward the Replace button doesn't switch\n // to a larger parent (e.g., logo → bg-image). Yield when the cursor is clearly over a\n // different candidate (sibling logos in a strip are often same-size, so \"smaller\" alone\n // is not enough).\n if (withinPad) {\n if (smallest !== pinned && candidatePool.includes(smallest)) {\n const sr = getVisibleRect(smallest)\n const overOther =\n x >= sr.left &&\n x <= sr.left + sr.width &&\n y >= sr.top &&\n y <= sr.top + sr.height\n if (overOther) return smallest\n }\n return pinned\n }\n }\n return smallest\n }\n\n\n\n const dismissImageHover = () => {\n if (hoveredImageRef.current) {\n hoveredImageRef.current = null\n hoveredImageHasTextOverlapRef.current = false\n resumeAnimTracks()\n postToParentRef.current({ type: 'ow:image-unhover' })\n }\n }\n\n const probeNavigationHoverAt = (x: number, y: number) => {\n if (toolbarVariantRef.current === 'select-frame') {\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n }\n\n const navContainers = Array.from(\n document.querySelectorAll<HTMLElement>('[data-ohw-nav-container]')\n )\n const footerColumns = listFooterColumns()\n\n // Prefer link items under the pointer (nav or footer).\n for (const container of [...navContainers, ...footerColumns]) {\n const containerRect = container.getBoundingClientRect()\n const overContainer =\n x >= containerRect.left &&\n x <= containerRect.right &&\n y >= containerRect.top &&\n y <= containerRect.bottom\n if (!overContainer) continue\n\n const navItemHit = Array.from(\n container.querySelectorAll<HTMLElement>('[data-ohw-href-key]')\n ).find((el) => {\n if (!isNavigationItem(el) || isNavbarButton(el)) return false\n const itemRect = el.getBoundingClientRect()\n return (\n x >= itemRect.left &&\n x <= itemRect.right &&\n y >= itemRect.top &&\n y <= itemRect.bottom\n )\n })\n\n if (navItemHit) {\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n const selected = selectedElRef.current\n // Parent column/frame selection must not block item hover.\n if (selected !== navItemHit) {\n clearHrefKeyHover(navItemHit)\n hoveredItemElRef.current = navItemHit\n setHoveredItemRect(navItemHit.getBoundingClientRect())\n } else if (hoveredItemElRef.current === navItemHit) {\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n }\n return\n }\n }\n\n // Empty navbar links-row padding (not while a frame is already selected).\n if (toolbarVariantRef.current !== 'select-frame') {\n for (const container of navContainers) {\n const containerRect = container.getBoundingClientRect()\n const overContainer =\n x >= containerRect.left &&\n x <= containerRect.right &&\n y >= containerRect.top &&\n y <= containerRect.bottom\n if (!overContainer) continue\n if (isPointOverNavItem(container, x, y)) continue\n hoveredNavContainerRef.current = container\n setHoveredNavContainerRect(container.getBoundingClientRect())\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n return\n }\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n } else {\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n }\n\n // Empty footer column space → dashed column chrome (also while a child item is Active).\n for (const column of footerColumns) {\n const containerRect = column.getBoundingClientRect()\n const overContainer =\n x >= containerRect.left &&\n x <= containerRect.right &&\n y >= containerRect.top &&\n y <= containerRect.bottom\n if (!overContainer) continue\n if (isPointOverNavItem(column, x, y)) continue\n if (selectedElRef.current === column) {\n if (hoveredItemElRef.current === column) {\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n }\n return\n }\n hoveredItemElRef.current = column\n setHoveredItemRect(column.getBoundingClientRect())\n return\n }\n\n // Left nav/footer containers entirely — clear column hover if it was a footer column.\n if (\n hoveredItemElRef.current?.hasAttribute('data-ohw-footer-col') ||\n hoveredItemElRef.current?.hasAttribute('data-ohw-footer-column')\n ) {\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n }\n }\n\n const probeImageAt = (\n clientX: number,\n clientY: number,\n isDragOver = false,\n fromParentViewport = false,\n ) => {\n if (linkPopoverOpenRef.current) {\n if (hoveredImageRef.current) {\n hoveredImageRef.current = null\n hoveredImageHasTextOverlapRef.current = false\n resumeAnimTracks()\n clearImageHover()\n }\n dismissImageHover()\n return\n }\n\n const { x, y } = toProbeCoords(clientX, clientY, fromParentViewport)\n\n // Navbar sits over hero bg-images — never show the parent image overlay on top of it.\n if (isPointOverNavigation(x, y)) {\n dismissImageHover()\n probeNavigationHoverAt(x, y)\n return\n }\n\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n // Leaving nav/footer — drop footer-column hover chrome.\n if (\n hoveredItemElRef.current?.hasAttribute('data-ohw-footer-col') ||\n hoveredItemElRef.current?.hasAttribute('data-ohw-footer-column')\n ) {\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n }\n\n // If the cursor is over the state toggle, hide the image overlay so the toggle is clickable.\n const toggleEl = document.querySelector('[data-ohw-state-toggle]')\n if (toggleEl) {\n const tr = toggleEl.getBoundingClientRect()\n if (x >= tr.left && x <= tr.right && y >= tr.top && y <= tr.bottom) {\n dismissImageHover()\n return\n }\n }\n\n const imgEl = findImageAtPoint(clientX, clientY, fromParentViewport)\n\n // While text is being edited, hide the overlay only for media that CONTAINS the text being\n // edited — e.g. the hero bg-image behind the nav links you're editing, where the overlay\n // would swallow the caret. Media unrelated to the active element (a video, an image\n // elsewhere) must stay hoverable; suppressing everything made all media un-hoverable the\n // moment you clicked into any text.\n const activeEl = activeElRef.current\n\n if (activeEl && (!imgEl || imgEl.contains(activeEl))) {\n if (hoveredImageRef.current) {\n hoveredImageRef.current = null\n hoveredImageHasTextOverlapRef.current = false\n resumeAnimTracks()\n clearImageHover()\n }\n\n // While text is being edited, keep image overlay hidden (e.g. nav links over hero bg).\n if (activeElRef.current) {\n dismissImageHover()\n return\n }\n }\n\n if (imgEl) {\n const { x, y } = toProbeCoords(clientX, clientY, fromParentViewport)\n\n // Carousel arrows/dots sit under the full-bleed media overlay. Bbox-test chrome so we\n // can dismiss the overlay even when elementFromPoint only sees the overlay itself.\n const overMediaChrome = Array.from(\n document.querySelectorAll<HTMLElement>('[data-ohw-media-chrome]'),\n ).some((el) => {\n const r = el.getBoundingClientRect()\n return x >= r.left && x <= r.right && y >= r.top && y <= r.bottom\n })\n if (overMediaChrome) {\n if (hoveredImageRef.current) {\n hoveredImageRef.current = null\n hoveredImageHasTextOverlapRef.current = false\n resumeAnimTracks()\n clearImageHover()\n }\n return\n }\n\n const topEl = document.elementFromPoint(x, y) as HTMLElement | null\n\n // Floating text toolbar / edit chrome / drag handle — dismiss image overlay.\n if (topEl?.closest('[data-ohw-toolbar], [data-ohw-edit-chrome], [data-ohw-item-interaction], [data-ohw-drag-handle-container], [data-slot=\"drag-handle\"]')) {\n if (hoveredImageRef.current) {\n hoveredImageRef.current = null\n resumeAnimTracks()\n clearImageHover()\n }\n return\n }\n\n if (\n topEl?.closest('[data-ohw-link-popover-root]') ||\n topEl?.closest('[data-ohw-link-modal-root]') ||\n topEl?.closest('[data-ohw-link-page-dropdown]')\n ) {\n if (hoveredImageRef.current) {\n hoveredImageRef.current = null\n hoveredImageHasTextOverlapRef.current = false\n resumeAnimTracks()\n clearImageHover()\n }\n return\n }\n\n const isStateCardImage = !!imgEl.closest('[data-ohw-editable-state]')\n\n // Use bbox hit-testing to find text at cursor (elementFromPoint skips pointer-events:none).\n const textEditable = Array.from(\n document.querySelectorAll<HTMLElement>(NON_MEDIA_SELECTOR)\n ).find((el) => {\n const er = el.getBoundingClientRect()\n return x >= er.left && x <= er.right && y >= er.top && y <= er.bottom\n })\n\n if (imageUnhoverTimerRef.current) {\n clearTimeout(imageUnhoverTimerRef.current)\n imageUnhoverTimerRef.current = null\n }\n if (imageShowTimerRef.current) {\n clearTimeout(imageShowTimerRef.current)\n imageShowTimerRef.current = null\n }\n\n if (textEditable) {\n if (textEditable.hasAttribute('contenteditable')) {\n // Text actively being edited — keep overlay hidden.\n if (hoveredImageRef.current) {\n hoveredImageRef.current = null\n hoveredImageHasTextOverlapRef.current = false\n resumeAnimTracks()\n clearImageHover()\n }\n return\n }\n\n if (isStateCardImage) {\n // State card: keep overlay visible but pointer-events-none so text stays accessible.\n // Never send unhover — the overlay div stays in DOM, only hasTextOverlap toggles.\n if (imgEl !== hoveredImageRef.current || !hoveredImageHasTextOverlapRef.current) {\n hoveredImageRef.current = imgEl\n showImageHover(imgEl, isDragOver, true)\n }\n document.querySelectorAll<HTMLElement>('[data-ohw-hovered]').forEach(el => el.removeAttribute('data-ohw-hovered'))\n if (textEditable && !isInsideNavigationItem(textEditable)) {\n textEditable.setAttribute('data-ohw-hovered', '')\n }\n return\n }\n\n // Non-state-card: hide overlay when cursor is over text.\n if (hoveredImageRef.current) {\n hoveredImageRef.current = null\n hoveredImageHasTextOverlapRef.current = false\n resumeAnimTracks()\n clearImageHover()\n }\n document.querySelectorAll<HTMLElement>('[data-ohw-hovered]').forEach(el => el.removeAttribute('data-ohw-hovered'))\n if (textEditable && !isInsideNavigationItem(textEditable)) {\n textEditable.setAttribute('data-ohw-hovered', '')\n }\n return\n }\n\n // Cursor on pure image area (no text).\n // If the cursor is in a section-gap zone, the Add section button takes priority — hide image overlay.\n if (hoveredGapRef.current) {\n if (hoveredImageRef.current) { hoveredImageRef.current = null; resumeAnimTracks(); clearImageHover() }\n document.querySelectorAll<HTMLElement>('[data-ohw-hovered]').forEach(el => el.removeAttribute('data-ohw-hovered'))\n return\n }\n document.querySelectorAll<HTMLElement>('[data-ohw-hovered]').forEach(el => el.removeAttribute('data-ohw-hovered'))\n if (imgEl !== hoveredImageRef.current || hoveredImageHasTextOverlapRef.current) {\n hoveredImageRef.current = imgEl\n showImageHover(imgEl, isDragOver)\n } else if (isDragOver) {\n showImageHover(imgEl, true)\n }\n } else {\n const inIframeView =\n clientX >= 0 &&\n clientY >= 0 &&\n clientX <= window.innerWidth &&\n clientY <= window.innerHeight\n if (!inIframeView) return\n if (imageUnhoverTimerRef.current) {\n clearTimeout(imageUnhoverTimerRef.current)\n imageUnhoverTimerRef.current = null\n }\n if (imageShowTimerRef.current) {\n clearTimeout(imageShowTimerRef.current)\n imageShowTimerRef.current = null\n }\n if (hoveredImageRef.current) {\n hoveredImageRef.current = null\n hoveredImageHasTextOverlapRef.current = false\n resumeAnimTracks()\n clearImageHover()\n }\n // Text editables have pointer-events:none (state card CSS) so mouseover never fires on them.\n // Use bbox hit-test so the hover outline still appears when cursor is over a text element.\n const { x, y } = toProbeCoords(clientX, clientY, fromParentViewport)\n const textEl = Array.from(\n document.querySelectorAll<HTMLElement>(NON_MEDIA_SELECTOR)\n ).find((el) => {\n const er = el.getBoundingClientRect()\n return x >= er.left && x <= er.right && y >= er.top && y <= er.bottom\n })\n document.querySelectorAll<HTMLElement>('[data-ohw-hovered]').forEach(el => el.removeAttribute('data-ohw-hovered'))\n if (textEl && !textEl.hasAttribute('contenteditable')) {\n const navAnchor = getNavigationItemAnchor(textEl)\n if (navAnchor) {\n const selected = selectedElRef.current\n if (selected !== navAnchor && !selected?.contains(navAnchor)) {\n clearHrefKeyHover(navAnchor)\n hoveredItemElRef.current = navAnchor\n setHoveredItemRect(navAnchor.getBoundingClientRect())\n }\n } else {\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n textEl.setAttribute('data-ohw-hovered', '')\n }\n } else {\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n }\n }\n }\n\n const probeHoverCardsAt = (clientX: number, clientY: number, fromParentViewport = false) => {\n // Link modal / section picker own the UI — don't outline nested state cards\n // (e.g. ContactForm inside contact-form section) as if they were pickable targets.\n if (\n linkPopoverOpenRef.current ||\n document.documentElement.hasAttribute('data-ohw-section-picking')\n ) {\n if (activeStateElRef.current) {\n activeStateElRef.current.removeAttribute('data-ohw-state-hovered')\n activeStateElRef.current = null\n setToggleState(null)\n }\n return\n }\n\n const { x, y } = toProbeCoords(clientX, clientY, fromParentViewport)\n const toggleEl = document.querySelector('[data-ohw-state-toggle]')\n if (toggleEl) {\n const tr = toggleEl.getBoundingClientRect()\n if (x >= tr.left && x <= tr.right && y >= tr.top && y <= tr.bottom) {\n return\n }\n }\n\n const cards = Array.from(document.querySelectorAll<HTMLElement>('[data-ohw-editable-state]'))\n const found = cards.find((card) => {\n const r = card.getBoundingClientRect()\n return x >= r.left && x <= r.right && y >= r.top && y <= r.bottom\n }) ?? null\n\n const currentLocked = activeStateElRef.current?.hasAttribute('data-ohw-active-state')\n ? activeStateElRef.current\n : null\n const active = found ?? currentLocked\n\n const prev = activeStateElRef.current\n activeStateElRef.current = active\n // Only touch the DOM and React state when the hovered card actually changes.\n if (active !== prev) {\n if (prev) prev.removeAttribute('data-ohw-state-hovered')\n if (active) {\n if (active.querySelector('[data-ohw-state-view]')) active.setAttribute('data-ohw-state-hovered', '')\n const states = deriveStates(active.dataset.ohwEditableState ?? '')\n const activeState = active.hasAttribute('data-ohw-active-state') ? (active.getAttribute('data-ohw-active-state') ?? 'Default').charAt(0).toUpperCase() + (active.getAttribute('data-ohw-active-state') ?? '').slice(1) : 'Default'\n setToggleState({ rect: active.getBoundingClientRect(), activeState, states })\n } else {\n setToggleState(null)\n }\n }\n }\n\n const probeSectionGapAt = (clientX: number, clientY: number, fromParentViewport = false) => {\n if (linkPopoverOpenRef.current) {\n if (hoveredGapRef.current) {\n hoveredGapRef.current = null\n setSectionGap(null)\n }\n return\n }\n\n const { y } = toProbeCoords(clientX, clientY, fromParentViewport)\n const sections = Array.from(document.querySelectorAll<HTMLElement>('[data-ohw-section]'))\n .sort((a, b) => a.getBoundingClientRect().top - b.getBoundingClientRect().top)\n const ZONE = 20\n for (let i = 0; i < sections.length; i++) {\n const a = sections[i]\n const b = sections[i + 1] ?? null\n const boundaryY = a.getBoundingClientRect().bottom\n if (Math.abs(y - boundaryY) <= ZONE) {\n const insertAfter = a.dataset.ohwSection ?? ''\n const insertBefore = b?.dataset.ohwSection ?? null\n hoveredGapRef.current = { insertAfter, insertBefore }\n setSectionGap({ insertAfter, insertBefore, y: boundaryY })\n return\n }\n }\n if (hoveredGapRef.current) {\n hoveredGapRef.current = null\n setSectionGap(null)\n }\n }\n\n const handleMouseMove = (e: MouseEvent) => {\n const { clientX, clientY } = e\n probeSectionGapAt(clientX, clientY)\n probeImageAt(clientX, clientY)\n probeHoverCardsAt(clientX, clientY)\n }\n\n const handlePointerSync = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:pointer-sync') return\n const { clientX, clientY } = e.data as { clientX?: number; clientY?: number }\n if (typeof clientX !== 'number' || typeof clientY !== 'number') return\n probeSectionGapAt(clientX, clientY)\n probeImageAt(clientX, clientY)\n probeHoverCardsAt(clientX, clientY)\n }\n\n const handleDragOver = (e: DragEvent) => {\n const footerSession = footerDragRef.current\n if (footerSession) {\n e.preventDefault()\n if (e.dataTransfer) e.dataTransfer.dropEffect = 'move'\n const slot = footerSession.kind === 'link' && footerSession.hrefKey ? hitTestLinkDropSlot(e.clientX, e.clientY, footerSession.hrefKey) : hitTestColumnDropSlot(e.clientX, e.clientY)\n refreshFooterDragVisualsRef.current(footerSession, slot, e.clientX, e.clientY)\n return\n }\n\n if (onNavDragOver(e)) return\n\n e.preventDefault()\n const el = findImageAtPoint(e.clientX, e.clientY, false)\n if (!el) {\n if (e.dataTransfer) e.dataTransfer.dropEffect = 'none'\n return\n }\n e.dataTransfer!.dropEffect = 'copy'\n // Keyed off the drag-specific ref, not hoveredImageRef: if the pointer had already\n // mouse-hovered this element, hoveredImageRef === el and the drag-over state would\n // never be posted, leaving the parent without its drop-target confirmation.\n if (dragOverElRef.current !== el) {\n dragOverElRef.current = el\n hoveredImageRef.current = el\n const isStateCard = !!el.closest('[data-ohw-editable-state]')\n showImageHover(el, true, isStateCard ? true : undefined)\n }\n }\n\n const handleDragLeave = (e: DragEvent) => {\n const imgEl = findImageAtPoint(e.clientX, e.clientY, false)\n if (imgEl) return\n dragOverElRef.current = null\n hoveredImageRef.current = null\n resumeAnimTracks()\n clearImageHover()\n }\n\n const handleDrop = (e: DragEvent) => {\n e.preventDefault()\n const el = findImageAtPoint(e.clientX, e.clientY, false)\n if (!el) return\n const file = e.dataTransfer?.files?.[0]\n if (file) {\n const wantsVideo = el.dataset.ohwEditable === 'video'\n const accepted = wantsVideo\n ? file.type.startsWith('video/')\n : file.type.startsWith('image/')\n if (accepted) {\n const key = el.dataset.ohwKey ?? ''\n const { name, type: mimeType } = file\n const r = el.getBoundingClientRect()\n const rect = { top: r.top, left: r.left, width: r.width, height: r.height }\n // File byte content does not survive postMessage structured-clone — read it first\n // then transfer the ArrayBuffer directly (which is a proper Transferable).\n file.arrayBuffer().then((buf) => {\n window.parent.postMessage({ type: 'ow:image-drop', key, name, mimeType, buf, rect }, '*', [buf])\n })\n } else {\n postToParentRef.current({ type: 'ow:image-drop-invalid', expected: wantsVideo ? 'video' : 'image' })\n }\n }\n dragOverElRef.current = null\n hoveredImageRef.current = null\n resumeAnimTracks()\n clearImageHover()\n }\n\n const handleImageUrl = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:image-url') return\n const { key, url } = e.data as { key: string; url: string }\n let notified = false\n const notify = () => {\n if (notified) return\n notified = true\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${key}\"]`).forEach((el) => {\n const track = el.closest<HTMLElement>('[data-ohw-hover-pause]')\n if (track) {\n uploadLockedTracks.delete(track)\n const stillHovered = hoveredImageRef.current && track.contains(hoveredImageRef.current)\n if (!stillHovered) track.removeAttribute('data-ohw-hover-paused')\n }\n })\n // Reset so the next probe re-fires the hover for this element.\n hoveredImageRef.current = null\n // The replacement has decoded — start the fade-out. Previously this told the parent\n // (`ow:image-loaded`) so it could dissolve an overlay it owned; the overlay is ours now.\n // The skeleton is removed on fade completion, not here, so it dissolves rather than pops.\n setUploadingRects((prev) => {\n const entry = prev[key]\n if (!entry || entry.fadingOut) return prev\n return { ...prev, [key]: { ...entry, fadingOut: true } }\n })\n }\n let found = false\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${key}\"]`).forEach((el) => {\n const track = el.closest<HTMLElement>('[data-ohw-hover-pause]')\n if (track) {\n track.setAttribute('data-ohw-hover-paused', '')\n }\n if (el.dataset.ohwEditable === 'bg-image') {\n found = true\n const fadeTarget = el\n const preload = new Image()\n preload.onload = () => fadeInBgImage(fadeTarget, url, notify)\n preload.onerror = () => {\n fadeTarget.style.backgroundImage = `url('${url}')`\n notify()\n }\n preload.src = url\n } else if (el.dataset.ohwEditable === 'image') {\n const img = el instanceof HTMLImageElement ? el : el.querySelector<HTMLImageElement>('img')\n if (img) {\n found = true\n img.style.opacity = '0'\n const onReady = () => {\n img.onload = null\n img.onerror = null\n fadeInImageElement(img, notify)\n }\n img.onload = onReady\n img.onerror = onReady\n applyEditableImageSrc(img, url)\n if (img.complete && img.naturalWidth > 0) {\n requestAnimationFrame(() => onReady())\n }\n }\n } else if (el.dataset.ohwEditable === 'video') {\n const video = getVideoEl(el)\n if (video) {\n found = true\n // No opacity fade here: a video has no decoded frame to cross-fade into until\n // `loadeddata`, so swap the source and report ready once the first frame exists.\n const onReady = () => {\n video.onloadeddata = null\n video.onerror = null\n notify()\n }\n video.onloadeddata = onReady\n video.onerror = onReady\n applyVideoSrc(video, url)\n }\n }\n })\n if (!found) notify()\n }\n\n const handlePaste = (e: ClipboardEvent) => {\n const el = (e.target as HTMLElement).closest<HTMLElement>('[data-ohw-editable]')\n if (!el) return\n e.preventDefault()\n const text = e.clipboardData?.getData('text/plain') ?? ''\n const maxLen = el.dataset.ohwMaxLength ? parseInt(el.dataset.ohwMaxLength, 10) : null\n if (maxLen) {\n const current = el.innerText.replace(/\\n$/, '').length\n const remaining = Math.max(0, maxLen - current)\n document.execCommand('insertText', false, text.slice(0, remaining))\n } else {\n document.execCommand('insertText', false, text)\n }\n }\n\n const handleInput = (e: Event) => {\n const el = e.target as HTMLElement\n const key = el.dataset.ohwKey\n if (!key) return\n\n if (el === activeElRef.current) setToolbarRect(getEditMeasureEl(el).getBoundingClientRect())\n\n const maxLen = el.dataset.ohwMaxLength ? parseInt(el.dataset.ohwMaxLength, 10) : null\n if (maxLen) {\n const current = el.innerText.replace(/\\n$/, '').length\n if (current > maxLen) {\n const sel = window.getSelection()\n const range = sel?.getRangeAt(0)\n const offset = range?.startOffset ?? 0\n el.innerText = el.innerText.replace(/\\n$/, '').slice(0, maxLen)\n const textNode = el.firstChild\n if (textNode && sel && range) {\n const newRange = document.createRange()\n newRange.setStart(textNode, Math.min(offset - (current - maxLen), maxLen))\n newRange.collapse(true)\n sel.removeAllRanges()\n sel.addRange(newRange)\n }\n }\n setMaxBadge({ rect: el.getBoundingClientRect(), current: Math.min(current, maxLen), max: maxLen })\n }\n\n const html = sanitizeHtml(el.innerHTML)\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${key}\"]`).forEach((sibling) => {\n if (sibling !== el) sibling.innerHTML = html\n })\n\n const timers = autoSaveTimers.current\n const existing = timers.get(key)\n if (existing) clearTimeout(existing)\n timers.set(key, setTimeout(() => {\n timers.delete(key)\n postToParentRef.current({ type: 'ow:change', nodes: [{ key, text: html }] })\n // Re-measure height after content changes (Enter key etc. may grow the page)\n const h = document.documentElement.scrollHeight\n if (h > 50) postToParentRef.current({ type: 'ow:height', height: h })\n }, 400))\n }\n\n const handleHydrate = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:hydrate') return\n const content = e.data.content as Record<string, string> | undefined\n if (!content) return\n let sectionsJson: string | null = null\n for (const [key, val] of Object.entries(content)) {\n if (key === '__ohw_sections') {\n sectionsJson = val\n continue\n }\n if (applyVideoSettingNode(key, val)) continue\n if (applyCarouselNode(key, val)) continue\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${key}\"]`).forEach((el) => {\n if (el.dataset.ohwEditable === 'image') {\n const img = el instanceof HTMLImageElement ? el : el.querySelector<HTMLImageElement>('img')\n if (img) applyEditableImageSrc(img, val)\n } else if (el.dataset.ohwEditable === 'bg-image') {\n el.style.backgroundImage = `url('${val}')`\n } else if (el.dataset.ohwEditable === 'video') {\n const video = getVideoEl(el)\n if (video && video.src !== val) applyVideoSrc(video, val)\n } else if (el.dataset.ohwEditable === 'link') {\n applyLinkHref(el, val)\n } else {\n el.innerHTML = val\n }\n })\n applyLinkByKey(key, val)\n }\n if (sectionsJson) {\n initSectionsFromContent({ __ohw_sections: sectionsJson }, true)\n sectionsLoadedRef.current = true\n pendingScheduleConfigRequests.current.splice(0).forEach(processConfigRequest)\n }\n editContentRef.current = { ...editContentRef.current, ...content }\n reconcileNavbarItemsFromContent(editContentRef.current)\n syncNavigationDragCursorAttrs()\n enforceLinkHrefs()\n postToParentRef.current({ type: 'ow:hydrate-done' })\n }\n\n window.addEventListener('message', handleHydrate)\n\n const handleDeactivate = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:deactivate') return\n if (Date.now() < linkPopoverGraceUntilRef.current) return\n if (document.querySelector('[data-ohw-section-picker]')) return\n if (linkPopoverOpenRef.current) {\n setLinkPopoverRef.current(null)\n return\n }\n deselectRef.current()\n deactivateRef.current()\n }\n window.addEventListener('message', handleDeactivate)\n\n const handleUiEscape = (e: MessageEvent) => {\n if (e.data?.type !== 'ui:escape') return\n if (linkPopoverOpenRef.current) {\n setLinkPopoverRef.current(null)\n return\n }\n // Parent forwards Escape when focus is outside the iframe — mirror handleKeyDown climb.\n if (activeElRef.current) {\n const hrefCtx = getHrefKeyFromElement(activeElRef.current)\n const navAnchor = hrefCtx ? getNavigationItemAnchor(hrefCtx.anchor) : null\n if (navAnchor) {\n const el = activeElRef.current\n if (originalContentRef.current !== null) {\n el.innerHTML = originalContentRef.current\n }\n el.removeAttribute('contenteditable')\n el.removeAttribute('data-ohw-editing')\n activeElRef.current = null\n setMaxBadge(null)\n setActiveCommands(new Set())\n setToolbarShowEditLink(false)\n postToParentRef.current({ type: 'ow:exit-edit' })\n reselectNavigationItemRef.current(navAnchor)\n return\n }\n if (originalContentRef.current !== null) {\n activeElRef.current.innerHTML = originalContentRef.current\n const key = activeElRef.current.dataset.ohwKey\n if (key) {\n postToParentRef.current({ type: 'ow:change', nodes: [{ key, text: originalContentRef.current }] })\n }\n }\n deselectRef.current()\n deactivateRef.current()\n return\n }\n if (selectedElRef.current) {\n if (toolbarVariantRef.current === 'select-frame') {\n deselectRef.current()\n return\n }\n const parent = getNavigationSelectionParent(selectedElRef.current)\n if (parent && isNavigationContainer(parent)) {\n selectFrameRef.current(parent)\n } else {\n deselectRef.current()\n }\n }\n }\n window.addEventListener('message', handleUiEscape)\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && document.querySelector('[data-ohw-section-picker]')) return\n if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'a' && activeElRef.current) {\n const navAnchor = getNavigationItemAnchor(activeElRef.current)\n if (navAnchor) {\n e.preventDefault()\n selectAllTextInEditable(activeElRef.current)\n refreshActiveCommandsRef.current()\n return\n }\n }\n if (e.key === 'Escape' && linkPopoverOpenRef.current) {\n setLinkPopoverRef.current(null)\n return\n }\n if (e.key === 'Escape' && selectedElRef.current && !activeElRef.current) {\n // Already on a container frame → Escape deselects (don't climb to nav-root).\n if (toolbarVariantRef.current === 'select-frame') {\n deselectRef.current()\n return\n }\n const parent = getNavigationSelectionParent(selectedElRef.current)\n if (parent && isNavigationContainer(parent)) {\n e.preventDefault()\n selectFrameRef.current(parent)\n } else {\n deselectRef.current()\n }\n return\n }\n if (e.key === 'Escape' && activeElRef.current) {\n const hrefCtx = getHrefKeyFromElement(activeElRef.current)\n const navAnchor = hrefCtx ? getNavigationItemAnchor(hrefCtx.anchor) : null\n if (navAnchor) {\n e.preventDefault()\n const el = activeElRef.current\n if (originalContentRef.current !== null) {\n el.innerHTML = originalContentRef.current\n }\n el.removeAttribute('contenteditable')\n el.removeAttribute('data-ohw-editing')\n activeElRef.current = null\n setMaxBadge(null)\n setActiveCommands(new Set())\n setToolbarShowEditLink(false)\n postToParentRef.current({ type: 'ow:exit-edit' })\n reselectNavigationItemRef.current(navAnchor)\n return\n }\n }\n if (e.key === 'Enter' && !e.shiftKey && activeElRef.current) {\n const navAnchor = getNavigationItemAnchor(activeElRef.current)\n if (navAnchor) {\n e.preventDefault()\n commitNavigationTextEditRef.current(navAnchor)\n return\n }\n }\n if (e.key !== 'Escape') return\n const el = activeElRef.current\n if (el && originalContentRef.current !== null) {\n el.innerHTML = originalContentRef.current\n const key = el.dataset.ohwKey\n if (key) {\n postToParentRef.current({ type: 'ow:change', nodes: [{ key, text: originalContentRef.current }] })\n }\n }\n deselectRef.current()\n deactivateRef.current()\n }\n\n const handleScroll = () => {\n const focusEl = activeElRef.current ?? selectedElRef.current\n if (focusEl) {\n const measureEl = activeElRef.current ? getEditMeasureEl(activeElRef.current) : focusEl\n const r = measureEl.getBoundingClientRect()\n applyToolbarPos(r)\n setToolbarRect(r)\n setMaxBadge((prev) => (prev && activeElRef.current ? { ...prev, rect: r } : prev))\n }\n if (activeStateElRef.current) {\n const rect = activeStateElRef.current.getBoundingClientRect()\n setToggleState((prev) => (prev ? { ...prev, rect } : null))\n }\n if (hoveredItemElRef.current) {\n setHoveredItemRect(hoveredItemElRef.current.getBoundingClientRect())\n }\n if (hoveredNavContainerRef.current) {\n setHoveredNavContainerRect(hoveredNavContainerRef.current.getBoundingClientRect())\n }\n if (siblingHintElRef.current) {\n setSiblingHintRect(siblingHintElRef.current.getBoundingClientRect())\n }\n const selected = selectedElRef.current\n if (selected && !footerDragRef.current && !navDragRef.current) {\n if (\n selected.hasAttribute('data-ohw-footer-col') ||\n Boolean(selected.closest('footer') && isInferredFooterGroup(selected))\n ) {\n setSiblingHintRects(\n listFooterColumns()\n .filter((column) => column !== selected)\n .map((column) => column.getBoundingClientRect())\n )\n } else if (isNavigationItem(selected)) {\n setSiblingHintRects(collectNavigationItemSiblingHintRects(selected))\n }\n }\n if (footerDragRef.current) {\n const session = footerDragRef.current\n const slot = session.kind === 'link' && session.hrefKey ? hitTestLinkDropSlot(session.lastClientX, session.lastClientY, session.hrefKey) : hitTestColumnDropSlot(session.lastClientX, session.lastClientY)\n refreshFooterDragVisualsRef.current(session, slot, session.lastClientX, session.lastClientY)\n }\n if (navDragRef.current) {\n const session = navDragRef.current\n const slot = hitTestNavDropSlot(session.lastClientX, session.lastClientY, session.hrefKey)\n refreshNavDragVisualsRef.current(session, slot, session.lastClientX, session.lastClientY)\n }\n if (hoveredImageRef.current) {\n const el = hoveredImageRef.current\n const r = el.getBoundingClientRect()\n // Keeps the overlay glued to the element while the parent scrolls. In-document this is\n // a plain state update — no rect has to survive a postMessage hop to stay in sync.\n setMediaHover((prev) =>\n prev\n ? { ...prev, rect: { top: r.top, left: r.left, width: r.width, height: r.height } }\n : prev,\n )\n }\n }\n\n const handleSave = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:save') return\n const nodes = collectEditableNodes(editContentRef.current)\n const tracker = document.querySelector('[data-ohw-sections-tracker]')\n if (tracker?.textContent) nodes.push({ key: '__ohw_sections', type: 'sections', text: tracker.textContent })\n postToParentRef.current({ type: 'ow:save-result', nodes })\n }\n\n const handleInsertSection = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:insert-section') return\n const { widgetType, insertAfter, insertBefore } = e.data as {\n widgetType: string\n insertAfter: string\n insertBefore?: string | null\n }\n if (widgetType !== 'scheduling') return\n const inserted = mountSchedulingWidget(insertAfter, true, undefined, insertBefore ?? null)\n if (inserted) {\n const tracker = getSectionsTracker()\n postToParentRef.current({ type: 'ow:change', nodes: [{ key: '__ohw_sections', text: tracker.textContent ?? '[]' }] })\n const h = document.documentElement.scrollHeight\n if (h > 50) postToParentRef.current({ type: 'ow:height', height: h })\n }\n }\n\n const handleSwitchSchedule = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:switch-schedule') return\n const scheduleId = e.data.scheduleId as string | undefined\n const insertAfter = e.data.insertAfter as string | undefined\n if (!scheduleId || !insertAfter) return\n const text = updateSectionScheduleId(insertAfter, scheduleId)\n postToParentRef.current({ type: 'ow:change', nodes: [{ key: '__ohw_sections', text }] })\n }\n\n const handleScheduleLinked = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:schedule-linked') return\n const scheduleId = e.data.scheduleId as string | undefined\n const insertAfter = e.data.insertAfter as string | undefined\n if (!scheduleId || !insertAfter) return\n const text = updateSectionScheduleId(insertAfter, scheduleId)\n postToParentRef.current({ type: 'ow:change', nodes: [{ key: '__ohw_sections', text }] })\n }\n\n const handleClearSchedulingWidget = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:clear-scheduling-widget') return\n const insertAfter = e.data.insertAfter as string | undefined\n if (!insertAfter) return\n const text = updateSectionScheduleId(insertAfter, null)\n postToParentRef.current({ type: 'ow:change', nodes: [{ key: '__ohw_sections', text }] })\n }\n\n const handleRemoveSchedulingSection = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:remove-scheduling-section') return\n document.querySelectorAll<HTMLElement>('[data-ohw-section-container=\"scheduling\"]').forEach((el) => {\n el.remove()\n })\n const tracker = getSectionsTracker()\n let sections: InsertedSection[] = []\n try { sections = JSON.parse(tracker.textContent || '[]') } catch { /* ignore */ }\n const currentPath = window.location.pathname\n const updated = sections.filter((s) => !(s.type === 'scheduling' && s.pagePath === currentPath))\n tracker.textContent = JSON.stringify(updated)\n postToParentRef.current({ type: 'ow:change', nodes: [{ key: '__ohw_sections', text: tracker.textContent }] })\n const h = document.documentElement.scrollHeight\n if (h > 50) postToParentRef.current({ type: 'ow:height', height: h })\n }\n\n let selectionChangeRaf: number | null = null\n const runSelectionChange = () => {\n selectionChangeRaf = null\n const activeRoot = activeElRef.current\n if (!activeRoot) return\n\n const startEl = resolveSelectionStartElement(window.getSelection())\n const next = startEl ? detectActiveFormats(startEl, activeRoot) : new Set<string>()\n\n // A fresh Set is always a new reference — bail out via the updater form when the\n // content hasn't actually changed so this doesn't force a re-render on every\n // selectionchange (which fires continuously during a drag-select).\n setActiveCommands((prev) => (setsEqual(prev, next) ? prev : next))\n }\n // selectionchange fires on every extension of a drag-select (once per unit of text\n // crossed). Some browsers visibly drop the in-progress selection highlight if\n // document.queryCommandState is called while the Range is still being extended by a\n // held-down drag — so beyond throttling, skip entirely while the pointer is down and\n // only refresh once the gesture settles (pointerup / any other trigger).\n const handleSelectionChange = () => {\n if (pointerHeldRef.current) return\n if (selectionChangeRaf !== null) return\n selectionChangeRaf = requestAnimationFrame(runSelectionChange)\n }\n const markPointerHeld = (e: PointerEvent) => {\n if (e.button !== 0) return\n pointerHeldRef.current = true\n }\n const markPointerReleased = () => {\n if (!pointerHeldRef.current) return\n pointerHeldRef.current = false\n handleSelectionChange()\n }\n\n refreshActiveCommandsRef.current = runSelectionChange\n\n // Cursor left the iframe entirely — drop the overlay.\n //\n // This used to deliberately NOT clear, because the Replace button lived in the parent: moving\n // the cursor toward it meant *leaving* this document, so clearing here made the overlay\n // flicker out from under the user. The button now lives in this document, so reaching for it\n // never triggers a mouseleave, and clearing on a genuine exit is both safe and correct.\n const handleDocMouseLeave = () => {\n hoveredImageRef.current = null\n setMediaHover(null)\n // The carousel overlay is driven by mousemove inside this document; once the pointer leaves\n // the iframe no further moves arrive, so it must be cleared here or it stays stuck on.\n setCarouselHover(null)\n document.querySelectorAll<HTMLElement>('[data-ohw-state-hovered]').forEach(el => el.removeAttribute('data-ohw-state-hovered'))\n document.querySelectorAll<HTMLElement>('[data-ohw-hovered]').forEach(el => el.removeAttribute('data-ohw-hovered'))\n activeStateElRef.current = null\n setToggleState(null)\n }\n\n // Replaces `ow:anim-lock`. The parent owns the authenticated upload, so it is the only side\n // that knows an upload is in flight — but the skeleton and the animation lock are now this\n // document's business, so it just reports the fact and we react to it.\n // `uploading: false` is only sent on FAILURE; on success the skeleton is cleared by\n // handleImageUrl once the replacement media has actually loaded.\n const handleImageUploading = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:image-uploading') return\n const { key, uploading } = e.data as { key: string; uploading: boolean }\n\n setUploadingRects((prev) => {\n if (!uploading) {\n if (!(key in prev)) return prev\n const next = { ...prev }\n delete next[key]\n return next\n }\n const el = document.querySelector<HTMLElement>(`[data-ohw-key=\"${key}\"]`)\n if (!el) return prev\n const r = getVisibleRect(el)\n return {\n ...prev,\n [key]: { rect: { top: r.top, left: r.left, width: r.width, height: r.height } },\n }\n })\n\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${key}\"]`).forEach((el) => {\n const track = el.closest<HTMLElement>('[data-ohw-hover-pause]')\n if (!track) return\n if (uploading) {\n uploadLockedTracks.add(track)\n track.setAttribute('data-ohw-hover-paused', '')\n } else {\n uploadLockedTracks.delete(track)\n track.removeAttribute('data-ohw-hover-paused')\n }\n })\n }\n\n const handleCanvasHeight = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:canvas-height' || typeof e.data.height !== 'number') return\n document.documentElement.style.setProperty('--ohw-canvas-h', `${e.data.height}px`)\n }\n\n // Parent's gallery modal edited the slide array → reflect it live (React re-renders the\n // carousel) and keep editContentRef in sync so a full save carries the new value.\n const handleCarouselChange = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:carousel-change') return\n const { key, images } = e.data as { key: string; images: CarouselSlide[] }\n if (!key || !Array.isArray(images)) return\n const text = JSON.stringify(images)\n applyCarouselValue(key, images)\n editContentRef.current = { ...editContentRef.current, [key]: text }\n // Persist through the same channel as every other edit: the parent's ow:change handler\n // writes it to the draft (as one JSON node) and batches the save.\n postToParentRef.current({ type: 'ow:change', nodes: [{ key, text }] })\n // The container's box can change (add/delete grows/shrinks the thumbnail rail), so drop\n // the stale hover rect; it re-derives on the next pointer move.\n setCarouselHover(null)\n }\n\n // Show the \"Edit gallery\" button whenever the pointer is over a carousel container. Must use\n // a bbox hit-test on coordinates (not e.target/closest): edit-mode CSS toggles pointer-events,\n // so e.target is unreliable — the same reason the media path uses findImageAtPoint. Iterate in\n // reverse so a nested carousel wins over an ancestor.\n const findCarouselAtPoint = (clientX: number, clientY: number): HTMLElement | null => {\n const containers = Array.from(document.querySelectorAll<HTMLElement>(`[${CAROUSEL_ATTR}]`))\n for (let i = containers.length - 1; i >= 0; i--) {\n const r = containers[i].getBoundingClientRect()\n if (clientX >= r.left && clientX <= r.right && clientY >= r.top && clientY <= r.bottom) {\n return containers[i]\n }\n }\n return null\n }\n\n // Editable elements (the carousel's static overlay text: wordmark, logo, tagline) sit on top\n // of the carousel. When the pointer is over one, hide the gallery overlay so that text stays\n // hoverable/editable. Scoped to the carousel's section and bbox-tested for the same\n // pointer-events reason as above.\n const isPointOverEditable = (scope: HTMLElement, clientX: number, clientY: number): boolean => {\n const editables = scope.querySelectorAll<HTMLElement>('[data-ohw-editable], [data-ohw-href-key]')\n for (const el of editables) {\n const r = el.getBoundingClientRect()\n if (clientX >= r.left && clientX <= r.right && clientY >= r.top && clientY <= r.bottom) return true\n }\n return false\n }\n\n const handleCarouselHover = (e: MouseEvent) => {\n const container = findCarouselAtPoint(e.clientX, e.clientY)\n const scope = container?.closest<HTMLElement>('[data-ohw-section]') ?? container?.parentElement ?? null\n if (!container || !scope || isPointOverEditable(scope, e.clientX, e.clientY)) {\n setCarouselHover((prev) => (prev ? null : prev))\n return\n }\n const key = container.getAttribute('data-ohw-key') ?? ''\n if (!key) return\n const r = getVisibleRect(container)\n setCarouselHover((prev) =>\n prev &&\n prev.key === key &&\n prev.rect.top === r.top &&\n prev.rect.left === r.left &&\n prev.rect.width === r.width &&\n prev.rect.height === r.height\n ? prev\n : { key, rect: { top: r.top, left: r.left, width: r.width, height: r.height } }\n )\n }\n\n // Direct DOM update — no React re-render, no frame delay\n const applyToolbarPos = (rect: DOMRect) => {\n const ps = parentScrollRef.current\n const measuredW = toolbarElRef.current?.offsetWidth || 330\n if (toolbarElRef.current) {\n const { top, left, transform } = calcToolbarPos(rect, ps, measuredW)\n toolbarElRef.current.style.top = `${top}px`\n toolbarElRef.current.style.left = `${left}px`\n toolbarElRef.current.style.transform = transform\n }\n if (glowElRef.current) {\n const GAP = SELECTION_CHROME_GAP\n glowElRef.current.style.top = `${rect.top - GAP}px`\n glowElRef.current.style.left = `${rect.left - GAP}px`\n glowElRef.current.style.width = `${rect.width + GAP * 2}px`\n glowElRef.current.style.height = `${rect.height + GAP * 2}px`\n }\n }\n\n const handleParentScroll = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:parent-scroll') return\n const { iframeOffsetTop, headerH, canvasH } = e.data as { iframeOffsetTop: number; headerH: number; canvasH: number }\n parentScrollRef.current = { iframeOffsetTop, headerH, canvasH }\n if (visibleViewportRef.current) {\n applyVisibleViewport(visibleViewportRef.current, parentScrollRef.current)\n }\n const focusEl = activeElRef.current ?? selectedElRef.current\n if (focusEl) {\n const measureEl = activeElRef.current ? getEditMeasureEl(activeElRef.current) : focusEl\n applyToolbarPos(measureEl.getBoundingClientRect())\n }\n }\n\n // ow:click-at — parent frame proxies a click it caught on the state-card image overlay\n // (cross-origin iframes don't forward pointer events into the iframe document, so we use\n // postMessage to bridge the gap)\n const handleClickAt = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:click-at') return\n const { clientX, clientY } = e.data as { clientX: number; clientY: number }\n\n // Check state card images by bbox (pointer-events:none, so can't be a native click target)\n const allImages = Array.from(\n document.querySelectorAll<HTMLElement>(MEDIA_SELECTOR)\n ).filter(el => !!el.closest('[data-ohw-editable-state]'))\n\n const stateCardImage = allImages.find((el) => {\n const ownerCard = el.closest<HTMLElement>('[data-ohw-editable-state]')\n if (ownerCard) {\n const inHoverState = ownerCard.getAttribute('data-ohw-active-state') === 'hover'\n const elState = el.dataset.ohwState\n if (el === ownerCard && inHoverState) return false\n if (elState === 'default' && inHoverState) return false\n if (elState === 'hover' && !inHoverState) return false\n }\n const r = el.getBoundingClientRect()\n return clientX >= r.left && clientX <= r.right && clientY >= r.top && clientY <= r.bottom\n })\n\n if (stateCardImage) {\n postToParentRef.current({ type: 'ow:image-pick', key: stateCardImage.dataset.ohwKey ?? '', elementType: stateCardImage.dataset.ohwEditable ?? 'image' })\n return\n }\n\n // Check text editables by bbox\n const textEditable = Array.from(\n document.querySelectorAll<HTMLElement>(NON_MEDIA_SELECTOR)\n ).find((el) => {\n const r = el.getBoundingClientRect()\n return clientX >= r.left && clientX <= r.right && clientY >= r.top && clientY <= r.bottom\n })\n\n if (textEditable) {\n const hrefCtx = getHrefKeyFromElement(textEditable)\n const navAnchor = hrefCtx ? getNavigationItemAnchor(hrefCtx.anchor) : null\n if (navAnchor) {\n if (selectedElRef.current === navAnchor) {\n activateRef.current(textEditable, { caretX: clientX, caretY: clientY })\n } else {\n selectRef.current(navAnchor)\n }\n return\n }\n activateRef.current(textEditable, { caretX: clientX, caretY: clientY })\n return\n }\n\n const navContainer = document.querySelector<HTMLElement>('[data-ohw-nav-container]')\n if (navContainer) {\n const r = navContainer.getBoundingClientRect()\n const pad = 8\n const over =\n clientX >= r.left - pad &&\n clientX <= r.right + pad &&\n clientY >= r.top - pad &&\n clientY <= r.bottom + pad\n if (over && !isPointOverNavItem(navContainer, clientX, clientY)) {\n selectFrameRef.current(navContainer)\n return\n }\n }\n\n // Empty nav-root padding → still select the links frame\n const navRoot = document.querySelector<HTMLElement>('[data-ohw-nav-root]')\n if (navRoot && navContainer) {\n const rr = navRoot.getBoundingClientRect()\n if (\n clientX >= rr.left &&\n clientX <= rr.right &&\n clientY >= rr.top &&\n clientY <= rr.bottom &&\n !isPointOverNavItem(navContainer, clientX, clientY)\n ) {\n const book = navRoot.querySelector('[data-ohw-role=\"navbar-button\"]')\n if (book) {\n const br = book.getBoundingClientRect()\n if (clientX >= br.left && clientX <= br.right && clientY >= br.top && clientY <= br.bottom) {\n deactivateRef.current()\n return\n }\n }\n selectFrameRef.current(navContainer)\n return\n }\n }\n\n const footerColumn = findHoveredNavOrFooterContainer(clientX, clientY)\n if (\n footerColumn?.hasAttribute('data-ohw-footer-col') ||\n footerColumn?.hasAttribute('data-ohw-footer-column')\n ) {\n selectFrameRef.current(footerColumn)\n return\n }\n\n deactivateRef.current()\n }\n\n window.addEventListener('message', handleSave)\n window.addEventListener('message', handleInsertSection)\n window.addEventListener('message', handleSwitchSchedule)\n window.addEventListener('message', handleScheduleLinked)\n window.addEventListener('message', handleClearSchedulingWidget)\n window.addEventListener('message', handleRemoveSchedulingSection)\n window.addEventListener('message', handleImageUrl)\n window.addEventListener('message', handleImageUploading)\n window.addEventListener('message', handleCarouselChange)\n window.addEventListener('message', handleCanvasHeight)\n window.addEventListener('message', handleParentScroll)\n window.addEventListener('message', handlePointerSync)\n window.addEventListener('message', handleClickAt)\n const handleViewportResize = () => {\n if (visibleViewportRef.current) {\n applyVisibleViewport(visibleViewportRef.current, parentScrollRef.current)\n }\n }\n window.addEventListener('resize', handleViewportResize, { passive: true })\n document.addEventListener('click', handleClick, true)\n document.addEventListener('dblclick', handleDblClick, true)\n document.addEventListener('paste', handlePaste, true)\n document.addEventListener('input', handleInput, true)\n document.addEventListener('mouseover', handleMouseOver, true)\n document.addEventListener('mouseout', handleMouseOut, true)\n document.addEventListener('mousemove', handleMouseMove, true)\n document.addEventListener('mousemove', handleCarouselHover, true)\n document.addEventListener('mouseleave', handleDocMouseLeave)\n document.addEventListener('dragover', handleDragOver, true)\n document.addEventListener('dragleave', handleDragLeave, true)\n document.addEventListener('drop', handleDrop, true)\n document.addEventListener('keydown', handleKeyDown)\n document.addEventListener('selectionchange', handleSelectionChange)\n // document.addEventListener('pointerdown', markPointerHeld)\n // document.addEventListener('pointerup', markPointerReleased)\n // document.addEventListener('pointercancel', markPointerReleased)\n window.addEventListener('scroll', handleScroll, true)\n\n return () => {\n document.removeEventListener('click', handleClick, true)\n document.removeEventListener('dblclick', handleDblClick, true)\n document.removeEventListener('paste', handlePaste, true)\n document.removeEventListener('input', handleInput, true)\n document.removeEventListener('mouseover', handleMouseOver, true)\n document.removeEventListener('mouseout', handleMouseOut, true)\n document.removeEventListener('mousemove', handleMouseMove, true)\n document.removeEventListener('mousemove', handleCarouselHover, true)\n document.removeEventListener('mouseleave', handleDocMouseLeave)\n document.removeEventListener('dragover', handleDragOver, true)\n document.removeEventListener('dragleave', handleDragLeave, true)\n document.removeEventListener('drop', handleDrop, true)\n document.removeEventListener('keydown', handleKeyDown)\n document.removeEventListener('selectionchange', handleSelectionChange)\n // document.removeEventListener('pointerdown', markPointerHeld)\n // document.removeEventListener('pointerup', markPointerReleased)\n // document.removeEventListener('pointercancel', markPointerReleased)\n // if (selectionChangeRaf !== null) cancelAnimationFrame(selectionChangeRaf)\n window.removeEventListener('scroll', handleScroll, true)\n window.removeEventListener('message', handleSave)\n window.removeEventListener('message', handleInsertSection)\n window.removeEventListener('message', handleSwitchSchedule)\n window.removeEventListener('message', handleScheduleLinked)\n window.removeEventListener('message', handleClearSchedulingWidget)\n window.removeEventListener('message', handleRemoveSchedulingSection)\n window.removeEventListener('message', handleImageUrl)\n window.removeEventListener('message', handleImageUploading)\n window.removeEventListener('message', handleCarouselChange)\n window.removeEventListener('message', handleCanvasHeight)\n window.removeEventListener('message', handleParentScroll)\n window.removeEventListener('resize', handleViewportResize)\n window.removeEventListener('message', handlePointerSync)\n window.removeEventListener('message', handleClickAt)\n window.removeEventListener('message', handleHydrate)\n window.removeEventListener('message', handleDeactivate)\n window.removeEventListener('message', handleUiEscape)\n autoSaveTimers.current.forEach(clearTimeout)\n autoSaveTimers.current.clear()\n if (imageUnhoverTimerRef.current) clearTimeout(imageUnhoverTimerRef.current)\n if (imageShowTimerRef.current) clearTimeout(imageShowTimerRef.current)\n }\n }, [isEditMode, refreshStateRules])\n\n // Footer DnD — OHH-436\n // Native <a> drag steals clicks. Force draggable=false; reorder via drag-handle (HTML5)\n // or press-to-drag (pointer, any selection/edit/popover state). Click without movement\n // still selects / edits text.\n useEffect(() => {\n if (!isEditMode) return\n const THRESHOLD = 10\n\n const resolveWasSelected = (el: HTMLElement) => {\n if (selectedElRef.current === el) return true\n const activeAnchor = activeElRef.current ? getNavigationItemAnchor(activeElRef.current) : null\n return activeAnchor === el\n }\n\n const onPointerDown = (e: PointerEvent) => {\n if (e.button !== 0) return\n // A real drag often never produces a trailing click (browser cancels it after\n // movement). Clear any leftover suppress so this new gesture's click works —\n // including clicks on the selected-item drag surface (early-return below).\n if (\n suppressNextClickRef.current &&\n Date.now() >= suppressClickUntilRef.current &&\n !footerDragRef.current &&\n !footerPointerDragRef.current?.started\n ) {\n suppressNextClickRef.current = false\n }\n if (footerDragRef.current) return\n const target = e.target as HTMLElement | null\n if (!target) return\n if (target.closest('[data-ohw-drag-handle-container], [data-slot=\"drag-handle\"], [data-ohw-toolbar], [data-ohw-item-toolbar-anchor], [data-ohw-link-popover-root]')) {\n return\n }\n // Selected-item chrome already arms press-to-drag via onItemPointerDown.\n if (target.closest('[data-ohw-item-drag-surface]')) return\n\n const anchor = getNavigationItemAnchor(target)\n const hrefKey = anchor?.getAttribute('data-ohw-href-key') ?? null\n if (anchor && isFooterHrefKey(hrefKey)) {\n footerPointerDragRef.current = {\n el: anchor,\n kind: 'link',\n startX: e.clientX,\n startY: e.clientY,\n pointerId: e.pointerId,\n wasSelected: resolveWasSelected(anchor),\n started: false\n }\n return\n }\n\n const col = target.closest<HTMLElement>('[data-ohw-footer-col]')\n if (col && !getNavigationItemAnchor(target)) {\n footerPointerDragRef.current = {\n el: col,\n kind: 'column',\n startX: e.clientX,\n startY: e.clientY,\n pointerId: e.pointerId,\n wasSelected: resolveWasSelected(col),\n started: false\n }\n }\n }\n\n const onPointerMove = (e: PointerEvent) => {\n const pending = footerPointerDragRef.current\n if (!pending) return\n\n if (pending.started) {\n e.preventDefault()\n clearTextSelection()\n const session = footerDragRef.current\n if (!session) return\n const slot = session.kind === 'link' && session.hrefKey ? hitTestLinkDropSlot(e.clientX, e.clientY, session.hrefKey) : hitTestColumnDropSlot(e.clientX, e.clientY)\n refreshFooterDragVisualsRef.current(session, slot, e.clientX, e.clientY)\n return\n }\n\n const dx = e.clientX - pending.startX\n const dy = e.clientY - pending.startY\n if (dx * dx + dy * dy < THRESHOLD * THRESHOLD) return\n\n e.preventDefault()\n pending.started = true\n armFooterPressDrag()\n clearTextSelection()\n try {\n document.body.setPointerCapture(pending.pointerId)\n } catch {\n /* ignore */\n }\n\n // Leave text-edit / popover so the drag session owns interaction.\n if (linkPopoverOpenRef.current) {\n setLinkPopoverRef.current(null)\n }\n if (activeElRef.current) {\n deactivateRef.current()\n }\n\n if (pending.kind === 'link') {\n const key = pending.el.getAttribute('data-ohw-href-key')\n if (!key) return\n const column = findFooterColumnForLink(pending.el)\n const columns = listFooterColumns()\n beginFooterDragRef.current({\n kind: 'link',\n hrefKey: key,\n columnEl: column,\n sourceColumnIndex: column ? columns.indexOf(column) : 0,\n wasSelected: pending.wasSelected,\n draggedEl: pending.el,\n lastClientX: e.clientX,\n lastClientY: e.clientY,\n activeSlot: null\n })\n return\n }\n\n const columns = listFooterColumns()\n const idx = columns.indexOf(pending.el)\n if (idx < 0) return\n beginFooterDragRef.current({\n kind: 'column',\n hrefKey: null,\n columnEl: pending.el,\n sourceColumnIndex: idx,\n wasSelected: pending.wasSelected,\n draggedEl: pending.el,\n lastClientX: e.clientX,\n lastClientY: e.clientY,\n activeSlot: null\n })\n }\n\n const endPointerDrag = (e: PointerEvent) => {\n const pending = footerPointerDragRef.current\n footerPointerDragRef.current = null\n try {\n if (document.body.hasPointerCapture(e.pointerId)) {\n document.body.releasePointerCapture(e.pointerId)\n }\n } catch {\n /* ignore */\n }\n // No footer/nav press was ever tracked for this gesture (e.g. a plain text\n // drag-select elsewhere) — don't touch selection state at all.\n if (!pending) return\n if (!pending.started) {\n unlockFooterDragInteraction()\n return\n }\n // Only swallow the click when a real drag gesture ran. If the browser skips the\n // trailing click (common after movement), the next pointerdown clears this flag.\n suppressNextClickRef.current = true\n suppressClickUntilRef.current = Date.now() + 500\n commitFooterDragRef.current(e.clientX, e.clientY)\n }\n\n const blockSelectStart = (e: Event) => {\n if (footerDragRef.current || footerPointerDragRef.current?.started || document.documentElement.hasAttribute('data-ohw-footer-press-drag')) {\n e.preventDefault()\n }\n }\n\n const onDragEnd = (_e: DragEvent) => {\n if (!footerDragRef.current) return\n suppressNextClickRef.current = true\n suppressClickUntilRef.current = Date.now() + 500\n commitFooterDragRef.current()\n }\n\n document.addEventListener('pointerdown', onPointerDown, true)\n document.addEventListener('pointermove', onPointerMove, true)\n document.addEventListener('pointerup', endPointerDrag, true)\n document.addEventListener('pointercancel', endPointerDrag, true)\n document.addEventListener('selectstart', blockSelectStart, true)\n document.addEventListener('dragend', onDragEnd, true)\n return () => {\n document.removeEventListener('pointerdown', onPointerDown, true)\n document.removeEventListener('pointermove', onPointerMove, true)\n document.removeEventListener('pointerup', endPointerDrag, true)\n document.removeEventListener('pointercancel', endPointerDrag, true)\n document.removeEventListener('selectstart', blockSelectStart, true)\n document.removeEventListener('dragend', onDragEnd, true)\n unlockFooterDragInteraction()\n }\n }, [isEditMode])\n\n // Reactive handler for ow:request-schedule-config — works in both edit and live-site mode.\n // Responds once sections are loaded; queues early requests until then.\n useEffect(() => {\n const handler = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:request-schedule-config') return\n const insertAfterVal = e.data.insertAfter as string | undefined\n if (!insertAfterVal) return\n if (!sectionsLoadedRef.current) {\n if (!pendingScheduleConfigRequests.current.includes(insertAfterVal)) {\n pendingScheduleConfigRequests.current.push(insertAfterVal)\n }\n return\n }\n processConfigRequest(insertAfterVal)\n }\n window.addEventListener('message', handler)\n return () => window.removeEventListener('message', handler)\n }, [processConfigRequest])\n\n // On route change: refresh hover CSS, reset card state, notify parent\n useEffect(() => {\n if (!isEditMode) return\n\n document.querySelectorAll('[data-ohw-active-state]').forEach((el) => {\n el.removeAttribute('data-ohw-active-state')\n })\n resetStateViews()\n document.querySelectorAll<HTMLElement>('[data-ohw-editable-state]').forEach((el) => {\n if (el.querySelector('[data-ohw-state-view]')) applyStateViews(el, 'default')\n })\n activeStateElRef.current = null\n setToggleState(null)\n refreshStateRules()\n\n const raf = requestAnimationFrame(() => refreshStateRules())\n const timer = setTimeout(() => {\n refreshStateRules()\n const sections = collectSections()\n setSectionsByPath((prev) => {\n const pathKey = normalizePath(pathname)\n const next = { ...prev, [pathKey]: sections }\n return shouldUseDevFixtures() ? { ...DEV_SECTIONS_BY_PATH, ...next } : next\n })\n postToParent({\n type: 'ow:ready',\n version: '1',\n path: pathname,\n nodes: collectEditableNodes(editContentRef.current),\n sections\n })\n postToParent({ type: 'ow:request-site-pages' })\n }, 150)\n\n return () => {\n cancelAnimationFrame(raf)\n clearTimeout(timer)\n }\n }, [pathname, isEditMode, refreshStateRules, postToParent])\n\n // Scroll to `[data-ohw-section]` matching the URL hash (e.g. /pricing#benefits-marquee).\n useEffect(() => {\n scrollToHashSectionWhenReady()\n const onHashChange = () => scrollToHashSectionWhenReady()\n window.addEventListener('hashchange', onHashChange)\n return () => window.removeEventListener('hashchange', onHashChange)\n }, [pathname])\n\n const handleCommand = useCallback((cmd: string) => {\n const el = activeElRef.current\n // execCommand's DOM surgery (splitting/merging/rewrapping text nodes to apply the\n // format) frequently replaces the very nodes the current selection points into —\n // save the range as character offsets relative to `el` (stable across that surgery)\n // rather than cloning the Range itself (whose node references go stale the instant\n // execCommand swaps them out, silently breaking any attempt to restore from it).\n const selBefore = window.getSelection()\n let savedOffsets: { start: number; end: number } | null = null\n if (el && selBefore && selBefore.rangeCount > 0 && !selBefore.isCollapsed) {\n const r = selBefore.getRangeAt(0)\n if (el.contains(r.commonAncestorContainer)) {\n savedOffsets = {\n start: textOffsetInRoot(el, r.startContainer, r.startOffset),\n end: textOffsetInRoot(el, r.endContainer, r.endOffset),\n }\n }\n }\n\n // Without styleWithCSS, bold/italic/underline apply via <b>/<i>/<u> tags whose UA\n // styling is relative (e.g. <b>'s font-weight: bolder resolves off the CSS2.1 table —\n // a base weight under 400 only reaches 400, an invisible bump on light body text).\n // styleWithCSS makes these commands emit absolute inline styles instead.\n document.execCommand('styleWithCSS', false, true as unknown as string)\n document.execCommand(cmd, false)\n\n // Re-focus only if focus actually moved — redundantly re-focusing an already-focused\n // contenteditable right after execCommand can itself collapse the selection in Chrome.\n if (el && document.activeElement !== el) {\n el.focus()\n }\n\n // If the selection came back collapsed, re-locate the saved offsets in the (now\n // possibly restructured) DOM and rebuild the range around the freshly-formatted text.\n const selAfter = window.getSelection()\n if (el && savedOffsets && selAfter?.isCollapsed) {\n const start = pointAtTextOffset(el, savedOffsets.start)\n const end = pointAtTextOffset(el, savedOffsets.end)\n if (start && end) {\n try {\n const range = document.createRange()\n range.setStart(start.node, start.offset)\n range.setEnd(end.node, end.offset)\n selAfter.removeAllRanges()\n selAfter.addRange(range)\n } catch {\n /* ignore — nothing sane left to restore */\n }\n }\n }\n\n if (el) setToolbarRect(getEditMeasureEl(el).getBoundingClientRect())\n refreshActiveCommandsRef.current()\n }, [])\n\n const handleStateChange = useCallback((state: string) => {\n if (!activeStateElRef.current) return\n const el = activeStateElRef.current\n if (state === 'Default') {\n deactivate()\n el.removeAttribute('data-ohw-active-state')\n applyStateViews(el, 'default')\n } else {\n el.setAttribute('data-ohw-active-state', state.toLowerCase())\n applyStateViews(el, state.toLowerCase())\n }\n setToggleState((prev) => (prev ? { ...prev, activeState: state } : null))\n }, [deactivate])\n\n const closeLinkPopover = useCallback(() => {\n addNavAfterAnchorRef.current = null\n setLinkPopover(null)\n }, [])\n\n const openLinkPopoverForActive = useCallback(() => {\n const hrefCtx = getHrefKeyFromElement(activeElRef.current)\n if (!hrefCtx) return\n bumpLinkPopoverGrace()\n setLinkPopover({\n key: hrefCtx.key,\n mode: 'edit',\n target: getLinkHref(hrefCtx.anchor),\n })\n deactivate()\n }, [deactivate])\n\n const openLinkPopoverForSelected = useCallback(() => {\n const anchor = selectedElRef.current\n if (!anchor) return\n const key = anchor.getAttribute('data-ohw-href-key')\n if (!key) return\n bumpLinkPopoverGrace()\n setLinkPopover({\n key,\n mode: 'edit',\n target: getLinkHref(anchor),\n })\n deselect()\n }, [deselect])\n\n const handleLinkPopoverSubmit = useCallback(\n (target: string) => {\n const session = linkPopoverSessionRef.current\n if (!session) return\n\n if (session.intent === 'add-nav') {\n const trimmed = target.trim()\n let href = trimmed\n let label = 'Untitled'\n if (trimmed) {\n const { pageRoute, sectionId } = parseTarget(trimmed)\n const page = resolvePage(pageRoute, sitePages)\n const pageSections = getSectionsForPath(sectionsByPath, pageRoute)\n const section = sectionId ? pageSections.find((s) => s.id === sectionId) : undefined\n label = section?.label ?? page.title\n href = trimmed\n }\n\n const afterAnchor = addNavAfterAnchorRef.current\n const { anchor, hrefKey, labelKey, index, order } = insertNavbarItem(href, label, afterAnchor)\n applyLinkByKey(hrefKey, href)\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${labelKey}\"]`).forEach((el) => {\n el.textContent = label\n })\n\n const navCount = String(index + 1)\n const orderJson = JSON.stringify(order)\n editContentRef.current = {\n ...editContentRef.current,\n [hrefKey]: href,\n [labelKey]: label,\n [NAV_COUNT_KEY]: navCount,\n [NAV_ORDER_KEY]: orderJson,\n }\n\n postToParent({\n type: 'ow:change',\n nodes: [\n { key: hrefKey, text: href },\n { key: labelKey, text: label },\n { key: NAV_COUNT_KEY, text: navCount },\n { key: NAV_ORDER_KEY, text: orderJson },\n ],\n })\n postToParent({ type: 'ow:toast', title: 'Link added', toastType: 'success' })\n\n addNavAfterAnchorRef.current = null\n setLinkPopover(null)\n enforceLinkHrefs()\n\n requestAnimationFrame(() => {\n selectRef.current(anchor)\n })\n return\n }\n\n const { key } = session\n applyLinkByKey(key, target)\n postToParent({ type: 'ow:change', nodes: [{ key, text: target }] })\n setLinkPopover(null)\n },\n [postToParent, sitePages, sectionsByPath]\n )\n\n const showEditLink = toolbarShowEditLink\n const currentSections = sectionsByPath[pathname] ?? []\n linkPopoverOpenRef.current = linkPopover !== null\n\n const handleMediaReplace = useCallback(\n (key: string) => {\n postToParent({ type: 'ow:image-pick', key, elementType: mediaHover?.elementType ?? 'image' })\n },\n [postToParent, mediaHover?.elementType],\n )\n\n // Ask the parent to open the gallery modal for this carousel, seeded with the current slides.\n // The parent owns the modal + uploads (it holds the editor credentials); it echoes edits back\n // via ow:carousel-change.\n const handleEditCarousel = useCallback(\n (key: string) => {\n postToParent({ type: 'ow:carousel-open', key, images: readCarouselValue(key) })\n },\n [postToParent],\n )\n\n const handleMediaFadeOutComplete = useCallback((key: string) => {\n setUploadingRects((prev) => {\n if (!(key in prev)) return prev\n const next = { ...prev }\n delete next[key]\n return next\n })\n }, [])\n\n /**\n * Autoplay / mute toggles. The `<video>` lives in this document, so this mutates it directly —\n * the old `ow:video-settings` → parent → `ow:video-settings-applied` round-trip existed only\n * because the toggles were rendered in the parent frame, and is now gone. The element's\n * *resulting* state is read back (browsers block autoplay on unmuted video), so the toggles\n * reflect what actually happened, not what was asked for.\n */\n const handleVideoSettingsChange = useCallback(\n (key: string, settings: { autoplay?: boolean; muted?: boolean }) => {\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${key}\"]`).forEach((el) => {\n const video = getVideoEl(el)\n if (!video) return\n\n if (typeof settings.autoplay === 'boolean') video.autoplay = settings.autoplay\n if (typeof settings.muted === 'boolean') video.muted = settings.muted\n syncVideoPlayback(video)\n\n postToParent({\n type: 'ow:change',\n nodes: [\n { key: `${key}${VIDEO_AUTOPLAY_SUFFIX}`, text: String(video.autoplay) },\n { key: `${key}${VIDEO_MUTED_SUFFIX}`, text: String(video.muted) },\n ],\n })\n\n setMediaHover((prev) =>\n prev && prev.key === key\n ? { ...prev, videoAutoplay: video.autoplay, videoMuted: video.muted }\n : prev,\n )\n })\n },\n [postToParent],\n )\n\n return bridgeRoot ? createPortal(\n <>\n <div ref={attachVisibleViewport} data-ohw-visible-viewport=\"\" aria-hidden />\n\n {/* Uploading skeletons — keyed by upload, not by hover, so they persist if the cursor leaves. */}\n {Object.entries(uploadingRects).map(([key, { rect, fadingOut }]) => (\n <MediaOverlay\n key={`uploading-${key}`}\n hover={{ key, rect, elementType: 'image', isDragOver: false, hasTextOverlap: false }}\n isUploading\n fadingOut={fadingOut}\n onFadeOutComplete={handleMediaFadeOutComplete}\n onReplace={handleMediaReplace}\n />\n ))}\n\n {mediaHover && !(mediaHover.key in uploadingRects) && (\n <MediaOverlay\n hover={mediaHover}\n isUploading={false}\n onReplace={handleMediaReplace}\n onVideoSettingsChange={handleVideoSettingsChange}\n />\n )}\n {/* Suppressed while the link editor is open — it renders in this same document, and the\n overlay's z-index would otherwise paint the gallery chrome over the modal. */}\n {carouselHover && !linkPopover && !isItemDragging && (\n <CarouselOverlay hover={carouselHover} onEdit={handleEditCarousel} />\n )}\n {siblingHintRect && !linkPopover && !isItemDragging && siblingHintRects.length === 0 && (\n <ItemInteractionLayer rect={siblingHintRect} state=\"sibling-hint\" />\n )}\n {siblingHintRects.length > 0 &&\n !linkPopover &&\n !isItemDragging &&\n siblingHintRects.map((rect, i) => (\n <ItemInteractionLayer key={`sibling-hint-${i}`} rect={rect} state=\"sibling-hint\" />\n ))}\n {isItemDragging &&\n draggedItemRect &&\n selectedElRef.current !== footerDragRef.current?.draggedEl &&\n selectedElRef.current !== navDragRef.current?.draggedEl && (\n <ItemInteractionLayer rect={draggedItemRect} state=\"dragging\" />\n )}\n {isItemDragging &&\n footerDropSlots.map((slot, i) => (\n <div\n key={`footer-drop-${slot.direction}-${slot.columnIndex}-${slot.insertIndex}-${i}`}\n className=\"pointer-events-none fixed z-2147483646\"\n style={{\n left: slot.left,\n top: slot.top,\n width: slot.width,\n height: slot.height,\n }}\n >\n <DropIndicator\n direction={slot.direction}\n state={activeFooterDropIndex === i ? 'dragActive' : 'dragIdle'}\n className=\"!h-full !w-full\"\n />\n </div>\n ))}\n {isItemDragging &&\n navDropSlots.map((slot, i) => (\n <div\n key={`nav-drop-${slot.direction}-${slot.parentId ?? 'root'}-${slot.insertIndex}-${i}`}\n className=\"pointer-events-none fixed z-2147483646\"\n style={{\n left: slot.left,\n top: slot.top,\n width: slot.width,\n height: slot.height,\n }}\n >\n <DropIndicator\n direction={slot.direction}\n state={activeNavDropIndex === i ? 'dragActive' : 'dragIdle'}\n className=\"!h-full !w-full\"\n />\n </div>\n ))}\n {hoveredNavContainerRect &&\n toolbarVariant !== 'select-frame' &&\n !linkPopover &&\n !isItemDragging && (\n <ItemInteractionLayer rect={hoveredNavContainerRect} state=\"hover\" />\n )}\n {hoveredItemRect &&\n !linkPopover &&\n !hoveredNavContainerRect &&\n !isItemDragging &&\n hoveredItemElRef.current !== selectedElRef.current && (\n <ItemInteractionLayer rect={hoveredItemRect} state=\"hover\" />\n )}\n {toolbarVariant === 'select-frame' &&\n toolbarRect &&\n !linkPopover &&\n !isItemDragging &&\n !isFooterFrameSelection &&\n selectedElRef.current &&\n isNavbarLinksContainer(selectedElRef.current) && (\n <NavbarContainerChrome rect={toolbarRect} onAdd={handleAddTopLevelNavItem} />\n )}\n {toolbarRect &&\n !linkPopover &&\n (toolbarVariant === 'link-action' || toolbarVariant === 'select-frame') && (\n <ItemInteractionLayer\n rect={\n isItemDragging &&\n draggedItemRect &&\n (footerDragRef.current?.wasSelected || navDragRef.current?.wasSelected)\n ? draggedItemRect\n : toolbarRect\n }\n elRef={glowElRef}\n state={\n isItemDragging\n ? 'dragging'\n : resolveItemInteractionState(toolbarRect, parentScrollRef.current)\n }\n showHandle={\n (toolbarVariant === 'link-action' && Boolean(reorderHrefKey)) ||\n (toolbarVariant === 'select-frame' && isFooterFrameSelection)\n }\n dragDisabled={reorderDragDisabled}\n dragHandleLabel={reorderHrefKey ? `Reorder ${reorderHrefKey}` : 'Reorder item'}\n onDragHandleDragStart={handleItemDragStart}\n onDragHandleDragEnd={handleItemDragEnd}\n onItemPointerDown={handleItemChromePointerDown}\n onItemClick={handleItemChromeClick}\n // Column frame: no full-bleed surface — child links keep grab cursor + hover.\n itemDragSurface={!isFooterFrameSelection}\n toolbar={\n toolbarVariant === 'link-action' && !isItemDragging ? (\n <ItemActionToolbar\n onEditLink={openLinkPopoverForSelected}\n addItemDisabled\n editLinkDisabled={false}\n moreDisabled\n showAddItem={!selectedIsCta}\n showMore={!selectedIsCta}\n />\n ) : undefined\n }\n />\n )}\n {toolbarRect && toolbarVariant === 'rich-text' && !linkPopover && (\n <>\n <EditGlowChrome\n rect={toolbarRect}\n elRef={glowElRef}\n reorderHrefKey={reorderHrefKey}\n dragDisabled={reorderDragDisabled}\n hideHandle={isItemDragging}\n />\n <FloatingToolbar\n rect={toolbarRect}\n parentScroll={parentScrollRef.current}\n elRef={toolbarElRef}\n onCommand={handleCommand}\n activeCommands={activeCommands}\n showEditLink={showEditLink}\n onEditLink={openLinkPopoverForActive}\n />\n </>\n )}\n {maxBadge && (\n <div\n data-ohw-max-badge=\"\"\n style={{\n position: 'fixed',\n top: maxBadge.rect.bottom + 4,\n left: maxBadge.rect.right,\n transform: 'translateX(-100%)',\n zIndex: 2147483647,\n background: maxBadge.current > maxBadge.max ? '#FEF2F2' : '#F5F5F4',\n color: maxBadge.current > maxBadge.max ? '#DC2626' : '#78716C',\n border: `1px solid ${maxBadge.current > maxBadge.max ? '#FECACA' : '#E7E5E4'}`,\n borderRadius: 4,\n padding: '2px 6px',\n fontSize: 11,\n fontWeight: 500,\n pointerEvents: 'none',\n }}\n >\n {maxBadge.current}/{maxBadge.max}\n </div>\n )}\n {toggleState && !linkPopover && (\n <StateToggle\n rect={toggleState.rect}\n activeState={toggleState.activeState}\n states={toggleState.states}\n onStateChange={handleStateChange}\n />\n )}\n {sectionGap && !linkPopover && (\n <div\n data-ohw-section-insert-line=\"\"\n className=\"fixed left-0 w-full z-2147483646 flex items-center pointer-events-none\"\n style={{ top: sectionGap.y, transform: 'translateY(-50%)' }}\n >\n <div className=\"flex-1 bg-primary\" style={{ height: 3 }} />\n <Badge\n className=\"px-8 py-1 bg-primary hover:bg-primary text-primary-foreground text-xs font-medium shrink-0 rounded-full cursor-pointer pointer-events-auto\"\n onClick={() => {\n window.parent.postMessage(\n {\n type: 'ow:add-section',\n insertAfter: sectionGap.insertAfter,\n insertBefore: sectionGap.insertBefore,\n },\n '*',\n )\n }}\n >\n Add Section\n </Badge>\n <div className=\"flex-1 bg-primary\" style={{ height: 3 }} />\n </div>\n )}\n {linkPopover && dialogPortalContainer ? (\n <LinkPopover\n key={linkPopover.key}\n panelRef={linkPopoverPanelRef}\n portalContainer={dialogPortalContainer}\n open\n mode={linkPopover.mode ?? 'edit'}\n pages={sitePages}\n sections={currentSections}\n sectionsByPath={sectionsByPath}\n initialTarget={linkPopover.target}\n existingTargets={linkPopover.intent === 'add-nav' ? getNavbarExistingTargets() : []}\n onClose={closeLinkPopover}\n onSubmit={handleLinkPopoverSubmit}\n />\n ) : null}\n </>,\n bridgeRoot\n )\n : null\n}\n","/** Authoritative href values for `[data-ohw-href-key]` anchors (survives React re-renders). */\nconst linkHrefStore = new Map<string, string>()\n\nexport function setStoredLinkHref(key: string, href: string) {\n linkHrefStore.set(key, href)\n}\n\nexport function getStoredLinkHref(key: string): string | undefined {\n return linkHrefStore.get(key)\n}\n\n/** Restore saved hrefs when React reconciliation resets anchor attributes. */\nexport function enforceLinkHrefs() {\n document.querySelectorAll<HTMLElement>('[data-ohw-href-key]').forEach((el) => {\n const key = el.getAttribute('data-ohw-href-key') ?? ''\n if (!key) return\n const saved = linkHrefStore.get(key)\n if (saved === undefined) return\n if (el.getAttribute('href') !== saved) el.setAttribute('href', saved)\n })\n}\n","import { useLayoutEffect } from 'react'\nimport { enforceLinkHrefs } from './linkHrefStore'\n\n/** Keeps bridge-managed link hrefs stable across React re-renders. */\nexport function useLinkHrefGuardian(...deps: unknown[]) {\n useLayoutEffect(() => {\n let debounceTimer: ReturnType<typeof setTimeout> | null = null\n\n const scheduleEnforce = () => {\n if (debounceTimer) clearTimeout(debounceTimer)\n debounceTimer = setTimeout(enforceLinkHrefs, 50)\n }\n\n enforceLinkHrefs()\n\n const observer = new MutationObserver(scheduleEnforce)\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['href'],\n })\n\n return () => {\n observer.disconnect()\n if (debounceTimer) clearTimeout(debounceTimer)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps)\n}\n","'use client'\nimport React, { useEffect, useId, useMemo, useRef, useState } from 'react'\nimport { EmailCaptureModal } from './EmailCaptureModal'\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\ninterface ScheduleClassWeekday { weekday: number }\ninterface ScheduleClassFixedDate { date: string } // DD-MM-YYYY\ninterface ScheduleClassBooking { classDate?: string | Date }\n\ninterface ScheduleClass {\n id?: string\n name: string\n hostName: string\n duration: number\n maxParticipants: number\n startTime: { hour: string; minutes: string; time: string }\n weekdays?: ScheduleClassWeekday[]\n fixedDates?: ScheduleClassFixedDate[]\n bookings?: ScheduleClassBooking[]\n}\n\ninterface Schedule {\n id: string\n name: string\n description?: string | null\n type: string\n timezone?: string | null\n classes?: ScheduleClass[]\n}\n\n// ── Constants ─────────────────────────────────────────────────────────────────\n\nconst API_URL =\n (process.env.NEXT_PUBLIC_FLOWOPS_API_URL as string | undefined) ??\n 'https://flowops-backend-staging-2yfdh7pwpq-as.a.run.app'\n\nconst DAY_ABBR = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT']\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction classRunsOnDate(cls: ScheduleClass, date: Date, type: string): boolean {\n if (type === 'FIXED') {\n const d = String(date.getDate()).padStart(2, '0')\n const m = String(date.getMonth() + 1).padStart(2, '0')\n return cls.fixedDates?.some((fd) => fd.date === `${d}-${m}-${date.getFullYear()}`) ?? false\n }\n return cls.weekdays?.some((w) => w.weekday === date.getDay()) ?? false\n}\n\nfunction formatClassTime(cls: ScheduleClass): string {\n let h = parseInt(cls.startTime.hour, 10)\n const m = parseInt(cls.startTime.minutes, 10)\n if (cls.startTime.time === 'PM' && h !== 12) h += 12\n if (cls.startTime.time === 'AM' && h === 12) h = 0\n const endTotal = h * 60 + m + cls.duration\n const eh = Math.floor(endTotal / 60) % 24\n const em = endTotal % 60\n return `${h}:${cls.startTime.minutes}-${eh}:${String(em).padStart(2, '0')}`\n}\n\nfunction getBookingsOnDate(cls: ScheduleClass, date: Date): number {\n if (!cls.bookings?.length) return 0\n const ds = date.toISOString().split('T')[0]\n return cls.bookings.filter((b) => {\n try { return new Date(b.classDate as string).toISOString().split('T')[0] === ds }\n catch { return false }\n }).length\n}\n\nfunction buildTimezoneLabel(tz: string): string {\n try {\n const now = new Date()\n const timeStr = new Intl.DateTimeFormat('en-US', {\n hour: '2-digit', minute: '2-digit', hour12: false, timeZone: tz,\n }).format(now)\n const offsetPart = new Intl.DateTimeFormat('en-US', { timeZoneName: 'short', timeZone: tz })\n .formatToParts(now)\n .find((p) => p.type === 'timeZoneName')?.value ?? ''\n const city = tz.split('/').pop()?.replace(/_/g, ' ') ?? tz\n return `${timeStr} (${offsetPart}) ${city} time`\n } catch { return tz }\n}\n\n// ── Empty state ───────────────────────────────────────────────────────────────\n\nfunction EmptyState({ inEditor, insertAfter }: { inEditor: boolean; insertAfter: string }) {\n const handleAddSchedule = () => {\n if (inEditor) {\n window.parent.postMessage({ type: 'ow:scheduling-not-connected', insertAfter }, '*')\n }\n }\n\n return (\n <div className=\"flex flex-col items-center justify-center gap-6 p-12 bg-[#FAFAF9] border-2 border-dashed border-[#E7E5E4] rounded-[10px] h-[264px] w-full box-border\">\n <div className=\"w-10 h-10 bg-[#F5F5F4] rounded-[10px] flex items-center justify-center shrink-0\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"var(--color-accent, #A89B83)\" strokeWidth=\"1.5\"\n strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" />\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\" />\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\" />\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\" />\n <line x1=\"12\" y1=\"14\" x2=\"12\" y2=\"18\" />\n <line x1=\"10\" y1=\"16\" x2=\"14\" y2=\"16\" />\n </svg>\n </div>\n <div className=\"flex flex-col items-center gap-2\">\n <p className=\"font-body text-lg font-medium text-center text-[#0A0A0A] m-0\">\n No schedule yet\n </p>\n <p className=\"font-body text-base font-normal text-center text-(--color-accent,#A89B83) m-0\">\n Add a scheduling widget to get instant bookings.\n </p>\n </div>\n <button\n onClick={handleAddSchedule}\n className=\"h-9 px-2 py-1.5 flex items-center justify-center bg-white border border-[#E7E5E4] rounded-md font-body text-sm font-medium text-(--color-dark,#200C02) cursor-pointer\"\n >\n Add Schedule\n </button>\n </div>\n )\n}\n\n// ── Loading skeleton ──────────────────────────────────────────────────────────\n\nfunction LoadingSkeleton() {\n const shimmer: React.CSSProperties = {\n background: 'linear-gradient(90deg,#f0f0f0 25%,#e8e8e8 50%,#f0f0f0 75%)',\n backgroundSize: '200% 100%',\n animation: 'ohw-shimmer 1.5s infinite',\n }\n return (\n <div className=\"w-full flex flex-col gap-10\">\n <style>{`@keyframes ohw-shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}`}</style>\n <div className=\"flex h-[70px] items-stretch\">\n {Array.from({ length: 7 }).map((_, i) => (\n <div key={i} className=\"flex-1 flex flex-col justify-between items-center px-1\">\n <div style={{ ...shimmer, width: '32px', height: '14px', borderRadius: '4px' }} />\n <div style={{ ...shimmer, width: '40px', height: '40px', borderRadius: '50%' }} />\n </div>\n ))}\n </div>\n {[0, 1, 2].map((i) => (\n <div key={i}>\n {/* Mobile skeleton: 2-column */}\n <div className=\"flex gap-4 py-4 sm:hidden\">\n <div className=\"flex flex-col gap-2 shrink-0\">\n <div style={{ ...shimmer, width: '100px', height: '16px', borderRadius: '4px' }} />\n <div style={{ ...shimmer, width: '52px', height: '20px', borderRadius: '999px' }} />\n <div style={{ ...shimmer, width: '60px', height: '14px', borderRadius: '4px' }} />\n </div>\n <div className=\"flex flex-1 flex-col gap-2\">\n <div style={{ ...shimmer, width: '75%', height: '16px', borderRadius: '4px' }} />\n <div style={{ ...shimmer, width: '50%', height: '14px', borderRadius: '4px' }} />\n <div style={{ ...shimmer, width: '100%', height: '44px', borderRadius: '8px' }} />\n </div>\n </div>\n {/* Desktop skeleton: flat row */}\n <div className=\"hidden sm:flex items-center gap-[60px] py-4\">\n <div style={{ ...shimmer, width: '120px', height: '16px', borderRadius: '4px', flexShrink: 0 }} />\n <div className=\"flex-1 flex flex-col gap-2\">\n <div style={{ ...shimmer, width: '55%', height: '16px', borderRadius: '4px' }} />\n <div style={{ ...shimmer, width: '38%', height: '14px', borderRadius: '4px' }} />\n </div>\n <div style={{ ...shimmer, width: '56px', height: '32px', borderRadius: '4px', flexShrink: 0 }} />\n <div style={{ ...shimmer, width: '200px', height: '44px', borderRadius: '8px', flexShrink: 0 }} />\n </div>\n {i < 2 && <div className=\"h-px bg-black/20\" />}\n </div>\n ))}\n </div>\n )\n}\n\n// ── Schedule view ─────────────────────────────────────────────────────────────\n\nfunction ScheduleView({ schedule, dates, selectedIdx, onSelectDate, onOpenModal }: {\n schedule: Schedule\n dates: Date[]\n selectedIdx: number\n onSelectDate: (i: number) => void\n onOpenModal?: (mode: 'book' | 'waitlist', classId: string, classDate: Date) => void\n}) {\n const todayMs = useMemo(() => { const d = new Date(); d.setHours(0,0,0,0); return d.getTime() }, [])\n const scrollRef = useRef<HTMLDivElement>(null)\n const [canScrollLeft, setCanScrollLeft] = useState(false)\n const [canScrollRight, setCanScrollRight] = useState(false)\n\n const updateScrollState = () => {\n const el = scrollRef.current\n if (!el) return\n setCanScrollLeft(el.scrollLeft > 0)\n setCanScrollRight(el.scrollLeft + el.clientWidth < el.scrollWidth - 1)\n }\n\n useEffect(() => {\n const el = scrollRef.current\n if (!el) return\n updateScrollState()\n el.addEventListener('scroll', updateScrollState)\n const ro = new ResizeObserver(updateScrollState)\n ro.observe(el)\n return () => { el.removeEventListener('scroll', updateScrollState); ro.disconnect() }\n }, [dates])\n\n const scroll = (dir: 'left' | 'right') => {\n scrollRef.current?.scrollBy({ left: dir === 'left' ? -216 : 216, behavior: 'smooth' })\n }\n\n // Mouse drag-to-scroll\n const isDragging = useRef(false)\n const dragStartX = useRef(0)\n const dragStartScrollLeft = useRef(0)\n\n const onDragStart = (e: React.MouseEvent) => {\n if (!scrollRef.current) return\n isDragging.current = true\n dragStartX.current = e.clientX\n dragStartScrollLeft.current = scrollRef.current.scrollLeft\n scrollRef.current.style.cursor = 'grabbing'\n scrollRef.current.style.userSelect = 'none'\n }\n\n const onDragMove = (e: React.MouseEvent) => {\n if (!isDragging.current || !scrollRef.current) return\n const delta = e.clientX - dragStartX.current\n scrollRef.current.scrollLeft = dragStartScrollLeft.current - delta\n }\n\n const onDragEnd = () => {\n if (!scrollRef.current) return\n isDragging.current = false\n scrollRef.current.style.cursor = 'grab'\n scrollRef.current.style.userSelect = ''\n }\n\n const datesWithClasses = useMemo(() =>\n new Set(dates.map((d, i) =>\n schedule.classes?.some((c) => classRunsOnDate(c, d, schedule.type)) ? i : -1\n ).filter((i) => i >= 0))\n , [dates, schedule])\n\n const selectedDate = dates[selectedIdx]\n\n const selectedClasses = useMemo(() =>\n (schedule.classes ?? []).filter((c) => selectedDate && classRunsOnDate(c, selectedDate, schedule.type))\n , [schedule, selectedDate])\n\n return (\n <div className=\"w-full flex flex-col gap-10\">\n\n {/* Calendar strip */}\n <div className=\"relative w-full\">\n {/* Desktop scroll arrows (hidden on mobile) */}\n {canScrollLeft && (\n <button\n onClick={() => scroll('left')}\n className=\"hidden sm:flex absolute left-0 top-1/2 -translate-y-1/2 z-10 w-8 h-8 items-center justify-center rounded-full border-none cursor-pointer\"\n style={{ background: 'var(--color-light,#FEFFF0)', boxShadow: '0 1px 4px rgba(0,0,0,0.15)' }}\n aria-label=\"Scroll left\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--color-dark,#200C02)\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n </button>\n )}\n {canScrollRight && (\n <button\n onClick={() => scroll('right')}\n className=\"hidden sm:flex absolute right-0 top-1/2 -translate-y-1/2 z-10 w-8 h-8 items-center justify-center rounded-full border-none cursor-pointer\"\n style={{ background: 'var(--color-light,#FEFFF0)', boxShadow: '0 1px 4px rgba(0,0,0,0.15)' }}\n aria-label=\"Scroll right\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--color-dark,#200C02)\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n </button>\n )}\n {/* Mobile gradient fades (hidden on desktop) */}\n {canScrollLeft && (\n <div\n className=\"sm:hidden absolute left-0 top-0 bottom-0 w-10 z-10 pointer-events-none\"\n style={{ background: 'linear-gradient(to right, var(--color-light,#FEFFF0), transparent)' }}\n />\n )}\n {canScrollRight && (\n <div\n className=\"sm:hidden absolute right-0 top-0 bottom-0 w-10 z-10 pointer-events-none\"\n style={{ background: 'linear-gradient(to left, var(--color-light,#FEFFF0), transparent)' }}\n />\n )}\n <div\n ref={scrollRef}\n className=\"overflow-x-auto w-full\"\n style={{ scrollbarWidth: 'none', msOverflowStyle: 'none', touchAction: 'pan-x', cursor: 'grab' }}\n onMouseDown={onDragStart}\n onMouseMove={onDragMove}\n onMouseUp={onDragEnd}\n onMouseLeave={onDragEnd}\n >\n {/* width: max(100%, total-min) → fills parent when wide, causes scroll when narrow */}\n <div className=\"flex\" style={{ width: `max(100%, ${dates.length * 60}px)` }}>\n {dates.map((date, i) => {\n const isToday = date.getTime() === todayMs\n const isSelected = i === selectedIdx\n const clickable = datesWithClasses.has(i)\n const label = isToday ? 'TODAY' : DAY_ABBR[date.getDay()]\n return (\n <div\n key={i}\n onClick={() => clickable && onSelectDate(i)}\n className={`flex-1 h-[70px] flex flex-col justify-between items-center ${clickable ? 'cursor-pointer opacity-100' : 'cursor-default opacity-50'}`}\n >\n <span className=\"font-body text-base font-normal text-center text-(--color-dark,#200C02)\">\n {label}\n </span>\n <div\n className=\"w-10 h-10 rounded-full flex items-center justify-center\"\n style={{ background: isSelected ? 'var(--color-primary, #3D312B)' : 'transparent' }}\n >\n <span\n className=\"font-body text-xl font-bold text-center tracking-display-tight\"\n style={{ color: isSelected ? 'var(--color-light, #FEFFF0)' : 'var(--color-dark, #200C02)' }}\n >\n {date.getDate()}\n </span>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n </div>\n\n {/* Class list */}\n {selectedClasses.length === 0 ? (\n <p className=\"font-body text-base text-(--color-accent,#A89B83) text-center py-8 m-0\">\n No classes scheduled for this day.\n </p>\n ) : (\n <div className=\"flex flex-col\">\n {selectedClasses.map((cls, i) => {\n const booked = getBookingsOnDate(cls, selectedDate)\n const available = cls.maxParticipants - booked\n const isFull = available <= 0\n const isPrivate = cls.maxParticipants === 1\n return (\n <div key={cls.id ?? i}>\n {/*\n Mobile: 2-column layout (left: time+badge+spots, right: name+instructor+button)\n Desktop (sm+): flat single-row via sm:contents on the two grouping divs\n */}\n <div className=\"flex gap-4 py-4 sm:items-center sm:gap-[60px] box-border\">\n\n {/* Left col on mobile / Time on desktop */}\n <div className=\"flex flex-col gap-2 shrink-0 sm:contents\">\n\n {/* Time + badge (stacked, visible on both mobile and desktop) */}\n <div className=\"flex flex-col gap-2 sm:w-[120px] sm:shrink-0\">\n <span className=\"font-body text-base font-bold text-(--color-dark,#200C02) block\">\n {formatClassTime(cls)}\n </span>\n <span\n className=\"inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium w-fit\"\n style={isPrivate\n ? { background: '#DDFBE3', color: '#199130', border: '1px solid #199130', fontWeight: 500 }\n : { background: '#EEEDFF', color: '#5953FF', border: '1px solid #5953FF', fontWeight: 500 }}\n >\n {isPrivate ? 'PRIVATE' : 'GROUP'}\n </span>\n </div>\n\n {/* Spots — mobile only */}\n <div className=\"sm:hidden flex flex-col gap-px\">\n {isFull ? (\n <span className=\"font-body text-sm text-(--color-dark,#200C02) opacity-80\">Full</span>\n ) : (\n <>\n <span className=\"font-body text-sm text-(--color-dark,#200C02) opacity-80\">\n {available}/{cls.maxParticipants}\n </span>\n <span className=\"font-body text-sm text-(--color-dark,#200C02) opacity-80\">\n available\n </span>\n </>\n )}\n </div>\n </div>\n\n {/* Right col on mobile / Class info + spots + button on desktop */}\n <div className=\"flex flex-1 flex-col gap-2 min-w-0 sm:contents\">\n\n {/* Class name + instructor */}\n <div className=\"flex-1 flex flex-col gap-2 min-w-0\">\n <span className=\"font-body text-base font-bold text-(--color-dark,#200C02) block truncate\">\n {cls.name}\n </span>\n {cls.hostName && (\n <span className=\"font-body text-base font-normal text-(--color-dark,#200C02) opacity-80 block truncate\">\n {cls.hostName}\n </span>\n )}\n </div>\n\n {/* Spots — desktop only */}\n <div className=\"hidden sm:flex w-14 shrink-0 flex-col gap-px\">\n {isFull ? (\n <span className=\"font-body text-sm text-(--color-dark,#200C02) opacity-80\">Full</span>\n ) : (\n <>\n <span className=\"font-body text-sm text-(--color-dark,#200C02) opacity-80\">\n {available}/{cls.maxParticipants}\n </span>\n <span className=\"font-body text-sm text-(--color-dark,#200C02) opacity-80\">\n available\n </span>\n </>\n )}\n </div>\n\n {/* CTA button */}\n <button\n className=\"w-full sm:w-[200px] sm:shrink-0 px-5 py-[10px] flex items-center justify-center rounded-lg font-body text-base font-bold cursor-pointer box-border\"\n style={isFull ? {\n background: 'transparent',\n border: '1px solid var(--color-dark, #200C02)',\n color: 'var(--color-dark, #200C02)',\n } : {\n background: 'var(--color-primary, #3D312B)',\n border: 'none',\n color: 'var(--color-light, #FEFFF0)',\n }}\n onClick={() => {\n if (!cls.id) return\n onOpenModal?.(isFull ? 'waitlist' : 'book', cls.id, selectedDate)\n }}\n >\n {isFull ? 'Join Waitlist' : 'Book Now'}\n </button>\n </div>\n </div>\n {i < selectedClasses.length - 1 && (\n <div className=\"h-px bg-black/20\" />\n )}\n </div>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\n// ── Scheduling section hover overlay + main component ────────────────────────\n\nfunction CalendarFoldIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0 }}>\n <path d=\"M8 2v4\" />\n <path d=\"M16 2v4\" />\n <path d=\"M21 17V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11Z\" />\n <path d=\"M3 10h18\" />\n <path d=\"M15 22v-4a2 2 0 0 1 2-2h4\" />\n </svg>\n )\n}\n\n// ── Main component ────────────────────────────────────────────────────────────\n\nexport function SchedulingWidget({ notifyOnConnect = false, initialScheduleId, insertAfter: insertAfterProp }: { notifyOnConnect?: boolean; initialScheduleId?: string | null; insertAfter?: string }) {\n const autoId = useId()\n const insertAfter = insertAfterProp ?? autoId\n const [schedule, setSchedule] = useState<Schedule | null>(null)\n const [loading, setLoading] = useState(true)\n const [inEditor, setInEditor] = useState(false)\n const [isHovered, setIsHovered] = useState(false)\n const [modalState, setModalState] = useState<{ mode: 'book' | 'waitlist'; classId: string; classDate: Date } | null>(null)\n const switchScheduleIdRef = useRef<string | null>(null)\n\n const dates = useMemo(() => {\n const today = new Date(); today.setHours(0, 0, 0, 0)\n return Array.from({ length: 14 }, (_, i) => {\n const d = new Date(today); d.setDate(today.getDate() + i); return d\n })\n }, [])\n\n const [selectedIdx, setSelectedIdx] = useState(0)\n\n useEffect(() => {\n if (!schedule?.classes) return\n for (let i = 0; i < dates.length; i++) {\n if (schedule.classes.some((c) => classRunsOnDate(c, dates[i], schedule.type))) {\n setSelectedIdx(i); return\n }\n }\n }, [schedule, dates])\n\n useEffect(() => {\n if (typeof window === 'undefined') return\n const isInEditor = window.self !== window.top\n setInEditor(isInEditor)\n\n // Shared loading logic invoked directly (known scheduleId) or after config resolution (vibe-coder path).\n function loadWithId(effectiveId: string | null): (() => void) | void {\n if (isInEditor) {\n // null = explicitly cleared — start in empty state without auto-connecting,\n // but still register the listener so ow:switch-schedule can reconnect later.\n const startEmpty = effectiveId === null\n if (startEmpty) setLoading(false)\n\n let initialized = startEmpty // treat as already resolved so the timeout won't override empty state\n const timer = !startEmpty ? setTimeout(() => {\n if (!initialized) { initialized = true; setLoading(false) }\n }, 5000) : null\n const handler = (e: MessageEvent) => {\n if (e.data?.type === 'ow:clear-scheduling-widget') {\n if (!e.data.insertAfter || e.data.insertAfter !== insertAfter) return\n setSchedule(null)\n setLoading(false)\n return\n }\n if (e.data?.type === 'ow:switch-schedule') {\n if (!e.data.insertAfter || e.data.insertAfter !== insertAfter) return\n switchScheduleIdRef.current = e.data.scheduleId ?? null\n initialized = false\n setLoading(true)\n window.parent.postMessage({ type: 'ow:request-user-schedules', insertAfter }, '*')\n return\n }\n if (e.data?.type !== 'ow:user-schedules-response') return\n if (e.data.insertAfter && e.data.insertAfter !== insertAfter) return\n if (initialized && switchScheduleIdRef.current === null) return\n initialized = true\n if (timer) clearTimeout(timer)\n const schedules: Schedule[] = e.data.schedules ?? []\n const isSwitching = switchScheduleIdRef.current !== null\n const target = isSwitching\n ? (schedules.find((s) => s.id === switchScheduleIdRef.current) ?? schedules[0] ?? null)\n : effectiveId\n ? (schedules.find((s) => s.id === effectiveId) ?? schedules[0] ?? null)\n : (schedules[0] ?? null)\n switchScheduleIdRef.current = null\n setSchedule(target)\n setLoading(false)\n if (notifyOnConnect && target && !isSwitching) {\n window.parent.postMessage({\n type: 'ow:schedule-connected',\n schedule: { id: target.id, name: target.name },\n insertAfter,\n }, '*')\n // Persist auto-linked scheduleId so save validation doesn't treat widget as empty\n window.postMessage({ type: 'ow:schedule-linked', scheduleId: target.id, insertAfter }, '*')\n }\n }\n window.addEventListener('message', handler)\n if (!startEmpty) window.parent.postMessage({ type: 'ow:request-user-schedules', insertAfter }, '*')\n return () => { window.removeEventListener('message', handler); if (timer) clearTimeout(timer) }\n }\n\n // Live site: public API. null = explicitly cleared (show nothing), string = fetch by ID.\n if (!effectiveId) {\n setLoading(false)\n return\n }\n ;(async () => {\n try {\n const res = await fetch(`${API_URL}/api/schedule/id/${effectiveId}`)\n const data = await res.json()\n setSchedule(data?.id ? data : null)\n } catch { /* ignore */ }\n setLoading(false)\n })()\n }\n\n // Vibe-coder static placement: initialScheduleId is undefined because the widget was\n // placed directly in template JSX. Ask the bridge for the stored scheduleId, then enter\n // the normal loading flow with the resolved value.\n if (initialScheduleId === undefined) {\n let done = false\n let innerCleanup: (() => void) | void\n const timer = setTimeout(() => {\n if (!done) { done = true; setLoading(false) }\n }, 2000)\n const configHandler = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:schedule-config' || e.data.insertAfter !== insertAfter || done) return\n done = true\n clearTimeout(timer)\n window.removeEventListener('message', configHandler)\n innerCleanup = loadWithId(e.data.scheduleId ?? null)\n }\n window.addEventListener('message', configHandler)\n window.postMessage({ type: 'ow:request-schedule-config', insertAfter }, '*')\n return () => {\n window.removeEventListener('message', configHandler)\n clearTimeout(timer)\n innerCleanup?.()\n }\n }\n\n return loadWithId(initialScheduleId) ?? undefined\n }, [])\n\n const timezoneLabel = schedule?.timezone\n ? (() => { try { return buildTimezoneLabel(schedule.timezone) } catch { return undefined } })()\n : undefined\n\n const handleModalSubmit = async (email: string) => {\n if (!modalState) return\n const { mode, classId, classDate } = modalState\n const endpoint = mode === 'book'\n ? `${API_URL}/api/schedule/class/${classId}/booking`\n : `${API_URL}/api/schedule/class/${classId}/waitlist`\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ classDate: classDate.toISOString(), email }),\n })\n if (!res.ok) {\n const data = await res.json().catch(() => ({}))\n throw new Error(data?.message ?? 'Something went wrong. Please try again.')\n }\n }\n\n const handleReplaceSchedule = () => {\n setIsHovered(false)\n if (schedule) {\n window.parent.postMessage({\n type: 'ow:schedule-connected',\n schedule: { id: schedule.id, name: schedule.name },\n insertAfter,\n }, '*')\n } else {\n window.parent.postMessage({ type: 'ow:scheduling-not-connected', insertAfter }, '*')\n }\n }\n\n if (!inEditor && !loading && !schedule) return null\n\n const sectionId = `scheduling-${insertAfter}`\n\n return (\n <section\n data-ohw-section={sectionId}\n data-ohw-scheduling-anchor={insertAfter}\n className=\"w-full box-border py-10 px-5 sm:py-20 sm:px-16 font-body bg-(--color-light,#FEFFF0) relative\"\n onMouseEnter={() => inEditor && setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n {/* Hover overlay — editor mode only, entire area is clickable */}\n {inEditor && isHovered && !!schedule && (\n <div\n className=\"absolute inset-0 z-10 pointer-events-auto cursor-pointer\"\n onClick={handleReplaceSchedule}\n >\n <div className=\"absolute inset-0\" style={{ background: '#0885FE', opacity: 0.18 }} />\n <div className=\"absolute inset-0\" style={{ boxShadow: 'inset 0 0 0 1.5px #0885FE' }} />\n <div className=\"absolute inset-0 flex items-center justify-center pointer-events-none\">\n <div\n className=\"bg-white border border-[#E7E5E4] rounded-md px-3 py-1.5 flex items-center gap-1.5\"\n style={{\n fontSize: 14,\n lineHeight: '24px',\n fontFamily: \"'Figtree', system-ui, sans-serif\",\n fontWeight: 500,\n color: '#0C0A09',\n }}\n >\n <CalendarFoldIcon />\n Replace schedule\n </div>\n </div>\n </div>\n )}\n\n <div className=\"max-w-[1280px] mx-auto flex flex-col items-center gap-16\">\n\n {/* Heading + subtitle */}\n <div className=\"flex flex-col items-center gap-4\">\n <h2 className=\"font-display text-4xl sm:text-5xl font-bold text-center m-0 text-(--color-dark,#200C02)\">\n {schedule?.name ?? 'Book an appointment'}\n </h2>\n {schedule?.description && (\n <p className=\"font-body text-body text-center m-0 text-(--color-accent,#A89B83)\">\n {schedule.description}\n </p>\n )}\n </div>\n\n {/* Schedule card */}\n <div className=\"w-full flex flex-col items-end gap-3\">\n {timezoneLabel && (\n <span className=\"font-body text-sm font-normal text-(--color-accent,#A89B83)\">\n {timezoneLabel}\n </span>\n )}\n <div className=\"w-full p-0 sm:p-10 box-border\">\n {loading ? (\n <LoadingSkeleton />\n ) : !schedule ? (\n <EmptyState inEditor={inEditor} insertAfter={insertAfter} />\n ) : (\n <ScheduleView\n schedule={schedule}\n dates={dates}\n selectedIdx={selectedIdx}\n onSelectDate={setSelectedIdx}\n onOpenModal={inEditor ? undefined : (mode, classId, classDate) => setModalState({ mode, classId, classDate })}\n />\n )}\n </div>\n </div>\n\n </div>\n\n {modalState && (\n <EmailCaptureModal\n title={modalState.mode === 'book' ? 'Confirm your spot' : 'Leave your email'}\n subtitle={modalState.mode === 'book' ? \"We'll send your booking confirmation here.\" : \"We'll let you know when spots open up!\"}\n onSubmit={handleModalSubmit}\n onClose={() => setModalState(null)}\n />\n )}\n </section>\n )\n}\n","import { useState } from 'react'\nimport { Dialog } from 'radix-ui'\n\ninterface Props {\n title: string\n subtitle: string\n onSubmit: (email: string) => Promise<void>\n onClose: () => void\n}\n\nfunction Spinner() {\n return (\n <svg\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n style={{ animation: 'ohw-spin 0.75s linear infinite' }}\n >\n <style>{`@keyframes ohw-spin { to { transform: rotate(360deg); } }`}</style>\n <circle cx=\"16\" cy=\"16\" r=\"12\" stroke=\"#e5e7eb\" strokeWidth=\"3\" />\n <path\n d=\"M16 4a12 12 0 0 1 12 12\"\n stroke=\"#3b82f6\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n />\n </svg>\n )\n}\n\nexport function EmailCaptureModal({ title, subtitle, onSubmit, onClose }: Props) {\n const [email, setEmail] = useState('')\n const [submittedEmail, setSubmittedEmail] = useState('')\n const [loading, setLoading] = useState(false)\n const [success, setSuccess] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const isBook = title === 'Confirm your spot'\n\n const handleSubmit = async () => {\n if (!email.trim()) return\n setLoading(true)\n setError(null)\n try {\n await onSubmit(email.trim())\n setSubmittedEmail(email.trim())\n setSuccess(true)\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : 'Something went wrong. Please try again.')\n } finally {\n setLoading(false)\n }\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !loading) handleSubmit()\n }\n\n return (\n <Dialog.Root open onOpenChange={(open) => { if (!open) onClose() }}>\n <Dialog.Portal>\n <Dialog.Overlay\n className=\"fixed inset-0 z-50\"\n style={{ background: 'rgba(0,0,0,0.45)' }}\n />\n <Dialog.Content\n className=\"fixed left-1/2 top-1/2 z-50 w-full -translate-x-1/2 -translate-y-1/2 bg-white rounded-xl shadow-xl outline-none font-body box-border overflow-hidden\"\n style={{ maxWidth: 400 }}\n >\n {/* Header */}\n <div className=\"flex items-start justify-between gap-3 p-6\">\n <div className=\"flex flex-col gap-1\">\n <Dialog.Title\n className=\"font-body text-xl font-bold m-0 leading-tight\"\n style={{ color: 'var(--color-dark,#200C02)' }}\n >\n {success\n ? isBook ? 'Reservation confirmed!' : \"You're on the waitlist!\"\n : title}\n </Dialog.Title>\n <Dialog.Description\n className=\"font-body text-sm m-0\"\n style={{ color: '#6B7280' }}\n >\n {success\n ? isBook\n ? `A confirmation email has been sent to ${submittedEmail}.`\n : 'We\\'ll let you know via email if someone cancels.'\n : subtitle}\n </Dialog.Description>\n </div>\n <Dialog.Close\n className=\"shrink-0 w-7 h-7 flex items-center justify-center rounded-full bg-transparent border-none cursor-pointer mt-0.5 absolute top-2.5 right-1.5\"\n style={{ color: '#6B7280' }}\n aria-label=\"Close\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </Dialog.Close>\n </div>\n\n {!success && (loading ? (\n /* Loading state — full body replaced */\n <div className=\"flex flex-col items-center justify-center gap-3 px-7 py-12\">\n <Spinner />\n <p className=\"font-body text-sm m-0\" style={{ color: '#6B7280' }}>\n Please wait\n </p>\n </div>\n ) : (\n /* Email form */\n <div className=\"px-7 pt-2 pb-6\">\n <div className=\"flex flex-col gap-1.5 mb-8\">\n <label className=\"font-body text-sm font-medium\" style={{ color: 'var(--color-dark,#200C02)' }}>\n Email\n </label>\n <input\n type=\"email\"\n value={email}\n onChange={(e) => setEmail(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder=\"hello@gmail.com\"\n autoFocus\n className=\"w-full h-10 px-3 rounded-lg border font-body text-sm outline-none box-border\"\n style={{\n borderColor: '#E7E5E4',\n background: '#fff',\n color: 'var(--color-dark,#200C02)',\n }}\n />\n {error && (\n <p className=\"font-body text-xs text-red-500 m-0\">{error}</p>\n )}\n </div>\n\n <div className=\"flex justify-end\">\n <button\n onClick={handleSubmit}\n disabled={!email.trim()}\n className=\"h-9 px-5 rounded-lg font-body text-sm font-semibold cursor-pointer border-none disabled:opacity-50 disabled:cursor-not-allowed\"\n style={{\n background: 'var(--color-primary,#3D312B)',\n color: 'var(--color-light,#FEFFF0)',\n }}\n >\n Send\n </button>\n </div>\n </div>\n ))}\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\nimport { Toggle } from './toggle'\n\ntype ToggleGroupContextValue = {\n value: string\n onValueChange: (value: string) => void\n}\n\nconst ToggleGroupContext = React.createContext<ToggleGroupContextValue>({\n value: '',\n onValueChange: () => {},\n})\n\nfunction ToggleGroup({\n className,\n value,\n onValueChange,\n children,\n ...props\n}: {\n value: string\n onValueChange: (value: string) => void\n children: React.ReactNode\n} & Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'>) {\n return (\n <div\n role=\"group\"\n className={cn('flex items-center gap-1 p-1 bg-muted rounded-md', className)}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ value, onValueChange }}>\n {children}\n </ToggleGroupContext.Provider>\n </div>\n )\n}\n\nfunction ToggleGroupItem({\n className,\n value,\n children,\n ...props\n}: {\n value: string\n children: React.ReactNode\n} & Omit<React.ComponentProps<typeof Toggle>, 'pressed' | 'onPressedChange'>) {\n const { value: groupValue, onValueChange } = React.useContext(ToggleGroupContext)\n\n return (\n <Toggle\n pressed={groupValue === value}\n onPressedChange={(pressed) => { if (pressed) onValueChange(value) }}\n className={cn(\n 'text-foreground cursor-pointer hover:bg-transparent hover:text-foreground',\n 'data-[state=on]:bg-background data-[state=on]:shadow-sm',\n 'data-[state=off]:opacity-50 data-[state=off]:hover:opacity-75',\n className\n )}\n {...props}\n >\n {children}\n </Toggle>\n )\n}\n\nexport { ToggleGroup, ToggleGroupItem }\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","/**\n * Concatenates two arrays faster than the array spread operator.\n */\nexport const concatArrays = <T, U>(\n array1: readonly T[],\n array2: readonly U[],\n): readonly (T | U)[] => {\n // Pre-allocate for better V8 optimization\n const combinedArray: (T | U)[] = new Array(array1.length + array2.length)\n for (let i = 0; i < array1.length; i++) {\n combinedArray[i] = array1[i]!\n }\n for (let i = 0; i < array2.length; i++) {\n combinedArray[array1.length + i] = array2[i]!\n }\n return combinedArray\n}\n","import {\n AnyClassGroupIds,\n AnyConfig,\n AnyThemeGroupIds,\n ClassGroup,\n ClassValidator,\n Config,\n ThemeGetter,\n ThemeObject,\n} from './types'\nimport { concatArrays } from './utils'\n\nexport interface ClassPartObject {\n nextPart: Map<string, ClassPartObject>\n validators: ClassValidatorObject[] | null\n classGroupId: AnyClassGroupIds | undefined // Always define optional props for consistent shape\n}\n\ninterface ClassValidatorObject {\n classGroupId: AnyClassGroupIds\n validator: ClassValidator\n}\n\n// Factory function ensures consistent object shapes\nconst createClassValidatorObject = (\n classGroupId: AnyClassGroupIds,\n validator: ClassValidator,\n): ClassValidatorObject => ({\n classGroupId,\n validator,\n})\n\n// Factory ensures consistent ClassPartObject shape\nconst createClassPartObject = (\n nextPart: Map<string, ClassPartObject> = new Map(),\n validators: ClassValidatorObject[] | null = null,\n classGroupId?: AnyClassGroupIds,\n): ClassPartObject => ({\n nextPart,\n validators,\n classGroupId,\n})\n\nconst CLASS_PART_SEPARATOR = '-'\n\nconst EMPTY_CONFLICTS: readonly AnyClassGroupIds[] = []\n// I use two dots here because one dot is used as prefix for class groups in plugins\nconst ARBITRARY_PROPERTY_PREFIX = 'arbitrary..'\n\nexport const createClassGroupUtils = (config: AnyConfig) => {\n const classMap = createClassMap(config)\n const { conflictingClassGroups, conflictingClassGroupModifiers } = config\n\n const getClassGroupId = (className: string) => {\n if (className.startsWith('[') && className.endsWith(']')) {\n return getGroupIdForArbitraryProperty(className)\n }\n\n const classParts = className.split(CLASS_PART_SEPARATOR)\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and skip it.\n const startIndex = classParts[0] === '' && classParts.length > 1 ? 1 : 0\n return getGroupRecursive(classParts, startIndex, classMap)\n }\n\n const getConflictingClassGroupIds = (\n classGroupId: AnyClassGroupIds,\n hasPostfixModifier: boolean,\n ): readonly AnyClassGroupIds[] => {\n if (hasPostfixModifier) {\n const modifierConflicts = conflictingClassGroupModifiers[classGroupId]\n const baseConflicts = conflictingClassGroups[classGroupId]\n\n if (modifierConflicts) {\n if (baseConflicts) {\n // Merge base conflicts with modifier conflicts\n return concatArrays(baseConflicts, modifierConflicts)\n }\n // Only modifier conflicts\n return modifierConflicts\n }\n // Fall back to without postfix if no modifier conflicts\n return baseConflicts || EMPTY_CONFLICTS\n }\n\n return conflictingClassGroups[classGroupId] || EMPTY_CONFLICTS\n }\n\n return {\n getClassGroupId,\n getConflictingClassGroupIds,\n }\n}\n\nconst getGroupRecursive = (\n classParts: string[],\n startIndex: number,\n classPartObject: ClassPartObject,\n): AnyClassGroupIds | undefined => {\n const classPathsLength = classParts.length - startIndex\n if (classPathsLength === 0) {\n return classPartObject.classGroupId\n }\n\n const currentClassPart = classParts[startIndex]!\n const nextClassPartObject = classPartObject.nextPart.get(currentClassPart)\n\n if (nextClassPartObject) {\n const result = getGroupRecursive(classParts, startIndex + 1, nextClassPartObject)\n if (result) return result\n }\n\n const validators = classPartObject.validators\n if (validators === null) {\n return undefined\n }\n\n // Build classRest string efficiently by joining from startIndex onwards\n const classRest =\n startIndex === 0\n ? classParts.join(CLASS_PART_SEPARATOR)\n : classParts.slice(startIndex).join(CLASS_PART_SEPARATOR)\n const validatorsLength = validators.length\n\n for (let i = 0; i < validatorsLength; i++) {\n const validatorObj = validators[i]!\n if (validatorObj.validator(classRest)) {\n return validatorObj.classGroupId\n }\n }\n\n return undefined\n}\n\n/**\n * Get the class group ID for an arbitrary property.\n *\n * @param className - The class name to get the group ID for. Is expected to be string starting with `[` and ending with `]`.\n */\nconst getGroupIdForArbitraryProperty = (className: string): AnyClassGroupIds | undefined =>\n className.slice(1, -1).indexOf(':') === -1\n ? undefined\n : (() => {\n const content = className.slice(1, -1)\n const colonIndex = content.indexOf(':')\n const property = content.slice(0, colonIndex)\n return property ? ARBITRARY_PROPERTY_PREFIX + property : undefined\n })()\n\n/**\n * Exported for testing only\n */\nexport const createClassMap = (config: Config<AnyClassGroupIds, AnyThemeGroupIds>) => {\n const { theme, classGroups } = config\n return processClassGroups(classGroups, theme)\n}\n\n// Split into separate functions to maintain monomorphic call sites\nconst processClassGroups = (\n classGroups: Record<AnyClassGroupIds, ClassGroup<AnyThemeGroupIds>>,\n theme: ThemeObject<AnyThemeGroupIds>,\n): ClassPartObject => {\n const classMap = createClassPartObject()\n\n for (const classGroupId in classGroups) {\n const group = classGroups[classGroupId]!\n processClassesRecursively(group, classMap, classGroupId, theme)\n }\n\n return classMap\n}\n\nconst processClassesRecursively = (\n classGroup: ClassGroup<AnyThemeGroupIds>,\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n theme: ThemeObject<AnyThemeGroupIds>,\n) => {\n const len = classGroup.length\n for (let i = 0; i < len; i++) {\n const classDefinition = classGroup[i]!\n processClassDefinition(classDefinition, classPartObject, classGroupId, theme)\n }\n}\n\n// Split into separate functions for each type to maintain monomorphic call sites\nconst processClassDefinition = (\n classDefinition: ClassGroup<AnyThemeGroupIds>[number],\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n theme: ThemeObject<AnyThemeGroupIds>,\n) => {\n if (typeof classDefinition === 'string') {\n processStringDefinition(classDefinition, classPartObject, classGroupId)\n return\n }\n\n if (typeof classDefinition === 'function') {\n processFunctionDefinition(classDefinition, classPartObject, classGroupId, theme)\n return\n }\n\n processObjectDefinition(\n classDefinition as Record<string, ClassGroup<AnyThemeGroupIds>>,\n classPartObject,\n classGroupId,\n theme,\n )\n}\n\nconst processStringDefinition = (\n classDefinition: string,\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n) => {\n const classPartObjectToEdit =\n classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition)\n classPartObjectToEdit.classGroupId = classGroupId\n}\n\nconst processFunctionDefinition = (\n classDefinition: Function,\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n theme: ThemeObject<AnyThemeGroupIds>,\n) => {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme)\n return\n }\n\n if (classPartObject.validators === null) {\n classPartObject.validators = []\n }\n classPartObject.validators.push(\n createClassValidatorObject(classGroupId, classDefinition as ClassValidator),\n )\n}\n\nconst processObjectDefinition = (\n classDefinition: Record<string, ClassGroup<AnyThemeGroupIds>>,\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n theme: ThemeObject<AnyThemeGroupIds>,\n) => {\n const entries = Object.entries(classDefinition)\n const len = entries.length\n for (let i = 0; i < len; i++) {\n const [key, value] = entries[i]!\n processClassesRecursively(value, getPart(classPartObject, key), classGroupId, theme)\n }\n}\n\nconst getPart = (classPartObject: ClassPartObject, path: string): ClassPartObject => {\n let current = classPartObject\n const parts = path.split(CLASS_PART_SEPARATOR)\n const len = parts.length\n\n for (let i = 0; i < len; i++) {\n const part = parts[i]!\n\n let next = current.nextPart.get(part)\n if (!next) {\n next = createClassPartObject()\n current.nextPart.set(part, next)\n }\n current = next\n }\n\n return current\n}\n\n// Type guard maintains monomorphic check\nconst isThemeGetter = (func: Function): func is ThemeGetter =>\n 'isThemeGetter' in func && (func as ThemeGetter).isThemeGetter === true\n","// Export is needed because TypeScript complains about an error otherwise:\n// Error: …/tailwind-merge/src/config-utils.ts(8,17): semantic error TS4058: Return type of exported function has or is using name 'LruCache' from external module \"…/tailwind-merge/src/lru-cache\" but cannot be named.\nexport interface LruCache<Key extends string, Value> {\n get(key: Key): Value | undefined\n set(key: Key, value: Value): void\n}\n\n// LRU cache implementation using plain objects for simplicity\nexport const createLruCache = <Key extends string, Value>(\n maxCacheSize: number,\n): LruCache<Key, Value> => {\n if (maxCacheSize < 1) {\n return {\n get: () => undefined,\n set: () => {},\n }\n }\n\n let cacheSize = 0\n let cache: Record<Key, Value> = Object.create(null)\n let previousCache: Record<Key, Value> = Object.create(null)\n\n const update = (key: Key, value: Value) => {\n cache[key] = value\n cacheSize++\n\n if (cacheSize > maxCacheSize) {\n cacheSize = 0\n previousCache = cache\n cache = Object.create(null)\n }\n }\n\n return {\n get(key) {\n let value = cache[key]\n\n if (value !== undefined) {\n return value\n }\n if ((value = previousCache[key]) !== undefined) {\n update(key, value)\n return value\n }\n },\n set(key, value) {\n if (key in cache) {\n cache[key] = value\n } else {\n update(key, value)\n }\n },\n }\n}\n","import { AnyConfig, ParsedClassName } from './types'\n\nexport const IMPORTANT_MODIFIER = '!'\n\nconst MODIFIER_SEPARATOR = ':'\nconst EMPTY_MODIFIERS: string[] = []\n\n// Pre-allocated result object shape for consistency\nconst createResultObject = (\n modifiers: string[],\n hasImportantModifier: boolean,\n baseClassName: string,\n maybePostfixModifierPosition?: number,\n isExternal?: boolean,\n): ParsedClassName => ({\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n isExternal,\n})\n\nexport const createParseClassName = (config: AnyConfig) => {\n const { prefix, experimentalParseClassName } = config\n\n /**\n * Parse class name into parts.\n *\n * Inspired by `splitAtTopLevelOnly` used in Tailwind CSS\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js\n */\n let parseClassName = (className: string): ParsedClassName => {\n // Use simple array with push for better performance\n const modifiers: string[] = []\n\n let bracketDepth = 0\n let parenDepth = 0\n let modifierStart = 0\n let postfixModifierPosition: number | undefined\n\n const len = className.length\n for (let index = 0; index < len; index++) {\n const currentCharacter = className[index]!\n\n if (bracketDepth === 0 && parenDepth === 0) {\n if (currentCharacter === MODIFIER_SEPARATOR) {\n modifiers.push(className.slice(modifierStart, index))\n modifierStart = index + 1\n continue\n }\n\n if (currentCharacter === '/') {\n postfixModifierPosition = index\n continue\n }\n }\n\n if (currentCharacter === '[') bracketDepth++\n else if (currentCharacter === ']') bracketDepth--\n else if (currentCharacter === '(') parenDepth++\n else if (currentCharacter === ')') parenDepth--\n }\n\n const baseClassNameWithImportantModifier =\n modifiers.length === 0 ? className : className.slice(modifierStart)\n\n // Inline important modifier check\n let baseClassName = baseClassNameWithImportantModifier\n let hasImportantModifier = false\n\n if (baseClassNameWithImportantModifier.endsWith(IMPORTANT_MODIFIER)) {\n baseClassName = baseClassNameWithImportantModifier.slice(0, -1)\n hasImportantModifier = true\n } else if (\n /**\n * In Tailwind CSS v3 the important modifier was at the start of the base class name. This is still supported for legacy reasons.\n * @see https://github.com/dcastil/tailwind-merge/issues/513#issuecomment-2614029864\n */\n baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER)\n ) {\n baseClassName = baseClassNameWithImportantModifier.slice(1)\n hasImportantModifier = true\n }\n\n const maybePostfixModifierPosition =\n postfixModifierPosition && postfixModifierPosition > modifierStart\n ? postfixModifierPosition - modifierStart\n : undefined\n\n return createResultObject(\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n )\n }\n\n if (prefix) {\n const fullPrefix = prefix + MODIFIER_SEPARATOR\n const parseClassNameOriginal = parseClassName\n parseClassName = (className: string) =>\n className.startsWith(fullPrefix)\n ? parseClassNameOriginal(className.slice(fullPrefix.length))\n : createResultObject(EMPTY_MODIFIERS, false, className, undefined, true)\n }\n\n if (experimentalParseClassName) {\n const parseClassNameOriginal = parseClassName\n parseClassName = (className: string) =>\n experimentalParseClassName({ className, parseClassName: parseClassNameOriginal })\n }\n\n return parseClassName\n}\n","import { AnyConfig } from './types'\n\n/**\n * Sorts modifiers according to following schema:\n * - Predefined modifiers are sorted alphabetically\n * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it\n */\nexport const createSortModifiers = (config: AnyConfig) => {\n // Pre-compute weights for all known modifiers for O(1) comparison\n const modifierWeights = new Map<string, number>()\n\n // Assign weights to sensitive modifiers (highest priority, but preserve order)\n config.orderSensitiveModifiers.forEach((mod, index) => {\n modifierWeights.set(mod, 1000000 + index) // High weights for sensitive mods\n })\n\n return (modifiers: readonly string[]): string[] => {\n const result: string[] = []\n let currentSegment: string[] = []\n\n // Process modifiers in one pass\n for (let i = 0; i < modifiers.length; i++) {\n const modifier = modifiers[i]!\n\n // Check if modifier is sensitive (starts with '[' or in orderSensitiveModifiers)\n const isArbitrary = modifier[0] === '['\n const isOrderSensitive = modifierWeights.has(modifier)\n\n if (isArbitrary || isOrderSensitive) {\n // Sort and flush current segment alphabetically\n if (currentSegment.length > 0) {\n currentSegment.sort()\n result.push(...currentSegment)\n currentSegment = []\n }\n result.push(modifier)\n } else {\n // Regular modifier - add to current segment for batch sorting\n currentSegment.push(modifier)\n }\n }\n\n // Sort and add any remaining segment items\n if (currentSegment.length > 0) {\n currentSegment.sort()\n result.push(...currentSegment)\n }\n\n return result\n }\n}\n","import { createClassGroupUtils } from './class-group-utils'\nimport { createLruCache } from './lru-cache'\nimport { createParseClassName } from './parse-class-name'\nimport { createSortModifiers } from './sort-modifiers'\nimport { AnyClassGroupIds, AnyConfig } from './types'\n\nexport type ConfigUtils = ReturnType<typeof createConfigUtils>\n\nexport const createConfigUtils = (config: AnyConfig) => ({\n cache: createLruCache<string, string>(config.cacheSize),\n parseClassName: createParseClassName(config),\n sortModifiers: createSortModifiers(config),\n postfixLookupClassGroupIds: createPostfixLookupClassGroupIds(config),\n ...createClassGroupUtils(config),\n})\n\nconst createPostfixLookupClassGroupIds = (config: AnyConfig) => {\n const lookup: Partial<Record<AnyClassGroupIds, true>> = Object.create(null)\n const classGroupIds = config.postfixLookupClassGroups\n\n if (classGroupIds) {\n for (let i = 0; i < classGroupIds.length; i++) {\n lookup[classGroupIds[i]!] = true\n }\n }\n\n return lookup\n}\n","import { ConfigUtils } from './config-utils'\nimport { IMPORTANT_MODIFIER } from './parse-class-name'\n\nconst SPLIT_CLASSES_REGEX = /\\s+/\n\nexport const mergeClassList = (classList: string, configUtils: ConfigUtils) => {\n const {\n parseClassName,\n getClassGroupId,\n getConflictingClassGroupIds,\n sortModifiers,\n postfixLookupClassGroupIds,\n } = configUtils\n\n /**\n * Set of classGroupIds in following format:\n * `{importantModifier}{variantModifiers}{classGroupId}`\n * @example 'float'\n * @example 'hover:focus:bg-color'\n * @example 'md:!pr'\n */\n const classGroupsInConflict: string[] = []\n const classNames = classList.trim().split(SPLIT_CLASSES_REGEX)\n\n let result = ''\n\n for (let index = classNames.length - 1; index >= 0; index -= 1) {\n const originalClassName = classNames[index]!\n\n const {\n isExternal,\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n } = parseClassName(originalClassName)\n\n if (isExternal) {\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n let hasPostfixModifier = !!maybePostfixModifierPosition\n let classGroupId: ReturnType<typeof getClassGroupId>\n\n if (hasPostfixModifier) {\n const baseClassNameWithoutPostfix = baseClassName.substring(\n 0,\n maybePostfixModifierPosition,\n )\n classGroupId = getClassGroupId(baseClassNameWithoutPostfix)\n\n const classGroupIdWithPostfix =\n classGroupId && postfixLookupClassGroupIds[classGroupId]\n ? getClassGroupId(baseClassName)\n : undefined\n if (classGroupIdWithPostfix && classGroupIdWithPostfix !== classGroupId) {\n classGroupId = classGroupIdWithPostfix\n hasPostfixModifier = false\n }\n } else {\n classGroupId = getClassGroupId(baseClassName)\n }\n\n if (!classGroupId) {\n if (!hasPostfixModifier) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n classGroupId = getClassGroupId(baseClassName)\n\n if (!classGroupId) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n hasPostfixModifier = false\n }\n\n // Fast path: skip sorting for empty or single modifier\n const variantModifier =\n modifiers.length === 0\n ? ''\n : modifiers.length === 1\n ? modifiers[0]!\n : sortModifiers(modifiers).join(':')\n\n const modifierId = hasImportantModifier\n ? variantModifier + IMPORTANT_MODIFIER\n : variantModifier\n\n const classId = modifierId + classGroupId\n\n if (classGroupsInConflict.indexOf(classId) > -1) {\n // Tailwind class omitted due to conflict\n continue\n }\n\n classGroupsInConflict.push(classId)\n\n const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier)\n for (let i = 0; i < conflictGroups.length; ++i) {\n const group = conflictGroups[i]!\n classGroupsInConflict.push(modifierId + group)\n }\n\n // Tailwind class not in conflict\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n }\n\n return result\n}\n","/**\n * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.\n *\n * Specifically:\n * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js\n * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts\n *\n * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n */\n\nexport type ClassNameValue = ClassNameArray | string | null | undefined | 0 | 0n | false\ntype ClassNameArray = readonly ClassNameValue[]\n\nexport const twJoin = (...classLists: ClassNameValue[]): string => {\n let index = 0\n let argument: ClassNameValue\n let resolvedValue: string\n let string = ''\n\n while (index < classLists.length) {\n if ((argument = classLists[index++])) {\n if ((resolvedValue = toValue(argument))) {\n string && (string += ' ')\n string += resolvedValue\n }\n }\n }\n return string\n}\n\nconst toValue = (mix: ClassNameArray | string): string => {\n // Fast path for strings\n if (typeof mix === 'string') {\n return mix\n }\n\n let resolvedValue: string\n let string = ''\n\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if ((resolvedValue = toValue(mix[k] as ClassNameArray | string))) {\n string && (string += ' ')\n string += resolvedValue\n }\n }\n }\n\n return string\n}\n","import { createConfigUtils } from './config-utils'\nimport { mergeClassList } from './merge-classlist'\nimport { ClassNameValue, twJoin } from './tw-join'\nimport { AnyConfig } from './types'\n\ntype CreateConfigFirst = () => AnyConfig\ntype CreateConfigSubsequent = (config: AnyConfig) => AnyConfig\ntype TailwindMerge = (...classLists: ClassNameValue[]) => string\ntype ConfigUtils = ReturnType<typeof createConfigUtils>\n\nexport const createTailwindMerge = (\n createConfigFirst: CreateConfigFirst,\n ...createConfigRest: CreateConfigSubsequent[]\n): TailwindMerge => {\n let configUtils: ConfigUtils\n let cacheGet: ConfigUtils['cache']['get']\n let cacheSet: ConfigUtils['cache']['set']\n let functionToCall: (classList: string) => string\n\n const initTailwindMerge = (classList: string) => {\n const config = createConfigRest.reduce(\n (previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig),\n createConfigFirst() as AnyConfig,\n )\n\n configUtils = createConfigUtils(config)\n cacheGet = configUtils.cache.get\n cacheSet = configUtils.cache.set\n functionToCall = tailwindMerge\n\n return tailwindMerge(classList)\n }\n\n const tailwindMerge = (classList: string) => {\n const cachedResult = cacheGet(classList)\n\n if (cachedResult) {\n return cachedResult\n }\n\n const result = mergeClassList(classList, configUtils)\n cacheSet(classList, result)\n\n return result\n }\n\n functionToCall = initTailwindMerge\n\n return (...args: ClassNameValue[]) => functionToCall(twJoin(...args))\n}\n","import { DefaultThemeGroupIds, NoInfer, ThemeGetter, ThemeObject } from './types'\n\nconst fallbackThemeArr: ThemeObject<DefaultThemeGroupIds>[DefaultThemeGroupIds] = []\n\nexport const fromTheme = <\n AdditionalThemeGroupIds extends string = never,\n DefaultThemeGroupIdsInner extends string = DefaultThemeGroupIds,\n>(\n key: NoInfer<DefaultThemeGroupIdsInner | AdditionalThemeGroupIds>,\n): ThemeGetter => {\n const themeGetter = (theme: ThemeObject<DefaultThemeGroupIdsInner | AdditionalThemeGroupIds>) =>\n theme[key] || fallbackThemeArr\n\n themeGetter.isThemeGetter = true as const\n\n return themeGetter\n}\n","const arbitraryValueRegex = /^\\[(?:(\\w[\\w-]*):)?(.+)\\]$/i\nconst arbitraryVariableRegex = /^\\((?:(\\w[\\w-]*):)?(.+)\\)$/i\nconst fractionRegex = /^\\d+(?:\\.\\d+)?\\/\\d+(?:\\.\\d+)?$/\nconst tshirtUnitRegex = /^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/\nconst lengthUnitRegex =\n /\\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\\b(calc|min|max|clamp)\\(.+\\)|^0$/\nconst colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\\(.+\\)$/\n// Shadow always begins with x and y offset separated by underscore optionally prepended by inset\nconst shadowRegex = /^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/\nconst imageRegex =\n /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/\n\nexport const isFraction = (value: string) => fractionRegex.test(value)\n\nexport const isNumber = (value: string) => !!value && !Number.isNaN(Number(value))\n\nexport const isInteger = (value: string) => !!value && Number.isInteger(Number(value))\n\nexport const isPercent = (value: string) => value.endsWith('%') && isNumber(value.slice(0, -1))\n\nexport const isTshirtSize = (value: string) => tshirtUnitRegex.test(value)\n\nexport const isAny = () => true\n\nconst isLengthOnly = (value: string) =>\n // `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.\n // For example, `hsl(0 0% 0%)` would be classified as a length without this check.\n // I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.\n lengthUnitRegex.test(value) && !colorFunctionRegex.test(value)\n\nconst isNever = () => false\n\nconst isShadow = (value: string) => shadowRegex.test(value)\n\nconst isImage = (value: string) => imageRegex.test(value)\n\nexport const isAnyNonArbitrary = (value: string) =>\n !isArbitraryValue(value) && !isArbitraryVariable(value)\n\nexport const isNamedContainerQuery = (value: string) =>\n value.startsWith('@container') &&\n ((value[10] === '/' && value[11] !== undefined) ||\n (value[11] === 's' && value[16] !== undefined && value.startsWith('-size/', 10)) ||\n (value[11] === 'n' && value[18] !== undefined && value.startsWith('-normal/', 10)))\n\nexport const isArbitrarySize = (value: string) => getIsArbitraryValue(value, isLabelSize, isNever)\n\nexport const isArbitraryValue = (value: string) => arbitraryValueRegex.test(value)\n\nexport const isArbitraryLength = (value: string) =>\n getIsArbitraryValue(value, isLabelLength, isLengthOnly)\n\nexport const isArbitraryNumber = (value: string) =>\n getIsArbitraryValue(value, isLabelNumber, isNumber)\n\nexport const isArbitraryWeight = (value: string) => getIsArbitraryValue(value, isLabelWeight, isAny)\n\nexport const isArbitraryFamilyName = (value: string) =>\n getIsArbitraryValue(value, isLabelFamilyName, isNever)\n\nexport const isArbitraryPosition = (value: string) =>\n getIsArbitraryValue(value, isLabelPosition, isNever)\n\nexport const isArbitraryImage = (value: string) => getIsArbitraryValue(value, isLabelImage, isImage)\n\nexport const isArbitraryShadow = (value: string) =>\n getIsArbitraryValue(value, isLabelShadow, isShadow)\n\nexport const isArbitraryVariable = (value: string) => arbitraryVariableRegex.test(value)\n\nexport const isArbitraryVariableLength = (value: string) =>\n getIsArbitraryVariable(value, isLabelLength)\n\nexport const isArbitraryVariableFamilyName = (value: string) =>\n getIsArbitraryVariable(value, isLabelFamilyName)\n\nexport const isArbitraryVariablePosition = (value: string) =>\n getIsArbitraryVariable(value, isLabelPosition)\n\nexport const isArbitraryVariableSize = (value: string) => getIsArbitraryVariable(value, isLabelSize)\n\nexport const isArbitraryVariableImage = (value: string) =>\n getIsArbitraryVariable(value, isLabelImage)\n\nexport const isArbitraryVariableShadow = (value: string) =>\n getIsArbitraryVariable(value, isLabelShadow, true)\n\nexport const isArbitraryVariableWeight = (value: string) =>\n getIsArbitraryVariable(value, isLabelWeight, true)\n\n// Helpers\n\nconst getIsArbitraryValue = (\n value: string,\n testLabel: (label: string) => boolean,\n testValue: (value: string) => boolean,\n) => {\n const result = arbitraryValueRegex.exec(value)\n\n if (result) {\n if (result[1]) {\n return testLabel(result[1])\n }\n\n return testValue(result[2]!)\n }\n\n return false\n}\n\nconst getIsArbitraryVariable = (\n value: string,\n testLabel: (label: string) => boolean,\n shouldMatchNoLabel = false,\n) => {\n const result = arbitraryVariableRegex.exec(value)\n\n if (result) {\n if (result[1]) {\n return testLabel(result[1])\n }\n return shouldMatchNoLabel\n }\n\n return false\n}\n\n// Labels\n\nconst isLabelPosition = (label: string) => label === 'position' || label === 'percentage'\n\nconst isLabelImage = (label: string) => label === 'image' || label === 'url'\n\nconst isLabelSize = (label: string) => label === 'length' || label === 'size' || label === 'bg-size'\n\nconst isLabelLength = (label: string) => label === 'length'\n\nconst isLabelNumber = (label: string) => label === 'number'\n\nconst isLabelFamilyName = (label: string) => label === 'family-name'\n\nconst isLabelWeight = (label: string) => label === 'number' || label === 'weight'\n\nconst isLabelShadow = (label: string) => label === 'shadow'\n","import { fromTheme } from './from-theme'\nimport { Config, DefaultClassGroupIds, DefaultThemeGroupIds } from './types'\nimport {\n isAny,\n isAnyNonArbitrary,\n isArbitraryFamilyName,\n isArbitraryImage,\n isArbitraryLength,\n isArbitraryNumber,\n isArbitraryPosition,\n isArbitraryShadow,\n isArbitrarySize,\n isArbitraryValue,\n isArbitraryVariable,\n isArbitraryVariableFamilyName,\n isArbitraryVariableImage,\n isArbitraryVariableLength,\n isArbitraryVariablePosition,\n isArbitraryVariableShadow,\n isArbitraryVariableSize,\n isArbitraryVariableWeight,\n isArbitraryWeight,\n isFraction,\n isInteger,\n isNamedContainerQuery,\n isNumber,\n isPercent,\n isTshirtSize,\n} from './validators'\n\nexport const getDefaultConfig = () => {\n /**\n * Theme getters for theme variable namespaces\n * @see https://tailwindcss.com/docs/theme#theme-variable-namespaces\n */\n /***/\n\n const themeColor = fromTheme('color')\n const themeFont = fromTheme('font')\n const themeText = fromTheme('text')\n const themeFontWeight = fromTheme('font-weight')\n const themeTracking = fromTheme('tracking')\n const themeLeading = fromTheme('leading')\n const themeBreakpoint = fromTheme('breakpoint')\n const themeContainer = fromTheme('container')\n const themeSpacing = fromTheme('spacing')\n const themeRadius = fromTheme('radius')\n const themeShadow = fromTheme('shadow')\n const themeInsetShadow = fromTheme('inset-shadow')\n const themeTextShadow = fromTheme('text-shadow')\n const themeDropShadow = fromTheme('drop-shadow')\n const themeBlur = fromTheme('blur')\n const themePerspective = fromTheme('perspective')\n const themeAspect = fromTheme('aspect')\n const themeEase = fromTheme('ease')\n const themeAnimate = fromTheme('animate')\n\n /**\n * Helpers to avoid repeating the same scales\n *\n * We use functions that create a new array every time they're called instead of static arrays.\n * This ensures that users who modify any scale by mutating the array (e.g. with `array.push(element)`) don't accidentally mutate arrays in other parts of the config.\n */\n /***/\n\n const scaleBreak = () =>\n ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'] as const\n const scalePosition = () =>\n [\n 'center',\n 'top',\n 'bottom',\n 'left',\n 'right',\n 'top-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-top',\n 'top-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-top',\n 'bottom-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-bottom',\n 'bottom-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-bottom',\n ] as const\n const scalePositionWithArbitrary = () =>\n [...scalePosition(), isArbitraryVariable, isArbitraryValue] as const\n const scaleOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'] as const\n const scaleOverscroll = () => ['auto', 'contain', 'none'] as const\n const scaleUnambiguousSpacing = () =>\n [isArbitraryVariable, isArbitraryValue, themeSpacing] as const\n const scaleInset = () => [isFraction, 'full', 'auto', ...scaleUnambiguousSpacing()] as const\n const scaleGridTemplateColsRows = () =>\n [isInteger, 'none', 'subgrid', isArbitraryVariable, isArbitraryValue] as const\n const scaleGridColRowStartAndEnd = () =>\n [\n 'auto',\n { span: ['full', isInteger, isArbitraryVariable, isArbitraryValue] },\n isInteger,\n isArbitraryVariable,\n isArbitraryValue,\n ] as const\n const scaleGridColRowStartOrEnd = () =>\n [isInteger, 'auto', isArbitraryVariable, isArbitraryValue] as const\n const scaleGridAutoColsRows = () =>\n ['auto', 'min', 'max', 'fr', isArbitraryVariable, isArbitraryValue] as const\n const scaleAlignPrimaryAxis = () =>\n [\n 'start',\n 'end',\n 'center',\n 'between',\n 'around',\n 'evenly',\n 'stretch',\n 'baseline',\n 'center-safe',\n 'end-safe',\n ] as const\n const scaleAlignSecondaryAxis = () =>\n ['start', 'end', 'center', 'stretch', 'center-safe', 'end-safe'] as const\n const scaleMargin = () => ['auto', ...scaleUnambiguousSpacing()] as const\n const scaleSizing = () =>\n [\n isFraction,\n 'auto',\n 'full',\n 'dvw',\n 'dvh',\n 'lvw',\n 'lvh',\n 'svw',\n 'svh',\n 'min',\n 'max',\n 'fit',\n ...scaleUnambiguousSpacing(),\n ] as const\n const scaleSizingInline = () =>\n [\n isFraction,\n 'screen',\n 'full',\n 'dvw',\n 'lvw',\n 'svw',\n 'min',\n 'max',\n 'fit',\n ...scaleUnambiguousSpacing(),\n ] as const\n const scaleSizingBlock = () =>\n [\n isFraction,\n 'screen',\n 'full',\n 'lh',\n 'dvh',\n 'lvh',\n 'svh',\n 'min',\n 'max',\n 'fit',\n ...scaleUnambiguousSpacing(),\n ] as const\n const scaleColor = () => [themeColor, isArbitraryVariable, isArbitraryValue] as const\n const scaleBgPosition = () =>\n [\n ...scalePosition(),\n isArbitraryVariablePosition,\n isArbitraryPosition,\n { position: [isArbitraryVariable, isArbitraryValue] },\n ] as const\n const scaleBgRepeat = () => ['no-repeat', { repeat: ['', 'x', 'y', 'space', 'round'] }] as const\n const scaleBgSize = () =>\n [\n 'auto',\n 'cover',\n 'contain',\n isArbitraryVariableSize,\n isArbitrarySize,\n { size: [isArbitraryVariable, isArbitraryValue] },\n ] as const\n const scaleGradientStopPosition = () =>\n [isPercent, isArbitraryVariableLength, isArbitraryLength] as const\n const scaleRadius = () =>\n [\n // Deprecated since Tailwind CSS v4.0.0\n '',\n 'none',\n 'full',\n themeRadius,\n isArbitraryVariable,\n isArbitraryValue,\n ] as const\n const scaleBorderWidth = () =>\n ['', isNumber, isArbitraryVariableLength, isArbitraryLength] as const\n const scaleLineStyle = () => ['solid', 'dashed', 'dotted', 'double'] as const\n const scaleBlendMode = () =>\n [\n 'normal',\n 'multiply',\n 'screen',\n 'overlay',\n 'darken',\n 'lighten',\n 'color-dodge',\n 'color-burn',\n 'hard-light',\n 'soft-light',\n 'difference',\n 'exclusion',\n 'hue',\n 'saturation',\n 'color',\n 'luminosity',\n ] as const\n const scaleMaskImagePosition = () =>\n [isNumber, isPercent, isArbitraryVariablePosition, isArbitraryPosition] as const\n const scaleBlur = () =>\n [\n // Deprecated since Tailwind CSS v4.0.0\n '',\n 'none',\n themeBlur,\n isArbitraryVariable,\n isArbitraryValue,\n ] as const\n const scaleRotate = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue] as const\n const scaleScale = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue] as const\n const scaleSkew = () => [isNumber, isArbitraryVariable, isArbitraryValue] as const\n const scaleTranslate = () => [isFraction, 'full', ...scaleUnambiguousSpacing()] as const\n\n return {\n cacheSize: 500,\n theme: {\n animate: ['spin', 'ping', 'pulse', 'bounce'],\n aspect: ['video'],\n blur: [isTshirtSize],\n breakpoint: [isTshirtSize],\n color: [isAny],\n container: [isTshirtSize],\n 'drop-shadow': [isTshirtSize],\n ease: ['in', 'out', 'in-out'],\n font: [isAnyNonArbitrary],\n 'font-weight': [\n 'thin',\n 'extralight',\n 'light',\n 'normal',\n 'medium',\n 'semibold',\n 'bold',\n 'extrabold',\n 'black',\n ],\n 'inset-shadow': [isTshirtSize],\n leading: ['none', 'tight', 'snug', 'normal', 'relaxed', 'loose'],\n perspective: ['dramatic', 'near', 'normal', 'midrange', 'distant', 'none'],\n radius: [isTshirtSize],\n shadow: [isTshirtSize],\n spacing: ['px', isNumber],\n text: [isTshirtSize],\n 'text-shadow': [isTshirtSize],\n tracking: ['tighter', 'tight', 'normal', 'wide', 'wider', 'widest'],\n },\n classGroups: {\n // --------------\n // --- Layout ---\n // --------------\n\n /**\n * Aspect Ratio\n * @see https://tailwindcss.com/docs/aspect-ratio\n */\n aspect: [\n {\n aspect: [\n 'auto',\n 'square',\n isFraction,\n isArbitraryValue,\n isArbitraryVariable,\n themeAspect,\n ],\n },\n ],\n /**\n * Container\n * @see https://tailwindcss.com/docs/container\n * @deprecated since Tailwind CSS v4.0.0\n */\n container: ['container'],\n /**\n * Container Type\n * @see https://tailwindcss.com/docs/responsive-design#container-queries\n */\n 'container-type': [\n { '@container': ['', 'normal', 'size', isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Container Name\n * @see https://tailwindcss.com/docs/responsive-design#named-containers\n */\n 'container-named': [isNamedContainerQuery],\n /**\n * Columns\n * @see https://tailwindcss.com/docs/columns\n */\n columns: [\n { columns: [isNumber, isArbitraryValue, isArbitraryVariable, themeContainer] },\n ],\n /**\n * Break After\n * @see https://tailwindcss.com/docs/break-after\n */\n 'break-after': [{ 'break-after': scaleBreak() }],\n /**\n * Break Before\n * @see https://tailwindcss.com/docs/break-before\n */\n 'break-before': [{ 'break-before': scaleBreak() }],\n /**\n * Break Inside\n * @see https://tailwindcss.com/docs/break-inside\n */\n 'break-inside': [{ 'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column'] }],\n /**\n * Box Decoration Break\n * @see https://tailwindcss.com/docs/box-decoration-break\n */\n 'box-decoration': [{ 'box-decoration': ['slice', 'clone'] }],\n /**\n * Box Sizing\n * @see https://tailwindcss.com/docs/box-sizing\n */\n box: [{ box: ['border', 'content'] }],\n /**\n * Display\n * @see https://tailwindcss.com/docs/display\n */\n display: [\n 'block',\n 'inline-block',\n 'inline',\n 'flex',\n 'inline-flex',\n 'table',\n 'inline-table',\n 'table-caption',\n 'table-cell',\n 'table-column',\n 'table-column-group',\n 'table-footer-group',\n 'table-header-group',\n 'table-row-group',\n 'table-row',\n 'flow-root',\n 'grid',\n 'inline-grid',\n 'contents',\n 'list-item',\n 'hidden',\n ],\n /**\n * Screen Reader Only\n * @see https://tailwindcss.com/docs/display#screen-reader-only\n */\n sr: ['sr-only', 'not-sr-only'],\n /**\n * Floats\n * @see https://tailwindcss.com/docs/float\n */\n float: [{ float: ['right', 'left', 'none', 'start', 'end'] }],\n /**\n * Clear\n * @see https://tailwindcss.com/docs/clear\n */\n clear: [{ clear: ['left', 'right', 'both', 'none', 'start', 'end'] }],\n /**\n * Isolation\n * @see https://tailwindcss.com/docs/isolation\n */\n isolation: ['isolate', 'isolation-auto'],\n /**\n * Object Fit\n * @see https://tailwindcss.com/docs/object-fit\n */\n 'object-fit': [{ object: ['contain', 'cover', 'fill', 'none', 'scale-down'] }],\n /**\n * Object Position\n * @see https://tailwindcss.com/docs/object-position\n */\n 'object-position': [{ object: scalePositionWithArbitrary() }],\n /**\n * Overflow\n * @see https://tailwindcss.com/docs/overflow\n */\n overflow: [{ overflow: scaleOverflow() }],\n /**\n * Overflow X\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-x': [{ 'overflow-x': scaleOverflow() }],\n /**\n * Overflow Y\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-y': [{ 'overflow-y': scaleOverflow() }],\n /**\n * Overscroll Behavior\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n overscroll: [{ overscroll: scaleOverscroll() }],\n /**\n * Overscroll Behavior X\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-x': [{ 'overscroll-x': scaleOverscroll() }],\n /**\n * Overscroll Behavior Y\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-y': [{ 'overscroll-y': scaleOverscroll() }],\n /**\n * Position\n * @see https://tailwindcss.com/docs/position\n */\n position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],\n /**\n * Inset\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n inset: [{ inset: scaleInset() }],\n /**\n * Inset Inline\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-x': [{ 'inset-x': scaleInset() }],\n /**\n * Inset Block\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-y': [{ 'inset-y': scaleInset() }],\n /**\n * Inset Inline Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n * @todo class group will be renamed to `inset-s` in next major release\n */\n start: [\n {\n 'inset-s': scaleInset(),\n /**\n * @deprecated since Tailwind CSS v4.2.0 in favor of `inset-s-*` utilities.\n * @see https://github.com/tailwindlabs/tailwindcss/pull/19613\n */\n start: scaleInset(),\n },\n ],\n /**\n * Inset Inline End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n * @todo class group will be renamed to `inset-e` in next major release\n */\n end: [\n {\n 'inset-e': scaleInset(),\n /**\n * @deprecated since Tailwind CSS v4.2.0 in favor of `inset-e-*` utilities.\n * @see https://github.com/tailwindlabs/tailwindcss/pull/19613\n */\n end: scaleInset(),\n },\n ],\n /**\n * Inset Block Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-bs': [{ 'inset-bs': scaleInset() }],\n /**\n * Inset Block End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-be': [{ 'inset-be': scaleInset() }],\n /**\n * Top\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n top: [{ top: scaleInset() }],\n /**\n * Right\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n right: [{ right: scaleInset() }],\n /**\n * Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n bottom: [{ bottom: scaleInset() }],\n /**\n * Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n left: [{ left: scaleInset() }],\n /**\n * Visibility\n * @see https://tailwindcss.com/docs/visibility\n */\n visibility: ['visible', 'invisible', 'collapse'],\n /**\n * Z-Index\n * @see https://tailwindcss.com/docs/z-index\n */\n z: [{ z: [isInteger, 'auto', isArbitraryVariable, isArbitraryValue] }],\n\n // ------------------------\n // --- Flexbox and Grid ---\n // ------------------------\n\n /**\n * Flex Basis\n * @see https://tailwindcss.com/docs/flex-basis\n */\n basis: [\n {\n basis: [\n isFraction,\n 'full',\n 'auto',\n themeContainer,\n ...scaleUnambiguousSpacing(),\n ],\n },\n ],\n /**\n * Flex Direction\n * @see https://tailwindcss.com/docs/flex-direction\n */\n 'flex-direction': [{ flex: ['row', 'row-reverse', 'col', 'col-reverse'] }],\n /**\n * Flex Wrap\n * @see https://tailwindcss.com/docs/flex-wrap\n */\n 'flex-wrap': [{ flex: ['nowrap', 'wrap', 'wrap-reverse'] }],\n /**\n * Flex\n * @see https://tailwindcss.com/docs/flex\n */\n flex: [{ flex: [isNumber, isFraction, 'auto', 'initial', 'none', isArbitraryValue] }],\n /**\n * Flex Grow\n * @see https://tailwindcss.com/docs/flex-grow\n */\n grow: [{ grow: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Flex Shrink\n * @see https://tailwindcss.com/docs/flex-shrink\n */\n shrink: [{ shrink: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Order\n * @see https://tailwindcss.com/docs/order\n */\n order: [\n {\n order: [\n isInteger,\n 'first',\n 'last',\n 'none',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Grid Template Columns\n * @see https://tailwindcss.com/docs/grid-template-columns\n */\n 'grid-cols': [{ 'grid-cols': scaleGridTemplateColsRows() }],\n /**\n * Grid Column Start / End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start-end': [{ col: scaleGridColRowStartAndEnd() }],\n /**\n * Grid Column Start\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start': [{ 'col-start': scaleGridColRowStartOrEnd() }],\n /**\n * Grid Column End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-end': [{ 'col-end': scaleGridColRowStartOrEnd() }],\n /**\n * Grid Template Rows\n * @see https://tailwindcss.com/docs/grid-template-rows\n */\n 'grid-rows': [{ 'grid-rows': scaleGridTemplateColsRows() }],\n /**\n * Grid Row Start / End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start-end': [{ row: scaleGridColRowStartAndEnd() }],\n /**\n * Grid Row Start\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start': [{ 'row-start': scaleGridColRowStartOrEnd() }],\n /**\n * Grid Row End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-end': [{ 'row-end': scaleGridColRowStartOrEnd() }],\n /**\n * Grid Auto Flow\n * @see https://tailwindcss.com/docs/grid-auto-flow\n */\n 'grid-flow': [{ 'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense'] }],\n /**\n * Grid Auto Columns\n * @see https://tailwindcss.com/docs/grid-auto-columns\n */\n 'auto-cols': [{ 'auto-cols': scaleGridAutoColsRows() }],\n /**\n * Grid Auto Rows\n * @see https://tailwindcss.com/docs/grid-auto-rows\n */\n 'auto-rows': [{ 'auto-rows': scaleGridAutoColsRows() }],\n /**\n * Gap\n * @see https://tailwindcss.com/docs/gap\n */\n gap: [{ gap: scaleUnambiguousSpacing() }],\n /**\n * Gap X\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-x': [{ 'gap-x': scaleUnambiguousSpacing() }],\n /**\n * Gap Y\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-y': [{ 'gap-y': scaleUnambiguousSpacing() }],\n /**\n * Justify Content\n * @see https://tailwindcss.com/docs/justify-content\n */\n 'justify-content': [{ justify: [...scaleAlignPrimaryAxis(), 'normal'] }],\n /**\n * Justify Items\n * @see https://tailwindcss.com/docs/justify-items\n */\n 'justify-items': [{ 'justify-items': [...scaleAlignSecondaryAxis(), 'normal'] }],\n /**\n * Justify Self\n * @see https://tailwindcss.com/docs/justify-self\n */\n 'justify-self': [{ 'justify-self': ['auto', ...scaleAlignSecondaryAxis()] }],\n /**\n * Align Content\n * @see https://tailwindcss.com/docs/align-content\n */\n 'align-content': [{ content: ['normal', ...scaleAlignPrimaryAxis()] }],\n /**\n * Align Items\n * @see https://tailwindcss.com/docs/align-items\n */\n 'align-items': [{ items: [...scaleAlignSecondaryAxis(), { baseline: ['', 'last'] }] }],\n /**\n * Align Self\n * @see https://tailwindcss.com/docs/align-self\n */\n 'align-self': [\n { self: ['auto', ...scaleAlignSecondaryAxis(), { baseline: ['', 'last'] }] },\n ],\n /**\n * Place Content\n * @see https://tailwindcss.com/docs/place-content\n */\n 'place-content': [{ 'place-content': scaleAlignPrimaryAxis() }],\n /**\n * Place Items\n * @see https://tailwindcss.com/docs/place-items\n */\n 'place-items': [{ 'place-items': [...scaleAlignSecondaryAxis(), 'baseline'] }],\n /**\n * Place Self\n * @see https://tailwindcss.com/docs/place-self\n */\n 'place-self': [{ 'place-self': ['auto', ...scaleAlignSecondaryAxis()] }],\n // Spacing\n /**\n * Padding\n * @see https://tailwindcss.com/docs/padding\n */\n p: [{ p: scaleUnambiguousSpacing() }],\n /**\n * Padding Inline\n * @see https://tailwindcss.com/docs/padding\n */\n px: [{ px: scaleUnambiguousSpacing() }],\n /**\n * Padding Block\n * @see https://tailwindcss.com/docs/padding\n */\n py: [{ py: scaleUnambiguousSpacing() }],\n /**\n * Padding Inline Start\n * @see https://tailwindcss.com/docs/padding\n */\n ps: [{ ps: scaleUnambiguousSpacing() }],\n /**\n * Padding Inline End\n * @see https://tailwindcss.com/docs/padding\n */\n pe: [{ pe: scaleUnambiguousSpacing() }],\n /**\n * Padding Block Start\n * @see https://tailwindcss.com/docs/padding\n */\n pbs: [{ pbs: scaleUnambiguousSpacing() }],\n /**\n * Padding Block End\n * @see https://tailwindcss.com/docs/padding\n */\n pbe: [{ pbe: scaleUnambiguousSpacing() }],\n /**\n * Padding Top\n * @see https://tailwindcss.com/docs/padding\n */\n pt: [{ pt: scaleUnambiguousSpacing() }],\n /**\n * Padding Right\n * @see https://tailwindcss.com/docs/padding\n */\n pr: [{ pr: scaleUnambiguousSpacing() }],\n /**\n * Padding Bottom\n * @see https://tailwindcss.com/docs/padding\n */\n pb: [{ pb: scaleUnambiguousSpacing() }],\n /**\n * Padding Left\n * @see https://tailwindcss.com/docs/padding\n */\n pl: [{ pl: scaleUnambiguousSpacing() }],\n /**\n * Margin\n * @see https://tailwindcss.com/docs/margin\n */\n m: [{ m: scaleMargin() }],\n /**\n * Margin Inline\n * @see https://tailwindcss.com/docs/margin\n */\n mx: [{ mx: scaleMargin() }],\n /**\n * Margin Block\n * @see https://tailwindcss.com/docs/margin\n */\n my: [{ my: scaleMargin() }],\n /**\n * Margin Inline Start\n * @see https://tailwindcss.com/docs/margin\n */\n ms: [{ ms: scaleMargin() }],\n /**\n * Margin Inline End\n * @see https://tailwindcss.com/docs/margin\n */\n me: [{ me: scaleMargin() }],\n /**\n * Margin Block Start\n * @see https://tailwindcss.com/docs/margin\n */\n mbs: [{ mbs: scaleMargin() }],\n /**\n * Margin Block End\n * @see https://tailwindcss.com/docs/margin\n */\n mbe: [{ mbe: scaleMargin() }],\n /**\n * Margin Top\n * @see https://tailwindcss.com/docs/margin\n */\n mt: [{ mt: scaleMargin() }],\n /**\n * Margin Right\n * @see https://tailwindcss.com/docs/margin\n */\n mr: [{ mr: scaleMargin() }],\n /**\n * Margin Bottom\n * @see https://tailwindcss.com/docs/margin\n */\n mb: [{ mb: scaleMargin() }],\n /**\n * Margin Left\n * @see https://tailwindcss.com/docs/margin\n */\n ml: [{ ml: scaleMargin() }],\n /**\n * Space Between X\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x': [{ 'space-x': scaleUnambiguousSpacing() }],\n /**\n * Space Between X Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x-reverse': ['space-x-reverse'],\n /**\n * Space Between Y\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y': [{ 'space-y': scaleUnambiguousSpacing() }],\n /**\n * Space Between Y Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y-reverse': ['space-y-reverse'],\n\n // --------------\n // --- Sizing ---\n // --------------\n\n /**\n * Size\n * @see https://tailwindcss.com/docs/width#setting-both-width-and-height\n */\n size: [{ size: scaleSizing() }],\n /**\n * Inline Size\n * @see https://tailwindcss.com/docs/width\n */\n 'inline-size': [{ inline: ['auto', ...scaleSizingInline()] }],\n /**\n * Min-Inline Size\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-inline-size': [{ 'min-inline': ['auto', ...scaleSizingInline()] }],\n /**\n * Max-Inline Size\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-inline-size': [{ 'max-inline': ['none', ...scaleSizingInline()] }],\n /**\n * Block Size\n * @see https://tailwindcss.com/docs/height\n */\n 'block-size': [{ block: ['auto', ...scaleSizingBlock()] }],\n /**\n * Min-Block Size\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-block-size': [{ 'min-block': ['auto', ...scaleSizingBlock()] }],\n /**\n * Max-Block Size\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-block-size': [{ 'max-block': ['none', ...scaleSizingBlock()] }],\n /**\n * Width\n * @see https://tailwindcss.com/docs/width\n */\n w: [{ w: [themeContainer, 'screen', ...scaleSizing()] }],\n /**\n * Min-Width\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-w': [\n {\n 'min-w': [\n themeContainer,\n 'screen',\n /** Deprecated. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'none',\n ...scaleSizing(),\n ],\n },\n ],\n /**\n * Max-Width\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-w': [\n {\n 'max-w': [\n themeContainer,\n 'screen',\n 'none',\n /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'prose',\n /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n { screen: [themeBreakpoint] },\n ...scaleSizing(),\n ],\n },\n ],\n /**\n * Height\n * @see https://tailwindcss.com/docs/height\n */\n h: [{ h: ['screen', 'lh', ...scaleSizing()] }],\n /**\n * Min-Height\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-h': [{ 'min-h': ['screen', 'lh', 'none', ...scaleSizing()] }],\n /**\n * Max-Height\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-h': [{ 'max-h': ['screen', 'lh', ...scaleSizing()] }],\n\n // ------------------\n // --- Typography ---\n // ------------------\n\n /**\n * Font Size\n * @see https://tailwindcss.com/docs/font-size\n */\n 'font-size': [\n { text: ['base', themeText, isArbitraryVariableLength, isArbitraryLength] },\n ],\n /**\n * Font Smoothing\n * @see https://tailwindcss.com/docs/font-smoothing\n */\n 'font-smoothing': ['antialiased', 'subpixel-antialiased'],\n /**\n * Font Style\n * @see https://tailwindcss.com/docs/font-style\n */\n 'font-style': ['italic', 'not-italic'],\n /**\n * Font Weight\n * @see https://tailwindcss.com/docs/font-weight\n */\n 'font-weight': [\n {\n font: [themeFontWeight, isArbitraryVariableWeight, isArbitraryWeight],\n },\n ],\n /**\n * Font Stretch\n * @see https://tailwindcss.com/docs/font-stretch\n */\n 'font-stretch': [\n {\n 'font-stretch': [\n 'ultra-condensed',\n 'extra-condensed',\n 'condensed',\n 'semi-condensed',\n 'normal',\n 'semi-expanded',\n 'expanded',\n 'extra-expanded',\n 'ultra-expanded',\n isPercent,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Font Family\n * @see https://tailwindcss.com/docs/font-family\n */\n 'font-family': [\n { font: [isArbitraryVariableFamilyName, isArbitraryFamilyName, themeFont] },\n ],\n /**\n * Font Feature Settings\n * @see https://tailwindcss.com/docs/font-feature-settings\n */\n 'font-features': [{ 'font-features': [isArbitraryValue] }],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-normal': ['normal-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-ordinal': ['ordinal'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-slashed-zero': ['slashed-zero'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-figure': ['lining-nums', 'oldstyle-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-spacing': ['proportional-nums', 'tabular-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],\n /**\n * Letter Spacing\n * @see https://tailwindcss.com/docs/letter-spacing\n */\n tracking: [{ tracking: [themeTracking, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Line Clamp\n * @see https://tailwindcss.com/docs/line-clamp\n */\n 'line-clamp': [\n { 'line-clamp': [isNumber, 'none', isArbitraryVariable, isArbitraryNumber] },\n ],\n /**\n * Line Height\n * @see https://tailwindcss.com/docs/line-height\n */\n leading: [\n {\n leading: [\n /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n themeLeading,\n ...scaleUnambiguousSpacing(),\n ],\n },\n ],\n /**\n * List Style Image\n * @see https://tailwindcss.com/docs/list-style-image\n */\n 'list-image': [{ 'list-image': ['none', isArbitraryVariable, isArbitraryValue] }],\n /**\n * List Style Position\n * @see https://tailwindcss.com/docs/list-style-position\n */\n 'list-style-position': [{ list: ['inside', 'outside'] }],\n /**\n * List Style Type\n * @see https://tailwindcss.com/docs/list-style-type\n */\n 'list-style-type': [\n { list: ['disc', 'decimal', 'none', isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Text Alignment\n * @see https://tailwindcss.com/docs/text-align\n */\n 'text-alignment': [{ text: ['left', 'center', 'right', 'justify', 'start', 'end'] }],\n /**\n * Placeholder Color\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://v3.tailwindcss.com/docs/placeholder-color\n */\n 'placeholder-color': [{ placeholder: scaleColor() }],\n /**\n * Text Color\n * @see https://tailwindcss.com/docs/text-color\n */\n 'text-color': [{ text: scaleColor() }],\n /**\n * Text Decoration\n * @see https://tailwindcss.com/docs/text-decoration\n */\n 'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],\n /**\n * Text Decoration Style\n * @see https://tailwindcss.com/docs/text-decoration-style\n */\n 'text-decoration-style': [{ decoration: [...scaleLineStyle(), 'wavy'] }],\n /**\n * Text Decoration Thickness\n * @see https://tailwindcss.com/docs/text-decoration-thickness\n */\n 'text-decoration-thickness': [\n {\n decoration: [\n isNumber,\n 'from-font',\n 'auto',\n isArbitraryVariable,\n isArbitraryLength,\n ],\n },\n ],\n /**\n * Text Decoration Color\n * @see https://tailwindcss.com/docs/text-decoration-color\n */\n 'text-decoration-color': [{ decoration: scaleColor() }],\n /**\n * Text Underline Offset\n * @see https://tailwindcss.com/docs/text-underline-offset\n */\n 'underline-offset': [\n { 'underline-offset': [isNumber, 'auto', isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Text Transform\n * @see https://tailwindcss.com/docs/text-transform\n */\n 'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],\n /**\n * Text Overflow\n * @see https://tailwindcss.com/docs/text-overflow\n */\n 'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],\n /**\n * Text Wrap\n * @see https://tailwindcss.com/docs/text-wrap\n */\n 'text-wrap': [{ text: ['wrap', 'nowrap', 'balance', 'pretty'] }],\n /**\n * Text Indent\n * @see https://tailwindcss.com/docs/text-indent\n */\n indent: [{ indent: scaleUnambiguousSpacing() }],\n /**\n * Tab Size\n * @see https://tailwindcss.com/docs/tab-size\n */\n 'tab-size': [{ tab: [isInteger, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Vertical Alignment\n * @see https://tailwindcss.com/docs/vertical-align\n */\n 'vertical-align': [\n {\n align: [\n 'baseline',\n 'top',\n 'middle',\n 'bottom',\n 'text-top',\n 'text-bottom',\n 'sub',\n 'super',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Whitespace\n * @see https://tailwindcss.com/docs/whitespace\n */\n whitespace: [\n { whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces'] },\n ],\n /**\n * Word Break\n * @see https://tailwindcss.com/docs/word-break\n */\n break: [{ break: ['normal', 'words', 'all', 'keep'] }],\n /**\n * Overflow Wrap\n * @see https://tailwindcss.com/docs/overflow-wrap\n */\n wrap: [{ wrap: ['break-word', 'anywhere', 'normal'] }],\n /**\n * Hyphens\n * @see https://tailwindcss.com/docs/hyphens\n */\n hyphens: [{ hyphens: ['none', 'manual', 'auto'] }],\n /**\n * Content\n * @see https://tailwindcss.com/docs/content\n */\n content: [{ content: ['none', isArbitraryVariable, isArbitraryValue] }],\n\n // -------------------\n // --- Backgrounds ---\n // -------------------\n\n /**\n * Background Attachment\n * @see https://tailwindcss.com/docs/background-attachment\n */\n 'bg-attachment': [{ bg: ['fixed', 'local', 'scroll'] }],\n /**\n * Background Clip\n * @see https://tailwindcss.com/docs/background-clip\n */\n 'bg-clip': [{ 'bg-clip': ['border', 'padding', 'content', 'text'] }],\n /**\n * Background Origin\n * @see https://tailwindcss.com/docs/background-origin\n */\n 'bg-origin': [{ 'bg-origin': ['border', 'padding', 'content'] }],\n /**\n * Background Position\n * @see https://tailwindcss.com/docs/background-position\n */\n 'bg-position': [{ bg: scaleBgPosition() }],\n /**\n * Background Repeat\n * @see https://tailwindcss.com/docs/background-repeat\n */\n 'bg-repeat': [{ bg: scaleBgRepeat() }],\n /**\n * Background Size\n * @see https://tailwindcss.com/docs/background-size\n */\n 'bg-size': [{ bg: scaleBgSize() }],\n /**\n * Background Image\n * @see https://tailwindcss.com/docs/background-image\n */\n 'bg-image': [\n {\n bg: [\n 'none',\n {\n linear: [\n { to: ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl'] },\n isInteger,\n isArbitraryVariable,\n isArbitraryValue,\n ],\n radial: ['', isArbitraryVariable, isArbitraryValue],\n conic: [isInteger, isArbitraryVariable, isArbitraryValue],\n },\n isArbitraryVariableImage,\n isArbitraryImage,\n ],\n },\n ],\n /**\n * Background Color\n * @see https://tailwindcss.com/docs/background-color\n */\n 'bg-color': [{ bg: scaleColor() }],\n /**\n * Gradient Color Stops From Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from-pos': [{ from: scaleGradientStopPosition() }],\n /**\n * Gradient Color Stops Via Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via-pos': [{ via: scaleGradientStopPosition() }],\n /**\n * Gradient Color Stops To Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to-pos': [{ to: scaleGradientStopPosition() }],\n /**\n * Gradient Color Stops From\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from': [{ from: scaleColor() }],\n /**\n * Gradient Color Stops Via\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via': [{ via: scaleColor() }],\n /**\n * Gradient Color Stops To\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to': [{ to: scaleColor() }],\n\n // ---------------\n // --- Borders ---\n // ---------------\n\n /**\n * Border Radius\n * @see https://tailwindcss.com/docs/border-radius\n */\n rounded: [{ rounded: scaleRadius() }],\n /**\n * Border Radius Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-s': [{ 'rounded-s': scaleRadius() }],\n /**\n * Border Radius End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-e': [{ 'rounded-e': scaleRadius() }],\n /**\n * Border Radius Top\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-t': [{ 'rounded-t': scaleRadius() }],\n /**\n * Border Radius Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-r': [{ 'rounded-r': scaleRadius() }],\n /**\n * Border Radius Bottom\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-b': [{ 'rounded-b': scaleRadius() }],\n /**\n * Border Radius Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-l': [{ 'rounded-l': scaleRadius() }],\n /**\n * Border Radius Start Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ss': [{ 'rounded-ss': scaleRadius() }],\n /**\n * Border Radius Start End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-se': [{ 'rounded-se': scaleRadius() }],\n /**\n * Border Radius End End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ee': [{ 'rounded-ee': scaleRadius() }],\n /**\n * Border Radius End Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-es': [{ 'rounded-es': scaleRadius() }],\n /**\n * Border Radius Top Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tl': [{ 'rounded-tl': scaleRadius() }],\n /**\n * Border Radius Top Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tr': [{ 'rounded-tr': scaleRadius() }],\n /**\n * Border Radius Bottom Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-br': [{ 'rounded-br': scaleRadius() }],\n /**\n * Border Radius Bottom Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-bl': [{ 'rounded-bl': scaleRadius() }],\n /**\n * Border Width\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w': [{ border: scaleBorderWidth() }],\n /**\n * Border Width Inline\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-x': [{ 'border-x': scaleBorderWidth() }],\n /**\n * Border Width Block\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-y': [{ 'border-y': scaleBorderWidth() }],\n /**\n * Border Width Inline Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-s': [{ 'border-s': scaleBorderWidth() }],\n /**\n * Border Width Inline End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-e': [{ 'border-e': scaleBorderWidth() }],\n /**\n * Border Width Block Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-bs': [{ 'border-bs': scaleBorderWidth() }],\n /**\n * Border Width Block End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-be': [{ 'border-be': scaleBorderWidth() }],\n /**\n * Border Width Top\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-t': [{ 'border-t': scaleBorderWidth() }],\n /**\n * Border Width Right\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-r': [{ 'border-r': scaleBorderWidth() }],\n /**\n * Border Width Bottom\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-b': [{ 'border-b': scaleBorderWidth() }],\n /**\n * Border Width Left\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-l': [{ 'border-l': scaleBorderWidth() }],\n /**\n * Divide Width X\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x': [{ 'divide-x': scaleBorderWidth() }],\n /**\n * Divide Width X Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x-reverse': ['divide-x-reverse'],\n /**\n * Divide Width Y\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y': [{ 'divide-y': scaleBorderWidth() }],\n /**\n * Divide Width Y Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y-reverse': ['divide-y-reverse'],\n /**\n * Border Style\n * @see https://tailwindcss.com/docs/border-style\n */\n 'border-style': [{ border: [...scaleLineStyle(), 'hidden', 'none'] }],\n /**\n * Divide Style\n * @see https://tailwindcss.com/docs/border-style#setting-the-divider-style\n */\n 'divide-style': [{ divide: [...scaleLineStyle(), 'hidden', 'none'] }],\n /**\n * Border Color\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color': [{ border: scaleColor() }],\n /**\n * Border Color Inline\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-x': [{ 'border-x': scaleColor() }],\n /**\n * Border Color Block\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-y': [{ 'border-y': scaleColor() }],\n /**\n * Border Color Inline Start\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-s': [{ 'border-s': scaleColor() }],\n /**\n * Border Color Inline End\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-e': [{ 'border-e': scaleColor() }],\n /**\n * Border Color Block Start\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-bs': [{ 'border-bs': scaleColor() }],\n /**\n * Border Color Block End\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-be': [{ 'border-be': scaleColor() }],\n /**\n * Border Color Top\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-t': [{ 'border-t': scaleColor() }],\n /**\n * Border Color Right\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-r': [{ 'border-r': scaleColor() }],\n /**\n * Border Color Bottom\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-b': [{ 'border-b': scaleColor() }],\n /**\n * Border Color Left\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-l': [{ 'border-l': scaleColor() }],\n /**\n * Divide Color\n * @see https://tailwindcss.com/docs/divide-color\n */\n 'divide-color': [{ divide: scaleColor() }],\n /**\n * Outline Style\n * @see https://tailwindcss.com/docs/outline-style\n */\n 'outline-style': [{ outline: [...scaleLineStyle(), 'none', 'hidden'] }],\n /**\n * Outline Offset\n * @see https://tailwindcss.com/docs/outline-offset\n */\n 'outline-offset': [\n { 'outline-offset': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Outline Width\n * @see https://tailwindcss.com/docs/outline-width\n */\n 'outline-w': [\n { outline: ['', isNumber, isArbitraryVariableLength, isArbitraryLength] },\n ],\n /**\n * Outline Color\n * @see https://tailwindcss.com/docs/outline-color\n */\n 'outline-color': [{ outline: scaleColor() }],\n\n // ---------------\n // --- Effects ---\n // ---------------\n\n /**\n * Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow\n */\n shadow: [\n {\n shadow: [\n // Deprecated since Tailwind CSS v4.0.0\n '',\n 'none',\n themeShadow,\n isArbitraryVariableShadow,\n isArbitraryShadow,\n ],\n },\n ],\n /**\n * Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-shadow-color\n */\n 'shadow-color': [{ shadow: scaleColor() }],\n /**\n * Inset Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-shadow\n */\n 'inset-shadow': [\n {\n 'inset-shadow': [\n 'none',\n themeInsetShadow,\n isArbitraryVariableShadow,\n isArbitraryShadow,\n ],\n },\n ],\n /**\n * Inset Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-shadow-color\n */\n 'inset-shadow-color': [{ 'inset-shadow': scaleColor() }],\n /**\n * Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-a-ring\n */\n 'ring-w': [{ ring: scaleBorderWidth() }],\n /**\n * Ring Width Inset\n * @see https://v3.tailwindcss.com/docs/ring-width#inset-rings\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-w-inset': ['ring-inset'],\n /**\n * Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-ring-color\n */\n 'ring-color': [{ ring: scaleColor() }],\n /**\n * Ring Offset Width\n * @see https://v3.tailwindcss.com/docs/ring-offset-width\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-w': [{ 'ring-offset': [isNumber, isArbitraryLength] }],\n /**\n * Ring Offset Color\n * @see https://v3.tailwindcss.com/docs/ring-offset-color\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-color': [{ 'ring-offset': scaleColor() }],\n /**\n * Inset Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-ring\n */\n 'inset-ring-w': [{ 'inset-ring': scaleBorderWidth() }],\n /**\n * Inset Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-ring-color\n */\n 'inset-ring-color': [{ 'inset-ring': scaleColor() }],\n /**\n * Text Shadow\n * @see https://tailwindcss.com/docs/text-shadow\n */\n 'text-shadow': [\n {\n 'text-shadow': [\n 'none',\n themeTextShadow,\n isArbitraryVariableShadow,\n isArbitraryShadow,\n ],\n },\n ],\n /**\n * Text Shadow Color\n * @see https://tailwindcss.com/docs/text-shadow#setting-the-shadow-color\n */\n 'text-shadow-color': [{ 'text-shadow': scaleColor() }],\n /**\n * Opacity\n * @see https://tailwindcss.com/docs/opacity\n */\n opacity: [{ opacity: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Mix Blend Mode\n * @see https://tailwindcss.com/docs/mix-blend-mode\n */\n 'mix-blend': [{ 'mix-blend': [...scaleBlendMode(), 'plus-darker', 'plus-lighter'] }],\n /**\n * Background Blend Mode\n * @see https://tailwindcss.com/docs/background-blend-mode\n */\n 'bg-blend': [{ 'bg-blend': scaleBlendMode() }],\n /**\n * Mask Clip\n * @see https://tailwindcss.com/docs/mask-clip\n */\n 'mask-clip': [\n { 'mask-clip': ['border', 'padding', 'content', 'fill', 'stroke', 'view'] },\n 'mask-no-clip',\n ],\n /**\n * Mask Composite\n * @see https://tailwindcss.com/docs/mask-composite\n */\n 'mask-composite': [{ mask: ['add', 'subtract', 'intersect', 'exclude'] }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image-linear-pos': [{ 'mask-linear': [isNumber] }],\n 'mask-image-linear-from-pos': [{ 'mask-linear-from': scaleMaskImagePosition() }],\n 'mask-image-linear-to-pos': [{ 'mask-linear-to': scaleMaskImagePosition() }],\n 'mask-image-linear-from-color': [{ 'mask-linear-from': scaleColor() }],\n 'mask-image-linear-to-color': [{ 'mask-linear-to': scaleColor() }],\n 'mask-image-t-from-pos': [{ 'mask-t-from': scaleMaskImagePosition() }],\n 'mask-image-t-to-pos': [{ 'mask-t-to': scaleMaskImagePosition() }],\n 'mask-image-t-from-color': [{ 'mask-t-from': scaleColor() }],\n 'mask-image-t-to-color': [{ 'mask-t-to': scaleColor() }],\n 'mask-image-r-from-pos': [{ 'mask-r-from': scaleMaskImagePosition() }],\n 'mask-image-r-to-pos': [{ 'mask-r-to': scaleMaskImagePosition() }],\n 'mask-image-r-from-color': [{ 'mask-r-from': scaleColor() }],\n 'mask-image-r-to-color': [{ 'mask-r-to': scaleColor() }],\n 'mask-image-b-from-pos': [{ 'mask-b-from': scaleMaskImagePosition() }],\n 'mask-image-b-to-pos': [{ 'mask-b-to': scaleMaskImagePosition() }],\n 'mask-image-b-from-color': [{ 'mask-b-from': scaleColor() }],\n 'mask-image-b-to-color': [{ 'mask-b-to': scaleColor() }],\n 'mask-image-l-from-pos': [{ 'mask-l-from': scaleMaskImagePosition() }],\n 'mask-image-l-to-pos': [{ 'mask-l-to': scaleMaskImagePosition() }],\n 'mask-image-l-from-color': [{ 'mask-l-from': scaleColor() }],\n 'mask-image-l-to-color': [{ 'mask-l-to': scaleColor() }],\n 'mask-image-x-from-pos': [{ 'mask-x-from': scaleMaskImagePosition() }],\n 'mask-image-x-to-pos': [{ 'mask-x-to': scaleMaskImagePosition() }],\n 'mask-image-x-from-color': [{ 'mask-x-from': scaleColor() }],\n 'mask-image-x-to-color': [{ 'mask-x-to': scaleColor() }],\n 'mask-image-y-from-pos': [{ 'mask-y-from': scaleMaskImagePosition() }],\n 'mask-image-y-to-pos': [{ 'mask-y-to': scaleMaskImagePosition() }],\n 'mask-image-y-from-color': [{ 'mask-y-from': scaleColor() }],\n 'mask-image-y-to-color': [{ 'mask-y-to': scaleColor() }],\n 'mask-image-radial': [{ 'mask-radial': [isArbitraryVariable, isArbitraryValue] }],\n 'mask-image-radial-from-pos': [{ 'mask-radial-from': scaleMaskImagePosition() }],\n 'mask-image-radial-to-pos': [{ 'mask-radial-to': scaleMaskImagePosition() }],\n 'mask-image-radial-from-color': [{ 'mask-radial-from': scaleColor() }],\n 'mask-image-radial-to-color': [{ 'mask-radial-to': scaleColor() }],\n 'mask-image-radial-shape': [{ 'mask-radial': ['circle', 'ellipse'] }],\n 'mask-image-radial-size': [\n { 'mask-radial': [{ closest: ['side', 'corner'], farthest: ['side', 'corner'] }] },\n ],\n 'mask-image-radial-pos': [{ 'mask-radial-at': scalePosition() }],\n 'mask-image-conic-pos': [{ 'mask-conic': [isNumber] }],\n 'mask-image-conic-from-pos': [{ 'mask-conic-from': scaleMaskImagePosition() }],\n 'mask-image-conic-to-pos': [{ 'mask-conic-to': scaleMaskImagePosition() }],\n 'mask-image-conic-from-color': [{ 'mask-conic-from': scaleColor() }],\n 'mask-image-conic-to-color': [{ 'mask-conic-to': scaleColor() }],\n /**\n * Mask Mode\n * @see https://tailwindcss.com/docs/mask-mode\n */\n 'mask-mode': [{ mask: ['alpha', 'luminance', 'match'] }],\n /**\n * Mask Origin\n * @see https://tailwindcss.com/docs/mask-origin\n */\n 'mask-origin': [\n { 'mask-origin': ['border', 'padding', 'content', 'fill', 'stroke', 'view'] },\n ],\n /**\n * Mask Position\n * @see https://tailwindcss.com/docs/mask-position\n */\n 'mask-position': [{ mask: scaleBgPosition() }],\n /**\n * Mask Repeat\n * @see https://tailwindcss.com/docs/mask-repeat\n */\n 'mask-repeat': [{ mask: scaleBgRepeat() }],\n /**\n * Mask Size\n * @see https://tailwindcss.com/docs/mask-size\n */\n 'mask-size': [{ mask: scaleBgSize() }],\n /**\n * Mask Type\n * @see https://tailwindcss.com/docs/mask-type\n */\n 'mask-type': [{ 'mask-type': ['alpha', 'luminance'] }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image': [{ mask: ['none', isArbitraryVariable, isArbitraryValue] }],\n\n // ---------------\n // --- Filters ---\n // ---------------\n\n /**\n * Filter\n * @see https://tailwindcss.com/docs/filter\n */\n filter: [\n {\n filter: [\n // Deprecated since Tailwind CSS v3.0.0\n '',\n 'none',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Blur\n * @see https://tailwindcss.com/docs/blur\n */\n blur: [{ blur: scaleBlur() }],\n /**\n * Brightness\n * @see https://tailwindcss.com/docs/brightness\n */\n brightness: [{ brightness: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Contrast\n * @see https://tailwindcss.com/docs/contrast\n */\n contrast: [{ contrast: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Drop Shadow\n * @see https://tailwindcss.com/docs/drop-shadow\n */\n 'drop-shadow': [\n {\n 'drop-shadow': [\n // Deprecated since Tailwind CSS v4.0.0\n '',\n 'none',\n themeDropShadow,\n isArbitraryVariableShadow,\n isArbitraryShadow,\n ],\n },\n ],\n /**\n * Drop Shadow Color\n * @see https://tailwindcss.com/docs/filter-drop-shadow#setting-the-shadow-color\n */\n 'drop-shadow-color': [{ 'drop-shadow': scaleColor() }],\n /**\n * Grayscale\n * @see https://tailwindcss.com/docs/grayscale\n */\n grayscale: [{ grayscale: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Hue Rotate\n * @see https://tailwindcss.com/docs/hue-rotate\n */\n 'hue-rotate': [{ 'hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Invert\n * @see https://tailwindcss.com/docs/invert\n */\n invert: [{ invert: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Saturate\n * @see https://tailwindcss.com/docs/saturate\n */\n saturate: [{ saturate: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Sepia\n * @see https://tailwindcss.com/docs/sepia\n */\n sepia: [{ sepia: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Backdrop Filter\n * @see https://tailwindcss.com/docs/backdrop-filter\n */\n 'backdrop-filter': [\n {\n 'backdrop-filter': [\n // Deprecated since Tailwind CSS v3.0.0\n '',\n 'none',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Backdrop Blur\n * @see https://tailwindcss.com/docs/backdrop-blur\n */\n 'backdrop-blur': [{ 'backdrop-blur': scaleBlur() }],\n /**\n * Backdrop Brightness\n * @see https://tailwindcss.com/docs/backdrop-brightness\n */\n 'backdrop-brightness': [\n { 'backdrop-brightness': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Contrast\n * @see https://tailwindcss.com/docs/backdrop-contrast\n */\n 'backdrop-contrast': [\n { 'backdrop-contrast': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Grayscale\n * @see https://tailwindcss.com/docs/backdrop-grayscale\n */\n 'backdrop-grayscale': [\n { 'backdrop-grayscale': ['', isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Hue Rotate\n * @see https://tailwindcss.com/docs/backdrop-hue-rotate\n */\n 'backdrop-hue-rotate': [\n { 'backdrop-hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Invert\n * @see https://tailwindcss.com/docs/backdrop-invert\n */\n 'backdrop-invert': [\n { 'backdrop-invert': ['', isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Opacity\n * @see https://tailwindcss.com/docs/backdrop-opacity\n */\n 'backdrop-opacity': [\n { 'backdrop-opacity': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Saturate\n * @see https://tailwindcss.com/docs/backdrop-saturate\n */\n 'backdrop-saturate': [\n { 'backdrop-saturate': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Sepia\n * @see https://tailwindcss.com/docs/backdrop-sepia\n */\n 'backdrop-sepia': [\n { 'backdrop-sepia': ['', isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n\n // --------------\n // --- Tables ---\n // --------------\n\n /**\n * Border Collapse\n * @see https://tailwindcss.com/docs/border-collapse\n */\n 'border-collapse': [{ border: ['collapse', 'separate'] }],\n /**\n * Border Spacing\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing': [{ 'border-spacing': scaleUnambiguousSpacing() }],\n /**\n * Border Spacing X\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-x': [{ 'border-spacing-x': scaleUnambiguousSpacing() }],\n /**\n * Border Spacing Y\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-y': [{ 'border-spacing-y': scaleUnambiguousSpacing() }],\n /**\n * Table Layout\n * @see https://tailwindcss.com/docs/table-layout\n */\n 'table-layout': [{ table: ['auto', 'fixed'] }],\n /**\n * Caption Side\n * @see https://tailwindcss.com/docs/caption-side\n */\n caption: [{ caption: ['top', 'bottom'] }],\n\n // ---------------------------------\n // --- Transitions and Animation ---\n // ---------------------------------\n\n /**\n * Transition Property\n * @see https://tailwindcss.com/docs/transition-property\n */\n transition: [\n {\n transition: [\n '',\n 'all',\n 'colors',\n 'opacity',\n 'shadow',\n 'transform',\n 'none',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Transition Behavior\n * @see https://tailwindcss.com/docs/transition-behavior\n */\n 'transition-behavior': [{ transition: ['normal', 'discrete'] }],\n /**\n * Transition Duration\n * @see https://tailwindcss.com/docs/transition-duration\n */\n duration: [{ duration: [isNumber, 'initial', isArbitraryVariable, isArbitraryValue] }],\n /**\n * Transition Timing Function\n * @see https://tailwindcss.com/docs/transition-timing-function\n */\n ease: [\n { ease: ['linear', 'initial', themeEase, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Transition Delay\n * @see https://tailwindcss.com/docs/transition-delay\n */\n delay: [{ delay: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Animation\n * @see https://tailwindcss.com/docs/animation\n */\n animate: [{ animate: ['none', themeAnimate, isArbitraryVariable, isArbitraryValue] }],\n\n // ------------------\n // --- Transforms ---\n // ------------------\n\n /**\n * Backface Visibility\n * @see https://tailwindcss.com/docs/backface-visibility\n */\n backface: [{ backface: ['hidden', 'visible'] }],\n /**\n * Perspective\n * @see https://tailwindcss.com/docs/perspective\n */\n perspective: [\n { perspective: [themePerspective, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Perspective Origin\n * @see https://tailwindcss.com/docs/perspective-origin\n */\n 'perspective-origin': [{ 'perspective-origin': scalePositionWithArbitrary() }],\n /**\n * Rotate\n * @see https://tailwindcss.com/docs/rotate\n */\n rotate: [{ rotate: scaleRotate() }],\n /**\n * Rotate X\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-x': [{ 'rotate-x': scaleRotate() }],\n /**\n * Rotate Y\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-y': [{ 'rotate-y': scaleRotate() }],\n /**\n * Rotate Z\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-z': [{ 'rotate-z': scaleRotate() }],\n /**\n * Scale\n * @see https://tailwindcss.com/docs/scale\n */\n scale: [{ scale: scaleScale() }],\n /**\n * Scale X\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-x': [{ 'scale-x': scaleScale() }],\n /**\n * Scale Y\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-y': [{ 'scale-y': scaleScale() }],\n /**\n * Scale Z\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-z': [{ 'scale-z': scaleScale() }],\n /**\n * Scale 3D\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-3d': ['scale-3d'],\n /**\n * Skew\n * @see https://tailwindcss.com/docs/skew\n */\n skew: [{ skew: scaleSkew() }],\n /**\n * Skew X\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-x': [{ 'skew-x': scaleSkew() }],\n /**\n * Skew Y\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-y': [{ 'skew-y': scaleSkew() }],\n /**\n * Transform\n * @see https://tailwindcss.com/docs/transform\n */\n transform: [\n { transform: [isArbitraryVariable, isArbitraryValue, '', 'none', 'gpu', 'cpu'] },\n ],\n /**\n * Transform Origin\n * @see https://tailwindcss.com/docs/transform-origin\n */\n 'transform-origin': [{ origin: scalePositionWithArbitrary() }],\n /**\n * Transform Style\n * @see https://tailwindcss.com/docs/transform-style\n */\n 'transform-style': [{ transform: ['3d', 'flat'] }],\n /**\n * Translate\n * @see https://tailwindcss.com/docs/translate\n */\n translate: [{ translate: scaleTranslate() }],\n /**\n * Translate X\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-x': [{ 'translate-x': scaleTranslate() }],\n /**\n * Translate Y\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-y': [{ 'translate-y': scaleTranslate() }],\n /**\n * Translate Z\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-z': [{ 'translate-z': scaleTranslate() }],\n /**\n * Translate None\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-none': ['translate-none'],\n /**\n * Zoom\n * @see https://tailwindcss.com/docs/zoom\n */\n zoom: [{ zoom: [isInteger, isArbitraryVariable, isArbitraryValue] }],\n\n // ---------------------\n // --- Interactivity ---\n // ---------------------\n\n /**\n * Accent Color\n * @see https://tailwindcss.com/docs/accent-color\n */\n accent: [{ accent: scaleColor() }],\n /**\n * Appearance\n * @see https://tailwindcss.com/docs/appearance\n */\n appearance: [{ appearance: ['none', 'auto'] }],\n /**\n * Caret Color\n * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities\n */\n 'caret-color': [{ caret: scaleColor() }],\n /**\n * Color Scheme\n * @see https://tailwindcss.com/docs/color-scheme\n */\n 'color-scheme': [\n { scheme: ['normal', 'dark', 'light', 'light-dark', 'only-dark', 'only-light'] },\n ],\n /**\n * Cursor\n * @see https://tailwindcss.com/docs/cursor\n */\n cursor: [\n {\n cursor: [\n 'auto',\n 'default',\n 'pointer',\n 'wait',\n 'text',\n 'move',\n 'help',\n 'not-allowed',\n 'none',\n 'context-menu',\n 'progress',\n 'cell',\n 'crosshair',\n 'vertical-text',\n 'alias',\n 'copy',\n 'no-drop',\n 'grab',\n 'grabbing',\n 'all-scroll',\n 'col-resize',\n 'row-resize',\n 'n-resize',\n 'e-resize',\n 's-resize',\n 'w-resize',\n 'ne-resize',\n 'nw-resize',\n 'se-resize',\n 'sw-resize',\n 'ew-resize',\n 'ns-resize',\n 'nesw-resize',\n 'nwse-resize',\n 'zoom-in',\n 'zoom-out',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Field Sizing\n * @see https://tailwindcss.com/docs/field-sizing\n */\n 'field-sizing': [{ 'field-sizing': ['fixed', 'content'] }],\n /**\n * Pointer Events\n * @see https://tailwindcss.com/docs/pointer-events\n */\n 'pointer-events': [{ 'pointer-events': ['auto', 'none'] }],\n /**\n * Resize\n * @see https://tailwindcss.com/docs/resize\n */\n resize: [{ resize: ['none', '', 'y', 'x'] }],\n /**\n * Scroll Behavior\n * @see https://tailwindcss.com/docs/scroll-behavior\n */\n 'scroll-behavior': [{ scroll: ['auto', 'smooth'] }],\n /**\n * Scrollbar Thumb Color\n * @see https://tailwindcss.com/docs/scrollbar-color\n */\n 'scrollbar-thumb-color': [{ 'scrollbar-thumb': scaleColor() }],\n /**\n * Scrollbar Track Color\n * @see https://tailwindcss.com/docs/scrollbar-color\n */\n 'scrollbar-track-color': [{ 'scrollbar-track': scaleColor() }],\n /**\n * Scrollbar Gutter\n * @see https://tailwindcss.com/docs/scrollbar-gutter\n */\n 'scrollbar-gutter': [{ 'scrollbar-gutter': ['auto', 'stable', 'both'] }],\n /**\n * Scrollbar Width\n * @see https://tailwindcss.com/docs/scrollbar-width\n */\n 'scrollbar-w': [{ scrollbar: ['auto', 'thin', 'none'] }],\n /**\n * Scroll Margin\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-m': [{ 'scroll-m': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Inline\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mx': [{ 'scroll-mx': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Block\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-my': [{ 'scroll-my': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Inline Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ms': [{ 'scroll-ms': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Inline End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-me': [{ 'scroll-me': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Block Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mbs': [{ 'scroll-mbs': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Block End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mbe': [{ 'scroll-mbe': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Top\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mt': [{ 'scroll-mt': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Right\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mr': [{ 'scroll-mr': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Bottom\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mb': [{ 'scroll-mb': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Left\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ml': [{ 'scroll-ml': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-p': [{ 'scroll-p': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Inline\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-px': [{ 'scroll-px': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Block\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-py': [{ 'scroll-py': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Inline Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-ps': [{ 'scroll-ps': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Inline End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pe': [{ 'scroll-pe': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Block Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pbs': [{ 'scroll-pbs': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Block End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pbe': [{ 'scroll-pbe': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Top\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pt': [{ 'scroll-pt': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Right\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pr': [{ 'scroll-pr': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Bottom\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pb': [{ 'scroll-pb': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Left\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pl': [{ 'scroll-pl': scaleUnambiguousSpacing() }],\n /**\n * Scroll Snap Align\n * @see https://tailwindcss.com/docs/scroll-snap-align\n */\n 'snap-align': [{ snap: ['start', 'end', 'center', 'align-none'] }],\n /**\n * Scroll Snap Stop\n * @see https://tailwindcss.com/docs/scroll-snap-stop\n */\n 'snap-stop': [{ snap: ['normal', 'always'] }],\n /**\n * Scroll Snap Type\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-type': [{ snap: ['none', 'x', 'y', 'both'] }],\n /**\n * Scroll Snap Type Strictness\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-strictness': [{ snap: ['mandatory', 'proximity'] }],\n /**\n * Touch Action\n * @see https://tailwindcss.com/docs/touch-action\n */\n touch: [{ touch: ['auto', 'none', 'manipulation'] }],\n /**\n * Touch Action X\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-x': [{ 'touch-pan': ['x', 'left', 'right'] }],\n /**\n * Touch Action Y\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-y': [{ 'touch-pan': ['y', 'up', 'down'] }],\n /**\n * Touch Action Pinch Zoom\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-pz': ['touch-pinch-zoom'],\n /**\n * User Select\n * @see https://tailwindcss.com/docs/user-select\n */\n select: [{ select: ['none', 'text', 'all', 'auto'] }],\n /**\n * Will Change\n * @see https://tailwindcss.com/docs/will-change\n */\n 'will-change': [\n {\n 'will-change': [\n 'auto',\n 'scroll',\n 'contents',\n 'transform',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n\n // -----------\n // --- SVG ---\n // -----------\n\n /**\n * Fill\n * @see https://tailwindcss.com/docs/fill\n */\n fill: [{ fill: ['none', ...scaleColor()] }],\n /**\n * Stroke Width\n * @see https://tailwindcss.com/docs/stroke-width\n */\n 'stroke-w': [\n {\n stroke: [\n isNumber,\n isArbitraryVariableLength,\n isArbitraryLength,\n isArbitraryNumber,\n ],\n },\n ],\n /**\n * Stroke\n * @see https://tailwindcss.com/docs/stroke\n */\n stroke: [{ stroke: ['none', ...scaleColor()] }],\n\n // ---------------------\n // --- Accessibility ---\n // ---------------------\n\n /**\n * Forced Color Adjust\n * @see https://tailwindcss.com/docs/forced-color-adjust\n */\n 'forced-color-adjust': [{ 'forced-color-adjust': ['auto', 'none'] }],\n },\n conflictingClassGroups: {\n 'container-named': ['container-type'],\n overflow: ['overflow-x', 'overflow-y'],\n overscroll: ['overscroll-x', 'overscroll-y'],\n inset: [\n 'inset-x',\n 'inset-y',\n 'inset-bs',\n 'inset-be',\n 'start',\n 'end',\n 'top',\n 'right',\n 'bottom',\n 'left',\n ],\n 'inset-x': ['right', 'left'],\n 'inset-y': ['top', 'bottom'],\n flex: ['basis', 'grow', 'shrink'],\n gap: ['gap-x', 'gap-y'],\n p: ['px', 'py', 'ps', 'pe', 'pbs', 'pbe', 'pt', 'pr', 'pb', 'pl'],\n px: ['pr', 'pl'],\n py: ['pt', 'pb'],\n m: ['mx', 'my', 'ms', 'me', 'mbs', 'mbe', 'mt', 'mr', 'mb', 'ml'],\n mx: ['mr', 'ml'],\n my: ['mt', 'mb'],\n size: ['w', 'h'],\n 'font-size': ['leading'],\n 'fvn-normal': [\n 'fvn-ordinal',\n 'fvn-slashed-zero',\n 'fvn-figure',\n 'fvn-spacing',\n 'fvn-fraction',\n ],\n 'fvn-ordinal': ['fvn-normal'],\n 'fvn-slashed-zero': ['fvn-normal'],\n 'fvn-figure': ['fvn-normal'],\n 'fvn-spacing': ['fvn-normal'],\n 'fvn-fraction': ['fvn-normal'],\n 'line-clamp': ['display', 'overflow'],\n rounded: [\n 'rounded-s',\n 'rounded-e',\n 'rounded-t',\n 'rounded-r',\n 'rounded-b',\n 'rounded-l',\n 'rounded-ss',\n 'rounded-se',\n 'rounded-ee',\n 'rounded-es',\n 'rounded-tl',\n 'rounded-tr',\n 'rounded-br',\n 'rounded-bl',\n ],\n 'rounded-s': ['rounded-ss', 'rounded-es'],\n 'rounded-e': ['rounded-se', 'rounded-ee'],\n 'rounded-t': ['rounded-tl', 'rounded-tr'],\n 'rounded-r': ['rounded-tr', 'rounded-br'],\n 'rounded-b': ['rounded-br', 'rounded-bl'],\n 'rounded-l': ['rounded-tl', 'rounded-bl'],\n 'border-spacing': ['border-spacing-x', 'border-spacing-y'],\n 'border-w': [\n 'border-w-x',\n 'border-w-y',\n 'border-w-s',\n 'border-w-e',\n 'border-w-bs',\n 'border-w-be',\n 'border-w-t',\n 'border-w-r',\n 'border-w-b',\n 'border-w-l',\n ],\n 'border-w-x': ['border-w-r', 'border-w-l'],\n 'border-w-y': ['border-w-t', 'border-w-b'],\n 'border-color': [\n 'border-color-x',\n 'border-color-y',\n 'border-color-s',\n 'border-color-e',\n 'border-color-bs',\n 'border-color-be',\n 'border-color-t',\n 'border-color-r',\n 'border-color-b',\n 'border-color-l',\n ],\n 'border-color-x': ['border-color-r', 'border-color-l'],\n 'border-color-y': ['border-color-t', 'border-color-b'],\n translate: ['translate-x', 'translate-y', 'translate-none'],\n 'translate-none': ['translate', 'translate-x', 'translate-y', 'translate-z'],\n 'scroll-m': [\n 'scroll-mx',\n 'scroll-my',\n 'scroll-ms',\n 'scroll-me',\n 'scroll-mbs',\n 'scroll-mbe',\n 'scroll-mt',\n 'scroll-mr',\n 'scroll-mb',\n 'scroll-ml',\n ],\n 'scroll-mx': ['scroll-mr', 'scroll-ml'],\n 'scroll-my': ['scroll-mt', 'scroll-mb'],\n 'scroll-p': [\n 'scroll-px',\n 'scroll-py',\n 'scroll-ps',\n 'scroll-pe',\n 'scroll-pbs',\n 'scroll-pbe',\n 'scroll-pt',\n 'scroll-pr',\n 'scroll-pb',\n 'scroll-pl',\n ],\n 'scroll-px': ['scroll-pr', 'scroll-pl'],\n 'scroll-py': ['scroll-pt', 'scroll-pb'],\n touch: ['touch-x', 'touch-y', 'touch-pz'],\n 'touch-x': ['touch'],\n 'touch-y': ['touch'],\n 'touch-pz': ['touch'],\n },\n conflictingClassGroupModifiers: {\n 'font-size': ['leading'],\n },\n postfixLookupClassGroups: ['container-type'],\n orderSensitiveModifiers: [\n '*',\n '**',\n 'after',\n 'backdrop',\n 'before',\n 'details-content',\n 'file',\n 'first-letter',\n 'first-line',\n 'marker',\n 'placeholder',\n 'selection',\n ],\n } as const satisfies Config<DefaultClassGroupIds, DefaultThemeGroupIds>\n}\n","import { AnyConfig, ConfigExtension, NoInfer } from './types'\n\n/**\n * @param baseConfig Config where other config will be merged into. This object will be mutated.\n * @param configExtension Partial config to merge into the `baseConfig`.\n */\nexport const mergeConfigs = <ClassGroupIds extends string, ThemeGroupIds extends string = never>(\n baseConfig: AnyConfig,\n {\n cacheSize,\n prefix,\n experimentalParseClassName,\n extend = {},\n override = {},\n }: ConfigExtension<ClassGroupIds, ThemeGroupIds>,\n) => {\n overrideProperty(baseConfig, 'cacheSize', cacheSize)\n overrideProperty(baseConfig, 'prefix', prefix)\n overrideProperty(baseConfig, 'experimentalParseClassName', experimentalParseClassName)\n\n overrideConfigProperties(baseConfig.theme, override.theme)\n overrideConfigProperties(baseConfig.classGroups, override.classGroups)\n overrideConfigProperties(baseConfig.conflictingClassGroups, override.conflictingClassGroups)\n overrideConfigProperties(\n baseConfig.conflictingClassGroupModifiers,\n override.conflictingClassGroupModifiers,\n )\n overrideProperty(baseConfig, 'postfixLookupClassGroups', override.postfixLookupClassGroups)\n overrideProperty(baseConfig, 'orderSensitiveModifiers', override.orderSensitiveModifiers)\n\n mergeConfigProperties(baseConfig.theme, extend.theme)\n mergeConfigProperties(baseConfig.classGroups, extend.classGroups)\n mergeConfigProperties(baseConfig.conflictingClassGroups, extend.conflictingClassGroups)\n mergeConfigProperties(\n baseConfig.conflictingClassGroupModifiers,\n extend.conflictingClassGroupModifiers,\n )\n mergeArrayProperties(baseConfig, extend, 'postfixLookupClassGroups')\n mergeArrayProperties(baseConfig, extend, 'orderSensitiveModifiers')\n\n return baseConfig\n}\n\nconst overrideProperty = <T extends object, K extends keyof T>(\n baseObject: T,\n overrideKey: K,\n overrideValue: T[K] | undefined,\n) => {\n if (overrideValue !== undefined) {\n baseObject[overrideKey] = overrideValue\n }\n}\n\nconst overrideConfigProperties = (\n baseObject: Partial<Record<string, readonly unknown[]>>,\n overrideObject: Partial<Record<string, readonly unknown[]>> | undefined,\n) => {\n if (overrideObject) {\n for (const key in overrideObject) {\n overrideProperty(baseObject, key, overrideObject[key])\n }\n }\n}\n\nconst mergeConfigProperties = (\n baseObject: Partial<Record<string, readonly unknown[]>>,\n mergeObject: Partial<Record<string, readonly unknown[]>> | undefined,\n) => {\n if (mergeObject) {\n for (const key in mergeObject) {\n mergeArrayProperties(baseObject, mergeObject, key)\n }\n }\n}\n\nconst mergeArrayProperties = <Key extends string>(\n baseObject: Partial<Record<NoInfer<Key>, readonly unknown[]>>,\n mergeObject: Partial<Record<NoInfer<Key>, readonly unknown[]>>,\n key: Key,\n) => {\n const mergeValue = mergeObject[key]\n\n if (mergeValue !== undefined) {\n baseObject[key] = baseObject[key] ? baseObject[key].concat(mergeValue) : mergeValue\n }\n}\n","import { createTailwindMerge } from './create-tailwind-merge'\nimport { getDefaultConfig } from './default-config'\nimport { mergeConfigs } from './merge-configs'\nimport { AnyConfig, ConfigExtension, DefaultClassGroupIds, DefaultThemeGroupIds } from './types'\n\ntype CreateConfigSubsequent = (config: AnyConfig) => AnyConfig\n\nexport const extendTailwindMerge = <\n AdditionalClassGroupIds extends string = never,\n AdditionalThemeGroupIds extends string = never,\n>(\n configExtension:\n | ConfigExtension<\n DefaultClassGroupIds | AdditionalClassGroupIds,\n DefaultThemeGroupIds | AdditionalThemeGroupIds\n >\n | CreateConfigSubsequent,\n ...createConfig: CreateConfigSubsequent[]\n) =>\n typeof configExtension === 'function'\n ? createTailwindMerge(getDefaultConfig, configExtension, ...createConfig)\n : createTailwindMerge(\n () => mergeConfigs(getDefaultConfig(), configExtension),\n ...createConfig,\n )\n","import { createTailwindMerge } from './create-tailwind-merge'\nimport { getDefaultConfig } from './default-config'\n\nexport const twMerge = createTailwindMerge(getDefaultConfig)\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","/**\n * Copyright 2022 Joe Bell. All rights reserved.\n *\n * This file is licensed to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR REPRESENTATIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */ import { clsx } from \"clsx\";\nconst falsyToString = (value)=>typeof value === \"boolean\" ? `${value}` : value === 0 ? \"0\" : value;\nexport const cx = clsx;\nexport const cva = (base, config)=>(props)=>{\n var _config_compoundVariants;\n if ((config === null || config === void 0 ? void 0 : config.variants) == null) return cx(base, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);\n const { variants, defaultVariants } = config;\n const getVariantClassNames = Object.keys(variants).map((variant)=>{\n const variantProp = props === null || props === void 0 ? void 0 : props[variant];\n const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant];\n if (variantProp === null) return null;\n const variantKey = falsyToString(variantProp) || falsyToString(defaultVariantProp);\n return variants[variant][variantKey];\n });\n const propsWithoutUndefined = props && Object.entries(props).reduce((acc, param)=>{\n let [key, value] = param;\n if (value === undefined) {\n return acc;\n }\n acc[key] = value;\n return acc;\n }, {});\n const getCompoundVariantClassNames = config === null || config === void 0 ? void 0 : (_config_compoundVariants = config.compoundVariants) === null || _config_compoundVariants === void 0 ? void 0 : _config_compoundVariants.reduce((acc, param)=>{\n let { class: cvClass, className: cvClassName, ...compoundVariantOptions } = param;\n return Object.entries(compoundVariantOptions).every((param)=>{\n let [key, value] = param;\n return Array.isArray(value) ? value.includes({\n ...defaultVariants,\n ...propsWithoutUndefined\n }[key]) : ({\n ...defaultVariants,\n ...propsWithoutUndefined\n })[key] === value;\n }) ? [\n ...acc,\n cvClass,\n cvClassName\n ] : acc;\n }, []);\n return cx(base, getVariantClassNames, getCompoundVariantClassNames, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);\n };\n\n","'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { Toggle as TogglePrimitive } from 'radix-ui'\n\nimport { cn } from '../lib/utils'\n\nconst toggleVariants = cva(\n \"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-[color,box-shadow] outline-none hover:bg-muted hover:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: 'bg-transparent border-0',\n outline: 'border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground',\n },\n size: {\n default: 'px-2 py-1',\n sm: 'h-8 min-w-8 px-1.5',\n lg: 'h-10 min-w-10 px-2.5',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nfunction Toggle({\n className,\n variant,\n size,\n ...props\n}: React.ComponentProps<typeof TogglePrimitive.Root> &\n VariantProps<typeof toggleVariants>) {\n return (\n <TogglePrimitive.Root\n data-slot=\"toggle\"\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Toggle, toggleVariants }\n","'use client'\n\nimport * as React from 'react'\nimport { GripVertical } from 'lucide-react'\n\nimport { cn } from '../lib/utils'\n\nconst DragHandle = React.forwardRef<HTMLButtonElement, React.ButtonHTMLAttributes<HTMLButtonElement>>(\n ({ className, type = 'button', ...props }, ref) => {\n return (\n <button\n ref={ref}\n type={type}\n data-slot=\"drag-handle\"\n className={cn(\n 'inline-flex h-7 w-4 shrink-0 items-center justify-center rounded-md transition-all duration-200 max-h-[30px]',\n 'bg-white border border-transparent text-stone-500 shadow-md cursor-grab',\n 'enabled:hover:border enabled:hover:border-stone-200 enabled:hover:text-stone-950',\n 'enabled:active:border enabled:active:border-primary enabled:active:bg-primary-50 enabled:active:text-stone-950 enabled:active:shadow enabled:active:cursor-grabbing',\n 'disabled:cursor-not-allowed disabled:opacity-40 disabled:text-stone-950 disabled:pointer-events-none',\n className\n )}\n {...props}\n >\n <GripVertical className=\"size-4 shrink-0\" aria-hidden=\"true\" />\n </button>\n )\n }\n)\nDragHandle.displayName = 'DragHandle'\n\nexport { DragHandle }\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\n/**\n * Custom/Toolbar shell (Figma 7320:11058).\n * One pill, two fills — text formatting or item actions. No hardcoded colors.\n */\nconst CustomToolbar = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, onMouseDown, ...props }, ref) => (\n <div\n ref={ref}\n data-ohw-toolbar=\"\"\n className={cn(\n // Figma: bg background, radius 8, gap-1, p-0.5, shadow-md — no border\n 'inline-flex h-8 items-center gap-1 rounded-[var(--radius,0.5rem)] bg-background p-0.5 font-sans whitespace-nowrap shadow-md',\n className\n )}\n onMouseDown={(e) => {\n e.stopPropagation()\n onMouseDown?.(e)\n }}\n {...props}\n />\n))\nCustomToolbar.displayName = 'CustomToolbar'\n\n/** Separators belong on the text-format fill only — not item-actions. */\nfunction CustomToolbarDivider({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) {\n return (\n <span\n aria-hidden\n className={cn('block h-6 w-px shrink-0 bg-border', className)}\n {...props}\n />\n )\n}\n\ntype CustomToolbarButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n active?: boolean\n}\n\n/** Figma Toggle: 28×28, radius calc(var(--radius)-2px)=6px, icon 16. */\nconst CustomToolbarButton = React.forwardRef<HTMLButtonElement, CustomToolbarButtonProps>(\n ({ className, active = false, type = 'button', ...props }, ref) => (\n <button\n ref={ref}\n type={type}\n className={cn(\n 'inline-flex size-7 shrink-0 items-center justify-center rounded-[calc(var(--radius,0.5rem)-2px)] text-foreground transition-colors',\n active\n ? 'bg-primary text-primary-foreground'\n : 'bg-transparent hover:bg-muted disabled:cursor-not-allowed disabled:text-muted-foreground disabled:opacity-60',\n className\n )}\n {...props}\n />\n )\n)\nCustomToolbarButton.displayName = 'CustomToolbarButton'\n\nexport { CustomToolbar, CustomToolbarButton, CustomToolbarDivider }\n","'use client'\n\nimport type { ComponentProps, ReactNode } from 'react'\nimport { Link, MoreHorizontal, Plus } from 'lucide-react'\n\nimport {\n CustomToolbar,\n CustomToolbarButton,\n} from './custom-toolbar'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './tooltip'\n\ntype ItemActionToolbarProps = {\n onEditLink?: () => void\n onAddItem?: () => void\n onMore?: () => void\n editLinkDisabled?: boolean\n addItemDisabled?: boolean\n moreDisabled?: boolean\n /** Hide Add item — CTA buttons only show Edit link (prototype). */\n showAddItem?: boolean\n /** Hide More — CTA buttons only show Edit link (prototype). */\n showMore?: boolean\n /** Tooltip placement relative to each icon — Figma uses bottom. */\n tooltipSide?: 'top' | 'bottom' | 'left' | 'right'\n}\n\ntype ToolbarActionTooltipProps = {\n label: string\n side?: 'top' | 'bottom' | 'left' | 'right'\n disabled?: boolean\n buttonProps: ComponentProps<typeof CustomToolbarButton>\n children: ReactNode\n}\n\nfunction ToolbarActionTooltip({\n label,\n side = 'bottom',\n disabled = false,\n buttonProps,\n children,\n}: ToolbarActionTooltipProps) {\n const button = (\n <CustomToolbarButton type=\"button\" aria-label={label} disabled={disabled} {...buttonProps}>\n {children}\n </CustomToolbarButton>\n )\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n {disabled ? <span className=\"inline-flex\">{button}</span> : button}\n </TooltipTrigger>\n <TooltipContent side={side} sideOffset={9}>\n {label}\n </TooltipContent>\n </Tooltip>\n )\n}\n\n/** Item-action fill for Custom/Toolbar — Edit link / Add item / More (no separators). */\nfunction ItemActionToolbar({\n onEditLink,\n onAddItem,\n onMore,\n editLinkDisabled = false,\n addItemDisabled = true,\n moreDisabled = true,\n showAddItem = true,\n showMore = true,\n tooltipSide = 'bottom',\n}: ItemActionToolbarProps) {\n return (\n <TooltipProvider delayDuration={0}>\n <CustomToolbar>\n <ToolbarActionTooltip\n label=\"Edit link\"\n side={tooltipSide}\n disabled={editLinkDisabled}\n buttonProps={{\n onMouseDown: (e) => {\n if (editLinkDisabled) return\n e.preventDefault()\n e.stopPropagation()\n onEditLink?.()\n },\n onClick: (e) => {\n e.preventDefault()\n e.stopPropagation()\n },\n }}\n >\n <Link className=\"size-4 shrink-0\" aria-hidden />\n </ToolbarActionTooltip>\n {showAddItem ? (\n <ToolbarActionTooltip\n label=\"Add item\"\n side={tooltipSide}\n disabled={addItemDisabled}\n buttonProps={{\n onMouseDown: (e) => {\n if (addItemDisabled) return\n e.preventDefault()\n e.stopPropagation()\n onAddItem?.()\n },\n }}\n >\n <Plus className=\"size-4 shrink-0\" aria-hidden />\n </ToolbarActionTooltip>\n ) : null}\n {showMore ? (\n <ToolbarActionTooltip\n label=\"More\"\n side={tooltipSide}\n disabled={moreDisabled}\n buttonProps={{\n onMouseDown: (e) => {\n if (moreDisabled) return\n e.preventDefault()\n e.stopPropagation()\n onMore?.()\n },\n }}\n >\n <MoreHorizontal className=\"size-4 shrink-0\" aria-hidden />\n </ToolbarActionTooltip>\n ) : null}\n </CustomToolbar>\n </TooltipProvider>\n )\n}\n\nexport { ItemActionToolbar }\nexport type { ItemActionToolbarProps }\n","'use client'\n\nimport * as React from 'react'\nimport { Tooltip as TooltipPrimitive } from 'radix-ui'\n\nimport { cn } from '../lib/utils'\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return <TooltipPrimitive.Provider data-slot=\"tooltip-provider\" delayDuration={delayDuration} {...props} />\n}\n\nfunction Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nconst arrowClassBySide = {\n top: 'before:bottom-0 before:left-1/2 before:-translate-x-1/2 before:translate-y-1/2',\n bottom: 'before:top-0 before:left-1/2 before:-translate-x-1/2 before:-translate-y-1/2',\n left: 'before:right-0 before:top-1/2 before:-translate-y-1/2 before:translate-x-1/2',\n right: 'before:left-0 before:top-1/2 before:-translate-y-1/2 before:-translate-x-1/2',\n} as const\n\n/**\n * Tooltip content — CSS caret (not Radix Arrow) so `sideOffset` is the true\n * trigger↔tooltip gap. Default 6px matches item-action toolbar AC.\n */\nfunction TooltipContent({\n className,\n sideOffset = 9,\n side = 'bottom',\n children,\n hideArrow,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content> & { hideArrow?: boolean }) {\n const resolvedSide = (side ?? 'bottom') as keyof typeof arrowClassBySide\n\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n side={side}\n sideOffset={sideOffset}\n className={cn(\n 'relative z-[2147483647] inline-flex w-fit max-w-xs items-center rounded-md bg-foreground px-3 py-1.5 text-xs text-background',\n 'origin-[var(--radix-tooltip-content-transform-origin)] animate-in fade-in-0 zoom-in-95',\n 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',\n 'data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2',\n 'data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2',\n !hideArrow &&\n 'before:pointer-events-none before:absolute before:size-2 before:rotate-45 before:bg-foreground before:content-[\"\"]',\n !hideArrow && arrowClassBySide[resolvedSide],\n className\n )}\n {...props}\n >\n {children}\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\nimport { DragHandle } from './drag-handle'\n\nexport type ItemInteractionState =\n | 'default'\n | 'hover'\n | 'sibling-hint'\n | 'active-top'\n | 'active-bottom'\n | 'dragging'\n\ntype ItemInteractionLayerProps = {\n rect: DOMRect\n state: ItemInteractionState\n elRef?: React.Ref<HTMLDivElement>\n /** Slotted Custom/Toolbar instance (item-action or other fill). */\n toolbar?: React.ReactNode\n showHandle?: boolean\n dragDisabled?: boolean\n dragHandleLabel?: string\n onDragHandleDragStart?: (e: React.DragEvent<HTMLButtonElement>) => void\n onDragHandleDragEnd?: (e: React.DragEvent<HTMLButtonElement>) => void\n /** Press on the item chrome (not handle/toolbar) — starts press-to-drag. */\n onItemPointerDown?: (e: React.PointerEvent<HTMLDivElement>) => void\n /** Click on chrome without a drag — typically enter text edit. */\n onItemClick?: (clientX: number, clientY: number) => void\n /**\n * Full-bleed press-drag surface over the selection.\n * Disable for footer column frames so child links keep grab cursor / hover.\n */\n itemDragSurface?: boolean\n /** Gap between element and chrome border — Figma inset is 4px. */\n chromeGap?: number\n className?: string\n}\n\nconst PRIMARY = 'var(--ohw-primary, #0885FE)'\nconst FOCUS_RING = `0 0 0 4px color-mix(in srgb, ${PRIMARY} 12%, transparent)`\nconst DRAG_SHADOW =\n '0px 4px 6px -1px rgba(0, 0, 0, 0.1), 0px 2px 4px -2px rgba(0, 0, 0, 0.1)'\nconst TOOLBAR_EDGE_MARGIN = 4\n/** Must match OhhwellsBridge SELECTION_CHROME_GAP / TOOLBAR_STROKE_GAP. */\nconst SELECTION_CHROME_GAP = 4\nconst TOOLBAR_STROKE_GAP = 4\n\n/** Keep below link-modal overlay (2147483646) / content (2147483647). */\nfunction getChromeZIndex(state: ItemInteractionState): number {\n switch (state) {\n case 'active-top':\n case 'active-bottom':\n case 'dragging':\n return 2147483644\n case 'hover':\n case 'sibling-hint':\n return 2147483643\n default:\n return 2147483642\n }\n}\n\nfunction getChromeStyle(state: ItemInteractionState): React.CSSProperties {\n switch (state) {\n case 'hover':\n return {\n border: `1.5px dashed ${PRIMARY}`,\n boxShadow: 'none',\n }\n case 'sibling-hint':\n return {\n border: `1.5px dashed color-mix(in srgb, ${PRIMARY} 30%, transparent)`,\n boxShadow: 'none',\n }\n case 'active-top':\n case 'active-bottom':\n return {\n border: `2px solid ${PRIMARY}`,\n boxShadow: FOCUS_RING,\n }\n case 'dragging':\n return {\n border: `2px solid ${PRIMARY}`,\n boxShadow: `${FOCUS_RING}, ${DRAG_SHADOW}`,\n }\n default:\n return {}\n }\n}\n\nfunction ClampedToolbarSlot({\n placement,\n children,\n}: {\n placement: 'top' | 'bottom'\n children: React.ReactNode\n}) {\n const slotRef = React.useRef<HTMLDivElement>(null)\n\n React.useLayoutEffect(() => {\n const slot = slotRef.current\n if (!slot) return\n\n const clamp = () => {\n const toolbar = slot.firstElementChild as HTMLElement | null\n if (!toolbar) return\n const w = toolbar.offsetWidth\n if (w <= 0) return\n const parent = slot.offsetParent as HTMLElement | null\n if (!parent) return\n const parentRect = parent.getBoundingClientRect()\n const centerX = parentRect.left + parentRect.width / 2\n const half = w / 2\n const clampedCenter = Math.max(\n TOOLBAR_EDGE_MARGIN + half,\n Math.min(centerX, window.innerWidth - TOOLBAR_EDGE_MARGIN - half)\n )\n const offsetX = clampedCenter - centerX\n slot.style.transform = `translateX(calc(-50% + ${offsetX}px))`\n }\n\n clamp()\n const ro = new ResizeObserver(clamp)\n ro.observe(slot)\n if (slot.firstElementChild) ro.observe(slot.firstElementChild)\n window.addEventListener('resize', clamp)\n return () => {\n ro.disconnect()\n window.removeEventListener('resize', clamp)\n }\n }, [placement, children])\n\n return (\n <div\n ref={slotRef}\n className={cn(\n 'pointer-events-auto absolute left-1/2',\n placement === 'top' ? 'bottom-full' : 'top-full'\n )}\n style={{\n marginBottom: placement === 'top' ? TOOLBAR_STROKE_GAP : undefined,\n marginTop: placement === 'bottom' ? TOOLBAR_STROKE_GAP : undefined,\n transform: 'translateX(-50%)',\n }}\n data-ohw-item-toolbar-anchor={placement}\n >\n {children}\n </div>\n )\n}\n\nfunction ItemInteractionLayer({\n rect,\n state,\n elRef,\n toolbar,\n showHandle = false,\n dragDisabled = false,\n dragHandleLabel = 'Reorder item',\n onDragHandleDragStart,\n onDragHandleDragEnd,\n onItemPointerDown,\n onItemClick,\n itemDragSurface = true,\n chromeGap = SELECTION_CHROME_GAP,\n className,\n}: ItemInteractionLayerProps) {\n if (state === 'default') return null\n\n const isActive = state === 'active-top' || state === 'active-bottom'\n const isDragging = state === 'dragging'\n const showToolbar = isActive && toolbar\n // Hide handle while dragging via opacity only (see container style). Keep mounted —\n // unmounting or visibility/pointer-events:none on the HTML5 drag source cancels the gesture.\n const showDragHandle = (isActive || isDragging) && showHandle\n const itemDragEnabled =\n itemDragSurface && isActive && showHandle && !isDragging && !dragDisabled\n\n return (\n <div\n ref={elRef}\n data-ohw-item-interaction=\"\"\n data-ohw-item-interaction-state={state}\n className={cn('pointer-events-none', className)}\n style={{\n position: 'fixed',\n top: rect.top - chromeGap,\n left: rect.left - chromeGap,\n width: rect.width + chromeGap * 2,\n height: rect.height + chromeGap * 2,\n zIndex: getChromeZIndex(state),\n }}\n >\n <div\n aria-hidden\n className=\"absolute inset-0 rounded-lg\"\n style={getChromeStyle(state)}\n />\n\n {itemDragEnabled && (\n <div\n data-ohw-item-drag-surface=\"\"\n // Selected (action-toolbar): I-beam — next click enters text edit at caret.\n // Grab stays on the drag handle; press-drag still arms from this surface.\n className=\"pointer-events-auto absolute inset-0 cursor-text rounded-lg\"\n onPointerDown={(e) => {\n if (e.button !== 0) return\n onItemPointerDown?.(e)\n }}\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n // Parent suppresses this when a real press-drag just finished.\n onItemClick?.(e.clientX, e.clientY)\n }}\n />\n )}\n\n {showDragHandle && (\n <div\n data-ohw-drag-handle-container=\"\"\n className=\"pointer-events-auto absolute left-0 top-1/2 z-10 -translate-x-[calc(100%+7px)] -translate-y-1/2\"\n // Opacity only — visibility/pointer-events on the HTML5 drag source cancels the gesture.\n style={isDragging ? { opacity: 0 } : undefined}\n aria-hidden={isDragging || undefined}\n >\n <DragHandle\n draggable={!dragDisabled}\n aria-label={dragHandleLabel}\n disabled={dragDisabled}\n onDragStart={(e) => {\n if (dragDisabled) {\n e.preventDefault()\n return\n }\n // Native ghost is the handle — use a blank image so only in-place chrome shows.\n // Element must be in the document for setDragImage in some browsers.\n const blank = document.createElement('canvas')\n blank.width = 1\n blank.height = 1\n blank.style.cssText = 'position:fixed;left:-9999px;top:-9999px;width:1px;height:1px;pointer-events:none'\n document.body.appendChild(blank)\n try {\n e.dataTransfer.setDragImage(blank, 0, 0)\n } finally {\n requestAnimationFrame(() => blank.remove())\n }\n e.dataTransfer.setData('text/plain', dragHandleLabel)\n e.dataTransfer.effectAllowed = 'move'\n onDragHandleDragStart?.(e)\n }}\n onDragEnd={onDragHandleDragEnd}\n />\n </div>\n )}\n\n {showToolbar && state === 'active-top' && (\n <ClampedToolbarSlot placement=\"top\">{toolbar}</ClampedToolbarSlot>\n )}\n\n {showToolbar && state === 'active-bottom' && (\n <ClampedToolbarSlot placement=\"bottom\">{toolbar}</ClampedToolbarSlot>\n )}\n </div>\n )\n}\n\nexport { ItemInteractionLayer }\nexport type { ItemInteractionLayerProps }\n","'use client'\n\nimport * as React from 'react'\nimport { Film, ImageIcon, Pause, Play, Volume2, VolumeX } from 'lucide-react'\n\nimport { Button } from './button'\n\n/** Matches the editor's previous fade duration exactly. */\nexport const MEDIA_UPLOAD_FADE_MS = 300\n\n/** Inset from the video's top edge for the autoplay/mute bar. */\nconst VIDEO_SETTINGS_BAR_INSET = 8\n\n/**\n * Inline rather than via classes: the bridge's Button ships `text-sm` and the bridge root is\n * `font-sans` (Figtree), both of which would otherwise win inside the customer's document.\n */\nconst OVERLAY_BUTTON_STYLE: React.CSSProperties = {\n pointerEvents: 'auto',\n fontFamily: 'Inter, sans-serif',\n fontSize: 12,\n color: '#000',\n}\n\n/**\n * Byte-for-byte port of the editor's upload skeleton, which was a shadcn `<Skeleton>`\n * (`bg-gray-300`) with `rounded-none` + `.skeleton-shimmer`. That class deliberately kills the\n * default `animate-pulse` (`animation: none !important`) and replaces it with a sweeping\n * highlight on `::after`. Reproduced here with an `ohw-` prefix so the customer site's own CSS\n * cannot collide with it, and with literal values so it does not depend on the customer's\n * Tailwind theme being present.\n */\nconst SKELETON_CSS = `\n@keyframes ohw-media-shimmer {\n 0% { transform: translateX(-100%); }\n 100% { transform: translateX(100%); }\n}\n[data-ohw-media-skeleton] {\n overflow: hidden;\n background-color: #d1d5db; /* tailwind gray-300 */\n}\n[data-ohw-media-skeleton]::after {\n content: \"\";\n position: absolute;\n inset: 0;\n background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.6), transparent);\n animation: ohw-media-shimmer 1.4s infinite;\n}\n`\n\nexport type MediaElementType = 'image' | 'bg-image' | 'video'\n\nexport type VideoSettings = { autoplay?: boolean; muted?: boolean }\n\nexport type MediaHover = {\n key: string\n rect: { top: number; left: number; width: number; height: number }\n elementType: MediaElementType\n isDragOver: boolean\n /**\n * Editable text sits on top of this media (e.g. nav links over a hero bg-image). The overlay\n * still renders, but must not intercept the caret — see `pointerEvents` below.\n */\n hasTextOverlap: boolean\n /** Video only: the element's ACTUAL state, so the toggles never claim something untrue. */\n videoAutoplay?: boolean\n videoMuted?: boolean\n}\n\n/**\n * Editor chrome for replaceable media, rendered INSIDE the iframe.\n *\n * It previously lived in the parent (fo-class), positioned over the iframe from rects shipped\n * across postMessage. That meant it covered the iframe and swallowed the very `dragover` events\n * the bridge needed to track a drag — the drop target and the element were in different\n * documents. Living here, native drag-and-drop simply works, and the rect comes straight from\n * `getBoundingClientRect()` with no marshalling to desync.\n */\nexport function MediaOverlay({\n hover,\n isUploading,\n fadingOut = false,\n onFadeOutComplete,\n onReplace,\n onVideoSettingsChange,\n}: {\n hover: MediaHover\n isUploading: boolean\n fadingOut?: boolean\n onFadeOutComplete?: (key: string) => void\n onReplace: (key: string) => void\n onVideoSettingsChange?: (key: string, settings: VideoSettings) => void\n}) {\n const { rect } = hover\n const skeletonRef = React.useRef<HTMLDivElement>(null)\n const isVideo = hover.elementType === 'video'\n const autoplay = hover.videoAutoplay ?? true\n const muted = hover.videoMuted ?? true\n\n const box: React.CSSProperties = {\n position: 'fixed',\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n zIndex: 2147483646,\n }\n\n // Same fade the editor ran: once the replacement has decoded, dissolve the skeleton rather\n // than popping it out, then unmount.\n React.useEffect(() => {\n if (!isUploading || !fadingOut || !skeletonRef.current) return\n\n const anim = skeletonRef.current.animate([{ opacity: 1 }, { opacity: 0 }], {\n duration: MEDIA_UPLOAD_FADE_MS,\n easing: 'ease-out',\n fill: 'forwards',\n })\n\n anim.finished\n .then(() => onFadeOutComplete?.(hover.key))\n .catch(() => onFadeOutComplete?.(hover.key))\n\n return () => anim.cancel()\n }, [isUploading, fadingOut, onFadeOutComplete, hover.key])\n\n if (isUploading) {\n return (\n <div\n ref={skeletonRef}\n data-ohw-bridge=\"\"\n data-ohw-media-overlay=\"\"\n data-ohw-media-skeleton=\"\"\n aria-hidden\n style={{ ...box, pointerEvents: 'none' }}\n >\n <style>{SKELETON_CSS}</style>\n </div>\n )\n }\n\n // Autoplay / mute toggles, at the video's top-centre. Hidden while a file is dragged over so\n // it can't sit between the cursor and the drop.\n const settingsBar =\n isVideo && !hover.isDragOver ? (\n <div\n data-ohw-bridge=\"\"\n data-ohw-media-overlay=\"\"\n className=\"flex items-center justify-center gap-1.5\"\n style={{\n position: 'fixed',\n top: rect.top + VIDEO_SETTINGS_BAR_INSET,\n left: rect.left,\n width: rect.width,\n zIndex: 2147483647,\n pointerEvents: 'auto',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <Button\n data-ohw-media-overlay=\"\"\n variant=\"outline\"\n size=\"sm\"\n className=\"cursor-pointer hover:bg-background\"\n style={{ ...OVERLAY_BUTTON_STYLE, minWidth: 0, padding: '0 8px' }}\n aria-label={autoplay ? 'Disable autoplay' : 'Enable autoplay'}\n title={autoplay ? 'Autoplay on — click to disable' : 'Autoplay off — click to enable'}\n onMouseDown={(e) => e.preventDefault()}\n onClick={(e) => {\n e.stopPropagation()\n onVideoSettingsChange?.(hover.key, { autoplay: !autoplay })\n }}\n >\n {autoplay ? <Pause size={14} /> : <Play size={14} />}\n </Button>\n <Button\n data-ohw-media-overlay=\"\"\n variant=\"outline\"\n size=\"sm\"\n className=\"cursor-pointer hover:bg-background\"\n style={{ ...OVERLAY_BUTTON_STYLE, minWidth: 0, padding: '0 8px' }}\n aria-label={muted ? 'Unmute video' : 'Mute video'}\n title={muted ? 'Muted — click to unmute' : 'Sound on — click to mute'}\n onMouseDown={(e) => e.preventDefault()}\n onClick={(e) => {\n e.stopPropagation()\n onVideoSettingsChange?.(hover.key, { muted: !muted })\n }}\n >\n {muted ? <VolumeX size={14} /> : <Volume2 size={14} />}\n </Button>\n </div>\n ) : null\n\n // NOTE: deliberately no drag/drop handlers here.\n //\n // The bridge listens for dragover/dragleave/drop on `document` in the CAPTURE phase, and its\n // hit-test (`findImageAtPoint`) is a bbox test, not `elementFromPoint` — so it sees straight\n // through this overlay to the element underneath and handles the drop correctly on its own.\n // Adding React handlers here would make a drop fire twice (document capture, then React\n // bubble) and upload the file twice. Drag-and-drop has exactly one owner: the document.\n return (\n <>\n {settingsBar}\n <div\n data-ohw-bridge=\"\"\n data-ohw-media-overlay=\"\"\n className=\"flex items-center justify-center cursor-pointer\"\n style={{\n ...box,\n // When text overlays this media, let clicks fall THROUGH to the text underneath. In the\n // parent this needed a whole `ow:click-at` round-trip to re-hit-test inside the iframe;\n // in-document, pointer-events does it natively. The button below opts back in, so\n // Replace still works.\n pointerEvents: hover.hasTextOverlap ? 'none' : 'auto',\n boxShadow: 'inset 0 0 0 1.5px var(--color-primary)',\n background: 'color-mix(in srgb, var(--color-primary) 20%, transparent)',\n }}\n onClick={() => onReplace(hover.key)}\n >\n <Button\n data-ohw-media-overlay=\"\"\n variant=\"outline\"\n size=\"sm\"\n // `hover:bg-background` cancels the outline variant's `hover:bg-muted/80` — twMerge drops\n // the losing utility, so the button is visually inert on hover.\n className=\"gap-1.5 cursor-pointer hover:bg-background\"\n style={OVERLAY_BUTTON_STYLE}\n onMouseDown={(e) => e.preventDefault()}\n onClick={(e) => {\n e.stopPropagation()\n onReplace(hover.key)\n }}\n >\n {/* Sized via lucide's `size` prop rather than a Tailwind class, so it can't depend on a\n utility being present in the bridge's build. Scaled to sit with the 12px label. */}\n {isVideo ? <Film size={14} /> : <ImageIcon size={14} />}\n {isVideo ? 'Replace video' : 'Replace image'}\n </Button>\n </div>\n </>\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { Slot } from 'radix-ui'\n\nimport { cn } from '../lib/utils'\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center gap-1 whitespace-nowrap rounded-md text-sm font-medium transition-colors outline-none disabled:pointer-events-none disabled:opacity-50 min-w-[80px] px-3 py-2',\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground hover:opacity-90',\n outline: 'border border-border bg-background text-foreground shadow-sm hover:bg-muted/80',\n ghost: 'min-w-0 px-3 py-2 text-foreground hover:bg-muted/50',\n },\n size: {\n default: 'h-9',\n sm: 'h-8 min-w-[64px] px-2 py-1.5 text-sm',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot.Root : 'button'\n return (\n <Comp\n ref={ref}\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n }\n)\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n","'use client'\n\nimport * as React from 'react'\nimport { GalleryHorizontal } from 'lucide-react'\n\nimport { Button } from './button'\n\nexport type CarouselHover = {\n key: string\n rect: { top: number; left: number; width: number; height: number }\n}\n\n/**\n * Inline (not class-based) for the same reason as MediaOverlay: the bridge's Button ships\n * `text-sm` + `font-sans`, which would otherwise win inside the customer's document.\n */\nconst OVERLAY_BUTTON_STYLE: React.CSSProperties = {\n pointerEvents: 'auto',\n fontFamily: 'Inter, sans-serif',\n fontSize: 12,\n color: '#000',\n}\n\n/**\n * Hover chrome for an editable carousel, rendered INSIDE the iframe over the whole carousel.\n * Uses the same blue ring + tint as MediaOverlay so it reads as \"editable media\", with a centred\n * \"Edit gallery\" button. Clicking anywhere asks the parent to open the gallery modal\n * (replace/add/delete + alt); the parent owns that modal because it holds the upload credentials.\n */\nexport function CarouselOverlay({\n hover,\n onEdit,\n}: {\n hover: CarouselHover\n onEdit: (key: string) => void\n}) {\n const { rect } = hover\n\n return (\n <div\n data-ohw-bridge=\"\"\n data-ohw-carousel-overlay=\"\"\n className=\"flex cursor-pointer items-center justify-center\"\n style={{\n position: 'fixed',\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n zIndex: 2147483646,\n pointerEvents: 'auto',\n boxShadow: 'inset 0 0 0 1.5px var(--color-primary)',\n background: 'color-mix(in srgb, var(--color-primary) 20%, transparent)',\n }}\n onClick={() => onEdit(hover.key)}\n >\n <Button\n data-ohw-carousel-overlay=\"\"\n variant=\"outline\"\n size=\"sm\"\n className=\"cursor-pointer gap-1.5 hover:bg-background\"\n style={OVERLAY_BUTTON_STYLE}\n onMouseDown={(e) => e.preventDefault()}\n onClick={(e) => {\n e.stopPropagation()\n onEdit(hover.key)\n }}\n >\n <GalleryHorizontal size={14} />\n Edit gallery\n </Button>\n </div>\n )\n}\n","const STORAGE_KEY = 'ohw-preserved-search'\n\n/** Persist edit iframe query string across client navigations that drop params. */\nexport function readPreservedSearch(): string {\n if (typeof window === 'undefined') return ''\n const fromUrl = window.location.search\n if (fromUrl && fromUrl !== '?') {\n sessionStorage.setItem(STORAGE_KEY, fromUrl)\n return fromUrl\n }\n return sessionStorage.getItem(STORAGE_KEY) ?? ''\n}\n\nexport function clearPreservedSearch(): void {\n if (typeof window === 'undefined') return\n sessionStorage.removeItem(STORAGE_KEY)\n}\n\nexport function isEditSessionActive(): boolean {\n const search = readPreservedSearch()\n if (!search || search === '?') return false\n const q = search.startsWith('?') ? search.slice(1) : search\n return new URLSearchParams(q).get('mode') === 'edit'\n}\n","export type SectionNode = { id: string; label: string }\n\nexport function titleCaseSectionId(id: string): string {\n return id\n .split('-')\n .filter(Boolean)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ')\n}\n\n/** Collect unique top-level sections from a document fragment (live DOM or parsed HTML).\n * Nested `[data-ohw-section]` markers (if any) are ignored — only page sections are link targets. */\nexport function parseSectionsFromRoot(root: ParentNode): SectionNode[] {\n const seen = new Set<string>()\n const sections: SectionNode[] = []\n\n for (const el of root.querySelectorAll<HTMLElement>('[data-ohw-section]')) {\n const id = el.getAttribute('data-ohw-section') ?? ''\n if (!id || seen.has(id)) continue\n // Skip sections nested inside another section — pickers must target page sections only.\n if (el.parentElement?.closest('[data-ohw-section]')) continue\n seen.add(id)\n const label = el.getAttribute('data-ohw-section-label') ?? titleCaseSectionId(id)\n sections.push({ id, label })\n }\n\n return sections\n}\n\nexport function collectSectionsFromDom(): SectionNode[] {\n if (typeof document === 'undefined') return []\n return parseSectionsFromRoot(document)\n}\n\nexport function parseSectionsFromHtml(html: string): SectionNode[] {\n const doc = new DOMParser().parseFromString(html, 'text/html')\n return parseSectionsFromRoot(doc)\n}\n","import type { LinkPage, LinkSection, SelectedPage, SelectedSection } from './types'\n\nexport function parseTarget(target: string | null | undefined): { pageRoute: string; sectionId: string | null } {\n if (!target) return { pageRoute: '', sectionId: null }\n const hashIndex = target.indexOf('#')\n if (hashIndex === -1) return { pageRoute: target, sectionId: null }\n return {\n pageRoute: target.slice(0, hashIndex),\n sectionId: target.slice(hashIndex + 1) || null,\n }\n}\n\nexport function normalizePath(path: string): string {\n const trimmed = path.trim()\n if (!trimmed) return '/'\n\n try {\n if (/^https?:\\/\\//i.test(trimmed)) {\n return new URL(trimmed).pathname || '/'\n }\n } catch {\n /* external or malformed — keep as-is below */\n }\n\n const withSlash = trimmed.startsWith('/') ? trimmed : `/${trimmed}`\n if (withSlash.length > 1 && withSlash.endsWith('/')) return withSlash.slice(0, -1)\n return withSlash\n}\n\nexport function findPageByPath(pages: LinkPage[], path: string): LinkPage | undefined {\n const normalized = normalizePath(path)\n return pages.find((p) => normalizePath(p.path) === normalized)\n}\n\nexport function inferPageTitleFromPath(path: string): string {\n const normalized = normalizePath(path)\n if (normalized === '/') return 'Home'\n const segment = normalized.split('/').filter(Boolean).pop() ?? ''\n if (!segment) return 'Home'\n return segment\n .split('-')\n .filter(Boolean)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ')\n}\n\nexport function isInternalPath(route: string): boolean {\n const trimmed = route.trim()\n if (!trimmed) return false\n if (/^https?:\\/\\//i.test(trimmed)) return false\n if (trimmed.startsWith('/')) return true\n if (trimmed.includes(' ') || trimmed.includes('.')) return false\n return true\n}\n\nexport function resolvePage(route: string, pages: LinkPage[]): SelectedPage {\n const found = findPageByPath(pages, route)\n if (found) return { path: found.path, title: found.title }\n return { path: normalizePath(route), title: inferPageTitleFromPath(route) }\n}\n\nexport function getSectionsForPath(\n sectionsByPath: Record<string, LinkSection[]> | undefined,\n pageRoute: string\n): LinkSection[] {\n if (!sectionsByPath) return []\n const normalized = normalizePath(pageRoute)\n return sectionsByPath[normalized] ?? sectionsByPath[pageRoute] ?? []\n}\n\nexport function buildTarget(page: SelectedPage, section: SelectedSection | null): string {\n if (section) return `${page.path}#${section.id}`\n return page.path\n}\n\nexport function isValidUrl(urlString: string): boolean {\n try {\n const url = new URL(urlString)\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return false\n const hostname = url.hostname\n if (!hostname || hostname.length === 0) return false\n if (hostname.includes(' ')) return false\n if (hostname === 'localhost') return true\n if (!hostname.includes('.')) return false\n // Reject numeric-only hosts (e.g. \"5\" → https://5 → 0.0.0.5)\n if (!/[a-z]/i.test(hostname)) return false\n return true\n } catch {\n return false\n }\n}\n\nexport function normalizeUrl(value: string): string {\n const trimmed = value.trim()\n if (trimmed.startsWith('http://') || trimmed.startsWith('https://')) return trimmed\n return `https://${trimmed}`\n}\n\nexport function validateUrlInput(value: string, pages: LinkPage[], allPages: LinkPage[]): string {\n const trimmed = value.trim()\n if (!trimmed) return ''\n\n const exactPage = allPages.find((p) => p.title.toLowerCase() === trimmed.toLowerCase())\n if (exactPage) return ''\n\n const hasPrefixMatch = pages.some((p) => p.title.toLowerCase().startsWith(trimmed.toLowerCase()))\n if (hasPrefixMatch) {\n return 'Select a page from the list or enter a valid URL'\n }\n\n const hasScheme = /^https?:\\/\\//i.test(trimmed)\n if (!hasScheme && !trimmed.includes('.')) {\n return 'Please enter a valid URL (e.g., https://example.com)'\n }\n\n if (!isValidUrl(normalizeUrl(trimmed))) {\n return 'Please enter a valid URL (e.g., https://example.com)'\n }\n return ''\n}\n\nexport function getEditModeInitialState(\n target: string | undefined,\n pages: LinkPage[],\n sections: LinkSection[]\n): {\n searchValue: string\n selectedPage: SelectedPage | null\n selectedSection: SelectedSection | null\n step: 'input' | 'sectionPicker' | 'confirmed'\n} {\n const empty = {\n searchValue: '',\n selectedPage: null as SelectedPage | null,\n selectedSection: null as SelectedSection | null,\n step: 'input' as const,\n }\n\n if (!target) return empty\n\n if (isValidUrl(normalizeUrl(target))) {\n return { searchValue: target, selectedPage: null, selectedSection: null, step: 'input' }\n }\n\n const { pageRoute, sectionId } = parseTarget(target)\n\n if (sectionId) {\n if (isInternalPath(pageRoute)) {\n const page = resolvePage(pageRoute, pages)\n const sec = sections.find((s) => s.id === sectionId)\n return {\n searchValue: page.title,\n selectedPage: page,\n selectedSection: sec ? { id: sec.id, label: sec.label } : null,\n step: 'input',\n }\n }\n return { searchValue: pageRoute || target, selectedPage: null, selectedSection: null, step: 'input' }\n }\n\n if (isInternalPath(pageRoute)) {\n const page = resolvePage(pageRoute, pages)\n return {\n searchValue: page.title,\n selectedPage: page,\n selectedSection: null,\n step: 'input',\n }\n }\n\n return { searchValue: target, selectedPage: null, selectedSection: null, step: 'input' }\n}\n\nexport function filterAvailablePages(pages: LinkPage[], existingTargets: string[]): LinkPage[] {\n const taken = new Set(existingTargets)\n return pages.filter((p) => !taken.has(p.path))\n}\n","import { readPreservedSearch } from './session-search'\nimport { parseSectionsFromHtml, type SectionNode } from './sections'\nimport { normalizePath } from '../ui/link-modal/linkModal.utils'\n\nfunction buildPageFetchUrl(path: string): string {\n const normalized = normalizePath(path)\n const search = readPreservedSearch()\n return `${window.location.origin}${normalized}${search}`\n}\n\n/** Optional template manifest at `/ohw-sections.json` (see rebound-template/public). */\nexport async function loadAllSectionsManifest(): Promise<Record<string, SectionNode[]>> {\n const manifest = await loadSectionsManifest()\n return manifest ?? {}\n}\n\nasync function loadSectionsManifest(): Promise<Record<string, SectionNode[]> | null> {\n try {\n const res = await fetch(`${window.location.origin}/ohw-sections.json`, {\n credentials: 'same-origin',\n cache: 'no-store',\n })\n if (!res.ok) return null\n const data = (await res.json()) as Record<string, SectionNode[]>\n return data && typeof data === 'object' ? data : null\n } catch {\n return null\n }\n}\n\nasync function prefetchSectionsFromHtml(paths: string[]): Promise<Record<string, SectionNode[]>> {\n const pairs = await Promise.all(\n paths.map(async (path) => {\n try {\n const res = await fetch(buildPageFetchUrl(path), {\n credentials: 'same-origin',\n cache: 'no-store',\n headers: { Accept: 'text/html' },\n })\n if (!res.ok) return [path, []] as [string, SectionNode[]]\n const html = await res.text()\n return [path, parseSectionsFromHtml(html)] as [string, SectionNode[]]\n } catch {\n return [path, []] as [string, SectionNode[]]\n }\n })\n )\n\n const out: Record<string, SectionNode[]> = {}\n for (const [path, sections] of pairs) {\n if (sections.length > 0) out[path] = sections\n }\n return out\n}\n\n/**\n * Load section markers for all site pages.\n * 1. `/ohw-sections.json` manifest (one request, instant)\n * 2. SSR HTML fetch for any paths still missing\n */\nexport async function prefetchSectionsForPaths(\n paths: string[]\n): Promise<Record<string, SectionNode[]>> {\n const unique = [...new Set(paths.map((p) => normalizePath(p)))]\n const out: Record<string, SectionNode[]> = {}\n\n const manifest = await loadSectionsManifest()\n if (manifest) {\n const keys = unique.length > 0 ? unique : Object.keys(manifest)\n for (const path of keys) {\n const sections = manifest[path]\n if (sections?.length) out[path] = sections\n }\n }\n\n const missing = unique.filter((path) => !out[path]?.length)\n if (missing.length > 0) {\n Object.assign(out, await prefetchSectionsFromHtml(missing))\n }\n\n return out\n}\n\nexport function mergePrefetchedSections(\n prev: Record<string, SectionNode[]>,\n fetched: Record<string, SectionNode[]>,\n livePath: string,\n liveSections: SectionNode[]\n): Record<string, SectionNode[]> {\n const next = { ...prev, ...fetched }\n if (liveSections.length > 0) next[normalizePath(livePath)] = liveSections\n return next\n}\n","const MAX_ATTEMPTS = 12\nconst RETRY_MS = 100\n\n/** Hash fragment from the current URL (without leading `#`). */\nexport function getHashSectionId(): string | null {\n if (typeof window === 'undefined') return null\n const id = window.location.hash.replace(/^#/, '').trim()\n return id || null\n}\n\n/**\n * Scroll to the section whose `data-ohw-section` matches `sectionId`.\n * Retries briefly so client navigations have time to mount section DOM.\n */\nexport function scrollToOhwSection(sectionId: string, behavior: ScrollBehavior = 'smooth'): boolean {\n if (!sectionId || typeof document === 'undefined') return false\n\n const el = document.querySelector<HTMLElement>(`[data-ohw-section=\"${CSS.escape(sectionId)}\"]`)\n if (!el) return false\n\n el.scrollIntoView({ behavior, block: 'start' })\n return true\n}\n\n/** Scroll to the hash target when present; returns true once an element was found. */\nexport function scrollToHashSection(behavior: ScrollBehavior = 'smooth'): boolean {\n const id = getHashSectionId()\n if (!id) return false\n return scrollToOhwSection(id, behavior)\n}\n\n/** Poll until the section node exists (Next.js route transitions) or attempts are exhausted. */\nexport function scrollToHashSectionWhenReady(behavior: ScrollBehavior = 'smooth'): void {\n const id = getHashSectionId()\n if (!id) return\n\n let attempt = 0\n const tick = () => {\n if (scrollToOhwSection(id, behavior)) return\n attempt += 1\n if (attempt < MAX_ATTEMPTS) window.setTimeout(tick, RETRY_MS)\n }\n\n tick()\n}\n","\"use client\";\n\nimport { useEffect, type Ref } from \"react\";\n\nimport { Dialog, DialogContent } from \"../dialog\";\nimport { LinkEditorPanel } from \"./LinkEditorPanel\";\nimport { SectionPickerOverlay } from \"./SectionPickerOverlay\";\nimport type { LinkModalProps } from \"./types\";\nimport { useLinkModalState } from \"./useLinkModalState\";\n\nexport type LinkPopoverProps = LinkModalProps & {\n panelRef?: Ref<HTMLDivElement>;\n /** Visible iframe viewport shell — keeps the dialog centered in the preview pane, not the full page. */\n portalContainer?: HTMLElement | null;\n};\n\nfunction postToParent(data: Record<string, unknown>) {\n window.parent?.postMessage(data, \"*\");\n}\n\n/** Centered link editor dialog (shadcn Dialog + Radix). */\nexport function LinkPopover({\n open = true,\n panelRef,\n portalContainer,\n onClose,\n mode = \"create\",\n pages,\n sections = [],\n sectionsByPath,\n initialTarget,\n existingTargets = [],\n onSubmit,\n}: LinkPopoverProps) {\n const state = useLinkModalState({\n open,\n mode,\n pages,\n sections,\n sectionsByPath,\n initialTarget,\n existingTargets,\n onClose,\n onSubmit,\n });\n\n const sectionPickerActive =\n state.showSectionPicker && Boolean(state.selectedPage);\n\n // Lock preview scroll while the dialog is open; unlock for section picker (full-page scroll).\n useEffect(() => {\n if (!open) return;\n\n if (sectionPickerActive) {\n postToParent({ type: \"ui:unlock\" });\n postToParent({ type: \"ow:section-picker\", active: true });\n document.documentElement.style.overflow = \"\";\n document.body.style.overflow = \"\";\n return () => {\n postToParent({ type: \"ow:section-picker\", active: false });\n };\n }\n\n postToParent({ type: \"ow:section-picker\", active: false });\n postToParent({ type: \"ui:lock\" });\n\n const html = document.documentElement;\n const body = document.body;\n const prevHtmlOverflow = html.style.overflow;\n const prevBodyOverflow = body.style.overflow;\n const prevHtmlOverscroll = html.style.overscrollBehavior;\n const prevBodyOverscroll = body.style.overscrollBehavior;\n html.style.overflow = \"hidden\";\n body.style.overflow = \"hidden\";\n html.style.overscrollBehavior = \"none\";\n body.style.overscrollBehavior = \"none\";\n\n // Overlay covers the whole viewport — never treat it as \"safe to scroll\".\n // Only the page dropdown (and similar) may consume wheel/touch; everything else\n // must preventDefault or the parent canvas scroller will move under the iframe.\n const canScrollElement = (el: HTMLElement, deltaY: number) => {\n const { overflowY } = getComputedStyle(el);\n if (overflowY !== \"auto\" && overflowY !== \"scroll\") return false;\n if (el.scrollHeight <= el.clientHeight + 1) return false;\n if (deltaY < 0) return el.scrollTop > 0;\n if (deltaY > 0)\n return el.scrollTop + el.clientHeight < el.scrollHeight - 1;\n return true;\n };\n\n const allowsInternalScroll = (e: Event) => {\n const target = e.target;\n if (!(target instanceof Element)) return false;\n const scrollRoot = target.closest<HTMLElement>(\n \"[data-ohw-link-page-dropdown], [data-ohw-allow-scroll]\",\n );\n if (!scrollRoot) return false;\n const deltaY = e instanceof WheelEvent ? e.deltaY : 0;\n return canScrollElement(scrollRoot, deltaY);\n };\n\n const preventBackgroundScroll = (e: Event) => {\n if (allowsInternalScroll(e)) return;\n e.preventDefault();\n };\n\n const scrollOpts = { passive: false, capture: true } as const;\n document.addEventListener(\"wheel\", preventBackgroundScroll, scrollOpts);\n document.addEventListener(\"touchmove\", preventBackgroundScroll, scrollOpts);\n\n return () => {\n postToParent({ type: \"ui:unlock\" });\n html.style.overflow = prevHtmlOverflow;\n body.style.overflow = prevBodyOverflow;\n html.style.overscrollBehavior = prevHtmlOverscroll;\n body.style.overscrollBehavior = prevBodyOverscroll;\n document.removeEventListener(\n \"wheel\",\n preventBackgroundScroll,\n scrollOpts,\n );\n document.removeEventListener(\n \"touchmove\",\n preventBackgroundScroll,\n scrollOpts,\n );\n };\n }, [open, sectionPickerActive]);\n\n return (\n <>\n <Dialog\n open={open && !sectionPickerActive}\n onOpenChange={(next) => {\n if (!next) onClose?.();\n }}\n >\n <DialogContent\n ref={panelRef}\n container={portalContainer}\n data-ohw-link-popover-root=\"\"\n data-ohw-link-modal-root=\"\"\n data-ohw-bridge=\"\"\n showCloseButton={false}\n className=\"gap-0 p-0 w-full max-w-[448px] pointer-events-auto z-[2147483646] overflow-visible\"\n >\n <LinkEditorPanel state={state} onClose={onClose} />\n </DialogContent>\n </Dialog>\n\n {sectionPickerActive && state.selectedPage ? (\n <SectionPickerOverlay\n pagePath={state.selectedPage.path}\n sections={state.activeSections}\n onBack={state.handleSectionPickerBack}\n onSelect={state.handleSectionSelect}\n />\n ) : null}\n </>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Dialog as DialogPrimitive } from \"radix-ui\";\n\nimport { cn } from \"../lib/utils\";\nimport { X } from \"lucide-react\";\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal {...props} />;\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n data-ohw-link-modal-root=\"\"\n className={cn(\"fixed inset-0 z-[2147483646] bg-black/50\", className)}\n {...props}\n />\n );\n}\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean;\n /** Portal target; when set, overlay/content use absolute positioning inside this box (iframe visible viewport). */\n container?: HTMLElement | null;\n }\n>(\n (\n { className, children, showCloseButton = true, container, ...props },\n ref,\n ) => {\n const positionMode = container ? \"absolute\" : \"fixed\";\n\n return (\n <DialogPortal container={container ?? undefined}>\n <DialogOverlay className={cn(positionMode, \"inset-0\")} />\n <DialogPrimitive.Content\n ref={ref}\n data-slot=\"dialog-content\"\n className={cn(\n positionMode,\n \"left-1/2 top-1/2 z-[2147483647] flex w-full max-w-[448px] -translate-x-1/2 -translate-y-1/2 flex-col overflow-visible\",\n \"rounded-xl border border-border bg-background font-sans shadow-lg outline-none\",\n container ? \"max-h-[calc(100%-32px)]\" : \"max-h-[calc(100vh-32px)]\",\n className,\n )}\n onMouseDown={(e) => e.stopPropagation()}\n {...props}\n >\n {children}\n {showCloseButton ? (\n <DialogPrimitive.Close\n type=\"button\"\n className=\"absolute right-[9px] top-[9px] rounded-sm p-1.5 text-foreground hover:bg-muted/50\"\n aria-label=\"Close\"\n >\n <X size={16} aria-hidden />\n </DialogPrimitive.Close>\n ) : null}\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n },\n);\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nfunction DialogHeader({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn(\"flex flex-col gap-1.5\", className)} {...props} />;\n}\n\nfunction DialogFooter({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\"flex items-center justify-end gap-2\", className)}\n {...props}\n />\n );\n}\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight text-card-foreground\",\n className,\n )}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nconst DialogClose = DialogPrimitive.Close;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n DialogClose,\n};\n","\"use client\";\n\nimport { Info, X } from \"lucide-react\";\nimport { Button } from \"../button\";\nimport {\n DialogClose,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../dialog\";\nimport { DestinationBreadcrumb } from \"./DestinationBreadcrumb\";\nimport { SectionTreeItem } from \"./SectionTreeItem\";\nimport { UrlOrPageInput } from \"./UrlOrPageInput\";\nimport type { useLinkModalState } from \"./useLinkModalState\";\n\ntype LinkModalState = ReturnType<typeof useLinkModalState>;\n\ntype LinkEditorPanelProps = {\n state: LinkModalState;\n onClose: () => void;\n};\n\n/** Link destination editor body — Figma node 8365:7616 / 8382:4161 */\n\nexport function LinkEditorPanel({ state, onClose }: LinkEditorPanelProps) {\n const isCancel =\n state.secondaryLabel === \"Cancel\" ||\n state.secondaryLabel === \"Back to sections\";\n\n return (\n <>\n <DialogClose asChild>\n <button\n type=\"button\"\n className=\"absolute right-[9px] top-[9px] rounded-sm p-1.5 text-foreground hover:bg-muted/50 h-7\"\n aria-label=\"Close\"\n onClick={onClose}\n >\n <X size={16} aria-hidden />\n </button>\n </DialogClose>\n\n <DialogHeader className=\"w-full gap-1.5 p-6 pr-12\">\n <DialogTitle className=\"m-0 w-full break-words\">\n {state.title}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"flex w-full flex-col gap-3 px-6 pb-8 pt-1\">\n {state.showBreadcrumb && state.selectedPage && state.selectedSection ? (\n <DestinationBreadcrumb\n pageTitle={state.selectedPage.title}\n sectionLabel={state.selectedSection.label}\n />\n ) : (\n <UrlOrPageInput\n value={state.searchValue}\n selectedPage={state.selectedPage}\n dropdownOpen={state.dropdownOpen}\n onDropdownOpenChange={state.setDropdownOpen}\n filteredPages={state.filteredPages}\n onInputChange={state.handleInputChange}\n onPageSelect={state.handlePageSelect}\n urlError={state.urlError}\n />\n )}\n\n {state.showChooseSection ? (\n <div className=\"flex flex-col justify-center gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"w-fit cursor-pointer\"\n size=\"sm\"\n onClick={state.handleChooseSection}\n >\n Choose a section\n </Button>\n\n <div className=\"flex items-center gap-1 text-sm text-muted-foreground\">\n <Info size={16} className=\"shrink-0\" aria-hidden />\n\n <span>Pick a section this link should scroll to.</span>\n </div>\n </div>\n ) : null}\n\n {state.showSectionRow && state.selectedSection ? (\n <SectionTreeItem section={state.selectedSection} selected />\n ) : null}\n </div>\n\n <DialogFooter className=\"w-full px-6 pb-6\">\n <Button\n type=\"button\"\n variant={isCancel ? \"outline\" : \"ghost\"}\n className=\"leading-6 shadow-none cursor-pointer\"\n style={\n isCancel\n ? {\n backgroundColor: \"var(--ohw-background)\",\n borderColor: \"var(--ohw-border)\",\n color: \"var(--ohw-foreground)\",\n }\n : undefined\n }\n onClick={state.handleSecondary}\n >\n {state.secondaryLabel}\n </Button>\n\n <Button\n type=\"button\"\n className=\"border-0 leading-6 shadow-none hover:opacity-90 disabled:opacity-50 cursor-pointer\"\n style={{\n backgroundColor: \"var(--ohw-primary)\",\n color: \"var(--ohw-primary-foreground)\",\n }}\n disabled={!state.isValid}\n onClick={state.handleSubmit}\n >\n {state.submitLabel}\n </Button>\n </DialogFooter>\n </>\n );\n}\n","\"use client\";\n\nimport { ArrowRight, File, GalleryVertical } from \"lucide-react\";\n\ntype DestinationBreadcrumbProps = {\n pageTitle: string;\n sectionLabel: string;\n};\n\nexport function DestinationBreadcrumb({\n pageTitle,\n sectionLabel,\n}: DestinationBreadcrumbProps) {\n return (\n <div className=\"flex w-full flex-col gap-2\">\n <p className=\"text-sm font-medium! text-foreground m-0\">Destination</p>\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n <File size={16} className=\"shrink-0 text-foreground\" aria-hidden />\n <span className=\"text-sm font-medium leading-none text-foreground!\">\n {pageTitle}\n </span>\n </div>\n <ArrowRight\n size={16}\n className=\"shrink-0 text-muted-foreground\"\n aria-hidden\n />\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n <GalleryVertical\n size={16}\n className=\"shrink-0 text-foreground\"\n aria-hidden\n />\n <span className=\"truncate text-sm font-medium leading-none text-foreground\">\n {sectionLabel}\n </span>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { GalleryVertical } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport type { LinkSection } from \"./types\";\n\ntype SectionTreeItemProps = {\n section: LinkSection;\n onSelect?: (section: LinkSection) => void;\n selected?: boolean;\n};\n\nexport function SectionTreeItem({\n section,\n onSelect,\n selected,\n}: SectionTreeItemProps) {\n const interactive = Boolean(onSelect);\n\n return (\n <div className=\"flex h-9 w-full items-end pl-3\">\n <div\n className=\"mr-[-1px] h-9 w-2 shrink-0 rounded-bl-sm border-b border-l border-border mb-4\"\n aria-hidden\n />\n <div\n role={interactive ? \"button\" : undefined}\n tabIndex={interactive ? 0 : undefined}\n onClick={interactive ? () => onSelect?.(section) : undefined}\n onKeyDown={\n interactive\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onSelect?.(section);\n }\n }\n : undefined\n }\n className={cn(\n \"flex h-9 min-w-0 flex-1 items-center gap-2 rounded-md border border-border bg-background p-3\",\n interactive && \"cursor-pointer hover:bg-muted/30\",\n interactive && selected && \"border-primary\",\n )}\n >\n <GalleryVertical\n size={16}\n className=\"shrink-0 text-foreground\"\n aria-hidden\n />\n <span className=\"truncate text-sm font-normal leading-5 text-foreground\">\n {section.label}\n </span>\n </div>\n </div>\n );\n}\n\ntype SectionPickerListProps = {\n sections: LinkSection[];\n onSelect: (section: LinkSection) => void;\n};\n\nexport function SectionPickerList({\n sections,\n onSelect,\n}: SectionPickerListProps) {\n if (sections.length === 0) {\n return (\n <p className=\"text-sm text-muted-foreground\">\n No sections found on this page.\n </p>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-1\">\n <p className=\"text-sm text-muted-foreground\">\n Pick a section this link should scroll to.\n </p>\n {sections.map((section) => (\n <SectionTreeItem\n key={section.id}\n section={section}\n onSelect={onSelect}\n />\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useId, useRef, useState } from \"react\";\n\nimport { cn } from \"../../lib/utils\";\nimport { Input } from \"../input\";\nimport { Label } from \"../label\";\nimport type { LinkPage } from \"./types\";\nimport { ChevronDown, File, X } from \"lucide-react\";\n\ntype UrlOrPageInputProps = {\n value: string;\n selectedPage: { path: string; title: string } | null;\n placeholder?: string;\n dropdownOpen: boolean;\n onDropdownOpenChange: (open: boolean) => void;\n filteredPages: LinkPage[];\n onInputChange: (value: string) => void;\n onPageSelect: (page: LinkPage) => void;\n readOnly?: boolean;\n urlError?: string;\n};\n\nfunction FieldChevron({\n onClick,\n}: {\n onClick?: (e: React.MouseEvent) => void;\n}) {\n return (\n <button\n type=\"button\"\n className=\"flex shrink-0 items-center justify-end border-0 bg-transparent p-0 pl-4 text-muted-foreground outline-none\"\n onClick={onClick}\n aria-label=\"Open page list\"\n tabIndex={-1}\n >\n <ChevronDown size={16} />\n </button>\n );\n}\n\nexport function UrlOrPageInput({\n value,\n selectedPage,\n placeholder = \"Paste a URL or choose a page\",\n dropdownOpen,\n onDropdownOpenChange,\n filteredPages,\n onInputChange,\n onPageSelect,\n readOnly = false,\n urlError,\n}: UrlOrPageInputProps) {\n const inputId = useId();\n const inputRef = useRef<HTMLInputElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const [isFocused, setIsFocused] = useState(false);\n\n useEffect(() => {\n if (!dropdownOpen) return;\n\n const isOutside = (e: Event) => {\n const root = rootRef.current;\n if (!root) return true;\n const path = typeof e.composedPath === \"function\" ? e.composedPath() : [];\n if (path.includes(root)) return false;\n const target = e.target;\n return !(target instanceof Node && root.contains(target));\n };\n\n const closeIfOutside = (e: Event) => {\n if (!isOutside(e)) return;\n onDropdownOpenChange(false);\n };\n\n // Capture phase so we still see the event when dialog content stops bubbling.\n document.addEventListener(\"pointerdown\", closeIfOutside, true);\n document.addEventListener(\"mousedown\", closeIfOutside, true);\n return () => {\n document.removeEventListener(\"pointerdown\", closeIfOutside, true);\n document.removeEventListener(\"mousedown\", closeIfOutside, true);\n };\n }, [dropdownOpen, onDropdownOpenChange]);\n\n const openDropdown = () => {\n if (readOnly || filteredPages.length === 0) return;\n onDropdownOpenChange(true);\n };\n\n const toggleDropdown = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n if (readOnly || filteredPages.length === 0) return;\n onDropdownOpenChange(!dropdownOpen);\n };\n\n const clearSelection = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onInputChange(\"\");\n requestAnimationFrame(() => inputRef.current?.focus());\n };\n\n const fieldClassName = cn(\n \"data-ohw-link-field flex h-[36px] w-full items-center overflow-hidden rounded-md border bg-background pl-3 pr-3 py-2 outline-none transition-[border-color,box-shadow]\",\n urlError\n ? \"border-destructive shadow-[0_0_0_1px_var(--ohw-destructive)]\"\n : isFocused\n ? \"border-primary shadow-[0_0_0_1px_var(--ohw-primary)]\"\n : \"border-input\",\n );\n\n return (\n <div className=\"flex w-full flex-col gap-2 p-0\">\n <Label htmlFor={inputId} className={cn(urlError && \"text-destructive\")}>\n Destination\n </Label>\n <div ref={rootRef} className=\"relative w-full\">\n <div data-ohw-link-field className={fieldClassName}>\n {selectedPage ? (\n <div className=\"flex shrink-0 items-center pr-2\">\n <File\n size={16}\n className=\"shrink-0 text-foreground\"\n aria-hidden\n />\n </div>\n ) : null}\n {readOnly ? (\n <span className=\"min-w-0 flex-1 truncate text-sm leading-5 text-foreground\">\n {selectedPage?.title ?? value}\n </span>\n ) : (\n <Input\n ref={inputRef}\n id={inputId}\n value={value}\n onChange={(e) => onInputChange(e.target.value)}\n onFocus={() => {\n setIsFocused(true);\n if (!selectedPage) openDropdown();\n }}\n onBlur={() => {\n setIsFocused(false);\n // Backup for when focus moves to another control inside the dialog.\n // Dropdown items call preventDefault on mousedown so focus stays here until select.\n requestAnimationFrame(() => {\n if (!rootRef.current?.contains(document.activeElement)) {\n onDropdownOpenChange(false);\n }\n });\n }}\n placeholder={placeholder}\n className={cn(\n \"min-w-0 flex-1 truncate border-0 bg-transparent p-0 text-sm font-normal leading-5 shadow-none outline-none ring-0 caret-foreground\",\n value\n ? \"text-foreground\"\n : \"text-muted-foreground placeholder:text-muted-foreground\",\n )}\n />\n )}\n {selectedPage && !readOnly ? (\n <button\n type=\"button\"\n className=\"flex shrink-0 items-center justify-center rounded-sm p-0.5 text-muted-foreground outline-none hover:bg-muted/50 hover:text-foreground\"\n onMouseDown={clearSelection}\n aria-label=\"Clear selected page\"\n tabIndex={-1}\n >\n <X size={16} aria-hidden />\n </button>\n ) : null}\n {!readOnly ? <FieldChevron onClick={toggleDropdown} /> : null}\n </div>\n {dropdownOpen && !readOnly && filteredPages.length > 0 ? (\n <div\n data-ohw-link-page-dropdown=\"\"\n className=\"absolute left-0 right-0 top-[calc(100%+4px)] z-50 max-h-48 overflow-auto rounded-lg border border-border bg-popover py-1 shadow-lg\"\n onMouseDown={(e) => e.preventDefault()}\n >\n {filteredPages.map((page) => (\n <button\n key={page.path}\n type=\"button\"\n className=\"flex h-9 w-full items-center gap-2 border-0 bg-transparent px-3 text-left text-sm leading-5 text-foreground outline-none hover:bg-muted\"\n onClick={() => onPageSelect(page)}\n >\n <File size={16} className=\"shrink-0\" aria-hidden />\n <span className=\"truncate\">{page.title}</span>\n </button>\n ))}\n </div>\n ) : null}\n </div>\n {urlError ? (\n <p className=\"text-sm font-medium text-destructive\">{urlError}</p>\n ) : null}\n </div>\n );\n}\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<'input'>>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n ref={ref}\n data-slot=\"input\"\n className={cn(\n 'flex h-full w-full min-w-0 bg-transparent text-sm text-foreground outline-none placeholder:text-muted-foreground',\n className\n )}\n {...props}\n />\n )\n }\n)\nInput.displayName = 'Input'\n\nexport { Input }\n","'use client'\n\nimport * as React from 'react'\nimport { Label as LabelPrimitive } from 'radix-ui'\n\nimport { cn } from '../lib/utils'\n\nfunction Label({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn('text-sm font-medium leading-5 text-foreground', className)}\n {...props}\n />\n )\n}\n\nexport { Label }\n","\"use client\";\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ArrowLeft, Check } from \"lucide-react\";\nimport { usePathname, useRouter } from \"next/navigation\";\n\nimport { collectSectionsFromDom } from \"../../lib/sections\";\nimport { readPreservedSearch } from \"../../lib/session-search\";\nimport { Button } from \"../button\";\nimport { normalizePath } from \"./linkModal.utils\";\nimport type { LinkSection } from \"./types\";\n\nconst DIM_OVERLAY = \"rgba(0, 0, 0, 0.45)\";\n\ntype SectionPickerOverlayProps = {\n pagePath: string;\n sections: LinkSection[];\n onBack: () => void;\n onSelect: (section: LinkSection) => void;\n};\n\nfunction rectsEqual(a: Map<string, DOMRect>, b: Map<string, DOMRect>): boolean {\n if (a.size !== b.size) return false;\n for (const [id, rect] of a) {\n const other = b.get(id);\n if (\n !other ||\n rect.top !== other.top ||\n rect.left !== other.left ||\n rect.width !== other.width ||\n rect.height !== other.height\n ) {\n return false;\n }\n }\n return true;\n}\n\nfunction readSectionRects(sectionIds: string[]): Map<string, DOMRect> {\n const next = new Map<string, DOMRect>();\n for (const id of sectionIds) {\n const el = document.querySelector<HTMLElement>(\n `[data-ohw-section=\"${CSS.escape(id)}\"]`,\n );\n if (el) next.set(id, el.getBoundingClientRect());\n }\n return next;\n}\n\nfunction hitTestSectionId(\n x: number,\n y: number,\n sectionIds: string[],\n rects: Map<string, DOMRect>,\n): string | null {\n for (const id of sectionIds) {\n const rect = rects.get(id);\n if (!rect || rect.width <= 0 || rect.height <= 0) continue;\n if (\n x >= rect.left &&\n x <= rect.right &&\n y >= rect.top &&\n y <= rect.bottom\n ) {\n return id;\n }\n }\n return null;\n}\n\nfunction useSectionRects(sectionIdsKey: string, enabled: boolean) {\n const [rects, setRects] = useState<Map<string, DOMRect>>(new Map());\n const sectionIds = useMemo(\n () => (sectionIdsKey ? sectionIdsKey.split(\"\\0\") : []),\n [sectionIdsKey],\n );\n\n useEffect(() => {\n if (!enabled || sectionIds.length === 0) {\n setRects((prev) => (prev.size === 0 ? prev : new Map()));\n return;\n }\n\n const update = () => {\n const next = readSectionRects(sectionIds);\n setRects((prev) => (rectsEqual(prev, next) ? prev : next));\n };\n\n update();\n const opts = { capture: true, passive: true } as const;\n window.addEventListener(\"scroll\", update, opts);\n window.addEventListener(\"resize\", update);\n const vv = window.visualViewport;\n vv?.addEventListener(\"resize\", update);\n vv?.addEventListener(\"scroll\", update);\n\n const ro = new ResizeObserver(update);\n for (const id of sectionIds) {\n const el = document.querySelector<HTMLElement>(\n `[data-ohw-section=\"${CSS.escape(id)}\"]`,\n );\n if (el) ro.observe(el);\n }\n\n return () => {\n window.removeEventListener(\"scroll\", update, opts);\n window.removeEventListener(\"resize\", update);\n vv?.removeEventListener(\"resize\", update);\n vv?.removeEventListener(\"scroll\", update);\n ro.disconnect();\n };\n }, [sectionIds, enabled]);\n\n return rects;\n}\n\n/** Full-page section picker — Figma nodes 4591:37899, 4591:37972, 4591:37973 */\nexport function SectionPickerOverlay({\n pagePath,\n sections,\n onBack,\n onSelect,\n}: SectionPickerOverlayProps) {\n const router = useRouter();\n const pathname = usePathname();\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [hoveredId, setHoveredId] = useState<string | null>(null);\n /** Last pointer in iframe client coords (used for hit-testing). */\n const pointerRef = useRef<{ x: number; y: number } | null>(null);\n /**\n * Last pointer in parent/screen space (y ≈ iframeClientY + iframeOffsetTop).\n * Remapping from this on scroll stays accurate even if scroll messages are skipped.\n */\n const pointerScreenRef = useRef<{ x: number; y: number } | null>(null);\n const iframeOffsetTopRef = useRef<number | null>(null);\n const sectionIdsRef = useRef<string[]>([]);\n const [chromeClip, setChromeClip] = useState<{ top: number; bottom: number }>(\n () => ({\n top: 0,\n bottom: typeof window !== \"undefined\" ? window.innerHeight : 0,\n }),\n );\n\n const normalizedTarget = normalizePath(pagePath);\n const isOnTargetPage = normalizePath(pathname) === normalizedTarget;\n\n useEffect(() => {\n if (isOnTargetPage) return;\n const search = readPreservedSearch();\n router.push(`${normalizedTarget}${search}`);\n }, [isOnTargetPage, normalizedTarget, router]);\n\n // Mark document so edit-mode chrome (borders, insert gaps, hover outlines) stays hidden.\n useEffect(() => {\n document.documentElement.setAttribute(\"data-ohw-section-picking\", \"\");\n document\n .querySelectorAll<HTMLElement>(\"[data-ohw-hovered]\")\n .forEach((el) => {\n el.removeAttribute(\"data-ohw-hovered\");\n });\n document\n .querySelectorAll<HTMLElement>(\"[data-ohw-state-hovered]\")\n .forEach((el) => {\n el.removeAttribute(\"data-ohw-state-hovered\");\n });\n return () => {\n document.documentElement.removeAttribute(\"data-ohw-section-picking\");\n };\n }, []);\n\n const liveSections = useMemo(() => {\n if (!isOnTargetPage) return sections;\n // Prefer live DOM so layout sections (e.g. footer) always appear even if\n // the prefetched sections map is incomplete.\n const live = collectSectionsFromDom();\n if (live.length === 0) return sections;\n const labels = new Map(sections.map((s) => [s.id, s.label]));\n return live.map((s) => ({ id: s.id, label: labels.get(s.id) ?? s.label }));\n }, [isOnTargetPage, sections, pathname]);\n\n const sectionIdsKey = useMemo(\n () => liveSections.map((s) => s.id).join(\"\\0\"),\n [liveSections],\n );\n const sectionIds = useMemo(\n () => liveSections.map((s) => s.id),\n [liveSections],\n );\n sectionIdsRef.current = sectionIds;\n const rects = useSectionRects(sectionIdsKey, isOnTargetPage);\n\n const applyHoverAt = useCallback(\n (x: number, y: number, liveRects?: Map<string, DOMRect>) => {\n const ids = sectionIdsRef.current;\n const map = liveRects ?? readSectionRects(ids);\n const next = hitTestSectionId(x, y, ids, map);\n setHoveredId((prev) => (prev === next ? prev : next));\n },\n [],\n );\n\n // Keep Back + hint pinned to the *visible* preview area. Parent scrolls the tall\n // iframe — section getBoundingClientRect() values do not change (no iframe-internal\n // scroll), but the screen cursor maps to a new iframe clientY. Remap pointerRef and\n // re-hit-test on every ow:parent-scroll (even when rect maps are equal).\n useEffect(() => {\n const applyClip = (\n iframeOffsetTop: number,\n visibleCanvasTop: number,\n canvasH: number,\n ) => {\n const top = Math.max(0, visibleCanvasTop - iframeOffsetTop);\n const bottom = Math.min(\n window.innerHeight,\n visibleCanvasTop + canvasH - iframeOffsetTop,\n );\n setChromeClip((prev) =>\n prev.top === top && prev.bottom === bottom\n ? prev\n : { top, bottom: Math.max(top, bottom) },\n );\n };\n\n const onParentScroll = (e: MessageEvent) => {\n if (e.data?.type !== \"ow:parent-scroll\") return;\n const { iframeOffsetTop, headerH, canvasH } = e.data as {\n iframeOffsetTop: number;\n headerH: number;\n canvasH: number;\n };\n applyClip(iframeOffsetTop, headerH, canvasH);\n iframeOffsetTopRef.current = iframeOffsetTop;\n\n // Bootstrap screen-space pointer if we saw a move before the first scroll msg.\n if (!pointerScreenRef.current && pointerRef.current) {\n pointerScreenRef.current = {\n x: pointerRef.current.x,\n y: pointerRef.current.y + iframeOffsetTop,\n };\n }\n\n const screen = pointerScreenRef.current;\n if (screen) {\n const next = { x: screen.x, y: screen.y - iframeOffsetTop };\n pointerRef.current = next;\n applyHoverAt(next.x, next.y);\n }\n };\n\n const onResize = () => {\n setChromeClip((prev) => {\n const bottom = Math.max(prev.top, window.innerHeight);\n return prev.bottom === bottom ? prev : { ...prev, bottom };\n });\n };\n\n window.addEventListener(\"message\", onParentScroll);\n window.addEventListener(\"resize\", onResize);\n return () => {\n window.removeEventListener(\"message\", onParentScroll);\n window.removeEventListener(\"resize\", onResize);\n };\n }, [applyHoverAt]);\n\n // Re-hit-test when section geometry changes (resize / internal scroll).\n useEffect(() => {\n const ptr = pointerRef.current;\n if (!ptr) return;\n applyHoverAt(ptr.x, ptr.y, rects);\n }, [rects, applyHoverAt]);\n\n useEffect(() => {\n const rememberPointer = (clientX: number, clientY: number) => {\n pointerRef.current = { x: clientX, y: clientY };\n const top = iframeOffsetTopRef.current;\n if (top != null) {\n pointerScreenRef.current = { x: clientX, y: clientY + top };\n }\n applyHoverAt(clientX, clientY, rects);\n };\n\n const onPointerMove = (e: PointerEvent) => {\n rememberPointer(e.clientX, e.clientY);\n };\n // Parent may proxy pointer while overlays sit above the iframe.\n const onPointerSync = (e: MessageEvent) => {\n if (e.data?.type !== \"ow:pointer-sync\") return;\n const { clientX, clientY } = e.data as {\n clientX: number;\n clientY: number;\n };\n rememberPointer(clientX, clientY);\n };\n window.addEventListener(\"pointermove\", onPointerMove, { passive: true });\n window.addEventListener(\"message\", onPointerSync);\n return () => {\n window.removeEventListener(\"pointermove\", onPointerMove);\n window.removeEventListener(\"message\", onPointerSync);\n };\n }, [rects, applyHoverAt]);\n\n const handleSelect = useCallback(\n (section: LinkSection) => {\n if (selectedId) return;\n setSelectedId(section.id);\n onSelect(section);\n },\n [selectedId, onSelect],\n );\n\n useEffect(() => {\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n onBack();\n }\n };\n window.addEventListener(\"keydown\", onKeyDown, true);\n return () => window.removeEventListener(\"keydown\", onKeyDown, true);\n }, [onBack]);\n\n const portalRoot =\n typeof document !== \"undefined\"\n ? (document.querySelector<HTMLElement>(\"[data-ohw-bridge-root]\") ??\n document.body)\n : null;\n\n if (!portalRoot) return null;\n\n return createPortal(\n <div\n data-ohw-section-picker=\"\"\n data-ohw-bridge=\"\"\n className={`pointer-events-none fixed inset-0 z-[2147483647] transition-opacity duration-200 ${\"opacity-100\"}`}\n aria-modal\n role=\"dialog\"\n aria-label=\"Choose a section\"\n >\n <div\n className=\"pointer-events-auto fixed left-5 z-[2]\"\n style={{ top: chromeClip.top + 20 }}\n >\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 min-w-0 gap-1 border-border bg-background px-2 py-1.5 shadow-sm hover:bg-muted cursor-pointer\"\n onClick={onBack}\n >\n <ArrowLeft className=\"size-4 shrink-0\" aria-hidden />\n Back\n </Button>\n </div>\n\n <div\n className=\"pointer-events-none fixed left-1/2 z-[2] rounded-lg px-4 py-3 text-xs leading-4 tracking-[0.18px] text-white shadow-md\"\n style={{\n top: chromeClip.bottom - 20,\n transform: \"translate(-50%, -100%)\",\n backgroundColor: \"var(--ohw-popover-foreground, #0c0a09)\",\n }}\n data-ohw-section-picker-hint=\"\"\n >\n Click on section to select\n </div>\n\n {!isOnTargetPage ? (\n <div\n className=\"pointer-events-none fixed left-1/2 z-[1] -translate-x-1/2 rounded-md px-3 py-2 text-sm text-muted-foreground shadow-sm\"\n style={{ top: chromeClip.top + 64, backgroundColor: \"var(--ohw-background, #ffffff)\" }}\n >\n Loading page preview…\n </div>\n ) : null}\n\n {isOnTargetPage && liveSections.length === 0 ? (\n <div className=\"pointer-events-auto fixed inset-0 z-[1] flex items-center justify-center bg-muted/40\">\n <p className=\"text-sm text-muted-foreground\">\n No sections found on this page.\n </p>\n </div>\n ) : null}\n\n {isOnTargetPage\n ? liveSections.map((section) => {\n const rect = rects.get(section.id);\n if (!rect || rect.width <= 0 || rect.height <= 0) return null;\n const isSelected = selectedId === section.id;\n const isHovered = hoveredId === section.id;\n const isLit = isSelected || isHovered;\n\n return (\n <button\n key={section.id}\n type=\"button\"\n className=\"pointer-events-auto fixed z-[1] cursor-pointer border-0 bg-transparent p-0 transition-[background-color] duration-150\"\n style={{\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n backgroundColor: isLit ? \"transparent\" : DIM_OVERLAY,\n }}\n aria-label={`Select section ${section.label}`}\n onClick={() => handleSelect(section)}\n >\n {isLit ? (\n <span\n className=\"pointer-events-none absolute\"\n style={{\n inset: 4,\n borderRadius: \"var(--radius, 6px)\",\n border: \"1.5px dashed var(--primary, #0885FE)\",\n boxSizing: \"border-box\",\n }}\n aria-hidden\n />\n ) : null}\n {isSelected ? (\n <span\n className=\"absolute right-3 top-3 flex size-8 items-center justify-center rounded-full text-white\"\n style={{ backgroundColor: \"var(--ohw-primary, #0885fe)\" }}\n aria-hidden\n >\n <Check className=\"size-5\" />\n </span>\n ) : null}\n </button>\n );\n })\n : null}\n </div>,\n portalRoot,\n );\n}\n","'use client'\n\nimport { useCallback, useEffect, useMemo, useState } from 'react'\n\nimport type { LinkModalMode, LinkModalStep, LinkPage, LinkSection, SelectedPage, SelectedSection } from './types'\nimport {\n buildTarget,\n getEditModeInitialState,\n getSectionsForPath,\n normalizeUrl,\n parseTarget,\n validateUrlInput,\n} from './linkModal.utils'\n\ntype UseLinkModalStateParams = {\n open: boolean\n mode: LinkModalMode\n pages: LinkPage[]\n sections: LinkSection[]\n sectionsByPath?: Record<string, LinkSection[]>\n initialTarget?: string\n existingTargets: string[]\n onClose: () => void\n onSubmit: (target: string) => void\n}\n\nexport function useLinkModalState({\n open,\n mode,\n pages,\n sections: _sections,\n sectionsByPath,\n initialTarget,\n existingTargets: _existingTargets,\n onClose,\n onSubmit,\n}: UseLinkModalStateParams) {\n const availablePages = useMemo(() => pages, [pages])\n\n const [searchValue, setSearchValue] = useState('')\n const [selectedPage, setSelectedPage] = useState<SelectedPage | null>(null)\n const [selectedSection, setSelectedSection] = useState<SelectedSection | null>(null)\n const [step, setStep] = useState<LinkModalStep>('input')\n const [dropdownOpen, setDropdownOpen] = useState(false)\n const [urlError, setUrlError] = useState('')\n\n const reset = useCallback(() => {\n setSearchValue('')\n setSelectedPage(null)\n setSelectedSection(null)\n setStep('input')\n setDropdownOpen(false)\n setUrlError('')\n }, [])\n\n // Initialize only when the modal opens (or edit target changes) — never mid-flow.\n // Resetting on pages/sectionsByPath updates was reopening the dialog during section picker navigation.\n useEffect(() => {\n if (!open) return\n if (mode === 'edit' && initialTarget) {\n const { pageRoute } = parseTarget(initialTarget)\n const targetSections = getSectionsForPath(sectionsByPath, pageRoute)\n const init = getEditModeInitialState(initialTarget, pages, targetSections)\n setSearchValue(init.searchValue)\n setSelectedPage(init.selectedPage)\n setSelectedSection(init.selectedSection)\n setStep(init.step)\n } else {\n reset()\n }\n setDropdownOpen(false)\n setUrlError('')\n }, [open, mode, initialTarget, reset])\n\n const filteredPages = useMemo(() => {\n if (!searchValue.trim()) return availablePages\n return availablePages.filter((p) => p.title.toLowerCase().startsWith(searchValue.toLowerCase()))\n }, [availablePages, searchValue])\n\n const activeSections = useMemo(() => {\n if (!selectedPage) return []\n return getSectionsForPath(sectionsByPath, selectedPage.path)\n }, [selectedPage, sectionsByPath])\n\n const showBreadcrumb = step === 'confirmed' && selectedPage && selectedSection\n const showSectionPicker = step === 'sectionPicker' && selectedPage\n const showSectionRow =\n mode === 'edit' && selectedPage && selectedSection && step === 'input'\n const showChooseSection =\n step === 'input' && selectedPage && !selectedSection && !showSectionRow && activeSections.length > 0\n\n const handleInputChange = (value: string) => {\n setSearchValue(value)\n setSelectedPage(null)\n setSelectedSection(null)\n setStep('input')\n setUrlError('')\n\n const filtered = value.trim()\n ? availablePages.filter((p) => p.title.toLowerCase().startsWith(value.toLowerCase()))\n : availablePages\n setDropdownOpen(filtered.length > 0)\n\n if (value.trim()) {\n setUrlError(validateUrlInput(value, availablePages, pages))\n }\n }\n\n const handlePageSelect = (page: LinkPage) => {\n setSelectedPage({ path: page.path, title: page.title })\n setSelectedSection(null)\n setSearchValue(page.title)\n setStep('input')\n setDropdownOpen(false)\n setUrlError('')\n }\n\n const handleChooseSection = () => {\n setStep('sectionPicker')\n }\n\n const handleSectionSelect = (section: LinkSection) => {\n setSelectedSection({ id: section.id, label: section.label })\n if (mode === 'create') {\n setStep('confirmed')\n } else {\n setStep('input')\n }\n }\n\n const handleBackToSections = () => {\n setStep('sectionPicker')\n }\n\n const handleSectionPickerBack = () => {\n setStep('input')\n }\n\n const handleClose = () => {\n reset()\n onClose()\n }\n\n const isValid = useMemo(() => {\n if (urlError) return false\n if (showBreadcrumb) return true\n if (selectedPage) return true\n if (!searchValue.trim()) return false\n return validateUrlInput(searchValue, availablePages, pages) === ''\n }, [urlError, showBreadcrumb, selectedPage, searchValue, availablePages, pages])\n\n const handleSubmit = () => {\n if (selectedPage && selectedSection) {\n onSubmit(buildTarget(selectedPage, selectedSection))\n handleClose()\n return\n }\n\n if (selectedPage) {\n onSubmit(buildTarget(selectedPage, null))\n handleClose()\n return\n }\n\n if (!searchValue.trim()) return\n\n const error = validateUrlInput(searchValue, availablePages, pages)\n if (error) {\n setUrlError(error)\n return\n }\n\n const matchingPage = pages.find((p) => p.title.toLowerCase() === searchValue.toLowerCase())\n if (matchingPage) {\n onSubmit(matchingPage.path)\n handleClose()\n return\n }\n\n onSubmit(normalizeUrl(searchValue))\n handleClose()\n }\n\n const submitLabel = showBreadcrumb ? 'Save' : mode === 'edit' ? 'Save' : 'Create'\n const title = mode === 'edit' ? 'Edit navigation item' : 'Create navigation item'\n const secondaryLabel = showBreadcrumb ? 'Back to sections' : 'Cancel'\n const handleSecondary = showBreadcrumb ? handleBackToSections : handleClose\n\n return {\n title,\n submitLabel,\n secondaryLabel,\n searchValue,\n selectedPage,\n selectedSection,\n step,\n dropdownOpen,\n setDropdownOpen,\n urlError,\n filteredPages,\n showBreadcrumb,\n showSectionPicker,\n showChooseSection,\n showSectionRow,\n isValid,\n activeSections,\n handleInputChange,\n handlePageSelect,\n handleChooseSection,\n handleSectionSelect,\n handleBackToSections,\n handleSectionPickerBack,\n handleClose,\n handleSecondary,\n handleSubmit,\n }\n}\n","import { readPreservedSearch } from '../../lib/session-search'\nimport type { LinkPage } from './types'\n\nexport type DevSection = { id: string; label: string }\n\n/** Re:Bound template pages — for local link-editor testing without canvas parent. */\nexport const DEV_SITE_PAGES: LinkPage[] = [\n { path: '/', title: 'Home' },\n { path: '/about', title: 'About' },\n { path: '/classes', title: 'Classes' },\n { path: '/pricing', title: 'Pricing' },\n { path: '/studio', title: 'Studio' },\n { path: '/instructors', title: 'Instructors' },\n { path: '/contact', title: 'Contact' },\n]\n\n/**\n * Sections per route (matches rebound-template `data-ohw-section` markers).\n * Pre-seeded so you can pick a section for any page without visiting it first.\n */\nexport const DEV_SECTIONS_BY_PATH: Record<string, DevSection[]> = {\n '/': [\n { id: 'hero', label: 'Hero' },\n { id: 'lagree-intro', label: 'Lagree Intro' },\n { id: 'classes-strip', label: 'Classes' },\n { id: 'feel-split', label: 'Feel Split' },\n { id: 'founder-teaser', label: 'Founder' },\n { id: 'plan-form', label: 'Plan Form' },\n { id: 'testimonials', label: 'Testimonials' },\n { id: 'wordmark', label: 'Wordmark' },\n { id: 'footer', label: 'Footer' },\n ],\n '/about': [\n { id: 'manifesto', label: 'Manifesto' },\n { id: 'story-letter', label: 'Our Story' },\n { id: 'lagree-explainer', label: 'Lagree Explainer' },\n { id: 'waitlist-cta', label: 'Waitlist' },\n { id: 'personal-training', label: 'Personal training' },\n { id: 'footer', label: 'Footer' },\n ],\n '/classes': [\n { id: 'class-library', label: 'Class Library' },\n { id: 'footer', label: 'Footer' },\n ],\n '/pricing': [\n { id: 'page-header', label: 'Page Header' },\n { id: 'free-class-cta', label: 'Free Class' },\n { id: 'benefits-marquee', label: 'Benefits' },\n { id: 'monthly-memberships', label: 'Memberships' },\n { id: 'specialty-programs', label: 'Specialty Programs' },\n { id: 'package-matcher', label: 'Packages' },\n { id: 'wordmark', label: 'Wordmark' },\n { id: 'footer', label: 'Footer' },\n ],\n '/studio': [\n { id: 'studio-intro', label: 'Studio Intro' },\n { id: 'studio-features', label: 'Studio Features' },\n { id: 'studio-gallery', label: 'Studio Gallery' },\n { id: 'studio-visit', label: 'Visit Studio' },\n { id: 'footer', label: 'Footer' },\n ],\n '/instructors': [\n { id: 'instructor-grid', label: 'Instructors' },\n { id: 'footer', label: 'Footer' },\n ],\n '/contact': [\n { id: 'hello-hero', label: 'Hello' },\n { id: 'contact-form', label: 'Contact Form' },\n { id: 'faq', label: 'FAQ' },\n { id: 'footer', label: 'Footer' },\n ],\n}\n\nexport function shouldUseDevFixtures(): boolean {\n if (typeof window === 'undefined') return false\n const raw = readPreservedSearch()\n const q = raw.startsWith('?') ? raw.slice(1) : raw\n return new URLSearchParams(q).get('ohw-fixtures') === '1'\n}\n","/**\n * Navbar tree model — OHH-435.\n * Depth cap: MAX_LEVEL.nav = 1 (no dropdown nested inside a dropdown).\n * Flat templates use root-only nodes (empty children).\n */\n\nexport const MAX_LEVEL = { nav: 1 } as const\n\nexport type NavNode = {\n /** Stable href key, e.g. `nav-0-href`. Unchanged across moves. */\n id: string\n children: NavNode[]\n}\n\nexport type NavMoveTarget = {\n /** null = root list */\n parentId: string | null\n /** Index among siblings *before* removal adjustment */\n index: number\n}\n\nconst ROOT = null\n\nfunction cloneForest(nodes: NavNode[]): NavNode[] {\n return nodes.map((n) => ({ id: n.id, children: cloneForest(n.children) }))\n}\n\nfunction findNode(\n nodes: NavNode[],\n id: string,\n parentId: string | null = ROOT\n): { node: NavNode; parentId: string | null; index: number; siblings: NavNode[] } | null {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i]!\n if (node.id === id) return { node, parentId, index: i, siblings: nodes }\n const nested = findNode(node.children, id, node.id)\n if (nested) return nested\n }\n return null\n}\n\nfunction getChildrenOf(nodes: NavNode[], parentId: string | null): NavNode[] | null {\n if (parentId === ROOT) return nodes\n const found = findNode(nodes, parentId)\n return found ? found.node.children : null\n}\n\nfunction isDescendant(nodes: NavNode[], ancestorId: string, maybeDescendantId: string): boolean {\n const found = findNode(nodes, ancestorId)\n if (!found) return false\n return findNode(found.node.children, maybeDescendantId) !== null\n}\n\n/** Level of a node: 0 = top-level, 1 = dropdown child. */\nexport function levelOf(nodes: NavNode[], id: string): number {\n const loc = findNode(nodes, id)\n if (!loc) return -1\n if (loc.parentId === ROOT) return 0\n return 1 + Math.max(0, levelOf(nodes, loc.parentId))\n}\n\n/** Level a new child would have under parentId (ROOT → 0). */\nfunction insertedLevel(nodes: NavNode[], parentId: string | null): number {\n if (parentId === ROOT) return 0\n const parentLevel = levelOf(nodes, parentId)\n if (parentLevel < 0) return -1\n return parentLevel + 1\n}\n\n/** Remove node + subtree from forest. Returns taken node, or null if missing. */\nexport function takeNode(nodes: NavNode[], id: string): { forest: NavNode[]; taken: NavNode } | null {\n const forest = cloneForest(nodes)\n const loc = findNode(forest, id)\n if (!loc) return null\n const [taken] = loc.siblings.splice(loc.index, 1)\n if (!taken) return null\n return { forest, taken }\n}\n\n/** Insert `node` under parentId at index (clamped). Mutates forest in place. */\nexport function insertInto(\n forest: NavNode[],\n node: NavNode,\n parentId: string | null,\n index: number\n): boolean {\n const siblings = getChildrenOf(forest, parentId)\n if (!siblings) return false\n const clamped = Math.max(0, Math.min(index, siblings.length))\n siblings.splice(clamped, 0, node)\n return true\n}\n\n/**\n * Empty dropdown → plain link (children array cleared / node stays).\n * Called after every successful move.\n */\nexport function normalize(nodes: NavNode[]): NavNode[] {\n const walk = (list: NavNode[]): NavNode[] =>\n list.map((n) => {\n const children = walk(n.children)\n return { id: n.id, children }\n })\n return walk(nodes)\n}\n\n/**\n * Move draggedId to (parentId, targetIndex).\n * Rejects: self/descendant parent, depth > MAX_LEVEL.nav, missing nodes, no-op same slot.\n * Index math: same-parent later insert shifts −1 after take (take → insertInto).\n */\nexport function moveNode(\n model: NavNode[],\n draggedId: string,\n target: NavMoveTarget\n): NavNode[] | null {\n const { parentId, index: targetIndex } = target\n\n if (parentId === draggedId) return null\n if (parentId !== ROOT && isDescendant(model, draggedId, parentId)) return null\n\n const nextLevel = insertedLevel(model, parentId)\n if (nextLevel < 0 || nextLevel > MAX_LEVEL.nav) return null\n\n // Dragging a dropdown (node with children) under another item would nest deeper than max.\n const draggedLoc = findNode(model, draggedId)\n if (!draggedLoc) return null\n if (parentId !== ROOT && draggedLoc.node.children.length > 0) return null\n\n const taken = takeNode(model, draggedId)\n if (!taken) return null\n\n let insertIndex = targetIndex\n if (draggedLoc.parentId === parentId && draggedLoc.index < targetIndex) {\n insertIndex -= 1\n }\n\n if (!insertInto(taken.forest, taken.taken, parentId, insertIndex)) return null\n\n const next = normalize(taken.forest)\n\n // No-op if structure unchanged\n if (forestsEqual(model, next)) return null\n return next\n}\n\nexport function forestsEqual(a: NavNode[], b: NavNode[]): boolean {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n const left = a[i]!\n const right = b[i]!\n if (left.id !== right.id) return false\n if (!forestsEqual(left.children, right.children)) return false\n }\n return true\n}\n\nexport function forestFromFlatOrder(order: string[]): NavNode[] {\n return order.map((id) => ({ id, children: [] }))\n}\n\n/** Prefer flat string[] when no nesting (backward compatible with existing content). */\nexport function serializeNavOrder(nodes: NavNode[]): string {\n const hasNesting = nodes.some((n) => n.children.length > 0)\n if (!hasNesting) {\n return JSON.stringify(nodes.map((n) => n.id))\n }\n return JSON.stringify(nodes)\n}\n\nexport function parseNavOrderJson(raw: string | undefined): NavNode[] | null {\n if (!raw) return null\n try {\n const parsed = JSON.parse(raw) as unknown\n if (!Array.isArray(parsed)) return null\n if (parsed.every((x) => typeof x === 'string')) {\n return forestFromFlatOrder(parsed.filter((x): x is string => typeof x === 'string' && x.length > 0))\n }\n return parseNavNodeList(parsed)\n } catch {\n return null\n }\n}\n\nfunction parseNavNodeList(raw: unknown[]): NavNode[] | null {\n const out: NavNode[] = []\n for (const item of raw) {\n if (typeof item === 'string' && item.length > 0) {\n out.push({ id: item, children: [] })\n continue\n }\n if (!item || typeof item !== 'object') return null\n const rec = item as { id?: unknown; children?: unknown }\n if (typeof rec.id !== 'string' || !rec.id) return null\n const children = Array.isArray(rec.children) ? parseNavNodeList(rec.children) : []\n if (!children) return null\n out.push({ id: rec.id, children })\n }\n return out\n}\n\nexport function flattenNavOrder(nodes: NavNode[]): string[] {\n const out: string[] = []\n const walk = (list: NavNode[]) => {\n for (const n of list) {\n out.push(n.id)\n walk(n.children)\n }\n }\n walk(nodes)\n return out\n}\n","import { getStoredLinkHref } from '../linkHrefStore'\nimport {\n flattenNavOrder,\n forestFromFlatOrder,\n forestsEqual,\n moveNode,\n parseNavOrderJson,\n serializeNavOrder,\n type NavNode,\n} from './nav-tree'\n\nexport const NAV_COUNT_KEY = '__ohw_nav_count'\nexport const NAV_ORDER_KEY = '__ohw_nav_order'\n\nconst NAV_HREF_RE = /^nav-(\\d+)-href$/\n\nexport function isNavbarHrefKey(key: string | null): boolean {\n if (!key) return false\n if (key === 'nav-book-href') return false\n return NAV_HREF_RE.test(key)\n}\n\nfunction getLinkHref(el: HTMLElement): string {\n const key = el.getAttribute('data-ohw-href-key')\n if (key) {\n const stored = getStoredLinkHref(key)\n if (stored !== undefined) return stored\n }\n return el.getAttribute('href') ?? ''\n}\n\nfunction isNavbarButton(el: HTMLElement): boolean {\n return el.hasAttribute('data-ohw-role') && el.getAttribute('data-ohw-role') === 'navbar-button'\n}\n\nfunction isNavbarLinkItem(el: HTMLElement): boolean {\n if (!el.matches('[data-ohw-href-key]')) return false\n if (isNavbarButton(el)) return false\n if (!el.querySelector('[data-ohw-editable=\"text\"]')) return false\n return Boolean(el.closest('nav, [data-ohw-nav-container], [data-ohw-nav-drawer]'))\n}\n\nexport function getNavbarDesktopContainer(): HTMLElement | null {\n return document.querySelector<HTMLElement>('[data-ohw-nav-container]')\n}\n\nexport function getNavbarDrawerContainer(): HTMLElement | null {\n return document.querySelector<HTMLElement>('[data-ohw-nav-drawer]')\n}\n\nexport function listNavbarItems(): HTMLElement[] {\n const desktop = getNavbarDesktopContainer()\n if (desktop) {\n return Array.from(desktop.querySelectorAll<HTMLElement>('[data-ohw-href-key]')).filter(isNavbarLinkItem)\n }\n\n const drawer = getNavbarDrawerContainer()\n if (drawer) {\n return Array.from(drawer.querySelectorAll<HTMLElement>('[data-ohw-href-key]')).filter(isNavbarLinkItem)\n }\n\n return Array.from(document.querySelectorAll<HTMLElement>('nav [data-ohw-href-key]')).filter(isNavbarLinkItem)\n}\n\nexport function parseNavIndexFromKey(key: string | null): number | null {\n if (!key) return null\n const match = key.match(NAV_HREF_RE)\n if (!match) return null\n return parseInt(match[1]!, 10)\n}\n\nexport function getNavbarIndicesInDom(): number[] {\n const indices = new Set<number>()\n for (const item of listNavbarItems()) {\n const idx = parseNavIndexFromKey(item.getAttribute('data-ohw-href-key'))\n if (idx !== null) indices.add(idx)\n }\n return [...indices].sort((a, b) => a - b)\n}\n\nexport function getNextNavbarIndex(): number {\n const indices = getNavbarIndicesInDom()\n if (indices.length === 0) return 0\n return Math.max(...indices) + 1\n}\n\nexport function getNavbarExistingTargets(): string[] {\n return listNavbarItems()\n .map((el) => getLinkHref(el))\n .filter(Boolean)\n}\n\nexport function getNavOrderFromDom(): string[] {\n return listNavbarItems()\n .map((el) => el.getAttribute('data-ohw-href-key'))\n .filter((key): key is string => Boolean(key))\n}\n\nfunction findCounterpartByHrefKey(hrefKey: string, root: ParentNode): HTMLElement | null {\n return root.querySelector<HTMLElement>(`[data-ohw-href-key=\"${CSS.escape(hrefKey)}\"]`)\n}\n\nfunction cloneNavLinkShell(template: HTMLElement | null): HTMLAnchorElement {\n const anchor = document.createElement('a')\n if (template) {\n anchor.style.cssText = template.style.cssText\n if (template.className) anchor.className = template.className\n }\n anchor.style.cursor = 'pointer'\n anchor.style.textDecoration = 'none'\n return anchor\n}\n\nfunction buildNavLink(index: number, href: string, label: string, template: HTMLElement | null): HTMLAnchorElement {\n const anchor = cloneNavLinkShell(template)\n anchor.href = href\n anchor.setAttribute('data-ohw-href-key', `nav-${index}-href`)\n\n const span = document.createElement('span')\n span.setAttribute('data-ohw-editable', 'text')\n span.setAttribute('data-ohw-key', `nav-${index}-label`)\n span.textContent = label\n anchor.appendChild(span)\n return anchor\n}\n\nfunction insertNavLinkInContainer(\n container: HTMLElement,\n anchor: HTMLAnchorElement,\n afterHrefKey: string | null\n) {\n if (!afterHrefKey) {\n container.appendChild(anchor)\n return\n }\n\n const afterEl = findCounterpartByHrefKey(afterHrefKey, container)\n if (afterEl?.parentElement === container) {\n afterEl.insertAdjacentElement('afterend', anchor)\n return\n }\n\n container.appendChild(anchor)\n}\n\nfunction insertNavbarItemDom(\n index: number,\n href: string,\n label: string,\n afterAnchor: HTMLElement | null\n): HTMLElement | null {\n const afterHrefKey = afterAnchor?.getAttribute('data-ohw-href-key') ?? null\n const desktopItems = getNavbarDesktopContainer()?.querySelectorAll<HTMLElement>('[data-ohw-href-key]') ?? []\n const drawerItems = getNavbarDrawerContainer()?.querySelectorAll<HTMLElement>('[data-ohw-href-key]') ?? []\n const desktopTemplate = Array.from(desktopItems).find(isNavbarLinkItem) ?? null\n const drawerTemplate = Array.from(drawerItems).find(isNavbarLinkItem) ?? null\n\n let primary: HTMLAnchorElement | null = null\n const desktopContainer = getNavbarDesktopContainer()\n\n if (desktopContainer) {\n const desktopAnchor = buildNavLink(index, href, label, desktopTemplate)\n insertNavLinkInContainer(desktopContainer, desktopAnchor, afterHrefKey)\n primary = desktopAnchor\n }\n\n const drawerContainer = getNavbarDrawerContainer()\n if (drawerContainer) {\n const drawerAnchor = buildNavLink(index, href, label, drawerTemplate)\n insertNavLinkInContainer(drawerContainer, drawerAnchor, afterHrefKey)\n if (!primary) primary = drawerAnchor\n }\n\n if (!primary) {\n const fallback = buildNavLink(index, href, label, listNavbarItems()[0] ?? null)\n const nav = document.querySelector('nav')\n nav?.appendChild(fallback)\n primary = fallback\n }\n\n return primary\n}\n\nfunction navOrderKeysEqual(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false\n }\n return true\n}\n\nfunction getNavbarLinkKeysInContainer(container: HTMLElement): string[] {\n return Array.from(container.querySelectorAll<HTMLElement>('[data-ohw-href-key]'))\n .filter(isNavbarLinkItem)\n .map((el) => el.getAttribute('data-ohw-href-key'))\n .filter((key): key is string => Boolean(key))\n}\n\n/**\n * Re-order nav links without no-op appendChild churn.\n * Early-return when already ordered (including extras not in `order`).\n * Successive appendChild (move-to-end in target order) is correct only when\n * nothing untouched (e.g. the CTA button) follows the links — otherwise each\n * appendChild pulls a link past that untouched sibling, dragging it to the\n * front. Insert before that sibling instead so it stays put.\n */\nfunction applyNavOrderToContainer(container: HTMLElement, order: string[]) {\n const desired = order.filter((key, i) => order.indexOf(key) === i)\n const current = getNavbarLinkKeysInContainer(container)\n const extras = current.filter((key) => !desired.includes(key))\n const expected = [...desired.filter((key) => current.includes(key)), ...extras]\n const orderedEls: HTMLElement[] = []\n\n if (navOrderKeysEqual(current, expected)) return\n\n if (current.length === expected.length && current.every((key, i) => key === expected[i])) {\n return\n }\n\n // Anchor = whatever currently follows the last link item (e.g. the CTA button),\n // captured before any mutation so it stays a stable insertion boundary.\n const lastCurrentLinkEl =\n current.length > 0 ? findCounterpartByHrefKey(current[current.length - 1]!, container) : null\n const anchor =\n lastCurrentLinkEl?.parentElement === container ? lastCurrentLinkEl.nextElementSibling : null\n\n const seen = new Set<string>()\n for (const hrefKey of desired) {\n if (seen.has(hrefKey)) continue\n seen.add(hrefKey)\n const el = findCounterpartByHrefKey(hrefKey, container)\n if (el && isNavbarLinkItem(el)) orderedEls.push(el)\n }\n\n for (const el of container.querySelectorAll<HTMLElement>('[data-ohw-href-key]')) {\n if (!isNavbarLinkItem(el)) continue\n const key = el.getAttribute('data-ohw-href-key')\n if (!key || seen.has(key)) continue\n orderedEls.push(el)\n }\n\n for (const el of orderedEls) {\n if (anchor) {\n if (el.nextSibling !== anchor) container.insertBefore(el, anchor)\n } else if (container.lastElementChild !== el) {\n container.appendChild(el)\n }\n }\n}\n\n/** Re-order nav link anchors in desktop + drawer containers. */\nexport function applyNavOrder(order: string[]) {\n const desktop = getNavbarDesktopContainer()\n if (desktop) applyNavOrderToContainer(desktop, order)\n\n const drawer = getNavbarDrawerContainer()\n if (drawer) applyNavOrderToContainer(drawer, order)\n}\n\nfunction applyChildrenOrder(parentHrefKey: string, childKeys: string[], root: ParentNode) {\n const parent = findCounterpartByHrefKey(parentHrefKey, root)\n if (!parent) return\n const group = parent.closest<HTMLElement>('[data-ohw-nav-group]')\n const childrenRoot = group?.querySelector<HTMLElement>(':scope > [data-ohw-nav-children]')\n if (!childrenRoot) return\n\n const current = Array.from(childrenRoot.querySelectorAll<HTMLElement>(':scope > [data-ohw-href-key]'))\n .map((el) => el.getAttribute('data-ohw-href-key'))\n .filter((key): key is string => Boolean(key))\n if (navOrderKeysEqual(current, childKeys)) return\n\n for (const key of childKeys) {\n const el = findCounterpartByHrefKey(key, root)\n if (!el) continue\n if (childrenRoot.lastElementChild !== el) {\n childrenRoot.appendChild(el)\n }\n }\n}\n\n/** Apply forest: root siblings in nav container; children inside each group's children root. */\nexport function applyNavForest(forest: NavNode[]) {\n if (forestsEqual(forest, getNavForestFromDom())) return\n\n const rootKeys = forest.map((n) => n.id)\n applyNavOrder(rootKeys)\n\n const desktop = getNavbarDesktopContainer()\n const drawer = getNavbarDrawerContainer()\n for (const node of forest) {\n if (node.children.length === 0) continue\n const childKeys = node.children.map((c) => c.id)\n if (desktop) applyChildrenOrder(node.id, childKeys, desktop)\n if (drawer) applyChildrenOrder(node.id, childKeys, drawer)\n }\n}\n\n/** Build forest from current DOM (flat root; children via `data-ohw-nav-children` when present). */\nexport function getNavForestFromDom(): NavNode[] {\n const items = listNavbarItems()\n const nestedChildKeys = new Set<string>()\n const roots: NavNode[] = []\n\n for (const item of items) {\n const key = item.getAttribute('data-ohw-href-key')\n if (!key || !isNavbarHrefKey(key)) continue\n if (item.closest('[data-ohw-nav-children]')) continue\n\n const group = item.closest<HTMLElement>('[data-ohw-nav-group]')\n const childrenRoot = group?.querySelector<HTMLElement>(':scope > [data-ohw-nav-children]')\n const children: NavNode[] = []\n if (childrenRoot) {\n for (const child of childrenRoot.querySelectorAll<HTMLElement>(':scope > [data-ohw-href-key]')) {\n if (!isNavbarLinkItem(child)) continue\n const childKey = child.getAttribute('data-ohw-href-key')\n if (!childKey || !isNavbarHrefKey(childKey)) continue\n nestedChildKeys.add(childKey)\n children.push({ id: childKey, children: [] })\n }\n }\n roots.push({ id: key, children })\n }\n\n if (roots.length === 0) {\n return forestFromFlatOrder(\n getNavOrderFromDom().filter((k) => isNavbarHrefKey(k) && !nestedChildKeys.has(k))\n )\n }\n return roots\n}\n\n/**\n * Plan a move to (parentId, insertIndex). Returns serialized order JSON string, or null if no-op.\n * Flat templates: parentId must be null (root reorder only until OHH-507 dropdown markup).\n */\nexport function planNavItemMove(\n hrefKey: string,\n parentId: string | null,\n insertIndex: number\n): { forest: NavNode[]; orderJson: string; flatOrder: string[] } | null {\n const model = getNavForestFromDom()\n const next = moveNode(model, hrefKey, { parentId, index: insertIndex })\n if (!next) return null\n if (forestsEqual(model, next)) return null\n return {\n forest: next,\n orderJson: serializeNavOrder(next),\n flatOrder: flattenNavOrder(next),\n }\n}\n\nexport function collectNavbarIndicesFromContent(content: Record<string, string>): number[] {\n const indices = new Set<number>()\n for (const key of Object.keys(content)) {\n const idx = parseNavIndexFromKey(key)\n if (idx !== null) indices.add(idx)\n }\n const countRaw = content[NAV_COUNT_KEY]\n if (countRaw) {\n const count = parseInt(countRaw, 10)\n if (Number.isFinite(count) && count > 0) {\n for (let i = 0; i < count; i++) indices.add(i)\n }\n }\n return [...indices].sort((a, b) => a - b)\n}\n\nfunction navbarIndexExistsInDom(index: number): boolean {\n return document.querySelector(`[data-ohw-href-key=\"nav-${index}-href\"]`) !== null\n}\n\nexport function reconcileNavbarItemsFromContent(content: Record<string, string>) {\n const indices = collectNavbarIndicesFromContent(content)\n\n for (const index of indices) {\n if (navbarIndexExistsInDom(index)) continue\n const href = content[`nav-${index}-href`]\n const label = content[`nav-${index}-label`]\n if (!href && !label) continue\n insertNavbarItemDom(index, href ?? '/', label ?? 'Untitled', null)\n }\n\n const orderForest = parseNavOrderJson(content[NAV_ORDER_KEY])\n if (orderForest?.length) {\n applyNavForest(orderForest)\n }\n}\n\nexport function buildNavOrderAfterInsert(afterAnchor: HTMLElement | null, newHrefKey: string): string[] {\n const order = getNavOrderFromDom()\n if (!afterAnchor) {\n if (!order.includes(newHrefKey)) order.push(newHrefKey)\n return order\n }\n\n const afterKey = afterAnchor.getAttribute('data-ohw-href-key')\n if (!afterKey) {\n if (!order.includes(newHrefKey)) order.push(newHrefKey)\n return order\n }\n\n const withoutNew = order.filter((key) => key !== newHrefKey)\n const pos = withoutNew.indexOf(afterKey)\n if (pos >= 0) {\n withoutNew.splice(pos + 1, 0, newHrefKey)\n return withoutNew\n }\n\n withoutNew.push(newHrefKey)\n return withoutNew\n}\n\nexport type NavbarItemInsertResult = {\n anchor: HTMLElement\n index: number\n hrefKey: string\n labelKey: string\n href: string\n label: string\n order: string[]\n}\n\nexport function insertNavbarItem(\n href: string,\n label: string,\n afterAnchor: HTMLElement | null = null\n): NavbarItemInsertResult {\n const index = getNextNavbarIndex()\n const anchor = insertNavbarItemDom(index, href, label, afterAnchor)\n if (!anchor) throw new Error('Failed to insert navbar item')\n\n const hrefKey = `nav-${index}-href`\n const order = buildNavOrderAfterInsert(afterAnchor, hrefKey)\n applyNavOrder(order)\n\n return {\n anchor,\n index,\n hrefKey,\n labelKey: `nav-${index}-label`,\n href,\n label,\n order,\n }\n}\n","/** Footer link/column order helpers — parallel to nav-items.ts for OHH-436. */\n\nexport const FOOTER_ORDER_KEY = '__ohw_footer_order'\n\nconst FOOTER_HREF_RE = /^footer-(\\d+)-(\\d+)-href$/\n\nexport function parseFooterHrefKey(key: string | null): { col: number; item: number } | null {\n if (!key) return null\n const match = key.match(FOOTER_HREF_RE)\n if (!match) return null\n return { col: parseInt(match[1]!, 10), item: parseInt(match[2]!, 10) }\n}\n\nexport function isFooterHrefKey(key: string | null): boolean {\n return parseFooterHrefKey(key) !== null\n}\n\nexport function getFooterRoot(): HTMLElement | null {\n return document.querySelector<HTMLElement>('footer[data-ohw-section=\"footer\"], footer')\n}\n\nexport function getFooterLinksContainer(): HTMLElement | null {\n return (\n document.querySelector<HTMLElement>('[data-ohw-footer-links]') ??\n document.querySelector<HTMLElement>('.rb-footer-links')\n )\n}\n\nfunction isFooterLinkAnchor(el: HTMLElement): boolean {\n if (!el.matches('[data-ohw-href-key]')) return false\n if (!isFooterHrefKey(el.getAttribute('data-ohw-href-key'))) return false\n return Boolean(el.querySelector('[data-ohw-editable=\"text\"]'))\n}\n\nexport function listFooterColumns(): HTMLElement[] {\n const root =\n getFooterLinksContainer() ??\n getFooterRoot()?.querySelector<HTMLElement>('.rb-footer-links') ??\n null\n if (!root) return []\n\n const explicit = Array.from(root.querySelectorAll<HTMLElement>(':scope > [data-ohw-footer-col]'))\n if (explicit.length > 0) return explicit\n\n return Array.from(root.children).filter((el): el is HTMLElement => {\n if (!(el instanceof HTMLElement)) return false\n return Array.from(el.querySelectorAll<HTMLElement>(':scope > [data-ohw-href-key]')).some(\n isFooterLinkAnchor\n )\n })\n}\n\nexport function listFooterLinksInColumn(column: HTMLElement): HTMLElement[] {\n return Array.from(column.querySelectorAll<HTMLElement>(':scope > [data-ohw-href-key]')).filter(\n isFooterLinkAnchor\n )\n}\n\nexport function findFooterColumnForLink(anchor: HTMLElement): HTMLElement | null {\n const columns = listFooterColumns()\n return columns.find((col) => col.contains(anchor)) ?? null\n}\n\nexport function getFooterOrderFromDom(): string[][] {\n return listFooterColumns().map((col) =>\n listFooterLinksInColumn(col)\n .map((el) => el.getAttribute('data-ohw-href-key'))\n .filter((key): key is string => Boolean(key))\n )\n}\n\nfunction findFooterLinkByKey(hrefKey: string): HTMLElement | null {\n return document.querySelector<HTMLElement>(\n `footer [data-ohw-href-key=\"${CSS.escape(hrefKey)}\"]`\n )\n}\n\nfunction syncFooterColumnIndices(columns: HTMLElement[]) {\n columns.forEach((col, index) => {\n const next = String(index)\n if (col.getAttribute('data-ohw-footer-col') !== next) {\n col.setAttribute('data-ohw-footer-col', next)\n }\n })\n}\n\nfunction appendChildIfNeeded(parent: HTMLElement, child: HTMLElement) {\n if (parent.lastElementChild !== child) {\n parent.appendChild(child)\n }\n}\n\n/** Re-order column shells + links to match `order`. */\nexport function applyFooterOrder(order: string[][]) {\n const container = getFooterLinksContainer()\n if (!container) return\n\n const columns = listFooterColumns()\n if (columns.length === 0) return\n\n const currentOrder = getFooterOrderFromDom()\n if (ordersEqual(order, currentOrder)) {\n syncFooterColumnIndices(columns)\n return\n }\n\n // Resolve each order slot to a column shell (by current owner of its links), then\n // physically reorder shells so headings/structure move with the column.\n const used = new Set<HTMLElement>()\n const orderedCols: HTMLElement[] = []\n for (const colOrder of order) {\n let matched: HTMLElement | null = null\n for (const hrefKey of colOrder) {\n const link = findFooterLinkByKey(hrefKey)\n if (!link) continue\n const owner = findFooterColumnForLink(link)\n if (owner && !used.has(owner)) {\n matched = owner\n break\n }\n }\n if (!matched) {\n matched = columns.find((col) => !used.has(col)) ?? null\n }\n if (matched) {\n used.add(matched)\n orderedCols.push(matched)\n }\n }\n for (const col of columns) {\n if (!used.has(col)) orderedCols.push(col)\n }\n\n for (const col of orderedCols) {\n appendChildIfNeeded(container, col)\n }\n\n const freshColumns = listFooterColumns()\n syncFooterColumnIndices(freshColumns)\n\n // Successive appendChild builds the correct order; insertBefore(next) breaks\n // end→front and other permutations.\n for (let c = 0; c < order.length; c++) {\n const col = freshColumns[c]\n if (!col) continue\n const colOrder = order[c]!\n for (const hrefKey of colOrder) {\n const el = findFooterLinkByKey(hrefKey)\n if (!el) continue\n if (el.parentElement !== col || col.lastElementChild !== el) {\n col.appendChild(el)\n }\n }\n }\n}\n\nfunction ordersEqual(a: string[][], b: string[][]): boolean {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n const left = a[i]!\n const right = b[i]!\n if (left.length !== right.length) return false\n for (let j = 0; j < left.length; j++) {\n if (left[j] !== right[j]) return false\n }\n }\n return true\n}\n\nexport function planFooterLinkMove(\n hrefKey: string,\n targetColIndex: number,\n insertIndex: number\n): string[][] | null {\n const order = getFooterOrderFromDom()\n if (targetColIndex < 0 || targetColIndex >= order.length) return null\n\n let fromCol = -1\n let fromIdx = -1\n for (let c = 0; c < order.length; c++) {\n const idx = order[c]!.indexOf(hrefKey)\n if (idx >= 0) {\n fromCol = c\n fromIdx = idx\n break\n }\n }\n if (fromCol < 0) return null\n\n const next = order.map((col) => [...col])\n next[fromCol]!.splice(fromIdx, 1)\n\n let adjusted = insertIndex\n if (fromCol === targetColIndex && fromIdx < insertIndex) adjusted -= 1\n adjusted = Math.max(0, Math.min(adjusted, next[targetColIndex]!.length))\n next[targetColIndex]!.splice(adjusted, 0, hrefKey)\n\n if (ordersEqual(next, order)) return null\n return next\n}\n\n/**\n * Move a footer link to `targetColIndex` at `insertIndex` (index in the array\n * **before** removal adjustment — same convention as nav take→insert).\n * Returns new order, or null if no-op / invalid.\n */\nexport function moveFooterLink(\n hrefKey: string,\n targetColIndex: number,\n insertIndex: number\n): string[][] | null {\n const next = planFooterLinkMove(hrefKey, targetColIndex, insertIndex)\n if (!next) return null\n applyFooterOrder(next)\n return next\n}\n\nexport function planFooterColumnMove(fromIndex: number, toIndex: number): string[][] | null {\n const order = getFooterOrderFromDom()\n const columns = listFooterColumns()\n if (fromIndex < 0 || fromIndex >= columns.length || toIndex < 0 || toIndex > columns.length) {\n return null\n }\n if (toIndex === fromIndex || toIndex === fromIndex + 1) return null\n\n const nextOrder = order.map((col) => [...col])\n const [movedOrder] = nextOrder.splice(fromIndex, 1)\n if (!movedOrder) return null\n\n let adjusted = toIndex\n if (fromIndex < toIndex) adjusted -= 1\n adjusted = Math.max(0, Math.min(adjusted, nextOrder.length))\n nextOrder.splice(adjusted, 0, movedOrder)\n\n if (ordersEqual(nextOrder, order)) return null\n return nextOrder\n}\n\n/**\n * Move a footer column from `fromIndex` to `toIndex` (insertion index before removal adjust).\n * Links inside the column are preserved.\n */\nexport function moveFooterColumn(fromIndex: number, toIndex: number): string[][] | null {\n const nextOrder = planFooterColumnMove(fromIndex, toIndex)\n if (!nextOrder) return null\n\n const columns = listFooterColumns()\n const container = getFooterLinksContainer()\n if (!container) return null\n\n const fromIndexActual = (() => {\n // Re-derive fromIndex from current DOM vs planned order isn't needed —\n // plan already validated against current DOM.\n return fromIndex\n })()\n\n let adjusted = toIndex\n if (fromIndexActual < toIndex) adjusted -= 1\n adjusted = Math.max(0, Math.min(adjusted, columns.length - 1))\n\n const nextCols = [...columns]\n const [movedCol] = nextCols.splice(fromIndexActual, 1)\n if (!movedCol) return null\n nextCols.splice(adjusted, 0, movedCol)\n\n for (const col of nextCols) container.appendChild(col)\n syncFooterColumnIndices(nextCols)\n applyFooterOrder(nextOrder)\n return nextOrder\n}\n\nfunction parseFooterOrder(content: Record<string, string>): string[][] | null {\n const raw = content[FOOTER_ORDER_KEY]\n if (!raw) return null\n try {\n const parsed = JSON.parse(raw) as unknown\n if (!Array.isArray(parsed)) return null\n return parsed\n .filter((col): col is unknown[] => Array.isArray(col))\n .map((col) => col.filter((key): key is string => typeof key === 'string' && key.length > 0))\n } catch {\n return null\n }\n}\n\nexport function reconcileFooterOrderFromContent(content: Record<string, string>) {\n const order = parseFooterOrder(content)\n if (!order?.length) return\n const current = getFooterOrderFromDom()\n if (ordersEqual(order, current)) {\n syncFooterColumnIndices(listFooterColumns())\n return\n }\n applyFooterOrder(order)\n}\n\nexport type FooterDropSlot = {\n /** Insertion index among current siblings in the target column / among columns. */\n insertIndex: number\n columnIndex: number\n /** Fixed-position placement for DropIndicator. */\n left: number\n top: number\n width: number\n height: number\n direction: 'horizontal' | 'vertical'\n}\n\n/** True when links sit side-by-side in a row rather than stacked vertically. */\nfunction isRowLayoutColumn(links: HTMLElement[]): boolean {\n if (links.length < 2) return false\n const firstTop = links[0]!.getBoundingClientRect().top\n return links.every((link) => Math.abs(link.getBoundingClientRect().top - firstTop) < 4)\n}\n\n/** Build drop slots for links inside a column (horizontal bars between vertical items). */\nexport function buildLinkDropSlots(column: HTMLElement, columnIndex: number): FooterDropSlot[] {\n const links = listFooterLinksInColumn(column)\n const colRect = column.getBoundingClientRect()\n const slots: FooterDropSlot[] = []\n const barThickness = 3\n\n if (links.length === 0) {\n slots.push({\n insertIndex: 0,\n columnIndex,\n left: colRect.left,\n top: colRect.top + colRect.height / 2 - barThickness / 2,\n width: colRect.width,\n height: barThickness,\n direction: 'horizontal',\n })\n return slots\n }\n\n if (isRowLayoutColumn(links)) {\n for (let i = 0; i <= links.length; i++) {\n let left: number\n if (i === 0) {\n left = links[0]!.getBoundingClientRect().left - barThickness / 2\n } else if (i === links.length) {\n const last = links[links.length - 1]!.getBoundingClientRect()\n left = last.right - barThickness / 2\n } else {\n const prev = links[i - 1]!.getBoundingClientRect()\n const next = links[i]!.getBoundingClientRect()\n left = (prev.right + next.left) / 2 - barThickness / 2\n }\n\n const heightRef =\n i === 0\n ? links[0]!.getBoundingClientRect()\n : i === links.length\n ? links[links.length - 1]!.getBoundingClientRect()\n : links[i]!.getBoundingClientRect()\n\n slots.push({\n insertIndex: i,\n columnIndex,\n left,\n top: heightRef.top,\n width: barThickness,\n height: Math.max(heightRef.height, colRect.height * 0.8),\n direction: 'vertical',\n })\n }\n return slots\n }\n\n for (let i = 0; i <= links.length; i++) {\n let top: number\n if (i === 0) {\n top = links[0]!.getBoundingClientRect().top - barThickness / 2\n } else if (i === links.length) {\n const last = links[links.length - 1]!.getBoundingClientRect()\n top = last.bottom - barThickness / 2\n } else {\n const prev = links[i - 1]!.getBoundingClientRect()\n const next = links[i]!.getBoundingClientRect()\n top = (prev.bottom + next.top) / 2 - barThickness / 2\n }\n\n const widthRef =\n i === 0\n ? links[0]!.getBoundingClientRect()\n : i === links.length\n ? links[links.length - 1]!.getBoundingClientRect()\n : links[i]!.getBoundingClientRect()\n\n slots.push({\n insertIndex: i,\n columnIndex,\n left: widthRef.left,\n top,\n width: Math.max(widthRef.width, colRect.width * 0.8),\n height: barThickness,\n direction: 'horizontal',\n })\n }\n\n return slots\n}\n\n/** Build drop slots for columns (vertical bars between horizontal columns). */\nexport function buildColumnDropSlots(): FooterDropSlot[] {\n const columns = listFooterColumns()\n const slots: FooterDropSlot[] = []\n const barThickness = 3\n\n if (columns.length === 0) return slots\n\n for (let i = 0; i <= columns.length; i++) {\n let left: number\n let height: number\n let top: number\n\n if (i === 0) {\n const first = columns[0]!.getBoundingClientRect()\n left = first.left - barThickness / 2\n top = first.top\n height = first.height\n } else if (i === columns.length) {\n const last = columns[columns.length - 1]!.getBoundingClientRect()\n left = last.right - barThickness / 2\n top = last.top\n height = last.height\n } else {\n const prev = columns[i - 1]!.getBoundingClientRect()\n const next = columns[i]!.getBoundingClientRect()\n left = (prev.right + next.left) / 2 - barThickness / 2\n top = Math.min(prev.top, next.top)\n height = Math.max(prev.bottom, next.bottom) - top\n }\n\n slots.push({\n insertIndex: i,\n columnIndex: i,\n left,\n top,\n width: barThickness,\n height: Math.max(height, 24),\n direction: 'vertical',\n })\n }\n\n return slots\n}\n\nexport function hitTestLinkDropSlot(\n clientX: number,\n clientY: number,\n draggedHrefKey: string\n): FooterDropSlot | null {\n const columns = listFooterColumns()\n let best: { slot: FooterDropSlot; dist: number } | null = null\n\n for (let c = 0; c < columns.length; c++) {\n const col = columns[c]!\n const colRect = col.getBoundingClientRect()\n // Prefer column under pointer; still allow near misses within padding\n const inColX = clientX >= colRect.left - 24 && clientX <= colRect.right + 24\n if (!inColX) continue\n\n const slots = buildLinkDropSlots(col, c).filter((slot) => {\n // Skip slots that would no-op (before/after self only)\n const links = listFooterLinksInColumn(col)\n const fromIdx = links.findIndex(\n (el) => el.getAttribute('data-ohw-href-key') === draggedHrefKey\n )\n if (fromIdx < 0) return true\n // same column: insertIndex === fromIdx or fromIdx+1 is no-op\n if (c === findColumnIndexForKey(draggedHrefKey) && (slot.insertIndex === fromIdx || slot.insertIndex === fromIdx + 1)) {\n return true // still show indicator, moveFooterLink will no-op\n }\n return true\n })\n\n for (const slot of slots) {\n const dist =\n slot.direction === 'vertical'\n ? Math.abs(clientX - (slot.left + slot.width / 2))\n : Math.abs(clientY - (slot.top + slot.height / 2))\n if (!best || dist < best.dist) best = { slot, dist }\n }\n }\n\n return best?.slot ?? null\n}\n\nfunction findColumnIndexForKey(hrefKey: string): number {\n const order = getFooterOrderFromDom()\n for (let c = 0; c < order.length; c++) {\n if (order[c]!.includes(hrefKey)) return c\n }\n return -1\n}\n\nexport function hitTestColumnDropSlot(clientX: number, _clientY: number): FooterDropSlot | null {\n const slots = buildColumnDropSlots()\n let best: { slot: FooterDropSlot; dist: number } | null = null\n for (const slot of slots) {\n const cx = slot.left + slot.width / 2\n const dist = Math.abs(clientX - cx)\n if (!best || dist < best.dist) best = { slot, dist }\n }\n return best?.slot ?? null\n}\n","/** Shared DOM flags / helpers for footer + navbar press-to-drag (OHH-435 / OHH-436). */\n\n/** Anchors are draggable by default — that steals mousedown and blocks text edit clicks. */\nexport function disableNativeHrefDrag(el: HTMLElement) {\n if (el.draggable) el.draggable = false\n if (el.getAttribute('draggable') !== 'false') {\n el.setAttribute('draggable', 'false')\n }\n}\n\nexport function clearTextSelection() {\n const sel = window.getSelection()\n if (sel && !sel.isCollapsed) sel.removeAllRanges()\n}\n\nexport function armItemPressDrag() {\n document.documentElement.setAttribute('data-ohw-footer-press-drag', '')\n}\n\nexport function lockItemDuringDrag() {\n document.documentElement.removeAttribute('data-ohw-footer-press-drag')\n document.documentElement.setAttribute('data-ohw-item-dragging', '')\n clearTextSelection()\n}\n\nexport function unlockItemDragInteraction() {\n // This also runs on routine effect cleanup (component re-render, not just a real drag\n // ending) — only clear the selection when a drag actually locked it, or every cleanup\n // wipes whatever text selection the user happens to have at that moment (e.g. after\n // applying a toolbar format), regardless of the footer/nav drag feature.\n const wasDragging = document.documentElement.hasAttribute('data-ohw-item-dragging')\n document.documentElement.removeAttribute('data-ohw-footer-press-drag')\n document.documentElement.removeAttribute('data-ohw-item-dragging')\n if (wasDragging) clearTextSelection()\n}\n\n/** @deprecated Prefer armItemPressDrag — alias kept for footer call sites. */\nexport const armFooterPressDrag = armItemPressDrag\n/** @deprecated Prefer lockItemDuringDrag */\nexport const lockFooterDuringDrag = lockItemDuringDrag\n/** @deprecated Prefer unlockItemDragInteraction */\nexport const unlockFooterDragInteraction = unlockItemDragInteraction\n","/** Navbar drop slots + hit-testing — OHH-435 (mirrors footer-items drop helpers). */\n\nimport {\n getNavbarDesktopContainer,\n getNavbarDrawerContainer,\n isNavbarHrefKey,\n listNavbarItems,\n} from './nav-items'\n\nexport type NavDropSlot = {\n /** Insertion index among siblings under parentId (before removal adjust). */\n insertIndex: number\n /** null = top-level root list */\n parentId: string | null\n left: number\n top: number\n width: number\n height: number\n direction: 'horizontal' | 'vertical'\n}\n\nfunction listReorderableNavItems(): HTMLElement[] {\n return listNavbarItems().filter((el) => {\n const key = el.getAttribute('data-ohw-href-key')\n return isNavbarHrefKey(key) && !el.closest('[data-ohw-nav-children]')\n })\n}\n\nfunction listNavChildren(parentHrefKey: string): HTMLElement[] {\n const items = listNavbarItems()\n const parent = items.find((el) => el.getAttribute('data-ohw-href-key') === parentHrefKey)\n if (!parent) return []\n const group = parent.closest<HTMLElement>('[data-ohw-nav-group]')\n const childrenRoot = group?.querySelector<HTMLElement>(':scope > [data-ohw-nav-children]')\n if (!childrenRoot) return []\n return Array.from(childrenRoot.querySelectorAll<HTMLElement>(':scope > [data-ohw-href-key]')).filter(\n (el) => isNavbarHrefKey(el.getAttribute('data-ohw-href-key'))\n )\n}\n\nfunction activeNavListContainer(): HTMLElement | null {\n const desktop = getNavbarDesktopContainer()\n if (desktop && desktop.getClientRects().length > 0) {\n const style = window.getComputedStyle(desktop)\n if (style.display !== 'none' && style.visibility !== 'hidden') return desktop\n }\n return getNavbarDrawerContainer()\n}\n\n/** Vertical bars between horizontal top-level nav items. */\nexport function buildRootNavDropSlots(): NavDropSlot[] {\n const items = listReorderableNavItems()\n const slots: NavDropSlot[] = []\n const barThickness = 3\n\n if (items.length === 0) {\n const container = activeNavListContainer()\n if (!container) return slots\n const rect = container.getBoundingClientRect()\n slots.push({\n insertIndex: 0,\n parentId: null,\n left: rect.left + rect.width / 2 - barThickness / 2,\n top: rect.top,\n width: barThickness,\n height: Math.max(rect.height, 24),\n direction: 'vertical',\n })\n return slots\n }\n\n // Middle slots sit at half the gap between neighbors. Mirror that offset for the\n // first/last ends so terminal indicators aren't flush against the item chrome.\n const edgeGap = (() => {\n if (items.length < 2) return 32\n const a = items[0]!.getBoundingClientRect()\n const b = items[1]!.getBoundingClientRect()\n return Math.max(0, b.left - a.right)\n })()\n\n for (let i = 0; i <= items.length; i++) {\n let left: number\n let top: number\n let height: number\n\n if (i === 0) {\n const first = items[0]!.getBoundingClientRect()\n left = first.left - edgeGap / 2 - barThickness / 2\n top = first.top\n height = first.height\n } else if (i === items.length) {\n const last = items[items.length - 1]!.getBoundingClientRect()\n const lastGap =\n items.length >= 2\n ? Math.max(\n 0,\n last.left - items[items.length - 2]!.getBoundingClientRect().right\n )\n : edgeGap\n left = last.right + lastGap / 2 - barThickness / 2\n top = last.top\n height = last.height\n } else {\n const prev = items[i - 1]!.getBoundingClientRect()\n const next = items[i]!.getBoundingClientRect()\n left = (prev.right + next.left) / 2 - barThickness / 2\n top = Math.min(prev.top, next.top)\n height = Math.max(prev.bottom, next.bottom) - top\n }\n\n slots.push({\n insertIndex: i,\n parentId: null,\n left,\n top,\n width: barThickness,\n height: Math.max(height, 24),\n direction: 'vertical',\n })\n }\n\n return slots\n}\n\n/** Horizontal bars between vertical dropdown children (when group markup exists). */\nexport function buildChildNavDropSlots(parentHrefKey: string): NavDropSlot[] {\n const children = listNavChildren(parentHrefKey)\n const slots: NavDropSlot[] = []\n const barThickness = 3\n if (children.length === 0) return slots\n\n const edgeGap = (() => {\n if (children.length < 2) return 16\n const a = children[0]!.getBoundingClientRect()\n const b = children[1]!.getBoundingClientRect()\n return Math.max(0, b.top - a.bottom)\n })()\n\n for (let i = 0; i <= children.length; i++) {\n let top: number\n let width: number\n let left: number\n\n if (i === 0) {\n const first = children[0]!.getBoundingClientRect()\n top = first.top - edgeGap / 2 - barThickness / 2\n left = first.left\n width = first.width\n } else if (i === children.length) {\n const last = children[children.length - 1]!.getBoundingClientRect()\n const lastGap =\n children.length >= 2\n ? Math.max(\n 0,\n last.top - children[children.length - 2]!.getBoundingClientRect().bottom\n )\n : edgeGap\n top = last.bottom + lastGap / 2 - barThickness / 2\n left = last.left\n width = last.width\n } else {\n const prev = children[i - 1]!.getBoundingClientRect()\n const next = children[i]!.getBoundingClientRect()\n top = (prev.bottom + next.top) / 2 - barThickness / 2\n left = Math.min(prev.left, next.left)\n width = Math.max(prev.right, next.right) - left\n }\n\n slots.push({\n insertIndex: i,\n parentId: parentHrefKey,\n left,\n top,\n width: Math.max(width, 40),\n height: barThickness,\n direction: 'horizontal',\n })\n }\n\n return slots\n}\n\nexport function buildAllNavDropSlots(draggedHrefKey: string): NavDropSlot[] {\n const slots = [...buildRootNavDropSlots()]\n\n // Reparent / reorder within open dropdowns (OHH-507 markup).\n for (const item of listReorderableNavItems()) {\n const key = item.getAttribute('data-ohw-href-key')\n if (!key || key === draggedHrefKey) continue\n const group = item.closest<HTMLElement>('[data-ohw-nav-group]')\n if (!group?.querySelector(':scope > [data-ohw-nav-children]')) continue\n slots.push(...buildChildNavDropSlots(key))\n }\n\n // If dragging a child, also expose its current parent's child slots.\n const dragged = listNavbarItems().find((el) => el.getAttribute('data-ohw-href-key') === draggedHrefKey)\n const parentGroup = dragged?.closest('[data-ohw-nav-children]')?.closest<HTMLElement>('[data-ohw-nav-group]')\n const parentTrigger = parentGroup?.querySelector<HTMLElement>(':scope > [data-ohw-href-key]')\n const parentKey = parentTrigger?.getAttribute('data-ohw-href-key')\n if (parentKey && isNavbarHrefKey(parentKey)) {\n const existing = slots.some((s) => s.parentId === parentKey)\n if (!existing) slots.push(...buildChildNavDropSlots(parentKey))\n }\n\n return slots\n}\n\nexport function hitTestNavDropSlot(\n clientX: number,\n clientY: number,\n draggedHrefKey: string\n): NavDropSlot | null {\n const slots = buildAllNavDropSlots(draggedHrefKey)\n let best: { slot: NavDropSlot; dist: number } | null = null\n\n for (const slot of slots) {\n const cx = slot.left + slot.width / 2\n const cy = slot.top + slot.height / 2\n const dist =\n slot.direction === 'vertical'\n ? Math.abs(clientX - cx) + Math.abs(clientY - cy) * 0.25\n : Math.abs(clientY - cy) + Math.abs(clientX - cx) * 0.25\n if (!best || dist < best.dist) best = { slot, dist }\n }\n\n return best?.slot ?? null\n}\n\nexport function siblingRectsForNavDrag(draggedEl: HTMLElement, activeParentId: string | null): DOMRect[] {\n if (activeParentId) {\n return listNavChildren(activeParentId)\n .filter((el) => el !== draggedEl)\n .map((el) => el.getBoundingClientRect())\n }\n return listReorderableNavItems()\n .filter((el) => el !== draggedEl)\n .map((el) => el.getBoundingClientRect())\n}\n","'use client'\n\nimport { useCallback, useEffect, useRef, useState, type MutableRefObject, type RefObject } from 'react'\nimport {\n armItemPressDrag,\n clearTextSelection,\n disableNativeHrefDrag,\n lockItemDuringDrag,\n unlockItemDragInteraction,\n} from './lib/item-drag-interaction'\nimport {\n applyNavForest,\n isNavbarHrefKey,\n NAV_ORDER_KEY,\n planNavItemMove,\n} from './lib/nav-items'\nimport {\n buildAllNavDropSlots,\n hitTestNavDropSlot,\n type NavDropSlot,\n} from './lib/nav-dnd'\n\nexport type NavDragSession = {\n hrefKey: string\n wasSelected: boolean\n draggedEl: HTMLElement\n lastClientX: number\n lastClientY: number\n activeSlot: NavDropSlot | null\n}\n\ntype PostToParent = (msg: Record<string, unknown>) => void\n\ntype UseNavItemDragArgs = {\n isEditMode: boolean\n editContentRef: MutableRefObject<Record<string, string>>\n selectedElRef: MutableRefObject<HTMLElement | null>\n activeElRef: MutableRefObject<HTMLElement | null>\n /** When set, nav drag must not start (footer owns the gesture). */\n footerDragRef: RefObject<{ draggedEl: HTMLElement } | null>\n suppressNextClickRef: MutableRefObject<boolean>\n suppressClickUntilRef: MutableRefObject<number>\n siblingHintElRef: MutableRefObject<HTMLElement | null>\n postToParentRef: MutableRefObject<PostToParent>\n deselectRef: MutableRefObject<() => void>\n selectRef: MutableRefObject<(el: HTMLElement) => void>\n deactivateRef: MutableRefObject<() => void>\n setLinkPopover: (v: null) => void\n linkPopoverOpenRef: MutableRefObject<boolean>\n setIsItemDragging: (v: boolean) => void\n setDraggedItemRect: (r: DOMRect | null) => void\n setSiblingHintRect: (r: DOMRect | null) => void\n setSiblingHintRects: (r: DOMRect[]) => void\n setToolbarRect: (r: DOMRect | null) => void\n getNavigationItemAnchor: (el: HTMLElement) => HTMLElement | null\n isDragHandleDisabled: (el: HTMLElement) => boolean\n isNavbarButton: (el: HTMLElement) => boolean\n}\n\n/**\n * Navbar item DnD session (OHH-435). Keeps OhhwellsBridge thin — all begin/commit /\n * press-to-drag / drop visuals live here.\n */\nexport function useNavItemDrag({\n isEditMode,\n editContentRef,\n selectedElRef,\n activeElRef,\n footerDragRef,\n suppressNextClickRef,\n suppressClickUntilRef,\n siblingHintElRef,\n postToParentRef,\n deselectRef,\n selectRef,\n deactivateRef,\n setLinkPopover,\n linkPopoverOpenRef,\n setIsItemDragging,\n setDraggedItemRect,\n setSiblingHintRect,\n setSiblingHintRects,\n setToolbarRect,\n getNavigationItemAnchor,\n isDragHandleDisabled,\n isNavbarButton,\n}: UseNavItemDragArgs) {\n const navDragRef = useRef<NavDragSession | null>(null)\n const [navDropSlots, setNavDropSlots] = useState<NavDropSlot[]>([])\n const [activeNavDropIndex, setActiveNavDropIndex] = useState<number | null>(null)\n\n const navPointerDragRef = useRef<{\n el: HTMLElement\n startX: number\n startY: number\n pointerId: number\n wasSelected: boolean\n started: boolean\n } | null>(null)\n\n const clearNavDragVisuals = useCallback(() => {\n navDragRef.current = null\n setNavDropSlots([])\n setActiveNavDropIndex(null)\n setDraggedItemRect(null)\n setSiblingHintRects([])\n setIsItemDragging(false)\n unlockItemDragInteraction()\n }, [setDraggedItemRect, setIsItemDragging, setSiblingHintRects])\n\n const refreshNavDragVisuals = useCallback(\n (session: NavDragSession, activeSlot: NavDropSlot | null, clientX?: number, clientY?: number) => {\n setDraggedItemRect(session.draggedEl.getBoundingClientRect())\n if (typeof clientX === 'number' && typeof clientY === 'number') {\n session.lastClientX = clientX\n session.lastClientY = clientY\n }\n session.activeSlot = activeSlot\n\n // During drag, siblings stay in default state — only drop indicators show placement.\n setSiblingHintRects([])\n\n const slots = buildAllNavDropSlots(session.hrefKey)\n setNavDropSlots(slots)\n const activeIdx = activeSlot\n ? slots.findIndex(\n (s) => s.parentId === activeSlot.parentId && s.insertIndex === activeSlot.insertIndex\n )\n : -1\n setActiveNavDropIndex(activeIdx >= 0 ? activeIdx : null)\n },\n [setDraggedItemRect, setSiblingHintRects]\n )\n\n const refreshNavDragVisualsRef = useRef(refreshNavDragVisuals)\n refreshNavDragVisualsRef.current = refreshNavDragVisuals\n const commitNavDragRef = useRef<(x?: number, y?: number) => void>(() => {})\n const beginNavDragRef = useRef<(session: NavDragSession) => void>(() => {})\n\n const beginNavDrag = useCallback(\n (session: NavDragSession) => {\n const rect = session.draggedEl.getBoundingClientRect()\n session.lastClientX = session.lastClientX || rect.left + rect.width / 2\n session.lastClientY = session.lastClientY || rect.top + rect.height / 2\n session.activeSlot = session.activeSlot ?? null\n\n navDragRef.current = session\n setIsItemDragging(true)\n lockItemDuringDrag()\n siblingHintElRef.current = null\n setSiblingHintRect(null)\n\n if (session.wasSelected && selectedElRef.current === session.draggedEl) {\n setToolbarRect(rect)\n }\n\n const initialSlot = hitTestNavDropSlot(session.lastClientX, session.lastClientY, session.hrefKey)\n refreshNavDragVisuals(session, initialSlot, session.lastClientX, session.lastClientY)\n },\n [\n refreshNavDragVisuals,\n selectedElRef,\n setIsItemDragging,\n setSiblingHintRect,\n setToolbarRect,\n siblingHintElRef,\n ]\n )\n beginNavDragRef.current = beginNavDrag\n\n const commitNavDrag = useCallback(\n (clientX?: number, clientY?: number) => {\n const session = navDragRef.current\n if (!session) {\n clearNavDragVisuals()\n return\n }\n\n const x =\n typeof clientX === 'number' && (clientX !== 0 || clientY !== 0)\n ? clientX\n : session.lastClientX\n const y =\n typeof clientY === 'number' && (clientX !== 0 || clientY !== 0)\n ? clientY\n : session.lastClientY\n\n const slot = session.activeSlot ?? hitTestNavDropSlot(x, y, session.hrefKey)\n const planned =\n slot != null\n ? planNavItemMove(session.hrefKey, slot.parentId, slot.insertIndex)\n : null\n\n const wasSelected = session.wasSelected\n const hrefKey = session.hrefKey\n\n const applySelectionAfterDrop = () => {\n if (!wasSelected) {\n deselectRef.current()\n return\n }\n // Prefer the visible nav list — drawer often shares the same href keys.\n const desktop = document.querySelector<HTMLElement>('[data-ohw-nav-container]')\n const drawer = document.querySelector<HTMLElement>('[data-ohw-nav-drawer]')\n const link =\n desktop?.querySelector<HTMLElement>(`[data-ohw-href-key=\"${CSS.escape(hrefKey)}\"]`) ??\n drawer?.querySelector<HTMLElement>(`[data-ohw-href-key=\"${CSS.escape(hrefKey)}\"]`) ??\n document.querySelector<HTMLElement>(`[data-ohw-href-key=\"${CSS.escape(hrefKey)}\"]`)\n if (link) {\n selectRef.current(link)\n return\n }\n deselectRef.current()\n }\n\n if (planned) {\n editContentRef.current = {\n ...editContentRef.current,\n [NAV_ORDER_KEY]: planned.orderJson,\n }\n applyNavForest(planned.forest)\n document\n .querySelectorAll<HTMLElement>(\n 'nav [data-ohw-href-key], [data-ohw-nav-container] [data-ohw-href-key], [data-ohw-nav-drawer] [data-ohw-href-key]'\n )\n .forEach((el) => {\n if (isNavbarHrefKey(el.getAttribute('data-ohw-href-key'))) {\n disableNativeHrefDrag(el)\n }\n })\n postToParentRef.current({\n type: 'ow:change',\n nodes: [{ key: NAV_ORDER_KEY, text: planned.orderJson }],\n })\n // Reselect before clearing isItemDragging so chrome doesn't stick to the\n // vacated slot (item that shifted into the dragged item's old position).\n applySelectionAfterDrop()\n clearNavDragVisuals()\n requestAnimationFrame(() => {\n if (editContentRef.current[NAV_ORDER_KEY] === planned.orderJson) {\n applyNavForest(planned.forest)\n }\n applySelectionAfterDrop()\n requestAnimationFrame(applySelectionAfterDrop)\n })\n return\n }\n\n applySelectionAfterDrop()\n clearNavDragVisuals()\n },\n [clearNavDragVisuals, deselectRef, editContentRef, postToParentRef, selectRef]\n )\n commitNavDragRef.current = commitNavDrag\n\n const startNavLinkDrag = useCallback(\n (anchor: HTMLElement, clientX: number, clientY: number, wasSelected: boolean) => {\n if (footerDragRef.current) return false\n const hrefKey = anchor.getAttribute('data-ohw-href-key')\n if (!hrefKey || !isNavbarHrefKey(hrefKey)) return false\n if (isNavbarButton(anchor) || isDragHandleDisabled(anchor)) return false\n\n beginNavDrag({\n hrefKey,\n wasSelected,\n draggedEl: anchor,\n lastClientX: clientX,\n lastClientY: clientY,\n activeSlot: null,\n })\n return true\n },\n [beginNavDrag, footerDragRef, isDragHandleDisabled, isNavbarButton]\n )\n\n const onNavDragOver = useCallback(\n (e: DragEvent) => {\n const session = navDragRef.current\n if (!session) return false\n e.preventDefault()\n if (e.dataTransfer) e.dataTransfer.dropEffect = 'move'\n const slot = hitTestNavDropSlot(e.clientX, e.clientY, session.hrefKey)\n refreshNavDragVisualsRef.current(session, slot, e.clientX, e.clientY)\n return true\n },\n []\n )\n\n // Press-to-drag for navbar links (parallel to footer OHH-436).\n useEffect(() => {\n if (!isEditMode) return\n const THRESHOLD = 10\n\n const resolveWasSelected = (el: HTMLElement) => {\n if (selectedElRef.current === el) return true\n const activeAnchor = activeElRef.current ? getNavigationItemAnchor(activeElRef.current) : null\n return activeAnchor === el\n }\n\n const onPointerDown = (e: PointerEvent) => {\n if (e.button !== 0) return\n if (navDragRef.current || footerDragRef.current) return\n const target = e.target as HTMLElement | null\n if (!target) return\n if (\n target.closest(\n '[data-ohw-drag-handle-container], [data-slot=\"drag-handle\"], [data-ohw-toolbar], [data-ohw-item-toolbar-anchor], [data-ohw-link-popover-root]'\n )\n ) {\n return\n }\n if (target.closest('[data-ohw-item-drag-surface]')) return\n\n const anchor = getNavigationItemAnchor(target)\n const hrefKey = anchor?.getAttribute('data-ohw-href-key') ?? null\n if (!anchor || !isNavbarHrefKey(hrefKey)) return\n if (isNavbarButton(anchor) || isDragHandleDisabled(anchor)) return\n\n navPointerDragRef.current = {\n el: anchor,\n startX: e.clientX,\n startY: e.clientY,\n pointerId: e.pointerId,\n wasSelected: resolveWasSelected(anchor),\n started: false,\n }\n }\n\n const onPointerMove = (e: PointerEvent) => {\n const pending = navPointerDragRef.current\n if (!pending) return\n\n if (pending.started) {\n e.preventDefault()\n clearTextSelection()\n const session = navDragRef.current\n if (!session) return\n const slot = hitTestNavDropSlot(e.clientX, e.clientY, session.hrefKey)\n refreshNavDragVisualsRef.current(session, slot, e.clientX, e.clientY)\n return\n }\n\n const dx = e.clientX - pending.startX\n const dy = e.clientY - pending.startY\n if (dx * dx + dy * dy < THRESHOLD * THRESHOLD) return\n\n e.preventDefault()\n pending.started = true\n armItemPressDrag()\n clearTextSelection()\n try {\n document.body.setPointerCapture(pending.pointerId)\n } catch {\n /* ignore */\n }\n\n if (linkPopoverOpenRef.current) setLinkPopover(null)\n if (activeElRef.current) deactivateRef.current()\n\n const key = pending.el.getAttribute('data-ohw-href-key')\n if (!key) return\n beginNavDragRef.current({\n hrefKey: key,\n wasSelected: pending.wasSelected,\n draggedEl: pending.el,\n lastClientX: e.clientX,\n lastClientY: e.clientY,\n activeSlot: null,\n })\n }\n\n const endPointerDrag = (e: PointerEvent) => {\n const pending = navPointerDragRef.current\n navPointerDragRef.current = null\n try {\n if (document.body.hasPointerCapture(e.pointerId)) {\n document.body.releasePointerCapture(e.pointerId)\n }\n } catch {\n /* ignore */\n }\n // No nav press was ever tracked for this gesture (e.g. a plain text\n // drag-select elsewhere) — don't touch selection state at all.\n if (!pending) return\n if (!pending.started) {\n unlockItemDragInteraction()\n return\n }\n suppressNextClickRef.current = true\n suppressClickUntilRef.current = Date.now() + 500\n commitNavDragRef.current(e.clientX, e.clientY)\n }\n\n const blockSelectStart = (e: Event) => {\n if (\n navDragRef.current ||\n navPointerDragRef.current?.started ||\n document.documentElement.hasAttribute('data-ohw-footer-press-drag')\n ) {\n e.preventDefault()\n }\n }\n\n const onDragEnd = () => {\n if (!navDragRef.current) return\n suppressNextClickRef.current = true\n suppressClickUntilRef.current = Date.now() + 500\n commitNavDragRef.current()\n }\n\n document.addEventListener('pointerdown', onPointerDown, true)\n document.addEventListener('pointermove', onPointerMove, true)\n document.addEventListener('pointerup', endPointerDrag, true)\n document.addEventListener('pointercancel', endPointerDrag, true)\n document.addEventListener('selectstart', blockSelectStart, true)\n document.addEventListener('dragend', onDragEnd, true)\n return () => {\n document.removeEventListener('pointerdown', onPointerDown, true)\n document.removeEventListener('pointermove', onPointerMove, true)\n document.removeEventListener('pointerup', endPointerDrag, true)\n document.removeEventListener('pointercancel', endPointerDrag, true)\n document.removeEventListener('selectstart', blockSelectStart, true)\n document.removeEventListener('dragend', onDragEnd, true)\n unlockItemDragInteraction()\n }\n }, [\n activeElRef,\n deactivateRef,\n footerDragRef,\n getNavigationItemAnchor,\n isDragHandleDisabled,\n isEditMode,\n isNavbarButton,\n linkPopoverOpenRef,\n selectedElRef,\n setLinkPopover,\n suppressNextClickRef,\n ])\n\n const armNavPressFromChrome = useCallback(\n (selected: HTMLElement, clientX: number, clientY: number, pointerId: number) => {\n const hrefKey = selected.getAttribute('data-ohw-href-key')\n if (!hrefKey || !isNavbarHrefKey(hrefKey)) return false\n if (isNavbarButton(selected) || isDragHandleDisabled(selected)) return false\n navPointerDragRef.current = {\n el: selected,\n startX: clientX,\n startY: clientY,\n pointerId,\n wasSelected: true,\n started: false,\n }\n return true\n },\n [isDragHandleDisabled, isNavbarButton]\n )\n\n return {\n navDragRef,\n navDropSlots,\n activeNavDropIndex,\n startNavLinkDrag,\n commitNavDrag,\n onNavDragOver,\n armNavPressFromChrome,\n clearNavDragVisuals,\n refreshNavDragVisualsRef,\n }\n}\n","import { useEffect, useState } from 'react'\n\n/**\n * Editable carousel support.\n *\n * Unlike single images (which the bridge edits by mutating one `<img>` in place), a carousel's\n * slide list can grow and shrink, and its slides carry template-specific transient styling\n * (crossfade opacity, active-thumbnail borders). Cloning slide nodes in the bridge would\n * replicate that transient state and, in edit mode, fight the live app's own re-renders.\n *\n * So the carousel COMPONENT owns rendering. It keeps the slide array in React state and\n * re-renders itself — the bridge only writes the new array onto the container and fires an\n * event the component listens for. Add/delete/replace all become ordinary React renders, with\n * crossfade/rail/active-index handled by the template exactly as on a normal page load.\n *\n * DOM contract (authored by the template, see `useOhwCarousel`):\n * <div data-ohw-carousel data-ohw-key=\"hero-carousel\"\n * data-ohw-carousel-value='[{\"src\":\"…\",\"alt\":\"…\"}]'>\n * {images.map((img, i) => <div data-ohw-carousel-slide={i}>…</div>)}\n * </div>\n */\n\nexport const CAROUSEL_ATTR = 'data-ohw-carousel'\nexport const CAROUSEL_VALUE_ATTR = 'data-ohw-carousel-value'\nexport const CAROUSEL_SLIDE_ATTR = 'data-ohw-carousel-slide'\n/** Dispatched on the container to push a new slide array into the component's state. */\nexport const CAROUSEL_EVENT = 'ohw:carousel-change'\n\nexport type CarouselSlide = { src: string; alt: string }\n\n/** All unique carousel keys currently in the DOM. */\nexport function listCarouselKeys(): string[] {\n const keys = new Set<string>()\n document.querySelectorAll<HTMLElement>(`[${CAROUSEL_ATTR}]`).forEach((el) => {\n const key = el.getAttribute('data-ohw-key')\n if (key) keys.add(key)\n })\n return [...keys]\n}\n\nfunction containersForKey(key: string): HTMLElement[] {\n return Array.from(\n document.querySelectorAll<HTMLElement>(`[${CAROUSEL_ATTR}][data-ohw-key=\"${CSS.escape(key)}\"]`)\n )\n}\n\nexport function isCarouselKey(key: string): boolean {\n return containersForKey(key).length > 0\n}\n\nfunction parseSlides(raw: string | null): CarouselSlide[] {\n if (!raw) return []\n try {\n const parsed = JSON.parse(raw)\n if (!Array.isArray(parsed)) return []\n return parsed\n .filter((s): s is Record<string, unknown> => Boolean(s) && typeof s === 'object')\n .map((s) => ({ src: String(s.src ?? ''), alt: String(s.alt ?? '') }))\n } catch {\n return []\n }\n}\n\n/**\n * The current slide array for a key, read from the first container's mirrored value attribute.\n * Falls back to scanning slide `<img>`s if the value attribute is absent (e.g. a template that\n * didn't stamp `data-ohw-carousel-value`).\n */\nexport function readCarouselValue(key: string): CarouselSlide[] {\n const container = containersForKey(key)[0]\n if (!container) return []\n\n const fromAttr = parseSlides(container.getAttribute(CAROUSEL_VALUE_ATTR))\n if (fromAttr.length > 0) return fromAttr\n\n return Array.from(container.querySelectorAll<HTMLElement>(`[${CAROUSEL_SLIDE_ATTR}]`))\n .filter((slide) => slide.closest(`[${CAROUSEL_ATTR}]`) === container)\n .sort((a, b) => slideIndex(a) - slideIndex(b))\n .map((slide) => {\n const img = slide instanceof HTMLImageElement ? slide : slide.querySelector('img')\n return { src: img?.src ?? '', alt: img?.alt ?? '' }\n })\n}\n\nfunction slideIndex(el: HTMLElement): number {\n const raw = el.getAttribute(CAROUSEL_SLIDE_ATTR)\n const n = raw ? parseInt(raw, 10) : NaN\n return Number.isFinite(n) ? n : 0\n}\n\n/**\n * Push a slide array into every container with this key: update the mirrored value attribute\n * (so `readCarouselValue` and `collectEditableNodes` stay correct even before React commits) and\n * dispatch the change event the component listens for.\n */\nexport function applyCarouselValue(key: string, slides: CarouselSlide[]): void {\n const value = JSON.stringify(slides)\n for (const container of containersForKey(key)) {\n // The hook mirrors React state onto this attribute via `bind`, so a match means the\n // component's state is already current — skip to avoid redundant renders and, on the\n // published MutationObserver path, re-trigger loops.\n if (container.getAttribute(CAROUSEL_VALUE_ATTR) === value) continue\n container.setAttribute(CAROUSEL_VALUE_ATTR, value)\n container.dispatchEvent(\n new CustomEvent<{ images: CarouselSlide[] }>(CAROUSEL_EVENT, { detail: { images: slides } })\n )\n }\n}\n\n/**\n * Content-apply hook for a saved node. If `key` names a carousel in the DOM, push its parsed\n * array in and return true so callers skip the generic (innerHTML/src) handling — the value is a\n * JSON array, not markup. Returns false for non-carousel keys. Mirrors `applyVideoSettingNode`.\n */\nexport function applyCarouselNode(key: string, val: string): boolean {\n if (!isCarouselKey(key)) return false\n applyCarouselValue(key, parseSlides(val))\n return true\n}\n\n/**\n * Template hook. Owns the slide array in React state, stamps the DOM contract via `bind`, and\n * listens for the bridge's change event so replace/add/delete re-render the component.\n *\n * `bind` is plain data attributes (no ref), so it spreads onto any element type without type\n * friction; the hook finds its own container by key. Slides inside still need\n * `data-ohw-carousel-slide={i}`.\n *\n * const { images, bind } = useOhwCarousel('hero-carousel', content.images)\n * <div {...bind}>{images.map((img, i) => <Slide data-ohw-carousel-slide={i} … />)}</div>\n */\nexport function useOhwCarousel(key: string, initial: CarouselSlide[]) {\n const [images, setImages] = useState<CarouselSlide[]>(initial)\n\n useEffect(() => {\n const el = document.querySelector<HTMLElement>(\n `[${CAROUSEL_ATTR}][data-ohw-key=\"${CSS.escape(key)}\"]`\n )\n if (!el) return\n const onChange = (e: Event) => {\n const detail = (e as CustomEvent<{ images?: CarouselSlide[] }>).detail\n if (Array.isArray(detail?.images)) setImages(detail.images)\n }\n el.addEventListener(CAROUSEL_EVENT, onChange as EventListener)\n return () => el.removeEventListener(CAROUSEL_EVENT, onChange as EventListener)\n }, [key])\n\n const bind: Record<string, string> = {\n [CAROUSEL_ATTR]: '',\n 'data-ohw-key': key,\n [CAROUSEL_VALUE_ATTR]: JSON.stringify(images),\n }\n\n return { images, setImages, bind }\n}\n","\"use client\";\n\nimport { Plus } from \"lucide-react\";\n\ntype NavbarContainerChromeProps = {\n rect: DOMRect;\n onAdd: () => void;\n};\n\n/** Centered \"+\" for selected `data-ohw-nav-container` (solid border from ItemInteractionLayer). */\nexport function NavbarContainerChrome({\n rect,\n onAdd,\n}: NavbarContainerChromeProps) {\n const chromeGap = 6;\n\n return (\n <div\n data-ohw-navbar-container-chrome=\"\"\n data-ohw-bridge=\"\"\n className=\"pointer-events-none fixed z-[2147483647]\"\n style={{\n top: rect.top - chromeGap,\n left: rect.left - chromeGap,\n width: rect.width + chromeGap * 2,\n height: rect.height + chromeGap * 2,\n }}\n >\n <button\n type=\"button\"\n data-ohw-navbar-add-button=\"\"\n className=\"pointer-events-auto absolute left-1/2 flex p-0.5 rounded-[10px] size-7 -translate-x-1/2 translate-y-1/2 items-center justify-center border border-border bg-background shadow-sm transition-colors hover:bg-muted/80\"\n style={{ top: \"70%\" }}\n aria-label=\"Add item\"\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onAdd();\n }}\n >\n <Plus className=\"size-4 shrink-0 text-foreground\" aria-hidden />\n </button>\n </div>\n );\n}\n","'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../lib/utils'\n\n/**\n * Visual drop-gap line for navbar / footer / repeater reorder.\n * Figma: Custom/Drop Indicator (8140:1731) — CSS class `.ov-gap-line`\n *\n * Opacity (Figma docs):\n * - default: 0 (hidden)\n * - hover: 1\n * - dragIdle: 0.4\n * - dragActive: 1\n */\nconst dropIndicatorVariants = cva(\n 'ov-gap-line pointer-events-none shrink-0 transition-opacity duration-150',\n {\n variants: {\n direction: {\n vertical: 'h-6 w-[3px]',\n horizontal: 'h-[3px] w-[200px]',\n },\n state: {\n default: 'opacity-0',\n hover: 'opacity-100',\n dragIdle: 'opacity-40',\n dragActive: 'opacity-100',\n },\n },\n defaultVariants: {\n direction: 'vertical',\n state: 'default',\n },\n }\n)\n\ntype DropIndicatorProps = React.HTMLAttributes<HTMLDivElement> &\n VariantProps<typeof dropIndicatorVariants>\n\nconst DropIndicator = React.forwardRef<HTMLDivElement, DropIndicatorProps>(\n ({ className, direction, state, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-slot=\"drop-indicator\"\n data-direction={direction ?? 'vertical'}\n data-state={state ?? 'default'}\n aria-hidden=\"true\"\n className={cn(dropIndicatorVariants({ direction, state }), className)}\n {...props}\n />\n )\n }\n)\nDropIndicator.displayName = 'DropIndicator'\n\nexport { DropIndicator, dropIndicatorVariants }\nexport type { DropIndicatorProps }\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80\",\n outline: \"text-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n )\n}\n\nexport { Badge, badgeVariants }\n"],"mappings":"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","names":["React","useCallback","useEffect","useLayoutEffect","useRef","useState","useState","jsx","jsxs","useState","React","concatArrays","array1","array2","combinedArray","Array","length","i","createClassValidatorObject","classGroupId","validator","createClassPartObject","nextPart","Map","validators","CLASS_PART_SEPARATOR","EMPTY_CONFLICTS","ARBITRARY_PROPERTY_PREFIX","createClassGroupUtils","config","classMap","createClassMap","conflictingClassGroups","conflictingClassGroupModifiers","getClassGroupId","className","startsWith","endsWith","getGroupIdForArbitraryProperty","classParts","split","startIndex","getGroupRecursive","getConflictingClassGroupIds","hasPostfixModifier","modifierConflicts","baseConflicts","classPartObject","classPathsLength","currentClassPart","nextClassPartObject","get","result","undefined","classRest","join","slice","validatorsLength","validatorObj","indexOf","content","colonIndex","property","theme","classGroups","processClassGroups","group","processClassesRecursively","classGroup","len","classDefinition","processClassDefinition","processStringDefinition","processFunctionDefinition","processObjectDefinition","classPartObjectToEdit","getPart","isThemeGetter","push","entries","Object","key","value","path","current","parts","part","next","set","func","createLruCache","maxCacheSize","cacheSize","cache","create","previousCache","update","IMPORTANT_MODIFIER","MODIFIER_SEPARATOR","EMPTY_MODIFIERS","createResultObject","modifiers","hasImportantModifier","baseClassName","maybePostfixModifierPosition","isExternal","createParseClassName","prefix","experimentalParseClassName","parseClassName","bracketDepth","parenDepth","modifierStart","postfixModifierPosition","index","currentCharacter","baseClassNameWithImportantModifier","fullPrefix","parseClassNameOriginal","createSortModifiers","modifierWeights","orderSensitiveModifiers","forEach","mod","currentSegment","modifier","isArbitrary","isOrderSensitive","has","sort","createConfigUtils","sortModifiers","postfixLookupClassGroupIds","createPostfixLookupClassGroupIds","lookup","classGroupIds","postfixLookupClassGroups","SPLIT_CLASSES_REGEX","mergeClassList","classList","configUtils","classGroupsInConflict","classNames","trim","originalClassName","baseClassNameWithoutPostfix","substring","classGroupIdWithPostfix","variantModifier","modifierId","classId","conflictGroups","twJoin","classLists","argument","resolvedValue","string","toValue","mix","k","createTailwindMerge","createConfigFirst","createConfigRest","cacheGet","cacheSet","functionToCall","initTailwindMerge","reduce","previousConfig","createConfigCurrent","tailwindMerge","cachedResult","args","fallbackThemeArr","fromTheme","themeGetter","arbitraryValueRegex","arbitraryVariableRegex","fractionRegex","tshirtUnitRegex","lengthUnitRegex","colorFunctionRegex","shadowRegex","imageRegex","isFraction","test","isNumber","Number","isNaN","isInteger","isPercent","isTshirtSize","isAny","isLengthOnly","isNever","isShadow","isImage","isAnyNonArbitrary","isArbitraryValue","isArbitraryVariable","isNamedContainerQuery","isArbitrarySize","getIsArbitraryValue","isLabelSize","isArbitraryLength","isLabelLength","isArbitraryNumber","isLabelNumber","isArbitraryWeight","isLabelWeight","isArbitraryFamilyName","isLabelFamilyName","isArbitraryPosition","isLabelPosition","isArbitraryImage","isLabelImage","isArbitraryShadow","isLabelShadow","isArbitraryVariableLength","getIsArbitraryVariable","isArbitraryVariableFamilyName","isArbitraryVariablePosition","isArbitraryVariableSize","isArbitraryVariableImage","isArbitraryVariableShadow","isArbitraryVariableWeight","testLabel","testValue","exec","shouldMatchNoLabel","label","getDefaultConfig","themeColor","fromTheme","themeFont","themeText","themeFontWeight","themeTracking","themeLeading","themeBreakpoint","themeContainer","themeSpacing","themeRadius","themeShadow","themeInsetShadow","themeTextShadow","themeDropShadow","themeBlur","themePerspective","themeAspect","themeEase","themeAnimate","scaleBreak","scalePosition","scalePositionWithArbitrary","isArbitraryVariable","isArbitraryValue","scaleOverflow","scaleOverscroll","scaleUnambiguousSpacing","scaleInset","isFraction","scaleGridTemplateColsRows","isInteger","scaleGridColRowStartAndEnd","span","scaleGridColRowStartOrEnd","scaleGridAutoColsRows","scaleAlignPrimaryAxis","scaleAlignSecondaryAxis","scaleMargin","scaleSizing","scaleSizingInline","scaleSizingBlock","scaleColor","scaleBgPosition","isArbitraryVariablePosition","isArbitraryPosition","position","scaleBgRepeat","repeat","scaleBgSize","isArbitraryVariableSize","isArbitrarySize","size","scaleGradientStopPosition","isPercent","isArbitraryVariableLength","isArbitraryLength","scaleRadius","scaleBorderWidth","isNumber","scaleLineStyle","scaleBlendMode","scaleMaskImagePosition","scaleBlur","scaleRotate","scaleScale","scaleSkew","scaleTranslate","cacheSize","theme","animate","aspect","blur","isTshirtSize","breakpoint","color","isAny","container","ease","font","isAnyNonArbitrary","leading","perspective","radius","shadow","spacing","text","tracking","classGroups","isNamedContainerQuery","columns","box","display","sr","float","clear","isolation","object","overflow","overscroll","inset","start","end","top","right","bottom","left","visibility","z","basis","flex","grow","shrink","order","col","row","gap","justify","content","items","baseline","self","p","px","py","ps","pe","pbs","pbe","pt","pr","pb","pl","m","mx","my","ms","me","mbs","mbe","mt","mr","mb","ml","inline","block","w","screen","h","isArbitraryVariableWeight","isArbitraryWeight","isArbitraryVariableFamilyName","isArbitraryFamilyName","isArbitraryNumber","list","placeholder","decoration","indent","tab","align","whitespace","break","wrap","hyphens","bg","linear","to","radial","conic","isArbitraryVariableImage","isArbitraryImage","from","via","rounded","border","divide","outline","isArbitraryVariableShadow","isArbitraryShadow","ring","opacity","mask","closest","farthest","filter","brightness","contrast","grayscale","invert","saturate","sepia","table","caption","transition","duration","delay","backface","rotate","scale","skew","transform","origin","translate","zoom","accent","appearance","caret","scheme","cursor","resize","scroll","scrollbar","snap","touch","select","fill","stroke","conflictingClassGroups","conflictingClassGroupModifiers","postfixLookupClassGroups","orderSensitiveModifiers","twMerge","createTailwindMerge","getDefaultConfig","param","jsx","jsx","React","jsx","React","jsx","jsx","jsx","jsxs","React","jsx","jsxs","React","React","jsx","Fragment","jsx","jsxs","jsx","jsxs","OVERLAY_BUTTON_STYLE","createPortal","usePathname","useRouter","useEffect","React","jsx","jsxs","Dialog","X","jsx","jsxs","GalleryVertical","jsx","jsxs","GalleryVertical","useEffect","useId","useRef","useState","React","jsx","jsx","File","X","jsx","jsxs","useId","useRef","useState","useEffect","Fragment","jsx","jsxs","X","useEffect","useMemo","useRef","useState","jsx","jsxs","useState","useMemo","useEffect","useRef","useCallback","useEffect","useMemo","useState","useMemo","useState","useCallback","useEffect","Fragment","jsx","jsxs","useEffect","Dialog","cx","cx","useCallback","useEffect","useRef","useState","getNavigationItemAnchor","isDragHandleDisabled","isNavbarButton","useRef","useState","useCallback","useEffect","useEffect","useState","Plus","jsx","React","jsx","jsx","Link","Fragment","jsx","jsxs","PRIMARY","jsx","getLinkHref","isNavbarButton","isNavbarButton","r","SELECTION_CHROME_GAP","TOOLBAR_STROKE_GAP","jsxs","jsx","TOOLBAR_EDGE_MARGIN","React","Link","usePathname","useRouter","useState","useEffect","postToParent","useCallback","useRef","isNavbarButton","slots","activeIdx","useLayoutEffect","r","PRIMARY","editable","getLinkHref","selected","related","x","y","existing","el","columns","createPortal","Fragment"]}
|
|
1
|
+
{"version":3,"sources":["../src/OhhwellsBridge.tsx","../src/linkHrefStore.ts","../src/useLinkHrefGuardian.ts","../src/ui/SchedulingWidget.tsx","../src/ui/EmailCaptureModal.tsx","../src/ui/toggle-group.tsx","../node_modules/clsx/dist/clsx.mjs","../node_modules/tailwind-merge/src/lib/utils.ts","../node_modules/tailwind-merge/src/lib/class-group-utils.ts","../node_modules/tailwind-merge/src/lib/lru-cache.ts","../node_modules/tailwind-merge/src/lib/parse-class-name.ts","../node_modules/tailwind-merge/src/lib/sort-modifiers.ts","../node_modules/tailwind-merge/src/lib/config-utils.ts","../node_modules/tailwind-merge/src/lib/merge-classlist.ts","../node_modules/tailwind-merge/src/lib/tw-join.ts","../node_modules/tailwind-merge/src/lib/create-tailwind-merge.ts","../node_modules/tailwind-merge/src/lib/from-theme.ts","../node_modules/tailwind-merge/src/lib/validators.ts","../node_modules/tailwind-merge/src/lib/default-config.ts","../node_modules/tailwind-merge/src/lib/merge-configs.ts","../node_modules/tailwind-merge/src/lib/extend-tailwind-merge.ts","../node_modules/tailwind-merge/src/lib/tw-merge.ts","../src/lib/utils.ts","../node_modules/class-variance-authority/dist/index.mjs","../src/ui/toggle.tsx","../src/ui/drag-handle.tsx","../src/ui/custom-toolbar.tsx","../src/ui/item-action-toolbar.tsx","../src/ui/dropdown-menu.tsx","../src/ui/tooltip.tsx","../src/ui/item-interaction-layer.tsx","../src/ui/MediaOverlay.tsx","../src/ui/button.tsx","../src/ui/CarouselOverlay.tsx","../src/lib/session-search.ts","../src/lib/sections.ts","../src/ui/link-modal/linkModal.utils.ts","../src/lib/prefetch-sections.ts","../src/lib/scroll-to-section.ts","../src/ui/link-modal/LinkPopover.tsx","../src/ui/dialog.tsx","../src/ui/link-modal/LinkEditorPanel.tsx","../src/ui/link-modal/DestinationBreadcrumb.tsx","../src/ui/link-modal/SectionTreeItem.tsx","../src/ui/link-modal/UrlOrPageInput.tsx","../src/ui/input.tsx","../src/ui/label.tsx","../src/ui/link-modal/SectionPickerOverlay.tsx","../src/ui/link-modal/useLinkModalState.ts","../src/ui/link-modal/devFixtures.ts","../src/lib/nav-tree.ts","../src/lib/nav-items.ts","../src/lib/footer-items.ts","../src/lib/add-footer-column.ts","../src/lib/item-drag-interaction.ts","../src/lib/nav-dnd.ts","../src/useNavItemDrag.ts","../src/ui/footer-container-chrome.tsx","../src/lib/carousel.ts","../src/ui/navbar-container-chrome.tsx","../src/ui/drop-indicator.tsx","../src/ui/badge.tsx"],"sourcesContent":["'use client'\nimport React, { useCallback, useEffect, useLayoutEffect, useRef, useState } from 'react'\nimport { createRoot } from 'react-dom/client'\nimport { flushSync } from 'react-dom'\nimport { enforceLinkHrefs, setStoredLinkHref } from './linkHrefStore'\nimport { useLinkHrefGuardian } from './useLinkHrefGuardian'\nimport { SchedulingWidget } from './ui/SchedulingWidget'\nimport { ToggleGroup, ToggleGroupItem } from './ui/toggle-group'\nimport { DragHandle } from './ui/drag-handle'\nimport { CustomToolbar, CustomToolbarButton, CustomToolbarDivider } from './ui/custom-toolbar'\nimport { ItemActionToolbar } from './ui/item-action-toolbar'\nimport { ItemInteractionLayer, type ItemInteractionState } from './ui/item-interaction-layer'\nimport { MediaOverlay, type MediaElementType, type MediaHover } from './ui/MediaOverlay'\nimport { CarouselOverlay, type CarouselHover } from './ui/CarouselOverlay'\n\nconst PRIMARY = '#0885FE'\nconst IMAGE_FADE_MS = 300\n\nfunction runOpacityFade(el: HTMLElement, onDone: () => void) {\n const anim = el.animate([{ opacity: 0 }, { opacity: 1 }], {\n duration: IMAGE_FADE_MS,\n easing: 'ease',\n fill: 'forwards',\n })\n let finished = false\n const finish = () => {\n if (finished) return\n finished = true\n anim.cancel()\n el.style.opacity = ''\n onDone()\n }\n anim.finished.then(finish).catch(finish)\n window.setTimeout(finish, IMAGE_FADE_MS + 100)\n}\n\n/** After load: unmount skeleton (onReady), then fade <img> in. */\nfunction fadeInImageElement(img: HTMLElement, onReady: () => void) {\n onReady()\n img.style.opacity = '0'\n runOpacityFade(img, () => {\n img.style.opacity = ''\n })\n}\n\n/**\n * Swap an editable <img> to a new URL.\n * Must clear `srcset` / `sizes` first — next/image keeps responsive candidates that would\n * otherwise win over `src` and leave the old (optimized) image on screen.\n */\nfunction applyEditableImageSrc(img: HTMLImageElement, url: string) {\n img.removeAttribute('srcset')\n img.removeAttribute('sizes')\n img.src = url\n}\n\n/** After load: unmount skeleton, fade new background layer in so text stays visible. */\nfunction fadeInBgImage(el: HTMLElement, url: string, onReady: () => void) {\n const prevPos = el.style.position\n if (!prevPos || prevPos === 'static') el.style.position = 'relative'\n\n const layer = document.createElement('div')\n layer.setAttribute('data-ohw-bg-fade-layer', '')\n Object.assign(layer.style, {\n position: 'absolute',\n inset: '0',\n zIndex: '0',\n backgroundImage: `url('${url}')`,\n backgroundSize: 'cover',\n backgroundPosition: 'center',\n backgroundRepeat: 'no-repeat',\n opacity: '0',\n pointerEvents: 'none',\n })\n el.prepend(layer)\n\n onReady()\n\n runOpacityFade(layer, () => {\n el.style.backgroundImage = `url('${url}')`\n layer.remove()\n if (!prevPos || prevPos === 'static') el.style.position = prevPos\n })\n}\nimport { createPortal } from 'react-dom'\nimport { usePathname, useRouter, useSearchParams } from 'next/navigation'\nimport { isEditSessionActive } from './lib/session-search'\nimport { prefetchSectionsForPaths, mergePrefetchedSections, loadAllSectionsManifest } from './lib/prefetch-sections'\nimport { collectSectionsFromDom, type SectionNode } from './lib/sections'\nimport { scrollToHashSectionWhenReady } from './lib/scroll-to-section'\nimport { normalizePath, parseTarget, resolvePage, getSectionsForPath } from './ui/link-modal/linkModal.utils'\nimport { LinkPopover } from './ui/link-modal/LinkPopover'\nimport {\n DEV_SECTIONS_BY_PATH,\n DEV_SITE_PAGES,\n shouldUseDevFixtures,\n} from './ui/link-modal/devFixtures'\nimport type { LinkPage } from './ui/link-modal/types'\nimport {\n duplicateNavbarItem,\n getNavbarExistingTargets,\n insertNavbarItem,\n isNavbarHrefKey,\n listNavbarItems,\n NAV_COUNT_KEY,\n NAV_ORDER_KEY,\n reconcileNavbarItemsFromContent,\n} from './lib/nav-items'\nimport { addFooterColumnWithPersist, buildFooterColumnEditContentPatch } from './lib/add-footer-column'\nimport { applyFooterOrder, FOOTER_ORDER_KEY, buildColumnDropSlots, buildLinkDropSlots, findFooterColumnForLink, getFooterLinksContainer, hitTestColumnDropSlot, hitTestLinkDropSlot, isFooterHrefKey, isFooterLinksContainer, listFooterColumns, listFooterLinksInColumn, planFooterColumnMove, planFooterLinkMove, reconcileFooterOrderFromContent, resolveFooterLinksContainerSelectionTarget, type FooterDropSlot, duplicateFooterItem, canAddFooterColumn, MAX_FOOTER_COLUMNS } from './lib/footer-items'\nimport {\n armFooterPressDrag,\n clearTextSelection,\n disableNativeHrefDrag,\n lockFooterDuringDrag,\n unlockFooterDragInteraction,\n} from './lib/item-drag-interaction'\nimport { hitTestNavDropSlot } from './lib/nav-dnd'\nimport { useNavItemDrag } from './useNavItemDrag'\n\nimport { FooterContainerChrome } from './ui/footer-container-chrome'\nimport {\n CAROUSEL_ATTR,\n applyCarouselNode,\n applyCarouselValue,\n listCarouselKeys,\n readCarouselValue,\n} from './lib/carousel'\nimport type { CarouselSlide } from './lib/carousel'\n\nimport { NavbarContainerChrome } from './ui/navbar-container-chrome'\nimport { DropIndicator } from './ui/drop-indicator'\nimport { Badge } from './ui/badge'\nimport { Link } from 'lucide-react'\n\ntype FooterDragKind = 'link' | 'column'\n\ntype FooterDragSession = {\n kind: FooterDragKind\n /** Dragged link href-key (link drag). */\n hrefKey: string | null\n /** Dragged column element (column drag). */\n columnEl: HTMLElement | null\n sourceColumnIndex: number\n wasSelected: boolean\n draggedEl: HTMLElement\n /** Last pointer position during drag (dragend clientX/Y are often 0). */\n lastClientX: number\n lastClientY: number\n /** Last hit-tested drop slot — preferred commit target. */\n activeSlot: FooterDropSlot | null\n}\ntype LinkPopoverSession = {\n key: string\n mode?: 'create' | 'edit'\n target?: string\n intent?: 'add-nav'\n}\n\ntype EditableNode = { key: string; type: string; text: string }\ntype InsertedSection = { type: string; insertAfter: string; scheduleId?: string | null; pagePath?: string }\n\nfunction getSectionsTracker(): HTMLElement {\n let el = document.querySelector<HTMLElement>('[data-ohw-sections-tracker]')\n if (!el) {\n el = document.createElement('div')\n el.setAttribute('data-ohw-sections-tracker', '')\n el.style.display = 'none'\n document.body.appendChild(el)\n }\n return el\n}\n\nfunction updateSectionScheduleId(insertAfter: string, scheduleId: string | null): string {\n const tracker = getSectionsTracker()\n let sections: InsertedSection[] = []\n try { sections = JSON.parse(tracker.textContent || '[]') } catch { /* ignore */ }\n const currentPath = window.location.pathname\n const updated = sections.map((s) => {\n if (s.type !== 'scheduling' || s.insertAfter !== insertAfter) return s\n if (s.pagePath && s.pagePath !== currentPath) return s\n return { ...s, scheduleId }\n })\n tracker.textContent = JSON.stringify(updated)\n return tracker.textContent ?? '[]'\n}\n\nfunction schedulingSectionId(insertAfter: string): string {\n return `scheduling-${insertAfter}`\n}\n\nconst INSERT_BEFORE_MARKER = ':before:'\n\nfunction parseSchedulingInsertAfter(insertAfter: string): { anchor: string; insertBefore: string | null } {\n const idx = insertAfter.indexOf(INSERT_BEFORE_MARKER)\n if (idx < 0) return { anchor: insertAfter, insertBefore: null }\n return {\n anchor: insertAfter.slice(0, idx),\n insertBefore: insertAfter.slice(idx + INSERT_BEFORE_MARKER.length),\n }\n}\n\nfunction resolveSchedulingInsert(\n insertAfter: string,\n explicitInsertBefore?: string | null,\n): { effectiveInsertAfter: string; insertBefore: string | null } {\n const parsed = parseSchedulingInsertAfter(insertAfter)\n const insertBefore = explicitInsertBefore ?? parsed.insertBefore\n const effectiveInsertAfter =\n insertBefore && parsed.insertBefore === null\n ? `${insertAfter}${INSERT_BEFORE_MARKER}${insertBefore}`\n : insertAfter\n return { effectiveInsertAfter, insertBefore }\n}\n\nfunction getSchedulingMountPoint(insertAfter: string): HTMLElement | null {\n const { anchor } = parseSchedulingInsertAfter(insertAfter)\n let anchorEl = document.querySelector<HTMLElement>(`[data-ohw-section=\"${anchor}\"]`)\n // Legacy entries used insertAfter=\"scheduling\" when all widgets shared that section id\n if (!anchorEl && anchor === 'scheduling') {\n const widgets = Array.from(document.querySelectorAll<HTMLElement>('[data-ohw-section^=\"scheduling-\"]'))\n anchorEl = widgets.at(-1) ?? null\n }\n if (!anchorEl) return null\n return anchorEl.closest<HTMLElement>('[data-ohw-section-container=\"scheduling\"]') ?? anchorEl\n}\n\nfunction schedulingMountDepth(insertAfter: string): number {\n if (!insertAfter.includes(INSERT_BEFORE_MARKER)) return 0\n return insertAfter.split(INSERT_BEFORE_MARKER).length - 1\n}\n\nfunction mountSchedulingFromTracker(notifyOnConnect = false): void {\n const tracker = getSectionsTracker()\n let entries: InsertedSection[] = []\n try { entries = JSON.parse(tracker.textContent || '[]') } catch { return }\n const currentPath = window.location.pathname\n const pageEntries = entries.filter((e) => !e.pagePath || e.pagePath === currentPath)\n mountSchedulingEntries(pageEntries, notifyOnConnect)\n}\n\nfunction getPageSchedulingEntries(raw: string | undefined | null): InsertedSection[] {\n if (!raw) return []\n try {\n const entries = JSON.parse(raw) as InsertedSection[]\n const currentPath = window.location.pathname\n return entries.filter((e) => e.type === 'scheduling' && (!e.pagePath || e.pagePath === currentPath))\n } catch { return [] }\n}\n\nfunction isSchedulingWidgetMissing(entry: InsertedSection): boolean {\n const { effectiveInsertAfter } = resolveSchedulingInsert(entry.insertAfter)\n return !document.querySelector(`[data-ohw-section=\"${schedulingSectionId(effectiveInsertAfter)}\"]`)\n}\n\nfunction hasMissingSchedulingWidgets(entries: InsertedSection[]): boolean {\n return entries.some(isSchedulingWidgetMissing)\n}\n\nfunction retryMissingSchedulingMounts(entries: InsertedSection[], notifyOnConnect: boolean | ((entry: InsertedSection) => boolean) = false): void {\n if (!hasMissingSchedulingWidgets(entries)) return\n mountSchedulingEntries(entries, notifyOnConnect)\n}\n\nfunction initSectionsFromContent(content: Record<string, string>, removeExisting = false): void {\n const raw = content['__ohw_sections']\n if (!raw) return\n try {\n if (removeExisting) {\n document.querySelectorAll<HTMLElement>('[data-ohw-section-container=\"scheduling\"]').forEach((el) => el.remove())\n }\n const inEditor = typeof window !== 'undefined' && window.self !== window.top\n if (inEditor) getSectionsTracker().textContent = raw\n const pageEntries = getPageSchedulingEntries(raw)\n // Detect widgets already in DOM before our mount attempts (vibe-coder placed).\n const preExisting = pageEntries.filter((e) => !isSchedulingWidgetMissing(e))\n // In edit mode, sections without a saved scheduleId notify on auto-connect so\n // the draft is updated and save validation doesn't incorrectly block.\n const notifyForEntry = inEditor ? (e: InsertedSection) => !e.scheduleId : false\n mountSchedulingEntries(pageEntries, notifyForEntry)\n // One-shot retries for anchors that appear after Next.js hydration.\n requestAnimationFrame(() => retryMissingSchedulingMounts(pageEntries, notifyForEntry))\n setTimeout(() => retryMissingSchedulingMounts(pageEntries, notifyForEntry), 250)\n // Proactively send ow:schedule-config to widgets that were already in the DOM\n // so they can initialize without waiting for a reactive request.\n for (const entry of preExisting) {\n window.postMessage({ type: 'ow:schedule-config', insertAfter: entry.insertAfter, scheduleId: entry.scheduleId ?? null }, '*')\n }\n } catch { /* ignore */ }\n}\n\nfunction mountSchedulingWidget(\n insertAfter: string,\n notifyOnConnect = false,\n scheduleId?: string | null,\n explicitInsertBefore?: string | null,\n): boolean {\n const { effectiveInsertAfter, insertBefore } = resolveSchedulingInsert(insertAfter, explicitInsertBefore)\n const sectionId = schedulingSectionId(effectiveInsertAfter)\n if (document.querySelector(`[data-ohw-section=\"${sectionId}\"]`)) return false\n\n const mountPoint = getSchedulingMountPoint(effectiveInsertAfter)\n if (!mountPoint) return false\n\n const container = document.createElement('div')\n container.dataset.ohwSectionContainer = 'scheduling'\n\n if (insertBefore) {\n const beforeAnchor = document.querySelector<HTMLElement>(`[data-ohw-section=\"${insertBefore}\"]`)\n const beforePoint = beforeAnchor?.closest<HTMLElement>('[data-ohw-section-container=\"scheduling\"]') ?? beforeAnchor\n if (!beforePoint) return false\n beforePoint.insertAdjacentElement('beforebegin', container)\n } else {\n let tail: Element = mountPoint\n while ((tail.nextElementSibling as HTMLElement | null)?.dataset.ohwSectionContainer === 'scheduling') {\n tail = tail.nextElementSibling!\n }\n tail.insertAdjacentElement('afterend', container)\n }\n\n const root = createRoot(container)\n flushSync(() => {\n root.render(\n <SchedulingWidget\n notifyOnConnect={notifyOnConnect}\n initialScheduleId={scheduleId}\n insertAfter={effectiveInsertAfter}\n />,\n )\n })\n\n const tracker = getSectionsTracker()\n let sections: InsertedSection[] = []\n try { sections = JSON.parse(tracker.textContent || '[]') } catch { /* ignore */ }\n const inEditor = typeof window !== 'undefined' && window.self !== window.top\n if (inEditor && !sections.find((s) => s.type === 'scheduling' && s.insertAfter === effectiveInsertAfter)) {\n sections.push({\n type: 'scheduling',\n insertAfter: effectiveInsertAfter,\n pagePath: window.location.pathname,\n ...(scheduleId ? { scheduleId } : {}),\n })\n tracker.textContent = JSON.stringify(sections)\n }\n return true\n}\n\n/** Mount scheduling widgets in dependency order (parent anchor must exist before child). */\nfunction mountSchedulingEntries(entries: InsertedSection[], notifyOnConnect: boolean | ((entry: InsertedSection) => boolean) = false) {\n const pending = entries\n .filter((e) => e.type === 'scheduling')\n .sort((a, b) => schedulingMountDepth(a.insertAfter) - schedulingMountDepth(b.insertAfter))\n for (let attempt = 0; attempt < pending.length + 1 && pending.length > 0; attempt++) {\n for (let i = pending.length - 1; i >= 0; i--) {\n const entry = pending[i]\n const shouldNotify = typeof notifyOnConnect === 'function' ? notifyOnConnect(entry) : notifyOnConnect\n if (mountSchedulingWidget(entry.insertAfter, shouldNotify, entry.scheduleId)) {\n pending.splice(i, 1)\n }\n }\n }\n}\n\nfunction getLinkHref(el: HTMLElement): string {\n const anchor = el instanceof HTMLAnchorElement ? el : el.querySelector<HTMLAnchorElement>('a')\n return anchor?.getAttribute('href') ?? ''\n}\n\nfunction applyLinkHref(el: HTMLElement, val: string) {\n const anchor = el instanceof HTMLAnchorElement ? el : el.querySelector<HTMLAnchorElement>('a')\n if (anchor) anchor.setAttribute('href', val)\n}\n\nfunction getEditMeasureEl(editable: HTMLElement): HTMLElement {\n return editable.closest<HTMLAnchorElement>('[data-ohw-href-key]') ?? editable\n}\n\nfunction isDragHandleDisabled(el: HTMLElement): boolean {\n const carriers = [\n el.closest<HTMLElement>('[data-ohw-href-key]'),\n el.closest<HTMLElement>('[data-ohw-editable]'),\n ]\n return carriers.some((carrier) => {\n if (!carrier) return false\n const raw = carrier.getAttribute('data-ohw-drag-disabled')\n return raw === 'true' || raw === ''\n })\n}\n\n/** Same gate as drag-handle visibility / drag-start — grab cursor must match this. */\nfunction canDragNavigationItem(anchor: HTMLElement): boolean {\n const { key, disabled } = getNavigationItemReorderState(anchor)\n return Boolean(key) && !disabled\n}\n\nfunction syncNavigationDragCursorAttrs() {\n document\n .querySelectorAll<HTMLElement>('nav [data-ohw-href-key], footer [data-ohw-href-key]')\n .forEach((el) => {\n if (!isNavigationItem(el) || !canDragNavigationItem(el)) {\n el.removeAttribute('data-ohw-can-drag')\n return\n }\n el.setAttribute('data-ohw-can-drag', '')\n })\n}\n\nfunction collectEditableNodes(extraContent?: Record<string, string>): EditableNode[] {\n const nodes = Array.from(document.querySelectorAll<HTMLElement>('[data-ohw-editable]')).map((el) => {\n if (el.dataset.ohwEditable === 'image') {\n const img = el instanceof HTMLImageElement ? el : el.querySelector<HTMLImageElement>('img')\n return { key: el.dataset.ohwKey ?? '', type: 'image', text: img?.src ?? '' }\n }\n if (el.dataset.ohwEditable === 'bg-image') {\n const raw = el.style.backgroundImage\n const url = raw.replace(/^url\\(['\"]?/, '').replace(/['\"]?\\)$/, '')\n return { key: el.dataset.ohwKey ?? '', type: 'bg-image', text: url }\n }\n if (el.dataset.ohwEditable === 'video') {\n return { key: el.dataset.ohwKey ?? '', type: 'video', text: getVideoEl(el)?.src ?? '' }\n }\n if (el.dataset.ohwEditable === 'link') {\n return { key: el.dataset.ohwKey ?? '', type: 'link', text: getLinkHref(el) }\n }\n return {\n key: el.dataset.ohwKey ?? '',\n type: el.dataset.ohwEditable ?? 'text',\n text: el.dataset.ohwEditable === 'plain' ? (el.innerText ?? '') : el.innerHTML,\n }\n })\n\n document.querySelectorAll<HTMLElement>('[data-ohw-href-key]').forEach((el) => {\n const key = el.getAttribute('data-ohw-href-key') ?? ''\n if (!key) return\n nodes.push({ key, type: 'link', text: getLinkHref(el) })\n })\n\n // Structural order keys live in edit content, not in DOM data attributes.\n if (extraContent) {\n for (const key of [NAV_ORDER_KEY, FOOTER_ORDER_KEY, NAV_COUNT_KEY]) {\n const text = extraContent[key]\n if (typeof text === 'string' && text.length > 0) {\n nodes.push({ key, type: 'meta', text })\n }\n }\n }\n\n // Video playback settings ride alongside the src as their own nodes.\n document.querySelectorAll<HTMLElement>('[data-ohw-editable=\"video\"]').forEach((el) => {\n const key = el.dataset.ohwKey ?? ''\n const video = getVideoEl(el)\n if (!key || !video) return\n nodes.push({ key: `${key}${VIDEO_AUTOPLAY_SUFFIX}`, type: 'video-setting', text: String(video.autoplay) })\n nodes.push({ key: `${key}${VIDEO_MUTED_SUFFIX}`, type: 'video-setting', text: String(video.muted) })\n })\n\n // Carousels persist their whole slide array as one JSON node under the container's key.\n for (const key of listCarouselKeys()) {\n nodes.push({ key, type: 'carousel', text: JSON.stringify(readCarouselValue(key)) })\n }\n\n // Cloned editables (e.g. marquee tracks) share one key — report each key once.\n const seen = new Set<string>()\n return nodes.filter((node) => {\n if (!node.key) return true\n if (seen.has(node.key)) return false\n seen.add(node.key)\n return true\n })\n}\n\n/** Editable types that support click/drag-drop replace. */\nfunction isMediaEditable(el: HTMLElement): boolean {\n const t = el.dataset.ohwEditable\n return t === 'image' || t === 'bg-image' || t === 'video'\n}\n\nconst MEDIA_SELECTOR =\n '[data-ohw-editable=\"image\"], [data-ohw-editable=\"bg-image\"], [data-ohw-editable=\"video\"]'\nconst NON_MEDIA_SELECTOR =\n '[data-ohw-editable]:not([data-ohw-editable=\"image\"]):not([data-ohw-editable=\"bg-image\"]):not([data-ohw-editable=\"video\"])'\n\nfunction getVideoEl(el: HTMLElement): HTMLVideoElement | null {\n return el instanceof HTMLVideoElement ? el : el.querySelector<HTMLVideoElement>('video')\n}\n\n// Autoplay/muted are per-video settings the studio owner can toggle, so they persist as\n// their own draft nodes derived from the video's key.\nconst VIDEO_AUTOPLAY_SUFFIX = '__ohw_autoplay'\nconst VIDEO_MUTED_SUFFIX = '__ohw_muted'\n\n/**\n * Drive playback and controls from the element's own flags.\n *\n * Controls are hidden only for true background media — autoplay AND muted — because that is\n * the one combination that actually starts on its own. Everything else needs a way to press\n * play: autoplay-off never starts, and browsers refuse to autoplay audible video, so an\n * unmuted+autoplay clip just sits there paused. In both cases we expose native controls.\n */\nfunction isBackgroundVideo(video: HTMLVideoElement): boolean {\n return video.autoplay && video.muted\n}\n\nfunction syncVideoPlayback(video: HTMLVideoElement) {\n const background = isBackgroundVideo(video)\n\n video.controls = !background\n\n // Still attempt playback whenever autoplay is on; if the browser blocks it (unmuted), the\n // rejection is expected and the visible controls are the fallback.\n if (video.autoplay) void video.play().catch(() => {})\n else video.pause()\n}\n\n/**\n * Pin the box the video currently occupies so a replacement can't reflow the page.\n *\n * An editable video is typically authored with a width and an *auto* height, which means its\n * intrinsic aspect ratio decides the height — so swapping in a taller clip grows the element\n * and pushes the rest of the layout down. Locking the rendered aspect ratio holds the box, and\n * `object-fit: contain` fits the whole clip inside it (letterboxed) rather than cropping it.\n */\nfunction lockVideoBox(video: HTMLVideoElement) {\n const { width, height } = video.getBoundingClientRect()\n\n if (width > 0 && height > 0 && !video.style.aspectRatio) {\n video.style.aspectRatio = `${width} / ${height}`\n }\n\n // `fill` is the UA default — only override when the author hasn't chosen a fit themselves.\n if (getComputedStyle(video).objectFit === 'fill') {\n video.style.objectFit = 'contain'\n }\n\n // `contain` letterboxes a clip whose ratio differs from the box, and a video element is\n // transparent by default — so without a backdrop the bars show whatever sits behind it.\n // Brand token with a black fallback, since black is the convention for letterboxing.\n const fit = video.style.objectFit || getComputedStyle(video).objectFit\n const bg = getComputedStyle(video).backgroundColor\n const isTransparent = bg === 'rgba(0, 0, 0, 0)' || bg === 'transparent' || !bg\n\n if (fit === 'contain' && isTransparent) {\n video.style.backgroundColor = 'var(--color-dark, #000)'\n }\n}\n\n/**\n * Replaced videos loop and play inline. The owner's autoplay/muted choices — and therefore\n * whether controls show — are preserved across a source swap.\n */\nfunction applyVideoSrc(video: HTMLVideoElement, url: string) {\n const { autoplay, muted } = video\n\n // Must run BEFORE the src swap, while the element still has the old video's dimensions.\n lockVideoBox(video)\n\n video.src = url\n video.loop = true\n video.playsInline = true\n video.autoplay = autoplay\n video.muted = muted\n video.load()\n syncVideoPlayback(video)\n}\n\n/**\n * Applies an `<key>__ohw_autoplay` / `__ohw_muted` draft node onto its video. Returns false\n * if the key isn't a video-setting node, so callers can fall through to normal handling.\n */\nfunction applyVideoSettingNode(key: string, val: string): boolean {\n const isAutoplay = key.endsWith(VIDEO_AUTOPLAY_SUFFIX)\n const isMuted = key.endsWith(VIDEO_MUTED_SUFFIX)\n\n if (!isAutoplay && !isMuted) return false\n\n const suffixLen = (isAutoplay ? VIDEO_AUTOPLAY_SUFFIX : VIDEO_MUTED_SUFFIX).length\n const baseKey = key.slice(0, key.length - suffixLen)\n const on = val === 'true'\n\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${baseKey}\"]`).forEach((el) => {\n const video = getVideoEl(el)\n if (!video) return\n if (isAutoplay) video.autoplay = on\n else video.muted = on\n syncVideoPlayback(video)\n })\n\n return true\n}\n\nfunction applyLinkByKey(key: string, val: string) {\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${key}\"]`).forEach((el) => {\n if (el.dataset.ohwEditable === 'link') applyLinkHref(el, val)\n })\n const hrefAnchors = document.querySelectorAll<HTMLElement>(`[data-ohw-href-key=\"${key}\"]`)\n if (hrefAnchors.length > 0) {\n setStoredLinkHref(key, val)\n hrefAnchors.forEach((el) => applyLinkHref(el, val))\n }\n}\n\nfunction isInsideLinkEditor(target: HTMLElement) {\n return Boolean(\n target.closest('[data-ohw-link-popover-root]') ||\n target.closest('[data-ohw-link-modal-root]') ||\n target.closest('[data-ohw-link-page-dropdown]') ||\n target.closest('[data-ohw-section-picker]') ||\n target.closest('[data-ohw-navbar-container-chrome]') ||\n target.closest('[data-ohw-navbar-add-button]') ||\n target.closest('[data-ohw-footer-container-chrome]') ||\n target.closest('[data-ohw-footer-add-button]') ||\n target.closest('[data-ohw-more-menu]') ||\n target.closest('[data-slot=\"dropdown-menu-content\"]') ||\n target.closest('[data-slot=\"popover-content\"]') ||\n target.closest('[data-slot=\"dialog-content\"]') ||\n target.closest('[data-slot=\"dialog-overlay\"]')\n )\n}\n\nfunction getHrefKeyFromElement(el: HTMLElement | null): { anchor: HTMLElement; key: string } | null {\n if (!el) return null\n const anchor = el.closest<HTMLElement>('[data-ohw-href-key]')\n if (!anchor) return null\n const key = anchor.getAttribute('data-ohw-href-key')\n if (!key) return null\n return { anchor, key }\n}\n\nfunction isNavbarButton(el: HTMLElement): boolean {\n return Boolean(el.closest('[data-ohw-role=\"navbar-button\"]'))\n}\n\nfunction getNavigationItemAnchor(el: HTMLElement): HTMLElement | null {\n const anchor = el.matches('[data-ohw-href-key]')\n ? el\n : el.closest<HTMLElement>('[data-ohw-href-key]')\n if (!anchor) return null\n if (!anchor.querySelector('[data-ohw-editable=\"text\"]')) return null\n return anchor\n}\n\nfunction isNavigationItem(el: HTMLElement): boolean {\n return getNavigationItemAnchor(el) !== null\n}\n\nfunction getNavigationItemAddHintTarget(anchor: HTMLElement): HTMLElement {\n const items = listNavigationItems()\n const idx = items.indexOf(anchor)\n if (idx >= 0 && idx < items.length - 1) return items[idx + 1]!\n return anchor\n}\n\nfunction listNavigationItems(): HTMLElement[] {\n return Array.from(\n document.querySelectorAll<HTMLElement>('nav [data-ohw-href-key], footer [data-ohw-href-key]')\n ).filter((el) => isNavigationItem(el))\n}\n\nfunction getNavigationItemReorderState(anchor: HTMLElement): { key: string | null; disabled: boolean } {\n if (isNavbarButton(anchor)) return { key: null, disabled: false }\n return getReorderHandleStateFromAnchor(anchor)\n}\n\nfunction getReorderHandleState(el: HTMLElement): { key: string | null; disabled: boolean } {\n const linkEl = el.closest<HTMLAnchorElement>('[data-ohw-href-key]')\n if (!linkEl || getNavigationItemAnchor(linkEl)) return { key: null, disabled: false }\n return getReorderHandleStateFromAnchor(linkEl)\n}\n\nfunction getReorderHandleStateFromAnchor(anchor: HTMLElement): { key: string | null; disabled: boolean } {\n const key = anchor.getAttribute('data-ohw-href-key')\n if (!key) return { key: null, disabled: false }\n return { key, disabled: isDragHandleDisabled(anchor) }\n}\n\nfunction clearHrefKeyHover(anchor: HTMLElement) {\n anchor.removeAttribute('data-ohw-hovered')\n anchor.querySelectorAll<HTMLElement>('[data-ohw-hovered]').forEach((el) => {\n el.removeAttribute('data-ohw-hovered')\n })\n}\n\nfunction isInsideNavigationItem(el: HTMLElement): boolean {\n return getNavigationItemAnchor(el) !== null\n}\n\nfunction getNavigationRoot(el: HTMLElement): HTMLElement | null {\n const explicit = el.closest<HTMLElement>('[data-ohw-nav-root]')\n if (explicit) return explicit\n return el.closest<HTMLElement>('nav, footer, aside')\n}\n\nfunction countFooterNavItems(el: HTMLElement): number {\n return Array.from(el.querySelectorAll<HTMLElement>('[data-ohw-href-key]')).filter(isNavigationItem).length\n}\n\n/** Nearest footer ancestor that groups 2+ items (column), else the footer itself — never a single-item wrapper. */\nfunction findFooterItemGroup(item: HTMLElement): HTMLElement | null {\n const explicit = item.closest<HTMLElement>('[data-ohw-footer-col], [data-ohw-footer-column]')\n if (explicit) return explicit\n\n const footer = item.closest<HTMLElement>('footer')\n if (!footer) return null\n\n let node = item.parentElement\n while (node && node !== footer) {\n if (countFooterNavItems(node) >= 2) return node\n node = node.parentElement\n }\n return footer\n}\n\nfunction isNavigationRoot(el: HTMLElement): boolean {\n return el.hasAttribute('data-ohw-nav-root') || el.matches('nav, footer, aside')\n}\n\nfunction isInferredFooterGroup(el: HTMLElement): boolean {\n const footer = el.closest('footer')\n if (!footer || el === footer) return false\n if (el.hasAttribute('data-ohw-footer-col') || el.hasAttribute('data-ohw-footer-column')) return true\n return countFooterNavItems(el) >= 2\n}\n\nfunction isNavigationContainer(el: HTMLElement): boolean {\n return (\n el.hasAttribute('data-ohw-nav-container') ||\n isFooterLinksContainer(el) ||\n el.hasAttribute('data-ohw-footer-col') ||\n el.hasAttribute('data-ohw-footer-column') ||\n isNavigationRoot(el) ||\n isInferredFooterGroup(el)\n )\n}\n\nfunction isNavbarLinksContainer(el: HTMLElement): boolean {\n return el.hasAttribute('data-ohw-nav-container')\n}\n\nfunction getFooterColumn(el: HTMLElement): HTMLElement | null {\n return el.closest<HTMLElement>('[data-ohw-footer-col], [data-ohw-footer-column]')\n}\n\n/** Resolve footer column frame selection (gap / padding clicks), never individual items. */\nfunction resolveFooterColumnSelectionTarget(\n target: HTMLElement,\n clientX: number,\n clientY: number\n): HTMLElement | null {\n if (getNavigationItemAnchor(target)) return null\n const column = getFooterColumn(target)\n if (!column) return null\n if (isPointOverNavItem(column, clientX, clientY)) return null\n return column\n}\n\nfunction isPointOverNavigation(x: number, y: number): boolean {\n const roots = new Set<HTMLElement>()\n const navRoot =\n document.querySelector<HTMLElement>('[data-ohw-nav-root]') ??\n document.querySelector<HTMLElement>('nav')\n if (navRoot) roots.add(navRoot)\n document.querySelectorAll<HTMLElement>('[data-ohw-nav-drawer], [data-ohw-nav-container]').forEach((el) => {\n roots.add(el)\n })\n const footer = document.querySelector<HTMLElement>('footer')\n if (footer) roots.add(footer)\n\n for (const root of roots) {\n const r = root.getBoundingClientRect()\n if (x >= r.left && x <= r.right && y >= r.top && y <= r.bottom) return true\n }\n return false\n}\n\nfunction findHoveredNavOrFooterContainer(x: number, y: number): HTMLElement | null {\n const candidates = [\n ...document.querySelectorAll<HTMLElement>('[data-ohw-nav-container]'),\n ...listFooterColumns(),\n ]\n for (const container of candidates) {\n const r = container.getBoundingClientRect()\n if (x < r.left || x > r.right || y < r.top || y > r.bottom) continue\n if (isPointOverNavItem(container, x, y)) continue\n return container\n }\n return null\n}\n\nfunction isPointOverNavItem(container: HTMLElement, x: number, y: number): boolean {\n return Array.from(container.querySelectorAll<HTMLElement>('[data-ohw-href-key]')).some((el) => {\n if (!isNavigationItem(el) || isNavbarButton(el)) return false\n const itemRect = el.getBoundingClientRect()\n return (\n x >= itemRect.left &&\n x <= itemRect.right &&\n y >= itemRect.top &&\n y <= itemRect.bottom\n )\n })\n}\n\n/** True when pointer is over a footer column shell (not just the links-grid gaps). */\nfunction isPointOverFooterColumn(x: number, y: number): boolean {\n return listFooterColumns().some((col) => {\n const r = col.getBoundingClientRect()\n return x >= r.left && x <= r.right && y >= r.top && y <= r.bottom\n })\n}\n\n/** Resolve top-level navbar frame selection (links row), never items / book CTA / logo. */\nfunction resolveNavContainerSelectionTarget(\n target: HTMLElement,\n clientX: number,\n clientY: number\n): HTMLElement | null {\n if (getNavigationItemAnchor(target)) return null\n if (target.closest('[data-ohw-role=\"navbar-button\"]')) return null\n // Brand/logo link (no href-key) should not activate the links frame\n const plainLink = target.closest('a')\n if (\n plainLink &&\n !plainLink.hasAttribute('data-ohw-href-key') &&\n !plainLink.closest('[data-ohw-nav-container]')\n ) {\n return null\n }\n\n const fromClosest = target.closest<HTMLElement>('[data-ohw-nav-container]')\n if (fromClosest && !isPointOverNavItem(fromClosest, clientX, clientY)) {\n return fromClosest\n }\n\n const navRoot = target.closest<HTMLElement>('[data-ohw-nav-root]')\n if (!navRoot) return null\n\n const container = navRoot.querySelector<HTMLElement>('[data-ohw-nav-container]')\n if (!container || isPointOverNavItem(container, clientX, clientY)) return null\n\n // Empty nav padding / middle grid column (event target is the root itself)\n if (target === navRoot || target.hasAttribute('data-ohw-nav-root')) {\n return container\n }\n\n return null\n}\n\nfunction getNavigationSelectionParent(el: HTMLElement): HTMLElement | null {\n if (isNavigationItem(el)) {\n const explicit = el.closest<HTMLElement>('[data-ohw-nav-container]')\n if (explicit) return explicit\n const footerColumn = getFooterColumn(el)\n if (footerColumn) return footerColumn\n const footerGroup = findFooterItemGroup(el)\n if (footerGroup) return footerGroup\n return getNavigationRoot(el)\n }\n // Footer column frame → climb to the links block (rb-footer-links).\n if (\n !isFooterLinksContainer(el) &&\n (el.hasAttribute('data-ohw-footer-col') ||\n el.hasAttribute('data-ohw-footer-column') ||\n isInferredFooterGroup(el))\n ) {\n return getFooterLinksContainer()\n }\n if (\n el.hasAttribute('data-ohw-nav-container') ||\n el.hasAttribute('data-ohw-footer-col') ||\n el.hasAttribute('data-ohw-footer-column') ||\n isFooterLinksContainer(el) ||\n isInferredFooterGroup(el)\n ) {\n return getNavigationRoot(el)\n }\n return null\n}\n\n/** Same-level peers for sibling-hint chrome when an item is Active. */\nfunction collectNavigationItemSiblingHintRects(selected: HTMLElement): DOMRect[] {\n if (!isNavigationItem(selected)) return []\n\n const footerColumn = getFooterColumn(selected)\n if (footerColumn) {\n return listFooterLinksInColumn(footerColumn)\n .filter((link) => link !== selected)\n .map((link) => link.getBoundingClientRect())\n }\n\n const navContainer = selected.closest<HTMLElement>('[data-ohw-nav-container], [data-ohw-nav-drawer]')\n if (navContainer) {\n return Array.from(navContainer.querySelectorAll<HTMLElement>('[data-ohw-href-key]'))\n .filter((el) => isNavigationItem(el) && el !== selected)\n .map((el) => el.getBoundingClientRect())\n }\n\n return listNavigationItems()\n .filter((el) => el !== selected)\n .map((el) => el.getBoundingClientRect())\n}\n\nfunction placeCaretAtPoint(el: HTMLElement, x: number, y: number) {\n const selection = window.getSelection()\n if (!selection) return\n\n // Item-interaction chrome sits above the editable and steals caretRangeFromPoint —\n // temporarily ignore pointer hit-testing so the caret lands in the text under the cursor.\n const overlays = Array.from(\n document.querySelectorAll<HTMLElement>(\n '[data-ohw-item-drag-surface], [data-ohw-item-interaction], [data-ohw-drag-handle-container], [data-ohw-item-toolbar-anchor]',\n ),\n )\n const prevPointerEvents = overlays.map((node) => node.style.pointerEvents)\n for (const node of overlays) node.style.pointerEvents = 'none'\n\n try {\n if (typeof document.caretRangeFromPoint === 'function') {\n const range = document.caretRangeFromPoint(x, y)\n if (range && el.contains(range.startContainer)) {\n selection.removeAllRanges()\n selection.addRange(range)\n return\n }\n }\n\n const caretPositionFromPoint = (\n document as Document & {\n caretPositionFromPoint?: (px: number, py: number) => { offsetNode: Node; offset: number } | null\n }\n ).caretPositionFromPoint\n if (typeof caretPositionFromPoint === 'function') {\n const position = caretPositionFromPoint(x, y)\n if (position && el.contains(position.offsetNode)) {\n const range = document.createRange()\n range.setStart(position.offsetNode, position.offset)\n range.collapse(true)\n selection.removeAllRanges()\n selection.addRange(range)\n }\n }\n } finally {\n overlays.forEach((node, i) => {\n node.style.pointerEvents = prevPointerEvents[i] ?? ''\n })\n }\n}\n\nfunction selectAllTextInEditable(el: HTMLElement) {\n const selection = window.getSelection()\n if (!selection) return\n const range = document.createRange()\n range.selectNodeContents(el)\n selection.removeAllRanges()\n selection.addRange(range)\n}\n\nfunction getNavigationLabelEditable(target: HTMLElement): { editable: HTMLElement; navAnchor: HTMLElement } | null {\n const editable = target.closest<HTMLElement>('[data-ohw-editable=\"text\"]')\n if (!editable) return null\n const hrefCtx = getHrefKeyFromElement(editable)\n const navAnchor = hrefCtx ? getNavigationItemAnchor(hrefCtx.anchor) : null\n if (!navAnchor) return null\n return { editable, navAnchor }\n}\n\ntype ActivateOptions = { caretX?: number; caretY?: number }\n\ntype ToolbarVariant = 'none' | 'rich-text' | 'link-action' | 'select-frame'\n\nfunction collectSections(): SectionNode[] {\n return collectSectionsFromDom()\n}\n\nconst FORCE_PSEUDO_STATES: Array<{ pseudo: string; state: string }> = [\n { pseudo: ':hover', state: 'hover' },\n { pseudo: ':focus', state: 'focus' },\n { pseudo: ':focus-visible', state: 'focus-visible' },\n { pseudo: ':active', state: 'active' },\n]\n\n// For a :hover rule, generates a suppressor that freezes affected elements at their\n// current computed values when not in hover state. This prevents\n// the native :hover CSS from firing in edit mode without touching the template CSS.\nfunction buildHoverSuppressor(rule: CSSStyleRule): string | null {\n const props: string[] = []\n for (let i = 0; i < rule.style.length; i++) props.push(rule.style.item(i))\n if (props.length === 0) return null\n\n const suppressorSelectors: string[] = []\n for (const sel of rule.selectorText.split(',').map(s => s.trim())) {\n if (!sel.includes(':hover')) continue\n const idx = sel.indexOf(':hover')\n suppressorSelectors.push(\n sel.slice(0, idx) + '[data-ohw-editable-state]:not([data-ohw-active-state=\"hover\"])' + sel.slice(idx)\n )\n }\n if (suppressorSelectors.length === 0) return null\n\n // Find a live element matching the descendant part to read its base computed values.\n // collectStateRules() runs at init / route-change, before the cursor is over any card,\n // so getComputedStyle reflects the non-hover (base) state.\n const firstSel = rule.selectorText.split(',')[0].trim()\n const hoverIdx = firstSel.indexOf(':hover')\n const descendantPart = firstSel.slice(hoverIdx + ':hover'.length).trim()\n let targetEl: Element | null = null\n try {\n targetEl = descendantPart\n ? document.querySelector(`[data-ohw-editable-state] ${descendantPart}`)\n : document.querySelector('[data-ohw-editable-state]')\n } catch { return null }\n if (!targetEl) return null\n\n const cs = getComputedStyle(targetEl as HTMLElement)\n const decls = props.map(p => `${p}: ${cs.getPropertyValue(p)} !important`).join('; ')\n return `${suppressorSelectors.join(', ')} { ${decls} }`\n}\n\nfunction applyStateViews(container: HTMLElement, state: string) {\n container.querySelectorAll<HTMLElement>('[data-ohw-state-view]').forEach((view) => {\n view.style.display = view.getAttribute('data-ohw-state-view') === state ? 'block' : 'none'\n })\n}\n\nfunction resetStateViews() {\n document.querySelectorAll<HTMLElement>('[data-ohw-state-view]').forEach((el) => {\n el.style.display = ''\n })\n}\n\n// Reads pseudo-state rules from the page's own stylesheets and returns:\n// 1. [data-ohw-force-*] activator rules (replace :hover/:focus etc. with the force attribute)\n// 2. :hover suppressor rules (lock base computed values so native hover can't fire in edit mode)\n// Template CSS needs no modifications — the bridge handles suppression automatically.\nfunction collectStateRules(): string {\n const lines: string[] = []\n function processRules(rules: CSSRuleList) {\n for (const rule of Array.from(rules)) {\n if (rule instanceof CSSStyleRule) {\n let text = rule.cssText\n let matched = false\n for (const { pseudo, state } of FORCE_PSEUDO_STATES) {\n if (text.includes(pseudo)) {\n text = text.replace(new RegExp(pseudo.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&') + '(?![\\\\w-])', 'g'), `[data-ohw-active-state=\"${state}\"]`)\n if (pseudo === ':hover') {\n const suppressor = buildHoverSuppressor(rule)\n if (suppressor) lines.push(suppressor)\n }\n matched = true\n }\n }\n if (matched) lines.push(text)\n } else if ('cssRules' in rule) {\n processRules((rule as CSSMediaRule).cssRules)\n }\n }\n }\n for (const sheet of Array.from(document.styleSheets)) {\n try { processRules(sheet.cssRules) } catch { /* cross-origin — skip */ }\n }\n return lines.join('\\n')\n}\n\nconst SAFE_TAGS = new Set([\n 'B', 'I', 'U', 'S', 'STRIKE', 'STRONG', 'EM', 'BR', 'P', 'DIV', 'SPAN', 'OL', 'UL', 'LI',\n])\n\nfunction sanitizeHtml(html: string): string {\n const doc = new DOMParser().parseFromString(`<body>${html}</body>`, 'text/html')\n function walk(parent: Element) {\n for (const child of Array.from(parent.childNodes)) {\n if (child.nodeType !== Node.ELEMENT_NODE) continue\n const el = child as Element\n if (!SAFE_TAGS.has(el.tagName)) {\n parent.replaceChild(document.createTextNode(el.textContent ?? ''), el)\n } else {\n // styleWithCSS (handleCommand) applies bold/italic/underline/strikeThrough as inline\n // styles rather than semantic tags — preserve them explicitly or they're silently\n // dropped along with every other attribute below, and never survive a reload.\n const htmlEl = el as HTMLElement\n const textAlign = htmlEl.style?.textAlign || el.getAttribute('align') || ''\n const fontWeight = htmlEl.style?.fontWeight || ''\n const fontStyle = htmlEl.style?.fontStyle || ''\n const textDecorationLine = htmlEl.style?.textDecorationLine || htmlEl.style?.textDecoration || ''\n for (const attr of Array.from(el.attributes)) el.removeAttribute(attr.name)\n if (textAlign) htmlEl.style.textAlign = textAlign\n if (fontWeight) htmlEl.style.fontWeight = fontWeight\n if (fontStyle) htmlEl.style.fontStyle = fontStyle\n if (textDecorationLine) htmlEl.style.textDecorationLine = textDecorationLine\n walk(el)\n }\n }\n }\n walk(doc.body)\n return doc.body.innerHTML\n}\n\nconst ICONS: Record<string, string> = {\n bold: '<path d=\"M6 4h8a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\"/><path d=\"M6 12h9a4 4 0 0 1 4 4 4 4 0 0 1-4 4H6z\"/>',\n italic: '<line x1=\"19\" y1=\"4\" x2=\"10\" y2=\"4\"/><line x1=\"14\" y1=\"20\" x2=\"5\" y2=\"20\"/><line x1=\"15\" y1=\"4\" x2=\"9\" y2=\"20\"/>',\n underline: '<path d=\"M6 4v6a6 6 0 0 0 12 0V4\"/><line x1=\"4\" y1=\"20\" x2=\"20\" y2=\"20\"/>',\n strikeThrough: '<path d=\"M16 4H9a3 3 0 0 0-2.83 4\"/><path d=\"M14 12a4 4 0 0 1 0 8H6\"/><line x1=\"4\" y1=\"12\" x2=\"20\" y2=\"12\"/>',\n justifyLeft: '<line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\"/><line x1=\"15\" y1=\"12\" x2=\"3\" y2=\"12\"/><line x1=\"17\" y1=\"18\" x2=\"3\" y2=\"18\"/>',\n justifyCenter: '<line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\"/><line x1=\"17\" y1=\"12\" x2=\"7\" y2=\"12\"/><line x1=\"19\" y1=\"18\" x2=\"5\" y2=\"18\"/>',\n justifyRight: '<line x1=\"21\" y1=\"6\" x2=\"3\" y2=\"6\"/><line x1=\"21\" y1=\"12\" x2=\"9\" y2=\"12\"/><line x1=\"21\" y1=\"18\" x2=\"7\" y2=\"18\"/>',\n insertUnorderedList:\n '<line x1=\"8\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"8\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"8\" y1=\"18\" x2=\"21\" y2=\"18\"/>' +\n '<line x1=\"3\" y1=\"6\" x2=\"3.01\" y2=\"6\"/><line x1=\"3\" y1=\"12\" x2=\"3.01\" y2=\"12\"/><line x1=\"3\" y1=\"18\" x2=\"3.01\" y2=\"18\"/>',\n insertOrderedList:\n '<line x1=\"10\" y1=\"6\" x2=\"21\" y2=\"6\"/><line x1=\"10\" y1=\"12\" x2=\"21\" y2=\"12\"/><line x1=\"10\" y1=\"18\" x2=\"21\" y2=\"18\"/>' +\n '<path d=\"M4 6h1v4\"/><path d=\"M4 10h2\"/><path d=\"M6 18H4c0-1 2-2 2-3s-1-1.5-2-1\"/>',\n}\n\nconst TOOLBAR_PILL_PADDING = 2\nconst TOOLBAR_TOGGLE_GAP = 4\n\n/** Padding between the element box and the blue selection stroke (Figma inset). */\nconst SELECTION_CHROME_GAP = 4\n/** Gap between the outer edge of the blue stroke and the toolbar — same for action + text fills. */\nconst TOOLBAR_STROKE_GAP = 4\n/** FloatingToolbar is positioned from the element rect, so include chrome padding. */\nconst TOOLBAR_OFFSET_FROM_ELEMENT = SELECTION_CHROME_GAP + TOOLBAR_STROKE_GAP\n\nconst TOOLBAR_GROUPS: Array<Array<{ cmd: string; title: string }>> = [\n [\n { cmd: 'bold', title: 'Bold' },\n { cmd: 'italic', title: 'Italic' },\n { cmd: 'underline', title: 'Underline' },\n { cmd: 'strikeThrough', title: 'Strikethrough' },\n ],\n [\n { cmd: 'justifyLeft', title: 'Align Left' },\n { cmd: 'justifyCenter', title: 'Align Center' },\n { cmd: 'justifyRight', title: 'Align Right' },\n ],\n [\n { cmd: 'insertUnorderedList', title: 'Bullet List' },\n { cmd: 'insertOrderedList', title: 'Numbered List' },\n ],\n]\n\nfunction EditGlowChrome({\n rect,\n elRef,\n reorderHrefKey,\n dragDisabled = false,\n hideHandle = false,\n}: {\n rect: DOMRect\n elRef: React.Ref<HTMLDivElement>\n reorderHrefKey: string | null\n dragDisabled?: boolean\n hideHandle?: boolean\n}) {\n const GAP = SELECTION_CHROME_GAP\n return (\n <div\n ref={elRef}\n data-ohw-edit-chrome=\"\"\n style={{\n position: 'fixed',\n top: rect.top - GAP,\n left: rect.left - GAP,\n width: rect.width + GAP * 2,\n height: rect.height + GAP * 2,\n pointerEvents: 'none',\n zIndex: 2147483646,\n }}\n >\n <div\n style={{\n position: 'absolute',\n inset: 0,\n border: '2px solid var(--ohw-primary, #0885FE)',\n borderRadius: 8,\n boxShadow: '0 0 0 4px color-mix(in srgb, var(--ohw-primary, #0885FE) 12%, transparent)',\n pointerEvents: 'none',\n }}\n />\n {reorderHrefKey && !hideHandle && (\n <div\n data-ohw-drag-handle-container=\"\"\n data-ohw-drag-disabled={dragDisabled ? '' : undefined}\n style={{\n position: 'absolute',\n left: 0,\n top: '50%',\n transform: 'translate(calc(-100% - 7px), -50%)',\n pointerEvents: dragDisabled ? 'none' : 'auto',\n }}\n >\n <DragHandle\n aria-label={`Reorder ${reorderHrefKey}`}\n disabled={dragDisabled}\n aria-disabled={dragDisabled}\n />\n </div>\n )}\n </div>\n )\n}\n\ntype ParentScroll = { iframeOffsetTop: number; headerH: number; canvasH: number }\n\n/** Visible iframe region in parent viewport, expressed in iframe-local coordinates. */\nfunction getIframeVisibleClip(parentScroll: ParentScroll | null): { top: number; bottom: number } | null {\n if (!parentScroll) return null\n const { iframeOffsetTop, headerH: visibleCanvasTop, canvasH } = parentScroll\n const clipTop = Math.max(0, visibleCanvasTop - iframeOffsetTop)\n const clipBottom = Math.min(\n window.innerHeight,\n visibleCanvasTop + canvasH - iframeOffsetTop\n )\n return { top: clipTop, bottom: Math.max(clipTop, clipBottom) }\n}\n\nfunction applyVisibleViewport(el: HTMLElement, parentScroll: ParentScroll | null) {\n const clip = getIframeVisibleClip(parentScroll)\n const top = clip?.top ?? 0\n const height = clip ? clip.bottom - clip.top : window.innerHeight\n el.style.top = `${top}px`\n el.style.height = `${height}px`\n}\n\n/** Min margin from iframe edges — matches prototype ClampedToolbarRow. */\nconst TOOLBAR_EDGE_MARGIN = 4\n\nfunction clampToolbarToClip(\n top: number,\n transform: string,\n rect: DOMRect,\n clip: { top: number; bottom: number },\n approxH: number,\n gap: number\n): { top: number; transform: string } {\n const isAbove = transform.includes('translateY(-100%)')\n let visualTop = isAbove ? top - approxH : top\n let visualBottom = isAbove ? top : top + approxH\n const minTop = clip.top + gap\n const maxBottom = clip.bottom - gap\n\n if (visualTop >= minTop && visualBottom <= maxBottom) {\n return { top, transform }\n }\n\n const belowTop = rect.bottom + gap\n if (belowTop + approxH <= maxBottom && belowTop >= minTop) {\n return { top: belowTop, transform: 'translateX(-50%)' }\n }\n\n const aboveTop = rect.top - gap\n if (aboveTop - approxH >= minTop && aboveTop <= maxBottom) {\n return { top: aboveTop, transform: 'translateX(-50%) translateY(-100%)' }\n }\n\n if (belowTop + approxH <= maxBottom) {\n return { top: belowTop, transform: 'translateX(-50%)' }\n }\n\n const pinnedTop = Math.min(maxBottom - approxH, Math.max(minTop, clip.top + gap))\n return { top: pinnedTop + approxH, transform: 'translateX(-50%) translateY(-100%)' }\n}\n\nfunction clampToolbarLeft(centerX: number, toolbarWidth: number): number {\n const half = toolbarWidth / 2\n return Math.max(\n TOOLBAR_EDGE_MARGIN + half,\n Math.min(centerX, window.innerWidth - TOOLBAR_EDGE_MARGIN - half)\n )\n}\n\nfunction calcToolbarPos(rect: DOMRect, parentScroll: ParentScroll | null, toolbarW = 306) {\n // Offset from the element box so the gap to the blue stroke matches ItemInteractionLayer\n // (chromeGap + strokeGap). Action toolbar measures from the chrome edge; this measures\n // from the element, so both visual gaps stay equal.\n const GAP = TOOLBAR_OFFSET_FROM_ELEMENT\n const APPROX_H = 32\n const clip = getIframeVisibleClip(parentScroll)\n const clipTop = clip?.top ?? 0\n const canvasTopInIframe = parentScroll != null ? parentScroll.headerH - parentScroll.iframeOffsetTop : 0\n\n const visibleTop = rect.top - canvasTopInIframe\n const visibleBottom = rect.bottom - canvasTopInIframe\n\n // Three-state machine:\n // above — block top is in view; toolbar rides above the block\n // sticky — block top has scrolled past the canvas top; toolbar pins to canvas top edge\n // flip — exit from sticky only: block bottom approaches toolbar height,\n // meaning there's no more block content to anchor over; toolbar\n // attaches to block bottom and rides off-screen with it\n //\n // Short blocks (height ≤ APPROX_H + GAP) never enter sticky so never flip —\n // toolbar just rides above until the block is out of view.\n const isTall = rect.height > APPROX_H + GAP\n\n // When the anchor sits near the visible top (e.g. navbar CTA), flip below instead of clipping.\n const spaceAbove = rect.top - (clipTop + GAP)\n const fitsAbove = spaceAbove >= APPROX_H + GAP\n\n let top: number\n let transform: string\n\n if ((visibleTop > 0 || !isTall) && fitsAbove) {\n // Above phase\n top = rect.top - GAP\n transform = 'translateX(-50%) translateY(-100%)'\n } else if (visibleTop > 0 || !isTall) {\n // Above preferred but no room — flip below anchor (navbar buttons at page top)\n top = rect.bottom + GAP\n transform = 'translateX(-50%)'\n } else if (visibleBottom > APPROX_H + GAP) {\n // Sticky phase — pin to visible canvas top inside iframe (never negative)\n top = clipTop + GAP\n transform = 'translateX(-50%)'\n } else {\n // Flip phase — exit from sticky\n top = rect.bottom + GAP\n transform = 'translateX(-50%)'\n }\n\n if (clip) {\n const clamped = clampToolbarToClip(top, transform, rect, clip, APPROX_H, GAP)\n top = clamped.top\n transform = clamped.transform\n }\n\n const rawLeft = rect.left + rect.width / 2\n const left = clampToolbarLeft(rawLeft, toolbarW)\n return { top, left, transform }\n}\n\nfunction resolveItemInteractionState(\n rect: DOMRect,\n parentScroll: ParentScroll | null\n): Extract<ItemInteractionState, 'active-top' | 'active-bottom'> {\n const { transform } = calcToolbarPos(rect, parentScroll, 120)\n return transform.includes('translateY(-100%)') ? 'active-top' : 'active-bottom'\n}\n\n// Use the range boundary, not sel.anchorNode: after execCommand mutates the DOM (e.g.\n// toggling bold while italic/underline are also active), the browser can reposition the\n// anchor to sit at the container between sibling formatting spans rather than inside\n// them — walking from that container misses the still-applied sibling formats entirely.\n// Resolve to an actual child adjacent to the boundary instead.\nfunction resolveSelectionStartElement(sel: Selection | null): HTMLElement | null {\n if (!sel || sel.rangeCount === 0) return null\n const range = sel.getRangeAt(0)\n let startNode: Node = range.startContainer\n if (startNode.nodeType === Node.ELEMENT_NODE) {\n const el = startNode as Element\n startNode = el.childNodes[range.startOffset] ?? el.childNodes[range.startOffset - 1] ?? el\n }\n return startNode.nodeType === Node.TEXT_NODE ? startNode.parentElement : (startNode as HTMLElement)\n}\n\n// Bold/italic: check computed style (inherited, so the innermost element already reflects\n// any ancestor) AND semantic tag names — some design systems reset <b>/<strong>/<i>/<em>\n// to neutral weight/style, which would otherwise hide them from a computed-style-only\n// check. Underline/strike/list membership aren't inherited computed properties, so those\n// still need the ancestor walk regardless.\nfunction detectActiveFormats(startEl: HTMLElement, activeRoot: HTMLElement): Set<string> {\n const formats = new Set<string>()\n\n const cs = getComputedStyle(startEl)\n const weight = parseInt(cs.fontWeight, 10)\n let hasBold = cs.fontWeight === 'bold' || (!Number.isNaN(weight) && weight >= 600)\n let hasItalic = cs.fontStyle === 'italic' || cs.fontStyle === 'oblique'\n let hasUnderline = false\n let hasStrike = false\n let hasUl = false\n let hasOl = false\n for (let el: HTMLElement | null = startEl; el; el = el.parentElement) {\n if (el.tagName === 'B' || el.tagName === 'STRONG') hasBold = true\n if (el.tagName === 'I' || el.tagName === 'EM') hasItalic = true\n const decoration = getComputedStyle(el).textDecorationLine\n if (decoration.includes('underline') || el.tagName === 'U' || el.tagName === 'INS') hasUnderline = true\n if (decoration.includes('line-through') || el.tagName === 'S' || el.tagName === 'STRIKE' || el.tagName === 'DEL') hasStrike = true\n if (el.tagName === 'UL') hasUl = true\n if (el.tagName === 'OL') hasOl = true\n if (el === activeRoot) break\n }\n if (hasBold) formats.add('bold')\n if (hasItalic) formats.add('italic')\n if (hasUnderline) formats.add('underline')\n if (hasStrike) formats.add('strikeThrough')\n if (hasUl) formats.add('insertUnorderedList')\n if (hasOl) formats.add('insertOrderedList')\n\n // Alignment — derive from computed textAlign on the selection's block element.\n const block = startEl.closest<HTMLElement>('div, p, h1, h2, h3, h4, h5, h6, li, td, th') ?? startEl\n const align = getComputedStyle(block).textAlign\n if (align === 'center') formats.add('justifyCenter')\n else if (align === 'right' || align === 'end') formats.add('justifyRight')\n else formats.add('justifyLeft')\n\n return formats\n}\n\nfunction setsEqual(a: Set<string>, b: Set<string>): boolean {\n if (a.size !== b.size) return false\n for (const item of a) {\n if (!b.has(item)) return false\n }\n return true\n}\n\n// Character offset of (node, offset) relative to root's full text content — stable across\n// the DOM surgery execCommand does (splitting/merging/rewrapping text nodes), unlike a\n// saved Range or node reference, which goes stale the moment its nodes are replaced.\nfunction textOffsetInRoot(root: HTMLElement, node: Node, offset: number): number {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT)\n let total = 0\n let current: Node | null\n while ((current = walker.nextNode())) {\n if (current === node) return total + offset\n total += (current.textContent ?? '').length\n }\n return total\n}\n\n// Inverse of textOffsetInRoot: walks root's CURRENT text nodes (post-mutation) to find the\n// (node, offset) point at a given character offset, for reconstructing a Range afterward.\nfunction pointAtTextOffset(root: HTMLElement, targetOffset: number): { node: Node; offset: number } | null {\n const walker = document.createTreeWalker(root, NodeFilter.SHOW_TEXT)\n let total = 0\n let current: Node | null\n let last: Node | null = null\n while ((current = walker.nextNode())) {\n const len = (current.textContent ?? '').length\n if (total + len >= targetOffset) return { node: current, offset: targetOffset - total }\n total += len\n last = current\n }\n return last ? { node: last, offset: (last.textContent ?? '').length } : null\n}\n\nfunction FloatingToolbar({\n rect,\n parentScroll,\n elRef,\n onCommand,\n activeCommands,\n showEditLink,\n onEditLink,\n}: {\n rect: DOMRect\n parentScroll: ParentScroll | null\n elRef: React.Ref<HTMLDivElement>\n onCommand: (cmd: string) => void\n activeCommands: Set<string>\n showEditLink?: boolean\n onEditLink?: () => void\n}) {\n const localRef = React.useRef<HTMLDivElement | null>(null)\n const [measuredW, setMeasuredW] = React.useState(330)\n\n const setRefs = React.useCallback(\n (node: HTMLDivElement | null) => {\n localRef.current = node\n if (typeof elRef === 'function') elRef(node)\n else if (elRef) (elRef as React.MutableRefObject<HTMLDivElement | null>).current = node\n if (node) {\n const w = node.offsetWidth\n if (w > 0) setMeasuredW(w)\n }\n },\n [elRef]\n )\n\n React.useLayoutEffect(() => {\n const node = localRef.current\n if (!node) return\n const update = () => {\n const w = node.offsetWidth\n if (w > 0) setMeasuredW(w)\n }\n update()\n const ro = new ResizeObserver(update)\n ro.observe(node)\n return () => ro.disconnect()\n }, [showEditLink, activeCommands])\n\n const { top, left, transform } = calcToolbarPos(rect, parentScroll, measuredW)\n\n return (\n <div\n ref={setRefs}\n style={{\n position: 'fixed',\n top,\n left,\n transform,\n zIndex: 2147483647,\n pointerEvents: 'auto',\n }}\n >\n <CustomToolbar>\n {TOOLBAR_GROUPS.map((btns, gi) => (\n <React.Fragment key={gi}>\n {gi > 0 && <CustomToolbarDivider />}\n {btns.map((btn) => {\n const isActive = activeCommands.has(btn.cmd)\n return (\n <CustomToolbarButton\n key={btn.cmd}\n title={btn.title}\n active={isActive}\n onMouseDown={(e) => {\n e.preventDefault()\n onCommand(btn.cmd)\n }}\n >\n <svg\n width=\"16\"\n height=\"16\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n style={isActive && gi > 0 ? { filter: 'drop-shadow(0 0 0.5px currentColor)' } : undefined}\n dangerouslySetInnerHTML={{ __html: ICONS[btn.cmd] }}\n aria-hidden\n />\n </CustomToolbarButton>\n )\n })}\n </React.Fragment>\n ))}\n {showEditLink ? (\n <CustomToolbarButton\n type=\"button\"\n title=\"Edit link\"\n onMouseDown={(e) => {\n e.preventDefault()\n e.stopPropagation()\n onEditLink?.()\n }}\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}\n >\n <Link className=\"size-4 shrink-0\" aria-hidden />\n </CustomToolbarButton>\n ) : null}\n </CustomToolbar>\n </div>\n )\n}\n\n// State preview pattern:\n// - Pseudo-class states: data-ohw-editable-state=\"hover\" — bridge forces via CSS injection + data-ohw-active-state attr\n// - Non-pseudo states (future): parent wrapper + children with data-ohw-state=\"success|error|default\"\nfunction deriveStates(attr: string): string[] {\n if (!attr) return []\n return ['Default', ...attr.split(',').map((s) => s.trim().charAt(0).toUpperCase() + s.trim().slice(1))]\n}\n\nfunction StateToggle({\n rect,\n activeState,\n states,\n onStateChange,\n}: {\n rect: DOMRect\n activeState: string\n states: string[]\n onStateChange: (state: string) => void\n}) {\n return (\n <ToggleGroup\n data-ohw-state-toggle=\"\"\n data-ohw-bridge=\"\"\n value={activeState}\n onValueChange={onStateChange}\n onMouseDown={(e: React.MouseEvent) => e.preventDefault()}\n className=\"fixed z-2147483647 pointer-events-auto shadow-popover\"\n style={{\n top: rect.top + 8,\n left: rect.right - 8,\n transform: 'translateX(-100%)',\n }}\n >\n {states.map((state) => (\n <ToggleGroupItem key={state} value={state} size=\"sm\">\n {state}\n </ToggleGroupItem>\n ))}\n </ToggleGroup>\n )\n}\n\nconst contentCache = new Map<string, Record<string, string>>()\n\nfunction resolveSubdomain(subdomainFromQuery: string | null): string {\n if (subdomainFromQuery) return subdomainFromQuery\n if (typeof window !== 'undefined') {\n const parts = window.location.hostname.split('.')\n if (parts.length >= 3 && parts[0] !== 'www') return parts[0]\n }\n const siteUrl = process.env.NEXT_PUBLIC_SITE_URL as string | undefined\n if (siteUrl) {\n try {\n const host = new URL(siteUrl).hostname\n const siteParts = host.split('.')\n if (siteParts.length >= 3 && siteParts[0] !== 'www') return siteParts[0]\n } catch { /* ignore */ }\n }\n return ''\n}\n\nexport function OhhwellsBridge() {\n const pathname = usePathname()\n const router = useRouter()\n const searchParams = useSearchParams()\n const isEditMode = isEditSessionActive()\n\n const [bridgeRoot, setBridgeRoot] = useState<HTMLElement | null>(null)\n useEffect(() => {\n const figtreeFontId = 'ohw-figtree-font'\n if (!document.getElementById(figtreeFontId)) {\n const preconnect1 = Object.assign(document.createElement('link'), { rel: 'preconnect', href: 'https://fonts.googleapis.com' })\n const preconnect2 = Object.assign(document.createElement('link'), { rel: 'preconnect', href: 'https://fonts.gstatic.com', crossOrigin: '' })\n const stylesheet = Object.assign(document.createElement('link'), {\n id: figtreeFontId,\n rel: 'stylesheet',\n // Inter is loaded alongside Figtree for the media overlay's Replace button. The bridge\n // renders inside the customer's document, so it cannot assume any font is present — an\n // unloaded family would silently fall back to whatever the template happens to use.\n href: 'https://fonts.googleapis.com/css2?family=Figtree:ital,wght@0,300..900;1,300..900&family=Inter:wght@400;500;600&display=swap',\n })\n document.head.append(preconnect1, preconnect2, stylesheet)\n }\n\n const el = document.createElement('div')\n el.setAttribute('data-ohw-bridge-root', '')\n el.setAttribute('data-ohw-bridge', '')\n el.className = 'font-sans'\n document.body.appendChild(el)\n setBridgeRoot(el)\n return () => { el.remove() }\n }, [])\n\n const subdomainFromQuery = searchParams.get('subdomain')\n const subdomain = resolveSubdomain(subdomainFromQuery)\n\n useLinkHrefGuardian(pathname, subdomain, isEditMode)\n\n const postToParent = useCallback((data: Record<string, unknown>) => {\n if (typeof window !== 'undefined' && window.parent !== window) {\n window.parent.postMessage(data, '*')\n }\n }, [])\n\n const [fetchState, setFetchState] = useState<'idle' | 'loading' | 'done'>('idle')\n const autoSaveTimers = useRef<Map<string, ReturnType<typeof setTimeout>>>(new Map())\n\n const activeElRef = useRef<HTMLElement | null>(null)\n /** True while any primary-button pointer press is held down anywhere in the document. */\n const pointerHeldRef = useRef(false)\n const selectedElRef = useRef<HTMLElement | null>(null)\n /** Stable identity for selection — React remounts recycle nodes by index after DnD. */\n const selectedHrefKeyRef = useRef<string | null>(null)\n const selectedFooterColAttrRef = useRef<string | null>(null)\n const originalContentRef = useRef<string | null>(null)\n const activeStateElRef = useRef<HTMLElement | null>(null)\n const parentScrollRef = useRef<{ iframeOffsetTop: number; headerH: number; canvasH: number } | null>(null)\n const visibleViewportRef = useRef<HTMLDivElement | null>(null)\n const [dialogPortalContainer, setDialogPortalContainer] = useState<HTMLElement | null>(null)\n const attachVisibleViewport = useCallback((node: HTMLDivElement | null) => {\n visibleViewportRef.current = node\n setDialogPortalContainer(node)\n if (node) applyVisibleViewport(node, parentScrollRef.current)\n }, [])\n const toolbarElRef = useRef<HTMLDivElement | null>(null)\n const glowElRef = useRef<HTMLDivElement | null>(null)\n const hoveredImageRef = useRef<HTMLElement | null>(null)\n const hoveredImageHasTextOverlapRef = useRef(false)\n // Which element the CURRENT drag is over. Tracked separately from hoveredImageRef because a\n // plain mouse-hover already sets that one — so keying the drag-over post off it alone meant\n // `isDragOver: true` was never sent when you mouse-hovered a target before dragging onto it.\n const dragOverElRef = useRef<HTMLElement | null>(null)\n // The overlay now renders here rather than in the parent, so hover needs to be render state,\n // not just a ref. `hoveredImageRef` stays as the hit-test's own bookkeeping (sticky pinning,\n // unhover debounce); this mirrors it for React.\n const [mediaHover, setMediaHover] = useState<MediaHover | null>(null)\n // Carousel hover chrome (the \"Edit gallery\" button). Independent of mediaHover: carousel\n // slides are no longer per-slide `data-ohw-editable`, so they don't flow through the media\n // hit-test. Tracked as render state so the button can position over the container.\n const [carouselHover, setCarouselHover] = useState<CarouselHover | null>(null)\n // Keys currently uploading → the box to draw their skeleton over. Driven by\n // `ow:image-uploading` from the parent (which owns the authenticated upload). The rect is\n // pinned at upload start because the element is mid-swap and the cursor may wander off it.\n // `fadingOut` is set once the replacement decodes, so the skeleton dissolves rather than pops.\n const [uploadingRects, setUploadingRects] = useState<\n Record<string, { rect: MediaHover['rect']; fadingOut?: boolean }>\n >({})\n const hoveredGapRef = useRef<{ insertAfter: string; insertBefore: string | null } | null>(null)\n const imageUnhoverTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const imageShowTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const editStylesRef = useRef<{ base: HTMLStyleElement; forceHover: HTMLStyleElement; stateViews: HTMLStyleElement } | null>(null)\n const activateRef = useRef<(el: HTMLElement, options?: ActivateOptions) => void>(() => {})\n const deactivateRef = useRef<() => void>(() => {})\n const selectRef = useRef<(anchor: HTMLElement) => void>(() => {})\n const selectFrameRef = useRef<(el: HTMLElement) => void>(() => {})\n const deselectRef = useRef<() => void>(() => {})\n const reselectNavigationItemRef = useRef<(navAnchor: HTMLElement) => void>(() => {})\n const commitNavigationTextEditRef = useRef<(navAnchor: HTMLElement) => void>(() => {})\n const refreshActiveCommandsRef = useRef<() => void>(() => {})\n const postToParentRef = useRef(postToParent)\n postToParentRef.current = postToParent\n const sectionsLoadedRef = useRef(false)\n const pendingScheduleConfigRequests = useRef<string[]>([])\n\n const [toolbarRect, setToolbarRect] = useState<DOMRect | null>(null)\n const [toolbarVariant, setToolbarVariant] = useState<ToolbarVariant>('none')\n const toolbarVariantRef = useRef<ToolbarVariant>('none')\n toolbarVariantRef.current = toolbarVariant\n const [selectedIsCta, setSelectedIsCta] = useState(false)\n const [reorderHrefKey, setReorderHrefKey] = useState<string | null>(null)\n const [reorderDragDisabled, setReorderDragDisabled] = useState(false)\n const [toggleState, setToggleState] = useState<{ rect: DOMRect; activeState: string; states: string[] } | null>(null)\n const [maxBadge, setMaxBadge] = useState<{ rect: DOMRect; current: number; max: number } | null>(null)\n const [activeCommands, setActiveCommands] = useState<Set<string>>(new Set())\n const [sectionGap, setSectionGap] = useState<{ insertAfter: string; insertBefore: string | null; y: number } | null>(null)\n const [toolbarShowEditLink, setToolbarShowEditLink] = useState(false)\n const hoveredNavContainerRef = useRef<HTMLElement | null>(null)\n const [hoveredNavContainerRect, setHoveredNavContainerRect] = useState<DOMRect | null>(null)\n const hoveredItemElRef = useRef<HTMLElement | null>(null)\n const [hoveredItemRect, setHoveredItemRect] = useState<DOMRect | null>(null)\n const siblingHintElRef = useRef<HTMLElement | null>(null)\n const [siblingHintRect, setSiblingHintRect] = useState<DOMRect | null>(null)\n const [siblingHintRects, setSiblingHintRects] = useState<DOMRect[]>([])\n const [isItemDragging, setIsItemDragging] = useState(false)\n const [isFooterFrameSelection, setIsFooterFrameSelection] = useState(false)\n const footerDragRef = useRef<FooterDragSession | null>(null)\n const [footerDropSlots, setFooterDropSlots] = useState<FooterDropSlot[]>([])\n const [activeFooterDropIndex, setActiveFooterDropIndex] = useState<number | null>(null)\n const [draggedItemRect, setDraggedItemRect] = useState<DOMRect | null>(null)\n const footerPointerDragRef = useRef<{\n el: HTMLElement\n kind: FooterDragKind\n startX: number\n startY: number\n pointerId: number\n wasSelected: boolean\n started: boolean\n } | null>(null)\n const suppressNextClickRef = useRef(false)\n /** Extra window so a trailing click after end→front drops can't steal selection. */\n const suppressClickUntilRef = useRef(0)\n const [linkPopover, setLinkPopover] = useState<LinkPopoverSession | null>(null)\n const linkPopoverSessionRef = useRef<LinkPopoverSession | null>(null)\n const addNavAfterAnchorRef = useRef<HTMLElement | null>(null)\n const editContentRef = useRef<Record<string, string>>({})\n const [sitePages, setSitePages] = useState<LinkPage[]>([])\n const [sectionsByPath, setSectionsByPath] = useState<Record<string, SectionNode[]>>({})\n const sectionsPrefetchGenRef = useRef(0)\n const setLinkPopoverRef = useRef(setLinkPopover)\n const linkPopoverPanelRef = useRef<HTMLDivElement>(null)\n const linkPopoverOpenRef = useRef(false)\n const linkPopoverGraceUntilRef = useRef(0)\n setLinkPopoverRef.current = setLinkPopover\n linkPopoverSessionRef.current = linkPopover\n\n const {\n navDragRef,\n navDropSlots,\n activeNavDropIndex,\n startNavLinkDrag,\n commitNavDrag,\n onNavDragOver,\n armNavPressFromChrome,\n refreshNavDragVisualsRef,\n } = useNavItemDrag({\n isEditMode,\n editContentRef,\n selectedElRef,\n activeElRef,\n footerDragRef,\n suppressNextClickRef,\n suppressClickUntilRef,\n siblingHintElRef,\n postToParentRef,\n deselectRef,\n selectRef,\n deactivateRef,\n setLinkPopover: () => setLinkPopover(null),\n linkPopoverOpenRef,\n setIsItemDragging,\n setDraggedItemRect,\n setSiblingHintRect,\n setSiblingHintRects,\n setToolbarRect,\n getNavigationItemAnchor,\n isDragHandleDisabled,\n isNavbarButton,\n })\n\n const bumpLinkPopoverGrace = () => {\n linkPopoverGraceUntilRef.current = Date.now() + 350\n }\n\n const runSectionsPrefetch = useCallback((pages: LinkPage[]) => {\n if (!isEditMode || shouldUseDevFixtures() || pages.length === 0) return\n\n const gen = ++sectionsPrefetchGenRef.current\n const paths = pages.map((p) => p.path)\n\n void prefetchSectionsForPaths(paths).then((fetched) => {\n if (gen !== sectionsPrefetchGenRef.current) return\n if (process.env.NODE_ENV === 'development') {\n console.info('[ohhwells-bridge] Sections prefetched for', Object.keys(fetched).join(', ') || '(none)')\n }\n setSectionsByPath((prev) =>\n mergePrefetchedSections(\n prev,\n fetched,\n typeof window !== 'undefined' ? window.location.pathname : pathname,\n collectSections()\n )\n )\n })\n }, [isEditMode, pathname])\n\n const runSectionsPrefetchRef = useRef(runSectionsPrefetch)\n runSectionsPrefetchRef.current = runSectionsPrefetch\n\n // ImageOverlay lives in the parent frame above the iframe — dismiss it while the link\n // popover is open so the overlay cannot cover popover UI at overlapping coordinates.\n // Scroll lock is owned by LinkPopover (skips locking while the section picker is active).\n useEffect(() => {\n if (!linkPopover) {\n document.documentElement.removeAttribute('data-ohw-link-popover-open')\n return\n }\n\n document.documentElement.setAttribute('data-ohw-link-popover-open', '')\n\n // Drop all item interaction chrome so Active/hover/sibling never paint over the modal.\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n siblingHintElRef.current = null\n setSiblingHintRect(null)\n setSiblingHintRects([])\n if (selectedElRef.current || toolbarVariantRef.current !== 'none') {\n deselectRef.current()\n }\n\n if (hoveredImageRef.current) {\n hoveredImageRef.current = null\n hoveredImageHasTextOverlapRef.current = false\n }\n hoveredGapRef.current = null\n setSectionGap(null)\n setMediaHover(null)\n postToParent({ type: 'ow:link-modal-lock', locked: true })\n\n const html = document.documentElement\n const body = document.body\n const prevHtmlOverflow = html.style.overflow\n const prevBodyOverflow = body.style.overflow\n html.style.overflow = 'hidden'\n body.style.overflow = 'hidden'\n\n const preventBackgroundScroll = (e: Event) => {\n const target = e.target\n if (target instanceof Element && target.closest('[data-ohw-link-modal-root], [data-slot=\"dialog-overlay\"]')) {\n return\n }\n e.preventDefault()\n }\n\n const scrollOpts = { passive: false, capture: true } as const\n document.addEventListener('wheel', preventBackgroundScroll, scrollOpts)\n document.addEventListener('touchmove', preventBackgroundScroll, scrollOpts)\n\n postToParent({ type: 'ow:image-unhover' })\n\n return () => {\n document.documentElement.removeAttribute('data-ohw-link-popover-open')\n postToParent({ type: 'ow:link-modal-lock', locked: false })\n html.style.overflow = prevHtmlOverflow\n body.style.overflow = prevBodyOverflow\n document.removeEventListener('wheel', preventBackgroundScroll, scrollOpts)\n document.removeEventListener('touchmove', preventBackgroundScroll, scrollOpts)\n }\n }, [linkPopover, postToParent])\n\n // Site pages from canvas editor parent — dedicated listener so we don't miss ow:site-pages.\n useEffect(() => {\n if (!isEditMode) return\n\n const useFixtures = shouldUseDevFixtures()\n if (useFixtures) {\n setSitePages(DEV_SITE_PAGES)\n setSectionsByPath(DEV_SECTIONS_BY_PATH)\n if (process.env.NODE_ENV === 'development') {\n console.info('[ohhwells-bridge] Dev fixtures loaded (ohw-fixtures=1)')\n }\n }\n\n const onSitePages = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:site-pages' || !Array.isArray(e.data.pages)) return\n if (useFixtures) return\n const mapped = (e.data.pages as Array<{ path: string; title: string }>).map((p) => ({\n path: p.path,\n title: p.title,\n }))\n setSitePages(mapped)\n runSectionsPrefetchRef.current(mapped)\n }\n\n window.addEventListener('message', onSitePages)\n if (!useFixtures) postToParent({ type: 'ow:request-site-pages' })\n\n return () => window.removeEventListener('message', onSitePages)\n }, [isEditMode, postToParent])\n\n // Bootstrap sections from template manifest immediately in edit mode (before ow:site-pages).\n useEffect(() => {\n if (!isEditMode || shouldUseDevFixtures()) return\n void loadAllSectionsManifest().then((manifest) => {\n if (Object.keys(manifest).length === 0) return\n setSectionsByPath((prev) => ({ ...manifest, ...prev }))\n })\n }, [isEditMode])\n\n // Full-height iframe (parent scrolls): handleScroll won't fire because window.scroll\n // doesn't propagate from parent → iframe. Use visualViewport events instead to re-fetch\n // In the VibeCanvasEditor the iframe is full-height and the parent window scrolls,\n // so window.scroll never fires inside the iframe. Use visualViewport events to keep\n // rects current when the parent scrolls.\n useEffect(() => {\n const update = () => {\n const el = activeElRef.current ?? selectedElRef.current\n if (el) setToolbarRect(getEditMeasureEl(el).getBoundingClientRect())\n setToggleState((prev) => {\n if (!prev || !activeStateElRef.current) return prev\n return { ...prev, rect: activeStateElRef.current.getBoundingClientRect() }\n })\n setSectionGap((prev) => {\n if (!prev) return prev\n const anchor = document.querySelector<HTMLElement>(`[data-ohw-section=\"${prev.insertAfter}\"]`)\n if (!anchor) return prev\n return { ...prev, y: anchor.getBoundingClientRect().bottom }\n })\n }\n const vvp = window.visualViewport\n if (!vvp) return\n vvp.addEventListener('scroll', update)\n vvp.addEventListener('resize', update)\n return () => {\n vvp.removeEventListener('scroll', update)\n vvp.removeEventListener('resize', update)\n }\n }, [])\n\n const refreshStateRules = useCallback(() => {\n editStylesRef.current?.forceHover &&\n (editStylesRef.current.forceHover.textContent = collectStateRules())\n }, [])\n\n // Respond to a single ow:request-schedule-config by looking up the tracker.\n // If no entry exists, adopts the widget (adds to tracker, notifies parent in edit mode).\n const processConfigRequest = useCallback((insertAfterVal: string) => {\n const tracker = getSectionsTracker()\n let entries: InsertedSection[] = []\n try { entries = JSON.parse(tracker.textContent || '[]') } catch {}\n const path = window.location.pathname\n const entry = entries.find(\n (e) => e.type === 'scheduling' && e.insertAfter === insertAfterVal && (!e.pagePath || e.pagePath === path)\n )\n if (entry) {\n window.postMessage({ type: 'ow:schedule-config', insertAfter: insertAfterVal, scheduleId: entry.scheduleId ?? null }, '*')\n return\n }\n // Widget has no saved record: adopt it so the connect flow works.\n const newEntry: InsertedSection = { type: 'scheduling', insertAfter: insertAfterVal, pagePath: path }\n entries.push(newEntry)\n tracker.textContent = JSON.stringify(entries)\n if (isEditMode) {\n postToParentRef.current({ type: 'ow:change', nodes: [{ key: '__ohw_sections', text: tracker.textContent }] })\n }\n window.postMessage({ type: 'ow:schedule-config', insertAfter: insertAfterVal, scheduleId: null }, '*')\n }, [isEditMode])\n\n const deactivate = useCallback(() => {\n const el = activeElRef.current\n if (!el) return\n\n // Always send the final content to the parent on deactivate so ow:exit-edit\n // can flush it immediately — regardless of whether the 400ms timer fired.\n const key = el.dataset.ohwKey\n if (key) {\n const timer = autoSaveTimers.current.get(key)\n if (timer !== undefined) {\n clearTimeout(timer)\n autoSaveTimers.current.delete(key)\n }\n const html = sanitizeHtml(el.innerHTML)\n const original = originalContentRef.current ?? ''\n if (html !== sanitizeHtml(original)) {\n postToParentRef.current({ type: 'ow:change', nodes: [{ key, text: html }] })\n const h = document.documentElement.scrollHeight\n if (h > 50) postToParentRef.current({ type: 'ow:height', height: h })\n }\n }\n\n el.removeAttribute('contenteditable')\n el.removeAttribute('data-ohw-editing')\n activeElRef.current = null\n setReorderHrefKey(null)\n setReorderDragDisabled(false)\n if (!selectedElRef.current) {\n setToolbarRect(null)\n setToolbarVariant('none')\n }\n setMaxBadge(null)\n setActiveCommands(new Set())\n setToolbarShowEditLink(false)\n postToParent({ type: 'ow:exit-edit' })\n }, [postToParent])\n\n const clearSelectedAttr = useCallback(() => {\n document.querySelectorAll<HTMLElement>('[data-ohw-selected]').forEach((el) => {\n el.removeAttribute('data-ohw-selected')\n })\n }, [])\n\n const deselect = useCallback(() => {\n clearSelectedAttr()\n selectedElRef.current = null\n selectedHrefKeyRef.current = null\n selectedFooterColAttrRef.current = null\n setSelectedIsCta(false)\n setReorderHrefKey(null)\n setReorderDragDisabled(false)\n setIsFooterFrameSelection(false)\n siblingHintElRef.current = null\n setSiblingHintRect(null)\n setSiblingHintRects([])\n setIsItemDragging(false)\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n if (!activeElRef.current) {\n setToolbarRect(null)\n setToolbarVariant('none')\n }\n }, [clearSelectedAttr])\n\n const markSelected = useCallback((el: HTMLElement) => {\n clearSelectedAttr()\n el.setAttribute('data-ohw-selected', '')\n }, [clearSelectedAttr])\n\n const resolveHrefKeyElement = useCallback((hrefKey: string): HTMLElement | null => {\n if (isFooterHrefKey(hrefKey)) {\n return document.querySelector<HTMLElement>(\n `footer [data-ohw-href-key=\"${CSS.escape(hrefKey)}\"]`\n )\n }\n if (isNavbarHrefKey(hrefKey)) {\n const desktop = document.querySelector<HTMLElement>('[data-ohw-nav-container]')\n const drawer = document.querySelector<HTMLElement>('[data-ohw-nav-drawer]')\n return (\n desktop?.querySelector<HTMLElement>(`[data-ohw-href-key=\"${CSS.escape(hrefKey)}\"]`) ??\n drawer?.querySelector<HTMLElement>(`[data-ohw-href-key=\"${CSS.escape(hrefKey)}\"]`) ??\n document.querySelector<HTMLElement>(`[data-ohw-href-key=\"${CSS.escape(hrefKey)}\"]`)\n )\n }\n return document.querySelector<HTMLElement>(\n `[data-ohw-href-key=\"${CSS.escape(hrefKey)}\"]`\n )\n }, [])\n\n /** Re-bind selection to the live node for selectedHrefKey after DOM reorder / React remount. */\n const resyncSelectedNavigationItem = useCallback(() => {\n const hrefKey = selectedHrefKeyRef.current\n if (hrefKey) {\n const link = resolveHrefKeyElement(hrefKey)\n if (!link || !isNavigationItem(link)) return\n selectedElRef.current = link\n const { key, disabled } = getNavigationItemReorderState(link)\n setReorderHrefKey(key)\n setReorderDragDisabled(disabled)\n setIsFooterFrameSelection(false)\n setToolbarVariant('link-action')\n setToolbarRect(link.getBoundingClientRect())\n setSiblingHintRects(collectNavigationItemSiblingHintRects(link))\n return\n }\n\n const colAttr = selectedFooterColAttrRef.current\n if (colAttr != null) {\n const column =\n document.querySelector<HTMLElement>(`[data-ohw-footer-col=\"${CSS.escape(colAttr)}\"]`) ??\n listFooterColumns()[Number(colAttr)] ??\n null\n if (!column || !isNavigationContainer(column)) return\n selectedElRef.current = column\n setIsFooterFrameSelection(true)\n setToolbarVariant('select-frame')\n setToolbarRect(column.getBoundingClientRect())\n setSiblingHintRects(\n listFooterColumns()\n .filter((c) => c !== column)\n .map((c) => c.getBoundingClientRect())\n )\n }\n }, [resolveHrefKeyElement])\n\n const reselectNavigationItem = useCallback((navAnchor: HTMLElement) => {\n selectedElRef.current = navAnchor\n selectedHrefKeyRef.current = navAnchor.getAttribute('data-ohw-href-key')\n selectedFooterColAttrRef.current = null\n markSelected(navAnchor)\n setSelectedIsCta(isNavbarButton(navAnchor))\n const { key, disabled } = getNavigationItemReorderState(navAnchor)\n setReorderHrefKey(key)\n setReorderDragDisabled(disabled)\n setToolbarVariant('link-action')\n setToolbarRect(navAnchor.getBoundingClientRect())\n setSiblingHintRects(collectNavigationItemSiblingHintRects(navAnchor))\n setToolbarShowEditLink(false)\n setActiveCommands(new Set())\n }, [markSelected])\n\n const commitNavigationTextEdit = useCallback((navAnchor: HTMLElement) => {\n const el = activeElRef.current\n if (!el) return\n const key = el.dataset.ohwKey\n if (key) {\n const timer = autoSaveTimers.current.get(key)\n if (timer !== undefined) {\n clearTimeout(timer)\n autoSaveTimers.current.delete(key)\n }\n const html = sanitizeHtml(el.innerHTML)\n const original = originalContentRef.current ?? ''\n if (html !== sanitizeHtml(original)) {\n postToParent({ type: 'ow:change', nodes: [{ key, text: html }] })\n const h = document.documentElement.scrollHeight\n if (h > 50) postToParent({ type: 'ow:height', height: h })\n }\n }\n el.removeAttribute('contenteditable')\n el.removeAttribute('data-ohw-editing')\n activeElRef.current = null\n setMaxBadge(null)\n setActiveCommands(new Set())\n setToolbarShowEditLink(false)\n postToParent({ type: 'ow:exit-edit' })\n reselectNavigationItem(navAnchor)\n }, [postToParent, reselectNavigationItem])\n\n const handleAddTopLevelNavItem = useCallback(() => {\n const items = listNavbarItems()\n addNavAfterAnchorRef.current = items[items.length - 1] ?? null\n deselectRef.current()\n deactivateRef.current()\n bumpLinkPopoverGrace()\n setLinkPopover({\n key: '__add-nav__',\n mode: 'create',\n intent: 'add-nav',\n })\n }, [])\n\n const handleAddFooterColumn = useCallback(() => {\n if (!canAddFooterColumn()) {\n postToParent({\n type: 'ow:toast',\n title: `Maximum ${MAX_FOOTER_COLUMNS} columns`,\n toastType: 'error',\n })\n return\n }\n deselectRef.current()\n deactivateRef.current()\n const result = addFooterColumnWithPersist({ postToParent })\n if (!result) return\n editContentRef.current = {\n ...editContentRef.current,\n ...buildFooterColumnEditContentPatch(result),\n }\n requestAnimationFrame(() => {\n // Item-level selection with action toolbar (not text edit).\n selectRef.current(result.firstLink)\n })\n }, [postToParent])\n\n const clearFooterDragVisuals = useCallback(() => {\n footerDragRef.current = null\n setSiblingHintRects([])\n setFooterDropSlots([])\n setActiveFooterDropIndex(null)\n setDraggedItemRect(null)\n setIsItemDragging(false)\n unlockFooterDragInteraction()\n }, [])\n\n const refreshFooterDragVisuals = useCallback((session: FooterDragSession, activeSlot: FooterDropSlot | null, clientX?: number, clientY?: number) => {\n const dragged = session.draggedEl\n setDraggedItemRect(dragged.getBoundingClientRect())\n\n if (typeof clientX === 'number' && typeof clientY === 'number') {\n session.lastClientX = clientX\n session.lastClientY = clientY\n }\n session.activeSlot = activeSlot\n\n // During drag, siblings stay in default state — only drop indicators show placement.\n setSiblingHintRects([])\n\n if (session.kind === 'link') {\n const columns = listFooterColumns()\n const slots: FooterDropSlot[] = []\n columns.forEach((col, i) => {\n slots.push(...buildLinkDropSlots(col, i))\n })\n setFooterDropSlots(slots)\n const activeIdx = activeSlot ? slots.findIndex(s => s.columnIndex === activeSlot.columnIndex && s.insertIndex === activeSlot.insertIndex) : -1\n setActiveFooterDropIndex(activeIdx >= 0 ? activeIdx : null)\n return\n }\n\n const slots = buildColumnDropSlots()\n setFooterDropSlots(slots)\n const activeIdx = activeSlot ? slots.findIndex(s => s.insertIndex === activeSlot.insertIndex) : -1\n setActiveFooterDropIndex(activeIdx >= 0 ? activeIdx : null)\n }, [])\n\n const refreshFooterDragVisualsRef = useRef(refreshFooterDragVisuals)\n refreshFooterDragVisualsRef.current = refreshFooterDragVisuals\n const commitFooterDragRef = useRef<(x?: number, y?: number) => void>(() => { })\n const beginFooterDragRef = useRef<(session: FooterDragSession) => void>(() => { })\n\n const beginFooterDrag = useCallback(\n (session: FooterDragSession) => {\n const rect = session.draggedEl.getBoundingClientRect()\n session.lastClientX = session.lastClientX || rect.left + rect.width / 2\n session.lastClientY = session.lastClientY || rect.top + rect.height / 2\n session.activeSlot = session.activeSlot ?? null\n\n footerDragRef.current = session\n setIsItemDragging(true)\n lockFooterDuringDrag()\n siblingHintElRef.current = null\n setSiblingHintRect(null)\n\n // Hide toolbar while dragging; keep selection chrome via dragging state when selected\n if (session.wasSelected && selectedElRef.current === session.draggedEl) {\n setToolbarRect(rect)\n }\n\n const initialSlot = session.kind === 'link' && session.hrefKey ? hitTestLinkDropSlot(session.lastClientX, session.lastClientY, session.hrefKey) : hitTestColumnDropSlot(session.lastClientX, session.lastClientY)\n\n refreshFooterDragVisuals(session, initialSlot, session.lastClientX, session.lastClientY)\n },\n [refreshFooterDragVisuals]\n )\n beginFooterDragRef.current = beginFooterDrag\n\n const commitFooterDrag = useCallback(\n (clientX?: number, clientY?: number) => {\n const session = footerDragRef.current\n if (!session) {\n clearFooterDragVisuals()\n return\n }\n\n // Prefer tracked slot / last pointer — HTML5 dragend often reports clientX/Y as 0\n const x = typeof clientX === 'number' && (clientX !== 0 || clientY !== 0) ? clientX : session.lastClientX\n const y = typeof clientY === 'number' && (clientX !== 0 || clientY !== 0) ? clientY : session.lastClientY\n\n let nextOrder: string[][] | null = null\n const slot = session.activeSlot ?? (session.kind === 'link' && session.hrefKey ? hitTestLinkDropSlot(x, y, session.hrefKey) : session.kind === 'column' ? hitTestColumnDropSlot(x, y) : null)\n\n if (session.kind === 'link' && session.hrefKey && slot) {\n nextOrder = planFooterLinkMove(session.hrefKey, slot.columnIndex, slot.insertIndex)\n } else if (session.kind === 'column' && slot) {\n nextOrder = planFooterColumnMove(session.sourceColumnIndex, slot.insertIndex)\n }\n\n const wasSelected = session.wasSelected\n const draggedEl = session.draggedEl\n const hrefKey = session.hrefKey\n\n // applyFooterOrder moves links between column nodes rather than the column\n // nodes themselves, so track where the dragged column's content lands.\n let movedColumnIndex: number | null = null\n if (session.kind === 'column' && slot && nextOrder) {\n let adjusted = slot.insertIndex\n if (session.sourceColumnIndex < slot.insertIndex) adjusted -= 1\n movedColumnIndex = Math.max(0, Math.min(adjusted, nextOrder.length - 1))\n }\n\n const applySelectionAfterDrop = () => {\n // Keep selection only when the drag started on an already-selected item.\n if (!wasSelected) {\n deselectRef.current()\n return\n }\n\n // Prefer stable identity keys — React remounts footer markup by index after a\n // drop, so `draggedEl` / column shell index can point at the wrong item.\n if (hrefKey) {\n selectedHrefKeyRef.current = hrefKey\n selectedFooterColAttrRef.current = null\n const link = resolveHrefKeyElement(hrefKey)\n if (link && isNavigationItem(link)) {\n selectRef.current(link)\n return\n }\n }\n\n if (movedColumnIndex !== null && nextOrder) {\n const colKeys = nextOrder[movedColumnIndex] ?? []\n let column: HTMLElement | null = null\n for (const key of colKeys) {\n const link = document.querySelector<HTMLElement>(\n `footer [data-ohw-href-key=\"${CSS.escape(key)}\"]`\n )\n if (link) {\n column = findFooterColumnForLink(link)\n if (column) break\n }\n }\n if (!column) column = listFooterColumns()[movedColumnIndex] ?? null\n if (column && isNavigationContainer(column)) {\n selectFrameRef.current(column)\n return\n }\n }\n\n if (document.body.contains(draggedEl)) {\n if (isNavigationItem(draggedEl)) {\n selectRef.current(draggedEl)\n return\n }\n if (isNavigationContainer(draggedEl)) {\n selectFrameRef.current(draggedEl)\n return\n }\n }\n\n deselectRef.current()\n }\n\n if (nextOrder) {\n const orderJson = JSON.stringify(nextOrder)\n // Persist into edit content BEFORE mutating DOM so MutationObserver reconcile\n // cannot revert the move using a stale order.\n editContentRef.current = {\n ...editContentRef.current,\n [FOOTER_ORDER_KEY]: orderJson\n }\n applyFooterOrder(nextOrder)\n document.querySelectorAll<HTMLElement>('footer [data-ohw-href-key]').forEach(disableNativeHrefDrag)\n postToParentRef.current({\n type: 'ow:change',\n nodes: [{ key: FOOTER_ORDER_KEY, text: orderJson }]\n })\n // Update selection chrome BEFORE clearing isItemDragging. Otherwise toolbarRect\n // still points at the vacated slot — the item that shifted into the old position\n // (appears as \"active on the item before the dropped one\").\n applySelectionAfterDrop()\n clearFooterDragVisuals()\n // React may remount footer markup from static content — re-apply, then reselect.\n requestAnimationFrame(() => {\n if (editContentRef.current[FOOTER_ORDER_KEY] === orderJson) {\n applyFooterOrder(nextOrder)\n document.querySelectorAll<HTMLElement>('footer [data-ohw-href-key]').forEach(disableNativeHrefDrag)\n }\n applySelectionAfterDrop()\n // Second frame: catch React commit that recycles nodes by index.\n requestAnimationFrame(() => {\n if (editContentRef.current[FOOTER_ORDER_KEY] === orderJson) {\n applyFooterOrder(nextOrder)\n }\n resyncSelectedNavigationItem()\n })\n })\n return\n }\n\n applySelectionAfterDrop()\n clearFooterDragVisuals()\n },\n [clearFooterDragVisuals, resolveHrefKeyElement, resyncSelectedNavigationItem]\n )\n commitFooterDragRef.current = commitFooterDrag\n\n const startFooterLinkDrag = useCallback(\n (anchor: HTMLElement, clientX: number, clientY: number, wasSelected: boolean) => {\n const hrefKey = anchor.getAttribute('data-ohw-href-key')\n if (!hrefKey || !isFooterHrefKey(hrefKey)) return false\n const column = findFooterColumnForLink(anchor)\n const columns = listFooterColumns()\n beginFooterDrag({\n kind: 'link',\n hrefKey,\n columnEl: column,\n sourceColumnIndex: column ? columns.indexOf(column) : 0,\n wasSelected,\n draggedEl: anchor,\n lastClientX: clientX,\n lastClientY: clientY,\n activeSlot: null\n })\n return true\n },\n [beginFooterDrag]\n )\n\n const startFooterColumnDrag = useCallback(\n (columnEl: HTMLElement, clientX: number, clientY: number, wasSelected: boolean) => {\n const columns = listFooterColumns()\n const idx = columns.indexOf(columnEl)\n if (idx < 0) return false\n beginFooterDrag({\n kind: 'column',\n hrefKey: null,\n columnEl,\n sourceColumnIndex: idx,\n wasSelected,\n draggedEl: columnEl,\n lastClientX: clientX,\n lastClientY: clientY,\n activeSlot: null\n })\n return true\n },\n [beginFooterDrag]\n )\n\n const handleItemDragStart = useCallback(\n (e?: React.DragEvent) => {\n const selected = selectedElRef.current\n if (!selected) {\n setIsItemDragging(true)\n return\n }\n\n const clientX = e?.clientX ?? selected.getBoundingClientRect().left + 8\n const clientY = e?.clientY ?? selected.getBoundingClientRect().top + 8\n\n if (startFooterLinkDrag(selected, clientX, clientY, true)) return\n\n if (selected.hasAttribute('data-ohw-footer-col') || (isInferredFooterGroup(selected) && selected.closest('footer'))) {\n if (startFooterColumnDrag(selected, clientX, clientY, true)) return\n }\n\n if (startNavLinkDrag(selected, clientX, clientY, true)) return\n\n siblingHintElRef.current = null\n setSiblingHintRect(null)\n setIsItemDragging(true)\n },\n [startFooterColumnDrag, startFooterLinkDrag, startNavLinkDrag]\n )\n\n const handleItemDragEnd = useCallback(\n (e?: React.DragEvent) => {\n if (footerDragRef.current) {\n // dragend coordinates are unreliable in most browsers — omit so commit uses tracked slot\n const x = e?.clientX\n const y = e?.clientY\n if (typeof x === 'number' && typeof y === 'number' && (x !== 0 || y !== 0)) {\n commitFooterDrag(x, y)\n } else {\n commitFooterDrag()\n }\n return\n }\n if (navDragRef.current) {\n const x = e?.clientX\n const y = e?.clientY\n if (typeof x === 'number' && typeof y === 'number' && (x !== 0 || y !== 0)) {\n commitNavDrag(x, y)\n } else {\n commitNavDrag()\n }\n return\n }\n setIsItemDragging(false)\n },\n [commitFooterDrag, commitNavDrag, navDragRef]\n )\n\n const handleItemChromePointerDown = useCallback((e: React.PointerEvent) => {\n if (e.button !== 0) return\n const selected = selectedElRef.current\n if (!selected) return\n const hrefKey = selected.getAttribute('data-ohw-href-key')\n if (hrefKey && isFooterHrefKey(hrefKey)) {\n footerPointerDragRef.current = {\n el: selected,\n kind: 'link',\n startX: e.clientX,\n startY: e.clientY,\n pointerId: e.pointerId,\n wasSelected: true,\n started: false\n }\n return\n }\n if (selected.hasAttribute('data-ohw-footer-col') || (isInferredFooterGroup(selected) && selected.closest('footer'))) {\n footerPointerDragRef.current = {\n el: selected,\n kind: 'column',\n startX: e.clientX,\n startY: e.clientY,\n pointerId: e.pointerId,\n wasSelected: true,\n started: false\n }\n return\n }\n if (armNavPressFromChrome(selected, e.clientX, e.clientY, e.pointerId)) return\n }, [armNavPressFromChrome])\n\n const handleItemChromeClick = useCallback((clientX: number, clientY: number) => {\n // Real press-drag already ran — swallow the trailing click.\n if (suppressNextClickRef.current || Date.now() < suppressClickUntilRef.current) {\n suppressNextClickRef.current = false\n return\n }\n const selected = selectedElRef.current\n if (!selected || !isNavigationItem(selected)) return\n const editable = selected.querySelector<HTMLElement>('[data-ohw-editable=\"text\"]') ?? selected.querySelector<HTMLElement>('[data-ohw-editable]')\n if (!editable) return\n activateRef.current(editable, { caretX: clientX, caretY: clientY })\n }, [])\n\n reselectNavigationItemRef.current = reselectNavigationItem\n commitNavigationTextEditRef.current = commitNavigationTextEdit\n\n const select = useCallback((anchor: HTMLElement) => {\n if (!isNavigationItem(anchor)) return\n if (activeElRef.current) deactivate()\n selectedElRef.current = anchor\n selectedHrefKeyRef.current = anchor.getAttribute('data-ohw-href-key')\n selectedFooterColAttrRef.current = null\n markSelected(anchor)\n setSelectedIsCta(isNavbarButton(anchor))\n clearHrefKeyHover(anchor)\n // Parent stays Default — no frame/column hover chrome while an item is Active.\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n setHoveredItemRect(null)\n hoveredItemElRef.current = null\n siblingHintElRef.current = null\n setSiblingHintRect(null)\n setSiblingHintRects(collectNavigationItemSiblingHintRects(anchor))\n setIsItemDragging(false)\n const { key, disabled } = getNavigationItemReorderState(anchor)\n setReorderHrefKey(key)\n setReorderDragDisabled(disabled)\n setIsFooterFrameSelection(false)\n setToolbarVariant('link-action')\n setToolbarRect(anchor.getBoundingClientRect())\n setToolbarShowEditLink(false)\n setActiveCommands(new Set())\n }, [deactivate, markSelected])\n\n const selectFrame = useCallback((el: HTMLElement) => {\n if (!isNavigationContainer(el)) return\n if (activeElRef.current) deactivate()\n const isFooterColumn =\n !isFooterLinksContainer(el) &&\n (el.hasAttribute('data-ohw-footer-col') ||\n Boolean(el.closest('footer') && isInferredFooterGroup(el)))\n selectedElRef.current = el\n selectedHrefKeyRef.current = null\n selectedFooterColAttrRef.current = isFooterColumn\n ? (el.getAttribute('data-ohw-footer-col') ?? String(listFooterColumns().indexOf(el)))\n : null\n markSelected(el)\n setSelectedIsCta(false)\n clearHrefKeyHover(el)\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n setHoveredItemRect(null)\n hoveredItemElRef.current = null\n siblingHintElRef.current = null\n setSiblingHintRect(null)\n setSiblingHintRects(\n isFooterColumn\n ? listFooterColumns()\n .filter((column) => column !== el)\n .map((column) => column.getBoundingClientRect())\n : []\n )\n setIsItemDragging(false)\n setReorderHrefKey(null)\n setReorderDragDisabled(false)\n setIsFooterFrameSelection(isFooterColumn)\n setToolbarVariant('select-frame')\n setToolbarRect(el.getBoundingClientRect())\n setToolbarShowEditLink(false)\n setActiveCommands(new Set())\n }, [deactivate, markSelected])\n\n const activate = useCallback((el: HTMLElement, options?: ActivateOptions) => {\n if (activeElRef.current === el) return\n clearSelectedAttr()\n selectedElRef.current = null\n selectedHrefKeyRef.current = null\n selectedFooterColAttrRef.current = null\n setSelectedIsCta(false)\n deactivate()\n // Clear any image overlay so it doesn't block interaction with other text elements.\n if (hoveredImageRef.current) {\n hoveredImageRef.current = null\n setMediaHover(null)\n }\n setToolbarVariant('rich-text')\n siblingHintElRef.current = null\n setSiblingHintRect(null)\n setSiblingHintRects([])\n setIsItemDragging(false)\n // A drag-select gesture on plain (not-yet-active) text produces a real selection before\n // this runs. Chrome clobbers/collapses it when the host is freshly made contenteditable\n // and focused below — capture it now so it can be restored afterward.\n const preActivationSelection = window.getSelection()\n const preservedRange =\n preActivationSelection &&\n preActivationSelection.rangeCount > 0 &&\n !preActivationSelection.isCollapsed &&\n el.contains(preActivationSelection.getRangeAt(0).commonAncestorContainer)\n ? preActivationSelection.getRangeAt(0).cloneRange()\n : null\n el.setAttribute('contenteditable', 'true')\n el.setAttribute('data-ohw-editing', '')\n el.removeAttribute('data-ohw-hovered')\n el.closest<HTMLElement>('[data-ohw-href-key]')?.removeAttribute('data-ohw-hovered')\n activeElRef.current = el\n originalContentRef.current = el.innerHTML\n el.focus({ preventScroll: true })\n if (preservedRange) {\n const selection = window.getSelection()\n selection?.removeAllRanges()\n selection?.addRange(preservedRange)\n } else if (options?.caretX !== undefined && options?.caretY !== undefined) {\n const { caretX, caretY } = options\n placeCaretAtPoint(el, caretX, caretY)\n // Some browsers clobber the selection during/after focus — re-apply once layout settles.\n requestAnimationFrame(() => {\n if (activeElRef.current === el) placeCaretAtPoint(el, caretX, caretY)\n })\n } else {\n // Ensure a blinking caret is visible even when activation had no click point.\n const selection = window.getSelection()\n if (selection && selection.rangeCount === 0) {\n const range = document.createRange()\n range.selectNodeContents(el)\n range.collapse(false)\n selection.removeAllRanges()\n selection.addRange(range)\n }\n }\n setToolbarShowEditLink(Boolean(getHrefKeyFromElement(el)))\n\n const navAnchor = getNavigationItemAnchor(el)\n if (navAnchor) {\n setReorderHrefKey(null)\n setReorderDragDisabled(false)\n } else {\n const { key: reorderKey, disabled: reorderDisabled } = getReorderHandleState(el)\n setReorderHrefKey(reorderKey)\n setReorderDragDisabled(reorderDisabled)\n }\n\n setToolbarRect(getEditMeasureEl(el).getBoundingClientRect())\n postToParent({ type: 'ow:enter-edit', key: el.dataset.ohwKey })\n // selectionchange timing varies by browser — refresh after the frame to guarantee\n // active toolbar commands reflect the cursor state on the very first click.\n requestAnimationFrame(() => refreshActiveCommandsRef.current())\n }, [clearSelectedAttr, deactivate, postToParent])\n\n activateRef.current = activate\n deactivateRef.current = deactivate\n selectRef.current = select\n selectFrameRef.current = selectFrame\n deselectRef.current = deselect\n\n // Fetch saved content once per subdomain (cached in module-level Map so remounts are free).\n // In edit mode, hydration comes from the canvas editor via ow:hydrate — skip the public fetch.\n useLayoutEffect(() => {\n if (!subdomain || isEditMode) {\n setFetchState('done')\n return\n }\n\n const applyContent = (content: Record<string, string>): Promise<void> => {\n const imageLoads: Promise<void>[] = []\n\n for (const [key, val] of Object.entries(content)) {\n if (key === '__ohw_sections') continue\n if (applyVideoSettingNode(key, val)) continue\n if (applyCarouselNode(key, val)) continue\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${key}\"]`).forEach((el) => {\n if (el.dataset.ohwEditable === 'image') {\n const img = el instanceof HTMLImageElement ? el : el.querySelector<HTMLImageElement>('img')\n if (img && img.src !== val) {\n applyEditableImageSrc(img, val)\n imageLoads.push(new Promise<void>((resolve) => {\n img.onload = () => resolve()\n img.onerror = () => resolve()\n }))\n }\n } else if (el.dataset.ohwEditable === 'bg-image') {\n const next = `url('${val}')`\n if (el.style.backgroundImage !== next) el.style.backgroundImage = next\n } else if (el.dataset.ohwEditable === 'video') {\n // Guard on src so re-hydrating doesn't restart playback from frame 0.\n const video = getVideoEl(el)\n if (video && video.src !== val) {\n applyVideoSrc(video, val)\n imageLoads.push(new Promise<void>((resolve) => {\n video.onloadeddata = () => resolve()\n video.onerror = () => resolve()\n }))\n }\n } else if (el.dataset.ohwEditable === 'link') {\n applyLinkHref(el, val)\n } else if (el.innerHTML !== val) {\n el.innerHTML = val\n }\n })\n applyLinkByKey(key, val)\n }\n\n // TopNav only SSR-renders globalContent.nav — inject editor-added items from saved content.\n reconcileNavbarItemsFromContent(content)\n reconcileFooterOrderFromContent(content)\n enforceLinkHrefs()\n\n // Mount scheduling widgets after page content is applied so anchors exist in the DOM.\n initSectionsFromContent(content, true)\n sectionsLoadedRef.current = true\n pendingScheduleConfigRequests.current.splice(0).forEach(processConfigRequest)\n\n return imageLoads.length > 0 ? Promise.all(imageLoads).then(() => {}) : Promise.resolve()\n }\n\n const cached = contentCache.get(subdomain)\n if (cached) {\n applyContent(cached).finally(() => setFetchState('done'))\n return\n }\n\n let cancelled = false\n setFetchState('loading')\n const apiUrl = process.env.NEXT_PUBLIC_FLOWOPS_API_URL ?? 'https://flowops-backend-staging-2yfdh7pwpq-as.a.run.app'\n fetch(`${apiUrl}/api/public/sites/${subdomain}/content`, { cache: 'no-store' })\n .then((r) => (r.ok ? r.json() : null))\n .then((data) => {\n if (cancelled) return\n const content = (data?.content as Record<string, string>) ?? {}\n contentCache.set(subdomain, content)\n return applyContent(content)\n })\n .catch(() => {})\n .finally(() => {\n if (!cancelled) setFetchState('done')\n })\n\n return () => { cancelled = true }\n // pathname intentionally excluded — this effect should only run on true mount\n // (hard refresh / first visit) or subdomain change, and fetches once per subdomain\n // via the module-level contentCache. Re-applying content to newly navigated pages is\n // handled by the MutationObserver effect below; re-running this effect on every\n // client-side navigation was needlessly cycling fetchState and flashing the loader.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [subdomain, isEditMode])\n\n // Re-apply cached content whenever new DOM nodes appear (handles Next.js page navigation\n // where page elements commit after the fetch effect already ran).\n useEffect(() => {\n if (!subdomain || isEditMode) return\n\n let debounceTimer: ReturnType<typeof setTimeout> | null = null\n let observer: MutationObserver | null = null\n const applyFromCache = () => {\n const content = contentCache.get(subdomain)\n if (!content) return\n\n retryMissingSchedulingMounts(getPageSchedulingEntries(content['__ohw_sections']), false)\n\n // Disconnect while we mutate — el.innerHTML/src writes are themselves DOM\n // mutations, and re-applying the same value can fail to round-trip byte-for-byte\n // (entity encoding, hydration comment markers, attribute quoting, etc.), which would\n // otherwise re-trigger this observer forever.\n observer?.disconnect()\n try {\n for (const [key, val] of Object.entries(content)) {\n if (key === '__ohw_sections') continue\n if (applyVideoSettingNode(key, val)) continue\n if (applyCarouselNode(key, val)) continue\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${key}\"]`).forEach((el) => {\n if (el.dataset.ohwEditable === 'image') {\n const img = el instanceof HTMLImageElement ? el : el.querySelector<HTMLImageElement>('img')\n if (img && img.src !== val) applyEditableImageSrc(img, val)\n } else if (el.dataset.ohwEditable === 'bg-image') {\n const next = `url('${val}')`\n if (el.style.backgroundImage !== next) el.style.backgroundImage = next\n } else if (el.dataset.ohwEditable === 'video') {\n const video = getVideoEl(el)\n if (video && video.src !== val) applyVideoSrc(video, val)\n } else if (el.dataset.ohwEditable === 'link') {\n applyLinkHref(el, val)\n } else if (el.innerHTML !== val) {\n el.innerHTML = val\n }\n })\n applyLinkByKey(key, val)\n }\n reconcileNavbarItemsFromContent(content)\n reconcileFooterOrderFromContent(content)\n } finally {\n observer?.observe(document.body, { childList: true, subtree: true })\n }\n enforceLinkHrefs()\n }\n\n const scheduleApply = () => {\n if (debounceTimer) clearTimeout(debounceTimer)\n debounceTimer = setTimeout(applyFromCache, 150)\n }\n\n // Apply immediately on navigation — the cache read is synchronous, so there's no\n // reason to wait out the debounce here. The debounce is only for the observer\n // catching nodes that mount slightly after this effect runs.\n applyFromCache()\n observer = new MutationObserver(scheduleApply)\n observer.observe(document.body, { childList: true, subtree: true })\n return () => {\n observer?.disconnect()\n if (debounceTimer) clearTimeout(debounceTimer)\n }\n }, [subdomain, isEditMode, pathname])\n\n // Toggle the layout loader (React-owned DOM — never remove it imperatively)\n useLayoutEffect(() => {\n const el = document.getElementById('ohw-loader')\n if (!el) return\n const visible = Boolean(subdomain) && fetchState !== 'done'\n el.style.display = visible ? 'flex' : 'none'\n }, [subdomain, fetchState])\n\n // Navigation sync — always active when embedded\n useEffect(() => {\n postToParent({ type: 'ow:navigation', path: pathname })\n }, [pathname, postToParent])\n\n // Close link modal when the template page changes — except during add-nav / section picker flows.\n useEffect(() => {\n if (!isEditMode) return\n if (linkPopoverSessionRef.current?.intent === 'add-nav') return\n if (document.querySelector('[data-ohw-section-picker]')) return\n setLinkPopover(null)\n deselectRef.current()\n deactivateRef.current()\n }, [pathname, isEditMode])\n\n // Re-inject navbar / footer order after React re-renders layout; sync grab cursors.\n useEffect(() => {\n const contentForNav = () => {\n if (isEditMode) return editContentRef.current\n if (!subdomain) return {}\n return contentCache.get(subdomain) ?? {}\n }\n\n const observeRoots = () =>\n [document.querySelector('nav'), document.querySelector('footer')].filter(\n (el): el is HTMLElement => Boolean(el)\n )\n\n const roots = observeRoots()\n if (roots.length === 0) {\n reconcileNavbarItemsFromContent(contentForNav())\n reconcileFooterOrderFromContent(contentForNav())\n if (isEditMode) syncNavigationDragCursorAttrs()\n return\n }\n\n let rafId: number | null = null\n let applying = false\n let observer: MutationObserver | null = null\n\n const attach = () => {\n for (const root of observeRoots()) {\n observer?.observe(root, { childList: true, subtree: true })\n }\n }\n\n const run = () => {\n if (footerDragRef.current || navDragRef.current || applying) return\n applying = true\n observer?.disconnect()\n try {\n const content = contentForNav()\n reconcileNavbarItemsFromContent(content)\n reconcileFooterOrderFromContent(content)\n // Keep footer / nav links non-draggable so native <a> drag doesn't steal clicks.\n document.querySelectorAll<HTMLElement>('footer [data-ohw-href-key]').forEach((el) => {\n if (isFooterHrefKey(el.getAttribute('data-ohw-href-key'))) {\n disableNativeHrefDrag(el)\n }\n })\n document\n .querySelectorAll<HTMLElement>(\n 'nav [data-ohw-href-key], [data-ohw-nav-container] [data-ohw-href-key], [data-ohw-nav-drawer] [data-ohw-href-key]'\n )\n .forEach((el) => {\n if (isNavbarHrefKey(el.getAttribute('data-ohw-href-key'))) {\n disableNativeHrefDrag(el)\n }\n })\n // React remounts recycle nodes by index — rebind selection to the live href-key node.\n resyncSelectedNavigationItem()\n if (isEditMode) syncNavigationDragCursorAttrs()\n } finally {\n applying = false\n // Re-attach after our own DOM writes so React TopNav/Footer resets still re-trigger.\n attach()\n }\n }\n\n const schedule = () => {\n if (applying || rafId != null) return\n rafId = requestAnimationFrame(() => {\n rafId = null\n run()\n })\n }\n\n observer = new MutationObserver(schedule)\n run()\n return () => {\n if (rafId != null) cancelAnimationFrame(rafId)\n observer?.disconnect()\n }\n }, [isEditMode, pathname, subdomain, fetchState, resyncSelectedNavigationItem])\n\n // Report full document height so the parent can size the iframe to content (edit mode only).\n // Uses document.body.scrollHeight — more reliable than documentElement when html has overflow quirks.\n // Listens for WIDTH changes only (desktop↔mobile switch re-lays out content at a different height).\n // Height-only resize events (parent setting iframeHeight) are intentionally ignored to prevent loops.\n useEffect(() => {\n if (!isEditMode) return\n\n const measure = () => {\n const h = document.body.scrollHeight\n if (h > 50) postToParent({ type: 'ow:height', height: h })\n }\n\n const t1 = setTimeout(measure, 50)\n const t2 = setTimeout(measure, 500)\n\n let lastWidth = window.innerWidth\n let resizeTimer: ReturnType<typeof setTimeout> | null = null\n const handleResize = () => {\n if (window.innerWidth === lastWidth) return\n lastWidth = window.innerWidth\n if (resizeTimer) clearTimeout(resizeTimer)\n resizeTimer = setTimeout(measure, 150)\n }\n window.addEventListener('resize', handleResize)\n\n return () => {\n clearTimeout(t1)\n clearTimeout(t2)\n if (resizeTimer) clearTimeout(resizeTimer)\n window.removeEventListener('resize', handleResize)\n }\n }, [pathname, isEditMode, postToParent])\n\n // Preserve ?subdomain on internal navigation when using query-param mode (not hostname mode)\n useEffect(() => {\n if (!subdomainFromQuery || isEditMode) return\n\n const handleClick = (e: MouseEvent) => {\n const anchor = (e.target as HTMLElement).closest<HTMLAnchorElement>('a')\n if (!anchor || anchor.target === '_blank' || e.defaultPrevented) return\n\n const href = anchor.getAttribute('href')\n if (!href || /^(https?:|mailto:|tel:|#)/.test(href)) return\n\n const url = new URL(href, window.location.origin)\n if (url.searchParams.has('subdomain')) return\n\n e.preventDefault()\n url.searchParams.set('subdomain', subdomainFromQuery)\n router.push(url.pathname + url.search)\n }\n\n document.addEventListener('click', handleClick, true)\n return () => document.removeEventListener('click', handleClick, true)\n }, [subdomainFromQuery, isEditMode, router])\n\n // Edit mode bridge — listeners stay mounted; only tear down when leaving edit mode\n useEffect(() => {\n if (!isEditMode) {\n editStylesRef.current?.base.remove()\n editStylesRef.current?.forceHover.remove()\n editStylesRef.current?.stateViews.remove()\n editStylesRef.current = null\n document.querySelectorAll<HTMLElement>('[data-ohw-can-drag]').forEach((el) => {\n el.removeAttribute('data-ohw-can-drag')\n })\n return\n }\n\n const existing = editStylesRef.current\n let initialVh = window.innerHeight\n if (existing?.base.textContent) {\n const match = existing.base.textContent.match(/\\.min-h-screen[^{]*\\{[^}]*min-height:\\s*(\\d+)px/)\n if (match) initialVh = parseInt(match[1]!, 10)\n }\n\n const baseCss = `\n html { height: auto !important; }\n body { height: auto !important; min-height: 0 !important; overflow: hidden !important; }\n .min-h-screen, .min-h-svh, .min-h-dvh { min-height: ${initialVh}px !important; }\n .h-screen, .h-svh, .h-dvh { height: ${initialVh}px !important; }\n [style*=\"100vh\"] { min-height: ${initialVh}px !important; height: ${initialVh}px !important; }\n [style*=\"100svh\"] { min-height: ${initialVh}px !important; height: ${initialVh}px !important; }\n [style*=\"100dvh\"] { min-height: ${initialVh}px !important; height: ${initialVh}px !important; }\n [data-ohw-editable] {\n display: block;\n }\n /* Body text (no item-action toolbar) — first click enters text edit → I-beam.\n Exclude select-first nav/footer labels so grab/default on [data-ohw-href-key] can win. */\n [data-ohw-editable]:not([contenteditable]):not([data-ohw-editable=\"image\"]):not([data-ohw-editable=\"bg-image\"]):not([data-ohw-editable=\"video\"]):not([data-ohw-editable=\"link\"]):not(:is([data-ohw-href-key] *)) {\n cursor: text !important;\n }\n /* Select-first items: default arrow; grab only when drag-start is allowed (data-ohw-can-drag). */\n [data-ohw-href-key]:not([data-ohw-selected]),\n [data-ohw-href-key]:not([data-ohw-selected]) * {\n cursor: default !important;\n }\n [data-ohw-href-key][data-ohw-can-drag]:not([data-ohw-selected]),\n [data-ohw-href-key][data-ohw-can-drag]:not([data-ohw-selected]) * {\n cursor: grab !important;\n }\n /* Selected (action-toolbar) — next click enters text edit at caret. */\n [data-ohw-href-key][data-ohw-selected],\n [data-ohw-href-key][data-ohw-selected] * {\n cursor: text !important;\n }\n [data-ohw-editable=\"image\"], [data-ohw-editable=\"image\"] *,\n [data-ohw-editable=\"video\"], [data-ohw-editable=\"video\"] *,\n [data-ohw-editable=\"bg-image\"], [data-ohw-editable=\"bg-image\"] * { cursor: pointer !important; }\n [data-ohw-editable=\"link\"], [data-ohw-editable=\"link\"] * { cursor: pointer !important; }\n [data-ohw-hovered]:not([contenteditable]):not([data-ohw-href-key]) {\n outline: 2px dashed ${PRIMARY} !important;\n outline-offset: 4px;\n }\n [data-ohw-href-key] [data-ohw-hovered],\n [data-ohw-href-key][data-ohw-hovered],\n nav [data-ohw-href-key] [data-ohw-hovered],\n footer [data-ohw-href-key] [data-ohw-hovered] {\n outline: none !important;\n outline-offset: 0 !important;\n }\n /* Editor chrome owns selection — suppress native focus rings on nav/footer items. */\n nav [data-ohw-href-key]:focus,\n nav [data-ohw-href-key]:focus-visible,\n nav [data-ohw-href-key]:focus-within,\n footer [data-ohw-href-key]:focus,\n footer [data-ohw-href-key]:focus-visible,\n footer [data-ohw-href-key]:focus-within,\n nav [data-ohw-href-key] [data-ohw-editable]:focus,\n nav [data-ohw-href-key] [data-ohw-editable]:focus-visible,\n footer [data-ohw-href-key] [data-ohw-editable]:focus,\n footer [data-ohw-href-key] [data-ohw-editable]:focus-visible {\n outline: none !important;\n outline-offset: 0 !important;\n box-shadow: none !important;\n }\n /* Text edit wins over grab/default (must beat [data-ohw-can-drag] *). */\n [data-ohw-editing],\n [data-ohw-editing] *,\n [data-ohw-editable][contenteditable],\n [data-ohw-editable][contenteditable] *,\n nav [data-ohw-href-key] [data-ohw-editable][contenteditable],\n nav [data-ohw-href-key] [data-ohw-editable][contenteditable] *,\n footer [data-ohw-href-key] [data-ohw-editable][contenteditable],\n footer [data-ohw-href-key] [data-ohw-editable][contenteditable] * {\n outline: none !important;\n caret-color: ${PRIMARY} !important;\n cursor: text !important;\n }\n [data-ohw-editable][contenteditable]::selection,\n [data-ohw-editable][contenteditable] *::selection { background: ${PRIMARY}59 !important; }\n [data-ohw-editable-state], [data-ohw-editable-state] * { pointer-events: none !important; }\n [data-ohw-editable-state][data-ohw-active-state] [data-ohw-editable] { pointer-events: auto !important; }\n [data-ohw-editable-state][data-ohw-active-state][data-ohw-editable] { pointer-events: auto !important; }\n `\n\n if (!existing) {\n // Capture the initial iframe viewport height before the parent adjusts it.\n // Freezing min-h-screen / h-screen to this px value lets hero sections keep their\n // full-viewport design while preventing the 100vh feedback loop when the iframe grows.\n const base = document.createElement('style')\n base.setAttribute('data-ohw-edit-style', '')\n const forceHover = document.createElement('style')\n forceHover.setAttribute('data-ohw-active-state-style', '')\n const stateViews = document.createElement('style')\n stateViews.setAttribute('data-ohw-state-views-style', '')\n stateViews.textContent = `\n [data-ohw-state-view]:not([data-ohw-state-view=\"default\"]) { display: none; }\n [data-ohw-state-view=\"default\"] [data-ohw-editable] { pointer-events: auto !important; }\n [data-ohw-state-hovered] { outline: 2px dashed ${PRIMARY} !important; outline-offset: 4px; }\n [data-ohw-state-hovered]:has([data-ohw-hovered]) { outline: none !important; }\n `\n document.head.appendChild(base)\n document.head.appendChild(forceHover)\n document.head.appendChild(stateViews)\n editStylesRef.current = { base, forceHover, stateViews }\n }\n editStylesRef.current!.base.textContent = baseCss\n\n syncNavigationDragCursorAttrs()\n\n refreshStateRules()\n\n const handleClick = (e: MouseEvent) => {\n if (suppressNextClickRef.current || Date.now() < suppressClickUntilRef.current) {\n suppressNextClickRef.current = false\n e.preventDefault()\n e.stopPropagation()\n return\n }\n const target = e.target as HTMLElement\n if (target.closest('[data-ohw-toolbar]')) return\n if (target.closest('[data-ohw-state-toggle]')) return\n if (target.closest('[data-ohw-max-badge]')) return\n if (isInsideLinkEditor(target)) return\n if (target.closest('[data-ohw-edit-chrome], [data-ohw-item-interaction], [data-ohw-drag-handle-container], [data-slot=\"drag-handle\"]')) {\n // Item chrome drag surface: click without drag enters text edit\n if (target.closest('[data-ohw-item-drag-surface]')) {\n e.preventDefault()\n e.stopPropagation()\n const selected = selectedElRef.current\n if (selected && isNavigationItem(selected)) {\n const editable = selected.querySelector<HTMLElement>('[data-ohw-editable=\"text\"]') ?? selected.querySelector<HTMLElement>('[data-ohw-editable]')\n if (editable) {\n activateRef.current(editable, {\n caretX: e.clientX,\n caretY: e.clientY\n })\n }\n } else if (selected?.hasAttribute('data-ohw-footer-col')) {\n // Selected column chrome covers its links — route the click to the link under it\n const link = listFooterLinksInColumn(selected).find(el => {\n const r = el.getBoundingClientRect()\n return e.clientX >= r.left && e.clientX <= r.right && e.clientY >= r.top && e.clientY <= r.bottom\n })\n if (link) selectRef.current(link)\n }\n return\n }\n const navFromChrome = resolveNavContainerSelectionTarget(target, e.clientX, e.clientY)\n if (navFromChrome) {\n e.preventDefault()\n e.stopPropagation()\n selectFrameRef.current(navFromChrome)\n return\n }\n const footerFromChrome = resolveFooterColumnSelectionTarget(target, e.clientX, e.clientY)\n if (footerFromChrome) {\n e.preventDefault()\n e.stopPropagation()\n selectFrameRef.current(footerFromChrome)\n return\n }\n e.preventDefault()\n e.stopPropagation()\n return\n }\n\n // Clicks inside the active editable reposition the caret / select text — do not exit edit.\n // Must preventDefault: nav items are <a href>, and without it the browser navigates.\n if (activeElRef.current) {\n const active = activeElRef.current\n const inActive = active === target || active.contains(target)\n const navAnchor = getNavigationItemAnchor(active)\n const inActiveNav = Boolean(\n navAnchor && (navAnchor === target || navAnchor.contains(target))\n )\n if (inActive || inActiveNav) {\n e.preventDefault()\n e.stopPropagation()\n // Single click: place caret (default was blocked). Multi-click: dblclick handler /\n // native selection expand — don't override. A drag-select gesture also ends in a\n // click here (mousedown/mouseup on the same target) — don't collapse that selection.\n const selection = window.getSelection()\n const hasRangeSelection = Boolean(selection && !selection.isCollapsed)\n if (e.detail < 2 && !hasRangeSelection) {\n placeCaretAtPoint(active, e.clientX, e.clientY)\n refreshActiveCommandsRef.current()\n }\n return\n }\n }\n\n const editable = target.closest<HTMLElement>('[data-ohw-editable]')\n if (editable) {\n if (editable.dataset.ohwEditable === 'link') {\n e.preventDefault()\n e.stopPropagation()\n deselectRef.current()\n deactivateRef.current()\n bumpLinkPopoverGrace()\n setLinkPopoverRef.current({\n key: editable.dataset.ohwKey ?? '',\n mode: 'edit',\n target: getLinkHref(editable),\n })\n return\n }\n if (isMediaEditable(editable)) {\n e.preventDefault()\n e.stopPropagation()\n postToParentRef.current({ type: 'ow:image-pick', key: editable.dataset.ohwKey ?? '', elementType: editable.dataset.ohwEditable ?? 'image' })\n return\n }\n\n const hrefCtx = getHrefKeyFromElement(editable)\n const navAnchor = hrefCtx ? getNavigationItemAnchor(hrefCtx.anchor) : null\n if (navAnchor) {\n e.preventDefault()\n e.stopPropagation()\n if (selectedElRef.current === navAnchor) {\n // Second+ click of a double/triple-click — handled by dblclick (select all text).\n if (e.detail >= 2) return\n activateRef.current(editable, { caretX: e.clientX, caretY: e.clientY })\n return\n }\n selectRef.current(navAnchor)\n return\n }\n\n e.preventDefault()\n e.stopPropagation()\n activateRef.current(editable, { caretX: e.clientX, caretY: e.clientY })\n return\n }\n\n const hrefAnchor = getNavigationItemAnchor(target)\n if (hrefAnchor) {\n e.preventDefault()\n e.stopPropagation()\n if (selectedElRef.current === hrefAnchor) {\n const textEditable = hrefAnchor.querySelector<HTMLElement>('[data-ohw-editable=\"text\"]') ?? hrefAnchor.querySelector<HTMLElement>('[data-ohw-editable]')\n if (textEditable) {\n activateRef.current(textEditable, {\n caretX: e.clientX,\n caretY: e.clientY\n })\n }\n return\n }\n selectRef.current(hrefAnchor)\n return\n }\n\n // Footer column: click on empty column area (gap between links) selects the column frame\n const footerColClick = target.closest<HTMLElement>('[data-ohw-footer-col]')\n if (footerColClick) {\n e.preventDefault()\n e.stopPropagation()\n selectFrameRef.current(footerColClick)\n return\n }\n\n // Footer links block (rb-footer-links): gap between columns selects the whole block.\n const footerLinksToSelect = resolveFooterLinksContainerSelectionTarget(\n target,\n e.clientX,\n e.clientY,\n isPointOverNavItem\n )\n if (footerLinksToSelect) {\n e.preventDefault()\n e.stopPropagation()\n selectFrameRef.current(footerLinksToSelect)\n return\n }\n\n // Select the links row container: gap clicks, empty padding in the flex row,\n // or empty space on the nav root (outside logo / book CTA).\n const navContainerToSelect = resolveNavContainerSelectionTarget(target, e.clientX, e.clientY)\n if (navContainerToSelect) {\n e.preventDefault()\n e.stopPropagation()\n selectFrameRef.current(navContainerToSelect)\n return\n }\n\n const footerColumnToSelect = resolveFooterColumnSelectionTarget(target, e.clientX, e.clientY)\n if (footerColumnToSelect) {\n e.preventDefault()\n e.stopPropagation()\n selectFrameRef.current(footerColumnToSelect)\n return\n }\n\n const selectedContainer = selectedElRef.current\n if (selectedContainer && isNavigationContainer(selectedContainer)) {\n const navItem = getNavigationItemAnchor(target)\n if (!navItem && (selectedContainer === target || selectedContainer.contains(target))) {\n e.preventDefault()\n e.stopPropagation()\n return\n }\n }\n\n // Don't deactivate if user drag-selected text from inside the editable to outside\n if (activeElRef.current) {\n const sel = window.getSelection()\n if (sel && !sel.isCollapsed) {\n const range = sel.getRangeAt(0)\n if (activeElRef.current.contains(range.commonAncestorContainer)) return\n }\n }\n\n const anchor = target.closest('a')\n if (anchor) e.preventDefault()\n\n if (Date.now() < linkPopoverGraceUntilRef.current) return\n\n if (linkPopoverOpenRef.current && activeElRef.current) {\n const hrefCtx = getHrefKeyFromElement(activeElRef.current)\n if (hrefCtx && (hrefCtx.anchor === target || hrefCtx.anchor.contains(target))) return\n }\n\n if (linkPopoverOpenRef.current && selectedElRef.current) {\n const selected = selectedElRef.current\n if (selected === target || selected.contains(target)) return\n }\n\n if (linkPopoverOpenRef.current) {\n setLinkPopoverRef.current(null)\n return\n }\n\n deselectRef.current()\n deactivateRef.current()\n }\n\n const handleDblClick = (e: MouseEvent) => {\n const target = e.target as HTMLElement\n if (target.closest('[data-ohw-toolbar]')) return\n if (target.closest('[data-ohw-state-toggle]')) return\n if (target.closest('[data-ohw-max-badge]')) return\n if (isInsideLinkEditor(target)) return\n if (target.closest('[data-ohw-edit-chrome], [data-ohw-item-interaction], [data-ohw-drag-handle-container], [data-slot=\"drag-handle\"]')) {\n return\n }\n\n const navLabel = getNavigationLabelEditable(target)\n const editable =\n navLabel?.editable ??\n target.closest<HTMLElement>('[data-ohw-editable=\"text\"], [data-ohw-editable=\"plain\"]')\n if (!editable || isMediaEditable(editable) || editable.dataset.ohwEditable === 'link') return\n\n e.preventDefault()\n e.stopPropagation()\n\n if (activeElRef.current !== editable) {\n activateRef.current(editable)\n }\n\n requestAnimationFrame(() => {\n selectAllTextInEditable(editable)\n refreshActiveCommandsRef.current()\n })\n }\n\n const handleMouseOver = (e: MouseEvent) => {\n if (document.documentElement.hasAttribute('data-ohw-section-picking')) return\n\n const target = e.target as HTMLElement\n\n // Don't paint hover chrome over / under an open link modal.\n if (linkPopoverOpenRef.current) {\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n return\n }\n\n // Navbar / footer-links empty padding hover.\n // Navbar: suppress while any frame is selected.\n // Footer-links: still show while a *column* is selected (parent hover), but not when\n // the footer-links block itself is the selected frame.\n {\n const selected = selectedElRef.current\n const selectedIsFooterColumn =\n Boolean(selected) &&\n !isFooterLinksContainer(selected!) &&\n (selected!.hasAttribute('data-ohw-footer-col') ||\n selected!.hasAttribute('data-ohw-footer-column') ||\n Boolean(selected!.closest('footer') && isInferredFooterGroup(selected!)))\n const allowNavContainerHover = toolbarVariantRef.current !== 'select-frame'\n const allowFooterLinksHover =\n toolbarVariantRef.current !== 'select-frame' || selectedIsFooterColumn\n\n if (allowNavContainerHover) {\n const navContainer = target.closest<HTMLElement>('[data-ohw-nav-container]')\n if (navContainer && !getNavigationItemAnchor(target)) {\n hoveredNavContainerRef.current = navContainer\n setHoveredNavContainerRect(navContainer.getBoundingClientRect())\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n return\n }\n }\n\n if (allowFooterLinksHover) {\n const navContainer = target.closest<HTMLElement>('[data-ohw-nav-container]')\n if (!navContainer) {\n const footerLinks =\n target.closest<HTMLElement>('[data-ohw-footer-links], .rb-footer-links') ?? null\n if (\n footerLinks &&\n selected !== footerLinks &&\n !getNavigationItemAnchor(target) &&\n !target.closest('[data-ohw-footer-col], [data-ohw-footer-column]')\n ) {\n hoveredNavContainerRef.current = footerLinks\n setHoveredNavContainerRect(footerLinks.getBoundingClientRect())\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n return\n }\n if (!footerLinks) {\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n }\n }\n } else if (toolbarVariantRef.current === 'select-frame') {\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n }\n }\n\n // Prefer the link item — never paint column hover while the pointer is over a footer/nav link.\n const navAnchor = getNavigationItemAnchor(target)\n if (navAnchor) {\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n const selected = selectedElRef.current\n // Only skip the selected *item* itself — a selected parent column must not\n // suppress hover chrome on its child links.\n if (selected === navAnchor) return\n clearHrefKeyHover(navAnchor)\n hoveredItemElRef.current = navAnchor\n setHoveredItemRect(navAnchor.getBoundingClientRect())\n return\n }\n\n // Footer column chrome in empty column space (gaps / padding).\n // Allowed even while a child item is Active — dashed column hover still applies.\n const footerCol =\n target.closest<HTMLElement>('[data-ohw-footer-col]') ??\n target.closest<HTMLElement>('[data-ohw-footer-column]')\n if (footerCol) {\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n if (selectedElRef.current === footerCol) return\n hoveredItemElRef.current = footerCol\n setHoveredItemRect(footerCol.getBoundingClientRect())\n return\n }\n\n const editable = target.closest<HTMLElement>('[data-ohw-editable]')\n if (!editable) return\n const selected = selectedElRef.current\n if (selected && (selected === editable || selected.contains(editable))) return\n if (!isMediaEditable(editable) && !editable.hasAttribute('contenteditable')) {\n const hoverTarget = editable.closest<HTMLElement>('[data-ohw-href-key]') ?? editable\n if (hoverTarget.hasAttribute('data-ohw-href-key')) {\n clearHrefKeyHover(hoverTarget)\n hoveredItemElRef.current = hoverTarget\n setHoveredItemRect(hoverTarget.getBoundingClientRect())\n } else if (!isInsideNavigationItem(editable)) {\n hoverTarget.setAttribute('data-ohw-hovered', '')\n }\n }\n }\n\n const handleMouseOut = (e: MouseEvent) => {\n const target = e.target as HTMLElement\n\n if (target.closest('[data-ohw-nav-container], [data-ohw-footer-col], [data-ohw-footer-column], [data-ohw-footer-links], .rb-footer-links')) {\n const related = e.relatedTarget instanceof Element ? e.relatedTarget : null\n if (related?.closest('[data-ohw-nav-container], [data-ohw-footer-col], [data-ohw-footer-column], [data-ohw-footer-links], .rb-footer-links, [data-ohw-navbar-container-chrome], [data-ohw-navbar-add-button], [data-ohw-footer-container-chrome], [data-ohw-footer-add-button]')) {\n return\n }\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n }\n\n const footerCol =\n target.closest<HTMLElement>('[data-ohw-footer-col]') ??\n target.closest<HTMLElement>('[data-ohw-footer-column]')\n if (footerCol && hoveredItemElRef.current === footerCol) {\n const related = e.relatedTarget instanceof Element ? e.relatedTarget : null\n if (related?.closest('[data-ohw-drag-handle-container], [data-ohw-item-interaction]')) return\n if (\n related?.closest('[data-ohw-footer-col], [data-ohw-footer-column]') === footerCol\n ) {\n return\n }\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n return\n }\n\n const navAnchor = getNavigationItemAnchor(target)\n if (navAnchor) {\n const related = e.relatedTarget instanceof Element ? e.relatedTarget : null\n if (related?.closest('[data-ohw-drag-handle-container], [data-ohw-item-interaction]')) return\n if (related && navAnchor.contains(related)) return\n if (hoveredItemElRef.current === navAnchor) {\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n }\n return\n }\n\n const editable = target.closest<HTMLElement>('[data-ohw-editable]')\n if (!editable) return\n const related = e.relatedTarget instanceof Element ? e.relatedTarget : null\n if (related?.closest('[data-ohw-drag-handle-container], [data-ohw-item-interaction]')) return\n if (!isMediaEditable(editable)) {\n const hoverTarget = editable.closest<HTMLElement>('[data-ohw-href-key]') ?? editable\n if (hoverTarget.hasAttribute('data-ohw-href-key')) {\n if (!related?.closest('[data-ohw-href-key]')) {\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n }\n } else {\n hoverTarget.removeAttribute('data-ohw-hovered')\n }\n }\n }\n\n // Parent canvas editor sends root-viewport coords via ow:pointer-sync; in-iframe mouse events are local.\n const toProbeCoords = (clientX: number, clientY: number, fromParentViewport: boolean) => {\n if (!fromParentViewport) return { x: clientX, y: clientY }\n const frame = window.frameElement as HTMLElement | null\n if (!frame) return { x: clientX, y: clientY }\n const fr = frame.getBoundingClientRect()\n return {\n x: clientX - fr.left - frame.clientLeft,\n y: clientY - fr.top - frame.clientTop,\n }\n }\n\n const uploadLockedTracks = new Set<HTMLElement>()\n\n const resumeAnimTracks = () => {\n document.querySelectorAll<HTMLElement>('[data-ohw-hover-paused]').forEach((el) => {\n if (!uploadLockedTracks.has(el)) el.removeAttribute('data-ohw-hover-paused')\n })\n }\n\n // Returns the element's rect clipped to any overflow-hidden/clip ancestor boundaries.\n // Needed when an image (e.g. height:auto logo) overflows a fixed-height container.\n const getVisibleRect = (el: HTMLElement) => {\n const r = el.getBoundingClientRect()\n let top = r.top, left = r.left, bottom = r.bottom, right = r.right\n let parent = el.parentElement\n while (parent) {\n const style = getComputedStyle(parent)\n if (style.overflowY === 'hidden' || style.overflowY === 'clip' || style.overflowX === 'hidden' || style.overflowX === 'clip') {\n const pr = parent.getBoundingClientRect()\n top = Math.max(top, pr.top)\n bottom = Math.min(bottom, pr.bottom)\n left = Math.max(left, pr.left)\n right = Math.min(right, pr.right)\n }\n if (parent === document.documentElement) break\n parent = parent.parentElement\n }\n return { top, left, width: Math.max(0, right - left), height: Math.max(0, bottom - top) }\n }\n\n // Was `postImageHover` — same call sites, same hit-test, but the overlay now lives in this\n // document so the hover lands in local state instead of being marshalled to the parent.\n const showImageHover = (imgEl: HTMLElement, isDragOver = false, forceTextOverlap?: boolean) => {\n const r = getVisibleRect(imgEl)\n const hasTextOverlap = forceTextOverlap ?? false\n hoveredImageHasTextOverlapRef.current = hasTextOverlap\n // `elementType` drives the overlay's label/icon and the file-picker `accept`, so video\n // rides the same channel as image rather than a parallel ow:video-* protocol.\n const video = imgEl.dataset.ohwEditable === 'video' ? getVideoEl(imgEl) : null\n setMediaHover({\n key: imgEl.dataset.ohwKey ?? '',\n rect: { top: r.top, left: r.left, width: r.width, height: r.height },\n elementType: (imgEl.dataset.ohwEditable as MediaElementType) ?? 'image',\n hasTextOverlap,\n isDragOver,\n ...(video ? { videoAutoplay: video.autoplay, videoMuted: video.muted } : {}),\n })\n const track = imgEl.closest<HTMLElement>('[data-ohw-hover-pause]')\n if (track) track.setAttribute('data-ohw-hover-paused', '')\n }\n\n const clearImageHover = () => setMediaHover(null)\n\n const dismissImageHover = () => {\n if (hoveredImageRef.current) {\n hoveredImageRef.current = null\n hoveredImageHasTextOverlapRef.current = false\n resumeAnimTracks()\n postToParentRef.current({ type: 'ow:image-unhover' })\n }\n // Always clear overlay state — ref-only dismiss left MediaOverlay painted over the navbar.\n clearImageHover()\n }\n\n // Bbox hit-test works with pointer-events:none on hover-card children; elementFromPoint does not.\n const findImageAtPoint = (clientX: number, clientY: number, fromParentViewport: boolean) => {\n const { x, y } = toProbeCoords(clientX, clientY, fromParentViewport)\n const images = Array.from(document.querySelectorAll<HTMLElement>(MEDIA_SELECTOR))\n const matches: HTMLElement[] = []\n for (let i = images.length - 1; i >= 0; i--) {\n const el = images[i]\n\n // State-aware filtering: only offer Replace for media that belongs to the active card state.\n // data-ohw-state=\"default\" → only in default (non-hover) editing\n // data-ohw-state=\"hover\" → only in hover editing (data-ohw-active-state=\"hover\")\n // When the image element IS the hover-card itself (base media), treat it as state=\"default\".\n const ownerCard = el.closest<HTMLElement>('[data-ohw-editable-state]')\n if (ownerCard) {\n const inHoverState = ownerCard.getAttribute('data-ohw-active-state') === 'hover'\n const elState = el.dataset.ohwState\n if (el === ownerCard && inHoverState) continue\n if (elState === 'default' && inHoverState) continue\n if (elState === 'hover' && !inHoverState) continue\n }\n\n const r = getVisibleRect(el)\n if (x >= r.left && x <= r.left + r.width && y >= r.top && y <= r.top + r.height) matches.push(el)\n }\n if (matches.length === 0) return null\n // Prefer explicit element media (<img>/<video>) over bg-image sections when both overlap at\n // the cursor. A logo image (e.g. 1100×1107) can be larger by area than its bg-image container\n // (1823×280), so pure smallest-area would wrongly pick the container. Type priority fixes this.\n const imageTypeMatches = matches.filter(\n el => el.dataset.ohwEditable === 'image' || el.dataset.ohwEditable === 'video'\n )\n const candidatePool = imageTypeMatches.length > 0 ? imageTypeMatches : matches\n const smallest = candidatePool.reduce((best, el) => {\n const br = getVisibleRect(best)\n const er = getVisibleRect(el)\n return er.width * er.height < br.width * br.height ? el : best\n })\n const pinned = hoveredImageRef.current\n // Only apply sticky if the pinned element is in the same candidate pool.\n // If pinned is a bg-image but there are now image-type matches, skip sticky so\n // the more specific image-type element is returned.\n if (pinned && candidatePool.includes(pinned)) {\n const pr = getVisibleRect(pinned)\n const stickyPad = 48\n const withinPad =\n x >= pr.left - stickyPad &&\n x <= pr.left + pr.width + stickyPad &&\n y >= pr.top - stickyPad &&\n y <= pr.top + pr.height + stickyPad\n // Keep pinned while cursor is near it so moving toward the Replace button doesn't switch\n // to a larger parent (e.g., logo → bg-image). Yield when the cursor is clearly over a\n // different candidate (sibling logos in a strip are often same-size, so \"smaller\" alone\n // is not enough).\n if (withinPad) {\n if (smallest !== pinned && candidatePool.includes(smallest)) {\n const sr = getVisibleRect(smallest)\n const overOther =\n x >= sr.left &&\n x <= sr.left + sr.width &&\n y >= sr.top &&\n y <= sr.top + sr.height\n if (overOther) return smallest\n }\n return pinned\n }\n }\n return smallest\n }\n\n\n\n const probeNavigationHoverAt = (x: number, y: number) => {\n const selected = selectedElRef.current\n const selectedIsFooterColumn =\n Boolean(selected) &&\n !isFooterLinksContainer(selected!) &&\n (selected!.hasAttribute('data-ohw-footer-col') ||\n selected!.hasAttribute('data-ohw-footer-column') ||\n Boolean(selected!.closest('footer') && isInferredFooterGroup(selected!)))\n const selectedIsFooterLinks = Boolean(selected && isFooterLinksContainer(selected))\n const allowNavContainerHover = toolbarVariantRef.current !== 'select-frame'\n const allowFooterLinksHover =\n (toolbarVariantRef.current !== 'select-frame' || selectedIsFooterColumn) &&\n !selectedIsFooterLinks\n\n if (toolbarVariantRef.current === 'select-frame' && !allowFooterLinksHover) {\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n }\n\n const navContainers = Array.from(\n document.querySelectorAll<HTMLElement>('[data-ohw-nav-container]')\n )\n const footerColumns = listFooterColumns()\n\n // Prefer link items under the pointer (nav or footer).\n for (const container of [...navContainers, ...footerColumns]) {\n const containerRect = container.getBoundingClientRect()\n const overContainer =\n x >= containerRect.left &&\n x <= containerRect.right &&\n y >= containerRect.top &&\n y <= containerRect.bottom\n if (!overContainer) continue\n\n const navItemHit = Array.from(\n container.querySelectorAll<HTMLElement>('[data-ohw-href-key]')\n ).find((el) => {\n if (!isNavigationItem(el) || isNavbarButton(el)) return false\n const itemRect = el.getBoundingClientRect()\n return (\n x >= itemRect.left &&\n x <= itemRect.right &&\n y >= itemRect.top &&\n y <= itemRect.bottom\n )\n })\n\n if (navItemHit) {\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n // Parent column/frame selection must not block item hover.\n if (selected !== navItemHit) {\n clearHrefKeyHover(navItemHit)\n hoveredItemElRef.current = navItemHit\n setHoveredItemRect(navItemHit.getBoundingClientRect())\n } else if (hoveredItemElRef.current === navItemHit) {\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n }\n return\n }\n }\n\n // Empty navbar links-row padding (not while a frame is already selected).\n if (allowNavContainerHover) {\n for (const container of navContainers) {\n const containerRect = container.getBoundingClientRect()\n const overContainer =\n x >= containerRect.left &&\n x <= containerRect.right &&\n y >= containerRect.top &&\n y <= containerRect.bottom\n if (!overContainer) continue\n if (isPointOverNavItem(container, x, y)) continue\n hoveredNavContainerRef.current = container\n setHoveredNavContainerRect(container.getBoundingClientRect())\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n return\n }\n }\n\n // Empty footer-links gaps — dashed block chrome (also while a column is selected).\n if (allowFooterLinksHover) {\n const footerLinks = getFooterLinksContainer()\n if (footerLinks) {\n const containerRect = footerLinks.getBoundingClientRect()\n const overContainer =\n x >= containerRect.left &&\n x <= containerRect.right &&\n y >= containerRect.top &&\n y <= containerRect.bottom\n if (\n overContainer &&\n !isPointOverNavItem(footerLinks, x, y) &&\n !isPointOverFooterColumn(x, y)\n ) {\n hoveredNavContainerRef.current = footerLinks\n setHoveredNavContainerRect(footerLinks.getBoundingClientRect())\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n return\n }\n }\n }\n\n // No container gap hit — clear stale container hover.\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n\n // Empty footer column space → dashed column chrome (also while a child item is Active).\n for (const column of footerColumns) {\n const containerRect = column.getBoundingClientRect()\n const overContainer =\n x >= containerRect.left &&\n x <= containerRect.right &&\n y >= containerRect.top &&\n y <= containerRect.bottom\n if (!overContainer) continue\n if (isPointOverNavItem(column, x, y)) continue\n if (selectedElRef.current === column) {\n if (hoveredItemElRef.current === column) {\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n }\n return\n }\n hoveredItemElRef.current = column\n setHoveredItemRect(column.getBoundingClientRect())\n return\n }\n\n // Left nav/footer containers entirely — clear column hover if it was a footer column.\n if (\n hoveredItemElRef.current?.hasAttribute('data-ohw-footer-col') ||\n hoveredItemElRef.current?.hasAttribute('data-ohw-footer-column')\n ) {\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n }\n }\n\n const probeImageAt = (\n clientX: number,\n clientY: number,\n isDragOver = false,\n fromParentViewport = false,\n ) => {\n if (linkPopoverOpenRef.current) {\n if (hoveredImageRef.current) {\n hoveredImageRef.current = null\n hoveredImageHasTextOverlapRef.current = false\n resumeAnimTracks()\n clearImageHover()\n }\n dismissImageHover()\n return\n }\n\n const { x, y } = toProbeCoords(clientX, clientY, fromParentViewport)\n\n // Navbar sits over hero bg-images — never show the parent image overlay on top of it.\n if (isPointOverNavigation(x, y)) {\n dismissImageHover()\n probeNavigationHoverAt(x, y)\n return\n }\n\n // More (⋯) menu portals outside the toolbar; bbox media hit-tests would still match\n // images under the open menu (e.g. hero bg below nav).\n const overMoreMenu = document\n .elementFromPoint(x, y)\n ?.closest?.(\n '[data-ohw-more-menu], [data-slot=\"dropdown-menu-content\"], [data-slot=\"dropdown-menu-item\"]'\n )\n if (overMoreMenu) {\n dismissImageHover()\n return\n }\n\n hoveredNavContainerRef.current = null\n setHoveredNavContainerRect(null)\n // Leaving nav/footer — drop footer-column hover chrome.\n if (\n hoveredItemElRef.current?.hasAttribute('data-ohw-footer-col') ||\n hoveredItemElRef.current?.hasAttribute('data-ohw-footer-column')\n ) {\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n }\n\n // If the cursor is over the state toggle, hide the image overlay so the toggle is clickable.\n const toggleEl = document.querySelector('[data-ohw-state-toggle]')\n if (toggleEl) {\n const tr = toggleEl.getBoundingClientRect()\n if (x >= tr.left && x <= tr.right && y >= tr.top && y <= tr.bottom) {\n dismissImageHover()\n return\n }\n }\n\n const imgEl = findImageAtPoint(clientX, clientY, fromParentViewport)\n\n // While text is being edited, hide the overlay only for media that CONTAINS the text being\n // edited — e.g. the hero bg-image behind the nav links you're editing, where the overlay\n // would swallow the caret. Media unrelated to the active element (a video, an image\n // elsewhere) must stay hoverable; suppressing everything made all media un-hoverable the\n // moment you clicked into any text.\n const activeEl = activeElRef.current\n\n if (activeEl && (!imgEl || imgEl.contains(activeEl))) {\n if (hoveredImageRef.current) {\n hoveredImageRef.current = null\n hoveredImageHasTextOverlapRef.current = false\n resumeAnimTracks()\n clearImageHover()\n }\n\n // While text is being edited, keep image overlay hidden (e.g. nav links over hero bg).\n if (activeElRef.current) {\n dismissImageHover()\n return\n }\n }\n\n if (imgEl) {\n const { x, y } = toProbeCoords(clientX, clientY, fromParentViewport)\n\n // Carousel arrows/dots sit under the full-bleed media overlay. Bbox-test chrome so we\n // can dismiss the overlay even when elementFromPoint only sees the overlay itself.\n const overMediaChrome = Array.from(\n document.querySelectorAll<HTMLElement>('[data-ohw-media-chrome]'),\n ).some((el) => {\n const r = el.getBoundingClientRect()\n return x >= r.left && x <= r.right && y >= r.top && y <= r.bottom\n })\n if (overMediaChrome) {\n if (hoveredImageRef.current) {\n hoveredImageRef.current = null\n hoveredImageHasTextOverlapRef.current = false\n resumeAnimTracks()\n clearImageHover()\n }\n return\n }\n\n const topEl = document.elementFromPoint(x, y) as HTMLElement | null\n\n // Floating text toolbar / edit chrome / drag handle / More menu — dismiss image overlay.\n if (topEl?.closest('[data-ohw-toolbar], [data-ohw-edit-chrome], [data-ohw-item-interaction], [data-ohw-drag-handle-container], [data-slot=\"drag-handle\"], [data-ohw-more-menu], [data-slot=\"dropdown-menu-content\"], [data-slot=\"dropdown-menu-item\"]')) {\n if (hoveredImageRef.current) {\n hoveredImageRef.current = null\n resumeAnimTracks()\n clearImageHover()\n }\n return\n }\n\n if (\n topEl?.closest('[data-ohw-link-popover-root]') ||\n topEl?.closest('[data-ohw-link-modal-root]') ||\n topEl?.closest('[data-ohw-link-page-dropdown]')\n ) {\n if (hoveredImageRef.current) {\n hoveredImageRef.current = null\n hoveredImageHasTextOverlapRef.current = false\n resumeAnimTracks()\n clearImageHover()\n }\n return\n }\n\n const isStateCardImage = !!imgEl.closest('[data-ohw-editable-state]')\n\n // Use bbox hit-testing to find text at cursor (elementFromPoint skips pointer-events:none).\n const textEditable = Array.from(\n document.querySelectorAll<HTMLElement>(NON_MEDIA_SELECTOR)\n ).find((el) => {\n const er = el.getBoundingClientRect()\n return x >= er.left && x <= er.right && y >= er.top && y <= er.bottom\n })\n\n if (imageUnhoverTimerRef.current) {\n clearTimeout(imageUnhoverTimerRef.current)\n imageUnhoverTimerRef.current = null\n }\n if (imageShowTimerRef.current) {\n clearTimeout(imageShowTimerRef.current)\n imageShowTimerRef.current = null\n }\n\n if (textEditable) {\n if (textEditable.hasAttribute('contenteditable')) {\n // Text actively being edited — keep overlay hidden.\n if (hoveredImageRef.current) {\n hoveredImageRef.current = null\n hoveredImageHasTextOverlapRef.current = false\n resumeAnimTracks()\n clearImageHover()\n }\n return\n }\n\n if (isStateCardImage) {\n // State card: keep overlay visible but pointer-events-none so text stays accessible.\n // Never send unhover — the overlay div stays in DOM, only hasTextOverlap toggles.\n if (imgEl !== hoveredImageRef.current || !hoveredImageHasTextOverlapRef.current) {\n hoveredImageRef.current = imgEl\n showImageHover(imgEl, isDragOver, true)\n }\n document.querySelectorAll<HTMLElement>('[data-ohw-hovered]').forEach(el => el.removeAttribute('data-ohw-hovered'))\n if (textEditable && !isInsideNavigationItem(textEditable)) {\n textEditable.setAttribute('data-ohw-hovered', '')\n }\n return\n }\n\n // Non-state-card: hide overlay when cursor is over text.\n if (hoveredImageRef.current) {\n hoveredImageRef.current = null\n hoveredImageHasTextOverlapRef.current = false\n resumeAnimTracks()\n clearImageHover()\n }\n document.querySelectorAll<HTMLElement>('[data-ohw-hovered]').forEach(el => el.removeAttribute('data-ohw-hovered'))\n if (textEditable && !isInsideNavigationItem(textEditable)) {\n textEditable.setAttribute('data-ohw-hovered', '')\n }\n return\n }\n\n // Cursor on pure image area (no text).\n // If the cursor is in a section-gap zone, the Add section button takes priority — hide image overlay.\n if (hoveredGapRef.current) {\n if (hoveredImageRef.current) { hoveredImageRef.current = null; resumeAnimTracks(); clearImageHover() }\n document.querySelectorAll<HTMLElement>('[data-ohw-hovered]').forEach(el => el.removeAttribute('data-ohw-hovered'))\n return\n }\n document.querySelectorAll<HTMLElement>('[data-ohw-hovered]').forEach(el => el.removeAttribute('data-ohw-hovered'))\n if (imgEl !== hoveredImageRef.current || hoveredImageHasTextOverlapRef.current) {\n hoveredImageRef.current = imgEl\n showImageHover(imgEl, isDragOver)\n } else if (isDragOver) {\n showImageHover(imgEl, true)\n }\n } else {\n const inIframeView =\n clientX >= 0 &&\n clientY >= 0 &&\n clientX <= window.innerWidth &&\n clientY <= window.innerHeight\n if (!inIframeView) return\n if (imageUnhoverTimerRef.current) {\n clearTimeout(imageUnhoverTimerRef.current)\n imageUnhoverTimerRef.current = null\n }\n if (imageShowTimerRef.current) {\n clearTimeout(imageShowTimerRef.current)\n imageShowTimerRef.current = null\n }\n if (hoveredImageRef.current) {\n hoveredImageRef.current = null\n hoveredImageHasTextOverlapRef.current = false\n resumeAnimTracks()\n clearImageHover()\n }\n // Text editables have pointer-events:none (state card CSS) so mouseover never fires on them.\n // Use bbox hit-test so the hover outline still appears when cursor is over a text element.\n const { x, y } = toProbeCoords(clientX, clientY, fromParentViewport)\n const textEl = Array.from(\n document.querySelectorAll<HTMLElement>(NON_MEDIA_SELECTOR)\n ).find((el) => {\n const er = el.getBoundingClientRect()\n return x >= er.left && x <= er.right && y >= er.top && y <= er.bottom\n })\n document.querySelectorAll<HTMLElement>('[data-ohw-hovered]').forEach(el => el.removeAttribute('data-ohw-hovered'))\n if (textEl && !textEl.hasAttribute('contenteditable')) {\n const navAnchor = getNavigationItemAnchor(textEl)\n if (navAnchor) {\n const selected = selectedElRef.current\n if (selected !== navAnchor && !selected?.contains(navAnchor)) {\n clearHrefKeyHover(navAnchor)\n hoveredItemElRef.current = navAnchor\n setHoveredItemRect(navAnchor.getBoundingClientRect())\n }\n } else {\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n textEl.setAttribute('data-ohw-hovered', '')\n }\n } else {\n hoveredItemElRef.current = null\n setHoveredItemRect(null)\n }\n }\n }\n\n const probeHoverCardsAt = (clientX: number, clientY: number, fromParentViewport = false) => {\n // Link modal / section picker own the UI — don't outline nested state cards\n // (e.g. ContactForm inside contact-form section) as if they were pickable targets.\n if (\n linkPopoverOpenRef.current ||\n document.documentElement.hasAttribute('data-ohw-section-picking')\n ) {\n if (activeStateElRef.current) {\n activeStateElRef.current.removeAttribute('data-ohw-state-hovered')\n activeStateElRef.current = null\n setToggleState(null)\n }\n return\n }\n\n const { x, y } = toProbeCoords(clientX, clientY, fromParentViewport)\n const toggleEl = document.querySelector('[data-ohw-state-toggle]')\n if (toggleEl) {\n const tr = toggleEl.getBoundingClientRect()\n if (x >= tr.left && x <= tr.right && y >= tr.top && y <= tr.bottom) {\n return\n }\n }\n\n const cards = Array.from(document.querySelectorAll<HTMLElement>('[data-ohw-editable-state]'))\n const found = cards.find((card) => {\n const r = card.getBoundingClientRect()\n return x >= r.left && x <= r.right && y >= r.top && y <= r.bottom\n }) ?? null\n\n const currentLocked = activeStateElRef.current?.hasAttribute('data-ohw-active-state')\n ? activeStateElRef.current\n : null\n const active = found ?? currentLocked\n\n const prev = activeStateElRef.current\n activeStateElRef.current = active\n // Only touch the DOM and React state when the hovered card actually changes.\n if (active !== prev) {\n if (prev) prev.removeAttribute('data-ohw-state-hovered')\n if (active) {\n if (active.querySelector('[data-ohw-state-view]')) active.setAttribute('data-ohw-state-hovered', '')\n const states = deriveStates(active.dataset.ohwEditableState ?? '')\n const activeState = active.hasAttribute('data-ohw-active-state') ? (active.getAttribute('data-ohw-active-state') ?? 'Default').charAt(0).toUpperCase() + (active.getAttribute('data-ohw-active-state') ?? '').slice(1) : 'Default'\n setToggleState({ rect: active.getBoundingClientRect(), activeState, states })\n } else {\n setToggleState(null)\n }\n }\n }\n\n const probeSectionGapAt = (clientX: number, clientY: number, fromParentViewport = false) => {\n if (linkPopoverOpenRef.current) {\n if (hoveredGapRef.current) {\n hoveredGapRef.current = null\n setSectionGap(null)\n }\n return\n }\n\n const { y } = toProbeCoords(clientX, clientY, fromParentViewport)\n const sections = Array.from(document.querySelectorAll<HTMLElement>('[data-ohw-section]'))\n .sort((a, b) => a.getBoundingClientRect().top - b.getBoundingClientRect().top)\n const ZONE = 20\n for (let i = 0; i < sections.length; i++) {\n const a = sections[i]\n // Footer must always stay last — never offer to insert a section after it.\n if (a.dataset.ohwSection === 'footer') continue\n const b = sections[i + 1] ?? null\n const boundaryY = a.getBoundingClientRect().bottom\n if (Math.abs(y - boundaryY) <= ZONE) {\n const insertAfter = a.dataset.ohwSection ?? ''\n const insertBefore = b?.dataset.ohwSection ?? null\n hoveredGapRef.current = { insertAfter, insertBefore }\n setSectionGap({ insertAfter, insertBefore, y: boundaryY })\n return\n }\n }\n if (hoveredGapRef.current) {\n hoveredGapRef.current = null\n setSectionGap(null)\n }\n }\n\n const handleMouseMove = (e: MouseEvent) => {\n const { clientX, clientY } = e\n probeSectionGapAt(clientX, clientY)\n probeImageAt(clientX, clientY)\n probeHoverCardsAt(clientX, clientY)\n }\n\n const handlePointerSync = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:pointer-sync') return\n const { clientX, clientY } = e.data as { clientX?: number; clientY?: number }\n if (typeof clientX !== 'number' || typeof clientY !== 'number') return\n probeSectionGapAt(clientX, clientY)\n probeImageAt(clientX, clientY)\n probeHoverCardsAt(clientX, clientY)\n }\n\n const handleDragOver = (e: DragEvent) => {\n const footerSession = footerDragRef.current\n if (footerSession) {\n e.preventDefault()\n if (e.dataTransfer) e.dataTransfer.dropEffect = 'move'\n const slot = footerSession.kind === 'link' && footerSession.hrefKey ? hitTestLinkDropSlot(e.clientX, e.clientY, footerSession.hrefKey) : hitTestColumnDropSlot(e.clientX, e.clientY)\n refreshFooterDragVisualsRef.current(footerSession, slot, e.clientX, e.clientY)\n return\n }\n\n if (onNavDragOver(e)) return\n\n e.preventDefault()\n const el = findImageAtPoint(e.clientX, e.clientY, false)\n if (!el) {\n if (e.dataTransfer) e.dataTransfer.dropEffect = 'none'\n return\n }\n e.dataTransfer!.dropEffect = 'copy'\n // Keyed off the drag-specific ref, not hoveredImageRef: if the pointer had already\n // mouse-hovered this element, hoveredImageRef === el and the drag-over state would\n // never be posted, leaving the parent without its drop-target confirmation.\n if (dragOverElRef.current !== el) {\n dragOverElRef.current = el\n hoveredImageRef.current = el\n const isStateCard = !!el.closest('[data-ohw-editable-state]')\n showImageHover(el, true, isStateCard ? true : undefined)\n }\n }\n\n const handleDragLeave = (e: DragEvent) => {\n const imgEl = findImageAtPoint(e.clientX, e.clientY, false)\n if (imgEl) return\n dragOverElRef.current = null\n hoveredImageRef.current = null\n resumeAnimTracks()\n clearImageHover()\n }\n\n const handleDrop = (e: DragEvent) => {\n e.preventDefault()\n const el = findImageAtPoint(e.clientX, e.clientY, false)\n if (!el) return\n const file = e.dataTransfer?.files?.[0]\n if (file) {\n const wantsVideo = el.dataset.ohwEditable === 'video'\n const accepted = wantsVideo\n ? file.type.startsWith('video/')\n : file.type.startsWith('image/')\n if (accepted) {\n const key = el.dataset.ohwKey ?? ''\n const { name, type: mimeType } = file\n const r = el.getBoundingClientRect()\n const rect = { top: r.top, left: r.left, width: r.width, height: r.height }\n // File byte content does not survive postMessage structured-clone — read it first\n // then transfer the ArrayBuffer directly (which is a proper Transferable).\n file.arrayBuffer().then((buf) => {\n window.parent.postMessage({ type: 'ow:image-drop', key, name, mimeType, buf, rect }, '*', [buf])\n })\n } else {\n postToParentRef.current({ type: 'ow:image-drop-invalid', expected: wantsVideo ? 'video' : 'image' })\n }\n }\n dragOverElRef.current = null\n hoveredImageRef.current = null\n resumeAnimTracks()\n clearImageHover()\n }\n\n const handleImageUrl = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:image-url') return\n const { key, url } = e.data as { key: string; url: string }\n let notified = false\n const notify = () => {\n if (notified) return\n notified = true\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${key}\"]`).forEach((el) => {\n const track = el.closest<HTMLElement>('[data-ohw-hover-pause]')\n if (track) {\n uploadLockedTracks.delete(track)\n const stillHovered = hoveredImageRef.current && track.contains(hoveredImageRef.current)\n if (!stillHovered) track.removeAttribute('data-ohw-hover-paused')\n }\n })\n // Reset so the next probe re-fires the hover for this element.\n hoveredImageRef.current = null\n // The replacement has decoded — start the fade-out. Previously this told the parent\n // (`ow:image-loaded`) so it could dissolve an overlay it owned; the overlay is ours now.\n // The skeleton is removed on fade completion, not here, so it dissolves rather than pops.\n setUploadingRects((prev) => {\n const entry = prev[key]\n if (!entry || entry.fadingOut) return prev\n return { ...prev, [key]: { ...entry, fadingOut: true } }\n })\n }\n let found = false\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${key}\"]`).forEach((el) => {\n const track = el.closest<HTMLElement>('[data-ohw-hover-pause]')\n if (track) {\n track.setAttribute('data-ohw-hover-paused', '')\n }\n if (el.dataset.ohwEditable === 'bg-image') {\n found = true\n const fadeTarget = el\n const preload = new Image()\n preload.onload = () => fadeInBgImage(fadeTarget, url, notify)\n preload.onerror = () => {\n fadeTarget.style.backgroundImage = `url('${url}')`\n notify()\n }\n preload.src = url\n } else if (el.dataset.ohwEditable === 'image') {\n const img = el instanceof HTMLImageElement ? el : el.querySelector<HTMLImageElement>('img')\n if (img) {\n found = true\n img.style.opacity = '0'\n const onReady = () => {\n img.onload = null\n img.onerror = null\n fadeInImageElement(img, notify)\n }\n img.onload = onReady\n img.onerror = onReady\n applyEditableImageSrc(img, url)\n if (img.complete && img.naturalWidth > 0) {\n requestAnimationFrame(() => onReady())\n }\n }\n } else if (el.dataset.ohwEditable === 'video') {\n const video = getVideoEl(el)\n if (video) {\n found = true\n // No opacity fade here: a video has no decoded frame to cross-fade into until\n // `loadeddata`, so swap the source and report ready once the first frame exists.\n const onReady = () => {\n video.onloadeddata = null\n video.onerror = null\n notify()\n }\n video.onloadeddata = onReady\n video.onerror = onReady\n applyVideoSrc(video, url)\n }\n }\n })\n if (!found) notify()\n }\n\n const handlePaste = (e: ClipboardEvent) => {\n const el = (e.target as HTMLElement).closest<HTMLElement>('[data-ohw-editable]')\n if (!el) return\n e.preventDefault()\n const text = e.clipboardData?.getData('text/plain') ?? ''\n const maxLen = el.dataset.ohwMaxLength ? parseInt(el.dataset.ohwMaxLength, 10) : null\n if (maxLen) {\n const current = el.innerText.replace(/\\n$/, '').length\n const remaining = Math.max(0, maxLen - current)\n document.execCommand('insertText', false, text.slice(0, remaining))\n } else {\n document.execCommand('insertText', false, text)\n }\n }\n\n const handleInput = (e: Event) => {\n const el = e.target as HTMLElement\n const key = el.dataset.ohwKey\n if (!key) return\n\n if (el === activeElRef.current) setToolbarRect(getEditMeasureEl(el).getBoundingClientRect())\n\n const maxLen = el.dataset.ohwMaxLength ? parseInt(el.dataset.ohwMaxLength, 10) : null\n if (maxLen) {\n const current = el.innerText.replace(/\\n$/, '').length\n if (current > maxLen) {\n const sel = window.getSelection()\n const range = sel?.getRangeAt(0)\n const offset = range?.startOffset ?? 0\n el.innerText = el.innerText.replace(/\\n$/, '').slice(0, maxLen)\n const textNode = el.firstChild\n if (textNode && sel && range) {\n const newRange = document.createRange()\n newRange.setStart(textNode, Math.min(offset - (current - maxLen), maxLen))\n newRange.collapse(true)\n sel.removeAllRanges()\n sel.addRange(newRange)\n }\n }\n setMaxBadge({ rect: el.getBoundingClientRect(), current: Math.min(current, maxLen), max: maxLen })\n }\n\n const html = sanitizeHtml(el.innerHTML)\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${key}\"]`).forEach((sibling) => {\n if (sibling !== el) sibling.innerHTML = html\n })\n\n const timers = autoSaveTimers.current\n const existing = timers.get(key)\n if (existing) clearTimeout(existing)\n timers.set(key, setTimeout(() => {\n timers.delete(key)\n postToParentRef.current({ type: 'ow:change', nodes: [{ key, text: html }] })\n // Re-measure height after content changes (Enter key etc. may grow the page)\n const h = document.documentElement.scrollHeight\n if (h > 50) postToParentRef.current({ type: 'ow:height', height: h })\n }, 400))\n }\n\n const handleHydrate = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:hydrate') return\n const content = e.data.content as Record<string, string> | undefined\n if (!content) return\n let sectionsJson: string | null = null\n for (const [key, val] of Object.entries(content)) {\n if (key === '__ohw_sections') {\n sectionsJson = val\n continue\n }\n if (applyVideoSettingNode(key, val)) continue\n if (applyCarouselNode(key, val)) continue\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${key}\"]`).forEach((el) => {\n if (el.dataset.ohwEditable === 'image') {\n const img = el instanceof HTMLImageElement ? el : el.querySelector<HTMLImageElement>('img')\n if (img) applyEditableImageSrc(img, val)\n } else if (el.dataset.ohwEditable === 'bg-image') {\n el.style.backgroundImage = `url('${val}')`\n } else if (el.dataset.ohwEditable === 'video') {\n const video = getVideoEl(el)\n if (video && video.src !== val) applyVideoSrc(video, val)\n } else if (el.dataset.ohwEditable === 'link') {\n applyLinkHref(el, val)\n } else {\n el.innerHTML = val\n }\n })\n applyLinkByKey(key, val)\n }\n if (sectionsJson) {\n initSectionsFromContent({ __ohw_sections: sectionsJson }, true)\n sectionsLoadedRef.current = true\n pendingScheduleConfigRequests.current.splice(0).forEach(processConfigRequest)\n }\n editContentRef.current = { ...editContentRef.current, ...content }\n reconcileNavbarItemsFromContent(editContentRef.current)\n reconcileFooterOrderFromContent(editContentRef.current)\n syncNavigationDragCursorAttrs()\n enforceLinkHrefs()\n postToParentRef.current({ type: 'ow:hydrate-done' })\n }\n\n window.addEventListener('message', handleHydrate)\n\n const handleDeactivate = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:deactivate') return\n if (Date.now() < linkPopoverGraceUntilRef.current) return\n if (document.querySelector('[data-ohw-section-picker]')) return\n if (linkPopoverOpenRef.current) {\n setLinkPopoverRef.current(null)\n return\n }\n deselectRef.current()\n deactivateRef.current()\n }\n window.addEventListener('message', handleDeactivate)\n\n const handleUiEscape = (e: MessageEvent) => {\n if (e.data?.type !== 'ui:escape') return\n if (document.querySelector('[data-ohw-more-menu]')) return\n if (linkPopoverOpenRef.current) {\n setLinkPopoverRef.current(null)\n return\n }\n // Parent forwards Escape when focus is outside the iframe — mirror handleKeyDown climb.\n if (activeElRef.current) {\n const hrefCtx = getHrefKeyFromElement(activeElRef.current)\n const navAnchor = hrefCtx ? getNavigationItemAnchor(hrefCtx.anchor) : null\n if (navAnchor) {\n const el = activeElRef.current\n if (originalContentRef.current !== null) {\n el.innerHTML = originalContentRef.current\n }\n el.removeAttribute('contenteditable')\n el.removeAttribute('data-ohw-editing')\n activeElRef.current = null\n setMaxBadge(null)\n setActiveCommands(new Set())\n setToolbarShowEditLink(false)\n postToParentRef.current({ type: 'ow:exit-edit' })\n reselectNavigationItemRef.current(navAnchor)\n return\n }\n if (originalContentRef.current !== null) {\n activeElRef.current.innerHTML = originalContentRef.current\n const key = activeElRef.current.dataset.ohwKey\n if (key) {\n postToParentRef.current({ type: 'ow:change', nodes: [{ key, text: originalContentRef.current }] })\n }\n }\n deselectRef.current()\n deactivateRef.current()\n return\n }\n if (selectedElRef.current) {\n if (toolbarVariantRef.current === 'select-frame') {\n // Footer column → climb to footer-links; nav-container / footer-links → deselect.\n const parent = getNavigationSelectionParent(selectedElRef.current)\n if (\n parent &&\n isNavigationContainer(parent) &&\n isFooterLinksContainer(parent) &&\n !isFooterLinksContainer(selectedElRef.current)\n ) {\n selectFrameRef.current(parent)\n return\n }\n deselectRef.current()\n return\n }\n const parent = getNavigationSelectionParent(selectedElRef.current)\n if (parent && isNavigationContainer(parent)) {\n selectFrameRef.current(parent)\n } else {\n deselectRef.current()\n }\n }\n }\n window.addEventListener('message', handleUiEscape)\n\n const handleKeyDown = (e: KeyboardEvent) => {\n if (e.key === 'Escape' && document.querySelector('[data-ohw-section-picker]')) return\n if (e.key === 'Escape' && document.querySelector('[data-ohw-more-menu]')) return\n if ((e.ctrlKey || e.metaKey) && e.key.toLowerCase() === 'a' && activeElRef.current) {\n e.preventDefault()\n selectAllTextInEditable(activeElRef.current)\n refreshActiveCommandsRef.current()\n return\n }\n if (e.key === 'Escape' && linkPopoverOpenRef.current) {\n setLinkPopoverRef.current(null)\n return\n }\n if (e.key === 'Escape' && selectedElRef.current && !activeElRef.current) {\n if (toolbarVariantRef.current === 'select-frame') {\n // Footer column → climb to footer-links; nav-container / footer-links → deselect.\n const parent = getNavigationSelectionParent(selectedElRef.current)\n if (\n parent &&\n isNavigationContainer(parent) &&\n isFooterLinksContainer(parent) &&\n !isFooterLinksContainer(selectedElRef.current)\n ) {\n e.preventDefault()\n selectFrameRef.current(parent)\n return\n }\n deselectRef.current()\n return\n }\n const parent = getNavigationSelectionParent(selectedElRef.current)\n if (parent && isNavigationContainer(parent)) {\n e.preventDefault()\n selectFrameRef.current(parent)\n } else {\n deselectRef.current()\n }\n return\n }\n if (e.key === 'Escape' && activeElRef.current) {\n const hrefCtx = getHrefKeyFromElement(activeElRef.current)\n const navAnchor = hrefCtx ? getNavigationItemAnchor(hrefCtx.anchor) : null\n if (navAnchor) {\n e.preventDefault()\n const el = activeElRef.current\n if (originalContentRef.current !== null) {\n el.innerHTML = originalContentRef.current\n }\n el.removeAttribute('contenteditable')\n el.removeAttribute('data-ohw-editing')\n activeElRef.current = null\n setMaxBadge(null)\n setActiveCommands(new Set())\n setToolbarShowEditLink(false)\n postToParentRef.current({ type: 'ow:exit-edit' })\n reselectNavigationItemRef.current(navAnchor)\n return\n }\n }\n if (e.key === 'Enter' && !e.shiftKey && activeElRef.current) {\n const navAnchor = getNavigationItemAnchor(activeElRef.current)\n if (navAnchor) {\n e.preventDefault()\n commitNavigationTextEditRef.current(navAnchor)\n return\n }\n }\n if (e.key !== 'Escape') return\n const el = activeElRef.current\n if (el && originalContentRef.current !== null) {\n el.innerHTML = originalContentRef.current\n const key = el.dataset.ohwKey\n if (key) {\n postToParentRef.current({ type: 'ow:change', nodes: [{ key, text: originalContentRef.current }] })\n }\n }\n deselectRef.current()\n deactivateRef.current()\n }\n\n const handleScroll = () => {\n const focusEl = activeElRef.current ?? selectedElRef.current\n if (focusEl) {\n const measureEl = activeElRef.current ? getEditMeasureEl(activeElRef.current) : focusEl\n const r = measureEl.getBoundingClientRect()\n applyToolbarPos(r)\n setToolbarRect(r)\n setMaxBadge((prev) => (prev && activeElRef.current ? { ...prev, rect: r } : prev))\n }\n if (activeStateElRef.current) {\n const rect = activeStateElRef.current.getBoundingClientRect()\n setToggleState((prev) => (prev ? { ...prev, rect } : null))\n }\n if (hoveredItemElRef.current) {\n setHoveredItemRect(hoveredItemElRef.current.getBoundingClientRect())\n }\n if (hoveredNavContainerRef.current) {\n setHoveredNavContainerRect(hoveredNavContainerRef.current.getBoundingClientRect())\n }\n if (siblingHintElRef.current) {\n setSiblingHintRect(siblingHintElRef.current.getBoundingClientRect())\n }\n const selected = selectedElRef.current\n if (selected && !footerDragRef.current && !navDragRef.current) {\n if (\n selected.hasAttribute('data-ohw-footer-col') ||\n Boolean(selected.closest('footer') && isInferredFooterGroup(selected))\n ) {\n setSiblingHintRects(\n listFooterColumns()\n .filter((column) => column !== selected)\n .map((column) => column.getBoundingClientRect())\n )\n } else if (isNavigationItem(selected)) {\n setSiblingHintRects(collectNavigationItemSiblingHintRects(selected))\n }\n }\n if (footerDragRef.current) {\n const session = footerDragRef.current\n const slot = session.kind === 'link' && session.hrefKey ? hitTestLinkDropSlot(session.lastClientX, session.lastClientY, session.hrefKey) : hitTestColumnDropSlot(session.lastClientX, session.lastClientY)\n refreshFooterDragVisualsRef.current(session, slot, session.lastClientX, session.lastClientY)\n }\n if (navDragRef.current) {\n const session = navDragRef.current\n const slot = hitTestNavDropSlot(session.lastClientX, session.lastClientY, session.hrefKey)\n refreshNavDragVisualsRef.current(session, slot, session.lastClientX, session.lastClientY)\n }\n if (hoveredImageRef.current) {\n const el = hoveredImageRef.current\n const r = el.getBoundingClientRect()\n // Keeps the overlay glued to the element while the parent scrolls. In-document this is\n // a plain state update — no rect has to survive a postMessage hop to stay in sync.\n setMediaHover((prev) =>\n prev\n ? { ...prev, rect: { top: r.top, left: r.left, width: r.width, height: r.height } }\n : prev,\n )\n }\n }\n\n const handleSave = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:save') return\n const nodes = collectEditableNodes(editContentRef.current)\n const tracker = document.querySelector('[data-ohw-sections-tracker]')\n if (tracker?.textContent) nodes.push({ key: '__ohw_sections', type: 'sections', text: tracker.textContent })\n postToParentRef.current({ type: 'ow:save-result', nodes })\n }\n\n const handleInsertSection = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:insert-section') return\n const { widgetType, insertAfter, insertBefore } = e.data as {\n widgetType: string\n insertAfter: string\n insertBefore?: string | null\n }\n if (widgetType !== 'scheduling') return\n const inserted = mountSchedulingWidget(insertAfter, true, undefined, insertBefore ?? null)\n if (inserted) {\n const tracker = getSectionsTracker()\n postToParentRef.current({ type: 'ow:change', nodes: [{ key: '__ohw_sections', text: tracker.textContent ?? '[]' }] })\n const h = document.documentElement.scrollHeight\n if (h > 50) postToParentRef.current({ type: 'ow:height', height: h })\n }\n }\n\n const handleSwitchSchedule = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:switch-schedule') return\n const scheduleId = e.data.scheduleId as string | undefined\n const insertAfter = e.data.insertAfter as string | undefined\n if (!scheduleId || !insertAfter) return\n const text = updateSectionScheduleId(insertAfter, scheduleId)\n postToParentRef.current({ type: 'ow:change', nodes: [{ key: '__ohw_sections', text }] })\n }\n\n const handleScheduleLinked = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:schedule-linked') return\n const scheduleId = e.data.scheduleId as string | undefined\n const insertAfter = e.data.insertAfter as string | undefined\n if (!scheduleId || !insertAfter) return\n const text = updateSectionScheduleId(insertAfter, scheduleId)\n postToParentRef.current({ type: 'ow:change', nodes: [{ key: '__ohw_sections', text }] })\n }\n\n const handleClearSchedulingWidget = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:clear-scheduling-widget') return\n const insertAfter = e.data.insertAfter as string | undefined\n if (!insertAfter) return\n const text = updateSectionScheduleId(insertAfter, null)\n postToParentRef.current({ type: 'ow:change', nodes: [{ key: '__ohw_sections', text }] })\n }\n\n const handleRemoveSchedulingSection = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:remove-scheduling-section') return\n document.querySelectorAll<HTMLElement>('[data-ohw-section-container=\"scheduling\"]').forEach((el) => {\n el.remove()\n })\n const tracker = getSectionsTracker()\n let sections: InsertedSection[] = []\n try { sections = JSON.parse(tracker.textContent || '[]') } catch { /* ignore */ }\n const currentPath = window.location.pathname\n const updated = sections.filter((s) => !(s.type === 'scheduling' && s.pagePath === currentPath))\n tracker.textContent = JSON.stringify(updated)\n postToParentRef.current({ type: 'ow:change', nodes: [{ key: '__ohw_sections', text: tracker.textContent }] })\n const h = document.documentElement.scrollHeight\n if (h > 50) postToParentRef.current({ type: 'ow:height', height: h })\n }\n\n let selectionChangeRaf: number | null = null\n const runSelectionChange = () => {\n selectionChangeRaf = null\n const activeRoot = activeElRef.current\n if (!activeRoot) return\n\n const startEl = resolveSelectionStartElement(window.getSelection())\n const next = startEl ? detectActiveFormats(startEl, activeRoot) : new Set<string>()\n\n // A fresh Set is always a new reference — bail out via the updater form when the\n // content hasn't actually changed so this doesn't force a re-render on every\n // selectionchange (which fires continuously during a drag-select).\n setActiveCommands((prev) => (setsEqual(prev, next) ? prev : next))\n }\n // selectionchange fires on every extension of a drag-select (once per unit of text\n // crossed). Some browsers visibly drop the in-progress selection highlight if\n // document.queryCommandState is called while the Range is still being extended by a\n // held-down drag — so beyond throttling, skip entirely while the pointer is down and\n // only refresh once the gesture settles (pointerup / any other trigger).\n const handleSelectionChange = () => {\n if (pointerHeldRef.current) return\n if (selectionChangeRaf !== null) return\n selectionChangeRaf = requestAnimationFrame(runSelectionChange)\n }\n const markPointerHeld = (e: PointerEvent) => {\n if (e.button !== 0) return\n pointerHeldRef.current = true\n }\n const markPointerReleased = () => {\n if (!pointerHeldRef.current) return\n pointerHeldRef.current = false\n handleSelectionChange()\n }\n\n refreshActiveCommandsRef.current = runSelectionChange\n\n // Cursor left the iframe entirely — drop the overlay.\n //\n // This used to deliberately NOT clear, because the Replace button lived in the parent: moving\n // the cursor toward it meant *leaving* this document, so clearing here made the overlay\n // flicker out from under the user. The button now lives in this document, so reaching for it\n // never triggers a mouseleave, and clearing on a genuine exit is both safe and correct.\n const handleDocMouseLeave = () => {\n hoveredImageRef.current = null\n setMediaHover(null)\n // The carousel overlay is driven by mousemove inside this document; once the pointer leaves\n // the iframe no further moves arrive, so it must be cleared here or it stays stuck on.\n setCarouselHover(null)\n document.querySelectorAll<HTMLElement>('[data-ohw-state-hovered]').forEach(el => el.removeAttribute('data-ohw-state-hovered'))\n document.querySelectorAll<HTMLElement>('[data-ohw-hovered]').forEach(el => el.removeAttribute('data-ohw-hovered'))\n activeStateElRef.current = null\n setToggleState(null)\n }\n\n // Replaces `ow:anim-lock`. The parent owns the authenticated upload, so it is the only side\n // that knows an upload is in flight — but the skeleton and the animation lock are now this\n // document's business, so it just reports the fact and we react to it.\n // `uploading: false` is only sent on FAILURE; on success the skeleton is cleared by\n // handleImageUrl once the replacement media has actually loaded.\n const handleImageUploading = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:image-uploading') return\n const { key, uploading } = e.data as { key: string; uploading: boolean }\n\n setUploadingRects((prev) => {\n if (!uploading) {\n if (!(key in prev)) return prev\n const next = { ...prev }\n delete next[key]\n return next\n }\n const el = document.querySelector<HTMLElement>(`[data-ohw-key=\"${key}\"]`)\n if (!el) return prev\n const r = getVisibleRect(el)\n return {\n ...prev,\n [key]: { rect: { top: r.top, left: r.left, width: r.width, height: r.height } },\n }\n })\n\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${key}\"]`).forEach((el) => {\n const track = el.closest<HTMLElement>('[data-ohw-hover-pause]')\n if (!track) return\n if (uploading) {\n uploadLockedTracks.add(track)\n track.setAttribute('data-ohw-hover-paused', '')\n } else {\n uploadLockedTracks.delete(track)\n track.removeAttribute('data-ohw-hover-paused')\n }\n })\n }\n\n const handleCanvasHeight = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:canvas-height' || typeof e.data.height !== 'number') return\n document.documentElement.style.setProperty('--ohw-canvas-h', `${e.data.height}px`)\n }\n\n // Parent's gallery modal edited the slide array → reflect it live (React re-renders the\n // carousel) and keep editContentRef in sync so a full save carries the new value.\n const handleCarouselChange = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:carousel-change') return\n const { key, images } = e.data as { key: string; images: CarouselSlide[] }\n if (!key || !Array.isArray(images)) return\n const text = JSON.stringify(images)\n applyCarouselValue(key, images)\n editContentRef.current = { ...editContentRef.current, [key]: text }\n // Persist through the same channel as every other edit: the parent's ow:change handler\n // writes it to the draft (as one JSON node) and batches the save.\n postToParentRef.current({ type: 'ow:change', nodes: [{ key, text }] })\n // The container's box can change (add/delete grows/shrinks the thumbnail rail), so drop\n // the stale hover rect; it re-derives on the next pointer move.\n setCarouselHover(null)\n }\n\n // Show the \"Edit gallery\" button whenever the pointer is over a carousel container. Must use\n // a bbox hit-test on coordinates (not e.target/closest): edit-mode CSS toggles pointer-events,\n // so e.target is unreliable — the same reason the media path uses findImageAtPoint. Iterate in\n // reverse so a nested carousel wins over an ancestor.\n const findCarouselAtPoint = (clientX: number, clientY: number): HTMLElement | null => {\n const containers = Array.from(document.querySelectorAll<HTMLElement>(`[${CAROUSEL_ATTR}]`))\n for (let i = containers.length - 1; i >= 0; i--) {\n const r = containers[i].getBoundingClientRect()\n if (clientX >= r.left && clientX <= r.right && clientY >= r.top && clientY <= r.bottom) {\n return containers[i]\n }\n }\n return null\n }\n\n // Editable elements (the carousel's static overlay text: wordmark, logo, tagline) sit on top\n // of the carousel. When the pointer is over one, hide the gallery overlay so that text stays\n // hoverable/editable. Scoped to the carousel's section and bbox-tested for the same\n // pointer-events reason as above.\n const isPointOverEditable = (scope: HTMLElement, clientX: number, clientY: number): boolean => {\n const editables = scope.querySelectorAll<HTMLElement>('[data-ohw-editable], [data-ohw-href-key]')\n for (const el of editables) {\n const r = el.getBoundingClientRect()\n if (clientX >= r.left && clientX <= r.right && clientY >= r.top && clientY <= r.bottom) return true\n }\n return false\n }\n\n const handleCarouselHover = (e: MouseEvent) => {\n const container = findCarouselAtPoint(e.clientX, e.clientY)\n const scope = container?.closest<HTMLElement>('[data-ohw-section]') ?? container?.parentElement ?? null\n if (!container || !scope || isPointOverEditable(scope, e.clientX, e.clientY)) {\n setCarouselHover((prev) => (prev ? null : prev))\n return\n }\n const key = container.getAttribute('data-ohw-key') ?? ''\n if (!key) return\n const r = getVisibleRect(container)\n setCarouselHover((prev) =>\n prev &&\n prev.key === key &&\n prev.rect.top === r.top &&\n prev.rect.left === r.left &&\n prev.rect.width === r.width &&\n prev.rect.height === r.height\n ? prev\n : { key, rect: { top: r.top, left: r.left, width: r.width, height: r.height } }\n )\n }\n\n // Direct DOM update — no React re-render, no frame delay\n const applyToolbarPos = (rect: DOMRect) => {\n const ps = parentScrollRef.current\n const measuredW = toolbarElRef.current?.offsetWidth || 330\n if (toolbarElRef.current) {\n const { top, left, transform } = calcToolbarPos(rect, ps, measuredW)\n toolbarElRef.current.style.top = `${top}px`\n toolbarElRef.current.style.left = `${left}px`\n toolbarElRef.current.style.transform = transform\n }\n if (glowElRef.current) {\n const GAP = SELECTION_CHROME_GAP\n glowElRef.current.style.top = `${rect.top - GAP}px`\n glowElRef.current.style.left = `${rect.left - GAP}px`\n glowElRef.current.style.width = `${rect.width + GAP * 2}px`\n glowElRef.current.style.height = `${rect.height + GAP * 2}px`\n }\n }\n\n const handleParentScroll = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:parent-scroll') return\n const { iframeOffsetTop, headerH, canvasH } = e.data as { iframeOffsetTop: number; headerH: number; canvasH: number }\n parentScrollRef.current = { iframeOffsetTop, headerH, canvasH }\n if (visibleViewportRef.current) {\n applyVisibleViewport(visibleViewportRef.current, parentScrollRef.current)\n }\n const focusEl = activeElRef.current ?? selectedElRef.current\n if (focusEl) {\n const measureEl = activeElRef.current ? getEditMeasureEl(activeElRef.current) : focusEl\n applyToolbarPos(measureEl.getBoundingClientRect())\n }\n }\n\n // ow:click-at — parent frame proxies a click it caught on the state-card image overlay\n // (cross-origin iframes don't forward pointer events into the iframe document, so we use\n // postMessage to bridge the gap)\n const handleClickAt = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:click-at') return\n const { clientX, clientY } = e.data as { clientX: number; clientY: number }\n\n // Check state card images by bbox (pointer-events:none, so can't be a native click target)\n const allImages = Array.from(\n document.querySelectorAll<HTMLElement>(MEDIA_SELECTOR)\n ).filter(el => !!el.closest('[data-ohw-editable-state]'))\n\n const stateCardImage = allImages.find((el) => {\n const ownerCard = el.closest<HTMLElement>('[data-ohw-editable-state]')\n if (ownerCard) {\n const inHoverState = ownerCard.getAttribute('data-ohw-active-state') === 'hover'\n const elState = el.dataset.ohwState\n if (el === ownerCard && inHoverState) return false\n if (elState === 'default' && inHoverState) return false\n if (elState === 'hover' && !inHoverState) return false\n }\n const r = el.getBoundingClientRect()\n return clientX >= r.left && clientX <= r.right && clientY >= r.top && clientY <= r.bottom\n })\n\n if (stateCardImage) {\n postToParentRef.current({ type: 'ow:image-pick', key: stateCardImage.dataset.ohwKey ?? '', elementType: stateCardImage.dataset.ohwEditable ?? 'image' })\n return\n }\n\n // Check text editables by bbox\n const textEditable = Array.from(\n document.querySelectorAll<HTMLElement>(NON_MEDIA_SELECTOR)\n ).find((el) => {\n const r = el.getBoundingClientRect()\n return clientX >= r.left && clientX <= r.right && clientY >= r.top && clientY <= r.bottom\n })\n\n if (textEditable) {\n const hrefCtx = getHrefKeyFromElement(textEditable)\n const navAnchor = hrefCtx ? getNavigationItemAnchor(hrefCtx.anchor) : null\n if (navAnchor) {\n if (selectedElRef.current === navAnchor) {\n activateRef.current(textEditable, { caretX: clientX, caretY: clientY })\n } else {\n selectRef.current(navAnchor)\n }\n return\n }\n activateRef.current(textEditable, { caretX: clientX, caretY: clientY })\n return\n }\n\n const navContainer = document.querySelector<HTMLElement>('[data-ohw-nav-container]')\n if (navContainer) {\n const r = navContainer.getBoundingClientRect()\n const pad = 8\n const over =\n clientX >= r.left - pad &&\n clientX <= r.right + pad &&\n clientY >= r.top - pad &&\n clientY <= r.bottom + pad\n if (over && !isPointOverNavItem(navContainer, clientX, clientY)) {\n selectFrameRef.current(navContainer)\n return\n }\n }\n\n // Empty nav-root padding → still select the links frame\n const navRoot = document.querySelector<HTMLElement>('[data-ohw-nav-root]')\n if (navRoot && navContainer) {\n const rr = navRoot.getBoundingClientRect()\n if (\n clientX >= rr.left &&\n clientX <= rr.right &&\n clientY >= rr.top &&\n clientY <= rr.bottom &&\n !isPointOverNavItem(navContainer, clientX, clientY)\n ) {\n const book = navRoot.querySelector('[data-ohw-role=\"navbar-button\"]')\n if (book) {\n const br = book.getBoundingClientRect()\n if (clientX >= br.left && clientX <= br.right && clientY >= br.top && clientY <= br.bottom) {\n deactivateRef.current()\n return\n }\n }\n selectFrameRef.current(navContainer)\n return\n }\n }\n\n const footerColumn = findHoveredNavOrFooterContainer(clientX, clientY)\n if (\n footerColumn?.hasAttribute('data-ohw-footer-col') ||\n footerColumn?.hasAttribute('data-ohw-footer-column')\n ) {\n selectFrameRef.current(footerColumn)\n return\n }\n\n deactivateRef.current()\n }\n\n window.addEventListener('message', handleSave)\n window.addEventListener('message', handleInsertSection)\n window.addEventListener('message', handleSwitchSchedule)\n window.addEventListener('message', handleScheduleLinked)\n window.addEventListener('message', handleClearSchedulingWidget)\n window.addEventListener('message', handleRemoveSchedulingSection)\n window.addEventListener('message', handleImageUrl)\n window.addEventListener('message', handleImageUploading)\n window.addEventListener('message', handleCarouselChange)\n window.addEventListener('message', handleCanvasHeight)\n window.addEventListener('message', handleParentScroll)\n window.addEventListener('message', handlePointerSync)\n window.addEventListener('message', handleClickAt)\n const handleViewportResize = () => {\n if (visibleViewportRef.current) {\n applyVisibleViewport(visibleViewportRef.current, parentScrollRef.current)\n }\n }\n window.addEventListener('resize', handleViewportResize, { passive: true })\n document.addEventListener('click', handleClick, true)\n document.addEventListener('dblclick', handleDblClick, true)\n document.addEventListener('paste', handlePaste, true)\n document.addEventListener('input', handleInput, true)\n document.addEventListener('mouseover', handleMouseOver, true)\n document.addEventListener('mouseout', handleMouseOut, true)\n document.addEventListener('mousemove', handleMouseMove, true)\n document.addEventListener('mousemove', handleCarouselHover, true)\n document.addEventListener('mouseleave', handleDocMouseLeave)\n document.addEventListener('dragover', handleDragOver, true)\n document.addEventListener('dragleave', handleDragLeave, true)\n document.addEventListener('drop', handleDrop, true)\n document.addEventListener('keydown', handleKeyDown)\n document.addEventListener('selectionchange', handleSelectionChange)\n // document.addEventListener('pointerdown', markPointerHeld)\n // document.addEventListener('pointerup', markPointerReleased)\n // document.addEventListener('pointercancel', markPointerReleased)\n window.addEventListener('scroll', handleScroll, true)\n\n return () => {\n document.removeEventListener('click', handleClick, true)\n document.removeEventListener('dblclick', handleDblClick, true)\n document.removeEventListener('paste', handlePaste, true)\n document.removeEventListener('input', handleInput, true)\n document.removeEventListener('mouseover', handleMouseOver, true)\n document.removeEventListener('mouseout', handleMouseOut, true)\n document.removeEventListener('mousemove', handleMouseMove, true)\n document.removeEventListener('mousemove', handleCarouselHover, true)\n document.removeEventListener('mouseleave', handleDocMouseLeave)\n document.removeEventListener('dragover', handleDragOver, true)\n document.removeEventListener('dragleave', handleDragLeave, true)\n document.removeEventListener('drop', handleDrop, true)\n document.removeEventListener('keydown', handleKeyDown)\n document.removeEventListener('selectionchange', handleSelectionChange)\n // document.removeEventListener('pointerdown', markPointerHeld)\n // document.removeEventListener('pointerup', markPointerReleased)\n // document.removeEventListener('pointercancel', markPointerReleased)\n // if (selectionChangeRaf !== null) cancelAnimationFrame(selectionChangeRaf)\n window.removeEventListener('scroll', handleScroll, true)\n window.removeEventListener('message', handleSave)\n window.removeEventListener('message', handleInsertSection)\n window.removeEventListener('message', handleSwitchSchedule)\n window.removeEventListener('message', handleScheduleLinked)\n window.removeEventListener('message', handleClearSchedulingWidget)\n window.removeEventListener('message', handleRemoveSchedulingSection)\n window.removeEventListener('message', handleImageUrl)\n window.removeEventListener('message', handleImageUploading)\n window.removeEventListener('message', handleCarouselChange)\n window.removeEventListener('message', handleCanvasHeight)\n window.removeEventListener('message', handleParentScroll)\n window.removeEventListener('resize', handleViewportResize)\n window.removeEventListener('message', handlePointerSync)\n window.removeEventListener('message', handleClickAt)\n window.removeEventListener('message', handleHydrate)\n window.removeEventListener('message', handleDeactivate)\n window.removeEventListener('message', handleUiEscape)\n autoSaveTimers.current.forEach(clearTimeout)\n autoSaveTimers.current.clear()\n if (imageUnhoverTimerRef.current) clearTimeout(imageUnhoverTimerRef.current)\n if (imageShowTimerRef.current) clearTimeout(imageShowTimerRef.current)\n }\n }, [isEditMode, refreshStateRules])\n\n // Footer DnD — OHH-436\n // Native <a> drag steals clicks. Force draggable=false; reorder via drag-handle (HTML5)\n // or press-to-drag (pointer, any selection/edit/popover state). Click without movement\n // still selects / edits text.\n useEffect(() => {\n if (!isEditMode) return\n const THRESHOLD = 10\n\n const resolveWasSelected = (el: HTMLElement) => {\n if (selectedElRef.current === el) return true\n const activeAnchor = activeElRef.current ? getNavigationItemAnchor(activeElRef.current) : null\n return activeAnchor === el\n }\n\n const onPointerDown = (e: PointerEvent) => {\n if (e.button !== 0) return\n // A real drag often never produces a trailing click (browser cancels it after\n // movement). Clear any leftover suppress so this new gesture's click works —\n // including clicks on the selected-item drag surface (early-return below).\n if (\n suppressNextClickRef.current &&\n Date.now() >= suppressClickUntilRef.current &&\n !footerDragRef.current &&\n !footerPointerDragRef.current?.started\n ) {\n suppressNextClickRef.current = false\n }\n if (footerDragRef.current) return\n const target = e.target as HTMLElement | null\n if (!target) return\n if (target.closest('[data-ohw-drag-handle-container], [data-slot=\"drag-handle\"], [data-ohw-toolbar], [data-ohw-item-toolbar-anchor], [data-ohw-link-popover-root]')) {\n return\n }\n // Selected-item chrome already arms press-to-drag via onItemPointerDown.\n if (target.closest('[data-ohw-item-drag-surface]')) return\n\n const anchor = getNavigationItemAnchor(target)\n const hrefKey = anchor?.getAttribute('data-ohw-href-key') ?? null\n if (anchor && isFooterHrefKey(hrefKey)) {\n footerPointerDragRef.current = {\n el: anchor,\n kind: 'link',\n startX: e.clientX,\n startY: e.clientY,\n pointerId: e.pointerId,\n wasSelected: resolveWasSelected(anchor),\n started: false\n }\n return\n }\n\n const col = target.closest<HTMLElement>('[data-ohw-footer-col]')\n if (col && !getNavigationItemAnchor(target)) {\n footerPointerDragRef.current = {\n el: col,\n kind: 'column',\n startX: e.clientX,\n startY: e.clientY,\n pointerId: e.pointerId,\n wasSelected: resolveWasSelected(col),\n started: false\n }\n }\n }\n\n const onPointerMove = (e: PointerEvent) => {\n const pending = footerPointerDragRef.current\n if (!pending) return\n\n if (pending.started) {\n e.preventDefault()\n clearTextSelection()\n const session = footerDragRef.current\n if (!session) return\n const slot = session.kind === 'link' && session.hrefKey ? hitTestLinkDropSlot(e.clientX, e.clientY, session.hrefKey) : hitTestColumnDropSlot(e.clientX, e.clientY)\n refreshFooterDragVisualsRef.current(session, slot, e.clientX, e.clientY)\n return\n }\n\n const dx = e.clientX - pending.startX\n const dy = e.clientY - pending.startY\n if (dx * dx + dy * dy < THRESHOLD * THRESHOLD) return\n\n e.preventDefault()\n pending.started = true\n armFooterPressDrag()\n clearTextSelection()\n try {\n document.body.setPointerCapture(pending.pointerId)\n } catch {\n /* ignore */\n }\n\n // Leave text-edit / popover so the drag session owns interaction.\n if (linkPopoverOpenRef.current) {\n setLinkPopoverRef.current(null)\n }\n if (activeElRef.current) {\n deactivateRef.current()\n }\n\n if (pending.kind === 'link') {\n const key = pending.el.getAttribute('data-ohw-href-key')\n if (!key) return\n const column = findFooterColumnForLink(pending.el)\n const columns = listFooterColumns()\n beginFooterDragRef.current({\n kind: 'link',\n hrefKey: key,\n columnEl: column,\n sourceColumnIndex: column ? columns.indexOf(column) : 0,\n wasSelected: pending.wasSelected,\n draggedEl: pending.el,\n lastClientX: e.clientX,\n lastClientY: e.clientY,\n activeSlot: null\n })\n return\n }\n\n const columns = listFooterColumns()\n const idx = columns.indexOf(pending.el)\n if (idx < 0) return\n beginFooterDragRef.current({\n kind: 'column',\n hrefKey: null,\n columnEl: pending.el,\n sourceColumnIndex: idx,\n wasSelected: pending.wasSelected,\n draggedEl: pending.el,\n lastClientX: e.clientX,\n lastClientY: e.clientY,\n activeSlot: null\n })\n }\n\n const endPointerDrag = (e: PointerEvent) => {\n const pending = footerPointerDragRef.current\n footerPointerDragRef.current = null\n try {\n if (document.body.hasPointerCapture(e.pointerId)) {\n document.body.releasePointerCapture(e.pointerId)\n }\n } catch {\n /* ignore */\n }\n // No footer/nav press was ever tracked for this gesture (e.g. a plain text\n // drag-select elsewhere) — don't touch selection state at all.\n if (!pending) return\n if (!pending.started) {\n unlockFooterDragInteraction()\n return\n }\n // Only swallow the click when a real drag gesture ran. If the browser skips the\n // trailing click (common after movement), the next pointerdown clears this flag.\n suppressNextClickRef.current = true\n suppressClickUntilRef.current = Date.now() + 500\n commitFooterDragRef.current(e.clientX, e.clientY)\n }\n\n const blockSelectStart = (e: Event) => {\n if (footerDragRef.current || footerPointerDragRef.current?.started || document.documentElement.hasAttribute('data-ohw-footer-press-drag')) {\n e.preventDefault()\n }\n }\n\n const onDragEnd = (_e: DragEvent) => {\n if (!footerDragRef.current) return\n suppressNextClickRef.current = true\n suppressClickUntilRef.current = Date.now() + 500\n commitFooterDragRef.current()\n }\n\n document.addEventListener('pointerdown', onPointerDown, true)\n document.addEventListener('pointermove', onPointerMove, true)\n document.addEventListener('pointerup', endPointerDrag, true)\n document.addEventListener('pointercancel', endPointerDrag, true)\n document.addEventListener('selectstart', blockSelectStart, true)\n document.addEventListener('dragend', onDragEnd, true)\n return () => {\n document.removeEventListener('pointerdown', onPointerDown, true)\n document.removeEventListener('pointermove', onPointerMove, true)\n document.removeEventListener('pointerup', endPointerDrag, true)\n document.removeEventListener('pointercancel', endPointerDrag, true)\n document.removeEventListener('selectstart', blockSelectStart, true)\n document.removeEventListener('dragend', onDragEnd, true)\n unlockFooterDragInteraction()\n }\n }, [isEditMode])\n\n // Reactive handler for ow:request-schedule-config — works in both edit and live-site mode.\n // Responds once sections are loaded; queues early requests until then.\n useEffect(() => {\n const handler = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:request-schedule-config') return\n const insertAfterVal = e.data.insertAfter as string | undefined\n if (!insertAfterVal) return\n if (!sectionsLoadedRef.current) {\n if (!pendingScheduleConfigRequests.current.includes(insertAfterVal)) {\n pendingScheduleConfigRequests.current.push(insertAfterVal)\n }\n return\n }\n processConfigRequest(insertAfterVal)\n }\n window.addEventListener('message', handler)\n return () => window.removeEventListener('message', handler)\n }, [processConfigRequest])\n\n // On route change: refresh hover CSS, reset card state, notify parent\n useEffect(() => {\n if (!isEditMode) return\n\n document.querySelectorAll('[data-ohw-active-state]').forEach((el) => {\n el.removeAttribute('data-ohw-active-state')\n })\n resetStateViews()\n document.querySelectorAll<HTMLElement>('[data-ohw-editable-state]').forEach((el) => {\n if (el.querySelector('[data-ohw-state-view]')) applyStateViews(el, 'default')\n })\n activeStateElRef.current = null\n setToggleState(null)\n refreshStateRules()\n\n const raf = requestAnimationFrame(() => refreshStateRules())\n const timer = setTimeout(() => {\n refreshStateRules()\n const sections = collectSections()\n setSectionsByPath((prev) => {\n const pathKey = normalizePath(pathname)\n const next = { ...prev, [pathKey]: sections }\n return shouldUseDevFixtures() ? { ...DEV_SECTIONS_BY_PATH, ...next } : next\n })\n postToParent({\n type: 'ow:ready',\n version: '1',\n path: pathname,\n nodes: collectEditableNodes(editContentRef.current),\n sections\n })\n postToParent({ type: 'ow:request-site-pages' })\n }, 150)\n\n return () => {\n cancelAnimationFrame(raf)\n clearTimeout(timer)\n }\n }, [pathname, isEditMode, refreshStateRules, postToParent])\n\n // Scroll to `[data-ohw-section]` matching the URL hash (e.g. /pricing#benefits-marquee).\n useEffect(() => {\n scrollToHashSectionWhenReady()\n const onHashChange = () => scrollToHashSectionWhenReady()\n window.addEventListener('hashchange', onHashChange)\n return () => window.removeEventListener('hashchange', onHashChange)\n }, [pathname])\n\n const handleCommand = useCallback((cmd: string) => {\n const el = activeElRef.current\n // execCommand's DOM surgery (splitting/merging/rewrapping text nodes to apply the\n // format) frequently replaces the very nodes the current selection points into —\n // save the range as character offsets relative to `el` (stable across that surgery)\n // rather than cloning the Range itself (whose node references go stale the instant\n // execCommand swaps them out, silently breaking any attempt to restore from it).\n const selBefore = window.getSelection()\n let savedOffsets: { start: number; end: number } | null = null\n if (el && selBefore && selBefore.rangeCount > 0 && !selBefore.isCollapsed) {\n const r = selBefore.getRangeAt(0)\n if (el.contains(r.commonAncestorContainer)) {\n savedOffsets = {\n start: textOffsetInRoot(el, r.startContainer, r.startOffset),\n end: textOffsetInRoot(el, r.endContainer, r.endOffset),\n }\n }\n }\n\n // Without styleWithCSS, bold/italic/underline apply via <b>/<i>/<u> tags whose UA\n // styling is relative (e.g. <b>'s font-weight: bolder resolves off the CSS2.1 table —\n // a base weight under 400 only reaches 400, an invisible bump on light body text).\n // styleWithCSS makes these commands emit absolute inline styles instead.\n document.execCommand('styleWithCSS', false, true as unknown as string)\n document.execCommand(cmd, false)\n\n // Re-focus only if focus actually moved — redundantly re-focusing an already-focused\n // contenteditable right after execCommand can itself collapse the selection in Chrome.\n if (el && document.activeElement !== el) {\n el.focus()\n }\n\n // If the selection came back collapsed, re-locate the saved offsets in the (now\n // possibly restructured) DOM and rebuild the range around the freshly-formatted text.\n const selAfter = window.getSelection()\n if (el && savedOffsets && selAfter?.isCollapsed) {\n const start = pointAtTextOffset(el, savedOffsets.start)\n const end = pointAtTextOffset(el, savedOffsets.end)\n if (start && end) {\n try {\n const range = document.createRange()\n range.setStart(start.node, start.offset)\n range.setEnd(end.node, end.offset)\n selAfter.removeAllRanges()\n selAfter.addRange(range)\n } catch {\n /* ignore — nothing sane left to restore */\n }\n }\n }\n\n if (el) setToolbarRect(getEditMeasureEl(el).getBoundingClientRect())\n refreshActiveCommandsRef.current()\n }, [])\n\n const handleStateChange = useCallback((state: string) => {\n if (!activeStateElRef.current) return\n const el = activeStateElRef.current\n if (state === 'Default') {\n deactivate()\n el.removeAttribute('data-ohw-active-state')\n applyStateViews(el, 'default')\n } else {\n el.setAttribute('data-ohw-active-state', state.toLowerCase())\n applyStateViews(el, state.toLowerCase())\n }\n setToggleState((prev) => (prev ? { ...prev, activeState: state } : null))\n }, [deactivate])\n\n const closeLinkPopover = useCallback(() => {\n addNavAfterAnchorRef.current = null\n setLinkPopover(null)\n }, [])\n\n const openLinkPopoverForActive = useCallback(() => {\n const hrefCtx = getHrefKeyFromElement(activeElRef.current)\n if (!hrefCtx) return\n bumpLinkPopoverGrace()\n setLinkPopover({\n key: hrefCtx.key,\n mode: 'edit',\n target: getLinkHref(hrefCtx.anchor),\n })\n deactivate()\n }, [deactivate])\n\n const openLinkPopoverForSelected = useCallback(() => {\n const anchor = selectedElRef.current\n if (!anchor) return\n const key = anchor.getAttribute('data-ohw-href-key')\n if (!key) return\n bumpLinkPopoverGrace()\n setLinkPopover({\n key,\n mode: 'edit',\n target: getLinkHref(anchor),\n })\n deselect()\n }, [deselect])\n\n const handleSelectParent = useCallback(() => {\n const selected = selectedElRef.current\n if (!selected) return\n if (toolbarVariantRef.current === 'select-frame') {\n deselectRef.current()\n return\n }\n const parent = getNavigationSelectionParent(selected)\n if (parent && isNavigationContainer(parent)) {\n selectFrameRef.current(parent)\n } else {\n deselectRef.current()\n }\n }, [])\n\n const handleDuplicateSelected = useCallback(() => {\n const selected = selectedElRef.current\n if (!selected || !isNavigationItem(selected)) return\n\n const hrefKey = selected.getAttribute('data-ohw-href-key')\n if (!hrefKey) return\n\n if (isNavbarHrefKey(hrefKey)) {\n const result = duplicateNavbarItem(selected)\n if (!result) return\n\n applyLinkByKey(result.hrefKey, result.href)\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${result.labelKey}\"]`).forEach((el) => {\n el.textContent = result.label\n })\n\n const nodes: { key: string; text: string }[] = [\n { key: result.hrefKey, text: result.href },\n { key: result.labelKey, text: result.label },\n ]\n\n for (const child of result.childResults) {\n applyLinkByKey(child.hrefKey, child.href)\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${child.labelKey}\"]`).forEach((el) => {\n el.textContent = child.label\n })\n nodes.push(\n { key: child.hrefKey, text: child.href },\n { key: child.labelKey, text: child.label }\n )\n }\n\n const maxIndex = Math.max(\n result.index,\n ...result.childResults.map((c) => c.index)\n )\n const navCount = String(maxIndex + 1)\n nodes.push(\n { key: NAV_COUNT_KEY, text: navCount },\n { key: NAV_ORDER_KEY, text: result.orderJson }\n )\n\n editContentRef.current = {\n ...editContentRef.current,\n [result.hrefKey]: result.href,\n [result.labelKey]: result.label,\n ...Object.fromEntries(\n result.childResults.flatMap((c) => [\n [c.hrefKey, c.href],\n [c.labelKey, c.label],\n ])\n ),\n [NAV_COUNT_KEY]: navCount,\n [NAV_ORDER_KEY]: result.orderJson,\n }\n\n postToParent({ type: 'ow:change', nodes })\n enforceLinkHrefs()\n requestAnimationFrame(() => {\n selectRef.current(result.anchor)\n })\n return\n }\n\n if (isFooterHrefKey(hrefKey)) {\n const result = duplicateFooterItem(selected)\n if (!result) return\n\n applyLinkByKey(result.hrefKey, result.href)\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${result.labelKey}\"]`).forEach((el) => {\n el.textContent = result.label\n })\n\n const orderJson = JSON.stringify(result.order)\n editContentRef.current = {\n ...editContentRef.current,\n [result.hrefKey]: result.href,\n [result.labelKey]: result.label,\n [FOOTER_ORDER_KEY]: orderJson,\n }\n\n postToParent({\n type: 'ow:change',\n nodes: [\n { key: result.hrefKey, text: result.href },\n { key: result.labelKey, text: result.label },\n { key: FOOTER_ORDER_KEY, text: orderJson },\n ],\n })\n enforceLinkHrefs()\n requestAnimationFrame(() => {\n selectRef.current(result.anchor)\n })\n }\n }, [postToParent])\n\n const handleLinkPopoverSubmit = useCallback(\n (target: string) => {\n const session = linkPopoverSessionRef.current\n if (!session) return\n\n if (session.intent === 'add-nav') {\n const trimmed = target.trim()\n let href = trimmed\n let label = 'Untitled'\n if (trimmed) {\n const { pageRoute, sectionId } = parseTarget(trimmed)\n const page = resolvePage(pageRoute, sitePages)\n const pageSections = getSectionsForPath(sectionsByPath, pageRoute)\n const section = sectionId ? pageSections.find((s) => s.id === sectionId) : undefined\n label = section?.label ?? page.title\n href = trimmed\n }\n\n const afterAnchor = addNavAfterAnchorRef.current\n const { anchor, hrefKey, labelKey, index, order } = insertNavbarItem(href, label, afterAnchor)\n applyLinkByKey(hrefKey, href)\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${labelKey}\"]`).forEach((el) => {\n el.textContent = label\n })\n\n const navCount = String(index + 1)\n const orderJson = JSON.stringify(order)\n editContentRef.current = {\n ...editContentRef.current,\n [hrefKey]: href,\n [labelKey]: label,\n [NAV_COUNT_KEY]: navCount,\n [NAV_ORDER_KEY]: orderJson,\n }\n\n postToParent({\n type: 'ow:change',\n nodes: [\n { key: hrefKey, text: href },\n { key: labelKey, text: label },\n { key: NAV_COUNT_KEY, text: navCount },\n { key: NAV_ORDER_KEY, text: orderJson },\n ],\n })\n postToParent({ type: 'ow:toast', title: 'Link added', toastType: 'success' })\n\n addNavAfterAnchorRef.current = null\n setLinkPopover(null)\n enforceLinkHrefs()\n\n requestAnimationFrame(() => {\n selectRef.current(anchor)\n })\n return\n }\n\n const { key } = session\n applyLinkByKey(key, target)\n postToParent({ type: 'ow:change', nodes: [{ key, text: target }] })\n setLinkPopover(null)\n },\n [postToParent, sitePages, sectionsByPath]\n )\n\n const showEditLink = toolbarShowEditLink\n const currentSections = sectionsByPath[pathname] ?? []\n linkPopoverOpenRef.current = linkPopover !== null\n\n const handleMediaReplace = useCallback(\n (key: string) => {\n postToParent({ type: 'ow:image-pick', key, elementType: mediaHover?.elementType ?? 'image' })\n },\n [postToParent, mediaHover?.elementType],\n )\n\n // Ask the parent to open the gallery modal for this carousel, seeded with the current slides.\n // The parent owns the modal + uploads (it holds the editor credentials); it echoes edits back\n // via ow:carousel-change.\n const handleEditCarousel = useCallback(\n (key: string) => {\n postToParent({ type: 'ow:carousel-open', key, images: readCarouselValue(key) })\n },\n [postToParent],\n )\n\n const handleMediaFadeOutComplete = useCallback((key: string) => {\n setUploadingRects((prev) => {\n if (!(key in prev)) return prev\n const next = { ...prev }\n delete next[key]\n return next\n })\n }, [])\n\n /**\n * Autoplay / mute toggles. The `<video>` lives in this document, so this mutates it directly —\n * the old `ow:video-settings` → parent → `ow:video-settings-applied` round-trip existed only\n * because the toggles were rendered in the parent frame, and is now gone. The element's\n * *resulting* state is read back (browsers block autoplay on unmuted video), so the toggles\n * reflect what actually happened, not what was asked for.\n */\n const handleVideoSettingsChange = useCallback(\n (key: string, settings: { autoplay?: boolean; muted?: boolean }) => {\n document.querySelectorAll<HTMLElement>(`[data-ohw-key=\"${key}\"]`).forEach((el) => {\n const video = getVideoEl(el)\n if (!video) return\n\n if (typeof settings.autoplay === 'boolean') video.autoplay = settings.autoplay\n if (typeof settings.muted === 'boolean') video.muted = settings.muted\n syncVideoPlayback(video)\n\n postToParent({\n type: 'ow:change',\n nodes: [\n { key: `${key}${VIDEO_AUTOPLAY_SUFFIX}`, text: String(video.autoplay) },\n { key: `${key}${VIDEO_MUTED_SUFFIX}`, text: String(video.muted) },\n ],\n })\n\n setMediaHover((prev) =>\n prev && prev.key === key\n ? { ...prev, videoAutoplay: video.autoplay, videoMuted: video.muted }\n : prev,\n )\n })\n },\n [postToParent],\n )\n\n return bridgeRoot ? createPortal(\n <>\n <div ref={attachVisibleViewport} data-ohw-visible-viewport=\"\" aria-hidden />\n\n {/* Uploading skeletons — keyed by upload, not by hover, so they persist if the cursor leaves. */}\n {Object.entries(uploadingRects).map(([key, { rect, fadingOut }]) => (\n <MediaOverlay\n key={`uploading-${key}`}\n hover={{ key, rect, elementType: 'image', isDragOver: false, hasTextOverlap: false }}\n isUploading\n fadingOut={fadingOut}\n onFadeOutComplete={handleMediaFadeOutComplete}\n onReplace={handleMediaReplace}\n />\n ))}\n\n {mediaHover && !(mediaHover.key in uploadingRects) && (\n <MediaOverlay\n hover={mediaHover}\n isUploading={false}\n onReplace={handleMediaReplace}\n onVideoSettingsChange={handleVideoSettingsChange}\n />\n )}\n {/* Suppressed while the link editor is open — it renders in this same document, and the\n overlay's z-index would otherwise paint the gallery chrome over the modal. */}\n {carouselHover && !linkPopover && !isItemDragging && (\n <CarouselOverlay hover={carouselHover} onEdit={handleEditCarousel} />\n )}\n {siblingHintRect && !linkPopover && !isItemDragging && siblingHintRects.length === 0 && (\n <ItemInteractionLayer rect={siblingHintRect} state=\"sibling-hint\" />\n )}\n {siblingHintRects.length > 0 &&\n !linkPopover &&\n !isItemDragging &&\n siblingHintRects.map((rect, i) => (\n <ItemInteractionLayer key={`sibling-hint-${i}`} rect={rect} state=\"sibling-hint\" />\n ))}\n {isItemDragging &&\n draggedItemRect &&\n selectedElRef.current !== footerDragRef.current?.draggedEl &&\n selectedElRef.current !== navDragRef.current?.draggedEl && (\n <ItemInteractionLayer rect={draggedItemRect} state=\"dragging\" />\n )}\n {isItemDragging &&\n footerDropSlots.map((slot, i) => (\n <div\n key={`footer-drop-${slot.direction}-${slot.columnIndex}-${slot.insertIndex}-${i}`}\n className=\"pointer-events-none fixed z-2147483646\"\n style={{\n left: slot.left,\n top: slot.top,\n width: slot.width,\n height: slot.height,\n }}\n >\n <DropIndicator\n direction={slot.direction}\n state={activeFooterDropIndex === i ? 'dragActive' : 'dragIdle'}\n className=\"!h-full !w-full\"\n />\n </div>\n ))}\n {isItemDragging &&\n navDropSlots.map((slot, i) => (\n <div\n key={`nav-drop-${slot.direction}-${slot.parentId ?? 'root'}-${slot.insertIndex}-${i}`}\n className=\"pointer-events-none fixed z-2147483646\"\n style={{\n left: slot.left,\n top: slot.top,\n width: slot.width,\n height: slot.height,\n }}\n >\n <DropIndicator\n direction={slot.direction}\n state={activeNavDropIndex === i ? 'dragActive' : 'dragIdle'}\n className=\"!h-full !w-full\"\n />\n </div>\n ))}\n {hoveredNavContainerRect &&\n (toolbarVariant !== 'select-frame' || isFooterFrameSelection) &&\n !linkPopover &&\n !isItemDragging && (\n <ItemInteractionLayer rect={hoveredNavContainerRect} state=\"hover\" />\n )}\n {hoveredItemRect &&\n !linkPopover &&\n !hoveredNavContainerRect &&\n !isItemDragging &&\n hoveredItemElRef.current !== selectedElRef.current && (\n <ItemInteractionLayer rect={hoveredItemRect} state=\"hover\" />\n )}\n {toolbarVariant === 'select-frame' &&\n toolbarRect &&\n !linkPopover &&\n !isItemDragging &&\n !isFooterFrameSelection &&\n selectedElRef.current &&\n isNavbarLinksContainer(selectedElRef.current) && (\n <NavbarContainerChrome rect={toolbarRect} onAdd={handleAddTopLevelNavItem} />\n )}\n {toolbarVariant === 'select-frame' &&\n toolbarRect &&\n !linkPopover &&\n !isItemDragging &&\n !isFooterFrameSelection &&\n selectedElRef.current &&\n isFooterLinksContainer(selectedElRef.current) && (\n <FooterContainerChrome\n rect={toolbarRect}\n onAdd={handleAddFooterColumn}\n addDisabled={!canAddFooterColumn()}\n />\n )}\n {toolbarRect &&\n !linkPopover &&\n (toolbarVariant === 'link-action' || toolbarVariant === 'select-frame') && (\n <ItemInteractionLayer\n rect={\n isItemDragging &&\n draggedItemRect &&\n (footerDragRef.current?.wasSelected || navDragRef.current?.wasSelected)\n ? draggedItemRect\n : toolbarRect\n }\n elRef={glowElRef}\n state={\n isItemDragging\n ? 'dragging'\n : resolveItemInteractionState(toolbarRect, parentScrollRef.current)\n }\n showHandle={\n (toolbarVariant === 'link-action' && Boolean(reorderHrefKey)) ||\n (toolbarVariant === 'select-frame' && isFooterFrameSelection)\n }\n dragDisabled={reorderDragDisabled}\n dragHandleLabel={reorderHrefKey ? `Reorder ${reorderHrefKey}` : 'Reorder item'}\n onDragHandleDragStart={handleItemDragStart}\n onDragHandleDragEnd={handleItemDragEnd}\n onItemPointerDown={handleItemChromePointerDown}\n onItemClick={handleItemChromeClick}\n // Column frame: no full-bleed surface — child links keep grab cursor + hover.\n itemDragSurface={!isFooterFrameSelection}\n toolbar={\n toolbarVariant === 'link-action' && !isItemDragging ? (\n <ItemActionToolbar\n onEditLink={openLinkPopoverForSelected}\n onSelectParent={handleSelectParent}\n onDuplicate={handleDuplicateSelected}\n addItemDisabled\n editLinkDisabled={false}\n moreDisabled={false}\n showAddItem={!selectedIsCta}\n showMore={!selectedIsCta}\n />\n ) : undefined\n }\n />\n )}\n {toolbarRect && toolbarVariant === 'rich-text' && !linkPopover && (\n <>\n <EditGlowChrome\n rect={toolbarRect}\n elRef={glowElRef}\n reorderHrefKey={reorderHrefKey}\n dragDisabled={reorderDragDisabled}\n hideHandle={isItemDragging}\n />\n <FloatingToolbar\n rect={toolbarRect}\n parentScroll={parentScrollRef.current}\n elRef={toolbarElRef}\n onCommand={handleCommand}\n activeCommands={activeCommands}\n showEditLink={showEditLink}\n onEditLink={openLinkPopoverForActive}\n />\n </>\n )}\n {maxBadge && (\n <div\n data-ohw-max-badge=\"\"\n style={{\n position: 'fixed',\n top: maxBadge.rect.bottom + 4,\n left: maxBadge.rect.right,\n transform: 'translateX(-100%)',\n zIndex: 2147483647,\n background: maxBadge.current > maxBadge.max ? '#FEF2F2' : '#F5F5F4',\n color: maxBadge.current > maxBadge.max ? '#DC2626' : '#78716C',\n border: `1px solid ${maxBadge.current > maxBadge.max ? '#FECACA' : '#E7E5E4'}`,\n borderRadius: 4,\n padding: '2px 6px',\n fontSize: 11,\n fontWeight: 500,\n pointerEvents: 'none',\n }}\n >\n {maxBadge.current}/{maxBadge.max}\n </div>\n )}\n {toggleState && !linkPopover && (\n <StateToggle\n rect={toggleState.rect}\n activeState={toggleState.activeState}\n states={toggleState.states}\n onStateChange={handleStateChange}\n />\n )}\n {sectionGap && !linkPopover && (\n <div\n data-ohw-section-insert-line=\"\"\n className=\"fixed left-0 w-full z-2147483646 flex items-center pointer-events-none\"\n style={{ top: sectionGap.y, transform: 'translateY(-50%)' }}\n >\n <div className=\"flex-1 bg-primary\" style={{ height: 3 }} />\n <Badge\n className=\"px-8 py-1 bg-primary hover:bg-primary text-primary-foreground text-xs font-medium shrink-0 rounded-full cursor-pointer pointer-events-auto\"\n onClick={() => {\n window.parent.postMessage(\n {\n type: 'ow:add-section',\n insertAfter: sectionGap.insertAfter,\n insertBefore: sectionGap.insertBefore,\n },\n '*',\n )\n }}\n >\n Add Section\n </Badge>\n <div className=\"flex-1 bg-primary\" style={{ height: 3 }} />\n </div>\n )}\n {linkPopover && dialogPortalContainer ? (\n <LinkPopover\n key={linkPopover.key}\n panelRef={linkPopoverPanelRef}\n portalContainer={dialogPortalContainer}\n open\n mode={linkPopover.mode ?? 'edit'}\n pages={sitePages}\n sections={currentSections}\n sectionsByPath={sectionsByPath}\n initialTarget={linkPopover.target}\n existingTargets={linkPopover.intent === 'add-nav' ? getNavbarExistingTargets() : []}\n onClose={closeLinkPopover}\n onSubmit={handleLinkPopoverSubmit}\n />\n ) : null}\n </>,\n bridgeRoot\n )\n : null\n}\n","/** Authoritative href values for `[data-ohw-href-key]` anchors (survives React re-renders). */\nconst linkHrefStore = new Map<string, string>()\n\nexport function setStoredLinkHref(key: string, href: string) {\n linkHrefStore.set(key, href)\n}\n\nexport function getStoredLinkHref(key: string): string | undefined {\n return linkHrefStore.get(key)\n}\n\n/** Restore saved hrefs when React reconciliation resets anchor attributes. */\nexport function enforceLinkHrefs() {\n document.querySelectorAll<HTMLElement>('[data-ohw-href-key]').forEach((el) => {\n const key = el.getAttribute('data-ohw-href-key') ?? ''\n if (!key) return\n const saved = linkHrefStore.get(key)\n if (saved === undefined) return\n if (el.getAttribute('href') !== saved) el.setAttribute('href', saved)\n })\n}\n","import { useLayoutEffect } from 'react'\nimport { enforceLinkHrefs } from './linkHrefStore'\n\n/** Keeps bridge-managed link hrefs stable across React re-renders. */\nexport function useLinkHrefGuardian(...deps: unknown[]) {\n useLayoutEffect(() => {\n let debounceTimer: ReturnType<typeof setTimeout> | null = null\n\n const scheduleEnforce = () => {\n if (debounceTimer) clearTimeout(debounceTimer)\n debounceTimer = setTimeout(enforceLinkHrefs, 50)\n }\n\n enforceLinkHrefs()\n\n const observer = new MutationObserver(scheduleEnforce)\n observer.observe(document.body, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['href'],\n })\n\n return () => {\n observer.disconnect()\n if (debounceTimer) clearTimeout(debounceTimer)\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, deps)\n}\n","'use client'\nimport React, { useCallback, useEffect, useId, useMemo, useRef, useState } from 'react'\nimport { EmailCaptureModal } from './EmailCaptureModal'\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\ninterface ScheduleClassWeekday { weekday: number }\ninterface ScheduleClassFixedDate { date: string } // DD-MM-YYYY\ninterface ScheduleClassBooking { classDate?: string | Date }\n\ninterface ScheduleClass {\n id?: string\n name: string\n description?: string | null\n hostName: string\n duration: number\n maxParticipants: number\n showAvailability?: boolean\n price?: string | number | null\n currency?: string\n startTime: { hour: string; minutes: string; time: string }\n weekdays?: ScheduleClassWeekday[]\n fixedDates?: ScheduleClassFixedDate[]\n bookings?: ScheduleClassBooking[]\n}\n\ninterface Schedule {\n id: string\n name: string\n description?: string | null\n type: string\n timezone?: string | null\n classes?: ScheduleClass[]\n}\n\n// ── Constants ─────────────────────────────────────────────────────────────────\n\nconst API_URL =\n (process.env.NEXT_PUBLIC_FLOWOPS_API_URL as string | undefined) ??\n 'https://flowops-backend-staging-2yfdh7pwpq-as.a.run.app'\n\nconst DAY_ABBR = ['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT']\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\nfunction classRunsOnDate(cls: ScheduleClass, date: Date, type: string): boolean {\n if (type === 'FIXED') {\n const d = String(date.getDate()).padStart(2, '0')\n const m = String(date.getMonth() + 1).padStart(2, '0')\n return cls.fixedDates?.some((fd) => fd.date === `${d}-${m}-${date.getFullYear()}`) ?? false\n }\n return cls.weekdays?.some((w) => w.weekday === date.getDay()) ?? false\n}\n\nfunction formatClassTime(cls: ScheduleClass): string {\n let h = parseInt(cls.startTime.hour, 10)\n const m = parseInt(cls.startTime.minutes, 10)\n if (cls.startTime.time === 'PM' && h !== 12) h += 12\n if (cls.startTime.time === 'AM' && h === 12) h = 0\n const endTotal = h * 60 + m + cls.duration\n const eh = Math.floor(endTotal / 60) % 24\n const em = endTotal % 60\n return `${h}:${cls.startTime.minutes}-${eh}:${String(em).padStart(2, '0')}`\n}\n\nfunction formatBookingLabel(cls: ScheduleClass): string {\n const price = cls.price\n const isFree = price === null || price === undefined || `${price}` === '' || `${price}` === '0'\n return isFree ? 'Book for free' : `Book for ${cls.currency ?? ''} ${price}`.trim()\n}\n\nfunction getBookingsOnDate(cls: ScheduleClass, date: Date): number {\n if (!cls.bookings?.length) return 0\n const target = new Date(date)\n target.setHours(0, 0, 0, 0)\n return cls.bookings.filter((b) => {\n try {\n const bookingDate = new Date(b.classDate as string)\n bookingDate.setHours(0, 0, 0, 0)\n return bookingDate.getTime() === target.getTime()\n } catch {\n return false\n }\n }).length\n}\n\nfunction buildTimezoneLabel(tz: string): string {\n try {\n const now = new Date()\n const timeStr = new Intl.DateTimeFormat('en-US', {\n hour: '2-digit', minute: '2-digit', hour12: false, timeZone: tz,\n }).format(now)\n const offsetPart = new Intl.DateTimeFormat('en-US', { timeZoneName: 'short', timeZone: tz })\n .formatToParts(now)\n .find((p) => p.type === 'timeZoneName')?.value ?? ''\n const city = tz.split('/').pop()?.replace(/_/g, ' ') ?? tz\n return `${timeStr} (${offsetPart}) ${city} time`\n } catch { return tz }\n}\n\n// ── Empty state ───────────────────────────────────────────────────────────────\n\nfunction EmptyState({ inEditor, insertAfter }: { inEditor: boolean; insertAfter: string }) {\n const handleAddSchedule = () => {\n if (inEditor) {\n window.parent.postMessage({ type: 'ow:scheduling-not-connected', insertAfter }, '*')\n }\n }\n\n return (\n <div className=\"flex flex-col items-center justify-center gap-6 p-12 bg-[#FAFAF9] border-2 border-dashed border-[#E7E5E4] rounded-[10px] h-[264px] w-full box-border\">\n <div className=\"w-10 h-10 bg-[#F5F5F4] rounded-[10px] flex items-center justify-center shrink-0\">\n <svg width=\"20\" height=\"20\" viewBox=\"0 0 24 24\" fill=\"none\"\n stroke=\"var(--color-accent, #A89B83)\" strokeWidth=\"1.5\"\n strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <rect x=\"3\" y=\"4\" width=\"18\" height=\"18\" rx=\"2\" />\n <line x1=\"16\" y1=\"2\" x2=\"16\" y2=\"6\" />\n <line x1=\"8\" y1=\"2\" x2=\"8\" y2=\"6\" />\n <line x1=\"3\" y1=\"10\" x2=\"21\" y2=\"10\" />\n <line x1=\"12\" y1=\"14\" x2=\"12\" y2=\"18\" />\n <line x1=\"10\" y1=\"16\" x2=\"14\" y2=\"16\" />\n </svg>\n </div>\n <div className=\"flex flex-col items-center gap-2\">\n <p className=\"font-body text-lg font-medium text-center text-[#0A0A0A] m-0\">\n No schedule yet\n </p>\n <p className=\"font-body text-base font-normal text-center text-(--color-accent,#A89B83) m-0\">\n Add a scheduling widget to get instant bookings.\n </p>\n </div>\n <button\n onClick={handleAddSchedule}\n className=\"h-9 px-2 py-1.5 flex items-center justify-center bg-white border border-[#E7E5E4] rounded-md font-body text-sm font-medium text-(--color-dark,#200C02) cursor-pointer\"\n >\n Add Schedule\n </button>\n </div>\n )\n}\n\n// ── Loading skeleton ──────────────────────────────────────────────────────────\n\nfunction LoadingSkeleton() {\n const shimmer: React.CSSProperties = {\n background: 'linear-gradient(90deg,#f0f0f0 25%,#e8e8e8 50%,#f0f0f0 75%)',\n backgroundSize: '200% 100%',\n animation: 'ohw-shimmer 1.5s infinite',\n }\n return (\n <div className=\"w-full flex flex-col gap-10\">\n <style>{`@keyframes ohw-shimmer{0%{background-position:200% 0}100%{background-position:-200% 0}}`}</style>\n <div className=\"flex h-[70px] items-stretch\">\n {Array.from({ length: 7 }).map((_, i) => (\n <div key={i} className=\"flex-1 flex flex-col justify-between items-center px-1\">\n <div style={{ ...shimmer, width: '32px', height: '14px', borderRadius: '4px' }} />\n <div style={{ ...shimmer, width: '40px', height: '40px', borderRadius: '50%' }} />\n </div>\n ))}\n </div>\n {[0, 1, 2].map((i) => (\n <div key={i}>\n {/* Mobile skeleton: 2-column */}\n <div className=\"flex gap-4 py-4 sm:hidden\">\n <div className=\"flex flex-col gap-2 shrink-0\">\n <div style={{ ...shimmer, width: '100px', height: '16px', borderRadius: '4px' }} />\n <div style={{ ...shimmer, width: '52px', height: '20px', borderRadius: '999px' }} />\n <div style={{ ...shimmer, width: '60px', height: '14px', borderRadius: '4px' }} />\n </div>\n <div className=\"flex flex-1 flex-col gap-2\">\n <div style={{ ...shimmer, width: '75%', height: '16px', borderRadius: '4px' }} />\n <div style={{ ...shimmer, width: '50%', height: '14px', borderRadius: '4px' }} />\n <div style={{ ...shimmer, width: '100%', height: '44px', borderRadius: '8px' }} />\n </div>\n </div>\n {/* Desktop skeleton: flat row */}\n <div className=\"hidden sm:flex items-center gap-[60px] py-4\">\n <div style={{ ...shimmer, width: '120px', height: '16px', borderRadius: '4px', flexShrink: 0 }} />\n <div className=\"flex-1 flex flex-col gap-2\">\n <div style={{ ...shimmer, width: '55%', height: '16px', borderRadius: '4px' }} />\n <div style={{ ...shimmer, width: '38%', height: '14px', borderRadius: '4px' }} />\n </div>\n <div style={{ ...shimmer, width: '56px', height: '32px', borderRadius: '4px', flexShrink: 0 }} />\n <div style={{ ...shimmer, width: '200px', height: '44px', borderRadius: '8px', flexShrink: 0 }} />\n </div>\n {i < 2 && <div className=\"h-px bg-black/20\" />}\n </div>\n ))}\n </div>\n )\n}\n\n// ── Schedule view ─────────────────────────────────────────────────────────────\n\nfunction ScheduleView({ schedule, dates, selectedIdx, onSelectDate, onOpenModal }: {\n schedule: Schedule\n dates: Date[]\n selectedIdx: number\n onSelectDate: (i: number) => void\n onOpenModal?: (mode: 'book' | 'waitlist', classId: string, classDate: Date) => void\n}) {\n const todayMs = useMemo(() => { const d = new Date(); d.setHours(0,0,0,0); return d.getTime() }, [])\n const scrollRef = useRef<HTMLDivElement>(null)\n const [canScrollLeft, setCanScrollLeft] = useState(false)\n const [canScrollRight, setCanScrollRight] = useState(false)\n\n const updateScrollState = () => {\n const el = scrollRef.current\n if (!el) return\n setCanScrollLeft(el.scrollLeft > 0)\n setCanScrollRight(el.scrollLeft + el.clientWidth < el.scrollWidth - 1)\n }\n\n useEffect(() => {\n const el = scrollRef.current\n if (!el) return\n updateScrollState()\n el.addEventListener('scroll', updateScrollState)\n const ro = new ResizeObserver(updateScrollState)\n ro.observe(el)\n return () => { el.removeEventListener('scroll', updateScrollState); ro.disconnect() }\n }, [dates])\n\n const scroll = (dir: 'left' | 'right') => {\n scrollRef.current?.scrollBy({ left: dir === 'left' ? -216 : 216, behavior: 'smooth' })\n }\n\n // Mouse drag-to-scroll\n const isDragging = useRef(false)\n const dragStartX = useRef(0)\n const dragStartScrollLeft = useRef(0)\n\n const onDragStart = (e: React.MouseEvent) => {\n if (!scrollRef.current) return\n isDragging.current = true\n dragStartX.current = e.clientX\n dragStartScrollLeft.current = scrollRef.current.scrollLeft\n scrollRef.current.style.cursor = 'grabbing'\n scrollRef.current.style.userSelect = 'none'\n }\n\n const onDragMove = (e: React.MouseEvent) => {\n if (!isDragging.current || !scrollRef.current) return\n const delta = e.clientX - dragStartX.current\n scrollRef.current.scrollLeft = dragStartScrollLeft.current - delta\n }\n\n const onDragEnd = () => {\n if (!scrollRef.current) return\n isDragging.current = false\n scrollRef.current.style.cursor = 'grab'\n scrollRef.current.style.userSelect = ''\n }\n\n const datesWithClasses = useMemo(() =>\n new Set(dates.map((d, i) =>\n schedule.classes?.some((c) => classRunsOnDate(c, d, schedule.type)) ? i : -1\n ).filter((i) => i >= 0))\n , [dates, schedule])\n\n const selectedDate = dates[selectedIdx]\n\n const selectedClasses = useMemo(() =>\n (schedule.classes ?? []).filter((c) => selectedDate && classRunsOnDate(c, selectedDate, schedule.type))\n , [schedule, selectedDate])\n\n return (\n <div className=\"w-full flex flex-col gap-10\">\n\n {/* Calendar strip */}\n <div className=\"relative w-full\">\n {/* Desktop scroll arrows (hidden on mobile) */}\n {canScrollLeft && (\n <button\n onClick={() => scroll('left')}\n className=\"hidden sm:flex absolute left-0 top-1/2 -translate-y-1/2 z-10 w-8 h-8 items-center justify-center rounded-full border-none cursor-pointer\"\n style={{ background: 'var(--color-light,#FEFFF0)', boxShadow: '0 1px 4px rgba(0,0,0,0.15)' }}\n aria-label=\"Scroll left\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--color-dark,#200C02)\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"15 18 9 12 15 6\" />\n </svg>\n </button>\n )}\n {canScrollRight && (\n <button\n onClick={() => scroll('right')}\n className=\"hidden sm:flex absolute right-0 top-1/2 -translate-y-1/2 z-10 w-8 h-8 items-center justify-center rounded-full border-none cursor-pointer\"\n style={{ background: 'var(--color-light,#FEFFF0)', boxShadow: '0 1px 4px rgba(0,0,0,0.15)' }}\n aria-label=\"Scroll right\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"var(--color-dark,#200C02)\" strokeWidth=\"2.5\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <polyline points=\"9 18 15 12 9 6\" />\n </svg>\n </button>\n )}\n {/* Mobile gradient fades (hidden on desktop) */}\n {canScrollLeft && (\n <div\n className=\"sm:hidden absolute left-0 top-0 bottom-0 w-10 z-10 pointer-events-none\"\n style={{ background: 'linear-gradient(to right, var(--color-light,#FEFFF0), transparent)' }}\n />\n )}\n {canScrollRight && (\n <div\n className=\"sm:hidden absolute right-0 top-0 bottom-0 w-10 z-10 pointer-events-none\"\n style={{ background: 'linear-gradient(to left, var(--color-light,#FEFFF0), transparent)' }}\n />\n )}\n <div\n ref={scrollRef}\n className=\"overflow-x-auto w-full\"\n style={{ scrollbarWidth: 'none', msOverflowStyle: 'none', touchAction: 'pan-x', cursor: 'grab' }}\n onMouseDown={onDragStart}\n onMouseMove={onDragMove}\n onMouseUp={onDragEnd}\n onMouseLeave={onDragEnd}\n >\n {/* width: max(100%, total-min) → fills parent when wide, causes scroll when narrow */}\n <div className=\"flex\" style={{ width: `max(100%, ${dates.length * 60}px)` }}>\n {dates.map((date, i) => {\n const isToday = date.getTime() === todayMs\n const isSelected = i === selectedIdx\n const clickable = datesWithClasses.has(i)\n const label = isToday ? 'TODAY' : DAY_ABBR[date.getDay()]\n return (\n <div\n key={i}\n onClick={() => clickable && onSelectDate(i)}\n className={`flex-1 h-[70px] flex flex-col justify-between items-center ${clickable ? 'cursor-pointer opacity-100' : 'cursor-default opacity-50'}`}\n >\n <span className=\"font-body text-base font-normal text-center text-(--color-dark,#200C02)\">\n {label}\n </span>\n <div\n className=\"w-10 h-10 rounded-full flex items-center justify-center\"\n style={{ background: isSelected ? 'var(--color-primary, #3D312B)' : 'transparent' }}\n >\n <span\n className=\"font-body text-xl font-bold text-center tracking-display-tight\"\n style={{ color: isSelected ? 'var(--color-light, #FEFFF0)' : 'var(--color-dark, #200C02)' }}\n >\n {date.getDate()}\n </span>\n </div>\n </div>\n )\n })}\n </div>\n </div>\n </div>\n\n {/* Class list */}\n {selectedClasses.length === 0 ? (\n <p className=\"font-body text-base text-(--color-accent,#A89B83) text-center py-8 m-0\">\n No classes scheduled for this day.\n </p>\n ) : (\n <div className=\"flex flex-col\">\n {selectedClasses.map((cls, i) => {\n const booked = getBookingsOnDate(cls, selectedDate)\n const available = cls.maxParticipants - booked\n const isFull = available <= 0\n const isPrivate = cls.maxParticipants === 1\n return (\n <div key={cls.id ?? i}>\n {/*\n Mobile: 2-column layout (left: time+badge+spots, right: name+instructor+button)\n Desktop (sm+): flat single-row via sm:contents on the two grouping divs\n */}\n <div className=\"flex gap-4 py-4 sm:items-center sm:gap-[60px] box-border\">\n\n {/* Left col on mobile / Time on desktop */}\n <div className=\"flex flex-col gap-2 shrink-0 sm:contents\">\n\n {/* Time + badge (stacked, visible on both mobile and desktop) */}\n <div className=\"flex flex-col gap-2 sm:w-[120px] sm:shrink-0\">\n <span className=\"font-body text-base font-bold text-(--color-dark,#200C02) block\">\n {formatClassTime(cls)}\n </span>\n <span\n className=\"inline-flex items-center px-2 py-0.5 rounded-full text-xs font-medium w-fit\"\n style={isPrivate\n ? { background: '#DDFBE3', color: '#199130', border: '1px solid #199130', fontWeight: 500 }\n : { background: '#EEEDFF', color: '#5953FF', border: '1px solid #5953FF', fontWeight: 500 }}\n >\n {isPrivate ? 'PRIVATE' : 'GROUP'}\n </span>\n </div>\n\n {/* Spots — mobile only. Hidden per-class via the availability toggle (OHH-313). */}\n {cls.showAvailability !== false && (\n <div className=\"sm:hidden flex flex-col gap-px\">\n {isFull ? (\n <span className=\"font-body text-sm text-(--color-dark,#200C02) opacity-80\">Full</span>\n ) : (\n <>\n <span className=\"font-body text-sm text-(--color-dark,#200C02) opacity-80\">\n {available}/{cls.maxParticipants}\n </span>\n <span className=\"font-body text-sm text-(--color-dark,#200C02) opacity-80\">\n available\n </span>\n </>\n )}\n </div>\n )}\n </div>\n\n {/* Right col on mobile / Class info + spots + button on desktop */}\n <div className=\"flex flex-1 flex-col gap-2 min-w-0 sm:contents\">\n\n {/* Class name + instructor */}\n <div className=\"flex-1 flex flex-col gap-2 min-w-0\">\n <span className=\"font-body text-base font-bold text-(--color-dark,#200C02) block truncate\">\n {cls.name}\n </span>\n {cls.hostName && (\n <span className=\"font-body text-base font-normal text-(--color-dark,#200C02) opacity-80 block truncate\">\n {cls.hostName}\n </span>\n )}\n {cls.description && (\n <span\n className=\"font-body text-base font-normal text-(--color-dark,#200C02) opacity-80 block\"\n style={{ wordBreak: 'break-word' }}\n >\n {cls.description}\n </span>\n )}\n </div>\n\n {/* Spots — desktop only. Hidden per-class via the availability toggle (OHH-313). */}\n {cls.showAvailability !== false && (\n <div className=\"hidden sm:flex w-14 shrink-0 flex-col gap-px\">\n {isFull ? (\n <span className=\"font-body text-sm text-(--color-dark,#200C02) opacity-80\">Full</span>\n ) : (\n <>\n <span className=\"font-body text-sm text-(--color-dark,#200C02) opacity-80\">\n {available}/{cls.maxParticipants}\n </span>\n <span className=\"font-body text-sm text-(--color-dark,#200C02) opacity-80\">\n available\n </span>\n </>\n )}\n </div>\n )}\n\n {/* CTA button */}\n <button\n className=\"w-full sm:w-[200px] sm:shrink-0 px-5 py-[10px] flex items-center justify-center rounded-lg font-body text-base font-bold cursor-pointer box-border\"\n style={isFull ? {\n background: 'transparent',\n border: '1px solid var(--color-dark, #200C02)',\n color: 'var(--color-dark, #200C02)',\n } : {\n background: 'var(--color-primary, #3D312B)',\n border: 'none',\n color: 'var(--color-light, #FEFFF0)',\n }}\n onClick={() => {\n if (!cls.id) return\n onOpenModal?.(isFull ? 'waitlist' : 'book', cls.id, selectedDate)\n }}\n >\n {isFull ? 'Join Waitlist' : formatBookingLabel(cls)}\n </button>\n </div>\n </div>\n {i < selectedClasses.length - 1 && (\n <div className=\"h-px bg-black/20\" />\n )}\n </div>\n )\n })}\n </div>\n )}\n </div>\n )\n}\n\n// ── Scheduling section hover overlay + main component ────────────────────────\n\nfunction CalendarFoldIcon() {\n return (\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\"\n strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" style={{ flexShrink: 0 }}>\n <path d=\"M8 2v4\" />\n <path d=\"M16 2v4\" />\n <path d=\"M21 17V6a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v14a2 2 0 0 0 2 2h11Z\" />\n <path d=\"M3 10h18\" />\n <path d=\"M15 22v-4a2 2 0 0 1 2-2h4\" />\n </svg>\n )\n}\n\n// ── Main component ────────────────────────────────────────────────────────────\n\nexport function SchedulingWidget({ notifyOnConnect = false, initialScheduleId, insertAfter: insertAfterProp }: { notifyOnConnect?: boolean; initialScheduleId?: string | null; insertAfter?: string }) {\n const autoId = useId()\n const insertAfter = insertAfterProp ?? autoId\n const [schedule, setSchedule] = useState<Schedule | null>(null)\n const [loading, setLoading] = useState(true)\n const [inEditor, setInEditor] = useState(false)\n const [isHovered, setIsHovered] = useState(false)\n const [modalState, setModalState] = useState<{ mode: 'book' | 'waitlist'; classId: string; classDate: Date } | null>(null)\n const switchScheduleIdRef = useRef<string | null>(null)\n\n // Holds the resolved live-site schedule id so availability can be refetched after a\n // booking/cancellation without remounting. Only set on the public (non-editor) path.\n const liveScheduleIdRef = useRef<string | null>(null)\n\n const refetchLiveSchedule = useCallback(async () => {\n const id = liveScheduleIdRef.current\n if (!id) return\n try {\n const res = await fetch(`${API_URL}/api/schedule/id/${id}`)\n const data = await res.json()\n if (data?.id) setSchedule(data)\n } catch { /* ignore transient refetch failures */ }\n }, [])\n\n const dates = useMemo(() => {\n const today = new Date(); today.setHours(0, 0, 0, 0)\n return Array.from({ length: 14 }, (_, i) => {\n const d = new Date(today); d.setDate(today.getDate() + i); return d\n })\n }, [])\n\n const [selectedIdx, setSelectedIdx] = useState(0)\n\n useEffect(() => {\n if (!schedule?.classes) return\n for (let i = 0; i < dates.length; i++) {\n if (schedule.classes.some((c) => classRunsOnDate(c, dates[i], schedule.type))) {\n setSelectedIdx(i); return\n }\n }\n }, [schedule, dates])\n\n // A cancellation (or another visitor's booking) happens outside this widget — off the\n // booking-confirmation email link. Refetch when the visitor returns to the tab/window so\n // the freed/taken spot is reflected without a manual reload.\n useEffect(() => {\n if (typeof window === 'undefined') return\n const onVisible = () => { if (!document.hidden) void refetchLiveSchedule() }\n window.addEventListener('focus', refetchLiveSchedule)\n document.addEventListener('visibilitychange', onVisible)\n return () => {\n window.removeEventListener('focus', refetchLiveSchedule)\n document.removeEventListener('visibilitychange', onVisible)\n }\n }, [refetchLiveSchedule])\n\n useEffect(() => {\n if (typeof window === 'undefined') return\n const isInEditor = window.self !== window.top\n setInEditor(isInEditor)\n\n // Shared loading logic invoked directly (known scheduleId) or after config resolution (vibe-coder path).\n function loadWithId(effectiveId: string | null): (() => void) | void {\n if (isInEditor) {\n // null = explicitly cleared — start in empty state without auto-connecting,\n // but still register the listener so ow:switch-schedule can reconnect later.\n const startEmpty = effectiveId === null\n if (startEmpty) setLoading(false)\n\n let initialized = startEmpty // treat as already resolved so the timeout won't override empty state\n const timer = !startEmpty ? setTimeout(() => {\n if (!initialized) { initialized = true; setLoading(false) }\n }, 5000) : null\n const handler = (e: MessageEvent) => {\n if (e.data?.type === 'ow:clear-scheduling-widget') {\n if (!e.data.insertAfter || e.data.insertAfter !== insertAfter) return\n setSchedule(null)\n setLoading(false)\n return\n }\n if (e.data?.type === 'ow:switch-schedule') {\n if (!e.data.insertAfter || e.data.insertAfter !== insertAfter) return\n switchScheduleIdRef.current = e.data.scheduleId ?? null\n initialized = false\n setLoading(true)\n window.parent.postMessage({ type: 'ow:request-user-schedules', insertAfter }, '*')\n return\n }\n if (e.data?.type !== 'ow:user-schedules-response') return\n if (e.data.insertAfter && e.data.insertAfter !== insertAfter) return\n if (initialized && switchScheduleIdRef.current === null) return\n initialized = true\n if (timer) clearTimeout(timer)\n const schedules: Schedule[] = e.data.schedules ?? []\n const isSwitching = switchScheduleIdRef.current !== null\n const target = isSwitching\n ? (schedules.find((s) => s.id === switchScheduleIdRef.current) ?? schedules[0] ?? null)\n : effectiveId\n ? (schedules.find((s) => s.id === effectiveId) ?? schedules[0] ?? null)\n : (schedules[0] ?? null)\n switchScheduleIdRef.current = null\n setSchedule(target)\n setLoading(false)\n if (notifyOnConnect && target && !isSwitching) {\n window.parent.postMessage({\n type: 'ow:schedule-connected',\n schedule: { id: target.id, name: target.name },\n insertAfter,\n }, '*')\n // Persist auto-linked scheduleId so save validation doesn't treat widget as empty\n window.postMessage({ type: 'ow:schedule-linked', scheduleId: target.id, insertAfter }, '*')\n }\n }\n window.addEventListener('message', handler)\n if (!startEmpty) window.parent.postMessage({ type: 'ow:request-user-schedules', insertAfter }, '*')\n return () => { window.removeEventListener('message', handler); if (timer) clearTimeout(timer) }\n }\n\n // Live site: public API. null = explicitly cleared (show nothing), string = fetch by ID.\n if (!effectiveId) {\n setLoading(false)\n return\n }\n liveScheduleIdRef.current = effectiveId\n ;(async () => {\n try {\n const res = await fetch(`${API_URL}/api/schedule/id/${effectiveId}`)\n const data = await res.json()\n setSchedule(data?.id ? data : null)\n } catch { /* ignore */ }\n setLoading(false)\n })()\n }\n\n // Vibe-coder static placement: initialScheduleId is undefined because the widget was\n // placed directly in template JSX. Ask the bridge for the stored scheduleId, then enter\n // the normal loading flow with the resolved value.\n if (initialScheduleId === undefined) {\n let done = false\n let innerCleanup: (() => void) | void\n const timer = setTimeout(() => {\n if (!done) { done = true; setLoading(false) }\n }, 2000)\n const configHandler = (e: MessageEvent) => {\n if (e.data?.type !== 'ow:schedule-config' || e.data.insertAfter !== insertAfter || done) return\n done = true\n clearTimeout(timer)\n window.removeEventListener('message', configHandler)\n innerCleanup = loadWithId(e.data.scheduleId ?? null)\n }\n window.addEventListener('message', configHandler)\n window.postMessage({ type: 'ow:request-schedule-config', insertAfter }, '*')\n return () => {\n window.removeEventListener('message', configHandler)\n clearTimeout(timer)\n innerCleanup?.()\n }\n }\n\n return loadWithId(initialScheduleId) ?? undefined\n }, [])\n\n const timezoneLabel = schedule?.timezone\n ? (() => { try { return buildTimezoneLabel(schedule.timezone) } catch { return undefined } })()\n : undefined\n\n const handleModalSubmit = async (email: string) => {\n if (!modalState) return\n const { mode, classId, classDate } = modalState\n const endpoint = mode === 'book'\n ? `${API_URL}/api/schedule/class/${classId}/booking`\n : `${API_URL}/api/schedule/class/${classId}/waitlist`\n const res = await fetch(endpoint, {\n method: 'POST',\n headers: { 'Content-Type': 'application/json' },\n body: JSON.stringify({ classDate: classDate.toISOString(), email }),\n })\n if (!res.ok) {\n const data = await res.json().catch(() => ({}))\n throw new Error(data?.message ?? 'Something went wrong. Please try again.')\n }\n // Refresh availability so the just-booked/waitlisted spot is reflected immediately.\n await refetchLiveSchedule()\n }\n\n const handleReplaceSchedule = () => {\n setIsHovered(false)\n window.parent.postMessage(\n { type: 'ow:scheduling-not-connected', insertAfter, currentScheduleId: schedule?.id },\n '*'\n )\n }\n\n if (!inEditor && !loading && !schedule) return null\n\n const sectionId = `scheduling-${insertAfter}`\n\n return (\n <section\n data-ohw-section={sectionId}\n data-ohw-scheduling-anchor={insertAfter}\n className=\"w-full box-border py-10 px-5 sm:py-20 sm:px-16 font-body bg-(--color-light,#FEFFF0) relative\"\n onMouseEnter={() => inEditor && setIsHovered(true)}\n onMouseLeave={() => setIsHovered(false)}\n >\n {/* Hover overlay — editor mode only, entire area is clickable */}\n {inEditor && isHovered && !!schedule && (\n <div\n className=\"absolute inset-0 z-10 pointer-events-auto cursor-pointer\"\n onClick={handleReplaceSchedule}\n >\n <div className=\"absolute inset-0\" style={{ background: '#0885FE', opacity: 0.18 }} />\n <div className=\"absolute inset-0\" style={{ boxShadow: 'inset 0 0 0 1.5px #0885FE' }} />\n <div className=\"absolute inset-0 flex items-center justify-center pointer-events-none\">\n <div\n className=\"bg-white border border-[#E7E5E4] rounded-md px-3 py-1.5 flex items-center gap-1.5\"\n style={{\n fontSize: 14,\n lineHeight: '24px',\n fontFamily: \"'Figtree', system-ui, sans-serif\",\n fontWeight: 500,\n color: '#0C0A09',\n }}\n >\n <CalendarFoldIcon />\n Replace schedule\n </div>\n </div>\n </div>\n )}\n\n <div className=\"max-w-[1280px] mx-auto flex flex-col items-center gap-16\">\n\n {/* Heading + subtitle */}\n <div className=\"flex flex-col items-center gap-4\">\n <h2\n className=\"font-display text-center m-0 text-(--color-dark,#200C02)\"\n style={{\n fontSize: 'var(--fs-section-h2, clamp(40px, 4.4vw, 64px))',\n fontWeight: 'var(--font-weight-heading, 400)',\n lineHeight: 1.05,\n letterSpacing: '-0.02em',\n }}\n >\n {schedule?.name ?? 'Book an appointment'}\n </h2>\n {schedule?.description && (\n <p className=\"font-body text-body text-center m-0 text-(--color-accent,#A89B83)\">\n {schedule.description}\n </p>\n )}\n </div>\n\n {/* Schedule card */}\n <div className=\"w-full flex flex-col items-end gap-3\">\n {timezoneLabel && (\n <span className=\"font-body text-sm font-normal text-(--color-accent,#A89B83)\">\n {timezoneLabel}\n </span>\n )}\n <div className=\"w-full p-0 sm:p-10 box-border\">\n {loading ? (\n <LoadingSkeleton />\n ) : !schedule ? (\n <EmptyState inEditor={inEditor} insertAfter={insertAfter} />\n ) : (\n <ScheduleView\n schedule={schedule}\n dates={dates}\n selectedIdx={selectedIdx}\n onSelectDate={setSelectedIdx}\n onOpenModal={inEditor ? undefined : (mode, classId, classDate) => setModalState({ mode, classId, classDate })}\n />\n )}\n </div>\n </div>\n\n </div>\n\n {modalState && (\n <EmailCaptureModal\n title={modalState.mode === 'book' ? 'Confirm your spot' : 'Leave your email'}\n subtitle={modalState.mode === 'book' ? \"We'll send your booking confirmation here.\" : \"We'll let you know when spots open up!\"}\n onSubmit={handleModalSubmit}\n onClose={() => setModalState(null)}\n />\n )}\n </section>\n )\n}\n","import { useState } from 'react'\nimport { Dialog } from 'radix-ui'\n\ninterface Props {\n title: string\n subtitle: string\n onSubmit: (email: string) => Promise<void>\n onClose: () => void\n}\n\nconst isValidEmail = (value: string): boolean => /^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/.test(value)\n\nfunction Spinner() {\n return (\n <svg\n width=\"32\"\n height=\"32\"\n viewBox=\"0 0 32 32\"\n fill=\"none\"\n style={{ animation: 'ohw-spin 0.75s linear infinite' }}\n >\n <style>{`@keyframes ohw-spin { to { transform: rotate(360deg); } }`}</style>\n <circle cx=\"16\" cy=\"16\" r=\"12\" stroke=\"#e5e7eb\" strokeWidth=\"3\" />\n <path\n d=\"M16 4a12 12 0 0 1 12 12\"\n stroke=\"#3b82f6\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n />\n </svg>\n )\n}\n\nexport function EmailCaptureModal({ title, subtitle, onSubmit, onClose }: Props) {\n const [email, setEmail] = useState('')\n const [submittedEmail, setSubmittedEmail] = useState('')\n const [loading, setLoading] = useState(false)\n const [success, setSuccess] = useState(false)\n const [error, setError] = useState<string | null>(null)\n\n const isBook = title === 'Confirm your spot'\n\n const handleSubmit = async () => {\n const trimmed = email.trim()\n if (!trimmed) return\n if (!isValidEmail(trimmed)) {\n setError('Please enter a valid email address.')\n return\n }\n setLoading(true)\n setError(null)\n try {\n await onSubmit(trimmed)\n setSubmittedEmail(trimmed)\n setSuccess(true)\n } catch (e: unknown) {\n setError(e instanceof Error ? e.message : 'Something went wrong. Please try again.')\n } finally {\n setLoading(false)\n }\n }\n\n const handleKeyDown = (e: React.KeyboardEvent) => {\n if (e.key === 'Enter' && !loading) handleSubmit()\n }\n\n return (\n <Dialog.Root open onOpenChange={(open) => { if (!open) onClose() }}>\n <Dialog.Portal>\n <Dialog.Overlay\n className=\"fixed inset-0 z-50\"\n style={{ background: 'rgba(0,0,0,0.45)' }}\n />\n <Dialog.Content\n className=\"fixed left-1/2 top-1/2 z-50 w-full -translate-x-1/2 -translate-y-1/2 bg-white rounded-xl shadow-xl outline-none font-body box-border overflow-hidden\"\n style={{ maxWidth: 400 }}\n >\n {/* Header */}\n <div className=\"flex items-start justify-between gap-3 p-6\">\n <div className=\"flex flex-col gap-1\">\n <Dialog.Title\n className=\"font-body text-xl font-bold m-0 leading-tight\"\n style={{ color: 'var(--color-dark,#200C02)' }}\n >\n {success\n ? isBook ? 'Reservation confirmed!' : \"You're on the waitlist!\"\n : title}\n </Dialog.Title>\n <Dialog.Description\n className=\"font-body text-sm m-0\"\n style={{ color: '#6B7280' }}\n >\n {success\n ? isBook\n ? `A confirmation email has been sent to ${submittedEmail}.`\n : 'We\\'ll let you know via email if someone cancels.'\n : subtitle}\n </Dialog.Description>\n </div>\n <Dialog.Close\n className=\"shrink-0 w-7 h-7 flex items-center justify-center rounded-full bg-transparent border-none cursor-pointer mt-0.5 absolute top-2.5 right-1.5\"\n style={{ color: '#6B7280' }}\n aria-label=\"Close\"\n >\n <svg width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\">\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n </Dialog.Close>\n </div>\n\n {!success && (loading ? (\n /* Loading state — full body replaced */\n <div className=\"flex flex-col items-center justify-center gap-3 px-7 py-12\">\n <Spinner />\n <p className=\"font-body text-sm m-0\" style={{ color: '#6B7280' }}>\n Please wait\n </p>\n </div>\n ) : (\n /* Email form */\n <div className=\"px-7 pt-2 pb-6\">\n <div className=\"flex flex-col gap-1.5 mb-8\">\n <label className=\"font-body text-sm font-medium\" style={{ color: 'var(--color-dark,#200C02)' }}>\n Email\n </label>\n <input\n type=\"email\"\n value={email}\n onChange={(e) => {\n setEmail(e.target.value)\n if (error) setError(null)\n }}\n onKeyDown={handleKeyDown}\n placeholder=\"hello@gmail.com\"\n autoFocus\n className=\"w-full h-10 px-3 rounded-lg border font-body text-sm outline-none box-border\"\n style={{\n borderColor: '#E7E5E4',\n background: '#fff',\n color: 'var(--color-dark,#200C02)',\n }}\n />\n {error && (\n <p className=\"font-body text-xs text-red-500 m-0\">{error}</p>\n )}\n </div>\n\n <div className=\"flex justify-end\">\n <button\n onClick={handleSubmit}\n disabled={!email.trim()}\n className=\"h-9 px-5 rounded-lg font-body text-sm font-semibold cursor-pointer border-none disabled:opacity-50 disabled:cursor-not-allowed\"\n style={{\n background: 'var(--color-primary,#3D312B)',\n color: 'var(--color-light,#FEFFF0)',\n }}\n >\n Send\n </button>\n </div>\n </div>\n ))}\n </Dialog.Content>\n </Dialog.Portal>\n </Dialog.Root>\n )\n}\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\nimport { Toggle } from './toggle'\n\ntype ToggleGroupContextValue = {\n value: string\n onValueChange: (value: string) => void\n}\n\nconst ToggleGroupContext = React.createContext<ToggleGroupContextValue>({\n value: '',\n onValueChange: () => {},\n})\n\nfunction ToggleGroup({\n className,\n value,\n onValueChange,\n children,\n ...props\n}: {\n value: string\n onValueChange: (value: string) => void\n children: React.ReactNode\n} & Omit<React.HTMLAttributes<HTMLDivElement>, 'onChange'>) {\n return (\n <div\n role=\"group\"\n className={cn('flex items-center gap-1 p-1 bg-muted rounded-md', className)}\n {...props}\n >\n <ToggleGroupContext.Provider value={{ value, onValueChange }}>\n {children}\n </ToggleGroupContext.Provider>\n </div>\n )\n}\n\nfunction ToggleGroupItem({\n className,\n value,\n children,\n ...props\n}: {\n value: string\n children: React.ReactNode\n} & Omit<React.ComponentProps<typeof Toggle>, 'pressed' | 'onPressedChange'>) {\n const { value: groupValue, onValueChange } = React.useContext(ToggleGroupContext)\n\n return (\n <Toggle\n pressed={groupValue === value}\n onPressedChange={(pressed) => { if (pressed) onValueChange(value) }}\n className={cn(\n 'text-foreground cursor-pointer hover:bg-transparent hover:text-foreground',\n 'data-[state=on]:bg-background data-[state=on]:shadow-sm',\n 'data-[state=off]:opacity-50 data-[state=off]:hover:opacity-75',\n className\n )}\n {...props}\n >\n {children}\n </Toggle>\n )\n}\n\nexport { ToggleGroup, ToggleGroupItem }\n","function r(e){var t,f,n=\"\";if(\"string\"==typeof e||\"number\"==typeof e)n+=e;else if(\"object\"==typeof e)if(Array.isArray(e)){var o=e.length;for(t=0;t<o;t++)e[t]&&(f=r(e[t]))&&(n&&(n+=\" \"),n+=f)}else for(f in e)e[f]&&(n&&(n+=\" \"),n+=f);return n}export function clsx(){for(var e,t,f=0,n=\"\",o=arguments.length;f<o;f++)(e=arguments[f])&&(t=r(e))&&(n&&(n+=\" \"),n+=t);return n}export default clsx;","/**\n * Concatenates two arrays faster than the array spread operator.\n */\nexport const concatArrays = <T, U>(\n array1: readonly T[],\n array2: readonly U[],\n): readonly (T | U)[] => {\n // Pre-allocate for better V8 optimization\n const combinedArray: (T | U)[] = new Array(array1.length + array2.length)\n for (let i = 0; i < array1.length; i++) {\n combinedArray[i] = array1[i]!\n }\n for (let i = 0; i < array2.length; i++) {\n combinedArray[array1.length + i] = array2[i]!\n }\n return combinedArray\n}\n","import {\n AnyClassGroupIds,\n AnyConfig,\n AnyThemeGroupIds,\n ClassGroup,\n ClassValidator,\n Config,\n ThemeGetter,\n ThemeObject,\n} from './types'\nimport { concatArrays } from './utils'\n\nexport interface ClassPartObject {\n nextPart: Map<string, ClassPartObject>\n validators: ClassValidatorObject[] | null\n classGroupId: AnyClassGroupIds | undefined // Always define optional props for consistent shape\n}\n\ninterface ClassValidatorObject {\n classGroupId: AnyClassGroupIds\n validator: ClassValidator\n}\n\n// Factory function ensures consistent object shapes\nconst createClassValidatorObject = (\n classGroupId: AnyClassGroupIds,\n validator: ClassValidator,\n): ClassValidatorObject => ({\n classGroupId,\n validator,\n})\n\n// Factory ensures consistent ClassPartObject shape\nconst createClassPartObject = (\n nextPart: Map<string, ClassPartObject> = new Map(),\n validators: ClassValidatorObject[] | null = null,\n classGroupId?: AnyClassGroupIds,\n): ClassPartObject => ({\n nextPart,\n validators,\n classGroupId,\n})\n\nconst CLASS_PART_SEPARATOR = '-'\n\nconst EMPTY_CONFLICTS: readonly AnyClassGroupIds[] = []\n// I use two dots here because one dot is used as prefix for class groups in plugins\nconst ARBITRARY_PROPERTY_PREFIX = 'arbitrary..'\n\nexport const createClassGroupUtils = (config: AnyConfig) => {\n const classMap = createClassMap(config)\n const { conflictingClassGroups, conflictingClassGroupModifiers } = config\n\n const getClassGroupId = (className: string) => {\n if (className.startsWith('[') && className.endsWith(']')) {\n return getGroupIdForArbitraryProperty(className)\n }\n\n const classParts = className.split(CLASS_PART_SEPARATOR)\n // Classes like `-inset-1` produce an empty string as first classPart. We assume that classes for negative values are used correctly and skip it.\n const startIndex = classParts[0] === '' && classParts.length > 1 ? 1 : 0\n return getGroupRecursive(classParts, startIndex, classMap)\n }\n\n const getConflictingClassGroupIds = (\n classGroupId: AnyClassGroupIds,\n hasPostfixModifier: boolean,\n ): readonly AnyClassGroupIds[] => {\n if (hasPostfixModifier) {\n const modifierConflicts = conflictingClassGroupModifiers[classGroupId]\n const baseConflicts = conflictingClassGroups[classGroupId]\n\n if (modifierConflicts) {\n if (baseConflicts) {\n // Merge base conflicts with modifier conflicts\n return concatArrays(baseConflicts, modifierConflicts)\n }\n // Only modifier conflicts\n return modifierConflicts\n }\n // Fall back to without postfix if no modifier conflicts\n return baseConflicts || EMPTY_CONFLICTS\n }\n\n return conflictingClassGroups[classGroupId] || EMPTY_CONFLICTS\n }\n\n return {\n getClassGroupId,\n getConflictingClassGroupIds,\n }\n}\n\nconst getGroupRecursive = (\n classParts: string[],\n startIndex: number,\n classPartObject: ClassPartObject,\n): AnyClassGroupIds | undefined => {\n const classPathsLength = classParts.length - startIndex\n if (classPathsLength === 0) {\n return classPartObject.classGroupId\n }\n\n const currentClassPart = classParts[startIndex]!\n const nextClassPartObject = classPartObject.nextPart.get(currentClassPart)\n\n if (nextClassPartObject) {\n const result = getGroupRecursive(classParts, startIndex + 1, nextClassPartObject)\n if (result) return result\n }\n\n const validators = classPartObject.validators\n if (validators === null) {\n return undefined\n }\n\n // Build classRest string efficiently by joining from startIndex onwards\n const classRest =\n startIndex === 0\n ? classParts.join(CLASS_PART_SEPARATOR)\n : classParts.slice(startIndex).join(CLASS_PART_SEPARATOR)\n const validatorsLength = validators.length\n\n for (let i = 0; i < validatorsLength; i++) {\n const validatorObj = validators[i]!\n if (validatorObj.validator(classRest)) {\n return validatorObj.classGroupId\n }\n }\n\n return undefined\n}\n\n/**\n * Get the class group ID for an arbitrary property.\n *\n * @param className - The class name to get the group ID for. Is expected to be string starting with `[` and ending with `]`.\n */\nconst getGroupIdForArbitraryProperty = (className: string): AnyClassGroupIds | undefined =>\n className.slice(1, -1).indexOf(':') === -1\n ? undefined\n : (() => {\n const content = className.slice(1, -1)\n const colonIndex = content.indexOf(':')\n const property = content.slice(0, colonIndex)\n return property ? ARBITRARY_PROPERTY_PREFIX + property : undefined\n })()\n\n/**\n * Exported for testing only\n */\nexport const createClassMap = (config: Config<AnyClassGroupIds, AnyThemeGroupIds>) => {\n const { theme, classGroups } = config\n return processClassGroups(classGroups, theme)\n}\n\n// Split into separate functions to maintain monomorphic call sites\nconst processClassGroups = (\n classGroups: Record<AnyClassGroupIds, ClassGroup<AnyThemeGroupIds>>,\n theme: ThemeObject<AnyThemeGroupIds>,\n): ClassPartObject => {\n const classMap = createClassPartObject()\n\n for (const classGroupId in classGroups) {\n const group = classGroups[classGroupId]!\n processClassesRecursively(group, classMap, classGroupId, theme)\n }\n\n return classMap\n}\n\nconst processClassesRecursively = (\n classGroup: ClassGroup<AnyThemeGroupIds>,\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n theme: ThemeObject<AnyThemeGroupIds>,\n) => {\n const len = classGroup.length\n for (let i = 0; i < len; i++) {\n const classDefinition = classGroup[i]!\n processClassDefinition(classDefinition, classPartObject, classGroupId, theme)\n }\n}\n\n// Split into separate functions for each type to maintain monomorphic call sites\nconst processClassDefinition = (\n classDefinition: ClassGroup<AnyThemeGroupIds>[number],\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n theme: ThemeObject<AnyThemeGroupIds>,\n) => {\n if (typeof classDefinition === 'string') {\n processStringDefinition(classDefinition, classPartObject, classGroupId)\n return\n }\n\n if (typeof classDefinition === 'function') {\n processFunctionDefinition(classDefinition, classPartObject, classGroupId, theme)\n return\n }\n\n processObjectDefinition(\n classDefinition as Record<string, ClassGroup<AnyThemeGroupIds>>,\n classPartObject,\n classGroupId,\n theme,\n )\n}\n\nconst processStringDefinition = (\n classDefinition: string,\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n) => {\n const classPartObjectToEdit =\n classDefinition === '' ? classPartObject : getPart(classPartObject, classDefinition)\n classPartObjectToEdit.classGroupId = classGroupId\n}\n\nconst processFunctionDefinition = (\n classDefinition: Function,\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n theme: ThemeObject<AnyThemeGroupIds>,\n) => {\n if (isThemeGetter(classDefinition)) {\n processClassesRecursively(classDefinition(theme), classPartObject, classGroupId, theme)\n return\n }\n\n if (classPartObject.validators === null) {\n classPartObject.validators = []\n }\n classPartObject.validators.push(\n createClassValidatorObject(classGroupId, classDefinition as ClassValidator),\n )\n}\n\nconst processObjectDefinition = (\n classDefinition: Record<string, ClassGroup<AnyThemeGroupIds>>,\n classPartObject: ClassPartObject,\n classGroupId: AnyClassGroupIds,\n theme: ThemeObject<AnyThemeGroupIds>,\n) => {\n const entries = Object.entries(classDefinition)\n const len = entries.length\n for (let i = 0; i < len; i++) {\n const [key, value] = entries[i]!\n processClassesRecursively(value, getPart(classPartObject, key), classGroupId, theme)\n }\n}\n\nconst getPart = (classPartObject: ClassPartObject, path: string): ClassPartObject => {\n let current = classPartObject\n const parts = path.split(CLASS_PART_SEPARATOR)\n const len = parts.length\n\n for (let i = 0; i < len; i++) {\n const part = parts[i]!\n\n let next = current.nextPart.get(part)\n if (!next) {\n next = createClassPartObject()\n current.nextPart.set(part, next)\n }\n current = next\n }\n\n return current\n}\n\n// Type guard maintains monomorphic check\nconst isThemeGetter = (func: Function): func is ThemeGetter =>\n 'isThemeGetter' in func && (func as ThemeGetter).isThemeGetter === true\n","// Export is needed because TypeScript complains about an error otherwise:\n// Error: …/tailwind-merge/src/config-utils.ts(8,17): semantic error TS4058: Return type of exported function has or is using name 'LruCache' from external module \"…/tailwind-merge/src/lru-cache\" but cannot be named.\nexport interface LruCache<Key extends string, Value> {\n get(key: Key): Value | undefined\n set(key: Key, value: Value): void\n}\n\n// LRU cache implementation using plain objects for simplicity\nexport const createLruCache = <Key extends string, Value>(\n maxCacheSize: number,\n): LruCache<Key, Value> => {\n if (maxCacheSize < 1) {\n return {\n get: () => undefined,\n set: () => {},\n }\n }\n\n let cacheSize = 0\n let cache: Record<Key, Value> = Object.create(null)\n let previousCache: Record<Key, Value> = Object.create(null)\n\n const update = (key: Key, value: Value) => {\n cache[key] = value\n cacheSize++\n\n if (cacheSize > maxCacheSize) {\n cacheSize = 0\n previousCache = cache\n cache = Object.create(null)\n }\n }\n\n return {\n get(key) {\n let value = cache[key]\n\n if (value !== undefined) {\n return value\n }\n if ((value = previousCache[key]) !== undefined) {\n update(key, value)\n return value\n }\n },\n set(key, value) {\n if (key in cache) {\n cache[key] = value\n } else {\n update(key, value)\n }\n },\n }\n}\n","import { AnyConfig, ParsedClassName } from './types'\n\nexport const IMPORTANT_MODIFIER = '!'\n\nconst MODIFIER_SEPARATOR = ':'\nconst EMPTY_MODIFIERS: string[] = []\n\n// Pre-allocated result object shape for consistency\nconst createResultObject = (\n modifiers: string[],\n hasImportantModifier: boolean,\n baseClassName: string,\n maybePostfixModifierPosition?: number,\n isExternal?: boolean,\n): ParsedClassName => ({\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n isExternal,\n})\n\nexport const createParseClassName = (config: AnyConfig) => {\n const { prefix, experimentalParseClassName } = config\n\n /**\n * Parse class name into parts.\n *\n * Inspired by `splitAtTopLevelOnly` used in Tailwind CSS\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v3.2.2/src/util/splitAtTopLevelOnly.js\n */\n let parseClassName = (className: string): ParsedClassName => {\n // Use simple array with push for better performance\n const modifiers: string[] = []\n\n let bracketDepth = 0\n let parenDepth = 0\n let modifierStart = 0\n let postfixModifierPosition: number | undefined\n\n const len = className.length\n for (let index = 0; index < len; index++) {\n const currentCharacter = className[index]!\n\n if (bracketDepth === 0 && parenDepth === 0) {\n if (currentCharacter === MODIFIER_SEPARATOR) {\n modifiers.push(className.slice(modifierStart, index))\n modifierStart = index + 1\n continue\n }\n\n if (currentCharacter === '/') {\n postfixModifierPosition = index\n continue\n }\n }\n\n if (currentCharacter === '[') bracketDepth++\n else if (currentCharacter === ']') bracketDepth--\n else if (currentCharacter === '(') parenDepth++\n else if (currentCharacter === ')') parenDepth--\n }\n\n const baseClassNameWithImportantModifier =\n modifiers.length === 0 ? className : className.slice(modifierStart)\n\n // Inline important modifier check\n let baseClassName = baseClassNameWithImportantModifier\n let hasImportantModifier = false\n\n if (baseClassNameWithImportantModifier.endsWith(IMPORTANT_MODIFIER)) {\n baseClassName = baseClassNameWithImportantModifier.slice(0, -1)\n hasImportantModifier = true\n } else if (\n /**\n * In Tailwind CSS v3 the important modifier was at the start of the base class name. This is still supported for legacy reasons.\n * @see https://github.com/dcastil/tailwind-merge/issues/513#issuecomment-2614029864\n */\n baseClassNameWithImportantModifier.startsWith(IMPORTANT_MODIFIER)\n ) {\n baseClassName = baseClassNameWithImportantModifier.slice(1)\n hasImportantModifier = true\n }\n\n const maybePostfixModifierPosition =\n postfixModifierPosition && postfixModifierPosition > modifierStart\n ? postfixModifierPosition - modifierStart\n : undefined\n\n return createResultObject(\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n )\n }\n\n if (prefix) {\n const fullPrefix = prefix + MODIFIER_SEPARATOR\n const parseClassNameOriginal = parseClassName\n parseClassName = (className: string) =>\n className.startsWith(fullPrefix)\n ? parseClassNameOriginal(className.slice(fullPrefix.length))\n : createResultObject(EMPTY_MODIFIERS, false, className, undefined, true)\n }\n\n if (experimentalParseClassName) {\n const parseClassNameOriginal = parseClassName\n parseClassName = (className: string) =>\n experimentalParseClassName({ className, parseClassName: parseClassNameOriginal })\n }\n\n return parseClassName\n}\n","import { AnyConfig } from './types'\n\n/**\n * Sorts modifiers according to following schema:\n * - Predefined modifiers are sorted alphabetically\n * - When an arbitrary variant appears, it must be preserved which modifiers are before and after it\n */\nexport const createSortModifiers = (config: AnyConfig) => {\n // Pre-compute weights for all known modifiers for O(1) comparison\n const modifierWeights = new Map<string, number>()\n\n // Assign weights to sensitive modifiers (highest priority, but preserve order)\n config.orderSensitiveModifiers.forEach((mod, index) => {\n modifierWeights.set(mod, 1000000 + index) // High weights for sensitive mods\n })\n\n return (modifiers: readonly string[]): string[] => {\n const result: string[] = []\n let currentSegment: string[] = []\n\n // Process modifiers in one pass\n for (let i = 0; i < modifiers.length; i++) {\n const modifier = modifiers[i]!\n\n // Check if modifier is sensitive (starts with '[' or in orderSensitiveModifiers)\n const isArbitrary = modifier[0] === '['\n const isOrderSensitive = modifierWeights.has(modifier)\n\n if (isArbitrary || isOrderSensitive) {\n // Sort and flush current segment alphabetically\n if (currentSegment.length > 0) {\n currentSegment.sort()\n result.push(...currentSegment)\n currentSegment = []\n }\n result.push(modifier)\n } else {\n // Regular modifier - add to current segment for batch sorting\n currentSegment.push(modifier)\n }\n }\n\n // Sort and add any remaining segment items\n if (currentSegment.length > 0) {\n currentSegment.sort()\n result.push(...currentSegment)\n }\n\n return result\n }\n}\n","import { createClassGroupUtils } from './class-group-utils'\nimport { createLruCache } from './lru-cache'\nimport { createParseClassName } from './parse-class-name'\nimport { createSortModifiers } from './sort-modifiers'\nimport { AnyClassGroupIds, AnyConfig } from './types'\n\nexport type ConfigUtils = ReturnType<typeof createConfigUtils>\n\nexport const createConfigUtils = (config: AnyConfig) => ({\n cache: createLruCache<string, string>(config.cacheSize),\n parseClassName: createParseClassName(config),\n sortModifiers: createSortModifiers(config),\n postfixLookupClassGroupIds: createPostfixLookupClassGroupIds(config),\n ...createClassGroupUtils(config),\n})\n\nconst createPostfixLookupClassGroupIds = (config: AnyConfig) => {\n const lookup: Partial<Record<AnyClassGroupIds, true>> = Object.create(null)\n const classGroupIds = config.postfixLookupClassGroups\n\n if (classGroupIds) {\n for (let i = 0; i < classGroupIds.length; i++) {\n lookup[classGroupIds[i]!] = true\n }\n }\n\n return lookup\n}\n","import { ConfigUtils } from './config-utils'\nimport { IMPORTANT_MODIFIER } from './parse-class-name'\n\nconst SPLIT_CLASSES_REGEX = /\\s+/\n\nexport const mergeClassList = (classList: string, configUtils: ConfigUtils) => {\n const {\n parseClassName,\n getClassGroupId,\n getConflictingClassGroupIds,\n sortModifiers,\n postfixLookupClassGroupIds,\n } = configUtils\n\n /**\n * Set of classGroupIds in following format:\n * `{importantModifier}{variantModifiers}{classGroupId}`\n * @example 'float'\n * @example 'hover:focus:bg-color'\n * @example 'md:!pr'\n */\n const classGroupsInConflict: string[] = []\n const classNames = classList.trim().split(SPLIT_CLASSES_REGEX)\n\n let result = ''\n\n for (let index = classNames.length - 1; index >= 0; index -= 1) {\n const originalClassName = classNames[index]!\n\n const {\n isExternal,\n modifiers,\n hasImportantModifier,\n baseClassName,\n maybePostfixModifierPosition,\n } = parseClassName(originalClassName)\n\n if (isExternal) {\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n let hasPostfixModifier = !!maybePostfixModifierPosition\n let classGroupId: ReturnType<typeof getClassGroupId>\n\n if (hasPostfixModifier) {\n const baseClassNameWithoutPostfix = baseClassName.substring(\n 0,\n maybePostfixModifierPosition,\n )\n classGroupId = getClassGroupId(baseClassNameWithoutPostfix)\n\n const classGroupIdWithPostfix =\n classGroupId && postfixLookupClassGroupIds[classGroupId]\n ? getClassGroupId(baseClassName)\n : undefined\n if (classGroupIdWithPostfix && classGroupIdWithPostfix !== classGroupId) {\n classGroupId = classGroupIdWithPostfix\n hasPostfixModifier = false\n }\n } else {\n classGroupId = getClassGroupId(baseClassName)\n }\n\n if (!classGroupId) {\n if (!hasPostfixModifier) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n classGroupId = getClassGroupId(baseClassName)\n\n if (!classGroupId) {\n // Not a Tailwind class\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n continue\n }\n\n hasPostfixModifier = false\n }\n\n // Fast path: skip sorting for empty or single modifier\n const variantModifier =\n modifiers.length === 0\n ? ''\n : modifiers.length === 1\n ? modifiers[0]!\n : sortModifiers(modifiers).join(':')\n\n const modifierId = hasImportantModifier\n ? variantModifier + IMPORTANT_MODIFIER\n : variantModifier\n\n const classId = modifierId + classGroupId\n\n if (classGroupsInConflict.indexOf(classId) > -1) {\n // Tailwind class omitted due to conflict\n continue\n }\n\n classGroupsInConflict.push(classId)\n\n const conflictGroups = getConflictingClassGroupIds(classGroupId, hasPostfixModifier)\n for (let i = 0; i < conflictGroups.length; ++i) {\n const group = conflictGroups[i]!\n classGroupsInConflict.push(modifierId + group)\n }\n\n // Tailwind class not in conflict\n result = originalClassName + (result.length > 0 ? ' ' + result : result)\n }\n\n return result\n}\n","/**\n * The code in this file is copied from https://github.com/lukeed/clsx and modified to suit the needs of tailwind-merge better.\n *\n * Specifically:\n * - Runtime code from https://github.com/lukeed/clsx/blob/v1.2.1/src/index.js\n * - TypeScript types from https://github.com/lukeed/clsx/blob/v1.2.1/clsx.d.ts\n *\n * Original code has MIT license: Copyright (c) Luke Edwards <luke.edwards05@gmail.com> (lukeed.com)\n */\n\nexport type ClassNameValue = ClassNameArray | string | null | undefined | 0 | 0n | false\ntype ClassNameArray = readonly ClassNameValue[]\n\nexport const twJoin = (...classLists: ClassNameValue[]): string => {\n let index = 0\n let argument: ClassNameValue\n let resolvedValue: string\n let string = ''\n\n while (index < classLists.length) {\n if ((argument = classLists[index++])) {\n if ((resolvedValue = toValue(argument))) {\n string && (string += ' ')\n string += resolvedValue\n }\n }\n }\n return string\n}\n\nconst toValue = (mix: ClassNameArray | string): string => {\n // Fast path for strings\n if (typeof mix === 'string') {\n return mix\n }\n\n let resolvedValue: string\n let string = ''\n\n for (let k = 0; k < mix.length; k++) {\n if (mix[k]) {\n if ((resolvedValue = toValue(mix[k] as ClassNameArray | string))) {\n string && (string += ' ')\n string += resolvedValue\n }\n }\n }\n\n return string\n}\n","import { createConfigUtils } from './config-utils'\nimport { mergeClassList } from './merge-classlist'\nimport { ClassNameValue, twJoin } from './tw-join'\nimport { AnyConfig } from './types'\n\ntype CreateConfigFirst = () => AnyConfig\ntype CreateConfigSubsequent = (config: AnyConfig) => AnyConfig\ntype TailwindMerge = (...classLists: ClassNameValue[]) => string\ntype ConfigUtils = ReturnType<typeof createConfigUtils>\n\nexport const createTailwindMerge = (\n createConfigFirst: CreateConfigFirst,\n ...createConfigRest: CreateConfigSubsequent[]\n): TailwindMerge => {\n let configUtils: ConfigUtils\n let cacheGet: ConfigUtils['cache']['get']\n let cacheSet: ConfigUtils['cache']['set']\n let functionToCall: (classList: string) => string\n\n const initTailwindMerge = (classList: string) => {\n const config = createConfigRest.reduce(\n (previousConfig, createConfigCurrent) => createConfigCurrent(previousConfig),\n createConfigFirst() as AnyConfig,\n )\n\n configUtils = createConfigUtils(config)\n cacheGet = configUtils.cache.get\n cacheSet = configUtils.cache.set\n functionToCall = tailwindMerge\n\n return tailwindMerge(classList)\n }\n\n const tailwindMerge = (classList: string) => {\n const cachedResult = cacheGet(classList)\n\n if (cachedResult) {\n return cachedResult\n }\n\n const result = mergeClassList(classList, configUtils)\n cacheSet(classList, result)\n\n return result\n }\n\n functionToCall = initTailwindMerge\n\n return (...args: ClassNameValue[]) => functionToCall(twJoin(...args))\n}\n","import { DefaultThemeGroupIds, NoInfer, ThemeGetter, ThemeObject } from './types'\n\nconst fallbackThemeArr: ThemeObject<DefaultThemeGroupIds>[DefaultThemeGroupIds] = []\n\nexport const fromTheme = <\n AdditionalThemeGroupIds extends string = never,\n DefaultThemeGroupIdsInner extends string = DefaultThemeGroupIds,\n>(\n key: NoInfer<DefaultThemeGroupIdsInner | AdditionalThemeGroupIds>,\n): ThemeGetter => {\n const themeGetter = (theme: ThemeObject<DefaultThemeGroupIdsInner | AdditionalThemeGroupIds>) =>\n theme[key] || fallbackThemeArr\n\n themeGetter.isThemeGetter = true as const\n\n return themeGetter\n}\n","const arbitraryValueRegex = /^\\[(?:(\\w[\\w-]*):)?(.+)\\]$/i\nconst arbitraryVariableRegex = /^\\((?:(\\w[\\w-]*):)?(.+)\\)$/i\nconst fractionRegex = /^\\d+(?:\\.\\d+)?\\/\\d+(?:\\.\\d+)?$/\nconst tshirtUnitRegex = /^(\\d+(\\.\\d+)?)?(xs|sm|md|lg|xl)$/\nconst lengthUnitRegex =\n /\\d+(%|px|r?em|[sdl]?v([hwib]|min|max)|pt|pc|in|cm|mm|cap|ch|ex|r?lh|cq(w|h|i|b|min|max))|\\b(calc|min|max|clamp)\\(.+\\)|^0$/\nconst colorFunctionRegex = /^(rgba?|hsla?|hwb|(ok)?(lab|lch)|color-mix)\\(.+\\)$/\n// Shadow always begins with x and y offset separated by underscore optionally prepended by inset\nconst shadowRegex = /^(inset_)?-?((\\d+)?\\.?(\\d+)[a-z]+|0)_-?((\\d+)?\\.?(\\d+)[a-z]+|0)/\nconst imageRegex =\n /^(url|image|image-set|cross-fade|element|(repeating-)?(linear|radial|conic)-gradient)\\(.+\\)$/\n\nexport const isFraction = (value: string) => fractionRegex.test(value)\n\nexport const isNumber = (value: string) => !!value && !Number.isNaN(Number(value))\n\nexport const isInteger = (value: string) => !!value && Number.isInteger(Number(value))\n\nexport const isPercent = (value: string) => value.endsWith('%') && isNumber(value.slice(0, -1))\n\nexport const isTshirtSize = (value: string) => tshirtUnitRegex.test(value)\n\nexport const isAny = () => true\n\nconst isLengthOnly = (value: string) =>\n // `colorFunctionRegex` check is necessary because color functions can have percentages in them which which would be incorrectly classified as lengths.\n // For example, `hsl(0 0% 0%)` would be classified as a length without this check.\n // I could also use lookbehind assertion in `lengthUnitRegex` but that isn't supported widely enough.\n lengthUnitRegex.test(value) && !colorFunctionRegex.test(value)\n\nconst isNever = () => false\n\nconst isShadow = (value: string) => shadowRegex.test(value)\n\nconst isImage = (value: string) => imageRegex.test(value)\n\nexport const isAnyNonArbitrary = (value: string) =>\n !isArbitraryValue(value) && !isArbitraryVariable(value)\n\nexport const isNamedContainerQuery = (value: string) =>\n value.startsWith('@container') &&\n ((value[10] === '/' && value[11] !== undefined) ||\n (value[11] === 's' && value[16] !== undefined && value.startsWith('-size/', 10)) ||\n (value[11] === 'n' && value[18] !== undefined && value.startsWith('-normal/', 10)))\n\nexport const isArbitrarySize = (value: string) => getIsArbitraryValue(value, isLabelSize, isNever)\n\nexport const isArbitraryValue = (value: string) => arbitraryValueRegex.test(value)\n\nexport const isArbitraryLength = (value: string) =>\n getIsArbitraryValue(value, isLabelLength, isLengthOnly)\n\nexport const isArbitraryNumber = (value: string) =>\n getIsArbitraryValue(value, isLabelNumber, isNumber)\n\nexport const isArbitraryWeight = (value: string) => getIsArbitraryValue(value, isLabelWeight, isAny)\n\nexport const isArbitraryFamilyName = (value: string) =>\n getIsArbitraryValue(value, isLabelFamilyName, isNever)\n\nexport const isArbitraryPosition = (value: string) =>\n getIsArbitraryValue(value, isLabelPosition, isNever)\n\nexport const isArbitraryImage = (value: string) => getIsArbitraryValue(value, isLabelImage, isImage)\n\nexport const isArbitraryShadow = (value: string) =>\n getIsArbitraryValue(value, isLabelShadow, isShadow)\n\nexport const isArbitraryVariable = (value: string) => arbitraryVariableRegex.test(value)\n\nexport const isArbitraryVariableLength = (value: string) =>\n getIsArbitraryVariable(value, isLabelLength)\n\nexport const isArbitraryVariableFamilyName = (value: string) =>\n getIsArbitraryVariable(value, isLabelFamilyName)\n\nexport const isArbitraryVariablePosition = (value: string) =>\n getIsArbitraryVariable(value, isLabelPosition)\n\nexport const isArbitraryVariableSize = (value: string) => getIsArbitraryVariable(value, isLabelSize)\n\nexport const isArbitraryVariableImage = (value: string) =>\n getIsArbitraryVariable(value, isLabelImage)\n\nexport const isArbitraryVariableShadow = (value: string) =>\n getIsArbitraryVariable(value, isLabelShadow, true)\n\nexport const isArbitraryVariableWeight = (value: string) =>\n getIsArbitraryVariable(value, isLabelWeight, true)\n\n// Helpers\n\nconst getIsArbitraryValue = (\n value: string,\n testLabel: (label: string) => boolean,\n testValue: (value: string) => boolean,\n) => {\n const result = arbitraryValueRegex.exec(value)\n\n if (result) {\n if (result[1]) {\n return testLabel(result[1])\n }\n\n return testValue(result[2]!)\n }\n\n return false\n}\n\nconst getIsArbitraryVariable = (\n value: string,\n testLabel: (label: string) => boolean,\n shouldMatchNoLabel = false,\n) => {\n const result = arbitraryVariableRegex.exec(value)\n\n if (result) {\n if (result[1]) {\n return testLabel(result[1])\n }\n return shouldMatchNoLabel\n }\n\n return false\n}\n\n// Labels\n\nconst isLabelPosition = (label: string) => label === 'position' || label === 'percentage'\n\nconst isLabelImage = (label: string) => label === 'image' || label === 'url'\n\nconst isLabelSize = (label: string) => label === 'length' || label === 'size' || label === 'bg-size'\n\nconst isLabelLength = (label: string) => label === 'length'\n\nconst isLabelNumber = (label: string) => label === 'number'\n\nconst isLabelFamilyName = (label: string) => label === 'family-name'\n\nconst isLabelWeight = (label: string) => label === 'number' || label === 'weight'\n\nconst isLabelShadow = (label: string) => label === 'shadow'\n","import { fromTheme } from './from-theme'\nimport { Config, DefaultClassGroupIds, DefaultThemeGroupIds } from './types'\nimport {\n isAny,\n isAnyNonArbitrary,\n isArbitraryFamilyName,\n isArbitraryImage,\n isArbitraryLength,\n isArbitraryNumber,\n isArbitraryPosition,\n isArbitraryShadow,\n isArbitrarySize,\n isArbitraryValue,\n isArbitraryVariable,\n isArbitraryVariableFamilyName,\n isArbitraryVariableImage,\n isArbitraryVariableLength,\n isArbitraryVariablePosition,\n isArbitraryVariableShadow,\n isArbitraryVariableSize,\n isArbitraryVariableWeight,\n isArbitraryWeight,\n isFraction,\n isInteger,\n isNamedContainerQuery,\n isNumber,\n isPercent,\n isTshirtSize,\n} from './validators'\n\nexport const getDefaultConfig = () => {\n /**\n * Theme getters for theme variable namespaces\n * @see https://tailwindcss.com/docs/theme#theme-variable-namespaces\n */\n /***/\n\n const themeColor = fromTheme('color')\n const themeFont = fromTheme('font')\n const themeText = fromTheme('text')\n const themeFontWeight = fromTheme('font-weight')\n const themeTracking = fromTheme('tracking')\n const themeLeading = fromTheme('leading')\n const themeBreakpoint = fromTheme('breakpoint')\n const themeContainer = fromTheme('container')\n const themeSpacing = fromTheme('spacing')\n const themeRadius = fromTheme('radius')\n const themeShadow = fromTheme('shadow')\n const themeInsetShadow = fromTheme('inset-shadow')\n const themeTextShadow = fromTheme('text-shadow')\n const themeDropShadow = fromTheme('drop-shadow')\n const themeBlur = fromTheme('blur')\n const themePerspective = fromTheme('perspective')\n const themeAspect = fromTheme('aspect')\n const themeEase = fromTheme('ease')\n const themeAnimate = fromTheme('animate')\n\n /**\n * Helpers to avoid repeating the same scales\n *\n * We use functions that create a new array every time they're called instead of static arrays.\n * This ensures that users who modify any scale by mutating the array (e.g. with `array.push(element)`) don't accidentally mutate arrays in other parts of the config.\n */\n /***/\n\n const scaleBreak = () =>\n ['auto', 'avoid', 'all', 'avoid-page', 'page', 'left', 'right', 'column'] as const\n const scalePosition = () =>\n [\n 'center',\n 'top',\n 'bottom',\n 'left',\n 'right',\n 'top-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-top',\n 'top-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-top',\n 'bottom-right',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'right-bottom',\n 'bottom-left',\n // Deprecated since Tailwind CSS v4.1.0, see https://github.com/tailwindlabs/tailwindcss/pull/17378\n 'left-bottom',\n ] as const\n const scalePositionWithArbitrary = () =>\n [...scalePosition(), isArbitraryVariable, isArbitraryValue] as const\n const scaleOverflow = () => ['auto', 'hidden', 'clip', 'visible', 'scroll'] as const\n const scaleOverscroll = () => ['auto', 'contain', 'none'] as const\n const scaleUnambiguousSpacing = () =>\n [isArbitraryVariable, isArbitraryValue, themeSpacing] as const\n const scaleInset = () => [isFraction, 'full', 'auto', ...scaleUnambiguousSpacing()] as const\n const scaleGridTemplateColsRows = () =>\n [isInteger, 'none', 'subgrid', isArbitraryVariable, isArbitraryValue] as const\n const scaleGridColRowStartAndEnd = () =>\n [\n 'auto',\n { span: ['full', isInteger, isArbitraryVariable, isArbitraryValue] },\n isInteger,\n isArbitraryVariable,\n isArbitraryValue,\n ] as const\n const scaleGridColRowStartOrEnd = () =>\n [isInteger, 'auto', isArbitraryVariable, isArbitraryValue] as const\n const scaleGridAutoColsRows = () =>\n ['auto', 'min', 'max', 'fr', isArbitraryVariable, isArbitraryValue] as const\n const scaleAlignPrimaryAxis = () =>\n [\n 'start',\n 'end',\n 'center',\n 'between',\n 'around',\n 'evenly',\n 'stretch',\n 'baseline',\n 'center-safe',\n 'end-safe',\n ] as const\n const scaleAlignSecondaryAxis = () =>\n ['start', 'end', 'center', 'stretch', 'center-safe', 'end-safe'] as const\n const scaleMargin = () => ['auto', ...scaleUnambiguousSpacing()] as const\n const scaleSizing = () =>\n [\n isFraction,\n 'auto',\n 'full',\n 'dvw',\n 'dvh',\n 'lvw',\n 'lvh',\n 'svw',\n 'svh',\n 'min',\n 'max',\n 'fit',\n ...scaleUnambiguousSpacing(),\n ] as const\n const scaleSizingInline = () =>\n [\n isFraction,\n 'screen',\n 'full',\n 'dvw',\n 'lvw',\n 'svw',\n 'min',\n 'max',\n 'fit',\n ...scaleUnambiguousSpacing(),\n ] as const\n const scaleSizingBlock = () =>\n [\n isFraction,\n 'screen',\n 'full',\n 'lh',\n 'dvh',\n 'lvh',\n 'svh',\n 'min',\n 'max',\n 'fit',\n ...scaleUnambiguousSpacing(),\n ] as const\n const scaleColor = () => [themeColor, isArbitraryVariable, isArbitraryValue] as const\n const scaleBgPosition = () =>\n [\n ...scalePosition(),\n isArbitraryVariablePosition,\n isArbitraryPosition,\n { position: [isArbitraryVariable, isArbitraryValue] },\n ] as const\n const scaleBgRepeat = () => ['no-repeat', { repeat: ['', 'x', 'y', 'space', 'round'] }] as const\n const scaleBgSize = () =>\n [\n 'auto',\n 'cover',\n 'contain',\n isArbitraryVariableSize,\n isArbitrarySize,\n { size: [isArbitraryVariable, isArbitraryValue] },\n ] as const\n const scaleGradientStopPosition = () =>\n [isPercent, isArbitraryVariableLength, isArbitraryLength] as const\n const scaleRadius = () =>\n [\n // Deprecated since Tailwind CSS v4.0.0\n '',\n 'none',\n 'full',\n themeRadius,\n isArbitraryVariable,\n isArbitraryValue,\n ] as const\n const scaleBorderWidth = () =>\n ['', isNumber, isArbitraryVariableLength, isArbitraryLength] as const\n const scaleLineStyle = () => ['solid', 'dashed', 'dotted', 'double'] as const\n const scaleBlendMode = () =>\n [\n 'normal',\n 'multiply',\n 'screen',\n 'overlay',\n 'darken',\n 'lighten',\n 'color-dodge',\n 'color-burn',\n 'hard-light',\n 'soft-light',\n 'difference',\n 'exclusion',\n 'hue',\n 'saturation',\n 'color',\n 'luminosity',\n ] as const\n const scaleMaskImagePosition = () =>\n [isNumber, isPercent, isArbitraryVariablePosition, isArbitraryPosition] as const\n const scaleBlur = () =>\n [\n // Deprecated since Tailwind CSS v4.0.0\n '',\n 'none',\n themeBlur,\n isArbitraryVariable,\n isArbitraryValue,\n ] as const\n const scaleRotate = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue] as const\n const scaleScale = () => ['none', isNumber, isArbitraryVariable, isArbitraryValue] as const\n const scaleSkew = () => [isNumber, isArbitraryVariable, isArbitraryValue] as const\n const scaleTranslate = () => [isFraction, 'full', ...scaleUnambiguousSpacing()] as const\n\n return {\n cacheSize: 500,\n theme: {\n animate: ['spin', 'ping', 'pulse', 'bounce'],\n aspect: ['video'],\n blur: [isTshirtSize],\n breakpoint: [isTshirtSize],\n color: [isAny],\n container: [isTshirtSize],\n 'drop-shadow': [isTshirtSize],\n ease: ['in', 'out', 'in-out'],\n font: [isAnyNonArbitrary],\n 'font-weight': [\n 'thin',\n 'extralight',\n 'light',\n 'normal',\n 'medium',\n 'semibold',\n 'bold',\n 'extrabold',\n 'black',\n ],\n 'inset-shadow': [isTshirtSize],\n leading: ['none', 'tight', 'snug', 'normal', 'relaxed', 'loose'],\n perspective: ['dramatic', 'near', 'normal', 'midrange', 'distant', 'none'],\n radius: [isTshirtSize],\n shadow: [isTshirtSize],\n spacing: ['px', isNumber],\n text: [isTshirtSize],\n 'text-shadow': [isTshirtSize],\n tracking: ['tighter', 'tight', 'normal', 'wide', 'wider', 'widest'],\n },\n classGroups: {\n // --------------\n // --- Layout ---\n // --------------\n\n /**\n * Aspect Ratio\n * @see https://tailwindcss.com/docs/aspect-ratio\n */\n aspect: [\n {\n aspect: [\n 'auto',\n 'square',\n isFraction,\n isArbitraryValue,\n isArbitraryVariable,\n themeAspect,\n ],\n },\n ],\n /**\n * Container\n * @see https://tailwindcss.com/docs/container\n * @deprecated since Tailwind CSS v4.0.0\n */\n container: ['container'],\n /**\n * Container Type\n * @see https://tailwindcss.com/docs/responsive-design#container-queries\n */\n 'container-type': [\n { '@container': ['', 'normal', 'size', isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Container Name\n * @see https://tailwindcss.com/docs/responsive-design#named-containers\n */\n 'container-named': [isNamedContainerQuery],\n /**\n * Columns\n * @see https://tailwindcss.com/docs/columns\n */\n columns: [\n { columns: [isNumber, isArbitraryValue, isArbitraryVariable, themeContainer] },\n ],\n /**\n * Break After\n * @see https://tailwindcss.com/docs/break-after\n */\n 'break-after': [{ 'break-after': scaleBreak() }],\n /**\n * Break Before\n * @see https://tailwindcss.com/docs/break-before\n */\n 'break-before': [{ 'break-before': scaleBreak() }],\n /**\n * Break Inside\n * @see https://tailwindcss.com/docs/break-inside\n */\n 'break-inside': [{ 'break-inside': ['auto', 'avoid', 'avoid-page', 'avoid-column'] }],\n /**\n * Box Decoration Break\n * @see https://tailwindcss.com/docs/box-decoration-break\n */\n 'box-decoration': [{ 'box-decoration': ['slice', 'clone'] }],\n /**\n * Box Sizing\n * @see https://tailwindcss.com/docs/box-sizing\n */\n box: [{ box: ['border', 'content'] }],\n /**\n * Display\n * @see https://tailwindcss.com/docs/display\n */\n display: [\n 'block',\n 'inline-block',\n 'inline',\n 'flex',\n 'inline-flex',\n 'table',\n 'inline-table',\n 'table-caption',\n 'table-cell',\n 'table-column',\n 'table-column-group',\n 'table-footer-group',\n 'table-header-group',\n 'table-row-group',\n 'table-row',\n 'flow-root',\n 'grid',\n 'inline-grid',\n 'contents',\n 'list-item',\n 'hidden',\n ],\n /**\n * Screen Reader Only\n * @see https://tailwindcss.com/docs/display#screen-reader-only\n */\n sr: ['sr-only', 'not-sr-only'],\n /**\n * Floats\n * @see https://tailwindcss.com/docs/float\n */\n float: [{ float: ['right', 'left', 'none', 'start', 'end'] }],\n /**\n * Clear\n * @see https://tailwindcss.com/docs/clear\n */\n clear: [{ clear: ['left', 'right', 'both', 'none', 'start', 'end'] }],\n /**\n * Isolation\n * @see https://tailwindcss.com/docs/isolation\n */\n isolation: ['isolate', 'isolation-auto'],\n /**\n * Object Fit\n * @see https://tailwindcss.com/docs/object-fit\n */\n 'object-fit': [{ object: ['contain', 'cover', 'fill', 'none', 'scale-down'] }],\n /**\n * Object Position\n * @see https://tailwindcss.com/docs/object-position\n */\n 'object-position': [{ object: scalePositionWithArbitrary() }],\n /**\n * Overflow\n * @see https://tailwindcss.com/docs/overflow\n */\n overflow: [{ overflow: scaleOverflow() }],\n /**\n * Overflow X\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-x': [{ 'overflow-x': scaleOverflow() }],\n /**\n * Overflow Y\n * @see https://tailwindcss.com/docs/overflow\n */\n 'overflow-y': [{ 'overflow-y': scaleOverflow() }],\n /**\n * Overscroll Behavior\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n overscroll: [{ overscroll: scaleOverscroll() }],\n /**\n * Overscroll Behavior X\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-x': [{ 'overscroll-x': scaleOverscroll() }],\n /**\n * Overscroll Behavior Y\n * @see https://tailwindcss.com/docs/overscroll-behavior\n */\n 'overscroll-y': [{ 'overscroll-y': scaleOverscroll() }],\n /**\n * Position\n * @see https://tailwindcss.com/docs/position\n */\n position: ['static', 'fixed', 'absolute', 'relative', 'sticky'],\n /**\n * Inset\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n inset: [{ inset: scaleInset() }],\n /**\n * Inset Inline\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-x': [{ 'inset-x': scaleInset() }],\n /**\n * Inset Block\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-y': [{ 'inset-y': scaleInset() }],\n /**\n * Inset Inline Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n * @todo class group will be renamed to `inset-s` in next major release\n */\n start: [\n {\n 'inset-s': scaleInset(),\n /**\n * @deprecated since Tailwind CSS v4.2.0 in favor of `inset-s-*` utilities.\n * @see https://github.com/tailwindlabs/tailwindcss/pull/19613\n */\n start: scaleInset(),\n },\n ],\n /**\n * Inset Inline End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n * @todo class group will be renamed to `inset-e` in next major release\n */\n end: [\n {\n 'inset-e': scaleInset(),\n /**\n * @deprecated since Tailwind CSS v4.2.0 in favor of `inset-e-*` utilities.\n * @see https://github.com/tailwindlabs/tailwindcss/pull/19613\n */\n end: scaleInset(),\n },\n ],\n /**\n * Inset Block Start\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-bs': [{ 'inset-bs': scaleInset() }],\n /**\n * Inset Block End\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n 'inset-be': [{ 'inset-be': scaleInset() }],\n /**\n * Top\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n top: [{ top: scaleInset() }],\n /**\n * Right\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n right: [{ right: scaleInset() }],\n /**\n * Bottom\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n bottom: [{ bottom: scaleInset() }],\n /**\n * Left\n * @see https://tailwindcss.com/docs/top-right-bottom-left\n */\n left: [{ left: scaleInset() }],\n /**\n * Visibility\n * @see https://tailwindcss.com/docs/visibility\n */\n visibility: ['visible', 'invisible', 'collapse'],\n /**\n * Z-Index\n * @see https://tailwindcss.com/docs/z-index\n */\n z: [{ z: [isInteger, 'auto', isArbitraryVariable, isArbitraryValue] }],\n\n // ------------------------\n // --- Flexbox and Grid ---\n // ------------------------\n\n /**\n * Flex Basis\n * @see https://tailwindcss.com/docs/flex-basis\n */\n basis: [\n {\n basis: [\n isFraction,\n 'full',\n 'auto',\n themeContainer,\n ...scaleUnambiguousSpacing(),\n ],\n },\n ],\n /**\n * Flex Direction\n * @see https://tailwindcss.com/docs/flex-direction\n */\n 'flex-direction': [{ flex: ['row', 'row-reverse', 'col', 'col-reverse'] }],\n /**\n * Flex Wrap\n * @see https://tailwindcss.com/docs/flex-wrap\n */\n 'flex-wrap': [{ flex: ['nowrap', 'wrap', 'wrap-reverse'] }],\n /**\n * Flex\n * @see https://tailwindcss.com/docs/flex\n */\n flex: [{ flex: [isNumber, isFraction, 'auto', 'initial', 'none', isArbitraryValue] }],\n /**\n * Flex Grow\n * @see https://tailwindcss.com/docs/flex-grow\n */\n grow: [{ grow: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Flex Shrink\n * @see https://tailwindcss.com/docs/flex-shrink\n */\n shrink: [{ shrink: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Order\n * @see https://tailwindcss.com/docs/order\n */\n order: [\n {\n order: [\n isInteger,\n 'first',\n 'last',\n 'none',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Grid Template Columns\n * @see https://tailwindcss.com/docs/grid-template-columns\n */\n 'grid-cols': [{ 'grid-cols': scaleGridTemplateColsRows() }],\n /**\n * Grid Column Start / End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start-end': [{ col: scaleGridColRowStartAndEnd() }],\n /**\n * Grid Column Start\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-start': [{ 'col-start': scaleGridColRowStartOrEnd() }],\n /**\n * Grid Column End\n * @see https://tailwindcss.com/docs/grid-column\n */\n 'col-end': [{ 'col-end': scaleGridColRowStartOrEnd() }],\n /**\n * Grid Template Rows\n * @see https://tailwindcss.com/docs/grid-template-rows\n */\n 'grid-rows': [{ 'grid-rows': scaleGridTemplateColsRows() }],\n /**\n * Grid Row Start / End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start-end': [{ row: scaleGridColRowStartAndEnd() }],\n /**\n * Grid Row Start\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-start': [{ 'row-start': scaleGridColRowStartOrEnd() }],\n /**\n * Grid Row End\n * @see https://tailwindcss.com/docs/grid-row\n */\n 'row-end': [{ 'row-end': scaleGridColRowStartOrEnd() }],\n /**\n * Grid Auto Flow\n * @see https://tailwindcss.com/docs/grid-auto-flow\n */\n 'grid-flow': [{ 'grid-flow': ['row', 'col', 'dense', 'row-dense', 'col-dense'] }],\n /**\n * Grid Auto Columns\n * @see https://tailwindcss.com/docs/grid-auto-columns\n */\n 'auto-cols': [{ 'auto-cols': scaleGridAutoColsRows() }],\n /**\n * Grid Auto Rows\n * @see https://tailwindcss.com/docs/grid-auto-rows\n */\n 'auto-rows': [{ 'auto-rows': scaleGridAutoColsRows() }],\n /**\n * Gap\n * @see https://tailwindcss.com/docs/gap\n */\n gap: [{ gap: scaleUnambiguousSpacing() }],\n /**\n * Gap X\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-x': [{ 'gap-x': scaleUnambiguousSpacing() }],\n /**\n * Gap Y\n * @see https://tailwindcss.com/docs/gap\n */\n 'gap-y': [{ 'gap-y': scaleUnambiguousSpacing() }],\n /**\n * Justify Content\n * @see https://tailwindcss.com/docs/justify-content\n */\n 'justify-content': [{ justify: [...scaleAlignPrimaryAxis(), 'normal'] }],\n /**\n * Justify Items\n * @see https://tailwindcss.com/docs/justify-items\n */\n 'justify-items': [{ 'justify-items': [...scaleAlignSecondaryAxis(), 'normal'] }],\n /**\n * Justify Self\n * @see https://tailwindcss.com/docs/justify-self\n */\n 'justify-self': [{ 'justify-self': ['auto', ...scaleAlignSecondaryAxis()] }],\n /**\n * Align Content\n * @see https://tailwindcss.com/docs/align-content\n */\n 'align-content': [{ content: ['normal', ...scaleAlignPrimaryAxis()] }],\n /**\n * Align Items\n * @see https://tailwindcss.com/docs/align-items\n */\n 'align-items': [{ items: [...scaleAlignSecondaryAxis(), { baseline: ['', 'last'] }] }],\n /**\n * Align Self\n * @see https://tailwindcss.com/docs/align-self\n */\n 'align-self': [\n { self: ['auto', ...scaleAlignSecondaryAxis(), { baseline: ['', 'last'] }] },\n ],\n /**\n * Place Content\n * @see https://tailwindcss.com/docs/place-content\n */\n 'place-content': [{ 'place-content': scaleAlignPrimaryAxis() }],\n /**\n * Place Items\n * @see https://tailwindcss.com/docs/place-items\n */\n 'place-items': [{ 'place-items': [...scaleAlignSecondaryAxis(), 'baseline'] }],\n /**\n * Place Self\n * @see https://tailwindcss.com/docs/place-self\n */\n 'place-self': [{ 'place-self': ['auto', ...scaleAlignSecondaryAxis()] }],\n // Spacing\n /**\n * Padding\n * @see https://tailwindcss.com/docs/padding\n */\n p: [{ p: scaleUnambiguousSpacing() }],\n /**\n * Padding Inline\n * @see https://tailwindcss.com/docs/padding\n */\n px: [{ px: scaleUnambiguousSpacing() }],\n /**\n * Padding Block\n * @see https://tailwindcss.com/docs/padding\n */\n py: [{ py: scaleUnambiguousSpacing() }],\n /**\n * Padding Inline Start\n * @see https://tailwindcss.com/docs/padding\n */\n ps: [{ ps: scaleUnambiguousSpacing() }],\n /**\n * Padding Inline End\n * @see https://tailwindcss.com/docs/padding\n */\n pe: [{ pe: scaleUnambiguousSpacing() }],\n /**\n * Padding Block Start\n * @see https://tailwindcss.com/docs/padding\n */\n pbs: [{ pbs: scaleUnambiguousSpacing() }],\n /**\n * Padding Block End\n * @see https://tailwindcss.com/docs/padding\n */\n pbe: [{ pbe: scaleUnambiguousSpacing() }],\n /**\n * Padding Top\n * @see https://tailwindcss.com/docs/padding\n */\n pt: [{ pt: scaleUnambiguousSpacing() }],\n /**\n * Padding Right\n * @see https://tailwindcss.com/docs/padding\n */\n pr: [{ pr: scaleUnambiguousSpacing() }],\n /**\n * Padding Bottom\n * @see https://tailwindcss.com/docs/padding\n */\n pb: [{ pb: scaleUnambiguousSpacing() }],\n /**\n * Padding Left\n * @see https://tailwindcss.com/docs/padding\n */\n pl: [{ pl: scaleUnambiguousSpacing() }],\n /**\n * Margin\n * @see https://tailwindcss.com/docs/margin\n */\n m: [{ m: scaleMargin() }],\n /**\n * Margin Inline\n * @see https://tailwindcss.com/docs/margin\n */\n mx: [{ mx: scaleMargin() }],\n /**\n * Margin Block\n * @see https://tailwindcss.com/docs/margin\n */\n my: [{ my: scaleMargin() }],\n /**\n * Margin Inline Start\n * @see https://tailwindcss.com/docs/margin\n */\n ms: [{ ms: scaleMargin() }],\n /**\n * Margin Inline End\n * @see https://tailwindcss.com/docs/margin\n */\n me: [{ me: scaleMargin() }],\n /**\n * Margin Block Start\n * @see https://tailwindcss.com/docs/margin\n */\n mbs: [{ mbs: scaleMargin() }],\n /**\n * Margin Block End\n * @see https://tailwindcss.com/docs/margin\n */\n mbe: [{ mbe: scaleMargin() }],\n /**\n * Margin Top\n * @see https://tailwindcss.com/docs/margin\n */\n mt: [{ mt: scaleMargin() }],\n /**\n * Margin Right\n * @see https://tailwindcss.com/docs/margin\n */\n mr: [{ mr: scaleMargin() }],\n /**\n * Margin Bottom\n * @see https://tailwindcss.com/docs/margin\n */\n mb: [{ mb: scaleMargin() }],\n /**\n * Margin Left\n * @see https://tailwindcss.com/docs/margin\n */\n ml: [{ ml: scaleMargin() }],\n /**\n * Space Between X\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x': [{ 'space-x': scaleUnambiguousSpacing() }],\n /**\n * Space Between X Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-x-reverse': ['space-x-reverse'],\n /**\n * Space Between Y\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y': [{ 'space-y': scaleUnambiguousSpacing() }],\n /**\n * Space Between Y Reverse\n * @see https://tailwindcss.com/docs/margin#adding-space-between-children\n */\n 'space-y-reverse': ['space-y-reverse'],\n\n // --------------\n // --- Sizing ---\n // --------------\n\n /**\n * Size\n * @see https://tailwindcss.com/docs/width#setting-both-width-and-height\n */\n size: [{ size: scaleSizing() }],\n /**\n * Inline Size\n * @see https://tailwindcss.com/docs/width\n */\n 'inline-size': [{ inline: ['auto', ...scaleSizingInline()] }],\n /**\n * Min-Inline Size\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-inline-size': [{ 'min-inline': ['auto', ...scaleSizingInline()] }],\n /**\n * Max-Inline Size\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-inline-size': [{ 'max-inline': ['none', ...scaleSizingInline()] }],\n /**\n * Block Size\n * @see https://tailwindcss.com/docs/height\n */\n 'block-size': [{ block: ['auto', ...scaleSizingBlock()] }],\n /**\n * Min-Block Size\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-block-size': [{ 'min-block': ['auto', ...scaleSizingBlock()] }],\n /**\n * Max-Block Size\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-block-size': [{ 'max-block': ['none', ...scaleSizingBlock()] }],\n /**\n * Width\n * @see https://tailwindcss.com/docs/width\n */\n w: [{ w: [themeContainer, 'screen', ...scaleSizing()] }],\n /**\n * Min-Width\n * @see https://tailwindcss.com/docs/min-width\n */\n 'min-w': [\n {\n 'min-w': [\n themeContainer,\n 'screen',\n /** Deprecated. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'none',\n ...scaleSizing(),\n ],\n },\n ],\n /**\n * Max-Width\n * @see https://tailwindcss.com/docs/max-width\n */\n 'max-w': [\n {\n 'max-w': [\n themeContainer,\n 'screen',\n 'none',\n /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n 'prose',\n /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n { screen: [themeBreakpoint] },\n ...scaleSizing(),\n ],\n },\n ],\n /**\n * Height\n * @see https://tailwindcss.com/docs/height\n */\n h: [{ h: ['screen', 'lh', ...scaleSizing()] }],\n /**\n * Min-Height\n * @see https://tailwindcss.com/docs/min-height\n */\n 'min-h': [{ 'min-h': ['screen', 'lh', 'none', ...scaleSizing()] }],\n /**\n * Max-Height\n * @see https://tailwindcss.com/docs/max-height\n */\n 'max-h': [{ 'max-h': ['screen', 'lh', ...scaleSizing()] }],\n\n // ------------------\n // --- Typography ---\n // ------------------\n\n /**\n * Font Size\n * @see https://tailwindcss.com/docs/font-size\n */\n 'font-size': [\n { text: ['base', themeText, isArbitraryVariableLength, isArbitraryLength] },\n ],\n /**\n * Font Smoothing\n * @see https://tailwindcss.com/docs/font-smoothing\n */\n 'font-smoothing': ['antialiased', 'subpixel-antialiased'],\n /**\n * Font Style\n * @see https://tailwindcss.com/docs/font-style\n */\n 'font-style': ['italic', 'not-italic'],\n /**\n * Font Weight\n * @see https://tailwindcss.com/docs/font-weight\n */\n 'font-weight': [\n {\n font: [themeFontWeight, isArbitraryVariableWeight, isArbitraryWeight],\n },\n ],\n /**\n * Font Stretch\n * @see https://tailwindcss.com/docs/font-stretch\n */\n 'font-stretch': [\n {\n 'font-stretch': [\n 'ultra-condensed',\n 'extra-condensed',\n 'condensed',\n 'semi-condensed',\n 'normal',\n 'semi-expanded',\n 'expanded',\n 'extra-expanded',\n 'ultra-expanded',\n isPercent,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Font Family\n * @see https://tailwindcss.com/docs/font-family\n */\n 'font-family': [\n { font: [isArbitraryVariableFamilyName, isArbitraryFamilyName, themeFont] },\n ],\n /**\n * Font Feature Settings\n * @see https://tailwindcss.com/docs/font-feature-settings\n */\n 'font-features': [{ 'font-features': [isArbitraryValue] }],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-normal': ['normal-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-ordinal': ['ordinal'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-slashed-zero': ['slashed-zero'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-figure': ['lining-nums', 'oldstyle-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-spacing': ['proportional-nums', 'tabular-nums'],\n /**\n * Font Variant Numeric\n * @see https://tailwindcss.com/docs/font-variant-numeric\n */\n 'fvn-fraction': ['diagonal-fractions', 'stacked-fractions'],\n /**\n * Letter Spacing\n * @see https://tailwindcss.com/docs/letter-spacing\n */\n tracking: [{ tracking: [themeTracking, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Line Clamp\n * @see https://tailwindcss.com/docs/line-clamp\n */\n 'line-clamp': [\n { 'line-clamp': [isNumber, 'none', isArbitraryVariable, isArbitraryNumber] },\n ],\n /**\n * Line Height\n * @see https://tailwindcss.com/docs/line-height\n */\n leading: [\n {\n leading: [\n /** Deprecated since Tailwind CSS v4.0.0. @see https://github.com/tailwindlabs/tailwindcss.com/issues/2027#issuecomment-2620152757 */\n themeLeading,\n ...scaleUnambiguousSpacing(),\n ],\n },\n ],\n /**\n * List Style Image\n * @see https://tailwindcss.com/docs/list-style-image\n */\n 'list-image': [{ 'list-image': ['none', isArbitraryVariable, isArbitraryValue] }],\n /**\n * List Style Position\n * @see https://tailwindcss.com/docs/list-style-position\n */\n 'list-style-position': [{ list: ['inside', 'outside'] }],\n /**\n * List Style Type\n * @see https://tailwindcss.com/docs/list-style-type\n */\n 'list-style-type': [\n { list: ['disc', 'decimal', 'none', isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Text Alignment\n * @see https://tailwindcss.com/docs/text-align\n */\n 'text-alignment': [{ text: ['left', 'center', 'right', 'justify', 'start', 'end'] }],\n /**\n * Placeholder Color\n * @deprecated since Tailwind CSS v3.0.0\n * @see https://v3.tailwindcss.com/docs/placeholder-color\n */\n 'placeholder-color': [{ placeholder: scaleColor() }],\n /**\n * Text Color\n * @see https://tailwindcss.com/docs/text-color\n */\n 'text-color': [{ text: scaleColor() }],\n /**\n * Text Decoration\n * @see https://tailwindcss.com/docs/text-decoration\n */\n 'text-decoration': ['underline', 'overline', 'line-through', 'no-underline'],\n /**\n * Text Decoration Style\n * @see https://tailwindcss.com/docs/text-decoration-style\n */\n 'text-decoration-style': [{ decoration: [...scaleLineStyle(), 'wavy'] }],\n /**\n * Text Decoration Thickness\n * @see https://tailwindcss.com/docs/text-decoration-thickness\n */\n 'text-decoration-thickness': [\n {\n decoration: [\n isNumber,\n 'from-font',\n 'auto',\n isArbitraryVariable,\n isArbitraryLength,\n ],\n },\n ],\n /**\n * Text Decoration Color\n * @see https://tailwindcss.com/docs/text-decoration-color\n */\n 'text-decoration-color': [{ decoration: scaleColor() }],\n /**\n * Text Underline Offset\n * @see https://tailwindcss.com/docs/text-underline-offset\n */\n 'underline-offset': [\n { 'underline-offset': [isNumber, 'auto', isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Text Transform\n * @see https://tailwindcss.com/docs/text-transform\n */\n 'text-transform': ['uppercase', 'lowercase', 'capitalize', 'normal-case'],\n /**\n * Text Overflow\n * @see https://tailwindcss.com/docs/text-overflow\n */\n 'text-overflow': ['truncate', 'text-ellipsis', 'text-clip'],\n /**\n * Text Wrap\n * @see https://tailwindcss.com/docs/text-wrap\n */\n 'text-wrap': [{ text: ['wrap', 'nowrap', 'balance', 'pretty'] }],\n /**\n * Text Indent\n * @see https://tailwindcss.com/docs/text-indent\n */\n indent: [{ indent: scaleUnambiguousSpacing() }],\n /**\n * Tab Size\n * @see https://tailwindcss.com/docs/tab-size\n */\n 'tab-size': [{ tab: [isInteger, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Vertical Alignment\n * @see https://tailwindcss.com/docs/vertical-align\n */\n 'vertical-align': [\n {\n align: [\n 'baseline',\n 'top',\n 'middle',\n 'bottom',\n 'text-top',\n 'text-bottom',\n 'sub',\n 'super',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Whitespace\n * @see https://tailwindcss.com/docs/whitespace\n */\n whitespace: [\n { whitespace: ['normal', 'nowrap', 'pre', 'pre-line', 'pre-wrap', 'break-spaces'] },\n ],\n /**\n * Word Break\n * @see https://tailwindcss.com/docs/word-break\n */\n break: [{ break: ['normal', 'words', 'all', 'keep'] }],\n /**\n * Overflow Wrap\n * @see https://tailwindcss.com/docs/overflow-wrap\n */\n wrap: [{ wrap: ['break-word', 'anywhere', 'normal'] }],\n /**\n * Hyphens\n * @see https://tailwindcss.com/docs/hyphens\n */\n hyphens: [{ hyphens: ['none', 'manual', 'auto'] }],\n /**\n * Content\n * @see https://tailwindcss.com/docs/content\n */\n content: [{ content: ['none', isArbitraryVariable, isArbitraryValue] }],\n\n // -------------------\n // --- Backgrounds ---\n // -------------------\n\n /**\n * Background Attachment\n * @see https://tailwindcss.com/docs/background-attachment\n */\n 'bg-attachment': [{ bg: ['fixed', 'local', 'scroll'] }],\n /**\n * Background Clip\n * @see https://tailwindcss.com/docs/background-clip\n */\n 'bg-clip': [{ 'bg-clip': ['border', 'padding', 'content', 'text'] }],\n /**\n * Background Origin\n * @see https://tailwindcss.com/docs/background-origin\n */\n 'bg-origin': [{ 'bg-origin': ['border', 'padding', 'content'] }],\n /**\n * Background Position\n * @see https://tailwindcss.com/docs/background-position\n */\n 'bg-position': [{ bg: scaleBgPosition() }],\n /**\n * Background Repeat\n * @see https://tailwindcss.com/docs/background-repeat\n */\n 'bg-repeat': [{ bg: scaleBgRepeat() }],\n /**\n * Background Size\n * @see https://tailwindcss.com/docs/background-size\n */\n 'bg-size': [{ bg: scaleBgSize() }],\n /**\n * Background Image\n * @see https://tailwindcss.com/docs/background-image\n */\n 'bg-image': [\n {\n bg: [\n 'none',\n {\n linear: [\n { to: ['t', 'tr', 'r', 'br', 'b', 'bl', 'l', 'tl'] },\n isInteger,\n isArbitraryVariable,\n isArbitraryValue,\n ],\n radial: ['', isArbitraryVariable, isArbitraryValue],\n conic: [isInteger, isArbitraryVariable, isArbitraryValue],\n },\n isArbitraryVariableImage,\n isArbitraryImage,\n ],\n },\n ],\n /**\n * Background Color\n * @see https://tailwindcss.com/docs/background-color\n */\n 'bg-color': [{ bg: scaleColor() }],\n /**\n * Gradient Color Stops From Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from-pos': [{ from: scaleGradientStopPosition() }],\n /**\n * Gradient Color Stops Via Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via-pos': [{ via: scaleGradientStopPosition() }],\n /**\n * Gradient Color Stops To Position\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to-pos': [{ to: scaleGradientStopPosition() }],\n /**\n * Gradient Color Stops From\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-from': [{ from: scaleColor() }],\n /**\n * Gradient Color Stops Via\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-via': [{ via: scaleColor() }],\n /**\n * Gradient Color Stops To\n * @see https://tailwindcss.com/docs/gradient-color-stops\n */\n 'gradient-to': [{ to: scaleColor() }],\n\n // ---------------\n // --- Borders ---\n // ---------------\n\n /**\n * Border Radius\n * @see https://tailwindcss.com/docs/border-radius\n */\n rounded: [{ rounded: scaleRadius() }],\n /**\n * Border Radius Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-s': [{ 'rounded-s': scaleRadius() }],\n /**\n * Border Radius End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-e': [{ 'rounded-e': scaleRadius() }],\n /**\n * Border Radius Top\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-t': [{ 'rounded-t': scaleRadius() }],\n /**\n * Border Radius Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-r': [{ 'rounded-r': scaleRadius() }],\n /**\n * Border Radius Bottom\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-b': [{ 'rounded-b': scaleRadius() }],\n /**\n * Border Radius Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-l': [{ 'rounded-l': scaleRadius() }],\n /**\n * Border Radius Start Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ss': [{ 'rounded-ss': scaleRadius() }],\n /**\n * Border Radius Start End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-se': [{ 'rounded-se': scaleRadius() }],\n /**\n * Border Radius End End\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-ee': [{ 'rounded-ee': scaleRadius() }],\n /**\n * Border Radius End Start\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-es': [{ 'rounded-es': scaleRadius() }],\n /**\n * Border Radius Top Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tl': [{ 'rounded-tl': scaleRadius() }],\n /**\n * Border Radius Top Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-tr': [{ 'rounded-tr': scaleRadius() }],\n /**\n * Border Radius Bottom Right\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-br': [{ 'rounded-br': scaleRadius() }],\n /**\n * Border Radius Bottom Left\n * @see https://tailwindcss.com/docs/border-radius\n */\n 'rounded-bl': [{ 'rounded-bl': scaleRadius() }],\n /**\n * Border Width\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w': [{ border: scaleBorderWidth() }],\n /**\n * Border Width Inline\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-x': [{ 'border-x': scaleBorderWidth() }],\n /**\n * Border Width Block\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-y': [{ 'border-y': scaleBorderWidth() }],\n /**\n * Border Width Inline Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-s': [{ 'border-s': scaleBorderWidth() }],\n /**\n * Border Width Inline End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-e': [{ 'border-e': scaleBorderWidth() }],\n /**\n * Border Width Block Start\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-bs': [{ 'border-bs': scaleBorderWidth() }],\n /**\n * Border Width Block End\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-be': [{ 'border-be': scaleBorderWidth() }],\n /**\n * Border Width Top\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-t': [{ 'border-t': scaleBorderWidth() }],\n /**\n * Border Width Right\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-r': [{ 'border-r': scaleBorderWidth() }],\n /**\n * Border Width Bottom\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-b': [{ 'border-b': scaleBorderWidth() }],\n /**\n * Border Width Left\n * @see https://tailwindcss.com/docs/border-width\n */\n 'border-w-l': [{ 'border-l': scaleBorderWidth() }],\n /**\n * Divide Width X\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x': [{ 'divide-x': scaleBorderWidth() }],\n /**\n * Divide Width X Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-x-reverse': ['divide-x-reverse'],\n /**\n * Divide Width Y\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y': [{ 'divide-y': scaleBorderWidth() }],\n /**\n * Divide Width Y Reverse\n * @see https://tailwindcss.com/docs/border-width#between-children\n */\n 'divide-y-reverse': ['divide-y-reverse'],\n /**\n * Border Style\n * @see https://tailwindcss.com/docs/border-style\n */\n 'border-style': [{ border: [...scaleLineStyle(), 'hidden', 'none'] }],\n /**\n * Divide Style\n * @see https://tailwindcss.com/docs/border-style#setting-the-divider-style\n */\n 'divide-style': [{ divide: [...scaleLineStyle(), 'hidden', 'none'] }],\n /**\n * Border Color\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color': [{ border: scaleColor() }],\n /**\n * Border Color Inline\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-x': [{ 'border-x': scaleColor() }],\n /**\n * Border Color Block\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-y': [{ 'border-y': scaleColor() }],\n /**\n * Border Color Inline Start\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-s': [{ 'border-s': scaleColor() }],\n /**\n * Border Color Inline End\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-e': [{ 'border-e': scaleColor() }],\n /**\n * Border Color Block Start\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-bs': [{ 'border-bs': scaleColor() }],\n /**\n * Border Color Block End\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-be': [{ 'border-be': scaleColor() }],\n /**\n * Border Color Top\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-t': [{ 'border-t': scaleColor() }],\n /**\n * Border Color Right\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-r': [{ 'border-r': scaleColor() }],\n /**\n * Border Color Bottom\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-b': [{ 'border-b': scaleColor() }],\n /**\n * Border Color Left\n * @see https://tailwindcss.com/docs/border-color\n */\n 'border-color-l': [{ 'border-l': scaleColor() }],\n /**\n * Divide Color\n * @see https://tailwindcss.com/docs/divide-color\n */\n 'divide-color': [{ divide: scaleColor() }],\n /**\n * Outline Style\n * @see https://tailwindcss.com/docs/outline-style\n */\n 'outline-style': [{ outline: [...scaleLineStyle(), 'none', 'hidden'] }],\n /**\n * Outline Offset\n * @see https://tailwindcss.com/docs/outline-offset\n */\n 'outline-offset': [\n { 'outline-offset': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Outline Width\n * @see https://tailwindcss.com/docs/outline-width\n */\n 'outline-w': [\n { outline: ['', isNumber, isArbitraryVariableLength, isArbitraryLength] },\n ],\n /**\n * Outline Color\n * @see https://tailwindcss.com/docs/outline-color\n */\n 'outline-color': [{ outline: scaleColor() }],\n\n // ---------------\n // --- Effects ---\n // ---------------\n\n /**\n * Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow\n */\n shadow: [\n {\n shadow: [\n // Deprecated since Tailwind CSS v4.0.0\n '',\n 'none',\n themeShadow,\n isArbitraryVariableShadow,\n isArbitraryShadow,\n ],\n },\n ],\n /**\n * Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-shadow-color\n */\n 'shadow-color': [{ shadow: scaleColor() }],\n /**\n * Inset Box Shadow\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-shadow\n */\n 'inset-shadow': [\n {\n 'inset-shadow': [\n 'none',\n themeInsetShadow,\n isArbitraryVariableShadow,\n isArbitraryShadow,\n ],\n },\n ],\n /**\n * Inset Box Shadow Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-shadow-color\n */\n 'inset-shadow-color': [{ 'inset-shadow': scaleColor() }],\n /**\n * Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-a-ring\n */\n 'ring-w': [{ ring: scaleBorderWidth() }],\n /**\n * Ring Width Inset\n * @see https://v3.tailwindcss.com/docs/ring-width#inset-rings\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-w-inset': ['ring-inset'],\n /**\n * Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-ring-color\n */\n 'ring-color': [{ ring: scaleColor() }],\n /**\n * Ring Offset Width\n * @see https://v3.tailwindcss.com/docs/ring-offset-width\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-w': [{ 'ring-offset': [isNumber, isArbitraryLength] }],\n /**\n * Ring Offset Color\n * @see https://v3.tailwindcss.com/docs/ring-offset-color\n * @deprecated since Tailwind CSS v4.0.0\n * @see https://github.com/tailwindlabs/tailwindcss/blob/v4.0.0/packages/tailwindcss/src/utilities.ts#L4158\n */\n 'ring-offset-color': [{ 'ring-offset': scaleColor() }],\n /**\n * Inset Ring Width\n * @see https://tailwindcss.com/docs/box-shadow#adding-an-inset-ring\n */\n 'inset-ring-w': [{ 'inset-ring': scaleBorderWidth() }],\n /**\n * Inset Ring Color\n * @see https://tailwindcss.com/docs/box-shadow#setting-the-inset-ring-color\n */\n 'inset-ring-color': [{ 'inset-ring': scaleColor() }],\n /**\n * Text Shadow\n * @see https://tailwindcss.com/docs/text-shadow\n */\n 'text-shadow': [\n {\n 'text-shadow': [\n 'none',\n themeTextShadow,\n isArbitraryVariableShadow,\n isArbitraryShadow,\n ],\n },\n ],\n /**\n * Text Shadow Color\n * @see https://tailwindcss.com/docs/text-shadow#setting-the-shadow-color\n */\n 'text-shadow-color': [{ 'text-shadow': scaleColor() }],\n /**\n * Opacity\n * @see https://tailwindcss.com/docs/opacity\n */\n opacity: [{ opacity: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Mix Blend Mode\n * @see https://tailwindcss.com/docs/mix-blend-mode\n */\n 'mix-blend': [{ 'mix-blend': [...scaleBlendMode(), 'plus-darker', 'plus-lighter'] }],\n /**\n * Background Blend Mode\n * @see https://tailwindcss.com/docs/background-blend-mode\n */\n 'bg-blend': [{ 'bg-blend': scaleBlendMode() }],\n /**\n * Mask Clip\n * @see https://tailwindcss.com/docs/mask-clip\n */\n 'mask-clip': [\n { 'mask-clip': ['border', 'padding', 'content', 'fill', 'stroke', 'view'] },\n 'mask-no-clip',\n ],\n /**\n * Mask Composite\n * @see https://tailwindcss.com/docs/mask-composite\n */\n 'mask-composite': [{ mask: ['add', 'subtract', 'intersect', 'exclude'] }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image-linear-pos': [{ 'mask-linear': [isNumber] }],\n 'mask-image-linear-from-pos': [{ 'mask-linear-from': scaleMaskImagePosition() }],\n 'mask-image-linear-to-pos': [{ 'mask-linear-to': scaleMaskImagePosition() }],\n 'mask-image-linear-from-color': [{ 'mask-linear-from': scaleColor() }],\n 'mask-image-linear-to-color': [{ 'mask-linear-to': scaleColor() }],\n 'mask-image-t-from-pos': [{ 'mask-t-from': scaleMaskImagePosition() }],\n 'mask-image-t-to-pos': [{ 'mask-t-to': scaleMaskImagePosition() }],\n 'mask-image-t-from-color': [{ 'mask-t-from': scaleColor() }],\n 'mask-image-t-to-color': [{ 'mask-t-to': scaleColor() }],\n 'mask-image-r-from-pos': [{ 'mask-r-from': scaleMaskImagePosition() }],\n 'mask-image-r-to-pos': [{ 'mask-r-to': scaleMaskImagePosition() }],\n 'mask-image-r-from-color': [{ 'mask-r-from': scaleColor() }],\n 'mask-image-r-to-color': [{ 'mask-r-to': scaleColor() }],\n 'mask-image-b-from-pos': [{ 'mask-b-from': scaleMaskImagePosition() }],\n 'mask-image-b-to-pos': [{ 'mask-b-to': scaleMaskImagePosition() }],\n 'mask-image-b-from-color': [{ 'mask-b-from': scaleColor() }],\n 'mask-image-b-to-color': [{ 'mask-b-to': scaleColor() }],\n 'mask-image-l-from-pos': [{ 'mask-l-from': scaleMaskImagePosition() }],\n 'mask-image-l-to-pos': [{ 'mask-l-to': scaleMaskImagePosition() }],\n 'mask-image-l-from-color': [{ 'mask-l-from': scaleColor() }],\n 'mask-image-l-to-color': [{ 'mask-l-to': scaleColor() }],\n 'mask-image-x-from-pos': [{ 'mask-x-from': scaleMaskImagePosition() }],\n 'mask-image-x-to-pos': [{ 'mask-x-to': scaleMaskImagePosition() }],\n 'mask-image-x-from-color': [{ 'mask-x-from': scaleColor() }],\n 'mask-image-x-to-color': [{ 'mask-x-to': scaleColor() }],\n 'mask-image-y-from-pos': [{ 'mask-y-from': scaleMaskImagePosition() }],\n 'mask-image-y-to-pos': [{ 'mask-y-to': scaleMaskImagePosition() }],\n 'mask-image-y-from-color': [{ 'mask-y-from': scaleColor() }],\n 'mask-image-y-to-color': [{ 'mask-y-to': scaleColor() }],\n 'mask-image-radial': [{ 'mask-radial': [isArbitraryVariable, isArbitraryValue] }],\n 'mask-image-radial-from-pos': [{ 'mask-radial-from': scaleMaskImagePosition() }],\n 'mask-image-radial-to-pos': [{ 'mask-radial-to': scaleMaskImagePosition() }],\n 'mask-image-radial-from-color': [{ 'mask-radial-from': scaleColor() }],\n 'mask-image-radial-to-color': [{ 'mask-radial-to': scaleColor() }],\n 'mask-image-radial-shape': [{ 'mask-radial': ['circle', 'ellipse'] }],\n 'mask-image-radial-size': [\n { 'mask-radial': [{ closest: ['side', 'corner'], farthest: ['side', 'corner'] }] },\n ],\n 'mask-image-radial-pos': [{ 'mask-radial-at': scalePosition() }],\n 'mask-image-conic-pos': [{ 'mask-conic': [isNumber] }],\n 'mask-image-conic-from-pos': [{ 'mask-conic-from': scaleMaskImagePosition() }],\n 'mask-image-conic-to-pos': [{ 'mask-conic-to': scaleMaskImagePosition() }],\n 'mask-image-conic-from-color': [{ 'mask-conic-from': scaleColor() }],\n 'mask-image-conic-to-color': [{ 'mask-conic-to': scaleColor() }],\n /**\n * Mask Mode\n * @see https://tailwindcss.com/docs/mask-mode\n */\n 'mask-mode': [{ mask: ['alpha', 'luminance', 'match'] }],\n /**\n * Mask Origin\n * @see https://tailwindcss.com/docs/mask-origin\n */\n 'mask-origin': [\n { 'mask-origin': ['border', 'padding', 'content', 'fill', 'stroke', 'view'] },\n ],\n /**\n * Mask Position\n * @see https://tailwindcss.com/docs/mask-position\n */\n 'mask-position': [{ mask: scaleBgPosition() }],\n /**\n * Mask Repeat\n * @see https://tailwindcss.com/docs/mask-repeat\n */\n 'mask-repeat': [{ mask: scaleBgRepeat() }],\n /**\n * Mask Size\n * @see https://tailwindcss.com/docs/mask-size\n */\n 'mask-size': [{ mask: scaleBgSize() }],\n /**\n * Mask Type\n * @see https://tailwindcss.com/docs/mask-type\n */\n 'mask-type': [{ 'mask-type': ['alpha', 'luminance'] }],\n /**\n * Mask Image\n * @see https://tailwindcss.com/docs/mask-image\n */\n 'mask-image': [{ mask: ['none', isArbitraryVariable, isArbitraryValue] }],\n\n // ---------------\n // --- Filters ---\n // ---------------\n\n /**\n * Filter\n * @see https://tailwindcss.com/docs/filter\n */\n filter: [\n {\n filter: [\n // Deprecated since Tailwind CSS v3.0.0\n '',\n 'none',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Blur\n * @see https://tailwindcss.com/docs/blur\n */\n blur: [{ blur: scaleBlur() }],\n /**\n * Brightness\n * @see https://tailwindcss.com/docs/brightness\n */\n brightness: [{ brightness: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Contrast\n * @see https://tailwindcss.com/docs/contrast\n */\n contrast: [{ contrast: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Drop Shadow\n * @see https://tailwindcss.com/docs/drop-shadow\n */\n 'drop-shadow': [\n {\n 'drop-shadow': [\n // Deprecated since Tailwind CSS v4.0.0\n '',\n 'none',\n themeDropShadow,\n isArbitraryVariableShadow,\n isArbitraryShadow,\n ],\n },\n ],\n /**\n * Drop Shadow Color\n * @see https://tailwindcss.com/docs/filter-drop-shadow#setting-the-shadow-color\n */\n 'drop-shadow-color': [{ 'drop-shadow': scaleColor() }],\n /**\n * Grayscale\n * @see https://tailwindcss.com/docs/grayscale\n */\n grayscale: [{ grayscale: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Hue Rotate\n * @see https://tailwindcss.com/docs/hue-rotate\n */\n 'hue-rotate': [{ 'hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Invert\n * @see https://tailwindcss.com/docs/invert\n */\n invert: [{ invert: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Saturate\n * @see https://tailwindcss.com/docs/saturate\n */\n saturate: [{ saturate: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Sepia\n * @see https://tailwindcss.com/docs/sepia\n */\n sepia: [{ sepia: ['', isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Backdrop Filter\n * @see https://tailwindcss.com/docs/backdrop-filter\n */\n 'backdrop-filter': [\n {\n 'backdrop-filter': [\n // Deprecated since Tailwind CSS v3.0.0\n '',\n 'none',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Backdrop Blur\n * @see https://tailwindcss.com/docs/backdrop-blur\n */\n 'backdrop-blur': [{ 'backdrop-blur': scaleBlur() }],\n /**\n * Backdrop Brightness\n * @see https://tailwindcss.com/docs/backdrop-brightness\n */\n 'backdrop-brightness': [\n { 'backdrop-brightness': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Contrast\n * @see https://tailwindcss.com/docs/backdrop-contrast\n */\n 'backdrop-contrast': [\n { 'backdrop-contrast': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Grayscale\n * @see https://tailwindcss.com/docs/backdrop-grayscale\n */\n 'backdrop-grayscale': [\n { 'backdrop-grayscale': ['', isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Hue Rotate\n * @see https://tailwindcss.com/docs/backdrop-hue-rotate\n */\n 'backdrop-hue-rotate': [\n { 'backdrop-hue-rotate': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Invert\n * @see https://tailwindcss.com/docs/backdrop-invert\n */\n 'backdrop-invert': [\n { 'backdrop-invert': ['', isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Opacity\n * @see https://tailwindcss.com/docs/backdrop-opacity\n */\n 'backdrop-opacity': [\n { 'backdrop-opacity': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Saturate\n * @see https://tailwindcss.com/docs/backdrop-saturate\n */\n 'backdrop-saturate': [\n { 'backdrop-saturate': [isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Backdrop Sepia\n * @see https://tailwindcss.com/docs/backdrop-sepia\n */\n 'backdrop-sepia': [\n { 'backdrop-sepia': ['', isNumber, isArbitraryVariable, isArbitraryValue] },\n ],\n\n // --------------\n // --- Tables ---\n // --------------\n\n /**\n * Border Collapse\n * @see https://tailwindcss.com/docs/border-collapse\n */\n 'border-collapse': [{ border: ['collapse', 'separate'] }],\n /**\n * Border Spacing\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing': [{ 'border-spacing': scaleUnambiguousSpacing() }],\n /**\n * Border Spacing X\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-x': [{ 'border-spacing-x': scaleUnambiguousSpacing() }],\n /**\n * Border Spacing Y\n * @see https://tailwindcss.com/docs/border-spacing\n */\n 'border-spacing-y': [{ 'border-spacing-y': scaleUnambiguousSpacing() }],\n /**\n * Table Layout\n * @see https://tailwindcss.com/docs/table-layout\n */\n 'table-layout': [{ table: ['auto', 'fixed'] }],\n /**\n * Caption Side\n * @see https://tailwindcss.com/docs/caption-side\n */\n caption: [{ caption: ['top', 'bottom'] }],\n\n // ---------------------------------\n // --- Transitions and Animation ---\n // ---------------------------------\n\n /**\n * Transition Property\n * @see https://tailwindcss.com/docs/transition-property\n */\n transition: [\n {\n transition: [\n '',\n 'all',\n 'colors',\n 'opacity',\n 'shadow',\n 'transform',\n 'none',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Transition Behavior\n * @see https://tailwindcss.com/docs/transition-behavior\n */\n 'transition-behavior': [{ transition: ['normal', 'discrete'] }],\n /**\n * Transition Duration\n * @see https://tailwindcss.com/docs/transition-duration\n */\n duration: [{ duration: [isNumber, 'initial', isArbitraryVariable, isArbitraryValue] }],\n /**\n * Transition Timing Function\n * @see https://tailwindcss.com/docs/transition-timing-function\n */\n ease: [\n { ease: ['linear', 'initial', themeEase, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Transition Delay\n * @see https://tailwindcss.com/docs/transition-delay\n */\n delay: [{ delay: [isNumber, isArbitraryVariable, isArbitraryValue] }],\n /**\n * Animation\n * @see https://tailwindcss.com/docs/animation\n */\n animate: [{ animate: ['none', themeAnimate, isArbitraryVariable, isArbitraryValue] }],\n\n // ------------------\n // --- Transforms ---\n // ------------------\n\n /**\n * Backface Visibility\n * @see https://tailwindcss.com/docs/backface-visibility\n */\n backface: [{ backface: ['hidden', 'visible'] }],\n /**\n * Perspective\n * @see https://tailwindcss.com/docs/perspective\n */\n perspective: [\n { perspective: [themePerspective, isArbitraryVariable, isArbitraryValue] },\n ],\n /**\n * Perspective Origin\n * @see https://tailwindcss.com/docs/perspective-origin\n */\n 'perspective-origin': [{ 'perspective-origin': scalePositionWithArbitrary() }],\n /**\n * Rotate\n * @see https://tailwindcss.com/docs/rotate\n */\n rotate: [{ rotate: scaleRotate() }],\n /**\n * Rotate X\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-x': [{ 'rotate-x': scaleRotate() }],\n /**\n * Rotate Y\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-y': [{ 'rotate-y': scaleRotate() }],\n /**\n * Rotate Z\n * @see https://tailwindcss.com/docs/rotate\n */\n 'rotate-z': [{ 'rotate-z': scaleRotate() }],\n /**\n * Scale\n * @see https://tailwindcss.com/docs/scale\n */\n scale: [{ scale: scaleScale() }],\n /**\n * Scale X\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-x': [{ 'scale-x': scaleScale() }],\n /**\n * Scale Y\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-y': [{ 'scale-y': scaleScale() }],\n /**\n * Scale Z\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-z': [{ 'scale-z': scaleScale() }],\n /**\n * Scale 3D\n * @see https://tailwindcss.com/docs/scale\n */\n 'scale-3d': ['scale-3d'],\n /**\n * Skew\n * @see https://tailwindcss.com/docs/skew\n */\n skew: [{ skew: scaleSkew() }],\n /**\n * Skew X\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-x': [{ 'skew-x': scaleSkew() }],\n /**\n * Skew Y\n * @see https://tailwindcss.com/docs/skew\n */\n 'skew-y': [{ 'skew-y': scaleSkew() }],\n /**\n * Transform\n * @see https://tailwindcss.com/docs/transform\n */\n transform: [\n { transform: [isArbitraryVariable, isArbitraryValue, '', 'none', 'gpu', 'cpu'] },\n ],\n /**\n * Transform Origin\n * @see https://tailwindcss.com/docs/transform-origin\n */\n 'transform-origin': [{ origin: scalePositionWithArbitrary() }],\n /**\n * Transform Style\n * @see https://tailwindcss.com/docs/transform-style\n */\n 'transform-style': [{ transform: ['3d', 'flat'] }],\n /**\n * Translate\n * @see https://tailwindcss.com/docs/translate\n */\n translate: [{ translate: scaleTranslate() }],\n /**\n * Translate X\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-x': [{ 'translate-x': scaleTranslate() }],\n /**\n * Translate Y\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-y': [{ 'translate-y': scaleTranslate() }],\n /**\n * Translate Z\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-z': [{ 'translate-z': scaleTranslate() }],\n /**\n * Translate None\n * @see https://tailwindcss.com/docs/translate\n */\n 'translate-none': ['translate-none'],\n /**\n * Zoom\n * @see https://tailwindcss.com/docs/zoom\n */\n zoom: [{ zoom: [isInteger, isArbitraryVariable, isArbitraryValue] }],\n\n // ---------------------\n // --- Interactivity ---\n // ---------------------\n\n /**\n * Accent Color\n * @see https://tailwindcss.com/docs/accent-color\n */\n accent: [{ accent: scaleColor() }],\n /**\n * Appearance\n * @see https://tailwindcss.com/docs/appearance\n */\n appearance: [{ appearance: ['none', 'auto'] }],\n /**\n * Caret Color\n * @see https://tailwindcss.com/docs/just-in-time-mode#caret-color-utilities\n */\n 'caret-color': [{ caret: scaleColor() }],\n /**\n * Color Scheme\n * @see https://tailwindcss.com/docs/color-scheme\n */\n 'color-scheme': [\n { scheme: ['normal', 'dark', 'light', 'light-dark', 'only-dark', 'only-light'] },\n ],\n /**\n * Cursor\n * @see https://tailwindcss.com/docs/cursor\n */\n cursor: [\n {\n cursor: [\n 'auto',\n 'default',\n 'pointer',\n 'wait',\n 'text',\n 'move',\n 'help',\n 'not-allowed',\n 'none',\n 'context-menu',\n 'progress',\n 'cell',\n 'crosshair',\n 'vertical-text',\n 'alias',\n 'copy',\n 'no-drop',\n 'grab',\n 'grabbing',\n 'all-scroll',\n 'col-resize',\n 'row-resize',\n 'n-resize',\n 'e-resize',\n 's-resize',\n 'w-resize',\n 'ne-resize',\n 'nw-resize',\n 'se-resize',\n 'sw-resize',\n 'ew-resize',\n 'ns-resize',\n 'nesw-resize',\n 'nwse-resize',\n 'zoom-in',\n 'zoom-out',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n /**\n * Field Sizing\n * @see https://tailwindcss.com/docs/field-sizing\n */\n 'field-sizing': [{ 'field-sizing': ['fixed', 'content'] }],\n /**\n * Pointer Events\n * @see https://tailwindcss.com/docs/pointer-events\n */\n 'pointer-events': [{ 'pointer-events': ['auto', 'none'] }],\n /**\n * Resize\n * @see https://tailwindcss.com/docs/resize\n */\n resize: [{ resize: ['none', '', 'y', 'x'] }],\n /**\n * Scroll Behavior\n * @see https://tailwindcss.com/docs/scroll-behavior\n */\n 'scroll-behavior': [{ scroll: ['auto', 'smooth'] }],\n /**\n * Scrollbar Thumb Color\n * @see https://tailwindcss.com/docs/scrollbar-color\n */\n 'scrollbar-thumb-color': [{ 'scrollbar-thumb': scaleColor() }],\n /**\n * Scrollbar Track Color\n * @see https://tailwindcss.com/docs/scrollbar-color\n */\n 'scrollbar-track-color': [{ 'scrollbar-track': scaleColor() }],\n /**\n * Scrollbar Gutter\n * @see https://tailwindcss.com/docs/scrollbar-gutter\n */\n 'scrollbar-gutter': [{ 'scrollbar-gutter': ['auto', 'stable', 'both'] }],\n /**\n * Scrollbar Width\n * @see https://tailwindcss.com/docs/scrollbar-width\n */\n 'scrollbar-w': [{ scrollbar: ['auto', 'thin', 'none'] }],\n /**\n * Scroll Margin\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-m': [{ 'scroll-m': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Inline\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mx': [{ 'scroll-mx': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Block\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-my': [{ 'scroll-my': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Inline Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ms': [{ 'scroll-ms': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Inline End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-me': [{ 'scroll-me': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Block Start\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mbs': [{ 'scroll-mbs': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Block End\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mbe': [{ 'scroll-mbe': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Top\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mt': [{ 'scroll-mt': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Right\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mr': [{ 'scroll-mr': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Bottom\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-mb': [{ 'scroll-mb': scaleUnambiguousSpacing() }],\n /**\n * Scroll Margin Left\n * @see https://tailwindcss.com/docs/scroll-margin\n */\n 'scroll-ml': [{ 'scroll-ml': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-p': [{ 'scroll-p': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Inline\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-px': [{ 'scroll-px': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Block\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-py': [{ 'scroll-py': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Inline Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-ps': [{ 'scroll-ps': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Inline End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pe': [{ 'scroll-pe': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Block Start\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pbs': [{ 'scroll-pbs': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Block End\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pbe': [{ 'scroll-pbe': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Top\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pt': [{ 'scroll-pt': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Right\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pr': [{ 'scroll-pr': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Bottom\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pb': [{ 'scroll-pb': scaleUnambiguousSpacing() }],\n /**\n * Scroll Padding Left\n * @see https://tailwindcss.com/docs/scroll-padding\n */\n 'scroll-pl': [{ 'scroll-pl': scaleUnambiguousSpacing() }],\n /**\n * Scroll Snap Align\n * @see https://tailwindcss.com/docs/scroll-snap-align\n */\n 'snap-align': [{ snap: ['start', 'end', 'center', 'align-none'] }],\n /**\n * Scroll Snap Stop\n * @see https://tailwindcss.com/docs/scroll-snap-stop\n */\n 'snap-stop': [{ snap: ['normal', 'always'] }],\n /**\n * Scroll Snap Type\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-type': [{ snap: ['none', 'x', 'y', 'both'] }],\n /**\n * Scroll Snap Type Strictness\n * @see https://tailwindcss.com/docs/scroll-snap-type\n */\n 'snap-strictness': [{ snap: ['mandatory', 'proximity'] }],\n /**\n * Touch Action\n * @see https://tailwindcss.com/docs/touch-action\n */\n touch: [{ touch: ['auto', 'none', 'manipulation'] }],\n /**\n * Touch Action X\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-x': [{ 'touch-pan': ['x', 'left', 'right'] }],\n /**\n * Touch Action Y\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-y': [{ 'touch-pan': ['y', 'up', 'down'] }],\n /**\n * Touch Action Pinch Zoom\n * @see https://tailwindcss.com/docs/touch-action\n */\n 'touch-pz': ['touch-pinch-zoom'],\n /**\n * User Select\n * @see https://tailwindcss.com/docs/user-select\n */\n select: [{ select: ['none', 'text', 'all', 'auto'] }],\n /**\n * Will Change\n * @see https://tailwindcss.com/docs/will-change\n */\n 'will-change': [\n {\n 'will-change': [\n 'auto',\n 'scroll',\n 'contents',\n 'transform',\n isArbitraryVariable,\n isArbitraryValue,\n ],\n },\n ],\n\n // -----------\n // --- SVG ---\n // -----------\n\n /**\n * Fill\n * @see https://tailwindcss.com/docs/fill\n */\n fill: [{ fill: ['none', ...scaleColor()] }],\n /**\n * Stroke Width\n * @see https://tailwindcss.com/docs/stroke-width\n */\n 'stroke-w': [\n {\n stroke: [\n isNumber,\n isArbitraryVariableLength,\n isArbitraryLength,\n isArbitraryNumber,\n ],\n },\n ],\n /**\n * Stroke\n * @see https://tailwindcss.com/docs/stroke\n */\n stroke: [{ stroke: ['none', ...scaleColor()] }],\n\n // ---------------------\n // --- Accessibility ---\n // ---------------------\n\n /**\n * Forced Color Adjust\n * @see https://tailwindcss.com/docs/forced-color-adjust\n */\n 'forced-color-adjust': [{ 'forced-color-adjust': ['auto', 'none'] }],\n },\n conflictingClassGroups: {\n 'container-named': ['container-type'],\n overflow: ['overflow-x', 'overflow-y'],\n overscroll: ['overscroll-x', 'overscroll-y'],\n inset: [\n 'inset-x',\n 'inset-y',\n 'inset-bs',\n 'inset-be',\n 'start',\n 'end',\n 'top',\n 'right',\n 'bottom',\n 'left',\n ],\n 'inset-x': ['right', 'left'],\n 'inset-y': ['top', 'bottom'],\n flex: ['basis', 'grow', 'shrink'],\n gap: ['gap-x', 'gap-y'],\n p: ['px', 'py', 'ps', 'pe', 'pbs', 'pbe', 'pt', 'pr', 'pb', 'pl'],\n px: ['pr', 'pl'],\n py: ['pt', 'pb'],\n m: ['mx', 'my', 'ms', 'me', 'mbs', 'mbe', 'mt', 'mr', 'mb', 'ml'],\n mx: ['mr', 'ml'],\n my: ['mt', 'mb'],\n size: ['w', 'h'],\n 'font-size': ['leading'],\n 'fvn-normal': [\n 'fvn-ordinal',\n 'fvn-slashed-zero',\n 'fvn-figure',\n 'fvn-spacing',\n 'fvn-fraction',\n ],\n 'fvn-ordinal': ['fvn-normal'],\n 'fvn-slashed-zero': ['fvn-normal'],\n 'fvn-figure': ['fvn-normal'],\n 'fvn-spacing': ['fvn-normal'],\n 'fvn-fraction': ['fvn-normal'],\n 'line-clamp': ['display', 'overflow'],\n rounded: [\n 'rounded-s',\n 'rounded-e',\n 'rounded-t',\n 'rounded-r',\n 'rounded-b',\n 'rounded-l',\n 'rounded-ss',\n 'rounded-se',\n 'rounded-ee',\n 'rounded-es',\n 'rounded-tl',\n 'rounded-tr',\n 'rounded-br',\n 'rounded-bl',\n ],\n 'rounded-s': ['rounded-ss', 'rounded-es'],\n 'rounded-e': ['rounded-se', 'rounded-ee'],\n 'rounded-t': ['rounded-tl', 'rounded-tr'],\n 'rounded-r': ['rounded-tr', 'rounded-br'],\n 'rounded-b': ['rounded-br', 'rounded-bl'],\n 'rounded-l': ['rounded-tl', 'rounded-bl'],\n 'border-spacing': ['border-spacing-x', 'border-spacing-y'],\n 'border-w': [\n 'border-w-x',\n 'border-w-y',\n 'border-w-s',\n 'border-w-e',\n 'border-w-bs',\n 'border-w-be',\n 'border-w-t',\n 'border-w-r',\n 'border-w-b',\n 'border-w-l',\n ],\n 'border-w-x': ['border-w-r', 'border-w-l'],\n 'border-w-y': ['border-w-t', 'border-w-b'],\n 'border-color': [\n 'border-color-x',\n 'border-color-y',\n 'border-color-s',\n 'border-color-e',\n 'border-color-bs',\n 'border-color-be',\n 'border-color-t',\n 'border-color-r',\n 'border-color-b',\n 'border-color-l',\n ],\n 'border-color-x': ['border-color-r', 'border-color-l'],\n 'border-color-y': ['border-color-t', 'border-color-b'],\n translate: ['translate-x', 'translate-y', 'translate-none'],\n 'translate-none': ['translate', 'translate-x', 'translate-y', 'translate-z'],\n 'scroll-m': [\n 'scroll-mx',\n 'scroll-my',\n 'scroll-ms',\n 'scroll-me',\n 'scroll-mbs',\n 'scroll-mbe',\n 'scroll-mt',\n 'scroll-mr',\n 'scroll-mb',\n 'scroll-ml',\n ],\n 'scroll-mx': ['scroll-mr', 'scroll-ml'],\n 'scroll-my': ['scroll-mt', 'scroll-mb'],\n 'scroll-p': [\n 'scroll-px',\n 'scroll-py',\n 'scroll-ps',\n 'scroll-pe',\n 'scroll-pbs',\n 'scroll-pbe',\n 'scroll-pt',\n 'scroll-pr',\n 'scroll-pb',\n 'scroll-pl',\n ],\n 'scroll-px': ['scroll-pr', 'scroll-pl'],\n 'scroll-py': ['scroll-pt', 'scroll-pb'],\n touch: ['touch-x', 'touch-y', 'touch-pz'],\n 'touch-x': ['touch'],\n 'touch-y': ['touch'],\n 'touch-pz': ['touch'],\n },\n conflictingClassGroupModifiers: {\n 'font-size': ['leading'],\n },\n postfixLookupClassGroups: ['container-type'],\n orderSensitiveModifiers: [\n '*',\n '**',\n 'after',\n 'backdrop',\n 'before',\n 'details-content',\n 'file',\n 'first-letter',\n 'first-line',\n 'marker',\n 'placeholder',\n 'selection',\n ],\n } as const satisfies Config<DefaultClassGroupIds, DefaultThemeGroupIds>\n}\n","import { AnyConfig, ConfigExtension, NoInfer } from './types'\n\n/**\n * @param baseConfig Config where other config will be merged into. This object will be mutated.\n * @param configExtension Partial config to merge into the `baseConfig`.\n */\nexport const mergeConfigs = <ClassGroupIds extends string, ThemeGroupIds extends string = never>(\n baseConfig: AnyConfig,\n {\n cacheSize,\n prefix,\n experimentalParseClassName,\n extend = {},\n override = {},\n }: ConfigExtension<ClassGroupIds, ThemeGroupIds>,\n) => {\n overrideProperty(baseConfig, 'cacheSize', cacheSize)\n overrideProperty(baseConfig, 'prefix', prefix)\n overrideProperty(baseConfig, 'experimentalParseClassName', experimentalParseClassName)\n\n overrideConfigProperties(baseConfig.theme, override.theme)\n overrideConfigProperties(baseConfig.classGroups, override.classGroups)\n overrideConfigProperties(baseConfig.conflictingClassGroups, override.conflictingClassGroups)\n overrideConfigProperties(\n baseConfig.conflictingClassGroupModifiers,\n override.conflictingClassGroupModifiers,\n )\n overrideProperty(baseConfig, 'postfixLookupClassGroups', override.postfixLookupClassGroups)\n overrideProperty(baseConfig, 'orderSensitiveModifiers', override.orderSensitiveModifiers)\n\n mergeConfigProperties(baseConfig.theme, extend.theme)\n mergeConfigProperties(baseConfig.classGroups, extend.classGroups)\n mergeConfigProperties(baseConfig.conflictingClassGroups, extend.conflictingClassGroups)\n mergeConfigProperties(\n baseConfig.conflictingClassGroupModifiers,\n extend.conflictingClassGroupModifiers,\n )\n mergeArrayProperties(baseConfig, extend, 'postfixLookupClassGroups')\n mergeArrayProperties(baseConfig, extend, 'orderSensitiveModifiers')\n\n return baseConfig\n}\n\nconst overrideProperty = <T extends object, K extends keyof T>(\n baseObject: T,\n overrideKey: K,\n overrideValue: T[K] | undefined,\n) => {\n if (overrideValue !== undefined) {\n baseObject[overrideKey] = overrideValue\n }\n}\n\nconst overrideConfigProperties = (\n baseObject: Partial<Record<string, readonly unknown[]>>,\n overrideObject: Partial<Record<string, readonly unknown[]>> | undefined,\n) => {\n if (overrideObject) {\n for (const key in overrideObject) {\n overrideProperty(baseObject, key, overrideObject[key])\n }\n }\n}\n\nconst mergeConfigProperties = (\n baseObject: Partial<Record<string, readonly unknown[]>>,\n mergeObject: Partial<Record<string, readonly unknown[]>> | undefined,\n) => {\n if (mergeObject) {\n for (const key in mergeObject) {\n mergeArrayProperties(baseObject, mergeObject, key)\n }\n }\n}\n\nconst mergeArrayProperties = <Key extends string>(\n baseObject: Partial<Record<NoInfer<Key>, readonly unknown[]>>,\n mergeObject: Partial<Record<NoInfer<Key>, readonly unknown[]>>,\n key: Key,\n) => {\n const mergeValue = mergeObject[key]\n\n if (mergeValue !== undefined) {\n baseObject[key] = baseObject[key] ? baseObject[key].concat(mergeValue) : mergeValue\n }\n}\n","import { createTailwindMerge } from './create-tailwind-merge'\nimport { getDefaultConfig } from './default-config'\nimport { mergeConfigs } from './merge-configs'\nimport { AnyConfig, ConfigExtension, DefaultClassGroupIds, DefaultThemeGroupIds } from './types'\n\ntype CreateConfigSubsequent = (config: AnyConfig) => AnyConfig\n\nexport const extendTailwindMerge = <\n AdditionalClassGroupIds extends string = never,\n AdditionalThemeGroupIds extends string = never,\n>(\n configExtension:\n | ConfigExtension<\n DefaultClassGroupIds | AdditionalClassGroupIds,\n DefaultThemeGroupIds | AdditionalThemeGroupIds\n >\n | CreateConfigSubsequent,\n ...createConfig: CreateConfigSubsequent[]\n) =>\n typeof configExtension === 'function'\n ? createTailwindMerge(getDefaultConfig, configExtension, ...createConfig)\n : createTailwindMerge(\n () => mergeConfigs(getDefaultConfig(), configExtension),\n ...createConfig,\n )\n","import { createTailwindMerge } from './create-tailwind-merge'\nimport { getDefaultConfig } from './default-config'\n\nexport const twMerge = createTailwindMerge(getDefaultConfig)\n","import { clsx, type ClassValue } from 'clsx'\nimport { twMerge } from 'tailwind-merge'\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs))\n}\n","/**\n * Copyright 2022 Joe Bell. All rights reserved.\n *\n * This file is licensed to you under the Apache License, Version 2.0\n * (the \"License\"); you may not use this file except in compliance with the\n * License. You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR REPRESENTATIONS OF ANY KIND, either express or implied. See the\n * License for the specific language governing permissions and limitations under\n * the License.\n */ import { clsx } from \"clsx\";\nconst falsyToString = (value)=>typeof value === \"boolean\" ? `${value}` : value === 0 ? \"0\" : value;\nexport const cx = clsx;\nexport const cva = (base, config)=>(props)=>{\n var _config_compoundVariants;\n if ((config === null || config === void 0 ? void 0 : config.variants) == null) return cx(base, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);\n const { variants, defaultVariants } = config;\n const getVariantClassNames = Object.keys(variants).map((variant)=>{\n const variantProp = props === null || props === void 0 ? void 0 : props[variant];\n const defaultVariantProp = defaultVariants === null || defaultVariants === void 0 ? void 0 : defaultVariants[variant];\n if (variantProp === null) return null;\n const variantKey = falsyToString(variantProp) || falsyToString(defaultVariantProp);\n return variants[variant][variantKey];\n });\n const propsWithoutUndefined = props && Object.entries(props).reduce((acc, param)=>{\n let [key, value] = param;\n if (value === undefined) {\n return acc;\n }\n acc[key] = value;\n return acc;\n }, {});\n const getCompoundVariantClassNames = config === null || config === void 0 ? void 0 : (_config_compoundVariants = config.compoundVariants) === null || _config_compoundVariants === void 0 ? void 0 : _config_compoundVariants.reduce((acc, param)=>{\n let { class: cvClass, className: cvClassName, ...compoundVariantOptions } = param;\n return Object.entries(compoundVariantOptions).every((param)=>{\n let [key, value] = param;\n return Array.isArray(value) ? value.includes({\n ...defaultVariants,\n ...propsWithoutUndefined\n }[key]) : ({\n ...defaultVariants,\n ...propsWithoutUndefined\n })[key] === value;\n }) ? [\n ...acc,\n cvClass,\n cvClassName\n ] : acc;\n }, []);\n return cx(base, getVariantClassNames, getCompoundVariantClassNames, props === null || props === void 0 ? void 0 : props.class, props === null || props === void 0 ? void 0 : props.className);\n };\n\n","'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { Toggle as TogglePrimitive } from 'radix-ui'\n\nimport { cn } from '../lib/utils'\n\nconst toggleVariants = cva(\n \"inline-flex items-center justify-center gap-2 rounded-md text-sm font-medium whitespace-nowrap transition-[color,box-shadow] outline-none hover:bg-muted hover:text-muted-foreground focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 aria-invalid:border-destructive aria-invalid:ring-destructive/20 data-[state=on]:bg-accent data-[state=on]:text-accent-foreground [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4\",\n {\n variants: {\n variant: {\n default: 'bg-transparent border-0',\n outline: 'border border-input bg-transparent shadow-xs hover:bg-accent hover:text-accent-foreground',\n },\n size: {\n default: 'px-2 py-1',\n sm: 'h-8 min-w-8 px-1.5',\n lg: 'h-10 min-w-10 px-2.5',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nfunction Toggle({\n className,\n variant,\n size,\n ...props\n}: React.ComponentProps<typeof TogglePrimitive.Root> &\n VariantProps<typeof toggleVariants>) {\n return (\n <TogglePrimitive.Root\n data-slot=\"toggle\"\n className={cn(toggleVariants({ variant, size, className }))}\n {...props}\n />\n )\n}\n\nexport { Toggle, toggleVariants }\n","'use client'\n\nimport * as React from 'react'\nimport { GripVertical } from 'lucide-react'\n\nimport { cn } from '../lib/utils'\n\nconst DragHandle = React.forwardRef<HTMLButtonElement, React.ButtonHTMLAttributes<HTMLButtonElement>>(\n ({ className, type = 'button', ...props }, ref) => {\n return (\n <button\n ref={ref}\n type={type}\n data-slot=\"drag-handle\"\n className={cn(\n 'inline-flex h-7 w-4 shrink-0 items-center justify-center rounded-md transition-all duration-200 max-h-[30px]',\n 'bg-white border border-transparent text-stone-500 shadow-md cursor-grab',\n 'enabled:hover:border enabled:hover:border-stone-200 enabled:hover:text-stone-950',\n 'enabled:active:border enabled:active:border-primary enabled:active:bg-primary-50 enabled:active:text-stone-950 enabled:active:shadow enabled:active:cursor-grabbing',\n 'disabled:cursor-not-allowed disabled:opacity-40 disabled:text-stone-950 disabled:pointer-events-none',\n className\n )}\n {...props}\n >\n <GripVertical className=\"size-4 shrink-0\" aria-hidden=\"true\" />\n </button>\n )\n }\n)\nDragHandle.displayName = 'DragHandle'\n\nexport { DragHandle }\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\n/**\n * Custom/Toolbar shell (Figma 7320:11058).\n * One pill, two fills — text formatting or item actions. No hardcoded colors.\n */\nconst CustomToolbar = React.forwardRef<\n HTMLDivElement,\n React.HTMLAttributes<HTMLDivElement>\n>(({ className, onMouseDown, ...props }, ref) => (\n <div\n ref={ref}\n data-ohw-toolbar=\"\"\n className={cn(\n // Figma: bg background, radius 8, gap-1, p-0.5, shadow-md — no border\n 'inline-flex h-8 items-center gap-1 rounded-[var(--radius,0.5rem)] bg-background p-0.5 font-sans whitespace-nowrap shadow-md',\n className\n )}\n onMouseDown={(e) => {\n e.stopPropagation()\n onMouseDown?.(e)\n }}\n {...props}\n />\n))\nCustomToolbar.displayName = 'CustomToolbar'\n\n/** Separators belong on the text-format fill only — not item-actions. */\nfunction CustomToolbarDivider({ className, ...props }: React.HTMLAttributes<HTMLSpanElement>) {\n return (\n <span\n aria-hidden\n className={cn('block h-6 w-px shrink-0 bg-border', className)}\n {...props}\n />\n )\n}\n\ntype CustomToolbarButtonProps = React.ButtonHTMLAttributes<HTMLButtonElement> & {\n active?: boolean\n}\n\n/** Figma Toggle: 28×28, radius calc(var(--radius)-2px)=6px, icon 16. */\nconst CustomToolbarButton = React.forwardRef<HTMLButtonElement, CustomToolbarButtonProps>(\n ({ className, active = false, type = 'button', ...props }, ref) => (\n <button\n ref={ref}\n type={type}\n className={cn(\n 'inline-flex size-7 shrink-0 items-center justify-center rounded-[calc(var(--radius,0.5rem)-2px)] text-foreground transition-colors',\n active\n ? 'bg-primary text-primary-foreground'\n : 'bg-transparent hover:bg-muted disabled:cursor-not-allowed disabled:text-muted-foreground disabled:opacity-60',\n className\n )}\n {...props}\n />\n )\n)\nCustomToolbarButton.displayName = 'CustomToolbarButton'\n\nexport { CustomToolbar, CustomToolbarButton, CustomToolbarDivider }\n","'use client'\n\nimport type { ComponentProps, ReactNode } from 'react'\nimport { useState } from 'react'\nimport { Copy, CornerLeftUp, Link, MoreHorizontal, Plus, Trash2 } from 'lucide-react'\n\nimport {\n CustomToolbar,\n CustomToolbarButton,\n} from './custom-toolbar'\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuGroup,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuTrigger,\n} from './dropdown-menu'\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './tooltip'\n\ntype ItemActionToolbarProps = {\n onEditLink?: () => void\n onAddItem?: () => void\n onSelectParent?: () => void\n onDuplicate?: () => void\n /** Wired by OHH-458 — row is always shown (destructive). */\n onDelete?: () => void\n editLinkDisabled?: boolean\n addItemDisabled?: boolean\n moreDisabled?: boolean\n selectParentDisabled?: boolean\n duplicateDisabled?: boolean\n deleteDisabled?: boolean\n /** Hide Add item — CTA buttons only show Edit link (prototype). */\n showAddItem?: boolean\n /** Hide More — CTA buttons only show Edit link (prototype). */\n showMore?: boolean\n /** Tooltip placement relative to each icon — Figma uses bottom. */\n tooltipSide?: 'top' | 'bottom' | 'left' | 'right'\n}\n\ntype ToolbarActionTooltipProps = {\n label: string\n side?: 'top' | 'bottom' | 'left' | 'right'\n disabled?: boolean\n buttonProps: ComponentProps<typeof CustomToolbarButton>\n children: ReactNode\n}\n\nfunction ToolbarActionTooltip({\n label,\n side = 'bottom',\n disabled = false,\n buttonProps,\n children,\n}: ToolbarActionTooltipProps) {\n const button = (\n <CustomToolbarButton type=\"button\" aria-label={label} disabled={disabled} {...buttonProps}>\n {children}\n </CustomToolbarButton>\n )\n\n return (\n <Tooltip>\n <TooltipTrigger asChild>\n {disabled ? <span className=\"inline-flex\">{button}</span> : button}\n </TooltipTrigger>\n <TooltipContent side={side} sideOffset={9}>\n {label}\n </TooltipContent>\n </Tooltip>\n )\n}\n\n/** Item-action fill for Custom/Toolbar — Edit link / Add item / More (no separators). */\nfunction ItemActionToolbar({\n onEditLink,\n onAddItem,\n onSelectParent,\n onDuplicate,\n onDelete,\n editLinkDisabled = false,\n addItemDisabled = true,\n moreDisabled = false,\n selectParentDisabled = false,\n duplicateDisabled = false,\n deleteDisabled = false,\n showAddItem = true,\n showMore = true,\n tooltipSide = 'bottom',\n}: ItemActionToolbarProps) {\n const [moreOpen, setMoreOpen] = useState(false)\n\n return (\n <TooltipProvider delayDuration={0}>\n <CustomToolbar>\n <ToolbarActionTooltip\n label=\"Edit link\"\n side={tooltipSide}\n disabled={editLinkDisabled}\n buttonProps={{\n onMouseDown: (e) => {\n if (editLinkDisabled) return\n e.preventDefault()\n e.stopPropagation()\n onEditLink?.()\n },\n onClick: (e) => {\n e.preventDefault()\n e.stopPropagation()\n },\n }}\n >\n <Link className=\"size-4 shrink-0\" aria-hidden />\n </ToolbarActionTooltip>\n {showAddItem ? (\n <ToolbarActionTooltip\n label=\"Add item\"\n side={tooltipSide}\n disabled={addItemDisabled}\n buttonProps={{\n onMouseDown: (e) => {\n if (addItemDisabled) return\n e.preventDefault()\n e.stopPropagation()\n onAddItem?.()\n },\n }}\n >\n <Plus className=\"size-4 shrink-0\" aria-hidden />\n </ToolbarActionTooltip>\n ) : null}\n {showMore ? (\n <DropdownMenu open={moreOpen} onOpenChange={setMoreOpen}>\n <Tooltip open={moreOpen ? false : undefined}>\n <TooltipTrigger asChild>\n <DropdownMenuTrigger asChild disabled={moreDisabled}>\n <CustomToolbarButton\n type=\"button\"\n aria-label=\"More\"\n disabled={moreDisabled}\n onMouseDown={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}\n >\n <MoreHorizontal className=\"size-4 shrink-0\" aria-hidden />\n </CustomToolbarButton>\n </DropdownMenuTrigger>\n </TooltipTrigger>\n <TooltipContent side={tooltipSide} sideOffset={9}>\n More\n </TooltipContent>\n </Tooltip>\n {/* Figma 8202:1581 — Select parent / Duplicate | Delete */}\n <DropdownMenuContent\n align=\"end\"\n side=\"bottom\"\n onCloseAutoFocus={(e) => e.preventDefault()}\n onMouseDown={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}\n >\n <DropdownMenuGroup>\n <DropdownMenuItem\n disabled={selectParentDisabled}\n onSelect={() => onSelectParent?.()}\n >\n <CornerLeftUp size={12} aria-hidden />\n Select parent\n </DropdownMenuItem>\n <DropdownMenuItem\n disabled={duplicateDisabled}\n onSelect={() => onDuplicate?.()}\n >\n <Copy size={12} aria-hidden />\n Duplicate\n </DropdownMenuItem>\n </DropdownMenuGroup>\n <DropdownMenuSeparator />\n <DropdownMenuGroup>\n <DropdownMenuItem\n variant=\"destructive\"\n disabled={deleteDisabled}\n onSelect={() => onDelete?.()}\n >\n <Trash2 size={15} aria-hidden />\n Delete\n </DropdownMenuItem>\n </DropdownMenuGroup>\n </DropdownMenuContent>\n </DropdownMenu>\n ) : null}\n </CustomToolbar>\n </TooltipProvider>\n )\n}\n\nexport { ItemActionToolbar }\nexport type { ItemActionToolbarProps }\n","'use client'\n\nimport * as React from 'react'\nimport { DropdownMenu as DropdownMenuPrimitive } from 'radix-ui'\n\nimport { cn } from '../lib/utils'\n\nfunction DropdownMenu({ ...props }: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {\n return <DropdownMenuPrimitive.Root data-slot=\"dropdown-menu\" {...props} />\n}\n\nfunction DropdownMenuTrigger({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {\n return <DropdownMenuPrimitive.Trigger data-slot=\"dropdown-menu-trigger\" {...props} />\n}\n\nfunction DropdownMenuPortal({\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {\n return <DropdownMenuPrimitive.Portal data-slot=\"dropdown-menu-portal\" {...props} />\n}\n\nfunction DropdownMenuGroup({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {\n return (\n <DropdownMenuPrimitive.Group\n data-slot=\"dropdown-menu-group\"\n className={cn('flex w-full flex-col items-start p-1', className)}\n {...props}\n />\n )\n}\n\n/**\n * Figma Dropdown Menu (4:6588 / 8202:1581):\n * border, radius 6, shadow-md, min 128px / typical 224px width.\n */\nfunction DropdownMenuContent({\n className,\n sideOffset = 6,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Content>) {\n return (\n <DropdownMenuPrimitive.Portal>\n <DropdownMenuPrimitive.Content\n data-slot=\"dropdown-menu-content\"\n data-ohw-more-menu=\"\"\n sideOffset={sideOffset}\n className={cn(\n 'z-[2147483647] flex w-56 min-w-32 flex-col items-center overflow-hidden rounded-[6px] border border-border bg-popover p-0 text-popover-foreground outline-none',\n 'shadow-[0px_4px_6px_0px_rgba(0,0,0,0.1),0px_2px_4px_0px_rgba(0,0,0,0.1)]',\n 'origin-[var(--radix-dropdown-menu-content-transform-origin)]',\n 'data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',\n 'data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2',\n className\n )}\n {...props}\n />\n </DropdownMenuPrimitive.Portal>\n )\n}\n\n/**\n * Figma Command Base / CMDK Item — leading icon at left 8px, label at pl-8.\n */\nfunction DropdownMenuItem({\n className,\n inset,\n variant = 'default',\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {\n inset?: boolean\n variant?: 'default' | 'destructive'\n}) {\n return (\n <DropdownMenuPrimitive.Item\n data-slot=\"dropdown-menu-item\"\n data-inset={inset ? '' : undefined}\n data-variant={variant}\n className={cn(\n 'relative flex w-full min-w-32 cursor-pointer select-none items-center gap-2 rounded-[calc(var(--radius,0.5rem)-4px)] py-1.5 pl-8 pr-2 text-sm leading-5 outline-none',\n 'text-popover-foreground',\n 'focus:bg-muted data-[highlighted]:bg-muted',\n 'data-[disabled]:pointer-events-none data-[disabled]:opacity-50',\n '[&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0',\n '[&_svg:not([class*=absolute])]:relative',\n // Leading icon — Figma absolute left-2 / top-1/2\n '[&>svg:first-child]:absolute [&>svg:first-child]:left-2 [&>svg:first-child]:top-1/2 [&>svg:first-child]:-translate-y-1/2',\n 'data-[variant=destructive]:text-destructive',\n 'data-[variant=destructive]:focus:bg-bg-destructive-10 data-[variant=destructive]:focus:text-destructive',\n 'data-[variant=destructive]:data-[highlighted]:bg-bg-destructive-10 data-[variant=destructive]:data-[highlighted]:text-destructive',\n 'data-[variant=destructive]:[&_svg]:text-destructive',\n inset && 'pl-8',\n className\n )}\n {...props}\n />\n )\n}\n\n/** Full-bleed section divider — Figma section border-t (not inset hairline). */\nfunction DropdownMenuSeparator({\n className,\n ...props\n}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {\n return (\n <DropdownMenuPrimitive.Separator\n data-slot=\"dropdown-menu-separator\"\n className={cn('h-px w-full bg-border', className)}\n {...props}\n />\n )\n}\n\nexport {\n DropdownMenu,\n DropdownMenuTrigger,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuSeparator,\n DropdownMenuGroup,\n DropdownMenuPortal,\n}\n","'use client'\n\nimport * as React from 'react'\nimport { Tooltip as TooltipPrimitive } from 'radix-ui'\n\nimport { cn } from '../lib/utils'\n\nfunction TooltipProvider({\n delayDuration = 0,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Provider>) {\n return <TooltipPrimitive.Provider data-slot=\"tooltip-provider\" delayDuration={delayDuration} {...props} />\n}\n\nfunction Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {\n return <TooltipPrimitive.Root data-slot=\"tooltip\" {...props} />\n}\n\nfunction TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {\n return <TooltipPrimitive.Trigger data-slot=\"tooltip-trigger\" {...props} />\n}\n\nconst arrowClassBySide = {\n top: 'before:bottom-0 before:left-1/2 before:-translate-x-1/2 before:translate-y-1/2',\n bottom: 'before:top-0 before:left-1/2 before:-translate-x-1/2 before:-translate-y-1/2',\n left: 'before:right-0 before:top-1/2 before:-translate-y-1/2 before:translate-x-1/2',\n right: 'before:left-0 before:top-1/2 before:-translate-y-1/2 before:-translate-x-1/2',\n} as const\n\n/**\n * Tooltip content — CSS caret (not Radix Arrow) so `sideOffset` is the true\n * trigger↔tooltip gap. Default 6px matches item-action toolbar AC.\n */\nfunction TooltipContent({\n className,\n sideOffset = 9,\n side = 'bottom',\n children,\n hideArrow,\n ...props\n}: React.ComponentProps<typeof TooltipPrimitive.Content> & { hideArrow?: boolean }) {\n const resolvedSide = (side ?? 'bottom') as keyof typeof arrowClassBySide\n\n return (\n <TooltipPrimitive.Portal>\n <TooltipPrimitive.Content\n data-slot=\"tooltip-content\"\n side={side}\n sideOffset={sideOffset}\n className={cn(\n 'relative z-[2147483647] inline-flex w-fit max-w-xs items-center rounded-md bg-foreground px-3 py-1.5 text-xs text-background',\n 'origin-[var(--radix-tooltip-content-transform-origin)] animate-in fade-in-0 zoom-in-95',\n 'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',\n 'data-[side=bottom]:slide-in-from-top-2 data-[side=top]:slide-in-from-bottom-2',\n 'data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2',\n !hideArrow &&\n 'before:pointer-events-none before:absolute before:size-2 before:rotate-45 before:bg-foreground before:content-[\"\"]',\n !hideArrow && arrowClassBySide[resolvedSide],\n className\n )}\n {...props}\n >\n {children}\n </TooltipPrimitive.Content>\n </TooltipPrimitive.Portal>\n )\n}\n\nexport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger }\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\nimport { DragHandle } from './drag-handle'\n\nexport type ItemInteractionState =\n | 'default'\n | 'hover'\n | 'sibling-hint'\n | 'active-top'\n | 'active-bottom'\n | 'dragging'\n\ntype ItemInteractionLayerProps = {\n rect: DOMRect\n state: ItemInteractionState\n elRef?: React.Ref<HTMLDivElement>\n /** Slotted Custom/Toolbar instance (item-action or other fill). */\n toolbar?: React.ReactNode\n showHandle?: boolean\n dragDisabled?: boolean\n dragHandleLabel?: string\n onDragHandleDragStart?: (e: React.DragEvent<HTMLButtonElement>) => void\n onDragHandleDragEnd?: (e: React.DragEvent<HTMLButtonElement>) => void\n /** Press on the item chrome (not handle/toolbar) — starts press-to-drag. */\n onItemPointerDown?: (e: React.PointerEvent<HTMLDivElement>) => void\n /** Click on chrome without a drag — typically enter text edit. */\n onItemClick?: (clientX: number, clientY: number) => void\n /**\n * Full-bleed press-drag surface over the selection.\n * Disable for footer column frames so child links keep grab cursor / hover.\n */\n itemDragSurface?: boolean\n /** Gap between element and chrome border — Figma inset is 4px. */\n chromeGap?: number\n className?: string\n}\n\nconst PRIMARY = 'var(--ohw-primary, #0885FE)'\nconst FOCUS_RING = `0 0 0 4px color-mix(in srgb, ${PRIMARY} 12%, transparent)`\nconst DRAG_SHADOW =\n '0px 4px 6px -1px rgba(0, 0, 0, 0.1), 0px 2px 4px -2px rgba(0, 0, 0, 0.1)'\nconst TOOLBAR_EDGE_MARGIN = 4\n/** Must match OhhwellsBridge SELECTION_CHROME_GAP / TOOLBAR_STROKE_GAP. */\nconst SELECTION_CHROME_GAP = 4\nconst TOOLBAR_STROKE_GAP = 4\n\n/** Keep below link-modal overlay (2147483646) / content (2147483647). */\nfunction getChromeZIndex(state: ItemInteractionState): number {\n switch (state) {\n case 'active-top':\n case 'active-bottom':\n case 'dragging':\n return 2147483644\n case 'hover':\n case 'sibling-hint':\n return 2147483643\n default:\n return 2147483642\n }\n}\n\nfunction getChromeStyle(state: ItemInteractionState): React.CSSProperties {\n switch (state) {\n case 'hover':\n return {\n border: `1.5px dashed ${PRIMARY}`,\n boxShadow: 'none',\n }\n case 'sibling-hint':\n return {\n border: `1.5px dashed color-mix(in srgb, ${PRIMARY} 30%, transparent)`,\n boxShadow: 'none',\n }\n case 'active-top':\n case 'active-bottom':\n return {\n border: `2px solid ${PRIMARY}`,\n boxShadow: FOCUS_RING,\n }\n case 'dragging':\n return {\n border: `2px solid ${PRIMARY}`,\n boxShadow: `${FOCUS_RING}, ${DRAG_SHADOW}`,\n }\n default:\n return {}\n }\n}\n\nfunction ClampedToolbarSlot({\n placement,\n children,\n}: {\n placement: 'top' | 'bottom'\n children: React.ReactNode\n}) {\n const slotRef = React.useRef<HTMLDivElement>(null)\n\n React.useLayoutEffect(() => {\n const slot = slotRef.current\n if (!slot) return\n\n const clamp = () => {\n const toolbar = slot.firstElementChild as HTMLElement | null\n if (!toolbar) return\n const w = toolbar.offsetWidth\n if (w <= 0) return\n const parent = slot.offsetParent as HTMLElement | null\n if (!parent) return\n const parentRect = parent.getBoundingClientRect()\n const centerX = parentRect.left + parentRect.width / 2\n const half = w / 2\n const clampedCenter = Math.max(\n TOOLBAR_EDGE_MARGIN + half,\n Math.min(centerX, window.innerWidth - TOOLBAR_EDGE_MARGIN - half)\n )\n const offsetX = clampedCenter - centerX\n slot.style.transform = `translateX(calc(-50% + ${offsetX}px))`\n }\n\n clamp()\n const ro = new ResizeObserver(clamp)\n ro.observe(slot)\n if (slot.firstElementChild) ro.observe(slot.firstElementChild)\n window.addEventListener('resize', clamp)\n return () => {\n ro.disconnect()\n window.removeEventListener('resize', clamp)\n }\n }, [placement, children])\n\n return (\n <div\n ref={slotRef}\n className={cn(\n 'pointer-events-auto absolute left-1/2',\n placement === 'top' ? 'bottom-full' : 'top-full'\n )}\n style={{\n marginBottom: placement === 'top' ? TOOLBAR_STROKE_GAP : undefined,\n marginTop: placement === 'bottom' ? TOOLBAR_STROKE_GAP : undefined,\n transform: 'translateX(-50%)',\n }}\n data-ohw-item-toolbar-anchor={placement}\n >\n {children}\n </div>\n )\n}\n\nfunction ItemInteractionLayer({\n rect,\n state,\n elRef,\n toolbar,\n showHandle = false,\n dragDisabled = false,\n dragHandleLabel = 'Reorder item',\n onDragHandleDragStart,\n onDragHandleDragEnd,\n onItemPointerDown,\n onItemClick,\n itemDragSurface = true,\n chromeGap = SELECTION_CHROME_GAP,\n className,\n}: ItemInteractionLayerProps) {\n if (state === 'default') return null\n\n const isActive = state === 'active-top' || state === 'active-bottom'\n const isDragging = state === 'dragging'\n const showToolbar = isActive && toolbar\n // Hide handle while dragging via opacity only (see container style). Keep mounted —\n // unmounting or visibility/pointer-events:none on the HTML5 drag source cancels the gesture.\n const showDragHandle = (isActive || isDragging) && showHandle\n const itemDragEnabled =\n itemDragSurface && isActive && showHandle && !isDragging && !dragDisabled\n\n return (\n <div\n ref={elRef}\n data-ohw-item-interaction=\"\"\n data-ohw-item-interaction-state={state}\n className={cn('pointer-events-none', className)}\n style={{\n position: 'fixed',\n top: rect.top - chromeGap,\n left: rect.left - chromeGap,\n width: rect.width + chromeGap * 2,\n height: rect.height + chromeGap * 2,\n zIndex: getChromeZIndex(state),\n }}\n >\n <div\n aria-hidden\n className=\"absolute inset-0 rounded-lg\"\n style={getChromeStyle(state)}\n />\n\n {itemDragEnabled && (\n <div\n data-ohw-item-drag-surface=\"\"\n // Selected (action-toolbar): I-beam — next click enters text edit at caret.\n // Grab stays on the drag handle; press-drag still arms from this surface.\n className=\"pointer-events-auto absolute inset-0 cursor-text rounded-lg\"\n onPointerDown={(e) => {\n if (e.button !== 0) return\n onItemPointerDown?.(e)\n }}\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n // Parent suppresses this when a real press-drag just finished.\n onItemClick?.(e.clientX, e.clientY)\n }}\n />\n )}\n\n {showDragHandle && (\n <div\n data-ohw-drag-handle-container=\"\"\n className=\"pointer-events-auto absolute left-0 top-1/2 z-10 -translate-x-[calc(100%+7px)] -translate-y-1/2\"\n // Opacity only — visibility/pointer-events on the HTML5 drag source cancels the gesture.\n style={isDragging ? { opacity: 0 } : undefined}\n aria-hidden={isDragging || undefined}\n >\n <DragHandle\n draggable={!dragDisabled}\n aria-label={dragHandleLabel}\n disabled={dragDisabled}\n onDragStart={(e) => {\n if (dragDisabled) {\n e.preventDefault()\n return\n }\n // Native ghost is the handle — use a blank image so only in-place chrome shows.\n // Element must be in the document for setDragImage in some browsers.\n const blank = document.createElement('canvas')\n blank.width = 1\n blank.height = 1\n blank.style.cssText = 'position:fixed;left:-9999px;top:-9999px;width:1px;height:1px;pointer-events:none'\n document.body.appendChild(blank)\n try {\n e.dataTransfer.setDragImage(blank, 0, 0)\n } finally {\n requestAnimationFrame(() => blank.remove())\n }\n e.dataTransfer.setData('text/plain', dragHandleLabel)\n e.dataTransfer.effectAllowed = 'move'\n onDragHandleDragStart?.(e)\n }}\n onDragEnd={onDragHandleDragEnd}\n />\n </div>\n )}\n\n {showToolbar && state === 'active-top' && (\n <ClampedToolbarSlot placement=\"top\">{toolbar}</ClampedToolbarSlot>\n )}\n\n {showToolbar && state === 'active-bottom' && (\n <ClampedToolbarSlot placement=\"bottom\">{toolbar}</ClampedToolbarSlot>\n )}\n </div>\n )\n}\n\nexport { ItemInteractionLayer }\nexport type { ItemInteractionLayerProps }\n","'use client'\n\nimport * as React from 'react'\nimport { Film, ImageIcon, Pause, Play, Volume2, VolumeX } from 'lucide-react'\n\nimport { Button } from './button'\n\n/** Matches the editor's previous fade duration exactly. */\nexport const MEDIA_UPLOAD_FADE_MS = 300\n\n/** Inset from the video's top edge for the autoplay/mute bar. */\nconst VIDEO_SETTINGS_BAR_INSET = 8\n\n/**\n * Inline rather than via classes: the bridge's Button ships `text-sm` and the bridge root is\n * `font-sans` (Figtree), both of which would otherwise win inside the customer's document.\n */\nconst OVERLAY_BUTTON_STYLE: React.CSSProperties = {\n pointerEvents: 'auto',\n fontFamily: 'Inter, sans-serif',\n fontSize: 12,\n color: '#000',\n}\n\n/**\n * Byte-for-byte port of the editor's upload skeleton, which was a shadcn `<Skeleton>`\n * (`bg-gray-300`) with `rounded-none` + `.skeleton-shimmer`. That class deliberately kills the\n * default `animate-pulse` (`animation: none !important`) and replaces it with a sweeping\n * highlight on `::after`. Reproduced here with an `ohw-` prefix so the customer site's own CSS\n * cannot collide with it, and with literal values so it does not depend on the customer's\n * Tailwind theme being present.\n */\nconst SKELETON_CSS = `\n@keyframes ohw-media-shimmer {\n 0% { transform: translateX(-100%); }\n 100% { transform: translateX(100%); }\n}\n[data-ohw-media-skeleton] {\n overflow: hidden;\n background-color: #d1d5db; /* tailwind gray-300 */\n}\n[data-ohw-media-skeleton]::after {\n content: \"\";\n position: absolute;\n inset: 0;\n background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.6), transparent);\n animation: ohw-media-shimmer 1.4s infinite;\n}\n`\n\nexport type MediaElementType = 'image' | 'bg-image' | 'video'\n\nexport type VideoSettings = { autoplay?: boolean; muted?: boolean }\n\nexport type MediaHover = {\n key: string\n rect: { top: number; left: number; width: number; height: number }\n elementType: MediaElementType\n isDragOver: boolean\n /**\n * Editable text sits on top of this media (e.g. nav links over a hero bg-image). The overlay\n * still renders, but must not intercept the caret — see `pointerEvents` below.\n */\n hasTextOverlap: boolean\n /** Video only: the element's ACTUAL state, so the toggles never claim something untrue. */\n videoAutoplay?: boolean\n videoMuted?: boolean\n}\n\n/**\n * Editor chrome for replaceable media, rendered INSIDE the iframe.\n *\n * It previously lived in the parent (fo-class), positioned over the iframe from rects shipped\n * across postMessage. That meant it covered the iframe and swallowed the very `dragover` events\n * the bridge needed to track a drag — the drop target and the element were in different\n * documents. Living here, native drag-and-drop simply works, and the rect comes straight from\n * `getBoundingClientRect()` with no marshalling to desync.\n */\nexport function MediaOverlay({\n hover,\n isUploading,\n fadingOut = false,\n onFadeOutComplete,\n onReplace,\n onVideoSettingsChange,\n}: {\n hover: MediaHover\n isUploading: boolean\n fadingOut?: boolean\n onFadeOutComplete?: (key: string) => void\n onReplace: (key: string) => void\n onVideoSettingsChange?: (key: string, settings: VideoSettings) => void\n}) {\n const { rect } = hover\n const skeletonRef = React.useRef<HTMLDivElement>(null)\n const isVideo = hover.elementType === 'video'\n const autoplay = hover.videoAutoplay ?? true\n const muted = hover.videoMuted ?? true\n\n const box: React.CSSProperties = {\n position: 'fixed',\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n zIndex: 2147483646,\n }\n\n // Same fade the editor ran: once the replacement has decoded, dissolve the skeleton rather\n // than popping it out, then unmount.\n React.useEffect(() => {\n if (!isUploading || !fadingOut || !skeletonRef.current) return\n\n const anim = skeletonRef.current.animate([{ opacity: 1 }, { opacity: 0 }], {\n duration: MEDIA_UPLOAD_FADE_MS,\n easing: 'ease-out',\n fill: 'forwards',\n })\n\n anim.finished\n .then(() => onFadeOutComplete?.(hover.key))\n .catch(() => onFadeOutComplete?.(hover.key))\n\n return () => anim.cancel()\n }, [isUploading, fadingOut, onFadeOutComplete, hover.key])\n\n if (isUploading) {\n return (\n <div\n ref={skeletonRef}\n data-ohw-bridge=\"\"\n data-ohw-media-overlay=\"\"\n data-ohw-media-skeleton=\"\"\n aria-hidden\n style={{ ...box, pointerEvents: 'none' }}\n >\n <style>{SKELETON_CSS}</style>\n </div>\n )\n }\n\n // Autoplay / mute toggles, at the video's top-centre. Hidden while a file is dragged over so\n // it can't sit between the cursor and the drop.\n const settingsBar =\n isVideo && !hover.isDragOver ? (\n <div\n data-ohw-bridge=\"\"\n data-ohw-media-overlay=\"\"\n className=\"flex items-center justify-center gap-1.5\"\n style={{\n position: 'fixed',\n top: rect.top + VIDEO_SETTINGS_BAR_INSET,\n left: rect.left,\n width: rect.width,\n zIndex: 2147483647,\n pointerEvents: 'auto',\n }}\n onClick={(e) => e.stopPropagation()}\n >\n <Button\n data-ohw-media-overlay=\"\"\n variant=\"outline\"\n size=\"sm\"\n className=\"cursor-pointer hover:bg-background\"\n style={{ ...OVERLAY_BUTTON_STYLE, minWidth: 0, padding: '0 8px' }}\n aria-label={autoplay ? 'Disable autoplay' : 'Enable autoplay'}\n title={autoplay ? 'Autoplay on — click to disable' : 'Autoplay off — click to enable'}\n onMouseDown={(e) => e.preventDefault()}\n onClick={(e) => {\n e.stopPropagation()\n onVideoSettingsChange?.(hover.key, { autoplay: !autoplay })\n }}\n >\n {autoplay ? <Pause size={14} /> : <Play size={14} />}\n </Button>\n <Button\n data-ohw-media-overlay=\"\"\n variant=\"outline\"\n size=\"sm\"\n className=\"cursor-pointer hover:bg-background\"\n style={{ ...OVERLAY_BUTTON_STYLE, minWidth: 0, padding: '0 8px' }}\n aria-label={muted ? 'Unmute video' : 'Mute video'}\n title={muted ? 'Muted — click to unmute' : 'Sound on — click to mute'}\n onMouseDown={(e) => e.preventDefault()}\n onClick={(e) => {\n e.stopPropagation()\n onVideoSettingsChange?.(hover.key, { muted: !muted })\n }}\n >\n {muted ? <VolumeX size={14} /> : <Volume2 size={14} />}\n </Button>\n </div>\n ) : null\n\n // NOTE: deliberately no drag/drop handlers here.\n //\n // The bridge listens for dragover/dragleave/drop on `document` in the CAPTURE phase, and its\n // hit-test (`findImageAtPoint`) is a bbox test, not `elementFromPoint` — so it sees straight\n // through this overlay to the element underneath and handles the drop correctly on its own.\n // Adding React handlers here would make a drop fire twice (document capture, then React\n // bubble) and upload the file twice. Drag-and-drop has exactly one owner: the document.\n return (\n <>\n {settingsBar}\n <div\n data-ohw-bridge=\"\"\n data-ohw-media-overlay=\"\"\n className=\"flex items-center justify-center cursor-pointer\"\n style={{\n ...box,\n // When text overlays this media, let clicks fall THROUGH to the text underneath. In the\n // parent this needed a whole `ow:click-at` round-trip to re-hit-test inside the iframe;\n // in-document, pointer-events does it natively. The button below opts back in, so\n // Replace still works.\n pointerEvents: hover.hasTextOverlap ? 'none' : 'auto',\n boxShadow: 'inset 0 0 0 1.5px var(--color-primary)',\n background: 'color-mix(in srgb, var(--color-primary) 20%, transparent)',\n }}\n onClick={() => onReplace(hover.key)}\n >\n <Button\n data-ohw-media-overlay=\"\"\n variant=\"outline\"\n size=\"sm\"\n // `hover:bg-background` cancels the outline variant's `hover:bg-muted/80` — twMerge drops\n // the losing utility, so the button is visually inert on hover.\n className=\"gap-1.5 cursor-pointer hover:bg-background\"\n style={{\n ...OVERLAY_BUTTON_STYLE,\n // Don't let Replace steal clicks when text (e.g. nav) sits on top of this media.\n pointerEvents: hover.hasTextOverlap ? 'none' : 'auto',\n }}\n onMouseDown={(e) => e.preventDefault()}\n onClick={(e) => {\n e.stopPropagation()\n onReplace(hover.key)\n }}\n >\n {/* Sized via lucide's `size` prop rather than a Tailwind class, so it can't depend on a\n utility being present in the bridge's build. Scaled to sit with the 12px label. */}\n {isVideo ? <Film size={14} /> : <ImageIcon size={14} />}\n {isVideo ? 'Replace video' : 'Replace image'}\n </Button>\n </div>\n </>\n )\n}\n","'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\nimport { Slot } from 'radix-ui'\n\nimport { cn } from '../lib/utils'\n\nconst buttonVariants = cva(\n 'inline-flex items-center justify-center gap-1 whitespace-nowrap rounded-md text-sm font-medium transition-colors outline-none disabled:pointer-events-none disabled:opacity-50 min-w-[80px] px-3 py-2',\n {\n variants: {\n variant: {\n default: 'bg-primary text-primary-foreground hover:opacity-90',\n outline: 'border border-border bg-background text-foreground shadow-sm hover:bg-muted/80',\n ghost: 'min-w-0 px-3 py-2 text-foreground hover:bg-muted/50',\n },\n size: {\n default: 'h-9',\n sm: 'h-8 min-w-[64px] px-2 py-1.5 text-sm',\n },\n },\n defaultVariants: {\n variant: 'default',\n size: 'default',\n },\n }\n)\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement>,\n VariantProps<typeof buttonVariants> {\n asChild?: boolean\n}\n\nconst Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n ({ className, variant, size, asChild = false, ...props }, ref) => {\n const Comp = asChild ? Slot.Root : 'button'\n return (\n <Comp\n ref={ref}\n data-slot=\"button\"\n className={cn(buttonVariants({ variant, size, className }))}\n {...props}\n />\n )\n }\n)\nButton.displayName = 'Button'\n\nexport { Button, buttonVariants }\n","'use client'\n\nimport * as React from 'react'\nimport { GalleryHorizontal } from 'lucide-react'\n\nimport { Button } from './button'\n\nexport type CarouselHover = {\n key: string\n rect: { top: number; left: number; width: number; height: number }\n}\n\n/**\n * Inline (not class-based) for the same reason as MediaOverlay: the bridge's Button ships\n * `text-sm` + `font-sans`, which would otherwise win inside the customer's document.\n */\nconst OVERLAY_BUTTON_STYLE: React.CSSProperties = {\n pointerEvents: 'auto',\n fontFamily: 'Inter, sans-serif',\n fontSize: 12,\n color: '#000',\n}\n\n/**\n * Hover chrome for an editable carousel, rendered INSIDE the iframe over the whole carousel.\n * Uses the same blue ring + tint as MediaOverlay so it reads as \"editable media\", with a centred\n * \"Edit gallery\" button. Clicking anywhere asks the parent to open the gallery modal\n * (replace/add/delete + alt); the parent owns that modal because it holds the upload credentials.\n */\nexport function CarouselOverlay({\n hover,\n onEdit,\n}: {\n hover: CarouselHover\n onEdit: (key: string) => void\n}) {\n const { rect } = hover\n\n return (\n <div\n data-ohw-bridge=\"\"\n data-ohw-carousel-overlay=\"\"\n className=\"flex cursor-pointer items-center justify-center\"\n style={{\n position: 'fixed',\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n zIndex: 2147483646,\n pointerEvents: 'auto',\n boxShadow: 'inset 0 0 0 1.5px var(--color-primary)',\n background: 'color-mix(in srgb, var(--color-primary) 20%, transparent)',\n }}\n onClick={() => onEdit(hover.key)}\n >\n <Button\n data-ohw-carousel-overlay=\"\"\n variant=\"outline\"\n size=\"sm\"\n className=\"cursor-pointer gap-1.5 hover:bg-background\"\n style={OVERLAY_BUTTON_STYLE}\n onMouseDown={(e) => e.preventDefault()}\n onClick={(e) => {\n e.stopPropagation()\n onEdit(hover.key)\n }}\n >\n <GalleryHorizontal size={14} />\n Edit gallery\n </Button>\n </div>\n )\n}\n","const STORAGE_KEY = 'ohw-preserved-search'\n\n/** Persist edit iframe query string across client navigations that drop params. */\nexport function readPreservedSearch(): string {\n if (typeof window === 'undefined') return ''\n const fromUrl = window.location.search\n if (fromUrl && fromUrl !== '?') {\n sessionStorage.setItem(STORAGE_KEY, fromUrl)\n return fromUrl\n }\n return sessionStorage.getItem(STORAGE_KEY) ?? ''\n}\n\nexport function clearPreservedSearch(): void {\n if (typeof window === 'undefined') return\n sessionStorage.removeItem(STORAGE_KEY)\n}\n\nexport function isEditSessionActive(): boolean {\n const search = readPreservedSearch()\n if (!search || search === '?') return false\n const q = search.startsWith('?') ? search.slice(1) : search\n return new URLSearchParams(q).get('mode') === 'edit'\n}\n","export type SectionNode = { id: string; label: string }\n\nexport function titleCaseSectionId(id: string): string {\n return id\n .split('-')\n .filter(Boolean)\n .map((w) => w.charAt(0).toUpperCase() + w.slice(1))\n .join(' ')\n}\n\n/** Collect unique top-level sections from a document fragment (live DOM or parsed HTML).\n * Nested `[data-ohw-section]` markers (if any) are ignored — only page sections are link targets. */\nexport function parseSectionsFromRoot(root: ParentNode): SectionNode[] {\n const seen = new Set<string>()\n const sections: SectionNode[] = []\n\n for (const el of root.querySelectorAll<HTMLElement>('[data-ohw-section]')) {\n const id = el.getAttribute('data-ohw-section') ?? ''\n if (!id || seen.has(id)) continue\n // Skip sections nested inside another section — pickers must target page sections only.\n if (el.parentElement?.closest('[data-ohw-section]')) continue\n seen.add(id)\n const label = el.getAttribute('data-ohw-section-label') ?? titleCaseSectionId(id)\n sections.push({ id, label })\n }\n\n return sections\n}\n\nexport function collectSectionsFromDom(): SectionNode[] {\n if (typeof document === 'undefined') return []\n return parseSectionsFromRoot(document)\n}\n\nexport function parseSectionsFromHtml(html: string): SectionNode[] {\n const doc = new DOMParser().parseFromString(html, 'text/html')\n return parseSectionsFromRoot(doc)\n}\n","import type { LinkPage, LinkSection, SelectedPage, SelectedSection } from './types'\n\nexport function parseTarget(target: string | null | undefined): { pageRoute: string; sectionId: string | null } {\n if (!target) return { pageRoute: '', sectionId: null }\n const hashIndex = target.indexOf('#')\n if (hashIndex === -1) return { pageRoute: target, sectionId: null }\n return {\n pageRoute: target.slice(0, hashIndex),\n sectionId: target.slice(hashIndex + 1) || null,\n }\n}\n\nexport function normalizePath(path: string): string {\n const trimmed = path.trim()\n if (!trimmed) return '/'\n\n try {\n if (/^https?:\\/\\//i.test(trimmed)) {\n return new URL(trimmed).pathname || '/'\n }\n } catch {\n /* external or malformed — keep as-is below */\n }\n\n const withSlash = trimmed.startsWith('/') ? trimmed : `/${trimmed}`\n if (withSlash.length > 1 && withSlash.endsWith('/')) return withSlash.slice(0, -1)\n return withSlash\n}\n\nexport function findPageByPath(pages: LinkPage[], path: string): LinkPage | undefined {\n const normalized = normalizePath(path)\n return pages.find((p) => normalizePath(p.path) === normalized)\n}\n\nexport function inferPageTitleFromPath(path: string): string {\n const normalized = normalizePath(path)\n if (normalized === '/') return 'Home'\n const segment = normalized.split('/').filter(Boolean).pop() ?? ''\n if (!segment) return 'Home'\n return segment\n .split('-')\n .filter(Boolean)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(' ')\n}\n\nexport function isInternalPath(route: string): boolean {\n const trimmed = route.trim()\n if (!trimmed) return false\n if (/^https?:\\/\\//i.test(trimmed)) return false\n if (trimmed.startsWith('/')) return true\n if (trimmed.includes(' ') || trimmed.includes('.')) return false\n return true\n}\n\nexport function resolvePage(route: string, pages: LinkPage[]): SelectedPage {\n const found = findPageByPath(pages, route)\n if (found) return { path: found.path, title: found.title }\n return { path: normalizePath(route), title: inferPageTitleFromPath(route) }\n}\n\nexport function getSectionsForPath(\n sectionsByPath: Record<string, LinkSection[]> | undefined,\n pageRoute: string\n): LinkSection[] {\n if (!sectionsByPath) return []\n const normalized = normalizePath(pageRoute)\n return sectionsByPath[normalized] ?? sectionsByPath[pageRoute] ?? []\n}\n\nexport function buildTarget(page: SelectedPage, section: SelectedSection | null): string {\n if (section) return `${page.path}#${section.id}`\n return page.path\n}\n\nexport function isValidUrl(urlString: string): boolean {\n try {\n const url = new URL(urlString)\n if (url.protocol !== 'http:' && url.protocol !== 'https:') return false\n const hostname = url.hostname\n if (!hostname || hostname.length === 0) return false\n if (hostname.includes(' ')) return false\n if (hostname === 'localhost') return true\n if (!hostname.includes('.')) return false\n // Reject numeric-only hosts (e.g. \"5\" → https://5 → 0.0.0.5)\n if (!/[a-z]/i.test(hostname)) return false\n return true\n } catch {\n return false\n }\n}\n\nexport function normalizeUrl(value: string): string {\n const trimmed = value.trim()\n if (trimmed.startsWith('http://') || trimmed.startsWith('https://')) return trimmed\n return `https://${trimmed}`\n}\n\nexport function validateUrlInput(value: string, pages: LinkPage[], allPages: LinkPage[]): string {\n const trimmed = value.trim()\n if (!trimmed) return ''\n\n const exactPage = allPages.find((p) => p.title.toLowerCase() === trimmed.toLowerCase())\n if (exactPage) return ''\n\n const hasPrefixMatch = pages.some((p) => p.title.toLowerCase().startsWith(trimmed.toLowerCase()))\n if (hasPrefixMatch) {\n return 'Select a page from the list or enter a valid URL'\n }\n\n const hasScheme = /^https?:\\/\\//i.test(trimmed)\n if (!hasScheme && !trimmed.includes('.')) {\n return 'Please enter a valid URL (e.g., https://example.com)'\n }\n\n if (!isValidUrl(normalizeUrl(trimmed))) {\n return 'Please enter a valid URL (e.g., https://example.com)'\n }\n return ''\n}\n\nexport function getEditModeInitialState(\n target: string | undefined,\n pages: LinkPage[],\n sections: LinkSection[]\n): {\n searchValue: string\n selectedPage: SelectedPage | null\n selectedSection: SelectedSection | null\n step: 'input' | 'sectionPicker' | 'confirmed'\n} {\n const empty = {\n searchValue: '',\n selectedPage: null as SelectedPage | null,\n selectedSection: null as SelectedSection | null,\n step: 'input' as const,\n }\n\n if (!target) return empty\n\n if (isValidUrl(normalizeUrl(target))) {\n return { searchValue: target, selectedPage: null, selectedSection: null, step: 'input' }\n }\n\n const { pageRoute, sectionId } = parseTarget(target)\n\n if (sectionId) {\n if (isInternalPath(pageRoute)) {\n const page = resolvePage(pageRoute, pages)\n const sec = sections.find((s) => s.id === sectionId)\n return {\n searchValue: page.title,\n selectedPage: page,\n selectedSection: sec ? { id: sec.id, label: sec.label } : null,\n step: 'input',\n }\n }\n return { searchValue: pageRoute || target, selectedPage: null, selectedSection: null, step: 'input' }\n }\n\n if (isInternalPath(pageRoute)) {\n const page = resolvePage(pageRoute, pages)\n return {\n searchValue: page.title,\n selectedPage: page,\n selectedSection: null,\n step: 'input',\n }\n }\n\n return { searchValue: target, selectedPage: null, selectedSection: null, step: 'input' }\n}\n\nexport function filterAvailablePages(pages: LinkPage[], existingTargets: string[]): LinkPage[] {\n const taken = new Set(existingTargets)\n return pages.filter((p) => !taken.has(p.path))\n}\n","import { readPreservedSearch } from './session-search'\nimport { parseSectionsFromHtml, type SectionNode } from './sections'\nimport { normalizePath } from '../ui/link-modal/linkModal.utils'\n\nfunction buildPageFetchUrl(path: string): string {\n const normalized = normalizePath(path)\n const search = readPreservedSearch()\n return `${window.location.origin}${normalized}${search}`\n}\n\n/** Optional template manifest at `/ohw-sections.json` (see rebound-template/public). */\nexport async function loadAllSectionsManifest(): Promise<Record<string, SectionNode[]>> {\n const manifest = await loadSectionsManifest()\n return manifest ?? {}\n}\n\nasync function loadSectionsManifest(): Promise<Record<string, SectionNode[]> | null> {\n try {\n const res = await fetch(`${window.location.origin}/ohw-sections.json`, {\n credentials: 'same-origin',\n cache: 'no-store',\n })\n if (!res.ok) return null\n const data = (await res.json()) as Record<string, SectionNode[]>\n return data && typeof data === 'object' ? data : null\n } catch {\n return null\n }\n}\n\nasync function prefetchSectionsFromHtml(paths: string[]): Promise<Record<string, SectionNode[]>> {\n const pairs = await Promise.all(\n paths.map(async (path) => {\n try {\n const res = await fetch(buildPageFetchUrl(path), {\n credentials: 'same-origin',\n cache: 'no-store',\n headers: { Accept: 'text/html' },\n })\n if (!res.ok) return [path, []] as [string, SectionNode[]]\n const html = await res.text()\n return [path, parseSectionsFromHtml(html)] as [string, SectionNode[]]\n } catch {\n return [path, []] as [string, SectionNode[]]\n }\n })\n )\n\n const out: Record<string, SectionNode[]> = {}\n for (const [path, sections] of pairs) {\n if (sections.length > 0) out[path] = sections\n }\n return out\n}\n\n/**\n * Load section markers for all site pages.\n * 1. `/ohw-sections.json` manifest (one request, instant)\n * 2. SSR HTML fetch for any paths still missing\n */\nexport async function prefetchSectionsForPaths(\n paths: string[]\n): Promise<Record<string, SectionNode[]>> {\n const unique = [...new Set(paths.map((p) => normalizePath(p)))]\n const out: Record<string, SectionNode[]> = {}\n\n const manifest = await loadSectionsManifest()\n if (manifest) {\n const keys = unique.length > 0 ? unique : Object.keys(manifest)\n for (const path of keys) {\n const sections = manifest[path]\n if (sections?.length) out[path] = sections\n }\n }\n\n const missing = unique.filter((path) => !out[path]?.length)\n if (missing.length > 0) {\n Object.assign(out, await prefetchSectionsFromHtml(missing))\n }\n\n return out\n}\n\nexport function mergePrefetchedSections(\n prev: Record<string, SectionNode[]>,\n fetched: Record<string, SectionNode[]>,\n livePath: string,\n liveSections: SectionNode[]\n): Record<string, SectionNode[]> {\n const next = { ...prev, ...fetched }\n if (liveSections.length > 0) next[normalizePath(livePath)] = liveSections\n return next\n}\n","const MAX_ATTEMPTS = 12\nconst RETRY_MS = 100\n\n/** Hash fragment from the current URL (without leading `#`). */\nexport function getHashSectionId(): string | null {\n if (typeof window === 'undefined') return null\n const id = window.location.hash.replace(/^#/, '').trim()\n return id || null\n}\n\n/**\n * Scroll to the section whose `data-ohw-section` matches `sectionId`.\n * Retries briefly so client navigations have time to mount section DOM.\n */\nexport function scrollToOhwSection(sectionId: string, behavior: ScrollBehavior = 'smooth'): boolean {\n if (!sectionId || typeof document === 'undefined') return false\n\n const el = document.querySelector<HTMLElement>(`[data-ohw-section=\"${CSS.escape(sectionId)}\"]`)\n if (!el) return false\n\n el.scrollIntoView({ behavior, block: 'start' })\n return true\n}\n\n/** Scroll to the hash target when present; returns true once an element was found. */\nexport function scrollToHashSection(behavior: ScrollBehavior = 'smooth'): boolean {\n const id = getHashSectionId()\n if (!id) return false\n return scrollToOhwSection(id, behavior)\n}\n\n/** Poll until the section node exists (Next.js route transitions) or attempts are exhausted. */\nexport function scrollToHashSectionWhenReady(behavior: ScrollBehavior = 'smooth'): void {\n const id = getHashSectionId()\n if (!id) return\n\n let attempt = 0\n const tick = () => {\n if (scrollToOhwSection(id, behavior)) return\n attempt += 1\n if (attempt < MAX_ATTEMPTS) window.setTimeout(tick, RETRY_MS)\n }\n\n tick()\n}\n","\"use client\";\n\nimport { useEffect, type Ref } from \"react\";\n\nimport { Dialog, DialogContent } from \"../dialog\";\nimport { LinkEditorPanel } from \"./LinkEditorPanel\";\nimport { SectionPickerOverlay } from \"./SectionPickerOverlay\";\nimport type { LinkModalProps } from \"./types\";\nimport { useLinkModalState } from \"./useLinkModalState\";\n\nexport type LinkPopoverProps = LinkModalProps & {\n panelRef?: Ref<HTMLDivElement>;\n /** Visible iframe viewport shell — keeps the dialog centered in the preview pane, not the full page. */\n portalContainer?: HTMLElement | null;\n};\n\nfunction postToParent(data: Record<string, unknown>) {\n window.parent?.postMessage(data, \"*\");\n}\n\n/** Centered link editor dialog (shadcn Dialog + Radix). */\nexport function LinkPopover({\n open = true,\n panelRef,\n portalContainer,\n onClose,\n mode = \"create\",\n pages,\n sections = [],\n sectionsByPath,\n initialTarget,\n existingTargets = [],\n onSubmit,\n}: LinkPopoverProps) {\n const state = useLinkModalState({\n open,\n mode,\n pages,\n sections,\n sectionsByPath,\n initialTarget,\n existingTargets,\n onClose,\n onSubmit,\n });\n\n const sectionPickerActive =\n state.showSectionPicker && Boolean(state.selectedPage);\n\n // Lock preview scroll while the dialog is open; unlock for section picker (full-page scroll).\n useEffect(() => {\n if (!open) return;\n\n if (sectionPickerActive) {\n postToParent({ type: \"ui:unlock\" });\n postToParent({ type: \"ow:section-picker\", active: true });\n document.documentElement.style.overflow = \"\";\n document.body.style.overflow = \"\";\n return () => {\n postToParent({ type: \"ow:section-picker\", active: false });\n };\n }\n\n postToParent({ type: \"ow:section-picker\", active: false });\n postToParent({ type: \"ui:lock\" });\n\n const html = document.documentElement;\n const body = document.body;\n const prevHtmlOverflow = html.style.overflow;\n const prevBodyOverflow = body.style.overflow;\n const prevHtmlOverscroll = html.style.overscrollBehavior;\n const prevBodyOverscroll = body.style.overscrollBehavior;\n html.style.overflow = \"hidden\";\n body.style.overflow = \"hidden\";\n html.style.overscrollBehavior = \"none\";\n body.style.overscrollBehavior = \"none\";\n\n // Overlay covers the whole viewport — never treat it as \"safe to scroll\".\n // Only the page dropdown (and similar) may consume wheel/touch; everything else\n // must preventDefault or the parent canvas scroller will move under the iframe.\n const canScrollElement = (el: HTMLElement, deltaY: number) => {\n const { overflowY } = getComputedStyle(el);\n if (overflowY !== \"auto\" && overflowY !== \"scroll\") return false;\n if (el.scrollHeight <= el.clientHeight + 1) return false;\n if (deltaY < 0) return el.scrollTop > 0;\n if (deltaY > 0)\n return el.scrollTop + el.clientHeight < el.scrollHeight - 1;\n return true;\n };\n\n const allowsInternalScroll = (e: Event) => {\n const target = e.target;\n if (!(target instanceof Element)) return false;\n const scrollRoot = target.closest<HTMLElement>(\n \"[data-ohw-link-page-dropdown], [data-ohw-allow-scroll]\",\n );\n if (!scrollRoot) return false;\n const deltaY = e instanceof WheelEvent ? e.deltaY : 0;\n return canScrollElement(scrollRoot, deltaY);\n };\n\n const preventBackgroundScroll = (e: Event) => {\n if (allowsInternalScroll(e)) return;\n e.preventDefault();\n };\n\n const scrollOpts = { passive: false, capture: true } as const;\n document.addEventListener(\"wheel\", preventBackgroundScroll, scrollOpts);\n document.addEventListener(\"touchmove\", preventBackgroundScroll, scrollOpts);\n\n return () => {\n postToParent({ type: \"ui:unlock\" });\n html.style.overflow = prevHtmlOverflow;\n body.style.overflow = prevBodyOverflow;\n html.style.overscrollBehavior = prevHtmlOverscroll;\n body.style.overscrollBehavior = prevBodyOverscroll;\n document.removeEventListener(\n \"wheel\",\n preventBackgroundScroll,\n scrollOpts,\n );\n document.removeEventListener(\n \"touchmove\",\n preventBackgroundScroll,\n scrollOpts,\n );\n };\n }, [open, sectionPickerActive]);\n\n return (\n <>\n <Dialog\n open={open && !sectionPickerActive}\n onOpenChange={(next) => {\n if (!next) onClose?.();\n }}\n >\n <DialogContent\n ref={panelRef}\n container={portalContainer}\n data-ohw-link-popover-root=\"\"\n data-ohw-link-modal-root=\"\"\n data-ohw-bridge=\"\"\n showCloseButton={false}\n className=\"gap-0 p-0 w-full max-w-[448px] pointer-events-auto z-[2147483646] overflow-visible\"\n >\n <LinkEditorPanel state={state} onClose={onClose} />\n </DialogContent>\n </Dialog>\n\n {sectionPickerActive && state.selectedPage ? (\n <SectionPickerOverlay\n pagePath={state.selectedPage.path}\n sections={state.activeSections}\n onBack={state.handleSectionPickerBack}\n onSelect={state.handleSectionSelect}\n />\n ) : null}\n </>\n );\n}\n","\"use client\";\n\nimport * as React from \"react\";\nimport { Dialog as DialogPrimitive } from \"radix-ui\";\n\nimport { cn } from \"../lib/utils\";\nimport { X } from \"lucide-react\";\n\nfunction Dialog({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Root>) {\n return <DialogPrimitive.Root data-slot=\"dialog\" {...props} />;\n}\n\nfunction DialogPortal({\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Portal>) {\n return <DialogPrimitive.Portal {...props} />;\n}\n\nfunction DialogOverlay({\n className,\n ...props\n}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {\n return (\n <DialogPrimitive.Overlay\n data-slot=\"dialog-overlay\"\n data-ohw-link-modal-root=\"\"\n className={cn(\"fixed inset-0 z-[2147483646] bg-black/50\", className)}\n {...props}\n />\n );\n}\n\nconst DialogContent = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Content>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Content> & {\n showCloseButton?: boolean;\n /** Portal target; when set, overlay/content use absolute positioning inside this box (iframe visible viewport). */\n container?: HTMLElement | null;\n }\n>(\n (\n { className, children, showCloseButton = true, container, ...props },\n ref,\n ) => {\n const positionMode = container ? \"absolute\" : \"fixed\";\n\n return (\n <DialogPortal container={container ?? undefined}>\n <DialogOverlay className={cn(positionMode, \"inset-0\")} />\n <DialogPrimitive.Content\n ref={ref}\n data-slot=\"dialog-content\"\n className={cn(\n positionMode,\n \"left-1/2 top-1/2 z-[2147483647] flex w-full max-w-[448px] -translate-x-1/2 -translate-y-1/2 flex-col overflow-visible\",\n \"rounded-xl border border-border bg-background font-sans shadow-lg outline-none\",\n container ? \"max-h-[calc(100%-32px)]\" : \"max-h-[calc(100vh-32px)]\",\n className,\n )}\n onMouseDown={(e) => e.stopPropagation()}\n {...props}\n >\n {children}\n {showCloseButton ? (\n <DialogPrimitive.Close\n type=\"button\"\n className=\"absolute right-[9px] top-[9px] rounded-sm p-1.5 text-foreground hover:bg-muted/50\"\n aria-label=\"Close\"\n >\n <X size={16} aria-hidden />\n </DialogPrimitive.Close>\n ) : null}\n </DialogPrimitive.Content>\n </DialogPortal>\n );\n },\n);\nDialogContent.displayName = DialogPrimitive.Content.displayName;\n\nfunction DialogHeader({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return <div className={cn(\"flex flex-col gap-1.5\", className)} {...props} />;\n}\n\nfunction DialogFooter({\n className,\n ...props\n}: React.HTMLAttributes<HTMLDivElement>) {\n return (\n <div\n className={cn(\"flex items-center justify-end gap-2\", className)}\n {...props}\n />\n );\n}\n\nconst DialogTitle = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Title>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Title>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Title\n ref={ref}\n className={cn(\n \"text-lg font-semibold leading-none tracking-tight text-card-foreground\",\n className,\n )}\n {...props}\n />\n));\nDialogTitle.displayName = DialogPrimitive.Title.displayName;\n\nconst DialogDescription = React.forwardRef<\n React.ElementRef<typeof DialogPrimitive.Description>,\n React.ComponentPropsWithoutRef<typeof DialogPrimitive.Description>\n>(({ className, ...props }, ref) => (\n <DialogPrimitive.Description\n ref={ref}\n className={cn(\"text-sm text-muted-foreground\", className)}\n {...props}\n />\n));\nDialogDescription.displayName = DialogPrimitive.Description.displayName;\n\nconst DialogClose = DialogPrimitive.Close;\n\nexport {\n Dialog,\n DialogPortal,\n DialogOverlay,\n DialogContent,\n DialogHeader,\n DialogFooter,\n DialogTitle,\n DialogDescription,\n DialogClose,\n};\n","\"use client\";\n\nimport { Info, X } from \"lucide-react\";\nimport { Button } from \"../button\";\nimport {\n DialogClose,\n DialogFooter,\n DialogHeader,\n DialogTitle,\n} from \"../dialog\";\nimport { DestinationBreadcrumb } from \"./DestinationBreadcrumb\";\nimport { SectionTreeItem } from \"./SectionTreeItem\";\nimport { UrlOrPageInput } from \"./UrlOrPageInput\";\nimport type { useLinkModalState } from \"./useLinkModalState\";\n\ntype LinkModalState = ReturnType<typeof useLinkModalState>;\n\ntype LinkEditorPanelProps = {\n state: LinkModalState;\n onClose: () => void;\n};\n\n/** Link destination editor body — Figma node 8365:7616 / 8382:4161 */\n\nexport function LinkEditorPanel({ state, onClose }: LinkEditorPanelProps) {\n const isCancel =\n state.secondaryLabel === \"Cancel\" ||\n state.secondaryLabel === \"Back to sections\";\n\n return (\n <>\n <DialogClose asChild>\n <button\n type=\"button\"\n className=\"absolute right-[9px] top-[9px] rounded-sm p-1.5 text-foreground hover:bg-muted/50 h-7\"\n aria-label=\"Close\"\n onClick={onClose}\n >\n <X size={16} aria-hidden />\n </button>\n </DialogClose>\n\n <DialogHeader className=\"w-full gap-1.5 p-6 pr-12\">\n <DialogTitle className=\"m-0 w-full break-words\">\n {state.title}\n </DialogTitle>\n </DialogHeader>\n\n <div className=\"flex w-full flex-col gap-3 px-6 pb-8 pt-1\">\n {state.showBreadcrumb && state.selectedPage && state.selectedSection ? (\n <DestinationBreadcrumb\n pageTitle={state.selectedPage.title}\n sectionLabel={state.selectedSection.label}\n />\n ) : (\n <UrlOrPageInput\n value={state.searchValue}\n selectedPage={state.selectedPage}\n dropdownOpen={state.dropdownOpen}\n onDropdownOpenChange={state.setDropdownOpen}\n filteredPages={state.filteredPages}\n onInputChange={state.handleInputChange}\n onPageSelect={state.handlePageSelect}\n urlError={state.urlError}\n />\n )}\n\n {state.showChooseSection ? (\n <div className=\"flex flex-col justify-center gap-2\">\n <Button\n type=\"button\"\n variant=\"outline\"\n className=\"w-fit cursor-pointer\"\n size=\"sm\"\n onClick={state.handleChooseSection}\n >\n Choose a section\n </Button>\n\n <div className=\"flex items-center gap-1 text-sm text-muted-foreground\">\n <Info size={16} className=\"shrink-0\" aria-hidden />\n\n <span>Pick a section this link should scroll to.</span>\n </div>\n </div>\n ) : null}\n\n {state.showSectionRow && state.selectedSection ? (\n <SectionTreeItem section={state.selectedSection} selected />\n ) : null}\n </div>\n\n <DialogFooter className=\"w-full px-6 pb-6\">\n <Button\n type=\"button\"\n variant={isCancel ? \"outline\" : \"ghost\"}\n className=\"leading-6 shadow-none cursor-pointer\"\n style={\n isCancel\n ? {\n backgroundColor: \"var(--ohw-background)\",\n borderColor: \"var(--ohw-border)\",\n color: \"var(--ohw-foreground)\",\n }\n : undefined\n }\n onClick={state.handleSecondary}\n >\n {state.secondaryLabel}\n </Button>\n\n <Button\n type=\"button\"\n className=\"border-0 leading-6 shadow-none hover:opacity-90 disabled:opacity-50 cursor-pointer\"\n style={{\n backgroundColor: \"var(--ohw-primary)\",\n color: \"var(--ohw-primary-foreground)\",\n }}\n disabled={!state.isValid}\n onClick={state.handleSubmit}\n >\n {state.submitLabel}\n </Button>\n </DialogFooter>\n </>\n );\n}\n","\"use client\";\n\nimport { ArrowRight, File, GalleryVertical } from \"lucide-react\";\n\ntype DestinationBreadcrumbProps = {\n pageTitle: string;\n sectionLabel: string;\n};\n\nexport function DestinationBreadcrumb({\n pageTitle,\n sectionLabel,\n}: DestinationBreadcrumbProps) {\n return (\n <div className=\"flex w-full flex-col gap-2\">\n <p className=\"text-sm font-medium! text-foreground m-0\">Destination</p>\n <div className=\"flex items-center gap-3\">\n <div className=\"flex items-center gap-2\">\n <File size={16} className=\"shrink-0 text-foreground\" aria-hidden />\n <span className=\"text-sm font-medium leading-none text-foreground!\">\n {pageTitle}\n </span>\n </div>\n <ArrowRight\n size={16}\n className=\"shrink-0 text-muted-foreground\"\n aria-hidden\n />\n <div className=\"flex min-w-0 flex-1 items-center gap-2\">\n <GalleryVertical\n size={16}\n className=\"shrink-0 text-foreground\"\n aria-hidden\n />\n <span className=\"truncate text-sm font-medium leading-none text-foreground\">\n {sectionLabel}\n </span>\n </div>\n </div>\n </div>\n );\n}\n","\"use client\";\n\nimport { GalleryVertical } from \"lucide-react\";\nimport { cn } from \"../../lib/utils\";\nimport type { LinkSection } from \"./types\";\n\ntype SectionTreeItemProps = {\n section: LinkSection;\n onSelect?: (section: LinkSection) => void;\n selected?: boolean;\n};\n\nexport function SectionTreeItem({\n section,\n onSelect,\n selected,\n}: SectionTreeItemProps) {\n const interactive = Boolean(onSelect);\n\n return (\n <div className=\"flex h-9 w-full items-end pl-3\">\n <div\n className=\"mr-[-1px] h-9 w-2 shrink-0 rounded-bl-sm border-b border-l border-border mb-4\"\n aria-hidden\n />\n <div\n role={interactive ? \"button\" : undefined}\n tabIndex={interactive ? 0 : undefined}\n onClick={interactive ? () => onSelect?.(section) : undefined}\n onKeyDown={\n interactive\n ? (e) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onSelect?.(section);\n }\n }\n : undefined\n }\n className={cn(\n \"flex h-9 min-w-0 flex-1 items-center gap-2 rounded-md border border-border bg-background p-3\",\n interactive && \"cursor-pointer hover:bg-muted/30\",\n interactive && selected && \"border-primary\",\n )}\n >\n <GalleryVertical\n size={16}\n className=\"shrink-0 text-foreground\"\n aria-hidden\n />\n <span className=\"truncate text-sm font-normal leading-5 text-foreground\">\n {section.label}\n </span>\n </div>\n </div>\n );\n}\n\ntype SectionPickerListProps = {\n sections: LinkSection[];\n onSelect: (section: LinkSection) => void;\n};\n\nexport function SectionPickerList({\n sections,\n onSelect,\n}: SectionPickerListProps) {\n if (sections.length === 0) {\n return (\n <p className=\"text-sm text-muted-foreground\">\n No sections found on this page.\n </p>\n );\n }\n\n return (\n <div className=\"flex flex-col gap-1\">\n <p className=\"text-sm text-muted-foreground\">\n Pick a section this link should scroll to.\n </p>\n {sections.map((section) => (\n <SectionTreeItem\n key={section.id}\n section={section}\n onSelect={onSelect}\n />\n ))}\n </div>\n );\n}\n","\"use client\";\n\nimport { useEffect, useId, useRef, useState } from \"react\";\n\nimport { cn } from \"../../lib/utils\";\nimport { Input } from \"../input\";\nimport { Label } from \"../label\";\nimport type { LinkPage } from \"./types\";\nimport { ChevronDown, File, X } from \"lucide-react\";\n\ntype UrlOrPageInputProps = {\n value: string;\n selectedPage: { path: string; title: string } | null;\n placeholder?: string;\n dropdownOpen: boolean;\n onDropdownOpenChange: (open: boolean) => void;\n filteredPages: LinkPage[];\n onInputChange: (value: string) => void;\n onPageSelect: (page: LinkPage) => void;\n readOnly?: boolean;\n urlError?: string;\n};\n\nfunction FieldChevron({\n onClick,\n}: {\n onClick?: (e: React.MouseEvent) => void;\n}) {\n return (\n <button\n type=\"button\"\n className=\"flex shrink-0 items-center justify-end border-0 bg-transparent p-0 pl-4 text-muted-foreground outline-none\"\n onClick={onClick}\n aria-label=\"Open page list\"\n tabIndex={-1}\n >\n <ChevronDown size={16} />\n </button>\n );\n}\n\nexport function UrlOrPageInput({\n value,\n selectedPage,\n placeholder = \"Paste a URL or choose a page\",\n dropdownOpen,\n onDropdownOpenChange,\n filteredPages,\n onInputChange,\n onPageSelect,\n readOnly = false,\n urlError,\n}: UrlOrPageInputProps) {\n const inputId = useId();\n const inputRef = useRef<HTMLInputElement>(null);\n const rootRef = useRef<HTMLDivElement>(null);\n const [isFocused, setIsFocused] = useState(false);\n\n useEffect(() => {\n if (!dropdownOpen) return;\n\n const isOutside = (e: Event) => {\n const root = rootRef.current;\n if (!root) return true;\n const path = typeof e.composedPath === \"function\" ? e.composedPath() : [];\n if (path.includes(root)) return false;\n const target = e.target;\n return !(target instanceof Node && root.contains(target));\n };\n\n const closeIfOutside = (e: Event) => {\n if (!isOutside(e)) return;\n onDropdownOpenChange(false);\n };\n\n // Capture phase so we still see the event when dialog content stops bubbling.\n document.addEventListener(\"pointerdown\", closeIfOutside, true);\n document.addEventListener(\"mousedown\", closeIfOutside, true);\n return () => {\n document.removeEventListener(\"pointerdown\", closeIfOutside, true);\n document.removeEventListener(\"mousedown\", closeIfOutside, true);\n };\n }, [dropdownOpen, onDropdownOpenChange]);\n\n const openDropdown = () => {\n if (readOnly || filteredPages.length === 0) return;\n onDropdownOpenChange(true);\n };\n\n const toggleDropdown = (e: React.MouseEvent) => {\n e.stopPropagation();\n e.preventDefault();\n if (readOnly || filteredPages.length === 0) return;\n onDropdownOpenChange(!dropdownOpen);\n };\n\n const clearSelection = (e: React.MouseEvent) => {\n e.preventDefault();\n e.stopPropagation();\n onInputChange(\"\");\n requestAnimationFrame(() => inputRef.current?.focus());\n };\n\n const fieldClassName = cn(\n \"data-ohw-link-field flex h-[36px] w-full items-center overflow-hidden rounded-md border bg-background pl-3 pr-3 py-2 outline-none transition-[border-color,box-shadow]\",\n urlError\n ? \"border-destructive shadow-[0_0_0_1px_var(--ohw-destructive)]\"\n : isFocused\n ? \"border-primary shadow-[0_0_0_1px_var(--ohw-primary)]\"\n : \"border-input\",\n );\n\n return (\n <div className=\"flex w-full flex-col gap-2 p-0\">\n <Label htmlFor={inputId} className={cn(urlError && \"text-destructive\")}>\n Destination\n </Label>\n <div ref={rootRef} className=\"relative w-full\">\n <div data-ohw-link-field className={fieldClassName}>\n {selectedPage ? (\n <div className=\"flex shrink-0 items-center pr-2\">\n <File\n size={16}\n className=\"shrink-0 text-foreground\"\n aria-hidden\n />\n </div>\n ) : null}\n {readOnly ? (\n <span className=\"min-w-0 flex-1 truncate text-sm leading-5 text-foreground\">\n {selectedPage?.title ?? value}\n </span>\n ) : (\n <Input\n ref={inputRef}\n id={inputId}\n value={value}\n onChange={(e) => onInputChange(e.target.value)}\n onFocus={() => {\n setIsFocused(true);\n if (!selectedPage) openDropdown();\n }}\n onBlur={() => {\n setIsFocused(false);\n // Backup for when focus moves to another control inside the dialog.\n // Dropdown items call preventDefault on mousedown so focus stays here until select.\n requestAnimationFrame(() => {\n if (!rootRef.current?.contains(document.activeElement)) {\n onDropdownOpenChange(false);\n }\n });\n }}\n placeholder={placeholder}\n className={cn(\n \"min-w-0 flex-1 truncate border-0 bg-transparent p-0 text-sm font-normal leading-5 shadow-none outline-none ring-0 caret-foreground\",\n value\n ? \"text-foreground\"\n : \"text-muted-foreground placeholder:text-muted-foreground\",\n )}\n />\n )}\n {selectedPage && !readOnly ? (\n <button\n type=\"button\"\n className=\"flex shrink-0 items-center justify-center rounded-sm p-0.5 text-muted-foreground outline-none hover:bg-muted/50 hover:text-foreground\"\n onMouseDown={clearSelection}\n aria-label=\"Clear selected page\"\n tabIndex={-1}\n >\n <X size={16} aria-hidden />\n </button>\n ) : null}\n {!readOnly ? <FieldChevron onClick={toggleDropdown} /> : null}\n </div>\n {dropdownOpen && !readOnly && filteredPages.length > 0 ? (\n <div\n data-ohw-link-page-dropdown=\"\"\n className=\"absolute left-0 right-0 top-[calc(100%+4px)] z-50 max-h-48 overflow-auto rounded-lg border border-border bg-popover py-1 shadow-lg\"\n onMouseDown={(e) => e.preventDefault()}\n >\n {filteredPages.map((page) => (\n <button\n key={page.path}\n type=\"button\"\n className=\"flex h-9 w-full items-center gap-2 border-0 bg-transparent px-3 text-left text-sm leading-5 text-foreground outline-none hover:bg-muted\"\n onClick={() => onPageSelect(page)}\n >\n <File size={16} className=\"shrink-0\" aria-hidden />\n <span className=\"truncate\">{page.title}</span>\n </button>\n ))}\n </div>\n ) : null}\n </div>\n {urlError ? (\n <p className=\"text-sm font-medium text-destructive\">{urlError}</p>\n ) : null}\n </div>\n );\n}\n","'use client'\n\nimport * as React from 'react'\n\nimport { cn } from '../lib/utils'\n\nconst Input = React.forwardRef<HTMLInputElement, React.ComponentProps<'input'>>(\n ({ className, type, ...props }, ref) => {\n return (\n <input\n type={type}\n ref={ref}\n data-slot=\"input\"\n className={cn(\n 'flex h-full w-full min-w-0 bg-transparent text-sm text-foreground outline-none placeholder:text-muted-foreground',\n className\n )}\n {...props}\n />\n )\n }\n)\nInput.displayName = 'Input'\n\nexport { Input }\n","'use client'\n\nimport * as React from 'react'\nimport { Label as LabelPrimitive } from 'radix-ui'\n\nimport { cn } from '../lib/utils'\n\nfunction Label({ className, ...props }: React.ComponentProps<typeof LabelPrimitive.Root>) {\n return (\n <LabelPrimitive.Root\n data-slot=\"label\"\n className={cn('text-sm font-medium leading-5 text-foreground', className)}\n {...props}\n />\n )\n}\n\nexport { Label }\n","\"use client\";\n\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport { ArrowLeft, Check } from \"lucide-react\";\nimport { usePathname, useRouter } from \"next/navigation\";\n\nimport { collectSectionsFromDom } from \"../../lib/sections\";\nimport { readPreservedSearch } from \"../../lib/session-search\";\nimport { Button } from \"../button\";\nimport { normalizePath } from \"./linkModal.utils\";\nimport type { LinkSection } from \"./types\";\n\nconst DIM_OVERLAY = \"rgba(0, 0, 0, 0.45)\";\n\ntype SectionPickerOverlayProps = {\n pagePath: string;\n sections: LinkSection[];\n onBack: () => void;\n onSelect: (section: LinkSection) => void;\n};\n\nfunction rectsEqual(a: Map<string, DOMRect>, b: Map<string, DOMRect>): boolean {\n if (a.size !== b.size) return false;\n for (const [id, rect] of a) {\n const other = b.get(id);\n if (\n !other ||\n rect.top !== other.top ||\n rect.left !== other.left ||\n rect.width !== other.width ||\n rect.height !== other.height\n ) {\n return false;\n }\n }\n return true;\n}\n\nfunction readSectionRects(sectionIds: string[]): Map<string, DOMRect> {\n const next = new Map<string, DOMRect>();\n for (const id of sectionIds) {\n const el = document.querySelector<HTMLElement>(\n `[data-ohw-section=\"${CSS.escape(id)}\"]`,\n );\n if (el) next.set(id, el.getBoundingClientRect());\n }\n return next;\n}\n\nfunction hitTestSectionId(\n x: number,\n y: number,\n sectionIds: string[],\n rects: Map<string, DOMRect>,\n): string | null {\n for (const id of sectionIds) {\n const rect = rects.get(id);\n if (!rect || rect.width <= 0 || rect.height <= 0) continue;\n if (\n x >= rect.left &&\n x <= rect.right &&\n y >= rect.top &&\n y <= rect.bottom\n ) {\n return id;\n }\n }\n return null;\n}\n\nfunction useSectionRects(sectionIdsKey: string, enabled: boolean) {\n const [rects, setRects] = useState<Map<string, DOMRect>>(new Map());\n const sectionIds = useMemo(\n () => (sectionIdsKey ? sectionIdsKey.split(\"\\0\") : []),\n [sectionIdsKey],\n );\n\n useEffect(() => {\n if (!enabled || sectionIds.length === 0) {\n setRects((prev) => (prev.size === 0 ? prev : new Map()));\n return;\n }\n\n const update = () => {\n const next = readSectionRects(sectionIds);\n setRects((prev) => (rectsEqual(prev, next) ? prev : next));\n };\n\n update();\n const opts = { capture: true, passive: true } as const;\n window.addEventListener(\"scroll\", update, opts);\n window.addEventListener(\"resize\", update);\n const vv = window.visualViewport;\n vv?.addEventListener(\"resize\", update);\n vv?.addEventListener(\"scroll\", update);\n\n const ro = new ResizeObserver(update);\n for (const id of sectionIds) {\n const el = document.querySelector<HTMLElement>(\n `[data-ohw-section=\"${CSS.escape(id)}\"]`,\n );\n if (el) ro.observe(el);\n }\n\n return () => {\n window.removeEventListener(\"scroll\", update, opts);\n window.removeEventListener(\"resize\", update);\n vv?.removeEventListener(\"resize\", update);\n vv?.removeEventListener(\"scroll\", update);\n ro.disconnect();\n };\n }, [sectionIds, enabled]);\n\n return rects;\n}\n\n/** Full-page section picker — Figma nodes 4591:37899, 4591:37972, 4591:37973 */\nexport function SectionPickerOverlay({\n pagePath,\n sections,\n onBack,\n onSelect,\n}: SectionPickerOverlayProps) {\n const router = useRouter();\n const pathname = usePathname();\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [hoveredId, setHoveredId] = useState<string | null>(null);\n /** Last pointer in iframe client coords (used for hit-testing). */\n const pointerRef = useRef<{ x: number; y: number } | null>(null);\n /**\n * Last pointer in parent/screen space (y ≈ iframeClientY + iframeOffsetTop).\n * Remapping from this on scroll stays accurate even if scroll messages are skipped.\n */\n const pointerScreenRef = useRef<{ x: number; y: number } | null>(null);\n const iframeOffsetTopRef = useRef<number | null>(null);\n const sectionIdsRef = useRef<string[]>([]);\n const [chromeClip, setChromeClip] = useState<{ top: number; bottom: number }>(\n () => ({\n top: 0,\n bottom: typeof window !== \"undefined\" ? window.innerHeight : 0,\n }),\n );\n\n const normalizedTarget = normalizePath(pagePath);\n const isOnTargetPage = normalizePath(pathname) === normalizedTarget;\n\n useEffect(() => {\n if (isOnTargetPage) return;\n const search = readPreservedSearch();\n router.push(`${normalizedTarget}${search}`);\n }, [isOnTargetPage, normalizedTarget, router]);\n\n // Mark document so edit-mode chrome (borders, insert gaps, hover outlines) stays hidden.\n useEffect(() => {\n document.documentElement.setAttribute(\"data-ohw-section-picking\", \"\");\n document\n .querySelectorAll<HTMLElement>(\"[data-ohw-hovered]\")\n .forEach((el) => {\n el.removeAttribute(\"data-ohw-hovered\");\n });\n document\n .querySelectorAll<HTMLElement>(\"[data-ohw-state-hovered]\")\n .forEach((el) => {\n el.removeAttribute(\"data-ohw-state-hovered\");\n });\n return () => {\n document.documentElement.removeAttribute(\"data-ohw-section-picking\");\n };\n }, []);\n\n const liveSections = useMemo(() => {\n if (!isOnTargetPage) return sections;\n // Prefer live DOM so layout sections (e.g. footer) always appear even if\n // the prefetched sections map is incomplete.\n const live = collectSectionsFromDom();\n if (live.length === 0) return sections;\n const labels = new Map(sections.map((s) => [s.id, s.label]));\n return live.map((s) => ({ id: s.id, label: labels.get(s.id) ?? s.label }));\n }, [isOnTargetPage, sections, pathname]);\n\n const sectionIdsKey = useMemo(\n () => liveSections.map((s) => s.id).join(\"\\0\"),\n [liveSections],\n );\n const sectionIds = useMemo(\n () => liveSections.map((s) => s.id),\n [liveSections],\n );\n sectionIdsRef.current = sectionIds;\n const rects = useSectionRects(sectionIdsKey, isOnTargetPage);\n\n const applyHoverAt = useCallback(\n (x: number, y: number, liveRects?: Map<string, DOMRect>) => {\n const ids = sectionIdsRef.current;\n const map = liveRects ?? readSectionRects(ids);\n const next = hitTestSectionId(x, y, ids, map);\n setHoveredId((prev) => (prev === next ? prev : next));\n },\n [],\n );\n\n // Keep Back + hint pinned to the *visible* preview area. Parent scrolls the tall\n // iframe — section getBoundingClientRect() values do not change (no iframe-internal\n // scroll), but the screen cursor maps to a new iframe clientY. Remap pointerRef and\n // re-hit-test on every ow:parent-scroll (even when rect maps are equal).\n useEffect(() => {\n const applyClip = (\n iframeOffsetTop: number,\n visibleCanvasTop: number,\n canvasH: number,\n ) => {\n const top = Math.max(0, visibleCanvasTop - iframeOffsetTop);\n const bottom = Math.min(\n window.innerHeight,\n visibleCanvasTop + canvasH - iframeOffsetTop,\n );\n setChromeClip((prev) =>\n prev.top === top && prev.bottom === bottom\n ? prev\n : { top, bottom: Math.max(top, bottom) },\n );\n };\n\n const onParentScroll = (e: MessageEvent) => {\n if (e.data?.type !== \"ow:parent-scroll\") return;\n const { iframeOffsetTop, headerH, canvasH } = e.data as {\n iframeOffsetTop: number;\n headerH: number;\n canvasH: number;\n };\n applyClip(iframeOffsetTop, headerH, canvasH);\n iframeOffsetTopRef.current = iframeOffsetTop;\n\n // Bootstrap screen-space pointer if we saw a move before the first scroll msg.\n if (!pointerScreenRef.current && pointerRef.current) {\n pointerScreenRef.current = {\n x: pointerRef.current.x,\n y: pointerRef.current.y + iframeOffsetTop,\n };\n }\n\n const screen = pointerScreenRef.current;\n if (screen) {\n const next = { x: screen.x, y: screen.y - iframeOffsetTop };\n pointerRef.current = next;\n applyHoverAt(next.x, next.y);\n }\n };\n\n const onResize = () => {\n setChromeClip((prev) => {\n const bottom = Math.max(prev.top, window.innerHeight);\n return prev.bottom === bottom ? prev : { ...prev, bottom };\n });\n };\n\n window.addEventListener(\"message\", onParentScroll);\n window.addEventListener(\"resize\", onResize);\n return () => {\n window.removeEventListener(\"message\", onParentScroll);\n window.removeEventListener(\"resize\", onResize);\n };\n }, [applyHoverAt]);\n\n // Re-hit-test when section geometry changes (resize / internal scroll).\n useEffect(() => {\n const ptr = pointerRef.current;\n if (!ptr) return;\n applyHoverAt(ptr.x, ptr.y, rects);\n }, [rects, applyHoverAt]);\n\n useEffect(() => {\n const rememberPointer = (clientX: number, clientY: number) => {\n pointerRef.current = { x: clientX, y: clientY };\n const top = iframeOffsetTopRef.current;\n if (top != null) {\n pointerScreenRef.current = { x: clientX, y: clientY + top };\n }\n applyHoverAt(clientX, clientY, rects);\n };\n\n const onPointerMove = (e: PointerEvent) => {\n rememberPointer(e.clientX, e.clientY);\n };\n // Parent may proxy pointer while overlays sit above the iframe.\n const onPointerSync = (e: MessageEvent) => {\n if (e.data?.type !== \"ow:pointer-sync\") return;\n const { clientX, clientY } = e.data as {\n clientX: number;\n clientY: number;\n };\n rememberPointer(clientX, clientY);\n };\n window.addEventListener(\"pointermove\", onPointerMove, { passive: true });\n window.addEventListener(\"message\", onPointerSync);\n return () => {\n window.removeEventListener(\"pointermove\", onPointerMove);\n window.removeEventListener(\"message\", onPointerSync);\n };\n }, [rects, applyHoverAt]);\n\n const handleSelect = useCallback(\n (section: LinkSection) => {\n if (selectedId) return;\n setSelectedId(section.id);\n onSelect(section);\n },\n [selectedId, onSelect],\n );\n\n useEffect(() => {\n const onKeyDown = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") {\n e.preventDefault();\n e.stopPropagation();\n onBack();\n }\n };\n window.addEventListener(\"keydown\", onKeyDown, true);\n return () => window.removeEventListener(\"keydown\", onKeyDown, true);\n }, [onBack]);\n\n const portalRoot =\n typeof document !== \"undefined\"\n ? (document.querySelector<HTMLElement>(\"[data-ohw-bridge-root]\") ??\n document.body)\n : null;\n\n if (!portalRoot) return null;\n\n return createPortal(\n <div\n data-ohw-section-picker=\"\"\n data-ohw-bridge=\"\"\n className={`pointer-events-none fixed inset-0 z-[2147483647] transition-opacity duration-200 ${\"opacity-100\"}`}\n aria-modal\n role=\"dialog\"\n aria-label=\"Choose a section\"\n >\n <div\n className=\"pointer-events-auto fixed left-5 z-[2]\"\n style={{ top: chromeClip.top + 20 }}\n >\n <Button\n type=\"button\"\n variant=\"outline\"\n size=\"sm\"\n className=\"h-8 min-w-0 gap-1 border-border bg-background px-2 py-1.5 shadow-sm hover:bg-muted cursor-pointer\"\n onClick={onBack}\n >\n <ArrowLeft className=\"size-4 shrink-0\" aria-hidden />\n Back\n </Button>\n </div>\n\n <div\n className=\"pointer-events-none fixed left-1/2 z-[2] rounded-lg px-4 py-3 text-xs leading-4 tracking-[0.18px] text-white shadow-md\"\n style={{\n top: chromeClip.bottom - 20,\n transform: \"translate(-50%, -100%)\",\n backgroundColor: \"var(--ohw-popover-foreground, #0c0a09)\",\n }}\n data-ohw-section-picker-hint=\"\"\n >\n Click on section to select\n </div>\n\n {!isOnTargetPage ? (\n <div\n className=\"pointer-events-none fixed left-1/2 z-[1] -translate-x-1/2 rounded-md px-3 py-2 text-sm text-muted-foreground shadow-sm\"\n style={{ top: chromeClip.top + 64, backgroundColor: \"var(--ohw-background, #ffffff)\" }}\n >\n Loading page preview…\n </div>\n ) : null}\n\n {isOnTargetPage && liveSections.length === 0 ? (\n <div className=\"pointer-events-auto fixed inset-0 z-[1] flex items-center justify-center bg-muted/40\">\n <p className=\"text-sm text-muted-foreground\">\n No sections found on this page.\n </p>\n </div>\n ) : null}\n\n {isOnTargetPage\n ? liveSections.map((section) => {\n const rect = rects.get(section.id);\n if (!rect || rect.width <= 0 || rect.height <= 0) return null;\n const isSelected = selectedId === section.id;\n const isHovered = hoveredId === section.id;\n const isLit = isSelected || isHovered;\n\n return (\n <button\n key={section.id}\n type=\"button\"\n className=\"pointer-events-auto fixed z-[1] cursor-pointer border-0 bg-transparent p-0 transition-[background-color] duration-150\"\n style={{\n top: rect.top,\n left: rect.left,\n width: rect.width,\n height: rect.height,\n backgroundColor: isLit ? \"transparent\" : DIM_OVERLAY,\n }}\n aria-label={`Select section ${section.label}`}\n onClick={() => handleSelect(section)}\n >\n {isLit ? (\n <span\n className=\"pointer-events-none absolute\"\n style={{\n inset: 4,\n borderRadius: \"var(--radius, 6px)\",\n border: \"1.5px dashed var(--primary, #0885FE)\",\n boxSizing: \"border-box\",\n }}\n aria-hidden\n />\n ) : null}\n {isSelected ? (\n <span\n className=\"absolute right-3 top-3 flex size-8 items-center justify-center rounded-full text-white\"\n style={{ backgroundColor: \"var(--ohw-primary, #0885fe)\" }}\n aria-hidden\n >\n <Check className=\"size-5\" />\n </span>\n ) : null}\n </button>\n );\n })\n : null}\n </div>,\n portalRoot,\n );\n}\n","'use client'\n\nimport { useCallback, useEffect, useMemo, useState } from 'react'\n\nimport type { LinkModalMode, LinkModalStep, LinkPage, LinkSection, SelectedPage, SelectedSection } from './types'\nimport {\n buildTarget,\n getEditModeInitialState,\n getSectionsForPath,\n normalizeUrl,\n parseTarget,\n validateUrlInput,\n} from './linkModal.utils'\n\ntype UseLinkModalStateParams = {\n open: boolean\n mode: LinkModalMode\n pages: LinkPage[]\n sections: LinkSection[]\n sectionsByPath?: Record<string, LinkSection[]>\n initialTarget?: string\n existingTargets: string[]\n onClose: () => void\n onSubmit: (target: string) => void\n}\n\nexport function useLinkModalState({\n open,\n mode,\n pages,\n sections: _sections,\n sectionsByPath,\n initialTarget,\n existingTargets: _existingTargets,\n onClose,\n onSubmit,\n}: UseLinkModalStateParams) {\n const availablePages = useMemo(() => pages, [pages])\n\n const [searchValue, setSearchValue] = useState('')\n const [selectedPage, setSelectedPage] = useState<SelectedPage | null>(null)\n const [selectedSection, setSelectedSection] = useState<SelectedSection | null>(null)\n const [step, setStep] = useState<LinkModalStep>('input')\n const [dropdownOpen, setDropdownOpen] = useState(false)\n const [urlError, setUrlError] = useState('')\n\n const reset = useCallback(() => {\n setSearchValue('')\n setSelectedPage(null)\n setSelectedSection(null)\n setStep('input')\n setDropdownOpen(false)\n setUrlError('')\n }, [])\n\n // Initialize only when the modal opens (or edit target changes) — never mid-flow.\n // Resetting on pages/sectionsByPath updates was reopening the dialog during section picker navigation.\n useEffect(() => {\n if (!open) return\n if (mode === 'edit' && initialTarget) {\n const { pageRoute } = parseTarget(initialTarget)\n const targetSections = getSectionsForPath(sectionsByPath, pageRoute)\n const init = getEditModeInitialState(initialTarget, pages, targetSections)\n setSearchValue(init.searchValue)\n setSelectedPage(init.selectedPage)\n setSelectedSection(init.selectedSection)\n setStep(init.step)\n } else {\n reset()\n }\n setDropdownOpen(false)\n setUrlError('')\n }, [open, mode, initialTarget, reset])\n\n const filteredPages = useMemo(() => {\n if (!searchValue.trim()) return availablePages\n return availablePages.filter((p) => p.title.toLowerCase().startsWith(searchValue.toLowerCase()))\n }, [availablePages, searchValue])\n\n const activeSections = useMemo(() => {\n if (!selectedPage) return []\n return getSectionsForPath(sectionsByPath, selectedPage.path)\n }, [selectedPage, sectionsByPath])\n\n const showBreadcrumb = step === 'confirmed' && selectedPage && selectedSection\n const showSectionPicker = step === 'sectionPicker' && selectedPage\n const showSectionRow =\n mode === 'edit' && selectedPage && selectedSection && step === 'input'\n const showChooseSection =\n step === 'input' && selectedPage && !selectedSection && !showSectionRow && activeSections.length > 0\n\n const handleInputChange = (value: string) => {\n setSearchValue(value)\n setSelectedPage(null)\n setSelectedSection(null)\n setStep('input')\n setUrlError('')\n\n const filtered = value.trim()\n ? availablePages.filter((p) => p.title.toLowerCase().startsWith(value.toLowerCase()))\n : availablePages\n setDropdownOpen(filtered.length > 0)\n\n if (value.trim()) {\n setUrlError(validateUrlInput(value, availablePages, pages))\n }\n }\n\n const handlePageSelect = (page: LinkPage) => {\n setSelectedPage({ path: page.path, title: page.title })\n setSelectedSection(null)\n setSearchValue(page.title)\n setStep('input')\n setDropdownOpen(false)\n setUrlError('')\n }\n\n const handleChooseSection = () => {\n setStep('sectionPicker')\n }\n\n const handleSectionSelect = (section: LinkSection) => {\n setSelectedSection({ id: section.id, label: section.label })\n if (mode === 'create') {\n setStep('confirmed')\n } else {\n setStep('input')\n }\n }\n\n const handleBackToSections = () => {\n setStep('sectionPicker')\n }\n\n const handleSectionPickerBack = () => {\n setStep('input')\n }\n\n const handleClose = () => {\n reset()\n onClose()\n }\n\n const isValid = useMemo(() => {\n if (urlError) return false\n if (showBreadcrumb) return true\n if (selectedPage) return true\n if (!searchValue.trim()) return false\n return validateUrlInput(searchValue, availablePages, pages) === ''\n }, [urlError, showBreadcrumb, selectedPage, searchValue, availablePages, pages])\n\n const handleSubmit = () => {\n if (selectedPage && selectedSection) {\n onSubmit(buildTarget(selectedPage, selectedSection))\n handleClose()\n return\n }\n\n if (selectedPage) {\n onSubmit(buildTarget(selectedPage, null))\n handleClose()\n return\n }\n\n if (!searchValue.trim()) return\n\n const error = validateUrlInput(searchValue, availablePages, pages)\n if (error) {\n setUrlError(error)\n return\n }\n\n const matchingPage = pages.find((p) => p.title.toLowerCase() === searchValue.toLowerCase())\n if (matchingPage) {\n onSubmit(matchingPage.path)\n handleClose()\n return\n }\n\n onSubmit(normalizeUrl(searchValue))\n handleClose()\n }\n\n const submitLabel = showBreadcrumb ? 'Save' : mode === 'edit' ? 'Save' : 'Create'\n const title = mode === 'edit' ? 'Edit navigation item' : 'Create navigation item'\n const secondaryLabel = showBreadcrumb ? 'Back to sections' : 'Cancel'\n const handleSecondary = showBreadcrumb ? handleBackToSections : handleClose\n\n return {\n title,\n submitLabel,\n secondaryLabel,\n searchValue,\n selectedPage,\n selectedSection,\n step,\n dropdownOpen,\n setDropdownOpen,\n urlError,\n filteredPages,\n showBreadcrumb,\n showSectionPicker,\n showChooseSection,\n showSectionRow,\n isValid,\n activeSections,\n handleInputChange,\n handlePageSelect,\n handleChooseSection,\n handleSectionSelect,\n handleBackToSections,\n handleSectionPickerBack,\n handleClose,\n handleSecondary,\n handleSubmit,\n }\n}\n","import { readPreservedSearch } from '../../lib/session-search'\nimport type { LinkPage } from './types'\n\nexport type DevSection = { id: string; label: string }\n\n/** Re:Bound template pages — for local link-editor testing without canvas parent. */\nexport const DEV_SITE_PAGES: LinkPage[] = [\n { path: '/', title: 'Home' },\n { path: '/about', title: 'About' },\n { path: '/classes', title: 'Classes' },\n { path: '/pricing', title: 'Pricing' },\n { path: '/studio', title: 'Studio' },\n { path: '/instructors', title: 'Instructors' },\n { path: '/contact', title: 'Contact' },\n]\n\n/**\n * Sections per route (matches rebound-template `data-ohw-section` markers).\n * Pre-seeded so you can pick a section for any page without visiting it first.\n */\nexport const DEV_SECTIONS_BY_PATH: Record<string, DevSection[]> = {\n '/': [\n { id: 'hero', label: 'Hero' },\n { id: 'lagree-intro', label: 'Lagree Intro' },\n { id: 'classes-strip', label: 'Classes' },\n { id: 'feel-split', label: 'Feel Split' },\n { id: 'founder-teaser', label: 'Founder' },\n { id: 'plan-form', label: 'Plan Form' },\n { id: 'testimonials', label: 'Testimonials' },\n { id: 'wordmark', label: 'Wordmark' },\n { id: 'footer', label: 'Footer' },\n ],\n '/about': [\n { id: 'manifesto', label: 'Manifesto' },\n { id: 'story-letter', label: 'Our Story' },\n { id: 'lagree-explainer', label: 'Lagree Explainer' },\n { id: 'waitlist-cta', label: 'Waitlist' },\n { id: 'personal-training', label: 'Personal training' },\n { id: 'footer', label: 'Footer' },\n ],\n '/classes': [\n { id: 'class-library', label: 'Class Library' },\n { id: 'footer', label: 'Footer' },\n ],\n '/pricing': [\n { id: 'page-header', label: 'Page Header' },\n { id: 'free-class-cta', label: 'Free Class' },\n { id: 'benefits-marquee', label: 'Benefits' },\n { id: 'monthly-memberships', label: 'Memberships' },\n { id: 'specialty-programs', label: 'Specialty Programs' },\n { id: 'package-matcher', label: 'Packages' },\n { id: 'wordmark', label: 'Wordmark' },\n { id: 'footer', label: 'Footer' },\n ],\n '/studio': [\n { id: 'studio-intro', label: 'Studio Intro' },\n { id: 'studio-features', label: 'Studio Features' },\n { id: 'studio-gallery', label: 'Studio Gallery' },\n { id: 'studio-visit', label: 'Visit Studio' },\n { id: 'footer', label: 'Footer' },\n ],\n '/instructors': [\n { id: 'instructor-grid', label: 'Instructors' },\n { id: 'footer', label: 'Footer' },\n ],\n '/contact': [\n { id: 'hello-hero', label: 'Hello' },\n { id: 'contact-form', label: 'Contact Form' },\n { id: 'faq', label: 'FAQ' },\n { id: 'footer', label: 'Footer' },\n ],\n}\n\nexport function shouldUseDevFixtures(): boolean {\n if (typeof window === 'undefined') return false\n const raw = readPreservedSearch()\n const q = raw.startsWith('?') ? raw.slice(1) : raw\n return new URLSearchParams(q).get('ohw-fixtures') === '1'\n}\n","/**\n * Navbar tree model — OHH-435.\n * Depth cap: MAX_LEVEL.nav = 1 (no dropdown nested inside a dropdown).\n * Flat templates use root-only nodes (empty children).\n */\n\nexport const MAX_LEVEL = { nav: 1 } as const\n\nexport type NavNode = {\n /** Stable href key, e.g. `nav-0-href`. Unchanged across moves. */\n id: string\n children: NavNode[]\n}\n\nexport type NavMoveTarget = {\n /** null = root list */\n parentId: string | null\n /** Index among siblings *before* removal adjustment */\n index: number\n}\n\nconst ROOT = null\n\nfunction cloneForest(nodes: NavNode[]): NavNode[] {\n return nodes.map((n) => ({ id: n.id, children: cloneForest(n.children) }))\n}\n\nfunction findNode(\n nodes: NavNode[],\n id: string,\n parentId: string | null = ROOT\n): { node: NavNode; parentId: string | null; index: number; siblings: NavNode[] } | null {\n for (let i = 0; i < nodes.length; i++) {\n const node = nodes[i]!\n if (node.id === id) return { node, parentId, index: i, siblings: nodes }\n const nested = findNode(node.children, id, node.id)\n if (nested) return nested\n }\n return null\n}\n\nfunction getChildrenOf(nodes: NavNode[], parentId: string | null): NavNode[] | null {\n if (parentId === ROOT) return nodes\n const found = findNode(nodes, parentId)\n return found ? found.node.children : null\n}\n\nfunction isDescendant(nodes: NavNode[], ancestorId: string, maybeDescendantId: string): boolean {\n const found = findNode(nodes, ancestorId)\n if (!found) return false\n return findNode(found.node.children, maybeDescendantId) !== null\n}\n\n/** Level of a node: 0 = top-level, 1 = dropdown child. */\nexport function levelOf(nodes: NavNode[], id: string): number {\n const loc = findNode(nodes, id)\n if (!loc) return -1\n if (loc.parentId === ROOT) return 0\n return 1 + Math.max(0, levelOf(nodes, loc.parentId))\n}\n\n/** Level a new child would have under parentId (ROOT → 0). */\nfunction insertedLevel(nodes: NavNode[], parentId: string | null): number {\n if (parentId === ROOT) return 0\n const parentLevel = levelOf(nodes, parentId)\n if (parentLevel < 0) return -1\n return parentLevel + 1\n}\n\n/** Remove node + subtree from forest. Returns taken node, or null if missing. */\nexport function takeNode(nodes: NavNode[], id: string): { forest: NavNode[]; taken: NavNode } | null {\n const forest = cloneForest(nodes)\n const loc = findNode(forest, id)\n if (!loc) return null\n const [taken] = loc.siblings.splice(loc.index, 1)\n if (!taken) return null\n return { forest, taken }\n}\n\n/** Insert `node` under parentId at index (clamped). Mutates forest in place. */\nexport function insertInto(\n forest: NavNode[],\n node: NavNode,\n parentId: string | null,\n index: number\n): boolean {\n const siblings = getChildrenOf(forest, parentId)\n if (!siblings) return false\n const clamped = Math.max(0, Math.min(index, siblings.length))\n siblings.splice(clamped, 0, node)\n return true\n}\n\n/**\n * Empty dropdown → plain link (children array cleared / node stays).\n * Called after every successful move.\n */\nexport function normalize(nodes: NavNode[]): NavNode[] {\n const walk = (list: NavNode[]): NavNode[] =>\n list.map((n) => {\n const children = walk(n.children)\n return { id: n.id, children }\n })\n return walk(nodes)\n}\n\n/**\n * Move draggedId to (parentId, targetIndex).\n * Rejects: self/descendant parent, depth > MAX_LEVEL.nav, missing nodes, no-op same slot.\n * Index math: same-parent later insert shifts −1 after take (take → insertInto).\n */\nexport function moveNode(\n model: NavNode[],\n draggedId: string,\n target: NavMoveTarget\n): NavNode[] | null {\n const { parentId, index: targetIndex } = target\n\n if (parentId === draggedId) return null\n if (parentId !== ROOT && isDescendant(model, draggedId, parentId)) return null\n\n const nextLevel = insertedLevel(model, parentId)\n if (nextLevel < 0 || nextLevel > MAX_LEVEL.nav) return null\n\n // Dragging a dropdown (node with children) under another item would nest deeper than max.\n const draggedLoc = findNode(model, draggedId)\n if (!draggedLoc) return null\n if (parentId !== ROOT && draggedLoc.node.children.length > 0) return null\n\n const taken = takeNode(model, draggedId)\n if (!taken) return null\n\n let insertIndex = targetIndex\n if (draggedLoc.parentId === parentId && draggedLoc.index < targetIndex) {\n insertIndex -= 1\n }\n\n if (!insertInto(taken.forest, taken.taken, parentId, insertIndex)) return null\n\n const next = normalize(taken.forest)\n\n // No-op if structure unchanged\n if (forestsEqual(model, next)) return null\n return next\n}\n\nexport function forestsEqual(a: NavNode[], b: NavNode[]): boolean {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n const left = a[i]!\n const right = b[i]!\n if (left.id !== right.id) return false\n if (!forestsEqual(left.children, right.children)) return false\n }\n return true\n}\n\nexport function forestFromFlatOrder(order: string[]): NavNode[] {\n return order.map((id) => ({ id, children: [] }))\n}\n\n/** Prefer flat string[] when no nesting (backward compatible with existing content). */\nexport function serializeNavOrder(nodes: NavNode[]): string {\n const hasNesting = nodes.some((n) => n.children.length > 0)\n if (!hasNesting) {\n return JSON.stringify(nodes.map((n) => n.id))\n }\n return JSON.stringify(nodes)\n}\n\nexport function parseNavOrderJson(raw: string | undefined): NavNode[] | null {\n if (!raw) return null\n try {\n const parsed = JSON.parse(raw) as unknown\n if (!Array.isArray(parsed)) return null\n if (parsed.every((x) => typeof x === 'string')) {\n return forestFromFlatOrder(parsed.filter((x): x is string => typeof x === 'string' && x.length > 0))\n }\n return parseNavNodeList(parsed)\n } catch {\n return null\n }\n}\n\nfunction parseNavNodeList(raw: unknown[]): NavNode[] | null {\n const out: NavNode[] = []\n for (const item of raw) {\n if (typeof item === 'string' && item.length > 0) {\n out.push({ id: item, children: [] })\n continue\n }\n if (!item || typeof item !== 'object') return null\n const rec = item as { id?: unknown; children?: unknown }\n if (typeof rec.id !== 'string' || !rec.id) return null\n const children = Array.isArray(rec.children) ? parseNavNodeList(rec.children) : []\n if (!children) return null\n out.push({ id: rec.id, children })\n }\n return out\n}\n\nexport function flattenNavOrder(nodes: NavNode[]): string[] {\n const out: string[] = []\n const walk = (list: NavNode[]) => {\n for (const n of list) {\n out.push(n.id)\n walk(n.children)\n }\n }\n walk(nodes)\n return out\n}\n","import { getStoredLinkHref } from '../linkHrefStore'\nimport {\n flattenNavOrder,\n forestFromFlatOrder,\n forestsEqual,\n moveNode,\n parseNavOrderJson,\n serializeNavOrder,\n type NavNode,\n} from './nav-tree'\n\nexport const NAV_COUNT_KEY = '__ohw_nav_count'\nexport const NAV_ORDER_KEY = '__ohw_nav_order'\n\nconst NAV_HREF_RE = /^nav-(\\d+)-href$/\n\nexport function isNavbarHrefKey(key: string | null): boolean {\n if (!key) return false\n if (key === 'nav-book-href') return false\n return NAV_HREF_RE.test(key)\n}\n\nfunction getLinkHref(el: HTMLElement): string {\n const key = el.getAttribute('data-ohw-href-key')\n if (key) {\n const stored = getStoredLinkHref(key)\n if (stored !== undefined) return stored\n }\n return el.getAttribute('href') ?? ''\n}\n\nfunction isNavbarButton(el: HTMLElement): boolean {\n return el.hasAttribute('data-ohw-role') && el.getAttribute('data-ohw-role') === 'navbar-button'\n}\n\nfunction isNavbarLinkItem(el: HTMLElement): boolean {\n if (!el.matches('[data-ohw-href-key]')) return false\n if (isNavbarButton(el)) return false\n if (!el.querySelector('[data-ohw-editable=\"text\"]')) return false\n return Boolean(el.closest('nav, [data-ohw-nav-container], [data-ohw-nav-drawer]'))\n}\n\nexport function getNavbarDesktopContainer(): HTMLElement | null {\n return document.querySelector<HTMLElement>('[data-ohw-nav-container]')\n}\n\nexport function getNavbarDrawerContainer(): HTMLElement | null {\n return document.querySelector<HTMLElement>('[data-ohw-nav-drawer]')\n}\n\nexport function listNavbarItems(): HTMLElement[] {\n const desktop = getNavbarDesktopContainer()\n if (desktop) {\n return Array.from(desktop.querySelectorAll<HTMLElement>('[data-ohw-href-key]')).filter(isNavbarLinkItem)\n }\n\n const drawer = getNavbarDrawerContainer()\n if (drawer) {\n return Array.from(drawer.querySelectorAll<HTMLElement>('[data-ohw-href-key]')).filter(isNavbarLinkItem)\n }\n\n return Array.from(document.querySelectorAll<HTMLElement>('nav [data-ohw-href-key]')).filter(isNavbarLinkItem)\n}\n\nexport function parseNavIndexFromKey(key: string | null): number | null {\n if (!key) return null\n const match = key.match(NAV_HREF_RE)\n if (!match) return null\n return parseInt(match[1]!, 10)\n}\n\nexport function getNavbarIndicesInDom(): number[] {\n const indices = new Set<number>()\n for (const item of listNavbarItems()) {\n const idx = parseNavIndexFromKey(item.getAttribute('data-ohw-href-key'))\n if (idx !== null) indices.add(idx)\n }\n return [...indices].sort((a, b) => a - b)\n}\n\nexport function getNextNavbarIndex(): number {\n const indices = getNavbarIndicesInDom()\n if (indices.length === 0) return 0\n return Math.max(...indices) + 1\n}\n\nexport function getNavbarExistingTargets(): string[] {\n return listNavbarItems()\n .map((el) => getLinkHref(el))\n .filter(Boolean)\n}\n\nexport function getNavOrderFromDom(): string[] {\n return listNavbarItems()\n .map((el) => el.getAttribute('data-ohw-href-key'))\n .filter((key): key is string => Boolean(key))\n}\n\nfunction findCounterpartByHrefKey(hrefKey: string, root: ParentNode): HTMLElement | null {\n return root.querySelector<HTMLElement>(`[data-ohw-href-key=\"${CSS.escape(hrefKey)}\"]`)\n}\n\nfunction cloneNavLinkShell(template: HTMLElement | null): HTMLAnchorElement {\n const anchor = document.createElement('a')\n if (template) {\n anchor.style.cssText = template.style.cssText\n if (template.className) anchor.className = template.className\n }\n anchor.style.cursor = 'pointer'\n anchor.style.textDecoration = 'none'\n return anchor\n}\n\nfunction buildNavLink(index: number, href: string, label: string, template: HTMLElement | null): HTMLAnchorElement {\n const anchor = cloneNavLinkShell(template)\n anchor.href = href\n anchor.setAttribute('data-ohw-href-key', `nav-${index}-href`)\n\n const span = document.createElement('span')\n span.setAttribute('data-ohw-editable', 'text')\n span.setAttribute('data-ohw-key', `nav-${index}-label`)\n span.textContent = label\n anchor.appendChild(span)\n return anchor\n}\n\nfunction insertNavLinkInContainer(\n container: HTMLElement,\n anchor: HTMLAnchorElement,\n afterHrefKey: string | null\n) {\n if (!afterHrefKey) {\n container.appendChild(anchor)\n return\n }\n\n const afterEl = findCounterpartByHrefKey(afterHrefKey, container)\n if (afterEl?.parentElement === container) {\n afterEl.insertAdjacentElement('afterend', anchor)\n return\n }\n\n container.appendChild(anchor)\n}\n\nfunction insertNavbarItemDom(\n index: number,\n href: string,\n label: string,\n afterAnchor: HTMLElement | null\n): HTMLElement | null {\n const afterHrefKey = afterAnchor?.getAttribute('data-ohw-href-key') ?? null\n const desktopItems = getNavbarDesktopContainer()?.querySelectorAll<HTMLElement>('[data-ohw-href-key]') ?? []\n const drawerItems = getNavbarDrawerContainer()?.querySelectorAll<HTMLElement>('[data-ohw-href-key]') ?? []\n const desktopTemplate = Array.from(desktopItems).find(isNavbarLinkItem) ?? null\n const drawerTemplate = Array.from(drawerItems).find(isNavbarLinkItem) ?? null\n\n let primary: HTMLAnchorElement | null = null\n const desktopContainer = getNavbarDesktopContainer()\n\n if (desktopContainer) {\n const desktopAnchor = buildNavLink(index, href, label, desktopTemplate)\n insertNavLinkInContainer(desktopContainer, desktopAnchor, afterHrefKey)\n primary = desktopAnchor\n }\n\n const drawerContainer = getNavbarDrawerContainer()\n if (drawerContainer) {\n const drawerAnchor = buildNavLink(index, href, label, drawerTemplate)\n insertNavLinkInContainer(drawerContainer, drawerAnchor, afterHrefKey)\n if (!primary) primary = drawerAnchor\n }\n\n if (!primary) {\n const fallback = buildNavLink(index, href, label, listNavbarItems()[0] ?? null)\n const nav = document.querySelector('nav')\n nav?.appendChild(fallback)\n primary = fallback\n }\n\n return primary\n}\n\nfunction navOrderKeysEqual(a: string[], b: string[]): boolean {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n if (a[i] !== b[i]) return false\n }\n return true\n}\n\nfunction getNavbarLinkKeysInContainer(container: HTMLElement): string[] {\n return Array.from(container.querySelectorAll<HTMLElement>('[data-ohw-href-key]'))\n .filter(isNavbarLinkItem)\n .map((el) => el.getAttribute('data-ohw-href-key'))\n .filter((key): key is string => Boolean(key))\n}\n\n/**\n * Re-order nav links without no-op appendChild churn.\n * Early-return when already ordered (including extras not in `order`).\n * Successive appendChild (move-to-end in target order) is correct only when\n * nothing untouched (e.g. the CTA button) follows the links — otherwise each\n * appendChild pulls a link past that untouched sibling, dragging it to the\n * front. Insert before that sibling instead so it stays put.\n */\nfunction applyNavOrderToContainer(container: HTMLElement, order: string[]) {\n const desired = order.filter((key, i) => order.indexOf(key) === i)\n const current = getNavbarLinkKeysInContainer(container)\n const extras = current.filter((key) => !desired.includes(key))\n const expected = [...desired.filter((key) => current.includes(key)), ...extras]\n const orderedEls: HTMLElement[] = []\n\n if (navOrderKeysEqual(current, expected)) return\n\n if (current.length === expected.length && current.every((key, i) => key === expected[i])) {\n return\n }\n\n // Anchor = whatever currently follows the last link item (e.g. the CTA button),\n // captured before any mutation so it stays a stable insertion boundary.\n const lastCurrentLinkEl =\n current.length > 0 ? findCounterpartByHrefKey(current[current.length - 1]!, container) : null\n const anchor =\n lastCurrentLinkEl?.parentElement === container ? lastCurrentLinkEl.nextElementSibling : null\n\n const seen = new Set<string>()\n for (const hrefKey of desired) {\n if (seen.has(hrefKey)) continue\n seen.add(hrefKey)\n const el = findCounterpartByHrefKey(hrefKey, container)\n if (el && isNavbarLinkItem(el)) orderedEls.push(el)\n }\n\n for (const el of container.querySelectorAll<HTMLElement>('[data-ohw-href-key]')) {\n if (!isNavbarLinkItem(el)) continue\n const key = el.getAttribute('data-ohw-href-key')\n if (!key || seen.has(key)) continue\n orderedEls.push(el)\n }\n\n for (const el of orderedEls) {\n if (anchor) {\n if (el.nextSibling !== anchor) container.insertBefore(el, anchor)\n } else if (container.lastElementChild !== el) {\n container.appendChild(el)\n }\n }\n}\n\n/** Re-order nav link anchors in desktop + drawer containers. */\nexport function applyNavOrder(order: string[]) {\n const desktop = getNavbarDesktopContainer()\n if (desktop) applyNavOrderToContainer(desktop, order)\n\n const drawer = getNavbarDrawerContainer()\n if (drawer) applyNavOrderToContainer(drawer, order)\n}\n\nfunction applyChildrenOrder(parentHrefKey: string, childKeys: string[], root: ParentNode) {\n const parent = findCounterpartByHrefKey(parentHrefKey, root)\n if (!parent) return\n const group = parent.closest<HTMLElement>('[data-ohw-nav-group]')\n const childrenRoot = group?.querySelector<HTMLElement>(':scope > [data-ohw-nav-children]')\n if (!childrenRoot) return\n\n const current = Array.from(childrenRoot.querySelectorAll<HTMLElement>(':scope > [data-ohw-href-key]'))\n .map((el) => el.getAttribute('data-ohw-href-key'))\n .filter((key): key is string => Boolean(key))\n if (navOrderKeysEqual(current, childKeys)) return\n\n for (const key of childKeys) {\n const el = findCounterpartByHrefKey(key, root)\n if (!el) continue\n if (childrenRoot.lastElementChild !== el) {\n childrenRoot.appendChild(el)\n }\n }\n}\n\n/** Apply forest: root siblings in nav container; children inside each group's children root. */\nexport function applyNavForest(forest: NavNode[]) {\n if (forestsEqual(forest, getNavForestFromDom())) return\n\n const rootKeys = forest.map((n) => n.id)\n applyNavOrder(rootKeys)\n\n const desktop = getNavbarDesktopContainer()\n const drawer = getNavbarDrawerContainer()\n for (const node of forest) {\n if (node.children.length === 0) continue\n const childKeys = node.children.map((c) => c.id)\n if (desktop) applyChildrenOrder(node.id, childKeys, desktop)\n if (drawer) applyChildrenOrder(node.id, childKeys, drawer)\n }\n}\n\n/** Build forest from current DOM (flat root; children via `data-ohw-nav-children` when present). */\nexport function getNavForestFromDom(): NavNode[] {\n const items = listNavbarItems()\n const nestedChildKeys = new Set<string>()\n const roots: NavNode[] = []\n\n for (const item of items) {\n const key = item.getAttribute('data-ohw-href-key')\n if (!key || !isNavbarHrefKey(key)) continue\n if (item.closest('[data-ohw-nav-children]')) continue\n\n const group = item.closest<HTMLElement>('[data-ohw-nav-group]')\n const childrenRoot = group?.querySelector<HTMLElement>(':scope > [data-ohw-nav-children]')\n const children: NavNode[] = []\n if (childrenRoot) {\n for (const child of childrenRoot.querySelectorAll<HTMLElement>(':scope > [data-ohw-href-key]')) {\n if (!isNavbarLinkItem(child)) continue\n const childKey = child.getAttribute('data-ohw-href-key')\n if (!childKey || !isNavbarHrefKey(childKey)) continue\n nestedChildKeys.add(childKey)\n children.push({ id: childKey, children: [] })\n }\n }\n roots.push({ id: key, children })\n }\n\n if (roots.length === 0) {\n return forestFromFlatOrder(\n getNavOrderFromDom().filter((k) => isNavbarHrefKey(k) && !nestedChildKeys.has(k))\n )\n }\n return roots\n}\n\n/**\n * Plan a move to (parentId, insertIndex). Returns serialized order JSON string, or null if no-op.\n * Flat templates: parentId must be null (root reorder only until OHH-507 dropdown markup).\n */\nexport function planNavItemMove(\n hrefKey: string,\n parentId: string | null,\n insertIndex: number\n): { forest: NavNode[]; orderJson: string; flatOrder: string[] } | null {\n const model = getNavForestFromDom()\n const next = moveNode(model, hrefKey, { parentId, index: insertIndex })\n if (!next) return null\n if (forestsEqual(model, next)) return null\n return {\n forest: next,\n orderJson: serializeNavOrder(next),\n flatOrder: flattenNavOrder(next),\n }\n}\n\nexport function collectNavbarIndicesFromContent(content: Record<string, string>): number[] {\n const indices = new Set<number>()\n for (const key of Object.keys(content)) {\n const idx = parseNavIndexFromKey(key)\n if (idx !== null) indices.add(idx)\n }\n const countRaw = content[NAV_COUNT_KEY]\n if (countRaw) {\n const count = parseInt(countRaw, 10)\n if (Number.isFinite(count) && count > 0) {\n for (let i = 0; i < count; i++) indices.add(i)\n }\n }\n return [...indices].sort((a, b) => a - b)\n}\n\nfunction navbarIndexExistsInDom(index: number): boolean {\n return document.querySelector(`[data-ohw-href-key=\"nav-${index}-href\"]`) !== null\n}\n\nexport function reconcileNavbarItemsFromContent(content: Record<string, string>) {\n const indices = collectNavbarIndicesFromContent(content)\n\n for (const index of indices) {\n if (navbarIndexExistsInDom(index)) continue\n const href = content[`nav-${index}-href`]\n const label = content[`nav-${index}-label`]\n if (!href && !label) continue\n insertNavbarItemDom(index, href ?? '/', label ?? 'Untitled', null)\n }\n\n const orderForest = parseNavOrderJson(content[NAV_ORDER_KEY])\n if (orderForest?.length) {\n applyNavForest(orderForest)\n }\n}\n\nexport function buildNavOrderAfterInsert(afterAnchor: HTMLElement | null, newHrefKey: string): string[] {\n const order = getNavOrderFromDom()\n if (!afterAnchor) {\n if (!order.includes(newHrefKey)) order.push(newHrefKey)\n return order\n }\n\n const afterKey = afterAnchor.getAttribute('data-ohw-href-key')\n if (!afterKey) {\n if (!order.includes(newHrefKey)) order.push(newHrefKey)\n return order\n }\n\n const withoutNew = order.filter((key) => key !== newHrefKey)\n const pos = withoutNew.indexOf(afterKey)\n if (pos >= 0) {\n withoutNew.splice(pos + 1, 0, newHrefKey)\n return withoutNew\n }\n\n withoutNew.push(newHrefKey)\n return withoutNew\n}\n\nexport type NavbarItemInsertResult = {\n anchor: HTMLElement\n index: number\n hrefKey: string\n labelKey: string\n href: string\n label: string\n order: string[]\n}\n\nexport function insertNavbarItem(\n href: string,\n label: string,\n afterAnchor: HTMLElement | null = null\n): NavbarItemInsertResult {\n const index = getNextNavbarIndex()\n const anchor = insertNavbarItemDom(index, href, label, afterAnchor)\n if (!anchor) throw new Error('Failed to insert navbar item')\n\n const hrefKey = `nav-${index}-href`\n const order = buildNavOrderAfterInsert(afterAnchor, hrefKey)\n applyNavOrder(order)\n\n return {\n anchor,\n index,\n hrefKey,\n labelKey: `nav-${index}-label`,\n href,\n label,\n order,\n }\n}\n\nexport type NavbarItemDuplicateResult = NavbarItemInsertResult & {\n /** New keys for cloned dropdown children (empty for leaf items). */\n childResults: NavbarItemInsertResult[]\n orderJson: string\n}\n\n/**\n * Clone a navbar item (and dropdown children when present) as the next sibling.\n * New indices/keys for every cloned node. Returns the primary (parent) clone.\n */\nexport function duplicateNavbarItem(sourceAnchor: HTMLElement): NavbarItemDuplicateResult | null {\n if (!isNavbarLinkItem(sourceAnchor)) return null\n const sourceHrefKey = sourceAnchor.getAttribute('data-ohw-href-key')\n if (!sourceHrefKey || !isNavbarHrefKey(sourceHrefKey)) return null\n\n const href = getLinkHref(sourceAnchor)\n const labelEl = sourceAnchor.querySelector<HTMLElement>('[data-ohw-editable=\"text\"]')\n const label = (labelEl?.textContent ?? '').trim() || 'Untitled'\n\n const forest = getNavForestFromDom()\n const sourceNode = forest.find((n) => n.id === sourceHrefKey)\n const childIds = sourceNode?.children.map((c) => c.id) ?? []\n\n const primary = insertNavbarItem(href, label, sourceAnchor)\n const childResults: NavbarItemInsertResult[] = []\n let after: HTMLElement = primary.anchor\n\n for (const childId of childIds) {\n const childEl =\n findCounterpartByHrefKey(childId, document) ??\n document.querySelector<HTMLElement>(`[data-ohw-href-key=\"${CSS.escape(childId)}\"]`)\n if (!childEl || !isNavbarLinkItem(childEl)) continue\n const childHref = getLinkHref(childEl)\n const childLabelEl = childEl.querySelector<HTMLElement>('[data-ohw-editable=\"text\"]')\n const childLabel = (childLabelEl?.textContent ?? '').trim() || 'Untitled'\n const inserted = insertNavbarItem(childHref, childLabel, after)\n childResults.push(inserted)\n after = inserted.anchor\n }\n\n // Prefer nested forest when the source was a dropdown parent.\n let orderJson: string\n if (childResults.length > 0) {\n const nextForest = getNavForestFromDom()\n const withoutNew = nextForest.filter(\n (n) => n.id !== primary.hrefKey && !childResults.some((c) => c.hrefKey === n.id)\n )\n const sourceIdx = withoutNew.findIndex((n) => n.id === sourceHrefKey)\n const insertAt = sourceIdx >= 0 ? sourceIdx + 1 : withoutNew.length\n withoutNew.splice(insertAt, 0, {\n id: primary.hrefKey,\n children: childResults.map((c) => ({ id: c.hrefKey, children: [] })),\n })\n applyNavForest(withoutNew)\n orderJson = serializeNavOrder(withoutNew)\n } else {\n orderJson = serializeNavOrder(getNavForestFromDom())\n }\n\n return {\n ...primary,\n order: flattenNavOrder(parseNavOrderJson(orderJson) ?? getNavForestFromDom()),\n childResults,\n orderJson,\n }\n}\n","/** Footer link/column order helpers — parallel to nav-items.ts for OHH-436. */\n\nimport { getStoredLinkHref } from '../linkHrefStore'\n\nexport const FOOTER_ORDER_KEY = '__ohw_footer_order'\n/** Hard cap on footer link columns (Add item). */\nexport const MAX_FOOTER_COLUMNS = 18\n\n\nconst FOOTER_HREF_RE = /^footer-(\\d+)-(\\d+)-href$/\n\nexport function parseFooterHrefKey(key: string | null): { col: number; item: number } | null {\n if (!key) return null\n const match = key.match(FOOTER_HREF_RE)\n if (!match) return null\n return { col: parseInt(match[1]!, 10), item: parseInt(match[2]!, 10) }\n}\n\nexport function isFooterHrefKey(key: string | null): boolean {\n return parseFooterHrefKey(key) !== null\n}\n\nexport function getFooterRoot(): HTMLElement | null {\n return document.querySelector<HTMLElement>('footer[data-ohw-section=\"footer\"], footer')\n}\n\nexport function getFooterLinksContainer(): HTMLElement | null {\n return (\n document.querySelector<HTMLElement>('[data-ohw-footer-links]') ??\n document.querySelector<HTMLElement>('.rb-footer-links')\n )\n}\n\nfunction isFooterLinkAnchor(el: HTMLElement): boolean {\n if (!el.matches('[data-ohw-href-key]')) return false\n if (!isFooterHrefKey(el.getAttribute('data-ohw-href-key'))) return false\n return Boolean(el.querySelector('[data-ohw-editable=\"text\"]'))\n}\n\nexport function listFooterColumns(): HTMLElement[] {\n const root =\n getFooterLinksContainer() ??\n getFooterRoot()?.querySelector<HTMLElement>('.rb-footer-links') ??\n null\n if (!root) return []\n\n const explicit = Array.from(root.querySelectorAll<HTMLElement>(':scope > [data-ohw-footer-col]'))\n if (explicit.length > 0) return explicit\n\n return Array.from(root.children).filter((el): el is HTMLElement => {\n if (!(el instanceof HTMLElement)) return false\n return Array.from(el.querySelectorAll<HTMLElement>(':scope > [data-ohw-href-key]')).some(\n isFooterLinkAnchor\n )\n })\n}\n\nexport function listFooterLinksInColumn(column: HTMLElement): HTMLElement[] {\n return Array.from(column.querySelectorAll<HTMLElement>(':scope > [data-ohw-href-key]')).filter(\n isFooterLinkAnchor\n )\n}\n\nexport function findFooterColumnForLink(anchor: HTMLElement): HTMLElement | null {\n const columns = listFooterColumns()\n return columns.find((col) => col.contains(anchor)) ?? null\n}\n\nexport function getFooterOrderFromDom(): string[][] {\n return listFooterColumns().map((col) =>\n listFooterLinksInColumn(col)\n .map((el) => el.getAttribute('data-ohw-href-key'))\n .filter((key): key is string => Boolean(key))\n )\n}\n\nfunction findFooterLinkByKey(hrefKey: string): HTMLElement | null {\n return document.querySelector<HTMLElement>(\n `footer [data-ohw-href-key=\"${CSS.escape(hrefKey)}\"]`\n )\n}\n\nfunction syncFooterColumnIndices(columns: HTMLElement[]) {\n columns.forEach((col, index) => {\n const next = String(index)\n if (col.getAttribute('data-ohw-footer-col') !== next) {\n col.setAttribute('data-ohw-footer-col', next)\n }\n })\n}\n\nfunction appendChildIfNeeded(parent: HTMLElement, child: HTMLElement) {\n if (parent.lastElementChild !== child) {\n parent.appendChild(child)\n }\n}\n\n/** Re-order column shells + links to match `order`. */\nexport function applyFooterOrder(order: string[][]) {\n const container = getFooterLinksContainer()\n if (!container) return\n\n const columns = listFooterColumns()\n if (columns.length === 0) return\n\n const currentOrder = getFooterOrderFromDom()\n if (ordersEqual(order, currentOrder)) {\n syncFooterColumnIndices(columns)\n return\n }\n\n // Resolve each order slot to a column shell (by current owner of its links), then\n // physically reorder shells so headings/structure move with the column.\n const used = new Set<HTMLElement>()\n const orderedCols: HTMLElement[] = []\n for (const colOrder of order) {\n let matched: HTMLElement | null = null\n for (const hrefKey of colOrder) {\n const link = findFooterLinkByKey(hrefKey)\n if (!link) continue\n const owner = findFooterColumnForLink(link)\n if (owner && !used.has(owner)) {\n matched = owner\n break\n }\n }\n if (!matched) {\n matched = columns.find((col) => !used.has(col)) ?? null\n }\n if (matched) {\n used.add(matched)\n orderedCols.push(matched)\n }\n }\n for (const col of columns) {\n if (!used.has(col)) orderedCols.push(col)\n }\n\n for (const col of orderedCols) {\n appendChildIfNeeded(container, col)\n }\n\n const freshColumns = listFooterColumns()\n syncFooterColumnIndices(freshColumns)\n\n // Successive appendChild builds the correct order; insertBefore(next) breaks\n // end→front and other permutations.\n for (let c = 0; c < order.length; c++) {\n const col = freshColumns[c]\n if (!col) continue\n const colOrder = order[c]!\n for (const hrefKey of colOrder) {\n const el = findFooterLinkByKey(hrefKey)\n if (!el) continue\n if (el.parentElement !== col || col.lastElementChild !== el) {\n col.appendChild(el)\n }\n }\n }\n}\n\nfunction ordersEqual(a: string[][], b: string[][]): boolean {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n const left = a[i]!\n const right = b[i]!\n if (left.length !== right.length) return false\n for (let j = 0; j < left.length; j++) {\n if (left[j] !== right[j]) return false\n }\n }\n return true\n}\n\nexport function planFooterLinkMove(\n hrefKey: string,\n targetColIndex: number,\n insertIndex: number\n): string[][] | null {\n const order = getFooterOrderFromDom()\n if (targetColIndex < 0 || targetColIndex >= order.length) return null\n\n let fromCol = -1\n let fromIdx = -1\n for (let c = 0; c < order.length; c++) {\n const idx = order[c]!.indexOf(hrefKey)\n if (idx >= 0) {\n fromCol = c\n fromIdx = idx\n break\n }\n }\n if (fromCol < 0) return null\n\n const next = order.map((col) => [...col])\n next[fromCol]!.splice(fromIdx, 1)\n\n let adjusted = insertIndex\n if (fromCol === targetColIndex && fromIdx < insertIndex) adjusted -= 1\n adjusted = Math.max(0, Math.min(adjusted, next[targetColIndex]!.length))\n next[targetColIndex]!.splice(adjusted, 0, hrefKey)\n\n if (ordersEqual(next, order)) return null\n return next\n}\n\n/**\n * Move a footer link to `targetColIndex` at `insertIndex` (index in the array\n * **before** removal adjustment — same convention as nav take→insert).\n * Returns new order, or null if no-op / invalid.\n */\nexport function moveFooterLink(\n hrefKey: string,\n targetColIndex: number,\n insertIndex: number\n): string[][] | null {\n const next = planFooterLinkMove(hrefKey, targetColIndex, insertIndex)\n if (!next) return null\n applyFooterOrder(next)\n return next\n}\n\nexport function planFooterColumnMove(fromIndex: number, toIndex: number): string[][] | null {\n const order = getFooterOrderFromDom()\n const columns = listFooterColumns()\n if (fromIndex < 0 || fromIndex >= columns.length || toIndex < 0 || toIndex > columns.length) {\n return null\n }\n if (toIndex === fromIndex || toIndex === fromIndex + 1) return null\n\n const nextOrder = order.map((col) => [...col])\n const [movedOrder] = nextOrder.splice(fromIndex, 1)\n if (!movedOrder) return null\n\n let adjusted = toIndex\n if (fromIndex < toIndex) adjusted -= 1\n adjusted = Math.max(0, Math.min(adjusted, nextOrder.length))\n nextOrder.splice(adjusted, 0, movedOrder)\n\n if (ordersEqual(nextOrder, order)) return null\n return nextOrder\n}\n\n/**\n * Move a footer column from `fromIndex` to `toIndex` (insertion index before removal adjust).\n * Links inside the column are preserved.\n */\nexport function moveFooterColumn(fromIndex: number, toIndex: number): string[][] | null {\n const nextOrder = planFooterColumnMove(fromIndex, toIndex)\n if (!nextOrder) return null\n\n const columns = listFooterColumns()\n const container = getFooterLinksContainer()\n if (!container) return null\n\n const fromIndexActual = (() => {\n // Re-derive fromIndex from current DOM vs planned order isn't needed —\n // plan already validated against current DOM.\n return fromIndex\n })()\n\n let adjusted = toIndex\n if (fromIndexActual < toIndex) adjusted -= 1\n adjusted = Math.max(0, Math.min(adjusted, columns.length - 1))\n\n const nextCols = [...columns]\n const [movedCol] = nextCols.splice(fromIndexActual, 1)\n if (!movedCol) return null\n nextCols.splice(adjusted, 0, movedCol)\n\n for (const col of nextCols) container.appendChild(col)\n syncFooterColumnIndices(nextCols)\n applyFooterOrder(nextOrder)\n return nextOrder\n}\n\nfunction parseFooterOrder(content: Record<string, string>): string[][] | null {\n const raw = content[FOOTER_ORDER_KEY]\n if (!raw) return null\n try {\n const parsed = JSON.parse(raw) as unknown\n if (!Array.isArray(parsed)) return null\n return parsed\n .filter((col): col is unknown[] => Array.isArray(col))\n .map((col) => col.filter((key): key is string => typeof key === 'string' && key.length > 0))\n } catch {\n return null\n }\n}\n\nconst FOOTER_HEADING_RE = /^footer-(\\d+)-heading$/\nconst FOOTER_LABEL_RE = /^footer-(\\d+)-(\\d+)-label$/\n\nexport const DEFAULT_FOOTER_COLUMN_HEADING = 'New'\nexport const DEFAULT_FOOTER_COLUMN_LINK_LABEL = 'New link'\n/** Empty = no destination (user can Edit link later). */\nexport const DEFAULT_FOOTER_COLUMN_LINK_HREF = ''\n\nexport function isFooterLinksContainer(el: HTMLElement): boolean {\n return (\n el.hasAttribute('data-ohw-footer-links') ||\n el.classList.contains('rb-footer-links')\n )\n}\n\nfunction getFooterColumnIndicesInDom(): number[] {\n const indices = new Set<number>()\n for (const col of listFooterColumns()) {\n const attr = col.getAttribute('data-ohw-footer-col')\n if (attr != null) {\n const n = parseInt(attr, 10)\n if (Number.isFinite(n)) indices.add(n)\n }\n for (const link of listFooterLinksInColumn(col)) {\n const parsed = parseFooterHrefKey(link.getAttribute('data-ohw-href-key'))\n if (parsed) indices.add(parsed.col)\n }\n const heading = col.querySelector<HTMLElement>('[data-ohw-key^=\"footer-\"][data-ohw-key$=\"-heading\"]')\n const headingKey = heading?.getAttribute('data-ohw-key')\n if (headingKey) {\n const match = headingKey.match(FOOTER_HEADING_RE)\n if (match) indices.add(parseInt(match[1]!, 10))\n }\n }\n return [...indices].sort((a, b) => a - b)\n}\n\nexport function getNextFooterColumnIndex(): number {\n const indices = getFooterColumnIndicesInDom()\n if (indices.length === 0) return 0\n return Math.max(...indices) + 1\n}\n\nexport function canAddFooterColumn(): boolean {\n return listFooterColumns().length < MAX_FOOTER_COLUMNS\n}\n\nfunction buildFooterHeading(colIndex: number, text: string): HTMLElement {\n const heading = document.createElement('p')\n heading.setAttribute('data-ohw-editable', 'text')\n heading.setAttribute('data-ohw-key', `footer-${colIndex}-heading`)\n heading.textContent = text\n // Prototype / pinned design: heading above links. Token first, hex fallback.\n heading.style.cssText = [\n 'color: var(--espresso, #3d312b)',\n 'font-size: 14px',\n 'font-weight: 800',\n 'opacity: 0.82',\n 'margin: 0 0 6px',\n 'padding: 0',\n 'line-height: 1.2',\n ].join(';')\n return heading\n}\n\nfunction buildFooterLink(\n colIndex: number,\n itemIndex: number,\n href: string,\n label: string,\n template: HTMLElement | null\n): HTMLAnchorElement {\n const anchor = cloneFooterLinkShell(template)\n anchor.setAttribute('href', href)\n anchor.setAttribute('data-ohw-href-key', `footer-${colIndex}-${itemIndex}-href`)\n\n const span = document.createElement('span')\n span.setAttribute('data-ohw-editable', 'text')\n span.setAttribute('data-ohw-key', `footer-${colIndex}-${itemIndex}-label`)\n span.textContent = label\n anchor.appendChild(span)\n return anchor\n}\n\nfunction footerColumnExistsInDom(colIndex: number): boolean {\n return (\n document.querySelector(`[data-ohw-footer-col=\"${colIndex}\"]`) !== null ||\n document.querySelector(`[data-ohw-href-key^=\"footer-${colIndex}-\"]`) !== null ||\n document.querySelector(`[data-ohw-key=\"footer-${colIndex}-heading\"]`) !== null\n )\n}\n\nfunction getFooterLinkTemplate(): HTMLElement | null {\n for (const col of listFooterColumns()) {\n const link = listFooterLinksInColumn(col)[0]\n if (link) return link\n }\n return null\n}\n\nfunction getFooterColumnTemplate(): HTMLElement | null {\n return listFooterColumns()[0] ?? null\n}\n\ntype FooterColumnItemSeed = { href: string; label: string }\n\nfunction insertFooterColumnDom(\n colIndex: number,\n heading: string,\n items: FooterColumnItemSeed[]\n): { column: HTMLElement; firstLink: HTMLAnchorElement | null } | null {\n const container = getFooterLinksContainer()\n if (!container) return null\n\n const colTemplate = getFooterColumnTemplate()\n const linkTemplate = getFooterLinkTemplate()\n const column = document.createElement('div')\n if (colTemplate?.className) column.className = colTemplate.className\n else column.className = 'rb-footer-link-col'\n column.setAttribute('data-ohw-footer-col', String(colIndex))\n if (colTemplate) {\n // Keep layout spacing from template without copying children.\n const gap = getComputedStyle(colTemplate).gap\n if (gap && gap !== 'normal') column.style.gap = gap\n column.style.display = getComputedStyle(colTemplate).display || 'flex'\n column.style.flexDirection = 'column'\n }\n\n column.appendChild(buildFooterHeading(colIndex, heading))\n\n let firstLink: HTMLAnchorElement | null = null\n items.forEach((item, itemIndex) => {\n const link = buildFooterLink(colIndex, itemIndex, item.href, item.label, linkTemplate)\n column.appendChild(link)\n if (!firstLink) firstLink = link\n })\n\n container.appendChild(column)\n return { column, firstLink }\n}\n\nexport type FooterColumnInsertResult = {\n column: HTMLElement\n firstLink: HTMLAnchorElement\n colIndex: number\n headingKey: string\n hrefKey: string\n labelKey: string\n heading: string\n label: string\n href: string\n order: string[][]\n}\n\n/** Append a footer column: heading \"New\" + first link \"New link\" (no href). */\nexport function insertFooterColumn(\n heading = DEFAULT_FOOTER_COLUMN_HEADING,\n linkLabel = DEFAULT_FOOTER_COLUMN_LINK_LABEL,\n linkHref = DEFAULT_FOOTER_COLUMN_LINK_HREF\n): FooterColumnInsertResult {\n if (!canAddFooterColumn()) {\n throw new Error(`Footer column limit reached (${MAX_FOOTER_COLUMNS})`)\n }\n const colIndex = getNextFooterColumnIndex()\n const inserted = insertFooterColumnDom(colIndex, heading, [{ href: linkHref, label: linkLabel }])\n if (!inserted?.firstLink) throw new Error('Failed to insert footer column')\n\n syncFooterColumnIndices(listFooterColumns())\n\n return {\n column: inserted.column,\n firstLink: inserted.firstLink,\n colIndex,\n headingKey: `footer-${colIndex}-heading`,\n hrefKey: `footer-${colIndex}-0-href`,\n labelKey: `footer-${colIndex}-0-label`,\n heading,\n label: linkLabel,\n href: linkHref,\n order: getFooterOrderFromDom(),\n }\n}\n\nexport function collectFooterColumnIndicesFromContent(content: Record<string, string>): number[] {\n const indices = new Set<number>()\n for (const key of Object.keys(content)) {\n const href = parseFooterHrefKey(key)\n if (href) indices.add(href.col)\n const heading = key.match(FOOTER_HEADING_RE)\n if (heading) indices.add(parseInt(heading[1]!, 10))\n const label = key.match(FOOTER_LABEL_RE)\n if (label) indices.add(parseInt(label[1]!, 10))\n }\n const order = parseFooterOrder(content)\n if (order) {\n for (const col of order) {\n for (const hrefKey of col) {\n const parsed = parseFooterHrefKey(hrefKey)\n if (parsed) indices.add(parsed.col)\n }\n }\n }\n return [...indices].sort((a, b) => a - b)\n}\n\nfunction collectFooterItemsForColumn(\n content: Record<string, string>,\n colIndex: number\n): FooterColumnItemSeed[] {\n const itemIndices = new Set<number>()\n for (const key of Object.keys(content)) {\n const href = parseFooterHrefKey(key)\n if (href?.col === colIndex) itemIndices.add(href.item)\n const label = key.match(FOOTER_LABEL_RE)\n if (label && parseInt(label[1]!, 10) === colIndex) {\n itemIndices.add(parseInt(label[2]!, 10))\n }\n }\n const sorted = [...itemIndices].sort((a, b) => a - b)\n if (sorted.length === 0) {\n return [\n {\n href: content[`footer-${colIndex}-0-href`] ?? DEFAULT_FOOTER_COLUMN_LINK_HREF,\n label: content[`footer-${colIndex}-0-label`] ?? DEFAULT_FOOTER_COLUMN_LINK_LABEL,\n },\n ]\n }\n return sorted.map((itemIndex) => ({\n href: content[`footer-${colIndex}-${itemIndex}-href`] ?? DEFAULT_FOOTER_COLUMN_LINK_HREF,\n label: content[`footer-${colIndex}-${itemIndex}-label`] ?? DEFAULT_FOOTER_COLUMN_LINK_LABEL,\n }))\n}\n\n/** Re-create editor-added footer columns wiped by React remounts (parallel to navbar). */\nexport function reconcileFooterColumnsFromContent(content: Record<string, string>) {\n const indices = collectFooterColumnIndicesFromContent(content)\n // Only inject columns that are not already in the static template DOM.\n // Static template columns use dense 0..n-1 indices — skip those that exist.\n for (const colIndex of indices) {\n if (footerColumnExistsInDom(colIndex)) continue\n const heading =\n content[`footer-${colIndex}-heading`] ?? DEFAULT_FOOTER_COLUMN_HEADING\n const items = collectFooterItemsForColumn(content, colIndex)\n // Skip empty seeds with no persisted payload\n const hasPayload =\n Boolean(content[`footer-${colIndex}-heading`]) ||\n items.some(\n (_, i) =>\n content[`footer-${colIndex}-${i}-href`] !== undefined ||\n content[`footer-${colIndex}-${i}-label`] !== undefined\n ) ||\n (parseFooterOrder(content)?.some((col) =>\n col.some((k) => parseFooterHrefKey(k)?.col === colIndex)\n ) ??\n false)\n if (!hasPayload) continue\n insertFooterColumnDom(colIndex, heading, items)\n }\n}\n\nexport function reconcileFooterOrderFromContent(content: Record<string, string>) {\n reconcileFooterColumnsFromContent(content)\n const order = parseFooterOrder(content)\n if (!order?.length) return\n const current = getFooterOrderFromDom()\n if (ordersEqual(order, current)) {\n syncFooterColumnIndices(listFooterColumns())\n return\n }\n applyFooterOrder(order)\n}\n\n/**\n * Select `[data-ohw-footer-links]` when clicking gaps between columns\n * (not a link / not column chrome that should select a column).\n */\nexport function resolveFooterLinksContainerSelectionTarget(\n target: HTMLElement,\n clientX: number,\n clientY: number,\n isPointOverItem: (container: HTMLElement, x: number, y: number) => boolean\n): HTMLElement | null {\n const container = getFooterLinksContainer()\n if (!container) return null\n\n const inContainer =\n target === container ||\n (container.contains(target) && Boolean(target.closest('[data-ohw-footer-links], .rb-footer-links')))\n if (!inContainer && target !== container) {\n const r = container.getBoundingClientRect()\n const over =\n clientX >= r.left && clientX <= r.right && clientY >= r.top && clientY <= r.bottom\n if (!over) return null\n }\n\n // Prefer column / item selection when pointer is over a link.\n if (isPointOverItem(container, clientX, clientY)) return null\n\n const column =\n target.closest<HTMLElement>('[data-ohw-footer-col], [data-ohw-footer-column]') ?? null\n if (column && container.contains(column)) {\n // Empty column padding → column frame (handled elsewhere); only gaps hit the container.\n if (target === column || column.contains(target)) return null\n }\n\n if (target === container || container.contains(target) || inContainer) {\n // Gap between columns: event target is often the links container itself.\n if (target === container || isFooterLinksContainer(target)) return container\n if (!column) return container\n }\n\n return null\n}\n\nexport type FooterDropSlot = {\n /** Insertion index among current siblings in the target column / among columns. */\n insertIndex: number\n columnIndex: number\n /** Fixed-position placement for DropIndicator. */\n left: number\n top: number\n width: number\n height: number\n direction: 'horizontal' | 'vertical'\n}\n\n/** True when links sit side-by-side in a row rather than stacked vertically. */\nfunction isRowLayoutColumn(links: HTMLElement[]): boolean {\n if (links.length < 2) return false\n const firstTop = links[0]!.getBoundingClientRect().top\n return links.every((link) => Math.abs(link.getBoundingClientRect().top - firstTop) < 4)\n}\n\n/** Build drop slots for links inside a column (horizontal bars between vertical items). */\nexport function buildLinkDropSlots(column: HTMLElement, columnIndex: number): FooterDropSlot[] {\n const links = listFooterLinksInColumn(column)\n const colRect = column.getBoundingClientRect()\n const slots: FooterDropSlot[] = []\n const barThickness = 3\n\n if (links.length === 0) {\n slots.push({\n insertIndex: 0,\n columnIndex,\n left: colRect.left,\n top: colRect.top + colRect.height / 2 - barThickness / 2,\n width: colRect.width,\n height: barThickness,\n direction: 'horizontal',\n })\n return slots\n }\n\n if (isRowLayoutColumn(links)) {\n for (let i = 0; i <= links.length; i++) {\n let left: number\n if (i === 0) {\n left = links[0]!.getBoundingClientRect().left - barThickness / 2\n } else if (i === links.length) {\n const last = links[links.length - 1]!.getBoundingClientRect()\n left = last.right - barThickness / 2\n } else {\n const prev = links[i - 1]!.getBoundingClientRect()\n const next = links[i]!.getBoundingClientRect()\n left = (prev.right + next.left) / 2 - barThickness / 2\n }\n\n const heightRef =\n i === 0\n ? links[0]!.getBoundingClientRect()\n : i === links.length\n ? links[links.length - 1]!.getBoundingClientRect()\n : links[i]!.getBoundingClientRect()\n\n slots.push({\n insertIndex: i,\n columnIndex,\n left,\n top: heightRef.top,\n width: barThickness,\n height: Math.max(heightRef.height, colRect.height * 0.8),\n direction: 'vertical',\n })\n }\n return slots\n }\n\n for (let i = 0; i <= links.length; i++) {\n let top: number\n if (i === 0) {\n top = links[0]!.getBoundingClientRect().top - barThickness / 2\n } else if (i === links.length) {\n const last = links[links.length - 1]!.getBoundingClientRect()\n top = last.bottom - barThickness / 2\n } else {\n const prev = links[i - 1]!.getBoundingClientRect()\n const next = links[i]!.getBoundingClientRect()\n top = (prev.bottom + next.top) / 2 - barThickness / 2\n }\n\n const widthRef =\n i === 0\n ? links[0]!.getBoundingClientRect()\n : i === links.length\n ? links[links.length - 1]!.getBoundingClientRect()\n : links[i]!.getBoundingClientRect()\n\n slots.push({\n insertIndex: i,\n columnIndex,\n left: widthRef.left,\n top,\n width: Math.max(widthRef.width, colRect.width * 0.8),\n height: barThickness,\n direction: 'horizontal',\n })\n }\n\n return slots\n}\n\n/** Build drop slots for columns (vertical bars between horizontal columns). */\nexport function buildColumnDropSlots(): FooterDropSlot[] {\n const columns = listFooterColumns()\n const slots: FooterDropSlot[] = []\n const barThickness = 3\n\n if (columns.length === 0) return slots\n\n for (let i = 0; i <= columns.length; i++) {\n let left: number\n let height: number\n let top: number\n\n if (i === 0) {\n const first = columns[0]!.getBoundingClientRect()\n left = first.left - barThickness / 2\n top = first.top\n height = first.height\n } else if (i === columns.length) {\n const last = columns[columns.length - 1]!.getBoundingClientRect()\n left = last.right - barThickness / 2\n top = last.top\n height = last.height\n } else {\n const prev = columns[i - 1]!.getBoundingClientRect()\n const next = columns[i]!.getBoundingClientRect()\n left = (prev.right + next.left) / 2 - barThickness / 2\n top = Math.min(prev.top, next.top)\n height = Math.max(prev.bottom, next.bottom) - top\n }\n\n slots.push({\n insertIndex: i,\n columnIndex: i,\n left,\n top,\n width: barThickness,\n height: Math.max(height, 24),\n direction: 'vertical',\n })\n }\n\n return slots\n}\n\nexport function hitTestLinkDropSlot(\n clientX: number,\n clientY: number,\n draggedHrefKey: string\n): FooterDropSlot | null {\n const columns = listFooterColumns()\n let best: { slot: FooterDropSlot; dist: number } | null = null\n\n for (let c = 0; c < columns.length; c++) {\n const col = columns[c]!\n const colRect = col.getBoundingClientRect()\n // Prefer column under pointer; still allow near misses within padding\n const inColX = clientX >= colRect.left - 24 && clientX <= colRect.right + 24\n if (!inColX) continue\n\n const slots = buildLinkDropSlots(col, c).filter((slot) => {\n // Skip slots that would no-op (before/after self only)\n const links = listFooterLinksInColumn(col)\n const fromIdx = links.findIndex(\n (el) => el.getAttribute('data-ohw-href-key') === draggedHrefKey\n )\n if (fromIdx < 0) return true\n // same column: insertIndex === fromIdx or fromIdx+1 is no-op\n if (c === findColumnIndexForKey(draggedHrefKey) && (slot.insertIndex === fromIdx || slot.insertIndex === fromIdx + 1)) {\n return true // still show indicator, moveFooterLink will no-op\n }\n return true\n })\n\n for (const slot of slots) {\n const dist =\n slot.direction === 'vertical'\n ? Math.abs(clientX - (slot.left + slot.width / 2))\n : Math.abs(clientY - (slot.top + slot.height / 2))\n if (!best || dist < best.dist) best = { slot, dist }\n }\n\n }\n\n return best?.slot ?? null\n}\n\nfunction findColumnIndexForKey(hrefKey: string): number {\n const order = getFooterOrderFromDom()\n for (let c = 0; c < order.length; c++) {\n if (order[c]!.includes(hrefKey)) return c\n }\n return -1\n}\n\nexport function hitTestColumnDropSlot(clientX: number, _clientY: number): FooterDropSlot | null {\n const slots = buildColumnDropSlots()\n let best: { slot: FooterDropSlot; dist: number } | null = null\n for (const slot of slots) {\n const cx = slot.left + slot.width / 2\n const dist = Math.abs(clientX - cx)\n if (!best || dist < best.dist) best = { slot, dist }\n }\n return best?.slot ?? null\n}\n\nfunction getLinkHref(el: HTMLElement): string {\n const key = el.getAttribute('data-ohw-href-key')\n if (key) {\n const stored = getStoredLinkHref(key)\n if (stored !== undefined) return stored\n }\n return el.getAttribute('href') ?? ''\n}\n\nfunction getNextFooterItemIndex(col: number): number {\n let max = -1\n for (const el of document.querySelectorAll<HTMLElement>('footer [data-ohw-href-key]')) {\n const parsed = parseFooterHrefKey(el.getAttribute('data-ohw-href-key'))\n if (!parsed || parsed.col !== col) continue\n if (parsed.item > max) max = parsed.item\n }\n return max + 1\n}\n\nfunction cloneFooterLinkShell(template: HTMLElement | null): HTMLAnchorElement {\n const anchor = document.createElement('a')\n if (template) {\n anchor.style.cssText = template.style.cssText\n if (template.className) anchor.className = template.className\n }\n anchor.style.cursor = 'pointer'\n anchor.style.textDecoration = 'none'\n return anchor\n}\n\nexport type FooterItemInsertResult = {\n anchor: HTMLElement\n col: number\n item: number\n hrefKey: string\n labelKey: string\n href: string\n label: string\n order: string[][]\n}\n\n/** Insert a footer link into `column` after `afterAnchor` (or at end). */\nexport function insertFooterItem(\n column: HTMLElement,\n href: string,\n label: string,\n afterAnchor: HTMLElement | null = null\n): FooterItemInsertResult {\n const columns = listFooterColumns()\n const colIndex = columns.indexOf(column)\n if (colIndex < 0) throw new Error('Footer column not found')\n\n const item = getNextFooterItemIndex(colIndex)\n const hrefKey = `footer-${colIndex}-${item}-href`\n const labelKey = `footer-${colIndex}-${item}-label`\n\n const template = listFooterLinksInColumn(column)[0] ?? null\n const anchor = cloneFooterLinkShell(template)\n anchor.href = href\n anchor.setAttribute('data-ohw-href-key', hrefKey)\n\n const span = document.createElement('span')\n span.setAttribute('data-ohw-editable', 'text')\n span.setAttribute('data-ohw-key', labelKey)\n span.textContent = label\n anchor.appendChild(span)\n\n if (afterAnchor && afterAnchor.parentElement === column) {\n afterAnchor.insertAdjacentElement('afterend', anchor)\n } else {\n column.appendChild(anchor)\n }\n\n const order = getFooterOrderFromDom()\n applyFooterOrder(order)\n\n return {\n anchor,\n col: colIndex,\n item,\n hrefKey,\n labelKey,\n href,\n label,\n order,\n }\n}\n\n/** Clone a footer link as the next sibling in the same column. */\nexport function duplicateFooterItem(sourceAnchor: HTMLElement): FooterItemInsertResult | null {\n if (!isFooterLinkAnchor(sourceAnchor)) return null\n const column = findFooterColumnForLink(sourceAnchor)\n if (!column) return null\n\n const href = getLinkHref(sourceAnchor)\n const labelEl = sourceAnchor.querySelector<HTMLElement>('[data-ohw-editable=\"text\"]')\n const label = (labelEl?.textContent ?? '').trim() || 'Untitled'\n\n return insertFooterItem(column, href || '/', label, sourceAnchor)\n}\n","import { setStoredLinkHref, enforceLinkHrefs } from '../linkHrefStore'\nimport {\n FOOTER_ORDER_KEY,\n MAX_FOOTER_COLUMNS,\n canAddFooterColumn,\n insertFooterColumn,\n type FooterColumnInsertResult,\n} from './footer-items'\n\ntype PersistDeps = {\n postToParent: (data: Record<string, unknown>) => void\n}\n\nexport function buildFooterColumnEditContentPatch(\n result: FooterColumnInsertResult\n): Record<string, string> {\n return {\n [result.headingKey]: result.heading,\n [result.hrefKey]: result.href,\n [result.labelKey]: result.label,\n [FOOTER_ORDER_KEY]: JSON.stringify(result.order),\n }\n}\n\n/** Insert default footer column (\"New\" / \"New link\") and persist to parent. */\nexport function addFooterColumnWithPersist({\n postToParent,\n}: PersistDeps): FooterColumnInsertResult | null {\n if (!canAddFooterColumn()) {\n postToParent({\n type: 'ow:toast',\n title: `Maximum ${MAX_FOOTER_COLUMNS} columns`,\n toastType: 'error',\n })\n return null\n }\n\n const result = insertFooterColumn()\n const patch = buildFooterColumnEditContentPatch(result)\n\n setStoredLinkHref(result.hrefKey, result.href)\n\n postToParent({\n type: 'ow:change',\n nodes: Object.entries(patch).map(([key, text]) => ({ key, text })),\n })\n postToParent({ type: 'ow:toast', title: 'Item added', toastType: 'success' })\n enforceLinkHrefs()\n\n return result\n}\n","/** Shared DOM flags / helpers for footer + navbar press-to-drag (OHH-435 / OHH-436). */\n\n/** Anchors are draggable by default — that steals mousedown and blocks text edit clicks. */\nexport function disableNativeHrefDrag(el: HTMLElement) {\n if (el.draggable) el.draggable = false\n if (el.getAttribute('draggable') !== 'false') {\n el.setAttribute('draggable', 'false')\n }\n}\n\nexport function clearTextSelection() {\n const sel = window.getSelection()\n if (sel && !sel.isCollapsed) sel.removeAllRanges()\n}\n\nexport function armItemPressDrag() {\n document.documentElement.setAttribute('data-ohw-footer-press-drag', '')\n}\n\nexport function lockItemDuringDrag() {\n document.documentElement.removeAttribute('data-ohw-footer-press-drag')\n document.documentElement.setAttribute('data-ohw-item-dragging', '')\n clearTextSelection()\n}\n\nexport function unlockItemDragInteraction() {\n // This also runs on routine effect cleanup (component re-render, not just a real drag\n // ending) — only clear the selection when a drag actually locked it, or every cleanup\n // wipes whatever text selection the user happens to have at that moment (e.g. after\n // applying a toolbar format), regardless of the footer/nav drag feature.\n const wasDragging = document.documentElement.hasAttribute('data-ohw-item-dragging')\n document.documentElement.removeAttribute('data-ohw-footer-press-drag')\n document.documentElement.removeAttribute('data-ohw-item-dragging')\n if (wasDragging) clearTextSelection()\n}\n\n/** @deprecated Prefer armItemPressDrag — alias kept for footer call sites. */\nexport const armFooterPressDrag = armItemPressDrag\n/** @deprecated Prefer lockItemDuringDrag */\nexport const lockFooterDuringDrag = lockItemDuringDrag\n/** @deprecated Prefer unlockItemDragInteraction */\nexport const unlockFooterDragInteraction = unlockItemDragInteraction\n","/** Navbar drop slots + hit-testing — OHH-435 (mirrors footer-items drop helpers). */\n\nimport {\n getNavbarDesktopContainer,\n getNavbarDrawerContainer,\n isNavbarHrefKey,\n listNavbarItems,\n} from './nav-items'\n\nexport type NavDropSlot = {\n /** Insertion index among siblings under parentId (before removal adjust). */\n insertIndex: number\n /** null = top-level root list */\n parentId: string | null\n left: number\n top: number\n width: number\n height: number\n direction: 'horizontal' | 'vertical'\n}\n\nfunction listReorderableNavItems(): HTMLElement[] {\n return listNavbarItems().filter((el) => {\n const key = el.getAttribute('data-ohw-href-key')\n return isNavbarHrefKey(key) && !el.closest('[data-ohw-nav-children]')\n })\n}\n\nfunction listNavChildren(parentHrefKey: string): HTMLElement[] {\n const items = listNavbarItems()\n const parent = items.find((el) => el.getAttribute('data-ohw-href-key') === parentHrefKey)\n if (!parent) return []\n const group = parent.closest<HTMLElement>('[data-ohw-nav-group]')\n const childrenRoot = group?.querySelector<HTMLElement>(':scope > [data-ohw-nav-children]')\n if (!childrenRoot) return []\n return Array.from(childrenRoot.querySelectorAll<HTMLElement>(':scope > [data-ohw-href-key]')).filter(\n (el) => isNavbarHrefKey(el.getAttribute('data-ohw-href-key'))\n )\n}\n\nfunction activeNavListContainer(): HTMLElement | null {\n const desktop = getNavbarDesktopContainer()\n if (desktop && desktop.getClientRects().length > 0) {\n const style = window.getComputedStyle(desktop)\n if (style.display !== 'none' && style.visibility !== 'hidden') return desktop\n }\n return getNavbarDrawerContainer()\n}\n\n/** Vertical bars between horizontal top-level nav items. */\nexport function buildRootNavDropSlots(): NavDropSlot[] {\n const items = listReorderableNavItems()\n const slots: NavDropSlot[] = []\n const barThickness = 3\n\n if (items.length === 0) {\n const container = activeNavListContainer()\n if (!container) return slots\n const rect = container.getBoundingClientRect()\n slots.push({\n insertIndex: 0,\n parentId: null,\n left: rect.left + rect.width / 2 - barThickness / 2,\n top: rect.top,\n width: barThickness,\n height: Math.max(rect.height, 24),\n direction: 'vertical',\n })\n return slots\n }\n\n // Middle slots sit at half the gap between neighbors. Mirror that offset for the\n // first/last ends so terminal indicators aren't flush against the item chrome.\n const edgeGap = (() => {\n if (items.length < 2) return 32\n const a = items[0]!.getBoundingClientRect()\n const b = items[1]!.getBoundingClientRect()\n return Math.max(0, b.left - a.right)\n })()\n\n for (let i = 0; i <= items.length; i++) {\n let left: number\n let top: number\n let height: number\n\n if (i === 0) {\n const first = items[0]!.getBoundingClientRect()\n left = first.left - edgeGap / 2 - barThickness / 2\n top = first.top\n height = first.height\n } else if (i === items.length) {\n const last = items[items.length - 1]!.getBoundingClientRect()\n const lastGap =\n items.length >= 2\n ? Math.max(\n 0,\n last.left - items[items.length - 2]!.getBoundingClientRect().right\n )\n : edgeGap\n left = last.right + lastGap / 2 - barThickness / 2\n top = last.top\n height = last.height\n } else {\n const prev = items[i - 1]!.getBoundingClientRect()\n const next = items[i]!.getBoundingClientRect()\n left = (prev.right + next.left) / 2 - barThickness / 2\n top = Math.min(prev.top, next.top)\n height = Math.max(prev.bottom, next.bottom) - top\n }\n\n slots.push({\n insertIndex: i,\n parentId: null,\n left,\n top,\n width: barThickness,\n height: Math.max(height, 24),\n direction: 'vertical',\n })\n }\n\n return slots\n}\n\n/** Horizontal bars between vertical dropdown children (when group markup exists). */\nexport function buildChildNavDropSlots(parentHrefKey: string): NavDropSlot[] {\n const children = listNavChildren(parentHrefKey)\n const slots: NavDropSlot[] = []\n const barThickness = 3\n if (children.length === 0) return slots\n\n const edgeGap = (() => {\n if (children.length < 2) return 16\n const a = children[0]!.getBoundingClientRect()\n const b = children[1]!.getBoundingClientRect()\n return Math.max(0, b.top - a.bottom)\n })()\n\n for (let i = 0; i <= children.length; i++) {\n let top: number\n let width: number\n let left: number\n\n if (i === 0) {\n const first = children[0]!.getBoundingClientRect()\n top = first.top - edgeGap / 2 - barThickness / 2\n left = first.left\n width = first.width\n } else if (i === children.length) {\n const last = children[children.length - 1]!.getBoundingClientRect()\n const lastGap =\n children.length >= 2\n ? Math.max(\n 0,\n last.top - children[children.length - 2]!.getBoundingClientRect().bottom\n )\n : edgeGap\n top = last.bottom + lastGap / 2 - barThickness / 2\n left = last.left\n width = last.width\n } else {\n const prev = children[i - 1]!.getBoundingClientRect()\n const next = children[i]!.getBoundingClientRect()\n top = (prev.bottom + next.top) / 2 - barThickness / 2\n left = Math.min(prev.left, next.left)\n width = Math.max(prev.right, next.right) - left\n }\n\n slots.push({\n insertIndex: i,\n parentId: parentHrefKey,\n left,\n top,\n width: Math.max(width, 40),\n height: barThickness,\n direction: 'horizontal',\n })\n }\n\n return slots\n}\n\nexport function buildAllNavDropSlots(draggedHrefKey: string): NavDropSlot[] {\n const slots = [...buildRootNavDropSlots()]\n\n // Reparent / reorder within open dropdowns (OHH-507 markup).\n for (const item of listReorderableNavItems()) {\n const key = item.getAttribute('data-ohw-href-key')\n if (!key || key === draggedHrefKey) continue\n const group = item.closest<HTMLElement>('[data-ohw-nav-group]')\n if (!group?.querySelector(':scope > [data-ohw-nav-children]')) continue\n slots.push(...buildChildNavDropSlots(key))\n }\n\n // If dragging a child, also expose its current parent's child slots.\n const dragged = listNavbarItems().find((el) => el.getAttribute('data-ohw-href-key') === draggedHrefKey)\n const parentGroup = dragged?.closest('[data-ohw-nav-children]')?.closest<HTMLElement>('[data-ohw-nav-group]')\n const parentTrigger = parentGroup?.querySelector<HTMLElement>(':scope > [data-ohw-href-key]')\n const parentKey = parentTrigger?.getAttribute('data-ohw-href-key')\n if (parentKey && isNavbarHrefKey(parentKey)) {\n const existing = slots.some((s) => s.parentId === parentKey)\n if (!existing) slots.push(...buildChildNavDropSlots(parentKey))\n }\n\n return slots\n}\n\nexport function hitTestNavDropSlot(\n clientX: number,\n clientY: number,\n draggedHrefKey: string\n): NavDropSlot | null {\n const slots = buildAllNavDropSlots(draggedHrefKey)\n let best: { slot: NavDropSlot; dist: number } | null = null\n\n for (const slot of slots) {\n const cx = slot.left + slot.width / 2\n const cy = slot.top + slot.height / 2\n const dist =\n slot.direction === 'vertical'\n ? Math.abs(clientX - cx) + Math.abs(clientY - cy) * 0.25\n : Math.abs(clientY - cy) + Math.abs(clientX - cx) * 0.25\n if (!best || dist < best.dist) best = { slot, dist }\n }\n\n return best?.slot ?? null\n}\n\nexport function siblingRectsForNavDrag(draggedEl: HTMLElement, activeParentId: string | null): DOMRect[] {\n if (activeParentId) {\n return listNavChildren(activeParentId)\n .filter((el) => el !== draggedEl)\n .map((el) => el.getBoundingClientRect())\n }\n return listReorderableNavItems()\n .filter((el) => el !== draggedEl)\n .map((el) => el.getBoundingClientRect())\n}\n","'use client'\n\nimport { useCallback, useEffect, useRef, useState, type MutableRefObject, type RefObject } from 'react'\nimport {\n armItemPressDrag,\n clearTextSelection,\n disableNativeHrefDrag,\n lockItemDuringDrag,\n unlockItemDragInteraction,\n} from './lib/item-drag-interaction'\nimport {\n applyNavForest,\n isNavbarHrefKey,\n NAV_ORDER_KEY,\n planNavItemMove,\n} from './lib/nav-items'\nimport {\n buildAllNavDropSlots,\n hitTestNavDropSlot,\n type NavDropSlot,\n} from './lib/nav-dnd'\n\nexport type NavDragSession = {\n hrefKey: string\n wasSelected: boolean\n draggedEl: HTMLElement\n lastClientX: number\n lastClientY: number\n activeSlot: NavDropSlot | null\n}\n\ntype PostToParent = (msg: Record<string, unknown>) => void\n\ntype UseNavItemDragArgs = {\n isEditMode: boolean\n editContentRef: MutableRefObject<Record<string, string>>\n selectedElRef: MutableRefObject<HTMLElement | null>\n activeElRef: MutableRefObject<HTMLElement | null>\n /** When set, nav drag must not start (footer owns the gesture). */\n footerDragRef: RefObject<{ draggedEl: HTMLElement } | null>\n suppressNextClickRef: MutableRefObject<boolean>\n suppressClickUntilRef: MutableRefObject<number>\n siblingHintElRef: MutableRefObject<HTMLElement | null>\n postToParentRef: MutableRefObject<PostToParent>\n deselectRef: MutableRefObject<() => void>\n selectRef: MutableRefObject<(el: HTMLElement) => void>\n deactivateRef: MutableRefObject<() => void>\n setLinkPopover: (v: null) => void\n linkPopoverOpenRef: MutableRefObject<boolean>\n setIsItemDragging: (v: boolean) => void\n setDraggedItemRect: (r: DOMRect | null) => void\n setSiblingHintRect: (r: DOMRect | null) => void\n setSiblingHintRects: (r: DOMRect[]) => void\n setToolbarRect: (r: DOMRect | null) => void\n getNavigationItemAnchor: (el: HTMLElement) => HTMLElement | null\n isDragHandleDisabled: (el: HTMLElement) => boolean\n isNavbarButton: (el: HTMLElement) => boolean\n}\n\n/**\n * Navbar item DnD session (OHH-435). Keeps OhhwellsBridge thin — all begin/commit /\n * press-to-drag / drop visuals live here.\n */\nexport function useNavItemDrag({\n isEditMode,\n editContentRef,\n selectedElRef,\n activeElRef,\n footerDragRef,\n suppressNextClickRef,\n suppressClickUntilRef,\n siblingHintElRef,\n postToParentRef,\n deselectRef,\n selectRef,\n deactivateRef,\n setLinkPopover,\n linkPopoverOpenRef,\n setIsItemDragging,\n setDraggedItemRect,\n setSiblingHintRect,\n setSiblingHintRects,\n setToolbarRect,\n getNavigationItemAnchor,\n isDragHandleDisabled,\n isNavbarButton,\n}: UseNavItemDragArgs) {\n const navDragRef = useRef<NavDragSession | null>(null)\n const [navDropSlots, setNavDropSlots] = useState<NavDropSlot[]>([])\n const [activeNavDropIndex, setActiveNavDropIndex] = useState<number | null>(null)\n\n const navPointerDragRef = useRef<{\n el: HTMLElement\n startX: number\n startY: number\n pointerId: number\n wasSelected: boolean\n started: boolean\n } | null>(null)\n\n const clearNavDragVisuals = useCallback(() => {\n navDragRef.current = null\n setNavDropSlots([])\n setActiveNavDropIndex(null)\n setDraggedItemRect(null)\n setSiblingHintRects([])\n setIsItemDragging(false)\n unlockItemDragInteraction()\n }, [setDraggedItemRect, setIsItemDragging, setSiblingHintRects])\n\n const refreshNavDragVisuals = useCallback(\n (session: NavDragSession, activeSlot: NavDropSlot | null, clientX?: number, clientY?: number) => {\n setDraggedItemRect(session.draggedEl.getBoundingClientRect())\n if (typeof clientX === 'number' && typeof clientY === 'number') {\n session.lastClientX = clientX\n session.lastClientY = clientY\n }\n session.activeSlot = activeSlot\n\n // During drag, siblings stay in default state — only drop indicators show placement.\n setSiblingHintRects([])\n\n const slots = buildAllNavDropSlots(session.hrefKey)\n setNavDropSlots(slots)\n const activeIdx = activeSlot\n ? slots.findIndex(\n (s) => s.parentId === activeSlot.parentId && s.insertIndex === activeSlot.insertIndex\n )\n : -1\n setActiveNavDropIndex(activeIdx >= 0 ? activeIdx : null)\n },\n [setDraggedItemRect, setSiblingHintRects]\n )\n\n const refreshNavDragVisualsRef = useRef(refreshNavDragVisuals)\n refreshNavDragVisualsRef.current = refreshNavDragVisuals\n const commitNavDragRef = useRef<(x?: number, y?: number) => void>(() => {})\n const beginNavDragRef = useRef<(session: NavDragSession) => void>(() => {})\n\n const beginNavDrag = useCallback(\n (session: NavDragSession) => {\n const rect = session.draggedEl.getBoundingClientRect()\n session.lastClientX = session.lastClientX || rect.left + rect.width / 2\n session.lastClientY = session.lastClientY || rect.top + rect.height / 2\n session.activeSlot = session.activeSlot ?? null\n\n navDragRef.current = session\n setIsItemDragging(true)\n lockItemDuringDrag()\n siblingHintElRef.current = null\n setSiblingHintRect(null)\n\n if (session.wasSelected && selectedElRef.current === session.draggedEl) {\n setToolbarRect(rect)\n }\n\n const initialSlot = hitTestNavDropSlot(session.lastClientX, session.lastClientY, session.hrefKey)\n refreshNavDragVisuals(session, initialSlot, session.lastClientX, session.lastClientY)\n },\n [\n refreshNavDragVisuals,\n selectedElRef,\n setIsItemDragging,\n setSiblingHintRect,\n setToolbarRect,\n siblingHintElRef,\n ]\n )\n beginNavDragRef.current = beginNavDrag\n\n const commitNavDrag = useCallback(\n (clientX?: number, clientY?: number) => {\n const session = navDragRef.current\n if (!session) {\n clearNavDragVisuals()\n return\n }\n\n const x =\n typeof clientX === 'number' && (clientX !== 0 || clientY !== 0)\n ? clientX\n : session.lastClientX\n const y =\n typeof clientY === 'number' && (clientX !== 0 || clientY !== 0)\n ? clientY\n : session.lastClientY\n\n const slot = session.activeSlot ?? hitTestNavDropSlot(x, y, session.hrefKey)\n const planned =\n slot != null\n ? planNavItemMove(session.hrefKey, slot.parentId, slot.insertIndex)\n : null\n\n const wasSelected = session.wasSelected\n const hrefKey = session.hrefKey\n\n const applySelectionAfterDrop = () => {\n if (!wasSelected) {\n deselectRef.current()\n return\n }\n // Prefer the visible nav list — drawer often shares the same href keys.\n const desktop = document.querySelector<HTMLElement>('[data-ohw-nav-container]')\n const drawer = document.querySelector<HTMLElement>('[data-ohw-nav-drawer]')\n const link =\n desktop?.querySelector<HTMLElement>(`[data-ohw-href-key=\"${CSS.escape(hrefKey)}\"]`) ??\n drawer?.querySelector<HTMLElement>(`[data-ohw-href-key=\"${CSS.escape(hrefKey)}\"]`) ??\n document.querySelector<HTMLElement>(`[data-ohw-href-key=\"${CSS.escape(hrefKey)}\"]`)\n if (link) {\n selectRef.current(link)\n return\n }\n deselectRef.current()\n }\n\n if (planned) {\n editContentRef.current = {\n ...editContentRef.current,\n [NAV_ORDER_KEY]: planned.orderJson,\n }\n applyNavForest(planned.forest)\n document\n .querySelectorAll<HTMLElement>(\n 'nav [data-ohw-href-key], [data-ohw-nav-container] [data-ohw-href-key], [data-ohw-nav-drawer] [data-ohw-href-key]'\n )\n .forEach((el) => {\n if (isNavbarHrefKey(el.getAttribute('data-ohw-href-key'))) {\n disableNativeHrefDrag(el)\n }\n })\n postToParentRef.current({\n type: 'ow:change',\n nodes: [{ key: NAV_ORDER_KEY, text: planned.orderJson }],\n })\n // Reselect before clearing isItemDragging so chrome doesn't stick to the\n // vacated slot (item that shifted into the dragged item's old position).\n applySelectionAfterDrop()\n clearNavDragVisuals()\n requestAnimationFrame(() => {\n if (editContentRef.current[NAV_ORDER_KEY] === planned.orderJson) {\n applyNavForest(planned.forest)\n }\n applySelectionAfterDrop()\n requestAnimationFrame(applySelectionAfterDrop)\n })\n return\n }\n\n applySelectionAfterDrop()\n clearNavDragVisuals()\n },\n [clearNavDragVisuals, deselectRef, editContentRef, postToParentRef, selectRef]\n )\n commitNavDragRef.current = commitNavDrag\n\n const startNavLinkDrag = useCallback(\n (anchor: HTMLElement, clientX: number, clientY: number, wasSelected: boolean) => {\n if (footerDragRef.current) return false\n const hrefKey = anchor.getAttribute('data-ohw-href-key')\n if (!hrefKey || !isNavbarHrefKey(hrefKey)) return false\n if (isNavbarButton(anchor) || isDragHandleDisabled(anchor)) return false\n\n beginNavDrag({\n hrefKey,\n wasSelected,\n draggedEl: anchor,\n lastClientX: clientX,\n lastClientY: clientY,\n activeSlot: null,\n })\n return true\n },\n [beginNavDrag, footerDragRef, isDragHandleDisabled, isNavbarButton]\n )\n\n const onNavDragOver = useCallback(\n (e: DragEvent) => {\n const session = navDragRef.current\n if (!session) return false\n e.preventDefault()\n if (e.dataTransfer) e.dataTransfer.dropEffect = 'move'\n const slot = hitTestNavDropSlot(e.clientX, e.clientY, session.hrefKey)\n refreshNavDragVisualsRef.current(session, slot, e.clientX, e.clientY)\n return true\n },\n []\n )\n\n // Press-to-drag for navbar links (parallel to footer OHH-436).\n useEffect(() => {\n if (!isEditMode) return\n const THRESHOLD = 10\n\n const resolveWasSelected = (el: HTMLElement) => {\n if (selectedElRef.current === el) return true\n const activeAnchor = activeElRef.current ? getNavigationItemAnchor(activeElRef.current) : null\n return activeAnchor === el\n }\n\n const onPointerDown = (e: PointerEvent) => {\n if (e.button !== 0) return\n if (navDragRef.current || footerDragRef.current) return\n const target = e.target as HTMLElement | null\n if (!target) return\n if (\n target.closest(\n '[data-ohw-drag-handle-container], [data-slot=\"drag-handle\"], [data-ohw-toolbar], [data-ohw-item-toolbar-anchor], [data-ohw-link-popover-root]'\n )\n ) {\n return\n }\n if (target.closest('[data-ohw-item-drag-surface]')) return\n\n const anchor = getNavigationItemAnchor(target)\n const hrefKey = anchor?.getAttribute('data-ohw-href-key') ?? null\n if (!anchor || !isNavbarHrefKey(hrefKey)) return\n if (isNavbarButton(anchor) || isDragHandleDisabled(anchor)) return\n\n navPointerDragRef.current = {\n el: anchor,\n startX: e.clientX,\n startY: e.clientY,\n pointerId: e.pointerId,\n wasSelected: resolveWasSelected(anchor),\n started: false,\n }\n }\n\n const onPointerMove = (e: PointerEvent) => {\n const pending = navPointerDragRef.current\n if (!pending) return\n\n if (pending.started) {\n e.preventDefault()\n clearTextSelection()\n const session = navDragRef.current\n if (!session) return\n const slot = hitTestNavDropSlot(e.clientX, e.clientY, session.hrefKey)\n refreshNavDragVisualsRef.current(session, slot, e.clientX, e.clientY)\n return\n }\n\n const dx = e.clientX - pending.startX\n const dy = e.clientY - pending.startY\n if (dx * dx + dy * dy < THRESHOLD * THRESHOLD) return\n\n e.preventDefault()\n pending.started = true\n armItemPressDrag()\n clearTextSelection()\n try {\n document.body.setPointerCapture(pending.pointerId)\n } catch {\n /* ignore */\n }\n\n if (linkPopoverOpenRef.current) setLinkPopover(null)\n if (activeElRef.current) deactivateRef.current()\n\n const key = pending.el.getAttribute('data-ohw-href-key')\n if (!key) return\n beginNavDragRef.current({\n hrefKey: key,\n wasSelected: pending.wasSelected,\n draggedEl: pending.el,\n lastClientX: e.clientX,\n lastClientY: e.clientY,\n activeSlot: null,\n })\n }\n\n const endPointerDrag = (e: PointerEvent) => {\n const pending = navPointerDragRef.current\n navPointerDragRef.current = null\n try {\n if (document.body.hasPointerCapture(e.pointerId)) {\n document.body.releasePointerCapture(e.pointerId)\n }\n } catch {\n /* ignore */\n }\n // No nav press was ever tracked for this gesture (e.g. a plain text\n // drag-select elsewhere) — don't touch selection state at all.\n if (!pending) return\n if (!pending.started) {\n unlockItemDragInteraction()\n return\n }\n suppressNextClickRef.current = true\n suppressClickUntilRef.current = Date.now() + 500\n commitNavDragRef.current(e.clientX, e.clientY)\n }\n\n const blockSelectStart = (e: Event) => {\n if (\n navDragRef.current ||\n navPointerDragRef.current?.started ||\n document.documentElement.hasAttribute('data-ohw-footer-press-drag')\n ) {\n e.preventDefault()\n }\n }\n\n const onDragEnd = () => {\n if (!navDragRef.current) return\n suppressNextClickRef.current = true\n suppressClickUntilRef.current = Date.now() + 500\n commitNavDragRef.current()\n }\n\n document.addEventListener('pointerdown', onPointerDown, true)\n document.addEventListener('pointermove', onPointerMove, true)\n document.addEventListener('pointerup', endPointerDrag, true)\n document.addEventListener('pointercancel', endPointerDrag, true)\n document.addEventListener('selectstart', blockSelectStart, true)\n document.addEventListener('dragend', onDragEnd, true)\n return () => {\n document.removeEventListener('pointerdown', onPointerDown, true)\n document.removeEventListener('pointermove', onPointerMove, true)\n document.removeEventListener('pointerup', endPointerDrag, true)\n document.removeEventListener('pointercancel', endPointerDrag, true)\n document.removeEventListener('selectstart', blockSelectStart, true)\n document.removeEventListener('dragend', onDragEnd, true)\n unlockItemDragInteraction()\n }\n }, [\n activeElRef,\n deactivateRef,\n footerDragRef,\n getNavigationItemAnchor,\n isDragHandleDisabled,\n isEditMode,\n isNavbarButton,\n linkPopoverOpenRef,\n selectedElRef,\n setLinkPopover,\n suppressNextClickRef,\n ])\n\n const armNavPressFromChrome = useCallback(\n (selected: HTMLElement, clientX: number, clientY: number, pointerId: number) => {\n const hrefKey = selected.getAttribute('data-ohw-href-key')\n if (!hrefKey || !isNavbarHrefKey(hrefKey)) return false\n if (isNavbarButton(selected) || isDragHandleDisabled(selected)) return false\n navPointerDragRef.current = {\n el: selected,\n startX: clientX,\n startY: clientY,\n pointerId,\n wasSelected: true,\n started: false,\n }\n return true\n },\n [isDragHandleDisabled, isNavbarButton]\n )\n\n return {\n navDragRef,\n navDropSlots,\n activeNavDropIndex,\n startNavLinkDrag,\n commitNavDrag,\n onNavDragOver,\n armNavPressFromChrome,\n clearNavDragVisuals,\n refreshNavDragVisualsRef,\n }\n}\n","'use client'\n\nimport { Plus } from 'lucide-react'\n\nimport { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger } from './tooltip'\n\ntype FooterContainerChromeProps = {\n rect: DOMRect\n onAdd: () => void\n /** When true, + is disabled (e.g. column limit reached). */\n addDisabled?: boolean\n}\n\n/** Centered \"+\" above selected `[data-ohw-footer-links]` / `.rb-footer-links`. */\nexport function FooterContainerChrome({\n rect,\n onAdd,\n addDisabled = false,\n}: FooterContainerChromeProps) {\n const chromeGap = 6\n /** Gap between the + button bottom edge and the container top. */\n const buttonMargin = 7\n\n return (\n <TooltipProvider delayDuration={0}>\n <div\n data-ohw-footer-container-chrome=\"\"\n data-ohw-bridge=\"\"\n className=\"pointer-events-none fixed z-[2147483647]\"\n style={{\n top: rect.top - chromeGap,\n left: rect.left - chromeGap,\n width: rect.width + chromeGap * 2,\n height: rect.height + chromeGap * 2,\n }}\n >\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n data-ohw-footer-add-button=\"\"\n disabled={addDisabled}\n className=\"pointer-events-auto absolute left-1/2 flex size-7 -translate-x-1/2 -translate-y-full items-center justify-center rounded-[10px] border border-border bg-background p-0.5 shadow-sm transition-colors hover:bg-muted/80 disabled:pointer-events-none disabled:opacity-40\"\n style={{ top: chromeGap - buttonMargin }}\n aria-label=\"Add item\"\n onMouseDown={(e) => {\n e.preventDefault()\n e.stopPropagation()\n }}\n onClick={(e) => {\n e.preventDefault()\n e.stopPropagation()\n if (addDisabled) return\n onAdd()\n }}\n >\n <Plus className=\"size-4 shrink-0 text-foreground\" aria-hidden />\n </button>\n </TooltipTrigger>\n <TooltipContent side=\"bottom\" sideOffset={9}>\n {addDisabled ? 'Maximum columns reached' : 'Add item'}\n </TooltipContent>\n </Tooltip>\n </div>\n </TooltipProvider>\n )\n}\n","import { useEffect, useState } from 'react'\n\n/**\n * Editable carousel support.\n *\n * Unlike single images (which the bridge edits by mutating one `<img>` in place), a carousel's\n * slide list can grow and shrink, and its slides carry template-specific transient styling\n * (crossfade opacity, active-thumbnail borders). Cloning slide nodes in the bridge would\n * replicate that transient state and, in edit mode, fight the live app's own re-renders.\n *\n * So the carousel COMPONENT owns rendering. It keeps the slide array in React state and\n * re-renders itself — the bridge only writes the new array onto the container and fires an\n * event the component listens for. Add/delete/replace all become ordinary React renders, with\n * crossfade/rail/active-index handled by the template exactly as on a normal page load.\n *\n * DOM contract (authored by the template, see `useOhwCarousel`):\n * <div data-ohw-carousel data-ohw-key=\"hero-carousel\"\n * data-ohw-carousel-value='[{\"src\":\"…\",\"alt\":\"…\"}]'>\n * {images.map((img, i) => <div data-ohw-carousel-slide={i}>…</div>)}\n * </div>\n */\n\nexport const CAROUSEL_ATTR = 'data-ohw-carousel'\nexport const CAROUSEL_VALUE_ATTR = 'data-ohw-carousel-value'\nexport const CAROUSEL_SLIDE_ATTR = 'data-ohw-carousel-slide'\n/** Dispatched on the container to push a new slide array into the component's state. */\nexport const CAROUSEL_EVENT = 'ohw:carousel-change'\n\nexport type CarouselSlide = { src: string; alt: string }\n\n/** All unique carousel keys currently in the DOM. */\nexport function listCarouselKeys(): string[] {\n const keys = new Set<string>()\n document.querySelectorAll<HTMLElement>(`[${CAROUSEL_ATTR}]`).forEach((el) => {\n const key = el.getAttribute('data-ohw-key')\n if (key) keys.add(key)\n })\n return [...keys]\n}\n\nfunction containersForKey(key: string): HTMLElement[] {\n return Array.from(\n document.querySelectorAll<HTMLElement>(`[${CAROUSEL_ATTR}][data-ohw-key=\"${CSS.escape(key)}\"]`)\n )\n}\n\nexport function isCarouselKey(key: string): boolean {\n return containersForKey(key).length > 0\n}\n\nfunction parseSlides(raw: string | null): CarouselSlide[] {\n if (!raw) return []\n try {\n const parsed = JSON.parse(raw)\n if (!Array.isArray(parsed)) return []\n return parsed\n .filter((s): s is Record<string, unknown> => Boolean(s) && typeof s === 'object')\n .map((s) => ({ src: String(s.src ?? ''), alt: String(s.alt ?? '') }))\n } catch {\n return []\n }\n}\n\n/**\n * The current slide array for a key, read from the first container's mirrored value attribute.\n * Falls back to scanning slide `<img>`s if the value attribute is absent (e.g. a template that\n * didn't stamp `data-ohw-carousel-value`).\n */\nexport function readCarouselValue(key: string): CarouselSlide[] {\n const container = containersForKey(key)[0]\n if (!container) return []\n\n const fromAttr = parseSlides(container.getAttribute(CAROUSEL_VALUE_ATTR))\n if (fromAttr.length > 0) return fromAttr\n\n return Array.from(container.querySelectorAll<HTMLElement>(`[${CAROUSEL_SLIDE_ATTR}]`))\n .filter((slide) => slide.closest(`[${CAROUSEL_ATTR}]`) === container)\n .sort((a, b) => slideIndex(a) - slideIndex(b))\n .map((slide) => {\n const img = slide instanceof HTMLImageElement ? slide : slide.querySelector('img')\n return { src: img?.src ?? '', alt: img?.alt ?? '' }\n })\n}\n\nfunction slideIndex(el: HTMLElement): number {\n const raw = el.getAttribute(CAROUSEL_SLIDE_ATTR)\n const n = raw ? parseInt(raw, 10) : NaN\n return Number.isFinite(n) ? n : 0\n}\n\n/**\n * Push a slide array into every container with this key: update the mirrored value attribute\n * (so `readCarouselValue` and `collectEditableNodes` stay correct even before React commits) and\n * dispatch the change event the component listens for.\n */\nexport function applyCarouselValue(key: string, slides: CarouselSlide[]): void {\n const value = JSON.stringify(slides)\n for (const container of containersForKey(key)) {\n // The hook mirrors React state onto this attribute via `bind`, so a match means the\n // component's state is already current — skip to avoid redundant renders and, on the\n // published MutationObserver path, re-trigger loops.\n if (container.getAttribute(CAROUSEL_VALUE_ATTR) === value) continue\n container.setAttribute(CAROUSEL_VALUE_ATTR, value)\n container.dispatchEvent(\n new CustomEvent<{ images: CarouselSlide[] }>(CAROUSEL_EVENT, { detail: { images: slides } })\n )\n }\n}\n\n/**\n * Content-apply hook for a saved node. If `key` names a carousel in the DOM, push its parsed\n * array in and return true so callers skip the generic (innerHTML/src) handling — the value is a\n * JSON array, not markup. Returns false for non-carousel keys. Mirrors `applyVideoSettingNode`.\n */\nexport function applyCarouselNode(key: string, val: string): boolean {\n if (!isCarouselKey(key)) return false\n applyCarouselValue(key, parseSlides(val))\n return true\n}\n\n/**\n * Template hook. Owns the slide array in React state, stamps the DOM contract via `bind`, and\n * listens for the bridge's change event so replace/add/delete re-render the component.\n *\n * `bind` is plain data attributes (no ref), so it spreads onto any element type without type\n * friction; the hook finds its own container by key. Slides inside still need\n * `data-ohw-carousel-slide={i}`.\n *\n * const { images, bind } = useOhwCarousel('hero-carousel', content.images)\n * <div {...bind}>{images.map((img, i) => <Slide data-ohw-carousel-slide={i} … />)}</div>\n */\nexport function useOhwCarousel(key: string, initial: CarouselSlide[]) {\n const [images, setImages] = useState<CarouselSlide[]>(initial)\n\n useEffect(() => {\n const el = document.querySelector<HTMLElement>(\n `[${CAROUSEL_ATTR}][data-ohw-key=\"${CSS.escape(key)}\"]`\n )\n if (!el) return\n const onChange = (e: Event) => {\n const detail = (e as CustomEvent<{ images?: CarouselSlide[] }>).detail\n if (Array.isArray(detail?.images)) setImages(detail.images)\n }\n el.addEventListener(CAROUSEL_EVENT, onChange as EventListener)\n return () => el.removeEventListener(CAROUSEL_EVENT, onChange as EventListener)\n }, [key])\n\n const bind: Record<string, string> = {\n [CAROUSEL_ATTR]: '',\n 'data-ohw-key': key,\n [CAROUSEL_VALUE_ATTR]: JSON.stringify(images),\n }\n\n return { images, setImages, bind }\n}\n","\"use client\";\n\nimport { Plus } from \"lucide-react\";\n\ntype NavbarContainerChromeProps = {\n rect: DOMRect;\n onAdd: () => void;\n};\n\n/** Centered \"+\" for selected `data-ohw-nav-container` (solid border from ItemInteractionLayer). */\nexport function NavbarContainerChrome({\n rect,\n onAdd,\n}: NavbarContainerChromeProps) {\n const chromeGap = 6;\n\n return (\n <div\n data-ohw-navbar-container-chrome=\"\"\n data-ohw-bridge=\"\"\n className=\"pointer-events-none fixed z-[2147483647]\"\n style={{\n top: rect.top - chromeGap,\n left: rect.left - chromeGap,\n width: rect.width + chromeGap * 2,\n height: rect.height + chromeGap * 2,\n }}\n >\n <button\n type=\"button\"\n data-ohw-navbar-add-button=\"\"\n className=\"pointer-events-auto absolute left-1/2 flex p-0.5 rounded-[10px] size-7 -translate-x-1/2 translate-y-1/2 items-center justify-center border border-border bg-background shadow-sm transition-colors hover:bg-muted/80\"\n style={{ top: \"70%\" }}\n aria-label=\"Add item\"\n onMouseDown={(e) => {\n e.preventDefault();\n e.stopPropagation();\n }}\n onClick={(e) => {\n e.preventDefault();\n e.stopPropagation();\n onAdd();\n }}\n >\n <Plus className=\"size-4 shrink-0 text-foreground\" aria-hidden />\n </button>\n </div>\n );\n}\n","'use client'\n\nimport * as React from 'react'\nimport { cva, type VariantProps } from 'class-variance-authority'\n\nimport { cn } from '../lib/utils'\n\n/**\n * Visual drop-gap line for navbar / footer / repeater reorder.\n * Figma: Custom/Drop Indicator (8140:1731) — CSS class `.ov-gap-line`\n *\n * Opacity (Figma docs):\n * - default: 0 (hidden)\n * - hover: 1\n * - dragIdle: 0.4\n * - dragActive: 1\n */\nconst dropIndicatorVariants = cva(\n 'ov-gap-line pointer-events-none shrink-0 transition-opacity duration-150',\n {\n variants: {\n direction: {\n vertical: 'h-6 w-[3px]',\n horizontal: 'h-[3px] w-[200px]',\n },\n state: {\n default: 'opacity-0',\n hover: 'opacity-100',\n dragIdle: 'opacity-40',\n dragActive: 'opacity-100',\n },\n },\n defaultVariants: {\n direction: 'vertical',\n state: 'default',\n },\n }\n)\n\ntype DropIndicatorProps = React.HTMLAttributes<HTMLDivElement> &\n VariantProps<typeof dropIndicatorVariants>\n\nconst DropIndicator = React.forwardRef<HTMLDivElement, DropIndicatorProps>(\n ({ className, direction, state, ...props }, ref) => {\n return (\n <div\n ref={ref}\n data-slot=\"drop-indicator\"\n data-direction={direction ?? 'vertical'}\n data-state={state ?? 'default'}\n aria-hidden=\"true\"\n className={cn(dropIndicatorVariants({ direction, state }), className)}\n {...props}\n />\n )\n }\n)\nDropIndicator.displayName = 'DropIndicator'\n\nexport { DropIndicator, dropIndicatorVariants }\nexport type { DropIndicatorProps }\n","import * as React from \"react\"\nimport { cva, type VariantProps } from \"class-variance-authority\"\n\nimport { cn } from \"@/lib/utils\"\n\nconst badgeVariants = cva(\n \"inline-flex items-center rounded-full border px-2.5 py-0.5 text-xs font-semibold transition-colors focus:outline-none focus:ring-2 focus:ring-ring focus:ring-offset-2\",\n {\n variants: {\n variant: {\n default:\n \"border-transparent bg-primary text-primary-foreground\",\n secondary:\n \"border-transparent bg-secondary text-secondary-foreground hover:bg-secondary/80\",\n destructive:\n \"border-transparent bg-destructive text-destructive-foreground hover:bg-destructive/80\",\n outline: \"text-foreground\",\n },\n },\n defaultVariants: {\n variant: \"default\",\n },\n }\n)\n\nexport interface BadgeProps\n extends React.HTMLAttributes<HTMLDivElement>,\n VariantProps<typeof badgeVariants> {}\n\nfunction Badge({ className, variant, ...props }: BadgeProps) {\n return (\n <div className={cn(badgeVariants({ variant }), className)} {...props} />\n )\n}\n\nexport { Badge, badgeVariants }\n"],"mappings":"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","names":["React","useCallback","useEffect","useLayoutEffect","useRef","useState","useState","jsx","jsxs","useState","React","concatArrays","array1","array2","combinedArray","Array","length","i","createClassValidatorObject","classGroupId","validator","createClassPartObject","nextPart","Map","validators","CLASS_PART_SEPARATOR","EMPTY_CONFLICTS","ARBITRARY_PROPERTY_PREFIX","createClassGroupUtils","config","classMap","createClassMap","conflictingClassGroups","conflictingClassGroupModifiers","getClassGroupId","className","startsWith","endsWith","getGroupIdForArbitraryProperty","classParts","split","startIndex","getGroupRecursive","getConflictingClassGroupIds","hasPostfixModifier","modifierConflicts","baseConflicts","classPartObject","classPathsLength","currentClassPart","nextClassPartObject","get","result","undefined","classRest","join","slice","validatorsLength","validatorObj","indexOf","content","colonIndex","property","theme","classGroups","processClassGroups","group","processClassesRecursively","classGroup","len","classDefinition","processClassDefinition","processStringDefinition","processFunctionDefinition","processObjectDefinition","classPartObjectToEdit","getPart","isThemeGetter","push","entries","Object","key","value","path","current","parts","part","next","set","func","createLruCache","maxCacheSize","cacheSize","cache","create","previousCache","update","IMPORTANT_MODIFIER","MODIFIER_SEPARATOR","EMPTY_MODIFIERS","createResultObject","modifiers","hasImportantModifier","baseClassName","maybePostfixModifierPosition","isExternal","createParseClassName","prefix","experimentalParseClassName","parseClassName","bracketDepth","parenDepth","modifierStart","postfixModifierPosition","index","currentCharacter","baseClassNameWithImportantModifier","fullPrefix","parseClassNameOriginal","createSortModifiers","modifierWeights","orderSensitiveModifiers","forEach","mod","currentSegment","modifier","isArbitrary","isOrderSensitive","has","sort","createConfigUtils","sortModifiers","postfixLookupClassGroupIds","createPostfixLookupClassGroupIds","lookup","classGroupIds","postfixLookupClassGroups","SPLIT_CLASSES_REGEX","mergeClassList","classList","configUtils","classGroupsInConflict","classNames","trim","originalClassName","baseClassNameWithoutPostfix","substring","classGroupIdWithPostfix","variantModifier","modifierId","classId","conflictGroups","twJoin","classLists","argument","resolvedValue","string","toValue","mix","k","createTailwindMerge","createConfigFirst","createConfigRest","cacheGet","cacheSet","functionToCall","initTailwindMerge","reduce","previousConfig","createConfigCurrent","tailwindMerge","cachedResult","args","fallbackThemeArr","fromTheme","themeGetter","arbitraryValueRegex","arbitraryVariableRegex","fractionRegex","tshirtUnitRegex","lengthUnitRegex","colorFunctionRegex","shadowRegex","imageRegex","isFraction","test","isNumber","Number","isNaN","isInteger","isPercent","isTshirtSize","isAny","isLengthOnly","isNever","isShadow","isImage","isAnyNonArbitrary","isArbitraryValue","isArbitraryVariable","isNamedContainerQuery","isArbitrarySize","getIsArbitraryValue","isLabelSize","isArbitraryLength","isLabelLength","isArbitraryNumber","isLabelNumber","isArbitraryWeight","isLabelWeight","isArbitraryFamilyName","isLabelFamilyName","isArbitraryPosition","isLabelPosition","isArbitraryImage","isLabelImage","isArbitraryShadow","isLabelShadow","isArbitraryVariableLength","getIsArbitraryVariable","isArbitraryVariableFamilyName","isArbitraryVariablePosition","isArbitraryVariableSize","isArbitraryVariableImage","isArbitraryVariableShadow","isArbitraryVariableWeight","testLabel","testValue","exec","shouldMatchNoLabel","label","getDefaultConfig","themeColor","fromTheme","themeFont","themeText","themeFontWeight","themeTracking","themeLeading","themeBreakpoint","themeContainer","themeSpacing","themeRadius","themeShadow","themeInsetShadow","themeTextShadow","themeDropShadow","themeBlur","themePerspective","themeAspect","themeEase","themeAnimate","scaleBreak","scalePosition","scalePositionWithArbitrary","isArbitraryVariable","isArbitraryValue","scaleOverflow","scaleOverscroll","scaleUnambiguousSpacing","scaleInset","isFraction","scaleGridTemplateColsRows","isInteger","scaleGridColRowStartAndEnd","span","scaleGridColRowStartOrEnd","scaleGridAutoColsRows","scaleAlignPrimaryAxis","scaleAlignSecondaryAxis","scaleMargin","scaleSizing","scaleSizingInline","scaleSizingBlock","scaleColor","scaleBgPosition","isArbitraryVariablePosition","isArbitraryPosition","position","scaleBgRepeat","repeat","scaleBgSize","isArbitraryVariableSize","isArbitrarySize","size","scaleGradientStopPosition","isPercent","isArbitraryVariableLength","isArbitraryLength","scaleRadius","scaleBorderWidth","isNumber","scaleLineStyle","scaleBlendMode","scaleMaskImagePosition","scaleBlur","scaleRotate","scaleScale","scaleSkew","scaleTranslate","cacheSize","theme","animate","aspect","blur","isTshirtSize","breakpoint","color","isAny","container","ease","font","isAnyNonArbitrary","leading","perspective","radius","shadow","spacing","text","tracking","classGroups","isNamedContainerQuery","columns","box","display","sr","float","clear","isolation","object","overflow","overscroll","inset","start","end","top","right","bottom","left","visibility","z","basis","flex","grow","shrink","order","col","row","gap","justify","content","items","baseline","self","p","px","py","ps","pe","pbs","pbe","pt","pr","pb","pl","m","mx","my","ms","me","mbs","mbe","mt","mr","mb","ml","inline","block","w","screen","h","isArbitraryVariableWeight","isArbitraryWeight","isArbitraryVariableFamilyName","isArbitraryFamilyName","isArbitraryNumber","list","placeholder","decoration","indent","tab","align","whitespace","break","wrap","hyphens","bg","linear","to","radial","conic","isArbitraryVariableImage","isArbitraryImage","from","via","rounded","border","divide","outline","isArbitraryVariableShadow","isArbitraryShadow","ring","opacity","mask","closest","farthest","filter","brightness","contrast","grayscale","invert","saturate","sepia","table","caption","transition","duration","delay","backface","rotate","scale","skew","transform","origin","translate","zoom","accent","appearance","caret","scheme","cursor","resize","scroll","scrollbar","snap","touch","select","fill","stroke","conflictingClassGroups","conflictingClassGroupModifiers","postfixLookupClassGroups","orderSensitiveModifiers","twMerge","createTailwindMerge","getDefaultConfig","param","jsx","jsx","React","jsx","React","jsx","useState","jsx","jsx","jsx","jsx","jsxs","useState","React","jsx","jsxs","React","React","jsx","Fragment","jsx","jsxs","jsx","jsxs","OVERLAY_BUTTON_STYLE","createPortal","usePathname","useRouter","useEffect","React","jsx","jsxs","Dialog","X","jsx","jsxs","GalleryVertical","jsx","jsxs","GalleryVertical","useEffect","useId","useRef","useState","React","jsx","jsx","File","X","jsx","jsxs","useId","useRef","useState","useEffect","Fragment","jsx","jsxs","X","useCallback","useEffect","useMemo","useRef","useState","jsx","jsxs","useState","useMemo","useEffect","useRef","useCallback","useCallback","useEffect","useMemo","useState","useMemo","useState","useCallback","useEffect","Fragment","jsx","jsxs","useEffect","Dialog","r","cx","getLinkHref","postToParent","cx","useCallback","useEffect","useRef","useState","getNavigationItemAnchor","isDragHandleDisabled","isNavbarButton","useRef","useState","useCallback","useEffect","Plus","jsx","jsxs","Plus","useEffect","useState","Plus","jsx","React","jsx","jsx","Link","Fragment","jsx","jsxs","PRIMARY","jsx","getLinkHref","isNavbarButton","isNavbarButton","r","SELECTION_CHROME_GAP","TOOLBAR_STROKE_GAP","jsxs","jsx","TOOLBAR_EDGE_MARGIN","React","Link","usePathname","useRouter","useState","useEffect","postToParent","useCallback","useRef","isNavbarButton","slots","activeIdx","useLayoutEffect","r","PRIMARY","editable","getLinkHref","selected","related","x","y","existing","parent","el","columns","createPortal","Fragment"]}
|