@canvas-components/react-components 0.3.3 → 0.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
1
1
  import * as React from 'react';
2
- import { forwardRef, useRef, useEffect, useImperativeHandle, createContext, useState, useMemo, useLayoutEffect, useContext, Fragment as Fragment$1 } from 'react';
2
+ import { forwardRef, useRef, useEffect, useImperativeHandle, createContext, useState, useMemo, useLayoutEffect, useContext, useSyncExternalStore, cloneElement, Fragment as Fragment$1 } from 'react';
3
3
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
4
4
  import { createPortal } from 'react-dom';
5
5
 
@@ -5349,6 +5349,7 @@ var bodyOverflowBeforeLock = "";
5349
5349
  function ReactModal(props) {
5350
5350
  const {
5351
5351
  afterClose,
5352
+ afterOpenChange,
5352
5353
  bodyStyle,
5353
5354
  cancelButtonProps,
5354
5355
  cancelText = "\u53D6\u6D88",
@@ -5392,11 +5393,21 @@ function ReactModal(props) {
5392
5393
  const dragRef = useRef(null);
5393
5394
  const restoreFocusRef = useRef(null);
5394
5395
  const wasRenderedRef = useRef(false);
5396
+ const afterOpenChangeRef = useRef(afterOpenChange);
5397
+ const previousOpenRef = useRef();
5398
+ afterOpenChangeRef.current = afterOpenChange;
5395
5399
  const titleId = useCompatibleId(`${REACT_COMPONENT_PREFIX}-modal-title`);
5396
5400
  const controlledFullscreen = fullscreen !== void 0;
5397
5401
  const mergedFullscreen = controlledFullscreen ? Boolean(fullscreen) : innerFullscreen;
5398
5402
  const mergedConfirmLoading = confirmLoading ?? innerConfirmLoading;
5399
5403
  const hasTitle = title !== null && title !== void 0 && title !== false;
5404
+ useEffect(() => {
5405
+ if (previousOpenRef.current === open) {
5406
+ return;
5407
+ }
5408
+ previousOpenRef.current = open;
5409
+ afterOpenChangeRef.current?.(open);
5410
+ }, [open]);
5400
5411
  useEffect(() => {
5401
5412
  if (!draggable || !transition.rendered) return;
5402
5413
  const handleMouseMove = (event) => {
@@ -5975,7 +5986,8 @@ function formatDisplayValue(value, formatter, precision, step) {
5975
5986
  }
5976
5987
 
5977
5988
  // src/components/pagination/style.css
5978
- styleInject('@import "../../styles/variables.css";\n.canvas-react-pagination {\n display: flex;\n align-items: center;\n flex-wrap: nowrap;\n gap: 8px;\n color: var(--canvas-react-color-text);\n font-size: var(--canvas-react-font-size);\n white-space: nowrap;\n}\n.canvas-react-pagination-pages {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n flex-wrap: nowrap;\n}\n.canvas-react-pagination-button,\n.canvas-react-pagination-page {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: 32px;\n height: 32px;\n padding: 0 10px;\n border: 1px solid var(--canvas-react-color-border);\n border-radius: var(--canvas-react-radius-sm);\n background: var(--canvas-react-color-bg);\n color: var(--canvas-react-color-text);\n cursor: pointer;\n transition:\n border-color 0.2s ease,\n color 0.2s ease,\n background-color 0.2s ease;\n}\n.canvas-react-pagination-button {\n position: relative;\n width: 32px;\n min-width: 32px;\n padding: 0;\n}\n.canvas-react-pagination-button:hover,\n.canvas-react-pagination-page:hover {\n border-color: var(--canvas-react-color-primary-hover);\n color: var(--canvas-react-color-primary-hover);\n}\n.canvas-react-pagination-page-active {\n border-color: var(--canvas-react-color-primary);\n background: var(--canvas-react-color-bg-active);\n color: var(--canvas-react-color-primary);\n}\n.canvas-react-pagination-button:disabled,\n.canvas-react-pagination-page:disabled {\n opacity: 0.48;\n cursor: not-allowed;\n}\n.canvas-react-pagination-ellipsis {\n color: var(--canvas-react-color-text-muted);\n}\n.canvas-react-pagination-arrow {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 7px;\n height: 7px;\n border-right: 1.5px solid var(--canvas-react-color-text-muted);\n border-bottom: 1.5px solid var(--canvas-react-color-text-muted);\n transition:\n border-color 0.18s ease,\n transform 0.18s ease,\n opacity 0.18s ease;\n}\n.canvas-react-pagination-arrow-prev {\n transform: translate(-42%, -50%) rotate(135deg);\n}\n.canvas-react-pagination-arrow-next {\n transform: translate(-58%, -50%) rotate(-45deg);\n}\n.canvas-react-pagination-button:hover .canvas-react-pagination-arrow {\n border-color: var(--canvas-react-color-primary-hover);\n}\n.canvas-react-pagination-button:disabled .canvas-react-pagination-arrow {\n opacity: 0.56;\n}\n.canvas-react-pagination-quick {\n display: inline-flex;\n align-items: center;\n gap: 8px;\n flex-wrap: nowrap;\n}\n.canvas-react-pagination-total {\n color: var(--canvas-react-color-text-muted);\n}\n');
5989
+ styleInject('@import "../../styles/variables.css";\n.canvas-react-pagination {\n --canvas-react-pagination-control-size: 32px;\n --canvas-react-pagination-gap: 8px;\n --canvas-react-pagination-padding-inline: 10px;\n --canvas-react-control-height: var(--canvas-react-pagination-control-size);\n display: flex;\n align-items: center;\n flex-wrap: nowrap;\n gap: var(--canvas-react-pagination-gap);\n color: var(--canvas-react-color-text);\n font-size: var(--canvas-react-font-size);\n white-space: nowrap;\n}\n.canvas-react-pagination-small {\n --canvas-react-pagination-control-size: 24px;\n --canvas-react-pagination-gap: 4px;\n --canvas-react-pagination-padding-inline: 6px;\n}\n.canvas-react-pagination-large {\n --canvas-react-pagination-control-size: 40px;\n --canvas-react-pagination-gap: 10px;\n --canvas-react-pagination-padding-inline: 14px;\n}\n.canvas-react-pagination-pages {\n display: inline-flex;\n align-items: center;\n gap: var(--canvas-react-pagination-gap);\n flex-wrap: nowrap;\n}\n.canvas-react-pagination-button,\n.canvas-react-pagination-page {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n min-width: var(--canvas-react-pagination-control-size);\n height: var(--canvas-react-pagination-control-size);\n padding: 0 var(--canvas-react-pagination-padding-inline);\n border: 1px solid var(--canvas-react-color-border);\n border-radius: var(--canvas-react-radius-sm);\n background: var(--canvas-react-color-bg);\n color: var(--canvas-react-color-text);\n cursor: pointer;\n transition:\n border-color 0.2s ease,\n color 0.2s ease,\n background-color 0.2s ease;\n}\n.canvas-react-pagination-button {\n position: relative;\n width: var(--canvas-react-pagination-control-size);\n min-width: var(--canvas-react-pagination-control-size);\n padding: 0;\n}\n.canvas-react-pagination-button:hover,\n.canvas-react-pagination-page:hover {\n border-color: var(--canvas-react-color-primary-hover);\n color: var(--canvas-react-color-primary-hover);\n}\n.canvas-react-pagination-page-active {\n border-color: var(--canvas-react-color-primary);\n background: var(--canvas-react-color-bg-active);\n color: var(--canvas-react-color-primary);\n}\n.canvas-react-pagination-button:disabled,\n.canvas-react-pagination-page:disabled {\n opacity: 0.48;\n cursor: not-allowed;\n}\n.canvas-react-pagination-ellipsis {\n color: var(--canvas-react-color-text-muted);\n}\n.canvas-react-pagination-arrow {\n position: absolute;\n top: 50%;\n left: 50%;\n width: 7px;\n height: 7px;\n border-right: 1.5px solid var(--canvas-react-color-text-muted);\n border-bottom: 1.5px solid var(--canvas-react-color-text-muted);\n transition:\n border-color 0.18s ease,\n transform 0.18s ease,\n opacity 0.18s ease;\n}\n.canvas-react-pagination-arrow-prev {\n transform: translate(-42%, -50%) rotate(135deg);\n}\n.canvas-react-pagination-arrow-next {\n transform: translate(-58%, -50%) rotate(-45deg);\n}\n.canvas-react-pagination-button:hover .canvas-react-pagination-arrow {\n border-color: var(--canvas-react-color-primary-hover);\n}\n.canvas-react-pagination-button:disabled .canvas-react-pagination-arrow {\n opacity: 0.56;\n}\n.canvas-react-pagination-quick {\n display: inline-flex;\n align-items: center;\n gap: var(--canvas-react-pagination-gap);\n flex-wrap: nowrap;\n}\n.canvas-react-pagination-total {\n color: var(--canvas-react-color-text-muted);\n}\n');
5990
+ var DEFAULT_PAGE_SIZE_OPTIONS = [10, 20, 50, 100];
5979
5991
  function ReactPagination(props) {
5980
5992
  const {
5981
5993
  current,
@@ -5983,12 +5995,13 @@ function ReactPagination(props) {
5983
5995
  onChange,
5984
5996
  onPageSizeChange,
5985
5997
  pageSize = 10,
5986
- pageSizeOptions,
5998
+ pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS,
5987
5999
  showLessItems,
5988
6000
  showQuickJumper,
5989
6001
  showSizeChanger,
5990
6002
  showTotal,
5991
6003
  simple,
6004
+ size = "middle",
5992
6005
  total
5993
6006
  } = props;
5994
6007
  const [quickValue, setQuickValue] = useState("");
@@ -6016,108 +6029,120 @@ function ReactPagination(props) {
6016
6029
  jumpToPage(Number(quickValue));
6017
6030
  setQuickValue("");
6018
6031
  };
6019
- return /* @__PURE__ */ jsxs("div", { className: `${REACT_COMPONENT_PREFIX}-pagination`, children: [
6020
- showTotal ? /* @__PURE__ */ jsx("span", { className: `${REACT_COMPONENT_PREFIX}-pagination-total`, children: showTotal(total, range) }) : null,
6021
- /* @__PURE__ */ jsx(
6022
- "button",
6023
- {
6024
- type: "button",
6025
- className: `${REACT_COMPONENT_PREFIX}-pagination-button`,
6026
- "aria-label": "\u4E0A\u4E00\u9875",
6027
- disabled: disabled || safeCurrent <= 1,
6028
- onClick: () => jumpToPage(safeCurrent - 1),
6029
- children: /* @__PURE__ */ jsx(
6030
- "span",
6032
+ return /* @__PURE__ */ jsxs(
6033
+ "div",
6034
+ {
6035
+ className: `${REACT_COMPONENT_PREFIX}-pagination ${REACT_COMPONENT_PREFIX}-pagination-${size}`,
6036
+ children: [
6037
+ showTotal ? /* @__PURE__ */ jsx("span", { className: `${REACT_COMPONENT_PREFIX}-pagination-total`, children: showTotal(total, range) }) : null,
6038
+ /* @__PURE__ */ jsx(
6039
+ "button",
6031
6040
  {
6032
- className: `${REACT_COMPONENT_PREFIX}-pagination-arrow ${REACT_COMPONENT_PREFIX}-pagination-arrow-prev`
6041
+ type: "button",
6042
+ className: `${REACT_COMPONENT_PREFIX}-pagination-button`,
6043
+ "aria-label": "\u4E0A\u4E00\u9875",
6044
+ disabled: disabled || safeCurrent <= 1,
6045
+ onClick: () => jumpToPage(safeCurrent - 1),
6046
+ children: /* @__PURE__ */ jsx(
6047
+ "span",
6048
+ {
6049
+ className: `${REACT_COMPONENT_PREFIX}-pagination-arrow ${REACT_COMPONENT_PREFIX}-pagination-arrow-prev`
6050
+ }
6051
+ )
6033
6052
  }
6034
- )
6035
- }
6036
- ),
6037
- simple ? /* @__PURE__ */ jsxs("span", { className: `${REACT_COMPONENT_PREFIX}-pagination-total`, children: [
6038
- safeCurrent,
6039
- " / ",
6040
- totalPages
6041
- ] }) : /* @__PURE__ */ jsx("div", { className: `${REACT_COMPONENT_PREFIX}-pagination-pages`, children: pages.map(
6042
- (item, index) => item === "..." ? /* @__PURE__ */ jsx(
6043
- "span",
6044
- {
6045
- className: `${REACT_COMPONENT_PREFIX}-pagination-ellipsis`,
6046
- children: "..."
6047
- },
6048
- `ellipsis-${index}`
6049
- ) : /* @__PURE__ */ jsx(
6050
- "button",
6051
- {
6052
- type: "button",
6053
- className: [
6054
- `${REACT_COMPONENT_PREFIX}-pagination-page`,
6055
- item === safeCurrent ? `${REACT_COMPONENT_PREFIX}-pagination-page-active` : ""
6056
- ].filter(Boolean).join(" "),
6057
- disabled,
6058
- onClick: () => jumpToPage(item),
6059
- children: item
6060
- },
6061
- item
6062
- )
6063
- ) }),
6064
- /* @__PURE__ */ jsx(
6065
- "button",
6066
- {
6067
- type: "button",
6068
- className: `${REACT_COMPONENT_PREFIX}-pagination-button`,
6069
- "aria-label": "\u4E0B\u4E00\u9875",
6070
- disabled: disabled || safeCurrent >= totalPages,
6071
- onClick: () => jumpToPage(safeCurrent + 1),
6072
- children: /* @__PURE__ */ jsx(
6073
- "span",
6053
+ ),
6054
+ simple ? /* @__PURE__ */ jsxs("span", { className: `${REACT_COMPONENT_PREFIX}-pagination-total`, children: [
6055
+ safeCurrent,
6056
+ " / ",
6057
+ totalPages
6058
+ ] }) : /* @__PURE__ */ jsx("div", { className: `${REACT_COMPONENT_PREFIX}-pagination-pages`, children: pages.map(
6059
+ (item, index) => item === "..." ? /* @__PURE__ */ jsx(
6060
+ "span",
6061
+ {
6062
+ className: `${REACT_COMPONENT_PREFIX}-pagination-ellipsis`,
6063
+ children: "..."
6064
+ },
6065
+ `ellipsis-${index}`
6066
+ ) : /* @__PURE__ */ jsx(
6067
+ "button",
6068
+ {
6069
+ type: "button",
6070
+ className: [
6071
+ `${REACT_COMPONENT_PREFIX}-pagination-page`,
6072
+ item === safeCurrent ? `${REACT_COMPONENT_PREFIX}-pagination-page-active` : ""
6073
+ ].filter(Boolean).join(" "),
6074
+ disabled,
6075
+ onClick: () => jumpToPage(item),
6076
+ children: item
6077
+ },
6078
+ item
6079
+ )
6080
+ ) }),
6081
+ /* @__PURE__ */ jsx(
6082
+ "button",
6074
6083
  {
6075
- className: `${REACT_COMPONENT_PREFIX}-pagination-arrow ${REACT_COMPONENT_PREFIX}-pagination-arrow-next`
6076
- }
6077
- )
6078
- }
6079
- ),
6080
- showSizeChanger && pageSizeOptions?.length ? /* @__PURE__ */ jsx(
6081
- ReactSelect,
6082
- {
6083
- value: String(pageSize),
6084
- disabled,
6085
- style: { width: 108 },
6086
- options: pageSizeOptions.map((size) => ({
6087
- label: `${size} / \u9875`,
6088
- value: size
6089
- })),
6090
- onChange: (value) => {
6091
- const nextPageSize = Number(value);
6092
- if (!Number.isFinite(nextPageSize)) {
6093
- return;
6084
+ type: "button",
6085
+ className: `${REACT_COMPONENT_PREFIX}-pagination-button`,
6086
+ "aria-label": "\u4E0B\u4E00\u9875",
6087
+ disabled: disabled || safeCurrent >= totalPages,
6088
+ onClick: () => jumpToPage(safeCurrent + 1),
6089
+ children: /* @__PURE__ */ jsx(
6090
+ "span",
6091
+ {
6092
+ className: `${REACT_COMPONENT_PREFIX}-pagination-arrow ${REACT_COMPONENT_PREFIX}-pagination-arrow-next`
6093
+ }
6094
+ )
6094
6095
  }
6095
- onPageSizeChange?.(1, nextPageSize);
6096
- }
6097
- }
6098
- ) : null,
6099
- showQuickJumper ? /* @__PURE__ */ jsxs("div", { className: `${REACT_COMPONENT_PREFIX}-pagination-quick`, children: [
6100
- /* @__PURE__ */ jsx("span", { className: `${REACT_COMPONENT_PREFIX}-pagination-total`, children: "\u8DF3\u81F3" }),
6101
- /* @__PURE__ */ jsx(
6102
- ReactInput,
6103
- {
6104
- value: quickValue,
6105
- disabled,
6106
- style: { width: 72 },
6107
- onChange: (event) => {
6108
- setQuickValue(event.target.value.replace(/[^\d]/g, ""));
6109
- },
6110
- onPressEnter: () => {
6111
- handleQuickCommit();
6112
- },
6113
- onBlur: () => {
6114
- handleQuickCommit();
6096
+ ),
6097
+ showSizeChanger && pageSizeOptions?.length ? /* @__PURE__ */ jsx(
6098
+ ReactSelect,
6099
+ {
6100
+ value: String(pageSize),
6101
+ disabled,
6102
+ style: { width: resolvePaginationSelectWidth(size) },
6103
+ options: pageSizeOptions.map((size2) => ({
6104
+ label: `${size2} / \u9875`,
6105
+ value: size2
6106
+ })),
6107
+ onChange: (value) => {
6108
+ const nextPageSize = Number(value);
6109
+ if (!Number.isFinite(nextPageSize)) {
6110
+ return;
6111
+ }
6112
+ onPageSizeChange?.(1, nextPageSize);
6113
+ }
6115
6114
  }
6116
- }
6117
- ),
6118
- /* @__PURE__ */ jsx("span", { className: `${REACT_COMPONENT_PREFIX}-pagination-total`, children: "\u9875" })
6119
- ] }) : null
6120
- ] });
6115
+ ) : null,
6116
+ showQuickJumper ? /* @__PURE__ */ jsxs("div", { className: `${REACT_COMPONENT_PREFIX}-pagination-quick`, children: [
6117
+ /* @__PURE__ */ jsx("span", { className: `${REACT_COMPONENT_PREFIX}-pagination-total`, children: "\u8DF3\u81F3" }),
6118
+ /* @__PURE__ */ jsx(
6119
+ ReactInput,
6120
+ {
6121
+ value: quickValue,
6122
+ disabled,
6123
+ style: { width: resolvePaginationInputWidth(size) },
6124
+ onChange: (event) => {
6125
+ setQuickValue(event.target.value.replace(/[^\d]/g, ""));
6126
+ },
6127
+ onPressEnter: () => {
6128
+ handleQuickCommit();
6129
+ },
6130
+ onBlur: () => {
6131
+ handleQuickCommit();
6132
+ }
6133
+ }
6134
+ ),
6135
+ /* @__PURE__ */ jsx("span", { className: `${REACT_COMPONENT_PREFIX}-pagination-total`, children: "\u9875" })
6136
+ ] }) : null
6137
+ ]
6138
+ }
6139
+ );
6140
+ }
6141
+ function resolvePaginationSelectWidth(size) {
6142
+ return size === "small" ? 92 : size === "large" ? 120 : 108;
6143
+ }
6144
+ function resolvePaginationInputWidth(size) {
6145
+ return size === "small" ? 56 : size === "large" ? 80 : 72;
6121
6146
  }
6122
6147
  function buildPageItems(current, totalPages, showLessItems) {
6123
6148
  if (totalPages <= 1) {
@@ -8044,6 +8069,359 @@ function resolveDecadeStart6(year) {
8044
8069
  return Math.floor(year / 10) * 10;
8045
8070
  }
8046
8071
 
8047
- export { REACT_COMPONENT_PREFIX, ReactAutoComplete, ReactCheckbox, ReactColorPicker, ReactContentScaleProvider, ReactDatePicker, ReactDateRangePicker, ReactDateTimePicker, ReactDateTimeRangePicker, ReactFilterPanel, ReactImagePreview, ReactInput, ReactInputNumber, ReactInputRange, ReactModal, ReactMonthPicker, ReactNumberInput, ReactPagination, ReactPopconfirm, ReactPopup, ReactQuarterPicker, ReactResizablePanels, ReactSelect, ReactTimePicker, ReactTimeRangePicker, ReactTransition, ReactVirtualList, ReactYearPicker, resolveResizablePanelSizes, useReactContentScale, useReactTransition };
8072
+ // src/components/compat/style.css
8073
+ styleInject(".canvas-react-button {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n min-height: 32px;\n padding: 4px 14px;\n border: 1px solid var(--cc-border-color, #d9d9d9);\n border-radius: 6px;\n color: var(--cc-text-color, #1f2937);\n background: var(--cc-surface-color, #fff);\n cursor: pointer;\n}\n.canvas-react-button:hover:not(:disabled) {\n color: #1677ff;\n border-color: #1677ff;\n}\n.canvas-react-button:disabled {\n cursor: not-allowed;\n opacity: 0.5;\n}\n.canvas-react-button-primary {\n color: #fff;\n border-color: #1677ff;\n background: #1677ff;\n}\n.canvas-react-button-danger {\n color: #dc2626;\n border-color: #fca5a5;\n}\n.canvas-react-button-small {\n min-height: 24px;\n padding: 2px 8px;\n}\n.canvas-react-button-large {\n min-height: 40px;\n padding: 6px 18px;\n}\n.canvas-react-button-icon {\n display: inline-flex;\n}\n.canvas-react-row {\n display: flex;\n flex-flow: row wrap;\n}\n.canvas-react-col {\n min-width: 0;\n padding-inline: 8px;\n}\n.canvas-react-radio-group {\n display: flex;\n gap: 16px;\n}\n.canvas-react-radio {\n display: inline-flex;\n align-items: center;\n gap: 6px;\n cursor: pointer;\n}\n.canvas-react-radio input {\n position: absolute;\n opacity: 0;\n pointer-events: none;\n}\n.canvas-react-radio-mark {\n width: 14px;\n height: 14px;\n border: 1px solid #94a3b8;\n border-radius: 50%;\n box-sizing: border-box;\n}\n.canvas-react-radio input:checked + .canvas-react-radio-mark {\n border: 4px solid #1677ff;\n}\n.canvas-react-form-item {\n display: flex;\n flex-direction: column;\n gap: 6px;\n margin-bottom: 16px;\n}\n.canvas-react-form-label {\n color: #334155;\n font-size: 14px;\n}\n.canvas-react-form-error {\n color: #dc2626;\n font-size: 12px;\n}\n.canvas-react-textarea {\n width: 100%;\n min-height: 72px;\n padding: 8px 10px;\n border: 1px solid #d9d9d9;\n border-radius: 6px;\n box-sizing: border-box;\n font: inherit;\n resize: vertical;\n}\n.canvas-react-message-host {\n position: fixed;\n z-index: 3000;\n top: 24px;\n left: 50%;\n display: flex;\n flex-direction: column;\n gap: 8px;\n transform: translateX(-50%);\n pointer-events: none;\n}\n.canvas-react-message {\n padding: 9px 14px;\n border: 1px solid #e2e8f0;\n border-radius: 8px;\n color: #334155;\n background: #fff;\n box-shadow: 0 8px 24px rgba(15, 23, 42, 0.14);\n}\n.canvas-react-message-error {\n color: #b91c1c;\n border-color: #fecaca;\n}\n");
8074
+ function ReactButton({
8075
+ children,
8076
+ className,
8077
+ danger,
8078
+ htmlType = "button",
8079
+ icon,
8080
+ size = "middle",
8081
+ type = "default",
8082
+ ...props
8083
+ }) {
8084
+ return /* @__PURE__ */ jsxs(
8085
+ "button",
8086
+ {
8087
+ ...props,
8088
+ type: htmlType,
8089
+ className: joinClassNames(
8090
+ `${REACT_COMPONENT_PREFIX}-button`,
8091
+ `${REACT_COMPONENT_PREFIX}-button-${type}`,
8092
+ `${REACT_COMPONENT_PREFIX}-button-${size}`,
8093
+ danger && `${REACT_COMPONENT_PREFIX}-button-danger`,
8094
+ className
8095
+ ),
8096
+ children: [
8097
+ icon ? /* @__PURE__ */ jsx("span", { className: `${REACT_COMPONENT_PREFIX}-button-icon`, children: icon }) : null,
8098
+ children
8099
+ ]
8100
+ }
8101
+ );
8102
+ }
8103
+ function ReactFlex({
8104
+ vertical,
8105
+ justify,
8106
+ align,
8107
+ gap,
8108
+ style,
8109
+ ...props
8110
+ }) {
8111
+ return /* @__PURE__ */ jsx(
8112
+ "div",
8113
+ {
8114
+ ...props,
8115
+ style: {
8116
+ display: "flex",
8117
+ flexDirection: vertical ? "column" : "row",
8118
+ justifyContent: justify,
8119
+ alignItems: align,
8120
+ gap,
8121
+ ...style
8122
+ }
8123
+ }
8124
+ );
8125
+ }
8126
+ function ReactRow({ gutter = 0, style, ...props }) {
8127
+ return /* @__PURE__ */ jsx(
8128
+ "div",
8129
+ {
8130
+ ...props,
8131
+ className: joinClassNames(
8132
+ `${REACT_COMPONENT_PREFIX}-row`,
8133
+ props.className
8134
+ ),
8135
+ style: { marginInline: -gutter / 2, ...style }
8136
+ }
8137
+ );
8138
+ }
8139
+ function ReactCol({ span = 24, style, ...props }) {
8140
+ return /* @__PURE__ */ jsx(
8141
+ "div",
8142
+ {
8143
+ ...props,
8144
+ className: joinClassNames(
8145
+ `${REACT_COMPONENT_PREFIX}-col`,
8146
+ props.className
8147
+ ),
8148
+ style: {
8149
+ flex: `0 0 ${span / 24 * 100}%`,
8150
+ maxWidth: `${span / 24 * 100}%`,
8151
+ ...style
8152
+ }
8153
+ }
8154
+ );
8155
+ }
8156
+ function ReactTooltip({ title, children }) {
8157
+ return cloneElement(children, {
8158
+ title: typeof title === "string" ? title : void 0,
8159
+ "aria-label": typeof title === "string" ? title : void 0
8160
+ });
8161
+ }
8162
+ var RadioGroupContext = createContext({});
8163
+ function ReactRadioOption({
8164
+ value,
8165
+ checked,
8166
+ disabled,
8167
+ onChange,
8168
+ children,
8169
+ className,
8170
+ ...props
8171
+ }) {
8172
+ const group = useContext(RadioGroupContext);
8173
+ const selected = checked ?? String(group.value ?? "") === String(value);
8174
+ return /* @__PURE__ */ jsxs(
8175
+ "label",
8176
+ {
8177
+ ...props,
8178
+ className: joinClassNames(
8179
+ `${REACT_COMPONENT_PREFIX}-radio`,
8180
+ disabled && `${REACT_COMPONENT_PREFIX}-radio-disabled`,
8181
+ className
8182
+ ),
8183
+ children: [
8184
+ /* @__PURE__ */ jsx(
8185
+ "input",
8186
+ {
8187
+ type: "radio",
8188
+ checked: selected,
8189
+ disabled,
8190
+ onChange: () => {
8191
+ const event = { target: { value } };
8192
+ onChange?.(event);
8193
+ group.onChange?.(event);
8194
+ }
8195
+ }
8196
+ ),
8197
+ /* @__PURE__ */ jsx("span", { className: `${REACT_COMPONENT_PREFIX}-radio-mark` }),
8198
+ /* @__PURE__ */ jsx("span", { children })
8199
+ ]
8200
+ }
8201
+ );
8202
+ }
8203
+ function ReactRadioGroup({
8204
+ value,
8205
+ onChange,
8206
+ className,
8207
+ ...props
8208
+ }) {
8209
+ return /* @__PURE__ */ jsx(RadioGroupContext.Provider, { value: { value, onChange }, children: /* @__PURE__ */ jsx(
8210
+ "div",
8211
+ {
8212
+ ...props,
8213
+ className: joinClassNames(
8214
+ `${REACT_COMPONENT_PREFIX}-radio-group`,
8215
+ className
8216
+ )
8217
+ }
8218
+ ) });
8219
+ }
8220
+ var ReactRadio = Object.assign(ReactRadioOption, {
8221
+ Group: ReactRadioGroup
8222
+ });
8223
+ function ReactTextArea({ className, ...props }) {
8224
+ return /* @__PURE__ */ jsx(
8225
+ "textarea",
8226
+ {
8227
+ ...props,
8228
+ className: joinClassNames(
8229
+ `${REACT_COMPONENT_PREFIX}-textarea`,
8230
+ className
8231
+ )
8232
+ }
8233
+ );
8234
+ }
8235
+ function createFormInstance() {
8236
+ const store = {
8237
+ values: {},
8238
+ initialValues: {},
8239
+ errors: {},
8240
+ rules: /* @__PURE__ */ new Map(),
8241
+ listeners: /* @__PURE__ */ new Set(),
8242
+ revision: 0,
8243
+ notify() {
8244
+ store.revision += 1;
8245
+ store.listeners.forEach((listener) => listener());
8246
+ }
8247
+ };
8248
+ return {
8249
+ __store: store,
8250
+ getFieldValue: (name) => store.values[name],
8251
+ setFieldsValue(values) {
8252
+ store.values = { ...store.values, ...values };
8253
+ Object.keys(values).forEach((name) => {
8254
+ delete store.errors[name];
8255
+ });
8256
+ store.notify();
8257
+ },
8258
+ resetFields() {
8259
+ store.values = { ...store.initialValues };
8260
+ store.errors = {};
8261
+ store.notify();
8262
+ },
8263
+ async validateFields() {
8264
+ const errors = {};
8265
+ for (const [name, rules] of store.rules) {
8266
+ const value = store.values[name];
8267
+ for (const rawRule of rules) {
8268
+ const rule = typeof rawRule === "function" ? rawRule({ getFieldValue: (field) => store.values[field] }) : rawRule;
8269
+ if (rule.required && (value === void 0 || value === null || value === "")) {
8270
+ errors[name] = rule.message ?? "\u6B64\u9879\u4E3A\u5FC5\u586B\u9879";
8271
+ break;
8272
+ }
8273
+ if ((rule.type === "number" || rule.type === "integer") && typeof value === "number" && rule.min !== void 0 && value < rule.min) {
8274
+ errors[name] = rule.message ?? `\u4E0D\u80FD\u5C0F\u4E8E ${rule.min}`;
8275
+ break;
8276
+ }
8277
+ if ((rule.type === "number" || rule.type === "integer") && typeof value === "number" && rule.max !== void 0 && value > rule.max) {
8278
+ errors[name] = rule.message ?? `\u4E0D\u80FD\u5927\u4E8E ${rule.max}`;
8279
+ break;
8280
+ }
8281
+ if (rule.type === "integer" && typeof value === "number" && !Number.isInteger(value)) {
8282
+ errors[name] = rule.message ?? "\u8BF7\u8F93\u5165\u6574\u6570";
8283
+ break;
8284
+ }
8285
+ if (rule.validator) {
8286
+ try {
8287
+ await rule.validator(rule, value);
8288
+ } catch (error) {
8289
+ errors[name] = error instanceof Error ? error.message : "\u6821\u9A8C\u5931\u8D25";
8290
+ break;
8291
+ }
8292
+ }
8293
+ }
8294
+ }
8295
+ store.errors = errors;
8296
+ store.notify();
8297
+ if (Object.keys(errors).length > 0) {
8298
+ return Promise.reject({
8299
+ errorFields: errors,
8300
+ values: { ...store.values }
8301
+ });
8302
+ }
8303
+ return { ...store.values };
8304
+ }
8305
+ };
8306
+ }
8307
+ function useReactForm() {
8308
+ const formRef = useRef();
8309
+ if (!formRef.current) formRef.current = createFormInstance();
8310
+ return [formRef.current];
8311
+ }
8312
+ function useReactFormWatch(name, form) {
8313
+ return useSyncExternalStore(
8314
+ (listener) => {
8315
+ form.__store.listeners.add(listener);
8316
+ return () => form.__store.listeners.delete(listener);
8317
+ },
8318
+ () => form.__store.revision,
8319
+ () => 0
8320
+ ) >= 0 ? form.getFieldValue(name) : void 0;
8321
+ }
8322
+ var FormContext = createContext(null);
8323
+ function ReactFormRoot({
8324
+ form,
8325
+ initialValues,
8326
+ layout = "vertical",
8327
+ className,
8328
+ children,
8329
+ ...props
8330
+ }) {
8331
+ const initialKey = useMemo(
8332
+ () => JSON.stringify(initialValues ?? {}),
8333
+ [initialValues]
8334
+ );
8335
+ useEffect(() => {
8336
+ form.__store.initialValues = { ...initialValues };
8337
+ form.__store.values = { ...initialValues, ...form.__store.values };
8338
+ form.__store.notify();
8339
+ }, [form, initialKey]);
8340
+ return /* @__PURE__ */ jsx(FormContext.Provider, { value: form, children: /* @__PURE__ */ jsx(
8341
+ "form",
8342
+ {
8343
+ ...props,
8344
+ className: joinClassNames(
8345
+ `${REACT_COMPONENT_PREFIX}-form`,
8346
+ `${REACT_COMPONENT_PREFIX}-form-${layout}`,
8347
+ className
8348
+ ),
8349
+ onSubmit: (event) => event.preventDefault(),
8350
+ children
8351
+ }
8352
+ ) });
8353
+ }
8354
+ function ReactFormItem({
8355
+ label,
8356
+ name,
8357
+ children,
8358
+ rules = [],
8359
+ initialValue
8360
+ }) {
8361
+ const form = useContext(FormContext);
8362
+ if (!form) throw new Error("ReactForm.Item \u5FC5\u987B\u5728 ReactForm \u5185\u4F7F\u7528");
8363
+ useSyncExternalStore(
8364
+ (listener) => {
8365
+ form.__store.listeners.add(listener);
8366
+ return () => form.__store.listeners.delete(listener);
8367
+ },
8368
+ () => form.__store.revision,
8369
+ () => 0
8370
+ );
8371
+ useEffect(() => {
8372
+ form.__store.rules.set(name, rules);
8373
+ if (form.getFieldValue(name) === void 0 && initialValue !== void 0) {
8374
+ form.setFieldsValue({ [name]: initialValue });
8375
+ }
8376
+ return () => {
8377
+ form.__store.rules.delete(name);
8378
+ };
8379
+ }, [form, initialValue, name, rules]);
8380
+ const childProps = children.props;
8381
+ const value = form.getFieldValue(name);
8382
+ return /* @__PURE__ */ jsxs("label", { className: `${REACT_COMPONENT_PREFIX}-form-item`, children: [
8383
+ label ? /* @__PURE__ */ jsx("span", { className: `${REACT_COMPONENT_PREFIX}-form-label`, children: label }) : null,
8384
+ cloneElement(children, {
8385
+ value: value ?? "",
8386
+ onChange: (...args) => {
8387
+ const first = args[0];
8388
+ const nextValue = typeof first === "object" && first !== null && "target" in first ? first.target?.value : first;
8389
+ form.setFieldsValue({ [name]: nextValue });
8390
+ const childOnChange = childProps.onChange;
8391
+ if (typeof childOnChange === "function") childOnChange(...args);
8392
+ }
8393
+ }),
8394
+ form.__store.errors[name] ? /* @__PURE__ */ jsx("span", { className: `${REACT_COMPONENT_PREFIX}-form-error`, children: form.__store.errors[name] }) : null
8395
+ ] });
8396
+ }
8397
+ var ReactForm = Object.assign(ReactFormRoot, {
8398
+ Item: ReactFormItem,
8399
+ useForm: useReactForm,
8400
+ useWatch: useReactFormWatch
8401
+ });
8402
+ function showMessage(type, content) {
8403
+ if (typeof document === "undefined") return;
8404
+ const hostId = `${REACT_COMPONENT_PREFIX}-message-host`;
8405
+ let host = document.getElementById(hostId);
8406
+ if (!host) {
8407
+ host = document.createElement("div");
8408
+ host.id = hostId;
8409
+ host.className = hostId;
8410
+ document.body.appendChild(host);
8411
+ }
8412
+ const item = document.createElement("div");
8413
+ item.className = `${REACT_COMPONENT_PREFIX}-message ${REACT_COMPONENT_PREFIX}-message-${type}`;
8414
+ item.textContent = typeof content === "string" ? content : String(content ?? "");
8415
+ host.appendChild(item);
8416
+ window.setTimeout(() => item.remove(), 3e3);
8417
+ }
8418
+ var reactMessage = {
8419
+ info: (content) => showMessage("info", content),
8420
+ success: (content) => showMessage("success", content),
8421
+ warning: (content) => showMessage("warning", content),
8422
+ error: (content) => showMessage("error", content)
8423
+ };
8424
+
8425
+ export { REACT_COMPONENT_PREFIX, ReactAutoComplete, ReactButton, ReactCheckbox, ReactCol, ReactColorPicker, ReactContentScaleProvider, ReactDatePicker, ReactDateRangePicker, ReactDateTimePicker, ReactDateTimeRangePicker, ReactFilterPanel, ReactFlex, ReactForm, ReactImagePreview, ReactInput, ReactInputNumber, ReactInputRange, ReactModal, ReactMonthPicker, ReactNumberInput, ReactPagination, ReactPopconfirm, ReactPopup, ReactQuarterPicker, ReactRadio, ReactResizablePanels, ReactRow, ReactSelect, ReactTextArea, ReactTimePicker, ReactTimeRangePicker, ReactTooltip, ReactTransition, ReactVirtualList, ReactYearPicker, reactMessage, resolveResizablePanelSizes, useReactContentScale, useReactForm, useReactFormWatch, useReactTransition };
8048
8426
  //# sourceMappingURL=index.js.map
8049
8427
  //# sourceMappingURL=index.js.map