@wipco/sdui 0.20.0 → 0.22.0

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.
@@ -0,0 +1,133 @@
1
+ import { boxed } from './chunk-SAN4IX6N.js';
2
+ import { useState } from 'react';
3
+ import { jsx, jsxs } from 'react/jsx-runtime';
4
+
5
+ var RECORD_SHEET_CSS = `
6
+ .erp-recsheet__scroll{overflow-x:auto;min-width:0}
7
+ .erp-recsheet{width:100%;min-width:44rem;border-collapse:collapse;table-layout:fixed;font-size:var(--wp-size-sm)}
8
+ .erp-recsheet td{height:var(--wp-row-h-dense);border:var(--wp-border-w) solid var(--wp-border-default);padding:var(--wp-space-1) var(--wp-space-2);color:var(--wp-text-default);vertical-align:middle;line-height:var(--wp-leading-snug);overflow-wrap:anywhere}
9
+ .erp-recsheet td.erp-recsheet__title{background:var(--wp-surface-inverse);color:var(--wp-text-inverse);text-align:center;font-size:var(--wp-size-lg);font-weight:var(--wp-weight-semibold);letter-spacing:var(--wp-tracking-heading);padding:var(--wp-space-3) var(--wp-space-2)}
10
+ .erp-recsheet td.erp-recsheet__label{background:var(--wp-surface-sunken);color:var(--wp-text-subtle);font-size:var(--wp-size-xs);font-weight:var(--wp-weight-semibold);text-align:center;white-space:nowrap}
11
+ .erp-recsheet td.erp-recsheet__section{background:var(--wp-surface-brand-tint);border-top:var(--wp-border-w-strong) solid var(--wp-border-brand);color:var(--wp-text-brand);font-size:var(--wp-size-xs);font-weight:var(--wp-weight-semibold);letter-spacing:var(--wp-tracking-heading)}
12
+ .erp-recsheet tr.erp-recsheet__gap td{border:0;padding:0;height:var(--wp-space-3)}
13
+ .erp-recsheet td.erp-recsheet__mono{font-family:var(--wp-font-mono);font-size:var(--wp-size-xs)}
14
+ .erp-recsheet td.erp-recsheet__photo{background:var(--wp-surface-sunken);padding:var(--wp-space-2);text-align:center}
15
+ .erp-recsheet__img{display:block;width:100%;height:11rem;object-fit:cover;border-radius:var(--wp-radius-sm)}
16
+ .erp-recsheet__noimg{display:flex;align-items:center;justify-content:center;width:100%;height:11rem;border:var(--wp-border-w) dashed var(--wp-border-default);border-radius:var(--wp-radius-sm);color:var(--wp-text-disabled);font-size:var(--wp-size-xs)}
17
+ .erp-recsheet__note{margin:var(--wp-space-2) 0 0;text-align:right;color:var(--wp-text-subtle);font-size:var(--wp-size-xs)}
18
+ @media print{
19
+ .erp-recsheet__scroll{overflow-x:visible}
20
+ .erp-recsheet{min-width:0}
21
+ .erp-recsheet tr{break-inside:avoid}
22
+ }
23
+ `;
24
+ function RecordSheetStyles() {
25
+ return /* @__PURE__ */ jsx("style", { href: "erp-recsheet", precedence: "medium", children: RECORD_SHEET_CSS });
26
+ }
27
+ function gridColumns(columns) {
28
+ if (typeof columns !== "number" || !Number.isFinite(columns)) return 24;
29
+ return Math.min(60, Math.max(1, Math.floor(columns)));
30
+ }
31
+ function cellClass(cell) {
32
+ const classes = [];
33
+ if (cell.kind === "label") classes.push("erp-recsheet__label");
34
+ else if (cell.kind === "section") classes.push("erp-recsheet__section");
35
+ else if (cell.kind === "photo") classes.push("erp-recsheet__photo");
36
+ if (cell.mono) classes.push("erp-recsheet__mono");
37
+ return classes.length > 0 ? classes.join(" ") : void 0;
38
+ }
39
+ function isBlank(value) {
40
+ return value === null || value === void 0 || value === "";
41
+ }
42
+ function pickValue(cell, item) {
43
+ if (!item || typeof item !== "object") return void 0;
44
+ const row = item;
45
+ if (cell.fields && cell.fields.length > 0) {
46
+ const parts = cell.fields.map((name) => isBlank(row[name]) ? "" : String(row[name]));
47
+ if (parts.every((part) => part === "")) return void 0;
48
+ return parts.join(cell.separator ?? " ~ ");
49
+ }
50
+ if (cell.field) return row[cell.field];
51
+ return void 0;
52
+ }
53
+ function PhotoCell({ src, alt }) {
54
+ const [failed, setFailed] = useState(false);
55
+ const label = alt ?? "\uC0AC\uC9C4";
56
+ if (!src || failed) return /* @__PURE__ */ jsx("span", { className: "erp-recsheet__noimg", children: label });
57
+ return /* @__PURE__ */ jsx("img", { className: "erp-recsheet__img", src, alt: label, onError: () => setFailed(true) });
58
+ }
59
+ function cellContent(cell, item, repeated) {
60
+ if (cell.kind === "photo") return /* @__PURE__ */ jsx(PhotoCell, { src: cell.src, alt: cell.alt });
61
+ if (!repeated) {
62
+ if (!isBlank(cell.text)) return cell.text;
63
+ if (cell.kind === "label" || cell.kind === "section") return null;
64
+ return cell.placeholder ?? "-";
65
+ }
66
+ const value = pickValue(cell, item);
67
+ if (!isBlank(value)) return value;
68
+ return item ? cell.placeholder ?? "-" : null;
69
+ }
70
+ function renderCells(cells, items, keyPrefix) {
71
+ return cells.map((cell, index) => {
72
+ const item = items ? items[cell.source ?? 0] ?? null : null;
73
+ return /* @__PURE__ */ jsx(
74
+ "td",
75
+ {
76
+ className: cellClass(cell),
77
+ colSpan: cell.span && cell.span > 1 ? cell.span : void 0,
78
+ rowSpan: cell.rowSpan && cell.rowSpan > 1 ? cell.rowSpan : void 0,
79
+ style: cell.align && cell.align !== "left" ? { textAlign: cell.align } : void 0,
80
+ children: cellContent(cell, item, items !== null)
81
+ },
82
+ `${keyPrefix}-${index}`
83
+ );
84
+ });
85
+ }
86
+ function repeatLength(sources, minRows) {
87
+ const longest = sources.reduce((max, source) => Math.max(max, source.length), 0);
88
+ return Math.max(longest, Math.max(0, Math.floor(minRows ?? 0)));
89
+ }
90
+ function RecordSheetImpl({ columns, title, rows, note }) {
91
+ const width = gridColumns(columns);
92
+ const list = Array.isArray(rows) ? rows : [];
93
+ const body = [];
94
+ list.forEach((row, rowIndex) => {
95
+ if (row?.gap) {
96
+ body.push(
97
+ /* @__PURE__ */ jsx("tr", { className: "erp-recsheet__gap", children: /* @__PURE__ */ jsx("td", { colSpan: width }) }, `gap-${rowIndex}`)
98
+ );
99
+ return;
100
+ }
101
+ const cells = Array.isArray(row?.cells) ? row.cells : [];
102
+ if (cells.length === 0) return;
103
+ if (Array.isArray(row.repeat)) {
104
+ const sources = row.repeat.map((source) => Array.isArray(source) ? source : []);
105
+ const count = repeatLength(sources, row.minRows);
106
+ for (let line = 0; line < count; line += 1) {
107
+ body.push(
108
+ /* @__PURE__ */ jsx("tr", { children: renderCells(
109
+ cells,
110
+ sources.map((source) => source[line] ?? null),
111
+ `rep-${rowIndex}-${line}`
112
+ ) }, `rep-${rowIndex}-${line}`)
113
+ );
114
+ }
115
+ return;
116
+ }
117
+ body.push(/* @__PURE__ */ jsx("tr", { children: renderCells(cells, null, `row-${rowIndex}`) }, `row-${rowIndex}`));
118
+ });
119
+ return /* @__PURE__ */ jsxs("div", { className: "erp-recsheet__scroll", children: [
120
+ /* @__PURE__ */ jsx(RecordSheetStyles, {}),
121
+ /* @__PURE__ */ jsxs("table", { className: "erp-recsheet", children: [
122
+ /* @__PURE__ */ jsx("colgroup", { children: Array.from({ length: width }, (_, index) => /* @__PURE__ */ jsx("col", { style: { width: `${100 / width}%` } }, index)) }),
123
+ /* @__PURE__ */ jsxs("tbody", { children: [
124
+ title ? /* @__PURE__ */ jsx("tr", { children: /* @__PURE__ */ jsx("td", { className: "erp-recsheet__title", colSpan: width, children: title }) }) : null,
125
+ body
126
+ ] })
127
+ ] }),
128
+ note ? /* @__PURE__ */ jsx("p", { className: "erp-recsheet__note", children: note }) : null
129
+ ] });
130
+ }
131
+ var RecordSheet = boxed(RecordSheetImpl, "RecordSheet");
132
+
133
+ export { RecordSheet };
@@ -1,102 +1,9 @@
1
1
  import { useDismiss, usePopoverAnchor, usePortalTo, HoistedStyle, AnchoredPopoverStyles, anchorStyle, focusStaysInside } from './chunk-XKLUCUVA.js';
2
2
  import { Icon } from './chunk-WIDDHR7L.js';
3
3
  import { boxed } from './chunk-SAN4IX6N.js';
4
- import { createContext, useState, useRef, useEffect, useMemo, useCallback, useContext } from 'react';
4
+ import { useState, useRef, useEffect, useMemo, useCallback } from 'react';
5
5
  import { jsxs, jsx } from 'react/jsx-runtime';
6
6
 
7
- // src/env.ts
8
- var DEV = (() => {
9
- try {
10
- const meta = import.meta;
11
- return Boolean(meta.env?.DEV);
12
- } catch {
13
- return false;
14
- }
15
- })();
16
-
17
- // src/adapter.ts
18
- function isSafeNavigationTarget(to) {
19
- if (typeof to !== "string") return false;
20
- const value = to.replace(/[\u0000-\u0020]/g, "");
21
- if (value === "") return false;
22
- if (value.startsWith("//")) return false;
23
- if (value.startsWith("/") || value.startsWith("?") || value.startsWith("#")) return true;
24
- return /^https?:\/\//i.test(value);
25
- }
26
- async function defaultFetch(path, init) {
27
- const response = await fetch(path, {
28
- method: init.method,
29
- headers: { "content-type": "application/json", accept: "application/json" },
30
- credentials: "include",
31
- body: init.body === void 0 ? void 0 : JSON.stringify(init.body),
32
- signal: init.signal
33
- });
34
- const text = await response.text();
35
- let json = null;
36
- if (text) {
37
- try {
38
- json = JSON.parse(text);
39
- } catch {
40
- json = null;
41
- }
42
- }
43
- if (!response.ok) {
44
- const message = json && typeof json === "object" && typeof json.message === "string" ? json.message : `\uC694\uCCAD\uC774 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4 (${response.status})`;
45
- throw new Error(message);
46
- }
47
- return json;
48
- }
49
- var defaultAdapter = {
50
- navigate: (to) => {
51
- if (!isSafeNavigationTarget(to)) {
52
- console.error(`[sdui] \uD5C8\uC6A9\uB418\uC9C0 \uC54A\uB294 navigate \uB300\uC0C1: ${String(to)}`);
53
- return;
54
- }
55
- window.location.assign(to);
56
- },
57
- fetch: defaultFetch,
58
- rawFetch: (path) => fetch(path, { credentials: "include" }),
59
- // 항등함수. 계약을 문서화하고, 컴포넌트가 `useSduiAssetResolver()`를 조건 없이
60
- // 부를 수 있게 하는 것이 전부다. **이 함수 참조 자체가 표식**이기도 하다 —
61
- // `assetResolverOf`가 이것과 같은지 보고 "주입 없음"을 판정한다.
62
- resolveAsset: (url) => url,
63
- invalidate: (prefix) => {
64
- if (DEV) console.warn(`[sdui] invalidate \uC561\uC158\uC774 \uC5B4\uB311\uD130 \uC5C6\uC774 \uD638\uCD9C\uB428 (prefix: ${prefix})`);
65
- },
66
- refresh: () => {
67
- if (DEV) console.warn("[sdui] refresh \uC561\uC158\uC774 \uC5B4\uB311\uD130 \uC5C6\uC774 \uD638\uCD9C\uB428");
68
- }
69
- };
70
- function resolveAdapter(adapter) {
71
- const merged = { ...defaultAdapter };
72
- if (adapter) {
73
- for (const [key, value] of Object.entries(adapter)) {
74
- if (value !== void 0) merged[key] = value;
75
- }
76
- }
77
- return merged;
78
- }
79
- var SduiAdapterContext = createContext(null);
80
- function useSduiAdapter() {
81
- return useContext(SduiAdapterContext);
82
- }
83
- function assetResolverOf(adapter) {
84
- const resolve = adapter?.resolveAsset;
85
- if (!resolve || resolve === defaultAdapter.resolveAsset) return null;
86
- return resolve;
87
- }
88
- function useSduiAssetResolver() {
89
- const adapter = useContext(SduiAdapterContext);
90
- return adapter?.resolveAsset ?? defaultAdapter.resolveAsset;
91
- }
92
- function useSduiSandbox() {
93
- return useContext(SduiAdapterContext)?.sandbox === true;
94
- }
95
- function hostFetchOf(adapter) {
96
- const hostFetch = adapter?.fetch;
97
- if (!hostFetch || hostFetch === defaultAdapter.fetch) return null;
98
- return hostFetch;
99
- }
100
7
  var HM_RE = /^\d{2}:\d{2}$/;
101
8
  var LIST_HEIGHT = 260;
102
9
  var MINUTES_PER_DAY = 24 * 60;
@@ -288,4 +195,4 @@ var TP_CSS = `
288
195
  `;
289
196
  var TimePicker = boxed(TimePickerImpl, "TimePicker");
290
197
 
291
- export { DEV, SduiAdapterContext, TimePicker, assetResolverOf, defaultAdapter, hostFetchOf, isSafeNavigationTarget, resolveAdapter, useSduiAdapter, useSduiAssetResolver, useSduiSandbox };
198
+ export { TimePicker };
@@ -0,0 +1,99 @@
1
+ import { createContext, useContext } from 'react';
2
+
3
+ // src/adapter.ts
4
+
5
+ // src/env.ts
6
+ var DEV = (() => {
7
+ try {
8
+ const meta = import.meta;
9
+ return Boolean(meta.env?.DEV);
10
+ } catch {
11
+ return false;
12
+ }
13
+ })();
14
+
15
+ // src/adapter.ts
16
+ function isSafeNavigationTarget(to) {
17
+ if (typeof to !== "string") return false;
18
+ const value = to.replace(/[\u0000-\u0020]/g, "");
19
+ if (value === "") return false;
20
+ if (value.startsWith("//")) return false;
21
+ if (value.startsWith("/") || value.startsWith("?") || value.startsWith("#")) return true;
22
+ return /^https?:\/\//i.test(value);
23
+ }
24
+ async function defaultFetch(path, init) {
25
+ const response = await fetch(path, {
26
+ method: init.method,
27
+ headers: { "content-type": "application/json", accept: "application/json" },
28
+ credentials: "include",
29
+ body: init.body === void 0 ? void 0 : JSON.stringify(init.body),
30
+ signal: init.signal
31
+ });
32
+ const text = await response.text();
33
+ let json = null;
34
+ if (text) {
35
+ try {
36
+ json = JSON.parse(text);
37
+ } catch {
38
+ json = null;
39
+ }
40
+ }
41
+ if (!response.ok) {
42
+ const message = json && typeof json === "object" && typeof json.message === "string" ? json.message : `\uC694\uCCAD\uC774 \uC2E4\uD328\uD588\uC2B5\uB2C8\uB2E4 (${response.status})`;
43
+ throw new Error(message);
44
+ }
45
+ return json;
46
+ }
47
+ var defaultAdapter = {
48
+ navigate: (to) => {
49
+ if (!isSafeNavigationTarget(to)) {
50
+ console.error(`[sdui] \uD5C8\uC6A9\uB418\uC9C0 \uC54A\uB294 navigate \uB300\uC0C1: ${String(to)}`);
51
+ return;
52
+ }
53
+ window.location.assign(to);
54
+ },
55
+ fetch: defaultFetch,
56
+ rawFetch: (path) => fetch(path, { credentials: "include" }),
57
+ // 항등함수. 계약을 문서화하고, 컴포넌트가 `useSduiAssetResolver()`를 조건 없이
58
+ // 부를 수 있게 하는 것이 전부다. **이 함수 참조 자체가 표식**이기도 하다 —
59
+ // `assetResolverOf`가 이것과 같은지 보고 "주입 없음"을 판정한다.
60
+ resolveAsset: (url) => url,
61
+ invalidate: (prefix) => {
62
+ if (DEV) console.warn(`[sdui] invalidate \uC561\uC158\uC774 \uC5B4\uB311\uD130 \uC5C6\uC774 \uD638\uCD9C\uB428 (prefix: ${prefix})`);
63
+ },
64
+ refresh: () => {
65
+ if (DEV) console.warn("[sdui] refresh \uC561\uC158\uC774 \uC5B4\uB311\uD130 \uC5C6\uC774 \uD638\uCD9C\uB428");
66
+ }
67
+ };
68
+ function resolveAdapter(adapter) {
69
+ const merged = { ...defaultAdapter };
70
+ if (adapter) {
71
+ for (const [key, value] of Object.entries(adapter)) {
72
+ if (value !== void 0) merged[key] = value;
73
+ }
74
+ }
75
+ return merged;
76
+ }
77
+ var SduiAdapterContext = createContext(null);
78
+ function useSduiAdapter() {
79
+ return useContext(SduiAdapterContext);
80
+ }
81
+ function assetResolverOf(adapter) {
82
+ const resolve = adapter?.resolveAsset;
83
+ if (!resolve || resolve === defaultAdapter.resolveAsset) return null;
84
+ return resolve;
85
+ }
86
+ function useSduiAssetResolver() {
87
+ const adapter = useContext(SduiAdapterContext);
88
+ return adapter?.resolveAsset ?? defaultAdapter.resolveAsset;
89
+ }
90
+ function useSduiSandbox() {
91
+ return useContext(SduiAdapterContext)?.sandbox === true;
92
+ }
93
+ function hostFetchOf(adapter) {
94
+ const hostFetch = adapter?.fetch;
95
+ if (!hostFetch || hostFetch === defaultAdapter.fetch) return null;
96
+ return hostFetch;
97
+ }
98
+
99
+ export { DEV, SduiAdapterContext, assetResolverOf, defaultAdapter, hostFetchOf, isSafeNavigationTarget, resolveAdapter, useSduiAdapter, useSduiAssetResolver, useSduiSandbox };
@@ -1,9 +1,24 @@
1
1
  import { includesLooseSearch } from './chunk-U7ZK7WYH.js';
2
+ import { useSduiAdapter, hostFetchOf } from './chunk-WGRB5UL4.js';
2
3
  import { Icon, Button, Input, Spinner } from './chunk-WIDDHR7L.js';
3
4
  import { boxed } from './chunk-SAN4IX6N.js';
4
- import { useId, useRef, useState, useEffect, useMemo } from 'react';
5
+ import { useId, useRef, useMemo, useState, useEffect } from 'react';
5
6
  import { jsxs, jsx } from 'react/jsx-runtime';
6
7
 
8
+ function endpointSearchFn(endpoint, searchParam, hostFetch) {
9
+ return async (keyword, signal) => {
10
+ const sep = endpoint.includes("?") ? "&" : "?";
11
+ const url = `${endpoint}${sep}${searchParam}=${encodeURIComponent(keyword)}`;
12
+ try {
13
+ return toAutocompleteOptions(await hostFetch(url, { method: "GET", signal }));
14
+ } catch (error) {
15
+ if (error?.status === 503) {
16
+ return { options: [], status: "offline" };
17
+ }
18
+ throw error;
19
+ }
20
+ };
21
+ }
7
22
  function isRecord(value) {
8
23
  return typeof value === "object" && value !== null && !Array.isArray(value);
9
24
  }
@@ -34,6 +49,8 @@ var statusRowStyle = {
34
49
  };
35
50
  function AutocompleteFieldImpl({
36
51
  search,
52
+ endpoint,
53
+ searchParam = "q",
37
54
  options,
38
55
  labelKey = "label",
39
56
  valueKey = "value",
@@ -52,9 +69,17 @@ function AutocompleteFieldImpl({
52
69
  const seqRef = useRef(0);
53
70
  const optionsRef = useRef(options);
54
71
  optionsRef.current = options;
55
- const searchRef = useRef(search);
56
- searchRef.current = search;
57
- const hasSearch = search !== void 0;
72
+ const adapter = useSduiAdapter();
73
+ const endpointSearch = useMemo(() => {
74
+ if (!endpoint) return void 0;
75
+ const hostFetch = hostFetchOf(adapter);
76
+ if (!hostFetch) return void 0;
77
+ return endpointSearchFn(endpoint, searchParam, hostFetch);
78
+ }, [endpoint, searchParam, adapter]);
79
+ const effectiveSearch = search ?? endpointSearch;
80
+ const searchRef = useRef(effectiveSearch);
81
+ searchRef.current = effectiveSearch;
82
+ const hasSearch = effectiveSearch !== void 0;
58
83
  const isControlled = value !== void 0;
59
84
  const [internalValue, setInternalValue] = useState("");
60
85
  const committed = (isControlled ? value : internalValue) ?? "";
@@ -298,4 +323,4 @@ function AutocompleteFieldImpl({
298
323
  }
299
324
  var AutocompleteField = boxed(AutocompleteFieldImpl, "AutocompleteField");
300
325
 
301
- export { AutocompleteField, toAutocompleteOptions };
326
+ export { AutocompleteField, endpointSearchFn, toAutocompleteOptions };
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import * as React from 'react';
2
2
  import React__default, { CSSProperties, ReactNode, ComponentType } from 'react';
3
- import { S as SduiPage, a as SduiAction, b as SduiPropValue, c as SduiRule } from './types-opTPYysN.js';
4
- export { d as SduiArgRef, e as SduiCalcRef, f as SduiChild, g as SduiIndexRef, h as SduiItemRef, i as SduiNode, j as SduiPageQuery, k as SduiScalar, l as SduiStateRef } from './types-opTPYysN.js';
3
+ import { S as SduiPage, a as SduiAction, b as SduiPropValue, c as SduiRule } from './types-BNdv5-jn.js';
4
+ export { d as SduiArgRef, e as SduiCalcRef, f as SduiChild, g as SduiIndexRef, h as SduiItemRef, i as SduiNode, j as SduiPageQuery, k as SduiScalar, l as SduiStateRef } from './types-BNdv5-jn.js';
5
5
  import { S as SduiBoxProps, a as SduiContainerLayoutProps, b as SduiColumnsScale, c as SduiGapScale, d as SduiWeightScale, e as SduiTextAlignScale } from './layout-B1QrIBm6.js';
6
6
  export { C as CHILD_LAYOUT_PROPS, L as LAYOUT_CSS, f as SduiAlignScale, g as SduiChildLayoutProps, h as SduiSizeScale, i as SduiSpanScale, j as childLayoutFrom, k as columnsClass, l as containerLayoutStyle, m as joinClass, n as mergeStyle, t as typographyStyle } from './layout-B1QrIBm6.js';
7
7
  import { D as DatePickerProps, a as DateRangePickerProps, T as TimePickerProps } from './DatePicker-D2EtpvkQ.js';
@@ -1677,6 +1677,12 @@ interface SduiRendererProps {
1677
1677
  */
1678
1678
  declare function SduiRenderer({ page, registry, adapter, syncUrlState, initialState, can, onCustomAction, customValidators, }: SduiRendererProps): React__default.JSX.Element;
1679
1679
 
1680
+ /**
1681
+ * 어휘 전체. **렌더러와 편집기 검증기가 같은 이 집합을 본다** — 목록이 두 벌이면
1682
+ * 한쪽에만 연산을 더했을 때 "렌더는 되는데 저장이 거부되는" 스펙이 생긴다.
1683
+ */
1684
+ declare const CALC_OPS: ReadonlySet<string>;
1685
+
1680
1686
  /**
1681
1687
  * 스펙 구조 검증기 — 서버(또는 편집기)가 만든 스펙의 형태 오류를 렌더 전에 찾아낸다.
1682
1688
  * 렌더러는 개발 모드에서 이 결과를 콘솔에 경고하고, 관리자 편집기는
@@ -1831,4 +1837,4 @@ interface ImageViewerProps {
1831
1837
  */
1832
1838
  declare function ImageViewer({ src, alt, open, onClose }: ImageViewerProps): React__default.ReactPortal | null;
1833
1839
 
1834
- export { Actions, type ActionsProps, Alert, type AlertProps, Avatar, type AvatarProps, Badge, type BadgeProps, type BadgeTone, Breadcrumb, type BreadcrumbItem, type BreadcrumbProps, Button, type ButtonProps, Can, type CanProps, Card, type CardProps, type CascadingSearchOption, Checkbox, type CheckboxProps, Col, type ColProps, type CustomActionHandler, type CustomValidator, DatePickerProps, DateRangePickerProps, Dialog, type DialogProps, Divider, EmptyState, type EmptyStateProps, Field, type FieldProps, Grid, type GridCardConfig, type GridCardRow, type GridProps, Icon, IconButton, type IconButtonProps, type IconProps, ImageViewer, type ImageViewerProps, Input, type InputProps, type Justify, type KeyValueItem, KeyValueList, type KeyValueListProps, type MeterTone, NodeErrorBoundary, OverlayContainerContext, OverlayLayer, PageHead, type PageHeadProps, Pagination, type PaginationProps, ProgressBar, type ProgressBarProps, Radio, type RadioProps, RemoteSearchResults, type RemoteSearchResultsProps, ResultTable, type ResultTableColumn, type ResultTableProps, Row, type RowProps, SduiAction, type SduiAdapter, type SduiAssetContext, type SduiAssetResolver, type SduiBadgeCell, SduiBoxProps, type SduiCanFn, type SduiCanQuery, type SduiCanSetting, type SduiCell, SduiColumnsScale, SduiContainerLayoutProps, type SduiDateCell, SduiDialog, type SduiDispatch, SduiForm, type SduiFormConfig, type SduiFormProps, SduiGapScale, type SduiGridCard, type SduiGridCardAction, type SduiGridCardRow, type SduiIconCell, type SduiImageCell, type SduiLinkCell, type SduiNumberCell, SduiPage, SduiPermissionProvider, type SduiProgressCell, SduiPropValue, type SduiRegistry, SduiRenderer, type SduiRendererProps, type SduiRowCondition, SduiRule, type SduiRuntime, type SduiSearchAction, type SduiSearchColumn, SduiSearchDataProvider, SduiSearchResults, type SduiSearchResultsProps, type SduiTagCell, SduiTextAlignScale, type SduiTextCell, type SduiUseSpec, SduiWeightScale, type SearchAction, type SearchColumn, type SearchFetcher, type SearchField, type SearchFilter, type SearchOption, type SearchPage, SearchResults, type SearchResultsProps, type SearchRow, SearchToolbar, type SearchValues, type SearchViewItem, Section, type SectionProps, SegmentedControl, type SegmentedControlProps, type SegmentedItem, Select, type SelectOption, type SelectOptionRecord, type SelectProps, Show, type ShowProps, SidebarNav, type SidebarNavItem, type SidebarNavProps, type SidebarNavSection, type SortDir, SortHandle, type SortHandleProps, SortableList, type SortableListProps, Spacer, type SpacerProps, type SpecIssue, Spinner, type SpinnerProps, StatCard, type StatCardProps, Switch, type SwitchProps, type TabItem, Table, type TableColumn, type TableProps, Tabs, type TabsProps, Tag, type TagProps, Text, type TextPreset, type TextProps, Textarea, type TextareaProps, TimePickerProps, Toast, type ToastProps, Tooltip, type TooltipProps, boxed, cascadingValuePaths, cellRenderer, cleanSearchValues, createRegistry, defaultAdapter, defaultRegistry, getOverlayRoot, imageRenderer, includesLooseSearch, joinMultiValue, normalizePageSizes, normalizeSearchText, searchFieldKeys, searchValuesFromParams, sortableDropIndex, sortableMove, splitMultiValue, useOverlayLayer, useRemoteSearchPage, useSduiAssetResolver, useSduiCan, useSduiDispatch, useSduiRuntime, useSduiSandbox, useSearchFetcher, validateSpec };
1840
+ export { Actions, type ActionsProps, Alert, type AlertProps, Avatar, type AvatarProps, Badge, type BadgeProps, type BadgeTone, Breadcrumb, type BreadcrumbItem, type BreadcrumbProps, Button, type ButtonProps, CALC_OPS, Can, type CanProps, Card, type CardProps, type CascadingSearchOption, Checkbox, type CheckboxProps, Col, type ColProps, type CustomActionHandler, type CustomValidator, DatePickerProps, DateRangePickerProps, Dialog, type DialogProps, Divider, EmptyState, type EmptyStateProps, Field, type FieldProps, Grid, type GridCardConfig, type GridCardRow, type GridProps, Icon, IconButton, type IconButtonProps, type IconProps, ImageViewer, type ImageViewerProps, Input, type InputProps, type Justify, type KeyValueItem, KeyValueList, type KeyValueListProps, type MeterTone, NodeErrorBoundary, OverlayContainerContext, OverlayLayer, PageHead, type PageHeadProps, Pagination, type PaginationProps, ProgressBar, type ProgressBarProps, Radio, type RadioProps, RemoteSearchResults, type RemoteSearchResultsProps, ResultTable, type ResultTableColumn, type ResultTableProps, Row, type RowProps, SduiAction, type SduiAdapter, type SduiAssetContext, type SduiAssetResolver, type SduiBadgeCell, SduiBoxProps, type SduiCanFn, type SduiCanQuery, type SduiCanSetting, type SduiCell, SduiColumnsScale, SduiContainerLayoutProps, type SduiDateCell, SduiDialog, type SduiDispatch, SduiForm, type SduiFormConfig, type SduiFormProps, SduiGapScale, type SduiGridCard, type SduiGridCardAction, type SduiGridCardRow, type SduiIconCell, type SduiImageCell, type SduiLinkCell, type SduiNumberCell, SduiPage, SduiPermissionProvider, type SduiProgressCell, SduiPropValue, type SduiRegistry, SduiRenderer, type SduiRendererProps, type SduiRowCondition, SduiRule, type SduiRuntime, type SduiSearchAction, type SduiSearchColumn, SduiSearchDataProvider, SduiSearchResults, type SduiSearchResultsProps, type SduiTagCell, SduiTextAlignScale, type SduiTextCell, type SduiUseSpec, SduiWeightScale, type SearchAction, type SearchColumn, type SearchFetcher, type SearchField, type SearchFilter, type SearchOption, type SearchPage, SearchResults, type SearchResultsProps, type SearchRow, SearchToolbar, type SearchValues, type SearchViewItem, Section, type SectionProps, SegmentedControl, type SegmentedControlProps, type SegmentedItem, Select, type SelectOption, type SelectOptionRecord, type SelectProps, Show, type ShowProps, SidebarNav, type SidebarNavItem, type SidebarNavProps, type SidebarNavSection, type SortDir, SortHandle, type SortHandleProps, SortableList, type SortableListProps, Spacer, type SpacerProps, type SpecIssue, Spinner, type SpinnerProps, StatCard, type StatCardProps, Switch, type SwitchProps, type TabItem, Table, type TableColumn, type TableProps, Tabs, type TabsProps, Tag, type TagProps, Text, type TextPreset, type TextProps, Textarea, type TextareaProps, TimePickerProps, Toast, type ToastProps, Tooltip, type TooltipProps, boxed, cascadingValuePaths, cellRenderer, cleanSearchValues, createRegistry, defaultAdapter, defaultRegistry, getOverlayRoot, imageRenderer, includesLooseSearch, joinMultiValue, normalizePageSizes, normalizeSearchText, searchFieldKeys, searchValuesFromParams, sortableDropIndex, sortableMove, splitMultiValue, useOverlayLayer, useRemoteSearchPage, useSduiAssetResolver, useSduiCan, useSduiDispatch, useSduiRuntime, useSduiSandbox, useSearchFetcher, validateSpec };