@wipco/sdui 0.36.0 → 0.38.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.
@@ -1,4 +1,4 @@
1
- import { Text } from './chunk-QO6UJAQN.js';
1
+ import { Text } from './chunk-ODZSELDV.js';
2
2
  import { Switch, Field, Select, Input } from './chunk-WIDDHR7L.js';
3
3
  import { boxed } from './chunk-SAN4IX6N.js';
4
4
  import React, { useMemo } from 'react';
@@ -110,7 +110,7 @@ function Text({
110
110
  return /* @__PURE__ */ jsx(
111
111
  Tag,
112
112
  {
113
- className: joinClass(`wp-${preset}`, className),
113
+ className: joinClass(preset === "inherit" ? void 0 : `wp-${preset}`, className),
114
114
  style: mergeStyle({ ...typographyStyle({ weight, textAlign }), ...TEXT_WRAP_CSS[wrap ?? "normal"] }, style),
115
115
  children: value ?? children
116
116
  }
@@ -1,4 +1,4 @@
1
- import { Text } from './chunk-QO6UJAQN.js';
1
+ import { Text } from './chunk-ODZSELDV.js';
2
2
  import { Field, Input, Select, IconButton, Button } from './chunk-WIDDHR7L.js';
3
3
  import { boxed } from './chunk-SAN4IX6N.js';
4
4
  import { useMemo } from 'react';
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-Rngs8hw_.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-Rngs8hw_.js';
3
+ import { S as SduiPage, a as SduiAction, b as SduiPropValue, c as SduiRule } from './types-Bx3oingj.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-Bx3oingj.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';
@@ -1311,7 +1311,17 @@ interface SectionProps extends SduiContainerLayoutProps {
1311
1311
  children?: React__default.ReactNode;
1312
1312
  }
1313
1313
  declare function Section({ title, gap, align, justify, wrap, className, style, children }: SectionProps): React__default.JSX.Element;
1314
- type TextPreset = 'display-1' | 'display-2' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'body-lg' | 'body' | 'body-sm' | 'caption' | 'label' | 'overline' | 'micro' | 'metric' | 'metric-sm' | 'mono' | 'mono-xs';
1314
+ type TextPreset = 'display-1' | 'display-2' | 'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'body-lg' | 'body' | 'body-sm' | 'caption' | 'label' | 'overline' | 'micro' | 'metric' | 'metric-sm' | 'mono' | 'mono-xs'
1315
+ /**
1316
+ * 프리셋을 입히지 않는다 — 이 자리의 타이포를 그대로 물려받는다.
1317
+ *
1318
+ * 버튼·배지·표 셀처럼 **자리가 이미 글자 크기를 정해 둔 곳**에 바인딩된 글자를
1319
+ * 넣으려면 이것이 필요하다. 맨 문자열 자식은 그 자리 폰트를 따르는데
1320
+ * (`children: ['평가 작성']`), 값이 상태나 `$calc`에서 오면 `Text`를 써야 하고
1321
+ * 그러면 `wp-body`(14px/21px)가 붙어 버튼 폰트(13px)를 덮어 버린다. 실측:
1322
+ * 그 차이로 버튼 한 줄이 3px 자라 카드 27장이 세로로 밀렸다.
1323
+ */
1324
+ | 'inherit';
1315
1325
  interface TextProps {
1316
1326
  /** styles.css의 .wp-* 타입 프리셋 이름 */
1317
1327
  preset?: TextPreset;
@@ -1725,7 +1735,16 @@ interface SpecIssue {
1725
1735
  path: string;
1726
1736
  message: string;
1727
1737
  }
1728
- declare function validateSpec(page: unknown, knownComponents?: Set<string>): SpecIssue[];
1738
+ /**
1739
+ * 컴포넌트 이름 → 그 컴포넌트가 아는 슬롯 이름들. 모르는 컴포넌트면 `null`
1740
+ * (그때는 슬롯 이름을 검사하지 않는다 — 프로젝트 위젯은 메타가 없을 수 있다).
1741
+ *
1742
+ * 정본은 메타이고, 메타를 들고 있는 쪽(편집기·린터)이 이 표를 넘긴다. 이 파일이
1743
+ * 메타를 직접 import 하면 2,700줄짜리 메타가 런타임 번들에 따라 들어온다.
1744
+ * `@wipco/sdui/meta` 의 `metaSlotNames` 가 곧바로 쓸 수 있는 구현이다.
1745
+ */
1746
+ type SlotNamesOf = (component: string) => Set<string> | null;
1747
+ declare function validateSpec(page: unknown, knownComponents?: Set<string>, slotNamesOf?: SlotNamesOf): SpecIssue[];
1729
1748
 
1730
1749
  /** Form이 렌더러에 등록하는 검증 설정 */
1731
1750
  interface SduiFormConfig {
package/dist/index.js CHANGED
@@ -1,8 +1,8 @@
1
1
  export { loadOptionalModule } from './chunk-RRMKCZYQ.js';
2
2
  import { useSduiDispatch, SduiDialog, useSduiCan, SduiDispatchContext, SduiPermissionProvider } from './chunk-QU7YVMFA.js';
3
3
  export { SduiDialog, SduiPermissionProvider, useSduiCan, useSduiDispatch } from './chunk-QU7YVMFA.js';
4
- import { Text, Spacer, Show, Section, Row, PageHead, KeyValueList, Grid, Divider, Col, Actions } from './chunk-QO6UJAQN.js';
5
- export { Actions, Col, Divider, Grid, KeyValueList, PageHead, Row, Section, Show, Spacer, Text } from './chunk-QO6UJAQN.js';
4
+ import { Text, Spacer, Show, Section, Row, PageHead, KeyValueList, Grid, Divider, Col, Actions } from './chunk-ODZSELDV.js';
5
+ export { Actions, Col, Divider, Grid, KeyValueList, PageHead, Row, Section, Show, Spacer, Text } from './chunk-ODZSELDV.js';
6
6
  import { ImageViewer } from './chunk-THEP3VWY.js';
7
7
  export { ImageViewer } from './chunk-THEP3VWY.js';
8
8
  import { TimePicker } from './chunk-SNRKPEWT.js';
@@ -1675,7 +1675,8 @@ var FIELD_OPS = /* @__PURE__ */ new Set([
1675
1675
  "startsWith",
1676
1676
  "endsWith",
1677
1677
  "isNull",
1678
- "isEmpty"
1678
+ "isEmpty",
1679
+ "intersects"
1679
1680
  ]);
1680
1681
  function isFieldOpObject(v) {
1681
1682
  return isPlainObject(v) && Object.keys(v).some((key) => FIELD_OPS.has(key));
@@ -1709,6 +1710,13 @@ function matchesFieldOps(actual, ops, resolve) {
1709
1710
  return String(actual ?? "").endsWith(String(expected ?? ""));
1710
1711
  case "isNull":
1711
1712
  return isBlank(actual) === Boolean(expected);
1713
+ case "intersects": {
1714
+ const mine = Array.isArray(actual) ? actual : [];
1715
+ const theirs = Array.isArray(expected) ? expected : [];
1716
+ if (mine.length === 0 || theirs.length === 0) return false;
1717
+ const set = new Set(theirs.map((item) => String(item ?? "")));
1718
+ return mine.some((item) => set.has(String(item ?? "")));
1719
+ }
1712
1720
  case "isEmpty":
1713
1721
  return isEmptyValue(actual) === Boolean(expected);
1714
1722
  default:
@@ -2052,7 +2060,7 @@ function checkUrlValue(key, value, path, issues) {
2052
2060
  if (!isDangerousUrlValue(value)) return;
2053
2061
  issues.push({ path, message: `${key}\uC5D0 \uD5C8\uC6A9\uB418\uC9C0 \uC54A\uB294 URL \uC2A4\uD0B4\uC785\uB2C8\uB2E4: ${value}` });
2054
2062
  }
2055
- function validateSpec(page, knownComponents) {
2063
+ function validateSpec(page, knownComponents, slotNamesOf) {
2056
2064
  const issues = [];
2057
2065
  if (!isPlainObject2(page)) return [{ path: "$", message: "\uC2A4\uD399\uC774 \uAC1D\uCCB4\uAC00 \uC544\uB2D9\uB2C8\uB2E4" }];
2058
2066
  if (page.version !== 1) issues.push({ path: "$.version", message: "version\uC740 1\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4" });
@@ -2062,7 +2070,7 @@ function validateSpec(page, knownComponents) {
2062
2070
  return issues;
2063
2071
  }
2064
2072
  page.body.forEach(
2065
- (child, i) => walkChild(child, `$.body[${i}]`, issues, knownComponents)
2073
+ (child, i) => walkChild(child, `$.body[${i}]`, issues, knownComponents, slotNamesOf)
2066
2074
  );
2067
2075
  return issues;
2068
2076
  }
@@ -2111,7 +2119,7 @@ function validatePageData(data, issues) {
2111
2119
  }
2112
2120
  }
2113
2121
  }
2114
- function walkChild(child, path, issues, known) {
2122
+ function walkChild(child, path, issues, known, slotNamesOf) {
2115
2123
  if (typeof child === "string") return;
2116
2124
  if (!isPlainObject2(child)) {
2117
2125
  issues.push({ path, message: "children \uD56D\uBAA9\uC740 \uBB38\uC790\uC5F4 \uB610\uB294 \uB178\uB4DC \uAC1D\uCCB4\uC5EC\uC57C \uD569\uB2C8\uB2E4" });
@@ -2177,12 +2185,21 @@ function walkChild(child, path, issues, known) {
2177
2185
  if (!isPlainObject2(node.slots)) {
2178
2186
  issues.push({ path: `${path}.slots`, message: "slots\uB294 \uAC1D\uCCB4\uC5EC\uC57C \uD569\uB2C8\uB2E4" });
2179
2187
  } else {
2188
+ const slotNames = slotNamesOf?.(node.component) ?? null;
2180
2189
  for (const [slot, children] of Object.entries(node.slots)) {
2190
+ if (slotNames && !slotNames.has(slot)) {
2191
+ issues.push({
2192
+ path: `${path}.slots.${slot}`,
2193
+ message: slotNames.size === 0 ? `${node.component}\uC5D0\uB294 \uC2AC\uB86F\uC774 \uC5C6\uC2B5\uB2C8\uB2E4 \u2014 \uC774 \uB0B4\uC6A9\uC740 \uADF8\uB824\uC9C0\uC9C0 \uC54A\uC2B5\uB2C8\uB2E4` : `${node.component}\uAC00 \uBAA8\uB974\uB294 \uC2AC\uB86F: ${slot} (\uC544\uB294 \uAC83: ${[...slotNames].join(", ")})`
2194
+ });
2195
+ }
2181
2196
  if (!Array.isArray(children)) {
2182
2197
  issues.push({ path: `${path}.slots.${slot}`, message: "\uC2AC\uB86F \uAC12\uC740 \uBC30\uC5F4\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4" });
2183
2198
  continue;
2184
2199
  }
2185
- children.forEach((c, i) => walkChild(c, `${path}.slots.${slot}[${i}]`, issues, known));
2200
+ children.forEach(
2201
+ (c, i) => walkChild(c, `${path}.slots.${slot}[${i}]`, issues, known, slotNamesOf)
2202
+ );
2186
2203
  }
2187
2204
  }
2188
2205
  }
@@ -2190,7 +2207,9 @@ function walkChild(child, path, issues, known) {
2190
2207
  if (!Array.isArray(node.children)) {
2191
2208
  issues.push({ path: `${path}.children`, message: "children\uC740 \uBC30\uC5F4\uC774\uC5B4\uC57C \uD569\uB2C8\uB2E4" });
2192
2209
  } else {
2193
- node.children.forEach((c, i) => walkChild(c, `${path}.children[${i}]`, issues, known));
2210
+ node.children.forEach(
2211
+ (c, i) => walkChild(c, `${path}.children[${i}]`, issues, known, slotNamesOf)
2212
+ );
2194
2213
  }
2195
2214
  }
2196
2215
  }
package/dist/meta.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { b as SduiPropValue, i as SduiNode } from './types-Rngs8hw_.js';
1
+ import { b as SduiPropValue, i as SduiNode } from './types-Bx3oingj.js';
2
2
 
3
3
  /**
4
4
  * 시각 빌더용 컴포넌트 메타데이터 스키마.
@@ -611,6 +611,20 @@ declare function getComponentMeta(name: string, catalog?: Record<string, SduiCom
611
611
  * 노드로도 줄 수 있는 자리)이 나뉘어 있어서, 드롭 대상 목록을 만들 때는 둘을 합쳐야 한다.
612
612
  */
613
613
  declare function slotNamesOf(meta: SduiComponentMeta): string[];
614
+ /**
615
+ * `validateSpec`의 세 번째 인자로 바로 넘길 수 있는 슬롯 이름표.
616
+ *
617
+ * 검증기는 메타를 import 하지 않는다(런타임 번들에 어휘 전체가 딸려 온다).
618
+ * 그래서 메타를 이미 들고 있는 쪽 — 편집기, 스펙 린터 — 이 이 함수를 끼워 준다:
619
+ *
620
+ * ```ts
621
+ * validateSpec(spec, knownComponents, metaSlotNames());
622
+ * ```
623
+ *
624
+ * 메타에 없는 컴포넌트는 `null`을 준다. 프로젝트가 자기 위젯을 메타 없이 등록할 수
625
+ * 있으므로, 모르는 것은 "슬롯이 없다"가 아니라 "검사하지 않는다"여야 한다.
626
+ */
627
+ declare function metaSlotNames(catalog?: Record<string, SduiComponentMeta>): (component: string) => Set<string> | null;
614
628
  /** 팔레트에 실제로 노출할 항목만 분류별로 묶는다(hidden 제외). */
615
629
  declare function paletteGroups(catalog?: Record<string, SduiComponentMeta>): Array<{
616
630
  id: SduiCategory;
@@ -618,4 +632,4 @@ declare function paletteGroups(catalog?: Record<string, SduiComponentMeta>): Arr
618
632
  items: SduiComponentMeta[];
619
633
  }>;
620
634
 
621
- export { ActionsMeta, AlertMeta, ApprovalLineEditorMeta, ApprovalOverridesEditorMeta, ApprovalStepperMeta, AutocompleteFieldMeta, AvatarMeta, BadgeMeta, BreadcrumbMeta, ButtonMeta, CanMeta, CardMeta, ChartMeta, CheckboxMeta, ColMeta, ColumnBoardMeta, DatePickerMeta, DateRangePickerMeta, DialogMeta, DiffViewMeta, DisclosureMeta, DividerMeta, EmptyStateMeta, EventCalendarMeta, ExcelUploadCardMeta, FieldMeta, FileDropzoneMeta, ForEachMeta, FormMeta, FragmentMeta, GridMeta, IconButtonMeta, IconMeta, ImageLightboxMeta, InlineEditMeta, InputMeta, JsonFieldMeta, KeyValueListMeta, LiveClockMeta, MapPreviewMeta, OptionSchemaEditorMeta, OptionValueFieldsMeta, OrgChartBoardMeta, OrgChartMeta, PageHeadMeta, PaginationMeta, PeriodFilterMeta, PermissionMatrixEditorMeta, PositionSelectMeta, PrintSheetMeta, ProfileEditDiffCardMeta, ProgressBarMeta, QRDisplayMeta, RadioMeta, RankBoardMeta, RecordSheetMeta, RemoteSearchResultsMeta, RoleMemberPickerMeta, 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, StagePeriodEditorMeta, StatCardMeta, StripMeta, SummaryTableMeta, SwitchMeta, TableMeta, TabsMeta, TagMeta, TagMultiSelectMeta, TextMeta, TextareaMeta, TimePickerMeta, TimelineMeta, ToastMeta, TooltipMeta, TreePickerMeta, TreeViewMeta, allComponentMeta, builtinComponentMeta, coreComponentMeta, dsComponentMeta, getComponentMeta, paletteGroups, richComponentMeta, slotNamesOf, widgetComponentMeta, withSelfAxis, withSelfAxisAll };
635
+ export { ActionsMeta, AlertMeta, ApprovalLineEditorMeta, ApprovalOverridesEditorMeta, ApprovalStepperMeta, AutocompleteFieldMeta, AvatarMeta, BadgeMeta, BreadcrumbMeta, ButtonMeta, CanMeta, CardMeta, ChartMeta, CheckboxMeta, ColMeta, ColumnBoardMeta, DatePickerMeta, DateRangePickerMeta, DialogMeta, DiffViewMeta, DisclosureMeta, DividerMeta, EmptyStateMeta, EventCalendarMeta, ExcelUploadCardMeta, FieldMeta, FileDropzoneMeta, ForEachMeta, FormMeta, FragmentMeta, GridMeta, IconButtonMeta, IconMeta, ImageLightboxMeta, InlineEditMeta, InputMeta, JsonFieldMeta, KeyValueListMeta, LiveClockMeta, MapPreviewMeta, OptionSchemaEditorMeta, OptionValueFieldsMeta, OrgChartBoardMeta, OrgChartMeta, PageHeadMeta, PaginationMeta, PeriodFilterMeta, PermissionMatrixEditorMeta, PositionSelectMeta, PrintSheetMeta, ProfileEditDiffCardMeta, ProgressBarMeta, QRDisplayMeta, RadioMeta, RankBoardMeta, RecordSheetMeta, RemoteSearchResultsMeta, RoleMemberPickerMeta, 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, StagePeriodEditorMeta, StatCardMeta, StripMeta, SummaryTableMeta, SwitchMeta, TableMeta, TabsMeta, TagMeta, TagMultiSelectMeta, TextMeta, TextareaMeta, TimePickerMeta, TimelineMeta, ToastMeta, TooltipMeta, TreePickerMeta, TreeViewMeta, allComponentMeta, builtinComponentMeta, coreComponentMeta, dsComponentMeta, getComponentMeta, metaSlotNames, paletteGroups, richComponentMeta, slotNamesOf, widgetComponentMeta, withSelfAxis, withSelfAxisAll };
package/dist/meta.js CHANGED
@@ -1674,7 +1674,8 @@ var TextMeta = {
1674
1674
  { value: "metric", label: "\uC9C0\uD45C" },
1675
1675
  { value: "metric-sm", label: "\uC9C0\uD45C \uC791\uAC8C" },
1676
1676
  { value: "mono", label: "\uACE0\uC815\uD3ED" },
1677
- { value: "mono-xs", label: "\uACE0\uC815\uD3ED \uC791\uAC8C" }
1677
+ { value: "mono-xs", label: "\uACE0\uC815\uD3ED \uC791\uAC8C" },
1678
+ { value: "inherit", label: "\uC790\uB9AC\uB97C \uB530\uB984(\uD504\uB9AC\uC14B \uC5C6\uC74C)" }
1678
1679
  ],
1679
1680
  group: "appearance"
1680
1681
  },
@@ -5813,6 +5814,17 @@ function slotNamesOf(meta) {
5813
5814
  ...meta.props.filter((prop) => prop.slot === true).map((prop) => prop.name)
5814
5815
  ];
5815
5816
  }
5817
+ function metaSlotNames(catalog = allComponentMeta) {
5818
+ const cache = /* @__PURE__ */ new Map();
5819
+ return (component) => {
5820
+ const hit = cache.get(component);
5821
+ if (hit !== void 0) return hit;
5822
+ const meta = getComponentMeta(component, catalog);
5823
+ const names = meta ? new Set(slotNamesOf(meta)) : null;
5824
+ cache.set(component, names);
5825
+ return names;
5826
+ };
5827
+ }
5816
5828
  function paletteGroups(catalog = allComponentMeta) {
5817
5829
  const items = Object.values(catalog).filter((meta) => meta.hidden !== true);
5818
5830
  return SDUI_CATEGORIES.map((category) => ({
@@ -5821,4 +5833,4 @@ function paletteGroups(catalog = allComponentMeta) {
5821
5833
  })).filter((group) => group.items.length > 0);
5822
5834
  }
5823
5835
 
5824
- export { ActionsMeta, AlertMeta, ApprovalLineEditorMeta, ApprovalOverridesEditorMeta, ApprovalStepperMeta, AutocompleteFieldMeta, AvatarMeta, BadgeMeta, BreadcrumbMeta, ButtonMeta, CanMeta, CardMeta, ChartMeta, CheckboxMeta, ColMeta, ColumnBoardMeta, DatePickerMeta, DateRangePickerMeta, DialogMeta, DiffViewMeta, DisclosureMeta, DividerMeta, EmptyStateMeta, EventCalendarMeta, ExcelUploadCardMeta, FieldMeta, FileDropzoneMeta, ForEachMeta, FormMeta, FragmentMeta, GridMeta, IconButtonMeta, IconMeta, ImageLightboxMeta, InlineEditMeta, InputMeta, JsonFieldMeta, KeyValueListMeta, LiveClockMeta, MapPreviewMeta, OptionSchemaEditorMeta, OptionValueFieldsMeta, OrgChartBoardMeta, OrgChartMeta, PageHeadMeta, PaginationMeta, PeriodFilterMeta, PermissionMatrixEditorMeta, PositionSelectMeta, PrintSheetMeta, ProfileEditDiffCardMeta, ProgressBarMeta, QRDisplayMeta, RadioMeta, RankBoardMeta, RecordSheetMeta, RemoteSearchResultsMeta, RoleMemberPickerMeta, RowMeta, SDUI_CATEGORIES, SELF_AXIS_PROPS, SearchResultsMeta, SearchableMultiPickerMeta, SectionMeta, SecureScreenMeta, SegmentedControlMeta, SelectMeta, ShowMeta, SidebarNavMeta, SortHandleMeta, SortableListMeta, SpacerMeta, SpinnerMeta, StackedMeterMeta, StagePeriodEditorMeta, StatCardMeta, StripMeta, SummaryTableMeta, SwitchMeta, TableMeta, TabsMeta, TagMeta, TagMultiSelectMeta, TextMeta, TextareaMeta, TimePickerMeta, TimelineMeta, ToastMeta, TooltipMeta, TreePickerMeta, TreeViewMeta, allComponentMeta, builtinComponentMeta, coreComponentMeta, dsComponentMeta, getComponentMeta, paletteGroups, richComponentMeta, slotNamesOf, widgetComponentMeta, withSelfAxis, withSelfAxisAll };
5836
+ export { ActionsMeta, AlertMeta, ApprovalLineEditorMeta, ApprovalOverridesEditorMeta, ApprovalStepperMeta, AutocompleteFieldMeta, AvatarMeta, BadgeMeta, BreadcrumbMeta, ButtonMeta, CanMeta, CardMeta, ChartMeta, CheckboxMeta, ColMeta, ColumnBoardMeta, DatePickerMeta, DateRangePickerMeta, DialogMeta, DiffViewMeta, DisclosureMeta, DividerMeta, EmptyStateMeta, EventCalendarMeta, ExcelUploadCardMeta, FieldMeta, FileDropzoneMeta, ForEachMeta, FormMeta, FragmentMeta, GridMeta, IconButtonMeta, IconMeta, ImageLightboxMeta, InlineEditMeta, InputMeta, JsonFieldMeta, KeyValueListMeta, LiveClockMeta, MapPreviewMeta, OptionSchemaEditorMeta, OptionValueFieldsMeta, OrgChartBoardMeta, OrgChartMeta, PageHeadMeta, PaginationMeta, PeriodFilterMeta, PermissionMatrixEditorMeta, PositionSelectMeta, PrintSheetMeta, ProfileEditDiffCardMeta, ProgressBarMeta, QRDisplayMeta, RadioMeta, RankBoardMeta, RecordSheetMeta, RemoteSearchResultsMeta, RoleMemberPickerMeta, RowMeta, SDUI_CATEGORIES, SELF_AXIS_PROPS, SearchResultsMeta, SearchableMultiPickerMeta, SectionMeta, SecureScreenMeta, SegmentedControlMeta, SelectMeta, ShowMeta, SidebarNavMeta, SortHandleMeta, SortableListMeta, SpacerMeta, SpinnerMeta, StackedMeterMeta, StagePeriodEditorMeta, StatCardMeta, StripMeta, SummaryTableMeta, SwitchMeta, TableMeta, TabsMeta, TagMeta, TagMultiSelectMeta, TextMeta, TextareaMeta, TimePickerMeta, TimelineMeta, ToastMeta, TooltipMeta, TreePickerMeta, TreeViewMeta, allComponentMeta, builtinComponentMeta, coreComponentMeta, dsComponentMeta, getComponentMeta, metaSlotNames, paletteGroups, richComponentMeta, slotNamesOf, widgetComponentMeta, withSelfAxis, withSelfAxisAll };
@@ -108,7 +108,9 @@ interface SduiCalcRef {
108
108
  * "OR": [ { "status": "open" }, { "owner": { "isNull": true } } ] }
109
109
  *
110
110
  * 필드 연산: eq · ne · gt · gte · lt · lte · in · notIn · contains ·
111
- * startsWith · endsWith · isNull · isEmpty. 값이 연산 객체가 아니면 `eq`로 읽는다.
111
+ * startsWith · endsWith · isNull · isEmpty · intersects. 값이 연산 객체가 아니면
112
+ * `eq`로 읽는다. `in`은 "행의 값이 목록에 있는가", `intersects`는 "행의 **배열**이
113
+ * 목록과 겹치는가" — 방향이 반대다(구성원·태그 목록을 거르는 자리).
112
114
  * (`isNull`은 null·undefined·''를, `isEmpty`는 거기에 빈 배열·빈 객체까지 본다.)
113
115
  * 같은 객체의 키들은 AND이고, `AND`/`OR`는 술어 배열, `NOT`은 술어 하나다.
114
116
  * 술어 안의 값에도 참조를 쓸 수 있는데, 이때 `$item`은 거르고 있는 행이 아니라
@@ -1,4 +1,4 @@
1
- export { OPTION_TYPES, OptionSchemaEditor } from '../chunk-TIY4A223.js';
2
- import '../chunk-QO6UJAQN.js';
1
+ export { OPTION_TYPES, OptionSchemaEditor } from '../chunk-PTRECRQB.js';
2
+ import '../chunk-ODZSELDV.js';
3
3
  import '../chunk-WIDDHR7L.js';
4
4
  import '../chunk-SAN4IX6N.js';
@@ -1,4 +1,4 @@
1
- export { OptionValueFields } from '../chunk-CTSVZTIT.js';
2
- import '../chunk-QO6UJAQN.js';
1
+ export { OptionValueFields } from '../chunk-HHTGWH5I.js';
2
+ import '../chunk-ODZSELDV.js';
3
3
  import '../chunk-WIDDHR7L.js';
4
4
  import '../chunk-SAN4IX6N.js';
@@ -34,10 +34,10 @@ import { JsonField } from '../chunk-JVBZRDC2.js';
34
34
  export { JsonField } from '../chunk-JVBZRDC2.js';
35
35
  import { LiveClock } from '../chunk-Z3WGIFJP.js';
36
36
  export { LiveClock } from '../chunk-Z3WGIFJP.js';
37
- import { OptionSchemaEditor } from '../chunk-TIY4A223.js';
38
- export { OptionSchemaEditor } from '../chunk-TIY4A223.js';
39
- import { OptionValueFields } from '../chunk-CTSVZTIT.js';
40
- export { OptionValueFields } from '../chunk-CTSVZTIT.js';
37
+ import { OptionSchemaEditor } from '../chunk-PTRECRQB.js';
38
+ export { OptionSchemaEditor } from '../chunk-PTRECRQB.js';
39
+ import { OptionValueFields } from '../chunk-HHTGWH5I.js';
40
+ export { OptionValueFields } from '../chunk-HHTGWH5I.js';
41
41
  import { OrgChart } from '../chunk-QWJ3OBBL.js';
42
42
  export { OrgChart } from '../chunk-QWJ3OBBL.js';
43
43
  import { OrgChartBoard } from '../chunk-NGZI4V3O.js';
@@ -61,7 +61,7 @@ export { ImageLightbox } from '../chunk-XPBZMECW.js';
61
61
  import { InlineEdit } from '../chunk-KT3ZVBLN.js';
62
62
  export { InlineEdit } from '../chunk-KT3ZVBLN.js';
63
63
  import '../chunk-QU7YVMFA.js';
64
- import '../chunk-QO6UJAQN.js';
64
+ import '../chunk-ODZSELDV.js';
65
65
  import '../chunk-THEP3VWY.js';
66
66
  import '../chunk-SNRKPEWT.js';
67
67
  import { ApprovalOverridesEditor } from '../chunk-G7JKDAS5.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wipco/sdui",
3
- "version": "0.36.0",
3
+ "version": "0.38.0",
4
4
  "description": "WIPCO 서버 주도 UI(SDUI) 렌더러 — JSON 페이지 스펙을 React 컴포넌트로 렌더링",
5
5
  "keywords": [
6
6
  "sdui",