@canvas-components/react-components 0.1.5 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +168 -168
- package/dist/index.cjs +1925 -653
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +309 -27
- package/dist/index.d.ts +309 -27
- package/dist/index.js +1920 -654
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/dist/index.cjs
CHANGED
|
@@ -47,7 +47,7 @@ function styleInject(css, { insertAt } = {}) {
|
|
|
47
47
|
}
|
|
48
48
|
|
|
49
49
|
// src/styles/variables.css
|
|
50
|
-
styleInject(":root {\n --canvas-react-color-primary: #1677ff;\n --canvas-react-color-primary-hover: #4096ff;\n --canvas-react-color-border: #d9d9d9;\n --canvas-react-color-border-strong: #bfbfbf;\n --canvas-react-color-text: #1f2937;\n --canvas-react-color-text-muted: #6b7280;\n --canvas-react-color-bg: #ffffff;\n --canvas-react-color-bg-soft: #f5f5f5;\n --canvas-react-color-bg-hover: #f3f4f6;\n --canvas-react-color-bg-active: #e6f4ff;\n --canvas-react-shadow-focus: 0 0 0 2px rgba(22, 119, 255, 0.12);\n --canvas-react-shadow-popup: 0 8px 24px rgba(15, 23, 42, 0.16);\n --canvas-react-radius-sm: 6px;\n --canvas-react-radius-md: 8px;\n --canvas-react-control-height: 32px;\n --canvas-react-font-size: 14px;\n --canvas-react-control-padding-inline: 11px;\n --canvas-react-control-padding-block: 0px;\n --canvas-react-content-zoom: 1;\n}\n");
|
|
50
|
+
styleInject(":root {\n --canvas-react-color-primary: #1677ff;\n --canvas-react-color-primary-hover: #4096ff;\n --canvas-react-color-border: #d9d9d9;\n --canvas-react-color-border-strong: #bfbfbf;\n --canvas-react-color-text: #1f2937;\n --canvas-react-color-text-muted: #6b7280;\n --canvas-react-color-bg: #ffffff;\n --canvas-react-color-bg-soft: #f5f5f5;\n --canvas-react-color-bg-hover: #f3f4f6;\n --canvas-react-color-bg-active: #e6f4ff;\n --canvas-react-shadow-focus: 0 0 0 2px rgba(22, 119, 255, 0.12);\n --canvas-react-shadow-popup: 0 8px 24px rgba(15, 23, 42, 0.16);\n --canvas-react-radius-sm: 6px;\n --canvas-react-radius-md: 8px;\n --canvas-react-control-height: 32px;\n --canvas-react-font-size: 14px;\n --canvas-react-control-padding-inline: 11px;\n --canvas-react-control-padding-block: 0px;\n --canvas-react-content-zoom: 1;\n}\n*,\n*::before,\n*::after {\n scrollbar-width: thin;\n scrollbar-color: #aeb4bd transparent;\n}\n*::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n*::-webkit-scrollbar-track {\n background: transparent;\n}\n*::-webkit-scrollbar-thumb {\n min-height: 32px;\n border: 2px solid transparent;\n border-radius: 999px;\n background: #aeb4bd;\n background-clip: content-box;\n}\n*::-webkit-scrollbar-thumb:hover {\n background: #8f98a5;\n background-clip: content-box;\n}\n*::-webkit-scrollbar-corner {\n background: transparent;\n}\n");
|
|
51
51
|
|
|
52
52
|
// src/shared/class-names.ts
|
|
53
53
|
function joinClassNames(...values) {
|
|
@@ -624,6 +624,770 @@ function resolvePopupSurfaceRect(element, contentScale = 1) {
|
|
|
624
624
|
};
|
|
625
625
|
}
|
|
626
626
|
|
|
627
|
+
// src/components/virtual-list/style.css
|
|
628
|
+
styleInject('@import "../../styles/variables.css";\n.canvas-react-virtual-list {\n position: relative;\n overflow-y: auto;\n}\n.canvas-react-virtual-list-inner {\n position: relative;\n min-width: 100%;\n}\n.canvas-react-virtual-list-empty {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 0 11px;\n color: #9ca3af;\n font-size: var(--canvas-react-font-size);\n}\n');
|
|
629
|
+
var ReactVirtualList = React.forwardRef(function ReactVirtualListInner(props, ref) {
|
|
630
|
+
const {
|
|
631
|
+
className,
|
|
632
|
+
empty,
|
|
633
|
+
height,
|
|
634
|
+
innerClassName,
|
|
635
|
+
itemHeight,
|
|
636
|
+
itemKey,
|
|
637
|
+
items,
|
|
638
|
+
overscan = 2,
|
|
639
|
+
renderItem,
|
|
640
|
+
style,
|
|
641
|
+
virtual = true
|
|
642
|
+
} = props;
|
|
643
|
+
const hostRef = React.useRef(null);
|
|
644
|
+
const [scrollTop, setScrollTop] = React.useState(0);
|
|
645
|
+
const useVirtual = virtual && items.length * itemHeight > height;
|
|
646
|
+
const startIndex = useVirtual ? Math.max(0, Math.floor(scrollTop / itemHeight) - overscan) : 0;
|
|
647
|
+
const endIndex = useVirtual ? Math.min(
|
|
648
|
+
items.length - 1,
|
|
649
|
+
Math.ceil((scrollTop + height) / itemHeight) + overscan
|
|
650
|
+
) : items.length - 1;
|
|
651
|
+
const visibleItems = React.useMemo(
|
|
652
|
+
() => items.slice(startIndex, endIndex + 1),
|
|
653
|
+
[endIndex, items, startIndex]
|
|
654
|
+
);
|
|
655
|
+
React.useImperativeHandle(ref, () => ({
|
|
656
|
+
scrollToIndex: (index) => {
|
|
657
|
+
const element = hostRef.current;
|
|
658
|
+
if (!element || index < 0) {
|
|
659
|
+
return;
|
|
660
|
+
}
|
|
661
|
+
const itemTop = index * itemHeight;
|
|
662
|
+
const itemBottom = itemTop + itemHeight;
|
|
663
|
+
const viewportTop = element.scrollTop;
|
|
664
|
+
const viewportBottom = viewportTop + height;
|
|
665
|
+
if (itemTop < viewportTop) {
|
|
666
|
+
element.scrollTop = itemTop;
|
|
667
|
+
return;
|
|
668
|
+
}
|
|
669
|
+
if (itemBottom > viewportBottom) {
|
|
670
|
+
element.scrollTop = itemBottom - height;
|
|
671
|
+
}
|
|
672
|
+
},
|
|
673
|
+
element: hostRef.current
|
|
674
|
+
}));
|
|
675
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
676
|
+
"div",
|
|
677
|
+
{
|
|
678
|
+
ref: hostRef,
|
|
679
|
+
className: joinClassNames(`${REACT_COMPONENT_PREFIX}-virtual-list`, className),
|
|
680
|
+
style: { height, ...style },
|
|
681
|
+
onScroll: (event) => {
|
|
682
|
+
setScrollTop(event.currentTarget.scrollTop);
|
|
683
|
+
},
|
|
684
|
+
children: items.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${REACT_COMPONENT_PREFIX}-virtual-list-empty`, children: empty ?? "\u6682\u65E0\u6570\u636E" }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
685
|
+
"div",
|
|
686
|
+
{
|
|
687
|
+
className: joinClassNames(
|
|
688
|
+
`${REACT_COMPONENT_PREFIX}-virtual-list-inner`,
|
|
689
|
+
innerClassName
|
|
690
|
+
),
|
|
691
|
+
style: { height: items.length * itemHeight },
|
|
692
|
+
children: visibleItems.map((item, index) => {
|
|
693
|
+
const itemIndex = startIndex + index;
|
|
694
|
+
return renderItem(item, itemIndex, {
|
|
695
|
+
style: useVirtual ? {
|
|
696
|
+
position: "absolute",
|
|
697
|
+
top: itemIndex * itemHeight,
|
|
698
|
+
left: 0,
|
|
699
|
+
right: 0,
|
|
700
|
+
height: itemHeight
|
|
701
|
+
} : {
|
|
702
|
+
height: itemHeight
|
|
703
|
+
}
|
|
704
|
+
});
|
|
705
|
+
})
|
|
706
|
+
}
|
|
707
|
+
)
|
|
708
|
+
}
|
|
709
|
+
);
|
|
710
|
+
});
|
|
711
|
+
|
|
712
|
+
// src/components/select/style.css
|
|
713
|
+
styleInject('@import "../../styles/variables.css";\n.canvas-react-select-wrap {\n position: relative;\n display: inline-flex;\n width: 100%;\n height: 100%;\n}\n.canvas-react-select {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n width: 100%;\n min-width: 0;\n height: var(--canvas-react-control-height);\n padding: var(--canvas-react-control-padding-block, 0px) var(--canvas-react-control-padding-inline, 11px);\n border: 1px solid var(--canvas-react-color-border);\n border-radius: var(--canvas-react-radius-sm);\n background: var(--canvas-react-color-bg);\n color: var(--canvas-react-color-text);\n font-size: var(--canvas-react-font-size);\n outline: none;\n cursor: pointer;\n transition:\n border-color 0.2s ease,\n box-shadow 0.2s ease,\n background-color 0.2s ease;\n}\n.canvas-react-select-input-wrap {\n flex: 1 1 auto;\n width: 100%;\n height: 100%;\n border: none;\n background: transparent;\n box-shadow: none;\n}\n.canvas-react-select .canvas-react-input-affix-wrapper {\n height: 100%;\n min-height: 0;\n}\n.canvas-react-select-input-wrap:hover,\n.canvas-react-select-input-wrap:focus-within {\n border-color: transparent;\n box-shadow: none;\n}\n.canvas-react-select-input {\n width: 100%;\n min-width: 0;\n height: 100%;\n padding: 0;\n line-height: normal;\n}\n.canvas-react-select-input::placeholder {\n color: #9ca3af;\n}\n.canvas-react-select:hover {\n border-color: var(--canvas-react-color-primary-hover);\n}\n.canvas-react-select:focus {\n border-color: var(--canvas-react-color-primary);\n box-shadow: var(--canvas-react-shadow-focus);\n}\n.canvas-react-select-open {\n border-color: var(--canvas-react-color-primary);\n box-shadow: var(--canvas-react-shadow-focus);\n}\n.canvas-react-select-disabled {\n color: #9ca3af;\n background: #fafafa;\n cursor: not-allowed;\n}\n.canvas-react-select-actions {\n position: relative;\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: 1em;\n min-width: 12px;\n height: 1em;\n min-height: 12px;\n margin-left: max(6px, calc(var(--canvas-react-control-padding-inline, 11px) * 0.5));\n}\n.canvas-react-select-arrow {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 0.5em;\n height: 0.5em;\n min-width: 6px;\n min-height: 6px;\n border-right: 1.5px solid var(--canvas-react-color-text-muted);\n border-bottom: 1.5px solid var(--canvas-react-color-text-muted);\n transform: translate(-50%, -58%) rotate(45deg);\n opacity: 1;\n transition:\n opacity 0.18s ease,\n transform 0.18s ease,\n border-color 0.18s ease;\n}\n.canvas-react-select:hover .canvas-react-select-arrow,\n.canvas-react-select-open .canvas-react-select-arrow {\n border-color: #6b7280;\n}\n.canvas-react-select-arrow-open {\n border-color: #6b7280;\n transform: translate(-50%, -42%) rotate(225deg);\n}\n.canvas-react-select-clear {\n position: absolute;\n top: 50%;\n left: 50%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n padding: 0;\n border: none;\n background: transparent;\n color: #9ca3af;\n opacity: 0;\n pointer-events: none;\n cursor: pointer;\n transform: translate(-50%, -50%) rotate(0deg);\n transition:\n color 0.2s ease,\n opacity 0.2s ease,\n transform 0.18s ease;\n}\n.canvas-react-select-clear:hover {\n color: #6b7280;\n transform: translate(-50%, -50%) rotate(90deg);\n}\n.canvas-react-select:hover .canvas-react-select-clear,\n.canvas-react-select-open .canvas-react-select-clear,\n.canvas-react-select:focus-within .canvas-react-select-clear {\n opacity: 1;\n pointer-events: auto;\n}\n.canvas-react-select:hover .canvas-react-select-actions-clearable .canvas-react-select-arrow,\n.canvas-react-select-open .canvas-react-select-actions-clearable .canvas-react-select-arrow,\n.canvas-react-select:focus-within .canvas-react-select-actions-clearable .canvas-react-select-arrow {\n opacity: 0;\n}\n.canvas-react-select-clear-icon,\n.canvas-react-select-clear-icon::before {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 8px;\n height: 1.25px;\n margin-top: -0.625px;\n margin-left: -4px;\n border-radius: 999px;\n background: currentColor;\n content: "";\n}\n.canvas-react-select-clear-icon {\n transform: rotate(45deg);\n}\n.canvas-react-select-clear-icon::before {\n transform: rotate(90deg);\n}\n.canvas-react-select-dropdown {\n padding: 4px;\n}\n.canvas-react-select-list {\n position: relative;\n overflow-y: auto;\n}\n.canvas-react-select-list-inner {\n position: relative;\n}\n.canvas-react-select-option {\n display: flex;\n align-items: center;\n box-sizing: border-box;\n width: 100%;\n padding: 0 11px;\n border-radius: var(--canvas-react-radius-sm);\n color: var(--canvas-react-color-text);\n font-size: var(--canvas-react-font-size);\n cursor: pointer;\n}\n.canvas-react-select-option:hover,\n.canvas-react-select-option-active {\n background: var(--canvas-react-color-bg-hover);\n}\n.canvas-react-select-option-selected {\n background: var(--canvas-react-color-bg-active);\n}\n.canvas-react-select-option-searching {\n color: var(--canvas-react-color-text);\n}\n.canvas-react-select-option-searching:hover,\n.canvas-react-select-option-searching.canvas-react-select-option-active {\n background: var(--canvas-react-color-bg-active);\n}\n.canvas-react-select-option-disabled {\n color: #9ca3af;\n cursor: not-allowed;\n}\n.canvas-react-select-option-highlight {\n color: var(--canvas-react-color-primary);\n font-weight: 600;\n}\n.canvas-react-select-option-disabled .canvas-react-select-option-highlight {\n color: inherit;\n}\n.canvas-react-select-empty {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 0 11px;\n color: #9ca3af;\n font-size: var(--canvas-react-font-size);\n}\n');
|
|
714
|
+
var ReactSelect = React.forwardRef(
|
|
715
|
+
function ReactSelect2(props, ref) {
|
|
716
|
+
const {
|
|
717
|
+
autoFocus,
|
|
718
|
+
allowCustomValue = false,
|
|
719
|
+
className,
|
|
720
|
+
disabled,
|
|
721
|
+
filterOption,
|
|
722
|
+
onBlur,
|
|
723
|
+
onChange,
|
|
724
|
+
onInputValueChange,
|
|
725
|
+
onPressEnter,
|
|
726
|
+
onFocus,
|
|
727
|
+
onKeyDown,
|
|
728
|
+
options,
|
|
729
|
+
optionHeight = 32,
|
|
730
|
+
listHeight = 224,
|
|
731
|
+
placeholder,
|
|
732
|
+
popupClassName,
|
|
733
|
+
popupZIndex,
|
|
734
|
+
allowClear = true,
|
|
735
|
+
showArrow = true,
|
|
736
|
+
showSearch = false,
|
|
737
|
+
style,
|
|
738
|
+
value,
|
|
739
|
+
virtual = true,
|
|
740
|
+
...restProps
|
|
741
|
+
} = props;
|
|
742
|
+
const triggerRef = React.useRef(null);
|
|
743
|
+
const inputRef = React.useRef(null);
|
|
744
|
+
const listRef = React.useRef(null);
|
|
745
|
+
const skipFocusOpenRef = React.useRef(false);
|
|
746
|
+
const [open, setOpen] = React.useState(false);
|
|
747
|
+
const selectedIndex = React.useMemo(
|
|
748
|
+
() => options.findIndex(
|
|
749
|
+
(option) => String(option.value) === String(value ?? "")
|
|
750
|
+
),
|
|
751
|
+
[options, value]
|
|
752
|
+
);
|
|
753
|
+
const selectedOption = selectedIndex >= 0 ? options[selectedIndex] : void 0;
|
|
754
|
+
const [keyword, setKeyword] = React.useState("");
|
|
755
|
+
const [searching, setSearching] = React.useState(false);
|
|
756
|
+
const searchKeyword = searching ? keyword : "";
|
|
757
|
+
const filteredOptions = React.useMemo(
|
|
758
|
+
() => filterSelectOptions(options, searchKeyword, showSearch, filterOption),
|
|
759
|
+
[filterOption, options, searchKeyword, showSearch]
|
|
760
|
+
);
|
|
761
|
+
const [activeIndex, setActiveIndex] = React.useState(() => {
|
|
762
|
+
return selectedIndex >= 0 ? selectedIndex : 0;
|
|
763
|
+
});
|
|
764
|
+
React.useImperativeHandle(ref, () => inputRef.current);
|
|
765
|
+
React.useEffect(() => {
|
|
766
|
+
if (autoFocus) {
|
|
767
|
+
inputRef.current?.focus();
|
|
768
|
+
}
|
|
769
|
+
}, [autoFocus]);
|
|
770
|
+
React.useLayoutEffect(() => {
|
|
771
|
+
if (open && showSearch && !searching) {
|
|
772
|
+
inputRef.current?.select();
|
|
773
|
+
}
|
|
774
|
+
}, [open, searching, showSearch]);
|
|
775
|
+
React.useEffect(() => {
|
|
776
|
+
const nextIndex = filteredOptions.findIndex(
|
|
777
|
+
(option) => String(option.value) === String(value ?? "")
|
|
778
|
+
);
|
|
779
|
+
setActiveIndex(nextIndex >= 0 ? nextIndex : 0);
|
|
780
|
+
}, [filteredOptions, value]);
|
|
781
|
+
React.useEffect(() => {
|
|
782
|
+
if (!open) {
|
|
783
|
+
return;
|
|
784
|
+
}
|
|
785
|
+
listRef.current?.scrollToIndex(activeIndex);
|
|
786
|
+
}, [activeIndex, listHeight, open, optionHeight]);
|
|
787
|
+
const selectOption = (option, trigger) => {
|
|
788
|
+
onChange?.(String(option.value), { trigger });
|
|
789
|
+
setKeyword(option.label);
|
|
790
|
+
setSearching(false);
|
|
791
|
+
setOpen(false);
|
|
792
|
+
inputRef.current?.focus();
|
|
793
|
+
};
|
|
794
|
+
const hasValue = value != null && String(value).length > 0;
|
|
795
|
+
const showClear = allowClear && !disabled && hasValue;
|
|
796
|
+
const handleClear = (event) => {
|
|
797
|
+
event.preventDefault();
|
|
798
|
+
event.stopPropagation();
|
|
799
|
+
skipFocusOpenRef.current = true;
|
|
800
|
+
setKeyword("");
|
|
801
|
+
setSearching(false);
|
|
802
|
+
setOpen(false);
|
|
803
|
+
onChange?.("", { trigger: "clear" });
|
|
804
|
+
inputRef.current?.blur();
|
|
805
|
+
};
|
|
806
|
+
const openSelect = () => {
|
|
807
|
+
setKeyword(
|
|
808
|
+
resolveSelectKeywordOnOpen(
|
|
809
|
+
selectedOption?.label ?? (allowCustomValue ? String(value ?? "") : void 0)
|
|
810
|
+
)
|
|
811
|
+
);
|
|
812
|
+
setSearching(false);
|
|
813
|
+
setOpen(true);
|
|
814
|
+
};
|
|
815
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("span", { className: `${REACT_COMPONENT_PREFIX}-select-wrap`, children: [
|
|
816
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
817
|
+
"div",
|
|
818
|
+
{
|
|
819
|
+
ref: triggerRef,
|
|
820
|
+
className: joinClassNames(
|
|
821
|
+
`${REACT_COMPONENT_PREFIX}-select`,
|
|
822
|
+
open && `${REACT_COMPONENT_PREFIX}-select-open`,
|
|
823
|
+
disabled && `${REACT_COMPONENT_PREFIX}-select-disabled`,
|
|
824
|
+
className
|
|
825
|
+
),
|
|
826
|
+
style,
|
|
827
|
+
onClick: (event) => {
|
|
828
|
+
if (disabled) {
|
|
829
|
+
return;
|
|
830
|
+
}
|
|
831
|
+
if (event.target?.closest(
|
|
832
|
+
`.${REACT_COMPONENT_PREFIX}-select-clear`
|
|
833
|
+
)) {
|
|
834
|
+
return;
|
|
835
|
+
}
|
|
836
|
+
if (event.target?.closest(
|
|
837
|
+
`.${REACT_COMPONENT_PREFIX}-select-arrow`
|
|
838
|
+
)) {
|
|
839
|
+
return;
|
|
840
|
+
}
|
|
841
|
+
inputRef.current?.focus();
|
|
842
|
+
if (!open) {
|
|
843
|
+
openSelect();
|
|
844
|
+
}
|
|
845
|
+
},
|
|
846
|
+
children: [
|
|
847
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
848
|
+
ReactInput,
|
|
849
|
+
{
|
|
850
|
+
...restProps,
|
|
851
|
+
ref: inputRef,
|
|
852
|
+
allowClear: false,
|
|
853
|
+
disabled,
|
|
854
|
+
readOnly: !showSearch,
|
|
855
|
+
value: open && showSearch ? keyword : selectedOption?.label ?? (allowCustomValue ? String(value ?? "") : ""),
|
|
856
|
+
className: joinClassNames(`${REACT_COMPONENT_PREFIX}-select-input`),
|
|
857
|
+
wrapperClassName: `${REACT_COMPONENT_PREFIX}-select-input-wrap`,
|
|
858
|
+
placeholder,
|
|
859
|
+
onFocus: (event) => {
|
|
860
|
+
if (skipFocusOpenRef.current) {
|
|
861
|
+
skipFocusOpenRef.current = false;
|
|
862
|
+
onFocus?.(event);
|
|
863
|
+
return;
|
|
864
|
+
}
|
|
865
|
+
if (!open) {
|
|
866
|
+
openSelect();
|
|
867
|
+
}
|
|
868
|
+
onFocus?.(event);
|
|
869
|
+
},
|
|
870
|
+
onBlur: (event) => {
|
|
871
|
+
setOpen(false);
|
|
872
|
+
if ((!keyword.trim() || !showSearch) && selectedOption) {
|
|
873
|
+
setKeyword(selectedOption.label);
|
|
874
|
+
}
|
|
875
|
+
onBlur?.(event);
|
|
876
|
+
},
|
|
877
|
+
onChange: (event) => {
|
|
878
|
+
if (!showSearch) {
|
|
879
|
+
return;
|
|
880
|
+
}
|
|
881
|
+
setKeyword(event.target.value);
|
|
882
|
+
setSearching(true);
|
|
883
|
+
onInputValueChange?.(event.target.value);
|
|
884
|
+
setOpen(true);
|
|
885
|
+
},
|
|
886
|
+
onKeyDown: (event) => {
|
|
887
|
+
onKeyDown?.(event);
|
|
888
|
+
if (event.defaultPrevented) {
|
|
889
|
+
return;
|
|
890
|
+
}
|
|
891
|
+
if (disabled) {
|
|
892
|
+
return;
|
|
893
|
+
}
|
|
894
|
+
if (event.key === "ArrowDown") {
|
|
895
|
+
event.preventDefault();
|
|
896
|
+
if (!open) {
|
|
897
|
+
openSelect();
|
|
898
|
+
return;
|
|
899
|
+
}
|
|
900
|
+
setActiveIndex(
|
|
901
|
+
(prev) => Math.min(prev + 1, Math.max(filteredOptions.length - 1, 0))
|
|
902
|
+
);
|
|
903
|
+
return;
|
|
904
|
+
}
|
|
905
|
+
if (event.key === "ArrowUp") {
|
|
906
|
+
event.preventDefault();
|
|
907
|
+
if (!open) {
|
|
908
|
+
openSelect();
|
|
909
|
+
return;
|
|
910
|
+
}
|
|
911
|
+
setActiveIndex((prev) => Math.max(prev - 1, 0));
|
|
912
|
+
return;
|
|
913
|
+
}
|
|
914
|
+
if (event.key === "Enter") {
|
|
915
|
+
event.preventDefault();
|
|
916
|
+
if (!open) {
|
|
917
|
+
openSelect();
|
|
918
|
+
return;
|
|
919
|
+
}
|
|
920
|
+
const targetOption = resolveSelectEnterOption(filteredOptions);
|
|
921
|
+
if (targetOption && !targetOption.disabled) {
|
|
922
|
+
selectOption(targetOption, "keyboard");
|
|
923
|
+
} else if (allowCustomValue && keyword.trim()) {
|
|
924
|
+
void Promise.resolve(onPressEnter?.(keyword.trim()));
|
|
925
|
+
}
|
|
926
|
+
return;
|
|
927
|
+
}
|
|
928
|
+
if (event.key === "Escape") {
|
|
929
|
+
setKeyword(selectedOption?.label ?? "");
|
|
930
|
+
setSearching(false);
|
|
931
|
+
setOpen(false);
|
|
932
|
+
}
|
|
933
|
+
}
|
|
934
|
+
}
|
|
935
|
+
),
|
|
936
|
+
showClear || showArrow ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
937
|
+
"span",
|
|
938
|
+
{
|
|
939
|
+
className: joinClassNames(
|
|
940
|
+
`${REACT_COMPONENT_PREFIX}-select-actions`,
|
|
941
|
+
showClear && `${REACT_COMPONENT_PREFIX}-select-actions-clearable`
|
|
942
|
+
),
|
|
943
|
+
children: [
|
|
944
|
+
showClear ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
945
|
+
"button",
|
|
946
|
+
{
|
|
947
|
+
type: "button",
|
|
948
|
+
className: `${REACT_COMPONENT_PREFIX}-select-clear`,
|
|
949
|
+
"aria-label": "\u6E05\u7A7A",
|
|
950
|
+
tabIndex: -1,
|
|
951
|
+
onMouseDown: (event) => {
|
|
952
|
+
event.preventDefault();
|
|
953
|
+
event.stopPropagation();
|
|
954
|
+
},
|
|
955
|
+
onClick: handleClear,
|
|
956
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
957
|
+
"span",
|
|
958
|
+
{
|
|
959
|
+
className: `${REACT_COMPONENT_PREFIX}-select-clear-icon`
|
|
960
|
+
}
|
|
961
|
+
)
|
|
962
|
+
}
|
|
963
|
+
) : null,
|
|
964
|
+
showArrow ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
965
|
+
"span",
|
|
966
|
+
{
|
|
967
|
+
className: joinClassNames(
|
|
968
|
+
`${REACT_COMPONENT_PREFIX}-select-arrow`,
|
|
969
|
+
open && `${REACT_COMPONENT_PREFIX}-select-arrow-open`
|
|
970
|
+
)
|
|
971
|
+
}
|
|
972
|
+
) : null
|
|
973
|
+
]
|
|
974
|
+
}
|
|
975
|
+
) : null
|
|
976
|
+
]
|
|
977
|
+
}
|
|
978
|
+
),
|
|
979
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
980
|
+
ReactPopup,
|
|
981
|
+
{
|
|
982
|
+
open,
|
|
983
|
+
anchorRef: triggerRef,
|
|
984
|
+
matchAnchorWidth: true,
|
|
985
|
+
zIndex: popupZIndex,
|
|
986
|
+
surfaceClassName: joinClassNames(
|
|
987
|
+
`${REACT_COMPONENT_PREFIX}-select-dropdown`,
|
|
988
|
+
popupClassName
|
|
989
|
+
),
|
|
990
|
+
onOpenChange: setOpen,
|
|
991
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
992
|
+
ReactVirtualList,
|
|
993
|
+
{
|
|
994
|
+
ref: listRef,
|
|
995
|
+
items: filteredOptions,
|
|
996
|
+
height: Math.min(
|
|
997
|
+
listHeight,
|
|
998
|
+
Math.max(filteredOptions.length, 1) * optionHeight
|
|
999
|
+
),
|
|
1000
|
+
itemHeight: optionHeight,
|
|
1001
|
+
virtual,
|
|
1002
|
+
className: `${REACT_COMPONENT_PREFIX}-select-list`,
|
|
1003
|
+
innerClassName: `${REACT_COMPONENT_PREFIX}-select-list-inner`,
|
|
1004
|
+
empty: /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${REACT_COMPONENT_PREFIX}-select-empty`, children: "\u6682\u65E0\u6570\u636E" }),
|
|
1005
|
+
itemKey: (option) => String(option.value),
|
|
1006
|
+
renderItem: (option, optionIndex, meta) => {
|
|
1007
|
+
const isSelected = String(option.value) === String(value ?? "");
|
|
1008
|
+
const isActive = optionIndex === activeIndex;
|
|
1009
|
+
const isSearching = showSearch && searchKeyword.trim().length > 0;
|
|
1010
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1011
|
+
"div",
|
|
1012
|
+
{
|
|
1013
|
+
className: joinClassNames(
|
|
1014
|
+
`${REACT_COMPONENT_PREFIX}-select-option`,
|
|
1015
|
+
isSelected && `${REACT_COMPONENT_PREFIX}-select-option-selected`,
|
|
1016
|
+
isActive && `${REACT_COMPONENT_PREFIX}-select-option-active`,
|
|
1017
|
+
isSearching && `${REACT_COMPONENT_PREFIX}-select-option-searching`,
|
|
1018
|
+
option.disabled && `${REACT_COMPONENT_PREFIX}-select-option-disabled`
|
|
1019
|
+
),
|
|
1020
|
+
style: meta.style,
|
|
1021
|
+
onMouseDown: (event) => {
|
|
1022
|
+
event.preventDefault();
|
|
1023
|
+
},
|
|
1024
|
+
onMouseEnter: () => {
|
|
1025
|
+
setActiveIndex(optionIndex);
|
|
1026
|
+
},
|
|
1027
|
+
onClick: () => {
|
|
1028
|
+
if (option.disabled) {
|
|
1029
|
+
return;
|
|
1030
|
+
}
|
|
1031
|
+
selectOption(option, "mouse");
|
|
1032
|
+
},
|
|
1033
|
+
children: renderSelectOptionLabel(
|
|
1034
|
+
option.label,
|
|
1035
|
+
showSearch ? searchKeyword : ""
|
|
1036
|
+
)
|
|
1037
|
+
},
|
|
1038
|
+
String(option.value)
|
|
1039
|
+
);
|
|
1040
|
+
}
|
|
1041
|
+
}
|
|
1042
|
+
)
|
|
1043
|
+
}
|
|
1044
|
+
)
|
|
1045
|
+
] });
|
|
1046
|
+
}
|
|
1047
|
+
);
|
|
1048
|
+
function filterSelectOptions(options, input, showSearch, filterOption) {
|
|
1049
|
+
if (!showSearch) {
|
|
1050
|
+
return options;
|
|
1051
|
+
}
|
|
1052
|
+
const search = input.trim();
|
|
1053
|
+
if (!search) {
|
|
1054
|
+
return options;
|
|
1055
|
+
}
|
|
1056
|
+
if (filterOption) {
|
|
1057
|
+
return options.filter((option) => filterOption(search, option));
|
|
1058
|
+
}
|
|
1059
|
+
const normalizedSearch = search.toLowerCase();
|
|
1060
|
+
return options.filter((option) => {
|
|
1061
|
+
return option.label.toLowerCase().includes(normalizedSearch) || String(option.value).toLowerCase().includes(normalizedSearch);
|
|
1062
|
+
});
|
|
1063
|
+
}
|
|
1064
|
+
function resolveSelectEnterOption(options) {
|
|
1065
|
+
return options.find((option) => !option.disabled);
|
|
1066
|
+
}
|
|
1067
|
+
function resolveSelectKeywordOnOpen(selectedLabel) {
|
|
1068
|
+
return selectedLabel ?? "";
|
|
1069
|
+
}
|
|
1070
|
+
function splitSelectOptionLabel(label, input) {
|
|
1071
|
+
const search = input.trim();
|
|
1072
|
+
if (!search) {
|
|
1073
|
+
return [{ text: label, highlighted: false }];
|
|
1074
|
+
}
|
|
1075
|
+
const matcher = new RegExp(escapeRegExp(search), "gi");
|
|
1076
|
+
const parts = [];
|
|
1077
|
+
let cursor = 0;
|
|
1078
|
+
let match = matcher.exec(label);
|
|
1079
|
+
while (match) {
|
|
1080
|
+
if (match.index > cursor) {
|
|
1081
|
+
parts.push({
|
|
1082
|
+
text: label.slice(cursor, match.index),
|
|
1083
|
+
highlighted: false
|
|
1084
|
+
});
|
|
1085
|
+
}
|
|
1086
|
+
parts.push({ text: match[0], highlighted: true });
|
|
1087
|
+
cursor = match.index + match[0].length;
|
|
1088
|
+
match = matcher.exec(label);
|
|
1089
|
+
}
|
|
1090
|
+
if (cursor < label.length) {
|
|
1091
|
+
parts.push({ text: label.slice(cursor), highlighted: false });
|
|
1092
|
+
}
|
|
1093
|
+
return parts.length > 0 ? parts : [{ text: label, highlighted: false }];
|
|
1094
|
+
}
|
|
1095
|
+
function renderSelectOptionLabel(label, input) {
|
|
1096
|
+
return splitSelectOptionLabel(label, input).map(
|
|
1097
|
+
(part, index) => part.highlighted ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
1098
|
+
"span",
|
|
1099
|
+
{
|
|
1100
|
+
className: `${REACT_COMPONENT_PREFIX}-select-option-highlight`,
|
|
1101
|
+
children: part.text
|
|
1102
|
+
},
|
|
1103
|
+
`${part.text}-${index}`
|
|
1104
|
+
) : part.text
|
|
1105
|
+
);
|
|
1106
|
+
}
|
|
1107
|
+
function escapeRegExp(value) {
|
|
1108
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
1109
|
+
}
|
|
1110
|
+
var operators = [
|
|
1111
|
+
{ label: "\u4E0D\u7B5B\u9009", value: "none" },
|
|
1112
|
+
{ label: "\u7B49\u4E8E", value: "eq" },
|
|
1113
|
+
{ label: "\u4E0D\u7B49\u4E8E", value: "neq" },
|
|
1114
|
+
{ label: "\u5927\u4E8E", value: "gt" },
|
|
1115
|
+
{ label: "\u5927\u4E8E\u7B49\u4E8E", value: "gte" },
|
|
1116
|
+
{ label: "\u5C0F\u4E8E", value: "lt" },
|
|
1117
|
+
{ label: "\u5C0F\u4E8E\u7B49\u4E8E", value: "lte" },
|
|
1118
|
+
{ label: "\u533A\u95F4", value: "between" },
|
|
1119
|
+
{ label: "\u4E0D\u5728\u533A\u95F4", value: "notBetween" },
|
|
1120
|
+
{ label: "\u5F00\u5934\u662F", value: "startsWith" },
|
|
1121
|
+
{ label: "\u5F00\u5934\u4E0D\u662F", value: "notStartsWith" },
|
|
1122
|
+
{ label: "\u7ED3\u5C3E\u662F", value: "endsWith" },
|
|
1123
|
+
{ label: "\u7ED3\u5C3E\u4E0D\u662F", value: "notEndsWith" },
|
|
1124
|
+
{ label: "\u5305\u542B", value: "includes" },
|
|
1125
|
+
{ label: "\u4E0D\u5305\u542B", value: "notIncludes" },
|
|
1126
|
+
{ label: "\u4E3A\u7A7A", value: "blank" },
|
|
1127
|
+
{ label: "\u4E0D\u4E3A\u7A7A", value: "notBlank" }
|
|
1128
|
+
];
|
|
1129
|
+
function ReactFilterPanel(props) {
|
|
1130
|
+
const { request } = props;
|
|
1131
|
+
const [draft, setDraft] = React.useState(request?.value ?? null);
|
|
1132
|
+
const [tab, setTab] = React.useState(resolveTab(request?.value));
|
|
1133
|
+
const [options, setOptions] = React.useState(request?.options ?? []);
|
|
1134
|
+
const [loading, setLoading] = React.useState(Boolean(request?.loadOptions));
|
|
1135
|
+
React.useEffect(() => {
|
|
1136
|
+
setDraft(request?.value ?? null);
|
|
1137
|
+
setTab(resolveTab(request?.value));
|
|
1138
|
+
setOptions(request?.options ?? []);
|
|
1139
|
+
setLoading(Boolean(request?.loadOptions));
|
|
1140
|
+
}, [request]);
|
|
1141
|
+
React.useEffect(() => {
|
|
1142
|
+
if (!request?.loadOptions) return;
|
|
1143
|
+
const controller = new AbortController();
|
|
1144
|
+
setLoading(true);
|
|
1145
|
+
void Promise.resolve(request.loadOptions(controller.signal)).then((items) => {
|
|
1146
|
+
if (!controller.signal.aborted) {
|
|
1147
|
+
setOptions(items);
|
|
1148
|
+
setLoading(false);
|
|
1149
|
+
}
|
|
1150
|
+
}).catch(() => {
|
|
1151
|
+
if (!controller.signal.aborted) {
|
|
1152
|
+
setOptions([]);
|
|
1153
|
+
setLoading(false);
|
|
1154
|
+
}
|
|
1155
|
+
});
|
|
1156
|
+
return () => controller.abort();
|
|
1157
|
+
}, [request]);
|
|
1158
|
+
const visibleOptions = React.useMemo(() => {
|
|
1159
|
+
const values = options.filter((item) => item.kind !== "all");
|
|
1160
|
+
const keyword = draft?.keyword.trim().toLowerCase() ?? "";
|
|
1161
|
+
if (!keyword) return values;
|
|
1162
|
+
return values.filter((item) => {
|
|
1163
|
+
const label = item.label.toLowerCase();
|
|
1164
|
+
const value = item.value.toLowerCase();
|
|
1165
|
+
return draft?.searchExact ? label === keyword || value === keyword : label.includes(keyword) || value.includes(keyword);
|
|
1166
|
+
});
|
|
1167
|
+
}, [draft?.keyword, draft?.searchExact, options]);
|
|
1168
|
+
if (!request || !draft) return null;
|
|
1169
|
+
const selected = new Set(draft.selectedKeys ?? []);
|
|
1170
|
+
const visibleKeys = visibleOptions.map((item) => item.value);
|
|
1171
|
+
const selectedCount = visibleKeys.filter((value) => selected.has(value)).length;
|
|
1172
|
+
const allChecked = visibleKeys.length > 0 && selectedCount === visibleKeys.length;
|
|
1173
|
+
const allCount = request.options.find((item) => item.kind === "all")?.count ?? visibleOptions.filter((item) => item.kind === "value").reduce((sum, item) => sum + item.count, 0);
|
|
1174
|
+
const update = (patch) => setDraft((current) => ({ ...current ?? request.value, ...patch }));
|
|
1175
|
+
const toggle = (keys, checked) => {
|
|
1176
|
+
const next = new Set(draft.selectedKeys ?? []);
|
|
1177
|
+
keys.forEach((key) => checked ? next.add(key) : next.delete(key));
|
|
1178
|
+
const value = { ...draft, filterType: "value", selectedKeys: Array.from(next) };
|
|
1179
|
+
setDraft(value);
|
|
1180
|
+
if (request.filterOptionImmediateApply) request.onApply(value);
|
|
1181
|
+
};
|
|
1182
|
+
const apply = () => {
|
|
1183
|
+
request.onApply({ ...draft, filterType: tab });
|
|
1184
|
+
request.onClose();
|
|
1185
|
+
};
|
|
1186
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
1187
|
+
ReactPopup,
|
|
1188
|
+
{
|
|
1189
|
+
open: true,
|
|
1190
|
+
anchorRect: request.anchorRect,
|
|
1191
|
+
offset: 8,
|
|
1192
|
+
matchAnchorWidth: false,
|
|
1193
|
+
minWidth: 300,
|
|
1194
|
+
onOpenChange: (open) => {
|
|
1195
|
+
if (!open) request.onClose();
|
|
1196
|
+
},
|
|
1197
|
+
surfaceStyle: { width: 300, height: 460, padding: 12, overflow: "hidden", boxSizing: "border-box" },
|
|
1198
|
+
children: /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { height: "100%", display: "flex", flexDirection: "column", minHeight: 0 }, children: [
|
|
1199
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { fontSize: 14, fontWeight: 600, color: "#111827" }, children: [
|
|
1200
|
+
request.texts.title,
|
|
1201
|
+
" \xB7 ",
|
|
1202
|
+
request.columnTitle
|
|
1203
|
+
] }),
|
|
1204
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", gap: 8, marginTop: 12 }, children: [
|
|
1205
|
+
/* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", style: tabStyle(tab === "value"), onClick: () => {
|
|
1206
|
+
setTab("value");
|
|
1207
|
+
update({ filterType: "value" });
|
|
1208
|
+
}, children: request.texts.valueFilterTab }),
|
|
1209
|
+
/* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", style: tabStyle(tab === "condition"), onClick: () => {
|
|
1210
|
+
setTab("condition");
|
|
1211
|
+
update({ filterType: "condition" });
|
|
1212
|
+
}, children: request.texts.conditionFilterTab })
|
|
1213
|
+
] }),
|
|
1214
|
+
tab === "value" ? /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "grid", gap: 12, marginTop: 12, minHeight: 290, alignContent: "start", flex: "1 1 auto" }, children: [
|
|
1215
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1216
|
+
ReactInput,
|
|
1217
|
+
{
|
|
1218
|
+
value: draft.keyword,
|
|
1219
|
+
placeholder: request.texts.searchPlaceholder,
|
|
1220
|
+
onChange: (event) => update({ keyword: event.target.value, filterType: "value" }),
|
|
1221
|
+
onPressEnter: apply,
|
|
1222
|
+
style: { width: "100%" }
|
|
1223
|
+
}
|
|
1224
|
+
),
|
|
1225
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", alignItems: "center", justifyContent: "space-between", gap: 12, paddingBottom: 8, borderBottom: "1px solid #f0f0f0" }, children: [
|
|
1226
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { style: checkLabelStyle, children: [
|
|
1227
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1228
|
+
ReactCheckbox,
|
|
1229
|
+
{
|
|
1230
|
+
checked: allChecked,
|
|
1231
|
+
indeterminate: selectedCount > 0 && !allChecked,
|
|
1232
|
+
onChange: (event) => toggle(visibleKeys, !!event.target.checked)
|
|
1233
|
+
}
|
|
1234
|
+
),
|
|
1235
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { children: [
|
|
1236
|
+
request.texts.allOptionLabel,
|
|
1237
|
+
" (",
|
|
1238
|
+
allCount,
|
|
1239
|
+
")"
|
|
1240
|
+
] })
|
|
1241
|
+
] }),
|
|
1242
|
+
/* @__PURE__ */ jsxRuntime.jsxs("label", { style: checkLabelStyle, children: [
|
|
1243
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1244
|
+
ReactCheckbox,
|
|
1245
|
+
{
|
|
1246
|
+
checked: !!draft.searchExact,
|
|
1247
|
+
onChange: (event) => update({ searchExact: !!event.target.checked, filterType: "value" })
|
|
1248
|
+
}
|
|
1249
|
+
),
|
|
1250
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: request.texts.exactToggleLabel })
|
|
1251
|
+
] })
|
|
1252
|
+
] }),
|
|
1253
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: { minHeight: 232, borderRadius: 8, border: "1px solid #f0f0f0", background: "#fafafa", padding: 6 }, children: loading || visibleOptions.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { style: { minHeight: 220, display: "flex", alignItems: "center", justifyContent: "center", color: "#9ca3af", fontSize: 12 }, children: loading ? request.texts.loadingOptions : request.texts.emptyOptions }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
1254
|
+
ReactVirtualList,
|
|
1255
|
+
{
|
|
1256
|
+
items: visibleOptions,
|
|
1257
|
+
height: Math.min(220, visibleOptions.length * 40),
|
|
1258
|
+
itemHeight: 40,
|
|
1259
|
+
itemKey: (item) => item.value,
|
|
1260
|
+
renderItem: (item, _index, meta) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
1261
|
+
"label",
|
|
1262
|
+
{
|
|
1263
|
+
className: "react-list-table-filter-option",
|
|
1264
|
+
style: { ...optionStyle, ...meta.style },
|
|
1265
|
+
children: [
|
|
1266
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1267
|
+
ReactCheckbox,
|
|
1268
|
+
{
|
|
1269
|
+
checked: selected.has(item.value),
|
|
1270
|
+
onChange: (event) => toggle([item.value], !!event.target.checked)
|
|
1271
|
+
}
|
|
1272
|
+
),
|
|
1273
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { title: optionLabel(item, request.texts), style: optionTextStyle, children: optionLabel(item, request.texts) }),
|
|
1274
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { style: { color: "#9ca3af", fontSize: 12 }, children: item.count })
|
|
1275
|
+
]
|
|
1276
|
+
},
|
|
1277
|
+
item.value
|
|
1278
|
+
)
|
|
1279
|
+
}
|
|
1280
|
+
) })
|
|
1281
|
+
] }) : /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { marginTop: 12, display: "grid", gap: 12, minHeight: 290, alignContent: "start", flex: "1 1 auto" }, children: [
|
|
1282
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1283
|
+
ConditionEditor,
|
|
1284
|
+
{
|
|
1285
|
+
label: request.texts.firstConditionLabel,
|
|
1286
|
+
operator: draft.conditionOperator ?? "none",
|
|
1287
|
+
value: draft.conditionValue ?? "",
|
|
1288
|
+
secondValue: draft.conditionSecondValue ?? "",
|
|
1289
|
+
texts: request.texts,
|
|
1290
|
+
onChange: (patch) => update(patch),
|
|
1291
|
+
onSubmit: apply
|
|
1292
|
+
}
|
|
1293
|
+
),
|
|
1294
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1295
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: fieldLabelStyle, children: request.texts.relationLabel }),
|
|
1296
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1297
|
+
ReactSelect,
|
|
1298
|
+
{
|
|
1299
|
+
value: draft.conditionRelation === "or" ? "or" : "and",
|
|
1300
|
+
allowClear: false,
|
|
1301
|
+
options: [{ label: request.texts.relationAndLabel, value: "and" }, { label: request.texts.relationOrLabel, value: "or" }],
|
|
1302
|
+
onChange: (value) => update({ conditionRelation: value, filterType: "condition" }),
|
|
1303
|
+
style: { width: "100%" }
|
|
1304
|
+
}
|
|
1305
|
+
)
|
|
1306
|
+
] }),
|
|
1307
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1308
|
+
ConditionEditor,
|
|
1309
|
+
{
|
|
1310
|
+
second: true,
|
|
1311
|
+
label: request.texts.secondConditionLabel,
|
|
1312
|
+
operator: draft.secondConditionOperator ?? "none",
|
|
1313
|
+
value: draft.secondConditionValue ?? "",
|
|
1314
|
+
secondValue: draft.secondConditionSecondValue ?? "",
|
|
1315
|
+
texts: request.texts,
|
|
1316
|
+
onChange: (patch) => update(patch),
|
|
1317
|
+
onSubmit: apply
|
|
1318
|
+
}
|
|
1319
|
+
)
|
|
1320
|
+
] }),
|
|
1321
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "flex", justifyContent: "space-between" }, children: [
|
|
1322
|
+
/* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", style: actionStyle(false), onClick: () => {
|
|
1323
|
+
request.onReset();
|
|
1324
|
+
request.onClose();
|
|
1325
|
+
}, children: request.texts.resetAction }),
|
|
1326
|
+
/* @__PURE__ */ jsxRuntime.jsx("button", { type: "button", style: actionStyle(true), onClick: apply, children: request.texts.applyAction })
|
|
1327
|
+
] })
|
|
1328
|
+
] })
|
|
1329
|
+
}
|
|
1330
|
+
);
|
|
1331
|
+
}
|
|
1332
|
+
function ConditionEditor(props) {
|
|
1333
|
+
const prefix = props.second ? "secondCondition" : "condition";
|
|
1334
|
+
const hidesValue = ["none", "blank", "notBlank"].includes(props.operator);
|
|
1335
|
+
const needsSecond = ["between", "notBetween"].includes(props.operator);
|
|
1336
|
+
return /* @__PURE__ */ jsxRuntime.jsxs("div", { children: [
|
|
1337
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { style: fieldLabelStyle, children: props.label }),
|
|
1338
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1339
|
+
ReactSelect,
|
|
1340
|
+
{
|
|
1341
|
+
value: props.operator,
|
|
1342
|
+
options: operators,
|
|
1343
|
+
allowClear: false,
|
|
1344
|
+
onChange: (value) => props.onChange({ [`${prefix}Operator`]: value, filterType: "condition" }),
|
|
1345
|
+
style: { width: "100%" }
|
|
1346
|
+
}
|
|
1347
|
+
),
|
|
1348
|
+
hidesValue ? null : /* @__PURE__ */ jsxRuntime.jsxs("div", { style: { display: "grid", gap: 8, marginTop: 8 }, children: [
|
|
1349
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
1350
|
+
ReactInput,
|
|
1351
|
+
{
|
|
1352
|
+
value: props.value,
|
|
1353
|
+
placeholder: props.texts.firstValuePlaceholder,
|
|
1354
|
+
onPressEnter: props.onSubmit,
|
|
1355
|
+
onChange: (event) => props.onChange({ [`${prefix}Value`]: event.target.value, filterType: "condition" }),
|
|
1356
|
+
style: { width: "100%" }
|
|
1357
|
+
}
|
|
1358
|
+
),
|
|
1359
|
+
needsSecond ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
1360
|
+
ReactInput,
|
|
1361
|
+
{
|
|
1362
|
+
value: props.secondValue,
|
|
1363
|
+
placeholder: props.texts.secondValuePlaceholder,
|
|
1364
|
+
onPressEnter: props.onSubmit,
|
|
1365
|
+
onChange: (event) => props.onChange({ [`${prefix}SecondValue`]: event.target.value, filterType: "condition" }),
|
|
1366
|
+
style: { width: "100%" }
|
|
1367
|
+
}
|
|
1368
|
+
) : null
|
|
1369
|
+
] })
|
|
1370
|
+
] });
|
|
1371
|
+
}
|
|
1372
|
+
function resolveTab(value) {
|
|
1373
|
+
return value?.filterType === "condition" || value?.conditionOperator && value.conditionOperator !== "none" ? "condition" : "value";
|
|
1374
|
+
}
|
|
1375
|
+
function optionLabel(item, texts) {
|
|
1376
|
+
if (item.kind === "blank") return texts.blankOptionLabel;
|
|
1377
|
+
if (item.kind === "notBlank") return texts.notBlankOptionLabel;
|
|
1378
|
+
return item.label;
|
|
1379
|
+
}
|
|
1380
|
+
var checkLabelStyle = { display: "inline-flex", alignItems: "center", gap: 8, color: "#374151", fontSize: 14 };
|
|
1381
|
+
var optionStyle = { display: "flex", alignItems: "center", gap: 8, minHeight: 40, padding: "4px 8px", borderRadius: 6, color: "#374151", fontSize: 14, cursor: "pointer", boxSizing: "border-box" };
|
|
1382
|
+
var optionTextStyle = { display: "block", flex: "1 1 0", width: 0, minWidth: 0, overflow: "hidden", whiteSpace: "nowrap", textOverflow: "ellipsis" };
|
|
1383
|
+
var fieldLabelStyle = { marginBottom: 6, fontSize: 12, color: "#6b7280" };
|
|
1384
|
+
function tabStyle(active) {
|
|
1385
|
+
return { flex: 1, height: 32, border: active ? "1px solid #1677ff" : "1px solid #d9d9d9", borderRadius: 6, background: active ? "#e6f4ff" : "#fff", color: active ? "#1677ff" : "#374151", cursor: "pointer" };
|
|
1386
|
+
}
|
|
1387
|
+
function actionStyle(primary) {
|
|
1388
|
+
return { minWidth: 72, height: 32, padding: "0 12px", borderRadius: 6, border: primary ? "1px solid #1677ff" : "1px solid #d9d9d9", background: primary ? "#1677ff" : "#fff", color: primary ? "#fff" : "#374151", cursor: "pointer" };
|
|
1389
|
+
}
|
|
1390
|
+
|
|
627
1391
|
// src/components/color/style.css
|
|
628
1392
|
styleInject(".canvas-react-color-wrap {\n display: inline-flex;\n width: 100%;\n height: 100%;\n min-height: 0;\n box-sizing: border-box;\n}\n.canvas-react-color {\n display: flex;\n align-items: center;\n width: 100%;\n min-width: 0;\n height: var(--canvas-react-control-height);\n min-height: 0;\n box-sizing: border-box;\n border: 1px solid var(--canvas-react-color-border);\n border-radius: var(--canvas-react-radius-sm);\n background: var(--canvas-react-color-bg);\n color: var(--canvas-react-color-text);\n font-size: var(--canvas-react-font-size);\n transition: border-color 0.2s ease, box-shadow 0.2s ease;\n cursor: pointer;\n}\n.canvas-react-color:hover {\n border-color: var(--canvas-react-color-primary-hover);\n}\n.canvas-react-color-open,\n.canvas-react-color:focus-within {\n border-color: var(--canvas-react-color-primary);\n box-shadow: var(--canvas-react-shadow-focus);\n}\n.canvas-react-color-disabled {\n color: #9ca3af;\n background: var(--canvas-react-color-bg-soft);\n cursor: not-allowed;\n}\n.canvas-react-color-preview {\n flex: 0 0 auto;\n width: calc(24px * var(--canvas-react-content-zoom, 1));\n height: calc(24px * var(--canvas-react-content-zoom, 1));\n margin-left: 3px;\n box-sizing: border-box;\n border: 1px solid rgba(0, 0, 0, 0.12);\n border-radius: 4px;\n}\n.canvas-react-color-input-wrap {\n flex: 1;\n min-width: 0;\n height: 100%;\n min-height: 0;\n border: 0;\n box-shadow: none;\n}\n.canvas-react-color .canvas-react-input-affix-wrapper {\n height: 100%;\n min-height: 0;\n}\n.canvas-react-color-input-wrap:hover,\n.canvas-react-color-input-wrap:focus-within {\n border-color: transparent;\n box-shadow: none;\n}\n.canvas-react-color-input {\n cursor: pointer;\n text-transform: uppercase;\n}\n.canvas-react-color-arrow {\n flex: 0 0 auto;\n width: 0.5em;\n height: 0.5em;\n min-width: 6px;\n min-height: 6px;\n margin-right: var(--canvas-react-control-padding-inline, 11px);\n border-right: 1.5px solid var(--canvas-react-color-text-muted);\n border-bottom: 1.5px solid var(--canvas-react-color-text-muted);\n transform: rotate(45deg) translateY(-2px);\n transition: transform 0.18s ease;\n}\n.canvas-react-color-arrow-open {\n transform: rotate(225deg) translate(-1px, -1px);\n}\n.canvas-react-color-dropdown {\n overflow: hidden;\n}\n.canvas-react-color-panel {\n padding: 12px;\n box-sizing: border-box;\n}\n.canvas-react-color-saturation {\n position: relative;\n height: 150px;\n overflow: hidden;\n border-radius: 6px;\n cursor: crosshair;\n background-image:\n linear-gradient(\n to top,\n #000,\n transparent),\n linear-gradient(\n to right,\n #fff,\n transparent);\n touch-action: none;\n}\n.canvas-react-color-saturation-thumb {\n position: absolute;\n width: 12px;\n height: 12px;\n border: 2px solid #fff;\n border-radius: 50%;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.28), 0 1px 3px rgba(0, 0, 0, 0.28);\n transform: translate(-50%, -50%);\n pointer-events: none;\n}\n.canvas-react-color-controls {\n display: flex;\n align-items: center;\n gap: 10px;\n margin-top: 12px;\n}\n.canvas-react-color-current {\n flex: 0 0 28px;\n height: 28px;\n box-sizing: border-box;\n border: 1px solid rgba(0, 0, 0, 0.12);\n border-radius: 50%;\n}\n.canvas-react-color-hue {\n width: 100%;\n height: 12px;\n margin: 0;\n appearance: none;\n border-radius: 999px;\n background:\n linear-gradient(\n to right,\n #f00,\n #ff0,\n #0f0,\n #0ff,\n #00f,\n #f0f,\n #f00);\n cursor: pointer;\n}\n.canvas-react-color-hue::-webkit-slider-thumb {\n width: 14px;\n height: 14px;\n appearance: none;\n border: 2px solid #fff;\n border-radius: 50%;\n background: transparent;\n box-shadow: 0 0 0 1px rgba(0, 0, 0, 0.28);\n}\n.canvas-react-color-value-row {\n display: grid;\n grid-template-columns: 36px 1fr;\n align-items: center;\n gap: 8px;\n margin-top: 12px;\n color: var(--canvas-react-color-text-muted);\n font-size: 12px;\n}\n.canvas-react-color-value-row .canvas-react-input-affix-wrapper {\n height: 28px;\n}\n.canvas-react-color-presets {\n display: grid;\n grid-template-columns: repeat(8, 20px);\n gap: 7px;\n margin-top: 12px;\n}\n.canvas-react-color-preset {\n width: 20px;\n height: 20px;\n padding: 0;\n box-sizing: border-box;\n border: 1px solid rgba(0, 0, 0, 0.12);\n border-radius: 4px;\n cursor: pointer;\n transition: transform 0.16s ease, box-shadow 0.16s ease;\n}\n.canvas-react-color-preset:hover {\n transform: scale(1.12);\n}\n.canvas-react-color-preset-selected {\n box-shadow: 0 0 0 2px #fff, 0 0 0 3px var(--canvas-react-color-primary);\n}\n");
|
|
629
1393
|
var DEFAULT_COLOR = "#1677ff";
|
|
@@ -3785,6 +4549,165 @@ function compareDateTimeValue(left, right) {
|
|
|
3785
4549
|
return left.localeCompare(right);
|
|
3786
4550
|
}
|
|
3787
4551
|
|
|
4552
|
+
// src/components/number-input/style.css
|
|
4553
|
+
styleInject('@import "../../styles/variables.css";\n.canvas-react-number-input-affix-wrapper {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n width: 100%;\n min-width: 0;\n height: var(--canvas-react-control-height);\n border: 1px solid var(--canvas-react-color-border);\n border-radius: var(--canvas-react-radius-sm);\n background: var(--canvas-react-color-bg);\n color: var(--canvas-react-color-text);\n font-size: var(--canvas-react-font-size);\n outline: none;\n transition:\n border-color 0.2s ease,\n box-shadow 0.2s ease,\n background-color 0.2s ease;\n}\n.canvas-react-number-input-affix-wrapper:hover {\n border-color: var(--canvas-react-color-primary-hover);\n}\n.canvas-react-number-input-affix-wrapper:focus-within {\n border-color: var(--canvas-react-color-primary);\n box-shadow: var(--canvas-react-shadow-focus);\n}\n.canvas-react-number-input-affix-wrapper-disabled {\n background: #fafafa;\n color: #9ca3af;\n cursor: not-allowed;\n}\n.canvas-react-number-input {\n box-sizing: border-box;\n flex: 1 1 auto;\n width: 100%;\n min-width: 0;\n height: 100%;\n padding: var(--canvas-react-control-padding-block, 0px) var(--canvas-react-control-padding-inline, 11px);\n border: none;\n background: transparent;\n color: inherit;\n font-size: inherit;\n outline: none;\n appearance: textfield;\n -moz-appearance: textfield;\n}\n.canvas-react-number-input::placeholder {\n color: #9ca3af;\n}\n.canvas-react-number-input::-webkit-outer-spin-button,\n.canvas-react-number-input::-webkit-inner-spin-button {\n margin: 0;\n -webkit-appearance: none;\n}\n.canvas-react-number-input-suffix {\n display: inline-flex;\n align-items: center;\n padding-right: var(--canvas-react-control-padding-inline, 11px);\n}\n.canvas-react-number-input-clear {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n padding: 0;\n border: none;\n background: transparent;\n color: #9ca3af;\n opacity: 0;\n pointer-events: none;\n cursor: pointer;\n transition:\n color 0.2s ease,\n opacity 0.2s ease,\n transform 0.18s ease;\n}\n.canvas-react-number-input-affix-wrapper:hover .canvas-react-number-input-clear,\n.canvas-react-number-input-affix-wrapper:focus-within .canvas-react-number-input-clear {\n opacity: 1;\n pointer-events: auto;\n}\n.canvas-react-number-input-clear:hover {\n color: #6b7280;\n transform: rotate(90deg);\n}\n.canvas-react-number-input-clear-icon,\n.canvas-react-number-input-clear-icon::before {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 8px;\n height: 1.25px;\n margin-top: -0.625px;\n margin-left: -4px;\n border-radius: 999px;\n background: currentColor;\n content: "";\n}\n.canvas-react-number-input-clear-icon {\n transform: rotate(45deg);\n}\n.canvas-react-number-input-clear-icon::before {\n transform: rotate(90deg);\n}\n');
|
|
4554
|
+
var ReactNumberInput = React.forwardRef(
|
|
4555
|
+
function ReactNumberInput2(props, ref) {
|
|
4556
|
+
const {
|
|
4557
|
+
className,
|
|
4558
|
+
disabled,
|
|
4559
|
+
onBlur,
|
|
4560
|
+
onChange,
|
|
4561
|
+
onKeyDown,
|
|
4562
|
+
onPressEnter,
|
|
4563
|
+
style,
|
|
4564
|
+
value,
|
|
4565
|
+
...restProps
|
|
4566
|
+
} = props;
|
|
4567
|
+
const [inputValue, setInputValue] = React.useState(toDisplayValue(value));
|
|
4568
|
+
React.useEffect(() => {
|
|
4569
|
+
setInputValue(toDisplayValue(value));
|
|
4570
|
+
}, [value]);
|
|
4571
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
4572
|
+
"span",
|
|
4573
|
+
{
|
|
4574
|
+
className: joinClassNames(
|
|
4575
|
+
`${REACT_COMPONENT_PREFIX}-number-input-affix-wrapper`,
|
|
4576
|
+
disabled && `${REACT_COMPONENT_PREFIX}-number-input-affix-wrapper-disabled`
|
|
4577
|
+
),
|
|
4578
|
+
style,
|
|
4579
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
4580
|
+
"input",
|
|
4581
|
+
{
|
|
4582
|
+
...restProps,
|
|
4583
|
+
ref,
|
|
4584
|
+
disabled,
|
|
4585
|
+
type: "number",
|
|
4586
|
+
value: inputValue,
|
|
4587
|
+
className: joinClassNames(
|
|
4588
|
+
`${REACT_COMPONENT_PREFIX}-number-input`,
|
|
4589
|
+
className
|
|
4590
|
+
),
|
|
4591
|
+
onChange: (event) => {
|
|
4592
|
+
const nextText = event.target.value;
|
|
4593
|
+
setInputValue(nextText);
|
|
4594
|
+
onChange?.(parseNumberValue(nextText));
|
|
4595
|
+
},
|
|
4596
|
+
onBlur: (event) => {
|
|
4597
|
+
setInputValue(toDisplayValue(parseNumberValue(event.target.value)));
|
|
4598
|
+
onBlur?.(event);
|
|
4599
|
+
},
|
|
4600
|
+
onKeyDown: (event) => {
|
|
4601
|
+
onKeyDown?.(event);
|
|
4602
|
+
if (event.key === "Enter") {
|
|
4603
|
+
onPressEnter?.(event);
|
|
4604
|
+
}
|
|
4605
|
+
}
|
|
4606
|
+
}
|
|
4607
|
+
)
|
|
4608
|
+
}
|
|
4609
|
+
);
|
|
4610
|
+
}
|
|
4611
|
+
);
|
|
4612
|
+
function parseNumberValue(value) {
|
|
4613
|
+
if (value.trim().length === 0) {
|
|
4614
|
+
return null;
|
|
4615
|
+
}
|
|
4616
|
+
const nextValue = Number(value);
|
|
4617
|
+
return Number.isFinite(nextValue) ? nextValue : null;
|
|
4618
|
+
}
|
|
4619
|
+
function toDisplayValue(value) {
|
|
4620
|
+
return value == null ? "" : String(value);
|
|
4621
|
+
}
|
|
4622
|
+
|
|
4623
|
+
// src/components/input-range/style.css
|
|
4624
|
+
styleInject('@import "../../styles/variables.css";\n.canvas-react-input-range {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n width: 100%;\n min-width: 0;\n height: var(--canvas-react-control-height);\n overflow: hidden;\n border: 1px solid var(--canvas-react-color-border);\n border-radius: var(--canvas-react-radius-sm);\n background: var(--canvas-react-color-bg);\n color: var(--canvas-react-color-text);\n font-size: var(--canvas-react-font-size);\n outline: none;\n transition:\n border-color 0.2s ease,\n box-shadow 0.2s ease,\n background-color 0.2s ease;\n}\n.canvas-react-input-range:hover {\n border-color: var(--canvas-react-color-primary-hover);\n}\n.canvas-react-input-range:focus-within {\n border-color: var(--canvas-react-color-primary);\n box-shadow: var(--canvas-react-shadow-focus);\n}\n.canvas-react-input-range-disabled {\n background: #fafafa;\n color: #9ca3af;\n cursor: not-allowed;\n}\n.canvas-react-input-range > .canvas-react-number-input-affix-wrapper,\n.canvas-react-input-range > .canvas-react-number-input-affix-wrapper:hover,\n.canvas-react-input-range > .canvas-react-number-input-affix-wrapper:focus-within {\n flex: 1 1 0;\n width: 0;\n height: 100%;\n border: 0;\n border-radius: 0;\n box-shadow: none;\n}\n.canvas-react-input-range-separator {\n flex: 0 0 auto;\n color: #9ca3af;\n line-height: 1;\n}\n');
|
|
4625
|
+
var ReactInputRange = React.forwardRef(function ReactInputRange2(props, ref) {
|
|
4626
|
+
const {
|
|
4627
|
+
autoFocus,
|
|
4628
|
+
className,
|
|
4629
|
+
disabled,
|
|
4630
|
+
max,
|
|
4631
|
+
min,
|
|
4632
|
+
onBlur,
|
|
4633
|
+
onChange,
|
|
4634
|
+
onFocus,
|
|
4635
|
+
onKeyDown,
|
|
4636
|
+
onPressEnter,
|
|
4637
|
+
placeholder = ["\u6700\u5C0F\u503C", "\u6700\u5927\u503C"],
|
|
4638
|
+
rangeSeparator = "~",
|
|
4639
|
+
step,
|
|
4640
|
+
style,
|
|
4641
|
+
value = [null, null],
|
|
4642
|
+
...restProps
|
|
4643
|
+
} = props;
|
|
4644
|
+
const rootRef = React.useRef(null);
|
|
4645
|
+
const startInputRef = React.useRef(null);
|
|
4646
|
+
React.useImperativeHandle(ref, () => startInputRef.current);
|
|
4647
|
+
React.useEffect(() => {
|
|
4648
|
+
if (autoFocus) {
|
|
4649
|
+
startInputRef.current?.focus();
|
|
4650
|
+
}
|
|
4651
|
+
}, [autoFocus]);
|
|
4652
|
+
const handleBlur = (event) => {
|
|
4653
|
+
const nextTarget = event.relatedTarget;
|
|
4654
|
+
if (nextTarget && rootRef.current?.contains(nextTarget)) {
|
|
4655
|
+
return;
|
|
4656
|
+
}
|
|
4657
|
+
onBlur?.(event);
|
|
4658
|
+
};
|
|
4659
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
4660
|
+
"span",
|
|
4661
|
+
{
|
|
4662
|
+
ref: rootRef,
|
|
4663
|
+
className: joinClassNames(
|
|
4664
|
+
`${REACT_COMPONENT_PREFIX}-input-range`,
|
|
4665
|
+
disabled && `${REACT_COMPONENT_PREFIX}-input-range-disabled`,
|
|
4666
|
+
className
|
|
4667
|
+
),
|
|
4668
|
+
style,
|
|
4669
|
+
children: [
|
|
4670
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4671
|
+
ReactNumberInput,
|
|
4672
|
+
{
|
|
4673
|
+
...restProps,
|
|
4674
|
+
ref: startInputRef,
|
|
4675
|
+
value: value[0],
|
|
4676
|
+
disabled,
|
|
4677
|
+
min,
|
|
4678
|
+
max,
|
|
4679
|
+
step,
|
|
4680
|
+
placeholder: placeholder[0],
|
|
4681
|
+
onChange: (nextValue) => onChange?.([nextValue, value[1]]),
|
|
4682
|
+
onFocus,
|
|
4683
|
+
onBlur: handleBlur,
|
|
4684
|
+
onKeyDown,
|
|
4685
|
+
onPressEnter
|
|
4686
|
+
}
|
|
4687
|
+
),
|
|
4688
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: `${REACT_COMPONENT_PREFIX}-input-range-separator`, children: rangeSeparator }),
|
|
4689
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4690
|
+
ReactNumberInput,
|
|
4691
|
+
{
|
|
4692
|
+
...restProps,
|
|
4693
|
+
value: value[1],
|
|
4694
|
+
disabled,
|
|
4695
|
+
min,
|
|
4696
|
+
max,
|
|
4697
|
+
step,
|
|
4698
|
+
placeholder: placeholder[1],
|
|
4699
|
+
onChange: (nextValue) => onChange?.([value[0], nextValue]),
|
|
4700
|
+
onFocus,
|
|
4701
|
+
onBlur: handleBlur,
|
|
4702
|
+
onKeyDown,
|
|
4703
|
+
onPressEnter
|
|
4704
|
+
}
|
|
4705
|
+
)
|
|
4706
|
+
]
|
|
4707
|
+
}
|
|
4708
|
+
);
|
|
4709
|
+
});
|
|
4710
|
+
|
|
3788
4711
|
// src/components/image-preview/style.css
|
|
3789
4712
|
styleInject(".canvas-react-image-preview {\n position: fixed;\n inset: 0;\n z-index: 1100;\n display: flex;\n align-items: center;\n justify-content: center;\n padding: 48px;\n background: rgba(0, 0, 0, 0.72);\n backdrop-filter: blur(2px);\n opacity: 0;\n transition: opacity 0.2s ease;\n}\n.canvas-react-image-preview-entered {\n opacity: 1;\n}\n.canvas-react-image-preview-leave {\n opacity: 0;\n}\n.canvas-react-image-preview-image {\n max-width: 90vw;\n max-height: 86vh;\n object-fit: contain;\n border-radius: 4px;\n box-shadow: 0 12px 48px rgba(0, 0, 0, 0.32);\n opacity: 0;\n transition: transform 0.2s ease, opacity 0.2s ease;\n user-select: none;\n}\n.canvas-react-image-preview-entered .canvas-react-image-preview-image {\n opacity: 1;\n}\n.canvas-react-image-preview-leave .canvas-react-image-preview-image {\n opacity: 0;\n}\n.canvas-react-image-preview-close {\n position: fixed;\n top: 20px;\n right: 24px;\n width: 40px;\n height: 40px;\n padding: 0;\n border: 0;\n border-radius: 50%;\n color: #fff;\n background: rgba(255, 255, 255, 0.14);\n font: 30px/38px sans-serif;\n cursor: pointer;\n}\n.canvas-react-image-preview-toolbar {\n position: fixed;\n bottom: 28px;\n left: 50%;\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 6px 10px;\n color: #fff;\n background: rgba(0, 0, 0, 0.64);\n border-radius: 22px;\n box-shadow: 0 6px 24px rgba(0, 0, 0, 0.24);\n transform: translateX(-50%);\n opacity: 0;\n transition: opacity 0.2s ease;\n}\n.canvas-react-image-preview-entered .canvas-react-image-preview-toolbar {\n opacity: 1;\n}\n.canvas-react-image-preview-tool {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: 0;\n border-radius: 6px;\n color: inherit;\n background: transparent;\n font: 20px/1 sans-serif;\n cursor: pointer;\n}\n.canvas-react-image-preview-tool:hover:not(:disabled) {\n background: rgba(255, 255, 255, 0.16);\n}\n.canvas-react-image-preview-tool:disabled {\n color: rgba(255, 255, 255, 0.35);\n cursor: not-allowed;\n}\n.canvas-react-image-preview-scale {\n min-width: 48px;\n color: rgba(255, 255, 255, 0.88);\n font-size: 12px;\n text-align: center;\n}\n");
|
|
3790
4713
|
function ReactImagePreview(props) {
|
|
@@ -4326,723 +5249,669 @@ function parseMonthValue(value) {
|
|
|
4326
5249
|
if (!matched) {
|
|
4327
5250
|
return null;
|
|
4328
5251
|
}
|
|
4329
|
-
const month = matched[2];
|
|
4330
|
-
if (!MONTHS4.includes(month)) {
|
|
4331
|
-
return null;
|
|
4332
|
-
}
|
|
4333
|
-
return {
|
|
4334
|
-
month,
|
|
4335
|
-
year: Number(matched[1])
|
|
4336
|
-
};
|
|
4337
|
-
}
|
|
4338
|
-
function resolveDecadeStart4(year) {
|
|
4339
|
-
return Math.floor(year / 10) * 10;
|
|
4340
|
-
}
|
|
4341
|
-
|
|
4342
|
-
// src/components/number-input/style.css
|
|
4343
|
-
styleInject('@import "../../styles/variables.css";\n.canvas-react-number-input-affix-wrapper {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n width: 100%;\n min-width: 0;\n height: var(--canvas-react-control-height);\n border: 1px solid var(--canvas-react-color-border);\n border-radius: var(--canvas-react-radius-sm);\n background: var(--canvas-react-color-bg);\n color: var(--canvas-react-color-text);\n font-size: var(--canvas-react-font-size);\n outline: none;\n transition:\n border-color 0.2s ease,\n box-shadow 0.2s ease,\n background-color 0.2s ease;\n}\n.canvas-react-number-input-affix-wrapper:hover {\n border-color: var(--canvas-react-color-primary-hover);\n}\n.canvas-react-number-input-affix-wrapper:focus-within {\n border-color: var(--canvas-react-color-primary);\n box-shadow: var(--canvas-react-shadow-focus);\n}\n.canvas-react-number-input-affix-wrapper-disabled {\n background: #fafafa;\n color: #9ca3af;\n cursor: not-allowed;\n}\n.canvas-react-number-input {\n box-sizing: border-box;\n flex: 1 1 auto;\n width: 100%;\n min-width: 0;\n height: 100%;\n padding: var(--canvas-react-control-padding-block, 0px) var(--canvas-react-control-padding-inline, 11px);\n border: none;\n background: transparent;\n color: inherit;\n font-size: inherit;\n outline: none;\n appearance: textfield;\n -moz-appearance: textfield;\n}\n.canvas-react-number-input::placeholder {\n color: #9ca3af;\n}\n.canvas-react-number-input::-webkit-outer-spin-button,\n.canvas-react-number-input::-webkit-inner-spin-button {\n margin: 0;\n -webkit-appearance: none;\n}\n.canvas-react-number-input-suffix {\n display: inline-flex;\n align-items: center;\n padding-right: var(--canvas-react-control-padding-inline, 11px);\n}\n.canvas-react-number-input-clear {\n position: relative;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n padding: 0;\n border: none;\n background: transparent;\n color: #9ca3af;\n opacity: 0;\n pointer-events: none;\n cursor: pointer;\n transition:\n color 0.2s ease,\n opacity 0.2s ease,\n transform 0.18s ease;\n}\n.canvas-react-number-input-affix-wrapper:hover .canvas-react-number-input-clear,\n.canvas-react-number-input-affix-wrapper:focus-within .canvas-react-number-input-clear {\n opacity: 1;\n pointer-events: auto;\n}\n.canvas-react-number-input-clear:hover {\n color: #6b7280;\n transform: rotate(90deg);\n}\n.canvas-react-number-input-clear-icon,\n.canvas-react-number-input-clear-icon::before {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 8px;\n height: 1.25px;\n margin-top: -0.625px;\n margin-left: -4px;\n border-radius: 999px;\n background: currentColor;\n content: "";\n}\n.canvas-react-number-input-clear-icon {\n transform: rotate(45deg);\n}\n.canvas-react-number-input-clear-icon::before {\n transform: rotate(90deg);\n}\n');
|
|
4344
|
-
var ReactNumberInput = React.forwardRef(
|
|
4345
|
-
function ReactNumberInput2(props, ref) {
|
|
4346
|
-
const {
|
|
4347
|
-
className,
|
|
4348
|
-
disabled,
|
|
4349
|
-
onBlur,
|
|
4350
|
-
onChange,
|
|
4351
|
-
onKeyDown,
|
|
4352
|
-
onPressEnter,
|
|
4353
|
-
style,
|
|
4354
|
-
value,
|
|
4355
|
-
...restProps
|
|
4356
|
-
} = props;
|
|
4357
|
-
const [inputValue, setInputValue] = React.useState(toDisplayValue(value));
|
|
4358
|
-
React.useEffect(() => {
|
|
4359
|
-
setInputValue(toDisplayValue(value));
|
|
4360
|
-
}, [value]);
|
|
4361
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
4362
|
-
"span",
|
|
4363
|
-
{
|
|
4364
|
-
className: joinClassNames(
|
|
4365
|
-
`${REACT_COMPONENT_PREFIX}-number-input-affix-wrapper`,
|
|
4366
|
-
disabled && `${REACT_COMPONENT_PREFIX}-number-input-affix-wrapper-disabled`
|
|
4367
|
-
),
|
|
4368
|
-
style,
|
|
4369
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
4370
|
-
"input",
|
|
4371
|
-
{
|
|
4372
|
-
...restProps,
|
|
4373
|
-
ref,
|
|
4374
|
-
disabled,
|
|
4375
|
-
type: "number",
|
|
4376
|
-
value: inputValue,
|
|
4377
|
-
className: joinClassNames(
|
|
4378
|
-
`${REACT_COMPONENT_PREFIX}-number-input`,
|
|
4379
|
-
className
|
|
4380
|
-
),
|
|
4381
|
-
onChange: (event) => {
|
|
4382
|
-
const nextText = event.target.value;
|
|
4383
|
-
setInputValue(nextText);
|
|
4384
|
-
onChange?.(parseNumberValue(nextText));
|
|
4385
|
-
},
|
|
4386
|
-
onBlur: (event) => {
|
|
4387
|
-
setInputValue(toDisplayValue(parseNumberValue(event.target.value)));
|
|
4388
|
-
onBlur?.(event);
|
|
4389
|
-
},
|
|
4390
|
-
onKeyDown: (event) => {
|
|
4391
|
-
onKeyDown?.(event);
|
|
4392
|
-
if (event.key === "Enter") {
|
|
4393
|
-
onPressEnter?.(event);
|
|
4394
|
-
}
|
|
4395
|
-
}
|
|
4396
|
-
}
|
|
4397
|
-
)
|
|
4398
|
-
}
|
|
4399
|
-
);
|
|
4400
|
-
}
|
|
4401
|
-
);
|
|
4402
|
-
function parseNumberValue(value) {
|
|
4403
|
-
if (value.trim().length === 0) {
|
|
5252
|
+
const month = matched[2];
|
|
5253
|
+
if (!MONTHS4.includes(month)) {
|
|
4404
5254
|
return null;
|
|
4405
5255
|
}
|
|
4406
|
-
|
|
4407
|
-
|
|
5256
|
+
return {
|
|
5257
|
+
month,
|
|
5258
|
+
year: Number(matched[1])
|
|
5259
|
+
};
|
|
4408
5260
|
}
|
|
4409
|
-
function
|
|
4410
|
-
return
|
|
5261
|
+
function resolveDecadeStart4(year) {
|
|
5262
|
+
return Math.floor(year / 10) * 10;
|
|
5263
|
+
}
|
|
5264
|
+
var compatibleIdSeed = 0;
|
|
5265
|
+
function useCompatibleId(prefix = "canvas-react-id") {
|
|
5266
|
+
const nativeUseId = React__namespace.useId;
|
|
5267
|
+
const fallbackIdRef = React__namespace.useRef();
|
|
5268
|
+
if (!fallbackIdRef.current) {
|
|
5269
|
+
compatibleIdSeed += 1;
|
|
5270
|
+
fallbackIdRef.current = `${prefix}-${compatibleIdSeed}`;
|
|
5271
|
+
}
|
|
5272
|
+
return nativeUseId ? nativeUseId() : fallbackIdRef.current;
|
|
4411
5273
|
}
|
|
4412
5274
|
|
|
4413
|
-
// src/components/
|
|
4414
|
-
styleInject('@import "../../styles/variables.css";\n.canvas-react-
|
|
4415
|
-
var
|
|
4416
|
-
|
|
4417
|
-
|
|
4418
|
-
|
|
4419
|
-
|
|
4420
|
-
|
|
4421
|
-
|
|
4422
|
-
|
|
4423
|
-
|
|
4424
|
-
|
|
4425
|
-
|
|
4426
|
-
|
|
4427
|
-
|
|
4428
|
-
|
|
4429
|
-
|
|
4430
|
-
|
|
4431
|
-
|
|
4432
|
-
|
|
4433
|
-
|
|
4434
|
-
|
|
4435
|
-
|
|
4436
|
-
|
|
4437
|
-
|
|
4438
|
-
|
|
4439
|
-
|
|
4440
|
-
|
|
4441
|
-
|
|
4442
|
-
|
|
4443
|
-
|
|
4444
|
-
|
|
4445
|
-
|
|
4446
|
-
|
|
4447
|
-
|
|
4448
|
-
|
|
4449
|
-
|
|
4450
|
-
|
|
4451
|
-
|
|
4452
|
-
|
|
4453
|
-
|
|
4454
|
-
|
|
4455
|
-
|
|
4456
|
-
|
|
4457
|
-
|
|
4458
|
-
|
|
4459
|
-
|
|
4460
|
-
|
|
4461
|
-
|
|
4462
|
-
|
|
4463
|
-
|
|
4464
|
-
|
|
4465
|
-
|
|
4466
|
-
|
|
5275
|
+
// src/components/modal/style.css
|
|
5276
|
+
styleInject('@import "../../styles/variables.css";\n.canvas-react-modal-root,\n.canvas-react-modal-root * {\n box-sizing: border-box;\n}\n.canvas-react-modal-root {\n position: fixed;\n inset: 0;\n color: var(--canvas-react-color-text);\n font-size: var(--canvas-react-font-size);\n line-height: 1.5;\n}\n.canvas-react-modal-root-passthrough {\n pointer-events: none;\n}\n.canvas-react-modal-root-passthrough .canvas-react-modal {\n pointer-events: auto;\n}\n.canvas-react-modal-mask {\n position: absolute;\n inset: 0;\n background: rgba(0, 0, 0, 0.45);\n}\n.canvas-react-modal-wrap {\n position: absolute;\n inset: 0;\n overflow: auto;\n padding: 100px 24px 24px;\n pointer-events: none;\n}\n.canvas-react-modal-root-centered .canvas-react-modal-wrap {\n display: flex;\n align-items: center;\n padding-top: 24px;\n}\n.canvas-react-modal-root-fullscreen .canvas-react-modal-wrap {\n padding: 0;\n overflow: hidden;\n}\n.canvas-react-modal {\n position: relative;\n display: flex;\n flex-direction: column;\n width: 520px;\n max-width: calc(100vw - 48px);\n max-height: calc(100vh - 124px);\n margin: 0 auto;\n overflow: hidden;\n border-radius: var(--canvas-react-radius-md, 8px);\n background: var(--canvas-react-color-bg, #ffffff);\n box-shadow: 0 12px 40px rgba(15, 23, 42, 0.22);\n outline: none;\n pointer-events: auto;\n}\n.canvas-react-modal-root-centered .canvas-react-modal {\n max-height: calc(100vh - 48px);\n}\n.canvas-react-modal.canvas-react-modal-fullscreen {\n width: 100% !important;\n max-width: none;\n height: 100%;\n max-height: none;\n border-radius: 0;\n}\n.canvas-react-modal-header {\n display: flex;\n flex: 0 0 auto;\n align-items: center;\n min-height: 56px;\n padding: 0 16px 0 24px;\n border-bottom: 1px solid var(--canvas-react-color-border);\n}\n.canvas-react-modal-header-draggable {\n cursor: move;\n user-select: none;\n}\n.canvas-react-modal-title {\n min-width: 0;\n flex: 1 1 auto;\n color: var(--canvas-react-color-text);\n font-size: 16px;\n font-weight: 600;\n overflow-wrap: anywhere;\n}\n.canvas-react-modal-tools {\n display: flex;\n flex: 0 0 auto;\n align-items: center;\n gap: 4px;\n margin-left: 16px;\n}\n.canvas-react-modal-tool {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n padding: 0;\n border: 0;\n border-radius: var(--canvas-react-radius-sm, 6px);\n background: transparent;\n color: var(--canvas-react-color-text-muted);\n cursor: pointer;\n transition: background-color 0.18s ease, color 0.18s ease;\n}\n.canvas-react-modal-tool:hover {\n background: var(--canvas-react-color-bg-hover);\n color: var(--canvas-react-color-text);\n}\n.canvas-react-modal-tool:focus-visible,\n.canvas-react-modal-button:focus-visible {\n outline: 2px solid var(--canvas-react-color-primary);\n outline-offset: 2px;\n}\n.canvas-react-modal-fullscreen-icon {\n position: relative;\n display: block;\n width: 15px;\n height: 15px;\n border: 1.5px solid currentColor;\n}\n.canvas-react-modal-fullscreen-icon-exit::before {\n position: absolute;\n inset: 3px -4px -4px 3px;\n border-right: 1.5px solid currentColor;\n border-bottom: 1.5px solid currentColor;\n content: "";\n}\n.canvas-react-modal-close-icon {\n position: relative;\n display: block;\n width: 16px;\n height: 16px;\n}\n.canvas-react-modal-close-icon::before,\n.canvas-react-modal-close-icon::after {\n position: absolute;\n top: 7px;\n left: 1px;\n width: 14px;\n height: 1.5px;\n border-radius: 1px;\n background: currentColor;\n content: "";\n}\n.canvas-react-modal-close-icon::before {\n transform: rotate(45deg);\n}\n.canvas-react-modal-close-icon::after {\n transform: rotate(-45deg);\n}\n.canvas-react-modal-body {\n min-height: 0;\n flex: 1 1 auto;\n overflow: auto;\n padding: 20px 24px;\n}\n.canvas-react-modal-footer {\n display: flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n padding: 12px 24px;\n border-top: 1px solid var(--canvas-react-color-border);\n}\n.canvas-react-modal-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: var(--canvas-react-control-height, 32px);\n min-width: 64px;\n padding: 0 var(--canvas-react-control-padding-inline, 11px);\n border: 1px solid var(--canvas-react-color-border);\n border-radius: var(--canvas-react-radius-sm, 6px);\n background: var(--canvas-react-color-bg);\n color: var(--canvas-react-color-text);\n font: inherit;\n line-height: 1;\n white-space: nowrap;\n cursor: pointer;\n transition:\n border-color 0.18s ease,\n background-color 0.18s ease,\n color 0.18s ease,\n opacity 0.18s ease;\n}\n.canvas-react-modal-button:hover {\n border-color: var(--canvas-react-color-primary-hover);\n color: var(--canvas-react-color-primary-hover);\n}\n.canvas-react-modal-button-primary {\n border-color: var(--canvas-react-color-primary);\n background: var(--canvas-react-color-primary);\n color: #ffffff;\n}\n.canvas-react-modal-button-primary:hover {\n border-color: var(--canvas-react-color-primary-hover);\n background: var(--canvas-react-color-primary-hover);\n color: #ffffff;\n}\n.canvas-react-modal-button:disabled {\n opacity: 0.56;\n cursor: not-allowed;\n}\n.canvas-react-modal-loading {\n width: 14px;\n height: 14px;\n border: 2px solid rgba(255, 255, 255, 0.45);\n border-top-color: #ffffff;\n border-radius: 50%;\n animation: canvas-react-modal-loading 0.8s linear infinite;\n}\n.canvas-react-modal-motion-enter-active,\n.canvas-react-modal-motion-leave-active {\n transition: opacity 0.2s ease;\n}\n.canvas-react-modal-motion-enter-active .canvas-react-modal,\n.canvas-react-modal-motion-leave-active .canvas-react-modal {\n transition: opacity 0.2s ease, transform 0.2s cubic-bezier(0.16, 1, 0.3, 1);\n}\n.canvas-react-modal-motion-enter-from,\n.canvas-react-modal-motion-leave-to {\n opacity: 0;\n}\n.canvas-react-modal-motion-enter-from .canvas-react-modal,\n.canvas-react-modal-motion-leave-to .canvas-react-modal {\n opacity: 0;\n transform: scale(0.96) translateY(-8px);\n}\n@keyframes canvas-react-modal-loading {\n to {\n transform: rotate(360deg);\n }\n}\n@media (max-width: 575px) {\n .canvas-react-modal-wrap {\n padding: 24px 12px;\n }\n .canvas-react-modal {\n max-width: calc(100vw - 24px);\n max-height: calc(100vh - 48px);\n }\n .canvas-react-modal-header {\n padding-right: 12px;\n padding-left: 16px;\n }\n .canvas-react-modal-body {\n padding: 16px;\n }\n .canvas-react-modal-footer {\n padding: 12px 16px;\n }\n}\n@media (prefers-reduced-motion: reduce) {\n .canvas-react-modal-motion-enter-active,\n .canvas-react-modal-motion-leave-active,\n .canvas-react-modal-motion-enter-active .canvas-react-modal,\n .canvas-react-modal-motion-leave-active .canvas-react-modal {\n transition-duration: 0.01ms;\n }\n}\n');
|
|
5277
|
+
var MODAL_MOTION_DURATION = 200;
|
|
5278
|
+
var FOCUSABLE_SELECTOR = [
|
|
5279
|
+
"a[href]",
|
|
5280
|
+
"button:not([disabled])",
|
|
5281
|
+
"input:not([disabled])",
|
|
5282
|
+
"select:not([disabled])",
|
|
5283
|
+
"textarea:not([disabled])",
|
|
5284
|
+
'[tabindex]:not([tabindex="-1"])'
|
|
5285
|
+
].join(",");
|
|
5286
|
+
var bodyScrollLockCount = 0;
|
|
5287
|
+
var bodyOverflowBeforeLock = "";
|
|
5288
|
+
function ReactModal(props) {
|
|
5289
|
+
const {
|
|
5290
|
+
afterClose,
|
|
5291
|
+
bodyStyle,
|
|
5292
|
+
cancelButtonProps,
|
|
5293
|
+
cancelText = "\u53D6\u6D88",
|
|
5294
|
+
centered = false,
|
|
5295
|
+
children,
|
|
5296
|
+
className,
|
|
5297
|
+
closable = true,
|
|
5298
|
+
confirmLoading,
|
|
5299
|
+
defaultFullscreen = false,
|
|
5300
|
+
draggable = false,
|
|
5301
|
+
focusTriggerAfterClose = true,
|
|
5302
|
+
footer,
|
|
5303
|
+
fullscreen,
|
|
5304
|
+
fullscreenable = true,
|
|
5305
|
+
getContainer,
|
|
5306
|
+
keyboard = true,
|
|
5307
|
+
mask = true,
|
|
5308
|
+
maskClosable = true,
|
|
5309
|
+
maskStyle,
|
|
5310
|
+
okButtonProps,
|
|
5311
|
+
okText = "\u786E\u5B9A",
|
|
5312
|
+
onCancel,
|
|
5313
|
+
onFullscreenChange,
|
|
5314
|
+
onOk,
|
|
5315
|
+
open,
|
|
5316
|
+
rootClassName,
|
|
5317
|
+
style,
|
|
5318
|
+
title,
|
|
5319
|
+
width = 520,
|
|
5320
|
+
zIndex = 1e3
|
|
5321
|
+
} = props;
|
|
5322
|
+
const transition = useReactTransition({
|
|
5323
|
+
duration: MODAL_MOTION_DURATION,
|
|
5324
|
+
name: `${REACT_COMPONENT_PREFIX}-modal-motion`,
|
|
5325
|
+
show: open
|
|
5326
|
+
});
|
|
5327
|
+
const [innerFullscreen, setInnerFullscreen] = React.useState(defaultFullscreen);
|
|
5328
|
+
const [innerConfirmLoading, setInnerConfirmLoading] = React.useState(false);
|
|
5329
|
+
const [dragOffset, setDragOffset] = React.useState({ x: 0, y: 0 });
|
|
5330
|
+
const panelRef = React.useRef(null);
|
|
5331
|
+
const dragRef = React.useRef(null);
|
|
5332
|
+
const restoreFocusRef = React.useRef(null);
|
|
5333
|
+
const wasRenderedRef = React.useRef(false);
|
|
5334
|
+
const titleId = useCompatibleId(`${REACT_COMPONENT_PREFIX}-modal-title`);
|
|
5335
|
+
const controlledFullscreen = fullscreen !== void 0;
|
|
5336
|
+
const mergedFullscreen = controlledFullscreen ? Boolean(fullscreen) : innerFullscreen;
|
|
5337
|
+
const mergedConfirmLoading = confirmLoading ?? innerConfirmLoading;
|
|
5338
|
+
const hasTitle = title !== null && title !== void 0 && title !== false;
|
|
5339
|
+
React.useEffect(() => {
|
|
5340
|
+
if (!draggable || !transition.rendered) return;
|
|
5341
|
+
const handleMouseMove = (event) => {
|
|
5342
|
+
const drag = dragRef.current;
|
|
5343
|
+
if (!drag) return;
|
|
5344
|
+
setDragOffset({
|
|
5345
|
+
x: drag.offsetX + event.clientX - drag.startX,
|
|
5346
|
+
y: drag.offsetY + event.clientY - drag.startY
|
|
4467
5347
|
});
|
|
4468
|
-
|
|
4469
|
-
|
|
5348
|
+
};
|
|
5349
|
+
const handleMouseUp = () => {
|
|
5350
|
+
dragRef.current = null;
|
|
5351
|
+
};
|
|
5352
|
+
window.addEventListener("mousemove", handleMouseMove);
|
|
5353
|
+
window.addEventListener("mouseup", handleMouseUp);
|
|
5354
|
+
return () => {
|
|
5355
|
+
window.removeEventListener("mousemove", handleMouseMove);
|
|
5356
|
+
window.removeEventListener("mouseup", handleMouseUp);
|
|
5357
|
+
};
|
|
5358
|
+
}, [draggable, transition.rendered]);
|
|
5359
|
+
React.useEffect(() => {
|
|
5360
|
+
if (!open) {
|
|
5361
|
+
dragRef.current = null;
|
|
5362
|
+
setDragOffset({ x: 0, y: 0 });
|
|
5363
|
+
}
|
|
5364
|
+
}, [open]);
|
|
5365
|
+
React.useEffect(() => {
|
|
5366
|
+
if (!transition.rendered) {
|
|
5367
|
+
if (wasRenderedRef.current) {
|
|
5368
|
+
wasRenderedRef.current = false;
|
|
5369
|
+
afterClose?.();
|
|
5370
|
+
if (focusTriggerAfterClose) {
|
|
5371
|
+
restoreFocusRef.current?.focus();
|
|
5372
|
+
}
|
|
5373
|
+
restoreFocusRef.current = null;
|
|
4470
5374
|
}
|
|
4471
|
-
|
|
4472
|
-
|
|
4473
|
-
|
|
4474
|
-
|
|
4475
|
-
|
|
4476
|
-
|
|
5375
|
+
return;
|
|
5376
|
+
}
|
|
5377
|
+
if (!wasRenderedRef.current) {
|
|
5378
|
+
wasRenderedRef.current = true;
|
|
5379
|
+
restoreFocusRef.current = document.activeElement instanceof HTMLElement ? document.activeElement : null;
|
|
5380
|
+
}
|
|
5381
|
+
if (mask) {
|
|
5382
|
+
lockBodyScroll();
|
|
5383
|
+
return unlockBodyScroll;
|
|
5384
|
+
}
|
|
5385
|
+
}, [afterClose, focusTriggerAfterClose, mask, transition.rendered]);
|
|
5386
|
+
React.useEffect(() => {
|
|
5387
|
+
if (!mask || !open || !transition.rendered) {
|
|
5388
|
+
return;
|
|
5389
|
+
}
|
|
5390
|
+
const frameId = window.requestAnimationFrame(() => {
|
|
5391
|
+
panelRef.current?.focus();
|
|
5392
|
+
});
|
|
5393
|
+
return () => {
|
|
5394
|
+
window.cancelAnimationFrame(frameId);
|
|
4477
5395
|
};
|
|
4478
|
-
|
|
4479
|
-
|
|
5396
|
+
}, [mask, open, transition.rendered]);
|
|
5397
|
+
React.useEffect(() => {
|
|
5398
|
+
if (!mask || !transition.rendered) {
|
|
5399
|
+
return;
|
|
5400
|
+
}
|
|
5401
|
+
const handleKeyDown = (event) => {
|
|
5402
|
+
if (event.key === "Escape" && keyboard && open) {
|
|
5403
|
+
event.preventDefault();
|
|
5404
|
+
onCancel?.(event);
|
|
4480
5405
|
return;
|
|
4481
5406
|
}
|
|
4482
|
-
|
|
4483
|
-
|
|
4484
|
-
|
|
5407
|
+
if (event.key !== "Tab" || !open) {
|
|
5408
|
+
return;
|
|
5409
|
+
}
|
|
5410
|
+
trapFocus(event, panelRef.current);
|
|
4485
5411
|
};
|
|
4486
|
-
|
|
4487
|
-
|
|
4488
|
-
|
|
4489
|
-
|
|
5412
|
+
document.addEventListener("keydown", handleKeyDown);
|
|
5413
|
+
return () => {
|
|
5414
|
+
document.removeEventListener("keydown", handleKeyDown);
|
|
5415
|
+
};
|
|
5416
|
+
}, [keyboard, mask, onCancel, open, transition.rendered]);
|
|
5417
|
+
const setFullscreen = (nextFullscreen) => {
|
|
5418
|
+
if (!controlledFullscreen) {
|
|
5419
|
+
setInnerFullscreen(nextFullscreen);
|
|
5420
|
+
}
|
|
5421
|
+
if (nextFullscreen !== mergedFullscreen) {
|
|
5422
|
+
onFullscreenChange?.(nextFullscreen);
|
|
5423
|
+
}
|
|
5424
|
+
};
|
|
5425
|
+
const handleOk = (event) => {
|
|
5426
|
+
if (mergedConfirmLoading || okButtonProps?.disabled) {
|
|
5427
|
+
return;
|
|
5428
|
+
}
|
|
5429
|
+
const result = onOk?.(event);
|
|
5430
|
+
if (!isPromiseLike(result)) {
|
|
5431
|
+
return;
|
|
5432
|
+
}
|
|
5433
|
+
setInnerConfirmLoading(true);
|
|
5434
|
+
Promise.resolve(result).catch(() => void 0).finally(() => {
|
|
5435
|
+
setInnerConfirmLoading(false);
|
|
5436
|
+
});
|
|
5437
|
+
};
|
|
5438
|
+
if (!transition.rendered || typeof document === "undefined") {
|
|
5439
|
+
return null;
|
|
5440
|
+
}
|
|
5441
|
+
const container = resolveContainer(getContainer);
|
|
5442
|
+
if (!container) {
|
|
5443
|
+
return null;
|
|
5444
|
+
}
|
|
5445
|
+
const {
|
|
5446
|
+
className: okButtonClassName,
|
|
5447
|
+
disabled: okButtonDisabled,
|
|
5448
|
+
...restOkButtonProps
|
|
5449
|
+
} = okButtonProps ?? {};
|
|
5450
|
+
const {
|
|
5451
|
+
className: cancelButtonClassName,
|
|
5452
|
+
disabled: cancelButtonDisabled,
|
|
5453
|
+
...restCancelButtonProps
|
|
5454
|
+
} = cancelButtonProps ?? {};
|
|
5455
|
+
const defaultFooter = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
5456
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5457
|
+
"button",
|
|
4490
5458
|
{
|
|
5459
|
+
...restCancelButtonProps,
|
|
5460
|
+
type: "button",
|
|
4491
5461
|
className: joinClassNames(
|
|
4492
|
-
`${REACT_COMPONENT_PREFIX}-
|
|
4493
|
-
|
|
4494
|
-
disabled && `${REACT_COMPONENT_PREFIX}-input-number-disabled`,
|
|
4495
|
-
className
|
|
5462
|
+
`${REACT_COMPONENT_PREFIX}-modal-button`,
|
|
5463
|
+
cancelButtonClassName
|
|
4496
5464
|
),
|
|
4497
|
-
|
|
5465
|
+
disabled: mergedConfirmLoading || cancelButtonDisabled,
|
|
5466
|
+
onClick: onCancel,
|
|
5467
|
+
children: cancelText
|
|
5468
|
+
}
|
|
5469
|
+
),
|
|
5470
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
5471
|
+
"button",
|
|
5472
|
+
{
|
|
5473
|
+
...restOkButtonProps,
|
|
5474
|
+
type: "button",
|
|
5475
|
+
className: joinClassNames(
|
|
5476
|
+
`${REACT_COMPONENT_PREFIX}-modal-button`,
|
|
5477
|
+
`${REACT_COMPONENT_PREFIX}-modal-button-primary`,
|
|
5478
|
+
okButtonClassName
|
|
5479
|
+
),
|
|
5480
|
+
disabled: mergedConfirmLoading || okButtonDisabled,
|
|
5481
|
+
onClick: handleOk,
|
|
4498
5482
|
children: [
|
|
4499
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4500
|
-
"
|
|
5483
|
+
mergedConfirmLoading ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
5484
|
+
"span",
|
|
4501
5485
|
{
|
|
4502
|
-
|
|
4503
|
-
|
|
4504
|
-
disabled: disabled || atMin,
|
|
4505
|
-
className: joinClassNames(
|
|
4506
|
-
`${REACT_COMPONENT_PREFIX}-input-number-handler`,
|
|
4507
|
-
`${REACT_COMPONENT_PREFIX}-input-number-handler-down`
|
|
4508
|
-
),
|
|
4509
|
-
"aria-label": "\u51CF\u5C11",
|
|
4510
|
-
onMouseDown: (event) => {
|
|
4511
|
-
event.preventDefault();
|
|
4512
|
-
},
|
|
4513
|
-
onClick: () => {
|
|
4514
|
-
stepBy(-1);
|
|
4515
|
-
},
|
|
4516
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
4517
|
-
"span",
|
|
4518
|
-
{
|
|
4519
|
-
className: `${REACT_COMPONENT_PREFIX}-input-number-handler-icon`,
|
|
4520
|
-
"aria-hidden": "true"
|
|
4521
|
-
}
|
|
4522
|
-
)
|
|
5486
|
+
className: `${REACT_COMPONENT_PREFIX}-modal-loading`,
|
|
5487
|
+
"aria-hidden": "true"
|
|
4523
5488
|
}
|
|
4524
|
-
),
|
|
4525
|
-
/* @__PURE__ */ jsxRuntime.
|
|
4526
|
-
|
|
4527
|
-
|
|
4528
|
-
|
|
4529
|
-
|
|
4530
|
-
|
|
4531
|
-
|
|
4532
|
-
|
|
4533
|
-
|
|
4534
|
-
|
|
4535
|
-
|
|
4536
|
-
|
|
4537
|
-
|
|
4538
|
-
|
|
4539
|
-
|
|
4540
|
-
|
|
4541
|
-
|
|
4542
|
-
|
|
4543
|
-
|
|
4544
|
-
|
|
4545
|
-
|
|
4546
|
-
|
|
4547
|
-
|
|
4548
|
-
|
|
4549
|
-
|
|
4550
|
-
|
|
4551
|
-
|
|
4552
|
-
|
|
4553
|
-
},
|
|
4554
|
-
onKeyDown: (event) => {
|
|
4555
|
-
if (event.key === "ArrowUp") {
|
|
4556
|
-
event.preventDefault();
|
|
4557
|
-
stepBy(1);
|
|
4558
|
-
} else if (event.key === "ArrowDown") {
|
|
4559
|
-
event.preventDefault();
|
|
4560
|
-
stepBy(-1);
|
|
4561
|
-
} else if (event.key === "Enter") {
|
|
4562
|
-
const parsed = parser ? parser(event.currentTarget.value) : parseNumberText(event.currentTarget.value);
|
|
4563
|
-
commitValue(parsed);
|
|
4564
|
-
}
|
|
4565
|
-
onKeyDown?.(event);
|
|
5489
|
+
) : null,
|
|
5490
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { children: okText })
|
|
5491
|
+
]
|
|
5492
|
+
}
|
|
5493
|
+
)
|
|
5494
|
+
] });
|
|
5495
|
+
return reactDom.createPortal(
|
|
5496
|
+
/* @__PURE__ */ jsxRuntime.jsxs(
|
|
5497
|
+
"div",
|
|
5498
|
+
{
|
|
5499
|
+
className: joinClassNames(
|
|
5500
|
+
`${REACT_COMPONENT_PREFIX}-modal-root`,
|
|
5501
|
+
!mask && `${REACT_COMPONENT_PREFIX}-modal-root-passthrough`,
|
|
5502
|
+
centered && `${REACT_COMPONENT_PREFIX}-modal-root-centered`,
|
|
5503
|
+
mergedFullscreen && `${REACT_COMPONENT_PREFIX}-modal-root-fullscreen`,
|
|
5504
|
+
transition.className,
|
|
5505
|
+
rootClassName
|
|
5506
|
+
),
|
|
5507
|
+
style: { zIndex },
|
|
5508
|
+
children: [
|
|
5509
|
+
mask ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
5510
|
+
"div",
|
|
5511
|
+
{
|
|
5512
|
+
className: `${REACT_COMPONENT_PREFIX}-modal-mask`,
|
|
5513
|
+
style: maskStyle,
|
|
5514
|
+
"aria-hidden": "true",
|
|
5515
|
+
onMouseDown: (event) => {
|
|
5516
|
+
if (maskClosable && event.target === event.currentTarget) {
|
|
5517
|
+
onCancel?.(event);
|
|
4566
5518
|
}
|
|
4567
5519
|
}
|
|
4568
|
-
|
|
4569
|
-
|
|
4570
|
-
|
|
4571
|
-
|
|
4572
|
-
"button",
|
|
5520
|
+
}
|
|
5521
|
+
) : null,
|
|
5522
|
+
/* @__PURE__ */ jsxRuntime.jsx("div", { className: `${REACT_COMPONENT_PREFIX}-modal-wrap`, children: /* @__PURE__ */ jsxRuntime.jsxs(
|
|
5523
|
+
"div",
|
|
4573
5524
|
{
|
|
4574
|
-
|
|
4575
|
-
tabIndex: -1,
|
|
4576
|
-
disabled: disabled || atMax,
|
|
5525
|
+
ref: panelRef,
|
|
4577
5526
|
className: joinClassNames(
|
|
4578
|
-
`${REACT_COMPONENT_PREFIX}-
|
|
4579
|
-
`${REACT_COMPONENT_PREFIX}-
|
|
5527
|
+
`${REACT_COMPONENT_PREFIX}-modal`,
|
|
5528
|
+
mergedFullscreen && `${REACT_COMPONENT_PREFIX}-modal-fullscreen`,
|
|
5529
|
+
className
|
|
4580
5530
|
),
|
|
4581
|
-
|
|
4582
|
-
|
|
4583
|
-
|
|
4584
|
-
|
|
4585
|
-
|
|
4586
|
-
|
|
5531
|
+
style: {
|
|
5532
|
+
width,
|
|
5533
|
+
...style,
|
|
5534
|
+
...draggable && !mergedFullscreen ? {
|
|
5535
|
+
position: "relative",
|
|
5536
|
+
left: dragOffset.x,
|
|
5537
|
+
top: dragOffset.y
|
|
5538
|
+
} : void 0
|
|
4587
5539
|
},
|
|
4588
|
-
|
|
4589
|
-
|
|
4590
|
-
|
|
4591
|
-
|
|
4592
|
-
|
|
4593
|
-
|
|
4594
|
-
|
|
5540
|
+
role: "dialog",
|
|
5541
|
+
"aria-modal": mask ? "true" : void 0,
|
|
5542
|
+
"aria-label": hasTitle ? void 0 : "\u5BF9\u8BDD\u6846",
|
|
5543
|
+
"aria-labelledby": hasTitle ? titleId : void 0,
|
|
5544
|
+
tabIndex: -1,
|
|
5545
|
+
children: [
|
|
5546
|
+
hasTitle || closable || fullscreenable ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
5547
|
+
"div",
|
|
5548
|
+
{
|
|
5549
|
+
className: joinClassNames(
|
|
5550
|
+
`${REACT_COMPONENT_PREFIX}-modal-header`,
|
|
5551
|
+
draggable && !mergedFullscreen ? `${REACT_COMPONENT_PREFIX}-modal-header-draggable` : void 0
|
|
5552
|
+
),
|
|
5553
|
+
onMouseDown: (event) => {
|
|
5554
|
+
if (!draggable || mergedFullscreen || event.button !== 0) {
|
|
5555
|
+
return;
|
|
5556
|
+
}
|
|
5557
|
+
if (event.target.closest("button")) {
|
|
5558
|
+
return;
|
|
5559
|
+
}
|
|
5560
|
+
dragRef.current = {
|
|
5561
|
+
startX: event.clientX,
|
|
5562
|
+
startY: event.clientY,
|
|
5563
|
+
offsetX: dragOffset.x,
|
|
5564
|
+
offsetY: dragOffset.y
|
|
5565
|
+
};
|
|
5566
|
+
event.preventDefault();
|
|
5567
|
+
},
|
|
5568
|
+
children: [
|
|
5569
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5570
|
+
"div",
|
|
5571
|
+
{
|
|
5572
|
+
id: hasTitle ? titleId : void 0,
|
|
5573
|
+
className: `${REACT_COMPONENT_PREFIX}-modal-title`,
|
|
5574
|
+
children: title
|
|
5575
|
+
}
|
|
5576
|
+
),
|
|
5577
|
+
/* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${REACT_COMPONENT_PREFIX}-modal-tools`, children: [
|
|
5578
|
+
fullscreenable ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
5579
|
+
"button",
|
|
5580
|
+
{
|
|
5581
|
+
type: "button",
|
|
5582
|
+
className: `${REACT_COMPONENT_PREFIX}-modal-tool`,
|
|
5583
|
+
title: mergedFullscreen ? "\u9000\u51FA\u5168\u5C4F" : "\u5168\u5C4F",
|
|
5584
|
+
"aria-label": mergedFullscreen ? "\u9000\u51FA\u5168\u5C4F" : "\u5168\u5C4F",
|
|
5585
|
+
"aria-pressed": mergedFullscreen,
|
|
5586
|
+
onClick: () => setFullscreen(!mergedFullscreen),
|
|
5587
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
5588
|
+
"span",
|
|
5589
|
+
{
|
|
5590
|
+
className: joinClassNames(
|
|
5591
|
+
`${REACT_COMPONENT_PREFIX}-modal-fullscreen-icon`,
|
|
5592
|
+
mergedFullscreen && `${REACT_COMPONENT_PREFIX}-modal-fullscreen-icon-exit`
|
|
5593
|
+
),
|
|
5594
|
+
"aria-hidden": "true"
|
|
5595
|
+
}
|
|
5596
|
+
)
|
|
5597
|
+
}
|
|
5598
|
+
) : null,
|
|
5599
|
+
closable ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
5600
|
+
"button",
|
|
5601
|
+
{
|
|
5602
|
+
type: "button",
|
|
5603
|
+
className: `${REACT_COMPONENT_PREFIX}-modal-tool`,
|
|
5604
|
+
title: "\u5173\u95ED",
|
|
5605
|
+
"aria-label": "\u5173\u95ED",
|
|
5606
|
+
onClick: onCancel,
|
|
5607
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
5608
|
+
"span",
|
|
5609
|
+
{
|
|
5610
|
+
className: `${REACT_COMPONENT_PREFIX}-modal-close-icon`,
|
|
5611
|
+
"aria-hidden": "true"
|
|
5612
|
+
}
|
|
5613
|
+
)
|
|
5614
|
+
}
|
|
5615
|
+
) : null
|
|
5616
|
+
] })
|
|
5617
|
+
]
|
|
5618
|
+
}
|
|
5619
|
+
) : null,
|
|
5620
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5621
|
+
"div",
|
|
5622
|
+
{
|
|
5623
|
+
className: `${REACT_COMPONENT_PREFIX}-modal-body`,
|
|
5624
|
+
style: bodyStyle,
|
|
5625
|
+
children
|
|
5626
|
+
}
|
|
5627
|
+
),
|
|
5628
|
+
footer === false ? null : /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${REACT_COMPONENT_PREFIX}-modal-footer`, children: footer ?? defaultFooter })
|
|
5629
|
+
]
|
|
4595
5630
|
}
|
|
4596
|
-
)
|
|
5631
|
+
) })
|
|
4597
5632
|
]
|
|
4598
5633
|
}
|
|
4599
|
-
)
|
|
4600
|
-
|
|
4601
|
-
);
|
|
4602
|
-
function parseNumberText(value) {
|
|
4603
|
-
const text = value.trim().replace(/%/g, "");
|
|
4604
|
-
if (!text) {
|
|
4605
|
-
return null;
|
|
4606
|
-
}
|
|
4607
|
-
const nextValue = Number(text);
|
|
4608
|
-
return Number.isFinite(nextValue) ? nextValue : null;
|
|
5634
|
+
),
|
|
5635
|
+
container
|
|
5636
|
+
);
|
|
4609
5637
|
}
|
|
4610
|
-
function
|
|
4611
|
-
if (typeof
|
|
4612
|
-
return
|
|
4613
|
-
}
|
|
4614
|
-
const stepText = String(step);
|
|
4615
|
-
if (!stepText.includes(".")) {
|
|
4616
|
-
return 0;
|
|
5638
|
+
function resolveContainer(getContainer) {
|
|
5639
|
+
if (typeof document === "undefined") {
|
|
5640
|
+
return null;
|
|
4617
5641
|
}
|
|
4618
|
-
return
|
|
5642
|
+
return typeof getContainer === "function" ? getContainer() : getContainer ?? document.body;
|
|
4619
5643
|
}
|
|
4620
|
-
function
|
|
4621
|
-
if (
|
|
4622
|
-
return
|
|
5644
|
+
function trapFocus(event, panel) {
|
|
5645
|
+
if (!panel) {
|
|
5646
|
+
return;
|
|
4623
5647
|
}
|
|
4624
|
-
|
|
4625
|
-
|
|
4626
|
-
|
|
5648
|
+
const focusableElements = Array.from(
|
|
5649
|
+
panel.querySelectorAll(FOCUSABLE_SELECTOR)
|
|
5650
|
+
).filter((element) => element.offsetParent !== null);
|
|
5651
|
+
if (focusableElements.length === 0) {
|
|
5652
|
+
event.preventDefault();
|
|
5653
|
+
panel.focus();
|
|
5654
|
+
return;
|
|
4627
5655
|
}
|
|
4628
|
-
|
|
4629
|
-
|
|
5656
|
+
const first = focusableElements[0];
|
|
5657
|
+
const last = focusableElements[focusableElements.length - 1];
|
|
5658
|
+
const active = document.activeElement;
|
|
5659
|
+
if (event.shiftKey && (active === first || !panel.contains(active))) {
|
|
5660
|
+
event.preventDefault();
|
|
5661
|
+
last.focus();
|
|
5662
|
+
} else if (!event.shiftKey && (active === last || !panel.contains(active))) {
|
|
5663
|
+
event.preventDefault();
|
|
5664
|
+
first.focus();
|
|
4630
5665
|
}
|
|
4631
|
-
const factor = 10 ** options.precision;
|
|
4632
|
-
return Math.round(next * factor) / factor;
|
|
4633
5666
|
}
|
|
4634
|
-
function
|
|
4635
|
-
if (
|
|
4636
|
-
|
|
5667
|
+
function lockBodyScroll() {
|
|
5668
|
+
if (bodyScrollLockCount === 0) {
|
|
5669
|
+
bodyOverflowBeforeLock = document.body.style.overflow;
|
|
5670
|
+
document.body.style.overflow = "hidden";
|
|
4637
5671
|
}
|
|
4638
|
-
|
|
4639
|
-
|
|
5672
|
+
bodyScrollLockCount += 1;
|
|
5673
|
+
}
|
|
5674
|
+
function unlockBodyScroll() {
|
|
5675
|
+
bodyScrollLockCount = Math.max(0, bodyScrollLockCount - 1);
|
|
5676
|
+
if (bodyScrollLockCount === 0) {
|
|
5677
|
+
document.body.style.overflow = bodyOverflowBeforeLock;
|
|
4640
5678
|
}
|
|
4641
|
-
|
|
4642
|
-
|
|
5679
|
+
}
|
|
5680
|
+
function isPromiseLike(value) {
|
|
5681
|
+
return typeof value === "object" && value !== null && "then" in value && typeof value.then === "function";
|
|
4643
5682
|
}
|
|
4644
5683
|
|
|
4645
|
-
// src/components/
|
|
4646
|
-
styleInject('@import "../../styles/variables.css";\n.canvas-react-
|
|
4647
|
-
var
|
|
4648
|
-
|
|
4649
|
-
className,
|
|
4650
|
-
empty,
|
|
4651
|
-
height,
|
|
4652
|
-
innerClassName,
|
|
4653
|
-
itemHeight,
|
|
4654
|
-
itemKey,
|
|
4655
|
-
items,
|
|
4656
|
-
overscan = 2,
|
|
4657
|
-
renderItem,
|
|
4658
|
-
style,
|
|
4659
|
-
virtual = true
|
|
4660
|
-
} = props;
|
|
4661
|
-
const hostRef = React.useRef(null);
|
|
4662
|
-
const [scrollTop, setScrollTop] = React.useState(0);
|
|
4663
|
-
const useVirtual = virtual && items.length * itemHeight > height;
|
|
4664
|
-
const startIndex = useVirtual ? Math.max(0, Math.floor(scrollTop / itemHeight) - overscan) : 0;
|
|
4665
|
-
const endIndex = useVirtual ? Math.min(
|
|
4666
|
-
items.length - 1,
|
|
4667
|
-
Math.ceil((scrollTop + height) / itemHeight) + overscan
|
|
4668
|
-
) : items.length - 1;
|
|
4669
|
-
const visibleItems = React.useMemo(
|
|
4670
|
-
() => items.slice(startIndex, endIndex + 1),
|
|
4671
|
-
[endIndex, items, startIndex]
|
|
4672
|
-
);
|
|
4673
|
-
React.useImperativeHandle(ref, () => ({
|
|
4674
|
-
scrollToIndex: (index) => {
|
|
4675
|
-
const element = hostRef.current;
|
|
4676
|
-
if (!element || index < 0) {
|
|
4677
|
-
return;
|
|
4678
|
-
}
|
|
4679
|
-
const itemTop = index * itemHeight;
|
|
4680
|
-
const itemBottom = itemTop + itemHeight;
|
|
4681
|
-
const viewportTop = element.scrollTop;
|
|
4682
|
-
const viewportBottom = viewportTop + height;
|
|
4683
|
-
if (itemTop < viewportTop) {
|
|
4684
|
-
element.scrollTop = itemTop;
|
|
4685
|
-
return;
|
|
4686
|
-
}
|
|
4687
|
-
if (itemBottom > viewportBottom) {
|
|
4688
|
-
element.scrollTop = itemBottom - height;
|
|
4689
|
-
}
|
|
4690
|
-
},
|
|
4691
|
-
element: hostRef.current
|
|
4692
|
-
}));
|
|
4693
|
-
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
4694
|
-
"div",
|
|
4695
|
-
{
|
|
4696
|
-
ref: hostRef,
|
|
4697
|
-
className: joinClassNames(`${REACT_COMPONENT_PREFIX}-virtual-list`, className),
|
|
4698
|
-
style: { height, ...style },
|
|
4699
|
-
onScroll: (event) => {
|
|
4700
|
-
setScrollTop(event.currentTarget.scrollTop);
|
|
4701
|
-
},
|
|
4702
|
-
children: items.length === 0 ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${REACT_COMPONENT_PREFIX}-virtual-list-empty`, children: empty ?? "\u6682\u65E0\u6570\u636E" }) : /* @__PURE__ */ jsxRuntime.jsx(
|
|
4703
|
-
"div",
|
|
4704
|
-
{
|
|
4705
|
-
className: joinClassNames(
|
|
4706
|
-
`${REACT_COMPONENT_PREFIX}-virtual-list-inner`,
|
|
4707
|
-
innerClassName
|
|
4708
|
-
),
|
|
4709
|
-
style: { height: items.length * itemHeight },
|
|
4710
|
-
children: visibleItems.map((item, index) => {
|
|
4711
|
-
const itemIndex = startIndex + index;
|
|
4712
|
-
return renderItem(item, itemIndex, {
|
|
4713
|
-
style: useVirtual ? {
|
|
4714
|
-
position: "absolute",
|
|
4715
|
-
top: itemIndex * itemHeight,
|
|
4716
|
-
left: 0,
|
|
4717
|
-
right: 0,
|
|
4718
|
-
height: itemHeight
|
|
4719
|
-
} : {
|
|
4720
|
-
height: itemHeight
|
|
4721
|
-
}
|
|
4722
|
-
});
|
|
4723
|
-
})
|
|
4724
|
-
}
|
|
4725
|
-
)
|
|
4726
|
-
}
|
|
4727
|
-
);
|
|
4728
|
-
});
|
|
4729
|
-
|
|
4730
|
-
// src/components/select/style.css
|
|
4731
|
-
styleInject('@import "../../styles/variables.css";\n.canvas-react-select-wrap {\n position: relative;\n display: inline-flex;\n width: 100%;\n height: 100%;\n}\n.canvas-react-select {\n box-sizing: border-box;\n display: inline-flex;\n align-items: center;\n width: 100%;\n min-width: 0;\n height: var(--canvas-react-control-height);\n padding: var(--canvas-react-control-padding-block, 0px) var(--canvas-react-control-padding-inline, 11px);\n border: 1px solid var(--canvas-react-color-border);\n border-radius: var(--canvas-react-radius-sm);\n background: var(--canvas-react-color-bg);\n color: var(--canvas-react-color-text);\n font-size: var(--canvas-react-font-size);\n outline: none;\n cursor: pointer;\n transition:\n border-color 0.2s ease,\n box-shadow 0.2s ease,\n background-color 0.2s ease;\n}\n.canvas-react-select-input-wrap {\n flex: 1 1 auto;\n width: 100%;\n height: 100%;\n border: none;\n background: transparent;\n box-shadow: none;\n}\n.canvas-react-select .canvas-react-input-affix-wrapper {\n height: 100%;\n min-height: 0;\n}\n.canvas-react-select-input-wrap:hover,\n.canvas-react-select-input-wrap:focus-within {\n border-color: transparent;\n box-shadow: none;\n}\n.canvas-react-select-input {\n width: 100%;\n min-width: 0;\n height: 100%;\n padding: 0;\n line-height: normal;\n}\n.canvas-react-select-input::placeholder {\n color: #9ca3af;\n}\n.canvas-react-select:hover {\n border-color: var(--canvas-react-color-primary-hover);\n}\n.canvas-react-select:focus {\n border-color: var(--canvas-react-color-primary);\n box-shadow: var(--canvas-react-shadow-focus);\n}\n.canvas-react-select-open {\n border-color: var(--canvas-react-color-primary);\n box-shadow: var(--canvas-react-shadow-focus);\n}\n.canvas-react-select-disabled {\n color: #9ca3af;\n background: #fafafa;\n cursor: not-allowed;\n}\n.canvas-react-select-actions {\n position: relative;\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: 1em;\n min-width: 12px;\n height: 1em;\n min-height: 12px;\n margin-left: max(6px, calc(var(--canvas-react-control-padding-inline, 11px) * 0.5));\n}\n.canvas-react-select-arrow {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 0.5em;\n height: 0.5em;\n min-width: 6px;\n min-height: 6px;\n border-right: 1.5px solid var(--canvas-react-color-text-muted);\n border-bottom: 1.5px solid var(--canvas-react-color-text-muted);\n transform: translate(-50%, -58%) rotate(45deg);\n opacity: 1;\n transition:\n opacity 0.18s ease,\n transform 0.18s ease,\n border-color 0.18s ease;\n}\n.canvas-react-select:hover .canvas-react-select-arrow,\n.canvas-react-select-open .canvas-react-select-arrow {\n border-color: #6b7280;\n}\n.canvas-react-select-arrow-open {\n border-color: #6b7280;\n transform: translate(-50%, -42%) rotate(225deg);\n}\n.canvas-react-select-clear {\n position: absolute;\n top: 50%;\n left: 50%;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 12px;\n height: 12px;\n padding: 0;\n border: none;\n background: transparent;\n color: #9ca3af;\n opacity: 0;\n pointer-events: none;\n cursor: pointer;\n transform: translate(-50%, -50%) rotate(0deg);\n transition:\n color 0.2s ease,\n opacity 0.2s ease,\n transform 0.18s ease;\n}\n.canvas-react-select-clear:hover {\n color: #6b7280;\n transform: translate(-50%, -50%) rotate(90deg);\n}\n.canvas-react-select:hover .canvas-react-select-clear,\n.canvas-react-select-open .canvas-react-select-clear,\n.canvas-react-select:focus-within .canvas-react-select-clear {\n opacity: 1;\n pointer-events: auto;\n}\n.canvas-react-select:hover .canvas-react-select-actions-clearable .canvas-react-select-arrow,\n.canvas-react-select-open .canvas-react-select-actions-clearable .canvas-react-select-arrow,\n.canvas-react-select:focus-within .canvas-react-select-actions-clearable .canvas-react-select-arrow {\n opacity: 0;\n}\n.canvas-react-select-clear-icon,\n.canvas-react-select-clear-icon::before {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 8px;\n height: 1.25px;\n margin-top: -0.625px;\n margin-left: -4px;\n border-radius: 999px;\n background: currentColor;\n content: "";\n}\n.canvas-react-select-clear-icon {\n transform: rotate(45deg);\n}\n.canvas-react-select-clear-icon::before {\n transform: rotate(90deg);\n}\n.canvas-react-select-dropdown {\n padding: 4px;\n}\n.canvas-react-select-list {\n position: relative;\n overflow-y: auto;\n}\n.canvas-react-select-list-inner {\n position: relative;\n}\n.canvas-react-select-option {\n display: flex;\n align-items: center;\n box-sizing: border-box;\n width: 100%;\n padding: 0 11px;\n border-radius: var(--canvas-react-radius-sm);\n color: var(--canvas-react-color-text);\n font-size: var(--canvas-react-font-size);\n cursor: pointer;\n}\n.canvas-react-select-option:hover,\n.canvas-react-select-option-active {\n background: var(--canvas-react-color-bg-hover);\n}\n.canvas-react-select-option-selected {\n background: var(--canvas-react-color-bg-active);\n color: var(--canvas-react-color-primary);\n}\n.canvas-react-select-option-disabled {\n color: #9ca3af;\n cursor: not-allowed;\n}\n.canvas-react-select-empty {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 100%;\n padding: 0 11px;\n color: #9ca3af;\n font-size: var(--canvas-react-font-size);\n}\n');
|
|
4732
|
-
var ReactSelect = React.forwardRef(
|
|
4733
|
-
function ReactSelect2(props, ref) {
|
|
5684
|
+
// src/components/input-number/style.css
|
|
5685
|
+
styleInject('@import "../../styles/variables.css";\n.canvas-react-input-number {\n box-sizing: border-box;\n display: inline-flex;\n align-items: stretch;\n width: 100%;\n min-width: 0;\n height: var(--canvas-react-control-height);\n border: 1px solid var(--canvas-react-color-border);\n border-radius: var(--canvas-react-radius-sm);\n background: var(--canvas-react-color-bg);\n color: var(--canvas-react-color-text);\n font-size: var(--canvas-react-font-size);\n overflow: hidden;\n transition:\n border-color 0.2s ease,\n box-shadow 0.2s ease,\n background-color 0.2s ease;\n}\n.canvas-react-input-number:hover {\n border-color: var(--canvas-react-color-primary-hover);\n}\n.canvas-react-input-number-focused {\n border-color: var(--canvas-react-color-primary);\n box-shadow: var(--canvas-react-shadow-focus);\n}\n.canvas-react-input-number-disabled {\n background: #fafafa;\n color: #9ca3af;\n cursor: not-allowed;\n}\n.canvas-react-input-number-handler {\n position: relative;\n display: flex;\n flex: 0 0 28px;\n align-items: center;\n justify-content: center;\n margin: 0;\n padding: 0;\n border: none;\n background: transparent;\n color: var(--canvas-react-color-text-muted);\n cursor: pointer;\n transition: color 0.16s ease, background-color 0.16s ease;\n}\n.canvas-react-input-number-handler-down {\n border-right: 1px solid var(--canvas-react-color-border);\n}\n.canvas-react-input-number-handler-up {\n border-left: 1px solid var(--canvas-react-color-border);\n}\n.canvas-react-input-number-handler:hover:not(:disabled) {\n color: var(--canvas-react-color-primary);\n background: rgba(22, 119, 255, 0.06);\n}\n.canvas-react-input-number-handler:disabled {\n color: #c4c7cf;\n cursor: not-allowed;\n}\n.canvas-react-input-number-handler-icon {\n position: relative;\n display: block;\n width: 10px;\n height: 10px;\n}\n.canvas-react-input-number-handler-icon::before,\n.canvas-react-input-number-handler-icon::after {\n content: "";\n position: absolute;\n top: 50%;\n left: 50%;\n background: currentColor;\n border-radius: 1px;\n transform: translate(-50%, -50%);\n}\n.canvas-react-input-number-handler-icon::before {\n width: 10px;\n height: 1.5px;\n}\n.canvas-react-input-number-handler-up .canvas-react-input-number-handler-icon::after {\n width: 1.5px;\n height: 10px;\n}\n.canvas-react-input-number-input-wrap {\n display: flex;\n flex: 1 1 auto;\n align-items: center;\n min-width: 0;\n height: 100%;\n}\n.canvas-react-input-number-input {\n box-sizing: border-box;\n width: 100%;\n min-width: 0;\n height: 100%;\n padding: 0 8px;\n border: none;\n background: transparent;\n color: inherit;\n font-size: inherit;\n outline: none;\n text-align: center;\n appearance: textfield;\n -moz-appearance: textfield;\n}\n.canvas-react-input-number-input::placeholder {\n color: #9ca3af;\n}\n.canvas-react-input-number-input::-webkit-outer-spin-button,\n.canvas-react-input-number-input::-webkit-inner-spin-button {\n margin: 0;\n -webkit-appearance: none;\n}\n.canvas-react-input-number-addon {\n flex: 0 0 auto;\n padding-right: 8px;\n color: var(--canvas-react-color-text-muted);\n font-size: 12px;\n line-height: 1;\n user-select: none;\n}\n');
|
|
5686
|
+
var ReactInputNumber = React.forwardRef(
|
|
5687
|
+
function ReactInputNumber2(props, ref) {
|
|
4734
5688
|
const {
|
|
4735
|
-
|
|
5689
|
+
addonAfter,
|
|
4736
5690
|
className,
|
|
5691
|
+
defaultValue = null,
|
|
4737
5692
|
disabled,
|
|
5693
|
+
formatter,
|
|
5694
|
+
max,
|
|
5695
|
+
min,
|
|
4738
5696
|
onBlur,
|
|
4739
5697
|
onChange,
|
|
5698
|
+
onCommit,
|
|
4740
5699
|
onFocus,
|
|
4741
5700
|
onKeyDown,
|
|
4742
|
-
|
|
4743
|
-
|
|
4744
|
-
|
|
4745
|
-
placeholder,
|
|
4746
|
-
popupClassName,
|
|
4747
|
-
allowClear = true,
|
|
4748
|
-
showArrow = true,
|
|
4749
|
-
showSearch = false,
|
|
5701
|
+
parser,
|
|
5702
|
+
precision,
|
|
5703
|
+
step = 1,
|
|
4750
5704
|
style,
|
|
4751
5705
|
value,
|
|
4752
|
-
virtual = true,
|
|
4753
5706
|
...restProps
|
|
4754
5707
|
} = props;
|
|
4755
|
-
const
|
|
4756
|
-
const
|
|
4757
|
-
|
|
4758
|
-
|
|
4759
|
-
const
|
|
4760
|
-
const
|
|
4761
|
-
(
|
|
4762
|
-
|
|
5708
|
+
const isControlled = value !== void 0;
|
|
5709
|
+
const [innerValue, setInnerValue] = React.useState(
|
|
5710
|
+
isControlled ? value ?? null : defaultValue
|
|
5711
|
+
);
|
|
5712
|
+
const currentValue = isControlled ? value ?? null : innerValue;
|
|
5713
|
+
const [draftText, setDraftText] = React.useState(
|
|
5714
|
+
formatDisplayValue(
|
|
5715
|
+
currentValue,
|
|
5716
|
+
formatter,
|
|
5717
|
+
resolvePrecision(precision, step),
|
|
5718
|
+
step
|
|
5719
|
+
)
|
|
5720
|
+
);
|
|
5721
|
+
const [focused, setFocused] = React.useState(false);
|
|
5722
|
+
const resolvedPrecision = React.useMemo(
|
|
5723
|
+
() => resolvePrecision(precision, step),
|
|
5724
|
+
[precision, step]
|
|
4763
5725
|
);
|
|
4764
|
-
const selectedOption = selectedIndex >= 0 ? options[selectedIndex] : void 0;
|
|
4765
|
-
const [keyword, setKeyword] = React.useState(selectedOption?.label ?? "");
|
|
4766
|
-
const filteredOptions = React.useMemo(() => {
|
|
4767
|
-
if (!showSearch) {
|
|
4768
|
-
return options;
|
|
4769
|
-
}
|
|
4770
|
-
const search = keyword.trim().toLowerCase();
|
|
4771
|
-
if (!search) {
|
|
4772
|
-
return options;
|
|
4773
|
-
}
|
|
4774
|
-
return options.filter((option) => {
|
|
4775
|
-
return option.label.toLowerCase().includes(search) || String(option.value).toLowerCase().includes(search);
|
|
4776
|
-
});
|
|
4777
|
-
}, [keyword, options]);
|
|
4778
|
-
const [activeIndex, setActiveIndex] = React.useState(() => {
|
|
4779
|
-
return selectedIndex >= 0 ? selectedIndex : 0;
|
|
4780
|
-
});
|
|
4781
|
-
React.useImperativeHandle(ref, () => inputRef.current);
|
|
4782
5726
|
React.useEffect(() => {
|
|
4783
|
-
if (
|
|
4784
|
-
|
|
5727
|
+
if (!focused) {
|
|
5728
|
+
setDraftText(
|
|
5729
|
+
formatDisplayValue(currentValue, formatter, resolvedPrecision, step)
|
|
5730
|
+
);
|
|
4785
5731
|
}
|
|
4786
|
-
}, [
|
|
4787
|
-
|
|
4788
|
-
|
|
4789
|
-
|
|
5732
|
+
}, [currentValue, focused, formatter, resolvedPrecision, step]);
|
|
5733
|
+
const commitValue = (nextValue) => {
|
|
5734
|
+
const normalized = normalizeNumberValue(nextValue, {
|
|
5735
|
+
min,
|
|
5736
|
+
max,
|
|
5737
|
+
precision: resolvedPrecision
|
|
5738
|
+
});
|
|
5739
|
+
if (!isControlled) {
|
|
5740
|
+
setInnerValue(normalized);
|
|
4790
5741
|
}
|
|
4791
|
-
|
|
4792
|
-
|
|
4793
|
-
|
|
4794
|
-
(
|
|
5742
|
+
onChange?.(normalized);
|
|
5743
|
+
onCommit?.(normalized);
|
|
5744
|
+
setDraftText(
|
|
5745
|
+
formatDisplayValue(normalized, formatter, resolvedPrecision, step)
|
|
4795
5746
|
);
|
|
4796
|
-
|
|
4797
|
-
}
|
|
4798
|
-
|
|
4799
|
-
if (
|
|
5747
|
+
return normalized;
|
|
5748
|
+
};
|
|
5749
|
+
const stepBy = (direction) => {
|
|
5750
|
+
if (disabled) {
|
|
4800
5751
|
return;
|
|
4801
5752
|
}
|
|
4802
|
-
|
|
4803
|
-
|
|
4804
|
-
|
|
4805
|
-
onChange?.(String(option.value));
|
|
4806
|
-
setKeyword(option.label);
|
|
4807
|
-
setOpen(false);
|
|
4808
|
-
inputRef.current?.focus();
|
|
4809
|
-
};
|
|
4810
|
-
const hasValue = value != null && String(value).length > 0;
|
|
4811
|
-
const showClear = allowClear && !disabled && hasValue;
|
|
4812
|
-
const handleClear = (event) => {
|
|
4813
|
-
event.preventDefault();
|
|
4814
|
-
event.stopPropagation();
|
|
4815
|
-
skipFocusOpenRef.current = true;
|
|
4816
|
-
setKeyword("");
|
|
4817
|
-
setOpen(false);
|
|
4818
|
-
onChange?.("");
|
|
4819
|
-
inputRef.current?.blur();
|
|
5753
|
+
const base = currentValue == null || !Number.isFinite(currentValue) ? 0 : currentValue;
|
|
5754
|
+
const next = base + direction * step;
|
|
5755
|
+
commitValue(next);
|
|
4820
5756
|
};
|
|
4821
|
-
|
|
4822
|
-
|
|
4823
|
-
|
|
4824
|
-
|
|
4825
|
-
|
|
4826
|
-
|
|
4827
|
-
|
|
4828
|
-
|
|
4829
|
-
|
|
4830
|
-
|
|
4831
|
-
|
|
4832
|
-
|
|
4833
|
-
|
|
4834
|
-
|
|
4835
|
-
|
|
4836
|
-
|
|
4837
|
-
|
|
4838
|
-
|
|
4839
|
-
|
|
4840
|
-
|
|
4841
|
-
|
|
4842
|
-
|
|
4843
|
-
|
|
4844
|
-
|
|
4845
|
-
|
|
4846
|
-
|
|
4847
|
-
|
|
4848
|
-
|
|
4849
|
-
|
|
5757
|
+
const atMin = currentValue != null && min != null && currentValue <= min + Number.EPSILON;
|
|
5758
|
+
const atMax = currentValue != null && max != null && currentValue >= max - Number.EPSILON;
|
|
5759
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
5760
|
+
"span",
|
|
5761
|
+
{
|
|
5762
|
+
className: joinClassNames(
|
|
5763
|
+
`${REACT_COMPONENT_PREFIX}-input-number`,
|
|
5764
|
+
focused && `${REACT_COMPONENT_PREFIX}-input-number-focused`,
|
|
5765
|
+
disabled && `${REACT_COMPONENT_PREFIX}-input-number-disabled`,
|
|
5766
|
+
className
|
|
5767
|
+
),
|
|
5768
|
+
style,
|
|
5769
|
+
children: [
|
|
5770
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5771
|
+
"button",
|
|
5772
|
+
{
|
|
5773
|
+
type: "button",
|
|
5774
|
+
tabIndex: -1,
|
|
5775
|
+
disabled: disabled || atMin,
|
|
5776
|
+
className: joinClassNames(
|
|
5777
|
+
`${REACT_COMPONENT_PREFIX}-input-number-handler`,
|
|
5778
|
+
`${REACT_COMPONENT_PREFIX}-input-number-handler-down`
|
|
5779
|
+
),
|
|
5780
|
+
"aria-label": "\u51CF\u5C11",
|
|
5781
|
+
onMouseDown: (event) => {
|
|
5782
|
+
event.preventDefault();
|
|
5783
|
+
},
|
|
5784
|
+
onClick: () => {
|
|
5785
|
+
stepBy(-1);
|
|
5786
|
+
},
|
|
5787
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
5788
|
+
"span",
|
|
5789
|
+
{
|
|
5790
|
+
className: `${REACT_COMPONENT_PREFIX}-input-number-handler-icon`,
|
|
5791
|
+
"aria-hidden": "true"
|
|
5792
|
+
}
|
|
5793
|
+
)
|
|
4850
5794
|
}
|
|
4851
|
-
|
|
4852
|
-
children: [
|
|
5795
|
+
),
|
|
5796
|
+
/* @__PURE__ */ jsxRuntime.jsxs("span", { className: `${REACT_COMPONENT_PREFIX}-input-number-input-wrap`, children: [
|
|
4853
5797
|
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4854
|
-
|
|
5798
|
+
"input",
|
|
4855
5799
|
{
|
|
4856
5800
|
...restProps,
|
|
4857
|
-
ref
|
|
4858
|
-
allowClear: false,
|
|
5801
|
+
ref,
|
|
4859
5802
|
disabled,
|
|
4860
|
-
|
|
4861
|
-
value:
|
|
4862
|
-
className:
|
|
4863
|
-
wrapperClassName: `${REACT_COMPONENT_PREFIX}-select-input-wrap`,
|
|
4864
|
-
placeholder,
|
|
5803
|
+
inputMode: "decimal",
|
|
5804
|
+
value: draftText,
|
|
5805
|
+
className: `${REACT_COMPONENT_PREFIX}-input-number-input`,
|
|
4865
5806
|
onFocus: (event) => {
|
|
4866
|
-
|
|
4867
|
-
skipFocusOpenRef.current = false;
|
|
4868
|
-
onFocus?.(event);
|
|
4869
|
-
return;
|
|
4870
|
-
}
|
|
4871
|
-
if (!open) {
|
|
4872
|
-
setOpen(true);
|
|
4873
|
-
}
|
|
4874
|
-
if (!open && showSearch) {
|
|
4875
|
-
setKeyword(selectedOption?.label ?? "");
|
|
4876
|
-
}
|
|
5807
|
+
setFocused(true);
|
|
4877
5808
|
onFocus?.(event);
|
|
4878
5809
|
},
|
|
4879
|
-
onBlur: (event) => {
|
|
4880
|
-
setOpen(false);
|
|
4881
|
-
if ((!keyword.trim() || !showSearch) && selectedOption) {
|
|
4882
|
-
setKeyword(selectedOption.label);
|
|
4883
|
-
}
|
|
4884
|
-
onBlur?.(event);
|
|
4885
|
-
},
|
|
4886
5810
|
onChange: (event) => {
|
|
4887
|
-
|
|
4888
|
-
|
|
5811
|
+
const nextText = event.target.value;
|
|
5812
|
+
setDraftText(nextText);
|
|
5813
|
+
const parsed = parser ? parser(nextText) : parseNumberText(nextText);
|
|
5814
|
+
if (!isControlled) {
|
|
5815
|
+
setInnerValue(parsed);
|
|
4889
5816
|
}
|
|
4890
|
-
|
|
4891
|
-
|
|
5817
|
+
onChange?.(parsed);
|
|
5818
|
+
},
|
|
5819
|
+
onBlur: (event) => {
|
|
5820
|
+
setFocused(false);
|
|
5821
|
+
const parsed = parser ? parser(event.target.value) : parseNumberText(event.target.value);
|
|
5822
|
+
commitValue(parsed);
|
|
5823
|
+
onBlur?.(event);
|
|
4892
5824
|
},
|
|
4893
5825
|
onKeyDown: (event) => {
|
|
4894
|
-
onKeyDown?.(event);
|
|
4895
|
-
if (event.defaultPrevented) {
|
|
4896
|
-
return;
|
|
4897
|
-
}
|
|
4898
|
-
if (disabled) {
|
|
4899
|
-
return;
|
|
4900
|
-
}
|
|
4901
|
-
if (event.key === "ArrowDown") {
|
|
4902
|
-
event.preventDefault();
|
|
4903
|
-
if (!open) {
|
|
4904
|
-
setOpen(true);
|
|
4905
|
-
return;
|
|
4906
|
-
}
|
|
4907
|
-
setActiveIndex(
|
|
4908
|
-
(prev) => Math.min(prev + 1, Math.max(filteredOptions.length - 1, 0))
|
|
4909
|
-
);
|
|
4910
|
-
return;
|
|
4911
|
-
}
|
|
4912
5826
|
if (event.key === "ArrowUp") {
|
|
4913
5827
|
event.preventDefault();
|
|
4914
|
-
|
|
4915
|
-
|
|
4916
|
-
return;
|
|
4917
|
-
}
|
|
4918
|
-
setActiveIndex((prev) => Math.max(prev - 1, 0));
|
|
4919
|
-
return;
|
|
4920
|
-
}
|
|
4921
|
-
if (event.key === "Enter") {
|
|
5828
|
+
stepBy(1);
|
|
5829
|
+
} else if (event.key === "ArrowDown") {
|
|
4922
5830
|
event.preventDefault();
|
|
4923
|
-
|
|
4924
|
-
|
|
4925
|
-
|
|
4926
|
-
|
|
4927
|
-
|
|
4928
|
-
|
|
4929
|
-
|
|
4930
|
-
|
|
4931
|
-
|
|
4932
|
-
|
|
4933
|
-
|
|
4934
|
-
|
|
4935
|
-
|
|
4936
|
-
}
|
|
4937
|
-
}
|
|
4938
|
-
}
|
|
4939
|
-
),
|
|
4940
|
-
showClear || showArrow ? /* @__PURE__ */ jsxRuntime.jsxs(
|
|
4941
|
-
"span",
|
|
4942
|
-
{
|
|
4943
|
-
className: joinClassNames(
|
|
4944
|
-
`${REACT_COMPONENT_PREFIX}-select-actions`,
|
|
4945
|
-
showClear && `${REACT_COMPONENT_PREFIX}-select-actions-clearable`
|
|
4946
|
-
),
|
|
4947
|
-
children: [
|
|
4948
|
-
showClear ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
4949
|
-
"button",
|
|
4950
|
-
{
|
|
4951
|
-
type: "button",
|
|
4952
|
-
className: `${REACT_COMPONENT_PREFIX}-select-clear`,
|
|
4953
|
-
"aria-label": "\u6E05\u7A7A",
|
|
4954
|
-
tabIndex: -1,
|
|
4955
|
-
onMouseDown: (event) => {
|
|
4956
|
-
event.preventDefault();
|
|
4957
|
-
event.stopPropagation();
|
|
4958
|
-
},
|
|
4959
|
-
onClick: handleClear,
|
|
4960
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
4961
|
-
"span",
|
|
4962
|
-
{
|
|
4963
|
-
className: `${REACT_COMPONENT_PREFIX}-select-clear-icon`
|
|
4964
|
-
}
|
|
4965
|
-
)
|
|
4966
|
-
}
|
|
4967
|
-
) : null,
|
|
4968
|
-
showArrow ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
4969
|
-
"span",
|
|
4970
|
-
{
|
|
4971
|
-
className: joinClassNames(
|
|
4972
|
-
`${REACT_COMPONENT_PREFIX}-select-arrow`,
|
|
4973
|
-
open && `${REACT_COMPONENT_PREFIX}-select-arrow-open`
|
|
4974
|
-
)
|
|
4975
|
-
}
|
|
4976
|
-
) : null
|
|
4977
|
-
]
|
|
4978
|
-
}
|
|
4979
|
-
) : null
|
|
4980
|
-
]
|
|
4981
|
-
}
|
|
4982
|
-
),
|
|
4983
|
-
/* @__PURE__ */ jsxRuntime.jsx(
|
|
4984
|
-
ReactPopup,
|
|
4985
|
-
{
|
|
4986
|
-
open,
|
|
4987
|
-
anchorRef: triggerRef,
|
|
4988
|
-
matchAnchorWidth: true,
|
|
4989
|
-
surfaceClassName: joinClassNames(
|
|
4990
|
-
`${REACT_COMPONENT_PREFIX}-select-dropdown`,
|
|
4991
|
-
popupClassName
|
|
4992
|
-
),
|
|
4993
|
-
onOpenChange: setOpen,
|
|
4994
|
-
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
4995
|
-
ReactVirtualList,
|
|
5831
|
+
stepBy(-1);
|
|
5832
|
+
} else if (event.key === "Enter") {
|
|
5833
|
+
const parsed = parser ? parser(event.currentTarget.value) : parseNumberText(event.currentTarget.value);
|
|
5834
|
+
commitValue(parsed);
|
|
5835
|
+
}
|
|
5836
|
+
onKeyDown?.(event);
|
|
5837
|
+
}
|
|
5838
|
+
}
|
|
5839
|
+
),
|
|
5840
|
+
addonAfter != null ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${REACT_COMPONENT_PREFIX}-input-number-addon`, children: addonAfter }) : null
|
|
5841
|
+
] }),
|
|
5842
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
5843
|
+
"button",
|
|
4996
5844
|
{
|
|
4997
|
-
|
|
4998
|
-
|
|
4999
|
-
|
|
5000
|
-
|
|
5001
|
-
|
|
5845
|
+
type: "button",
|
|
5846
|
+
tabIndex: -1,
|
|
5847
|
+
disabled: disabled || atMax,
|
|
5848
|
+
className: joinClassNames(
|
|
5849
|
+
`${REACT_COMPONENT_PREFIX}-input-number-handler`,
|
|
5850
|
+
`${REACT_COMPONENT_PREFIX}-input-number-handler-up`
|
|
5002
5851
|
),
|
|
5003
|
-
|
|
5004
|
-
|
|
5005
|
-
|
|
5006
|
-
|
|
5007
|
-
|
|
5008
|
-
|
|
5009
|
-
|
|
5010
|
-
|
|
5011
|
-
|
|
5012
|
-
|
|
5013
|
-
|
|
5014
|
-
|
|
5015
|
-
|
|
5016
|
-
|
|
5017
|
-
isSelected && `${REACT_COMPONENT_PREFIX}-select-option-selected`,
|
|
5018
|
-
isActive && `${REACT_COMPONENT_PREFIX}-select-option-active`,
|
|
5019
|
-
option.disabled && `${REACT_COMPONENT_PREFIX}-select-option-disabled`
|
|
5020
|
-
),
|
|
5021
|
-
style: meta.style,
|
|
5022
|
-
onMouseDown: (event) => {
|
|
5023
|
-
event.preventDefault();
|
|
5024
|
-
},
|
|
5025
|
-
onMouseEnter: () => {
|
|
5026
|
-
setActiveIndex(optionIndex);
|
|
5027
|
-
},
|
|
5028
|
-
onClick: () => {
|
|
5029
|
-
if (option.disabled) {
|
|
5030
|
-
return;
|
|
5031
|
-
}
|
|
5032
|
-
selectOption(option);
|
|
5033
|
-
},
|
|
5034
|
-
children: option.label
|
|
5035
|
-
},
|
|
5036
|
-
String(option.value)
|
|
5037
|
-
);
|
|
5038
|
-
}
|
|
5852
|
+
"aria-label": "\u589E\u52A0",
|
|
5853
|
+
onMouseDown: (event) => {
|
|
5854
|
+
event.preventDefault();
|
|
5855
|
+
},
|
|
5856
|
+
onClick: () => {
|
|
5857
|
+
stepBy(1);
|
|
5858
|
+
},
|
|
5859
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
5860
|
+
"span",
|
|
5861
|
+
{
|
|
5862
|
+
className: `${REACT_COMPONENT_PREFIX}-input-number-handler-icon`,
|
|
5863
|
+
"aria-hidden": "true"
|
|
5864
|
+
}
|
|
5865
|
+
)
|
|
5039
5866
|
}
|
|
5040
5867
|
)
|
|
5041
|
-
|
|
5042
|
-
|
|
5043
|
-
|
|
5868
|
+
]
|
|
5869
|
+
}
|
|
5870
|
+
);
|
|
5044
5871
|
}
|
|
5045
5872
|
);
|
|
5873
|
+
function parseNumberText(value) {
|
|
5874
|
+
const text = value.trim().replace(/%/g, "");
|
|
5875
|
+
if (!text) {
|
|
5876
|
+
return null;
|
|
5877
|
+
}
|
|
5878
|
+
const nextValue = Number(text);
|
|
5879
|
+
return Number.isFinite(nextValue) ? nextValue : null;
|
|
5880
|
+
}
|
|
5881
|
+
function resolvePrecision(precision, step) {
|
|
5882
|
+
if (typeof precision === "number" && Number.isInteger(precision) && precision >= 0) {
|
|
5883
|
+
return precision;
|
|
5884
|
+
}
|
|
5885
|
+
const stepText = String(step);
|
|
5886
|
+
if (!stepText.includes(".")) {
|
|
5887
|
+
return 0;
|
|
5888
|
+
}
|
|
5889
|
+
return stepText.split(".")[1]?.length ?? 0;
|
|
5890
|
+
}
|
|
5891
|
+
function normalizeNumberValue(value, options) {
|
|
5892
|
+
if (value == null || !Number.isFinite(value)) {
|
|
5893
|
+
return null;
|
|
5894
|
+
}
|
|
5895
|
+
let next = value;
|
|
5896
|
+
if (options.min != null) {
|
|
5897
|
+
next = Math.max(options.min, next);
|
|
5898
|
+
}
|
|
5899
|
+
if (options.max != null) {
|
|
5900
|
+
next = Math.min(options.max, next);
|
|
5901
|
+
}
|
|
5902
|
+
const factor = 10 ** options.precision;
|
|
5903
|
+
return Math.round(next * factor) / factor;
|
|
5904
|
+
}
|
|
5905
|
+
function formatDisplayValue(value, formatter, precision, step) {
|
|
5906
|
+
if (formatter) {
|
|
5907
|
+
return formatter(value);
|
|
5908
|
+
}
|
|
5909
|
+
if (value == null || !Number.isFinite(value)) {
|
|
5910
|
+
return "";
|
|
5911
|
+
}
|
|
5912
|
+
const digits = resolvePrecision(precision, step);
|
|
5913
|
+
return digits > 0 ? value.toFixed(digits) : String(Math.round(value));
|
|
5914
|
+
}
|
|
5046
5915
|
|
|
5047
5916
|
// src/components/pagination/style.css
|
|
5048
5917
|
styleInject('@import "../../styles/variables.css";\n.canvas-react-pagination {\n display: flex;\n align-items: center;\n flex-wrap: nowrap;\n gap: 8px;\n color: var(--canvas-react-color-text);\n font-size: var(--canvas-react-font-size);\n white-space: nowrap;\n}\n.canvas-react-pagination-pages {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n flex-wrap: nowrap;\n}\n.canvas-react-pagination-button,\n.canvas-react-pagination-page {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: 32px;\n padding: 0 10px;\n border: 1px solid var(--canvas-react-color-border);\n border-radius: var(--canvas-react-radius-sm);\n background: var(--canvas-react-color-bg);\n color: var(--canvas-react-color-text);\n cursor: pointer;\n transition:\n border-color 0.2s ease,\n color 0.2s ease,\n background-color 0.2s ease;\n}\n.canvas-react-pagination-button {\n position: relative;\n width: 32px;\n min-width: 32px;\n padding: 0;\n}\n.canvas-react-pagination-button:hover,\n.canvas-react-pagination-page:hover {\n border-color: var(--canvas-react-color-primary-hover);\n color: var(--canvas-react-color-primary-hover);\n}\n.canvas-react-pagination-page-active {\n border-color: var(--canvas-react-color-primary);\n background: var(--canvas-react-color-bg-active);\n color: var(--canvas-react-color-primary);\n}\n.canvas-react-pagination-button:disabled,\n.canvas-react-pagination-page:disabled {\n opacity: 0.48;\n cursor: not-allowed;\n}\n.canvas-react-pagination-ellipsis {\n color: var(--canvas-react-color-text-muted);\n}\n.canvas-react-pagination-arrow {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 7px;\n height: 7px;\n border-right: 1.5px solid var(--canvas-react-color-text-muted);\n border-bottom: 1.5px solid var(--canvas-react-color-text-muted);\n transition:\n border-color 0.18s ease,\n transform 0.18s ease,\n opacity 0.18s ease;\n}\n.canvas-react-pagination-arrow-prev {\n transform: translate(-42%, -50%) rotate(135deg);\n}\n.canvas-react-pagination-arrow-next {\n transform: translate(-58%, -50%) rotate(-45deg);\n}\n.canvas-react-pagination-button:hover .canvas-react-pagination-arrow {\n border-color: var(--canvas-react-color-primary-hover);\n}\n.canvas-react-pagination-button:disabled .canvas-react-pagination-arrow {\n opacity: 0.56;\n}\n.canvas-react-pagination-quick {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n flex-wrap: nowrap;\n}\n.canvas-react-pagination-total {\n color: var(--canvas-react-color-text-muted);\n}\n');
|
|
@@ -5215,16 +6084,6 @@ function clampPage(page, totalPages) {
|
|
|
5215
6084
|
}
|
|
5216
6085
|
return Math.min(Math.max(1, Math.trunc(page)), totalPages);
|
|
5217
6086
|
}
|
|
5218
|
-
var compatibleIdSeed = 0;
|
|
5219
|
-
function useCompatibleId(prefix = "canvas-react-id") {
|
|
5220
|
-
const nativeUseId = React__namespace.useId;
|
|
5221
|
-
const fallbackIdRef = React__namespace.useRef();
|
|
5222
|
-
if (!fallbackIdRef.current) {
|
|
5223
|
-
compatibleIdSeed += 1;
|
|
5224
|
-
fallbackIdRef.current = `${prefix}-${compatibleIdSeed}`;
|
|
5225
|
-
}
|
|
5226
|
-
return nativeUseId ? nativeUseId() : fallbackIdRef.current;
|
|
5227
|
-
}
|
|
5228
6087
|
|
|
5229
6088
|
// src/components/popconfirm/style.css
|
|
5230
6089
|
styleInject('@import "../../styles/variables.css";\n.canvas-react-popconfirm-trigger {\n display: inline-flex;\n max-width: 100%;\n}\n.canvas-react-popconfirm-trigger-disabled {\n cursor: not-allowed;\n}\n.canvas-react-popconfirm-popup {\n overflow: visible;\n}\n.canvas-react-popconfirm {\n position: relative;\n box-sizing: border-box;\n width: max-content;\n min-width: 180px;\n max-width: 320px;\n padding: 12px;\n color: var(--canvas-react-color-text);\n font-size: var(--canvas-react-font-size);\n line-height: 1.5;\n}\n.canvas-react-popconfirm-arrow {\n position: absolute;\n z-index: 1;\n box-sizing: border-box;\n width: 10px;\n height: 10px;\n border: 0;\n background: var(--canvas-react-color-bg, #ffffff);\n pointer-events: none;\n transform: rotate(45deg);\n}\n.canvas-react-popup[data-placement^=bottom] .canvas-react-popconfirm-arrow {\n top: -5px;\n border-top: 1px solid var(--canvas-react-color-border, #d9d9d9);\n border-left: 1px solid var(--canvas-react-color-border, #d9d9d9);\n}\n.canvas-react-popup[data-placement^=top] .canvas-react-popconfirm-arrow {\n bottom: -5px;\n border-right: 1px solid var(--canvas-react-color-border, #d9d9d9);\n border-bottom: 1px solid var(--canvas-react-color-border, #d9d9d9);\n}\n.canvas-react-popup[data-placement$=Left] .canvas-react-popconfirm-arrow {\n left: 24px;\n}\n.canvas-react-popup[data-placement$=Right] .canvas-react-popconfirm-arrow {\n right: 24px;\n}\n.canvas-react-popup[data-placement^=left] .canvas-react-popconfirm-arrow {\n right: -5px;\n border-top: 1px solid var(--canvas-react-color-border, #d9d9d9);\n border-right: 1px solid var(--canvas-react-color-border, #d9d9d9);\n}\n.canvas-react-popup[data-placement^=right] .canvas-react-popconfirm-arrow {\n left: -5px;\n border-bottom: 1px solid var(--canvas-react-color-border, #d9d9d9);\n border-left: 1px solid var(--canvas-react-color-border, #d9d9d9);\n}\n.canvas-react-popup[data-placement$=Top] .canvas-react-popconfirm-arrow {\n top: 18px;\n}\n.canvas-react-popup[data-placement$=Bottom] .canvas-react-popconfirm-arrow {\n bottom: 18px;\n}\n.canvas-react-popconfirm-message {\n display: flex;\n align-items: flex-start;\n gap: 8px;\n}\n.canvas-react-popconfirm-icon {\n display: inline-flex;\n flex: 0 0 auto;\n align-items: center;\n justify-content: center;\n width: 16px;\n height: 16px;\n margin-top: 2px;\n color: #faad14;\n font-size: 12px;\n line-height: 1;\n}\n.canvas-react-popconfirm-default-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 14px;\n height: 14px;\n border-radius: 50%;\n background: #faad14;\n color: #ffffff;\n font-size: 11px;\n font-weight: 700;\n line-height: 1;\n}\n.canvas-react-popconfirm-text {\n min-width: 0;\n}\n.canvas-react-popconfirm-title {\n color: var(--canvas-react-color-text);\n font-weight: 500;\n word-break: break-word;\n}\n.canvas-react-popconfirm-description {\n margin-top: 4px;\n color: var(--canvas-react-color-text-muted);\n word-break: break-word;\n}\n.canvas-react-popconfirm-actions {\n display: flex;\n align-items: center;\n justify-content: flex-end;\n gap: 8px;\n margin-top: 12px;\n}\n.canvas-react-popconfirm-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: 26px;\n min-width: 48px;\n padding: 0 10px;\n border: 1px solid var(--canvas-react-color-border);\n border-radius: var(--canvas-react-radius-sm);\n background: var(--canvas-react-color-bg);\n color: var(--canvas-react-color-text);\n font-size: 12px;\n line-height: 1;\n white-space: nowrap;\n cursor: pointer;\n transition:\n border-color 0.18s ease,\n background-color 0.18s ease,\n color 0.18s ease,\n opacity 0.18s ease;\n}\n.canvas-react-popconfirm-button:hover {\n border-color: var(--canvas-react-color-primary-hover);\n color: var(--canvas-react-color-primary-hover);\n}\n.canvas-react-popconfirm-button-primary {\n border-color: var(--canvas-react-color-primary);\n background: var(--canvas-react-color-primary);\n color: #ffffff;\n}\n.canvas-react-popconfirm-button-primary:hover {\n border-color: var(--canvas-react-color-primary-hover);\n background: var(--canvas-react-color-primary-hover);\n color: #ffffff;\n}\n.canvas-react-popconfirm-button:disabled {\n opacity: 0.56;\n cursor: not-allowed;\n}\n.canvas-react-popconfirm-button:disabled:hover {\n border-color: var(--canvas-react-color-border);\n color: var(--canvas-react-color-text);\n}\n.canvas-react-popconfirm-button-primary:disabled:hover {\n border-color: var(--canvas-react-color-primary);\n background: var(--canvas-react-color-primary);\n color: #ffffff;\n}\n.canvas-react-popconfirm-loading {\n width: 12px;\n height: 12px;\n border: 2px solid rgba(255, 255, 255, 0.45);\n border-top-color: #ffffff;\n border-radius: 50%;\n animation: canvas-react-popconfirm-loading 0.8s linear infinite;\n}\n@keyframes canvas-react-popconfirm-loading {\n to {\n transform: rotate(360deg);\n }\n}\n');
|
|
@@ -5298,7 +6157,7 @@ function ReactPopconfirm(props) {
|
|
|
5298
6157
|
return;
|
|
5299
6158
|
}
|
|
5300
6159
|
const result = onConfirm?.(event);
|
|
5301
|
-
if (
|
|
6160
|
+
if (isPromiseLike2(result)) {
|
|
5302
6161
|
setInnerConfirmLoading(true);
|
|
5303
6162
|
Promise.resolve(result).then(() => {
|
|
5304
6163
|
setOpen(false);
|
|
@@ -5446,7 +6305,7 @@ function ReactPopconfirm(props) {
|
|
|
5446
6305
|
)
|
|
5447
6306
|
] });
|
|
5448
6307
|
}
|
|
5449
|
-
function
|
|
6308
|
+
function isPromiseLike2(value) {
|
|
5450
6309
|
return typeof value === "object" && value !== null && "then" in value && typeof value.then === "function";
|
|
5451
6310
|
}
|
|
5452
6311
|
|
|
@@ -5834,6 +6693,413 @@ function parseQuarterValue(value) {
|
|
|
5834
6693
|
function resolveDecadeStart5(year) {
|
|
5835
6694
|
return Math.floor(year / 10) * 10;
|
|
5836
6695
|
}
|
|
6696
|
+
|
|
6697
|
+
// src/components/resizable-panels/style.css
|
|
6698
|
+
styleInject('@import "../../styles/variables.css";\n.canvas-react-resizable-panels {\n display: flex;\n width: 100%;\n height: 100%;\n min-width: 0;\n min-height: 0;\n overflow: auto;\n background: var(--canvas-react-color-bg, #ffffff);\n}\n.canvas-react-resizable-panels-horizontal {\n flex-direction: row;\n}\n.canvas-react-resizable-panels-vertical {\n flex-direction: column;\n}\n.canvas-react-resizable-panels-resizing {\n cursor: inherit;\n}\n.canvas-react-resizable-panels-item {\n display: contents;\n}\n.canvas-react-resizable-panel {\n min-width: 0;\n min-height: 0;\n overflow: auto;\n}\n.canvas-react-resizable-panels-animated:not(.canvas-react-resizable-panels-resizing) .canvas-react-resizable-panel {\n transition:\n flex-basis 0.22s cubic-bezier(0.2, 0, 0, 1),\n width 0.22s cubic-bezier(0.2, 0, 0, 1),\n min-width 0.22s cubic-bezier(0.2, 0, 0, 1),\n max-width 0.22s cubic-bezier(0.2, 0, 0, 1),\n height 0.22s cubic-bezier(0.2, 0, 0, 1),\n min-height 0.22s cubic-bezier(0.2, 0, 0, 1),\n max-height 0.22s cubic-bezier(0.2, 0, 0, 1),\n opacity 0.14s ease;\n}\n.canvas-react-resizable-panel-collapsed {\n visibility: hidden;\n overflow: hidden;\n opacity: 0;\n pointer-events: none;\n}\n.canvas-react-resizable-panels-animated:not(.canvas-react-resizable-panels-resizing) .canvas-react-resizable-panel-collapsed {\n transition:\n flex-basis 0.22s cubic-bezier(0.2, 0, 0, 1),\n width 0.22s cubic-bezier(0.2, 0, 0, 1),\n min-width 0.22s cubic-bezier(0.2, 0, 0, 1),\n max-width 0.22s cubic-bezier(0.2, 0, 0, 1),\n height 0.22s cubic-bezier(0.2, 0, 0, 1),\n min-height 0.22s cubic-bezier(0.2, 0, 0, 1),\n max-height 0.22s cubic-bezier(0.2, 0, 0, 1),\n opacity 0.14s ease,\n visibility 0s linear 0.22s;\n}\n.canvas-react-resizable-panels-divider {\n position: relative;\n z-index: 1;\n flex: 0 0 9px;\n touch-action: none;\n outline: none;\n}\n.canvas-react-resizable-panels-divider-horizontal {\n align-self: stretch;\n width: 9px;\n min-height: 24px;\n cursor: col-resize;\n}\n.canvas-react-resizable-panels-divider-vertical {\n width: auto;\n min-width: 24px;\n height: 9px;\n cursor: row-resize;\n}\n.canvas-react-resizable-panels-animated .canvas-react-resizable-panels-divider {\n transition:\n flex-basis 0.22s cubic-bezier(0.2, 0, 0, 1),\n width 0.22s cubic-bezier(0.2, 0, 0, 1),\n height 0.22s cubic-bezier(0.2, 0, 0, 1),\n opacity 0.14s ease;\n}\n.canvas-react-resizable-panels-divider-collapsed {\n flex-basis: 0;\n overflow: hidden;\n opacity: 0;\n pointer-events: none;\n}\n.canvas-react-resizable-panels-divider-horizontal.canvas-react-resizable-panels-divider-collapsed {\n width: 0;\n min-width: 0;\n}\n.canvas-react-resizable-panels-divider-vertical.canvas-react-resizable-panels-divider-collapsed {\n height: 0;\n min-height: 0;\n}\n.canvas-react-resizable-panels-divider-line {\n position: absolute;\n background: var(--canvas-react-color-border, #d9d9d9);\n transition:\n width 0.16s ease,\n height 0.16s ease,\n background-color 0.16s ease,\n transform 0.16s ease;\n}\n.canvas-react-resizable-panels-divider-horizontal .canvas-react-resizable-panels-divider-line {\n inset: 0 auto 0 4px;\n width: 1px;\n}\n.canvas-react-resizable-panels-divider-vertical .canvas-react-resizable-panels-divider-line {\n inset: 4px 0 auto;\n height: 1px;\n}\n.canvas-react-resizable-panels-divider-horizontal:hover .canvas-react-resizable-panels-divider-line,\n.canvas-react-resizable-panels-divider-horizontal:focus-visible .canvas-react-resizable-panels-divider-line,\n.canvas-react-resizable-panels-divider-horizontal.canvas-react-resizable-panels-divider-active .canvas-react-resizable-panels-divider-line {\n width: 3px;\n background: var(--canvas-react-color-primary, #1677ff);\n transform: translateX(-1px);\n}\n.canvas-react-resizable-panels-divider-vertical:hover .canvas-react-resizable-panels-divider-line,\n.canvas-react-resizable-panels-divider-vertical:focus-visible .canvas-react-resizable-panels-divider-line,\n.canvas-react-resizable-panels-divider-vertical.canvas-react-resizable-panels-divider-active .canvas-react-resizable-panels-divider-line {\n height: 3px;\n background: var(--canvas-react-color-primary, #1677ff);\n transform: translateY(-1px);\n}\n.canvas-react-resizable-panels-divider:focus-visible {\n box-shadow: inset 0 0 0 2px rgba(22, 119, 255, 0.12);\n}\n.canvas-react-resizable-panels-divider-disabled {\n cursor: default;\n}\n.canvas-react-resizable-panels-divider-horizontal.canvas-react-resizable-panels-divider-disabled .canvas-react-resizable-panels-divider-line,\n.canvas-react-resizable-panels-divider-horizontal.canvas-react-resizable-panels-divider-disabled:hover .canvas-react-resizable-panels-divider-line {\n width: 1px;\n background: var(--canvas-react-color-border, #d9d9d9);\n transform: none;\n}\n.canvas-react-resizable-panels-divider-vertical.canvas-react-resizable-panels-divider-disabled .canvas-react-resizable-panels-divider-line,\n.canvas-react-resizable-panels-divider-vertical.canvas-react-resizable-panels-divider-disabled:hover .canvas-react-resizable-panels-divider-line {\n height: 1px;\n background: var(--canvas-react-color-border, #d9d9d9);\n transform: none;\n}\n@media (prefers-reduced-motion: reduce) {\n .canvas-react-resizable-panels-animated .canvas-react-resizable-panel,\n .canvas-react-resizable-panels-animated .canvas-react-resizable-panels-divider,\n .canvas-react-resizable-panels-divider-line {\n transition-duration: 0.01ms;\n transition-delay: 0s;\n }\n}\n');
|
|
6699
|
+
var DEFAULT_MIN_SIZE = 80;
|
|
6700
|
+
var DEFAULT_KEYBOARD_STEP = 10;
|
|
6701
|
+
function ReactResizablePanels(props) {
|
|
6702
|
+
const {
|
|
6703
|
+
animated = false,
|
|
6704
|
+
className,
|
|
6705
|
+
defaultSizes,
|
|
6706
|
+
direction = "horizontal",
|
|
6707
|
+
keyboardStep = DEFAULT_KEYBOARD_STEP,
|
|
6708
|
+
onResizeEnd,
|
|
6709
|
+
onResizeStart,
|
|
6710
|
+
onSizesChange,
|
|
6711
|
+
panels,
|
|
6712
|
+
sizes,
|
|
6713
|
+
style
|
|
6714
|
+
} = props;
|
|
6715
|
+
const [innerSizes, setInnerSizes] = React.useState(
|
|
6716
|
+
() => ({
|
|
6717
|
+
...defaultSizes
|
|
6718
|
+
})
|
|
6719
|
+
);
|
|
6720
|
+
const [resizingDividerId, setResizingDividerId] = React.useState(
|
|
6721
|
+
null
|
|
6722
|
+
);
|
|
6723
|
+
const panelRefs = React.useRef({});
|
|
6724
|
+
const resizeSessionRef = React.useRef(null);
|
|
6725
|
+
const controlled = sizes !== void 0;
|
|
6726
|
+
const mergedSizes = controlled ? sizes : innerSizes;
|
|
6727
|
+
const visiblePanels = panels.filter((panel) => panel.visible !== false);
|
|
6728
|
+
React.useEffect(
|
|
6729
|
+
() => () => {
|
|
6730
|
+
const session = resizeSessionRef.current;
|
|
6731
|
+
if (!session) {
|
|
6732
|
+
return;
|
|
6733
|
+
}
|
|
6734
|
+
document.body.style.cursor = session.previousBodyCursor;
|
|
6735
|
+
document.body.style.userSelect = session.previousBodyUserSelect;
|
|
6736
|
+
resizeSessionRef.current = null;
|
|
6737
|
+
},
|
|
6738
|
+
[]
|
|
6739
|
+
);
|
|
6740
|
+
const applySizes = (nextSizes, info) => {
|
|
6741
|
+
if (!controlled) {
|
|
6742
|
+
setInnerSizes(nextSizes);
|
|
6743
|
+
}
|
|
6744
|
+
if (resizeSessionRef.current) {
|
|
6745
|
+
resizeSessionRef.current.latestSizes = nextSizes;
|
|
6746
|
+
}
|
|
6747
|
+
onSizesChange?.(nextSizes, info);
|
|
6748
|
+
};
|
|
6749
|
+
const resizePair = (params) => {
|
|
6750
|
+
const { afterPanel, beforePanel, delta, startAfterSize, startBeforeSize } = params;
|
|
6751
|
+
const nextPair = resolveResizablePanelSizes({
|
|
6752
|
+
afterMaxSize: afterPanel.maxSize,
|
|
6753
|
+
afterMinSize: afterPanel.minSize,
|
|
6754
|
+
beforeMaxSize: beforePanel.maxSize,
|
|
6755
|
+
beforeMinSize: beforePanel.minSize,
|
|
6756
|
+
delta,
|
|
6757
|
+
startAfterSize,
|
|
6758
|
+
startBeforeSize
|
|
6759
|
+
});
|
|
6760
|
+
const info = createResizeInfo(beforePanel.id, afterPanel.id, direction);
|
|
6761
|
+
const nextSizes = {
|
|
6762
|
+
...mergedSizes,
|
|
6763
|
+
[beforePanel.id]: nextPair.beforeSize,
|
|
6764
|
+
[afterPanel.id]: nextPair.afterSize
|
|
6765
|
+
};
|
|
6766
|
+
applySizes(nextSizes, info);
|
|
6767
|
+
return nextSizes;
|
|
6768
|
+
};
|
|
6769
|
+
const startResize = (event, beforePanel, afterPanel) => {
|
|
6770
|
+
if (event.button !== 0) {
|
|
6771
|
+
return;
|
|
6772
|
+
}
|
|
6773
|
+
const beforeElement = panelRefs.current[beforePanel.id];
|
|
6774
|
+
const afterElement = panelRefs.current[afterPanel.id];
|
|
6775
|
+
if (!beforeElement || !afterElement) {
|
|
6776
|
+
return;
|
|
6777
|
+
}
|
|
6778
|
+
event.preventDefault();
|
|
6779
|
+
event.currentTarget.setPointerCapture(event.pointerId);
|
|
6780
|
+
const startBeforeSize = resolveElementSize(beforeElement, direction);
|
|
6781
|
+
const startAfterSize = resolveElementSize(afterElement, direction);
|
|
6782
|
+
const info = createResizeInfo(beforePanel.id, afterPanel.id, direction);
|
|
6783
|
+
resizeSessionRef.current = {
|
|
6784
|
+
...info,
|
|
6785
|
+
latestSizes: {
|
|
6786
|
+
...mergedSizes,
|
|
6787
|
+
[beforePanel.id]: startBeforeSize,
|
|
6788
|
+
[afterPanel.id]: startAfterSize
|
|
6789
|
+
},
|
|
6790
|
+
pointerId: event.pointerId,
|
|
6791
|
+
previousBodyCursor: document.body.style.cursor,
|
|
6792
|
+
previousBodyUserSelect: document.body.style.userSelect,
|
|
6793
|
+
startAfterSize,
|
|
6794
|
+
startBeforeSize,
|
|
6795
|
+
startPointerPosition: resolvePointerPosition(event, direction)
|
|
6796
|
+
};
|
|
6797
|
+
document.body.style.cursor = resolveResizeCursor(direction);
|
|
6798
|
+
document.body.style.userSelect = "none";
|
|
6799
|
+
setResizingDividerId(beforePanel.id);
|
|
6800
|
+
onResizeStart?.(info);
|
|
6801
|
+
};
|
|
6802
|
+
const moveResize = (event, beforePanel, afterPanel) => {
|
|
6803
|
+
const session = resizeSessionRef.current;
|
|
6804
|
+
if (!session || session.pointerId !== event.pointerId) {
|
|
6805
|
+
return;
|
|
6806
|
+
}
|
|
6807
|
+
resizePair({
|
|
6808
|
+
afterPanel,
|
|
6809
|
+
beforePanel,
|
|
6810
|
+
delta: resolvePointerPosition(event, direction) - session.startPointerPosition,
|
|
6811
|
+
startAfterSize: session.startAfterSize,
|
|
6812
|
+
startBeforeSize: session.startBeforeSize
|
|
6813
|
+
});
|
|
6814
|
+
};
|
|
6815
|
+
const finishResize = (event) => {
|
|
6816
|
+
const session = resizeSessionRef.current;
|
|
6817
|
+
if (!session || session.pointerId !== event.pointerId) {
|
|
6818
|
+
return;
|
|
6819
|
+
}
|
|
6820
|
+
if (event.currentTarget.hasPointerCapture(event.pointerId)) {
|
|
6821
|
+
event.currentTarget.releasePointerCapture(event.pointerId);
|
|
6822
|
+
}
|
|
6823
|
+
document.body.style.cursor = session.previousBodyCursor;
|
|
6824
|
+
document.body.style.userSelect = session.previousBodyUserSelect;
|
|
6825
|
+
resizeSessionRef.current = null;
|
|
6826
|
+
setResizingDividerId(null);
|
|
6827
|
+
onResizeEnd?.(session.latestSizes, {
|
|
6828
|
+
afterPanelId: session.afterPanelId,
|
|
6829
|
+
beforePanelId: session.beforePanelId,
|
|
6830
|
+
direction: session.direction
|
|
6831
|
+
});
|
|
6832
|
+
};
|
|
6833
|
+
const handleDividerKeyDown = (event, beforePanel, afterPanel) => {
|
|
6834
|
+
const deltaDirection = resolveKeyboardDeltaDirection(event.key, direction);
|
|
6835
|
+
if (deltaDirection === 0) {
|
|
6836
|
+
return;
|
|
6837
|
+
}
|
|
6838
|
+
const beforeElement = panelRefs.current[beforePanel.id];
|
|
6839
|
+
const afterElement = panelRefs.current[afterPanel.id];
|
|
6840
|
+
if (!beforeElement || !afterElement) {
|
|
6841
|
+
return;
|
|
6842
|
+
}
|
|
6843
|
+
event.preventDefault();
|
|
6844
|
+
const step = normalizePositiveNumber(keyboardStep, DEFAULT_KEYBOARD_STEP);
|
|
6845
|
+
const nextSizes = resizePair({
|
|
6846
|
+
afterPanel,
|
|
6847
|
+
beforePanel,
|
|
6848
|
+
delta: deltaDirection * step,
|
|
6849
|
+
startAfterSize: resolveElementSize(afterElement, direction),
|
|
6850
|
+
startBeforeSize: resolveElementSize(beforeElement, direction)
|
|
6851
|
+
});
|
|
6852
|
+
onResizeEnd?.(
|
|
6853
|
+
nextSizes,
|
|
6854
|
+
createResizeInfo(beforePanel.id, afterPanel.id, direction)
|
|
6855
|
+
);
|
|
6856
|
+
};
|
|
6857
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
6858
|
+
"div",
|
|
6859
|
+
{
|
|
6860
|
+
className: joinClassNames(
|
|
6861
|
+
`${REACT_COMPONENT_PREFIX}-resizable-panels`,
|
|
6862
|
+
`${REACT_COMPONENT_PREFIX}-resizable-panels-${direction}`,
|
|
6863
|
+
animated && `${REACT_COMPONENT_PREFIX}-resizable-panels-animated`,
|
|
6864
|
+
resizingDividerId !== null && `${REACT_COMPONENT_PREFIX}-resizable-panels-resizing`,
|
|
6865
|
+
className
|
|
6866
|
+
),
|
|
6867
|
+
style,
|
|
6868
|
+
children: visiblePanels.map((panel, index) => {
|
|
6869
|
+
const nextPanel = visiblePanels[index + 1];
|
|
6870
|
+
const configuredSize = mergedSizes[panel.id] ?? panel.size;
|
|
6871
|
+
const collapsed = panel.collapsed === true;
|
|
6872
|
+
const minSize = collapsed ? 0 : normalizePositiveNumber(panel.minSize, DEFAULT_MIN_SIZE);
|
|
6873
|
+
const maxSize = collapsed ? 0 : normalizeMaxSize(panel.maxSize, minSize);
|
|
6874
|
+
const panelStyle = collapsed ? resolveCollapsedPanelStyle(direction) : resolvePanelStyle({
|
|
6875
|
+
configuredSize,
|
|
6876
|
+
direction,
|
|
6877
|
+
isLast: index === visiblePanels.length - 1,
|
|
6878
|
+
maxSize,
|
|
6879
|
+
minSize
|
|
6880
|
+
});
|
|
6881
|
+
const dividerCollapsed = nextPanel ? collapsed || nextPanel.collapsed === true : false;
|
|
6882
|
+
const dividerDisabled = panel.resizable === false || dividerCollapsed;
|
|
6883
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
6884
|
+
"div",
|
|
6885
|
+
{
|
|
6886
|
+
className: `${REACT_COMPONENT_PREFIX}-resizable-panels-item`,
|
|
6887
|
+
children: [
|
|
6888
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
6889
|
+
"div",
|
|
6890
|
+
{
|
|
6891
|
+
ref: (element) => {
|
|
6892
|
+
panelRefs.current[panel.id] = element;
|
|
6893
|
+
},
|
|
6894
|
+
className: joinClassNames(
|
|
6895
|
+
`${REACT_COMPONENT_PREFIX}-resizable-panel`,
|
|
6896
|
+
collapsed && `${REACT_COMPONENT_PREFIX}-resizable-panel-collapsed`,
|
|
6897
|
+
panel.className
|
|
6898
|
+
),
|
|
6899
|
+
style: {
|
|
6900
|
+
...panelStyle,
|
|
6901
|
+
...panel.style,
|
|
6902
|
+
...collapsed ? panelStyle : void 0
|
|
6903
|
+
},
|
|
6904
|
+
"data-panel-id": panel.id,
|
|
6905
|
+
"aria-hidden": collapsed || void 0,
|
|
6906
|
+
children: panel.content
|
|
6907
|
+
}
|
|
6908
|
+
),
|
|
6909
|
+
nextPanel ? /* @__PURE__ */ jsxRuntime.jsx(
|
|
6910
|
+
"div",
|
|
6911
|
+
{
|
|
6912
|
+
className: joinClassNames(
|
|
6913
|
+
`${REACT_COMPONENT_PREFIX}-resizable-panels-divider`,
|
|
6914
|
+
`${REACT_COMPONENT_PREFIX}-resizable-panels-divider-${direction}`,
|
|
6915
|
+
dividerDisabled && `${REACT_COMPONENT_PREFIX}-resizable-panels-divider-disabled`,
|
|
6916
|
+
dividerCollapsed && `${REACT_COMPONENT_PREFIX}-resizable-panels-divider-collapsed`,
|
|
6917
|
+
resizingDividerId === panel.id && `${REACT_COMPONENT_PREFIX}-resizable-panels-divider-active`
|
|
6918
|
+
),
|
|
6919
|
+
role: "separator",
|
|
6920
|
+
"aria-label": `\u8C03\u6574 ${panel.id} \u4E0E ${nextPanel.id} \u7684${direction === "horizontal" ? "\u5BBD\u5EA6" : "\u9AD8\u5EA6"}`,
|
|
6921
|
+
"aria-disabled": dividerDisabled,
|
|
6922
|
+
"aria-orientation": direction === "horizontal" ? "vertical" : "horizontal",
|
|
6923
|
+
"aria-valuemin": minSize,
|
|
6924
|
+
"aria-valuemax": Number.isFinite(maxSize) ? maxSize : void 0,
|
|
6925
|
+
"aria-valuenow": configuredSize == null ? void 0 : Math.round(configuredSize),
|
|
6926
|
+
tabIndex: dividerDisabled ? -1 : 0,
|
|
6927
|
+
onKeyDown: (event) => {
|
|
6928
|
+
if (!dividerDisabled) {
|
|
6929
|
+
handleDividerKeyDown(event, panel, nextPanel);
|
|
6930
|
+
}
|
|
6931
|
+
},
|
|
6932
|
+
onPointerCancel: finishResize,
|
|
6933
|
+
onPointerDown: (event) => {
|
|
6934
|
+
if (!dividerDisabled) {
|
|
6935
|
+
startResize(event, panel, nextPanel);
|
|
6936
|
+
}
|
|
6937
|
+
},
|
|
6938
|
+
onPointerMove: (event) => {
|
|
6939
|
+
if (!dividerDisabled) {
|
|
6940
|
+
moveResize(event, panel, nextPanel);
|
|
6941
|
+
}
|
|
6942
|
+
},
|
|
6943
|
+
onPointerUp: finishResize,
|
|
6944
|
+
children: /* @__PURE__ */ jsxRuntime.jsx(
|
|
6945
|
+
"span",
|
|
6946
|
+
{
|
|
6947
|
+
className: `${REACT_COMPONENT_PREFIX}-resizable-panels-divider-line`,
|
|
6948
|
+
"aria-hidden": "true"
|
|
6949
|
+
}
|
|
6950
|
+
)
|
|
6951
|
+
}
|
|
6952
|
+
) : null
|
|
6953
|
+
]
|
|
6954
|
+
},
|
|
6955
|
+
panel.id
|
|
6956
|
+
);
|
|
6957
|
+
})
|
|
6958
|
+
}
|
|
6959
|
+
);
|
|
6960
|
+
}
|
|
6961
|
+
function resolveResizablePanelSizes(params) {
|
|
6962
|
+
const {
|
|
6963
|
+
afterMaxSize,
|
|
6964
|
+
afterMinSize,
|
|
6965
|
+
beforeMaxSize,
|
|
6966
|
+
beforeMinSize,
|
|
6967
|
+
delta,
|
|
6968
|
+
startAfterSize,
|
|
6969
|
+
startBeforeSize
|
|
6970
|
+
} = params;
|
|
6971
|
+
const safeBeforeMin = normalizePositiveNumber(
|
|
6972
|
+
beforeMinSize,
|
|
6973
|
+
DEFAULT_MIN_SIZE
|
|
6974
|
+
);
|
|
6975
|
+
const safeAfterMin = normalizePositiveNumber(afterMinSize, DEFAULT_MIN_SIZE);
|
|
6976
|
+
const safeBeforeMax = normalizeMaxSize(beforeMaxSize, safeBeforeMin);
|
|
6977
|
+
const safeAfterMax = normalizeMaxSize(afterMaxSize, safeAfterMin);
|
|
6978
|
+
const minDelta = Math.max(
|
|
6979
|
+
safeBeforeMin - startBeforeSize,
|
|
6980
|
+
startAfterSize - safeAfterMax
|
|
6981
|
+
);
|
|
6982
|
+
const maxDelta = Math.min(
|
|
6983
|
+
safeBeforeMax - startBeforeSize,
|
|
6984
|
+
startAfterSize - safeAfterMin
|
|
6985
|
+
);
|
|
6986
|
+
const safeDelta = clamp3(
|
|
6987
|
+
Number.isFinite(delta) ? delta : 0,
|
|
6988
|
+
minDelta,
|
|
6989
|
+
maxDelta
|
|
6990
|
+
);
|
|
6991
|
+
return {
|
|
6992
|
+
afterSize: Math.round((startAfterSize - safeDelta) * 100) / 100,
|
|
6993
|
+
beforeSize: Math.round((startBeforeSize + safeDelta) * 100) / 100
|
|
6994
|
+
};
|
|
6995
|
+
}
|
|
6996
|
+
function createResizeInfo(beforePanelId, afterPanelId, direction) {
|
|
6997
|
+
return { afterPanelId, beforePanelId, direction };
|
|
6998
|
+
}
|
|
6999
|
+
function resolveElementSize(element, direction) {
|
|
7000
|
+
const rect = element.getBoundingClientRect();
|
|
7001
|
+
return direction === "horizontal" ? rect.width : rect.height;
|
|
7002
|
+
}
|
|
7003
|
+
function resolvePointerPosition(event, direction) {
|
|
7004
|
+
return direction === "horizontal" ? event.clientX : event.clientY;
|
|
7005
|
+
}
|
|
7006
|
+
function resolveResizeCursor(direction) {
|
|
7007
|
+
return direction === "horizontal" ? "col-resize" : "row-resize";
|
|
7008
|
+
}
|
|
7009
|
+
function resolveKeyboardDeltaDirection(key, direction) {
|
|
7010
|
+
if (direction === "horizontal") {
|
|
7011
|
+
return key === "ArrowLeft" ? -1 : key === "ArrowRight" ? 1 : 0;
|
|
7012
|
+
}
|
|
7013
|
+
return key === "ArrowUp" ? -1 : key === "ArrowDown" ? 1 : 0;
|
|
7014
|
+
}
|
|
7015
|
+
function resolveCollapsedPanelStyle(direction) {
|
|
7016
|
+
return direction === "horizontal" ? { flex: "0 0 0px", maxWidth: 0, minWidth: 0, width: 0 } : { flex: "0 0 0px", height: 0, maxHeight: 0, minHeight: 0 };
|
|
7017
|
+
}
|
|
7018
|
+
function resolvePanelStyle(params) {
|
|
7019
|
+
const { configuredSize, direction, isLast, maxSize, minSize } = params;
|
|
7020
|
+
const size = normalizeOptionalSize(configuredSize, minSize, maxSize);
|
|
7021
|
+
const flex = size == null ? "1 1 0" : isLast ? `1 1 ${size}px` : `0 0 ${size}px`;
|
|
7022
|
+
return direction === "horizontal" ? {
|
|
7023
|
+
flex,
|
|
7024
|
+
maxWidth: Number.isFinite(maxSize) ? maxSize : void 0,
|
|
7025
|
+
minWidth: minSize,
|
|
7026
|
+
width: size
|
|
7027
|
+
} : {
|
|
7028
|
+
flex,
|
|
7029
|
+
height: size,
|
|
7030
|
+
maxHeight: Number.isFinite(maxSize) ? maxSize : void 0,
|
|
7031
|
+
minHeight: minSize
|
|
7032
|
+
};
|
|
7033
|
+
}
|
|
7034
|
+
function normalizeOptionalSize(value, minSize, maxSize) {
|
|
7035
|
+
if (typeof value !== "number" || !Number.isFinite(value)) {
|
|
7036
|
+
return void 0;
|
|
7037
|
+
}
|
|
7038
|
+
return clamp3(value, minSize, maxSize);
|
|
7039
|
+
}
|
|
7040
|
+
function normalizePositiveNumber(value, fallback) {
|
|
7041
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : fallback;
|
|
7042
|
+
}
|
|
7043
|
+
function normalizeMaxSize(value, minSize) {
|
|
7044
|
+
return typeof value === "number" && Number.isFinite(value) ? Math.max(value, minSize) : Number.POSITIVE_INFINITY;
|
|
7045
|
+
}
|
|
7046
|
+
function clamp3(value, min, max) {
|
|
7047
|
+
if (min > max) {
|
|
7048
|
+
return min;
|
|
7049
|
+
}
|
|
7050
|
+
return Math.min(Math.max(value, min), max);
|
|
7051
|
+
}
|
|
7052
|
+
var ReactAutoComplete = React.forwardRef(function ReactAutoComplete2(props, ref) {
|
|
7053
|
+
const {
|
|
7054
|
+
onChange,
|
|
7055
|
+
onInputValueChange,
|
|
7056
|
+
onPressEnter,
|
|
7057
|
+
options: initialOptions,
|
|
7058
|
+
value,
|
|
7059
|
+
...restProps
|
|
7060
|
+
} = props;
|
|
7061
|
+
const [options, setOptions] = React.useState(initialOptions);
|
|
7062
|
+
React.useEffect(() => {
|
|
7063
|
+
setOptions(initialOptions);
|
|
7064
|
+
}, [initialOptions]);
|
|
7065
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
7066
|
+
ReactSelect,
|
|
7067
|
+
{
|
|
7068
|
+
...restProps,
|
|
7069
|
+
ref,
|
|
7070
|
+
allowCustomValue: true,
|
|
7071
|
+
showSearch: true,
|
|
7072
|
+
value,
|
|
7073
|
+
options,
|
|
7074
|
+
onChange: (nextValue, info) => {
|
|
7075
|
+
onChange?.(
|
|
7076
|
+
options.find((option) => String(option.value) === String(nextValue))?.value ?? nextValue,
|
|
7077
|
+
info
|
|
7078
|
+
);
|
|
7079
|
+
},
|
|
7080
|
+
onInputValueChange: (input) => {
|
|
7081
|
+
onInputValueChange?.(input);
|
|
7082
|
+
onChange?.(input, { trigger: "input" });
|
|
7083
|
+
},
|
|
7084
|
+
onPressEnter: async (input) => {
|
|
7085
|
+
const nextOptions = await onPressEnter?.(input);
|
|
7086
|
+
if (nextOptions) {
|
|
7087
|
+
setOptions(nextOptions);
|
|
7088
|
+
}
|
|
7089
|
+
onChange?.(
|
|
7090
|
+
nextOptions ? resolveAutoCompleteValue(input, nextOptions) : input,
|
|
7091
|
+
{ trigger: "keyboard" }
|
|
7092
|
+
);
|
|
7093
|
+
}
|
|
7094
|
+
}
|
|
7095
|
+
);
|
|
7096
|
+
});
|
|
7097
|
+
function resolveAutoCompleteValue(input, options) {
|
|
7098
|
+
const normalizedInput = input.toLowerCase();
|
|
7099
|
+
return options.find(
|
|
7100
|
+
(option) => option.label.toLowerCase() === normalizedInput || String(option.value).toLowerCase() === normalizedInput
|
|
7101
|
+
)?.value ?? input;
|
|
7102
|
+
}
|
|
5837
7103
|
var ReactTimePicker = React.forwardRef(
|
|
5838
7104
|
function ReactTimePicker2(props, ref) {
|
|
5839
7105
|
const {
|
|
@@ -6718,6 +7984,7 @@ function resolveDecadeStart6(year) {
|
|
|
6718
7984
|
}
|
|
6719
7985
|
|
|
6720
7986
|
exports.REACT_COMPONENT_PREFIX = REACT_COMPONENT_PREFIX;
|
|
7987
|
+
exports.ReactAutoComplete = ReactAutoComplete;
|
|
6721
7988
|
exports.ReactCheckbox = ReactCheckbox;
|
|
6722
7989
|
exports.ReactColorPicker = ReactColorPicker;
|
|
6723
7990
|
exports.ReactContentScaleProvider = ReactContentScaleProvider;
|
|
@@ -6725,21 +7992,26 @@ exports.ReactDatePicker = ReactDatePicker;
|
|
|
6725
7992
|
exports.ReactDateRangePicker = ReactDateRangePicker;
|
|
6726
7993
|
exports.ReactDateTimePicker = ReactDateTimePicker;
|
|
6727
7994
|
exports.ReactDateTimeRangePicker = ReactDateTimeRangePicker;
|
|
7995
|
+
exports.ReactFilterPanel = ReactFilterPanel;
|
|
6728
7996
|
exports.ReactImagePreview = ReactImagePreview;
|
|
6729
7997
|
exports.ReactInput = ReactInput;
|
|
6730
7998
|
exports.ReactInputNumber = ReactInputNumber;
|
|
7999
|
+
exports.ReactInputRange = ReactInputRange;
|
|
8000
|
+
exports.ReactModal = ReactModal;
|
|
6731
8001
|
exports.ReactMonthPicker = ReactMonthPicker;
|
|
6732
8002
|
exports.ReactNumberInput = ReactNumberInput;
|
|
6733
8003
|
exports.ReactPagination = ReactPagination;
|
|
6734
8004
|
exports.ReactPopconfirm = ReactPopconfirm;
|
|
6735
8005
|
exports.ReactPopup = ReactPopup;
|
|
6736
8006
|
exports.ReactQuarterPicker = ReactQuarterPicker;
|
|
8007
|
+
exports.ReactResizablePanels = ReactResizablePanels;
|
|
6737
8008
|
exports.ReactSelect = ReactSelect;
|
|
6738
8009
|
exports.ReactTimePicker = ReactTimePicker;
|
|
6739
8010
|
exports.ReactTimeRangePicker = ReactTimeRangePicker;
|
|
6740
8011
|
exports.ReactTransition = ReactTransition;
|
|
6741
8012
|
exports.ReactVirtualList = ReactVirtualList;
|
|
6742
8013
|
exports.ReactYearPicker = ReactYearPicker;
|
|
8014
|
+
exports.resolveResizablePanelSizes = resolveResizablePanelSizes;
|
|
6743
8015
|
exports.useReactContentScale = useReactContentScale;
|
|
6744
8016
|
exports.useReactTransition = useReactTransition;
|
|
6745
8017
|
//# sourceMappingURL=index.cjs.map
|