foxit-component 1.0.4 → 1.0.5-alpha.2

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.
@@ -6,8 +6,9 @@ import './alert.css';
6
6
  interface AlertProps {
7
7
  message: string | React.ReactNode;
8
8
  showIcon?: boolean;
9
- type?: 'success' | 'warning' | 'error' | 'gradient';
9
+ type?: 'success' | 'warning' | 'error' | 'gradient' | 'arrows';
10
10
  className?: string;
11
+ arrowPosition?: 'left' | 'right';
11
12
  }
12
13
  declare const Alert: React.FC<AlertProps>;
13
14
  export { Alert };
package/es/Alert/Alert.js CHANGED
@@ -4,7 +4,8 @@ import { Icon } from '../Icon/index.js';
4
4
  import classNames from 'classnames';
5
5
 
6
6
  var Alert = function (_a) {
7
- var message = _a.message, _b = _a.showIcon, showIcon = _b === void 0 ? true : _b, _c = _a.type, type = _c === void 0 ? 'success' : _c, className = _a.className;
7
+ var _b;
8
+ var message = _a.message, _c = _a.showIcon, showIcon = _c === void 0 ? true : _c, _d = _a.type, type = _d === void 0 ? 'success' : _d, className = _a.className, _e = _a.arrowPosition, arrowPosition = _e === void 0 ? 'left' : _e;
8
9
  var getIconName = function (type) {
9
10
  switch (type) {
10
11
  case 'success':
@@ -19,7 +20,9 @@ var Alert = function (_a) {
19
20
  return 'WarningColoursOutlined';
20
21
  }
21
22
  };
22
- return (jsxs("div", __assign({ className: classNames('foxit-alert', "foxit-alert-".concat(type), className) }, { children: [showIcon && (jsx("div", __assign({ className: "foxit-alert-icon-container" }, { children: jsx(Icon, { name: getIconName(type), className: "foxit-alert-icon" }) }))), jsx("div", __assign({ className: "foxit-alert-message" }, { children: message }))] })));
23
+ return (jsxs("div", __assign({ className: classNames('foxit-alert', "foxit-alert-".concat(type), (_b = {},
24
+ _b["foxit-alert-arrows-".concat(arrowPosition)] = type === 'arrows',
25
+ _b), className) }, { children: [showIcon && type !== 'arrows' && (jsx("div", __assign({ className: "foxit-alert-icon-container" }, { children: jsx(Icon, { name: getIconName(type), className: "foxit-alert-icon" }) }))), jsx("div", __assign({ className: "foxit-alert-message" }, { children: message }))] })));
23
26
  };
24
27
 
25
28
  export { Alert };
@@ -5,7 +5,9 @@ interface CheckboxProps {
5
5
  checked?: boolean;
6
6
  disabled?: boolean;
7
7
  value?: string;
8
- children: React.ReactNode;
8
+ children?: React.ReactNode;
9
+ size?: 'default' | 'small';
10
+ indeterminate?: boolean;
9
11
  }
10
12
  interface CheckboxGroupProps {
11
13
  value?: string[];
@@ -1,17 +1,23 @@
1
1
  import { __assign, __spreadArray } from '../node_modules/tslib/tslib.es6.js';
2
2
  import { jsxs, jsx } from 'react/jsx-runtime';
3
- import { createContext, useContext, useState, useEffect } from 'react';
3
+ import { createContext, useContext, useState, useRef, useEffect } from 'react';
4
4
 
5
5
  var CheckboxGroupContext = createContext(null);
6
6
  var Checkbox = function (_a) {
7
- var onChange = _a.onChange, checked = _a.checked, _b = _a.disabled, disabled = _b === void 0 ? false : _b, value = _a.value, children = _a.children;
7
+ var onChange = _a.onChange, checked = _a.checked, _b = _a.disabled, disabled = _b === void 0 ? false : _b, value = _a.value, children = _a.children, _c = _a.size, size = _c === void 0 ? 'default' : _c, _d = _a.indeterminate, indeterminate = _d === void 0 ? false : _d;
8
8
  var groupContext = useContext(CheckboxGroupContext);
9
- var _c = useState(checked || false), internalChecked = _c[0], setInternalChecked = _c[1];
9
+ var _e = useState(checked || false), internalChecked = _e[0], setInternalChecked = _e[1];
10
+ var inputRef = useRef(null);
10
11
  useEffect(function () {
11
12
  if (checked !== undefined) {
12
13
  setInternalChecked(checked);
13
14
  }
14
15
  }, [checked]);
16
+ useEffect(function () {
17
+ if (inputRef.current) {
18
+ inputRef.current.indeterminate = indeterminate;
19
+ }
20
+ }, [indeterminate]);
15
21
  var handleChange = function (e) {
16
22
  var newChecked = e.target.checked;
17
23
  setInternalChecked(newChecked);
@@ -23,7 +29,7 @@ var Checkbox = function (_a) {
23
29
  }
24
30
  };
25
31
  var isChecked = groupContext ? groupContext.value.includes(value || '') : internalChecked;
26
- return (jsxs("label", __assign({ className: "foxit-checkbox-container ".concat(disabled ? 'disabled' : '') }, { children: [jsx("input", { type: "checkbox", checked: isChecked, disabled: disabled, onChange: handleChange }), jsx("span", { className: "foxit-checkbox-checkmark ".concat(disabled ? 'disabled' : '') }), jsx("span", __assign({ className: "foxit-checkbox-content" }, { children: children }))] })));
32
+ return (jsxs("label", __assign({ className: "foxit-checkbox-container ".concat(disabled ? 'disabled' : '', " ").concat(size === 'small' ? 'small' : '') }, { children: [jsx("input", { ref: inputRef, type: "checkbox", checked: isChecked, disabled: disabled, onChange: handleChange }), jsx("span", { className: "foxit-checkbox-checkmark ".concat(disabled ? 'disabled' : '') }), jsx("span", __assign({ className: "foxit-checkbox-content" }, { children: children }))] })));
27
33
  };
28
34
  var CheckboxGroup = function (_a) {
29
35
  var value = _a.value, onChange = _a.onChange, children = _a.children;
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ export interface ConfigProviderProps {
3
+ dir?: 'ltr' | 'rtl';
4
+ children?: React.ReactNode;
5
+ }
6
+ interface ConfigContextType {
7
+ dir: 'ltr' | 'rtl';
8
+ }
9
+ export declare const useConfig: () => ConfigContextType;
10
+ declare const ConfigProvider: React.FC<ConfigProviderProps>;
11
+ export { ConfigProvider };
@@ -0,0 +1,19 @@
1
+ import { __assign } from '../node_modules/tslib/tslib.es6.js';
2
+ import { jsx } from 'react/jsx-runtime';
3
+ import { createContext, useContext } from 'react';
4
+
5
+ var ConfigContext = createContext({
6
+ dir: 'ltr'
7
+ });
8
+ var useConfig = function () {
9
+ return useContext(ConfigContext);
10
+ };
11
+ var ConfigProvider = function (_a) {
12
+ var _b = _a.dir, dir = _b === void 0 ? 'ltr' : _b, children = _a.children;
13
+ var value = {
14
+ dir: dir
15
+ };
16
+ return (jsx(ConfigContext.Provider, __assign({ value: value }, { children: jsx("div", __assign({ dir: dir }, { children: children })) })));
17
+ };
18
+
19
+ export { ConfigProvider, useConfig };
@@ -11,5 +11,10 @@ interface SearchInputProps extends InputProps {
11
11
  }
12
12
  declare const SearchInput: React.FC<SearchInputProps>;
13
13
  declare const PasswordInput: React.FC<InputProps>;
14
+ export interface TextAreaProps extends React.TextareaHTMLAttributes<HTMLTextAreaElement> {
15
+ className?: string;
16
+ rows?: number;
17
+ }
18
+ declare const TextArea: React.FC<TextAreaProps>;
14
19
  export default Input;
15
- export { SearchInput, PasswordInput };
20
+ export { SearchInput, PasswordInput, TextArea };
package/es/Input/Input.js CHANGED
@@ -25,5 +25,9 @@ var PasswordInput = function (props) {
25
25
  };
26
26
  return (jsx(Input, __assign({}, props, { type: visible ? 'text' : 'password', addonAfter: jsx("div", __assign({ style: { display: 'flex' }, onClick: toggleVisibility }, { children: jsx(Icon, { name: visible ? 'EyeOutlined' : 'EyeInvisibleOutlined' }) })) })));
27
27
  };
28
+ var TextArea = function (_a) {
29
+ var className = _a.className, _b = _a.rows, rows = _b === void 0 ? 3 : _b, rest = __rest(_a, ["className", "rows"]);
30
+ return (jsx("div", __assign({ className: "foxit-input-wrapper foxit-input-wrapper-textarea" }, { children: jsx("textarea", __assign({ className: classNames('foxit-input-element foxit-textarea-element', rest.disabled && 'foxit-input-wrapper-disabled', className), rows: rows }, rest)) })));
31
+ };
28
32
 
29
- export { PasswordInput, SearchInput, Input as default };
33
+ export { PasswordInput, SearchInput, TextArea, Input as default };
package/es/Menu/Menu.js CHANGED
@@ -2,6 +2,8 @@ import { __assign, __spreadArray } from '../node_modules/tslib/tslib.es6.js';
2
2
  import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
3
3
  import { useState, useRef, useEffect } from 'react';
4
4
  import { Icon } from '../Icon/index.js';
5
+ import { getDirection } from '../utils.js';
6
+ import classNames from 'classnames';
5
7
 
6
8
  var getItem = function (label, key, icon, children, type) {
7
9
  return {
@@ -19,7 +21,7 @@ var Menu = function (_a) {
19
21
  var _f = useState(defaultSelectedKeys), uncontrolledSelectedKeys = _f[0], setUncontrolledSelectedKeys = _f[1];
20
22
  var selectedKeys = controlledSelectedKeys !== undefined ? controlledSelectedKeys : uncontrolledSelectedKeys;
21
23
  var _g = useState(null), hoveredKey = _g[0], setHoveredKey = _g[1];
22
- var _h = useState({ top: 0, left: 0 }), popupPosition = _h[0], setPopupPosition = _h[1];
24
+ var _h = useState({ top: 0, left: 0, right: 0 }), popupPosition = _h[0], setPopupPosition = _h[1];
23
25
  var menuItemRefs = useRef({});
24
26
  var popupRef = useRef(null);
25
27
  var handleMenuClick = function (e) {
@@ -34,7 +36,7 @@ var Menu = function (_a) {
34
36
  // 标准展开模式的菜单项渲染
35
37
  var renderMenuItem = function (item) {
36
38
  var isSelected = selectedKeys.includes(item.key.toString());
37
- return (jsx("div", __assign({ className: "foxit-menu-item ".concat(isSelected ? 'selected' : '') }, { children: jsxs("div", __assign({ className: "foxit-menu-item-content", onClick: function () { return handleMenuClick({ key: item.key.toString() }); } }, { children: [item.icon && jsx("span", __assign({ style: { marginRight: '8px' } }, { children: item.icon })), jsx("span", __assign({ className: isFirstLevel(item) ? 'foxit-menu-item-label' : '' }, { children: item.label }))] })) }), item.key));
39
+ return (jsx("div", __assign({ className: "foxit-menu-item ".concat(isSelected ? 'selected' : '') }, { children: jsxs("div", __assign({ className: "foxit-menu-item-content", onClick: function () { return handleMenuClick({ key: item.key.toString() }); } }, { children: [item.icon && jsx("span", __assign({ className: "foxit-menu-item-icon-mr8" }, { children: item.icon })), jsx("span", __assign({ className: isFirstLevel(item) ? 'foxit-menu-item-label' : '' }, { children: item.label }))] })) }), item.key));
38
40
  };
39
41
  // 标准展开模式的子菜单渲染
40
42
  var renderSubMenu = function (item) {
@@ -46,7 +48,7 @@ var Menu = function (_a) {
46
48
  else {
47
49
  setOpenKeys(__spreadArray(__spreadArray([], openKeys, true), [item.key.toString()], false));
48
50
  }
49
- } }, { children: [jsxs("div", __assign({ style: { display: 'flex', alignItems: 'center' } }, { children: [item.icon && jsx("span", __assign({ style: { marginRight: '8px' } }, { children: item.icon })), jsx("span", __assign({ className: isFirstLevel(item) ? 'foxit-menu-item-label' : '' }, { children: item.label }))] })), jsx("span", { children: jsx(Icon, { name: "DownOutlined", className: "foxit-menu-icon ".concat(isOpen ? '' : 'foxit-menu-rotated-icon') }) })] })), isOpen && item.children && (jsx("div", __assign({ className: "foxit-menu-submenu-items" }, { children: item.children.map(function (child) {
51
+ } }, { children: [jsxs("div", __assign({ style: { display: 'flex', alignItems: 'center' } }, { children: [item.icon && jsx("span", __assign({ className: "foxit-menu-item-icon-mr8" }, { children: item.icon })), jsx("span", __assign({ className: isFirstLevel(item) ? 'foxit-menu-item-label' : '' }, { children: item.label }))] })), jsx("span", { children: jsx(Icon, { name: "DownOutlined", className: "foxit-menu-icon ".concat(isOpen ? '' : 'foxit-menu-rotated-icon') }) })] })), isOpen && item.children && (jsx("div", __assign({ className: "foxit-menu-submenu-items" }, { children: item.children.map(function (child) {
50
52
  return child.children ? renderSubMenu(child) : renderMenuItem(child);
51
53
  }) })))] }, item.key));
52
54
  };
@@ -66,10 +68,21 @@ var Menu = function (_a) {
66
68
  var itemRef = menuItemRefs.current[key];
67
69
  if (itemRef) {
68
70
  var rect = itemRef.getBoundingClientRect();
69
- setPopupPosition({
70
- top: rect.top,
71
- left: rect.right + 5
72
- });
71
+ var dir = getDirection(itemRef);
72
+ if (dir === 'rtl' && window !== undefined) {
73
+ setPopupPosition({
74
+ top: rect.top,
75
+ left: 0,
76
+ right: (window === null || window === void 0 ? void 0 : window.innerWidth) - rect.left
77
+ });
78
+ }
79
+ else {
80
+ setPopupPosition({
81
+ top: rect.top,
82
+ left: rect.right + 5,
83
+ right: 0
84
+ });
85
+ }
73
86
  }
74
87
  };
75
88
  // 处理鼠标离开事件
@@ -94,16 +107,27 @@ var Menu = function (_a) {
94
107
  if (!hoveredKey)
95
108
  return null;
96
109
  var item = findItemByKey(items, hoveredKey);
97
- if (!(item === null || item === void 0 ? void 0 : item.children))
98
- return null;
99
- return (jsx("div", __assign({ ref: popupRef, className: "foxit-menu-popup", style: {
100
- position: 'fixed',
101
- top: "".concat(popupPosition.top, "px"),
102
- left: "".concat(popupPosition.left, "px"),
103
- zIndex: 1000
104
- }, onMouseEnter: function () { return setHoveredKey(hoveredKey); }, onMouseLeave: function () { return setHoveredKey(null); } }, { children: jsxs("div", __assign({ className: "foxit-menu foxit-menu-popup-content" }, { children: [jsxs("div", __assign({ className: "foxit-menu-popup-title" }, { children: [jsx("span", __assign({ className: "foxit-menu-item-icon" }, { children: item.icon })), jsx("span", { children: item.label })] })), item.children.map(function (child) {
110
+ // if (!item?.children) return null;
111
+ // 根据方向设置样式
112
+ var dir = getDirection();
113
+ var popupStyle = {
114
+ position: 'fixed',
115
+ top: "".concat(popupPosition.top, "px"),
116
+ zIndex: 1000
117
+ };
118
+ if (dir === 'rtl') {
119
+ // RTL在左侧显示
120
+ popupStyle.right = "".concat(popupPosition.right, "px");
121
+ popupStyle.left = 'auto';
122
+ }
123
+ else {
124
+ // LTR在右侧显示
125
+ popupStyle.left = "".concat(popupPosition.left, "px");
126
+ popupStyle.right = 'auto';
127
+ }
128
+ return (jsx("div", __assign({ ref: popupRef, className: "foxit-menu-popup", style: popupStyle, onMouseEnter: function () { return setHoveredKey(hoveredKey); }, onMouseLeave: function () { return setHoveredKey(null); } }, { children: jsxs("div", __assign({ className: "foxit-menu foxit-menu-popup-content" }, { children: [jsxs("div", __assign({ className: classNames("foxit-menu-popup-title", !(item === null || item === void 0 ? void 0 : item.children) && 'foxit-menu-popup-title-no-border') }, { children: [jsx("span", __assign({ className: "foxit-menu-item-icon" }, { children: item === null || item === void 0 ? void 0 : item.icon })), jsx("span", { children: item === null || item === void 0 ? void 0 : item.label })] })), (item === null || item === void 0 ? void 0 : item.children) && (item === null || item === void 0 ? void 0 : item.children.map(function (child) {
105
129
  return child.children ? renderPopupSubMenu(child) : renderPopupMenuItem(child);
106
- })] })) })));
130
+ }))] })) })));
107
131
  };
108
132
  // 弹出菜单中的普通菜单项渲染
109
133
  var renderPopupMenuItem = function (item) {
@@ -14,6 +14,7 @@ interface IModalProps {
14
14
  closable?: boolean;
15
15
  okButtonProps?: Record<string, unknown>;
16
16
  cancelButtonProps?: Record<string, unknown>;
17
+ footer?: React.ReactNode;
17
18
  }
18
19
  interface ModalComponent extends FC<IModalProps> {
19
20
  confirm: (props: IModalProps & {
package/es/Modal/Modal.js CHANGED
@@ -8,7 +8,7 @@ import { Modal as Modal$1 } from './ModalTemp.js';
8
8
  import { Button } from '../Button/Button.js';
9
9
 
10
10
  var ModalContent = function (_a) {
11
- var title = _a.title, onCancel = _a.onCancel, _b = _a.onCancelText, onCancelText = _b === void 0 ? undefined : _b, onOk = _a.onOk, _c = _a.onOkText, onOkText = _c === void 0 ? undefined : _c, children = _a.children, _d = _a.width, width = _d === void 0 ? '400px' : _d, type = _a.type, _e = _a.closable, closable = _e === void 0 ? true : _e, okButtonProps = _a.okButtonProps, cancelButtonProps = _a.cancelButtonProps;
11
+ var title = _a.title, onCancel = _a.onCancel, _b = _a.onCancelText, onCancelText = _b === void 0 ? undefined : _b, onOk = _a.onOk, _c = _a.onOkText, onOkText = _c === void 0 ? undefined : _c, children = _a.children, _d = _a.width, width = _d === void 0 ? '400px' : _d, type = _a.type, _e = _a.closable, closable = _e === void 0 ? true : _e, okButtonProps = _a.okButtonProps, cancelButtonProps = _a.cancelButtonProps, footer = _a.footer;
12
12
  var _f = useState(false), loading = _f[0], setLoading = _f[1];
13
13
  var _g = useState(false), cancelLoading = _g[0], setCancelLoading = _g[1];
14
14
  var handleOk = function () { return __awaiter(void 0, void 0, void 0, function () {
@@ -54,15 +54,15 @@ var ModalContent = function (_a) {
54
54
  return (jsxs("div", __assign({ className: classNames('foxit-modal-content-container', type === 'success' ? 'foxit-modal-success' : ''), style: {
55
55
  maxWidth: "min(".concat(width, ", calc(100vw - 32px))"),
56
56
  width: width
57
- } }, { children: [jsxs("div", __assign({ className: "foxit-modal-head" }, { children: [jsx("div", __assign({ className: "foxit-modal-title" }, { children: title })), closable && (jsx("div", __assign({ onClick: onCancel, className: type === 'success' ? 'foxit-modal-success-icon' : 'foxit-modal-close-button' }, { children: type === 'success' ? (jsx(Icon, { name: "FireWorkColoursOutlined" })) : (jsx(Icon, { name: "CloseOutlined" })) })))] })), jsx("div", __assign({ className: "foxit-modal-children" }, { children: children })), jsxs("div", __assign({ className: "foxit-modal-footer" }, { children: [onCancelText && (jsx(Button, __assign({ size: "medium", onClick: handleCancel, loading: cancelLoading }, cancelButtonProps, { children: onCancelText }))), onOkText && (jsx(Button, __assign({ primary: true, size: "medium", onClick: handleOk, loading: loading }, okButtonProps, { children: onOkText })))] }))] })));
57
+ } }, { children: [jsxs("div", __assign({ className: "foxit-modal-head" }, { children: [jsx("div", __assign({ className: "foxit-modal-title" }, { children: title })), closable && (jsx("div", __assign({ onClick: onCancel, className: type === 'success' ? 'foxit-modal-success-icon' : 'foxit-modal-close-button' }, { children: type === 'success' ? (jsx(Icon, { name: "FireWorkColoursOutlined" })) : (jsx(Icon, { name: "CloseOutlined" })) })))] })), jsx("div", __assign({ className: "foxit-modal-children" }, { children: children })), footer && jsx("div", __assign({ className: "foxit-modal-footer" }, { children: footer })), !footer && (jsxs("div", __assign({ className: "foxit-modal-footer" }, { children: [onCancelText && (jsx(Button, __assign({ size: "medium", onClick: handleCancel, loading: cancelLoading }, cancelButtonProps, { children: onCancelText }))), onOkText && (jsx(Button, __assign({ primary: true, size: "medium", onClick: handleOk, loading: loading }, okButtonProps, { children: onOkText })))] })))] })));
58
58
  };
59
59
  var Modal = function (_a) {
60
- var title = _a.title, opened = _a.opened, onOk = _a.onOk, onOkText = _a.onOkText, onCancel = _a.onCancel, onCancelText = _a.onCancelText, maskClosable = _a.maskClosable, children = _a.children, width = _a.width, type = _a.type, closable = _a.closable, okButtonProps = _a.okButtonProps, cancelButtonProps = _a.cancelButtonProps;
61
- return (jsx(Modal$1, __assign({ opened: opened, onClose: onCancel || (function () { }), maskClosable: maskClosable, position: "top" }, { children: jsx(ModalContent, __assign({ title: title, width: width, onCancel: onCancel, onCancelText: onCancelText, onOk: onOk, onOkText: onOkText, type: type, closable: closable, okButtonProps: okButtonProps, cancelButtonProps: cancelButtonProps }, { children: children })) })));
60
+ var title = _a.title, opened = _a.opened, onOk = _a.onOk, onOkText = _a.onOkText, onCancel = _a.onCancel, onCancelText = _a.onCancelText, maskClosable = _a.maskClosable, children = _a.children, width = _a.width, type = _a.type, closable = _a.closable, okButtonProps = _a.okButtonProps, cancelButtonProps = _a.cancelButtonProps, footer = _a.footer;
61
+ return (jsx(Modal$1, __assign({ opened: opened, onClose: onCancel || (function () { }), maskClosable: maskClosable, position: "top" }, { children: jsx(ModalContent, __assign({ title: title, width: width, onCancel: onCancel, onCancelText: onCancelText, onOk: onOk, onOkText: onOkText, type: type, closable: closable, okButtonProps: okButtonProps, cancelButtonProps: cancelButtonProps, footer: footer }, { children: children })) })));
62
62
  };
63
63
  // 语法糖的调用方式
64
64
  Modal.confirm = function (_a) {
65
- var title = _a.title, onOk = _a.onOk, onCancel = _a.onCancel, onOkText = _a.onOkText, onCancelText = _a.onCancelText, _b = _a.maskClosable, maskClosable = _b === void 0 ? true : _b, content = _a.content, width = _a.width, closable = _a.closable, okButtonProps = _a.okButtonProps, cancelButtonProps = _a.cancelButtonProps;
65
+ var title = _a.title, onOk = _a.onOk, onCancel = _a.onCancel, onOkText = _a.onOkText, onCancelText = _a.onCancelText, _b = _a.maskClosable, maskClosable = _b === void 0 ? true : _b, content = _a.content, width = _a.width, closable = _a.closable, okButtonProps = _a.okButtonProps, cancelButtonProps = _a.cancelButtonProps, footer = _a.footer;
66
66
  var modalRoot = document.createElement('div');
67
67
  document.body.appendChild(modalRoot);
68
68
  var root = createRoot(modalRoot);
@@ -104,7 +104,7 @@ Modal.confirm = function (_a) {
104
104
  : function () {
105
105
  onOk === null || onOk === void 0 ? void 0 : onOk();
106
106
  handleClose();
107
- }, onOkText: onOkText, closable: closable, okButtonProps: okButtonProps, cancelButtonProps: cancelButtonProps }, { children: content })) })));
107
+ }, onOkText: onOkText, closable: closable, okButtonProps: okButtonProps, cancelButtonProps: cancelButtonProps, footer: footer }, { children: content })) })));
108
108
  };
109
109
 
110
110
  export { Modal };
@@ -26,6 +26,13 @@ var Quantity = function (_a) {
26
26
  setInternalValue(newValue);
27
27
  };
28
28
  var handleChange = function (e) {
29
+ var newValue = parseInt(e.target.value, 10) || 0;
30
+ if (onChange) {
31
+ onChange(newValue);
32
+ }
33
+ setInternalValue(newValue);
34
+ };
35
+ var handleBlur = function (e) {
29
36
  var newValue = parseInt(e.target.value, 10) || 0;
30
37
  if (min !== undefined && newValue < min) {
31
38
  newValue = min;
@@ -38,9 +45,14 @@ var Quantity = function (_a) {
38
45
  }
39
46
  setInternalValue(newValue);
40
47
  };
48
+ var handleKeyDown = function (e) {
49
+ if (e.key === 'Enter') {
50
+ handleBlur(e);
51
+ }
52
+ };
41
53
  return (jsxs("div", __assign({ className: classNames('foxit-quantity', className) }, { children: [jsx("button", __assign({ className: "foxit-quantity-button", onClick: handleDecrement, disabled: min !== undefined && currentValue <= min }, { children: jsx("div", { children: "-" }) })), jsx("input", __assign({
42
54
  // type="number"
43
- value: currentValue, onChange: handleChange, min: min, max: max, className: "foxit-quantity-number" }, props)), jsx("button", __assign({ className: "foxit-quantity-button", onClick: handleIncrement, disabled: max !== undefined && currentValue >= max }, { children: jsx("div", { children: "+" }) }))] })));
55
+ value: currentValue, onChange: handleChange, min: min, max: max, className: "foxit-quantity-number", onBlur: handleBlur, onKeyDown: handleKeyDown }, props)), jsx("button", __assign({ className: "foxit-quantity-button", onClick: handleIncrement, disabled: max !== undefined && currentValue >= max }, { children: jsx("div", { children: "+" }) }))] })));
44
56
  };
45
57
 
46
58
  export { Quantity };
@@ -1,8 +1,9 @@
1
1
  import React from 'react';
2
+ import './select.css';
2
3
  export interface SelectProps {
3
4
  options: {
4
5
  value: string | number;
5
- label: string;
6
+ label: string | React.ReactNode;
6
7
  }[];
7
8
  className?: string;
8
9
  defaultValue?: string | number | string[] | number[];
@@ -30,10 +30,7 @@ var Select = function (_a) {
30
30
  singleValue: function (styles) { return (__assign(__assign({}, styles), ((passStyles === null || passStyles === void 0 ? void 0 : passStyles.singleValue) || {}))); },
31
31
  input: function (styles) { return (__assign(__assign({}, styles), ((passStyles === null || passStyles === void 0 ? void 0 : passStyles.input) || {}))); }
32
32
  };
33
- var CustomControl = function (props) { return (jsxs(components.Control, __assign({}, props, { children: [preIcon && (jsx("div", __assign({ style: {
34
- display: 'flex',
35
- paddingLeft: 8,
36
- marginRight: -4,
33
+ var CustomControl = function (props) { return (jsxs(components.Control, __assign({}, props, { children: [preIcon && (jsx("div", __assign({ className: "foxit-select-custom-control", style: {
37
34
  color: props.hasValue ? '#525252' : '#B3B3B3'
38
35
  } }, { children: preIcon }))), props.children] }))); };
39
36
  var CustomOptionComp = function (props) { return (jsxs(components.Option, __assign({}, props, { children: [props.children, props.isSelected && jsx(Icon, { name: "CheckCircleOutlined" })] }))); };
@@ -41,14 +38,18 @@ var Select = function (_a) {
41
38
  var mobileRegex = /Android|webOS|iPhone|iPod|BlackBerry|IEMobile|Opera Mini/i;
42
39
  var padRegex = /iPad|Tablet|PlayBook|Silk|Kindle|Nexus 7|Nexus 10|SM-T|GT-P|TouchPad|Pad|HONOR|HDN/i;
43
40
  var isMobile = mobileRegex.test(userAgent) || padRegex.test(userAgent);
44
- return (jsx(ReactSelect, __assign({ menuPortalTarget: document.body, options: options, className: classNames('foxit-select-wrapper', className), placeholder: placeholder, styles: customStyles, defaultValue: isMulti
41
+ // 解决nextjs 服务端渲染document is not defined问题
42
+ var menuPortalTarget = typeof document !== 'undefined' ? document.body : null;
43
+ // console.log(menuPortalTarget);
44
+ return (jsx(ReactSelect, __assign({ menuPortalTarget: menuPortalTarget, options: options, className: classNames('foxit-select-wrapper', className), placeholder: placeholder, styles: customStyles, defaultValue: isMulti
45
45
  ? options.filter(function (option) {
46
46
  return Array.isArray(defaultValue) &&
47
47
  defaultValue.includes(option.value);
48
48
  })
49
49
  : options.find(function (option) { return option.value === defaultValue; }), isDisabled: isDisabled, isClearable: isClearable, isSearchable: isMobile ? false : isSearchable, isMulti: isMulti, components: { Control: CustomControl, Option: CustomOptionComp }, onChange: onChange, menuPosition: "fixed" }, rest, { value: isMulti && Array.isArray(value)
50
50
  ? value.map(function (v) { return options.find(function (option) { return option.value === v; }); })
51
- : options.find(function (option) { return option.value === value; }) || value })));
51
+ : options.find(function (option) { return option.value === value; }) ||
52
+ value })));
52
53
  };
53
54
 
54
55
  export { Select as default };
@@ -7,12 +7,21 @@ export interface Column<T> {
7
7
  align?: 'left' | 'center' | 'right';
8
8
  render?: (text: T[keyof T], record: T) => React.ReactNode;
9
9
  }
10
+ export interface RowSelection<T> {
11
+ selectedRowKeys?: React.Key[];
12
+ onChange?: (selectedRowKeys: React.Key[], selectedRows: T[]) => void;
13
+ getCheckboxProps?: (record: T) => {
14
+ disabled?: boolean;
15
+ };
16
+ }
10
17
  interface TableProps<T> {
11
18
  columns: Column<T>[];
12
19
  data: T[];
13
20
  loading?: boolean;
14
21
  emptyText?: React.ReactNode;
15
22
  mobile?: boolean;
23
+ rowSelection?: RowSelection<T>;
24
+ rowKey?: keyof T | ((record: T) => React.Key);
16
25
  }
17
- declare const Table: <T>({ columns, data, loading, emptyText, mobile }: TableProps<T>) => import("react/jsx-runtime").JSX.Element;
26
+ declare const Table: <T>({ columns, data, loading, emptyText, mobile, rowSelection, rowKey }: TableProps<T>) => import("react/jsx-runtime").JSX.Element;
18
27
  export default Table;
package/es/Table/Table.js CHANGED
@@ -2,9 +2,13 @@ import { __assign } from '../node_modules/tslib/tslib.es6.js';
2
2
  import { jsx, jsxs } from 'react/jsx-runtime';
3
3
  import Empty from '../Empty/Empty.js';
4
4
  import { Icon } from '../Icon/index.js';
5
+ import { getDirection } from '../utils.js';
6
+ import { useRowSelection } from './useRowSelection.js';
7
+ import Checkbox from '../Checkbox/Checkbox.js';
5
8
 
6
9
  var Table = function (_a) {
7
- var columns = _a.columns, data = _a.data, loading = _a.loading, emptyText = _a.emptyText, _b = _a.mobile, mobile = _b === void 0 ? false : _b;
10
+ var columns = _a.columns, data = _a.data, loading = _a.loading, emptyText = _a.emptyText, _b = _a.mobile, mobile = _b === void 0 ? false : _b, rowSelection = _a.rowSelection, _c = _a.rowKey, rowKey = _c === void 0 ? 'id' : _c;
11
+ var _d = useRowSelection({ data: data, rowSelection: rowSelection, rowKey: rowKey }), isAllSelected = _d.isAllSelected, isIndeterminate = _d.isIndeterminate, getRowKey = _d.getRowKey, handleRowSelect = _d.handleRowSelect, handleSelectAll = _d.handleSelectAll, shouldShowCheckbox = _d.shouldShowCheckbox, setHoveredRow = _d.setHoveredRow, isRowSelected = _d.isRowSelected;
8
12
  if (!loading && data.length === 0) {
9
13
  return jsx(Empty, { description: emptyText || 'No Data' });
10
14
  }
@@ -15,15 +19,36 @@ var Table = function (_a) {
15
19
  ? JSON.stringify(record[column.dataIndex])
16
20
  : String(record[column.dataIndex]) }))] }), colIndex)); }) }), rowIndex)); })] })));
17
21
  }
18
- return (jsxs("div", __assign({ className: "foxit-table" }, { children: [loading ? (jsx("div", __assign({ className: "foxit-table-loading" }, { children: jsx(Icon, { name: "LoadingOutlined", className: "foxit-table-icon-loading" }) }))) : null, jsxs("table", __assign({ className: "foxit-table-container" }, { children: [jsx("thead", { children: jsx("tr", { children: columns.map(function (column, index) { return (jsx("th", __assign({ style: {
19
- width: column.width ? "".concat(column.width, "px") : 'auto',
20
- textAlign: column.align || 'left'
21
- } }, { children: column.title }), index)); }) }) }), jsx("tbody", { children: data.map(function (record, rowIndex) { return (jsx("tr", __assign({ className: rowIndex % 2 === 0 ? 'foxit-even-row' : 'foxit-odd-row' }, { children: columns.map(function (column, colIndex) { return (jsx("td", __assign({ style: { textAlign: column.align || 'left' } }, { children: column.render
22
- ? column.render(record[column.dataIndex], record)
23
- : typeof record[column.dataIndex] === 'object'
24
- ? JSON.stringify(record[column.dataIndex]) // 将对象转换为字符串
25
- : String(record[column.dataIndex]) // 确保它是一个字符串
26
- }), colIndex)); }) }), rowIndex)); }) })] }))] })));
22
+ var handleColumnAlign = function (align) {
23
+ return getDirection() === 'rtl'
24
+ ? align === 'left'
25
+ ? 'right'
26
+ : align === 'right'
27
+ ? 'left'
28
+ : align
29
+ : align;
30
+ };
31
+ return (jsxs("div", __assign({ className: "foxit-table" }, { children: [loading ? (jsx("div", __assign({ className: "foxit-table-loading" }, { children: jsx(Icon, { name: "LoadingOutlined", className: "foxit-table-icon-loading" }) }))) : null, jsxs("table", __assign({ className: "foxit-table-container" }, { children: [jsx("thead", { children: jsxs("tr", __assign({ onMouseEnter: function () { return rowSelection && setHoveredRow('header'); }, onMouseLeave: function () { return setHoveredRow(null); } }, { children: [rowSelection && (jsx("th", __assign({ className: "foxit-table-checkbox" }, { children: jsx("div", __assign({ style: {
32
+ opacity: shouldShowCheckbox('header') ? 1 : 0,
33
+ transition: 'opacity 0.2s'
34
+ } }, { children: jsx(Checkbox, { size: "small", checked: isAllSelected, indeterminate: isIndeterminate, onChange: function (checked) { return handleSelectAll(checked); } }) })) }))), columns.map(function (column, index) { return (jsx("th", __assign({ style: {
35
+ width: column.width ? "".concat(column.width, "px") : 'auto',
36
+ textAlign: handleColumnAlign(column.align || 'left')
37
+ } }, { children: column.title }), index)); })] })) }), jsx("tbody", { children: data.map(function (record, rowIndex) {
38
+ var _a;
39
+ var key = getRowKey(record, rowIndex);
40
+ var isSelected = isRowSelected(record, rowIndex);
41
+ var checkboxProps = ((_a = rowSelection === null || rowSelection === void 0 ? void 0 : rowSelection.getCheckboxProps) === null || _a === void 0 ? void 0 : _a.call(rowSelection, record)) || {};
42
+ return (jsxs("tr", __assign({ className: rowIndex % 2 === 0 ? 'foxit-even-row' : 'foxit-odd-row', onMouseEnter: function () { return rowSelection && setHoveredRow(rowIndex); }, onMouseLeave: function () { return setHoveredRow(null); } }, { children: [rowSelection && (jsx("td", __assign({ className: "foxit-table-checkbox" }, { children: jsx("div", __assign({ style: {
43
+ opacity: shouldShowCheckbox(rowIndex) ? 1 : 0,
44
+ transition: 'opacity 0.2s'
45
+ } }, { children: jsx(Checkbox, { size: "small", checked: isSelected, onChange: function (checked) { return handleRowSelect(record, rowIndex, checked); }, disabled: checkboxProps.disabled }) })) }))), columns.map(function (column, colIndex) { return (jsx("td", __assign({ style: { textAlign: handleColumnAlign(column.align || 'left') } }, { children: column.render
46
+ ? column.render(record[column.dataIndex], record)
47
+ : typeof record[column.dataIndex] === 'object'
48
+ ? JSON.stringify(record[column.dataIndex]) // 将对象转换为字符串
49
+ : String(record[column.dataIndex]) // 确保它是一个字符串
50
+ }), colIndex)); })] }), key));
51
+ }) })] }))] })));
27
52
  };
28
53
 
29
54
  export { Table as default };
@@ -0,0 +1,22 @@
1
+ /// <reference types="react" />
2
+ import { RowSelection } from './Table';
3
+ interface UseRowSelectionOptions<T> {
4
+ data: T[];
5
+ rowSelection?: RowSelection<T>;
6
+ rowKey: keyof T | ((record: T) => React.Key);
7
+ }
8
+ interface UseRowSelectionReturn<T> {
9
+ selectedKeys: Set<React.Key>;
10
+ hoveredRow: number | 'header' | null;
11
+ hasSelection: boolean;
12
+ isAllSelected: boolean;
13
+ isIndeterminate: boolean;
14
+ getRowKey: (record: T, index: number) => React.Key;
15
+ handleRowSelect: (record: T, index: number, checked: boolean) => void;
16
+ handleSelectAll: (checked: boolean) => void;
17
+ shouldShowCheckbox: (rowIndex: number | 'header') => boolean;
18
+ setHoveredRow: (row: number | 'header' | null) => void;
19
+ isRowSelected: (record: T, index: number) => boolean;
20
+ }
21
+ export declare const useRowSelection: <T>({ data, rowSelection, rowKey }: UseRowSelectionOptions<T>) => UseRowSelectionReturn<T>;
22
+ export {};
@@ -0,0 +1,116 @@
1
+ import { useState, useEffect, useMemo } from 'react';
2
+
3
+ var useRowSelection = function (_a) {
4
+ var data = _a.data, rowSelection = _a.rowSelection, rowKey = _a.rowKey;
5
+ var _b = useState(new Set((rowSelection === null || rowSelection === void 0 ? void 0 : rowSelection.selectedRowKeys) || [])), selectedKeys = _b[0], setSelectedKeys = _b[1];
6
+ var _c = useState(new Map()), selectedRowsMap = _c[0], setSelectedRowsMap = _c[1];
7
+ var _d = useState(null), hoveredRow = _d[0], setHoveredRow = _d[1];
8
+ var hasSelection = selectedKeys.size > 0;
9
+ useEffect(function () {
10
+ if (rowSelection === null || rowSelection === void 0 ? void 0 : rowSelection.selectedRowKeys) {
11
+ var externalKeys_1 = new Set(rowSelection.selectedRowKeys);
12
+ var externalRowsMap = new Map(Array.from(selectedRowsMap.entries()).filter(function (_a) {
13
+ var key = _a[0];
14
+ return externalKeys_1.has(key);
15
+ }));
16
+ setSelectedKeys(externalKeys_1);
17
+ setSelectedRowsMap(externalRowsMap);
18
+ }
19
+ }, [JSON.stringify(rowSelection === null || rowSelection === void 0 ? void 0 : rowSelection.selectedRowKeys)]);
20
+ // 获取行的唯一 key
21
+ var getRowKey = function (record, index) {
22
+ var _a;
23
+ if (typeof rowKey === 'function') {
24
+ return rowKey(record);
25
+ }
26
+ return (_a = record[rowKey]) !== null && _a !== void 0 ? _a : index;
27
+ };
28
+ // 处理单行选择
29
+ var handleRowSelect = function (record, index, checked) {
30
+ var key = getRowKey(record, index);
31
+ var newSelectedKeys = new Set(selectedKeys);
32
+ var newSelectedRowsMap = new Map(selectedRowsMap);
33
+ if (checked) {
34
+ newSelectedKeys.add(key);
35
+ newSelectedRowsMap.set(key, record);
36
+ }
37
+ else {
38
+ newSelectedKeys.delete(key);
39
+ newSelectedRowsMap.delete(key);
40
+ }
41
+ setSelectedKeys(newSelectedKeys);
42
+ setSelectedRowsMap(newSelectedRowsMap);
43
+ if (rowSelection === null || rowSelection === void 0 ? void 0 : rowSelection.onChange) {
44
+ var selectedRows = Array.from(newSelectedRowsMap.values());
45
+ rowSelection.onChange(Array.from(newSelectedKeys), selectedRows);
46
+ }
47
+ };
48
+ // 处理全选
49
+ var handleSelectAll = function (checked) {
50
+ var newSelectedKeys = new Set(selectedKeys);
51
+ var newSelectedRowsMap = new Map(selectedRowsMap);
52
+ if (checked) {
53
+ data.forEach(function (record, index) {
54
+ var _a;
55
+ var checkboxProps = ((_a = rowSelection === null || rowSelection === void 0 ? void 0 : rowSelection.getCheckboxProps) === null || _a === void 0 ? void 0 : _a.call(rowSelection, record)) || {};
56
+ if (!checkboxProps.disabled) {
57
+ var key = getRowKey(record, index);
58
+ newSelectedKeys.add(key);
59
+ newSelectedRowsMap.set(key, record);
60
+ }
61
+ });
62
+ }
63
+ else {
64
+ data.forEach(function (record, index) {
65
+ var key = getRowKey(record, index);
66
+ newSelectedKeys.delete(key);
67
+ newSelectedRowsMap.delete(key);
68
+ });
69
+ }
70
+ setSelectedKeys(newSelectedKeys);
71
+ setSelectedRowsMap(newSelectedRowsMap);
72
+ if (rowSelection === null || rowSelection === void 0 ? void 0 : rowSelection.onChange) {
73
+ var selectedRows = Array.from(newSelectedRowsMap.values());
74
+ rowSelection.onChange(Array.from(newSelectedKeys), selectedRows);
75
+ }
76
+ };
77
+ // 判断是否全选
78
+ var isAllSelected = useMemo(function () {
79
+ if (data.length === 0)
80
+ return false;
81
+ var selectableData = data.filter(function (record) {
82
+ var _a;
83
+ var checkboxProps = ((_a = rowSelection === null || rowSelection === void 0 ? void 0 : rowSelection.getCheckboxProps) === null || _a === void 0 ? void 0 : _a.call(rowSelection, record)) || {};
84
+ return !checkboxProps.disabled;
85
+ });
86
+ return (selectableData.length > 0 &&
87
+ selectableData.every(function (record, index) { return selectedKeys.has(getRowKey(record, index)); }));
88
+ }, [data, selectedKeys, rowSelection]);
89
+ // 判断是否部分选中
90
+ var isIndeterminate = useMemo(function () {
91
+ return selectedKeys.size > 0 && !isAllSelected;
92
+ }, [selectedKeys.size, isAllSelected]);
93
+ // 判断复选框是否应该显示
94
+ var shouldShowCheckbox = function (rowIndex) {
95
+ return hasSelection || hoveredRow === rowIndex;
96
+ };
97
+ // 判断某行是否被选中
98
+ var isRowSelected = function (record, index) {
99
+ return selectedKeys.has(getRowKey(record, index));
100
+ };
101
+ return {
102
+ selectedKeys: selectedKeys,
103
+ hoveredRow: hoveredRow,
104
+ hasSelection: hasSelection,
105
+ isAllSelected: isAllSelected,
106
+ isIndeterminate: isIndeterminate,
107
+ getRowKey: getRowKey,
108
+ handleRowSelect: handleRowSelect,
109
+ handleSelectAll: handleSelectAll,
110
+ shouldShowCheckbox: shouldShowCheckbox,
111
+ setHoveredRow: setHoveredRow,
112
+ isRowSelected: isRowSelected
113
+ };
114
+ };
115
+
116
+ export { useRowSelection };
package/es/Tabs/Tabs.d.ts CHANGED
@@ -11,6 +11,7 @@ interface ButtonTabsProps {
11
11
  onChange?: (key: string) => void;
12
12
  type?: 'button' | 'link';
13
13
  className?: string;
14
+ destroyOnHidden?: boolean;
14
15
  }
15
16
  declare const ButtonTabs: React.FC<ButtonTabsProps>;
16
17
  export default ButtonTabs;
package/es/Tabs/Tabs.js CHANGED
@@ -5,9 +5,9 @@ import classNames from 'classnames';
5
5
 
6
6
  var ButtonTabs = function (_a) {
7
7
  var _b;
8
- var activeKey = _a.activeKey, items = _a.items, onChange = _a.onChange, _c = _a.type, type = _c === void 0 ? 'button' : _c, className = _a.className;
9
- var _d = useState(activeKey || ((_b = items[0]) === null || _b === void 0 ? void 0 : _b.key)), internalActiveKey = _d[0], setInternalActiveKey = _d[1];
10
- var _e = useState(false), showScrollButtons = _e[0], setShowScrollButtons = _e[1];
8
+ var activeKey = _a.activeKey, items = _a.items, onChange = _a.onChange, _c = _a.type, type = _c === void 0 ? 'button' : _c, className = _a.className, _d = _a.destroyOnHidden, destroyOnHidden = _d === void 0 ? true : _d;
9
+ var _e = useState(activeKey || ((_b = items[0]) === null || _b === void 0 ? void 0 : _b.key)), internalActiveKey = _e[0], setInternalActiveKey = _e[1];
10
+ var _f = useState(false), showScrollButtons = _f[0], setShowScrollButtons = _f[1];
11
11
  var tabListRef = useRef(null);
12
12
  var handleTabChange = function (key) {
13
13
  if (onChange) {
@@ -37,7 +37,9 @@ var ButtonTabs = function (_a) {
37
37
  };
38
38
  }, [items]);
39
39
  var currentKey = activeKey || internalActiveKey;
40
- return (jsxs("div", { children: [type === 'button' ? (jsx("div", __assign({ className: "foxit-tabs" }, { children: items.map(function (item) { return (jsx("button", __assign({ className: "foxit-tab-item ".concat(currentKey === item.key ? 'active' : ''), onClick: function () { return handleTabChange(item.key); } }, { children: item.label }), item.key)); }) }))) : (jsx("div", __assign({ className: "foxit-linktabs" }, { children: jsxs("div", __assign({ className: "foxit-linktabs-inner" }, { children: [showScrollButtons && (jsx("button", __assign({ className: "foxit-linktabs-scroll foxit-linktabs-scroll-left", onClick: function () { return handleScroll('left'); } }, { children: '<' }))), jsx("div", __assign({ ref: tabListRef, className: classNames('foxit-linktabs-list', className) }, { children: items.map(function (item) { return (jsx("button", __assign({ className: "foxit-linktab-btn".concat(currentKey === item.key ? ' active' : ''), onClick: function () { return handleTabChange(item.key); } }, { children: item.label }), item.key)); }) })), showScrollButtons && (jsx("button", __assign({ className: "foxit-linktabs-scroll foxit-linktabs-scroll-right", onClick: function () { return handleScroll('right'); } }, { children: '>' })))] })) }))), jsx("div", __assign({ className: "foxit-tab-content" }, { children: items.map(function (item) { return item.key === currentKey && jsx("div", { children: item.children }, item.key); }) }))] }));
40
+ return (jsxs("div", { children: [type === 'button' ? (jsx("div", __assign({ className: "foxit-tabs" }, { children: items.map(function (item) { return (jsx("button", __assign({ className: "foxit-tab-item ".concat(currentKey === item.key ? 'active' : ''), onClick: function () { return handleTabChange(item.key); } }, { children: item.label }), item.key)); }) }))) : (jsx("div", __assign({ className: "foxit-linktabs" }, { children: jsxs("div", __assign({ className: "foxit-linktabs-inner" }, { children: [showScrollButtons && (jsx("button", __assign({ className: "foxit-linktabs-scroll foxit-linktabs-scroll-left", onClick: function () { return handleScroll('left'); } }, { children: '<' }))), jsx("div", __assign({ ref: tabListRef, className: classNames('foxit-linktabs-list', className) }, { children: items.map(function (item) { return (jsx("button", __assign({ className: "foxit-linktab-btn".concat(currentKey === item.key ? ' active' : ''), onClick: function () { return handleTabChange(item.key); } }, { children: item.label }), item.key)); }) })), showScrollButtons && (jsx("button", __assign({ className: "foxit-linktabs-scroll foxit-linktabs-scroll-right", onClick: function () { return handleScroll('right'); } }, { children: '>' })))] })) }))), jsx("div", __assign({ className: "foxit-tab-content" }, { children: destroyOnHidden
41
+ ? items.map(function (item) { return item.key === currentKey && jsx("div", { children: item.children }, item.key); })
42
+ : items.map(function (item) { return (jsx("div", __assign({ style: { display: item.key === currentKey ? 'block' : 'none' } }, { children: item.children }), item.key)); }) }))] }));
41
43
  };
42
44
 
43
45
  export { ButtonTabs as default };
@@ -1,10 +1,12 @@
1
1
  import React, { ReactNode } from 'react';
2
2
  import './tooltip.css';
3
+ type PlacementType = 'top' | 'bottom' | 'left' | 'right';
3
4
  interface TooltipProps {
4
5
  title: string | ReactNode;
5
6
  children: ReactNode;
6
7
  whiteGround?: boolean;
7
8
  className?: string;
9
+ placement?: PlacementType;
8
10
  }
9
11
  declare const Tooltip: React.FC<TooltipProps>;
10
12
  export default Tooltip;
@@ -3,40 +3,143 @@ import { jsxs, Fragment, jsx } from 'react/jsx-runtime';
3
3
  import { useRef, useState, useEffect } from 'react';
4
4
  import ReactDOM from 'react-dom';
5
5
  import classNames from 'classnames';
6
+ import { getDirection } from '../utils.js';
6
7
 
7
8
  var Tooltip = function (_a) {
8
- var title = _a.title, children = _a.children, _b = _a.whiteGround, whiteGround = _b === void 0 ? false : _b, className = _a.className;
9
+ var title = _a.title, children = _a.children, _b = _a.whiteGround, whiteGround = _b === void 0 ? false : _b, className = _a.className, _c = _a.placement, placement = _c === void 0 ? 'top' : _c;
9
10
  var childRef = useRef(null);
10
11
  var tooltipRef = useRef(null);
11
- var _c = useState({ visibility: 'hidden', position: 'absolute', top: '0', left: '0' }), tooltipStyle = _c[0], setTooltipStyle = _c[1];
12
+ var _d = useState({
13
+ visibility: 'hidden',
14
+ position: 'absolute',
15
+ top: '0',
16
+ left: '0'
17
+ }), tooltipStyle = _d[0], setTooltipStyle = _d[1];
18
+ var _e = useState({
19
+ visibility: 'hidden'
20
+ }), bridgeStyle = _e[0], setBridgeStyle = _e[1];
12
21
  var isVisibleRef = useRef(false);
13
- var _d = useState('50%'), arrowLeft = _d[0], setArrowLeft = _d[1];
22
+ var _f = useState({}), arrowPosition = _f[0], setArrowPosition = _f[1];
23
+ var _g = useState(false), mounted = _g[0], setMounted = _g[1];
14
24
  var calculateTooltipPosition = function () {
15
25
  if (childRef.current && tooltipRef.current && isVisibleRef.current) {
16
- var childRect = childRef.current.getBoundingClientRect();
17
- var tooltipHeight = tooltipRef.current.offsetHeight;
18
- var tooltipWidth = tooltipRef.current.offsetWidth;
19
- var top_1 = window.scrollY + childRect.top - tooltipHeight - 4; // 计算绝对位置,考虑页面滚动
20
- var left = window.scrollX + childRect.left + childRect.width / 2 - tooltipWidth / 2;
21
- var padding = 8; // 屏幕边缘留点空隙
22
- var maxLeft = window.scrollX + document.documentElement.clientWidth - tooltipWidth - padding;
23
- var minLeft = window.scrollX + padding;
24
- if (left < minLeft)
25
- left = minLeft;
26
- if (left > maxLeft)
27
- left = maxLeft;
28
- // 箭头的 left 计算
29
- var childCenter = childRect.left + childRect.width / 2;
30
- var arrowLeftPx = childCenter - left;
31
- // 限制箭头不超出 tooltip 边界
32
- arrowLeftPx = Math.max(12, Math.min(tooltipWidth - 12, arrowLeftPx));
33
- setArrowLeft("".concat(arrowLeftPx, "px"));
26
+ var childRect_1 = childRef.current.getBoundingClientRect();
27
+ var tooltipHeight_1 = tooltipRef.current.offsetHeight;
28
+ var tooltipWidth_1 = tooltipRef.current.offsetWidth;
29
+ var padding_1 = 8; // 屏幕边缘留点空隙
30
+ var gap = 8; // tooltip child 之间的间距
31
+ // 辅助函数:限制水平位置不超出屏幕
32
+ var clampLeft = function (left) {
33
+ var maxLeft = window.scrollX + document.documentElement.clientWidth - tooltipWidth_1 - padding_1;
34
+ var minLeft = window.scrollX + padding_1;
35
+ return Math.max(minLeft, Math.min(maxLeft, left));
36
+ };
37
+ // 辅助函数:限制垂直位置不超出屏幕
38
+ var clampTop = function (top) {
39
+ var maxTop = window.scrollY + document.documentElement.clientHeight - tooltipHeight_1 - padding_1;
40
+ var minTop = window.scrollY + padding_1;
41
+ return Math.max(minTop, Math.min(maxTop, top));
42
+ };
43
+ // 辅助函数:计算水平方向箭头位置
44
+ var calcHorizontalArrow = function (left, isTop) {
45
+ var _a;
46
+ var childCenterX = childRect_1.left + childRect_1.width / 2;
47
+ var arrowLeftPx = Math.max(12, Math.min(tooltipWidth_1 - 12, childCenterX - left));
48
+ return _a = {
49
+ left: getDirection() === 'rtl' ? "calc(".concat(arrowLeftPx, "px - 10px)") : "".concat(arrowLeftPx, "px")
50
+ },
51
+ _a[isTop ? 'bottom' : 'top'] = '-5px',
52
+ _a.transform = 'translateX(-50%)',
53
+ _a;
54
+ };
55
+ // 辅助函数:计算垂直方向箭头位置
56
+ var calcVerticalArrow = function (top, isLeft) {
57
+ var _a;
58
+ var childCenterY = childRect_1.top + childRect_1.height / 2;
59
+ // 将绝对坐标 top 转换为视口坐标
60
+ var arrowTopPx = Math.max(12, Math.min(tooltipHeight_1 - 12, childCenterY - (top - window.scrollY)));
61
+ return _a = {
62
+ top: "".concat(arrowTopPx, "px")
63
+ },
64
+ _a[isLeft ? 'right' : 'left'] = '-5px',
65
+ _a.transform = 'translateY(-50%)',
66
+ _a;
67
+ };
68
+ var top_1 = 0;
69
+ var left = 0;
70
+ var arrowStyle = {};
71
+ var bridgeTop = 0;
72
+ var bridgeLeft = 0;
73
+ var bridgeWidth = 0;
74
+ var bridgeHeight = 0;
75
+ switch (placement) {
76
+ case 'top': {
77
+ top_1 = window.scrollY + childRect_1.top - tooltipHeight_1 - gap;
78
+ left = clampLeft(window.scrollX + childRect_1.left + childRect_1.width / 2 - tooltipWidth_1 / 2);
79
+ arrowStyle = calcHorizontalArrow(left, true);
80
+ // 桥接区域:从 tooltip 底部到 child 顶部
81
+ var bridgeLeftStart = Math.min(left, window.scrollX + childRect_1.left);
82
+ var bridgeRightEnd = Math.max(left + tooltipWidth_1, window.scrollX + childRect_1.right);
83
+ bridgeTop = top_1 + tooltipHeight_1;
84
+ bridgeLeft = bridgeLeftStart;
85
+ bridgeWidth = bridgeRightEnd - bridgeLeftStart;
86
+ bridgeHeight = gap + 5;
87
+ break;
88
+ }
89
+ case 'bottom': {
90
+ top_1 = window.scrollY + childRect_1.bottom + gap;
91
+ left = clampLeft(window.scrollX + childRect_1.left + childRect_1.width / 2 - tooltipWidth_1 / 2);
92
+ arrowStyle = calcHorizontalArrow(left, false);
93
+ // 桥接区域:从 child 底部到 tooltip 顶部
94
+ var bridgeLeftStart = Math.min(left, window.scrollX + childRect_1.left);
95
+ var bridgeRightEnd = Math.max(left + tooltipWidth_1, window.scrollX + childRect_1.right);
96
+ bridgeTop = window.scrollY + childRect_1.bottom;
97
+ bridgeLeft = bridgeLeftStart;
98
+ bridgeWidth = bridgeRightEnd - bridgeLeftStart;
99
+ bridgeHeight = gap + 5;
100
+ break;
101
+ }
102
+ case 'left': {
103
+ top_1 = clampTop(window.scrollY + childRect_1.top + childRect_1.height / 2 - tooltipHeight_1 / 2);
104
+ left = window.scrollX + childRect_1.left - tooltipWidth_1 - gap;
105
+ arrowStyle = calcVerticalArrow(top_1, true);
106
+ // 桥接区域:从 tooltip 右侧到 child 左侧
107
+ var bridgeTopStart = Math.min(top_1, window.scrollY + childRect_1.top);
108
+ var bridgeBottomEnd = Math.max(top_1 + tooltipHeight_1, window.scrollY + childRect_1.bottom);
109
+ bridgeTop = bridgeTopStart;
110
+ bridgeLeft = left + tooltipWidth_1;
111
+ bridgeWidth = gap + 5;
112
+ bridgeHeight = bridgeBottomEnd - bridgeTopStart;
113
+ break;
114
+ }
115
+ case 'right': {
116
+ top_1 = clampTop(window.scrollY + childRect_1.top + childRect_1.height / 2 - tooltipHeight_1 / 2);
117
+ left = window.scrollX + childRect_1.right + gap;
118
+ arrowStyle = calcVerticalArrow(top_1, false);
119
+ // 桥接区域:从 child 右侧到 tooltip 左侧
120
+ var bridgeTopStart = Math.min(top_1, window.scrollY + childRect_1.top);
121
+ var bridgeBottomEnd = Math.max(top_1 + tooltipHeight_1, window.scrollY + childRect_1.bottom);
122
+ bridgeTop = bridgeTopStart;
123
+ bridgeLeft = window.scrollX + childRect_1.right;
124
+ bridgeWidth = gap + 5;
125
+ bridgeHeight = bridgeBottomEnd - bridgeTopStart;
126
+ break;
127
+ }
128
+ }
129
+ setArrowPosition(arrowStyle);
34
130
  setTooltipStyle({
35
131
  position: 'absolute',
36
132
  top: "".concat(top_1, "px"),
37
133
  left: "".concat(left, "px"),
38
134
  visibility: 'visible',
39
- zIndex: 9999 // 确保层级足够高
135
+ zIndex: 9999
136
+ });
137
+ setBridgeStyle({
138
+ top: "".concat(bridgeTop, "px"),
139
+ left: "".concat(bridgeLeft, "px"),
140
+ width: "".concat(bridgeWidth, "px"),
141
+ height: "".concat(bridgeHeight, "px"),
142
+ visibility: 'visible'
40
143
  });
41
144
  }
42
145
  };
@@ -49,20 +152,24 @@ var Tooltip = function (_a) {
49
152
  var handleMouseLeave = function () {
50
153
  isVisibleRef.current = false;
51
154
  setTooltipStyle(function (prev) { return (__assign(__assign({}, prev), { visibility: 'hidden' })); });
155
+ setBridgeStyle(function (prev) { return (__assign(__assign({}, prev), { visibility: 'hidden' })); });
52
156
  window.removeEventListener('scroll', calculateTooltipPosition); // 移除滚动事件监听
53
157
  window.removeEventListener('resize', calculateTooltipPosition); // 移除窗口大小变化监听
54
158
  };
55
159
  useEffect(function () {
160
+ setMounted(true);
56
161
  return function () {
57
162
  // 清理事件监听器,防止内存泄漏
58
163
  window.removeEventListener('scroll', calculateTooltipPosition);
59
164
  window.removeEventListener('resize', calculateTooltipPosition);
60
165
  };
61
166
  }, []);
62
- return (jsxs(Fragment, { children: [jsx("div", __assign({ className: "foxit-tooltip-container", onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, ref: childRef }, { children: children })), ReactDOM.createPortal(jsxs("div", __assign({ onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, className: classNames("foxit-tooltip-content", {
63
- 'foxit-tooltip-white': whiteGround
64
- }, className), style: tooltipStyle, ref: tooltipRef }, { children: [title, jsx("div", { className: "foxit-tooltip-arrow", style: { left: arrowLeft } })] })), document.body // 直接挂载到 body,避免层叠上下文限制
65
- )] }));
167
+ return (jsxs(Fragment, { children: [jsx("div", __assign({ className: "foxit-tooltip-container", onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, ref: childRef }, { children: children })), mounted &&
168
+ title &&
169
+ ReactDOM.createPortal(jsxs(Fragment, { children: [jsx("div", { className: "foxit-tooltip-bridge", onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, style: bridgeStyle }), jsxs("div", __assign({ onMouseEnter: handleMouseEnter, onMouseLeave: handleMouseLeave, className: classNames('foxit-tooltip-content', "foxit-tooltip-placement-".concat(placement), {
170
+ 'foxit-tooltip-white': whiteGround
171
+ }, className), style: tooltipStyle, ref: tooltipRef }, { children: [title, jsx("div", { className: classNames('foxit-tooltip-arrow', "foxit-tooltip-arrow-".concat(placement)), style: arrowPosition })] }))] }), document.body // 直接挂载到 body,避免层叠上下文限制
172
+ )] }));
66
173
  };
67
174
 
68
175
  export { Tooltip as default };
package/es/index.css CHANGED
@@ -1 +1 @@
1
- .foxit-checkbox-container{cursor:pointer;display:inline-block;padding-left:25px;position:relative;-webkit-user-select:none;user-select:none}.foxit-checkbox-container input{cursor:pointer;opacity:0;position:absolute}.foxit-checkbox-checkmark{background-color:#fff;border:1px solid #b3b3b3;border-radius:4px;height:20px;left:0;position:absolute;top:0;width:20px}.foxit-checkbox-content{line-height:20px}.foxit-checkbox-container input:checked~.foxit-checkbox-checkmark{background-color:#ff5f00;border:none}.foxit-checkbox-checkmark:after{content:"";display:none;position:absolute}.foxit-checkbox-container input:checked~.foxit-checkbox-checkmark:after{display:block}.foxit-checkbox-container .foxit-checkbox-checkmark:after{border:solid #fff;border-width:0 2px 2px 0;height:10px;left:7px;top:4px;transform:rotate(45deg);width:6px}.foxit-checkbox-container.disabled{color:#00000040;cursor:not-allowed;opacity:.6}.foxit-checkbox-checkmark.disabled{background-color:#f5f5f5;border:1px solid #d9d9d9}.foxit-empty{align-items:center;display:flex;flex-direction:column;justify-content:center;padding:20px;text-align:center}.foxit-empty-image{margin-bottom:16px}.foxit-empty-description{color:#757575;font-size:14px}.foxit-form-item{margin-bottom:24px}.foxit-form-item label{color:#525252;display:block;font-size:14px;font-weight:500;margin-bottom:8px}.foxit-form-item-embedlabel{background-color:#fff;display:inline-block!important;margin-left:4px;padding:0 4px;position:relative;top:18px;z-index:1}.foxit-form-required{color:#e22727}.foxit-form-error-text,.foxit-form-warning-text{font-size:12px;line-height:24px;min-height:24px}.foxit-form-error-text{color:#e22727}.foxit-form-warning-text{color:orange}.foxit-form-item>.foxit-form-error-component .foxit-checkbox-container,.foxit-form-item>.foxit-form-error-component .foxit-input-wrapper,.foxit-form-item>.foxit-form-error-component .foxit-radio-container,.foxit-form-item>.foxit-form-error-component .foxit-select-wrapper>:nth-child(3){border:1px solid #e22727!important}.foxit-form-item>.foxit-form-warning-component .foxit-checkbox-container,.foxit-form-item>.foxit-form-warning-component .foxit-input-wrapper,.foxit-form-item>.foxit-form-warning-component .foxit-radio-container,.foxit-form-item>.foxit-form-warning-component .foxit-select-wrapper>:nth-child(3){border-color:orange!important}.foxit-input-wrapper{align-items:center;border:1px solid #d9d9d9;border-radius:10px;display:flex;font-size:14px;font-weight:400;padding:11px 16px;transition:border-color .3s}.foxit-input-wrapper:focus-within{border-color:#ff5f00!important}.foxit-input-wrapper:hover{border-color:#757575}.foxit-input-element{border:none;color:#525252;flex:1;line-height:24px;outline:none!important}.foxit-input-element::placeholder{color:#b3b3b3}.foxit-input-addon{align-items:center;color:#b3b3b3;cursor:pointer;display:flex;padding:0 0 0 8px;transition:color .3s}.foxit-input-addon-before{padding:0 8px 0 0}.foxit-input-wrapper:focus-within .foxit-input-addon{color:#ff5f00!important}.foxit-input-wrapper:hover .foxit-input-addon{color:#757575}.foxit-input-wrapper :disabled,.foxit-input-wrapper-disabled{background-color:#f8f8f8}.foxit-input-wrapper-disabled:hover{border-color:#d9d9d9}.foxit-input-wrapper-disabled .foxit-input-element{color:#b3b3b3}.foxit-pagination-container{align-items:center;display:flex;justify-content:center}.foxit-pagination-button,.foxit-pagination-next,.foxit-pagination-prev{background-color:initial;border:none;border-radius:10px;color:#757575;cursor:pointer;font-size:16px;font-weight:500;height:48px;margin:0 4px;min-width:48px;padding:0 12px;transition:background-color .3s ease,color .3s ease}.foxit-pagination-next:hover,.foxit-pagination-prev:hover{color:#ff5f00}.foxit-pagination-button:hover{background-color:#ff5f001a}.foxit-pagination-button:disabled{background-color:#ff5f00;color:#fff;cursor:default}.foxit-pagination-mobile-container{display:flex;justify-content:center;margin:16px 0}.foxit-pagination-mobile-next,.foxit-pagination-mobile-prev{height:36px;margin:0 8px;min-width:40px}.foxit-pagination-mobile-info{font-size:16px;min-width:48px}.foxit-button,.foxit-pagination-mobile-info{align-items:center;display:flex;justify-content:center}.foxit-button{border:0;border-radius:10px;cursor:pointer;font-size:14px;font-weight:600;letter-spacing:.42px}.foxit-button-circle{aspect-ratio:1;border-radius:50%!important;padding:0!important;width:auto}.foxit-button:disabled{cursor:not-allowed;opacity:.5;pointer-events:none}.foxit-button:hover{opacity:.8}.foxit-button-primary{background-color:#ff5f00;color:#fff}.foxit-button-secondary{background-color:#fff;border:1px solid #ff5f00;color:#ff5f00}.foxit-button-small{border-radius:5px;min-height:38px;padding:8px 24px}.foxit-button-small svg{height:16px;width:16px}.foxit-button-small.foxit-button-circle{height:38px;width:38px}.foxit-button-medium{border-radius:5px;min-height:44px;padding:11px 32px}.foxit-button-medium svg{height:20px;width:20px}.foxit-button-medium.foxit-button-circle{height:44px;width:44px}.foxit-button-large{min-height:56px;padding:16px 32px}.foxit-button-large.foxit-button-circle{height:56px;width:56px}.foxit-button-prevent-click{pointer-events:none}.foxit-button-loading{animation:spin 1s linear infinite;margin-right:8px}.foxit-button-primary .foxit-button-loading{color:#fff}.foxit-button-secondary .foxit-button-loading{color:#ff5f00}.foxit-radio-container{cursor:pointer;display:inline-block;padding-left:25px;position:relative;-webkit-user-select:none;user-select:none}.foxit-radio-container input{cursor:pointer;opacity:0;position:absolute}.foxit-radio-checkmark{background-color:#fff;border:1px solid #b3b3b3;border-radius:50%;height:20px;left:0;position:absolute;top:0;width:20px}.foxit-radio-content{line-height:20px}.foxit-radio-container input:checked~.foxit-radio-checkmark{background-color:#fff;border:1px solid #ff5f00}.foxit-radio-checkmark:after{content:"";display:none;position:absolute}.foxit-radio-container input:checked~.foxit-radio-checkmark:after{display:block}.foxit-radio-container .foxit-radio-checkmark:after{background:#ff5f00;border-radius:50%;height:10px;left:4px;top:4px;width:10px}.foxit-radio-container.disabled{cursor:not-allowed;opacity:.6}.foxit-table{border:1px solid #ff5f00;border-radius:10px;color:#373737;min-height:200px;overflow:hidden;position:relative}.foxit-table-loading{align-items:center;background-color:#ffffffb3;display:flex;height:100%;justify-content:center;left:0;position:absolute;top:0;width:100%;z-index:5}.foxit-table-icon-loading{animation:spin 1s linear infinite;color:#ff5f00}.foxit-table-container{border-collapse:collapse;min-width:100%;table-layout:fixed;width:auto}.foxit-table-container td,.foxit-table-container th{word-wrap:break-word;height:70px;min-height:70px;padding:24px;white-space:pre-wrap}.foxit-table-container th{background-color:#fff6f0;font-size:16px;font-weight:700}.foxit-table-container td{font-size:14px;font-weight:400}.foxit-table-container .foxit-even-row{background-color:#fff}.foxit-table-container .foxit-odd-row{background-color:#fff6f0}.foxit-table-mobile-list{display:flex;flex-direction:column;gap:16px}.foxit-table-mobile-card{background:#f8f8f8;border-radius:10px;display:flex;flex-direction:column;gap:12px;padding:32px}.foxit-table-mobile-row{align-items:flex-start;display:flex;flex-direction:row;justify-content:space-between}.foxit-table-mobile-row:not(:last-child){border-bottom:1px solid #efefef;padding-bottom:12px}.foxit-table-mobile-label{font-size:16px;font-weight:700;margin-right:16px;max-width:50%}.foxit-table-mobile-label,.foxit-table-mobile-value{word-wrap:break-word;color:#373737;white-space:pre-wrap}.foxit-table-mobile-value{flex:1 1 0;font-size:14px;font-weight:400;text-align:right}.foxit-table-mobile-loading{align-items:center;background:#0000;display:flex;justify-content:center;padding:24px 0;width:100%}.foxit-tabs{display:flex;flex-wrap:wrap;gap:8px}.foxit-tab-item{background-color:#f1f3f4;border:none;border-radius:10px;color:#757575;cursor:pointer;font-size:14px;font-weight:600;padding:14px 20px;transition:background-color .3s,color .3s}.foxit-tab-item.active{background-color:#ff5f00;color:#fff}.foxit-tab-item:hover:not(.active){background-color:#e0e0e0}.foxit-tab-content{margin-top:16px}.foxit-linktabs{width:100%}.foxit-linktabs-inner{margin-left:auto;margin-right:auto;position:relative}.foxit-linktabs-scroll{background:#fff;border:none;padding:8px;position:absolute;top:6px;z-index:10}.foxit-linktabs-scroll:hover{color:#ff5f00;cursor:pointer}.foxit-linktabs-scroll-left{left:-24px}.foxit-linktabs-scroll-right{right:-24px}.foxit-linktabs-list{-ms-overflow-style:none;border-bottom:1px solid #f1f3f4;display:flex;overflow-x:auto;scrollbar-width:none;text-align:center;white-space:nowrap;width:100%}.foxit-linktabs-list::-webkit-scrollbar{display:none}.foxit-linktab-btn{background:none;border:none;color:#b3b3b3;cursor:pointer;display:inline-block;font-size:14px;font-weight:600;outline:none;padding:12px;transition:border-color .2s,color .2s}.foxit-linktab-btn.active{border-bottom:2px solid #ff5f00;color:#ff5f00}.foxit-tag{border-radius:5px;display:inline-block;font-size:12px;font-weight:600;min-height:24px;padding:4px 8px}.foxit-tag-active{background-color:#edfafa;color:#0f8b8d}.foxit-tag-canceled{background-color:#ffecec;color:#e22727}.foxit-tag-pending{background-color:#fbf4d0;color:#9b8827}.foxit-tag-offline{background-color:#edecff;color:#6462c6}.foxit-tag-trial{background-color:#e4f4fe;color:#2288ce}.foxit-tag-expired{background-color:#ececec;color:#757575}.foxit-tag-completed{background-color:#edfafa;color:#0f8b8d}.foxit-toast-container{left:50%;pointer-events:none;position:fixed;top:0;transform:translateX(-50%);transition-delay:0s;transition-duration:.5s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);width:100%;z-index:2000}.foxit-toast-loading{animation:spin 1s linear infinite;color:#ff5f00}.foxit-toast-loading-overlay{background-color:#000;height:100vh;inset:0;opacity:.15;pointer-events:auto;position:fixed;z-index:10}.foxit-toast-item{align-items:center;background-color:#fff;border:none;border-radius:50px;color:#525252;display:flex;flex-direction:row;gap:8px;justify-content:center;margin-bottom:16px;margin-left:auto;margin-right:auto;padding:9px 12px;position:relative;top:102px;transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);width:fit-content;z-index:20}.foxit-toast-item-success{background-color:#ddfae8;color:#1f7f40}.foxit-toast-item-error{background-color:#fae5dd;color:#e22727}.foxit-toast-item-warning{background-color:#fff0e7;color:#525252}.foxit-toast-enter{opacity:0;transform:translateY(-100%)}.foxit-toast-enter-active{transition:all .5s ease-out}.foxit-toast-enter-active,.foxit-toast-exit{opacity:1;transform:translateY(0)}.foxit-toast-exit-active{opacity:0;transform:translateY(-100%);transition:all .5s ease-in}.foxit-tooltip-container{display:inline-block;position:relative;width:auto}.foxit-tooltip-content{background-color:#525252;border-radius:10px;color:#fff;max-width:100%;min-width:100px;padding:12px 16px;position:absolute;width:300px;z-index:1}.foxit-tooltip-white{background-color:#fff;border:1px solid #e0e0e0;box-shadow:0 2px 4px #0000001a;color:#525252}.foxit-tooltip-arrow{border-left:5px solid #0000;border-right:5px solid #0000;border-top:5px solid #525252;bottom:-5px;height:0;position:absolute;transform:translateX(-50%);width:0}.foxit-tooltip-white .foxit-tooltip-arrow{border-top-color:#e0e0e0}.foxit-tooltip-white .foxit-tooltip-arrow:after{border-left:5px solid #0000;border-right:5px solid #0000;border-top:5px solid #fff;content:"";left:-5px;position:absolute;top:-6px}.foxit-menu{border-radius:10px;font-size:14px;overflow:hidden}.foxit-menu-item-content{align-items:center;cursor:pointer;display:flex;padding:12px 16px}.foxit-menu-item{padding-left:0}.foxit-menu-item.selected{background-color:#fff6f0!important;border-radius:10px;color:#ff5f00;font-weight:600}.foxit-menu-item:hover{background-color:#f5f6f8;border-radius:10px}.foxit-menu-submenu-title{align-items:center;cursor:pointer;display:flex;justify-content:space-between;padding:12px 16px}.foxit-menu-submenu-title:hover{background-color:#f5f6f8;border-radius:10px}.foxit-menu-icon{transition:transform .3s ease-in-out}.foxit-menu-rotated-icon{transform:rotate(180deg)}.foxit-menu-item-label{font-weight:600}.foxit-menu-collapsed{transition:width .2s;width:50px!important}.foxit-menu-item-icon{align-items:center;display:inline-flex;margin-right:8px}.foxit-menu-item-icon-collapsed{font-size:16px;margin-right:0}.foxit-menu-collapsed .foxit-menu-item-content,.foxit-menu-collapsed .foxit-menu-submenu-title{align-items:center;display:flex;justify-content:center;padding:12px}.foxit-menu-collapsed-item{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.foxit-menu-popup{background-color:#fff;border-radius:10px;box-shadow:0 3px 6px #0000001f,0 1px 3px #00000014;min-width:200px;padding:5px 0}.foxit-menu-popup-content{width:100%}.foxit-menu-popup-title{align-items:center;border-bottom:1px solid #f0f0f0;color:#333;display:flex;font-weight:600;padding:8px 16px}.foxit-modal-content-container{background-color:#fff;border-radius:10px;display:flex;flex-direction:column;gap:24px;justify-content:space-between;max-height:70vh;min-width:320px}@media (max-width:600px){.foxit-modal-content-container{box-sizing:border-box;overflow-y:auto}}.foxit-modal-success{background:linear-gradient(135deg,#fffaf7,#f9ede3,#fffaf7,#f9ede3)}.foxit-modal-head{align-items:center;column-gap:8px;display:flex;justify-content:space-between;padding:36px 36px 0}.foxit-modal-children{box-sizing:border-box;max-height:60vh;overflow-y:auto;padding:0 36px}@media (max-width:600px){.foxit-modal-children{height:auto;max-height:100%;overflow-y:initial}}.foxit-modal-title{font-size:20px;font-weight:700}.foxit-modal-success-icon{display:flex;height:94px;margin-top:-50px;width:115px}.foxit-modal-close-button{align-items:center;cursor:pointer;display:flex;height:16px;justify-content:center;width:16px}.foxit-modal-close-button svg{stroke:#6b7280}.foxit-modal-close-button:hover svg{stroke:#ea580c}.foxit-modal-footer{display:flex;flex-wrap:wrap;gap:16px;justify-content:flex-end;padding:0 36px 36px}@media (max-width:600px){.foxit-modal-footer{align-items:stretch;flex-direction:column;width:100%}}.foxit-modal-fixed-layout{align-items:center;display:flex;flex-direction:column;inset:0;padding:36px;position:fixed;z-index:99}.foxit-modal-justify-center{justify-content:center}.foxit-modal-justify-top{justify-content:flex-start;padding-top:96px}.foxit-modal-justify-bottom{justify-content:flex-end}.foxit-modal-overlay{cursor:pointer;height:100%;inset:0;position:fixed;width:100%;z-index:99}.foxit-modal-overlay-bg{background-color:#00000026;height:100%;inset:0;position:absolute;width:100%}.foxit-modal-content{align-items:center;display:flex;font-size:16px;font-weight:400;justify-content:center;max-height:100%;width:auto;z-index:99}.foxit-modal-opacity-0{opacity:0}.foxit-modal-opacity-100{opacity:1}.foxit-modal-scale-0{transform:scale(0)}.foxit-modal-scale-100{transform:scale(1)}.foxit-modal-transition{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.foxit-modal-hide-overflow{overflow-y:hidden}.foxit-switch{background-color:#ccc;border-radius:100px;cursor:pointer;display:inline-block;height:22px;line-height:22px;min-width:40px;position:relative;transition:background-color .3s;width:40px}.foxit-switch.small{height:14px;line-height:14px;min-width:24px;width:24px}.foxit-switch.checked{background-color:#ff5f00}.foxit-switch-handle{background-color:#fff;border-radius:50%;height:18px;position:absolute;top:2px;transform:translateX(1px);transition:transform .3s;width:18px}.foxit-switch.small .foxit-switch-handle{height:12px;top:1px;width:12px}.foxit-switch.checked .foxit-switch-handle{transform:translateX(20px)}.foxit-switch.small.checked .foxit-switch-handle{transform:translateX(11px)}.foxit-spin{display:inline-block;pointer-events:none;position:relative;width:100%}.foxit-spin .foxit-spin-container{opacity:.5}.foxit-spin-spinning{animation:spin 1s linear infinite;color:#ff5f00;margin-right:8px}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.foxit-spin-icon{left:50%;position:absolute;top:50%;transform:translate(-50%,-50%)}.foxit-spin-small .foxit-spin-icon{font-size:16px}.foxit-spin-default .foxit-spin-icon{font-size:24px}.foxit-spin-large .foxit-spin-icon{font-size:32px}.foxit-alert{align-items:flex-start;border-radius:5px;display:flex;padding:12px}.foxit-alert-icon-container{height:20px;margin-right:8px;width:20px}.foxit-alert-icon{height:20px;width:20px}.foxit-alert-message{font-size:12px}.foxit-alert-success,.foxit-alert-warning{background-color:#f5fff2;border:1px solid #30dc6b}.foxit-alert-error{background-color:#fae5dd;border:1px solid #e22727}.foxit-alert-gradient{background:linear-gradient(135deg,#fffaf7,#f9ede3,#fffaf7,#f9ede3);border:1px solid #ff5f00;display:block}.foxit-quantity,.foxit-quantity-button{align-items:center;display:flex}.foxit-quantity-button{background-color:#ff5f00;border:none;border-radius:4px;color:#fff;cursor:pointer;height:16px;justify-content:center;margin-left:8px;margin-right:8px;width:16px}.foxit-quantity-button:disabled{background-color:#ffc2a0;cursor:not-allowed}.foxit-quantity-button>div{font-size:16px;margin-top:-3px}.foxit-quantity-number{border:1px solid #b3b3b3;border-radius:4px;color:#525252;flex:1;font-size:14px;height:24px;line-height:24px;outline:none!important;text-align:center;width:48px}.foxit-drawer-mask{background-color:#00000026;inset:0;opacity:0;pointer-events:none;position:fixed;transition:opacity .3s;z-index:99}.foxit-drawer-mask-open{opacity:1;pointer-events:auto}.foxit-drawer{background:#fff;box-shadow:-2px 0 8px #00000026;height:100vh;overflow:auto;position:fixed;right:0;top:0;transition:right .3s;z-index:100}.foxit-drawer-content{padding:24px}.foxit-steps{display:flex}.foxit-steps-horizontal{align-items:flex-start;flex-direction:row}.foxit-steps-vertical{flex-direction:column}.foxit-steps-item{display:flex;flex:1;position:relative}.foxit-steps-horizontal .foxit-steps-item{align-items:center;flex-direction:column;text-align:center}.foxit-steps-vertical .foxit-steps-item{align-items:flex-start;flex-direction:row;margin-bottom:16px}.foxit-steps-item-container{display:flex;position:relative;z-index:1}.foxit-steps-horizontal .foxit-steps-item-container{align-items:center;flex-direction:column}.foxit-steps-vertical .foxit-steps-item-container{align-items:flex-start;flex-direction:row}.foxit-steps-item-clickable .foxit-steps-item-container{cursor:pointer}.foxit-steps-item-clickable:hover .foxit-steps-item-title{color:FF5F00}.foxit-steps-item-icon{align-items:center;display:flex;justify-content:center;margin-bottom:8px;position:relative}.foxit-steps-vertical .foxit-steps-item-icon{margin-bottom:0;margin-right:16px;margin-top:4px}.foxit-steps-icon{align-items:center;border-radius:50%;display:flex;font-size:12px;height:16px;justify-content:center;transition:all .3s ease;width:16px}.foxit-steps-icon-wait{background-color:#fff;border:1px solid #cecece}.foxit-steps-icon-process{background-color:#ff5f00;border:1px solid #ff5f00}.foxit-steps-icon-finish{background-color:#fff;border:1px solid #ff5f00;color:#ff5f00}.foxit-steps-item-content{display:flex;flex-direction:column;min-width:0}.foxit-steps-horizontal .foxit-steps-item-content{align-items:center;text-align:center}.foxit-steps-vertical .foxit-steps-item-content{align-items:flex-start;text-align:left}.foxit-steps-item-title{color:#757575;font-size:14px;line-height:1.5;margin-bottom:4px;transition:color .3s ease}.foxit-steps-item-process .foxit-steps-item-title{color:#ff5f00;font-weight:700}.foxit-steps-item-description{color:#00000073;font-size:12px;line-height:1.5;max-width:120px}.foxit-steps-item-tail{height:1px;left:50%;position:absolute;top:8px;width:calc(100% - 16px);z-index:0}.foxit-steps-horizontal .foxit-steps-item-tail{transform:translateX(8px)}.foxit-steps-vertical .foxit-steps-item-tail{height:100%;left:8px;position:absolute;top:20px;transform:none;width:1px}.foxit-steps-item-tail-line{background-color:#d9d9d9;height:100%;transition:background-color .3s ease;width:100%}.foxit-steps-item-finish .foxit-steps-item-tail-line{background-color:#ff6b35}.foxit-steps-item-process .foxit-steps-item-tail-line{background-color:#d9d9d9}
1
+ .foxit-checkbox-container{cursor:pointer;display:inline-block;position:relative;-webkit-user-select:none;user-select:none}[dir=ltr] .foxit-checkbox-container{padding-left:25px}[dir=rtl] .foxit-checkbox-container{padding-right:25px}.foxit-checkbox-container.small{line-height:16px}[dir=ltr] .foxit-checkbox-container.small{padding-left:21px}[dir=rtl] .foxit-checkbox-container.small{padding-right:21px}.foxit-checkbox-container input{cursor:pointer;opacity:0;position:absolute}.foxit-checkbox-checkmark{background-color:#fff;border:1px solid #b3b3b3;border-radius:4px;height:20px;position:absolute;top:0;width:20px}[dir=ltr] .foxit-checkbox-checkmark{left:0}[dir=rtl] .foxit-checkbox-checkmark{right:0}.foxit-checkbox-container input:indeterminate~.foxit-checkbox-checkmark{background-color:#fff}.foxit-checkbox-container.small .foxit-checkbox-checkmark{height:16px;width:16px}.foxit-checkbox-content{line-height:20px}.foxit-checkbox-container.small .foxit-checkbox-content{display:inline-block;font-size:12px;line-height:16px}.foxit-checkbox-container input:checked~.foxit-checkbox-checkmark{background-color:#ff5f00;border:none}[dir=rtl] .foxit-checkbox-container input:checked~.foxit-checkbox-checkmark{transform:scaleX(-1)}.foxit-checkbox-checkmark:after{content:"";display:none;position:absolute}.foxit-checkbox-container input:checked~.foxit-checkbox-checkmark:after{display:block}.foxit-checkbox-container .foxit-checkbox-checkmark:after{border:solid #fff;height:10px;top:4px;width:6px}[dir=ltr] .foxit-checkbox-container .foxit-checkbox-checkmark:after{border-width:0 2px 2px 0;left:7px;transform:rotate(45deg)}[dir=rtl] .foxit-checkbox-container .foxit-checkbox-checkmark:after{border-width:0 0 2px 2px;right:7px;transform:rotate(-45deg)}.foxit-checkbox-container input:indeterminate~.foxit-checkbox-checkmark:after{background-color:#ff5f00;border:none;border-radius:2px;display:block;height:10px;top:50%;width:10px}[dir=ltr] .foxit-checkbox-container input:indeterminate~.foxit-checkbox-checkmark:after{left:50%;transform:translate(-50%,-50%)}[dir=rtl] .foxit-checkbox-container input:indeterminate~.foxit-checkbox-checkmark:after{right:50%;transform:translate(50%,-50%)}.foxit-checkbox-container.small .foxit-checkbox-checkmark:after{top:2px}[dir=ltr] .foxit-checkbox-container.small .foxit-checkbox-checkmark:after{left:5px}[dir=rtl] .foxit-checkbox-container.small .foxit-checkbox-checkmark:after{right:5px}.foxit-checkbox-container.small input:indeterminate~.foxit-checkbox-checkmark:after{height:8px;top:50%;width:8px}[dir=ltr] .foxit-checkbox-container.small input:indeterminate~.foxit-checkbox-checkmark:after{left:50%;transform:translate(-50%,-50%)}[dir=rtl] .foxit-checkbox-container.small input:indeterminate~.foxit-checkbox-checkmark:after{right:50%;transform:translate(50%,-50%)}.foxit-checkbox-container.disabled{color:#00000040;cursor:not-allowed;opacity:.6}.foxit-checkbox-checkmark.disabled{background-color:#f5f5f5;border:1px solid #d9d9d9}.foxit-empty{align-items:center;display:flex;flex-direction:column;justify-content:center;padding:20px;text-align:center}.foxit-empty-image{margin-bottom:16px}.foxit-empty-description{color:#757575;font-size:14px}.foxit-form-item{margin-bottom:24px}.foxit-form-item label{color:#525252;display:block;font-size:14px;font-weight:500;margin-bottom:8px}.foxit-form-item-embedlabel{background-color:#fff;display:inline-block!important;padding:0 4px;position:relative;top:18px;z-index:1}[dir=ltr] .foxit-form-item-embedlabel{margin-left:4px}[dir=rtl] .foxit-form-item-embedlabel{margin-right:4px}.foxit-form-required{color:#e22727}.foxit-form-error-text,.foxit-form-warning-text{font-size:12px;line-height:24px;min-height:24px}.foxit-form-error-text{color:#e22727}.foxit-form-warning-text{color:orange}.foxit-form-item>.foxit-form-error-component .foxit-checkbox-container,.foxit-form-item>.foxit-form-error-component .foxit-input-wrapper,.foxit-form-item>.foxit-form-error-component .foxit-radio-container,.foxit-form-item>.foxit-form-error-component .foxit-select-wrapper>:nth-child(3){border:1px solid #e22727!important}.foxit-form-item>.foxit-form-warning-component .foxit-checkbox-container,.foxit-form-item>.foxit-form-warning-component .foxit-input-wrapper,.foxit-form-item>.foxit-form-warning-component .foxit-radio-container,.foxit-form-item>.foxit-form-warning-component .foxit-select-wrapper>:nth-child(3){border-color:orange!important}.foxit-input-wrapper{align-items:center;border:1px solid #d9d9d9;border-radius:10px;display:flex;font-size:14px;font-weight:400;padding:11px 16px;transition:border-color .3s}.foxit-input-wrapper:focus-within{border-color:#ff5f00!important}.foxit-input-wrapper:hover{border-color:#757575}.foxit-input-element{border:none;color:#525252;flex:1;line-height:24px;outline:none!important}[dir=ltr] .foxit-input-element{text-align:left}[dir=rtl] .foxit-input-element{text-align:right}.foxit-input-element::placeholder{color:#b3b3b3}.foxit-input-addon{align-items:center;color:#b3b3b3;cursor:pointer;display:flex;transition:color .3s}[dir=ltr] .foxit-input-addon{padding:0 0 0 8px}[dir=ltr] .foxit-input-addon-before,[dir=rtl] .foxit-input-addon{padding:0 8px 0 0}[dir=rtl] .foxit-input-addon-before{padding:0 0 0 8px}.foxit-input-wrapper:focus-within .foxit-input-addon{color:#ff5f00!important}.foxit-input-wrapper:hover .foxit-input-addon{color:#757575}.foxit-input-wrapper :disabled,.foxit-input-wrapper-disabled{background-color:#f8f8f8}.foxit-input-wrapper-disabled:hover{border-color:#d9d9d9}.foxit-input-wrapper-disabled .foxit-input-element{color:#b3b3b3}[dir=ltr] .foxit-input-wrapper-textarea{padding-right:0}[dir=rtl] .foxit-input-wrapper-textarea{padding-left:0}.foxit-textarea-element{resize:none;scrollbar-color:#d9d9d9 #fff;scrollbar-gutter:stable;scrollbar-width:auto}.foxit-textarea-element::-webkit-scrollbar{width:16px}.foxit-textarea-element::-webkit-scrollbar-track{background:#fff}.foxit-textarea-element::-webkit-scrollbar-thumb{background-color:#d9d9d9;border:4px solid #fff;border-radius:8px}.foxit-pagination-container{align-items:center;display:flex;justify-content:center}.foxit-pagination-button,.foxit-pagination-next,.foxit-pagination-prev{background-color:initial;border:none;border-radius:10px;color:#757575;cursor:pointer;font-size:16px;font-weight:500;height:48px;margin:0 4px;min-width:48px;padding:0 12px;transition:background-color .3s ease,color .3s ease}.foxit-pagination-next:hover,.foxit-pagination-prev:hover{color:#ff5f00}.foxit-pagination-button:hover{background-color:#ff5f001a}.foxit-pagination-button:disabled{background-color:#ff5f00;color:#fff;cursor:default}.foxit-pagination-mobile-container{display:flex;justify-content:center;margin:16px 0}.foxit-pagination-mobile-next,.foxit-pagination-mobile-prev{height:36px;margin:0 8px;min-width:40px}.foxit-pagination-mobile-info{font-size:16px;min-width:48px}.foxit-button,.foxit-pagination-mobile-info{align-items:center;display:flex;justify-content:center}.foxit-button{border:0;border-radius:10px;cursor:pointer;font-size:14px;font-weight:600;letter-spacing:.42px}.foxit-button-circle{aspect-ratio:1;border-radius:50%!important;padding:0!important;width:auto}.foxit-button:disabled{cursor:not-allowed;opacity:.5;pointer-events:none}.foxit-button:hover{opacity:.8}.foxit-button-primary{background-color:#ff5f00;color:#fff}.foxit-button-secondary{background-color:#fff;border:1px solid #ff5f00;color:#ff5f00}.foxit-button-small{border-radius:5px;min-height:38px;padding:8px 24px}.foxit-button-small svg{height:16px;width:16px}.foxit-button-small.foxit-button-circle{height:38px;width:38px}.foxit-button-medium{border-radius:5px;min-height:44px;padding:11px 32px}.foxit-button-medium svg{height:20px;width:20px}.foxit-button-medium.foxit-button-circle{height:44px;width:44px}.foxit-button-large{min-height:56px;padding:16px 32px}.foxit-button-large.foxit-button-circle{height:56px;width:56px}.foxit-button-prevent-click{pointer-events:none}.foxit-button-loading{animation:spin 1s linear infinite}[dir=ltr] .foxit-button-loading{margin-right:8px}[dir=rtl] .foxit-button-loading{margin-left:8px}.foxit-button-primary .foxit-button-loading{color:#fff}.foxit-button-secondary .foxit-button-loading{color:#ff5f00}.foxit-radio-container{cursor:pointer;display:inline-block;position:relative;-webkit-user-select:none;user-select:none}[dir=ltr] .foxit-radio-container{padding-left:25px}[dir=rtl] .foxit-radio-container{padding-right:25px}.foxit-radio-container input{cursor:pointer;opacity:0;position:absolute}.foxit-radio-checkmark{background-color:#fff;border:1px solid #b3b3b3;border-radius:50%;height:20px;position:absolute;top:0;width:20px}[dir=ltr] .foxit-radio-checkmark{left:0}[dir=rtl] .foxit-radio-checkmark{right:0}.foxit-radio-content{line-height:20px}.foxit-radio-container input:checked~.foxit-radio-checkmark{background-color:#fff;border:1px solid #ff5f00}.foxit-radio-checkmark:after{content:"";display:none;position:absolute}.foxit-radio-container input:checked~.foxit-radio-checkmark:after{display:block}.foxit-radio-container .foxit-radio-checkmark:after{background:#ff5f00;border-radius:50%;height:10px;top:4px;width:10px}[dir=ltr] .foxit-radio-container .foxit-radio-checkmark:after{left:4px}[dir=rtl] .foxit-radio-container .foxit-radio-checkmark:after{right:4px}.foxit-radio-container.disabled{cursor:not-allowed;opacity:.6}.foxit-select-custom-control{display:flex}[dir=ltr] .foxit-select-custom-control{margin-right:-4px;padding-left:8px}[dir=rtl] .foxit-select-custom-control{margin-left:-4px;padding-right:8px}.foxit-table{border:1px solid #ff5f00;border-radius:10px;color:#373737;min-height:200px;overflow:hidden;position:relative}.foxit-table-loading{align-items:center;background-color:#ffffffb3;display:flex;height:100%;justify-content:center;position:absolute;top:0;width:100%;z-index:5}[dir=ltr] .foxit-table-loading{left:0}[dir=rtl] .foxit-table-loading{right:0}.foxit-table-icon-loading{animation:spin 1s linear infinite;color:#ff5f00}.foxit-table-container{border-collapse:collapse;min-width:100%;table-layout:fixed;width:auto}.foxit-table-container td,.foxit-table-container th{word-wrap:break-word;height:70px;min-height:70px;padding:24px;white-space:pre-wrap}.foxit-table-container th{background-color:#fff6f0;font-size:16px;font-weight:700}.foxit-table-container td{font-size:14px;font-weight:400}.foxit-table-container .foxit-even-row{background-color:#fff}.foxit-table-container .foxit-odd-row{background-color:#fff6f0}.foxit-table-mobile-list{display:flex;flex-direction:column;gap:16px}.foxit-table-mobile-card{background:#f8f8f8;border-radius:10px;display:flex;flex-direction:column;gap:12px;padding:32px}.foxit-table-mobile-row{align-items:flex-start;display:flex;flex-direction:row;justify-content:space-between}.foxit-table-mobile-row:not(:last-child){border-bottom:1px solid #efefef;padding-bottom:12px}.foxit-table-mobile-label{word-wrap:break-word;color:#373737;font-size:16px;font-weight:700;max-width:50%;white-space:pre-wrap}[dir=ltr] .foxit-table-mobile-label{margin-right:16px}[dir=rtl] .foxit-table-mobile-label{margin-left:16px}.foxit-table-mobile-value{word-wrap:break-word;color:#373737;flex:1 1 0;font-size:14px;font-weight:400;white-space:pre-wrap}[dir=ltr] .foxit-table-mobile-value{text-align:right}[dir=rtl] .foxit-table-mobile-value{text-align:left}.foxit-table-mobile-loading{align-items:center;background:#0000;display:flex;justify-content:center;padding:24px 0;width:100%}.foxit-table-checkbox{position:relative;text-align:center}[dir=ltr] .foxit-table-checkbox{padding:24px 0 24px 16px!important}[dir=rtl] .foxit-table-checkbox{padding:24px 16px 24px 0!important}.foxit-tabs{display:flex;flex-wrap:wrap;gap:8px}.foxit-tab-item{background-color:#f1f3f4;border:none;border-radius:10px;color:#757575;cursor:pointer;font-size:14px;font-weight:600;padding:14px 20px;transition:background-color .3s,color .3s}.foxit-tab-item.active{background-color:#ff5f00;color:#fff}.foxit-tab-item:hover:not(.active){background-color:#e0e0e0}.foxit-tab-content{margin-top:16px}.foxit-linktabs{width:100%}.foxit-linktabs-inner{margin-left:auto;margin-right:auto;position:relative}.foxit-linktabs-scroll{background:#fff;border:none;padding:8px;position:absolute;top:6px;z-index:10}.foxit-linktabs-scroll:hover{color:#ff5f00;cursor:pointer}[dir=ltr] .foxit-linktabs-scroll-left{left:-24px}[dir=ltr] .foxit-linktabs-scroll-right,[dir=rtl] .foxit-linktabs-scroll-left{right:-24px}[dir=rtl] .foxit-linktabs-scroll-right{left:-24px}.foxit-linktabs-list{-ms-overflow-style:none;border-bottom:1px solid #f1f3f4;display:flex;overflow-x:auto;scrollbar-width:none;text-align:center;white-space:nowrap;width:100%}.foxit-linktabs-list::-webkit-scrollbar{display:none}.foxit-linktab-btn{background:none;border:none;color:#b3b3b3;cursor:pointer;display:inline-block;font-size:14px;font-weight:600;outline:none;padding:12px;transition:border-color .2s,color .2s}.foxit-linktab-btn.active{border-bottom:2px solid #ff5f00;color:#ff5f00}.foxit-tag{border-radius:5px;display:inline-block;font-size:12px;font-weight:600;min-height:24px;padding:4px 8px}.foxit-tag-active{background-color:#edfafa;color:#0f8b8d}.foxit-tag-canceled{background-color:#ffecec;color:#e22727}.foxit-tag-pending{background-color:#fbf4d0;color:#9b8827}.foxit-tag-offline{background-color:#edecff;color:#6462c6}.foxit-tag-trial{background-color:#e4f4fe;color:#2288ce}.foxit-tag-expired{background-color:#ececec;color:#757575}.foxit-tag-completed{background-color:#edfafa;color:#0f8b8d}.foxit-toast-container{pointer-events:none;position:fixed;top:0;transition-delay:0s;transition-duration:.5s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);width:100%;z-index:2000}[dir=ltr] .foxit-toast-container{left:50%;transform:translateX(-50%)}[dir=rtl] .foxit-toast-container{right:50%;transform:translateX(50%)}.foxit-toast-loading{animation:spin 1s linear infinite;color:#ff5f00}.foxit-toast-loading-overlay{background-color:#000;height:100vh;inset:0;opacity:.15;pointer-events:auto;position:fixed;z-index:10}.foxit-toast-item{align-items:center;background-color:#fff;border:none;border-radius:50px;color:#525252;display:flex;flex-direction:row;gap:8px;justify-content:center;margin-bottom:16px;margin-left:auto;margin-right:auto;padding:9px 12px;position:relative;top:102px;transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1);width:fit-content;z-index:20}.foxit-toast-item-success{background-color:#ddfae8;color:#1f7f40}.foxit-toast-item-error{background-color:#fae5dd;color:#e22727}.foxit-toast-item-warning{background-color:#fff0e7;color:#525252}.foxit-toast-enter{opacity:0;transform:translateY(-100%)}.foxit-toast-enter-active{transition:all .5s ease-out}.foxit-toast-enter-active,.foxit-toast-exit{opacity:1;transform:translateY(0)}.foxit-toast-exit-active{opacity:0;transform:translateY(-100%);transition:all .5s ease-in}.foxit-tooltip-container{display:inline-block;position:relative;width:auto}.foxit-tooltip-content{background-color:#525252;border-radius:10px;color:#fff;max-width:100%;min-width:100px;padding:12px 16px;position:absolute;width:300px;z-index:1}.foxit-tooltip-white{background-color:#fff;border:1px solid #e0e0e0;box-shadow:0 2px 4px #0000001a;color:#525252}.foxit-tooltip-bridge{background-color:initial;pointer-events:auto;position:absolute;z-index:9998}.foxit-tooltip-arrow{height:0;position:absolute;width:0}.foxit-tooltip-arrow-top{border-top:5px solid #525252}.foxit-tooltip-arrow-bottom,.foxit-tooltip-arrow-top{border-left:5px solid #0000;border-right:5px solid #0000}.foxit-tooltip-arrow-bottom{border-bottom:5px solid #525252}.foxit-tooltip-arrow-left{border-bottom:5px solid #0000;border-top:5px solid #0000}[dir=ltr] .foxit-tooltip-arrow-left{border-left:5px solid #525252}[dir=rtl] .foxit-tooltip-arrow-left{border-right:5px solid #525252}.foxit-tooltip-arrow-right{border-bottom:5px solid #0000;border-top:5px solid #0000}[dir=ltr] .foxit-tooltip-arrow-right{border-right:5px solid #525252}[dir=rtl] .foxit-tooltip-arrow-right{border-left:5px solid #525252}.foxit-tooltip-white .foxit-tooltip-arrow-top{border-top-color:#e0e0e0}.foxit-tooltip-white .foxit-tooltip-arrow-bottom{border-bottom-color:#e0e0e0}[dir=ltr] .foxit-tooltip-white .foxit-tooltip-arrow-left{border-left-color:#e0e0e0}[dir=ltr] .foxit-tooltip-white .foxit-tooltip-arrow-right,[dir=rtl] .foxit-tooltip-white .foxit-tooltip-arrow-left{border-right-color:#e0e0e0}[dir=rtl] .foxit-tooltip-white .foxit-tooltip-arrow-right{border-left-color:#e0e0e0}.foxit-tooltip-white .foxit-tooltip-arrow-top:after{border-left:5px solid #0000;border-right:5px solid #0000;border-top:5px solid #fff;content:"";position:absolute;top:-6px}[dir=ltr] .foxit-tooltip-white .foxit-tooltip-arrow-top:after{left:-5px}[dir=rtl] .foxit-tooltip-white .foxit-tooltip-arrow-top:after{right:-5px}.foxit-tooltip-white .foxit-tooltip-arrow-bottom:after{border-bottom:5px solid #fff;border-left:5px solid #0000;border-right:5px solid #0000;bottom:-6px;content:"";position:absolute}[dir=ltr] .foxit-tooltip-white .foxit-tooltip-arrow-bottom:after{left:-5px}[dir=rtl] .foxit-tooltip-white .foxit-tooltip-arrow-bottom:after{right:-5px}.foxit-tooltip-white .foxit-tooltip-arrow-left:after{border-bottom:5px solid #0000;border-top:5px solid #0000;content:"";position:absolute;top:-5px}[dir=ltr] .foxit-tooltip-white .foxit-tooltip-arrow-left:after{border-left:5px solid #fff;left:-6px}[dir=rtl] .foxit-tooltip-white .foxit-tooltip-arrow-left:after{border-right:5px solid #fff;right:-6px}.foxit-tooltip-white .foxit-tooltip-arrow-right:after{border-bottom:5px solid #0000;border-top:5px solid #0000;content:"";position:absolute;top:-5px}[dir=ltr] .foxit-tooltip-white .foxit-tooltip-arrow-right:after{border-right:5px solid #fff;right:-6px}[dir=rtl] .foxit-tooltip-white .foxit-tooltip-arrow-right:after{border-left:5px solid #fff;left:-6px}.foxit-menu{border-radius:10px;font-size:14px;overflow:hidden}.foxit-menu-item-content{align-items:center;cursor:pointer;display:flex;padding:12px 16px}[dir=ltr] .foxit-menu-item{padding-left:0}[dir=rtl] .foxit-menu-item{padding-right:0}.foxit-menu-item.selected{background-color:#fff6f0!important;border-radius:10px;color:#ff5f00;font-weight:600}.foxit-menu-item:hover{background-color:#f5f6f8;border-radius:10px}.foxit-menu-submenu-title{align-items:center;cursor:pointer;display:flex;justify-content:space-between;padding:12px 16px}.foxit-menu-submenu-title:hover{background-color:#f5f6f8;border-radius:10px}.foxit-menu-icon{transition:transform .3s ease-in-out}[dir=ltr] .foxit-menu-rotated-icon{transform:rotate(180deg)}[dir=rtl] .foxit-menu-rotated-icon{transform:rotate(-180deg)}.foxit-menu-item-label{font-weight:600}.foxit-menu-collapsed{transition:width .2s;width:50px!important}.foxit-menu-item-icon{align-items:center;display:inline-flex}[dir=ltr] .foxit-menu-item-icon{margin-right:8px}[dir=rtl] .foxit-menu-item-icon{margin-left:8px}.foxit-menu-item-icon-collapsed{font-size:16px}[dir=ltr] .foxit-menu-item-icon-collapsed{margin-right:0}[dir=rtl] .foxit-menu-item-icon-collapsed{margin-left:0}.foxit-menu-collapsed .foxit-menu-item-content,.foxit-menu-collapsed .foxit-menu-submenu-title{align-items:center;display:flex;justify-content:center;padding:12px}[dir=ltr] .foxit-menu-item-icon-mr8{margin-right:8px}[dir=rtl] .foxit-menu-item-icon-mr8{margin-left:8px}.foxit-menu-collapsed-item{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.foxit-menu-popup{background-color:#fff;border-radius:10px;box-shadow:0 3px 6px #0000001f,0 1px 3px #00000014;min-width:200px;padding:5px 0}.foxit-menu-popup-content{width:100%}.foxit-menu-popup-title{align-items:center;border-bottom:1px solid #f0f0f0;color:#333;display:flex;font-weight:600;padding:8px 16px}.foxit-menu-popup-title-no-border{border-bottom:none}.foxit-modal-content-container{background-color:#fff;border-radius:10px;display:flex;flex-direction:column;gap:24px;justify-content:space-between;max-height:70vh;min-width:320px}@media (max-width:600px){.foxit-modal-content-container{box-sizing:border-box;overflow-y:auto}}[dir=ltr] .foxit-modal-success{background:linear-gradient(135deg,#fffaf7,#f9ede3,#fffaf7,#f9ede3)}[dir=rtl] .foxit-modal-success{background:linear-gradient(-135deg,#fffaf7,#f9ede3,#fffaf7,#f9ede3)}.foxit-modal-head{align-items:center;column-gap:8px;display:flex;justify-content:space-between;padding:36px 36px 0}.foxit-modal-children{box-sizing:border-box;max-height:60vh;overflow-y:auto;padding:0 36px}@media (max-width:600px){.foxit-modal-children{height:auto;max-height:100%;overflow-y:initial}}.foxit-modal-title{font-size:20px;font-weight:700}.foxit-modal-success-icon{display:flex;height:94px;margin-top:-50px;width:115px}.foxit-modal-close-button{align-items:center;cursor:pointer;display:flex;height:16px;justify-content:center;width:16px}.foxit-modal-close-button svg{stroke:#6b7280}.foxit-modal-close-button:hover svg{stroke:#ea580c}.foxit-modal-footer{display:flex;flex-wrap:wrap;gap:16px;justify-content:flex-end;padding:0 36px 36px}@media (max-width:600px){.foxit-modal-footer{align-items:stretch;flex-direction:column;width:100%}}.foxit-modal-fixed-layout{align-items:center;display:flex;flex-direction:column;inset:0;padding:36px;position:fixed;z-index:99}.foxit-modal-justify-center{justify-content:center}.foxit-modal-justify-top{justify-content:flex-start;padding-top:96px}.foxit-modal-justify-bottom{justify-content:flex-end}.foxit-modal-overlay{cursor:pointer;height:100%;inset:0;position:fixed;width:100%;z-index:99}.foxit-modal-overlay-bg{background-color:#00000026;height:100%;inset:0;position:absolute;width:100%}.foxit-modal-content{align-items:center;display:flex;font-size:16px;font-weight:400;justify-content:center;max-height:100%;width:auto;z-index:99}.foxit-modal-opacity-0{opacity:0}.foxit-modal-opacity-100{opacity:1}.foxit-modal-scale-0{transform:scale(0)}.foxit-modal-scale-100{transform:scale(1)}.foxit-modal-transition{transition-duration:.15s;transition-property:all;transition-timing-function:cubic-bezier(.4,0,.2,1)}.foxit-modal-hide-overflow{overflow-y:hidden}.foxit-switch{background-color:#ccc;border-radius:100px;cursor:pointer;display:inline-block;height:22px;line-height:22px;min-width:40px;position:relative;transition:background-color .3s;width:40px}.foxit-switch.small{height:14px;line-height:14px;min-width:24px;width:24px}.foxit-switch.checked{background-color:#ff5f00}.foxit-switch-handle{background-color:#fff;border-radius:50%;height:18px;position:absolute;top:2px;transition:transform .3s;width:18px}[dir=ltr] .foxit-switch-handle{transform:translateX(1px)}[dir=rtl] .foxit-switch-handle{transform:translateX(-1px)}.foxit-switch.small .foxit-switch-handle{height:12px;top:1px;width:12px}[dir=ltr] .foxit-switch.checked .foxit-switch-handle{transform:translateX(20px)}[dir=rtl] .foxit-switch.checked .foxit-switch-handle{transform:translateX(-20px)}[dir=ltr] .foxit-switch.small.checked .foxit-switch-handle{transform:translateX(11px)}[dir=rtl] .foxit-switch.small.checked .foxit-switch-handle{transform:translateX(-11px)}.foxit-spin{display:inline-block;pointer-events:none;position:relative;width:100%}.foxit-spin .foxit-spin-container{opacity:.5}.foxit-spin-spinning{animation:spin 1s linear infinite;color:#ff5f00}[dir=ltr] .foxit-spin-spinning{margin-right:8px}[dir=rtl] .foxit-spin-spinning{margin-left:8px}@keyframes spin{0%{transform:rotate(0deg)}to{transform:rotate(1turn)}}.foxit-spin-icon{position:absolute;top:50%}[dir=ltr] .foxit-spin-icon{left:50%;transform:translate(-50%,-50%)}[dir=rtl] .foxit-spin-icon{right:50%;transform:translate(50%,-50%)}.foxit-spin-small .foxit-spin-icon{font-size:16px}.foxit-spin-default .foxit-spin-icon{font-size:24px}.foxit-spin-large .foxit-spin-icon{font-size:32px}.foxit-alert{align-items:flex-start;border-radius:5px;display:flex;padding:12px}.foxit-alert-icon-container{height:20px;width:20px}[dir=ltr] .foxit-alert-icon-container{margin-right:8px}[dir=rtl] .foxit-alert-icon-container{margin-left:8px}.foxit-alert-icon{height:20px;width:20px}.foxit-alert-message{font-size:12px}.foxit-alert-success,.foxit-alert-warning{background-color:#f5fff2;border:1px solid #30dc6b}.foxit-alert-error{background-color:#fae5dd;border:1px solid #e22727}.foxit-alert-gradient{border:1px solid #ff5f00;display:block}[dir=ltr] .foxit-alert-gradient{background:linear-gradient(135deg,#fffaf7,#f9ede3,#fffaf7,#f9ede3)}[dir=rtl] .foxit-alert-gradient{background:linear-gradient(-135deg,#fffaf7,#f9ede3,#fffaf7,#f9ede3)}.foxit-alert-arrows{background-color:#fff;border:1px solid #ffb990;box-shadow:0 2px 8px #0000001a;position:relative}.foxit-alert-arrows-left:after,.foxit-alert-arrows-left:before{border-style:solid;content:"";height:0;position:absolute;top:50%;transform:translateY(-50%);width:0}[dir=ltr] .foxit-alert-arrows-left:after,[dir=ltr] .foxit-alert-arrows-left:before{left:-8px}[dir=rtl] .foxit-alert-arrows-left:after,[dir=rtl] .foxit-alert-arrows-left:before{right:-8px}[dir=ltr] .foxit-alert-arrows-left:before{border-color:#0000 #ffb990 #0000 #0000;border-width:9px 9px 9px 0;left:-9px}[dir=rtl] .foxit-alert-arrows-left:before{border-color:#0000 #0000 #0000 #ffb990;border-width:9px 0 9px 9px;right:-9px}[dir=ltr] .foxit-alert-arrows-left:after{border-color:#0000 #fff #0000 #0000;border-width:8px 8px 8px 0;left:-8px}[dir=rtl] .foxit-alert-arrows-left:after{border-color:#0000 #0000 #0000 #fff;border-width:8px 0 8px 8px;right:-8px}.foxit-alert-arrows-right:after,.foxit-alert-arrows-right:before{border-style:solid;content:"";height:0;position:absolute;top:50%;transform:translateY(-50%);width:0}[dir=ltr] .foxit-alert-arrows-right:after,[dir=ltr] .foxit-alert-arrows-right:before{right:-8px}[dir=rtl] .foxit-alert-arrows-right:after,[dir=rtl] .foxit-alert-arrows-right:before{left:-8px}[dir=ltr] .foxit-alert-arrows-right:before{border-color:#0000 #0000 #0000 #ffb990;border-width:9px 0 9px 9px;right:-9px}[dir=rtl] .foxit-alert-arrows-right:before{border-color:#0000 #ffb990 #0000 #0000;border-width:9px 9px 9px 0;left:-9px}[dir=ltr] .foxit-alert-arrows-right:after{border-color:#0000 #0000 #0000 #fff;border-width:8px 0 8px 8px;right:-8px}[dir=rtl] .foxit-alert-arrows-right:after{border-color:#0000 #fff #0000 #0000;border-width:8px 8px 8px 0;left:-8px}.foxit-quantity,.foxit-quantity-button{align-items:center;display:flex}.foxit-quantity-button{background-color:#ff5f00;border:none;border-radius:4px;color:#fff;cursor:pointer;height:16px;justify-content:center;margin-left:8px;margin-right:8px;width:16px}.foxit-quantity-button:disabled{background-color:#ffc2a0;cursor:not-allowed}.foxit-quantity-button>div{font-size:16px;margin-top:-3px}.foxit-quantity-number{border:1px solid #b3b3b3;border-radius:4px;color:#525252;flex:1;font-size:14px;height:24px;line-height:24px;outline:none!important;text-align:center;width:48px}.foxit-drawer-mask{background-color:#00000026;inset:0;opacity:0;pointer-events:none;position:fixed;transition:opacity .3s;z-index:99}.foxit-drawer-mask-open{opacity:1;pointer-events:auto}.foxit-drawer{background:#fff;height:100vh;overflow:auto;position:fixed;top:0;z-index:100}[dir=ltr] .foxit-drawer{box-shadow:-2px 0 8px #00000026;right:0;transition:right .3s}[dir=rtl] .foxit-drawer{box-shadow:2px 0 8px #00000026;left:0;transition:left .3s}.foxit-drawer-content{padding:24px}.foxit-steps{display:flex}.foxit-steps-horizontal{align-items:flex-start;flex-direction:row}.foxit-steps-vertical{flex-direction:column}.foxit-steps-item{display:flex;flex:1;position:relative}.foxit-steps-horizontal .foxit-steps-item{align-items:center;flex-direction:column;text-align:center}.foxit-steps-vertical .foxit-steps-item{align-items:flex-start;flex-direction:row;margin-bottom:16px}.foxit-steps-item-container{display:flex;position:relative;z-index:1}.foxit-steps-horizontal .foxit-steps-item-container{align-items:center;flex-direction:column}.foxit-steps-vertical .foxit-steps-item-container{align-items:flex-start;flex-direction:row}.foxit-steps-item-clickable .foxit-steps-item-container{cursor:pointer}.foxit-steps-item-clickable:hover .foxit-steps-item-title{color:FF5F00}.foxit-steps-item-icon{align-items:center;display:flex;justify-content:center;margin-bottom:8px;position:relative}.foxit-steps-vertical .foxit-steps-item-icon{margin-bottom:0;margin-top:4px}[dir=ltr] .foxit-steps-vertical .foxit-steps-item-icon{margin-right:16px}[dir=rtl] .foxit-steps-vertical .foxit-steps-item-icon{margin-left:16px}.foxit-steps-icon{align-items:center;border-radius:50%;display:flex;font-size:12px;height:16px;justify-content:center;transition:all .3s ease;width:16px}.foxit-steps-icon-wait{background-color:#fff;border:1px solid #cecece}.foxit-steps-icon-process{background-color:#ff5f00;border:1px solid #ff5f00}.foxit-steps-icon-finish{background-color:#fff;border:1px solid #ff5f00;color:#ff5f00}.foxit-steps-item-content{display:flex;flex-direction:column;min-width:0}.foxit-steps-horizontal .foxit-steps-item-content{align-items:center;text-align:center}.foxit-steps-vertical .foxit-steps-item-content{align-items:flex-start}[dir=ltr] .foxit-steps-vertical .foxit-steps-item-content{text-align:left}[dir=rtl] .foxit-steps-vertical .foxit-steps-item-content{text-align:right}.foxit-steps-item-title{color:#757575;font-size:14px;line-height:1.5;margin-bottom:4px;transition:color .3s ease}.foxit-steps-item-process .foxit-steps-item-title{color:#ff5f00;font-weight:700}.foxit-steps-item-description{color:#00000073;font-size:12px;line-height:1.5;max-width:120px}.foxit-steps-item-tail{height:1px;position:absolute;top:8px;width:calc(100% - 16px);z-index:0}[dir=ltr] .foxit-steps-item-tail{left:50%}[dir=rtl] .foxit-steps-item-tail{right:50%}[dir=ltr] .foxit-steps-horizontal .foxit-steps-item-tail{transform:translateX(8px)}[dir=rtl] .foxit-steps-horizontal .foxit-steps-item-tail{transform:translateX(-8px)}.foxit-steps-vertical .foxit-steps-item-tail{height:100%;position:absolute;top:20px;transform:none;width:1px}[dir=ltr] .foxit-steps-vertical .foxit-steps-item-tail{left:8px}[dir=rtl] .foxit-steps-vertical .foxit-steps-item-tail{right:8px}.foxit-steps-item-tail-line{background-color:#d9d9d9;height:100%;transition:background-color .3s ease;width:100%}.foxit-steps-item-finish .foxit-steps-item-tail-line{background-color:#ff6b35}.foxit-steps-item-process .foxit-steps-item-tail-line{background-color:#d9d9d9}
package/es/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import Checkbox from './Checkbox/Checkbox';
2
2
  import Empty from './Empty/Empty';
3
3
  import Form, { FormItem, useFormWatch } from './Form/Form';
4
- import Input, { SearchInput, PasswordInput } from './Input/Input';
4
+ import Input, { SearchInput, PasswordInput, TextArea } from './Input/Input';
5
5
  import Pagination from './Pagination/Pagination';
6
6
  import Radio from './Radio/Radio';
7
7
  import Select from './Select/Select';
@@ -17,7 +17,7 @@ export { Empty };
17
17
  export { Form, FormItem, useFormWatch };
18
18
  export type { FormRefInstance } from './Form/Form.types';
19
19
  export { Icon } from './Icon/index';
20
- export { Input, SearchInput, PasswordInput };
20
+ export { Input, SearchInput, PasswordInput, TextArea };
21
21
  export { Menu, getItem } from './Menu/Menu';
22
22
  export type { MenuItem } from './Menu/Menu';
23
23
  export { Modal } from './Modal/Modal';
@@ -36,4 +36,5 @@ export { Alert } from './Alert/Alert';
36
36
  export { Quantity } from './Quantity/Quantity';
37
37
  export { Drawer } from './Drawer/Drawer';
38
38
  export { Steps } from './Steps/Steps';
39
+ export { ConfigProvider, useConfig } from './ConfigProvider/ConfigProvider';
39
40
  export type { StepsProps, StepItem } from './Steps/Steps.types';
package/es/index.js CHANGED
@@ -1,7 +1,7 @@
1
1
  export { default as Checkbox } from './Checkbox/Checkbox.js';
2
2
  export { default as Empty } from './Empty/Empty.js';
3
3
  export { default as Form } from './Form/Form.js';
4
- export { default as Input, PasswordInput, SearchInput } from './Input/Input.js';
4
+ export { default as Input, PasswordInput, SearchInput, TextArea } from './Input/Input.js';
5
5
  export { default as Pagination } from './Pagination/Pagination.js';
6
6
  export { default as Radio } from './Radio/Radio.js';
7
7
  export { default as Select } from './Select/Select.js';
@@ -20,5 +20,6 @@ export { Alert } from './Alert/Alert.js';
20
20
  export { Quantity } from './Quantity/Quantity.js';
21
21
  export { Drawer } from './Drawer/Drawer.js';
22
22
  export { Steps } from './Steps/Steps.js';
23
+ export { ConfigProvider, useConfig } from './ConfigProvider/ConfigProvider.js';
23
24
  export { default as FormItem } from './Form/FormItem.js';
24
25
  export { useFormWatch } from './Form/useFormWatch.js';
package/es/utils.d.ts ADDED
@@ -0,0 +1,2 @@
1
+ declare const getDirection: (element?: HTMLElement | null) => 'ltr' | 'rtl';
2
+ export { getDirection };
package/es/utils.js ADDED
@@ -0,0 +1,21 @@
1
+ var getDirection = function (element) {
2
+ var _a;
3
+ if (typeof window === 'undefined' || !document)
4
+ return 'ltr';
5
+ var current = element || document.documentElement;
6
+ var htmlDir = (_a = document.querySelector('html')) === null || _a === void 0 ? void 0 : _a.getAttribute('dir');
7
+ if (htmlDir && (htmlDir === 'rtl' || htmlDir === 'ltr')) {
8
+ return htmlDir;
9
+ }
10
+ while (current) {
11
+ var dir = current.getAttribute('dir');
12
+ if (dir === 'rtl' || dir === 'ltr') {
13
+ return dir;
14
+ }
15
+ current = current.parentElement;
16
+ }
17
+ var rootDir = document.documentElement.getAttribute('dir');
18
+ return (rootDir === 'rtl' ? 'rtl' : 'ltr');
19
+ };
20
+
21
+ export { getDirection };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "foxit-component",
3
- "version": "1.0.4",
3
+ "version": "1.0.5-alpha.2",
4
4
  "author": {
5
5
  "name": "linye",
6
6
  "email": "869675630@qq.com"
@@ -84,6 +84,7 @@
84
84
  "autoprefixer": "^10.4.20",
85
85
  "chromatic": "^11.25.2",
86
86
  "eslint-plugin-storybook": "^0.11.3",
87
+ "postcss-rtlcss": "^5.7.1",
87
88
  "prettier": "^3.5.1",
88
89
  "prop-types": "^15.8.1",
89
90
  "rollup": "^4.34.8",