@topwrite/reader 1.0.59-alpha.0 → 1.0.59-alpha.1
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.
- package/dist/277-07a022.js.map +1 -1
- package/dist/913-aa0313.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +2 -2
- package/types/components/search/index.d.ts +1 -1
- package/types/components/search/results.d.ts +1 -1
- package/types/components/search/screen-state.d.ts +1 -1
- package/types/components/search/screens/results-screen.d.ts +1 -1
package/dist/277-07a022.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"277-07a022.js","mappings":"kLAGA,MAAMA,EAAwB,oBAAXC,OAAyB,KAAOA,OAC7CC,EAAaA,SACa,IAA3BF,EAAeG,QACTH,EAAeG,aACgB,IAA/BH,EAAeI,YACZ,EACCJ,EAAeI,YAa9B,EAX+B,WAAqB,IAApBC,EAAGC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAElC,MAAOG,EAAWC,IAAgBC,EAAAA,EAAAA,WAAS,IAAMT,MAE3CU,GAAkBC,EAAAA,EAAAA,KAAY,KAChCH,EAAaR,IAAa,GAC3BG,GAEH,OADAS,EAAAA,EAAAA,IAASd,EAAK,SAAUY,GACjBH,CACX,ECpBA,IAAIM,EACJ,SAASC,IAAiS,OAApRA,EAAWC,OAAOC,OAASD,OAAOC,OAAOC,OAAS,SAAUC,GAAU,IAAK,IAAIC,EAAI,EAAGA,EAAIf,UAAUC,OAAQc,IAAK,CAAE,IAAIC,EAAShB,UAAUe,GAAI,IAAK,IAAIE,KAAOD,EAAcL,OAAOO,UAAUC,eAAeC,KAAKJ,EAAQC,KAAQH,EAAOG,GAAOD,EAAOC,GAAU,CAAE,OAAOH,CAAQ,EAAUJ,EAASW,MAAMC,KAAMtB,UAAY,CAElV,IAAIuB,EAAW,SAAkBC,GAC/B,OAAoB,gBAAoB,MAAOd,EAAS,CACtDe,UAAW,kBACXC,QAAS,gBACTC,MAAO,6BACPC,MAAO,IACPC,OAAQ,KACPL,GAAQf,IAAUA,EAAqB,gBAAoB,OAAQ,CACpEqB,EAAG,wVAEP,E,uBCGA,MAAMC,EAAW,SAAAC,GAAsD,IAA7C,QAAEC,EAAO,SAAEC,EAAQ,QAAEC,GAAwBH,EACnE,MAAMI,GAAOC,EAAAA,EAAAA,KAAA,KAAGF,QAASA,EAAOD,SAAGA,IAEnC,GAAID,EAAS,CACT,MAAMK,EAAe,CACjBC,UAAW,OACXC,oBAAsBC,GACXA,EAAIC,eAAiBC,SAASC,MAI7C,IAAIpB,EASJ,OAPIA,EADmB,iBAAZS,GAAwBA,EAAQd,eAAe,WAC9Cc,EAEA,CACJY,QAASZ,IAIVI,EAAAA,EAAAA,KAACS,EAAAA,EAAO,IACPR,KACAd,EAAKU,SAERE,G,CAIT,OAAOA,CACX,EAOc,SAAUW,EAAIC,GAAyB,IAAxB,UAAEvB,GAAsBuB,EAIjD,MAAa,YAFAC,EAAAA,EAAAA,KAGF,MAGJC,EAAAA,EAAAA,MAACC,EAAS,CAAC1B,UAAWA,EAASS,SAAA,EAClCG,EAAAA,EAAAA,KAACe,EAAS,KACVf,EAAAA,EAAAA,KAACgB,EAAAA,GAAoB,CAACC,KAAM,iBAAkBC,UAAWxB,MAEjE,CAEA,MAAMoB,EAAYK,EAAAA,GAAAA,GAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsCtBJ,EAAY,WAEd,MAAMK,GAAOC,EAAAA,EAAAA,MAEPC,GAAWC,EAAAA,EAAAA,cAAY,KACzB,MAAMC,EAAQlB,SAASmB,gBACvB,IAAIC,EAAUF,EAAM1D,WAAa0D,EAAMG,WAAa,GAEhDD,EAAU,IACVpE,OAAOsE,SAAS,EAAGF,EAAU,IAC7BG,WAAWP,EAAU,G,GAE1B,IAIH,OAFkBQ,IAEF,KACL9B,EAAAA,EAAAA,KAACN,EAAQ,CACZE,QAASwB,EAAKW,cACV,CAAAC,GAAA,SAAEC,eAAgB,CAAF,yBAEpBnC,QAASwB,EAAQzB,UACpBG,EAAAA,EAAAA,KAACkC,EAAS,MAER,IACX,C","sources":["webpack://@topwrite/reader/./src/lib/use-window-scroll.ts","webpack://@topwrite/reader/./src/images/gotop.svg","webpack://@topwrite/reader/./src/components/menu.tsx"],"sourcesContent":["import { useThrottle, useEvent } from '@topwrite/common';\r\nimport { useState } from 'react';\r\n\r\nconst win = typeof window === 'undefined' ? null : window;\r\nconst getScrollY = (): number =>\r\n (win as Window).scrollY !== void 0\r\n ? (win as Window).scrollY\r\n : (win as Window).pageYOffset === void 0\r\n ? 0\r\n : (win as Window).pageYOffset;\r\n\r\nexport const useWindowScroll = (fps = 30): number => {\r\n\r\n const [scrollTop, setScrollTop] = useState(() => getScrollY());\r\n\r\n const updateScrollTop = useThrottle(() => {\r\n setScrollTop(getScrollY());\r\n }, fps);\r\n useEvent(win, 'scroll', updateScrollTop);\r\n return scrollTop;\r\n};\r\n\r\nexport default useWindowScroll;\r\n","var _path;\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport * as React from \"react\";\nvar SvgGotop = function SvgGotop(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n className: \"gotop_svg__icon\",\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 200,\n height: 200\n }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M484.539 297.401 78.509 703.407c-11.785 11.813-11.785 30.912 0 42.724 11.816 11.815 30.94 11.815 42.757 0L507.477 359.95l379.83 379.806c11.455 11.483 30.04 11.483 41.493 0 11.51-11.454 11.51-30.039 0-41.516L534.373 303.777c-1.544-1.54-3.418-2.297-5.2-3.413-.693-.935-1.056-2.086-1.934-2.963-11.784-11.784-30.912-11.784-42.695 0h-.005zm0 0\"\n })));\n};\nexport { SvgGotop as ReactComponent };\nexport default \"data:image/svg+xml;base64,PHN2ZyB0PSIxNjU2NTc2OTMwMTg2IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjIzOTMiIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIj48cGF0aCBkPSJNNDg0LjUzODU1NSAyOTcuNDAxNDM0IDc4LjUwODA1MiA3MDMuNDA3Mzc4Yy0xMS43ODQzOTQgMTEuODEzMDQ3LTExLjc4NDM5NCAzMC45MTIwMzQgMCA0Mi43MjQwNTcgMTEuODE3MTQgMTEuODE0MDcgMzAuOTQxNzEgMTEuODE0MDcgNDIuNzU3ODI2IDBsMzg2LjIxMTEwOS0zODYuMTgxNDMzIDM3OS44MzA3OTUgMzc5LjgwNjIzNWMxMS40NTM4NjYgMTEuNDgyNTE5IDMwLjAzOTE1MyAxMS40ODI1MTkgNDEuNDkxOTk2IDAgMTEuNTExMTcxLTExLjQ1Mzg2NiAxMS41MTExNzEtMzAuMDM5MTUzIDAtNDEuNTE2NTU2TDUzNC4zNzI1NDMgMzAzLjc3NjYzMWMtMS41NDMxNDYtMS41MzkwNTMtMy40MTc4NDMtMi4yOTYyOTktNS4yMDA0NDItMy40MTI3MjYtMC42OTE3NTUtMC45MzUzMDItMS4wNTUwMjktMi4wODU0OTgtMS45MzMwMjUtMi45NjI0NzEtMTEuNzg0Mzk0LTExLjc4NDM5NC0zMC45MTIwMzQtMTEuNzg0Mzk0LTQyLjY5NTQwNSAwTDQ4NC41Mzg1NTUgMjk3LjQwMTQzNHpNNDg0LjUzODU1NSAyOTcuNDAxNDM0IiBwLWlkPSIyMzk0Ij48L3BhdGg+PC9zdmc+DQo=\";","import { InjectedComponentSet, styled, useIntl } from '@topwrite/common';\r\nimport { ComponentProps, ReactNode, useCallback } from 'react';\r\nimport useWindowScroll from '
|
|
1
|
+
{"version":3,"file":"277-07a022.js","mappings":"kLAGA,MAAMA,EAAwB,oBAAXC,OAAyB,KAAOA,OAC7CC,EAAaA,SACa,IAA3BF,EAAeG,QACTH,EAAeG,aACgB,IAA/BH,EAAeI,YACZ,EACCJ,EAAeI,YAa9B,EAX+B,WAAqB,IAApBC,EAAGC,UAAAC,OAAA,QAAAC,IAAAF,UAAA,GAAAA,UAAA,GAAG,GAElC,MAAOG,EAAWC,IAAgBC,EAAAA,EAAAA,WAAS,IAAMT,MAE3CU,GAAkBC,EAAAA,EAAAA,KAAY,KAChCH,EAAaR,IAAa,GAC3BG,GAEH,OADAS,EAAAA,EAAAA,IAASd,EAAK,SAAUY,GACjBH,CACX,ECpBA,IAAIM,EACJ,SAASC,IAAiS,OAApRA,EAAWC,OAAOC,OAASD,OAAOC,OAAOC,OAAS,SAAUC,GAAU,IAAK,IAAIC,EAAI,EAAGA,EAAIf,UAAUC,OAAQc,IAAK,CAAE,IAAIC,EAAShB,UAAUe,GAAI,IAAK,IAAIE,KAAOD,EAAcL,OAAOO,UAAUC,eAAeC,KAAKJ,EAAQC,KAAQH,EAAOG,GAAOD,EAAOC,GAAU,CAAE,OAAOH,CAAQ,EAAUJ,EAASW,MAAMC,KAAMtB,UAAY,CAElV,IAAIuB,EAAW,SAAkBC,GAC/B,OAAoB,gBAAoB,MAAOd,EAAS,CACtDe,UAAW,kBACXC,QAAS,gBACTC,MAAO,6BACPC,MAAO,IACPC,OAAQ,KACPL,GAAQf,IAAUA,EAAqB,gBAAoB,OAAQ,CACpEqB,EAAG,wVAEP,E,uBCGA,MAAMC,EAAW,SAAAC,GAAsD,IAA7C,QAAEC,EAAO,SAAEC,EAAQ,QAAEC,GAAwBH,EACnE,MAAMI,GAAOC,EAAAA,EAAAA,KAAA,KAAGF,QAASA,EAAOD,SAAGA,IAEnC,GAAID,EAAS,CACT,MAAMK,EAAe,CACjBC,UAAW,OACXC,oBAAsBC,GACXA,EAAIC,eAAiBC,SAASC,MAI7C,IAAIpB,EASJ,OAPIA,EADmB,iBAAZS,GAAwBA,EAAQd,eAAe,WAC9Cc,EAEA,CACJY,QAASZ,IAIVI,EAAAA,EAAAA,KAACS,EAAAA,EAAO,IACPR,KACAd,EAAKU,SAERE,G,CAIT,OAAOA,CACX,EAOc,SAAUW,EAAIC,GAAyB,IAAxB,UAAEvB,GAAsBuB,EAIjD,MAAa,YAFAC,EAAAA,EAAAA,KAGF,MAGJC,EAAAA,EAAAA,MAACC,EAAS,CAAC1B,UAAWA,EAASS,SAAA,EAClCG,EAAAA,EAAAA,KAACe,EAAS,KACVf,EAAAA,EAAAA,KAACgB,EAAAA,GAAoB,CAACC,KAAM,iBAAkBC,UAAWxB,MAEjE,CAEA,MAAMoB,EAAYK,EAAAA,GAAAA,GAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAsCtBJ,EAAY,WAEd,MAAMK,GAAOC,EAAAA,EAAAA,MAEPC,GAAWC,EAAAA,EAAAA,cAAY,KACzB,MAAMC,EAAQlB,SAASmB,gBACvB,IAAIC,EAAUF,EAAM1D,WAAa0D,EAAMG,WAAa,GAEhDD,EAAU,IACVpE,OAAOsE,SAAS,EAAGF,EAAU,IAC7BG,WAAWP,EAAU,G,GAE1B,IAIH,OAFkBQ,IAEF,KACL9B,EAAAA,EAAAA,KAACN,EAAQ,CACZE,QAASwB,EAAKW,cACV,CAAAC,GAAA,SAAEC,eAAgB,CAAF,yBAEpBnC,QAASwB,EAAQzB,UACpBG,EAAAA,EAAAA,KAACkC,EAAS,MAER,IACX,C","sources":["webpack://@topwrite/reader/./src/lib/use-window-scroll.ts","webpack://@topwrite/reader/./src/images/gotop.svg","webpack://@topwrite/reader/./src/components/menu.tsx"],"sourcesContent":["import { useThrottle, useEvent } from '@topwrite/common';\r\nimport { useState } from 'react';\r\n\r\nconst win = typeof window === 'undefined' ? null : window;\r\nconst getScrollY = (): number =>\r\n (win as Window).scrollY !== void 0\r\n ? (win as Window).scrollY\r\n : (win as Window).pageYOffset === void 0\r\n ? 0\r\n : (win as Window).pageYOffset;\r\n\r\nexport const useWindowScroll = (fps = 30): number => {\r\n\r\n const [scrollTop, setScrollTop] = useState(() => getScrollY());\r\n\r\n const updateScrollTop = useThrottle(() => {\r\n setScrollTop(getScrollY());\r\n }, fps);\r\n useEvent(win, 'scroll', updateScrollTop);\r\n return scrollTop;\r\n};\r\n\r\nexport default useWindowScroll;\r\n","var _path;\nfunction _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }\nimport * as React from \"react\";\nvar SvgGotop = function SvgGotop(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n className: \"gotop_svg__icon\",\n viewBox: \"0 0 1024 1024\",\n xmlns: \"http://www.w3.org/2000/svg\",\n width: 200,\n height: 200\n }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M484.539 297.401 78.509 703.407c-11.785 11.813-11.785 30.912 0 42.724 11.816 11.815 30.94 11.815 42.757 0L507.477 359.95l379.83 379.806c11.455 11.483 30.04 11.483 41.493 0 11.51-11.454 11.51-30.039 0-41.516L534.373 303.777c-1.544-1.54-3.418-2.297-5.2-3.413-.693-.935-1.056-2.086-1.934-2.963-11.784-11.784-30.912-11.784-42.695 0h-.005zm0 0\"\n })));\n};\nexport { SvgGotop as ReactComponent };\nexport default \"data:image/svg+xml;base64,PHN2ZyB0PSIxNjU2NTc2OTMwMTg2IiBjbGFzcz0iaWNvbiIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCIgdmVyc2lvbj0iMS4xIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHAtaWQ9IjIzOTMiIHdpZHRoPSIyMDAiIGhlaWdodD0iMjAwIj48cGF0aCBkPSJNNDg0LjUzODU1NSAyOTcuNDAxNDM0IDc4LjUwODA1MiA3MDMuNDA3Mzc4Yy0xMS43ODQzOTQgMTEuODEzMDQ3LTExLjc4NDM5NCAzMC45MTIwMzQgMCA0Mi43MjQwNTcgMTEuODE3MTQgMTEuODE0MDcgMzAuOTQxNzEgMTEuODE0MDcgNDIuNzU3ODI2IDBsMzg2LjIxMTEwOS0zODYuMTgxNDMzIDM3OS44MzA3OTUgMzc5LjgwNjIzNWMxMS40NTM4NjYgMTEuNDgyNTE5IDMwLjAzOTE1MyAxMS40ODI1MTkgNDEuNDkxOTk2IDAgMTEuNTExMTcxLTExLjQ1Mzg2NiAxMS41MTExNzEtMzAuMDM5MTUzIDAtNDEuNTE2NTU2TDUzNC4zNzI1NDMgMzAzLjc3NjYzMWMtMS41NDMxNDYtMS41MzkwNTMtMy40MTc4NDMtMi4yOTYyOTktNS4yMDA0NDItMy40MTI3MjYtMC42OTE3NTUtMC45MzUzMDItMS4wNTUwMjktMi4wODU0OTgtMS45MzMwMjUtMi45NjI0NzEtMTEuNzg0Mzk0LTExLjc4NDM5NC0zMC45MTIwMzQtMTEuNzg0Mzk0LTQyLjY5NTQwNSAwTDQ4NC41Mzg1NTUgMjk3LjQwMTQzNHpNNDg0LjUzODU1NSAyOTcuNDAxNDM0IiBwLWlkPSIyMzk0Ij48L3BhdGg+PC9zdmc+DQo=\";","import { InjectedComponentSet, styled, useIntl } from '@topwrite/common';\r\nimport { ComponentProps, ReactNode, useCallback } from 'react';\r\nimport useWindowScroll from '../lib/use-window-scroll';\r\nimport { ReactComponent as GotopIcon } from '../images/gotop.svg';\r\nimport Tooltip from 'rc-tooltip';\r\nimport 'rc-tooltip/assets/bootstrap.css';\r\nimport useWindowSize from '../lib/use-window-size';\r\n\r\ntype TooltipProps = ComponentProps<typeof Tooltip>;\r\n\r\nexport interface MenuItemProps {\r\n tooltip?: TooltipProps['overlay'] | TooltipProps;\r\n children: ReactNode;\r\n onClick?: () => void;\r\n}\r\n\r\nconst MenuItem = function({ tooltip, children, onClick }: MenuItemProps) {\r\n const item = <a onClick={onClick}>{children}</a>;\r\n\r\n if (tooltip) {\r\n const defaultProps = {\r\n placement: 'left',\r\n getTooltipContainer: (dom) => {\r\n return dom.parentElement || document.body;\r\n }\r\n };\r\n\r\n let props: TooltipProps;\r\n if (typeof tooltip === 'object' && tooltip.hasOwnProperty('overlay')) {\r\n props = tooltip as TooltipProps;\r\n } else {\r\n props = {\r\n overlay: tooltip\r\n };\r\n }\r\n\r\n return <Tooltip\r\n {...defaultProps}\r\n {...props}\r\n >\r\n {item}\r\n </Tooltip>;\r\n }\r\n\r\n return item;\r\n};\r\n\r\n\r\nexport interface MenuProps {\r\n className?: string;\r\n}\r\n\r\nexport default function Menu({ className }: MenuProps) {\r\n\r\n const size = useWindowSize();\r\n\r\n if (size === 'mobile') {\r\n return null;\r\n }\r\n\r\n return <Container className={className}>\r\n <GotopItem />\r\n <InjectedComponentSet role={'page:menu:item'} component={MenuItem} />\r\n </Container>;\r\n}\r\n\r\nconst Container = styled.div`\r\n\r\n position: fixed;\r\n right: 24px;\r\n bottom: 48px;\r\n z-index: 400;\r\n display: flex;\r\n flex-direction: column-reverse;\r\n\r\n a {\r\n width: 42px;\r\n height: 42px;\r\n background: #FFFFFF;\r\n box-shadow: 0 1px 4px -2px rgb(0 0 0 / 13%), 0 2px 8px rgb(0 0 0 / 8%), 0 8px 16px 4px rgb(0 0 0 / 4%);\r\n border-radius: 50%;\r\n display: flex;\r\n align-items: center;\r\n justify-content: space-around;\r\n cursor: pointer;\r\n margin-top: 16px;\r\n color: #585a5a;\r\n\r\n svg {\r\n width: 20px;\r\n height: 20px;\r\n fill: currentColor;\r\n }\r\n\r\n html[data-theme=dark] & {\r\n background-color: #1a1a1a;\r\n color: #e8e8e8;\r\n border: 1px solid rgba(235, 235, 235, 0.15);\r\n box-shadow: 0 6px 12px 0 rgba(0, 0, 0, 0.24);\r\n }\r\n }\r\n\r\n`;\r\n\r\nconst GotopItem = function() {\r\n\r\n const intl = useIntl();\r\n\r\n const scrollUp = useCallback(() => {\r\n const frame = document.documentElement;\r\n let pageTop = frame.scrollTop - (frame.clientTop || 0);\r\n\r\n if (pageTop > 0) {\r\n window.scrollTo(0, pageTop - 30);\r\n setTimeout(scrollUp, 2);\r\n }\r\n }, []);\r\n\r\n const scrollTop = useWindowScroll();\r\n\r\n if (scrollTop > 500) {\r\n return <MenuItem\r\n tooltip={intl.formatMessage(\r\n { defaultMessage: `回到顶部` }\r\n )}\r\n onClick={scrollUp}\r\n ><GotopIcon /></MenuItem>;\r\n }\r\n return null;\r\n};\r\n"],"names":["win","window","getScrollY","scrollY","pageYOffset","fps","arguments","length","undefined","scrollTop","setScrollTop","useState","updateScrollTop","useThrottle","useEvent","_path","_extends","Object","assign","bind","target","i","source","key","prototype","hasOwnProperty","call","apply","this","SvgGotop","props","className","viewBox","xmlns","width","height","d","MenuItem","_ref","tooltip","children","onClick","item","_jsx","defaultProps","placement","getTooltipContainer","dom","parentElement","document","body","overlay","Tooltip","Menu","_ref2","useWindowSize","_jsxs","Container","GotopItem","InjectedComponentSet","role","component","styled","intl","useIntl","scrollUp","useCallback","frame","documentElement","pageTop","clientTop","scrollTo","setTimeout","useWindowScroll","formatMessage","id","defaultMessage","GotopIcon"],"sourceRoot":""}
|
package/dist/913-aa0313.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"913-aa0313.js","mappings":"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","sources":["webpack://@topwrite/reader/./src/components/search/icons/loading-icon.tsx","webpack://@topwrite/reader/./src/components/search/icons/reset-icon.tsx","webpack://@topwrite/reader/./src/components/search/icons/search-icon.tsx","webpack://@topwrite/reader/./src/components/search/icons/select-icon.tsx","webpack://@topwrite/reader/./src/components/search/icons/content-icon.tsx","webpack://@topwrite/reader/./src/components/search/icons/error-icon.tsx","webpack://@topwrite/reader/./src/components/search/icons/no-results-icon.tsx","webpack://@topwrite/reader/./src/components/search/icons/control-key-icon.tsx","webpack://@topwrite/reader/./src/components/search/doc-search-button.tsx","webpack://@topwrite/reader/./src/components/search/constants.ts","webpack://@topwrite/reader/./src/components/search/footer.tsx","webpack://@topwrite/reader/./src/components/search/search-box.tsx","webpack://@topwrite/reader/./src/components/search/screens/error-screen.tsx","webpack://@topwrite/reader/./src/components/search/screens/no-result-screen.tsx","webpack://@topwrite/reader/./src/components/search/results.tsx","webpack://@topwrite/reader/./src/components/search/screens/results-screen.tsx","webpack://@topwrite/reader/./src/components/search/screens/start-screen.tsx","webpack://@topwrite/reader/./src/components/search/screen-state.tsx","webpack://@topwrite/reader/./src/components/search/doc-search-modal.tsx","webpack://@topwrite/reader/./src/components/search/hooks/use-trap-focus.ts","webpack://@topwrite/reader/./src/components/search/doc-search.tsx","webpack://@topwrite/reader/./src/components/search/hooks/use-keyboard-events.ts"],"sourcesContent":["export function LoadingIcon() {\r\n return (\r\n <svg viewBox='0 0 38 38' stroke='currentColor' strokeOpacity='.5'>\r\n <g fill='none' fillRule='evenodd'>\r\n <g transform='translate(1 1)' strokeWidth='2'>\r\n <circle strokeOpacity='.3' cx='18' cy='18' r='18' />\r\n <path d='M36 18c0-9.94-8.06-18-18-18'>\r\n <animateTransform\r\n attributeName='transform'\r\n type='rotate'\r\n from='0 18 18'\r\n to='360 18 18'\r\n dur='1s'\r\n repeatCount='indefinite'\r\n />\r\n </path>\r\n </g>\r\n </g>\r\n </svg>\r\n );\r\n}\r\n","export function ResetIcon() {\r\n return (\r\n <svg width='20' height='20' viewBox='0 0 20 20'>\r\n <path\r\n d='M10 10l5.09-5.09L10 10l5.09 5.09L10 10zm0 0L4.91 4.91 10 10l-5.09 5.09L10 10z'\r\n stroke='currentColor'\r\n fill='none'\r\n fillRule='evenodd'\r\n strokeLinecap='round'\r\n strokeLinejoin='round'\r\n />\r\n </svg>\r\n );\r\n}\r\n","export function SearchIcon() {\r\n return (\r\n <svg\r\n width='20'\r\n height='20'\r\n className='DocSearch-Search-Icon'\r\n viewBox='0 0 20 20'\r\n >\r\n <path\r\n d='M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z'\r\n stroke='currentColor'\r\n fill='none'\r\n fillRule='evenodd'\r\n strokeLinecap='round'\r\n strokeLinejoin='round'\r\n />\r\n </svg>\r\n );\r\n}\r\n","export function SelectIcon() {\r\n return (\r\n <svg\r\n className='DocSearch-Hit-Select-Icon'\r\n width='20'\r\n height='20'\r\n viewBox='0 0 20 20'\r\n >\r\n <g\r\n stroke='currentColor'\r\n fill='none'\r\n fillRule='evenodd'\r\n strokeLinecap='round'\r\n strokeLinejoin='round'\r\n >\r\n <path d='M18 3v4c0 2-2 4-4 4H2' />\r\n <path d='M8 17l-6-6 6-6' />\r\n </g>\r\n </svg>\r\n );\r\n}\r\n","export function ContentIcon() {\r\n return (\r\n <svg width='20' height='20' viewBox='0 0 20 20'>\r\n <path\r\n d='M17 6v12c0 .52-.2 1-1 1H4c-.7 0-1-.33-1-1V2c0-.55.42-1 1-1h8l5 5zM14 8h-3.13c-.51 0-.87-.34-.87-.87V4'\r\n stroke='currentColor'\r\n fill='none'\r\n fillRule='evenodd'\r\n strokeLinejoin='round'\r\n />\r\n </svg>\r\n );\r\n}\r\n","export function ErrorIcon() {\r\n return (\r\n <svg\r\n width='40'\r\n height='40'\r\n viewBox='0 0 20 20'\r\n fill='none'\r\n fillRule='evenodd'\r\n stroke='currentColor'\r\n strokeLinecap='round'\r\n strokeLinejoin='round'\r\n >\r\n <path\r\n d='M19 4.8a16 16 0 00-2-1.2m-3.3-1.2A16 16 0 001.1 4.7M16.7 8a12 12 0 00-2.8-1.4M10 6a12 12 0 00-6.7 2M12.3 14.7a4 4 0 00-4.5 0M14.5 11.4A8 8 0 0010 10M3 16L18 2M10 18h0'></path>\r\n </svg>\r\n );\r\n}\r\n","export function NoResultsIcon() {\r\n return (\r\n <svg\r\n width='40'\r\n height='40'\r\n viewBox='0 0 20 20'\r\n fill='none'\r\n fillRule='evenodd'\r\n stroke='currentColor'\r\n strokeLinecap='round'\r\n strokeLinejoin='round'\r\n >\r\n <path\r\n d='M15.5 4.8c2 3 1.7 7-1 9.7h0l4.3 4.3-4.3-4.3a7.8 7.8 0 01-9.8 1m-2.2-2.2A7.8 7.8 0 0113.2 2.4M2 18L18 2'></path>\r\n </svg>\r\n );\r\n}\r\n","export function ControlKeyIcon() {\r\n return (\r\n <svg width='15' height='15' className='DocSearch-Control-Key-Icon'>\r\n <path\r\n d='M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953'\r\n strokeWidth='1.2'\r\n stroke='currentColor'\r\n fill='none'\r\n strokeLinecap='square'\r\n />\r\n </svg>\r\n );\r\n}\r\n","import { ComponentProps, forwardRef, useEffect, useState } from 'react';\r\nimport { ControlKeyIcon, SearchIcon } from './icons';\r\nimport { styled, useIntl } from '@topwrite/common';\r\n\r\nexport type DocSearchButtonProps = ComponentProps<'button'>\r\n\r\nconst ACTION_KEY_DEFAULT = 'Ctrl' as const;\r\nconst ACTION_KEY_APPLE = '⌘' as const;\r\n\r\nfunction isAppleDevice() {\r\n return /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform);\r\n}\r\n\r\nexport const DocSearchButton = forwardRef<HTMLButtonElement, DocSearchButtonProps>(({ className, ...props }, ref) => {\r\n const [key, setKey] = useState<typeof ACTION_KEY_APPLE | typeof ACTION_KEY_DEFAULT | null>(null);\r\n\r\n useEffect(() => {\r\n if (typeof navigator !== 'undefined') {\r\n setKey(isAppleDevice() ? ACTION_KEY_APPLE : ACTION_KEY_DEFAULT);\r\n }\r\n }, []);\r\n\r\n const intl = useIntl();\r\n\r\n return <Button\r\n type='button'\r\n className='DocSearch DocSearch-Button'\r\n {...props}\r\n ref={ref}\r\n >\r\n <span className='DocSearch-Button-Container'>\r\n <SearchIcon />\r\n <span className='DocSearch-Button-Placeholder'>{intl.$t({ defaultMessage: '搜索' })}</span>\r\n </span>\r\n {key !== null && (\r\n <span className='DocSearch-Button-Keys'>\r\n <span className='DocSearch-Button-Key'>\r\n {key === ACTION_KEY_DEFAULT ? <ControlKeyIcon /> : key}\r\n </span>\r\n <span className='DocSearch-Button-Key'>K</span>\r\n </span>\r\n )}\r\n </Button>;\r\n});\r\n\r\nconst Button = styled.button`\r\n .DocSearch-Button-Keys {\r\n min-width: 0;\r\n padding: .125rem .25rem;\r\n background: rgba(0, 0, 0, 0.08);\r\n border-radius: .25rem;\r\n }\r\n\r\n .DocSearch-Button-Key {\r\n top: 1px;\r\n width: auto;\r\n height: 1.25rem;\r\n padding-right: .125rem;\r\n padding-left: .125rem;\r\n margin-right: 0;\r\n font-size: .875rem;\r\n background: none;\r\n box-shadow: none;\r\n }\r\n`\r\n","export const MAX_QUERY_SIZE = 64;\r\n","import React from 'react';\r\nimport { useIntl } from '@topwrite/common';\r\n\r\nexport function Footer() {\r\n const intl = useIntl();\r\n\r\n return (\r\n <>\r\n <div className='DocSearch-Logo'></div>\r\n <ul className='DocSearch-Commands'>\r\n <li>\r\n <span className='DocSearch-Commands-Key'>\r\n <CommandIcon>\r\n <path d='M12 3.53088v3c0 1-1 2-2 2H4M7 11.53088l-3-3 3-3' />\r\n </CommandIcon>\r\n </span>\r\n <span className='DocSearch-Label'>{intl.$t({ defaultMessage: '选中' })}</span>\r\n </li>\r\n <li>\r\n <span className='DocSearch-Commands-Key'>\r\n <CommandIcon>\r\n <path d='M7.5 3.5v8M10.5 8.5l-3 3-3-3' />\r\n </CommandIcon>\r\n </span>\r\n <span className='DocSearch-Commands-Key'>\r\n <CommandIcon>\r\n <path d='M7.5 11.5v-8M10.5 6.5l-3-3-3 3' />\r\n </CommandIcon>\r\n </span>\r\n <span className='DocSearch-Label'>{intl.$t({ defaultMessage: '导航' })}</span>\r\n </li>\r\n <li>\r\n <span className='DocSearch-Commands-Key'>\r\n <CommandIcon>\r\n <path\r\n d='M13.6167 8.936c-.1065.3583-.6883.962-1.4875.962-.7993 0-1.653-.9165-1.653-2.1258v-.5678c0-1.2548.7896-2.1016 1.653-2.1016.8634 0 1.3601.4778 1.4875 1.0724M9 6c-.1352-.4735-.7506-.9219-1.46-.8972-.7092.0246-1.344.57-1.344 1.2166s.4198.8812 1.3445.9805C8.465 7.3992 8.968 7.9337 9 8.5c.032.5663-.454 1.398-1.4595 1.398C6.6593 9.898 6 9 5.963 8.4851m-1.4748.5368c-.2635.5941-.8099.876-1.5443.876s-1.7073-.6248-1.7073-2.204v-.4603c0-1.0416.721-2.131 1.7073-2.131.9864 0 1.6425 1.031 1.5443 2.2492h-2.956' />\r\n </CommandIcon>\r\n </span>\r\n <span className='DocSearch-Label'>{intl.$t({ defaultMessage: '关闭' })}</span>\r\n </li>\r\n </ul>\r\n </>\r\n );\r\n}\r\n\r\ninterface CommandIconProps {\r\n children: React.ReactNode;\r\n}\r\n\r\nfunction CommandIcon(props: CommandIconProps) {\r\n return (\r\n <svg width='15' height='15'>\r\n <g\r\n fill='none'\r\n stroke='currentColor'\r\n strokeLinecap='round'\r\n strokeLinejoin='round'\r\n strokeWidth='1.2'\r\n >\r\n {props.children}\r\n </g>\r\n </svg>\r\n );\r\n}\r\n","import React, { MutableRefObject, useCallback, useMemo } from 'react';\r\nimport { MAX_QUERY_SIZE } from './constants';\r\nimport { LoadingIcon, ResetIcon, SearchIcon } from './icons';\r\nimport { debounce } from 'lodash';\r\nimport { useIntl, useModel } from '@topwrite/common';\r\n\r\ninterface SearchBoxProps {\r\n autoFocus: boolean;\r\n inputRef: MutableRefObject<HTMLInputElement | null>;\r\n isFromSelection: boolean;\r\n placeholder?: string;\r\n initialQuery: string;\r\n\r\n onClose(): void;\r\n}\r\n\r\nexport function SearchBox({\r\n autoFocus,\r\n inputRef,\r\n isFromSelection,\r\n initialQuery,\r\n onClose,\r\n placeholder\r\n\r\n}: SearchBoxProps) {\r\n\r\n const [{ query }, { fetch }] = useModel('search');\r\n\r\n React.useEffect(() => {\r\n if (autoFocus && inputRef.current) {\r\n inputRef.current.focus();\r\n }\r\n }, [autoFocus, inputRef]);\r\n\r\n React.useEffect(() => {\r\n if (isFromSelection && inputRef.current) {\r\n inputRef.current.select();\r\n fetch(initialQuery);\r\n }\r\n }, [isFromSelection, inputRef]);\r\n\r\n\r\n const onReset = useCallback(() => {\r\n if (inputRef.current) {\r\n inputRef.current.value = '';\r\n fetch('');\r\n }\r\n }, [fetch]);\r\n\r\n const debounced = useMemo(() => debounce(fetch, 300), [fetch]);\r\n\r\n const handleSearch = useCallback((e) => {\r\n debounced(e.target.value);\r\n }, [debounced]);\r\n\r\n const intl = useIntl();\r\n\r\n return (\r\n <>\r\n <form\r\n className='DocSearch-Form'\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n }}\r\n >\r\n <label className='DocSearch-MagnifierLabel'>\r\n <SearchIcon />\r\n </label>\r\n <div className='DocSearch-LoadingIndicator'>\r\n <LoadingIcon />\r\n </div>\r\n <input\r\n defaultValue={initialQuery}\r\n placeholder={placeholder}\r\n className='DocSearch-Input'\r\n ref={inputRef}\r\n autoFocus={autoFocus}\r\n maxLength={MAX_QUERY_SIZE}\r\n onChange={handleSearch}\r\n />\r\n <button\r\n title='Clear the query'\r\n className='DocSearch-Reset'\r\n hidden={!query}\r\n onClick={onReset}\r\n >\r\n <ResetIcon />\r\n </button>\r\n </form>\r\n <button className='DocSearch-Cancel' onClick={onClose}>\r\n {intl.$t({ defaultMessage: '取消' })}\r\n </button>\r\n </>\r\n );\r\n}\r\n","import { ErrorIcon } from '../icons';\r\n\r\nexport function ErrorScreen() {\r\n return (\r\n <div className='DocSearch-ErrorScreen'>\r\n <div className='DocSearch-Screen-Icon'>\r\n <ErrorIcon />\r\n </div>\r\n <p className='DocSearch-Title'>Unable to fetch results</p>\r\n <p className='DocSearch-Help'>\r\n You might want to check your network connection.\r\n </p>\r\n </div>\r\n );\r\n}\r\n","import { NoResultsIcon } from '../icons';\r\nimport { useIntl, useSelector } from '@topwrite/common';\r\n\r\nexport function NoResultsScreen() {\r\n\r\n const { query } = useSelector('search');\r\n const intl = useIntl();\r\n\r\n return (\r\n <div className='DocSearch-NoResults'>\r\n <div className='DocSearch-Screen-Icon'>\r\n <NoResultsIcon />\r\n </div>\r\n <p className='DocSearch-Title'>\r\n {intl.$t({ defaultMessage: '没有结果:' })} \"<strong>{query}</strong>\"\r\n </p>\r\n </div>\r\n );\r\n}\r\n","import { useCallback } from 'react';\r\nimport { SearchResult } from '@/models/search';\r\nimport Link from '../link';\r\nimport { ContentIcon, SelectIcon } from '@/components/search/icons';\r\n\r\nexport interface ResultItem extends SearchResult {\r\n id: number;\r\n}\r\n\r\ninterface ResultsProps {\r\n items: ResultItem[];\r\n title: string;\r\n activeIndex?: number;\r\n\r\n onItemClick(item: ResultItem): void;\r\n\r\n onActive(index: number): void;\r\n}\r\n\r\nexport function Results({ title, items, ...props }: ResultsProps) {\r\n return <section className='DocSearch-Hits'>\r\n <div className='DocSearch-Hit-source'>{title}</div>\r\n <ul>\r\n {items.map((item, index) => {\r\n return <Result\r\n key={index}\r\n item={item}\r\n {...props}\r\n />;\r\n })}\r\n </ul>\r\n </section>;\r\n}\r\n\r\ninterface ResultProps {\r\n activeIndex?: number;\r\n\r\n onItemClick(item: ResultItem): void;\r\n\r\n onActive(index: number): void;\r\n\r\n item: ResultItem;\r\n}\r\n\r\nfunction Result({\r\n item,\r\n onItemClick,\r\n onActive,\r\n activeIndex\r\n}: ResultProps) {\r\n\r\n const onMouseMove = useCallback(() => {\r\n onActive(item.id);\r\n }, [onActive, item]);\r\n\r\n return <li\r\n className='DocSearch-Hit'\r\n onClick={() => {\r\n onItemClick(item);\r\n }}\r\n onMouseMove={onMouseMove}\r\n aria-selected={activeIndex === item.id}\r\n >\r\n <Link to={item.path}>\r\n <div className='DocSearch-Hit-Container'>\r\n <div className='DocSearch-Hit-icon'>\r\n <ContentIcon />\r\n </div>\r\n <div className='DocSearch-Hit-content-wrapper'>\r\n <span className='DocSearch-Hit-title'>{item.title}</span>\r\n {item.body && <span className='DocSearch-Hit-path'>{item.body}</span>}\r\n </div>\r\n <div className='DocSearch-Hit-action'>\r\n <SelectIcon />\r\n </div>\r\n </div>\r\n </Link>\r\n </li>;\r\n}\r\n","import { Results } from '../results';\r\nimport React from 'react';\r\nimport { SearchResult } from '@/models/search';\r\n\r\ninterface ResultsScreenProps {\r\n activeIndex?: number;\r\n inputRef: React.MutableRefObject<null | HTMLInputElement>;\r\n onItemClick: (item: SearchResult) => void;\r\n onActive: (index: number) => void;\r\n collections: any;\r\n}\r\n\r\nexport function ResultsScreen({ collections, ...props }: ResultsScreenProps) {\r\n return <div className='DocSearch-Dropdown-Container'>\r\n {collections.map((collection, index) => {\r\n return <Results\r\n key={index}\r\n title={collection.title}\r\n items={collection.items}\r\n {...props}\r\n />;\r\n })}\r\n </div>;\r\n}\r\n","import { useIntl, useSelector } from '@topwrite/common';\r\n\r\ninterface StartScreenProps {\r\n hasCollections: boolean;\r\n}\r\n\r\nexport function StartScreen(props: StartScreenProps) {\r\n\r\n const { status } = useSelector('search');\r\n const intl = useIntl();\r\n\r\n if (status === 'idle' && !props.hasCollections) {\r\n return (\r\n <div className='DocSearch-StartScreen'>\r\n <p className='DocSearch-Help'>{intl.$t({ defaultMessage: '没有最近搜索' })}</p>\r\n </div>\r\n );\r\n }\r\n\r\n return null;\r\n}\r\n","import React, { useMemo } from 'react';\r\nimport { ErrorScreen } from './screens/error-screen';\r\nimport { NoResultsScreen } from './screens/no-result-screen';\r\nimport { ResultsScreen } from './screens/results-screen';\r\nimport { StartScreen } from './screens/start-screen';\r\nimport { SearchResult } from '@/models/search';\r\nimport { useBook, useIntl, useSelector } from '@topwrite/common';\r\nimport useArticle from '@/lib/use-article';\r\n\r\nexport interface ScreenStateProps {\r\n onlyCurrentPart: boolean;\r\n activeIndex?: number;\r\n inputRef: React.MutableRefObject<null | HTMLInputElement>;\r\n onItemClick: (item: SearchResult) => void;\r\n onActive: (index: number) => void;\r\n}\r\n\r\nexport const ScreenState = ({ onlyCurrentPart, ...props }: ScreenStateProps) => {\r\n\r\n const { status, query, results } = useSelector('search');\r\n\r\n const { summary } = useBook();\r\n const intl = useIntl();\r\n const article = useArticle();\r\n\r\n const collections = useMemo(() => {\r\n let id = 0;\r\n let collections;\r\n if (summary.isSinglePart()) {\r\n collections = [{\r\n title: '',\r\n items: results,\r\n }];\r\n } else {\r\n const currentPart = article ? summary.getArticlePart(article) : null;\r\n let parts = summary.getParts();\r\n if (currentPart && onlyCurrentPart) {\r\n parts = parts.filter(part => part.level === currentPart.level);\r\n }\r\n\r\n collections = parts.map((part) => {\r\n return {\r\n level: part.level,\r\n title: onlyCurrentPart ? '' : (part.title || intl.$t({ defaultMessage: '未命名分组' })),\r\n items: results.filter((result) => {\r\n const article = summary.getArticle(article => article.path === result.path);\r\n if (article) {\r\n const articlePart = summary.getArticlePart(article);\r\n return articlePart === part;\r\n }\r\n return false;\r\n })\r\n };\r\n });\r\n\r\n if (currentPart && !onlyCurrentPart) {\r\n collections = collections.sort((a) => {\r\n return a.level === currentPart.level ? -1 : 1;\r\n });\r\n }\r\n }\r\n return collections.filter(collection => collection.items.length > 0).map((collection) => {\r\n return {\r\n ...collection,\r\n items: collection.items.map((item) => {\r\n return {\r\n ...item,\r\n id: id++\r\n };\r\n })\r\n };\r\n });\r\n }, [results]);\r\n\r\n if (status === 'error') {\r\n return <ErrorScreen />;\r\n }\r\n\r\n const hasCollections = collections.length > 0;\r\n\r\n if (!query) {\r\n return <StartScreen hasCollections={hasCollections} />;\r\n }\r\n\r\n if (!hasCollections) {\r\n return <NoResultsScreen />;\r\n }\r\n\r\n return <ResultsScreen {...props} collections={collections} />;\r\n};\r\n","import { useCallback, useEffect, useRef, useState } from 'react';\r\nimport { MAX_QUERY_SIZE } from './constants';\r\nimport { DocSearchProps } from './doc-search';\r\nimport { Footer } from './footer';\r\nimport { SearchBox } from './search-box';\r\nimport { noop } from 'lodash';\r\nimport { ScreenState } from './screen-state';\r\nimport { useTrapFocus } from './hooks/use-trap-focus';\r\nimport { styled, useIntl, useSelector } from '@topwrite/common';\r\n\r\nexport interface DocSearchModalProps extends DocSearchProps {\r\n onClose?(): void;\r\n}\r\n\r\nexport function DocSearchModal({\r\n onClose = noop,\r\n onlyCurrentPart = false,\r\n}: DocSearchModalProps) {\r\n\r\n const { query, results } = useSelector('search');\r\n const intl = useIntl();\r\n const [activeIndex, setActiveIndex] = useState<number | undefined>(undefined);\r\n\r\n const containerRef = useRef<HTMLDivElement | null>(null);\r\n const modalRef = useRef<HTMLDivElement | null>(null);\r\n const formElementRef = useRef<HTMLDivElement | null>(null);\r\n const dropdownRef = useRef<HTMLDivElement | null>(null);\r\n const inputRef = useRef<HTMLInputElement | null>(null);\r\n\r\n const initialQueryFromSelection = useRef(\r\n typeof window !== 'undefined'\r\n ? window.getSelection()!.toString().slice(0, MAX_QUERY_SIZE)\r\n : ''\r\n ).current;\r\n\r\n const initialQuery = useRef(\r\n query || initialQueryFromSelection\r\n ).current;\r\n\r\n const onActive = useCallback((index) => {\r\n setActiveIndex(index);\r\n }, [setActiveIndex]);\r\n\r\n useTrapFocus({ container: containerRef.current });\r\n\r\n useEffect(() => {\r\n document.body.classList.add('DocSearch--active');\r\n\r\n return () => {\r\n document.body.classList.remove('DocSearch--active');\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (dropdownRef.current) {\r\n dropdownRef.current.scrollTop = 0;\r\n }\r\n }, [query]);\r\n\r\n useEffect(() => {\r\n if (initialQuery.length > 0) {\r\n if (inputRef.current) {\r\n inputRef.current.focus();\r\n }\r\n }\r\n }, [initialQuery]);\r\n\r\n useEffect(() => {\r\n function setFullViewportHeight() {\r\n if (modalRef.current) {\r\n const vh = window.innerHeight * 0.01;\r\n modalRef.current.style.setProperty('--docsearch-vh', `${vh}px`);\r\n }\r\n }\r\n\r\n setFullViewportHeight();\r\n\r\n window.addEventListener('resize', setFullViewportHeight);\r\n\r\n return () => {\r\n window.removeEventListener('resize', setFullViewportHeight);\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n\r\n const getActiveItem = (activeIndex: number) => {\r\n return dropdownRef.current?.getElementsByClassName('DocSearch-Hit').item(activeIndex);\r\n };\r\n\r\n const onKeyDown = (event: KeyboardEvent) => {\r\n if (event.key === 'ArrowUp' || event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n setActiveIndex((activeIndex = -1) => {\r\n if (event.key === 'ArrowUp') {\r\n --activeIndex;\r\n } else {\r\n ++activeIndex;\r\n }\r\n if (activeIndex < 0) {\r\n activeIndex = results.length - 1;\r\n }\r\n if (activeIndex >= results.length) {\r\n activeIndex = 0;\r\n }\r\n\r\n const activeItem = getActiveItem(activeIndex);\r\n if (activeItem) {\r\n if ((activeItem as any).scrollIntoViewIfNeeded) {\r\n (activeItem as any).scrollIntoViewIfNeeded(false);\r\n } else {\r\n activeItem.scrollIntoView(false);\r\n }\r\n }\r\n\r\n return activeIndex;\r\n });\r\n } else if (event.key === 'Enter') {\r\n event.preventDefault();\r\n setActiveIndex((activeIndex = -1) => {\r\n const activeItem = getActiveItem(activeIndex);\r\n if (activeItem) {\r\n requestAnimationFrame(() => {\r\n activeItem.getElementsByTagName('a').item(0)\r\n ?.dispatchEvent(new Event('click', { bubbles: true }));\r\n });\r\n }\r\n return activeIndex;\r\n });\r\n }\r\n };\r\n window.addEventListener('keydown', onKeyDown);\r\n\r\n return () => {\r\n window.removeEventListener('keydown', onKeyDown);\r\n };\r\n }, [setActiveIndex, results]);\r\n\r\n return (\r\n <Container\r\n ref={containerRef}\r\n className='DocSearch DocSearch-Container'\r\n onMouseDown={(event) => {\r\n if (event.target === event.currentTarget) {\r\n onClose();\r\n }\r\n }}\r\n >\r\n <div className='DocSearch-Modal' ref={modalRef}>\r\n <header className='DocSearch-SearchBar' ref={formElementRef}>\r\n <SearchBox\r\n initialQuery={initialQuery}\r\n placeholder={intl.$t({ defaultMessage: '搜索文档' })}\r\n autoFocus={initialQuery.length === 0}\r\n onClose={onClose}\r\n inputRef={inputRef}\r\n isFromSelection={\r\n Boolean(initialQuery) &&\r\n initialQuery === initialQueryFromSelection\r\n }\r\n />\r\n </header>\r\n <div className='DocSearch-Dropdown' ref={dropdownRef}>\r\n <ScreenState\r\n onlyCurrentPart={onlyCurrentPart}\r\n onActive={onActive}\r\n activeIndex={activeIndex}\r\n onItemClick={() => {\r\n onClose();\r\n }}\r\n inputRef={inputRef}\r\n />\r\n </div>\r\n <footer className='DocSearch-Footer'>\r\n <Footer />\r\n </footer>\r\n </div>\r\n </Container>\r\n );\r\n}\r\n\r\nconst Container = styled.div`\r\n .DocSearch-Commands-Key {\r\n padding-left: 1px;\r\n font-size: .875rem;\r\n background-color: rgba(0, 0, 0, 0.1);\r\n background-image: none;\r\n box-shadow: none;\r\n }\r\n\r\n .DocSearch-Hit-content-wrapper {\r\n line-height: 1.3;\r\n }\r\n\r\n .DocSearch-Hit-title {\r\n font-size: 1em;\r\n }\r\n\r\n .DocSearch-Help {\r\n font-size: 1em;\r\n }\r\n\r\n @media (max-width: 750px) {\r\n .DocSearch-Footer {\r\n display: none;\r\n }\r\n }\r\n\r\n .DocSearch-Label {\r\n line-height: 1;\r\n }\r\n\r\n`;\r\n","import React from 'react';\r\n\r\ninterface UseTrapFocusProps {\r\n container: HTMLElement | null;\r\n}\r\n\r\nexport function useTrapFocus({ container }: UseTrapFocusProps) {\r\n React.useEffect(() => {\r\n if (!container) {\r\n return undefined;\r\n }\r\n\r\n const focusableElements = container.querySelectorAll<HTMLElement>(\r\n 'a[href]:not([disabled]), button:not([disabled]), input:not([disabled])'\r\n );\r\n const firstElement = focusableElements[0];\r\n const lastElement = focusableElements[focusableElements.length - 1];\r\n\r\n function trapFocus(event: KeyboardEvent) {\r\n if (event.key !== 'Tab') {\r\n return;\r\n }\r\n\r\n if (event.shiftKey) {\r\n if (document.activeElement === firstElement) {\r\n event.preventDefault();\r\n lastElement.focus();\r\n }\r\n } else if (document.activeElement === lastElement) {\r\n event.preventDefault();\r\n firstElement.focus();\r\n }\r\n }\r\n\r\n container.addEventListener('keydown', trapFocus);\r\n\r\n return () => {\r\n container.removeEventListener('keydown', trapFocus);\r\n };\r\n }, [container]);\r\n}\r\n","import { useKeyboardEvents } from './hooks/use-keyboard-events';\r\nimport { ElementType, useCallback, useRef, useState } from 'react';\r\nimport { DocSearchButton } from './doc-search-button';\r\nimport { createPortal } from 'react-dom';\r\nimport { DocSearchModal } from './doc-search-modal';\r\nimport { createGlobalStyle } from '@topwrite/common';\r\nimport '@docsearch/css';\r\n\r\nexport interface DocSearchProps {\r\n as?: ElementType;\r\n className?: string;\r\n onlyCurrentPart?: boolean;\r\n}\r\n\r\nexport default function DocSearch({ as, className, ...props }: DocSearchProps) {\r\n const searchButtonRef = useRef<HTMLButtonElement>(null);\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n const onOpen = useCallback(() => {\r\n setIsOpen(true);\r\n }, [setIsOpen]);\r\n\r\n const onClose = useCallback(() => {\r\n setIsOpen(false);\r\n }, [setIsOpen]);\r\n\r\n const onInput = useCallback(() => {\r\n setIsOpen(true);\r\n }, [setIsOpen]);\r\n\r\n useKeyboardEvents({\r\n isOpen,\r\n onOpen,\r\n onClose,\r\n onInput,\r\n searchButtonRef,\r\n });\r\n\r\n const Component = as || DocSearchButton;\r\n\r\n return <>\r\n <GlobalStyle />\r\n <Component onClick={onOpen} className={className} ref={searchButtonRef} />\r\n {isOpen && createPortal(\r\n <DocSearchModal\r\n {...props}\r\n onClose={onClose}\r\n />,\r\n document.body\r\n )}\r\n </>;\r\n}\r\n\r\nconst GlobalStyle = createGlobalStyle`\r\n :root {\r\n --docsearch-primary-color: var(--ttw-primary-color);\r\n }\r\n`;\r\n","import React from 'react';\r\n\r\nexport interface UseDocSearchKeyboardEventsProps {\r\n isOpen: boolean;\r\n\r\n onOpen(): void;\r\n\r\n onClose(): void;\r\n\r\n onInput?(event: KeyboardEvent): void;\r\n\r\n searchButtonRef?: React.RefObject<HTMLButtonElement>;\r\n}\r\n\r\nfunction isEditingContent(event: KeyboardEvent): boolean {\r\n const element = event.target as HTMLElement;\r\n const tagName = element.tagName;\r\n\r\n return (\r\n element.isContentEditable ||\r\n tagName === 'INPUT' ||\r\n tagName === 'SELECT' ||\r\n tagName === 'TEXTAREA'\r\n );\r\n}\r\n\r\nexport function useKeyboardEvents({\r\n isOpen,\r\n onOpen,\r\n onClose,\r\n onInput,\r\n searchButtonRef,\r\n}: UseDocSearchKeyboardEventsProps) {\r\n React.useEffect(() => {\r\n function onKeyDown(event: KeyboardEvent) {\r\n function open() {\r\n // We check that no other DocSearch modal is showing before opening\r\n // another one.\r\n if (!document.body.classList.contains('DocSearch--active')) {\r\n onOpen();\r\n }\r\n }\r\n\r\n if (\r\n (event.keyCode === 27 && isOpen) ||\r\n // The `Cmd+K` shortcut both opens and closes the modal.\r\n (event.key === 'k' && (event.metaKey || event.ctrlKey)) ||\r\n // The `/` shortcut opens but doesn't close the modal because it's\r\n // a character.\r\n (!isEditingContent(event) && event.key === '/' && !isOpen)\r\n ) {\r\n event.preventDefault();\r\n\r\n if (isOpen) {\r\n onClose();\r\n } else if (!document.body.classList.contains('DocSearch--active')) {\r\n open();\r\n }\r\n }\r\n\r\n if (\r\n searchButtonRef &&\r\n searchButtonRef.current === document.activeElement &&\r\n onInput\r\n ) {\r\n if (/[a-zA-Z0-9]/.test(String.fromCharCode(event.keyCode))) {\r\n onInput(event);\r\n }\r\n }\r\n }\r\n\r\n window.addEventListener('keydown', onKeyDown);\r\n\r\n return () => {\r\n window.removeEventListener('keydown', onKeyDown);\r\n };\r\n }, [isOpen, onOpen, onClose, onInput, searchButtonRef]);\r\n}\r\n"],"names":["LoadingIcon","_jsx","viewBox","stroke","strokeOpacity","children","fill","fillRule","_jsxs","transform","strokeWidth","cx","cy","r","d","attributeName","type","from","to","dur","repeatCount","ResetIcon","width","height","strokeLinecap","strokeLinejoin","SearchIcon","className","SelectIcon","ContentIcon","ErrorIcon","NoResultsIcon","ControlKeyIcon","ACTION_KEY_DEFAULT","DocSearchButton","forwardRef","_ref","ref","props","key","setKey","useState","useEffect","navigator","test","platform","intl","useIntl","Button","$t","id","defaultMessage","styled","MAX_QUERY_SIZE","Footer","_Fragment","CommandIcon","SearchBox","autoFocus","inputRef","isFromSelection","initialQuery","onClose","placeholder","query","fetch","useModel","React","current","focus","select","onReset","useCallback","value","debounced","useMemo","debounce","handleSearch","e","target","onSubmit","event","preventDefault","defaultValue","maxLength","onChange","title","hidden","onClick","ErrorScreen","NoResultsScreen","useSelector","Results","items","map","item","index","Result","_ref2","onItemClick","onActive","activeIndex","onMouseMove","Link","path","body","ResultsScreen","collections","collection","StartScreen","status","hasCollections","ScreenState","onlyCurrentPart","results","summary","useBook","article","useArticle","isSinglePart","currentPart","getArticlePart","parts","getParts","filter","part","level","result","getArticle","sort","a","length","DocSearchModal","noop","setActiveIndex","undefined","containerRef","useRef","modalRef","formElementRef","dropdownRef","initialQueryFromSelection","window","getSelection","toString","slice","container","focusableElements","querySelectorAll","firstElement","lastElement","trapFocus","shiftKey","document","activeElement","addEventListener","removeEventListener","useTrapFocus","classList","add","remove","scrollTop","setFullViewportHeight","vh","innerHeight","style","setProperty","getActiveItem","getElementsByClassName","onKeyDown","arguments","activeItem","scrollIntoViewIfNeeded","scrollIntoView","requestAnimationFrame","getElementsByTagName","dispatchEvent","Event","bubbles","Container","onMouseDown","currentTarget","Boolean","DocSearch","as","searchButtonRef","isOpen","setIsOpen","onOpen","onInput","keyCode","metaKey","ctrlKey","element","tagName","isContentEditable","isEditingContent","contains","String","fromCharCode","useKeyboardEvents","Component","GlobalStyle","createPortal","createGlobalStyle"],"sourceRoot":""}
|
|
1
|
+
{"version":3,"file":"913-aa0313.js","mappings":"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","sources":["webpack://@topwrite/reader/./src/components/search/icons/loading-icon.tsx","webpack://@topwrite/reader/./src/components/search/icons/reset-icon.tsx","webpack://@topwrite/reader/./src/components/search/icons/search-icon.tsx","webpack://@topwrite/reader/./src/components/search/icons/select-icon.tsx","webpack://@topwrite/reader/./src/components/search/icons/content-icon.tsx","webpack://@topwrite/reader/./src/components/search/icons/error-icon.tsx","webpack://@topwrite/reader/./src/components/search/icons/no-results-icon.tsx","webpack://@topwrite/reader/./src/components/search/icons/control-key-icon.tsx","webpack://@topwrite/reader/./src/components/search/doc-search-button.tsx","webpack://@topwrite/reader/./src/components/search/constants.ts","webpack://@topwrite/reader/./src/components/search/footer.tsx","webpack://@topwrite/reader/./src/components/search/search-box.tsx","webpack://@topwrite/reader/./src/components/search/screens/error-screen.tsx","webpack://@topwrite/reader/./src/components/search/screens/no-result-screen.tsx","webpack://@topwrite/reader/./src/components/search/results.tsx","webpack://@topwrite/reader/./src/components/search/screens/results-screen.tsx","webpack://@topwrite/reader/./src/components/search/screens/start-screen.tsx","webpack://@topwrite/reader/./src/components/search/screen-state.tsx","webpack://@topwrite/reader/./src/components/search/doc-search-modal.tsx","webpack://@topwrite/reader/./src/components/search/hooks/use-trap-focus.ts","webpack://@topwrite/reader/./src/components/search/doc-search.tsx","webpack://@topwrite/reader/./src/components/search/hooks/use-keyboard-events.ts"],"sourcesContent":["export function LoadingIcon() {\r\n return (\r\n <svg viewBox='0 0 38 38' stroke='currentColor' strokeOpacity='.5'>\r\n <g fill='none' fillRule='evenodd'>\r\n <g transform='translate(1 1)' strokeWidth='2'>\r\n <circle strokeOpacity='.3' cx='18' cy='18' r='18' />\r\n <path d='M36 18c0-9.94-8.06-18-18-18'>\r\n <animateTransform\r\n attributeName='transform'\r\n type='rotate'\r\n from='0 18 18'\r\n to='360 18 18'\r\n dur='1s'\r\n repeatCount='indefinite'\r\n />\r\n </path>\r\n </g>\r\n </g>\r\n </svg>\r\n );\r\n}\r\n","export function ResetIcon() {\r\n return (\r\n <svg width='20' height='20' viewBox='0 0 20 20'>\r\n <path\r\n d='M10 10l5.09-5.09L10 10l5.09 5.09L10 10zm0 0L4.91 4.91 10 10l-5.09 5.09L10 10z'\r\n stroke='currentColor'\r\n fill='none'\r\n fillRule='evenodd'\r\n strokeLinecap='round'\r\n strokeLinejoin='round'\r\n />\r\n </svg>\r\n );\r\n}\r\n","export function SearchIcon() {\r\n return (\r\n <svg\r\n width='20'\r\n height='20'\r\n className='DocSearch-Search-Icon'\r\n viewBox='0 0 20 20'\r\n >\r\n <path\r\n d='M14.386 14.386l4.0877 4.0877-4.0877-4.0877c-2.9418 2.9419-7.7115 2.9419-10.6533 0-2.9419-2.9418-2.9419-7.7115 0-10.6533 2.9418-2.9419 7.7115-2.9419 10.6533 0 2.9419 2.9418 2.9419 7.7115 0 10.6533z'\r\n stroke='currentColor'\r\n fill='none'\r\n fillRule='evenodd'\r\n strokeLinecap='round'\r\n strokeLinejoin='round'\r\n />\r\n </svg>\r\n );\r\n}\r\n","export function SelectIcon() {\r\n return (\r\n <svg\r\n className='DocSearch-Hit-Select-Icon'\r\n width='20'\r\n height='20'\r\n viewBox='0 0 20 20'\r\n >\r\n <g\r\n stroke='currentColor'\r\n fill='none'\r\n fillRule='evenodd'\r\n strokeLinecap='round'\r\n strokeLinejoin='round'\r\n >\r\n <path d='M18 3v4c0 2-2 4-4 4H2' />\r\n <path d='M8 17l-6-6 6-6' />\r\n </g>\r\n </svg>\r\n );\r\n}\r\n","export function ContentIcon() {\r\n return (\r\n <svg width='20' height='20' viewBox='0 0 20 20'>\r\n <path\r\n d='M17 6v12c0 .52-.2 1-1 1H4c-.7 0-1-.33-1-1V2c0-.55.42-1 1-1h8l5 5zM14 8h-3.13c-.51 0-.87-.34-.87-.87V4'\r\n stroke='currentColor'\r\n fill='none'\r\n fillRule='evenodd'\r\n strokeLinejoin='round'\r\n />\r\n </svg>\r\n );\r\n}\r\n","export function ErrorIcon() {\r\n return (\r\n <svg\r\n width='40'\r\n height='40'\r\n viewBox='0 0 20 20'\r\n fill='none'\r\n fillRule='evenodd'\r\n stroke='currentColor'\r\n strokeLinecap='round'\r\n strokeLinejoin='round'\r\n >\r\n <path\r\n d='M19 4.8a16 16 0 00-2-1.2m-3.3-1.2A16 16 0 001.1 4.7M16.7 8a12 12 0 00-2.8-1.4M10 6a12 12 0 00-6.7 2M12.3 14.7a4 4 0 00-4.5 0M14.5 11.4A8 8 0 0010 10M3 16L18 2M10 18h0'></path>\r\n </svg>\r\n );\r\n}\r\n","export function NoResultsIcon() {\r\n return (\r\n <svg\r\n width='40'\r\n height='40'\r\n viewBox='0 0 20 20'\r\n fill='none'\r\n fillRule='evenodd'\r\n stroke='currentColor'\r\n strokeLinecap='round'\r\n strokeLinejoin='round'\r\n >\r\n <path\r\n d='M15.5 4.8c2 3 1.7 7-1 9.7h0l4.3 4.3-4.3-4.3a7.8 7.8 0 01-9.8 1m-2.2-2.2A7.8 7.8 0 0113.2 2.4M2 18L18 2'></path>\r\n </svg>\r\n );\r\n}\r\n","export function ControlKeyIcon() {\r\n return (\r\n <svg width='15' height='15' className='DocSearch-Control-Key-Icon'>\r\n <path\r\n d='M4.505 4.496h2M5.505 5.496v5M8.216 4.496l.055 5.993M10 7.5c.333.333.5.667.5 1v2M12.326 4.5v5.996M8.384 4.496c1.674 0 2.116 0 2.116 1.5s-.442 1.5-2.116 1.5M3.205 9.303c-.09.448-.277 1.21-1.241 1.203C1 10.5.5 9.513.5 8V7c0-1.57.5-2.5 1.464-2.494.964.006 1.134.598 1.24 1.342M12.553 10.5h1.953'\r\n strokeWidth='1.2'\r\n stroke='currentColor'\r\n fill='none'\r\n strokeLinecap='square'\r\n />\r\n </svg>\r\n );\r\n}\r\n","import { ComponentProps, forwardRef, useEffect, useState } from 'react';\r\nimport { ControlKeyIcon, SearchIcon } from './icons';\r\nimport { styled, useIntl } from '@topwrite/common';\r\n\r\nexport type DocSearchButtonProps = ComponentProps<'button'>\r\n\r\nconst ACTION_KEY_DEFAULT = 'Ctrl' as const;\r\nconst ACTION_KEY_APPLE = '⌘' as const;\r\n\r\nfunction isAppleDevice() {\r\n return /(Mac|iPhone|iPod|iPad)/i.test(navigator.platform);\r\n}\r\n\r\nexport const DocSearchButton = forwardRef<HTMLButtonElement, DocSearchButtonProps>(({ className, ...props }, ref) => {\r\n const [key, setKey] = useState<typeof ACTION_KEY_APPLE | typeof ACTION_KEY_DEFAULT | null>(null);\r\n\r\n useEffect(() => {\r\n if (typeof navigator !== 'undefined') {\r\n setKey(isAppleDevice() ? ACTION_KEY_APPLE : ACTION_KEY_DEFAULT);\r\n }\r\n }, []);\r\n\r\n const intl = useIntl();\r\n\r\n return <Button\r\n type='button'\r\n className='DocSearch DocSearch-Button'\r\n {...props}\r\n ref={ref}\r\n >\r\n <span className='DocSearch-Button-Container'>\r\n <SearchIcon />\r\n <span className='DocSearch-Button-Placeholder'>{intl.$t({ defaultMessage: '搜索' })}</span>\r\n </span>\r\n {key !== null && (\r\n <span className='DocSearch-Button-Keys'>\r\n <span className='DocSearch-Button-Key'>\r\n {key === ACTION_KEY_DEFAULT ? <ControlKeyIcon /> : key}\r\n </span>\r\n <span className='DocSearch-Button-Key'>K</span>\r\n </span>\r\n )}\r\n </Button>;\r\n});\r\n\r\nconst Button = styled.button`\r\n .DocSearch-Button-Keys {\r\n min-width: 0;\r\n padding: .125rem .25rem;\r\n background: rgba(0, 0, 0, 0.08);\r\n border-radius: .25rem;\r\n }\r\n\r\n .DocSearch-Button-Key {\r\n top: 1px;\r\n width: auto;\r\n height: 1.25rem;\r\n padding-right: .125rem;\r\n padding-left: .125rem;\r\n margin-right: 0;\r\n font-size: .875rem;\r\n background: none;\r\n box-shadow: none;\r\n }\r\n`\r\n","export const MAX_QUERY_SIZE = 64;\r\n","import React from 'react';\r\nimport { useIntl } from '@topwrite/common';\r\n\r\nexport function Footer() {\r\n const intl = useIntl();\r\n\r\n return (\r\n <>\r\n <div className='DocSearch-Logo'></div>\r\n <ul className='DocSearch-Commands'>\r\n <li>\r\n <span className='DocSearch-Commands-Key'>\r\n <CommandIcon>\r\n <path d='M12 3.53088v3c0 1-1 2-2 2H4M7 11.53088l-3-3 3-3' />\r\n </CommandIcon>\r\n </span>\r\n <span className='DocSearch-Label'>{intl.$t({ defaultMessage: '选中' })}</span>\r\n </li>\r\n <li>\r\n <span className='DocSearch-Commands-Key'>\r\n <CommandIcon>\r\n <path d='M7.5 3.5v8M10.5 8.5l-3 3-3-3' />\r\n </CommandIcon>\r\n </span>\r\n <span className='DocSearch-Commands-Key'>\r\n <CommandIcon>\r\n <path d='M7.5 11.5v-8M10.5 6.5l-3-3-3 3' />\r\n </CommandIcon>\r\n </span>\r\n <span className='DocSearch-Label'>{intl.$t({ defaultMessage: '导航' })}</span>\r\n </li>\r\n <li>\r\n <span className='DocSearch-Commands-Key'>\r\n <CommandIcon>\r\n <path\r\n d='M13.6167 8.936c-.1065.3583-.6883.962-1.4875.962-.7993 0-1.653-.9165-1.653-2.1258v-.5678c0-1.2548.7896-2.1016 1.653-2.1016.8634 0 1.3601.4778 1.4875 1.0724M9 6c-.1352-.4735-.7506-.9219-1.46-.8972-.7092.0246-1.344.57-1.344 1.2166s.4198.8812 1.3445.9805C8.465 7.3992 8.968 7.9337 9 8.5c.032.5663-.454 1.398-1.4595 1.398C6.6593 9.898 6 9 5.963 8.4851m-1.4748.5368c-.2635.5941-.8099.876-1.5443.876s-1.7073-.6248-1.7073-2.204v-.4603c0-1.0416.721-2.131 1.7073-2.131.9864 0 1.6425 1.031 1.5443 2.2492h-2.956' />\r\n </CommandIcon>\r\n </span>\r\n <span className='DocSearch-Label'>{intl.$t({ defaultMessage: '关闭' })}</span>\r\n </li>\r\n </ul>\r\n </>\r\n );\r\n}\r\n\r\ninterface CommandIconProps {\r\n children: React.ReactNode;\r\n}\r\n\r\nfunction CommandIcon(props: CommandIconProps) {\r\n return (\r\n <svg width='15' height='15'>\r\n <g\r\n fill='none'\r\n stroke='currentColor'\r\n strokeLinecap='round'\r\n strokeLinejoin='round'\r\n strokeWidth='1.2'\r\n >\r\n {props.children}\r\n </g>\r\n </svg>\r\n );\r\n}\r\n","import React, { MutableRefObject, useCallback, useMemo } from 'react';\r\nimport { MAX_QUERY_SIZE } from './constants';\r\nimport { LoadingIcon, ResetIcon, SearchIcon } from './icons';\r\nimport { debounce } from 'lodash';\r\nimport { useIntl, useModel } from '@topwrite/common';\r\n\r\ninterface SearchBoxProps {\r\n autoFocus: boolean;\r\n inputRef: MutableRefObject<HTMLInputElement | null>;\r\n isFromSelection: boolean;\r\n placeholder?: string;\r\n initialQuery: string;\r\n\r\n onClose(): void;\r\n}\r\n\r\nexport function SearchBox({\r\n autoFocus,\r\n inputRef,\r\n isFromSelection,\r\n initialQuery,\r\n onClose,\r\n placeholder\r\n\r\n}: SearchBoxProps) {\r\n\r\n const [{ query }, { fetch }] = useModel('search');\r\n\r\n React.useEffect(() => {\r\n if (autoFocus && inputRef.current) {\r\n inputRef.current.focus();\r\n }\r\n }, [autoFocus, inputRef]);\r\n\r\n React.useEffect(() => {\r\n if (isFromSelection && inputRef.current) {\r\n inputRef.current.select();\r\n fetch(initialQuery);\r\n }\r\n }, [isFromSelection, inputRef]);\r\n\r\n\r\n const onReset = useCallback(() => {\r\n if (inputRef.current) {\r\n inputRef.current.value = '';\r\n fetch('');\r\n }\r\n }, [fetch]);\r\n\r\n const debounced = useMemo(() => debounce(fetch, 300), [fetch]);\r\n\r\n const handleSearch = useCallback((e) => {\r\n debounced(e.target.value);\r\n }, [debounced]);\r\n\r\n const intl = useIntl();\r\n\r\n return (\r\n <>\r\n <form\r\n className='DocSearch-Form'\r\n onSubmit={(event) => {\r\n event.preventDefault();\r\n }}\r\n >\r\n <label className='DocSearch-MagnifierLabel'>\r\n <SearchIcon />\r\n </label>\r\n <div className='DocSearch-LoadingIndicator'>\r\n <LoadingIcon />\r\n </div>\r\n <input\r\n defaultValue={initialQuery}\r\n placeholder={placeholder}\r\n className='DocSearch-Input'\r\n ref={inputRef}\r\n autoFocus={autoFocus}\r\n maxLength={MAX_QUERY_SIZE}\r\n onChange={handleSearch}\r\n />\r\n <button\r\n title='Clear the query'\r\n className='DocSearch-Reset'\r\n hidden={!query}\r\n onClick={onReset}\r\n >\r\n <ResetIcon />\r\n </button>\r\n </form>\r\n <button className='DocSearch-Cancel' onClick={onClose}>\r\n {intl.$t({ defaultMessage: '取消' })}\r\n </button>\r\n </>\r\n );\r\n}\r\n","import { ErrorIcon } from '../icons';\r\n\r\nexport function ErrorScreen() {\r\n return (\r\n <div className='DocSearch-ErrorScreen'>\r\n <div className='DocSearch-Screen-Icon'>\r\n <ErrorIcon />\r\n </div>\r\n <p className='DocSearch-Title'>Unable to fetch results</p>\r\n <p className='DocSearch-Help'>\r\n You might want to check your network connection.\r\n </p>\r\n </div>\r\n );\r\n}\r\n","import { NoResultsIcon } from '../icons';\r\nimport { useIntl, useSelector } from '@topwrite/common';\r\n\r\nexport function NoResultsScreen() {\r\n\r\n const { query } = useSelector('search');\r\n const intl = useIntl();\r\n\r\n return (\r\n <div className='DocSearch-NoResults'>\r\n <div className='DocSearch-Screen-Icon'>\r\n <NoResultsIcon />\r\n </div>\r\n <p className='DocSearch-Title'>\r\n {intl.$t({ defaultMessage: '没有结果:' })} \"<strong>{query}</strong>\"\r\n </p>\r\n </div>\r\n );\r\n}\r\n","import { useCallback } from 'react';\r\nimport { SearchResult } from '../../models/search';\r\nimport Link from '../link';\r\nimport { ContentIcon, SelectIcon } from './icons';\r\n\r\nexport interface ResultItem extends SearchResult {\r\n id: number;\r\n}\r\n\r\ninterface ResultsProps {\r\n items: ResultItem[];\r\n title: string;\r\n activeIndex?: number;\r\n\r\n onItemClick(item: ResultItem): void;\r\n\r\n onActive(index: number): void;\r\n}\r\n\r\nexport function Results({ title, items, ...props }: ResultsProps) {\r\n return <section className='DocSearch-Hits'>\r\n <div className='DocSearch-Hit-source'>{title}</div>\r\n <ul>\r\n {items.map((item, index) => {\r\n return <Result\r\n key={index}\r\n item={item}\r\n {...props}\r\n />;\r\n })}\r\n </ul>\r\n </section>;\r\n}\r\n\r\ninterface ResultProps {\r\n activeIndex?: number;\r\n\r\n onItemClick(item: ResultItem): void;\r\n\r\n onActive(index: number): void;\r\n\r\n item: ResultItem;\r\n}\r\n\r\nfunction Result({\r\n item,\r\n onItemClick,\r\n onActive,\r\n activeIndex\r\n}: ResultProps) {\r\n\r\n const onMouseMove = useCallback(() => {\r\n onActive(item.id);\r\n }, [onActive, item]);\r\n\r\n return <li\r\n className='DocSearch-Hit'\r\n onClick={() => {\r\n onItemClick(item);\r\n }}\r\n onMouseMove={onMouseMove}\r\n aria-selected={activeIndex === item.id}\r\n >\r\n <Link to={item.path}>\r\n <div className='DocSearch-Hit-Container'>\r\n <div className='DocSearch-Hit-icon'>\r\n <ContentIcon />\r\n </div>\r\n <div className='DocSearch-Hit-content-wrapper'>\r\n <span className='DocSearch-Hit-title'>{item.title}</span>\r\n {item.body && <span className='DocSearch-Hit-path'>{item.body}</span>}\r\n </div>\r\n <div className='DocSearch-Hit-action'>\r\n <SelectIcon />\r\n </div>\r\n </div>\r\n </Link>\r\n </li>;\r\n}\r\n","import { Results } from '../results';\r\nimport React from 'react';\r\nimport { SearchResult } from '../../../models/search';\r\n\r\ninterface ResultsScreenProps {\r\n activeIndex?: number;\r\n inputRef: React.MutableRefObject<null | HTMLInputElement>;\r\n onItemClick: (item: SearchResult) => void;\r\n onActive: (index: number) => void;\r\n collections: any;\r\n}\r\n\r\nexport function ResultsScreen({ collections, ...props }: ResultsScreenProps) {\r\n return <div className='DocSearch-Dropdown-Container'>\r\n {collections.map((collection, index) => {\r\n return <Results\r\n key={index}\r\n title={collection.title}\r\n items={collection.items}\r\n {...props}\r\n />;\r\n })}\r\n </div>;\r\n}\r\n","import { useIntl, useSelector } from '@topwrite/common';\r\n\r\ninterface StartScreenProps {\r\n hasCollections: boolean;\r\n}\r\n\r\nexport function StartScreen(props: StartScreenProps) {\r\n\r\n const { status } = useSelector('search');\r\n const intl = useIntl();\r\n\r\n if (status === 'idle' && !props.hasCollections) {\r\n return (\r\n <div className='DocSearch-StartScreen'>\r\n <p className='DocSearch-Help'>{intl.$t({ defaultMessage: '没有最近搜索' })}</p>\r\n </div>\r\n );\r\n }\r\n\r\n return null;\r\n}\r\n","import React, { useMemo } from 'react';\r\nimport { ErrorScreen } from './screens/error-screen';\r\nimport { NoResultsScreen } from './screens/no-result-screen';\r\nimport { ResultsScreen } from './screens/results-screen';\r\nimport { StartScreen } from './screens/start-screen';\r\nimport { SearchResult } from '../../models/search';\r\nimport { useBook, useIntl, useSelector } from '@topwrite/common';\r\nimport useArticle from '../../lib/use-article';\r\n\r\nexport interface ScreenStateProps {\r\n onlyCurrentPart: boolean;\r\n activeIndex?: number;\r\n inputRef: React.MutableRefObject<null | HTMLInputElement>;\r\n onItemClick: (item: SearchResult) => void;\r\n onActive: (index: number) => void;\r\n}\r\n\r\nexport const ScreenState = ({ onlyCurrentPart, ...props }: ScreenStateProps) => {\r\n\r\n const { status, query, results } = useSelector('search');\r\n\r\n const { summary } = useBook();\r\n const intl = useIntl();\r\n const article = useArticle();\r\n\r\n const collections = useMemo(() => {\r\n let id = 0;\r\n let collections;\r\n if (summary.isSinglePart()) {\r\n collections = [{\r\n title: '',\r\n items: results,\r\n }];\r\n } else {\r\n const currentPart = article ? summary.getArticlePart(article) : null;\r\n let parts = summary.getParts();\r\n if (currentPart && onlyCurrentPart) {\r\n parts = parts.filter(part => part.level === currentPart.level);\r\n }\r\n\r\n collections = parts.map((part) => {\r\n return {\r\n level: part.level,\r\n title: onlyCurrentPart ? '' : (part.title || intl.$t({ defaultMessage: '未命名分组' })),\r\n items: results.filter((result) => {\r\n const article = summary.getArticle(article => article.path === result.path);\r\n if (article) {\r\n const articlePart = summary.getArticlePart(article);\r\n return articlePart === part;\r\n }\r\n return false;\r\n })\r\n };\r\n });\r\n\r\n if (currentPart && !onlyCurrentPart) {\r\n collections = collections.sort((a) => {\r\n return a.level === currentPart.level ? -1 : 1;\r\n });\r\n }\r\n }\r\n return collections.filter(collection => collection.items.length > 0).map((collection) => {\r\n return {\r\n ...collection,\r\n items: collection.items.map((item) => {\r\n return {\r\n ...item,\r\n id: id++\r\n };\r\n })\r\n };\r\n });\r\n }, [results]);\r\n\r\n if (status === 'error') {\r\n return <ErrorScreen />;\r\n }\r\n\r\n const hasCollections = collections.length > 0;\r\n\r\n if (!query) {\r\n return <StartScreen hasCollections={hasCollections} />;\r\n }\r\n\r\n if (!hasCollections) {\r\n return <NoResultsScreen />;\r\n }\r\n\r\n return <ResultsScreen {...props} collections={collections} />;\r\n};\r\n","import { useCallback, useEffect, useRef, useState } from 'react';\r\nimport { MAX_QUERY_SIZE } from './constants';\r\nimport { DocSearchProps } from './doc-search';\r\nimport { Footer } from './footer';\r\nimport { SearchBox } from './search-box';\r\nimport { noop } from 'lodash';\r\nimport { ScreenState } from './screen-state';\r\nimport { useTrapFocus } from './hooks/use-trap-focus';\r\nimport { styled, useIntl, useSelector } from '@topwrite/common';\r\n\r\nexport interface DocSearchModalProps extends DocSearchProps {\r\n onClose?(): void;\r\n}\r\n\r\nexport function DocSearchModal({\r\n onClose = noop,\r\n onlyCurrentPart = false,\r\n}: DocSearchModalProps) {\r\n\r\n const { query, results } = useSelector('search');\r\n const intl = useIntl();\r\n const [activeIndex, setActiveIndex] = useState<number | undefined>(undefined);\r\n\r\n const containerRef = useRef<HTMLDivElement | null>(null);\r\n const modalRef = useRef<HTMLDivElement | null>(null);\r\n const formElementRef = useRef<HTMLDivElement | null>(null);\r\n const dropdownRef = useRef<HTMLDivElement | null>(null);\r\n const inputRef = useRef<HTMLInputElement | null>(null);\r\n\r\n const initialQueryFromSelection = useRef(\r\n typeof window !== 'undefined'\r\n ? window.getSelection()!.toString().slice(0, MAX_QUERY_SIZE)\r\n : ''\r\n ).current;\r\n\r\n const initialQuery = useRef(\r\n query || initialQueryFromSelection\r\n ).current;\r\n\r\n const onActive = useCallback((index) => {\r\n setActiveIndex(index);\r\n }, [setActiveIndex]);\r\n\r\n useTrapFocus({ container: containerRef.current });\r\n\r\n useEffect(() => {\r\n document.body.classList.add('DocSearch--active');\r\n\r\n return () => {\r\n document.body.classList.remove('DocSearch--active');\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (dropdownRef.current) {\r\n dropdownRef.current.scrollTop = 0;\r\n }\r\n }, [query]);\r\n\r\n useEffect(() => {\r\n if (initialQuery.length > 0) {\r\n if (inputRef.current) {\r\n inputRef.current.focus();\r\n }\r\n }\r\n }, [initialQuery]);\r\n\r\n useEffect(() => {\r\n function setFullViewportHeight() {\r\n if (modalRef.current) {\r\n const vh = window.innerHeight * 0.01;\r\n modalRef.current.style.setProperty('--docsearch-vh', `${vh}px`);\r\n }\r\n }\r\n\r\n setFullViewportHeight();\r\n\r\n window.addEventListener('resize', setFullViewportHeight);\r\n\r\n return () => {\r\n window.removeEventListener('resize', setFullViewportHeight);\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n\r\n const getActiveItem = (activeIndex: number) => {\r\n return dropdownRef.current?.getElementsByClassName('DocSearch-Hit').item(activeIndex);\r\n };\r\n\r\n const onKeyDown = (event: KeyboardEvent) => {\r\n if (event.key === 'ArrowUp' || event.key === 'ArrowDown') {\r\n event.preventDefault();\r\n setActiveIndex((activeIndex = -1) => {\r\n if (event.key === 'ArrowUp') {\r\n --activeIndex;\r\n } else {\r\n ++activeIndex;\r\n }\r\n if (activeIndex < 0) {\r\n activeIndex = results.length - 1;\r\n }\r\n if (activeIndex >= results.length) {\r\n activeIndex = 0;\r\n }\r\n\r\n const activeItem = getActiveItem(activeIndex);\r\n if (activeItem) {\r\n if ((activeItem as any).scrollIntoViewIfNeeded) {\r\n (activeItem as any).scrollIntoViewIfNeeded(false);\r\n } else {\r\n activeItem.scrollIntoView(false);\r\n }\r\n }\r\n\r\n return activeIndex;\r\n });\r\n } else if (event.key === 'Enter') {\r\n event.preventDefault();\r\n setActiveIndex((activeIndex = -1) => {\r\n const activeItem = getActiveItem(activeIndex);\r\n if (activeItem) {\r\n requestAnimationFrame(() => {\r\n activeItem.getElementsByTagName('a').item(0)\r\n ?.dispatchEvent(new Event('click', { bubbles: true }));\r\n });\r\n }\r\n return activeIndex;\r\n });\r\n }\r\n };\r\n window.addEventListener('keydown', onKeyDown);\r\n\r\n return () => {\r\n window.removeEventListener('keydown', onKeyDown);\r\n };\r\n }, [setActiveIndex, results]);\r\n\r\n return (\r\n <Container\r\n ref={containerRef}\r\n className='DocSearch DocSearch-Container'\r\n onMouseDown={(event) => {\r\n if (event.target === event.currentTarget) {\r\n onClose();\r\n }\r\n }}\r\n >\r\n <div className='DocSearch-Modal' ref={modalRef}>\r\n <header className='DocSearch-SearchBar' ref={formElementRef}>\r\n <SearchBox\r\n initialQuery={initialQuery}\r\n placeholder={intl.$t({ defaultMessage: '搜索文档' })}\r\n autoFocus={initialQuery.length === 0}\r\n onClose={onClose}\r\n inputRef={inputRef}\r\n isFromSelection={\r\n Boolean(initialQuery) &&\r\n initialQuery === initialQueryFromSelection\r\n }\r\n />\r\n </header>\r\n <div className='DocSearch-Dropdown' ref={dropdownRef}>\r\n <ScreenState\r\n onlyCurrentPart={onlyCurrentPart}\r\n onActive={onActive}\r\n activeIndex={activeIndex}\r\n onItemClick={() => {\r\n onClose();\r\n }}\r\n inputRef={inputRef}\r\n />\r\n </div>\r\n <footer className='DocSearch-Footer'>\r\n <Footer />\r\n </footer>\r\n </div>\r\n </Container>\r\n );\r\n}\r\n\r\nconst Container = styled.div`\r\n .DocSearch-Commands-Key {\r\n padding-left: 1px;\r\n font-size: .875rem;\r\n background-color: rgba(0, 0, 0, 0.1);\r\n background-image: none;\r\n box-shadow: none;\r\n }\r\n\r\n .DocSearch-Hit-content-wrapper {\r\n line-height: 1.3;\r\n }\r\n\r\n .DocSearch-Hit-title {\r\n font-size: 1em;\r\n }\r\n\r\n .DocSearch-Help {\r\n font-size: 1em;\r\n }\r\n\r\n @media (max-width: 750px) {\r\n .DocSearch-Footer {\r\n display: none;\r\n }\r\n }\r\n\r\n .DocSearch-Label {\r\n line-height: 1;\r\n }\r\n\r\n`;\r\n","import React from 'react';\r\n\r\ninterface UseTrapFocusProps {\r\n container: HTMLElement | null;\r\n}\r\n\r\nexport function useTrapFocus({ container }: UseTrapFocusProps) {\r\n React.useEffect(() => {\r\n if (!container) {\r\n return undefined;\r\n }\r\n\r\n const focusableElements = container.querySelectorAll<HTMLElement>(\r\n 'a[href]:not([disabled]), button:not([disabled]), input:not([disabled])'\r\n );\r\n const firstElement = focusableElements[0];\r\n const lastElement = focusableElements[focusableElements.length - 1];\r\n\r\n function trapFocus(event: KeyboardEvent) {\r\n if (event.key !== 'Tab') {\r\n return;\r\n }\r\n\r\n if (event.shiftKey) {\r\n if (document.activeElement === firstElement) {\r\n event.preventDefault();\r\n lastElement.focus();\r\n }\r\n } else if (document.activeElement === lastElement) {\r\n event.preventDefault();\r\n firstElement.focus();\r\n }\r\n }\r\n\r\n container.addEventListener('keydown', trapFocus);\r\n\r\n return () => {\r\n container.removeEventListener('keydown', trapFocus);\r\n };\r\n }, [container]);\r\n}\r\n","import { useKeyboardEvents } from './hooks/use-keyboard-events';\r\nimport { ElementType, useCallback, useRef, useState } from 'react';\r\nimport { DocSearchButton } from './doc-search-button';\r\nimport { createPortal } from 'react-dom';\r\nimport { DocSearchModal } from './doc-search-modal';\r\nimport { createGlobalStyle } from '@topwrite/common';\r\nimport '@docsearch/css';\r\n\r\nexport interface DocSearchProps {\r\n as?: ElementType;\r\n className?: string;\r\n onlyCurrentPart?: boolean;\r\n}\r\n\r\nexport default function DocSearch({ as, className, ...props }: DocSearchProps) {\r\n const searchButtonRef = useRef<HTMLButtonElement>(null);\r\n const [isOpen, setIsOpen] = useState(false);\r\n\r\n const onOpen = useCallback(() => {\r\n setIsOpen(true);\r\n }, [setIsOpen]);\r\n\r\n const onClose = useCallback(() => {\r\n setIsOpen(false);\r\n }, [setIsOpen]);\r\n\r\n const onInput = useCallback(() => {\r\n setIsOpen(true);\r\n }, [setIsOpen]);\r\n\r\n useKeyboardEvents({\r\n isOpen,\r\n onOpen,\r\n onClose,\r\n onInput,\r\n searchButtonRef,\r\n });\r\n\r\n const Component = as || DocSearchButton;\r\n\r\n return <>\r\n <GlobalStyle />\r\n <Component onClick={onOpen} className={className} ref={searchButtonRef} />\r\n {isOpen && createPortal(\r\n <DocSearchModal\r\n {...props}\r\n onClose={onClose}\r\n />,\r\n document.body\r\n )}\r\n </>;\r\n}\r\n\r\nconst GlobalStyle = createGlobalStyle`\r\n :root {\r\n --docsearch-primary-color: var(--ttw-primary-color);\r\n }\r\n`;\r\n","import React from 'react';\r\n\r\nexport interface UseDocSearchKeyboardEventsProps {\r\n isOpen: boolean;\r\n\r\n onOpen(): void;\r\n\r\n onClose(): void;\r\n\r\n onInput?(event: KeyboardEvent): void;\r\n\r\n searchButtonRef?: React.RefObject<HTMLButtonElement>;\r\n}\r\n\r\nfunction isEditingContent(event: KeyboardEvent): boolean {\r\n const element = event.target as HTMLElement;\r\n const tagName = element.tagName;\r\n\r\n return (\r\n element.isContentEditable ||\r\n tagName === 'INPUT' ||\r\n tagName === 'SELECT' ||\r\n tagName === 'TEXTAREA'\r\n );\r\n}\r\n\r\nexport function useKeyboardEvents({\r\n isOpen,\r\n onOpen,\r\n onClose,\r\n onInput,\r\n searchButtonRef,\r\n}: UseDocSearchKeyboardEventsProps) {\r\n React.useEffect(() => {\r\n function onKeyDown(event: KeyboardEvent) {\r\n function open() {\r\n // We check that no other DocSearch modal is showing before opening\r\n // another one.\r\n if (!document.body.classList.contains('DocSearch--active')) {\r\n onOpen();\r\n }\r\n }\r\n\r\n if (\r\n (event.keyCode === 27 && isOpen) ||\r\n // The `Cmd+K` shortcut both opens and closes the modal.\r\n (event.key === 'k' && (event.metaKey || event.ctrlKey)) ||\r\n // The `/` shortcut opens but doesn't close the modal because it's\r\n // a character.\r\n (!isEditingContent(event) && event.key === '/' && !isOpen)\r\n ) {\r\n event.preventDefault();\r\n\r\n if (isOpen) {\r\n onClose();\r\n } else if (!document.body.classList.contains('DocSearch--active')) {\r\n open();\r\n }\r\n }\r\n\r\n if (\r\n searchButtonRef &&\r\n searchButtonRef.current === document.activeElement &&\r\n onInput\r\n ) {\r\n if (/[a-zA-Z0-9]/.test(String.fromCharCode(event.keyCode))) {\r\n onInput(event);\r\n }\r\n }\r\n }\r\n\r\n window.addEventListener('keydown', onKeyDown);\r\n\r\n return () => {\r\n window.removeEventListener('keydown', onKeyDown);\r\n };\r\n }, [isOpen, onOpen, onClose, onInput, searchButtonRef]);\r\n}\r\n"],"names":["LoadingIcon","_jsx","viewBox","stroke","strokeOpacity","children","fill","fillRule","_jsxs","transform","strokeWidth","cx","cy","r","d","attributeName","type","from","to","dur","repeatCount","ResetIcon","width","height","strokeLinecap","strokeLinejoin","SearchIcon","className","SelectIcon","ContentIcon","ErrorIcon","NoResultsIcon","ControlKeyIcon","ACTION_KEY_DEFAULT","DocSearchButton","forwardRef","_ref","ref","props","key","setKey","useState","useEffect","navigator","test","platform","intl","useIntl","Button","$t","id","defaultMessage","styled","MAX_QUERY_SIZE","Footer","_Fragment","CommandIcon","SearchBox","autoFocus","inputRef","isFromSelection","initialQuery","onClose","placeholder","query","fetch","useModel","React","current","focus","select","onReset","useCallback","value","debounced","useMemo","debounce","handleSearch","e","target","onSubmit","event","preventDefault","defaultValue","maxLength","onChange","title","hidden","onClick","ErrorScreen","NoResultsScreen","useSelector","Results","items","map","item","index","Result","_ref2","onItemClick","onActive","activeIndex","onMouseMove","Link","path","body","ResultsScreen","collections","collection","StartScreen","status","hasCollections","ScreenState","onlyCurrentPart","results","summary","useBook","article","useArticle","isSinglePart","currentPart","getArticlePart","parts","getParts","filter","part","level","result","getArticle","sort","a","length","DocSearchModal","noop","setActiveIndex","undefined","containerRef","useRef","modalRef","formElementRef","dropdownRef","initialQueryFromSelection","window","getSelection","toString","slice","container","focusableElements","querySelectorAll","firstElement","lastElement","trapFocus","shiftKey","document","activeElement","addEventListener","removeEventListener","useTrapFocus","classList","add","remove","scrollTop","setFullViewportHeight","vh","innerHeight","style","setProperty","getActiveItem","getElementsByClassName","onKeyDown","arguments","activeItem","scrollIntoViewIfNeeded","scrollIntoView","requestAnimationFrame","getElementsByTagName","dispatchEvent","Event","bubbles","Container","onMouseDown","currentTarget","Boolean","DocSearch","as","searchButtonRef","isOpen","setIsOpen","onOpen","onInput","keyCode","metaKey","ctrlKey","element","tagName","isContentEditable","isEditingContent","contains","String","fromCharCode","useKeyboardEvents","Component","GlobalStyle","createPortal","createGlobalStyle"],"sourceRoot":""}
|