@wipco/sdui 0.6.0 → 0.8.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.
Files changed (79) hide show
  1. package/dist/DatePicker-BndreCPl.d.ts +35 -0
  2. package/dist/{chunk-FGRR3ROJ.js → chunk-27APKNEI.js} +8 -5
  3. package/dist/{chunk-SEBPBUZR.js → chunk-5RWAK5QO.js} +4 -2
  4. package/dist/{chunk-ZQR3ULVH.js → chunk-6ALDY64N.js} +5 -3
  5. package/dist/{chunk-ZUCI34QY.js → chunk-6FADQ2SU.js} +63 -21
  6. package/dist/{chunk-KBHI3IUR.js → chunk-6ZUWN2QX.js} +4 -2
  7. package/dist/{chunk-RH7ESUE6.js → chunk-7MRAY6UD.js} +4 -2
  8. package/dist/{chunk-DGPRX4MU.js → chunk-7Y6UFAYZ.js} +4 -2
  9. package/dist/{chunk-7Y4J7EOK.js → chunk-BMZKZGJF.js} +3 -2
  10. package/dist/{chunk-WNYWTFGW.js → chunk-CEFOZOOM.js} +4 -2
  11. package/dist/{chunk-56KKWLNI.js → chunk-H7V35NC2.js} +5 -3
  12. package/dist/{chunk-MSAV4J4I.js → chunk-I5GNJDHQ.js} +5 -3
  13. package/dist/{chunk-ZNITJ4KK.js → chunk-IKLBICOJ.js} +4 -2
  14. package/dist/{chunk-LZJTKVMO.js → chunk-KL554MEM.js} +4 -2
  15. package/dist/{chunk-4SU2KYPU.js → chunk-KPDUJFVD.js} +4 -2
  16. package/dist/{chunk-USKRM22W.js → chunk-O4U7Y3XL.js} +3 -2
  17. package/dist/{chunk-MOIU7MUA.js → chunk-OM63D4UH.js} +5 -3
  18. package/dist/{chunk-Q6SBH63R.js → chunk-QTNIUMSM.js} +4 -2
  19. package/dist/{chunk-WVRCIVAD.js → chunk-RQ2FWV24.js} +4 -2
  20. package/dist/{chunk-QBIVW7E6.js → chunk-SAN4IX6N.js} +77 -2
  21. package/dist/{chunk-AROOQ5W6.js → chunk-VCX2XEF6.js} +4 -2
  22. package/dist/{chunk-OOHHW4K4.js → chunk-VPVCVSFH.js} +4 -2
  23. package/dist/{chunk-KADFN76X.js → chunk-WUTCZCQH.js} +1 -1
  24. package/dist/{chunk-APCXOCAO.js → chunk-YMWU4F7E.js} +4 -2
  25. package/dist/{chunk-QZQDHSMD.js → chunk-Z3WGIFJP.js} +3 -2
  26. package/dist/{chunk-PJRXPMI3.js → chunk-ZH5MLOZS.js} +3 -2
  27. package/dist/index.d.ts +1045 -965
  28. package/dist/index.js +82 -47
  29. package/dist/{layout-BnYUuWC2.d.ts → layout-B1QrIBm6.d.ts} +59 -1
  30. package/dist/meta.d.ts +42 -1
  31. package/dist/meta.js +215 -57
  32. package/dist/rich.d.ts +2 -1
  33. package/dist/rich.js +4 -3
  34. package/dist/widgets/AutocompleteField.d.ts +6 -40
  35. package/dist/widgets/AutocompleteField.js +4 -3
  36. package/dist/widgets/ColumnBoard.d.ts +6 -14
  37. package/dist/widgets/ColumnBoard.js +3 -2
  38. package/dist/widgets/DiffView.d.ts +6 -11
  39. package/dist/widgets/DiffView.js +3 -2
  40. package/dist/widgets/Disclosure.d.ts +6 -9
  41. package/dist/widgets/Disclosure.js +3 -2
  42. package/dist/widgets/EventCalendar.d.ts +6 -1
  43. package/dist/widgets/EventCalendar.js +3 -2
  44. package/dist/widgets/ImageLightbox.d.ts +6 -10
  45. package/dist/widgets/ImageLightbox.js +3 -2
  46. package/dist/widgets/InlineEdit.d.ts +6 -10
  47. package/dist/widgets/InlineEdit.js +3 -2
  48. package/dist/widgets/JsonField.d.ts +6 -1
  49. package/dist/widgets/JsonField.js +3 -2
  50. package/dist/widgets/LiveClock.d.ts +6 -1
  51. package/dist/widgets/LiveClock.js +2 -1
  52. package/dist/widgets/OrgChart.d.ts +7 -3
  53. package/dist/widgets/OrgChart.js +3 -2
  54. package/dist/widgets/PeriodFilter.d.ts +6 -1
  55. package/dist/widgets/PeriodFilter.js +3 -2
  56. package/dist/widgets/PrintSheet.d.ts +6 -12
  57. package/dist/widgets/PrintSheet.js +3 -2
  58. package/dist/widgets/SearchableMultiPicker.d.ts +6 -11
  59. package/dist/widgets/SearchableMultiPicker.js +4 -3
  60. package/dist/widgets/SecureScreen.d.ts +6 -14
  61. package/dist/widgets/SecureScreen.js +3 -2
  62. package/dist/widgets/StackedMeter.d.ts +7 -3
  63. package/dist/widgets/StackedMeter.js +2 -1
  64. package/dist/widgets/Strip.d.ts +6 -10
  65. package/dist/widgets/Strip.js +2 -2
  66. package/dist/widgets/SummaryTable.d.ts +6 -9
  67. package/dist/widgets/SummaryTable.js +2 -1
  68. package/dist/widgets/TagMultiSelect.d.ts +6 -1
  69. package/dist/widgets/TagMultiSelect.js +3 -2
  70. package/dist/widgets/Timeline.d.ts +6 -10
  71. package/dist/widgets/Timeline.js +4 -3
  72. package/dist/widgets/TreePicker.d.ts +6 -1
  73. package/dist/widgets/TreePicker.js +4 -3
  74. package/dist/widgets/TreeView.d.ts +6 -1
  75. package/dist/widgets/TreeView.js +3 -2
  76. package/dist/widgets/index.d.ts +61 -61
  77. package/dist/widgets/index.js +44 -44
  78. package/package.json +1 -1
  79. package/dist/DatePicker-CTDcFR7V.d.ts +0 -48
package/dist/index.js CHANGED
@@ -1,12 +1,12 @@
1
- import { DEV, DateRangePicker, DatePicker, isSafeNavigationTarget, useSduiAdapter, hostFetchOf, HoistedStyle, useSduiSandbox, resolveAdapter, assetResolverOf, SduiAdapterContext } from './chunk-FGRR3ROJ.js';
2
- export { DatePicker, DateRangePicker, defaultAdapter, useSduiAssetResolver, useSduiSandbox } from './chunk-FGRR3ROJ.js';
3
- import { containerLayoutStyle, columnsClass, typographyStyle, LAYOUT_CSS, childLayoutFrom, CHILD_LAYOUT_PROPS } from './chunk-QBIVW7E6.js';
4
- export { CHILD_LAYOUT_PROPS, LAYOUT_CSS, childLayoutFrom, columnsClass, containerLayoutStyle, typographyStyle } from './chunk-QBIVW7E6.js';
5
- import { searchValuesFromParams, splitMultiValue, includesLooseSearch, cascadingValuePaths, SearchToolbar, searchFieldKeys, Popover } from './chunk-KADFN76X.js';
6
- export { SearchToolbar, cascadingValuePaths, cleanSearchValues, includesLooseSearch, joinMultiValue, normalizeSearchText, searchFieldKeys, searchValuesFromParams, splitMultiValue } from './chunk-KADFN76X.js';
7
- import { Toast, Textarea, Tag, Tabs, Table, Switch, StatCard, Spinner, Select, ProgressBar, Pagination, Input, IconButton, Icon, Field, EmptyState, Checkbox, Card, Button, Badge, Alert, SegmentedControl, Dialog } from './chunk-ZUCI34QY.js';
8
- export { Alert, Avatar, Badge, Breadcrumb, Button, Card, Checkbox, Dialog, EmptyState, Field, Icon, IconButton, Input, Pagination, ProgressBar, Radio, SegmentedControl, Select, SidebarNav, Spinner, StatCard, Switch, Table, Tabs, Tag, Textarea, Toast, Tooltip } from './chunk-ZUCI34QY.js';
9
- import React, { createContext, useContext, useMemo, useState, useRef, useEffect, useCallback } from 'react';
1
+ import { DEV, HoistedStyle, isSafeNavigationTarget, useSduiAdapter, hostFetchOf, DateRangePicker, DatePicker, useSduiSandbox, resolveAdapter, assetResolverOf, SduiAdapterContext } from './chunk-27APKNEI.js';
2
+ export { DatePicker, DateRangePicker, defaultAdapter, useSduiAssetResolver, useSduiSandbox } from './chunk-27APKNEI.js';
3
+ import { searchValuesFromParams, splitMultiValue, includesLooseSearch, cascadingValuePaths, SearchToolbar, searchFieldKeys, Popover } from './chunk-WUTCZCQH.js';
4
+ export { SearchToolbar, cascadingValuePaths, cleanSearchValues, includesLooseSearch, joinMultiValue, normalizeSearchText, searchFieldKeys, searchValuesFromParams, splitMultiValue } from './chunk-WUTCZCQH.js';
5
+ import { EmptyState, Button, Checkbox, SegmentedControl, Spinner, Select, Pagination, Icon, Card, Badge, ProgressBar, Tag, Toast, Textarea, Tabs, Table, Switch, StatCard, Input, IconButton, Field, Alert, warnOnce, Dialog } from './chunk-6FADQ2SU.js';
6
+ export { Alert, Avatar, Badge, Breadcrumb, Button, Card, Checkbox, Dialog, EmptyState, Field, Icon, IconButton, Input, Pagination, ProgressBar, Radio, SegmentedControl, Select, SidebarNav, Spinner, StatCard, Switch, Table, Tabs, Tag, Textarea, Toast, Tooltip } from './chunk-6FADQ2SU.js';
7
+ import { boxed, mergeStyle, containerLayoutStyle, joinClass, columnsClass, typographyStyle, LAYOUT_CSS, childLayoutFrom, CHILD_LAYOUT_PROPS } from './chunk-SAN4IX6N.js';
8
+ export { CHILD_LAYOUT_PROPS, LAYOUT_CSS, boxed, childLayoutFrom, columnsClass, containerLayoutStyle, joinClass, mergeStyle, typographyStyle } from './chunk-SAN4IX6N.js';
9
+ import React, { createContext, useState, useMemo, useContext, useRef, useEffect, useCallback } from 'react';
10
10
  import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
11
11
 
12
12
  // src/asset-url.ts
@@ -151,14 +151,6 @@ var NodeErrorBoundary = class extends React.Component {
151
151
  return this.props.children;
152
152
  }
153
153
  };
154
-
155
- // src/warn-once.ts
156
- var warned = /* @__PURE__ */ new Set();
157
- function warnOnce(key, message) {
158
- if (warned.has(key)) return;
159
- warned.add(key);
160
- console.error(message);
161
- }
162
154
  var ALLOW_ALL = () => true;
163
155
  var DENY_ALL = () => false;
164
156
  var MISSING = () => {
@@ -188,21 +180,42 @@ function Can({ entity, action = "read", scope, fallback = null, children }) {
188
180
  }
189
181
  return can({ entity, action: typeof action === "string" ? action : "read", scope }) ? /* @__PURE__ */ jsx(Fragment, { children }) : /* @__PURE__ */ jsx(Fragment, { children: fallback });
190
182
  }
191
- function cx(...parts) {
192
- return parts.filter(Boolean).join(" ");
193
- }
194
- function mergeStyle(own, given) {
195
- if (!own) return given;
196
- if (!given) return own;
197
- return { ...own, ...given };
198
- }
199
- function Grid({ columns = 3, template, gap, align, justify, wrap, className, style, children }) {
183
+ function paddingStyle(padding) {
184
+ const value = padding === void 0 ? void 0 : PADDING_CSS[padding];
185
+ return value === void 0 ? {} : { padding: value };
186
+ }
187
+ var PADDING_CSS = {
188
+ "2": "2px",
189
+ "4": "4px",
190
+ "8": "8px",
191
+ "12": "12px",
192
+ "16": "16px",
193
+ "20": "20px",
194
+ "24": "24px",
195
+ "32": "32px"
196
+ };
197
+ function Grid({
198
+ columns = 3,
199
+ template,
200
+ gap,
201
+ align,
202
+ justify,
203
+ wrap,
204
+ padding,
205
+ className,
206
+ style,
207
+ children
208
+ }) {
200
209
  return /* @__PURE__ */ jsx(
201
210
  "div",
202
211
  {
203
- className: cx("wp-grid", !template && columnsClass(columns), className),
212
+ className: joinClass("wp-grid", !template && columnsClass(columns), className),
204
213
  style: mergeStyle(
205
- template ? { gridTemplateColumns: template, ...containerLayoutStyle({ gap, align, justify, wrap }) } : containerLayoutStyle({ gap, align, justify, wrap }),
214
+ {
215
+ ...template ? { gridTemplateColumns: template } : null,
216
+ ...containerLayoutStyle({ gap, align, justify, wrap }),
217
+ ...paddingStyle(padding)
218
+ },
206
219
  style
207
220
  ),
208
221
  children
@@ -213,7 +226,7 @@ function Row({ justify, gap, align, wrap, className, style, children }) {
213
226
  return /* @__PURE__ */ jsx(
214
227
  "div",
215
228
  {
216
- className: cx("wp-row", justify === "between" && "wp-row--between", className),
229
+ className: joinClass("wp-row", justify === "between" && "wp-row--between", className),
217
230
  style: mergeStyle(containerLayoutStyle({ gap, align, justify, wrap }), style),
218
231
  children
219
232
  }
@@ -223,25 +236,31 @@ function Actions({ justify = "end", gap, align, wrap, className, style, children
223
236
  return /* @__PURE__ */ jsx(
224
237
  "div",
225
238
  {
226
- className: cx("wp-row", className),
239
+ className: joinClass("wp-row", className),
227
240
  style: mergeStyle({ flex: 1, ...containerLayoutStyle({ gap, align, justify, wrap }) }, style),
228
241
  children
229
242
  }
230
243
  );
231
244
  }
232
245
  function Col({ gap, align, justify, wrap, className, style, children }) {
233
- return /* @__PURE__ */ jsx("div", { className: cx("wp-col", className), style: mergeStyle(containerLayoutStyle({ gap, align, justify, wrap }), style), children });
246
+ return /* @__PURE__ */ jsx("div", { className: joinClass("wp-col", className), style: mergeStyle(containerLayoutStyle({ gap, align, justify, wrap }), style), children });
234
247
  }
235
248
  var SPACER_STEPS = /* @__PURE__ */ new Set([1, 2, 3, 4, 5, 6, 8]);
236
- function Spacer({ size }) {
249
+ function Spacer({ size, className, style }) {
237
250
  const step = size !== void 0 && SPACER_STEPS.has(Number(size)) ? Number(size) : void 0;
238
- return /* @__PURE__ */ jsx("div", { className: cx("wp-spacer", step !== void 0 && `wp-spacer--${step}`) });
251
+ return /* @__PURE__ */ jsx(
252
+ "div",
253
+ {
254
+ className: joinClass("wp-spacer", step !== void 0 && `wp-spacer--${step}`, className),
255
+ style
256
+ }
257
+ );
239
258
  }
240
259
  function Section({ title, gap, align, justify, wrap, className, style, children }) {
241
260
  return /* @__PURE__ */ jsxs(
242
261
  "section",
243
262
  {
244
- className: cx("wp-col", className),
263
+ className: joinClass("wp-col", className),
245
264
  style: mergeStyle(containerLayoutStyle({ gap, align, justify, wrap }), style),
246
265
  children: [
247
266
  title ? /* @__PURE__ */ jsx("h2", { className: "wp-h4", children: title }) : null,
@@ -250,30 +269,43 @@ function Section({ title, gap, align, justify, wrap, className, style, children
250
269
  }
251
270
  );
252
271
  }
272
+ var TEXT_WRAP_CSS = {
273
+ normal: {},
274
+ preserve: { whiteSpace: "pre-wrap" },
275
+ anywhere: { whiteSpace: "pre-wrap", wordBreak: "break-all" }
276
+ };
253
277
  function Text({
254
278
  preset = "body",
255
279
  as: Tag2 = "p",
256
280
  weight,
257
281
  textAlign,
282
+ wrap,
258
283
  className,
259
284
  style,
260
285
  value,
261
286
  children
262
287
  }) {
263
- return /* @__PURE__ */ jsx(Tag2, { className: cx(`wp-${preset}`, className), style: mergeStyle(typographyStyle({ weight, textAlign }), style), children: value ?? children });
288
+ return /* @__PURE__ */ jsx(
289
+ Tag2,
290
+ {
291
+ className: joinClass(`wp-${preset}`, className),
292
+ style: mergeStyle({ ...typographyStyle({ weight, textAlign }), ...TEXT_WRAP_CSS[wrap ?? "normal"] }, style),
293
+ children: value ?? children
294
+ }
295
+ );
264
296
  }
265
297
  function KeyValueList({ source, items, className, style }) {
266
- return /* @__PURE__ */ jsx("div", { className: cx("wp-kv", className), style, children: (items ?? []).map((item, index) => {
298
+ return /* @__PURE__ */ jsx("div", { className: joinClass("wp-kv", className), style, children: (items ?? []).map((item, index) => {
267
299
  const raw = item.key ? source?.[item.key] : item.value;
268
300
  const content = raw === null || raw === void 0 || raw === "" ? "\u2014" : raw;
269
301
  return /* @__PURE__ */ jsxs(React.Fragment, { children: [
270
302
  /* @__PURE__ */ jsx("span", { className: "wp-kv__k", children: item.label }),
271
- /* @__PURE__ */ jsx("span", { className: cx("wp-kv__v", item.mono && "wp-mono"), children: content })
303
+ /* @__PURE__ */ jsx("span", { className: joinClass("wp-kv__v", item.mono && "wp-mono"), children: content })
272
304
  ] }, index);
273
305
  }) });
274
306
  }
275
- function PageHead({ title, subtitle, actions }) {
276
- return /* @__PURE__ */ jsxs("div", { className: "wp-page-head", children: [
307
+ function PageHead({ title, subtitle, actions, className, style }) {
308
+ return /* @__PURE__ */ jsxs("div", { className: joinClass("wp-page-head", className), style, children: [
277
309
  /* @__PURE__ */ jsxs("div", { className: "wp-page-head__text", children: [
278
310
  title ? /* @__PURE__ */ jsx("h1", { className: "wp-page-head__title", children: title }) : null,
279
311
  subtitle ? /* @__PURE__ */ jsx("div", { className: "wp-page-head__sub", children: subtitle }) : null
@@ -284,8 +316,8 @@ function PageHead({ title, subtitle, actions }) {
284
316
  function Show({ when, children }) {
285
317
  return when ? /* @__PURE__ */ jsx(Fragment, { children }) : null;
286
318
  }
287
- function Divider({ style }) {
288
- return /* @__PURE__ */ jsx("hr", { className: "wp-divider", style });
319
+ function Divider({ style, className }) {
320
+ return /* @__PURE__ */ jsx("hr", { className: joinClass("wp-divider", className), style });
289
321
  }
290
322
  function toNumber(value) {
291
323
  if (typeof value === "number") return Number.isFinite(value) ? value : null;
@@ -600,6 +632,7 @@ function SearchResults({
600
632
  views,
601
633
  pageSizes,
602
634
  className,
635
+ style,
603
636
  searchParams,
604
637
  onParamsChange,
605
638
  actions = [],
@@ -788,7 +821,7 @@ function SearchResults({
788
821
  setSort((prev) => prev?.key === key ? prev.dir === "asc" ? { key, dir: "desc" } : null : { key, dir: "asc" });
789
822
  };
790
823
  const empty = /* @__PURE__ */ jsx(ResultEmptyState, { title });
791
- return /* @__PURE__ */ jsxs("div", { className: ["wp-col", className].filter(Boolean).join(" "), "aria-label": title, children: [
824
+ return /* @__PURE__ */ jsxs("div", { className: ["wp-col", className].filter(Boolean).join(" "), style, "aria-label": title, children: [
792
825
  !hideHeader ? /* @__PURE__ */ jsxs("div", { className: "wp-row wp-row--between", style: { flexWrap: "wrap" }, children: [
793
826
  /* @__PURE__ */ jsxs("span", { className: "wp-caption", children: [
794
827
  "\uCD1D ",
@@ -1110,7 +1143,7 @@ function mapActions(actions, dispatch) {
1110
1143
  }
1111
1144
  }));
1112
1145
  }
1113
- function SduiSearchResults({
1146
+ function SduiSearchResultsImpl({
1114
1147
  title,
1115
1148
  data,
1116
1149
  columns,
@@ -1157,7 +1190,7 @@ function SduiSearchResults({
1157
1190
  }
1158
1191
  );
1159
1192
  }
1160
- function RemoteSearchResults({
1193
+ function RemoteSearchResultsImpl({
1161
1194
  title,
1162
1195
  endpoint,
1163
1196
  columns,
@@ -1228,6 +1261,8 @@ function RemoteSearchResults({
1228
1261
  }
1229
1262
  );
1230
1263
  }
1264
+ var SduiSearchResults = boxed(SduiSearchResultsImpl, "SduiSearchResults");
1265
+ var RemoteSearchResults = boxed(RemoteSearchResultsImpl, "RemoteSearchResults");
1231
1266
  function SduiDialog(props) {
1232
1267
  const { onClose } = props;
1233
1268
  useEffect(() => {
@@ -1907,10 +1942,10 @@ function toIndex(v) {
1907
1942
  function inRange(index, length) {
1908
1943
  return index !== null && index >= 0 && index < length;
1909
1944
  }
1910
- var warned2 = /* @__PURE__ */ new Set();
1945
+ var warned = /* @__PURE__ */ new Set();
1911
1946
  function warnOnce2(key, message) {
1912
- if (warned2.has(key)) return;
1913
- warned2.add(key);
1947
+ if (warned.has(key)) return;
1948
+ warned.add(key);
1914
1949
  console.error(message);
1915
1950
  }
1916
1951
  function validateForm(values, config, customValidators) {
@@ -13,6 +13,7 @@ import React__default from 'react';
13
13
  * 1. 컨테이너 전용 `gap` `wrap` `columns` — 자식에 그 개념이 없다
14
14
  * 2. 컨테이너+자식 `align` ↔ `selfAlign` — CSS의 align-items/align-self 짝
15
15
  * 3. 자식 전용 `grow` `shrink` `span` `truncate`
16
+ * `width` `maxWidth` `minWidth` `marginTop` `marginBottom` `pushEnd`
16
17
  * 4. CSS가 상속함 `weight` `textAlign` — **JS는 아무것도 하지 않는다**
17
18
  *
18
19
  * 4번이 핵심이다. `font-weight`·`text-align`은 브라우저가 이미 자손에게 상속시킨다.
@@ -50,6 +51,24 @@ type SduiColumnsScale = 1 | 2 | 3 | 4 | 5 | 6;
50
51
  */
51
52
  type SduiWeightScale = 'regular' | 'medium' | 'semibold' | 'bold';
52
53
  type SduiTextAlignScale = 'left' | 'center' | 'right';
54
+ /**
55
+ * 치수 척도 — **32px 격자**다. `full`만 예외로 `100%`를 뜻한다.
56
+ *
57
+ * ── 왜 자유 길이(`width?: string`)가 아닌가
58
+ * 실측: 스펙 85개에 남은 `style` 우회 75선언 중 50선언(67%)이 폭이었고, 값이
59
+ * 96·100·110·120·140·160·170·180·220·230·252·260·264·280px으로 **열넷**이었다.
60
+ * 같은 자리(입력칸 최대폭)에 160·170·180이 섞여 있는 식이라, 자유 길이를 프롭으로
61
+ * 올려 봐야 "픽셀로 만지다 디자인 규칙이 깨진다"는 상태가 프롭 이름만 바꿔 유지된다.
62
+ *
63
+ * ── 왜 하필 32의 배수인가
64
+ * 캔버스 크기 손잡이가 이미 카드류를 32px 배수로 스냅한다(`canvas/resize.ts`).
65
+ * 손잡이로 끌 때와 패널에서 고를 때의 값 집합이 다르면 한쪽으로 맞춘 화면이
66
+ * 다른 쪽에서 어긋나므로 같은 격자를 쓴다.
67
+ *
68
+ * 96에서 시작하는 이유: 그보다 좁은 실측값이 없다(최소 96px). 480에서 끊는 이유:
69
+ * 그보다 넓은 자리는 폭을 세지 않고 `grow`/`full`로 부모에 맡기는 편이 맞다.
70
+ */
71
+ type SduiSizeScale = '96' | '128' | '160' | '192' | '224' | '256' | '288' | '320' | '384' | '480' | 'full';
53
72
  /**
54
73
  * 자기 루트가 flex/grid인 컴포넌트만 받는 축.
55
74
  *
@@ -101,6 +120,24 @@ interface SduiChildLayoutProps {
101
120
  selfAlign?: SduiAlignScale;
102
121
  /** 한 줄로 잘라 말줄임(`.wp-truncate`). */
103
122
  truncate?: boolean;
123
+ /** 고정 폭(`width`). `full`이면 부모 폭을 채운다. */
124
+ width?: SduiSizeScale;
125
+ /** 최대 폭(`max-width`). 넓은 화면에서 입력칸이 늘어지는 것을 막는 가장 흔한 쓰임이다. */
126
+ maxWidth?: SduiSizeScale;
127
+ /** 최소 폭(`min-width`). 좁아져도 이보다 줄지 않는다. */
128
+ minWidth?: SduiSizeScale;
129
+ /** 위쪽 바깥여백(`margin-top`). 간격 척도. */
130
+ marginTop?: SduiGapScale;
131
+ /** 아래쪽 바깥여백(`margin-bottom`). 간격 척도. */
132
+ marginBottom?: SduiGapScale;
133
+ /**
134
+ * 남는 공간을 앞쪽에 몰아 **자기만 끝으로 민다**(`margin-inline-start: auto`).
135
+ *
136
+ * 부모의 `justify="end"`와 다르다 — 저쪽은 자식 전부를 끝으로 보내고, 이쪽은
137
+ * 한 자식만 떼어 보낸다("왼쪽에 제목, 오른쪽에 버튼 하나"가 이 모양이다).
138
+ * 부모를 고칠 수 없는 자리(슬롯 안 등)에서도 쓸 수 있다.
139
+ */
140
+ pushEnd?: boolean;
104
141
  }
105
142
  /** 렌더러가 가로채는 자식 축 프롭 이름. */
106
143
  declare const CHILD_LAYOUT_PROPS: ReadonlySet<string>;
@@ -118,6 +155,27 @@ interface ChildLayoutResult {
118
155
  * 하한을 푸는 표준 처방이고, 조상 시트를 건드리지 않으니 기존 화면이 움직이지 않는다.
119
156
  */
120
157
  declare function childLayoutFrom(props: SduiChildLayoutProps): ChildLayoutResult | undefined;
158
+ /**
159
+ * 모든 어휘가 받아야 하는 두 프롭.
160
+ *
161
+ * ── 왜 이것이 따로 필요한가 (실측)
162
+ * 렌더러는 자식 축을 **모든 컴포넌트에서** 가로채 `props.style`·`props.className`으로 접는다.
163
+ * 그런데 컴포넌트가 그 둘을 자기 뿌리 DOM에 얹지 않으면 **아무 일도 일어나지 않는다.**
164
+ * 78종을 프리셋 그대로 그려 확인해 보니 38종이 그랬다 — `grow`·`selfAlign`을 줘도
165
+ * 조용히 무시되는 자리가 절반이었다. 편집기 속성 패널은 프롭을 보여 주므로,
166
+ * 사용자에게는 "설정했는데 안 먹는" 모양으로 보인다.
167
+ *
168
+ * `Show`·`Can`·`ForEach`는 예외다 — `dom.element: 'fragment'`라 얹을 DOM 박스가 없다.
169
+ * 그쪽은 프롭을 받지 않는 것이 옳고, 메타에서도 자식 축을 내보내지 않는다.
170
+ */
171
+ interface SduiBoxProps {
172
+ style?: React__default.CSSProperties;
173
+ className?: string;
174
+ }
175
+ /** 컴포넌트가 스스로 정한 style 위에 바깥에서 온 style을 덮는다(바깥이 이긴다). */
176
+ declare function mergeStyle(own: React__default.CSSProperties | undefined, given: React__default.CSSProperties | undefined): React__default.CSSProperties | undefined;
177
+ /** 클래스 이름을 합친다. `false`·`undefined`·빈 문자열은 조건부 클래스라 떨군다. */
178
+ declare function joinClass(...parts: Array<string | false | null | undefined>): string | undefined;
121
179
  /**
122
180
  * `weight`/`textAlign` → 자기 요소의 style.
123
181
  *
@@ -147,4 +205,4 @@ declare function typographyStyle(props: {
147
205
  */
148
206
  declare const LAYOUT_CSS = "\n.wp-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;min-width:0}\n.wp-grid--1{grid-template-columns:minmax(0,1fr)}\n.wp-grid--5{grid-template-columns:repeat(5,minmax(0,1fr))}\n.wp-grid--6{grid-template-columns:repeat(6,minmax(0,1fr))}\n@media (max-width:900px){.wp-grid--5,.wp-grid--6{grid-template-columns:repeat(2,minmax(0,1fr))}}\n@media (max-width:600px){.wp-grid--5,.wp-grid--6{grid-template-columns:minmax(0,1fr)}}\n";
149
207
 
150
- export { CHILD_LAYOUT_PROPS as C, LAYOUT_CSS as L, type SduiContainerLayoutProps as S, type SduiColumnsScale as a, type SduiWeightScale as b, type SduiTextAlignScale as c, type SduiAlignScale as d, type SduiChildLayoutProps as e, type SduiGapScale as f, type SduiSpanScale as g, childLayoutFrom as h, columnsClass as i, containerLayoutStyle as j, typographyStyle as t };
208
+ export { CHILD_LAYOUT_PROPS as C, LAYOUT_CSS as L, type SduiBoxProps as S, type SduiContainerLayoutProps as a, type SduiColumnsScale as b, type SduiGapScale as c, type SduiWeightScale as d, type SduiTextAlignScale as e, type SduiAlignScale as f, type SduiChildLayoutProps as g, type SduiSizeScale as h, type SduiSpanScale as i, childLayoutFrom as j, columnsClass as k, containerLayoutStyle as l, joinClass as m, mergeStyle as n, typographyStyle as t };
package/dist/meta.d.ts CHANGED
@@ -214,6 +214,47 @@ interface SduiComponentMeta {
214
214
  hidden?: boolean;
215
215
  }
216
216
 
217
+ /**
218
+ * 자기 축 프롭 — **모든 컴포넌트가 갖는다.**
219
+ *
220
+ * ## 왜 한곳에 모았나 (실측)
221
+ *
222
+ * 렌더러는 자식 축을 컴포넌트를 가리지 않고 가로챈다({@link ../layout.ts}). 그런데
223
+ * 메타데이터는 컴포넌트마다 손으로 적고 있어서, **71종 중 10종에만** 적혀 있었다.
224
+ * 나머지 61종(`StatCard`·`Table`·`Chart`·`Badge`·`Textarea`·`Alert` …)은 런타임이
225
+ * 값을 받아 주는데도 편집기 속성 패널에 자리가 없었다 — "라이브러리는 되는데 편집기로는
226
+ * 못 하는" 기능이 61곳 있었다는 뜻이다.
227
+ *
228
+ * 컴포넌트마다 적는 방식으로는 새 컴포넌트가 들어올 때마다 같은 누락이 생긴다.
229
+ * 그래서 목록을 여기 한 벌 두고 {@link withSelfAxis}가 얹는다.
230
+ *
231
+ * ## 얹지 않는 것
232
+ *
233
+ * `dom.element: 'fragment'`인 어휘(`Show`·`Can`·`ForEach`)는 자기 DOM 박스가 없다.
234
+ * 프롭을 줘도 붙일 곳이 없어 조용히 사라지므로, 패널에 내는 것 자체가 거짓말이 된다.
235
+ *
236
+ * 컴포넌트가 **같은 이름을 이미 자기 뜻으로 쓰고 있으면** 그쪽을 남긴다
237
+ * (`Timeline.maxHeight`·`TreeView.maxHeight`가 그렇다). 덮어쓰면 기존 스펙이 깨진다.
238
+ */
239
+
240
+ /**
241
+ * 자기 축 전부. 순서가 속성 패널의 순서가 된다 — 자주 쓰는 폭을 위에 둔다.
242
+ *
243
+ * `advanced`를 어디에 붙일지는 실측으로 갈랐다. 스펙 85개가 `style` 우회로 쓰던 것
244
+ * (폭·최대폭·위아래 여백)은 **자주 쓰는 것**이므로 접지 않고, 나머지는 접는다.
245
+ * 접힌 그룹은 "없는 것"처럼 보인다는 지적을 이미 받았다.
246
+ */
247
+ declare const SELF_AXIS_PROPS: readonly SduiPropMeta[];
248
+ /**
249
+ * 컴포넌트 하나에 자기 축을 얹는다. 이미 같은 이름이 있으면 **원래 것을 남긴다.**
250
+ *
251
+ * 소비 앱이 자기 컴포넌트 메타를 만들 때도 이걸 통과시켜야 한다 — 안 그러면
252
+ * 그 컴포넌트만 편집기에서 폭·여백을 못 만지는 자리가 된다.
253
+ */
254
+ declare function withSelfAxis(meta: SduiComponentMeta): SduiComponentMeta;
255
+ /** 카탈로그 전체에 얹는다. */
256
+ declare function withSelfAxisAll(catalog: Record<string, SduiComponentMeta>): Record<string, SduiComponentMeta>;
257
+
217
258
  /**
218
259
  * 기본 어휘(`defaultRegistry`) 41종의 빌더 메타데이터.
219
260
  *
@@ -541,4 +582,4 @@ declare function paletteGroups(catalog?: Record<string, SduiComponentMeta>): Arr
541
582
  items: SduiComponentMeta[];
542
583
  }>;
543
584
 
544
- export { ActionsMeta, AlertMeta, AutocompleteFieldMeta, AvatarMeta, BadgeMeta, BreadcrumbMeta, ButtonMeta, CanMeta, CardMeta, ChartMeta, CheckboxMeta, ColMeta, ColumnBoardMeta, DatePickerMeta, DateRangePickerMeta, DialogMeta, DiffViewMeta, DisclosureMeta, DividerMeta, EmptyStateMeta, EventCalendarMeta, FieldMeta, ForEachMeta, FormMeta, GridMeta, IconButtonMeta, IconMeta, ImageLightboxMeta, InlineEditMeta, InputMeta, JsonFieldMeta, KeyValueListMeta, LiveClockMeta, MapPreviewMeta, OrgChartMeta, PageHeadMeta, PaginationMeta, PeriodFilterMeta, PrintSheetMeta, ProgressBarMeta, RadioMeta, RemoteSearchResultsMeta, RowMeta, SDUI_CATEGORIES, type SduiCategory, type SduiChildrenMeta, type SduiComponentMeta, type SduiDomMeta, type SduiEnumOption, type SduiPropGroup, type SduiPropKind, type SduiPropMeta, type SduiResizeMeta, type SduiSlotMeta, SearchResultsMeta, SearchableMultiPickerMeta, SectionMeta, SecureScreenMeta, SegmentedControlMeta, SelectMeta, ShowMeta, SidebarNavMeta, SortHandleMeta, SortableListMeta, SpacerMeta, SpinnerMeta, StackedMeterMeta, StatCardMeta, StripMeta, SummaryTableMeta, SwitchMeta, TableMeta, TabsMeta, TagMeta, TagMultiSelectMeta, TextMeta, TextareaMeta, TimelineMeta, ToastMeta, TooltipMeta, TreePickerMeta, TreeViewMeta, allComponentMeta, builtinComponentMeta, coreComponentMeta, dsComponentMeta, getComponentMeta, paletteGroups, richComponentMeta, slotNamesOf, widgetComponentMeta };
585
+ export { ActionsMeta, AlertMeta, AutocompleteFieldMeta, AvatarMeta, BadgeMeta, BreadcrumbMeta, ButtonMeta, CanMeta, CardMeta, ChartMeta, CheckboxMeta, ColMeta, ColumnBoardMeta, DatePickerMeta, DateRangePickerMeta, DialogMeta, DiffViewMeta, DisclosureMeta, DividerMeta, EmptyStateMeta, EventCalendarMeta, FieldMeta, ForEachMeta, FormMeta, GridMeta, IconButtonMeta, IconMeta, ImageLightboxMeta, InlineEditMeta, InputMeta, JsonFieldMeta, KeyValueListMeta, LiveClockMeta, MapPreviewMeta, OrgChartMeta, PageHeadMeta, PaginationMeta, PeriodFilterMeta, PrintSheetMeta, ProgressBarMeta, RadioMeta, RemoteSearchResultsMeta, RowMeta, SDUI_CATEGORIES, SELF_AXIS_PROPS, type SduiCategory, type SduiChildrenMeta, type SduiComponentMeta, type SduiDomMeta, type SduiEnumOption, type SduiPropGroup, type SduiPropKind, type SduiPropMeta, type SduiResizeMeta, type SduiSlotMeta, SearchResultsMeta, SearchableMultiPickerMeta, SectionMeta, SecureScreenMeta, SegmentedControlMeta, SelectMeta, ShowMeta, SidebarNavMeta, SortHandleMeta, SortableListMeta, SpacerMeta, SpinnerMeta, StackedMeterMeta, StatCardMeta, StripMeta, SummaryTableMeta, SwitchMeta, TableMeta, TabsMeta, TagMeta, TagMultiSelectMeta, TextMeta, TextareaMeta, TimelineMeta, ToastMeta, TooltipMeta, TreePickerMeta, TreeViewMeta, allComponentMeta, builtinComponentMeta, coreComponentMeta, dsComponentMeta, getComponentMeta, paletteGroups, richComponentMeta, slotNamesOf, widgetComponentMeta, withSelfAxis, withSelfAxisAll };