@canvas-components/react-components 0.3.7 → 0.3.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.cts CHANGED
@@ -927,6 +927,31 @@ interface ReactSelectProps extends Omit<ReactInputProps, "value" | "onChange" |
927
927
  */
928
928
  declare const ReactSelect: react.ForwardRefExoticComponent<ReactSelectProps & react.RefAttributes<HTMLInputElement>>;
929
929
 
930
+ /** 级联选择树节点;值保留原始字符串或数字类型。 */
931
+ interface ReactCascaderOption {
932
+ label: string;
933
+ value: string | number;
934
+ disabled?: boolean;
935
+ children?: ReactCascaderOption[];
936
+ }
937
+ /** 选择来源及是否已完成路径选择。 */
938
+ interface ReactCascaderChangeInfo {
939
+ trigger: "mouse" | "keyboard" | "clear";
940
+ complete: boolean;
941
+ }
942
+ /** 单路径级联选择配置。 */
943
+ interface ReactCascaderProps extends Omit<ReactInputProps, "value" | "defaultValue" | "onChange" | "onPressEnter" | "displayRender"> {
944
+ value?: (string | number)[];
945
+ options?: ReactCascaderOption[];
946
+ showSearch?: boolean;
947
+ changeOnSelect?: boolean;
948
+ expandTrigger?: "click" | "hover";
949
+ displayRender?: (labels: string[], selectedOptions: ReactCascaderOption[]) => string;
950
+ onChange?: (value: (string | number)[], selectedOptions: ReactCascaderOption[], info: ReactCascaderChangeInfo) => void;
951
+ }
952
+ /** 多列展开的级联选择器,复用现有输入框、浮层及主题。 */
953
+ declare function ReactCascader(props: ReactCascaderProps): react.JSX.Element;
954
+
930
955
  interface ReactAutoCompleteProps extends Omit<ReactSelectProps, "allowCustomValue" | "onChange" | "onInputValueChange" | "onPressEnter"> {
931
956
  /** 当前值。 */
932
957
  value?: string | number;
@@ -1291,4 +1316,4 @@ declare function useReactContentScale(): ReactContentScaleValue;
1291
1316
  */
1292
1317
  declare const REACT_COMPONENT_PREFIX = "canvas-react";
1293
1318
 
1294
- export { REACT_COMPONENT_PREFIX, ReactAutoComplete, type ReactAutoCompleteProps, ReactButton, type ReactButtonProps, ReactCheckbox, type ReactCheckboxProps, type ReactCheckboxRef, ReactCol, type ReactColProps, ReactColorPicker, type ReactColorPickerProps, ReactContentScaleProvider, type ReactContentScaleValue, ReactDatePicker, type ReactDatePickerProps, ReactDateRangePicker, type ReactDateRangePickerProps, ReactDateTimePicker, type ReactDateTimePickerProps, ReactDateTimeRangePicker, type ReactDateTimeRangePickerProps, type ReactFilterConditionOperator, ReactFilterPanel, type ReactFilterPanelCondition, type ReactFilterPanelOption, type ReactFilterPanelRequest, type ReactFilterPanelTexts, type ReactFilterPanelValue, ReactFlex, type ReactFlexProps, ReactForm, type ReactFormInstance, type ReactFormItemProps, type ReactFormProps, type ReactFormRule, type ReactFormRuleConfig, type ReactFormValues, ReactImagePreview, type ReactImagePreviewProps, ReactInput, ReactInputNumber, type ReactInputNumberProps, type ReactInputProps, ReactInputRange, type ReactInputRangeProps, type ReactInputRangeValue, type ReactMessageType, ReactModal, type ReactModalButtonProps, type ReactModalCancelEvent, type ReactModalProps, ReactMonthPicker, type ReactMonthPickerProps, ReactNumberInput, type ReactNumberInputProps, ReactPagination, type ReactPaginationProps, type ReactPaginationStyles, ReactPopconfirm, type ReactPopconfirmButtonProps, type ReactPopconfirmPlacement, type ReactPopconfirmProps, ReactPopup, type ReactPopupProps, ReactQuarterPicker, type ReactQuarterPickerProps, ReactRadio, type ReactRadioGroupProps, type ReactRadioProps, type ReactResizablePanel, type ReactResizablePanelSizes, ReactResizablePanels, type ReactResizablePanelsDirection, type ReactResizablePanelsProps, type ReactResizablePanelsResizeInfo, ReactRow, type ReactRowProps, ReactSelect, type ReactSelectChangeInfo, type ReactSelectFilterOption, type ReactSelectOption, type ReactSelectProps, ReactTextArea, type ReactTextAreaProps, ReactTimePicker, type ReactTimePickerProps, ReactTimeRangePicker, type ReactTimeRangePickerProps, ReactTooltip, type ReactTooltipProps, ReactTransition, type ReactTransitionDuration, type ReactTransitionOptions, type ReactTransitionPhase, type ReactTransitionProps, type ReactTransitionState, ReactVirtualList, type ReactVirtualListProps, type ReactVirtualListRef, ReactYearPicker, type ReactYearPickerProps, reactMessage, resolveResizablePanelSizes, useReactContentScale, useReactForm, useReactFormWatch, useReactTransition };
1319
+ export { REACT_COMPONENT_PREFIX, ReactAutoComplete, type ReactAutoCompleteProps, ReactButton, type ReactButtonProps, ReactCascader, type ReactCascaderChangeInfo, type ReactCascaderOption, type ReactCascaderProps, ReactCheckbox, type ReactCheckboxProps, type ReactCheckboxRef, ReactCol, type ReactColProps, ReactColorPicker, type ReactColorPickerProps, ReactContentScaleProvider, type ReactContentScaleValue, ReactDatePicker, type ReactDatePickerProps, ReactDateRangePicker, type ReactDateRangePickerProps, ReactDateTimePicker, type ReactDateTimePickerProps, ReactDateTimeRangePicker, type ReactDateTimeRangePickerProps, type ReactFilterConditionOperator, ReactFilterPanel, type ReactFilterPanelCondition, type ReactFilterPanelOption, type ReactFilterPanelRequest, type ReactFilterPanelTexts, type ReactFilterPanelValue, ReactFlex, type ReactFlexProps, ReactForm, type ReactFormInstance, type ReactFormItemProps, type ReactFormProps, type ReactFormRule, type ReactFormRuleConfig, type ReactFormValues, ReactImagePreview, type ReactImagePreviewProps, ReactInput, ReactInputNumber, type ReactInputNumberProps, type ReactInputProps, ReactInputRange, type ReactInputRangeProps, type ReactInputRangeValue, type ReactMessageType, ReactModal, type ReactModalButtonProps, type ReactModalCancelEvent, type ReactModalProps, ReactMonthPicker, type ReactMonthPickerProps, ReactNumberInput, type ReactNumberInputProps, ReactPagination, type ReactPaginationProps, type ReactPaginationStyles, ReactPopconfirm, type ReactPopconfirmButtonProps, type ReactPopconfirmPlacement, type ReactPopconfirmProps, ReactPopup, type ReactPopupProps, ReactQuarterPicker, type ReactQuarterPickerProps, ReactRadio, type ReactRadioGroupProps, type ReactRadioProps, type ReactResizablePanel, type ReactResizablePanelSizes, ReactResizablePanels, type ReactResizablePanelsDirection, type ReactResizablePanelsProps, type ReactResizablePanelsResizeInfo, ReactRow, type ReactRowProps, ReactSelect, type ReactSelectChangeInfo, type ReactSelectFilterOption, type ReactSelectOption, type ReactSelectProps, ReactTextArea, type ReactTextAreaProps, ReactTimePicker, type ReactTimePickerProps, ReactTimeRangePicker, type ReactTimeRangePickerProps, ReactTooltip, type ReactTooltipProps, ReactTransition, type ReactTransitionDuration, type ReactTransitionOptions, type ReactTransitionPhase, type ReactTransitionProps, type ReactTransitionState, ReactVirtualList, type ReactVirtualListProps, type ReactVirtualListRef, ReactYearPicker, type ReactYearPickerProps, reactMessage, resolveResizablePanelSizes, useReactContentScale, useReactForm, useReactFormWatch, useReactTransition };
package/dist/index.d.ts CHANGED
@@ -927,6 +927,31 @@ interface ReactSelectProps extends Omit<ReactInputProps, "value" | "onChange" |
927
927
  */
928
928
  declare const ReactSelect: react.ForwardRefExoticComponent<ReactSelectProps & react.RefAttributes<HTMLInputElement>>;
929
929
 
930
+ /** 级联选择树节点;值保留原始字符串或数字类型。 */
931
+ interface ReactCascaderOption {
932
+ label: string;
933
+ value: string | number;
934
+ disabled?: boolean;
935
+ children?: ReactCascaderOption[];
936
+ }
937
+ /** 选择来源及是否已完成路径选择。 */
938
+ interface ReactCascaderChangeInfo {
939
+ trigger: "mouse" | "keyboard" | "clear";
940
+ complete: boolean;
941
+ }
942
+ /** 单路径级联选择配置。 */
943
+ interface ReactCascaderProps extends Omit<ReactInputProps, "value" | "defaultValue" | "onChange" | "onPressEnter" | "displayRender"> {
944
+ value?: (string | number)[];
945
+ options?: ReactCascaderOption[];
946
+ showSearch?: boolean;
947
+ changeOnSelect?: boolean;
948
+ expandTrigger?: "click" | "hover";
949
+ displayRender?: (labels: string[], selectedOptions: ReactCascaderOption[]) => string;
950
+ onChange?: (value: (string | number)[], selectedOptions: ReactCascaderOption[], info: ReactCascaderChangeInfo) => void;
951
+ }
952
+ /** 多列展开的级联选择器,复用现有输入框、浮层及主题。 */
953
+ declare function ReactCascader(props: ReactCascaderProps): react.JSX.Element;
954
+
930
955
  interface ReactAutoCompleteProps extends Omit<ReactSelectProps, "allowCustomValue" | "onChange" | "onInputValueChange" | "onPressEnter"> {
931
956
  /** 当前值。 */
932
957
  value?: string | number;
@@ -1291,4 +1316,4 @@ declare function useReactContentScale(): ReactContentScaleValue;
1291
1316
  */
1292
1317
  declare const REACT_COMPONENT_PREFIX = "canvas-react";
1293
1318
 
1294
- export { REACT_COMPONENT_PREFIX, ReactAutoComplete, type ReactAutoCompleteProps, ReactButton, type ReactButtonProps, ReactCheckbox, type ReactCheckboxProps, type ReactCheckboxRef, ReactCol, type ReactColProps, ReactColorPicker, type ReactColorPickerProps, ReactContentScaleProvider, type ReactContentScaleValue, ReactDatePicker, type ReactDatePickerProps, ReactDateRangePicker, type ReactDateRangePickerProps, ReactDateTimePicker, type ReactDateTimePickerProps, ReactDateTimeRangePicker, type ReactDateTimeRangePickerProps, type ReactFilterConditionOperator, ReactFilterPanel, type ReactFilterPanelCondition, type ReactFilterPanelOption, type ReactFilterPanelRequest, type ReactFilterPanelTexts, type ReactFilterPanelValue, ReactFlex, type ReactFlexProps, ReactForm, type ReactFormInstance, type ReactFormItemProps, type ReactFormProps, type ReactFormRule, type ReactFormRuleConfig, type ReactFormValues, ReactImagePreview, type ReactImagePreviewProps, ReactInput, ReactInputNumber, type ReactInputNumberProps, type ReactInputProps, ReactInputRange, type ReactInputRangeProps, type ReactInputRangeValue, type ReactMessageType, ReactModal, type ReactModalButtonProps, type ReactModalCancelEvent, type ReactModalProps, ReactMonthPicker, type ReactMonthPickerProps, ReactNumberInput, type ReactNumberInputProps, ReactPagination, type ReactPaginationProps, type ReactPaginationStyles, ReactPopconfirm, type ReactPopconfirmButtonProps, type ReactPopconfirmPlacement, type ReactPopconfirmProps, ReactPopup, type ReactPopupProps, ReactQuarterPicker, type ReactQuarterPickerProps, ReactRadio, type ReactRadioGroupProps, type ReactRadioProps, type ReactResizablePanel, type ReactResizablePanelSizes, ReactResizablePanels, type ReactResizablePanelsDirection, type ReactResizablePanelsProps, type ReactResizablePanelsResizeInfo, ReactRow, type ReactRowProps, ReactSelect, type ReactSelectChangeInfo, type ReactSelectFilterOption, type ReactSelectOption, type ReactSelectProps, ReactTextArea, type ReactTextAreaProps, ReactTimePicker, type ReactTimePickerProps, ReactTimeRangePicker, type ReactTimeRangePickerProps, ReactTooltip, type ReactTooltipProps, ReactTransition, type ReactTransitionDuration, type ReactTransitionOptions, type ReactTransitionPhase, type ReactTransitionProps, type ReactTransitionState, ReactVirtualList, type ReactVirtualListProps, type ReactVirtualListRef, ReactYearPicker, type ReactYearPickerProps, reactMessage, resolveResizablePanelSizes, useReactContentScale, useReactForm, useReactFormWatch, useReactTransition };
1319
+ export { REACT_COMPONENT_PREFIX, ReactAutoComplete, type ReactAutoCompleteProps, ReactButton, type ReactButtonProps, ReactCascader, type ReactCascaderChangeInfo, type ReactCascaderOption, type ReactCascaderProps, ReactCheckbox, type ReactCheckboxProps, type ReactCheckboxRef, ReactCol, type ReactColProps, ReactColorPicker, type ReactColorPickerProps, ReactContentScaleProvider, type ReactContentScaleValue, ReactDatePicker, type ReactDatePickerProps, ReactDateRangePicker, type ReactDateRangePickerProps, ReactDateTimePicker, type ReactDateTimePickerProps, ReactDateTimeRangePicker, type ReactDateTimeRangePickerProps, type ReactFilterConditionOperator, ReactFilterPanel, type ReactFilterPanelCondition, type ReactFilterPanelOption, type ReactFilterPanelRequest, type ReactFilterPanelTexts, type ReactFilterPanelValue, ReactFlex, type ReactFlexProps, ReactForm, type ReactFormInstance, type ReactFormItemProps, type ReactFormProps, type ReactFormRule, type ReactFormRuleConfig, type ReactFormValues, ReactImagePreview, type ReactImagePreviewProps, ReactInput, ReactInputNumber, type ReactInputNumberProps, type ReactInputProps, ReactInputRange, type ReactInputRangeProps, type ReactInputRangeValue, type ReactMessageType, ReactModal, type ReactModalButtonProps, type ReactModalCancelEvent, type ReactModalProps, ReactMonthPicker, type ReactMonthPickerProps, ReactNumberInput, type ReactNumberInputProps, ReactPagination, type ReactPaginationProps, type ReactPaginationStyles, ReactPopconfirm, type ReactPopconfirmButtonProps, type ReactPopconfirmPlacement, type ReactPopconfirmProps, ReactPopup, type ReactPopupProps, ReactQuarterPicker, type ReactQuarterPickerProps, ReactRadio, type ReactRadioGroupProps, type ReactRadioProps, type ReactResizablePanel, type ReactResizablePanelSizes, ReactResizablePanels, type ReactResizablePanelsDirection, type ReactResizablePanelsProps, type ReactResizablePanelsResizeInfo, ReactRow, type ReactRowProps, ReactSelect, type ReactSelectChangeInfo, type ReactSelectFilterOption, type ReactSelectOption, type ReactSelectProps, ReactTextArea, type ReactTextAreaProps, ReactTimePicker, type ReactTimePickerProps, ReactTimeRangePicker, type ReactTimeRangePickerProps, ReactTooltip, type ReactTooltipProps, ReactTransition, type ReactTransitionDuration, type ReactTransitionOptions, type ReactTransitionPhase, type ReactTransitionProps, type ReactTransitionState, ReactVirtualList, type ReactVirtualListProps, type ReactVirtualListRef, ReactYearPicker, type ReactYearPickerProps, reactMessage, resolveResizablePanelSizes, useReactContentScale, useReactForm, useReactFormWatch, useReactTransition };
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { forwardRef, useRef, useEffect, useImperativeHandle, createContext, useState, useMemo, useLayoutEffect, useContext, useSyncExternalStore, cloneElement, Fragment as Fragment$1 } from 'react';
2
+ import { forwardRef, useRef, useEffect, useImperativeHandle, createContext, useState, useMemo, useLayoutEffect, useContext, useSyncExternalStore, cloneElement, Fragment as Fragment$1, useId } from 'react';
3
3
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
4
4
  import { createPortal } from 'react-dom';
5
5
 
@@ -713,7 +713,7 @@ var ReactVirtualList = forwardRef(function ReactVirtualListInner(props, ref) {
713
713
  });
714
714
 
715
715
  // src/components/select/style.css
716
- 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');
716
+ 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 pointer-events: none;\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.canvas-react-cascader:hover .canvas-react-select-clear,\n.canvas-react-cascader-open .canvas-react-select-clear,\n.canvas-react-cascader: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.canvas-react-cascader:hover .canvas-react-select-actions-clearable .canvas-react-select-arrow,\n.canvas-react-cascader-open .canvas-react-select-actions-clearable .canvas-react-select-arrow,\n.canvas-react-cascader: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');
717
717
  var ReactSelect = forwardRef(
718
718
  function ReactSelect2(props, ref) {
719
719
  const {
@@ -7238,6 +7238,333 @@ function clamp3(value, min, max) {
7238
7238
  }
7239
7239
  return Math.min(Math.max(value, min), max);
7240
7240
  }
7241
+
7242
+ // src/components/cascader/style.css
7243
+ styleInject('@import "../../styles/variables.css";\n.canvas-react-cascader {\n width: 100%;\n min-width: 0;\n}\n.canvas-react-cascader > .canvas-react-input-affix-wrapper {\n width: 100%;\n}\n.canvas-react-cascader-menus {\n display: flex;\n max-width: calc(100vw - 24px);\n overflow: auto;\n color: var(--canvas-react-color-text);\n font-size: var(--canvas-react-font-size);\n}\n.canvas-react-cascader-menu {\n flex: 0 0 auto;\n min-width: 120px;\n max-width: 320px;\n max-height: min(256px, calc(100vh - 48px));\n overflow: auto;\n padding: 4px;\n}\n.canvas-react-cascader-menu + .canvas-react-cascader-menu {\n border-left: 1px solid var(--canvas-react-color-border);\n}\n.canvas-react-cascader-option {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 20px;\n padding: 5px 10px;\n line-height: 22px;\n border-radius: var(--canvas-react-radius-sm);\n cursor: pointer;\n white-space: nowrap;\n}\n.canvas-react-cascader-option[aria-selected=true] {\n color: var(--canvas-react-color-primary);\n background: var(--canvas-react-color-bg-active);\n}\n.canvas-react-cascader-option[data-active=true] {\n background: var(--canvas-react-color-bg-hover, #f5f5f5);\n}\n.canvas-react-cascader-option[aria-disabled=true] {\n opacity: 0.4;\n cursor: not-allowed;\n}\n.canvas-react-cascader-empty {\n padding: 8px 10px;\n color: var(--canvas-react-color-text-muted);\n}\n.canvas-react-cascader-chevron {\n width: 7px;\n height: 7px;\n flex: 0 0 auto;\n margin-left: 8px;\n border-top: 1.5px solid #9ca3af;\n border-right: 1.5px solid #9ca3af;\n transform: rotate(45deg);\n transform-origin: center;\n transition: transform 0.18s ease, border-color 0.18s ease;\n}\n.canvas-react-cascader-option:not([aria-disabled=true]):hover .canvas-react-cascader-chevron,\n.canvas-react-cascader-option[aria-selected=true] .canvas-react-cascader-chevron {\n border-color: #6b7280;\n transform: rotate(135deg);\n}\n');
7244
+ function resolvePath(options, value) {
7245
+ const path = [];
7246
+ for (const part of value) {
7247
+ const item = options.find((option) => option.value === part);
7248
+ if (!item) break;
7249
+ path.push(item);
7250
+ options = item.children ?? [];
7251
+ }
7252
+ return path;
7253
+ }
7254
+ var EMPTY_OPTIONS = [];
7255
+ var EMPTY_VALUE = [];
7256
+ function ReactCascader(props) {
7257
+ const {
7258
+ value = EMPTY_VALUE,
7259
+ options = EMPTY_OPTIONS,
7260
+ showSearch = false,
7261
+ changeOnSelect = false,
7262
+ expandTrigger = "click",
7263
+ displayRender,
7264
+ onChange,
7265
+ allowClear = true,
7266
+ disabled,
7267
+ readOnly,
7268
+ onFocus,
7269
+ onBlur,
7270
+ onClick,
7271
+ onKeyDown,
7272
+ ...inputProps
7273
+ } = props;
7274
+ const anchorRef = useRef(null);
7275
+ const inputRef = useRef(null);
7276
+ const popupRef = useRef(null);
7277
+ const popupId = useId();
7278
+ const selected = useMemo(() => resolvePath(options, value), [options, value]);
7279
+ const [path, setPath] = useState(selected);
7280
+ const [open, setOpen] = useState(false);
7281
+ const [keyword, setKeyword] = useState("");
7282
+ const [typing, setTyping] = useState(false);
7283
+ const [focus, setFocus] = useState({ column: 0, index: -1 });
7284
+ const interactive = !disabled && !readOnly;
7285
+ useEffect(() => {
7286
+ setPath(selected);
7287
+ }, [selected]);
7288
+ const labels = value.map(
7289
+ (part, index) => selected[index]?.label ?? String(part)
7290
+ );
7291
+ const text = displayRender?.(labels, selected) ?? labels.join(" / ");
7292
+ const columns = [options];
7293
+ for (const item of path) {
7294
+ if (!item.children?.length) break;
7295
+ columns.push(item.children);
7296
+ }
7297
+ const searching = showSearch && keyword.trim().length > 0;
7298
+ const results = useMemo(() => {
7299
+ if (!keyword.trim()) return [];
7300
+ const matches = [];
7301
+ const visit = (items, parents) => {
7302
+ for (const item of items) {
7303
+ if (item.disabled) continue;
7304
+ const next = [...parents, item];
7305
+ if ((!item.children?.length || changeOnSelect) && next.map((part) => part.label).join(" / ").toLocaleLowerCase().includes(keyword.trim().toLocaleLowerCase()))
7306
+ matches.push(next);
7307
+ if (item.children?.length) visit(item.children, next);
7308
+ }
7309
+ };
7310
+ visit(options, []);
7311
+ return matches;
7312
+ }, [options, keyword, changeOnSelect]);
7313
+ useEffect(() => {
7314
+ popupRef.current?.querySelector("[data-active='true']")?.scrollIntoView?.({ block: "nearest", inline: "nearest" });
7315
+ }, [focus, open]);
7316
+ const choose = (next, trigger, fromSearch = false) => {
7317
+ const item = next[next.length - 1];
7318
+ if (!item || next.some((option) => option.disabled)) return;
7319
+ setPath(next);
7320
+ const complete = !item.children?.length || fromSearch;
7321
+ if (complete || changeOnSelect)
7322
+ onChange?.(
7323
+ next.map((option) => option.value),
7324
+ next,
7325
+ { trigger, complete }
7326
+ );
7327
+ if (complete) {
7328
+ setOpen(false);
7329
+ setKeyword("");
7330
+ setTyping(false);
7331
+ }
7332
+ };
7333
+ const show = () => {
7334
+ if (!interactive) return;
7335
+ setOpen(true);
7336
+ setPath(selected);
7337
+ };
7338
+ return /* @__PURE__ */ jsxs(
7339
+ "div",
7340
+ {
7341
+ ref: anchorRef,
7342
+ className: `canvas-react-cascader${open && interactive ? " canvas-react-cascader-open" : ""}`,
7343
+ children: [
7344
+ /* @__PURE__ */ jsx(
7345
+ ReactInput,
7346
+ {
7347
+ ref: inputRef,
7348
+ ...inputProps,
7349
+ disabled,
7350
+ readOnly: readOnly || !showSearch,
7351
+ allowClear: false,
7352
+ role: "combobox",
7353
+ "aria-haspopup": "listbox",
7354
+ "aria-expanded": open,
7355
+ "aria-controls": open ? popupId : void 0,
7356
+ "aria-activedescendant": open && focus.index >= 0 ? `${popupId}-${searching ? 0 : focus.column}-${focus.index}` : void 0,
7357
+ value: open && showSearch && typing ? keyword : text,
7358
+ onFocus: (event) => {
7359
+ show();
7360
+ onFocus?.(event);
7361
+ },
7362
+ onClick: (event) => {
7363
+ show();
7364
+ onClick?.(event);
7365
+ },
7366
+ onBlur: (event) => {
7367
+ setOpen(false);
7368
+ setKeyword("");
7369
+ setTyping(false);
7370
+ onBlur?.(event);
7371
+ },
7372
+ onChange: (event) => {
7373
+ setTyping(true);
7374
+ setKeyword(event.target.value);
7375
+ setOpen(true);
7376
+ setFocus({ column: 0, index: -1 });
7377
+ },
7378
+ onKeyDown: (event) => {
7379
+ onKeyDown?.(event);
7380
+ if (event.defaultPrevented || !interactive) return;
7381
+ if (event.key === "Escape") {
7382
+ event.preventDefault();
7383
+ setOpen(false);
7384
+ setKeyword("");
7385
+ setTyping(false);
7386
+ return;
7387
+ }
7388
+ if (![
7389
+ "ArrowDown",
7390
+ "ArrowUp",
7391
+ "ArrowRight",
7392
+ "ArrowLeft",
7393
+ "Enter"
7394
+ ].includes(event.key))
7395
+ return;
7396
+ event.preventDefault();
7397
+ setOpen(true);
7398
+ const column = searching ? 0 : Math.min(focus.column, columns.length - 1);
7399
+ const items = searching ? results.map((result) => result[result.length - 1]) : columns[column];
7400
+ if (event.key === "ArrowDown" || event.key === "ArrowUp") {
7401
+ const direction = event.key === "ArrowDown" ? 1 : -1;
7402
+ let index = focus.index;
7403
+ if (index < 0) index = direction === 1 ? -1 : 0;
7404
+ for (let count = 0; count < items.length; count++) {
7405
+ index = (index + direction + items.length) % items.length;
7406
+ if (!items[index].disabled) {
7407
+ setFocus({ column, index });
7408
+ break;
7409
+ }
7410
+ }
7411
+ } else if (event.key === "ArrowLeft" && !searching) {
7412
+ const previous = Math.max(0, column - 1);
7413
+ setFocus({
7414
+ column: previous,
7415
+ index: columns[previous].indexOf(path[previous])
7416
+ });
7417
+ } else {
7418
+ const item = items[focus.index];
7419
+ if (!item || item.disabled) return;
7420
+ const next = searching ? results[focus.index] : [...path.slice(0, column), item];
7421
+ if (event.key === "Enter") choose(next, "keyboard", searching);
7422
+ else if (event.key !== "ArrowRight") return;
7423
+ if (!searching && item.children?.length) {
7424
+ setPath(next);
7425
+ setFocus({
7426
+ column: column + 1,
7427
+ index: item.children.findIndex((child) => !child.disabled)
7428
+ });
7429
+ }
7430
+ }
7431
+ },
7432
+ suffix: /* @__PURE__ */ jsxs(
7433
+ "span",
7434
+ {
7435
+ className: `canvas-react-select-actions${allowClear && interactive && value.length > 0 ? " canvas-react-select-actions-clearable" : ""}`,
7436
+ onPointerDown: (event) => {
7437
+ if (!interactive) return;
7438
+ event.preventDefault();
7439
+ event.stopPropagation();
7440
+ },
7441
+ onMouseDown: (event) => {
7442
+ if (!interactive) return;
7443
+ event.preventDefault();
7444
+ event.stopPropagation();
7445
+ },
7446
+ onClick: (event) => {
7447
+ if (!interactive) return;
7448
+ event.stopPropagation();
7449
+ inputRef.current?.focus({ preventScroll: true });
7450
+ show();
7451
+ },
7452
+ children: [
7453
+ allowClear && interactive && value.length > 0 ? /* @__PURE__ */ jsx(
7454
+ "button",
7455
+ {
7456
+ type: "button",
7457
+ className: "canvas-react-select-clear",
7458
+ tabIndex: -1,
7459
+ "aria-label": "\u6E05\u7A7A\u7EA7\u8054\u9009\u62E9",
7460
+ onPointerDown: (event) => {
7461
+ event.preventDefault();
7462
+ event.stopPropagation();
7463
+ },
7464
+ onMouseDown: (event) => {
7465
+ event.preventDefault();
7466
+ event.stopPropagation();
7467
+ },
7468
+ onClick: (event) => {
7469
+ event.preventDefault();
7470
+ event.stopPropagation();
7471
+ inputRef.current?.focus({ preventScroll: true });
7472
+ setKeyword("");
7473
+ setTyping(false);
7474
+ setPath([]);
7475
+ setFocus({ column: 0, index: -1 });
7476
+ setOpen(true);
7477
+ onChange?.([], [], { trigger: "clear", complete: false });
7478
+ },
7479
+ children: /* @__PURE__ */ jsx(
7480
+ "span",
7481
+ {
7482
+ className: "canvas-react-select-clear-icon",
7483
+ "aria-hidden": "true"
7484
+ }
7485
+ )
7486
+ }
7487
+ ) : null,
7488
+ /* @__PURE__ */ jsx(
7489
+ "span",
7490
+ {
7491
+ className: `canvas-react-select-arrow${open && interactive ? " canvas-react-select-arrow-open" : ""}`,
7492
+ "aria-hidden": "true"
7493
+ }
7494
+ )
7495
+ ]
7496
+ }
7497
+ )
7498
+ }
7499
+ ),
7500
+ /* @__PURE__ */ jsx(
7501
+ ReactPopup,
7502
+ {
7503
+ constrainHeight: true,
7504
+ open: open && interactive,
7505
+ anchorRef,
7506
+ onOpenChange: setOpen,
7507
+ surfaceClassName: "canvas-react-cascader-popup",
7508
+ children: /* @__PURE__ */ jsx(
7509
+ "div",
7510
+ {
7511
+ ref: popupRef,
7512
+ id: popupId,
7513
+ className: "canvas-react-cascader-menus",
7514
+ children: (searching ? [results.map((result) => result[result.length - 1])] : columns).map((items, column) => /* @__PURE__ */ jsx(
7515
+ "div",
7516
+ {
7517
+ role: "listbox",
7518
+ "aria-label": searching ? "\u641C\u7D22\u7ED3\u679C" : `\u7B2C ${column + 1} \u7EA7\u9009\u9879`,
7519
+ className: "canvas-react-cascader-menu",
7520
+ children: items.length === 0 ? /* @__PURE__ */ jsx("div", { className: "canvas-react-cascader-empty", children: "\u6682\u65E0\u6570\u636E" }) : items.map((item, index) => {
7521
+ const next = searching ? results[index] : [...path.slice(0, column), item];
7522
+ const active = focus.column === column && focus.index === index;
7523
+ return /* @__PURE__ */ jsxs(
7524
+ "div",
7525
+ {
7526
+ id: `${popupId}-${column}-${index}`,
7527
+ role: "option",
7528
+ "aria-selected": path[column] === item,
7529
+ "aria-disabled": !!item.disabled,
7530
+ "data-active": active,
7531
+ className: "canvas-react-cascader-option",
7532
+ onMouseDown: (event) => event.preventDefault(),
7533
+ onMouseEnter: () => {
7534
+ if (item.disabled) return;
7535
+ setFocus({ column, index });
7536
+ if (expandTrigger === "hover" && !searching && item.children?.length)
7537
+ setPath(next);
7538
+ },
7539
+ onClick: () => {
7540
+ setFocus({ column, index });
7541
+ choose(next, "mouse", searching);
7542
+ },
7543
+ children: [
7544
+ /* @__PURE__ */ jsx("span", { children: searching ? next.map((part) => part.label).join(" / ") : item.label }),
7545
+ !searching && item.children?.length ? /* @__PURE__ */ jsx(
7546
+ "span",
7547
+ {
7548
+ className: "canvas-react-cascader-chevron",
7549
+ "aria-hidden": "true"
7550
+ }
7551
+ ) : null
7552
+ ]
7553
+ },
7554
+ index
7555
+ );
7556
+ })
7557
+ },
7558
+ column
7559
+ ))
7560
+ }
7561
+ )
7562
+ }
7563
+ )
7564
+ ]
7565
+ }
7566
+ );
7567
+ }
7241
7568
  var ReactAutoComplete = forwardRef(function ReactAutoComplete2(props, ref) {
7242
7569
  const {
7243
7570
  onChange,
@@ -8525,6 +8852,6 @@ var reactMessage = {
8525
8852
  error: (content) => showMessage("error", content)
8526
8853
  };
8527
8854
 
8528
- export { REACT_COMPONENT_PREFIX, ReactAutoComplete, ReactButton, ReactCheckbox, ReactCol, ReactColorPicker, ReactContentScaleProvider, ReactDatePicker, ReactDateRangePicker, ReactDateTimePicker, ReactDateTimeRangePicker, ReactFilterPanel, ReactFlex, ReactForm, ReactImagePreview, ReactInput, ReactInputNumber, ReactInputRange, ReactModal, ReactMonthPicker, ReactNumberInput, ReactPagination, ReactPopconfirm, ReactPopup, ReactQuarterPicker, ReactRadio, ReactResizablePanels, ReactRow, ReactSelect, ReactTextArea, ReactTimePicker, ReactTimeRangePicker, ReactTooltip, ReactTransition, ReactVirtualList, ReactYearPicker, reactMessage, resolveResizablePanelSizes, useReactContentScale, useReactForm, useReactFormWatch, useReactTransition };
8855
+ export { REACT_COMPONENT_PREFIX, ReactAutoComplete, ReactButton, ReactCascader, ReactCheckbox, ReactCol, ReactColorPicker, ReactContentScaleProvider, ReactDatePicker, ReactDateRangePicker, ReactDateTimePicker, ReactDateTimeRangePicker, ReactFilterPanel, ReactFlex, ReactForm, ReactImagePreview, ReactInput, ReactInputNumber, ReactInputRange, ReactModal, ReactMonthPicker, ReactNumberInput, ReactPagination, ReactPopconfirm, ReactPopup, ReactQuarterPicker, ReactRadio, ReactResizablePanels, ReactRow, ReactSelect, ReactTextArea, ReactTimePicker, ReactTimeRangePicker, ReactTooltip, ReactTransition, ReactVirtualList, ReactYearPicker, reactMessage, resolveResizablePanelSizes, useReactContentScale, useReactForm, useReactFormWatch, useReactTransition };
8529
8856
  //# sourceMappingURL=index.js.map
8530
8857
  //# sourceMappingURL=index.js.map