/**
 * `createNavigationMenu` — headless primitive for the NavigationMenu compound.
 *
 * Owns:
 *  - `value` — currently active item value (consumer-owned signal).
 *  - `open` — derived as `value() != null`.
 *  - `activationDirection` — animation hint for content panels.
 *  - `viewportInert` — whether the viewport is inert (pointer-events guard).
 *  - `setValue` — pure event-emitter via `runWithOwner(null, ...)`.
 *
 * DOM concerns (FloatingTree, floating-root context, refs, transition,
 * focus return, popupElement, positionerElement) stay in
 * `<NavigationMenu.Root>`.
 */
import { createContext, createMemo, createSignal, runWithOwner, untrack, useContext } from "solid-js";
import { readOption } from "../internals/maybe-accessor.jsx";
import { SNAPSHOT_KEYS, snapshotKeys } from "../internals/observability/snapshot.jsx";

// ---------------------------------------------------------------------------
// Public types
// ---------------------------------------------------------------------------

// ---------------------------------------------------------------------------
// Context
// ---------------------------------------------------------------------------

const NavigationMenuApiContext = createContext(null);

/**
 * Read the nearest {@link NavigationMenuApi}. Throws unless `optional` is true.
 */

export function useNavigationMenu(optional) {
  const ctx = useContext(NavigationMenuApiContext);
  if (ctx == null && !optional) {
    throw new Error("Base UI: useNavigationMenu() must be called inside a <nm.Provider>.");
  }
  return ctx;
}

// ---------------------------------------------------------------------------
// Primitive
// ---------------------------------------------------------------------------

/**
 * Headless primitive for the NavigationMenu compound. Owns the value /
 * derived-open state, activation direction, and viewport-inert flag. DOM
 * concerns (FloatingTree, refs, transition, focus return, positioner) live
 * in `<NavigationMenu.Root>`.
 */
export function createNavigationMenu(options) {
  // Value reads through the consumer's accessor — no internal copy.
  const value = createMemo(() => {
    const raw = readOption(options.value);
    return raw ?? null;
  }, {
    name: "navigationMenu.value"
  });

  // Open is a pure derivation — non-null value means something is active.
  const open = createMemo(() => value() != null, {
    name: "navigationMenu.open"
  });
  const delay = createMemo(() => readOption(options.delay) ?? 50, {
    name: "navigationMenu.delay"
  });
  const closeDelay = createMemo(() => readOption(options.closeDelay) ?? 50, {
    name: "navigationMenu.closeDelay"
  });
  const orientation = createMemo(() => readOption(options.orientation) ?? "horizontal", {
    name: "navigationMenu.orientation"
  });
  const [activationDirection, setActivationDirection] = createSignal(null, {
    ownedWrite: true,
    name: "navigationMenu.activationDirection"
  });
  const [viewportInert, setViewportInert] = createSignal(false, {
    ownedWrite: true,
    name: "navigationMenu.viewportInert"
  });

  // Pure event-emitter — escapes the reactive owner so consumer signal
  // writes inside onValueChange don't trip SIGNAL_WRITE_IN_OWNED_SCOPE.
  const setValue = (next, details) => {
    const d = details ?? {
      reason: "none",
      isCanceled: false
    };

    // Reset activation direction on close — consistent with Root behavior.
    if (!next) {
      setActivationDirection(null);
    }
    const prev = untrack(value);
    if (next !== prev) {
      runWithOwner(null, () => options.onValueChange?.(next, d));
    }
  };
  const api = {
    value,
    open,
    delay,
    closeDelay,
    orientation,
    activationDirection,
    viewportInert,
    setValue,
    setActivationDirection,
    setViewportInert,
    Provider: props => <NavigationMenuApiContext value={api}>
				{props.children}
			</NavigationMenuApiContext>
  };
  api[SNAPSHOT_KEYS] = NAVIGATION_MENU_SNAPSHOT_KEYS;
  return api;
}
const NAVIGATION_MENU_SNAPSHOT_KEYS = snapshotKeys("value", "open", "orientation", "activationDirection", "viewportInert");
//# sourceMappingURL=create-navigation-menu.jsx.map
