@wipco/sdui 0.32.0 → 0.33.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,109 @@
1
+ import { useSduiAssetResolver } from './chunk-DKPNFEVU.js';
2
+ import { Spinner, Icon } from './chunk-WIDDHR7L.js';
3
+ import { boxed } from './chunk-SAN4IX6N.js';
4
+ import { useState, useEffect } from 'react';
5
+ import { jsxs, jsx } from 'react/jsx-runtime';
6
+
7
+ var FALLBACK_NOTE = "QR \uC774\uBBF8\uC9C0\uB97C \uBD88\uB7EC\uC624\uC9C0 \uBABB\uD588\uC2B5\uB2C8\uB2E4 \u2014 \uC11C\uBC84 \uC5F0\uACB0\uC744 \uD655\uC778\uD558\uC138\uC694";
8
+ var boxStyle = (size) => ({
9
+ width: size,
10
+ height: size,
11
+ display: "flex",
12
+ flexDirection: "column",
13
+ alignItems: "center",
14
+ justifyContent: "center",
15
+ gap: "var(--wp-space-2)"
16
+ });
17
+ function QRDisplayImpl({
18
+ path,
19
+ url,
20
+ size = 128,
21
+ endpoint = "/qr",
22
+ caption
23
+ }) {
24
+ const [absoluteUrl, setAbsoluteUrl] = useState(null);
25
+ const [failed, setFailed] = useState(false);
26
+ const resolveAsset = useSduiAssetResolver();
27
+ useEffect(() => {
28
+ setFailed(false);
29
+ try {
30
+ const base = window.location.origin;
31
+ const target = url ?? path ?? window.location.href;
32
+ setAbsoluteUrl(new URL(target, base).toString());
33
+ } catch {
34
+ setAbsoluteUrl(null);
35
+ setFailed(true);
36
+ }
37
+ }, [path, url]);
38
+ const raw = absoluteUrl !== null ? `${endpoint}${endpoint.includes("?") ? "&" : "?"}data=${encodeURIComponent(absoluteUrl)}&size=${size}` : null;
39
+ const src = raw === null ? null : resolveAsset(raw, { component: "QRDisplay", prop: "src", kind: "attribute" });
40
+ const pending = absoluteUrl === null && !failed;
41
+ return /* @__PURE__ */ jsxs(
42
+ "figure",
43
+ {
44
+ style: {
45
+ display: "inline-flex",
46
+ flexDirection: "column",
47
+ alignItems: "center",
48
+ gap: "var(--wp-space-3)",
49
+ margin: 0,
50
+ padding: "var(--wp-space-4)",
51
+ background: "var(--wp-surface-card)",
52
+ border: "1px solid var(--wp-border-subtle)",
53
+ borderRadius: "var(--wp-radius-md)",
54
+ boxShadow: "var(--wp-shadow-xs)"
55
+ },
56
+ children: [
57
+ failed || src === null ? /* @__PURE__ */ jsx(
58
+ "div",
59
+ {
60
+ role: "img",
61
+ "aria-label": FALLBACK_NOTE,
62
+ style: {
63
+ ...boxStyle(size),
64
+ border: "1px dashed var(--wp-border-strong)",
65
+ borderRadius: "var(--wp-radius-md)",
66
+ background: "var(--wp-surface-sunken)",
67
+ color: "var(--wp-text-subtle)"
68
+ },
69
+ children: pending ? /* @__PURE__ */ jsx(Spinner, { label: "QR \uC900\uBE44 \uC911" }) : /* @__PURE__ */ jsx(Icon, { name: "scan", size: 24 })
70
+ }
71
+ ) : /* @__PURE__ */ jsx(
72
+ "img",
73
+ {
74
+ src,
75
+ width: size,
76
+ height: size,
77
+ alt: caption ? `QR \uCF54\uB4DC \u2014 ${caption}` : "QR \uCF54\uB4DC",
78
+ onError: () => setFailed(true),
79
+ style: {
80
+ display: "block",
81
+ borderRadius: "var(--wp-radius-xs)",
82
+ maxWidth: "100%"
83
+ }
84
+ }
85
+ ),
86
+ /* @__PURE__ */ jsxs(
87
+ "figcaption",
88
+ {
89
+ style: {
90
+ display: "flex",
91
+ flexDirection: "column",
92
+ alignItems: "center",
93
+ gap: "var(--wp-space-1)",
94
+ maxWidth: Math.max(size, 160),
95
+ textAlign: "center"
96
+ },
97
+ children: [
98
+ caption && /* @__PURE__ */ jsx("span", { className: "wp-caption", style: { color: "var(--wp-text-muted)" }, children: caption }),
99
+ failed && /* @__PURE__ */ jsx("span", { className: "wp-caption", style: { color: "var(--wp-text-subtle)" }, children: FALLBACK_NOTE })
100
+ ]
101
+ }
102
+ )
103
+ ]
104
+ }
105
+ );
106
+ }
107
+ var QRDisplay = boxed(QRDisplayImpl, "QRDisplay");
108
+
109
+ export { QRDisplay };
package/dist/meta.d.ts CHANGED
@@ -435,6 +435,7 @@ declare const ExcelUploadCardMeta: SduiComponentMeta;
435
435
  declare const OptionSchemaEditorMeta: SduiComponentMeta;
436
436
  declare const OptionValueFieldsMeta: SduiComponentMeta;
437
437
  declare const StagePeriodEditorMeta: SduiComponentMeta;
438
+ declare const QRDisplayMeta: SduiComponentMeta;
438
439
  declare const AutocompleteFieldMeta: SduiComponentMeta;
439
440
  declare const InlineEditMeta: SduiComponentMeta;
440
441
  declare const JsonFieldMeta: SduiComponentMeta;
@@ -471,6 +472,7 @@ declare const widgetComponentMeta: {
471
472
  ApprovalLineEditor: SduiComponentMeta;
472
473
  ApprovalOverridesEditor: SduiComponentMeta;
473
474
  ApprovalStepper: SduiComponentMeta;
475
+ QRDisplay: SduiComponentMeta;
474
476
  OptionSchemaEditor: SduiComponentMeta;
475
477
  OptionValueFields: SduiComponentMeta;
476
478
  StagePeriodEditor: SduiComponentMeta;
@@ -612,4 +614,4 @@ declare function paletteGroups(catalog?: Record<string, SduiComponentMeta>): Arr
612
614
  items: SduiComponentMeta[];
613
615
  }>;
614
616
 
615
- 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, PrintSheetMeta, ProgressBarMeta, 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 };
617
+ 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, PrintSheetMeta, 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 };
package/dist/meta.js CHANGED
@@ -4177,6 +4177,58 @@ var StagePeriodEditorMeta = {
4177
4177
  },
4178
4178
  resize: { kind: "none" }
4179
4179
  };
4180
+ var QRDisplayMeta = {
4181
+ name: "QRDisplay",
4182
+ label: "QR \uCF54\uB4DC",
4183
+ category: "display",
4184
+ icon: "scan",
4185
+ description: "\uBC31\uC5D4\uB4DC QR \uB80C\uB354\uB7EC(GET /qr)\uB85C \uB9CC\uB4E0 QR \uC774\uBBF8\uC9C0\uB97C \uCEA1\uC158\uACFC \uD568\uAED8 \uBCF4\uC5EC\uC900\uB2E4. \uB85C\uB4DC\uC5D0 \uC2E4\uD328\uD558\uBA74 \uC810\uC120 \uD50C\uB808\uC774\uC2A4\uD640\uB354\uB85C \uB300\uCCB4\uB41C\uB2E4.",
4186
+ props: [
4187
+ {
4188
+ name: "path",
4189
+ kind: "string",
4190
+ label: "\uC571 \uB0B4\uBD80 \uACBD\uB85C",
4191
+ bindable: true,
4192
+ description: '\uC608: "/public/asset/unit/WP-0001". \uB9C8\uC6B4\uD2B8 \uD6C4 \uC808\uB300 URL\uB85C \uBCC0\uD658\uD574 \uC778\uCF54\uB529\uD55C\uB2E4.',
4193
+ group: "content"
4194
+ },
4195
+ // 실측 2/2
4196
+ {
4197
+ name: "url",
4198
+ kind: "string",
4199
+ label: "URL \uC9C1\uC811 \uC9C0\uC815",
4200
+ bindable: true,
4201
+ description: "path\uBCF4\uB2E4 \uC6B0\uC120\uD55C\uB2E4.",
4202
+ group: "content",
4203
+ advanced: true
4204
+ },
4205
+ // 실측 0/2 — 구현에는 있다
4206
+ {
4207
+ name: "size",
4208
+ kind: "number",
4209
+ label: "\uD06C\uAE30(px)",
4210
+ default: 128,
4211
+ description: "QR \uD55C \uBCC0. \uAC00\uB85C\xB7\uC138\uB85C\uAC00 \uAC19\uC774 \uC6C0\uC9C1\uC778\uB2E4.",
4212
+ group: "appearance"
4213
+ },
4214
+ // 실측 2/2 (148, 112)
4215
+ { name: "caption", kind: "string", label: "\uCEA1\uC158", group: "content" }
4216
+ // 실측 2/2
4217
+ ],
4218
+ children: { accepts: false },
4219
+ dom: { element: "figure" },
4220
+ // 실측: 루트가 <figure>
4221
+ preset: {
4222
+ component: "QRDisplay",
4223
+ props: { path: "/", size: 128, caption: "QR \uCF54\uB4DC" }
4224
+ },
4225
+ // size 하나가 한 변이라 가로 손잡이든 세로 손잡이든 같은 프롭을 움직인다.
4226
+ // 실측(resizePatch 직접 호출): dx=+40 dy=0 → {size:168} · dx=0 dy=+40 → {size:168} ·
4227
+ // dx=+40 dy=+10 → {size:168}. 대각선은 더 많이 끈 축을 따른다(합산이 아니다).
4228
+ // 처음 적을 때는 이 문장을 재보지 않고 썼고 실제로는 거짓이었다 — 가로 손잡이가
4229
+ // 죽어 있었다. resize.ts의 "같은 프롭이면 축을 합친다" 분기를 그때 넣어 참으로 만들었다.
4230
+ resize: { kind: "numeric", widthProp: "size", heightProp: "size", unit: "px", axis: "both" }
4231
+ };
4180
4232
  var AutocompleteFieldMeta = {
4181
4233
  name: "AutocompleteField",
4182
4234
  label: "\uC790\uB3D9\uC644\uC131",
@@ -5597,6 +5649,7 @@ var widgetComponentMeta = {
5597
5649
  ApprovalLineEditor: ApprovalLineEditorMeta,
5598
5650
  ApprovalOverridesEditor: ApprovalOverridesEditorMeta,
5599
5651
  ApprovalStepper: ApprovalStepperMeta,
5652
+ QRDisplay: QRDisplayMeta,
5600
5653
  OptionSchemaEditor: OptionSchemaEditorMeta,
5601
5654
  OptionValueFields: OptionValueFieldsMeta,
5602
5655
  StagePeriodEditor: StagePeriodEditorMeta,
@@ -5663,4 +5716,4 @@ function paletteGroups(catalog = allComponentMeta) {
5663
5716
  })).filter((group) => group.items.length > 0);
5664
5717
  }
5665
5718
 
5666
- 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, PrintSheetMeta, ProgressBarMeta, 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 };
5719
+ 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, PrintSheetMeta, 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 };
@@ -0,0 +1,45 @@
1
+ import * as React from 'react';
2
+ import { S as SduiBoxProps } from '../layout-B1QrIBm6.js';
3
+
4
+ /**
5
+ * QRDisplay — 백엔드 QR 렌더러(GET {API_BASE}/qr)로 만든 QR 이미지를 카드로 표시.
6
+ *
7
+ * path(앱 내부 경로) 또는 url을 받아 마운트 후 절대 URL로 변환해
8
+ * 인코딩한다(SSR 안전). 백엔드가 없어 이미지 로드가 실패하면 점선
9
+ * 플레이스홀더 + 안내 문구로 대체한다.
10
+ *
11
+ * ## 자산 관문을 스스로 통과시킨다 (useSduiAssetResolver)
12
+ *
13
+ * 렌더러의 자산 순회는 **스펙이 준 URL**만 본다. 이 컴포넌트는 그 검사에 걸릴 문자열이
14
+ * 애초에 없다 — `src`를 프롭으로 받지 않고 `apiUrl('/qr?data=…')`로 **안에서 만들어**
15
+ * 붙이기 때문이다. 그래서 편집기 캔버스가 클릭·fetch·navigate를 다 막아 둔 상태에서도
16
+ * 이 `<img>` 하나는 잠금 밖이었다. 목적지가 동일 오리진이라 **세션 쿠키까지 실린다.**
17
+ *
18
+ * 더 나쁜 경우가 둘 더 있다.
19
+ * - 프롭을 아예 안 주면 `window.location.href`로 채우는데(아래 effect), 캔버스에서 그건
20
+ * **편집기 자신의 URL**이다. 남의 스펙을 여는 것만으로 편집 중인 화면 주소가 QR 인코딩
21
+ * 요청에 실려 나간다.
22
+ * - Tauri 데스크톱에서 `apiUrl`의 기준은 **사용자가 설정한 임의 호스트**다. 웹처럼
23
+ * 동일 오리진으로 끝나지 않는다.
24
+ *
25
+ * 그래서 URL을 만든 쪽이 직접 관문에 태운다. 진짜 앱에서는 항등함수라
26
+ * (`defaultAdapter.resolveAsset`) 바이트 단위로 같은 요청이 나간다.
27
+ */
28
+ interface QRDisplayProps {
29
+ /** QR에 담을 앱 내부 경로(예: "/hr/employees/1"). 마운트 후 절대 URL로 변환. */
30
+ path?: string;
31
+ /** 절대/상대 URL을 직접 지정. path보다 우선한다. */
32
+ url?: string;
33
+ /** QR 한 변(px). 기본 128. */
34
+ size?: number;
35
+ /**
36
+ * QR 이미지를 내주는 서버 경로. `?data=<인코딩된 URL>&size=<px>` 가 붙는다.
37
+ * 기본 '/qr'. API 가 다른 오리진이면 그 절대 주소를 넘긴다.
38
+ */
39
+ endpoint?: string;
40
+ caption?: string;
41
+ }
42
+ /** 바깥에서 온 `style`·`className`을 뿌리에 얹어 내보낸다 — 자기 축(폭·여백)이 닿게 하는 통로. */
43
+ declare const QRDisplay: React.FC<QRDisplayProps & SduiBoxProps>;
44
+
45
+ export { QRDisplay, type QRDisplayProps };
@@ -0,0 +1,4 @@
1
+ export { QRDisplay } from '../chunk-PCMJE2GO.js';
2
+ import '../chunk-DKPNFEVU.js';
3
+ import '../chunk-WIDDHR7L.js';
4
+ import '../chunk-SAN4IX6N.js';
@@ -24,6 +24,8 @@ import { RecordSheetProps } from './RecordSheet.js';
24
24
  export { RecordSheet, RecordSheetCell, RecordSheetCellKind, RecordSheetRow } from './RecordSheet.js';
25
25
  import { RankBoardProps } from './RankBoard.js';
26
26
  export { RankBoard } from './RankBoard.js';
27
+ import { QRDisplayProps } from './QRDisplay.js';
28
+ export { QRDisplay } from './QRDisplay.js';
27
29
  import { PrintSheetProps } from './PrintSheet.js';
28
30
  export { PrintSheet } from './PrintSheet.js';
29
31
  import { PeriodFilterProps } from './PeriodFilter.js';
@@ -91,6 +93,7 @@ declare const widgetComponents: {
91
93
  PermissionMatrixEditor: React.FC<PermissionMatrixEditorProps & SduiBoxProps>;
92
94
  PeriodFilter: React.FC<PeriodFilterProps & SduiBoxProps>;
93
95
  PrintSheet: React.FC<PrintSheetProps & SduiBoxProps>;
96
+ QRDisplay: React.FC<QRDisplayProps & SduiBoxProps>;
94
97
  RankBoard: React.FC<RankBoardProps & SduiBoxProps>;
95
98
  RecordSheet: React.FC<RecordSheetProps & SduiBoxProps>;
96
99
  RoleMemberPicker: React.FC<RoleMemberPickerProps & SduiBoxProps>;
@@ -108,4 +111,4 @@ declare const widgetComponents: {
108
111
  /** 위젯 어휘의 컴포넌트 이름 union — 메타데이터 대조에 쓴다(`@wipco/sdui/meta`). */
109
112
  type SduiWidgetComponentName = keyof typeof widgetComponents;
110
113
 
111
- export { ApprovalLineEditorProps, ApprovalOverridesEditorProps, ApprovalStepperProps, ColumnBoardProps, DiffViewProps, DisclosureProps, EventCalendarProps, ImageLightboxProps, InlineEditProps, JsonFieldProps, LiveClockProps, OptionSchemaEditorProps, OptionValueFieldsProps, OrgChartBoardProps, OrgChartProps, PeriodFilterProps, PermissionMatrixEditorProps, PrintSheetProps, RankBoardProps, RecordSheetProps, RoleMemberPickerProps, type SduiWidgetComponentName, SearchableMultiPickerProps, SecureScreenProps, StackedMeterProps, StagePeriodEditorProps, StripProps, SummaryTableProps, TagMultiSelectProps, TimelineProps, TreePickerProps, TreeViewProps, widgetComponents };
114
+ export { ApprovalLineEditorProps, ApprovalOverridesEditorProps, ApprovalStepperProps, ColumnBoardProps, DiffViewProps, DisclosureProps, EventCalendarProps, ImageLightboxProps, InlineEditProps, JsonFieldProps, LiveClockProps, OptionSchemaEditorProps, OptionValueFieldsProps, OrgChartBoardProps, OrgChartProps, PeriodFilterProps, PermissionMatrixEditorProps, PrintSheetProps, QRDisplayProps, RankBoardProps, RecordSheetProps, RoleMemberPickerProps, type SduiWidgetComponentName, SearchableMultiPickerProps, SecureScreenProps, StackedMeterProps, StagePeriodEditorProps, StripProps, SummaryTableProps, TagMultiSelectProps, TimelineProps, TreePickerProps, TreeViewProps, widgetComponents };
@@ -1,3 +1,5 @@
1
+ import { StagePeriodEditor } from '../chunk-KVFHPBAY.js';
2
+ export { StagePeriodEditor } from '../chunk-KVFHPBAY.js';
1
3
  import { Strip } from '../chunk-ZH5MLOZS.js';
2
4
  export { Strip } from '../chunk-ZH5MLOZS.js';
3
5
  import { SummaryTable } from '../chunk-O4U7Y3XL.js';
@@ -10,6 +12,8 @@ import { TreeView } from '../chunk-X5R2HHEN.js';
10
12
  export { TreeView, buildTreeNodes } from '../chunk-X5R2HHEN.js';
11
13
  import { PrintSheet } from '../chunk-MYJ2KEIP.js';
12
14
  export { PrintSheet } from '../chunk-MYJ2KEIP.js';
15
+ import { QRDisplay } from '../chunk-PCMJE2GO.js';
16
+ export { QRDisplay } from '../chunk-PCMJE2GO.js';
13
17
  import { RankBoard } from '../chunk-U6H7YN4I.js';
14
18
  export { RankBoard } from '../chunk-U6H7YN4I.js';
15
19
  import { RecordSheet } from '../chunk-K3JBSWFI.js';
@@ -22,8 +26,6 @@ import { SecureScreen } from '../chunk-IIRENCDS.js';
22
26
  export { SecureScreen } from '../chunk-IIRENCDS.js';
23
27
  import { StackedMeter } from '../chunk-BMZKZGJF.js';
24
28
  export { StackedMeter } from '../chunk-BMZKZGJF.js';
25
- import { StagePeriodEditor } from '../chunk-KVFHPBAY.js';
26
- export { StagePeriodEditor } from '../chunk-KVFHPBAY.js';
27
29
  import { JsonField } from '../chunk-JVBZRDC2.js';
28
30
  export { JsonField } from '../chunk-JVBZRDC2.js';
29
31
  import { LiveClock } from '../chunk-Z3WGIFJP.js';
@@ -93,6 +95,7 @@ var widgetComponents = {
93
95
  PermissionMatrixEditor,
94
96
  PeriodFilter,
95
97
  PrintSheet,
98
+ QRDisplay,
96
99
  RankBoard,
97
100
  RecordSheet,
98
101
  RoleMemberPicker,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@wipco/sdui",
3
- "version": "0.32.0",
3
+ "version": "0.33.0",
4
4
  "description": "WIPCO 서버 주도 UI(SDUI) 렌더러 — JSON 페이지 스펙을 React 컴포넌트로 렌더링",
5
5
  "keywords": [
6
6
  "sdui",
@@ -120,6 +120,10 @@
120
120
  "types": "./dist/widgets/PrintSheet.d.ts",
121
121
  "default": "./dist/widgets/PrintSheet.js"
122
122
  },
123
+ "./widgets/QRDisplay": {
124
+ "types": "./dist/widgets/QRDisplay.d.ts",
125
+ "default": "./dist/widgets/QRDisplay.js"
126
+ },
123
127
  "./widgets/RankBoard": {
124
128
  "types": "./dist/widgets/RankBoard.d.ts",
125
129
  "default": "./dist/widgets/RankBoard.js"