import { createContext, createMemo, useContext } from "solid-js";
import { createPopupCore } from "../internals/create-popup-core.jsx";
import { readOption } from "../internals/maybe-accessor.jsx";
import { SNAPSHOT_KEYS, snapshotKeys } from "../internals/observability/snapshot.jsx";

/**
 * Why the drawer's open state changed.
 *
 * - `"trigger-press"` — trigger was clicked or keyboard-activated.
 * - `"swipe"` — user swipe-dismissed the drawer.
 * - `"escape-key"` — Escape dismissed the drawer.
 * - `"outside-press"` — pointer pressed outside.
 * - `"close-button"` — `<Drawer.Close>` was pressed.
 * - `"close-watcher"` — Android CloseWatcher back-gesture.
 * - `"imperative"` — `dr.setOpen()` called programmatically.
 */

/**
 * Options for {@link createDrawer}.
 */

/**
 * Public API returned by {@link createDrawer}.
 */

const DrawerContext = createContext(null);

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

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

/**
 * Headless primitive for a drawer compound. Modal slide-in panel with swipe
 * dismissal and snap-point control. DOM machinery lives in `<Drawer.Root>`.
 */
export function createDrawer(options) {
  const core = createPopupCore({
    open: options.open,
    disabled: options.disabled,
    onOpenChange: options.onOpenChange
  });
  const modal = createMemo(() => readOption(options.modal) ?? true, {
    name: "drawer.modal"
  });
  const disablePointerDismissal = createMemo(() => Boolean(readOption(options.disablePointerDismissal)), {
    name: "drawer.disablePointerDismissal"
  });
  const swipeDirection = createMemo(() => readOption(options.swipeDirection) ?? "down", {
    name: "drawer.swipeDirection"
  });
  const snapPoint = createMemo(() => readOption(options.snapPoint), {
    name: "drawer.snapPoint"
  });
  const snapPoints = createMemo(() => readOption(options.snapPoints), {
    name: "drawer.snapPoints"
  });
  const setSnapPoint = next => {
    options.onSnapPointChange?.(next);
  };
  const api = {
    open: core.open,
    disabled: core.disabled,
    modal,
    disablePointerDismissal,
    swipeDirection,
    snapPoint,
    snapPoints,
    setOpen: core.setOpen,
    toggle: core.toggle,
    setSnapPoint,
    Provider: props => <DrawerContext value={api}>{props.children}</DrawerContext>
  };
  api[SNAPSHOT_KEYS] = DRAWER_SNAPSHOT_KEYS;
  return api;
}
const DRAWER_SNAPSHOT_KEYS = snapshotKeys("open", "disabled", "modal", "disablePointerDismissal", "swipeDirection", "snapPoint");
//# sourceMappingURL=create-drawer.jsx.map
