@ioca/react 1.5.12 → 1.5.14
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/lib/cjs/components/affix/affix.js +38 -29
- package/lib/cjs/components/affix/affix.js.map +1 -1
- package/lib/cjs/components/affix/totop.js +1 -1
- package/lib/cjs/components/affix/totop.js.map +1 -1
- package/lib/cjs/components/dropdown/dropdown.js +6 -3
- package/lib/cjs/components/dropdown/dropdown.js.map +1 -1
- package/lib/cjs/components/dropdown/item.js +20 -4
- package/lib/cjs/components/dropdown/item.js.map +1 -1
- package/lib/cjs/components/editor/editor.js +27 -11
- package/lib/cjs/components/editor/editor.js.map +1 -1
- package/lib/cjs/components/loading/loading.js +4 -3
- package/lib/cjs/components/loading/loading.js.map +1 -1
- package/lib/cjs/components/popup/popup.js +7 -17
- package/lib/cjs/components/popup/popup.js.map +1 -1
- package/lib/cjs/components/progress/circle.js +3 -3
- package/lib/cjs/components/progress/circle.js.map +1 -1
- package/lib/cjs/components/scroll/index.js +10 -0
- package/lib/cjs/components/scroll/index.js.map +1 -0
- package/lib/cjs/components/scroll/scroll.js +78 -0
- package/lib/cjs/components/scroll/scroll.js.map +1 -0
- package/lib/cjs/components/upload/upload.js +5 -5
- package/lib/cjs/components/upload/upload.js.map +1 -1
- package/lib/cjs/index.js +2 -0
- package/lib/cjs/index.js.map +1 -1
- package/lib/css/colors.css +784 -784
- package/lib/css/index.css +1 -1
- package/lib/css/index.css.map +1 -1
- package/lib/es/components/affix/affix.js +39 -30
- package/lib/es/components/affix/affix.js.map +1 -1
- package/lib/es/components/affix/totop.js +1 -1
- package/lib/es/components/affix/totop.js.map +1 -1
- package/lib/es/components/dropdown/dropdown.js +7 -5
- package/lib/es/components/dropdown/dropdown.js.map +1 -1
- package/lib/es/components/dropdown/item.js +20 -4
- package/lib/es/components/dropdown/item.js.map +1 -1
- package/lib/es/components/editor/editor.js +27 -11
- package/lib/es/components/editor/editor.js.map +1 -1
- package/lib/es/components/loading/loading.js +4 -3
- package/lib/es/components/loading/loading.js.map +1 -1
- package/lib/es/components/popup/popup.js +7 -17
- package/lib/es/components/popup/popup.js.map +1 -1
- package/lib/es/components/progress/circle.js +3 -3
- package/lib/es/components/progress/circle.js.map +1 -1
- package/lib/es/components/scroll/index.js +6 -0
- package/lib/es/components/scroll/index.js.map +1 -0
- package/lib/es/components/scroll/scroll.js +70 -0
- package/lib/es/components/scroll/scroll.js.map +1 -0
- package/lib/es/components/upload/upload.js +7 -7
- package/lib/es/components/upload/upload.js.map +1 -1
- package/lib/es/index.js +1 -0
- package/lib/es/index.js.map +1 -1
- package/lib/index.js +174 -78
- package/lib/types/components/affix/totop.d.ts +7 -2
- package/lib/types/components/affix/type.d.ts +1 -1
- package/lib/types/components/dropdown/dropdown.d.ts +1 -1
- package/lib/types/components/editor/type.d.ts +1 -1
- package/lib/types/components/scroll/index.d.ts +5 -0
- package/lib/types/components/scroll/scroll.d.ts +6 -0
- package/lib/types/components/scroll/type.d.ts +7 -0
- package/lib/types/components/upload/type.d.ts +1 -0
- package/lib/types/index.d.ts +1 -0
- package/package.json +1 -1
|
@@ -12,50 +12,59 @@ function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'defau
|
|
|
12
12
|
|
|
13
13
|
var classNames__default = /*#__PURE__*/_interopDefaultCompat(classNames);
|
|
14
14
|
|
|
15
|
+
const defaultGetContainer = () => {
|
|
16
|
+
if (typeof window === "undefined")
|
|
17
|
+
return null;
|
|
18
|
+
return window;
|
|
19
|
+
};
|
|
15
20
|
const Affix = (props) => {
|
|
16
|
-
const { position = "fixed", left, top, right, bottom, offset, style, className, children, getContainer =
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
21
|
+
const { position = "fixed", left, top, right, bottom, offset, style, className, children, getContainer = defaultGetContainer, } = props;
|
|
22
|
+
const [hidden, setHidden] = react.useState(() => {
|
|
23
|
+
if (!offset)
|
|
24
|
+
return false;
|
|
25
|
+
if (typeof window === "undefined")
|
|
26
|
+
return false;
|
|
27
|
+
return (window.scrollY ?? 0) < offset;
|
|
28
|
+
});
|
|
29
|
+
const getContainerRef = react.useRef(getContainer);
|
|
30
|
+
getContainerRef.current = getContainer;
|
|
22
31
|
const hijackChildren = react.useMemo(() => {
|
|
23
32
|
return react.Children.map(children, (node) => {
|
|
24
|
-
if (node.type
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
return node;
|
|
33
|
+
if (node.type !== totop.default)
|
|
34
|
+
return node;
|
|
35
|
+
const { onClick } = node.props;
|
|
36
|
+
return react.cloneElement(node, {
|
|
37
|
+
onClick: (e) => {
|
|
38
|
+
const container = getContainerRef.current();
|
|
39
|
+
onClick?.(e);
|
|
40
|
+
container?.scrollTo({
|
|
41
|
+
top: 0,
|
|
42
|
+
left: 0,
|
|
43
|
+
behavior: "smooth",
|
|
44
|
+
});
|
|
45
|
+
},
|
|
46
|
+
});
|
|
41
47
|
});
|
|
42
|
-
}, [children
|
|
48
|
+
}, [children]);
|
|
43
49
|
react.useEffect(() => {
|
|
44
|
-
const container =
|
|
50
|
+
const container = getContainerRef.current();
|
|
45
51
|
if (!offset || !container)
|
|
46
52
|
return;
|
|
53
|
+
const getScrollTop = () => container instanceof Window
|
|
54
|
+
? container.scrollY
|
|
55
|
+
: container.scrollTop;
|
|
47
56
|
const listener = radash.debounce({ delay: 160 }, () => {
|
|
48
|
-
|
|
49
|
-
setHidden(top < offset);
|
|
57
|
+
setHidden(getScrollTop() < offset);
|
|
50
58
|
});
|
|
51
59
|
listener();
|
|
52
60
|
container.addEventListener("scroll", listener);
|
|
53
61
|
return () => {
|
|
62
|
+
listener.cancel();
|
|
54
63
|
container.removeEventListener("scroll", listener);
|
|
55
64
|
};
|
|
56
|
-
}, [offset
|
|
65
|
+
}, [offset]);
|
|
57
66
|
return (jsxRuntime.jsx("div", { className: classNames__default("i-affix", className, {
|
|
58
|
-
"i-affix-
|
|
67
|
+
"i-affix-visible": !hidden,
|
|
59
68
|
}), style: {
|
|
60
69
|
...style,
|
|
61
70
|
position,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"affix.js","sources":["../../../../packages/components/affix/affix.tsx"],"sourcesContent":["import classNames from \"classnames\";\nimport { debounce } from \"radash\";\nimport {\n
|
|
1
|
+
{"version":3,"file":"affix.js","sources":["../../../../packages/components/affix/affix.tsx"],"sourcesContent":["import classNames from \"classnames\";\nimport { debounce } from \"radash\";\nimport {\n Children,\n cloneElement,\n MouseEvent,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport \"./index.css\";\nimport ToTop from \"./totop\";\nimport { IAffix } from \"./type\";\n\nconst defaultGetContainer = () => {\n if (typeof window === \"undefined\") return null;\n return window;\n};\n\nconst Affix = (props: IAffix) => {\n const {\n position = \"fixed\",\n left,\n top,\n right,\n bottom,\n offset,\n style,\n className,\n children,\n getContainer = defaultGetContainer,\n } = props;\n\n const [hidden, setHidden] = useState<boolean>(() => {\n if (!offset) return false;\n if (typeof window === \"undefined\") return false;\n return (window.scrollY ?? 0) < offset;\n });\n const getContainerRef = useRef(getContainer);\n getContainerRef.current = getContainer;\n\n const hijackChildren = useMemo(() => {\n return Children.map(children, (node: any) => {\n if (node.type !== ToTop) return node;\n\n const { onClick } = node.props;\n\n return cloneElement(node, {\n onClick: (e: MouseEvent) => {\n const container = getContainerRef.current();\n\n onClick?.(e);\n container?.scrollTo({\n top: 0,\n left: 0,\n behavior: \"smooth\",\n });\n },\n });\n });\n }, [children]);\n\n useEffect(() => {\n const container = getContainerRef.current();\n if (!offset || !container) return;\n\n const getScrollTop = () =>\n container instanceof Window\n ? container.scrollY\n : container.scrollTop;\n\n const listener = debounce({ delay: 160 }, () => {\n setHidden(getScrollTop() < offset);\n });\n\n listener();\n container.addEventListener(\"scroll\", listener);\n\n return () => {\n listener.cancel();\n container.removeEventListener(\"scroll\", listener);\n };\n }, [offset]);\n\n return (\n <div\n className={classNames(\"i-affix\", className, {\n \"i-affix-visible\": !hidden,\n })}\n style={{\n ...style,\n position,\n left,\n top,\n right,\n bottom,\n }}\n >\n {hijackChildren}\n </div>\n );\n};\n\nAffix.ToTop = ToTop;\n\nexport default Affix;\n"],"names":["useState","useRef","useMemo","Children","ToTop","cloneElement","useEffect","debounce","_jsx","classNames"],"mappings":";;;;;;;;;;;;;;AAeA,MAAM,mBAAmB,GAAG,MAAK;IAC7B,IAAI,OAAO,MAAM,KAAK,WAAW;AAAE,QAAA,OAAO,IAAI;AAC9C,IAAA,OAAO,MAAM;AACjB,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,KAAa,KAAI;IAC5B,MAAM,EACF,QAAQ,GAAG,OAAO,EAClB,IAAI,EACJ,GAAG,EACH,KAAK,EACL,MAAM,EACN,MAAM,EACN,KAAK,EACL,SAAS,EACT,QAAQ,EACR,YAAY,GAAG,mBAAmB,GACrC,GAAG,KAAK;IAET,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAGA,cAAQ,CAAU,MAAK;AAC/C,QAAA,IAAI,CAAC,MAAM;AAAE,YAAA,OAAO,KAAK;QACzB,IAAI,OAAO,MAAM,KAAK,WAAW;AAAE,YAAA,OAAO,KAAK;QAC/C,OAAO,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,IAAI,MAAM;AACzC,IAAA,CAAC,CAAC;AACF,IAAA,MAAM,eAAe,GAAGC,YAAM,CAAC,YAAY,CAAC;AAC5C,IAAA,eAAe,CAAC,OAAO,GAAG,YAAY;AAEtC,IAAA,MAAM,cAAc,GAAGC,aAAO,CAAC,MAAK;QAChC,OAAOC,cAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,IAAS,KAAI;AACxC,YAAA,IAAI,IAAI,CAAC,IAAI,KAAKC,aAAK;AAAE,gBAAA,OAAO,IAAI;AAEpC,YAAA,MAAM,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,KAAK;YAE9B,OAAOC,kBAAY,CAAC,IAAI,EAAE;AACtB,gBAAA,OAAO,EAAE,CAAC,CAAa,KAAI;AACvB,oBAAA,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,EAAE;AAE3C,oBAAA,OAAO,GAAG,CAAC,CAAC;oBACZ,SAAS,EAAE,QAAQ,CAAC;AAChB,wBAAA,GAAG,EAAE,CAAC;AACN,wBAAA,IAAI,EAAE,CAAC;AACP,wBAAA,QAAQ,EAAE,QAAQ;AACrB,qBAAA,CAAC;gBACN,CAAC;AACJ,aAAA,CAAC;AACN,QAAA,CAAC,CAAC;AACN,IAAA,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC;IAEdC,eAAS,CAAC,MAAK;AACX,QAAA,MAAM,SAAS,GAAG,eAAe,CAAC,OAAO,EAAE;AAC3C,QAAA,IAAI,CAAC,MAAM,IAAI,CAAC,SAAS;YAAE;AAE3B,QAAA,MAAM,YAAY,GAAG,MACjB,SAAS,YAAY;cACf,SAAS,CAAC;AACZ,cAAE,SAAS,CAAC,SAAS;QAE7B,MAAM,QAAQ,GAAGC,eAAQ,CAAC,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE,MAAK;AAC3C,YAAA,SAAS,CAAC,YAAY,EAAE,GAAG,MAAM,CAAC;AACtC,QAAA,CAAC,CAAC;AAEF,QAAA,QAAQ,EAAE;AACV,QAAA,SAAS,CAAC,gBAAgB,CAAC,QAAQ,EAAE,QAAQ,CAAC;AAE9C,QAAA,OAAO,MAAK;YACR,QAAQ,CAAC,MAAM,EAAE;AACjB,YAAA,SAAS,CAAC,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,CAAC;AACrD,QAAA,CAAC;AACL,IAAA,CAAC,EAAE,CAAC,MAAM,CAAC,CAAC;IAEZ,QACIC,wBACI,SAAS,EAAEC,mBAAU,CAAC,SAAS,EAAE,SAAS,EAAE;YACxC,iBAAiB,EAAE,CAAC,MAAM;SAC7B,CAAC,EACF,KAAK,EAAE;AACH,YAAA,GAAG,KAAK;YACR,QAAQ;YACR,IAAI;YACJ,GAAG;YACH,KAAK;YACL,MAAM;SACT,EAAA,QAAA,EAEA,cAAc,EAAA,CACb;AAEd;AAEA,KAAK,CAAC,KAAK,GAAGL,aAAK;;;;"}
|
|
@@ -14,7 +14,7 @@ var classNames__default = /*#__PURE__*/_interopDefaultCompat(classNames);
|
|
|
14
14
|
|
|
15
15
|
function ToTop(props) {
|
|
16
16
|
const { style, className, onClick } = props;
|
|
17
|
-
return (jsxRuntime.jsx(button.default, { square: true, className: classNames__default("i-affix-totop", className), style: { ...style }, onClick: onClick, children: jsxRuntime.jsx(icon.default, { icon: jsxRuntime.jsx(material.SkipPreviousRound, {}), rotate: 90 }) }));
|
|
17
|
+
return (jsxRuntime.jsx(button.default, { square: true, className: classNames__default("i-affix-totop", "i-affix-target", className), style: { ...style }, onClick: onClick, children: jsxRuntime.jsx(icon.default, { icon: jsxRuntime.jsx(material.SkipPreviousRound, {}), rotate: 90 }) }));
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
exports.default = ToTop;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"totop.js","sources":["../../../../packages/components/affix/totop.tsx"],"sourcesContent":["import { SkipPreviousRound } from \"@ricons/material\";\nimport classNames from \"classnames\";\nimport Button from \"../button\";\nimport Icon from \"../icon\";\
|
|
1
|
+
{"version":3,"file":"totop.js","sources":["../../../../packages/components/affix/totop.tsx"],"sourcesContent":["import { SkipPreviousRound } from \"@ricons/material\";\nimport classNames from \"classnames\";\nimport { CSSProperties, MouseEventHandler } from \"react\";\nimport Button from \"../button\";\nimport Icon from \"../icon\";\n\ninterface IToTopProps {\n\tstyle?: CSSProperties;\n\tclassName?: string;\n\tonClick?: MouseEventHandler<HTMLElement>;\n}\n\nfunction ToTop(props: IToTopProps) {\n\tconst { style, className, onClick } = props;\n\n\treturn (\n\t\t<Button\n\t\t\tsquare\n\t\t\tclassName={classNames(\"i-affix-totop\", \"i-affix-target\", className)}\n\t\t\tstyle={{ ...style }}\n\t\t\tonClick={onClick}\n\t\t>\n\t\t\t<Icon icon={<SkipPreviousRound />} rotate={90} />\n\t\t</Button>\n\t);\n}\n\nexport default ToTop;\n"],"names":["_jsx","Button","classNames","Icon","SkipPreviousRound"],"mappings":";;;;;;;;;;;;;;AAYA,SAAS,KAAK,CAAC,KAAkB,EAAA;IAChC,MAAM,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,GAAG,KAAK;AAE3C,IAAA,QACCA,cAAA,CAACC,cAAM,IACN,MAAM,EAAA,IAAA,EACN,SAAS,EAAEC,mBAAU,CAAC,eAAe,EAAE,gBAAgB,EAAE,SAAS,CAAC,EACnE,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,EACnB,OAAO,EAAE,OAAO,YAEhBF,cAAA,CAACG,YAAI,IAAC,IAAI,EAAEH,eAACI,0BAAiB,EAAA,EAAA,CAAG,EAAE,MAAM,EAAE,EAAE,EAAA,CAAI,EAAA,CACzC;AAEX;;;;"}
|
|
@@ -8,12 +8,14 @@ var list = require('../list/list.js');
|
|
|
8
8
|
var popup = require('../popup/popup.js');
|
|
9
9
|
var item = require('./item.js');
|
|
10
10
|
|
|
11
|
+
const DropdownCloseCtx = react.createContext(null);
|
|
11
12
|
const Dropdown = (props) => {
|
|
12
13
|
const { visible, width, content, children, ...restProps } = props;
|
|
13
14
|
const [active, setActive] = react.useState(visible);
|
|
14
15
|
if (!content) {
|
|
15
16
|
return children;
|
|
16
17
|
}
|
|
18
|
+
const close = () => setActive(false);
|
|
17
19
|
const handleVisibleChange = (v) => {
|
|
18
20
|
setActive(v);
|
|
19
21
|
if (props.onVisibleChange) {
|
|
@@ -23,11 +25,12 @@ const Dropdown = (props) => {
|
|
|
23
25
|
react.useEffect(() => {
|
|
24
26
|
setActive(visible);
|
|
25
27
|
}, [visible]);
|
|
26
|
-
return (jsxRuntime.jsx(popup.default, { trigger: 'click', position: 'bottom', content: jsxRuntime.jsx(list.default, { className: 'i-dropdown-content', style: { minWidth: width }, children: typeof content === "function"
|
|
27
|
-
|
|
28
|
-
|
|
28
|
+
return (jsxRuntime.jsx(popup.default, { trigger: 'click', position: 'bottom', content: jsxRuntime.jsx(DropdownCloseCtx.Provider, { value: close, children: jsxRuntime.jsx(list.default, { className: 'i-dropdown-content', style: { minWidth: width }, children: typeof content === "function"
|
|
29
|
+
? content(close)
|
|
30
|
+
: content }) }), ...restProps, touchable: true, visible: active, onVisibleChange: handleVisibleChange, children: children }));
|
|
29
31
|
};
|
|
30
32
|
Dropdown.Item = item.default;
|
|
31
33
|
|
|
34
|
+
exports.DropdownCloseCtx = DropdownCloseCtx;
|
|
32
35
|
exports.default = Dropdown;
|
|
33
36
|
//# sourceMappingURL=dropdown.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dropdown.js","sources":["../../../../packages/components/dropdown/dropdown.tsx"],"sourcesContent":["import { useEffect, useState } from \"react\";\nimport List from \"../list\";\nimport Popup from \"../popup\";\nimport \"./index.css\";\nimport Item from \"./item\";\nimport { IDropdown } from \"./type\";\n\nconst Dropdown = (props: IDropdown) => {\n\tconst { visible, width, content, children, ...restProps } = props;\n\tconst [active, setActive] = useState(visible);\n\n\tif (!content) {\n\t\treturn children;\n\t}\n\n\tconst handleVisibleChange = (v: boolean) => {\n\t\tsetActive(v);\n\t\tif (props.onVisibleChange) {\n\t\t\tprops.onVisibleChange(v);\n\t\t}\n\t};\n\n\tuseEffect(() => {\n\t\tsetActive(visible);\n\t}, [visible]);\n\n\treturn (\n\t\t<Popup\n\t\t\ttrigger='click'\n\t\t\tposition='bottom'\n\t\t\tcontent={\n\t\t\t\t<List\n\t\t\t\t\tclassName='i-dropdown-content'\n\t\t\t\t\tstyle={{ minWidth: width }}\n\t\t\t\t>\n\t\t\t\t\t{typeof content === \"function\"\n\t\t\t\t\t\t? content(
|
|
1
|
+
{"version":3,"file":"dropdown.js","sources":["../../../../packages/components/dropdown/dropdown.tsx"],"sourcesContent":["import { createContext, useEffect, useState } from \"react\";\nimport List from \"../list\";\nimport Popup from \"../popup\";\nimport \"./index.css\";\nimport Item from \"./item\";\nimport { IDropdown } from \"./type\";\n\nexport const DropdownCloseCtx = createContext<(() => void) | null>(null);\n\nconst Dropdown = (props: IDropdown) => {\n\tconst { visible, width, content, children, ...restProps } = props;\n\tconst [active, setActive] = useState(visible);\n\n\tif (!content) {\n\t\treturn children;\n\t}\n\n\tconst close = () => setActive(false);\n\n\tconst handleVisibleChange = (v: boolean) => {\n\t\tsetActive(v);\n\t\tif (props.onVisibleChange) {\n\t\t\tprops.onVisibleChange(v);\n\t\t}\n\t};\n\n\tuseEffect(() => {\n\t\tsetActive(visible);\n\t}, [visible]);\n\n\treturn (\n\t\t<Popup\n\t\t\ttrigger='click'\n\t\t\tposition='bottom'\n\t\t\tcontent={\n\t\t\t\t<DropdownCloseCtx.Provider value={close}>\n\t\t\t\t\t<List\n\t\t\t\t\t\tclassName='i-dropdown-content'\n\t\t\t\t\t\tstyle={{ minWidth: width }}\n\t\t\t\t\t>\n\t\t\t\t\t\t{typeof content === \"function\"\n\t\t\t\t\t\t\t? content(close)\n\t\t\t\t\t\t\t: content}\n\t\t\t\t\t</List>\n\t\t\t\t</DropdownCloseCtx.Provider>\n\t\t\t}\n\t\t\t{...restProps}\n\t\t\ttouchable\n\t\t\tvisible={active}\n\t\t\tonVisibleChange={handleVisibleChange}\n\t\t>\n\t\t\t{children}\n\t\t</Popup>\n\t);\n};\n\nDropdown.Item = Item;\n\nexport default Dropdown;\n"],"names":["createContext","useState","useEffect","_jsx","Popup","List","Item"],"mappings":";;;;;;;;;;MAOa,gBAAgB,GAAGA,mBAAa,CAAsB,IAAI;AAEvE,MAAM,QAAQ,GAAG,CAAC,KAAgB,KAAI;AACrC,IAAA,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,SAAS,EAAE,GAAG,KAAK;IACjE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAGC,cAAQ,CAAC,OAAO,CAAC;IAE7C,IAAI,CAAC,OAAO,EAAE;AACb,QAAA,OAAO,QAAQ;IAChB;IAEA,MAAM,KAAK,GAAG,MAAM,SAAS,CAAC,KAAK,CAAC;AAEpC,IAAA,MAAM,mBAAmB,GAAG,CAAC,CAAU,KAAI;QAC1C,SAAS,CAAC,CAAC,CAAC;AACZ,QAAA,IAAI,KAAK,CAAC,eAAe,EAAE;AAC1B,YAAA,KAAK,CAAC,eAAe,CAAC,CAAC,CAAC;QACzB;AACD,IAAA,CAAC;IAEDC,eAAS,CAAC,MAAK;QACd,SAAS,CAAC,OAAO,CAAC;AACnB,IAAA,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;AAEb,IAAA,QACCC,cAAA,CAACC,aAAK,IACL,OAAO,EAAC,OAAO,EACf,QAAQ,EAAC,QAAQ,EACjB,OAAO,EACND,eAAC,gBAAgB,CAAC,QAAQ,EAAA,EAAC,KAAK,EAAE,KAAK,YACtCA,cAAA,CAACE,YAAI,IACJ,SAAS,EAAC,oBAAoB,EAC9B,KAAK,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,YAEzB,OAAO,OAAO,KAAK;AACnB,sBAAE,OAAO,CAAC,KAAK;sBACb,OAAO,EAAA,CACJ,EAAA,CACoB,KAEzB,SAAS,EACb,SAAS,EAAA,IAAA,EACT,OAAO,EAAE,MAAM,EACf,eAAe,EAAE,mBAAmB,YAEnC,QAAQ,EAAA,CACF;AAEV;AAEA,QAAQ,CAAC,IAAI,GAAGC,YAAI;;;;;"}
|
|
@@ -3,19 +3,35 @@
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
5
|
var jsxRuntime = require('react/jsx-runtime');
|
|
6
|
+
var react = require('react');
|
|
6
7
|
var list = require('../list/list.js');
|
|
7
8
|
var popup = require('../popup/popup.js');
|
|
9
|
+
var dropdown = require('./dropdown.js');
|
|
8
10
|
|
|
9
11
|
const { Item: ListItem } = list.default;
|
|
10
12
|
const Item = (props) => {
|
|
11
|
-
const { more, moreProps, onClick, ...restProps } = props;
|
|
12
|
-
const
|
|
13
|
+
const { more, moreProps, onClick, ref: itemRef, children, ...restProps } = props;
|
|
14
|
+
const close = react.useContext(dropdown.DropdownCloseCtx);
|
|
15
|
+
const liRef = react.useRef(null);
|
|
16
|
+
const [position, setPosition] = react.useState("right");
|
|
17
|
+
const { position: morePosition, onVisibleChange: moreOnVisibleChange, width: moreWidth, ...restMoreProps } = moreProps ?? {};
|
|
18
|
+
const effectivePosition = morePosition ?? position;
|
|
19
|
+
const handleVisibleChange = (v) => {
|
|
20
|
+
if (v && liRef.current) {
|
|
21
|
+
const rect = liRef.current.getBoundingClientRect();
|
|
22
|
+
setPosition(rect.left > window.innerWidth / 2 ? "left" : "right");
|
|
23
|
+
}
|
|
24
|
+
moreOnVisibleChange?.(v);
|
|
25
|
+
};
|
|
26
|
+
const Li = (jsxRuntime.jsx(ListItem, { ref: itemRef ?? liRef, onClick: (e) => {
|
|
13
27
|
e.stopPropagation();
|
|
28
|
+
if (!more)
|
|
29
|
+
close?.();
|
|
14
30
|
onClick?.(e);
|
|
15
|
-
}, ...restProps }));
|
|
31
|
+
}, ...restProps, children: children }));
|
|
16
32
|
if (!more)
|
|
17
33
|
return Li;
|
|
18
|
-
return (jsxRuntime.jsx(popup.default, { position:
|
|
34
|
+
return (jsxRuntime.jsx(popup.default, { ...restMoreProps, position: effectivePosition, touchable: true, arrow: false, align: "start", offset: 11, hideDelay: 240, onVisibleChange: handleVisibleChange, content: jsxRuntime.jsx(list.default, { className: "i-dropdown-content", style: { minWidth: moreWidth }, onClick: (e) => e.stopPropagation(), children: more }), children: Li }));
|
|
19
35
|
};
|
|
20
36
|
|
|
21
37
|
exports.default = Item;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"item.js","sources":["../../../../packages/components/dropdown/item.tsx"],"sourcesContent":["import List from \"../list\";\nimport Popup from \"../popup\";\nimport { IDropItem } from \"./type\";\n\nconst { Item: ListItem } = List;\n\nconst Item = (props: IDropItem) => {\n
|
|
1
|
+
{"version":3,"file":"item.js","sources":["../../../../packages/components/dropdown/item.tsx"],"sourcesContent":["import { useContext, useRef, useState } from \"react\";\nimport List from \"../list\";\nimport Popup from \"../popup\";\nimport { DropdownCloseCtx } from \"./dropdown\";\nimport { IDropItem } from \"./type\";\n\nconst { Item: ListItem } = List;\n\nconst Item = (props: IDropItem) => {\n const {\n more,\n moreProps,\n onClick,\n ref: itemRef,\n children,\n ...restProps\n } = props;\n const close = useContext(DropdownCloseCtx);\n const liRef = useRef<HTMLLIElement>(null);\n const [position, setPosition] = useState<\"left\" | \"right\">(\"right\");\n\n const {\n position: morePosition,\n onVisibleChange: moreOnVisibleChange,\n width: moreWidth,\n ...restMoreProps\n } = moreProps ?? {};\n const effectivePosition = morePosition ?? position;\n\n const handleVisibleChange = (v: boolean) => {\n if (v && liRef.current) {\n const rect = liRef.current.getBoundingClientRect();\n setPosition(rect.left > window.innerWidth / 2 ? \"left\" : \"right\");\n }\n moreOnVisibleChange?.(v);\n };\n\n const Li = (\n <ListItem\n ref={itemRef ?? liRef}\n onClick={(e) => {\n e.stopPropagation();\n if (!more) close?.();\n onClick?.(e);\n }}\n {...restProps}\n >\n {children}\n </ListItem>\n );\n\n if (!more) return Li;\n\n return (\n <Popup\n {...restMoreProps}\n position={effectivePosition}\n touchable\n arrow={false}\n align=\"start\"\n offset={11}\n hideDelay={240}\n onVisibleChange={handleVisibleChange}\n content={\n <List\n className=\"i-dropdown-content\"\n style={{ minWidth: moreWidth }}\n onClick={(e) => e.stopPropagation()}\n >\n {more}\n </List>\n }\n >\n {Li}\n </Popup>\n );\n};\n\nexport default Item;\n"],"names":["List","useContext","DropdownCloseCtx","useRef","useState","_jsx","Popup"],"mappings":";;;;;;;;;;AAMA,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,GAAGA,YAAI;AAE/B,MAAM,IAAI,GAAG,CAAC,KAAgB,KAAI;AAC9B,IAAA,MAAM,EACF,IAAI,EACJ,SAAS,EACT,OAAO,EACP,GAAG,EAAE,OAAO,EACZ,QAAQ,EACR,GAAG,SAAS,EACf,GAAG,KAAK;AACT,IAAA,MAAM,KAAK,GAAGC,gBAAU,CAACC,yBAAgB,CAAC;AAC1C,IAAA,MAAM,KAAK,GAAGC,YAAM,CAAgB,IAAI,CAAC;IACzC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAGC,cAAQ,CAAmB,OAAO,CAAC;IAEnE,MAAM,EACF,QAAQ,EAAE,YAAY,EACtB,eAAe,EAAE,mBAAmB,EACpC,KAAK,EAAE,SAAS,EAChB,GAAG,aAAa,EACnB,GAAG,SAAS,IAAI,EAAE;AACnB,IAAA,MAAM,iBAAiB,GAAG,YAAY,IAAI,QAAQ;AAElD,IAAA,MAAM,mBAAmB,GAAG,CAAC,CAAU,KAAI;AACvC,QAAA,IAAI,CAAC,IAAI,KAAK,CAAC,OAAO,EAAE;YACpB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,qBAAqB,EAAE;AAClD,YAAA,WAAW,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,UAAU,GAAG,CAAC,GAAG,MAAM,GAAG,OAAO,CAAC;QACrE;AACA,QAAA,mBAAmB,GAAG,CAAC,CAAC;AAC5B,IAAA,CAAC;AAED,IAAA,MAAM,EAAE,IACJC,cAAA,CAAC,QAAQ,IACL,GAAG,EAAE,OAAO,IAAI,KAAK,EACrB,OAAO,EAAE,CAAC,CAAC,KAAI;YACX,CAAC,CAAC,eAAe,EAAE;AACnB,YAAA,IAAI,CAAC,IAAI;gBAAE,KAAK,IAAI;AACpB,YAAA,OAAO,GAAG,CAAC,CAAC;AAChB,QAAA,CAAC,KACG,SAAS,EAAA,QAAA,EAEZ,QAAQ,EAAA,CACF,CACd;AAED,IAAA,IAAI,CAAC,IAAI;AAAE,QAAA,OAAO,EAAE;AAEpB,IAAA,QACIA,cAAA,CAACC,aAAK,EAAA,EAAA,GACE,aAAa,EACjB,QAAQ,EAAE,iBAAiB,EAC3B,SAAS,EAAA,IAAA,EACT,KAAK,EAAE,KAAK,EACZ,KAAK,EAAC,OAAO,EACb,MAAM,EAAE,EAAE,EACV,SAAS,EAAE,GAAG,EACd,eAAe,EAAE,mBAAmB,EACpC,OAAO,EACHD,cAAA,CAACL,YAAI,EAAA,EACD,SAAS,EAAC,oBAAoB,EAC9B,KAAK,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EAC9B,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,eAAe,EAAE,EAAA,QAAA,EAElC,IAAI,EAAA,CACF,EAAA,QAAA,EAGV,EAAE,EAAA,CACC;AAEhB;;;;"}
|
|
@@ -32,7 +32,13 @@ const Editor = (props) => {
|
|
|
32
32
|
const [memtionRect, setMemtionRect] = react.useState(null);
|
|
33
33
|
const [memtionKeyword, setMemtionKeyword] = react.useState("");
|
|
34
34
|
const [memtionActiveIndex, setMemtionActiveIndex] = react.useState(0);
|
|
35
|
-
const
|
|
35
|
+
const [activeMemtionIndex, setActiveMemtionIndex] = react.useState(-1);
|
|
36
|
+
const memtionOptions = react.useMemo(() => {
|
|
37
|
+
if (activeMemtionIndex < 0 || !memtion$1?.length)
|
|
38
|
+
return [];
|
|
39
|
+
const active = memtion$1?.[activeMemtionIndex];
|
|
40
|
+
return memtion.filterMemtionOptions(active?.options ?? [], memtionKeyword);
|
|
41
|
+
}, [memtion$1, memtionKeyword, activeMemtionIndex]);
|
|
36
42
|
const sanitizeValue = (nextValue) => {
|
|
37
43
|
if (isPlaintextMode) {
|
|
38
44
|
return nextValue === "\n" ? "" : nextValue;
|
|
@@ -87,18 +93,20 @@ const Editor = (props) => {
|
|
|
87
93
|
setMemtionRect(null);
|
|
88
94
|
setMemtionKeyword("");
|
|
89
95
|
setMemtionActiveIndex(0);
|
|
96
|
+
setActiveMemtionIndex(-1);
|
|
90
97
|
};
|
|
91
98
|
const syncEditorState = () => {
|
|
92
99
|
selectionRef.current = null;
|
|
93
100
|
hideMemtion();
|
|
94
101
|
};
|
|
95
102
|
const insertMemtion = (option) => {
|
|
103
|
+
const activeMemtion = memtion$1?.[activeMemtionIndex];
|
|
96
104
|
const replaceRange = memtion.getMemtionReplaceRange(memtionTriggerRangeRef.current, selectionRef.current);
|
|
97
105
|
const range = memtion.insertMemtionOption({
|
|
98
106
|
editor: editorRef.current,
|
|
99
107
|
range: replaceRange,
|
|
100
108
|
mode,
|
|
101
|
-
memtion:
|
|
109
|
+
memtion: activeMemtion,
|
|
102
110
|
option,
|
|
103
111
|
sanitizeValue,
|
|
104
112
|
});
|
|
@@ -134,7 +142,6 @@ const Editor = (props) => {
|
|
|
134
142
|
editorRef.current?.dispatchEvent(new Event("input", { bubbles: true }));
|
|
135
143
|
return;
|
|
136
144
|
}
|
|
137
|
-
const memtionKey = memtion$1?.key ?? "@";
|
|
138
145
|
if (memtionVisible && e.key === " ") {
|
|
139
146
|
hideMemtion();
|
|
140
147
|
}
|
|
@@ -154,11 +161,15 @@ const Editor = (props) => {
|
|
|
154
161
|
return;
|
|
155
162
|
}
|
|
156
163
|
}
|
|
157
|
-
if (memtion$1
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
164
|
+
if (memtion$1?.length) {
|
|
165
|
+
const matchedIndex = memtion$1.findIndex((m) => e.key === m.key);
|
|
166
|
+
if (matchedIndex >= 0) {
|
|
167
|
+
rememberSelection();
|
|
168
|
+
memtionTriggerRangeRef.current =
|
|
169
|
+
selectionRef.current?.cloneRange() ?? null;
|
|
170
|
+
pendingMemtionRef.current = true;
|
|
171
|
+
setActiveMemtionIndex(matchedIndex);
|
|
172
|
+
}
|
|
162
173
|
}
|
|
163
174
|
switch (e.key) {
|
|
164
175
|
case "Tab":
|
|
@@ -206,8 +217,13 @@ const Editor = (props) => {
|
|
|
206
217
|
setEditorValue(nextValue);
|
|
207
218
|
}
|
|
208
219
|
rememberSelection();
|
|
209
|
-
if (
|
|
210
|
-
const
|
|
220
|
+
if (activeMemtionIndex >= 0 && (pendingMemtionRef.current || memtionVisible)) {
|
|
221
|
+
const active = memtion$1?.[activeMemtionIndex];
|
|
222
|
+
if (!active) {
|
|
223
|
+
hideMemtion();
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
const memtionKey = active.key ?? "@";
|
|
211
227
|
const memtionText = memtion.getMemtionText(memtionTriggerRangeRef.current, selectionRef.current);
|
|
212
228
|
if (!memtionText.startsWith(memtionKey) || /\s/.test(memtionText)) {
|
|
213
229
|
hideMemtion();
|
|
@@ -262,7 +278,7 @@ const Editor = (props) => {
|
|
|
262
278
|
...style,
|
|
263
279
|
[autosize ? "minHeight" : "height"]: height,
|
|
264
280
|
width,
|
|
265
|
-
}, children: [!hideControl && (jsxRuntime.jsx("div", { className: "i-editor-controls", children: controls$1 })), memtion$1 && (jsxRuntime.jsx(memtion.default, { visible: memtionVisible, rect: memtionRect, options: memtionOptions, activeIndex: memtionActiveIndex, onActiveChange: setMemtionActiveIndex, onSelect: insertMemtion })), jsxRuntime.jsx("div", { ref: handleRef, className: "i-editor-content", "data-placeholder": placeholder, contentEditable: isPlaintextMode ? "plaintext-only" : true, onFocus: handleFocus, onBlur: handleBlur, onMouseUp: handleMouseUp, onPaste: handlePaste, onInput: handleInput, onKeyUp: handleKeyUp, onKeyDown: handleKeyDown, ...restProps })] }));
|
|
281
|
+
}, children: [!hideControl && (jsxRuntime.jsx("div", { className: "i-editor-controls", children: controls$1 })), memtion$1?.length && (jsxRuntime.jsx(memtion.default, { visible: memtionVisible, rect: memtionRect, options: memtionOptions, activeIndex: memtionActiveIndex, onActiveChange: setMemtionActiveIndex, onSelect: insertMemtion })), jsxRuntime.jsx("div", { ref: handleRef, className: "i-editor-content", "data-placeholder": placeholder, contentEditable: isPlaintextMode ? "plaintext-only" : true, onFocus: handleFocus, onBlur: handleBlur, onMouseUp: handleMouseUp, onPaste: handlePaste, onInput: handleInput, onKeyUp: handleKeyUp, onKeyDown: handleKeyDown, ...restProps })] }));
|
|
266
282
|
};
|
|
267
283
|
|
|
268
284
|
exports.default = Editor;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"editor.js","sources":["../../../../packages/components/editor/editor.tsx"],"sourcesContent":["import classNames from \"classnames\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport xss from \"xss\";\nimport { IButton } from \"../button/type\";\nimport getControls, { exec, xssOptions } from \"./controls\";\nimport \"./index.css\";\nimport Memtion, {\n filterMemtionOptions,\n getMemtionReplaceRange,\n getMemtionText,\n getSelectionRect,\n insertMemtionOption,\n removeAdjacentMemtionTag,\n sanitizePlaintextOnMemtionHtml,\n} from \"./memtion\";\nimport { IEditor, IEditorMemtionOption } from \"./type\";\n\nconst controlBtnProps: IButton = {\n square: true,\n flat: true,\n size: \"small\",\n};\n\nconst Editor = (props: IEditor) => {\n const {\n ref,\n value = \"\",\n width,\n height = \"10em\",\n placeholder,\n autosize,\n border = true,\n mode = \"rich\",\n hideControl,\n addtionControls,\n memtion,\n className,\n style,\n onChange,\n onEnter,\n onFocus,\n onBlur,\n onPaste,\n onMouseUp,\n onKeyUp,\n onKeyDown,\n ...restProps\n } = props;\n const editorRef = useRef<HTMLDivElement>(null);\n const selectionRef = useRef<Range | null>(null);\n const memtionTriggerRangeRef = useRef<Range | null>(null);\n const pendingMemtionRef = useRef(false);\n const isPlaintextMode = mode === \"plaintext\";\n const isRichMode = mode === \"rich\";\n const isPlaintextOnMemtionMode = mode === \"plaintextOnMemtion\";\n const [memtionVisible, setMemtionVisible] = useState(false);\n const [memtionRect, setMemtionRect] = useState<DOMRect | null>(null);\n const [memtionKeyword, setMemtionKeyword] = useState(\"\");\n const [memtionActiveIndex, setMemtionActiveIndex] = useState(0);\n const memtionOptions = useMemo(\n () => filterMemtionOptions(memtion?.options ?? [], memtionKeyword),\n [memtion?.options, memtionKeyword],\n );\n\n const sanitizeValue = (nextValue: string) => {\n if (isPlaintextMode) {\n return nextValue === \"\\n\" ? \"\" : nextValue;\n }\n\n const safeHtml = isPlaintextOnMemtionMode\n ? sanitizePlaintextOnMemtionHtml(xss(nextValue, xssOptions))\n : xss(nextValue, xssOptions);\n\n return safeHtml === \"<br>\" ? \"\" : safeHtml;\n };\n\n const syncHeight = () => {\n if (autosize && editorRef.current) {\n editorRef.current.style.height = `${editorRef.current.scrollHeight}px`;\n }\n };\n\n const rememberSelection = () => {\n if (!editorRef.current) return;\n\n const selection = window.getSelection();\n if (!selection?.rangeCount) return;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const parent =\n container.nodeType === Node.ELEMENT_NODE\n ? (container as Element)\n : container.parentElement;\n\n if (!parent || !editorRef.current.contains(parent)) return;\n\n selectionRef.current = range.cloneRange();\n };\n\n const setEditorValue = (nextValue: string) => {\n if (!editorRef.current) return;\n\n const safeValue = sanitizeValue(nextValue);\n\n if (isPlaintextMode) {\n editorRef.current.textContent = safeValue;\n return;\n }\n\n editorRef.current.innerHTML = safeValue;\n };\n\n const getEditorValue = (sanitize = false) => {\n const nextValue = !editorRef.current\n ? \"\"\n : isPlaintextMode\n ? (editorRef.current.textContent ?? \"\")\n : editorRef.current.innerHTML;\n\n return sanitize ? sanitizeValue(nextValue) : nextValue;\n };\n\n const hideMemtion = () => {\n pendingMemtionRef.current = false;\n memtionTriggerRangeRef.current = null;\n setMemtionVisible(false);\n setMemtionRect(null);\n setMemtionKeyword(\"\");\n setMemtionActiveIndex(0);\n };\n\n const syncEditorState = () => {\n selectionRef.current = null;\n hideMemtion();\n };\n\n const insertMemtion = (option: IEditorMemtionOption) => {\n const replaceRange = getMemtionReplaceRange(\n memtionTriggerRangeRef.current,\n selectionRef.current,\n );\n\n const range = insertMemtionOption({\n editor: editorRef.current,\n range: replaceRange,\n mode,\n memtion,\n option,\n sanitizeValue,\n });\n\n if (!range || !editorRef.current) return;\n\n selectionRef.current = range.cloneRange();\n hideMemtion();\n editorRef.current.dispatchEvent(new Event(\"input\", { bubbles: true }));\n };\n\n const handlePaste = (e) => {\n onPaste?.(e);\n\n if (e.defaultPrevented) return;\n\n e.preventDefault();\n\n const html = e.clipboardData.getData(\"text/html\");\n const text = e.clipboardData.getData(\"text/plain\");\n const pasteValue = isPlaintextMode\n ? text\n : html\n ? sanitizeValue(html)\n : text;\n\n exec(isPlaintextMode ? \"insertText\" : \"insertHTML\", false, pasteValue);\n };\n\n const handleKeyDown = (e) => {\n onKeyDown?.(e);\n\n if (e.defaultPrevented) return;\n\n if (\n !isPlaintextMode &&\n (e.key === \"Backspace\" || e.key === \"Delete\") &&\n removeAdjacentMemtionTag(editorRef.current, e.key)\n ) {\n e.preventDefault();\n rememberSelection();\n editorRef.current?.dispatchEvent(\n new Event(\"input\", { bubbles: true }),\n );\n return;\n }\n\n const memtionKey = memtion?.key ?? \"@\";\n if (memtionVisible && e.key === \" \") {\n hideMemtion();\n }\n\n if (memtionVisible && memtionOptions.length) {\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setMemtionActiveIndex((index) =>\n index + 1 >= memtionOptions.length ? 0 : index + 1,\n );\n return;\n case \"ArrowUp\":\n e.preventDefault();\n setMemtionActiveIndex((index) =>\n index - 1 < 0 ? memtionOptions.length - 1 : index - 1,\n );\n return;\n case \"Enter\":\n e.preventDefault();\n insertMemtion(memtionOptions[memtionActiveIndex]);\n return;\n default:\n break;\n }\n }\n\n if (memtion && e.key === memtionKey) {\n rememberSelection();\n memtionTriggerRangeRef.current =\n selectionRef.current?.cloneRange() ?? null;\n pendingMemtionRef.current = true;\n }\n\n switch (e.key) {\n case \"Tab\":\n e.preventDefault();\n exec(\n isRichMode ? \"insertHTML\" : \"insertText\",\n false,\n isRichMode ? \"	\" : \"\\t\",\n );\n break;\n case \"Enter\":\n if (e.shiftKey) {\n break;\n }\n if (!onEnter) break;\n e.preventDefault();\n onEnter(e);\n break;\n default:\n break;\n }\n };\n\n useEffect(() => {\n if (!editorRef.current) return;\n const nextValue = sanitizeValue(value);\n if (getEditorValue(true) === nextValue) return;\n\n setEditorValue(nextValue);\n syncEditorState();\n syncHeight();\n }, [autosize, mode, value]);\n\n useEffect(() => {\n if (!memtionOptions.length) {\n setMemtionActiveIndex(0);\n return;\n }\n\n setMemtionActiveIndex((index) =>\n index >= memtionOptions.length ? 0 : index,\n );\n }, [memtionOptions]);\n\n const handleInput = (e) => {\n const rawValue = getEditorValue();\n let nextValue = sanitizeValue(rawValue);\n\n if (\n isPlaintextOnMemtionMode &&\n rawValue !== nextValue &&\n editorRef.current\n ) {\n setEditorValue(nextValue);\n }\n\n if (!nextValue && rawValue && editorRef.current) {\n nextValue = \"\";\n setEditorValue(nextValue);\n }\n\n rememberSelection();\n\n if (memtion && (pendingMemtionRef.current || memtionVisible)) {\n const memtionKey = memtion?.key ?? \"@\";\n const memtionText = getMemtionText(\n memtionTriggerRangeRef.current,\n selectionRef.current,\n );\n\n if (!memtionText.startsWith(memtionKey) || /\\s/.test(memtionText)) {\n hideMemtion();\n } else {\n const keyword = memtionText.slice(memtionKey.length);\n pendingMemtionRef.current = false;\n setMemtionRect(getSelectionRect(selectionRef.current));\n setMemtionKeyword(keyword);\n setMemtionActiveIndex(0);\n setMemtionVisible(true);\n }\n }\n\n syncHeight();\n\n onChange?.(nextValue, e);\n };\n\n const handleFocus = (e) => {\n rememberSelection();\n onFocus?.(e);\n };\n\n const handleBlur = (e) => {\n hideMemtion();\n onBlur?.(e);\n };\n\n const handleMouseUp = (e) => {\n rememberSelection();\n onMouseUp?.(e);\n };\n\n const handleKeyUp = (e) => {\n rememberSelection();\n onKeyUp?.(e);\n };\n\n const handleRef = (node: HTMLDivElement | null) => {\n editorRef.current = node;\n\n if (typeof ref === \"function\") {\n ref(node);\n return;\n }\n\n if (ref) {\n ref.current = node;\n }\n };\n\n const getSelection = useCallback(\n () => selectionRef.current?.cloneRange() ?? null,\n [],\n );\n\n const controls = useMemo(\n () =>\n getControls({\n controlBtnProps,\n addtionControls,\n getSelection,\n }),\n [addtionControls, getSelection],\n );\n\n return (\n <div\n className={classNames(\"i-editor\", className, {\n \"i-editor-borderless\": !border,\n })}\n style={{\n ...style,\n [autosize ? \"minHeight\" : \"height\"]: height,\n width,\n }}\n >\n {!hideControl && (\n <div className=\"i-editor-controls\">{controls}</div>\n )}\n\n {memtion && (\n <Memtion\n visible={memtionVisible}\n rect={memtionRect}\n options={memtionOptions}\n activeIndex={memtionActiveIndex}\n onActiveChange={setMemtionActiveIndex}\n onSelect={insertMemtion}\n />\n )}\n\n <div\n ref={handleRef}\n className=\"i-editor-content\"\n data-placeholder={placeholder}\n contentEditable={isPlaintextMode ? \"plaintext-only\" : true}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onMouseUp={handleMouseUp}\n onPaste={handlePaste}\n onInput={handleInput}\n onKeyUp={handleKeyUp}\n onKeyDown={handleKeyDown}\n {...restProps}\n />\n </div>\n );\n};\n\nexport default Editor;\n"],"names":["memtion","useRef","useState","useMemo","filterMemtionOptions","sanitizePlaintextOnMemtionHtml","xss","xssOptions","getMemtionReplaceRange","insertMemtionOption","exec","removeAdjacentMemtionTag","useEffect","getMemtionText","getSelectionRect","useCallback","controls","getControls","_jsxs","classNames","_jsx","Memtion"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"editor.js","sources":["../../../../packages/components/editor/editor.tsx"],"sourcesContent":["import classNames from \"classnames\";\nimport { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport xss from \"xss\";\nimport { IButton } from \"../button/type\";\nimport getControls, { exec, xssOptions } from \"./controls\";\nimport \"./index.css\";\nimport Memtion, {\n filterMemtionOptions,\n getMemtionReplaceRange,\n getMemtionText,\n getSelectionRect,\n insertMemtionOption,\n removeAdjacentMemtionTag,\n sanitizePlaintextOnMemtionHtml,\n} from \"./memtion\";\nimport { IEditor, IEditorMemtionOption } from \"./type\";\n\nconst controlBtnProps: IButton = {\n square: true,\n flat: true,\n size: \"small\",\n};\n\nconst Editor = (props: IEditor) => {\n const {\n ref,\n value = \"\",\n width,\n height = \"10em\",\n placeholder,\n autosize,\n border = true,\n mode = \"rich\",\n hideControl,\n addtionControls,\n memtion,\n className,\n style,\n onChange,\n onEnter,\n onFocus,\n onBlur,\n onPaste,\n onMouseUp,\n onKeyUp,\n onKeyDown,\n ...restProps\n } = props;\n const editorRef = useRef<HTMLDivElement>(null);\n const selectionRef = useRef<Range | null>(null);\n const memtionTriggerRangeRef = useRef<Range | null>(null);\n const pendingMemtionRef = useRef(false);\n const isPlaintextMode = mode === \"plaintext\";\n const isRichMode = mode === \"rich\";\n const isPlaintextOnMemtionMode = mode === \"plaintextOnMemtion\";\n const [memtionVisible, setMemtionVisible] = useState(false);\n const [memtionRect, setMemtionRect] = useState<DOMRect | null>(null);\n const [memtionKeyword, setMemtionKeyword] = useState(\"\");\n const [memtionActiveIndex, setMemtionActiveIndex] = useState(0);\n const [activeMemtionIndex, setActiveMemtionIndex] = useState(-1);\n const memtionOptions = useMemo(\n () => {\n if (activeMemtionIndex < 0 || !memtion?.length) return [];\n const active = memtion?.[activeMemtionIndex];\n return filterMemtionOptions(active?.options ?? [], memtionKeyword);\n },\n [memtion, memtionKeyword, activeMemtionIndex],\n );\n\n const sanitizeValue = (nextValue: string) => {\n if (isPlaintextMode) {\n return nextValue === \"\\n\" ? \"\" : nextValue;\n }\n\n const safeHtml = isPlaintextOnMemtionMode\n ? sanitizePlaintextOnMemtionHtml(xss(nextValue, xssOptions))\n : xss(nextValue, xssOptions);\n\n return safeHtml === \"<br>\" ? \"\" : safeHtml;\n };\n\n const syncHeight = () => {\n if (autosize && editorRef.current) {\n editorRef.current.style.height = `${editorRef.current.scrollHeight}px`;\n }\n };\n\n const rememberSelection = () => {\n if (!editorRef.current) return;\n\n const selection = window.getSelection();\n if (!selection?.rangeCount) return;\n\n const range = selection.getRangeAt(0);\n const container = range.commonAncestorContainer;\n const parent =\n container.nodeType === Node.ELEMENT_NODE\n ? (container as Element)\n : container.parentElement;\n\n if (!parent || !editorRef.current.contains(parent)) return;\n\n selectionRef.current = range.cloneRange();\n };\n\n const setEditorValue = (nextValue: string) => {\n if (!editorRef.current) return;\n\n const safeValue = sanitizeValue(nextValue);\n\n if (isPlaintextMode) {\n editorRef.current.textContent = safeValue;\n return;\n }\n\n editorRef.current.innerHTML = safeValue;\n };\n\n const getEditorValue = (sanitize = false) => {\n const nextValue = !editorRef.current\n ? \"\"\n : isPlaintextMode\n ? (editorRef.current.textContent ?? \"\")\n : editorRef.current.innerHTML;\n\n return sanitize ? sanitizeValue(nextValue) : nextValue;\n };\n\n const hideMemtion = () => {\n pendingMemtionRef.current = false;\n memtionTriggerRangeRef.current = null;\n setMemtionVisible(false);\n setMemtionRect(null);\n setMemtionKeyword(\"\");\n setMemtionActiveIndex(0);\n setActiveMemtionIndex(-1);\n };\n\n const syncEditorState = () => {\n selectionRef.current = null;\n hideMemtion();\n };\n\n const insertMemtion = (option: IEditorMemtionOption) => {\n const activeMemtion = memtion?.[activeMemtionIndex];\n const replaceRange = getMemtionReplaceRange(\n memtionTriggerRangeRef.current,\n selectionRef.current,\n );\n\n const range = insertMemtionOption({\n editor: editorRef.current,\n range: replaceRange,\n mode,\n memtion: activeMemtion,\n option,\n sanitizeValue,\n });\n\n if (!range || !editorRef.current) return;\n\n selectionRef.current = range.cloneRange();\n hideMemtion();\n editorRef.current.dispatchEvent(new Event(\"input\", { bubbles: true }));\n };\n\n const handlePaste = (e) => {\n onPaste?.(e);\n\n if (e.defaultPrevented) return;\n\n e.preventDefault();\n\n const html = e.clipboardData.getData(\"text/html\");\n const text = e.clipboardData.getData(\"text/plain\");\n const pasteValue = isPlaintextMode\n ? text\n : html\n ? sanitizeValue(html)\n : text;\n\n exec(isPlaintextMode ? \"insertText\" : \"insertHTML\", false, pasteValue);\n };\n\n const handleKeyDown = (e) => {\n onKeyDown?.(e);\n\n if (e.defaultPrevented) return;\n\n if (\n !isPlaintextMode &&\n (e.key === \"Backspace\" || e.key === \"Delete\") &&\n removeAdjacentMemtionTag(editorRef.current, e.key)\n ) {\n e.preventDefault();\n rememberSelection();\n editorRef.current?.dispatchEvent(\n new Event(\"input\", { bubbles: true }),\n );\n return;\n }\n\n if (memtionVisible && e.key === \" \") {\n hideMemtion();\n }\n\n if (memtionVisible && memtionOptions.length) {\n switch (e.key) {\n case \"ArrowDown\":\n e.preventDefault();\n setMemtionActiveIndex((index) =>\n index + 1 >= memtionOptions.length ? 0 : index + 1,\n );\n return;\n case \"ArrowUp\":\n e.preventDefault();\n setMemtionActiveIndex((index) =>\n index - 1 < 0 ? memtionOptions.length - 1 : index - 1,\n );\n return;\n case \"Enter\":\n e.preventDefault();\n insertMemtion(memtionOptions[memtionActiveIndex]);\n return;\n default:\n break;\n }\n }\n\n if (memtion?.length) {\n const matchedIndex = memtion.findIndex((m) => e.key === m.key);\n if (matchedIndex >= 0) {\n rememberSelection();\n memtionTriggerRangeRef.current =\n selectionRef.current?.cloneRange() ?? null;\n pendingMemtionRef.current = true;\n setActiveMemtionIndex(matchedIndex);\n }\n }\n\n switch (e.key) {\n case \"Tab\":\n e.preventDefault();\n exec(\n isRichMode ? \"insertHTML\" : \"insertText\",\n false,\n isRichMode ? \"	\" : \"\\t\",\n );\n break;\n case \"Enter\":\n if (e.shiftKey) {\n break;\n }\n if (!onEnter) break;\n e.preventDefault();\n onEnter(e);\n break;\n default:\n break;\n }\n };\n\n useEffect(() => {\n if (!editorRef.current) return;\n const nextValue = sanitizeValue(value);\n if (getEditorValue(true) === nextValue) return;\n\n setEditorValue(nextValue);\n syncEditorState();\n syncHeight();\n }, [autosize, mode, value]);\n\n useEffect(() => {\n if (!memtionOptions.length) {\n setMemtionActiveIndex(0);\n return;\n }\n\n setMemtionActiveIndex((index) =>\n index >= memtionOptions.length ? 0 : index,\n );\n }, [memtionOptions]);\n\n const handleInput = (e) => {\n const rawValue = getEditorValue();\n let nextValue = sanitizeValue(rawValue);\n\n if (\n isPlaintextOnMemtionMode &&\n rawValue !== nextValue &&\n editorRef.current\n ) {\n setEditorValue(nextValue);\n }\n\n if (!nextValue && rawValue && editorRef.current) {\n nextValue = \"\";\n setEditorValue(nextValue);\n }\n\n rememberSelection();\n\n if (activeMemtionIndex >= 0 && (pendingMemtionRef.current || memtionVisible)) {\n const active = memtion?.[activeMemtionIndex];\n if (!active) { hideMemtion(); return; }\n const memtionKey = active.key ?? \"@\";\n const memtionText = getMemtionText(\n memtionTriggerRangeRef.current,\n selectionRef.current,\n );\n\n if (!memtionText.startsWith(memtionKey) || /\\s/.test(memtionText)) {\n hideMemtion();\n } else {\n const keyword = memtionText.slice(memtionKey.length);\n pendingMemtionRef.current = false;\n setMemtionRect(getSelectionRect(selectionRef.current));\n setMemtionKeyword(keyword);\n setMemtionActiveIndex(0);\n setMemtionVisible(true);\n }\n }\n\n syncHeight();\n\n onChange?.(nextValue, e);\n };\n\n const handleFocus = (e) => {\n rememberSelection();\n onFocus?.(e);\n };\n\n const handleBlur = (e) => {\n hideMemtion();\n onBlur?.(e);\n };\n\n const handleMouseUp = (e) => {\n rememberSelection();\n onMouseUp?.(e);\n };\n\n const handleKeyUp = (e) => {\n rememberSelection();\n onKeyUp?.(e);\n };\n\n const handleRef = (node: HTMLDivElement | null) => {\n editorRef.current = node;\n\n if (typeof ref === \"function\") {\n ref(node);\n return;\n }\n\n if (ref) {\n ref.current = node;\n }\n };\n\n const getSelection = useCallback(\n () => selectionRef.current?.cloneRange() ?? null,\n [],\n );\n\n const controls = useMemo(\n () =>\n getControls({\n controlBtnProps,\n addtionControls,\n getSelection,\n }),\n [addtionControls, getSelection],\n );\n\n return (\n <div\n className={classNames(\"i-editor\", className, {\n \"i-editor-borderless\": !border,\n })}\n style={{\n ...style,\n [autosize ? \"minHeight\" : \"height\"]: height,\n width,\n }}\n >\n {!hideControl && (\n <div className=\"i-editor-controls\">{controls}</div>\n )}\n\n {memtion?.length && (\n <Memtion\n visible={memtionVisible}\n rect={memtionRect}\n options={memtionOptions}\n activeIndex={memtionActiveIndex}\n onActiveChange={setMemtionActiveIndex}\n onSelect={insertMemtion}\n />\n )}\n\n <div\n ref={handleRef}\n className=\"i-editor-content\"\n data-placeholder={placeholder}\n contentEditable={isPlaintextMode ? \"plaintext-only\" : true}\n onFocus={handleFocus}\n onBlur={handleBlur}\n onMouseUp={handleMouseUp}\n onPaste={handlePaste}\n onInput={handleInput}\n onKeyUp={handleKeyUp}\n onKeyDown={handleKeyDown}\n {...restProps}\n />\n </div>\n );\n};\n\nexport default Editor;\n"],"names":["memtion","useRef","useState","useMemo","filterMemtionOptions","sanitizePlaintextOnMemtionHtml","xss","xssOptions","getMemtionReplaceRange","insertMemtionOption","exec","removeAdjacentMemtionTag","useEffect","getMemtionText","getSelectionRect","useCallback","controls","getControls","_jsxs","classNames","_jsx","Memtion"],"mappings":"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"}
|
|
@@ -11,14 +11,15 @@ var classNames__default = /*#__PURE__*/_interopDefaultCompat(classNames);
|
|
|
11
11
|
|
|
12
12
|
const Loading = (props) => {
|
|
13
13
|
const { icon, text, size, absolute, style, className, ...restProps } = props;
|
|
14
|
+
const iconSize = size != null
|
|
15
|
+
? { fontSize: typeof size === "number" ? `${size}px` : size }
|
|
16
|
+
: undefined;
|
|
14
17
|
return (jsxRuntime.jsxs("div", { className: classNames__default("i-loading-container", {
|
|
15
18
|
absolute,
|
|
16
19
|
}, className), style: {
|
|
17
20
|
...style,
|
|
18
21
|
inset: absolute ? 0 : "unset",
|
|
19
|
-
}, ...restProps, children: [icon ??
|
|
20
|
-
fontSize: size,
|
|
21
|
-
}, children: jsxRuntime.jsx("circle", { cx: '12', cy: '12', r: '9.5', fill: 'none', strokeWidth: '3', strokeLinecap: 'round', strokeDasharray: 40, strokeDashoffset: 0 }) })), text] }));
|
|
22
|
+
}, ...restProps, children: [icon ?? jsxRuntime.jsx("span", { className: "i-loading-icon", style: iconSize }), text] }));
|
|
22
23
|
};
|
|
23
24
|
|
|
24
25
|
exports.default = Loading;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"loading.js","sources":["../../../../packages/components/loading/loading.tsx"],"sourcesContent":["import classNames from \"classnames\";\nimport \"./index.css\";\nimport { ILoading } from \"./type\";\n\nconst Loading = (props: ILoading) => {\n
|
|
1
|
+
{"version":3,"file":"loading.js","sources":["../../../../packages/components/loading/loading.tsx"],"sourcesContent":["import classNames from \"classnames\";\nimport \"./index.css\";\nimport { ILoading } from \"./type\";\n\nconst Loading = (props: ILoading) => {\n const { icon, text, size, absolute, style, className, ...restProps } =\n props;\n const iconSize = size != null\n ? { fontSize: typeof size === \"number\" ? `${size}px` : size }\n : undefined;\n\n return (\n <div\n className={classNames(\n \"i-loading-container\",\n {\n absolute,\n },\n className,\n )}\n style={{\n ...style,\n inset: absolute ? 0 : \"unset\",\n }}\n {...restProps}\n >\n {icon ?? <span className=\"i-loading-icon\" style={iconSize}></span>}\n\n {text}\n </div>\n );\n};\n\nexport default Loading;\n"],"names":["_jsxs","classNames","_jsx"],"mappings":";;;;;;;;;;;AAIA,MAAM,OAAO,GAAG,CAAC,KAAe,KAAI;AAChC,IAAA,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE,GAAG,SAAS,EAAE,GAChE,KAAK;AACT,IAAA,MAAM,QAAQ,GAAG,IAAI,IAAI;AACrB,UAAE,EAAE,QAAQ,EAAE,OAAO,IAAI,KAAK,QAAQ,GAAG,GAAG,IAAI,CAAA,EAAA,CAAI,GAAG,IAAI;UACzD,SAAS;AAEf,IAAA,QACIA,eAAA,CAAA,KAAA,EAAA,EACI,SAAS,EAAEC,mBAAU,CACjB,qBAAqB,EACrB;YACI,QAAQ;AACX,SAAA,EACD,SAAS,CACZ,EACD,KAAK,EAAE;AACH,YAAA,GAAG,KAAK;YACR,KAAK,EAAE,QAAQ,GAAG,CAAC,GAAG,OAAO;AAChC,SAAA,EAAA,GACG,SAAS,EAAA,QAAA,EAAA,CAEZ,IAAI,IAAIC,cAAA,CAAA,MAAA,EAAA,EAAM,SAAS,EAAC,gBAAgB,EAAC,KAAK,EAAE,QAAQ,EAAA,CAAS,EAEjE,IAAI,CAAA,EAAA,CACH;AAEd;;;;"}
|
|
@@ -33,19 +33,7 @@ function Popup(props) {
|
|
|
33
33
|
const [show, setShow] = react.useState(false);
|
|
34
34
|
const showRef = react.useRef(false);
|
|
35
35
|
showRef.current = show;
|
|
36
|
-
const latestRef = react.useRef({
|
|
37
|
-
disabled,
|
|
38
|
-
trigger,
|
|
39
|
-
touchable,
|
|
40
|
-
showDelay,
|
|
41
|
-
hideDelay,
|
|
42
|
-
position,
|
|
43
|
-
gap,
|
|
44
|
-
offset,
|
|
45
|
-
align,
|
|
46
|
-
fitSize,
|
|
47
|
-
onVisibleChange,
|
|
48
|
-
});
|
|
36
|
+
const latestRef = react.useRef({});
|
|
49
37
|
latestRef.current = {
|
|
50
38
|
disabled,
|
|
51
39
|
trigger,
|
|
@@ -99,9 +87,8 @@ function Popup(props) {
|
|
|
99
87
|
};
|
|
100
88
|
const applyFitSize = () => {
|
|
101
89
|
const o = latestRef.current;
|
|
102
|
-
const triggerEl = triggerRef.current;
|
|
103
90
|
const contentEl = contentRef.current;
|
|
104
|
-
if (!
|
|
91
|
+
if (!contentEl)
|
|
105
92
|
return;
|
|
106
93
|
const vertical = ["top", "bottom"].includes(o.position);
|
|
107
94
|
const key = vertical ? "width" : "height";
|
|
@@ -109,6 +96,9 @@ function Popup(props) {
|
|
|
109
96
|
contentEl.style[key] = "";
|
|
110
97
|
return;
|
|
111
98
|
}
|
|
99
|
+
const triggerEl = triggerRef.current;
|
|
100
|
+
if (!triggerEl)
|
|
101
|
+
return;
|
|
112
102
|
const size = triggerEl[vertical ? "offsetWidth" : "offsetHeight"];
|
|
113
103
|
contentEl.style[key] =
|
|
114
104
|
typeof size === "number" ? `${size}px` : "";
|
|
@@ -345,8 +335,8 @@ function Popup(props) {
|
|
|
345
335
|
e.stopPropagation();
|
|
346
336
|
setTriggerEl(e);
|
|
347
337
|
pointRef.current = {
|
|
348
|
-
pageX: e.
|
|
349
|
-
pageY: e.
|
|
338
|
+
pageX: e.clientX,
|
|
339
|
+
pageY: e.clientY,
|
|
350
340
|
};
|
|
351
341
|
if (showRef.current) {
|
|
352
342
|
ensureBaseStyle();
|