{"version":3,"names":["createContext","createMemo","createSignal","runWithOwner","untrack","useContext","readOption","SNAPSHOT_KEYS","snapshotKeys","NavigationMenuApiContext","useNavigationMenu","optional","ctx","Error","createNavigationMenu","options","value","raw","name","open","delay","closeDelay","orientation","activationDirection","setActivationDirection","ownedWrite","viewportInert","setViewportInert","setValue","next","details","d","reason","isCanceled","prev","onValueChange","api","Provider","props","children","NAVIGATION_MENU_SNAPSHOT_KEYS"],"sources":["create-navigation-menu.tsx"],"sourcesContent":["import type { JSX } from \"@solidjs/web\";\n/**\n * `createNavigationMenu` — headless primitive for the NavigationMenu compound.\n *\n * Owns:\n *  - `value` — currently active item value (consumer-owned signal).\n *  - `open` — derived as `value() != null`.\n *  - `activationDirection` — animation hint for content panels.\n *  - `viewportInert` — whether the viewport is inert (pointer-events guard).\n *  - `setValue` — pure event-emitter via `runWithOwner(null, ...)`.\n *\n * DOM concerns (FloatingTree, floating-root context, refs, transition,\n * focus return, popupElement, positionerElement) stay in\n * `<NavigationMenu.Root>`.\n */\nimport {\n\ttype Accessor,\n\tcreateContext,\n\tcreateMemo,\n\tcreateSignal,\n\trunWithOwner,\n\ttype Setter,\n\tuntrack,\n\tuseContext,\n} from \"solid-js\";\nimport { type MaybeAccessor, readOption } from \"../internals/maybe-accessor\";\nimport {\n\tSNAPSHOT_KEYS,\n\ttype Snapshottable,\n\tsnapshotKeys,\n} from \"../internals/observability/snapshot\";\nimport type {\n\tNavigationMenuActivationDirection,\n\tNavigationMenuRootChangeEventDetails,\n\tNavigationMenuRootChangeEventReason,\n} from \"./root/navigation-menu-root-context\";\n\n// ---------------------------------------------------------------------------\n// Public types\n// ---------------------------------------------------------------------------\n\nexport type NavigationMenuChangeReason = NavigationMenuRootChangeEventReason;\n\nexport interface CreateNavigationMenuOptions<Value = unknown> {\n\t/**\n\t * Currently active item value. Consumer-owned signal — `null` means closed.\n\t * The primitive reads through the accessor and does NOT keep an internal\n\t * copy. Writes happen via `onValueChange`.\n\t */\n\tvalue: MaybeAccessor<Value | null | undefined>;\n\t/**\n\t * Called via `runWithOwner(null, ...)` so consumer signal writes don't\n\t * trigger SIGNAL_WRITE_IN_OWNED_SCOPE.\n\t */\n\tonValueChange?: (\n\t\tvalue: Value | null,\n\t\tdetails: NavigationMenuRootChangeEventDetails,\n\t) => void;\n\t/**\n\t * Hover open delay in ms.\n\t * @default 50\n\t */\n\tdelay?: MaybeAccessor<number>;\n\t/**\n\t * Hover close delay in ms.\n\t * @default 50\n\t */\n\tcloseDelay?: MaybeAccessor<number>;\n\t/**\n\t * Orientation of the navigation menu.\n\t * @default \"horizontal\"\n\t */\n\torientation?: MaybeAccessor<\"horizontal\" | \"vertical\">;\n}\n\nexport interface NavigationMenuApi<Value = unknown> {\n\t/** Currently active item value (or null). */\n\tvalue: Accessor<Value | null>;\n\t/** Whether any item is currently active. */\n\topen: Accessor<boolean>;\n\t/** Hover open delay. */\n\tdelay: Accessor<number>;\n\t/** Hover close delay. */\n\tcloseDelay: Accessor<number>;\n\t/** Orientation. */\n\torientation: Accessor<\"horizontal\" | \"vertical\">;\n\t/** Direction of the most recent activation transition. */\n\tactivationDirection: Accessor<NavigationMenuActivationDirection>;\n\t/** Whether the viewport is inert (pointer-events guard during transitions). */\n\tviewportInert: Accessor<boolean>;\n\n\t/**\n\t * Pure event-emitter — fires `onValueChange` via `runWithOwner(null, ...)`.\n\t * The consumer owns the signal write.\n\t */\n\tsetValue: (\n\t\tnext: Value | null,\n\t\tdetails?: NavigationMenuRootChangeEventDetails,\n\t) => void;\n\t/** Update the activation direction. Internal coordination for animations. */\n\tsetActivationDirection: Setter<NavigationMenuActivationDirection>;\n\t/** Toggle the viewport inert state. Internal coordination. */\n\tsetViewportInert: Setter<boolean>;\n\n\t/** Context provider — expose the api via `useNavigationMenu()`. */\n\tProvider: (props: { children: JSX.Element }) => JSX.Element;\n}\n\n// ---------------------------------------------------------------------------\n// Context\n// ---------------------------------------------------------------------------\n\nconst NavigationMenuApiContext =\n\tcreateContext<NavigationMenuApi<unknown> | null>(null);\n\n/**\n * Read the nearest {@link NavigationMenuApi}. Throws unless `optional` is true.\n */\nexport function useNavigationMenu<Value = unknown>(): NavigationMenuApi<Value>;\nexport function useNavigationMenu<Value = unknown>(\n\toptional: true,\n): NavigationMenuApi<Value> | null;\nexport function useNavigationMenu<Value = unknown>(\n\toptional?: boolean,\n): NavigationMenuApi<Value> | null {\n\tconst ctx = useContext(NavigationMenuApiContext);\n\tif (ctx == null && !optional) {\n\t\tthrow new Error(\n\t\t\t\"Base UI: useNavigationMenu() must be called inside a <nm.Provider>.\",\n\t\t);\n\t}\n\treturn ctx as NavigationMenuApi<Value> | null;\n}\n\n// ---------------------------------------------------------------------------\n// Primitive\n// ---------------------------------------------------------------------------\n\n/**\n * Headless primitive for the NavigationMenu compound. Owns the value /\n * derived-open state, activation direction, and viewport-inert flag. DOM\n * concerns (FloatingTree, refs, transition, focus return, positioner) live\n * in `<NavigationMenu.Root>`.\n */\nexport function createNavigationMenu<Value = unknown>(\n\toptions: CreateNavigationMenuOptions<Value>,\n): NavigationMenuApi<Value> {\n\t// Value reads through the consumer's accessor — no internal copy.\n\tconst value = createMemo<Value | null>(\n\t\t() => {\n\t\t\tconst raw = readOption(options.value) as Value | null | undefined;\n\t\t\treturn raw ?? null;\n\t\t},\n\t\t{ name: \"navigationMenu.value\" },\n\t);\n\n\t// Open is a pure derivation — non-null value means something is active.\n\tconst open = createMemo<boolean>(() => value() != null, {\n\t\tname: \"navigationMenu.open\",\n\t});\n\n\tconst delay = createMemo<number>(() => readOption(options.delay) ?? 50, {\n\t\tname: \"navigationMenu.delay\",\n\t});\n\n\tconst closeDelay = createMemo<number>(\n\t\t() => readOption(options.closeDelay) ?? 50,\n\t\t{ name: \"navigationMenu.closeDelay\" },\n\t);\n\n\tconst orientation = createMemo<\"horizontal\" | \"vertical\">(\n\t\t() => readOption(options.orientation) ?? \"horizontal\",\n\t\t{ name: \"navigationMenu.orientation\" },\n\t);\n\n\tconst [activationDirection, setActivationDirection] =\n\t\tcreateSignal<NavigationMenuActivationDirection>(null, {\n\t\t\townedWrite: true,\n\t\t\tname: \"navigationMenu.activationDirection\",\n\t\t});\n\n\tconst [viewportInert, setViewportInert] = createSignal(false, {\n\t\townedWrite: true,\n\t\tname: \"navigationMenu.viewportInert\",\n\t});\n\n\t// Pure event-emitter — escapes the reactive owner so consumer signal\n\t// writes inside onValueChange don't trip SIGNAL_WRITE_IN_OWNED_SCOPE.\n\tconst setValue = (\n\t\tnext: Value | null,\n\t\tdetails?: NavigationMenuRootChangeEventDetails,\n\t): void => {\n\t\tconst d: NavigationMenuRootChangeEventDetails =\n\t\t\tdetails ??\n\t\t\t({\n\t\t\t\treason: \"none\",\n\t\t\t\tisCanceled: false,\n\t\t\t} as NavigationMenuRootChangeEventDetails);\n\n\t\t// Reset activation direction on close — consistent with Root behavior.\n\t\tif (!next) {\n\t\t\tsetActivationDirection(null);\n\t\t}\n\n\t\tconst prev = untrack(value);\n\t\tif (next !== prev) {\n\t\t\trunWithOwner(null, () => options.onValueChange?.(next, d));\n\t\t}\n\t};\n\n\tconst api: NavigationMenuApi<Value> = {\n\t\tvalue,\n\t\topen,\n\t\tdelay,\n\t\tcloseDelay,\n\t\torientation,\n\t\tactivationDirection,\n\t\tviewportInert,\n\t\tsetValue,\n\t\tsetActivationDirection,\n\t\tsetViewportInert,\n\t\tProvider: (props) => (\n\t\t\t<NavigationMenuApiContext value={api as NavigationMenuApi<unknown>}>\n\t\t\t\t{props.children}\n\t\t\t</NavigationMenuApiContext>\n\t\t),\n\t};\n\n\t(api as NavigationMenuApi<Value> & Snapshottable)[SNAPSHOT_KEYS] =\n\t\tNAVIGATION_MENU_SNAPSHOT_KEYS;\n\n\treturn api;\n}\n\nconst NAVIGATION_MENU_SNAPSHOT_KEYS = snapshotKeys<NavigationMenuApi>(\n\t\"value\",\n\t\"open\",\n\t\"orientation\",\n\t\"activationDirection\",\n\t\"viewportInert\",\n);\n"],"mappings":"AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAECA,aAAa,EACbC,UAAU,EACVC,YAAY,EACZC,YAAY,EAEZC,OAAO,EACPC,UAAU,QACJ,UAAU;AACjB,SAA6BC,UAAU,QAAQ,6BAA6B;AAC5E,SACCC,aAAa,EAEbC,YAAY,QACN,qCAAqC;;AAO5C;AACA;AACA;;AAqEA;AACA;AACA;;AAEA,MAAMC,wBAAwB,GAC7BT,aAAa,CAAoC,IAAI,CAAC;;AAEvD;AACA;AACA;;AAKA,OAAO,SAASU,iBAAiBA,CAChCC,QAAkB,EACgB;EAClC,MAAMC,GAAG,GAAGP,UAAU,CAACI,wBAAwB,CAAC;EAChD,IAAIG,GAAG,IAAI,IAAI,IAAI,CAACD,QAAQ,EAAE;IAC7B,MAAM,IAAIE,KAAK,CACd,qEACD,CAAC;EACF;EACA,OAAOD,GAAG;AACX;;AAEA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA,OAAO,SAASE,oBAAoBA,CACnCC,OAA2C,EAChB;EAC3B;EACA,MAAMC,KAAK,GAAGf,UAAU,CACvB,MAAM;IACL,MAAMgB,GAAG,GAAGX,UAAU,CAACS,OAAO,CAACC,KAAK,CAA6B;IACjE,OAAOC,GAAG,IAAI,IAAI;EACnB,CAAC,EACD;IAAEC,IAAI,EAAE;EAAuB,CAChC,CAAC;;EAED;EACA,MAAMC,IAAI,GAAGlB,UAAU,CAAU,MAAMe,KAAK,CAAC,CAAC,IAAI,IAAI,EAAE;IACvDE,IAAI,EAAE;EACP,CAAC,CAAC;EAEF,MAAME,KAAK,GAAGnB,UAAU,CAAS,MAAMK,UAAU,CAACS,OAAO,CAACK,KAAK,CAAC,IAAI,EAAE,EAAE;IACvEF,IAAI,EAAE;EACP,CAAC,CAAC;EAEF,MAAMG,UAAU,GAAGpB,UAAU,CAC5B,MAAMK,UAAU,CAACS,OAAO,CAACM,UAAU,CAAC,IAAI,EAAE,EAC1C;IAAEH,IAAI,EAAE;EAA4B,CACrC,CAAC;EAED,MAAMI,WAAW,GAAGrB,UAAU,CAC7B,MAAMK,UAAU,CAACS,OAAO,CAACO,WAAW,CAAC,IAAI,YAAY,EACrD;IAAEJ,IAAI,EAAE;EAA6B,CACtC,CAAC;EAED,MAAM,CAACK,mBAAmB,EAAEC,sBAAsB,CAAC,GAClDtB,YAAY,CAAoC,IAAI,EAAE;IACrDuB,UAAU,EAAE,IAAI;IAChBP,IAAI,EAAE;EACP,CAAC,CAAC;EAEH,MAAM,CAACQ,aAAa,EAAEC,gBAAgB,CAAC,GAAGzB,YAAY,CAAC,KAAK,EAAE;IAC7DuB,UAAU,EAAE,IAAI;IAChBP,IAAI,EAAE;EACP,CAAC,CAAC;;EAEF;EACA;EACA,MAAMU,QAAQ,GAAGA,CAChBC,IAAkB,EAClBC,OAA8C,KACpC;IACV,MAAMC,CAAuC,GAC5CD,OAAO,IACN;MACAE,MAAM,EAAE,MAAM;MACdC,UAAU,EAAE;IACb,CAA0C;;IAE3C;IACA,IAAI,CAACJ,IAAI,EAAE;MACVL,sBAAsB,CAAC,IAAI,CAAC;IAC7B;IAEA,MAAMU,IAAI,GAAG9B,OAAO,CAACY,KAAK,CAAC;IAC3B,IAAIa,IAAI,KAAKK,IAAI,EAAE;MAClB/B,YAAY,CAAC,IAAI,EAAE,MAAMY,OAAO,CAACoB,aAAa,GAAGN,IAAI,EAAEE,CAAC,CAAC,CAAC;IAC3D;EACD,CAAC;EAED,MAAMK,GAA6B,GAAG;IACrCpB,KAAK;IACLG,IAAI;IACJC,KAAK;IACLC,UAAU;IACVC,WAAW;IACXC,mBAAmB;IACnBG,aAAa;IACbE,QAAQ;IACRJ,sBAAsB;IACtBG,gBAAgB;IAChBU,QAAQ,EAAGC,KAAK,IACf,CAAC,wBAAwB,CAAC,KAAK,CAAC,CAACF,GAAiC,CAAC;AACtE,IAAI,CAACE,KAAK,CAACC,QAAQ;AACnB,GAAG,EAAE,wBAAwB;EAE5B,CAAC;EAEAH,GAAG,CAA8C7B,aAAa,CAAC,GAC/DiC,6BAA6B;EAE9B,OAAOJ,GAAG;AACX;AAEA,MAAMI,6BAA6B,GAAGhC,YAAY,CACjD,OAAO,EACP,MAAM,EACN,aAAa,EACb,qBAAqB,EACrB,eACD,CAAC","ignoreList":[]}