@docsearch/core
Advanced tools
+12
-2
@@ -118,4 +118,14 @@ import React, { JSX } from 'react'; | ||
| onClose: () => void; | ||
| /** | ||
| * Deprecated: Still here for backwards compat. | ||
| * | ||
| * @deprecated | ||
| */ | ||
| onInput?: (event: KeyboardEvent) => void; | ||
| searchButtonRef: React.RefObject<HTMLButtonElement | null>; | ||
| /** | ||
| * Deprecated: Still here for backwards compat. | ||
| * | ||
| * @deprecated | ||
| */ | ||
| searchButtonRef?: React.RefObject<HTMLButtonElement | null>; | ||
| isAskAiActive: boolean; | ||
@@ -125,5 +135,5 @@ onAskAiToggle: (toggle: boolean) => void; | ||
| } | ||
| declare function useDocSearchKeyboardEvents({ isOpen, isAskAiActive, onAskAiToggle, onClose, onOpen, onInput, searchButtonRef, keyboardShortcuts, }: UseDocSearchKeyboardEventsProps): void; | ||
| declare function useDocSearchKeyboardEvents({ isOpen, isAskAiActive, onAskAiToggle, onClose, onOpen, keyboardShortcuts, }: UseDocSearchKeyboardEventsProps): void; | ||
| export { DEFAULT_KEYBOARD_SHORTCUTS, DocSearch, useDocSearch, useDocSearchKeyboardEvents, useKeyboardShortcuts, useTheme }; | ||
| export type { DocSearchCallbacks, DocSearchContext, DocSearchModalShortcuts, DocSearchProps, DocSearchRef, DocSearchState, DocSearchTheme, InitialAskAiMessage, KeyboardShortcuts, OnAskAiToggle, SidepanelShortcuts, UseDocSearchKeyboardEventsProps, UseThemeProps, View }; |
@@ -1,1 +0,1 @@ | ||
| import e,{useEffect as t}from"react";function n(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function r(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach(function(t){r(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,a,i,u=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t);else for(;!(c=(r=a.call(n)).done)&&(u.push(r.value),u.length!==t);c=!0);}catch(e){l=!0,o=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(l)throw o}}return u}}(e,t)||function(e,t){if(e){if("string"==typeof e)return n(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?n(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var u={"Ctrl/Cmd+K":!0,"/":!0,"Ctrl/Cmd+I":!0};function c(e){return a(a({},u),e)}function l(t){var n=t.isOpen,r=t.isAskAiActive,o=t.onAskAiToggle,a=t.onClose,i=t.onOpen,c=t.onInput,l=t.searchButtonRef,s=t.keyboardShortcuts,d=void 0===s?u:s;e.useEffect(function(){function e(e){var t;if(n&&"Escape"===e.code&&r)o(!1);else{var u=d["Ctrl/Cmd+K"]&&"k"===(null===(t=e.key)||void 0===t?void 0:t.toLowerCase())&&(e.metaKey||e.ctrlKey),s=d["/"]&&"/"===e.key;if("Escape"===e.code&&n||u||!function(e){var t=e.composedPath()[0],n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&s&&!n)return e.preventDefault(),void(n?a():document.body.classList.contains("DocSearch--active")||i());l&&l.current===document.activeElement&&c&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&c(e)}}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}},[n,r,l,d,i,a,c,o])}var s=function(e){var n=e.theme;t(function(){if(n){var e=document.documentElement.dataset.theme;if(n!==e)return document.documentElement.dataset.theme=n,function(){void 0===e?delete document.documentElement.dataset.theme:document.documentElement.dataset.theme=e}}},[n])},d=["children","theme","onReady","onOpen","onClose","onSidepanelOpen","onSidepanelClose"],f=e.createContext(void 0);f.displayName="DocSearchContext";var m=e.forwardRef(function(t,n){var r=t.children,o=t.theme,a=t.onReady,u=t.onOpen,m=t.onClose,p=t.onSidepanelOpen,v=t.onSidepanelClose,y=function(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(-1!==t.indexOf(r))continue;n[r]=e[r]}return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],-1===t.indexOf(n)&&{}.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(t,d),h=i(e.useState("ready"),2),b=h[0],S=h[1],O=i(e.useState(y.initialQuery||""),2),w=O[0],g=O[1],k=e.useRef(null),A=c(y.keyboardShortcuts),C=i(e.useState(),2),E=C[0],j=C[1],P=i(e.useState(function(){return new Set}),2),D=P[0],R=P[1],x=function(){var t=i(e.useState(!1),2),n=t[0],r=t[1];return e.useEffect(function(){var e=function(){var e=window.matchMedia("(max-width: 768px)");r(e.matches)};return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}},[]),n}(),I=e.useRef("ready"),T=["modal-search","modal-askai"].includes(b),M="modal-askai"===b,L=D.has("sidepanel"),N="sidepanel"===b;e.useEffect(function(){null==a||a()},[a]),e.useEffect(function(){var e=I.current,t=b;"modal-search"!==t&&"modal-askai"!==t||"modal-search"===e||"modal-askai"===e||null==u||u(),"ready"!==t||"modal-search"!==e&&"modal-askai"!==e||null==m||m(),"sidepanel"===t&&"sidepanel"!==e&&(null==p||p()),"sidepanel"!==t&&"sidepanel"===e&&(null==v||v()),I.current=t},[b,u,m,p,v]);var K=e.useCallback(function(){S("modal-search")},[]),Q=e.useCallback(function(){var e;S("ready"),g(null!==(e=y.initialQuery)&&void 0!==e?e:"")},[S,y.initialQuery]),z=e.useCallback(function(e,t){if(!x&&e&&L)return j(t),void S("sidepanel");S(e?"modal-askai":"modal-search")},[S,x,L]),B=e.useCallback(function(e){D.has("sidepanel")&&(j(e),S("sidepanel"))},[S,D]),H=e.useCallback(function(e){S("modal-search"),g(e.key)},[S,g]),U=e.useCallback(function(e){D.has(e)||R(function(t){var n=new Set(t);return n.add(e),n})},[D]);e.useImperativeHandle(n,function(){return{open:K,close:Q,openAskAi:function(e){return z(!0,e)},openSidepanel:B,get isReady(){return!0},get isOpen(){return T},get isSidepanelOpen(){return N},get isSidepanelSupported(){return L}}},[K,Q,z,B,T,N,L]),s({theme:o}),l({isOpen:T,onOpen:K,onClose:Q,onAskAiToggle:z,onInput:H,isAskAiActive:M,searchButtonRef:k,keyboardShortcuts:A});var V=e.useMemo(function(){return{docsearchState:b,setDocsearchState:S,searchButtonRef:k,initialQuery:w,keyboardShortcuts:A,openModal:K,closeModal:Q,isAskAiActive:M,isModalActive:T,onAskAiToggle:z,initialAskAiMessage:E,registerView:U,isHybridModeSupported:L}},[b,k,w,A,K,Q,M,T,z,E,U,L]);return e.createElement(f.Provider,{value:V},r)});function p(){var t=e.useContext(f);if(void 0===t)throw new Error("`useDocSearch` must be used within the `DocSearch` provider");return t}m.displayName="DocSearch";export{u as DEFAULT_KEYBOARD_SHORTCUTS,m as DocSearch,p as useDocSearch,l as useDocSearchKeyboardEvents,c as useKeyboardShortcuts,s as useTheme}; | ||
| import e,{useEffect as t}from"react";function n(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function r(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach(function(t){r(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,a,i,u=[],l=!0,c=!1;try{if(a=(n=n.call(e)).next,0===t);else for(;!(l=(r=a.call(n)).done)&&(u.push(r.value),u.length!==t);l=!0);}catch(e){c=!0,o=e}finally{try{if(!l&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(c)throw o}}return u}}(e,t)||function(e,t){if(e){if("string"==typeof e)return n(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?n(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var u={"Ctrl/Cmd+K":!0,"/":!0,"Ctrl/Cmd+I":!0};function l(e){return a(a({},u),e)}function c(t){var n=t.isOpen,r=t.isAskAiActive,o=t.onAskAiToggle,a=t.onClose,i=t.onOpen,l=t.keyboardShortcuts,c=void 0===l?u:l;e.useEffect(function(){function e(e){var t;if(n&&"Escape"===e.code&&r)o(!1);else{var u=c["Ctrl/Cmd+K"]&&"k"===(null===(t=e.key)||void 0===t?void 0:t.toLowerCase())&&(e.metaKey||e.ctrlKey),l=c["/"]&&"/"===e.key;("Escape"===e.code&&n||u||!function(e){var t=e.composedPath()[0],n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&l&&!n)&&(e.preventDefault(),n?a():document.body.classList.contains("DocSearch--active")||i())}}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}},[n,r,c,i,a,o])}var s=function(e){var n=e.theme;t(function(){if(n){var e=document.documentElement.dataset.theme;if(n!==e)return document.documentElement.dataset.theme=n,function(){void 0===e?delete document.documentElement.dataset.theme:document.documentElement.dataset.theme=e}}},[n])},d=["children","theme","onReady","onOpen","onClose","onSidepanelOpen","onSidepanelClose"],f=e.createContext(void 0);f.displayName="DocSearchContext";var p=e.forwardRef(function(t,n){var r=t.children,o=t.theme,a=t.onReady,u=t.onOpen,p=t.onClose,m=t.onSidepanelOpen,v=t.onSidepanelClose,y=function(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(-1!==t.indexOf(r))continue;n[r]=e[r]}return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],-1===t.indexOf(n)&&{}.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(t,d),h=i(e.useState("ready"),2),b=h[0],S=h[1],O=i(e.useState(y.initialQuery||""),2),w=O[0],g=O[1],k=e.useRef(null),A=l(y.keyboardShortcuts),E=i(e.useState(),2),C=E[0],j=E[1],P=i(e.useState(function(){return new Set}),2),D=P[0],x=P[1],R=function(){var t=i(e.useState(!1),2),n=t[0],r=t[1];return e.useEffect(function(){var e=function(){var e=window.matchMedia("(max-width: 768px)");r(e.matches)};return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}},[]),n}(),T=e.useRef("ready"),I=["modal-search","modal-askai"].includes(b),M="modal-askai"===b,L=!R&&D.has("sidepanel"),N="sidepanel"===b;e.useEffect(function(){null==a||a()},[a]),e.useEffect(function(){var e=T.current,t=b;"modal-search"!==t&&"modal-askai"!==t||"modal-search"===e||"modal-askai"===e||null==u||u(),"ready"!==t||"modal-search"!==e&&"modal-askai"!==e||null==p||p(),"sidepanel"===t&&"sidepanel"!==e&&(null==m||m()),"sidepanel"!==t&&"sidepanel"===e&&(null==v||v()),T.current=t},[b,u,p,m,v]);var K=e.useCallback(function(){S("modal-search")},[]),Q=e.useCallback(function(){var e,t;S("ready"),null===(e=k.current)||void 0===e||e.focus(),g(null!==(t=y.initialQuery)&&void 0!==t?t:"")},[S,y.initialQuery]),z=e.useCallback(function(e,t){if(!R&&e&&L)return j(t),void S("sidepanel");S(e?"modal-askai":"modal-search")},[S,R,L]),B=e.useCallback(function(e){D.has("sidepanel")&&(j(e),S("sidepanel"))},[S,D]),H=e.useCallback(function(e){S("modal-search"),g(e.key)},[S,g]),U=e.useCallback(function(e){D.has(e)||x(function(t){var n=new Set(t);return n.add(e),n})},[D]);e.useImperativeHandle(n,function(){return{open:K,close:Q,openAskAi:function(e){return z(!0,e)},openSidepanel:B,get isReady(){return!0},get isOpen(){return I},get isSidepanelOpen(){return N},get isSidepanelSupported(){return L}}},[K,Q,z,B,I,N,L]),s({theme:o}),c({isOpen:I,onOpen:K,onClose:Q,onAskAiToggle:z,onInput:H,isAskAiActive:M,searchButtonRef:k,keyboardShortcuts:A});var V=e.useMemo(function(){return{docsearchState:b,setDocsearchState:S,searchButtonRef:k,initialQuery:w,keyboardShortcuts:A,openModal:K,closeModal:Q,isAskAiActive:M,isModalActive:I,onAskAiToggle:z,initialAskAiMessage:C,registerView:U,isHybridModeSupported:L}},[b,k,w,A,K,Q,M,I,z,C,U,L]);return e.createElement(f.Provider,{value:V},r)});function m(){var t=e.useContext(f);if(void 0===t)throw new Error("`useDocSearch` must be used within the `DocSearch` provider");return t}p.displayName="DocSearch";export{u as DEFAULT_KEYBOARD_SHORTCUTS,p as DocSearch,m as useDocSearch,c as useDocSearchKeyboardEvents,l as useKeyboardShortcuts,s as useTheme}; |
@@ -31,4 +31,14 @@ import React from 'react'; | ||
| onClose: () => void; | ||
| /** | ||
| * Deprecated: Still here for backwards compat. | ||
| * | ||
| * @deprecated | ||
| */ | ||
| onInput?: (event: KeyboardEvent) => void; | ||
| searchButtonRef: React.RefObject<HTMLButtonElement | null>; | ||
| /** | ||
| * Deprecated: Still here for backwards compat. | ||
| * | ||
| * @deprecated | ||
| */ | ||
| searchButtonRef?: React.RefObject<HTMLButtonElement | null>; | ||
| isAskAiActive: boolean; | ||
@@ -38,5 +48,5 @@ onAskAiToggle: (toggle: boolean) => void; | ||
| } | ||
| declare function useDocSearchKeyboardEvents({ isOpen, isAskAiActive, onAskAiToggle, onClose, onOpen, onInput, searchButtonRef, keyboardShortcuts, }: UseDocSearchKeyboardEventsProps): void; | ||
| declare function useDocSearchKeyboardEvents({ isOpen, isAskAiActive, onAskAiToggle, onClose, onOpen, keyboardShortcuts, }: UseDocSearchKeyboardEventsProps): void; | ||
| export { useDocSearchKeyboardEvents }; | ||
| export type { UseDocSearchKeyboardEventsProps }; |
@@ -1,1 +0,1 @@ | ||
| import e from"react";var t={"Ctrl/Cmd+K":!0,"/":!0,"Ctrl/Cmd+I":!0};function o(o){var n=o.isOpen,r=o.isAskAiActive,i=o.onAskAiToggle,a=o.onClose,c=o.onOpen,d=o.onInput,s=o.searchButtonRef,u=o.keyboardShortcuts,v=void 0===u?t:u;e.useEffect(function(){function e(e){var t;if(n&&"Escape"===e.code&&r)i(!1);else{var o=v["Ctrl/Cmd+K"]&&"k"===(null===(t=e.key)||void 0===t?void 0:t.toLowerCase())&&(e.metaKey||e.ctrlKey),u=v["/"]&&"/"===e.key;if("Escape"===e.code&&n||o||!function(e){var t=e.composedPath()[0],o=t.tagName;return t.isContentEditable||"INPUT"===o||"SELECT"===o||"TEXTAREA"===o}(e)&&u&&!n)return e.preventDefault(),void(n?a():document.body.classList.contains("DocSearch--active")||c());s&&s.current===document.activeElement&&d&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&d(e)}}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}},[n,r,s,v,c,a,d,i])}export{o as useDocSearchKeyboardEvents}; | ||
| import e from"react";var t={"Ctrl/Cmd+K":!0,"/":!0,"Ctrl/Cmd+I":!0};function o(o){var n=o.isOpen,r=o.isAskAiActive,i=o.onAskAiToggle,a=o.onClose,c=o.onOpen,d=o.keyboardShortcuts,s=void 0===d?t:d;e.useEffect(function(){function e(e){var t;if(n&&"Escape"===e.code&&r)i(!1);else{var o=s["Ctrl/Cmd+K"]&&"k"===(null===(t=e.key)||void 0===t?void 0:t.toLowerCase())&&(e.metaKey||e.ctrlKey),d=s["/"]&&"/"===e.key;("Escape"===e.code&&n||o||!function(e){var t=e.composedPath()[0],o=t.tagName;return t.isContentEditable||"INPUT"===o||"SELECT"===o||"TEXTAREA"===o}(e)&&d&&!n)&&(e.preventDefault(),n?a():document.body.classList.contains("DocSearch--active")||c())}}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}},[n,r,s,c,a,i])}export{o as useDocSearchKeyboardEvents}; |
@@ -1,3 +0,3 @@ | ||
| /*! @docsearch/core 4.5.0-beta.0 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */ | ||
| !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react")):"function"==typeof define&&define.amd?define(["exports","react"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).DocSearchCore={},e.React)}(this,function(e,t){"use strict";function n(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function r(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach(function(t){r(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,a,i,u=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t);else for(;!(c=(r=a.call(n)).done)&&(u.push(r.value),u.length!==t);c=!0);}catch(e){l=!0,o=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(l)throw o}}return u}}(e,t)||function(e,t){if(e){if("string"==typeof e)return n(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?n(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var u={"Ctrl/Cmd+K":!0,"/":!0,"Ctrl/Cmd+I":!0};function c(e){return a(a({},u),e)}function l(e){var n=e.isOpen,r=e.isAskAiActive,o=e.onAskAiToggle,a=e.onClose,i=e.onOpen,c=e.onInput,l=e.searchButtonRef,s=e.keyboardShortcuts,d=void 0===s?u:s;t.useEffect(function(){function e(e){var t;if(n&&"Escape"===e.code&&r)o(!1);else{var u=d["Ctrl/Cmd+K"]&&"k"===(null===(t=e.key)||void 0===t?void 0:t.toLowerCase())&&(e.metaKey||e.ctrlKey),s=d["/"]&&"/"===e.key;if("Escape"===e.code&&n||u||!function(e){var t=e.composedPath()[0],n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&s&&!n)return e.preventDefault(),void(n?a():document.body.classList.contains("DocSearch--active")||i());l&&l.current===document.activeElement&&c&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&c(e)}}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}},[n,r,l,d,i,a,c,o])}var s=function(e){var n=e.theme;t.useEffect(function(){if(n){var e=document.documentElement.dataset.theme;if(n!==e)return document.documentElement.dataset.theme=n,function(){void 0===e?delete document.documentElement.dataset.theme:document.documentElement.dataset.theme=e}}},[n])},d=["children","theme","onReady","onOpen","onClose","onSidepanelOpen","onSidepanelClose"],f=t.createContext(void 0);f.displayName="DocSearchContext";var p=t.forwardRef(function(e,n){var r=e.children,o=e.theme,a=e.onReady,u=e.onOpen,p=e.onClose,m=e.onSidepanelOpen,y=e.onSidepanelClose,v=function(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(-1!==t.indexOf(r))continue;n[r]=e[r]}return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],-1===t.indexOf(n)&&{}.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,d),h=i(t.useState("ready"),2),b=h[0],S=h[1],O=i(t.useState(v.initialQuery||""),2),g=O[0],w=O[1],k=t.useRef(null),A=c(v.keyboardShortcuts),E=i(t.useState(),2),C=E[0],j=E[1],D=i(t.useState(function(){return new Set}),2),P=D[0],T=D[1],R=function(){var e=i(t.useState(!1),2),n=e[0],r=e[1];return t.useEffect(function(){var e=function(){var e=window.matchMedia("(max-width: 768px)");r(e.matches)};return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}},[]),n}(),x=t.useRef("ready"),I=["modal-search","modal-askai"].includes(b),L="modal-askai"===b,M=P.has("sidepanel"),K="sidepanel"===b;t.useEffect(function(){null==a||a()},[a]),t.useEffect(function(){var e=x.current,t=b;"modal-search"!==t&&"modal-askai"!==t||"modal-search"===e||"modal-askai"===e||null==u||u(),"ready"!==t||"modal-search"!==e&&"modal-askai"!==e||null==p||p(),"sidepanel"===t&&"sidepanel"!==e&&(null==m||m()),"sidepanel"!==t&&"sidepanel"===e&&(null==y||y()),x.current=t},[b,u,p,m,y]);var N=t.useCallback(function(){S("modal-search")},[]),B=t.useCallback(function(){var e;S("ready"),w(null!==(e=v.initialQuery)&&void 0!==e?e:"")},[S,v.initialQuery]),Q=t.useCallback(function(e,t){if(!R&&e&&M)return j(t),void S("sidepanel");S(e?"modal-askai":"modal-search")},[S,R,M]),U=t.useCallback(function(e){P.has("sidepanel")&&(j(e),S("sidepanel"))},[S,P]),z=t.useCallback(function(e){S("modal-search"),w(e.key)},[S,w]),H=t.useCallback(function(e){P.has(e)||T(function(t){var n=new Set(t);return n.add(e),n})},[P]);t.useImperativeHandle(n,function(){return{open:N,close:B,openAskAi:function(e){return Q(!0,e)},openSidepanel:U,get isReady(){return!0},get isOpen(){return I},get isSidepanelOpen(){return K},get isSidepanelSupported(){return M}}},[N,B,Q,U,I,K,M]),s({theme:o}),l({isOpen:I,onOpen:N,onClose:B,onAskAiToggle:Q,onInput:z,isAskAiActive:L,searchButtonRef:k,keyboardShortcuts:A});var _=t.useMemo(function(){return{docsearchState:b,setDocsearchState:S,searchButtonRef:k,initialQuery:g,keyboardShortcuts:A,openModal:N,closeModal:B,isAskAiActive:L,isModalActive:I,onAskAiToggle:Q,initialAskAiMessage:C,registerView:H,isHybridModeSupported:M}},[b,k,g,A,N,B,L,I,Q,C,H,M]);return t.createElement(f.Provider,{value:_},r)});p.displayName="DocSearch",e.DEFAULT_KEYBOARD_SHORTCUTS=u,e.DocSearch=p,e.useDocSearch=function(){var e=t.useContext(f);if(void 0===e)throw new Error("`useDocSearch` must be used within the `DocSearch` provider");return e},e.useDocSearchKeyboardEvents=l,e.useKeyboardShortcuts=c,e.useTheme=s}); | ||
| /*! @docsearch/core 4.5.0-beta.1 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */ | ||
| !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react")):"function"==typeof define&&define.amd?define(["exports","react"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).DocSearchCore={},e.React)}(this,function(e,t){"use strict";function n(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n<t;n++)r[n]=e[n];return r}function r(e,t,n){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t||"default");if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function o(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),n.push.apply(n,r)}return n}function a(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?o(Object(n),!0).forEach(function(t){r(e,t,n[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):o(Object(n)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))})}return e}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,o,a,i,u=[],c=!0,l=!1;try{if(a=(n=n.call(e)).next,0===t);else for(;!(c=(r=a.call(n)).done)&&(u.push(r.value),u.length!==t);c=!0);}catch(e){l=!0,o=e}finally{try{if(!c&&null!=n.return&&(i=n.return(),Object(i)!==i))return}finally{if(l)throw o}}return u}}(e,t)||function(e,t){if(e){if("string"==typeof e)return n(e,t);var r={}.toString.call(e).slice(8,-1);return"Object"===r&&e.constructor&&(r=e.constructor.name),"Map"===r||"Set"===r?Array.from(e):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?n(e,t):void 0}}(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}var u={"Ctrl/Cmd+K":!0,"/":!0,"Ctrl/Cmd+I":!0};function c(e){return a(a({},u),e)}function l(e){var n=e.isOpen,r=e.isAskAiActive,o=e.onAskAiToggle,a=e.onClose,i=e.onOpen,c=e.keyboardShortcuts,l=void 0===c?u:c;t.useEffect(function(){function e(e){var t;if(n&&"Escape"===e.code&&r)o(!1);else{var u=l["Ctrl/Cmd+K"]&&"k"===(null===(t=e.key)||void 0===t?void 0:t.toLowerCase())&&(e.metaKey||e.ctrlKey),c=l["/"]&&"/"===e.key;("Escape"===e.code&&n||u||!function(e){var t=e.composedPath()[0],n=t.tagName;return t.isContentEditable||"INPUT"===n||"SELECT"===n||"TEXTAREA"===n}(e)&&c&&!n)&&(e.preventDefault(),n?a():document.body.classList.contains("DocSearch--active")||i())}}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}},[n,r,l,i,a,o])}var s=function(e){var n=e.theme;t.useEffect(function(){if(n){var e=document.documentElement.dataset.theme;if(n!==e)return document.documentElement.dataset.theme=n,function(){void 0===e?delete document.documentElement.dataset.theme:document.documentElement.dataset.theme=e}}},[n])},d=["children","theme","onReady","onOpen","onClose","onSidepanelOpen","onSidepanelClose"],f=t.createContext(void 0);f.displayName="DocSearchContext";var p=t.forwardRef(function(e,n){var r=e.children,o=e.theme,a=e.onReady,u=e.onOpen,p=e.onClose,m=e.onSidepanelOpen,y=e.onSidepanelClose,v=function(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n={};for(var r in e)if({}.hasOwnProperty.call(e,r)){if(-1!==t.indexOf(r))continue;n[r]=e[r]}return n}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],-1===t.indexOf(n)&&{}.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}(e,d),h=i(t.useState("ready"),2),b=h[0],S=h[1],O=i(t.useState(v.initialQuery||""),2),w=O[0],g=O[1],k=t.useRef(null),A=c(v.keyboardShortcuts),E=i(t.useState(),2),C=E[0],j=E[1],D=i(t.useState(function(){return new Set}),2),P=D[0],T=D[1],R=function(){var e=i(t.useState(!1),2),n=e[0],r=e[1];return t.useEffect(function(){var e=function(){var e=window.matchMedia("(max-width: 768px)");r(e.matches)};return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}},[]),n}(),x=t.useRef("ready"),I=["modal-search","modal-askai"].includes(b),L="modal-askai"===b,M=!R&&P.has("sidepanel"),K="sidepanel"===b;t.useEffect(function(){null==a||a()},[a]),t.useEffect(function(){var e=x.current,t=b;"modal-search"!==t&&"modal-askai"!==t||"modal-search"===e||"modal-askai"===e||null==u||u(),"ready"!==t||"modal-search"!==e&&"modal-askai"!==e||null==p||p(),"sidepanel"===t&&"sidepanel"!==e&&(null==m||m()),"sidepanel"!==t&&"sidepanel"===e&&(null==y||y()),x.current=t},[b,u,p,m,y]);var N=t.useCallback(function(){S("modal-search")},[]),Q=t.useCallback(function(){var e,t;S("ready"),null===(e=k.current)||void 0===e||e.focus(),g(null!==(t=v.initialQuery)&&void 0!==t?t:"")},[S,v.initialQuery]),U=t.useCallback(function(e,t){if(!R&&e&&M)return j(t),void S("sidepanel");S(e?"modal-askai":"modal-search")},[S,R,M]),B=t.useCallback(function(e){P.has("sidepanel")&&(j(e),S("sidepanel"))},[S,P]),H=t.useCallback(function(e){S("modal-search"),g(e.key)},[S,g]),z=t.useCallback(function(e){P.has(e)||T(function(t){var n=new Set(t);return n.add(e),n})},[P]);t.useImperativeHandle(n,function(){return{open:N,close:Q,openAskAi:function(e){return U(!0,e)},openSidepanel:B,get isReady(){return!0},get isOpen(){return I},get isSidepanelOpen(){return K},get isSidepanelSupported(){return M}}},[N,Q,U,B,I,K,M]),s({theme:o}),l({isOpen:I,onOpen:N,onClose:Q,onAskAiToggle:U,onInput:H,isAskAiActive:L,searchButtonRef:k,keyboardShortcuts:A});var _=t.useMemo(function(){return{docsearchState:b,setDocsearchState:S,searchButtonRef:k,initialQuery:w,keyboardShortcuts:A,openModal:N,closeModal:Q,isAskAiActive:L,isModalActive:I,onAskAiToggle:U,initialAskAiMessage:C,registerView:z,isHybridModeSupported:M}},[b,k,w,A,N,Q,L,I,U,C,z,M]);return t.createElement(f.Provider,{value:_},r)});p.displayName="DocSearch",e.DEFAULT_KEYBOARD_SHORTCUTS=u,e.DocSearch=p,e.useDocSearch=function(){var e=t.useContext(f);if(void 0===e)throw new Error("`useDocSearch` must be used within the `DocSearch` provider");return e},e.useDocSearchKeyboardEvents=l,e.useKeyboardShortcuts=c,e.useTheme=s}); | ||
| //# sourceMappingURL=index.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"index.js","sources":["../../src/useKeyboardShortcuts.ts","../../src/useDocSearchKeyboardEvents.ts","../../src/useIsMobile.ts","../../src/useTheme.ts","../../src/DocSearch.tsx"],"sourcesContent":["export interface DocSearchModalShortcuts {\n /**\n * Enable/disable the Ctrl/Cmd+K shortcut to toggle the DocSearch modal.\n *\n * @default true\n */\n 'Ctrl/Cmd+K'?: boolean;\n /**\n * Enable/disable the / shortcut to open the DocSearch modal.\n *\n * @default true\n */\n '/'?: boolean;\n}\n\nexport interface SidepanelShortcuts {\n /**\n * Enable/disable the Ctrl/Cmd+I shortcut to toggle the DocSearch sidepanel.\n *\n * @default true\n */\n 'Ctrl/Cmd+I'?: boolean;\n}\n\nexport type KeyboardShortcuts = DocSearchModalShortcuts & SidepanelShortcuts;\n\n/**\n * Default keyboard shortcuts configuration for DocSearch.\n * These values are used when no keyboardShortcuts prop is provided\n * or when specific shortcuts are not configured.\n */\nexport const DEFAULT_KEYBOARD_SHORTCUTS: Required<KeyboardShortcuts> = {\n 'Ctrl/Cmd+K': true,\n '/': true,\n 'Ctrl/Cmd+I': true,\n} as const;\n\n/**\n * Merges user-provided keyboard shortcuts with defaults.\n *\n * @param userShortcuts - Optional user configuration.\n * @returns Complete keyboard shortcuts configuration with defaults applied.\n */\nexport function useKeyboardShortcuts(userShortcuts?: KeyboardShortcuts): Required<KeyboardShortcuts> {\n return {\n ...DEFAULT_KEYBOARD_SHORTCUTS,\n ...userShortcuts,\n };\n}\n","import React from 'react';\n\nimport { DEFAULT_KEYBOARD_SHORTCUTS, type KeyboardShortcuts } from './useKeyboardShortcuts';\n\nexport interface UseDocSearchKeyboardEventsProps {\n isOpen: boolean;\n onOpen: () => void;\n onClose: () => void;\n onInput?: (event: KeyboardEvent) => void;\n searchButtonRef: React.RefObject<HTMLButtonElement | null>;\n isAskAiActive: boolean;\n onAskAiToggle: (toggle: boolean) => void;\n keyboardShortcuts?: KeyboardShortcuts;\n}\n\nfunction isEditingContent(event: KeyboardEvent): boolean {\n const element = event.composedPath()[0] as HTMLElement;\n const tagName = element.tagName;\n\n return element.isContentEditable || tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA';\n}\n\nexport function useDocSearchKeyboardEvents({\n isOpen,\n isAskAiActive,\n onAskAiToggle,\n onClose,\n onOpen,\n onInput,\n searchButtonRef,\n keyboardShortcuts = DEFAULT_KEYBOARD_SHORTCUTS,\n}: UseDocSearchKeyboardEventsProps): void {\n React.useEffect(() => {\n function onKeyDown(event: KeyboardEvent): void {\n if (isOpen && event.code === 'Escape' && isAskAiActive) {\n onAskAiToggle(false);\n return;\n }\n\n const isCmdK =\n keyboardShortcuts['Ctrl/Cmd+K'] && event.key?.toLowerCase() === 'k' && (event.metaKey || event.ctrlKey);\n const isSlash = keyboardShortcuts['/'] && event.key === '/';\n\n if ((event.code === 'Escape' && isOpen) || isCmdK || (!isEditingContent(event) && isSlash && !isOpen)) {\n event.preventDefault();\n\n if (isOpen) {\n onClose();\n } else if (!document.body.classList.contains('DocSearch--active')) {\n onOpen();\n }\n\n return;\n }\n\n if (searchButtonRef && searchButtonRef.current === document.activeElement && onInput) {\n if (/[a-zA-Z0-9]/.test(String.fromCharCode(event.keyCode))) {\n onInput(event);\n }\n }\n }\n\n window.addEventListener('keydown', onKeyDown);\n\n return (): void => {\n window.removeEventListener('keydown', onKeyDown);\n };\n }, [isOpen, isAskAiActive, searchButtonRef, keyboardShortcuts, onOpen, onClose, onInput, onAskAiToggle]);\n}\n","import React from 'react';\n\nexport const useIsMobile = (): boolean => {\n const [isMobile, setIsMobile] = React.useState(false);\n\n React.useEffect(() => {\n const checkForMobile = (): void => {\n const isMobileMediaQuery = window.matchMedia('(max-width: 768px)');\n\n setIsMobile(isMobileMediaQuery.matches);\n };\n\n checkForMobile();\n\n window.addEventListener('resize', checkForMobile);\n\n return (): void => {\n window.removeEventListener('resize', checkForMobile);\n };\n }, []);\n\n return isMobile;\n};\n","import { useEffect } from 'react';\n\nexport type DocSearchTheme = 'dark' | 'light';\n\nexport interface UseThemeProps {\n theme?: DocSearchTheme;\n}\n\nexport const useTheme = ({ theme }: UseThemeProps): void => {\n useEffect(() => {\n if (!theme) {\n return undefined;\n }\n\n const previousTheme = document.documentElement.dataset.theme;\n\n if (theme === previousTheme) {\n return undefined;\n }\n\n document.documentElement.dataset.theme = theme;\n\n return (): void => {\n if (previousTheme === undefined) {\n delete document.documentElement.dataset.theme;\n } else {\n document.documentElement.dataset.theme = previousTheme;\n }\n };\n }, [theme]);\n};\n","import type { JSX } from 'react';\nimport React from 'react';\n\nimport { useDocSearchKeyboardEvents } from './useDocSearchKeyboardEvents';\nimport { useIsMobile } from './useIsMobile';\nimport { useKeyboardShortcuts } from './useKeyboardShortcuts';\nimport type { KeyboardShortcuts } from './useKeyboardShortcuts.ts';\nimport type { DocSearchTheme } from './useTheme';\nimport { useTheme } from './useTheme';\n\nexport type DocSearchState = 'modal-askai' | 'modal-search' | 'ready' | 'sidepanel';\n\nexport type View = 'modal' | 'sidepanel' | (Record<string, unknown> & string);\n\nexport type InitialAskAiMessage = {\n query: string;\n messageId?: string;\n suggestedQuestionId?: string;\n};\n\nexport type OnAskAiToggle = (active: boolean, initialMessage?: InitialAskAiMessage) => void;\n\n/**\n * Imperative handle exposed by the DocSearch provider for programmatic control.\n */\nexport interface DocSearchRef {\n /** Opens the search modal. */\n open: () => void;\n /** Closes the search modal. */\n close: () => void;\n /** Opens Ask AI mode (sidepanel if available, otherwise modal). */\n openAskAi: (initialMessage?: InitialAskAiMessage) => void;\n /** Opens the sidepanel directly (no-op if sidepanel view not registered). */\n openSidepanel: (initialMessage?: InitialAskAiMessage) => void;\n /** Returns true once the component is mounted and ready. */\n readonly isReady: boolean;\n /** Returns true if the modal is currently open. */\n readonly isOpen: boolean;\n /** Returns true if the sidepanel is currently open. */\n readonly isSidepanelOpen: boolean;\n /** Returns true if sidepanel view is registered (hybrid mode). */\n readonly isSidepanelSupported: boolean;\n}\n\nexport interface DocSearchContext {\n docsearchState: DocSearchState;\n setDocsearchState: (newState: DocSearchState) => void;\n searchButtonRef: React.RefObject<HTMLButtonElement | null>;\n initialQuery: string;\n keyboardShortcuts: Required<KeyboardShortcuts>;\n openModal: () => void;\n closeModal: () => void;\n isAskAiActive: boolean;\n isModalActive: boolean;\n onAskAiToggle: OnAskAiToggle;\n initialAskAiMessage: InitialAskAiMessage | undefined;\n registerView: (view: View) => void;\n isHybridModeSupported: boolean;\n}\n\n/**\n * Lifecycle callbacks for DocSearch.\n */\nexport interface DocSearchCallbacks {\n /** Called once DocSearch is mounted and ready for interaction. */\n onReady?: () => void;\n /** Called when the modal opens. */\n onOpen?: () => void;\n /** Called when the modal closes. */\n onClose?: () => void;\n /** Called when the sidepanel opens. */\n onSidepanelOpen?: () => void;\n /** Called when the sidepanel closes. */\n onSidepanelClose?: () => void;\n}\n\nexport interface DocSearchProps extends DocSearchCallbacks {\n children: Array<JSX.Element | null> | JSX.Element | React.ReactNode | null;\n theme?: DocSearchTheme;\n initialQuery?: string;\n keyboardShortcuts?: KeyboardShortcuts;\n}\n\nconst Context = React.createContext<DocSearchContext | undefined>(undefined);\nContext.displayName = 'DocSearchContext';\n\nfunction DocSearchInner(\n { children, theme, onReady, onOpen, onClose, onSidepanelOpen, onSidepanelClose, ...props }: DocSearchProps,\n ref: React.ForwardedRef<DocSearchRef>,\n): JSX.Element {\n const [docsearchState, setDocsearchState] = React.useState<DocSearchState>('ready');\n const [initialQuery, setInitialQuery] = React.useState<string>(props.initialQuery || '');\n const searchButtonRef = React.useRef<HTMLButtonElement>(null);\n const keyboardShortcuts = useKeyboardShortcuts(props.keyboardShortcuts);\n const [initialAskAiMessage, setInitialAskAiMessage] = React.useState<InitialAskAiMessage>();\n const [registeredViews, setRegisteredViews] = React.useState(() => new Set<View>());\n const isMobile = useIsMobile();\n const prevStateRef = React.useRef<DocSearchState>('ready');\n\n const isModalActive = ['modal-search', 'modal-askai'].includes(docsearchState);\n const isAskAiActive = docsearchState === 'modal-askai';\n const isHybridModeSupported = registeredViews.has('sidepanel');\n const isSidepanelOpen = docsearchState === 'sidepanel';\n\n // Call onReady on mount\n React.useEffect(() => {\n onReady?.();\n }, [onReady]);\n\n // Track state changes for lifecycle callbacks\n React.useEffect(() => {\n const prevState = prevStateRef.current;\n const currentState = docsearchState;\n\n // Modal opened\n if (\n (currentState === 'modal-search' || currentState === 'modal-askai') &&\n prevState !== 'modal-search' &&\n prevState !== 'modal-askai'\n ) {\n onOpen?.();\n }\n\n // Modal closed\n if (currentState === 'ready' && (prevState === 'modal-search' || prevState === 'modal-askai')) {\n onClose?.();\n }\n\n // Sidepanel opened\n if (currentState === 'sidepanel' && prevState !== 'sidepanel') {\n onSidepanelOpen?.();\n }\n\n // Sidepanel closed\n if (currentState !== 'sidepanel' && prevState === 'sidepanel') {\n onSidepanelClose?.();\n }\n\n prevStateRef.current = currentState;\n }, [docsearchState, onOpen, onClose, onSidepanelOpen, onSidepanelClose]);\n\n const openModal = React.useCallback((): void => {\n setDocsearchState('modal-search');\n }, []);\n\n const closeModal = React.useCallback((): void => {\n setDocsearchState('ready');\n setInitialQuery(props.initialQuery ?? '');\n }, [setDocsearchState, props.initialQuery]);\n\n const onAskAiToggle: OnAskAiToggle = React.useCallback(\n (active, initialMessage) => {\n // Don't use hybrid mode on mobile\n if (!isMobile && active && isHybridModeSupported) {\n setInitialAskAiMessage(initialMessage);\n setDocsearchState('sidepanel');\n return;\n }\n\n setDocsearchState(active ? 'modal-askai' : 'modal-search');\n },\n [setDocsearchState, isMobile, isHybridModeSupported],\n );\n\n const openSidepanel = React.useCallback(\n (initialMessage?: InitialAskAiMessage): void => {\n // Guard: no-op if sidepanel view hasn't been registered\n if (!registeredViews.has('sidepanel')) return;\n\n setInitialAskAiMessage(initialMessage);\n setDocsearchState('sidepanel');\n },\n [setDocsearchState, registeredViews],\n );\n\n const onInput = React.useCallback(\n (event: KeyboardEvent): void => {\n setDocsearchState('modal-search');\n setInitialQuery(event.key);\n },\n [setDocsearchState, setInitialQuery],\n );\n\n const registerView = React.useCallback(\n (view: View): void => {\n if (registeredViews.has(view)) return;\n\n setRegisteredViews((prev) => {\n const newViews = new Set(prev);\n newViews.add(view);\n return newViews;\n });\n },\n [registeredViews],\n );\n\n // Expose imperative handle for programmatic control\n React.useImperativeHandle(\n ref,\n () => ({\n open: openModal,\n close: closeModal,\n openAskAi: (initialMessage?: InitialAskAiMessage): void => onAskAiToggle(true, initialMessage),\n openSidepanel,\n get isReady(): boolean {\n return true;\n },\n get isOpen(): boolean {\n return isModalActive;\n },\n get isSidepanelOpen(): boolean {\n return isSidepanelOpen;\n },\n get isSidepanelSupported(): boolean {\n return isHybridModeSupported;\n },\n }),\n [openModal, closeModal, onAskAiToggle, openSidepanel, isModalActive, isSidepanelOpen, isHybridModeSupported],\n );\n\n useTheme({ theme });\n\n useDocSearchKeyboardEvents({\n isOpen: isModalActive,\n onOpen: openModal,\n onClose: closeModal,\n onAskAiToggle,\n onInput,\n isAskAiActive,\n searchButtonRef,\n keyboardShortcuts,\n });\n\n const value: DocSearchContext = React.useMemo(\n () => ({\n docsearchState,\n setDocsearchState,\n searchButtonRef,\n initialQuery,\n keyboardShortcuts,\n openModal,\n closeModal,\n isAskAiActive,\n isModalActive,\n onAskAiToggle,\n initialAskAiMessage,\n registerView,\n isHybridModeSupported,\n }),\n [\n docsearchState,\n searchButtonRef,\n initialQuery,\n keyboardShortcuts,\n openModal,\n closeModal,\n isAskAiActive,\n isModalActive,\n onAskAiToggle,\n initialAskAiMessage,\n registerView,\n isHybridModeSupported,\n ],\n );\n\n return <Context.Provider value={value}>{children}</Context.Provider>;\n}\n\nexport const DocSearch = React.forwardRef(DocSearchInner);\nDocSearch.displayName = 'DocSearch';\n\nexport function useDocSearch(): DocSearchContext {\n const ctx = React.useContext(Context);\n\n if (ctx === undefined) {\n throw new Error('`useDocSearch` must be used within the `DocSearch` provider');\n }\n\n return ctx;\n}\n"],"names":["DEFAULT_KEYBOARD_SHORTCUTS","useKeyboardShortcuts","userShortcuts","_objectSpread","useDocSearchKeyboardEvents","_ref","isOpen","isAskAiActive","onAskAiToggle","onClose","onOpen","onInput","searchButtonRef","_ref$keyboardShortcut","keyboardShortcuts","React","useEffect","onKeyDown","event","_event$key","code","isCmdK","key","toLowerCase","metaKey","ctrlKey","isSlash","element","composedPath","tagName","isContentEditable","isEditingContent","preventDefault","document","body","classList","contains","current","activeElement","test","String","fromCharCode","keyCode","window","addEventListener","removeEventListener","useTheme","theme","previousTheme","documentElement","dataset","undefined","Context","createContext","displayName","DocSearch","forwardRef","ref","children","onReady","onSidepanelOpen","onSidepanelClose","props","_objectWithoutProperties","_excluded","_React$useState2","_slicedToArray","useState","docsearchState","setDocsearchState","_React$useState4","initialQuery","setInitialQuery","useRef","_React$useState6","initialAskAiMessage","setInitialAskAiMessage","_React$useState8","Set","registeredViews","setRegisteredViews","isMobile","setIsMobile","checkForMobile","isMobileMediaQuery","matchMedia","matches","useIsMobile","prevStateRef","isModalActive","includes","isHybridModeSupported","has","isSidepanelOpen","prevState","currentState","openModal","useCallback","closeModal","_props$initialQuery","active","initialMessage","openSidepanel","registerView","view","prev","newViews","add","useImperativeHandle","open","close","openAskAi","isReady","isSidepanelSupported","value","useMemo","createElement","Provider","ctx","useContext","Error"],"mappings":"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"} | ||
| {"version":3,"file":"index.js","sources":["../../src/useKeyboardShortcuts.ts","../../src/useDocSearchKeyboardEvents.ts","../../src/useIsMobile.ts","../../src/useTheme.ts","../../src/DocSearch.tsx"],"sourcesContent":["export interface DocSearchModalShortcuts {\n /**\n * Enable/disable the Ctrl/Cmd+K shortcut to toggle the DocSearch modal.\n *\n * @default true\n */\n 'Ctrl/Cmd+K'?: boolean;\n /**\n * Enable/disable the / shortcut to open the DocSearch modal.\n *\n * @default true\n */\n '/'?: boolean;\n}\n\nexport interface SidepanelShortcuts {\n /**\n * Enable/disable the Ctrl/Cmd+I shortcut to toggle the DocSearch sidepanel.\n *\n * @default true\n */\n 'Ctrl/Cmd+I'?: boolean;\n}\n\nexport type KeyboardShortcuts = DocSearchModalShortcuts & SidepanelShortcuts;\n\n/**\n * Default keyboard shortcuts configuration for DocSearch.\n * These values are used when no keyboardShortcuts prop is provided\n * or when specific shortcuts are not configured.\n */\nexport const DEFAULT_KEYBOARD_SHORTCUTS: Required<KeyboardShortcuts> = {\n 'Ctrl/Cmd+K': true,\n '/': true,\n 'Ctrl/Cmd+I': true,\n} as const;\n\n/**\n * Merges user-provided keyboard shortcuts with defaults.\n *\n * @param userShortcuts - Optional user configuration.\n * @returns Complete keyboard shortcuts configuration with defaults applied.\n */\nexport function useKeyboardShortcuts(userShortcuts?: KeyboardShortcuts): Required<KeyboardShortcuts> {\n return {\n ...DEFAULT_KEYBOARD_SHORTCUTS,\n ...userShortcuts,\n };\n}\n","import React from 'react';\n\nimport { DEFAULT_KEYBOARD_SHORTCUTS, type KeyboardShortcuts } from './useKeyboardShortcuts';\n\nexport interface UseDocSearchKeyboardEventsProps {\n isOpen: boolean;\n onOpen: () => void;\n onClose: () => void;\n /**\n * Deprecated: Still here for backwards compat.\n *\n * @deprecated\n */\n onInput?: (event: KeyboardEvent) => void;\n /**\n * Deprecated: Still here for backwards compat.\n *\n * @deprecated\n */\n searchButtonRef?: React.RefObject<HTMLButtonElement | null>;\n isAskAiActive: boolean;\n onAskAiToggle: (toggle: boolean) => void;\n keyboardShortcuts?: KeyboardShortcuts;\n}\n\nfunction isEditingContent(event: KeyboardEvent): boolean {\n const element = event.composedPath()[0] as HTMLElement;\n const tagName = element.tagName;\n\n return element.isContentEditable || tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA';\n}\n\nexport function useDocSearchKeyboardEvents({\n isOpen,\n isAskAiActive,\n onAskAiToggle,\n onClose,\n onOpen,\n keyboardShortcuts = DEFAULT_KEYBOARD_SHORTCUTS,\n}: UseDocSearchKeyboardEventsProps): void {\n React.useEffect(() => {\n function onKeyDown(event: KeyboardEvent): void {\n if (isOpen && event.code === 'Escape' && isAskAiActive) {\n onAskAiToggle(false);\n return;\n }\n\n const isCmdK =\n keyboardShortcuts['Ctrl/Cmd+K'] && event.key?.toLowerCase() === 'k' && (event.metaKey || event.ctrlKey);\n const isSlash = keyboardShortcuts['/'] && event.key === '/';\n\n if ((event.code === 'Escape' && isOpen) || isCmdK || (!isEditingContent(event) && isSlash && !isOpen)) {\n event.preventDefault();\n\n if (isOpen) {\n onClose();\n } else if (!document.body.classList.contains('DocSearch--active')) {\n onOpen();\n }\n }\n }\n\n window.addEventListener('keydown', onKeyDown);\n\n return (): void => {\n window.removeEventListener('keydown', onKeyDown);\n };\n }, [isOpen, isAskAiActive, keyboardShortcuts, onOpen, onClose, onAskAiToggle]);\n}\n","import React from 'react';\n\nexport const useIsMobile = (): boolean => {\n const [isMobile, setIsMobile] = React.useState(false);\n\n React.useEffect(() => {\n const checkForMobile = (): void => {\n const isMobileMediaQuery = window.matchMedia('(max-width: 768px)');\n\n setIsMobile(isMobileMediaQuery.matches);\n };\n\n checkForMobile();\n\n window.addEventListener('resize', checkForMobile);\n\n return (): void => {\n window.removeEventListener('resize', checkForMobile);\n };\n }, []);\n\n return isMobile;\n};\n","import { useEffect } from 'react';\n\nexport type DocSearchTheme = 'dark' | 'light';\n\nexport interface UseThemeProps {\n theme?: DocSearchTheme;\n}\n\nexport const useTheme = ({ theme }: UseThemeProps): void => {\n useEffect(() => {\n if (!theme) {\n return undefined;\n }\n\n const previousTheme = document.documentElement.dataset.theme;\n\n if (theme === previousTheme) {\n return undefined;\n }\n\n document.documentElement.dataset.theme = theme;\n\n return (): void => {\n if (previousTheme === undefined) {\n delete document.documentElement.dataset.theme;\n } else {\n document.documentElement.dataset.theme = previousTheme;\n }\n };\n }, [theme]);\n};\n","import type { JSX } from 'react';\nimport React from 'react';\n\nimport { useDocSearchKeyboardEvents } from './useDocSearchKeyboardEvents';\nimport { useIsMobile } from './useIsMobile';\nimport { useKeyboardShortcuts } from './useKeyboardShortcuts';\nimport type { KeyboardShortcuts } from './useKeyboardShortcuts.ts';\nimport type { DocSearchTheme } from './useTheme';\nimport { useTheme } from './useTheme';\n\nexport type DocSearchState = 'modal-askai' | 'modal-search' | 'ready' | 'sidepanel';\n\nexport type View = 'modal' | 'sidepanel' | (Record<string, unknown> & string);\n\nexport type InitialAskAiMessage = {\n query: string;\n messageId?: string;\n suggestedQuestionId?: string;\n};\n\nexport type OnAskAiToggle = (active: boolean, initialMessage?: InitialAskAiMessage) => void;\n\n/**\n * Imperative handle exposed by the DocSearch provider for programmatic control.\n */\nexport interface DocSearchRef {\n /** Opens the search modal. */\n open: () => void;\n /** Closes the search modal. */\n close: () => void;\n /** Opens Ask AI mode (sidepanel if available, otherwise modal). */\n openAskAi: (initialMessage?: InitialAskAiMessage) => void;\n /** Opens the sidepanel directly (no-op if sidepanel view not registered). */\n openSidepanel: (initialMessage?: InitialAskAiMessage) => void;\n /** Returns true once the component is mounted and ready. */\n readonly isReady: boolean;\n /** Returns true if the modal is currently open. */\n readonly isOpen: boolean;\n /** Returns true if the sidepanel is currently open. */\n readonly isSidepanelOpen: boolean;\n /** Returns true if sidepanel view is registered (hybrid mode). */\n readonly isSidepanelSupported: boolean;\n}\n\nexport interface DocSearchContext {\n docsearchState: DocSearchState;\n setDocsearchState: (newState: DocSearchState) => void;\n searchButtonRef: React.RefObject<HTMLButtonElement | null>;\n initialQuery: string;\n keyboardShortcuts: Required<KeyboardShortcuts>;\n openModal: () => void;\n closeModal: () => void;\n isAskAiActive: boolean;\n isModalActive: boolean;\n onAskAiToggle: OnAskAiToggle;\n initialAskAiMessage: InitialAskAiMessage | undefined;\n registerView: (view: View) => void;\n isHybridModeSupported: boolean;\n}\n\n/**\n * Lifecycle callbacks for DocSearch.\n */\nexport interface DocSearchCallbacks {\n /** Called once DocSearch is mounted and ready for interaction. */\n onReady?: () => void;\n /** Called when the modal opens. */\n onOpen?: () => void;\n /** Called when the modal closes. */\n onClose?: () => void;\n /** Called when the sidepanel opens. */\n onSidepanelOpen?: () => void;\n /** Called when the sidepanel closes. */\n onSidepanelClose?: () => void;\n}\n\nexport interface DocSearchProps extends DocSearchCallbacks {\n children: Array<JSX.Element | null> | JSX.Element | React.ReactNode | null;\n theme?: DocSearchTheme;\n initialQuery?: string;\n keyboardShortcuts?: KeyboardShortcuts;\n}\n\nconst Context = React.createContext<DocSearchContext | undefined>(undefined);\nContext.displayName = 'DocSearchContext';\n\nfunction DocSearchInner(\n { children, theme, onReady, onOpen, onClose, onSidepanelOpen, onSidepanelClose, ...props }: DocSearchProps,\n ref: React.ForwardedRef<DocSearchRef>,\n): JSX.Element {\n const [docsearchState, setDocsearchState] = React.useState<DocSearchState>('ready');\n const [initialQuery, setInitialQuery] = React.useState<string>(props.initialQuery || '');\n const searchButtonRef = React.useRef<HTMLButtonElement>(null);\n const keyboardShortcuts = useKeyboardShortcuts(props.keyboardShortcuts);\n const [initialAskAiMessage, setInitialAskAiMessage] = React.useState<InitialAskAiMessage>();\n const [registeredViews, setRegisteredViews] = React.useState(() => new Set<View>());\n const isMobile = useIsMobile();\n const prevStateRef = React.useRef<DocSearchState>('ready');\n\n const isModalActive = ['modal-search', 'modal-askai'].includes(docsearchState);\n const isAskAiActive = docsearchState === 'modal-askai';\n const isHybridModeSupported = !isMobile && registeredViews.has('sidepanel');\n const isSidepanelOpen = docsearchState === 'sidepanel';\n\n // Call onReady on mount\n React.useEffect(() => {\n onReady?.();\n }, [onReady]);\n\n // Track state changes for lifecycle callbacks\n React.useEffect(() => {\n const prevState = prevStateRef.current;\n const currentState = docsearchState;\n\n // Modal opened\n if (\n (currentState === 'modal-search' || currentState === 'modal-askai') &&\n prevState !== 'modal-search' &&\n prevState !== 'modal-askai'\n ) {\n onOpen?.();\n }\n\n // Modal closed\n if (currentState === 'ready' && (prevState === 'modal-search' || prevState === 'modal-askai')) {\n onClose?.();\n }\n\n // Sidepanel opened\n if (currentState === 'sidepanel' && prevState !== 'sidepanel') {\n onSidepanelOpen?.();\n }\n\n // Sidepanel closed\n if (currentState !== 'sidepanel' && prevState === 'sidepanel') {\n onSidepanelClose?.();\n }\n\n prevStateRef.current = currentState;\n }, [docsearchState, onOpen, onClose, onSidepanelOpen, onSidepanelClose]);\n\n const openModal = React.useCallback((): void => {\n setDocsearchState('modal-search');\n }, []);\n\n const closeModal = React.useCallback((): void => {\n setDocsearchState('ready');\n // Refocus the Modal trigger on close\n searchButtonRef.current?.focus();\n setInitialQuery(props.initialQuery ?? '');\n }, [setDocsearchState, props.initialQuery]);\n\n const onAskAiToggle: OnAskAiToggle = React.useCallback(\n (active, initialMessage) => {\n // Don't use hybrid mode on mobile\n if (!isMobile && active && isHybridModeSupported) {\n setInitialAskAiMessage(initialMessage);\n setDocsearchState('sidepanel');\n return;\n }\n\n setDocsearchState(active ? 'modal-askai' : 'modal-search');\n },\n [setDocsearchState, isMobile, isHybridModeSupported],\n );\n\n const openSidepanel = React.useCallback(\n (initialMessage?: InitialAskAiMessage): void => {\n // Guard: no-op if sidepanel view hasn't been registered\n if (!registeredViews.has('sidepanel')) return;\n\n setInitialAskAiMessage(initialMessage);\n setDocsearchState('sidepanel');\n },\n [setDocsearchState, registeredViews],\n );\n\n const onInput = React.useCallback(\n (event: KeyboardEvent): void => {\n setDocsearchState('modal-search');\n setInitialQuery(event.key);\n },\n [setDocsearchState, setInitialQuery],\n );\n\n const registerView = React.useCallback(\n (view: View): void => {\n if (registeredViews.has(view)) return;\n\n setRegisteredViews((prev) => {\n const newViews = new Set(prev);\n newViews.add(view);\n return newViews;\n });\n },\n [registeredViews],\n );\n\n // Expose imperative handle for programmatic control\n React.useImperativeHandle(\n ref,\n () => ({\n open: openModal,\n close: closeModal,\n openAskAi: (initialMessage?: InitialAskAiMessage): void => onAskAiToggle(true, initialMessage),\n openSidepanel,\n get isReady(): boolean {\n return true;\n },\n get isOpen(): boolean {\n return isModalActive;\n },\n get isSidepanelOpen(): boolean {\n return isSidepanelOpen;\n },\n get isSidepanelSupported(): boolean {\n return isHybridModeSupported;\n },\n }),\n [openModal, closeModal, onAskAiToggle, openSidepanel, isModalActive, isSidepanelOpen, isHybridModeSupported],\n );\n\n useTheme({ theme });\n\n useDocSearchKeyboardEvents({\n isOpen: isModalActive,\n onOpen: openModal,\n onClose: closeModal,\n onAskAiToggle,\n onInput,\n isAskAiActive,\n searchButtonRef,\n keyboardShortcuts,\n });\n\n const value: DocSearchContext = React.useMemo(\n () => ({\n docsearchState,\n setDocsearchState,\n searchButtonRef,\n initialQuery,\n keyboardShortcuts,\n openModal,\n closeModal,\n isAskAiActive,\n isModalActive,\n onAskAiToggle,\n initialAskAiMessage,\n registerView,\n isHybridModeSupported,\n }),\n [\n docsearchState,\n searchButtonRef,\n initialQuery,\n keyboardShortcuts,\n openModal,\n closeModal,\n isAskAiActive,\n isModalActive,\n onAskAiToggle,\n initialAskAiMessage,\n registerView,\n isHybridModeSupported,\n ],\n );\n\n return <Context.Provider value={value}>{children}</Context.Provider>;\n}\n\nexport const DocSearch = React.forwardRef(DocSearchInner);\nDocSearch.displayName = 'DocSearch';\n\nexport function useDocSearch(): DocSearchContext {\n const ctx = React.useContext(Context);\n\n if (ctx === undefined) {\n throw new Error('`useDocSearch` must be used within the `DocSearch` provider');\n }\n\n return ctx;\n}\n"],"names":["DEFAULT_KEYBOARD_SHORTCUTS","useKeyboardShortcuts","userShortcuts","_objectSpread","useDocSearchKeyboardEvents","_ref","isOpen","isAskAiActive","onAskAiToggle","onClose","onOpen","_ref$keyboardShortcut","keyboardShortcuts","React","useEffect","onKeyDown","event","_event$key","code","isCmdK","key","toLowerCase","metaKey","ctrlKey","isSlash","element","composedPath","tagName","isContentEditable","isEditingContent","preventDefault","document","body","classList","contains","window","addEventListener","removeEventListener","useTheme","theme","previousTheme","documentElement","dataset","undefined","Context","createContext","displayName","DocSearch","forwardRef","ref","children","onReady","onSidepanelOpen","onSidepanelClose","props","_objectWithoutProperties","_excluded","_React$useState2","_slicedToArray","useState","docsearchState","setDocsearchState","_React$useState4","initialQuery","setInitialQuery","searchButtonRef","useRef","_React$useState6","initialAskAiMessage","setInitialAskAiMessage","_React$useState8","Set","registeredViews","setRegisteredViews","isMobile","setIsMobile","checkForMobile","isMobileMediaQuery","matchMedia","matches","useIsMobile","prevStateRef","isModalActive","includes","isHybridModeSupported","has","isSidepanelOpen","prevState","current","currentState","openModal","useCallback","closeModal","_searchButtonRef$curr","_props$initialQuery","focus","active","initialMessage","openSidepanel","onInput","registerView","view","prev","newViews","add","useImperativeHandle","open","close","openAskAi","isReady","isSidepanelSupported","value","useMemo","createElement","Provider","ctx","useContext","Error"],"mappings":"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"} |
@@ -1,3 +0,3 @@ | ||
| /*! @docsearch/core 4.5.0-beta.0 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */ | ||
| !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react")):"function"==typeof define&&define.amd?define(["exports","react"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).DocSearchCore={},e.React)}(this,function(e,t){"use strict";var o={"Ctrl/Cmd+K":!0,"/":!0,"Ctrl/Cmd+I":!0};e.useDocSearchKeyboardEvents=function(e){var n=e.isOpen,r=e.isAskAiActive,i=e.onAskAiToggle,c=e.onClose,a=e.onOpen,d=e.onInput,s=e.searchButtonRef,u=e.keyboardShortcuts,f=void 0===u?o:u;t.useEffect(function(){function e(e){var t;if(n&&"Escape"===e.code&&r)i(!1);else{var o=f["Ctrl/Cmd+K"]&&"k"===(null===(t=e.key)||void 0===t?void 0:t.toLowerCase())&&(e.metaKey||e.ctrlKey),u=f["/"]&&"/"===e.key;if("Escape"===e.code&&n||o||!function(e){var t=e.composedPath()[0],o=t.tagName;return t.isContentEditable||"INPUT"===o||"SELECT"===o||"TEXTAREA"===o}(e)&&u&&!n)return e.preventDefault(),void(n?c():document.body.classList.contains("DocSearch--active")||a());s&&s.current===document.activeElement&&d&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&d(e)}}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}},[n,r,s,f,a,c,d,i])}}); | ||
| /*! @docsearch/core 4.5.0-beta.1 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */ | ||
| !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react")):"function"==typeof define&&define.amd?define(["exports","react"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).DocSearchCore={},e.React)}(this,function(e,t){"use strict";var o={"Ctrl/Cmd+K":!0,"/":!0,"Ctrl/Cmd+I":!0};e.useDocSearchKeyboardEvents=function(e){var n=e.isOpen,i=e.isAskAiActive,r=e.onAskAiToggle,c=e.onClose,s=e.onOpen,a=e.keyboardShortcuts,d=void 0===a?o:a;t.useEffect(function(){function e(e){var t;if(n&&"Escape"===e.code&&i)r(!1);else{var o=d["Ctrl/Cmd+K"]&&"k"===(null===(t=e.key)||void 0===t?void 0:t.toLowerCase())&&(e.metaKey||e.ctrlKey),a=d["/"]&&"/"===e.key;("Escape"===e.code&&n||o||!function(e){var t=e.composedPath()[0],o=t.tagName;return t.isContentEditable||"INPUT"===o||"SELECT"===o||"TEXTAREA"===o}(e)&&a&&!n)&&(e.preventDefault(),n?c():document.body.classList.contains("DocSearch--active")||s())}}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}},[n,i,d,s,c,r])}}); | ||
| //# sourceMappingURL=useDocSearchKeyboardEvents.js.map |
@@ -1,1 +0,1 @@ | ||
| {"version":3,"file":"useDocSearchKeyboardEvents.js","sources":["../../src/useKeyboardShortcuts.ts","../../src/useDocSearchKeyboardEvents.ts"],"sourcesContent":["export interface DocSearchModalShortcuts {\n /**\n * Enable/disable the Ctrl/Cmd+K shortcut to toggle the DocSearch modal.\n *\n * @default true\n */\n 'Ctrl/Cmd+K'?: boolean;\n /**\n * Enable/disable the / shortcut to open the DocSearch modal.\n *\n * @default true\n */\n '/'?: boolean;\n}\n\nexport interface SidepanelShortcuts {\n /**\n * Enable/disable the Ctrl/Cmd+I shortcut to toggle the DocSearch sidepanel.\n *\n * @default true\n */\n 'Ctrl/Cmd+I'?: boolean;\n}\n\nexport type KeyboardShortcuts = DocSearchModalShortcuts & SidepanelShortcuts;\n\n/**\n * Default keyboard shortcuts configuration for DocSearch.\n * These values are used when no keyboardShortcuts prop is provided\n * or when specific shortcuts are not configured.\n */\nexport const DEFAULT_KEYBOARD_SHORTCUTS: Required<KeyboardShortcuts> = {\n 'Ctrl/Cmd+K': true,\n '/': true,\n 'Ctrl/Cmd+I': true,\n} as const;\n\n/**\n * Merges user-provided keyboard shortcuts with defaults.\n *\n * @param userShortcuts - Optional user configuration.\n * @returns Complete keyboard shortcuts configuration with defaults applied.\n */\nexport function useKeyboardShortcuts(userShortcuts?: KeyboardShortcuts): Required<KeyboardShortcuts> {\n return {\n ...DEFAULT_KEYBOARD_SHORTCUTS,\n ...userShortcuts,\n };\n}\n","import React from 'react';\n\nimport { DEFAULT_KEYBOARD_SHORTCUTS, type KeyboardShortcuts } from './useKeyboardShortcuts';\n\nexport interface UseDocSearchKeyboardEventsProps {\n isOpen: boolean;\n onOpen: () => void;\n onClose: () => void;\n onInput?: (event: KeyboardEvent) => void;\n searchButtonRef: React.RefObject<HTMLButtonElement | null>;\n isAskAiActive: boolean;\n onAskAiToggle: (toggle: boolean) => void;\n keyboardShortcuts?: KeyboardShortcuts;\n}\n\nfunction isEditingContent(event: KeyboardEvent): boolean {\n const element = event.composedPath()[0] as HTMLElement;\n const tagName = element.tagName;\n\n return element.isContentEditable || tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA';\n}\n\nexport function useDocSearchKeyboardEvents({\n isOpen,\n isAskAiActive,\n onAskAiToggle,\n onClose,\n onOpen,\n onInput,\n searchButtonRef,\n keyboardShortcuts = DEFAULT_KEYBOARD_SHORTCUTS,\n}: UseDocSearchKeyboardEventsProps): void {\n React.useEffect(() => {\n function onKeyDown(event: KeyboardEvent): void {\n if (isOpen && event.code === 'Escape' && isAskAiActive) {\n onAskAiToggle(false);\n return;\n }\n\n const isCmdK =\n keyboardShortcuts['Ctrl/Cmd+K'] && event.key?.toLowerCase() === 'k' && (event.metaKey || event.ctrlKey);\n const isSlash = keyboardShortcuts['/'] && event.key === '/';\n\n if ((event.code === 'Escape' && isOpen) || isCmdK || (!isEditingContent(event) && isSlash && !isOpen)) {\n event.preventDefault();\n\n if (isOpen) {\n onClose();\n } else if (!document.body.classList.contains('DocSearch--active')) {\n onOpen();\n }\n\n return;\n }\n\n if (searchButtonRef && searchButtonRef.current === document.activeElement && onInput) {\n if (/[a-zA-Z0-9]/.test(String.fromCharCode(event.keyCode))) {\n onInput(event);\n }\n }\n }\n\n window.addEventListener('keydown', onKeyDown);\n\n return (): void => {\n window.removeEventListener('keydown', onKeyDown);\n };\n }, [isOpen, isAskAiActive, searchButtonRef, keyboardShortcuts, onOpen, onClose, onInput, onAskAiToggle]);\n}\n"],"names":["DEFAULT_KEYBOARD_SHORTCUTS","_ref","isOpen","isAskAiActive","onAskAiToggle","onClose","onOpen","onInput","searchButtonRef","_ref$keyboardShortcut","keyboardShortcuts","React","useEffect","onKeyDown","event","_event$key","code","isCmdK","key","toLowerCase","metaKey","ctrlKey","isSlash","element","composedPath","tagName","isContentEditable","isEditingContent","preventDefault","document","body","classList","contains","current","activeElement","test","String","fromCharCode","keyCode","window","addEventListener","removeEventListener"],"mappings":";uRA+BO,IAAMA,EAA0D,CACrE,cAAc,EACd,KAAK,EACL,cAAc,gCCZT,SAAmCC,GASA,IARxCC,EAAMD,EAANC,OACAC,EAAaF,EAAbE,cACAC,EAAaH,EAAbG,cACAC,EAAOJ,EAAPI,QACAC,EAAML,EAANK,OACAC,EAAON,EAAPM,QACAC,EAAeP,EAAfO,gBAAeC,EAAAR,EACfS,kBAAAA,OAAoBV,IAAHS,EAAGT,EAA0BS,EAE9CE,EAAMC,UAAU,WACd,SAASC,EAAUC,GAA4B,IAAAC,EAC7C,GAAIb,GAAyB,WAAfY,EAAME,MAAqBb,EACvCC,GAAc,OADhB,CAKA,IAAMa,EACJP,EAAkB,eAA8C,OAApBK,QAATA,EAAAD,EAAMI,WAANH,IAASA,OAATA,EAAAA,EAAWI,iBAA0BL,EAAMM,SAAWN,EAAMO,SAC3FC,EAAUZ,EAAkB,MAAsB,MAAdI,EAAMI,IAEhD,GAAoB,WAAfJ,EAAME,MAAqBd,GAAWe,IA5BjD,SAA0BH,GACxB,IAAMS,EAAUT,EAAMU,eAAe,GAC/BC,EAAUF,EAAQE,QAExB,OAAOF,EAAQG,mBAAiC,UAAZD,GAAmC,WAAZA,GAAoC,aAAZA,CACrF,CAuB6DE,CAAiBb,IAAUQ,IAAYpB,EAS5F,OARAY,EAAMc,sBAEF1B,EACFG,IACUwB,SAASC,KAAKC,UAAUC,SAAS,sBAC3C1B,KAMAE,GAAmBA,EAAgByB,UAAYJ,SAASK,eAAiB3B,GACvE,cAAc4B,KAAKC,OAAOC,aAAavB,EAAMwB,WAC/C/B,EAAQO,EApBZ,CAuBF,CAIA,OAFAyB,OAAOC,iBAAiB,UAAW3B,GAE5B,WACL0B,OAAOE,oBAAoB,UAAW5B,EACvC,CACH,EAAG,CAACX,EAAQC,EAAeK,EAAiBE,EAAmBJ,EAAQD,EAASE,EAASH,GAC3F"} | ||
| {"version":3,"file":"useDocSearchKeyboardEvents.js","sources":["../../src/useKeyboardShortcuts.ts","../../src/useDocSearchKeyboardEvents.ts"],"sourcesContent":["export interface DocSearchModalShortcuts {\n /**\n * Enable/disable the Ctrl/Cmd+K shortcut to toggle the DocSearch modal.\n *\n * @default true\n */\n 'Ctrl/Cmd+K'?: boolean;\n /**\n * Enable/disable the / shortcut to open the DocSearch modal.\n *\n * @default true\n */\n '/'?: boolean;\n}\n\nexport interface SidepanelShortcuts {\n /**\n * Enable/disable the Ctrl/Cmd+I shortcut to toggle the DocSearch sidepanel.\n *\n * @default true\n */\n 'Ctrl/Cmd+I'?: boolean;\n}\n\nexport type KeyboardShortcuts = DocSearchModalShortcuts & SidepanelShortcuts;\n\n/**\n * Default keyboard shortcuts configuration for DocSearch.\n * These values are used when no keyboardShortcuts prop is provided\n * or when specific shortcuts are not configured.\n */\nexport const DEFAULT_KEYBOARD_SHORTCUTS: Required<KeyboardShortcuts> = {\n 'Ctrl/Cmd+K': true,\n '/': true,\n 'Ctrl/Cmd+I': true,\n} as const;\n\n/**\n * Merges user-provided keyboard shortcuts with defaults.\n *\n * @param userShortcuts - Optional user configuration.\n * @returns Complete keyboard shortcuts configuration with defaults applied.\n */\nexport function useKeyboardShortcuts(userShortcuts?: KeyboardShortcuts): Required<KeyboardShortcuts> {\n return {\n ...DEFAULT_KEYBOARD_SHORTCUTS,\n ...userShortcuts,\n };\n}\n","import React from 'react';\n\nimport { DEFAULT_KEYBOARD_SHORTCUTS, type KeyboardShortcuts } from './useKeyboardShortcuts';\n\nexport interface UseDocSearchKeyboardEventsProps {\n isOpen: boolean;\n onOpen: () => void;\n onClose: () => void;\n /**\n * Deprecated: Still here for backwards compat.\n *\n * @deprecated\n */\n onInput?: (event: KeyboardEvent) => void;\n /**\n * Deprecated: Still here for backwards compat.\n *\n * @deprecated\n */\n searchButtonRef?: React.RefObject<HTMLButtonElement | null>;\n isAskAiActive: boolean;\n onAskAiToggle: (toggle: boolean) => void;\n keyboardShortcuts?: KeyboardShortcuts;\n}\n\nfunction isEditingContent(event: KeyboardEvent): boolean {\n const element = event.composedPath()[0] as HTMLElement;\n const tagName = element.tagName;\n\n return element.isContentEditable || tagName === 'INPUT' || tagName === 'SELECT' || tagName === 'TEXTAREA';\n}\n\nexport function useDocSearchKeyboardEvents({\n isOpen,\n isAskAiActive,\n onAskAiToggle,\n onClose,\n onOpen,\n keyboardShortcuts = DEFAULT_KEYBOARD_SHORTCUTS,\n}: UseDocSearchKeyboardEventsProps): void {\n React.useEffect(() => {\n function onKeyDown(event: KeyboardEvent): void {\n if (isOpen && event.code === 'Escape' && isAskAiActive) {\n onAskAiToggle(false);\n return;\n }\n\n const isCmdK =\n keyboardShortcuts['Ctrl/Cmd+K'] && event.key?.toLowerCase() === 'k' && (event.metaKey || event.ctrlKey);\n const isSlash = keyboardShortcuts['/'] && event.key === '/';\n\n if ((event.code === 'Escape' && isOpen) || isCmdK || (!isEditingContent(event) && isSlash && !isOpen)) {\n event.preventDefault();\n\n if (isOpen) {\n onClose();\n } else if (!document.body.classList.contains('DocSearch--active')) {\n onOpen();\n }\n }\n }\n\n window.addEventListener('keydown', onKeyDown);\n\n return (): void => {\n window.removeEventListener('keydown', onKeyDown);\n };\n }, [isOpen, isAskAiActive, keyboardShortcuts, onOpen, onClose, onAskAiToggle]);\n}\n"],"names":["DEFAULT_KEYBOARD_SHORTCUTS","_ref","isOpen","isAskAiActive","onAskAiToggle","onClose","onOpen","_ref$keyboardShortcut","keyboardShortcuts","React","useEffect","onKeyDown","event","_event$key","code","isCmdK","key","toLowerCase","metaKey","ctrlKey","isSlash","element","composedPath","tagName","isContentEditable","isEditingContent","preventDefault","document","body","classList","contains","window","addEventListener","removeEventListener"],"mappings":";uRA+BO,IAAMA,EAA0D,CACrE,cAAc,EACd,KAAK,EACL,cAAc,gCCFT,SAAmCC,GAOA,IANxCC,EAAMD,EAANC,OACAC,EAAaF,EAAbE,cACAC,EAAaH,EAAbG,cACAC,EAAOJ,EAAPI,QACAC,EAAML,EAANK,OAAMC,EAAAN,EACNO,kBAAAA,OAAoBR,IAAHO,EAAGP,EAA0BO,EAE9CE,EAAMC,UAAU,WACd,SAASC,EAAUC,GAA4B,IAAAC,EAC7C,GAAIX,GAAyB,WAAfU,EAAME,MAAqBX,EACvCC,GAAc,OADhB,CAKA,IAAMW,EACJP,EAAkB,eAA8C,OAApBK,QAATA,EAAAD,EAAMI,WAANH,IAASA,OAATA,EAAAA,EAAWI,iBAA0BL,EAAMM,SAAWN,EAAMO,SAC3FC,EAAUZ,EAAkB,MAAsB,MAAdI,EAAMI,KAE5B,WAAfJ,EAAME,MAAqBZ,GAAWa,IA1BjD,SAA0BH,GACxB,IAAMS,EAAUT,EAAMU,eAAe,GAC/BC,EAAUF,EAAQE,QAExB,OAAOF,EAAQG,mBAAiC,UAAZD,GAAmC,WAAZA,GAAoC,aAAZA,CACrF,CAqB6DE,CAAiBb,IAAUQ,IAAYlB,KAC5FU,EAAMc,iBAEFxB,EACFG,IACUsB,SAASC,KAAKC,UAAUC,SAAS,sBAC3CxB,IAZJ,CAeF,CAIA,OAFAyB,OAAOC,iBAAiB,UAAWrB,GAE5B,WACLoB,OAAOE,oBAAoB,UAAWtB,EACvC,CACH,EAAG,CAACT,EAAQC,EAAeK,EAAmBF,EAAQD,EAASD,GACjE"} |
@@ -1,3 +0,3 @@ | ||
| /*! @docsearch/core 4.5.0-beta.0 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */ | ||
| /*! @docsearch/core 4.5.0-beta.1 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */ | ||
| !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).DocSearchCore={})}(this,function(e){"use strict";function t(e,t,r){return(t=function(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var r=e[Symbol.toPrimitive];if(void 0!==r){var n=r.call(e,t||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===t?String:Number)(e)}(e,"string");return"symbol"==typeof t?t:t+""}(t))in e?Object.defineProperty(e,t,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[t]=r,e}function r(e,t){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);t&&(n=n.filter(function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable})),r.push.apply(r,n)}return r}function n(e){for(var n=1;n<arguments.length;n++){var o=null!=arguments[n]?arguments[n]:{};n%2?r(Object(o),!0).forEach(function(r){t(e,r,o[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(o)):r(Object(o)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(o,t))})}return e}var o={"Ctrl/Cmd+K":!0,"/":!0,"Ctrl/Cmd+I":!0};e.DEFAULT_KEYBOARD_SHORTCUTS=o,e.useKeyboardShortcuts=function(e){return n(n({},o),e)}}); | ||
| //# sourceMappingURL=useKeyboardShortcuts.js.map |
@@ -1,3 +0,3 @@ | ||
| /*! @docsearch/core 4.5.0-beta.0 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */ | ||
| /*! @docsearch/core 4.5.0-beta.1 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */ | ||
| !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("react")):"function"==typeof define&&define.amd?define(["exports","react"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).DocSearchCore={},e.React)}(this,function(e,t){"use strict";e.useTheme=function(e){var n=e.theme;t.useEffect(function(){if(n){var e=document.documentElement.dataset.theme;if(n!==e)return document.documentElement.dataset.theme=n,function(){void 0===e?delete document.documentElement.dataset.theme:document.documentElement.dataset.theme=e}}},[n])}}); | ||
| //# sourceMappingURL=useTheme.js.map |
+1
-1
| { | ||
| "name": "@docsearch/core", | ||
| "description": "Core package logic for DocSearch", | ||
| "version": "4.5.0-beta.0", | ||
| "version": "4.5.0-beta.1", | ||
| "license": "MIT", | ||
@@ -6,0 +6,0 @@ "homepage": "https://docsearch.algolia.com", |
311
6.87%56987
-1.13%