@docsearch/core 4.3.1 → 4.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,19 +1,28 @@
1
1
  import React, { JSX } from 'react';
2
2
 
3
- interface KeyboardShortcuts {
3
+ interface DocSearchModalShortcuts {
4
4
  /**
5
- * Enable/disable the Ctrl/Cmd+K shortcut to toggle the search modal.
5
+ * Enable/disable the Ctrl/Cmd+K shortcut to toggle the DocSearch modal.
6
6
  *
7
7
  * @default true
8
8
  */
9
9
  'Ctrl/Cmd+K'?: boolean;
10
10
  /**
11
- * Enable/disable the / shortcut to open the search modal.
11
+ * Enable/disable the / shortcut to open the DocSearch modal.
12
12
  *
13
13
  * @default true
14
14
  */
15
15
  '/'?: boolean;
16
16
  }
17
+ interface SidepanelShortcuts {
18
+ /**
19
+ * Enable/disable the Ctrl/Cmd+I shortcut to toggle the DocSearch sidepanel.
20
+ *
21
+ * @default true
22
+ */
23
+ 'Ctrl/Cmd+I'?: boolean;
24
+ }
25
+ type KeyboardShortcuts = DocSearchModalShortcuts & SidepanelShortcuts;
17
26
  /**
18
27
  * Default keyboard shortcuts configuration for DocSearch.
19
28
  * These values are used when no keyboardShortcuts prop is provided
@@ -34,7 +43,14 @@ interface UseThemeProps {
34
43
  }
35
44
  declare const useTheme: ({ theme }: UseThemeProps) => void;
36
45
 
37
- type DocSearchState = 'modal-askai' | 'modal-search' | 'ready';
46
+ type DocSearchState = 'modal-askai' | 'modal-search' | 'ready' | 'sidepanel';
47
+ type View = 'modal' | 'sidepanel' | (Record<string, unknown> & string);
48
+ type InitialAskAiMessage = {
49
+ query: string;
50
+ messageId?: string;
51
+ suggestedQuestionId?: string;
52
+ };
53
+ type OnAskAiToggle = (active: boolean, initialMessage?: InitialAskAiMessage) => void;
38
54
  interface DocSearchContext {
39
55
  docsearchState: DocSearchState;
40
56
  setDocsearchState: (newState: DocSearchState) => void;
@@ -45,7 +61,10 @@ interface DocSearchContext {
45
61
  closeModal: () => void;
46
62
  isAskAiActive: boolean;
47
63
  isModalActive: boolean;
48
- onAskAiToggle: (active: boolean) => void;
64
+ onAskAiToggle: OnAskAiToggle;
65
+ initialAskAiMessage: InitialAskAiMessage | undefined;
66
+ registerView: (view: View) => void;
67
+ isHybridModeSupported: boolean;
49
68
  }
50
69
  interface DocSearchProps {
51
70
  children: Array<JSX.Element | null> | JSX.Element | React.ReactNode | null;
@@ -72,4 +91,4 @@ interface UseDocSearchKeyboardEventsProps {
72
91
  declare function useDocSearchKeyboardEvents({ isOpen, isAskAiActive, onAskAiToggle, onClose, onOpen, onInput, searchButtonRef, keyboardShortcuts, }: UseDocSearchKeyboardEventsProps): void;
73
92
 
74
93
  export { DEFAULT_KEYBOARD_SHORTCUTS, DocSearch, useDocSearch, useDocSearchKeyboardEvents, useKeyboardShortcuts, useTheme };
75
- export type { DocSearchContext, DocSearchProps, DocSearchState, DocSearchTheme, KeyboardShortcuts, UseDocSearchKeyboardEventsProps, UseThemeProps };
94
+ export type { DocSearchContext, DocSearchModalShortcuts, DocSearchProps, DocSearchState, DocSearchTheme, InitialAskAiMessage, KeyboardShortcuts, OnAskAiToggle, SidepanelShortcuts, UseDocSearchKeyboardEventsProps, UseThemeProps, View };
package/dist/esm/index.js CHANGED
@@ -1 +1 @@
1
- import e,{useEffect as t}from"react";function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}function n(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 o(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 i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach(function(t){n(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}function a(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,a,c=[],u=!0,l=!1;try{if(i=(r=r.call(e)).next,0===t);else for(;!(u=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);u=!0);}catch(e){l=!0,o=e}finally{try{if(!u&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(l)throw o}}return c}}(e,t)||function(e,t){if(e){if("string"==typeof e)return r(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(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 c={"Ctrl/Cmd+K":!0,"/":!0};function u(e){return i(i({},c),e)}function l(t){var r=t.isOpen,n=t.isAskAiActive,o=t.onAskAiToggle,i=t.onClose,a=t.onOpen,u=t.onInput,l=t.searchButtonRef,s=t.keyboardShortcuts,f=void 0===s?c:s;e.useEffect(function(){function e(e){var t;if(r&&"Escape"===e.code&&n)o(!1);else{var c=f["Ctrl/Cmd+K"]&&"k"===(null===(t=e.key)||void 0===t?void 0:t.toLowerCase())&&(e.metaKey||e.ctrlKey),s=f["/"]&&"/"===e.key;if("Escape"===e.code&&r||c||!function(e){var t=e.composedPath()[0],r=t.tagName;return t.isContentEditable||"INPUT"===r||"SELECT"===r||"TEXTAREA"===r}(e)&&s&&!r)return e.preventDefault(),void(r?i():document.body.classList.contains("DocSearch--active")||a());l&&l.current===document.activeElement&&u&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&u(e)}}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}},[r,n,l,f,a,i,u,o])}var s=function(e){var r=e.theme;t(function(){if(r){var e=document.documentElement.dataset.theme;if(r!==e)return document.documentElement.dataset.theme=r,function(){void 0===e?delete document.documentElement.dataset.theme:document.documentElement.dataset.theme=e}}},[r])},f=["children","theme"],d=e.createContext(void 0);function m(t){var r=t.children,n=t.theme,o=function(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r={};for(var n in e)if({}.hasOwnProperty.call(e,n)){if(-1!==t.indexOf(n))continue;r[n]=e[n]}return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],-1===t.indexOf(r)&&{}.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}(t,f),i=a(e.useState("ready"),2),c=i[0],m=i[1],y=a(e.useState(o.initialQuery||""),2),v=y[0],h=y[1],p=e.useRef(null),b=u(o.keyboardShortcuts),O=["modal-search","modal-askai"].includes(c),g="modal-askai"===c,S=e.useCallback(function(){m("modal-search")},[]),k=e.useCallback(function(){var e,t;m("ready"),null===(e=p.current)||void 0===e||e.focus(),h(null!==(t=o.initialQuery)&&void 0!==t?t:"")},[m,o.initialQuery]),w=e.useCallback(function(e){m(e?"modal-askai":"modal-search")},[m]),A=e.useCallback(function(e){m("modal-search"),h(e.key)},[m,h]);s({theme:n}),l({isOpen:O,onOpen:S,onClose:k,onAskAiToggle:w,onInput:A,isAskAiActive:g,searchButtonRef:p,keyboardShortcuts:b});var E=e.useMemo(function(){return{docsearchState:c,setDocsearchState:m,searchButtonRef:p,initialQuery:v,keyboardShortcuts:b,openModal:S,closeModal:k,isAskAiActive:g,isModalActive:O,onAskAiToggle:w}},[c,p,v,b,S,k,g,O,w]);return e.createElement(d.Provider,{value:E},r)}function y(){var t=e.useContext(d);if(void 0===t)throw new Error("`useDocSearch` must be used within the `DocSearch` provider");return t}d.displayName="DocSearchContext",m.displayName="DocSearch";export{c as DEFAULT_KEYBOARD_SHORTCUTS,m as DocSearch,y as useDocSearch,l as useDocSearchKeyboardEvents,u as useKeyboardShortcuts,s as useTheme};
1
+ import e,{useEffect as t}from"react";function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}function n(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 o(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 i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach(function(t){n(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}function a(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,a,u=[],c=!0,l=!1;try{if(i=(r=r.call(e)).next,0===t);else for(;!(c=(n=i.call(r)).done)&&(u.push(n.value),u.length!==t);c=!0);}catch(e){l=!0,o=e}finally{try{if(!c&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(l)throw o}}return u}}(e,t)||function(e,t){if(e){if("string"==typeof e)return r(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(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 i(i({},u),e)}function l(t){var r=t.isOpen,n=t.isAskAiActive,o=t.onAskAiToggle,i=t.onClose,a=t.onOpen,c=t.onInput,l=t.searchButtonRef,s=t.keyboardShortcuts,f=void 0===s?u:s;e.useEffect(function(){function e(e){var t;if(r&&"Escape"===e.code&&n)o(!1);else{var u=f["Ctrl/Cmd+K"]&&"k"===(null===(t=e.key)||void 0===t?void 0:t.toLowerCase())&&(e.metaKey||e.ctrlKey),s=f["/"]&&"/"===e.key;if("Escape"===e.code&&r||u||!function(e){var t=e.composedPath()[0],r=t.tagName;return t.isContentEditable||"INPUT"===r||"SELECT"===r||"TEXTAREA"===r}(e)&&s&&!r)return e.preventDefault(),void(r?i():document.body.classList.contains("DocSearch--active")||a());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)}},[r,n,l,f,a,i,c,o])}var s=function(e){var r=e.theme;t(function(){if(r){var e=document.documentElement.dataset.theme;if(r!==e)return document.documentElement.dataset.theme=r,function(){void 0===e?delete document.documentElement.dataset.theme:document.documentElement.dataset.theme=e}}},[r])},f=["children","theme"],d=e.createContext(void 0);function m(t){var r=t.children,n=t.theme,o=function(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r={};for(var n in e)if({}.hasOwnProperty.call(e,n)){if(-1!==t.indexOf(n))continue;r[n]=e[n]}return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],-1===t.indexOf(r)&&{}.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}(t,f),i=a(e.useState("ready"),2),u=i[0],m=i[1],v=a(e.useState(o.initialQuery||""),2),y=v[0],h=v[1],p=e.useRef(null),b=c(o.keyboardShortcuts),w=a(e.useState(),2),S=w[0],O=w[1],g=a(e.useState(function(){return new Set}),2),k=g[0],A=g[1],E=function(){var t=a(e.useState(!1),2),r=t[0],n=t[1];return e.useEffect(function(){var e=function(){var e=window.matchMedia("(max-width: 768px)");n(e.matches)};return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}},[]),r}(),C=["modal-search","modal-askai"].includes(u),j="modal-askai"===u,P=k.has("sidepanel"),D=e.useCallback(function(){m("modal-search")},[]),x=e.useCallback(function(){var e;m("ready"),h(null!==(e=o.initialQuery)&&void 0!==e?e:"")},[m,o.initialQuery]),T=e.useCallback(function(e,t){if(!E&&e&&P)return O(t),void m("sidepanel");m(e?"modal-askai":"modal-search")},[m,E,P]),I=e.useCallback(function(e){m("modal-search"),h(e.key)},[m,h]),M=e.useCallback(function(e){k.has(e)||A(function(t){var r=new Set(t);return r.add(e),r})},[k]);s({theme:n}),l({isOpen:C,onOpen:D,onClose:x,onAskAiToggle:T,onInput:I,isAskAiActive:j,searchButtonRef:p,keyboardShortcuts:b});var L=e.useMemo(function(){return{docsearchState:u,setDocsearchState:m,searchButtonRef:p,initialQuery:y,keyboardShortcuts:b,openModal:D,closeModal:x,isAskAiActive:j,isModalActive:C,onAskAiToggle:T,initialAskAiMessage:S,registerView:M,isHybridModeSupported:P}},[u,p,y,b,D,x,j,C,T,S,M,P]);return e.createElement(d.Provider,{value:L},r)}function v(){var t=e.useContext(d);if(void 0===t)throw new Error("`useDocSearch` must be used within the `DocSearch` provider");return t}d.displayName="DocSearchContext",m.displayName="DocSearch";export{u as DEFAULT_KEYBOARD_SHORTCUTS,m as DocSearch,v as useDocSearch,l as useDocSearchKeyboardEvents,c as useKeyboardShortcuts,s as useTheme};
@@ -1,19 +1,28 @@
1
1
  import React from 'react';
2
2
 
3
- interface KeyboardShortcuts {
3
+ interface DocSearchModalShortcuts {
4
4
  /**
5
- * Enable/disable the Ctrl/Cmd+K shortcut to toggle the search modal.
5
+ * Enable/disable the Ctrl/Cmd+K shortcut to toggle the DocSearch modal.
6
6
  *
7
7
  * @default true
8
8
  */
9
9
  'Ctrl/Cmd+K'?: boolean;
10
10
  /**
11
- * Enable/disable the / shortcut to open the search modal.
11
+ * Enable/disable the / shortcut to open the DocSearch modal.
12
12
  *
13
13
  * @default true
14
14
  */
15
15
  '/'?: boolean;
16
16
  }
17
+ interface SidepanelShortcuts {
18
+ /**
19
+ * Enable/disable the Ctrl/Cmd+I shortcut to toggle the DocSearch sidepanel.
20
+ *
21
+ * @default true
22
+ */
23
+ 'Ctrl/Cmd+I'?: boolean;
24
+ }
25
+ type KeyboardShortcuts = DocSearchModalShortcuts & SidepanelShortcuts;
17
26
 
18
27
  interface UseDocSearchKeyboardEventsProps {
19
28
  isOpen: boolean;
@@ -1 +1 @@
1
- import e from"react";var t={"Ctrl/Cmd+K":!0,"/":!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};
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};
@@ -1,17 +1,26 @@
1
- interface KeyboardShortcuts {
1
+ interface DocSearchModalShortcuts {
2
2
  /**
3
- * Enable/disable the Ctrl/Cmd+K shortcut to toggle the search modal.
3
+ * Enable/disable the Ctrl/Cmd+K shortcut to toggle the DocSearch modal.
4
4
  *
5
5
  * @default true
6
6
  */
7
7
  'Ctrl/Cmd+K'?: boolean;
8
8
  /**
9
- * Enable/disable the / shortcut to open the search modal.
9
+ * Enable/disable the / shortcut to open the DocSearch modal.
10
10
  *
11
11
  * @default true
12
12
  */
13
13
  '/'?: boolean;
14
14
  }
15
+ interface SidepanelShortcuts {
16
+ /**
17
+ * Enable/disable the Ctrl/Cmd+I shortcut to toggle the DocSearch sidepanel.
18
+ *
19
+ * @default true
20
+ */
21
+ 'Ctrl/Cmd+I'?: boolean;
22
+ }
23
+ type KeyboardShortcuts = DocSearchModalShortcuts & SidepanelShortcuts;
15
24
  /**
16
25
  * Default keyboard shortcuts configuration for DocSearch.
17
26
  * These values are used when no keyboardShortcuts prop is provided
@@ -27,4 +36,4 @@ declare const DEFAULT_KEYBOARD_SHORTCUTS: Required<KeyboardShortcuts>;
27
36
  declare function useKeyboardShortcuts(userShortcuts?: KeyboardShortcuts): Required<KeyboardShortcuts>;
28
37
 
29
38
  export { DEFAULT_KEYBOARD_SHORTCUTS, useKeyboardShortcuts };
30
- export type { KeyboardShortcuts };
39
+ export type { DocSearchModalShortcuts, KeyboardShortcuts, SidepanelShortcuts };
@@ -1 +1 @@
1
- function r(r,e,t){return(e=function(r){var e=function(r,e){if("object"!=typeof r||!r)return r;var t=r[Symbol.toPrimitive];if(void 0!==t){var n=t.call(r,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(r)}(r,"string");return"symbol"==typeof e?e:e+""}(e))in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}function e(r,e){var t=Object.keys(r);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(r);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable})),t.push.apply(t,n)}return t}function t(t){for(var n=1;n<arguments.length;n++){var o=null!=arguments[n]?arguments[n]:{};n%2?e(Object(o),!0).forEach(function(e){r(t,e,o[e])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(o)):e(Object(o)).forEach(function(r){Object.defineProperty(t,r,Object.getOwnPropertyDescriptor(o,r))})}return t}var n={"Ctrl/Cmd+K":!0,"/":!0};function o(r){return t(t({},n),r)}export{n as DEFAULT_KEYBOARD_SHORTCUTS,o as useKeyboardShortcuts};
1
+ function r(r,e,t){return(e=function(r){var e=function(r,e){if("object"!=typeof r||!r)return r;var t=r[Symbol.toPrimitive];if(void 0!==t){var n=t.call(r,e||"default");if("object"!=typeof n)return n;throw new TypeError("@@toPrimitive must return a primitive value.")}return("string"===e?String:Number)(r)}(r,"string");return"symbol"==typeof e?e:e+""}(e))in r?Object.defineProperty(r,e,{value:t,enumerable:!0,configurable:!0,writable:!0}):r[e]=t,r}function e(r,e){var t=Object.keys(r);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(r);e&&(n=n.filter(function(e){return Object.getOwnPropertyDescriptor(r,e).enumerable})),t.push.apply(t,n)}return t}function t(t){for(var n=1;n<arguments.length;n++){var o=null!=arguments[n]?arguments[n]:{};n%2?e(Object(o),!0).forEach(function(e){r(t,e,o[e])}):Object.getOwnPropertyDescriptors?Object.defineProperties(t,Object.getOwnPropertyDescriptors(o)):e(Object(o)).forEach(function(r){Object.defineProperty(t,r,Object.getOwnPropertyDescriptor(o,r))})}return t}var n={"Ctrl/Cmd+K":!0,"/":!0,"Ctrl/Cmd+I":!0};function o(r){return t(t({},n),r)}export{n as DEFAULT_KEYBOARD_SHORTCUTS,o as useKeyboardShortcuts};
package/dist/umd/index.js CHANGED
@@ -1,3 +1,3 @@
1
- /*! @docsearch/core 4.3.1 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */
2
- !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)["@docsearch/core"]={},e.React)}(this,function(e,t){"use strict";function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}function n(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 o(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 i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach(function(t){n(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}function a(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,a,c=[],u=!0,l=!1;try{if(i=(r=r.call(e)).next,0===t);else for(;!(u=(n=i.call(r)).done)&&(c.push(n.value),c.length!==t);u=!0);}catch(e){l=!0,o=e}finally{try{if(!u&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(l)throw o}}return c}}(e,t)||function(e,t){if(e){if("string"==typeof e)return r(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(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 c={"Ctrl/Cmd+K":!0,"/":!0};function u(e){return i(i({},c),e)}function l(e){var r=e.isOpen,n=e.isAskAiActive,o=e.onAskAiToggle,i=e.onClose,a=e.onOpen,u=e.onInput,l=e.searchButtonRef,s=e.keyboardShortcuts,f=void 0===s?c:s;t.useEffect(function(){function e(e){var t;if(r&&"Escape"===e.code&&n)o(!1);else{var c=f["Ctrl/Cmd+K"]&&"k"===(null===(t=e.key)||void 0===t?void 0:t.toLowerCase())&&(e.metaKey||e.ctrlKey),s=f["/"]&&"/"===e.key;if("Escape"===e.code&&r||c||!function(e){var t=e.composedPath()[0],r=t.tagName;return t.isContentEditable||"INPUT"===r||"SELECT"===r||"TEXTAREA"===r}(e)&&s&&!r)return e.preventDefault(),void(r?i():document.body.classList.contains("DocSearch--active")||a());l&&l.current===document.activeElement&&u&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&u(e)}}return window.addEventListener("keydown",e),function(){window.removeEventListener("keydown",e)}},[r,n,l,f,a,i,u,o])}var s=function(e){var r=e.theme;t.useEffect(function(){if(r){var e=document.documentElement.dataset.theme;if(r!==e)return document.documentElement.dataset.theme=r,function(){void 0===e?delete document.documentElement.dataset.theme:document.documentElement.dataset.theme=e}}},[r])},f=["children","theme"],d=t.createContext(void 0);function m(e){var r=e.children,n=e.theme,o=function(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r={};for(var n in e)if({}.hasOwnProperty.call(e,n)){if(-1!==t.indexOf(n))continue;r[n]=e[n]}return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],-1===t.indexOf(r)&&{}.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}(e,f),i=a(t.useState("ready"),2),c=i[0],m=i[1],y=a(t.useState(o.initialQuery||""),2),v=y[0],h=y[1],p=t.useRef(null),b=u(o.keyboardShortcuts),O=["modal-search","modal-askai"].includes(c),S="modal-askai"===c,g=t.useCallback(function(){m("modal-search")},[]),A=t.useCallback(function(){var e,t;m("ready"),null===(e=p.current)||void 0===e||e.focus(),h(null!==(t=o.initialQuery)&&void 0!==t?t:"")},[m,o.initialQuery]),E=t.useCallback(function(e){m(e?"modal-askai":"modal-search")},[m]),k=t.useCallback(function(e){m("modal-search"),h(e.key)},[m,h]);s({theme:n}),l({isOpen:O,onOpen:g,onClose:A,onAskAiToggle:E,onInput:k,isAskAiActive:S,searchButtonRef:p,keyboardShortcuts:b});var w=t.useMemo(function(){return{docsearchState:c,setDocsearchState:m,searchButtonRef:p,initialQuery:v,keyboardShortcuts:b,openModal:g,closeModal:A,isAskAiActive:S,isModalActive:O,onAskAiToggle:E}},[c,p,v,b,g,A,S,O,E]);return t.createElement(d.Provider,{value:w},r)}d.displayName="DocSearchContext",m.displayName="DocSearch",e.DEFAULT_KEYBOARD_SHORTCUTS=c,e.DocSearch=m,e.useDocSearch=function(){var e=t.useContext(d);if(void 0===e)throw new Error("`useDocSearch` must be used within the `DocSearch` provider");return e},e.useDocSearchKeyboardEvents=l,e.useKeyboardShortcuts=u,e.useTheme=s});
1
+ /*! @docsearch/core 4.4.0 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */
2
+ !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 r(e,t){(null==t||t>e.length)&&(t=e.length);for(var r=0,n=Array(t);r<t;r++)n[r]=e[r];return n}function n(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 o(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 i(e){for(var t=1;t<arguments.length;t++){var r=null!=arguments[t]?arguments[t]:{};t%2?o(Object(r),!0).forEach(function(t){n(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):o(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}function a(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var r=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=r){var n,o,i,a,u=[],c=!0,s=!1;try{if(i=(r=r.call(e)).next,0===t);else for(;!(c=(n=i.call(r)).done)&&(u.push(n.value),u.length!==t);c=!0);}catch(e){s=!0,o=e}finally{try{if(!c&&null!=r.return&&(a=r.return(),Object(a)!==a))return}finally{if(s)throw o}}return u}}(e,t)||function(e,t){if(e){if("string"==typeof e)return r(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(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 i(i({},u),e)}function s(e){var r=e.isOpen,n=e.isAskAiActive,o=e.onAskAiToggle,i=e.onClose,a=e.onOpen,c=e.onInput,s=e.searchButtonRef,l=e.keyboardShortcuts,f=void 0===l?u:l;t.useEffect(function(){function e(e){var t;if(r&&"Escape"===e.code&&n)o(!1);else{var u=f["Ctrl/Cmd+K"]&&"k"===(null===(t=e.key)||void 0===t?void 0:t.toLowerCase())&&(e.metaKey||e.ctrlKey),l=f["/"]&&"/"===e.key;if("Escape"===e.code&&r||u||!function(e){var t=e.composedPath()[0],r=t.tagName;return t.isContentEditable||"INPUT"===r||"SELECT"===r||"TEXTAREA"===r}(e)&&l&&!r)return e.preventDefault(),void(r?i():document.body.classList.contains("DocSearch--active")||a());s&&s.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)}},[r,n,s,f,a,i,c,o])}var l=function(e){var r=e.theme;t.useEffect(function(){if(r){var e=document.documentElement.dataset.theme;if(r!==e)return document.documentElement.dataset.theme=r,function(){void 0===e?delete document.documentElement.dataset.theme:document.documentElement.dataset.theme=e}}},[r])},f=["children","theme"],d=t.createContext(void 0);function m(e){var r=e.children,n=e.theme,o=function(e,t){if(null==e)return{};var r,n,o=function(e,t){if(null==e)return{};var r={};for(var n in e)if({}.hasOwnProperty.call(e,n)){if(-1!==t.indexOf(n))continue;r[n]=e[n]}return r}(e,t);if(Object.getOwnPropertySymbols){var i=Object.getOwnPropertySymbols(e);for(n=0;n<i.length;n++)r=i[n],-1===t.indexOf(r)&&{}.propertyIsEnumerable.call(e,r)&&(o[r]=e[r])}return o}(e,f),i=a(t.useState("ready"),2),u=i[0],m=i[1],y=a(t.useState(o.initialQuery||""),2),v=y[0],h=y[1],p=t.useRef(null),b=c(o.keyboardShortcuts),S=a(t.useState(),2),w=S[0],O=S[1],g=a(t.useState(function(){return new Set}),2),A=g[0],E=g[1],k=function(){var e=a(t.useState(!1),2),r=e[0],n=e[1];return t.useEffect(function(){var e=function(){var e=window.matchMedia("(max-width: 768px)");n(e.matches)};return e(),window.addEventListener("resize",e),function(){window.removeEventListener("resize",e)}},[]),r}(),C=["modal-search","modal-askai"].includes(u),j="modal-askai"===u,D=A.has("sidepanel"),P=t.useCallback(function(){m("modal-search")},[]),T=t.useCallback(function(){var e;m("ready"),h(null!==(e=o.initialQuery)&&void 0!==e?e:"")},[m,o.initialQuery]),x=t.useCallback(function(e,t){if(!k&&e&&D)return O(t),void m("sidepanel");m(e?"modal-askai":"modal-search")},[m,k,D]),I=t.useCallback(function(e){m("modal-search"),h(e.key)},[m,h]),L=t.useCallback(function(e){A.has(e)||E(function(t){var r=new Set(t);return r.add(e),r})},[A]);l({theme:n}),s({isOpen:C,onOpen:P,onClose:T,onAskAiToggle:x,onInput:I,isAskAiActive:j,searchButtonRef:p,keyboardShortcuts:b});var M=t.useMemo(function(){return{docsearchState:u,setDocsearchState:m,searchButtonRef:p,initialQuery:v,keyboardShortcuts:b,openModal:P,closeModal:T,isAskAiActive:j,isModalActive:C,onAskAiToggle:x,initialAskAiMessage:w,registerView:L,isHybridModeSupported:D}},[u,p,v,b,P,T,j,C,x,w,L,D]);return t.createElement(d.Provider,{value:M},r)}d.displayName="DocSearchContext",m.displayName="DocSearch",e.DEFAULT_KEYBOARD_SHORTCUTS=u,e.DocSearch=m,e.useDocSearch=function(){var e=t.useContext(d);if(void 0===e)throw new Error("`useDocSearch` must be used within the `DocSearch` provider");return e},e.useDocSearchKeyboardEvents=s,e.useKeyboardShortcuts=c,e.useTheme=l});
3
3
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../../src/useKeyboardShortcuts.ts","../../src/useDocSearchKeyboardEvents.ts","../../src/useTheme.ts","../../src/DocSearch.tsx"],"sourcesContent":["export interface KeyboardShortcuts {\n /**\n * Enable/disable the Ctrl/Cmd+K shortcut to toggle the search modal.\n *\n * @default true\n */\n 'Ctrl/Cmd+K'?: boolean;\n /**\n * Enable/disable the / shortcut to open the search modal.\n *\n * @default true\n */\n '/'?: boolean;\n}\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} 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 { 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 { 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';\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: (active: boolean) => void;\n}\n\nexport interface DocSearchProps {\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\nexport function DocSearch({ children, theme, ...props }: DocSearchProps): 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\n const isModalActive = ['modal-search', 'modal-askai'].includes(docsearchState);\n const isAskAiActive = docsearchState === 'modal-askai';\n\n const openModal = React.useCallback((): void => {\n setDocsearchState('modal-search');\n }, []);\n\n const closeModal = React.useCallback((): void => {\n setDocsearchState('ready');\n searchButtonRef.current?.focus();\n setInitialQuery(props.initialQuery ?? '');\n }, [setDocsearchState, props.initialQuery]);\n\n const onAskAiToggle = React.useCallback(\n (active: boolean): void => {\n setDocsearchState(active ? 'modal-askai' : 'modal-search');\n },\n [setDocsearchState],\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 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 }),\n [\n docsearchState,\n searchButtonRef,\n initialQuery,\n keyboardShortcuts,\n openModal,\n closeModal,\n isAskAiActive,\n isModalActive,\n onAskAiToggle,\n ],\n );\n\n return <Context.Provider value={value}>{children}</Context.Provider>;\n}\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","DocSearch","children","props","_objectWithoutProperties","_excluded","_React$useState2","_slicedToArray","useState","docsearchState","setDocsearchState","_React$useState4","initialQuery","setInitialQuery","useRef","isModalActive","includes","openModal","useCallback","closeModal","_searchButtonRef$curr","_props$initialQuery","focus","active","value","useMemo","createElement","Provider","displayName","ctx","useContext","Error"],"mappings":"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"}
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\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\nexport interface DocSearchProps {\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\nexport function DocSearch({ children, theme, ...props }: DocSearchProps): 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\n const isModalActive = ['modal-search', 'modal-askai'].includes(docsearchState);\n const isAskAiActive = docsearchState === 'modal-askai';\n const isHybridModeSupported = registeredViews.has('sidepanel');\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 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 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}\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","DocSearch","children","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","isModalActive","includes","isHybridModeSupported","has","openModal","useCallback","closeModal","_props$initialQuery","active","initialMessage","registerView","view","prev","newViews","add","value","useMemo","createElement","Provider","displayName","ctx","useContext","Error"],"mappings":"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"}
@@ -1,3 +1,3 @@
1
- /*! @docsearch/core 4.3.1 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */
2
- !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)["@docsearch/core"]={},e.React)}(this,function(e,t){"use strict";var o={"Ctrl/Cmd+K":!0,"/":!0};e.useDocSearchKeyboardEvents=function(e){var n=e.isOpen,i=e.isAskAiActive,r=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&&i)r(!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,i,s,f,a,c,d,r])}});
1
+ /*! @docsearch/core 4.4.0 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */
2
+ !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])}});
3
3
  //# sourceMappingURL=useDocSearchKeyboardEvents.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useDocSearchKeyboardEvents.js","sources":["../../src/useKeyboardShortcuts.ts","../../src/useDocSearchKeyboardEvents.ts"],"sourcesContent":["export interface KeyboardShortcuts {\n /**\n * Enable/disable the Ctrl/Cmd+K shortcut to toggle the search modal.\n *\n * @default true\n */\n 'Ctrl/Cmd+K'?: boolean;\n /**\n * Enable/disable the / shortcut to open the search modal.\n *\n * @default true\n */\n '/'?: boolean;\n}\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} 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":";4RAoBO,IAAMA,EAA0D,CACrE,cAAc,EACd,KAAK,gCCAA,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"}
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"}
@@ -1,3 +1,3 @@
1
- /*! @docsearch/core 4.3.1 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */
2
- !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)["@docsearch/core"]={})}(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};e.DEFAULT_KEYBOARD_SHORTCUTS=o,e.useKeyboardShortcuts=function(e){return n(n({},o),e)}});
1
+ /*! @docsearch/core 4.4.0 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */
2
+ !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)}});
3
3
  //# sourceMappingURL=useKeyboardShortcuts.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useKeyboardShortcuts.js","sources":["../../src/useKeyboardShortcuts.ts"],"sourcesContent":["export interface KeyboardShortcuts {\n /**\n * Enable/disable the Ctrl/Cmd+K shortcut to toggle the search modal.\n *\n * @default true\n */\n 'Ctrl/Cmd+K'?: boolean;\n /**\n * Enable/disable the / shortcut to open the search modal.\n *\n * @default true\n */\n '/'?: boolean;\n}\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} 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"],"names":["DEFAULT_KEYBOARD_SHORTCUTS","userShortcuts","_objectSpread"],"mappings":";+uCAoBO,IAAMA,EAA0D,CACrE,cAAc,EACd,KAAK,yDASA,SAA8BC,GACnC,OAAAC,EAAAA,EACKF,CAAAA,EAAAA,GACAC,EAEP"}
1
+ {"version":3,"file":"useKeyboardShortcuts.js","sources":["../../src/useKeyboardShortcuts.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"],"names":["DEFAULT_KEYBOARD_SHORTCUTS","userShortcuts","_objectSpread"],"mappings":";0uCA+BO,IAAMA,EAA0D,CACrE,cAAc,EACd,KAAK,EACL,cAAc,yDAST,SAA8BC,GACnC,OAAAC,EAAAA,EACKF,CAAAA,EAAAA,GACAC,EAEP"}
@@ -1,3 +1,3 @@
1
- /*! @docsearch/core 4.3.1 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */
2
- !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)["@docsearch/core"]={},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])}});
1
+ /*! @docsearch/core 4.4.0 | MIT License | © Algolia, Inc. and contributors | https://docsearch.algolia.com */
2
+ !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])}});
3
3
  //# sourceMappingURL=useTheme.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"useTheme.js","sources":["../../src/useTheme.ts"],"sourcesContent":["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"],"names":["_ref","theme","useEffect","previousTheme","document","documentElement","dataset","undefined"],"mappings":";uSAQwB,SAAHA,GAAuC,IAAjCC,EAAKD,EAALC,MACzBC,EAAAA,UAAU,WACR,GAAKD,EAAL,CAIA,IAAME,EAAgBC,SAASC,gBAAgBC,QAAQL,MAEvD,GAAIA,IAAUE,EAMd,OAFAC,SAASC,gBAAgBC,QAAQL,MAAQA,EAElC,gBACiBM,IAAlBJ,SACKC,SAASC,gBAAgBC,QAAQL,MAExCG,SAASC,gBAAgBC,QAAQL,MAAQE,CAE5C,CAhBD,CAiBF,EAAG,CAACF,GACN"}
1
+ {"version":3,"file":"useTheme.js","sources":["../../src/useTheme.ts"],"sourcesContent":["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"],"names":["_ref","theme","useEffect","previousTheme","document","documentElement","dataset","undefined"],"mappings":";kSAQwB,SAAHA,GAAuC,IAAjCC,EAAKD,EAALC,MACzBC,EAAAA,UAAU,WACR,GAAKD,EAAL,CAIA,IAAME,EAAgBC,SAASC,gBAAgBC,QAAQL,MAEvD,GAAIA,IAAUE,EAMd,OAFAC,SAASC,gBAAgBC,QAAQL,MAAQA,EAElC,gBACiBM,IAAlBJ,SACKC,SAASC,gBAAgBC,QAAQL,MAExCG,SAASC,gBAAgBC,QAAQL,MAAQE,CAE5C,CAhBD,CAiBF,EAAG,CAACF,GACN"}
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "@docsearch/core",
3
3
  "description": "Core package logic for DocSearch",
4
- "version": "4.3.1",
4
+ "version": "4.4.0",
5
5
  "license": "MIT",
6
6
  "homepage": "https://docsearch.algolia.com",
7
7
  "repository": {
8
8
  "type": "git",
9
9
  "url": "git+https://github.com/algolia/docsearch.git",
10
- "directory": "packages/docsearch-react"
10
+ "directory": "packages/docsearch-core"
11
11
  },
12
12
  "author": {
13
13
  "name": "Algolia, Inc.",
@@ -38,7 +38,9 @@
38
38
  "build:clean": "rm -rf ./dist",
39
39
  "build:clean-types": "rm -rf ./dist/esm/types",
40
40
  "build:types": "tsc -p ./tsconfig.declaration.json --outDir ./dist/esm/types",
41
- "build": "yarn build:clean && yarn build:types && rollup --config --bundleConfigAsCjs && yarn build:clean-types",
41
+ "build:source": "rollup --config --bundleConfigAsCjs",
42
+ "build:dts": "rollup --config rollup.dts.config.js --bundleConfigAsCjs",
43
+ "build": "yarn build:clean && yarn build:types && yarn build:source && yarn build:dts && yarn build:clean-types",
42
44
  "on:change": "yarn build",
43
45
  "watch": "nodemon --watch src --ext ts,tsx,js,jsx,json --ignore dist/ --ignore node_modules/ --verbose --delay 250ms --exec \"yarn on:change\""
44
46
  },