@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.cjs CHANGED
@@ -5370,6 +5370,7 @@ var bodyOverflowBeforeLock = "";
5370
5370
  function ReactModal(props) {
5371
5371
  const {
5372
5372
  afterClose,
5373
+ afterOpenChange,
5373
5374
  bodyStyle,
5374
5375
  cancelButtonProps,
5375
5376
  cancelText = "\u53D6\u6D88",
@@ -5413,11 +5414,21 @@ function ReactModal(props) {
5413
5414
  const dragRef = React.useRef(null);
5414
5415
  const restoreFocusRef = React.useRef(null);
5415
5416
  const wasRenderedRef = React.useRef(false);
5417
+ const afterOpenChangeRef = React.useRef(afterOpenChange);
5418
+ const previousOpenRef = React.useRef();
5419
+ afterOpenChangeRef.current = afterOpenChange;
5416
5420
  const titleId = useCompatibleId(`${REACT_COMPONENT_PREFIX}-modal-title`);
5417
5421
  const controlledFullscreen = fullscreen !== void 0;
5418
5422
  const mergedFullscreen = controlledFullscreen ? Boolean(fullscreen) : innerFullscreen;
5419
5423
  const mergedConfirmLoading = confirmLoading ?? innerConfirmLoading;
5420
5424
  const hasTitle = title !== null && title !== void 0 && title !== false;
5425
+ React.useEffect(() => {
5426
+ if (previousOpenRef.current === open) {
5427
+ return;
5428
+ }
5429
+ previousOpenRef.current = open;
5430
+ afterOpenChangeRef.current?.(open);
5431
+ }, [open]);
5421
5432
  React.useEffect(() => {
5422
5433
  if (!draggable || !transition.rendered) return;
5423
5434
  const handleMouseMove = (event) => {
@@ -5996,7 +6007,8 @@ function formatDisplayValue(value, formatter, precision, step) {
5996
6007
  }
5997
6008
 
5998
6009
  // src/components/pagination/style.css
5999
- 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');
6010
+ 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');
6011
+ var DEFAULT_PAGE_SIZE_OPTIONS = [10, 20, 50, 100];
6000
6012
  function ReactPagination(props) {
6001
6013
  const {
6002
6014
  current,
@@ -6004,12 +6016,13 @@ function ReactPagination(props) {
6004
6016
  onChange,
6005
6017
  onPageSizeChange,
6006
6018
  pageSize = 10,
6007
- pageSizeOptions,
6019
+ pageSizeOptions = DEFAULT_PAGE_SIZE_OPTIONS,
6008
6020
  showLessItems,
6009
6021
  showQuickJumper,
6010
6022
  showSizeChanger,
6011
6023
  showTotal,
6012
6024
  simple,
6025
+ size = "middle",
6013
6026
  total
6014
6027
  } = props;
6015
6028
  const [quickValue, setQuickValue] = React.useState("");
@@ -6037,108 +6050,120 @@ function ReactPagination(props) {
6037
6050
  jumpToPage(Number(quickValue));
6038
6051
  setQuickValue("");
6039
6052
  };
6040
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${REACT_COMPONENT_PREFIX}-pagination`, children: [
6041
- showTotal ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${REACT_COMPONENT_PREFIX}-pagination-total`, children: showTotal(total, range) }) : null,
6042
- /* @__PURE__ */ jsxRuntime.jsx(
6043
- "button",
6044
- {
6045
- type: "button",
6046
- className: `${REACT_COMPONENT_PREFIX}-pagination-button`,
6047
- "aria-label": "\u4E0A\u4E00\u9875",
6048
- disabled: disabled || safeCurrent <= 1,
6049
- onClick: () => jumpToPage(safeCurrent - 1),
6050
- children: /* @__PURE__ */ jsxRuntime.jsx(
6051
- "span",
6053
+ return /* @__PURE__ */ jsxRuntime.jsxs(
6054
+ "div",
6055
+ {
6056
+ className: `${REACT_COMPONENT_PREFIX}-pagination ${REACT_COMPONENT_PREFIX}-pagination-${size}`,
6057
+ children: [
6058
+ showTotal ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${REACT_COMPONENT_PREFIX}-pagination-total`, children: showTotal(total, range) }) : null,
6059
+ /* @__PURE__ */ jsxRuntime.jsx(
6060
+ "button",
6052
6061
  {
6053
- className: `${REACT_COMPONENT_PREFIX}-pagination-arrow ${REACT_COMPONENT_PREFIX}-pagination-arrow-prev`
6062
+ type: "button",
6063
+ className: `${REACT_COMPONENT_PREFIX}-pagination-button`,
6064
+ "aria-label": "\u4E0A\u4E00\u9875",
6065
+ disabled: disabled || safeCurrent <= 1,
6066
+ onClick: () => jumpToPage(safeCurrent - 1),
6067
+ children: /* @__PURE__ */ jsxRuntime.jsx(
6068
+ "span",
6069
+ {
6070
+ className: `${REACT_COMPONENT_PREFIX}-pagination-arrow ${REACT_COMPONENT_PREFIX}-pagination-arrow-prev`
6071
+ }
6072
+ )
6054
6073
  }
6055
- )
6056
- }
6057
- ),
6058
- simple ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: `${REACT_COMPONENT_PREFIX}-pagination-total`, children: [
6059
- safeCurrent,
6060
- " / ",
6061
- totalPages
6062
- ] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${REACT_COMPONENT_PREFIX}-pagination-pages`, children: pages.map(
6063
- (item, index) => item === "..." ? /* @__PURE__ */ jsxRuntime.jsx(
6064
- "span",
6065
- {
6066
- className: `${REACT_COMPONENT_PREFIX}-pagination-ellipsis`,
6067
- children: "..."
6068
- },
6069
- `ellipsis-${index}`
6070
- ) : /* @__PURE__ */ jsxRuntime.jsx(
6071
- "button",
6072
- {
6073
- type: "button",
6074
- className: [
6075
- `${REACT_COMPONENT_PREFIX}-pagination-page`,
6076
- item === safeCurrent ? `${REACT_COMPONENT_PREFIX}-pagination-page-active` : ""
6077
- ].filter(Boolean).join(" "),
6078
- disabled,
6079
- onClick: () => jumpToPage(item),
6080
- children: item
6081
- },
6082
- item
6083
- )
6084
- ) }),
6085
- /* @__PURE__ */ jsxRuntime.jsx(
6086
- "button",
6087
- {
6088
- type: "button",
6089
- className: `${REACT_COMPONENT_PREFIX}-pagination-button`,
6090
- "aria-label": "\u4E0B\u4E00\u9875",
6091
- disabled: disabled || safeCurrent >= totalPages,
6092
- onClick: () => jumpToPage(safeCurrent + 1),
6093
- children: /* @__PURE__ */ jsxRuntime.jsx(
6094
- "span",
6074
+ ),
6075
+ simple ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: `${REACT_COMPONENT_PREFIX}-pagination-total`, children: [
6076
+ safeCurrent,
6077
+ " / ",
6078
+ totalPages
6079
+ ] }) : /* @__PURE__ */ jsxRuntime.jsx("div", { className: `${REACT_COMPONENT_PREFIX}-pagination-pages`, children: pages.map(
6080
+ (item, index) => item === "..." ? /* @__PURE__ */ jsxRuntime.jsx(
6081
+ "span",
6082
+ {
6083
+ className: `${REACT_COMPONENT_PREFIX}-pagination-ellipsis`,
6084
+ children: "..."
6085
+ },
6086
+ `ellipsis-${index}`
6087
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
6088
+ "button",
6089
+ {
6090
+ type: "button",
6091
+ className: [
6092
+ `${REACT_COMPONENT_PREFIX}-pagination-page`,
6093
+ item === safeCurrent ? `${REACT_COMPONENT_PREFIX}-pagination-page-active` : ""
6094
+ ].filter(Boolean).join(" "),
6095
+ disabled,
6096
+ onClick: () => jumpToPage(item),
6097
+ children: item
6098
+ },
6099
+ item
6100
+ )
6101
+ ) }),
6102
+ /* @__PURE__ */ jsxRuntime.jsx(
6103
+ "button",
6095
6104
  {
6096
- className: `${REACT_COMPONENT_PREFIX}-pagination-arrow ${REACT_COMPONENT_PREFIX}-pagination-arrow-next`
6097
- }
6098
- )
6099
- }
6100
- ),
6101
- showSizeChanger && pageSizeOptions?.length ? /* @__PURE__ */ jsxRuntime.jsx(
6102
- ReactSelect,
6103
- {
6104
- value: String(pageSize),
6105
- disabled,
6106
- style: { width: 108 },
6107
- options: pageSizeOptions.map((size) => ({
6108
- label: `${size} / \u9875`,
6109
- value: size
6110
- })),
6111
- onChange: (value) => {
6112
- const nextPageSize = Number(value);
6113
- if (!Number.isFinite(nextPageSize)) {
6114
- return;
6105
+ type: "button",
6106
+ className: `${REACT_COMPONENT_PREFIX}-pagination-button`,
6107
+ "aria-label": "\u4E0B\u4E00\u9875",
6108
+ disabled: disabled || safeCurrent >= totalPages,
6109
+ onClick: () => jumpToPage(safeCurrent + 1),
6110
+ children: /* @__PURE__ */ jsxRuntime.jsx(
6111
+ "span",
6112
+ {
6113
+ className: `${REACT_COMPONENT_PREFIX}-pagination-arrow ${REACT_COMPONENT_PREFIX}-pagination-arrow-next`
6114
+ }
6115
+ )
6115
6116
  }
6116
- onPageSizeChange?.(1, nextPageSize);
6117
- }
6118
- }
6119
- ) : null,
6120
- showQuickJumper ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${REACT_COMPONENT_PREFIX}-pagination-quick`, children: [
6121
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${REACT_COMPONENT_PREFIX}-pagination-total`, children: "\u8DF3\u81F3" }),
6122
- /* @__PURE__ */ jsxRuntime.jsx(
6123
- ReactInput,
6124
- {
6125
- value: quickValue,
6126
- disabled,
6127
- style: { width: 72 },
6128
- onChange: (event) => {
6129
- setQuickValue(event.target.value.replace(/[^\d]/g, ""));
6130
- },
6131
- onPressEnter: () => {
6132
- handleQuickCommit();
6133
- },
6134
- onBlur: () => {
6135
- handleQuickCommit();
6117
+ ),
6118
+ showSizeChanger && pageSizeOptions?.length ? /* @__PURE__ */ jsxRuntime.jsx(
6119
+ ReactSelect,
6120
+ {
6121
+ value: String(pageSize),
6122
+ disabled,
6123
+ style: { width: resolvePaginationSelectWidth(size) },
6124
+ options: pageSizeOptions.map((size2) => ({
6125
+ label: `${size2} / \u9875`,
6126
+ value: size2
6127
+ })),
6128
+ onChange: (value) => {
6129
+ const nextPageSize = Number(value);
6130
+ if (!Number.isFinite(nextPageSize)) {
6131
+ return;
6132
+ }
6133
+ onPageSizeChange?.(1, nextPageSize);
6134
+ }
6136
6135
  }
6137
- }
6138
- ),
6139
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${REACT_COMPONENT_PREFIX}-pagination-total`, children: "\u9875" })
6140
- ] }) : null
6141
- ] });
6136
+ ) : null,
6137
+ showQuickJumper ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: `${REACT_COMPONENT_PREFIX}-pagination-quick`, children: [
6138
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${REACT_COMPONENT_PREFIX}-pagination-total`, children: "\u8DF3\u81F3" }),
6139
+ /* @__PURE__ */ jsxRuntime.jsx(
6140
+ ReactInput,
6141
+ {
6142
+ value: quickValue,
6143
+ disabled,
6144
+ style: { width: resolvePaginationInputWidth(size) },
6145
+ onChange: (event) => {
6146
+ setQuickValue(event.target.value.replace(/[^\d]/g, ""));
6147
+ },
6148
+ onPressEnter: () => {
6149
+ handleQuickCommit();
6150
+ },
6151
+ onBlur: () => {
6152
+ handleQuickCommit();
6153
+ }
6154
+ }
6155
+ ),
6156
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${REACT_COMPONENT_PREFIX}-pagination-total`, children: "\u9875" })
6157
+ ] }) : null
6158
+ ]
6159
+ }
6160
+ );
6161
+ }
6162
+ function resolvePaginationSelectWidth(size) {
6163
+ return size === "small" ? 92 : size === "large" ? 120 : 108;
6164
+ }
6165
+ function resolvePaginationInputWidth(size) {
6166
+ return size === "small" ? 56 : size === "large" ? 80 : 72;
6142
6167
  }
6143
6168
  function buildPageItems(current, totalPages, showLessItems) {
6144
6169
  if (totalPages <= 1) {
@@ -8065,9 +8090,364 @@ function resolveDecadeStart6(year) {
8065
8090
  return Math.floor(year / 10) * 10;
8066
8091
  }
8067
8092
 
8093
+ // src/components/compat/style.css
8094
+ 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");
8095
+ function ReactButton({
8096
+ children,
8097
+ className,
8098
+ danger,
8099
+ htmlType = "button",
8100
+ icon,
8101
+ size = "middle",
8102
+ type = "default",
8103
+ ...props
8104
+ }) {
8105
+ return /* @__PURE__ */ jsxRuntime.jsxs(
8106
+ "button",
8107
+ {
8108
+ ...props,
8109
+ type: htmlType,
8110
+ className: joinClassNames(
8111
+ `${REACT_COMPONENT_PREFIX}-button`,
8112
+ `${REACT_COMPONENT_PREFIX}-button-${type}`,
8113
+ `${REACT_COMPONENT_PREFIX}-button-${size}`,
8114
+ danger && `${REACT_COMPONENT_PREFIX}-button-danger`,
8115
+ className
8116
+ ),
8117
+ children: [
8118
+ icon ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${REACT_COMPONENT_PREFIX}-button-icon`, children: icon }) : null,
8119
+ children
8120
+ ]
8121
+ }
8122
+ );
8123
+ }
8124
+ function ReactFlex({
8125
+ vertical,
8126
+ justify,
8127
+ align,
8128
+ gap,
8129
+ style,
8130
+ ...props
8131
+ }) {
8132
+ return /* @__PURE__ */ jsxRuntime.jsx(
8133
+ "div",
8134
+ {
8135
+ ...props,
8136
+ style: {
8137
+ display: "flex",
8138
+ flexDirection: vertical ? "column" : "row",
8139
+ justifyContent: justify,
8140
+ alignItems: align,
8141
+ gap,
8142
+ ...style
8143
+ }
8144
+ }
8145
+ );
8146
+ }
8147
+ function ReactRow({ gutter = 0, style, ...props }) {
8148
+ return /* @__PURE__ */ jsxRuntime.jsx(
8149
+ "div",
8150
+ {
8151
+ ...props,
8152
+ className: joinClassNames(
8153
+ `${REACT_COMPONENT_PREFIX}-row`,
8154
+ props.className
8155
+ ),
8156
+ style: { marginInline: -gutter / 2, ...style }
8157
+ }
8158
+ );
8159
+ }
8160
+ function ReactCol({ span = 24, style, ...props }) {
8161
+ return /* @__PURE__ */ jsxRuntime.jsx(
8162
+ "div",
8163
+ {
8164
+ ...props,
8165
+ className: joinClassNames(
8166
+ `${REACT_COMPONENT_PREFIX}-col`,
8167
+ props.className
8168
+ ),
8169
+ style: {
8170
+ flex: `0 0 ${span / 24 * 100}%`,
8171
+ maxWidth: `${span / 24 * 100}%`,
8172
+ ...style
8173
+ }
8174
+ }
8175
+ );
8176
+ }
8177
+ function ReactTooltip({ title, children }) {
8178
+ return React.cloneElement(children, {
8179
+ title: typeof title === "string" ? title : void 0,
8180
+ "aria-label": typeof title === "string" ? title : void 0
8181
+ });
8182
+ }
8183
+ var RadioGroupContext = React.createContext({});
8184
+ function ReactRadioOption({
8185
+ value,
8186
+ checked,
8187
+ disabled,
8188
+ onChange,
8189
+ children,
8190
+ className,
8191
+ ...props
8192
+ }) {
8193
+ const group = React.useContext(RadioGroupContext);
8194
+ const selected = checked ?? String(group.value ?? "") === String(value);
8195
+ return /* @__PURE__ */ jsxRuntime.jsxs(
8196
+ "label",
8197
+ {
8198
+ ...props,
8199
+ className: joinClassNames(
8200
+ `${REACT_COMPONENT_PREFIX}-radio`,
8201
+ disabled && `${REACT_COMPONENT_PREFIX}-radio-disabled`,
8202
+ className
8203
+ ),
8204
+ children: [
8205
+ /* @__PURE__ */ jsxRuntime.jsx(
8206
+ "input",
8207
+ {
8208
+ type: "radio",
8209
+ checked: selected,
8210
+ disabled,
8211
+ onChange: () => {
8212
+ const event = { target: { value } };
8213
+ onChange?.(event);
8214
+ group.onChange?.(event);
8215
+ }
8216
+ }
8217
+ ),
8218
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${REACT_COMPONENT_PREFIX}-radio-mark` }),
8219
+ /* @__PURE__ */ jsxRuntime.jsx("span", { children })
8220
+ ]
8221
+ }
8222
+ );
8223
+ }
8224
+ function ReactRadioGroup({
8225
+ value,
8226
+ onChange,
8227
+ className,
8228
+ ...props
8229
+ }) {
8230
+ return /* @__PURE__ */ jsxRuntime.jsx(RadioGroupContext.Provider, { value: { value, onChange }, children: /* @__PURE__ */ jsxRuntime.jsx(
8231
+ "div",
8232
+ {
8233
+ ...props,
8234
+ className: joinClassNames(
8235
+ `${REACT_COMPONENT_PREFIX}-radio-group`,
8236
+ className
8237
+ )
8238
+ }
8239
+ ) });
8240
+ }
8241
+ var ReactRadio = Object.assign(ReactRadioOption, {
8242
+ Group: ReactRadioGroup
8243
+ });
8244
+ function ReactTextArea({ className, ...props }) {
8245
+ return /* @__PURE__ */ jsxRuntime.jsx(
8246
+ "textarea",
8247
+ {
8248
+ ...props,
8249
+ className: joinClassNames(
8250
+ `${REACT_COMPONENT_PREFIX}-textarea`,
8251
+ className
8252
+ )
8253
+ }
8254
+ );
8255
+ }
8256
+ function createFormInstance() {
8257
+ const store = {
8258
+ values: {},
8259
+ initialValues: {},
8260
+ errors: {},
8261
+ rules: /* @__PURE__ */ new Map(),
8262
+ listeners: /* @__PURE__ */ new Set(),
8263
+ revision: 0,
8264
+ notify() {
8265
+ store.revision += 1;
8266
+ store.listeners.forEach((listener) => listener());
8267
+ }
8268
+ };
8269
+ return {
8270
+ __store: store,
8271
+ getFieldValue: (name) => store.values[name],
8272
+ setFieldsValue(values) {
8273
+ store.values = { ...store.values, ...values };
8274
+ Object.keys(values).forEach((name) => {
8275
+ delete store.errors[name];
8276
+ });
8277
+ store.notify();
8278
+ },
8279
+ resetFields() {
8280
+ store.values = { ...store.initialValues };
8281
+ store.errors = {};
8282
+ store.notify();
8283
+ },
8284
+ async validateFields() {
8285
+ const errors = {};
8286
+ for (const [name, rules] of store.rules) {
8287
+ const value = store.values[name];
8288
+ for (const rawRule of rules) {
8289
+ const rule = typeof rawRule === "function" ? rawRule({ getFieldValue: (field) => store.values[field] }) : rawRule;
8290
+ if (rule.required && (value === void 0 || value === null || value === "")) {
8291
+ errors[name] = rule.message ?? "\u6B64\u9879\u4E3A\u5FC5\u586B\u9879";
8292
+ break;
8293
+ }
8294
+ if ((rule.type === "number" || rule.type === "integer") && typeof value === "number" && rule.min !== void 0 && value < rule.min) {
8295
+ errors[name] = rule.message ?? `\u4E0D\u80FD\u5C0F\u4E8E ${rule.min}`;
8296
+ break;
8297
+ }
8298
+ if ((rule.type === "number" || rule.type === "integer") && typeof value === "number" && rule.max !== void 0 && value > rule.max) {
8299
+ errors[name] = rule.message ?? `\u4E0D\u80FD\u5927\u4E8E ${rule.max}`;
8300
+ break;
8301
+ }
8302
+ if (rule.type === "integer" && typeof value === "number" && !Number.isInteger(value)) {
8303
+ errors[name] = rule.message ?? "\u8BF7\u8F93\u5165\u6574\u6570";
8304
+ break;
8305
+ }
8306
+ if (rule.validator) {
8307
+ try {
8308
+ await rule.validator(rule, value);
8309
+ } catch (error) {
8310
+ errors[name] = error instanceof Error ? error.message : "\u6821\u9A8C\u5931\u8D25";
8311
+ break;
8312
+ }
8313
+ }
8314
+ }
8315
+ }
8316
+ store.errors = errors;
8317
+ store.notify();
8318
+ if (Object.keys(errors).length > 0) {
8319
+ return Promise.reject({
8320
+ errorFields: errors,
8321
+ values: { ...store.values }
8322
+ });
8323
+ }
8324
+ return { ...store.values };
8325
+ }
8326
+ };
8327
+ }
8328
+ function useReactForm() {
8329
+ const formRef = React.useRef();
8330
+ if (!formRef.current) formRef.current = createFormInstance();
8331
+ return [formRef.current];
8332
+ }
8333
+ function useReactFormWatch(name, form) {
8334
+ return React.useSyncExternalStore(
8335
+ (listener) => {
8336
+ form.__store.listeners.add(listener);
8337
+ return () => form.__store.listeners.delete(listener);
8338
+ },
8339
+ () => form.__store.revision,
8340
+ () => 0
8341
+ ) >= 0 ? form.getFieldValue(name) : void 0;
8342
+ }
8343
+ var FormContext = React.createContext(null);
8344
+ function ReactFormRoot({
8345
+ form,
8346
+ initialValues,
8347
+ layout = "vertical",
8348
+ className,
8349
+ children,
8350
+ ...props
8351
+ }) {
8352
+ const initialKey = React.useMemo(
8353
+ () => JSON.stringify(initialValues ?? {}),
8354
+ [initialValues]
8355
+ );
8356
+ React.useEffect(() => {
8357
+ form.__store.initialValues = { ...initialValues };
8358
+ form.__store.values = { ...initialValues, ...form.__store.values };
8359
+ form.__store.notify();
8360
+ }, [form, initialKey]);
8361
+ return /* @__PURE__ */ jsxRuntime.jsx(FormContext.Provider, { value: form, children: /* @__PURE__ */ jsxRuntime.jsx(
8362
+ "form",
8363
+ {
8364
+ ...props,
8365
+ className: joinClassNames(
8366
+ `${REACT_COMPONENT_PREFIX}-form`,
8367
+ `${REACT_COMPONENT_PREFIX}-form-${layout}`,
8368
+ className
8369
+ ),
8370
+ onSubmit: (event) => event.preventDefault(),
8371
+ children
8372
+ }
8373
+ ) });
8374
+ }
8375
+ function ReactFormItem({
8376
+ label,
8377
+ name,
8378
+ children,
8379
+ rules = [],
8380
+ initialValue
8381
+ }) {
8382
+ const form = React.useContext(FormContext);
8383
+ if (!form) throw new Error("ReactForm.Item \u5FC5\u987B\u5728 ReactForm \u5185\u4F7F\u7528");
8384
+ React.useSyncExternalStore(
8385
+ (listener) => {
8386
+ form.__store.listeners.add(listener);
8387
+ return () => form.__store.listeners.delete(listener);
8388
+ },
8389
+ () => form.__store.revision,
8390
+ () => 0
8391
+ );
8392
+ React.useEffect(() => {
8393
+ form.__store.rules.set(name, rules);
8394
+ if (form.getFieldValue(name) === void 0 && initialValue !== void 0) {
8395
+ form.setFieldsValue({ [name]: initialValue });
8396
+ }
8397
+ return () => {
8398
+ form.__store.rules.delete(name);
8399
+ };
8400
+ }, [form, initialValue, name, rules]);
8401
+ const childProps = children.props;
8402
+ const value = form.getFieldValue(name);
8403
+ return /* @__PURE__ */ jsxRuntime.jsxs("label", { className: `${REACT_COMPONENT_PREFIX}-form-item`, children: [
8404
+ label ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${REACT_COMPONENT_PREFIX}-form-label`, children: label }) : null,
8405
+ React.cloneElement(children, {
8406
+ value: value ?? "",
8407
+ onChange: (...args) => {
8408
+ const first = args[0];
8409
+ const nextValue = typeof first === "object" && first !== null && "target" in first ? first.target?.value : first;
8410
+ form.setFieldsValue({ [name]: nextValue });
8411
+ const childOnChange = childProps.onChange;
8412
+ if (typeof childOnChange === "function") childOnChange(...args);
8413
+ }
8414
+ }),
8415
+ form.__store.errors[name] ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: `${REACT_COMPONENT_PREFIX}-form-error`, children: form.__store.errors[name] }) : null
8416
+ ] });
8417
+ }
8418
+ var ReactForm = Object.assign(ReactFormRoot, {
8419
+ Item: ReactFormItem,
8420
+ useForm: useReactForm,
8421
+ useWatch: useReactFormWatch
8422
+ });
8423
+ function showMessage(type, content) {
8424
+ if (typeof document === "undefined") return;
8425
+ const hostId = `${REACT_COMPONENT_PREFIX}-message-host`;
8426
+ let host = document.getElementById(hostId);
8427
+ if (!host) {
8428
+ host = document.createElement("div");
8429
+ host.id = hostId;
8430
+ host.className = hostId;
8431
+ document.body.appendChild(host);
8432
+ }
8433
+ const item = document.createElement("div");
8434
+ item.className = `${REACT_COMPONENT_PREFIX}-message ${REACT_COMPONENT_PREFIX}-message-${type}`;
8435
+ item.textContent = typeof content === "string" ? content : String(content ?? "");
8436
+ host.appendChild(item);
8437
+ window.setTimeout(() => item.remove(), 3e3);
8438
+ }
8439
+ var reactMessage = {
8440
+ info: (content) => showMessage("info", content),
8441
+ success: (content) => showMessage("success", content),
8442
+ warning: (content) => showMessage("warning", content),
8443
+ error: (content) => showMessage("error", content)
8444
+ };
8445
+
8068
8446
  exports.REACT_COMPONENT_PREFIX = REACT_COMPONENT_PREFIX;
8069
8447
  exports.ReactAutoComplete = ReactAutoComplete;
8448
+ exports.ReactButton = ReactButton;
8070
8449
  exports.ReactCheckbox = ReactCheckbox;
8450
+ exports.ReactCol = ReactCol;
8071
8451
  exports.ReactColorPicker = ReactColorPicker;
8072
8452
  exports.ReactContentScaleProvider = ReactContentScaleProvider;
8073
8453
  exports.ReactDatePicker = ReactDatePicker;
@@ -8075,6 +8455,8 @@ exports.ReactDateRangePicker = ReactDateRangePicker;
8075
8455
  exports.ReactDateTimePicker = ReactDateTimePicker;
8076
8456
  exports.ReactDateTimeRangePicker = ReactDateTimeRangePicker;
8077
8457
  exports.ReactFilterPanel = ReactFilterPanel;
8458
+ exports.ReactFlex = ReactFlex;
8459
+ exports.ReactForm = ReactForm;
8078
8460
  exports.ReactImagePreview = ReactImagePreview;
8079
8461
  exports.ReactInput = ReactInput;
8080
8462
  exports.ReactInputNumber = ReactInputNumber;
@@ -8086,15 +8468,22 @@ exports.ReactPagination = ReactPagination;
8086
8468
  exports.ReactPopconfirm = ReactPopconfirm;
8087
8469
  exports.ReactPopup = ReactPopup;
8088
8470
  exports.ReactQuarterPicker = ReactQuarterPicker;
8471
+ exports.ReactRadio = ReactRadio;
8089
8472
  exports.ReactResizablePanels = ReactResizablePanels;
8473
+ exports.ReactRow = ReactRow;
8090
8474
  exports.ReactSelect = ReactSelect;
8475
+ exports.ReactTextArea = ReactTextArea;
8091
8476
  exports.ReactTimePicker = ReactTimePicker;
8092
8477
  exports.ReactTimeRangePicker = ReactTimeRangePicker;
8478
+ exports.ReactTooltip = ReactTooltip;
8093
8479
  exports.ReactTransition = ReactTransition;
8094
8480
  exports.ReactVirtualList = ReactVirtualList;
8095
8481
  exports.ReactYearPicker = ReactYearPicker;
8482
+ exports.reactMessage = reactMessage;
8096
8483
  exports.resolveResizablePanelSizes = resolveResizablePanelSizes;
8097
8484
  exports.useReactContentScale = useReactContentScale;
8485
+ exports.useReactForm = useReactForm;
8486
+ exports.useReactFormWatch = useReactFormWatch;
8098
8487
  exports.useReactTransition = useReactTransition;
8099
8488
  //# sourceMappingURL=index.cjs.map
8100
8489
  //# sourceMappingURL=index.cjs.map