neko-ui 0.0.5
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/LICENSE +20 -0
- package/README.md +19 -0
- package/es/back-top/index.d.ts +9 -0
- package/es/back-top/index.js +2 -0
- package/es/back-top/index.js.map +1 -0
- package/es/back-top/index.less +70 -0
- package/es/index.d.ts +4 -0
- package/es/index.js +2 -0
- package/es/index.js.map +1 -0
- package/es/markdown/copy.less +69 -0
- package/es/markdown/icon.less +101 -0
- package/es/markdown/iconfont.woff2 +0 -0
- package/es/markdown/index.d.ts +24 -0
- package/es/markdown/index.global.less +5 -0
- package/es/markdown/index.js +2 -0
- package/es/markdown/index.js.map +1 -0
- package/es/markdown/markdown-util.d.ts +15 -0
- package/es/markdown/markdown-util.js +2 -0
- package/es/markdown/markdown-util.js.map +1 -0
- package/es/markdown/md.less +455 -0
- package/es/markdown/pre-code.less +670 -0
- package/es/markdown/prism.js +2 -0
- package/es/markdown/prism.js.map +1 -0
- package/es/markdown/vars.less +57 -0
- package/es/utils/document.d.ts +35 -0
- package/es/utils/document.js +2 -0
- package/es/utils/document.js.map +1 -0
- package/es/utils/str-to-highlight.d.ts +19 -0
- package/es/utils/str-to-highlight.js +2 -0
- package/es/utils/str-to-highlight.js.map +1 -0
- package/es/utils/use-theme.d.ts +19 -0
- package/es/utils/use-theme.js +2 -0
- package/es/utils/use-theme.js.map +1 -0
- package/lib/back-top/index.d.ts +9 -0
- package/lib/back-top/index.js +2 -0
- package/lib/back-top/index.js.map +1 -0
- package/lib/back-top/index.less +70 -0
- package/lib/index.d.ts +4 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -0
- package/lib/markdown/copy.less +69 -0
- package/lib/markdown/icon.less +101 -0
- package/lib/markdown/iconfont.woff2 +0 -0
- package/lib/markdown/index.d.ts +24 -0
- package/lib/markdown/index.global.less +5 -0
- package/lib/markdown/index.js +2 -0
- package/lib/markdown/index.js.map +1 -0
- package/lib/markdown/markdown-util.d.ts +15 -0
- package/lib/markdown/markdown-util.js +2 -0
- package/lib/markdown/markdown-util.js.map +1 -0
- package/lib/markdown/md.less +455 -0
- package/lib/markdown/pre-code.less +670 -0
- package/lib/markdown/prism.js +2 -0
- package/lib/markdown/prism.js.map +1 -0
- package/lib/markdown/vars.less +57 -0
- package/lib/utils/document.d.ts +35 -0
- package/lib/utils/document.js +2 -0
- package/lib/utils/document.js.map +1 -0
- package/lib/utils/str-to-highlight.d.ts +19 -0
- package/lib/utils/str-to-highlight.js +2 -0
- package/lib/utils/str-to-highlight.js.map +1 -0
- package/lib/utils/use-theme.d.ts +19 -0
- package/lib/utils/use-theme.js +2 -0
- package/lib/utils/use-theme.js.map +1 -0
- package/package.json +34 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
The MIT License (MIT)
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2014 connors and other contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
6
|
+
this software and associated documentation files (the "Software"), to deal in
|
|
7
|
+
the Software without restriction, including without limitation the rights to
|
|
8
|
+
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
9
|
+
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
10
|
+
subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
17
|
+
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
18
|
+
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
19
|
+
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
20
|
+
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface BackTopProps extends React.HTMLAttributes<HTMLDivElement> {
|
|
3
|
+
/** 设置需要监听其滚动事件的元素,值为一个返回对应 DOM 元素的函数 */
|
|
4
|
+
target?: () => HTMLElement;
|
|
5
|
+
/** 滚动高度达到此参数值才出现 BackTop */
|
|
6
|
+
visibilityHeight?: number;
|
|
7
|
+
}
|
|
8
|
+
declare const _default: React.NamedExoticComponent<BackTopProps>;
|
|
9
|
+
export default _default;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function _arrayLikeToArray(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}function _arrayWithHoles(arr){if(Array.isArray(arr))return arr}function _extends(){_extends=Object.assign||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)}function _iterableToArrayLimit(arr,i){var _i=arr==null?null:typeof Symbol!=="undefined"&&arr[Symbol.iterator]||arr["@@iterator"];if(_i==null)return;var _arr=[];var _n=true;var _d=false;var _s,_e;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break}}catch(err){_d=true;_e=err}finally{try{if(!_n&&_i["return"]!=null)_i["return"]()}finally{if(_d)throw _e}}return _arr}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _objectWithoutProperties(source,excluded){if(source==null)return{};var target=_objectWithoutPropertiesLoose(source,excluded);var key,i;if(Object.getOwnPropertySymbols){var sourceSymbolKeys=Object.getOwnPropertySymbols(source);for(i=0;i<sourceSymbolKeys.length;i++){key=sourceSymbolKeys[i];if(excluded.indexOf(key)>=0)continue;if(!Object.prototype.propertyIsEnumerable.call(source,key))continue;target[key]=source[key]}}return target}function _objectWithoutPropertiesLoose(source,excluded){if(source==null)return{};var target={};var sourceKeys=Object.keys(source);var key,i;for(i=0;i<sourceKeys.length;i++){key=sourceKeys[i];if(excluded.indexOf(key)>=0)continue;target[key]=source[key]}return target}function _slicedToArray(arr,i){return _arrayWithHoles(arr)||_iterableToArrayLimit(arr,i)||_unsupportedIterableToArray(arr,i)||_nonIterableRest()}function _unsupportedIterableToArray(o,minLen){if(!o)return;if(typeof o==="string")return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(n);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _arrayLikeToArray(o,minLen)}import React,{useCallback,useMemo,useRef}from"react";import styles from"./index.less";import{getMaxZindex,getScrollTop}from"../utils/document";import{isEqual,isFunction}from"lodash";var BackTop=function(_param){var _target=_param.target,target=_target===void 0?function(){return window}:_target,_visibilityHeight=_param.visibilityHeight,visibilityHeight=_visibilityHeight===void 0?400:_visibilityHeight,className=_param.className,props=_objectWithoutProperties(_param,["target","visibilityHeight","className"]);var ref3=useRef(null);var ref1=_slicedToArray(React.useState(null),2),show=ref1[0],setShow=ref1[1];var ref2=_slicedToArray(React.useState(false),2),init=ref2[0],setInit=ref2[1];var handleScrollY=React.useCallback(function(){var scrollTop=0;var offsetHeight=0;if(isFunction(target)){var ele=target();if(ele){scrollTop=getScrollTop(ele);offsetHeight=ele.offsetHeight}ele=null}else{scrollTop=getScrollTop();offsetHeight=document.documentElement.offsetHeight||document.body.offsetHeight}var nextShow=scrollTop>offsetHeight/3||scrollTop>visibilityHeight;if(Boolean(show)!==nextShow){setShow(nextShow)}},[show,target,visibilityHeight]);var handleBackTop=useCallback(function(){var ref;(ref=target())===null||ref===void 0?void 0:ref.scrollTo({top:0,behavior:"smooth"})},[target]);React.useEffect(function(){var timer;var outing=show===false;if(show&&ref3.current){ref3.current.style.zIndex=getMaxZindex().toString()}if(init){if(outing){timer=setTimeout(function(){setShow(null);clearTimeout(timer)},1e3)}}else{if(outing){setShow(null)}setInit(true)}return function(){clearTimeout(timer)}},[init,show]);React.useEffect(function(){if(isFunction(target)){var ref;(ref=target())===null||ref===void 0?void 0:ref.addEventListener("scroll",handleScrollY,false)}return function(){if(isFunction(target)){var ref;(ref=target())===null||ref===void 0?void 0:ref.removeEventListener("scroll",handleScrollY,false)}}},[handleScrollY,target]);var cls=useMemo(function(){return[styles.backTop,className,!show&&styles.out].filter(Boolean).join(" ")},[className,show]);return show===null?null:React.createElement("div",_extends({},props,{ref:ref3,className:cls,onClick:handleBackTop}))};export default React.memo(BackTop,isEqual)
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../components/back-top/index.tsx"],"sourcesContent":["import React, { useCallback, useMemo, useRef } from 'react';\nimport styles from './index.less';\nimport { getMaxZindex, getScrollTop } from '../utils/document';\nimport { isEqual, isFunction } from 'lodash';\n\nexport interface BackTopProps extends React.HTMLAttributes<HTMLDivElement> {\n /** 设置需要监听其滚动事件的元素,值为一个返回对应 DOM 元素的函数 */\n target?: () => HTMLElement;\n /** 滚动高度达到此参数值才出现 BackTop */\n visibilityHeight?: number;\n}\n\nconst BackTop: React.FC<BackTopProps> = ({\n target = () => window as unknown as HTMLElement,\n visibilityHeight = 400,\n className,\n ...props\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n const [show, setShow] = React.useState<boolean | null>(null);\n const [init, setInit] = React.useState<boolean>(false);\n const handleScrollY = React.useCallback(() => {\n let scrollTop: number | null = 0;\n let offsetHeight: number | null = 0;\n\n if (isFunction(target)) {\n let ele: HTMLElement | null = target();\n\n if (ele) {\n scrollTop = getScrollTop(ele);\n offsetHeight = ele.offsetHeight;\n }\n ele = null;\n } else {\n scrollTop = getScrollTop();\n offsetHeight = document.documentElement.offsetHeight || document.body.offsetHeight;\n }\n const nextShow: boolean = scrollTop > offsetHeight / 3 || scrollTop > visibilityHeight;\n\n if (Boolean(show) !== nextShow) {\n setShow(nextShow);\n }\n }, [show, target, visibilityHeight]);\n const handleBackTop = useCallback(() => {\n target()?.scrollTo({\n top: 0,\n behavior: 'smooth',\n });\n }, [target]);\n\n React.useEffect(() => {\n let timer: NodeJS.Timeout;\n const outing = show === false;\n\n if (show && ref.current) {\n ref.current.style.zIndex = getMaxZindex().toString();\n }\n if (init) {\n if (outing) {\n timer = setTimeout(() => {\n setShow(null);\n clearTimeout(timer);\n }, 1000);\n }\n } else {\n if (outing) {\n setShow(null);\n }\n setInit(true);\n }\n return () => {\n clearTimeout(timer);\n };\n }, [init, show]);\n React.useEffect(() => {\n if (isFunction(target)) {\n target()?.addEventListener('scroll', handleScrollY, false);\n }\n return () => {\n if (isFunction(target)) {\n target()?.removeEventListener('scroll', handleScrollY, false);\n }\n };\n }, [handleScrollY, target]);\n\n const cls = useMemo(\n () => [styles.backTop, className, !show && styles.out].filter(Boolean).join(' '),\n [className, show]\n );\n\n return show === null ? null : (\n <div {...props} ref={ref} className={cls} onClick={handleBackTop} />\n );\n};\n\nexport default React.memo(BackTop, isEqual);\n"],"names":["React","useCallback","useMemo","useRef","styles","getMaxZindex","getScrollTop","isEqual","isFunction","BackTop","target","window","visibilityHeight","className","props","ref","useState","show","setShow","init","setInit","handleScrollY","scrollTop","offsetHeight","ele","document","documentElement","body","nextShow","Boolean","handleBackTop","scrollTo","top","behavior","useEffect","timer","outing","current","style","zIndex","toString","setTimeout","clearTimeout","addEventListener","removeEventListener","cls","backTop","out","filter","join","div","onClick","memo"],"mappings":"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"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
@charset "utf-8";
|
|
2
|
+
|
|
3
|
+
:root {
|
|
4
|
+
--back-top-color: #fff;
|
|
5
|
+
--back-top-bg: var(--text-color-secondary, @text-color-secondary);
|
|
6
|
+
--back-top-hover-bg: var(--text-color, @text-color);
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
[data-theme='dark'] {
|
|
10
|
+
--back-top-bg: rgba(255, 255, 255, 0.45);
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
.back-top {
|
|
14
|
+
position: sticky;
|
|
15
|
+
left: calc(100% - 100px);
|
|
16
|
+
bottom: 50px;
|
|
17
|
+
display: flex;
|
|
18
|
+
align-items: center;
|
|
19
|
+
justify-content: center;
|
|
20
|
+
width: 40px;
|
|
21
|
+
height: 40px;
|
|
22
|
+
cursor: pointer;
|
|
23
|
+
animation: back-top-fade-in 1s forwards;
|
|
24
|
+
box-shadow: @box-shadow-base;
|
|
25
|
+
border-radius: 50%;
|
|
26
|
+
color: var(--back-top-color);
|
|
27
|
+
background-color: var(--back-top-bg);
|
|
28
|
+
transition: background-color .3s, color .3s;
|
|
29
|
+
|
|
30
|
+
&::before {
|
|
31
|
+
content: '';
|
|
32
|
+
display: block;
|
|
33
|
+
width: 16px;
|
|
34
|
+
height: 8px;
|
|
35
|
+
background-color: var(--back-top-color);
|
|
36
|
+
clip-path: polygon(0 100%, 50% 0, 100% 100%);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
&:hover {
|
|
40
|
+
background-color: var(--back-top-hover-bg);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.out {
|
|
45
|
+
animation: back-top-fade-out 1s forwards;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
@keyframes back-top-fade-in {
|
|
49
|
+
from {
|
|
50
|
+
transform: translate3d(0, 16px, 0) scale(1);
|
|
51
|
+
opacity: 0;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
to {
|
|
55
|
+
transform: translate3d(0, 0, 0) scale(1);
|
|
56
|
+
opacity: 1;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
@keyframes back-top-fade-out {
|
|
60
|
+
from,
|
|
61
|
+
20% {
|
|
62
|
+
transform: translate3d(0, 0, 0);
|
|
63
|
+
opacity: 1;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
to {
|
|
67
|
+
transform: translate3d(0, 16px, 0);
|
|
68
|
+
opacity: 0;
|
|
69
|
+
}
|
|
70
|
+
}
|
package/es/index.d.ts
ADDED
package/es/index.js
ADDED
package/es/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../components/index.ts"],"sourcesContent":["export { default as Markdown } from './markdown';\nexport type { MarkdownProps, CodeBlockToolType, AnchorType } from './markdown';\n\nexport { default as BackTop } from './back-top';\nexport type { BackTopProps } from './back-top';\n"],"names":["default","Markdown","BackTop"],"mappings":"AAAA,OAASA,OAAO,IAAIC,QAAQ,KAAQ,YAAY,AAAC,AAGjD,QAASD,OAAO,IAAIE,OAAO,KAAQ,YAAY,AAAC,AACD"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
[data-copy] {
|
|
2
|
+
&::before {
|
|
3
|
+
position: absolute;
|
|
4
|
+
top: 32px;
|
|
5
|
+
right: 0;
|
|
6
|
+
left: 0;
|
|
7
|
+
z-index: 1;
|
|
8
|
+
display: inline-block;
|
|
9
|
+
width: fit-content;
|
|
10
|
+
margin: auto;
|
|
11
|
+
padding: 4px 8px;
|
|
12
|
+
font-size: 12px;
|
|
13
|
+
border: 1px solid;
|
|
14
|
+
border-radius: var(--border-radius-base);
|
|
15
|
+
transition: background-color 0.2s, color 0.2s, border-color 0.2s;
|
|
16
|
+
animation-fill-mode: forwards;
|
|
17
|
+
content: '\590d\5236\6210\529f';
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
[data-copy='success'] {
|
|
22
|
+
&::before {
|
|
23
|
+
color: var(--success-color);
|
|
24
|
+
background-color: var(--success-color-deprecated-bg);
|
|
25
|
+
border-color: var(--success-color-deprecated-border);
|
|
26
|
+
animation: copy-slide-in 0.3s ease-in-out;
|
|
27
|
+
content: '\590d\5236\6210\529f';
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
[data-copy='failure'] {
|
|
32
|
+
&::before {
|
|
33
|
+
color: var(--error-color);
|
|
34
|
+
background-color: var(--error-color-deprecated-bg);
|
|
35
|
+
border-color: var(--error-color-deprecated-border);
|
|
36
|
+
animation: copy-slide-in 0.3s ease-in-out, error 1s ease-in-out 1s;
|
|
37
|
+
content: '\590d\5236\5931\8d25';
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
[data-copy-exit] {
|
|
42
|
+
&::before {
|
|
43
|
+
animation: copy-slide-out 0.3s forwards ease-in-out;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
@keyframes copy-slide-in {
|
|
47
|
+
from {
|
|
48
|
+
transform: translate3d(0, -100%, 0) scale(0);
|
|
49
|
+
opacity: 0;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
to {
|
|
53
|
+
transform: translate3d(0, 0, 0) scale(1);
|
|
54
|
+
opacity: 1;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
@keyframes copy-slide-out {
|
|
59
|
+
from {
|
|
60
|
+
transform: translate3d(0, 0, 0) scale(1);
|
|
61
|
+
opacity: 1;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
to {
|
|
65
|
+
transform: translate3d(0, -100%, 0) scale(0);
|
|
66
|
+
opacity: 0;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
@font-face {
|
|
2
|
+
font-family: 'neko__icon';
|
|
3
|
+
src: url('./iconfont.woff2') format('woff2');
|
|
4
|
+
}
|
|
5
|
+
@font-face {
|
|
6
|
+
font-family: PrismTreeview;
|
|
7
|
+
src: url('data:application/font-woff;base64,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')
|
|
8
|
+
format('woff');
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.neko-icon {
|
|
12
|
+
font-size: 16px;
|
|
13
|
+
font-family: 'neko__icon', sans-serif !important;
|
|
14
|
+
font-style: normal;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.iconmacos-add::before {
|
|
18
|
+
content: '\e641';
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.iconmacos-close::before {
|
|
22
|
+
content: '\e642';
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
.iconmacos-minimize::before {
|
|
26
|
+
content: '\e643';
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
.iconnight::before {
|
|
30
|
+
content: '\e688';
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.iconlight::before {
|
|
34
|
+
content: '\e6e9';
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.iconlogout::before {
|
|
38
|
+
content: '\e607';
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.iconlogin::before {
|
|
42
|
+
content: '\e608';
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.icontimeline::before {
|
|
46
|
+
content: '\e609';
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.iconavatar::before {
|
|
50
|
+
content: '\e600';
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.iconhome::before {
|
|
54
|
+
content: '\e6ae';
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.iconcopy::before {
|
|
58
|
+
content: '\e631';
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
.icontheme::before {
|
|
62
|
+
content: '\e63c';
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.iconmark-right::before {
|
|
66
|
+
content: '\e68d';
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.iconmark-left::before {
|
|
70
|
+
content: '\e68e';
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
.iconxiala::before {
|
|
74
|
+
content: '\e611';
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
.iconclose::before {
|
|
78
|
+
content: '\e720';
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
/* stylelint-disable-next-line selector-class-pattern */
|
|
82
|
+
.icon14CIRCLE::before {
|
|
83
|
+
content: '\e640';
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
.iconwarning::before {
|
|
87
|
+
content: '\e670';
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
.iconinfo::before {
|
|
91
|
+
content: '\e6eb';
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.iconsuccess::before {
|
|
95
|
+
content: '\e726';
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.iconzan-f::before {
|
|
99
|
+
content: '\e669';
|
|
100
|
+
}
|
|
101
|
+
|
|
Binary file
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import 'react-photo-view/dist/react-photo-view.css';
|
|
3
|
+
import './index.global.less';
|
|
4
|
+
export declare type CodeBlockToolType = Array<'copy'>;
|
|
5
|
+
export interface MarkdownProps {
|
|
6
|
+
className?: string;
|
|
7
|
+
style?: React.CSSProperties;
|
|
8
|
+
/** md内容 */
|
|
9
|
+
text?: string;
|
|
10
|
+
/** 开启图片查看器 */
|
|
11
|
+
pictureViewer?: boolean;
|
|
12
|
+
/** 显示代码块行号 */
|
|
13
|
+
langLineNumber?: boolean;
|
|
14
|
+
/** 开启代码块工具条 */
|
|
15
|
+
tools?: CodeBlockToolType;
|
|
16
|
+
/** 指定滚动的容器 */
|
|
17
|
+
getAnchorContainer?: () => HTMLElement;
|
|
18
|
+
}
|
|
19
|
+
export declare type AnchorType = {
|
|
20
|
+
anchor: HTMLAnchorElement;
|
|
21
|
+
top: number;
|
|
22
|
+
};
|
|
23
|
+
declare const _default: React.NamedExoticComponent<MarkdownProps>;
|
|
24
|
+
export default _default;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
function _arrayLikeToArray(arr,len){if(len==null||len>arr.length)len=arr.length;for(var i=0,arr2=new Array(len);i<len;i++)arr2[i]=arr[i];return arr2}function _arrayWithHoles(arr){if(Array.isArray(arr))return arr}function _iterableToArrayLimit(arr,i){var _i=arr==null?null:typeof Symbol!=="undefined"&&arr[Symbol.iterator]||arr["@@iterator"];if(_i==null)return;var _arr=[];var _n=true;var _d=false;var _s,_e;try{for(_i=_i.call(arr);!(_n=(_s=_i.next()).done);_n=true){_arr.push(_s.value);if(i&&_arr.length===i)break}}catch(err){_d=true;_e=err}finally{try{if(!_n&&_i["return"]!=null)_i["return"]()}finally{if(_d)throw _e}}return _arr}function _nonIterableRest(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}function _slicedToArray(arr,i){return _arrayWithHoles(arr)||_iterableToArrayLimit(arr,i)||_unsupportedIterableToArray(arr,i)||_nonIterableRest()}function _unsupportedIterableToArray(o,minLen){if(!o)return;if(typeof o==="string")return _arrayLikeToArray(o,minLen);var n=Object.prototype.toString.call(o).slice(8,-1);if(n==="Object"&&o.constructor)n=o.constructor.name;if(n==="Map"||n==="Set")return Array.from(n);if(n==="Arguments"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n))return _arrayLikeToArray(o,minLen)}import React,{Fragment,useCallback,useEffect,useMemo,useRef,useState}from"react";import{getScrollTop,setClipboard}from"../utils/document";import{getMarkedImgList,markdownUtil}from"./markdown-util";import{PhotoSlider}from"react-photo-view";import"react-photo-view/dist/react-photo-view.css";import"./index.global.less";import isEqual from"lodash/isEqual";var toggleAnchor=function(anchor){var ref,ref1,ref2;(ref1=(ref=anchor.offsetParent)===null||ref===void 0?void 0:ref.querySelectorAll("li"))===null||ref1===void 0?void 0:ref1.forEach(function(a){a.classList.remove("active")});(ref2=anchor.parentElement)===null||ref2===void 0?void 0:ref2.classList.add("active")};var Markdown=function(param){var className=param.className,style=param.style,text=param.text,_pictureViewer=param.pictureViewer,pictureViewer=_pictureViewer===void 0?true:_pictureViewer,_langLineNumber=param.langLineNumber,langLineNumber=_langLineNumber===void 0?true:_langLineNumber,_tools=param.tools,tools=_tools===void 0?["copy"]:_tools,_getAnchorContainer=param.getAnchorContainer,getAnchorContainer=_getAnchorContainer===void 0?function(){return window}:_getAnchorContainer;var ref9=useRef(null);var ref3=_slicedToArray(useState(false),2),visible=ref3[0],setVisible=ref3[1];var ref4=_slicedToArray(useState(0),2),photoIndex=ref4[0],setPhotoIndex=ref4[1];var ref5=_slicedToArray(useState(""),2),htmlString=ref5[0],setHtmlString=ref5[1];var ref6=_slicedToArray(useState([]),2),imgList=ref6[0],setImgList=ref6[1];var htmlStrRef=useRef(htmlString);var anchors=useRef([]);useMemo(function(){var str=htmlStrRef.current;if(text){str=markdownUtil(text,{langLineNumber:langLineNumber,langToolbar:tools})}else{str=""}if(str!==htmlStrRef.current){Object.assign(htmlStrRef,{current:str});setHtmlString(str)}},[langLineNumber,tools,text]);useEffect(function(){var timer=setTimeout(function(){window.Prism.highlightAll();if(typeof timer==="number")clearTimeout(timer)},0);if(pictureViewer){setImgList(getMarkedImgList(htmlString))}return function(){if(typeof timer==="number"){clearTimeout(timer)}}},[htmlString,pictureViewer]);var handleAnchor=function(e){var ref,ref7,ref8;e.preventDefault();e.stopPropagation();toggleAnchor(e.target);(ref8=(ref=ref9.current)===null||ref===void 0?void 0:ref.querySelector(decodeURIComponent((ref7=e.target)===null||ref7===void 0?void 0:ref7.hash)))===null||ref8===void 0?void 0:ref8.scrollIntoView({behavior:"smooth",block:"center"})};useEffect(function(){var ref12,ref10;var _anchors=[];(ref10=(ref12=ref9.current)===null||ref12===void 0?void 0:ref12.querySelectorAll(".markdown-toc li a"))===null||ref10===void 0?void 0:ref10.forEach(function(e){var ref,ref11;var a=e;var _el=(ref=ref9.current)===null||ref===void 0?void 0:ref.querySelector(decodeURIComponent((ref11=a)===null||ref11===void 0?void 0:ref11.hash));_anchors.push({anchor:a,top:_el.offsetTop});e.onclick=handleAnchor});Object.assign(anchors,{current:_anchors})},[htmlString]);var handleClick=useCallback(function(event){var target=event.target;if((target===null||target===void 0?void 0:target.tagName)==="IMG"&&pictureViewer){var ref;var arr=((ref=ref9.current)===null||ref===void 0?void 0:ref.getElementsByTagName("img"))||[];for(var i=0,len=arr.length;i<len;i++){if(arr[i]===target){setPhotoIndex(i);setVisible(true)}}}else if(target.className.includes("toolbar-copy")&&(tools===null||tools===void 0?void 0:tools.includes("copy"))){if(target.offsetParent&&!target.offsetParent.hasAttribute("data-copy")){setClipboard(target.offsetParent.innerText,target.offsetParent)}}},[tools,pictureViewer]);var handleWheel=useCallback(function(event){var offsetParent=event.target.offsetParent;if(!offsetParent||offsetParent.tagName!=="PRE"){return}var rows=offsetParent===null||offsetParent===void 0?void 0:offsetParent.getElementsByClassName("line-numbers-rows");if(rows===null||rows===void 0?void 0:rows.length){var codeTag=offsetParent.getElementsByTagName("code")[0];if(codeTag.scrollHeight-codeTag.offsetHeight&&rows[0].scrollTop!==codeTag.scrollTop){rows[0].scrollTop=codeTag.scrollTop}}},[]);var handleScroll=useCallback(function(e){if(!anchors.current.length)return;var el=e.target;var top=getScrollTop(el);var anchor=null;anchors.current.forEach(function(a){if(top-a.top> -el.offsetHeight/2)anchor=a.anchor});if(anchor){toggleAnchor(anchor)}},[]);useEffect(function(){var ref13;(ref13=getAnchorContainer())===null||ref13===void 0?void 0:ref13.addEventListener("scroll",handleScroll);return function(){var ref;(ref=getAnchorContainer())===null||ref===void 0?void 0:ref.removeEventListener("scroll",handleScroll)}},[getAnchorContainer,handleScroll]);var cls=useMemo(function(){return["markdown-box",className].filter(Boolean).join(" ")},[className]);return React.createElement(Fragment,null,React.createElement("div",{ref:ref9,className:cls,style:style,dangerouslySetInnerHTML:{__html:htmlString},onClick:handleClick,onWheel:handleWheel}),imgList.length?React.createElement(PhotoSlider,{images:imgList,visible:visible,onClose:function(){return setVisible(false)},index:photoIndex,onIndexChange:setPhotoIndex}):null)};export default React.memo(Markdown,isEqual)
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../components/markdown/index.tsx"],"sourcesContent":["import React, { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport type { FC, MouseEvent, WheelEvent } from 'react';\nimport { getScrollTop, setClipboard } from '../utils/document';\nimport { getMarkedImgList, markdownUtil } from './markdown-util';\nimport { PhotoSlider } from 'react-photo-view';\nimport type { DataType as PhotoViewDataType } from 'react-photo-view/dist/types';\nimport 'react-photo-view/dist/react-photo-view.css';\nimport './index.global.less';\nimport isEqual from 'lodash/isEqual';\n\nexport type CodeBlockToolType = Array<'copy'>;\n\nexport interface MarkdownProps {\n className?: string;\n style?: React.CSSProperties;\n /** md内容 */\n text?: string;\n /** 开启图片查看器 */\n pictureViewer?: boolean;\n /** 显示代码块行号 */\n langLineNumber?: boolean;\n /** 开启代码块工具条 */\n tools?: CodeBlockToolType;\n /** 指定滚动的容器 */\n getAnchorContainer?: () => HTMLElement;\n}\n\nexport type AnchorType = {\n anchor: HTMLAnchorElement;\n top: number;\n};\n\nconst toggleAnchor = (anchor: HTMLAnchorElement) => {\n anchor.offsetParent?.querySelectorAll('li')?.forEach((a) => {\n a.classList.remove('active');\n });\n anchor.parentElement?.classList.add('active');\n};\n\nconst Markdown: FC<MarkdownProps> = ({\n className,\n style,\n text,\n pictureViewer = true,\n langLineNumber = true,\n tools = ['copy'],\n getAnchorContainer = () => window,\n}) => {\n const ref = useRef<HTMLDivElement>(null);\n const [visible, setVisible] = useState(false);\n const [photoIndex, setPhotoIndex] = useState(0);\n const [htmlString, setHtmlString] = useState<string>('');\n const [imgList, setImgList] = useState<PhotoViewDataType[]>([]);\n const htmlStrRef = useRef<string>(htmlString);\n const anchors = useRef<AnchorType[]>([]);\n\n useMemo(() => {\n let str = htmlStrRef.current;\n\n if (text) {\n str = markdownUtil(text, {\n langLineNumber,\n langToolbar: tools,\n });\n } else {\n str = '';\n }\n if (str !== htmlStrRef.current) {\n Object.assign(htmlStrRef, {\n current: str,\n });\n setHtmlString(str);\n }\n }, [langLineNumber, tools, text]);\n\n useEffect(() => {\n const timer: NodeJS.Timeout = setTimeout(() => {\n window.Prism.highlightAll();\n if (typeof timer === 'number') clearTimeout(timer);\n }, 0);\n\n if (pictureViewer) {\n setImgList(getMarkedImgList(htmlString));\n }\n return () => {\n if (typeof timer === 'number') {\n clearTimeout(timer);\n }\n };\n }, [htmlString, pictureViewer]);\n\n const handleAnchor = (e: Event) => {\n e.preventDefault();\n e.stopPropagation();\n toggleAnchor(e.target as HTMLAnchorElement);\n ref.current\n ?.querySelector(decodeURIComponent((e.target as HTMLAnchorElement)?.hash))\n ?.scrollIntoView({\n behavior: 'smooth',\n block: 'center',\n });\n };\n\n useEffect(() => {\n const _anchors: AnchorType[] = [];\n\n ref.current?.querySelectorAll('.markdown-toc li a')?.forEach((e) => {\n const a = e as HTMLAnchorElement;\n const _el = ref.current?.querySelector(\n decodeURIComponent((a as HTMLAnchorElement)?.hash)\n ) as HTMLElement;\n\n _anchors.push({\n anchor: a,\n top: _el.offsetTop,\n });\n (e as HTMLAnchorElement).onclick = handleAnchor;\n });\n\n Object.assign(anchors, {\n current: _anchors,\n });\n }, [htmlString]);\n\n const handleClick = useCallback(\n (event: MouseEvent<HTMLDivElement>) => {\n const target = event.target as HTMLElement;\n\n if (target?.tagName === 'IMG' && pictureViewer) {\n const arr = ref.current?.getElementsByTagName('img') || [];\n\n for (let i = 0, len = arr.length; i < len; i++) {\n if (arr[i] === target) {\n setPhotoIndex(i);\n setVisible(true);\n }\n }\n } else if (target.className.includes('toolbar-copy') && tools?.includes('copy')) {\n if (target.offsetParent && !target.offsetParent.hasAttribute('data-copy')) {\n setClipboard((target.offsetParent as HTMLElement).innerText, target.offsetParent);\n }\n }\n },\n [tools, pictureViewer]\n );\n\n const handleWheel = useCallback((event: WheelEvent<HTMLDivElement>) => {\n const offsetParent = (event.target as HTMLElement).offsetParent;\n\n if (!offsetParent || offsetParent.tagName !== 'PRE') {\n return;\n }\n const rows = offsetParent?.getElementsByClassName('line-numbers-rows');\n\n if (rows?.length) {\n const codeTag: HTMLElement = offsetParent.getElementsByTagName('code')[0];\n\n if (codeTag.scrollHeight - codeTag.offsetHeight && rows[0].scrollTop !== codeTag.scrollTop) {\n // 可滚动高度大于0\n rows[0].scrollTop = codeTag.scrollTop;\n }\n }\n }, []);\n const handleScroll = useCallback((e: Event) => {\n if (!anchors.current.length) return;\n const el = e.target as HTMLElement;\n const top = getScrollTop(el);\n\n let anchor: HTMLAnchorElement | null = null;\n\n anchors.current.forEach((a) => {\n if (top - a.top > -el.offsetHeight / 2) anchor = a.anchor;\n });\n\n if (anchor) {\n toggleAnchor(anchor);\n }\n }, []);\n\n useEffect(() => {\n getAnchorContainer()?.addEventListener('scroll', handleScroll);\n return () => {\n getAnchorContainer()?.removeEventListener('scroll', handleScroll);\n };\n }, [getAnchorContainer, handleScroll]);\n\n const cls = useMemo(() => ['markdown-box', className].filter(Boolean).join(' '), [className]);\n\n return (\n <Fragment>\n <div\n ref={ref}\n className={cls}\n style={style}\n dangerouslySetInnerHTML={{\n __html: htmlString,\n }}\n onClick={handleClick}\n onWheel={handleWheel}\n />\n {imgList.length ? (\n <PhotoSlider\n images={imgList}\n visible={visible}\n onClose={() => setVisible(false)}\n index={photoIndex}\n onIndexChange={setPhotoIndex}\n />\n ) : null}\n </Fragment>\n );\n};\n\nexport default React.memo(Markdown, isEqual);\n"],"names":["React","Fragment","useCallback","useEffect","useMemo","useRef","useState","getScrollTop","setClipboard","getMarkedImgList","markdownUtil","PhotoSlider","isEqual","toggleAnchor","anchor","offsetParent","querySelectorAll","forEach","a","classList","remove","parentElement","add","Markdown","className","style","text","pictureViewer","langLineNumber","tools","getAnchorContainer","window","ref","visible","setVisible","photoIndex","setPhotoIndex","htmlString","setHtmlString","imgList","setImgList","htmlStrRef","anchors","str","current","langToolbar","Object","assign","timer","setTimeout","Prism","highlightAll","clearTimeout","handleAnchor","e","preventDefault","stopPropagation","target","querySelector","decodeURIComponent","hash","scrollIntoView","behavior","block","_anchors","_el","push","top","offsetTop","onclick","handleClick","event","tagName","arr","getElementsByTagName","i","len","length","includes","hasAttribute","innerText","handleWheel","rows","getElementsByClassName","codeTag","scrollHeight","offsetHeight","scrollTop","handleScroll","el","addEventListener","removeEventListener","cls","filter","Boolean","join","div","dangerouslySetInnerHTML","__html","onClick","onWheel","images","onClose","index","onIndexChange","memo"],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import marked from 'marked-completed';
|
|
2
|
+
import type { DataType as PhotoViewDataType } from 'react-photo-view/dist/types';
|
|
3
|
+
/**
|
|
4
|
+
* Markdown to Html
|
|
5
|
+
* @param {string} text Markdown文本
|
|
6
|
+
* @param {MarkedOptions} option MarkedOptions
|
|
7
|
+
* @returns {string} Html文本
|
|
8
|
+
*/
|
|
9
|
+
export declare const markdownUtil: (text: string, option?: marked.MarkedOptions) => string;
|
|
10
|
+
/**
|
|
11
|
+
* 提取md图片src
|
|
12
|
+
* @param {string} text HTML string
|
|
13
|
+
* @returns {PhotoViewDataType[]} PhotoViewDataType
|
|
14
|
+
*/
|
|
15
|
+
export declare const getMarkedImgList: (text: string) => PhotoViewDataType[];
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import marked from"marked-completed";import{entityToString}from"../utils/document";import*as Prism from"./prism.js";marked.setOptions({highlight:function highlight(code,lang){var LANGUAGE_REGEX=/^diff-([\w-]+)/i;if(Prism.languages[lang]){return Prism.highlight(code,Prism.languages[lang],lang)}else if(LANGUAGE_REGEX.test(lang)){Prism.languages[lang]=Prism.languages.diff;return Prism.highlight(code,Prism.languages[lang],lang)}return Prism.highlight(code,Prism.languages.markup,"markup")},headerPrefix:"# ",langLineNumber:true,langToolbar:["copy"],breaks:true,pedantic:false,smartLists:true,smartypants:true,xhtml:true});export var markdownUtil=function(text){var option=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};return marked(text,option)};export var getMarkedImgList=function(text){if(!text)return[];var imageList=text.match(/role=('|")dialog('|") src=('|")(.*?) alt=('|")(.*?)('|")/g);var imageArr=[];if(imageList){for(var i=0,len=imageList.length;i<len;i++){var params=new URLSearchParams(entityToString(imageList[i].replace(/('|")/g,"").replace(/ src=/,"&src=").replace(/ alt=/,"&alt=")));imageArr.push({intro:params.get("alt")||""+i,src:params.get("src")||"",key:i})}}return imageArr}
|
|
2
|
+
//# sourceMappingURL=markdown-util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../components/markdown/markdown-util.ts"],"sourcesContent":["import marked from 'marked-completed';\nimport { entityToString } from '../utils/document';\nimport type { DataType as PhotoViewDataType } from 'react-photo-view/dist/types';\nimport * as Prism from './prism.js';\n\nmarked.setOptions({\n highlight: function (code: string, lang: string) {\n const LANGUAGE_REGEX = /^diff-([\\w-]+)/i;\n\n if (Prism.languages[lang]) {\n return Prism.highlight(code, Prism.languages[lang], lang);\n } else if (LANGUAGE_REGEX.test(lang)) {\n Prism.languages[lang] = Prism.languages.diff;\n return Prism.highlight(code, Prism.languages[lang], lang);\n }\n\n return Prism.highlight(code, Prism.languages.markup, 'markup');\n },\n headerPrefix: '# ',\n langLineNumber: true,\n langToolbar: ['copy'],\n breaks: true,\n pedantic: false,\n smartLists: true,\n smartypants: true,\n xhtml: true,\n});\n\n/**\n * Markdown to Html\n * @param {string} text Markdown文本\n * @param {MarkedOptions} option MarkedOptions\n * @returns {string} Html文本\n */\nexport const markdownUtil = (text: string, option: marked.MarkedOptions = {}): string => {\n return marked(text, option);\n};\n\n/**\n * 提取md图片src\n * @param {string} text HTML string\n * @returns {PhotoViewDataType[]} PhotoViewDataType\n */\nexport const getMarkedImgList = (text: string): PhotoViewDataType[] => {\n if (!text) return [];\n const imageList = text.match(/role=('|\")dialog('|\") src=('|\")(.*?) alt=('|\")(.*?)('|\")/g);\n const imageArr = [];\n\n if (imageList) {\n for (let i = 0, len = imageList.length; i < len; i++) {\n const params: URLSearchParams = new URLSearchParams(\n entityToString(\n imageList[i].replace(/('|\")/g, '').replace(/ src=/, '&src=').replace(/ alt=/, '&alt=')\n )\n );\n\n imageArr.push({\n intro: params.get('alt') || '' + i,\n src: params.get('src') || '',\n key: i,\n });\n }\n }\n return imageArr;\n};\n"],"names":["marked","entityToString","Prism","setOptions","highlight","code","lang","LANGUAGE_REGEX","languages","test","diff","markup","headerPrefix","langLineNumber","langToolbar","breaks","pedantic","smartLists","smartypants","xhtml","markdownUtil","text","option","getMarkedImgList","imageList","match","imageArr","i","len","length","params","URLSearchParams","replace","push","intro","get","src","key"],"mappings":"AAAA,OAAOA,MAAM,KAAM,kBAAkB,AAAC,AACtC,QAASC,cAAc,KAAQ,mBAAmB,AAAC,AAEnD,WAAYC,KAAK,KAAM,YAAY,AAAC,AAEpCF,CAAAA,MAAM,CAACG,UAAU,CAAC,CAChBC,SAAS,CAAE,SAAXA,SAAS,CAAYC,IAAY,CAAEC,IAAY,CAAE,CAC/C,IAAMC,cAAc,kBAAoB,AAAC,AAEzC,IAAIL,KAAK,CAACM,SAAS,CAACF,IAAI,CAAC,CAAE,CACzB,OAAOJ,KAAK,CAACE,SAAS,CAACC,IAAI,CAAEH,KAAK,CAACM,SAAS,CAACF,IAAI,CAAC,CAAEA,IAAI,CAAC,AAAC,CAC3D,KAAM,GAAIC,cAAc,CAACE,IAAI,CAACH,IAAI,CAAC,CAAE,CACpCJ,KAAK,CAACM,SAAS,CAACF,IAAI,CAAC,CAAGJ,KAAK,CAACM,SAAS,CAACE,IAAI,AAC5C,QAAOR,KAAK,CAACE,SAAS,CAACC,IAAI,CAAEH,KAAK,CAACM,SAAS,CAACF,IAAI,CAAC,CAAEA,IAAI,CAAC,AAAC,CAC3D,AAED,OAAOJ,KAAK,CAACE,SAAS,CAACC,IAAI,CAAEH,KAAK,CAACM,SAAS,CAACG,MAAM,CAAE,QAAQ,CAAC,AAAC,CAChE,CACDC,YAAY,CAAE,IAAI,CAClBC,cAAc,CAAE,IAAI,CACpBC,WAAW,CAAE,CAAC,MAAM,CAAC,CACrBC,MAAM,CAAE,IAAI,CACZC,QAAQ,CAAE,KAAK,CACfC,UAAU,CAAE,IAAI,CAChBC,WAAW,CAAE,IAAI,CACjBC,KAAK,CAAE,IAAI,CACZ,CAAC,AAQF,QAAO,IAAMC,YAAY,CAAG,SAACC,IAAY,CAAgD,KAA9CC,MAA4B,wDAAG,EAAE,AAC1E,QAAOtB,MAAM,CAACqB,IAAI,CAAEC,MAAM,CAAC,AAAC,CAC7B,AAAC,AAOF,QAAO,IAAMC,gBAAgB,CAAG,SAACF,IAAY,CAA0B,CACrE,GAAI,CAACA,IAAI,CAAE,MAAO,EAAE,AAAC,AACrB,KAAMG,SAAS,CAAGH,IAAI,CAACI,KAAK,6DAA6D,AAAC,AAC1F,KAAMC,QAAQ,CAAG,EAAE,AAAC,AAEpB,IAAIF,SAAS,CAAE,CACb,IAAK,IAAIG,CAAC,CAAG,CAAC,CAAEC,GAAG,CAAGJ,SAAS,CAACK,MAAM,CAAEF,CAAC,CAAGC,GAAG,CAAED,CAAC,EAAE,CAAE,CACpD,IAAMG,MAAM,CAAoB,IAAIC,eAAe,CACjD9B,cAAc,CACZuB,SAAS,CAACG,CAAC,CAAC,CAACK,OAAO,UAAW,EAAE,CAAC,CAACA,OAAO,SAAU,OAAO,CAAC,CAACA,OAAO,SAAU,OAAO,CAAC,CACvF,CACF,AAAC,AAEFN,CAAAA,QAAQ,CAACO,IAAI,CAAC,CACZC,KAAK,CAAEJ,MAAM,CAACK,GAAG,CAAC,KAAK,CAAC,EAAI,EAAE,CAAGR,CAAC,CAClCS,GAAG,CAAEN,MAAM,CAACK,GAAG,CAAC,KAAK,CAAC,EAAI,EAAE,CAC5BE,GAAG,CAAEV,CAAC,CACP,CAAC,CACH,CACF,AACD,OAAOD,QAAQ,AAAC,CACjB,AAAC"}
|