@cfxjs/sirius-next-common 0.2.5 → 0.2.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/chunk-FXGL77DI.js +26 -0
- package/dist/chunk-FXGL77DI.js.map +1 -0
- package/dist/components/AceEditor/index.d.ts +14 -0
- package/dist/components/AceEditor/index.js +151 -0
- package/dist/components/AceEditor/index.js.map +1 -0
- package/dist/components/Charts/StockChartTemplate.js +6 -6
- package/dist/components/DecimalsSelect/index.js +1 -1
- package/dist/components/DecimalsSelect/index.js.map +1 -1
- package/dist/components/InfoIconWithTooltip/index.js +4 -20
- package/dist/components/InfoIconWithTooltip/index.js.map +1 -1
- package/dist/components/SearchInput/index.d.ts +14 -0
- package/dist/components/SearchInput/index.js +159 -0
- package/dist/components/SearchInput/index.js.map +1 -0
- package/dist/uno.css +20 -1
- package/dist/utils/address.d.ts +1 -1
- package/dist/utils/hooks/useMultiAceSearch.d.ts +20 -0
- package/dist/utils/hooks/useMultiAceSearch.js +219 -0
- package/dist/utils/hooks/useMultiAceSearch.js.map +1 -0
- package/package.json +5 -2
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import {
|
|
2
|
+
InfoIcon
|
|
3
|
+
} from "./chunk-65X53DMW.js";
|
|
4
|
+
import {
|
|
5
|
+
Tooltip
|
|
6
|
+
} from "./chunk-JXKHN73X.js";
|
|
7
|
+
|
|
8
|
+
// src/components/InfoIconWithTooltip/index.tsx
|
|
9
|
+
import clsx from "clsx";
|
|
10
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
11
|
+
var InfoIconWithTooltip = ({
|
|
12
|
+
info,
|
|
13
|
+
size = 14,
|
|
14
|
+
children = null
|
|
15
|
+
}) => {
|
|
16
|
+
const title = typeof info === "string" ? info.split("\n").map((i) => /* @__PURE__ */ jsx("div", { children: i }, i)) : info;
|
|
17
|
+
return /* @__PURE__ */ jsxs("span", { className: clsx("inline-flex items-center"), children: [
|
|
18
|
+
children ? /* @__PURE__ */ jsx("span", { className: "mr-0.2857rem", children }) : null,
|
|
19
|
+
/* @__PURE__ */ jsx(Tooltip, { title, children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(InfoIcon, { size }) }) })
|
|
20
|
+
] });
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export {
|
|
24
|
+
InfoIconWithTooltip
|
|
25
|
+
};
|
|
26
|
+
//# sourceMappingURL=chunk-FXGL77DI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/InfoIconWithTooltip/index.tsx"],"sourcesContent":["import React from 'react';\nimport { InfoIcon } from './InfoIcon';\nimport { Tooltip } from '../Tooltip';\nimport clsx from 'clsx';\n\nexport const InfoIconWithTooltip = ({\n info,\n size = 14,\n children = null,\n}: {\n info: React.ReactNode;\n size?: number;\n children?: React.ReactNode;\n}) => {\n const title =\n typeof info === 'string'\n ? info.split('\\n').map(i => <div key={i}>{i}</div>)\n : info;\n return (\n <span className={clsx('inline-flex items-center')}>\n {children ? <span className=\"mr-0.2857rem\">{children}</span> : null}\n <Tooltip title={title}>\n <span>\n <InfoIcon size={size} />\n </span>\n </Tooltip>\n </span>\n );\n};\n"],"mappings":";;;;;;;;AAGA,OAAO,UAAU;AAaiB,cAG9B,YAH8B;AAX3B,IAAM,sBAAsB,CAAC;AAAA,EAClC;AAAA,EACA,OAAO;AAAA,EACP,WAAW;AACb,MAIM;AACJ,QAAM,QACJ,OAAO,SAAS,WACZ,KAAK,MAAM,IAAI,EAAE,IAAI,OAAK,oBAAC,SAAa,eAAJ,CAAM,CAAM,IAChD;AACN,SACE,qBAAC,UAAK,WAAW,KAAK,0BAA0B,GAC7C;AAAA,eAAW,oBAAC,UAAK,WAAU,gBAAgB,UAAS,IAAU;AAAA,IAC/D,oBAAC,WAAQ,OACP,8BAAC,UACC,8BAAC,YAAS,MAAY,GACxB,GACF;AAAA,KACF;AAEJ;","names":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import * as react_ace from 'react-ace';
|
|
2
|
+
import react_ace__default from 'react-ace';
|
|
3
|
+
import React__default from 'react';
|
|
4
|
+
|
|
5
|
+
declare const AceEditor: React__default.ForwardRefExoticComponent<react_ace.IAceEditorProps & {
|
|
6
|
+
onSearchTrigged?: (() => void) | undefined;
|
|
7
|
+
onReplaceTrigged?: (() => void) | undefined;
|
|
8
|
+
resize?: boolean | undefined;
|
|
9
|
+
title?: React__default.ReactNode;
|
|
10
|
+
supportFullScreen?: boolean | undefined;
|
|
11
|
+
headerClassName?: string | undefined;
|
|
12
|
+
} & React__default.RefAttributes<react_ace__default | null>>;
|
|
13
|
+
|
|
14
|
+
export { AceEditor };
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import {
|
|
2
|
+
Tooltip
|
|
3
|
+
} from "../../chunk-JXKHN73X.js";
|
|
4
|
+
import "../../chunk-BMO4IZHV.js";
|
|
5
|
+
import "../../chunk-LRCAKRPK.js";
|
|
6
|
+
import "../../chunk-H7V2CGOB.js";
|
|
7
|
+
import "../../chunk-7RH7LJYB.js";
|
|
8
|
+
import "../../chunk-Z6EYKGBH.js";
|
|
9
|
+
import "../../chunk-J2I22Q2M.js";
|
|
10
|
+
import "../../chunk-YEUH2K6Z.js";
|
|
11
|
+
import {
|
|
12
|
+
useI18n
|
|
13
|
+
} from "../../chunk-DQGLZCIG.js";
|
|
14
|
+
|
|
15
|
+
// src/components/AceEditor/index.tsx
|
|
16
|
+
import AceEditorComponent from "react-ace";
|
|
17
|
+
import {
|
|
18
|
+
forwardRef,
|
|
19
|
+
useEffect,
|
|
20
|
+
useMemo,
|
|
21
|
+
useRef,
|
|
22
|
+
useState
|
|
23
|
+
} from "react";
|
|
24
|
+
import { mergeRefs } from "react-merge-refs";
|
|
25
|
+
import clsx from "clsx";
|
|
26
|
+
import { Minimize, Maximize } from "lucide-react";
|
|
27
|
+
import { useMeasure } from "react-use";
|
|
28
|
+
import { useTranslation } from "react-i18next";
|
|
29
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
30
|
+
var AceEditor = forwardRef(
|
|
31
|
+
({
|
|
32
|
+
onSearchTrigged,
|
|
33
|
+
onReplaceTrigged,
|
|
34
|
+
theme = "tomorrow",
|
|
35
|
+
width = "100%",
|
|
36
|
+
fontSize = "1rem",
|
|
37
|
+
resize = true,
|
|
38
|
+
height: _height,
|
|
39
|
+
commands: _commands,
|
|
40
|
+
title,
|
|
41
|
+
headerClassName,
|
|
42
|
+
supportFullScreen = false,
|
|
43
|
+
maxLines: _maxLines,
|
|
44
|
+
className,
|
|
45
|
+
...props
|
|
46
|
+
}, ref) => {
|
|
47
|
+
const { translations } = useI18n();
|
|
48
|
+
const { t } = useTranslation();
|
|
49
|
+
const showHeader = supportFullScreen || !!title;
|
|
50
|
+
const fullScreenLockRef = useRef(false);
|
|
51
|
+
const [isFullScreen, setIsFullScreen] = useState(false);
|
|
52
|
+
const [height, setHeight] = useState(_height);
|
|
53
|
+
const innerEditorRef = useRef(null);
|
|
54
|
+
const [measureRef, bounds] = useMeasure();
|
|
55
|
+
useEffect(() => {
|
|
56
|
+
if (!resize || !bounds.height)
|
|
57
|
+
return;
|
|
58
|
+
if (!fullScreenLockRef.current) {
|
|
59
|
+
setIsFullScreen(false);
|
|
60
|
+
setHeight(`${bounds.height}px`);
|
|
61
|
+
} else {
|
|
62
|
+
fullScreenLockRef.current = false;
|
|
63
|
+
}
|
|
64
|
+
}, [bounds.height, resize]);
|
|
65
|
+
const commands = useMemo(() => {
|
|
66
|
+
return [
|
|
67
|
+
{
|
|
68
|
+
bindKey: { win: "Ctrl-F", mac: "Command-F" },
|
|
69
|
+
name: "Search",
|
|
70
|
+
exec: (e) => {
|
|
71
|
+
onSearchTrigged?.();
|
|
72
|
+
e.execCommand("find");
|
|
73
|
+
},
|
|
74
|
+
// 在 readonly 模式下也可用
|
|
75
|
+
readOnly: true
|
|
76
|
+
},
|
|
77
|
+
{
|
|
78
|
+
bindKey: { win: "Ctrl-H", mac: "Command-Option-F" },
|
|
79
|
+
name: "Search+Replace",
|
|
80
|
+
exec: (e) => {
|
|
81
|
+
onReplaceTrigged?.();
|
|
82
|
+
e.execCommand("replace");
|
|
83
|
+
},
|
|
84
|
+
// 在 readonly 模式下也可用
|
|
85
|
+
readOnly: true
|
|
86
|
+
},
|
|
87
|
+
..._commands || []
|
|
88
|
+
];
|
|
89
|
+
}, [_commands, onSearchTrigged, onReplaceTrigged]);
|
|
90
|
+
const maxLines = isFullScreen ? Infinity : _maxLines;
|
|
91
|
+
return /* @__PURE__ */ jsxs("div", { children: [
|
|
92
|
+
showHeader && /* @__PURE__ */ jsxs("div", { className: clsx("flex items-center mb-10px", headerClassName), children: [
|
|
93
|
+
/* @__PURE__ */ jsx("div", { className: "flex-1", children: title }),
|
|
94
|
+
/* @__PURE__ */ jsx("div", { className: "shrink-0 flex items-center gap-5px", children: supportFullScreen && /* @__PURE__ */ jsx(
|
|
95
|
+
Tooltip,
|
|
96
|
+
{
|
|
97
|
+
title: t(translations.toolTip.contract.toggleFullscreen),
|
|
98
|
+
children: /* @__PURE__ */ jsx(
|
|
99
|
+
"div",
|
|
100
|
+
{
|
|
101
|
+
className: "bg-#F8F9FB hover:bg-#E9ECEF flex-center w-30px h-30px rounded-4px cursor-pointer",
|
|
102
|
+
onClick: () => {
|
|
103
|
+
if (!isFullScreen) {
|
|
104
|
+
fullScreenLockRef.current = true;
|
|
105
|
+
setHeight(void 0);
|
|
106
|
+
setIsFullScreen(true);
|
|
107
|
+
} else {
|
|
108
|
+
setHeight(_height);
|
|
109
|
+
setIsFullScreen(false);
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
children: isFullScreen ? /* @__PURE__ */ jsx(Minimize, { className: "w-15px h-15px" }) : /* @__PURE__ */ jsx(Maximize, { className: "w-15px h-15px" })
|
|
113
|
+
}
|
|
114
|
+
)
|
|
115
|
+
}
|
|
116
|
+
) })
|
|
117
|
+
] }),
|
|
118
|
+
/* @__PURE__ */ jsx(
|
|
119
|
+
AceEditorComponent,
|
|
120
|
+
{
|
|
121
|
+
ref: mergeRefs([
|
|
122
|
+
resize ? (editor) => {
|
|
123
|
+
if (editor) {
|
|
124
|
+
measureRef(editor.editor.container);
|
|
125
|
+
}
|
|
126
|
+
} : void 0,
|
|
127
|
+
innerEditorRef,
|
|
128
|
+
ref
|
|
129
|
+
]),
|
|
130
|
+
theme,
|
|
131
|
+
className: clsx(
|
|
132
|
+
"bg-#F8F9FB",
|
|
133
|
+
isFullScreen && "min-h-5rem",
|
|
134
|
+
resize && "resize-y",
|
|
135
|
+
className
|
|
136
|
+
),
|
|
137
|
+
width,
|
|
138
|
+
height,
|
|
139
|
+
fontSize,
|
|
140
|
+
commands,
|
|
141
|
+
maxLines,
|
|
142
|
+
...props
|
|
143
|
+
}
|
|
144
|
+
)
|
|
145
|
+
] });
|
|
146
|
+
}
|
|
147
|
+
);
|
|
148
|
+
export {
|
|
149
|
+
AceEditor
|
|
150
|
+
};
|
|
151
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/AceEditor/index.tsx"],"sourcesContent":["import AceEditorComponent, { ICommand } from 'react-ace';\nimport React, {\n ComponentProps,\n forwardRef,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { mergeRefs } from 'react-merge-refs';\nimport clsx from 'clsx';\nimport { Minimize, Maximize } from 'lucide-react';\nimport { useMeasure } from 'react-use';\nimport { useI18n } from 'src/store';\nimport { useTranslation } from 'react-i18next';\nimport { Tooltip } from '../Tooltip';\n\nexport const AceEditor = forwardRef<\n AceEditorComponent | null,\n ComponentProps<typeof AceEditorComponent> & {\n onSearchTrigged?: () => void;\n onReplaceTrigged?: () => void;\n resize?: boolean;\n title?: React.ReactNode;\n supportFullScreen?: boolean;\n headerClassName?: string;\n }\n>(\n (\n {\n onSearchTrigged,\n onReplaceTrigged,\n theme = 'tomorrow',\n width = '100%',\n fontSize = '1rem',\n resize = true,\n height: _height,\n commands: _commands,\n title,\n headerClassName,\n supportFullScreen = false,\n maxLines: _maxLines,\n className,\n ...props\n },\n ref,\n ) => {\n const { translations } = useI18n();\n const { t } = useTranslation();\n const showHeader = supportFullScreen || !!title;\n const fullScreenLockRef = useRef(false);\n const [isFullScreen, setIsFullScreen] = useState(false);\n const [height, setHeight] = useState(_height);\n const innerEditorRef = useRef<AceEditorComponent>(null);\n const [measureRef, bounds] = useMeasure();\n\n // 当窗口大小改变时,自动退出全屏模式\n useEffect(() => {\n if (!resize || !bounds.height) return;\n // 通过 fullScreenLockRef 避免打开全屏模式时自动退出全屏\n if (!fullScreenLockRef.current) {\n setIsFullScreen(false);\n setHeight(`${bounds.height}px`);\n } else {\n fullScreenLockRef.current = false;\n }\n }, [bounds.height, resize]);\n\n const commands = useMemo(() => {\n return [\n {\n bindKey: { win: 'Ctrl-F', mac: 'Command-F' },\n name: 'Search',\n exec: e => {\n // 触发外部的搜索弹窗事件\n onSearchTrigged?.();\n // 触发当前编辑器的搜索事件\n e.execCommand('find');\n },\n // 在 readonly 模式下也可用\n readOnly: true,\n },\n {\n bindKey: { win: 'Ctrl-H', mac: 'Command-Option-F' },\n name: 'Search+Replace',\n exec: e => {\n // 触发外部的替换弹窗事件\n onReplaceTrigged?.();\n // 触发当前编辑器的替换事件\n e.execCommand('replace');\n },\n // 在 readonly 模式下也可用\n readOnly: true,\n },\n ...(_commands || []),\n ] as ICommand[];\n }, [_commands, onSearchTrigged, onReplaceTrigged]);\n\n const maxLines = isFullScreen ? Infinity : _maxLines;\n\n return (\n <div>\n {showHeader && (\n <div className={clsx('flex items-center mb-10px', headerClassName)}>\n <div className=\"flex-1\">{title}</div>\n <div className=\"shrink-0 flex items-center gap-5px\">\n {supportFullScreen && (\n <Tooltip\n title={t(translations.toolTip.contract.toggleFullscreen)}\n >\n <div\n className=\"bg-#F8F9FB hover:bg-#E9ECEF flex-center w-30px h-30px rounded-4px cursor-pointer\"\n onClick={() => {\n if (!isFullScreen) {\n fullScreenLockRef.current = true;\n setHeight(undefined);\n setIsFullScreen(true);\n } else {\n setHeight(_height);\n setIsFullScreen(false);\n }\n }}\n >\n {isFullScreen ? (\n <Minimize className=\"w-15px h-15px\" />\n ) : (\n <Maximize className=\"w-15px h-15px\" />\n )}\n </div>\n </Tooltip>\n )}\n </div>\n </div>\n )}\n <AceEditorComponent\n ref={mergeRefs([\n resize\n ? editor => {\n if (editor) {\n measureRef(editor.editor.container);\n }\n }\n : undefined,\n innerEditorRef,\n ref,\n ])}\n theme={theme}\n className={clsx(\n 'bg-#F8F9FB',\n isFullScreen && 'min-h-5rem',\n resize && 'resize-y',\n className,\n )}\n width={width}\n height={height}\n fontSize={fontSize}\n commands={commands}\n maxLines={maxLines}\n {...props}\n />\n </div>\n );\n },\n);\n"],"mappings":"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","names":[]}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import {
|
|
2
2
|
StockTitle_default
|
|
3
3
|
} from "../../chunk-PTT2OZV4.js";
|
|
4
|
-
import {
|
|
5
|
-
BreadcrumbNav_default
|
|
6
|
-
} from "../../chunk-V3GMPX56.js";
|
|
7
|
-
import {
|
|
8
|
-
ChartOptions_default
|
|
9
|
-
} from "../../chunk-XMBEB34D.js";
|
|
10
4
|
import {
|
|
11
5
|
useHighCharts
|
|
12
6
|
} from "../../chunk-HQA7I4SW.js";
|
|
13
7
|
import "../../chunk-PHT26KYE.js";
|
|
8
|
+
import {
|
|
9
|
+
BreadcrumbNav_default
|
|
10
|
+
} from "../../chunk-V3GMPX56.js";
|
|
14
11
|
import "../../chunk-2Y57U43P.js";
|
|
15
12
|
import "../../chunk-TGK5LP2H.js";
|
|
13
|
+
import {
|
|
14
|
+
ChartOptions_default
|
|
15
|
+
} from "../../chunk-XMBEB34D.js";
|
|
16
16
|
import {
|
|
17
17
|
ConstructorType,
|
|
18
18
|
defaultIntervalType,
|
|
@@ -38,7 +38,7 @@ var CustomOption = ({ onChange, mode, ...props }) => {
|
|
|
38
38
|
"input",
|
|
39
39
|
{
|
|
40
40
|
className: clsx(
|
|
41
|
-
"w-0 flex-1 outline-none rounded-3px focus:border-#1E3DE4"
|
|
41
|
+
"w-0 flex-1 outline-none rounded-3px border-1px border-solid focus:border-#1E3DE4"
|
|
42
42
|
),
|
|
43
43
|
onChange: (e) => onChange(e.target.value),
|
|
44
44
|
...props
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/DecimalsSelect/index.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport clsx from 'clsx';\nimport { Popover } from '../Popover';\nimport { Check, ChevronUp } from 'lucide-react';\n\nconst Value: React.FC<{\n value?: number;\n mode: 'decimals' | 'pow';\n}> = ({ mode, value }) => {\n if (mode === 'pow')\n return (\n <span>\n 10 <sup>{value}</sup>\n </span>\n );\n return value;\n};\n\nconst CustomOption: React.FC<{\n onChange: (value: string) => void;\n value?: number | string;\n mode: 'decimals' | 'pow';\n}> = ({ onChange, mode, ...props }) => {\n return (\n <div className=\"w-full flex items-center gap-10px\">\n {mode === 'pow' && '10^'}\n <input\n style={{ visibility: 'hidden' }}\n className=\"w-0 h-0 absolute\"\n autoFocus\n />\n <input\n className={clsx(\n 'w-0 flex-1 outline-none rounded-3px focus:border-#1E3DE4',\n )}\n onChange={e => onChange(e.target.value)}\n {...props}\n />\n </div>\n );\n};\n\nconst defaultOptions = [18, 8, 6];\n\ntype DecimalsSelectProps = {\n value?: number;\n onChange: (value?: number) => void;\n max?: number;\n placeholder?: string;\n className?: string;\n optionsClassName?: string;\n popoverClassName?: string;\n mode?: 'decimals' | 'pow';\n options?: number[];\n};\n\nexport const DecimalsSelect = ({\n max,\n onChange,\n optionsClassName,\n popoverClassName,\n className,\n placeholder,\n value,\n options = defaultOptions,\n mode = 'decimals',\n}: DecimalsSelectProps) => {\n const [open, setOpen] = useState(false);\n const [selected, setSelected] = useState(() =>\n options.find(option => option === value),\n );\n const handleDecimalsChange = (value: string) => {\n if (!value) {\n onChange(undefined);\n return;\n }\n let num = Number(value);\n if (value.includes('-') || value.includes('.') || isNaN(num)) return;\n if (max && num > max) num = max;\n if (num < 0) num = 0;\n setSelected(undefined);\n onChange(num);\n };\n return (\n <Popover\n content={\n <div className=\"flex flex-col gap-8px w-76px\">\n {options.map(option => (\n <div\n className={clsx(\n 'cursor-pointer bg-[#fff] hover:bg-[#f1f3f5] w-full flex items-center justify-between',\n optionsClassName,\n )}\n key={option}\n onClick={() => {\n setSelected(option);\n onChange(option);\n setOpen(false);\n }}\n >\n <Value mode={mode} value={option} />\n {option === selected && <Check className=\"w-16px h-16px\" />}\n </div>\n ))}\n <div className={clsx('bg-[#fff] w-full', optionsClassName)}>\n <CustomOption\n onChange={handleDecimalsChange}\n value={selected === undefined && value !== undefined ? value : ''}\n mode={mode}\n />\n </div>\n </div>\n }\n containerClassName={popoverClassName}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n open={open}\n positioning={{\n placement: 'auto',\n }}\n >\n <div\n className={clsx(\n 'inline-flex justify-between items-center px-8px h-24px w-100px cursor-pointer',\n 'border-1 border-solid border-#E8E9EA rounded-2px',\n className,\n )}\n >\n <span>\n {value === undefined ? (\n placeholder\n ) : (\n <Value mode={mode} value={value} />\n )}\n </span>\n <ChevronUp className={clsx('w-12px h-12px', !open && 'rotate-180')} />\n </div>\n </Popover>\n );\n};\n"],"mappings":"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","names":["value"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/DecimalsSelect/index.tsx"],"sourcesContent":["import React, { useState } from 'react';\nimport clsx from 'clsx';\nimport { Popover } from '../Popover';\nimport { Check, ChevronUp } from 'lucide-react';\n\nconst Value: React.FC<{\n value?: number;\n mode: 'decimals' | 'pow';\n}> = ({ mode, value }) => {\n if (mode === 'pow')\n return (\n <span>\n 10 <sup>{value}</sup>\n </span>\n );\n return value;\n};\n\nconst CustomOption: React.FC<{\n onChange: (value: string) => void;\n value?: number | string;\n mode: 'decimals' | 'pow';\n}> = ({ onChange, mode, ...props }) => {\n return (\n <div className=\"w-full flex items-center gap-10px\">\n {mode === 'pow' && '10^'}\n <input\n style={{ visibility: 'hidden' }}\n className=\"w-0 h-0 absolute\"\n autoFocus\n />\n <input\n className={clsx(\n 'w-0 flex-1 outline-none rounded-3px border-1px border-solid focus:border-#1E3DE4',\n )}\n onChange={e => onChange(e.target.value)}\n {...props}\n />\n </div>\n );\n};\n\nconst defaultOptions = [18, 8, 6];\n\ntype DecimalsSelectProps = {\n value?: number;\n onChange: (value?: number) => void;\n max?: number;\n placeholder?: string;\n className?: string;\n optionsClassName?: string;\n popoverClassName?: string;\n mode?: 'decimals' | 'pow';\n options?: number[];\n};\n\nexport const DecimalsSelect = ({\n max,\n onChange,\n optionsClassName,\n popoverClassName,\n className,\n placeholder,\n value,\n options = defaultOptions,\n mode = 'decimals',\n}: DecimalsSelectProps) => {\n const [open, setOpen] = useState(false);\n const [selected, setSelected] = useState(() =>\n options.find(option => option === value),\n );\n const handleDecimalsChange = (value: string) => {\n if (!value) {\n onChange(undefined);\n return;\n }\n let num = Number(value);\n if (value.includes('-') || value.includes('.') || isNaN(num)) return;\n if (max && num > max) num = max;\n if (num < 0) num = 0;\n setSelected(undefined);\n onChange(num);\n };\n return (\n <Popover\n content={\n <div className=\"flex flex-col gap-8px w-76px\">\n {options.map(option => (\n <div\n className={clsx(\n 'cursor-pointer bg-[#fff] hover:bg-[#f1f3f5] w-full flex items-center justify-between',\n optionsClassName,\n )}\n key={option}\n onClick={() => {\n setSelected(option);\n onChange(option);\n setOpen(false);\n }}\n >\n <Value mode={mode} value={option} />\n {option === selected && <Check className=\"w-16px h-16px\" />}\n </div>\n ))}\n <div className={clsx('bg-[#fff] w-full', optionsClassName)}>\n <CustomOption\n onChange={handleDecimalsChange}\n value={selected === undefined && value !== undefined ? value : ''}\n mode={mode}\n />\n </div>\n </div>\n }\n containerClassName={popoverClassName}\n onOpen={() => setOpen(true)}\n onClose={() => setOpen(false)}\n open={open}\n positioning={{\n placement: 'auto',\n }}\n >\n <div\n className={clsx(\n 'inline-flex justify-between items-center px-8px h-24px w-100px cursor-pointer',\n 'border-1 border-solid border-#E8E9EA rounded-2px',\n className,\n )}\n >\n <span>\n {value === undefined ? (\n placeholder\n ) : (\n <Value mode={mode} value={value} />\n )}\n </span>\n <ChevronUp className={clsx('w-12px h-12px', !open && 'rotate-180')} />\n </div>\n </Popover>\n );\n};\n"],"mappings":"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","names":["value"]}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
} from "../../chunk-
|
|
4
|
-
import
|
|
5
|
-
|
|
6
|
-
} from "../../chunk-JXKHN73X.js";
|
|
2
|
+
InfoIconWithTooltip
|
|
3
|
+
} from "../../chunk-FXGL77DI.js";
|
|
4
|
+
import "../../chunk-65X53DMW.js";
|
|
5
|
+
import "../../chunk-JXKHN73X.js";
|
|
7
6
|
import "../../chunk-BMO4IZHV.js";
|
|
8
7
|
import "../../chunk-LRCAKRPK.js";
|
|
9
8
|
import "../../chunk-H7V2CGOB.js";
|
|
@@ -12,21 +11,6 @@ import "../../chunk-Z6EYKGBH.js";
|
|
|
12
11
|
import "../../chunk-J2I22Q2M.js";
|
|
13
12
|
import "../../chunk-YEUH2K6Z.js";
|
|
14
13
|
import "../../chunk-DQGLZCIG.js";
|
|
15
|
-
|
|
16
|
-
// src/components/InfoIconWithTooltip/index.tsx
|
|
17
|
-
import clsx from "clsx";
|
|
18
|
-
import { jsx, jsxs } from "react/jsx-runtime";
|
|
19
|
-
var InfoIconWithTooltip = ({
|
|
20
|
-
info,
|
|
21
|
-
size = 14,
|
|
22
|
-
children = null
|
|
23
|
-
}) => {
|
|
24
|
-
const title = typeof info === "string" ? info.split("\n").map((i) => /* @__PURE__ */ jsx("div", { children: i }, i)) : info;
|
|
25
|
-
return /* @__PURE__ */ jsxs("span", { className: clsx("inline-flex items-center"), children: [
|
|
26
|
-
children ? /* @__PURE__ */ jsx("span", { className: "mr-0.2857rem", children }) : null,
|
|
27
|
-
/* @__PURE__ */ jsx(Tooltip, { title, children: /* @__PURE__ */ jsx("span", { children: /* @__PURE__ */ jsx(InfoIcon, { size }) }) })
|
|
28
|
-
] });
|
|
29
|
-
};
|
|
30
14
|
export {
|
|
31
15
|
InfoIconWithTooltip
|
|
32
16
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[
|
|
1
|
+
{"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { ComponentProps } from 'react';
|
|
2
|
+
|
|
3
|
+
declare const SearchInput: React.FC<ComponentProps<'input'> & {
|
|
4
|
+
findNext: () => void;
|
|
5
|
+
findPrevious: () => void;
|
|
6
|
+
current: number | null;
|
|
7
|
+
total: number | null;
|
|
8
|
+
wrapperClassName?: string;
|
|
9
|
+
searchTips?: string;
|
|
10
|
+
inSearch?: boolean;
|
|
11
|
+
exit?: () => void;
|
|
12
|
+
}>;
|
|
13
|
+
|
|
14
|
+
export { SearchInput };
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
import {
|
|
2
|
+
InfoIconWithTooltip
|
|
3
|
+
} from "../../chunk-FXGL77DI.js";
|
|
4
|
+
import "../../chunk-65X53DMW.js";
|
|
5
|
+
import "../../chunk-JXKHN73X.js";
|
|
6
|
+
import "../../chunk-BMO4IZHV.js";
|
|
7
|
+
import "../../chunk-LRCAKRPK.js";
|
|
8
|
+
import "../../chunk-H7V2CGOB.js";
|
|
9
|
+
import "../../chunk-7RH7LJYB.js";
|
|
10
|
+
import "../../chunk-Z6EYKGBH.js";
|
|
11
|
+
import "../../chunk-J2I22Q2M.js";
|
|
12
|
+
import "../../chunk-YEUH2K6Z.js";
|
|
13
|
+
import "../../chunk-DQGLZCIG.js";
|
|
14
|
+
|
|
15
|
+
// src/components/SearchInput/index.tsx
|
|
16
|
+
import clsx from "clsx";
|
|
17
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
18
|
+
var Arrow = (props) => /* @__PURE__ */ jsx(
|
|
19
|
+
"svg",
|
|
20
|
+
{
|
|
21
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
22
|
+
width: "10",
|
|
23
|
+
height: "6",
|
|
24
|
+
viewBox: "0 0 10 6",
|
|
25
|
+
fill: "none",
|
|
26
|
+
...props,
|
|
27
|
+
children: /* @__PURE__ */ jsx(
|
|
28
|
+
"path",
|
|
29
|
+
{
|
|
30
|
+
d: "M0.75 0.75L4.78922 4.75L8.82843 0.75",
|
|
31
|
+
stroke: "#74798C",
|
|
32
|
+
strokeWidth: "1.5",
|
|
33
|
+
strokeLinecap: "round",
|
|
34
|
+
strokeLinejoin: "round"
|
|
35
|
+
}
|
|
36
|
+
)
|
|
37
|
+
}
|
|
38
|
+
);
|
|
39
|
+
var Close = (props) => /* @__PURE__ */ jsxs(
|
|
40
|
+
"svg",
|
|
41
|
+
{
|
|
42
|
+
xmlns: "http://www.w3.org/2000/svg",
|
|
43
|
+
width: "10",
|
|
44
|
+
height: "10",
|
|
45
|
+
viewBox: "0 0 10 10",
|
|
46
|
+
fill: "none",
|
|
47
|
+
children: [
|
|
48
|
+
/* @__PURE__ */ jsx(
|
|
49
|
+
"path",
|
|
50
|
+
{
|
|
51
|
+
d: "M7.91671 2.08331L2.08337 7.91665",
|
|
52
|
+
stroke: "#74798C",
|
|
53
|
+
strokeWidth: "2",
|
|
54
|
+
strokeLinecap: "round",
|
|
55
|
+
strokeLinejoin: "round"
|
|
56
|
+
}
|
|
57
|
+
),
|
|
58
|
+
/* @__PURE__ */ jsx(
|
|
59
|
+
"path",
|
|
60
|
+
{
|
|
61
|
+
d: "M2.08337 2.08331L7.91671 7.91665",
|
|
62
|
+
stroke: "#74798C",
|
|
63
|
+
strokeWidth: "2",
|
|
64
|
+
strokeLinecap: "round",
|
|
65
|
+
strokeLinejoin: "round"
|
|
66
|
+
}
|
|
67
|
+
)
|
|
68
|
+
]
|
|
69
|
+
}
|
|
70
|
+
);
|
|
71
|
+
var SearchInput = ({
|
|
72
|
+
current,
|
|
73
|
+
total,
|
|
74
|
+
className,
|
|
75
|
+
wrapperClassName,
|
|
76
|
+
inSearch,
|
|
77
|
+
searchTips,
|
|
78
|
+
findNext,
|
|
79
|
+
findPrevious,
|
|
80
|
+
exit,
|
|
81
|
+
onKeyDown,
|
|
82
|
+
...props
|
|
83
|
+
}) => {
|
|
84
|
+
return /* @__PURE__ */ jsxs("div", { className: clsx("flex items-center w-fit", wrapperClassName), children: [
|
|
85
|
+
!inSearch && searchTips && /* @__PURE__ */ jsx("div", { className: "flex-center h-full mr-3px shrink-0", children: /* @__PURE__ */ jsx(InfoIconWithTooltip, { info: searchTips, size: 18 }) }),
|
|
86
|
+
/* @__PURE__ */ jsxs(
|
|
87
|
+
"div",
|
|
88
|
+
{
|
|
89
|
+
className: clsx(
|
|
90
|
+
"flex items-center flex-1 bg-#fff border-#BDBDBD border-1px border-solid rounded-4px"
|
|
91
|
+
),
|
|
92
|
+
children: [
|
|
93
|
+
/* @__PURE__ */ jsxs(
|
|
94
|
+
"div",
|
|
95
|
+
{
|
|
96
|
+
className: clsx(
|
|
97
|
+
"px-5px w-160px h-26px flex items-center gap-5px",
|
|
98
|
+
className
|
|
99
|
+
),
|
|
100
|
+
children: [
|
|
101
|
+
/* @__PURE__ */ jsx(
|
|
102
|
+
"input",
|
|
103
|
+
{
|
|
104
|
+
onKeyDown: (e) => {
|
|
105
|
+
if (e.key === "Enter" || e.key === "ArrowDown") {
|
|
106
|
+
findNext();
|
|
107
|
+
e.preventDefault();
|
|
108
|
+
}
|
|
109
|
+
if (e.key === "ArrowUp") {
|
|
110
|
+
findPrevious();
|
|
111
|
+
e.preventDefault();
|
|
112
|
+
}
|
|
113
|
+
onKeyDown?.(e);
|
|
114
|
+
},
|
|
115
|
+
className: "outline-none border-none flex-1 w-0",
|
|
116
|
+
...props
|
|
117
|
+
}
|
|
118
|
+
),
|
|
119
|
+
!!current && !!total && /* @__PURE__ */ jsxs("div", { className: "shrink-0", children: [
|
|
120
|
+
current,
|
|
121
|
+
"/",
|
|
122
|
+
total
|
|
123
|
+
] })
|
|
124
|
+
]
|
|
125
|
+
}
|
|
126
|
+
),
|
|
127
|
+
/* @__PURE__ */ jsx(
|
|
128
|
+
"div",
|
|
129
|
+
{
|
|
130
|
+
onClick: findNext,
|
|
131
|
+
className: "border-l-#BDBDBD border-l-1px border-l-solid w-26px h-26px flex-center cursor-pointer",
|
|
132
|
+
children: /* @__PURE__ */ jsx(Arrow, {})
|
|
133
|
+
}
|
|
134
|
+
),
|
|
135
|
+
/* @__PURE__ */ jsx(
|
|
136
|
+
"div",
|
|
137
|
+
{
|
|
138
|
+
onClick: findPrevious,
|
|
139
|
+
className: "border-l-#BDBDBD border-l-1px border-l-solid w-26px h-26px flex-center cursor-pointer",
|
|
140
|
+
children: /* @__PURE__ */ jsx(Arrow, { className: "rotate-180" })
|
|
141
|
+
}
|
|
142
|
+
),
|
|
143
|
+
inSearch && /* @__PURE__ */ jsx(
|
|
144
|
+
"div",
|
|
145
|
+
{
|
|
146
|
+
onClick: exit,
|
|
147
|
+
className: "border-l-#BDBDBD border-l-1px border-l-solid w-26px h-26px flex-center cursor-pointer",
|
|
148
|
+
children: /* @__PURE__ */ jsx(Close, {})
|
|
149
|
+
}
|
|
150
|
+
)
|
|
151
|
+
]
|
|
152
|
+
}
|
|
153
|
+
)
|
|
154
|
+
] });
|
|
155
|
+
};
|
|
156
|
+
export {
|
|
157
|
+
SearchInput
|
|
158
|
+
};
|
|
159
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/SearchInput/index.tsx"],"sourcesContent":["import { ComponentProps } from 'react';\nimport { InfoIconWithTooltip } from '../InfoIconWithTooltip';\nimport clsx from 'clsx';\n\nconst Arrow: React.FC<React.SVGProps<SVGSVGElement>> = props => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"10\"\n height=\"6\"\n viewBox=\"0 0 10 6\"\n fill=\"none\"\n {...props}\n >\n <path\n d=\"M0.75 0.75L4.78922 4.75L8.82843 0.75\"\n stroke=\"#74798C\"\n strokeWidth=\"1.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nconst Close: React.FC<React.SVGProps<SVGSVGElement>> = props => (\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"10\"\n height=\"10\"\n viewBox=\"0 0 10 10\"\n fill=\"none\"\n >\n <path\n d=\"M7.91671 2.08331L2.08337 7.91665\"\n stroke=\"#74798C\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n <path\n d=\"M2.08337 2.08331L7.91671 7.91665\"\n stroke=\"#74798C\"\n strokeWidth=\"2\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n />\n </svg>\n);\n\nexport const SearchInput: React.FC<\n ComponentProps<'input'> & {\n findNext: () => void;\n findPrevious: () => void;\n current: number | null;\n total: number | null;\n wrapperClassName?: string;\n searchTips?: string;\n inSearch?: boolean;\n exit?: () => void;\n }\n> = ({\n current,\n total,\n className,\n wrapperClassName,\n inSearch,\n searchTips,\n findNext,\n findPrevious,\n exit,\n onKeyDown,\n ...props\n}) => {\n return (\n <div className={clsx('flex items-center w-fit', wrapperClassName)}>\n {!inSearch && searchTips && (\n <div className=\"flex-center h-full mr-3px shrink-0\">\n <InfoIconWithTooltip info={searchTips} size={18} />\n </div>\n )}\n <div\n className={clsx(\n 'flex items-center flex-1 bg-#fff border-#BDBDBD border-1px border-solid rounded-4px',\n )}\n >\n <div\n className={clsx(\n 'px-5px w-160px h-26px flex items-center gap-5px',\n className,\n )}\n >\n <input\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === 'ArrowDown') {\n findNext();\n e.preventDefault();\n }\n if (e.key === 'ArrowUp') {\n findPrevious();\n e.preventDefault();\n }\n onKeyDown?.(e);\n }}\n className=\"outline-none border-none flex-1 w-0\"\n {...props}\n />\n {!!current && !!total && (\n <div className=\"shrink-0\">\n {current}/{total}\n </div>\n )}\n </div>\n <div\n onClick={findNext}\n className=\"border-l-#BDBDBD border-l-1px border-l-solid w-26px h-26px flex-center cursor-pointer\"\n >\n <Arrow />\n </div>\n <div\n onClick={findPrevious}\n className=\"border-l-#BDBDBD border-l-1px border-l-solid w-26px h-26px flex-center cursor-pointer\"\n >\n <Arrow className=\"rotate-180\" />\n </div>\n {inSearch && (\n <div\n onClick={exit}\n className=\"border-l-#BDBDBD border-l-1px border-l-solid w-26px h-26px flex-center cursor-pointer\"\n >\n <Close />\n </div>\n )}\n </div>\n </div>\n );\n};\n"],"mappings":";;;;;;;;;;;;;;;AAEA,OAAO,UAAU;AAWb,cAWF,YAXE;AATJ,IAAM,QAAiD,WACrD;AAAA,EAAC;AAAA;AAAA,IACC,OAAM;AAAA,IACN,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IACJ,GAAG;AAAA,IAEJ;AAAA,MAAC;AAAA;AAAA,QACC,GAAE;AAAA,QACF,QAAO;AAAA,QACP,aAAY;AAAA,QACZ,eAAc;AAAA,QACd,gBAAe;AAAA;AAAA,IACjB;AAAA;AACF;AAGF,IAAM,QAAiD,WACrD;AAAA,EAAC;AAAA;AAAA,IACC,OAAM;AAAA,IACN,OAAM;AAAA,IACN,QAAO;AAAA,IACP,SAAQ;AAAA,IACR,MAAK;AAAA,IAEL;AAAA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,QAAO;AAAA,UACP,aAAY;AAAA,UACZ,eAAc;AAAA,UACd,gBAAe;AAAA;AAAA,MACjB;AAAA,MACA;AAAA,QAAC;AAAA;AAAA,UACC,GAAE;AAAA,UACF,QAAO;AAAA,UACP,aAAY;AAAA,UACZ,eAAc;AAAA,UACd,gBAAe;AAAA;AAAA,MACjB;AAAA;AAAA;AACF;AAGK,IAAM,cAWT,CAAC;AAAA,EACH;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA,GAAG;AACL,MAAM;AACJ,SACE,qBAAC,SAAI,WAAW,KAAK,2BAA2B,gBAAgB,GAC7D;AAAA,KAAC,YAAY,cACZ,oBAAC,SAAI,WAAU,sCACb,8BAAC,uBAAoB,MAAM,YAAY,MAAM,IAAI,GACnD;AAAA,IAEF;AAAA,MAAC;AAAA;AAAA,QACC,WAAW;AAAA,UACT;AAAA,QACF;AAAA,QAEA;AAAA;AAAA,YAAC;AAAA;AAAA,cACC,WAAW;AAAA,gBACT;AAAA,gBACA;AAAA,cACF;AAAA,cAEA;AAAA;AAAA,kBAAC;AAAA;AAAA,oBACC,WAAW,OAAK;AACd,0BAAI,EAAE,QAAQ,WAAW,EAAE,QAAQ,aAAa;AAC9C,iCAAS;AACT,0BAAE,eAAe;AAAA,sBACnB;AACA,0BAAI,EAAE,QAAQ,WAAW;AACvB,qCAAa;AACb,0BAAE,eAAe;AAAA,sBACnB;AACA,kCAAY,CAAC;AAAA,oBACf;AAAA,oBACA,WAAU;AAAA,oBACT,GAAG;AAAA;AAAA,gBACN;AAAA,gBACC,CAAC,CAAC,WAAW,CAAC,CAAC,SACd,qBAAC,SAAI,WAAU,YACZ;AAAA;AAAA,kBAAQ;AAAA,kBAAE;AAAA,mBACb;AAAA;AAAA;AAAA,UAEJ;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,WAAU;AAAA,cAEV,8BAAC,SAAM;AAAA;AAAA,UACT;AAAA,UACA;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,WAAU;AAAA,cAEV,8BAAC,SAAM,WAAU,cAAa;AAAA;AAAA,UAChC;AAAA,UACC,YACC;AAAA,YAAC;AAAA;AAAA,cACC,SAAS;AAAA,cACT,WAAU;AAAA,cAEV,8BAAC,SAAM;AAAA;AAAA,UACT;AAAA;AAAA;AAAA,IAEJ;AAAA,KACF;AAEJ;","names":[]}
|
package/dist/uno.css
CHANGED
|
@@ -69,6 +69,7 @@
|
|
|
69
69
|
.mb-\[5px\]{margin-bottom:5px;}
|
|
70
70
|
.mb-0\.57rem{margin-bottom:0.57rem;}
|
|
71
71
|
.mb-0\.8571rem{margin-bottom:0.8571rem;}
|
|
72
|
+
.mb-10px{margin-bottom:10px;}
|
|
72
73
|
.me{margin-inline-end:1rem;}
|
|
73
74
|
.ml-\[3px\]{margin-left:3px;}
|
|
74
75
|
.ml-0\.5714rem{margin-left:0.5714rem;}
|
|
@@ -81,6 +82,7 @@
|
|
|
81
82
|
.mr-0\.2857rem{margin-right:0.2857rem;}
|
|
82
83
|
.mr-10px{margin-right:10px;}
|
|
83
84
|
.mr-2\.93rem{margin-right:2.93rem;}
|
|
85
|
+
.mr-3px{margin-right:3px;}
|
|
84
86
|
.mr-4px{margin-right:4px;}
|
|
85
87
|
.mt-\[-0\.2857rem\]{margin-top:-0.2857rem;}
|
|
86
88
|
.mt-\[-10px\]{margin-top:-10px;}
|
|
@@ -116,6 +118,7 @@
|
|
|
116
118
|
.h-10{height:2.5rem;}
|
|
117
119
|
.h-12{height:3rem;}
|
|
118
120
|
.h-12px{height:12px;}
|
|
121
|
+
.h-15px{height:15px;}
|
|
119
122
|
.h-1em{height:1em;}
|
|
120
123
|
.h-1px,
|
|
121
124
|
.h-px{height:1px;}
|
|
@@ -123,6 +126,7 @@
|
|
|
123
126
|
.h-2\.2857rem{height:2.2857rem;}
|
|
124
127
|
.h-20px{height:20px;}
|
|
125
128
|
.h-24px{height:24px;}
|
|
129
|
+
.h-26px{height:26px;}
|
|
126
130
|
.h-3{height:0.75rem;}
|
|
127
131
|
.h-30px{height:30px;}
|
|
128
132
|
.h-32px{height:32px;}
|
|
@@ -147,6 +151,7 @@
|
|
|
147
151
|
.min-h-16\.4286rem{min-height:16.4286rem;}
|
|
148
152
|
.min-h-3\.2857rem{min-height:3.2857rem;}
|
|
149
153
|
.min-h-32px{min-height:32px;}
|
|
154
|
+
.min-h-5rem{min-height:5rem;}
|
|
150
155
|
.min-w-\[8rem\]{min-width:8rem;}
|
|
151
156
|
.min-w-\[var\(--radix-select-trigger-width\)\]{min-width:var(--radix-select-trigger-width);}
|
|
152
157
|
.min-w-124px{min-width:124px;}
|
|
@@ -169,8 +174,12 @@
|
|
|
169
174
|
.w-100vw{width:100vw;}
|
|
170
175
|
.w-10rem{width:10rem;}
|
|
171
176
|
.w-12px{width:12px;}
|
|
177
|
+
.w-15px{width:15px;}
|
|
178
|
+
.w-160px{width:160px;}
|
|
172
179
|
.w-1em{width:1em;}
|
|
173
180
|
.w-20px{width:20px;}
|
|
181
|
+
.w-26px{width:26px;}
|
|
182
|
+
.w-30px{width:30px;}
|
|
174
183
|
.w-4{width:1rem;}
|
|
175
184
|
.w-48\%{width:48%;}
|
|
176
185
|
.w-48px{width:48px;}
|
|
@@ -231,6 +240,8 @@
|
|
|
231
240
|
.disabled\:cursor-not-allowed:disabled{cursor:not-allowed;}
|
|
232
241
|
.select-text{-webkit-user-select:text;user-select:text;}
|
|
233
242
|
.select-none{-webkit-user-select:none;user-select:none;}
|
|
243
|
+
.resize-y{resize:vertical;}
|
|
244
|
+
.resize{resize:both;}
|
|
234
245
|
.content-center{align-content:center;}
|
|
235
246
|
.items-start{align-items:flex-start;}
|
|
236
247
|
.items-center{align-items:center;}
|
|
@@ -242,7 +253,8 @@
|
|
|
242
253
|
.gap-\[16px\]{gap:16px;}
|
|
243
254
|
.gap-\[3px\]{gap:3px;}
|
|
244
255
|
.gap-\[4px\]{gap:4px;}
|
|
245
|
-
.gap-\[5px\]
|
|
256
|
+
.gap-\[5px\],
|
|
257
|
+
.gap-5px{gap:5px;}
|
|
246
258
|
.gap-\[8px\],
|
|
247
259
|
.gap-8px{gap:8px;}
|
|
248
260
|
.gap-0\.5{gap:0.125rem;}
|
|
@@ -262,16 +274,19 @@
|
|
|
262
274
|
.border-2px{border-width:2px;}
|
|
263
275
|
.\[\&\>a\]\:border-b>a,
|
|
264
276
|
.border-b-1px{border-bottom-width:1px;}
|
|
277
|
+
.border-l-1px{border-left-width:1px;}
|
|
265
278
|
.after\:border-l-1px::after{border-left-width:1px;}
|
|
266
279
|
.\[\&\>a\]\:border-\#ddd>a{--un-border-opacity:1;border-color:rgb(221 221 221 / var(--un-border-opacity));}
|
|
267
280
|
.border-\[\#E5E5E5\]{--un-border-opacity:1;border-color:rgb(229 229 229 / var(--un-border-opacity));}
|
|
268
281
|
.border-\[rgb\(118\,118\,118\)\]{--un-border-opacity:1;border-color:rgb(118 118 118 / var(--un-border-opacity));}
|
|
269
282
|
.border-\[var\(--theme-color-primary\)\]{border-color:var(--theme-color-primary);}
|
|
283
|
+
.border-\#BDBDBD{--un-border-opacity:1;border-color:rgb(189 189 189 / var(--un-border-opacity));}
|
|
270
284
|
.border-\#E8E9EA{--un-border-opacity:1;border-color:rgb(232 233 234 / var(--un-border-opacity));}
|
|
271
285
|
.border-transparent{border-color:transparent;}
|
|
272
286
|
.\[\&\>a\]\:hover\:border-\#fff:hover>a{--un-border-opacity:1;border-color:rgb(255 255 255 / var(--un-border-opacity));}
|
|
273
287
|
.focus\:border-\#1E3DE4:focus{--un-border-opacity:1;border-color:rgb(30 61 228 / var(--un-border-opacity));}
|
|
274
288
|
.border-b-\#e8e9ea{--un-border-opacity:1;--un-border-bottom-opacity:var(--un-border-opacity);border-bottom-color:rgb(232 233 234 / var(--un-border-bottom-opacity));}
|
|
289
|
+
.border-l-\#BDBDBD{--un-border-opacity:1;--un-border-left-opacity:var(--un-border-opacity);border-left-color:rgb(189 189 189 / var(--un-border-left-opacity));}
|
|
275
290
|
.after\:border-l-\#EFF2FA::after{--un-border-opacity:1;--un-border-left-opacity:var(--un-border-opacity);border-left-color:rgb(239 242 250 / var(--un-border-left-opacity));}
|
|
276
291
|
.rounded{border-radius:0.25rem;}
|
|
277
292
|
.rounded-\[4px\],
|
|
@@ -295,6 +310,7 @@
|
|
|
295
310
|
.border-none{border-style:none;}
|
|
296
311
|
.border-solid{border-style:solid;}
|
|
297
312
|
.border-b-solid{border-bottom-style:solid;}
|
|
313
|
+
.border-l-solid{border-left-style:solid;}
|
|
298
314
|
.after\:border-l-solid::after{border-left-style:solid;}
|
|
299
315
|
.bg-\[\#000\]{--un-bg-opacity:1;background-color:rgb(0 0 0 / var(--un-bg-opacity));}
|
|
300
316
|
.bg-\[\#1E3DE4\]{--un-bg-opacity:1;background-color:rgb(30 61 228 / var(--un-bg-opacity));}
|
|
@@ -319,6 +335,7 @@
|
|
|
319
335
|
.bg-\#d1d5ea\!{--un-bg-opacity:1 !important;background-color:rgb(209 213 234 / var(--un-bg-opacity)) !important;}
|
|
320
336
|
.bg-\#eee{--un-bg-opacity:1;background-color:rgb(238 238 238 / var(--un-bg-opacity));}
|
|
321
337
|
.bg-\#EFF2FA{--un-bg-opacity:1;background-color:rgb(239 242 250 / var(--un-bg-opacity));}
|
|
338
|
+
.bg-\#F8F9FB{--un-bg-opacity:1;background-color:rgb(248 249 251 / var(--un-bg-opacity));}
|
|
322
339
|
.bg-\#f9fafb{--un-bg-opacity:1;background-color:rgb(249 250 251 / var(--un-bg-opacity));}
|
|
323
340
|
.bg-blue-04{--un-bg-opacity:0.04;background-color:rgba(30, 61, 228, var(--un-bg-opacity));}
|
|
324
341
|
.data-\[highlighted\]\:bg-\[\#7789D3\][data-highlighted]{--un-bg-opacity:1;background-color:rgb(119 137 211 / var(--un-bg-opacity));}
|
|
@@ -328,6 +345,7 @@
|
|
|
328
345
|
.hover\:bg-\[var\(--theme-color-button-bg\)\]:hover{background-color:var(--theme-color-button-bg);}
|
|
329
346
|
.hover\:bg-\[var\(--theme-color-gray0\)\]:hover{background-color:var(--theme-color-gray0);}
|
|
330
347
|
.hover\:bg-\#0054fe19:hover{--un-bg-opacity:0.1;background-color:rgb(0 84 254 / var(--un-bg-opacity));}
|
|
348
|
+
.hover\:bg-\#E9ECEF:hover{--un-bg-opacity:1;background-color:rgb(233 236 239 / var(--un-bg-opacity));}
|
|
331
349
|
.hover\:bg-\#f1f4f6:hover{--un-bg-opacity:1;background-color:rgb(241 244 246 / var(--un-bg-opacity));}
|
|
332
350
|
.hover\:bg-blue-08:hover{--un-bg-opacity:0.08;background-color:rgba(30, 61, 228, var(--un-bg-opacity));}
|
|
333
351
|
.after\:bg-\[\#fff\]::after{--un-bg-opacity:1;background-color:rgb(255 255 255 / var(--un-bg-opacity));}
|
|
@@ -357,6 +375,7 @@
|
|
|
357
375
|
.px-1\.2857rem{padding-left:1.2857rem;padding-right:1.2857rem;}
|
|
358
376
|
.px-10px{padding-left:10px;padding-right:10px;}
|
|
359
377
|
.px-12px{padding-left:12px;padding-right:12px;}
|
|
378
|
+
.px-5px{padding-left:5px;padding-right:5px;}
|
|
360
379
|
.px-8px{padding-left:8px;padding-right:8px;}
|
|
361
380
|
.py-\[2px\]{padding-top:2px;padding-bottom:2px;}
|
|
362
381
|
.py-0{padding-top:0;padding-bottom:0;}
|
package/dist/utils/address.d.ts
CHANGED
|
@@ -7,7 +7,7 @@ interface AddressCache {
|
|
|
7
7
|
[key: string]: unknown;
|
|
8
8
|
}
|
|
9
9
|
declare const ADDRESS_FUNC_CACHE: AddressCache;
|
|
10
|
-
declare const convertCheckSum: <T extends LooseAddressType>(address: T) =>
|
|
10
|
+
declare const convertCheckSum: <T extends LooseAddressType>(address: T) => `0x${string}` | T;
|
|
11
11
|
declare const isCoreMainOrTestAddress: (address: LooseAddressType) => boolean;
|
|
12
12
|
declare const isCoreMainnetAddress: (address: LooseAddressType) => boolean;
|
|
13
13
|
declare const isCoreTestnetAddress: (address: LooseAddressType) => boolean;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import ReactAce from 'react-ace/lib/ace';
|
|
3
|
+
|
|
4
|
+
declare const useMultiAceSearch: ({ onSearchEmpty, }?: {
|
|
5
|
+
onSearchEmpty?: (() => void) | undefined;
|
|
6
|
+
}) => {
|
|
7
|
+
editorListRef: React.MutableRefObject<ReactAce[]>;
|
|
8
|
+
searchValue: string;
|
|
9
|
+
total: number | null;
|
|
10
|
+
searchIndex: number | null;
|
|
11
|
+
inSearch: boolean;
|
|
12
|
+
setSearchValue: (value: string) => void;
|
|
13
|
+
setEditorIndex: (index: number) => void;
|
|
14
|
+
findNext: () => void;
|
|
15
|
+
findPrevious: () => void;
|
|
16
|
+
reset: (resetSearchValue?: boolean) => void;
|
|
17
|
+
exitSearch: () => void;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export { useMultiAceSearch };
|
|
@@ -0,0 +1,219 @@
|
|
|
1
|
+
// src/utils/hooks/useMultiAceSearch.ts
|
|
2
|
+
import { useCallback, useRef, useState } from "react";
|
|
3
|
+
import { Range } from "ace-builds";
|
|
4
|
+
var zeroRangeInEditor = new Range(0, 0, 0, 0);
|
|
5
|
+
var checkRange = (range1, range2) => {
|
|
6
|
+
if (range1.start.row === range2.start.row && range1.start.column === range2.start.column) {
|
|
7
|
+
return "equal";
|
|
8
|
+
}
|
|
9
|
+
if (range1.start.row > range2.start.row || range1.start.row === range2.start.row && range1.start.column > range2.start.column) {
|
|
10
|
+
return "after";
|
|
11
|
+
}
|
|
12
|
+
return "before";
|
|
13
|
+
};
|
|
14
|
+
var timeout = 50;
|
|
15
|
+
var useMultiAceSearch = ({
|
|
16
|
+
onSearchEmpty
|
|
17
|
+
} = {}) => {
|
|
18
|
+
const [inSearch, setInSearch] = useState(false);
|
|
19
|
+
const [searchValue, setSearchValue] = useState("");
|
|
20
|
+
const editorListRef = useRef([]);
|
|
21
|
+
const editorSearchStatusListRef = useRef([]);
|
|
22
|
+
const editorIndexRef = useRef(0);
|
|
23
|
+
const [total, setTotal] = useState(null);
|
|
24
|
+
const [searchIndex, setSearchIndex] = useState(null);
|
|
25
|
+
const totalRef = useRef(null);
|
|
26
|
+
const scrollTimeoutRef = useRef(null);
|
|
27
|
+
const initSearch = useCallback(
|
|
28
|
+
(reset2 = false) => {
|
|
29
|
+
if (searchValue === "") {
|
|
30
|
+
return [true, 0];
|
|
31
|
+
}
|
|
32
|
+
let isNew = false;
|
|
33
|
+
if (totalRef.current === null || reset2) {
|
|
34
|
+
let start = 0;
|
|
35
|
+
let _total = 0;
|
|
36
|
+
editorSearchStatusListRef.current = editorListRef.current.map(
|
|
37
|
+
(editor) => {
|
|
38
|
+
const searchStatus = {
|
|
39
|
+
start,
|
|
40
|
+
rangeList: []
|
|
41
|
+
};
|
|
42
|
+
let range = editor.editor.find(searchValue, {
|
|
43
|
+
start: zeroRangeInEditor,
|
|
44
|
+
skipCurrent: true,
|
|
45
|
+
backwards: false
|
|
46
|
+
});
|
|
47
|
+
let startRange = range;
|
|
48
|
+
while (range) {
|
|
49
|
+
start++;
|
|
50
|
+
searchStatus.rangeList.push(range);
|
|
51
|
+
range = editor.editor.find(searchValue, {
|
|
52
|
+
skipCurrent: true,
|
|
53
|
+
backwards: false
|
|
54
|
+
});
|
|
55
|
+
if (checkRange(range, startRange) !== "after") {
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
_total += searchStatus.rangeList.length;
|
|
60
|
+
return searchStatus;
|
|
61
|
+
}
|
|
62
|
+
);
|
|
63
|
+
setTotal(_total);
|
|
64
|
+
totalRef.current = _total;
|
|
65
|
+
isNew = true;
|
|
66
|
+
}
|
|
67
|
+
if (totalRef.current === 0) {
|
|
68
|
+
onSearchEmpty?.();
|
|
69
|
+
}
|
|
70
|
+
return [isNew || reset2, totalRef.current];
|
|
71
|
+
},
|
|
72
|
+
[searchValue, onSearchEmpty]
|
|
73
|
+
);
|
|
74
|
+
const getNextAvailableEditor = useCallback((index, direction = 1) => {
|
|
75
|
+
const initIndex = (index + editorListRef.current.length) % editorListRef.current.length;
|
|
76
|
+
let currentEditorIndex = initIndex;
|
|
77
|
+
let currentEditorSearchStatus = editorSearchStatusListRef.current[currentEditorIndex];
|
|
78
|
+
while (!currentEditorSearchStatus || currentEditorSearchStatus.rangeList.length === 0) {
|
|
79
|
+
currentEditorIndex = (currentEditorIndex + editorListRef.current.length + direction) % editorListRef.current.length;
|
|
80
|
+
currentEditorSearchStatus = editorSearchStatusListRef.current[currentEditorIndex];
|
|
81
|
+
}
|
|
82
|
+
return [currentEditorIndex, currentEditorIndex !== initIndex];
|
|
83
|
+
}, []);
|
|
84
|
+
const scrollToEditor = useCallback((editor) => {
|
|
85
|
+
if (scrollTimeoutRef.current) {
|
|
86
|
+
clearTimeout(scrollTimeoutRef.current);
|
|
87
|
+
}
|
|
88
|
+
scrollTimeoutRef.current = setTimeout(() => {
|
|
89
|
+
const textarea = editor.refEditor.getElementsByTagName("textarea")[0];
|
|
90
|
+
(textarea ?? editor.refEditor).scrollIntoView({ block: "center" });
|
|
91
|
+
scrollTimeoutRef.current = null;
|
|
92
|
+
}, timeout);
|
|
93
|
+
}, []);
|
|
94
|
+
const findPrevious = useCallback(() => {
|
|
95
|
+
const [isNewSearch, total2] = initSearch();
|
|
96
|
+
if (total2 === 0)
|
|
97
|
+
return;
|
|
98
|
+
setInSearch(true);
|
|
99
|
+
const editorList = editorListRef.current;
|
|
100
|
+
const [currentEditorIndex, isEditorChanged] = getNextAvailableEditor(
|
|
101
|
+
isNewSearch ? editorList.length - 1 : editorIndexRef.current,
|
|
102
|
+
-1
|
|
103
|
+
);
|
|
104
|
+
let currentEditor = editorList[currentEditorIndex];
|
|
105
|
+
let currentEditorSearchStatus = editorSearchStatusListRef.current[currentEditorIndex];
|
|
106
|
+
const prevRange = currentEditor.editor.selection.getRange();
|
|
107
|
+
const startRange = currentEditorSearchStatus.rangeList[0];
|
|
108
|
+
let range = currentEditor.editor.find(searchValue, {
|
|
109
|
+
// 如果是新的搜索或者切换了编辑器,那么从第一个结果开始搜索,同时忽略当前结果,找到的就是最后一个结果
|
|
110
|
+
start: isNewSearch || isEditorChanged ? startRange : void 0,
|
|
111
|
+
// 如果是在当前编辑器内继续搜索,那么直接忽略当前结果查找上一个结果
|
|
112
|
+
skipCurrent: true,
|
|
113
|
+
// 从后往前查找
|
|
114
|
+
backwards: true
|
|
115
|
+
});
|
|
116
|
+
editorIndexRef.current = currentEditorIndex;
|
|
117
|
+
if (checkRange(range, prevRange) !== "before" && !isEditorChanged && !isNewSearch) {
|
|
118
|
+
const [nextEditorIndex] = getNextAvailableEditor(
|
|
119
|
+
currentEditorIndex - 1,
|
|
120
|
+
// 指定查找编辑器的方向
|
|
121
|
+
-1
|
|
122
|
+
);
|
|
123
|
+
editorIndexRef.current = nextEditorIndex;
|
|
124
|
+
currentEditor = editorList[nextEditorIndex];
|
|
125
|
+
currentEditorSearchStatus = editorSearchStatusListRef.current[nextEditorIndex];
|
|
126
|
+
const startRange2 = currentEditorSearchStatus.rangeList[0];
|
|
127
|
+
range = currentEditor.editor.find(searchValue, {
|
|
128
|
+
// 当前已知是切换了编辑器,所以从第一个结果开始搜索,同时忽略当前结果,找到的就是最后一个结果
|
|
129
|
+
start: startRange2,
|
|
130
|
+
skipCurrent: true,
|
|
131
|
+
backwards: true
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
scrollToEditor(currentEditor);
|
|
135
|
+
const searchIndex2 = currentEditorSearchStatus.rangeList.findIndex(
|
|
136
|
+
(pr) => checkRange(range, pr) === "equal"
|
|
137
|
+
) + currentEditorSearchStatus.start + 1;
|
|
138
|
+
setSearchIndex(searchIndex2);
|
|
139
|
+
}, [searchValue, initSearch, getNextAvailableEditor, scrollToEditor]);
|
|
140
|
+
const findNext = useCallback(() => {
|
|
141
|
+
const [isNewSearch, total2] = initSearch();
|
|
142
|
+
if (total2 === 0)
|
|
143
|
+
return;
|
|
144
|
+
setInSearch(true);
|
|
145
|
+
const editorList = editorListRef.current;
|
|
146
|
+
const [currentEditorIndex, isEditorChanged] = getNextAvailableEditor(
|
|
147
|
+
isNewSearch ? 0 : editorIndexRef.current
|
|
148
|
+
);
|
|
149
|
+
let currentEditor = editorList[currentEditorIndex];
|
|
150
|
+
const prevRange = currentEditor.editor.selection.getRange();
|
|
151
|
+
let currentEditorSearchStatus = editorSearchStatusListRef.current[currentEditorIndex];
|
|
152
|
+
const endRange = currentEditorSearchStatus.rangeList[currentEditorSearchStatus.rangeList.length - 1];
|
|
153
|
+
let range = currentEditor.editor.find(searchValue, {
|
|
154
|
+
// 如果是新的搜索或者切换了编辑器,那么从最后一个结果开始搜索,同时忽略当前结果,找到的就是第一个结果
|
|
155
|
+
start: isNewSearch || isEditorChanged ? endRange : void 0,
|
|
156
|
+
// 如果是在当前编辑器内继续搜索,那么直接忽略当前结果查找下一个结果
|
|
157
|
+
skipCurrent: true,
|
|
158
|
+
// 从前往后查找
|
|
159
|
+
backwards: false
|
|
160
|
+
});
|
|
161
|
+
editorIndexRef.current = currentEditorIndex;
|
|
162
|
+
if (checkRange(range, prevRange) !== "after" && !isNewSearch) {
|
|
163
|
+
const [nextEditorIndex] = getNextAvailableEditor(currentEditorIndex + 1);
|
|
164
|
+
editorIndexRef.current = nextEditorIndex;
|
|
165
|
+
currentEditor = editorList[nextEditorIndex];
|
|
166
|
+
currentEditorSearchStatus = editorSearchStatusListRef.current[nextEditorIndex];
|
|
167
|
+
const endRange2 = currentEditorSearchStatus.rangeList[currentEditorSearchStatus.rangeList.length - 1];
|
|
168
|
+
range = currentEditor.editor.find(searchValue, {
|
|
169
|
+
// 当前已知是切换了编辑器,所以从最后一个结果开始搜索,同时忽略当前结果,找到的就是第一个结果
|
|
170
|
+
start: endRange2,
|
|
171
|
+
skipCurrent: true,
|
|
172
|
+
backwards: false
|
|
173
|
+
});
|
|
174
|
+
}
|
|
175
|
+
scrollToEditor(currentEditor);
|
|
176
|
+
const searchIndex2 = currentEditorSearchStatus.rangeList.findIndex(
|
|
177
|
+
(pr) => checkRange(range, pr) === "equal"
|
|
178
|
+
) + currentEditorSearchStatus.start + 1;
|
|
179
|
+
setSearchIndex(searchIndex2);
|
|
180
|
+
}, [searchValue, initSearch, getNextAvailableEditor, scrollToEditor]);
|
|
181
|
+
const reset = useCallback((resetSearchValue = false) => {
|
|
182
|
+
if (resetSearchValue === true) {
|
|
183
|
+
setSearchValue("");
|
|
184
|
+
}
|
|
185
|
+
editorSearchStatusListRef.current = [];
|
|
186
|
+
editorIndexRef.current = 0;
|
|
187
|
+
totalRef.current = null;
|
|
188
|
+
setTotal(null);
|
|
189
|
+
setSearchIndex(null);
|
|
190
|
+
}, []);
|
|
191
|
+
return {
|
|
192
|
+
editorListRef,
|
|
193
|
+
searchValue,
|
|
194
|
+
total,
|
|
195
|
+
searchIndex,
|
|
196
|
+
inSearch,
|
|
197
|
+
setSearchValue: useCallback(
|
|
198
|
+
(value) => {
|
|
199
|
+
setSearchValue(value);
|
|
200
|
+
reset();
|
|
201
|
+
},
|
|
202
|
+
[reset]
|
|
203
|
+
),
|
|
204
|
+
setEditorIndex: useCallback((index) => {
|
|
205
|
+
editorIndexRef.current = index;
|
|
206
|
+
}, []),
|
|
207
|
+
findNext,
|
|
208
|
+
findPrevious,
|
|
209
|
+
reset,
|
|
210
|
+
exitSearch: useCallback(() => {
|
|
211
|
+
setInSearch(false);
|
|
212
|
+
reset();
|
|
213
|
+
}, [reset])
|
|
214
|
+
};
|
|
215
|
+
};
|
|
216
|
+
export {
|
|
217
|
+
useMultiAceSearch
|
|
218
|
+
};
|
|
219
|
+
//# sourceMappingURL=useMultiAceSearch.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/utils/hooks/useMultiAceSearch.ts"],"sourcesContent":["import { useCallback, useRef, useState } from 'react';\nimport ReactAce from 'react-ace/lib/ace';\nimport { Ace, Range } from 'ace-builds';\n\ntype RangeType = Ace.Range;\n\ninterface EditorSearchStatus {\n // 编辑器的起始搜索序号\n start: number;\n // 编辑器每个搜索结果对应的位置\n rangeList: RangeType[];\n}\n\nconst zeroRangeInEditor = new Range(0, 0, 0, 0);\n\n// 判断两个 Range 的位置关系\nconst checkRange = (range1: RangeType, range2: RangeType) => {\n // 因为搜索结果位置不会重叠, 所以只需要判断 start 位置即可\n if (\n range1.start.row === range2.start.row &&\n range1.start.column === range2.start.column\n ) {\n return 'equal';\n }\n if (\n range1.start.row > range2.start.row ||\n (range1.start.row === range2.start.row &&\n range1.start.column > range2.start.column)\n ) {\n return 'after';\n }\n return 'before';\n};\n\nconst timeout = 50;\n\nexport const useMultiAceSearch = ({\n onSearchEmpty,\n}: {\n // 需要保证不会随着组件重新渲染而重新初始化,推荐使用 useCallback 或在组件外定义\n onSearchEmpty?: () => void;\n} = {}) => {\n // 是否处在搜索状态\n const [inSearch, setInSearch] = useState(false);\n // 搜索内容\n const [searchValue, setSearchValue] = useState('');\n // 管理编辑器实例\n const editorListRef = useRef<ReactAce[]>([]);\n // 管理每个编辑器实例的搜索状态\n const editorSearchStatusListRef = useRef<EditorSearchStatus[]>([]);\n // 记录当前搜索中的编辑器索引\n const editorIndexRef = useRef(0);\n // 记录搜索结果总数,用于页面显示\n const [total, setTotal] = useState<number | null>(null);\n // 记录当前搜索结果索引,用于页面显示\n const [searchIndex, setSearchIndex] = useState<number | null>(null);\n // 记录搜索结果总数,用于内部计算\n const totalRef = useRef<number | null>(null);\n // 延时定位编辑器,避免搜索位置还没更新\n const scrollTimeoutRef = useRef<NodeJS.Timeout | null>(null);\n // 初始化搜索状态\n const initSearch = useCallback(\n (reset = false) => {\n if (searchValue === '') {\n return [true, 0] as const;\n }\n // 是否是新搜索\n let isNew = false;\n if (totalRef.current === null || reset) {\n // 每个编辑器第一个搜索结果在全局的索引\n let start = 0;\n // 全局搜索结果总数\n let _total = 0;\n editorSearchStatusListRef.current = editorListRef.current.map(\n editor => {\n // 初始化搜索状态\n const searchStatus: EditorSearchStatus = {\n start,\n rangeList: [],\n };\n // 默认从编辑器起始位置开始搜索,使用 find 方法查询每个结果的位置,不能使用 findAll\n let range = editor.editor.find(searchValue, {\n start: zeroRangeInEditor,\n skipCurrent: true,\n backwards: false,\n }) as unknown as RangeType | false;\n let startRange = range as RangeType;\n while (range) {\n // 如果 range 存在,说明有搜索结果, stage + 1 且记录 range 位置\n start++;\n searchStatus.rangeList.push(range);\n // 再次查找下一个搜索结果\n range = editor.editor.find(searchValue, {\n skipCurrent: true,\n backwards: false,\n }) as unknown as RangeType;\n // 如果当前 range 不在 startRange 之后,说明搜索结果重复,退出循环\n if (checkRange(range, startRange) !== 'after') {\n break;\n }\n }\n _total += searchStatus.rangeList.length;\n return searchStatus;\n },\n );\n setTotal(_total);\n totalRef.current = _total;\n isNew = true;\n }\n // 没有搜索结果\n if (totalRef.current === 0) {\n onSearchEmpty?.();\n }\n return [isNew || reset, totalRef.current] as const;\n },\n [searchValue, onSearchEmpty],\n );\n // 从 index 查询下一个可用于搜索的编辑器索引\n const getNextAvailableEditor = useCallback((index: number, direction = 1) => {\n // + editorListRef.current.length 避免负数\n const initIndex =\n (index + editorListRef.current.length) % editorListRef.current.length;\n let currentEditorIndex = initIndex;\n let currentEditorSearchStatus =\n editorSearchStatusListRef.current[currentEditorIndex];\n while (\n !currentEditorSearchStatus ||\n currentEditorSearchStatus.rangeList.length === 0\n ) {\n // 如果当前编辑器没有搜索结果,则尝试下一个编辑器\n currentEditorIndex =\n (currentEditorIndex + editorListRef.current.length + direction) %\n editorListRef.current.length;\n currentEditorSearchStatus =\n editorSearchStatusListRef.current[currentEditorIndex];\n }\n return [currentEditorIndex, currentEditorIndex !== initIndex] as const;\n }, []);\n const scrollToEditor = useCallback((editor: ReactAce) => {\n // 清除当前延时定位\n if (scrollTimeoutRef.current) {\n clearTimeout(scrollTimeoutRef.current);\n }\n // 延迟定位到搜索结果的位置,因为编辑器更新 textarea 需要时间,所以不能直接定位\n scrollTimeoutRef.current = setTimeout(() => {\n // 优先定位编辑器内的 textarea 标签,对应组件的光标所在位置,否则定位编辑器本身,此时可能会因为编辑器内容过多导致定位不准确\n const textarea = editor.refEditor.getElementsByTagName('textarea')[0];\n (textarea ?? editor.refEditor).scrollIntoView({ block: 'center' });\n scrollTimeoutRef.current = null;\n }, timeout);\n }, []);\n const findPrevious = useCallback(() => {\n const [isNewSearch, total] = initSearch();\n // 没有搜索结果\n if (total === 0) return;\n setInSearch(true);\n const editorList = editorListRef.current;\n // 新的搜索从最后一个编辑器开始,否则从上一次搜索的编辑器开始\n const [currentEditorIndex, isEditorChanged] = getNextAvailableEditor(\n isNewSearch ? editorList.length - 1 : editorIndexRef.current,\n -1,\n );\n // 获取当前编辑器实例和搜索状态\n let currentEditor = editorList[currentEditorIndex]!;\n let currentEditorSearchStatus =\n editorSearchStatusListRef.current[currentEditorIndex]!;\n // 获取第一和最后一个搜索结果的位置\n const prevRange = currentEditor.editor.selection.getRange();\n const startRange = currentEditorSearchStatus.rangeList[0]!;\n let range = currentEditor.editor.find(searchValue, {\n // 如果是新的搜索或者切换了编辑器,那么从第一个结果开始搜索,同时忽略当前结果,找到的就是最后一个结果\n start: isNewSearch || isEditorChanged ? startRange : undefined,\n // 如果是在当前编辑器内继续搜索,那么直接忽略当前结果查找上一个结果\n skipCurrent: true,\n // 从后往前查找\n backwards: true,\n }) as unknown as RangeType;\n // 更新搜索编辑器的索引\n editorIndexRef.current = currentEditorIndex;\n if (\n checkRange(range, prevRange) !== 'before' &&\n !isEditorChanged &&\n !isNewSearch\n ) {\n // 不是新的搜索,且没有切换编辑器,且找到的结果不在之前的位置签名,说明已经搜索完成回到末尾,那么需要切换到上一个编辑器\n const [nextEditorIndex] = getNextAvailableEditor(\n currentEditorIndex - 1,\n // 指定查找编辑器的方向\n -1,\n );\n // 重新更新搜索编辑器的索引\n editorIndexRef.current = nextEditorIndex;\n // 获取当前编辑器实例和搜索状态\n currentEditor = editorList[nextEditorIndex]!;\n currentEditorSearchStatus =\n editorSearchStatusListRef.current[nextEditorIndex]!;\n // 获取第一个搜索结果的位置\n const startRange = currentEditorSearchStatus.rangeList[0]!;\n range = currentEditor.editor.find(searchValue, {\n // 当前已知是切换了编辑器,所以从第一个结果开始搜索,同时忽略当前结果,找到的就是最后一个结果\n start: startRange,\n skipCurrent: true,\n backwards: true,\n }) as unknown as RangeType;\n }\n // 滚动到编辑器\n scrollToEditor(currentEditor);\n // 计算更新结果在所有结果中的序号\n const searchIndex =\n currentEditorSearchStatus.rangeList.findIndex(\n pr => checkRange(range, pr) === 'equal',\n ) +\n currentEditorSearchStatus.start +\n 1;\n setSearchIndex(searchIndex);\n }, [searchValue, initSearch, getNextAvailableEditor, scrollToEditor]);\n const findNext = useCallback(() => {\n const [isNewSearch, total] = initSearch();\n // 没有搜索结果\n if (total === 0) return;\n setInSearch(true);\n const editorList = editorListRef.current;\n // 新的搜索从第一个编辑器开始,否则从上一次搜索的编辑器开始\n const [currentEditorIndex, isEditorChanged] = getNextAvailableEditor(\n isNewSearch ? 0 : editorIndexRef.current,\n );\n // 获取当前编辑器实例和搜索状态\n let currentEditor = editorList[currentEditorIndex]!;\n const prevRange = currentEditor.editor.selection.getRange();\n let currentEditorSearchStatus =\n editorSearchStatusListRef.current[currentEditorIndex]!;\n // 获取最后一个搜索结果的位置\n const endRange =\n currentEditorSearchStatus.rangeList[\n currentEditorSearchStatus.rangeList.length - 1\n ]!;\n let range = currentEditor.editor.find(searchValue, {\n // 如果是新的搜索或者切换了编辑器,那么从最后一个结果开始搜索,同时忽略当前结果,找到的就是第一个结果\n start: isNewSearch || isEditorChanged ? endRange : undefined,\n // 如果是在当前编辑器内继续搜索,那么直接忽略当前结果查找下一个结果\n skipCurrent: true,\n // 从前往后查找\n backwards: false,\n }) as unknown as RangeType;\n // 更新搜索编辑器的索引\n editorIndexRef.current = currentEditorIndex;\n if (checkRange(range, prevRange) !== 'after' && !isNewSearch) {\n // 不是新的搜索,且没有切换编辑器,且找到的位置不在之前的位置后面,说明已经搜索完成回到开头,那么需要切换到下一个编辑器\n const [nextEditorIndex] = getNextAvailableEditor(currentEditorIndex + 1);\n // 重新更新搜索编辑器的索引\n editorIndexRef.current = nextEditorIndex;\n // 获取当前编辑器实例和搜索状态\n currentEditor = editorList[nextEditorIndex]!;\n currentEditorSearchStatus =\n editorSearchStatusListRef.current[nextEditorIndex]!;\n // 获取最后一个搜索结果的位置\n const endRange =\n currentEditorSearchStatus.rangeList[\n currentEditorSearchStatus.rangeList.length - 1\n ]!;\n range = currentEditor.editor.find(searchValue, {\n // 当前已知是切换了编辑器,所以从最后一个结果开始搜索,同时忽略当前结果,找到的就是第一个结果\n start: endRange,\n skipCurrent: true,\n backwards: false,\n }) as unknown as RangeType;\n }\n // 滚动到编辑器\n scrollToEditor(currentEditor);\n // 计算更新结果在所有结果中的序号\n const searchIndex =\n currentEditorSearchStatus.rangeList.findIndex(\n pr => checkRange(range, pr) === 'equal',\n ) +\n currentEditorSearchStatus.start +\n 1;\n setSearchIndex(searchIndex);\n }, [searchValue, initSearch, getNextAvailableEditor, scrollToEditor]);\n const reset = useCallback((resetSearchValue = false) => {\n if (resetSearchValue === true) {\n setSearchValue('');\n }\n editorSearchStatusListRef.current = [];\n editorIndexRef.current = 0;\n totalRef.current = null;\n setTotal(null);\n setSearchIndex(null);\n }, []);\n return {\n editorListRef,\n searchValue,\n total,\n searchIndex,\n inSearch,\n setSearchValue: useCallback(\n (value: string) => {\n setSearchValue(value);\n // reset\n reset();\n },\n [reset],\n ),\n setEditorIndex: useCallback((index: number) => {\n editorIndexRef.current = index;\n }, []),\n findNext,\n findPrevious,\n reset,\n exitSearch: useCallback(() => {\n setInSearch(false);\n reset();\n }, [reset]),\n };\n};\n"],"mappings":"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","names":["reset","total","startRange","searchIndex","endRange"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cfxjs/sirius-next-common",
|
|
3
|
-
"version": "0.2.
|
|
3
|
+
"version": "0.2.7",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"files": [
|
|
6
6
|
"dist/**"
|
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
"@types/react-google-recaptcha": "^2.1.9",
|
|
27
27
|
"@types/react-router-dom": "^5.3.3",
|
|
28
28
|
"@zeit-ui/react-icons": "^1.3.1",
|
|
29
|
+
"ace-builds": "1.4.12",
|
|
29
30
|
"bignumber.js": "^9.1.2",
|
|
30
31
|
"clsx": "^2.1.0",
|
|
31
32
|
"copyfiles": "^2.4.1",
|
|
@@ -41,8 +42,10 @@
|
|
|
41
42
|
"lucide-react": "^0.379.0",
|
|
42
43
|
"pako": "2.0.2",
|
|
43
44
|
"query-string": "6.13.1",
|
|
45
|
+
"react-ace": "9.1.3",
|
|
44
46
|
"react-google-recaptcha": "^3.1.0",
|
|
45
47
|
"react-i18next": "^11.18.6",
|
|
48
|
+
"react-merge-refs": "3.0.2",
|
|
46
49
|
"react-router-dom": "^5.1.2",
|
|
47
50
|
"react-use": "^17.5.0",
|
|
48
51
|
"swr": "^2.2.5",
|
|
@@ -73,7 +76,7 @@
|
|
|
73
76
|
"unocss": "0.58.6",
|
|
74
77
|
"vitest": "3.2.3",
|
|
75
78
|
"@cfxjs/sirius-next-eslint-config": "0.0.0",
|
|
76
|
-
"@cfxjs/sirius-next-i18n": "0.2.
|
|
79
|
+
"@cfxjs/sirius-next-i18n": "0.2.6",
|
|
77
80
|
"@cfxjs/sirius-next-typescript-config": "0.0.0"
|
|
78
81
|
},
|
|
79
82
|
"publishConfig": {
|