"use strict";
var wp;
(wp ||= {}).keyboardShortcuts = (() => {
  var __create = Object.create;
  var __defProp = Object.defineProperty;
  var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
  var __getOwnPropNames = Object.getOwnPropertyNames;
  var __getProtoOf = Object.getPrototypeOf;
  var __hasOwnProp = Object.prototype.hasOwnProperty;
  var __commonJS = (cb, mod) => function __require() {
    return mod || (0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod), mod.exports;
  };
  var __export = (target, all) => {
    for (var name in all)
      __defProp(target, name, { get: all[name], enumerable: true });
  };
  var __copyProps = (to, from, except, desc) => {
    if (from && typeof from === "object" || typeof from === "function") {
      for (let key of __getOwnPropNames(from))
        if (!__hasOwnProp.call(to, key) && key !== except)
          __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
    }
    return to;
  };
  var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
    // If the importer is in node compatibility mode or this is not an ESM
    // file that has been converted to a CommonJS file using a Babel-
    // compatible transform (i.e. "__esModule" has not been set), then set
    // "default" to the CommonJS "module.exports" for node compatibility.
    isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
    mod
  ));
  var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);

  // package-external:@wordpress/data
  var require_data = __commonJS({
    "package-external:@wordpress/data"(exports, module) {
      module.exports = window.wp.data;
    }
  });

  // package-external:@wordpress/keycodes
  var require_keycodes = __commonJS({
    "package-external:@wordpress/keycodes"(exports, module) {
      module.exports = window.wp.keycodes;
    }
  });

  // package-external:@wordpress/element
  var require_element = __commonJS({
    "package-external:@wordpress/element"(exports, module) {
      module.exports = window.wp.element;
    }
  });

  // vendor-external:react/jsx-runtime
  var require_jsx_runtime = __commonJS({
    "vendor-external:react/jsx-runtime"(exports, module) {
      module.exports = window.ReactJSXRuntime;
    }
  });

  // packages/keyboard-shortcuts/build-module/index.mjs
  var index_exports = {};
  __export(index_exports, {
    ShortcutProvider: () => ShortcutProvider,
    __unstableUseShortcutEventMatch: () => useShortcutEventMatch,
    store: () => store,
    useShortcut: () => useShortcut
  });

  // packages/keyboard-shortcuts/build-module/store/index.mjs
  var import_data2 = __toESM(require_data(), 1);

  // packages/keyboard-shortcuts/build-module/store/reducer.mjs
  function reducer(state = {}, action) {
    switch (action.type) {
      case "REGISTER_SHORTCUT":
        return {
          ...state,
          [action.name]: {
            category: action.category,
            keyCombination: action.keyCombination,
            aliases: action.aliases,
            description: action.description
          }
        };
      case "UNREGISTER_SHORTCUT":
        const { [action.name]: actionName, ...remainingState } = state;
        return remainingState;
    }
    return state;
  }
  var reducer_default = reducer;

  // packages/keyboard-shortcuts/build-module/store/actions.mjs
  var actions_exports = {};
  __export(actions_exports, {
    registerShortcut: () => registerShortcut,
    unregisterShortcut: () => unregisterShortcut
  });
  function registerShortcut({
    name,
    category,
    description,
    keyCombination,
    aliases
  }) {
    return {
      type: "REGISTER_SHORTCUT",
      name,
      category,
      keyCombination,
      aliases,
      description
    };
  }
  function unregisterShortcut(name) {
    return {
      type: "UNREGISTER_SHORTCUT",
      name
    };
  }

  // packages/keyboard-shortcuts/build-module/store/selectors.mjs
  var selectors_exports = {};
  __export(selectors_exports, {
    getAllShortcutKeyCombinations: () => getAllShortcutKeyCombinations,
    getAllShortcutRawKeyCombinations: () => getAllShortcutRawKeyCombinations,
    getCategoryShortcuts: () => getCategoryShortcuts,
    getShortcutAliases: () => getShortcutAliases,
    getShortcutDescription: () => getShortcutDescription,
    getShortcutKeyCombination: () => getShortcutKeyCombination,
    getShortcutRepresentation: () => getShortcutRepresentation
  });
  var import_data = __toESM(require_data(), 1);
  var import_keycodes = __toESM(require_keycodes(), 1);
  var EMPTY_ARRAY = [];
  var FORMATTING_METHODS = {
    /**
     * Display formatting.
     */
    display: import_keycodes.displayShortcut,
    /**
     * Raw shortcut formatting.
     */
    raw: import_keycodes.rawShortcut,
    /**
     * ARIA label formatting.
     */
    ariaLabel: import_keycodes.shortcutAriaLabel
  };
  function getKeyCombinationRepresentation(shortcut, representation) {
    if (!shortcut) {
      return null;
    }
    return shortcut.modifier ? FORMATTING_METHODS[representation][shortcut.modifier](
      shortcut.character
    ) : shortcut.character;
  }
  function getShortcutKeyCombination(state, name) {
    return state[name] ? state[name].keyCombination : null;
  }
  function getShortcutRepresentation(state, name, representation = "display") {
    const shortcut = getShortcutKeyCombination(state, name);
    return getKeyCombinationRepresentation(shortcut, representation);
  }
  function getShortcutDescription(state, name) {
    return state[name] ? state[name].description : null;
  }
  function getShortcutAliases(state, name) {
    return state[name] && state[name].aliases ? state[name].aliases : EMPTY_ARRAY;
  }
  var getAllShortcutKeyCombinations = (0, import_data.createSelector)(
    (state, name) => {
      return [
        getShortcutKeyCombination(state, name),
        ...getShortcutAliases(state, name)
      ].filter(
        (combination) => !!combination
      );
    },
    (state, name) => [state[name]]
  );
  var getAllShortcutRawKeyCombinations = (0, import_data.createSelector)(
    (state, name) => {
      return getAllShortcutKeyCombinations(state, name).map(
        (combination) => getKeyCombinationRepresentation(combination, "raw")
      );
    },
    (state, name) => [state[name]]
  );
  var getCategoryShortcuts = (0, import_data.createSelector)(
    (state, categoryName) => {
      return Object.entries(state).filter(([, shortcut]) => shortcut.category === categoryName).map(([name]) => name);
    },
    (state) => [state]
  );

  // packages/keyboard-shortcuts/build-module/store/index.mjs
  var STORE_NAME = "core/keyboard-shortcuts";
  var store = (0, import_data2.createReduxStore)(STORE_NAME, {
    reducer: reducer_default,
    actions: actions_exports,
    selectors: selectors_exports
  });
  (0, import_data2.register)(store);

  // packages/keyboard-shortcuts/build-module/hooks/use-shortcut.mjs
  var import_element3 = __toESM(require_element(), 1);

  // packages/keyboard-shortcuts/build-module/hooks/use-shortcut-event-match.mjs
  var import_data3 = __toESM(require_data(), 1);
  var import_element = __toESM(require_element(), 1);
  var import_keycodes2 = __toESM(require_keycodes(), 1);
  function useShortcutEventMatch() {
    const { getAllShortcutKeyCombinations: getAllShortcutKeyCombinations2 } = (0, import_data3.useSelect)(
      store
    );
    return (0, import_element.useCallback)(
      (name, event) => {
        return getAllShortcutKeyCombinations2(name).some(
          (combination) => {
            if (!combination) {
              return false;
            }
            return import_keycodes2.isKeyboardEvent[combination.modifier ?? "undefined"](event, combination.character);
          }
        );
      },
      [getAllShortcutKeyCombinations2]
    );
  }

  // packages/keyboard-shortcuts/build-module/context.mjs
  var import_element2 = __toESM(require_element(), 1);
  var globalShortcuts = /* @__PURE__ */ new Set();
  var globalListener = (event) => {
    for (const keyboardShortcut of globalShortcuts) {
      keyboardShortcut(event);
    }
  };
  var context = (0, import_element2.createContext)({
    add: (shortcut) => {
      if (globalShortcuts.size === 0) {
        document.addEventListener("keydown", globalListener);
      }
      globalShortcuts.add(shortcut);
    },
    delete: (shortcut) => {
      globalShortcuts.delete(shortcut);
      if (globalShortcuts.size === 0) {
        document.removeEventListener("keydown", globalListener);
      }
    }
  });
  context.displayName = "KeyboardShortcutsContext";

  // packages/keyboard-shortcuts/build-module/hooks/use-shortcut.mjs
  function useShortcut(name, callback, { isDisabled = false } = {}) {
    const shortcuts = (0, import_element3.useContext)(context);
    const isMatch = useShortcutEventMatch();
    const callbackRef = (0, import_element3.useRef)();
    (0, import_element3.useEffect)(() => {
      callbackRef.current = callback;
    }, [callback]);
    (0, import_element3.useEffect)(() => {
      if (isDisabled) {
        return;
      }
      function _callback(event) {
        if (isMatch(name, event) && callbackRef.current) {
          callbackRef.current(event);
        }
      }
      shortcuts.add(_callback);
      return () => {
        shortcuts.delete(_callback);
      };
    }, [name, isDisabled, shortcuts, isMatch]);
  }

  // packages/keyboard-shortcuts/build-module/components/shortcut-provider.mjs
  var import_element4 = __toESM(require_element(), 1);
  var import_jsx_runtime = __toESM(require_jsx_runtime(), 1);
  var { Provider } = context;
  function ShortcutProvider(props) {
    const [keyboardShortcuts] = (0, import_element4.useState)(
      () => /* @__PURE__ */ new Set()
    );
    function onKeyDown(event) {
      if (props.onKeyDown) {
        props.onKeyDown(event);
      }
      const nativeEvent = event.nativeEvent;
      for (const keyboardShortcut of keyboardShortcuts) {
        keyboardShortcut(nativeEvent);
      }
    }
    return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(Provider, { value: keyboardShortcuts, children: /* @__PURE__ */ (0, import_jsx_runtime.jsx)("div", { ...props, onKeyDown }) });
  }
  return __toCommonJS(index_exports);
})();
//# sourceMappingURL=index.js.map
