@topwrite/reader 1.0.59 → 1.0.60

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.
@@ -0,0 +1,93 @@
1
+ "use strict";(self.webpackChunk_topwrite_reader=self.webpackChunk_topwrite_reader||[]).push([[913],{8913:(e,t,r)=>{r.r(t),r.d(t,{default:()=>A});var n=r(264),c=r(7363),s=r.n(c);function o(){return(0,n.jsx)("svg",{viewBox:"0 0 38 38",stroke:"currentColor",strokeOpacity:".5",children:(0,n.jsx)("g",{fill:"none",fillRule:"evenodd",children:(0,n.jsxs)("g",{transform:"translate(1 1)",strokeWidth:"2",children:[(0,n.jsx)("circle",{strokeOpacity:".3",cx:"18",cy:"18",r:"18"}),(0,n.jsx)("path",{d:"M36 18c0-9.94-8.06-18-18-18",children:(0,n.jsx)("animateTransform",{attributeName:"transform",type:"rotate",from:"0 18 18",to:"360 18 18",dur:"1s",repeatCount:"indefinite"})})]})})})}function a(){return(0,n.jsx)("svg",{width:"20",height:"20",viewBox:"0 0 20 20",children:(0,n.jsx)("path",{d:"M10 10l5.09-5.09L10 10l5.09 5.09L10 10zm0 0L4.91 4.91 10 10l-5.09 5.09L10 10z",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"})})}function l(){return(0,n.jsx)("svg",{width:"20",height:"20",className:"DocSearch-Search-Icon",viewBox:"0 0 20 20",children:(0,n.jsx)("path",{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",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round"})})}function i(){return(0,n.jsx)("svg",{className:"DocSearch-Hit-Select-Icon",width:"20",height:"20",viewBox:"0 0 20 20",children:(0,n.jsxs)("g",{stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinecap:"round",strokeLinejoin:"round",children:[(0,n.jsx)("path",{d:"M18 3v4c0 2-2 4-4 4H2"}),(0,n.jsx)("path",{d:"M8 17l-6-6 6-6"})]})})}function d(){return(0,n.jsx)("svg",{width:"20",height:"20",viewBox:"0 0 20 20",children:(0,n.jsx)("path",{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",stroke:"currentColor",fill:"none",fillRule:"evenodd",strokeLinejoin:"round"})})}function u(){return(0,n.jsx)("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",children:(0,n.jsx)("path",{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"})})}function h(){return(0,n.jsx)("svg",{width:"40",height:"40",viewBox:"0 0 20 20",fill:"none",fillRule:"evenodd",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",children:(0,n.jsx)("path",{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"})})}function m(){return(0,n.jsx)("svg",{width:"15",height:"15",className:"DocSearch-Control-Key-Icon",children:(0,n.jsx)("path",{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",strokeWidth:"1.2",stroke:"currentColor",fill:"none",strokeLinecap:"square"})})}var f=r(7192);const x="Ctrl";const p=(0,c.forwardRef)(((e,t)=>{let{className:r,...s}=e;const[o,a]=(0,c.useState)(null);(0,c.useEffect)((()=>{"undefined"!=typeof navigator&&a(/(Mac|iPhone|iPod|iPad)/i.test(navigator.platform)?"⌘":x)}),[]);const i=(0,f.cw)();return(0,n.jsxs)(v,{type:"button",className:"DocSearch DocSearch-Button",...s,ref:t,children:[(0,n.jsxs)("span",{className:"DocSearch-Button-Container",children:[(0,n.jsx)(l,{}),(0,n.jsx)("span",{className:"DocSearch-Button-Placeholder",children:i.$t({id:"xUjLTE",defaultMessage:[{type:0,value:"搜索"}]})})]}),null!==o&&(0,n.jsxs)("span",{className:"DocSearch-Button-Keys",children:[(0,n.jsx)("span",{className:"DocSearch-Button-Key",children:o===x?(0,n.jsx)(m,{}):o}),(0,n.jsx)("span",{className:"DocSearch-Button-Key",children:"K"})]})]})})),v=f.zo.button`
2
+ .DocSearch-Button-Keys {
3
+ min-width: 0;
4
+ padding: .125rem .25rem;
5
+ background: rgba(0, 0, 0, 0.08);
6
+ border-radius: .25rem;
7
+ }
8
+
9
+ .DocSearch-Button-Key {
10
+ top: 1px;
11
+ width: auto;
12
+ height: 1.25rem;
13
+ padding-right: .125rem;
14
+ padding-left: .125rem;
15
+ margin-right: 0;
16
+ font-size: .875rem;
17
+ background: none;
18
+ box-shadow: none;
19
+ }
20
+ `;var j=r(1533);const g=64;function S(){const e=(0,f.cw)();return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)("div",{className:"DocSearch-Logo"}),(0,n.jsxs)("ul",{className:"DocSearch-Commands",children:[(0,n.jsxs)("li",{children:[(0,n.jsx)("span",{className:"DocSearch-Commands-Key",children:(0,n.jsx)(w,{children:(0,n.jsx)("path",{d:"M12 3.53088v3c0 1-1 2-2 2H4M7 11.53088l-3-3 3-3"})})}),(0,n.jsx)("span",{className:"DocSearch-Label",children:e.$t({id:"inUHj3",defaultMessage:[{type:0,value:"选中"}]})})]}),(0,n.jsxs)("li",{children:[(0,n.jsx)("span",{className:"DocSearch-Commands-Key",children:(0,n.jsx)(w,{children:(0,n.jsx)("path",{d:"M7.5 3.5v8M10.5 8.5l-3 3-3-3"})})}),(0,n.jsx)("span",{className:"DocSearch-Commands-Key",children:(0,n.jsx)(w,{children:(0,n.jsx)("path",{d:"M7.5 11.5v-8M10.5 6.5l-3-3-3 3"})})}),(0,n.jsx)("span",{className:"DocSearch-Label",children:e.$t({id:"k+fk3r",defaultMessage:[{type:0,value:"导航"}]})})]}),(0,n.jsxs)("li",{children:[(0,n.jsx)("span",{className:"DocSearch-Commands-Key",children:(0,n.jsx)(w,{children:(0,n.jsx)("path",{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"})})}),(0,n.jsx)("span",{className:"DocSearch-Label",children:e.$t({id:"47GdDb",defaultMessage:[{type:0,value:"关闭"}]})})]})]})]})}function w(e){return(0,n.jsx)("svg",{width:"15",height:"15",children:(0,n.jsx)("g",{fill:"none",stroke:"currentColor",strokeLinecap:"round",strokeLinejoin:"round",strokeWidth:"1.2",children:e.children})})}var D=r(2611);function y(e){let{autoFocus:t,inputRef:r,isFromSelection:i,initialQuery:d,onClose:u,placeholder:h}=e;const[{query:m},{fetch:x}]=(0,f.tT)("search");s().useEffect((()=>{t&&r.current&&r.current.focus()}),[t,r]),s().useEffect((()=>{i&&r.current&&(r.current.select(),x(d))}),[i,r]);const p=(0,c.useCallback)((()=>{r.current&&(r.current.value="",x(""))}),[x]),v=(0,c.useMemo)((()=>(0,D.debounce)(x,500)),[x]),j=(0,c.useCallback)((e=>{v(e.target.value)}),[v]),S=(0,f.cw)();return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsxs)("form",{className:"DocSearch-Form",onSubmit:e=>{e.preventDefault()},children:[(0,n.jsx)("label",{className:"DocSearch-MagnifierLabel",children:(0,n.jsx)(l,{})}),(0,n.jsx)("div",{className:"DocSearch-LoadingIndicator",children:(0,n.jsx)(o,{})}),(0,n.jsx)("input",{defaultValue:d,placeholder:h,className:"DocSearch-Input",ref:r,autoFocus:t,maxLength:g,onChange:j}),(0,n.jsx)("button",{title:"Clear the query",className:"DocSearch-Reset",hidden:!m,onClick:p,children:(0,n.jsx)(a,{})})]}),(0,n.jsx)("button",{className:"DocSearch-Cancel",onClick:u,children:S.$t({id:"2QzYmY",defaultMessage:[{type:0,value:"取消"}]})})]})}function k(){return(0,n.jsxs)("div",{className:"DocSearch-ErrorScreen",children:[(0,n.jsx)("div",{className:"DocSearch-Screen-Icon",children:(0,n.jsx)(u,{})}),(0,n.jsx)("p",{className:"DocSearch-Title",children:"Unable to fetch results"}),(0,n.jsx)("p",{className:"DocSearch-Help",children:"You might want to check your network connection."})]})}function b(){const{query:e}=(0,f.v9)("search"),t=(0,f.cw)();return(0,n.jsxs)("div",{className:"DocSearch-NoResults",children:[(0,n.jsx)("div",{className:"DocSearch-Screen-Icon",children:(0,n.jsx)(h,{})}),(0,n.jsxs)("p",{className:"DocSearch-Title",children:[t.$t({id:"Z+slnL",defaultMessage:[{type:0,value:"没有结果:"}]}),' "',(0,n.jsx)("strong",{children:e}),'"']})]})}var C=r(9491);function N(e){let{title:t,items:r,...c}=e;return(0,n.jsxs)("section",{className:"DocSearch-Hits",children:[(0,n.jsx)("div",{className:"DocSearch-Hit-source",children:t}),(0,n.jsx)("ul",{children:r.map(((e,t)=>(0,n.jsx)(M,{item:e,...c},t)))})]})}function M(e){let{item:t,onItemClick:r,onActive:s,activeIndex:o}=e;const a=(0,c.useCallback)((()=>{s(t.id)}),[s,t]);return(0,n.jsx)("li",{className:"DocSearch-Hit",onClick:()=>{r(t)},onMouseMove:a,"aria-selected":o===t.id,children:(0,n.jsx)(C.Z,{to:t.path,children:(0,n.jsxs)("div",{className:"DocSearch-Hit-Container",children:[(0,n.jsx)("div",{className:"DocSearch-Hit-icon",children:(0,n.jsx)(d,{})}),(0,n.jsxs)("div",{className:"DocSearch-Hit-content-wrapper",children:[(0,n.jsx)("span",{className:"DocSearch-Hit-title",children:t.title}),t.body&&(0,n.jsx)("span",{className:"DocSearch-Hit-path",children:t.body})]}),(0,n.jsx)("div",{className:"DocSearch-Hit-action",children:(0,n.jsx)(i,{})})]})})})}function L(e){let{collections:t,...r}=e;return(0,n.jsx)("div",{className:"DocSearch-Dropdown-Container",children:t.map(((e,t)=>(0,n.jsx)(N,{title:e.title,items:e.items,...r},t)))})}function E(e){const{status:t}=(0,f.v9)("search"),r=(0,f.cw)();return"idle"!==t||e.hasCollections?null:(0,n.jsx)("div",{className:"DocSearch-StartScreen",children:(0,n.jsx)("p",{className:"DocSearch-Help",children:r.$t({id:"lXhmij",defaultMessage:[{type:0,value:"没有最近搜索"}]})})})}var R=r(8158);const H=e=>{let{onlyCurrentPart:t,...r}=e;const{status:s,query:o,results:a}=(0,f.v9)("search"),{summary:l}=(0,f.CQ)(),i=(0,f.cw)(),d=(0,R.ZP)(),u=(0,c.useMemo)((()=>{let e,r=0;if(l.isSinglePart())e=[{title:"",items:a}];else{const r=d?l.getArticlePart(d):null;let n=l.getParts();r&&t&&(n=n.filter((e=>e.level===r.level))),e=n.map((e=>({level:e.level,title:t?"":e.title||i.$t({id:"51pt/B",defaultMessage:[{type:0,value:"未命名分组"}]}),items:a.filter((t=>{const r=l.getArticle((e=>e.path===t.path));if(r){return l.getArticlePart(r)===e}return!1}))}))),r&&!t&&(e=e.sort((e=>e.level===r.level?-1:1)))}return e.filter((e=>e.items.length>0)).map((e=>({...e,items:e.items.map((e=>({...e,id:r++})))})))}),[a]);if("error"===s)return(0,n.jsx)(k,{});const h=u.length>0;return o?h?(0,n.jsx)(L,{...r,collections:u}):(0,n.jsx)(b,{}):(0,n.jsx)(E,{hasCollections:h})};function B(e){let{onClose:t=D.noop,onlyCurrentPart:r=!1}=e;const{query:o,results:a}=(0,f.v9)("search"),l=(0,f.cw)(),[i,d]=(0,c.useState)(void 0),u=(0,c.useRef)(null),h=(0,c.useRef)(null),m=(0,c.useRef)(null),x=(0,c.useRef)(null),p=(0,c.useRef)(null),v=(0,c.useRef)("undefined"!=typeof window?window.getSelection().toString().slice(0,g):"").current,j=(0,c.useRef)(o||v).current,w=(0,c.useCallback)((e=>{d(e)}),[d]);return function(e){let{container:t}=e;s().useEffect((()=>{if(!t)return;const e=t.querySelectorAll("a[href]:not([disabled]), button:not([disabled]), input:not([disabled])"),r=e[0],n=e[e.length-1];function c(e){"Tab"===e.key&&(e.shiftKey?document.activeElement===r&&(e.preventDefault(),n.focus()):document.activeElement===n&&(e.preventDefault(),r.focus()))}return t.addEventListener("keydown",c),()=>{t.removeEventListener("keydown",c)}}),[t])}({container:u.current}),(0,c.useEffect)((()=>(document.body.classList.add("DocSearch--active"),()=>{document.body.classList.remove("DocSearch--active")})),[]),(0,c.useEffect)((()=>{x.current&&(x.current.scrollTop=0)}),[o]),(0,c.useEffect)((()=>{j.length>0&&p.current&&p.current.focus()}),[j]),(0,c.useEffect)((()=>{function e(){if(h.current){const e=.01*window.innerHeight;h.current.style.setProperty("--docsearch-vh",`${e}px`)}}return e(),window.addEventListener("resize",e),()=>{window.removeEventListener("resize",e)}}),[]),(0,c.useEffect)((()=>{const e=e=>x.current?.getElementsByClassName("DocSearch-Hit").item(e),t=t=>{"ArrowUp"===t.key||"ArrowDown"===t.key?(t.preventDefault(),d((function(){let r=arguments.length>0&&void 0!==arguments[0]?arguments[0]:-1;"ArrowUp"===t.key?--r:++r,r<0&&(r=a.length-1),r>=a.length&&(r=0);const n=e(r);return n&&(n.scrollIntoViewIfNeeded?n.scrollIntoViewIfNeeded(!1):n.scrollIntoView(!1)),r}))):"Enter"===t.key&&(t.preventDefault(),d((function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:-1;const r=e(t);return r&&requestAnimationFrame((()=>{r.getElementsByTagName("a").item(0)?.dispatchEvent(new Event("click",{bubbles:!0}))})),t})))};return window.addEventListener("keydown",t),()=>{window.removeEventListener("keydown",t)}}),[d,a]),(0,n.jsx)(I,{ref:u,className:"DocSearch DocSearch-Container",onMouseDown:e=>{e.target===e.currentTarget&&t()},children:(0,n.jsxs)("div",{className:"DocSearch-Modal",ref:h,children:[(0,n.jsx)("header",{className:"DocSearch-SearchBar",ref:m,children:(0,n.jsx)(y,{initialQuery:j,placeholder:l.$t({id:"n632UI",defaultMessage:[{type:0,value:"搜索文档"}]}),autoFocus:0===j.length,onClose:t,inputRef:p,isFromSelection:Boolean(j)&&j===v})}),(0,n.jsx)("div",{className:"DocSearch-Dropdown",ref:x,children:(0,n.jsx)(H,{onlyCurrentPart:r,onActive:w,activeIndex:i,onItemClick:()=>{t()},inputRef:p})}),(0,n.jsx)("footer",{className:"DocSearch-Footer",children:(0,n.jsx)(S,{})})]})})}const I=f.zo.div`
21
+ .DocSearch-Commands-Key {
22
+ padding-left: 1px;
23
+ font-size: .875rem;
24
+ background-color: rgba(0, 0, 0, 0.1);
25
+ background-image: none;
26
+ box-shadow: none;
27
+ }
28
+
29
+ .DocSearch-Hits {
30
+ ul {
31
+ box-shadow: var(--docsearch-hit-shadow);
32
+ border-radius: 4px;
33
+ margin-bottom: 4px;
34
+ margin-top: 3px;
35
+ }
36
+ }
37
+
38
+ .DocSearch-Hit {
39
+ padding-bottom: 0;
40
+ border-radius: 0;
41
+
42
+ a {
43
+ border-radius: 0;
44
+ border-top: 1px solid rgb(212, 217, 225, 0.4);
45
+ box-shadow: none;
46
+ }
47
+
48
+ &:first-child {
49
+ a {
50
+ border-top-left-radius: 4px;
51
+ border-top-right-radius: 4px;
52
+ border-top-width: 0;
53
+ }
54
+ }
55
+
56
+ &:last-child {
57
+ a {
58
+ border-bottom-left-radius: 4px;
59
+ border-bottom-right-radius: 4px;
60
+ }
61
+ }
62
+ }
63
+
64
+ .DocSearch-Hit-content-wrapper {
65
+ line-height: 1.3;
66
+ }
67
+
68
+ .DocSearch-Hit-title {
69
+ font-size: 1em;
70
+ }
71
+
72
+ .DocSearch-Help {
73
+ font-size: 1em;
74
+ }
75
+
76
+ @media (max-width: 750px) {
77
+ .DocSearch-Footer {
78
+ display: none;
79
+ }
80
+ }
81
+
82
+ .DocSearch-Label {
83
+ line-height: 1;
84
+ }
85
+
86
+ `;function A(e){let{as:t,className:r,...o}=e;const a=(0,c.useRef)(null),[l,i]=(0,c.useState)(!1),d=(0,c.useCallback)((()=>{i(!0)}),[i]),u=(0,c.useCallback)((()=>{i(!1)}),[i]);!function(e){let{isOpen:t,onOpen:r,onClose:n,onInput:c,searchButtonRef:o}=e;s().useEffect((()=>{function e(e){(27===e.keyCode&&t||"k"===e.key&&(e.metaKey||e.ctrlKey)||!function(e){const t=e.target,r=t.tagName;return t.isContentEditable||"INPUT"===r||"SELECT"===r||"TEXTAREA"===r}(e)&&"/"===e.key&&!t)&&(e.preventDefault(),t?n():document.body.classList.contains("DocSearch--active")||document.body.classList.contains("DocSearch--active")||r()),o&&o.current===document.activeElement&&c&&/[a-zA-Z0-9]/.test(String.fromCharCode(e.keyCode))&&c(e)}return window.addEventListener("keydown",e),()=>{window.removeEventListener("keydown",e)}}),[t,r,n,c,o])}({isOpen:l,onOpen:d,onClose:u,onInput:(0,c.useCallback)((()=>{i(!0)}),[i]),searchButtonRef:a});const h=t||p;return(0,n.jsxs)(n.Fragment,{children:[(0,n.jsx)(K,{}),(0,n.jsx)(h,{onClick:d,className:r,ref:a}),l&&(0,j.createPortal)((0,n.jsx)(B,{...o,onClose:u}),document.body)]})}const K=f.vJ`
87
+ :root:root {
88
+ --docsearch-primary-color: var(--ttw-primary-color);
89
+ --docsearch-hit-height: 48px;
90
+ --docsearch-searchbox-height: 48px;
91
+ }
92
+ `}}]);
93
+ //# sourceMappingURL=913-dd5a0f.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"913-dd5a0f.js","mappings":"iLAAM,SAAUA,IACZ,OACIC,EAAAA,EAAAA,KAAA,OAAKC,QAAQ,YAAYC,OAAO,eAAeC,cAAc,KAAIC,UAC7DJ,EAAAA,EAAAA,KAAA,KAAGK,KAAK,OAAOC,SAAS,UAASF,UAC7BG,EAAAA,EAAAA,MAAA,KAAGC,UAAU,iBAAiBC,YAAY,IAAGL,SAAA,EACzCJ,EAAAA,EAAAA,KAAA,UAAQG,cAAc,KAAKO,GAAG,KAAKC,GAAG,KAAKC,EAAE,QAC7CZ,EAAAA,EAAAA,KAAA,QAAMa,EAAE,8BAA6BT,UACjCJ,EAAAA,EAAAA,KAAA,oBACIc,cAAc,YACdC,KAAK,SACLC,KAAK,UACLC,GAAG,YACHC,IAAI,KACJC,YAAY,uBAOxC,CCpBM,SAAUC,IACZ,OACIpB,EAAAA,EAAAA,KAAA,OAAKqB,MAAM,KAAKC,OAAO,KAAKrB,QAAQ,YAAWG,UAC3CJ,EAAAA,EAAAA,KAAA,QACIa,EAAE,gFACFX,OAAO,eACPG,KAAK,OACLC,SAAS,UACTiB,cAAc,QACdC,eAAe,WAI/B,CCbM,SAAUC,IACZ,OACIzB,EAAAA,EAAAA,KAAA,OACIqB,MAAM,KACNC,OAAO,KACPI,UAAU,wBACVzB,QAAQ,YAAWG,UAEnBJ,EAAAA,EAAAA,KAAA,QACIa,EAAE,uMACFX,OAAO,eACPG,KAAK,OACLC,SAAS,UACTiB,cAAc,QACdC,eAAe,WAI/B,CClBM,SAAUG,IACZ,OACI3B,EAAAA,EAAAA,KAAA,OACI0B,UAAU,4BACVL,MAAM,KACNC,OAAO,KACPrB,QAAQ,YAAWG,UAEnBG,EAAAA,EAAAA,MAAA,KACIL,OAAO,eACPG,KAAK,OACLC,SAAS,UACTiB,cAAc,QACdC,eAAe,QAAOpB,SAAA,EAEtBJ,EAAAA,EAAAA,KAAA,QAAMa,EAAE,2BACRb,EAAAA,EAAAA,KAAA,QAAMa,EAAE,uBAIxB,CCpBM,SAAUe,IACZ,OACI5B,EAAAA,EAAAA,KAAA,OAAKqB,MAAM,KAAKC,OAAO,KAAKrB,QAAQ,YAAWG,UAC3CJ,EAAAA,EAAAA,KAAA,QACIa,EAAE,wGACFX,OAAO,eACPG,KAAK,OACLC,SAAS,UACTkB,eAAe,WAI/B,CCZM,SAAUK,IACZ,OACI7B,EAAAA,EAAAA,KAAA,OACIqB,MAAM,KACNC,OAAO,KACPrB,QAAQ,YACRI,KAAK,OACLC,SAAS,UACTJ,OAAO,eACPqB,cAAc,QACdC,eAAe,QAAOpB,UAEtBJ,EAAAA,EAAAA,KAAA,QACIa,EAAE,4KAGlB,CChBM,SAAUiB,IACZ,OACI9B,EAAAA,EAAAA,KAAA,OACIqB,MAAM,KACNC,OAAO,KACPrB,QAAQ,YACRI,KAAK,OACLC,SAAS,UACTJ,OAAO,eACPqB,cAAc,QACdC,eAAe,QAAOpB,UAEtBJ,EAAAA,EAAAA,KAAA,QACIa,EAAE,4GAGlB,CChBM,SAAUkB,IACZ,OACI/B,EAAAA,EAAAA,KAAA,OAAKqB,MAAM,KAAKC,OAAO,KAAKI,UAAU,6BAA4BtB,UAC9DJ,EAAAA,EAAAA,KAAA,QACIa,EAAE,qSACFJ,YAAY,MACZP,OAAO,eACPG,KAAK,OACLkB,cAAc,YAI9B,C,cCNA,MAAMS,EAAqB,OAOpB,MAAMC,GAAkBC,EAAAA,EAAAA,aAAoD,CAAAC,EAA0BC,KAAO,IAAhC,UAAEV,KAAcW,GAAOF,EACvG,MAAOG,EAAKC,IAAUC,EAAAA,EAAAA,UAAqE,OAE3FC,EAAAA,EAAAA,YAAU,KACmB,oBAAdC,WACPH,EARD,0BAA0BI,KAAKD,UAAUE,UAH3B,IAW+BZ,E,GAEjD,IAEH,MAAMa,GAAOC,EAAAA,EAAAA,MAEb,OAAOvC,EAAAA,EAAAA,MAACwC,EAAM,CACVhC,KAAK,SACLW,UAAU,gCACNW,EACJD,IAAKA,EAAGhC,SAAA,EAERG,EAAAA,EAAAA,MAAA,QAAMmB,UAAU,6BAA4BtB,SAAA,EACxCJ,EAAAA,EAAAA,KAACyB,EAAU,KACXzB,EAAAA,EAAAA,KAAA,QAAM0B,UAAU,+BAA8BtB,SAAEyC,EAAKG,GAAG,CAAAC,GAAA,SAAEC,eAAgB,CAAF,4BAEnE,OAARZ,IACG/B,EAAAA,EAAAA,MAAA,QAAMmB,UAAU,wBAAuBtB,SAAA,EACnCJ,EAAAA,EAAAA,KAAA,QAAM0B,UAAU,uBAAsBtB,SACjCkC,IAAQN,GAAqBhC,EAAAA,EAAAA,KAAC+B,EAAc,IAAMO,KAEvDtC,EAAAA,EAAAA,KAAA,QAAM0B,UAAU,uBAAsBtB,SAAA,WAGzC,IAGP2C,EAASI,EAAAA,GAAAA,MAAa;;;;;;;;;;;;;;;;;;;gBC7CrB,MAAMC,EAAiB,GCGxB,SAAUC,IACZ,MAAMR,GAAOC,EAAAA,EAAAA,MAEb,OACIvC,EAAAA,EAAAA,MAAA+C,EAAAA,SAAA,CAAAlD,SAAA,EACIJ,EAAAA,EAAAA,KAAA,OAAK0B,UAAU,oBACfnB,EAAAA,EAAAA,MAAA,MAAImB,UAAU,qBAAoBtB,SAAA,EAC9BG,EAAAA,EAAAA,MAAA,MAAAH,SAAA,EACIJ,EAAAA,EAAAA,KAAA,QAAM0B,UAAU,yBAAwBtB,UACpCJ,EAAAA,EAAAA,KAACuD,EAAW,CAAAnD,UACRJ,EAAAA,EAAAA,KAAA,QAAMa,EAAE,yDAGhBb,EAAAA,EAAAA,KAAA,QAAM0B,UAAU,kBAAiBtB,SAAEyC,EAAKG,GAAG,CAAAC,GAAA,SAAEC,eAAgB,CAAF,6BAE/D3C,EAAAA,EAAAA,MAAA,MAAAH,SAAA,EACIJ,EAAAA,EAAAA,KAAA,QAAM0B,UAAU,yBAAwBtB,UACpCJ,EAAAA,EAAAA,KAACuD,EAAW,CAAAnD,UACRJ,EAAAA,EAAAA,KAAA,QAAMa,EAAE,sCAGhBb,EAAAA,EAAAA,KAAA,QAAM0B,UAAU,yBAAwBtB,UACpCJ,EAAAA,EAAAA,KAACuD,EAAW,CAAAnD,UACRJ,EAAAA,EAAAA,KAAA,QAAMa,EAAE,wCAGhBb,EAAAA,EAAAA,KAAA,QAAM0B,UAAU,kBAAiBtB,SAAEyC,EAAKG,GAAG,CAAAC,GAAA,SAAEC,eAAgB,CAAF,6BAE/D3C,EAAAA,EAAAA,MAAA,MAAAH,SAAA,EACIJ,EAAAA,EAAAA,KAAA,QAAM0B,UAAU,yBAAwBtB,UACpCJ,EAAAA,EAAAA,KAACuD,EAAW,CAAAnD,UACRJ,EAAAA,EAAAA,KAAA,QACIa,EAAE,6fAGdb,EAAAA,EAAAA,KAAA,QAAM0B,UAAU,kBAAiBtB,SAAEyC,EAAKG,GAAG,CAAAC,GAAA,SAAEC,eAAgB,CAAF,iCAK/E,CAMA,SAASK,EAAYlB,GACjB,OACIrC,EAAAA,EAAAA,KAAA,OAAKqB,MAAM,KAAKC,OAAO,KAAIlB,UACvBJ,EAAAA,EAAAA,KAAA,KACIK,KAAK,OACLH,OAAO,eACPqB,cAAc,QACdC,eAAe,QACff,YAAY,MAAKL,SAEhBiC,EAAMjC,YAIvB,C,cC/CM,SAAUoD,EAASrB,GAQR,IARS,UACtBsB,EAAS,SACTC,EAAQ,gBACRC,EAAe,aACfC,EAAY,QACZC,EAAO,YACPC,GAEa3B,EAEb,OAAO,MAAE4B,IAAS,MAAEC,KAAWC,EAAAA,EAAAA,IAAS,UAExCC,IAAAA,WAAgB,KACRT,GAAaC,EAASS,SACtBT,EAASS,QAAQC,O,GAEtB,CAACX,EAAWC,IAEfQ,IAAAA,WAAgB,KACRP,GAAmBD,EAASS,UAC5BT,EAASS,QAAQE,SACjBL,EAAMJ,G,GAEX,CAACD,EAAiBD,IAGrB,MAAMY,GAAUC,EAAAA,EAAAA,cAAY,KACpBb,EAASS,UACTT,EAASS,QAAQK,MAAQ,GACzBR,EAAM,I,GAEX,CAACA,IAEES,GAAYC,EAAAA,EAAAA,UAAQ,KAAMC,EAAAA,EAAAA,UAASX,EAAO,MAAM,CAACA,IAEjDY,GAAeL,EAAAA,EAAAA,cAAaM,IAC9BJ,EAAUI,EAAEC,OAAON,MAAM,GAC1B,CAACC,IAEE5B,GAAOC,EAAAA,EAAAA,MAEb,OAAOvC,EAAAA,EAAAA,MAAA+C,EAAAA,SAAA,CAAAlD,SAAA,EACHG,EAAAA,EAAAA,MAAA,QACImB,UAAU,iBACVqD,SAAWC,IACPA,EAAMC,gBAAgB,EACzB7E,SAAA,EAEDJ,EAAAA,EAAAA,KAAA,SAAO0B,UAAU,2BAA0BtB,UACvCJ,EAAAA,EAAAA,KAACyB,EAAU,OAEfzB,EAAAA,EAAAA,KAAA,OAAK0B,UAAU,6BAA4BtB,UACvCJ,EAAAA,EAAAA,KAACD,EAAW,OAEhBC,EAAAA,EAAAA,KAAA,SACIkF,aAActB,EACdE,YAAaA,EACbpC,UAAU,kBACVU,IAAKsB,EACLD,UAAWA,EACX0B,UAAW/B,EACXgC,SAAUR,KAEd5E,EAAAA,EAAAA,KAAA,UACIqF,MAAM,kBACN3D,UAAU,kBACV4D,QAASvB,EACTwB,QAASjB,EAAOlE,UAEhBJ,EAAAA,EAAAA,KAACoB,EAAS,UAGlBpB,EAAAA,EAAAA,KAAA,UAAQ0B,UAAU,mBAAmB6D,QAAS1B,EAAOzD,SAChDyC,EAAKG,GAAG,CAAAC,GAAA,SAAEC,eAAgB,CAAF,2BAGrC,CC1FM,SAAUsC,IACZ,OACIjF,EAAAA,EAAAA,MAAA,OAAKmB,UAAU,wBAAuBtB,SAAA,EAClCJ,EAAAA,EAAAA,KAAA,OAAK0B,UAAU,wBAAuBtB,UAClCJ,EAAAA,EAAAA,KAAC6B,EAAS,OAEd7B,EAAAA,EAAAA,KAAA,KAAG0B,UAAU,kBAAiBtB,SAAA,6BAC9BJ,EAAAA,EAAAA,KAAA,KAAG0B,UAAU,iBAAgBtB,SAAA,uDAKzC,CCXM,SAAUqF,IAEZ,MAAM,MAAE1B,IAAU2B,EAAAA,EAAAA,IAAY,UACxB7C,GAAOC,EAAAA,EAAAA,MAEb,OACIvC,EAAAA,EAAAA,MAAA,OAAKmB,UAAU,sBAAqBtB,SAAA,EAChCJ,EAAAA,EAAAA,KAAA,OAAK0B,UAAU,wBAAuBtB,UAClCJ,EAAAA,EAAAA,KAAC8B,EAAa,OAElBvB,EAAAA,EAAAA,MAAA,KAAGmB,UAAU,kBAAiBtB,SAAA,CACzByC,EAAKG,GAAG,CAAAC,GAAA,SAAEC,eAAgB,CAAF,0BAAY,MAAGlD,EAAAA,EAAAA,KAAA,UAAAI,SAAS2D,IAAe,SAIhF,C,cCCM,SAAU4B,EAAOxD,GAAyC,IAAxC,MAAEkD,EAAK,MAAEO,KAAUvD,GAAqBF,EAC5D,OAAO5B,EAAAA,EAAAA,MAAA,WAASmB,UAAU,iBAAgBtB,SAAA,EACtCJ,EAAAA,EAAAA,KAAA,OAAK0B,UAAU,uBAAsBtB,SAAEiF,KACvCrF,EAAAA,EAAAA,KAAA,MAAAI,SACKwF,EAAMC,KAAI,CAACC,EAAMC,KACP/F,EAAAA,EAAAA,KAACgG,EAAM,CAEVF,KAAMA,KACFzD,GAFC0D,SAOzB,CAYA,SAASC,EAAMC,GAKD,IALE,KACZH,EAAI,YACJI,EAAW,SACXC,EAAQ,YACRC,GACUH,EAEV,MAAMI,GAAc9B,EAAAA,EAAAA,cAAY,KAC5B4B,EAASL,EAAK7C,GAAG,GAClB,CAACkD,EAAUL,IAEd,OAAO9F,EAAAA,EAAAA,KAAA,MACH0B,UAAU,gBACV6D,QAASA,KACLW,EAAYJ,EAAK,EAErBO,YAAaA,EAAW,gBACTD,IAAgBN,EAAK7C,GAAE7C,UAEtCJ,EAAAA,EAAAA,KAACsG,EAAAA,EAAI,CAACrF,GAAI6E,EAAKS,KAAInG,UACfG,EAAAA,EAAAA,MAAA,OAAKmB,UAAU,0BAAyBtB,SAAA,EACpCJ,EAAAA,EAAAA,KAAA,OAAK0B,UAAU,qBAAoBtB,UAC/BJ,EAAAA,EAAAA,KAAC4B,EAAW,OAEhBrB,EAAAA,EAAAA,MAAA,OAAKmB,UAAU,gCAA+BtB,SAAA,EAC1CJ,EAAAA,EAAAA,KAAA,QAAM0B,UAAU,sBAAqBtB,SAAE0F,EAAKT,QAC3CS,EAAKU,OAAQxG,EAAAA,EAAAA,KAAA,QAAM0B,UAAU,qBAAoBtB,SAAE0F,EAAKU,WAE7DxG,EAAAA,EAAAA,KAAA,OAAK0B,UAAU,uBAAsBtB,UACjCJ,EAAAA,EAAAA,KAAC2B,EAAU,YAK/B,CClEM,SAAU8E,EAAatE,GAA8C,IAA7C,YAAEuE,KAAgBrE,GAA2BF,EACvE,OAAOnC,EAAAA,EAAAA,KAAA,OAAK0B,UAAU,+BAA8BtB,SAC/CsG,EAAYb,KAAI,CAACc,EAAYZ,KACnB/F,EAAAA,EAAAA,KAAC2F,EAAO,CAEXN,MAAOsB,EAAWtB,MAClBO,MAAOe,EAAWf,SACdvD,GAHC0D,MAOrB,CCjBM,SAAUa,EAAYvE,GAExB,MAAM,OAAEwE,IAAWnB,EAAAA,EAAAA,IAAY,UACzB7C,GAAOC,EAAAA,EAAAA,MAEb,MAAe,SAAX+D,GAAsBxE,EAAMyE,eAQzB,MANC9G,EAAAA,EAAAA,KAAA,OAAK0B,UAAU,wBAAuBtB,UAClCJ,EAAAA,EAAAA,KAAA,KAAG0B,UAAU,iBAAgBtB,SAAEyC,EAAKG,GAAG,CAAAC,GAAA,SAAEC,eAAgB,CAAF,8BAMvE,C,cCHO,MAAM6D,EAAc5E,IAAoD,IAAnD,gBAAE6E,KAAoB3E,GAAyBF,EAEvE,MAAM,OAAE0E,EAAM,MAAE9C,EAAK,QAAEkD,IAAYvB,EAAAA,EAAAA,IAAY,WAEzC,QAAEwB,IAAYC,EAAAA,EAAAA,MACdtE,GAAOC,EAAAA,EAAAA,MACPsE,GAAUC,EAAAA,EAAAA,MAEVX,GAAchC,EAAAA,EAAAA,UAAQ,KACxB,IACIgC,EADAzD,EAAK,EAET,GAAIiE,EAAQI,eACRZ,EAAc,CAAC,CACXrB,MAAO,GACPO,MAAOqB,QAER,CACH,MAAMM,EAAcH,EAAUF,EAAQM,eAAeJ,GAAW,KAChE,IAAIK,EAAQP,EAAQQ,WAChBH,GAAeP,IACfS,EAAQA,EAAME,QAAOC,GAAQA,EAAKC,QAAUN,EAAYM,SAG5DnB,EAAce,EAAM5B,KAAK+B,IACd,CACHC,MAAOD,EAAKC,MACZxC,MAAO2B,EAAkB,GAAMY,EAAKvC,OAASxC,EAAKG,GAAG,CAAAC,GAAA,SAAEC,eAAgB,CAAF,0BACrE0C,MAAOqB,EAAQU,QAAQG,IACnB,MAAMV,EAAUF,EAAQa,YAAWX,GAAWA,EAAQb,OAASuB,EAAOvB,OACtE,GAAIa,EAAS,CAET,OADoBF,EAAQM,eAAeJ,KACpBQ,C,CAE3B,OAAO,CAAK,QAKpBL,IAAgBP,IAChBN,EAAcA,EAAYsB,MAAMC,GACrBA,EAAEJ,QAAUN,EAAYM,OAAS,EAAI,I,CAIxD,OAAOnB,EAAYiB,QAAOhB,GAAcA,EAAWf,MAAMsC,OAAS,IAAGrC,KAAKc,IAC/D,IACAA,EACHf,MAAOe,EAAWf,MAAMC,KAAKC,IAClB,IACAA,EACH7C,GAAIA,WAIlB,GACH,CAACgE,IAEJ,GAAe,UAAXJ,EACA,OAAO7G,EAAAA,EAAAA,KAACwF,EAAW,IAGvB,MAAMsB,EAAiBJ,EAAYwB,OAAS,EAE5C,OAAKnE,EAIA+C,GAIE9G,EAAAA,EAAAA,KAACyG,EAAa,IAAKpE,EAAOqE,YAAaA,KAHnC1G,EAAAA,EAAAA,KAACyF,EAAe,KAJhBzF,EAAAA,EAAAA,KAAC4G,EAAW,CAACE,eAAgBA,GAOqB,EC1E3D,SAAUqB,EAAchG,GAGR,IAHS,QAC3B0B,EAAUuE,EAAAA,KAAI,gBACdpB,GAAkB,GACA7E,EAElB,MAAM,MAAE4B,EAAK,QAAEkD,IAAYvB,EAAAA,EAAAA,IAAY,UACjC7C,GAAOC,EAAAA,EAAAA,OACNsD,EAAaiC,IAAkB7F,EAAAA,EAAAA,eAA6B8F,GAE7DC,GAAeC,EAAAA,EAAAA,QAA8B,MAC7CC,GAAWD,EAAAA,EAAAA,QAA8B,MACzCE,GAAiBF,EAAAA,EAAAA,QAA8B,MAC/CG,GAAcH,EAAAA,EAAAA,QAA8B,MAC5C9E,GAAW8E,EAAAA,EAAAA,QAAgC,MAE3CI,GAA4BJ,EAAAA,EAAAA,QACZ,oBAAXK,OACDA,OAAOC,eAAgBC,WAAWC,MAAM,EAAG5F,GAC3C,IACRe,QAEIP,GAAe4E,EAAAA,EAAAA,QACjBzE,GAAS6E,GACXzE,QAEIgC,GAAW5B,EAAAA,EAAAA,cAAawB,IAC1BsC,EAAetC,EAAM,GACtB,CAACsC,IAiGJ,OCpIE,SAAsBlG,GAAiC,IAAhC,UAAE8G,GAA8B9G,EACzD+B,IAAAA,WAAgB,KACZ,IAAK+E,EACD,OAGJ,MAAMC,EAAoBD,EAAUE,iBAChC,0EAEEC,EAAeF,EAAkB,GACjCG,EAAcH,EAAkBA,EAAkBhB,OAAS,GAEjE,SAASoB,EAAUtE,GACG,QAAdA,EAAM1C,MAIN0C,EAAMuE,SACFC,SAASC,gBAAkBL,IAC3BpE,EAAMC,iBACNoE,EAAYjF,SAEToF,SAASC,gBAAkBJ,IAClCrE,EAAMC,iBACNmE,EAAahF,SAErB,CAIA,OAFA6E,EAAUS,iBAAiB,UAAWJ,GAE/B,KACHL,EAAUU,oBAAoB,UAAWL,EAAU,CACtD,GACF,CAACL,GACR,CDGIW,CAAa,CAAEX,UAAWV,EAAapE,WAEvC1B,EAAAA,EAAAA,YAAU,KACN+G,SAAShD,KAAKqD,UAAUC,IAAI,qBAErB,KACHN,SAAShD,KAAKqD,UAAUE,OAAO,oBAAoB,IAExD,KAEHtH,EAAAA,EAAAA,YAAU,KACFkG,EAAYxE,UACZwE,EAAYxE,QAAQ6F,UAAY,E,GAErC,CAACjG,KAEJtB,EAAAA,EAAAA,YAAU,KACFmB,EAAasE,OAAS,GAClBxE,EAASS,SACTT,EAASS,QAAQC,O,GAG1B,CAACR,KAEJnB,EAAAA,EAAAA,YAAU,KACN,SAASwH,IACL,GAAIxB,EAAStE,QAAS,CAClB,MAAM+F,EAA0B,IAArBrB,OAAOsB,YAClB1B,EAAStE,QAAQiG,MAAMC,YAAY,iBAAkB,GAAGH,M,CAEhE,CAMA,OAJAD,IAEApB,OAAOa,iBAAiB,SAAUO,GAE3B,KACHpB,OAAOc,oBAAoB,SAAUM,EAAsB,CAC9D,GACF,KAEHxH,EAAAA,EAAAA,YAAU,KAEN,MAAM6H,EAAiBlE,GACZuC,EAAYxE,SAASoG,uBAAuB,iBAAiBzE,KAAKM,GAGvEoE,EAAaxF,IACG,YAAdA,EAAM1C,KAAmC,cAAd0C,EAAM1C,KACjC0C,EAAMC,iBACNoD,GAAe,WAAqB,IAApBjC,EAAWqE,UAAAvC,OAAA,QAAAI,IAAAmC,UAAA,GAAAA,UAAA,IAAI,EACT,YAAdzF,EAAM1C,MACJ8D,IAEAA,EAEFA,EAAc,IACdA,EAAca,EAAQiB,OAAS,GAE/B9B,GAAea,EAAQiB,SACvB9B,EAAc,GAGlB,MAAMsE,EAAaJ,EAAclE,GASjC,OARIsE,IACKA,EAAmBC,uBACnBD,EAAmBC,wBAAuB,GAE3CD,EAAWE,gBAAe,IAI3BxE,CACX,KACqB,UAAdpB,EAAM1C,MACb0C,EAAMC,iBACNoD,GAAe,WAAqB,IAApBjC,EAAWqE,UAAAvC,OAAA,QAAAI,IAAAmC,UAAA,GAAAA,UAAA,IAAI,EAC3B,MAAMC,EAAaJ,EAAclE,GAOjC,OANIsE,GACAG,uBAAsB,KAClBH,EAAWI,qBAAqB,KAAKhF,KAAK,IAC9BiF,cAAc,IAAIC,MAAM,QAAS,CAAEC,SAAS,IAAQ,IAGjE7E,CACX,I,EAKR,OAFAyC,OAAOa,iBAAiB,UAAWc,GAE5B,KACH3B,OAAOc,oBAAoB,UAAWa,EAAU,CACnD,GACF,CAACnC,EAAgBpB,KAGhBjH,EAAAA,EAAAA,KAACkL,EAAS,CACN9I,IAAKmG,EACL7G,UAAU,gCACVyJ,YAAcnG,IACNA,EAAMF,SAAWE,EAAMoG,eACvBvH,G,EAEPzD,UAEDG,EAAAA,EAAAA,MAAA,OAAKmB,UAAU,kBAAkBU,IAAKqG,EAAQrI,SAAA,EAC1CJ,EAAAA,EAAAA,KAAA,UAAQ0B,UAAU,sBAAsBU,IAAKsG,EAActI,UACvDJ,EAAAA,EAAAA,KAACwD,EAAS,CACNI,aAAcA,EACdE,YAAajB,EAAKG,GAAG,CAAAC,GAAA,SAAEC,eAAgB,CAAF,yBACrCO,UAAmC,IAAxBG,EAAasE,OACxBrE,QAASA,EACTH,SAAUA,EACVC,gBACI0H,QAAQzH,IACRA,IAAiBgF,OAI7B5I,EAAAA,EAAAA,KAAA,OAAK0B,UAAU,qBAAqBU,IAAKuG,EAAWvI,UAChDJ,EAAAA,EAAAA,KAAC+G,EAAW,CACRC,gBAAiBA,EACjBb,SAAUA,EACVC,YAAaA,EACbF,YAAaA,KACTrC,GAAS,EAEbH,SAAUA,OAGlB1D,EAAAA,EAAAA,KAAA,UAAQ0B,UAAU,mBAAkBtB,UAChCJ,EAAAA,EAAAA,KAACqD,EAAM,UAK3B,CAEA,MAAM6H,EAAY/H,EAAAA,GAAAA,GAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EEvKd,SAAUmI,EAASnJ,GAA4C,IAA3C,GAAEoJ,EAAE,UAAE7J,KAAcW,GAAuBF,EACzE,MAAMqJ,GAAkBhD,EAAAA,EAAAA,QAA0B,OAC3CiD,EAAQC,IAAalJ,EAAAA,EAAAA,WAAS,GAE/BmJ,GAASpH,EAAAA,EAAAA,cAAY,KACvBmH,GAAU,EAAK,GAChB,CAACA,IAEE7H,GAAUU,EAAAA,EAAAA,cAAY,KACxBmH,GAAU,EAAM,GACjB,CAACA,KCEF,SAA2BvJ,GAMC,IANA,OAC9BsJ,EAAM,OACNE,EAAM,QACN9H,EAAO,QACP+H,EAAO,gBACPJ,GAC8BrJ,EAC9B+B,IAAAA,WAAgB,KACZ,SAASsG,EAAUxF,IAUQ,KAAlBA,EAAM6G,SAAkBJ,GAEV,MAAdzG,EAAM1C,MAAgB0C,EAAM8G,SAAW9G,EAAM+G,WAhC9D,SAA0B/G,GACtB,MAAMgH,EAAUhH,EAAMF,OAChBmH,EAAUD,EAAQC,QAExB,OACID,EAAQE,mBACI,UAAZD,GACY,WAAZA,GACY,aAAZA,CAER,CAyBkBE,CAAiBnH,IAAwB,MAAdA,EAAM1C,MAAgBmJ,KAEnDzG,EAAMC,iBAEFwG,EACA5H,IACQ2F,SAAShD,KAAKqD,UAAUuC,SAAS,sBAjBxC5C,SAAShD,KAAKqD,UAAUuC,SAAS,sBAClCT,KAsBJH,GACAA,EAAgBrH,UAAYqF,SAASC,eACrCmC,GAEI,cAAcjJ,KAAK0J,OAAOC,aAAatH,EAAM6G,WAC7CD,EAAQ5G,EAGpB,CAIA,OAFA6D,OAAOa,iBAAiB,UAAWc,GAE5B,KACH3B,OAAOc,oBAAoB,UAAWa,EAAU,CACnD,GACF,CAACiB,EAAQE,EAAQ9H,EAAS+H,EAASJ,GAC1C,CD/CIe,CAAkB,CACdd,SACAE,SACA9H,UACA+H,SARYrH,EAAAA,EAAAA,cAAY,KACxBmH,GAAU,EAAK,GAChB,CAACA,IAOAF,oBAGJ,MAAMgB,EAAYjB,GAAMtJ,EAExB,OAAO1B,EAAAA,EAAAA,MAAA+C,EAAAA,SAAA,CAAAlD,SAAA,EACHJ,EAAAA,EAAAA,KAACyM,EAAW,KACZzM,EAAAA,EAAAA,KAACwM,EAAS,CAACjH,QAASoG,EAAQjK,UAAWA,EAAWU,IAAKoJ,IACtDC,IAAUiB,EAAAA,EAAAA,eACP1M,EAAAA,EAAAA,KAACmI,EAAc,IACP9F,EACJwB,QAASA,IAEb2F,SAAShD,QAGrB,CAEA,MAAMiG,EAAcE,EAAAA,EAAiB","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, 500), [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 <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","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-Hits {\r\n ul {\r\n box-shadow: var(--docsearch-hit-shadow);\r\n border-radius: 4px;\r\n margin-bottom: 4px;\r\n margin-top: 3px;\r\n }\r\n }\r\n\r\n .DocSearch-Hit {\r\n padding-bottom: 0;\r\n border-radius: 0;\r\n\r\n a {\r\n border-radius: 0;\r\n border-top: 1px solid rgb(212, 217, 225, 0.4);\r\n box-shadow: none;\r\n }\r\n\r\n &:first-child {\r\n a {\r\n border-top-left-radius: 4px;\r\n border-top-right-radius: 4px;\r\n border-top-width: 0;\r\n }\r\n }\r\n\r\n &:last-child {\r\n a {\r\n border-bottom-left-radius: 4px;\r\n border-bottom-right-radius: 4px;\r\n }\r\n }\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:root {\r\n --docsearch-primary-color: var(--ttw-primary-color);\r\n --docsearch-hit-height: 48px;\r\n --docsearch-searchbox-height: 48px;\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":""}