@g1cloud/ui-modeler-next 5.0.0-alpha.1

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 (68) hide show
  1. package/README.md +140 -0
  2. package/dist/adapter/attrCodec.d.ts +12 -0
  3. package/dist/adapter/interpretFlat.d.ts +20 -0
  4. package/dist/adapter/legacyGridSort.d.ts +11 -0
  5. package/dist/adapter/legacyText.d.ts +31 -0
  6. package/dist/adapter/legacyValidator.d.ts +2 -0
  7. package/dist/adapter/migrate.d.ts +47 -0
  8. package/dist/adapter/persisted.d.ts +75 -0
  9. package/dist/adapter/uiModelAdapter.d.ts +80 -0
  10. package/dist/agent/buildAgentBatch.d.ts +22 -0
  11. package/dist/agent/describeScreen.d.ts +21 -0
  12. package/dist/agent/resolver.d.ts +72 -0
  13. package/dist/agent/schema.d.ts +15 -0
  14. package/dist/agent/strictSubset.d.ts +30 -0
  15. package/dist/agent/symbolicOp.d.ts +97 -0
  16. package/dist/catalog/builtin/basic.d.ts +3 -0
  17. package/dist/catalog/builtin/chart.d.ts +3 -0
  18. package/dist/catalog/builtin/composite.d.ts +3 -0
  19. package/dist/catalog/builtin/etc.d.ts +3 -0
  20. package/dist/catalog/builtin/filter.d.ts +3 -0
  21. package/dist/catalog/builtin/grid.d.ts +3 -0
  22. package/dist/catalog/builtin/index.d.ts +3 -0
  23. package/dist/catalog/builtin/input.d.ts +3 -0
  24. package/dist/catalog/builtin/layout.d.ts +3 -0
  25. package/dist/catalog/builtin/listField.d.ts +3 -0
  26. package/dist/catalog/builtin/multilang.d.ts +3 -0
  27. package/dist/catalog/builtin/shared.d.ts +69 -0
  28. package/dist/catalog/builtin/tree.d.ts +3 -0
  29. package/dist/catalog/catalog.d.ts +13 -0
  30. package/dist/catalog/containment.d.ts +26 -0
  31. package/dist/catalog/index.d.ts +6 -0
  32. package/dist/catalog/propertyEditor.d.ts +24 -0
  33. package/dist/catalog/styleTokens.d.ts +54 -0
  34. package/dist/catalog/toAgentCatalog.d.ts +57 -0
  35. package/dist/catalog/types.d.ts +117 -0
  36. package/dist/command/commands.d.ts +25 -0
  37. package/dist/command/op.d.ts +83 -0
  38. package/dist/command/opSync.d.ts +84 -0
  39. package/dist/command/stack.d.ts +47 -0
  40. package/dist/command/types.d.ts +23 -0
  41. package/dist/core/attrValue.d.ts +50 -0
  42. package/dist/core/caseMessage.d.ts +13 -0
  43. package/dist/core/gridDefaultSort.d.ts +15 -0
  44. package/dist/core/id.d.ts +2 -0
  45. package/dist/core/lang.d.ts +25 -0
  46. package/dist/core/partType.d.ts +30 -0
  47. package/dist/core/traverse.d.ts +24 -0
  48. package/dist/core/types.d.ts +40 -0
  49. package/dist/core/validation.d.ts +21 -0
  50. package/dist/core/validatorConfig.d.ts +48 -0
  51. package/dist/editor/controller.d.ts +125 -0
  52. package/dist/index.d.ts +42 -0
  53. package/dist/ui-modeler-next.css +1 -0
  54. package/dist/ui-modeler.js +3965 -0
  55. package/dist/ui-modeler.umd.cjs +1 -0
  56. package/dist/view/InlineIssueBadge.vue.d.ts +7 -0
  57. package/dist/view/MultiLangTextField.vue.d.ts +19 -0
  58. package/dist/view/PartCanvas.vue.d.ts +12 -0
  59. package/dist/view/PartPalette.vue.d.ts +2 -0
  60. package/dist/view/PartTree.vue.d.ts +7 -0
  61. package/dist/view/PropertyPanel.vue.d.ts +2 -0
  62. package/dist/view/RendererRegistry.d.ts +28 -0
  63. package/dist/view/SchematicPart.vue.d.ts +29 -0
  64. package/dist/view/dnd.d.ts +19 -0
  65. package/dist/view/preview/IframePreview.vue.d.ts +22 -0
  66. package/dist/view/preview/protocol.d.ts +40 -0
  67. package/dist/view/validationDisplay.d.ts +8 -0
  68. package/package.json +56 -0
@@ -0,0 +1,3965 @@
1
+ var Yt = Object.defineProperty;
2
+ var Vt = (e, t, r) => t in e ? Yt(e, t, { enumerable: !0, configurable: !0, writable: !0, value: r }) : e[t] = r;
3
+ var G = (e, t, r) => Vt(e, typeof t != "symbol" ? t + "" : t, r);
4
+ import { reactive as Wt, ref as Y, computed as D, defineComponent as ne, openBlock as L, createElementBlock as I, normalizeClass as be, createElementVNode as U, toDisplayString as X, createCommentVNode as ue, renderSlot as zt, inject as Be, resolveComponent as ct, createBlock as Me, resolveDynamicComponent as jt, mergeProps as Kt, withCtx as qt, Fragment as z, renderList as Z, watch as ut, createTextVNode as Jt, createVNode as dt, unref as W, normalizeStyle as pt, onMounted as Zt, onBeforeUnmount as Qt } from "vue";
5
+ const ft = {
6
+ Layout: [
7
+ "VerticalLayout",
8
+ "HorizontalLayout",
9
+ "CardLayout",
10
+ "ActionLayout",
11
+ "ActionLayoutArea",
12
+ "FormLayout",
13
+ "TableLayout",
14
+ "TableLayoutCell",
15
+ "FlowLayout",
16
+ "ExpansionLayout",
17
+ "InternalLayoutArea"
18
+ ],
19
+ Basic: [
20
+ "Button",
21
+ "PopupButton",
22
+ "Label",
23
+ "Image",
24
+ "Link",
25
+ "LinkTab",
26
+ "ProgressBar",
27
+ "Console",
28
+ "NativeUpload",
29
+ "AuditInfo",
30
+ "AuditInfoButton"
31
+ ],
32
+ Input: [
33
+ "TextField",
34
+ "TextArea",
35
+ "StyledTextField",
36
+ "RichTextArea",
37
+ "TelField",
38
+ "NumberField",
39
+ "CurrencyField",
40
+ "DateField",
41
+ "TimeField",
42
+ "DateRange",
43
+ "CheckBox",
44
+ "RadioButton",
45
+ "RadioGroup",
46
+ "CheckBoxGroup",
47
+ "YesNoGroup",
48
+ "Select",
49
+ "MultiSelect",
50
+ "CategorySelect",
51
+ "PopupSelect",
52
+ "YesNoSelect",
53
+ "ColorField"
54
+ ],
55
+ Composite: [
56
+ "MultiFileUpload",
57
+ "SingleFileUpload",
58
+ "SingleImageUpload",
59
+ "NameField",
60
+ "AddressField",
61
+ "PageBuilder",
62
+ "ContentEditor"
63
+ ],
64
+ MultiLang: [
65
+ "MultiLangTextField",
66
+ "MultiLangTextArea",
67
+ "MultiLangStyledTextField",
68
+ "MultiLangRichTextArea",
69
+ "MultiLangPageBuilder",
70
+ "MultiLangContentEditor",
71
+ "MultiLangFileUpload"
72
+ ],
73
+ Grid: ["Grid", "GridControl", "GridLookup", "ColumnDef", "GridCellPanel"],
74
+ Tree: ["Tree", "TreeControl", "TabSheet", "TabSheetPanel"],
75
+ Filter: [
76
+ "TextFilter",
77
+ "NumberFilter",
78
+ "SelectFilter",
79
+ "MultiSelectFilter",
80
+ "PopupSelectFilter",
81
+ "CategorySelectFilter",
82
+ "YesNoSelectFilter"
83
+ ],
84
+ ListField: ["ListField", "ListControl"],
85
+ Chart: ["FlagCard", "Chart"],
86
+ Etc: [
87
+ "PageRefreshButton",
88
+ "MultiLangExpandButton",
89
+ "Fragment",
90
+ "CommentList",
91
+ "SourceCodeEditor",
92
+ "MarkdownViewer",
93
+ "History"
94
+ ]
95
+ }, en = Object.values(
96
+ ft
97
+ ).flat(), gt = Object.fromEntries(
98
+ Object.entries(ft).flatMap(
99
+ ([e, t]) => t.map((r) => [r, e])
100
+ )
101
+ ), tn = new Set(en);
102
+ function $e(e) {
103
+ return tn.has(e);
104
+ }
105
+ const te = (e) => ({ kind: "string", value: e }), Tt = (e) => ({ kind: "int", value: e }), w = (e) => ({ kind: "bool", value: e }), ht = (e) => ({ kind: "text", value: e }), $r = (e) => ({ kind: "dataSource", value: e }), Hr = (e) => ({ kind: "dataMapping", value: e }), Yr = (e) => ({ kind: "validator", value: e });
106
+ function De(e, t = "") {
107
+ return (e == null ? void 0 : e.kind) === "string" ? e.value : t;
108
+ }
109
+ function nn(e, t = 0) {
110
+ return (e == null ? void 0 : e.kind) === "int" ? e.value : t;
111
+ }
112
+ function on(e, t = !1) {
113
+ return (e == null ? void 0 : e.kind) === "bool" ? e.value : t;
114
+ }
115
+ function rn(e) {
116
+ return (e == null ? void 0 : e.kind) === "text" ? e.value : void 0;
117
+ }
118
+ function Vr(e) {
119
+ return (e == null ? void 0 : e.kind) === "validator" ? e.value : void 0;
120
+ }
121
+ const Wr = {
122
+ NOTI_S: "Success",
123
+ NOTI_F: "Fail",
124
+ CONFIRM: "Confirm"
125
+ };
126
+ function qe(e) {
127
+ return typeof e == "object" && e != null && typeof e.key == "string";
128
+ }
129
+ function Se() {
130
+ return crypto.randomUUID();
131
+ }
132
+ function an(e, t) {
133
+ const r = t(e);
134
+ if (r === "CONTINUE" && e.children) {
135
+ for (const o of e.children)
136
+ if (an(o, t) === "STOP") break;
137
+ }
138
+ return r === "SKIP_CHILDREN" ? "CONTINUE" : r;
139
+ }
140
+ function K(e, t) {
141
+ if (e != null) {
142
+ if (e.partId === t) return e;
143
+ if (e.children)
144
+ for (const r of e.children) {
145
+ const o = K(r, t);
146
+ if (o) return o;
147
+ }
148
+ }
149
+ }
150
+ function Q(e, t) {
151
+ if (t(e), e.children) for (const r of e.children) Q(r, t);
152
+ }
153
+ function zr(e, t) {
154
+ const r = [];
155
+ return Q(e, (o) => {
156
+ t(o) && r.push(o);
157
+ }), r;
158
+ }
159
+ function We(e, t) {
160
+ if (e.children)
161
+ for (const r of e.children) {
162
+ if (r.partId === t) return e;
163
+ const o = We(r, t);
164
+ if (o) return o;
165
+ }
166
+ }
167
+ function Et(e, t) {
168
+ if (e.partId === t) return [e];
169
+ if (e.children)
170
+ for (const r of e.children) {
171
+ const o = Et(r, t);
172
+ if (o) return [e, ...o];
173
+ }
174
+ }
175
+ function ln(e, t) {
176
+ const r = [], o = /* @__PURE__ */ new Map();
177
+ return Q(e, (a) => o.set(a.partId, (o.get(a.partId) ?? 0) + 1)), Q(e, (a) => {
178
+ (o.get(a.partId) ?? 0) > 1 && r.push({
179
+ ruleId: "CHK-DUP-ID",
180
+ severity: "error",
181
+ targetKind: "part",
182
+ targetRef: a.partId,
183
+ message: `partId가 트리에서 중복됩니다: "${a.partId}"`
184
+ });
185
+ }), Q(e, (a) => {
186
+ var c;
187
+ const i = t.get(a.partType);
188
+ if (!i)
189
+ r.push({
190
+ ruleId: "CHK-PART-1",
191
+ severity: "warning",
192
+ targetKind: "part",
193
+ targetRef: a.partId,
194
+ message: `카탈로그에 없는 파트 타입입니다: "${a.partType}"`
195
+ });
196
+ else
197
+ for (const u of Object.keys(a.attrs))
198
+ t.propertyItem(a.partType, u) || r.push({
199
+ ruleId: "CHK-ATTR-1",
200
+ severity: "warning",
201
+ targetKind: "part",
202
+ targetRef: a.partId,
203
+ message: `카탈로그 정의에 없는 속성 키입니다: "${a.partType}.${u}"`
204
+ });
205
+ const l = a.children ?? [];
206
+ for (const u of l)
207
+ if (t.canContain(a.partType, u.partType) === "deny" && r.push({
208
+ ruleId: "CHK-CONTAIN-1",
209
+ severity: "error",
210
+ targetKind: "part",
211
+ targetRef: u.partId,
212
+ contextRef: a.partId,
213
+ message: `${a.partType}은(는) 자식으로 ${u.partType}을(를) 담을 수 없습니다`
214
+ }), i)
215
+ for (const d of Object.keys(u.layoutAttrs ?? {})) {
216
+ const h = t.propertyItem(a.partType, d);
217
+ h != null && h.layoutAttr || r.push({
218
+ ruleId: "CHK-ATTR-1",
219
+ severity: "warning",
220
+ targetKind: "part",
221
+ targetRef: u.partId,
222
+ contextRef: a.partId,
223
+ message: `${a.partType}의 레이아웃 정의에 없는 레이아웃 속성 키입니다: "${d}"`
224
+ });
225
+ }
226
+ const s = (c = i == null ? void 0 : i.containment) == null ? void 0 : c.arity;
227
+ if (s) {
228
+ const u = l.length;
229
+ s.max != null && u > s.max && r.push({
230
+ ruleId: "CHK-ARITY-1",
231
+ severity: "error",
232
+ targetKind: "part",
233
+ targetRef: a.partId,
234
+ message: `${a.partType}의 자식이 ${u}개로 최대 ${s.max}개를 초과했습니다`
235
+ }), s.min != null && u < s.min && r.push({
236
+ ruleId: "CHK-ARITY-2",
237
+ severity: "warning",
238
+ targetKind: "part",
239
+ targetRef: a.partId,
240
+ message: `${a.partType}의 자식이 ${u}개로 최소 ${s.min}개에 미달합니다`
241
+ });
242
+ }
243
+ }), r;
244
+ }
245
+ function Je(e) {
246
+ return e == null || e.trim().length === 0;
247
+ }
248
+ function sn(e) {
249
+ if (!(e == null || e.length === 0))
250
+ return e.startsWith("#{") && e.endsWith("}") ? { key: e.slice(2, -1) } : { text: e };
251
+ }
252
+ function cn(e) {
253
+ if (e != null) {
254
+ if (!Je(e.key)) return { key: e.key };
255
+ if (e.msgMap && Object.keys(e.msgMap).length > 0) return { ...e.msgMap };
256
+ if (!Je(e.text)) return e.text;
257
+ }
258
+ }
259
+ function _e(e) {
260
+ return cn(sn(e));
261
+ }
262
+ function fe(e) {
263
+ if (e == null) return;
264
+ const t = e.startsWith("^") ? e.slice(1) : e, r = Number.parseInt(t, 10);
265
+ return Number.isNaN(r) ? void 0 : r;
266
+ }
267
+ function Ce(e) {
268
+ if (e == null) return;
269
+ const t = e.startsWith("^") ? e.slice(1) : e;
270
+ return Number.isNaN(Number(t)) || t.trim().length === 0 ? void 0 : t;
271
+ }
272
+ function ge(e) {
273
+ return e != null && e.startsWith("^");
274
+ }
275
+ function un(e) {
276
+ const t = {};
277
+ if (e == null) return t;
278
+ for (let r of e.split(";")) {
279
+ if (r = r.trim(), r.length === 0) continue;
280
+ const o = r.split(":"), a = o.length >= 1 ? o[0].trim() : null, i = o.length >= 2 ? o[1].trim() : null;
281
+ let l = null, s = null;
282
+ if (i != null) {
283
+ const d = i.split(",");
284
+ d.length > 0 && (l = d[0]), d.length > 1 && (s = d[1]);
285
+ }
286
+ const c = o.length >= 3 ? _e(o[2].trim()) : void 0, u = o.length >= 4 ? _e(o[3].trim()) : void 0;
287
+ switch (a) {
288
+ case "required":
289
+ t.useRequired = !0, t.requiredMsg = c;
290
+ break;
291
+ case "length":
292
+ t.useLength = !0, t.lengthMin = fe(l), t.lengthMax = fe(s), t.lengthMsg = c;
293
+ break;
294
+ case "currencyRange":
295
+ t.useCurrencyRange = !0, t.currencyRangeMin = Ce(l), t.currencyRangeMax = Ce(s), t.currencyRangeMinExclusive = ge(l), t.currencyRangeMaxExclusive = ge(s), t.currencyRangeMsg = c;
296
+ break;
297
+ case "longRange":
298
+ t.useLongRange = !0, t.longRangeMin = fe(l), t.longRangeMax = fe(s), t.longRangeMinExclusive = ge(l), t.longRangeMaxExclusive = ge(s), t.longRangeMsg = c;
299
+ break;
300
+ case "doubleRange":
301
+ t.useDoubleRange = !0, t.doubleRangeMin = Ce(l), t.doubleRangeMax = Ce(s), t.doubleRangeMinExclusive = ge(l), t.doubleRangeMaxExclusive = ge(s), t.doubleRangeMsg = c;
302
+ break;
303
+ case "regexp":
304
+ t.useRegexp = !0, t.regexpPattern = i ?? void 0, t.regexpMsg = c;
305
+ break;
306
+ case "dupCheck":
307
+ t.useDupCheck = !0, t.dupCheckMsg1 = c, t.dupCheckMsg2 = u;
308
+ break;
309
+ case "plainTextLength":
310
+ t.usePlainTextLength = !0, t.plainTextLengthMin = fe(l), t.plainTextLengthMax = fe(s), t.plainTextLengthMsg = c;
311
+ break;
312
+ }
313
+ }
314
+ return t;
315
+ }
316
+ function dn(e) {
317
+ const t = e.split(":");
318
+ return {
319
+ sortPropertyId: t.length > 0 ? t[0] : "",
320
+ order: t.length > 1 ? t[1] : "ASC",
321
+ sortDataMapping: t.length > 2 ? t[2] : "",
322
+ sortName: t.length > 3 ? t[3] : ""
323
+ };
324
+ }
325
+ function jr(e) {
326
+ return e == null ? [] : e.split(";").filter((t) => t.trim().length > 0).map(dn);
327
+ }
328
+ const pn = {
329
+ S: "string",
330
+ I: "int",
331
+ B: "bool",
332
+ M: "text",
333
+ DS: "dataSource",
334
+ DM: "dataMapping"
335
+ };
336
+ function fn(e, t) {
337
+ switch (t ?? pn[e.type]) {
338
+ case "string":
339
+ return { kind: "string", value: e.val };
340
+ case "int":
341
+ return { kind: "int", value: Number.parseInt(e.val, 10) };
342
+ case "bool":
343
+ return { kind: "bool", value: e.val === "true" };
344
+ case "text":
345
+ return { kind: "text", value: _e(e.val) ?? "" };
346
+ case "dataSource":
347
+ return { kind: "dataSource", value: e.val };
348
+ case "dataMapping":
349
+ return { kind: "dataMapping", value: e.val };
350
+ case "validator":
351
+ return { kind: "validator", value: un(e.val) };
352
+ default:
353
+ return;
354
+ }
355
+ }
356
+ function Ze(e, t, r) {
357
+ const o = {};
358
+ for (const [a, i] of Object.entries(e)) {
359
+ const l = fn(i, t == null ? void 0 : t(a));
360
+ l === void 0 ? r == null || r(a, i) : o[a] = l;
361
+ }
362
+ return o;
363
+ }
364
+ function gn() {
365
+ return { unknownPartTypes: [], discardedAttrs: [], droppedFields: [] };
366
+ }
367
+ function Tn(e) {
368
+ const t = {};
369
+ if (e.caseText && (t.caseText = { ...e.caseText }), e.msgType && (t.msgType = e.msgType), e.msgText != null) {
370
+ const r = _e(e.msgText);
371
+ r !== void 0 && (t.msgText = r);
372
+ }
373
+ return t;
374
+ }
375
+ function hn(e, t) {
376
+ if (e)
377
+ return (r) => {
378
+ var o;
379
+ return (o = e.propertyItem(t, r)) == null ? void 0 : o.valueType;
380
+ };
381
+ }
382
+ function mt(e, t) {
383
+ const {
384
+ partId: r,
385
+ partType: o,
386
+ partInfo: a,
387
+ attrMap: i,
388
+ comment: l,
389
+ caseMsgList: s,
390
+ children: c,
391
+ layoutAttrMap: u,
392
+ extraAttrMap: d,
393
+ ...h
394
+ } = e, E = t.report, m = t.catalog ? t.catalog.get(o) != null : !0;
395
+ E && !m && E.unknownPartTypes.push({ partId: r, partType: o });
396
+ const S = E ? (b) => (v, N) => E.discardedAttrs.push({ partId: r, partType: o, key: v, tag: String(N.type), layout: b }) : void 0, P = hn(t.catalog, o), H = {
397
+ partId: r,
398
+ partType: o,
399
+ attrs: i ? Ze(i, P, S == null ? void 0 : S(!1)) : {}
400
+ };
401
+ if (a && (H.info = {
402
+ draggable: !!a.draggable,
403
+ droppable: !!a.droppable,
404
+ selectable: !!a.selectable,
405
+ deletable: !!a.deletable
406
+ }), u && (H.layoutAttrs = Ze(u, P, S == null ? void 0 : S(!0))), d && (H.extraAttrs = { ...d }), l && (H.comment = { ...l }), s && (H.caseMessages = s.map(Tn)), c && (H.children = c.map((b) => mt(b, t))), E)
407
+ for (const b of Object.keys(h))
408
+ E.droppedFields.push({ partId: r, partType: o, field: b });
409
+ return H;
410
+ }
411
+ function En(e, t = {}) {
412
+ return mt(e, t);
413
+ }
414
+ function mn(e, t, r, o) {
415
+ const a = { partId: e.partId, parentId: t, order: r, rev: o, partType: e.partType };
416
+ return e.info && (a.info = e.info), e.attrs && Object.keys(e.attrs).length && (a.attrs = e.attrs), e.layoutAttrs && Object.keys(e.layoutAttrs).length && (a.layoutAttrs = e.layoutAttrs), e.extraAttrs && (a.extraAttrs = e.extraAttrs), e.comment !== void 0 && (a.comment = e.comment), e.caseMessages && (a.caseMessages = e.caseMessages), a;
417
+ }
418
+ function yt(e, t = null, r = 0, o = 0) {
419
+ const a = [], i = (l, s, c) => {
420
+ var u;
421
+ a.push(mn(l, s, c, o)), (u = l.children) == null || u.forEach((d, h) => i(d, l.partId, h));
422
+ };
423
+ return i(e, t, r), a;
424
+ }
425
+ function yn(e, t = {}) {
426
+ const r = {
427
+ schemaVersion: 2,
428
+ rootId: e.partId,
429
+ partList: yt(e, null, 0, 0)
430
+ };
431
+ return t.opWriteEnabled !== void 0 && (r.opWriteEnabled = t.opWriteEnabled), t.version !== void 0 && (r.version = t.version), r;
432
+ }
433
+ function bn(e) {
434
+ const t = {
435
+ partId: e.partId,
436
+ partType: e.partType,
437
+ // attrs는 필수(코어 타입). write 시 빈 객체는 생략되므로 read 시 {}로 복원(왕복 대칭).
438
+ attrs: e.attrs ? { ...e.attrs } : {}
439
+ };
440
+ return e.info && (t.info = { ...e.info }), e.layoutAttrs && (t.layoutAttrs = { ...e.layoutAttrs }), e.extraAttrs && (t.extraAttrs = { ...e.extraAttrs }), e.comment !== void 0 && (t.comment = e.comment), e.caseMessages && (t.caseMessages = [...e.caseMessages]), t;
441
+ }
442
+ function Kr(e) {
443
+ const t = /* @__PURE__ */ new Map();
444
+ for (const c of e.partList) {
445
+ if (t.has(c.partId)) throw new Error(`v2-read: 중복 partId '${c.partId}'`);
446
+ t.set(c.partId, c);
447
+ }
448
+ const r = /* @__PURE__ */ new Map();
449
+ for (const c of e.partList) {
450
+ if (c.parentId === null) continue;
451
+ if (!t.has(c.parentId))
452
+ throw new Error(`v2-read: 고아 파트 '${c.partId}' — 부모 '${c.parentId}' 부재`);
453
+ const u = r.get(c.parentId);
454
+ u ? u.push(c) : r.set(c.parentId, [c]);
455
+ }
456
+ const o = t.get(e.rootId);
457
+ if (!o) throw new Error(`v2-read: rootId '${e.rootId}' 파트 부재`);
458
+ if (o.parentId !== null)
459
+ throw new Error(`v2-read: rootId '${e.rootId}'의 parentId가 null이 아님(${String(o.parentId)})`);
460
+ const a = {}, i = /* @__PURE__ */ new Set(), l = (c) => {
461
+ if (i.has(c.partId)) throw new Error(`v2-read: 순환 참조 '${c.partId}'`);
462
+ i.add(c.partId), a[c.partId] = c.rev;
463
+ const u = bn(c), d = r.get(c.partId);
464
+ return d && (d.sort((h, E) => h.order - E.order), u.children = d.map(l)), u;
465
+ }, s = l(o);
466
+ if (i.size !== t.size) {
467
+ const c = [...t.keys()].filter((u) => !i.has(u));
468
+ throw new Error(
469
+ `v2-read: root에서 도달 불가한 파트 ${c.length}개(예: '${c[0]}')`
470
+ );
471
+ }
472
+ return { root: s, revSeed: { revs: a } };
473
+ }
474
+ function qr(e, t = {}) {
475
+ const r = t.report ?? gn(), o = En(e, { catalog: t.catalog, report: r });
476
+ return { v2: yn(o, {
477
+ opWriteEnabled: t.opWriteEnabled,
478
+ version: t.version
479
+ }), report: r, model: o };
480
+ }
481
+ function Qe(e, t) {
482
+ return e == null ? t : Math.max(0, Math.min(e, t));
483
+ }
484
+ function Jr(e, t, r) {
485
+ const o = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map();
486
+ for (const u of e) {
487
+ if (o.has(u.partId)) throw new Error(`applyOpsToFlat: 입력 중복 partId '${u.partId}'`);
488
+ o.set(u.partId, { ...u }), a.set(u.partId, u.rev);
489
+ }
490
+ const i = r.revs ?? {};
491
+ for (const [u, d] of Object.entries(i)) {
492
+ if (!a.has(u)) continue;
493
+ const h = a.get(u);
494
+ if (h !== d) return { ok: !1, conflict: { kind: "rev", ref: u, current: h } };
495
+ }
496
+ const l = (u) => [...o.values()].filter((d) => d.parentId === u).sort((d, h) => d.order - h.order), s = (u) => u.forEach((d, h) => d.order = h);
497
+ for (const u of t)
498
+ switch (u.kind) {
499
+ case "part.add": {
500
+ const d = u.parentRef ?? null;
501
+ if (d !== null && !o.has(d))
502
+ return { ok: !1, conflict: { kind: "missing", ref: d } };
503
+ if (!u.value) throw new Error("applyOpsToFlat: part.add에 value(서브트리) 누락");
504
+ const h = yt(u.value, d, 0, 0);
505
+ for (const S of h) {
506
+ if (o.has(S.partId)) throw new Error(`applyOpsToFlat: part.add 중복 partId '${S.partId}'`);
507
+ o.set(S.partId, S);
508
+ }
509
+ const E = u.value.partId, m = l(d).filter((S) => S.partId !== E);
510
+ m.splice(Qe(u.index, m.length), 0, o.get(E)), s(m);
511
+ break;
512
+ }
513
+ case "part.update": {
514
+ const d = u.partRef ? o.get(u.partRef) : void 0;
515
+ if (!d) return { ok: !1, conflict: { kind: "missing", ref: u.partRef } };
516
+ u.patch && Object.assign(d, u.patch);
517
+ break;
518
+ }
519
+ case "part.move": {
520
+ const d = u.partRef, h = d ? o.get(d) : void 0;
521
+ if (!d || !h) return { ok: !1, conflict: { kind: "missing", ref: d } };
522
+ const E = u.toParentRef ?? null;
523
+ if (E !== null && !o.has(E))
524
+ return { ok: !1, conflict: { kind: "missing", ref: E } };
525
+ const m = h.parentId;
526
+ s(l(m).filter((P) => P.partId !== d)), h.parentId = E;
527
+ const S = l(E).filter((P) => P.partId !== d);
528
+ S.splice(Qe(u.index, S.length), 0, h), s(S);
529
+ break;
530
+ }
531
+ case "part.remove": {
532
+ const d = u.partRef;
533
+ if (!d || !o.has(d)) return { ok: !1, conflict: { kind: "missing", ref: d } };
534
+ const h = o.get(d).parentId;
535
+ for (const E of Sn(o, d)) o.delete(E);
536
+ s(l(h));
537
+ break;
538
+ }
539
+ }
540
+ const c = {};
541
+ for (const [u, d] of Object.entries(i)) {
542
+ const h = o.get(u);
543
+ h && (a.has(u) && (h.rev = d + 1), c[u] = h.rev);
544
+ }
545
+ return { ok: !0, partList: [...o.values()], revs: c };
546
+ }
547
+ function Sn(e, t) {
548
+ const r = [t], o = [t];
549
+ for (; o.length; ) {
550
+ const a = o.shift();
551
+ for (const i of e.values())
552
+ i.parentId === a && (r.push(i.partId), o.push(i.partId));
553
+ }
554
+ return r;
555
+ }
556
+ const Zr = [
557
+ "TEXT",
558
+ "TEXT_WITH_BUTTON",
559
+ "TEXT_RO_WITH_BUTTON",
560
+ "MESSAGE_TEXT",
561
+ "TEXTAREA",
562
+ "FULL_TEXTAREA",
563
+ "MESSAGE_TEXTAREA",
564
+ "INTEGER",
565
+ "BOOL",
566
+ "BUTTON",
567
+ "SIMPLE_BUTTON",
568
+ "WINDOW_OPEN_BUTTON",
569
+ "SELECT",
570
+ "ALIGN",
571
+ "ADD_STYLE",
572
+ "SIZE",
573
+ "ICON",
574
+ "TAGS",
575
+ "COMPONENT_REF",
576
+ "DATASOURCE",
577
+ "DATAMAPPING",
578
+ "COMMENT",
579
+ "CASE_MESSAGES"
580
+ ], vn = {
581
+ TEXT: !0,
582
+ TEXTAREA: !0,
583
+ FULL_TEXTAREA: !0,
584
+ MESSAGE_TEXT: !0,
585
+ MESSAGE_TEXTAREA: !0,
586
+ INTEGER: !0,
587
+ BOOL: !0,
588
+ TAGS: !0,
589
+ SELECT: !0,
590
+ ALIGN: !0,
591
+ ADD_STYLE: !0,
592
+ SIZE: !0,
593
+ ICON: !0,
594
+ TEXT_WITH_BUTTON: !1,
595
+ TEXT_RO_WITH_BUTTON: !1,
596
+ BUTTON: !1,
597
+ SIMPLE_BUTTON: !1,
598
+ WINDOW_OPEN_BUTTON: !1,
599
+ COMPONENT_REF: !1,
600
+ DATASOURCE: !1,
601
+ DATAMAPPING: !1,
602
+ COMMENT: !1,
603
+ CASE_MESSAGES: !1
604
+ }, ye = {
605
+ spacing: [
606
+ { token: "xs", css: "margin-xs", label: "X-Small" },
607
+ { token: "sm", css: "margin-sm", label: "Small" },
608
+ { token: "default", css: "", label: "Default" },
609
+ { token: "lg", css: "margin-lg", label: "Large" },
610
+ { token: "xl", css: "margin-xl", label: "X-Large" }
611
+ ],
612
+ gap: [
613
+ { token: "xs", css: "spacing-xs", label: "X-Small" },
614
+ { token: "sm", css: "spacing-sm", label: "Small" },
615
+ { token: "default", css: "", label: "Default" },
616
+ { token: "lg", css: "spacing-lg", label: "Large" },
617
+ { token: "xl", css: "spacing-xl", label: "X-Large" }
618
+ ],
619
+ color: [
620
+ { token: "default", css: "", label: "Default" },
621
+ { token: "themed", css: "colored", label: "Theme color" },
622
+ { token: "red", css: "red", label: "Red" },
623
+ { token: "gray", css: "gray", label: "Gray" },
624
+ { token: "yellow", css: "yellow", label: "Yellow" },
625
+ { token: "green", css: "green", label: "Green" }
626
+ ],
627
+ textColor: [
628
+ { token: "default", css: "", label: "Default" },
629
+ { token: "black", css: "black-text", label: "Black" },
630
+ { token: "blue", css: "blue-text", label: "Blue" },
631
+ { token: "red", css: "red-text", label: "Red" },
632
+ { token: "gray", css: "gray-text", label: "Gray" },
633
+ { token: "yellow", css: "yellow-text", label: "Yellow" },
634
+ { token: "green", css: "green-text", label: "Green" }
635
+ ],
636
+ bgColor: [
637
+ { token: "none", css: "", label: "None" },
638
+ { token: "blue", css: "blue-bg", label: "Blue" },
639
+ { token: "red", css: "red-bg", label: "Red" },
640
+ { token: "yellow", css: "yellow-bg", label: "Yellow" },
641
+ { token: "green", css: "green-bg", label: "Green" },
642
+ { token: "purple", css: "purple-bg", label: "Purple" }
643
+ ],
644
+ captionBg: [
645
+ { token: "none", css: "", label: "None" },
646
+ { token: "gray", css: "gray-bg-caption", label: "Gray" },
647
+ { token: "blue", css: "blue-bg-caption", label: "Blue" },
648
+ { token: "red", css: "red-bg-caption", label: "Red" },
649
+ { token: "yellow", css: "yellow-bg-caption", label: "Yellow" },
650
+ { token: "green", css: "green-bg-caption", label: "Green" },
651
+ { token: "purple", css: "purple-bg-caption", label: "Purple" },
652
+ { token: "white", css: "white-bg-caption", label: "White" }
653
+ ],
654
+ captionDir: [
655
+ { token: "default", css: "", label: "Default" },
656
+ { token: "left", css: "left-caption", label: "Left" }
657
+ ],
658
+ align: [
659
+ { token: "left", css: "", label: "Left(default)" },
660
+ { token: "center", css: "align-center", label: "Center" },
661
+ { token: "right", css: "align-right", label: "Right" }
662
+ ],
663
+ verticalAlign: [
664
+ { token: "top", css: "", label: "Top(default)" },
665
+ { token: "middle", css: "align-middle", label: "Middle" },
666
+ { token: "bottom", css: "align-bottom", label: "Bottom" }
667
+ ],
668
+ size: [
669
+ { token: "tiny", css: "tiny", label: "Tiny" },
670
+ { token: "small", css: "small", label: "Small" },
671
+ { token: "default", css: "", label: "Default" },
672
+ { token: "large", css: "large", label: "Large" },
673
+ { token: "huge", css: "huge", label: "Huge" }
674
+ ],
675
+ captionSize: [
676
+ { token: "tiny", css: "tiny-caption", label: "Tiny" },
677
+ { token: "small", css: "small-caption", label: "Small" },
678
+ { token: "default", css: "", label: "Default" },
679
+ { token: "large", css: "large-caption", label: "Large" },
680
+ { token: "huge", css: "huge-caption", label: "Huge" }
681
+ ],
682
+ iconAlign: [
683
+ { token: "left", css: "", label: "Left(default)" },
684
+ { token: "right", css: "icon-align-right", label: "Right" },
685
+ { token: "top", css: "icon-align-top", label: "Top" }
686
+ ],
687
+ heading: [
688
+ { token: "h1", css: "h1", label: "Heading 1" },
689
+ { token: "h2", css: "h2", label: "Heading 2" },
690
+ { token: "h3", css: "h3", label: "Heading 3" },
691
+ { token: "h4", css: "h4", label: "Heading 4" }
692
+ ],
693
+ weight: [
694
+ { token: "normal", css: "", label: "Normal(default)" },
695
+ { token: "bold", css: "bold", label: "Bold" },
696
+ { token: "bolder", css: "bolder", label: "Bolder" },
697
+ { token: "lighter", css: "lighter", label: "Lighter" }
698
+ ],
699
+ slotAlign: [
700
+ { token: "default", css: "", label: "Default" },
701
+ { token: "left", css: "LEFT", label: "Left" },
702
+ { token: "center", css: "CENTER", label: "Center" },
703
+ { token: "right", css: "RIGHT", label: "Right" },
704
+ { token: "top", css: "TOP", label: "Top" },
705
+ { token: "middle", css: "MIDDLE", label: "Middle" },
706
+ { token: "bottom", css: "BOTTOM", label: "Bottom" }
707
+ ]
708
+ }, bt = {
709
+ spacing: { source: "style", legacyDimId: "margin", label: "Margin Size" },
710
+ gap: { source: "style", legacyDimId: "spacing", label: "Spacing Size" },
711
+ color: { source: "style", legacyDimId: "color", label: "Color" },
712
+ textColor: { source: "style", legacyDimId: "textColor", label: "Text Color" },
713
+ bgColor: { source: "style", legacyDimId: "bgColor", label: "Background Color" },
714
+ captionBg: { source: "style", legacyDimId: "bgCaption", label: "Caption Background" },
715
+ captionDir: { source: "style", legacyDimId: "dirCaption", label: "Caption Direction" },
716
+ align: { source: "style", legacyDimId: "alignment", label: "Alignment" },
717
+ verticalAlign: { source: "style", legacyDimId: "vertical-alignment", label: "Vertical Alignment" },
718
+ size: { source: "style", legacyDimId: "size", label: "Size" },
719
+ captionSize: { source: "style", legacyDimId: "caption-size", label: "Caption" },
720
+ iconAlign: { source: "style", legacyDimId: "icon-align", label: "Icon alignment" },
721
+ heading: { source: "style", legacyDimId: "heading", label: "Heading" },
722
+ weight: { source: "style", legacyDimId: "weight", label: "Weight" },
723
+ slotAlign: { source: "layoutAttr", legacyDimId: "componentAlignment", label: "Align" }
724
+ }, Ln = new Map(
725
+ Object.keys(ye).filter((e) => bt[e].source === "style").flatMap(
726
+ (e) => ye[e].filter((t) => t.css !== "").map((t) => [t.css, { dim: e, token: t.token }])
727
+ )
728
+ );
729
+ function On(e, t) {
730
+ var r;
731
+ return (r = ye[e].find((o) => o.token === t)) == null ? void 0 : r.css;
732
+ }
733
+ function Cn(e, t) {
734
+ var r;
735
+ return (r = ye[e].find((o) => o.css === t)) == null ? void 0 : r.token;
736
+ }
737
+ function In(e) {
738
+ return Ln.get(e);
739
+ }
740
+ function St(e) {
741
+ return ye[e].map((t) => t.token);
742
+ }
743
+ function f(e, t, r, o) {
744
+ const a = { partType: e, partName: t, groups: r };
745
+ return o && o.length > 0 && (a.styles = o), a;
746
+ }
747
+ function n(e, t, r, o, a, i) {
748
+ const l = { id: e, name: t, valueType: r, editor: o };
749
+ return a != null && (l.param = a), i != null && (l.default = i), l;
750
+ }
751
+ function p(e, ...t) {
752
+ return { name: e, items: t };
753
+ }
754
+ function ke(e, ...t) {
755
+ return { name: e, layoutAttr: !0, items: t.map((r) => ({ ...r, layoutAttr: !0 })) };
756
+ }
757
+ function g() {
758
+ return p(
759
+ "Component",
760
+ n("addStyleNames", "Style", "string", "ADD_STYLE"),
761
+ n("id", "ID", "string", "TEXT"),
762
+ n("caption", "Caption", "text", "MESSAGE_TEXT"),
763
+ n("description", "Description", "text", "MESSAGE_TEXTAREA"),
764
+ n("skipSrcGen", "Skip Src Gen.", "bool", "BOOL"),
765
+ n("srcGenHint", "Src Gen Hint", "string", "TEXTAREA")
766
+ );
767
+ }
768
+ function T() {
769
+ return p("Size", n("width", "Width", "string", "TEXT"), n("height", "Height", "string", "TEXT"));
770
+ }
771
+ function Ie() {
772
+ return p(
773
+ "Min/Max Size",
774
+ n("minWidth", "Min Width", "string", "TEXT"),
775
+ n("minHeight", "Min Height", "string", "TEXT"),
776
+ n("maxWidth", "Max Width", "string", "TEXT"),
777
+ n("maxHeight", "Max Height", "string", "TEXT")
778
+ );
779
+ }
780
+ function we() {
781
+ return ke(
782
+ "Layout",
783
+ n("componentAlignment", "Align", "string", "ALIGN"),
784
+ n("expandRatio", "Expand Ratio", "int", "INTEGER")
785
+ );
786
+ }
787
+ function A() {
788
+ return p(
789
+ "Field",
790
+ n("propertyId", "Property ID", "string", "TEXT"),
791
+ n("dataMapping", "Data Mapping", "dataMapping", "DATAMAPPING"),
792
+ n("viewMode", "View Mode", "bool", "BOOL"),
793
+ n("enabled", "Enabled", "bool", "BOOL", void 0, w(!0)),
794
+ n("validate", "Validation", "validator", "TEXT_WITH_BUTTON")
795
+ );
796
+ }
797
+ function kn() {
798
+ return p(
799
+ "Field",
800
+ n("viewMode", "View Mode", "bool", "BOOL"),
801
+ n("enabled", "Enabled", "bool", "BOOL", void 0, w(!0)),
802
+ n("validate", "Validation", "validator", "TEXT_WITH_BUTTON")
803
+ );
804
+ }
805
+ function _(e, t) {
806
+ return { kind: "toggle", css: e, label: t };
807
+ }
808
+ const se = () => ({ kind: "enum", dim: "spacing" }), Ae = () => ({ kind: "enum", dim: "gap" }), et = () => ({ kind: "enum", dim: "color" }), xe = () => ({ kind: "enum", dim: "textColor" }), V = () => ({ kind: "enum", dim: "bgColor" }), An = () => ({ kind: "enum", dim: "captionBg" }), xn = () => ({ kind: "enum", dim: "captionDir" }), q = () => ({ kind: "enum", dim: "align" }), Mn = () => ({ kind: "enum", dim: "verticalAlign" }), $ = () => ({ kind: "enum", dim: "size" }), me = () => ({ kind: "enum", dim: "size", only: ["small", "default", "large"] }), O = () => ({ kind: "enum", dim: "captionSize" }), tt = () => ({ kind: "enum", dim: "iconAlign" }), nt = () => ({ kind: "enum", dim: "heading" }), He = () => ({ kind: "enum", dim: "weight" }), F = () => _("borderless", "Borderless"), vt = () => _("borderless-top", "Borderless Top"), Lt = () => _("borderless-bottom", "Borderless Bottom"), Ot = () => _("borderless-left", "Borderless Left"), Ct = () => _("borderless-right", "Borderless Right"), J = () => _("bordered", "Bordered"), It = () => _("bordered-top", "Bordered Top"), kt = () => _("bordered-bottom", "Bordered Bottom"), At = () => _("bordered-left", "Bordered Left"), xt = () => _("bordered-right", "Bordered Right"), _n = () => _("color-bordered-top", "Color Bordered Top"), Mt = () => _("lineless", "Lineless"), Fe = () => _("horizontal", "Horizontal"), Ye = () => _("scrollable-full", "Scrollable"), ot = () => _("white-prefix", "White Prefix"), rt = () => _("white-suffix", "White Suffix"), Pn = () => _("caption-borderless-bottom", "Caption Borderless Bottom"), de = () => [
809
+ It(),
810
+ kt(),
811
+ At(),
812
+ xt()
813
+ ], le = () => [
814
+ vt(),
815
+ Lt(),
816
+ Ot(),
817
+ Ct()
818
+ ], k = () => [An(), Pn(), xn()], Bn = [
819
+ f(
820
+ "Button",
821
+ "Button",
822
+ [
823
+ p(
824
+ "Button",
825
+ n("enabled", "Enabled", "bool", "BOOL", void 0, w(!0)),
826
+ n("disableOnClick", "Disable on click", "bool", "BOOL"),
827
+ n("icon", "Icon", "string", "ICON"),
828
+ n(
829
+ "tags",
830
+ "Tags",
831
+ "string",
832
+ "TAGS",
833
+ "unmask-personal-info,modify-personal-info,personal-info-excel-download,personal-info-excel-upload"
834
+ )
835
+ ),
836
+ g(),
837
+ T()
838
+ ],
839
+ [
840
+ et(),
841
+ $(),
842
+ F(),
843
+ tt(),
844
+ _("menu-button", "Menu Button"),
845
+ _("link", "Link Button"),
846
+ xe()
847
+ ]
848
+ ),
849
+ f(
850
+ "PopupButton",
851
+ "PopupButton",
852
+ [
853
+ p(
854
+ "PopupButton",
855
+ n("icon", "Icon", "string", "ICON"),
856
+ n("showHidePopup", "Show/Hide Popup", "string", "SIMPLE_BUTTON")
857
+ ),
858
+ p(
859
+ "Popup",
860
+ n("popupPosition", "Position", "string", "SELECT", "LEFT:Left; CENTER:Center; RIGHT:Right", te("CENTER")),
861
+ n("popupTitle", "Popup Title", "text", "MESSAGE_TEXT"),
862
+ n("popupWidth", "Popup Width", "int", "INTEGER"),
863
+ n("popupHeight", "Popup Height", "int", "INTEGER"),
864
+ n("showPopupCloseBox", "Show Close Box", "bool", "BOOL"),
865
+ n("popupMargin", "Popup Margin", "bool", "BOOL"),
866
+ n("popupSpacing", "Popup Spacing", "bool", "BOOL"),
867
+ n("popupStyleNames", "Popup Style", "string", "ADD_STYLE")
868
+ ),
869
+ g(),
870
+ T()
871
+ ],
872
+ [et(), $(), F(), tt()]
873
+ ),
874
+ f(
875
+ "Label",
876
+ "Label",
877
+ [
878
+ p(
879
+ "Label",
880
+ n("value", "Text", "text", "MESSAGE_TEXT"),
881
+ n("contentMode", "Content mode", "string", "SELECT", "TEXT:Text; PREFORMATTED:Preformatted; HTML:Html")
882
+ ),
883
+ g(),
884
+ T()
885
+ ],
886
+ [
887
+ q(),
888
+ $(),
889
+ nt(),
890
+ He(),
891
+ se(),
892
+ O(),
893
+ xe(),
894
+ V(),
895
+ ...k()
896
+ ]
897
+ ),
898
+ f(
899
+ "Image",
900
+ "Image",
901
+ [
902
+ p("Image", n("source", "Source", "string", "TEXT"), n("alternateText", "Alternate text", "string", "TEXT")),
903
+ g(),
904
+ T()
905
+ ],
906
+ [...k()]
907
+ ),
908
+ f(
909
+ "Link",
910
+ "Link",
911
+ [
912
+ p("Link", n("resource", "Resource", "string", "TEXT"), n("targetName", "Target name", "string", "TEXT")),
913
+ g(),
914
+ T()
915
+ ],
916
+ [q(), me(), O(), xe(), ...k()]
917
+ ),
918
+ f("LinkTab", "LinkTab", [
919
+ p(
920
+ "LinkTab",
921
+ n("fixed", "Fixed", "bool", "BOOL", void 0, w(!0)),
922
+ n("scrollContainer", "Scroll Container", "string", "COMPONENT_REF", "VerticalLayout,HorizontalLayout")
923
+ ),
924
+ g(),
925
+ T()
926
+ ]),
927
+ f(
928
+ "ProgressBar",
929
+ "Progress Bar",
930
+ [p("ProgressBar"), g(), T()],
931
+ [O(), ...k()]
932
+ ),
933
+ f(
934
+ "Console",
935
+ "Console",
936
+ [p("Console"), g(), T()],
937
+ [O(), ...k()]
938
+ ),
939
+ f(
940
+ "NativeUpload",
941
+ "Native Upload",
942
+ [
943
+ p(
944
+ "NativeUpload",
945
+ n("immediate", "Immediate mode", "bool", "BOOL"),
946
+ n("buttonCaption", "Submit button", "text", "MESSAGE_TEXT"),
947
+ n("cancelButtonCaption", "Cancel button", "text", "MESSAGE_TEXT"),
948
+ n("submitButtonStyleName", "Submit button style", "string", "TEXT"),
949
+ n("progressBar", "ProgressBar", "string", "COMPONENT_REF", "ProgressBar")
950
+ ),
951
+ g(),
952
+ T()
953
+ ],
954
+ [O(), ...k()]
955
+ ),
956
+ f(
957
+ "AuditInfo",
958
+ "Audit Info",
959
+ [p("AuditInfo"), g(), T()],
960
+ [
961
+ q(),
962
+ $(),
963
+ nt(),
964
+ He(),
965
+ se(),
966
+ O(),
967
+ ...k()
968
+ ]
969
+ ),
970
+ f("AuditInfoButton", "Audit Info Button", [
971
+ p(
972
+ "AuditInfoButton",
973
+ n("popupPosition", "Position", "string", "SELECT", "LEFT:Left; CENTER:Center; RIGHT:Right", te("CENTER"))
974
+ ),
975
+ g(),
976
+ T()
977
+ ])
978
+ ], Rn = [
979
+ f(
980
+ "FlagCard",
981
+ "FlagCard",
982
+ [
983
+ p(
984
+ "FlagCard",
985
+ n("titleDesc", "Title Desc.", "text", "MESSAGE_TEXT"),
986
+ n("html", "Html", "string", "TEXTAREA"),
987
+ n("linkCaption", "Link Caption", "text", "MESSAGE_TEXT"),
988
+ n("linkUrl", "Link URL", "string", "TEXT"),
989
+ n("linkTarget", "Link Target", "string", "TEXT")
990
+ ),
991
+ g(),
992
+ T()
993
+ ]
994
+ ),
995
+ f(
996
+ "Chart",
997
+ "Chart",
998
+ [
999
+ p(
1000
+ "Chart",
1001
+ n("chartType", "Chart Type", "string", "SELECT", "pie:pie; doughnut:doughnut; bar:bar; horizontalBar:horizontalBar; stackedBar:stackedBar; line:line;"),
1002
+ n("xAxesTitle", "X-Axis Title", "text", "MESSAGE_TEXT"),
1003
+ n("leftYAxesTitle", "Left Y-Axis Title", "text", "MESSAGE_TEXT"),
1004
+ n("rightYAxesTitle", "Right Y-Axis Title", "text", "MESSAGE_TEXT")
1005
+ ),
1006
+ g(),
1007
+ T()
1008
+ ],
1009
+ [J(), ...de(), O(), ...k()]
1010
+ )
1011
+ ], at = "ALL:All;IMAGE:Image;", Nn = [
1012
+ f(
1013
+ "MultiFileUpload",
1014
+ "File Upload",
1015
+ [
1016
+ p(
1017
+ "MultiFileUpload",
1018
+ n("maxSize", "Max size", "int", "INTEGER"),
1019
+ n("totalMaxSize", "Total Max size", "int", "INTEGER"),
1020
+ n("fileType", "File type", "string", "SELECT", at),
1021
+ n("fileExtString", "File exts", "string", "TEXT"),
1022
+ n("thumbnailWidth", "Thumbnail Width", "string", "TEXT"),
1023
+ n("thumbnailHeight", "Thumbnail Height", "string", "TEXT"),
1024
+ n("showDropMessage", "Show Drop Msg.", "bool", "BOOL", void 0, w(!0)),
1025
+ n("subFolder", "Sub folder", "string", "TEXT"),
1026
+ n("enableReorder", "Enable reorder", "bool", "BOOL", void 0, w(!0))
1027
+ ),
1028
+ A(),
1029
+ g(),
1030
+ T()
1031
+ ],
1032
+ [O(), ...k()]
1033
+ ),
1034
+ f(
1035
+ "SingleFileUpload",
1036
+ "Single File Upload",
1037
+ [
1038
+ p(
1039
+ "SingleFileUpload",
1040
+ n("maxSize", "Max size", "int", "INTEGER"),
1041
+ n("fileType", "File type", "string", "SELECT", at),
1042
+ n("fileExtString", "File exts", "string", "TEXT"),
1043
+ n("thumbnailWidth", "Thumbnail Width", "string", "TEXT"),
1044
+ n("thumbnailHeight", "Thumbnail Height", "string", "TEXT"),
1045
+ n("showDropMessage", "Show Drop Msg.", "bool", "BOOL", void 0, w(!0)),
1046
+ n("subFolder", "Sub folder", "string", "TEXT")
1047
+ ),
1048
+ A(),
1049
+ g(),
1050
+ T()
1051
+ ],
1052
+ [$(), O(), ...k()]
1053
+ ),
1054
+ f(
1055
+ "SingleImageUpload",
1056
+ "Single Image Upload",
1057
+ [
1058
+ p(
1059
+ "SingleImageUpload",
1060
+ n("maxSize", "Max size", "int", "INTEGER"),
1061
+ n("fileExtString", "File exts", "string", "TEXT"),
1062
+ n("subFolder", "Sub folder", "string", "TEXT")
1063
+ ),
1064
+ A(),
1065
+ g(),
1066
+ T()
1067
+ ],
1068
+ [O(), ...k()]
1069
+ ),
1070
+ f(
1071
+ "NameField",
1072
+ "Name Field",
1073
+ [p("NameField"), A(), g(), T()],
1074
+ [O(), ...k()]
1075
+ ),
1076
+ f(
1077
+ "AddressField",
1078
+ "Address Field",
1079
+ [
1080
+ p("AddressField", n("showSecondaryAddress", "Secondary Addr.", "bool", "BOOL")),
1081
+ A(),
1082
+ g(),
1083
+ T()
1084
+ ],
1085
+ [O(), ...k()]
1086
+ ),
1087
+ f(
1088
+ "PageBuilder",
1089
+ "Page Builder",
1090
+ [
1091
+ p("PageBuilder", n("subFolder", "Image sub folder", "string", "TEXT")),
1092
+ A(),
1093
+ g(),
1094
+ T()
1095
+ ],
1096
+ [F()]
1097
+ ),
1098
+ f(
1099
+ "ContentEditor",
1100
+ "Content Editor",
1101
+ [p("ContentEditor"), A(), g(), T()],
1102
+ [F()]
1103
+ )
1104
+ ], Dn = [
1105
+ f("PageRefreshButton", "PageRefreshButton", [p("PageRefreshButton"), g(), T()]),
1106
+ f("MultiLangExpandButton", "MultiLangExpandButton", [
1107
+ p("MultiLangExpandButton"),
1108
+ g(),
1109
+ T()
1110
+ ]),
1111
+ f("Fragment", "Fragment", [
1112
+ p(
1113
+ "Fragment",
1114
+ n("fragmentName", "UI ID", "string", "TEXT_WITH_BUTTON"),
1115
+ n("openFragment", "Open Fragment", "string", "WINDOW_OPEN_BUTTON"),
1116
+ n("id", "ID", "string", "TEXT"),
1117
+ n("caption", "Caption", "text", "MESSAGE_TEXT")
1118
+ ),
1119
+ T()
1120
+ ]),
1121
+ f("CommentList", "Comment List", [
1122
+ p(
1123
+ "CommentList",
1124
+ n("pageLength", "Page Length", "int", "INTEGER"),
1125
+ n("viewMode", "View Mode", "bool", "BOOL"),
1126
+ n("writerPropertyId", "Writer Property ID", "string", "TEXT"),
1127
+ n("writerDataMapping", "Writer Data Mapping", "dataMapping", "DATAMAPPING"),
1128
+ n("postDatePropertyId", "Date Property ID", "string", "TEXT"),
1129
+ n("postDateDataMapping", "Date Data Mapping", "dataMapping", "DATAMAPPING"),
1130
+ n("commentPropertyId", "Cmt. Property ID", "string", "TEXT"),
1131
+ n("commentDataMapping", "Cmt. Data Mapping", "dataMapping", "DATAMAPPING")
1132
+ ),
1133
+ g(),
1134
+ T()
1135
+ ]),
1136
+ f(
1137
+ "SourceCodeEditor",
1138
+ "SourceCode Editor",
1139
+ [
1140
+ p(
1141
+ "SourceCodeEditor",
1142
+ n("editorMode", "Editor Lang", "string", "SELECT", "HTML:HTML; XML:XML; YAML:YAML; CSS:CSS; SCSS:SCSS; JSON:JSON; JAVA:Java; JAVASCRIPT:Javascript; JSP:JSP; PLAIN_TEXT:Plain Text; SQL:SQL; MARKDOWN:MARKDOWN; ASCIIDOC:AsciiDoc;"),
1143
+ n("showGutter", "Show Gutter", "bool", "BOOL", void 0, w(!0)),
1144
+ n("highlightActiveLine", "Highlight Line", "bool", "BOOL", void 0, w(!0))
1145
+ ),
1146
+ A(),
1147
+ g(),
1148
+ T()
1149
+ ],
1150
+ [J(), ...de(), O(), ...k()]
1151
+ ),
1152
+ f(
1153
+ "MarkdownViewer",
1154
+ "Markdown Viewer",
1155
+ [A(), g(), T()],
1156
+ [J(), ...de(), O(), ...k()]
1157
+ ),
1158
+ f(
1159
+ "History",
1160
+ "History",
1161
+ [g(), T()],
1162
+ [J(), ...de(), O(), ...k()]
1163
+ )
1164
+ ], wn = [
1165
+ f("TextFilter", "Text Filter", [
1166
+ p("TextFilter", n("filterType", "Filter Type", "string", "SELECT", ":; LIKE:Like; EQUAL:Equal;"))
1167
+ ]),
1168
+ f("NumberFilter", "Number Filter", [
1169
+ p("NumberFilter", n("percentage", "Percentage", "bool", "BOOL"))
1170
+ ]),
1171
+ f("SelectFilter", "Select Filter", []),
1172
+ f("MultiSelectFilter", "Multi Select Filter", []),
1173
+ f("PopupSelectFilter", "Popup Select Filter", [
1174
+ p(
1175
+ "PopupSelect",
1176
+ n("buttonCaption", "Button caption", "text", "MESSAGE_TEXT"),
1177
+ n("captionFieldReadOnly", "Text ReadOnly", "bool", "BOOL", void 0, w(!0)),
1178
+ n("hideButton", "Hide Button", "bool", "BOOL")
1179
+ )
1180
+ ]),
1181
+ f("CategorySelectFilter", "Category Select Filter", [
1182
+ p("CategorySelect", n("filterIncludesChildren", "Include Children", "bool", "BOOL"))
1183
+ ]),
1184
+ f("YesNoSelectFilter", "YesNo Select Filter", [
1185
+ p(
1186
+ "YesNoSelect",
1187
+ n("yesCaption", "Yes caption", "text", "MESSAGE_TEXT"),
1188
+ n("noCaption", "No caption", "text", "MESSAGE_TEXT")
1189
+ )
1190
+ ])
1191
+ ], it = ":; STRING:String; LONG:Long; INTEGER:Integer; EMBEDDABLE_NAME:EmbeddableName; EMBEDDABLE_ADDRESS:EmbeddableAddress; EMBEDDABLE_TEL:EmbeddableTel", Fn = [
1192
+ f(
1193
+ "Grid",
1194
+ "Grid",
1195
+ [
1196
+ p(
1197
+ "Grid",
1198
+ n("gridDef", "Grid Definition", "string", "BUTTON"),
1199
+ n("entityMapping", "Entity Mapping", "string", "TEXT_WITH_BUTTON"),
1200
+ n("useCheckbox", "Checkbox", "bool", "BOOL"),
1201
+ n("useSerialNo", "Serial No", "bool", "BOOL"),
1202
+ n("useRowEdit", "Row Editable", "bool", "BOOL"),
1203
+ n("alwaysEditing", "Always Editing", "bool", "BOOL"),
1204
+ n("multiSelect", "Multi Select", "bool", "BOOL", void 0, w(!0)),
1205
+ n("enableReorder", "Enable reorder", "bool", "BOOL"),
1206
+ n("fixedColumnCount", "Fixed Col. Count", "int", "INTEGER"),
1207
+ n("maxHeight", "Max Height", "string", "TEXT"),
1208
+ n("selectOnClick", "Select On Click", "bool", "BOOL"),
1209
+ n("defaultColumnWidth", "Default Col. Width", "string", "TEXT"),
1210
+ n("ignoreModelChangeEvent", "Ignore ModelChange", "bool", "BOOL"),
1211
+ n("usePageable", "Use Pageable", "bool", "BOOL")
1212
+ ),
1213
+ p(
1214
+ "Pivot Grid",
1215
+ n("pivotMode", "Pivot Mode", "bool", "BOOL"),
1216
+ n("fixedRowCount", "Fixed Row Count", "int", "INTEGER")
1217
+ ),
1218
+ p(
1219
+ "Field",
1220
+ n("propertyId", "Property ID", "string", "TEXT"),
1221
+ n("dataMapping", "Data Mapping", "dataMapping", "DATAMAPPING"),
1222
+ n("validate", "Validation", "validator", "TEXT_WITH_BUTTON")
1223
+ ),
1224
+ g(),
1225
+ T()
1226
+ ],
1227
+ [O(), ...k(), F(), ...le()]
1228
+ ),
1229
+ f("ColumnDef", "Grid Column", [
1230
+ p(
1231
+ "Grid Column",
1232
+ n("actualPropertyId", "Property ID", "string", "TEXT"),
1233
+ n("dataMapping", "Data Mapping", "dataMapping", "DATAMAPPING"),
1234
+ n("caption", "Caption", "text", "MESSAGE_TEXT"),
1235
+ n("width", "Width", "string", "TEXT"),
1236
+ n("expand", "Expand", "bool", "BOOL"),
1237
+ n("dataSource", "Data source", "dataSource", "TEXT_WITH_BUTTON"),
1238
+ n("yesCaption", "Yes caption", "text", "MESSAGE_TEXT"),
1239
+ n("noCaption", "No caption", "text", "MESSAGE_TEXT"),
1240
+ n("nullCaption", "Null caption", "text", "MESSAGE_TEXT"),
1241
+ n("cellType", "Cell Type", "string", "SELECT", "TEXT:Text; DATE:Date; NUMBER:Number; PERCENTAGE:Percentage; CATEGORY:Category; HTML:HTML; TEXT_MULTILINE:Multiline Text;"),
1242
+ n("numberFormat", "Number format", "string", "SELECT", ":; #,###:1,234 (#,###); #:1234 (#); #,##0.#####:1,234.56789 (#,##0.#####); #,##0.00:1,234.00 (#,##0.00); #,##0.##%:1,234.1% (#,##0.##%); #,##0.00%:1,234.10% (#,##0.00%); currency:Currency; _CUSTOM:Custom"),
1243
+ n("dateFormat", "Date format", "string", "SELECT", ":; DAY:Day; MONTH:Month; YEAR:Year; HOUR:Hour; MINUTE:Minute; SECOND:Second; _CUSTOM:Custom"),
1244
+ n("merged", "Merge", "bool", "BOOL")
1245
+ ),
1246
+ p("Sort", n("sortable", "Sort", "bool", "BOOL"), n("sortPropertyId", "Sort Property ID", "string", "TEXT")),
1247
+ p(
1248
+ "Cell Click",
1249
+ n("clickable", "Clickable", "bool", "BOOL"),
1250
+ n("clickUrl", "Click URL", "string", "TEXT"),
1251
+ n("clickTarget", "Click Target", "string", "TEXT")
1252
+ ),
1253
+ p(
1254
+ "Filter/Lookup",
1255
+ n("filter", "Filter", "string", "SELECT", ":; TextFilter:TextFilter; NumberFilter:NumberFilter; Select:Select; MultiSelect:MultiSelect; PopupSelect:PopupSelect; CategorySelect:CategorySelect; YesNoSelect:YesNoSelect"),
1256
+ n("filterPropertyId", "Filter Property ID", "string", "TEXT"),
1257
+ n("filterValueType", "Filter Value Type", "string", "SELECT", it),
1258
+ n("lookupDate", "Lookup (Date)", "bool", "BOOL"),
1259
+ n("lookupInput", "Lookup (Input)", "bool", "BOOL"),
1260
+ n("lookupPropertyId", "Lookup Property ID", "string", "TEXT"),
1261
+ n("lookupValueType", "Lookup Value Type", "string", "SELECT", it),
1262
+ n("supportsInFilter", "Supports In Filter", "bool", "BOOL")
1263
+ ),
1264
+ p("Style", n("styleName", "Cell style", "string", "TEXT"), n("css", "Cell CSS", "string", "TEXT"))
1265
+ ]),
1266
+ f("GridCellPanel", "Grid Cell Panel", []),
1267
+ f("GridControl", "Grid Control", [
1268
+ p(
1269
+ "Grid Control",
1270
+ n("grid", "Grid ID", "string", "COMPONENT_REF", "Grid"),
1271
+ n("useTotalCount", "Total Count", "bool", "BOOL"),
1272
+ n("hideSelectedCount", "Hide Selected Count", "bool", "BOOL"),
1273
+ n("useRefreshButton", "Refresh", "bool", "BOOL"),
1274
+ n("useClearFilterButton", "Clear Filter", "bool", "BOOL"),
1275
+ n("useExcelDownloadButton", "Excel Download", "bool", "BOOL"),
1276
+ n("useAddRowButton", "Add Row", "bool", "BOOL"),
1277
+ n("addRowAtBottom", "Add to Bottom", "bool", "BOOL"),
1278
+ n("useRemoveRowButton", "Remove Row", "bool", "BOOL"),
1279
+ n("useFilterLayerButton", "Filter Layer", "bool", "BOOL", void 0, w(!0)),
1280
+ n("useColumnSettingButton", "Column Setting", "bool", "BOOL"),
1281
+ n("excelDownMaxCount", "Excel Max Count", "int", "INTEGER")
1282
+ ),
1283
+ g()
1284
+ ]),
1285
+ f("GridLookup", "Grid Lookup", [
1286
+ p(
1287
+ "Grid Lookup",
1288
+ n("grid", "Grid ID", "string", "COMPONENT_REF", "Grid"),
1289
+ n("useLookupSettingButton", "Use Setting", "bool", "BOOL"),
1290
+ n("inputFilterType", "Input Filter Type", "string", "SELECT", ":; LIKE:Like; EQUAL:Equal;"),
1291
+ n("dateResolution", "DateResolution", "string", "SELECT", ":; DAY:Day;HOUR:Hour;MINUTE:Minute;SECOND:Second;")
1292
+ ),
1293
+ g(),
1294
+ T()
1295
+ ])
1296
+ ], Ee = ":Auto;ENUM:Enum Class;STRING:String", Ge = ":; DAY:Day;HOUR:Hour;MINUTE:Minute;SECOND:Second", Gn = [
1297
+ f(
1298
+ "TextField",
1299
+ "Text Field",
1300
+ [
1301
+ p(
1302
+ "TextField",
1303
+ n("placeholder", "Placeholder", "text", "MESSAGE_TEXT"),
1304
+ n("textType", "Text Type", "string", "SELECT", "TEXT:Text; EMAIL:Email; URL:URL; PASSWORD:Password", te("TEXT")),
1305
+ n("maxLength", "Max Length", "int", "INTEGER"),
1306
+ n("clickable", "Clickable", "bool", "BOOL"),
1307
+ n("clickUrl", "Click URL", "string", "TEXT"),
1308
+ n("clickTarget", "Click Target", "string", "TEXT"),
1309
+ n("prefix", "Prefix", "text", "MESSAGE_TEXT"),
1310
+ n("suffix", "Suffix", "text", "MESSAGE_TEXT"),
1311
+ n("autoComplete", "AutoComplete", "string", "TEXT")
1312
+ ),
1313
+ A(),
1314
+ g(),
1315
+ T()
1316
+ ],
1317
+ [q(), $(), O(), F(), V(), ot(), rt(), ...k()]
1318
+ ),
1319
+ f(
1320
+ "TextArea",
1321
+ "Text Area",
1322
+ [
1323
+ p(
1324
+ "TextArea",
1325
+ n("placeholder", "Placeholder", "text", "MESSAGE_TEXT"),
1326
+ n("autoResize", "Auto resize", "bool", "BOOL", void 0, w(!0))
1327
+ ),
1328
+ A(),
1329
+ g(),
1330
+ T()
1331
+ ],
1332
+ [q(), $(), O(), F(), ...k()]
1333
+ ),
1334
+ f(
1335
+ "StyledTextField",
1336
+ "Styled Text Field",
1337
+ [p("StyledTextField"), A(), g(), T()],
1338
+ [...k()]
1339
+ ),
1340
+ f(
1341
+ "RichTextArea",
1342
+ "Rich Text Area",
1343
+ [
1344
+ p(
1345
+ "RichTextArea",
1346
+ n("maxSize", "Image max size", "int", "INTEGER"),
1347
+ n("subFolder", "Image sub folder", "string", "TEXT")
1348
+ ),
1349
+ A(),
1350
+ g(),
1351
+ T()
1352
+ ],
1353
+ [O(), ...k()]
1354
+ ),
1355
+ f(
1356
+ "TelField",
1357
+ "Tel Field",
1358
+ [
1359
+ p(
1360
+ "TelField",
1361
+ n("telNotation", "Notation", "string", "SELECT", ":Default; TYPE1:Type 1; TYPE3:Type 3; TYPE1C:Type 1 + CountryCode; TYPE3C:Type3 + CountryCode"),
1362
+ n("placeholder", "Placeholder", "text", "MESSAGE_TEXT")
1363
+ ),
1364
+ A(),
1365
+ g(),
1366
+ T()
1367
+ ],
1368
+ [q(), $(), O(), ...k(), F()]
1369
+ ),
1370
+ f(
1371
+ "NumberField",
1372
+ "Number Field",
1373
+ [
1374
+ p(
1375
+ "NumberField",
1376
+ n("placeholder", "Placeholder", "text", "MESSAGE_TEXT"),
1377
+ n("format", "Format", "string", "SELECT", ":; #,###:1,234 (#,###); #:1234 (#); #,##0.#####:1,234.56789 (#,##0.#####); #,##0.00:1,234.00 (#,##0.00); _CUSTOM:Custom"),
1378
+ n("allowNull", "Allow null", "bool", "BOOL"),
1379
+ n("allowNegative", "Allow negative", "bool", "BOOL"),
1380
+ n("clickable", "Clickable", "bool", "BOOL"),
1381
+ n("clickUrl", "Click URL", "string", "TEXT"),
1382
+ n("clickTarget", "Click Target", "string", "TEXT"),
1383
+ n("percentage", "Percentage", "bool", "BOOL"),
1384
+ n("prefix", "Prefix", "text", "MESSAGE_TEXT"),
1385
+ n("suffix", "Suffix", "text", "MESSAGE_TEXT")
1386
+ ),
1387
+ A(),
1388
+ g(),
1389
+ T()
1390
+ ],
1391
+ [q(), $(), V(), O(), ...k(), F(), ot(), rt()]
1392
+ ),
1393
+ f(
1394
+ "CurrencyField",
1395
+ "Currency Field",
1396
+ [
1397
+ p(
1398
+ "CurrencyField",
1399
+ n("placeholder", "Placeholder", "text", "MESSAGE_TEXT"),
1400
+ n("allowNull", "Allow null", "bool", "BOOL"),
1401
+ n("hidePrefix", "Hide Prefix", "bool", "BOOL"),
1402
+ n("hideSuffix", "Hide Suffix", "bool", "BOOL"),
1403
+ n("clickable", "Clickable", "bool", "BOOL"),
1404
+ n("clickUrl", "Click URL", "string", "TEXT"),
1405
+ n("clickTarget", "Click Target", "string", "TEXT")
1406
+ ),
1407
+ A(),
1408
+ g(),
1409
+ T()
1410
+ ],
1411
+ [q(), $(), V(), O(), ...k(), F()]
1412
+ ),
1413
+ f(
1414
+ "DateField",
1415
+ "Date Field",
1416
+ [
1417
+ p(
1418
+ "DateField",
1419
+ n("placeholder", "Placeholder", "text", "MESSAGE_TEXT"),
1420
+ n("dateFormat", "Format", "string", "TEXT"),
1421
+ n("resolution", "Resolution", "string", "SELECT", ":; DAY:Day;HOUR:Hour;MINUTE:Minute;SECOND:Second;"),
1422
+ n("displayResolution", "Display Resolution", "string", "SELECT", Ge),
1423
+ n("truncateType", "Truncate Type", "string", "SELECT", ":; BEGIN:BEGIN; END:END;"),
1424
+ n("beginYearDelta", "Begin Year Delta", "int", "INTEGER"),
1425
+ n("endYearDelta", "End Year Delta", "int", "INTEGER"),
1426
+ n("initialHour", "Initial Hour", "int", "INTEGER"),
1427
+ n("initialMinute", "Initial Minute", "int", "INTEGER"),
1428
+ n("stepOfMinutes", "Step of Minutes", "int", "INTEGER")
1429
+ ),
1430
+ A(),
1431
+ g(),
1432
+ T()
1433
+ ],
1434
+ [O(), ...k()]
1435
+ ),
1436
+ f(
1437
+ "TimeField",
1438
+ "Time Field",
1439
+ [
1440
+ p("TimeField", n("resolution", "Resolution", "string", "SELECT", ":; HOUR:Hour;MINUTE:Minute;SECOND:Second")),
1441
+ A(),
1442
+ g(),
1443
+ T()
1444
+ ],
1445
+ [O(), ...k()]
1446
+ ),
1447
+ f(
1448
+ "DateRange",
1449
+ "Date Range",
1450
+ [
1451
+ p(
1452
+ "DateRange",
1453
+ n("fromPlaceholder", "From Placeholder", "text", "MESSAGE_TEXT"),
1454
+ n("toPlaceholder", "To Placeholder", "text", "MESSAGE_TEXT"),
1455
+ n("checkDateOrder", "Check Order", "bool", "BOOL"),
1456
+ n("checkDateOrderMessage", "Check Msg", "text", "MESSAGE_TEXT"),
1457
+ n("resolution", "Resolution", "string", "SELECT", Ge),
1458
+ n("displayResolution", "Display Resolution", "string", "SELECT", Ge),
1459
+ n("selectResolution", "Select Resolution", "string", "SELECT", ":; WEEK:Week"),
1460
+ n("beginYearDelta", "Begin Year Delta", "int", "INTEGER"),
1461
+ n("endYearDelta", "End Year Delta", "int", "INTEGER"),
1462
+ n("fromPropertyId", "From Property ID", "string", "TEXT"),
1463
+ n("fromDataMapping", "From Data Mapping", "dataMapping", "DATAMAPPING"),
1464
+ n("toPropertyId", "To Property ID", "string", "TEXT"),
1465
+ n("toDataMapping", "To Data Mapping", "dataMapping", "DATAMAPPING"),
1466
+ n("stepOfMinutes", "Step of Minutes", "int", "INTEGER"),
1467
+ n("dateFieldWidth", "DateField Width", "string", "TEXT")
1468
+ ),
1469
+ kn(),
1470
+ g(),
1471
+ T()
1472
+ ],
1473
+ [O(), ...k()]
1474
+ ),
1475
+ f(
1476
+ "CheckBox",
1477
+ "CheckBox",
1478
+ [p("CheckBox", n("checked", "Checked", "bool", "BOOL")), A(), g(), T()],
1479
+ [me(), O()]
1480
+ ),
1481
+ f(
1482
+ "RadioButton",
1483
+ "RadioButton",
1484
+ [p("RadioButton"), A(), g()],
1485
+ [O()]
1486
+ ),
1487
+ f(
1488
+ "RadioGroup",
1489
+ "Radio Group",
1490
+ [
1491
+ p(
1492
+ "RadioGroup",
1493
+ n("dataSource", "Data source", "dataSource", "TEXT_WITH_BUTTON"),
1494
+ n("codeValueType", "Code Value Type", "string", "SELECT", Ee)
1495
+ ),
1496
+ A(),
1497
+ g(),
1498
+ T()
1499
+ ],
1500
+ [me(), Fe(), O(), ...k()]
1501
+ ),
1502
+ f(
1503
+ "CheckBoxGroup",
1504
+ "CheckBox Group",
1505
+ [
1506
+ p(
1507
+ "CheckBoxGroup",
1508
+ n("dataSource", "Data source", "dataSource", "TEXT_WITH_BUTTON"),
1509
+ n("codeValueType", "Code Value Type", "string", "SELECT", Ee),
1510
+ n("multiSelect", "MultiSelect", "bool", "BOOL", void 0, w(!0))
1511
+ ),
1512
+ A(),
1513
+ g(),
1514
+ T()
1515
+ ],
1516
+ [me(), Fe(), O(), ...k()]
1517
+ ),
1518
+ f(
1519
+ "YesNoGroup",
1520
+ "YesNo Group",
1521
+ [
1522
+ p(
1523
+ "YesNoGroup",
1524
+ n("yesCaption", "Yes caption", "text", "MESSAGE_TEXT"),
1525
+ n("noCaption", "No caption", "text", "MESSAGE_TEXT")
1526
+ ),
1527
+ A(),
1528
+ g(),
1529
+ T()
1530
+ ],
1531
+ [me(), Fe(), O(), ...k()]
1532
+ ),
1533
+ f(
1534
+ "Select",
1535
+ "Select",
1536
+ [
1537
+ p(
1538
+ "Select",
1539
+ n("placeholder", "Placeholder", "text", "MESSAGE_TEXT"),
1540
+ n("dataSource", "Data source", "dataSource", "TEXT_WITH_BUTTON"),
1541
+ n("codeValueType", "Code Value Type", "string", "SELECT", Ee),
1542
+ n("nullSelectionAllowed", "Allow null", "bool", "BOOL"),
1543
+ n("nullCaption", "Null caption", "text", "MESSAGE_TEXT"),
1544
+ n("ignoreCase", "Ignore case", "bool", "BOOL")
1545
+ ),
1546
+ A(),
1547
+ g(),
1548
+ T()
1549
+ ],
1550
+ [$(), O(), ...k(), F()]
1551
+ ),
1552
+ f(
1553
+ "MultiSelect",
1554
+ "Multi Select",
1555
+ [
1556
+ p(
1557
+ "MultiSelect",
1558
+ n("placeholder", "Placeholder", "text", "MESSAGE_TEXT"),
1559
+ n("dataSource", "Data source", "dataSource", "TEXT_WITH_BUTTON"),
1560
+ n("codeValueType", "Code Value Type", "string", "SELECT", Ee),
1561
+ n("ignoreCase", "Ignore case", "bool", "BOOL")
1562
+ ),
1563
+ A(),
1564
+ g(),
1565
+ T()
1566
+ ],
1567
+ [$(), O(), ...k(), F()]
1568
+ ),
1569
+ f(
1570
+ "CategorySelect",
1571
+ "Category Select",
1572
+ [
1573
+ p(
1574
+ "CategorySelect",
1575
+ n("placeholder", "Placeholder", "text", "MESSAGE_TEXT"),
1576
+ n("dataSource", "Data source", "dataSource", "TEXT_WITH_BUTTON"),
1577
+ n("codeValueType", "Code Value Type", "string", "SELECT", Ee),
1578
+ n("nullSelectionAllowed", "Allow null", "bool", "BOOL"),
1579
+ n("nullCaption", "Null caption", "text", "MESSAGE_TEXT"),
1580
+ n("ignoreCase", "Ignore case", "bool", "BOOL")
1581
+ ),
1582
+ A(),
1583
+ g(),
1584
+ T()
1585
+ ],
1586
+ [$(), O(), ...k(), F()]
1587
+ ),
1588
+ f(
1589
+ "PopupSelect",
1590
+ "Popup Select",
1591
+ [
1592
+ p(
1593
+ "PopupSelect",
1594
+ n("buttonCaption", "Button caption", "text", "MESSAGE_TEXT"),
1595
+ n("captionFieldReadOnly", "Text ReadOnly", "bool", "BOOL", void 0, w(!0)),
1596
+ n("captionFieldViewMode", "Text ViewMode", "bool", "BOOL"),
1597
+ n("hideCaptionField", "Hide TextField", "bool", "BOOL"),
1598
+ n("hideButton", "Hide Button", "bool", "BOOL")
1599
+ ),
1600
+ A(),
1601
+ g(),
1602
+ T()
1603
+ ],
1604
+ [O(), ...k()]
1605
+ ),
1606
+ f(
1607
+ "YesNoSelect",
1608
+ "YesNo Select",
1609
+ [
1610
+ p(
1611
+ "YesNoSelect",
1612
+ n("placeholder", "Placeholder", "text", "MESSAGE_TEXT"),
1613
+ n("yesCaption", "Yes caption", "text", "MESSAGE_TEXT"),
1614
+ n("noCaption", "No caption", "text", "MESSAGE_TEXT"),
1615
+ n("nullSelectionAllowed", "Allow null", "bool", "BOOL"),
1616
+ n("nullCaption", "Null caption", "text", "MESSAGE_TEXT"),
1617
+ n("ignoreCase", "Ignore case", "bool", "BOOL")
1618
+ ),
1619
+ A(),
1620
+ g(),
1621
+ T()
1622
+ ],
1623
+ [$(), O(), ...k(), F()]
1624
+ ),
1625
+ f(
1626
+ "ColorField",
1627
+ "Color Field",
1628
+ [p("ColorField"), A(), g(), T()],
1629
+ [$(), O(), F(), V(), ...k()]
1630
+ )
1631
+ ], Xn = [
1632
+ f(
1633
+ "VerticalLayout",
1634
+ "Vertical Layout",
1635
+ [
1636
+ p(
1637
+ "Vertical Layout",
1638
+ n("margin", "Margin", "bool", "BOOL"),
1639
+ n("spacing", "Spacing", "bool", "BOOL"),
1640
+ n("enableChildDragAndDrop", "Enable DnD", "bool", "BOOL"),
1641
+ n("dragAndDropPositionMarkSize", "DnD mark size", "int", "INTEGER")
1642
+ ),
1643
+ g(),
1644
+ T(),
1645
+ Ie(),
1646
+ we()
1647
+ ],
1648
+ [
1649
+ se(),
1650
+ Ae(),
1651
+ Ye(),
1652
+ J(),
1653
+ ...de(),
1654
+ ...le(),
1655
+ O(),
1656
+ V(),
1657
+ _("shadow", "Shadow")
1658
+ ]
1659
+ ),
1660
+ f(
1661
+ "HorizontalLayout",
1662
+ "Horizontal Layout",
1663
+ [
1664
+ p(
1665
+ "Horizontal Layout",
1666
+ n("margin", "Margin", "bool", "BOOL"),
1667
+ n("spacing", "Spacing", "bool", "BOOL"),
1668
+ n("enableChildDragAndDrop", "Enable DnD", "bool", "BOOL"),
1669
+ n("dragAndDropPositionMarkSize", "DnD mark size", "int", "INTEGER")
1670
+ ),
1671
+ g(),
1672
+ T(),
1673
+ Ie(),
1674
+ we()
1675
+ ],
1676
+ [
1677
+ se(),
1678
+ Ae(),
1679
+ Ye(),
1680
+ J(),
1681
+ ...de(),
1682
+ ...le(),
1683
+ O(),
1684
+ V(),
1685
+ _("shadow", "Shadow")
1686
+ ]
1687
+ ),
1688
+ f(
1689
+ "FormLayout",
1690
+ "Form Layout",
1691
+ [
1692
+ p("Form Layout", n("columnCount", "Column count", "int", "INTEGER")),
1693
+ g(),
1694
+ T(),
1695
+ Ie(),
1696
+ ke(
1697
+ "Layout",
1698
+ n("colspan", "Column Span", "int", "INTEGER"),
1699
+ n("takeOneRow", "Merge Row", "bool", "BOOL"),
1700
+ n("hideCaptionCell", "Hide Caption", "bool", "BOOL"),
1701
+ n("formCaption", "Form Caption", "text", "MESSAGE_TEXT"),
1702
+ n("delegateDescription", "Delegate Desc.", "bool", "BOOL")
1703
+ )
1704
+ ],
1705
+ [
1706
+ Mt(),
1707
+ F(),
1708
+ ...le(),
1709
+ _("exclude-adjust-caption-width", "Exclude Adjust Caption Width"),
1710
+ _("gray-caption", "Gray Caption"),
1711
+ _("fixed-column-height", "Fixed Column Height"),
1712
+ _("shadow", "Shadow"),
1713
+ V(),
1714
+ $()
1715
+ ]
1716
+ ),
1717
+ f(
1718
+ "CardLayout",
1719
+ "Card Layout",
1720
+ [
1721
+ p(
1722
+ "Card Layout",
1723
+ n("margin", "Margin", "bool", "BOOL"),
1724
+ n("spacing", "Spacing", "bool", "BOOL"),
1725
+ n("collapsible", "Collapsible", "bool", "BOOL", void 0, w(!0)),
1726
+ n("collapsed", "Collapsed", "bool", "BOOL")
1727
+ ),
1728
+ g(),
1729
+ T(),
1730
+ Ie(),
1731
+ we()
1732
+ ],
1733
+ [se(), Ae(), _n(), V(), _("dashboard-card", "Dashboard Card")]
1734
+ ),
1735
+ f(
1736
+ "ActionLayout",
1737
+ "Action Layout",
1738
+ [
1739
+ p("Action Layout", n("margin", "Margin", "bool", "BOOL")),
1740
+ g(),
1741
+ T(),
1742
+ ke("Layout", n("componentAlignment", "Align", "string", "ALIGN"))
1743
+ ],
1744
+ [
1745
+ _("top-action", "Top Action"),
1746
+ se(),
1747
+ J(),
1748
+ It(),
1749
+ kt(),
1750
+ At(),
1751
+ xt(),
1752
+ V()
1753
+ ]
1754
+ ),
1755
+ f("ActionLayoutArea", "Action Layout Area", [
1756
+ ke("Layout", n("componentAlignment", "Align", "string", "ALIGN"))
1757
+ ]),
1758
+ f(
1759
+ "TableLayout",
1760
+ "Table Layout",
1761
+ [
1762
+ p(
1763
+ "Table Layout",
1764
+ n("rowCount", "Row count", "int", "INTEGER"),
1765
+ n("colCount", "Column count", "int", "INTEGER")
1766
+ ),
1767
+ g(),
1768
+ T()
1769
+ ],
1770
+ [
1771
+ _("grid", "Grid style"),
1772
+ F(),
1773
+ vt(),
1774
+ Lt(),
1775
+ Ot(),
1776
+ Ct(),
1777
+ O(),
1778
+ V(),
1779
+ _("shadow", "Shadow")
1780
+ ]
1781
+ ),
1782
+ f(
1783
+ "TableLayoutCell",
1784
+ "Table Layout Cell",
1785
+ [
1786
+ p(
1787
+ "Table Layout Cell",
1788
+ n("cellId", "Cell ID", "string", "TEXT"),
1789
+ n("contentMode", "Content mode", "string", "SELECT", "TEXT:Text; HTML:Html"),
1790
+ n("caption", "Text", "text", "MESSAGE_TEXTAREA"),
1791
+ n("addStyleNames", "Style", "string", "ADD_STYLE"),
1792
+ n("mergeSameValueVertical", "Merge Vertical", "bool", "BOOL"),
1793
+ n("clickable", "Clickable", "bool", "BOOL")
1794
+ ),
1795
+ T()
1796
+ ],
1797
+ [
1798
+ _("header", "Header"),
1799
+ q(),
1800
+ Mn(),
1801
+ xe(),
1802
+ He(),
1803
+ F(),
1804
+ ...le(),
1805
+ V()
1806
+ ]
1807
+ ),
1808
+ f(
1809
+ "FlowLayout",
1810
+ "Flow Layout",
1811
+ [
1812
+ p(
1813
+ "Flow Layout",
1814
+ n("margin", "Margin", "bool", "BOOL"),
1815
+ n("spacing", "Spacing", "bool", "BOOL")
1816
+ ),
1817
+ g(),
1818
+ T()
1819
+ ],
1820
+ [J(), ...de(), V(), _("shadow", "Shadow")]
1821
+ ),
1822
+ f(
1823
+ "ExpansionLayout",
1824
+ "Expansion Layout",
1825
+ [
1826
+ p(
1827
+ "Expansion Layout",
1828
+ n("collapsed", "Collapsed", "bool", "BOOL"),
1829
+ n("bodyVisible", "Body Visible", "bool", "BOOL")
1830
+ ),
1831
+ g(),
1832
+ T()
1833
+ ],
1834
+ [F(), ...le(), V(), _("shadow", "Shadow")]
1835
+ ),
1836
+ f("InternalLayoutArea", "", [])
1837
+ ], Un = [
1838
+ f(
1839
+ "ListField",
1840
+ "List Field",
1841
+ [
1842
+ p(
1843
+ "List Field",
1844
+ n("listFieldDef", "ListField Definition", "string", "BUTTON"),
1845
+ n("margin", "Margin", "bool", "BOOL"),
1846
+ n("spacing", "Spacing", "bool", "BOOL"),
1847
+ n("useCheckbox", "Checkbox", "bool", "BOOL", void 0, w(!0)),
1848
+ n("multiSelect", "Multi Select", "bool", "BOOL", void 0, w(!0)),
1849
+ n("showEmptyMsg", "Show Empty Msg", "bool", "BOOL", void 0, w(!0))
1850
+ ),
1851
+ p(
1852
+ "Field",
1853
+ n("propertyId", "Property ID", "string", "TEXT"),
1854
+ n("dataMapping", "Data Mapping", "dataMapping", "DATAMAPPING"),
1855
+ n("validate", "Validation", "validator", "TEXT_WITH_BUTTON")
1856
+ ),
1857
+ g(),
1858
+ T()
1859
+ ],
1860
+ [
1861
+ se(),
1862
+ Ae(),
1863
+ O(),
1864
+ ...k(),
1865
+ F(),
1866
+ ...le(),
1867
+ Mt()
1868
+ ]
1869
+ ),
1870
+ f("ListControl", "List Control", [
1871
+ p(
1872
+ "List Control",
1873
+ n("listField", "ListField ID", "string", "COMPONENT_REF", "ListField"),
1874
+ n("useAddRowButton", "Add Row", "bool", "BOOL"),
1875
+ n("useRemoveRowButton", "Remove Row", "bool", "BOOL"),
1876
+ n("useExpandAllButton", "Expand All", "bool", "BOOL"),
1877
+ n("useTotalCount", "Total Count", "bool", "BOOL"),
1878
+ n("useSelectedCount", "Selected Count", "bool", "BOOL")
1879
+ ),
1880
+ g()
1881
+ ])
1882
+ ], ae = () => [
1883
+ n("langPropertyId", "Lang property", "string", "TEXT"),
1884
+ n("langDataMapping", "Lang Data Mapping", "dataMapping", "DATAMAPPING"),
1885
+ n("textPropertyId", "Text property", "string", "TEXT"),
1886
+ n("textDataMapping", "Text Data Mapping", "dataMapping", "DATAMAPPING")
1887
+ ], ie = (e = "Item Class") => [
1888
+ n("itemClass", e, "string", "TEXT_WITH_BUTTON"),
1889
+ n("expandFields", "Expand", "bool", "BOOL"),
1890
+ n("popupMode", "Popup Mode", "bool", "BOOL")
1891
+ ], $n = [
1892
+ f("MultiLangTextField", "Multi Lang TextField", [
1893
+ p(
1894
+ "MultiLangTextField",
1895
+ ...ae(),
1896
+ n("placeholder", "Placeholder", "text", "MESSAGE_TEXT"),
1897
+ ...ie()
1898
+ ),
1899
+ A(),
1900
+ g(),
1901
+ T()
1902
+ ]),
1903
+ f("MultiLangTextArea", "Multi Lang TextArea", [
1904
+ p(
1905
+ "MultiLangTextArea",
1906
+ ...ae(),
1907
+ n("placeholder", "Placeholder", "text", "MESSAGE_TEXT"),
1908
+ ...ie()
1909
+ ),
1910
+ A(),
1911
+ g(),
1912
+ T()
1913
+ ]),
1914
+ f("MultiLangStyledTextField", "Multi Lang StyledTextField", [
1915
+ p("MultiLangStyledTextField", ...ae(), ...ie()),
1916
+ A(),
1917
+ g(),
1918
+ T()
1919
+ ]),
1920
+ f("MultiLangRichTextArea", "Multi Lang RichTextArea", [
1921
+ p("MultiLangRichTextArea", ...ae(), ...ie()),
1922
+ A(),
1923
+ g(),
1924
+ T()
1925
+ ]),
1926
+ f("MultiLangPageBuilder", "Multi Lang PageBuilder", [
1927
+ p(
1928
+ "MultiLangPageBuilder",
1929
+ n("subFolder", "Image sub folder", "string", "TEXT"),
1930
+ ...ae(),
1931
+ ...ie()
1932
+ ),
1933
+ A(),
1934
+ g(),
1935
+ T()
1936
+ ]),
1937
+ f("MultiLangContentEditor", "Multi Lang ContentEditor", [
1938
+ p("MultiLangContentEditor", ...ae(), ...ie()),
1939
+ A(),
1940
+ g(),
1941
+ T()
1942
+ ]),
1943
+ f("MultiLangFileUpload", "Multi Lang FileUpload", [
1944
+ p("MultiLangFileUpload", ...ae(), ...ie("Item type")),
1945
+ p(
1946
+ "FileUpload",
1947
+ n("maxSize", "Max size", "int", "INTEGER"),
1948
+ n("fileType", "File type", "string", "SELECT", "ALL:All;IMAGE:Image;"),
1949
+ n("fileExtString", "File exts", "string", "TEXT"),
1950
+ n("thumbnailWidth", "Thumbnail Width", "string", "TEXT"),
1951
+ n("thumbnailHeight", "Thumbnail Height", "string", "TEXT")
1952
+ ),
1953
+ A(),
1954
+ g(),
1955
+ T()
1956
+ ])
1957
+ ], Hn = [
1958
+ f(
1959
+ "Tree",
1960
+ "Tree",
1961
+ [
1962
+ p("Tree", n("nullSelectionAllowed", "Allow null", "bool", "BOOL", void 0, w(!0))),
1963
+ g(),
1964
+ T()
1965
+ ],
1966
+ [J(), Ye(), O(), ...k()]
1967
+ ),
1968
+ f("TreeControl", "TreeControl", [
1969
+ p(
1970
+ "TreeControl",
1971
+ n("tree", "Tree ID", "string", "COMPONENT_REF", "Tree"),
1972
+ n("useAddButton", "Add", "bool", "BOOL"),
1973
+ n("useRemoveButton", "Remove", "bool", "BOOL"),
1974
+ n("useExpandButton", "Expand", "bool", "BOOL"),
1975
+ n("useMoveUpButton", "Move Up", "bool", "BOOL"),
1976
+ n("useMoveDownButton", "Move Down", "bool", "BOOL"),
1977
+ n("useSaveOrderButton", "Save order", "bool", "BOOL")
1978
+ ),
1979
+ g(),
1980
+ T()
1981
+ ]),
1982
+ f("TabSheet", "Tab Sheet", [g(), T()]),
1983
+ f("TabSheetPanel", "Tab Sheet Panel", [])
1984
+ ], Yn = [
1985
+ ...Xn,
1986
+ ...Bn,
1987
+ ...Gn,
1988
+ ...Nn,
1989
+ ...$n,
1990
+ ...Fn,
1991
+ ...Hn,
1992
+ ...wn,
1993
+ ...Un,
1994
+ ...Rn,
1995
+ ...Dn
1996
+ ], Vn = {
1997
+ // ── Layout: open 컨테이너 (AbstractOrderedLayoutPart 계열 — 타입 guard 없음) ──
1998
+ // VerticalLayoutPart.java:16 / HorizontalLayoutPart.java:16 (extends AbstractOrderedLayoutPart),
1999
+ // AbstractOrderedLayoutPart.java:127-146,387-415 (createPart→addWidgetByAction, instanceof 체크 없음)
2000
+ VerticalLayout: { role: "open" },
2001
+ HorizontalLayout: { role: "open" },
2002
+ // CardLayoutPart.java:30 (extends VerticalLayoutPart). body는 임의 자식 수용(상속).
2003
+ // 내부 titleLayout은 childType="titles" 규약으로 분리 — containment 관점에선 open.
2004
+ CardLayout: { role: "open" },
2005
+ // FormLayoutPart.java:39,131-148 — 임의 IsPart 자식을 row/column 셀에 배치, 타입 guard 없음.
2006
+ FormLayout: { role: "open" },
2007
+ // FlowLayoutPart.java:32,148-153,310-339 — 임의 자식 add/insert, 타입체크 없음.
2008
+ FlowLayout: { role: "open" },
2009
+ // ActionLayoutArea = HorizontalLayoutPart 인스턴스에 setPartType(ActionLayoutArea) 부여(독립 클래스 아님).
2010
+ // 자체는 open(ActionLayoutPart.java:38-52). 샘플: ActionLayoutArea ⊃ Horizontal/Vertical/Button/PageRefreshButton.
2011
+ ActionLayoutArea: { role: "open" },
2012
+ // ── Layout: open 단일 슬롯 (arity max 1) ──
2013
+ // SimpleLayoutPart.java:15-17 (isDropAvailable = getWidgetCount()==0). InternalLayoutArea=SimpleLayoutPart 인스턴스.
2014
+ InternalLayoutArea: { role: "open", arity: { max: 1 } },
2015
+ // TableLayoutPart.java:280-294,401-404,444-448 (TableLayoutCell extends SimplePanel, setContentPart 단일 슬롯).
2016
+ TableLayoutCell: { role: "open", arity: { max: 1 } },
2017
+ // TabSheetPart.java:363,388-406 (TabPanelPart extends FlowLayoutPart, count==0일 때만 drop → 위젯 1개).
2018
+ TabSheetPanel: { role: "open", arity: { max: 1 } },
2019
+ // GridPart.java:1188,1208-1225 (GridCellPartPanel extends FlowLayoutPart, count==0일 때만 drop).
2020
+ // 커스텀 셀 컴포넌트 홀더. clean 모델(prop-shaped 컬럼)에선 현재 미사용 — 잔존 파트로 유지.
2021
+ GridCellPanel: { role: "open", arity: { max: 1 } },
2022
+ // ListFieldPart.java:21,71-96 — 내부 row(SimpleLayoutPart)에 content 1개(single-slot).
2023
+ ListField: { role: "open", arity: { max: 1 } },
2024
+ // ── Layout: fixed 컨테이너 ──
2025
+ // ActionLayoutPart.java:38-52,84-103 — 생성자가 left/right 2개 HorizontalLayoutPart(setPartType=ActionLayoutArea) 고정 생성.
2026
+ // 실샘플 5개 인스턴스 전부 ActionLayoutArea×2로 실증.
2027
+ ActionLayout: { role: "fixed", fixedChildren: ["ActionLayoutArea"], arity: { min: 2, max: 2 } },
2028
+ // ExpansionLayoutPart.java:15,41,51,80-91 — title/body 2개 SimpleLayoutPart(setPartType=InternalLayoutArea) 고정.
2029
+ ExpansionLayout: { role: "fixed", fixedChildren: ["InternalLayoutArea"], arity: { min: 2, max: 2 } },
2030
+ // TableLayoutPart.java:34,84-89,138-165 — rowCount×colCount 개의 TableLayoutCell만 수용(기본 3×3). arity 동적.
2031
+ TableLayout: { role: "fixed", fixedChildren: ["TableLayoutCell"] },
2032
+ // ── Basic: fixed(팝업 콘텐츠) ──
2033
+ // PopupButtonPart.java:24,35,65-89 — 자식 정확히 1개, VerticalLayoutPart(팝업 콘텐츠 컨테이너)만 수용.
2034
+ PopupButton: { role: "fixed", fixedChildren: ["VerticalLayout"], arity: { min: 1, max: 1 } },
2035
+ // AuditInfoButtonPart: initPart 미오버라이드 → PopupButtonPart 컨테이너 동작 상속(유일 예외 leaf-아님 Basic).
2036
+ AuditInfoButton: { role: "fixed", fixedChildren: ["VerticalLayout"], arity: { min: 1, max: 1 } },
2037
+ // ── Grid/Tree: fixed(반복 원소 컨테이너) ──
2038
+ // GridPart.java:47,143-177,251-268 — 자식 ColumnDef 전용, 가변 개수. 실샘플 14개 인스턴스 전부 ColumnDef만(1~21개).
2039
+ Grid: { role: "fixed", fixedChildren: ["ColumnDef"] },
2040
+ // TabSheetPart.java:34,86-106 — 자식 TabSheetPanel 전용, 가변 개수. 실샘플 TabSheet⊃TabSheetPanel×5.
2041
+ TabSheet: { role: "fixed", fixedChildren: ["TabSheetPanel"] },
2042
+ // ── leaf (getChildParts 미오버라이드 — 자식 거부). 명시로 미정 warn과 구분. ──
2043
+ // Layout leaf: 없음(전부 위에서 처리).
2044
+ // Basic
2045
+ Button: { role: "leaf" },
2046
+ Label: { role: "leaf" },
2047
+ Image: { role: "leaf" },
2048
+ Link: { role: "leaf" },
2049
+ // LinkTabPart.java:24,98-119 — CardLayoutPart를 스캔·반영만(소유 X). leaf(reference).
2050
+ LinkTab: { role: "leaf" },
2051
+ ProgressBar: { role: "leaf" },
2052
+ Console: { role: "leaf" },
2053
+ NativeUpload: { role: "leaf" },
2054
+ AuditInfo: { role: "leaf" },
2055
+ // Input (전부 leaf — getChildParts 미오버라이드. 그룹 파트는 옵션을 dataSource 문자열로 처리)
2056
+ TextField: { role: "leaf" },
2057
+ TextArea: { role: "leaf" },
2058
+ StyledTextField: { role: "leaf" },
2059
+ RichTextArea: { role: "leaf" },
2060
+ // TelField/TimeField: AbstractContainerFieldPart 기반이나 subParts는 내부 고정 위젯(모델 자식 아님) → leaf.
2061
+ TelField: { role: "leaf" },
2062
+ NumberField: { role: "leaf" },
2063
+ CurrencyField: { role: "leaf" },
2064
+ DateField: { role: "leaf" },
2065
+ TimeField: { role: "leaf" },
2066
+ // DateRangePart.java:38-42 — initPart 오버라이드로 기본 PartAdapter 교체(from/to/btn 고정조합) → leaf.
2067
+ DateRange: { role: "leaf" },
2068
+ CheckBox: { role: "leaf" },
2069
+ RadioButton: { role: "leaf" },
2070
+ // RadioGroup/CheckBoxGroup/YesNoGroup: 옵션을 dataSource 문자열로 처리(자식 파트 아님, OptionGroupPart.java:123-142).
2071
+ RadioGroup: { role: "leaf" },
2072
+ CheckBoxGroup: { role: "leaf" },
2073
+ YesNoGroup: { role: "leaf" },
2074
+ Select: { role: "leaf" },
2075
+ MultiSelect: { role: "leaf" },
2076
+ CategorySelect: { role: "leaf" },
2077
+ // PopupSelect: AbstractContainerFieldPart 기반(내부 고정) → leaf.
2078
+ PopupSelect: { role: "leaf" },
2079
+ YesNoSelect: { role: "leaf" },
2080
+ ColorField: { role: "leaf" },
2081
+ // Composite (전부 leaf — 내부 서브필드는 setDeletable(false) 고정 위젯, 모델 자식 아님)
2082
+ MultiFileUpload: { role: "leaf" },
2083
+ SingleFileUpload: { role: "leaf" },
2084
+ SingleImageUpload: { role: "leaf" },
2085
+ NameField: { role: "leaf" },
2086
+ AddressField: { role: "leaf" },
2087
+ PageBuilder: { role: "leaf" },
2088
+ ContentEditor: { role: "leaf" },
2089
+ // MultiLang (전부 leaf — AbstractMultiLangFieldPart.ignoreChildren=true)
2090
+ MultiLangTextField: { role: "leaf" },
2091
+ MultiLangTextArea: { role: "leaf" },
2092
+ MultiLangStyledTextField: { role: "leaf" },
2093
+ MultiLangRichTextArea: { role: "leaf" },
2094
+ MultiLangPageBuilder: { role: "leaf" },
2095
+ MultiLangContentEditor: { role: "leaf" },
2096
+ MultiLangFileUpload: { role: "leaf" },
2097
+ // Grid/Tree leaf
2098
+ // ColumnDef: clean 모델은 셀 렌더링을 prop(cellType/filter/dataSource)으로 표현(M3.4 prop-shaped).
2099
+ // 레거시 GridColumnPart의 3슬롯(GridCellPanel) 구조는 clean 모델 미채택. 실샘플 ColumnDef 자식 0 → leaf.
2100
+ ColumnDef: { role: "leaf" },
2101
+ // GridControlPart.java:53-57 / GridLookupPart.java:42-52 — plain PartAdapter, 대상 Grid를 grid prop(@id)로 참조 → leaf.
2102
+ GridControl: { role: "leaf" },
2103
+ GridLookup: { role: "leaf" },
2104
+ // TreePart.java:42(기본 getChildParts=null) / TreeControlPart.java:44-46(plain PartAdapter) → leaf.
2105
+ Tree: { role: "leaf" },
2106
+ TreeControl: { role: "leaf" },
2107
+ // Filter (레거시 별도 Part.java 없음 — ColumnDef.filter prop이 지정하는 필드형 파트) → leaf.
2108
+ TextFilter: { role: "leaf" },
2109
+ NumberFilter: { role: "leaf" },
2110
+ SelectFilter: { role: "leaf" },
2111
+ MultiSelectFilter: { role: "leaf" },
2112
+ PopupSelectFilter: { role: "leaf" },
2113
+ CategorySelectFilter: { role: "leaf" },
2114
+ YesNoSelectFilter: { role: "leaf" },
2115
+ // ListField
2116
+ // ListControlPart.java:42-46 — plain PartAdapter, listField prop 참조 → leaf.
2117
+ ListControl: { role: "leaf" },
2118
+ // Chart
2119
+ FlagCard: { role: "leaf" },
2120
+ Chart: { role: "leaf" },
2121
+ // Etc
2122
+ PageRefreshButton: { role: "leaf" },
2123
+ MultiLangExpandButton: { role: "leaf" },
2124
+ // FragmentPart.java:13,22-27,49-80 — fragmentName으로 다른 UI 참조(drop 비활성) → leaf.
2125
+ Fragment: { role: "leaf" },
2126
+ // CommentListPart.java:27-28 — enableDrop=false, IsPart 자식 없음 → leaf.
2127
+ CommentList: { role: "leaf" },
2128
+ // SourceCodeEditor/MarkdownViewer: AbstractContainerFieldPart 기반(내부 고정) → leaf.
2129
+ SourceCodeEditor: { role: "leaf" },
2130
+ MarkdownViewer: { role: "leaf" },
2131
+ History: { role: "leaf" }
2132
+ }, lt = {
2133
+ Label: "value"
2134
+ };
2135
+ function _t(e) {
2136
+ const t = e.category ?? ($e(e.partType) ? gt[e.partType] : void 0);
2137
+ let r = e.captionProp;
2138
+ r == null && (lt[e.partType] != null ? r = lt[e.partType] : e.groups.some((i) => i.items.some((l) => l.id === "caption")) && (r = "caption"));
2139
+ const o = e.containment ?? ($e(e.partType) ? Vn[e.partType] : void 0), a = { ...e, groups: e.groups };
2140
+ return t != null && (a.category = t), r != null && (a.captionProp = r), o != null && (a.containment = o), a;
2141
+ }
2142
+ function Wn(e, t) {
2143
+ var r, o, a, i;
2144
+ if (e == null) return "warn";
2145
+ switch (e.role) {
2146
+ case "leaf":
2147
+ return "deny";
2148
+ case "fixed":
2149
+ return (r = e.fixedChildren) != null && r.includes(t) ? "allow" : "deny";
2150
+ case "open": {
2151
+ if ((o = e.deny) != null && o.includes(t)) return "deny";
2152
+ if (!(e.allow != null && e.allow.length > 0 || e.allowCategories != null && e.allowCategories.length > 0) || (a = e.allow) != null && a.includes(t)) return "allow";
2153
+ const s = $e(t) ? gt[t] : void 0;
2154
+ return s != null && ((i = e.allowCategories) != null && i.includes(s)) ? "allow" : "deny";
2155
+ }
2156
+ }
2157
+ }
2158
+ function Pt(e) {
2159
+ const t = /* @__PURE__ */ new Map();
2160
+ for (const o of e)
2161
+ t.set(o.partType, _t(o));
2162
+ const r = [...t.keys()];
2163
+ return {
2164
+ get: (o) => t.get(o),
2165
+ all: () => r.map((o) => t.get(o)),
2166
+ propertyItem: (o, a) => {
2167
+ const i = t.get(o);
2168
+ if (i)
2169
+ for (const l of i.groups) {
2170
+ const s = l.items.find((c) => c.id === a);
2171
+ if (s) return s;
2172
+ }
2173
+ },
2174
+ canContain: (o, a) => {
2175
+ var i;
2176
+ return Wn((i = t.get(o)) == null ? void 0 : i.containment, a);
2177
+ }
2178
+ };
2179
+ }
2180
+ function zn(e = Yn) {
2181
+ return Pt(e);
2182
+ }
2183
+ function Qr(e, t = {}) {
2184
+ const r = /* @__PURE__ */ new Map();
2185
+ for (const o of e.all()) r.set(o.partType, o);
2186
+ for (const o of [...t.add ?? [], ...t.override ?? []])
2187
+ r.set(o.partType, _t(o));
2188
+ for (const o of t.remove ?? []) r.delete(o);
2189
+ return Pt([...r.values()]);
2190
+ }
2191
+ const jn = {
2192
+ TEXT: "text",
2193
+ TEXTAREA: "text",
2194
+ FULL_TEXTAREA: "text",
2195
+ ICON: "text",
2196
+ MESSAGE_TEXT: "multilang",
2197
+ MESSAGE_TEXTAREA: "multilang",
2198
+ INTEGER: "int",
2199
+ BOOL: "bool",
2200
+ SELECT: "enum",
2201
+ SIZE: "enum",
2202
+ TAGS: "tags"
2203
+ };
2204
+ function Kn(e) {
2205
+ return e ? e.split(";").map((t) => t.trim()).filter((t) => t.length > 0).map((t) => {
2206
+ const r = t.indexOf(":");
2207
+ return r < 0 ? { value: t, label: t } : { value: t.slice(0, r).trim(), label: t.slice(r + 1).trim() };
2208
+ }) : [];
2209
+ }
2210
+ function qn(e) {
2211
+ return e ? e.split(",").map((t) => t.trim()).filter((t) => t.length > 0).map((t) => ({ value: t, label: t })) : [];
2212
+ }
2213
+ function Jn(e) {
2214
+ var t;
2215
+ return ((t = e.agent) == null ? void 0 : t.expose) ?? vn[e.editor];
2216
+ }
2217
+ function Zn(e) {
2218
+ var o, a, i;
2219
+ const t = jn[e.editor] ?? "text", r = { id: e.id, valueType: e.valueType, kind: t };
2220
+ if ((o = e.agent) != null && o.description && (r.description = e.agent.description), t === "enum") {
2221
+ const l = ((i = (a = e.agent) == null ? void 0 : a.enum) == null ? void 0 : i.map((s) => ({ value: s, label: s }))) ?? Kn(e.param);
2222
+ l.length > 0 && (r.options = l);
2223
+ } else if (t === "tags") {
2224
+ const l = qn(e.param);
2225
+ l.length > 0 && (r.options = l);
2226
+ }
2227
+ return r;
2228
+ }
2229
+ function Qn(e) {
2230
+ const t = [], r = [];
2231
+ for (const o of e ?? [])
2232
+ if (o.kind === "toggle")
2233
+ r.push({ css: o.css, label: o.label });
2234
+ else {
2235
+ const a = St(o.dim), i = o.only ? a.filter((l) => o.only.includes(l)) : a;
2236
+ t.push({ dim: o.dim, tokens: i });
2237
+ }
2238
+ return { dims: t, toggles: r };
2239
+ }
2240
+ function eo(e) {
2241
+ const t = [];
2242
+ let r = !1;
2243
+ for (const l of e.groups)
2244
+ for (const s of l.items)
2245
+ if (s.editor !== "ADD_STYLE") {
2246
+ if (s.editor === "ALIGN") {
2247
+ r = !0;
2248
+ continue;
2249
+ }
2250
+ Jn(s) && t.push(Zn(s));
2251
+ }
2252
+ const { dims: o, toggles: a } = Qn(e.styles), i = {
2253
+ partType: e.partType,
2254
+ attrs: t,
2255
+ styleDims: o,
2256
+ styleToggles: a
2257
+ };
2258
+ return e.category != null && (i.category = e.category), e.captionProp != null && (i.captionProp = e.captionProp), r && (i.slotAlign = St("slotAlign")), i;
2259
+ }
2260
+ function to(e) {
2261
+ const t = /* @__PURE__ */ new Map(), r = [];
2262
+ for (const o of e.all())
2263
+ t.set(o.partType, eo(o)), r.push(o.partType);
2264
+ return {
2265
+ get: (o) => t.get(o),
2266
+ all: () => r.map((o) => t.get(o))
2267
+ };
2268
+ }
2269
+ const no = ["part.add", "part.update", "part.remove"], Bt = 4, oo = {
2270
+ type: "object",
2271
+ description: "요소 지정 핸들. id(파트 UUID) 우선, path(예: FormLayout[0]/TextField[2]) 보조, caption(사람 라벨) 최후. 모호하면 서버가 후보를 돌려주니 describeScreen으로 먼저 읽어 핸들을 확정하라.",
2272
+ properties: {
2273
+ ref: { type: "string", description: "매칭할 id/경로/캡션 문자열." },
2274
+ by: {
2275
+ type: "string",
2276
+ enum: ["id", "path", "caption"],
2277
+ description: "매칭 축 고정(미지정 시 id→path→caption 순)."
2278
+ }
2279
+ },
2280
+ required: ["ref"],
2281
+ additionalProperties: !1
2282
+ }, ro = {
2283
+ type: "object",
2284
+ description: 'locale→text 맵(예: {ko:"주문", en:"Order"}).',
2285
+ properties: {
2286
+ ko: { type: "string" },
2287
+ en: { type: "string" },
2288
+ ja: { type: "string" },
2289
+ zh: { type: "string" }
2290
+ },
2291
+ additionalProperties: !1
2292
+ }, ao = {
2293
+ type: "object",
2294
+ description: "메시지 카탈로그 키 참조(레거시 #{key}). 런타임에 key 조회.",
2295
+ properties: {
2296
+ key: { type: "string" },
2297
+ locale: { type: "string" }
2298
+ },
2299
+ required: ["key"],
2300
+ additionalProperties: !1
2301
+ }, io = {
2302
+ description: "다국어 텍스트: 평문 문자열 | locale 맵 | 메시지 키 참조.",
2303
+ anyOf: [{ type: "string" }, { $ref: "#/$defs/multiLangString" }, { $ref: "#/$defs/multiLangMessage" }]
2304
+ }, lo = {
2305
+ description: "kind로 판별되는 타입드 값.",
2306
+ anyOf: [
2307
+ {
2308
+ type: "object",
2309
+ properties: { kind: { const: "string" }, value: { type: "string" } },
2310
+ required: ["kind", "value"],
2311
+ additionalProperties: !1
2312
+ },
2313
+ {
2314
+ type: "object",
2315
+ properties: { kind: { const: "int" }, value: { type: "integer" } },
2316
+ required: ["kind", "value"],
2317
+ additionalProperties: !1
2318
+ },
2319
+ {
2320
+ type: "object",
2321
+ properties: { kind: { const: "bool" }, value: { type: "boolean" } },
2322
+ required: ["kind", "value"],
2323
+ additionalProperties: !1
2324
+ },
2325
+ {
2326
+ type: "object",
2327
+ properties: { kind: { const: "text" }, value: { $ref: "#/$defs/multiLang" } },
2328
+ required: ["kind", "value"],
2329
+ additionalProperties: !1
2330
+ },
2331
+ {
2332
+ type: "object",
2333
+ description: "SELECT/SIZE 등 저장값 직접 방출(라벨 아님 — toAgentCatalog options의 value).",
2334
+ properties: { kind: { const: "enum" }, value: { type: "string" } },
2335
+ required: ["kind", "value"],
2336
+ additionalProperties: !1
2337
+ }
2338
+ ]
2339
+ }, so = {
2340
+ type: "object",
2341
+ description: "한 속성 지정. id는 카탈로그 PropertyItem.id(agent 노출 항목).",
2342
+ properties: {
2343
+ id: { type: "string" },
2344
+ value: { $ref: "#/$defs/propValue" }
2345
+ },
2346
+ required: ["id", "value"],
2347
+ additionalProperties: !1
2348
+ }, co = {
2349
+ type: "object",
2350
+ description: "중립 의미 토큰(G1). resolver가 token→css(.bs-*)로 lowering — 원시 CSS 방출 금지.",
2351
+ properties: {
2352
+ dim: { type: "string", description: "스타일 차원(예: bgColor·size)." },
2353
+ token: { type: "string", description: "의미 토큰(예: blue·lg)." }
2354
+ },
2355
+ required: ["dim", "token"],
2356
+ additionalProperties: !1
2357
+ };
2358
+ function uo(e) {
2359
+ const t = {
2360
+ partType: { type: "string", description: "파트 종류(예: FormLayout·Grid·TextField)." },
2361
+ props: {
2362
+ type: "array",
2363
+ description: "타입드 속성(순서 무관).",
2364
+ items: { $ref: "#/$defs/propAssign" }
2365
+ },
2366
+ styles: {
2367
+ type: "array",
2368
+ description: "중립 스타일 토큰(G1 — slotAlign 포함, dim의 source가 하강 타깃 결정).",
2369
+ items: { $ref: "#/$defs/styleAssign" }
2370
+ }
2371
+ };
2372
+ return e < Bt && (t.children = {
2373
+ type: "array",
2374
+ description: `inline-fold 자식 서브트리(깊이 ${e + 1}). 더 깊은 중첩은 별도 part.add 배치로.`,
2375
+ items: { $ref: `#/$defs/partSpecL${e + 1}` }
2376
+ }), {
2377
+ type: "object",
2378
+ description: e === 0 ? "추가할 파트(및 inline-fold 자식). 신규 서브트리 자식은 별도 op가 아니라 여기 children에 담아라." : `깊이 ${e}의 inline-fold 자식 스펙.`,
2379
+ properties: t,
2380
+ required: ["partType"],
2381
+ additionalProperties: !1
2382
+ };
2383
+ }
2384
+ function po() {
2385
+ const e = {};
2386
+ for (let t = 0; t <= Bt; t++)
2387
+ e[`partSpecL${t}`] = uo(t);
2388
+ return e;
2389
+ }
2390
+ function Xe(e, t) {
2391
+ return {
2392
+ type: "object",
2393
+ properties: { kind: { const: e }, ...t.properties },
2394
+ required: ["kind", ...t.required],
2395
+ additionalProperties: !1
2396
+ };
2397
+ }
2398
+ const fo = {
2399
+ "part.add": Xe("part.add", {
2400
+ properties: {
2401
+ parent: {
2402
+ description: "추가 대상 부모 핸들. null이면 루트에 추가.",
2403
+ anyOf: [{ $ref: "#/$defs/handle" }, { type: "null" }]
2404
+ },
2405
+ spec: { $ref: "#/$defs/partSpecL0" },
2406
+ index: { type: "integer", description: "부모 children 내 삽입 위치(미지정 시 말미)." }
2407
+ },
2408
+ required: ["parent", "spec"]
2409
+ }),
2410
+ "part.update": Xe("part.update", {
2411
+ properties: {
2412
+ target: { $ref: "#/$defs/handle" },
2413
+ props: { type: "array", items: { $ref: "#/$defs/propAssign" }, description: "갱신할 속성(부분)." },
2414
+ styles: { type: "array", items: { $ref: "#/$defs/styleAssign" }, description: "갱신할 스타일 토큰(부분)." }
2415
+ },
2416
+ required: ["target"]
2417
+ }),
2418
+ "part.remove": Xe("part.remove", {
2419
+ properties: { target: { $ref: "#/$defs/handle" } },
2420
+ required: ["target"]
2421
+ })
2422
+ }, go = {
2423
+ anyOf: no.map((e) => fo[e])
2424
+ }, ea = {
2425
+ type: "object",
2426
+ description: "화면 파트 트리를 생성·수정·삭제할 때 호출한다. ops는 사람 핸들(id·path·caption)로 지정하며 서버가 partId로 해소한다. 모호하면 에러로 후보를 돌려주니 describeScreen으로 현재 화면을 먼저 읽어 핸들을 확정하라.",
2427
+ properties: {
2428
+ ops: { type: "array", items: { $ref: "#/$defs/symbolicOp" } }
2429
+ },
2430
+ required: ["ops"],
2431
+ additionalProperties: !1,
2432
+ $defs: {
2433
+ handle: oo,
2434
+ multiLang: io,
2435
+ multiLangString: ro,
2436
+ multiLangMessage: ao,
2437
+ propValue: lo,
2438
+ propAssign: so,
2439
+ styleAssign: co,
2440
+ ...po(),
2441
+ symbolicOp: go
2442
+ }
2443
+ }, To = /* @__PURE__ */ new Set([
2444
+ // 수치 제약
2445
+ "minimum",
2446
+ "maximum",
2447
+ "exclusiveMinimum",
2448
+ "exclusiveMaximum",
2449
+ "multipleOf",
2450
+ // 문자열 제약
2451
+ "minLength",
2452
+ "maxLength",
2453
+ "pattern",
2454
+ // 배열 제약
2455
+ "minItems",
2456
+ "maxItems",
2457
+ "uniqueItems",
2458
+ "contains",
2459
+ "minContains",
2460
+ "maxContains",
2461
+ // object 제약 / 조건부 (anyOf·allOf만 지원)
2462
+ "minProperties",
2463
+ "maxProperties",
2464
+ "oneOf",
2465
+ "not",
2466
+ "if",
2467
+ "then",
2468
+ "else",
2469
+ "patternProperties",
2470
+ "propertyNames",
2471
+ "dependentSchemas",
2472
+ "dependentRequired"
2473
+ ]);
2474
+ function ce(e) {
2475
+ return typeof e == "object" && e !== null && !Array.isArray(e);
2476
+ }
2477
+ function ho(e) {
2478
+ return e.type === "object" || "properties" in e;
2479
+ }
2480
+ function ee(e, t, r, o) {
2481
+ if (Array.isArray(e)) {
2482
+ e.forEach((a, i) => ee(a, `${t}[${i}]`, !1, o));
2483
+ return;
2484
+ }
2485
+ if (ce(e)) {
2486
+ !r && ("$defs" in e || "definitions" in e) && o.push({ rule: "nested-$defs", path: t, detail: "$defs는 최상위에만 허용된다." });
2487
+ for (const a of Object.keys(e))
2488
+ To.has(a) && o.push({ rule: "unsupported-keyword", path: `${t}.${a}`, detail: `미지원 키워드 '${a}'.` });
2489
+ if (ho(e) && e.additionalProperties !== !1 && o.push({
2490
+ rule: "missing-additional-properties-false",
2491
+ path: t,
2492
+ detail: "object 스키마는 additionalProperties:false 이어야 한다."
2493
+ }), ce(e.properties))
2494
+ for (const [a, i] of Object.entries(e.properties)) ee(i, `${t}.properties.${a}`, !1, o);
2495
+ if (ee(e.items, `${t}.items`, !1, o), ee(e.anyOf, `${t}.anyOf`, !1, o), ee(e.allOf, `${t}.allOf`, !1, o), ce(e.additionalProperties) && ee(e.additionalProperties, `${t}.additionalProperties`, !1, o), r && ce(e.$defs))
2496
+ for (const [a, i] of Object.entries(e.$defs)) ee(i, `$defs.${a}`, !1, o);
2497
+ }
2498
+ }
2499
+ const Eo = /^#\/\$defs\/(.+)$/;
2500
+ function Pe(e, t, r, o) {
2501
+ if (Array.isArray(e)) {
2502
+ e.forEach((a) => Pe(a, t, r, o));
2503
+ return;
2504
+ }
2505
+ if (ce(e)) {
2506
+ for (const [a, i] of Object.entries(e))
2507
+ if (a !== "$defs")
2508
+ if (a === "$ref" && typeof i == "string")
2509
+ if (i === "#" || i === "#/")
2510
+ r.add("#");
2511
+ else {
2512
+ const l = Eo.exec(i);
2513
+ l && (t.has(l[1]) ? r.add(l[1]) : o.push(i));
2514
+ }
2515
+ else
2516
+ Pe(i, t, r, o);
2517
+ }
2518
+ }
2519
+ function mo(e, t) {
2520
+ const r = ce(e.$defs) ? e.$defs : {}, o = new Set(Object.keys(r)), a = [], i = /* @__PURE__ */ new Map(), l = /* @__PURE__ */ new Set();
2521
+ Pe({ ...e, $defs: void 0 }, o, l, a), i.set("#", l);
2522
+ for (const m of o) {
2523
+ const S = /* @__PURE__ */ new Set();
2524
+ Pe(r[m], o, S, a), i.set(m, S);
2525
+ }
2526
+ for (const m of a)
2527
+ t.push({ rule: "dangling-$ref", path: m, detail: `존재하지 않는 $defs 참조: ${m}.` });
2528
+ const s = 0, c = 1, u = 2, d = /* @__PURE__ */ new Map();
2529
+ for (const m of i.keys()) d.set(m, s);
2530
+ const h = /* @__PURE__ */ new Set(), E = (m, S) => {
2531
+ d.set(m, c), S.push(m);
2532
+ for (const P of i.get(m) ?? [])
2533
+ if (i.has(P))
2534
+ if (d.get(P) === c) {
2535
+ const H = S.indexOf(P), b = S.slice(H).concat(P), v = b.join("->");
2536
+ h.has(v) || (h.add(v), t.push({
2537
+ rule: "recursion",
2538
+ path: b.join(" -> "),
2539
+ detail: `재귀 스키마($ref 사이클)는 엄격 서브셋 미지원: ${b.join(" -> ")}.`
2540
+ }));
2541
+ } else d.get(P) === s && E(P, S);
2542
+ S.pop(), d.set(m, u);
2543
+ };
2544
+ for (const m of i.keys())
2545
+ d.get(m) === s && E(m, []);
2546
+ }
2547
+ function yo(e) {
2548
+ const t = [];
2549
+ return ee(e, "", !0, t), ce(e) && mo(e, t), t;
2550
+ }
2551
+ function ta(e) {
2552
+ return yo(e).length === 0;
2553
+ }
2554
+ const bo = /^(.+)\[(\d+)\]$/;
2555
+ function Rt(e, t) {
2556
+ const r = Et(e, t);
2557
+ if (!r) return;
2558
+ const o = [];
2559
+ for (let a = 1; a < r.length; a++) {
2560
+ const i = r[a - 1], l = r[a], s = (i.children ?? []).filter((c) => c.partType === l.partType);
2561
+ o.push(`${l.partType}[${s.indexOf(l)}]`);
2562
+ }
2563
+ return o.join("/");
2564
+ }
2565
+ function ve(e, t) {
2566
+ var a;
2567
+ if (!t) return;
2568
+ const r = (a = t.get(e.partType)) == null ? void 0 : a.captionProp;
2569
+ if (!r) return;
2570
+ const o = e.attrs[r];
2571
+ if (o && (o.kind === "string" || o.kind === "text" && typeof o.value == "string"))
2572
+ return o.value;
2573
+ }
2574
+ function So(e, t, r) {
2575
+ const o = { partId: r.partId, path: Rt(e, r.partId) ?? "" }, a = ve(r, t);
2576
+ return a != null && (o.caption = a), o;
2577
+ }
2578
+ function vo(e, t) {
2579
+ let r;
2580
+ return Q(e, (o) => {
2581
+ o.partId === t && (r = o.partId);
2582
+ }), r;
2583
+ }
2584
+ function Lo(e, t) {
2585
+ let r = e;
2586
+ for (const o of t.split("/")) {
2587
+ const a = bo.exec(o.trim());
2588
+ if (!a || !r) return;
2589
+ const [, i, l] = a;
2590
+ if (r = (r.children ?? []).filter((c) => c.partType === i)[Number(l)], !r) return;
2591
+ }
2592
+ return r === e || r == null ? void 0 : r.partId;
2593
+ }
2594
+ function Oo(e, t, r) {
2595
+ const o = [];
2596
+ return Q(e, (a) => {
2597
+ ve(a, t) === r && o.push(a);
2598
+ }), o;
2599
+ }
2600
+ function Ue(e, t) {
2601
+ const r = t.root;
2602
+ if (!r) return { ok: !1, issue: { kind: "handle-not-found", ref: e.ref, by: e.by } };
2603
+ const o = () => vo(r, e.ref), a = () => Lo(r, e.ref), i = () => {
2604
+ const s = Oo(r, t.catalog, e.ref);
2605
+ if (s.length === 1) return { ok: !0, partId: s[0].partId };
2606
+ if (s.length > 1)
2607
+ return {
2608
+ ok: !1,
2609
+ issue: { kind: "handle-ambiguous", ref: e.ref, candidates: s.map((c) => So(r, t.catalog, c)) }
2610
+ };
2611
+ };
2612
+ if (e.by === "id") {
2613
+ const s = o();
2614
+ return s ? { ok: !0, partId: s } : { ok: !1, issue: { kind: "handle-not-found", ref: e.ref, by: "id" } };
2615
+ }
2616
+ if (e.by === "path") {
2617
+ const s = a();
2618
+ return s ? { ok: !0, partId: s } : { ok: !1, issue: { kind: "handle-not-found", ref: e.ref, by: "path" } };
2619
+ }
2620
+ if (e.by === "caption")
2621
+ return i() ?? { ok: !1, issue: { kind: "handle-not-found", ref: e.ref, by: "caption" } };
2622
+ const l = o() ?? a();
2623
+ return l ? { ok: !0, partId: l } : i() ?? { ok: !1, issue: { kind: "handle-not-found", ref: e.ref } };
2624
+ }
2625
+ function Co(e) {
2626
+ switch (e.kind) {
2627
+ case "string":
2628
+ return te(e.value);
2629
+ case "int":
2630
+ return Tt(e.value);
2631
+ case "bool":
2632
+ return w(e.value);
2633
+ case "text":
2634
+ return ht(e.value);
2635
+ case "enum":
2636
+ return te(e.value);
2637
+ }
2638
+ }
2639
+ function Nt(e, t, r) {
2640
+ const o = {}, a = {};
2641
+ for (const l of e ?? []) o[l.id] = Co(l.value);
2642
+ const i = [];
2643
+ for (const l of t ?? []) {
2644
+ const s = bt[l.dim];
2645
+ if (!s) {
2646
+ r.push({ kind: "unknown-style-dim", dim: l.dim });
2647
+ continue;
2648
+ }
2649
+ const c = On(l.dim, l.token);
2650
+ if (c === void 0) {
2651
+ r.push({ kind: "unknown-style-token", dim: l.dim, token: l.token });
2652
+ continue;
2653
+ }
2654
+ c !== "" && (s.source === "style" ? i.push(c) : a[s.legacyDimId] = te(c));
2655
+ }
2656
+ return i.length > 0 && (o.addStyleNames = te(i.join(" "))), { attrs: o, layoutAttrs: a };
2657
+ }
2658
+ function Dt(e, t, r) {
2659
+ const { attrs: o, layoutAttrs: a } = Nt(e.props, e.styles, r), i = { partId: t(), partType: e.partType, attrs: o };
2660
+ return Object.keys(a).length > 0 && (i.layoutAttrs = a), e.children && e.children.length > 0 && (i.children = e.children.map((l) => Dt(l, t, r))), i;
2661
+ }
2662
+ function na(e, t = {}) {
2663
+ const r = t.newId ?? Se, o = [], a = [];
2664
+ for (const i of e)
2665
+ if (i.kind === "part.add") {
2666
+ let l = null;
2667
+ if (i.parent !== null) {
2668
+ const u = Ue(i.parent, t);
2669
+ if (!u.ok) {
2670
+ o.push(u.issue);
2671
+ continue;
2672
+ }
2673
+ l = u.partId;
2674
+ }
2675
+ const s = Dt(i.spec, r, o), c = { kind: "part.add", parentId: l, part: s };
2676
+ i.index != null && (c.index = i.index), a.push(c);
2677
+ } else if (i.kind === "part.update") {
2678
+ const l = Ue(i.target, t);
2679
+ if (!l.ok) {
2680
+ o.push(l.issue);
2681
+ continue;
2682
+ }
2683
+ const { attrs: s, layoutAttrs: c } = Nt(i.props, i.styles, o);
2684
+ a.push({ kind: "part.update", targetId: l.partId, attrs: s, layoutAttrs: c });
2685
+ } else {
2686
+ const l = Ue(i.target, t);
2687
+ if (!l.ok) {
2688
+ o.push(l.issue);
2689
+ continue;
2690
+ }
2691
+ a.push({ kind: "part.remove", targetId: l.partId });
2692
+ }
2693
+ return { ops: a, issues: o };
2694
+ }
2695
+ const Io = {
2696
+ "part.add": !0,
2697
+ "part.update": !0,
2698
+ "part.move": !0,
2699
+ "part.remove": !0
2700
+ }, oa = Object.keys(Io);
2701
+ function wt(e) {
2702
+ switch (e.kind) {
2703
+ case "part.add":
2704
+ case "part.remove":
2705
+ return e.parentRef ? [e.parentRef] : [];
2706
+ case "part.update":
2707
+ return e.partRef ? [e.partRef] : [];
2708
+ case "part.move": {
2709
+ const t = /* @__PURE__ */ new Set();
2710
+ return e.fromParentRef && t.add(e.fromParentRef), e.toParentRef && t.add(e.toParentRef), [...t];
2711
+ }
2712
+ }
2713
+ }
2714
+ class st {
2715
+ constructor(t) {
2716
+ G(this, "undoStack", []);
2717
+ G(this, "redoStack", []);
2718
+ G(this, "savePoint", null);
2719
+ G(this, "listeners", /* @__PURE__ */ new Set());
2720
+ G(this, "commandListeners", /* @__PURE__ */ new Set());
2721
+ // 다음 execute의 coalesce 병합을 1회 차단하는 봉인 플래그(트랙 B). op 어댑터가 idle flush로
2722
+ // coalesce 그룹을 영속에 내보낸 시점에 set → 그 이후의 동일 키 명령은 새 undo 단위로 시작시켜,
2723
+ // 스택의 undo 경계와 어댑터의 배치 경계를 항상 일치시킨다.
2724
+ G(this, "coalesceSealed", !1);
2725
+ this.state = t;
2726
+ }
2727
+ execute(t) {
2728
+ t.apply(this.state);
2729
+ const r = this.undoStack.at(-1), o = !this.coalesceSealed && t.coalesceKey != null && !!r && r.coalesceKey === t.coalesceKey;
2730
+ this.coalesceSealed = !1, o ? (t.invert = r.invert, this.undoStack[this.undoStack.length - 1] = t) : this.undoStack.push(t), this.redoStack = [], this.emitCommand(t, "do", o), this.emit();
2731
+ }
2732
+ undo() {
2733
+ const t = this.undoStack.pop();
2734
+ t && (t.invert(this.state), this.redoStack.push(t), this.emitCommand(t, "undo", !1), this.emit());
2735
+ }
2736
+ redo() {
2737
+ const t = this.redoStack.pop();
2738
+ t && (t.apply(this.state), this.undoStack.push(t), this.emitCommand(t, "redo", !1), this.emit());
2739
+ }
2740
+ /**
2741
+ * 다음 execute의 coalesce 병합을 1회 차단한다(op 어댑터의 idle flush·강제 flush 시 호출).
2742
+ * 어댑터가 coalesce 그룹을 영속에 내보낸 경계 이후의 동일 키 명령이 같은 undo 단위로 빨려
2743
+ * 들어가면 undo 시 로컬·서버 상태가 어긋나므로, 봉인으로 새 단위를 강제한다.
2744
+ */
2745
+ sealCoalesce() {
2746
+ this.coalesceSealed = !0;
2747
+ }
2748
+ get canUndo() {
2749
+ return this.undoStack.length > 0;
2750
+ }
2751
+ get canRedo() {
2752
+ return this.redoStack.length > 0;
2753
+ }
2754
+ /** 저장 시점 표시 — 이후 dirty 판정 기준. */
2755
+ markSavePoint() {
2756
+ this.savePoint = this.undoStack.at(-1) ?? null, this.emit();
2757
+ }
2758
+ /** 마지막 저장 이후 변경 여부 (undo로 저장 지점에 정확히 돌아오면 clean). */
2759
+ get isDirty() {
2760
+ return (this.undoStack.at(-1) ?? null) !== this.savePoint;
2761
+ }
2762
+ /** 변경 알림 구독 — 반환 함수로 해제. */
2763
+ onChange(t) {
2764
+ return this.listeners.add(t), () => this.listeners.delete(t);
2765
+ }
2766
+ /**
2767
+ * 명령 적용 알림 구독(트랙 B op emit). apply/invert 적용 *직후* 발화하므로 구독자가 emitOps()를
2768
+ * 호출하면 memento가 채워진 상태를 본다(계약 1). 반환 함수로 해제.
2769
+ */
2770
+ onCommand(t) {
2771
+ return this.commandListeners.add(t), () => this.commandListeners.delete(t);
2772
+ }
2773
+ emit() {
2774
+ for (const t of this.listeners) t();
2775
+ }
2776
+ emitCommand(t, r, o) {
2777
+ for (const a of this.commandListeners) a(t, r, o);
2778
+ }
2779
+ }
2780
+ function Te(e, t) {
2781
+ const r = K(e.root, t);
2782
+ if (!r) throw new Error(`파트 없음: ${t}`);
2783
+ return r;
2784
+ }
2785
+ function Ve(e, t) {
2786
+ var a;
2787
+ const r = We(e.root, t), o = ((a = r == null ? void 0 : r.children) == null ? void 0 : a.findIndex((i) => i.partId === t)) ?? -1;
2788
+ if (!r || o < 0) throw new Error(`파트를 찾을 수 없거나 root라 이동/삭제 불가: ${t}`);
2789
+ return { parent: r, index: o };
2790
+ }
2791
+ function Ft(e, t) {
2792
+ return e == null ? t : Math.max(0, Math.min(e, t));
2793
+ }
2794
+ function ko(e, t, r) {
2795
+ let o = -1;
2796
+ return {
2797
+ label: `파트 추가: ${t.partType}`,
2798
+ apply(a) {
2799
+ const i = Te(a, e), l = i.children ?? (i.children = []);
2800
+ o = Ft(r, l.length), l.splice(o, 0, t);
2801
+ },
2802
+ invert(a) {
2803
+ var s;
2804
+ const i = K(a.root, e), l = ((s = i == null ? void 0 : i.children) == null ? void 0 : s.findIndex((c) => c.partId === t.partId)) ?? -1;
2805
+ l >= 0 && i.children.splice(l, 1);
2806
+ },
2807
+ emitOps() {
2808
+ return {
2809
+ forward: [{ kind: "part.add", casUnit: "part", parentRef: e, index: o, value: t }],
2810
+ invert: [{ kind: "part.remove", casUnit: "part", partRef: t.partId, parentRef: e }]
2811
+ };
2812
+ }
2813
+ };
2814
+ }
2815
+ function Ao(e, t) {
2816
+ const r = Object.keys(t), o = {}, a = {};
2817
+ return {
2818
+ label: "파트 수정",
2819
+ apply(i) {
2820
+ const l = Te(i, e);
2821
+ for (const s of r)
2822
+ a[s] = s in l, o[s] = l[s];
2823
+ Object.assign(l, t);
2824
+ },
2825
+ invert(i) {
2826
+ const l = Te(i, e);
2827
+ for (const s of r)
2828
+ a[s] ? l[s] = o[s] : delete l[s];
2829
+ },
2830
+ emitOps() {
2831
+ return {
2832
+ forward: [{ kind: "part.update", casUnit: "part", partRef: e, patch: { ...t } }],
2833
+ invert: [{ kind: "part.update", casUnit: "part", partRef: e, patch: { ...o } }]
2834
+ };
2835
+ }
2836
+ };
2837
+ }
2838
+ function xo(e, t, r) {
2839
+ let o = null;
2840
+ return {
2841
+ label: "파트 이동",
2842
+ coalesceKey: `move:${e}`,
2843
+ apply(a) {
2844
+ const i = Ve(a, e), l = i.parent.children[i.index];
2845
+ i.parent.children.splice(i.index, 1);
2846
+ const s = Te(a, t), c = s.children ?? (s.children = []), u = Ft(r, c.length);
2847
+ c.splice(u, 0, l), o = { fromParentId: i.parent.partId, fromIndex: i.index, node: l, toIndex: u };
2848
+ },
2849
+ invert(a) {
2850
+ if (!o) return;
2851
+ const i = Ve(a, e);
2852
+ i.parent.children.splice(i.index, 1);
2853
+ const l = Te(a, o.fromParentId);
2854
+ (l.children ?? (l.children = [])).splice(o.fromIndex, 0, o.node);
2855
+ },
2856
+ emitOps() {
2857
+ return o ? {
2858
+ forward: [
2859
+ { kind: "part.move", casUnit: "part", partRef: e, fromParentRef: o.fromParentId, toParentRef: t, index: o.toIndex }
2860
+ ],
2861
+ invert: [
2862
+ { kind: "part.move", casUnit: "part", partRef: e, fromParentRef: t, toParentRef: o.fromParentId, index: o.fromIndex }
2863
+ ]
2864
+ } : { forward: [], invert: [] };
2865
+ }
2866
+ };
2867
+ }
2868
+ function Mo(e) {
2869
+ let t = null;
2870
+ return {
2871
+ label: "파트 삭제",
2872
+ apply(r) {
2873
+ const o = Ve(r, e);
2874
+ t = { parentId: o.parent.partId, index: o.index, node: o.parent.children[o.index] }, o.parent.children.splice(o.index, 1);
2875
+ },
2876
+ invert(r) {
2877
+ if (!t) return;
2878
+ const o = Te(r, t.parentId);
2879
+ (o.children ?? (o.children = [])).splice(t.index, 0, t.node);
2880
+ },
2881
+ emitOps() {
2882
+ return t ? {
2883
+ forward: [{ kind: "part.remove", casUnit: "part", partRef: e, parentRef: t.parentId }],
2884
+ invert: [{ kind: "part.add", casUnit: "part", parentRef: t.parentId, index: t.index, value: t.node }]
2885
+ } : { forward: [], invert: [] };
2886
+ }
2887
+ };
2888
+ }
2889
+ class _o {
2890
+ constructor() {
2891
+ G(this, "revs", /* @__PURE__ */ new Map());
2892
+ }
2893
+ /** v2 문서 적재/재적재 시 캐시 초기화(M10 fromPersisted v2 분기가 호출, M7 테스트는 손수 주입). */
2894
+ seed(t) {
2895
+ this.revs.clear();
2896
+ for (const [r, o] of Object.entries(t.revs ?? {})) this.revs.set(r, o);
2897
+ }
2898
+ rev(t) {
2899
+ return this.revs.get(t) ?? 0;
2900
+ }
2901
+ setRev(t, r) {
2902
+ this.revs.set(t, r);
2903
+ }
2904
+ deleteRev(t) {
2905
+ this.revs.delete(t);
2906
+ }
2907
+ /** 진단·테스트용 읽기 스냅샷(내부 Map 노출 안 함). */
2908
+ snapshot() {
2909
+ return { revs: Object.fromEntries(this.revs) };
2910
+ }
2911
+ }
2912
+ class Po {
2913
+ constructor(t) {
2914
+ G(this, "cache", new _o());
2915
+ G(this, "newClientOpId");
2916
+ G(this, "debounceMs");
2917
+ // do 시점 emission 캡처 — undo/redo가 재생(emitOps 재호출 금지). coalesce 병합 시 최신 cmd로 이관.
2918
+ G(this, "emissions", /* @__PURE__ */ new WeakMap());
2919
+ G(this, "open", null);
2920
+ G(this, "debounceHandle", null);
2921
+ G(this, "queue", []);
2922
+ G(this, "sending", !1);
2923
+ G(this, "_frozen", !1);
2924
+ G(this, "stack", null);
2925
+ G(this, "settledWaiters", []);
2926
+ this.opts = t, this.newClientOpId = t.newClientOpId ?? Se, this.debounceMs = t.debounceMs ?? 300;
2927
+ }
2928
+ /** RevCache 시드(M10 v2-read가 평면 파싱 후 호출, M7 테스트는 직접). */
2929
+ seed(t) {
2930
+ this.cache.seed(t);
2931
+ }
2932
+ /** stack에 구독 — onCommand 알림을 받고, flush 경계에서 sealCoalesce를 호출하기 위해 참조 보관. 해제 함수 반환. */
2933
+ attach(t) {
2934
+ this.stack = t;
2935
+ const r = t.onCommand((o, a, i) => this.handle(o, a, i));
2936
+ return () => {
2937
+ r(), this.stack === t && (this.stack = null);
2938
+ };
2939
+ }
2940
+ get frozen() {
2941
+ return this._frozen;
2942
+ }
2943
+ /** 미전송 pending 그룹 존재 여부(controller dirty 보조 신호). */
2944
+ get hasPending() {
2945
+ return this.open !== null || this.queue.length > 0 || this.sending;
2946
+ }
2947
+ /** 진단·테스트용 캐시 스냅샷. */
2948
+ cacheSnapshot() {
2949
+ return this.cache.snapshot();
2950
+ }
2951
+ /** 강제 flush(save·blur·beforeunload) — 열린 그룹을 즉시 영속에 내보내고 coalesce 경계 봉인. */
2952
+ flush() {
2953
+ this.flushOpen(!0);
2954
+ }
2955
+ /** 큐가 비고 전송 중이 아니며 열린 그룹도 없을 때 resolve — 테스트 동기화용. */
2956
+ whenSettled() {
2957
+ return this.hasPending ? new Promise((t) => this.settledWaiters.push(t)) : Promise.resolve();
2958
+ }
2959
+ // ── 핵심: 명령 적용 알림 처리 ──
2960
+ handle(t, r, o) {
2961
+ var l;
2962
+ if (this._frozen) return;
2963
+ let a;
2964
+ if (r === "do") {
2965
+ const s = (l = t.emitOps) == null ? void 0 : l.call(t, this.opts.state);
2966
+ if (!s) throw new Error(`op-mode에서 emitOps 미구현 command 실행: ${t.label}`);
2967
+ a = s;
2968
+ } else {
2969
+ const s = this.emissions.get(t);
2970
+ if (!s) throw new Error(`op-mode ${r} 대상 command의 emission 미기록: ${t.label}`);
2971
+ a = s;
2972
+ }
2973
+ const i = r === "undo" ? a.invert : a.forward;
2974
+ if (r === "do" && o && this.open && this.open.coalesceKey === t.coalesceKey) {
2975
+ this.open.fwd = i, this.emissions.set(t, { forward: i, invert: this.open.inv }), this.resetDebounce();
2976
+ return;
2977
+ }
2978
+ if (this.flushOpen(!1), r === "do" && (this.emissions.set(t, a), t.coalesceKey != null)) {
2979
+ this.open = { coalesceKey: t.coalesceKey, fwd: i, inv: a.invert }, this.startDebounce();
2980
+ return;
2981
+ }
2982
+ i.length && this.enqueue(this.buildBatch(i, a, r));
2983
+ }
2984
+ // ── flush / debounce ──
2985
+ flushOpen(t) {
2986
+ var o;
2987
+ this.cancelDebounce();
2988
+ const r = this.open;
2989
+ this.open = null, r && r.fwd.length && this.enqueue(this.buildBatch(r.fwd, { forward: r.fwd, invert: r.inv }, "do")), t && ((o = this.stack) == null || o.sealCoalesce());
2990
+ }
2991
+ startDebounce() {
2992
+ this.cancelDebounce(), this.debounceHandle = setTimeout(() => {
2993
+ this.debounceHandle = null, this.flushOpen(!0);
2994
+ }, this.debounceMs);
2995
+ }
2996
+ resetDebounce() {
2997
+ this.startDebounce();
2998
+ }
2999
+ cancelDebounce() {
3000
+ this.debounceHandle != null && (clearTimeout(this.debounceHandle), this.debounceHandle = null);
3001
+ }
3002
+ // ── base rev 합성 + 낙관 예측 → 영속 배치 ──
3003
+ buildBatch(t, r, o) {
3004
+ const a = {}, i = /* @__PURE__ */ new Set();
3005
+ for (const s of t) for (const c of wt(s)) i.add(c);
3006
+ if (i.size) {
3007
+ a.revs = {};
3008
+ for (const s of i) {
3009
+ const c = this.cache.rev(s);
3010
+ a.revs[s] = c, this.cache.setRev(s, c + 1);
3011
+ }
3012
+ }
3013
+ const l = o === "undo" ? r.forward : r.invert;
3014
+ for (const s of t)
3015
+ if (s.kind === "part.add" && s.value)
3016
+ Q(s.value, (c) => this.cache.setRev(c.partId, 0));
3017
+ else if (s.kind === "part.remove" && s.partRef) {
3018
+ const c = l.find((u) => {
3019
+ var d;
3020
+ return u.kind === "part.add" && ((d = u.value) == null ? void 0 : d.partId) === s.partRef;
3021
+ });
3022
+ c != null && c.value ? Q(c.value, (u) => this.cache.deleteRev(u.partId)) : this.cache.deleteRev(s.partRef);
3023
+ }
3024
+ return {
3025
+ modelId: this.opts.modelId,
3026
+ ops: t,
3027
+ cas: a,
3028
+ origin: this.opts.origin ?? "gui",
3029
+ clientOpId: this.newClientOpId()
3030
+ };
3031
+ }
3032
+ // ── 단일 직렬 큐 ──
3033
+ enqueue(t) {
3034
+ this.queue.push(t), this.pump();
3035
+ }
3036
+ async pump() {
3037
+ var o, a;
3038
+ if (this.sending || this._frozen) return;
3039
+ const t = this.queue.shift();
3040
+ if (!t) {
3041
+ this.notifySettled();
3042
+ return;
3043
+ }
3044
+ this.sending = !0;
3045
+ let r = null;
3046
+ try {
3047
+ r = await this.opts.transport(t);
3048
+ } catch (i) {
3049
+ this.sending = !1, console.error("[op-sync] op 전송 실패 → 하드 프리즈(kind:missing):", i), (a = (o = this.opts).onError) == null || a.call(o, i), this.freeze({ kind: "missing" });
3050
+ return;
3051
+ }
3052
+ this.sending = !1, r.ok ? (this.reconcile(r), this.pump()) : this.freeze(r.conflict);
3053
+ }
3054
+ /**
3055
+ * ok 응답 확정 — 낙관 체인 유지가 핵심. 후속 pending 배치가 이 예측 위에 base를 쌓았으므로
3056
+ * 큐가 완전히 빈 시점에만 서버 권위값으로 덮어쓴다(중간에 덮으면 후속 배치 base가 stale → 거짓 충돌).
3057
+ * ok ⟹ CAS 통과 ⟹ 서버 신 rev = 낙관 예측이므로, 미배수 시 캐시는 이미 정확(덮을 필요 없음).
3058
+ */
3059
+ reconcile(t) {
3060
+ if (!(this.queue.length > 0))
3061
+ for (const [r, o] of Object.entries(t.revs)) this.cache.setRev(r, o);
3062
+ }
3063
+ freeze(t) {
3064
+ var r, o;
3065
+ this._frozen = !0, this.queue.length = 0, this.open = null, this.cancelDebounce(), (o = (r = this.opts).onFreeze) == null || o.call(r, t), this.notifySettled();
3066
+ }
3067
+ notifySettled() {
3068
+ if (this.hasPending) return;
3069
+ const t = this.settledWaiters;
3070
+ this.settledWaiters = [];
3071
+ for (const r of t) r();
3072
+ }
3073
+ }
3074
+ function Bo(e) {
3075
+ switch (e.kind) {
3076
+ case "string":
3077
+ return e.value;
3078
+ case "int":
3079
+ return e.value;
3080
+ case "bool":
3081
+ return e.value;
3082
+ case "text":
3083
+ return e.value;
3084
+ // MultiLangText(string|map|{key}) — clean 표현, 레거시 `#{key}` 아님
3085
+ default:
3086
+ return;
3087
+ }
3088
+ }
3089
+ function Ro(e) {
3090
+ var a;
3091
+ const t = {}, r = e.attrs.addStyleNames;
3092
+ if ((r == null ? void 0 : r.kind) === "string" && r.value)
3093
+ for (const i of r.value.split(/\s+/).filter(Boolean)) {
3094
+ const l = In(i);
3095
+ l && (t[l.dim] = l.token);
3096
+ }
3097
+ const o = (a = e.layoutAttrs) == null ? void 0 : a.componentAlignment;
3098
+ if ((o == null ? void 0 : o.kind) === "string" && o.value) {
3099
+ const i = Cn("slotAlign", o.value);
3100
+ i && (t.slotAlign = i);
3101
+ }
3102
+ return t;
3103
+ }
3104
+ function Gt(e, t, r, o) {
3105
+ var c;
3106
+ const a = ((c = o.get(e.partType)) == null ? void 0 : c.attrs) ?? [], i = {};
3107
+ for (const u of a) {
3108
+ const d = e.attrs[u.id];
3109
+ if (d === void 0) continue;
3110
+ const h = Bo(d);
3111
+ h !== void 0 && (i[u.id] = h);
3112
+ }
3113
+ Object.assign(i, Ro(e));
3114
+ const l = {
3115
+ id: e.partId,
3116
+ partType: e.partType,
3117
+ path: Rt(t, e.partId) ?? "",
3118
+ attrs: i,
3119
+ children: (e.children ?? []).map((u) => Gt(u, t, r, o))
3120
+ }, s = ve(e, r);
3121
+ return s != null && (l.caption = s), l;
3122
+ }
3123
+ function ra(e, t) {
3124
+ const r = to(t);
3125
+ return Gt(e, e, t, r);
3126
+ }
3127
+ function No(e) {
3128
+ switch (e.kind) {
3129
+ case "part.add": {
3130
+ const t = { kind: "part.add", casUnit: "part", value: e.part };
3131
+ return e.parentId != null && (t.parentRef = e.parentId), e.index != null && (t.index = e.index), t;
3132
+ }
3133
+ case "part.update": {
3134
+ const t = {};
3135
+ return Object.keys(e.attrs).length > 0 && (t.attrs = e.attrs), Object.keys(e.layoutAttrs).length > 0 && (t.layoutAttrs = e.layoutAttrs), { kind: "part.update", casUnit: "part", partRef: e.targetId, patch: t };
3136
+ }
3137
+ case "part.remove":
3138
+ return { kind: "part.remove", casUnit: "part", partRef: e.targetId };
3139
+ }
3140
+ }
3141
+ function aa(e, t, r, o = {}) {
3142
+ const a = o.mkClientOpId ?? Se, i = r.map(No), l = /* @__PURE__ */ new Set();
3143
+ for (const c of i) for (const u of wt(c)) l.add(u);
3144
+ const s = {};
3145
+ if (l.size > 0) {
3146
+ s.revs = {};
3147
+ for (const c of l) s.revs[c] = t[c] ?? 0;
3148
+ }
3149
+ return {
3150
+ modelId: e,
3151
+ ops: i,
3152
+ cas: s,
3153
+ origin: o.origin ?? "agent",
3154
+ clientOpId: a()
3155
+ };
3156
+ }
3157
+ const Re = Symbol("uiEditorController");
3158
+ function Do(e = "FormLayout") {
3159
+ return { partId: Se(), partType: e, attrs: {}, children: [] };
3160
+ }
3161
+ function ia(e = Do(), t = {}) {
3162
+ var je, Ke;
3163
+ const r = t.catalog ?? zn(), o = t.modelId ?? "ui-model", a = Wt({ root: e });
3164
+ let i = new st(a);
3165
+ const l = Y(!1), s = Y(!1), c = Y(!1), u = Y(0), d = Y(((je = t.meta) == null ? void 0 : je.schemaVersion) ?? 1), h = Y(((Ke = t.meta) == null ? void 0 : Ke.opWriteEnabled) ?? !1), E = D(() => d.value >= 2 && h.value), m = Y(!(d.value >= 2 && h.value === !1)), S = Y(null), P = Y(null), H = D(
3166
+ () => P.value ? K(a.root, P.value) ?? null : null
3167
+ ), b = Y(null);
3168
+ let v = 0, N = t.meta;
3169
+ function C() {
3170
+ i.onChange(() => {
3171
+ l.value = i.canUndo, s.value = i.canRedo, c.value = i.isDirty, u.value++;
3172
+ });
3173
+ }
3174
+ C();
3175
+ let x = null, y = null;
3176
+ function B() {
3177
+ y == null || y(), y = null, x = null;
3178
+ }
3179
+ function re() {
3180
+ if (B(), !E.value || !t.opTransport) return;
3181
+ const M = new Po({
3182
+ modelId: o,
3183
+ state: a,
3184
+ transport: t.opTransport,
3185
+ origin: "gui",
3186
+ newClientOpId: t.newClientOpId,
3187
+ onFreeze: (R) => {
3188
+ m.value = !1, S.value = R;
3189
+ },
3190
+ onError: t.onOpError
3191
+ });
3192
+ M.seed((N == null ? void 0 : N.revSeed) ?? {}), y = M.attach(i), x = M;
3193
+ }
3194
+ re();
3195
+ const he = D(() => ln(a.root, r)), Oe = D(() => {
3196
+ const M = /* @__PURE__ */ new Map();
3197
+ for (const R of he.value) {
3198
+ if (!R.targetRef) continue;
3199
+ const j = M.get(R.targetRef);
3200
+ j ? j.push(R) : M.set(R.targetRef, [R]);
3201
+ }
3202
+ return M;
3203
+ }), pe = (M) => {
3204
+ m.value && i.execute(M);
3205
+ };
3206
+ function ze(M, R) {
3207
+ const j = K(a.root, M);
3208
+ return j ? r.canContain(j.partType, R) !== "deny" : !1;
3209
+ }
3210
+ return {
3211
+ state: a,
3212
+ catalog: r,
3213
+ issues: he,
3214
+ issuesByRef: Oe,
3215
+ canUndo: l,
3216
+ canRedo: s,
3217
+ dirty: c,
3218
+ revision: u,
3219
+ editable: m,
3220
+ setEditable(M) {
3221
+ m.value = M ? E.value || d.value < 2 : !1;
3222
+ },
3223
+ schemaVersion: d,
3224
+ opWriteEnabled: h,
3225
+ opMode: E,
3226
+ opConflict: S,
3227
+ selection: P,
3228
+ selectedPart: H,
3229
+ select(M) {
3230
+ P.value = M;
3231
+ },
3232
+ focusRequest: b,
3233
+ requestFocus(M) {
3234
+ b.value = { id: M, nonce: ++v };
3235
+ },
3236
+ addPart(M, R, j) {
3237
+ return !m.value || !ze(M, R.partType) ? !1 : (pe(ko(M, R, j)), P.value = R.partId, !0);
3238
+ },
3239
+ updatePart(M, R) {
3240
+ return !m.value || !K(a.root, M) ? !1 : (pe(Ao(M, R)), !0);
3241
+ },
3242
+ movePart(M, R, j) {
3243
+ if (!m.value) return !1;
3244
+ const Ne = K(a.root, M);
3245
+ return !Ne || K(Ne, R) || !ze(R, Ne.partType) ? !1 : (pe(xo(M, R, j)), !0);
3246
+ },
3247
+ removePart(M) {
3248
+ return !m.value || M === a.root.partId || !K(a.root, M) ? !1 : (pe(Mo(M)), P.value === M && (P.value = null), !0);
3249
+ },
3250
+ undo() {
3251
+ m.value && i.undo();
3252
+ },
3253
+ redo() {
3254
+ m.value && i.redo();
3255
+ },
3256
+ markSaved() {
3257
+ x == null || x.flush(), i.markSavePoint();
3258
+ },
3259
+ loadModel(M, R) {
3260
+ B(), a.root = M, i = new st(a), C(), d.value = (R == null ? void 0 : R.schemaVersion) ?? 1, h.value = (R == null ? void 0 : R.opWriteEnabled) ?? !1, m.value = !(d.value >= 2 && h.value === !1), N = R, S.value = null, P.value = null, l.value = i.canUndo, s.value = i.canRedo, c.value = i.isDirty, re();
3261
+ },
3262
+ flush() {
3263
+ x == null || x.flush();
3264
+ },
3265
+ whenOpsSettled() {
3266
+ return (x == null ? void 0 : x.whenSettled()) ?? Promise.resolve();
3267
+ }
3268
+ };
3269
+ }
3270
+ const wo = { class: "ui-schematic-head" }, Fo = { class: "ui-schematic-type" }, Go = {
3271
+ key: 0,
3272
+ class: "ui-schematic-caption"
3273
+ }, Xo = {
3274
+ key: 0,
3275
+ class: "ui-schematic-body"
3276
+ }, Uo = {
3277
+ key: 0,
3278
+ class: "ui-schematic-drop-hint"
3279
+ }, $o = /* @__PURE__ */ ne({
3280
+ __name: "SchematicPart",
3281
+ props: {
3282
+ partType: {},
3283
+ category: {},
3284
+ caption: {},
3285
+ partName: {},
3286
+ selected: { type: Boolean },
3287
+ container: { type: Boolean },
3288
+ empty: { type: Boolean }
3289
+ },
3290
+ setup(e) {
3291
+ return (t, r) => (L(), I("div", {
3292
+ class: be(["ui-schematic-part", [`ui-cat-${e.category ?? "unknown"}`, { "is-selected": e.selected, "is-container": e.container }]])
3293
+ }, [
3294
+ U("div", wo, [
3295
+ U("span", Fo, X(e.partName ?? e.partType), 1),
3296
+ e.caption ? (L(), I("span", Go, X(e.caption), 1)) : ue("", !0)
3297
+ ]),
3298
+ e.container ? (L(), I("div", Xo, [
3299
+ zt(t.$slots, "default", {}, void 0, !0),
3300
+ e.empty ? (L(), I("span", Uo, "여기에 드롭")) : ue("", !0)
3301
+ ])) : ue("", !0)
3302
+ ], 2));
3303
+ }
3304
+ }), oe = (e, t) => {
3305
+ const r = e.__vccOpts || e;
3306
+ for (const [o, a] of t)
3307
+ r[o] = a;
3308
+ return r;
3309
+ }, Xt = /* @__PURE__ */ oe($o, [["__scopeId", "data-v-46916ee5"]]);
3310
+ function Ut(e, t) {
3311
+ const r = t.get(e.partType), o = { partType: e.partType };
3312
+ (r == null ? void 0 : r.category) != null && (o.category = r.category), (r == null ? void 0 : r.partName) != null && (o.partName = r.partName);
3313
+ const a = ve(e, t);
3314
+ return a != null && (o.caption = a), o;
3315
+ }
3316
+ function Ho(e) {
3317
+ var r;
3318
+ const t = /* @__PURE__ */ new Map();
3319
+ for (const o of e.all()) {
3320
+ const a = (r = o.containment) == null ? void 0 : r.role;
3321
+ t.set(o.partType, {
3322
+ component: Xt,
3323
+ propBind: (i) => Ut(i, e),
3324
+ acceptsChildren: a !== "leaf"
3325
+ });
3326
+ }
3327
+ return t;
3328
+ }
3329
+ function Yo(e, t, r) {
3330
+ const o = e.get(t.partType);
3331
+ return o || {
3332
+ component: Xt,
3333
+ propBind: (a) => Ut(a, r),
3334
+ acceptsChildren: !0
3335
+ };
3336
+ }
3337
+ const Vo = {
3338
+ CONTAIN: "담김",
3339
+ ARITY: "개수",
3340
+ DUP: "중복",
3341
+ ATTR: "속성",
3342
+ PART: "파트"
3343
+ };
3344
+ function la(e) {
3345
+ const t = e.split("-")[1];
3346
+ return t ? Vo[t] ?? t : e;
3347
+ }
3348
+ function sa(e) {
3349
+ return e.contextRef;
3350
+ }
3351
+ function Wo(e, t) {
3352
+ return t.container ? t.hasParent ? e < 0.3 ? "before" : e > 0.7 ? "after" : "into" : "into" : e < 0.5 ? "before" : "after";
3353
+ }
3354
+ function zo(e, t, r, o) {
3355
+ const a = We(e, t);
3356
+ if ((a == null ? void 0 : a.partId) === r && a.children) {
3357
+ const i = a.children.findIndex((l) => l.partId === t);
3358
+ if (i >= 0 && i < o) return o - 1;
3359
+ }
3360
+ return o;
3361
+ }
3362
+ const jo = ["draggable"], Ko = /* @__PURE__ */ ne({
3363
+ __name: "PartCanvas",
3364
+ props: {
3365
+ node: {},
3366
+ registry: {},
3367
+ parentId: {},
3368
+ index: {}
3369
+ },
3370
+ setup(e) {
3371
+ const t = e, r = Be(Re);
3372
+ if (!r) throw new Error("PartCanvas: EDITOR 컨트롤러가 provide되지 않았습니다");
3373
+ const o = r, a = D(() => t.registry ?? Ho(o.catalog)), i = D(() => t.node ?? o.state.root), l = D(() => Yo(a.value, i.value, o.catalog)), s = D(() => l.value.propBind(i.value)), c = D(() => l.value.acceptsChildren !== !1), u = D(() => o.selection.value === i.value.partId), d = D(() => c.value && !(i.value.children && i.value.children.length)), h = D(() => t.parentId != null), E = Y(null);
3374
+ function m(C) {
3375
+ const y = C.currentTarget.getBoundingClientRect(), B = y.height ? (C.clientY - y.top) / y.height : 0.5;
3376
+ return Wo(B, { container: c.value, hasParent: t.parentId != null });
3377
+ }
3378
+ function S(C) {
3379
+ C.preventDefault(), C.stopPropagation(), E.value = m(C);
3380
+ }
3381
+ function P() {
3382
+ E.value = null;
3383
+ }
3384
+ function H(C) {
3385
+ var x;
3386
+ C.stopPropagation(), (x = C.dataTransfer) == null || x.setData("partId", i.value.partId), C.dataTransfer && (C.dataTransfer.effectAllowed = "move");
3387
+ }
3388
+ function b(C) {
3389
+ C.stopPropagation(), o.select(i.value.partId);
3390
+ }
3391
+ function v(C) {
3392
+ if (C === "into") return { parentId: i.value.partId };
3393
+ if (t.parentId == null) return null;
3394
+ const x = C === "after" ? (t.index ?? 0) + 1 : t.index ?? 0;
3395
+ return { parentId: t.parentId, index: x };
3396
+ }
3397
+ function N(C) {
3398
+ var he, Oe;
3399
+ C.preventDefault(), C.stopPropagation();
3400
+ const x = E.value ?? m(C);
3401
+ E.value = null;
3402
+ const y = v(x);
3403
+ if (!y) return;
3404
+ const B = (he = C.dataTransfer) == null ? void 0 : he.getData("partId"), re = (Oe = C.dataTransfer) == null ? void 0 : Oe.getData("partType");
3405
+ if (B) {
3406
+ const pe = y.index == null ? void 0 : zo(o.state.root, B, y.parentId, y.index);
3407
+ o.movePart(B, y.parentId, pe);
3408
+ } else re && o.addPart(y.parentId, { partId: Se(), partType: re, attrs: {}, children: [] }, y.index);
3409
+ }
3410
+ return (C, x) => {
3411
+ const y = ct("PartCanvas", !0);
3412
+ return L(), I("div", {
3413
+ class: be(["ui-canvas-node", {
3414
+ "is-drop-into": E.value === "into",
3415
+ "is-drop-before": E.value === "before",
3416
+ "is-drop-after": E.value === "after"
3417
+ }]),
3418
+ draggable: h.value,
3419
+ onClick: b,
3420
+ onDragstart: H,
3421
+ onDragover: S,
3422
+ onDragleave: P,
3423
+ onDrop: N
3424
+ }, [
3425
+ (L(), Me(jt(l.value.component), Kt(s.value, {
3426
+ selected: u.value,
3427
+ container: c.value,
3428
+ empty: d.value
3429
+ }), {
3430
+ default: qt(() => [
3431
+ c.value ? (L(!0), I(z, { key: 0 }, Z(i.value.children ?? [], (B, re) => (L(), Me(y, {
3432
+ key: B.partId,
3433
+ node: B,
3434
+ registry: a.value,
3435
+ "parent-id": i.value.partId,
3436
+ index: re
3437
+ }, null, 8, ["node", "registry", "parent-id", "index"]))), 128)) : ue("", !0)
3438
+ ]),
3439
+ _: 1
3440
+ }, 16, ["selected", "container", "empty"]))
3441
+ ], 42, jo);
3442
+ };
3443
+ }
3444
+ }), ca = /* @__PURE__ */ oe(Ko, [["__scopeId", "data-v-d9963ad2"]]), qo = { class: "ui-palette" }, Jo = { class: "ui-palette__title" }, Zo = { class: "ui-palette__list" }, Qo = ["title", "onDragstart"], er = /* @__PURE__ */ ne({
3445
+ __name: "PartPalette",
3446
+ setup(e) {
3447
+ const t = Be(Re);
3448
+ if (!t) throw new Error("PartPalette: EDITOR 컨트롤러가 provide되지 않았습니다");
3449
+ const r = t, o = D(() => {
3450
+ const i = /* @__PURE__ */ new Map();
3451
+ for (const l of r.catalog.all()) {
3452
+ const s = l.category ?? "기타", c = i.get(s);
3453
+ c ? c.push(l) : i.set(s, [l]);
3454
+ }
3455
+ return [...i.entries()];
3456
+ });
3457
+ function a(i, l) {
3458
+ var s;
3459
+ (s = i.dataTransfer) == null || s.setData("partType", l.partType), i.dataTransfer && (i.dataTransfer.effectAllowed = "copy");
3460
+ }
3461
+ return (i, l) => (L(), I("div", qo, [
3462
+ (L(!0), I(z, null, Z(o.value, ([s, c]) => (L(), I("section", {
3463
+ key: s,
3464
+ class: "ui-palette__group"
3465
+ }, [
3466
+ U("h4", Jo, X(s), 1),
3467
+ U("ul", Zo, [
3468
+ (L(!0), I(z, null, Z(c, (u) => (L(), I("li", {
3469
+ key: u.partType,
3470
+ class: "ui-palette__item",
3471
+ draggable: "true",
3472
+ title: u.partType,
3473
+ onDragstart: (d) => a(d, u)
3474
+ }, X(u.partName), 41, Qo))), 128))
3475
+ ])
3476
+ ]))), 128))
3477
+ ]));
3478
+ }
3479
+ }), ua = /* @__PURE__ */ oe(er, [["__scopeId", "data-v-ba70ed30"]]), tr = ["title"], nr = {
3480
+ key: 1,
3481
+ class: "ui-mlang"
3482
+ }, or = {
3483
+ class: "ui-mlang__tabs",
3484
+ role: "tablist"
3485
+ }, rr = ["aria-selected", "onClick"], ar = {
3486
+ key: 0,
3487
+ class: "ui-mlang__dot"
3488
+ }, ir = ["name", "placeholder", "value"], lr = ["name", "placeholder", "value"], sr = /* @__PURE__ */ ne({
3489
+ __name: "MultiLangTextField",
3490
+ props: {
3491
+ modelValue: {},
3492
+ name: {},
3493
+ languages: { default: () => ["ko", "en", "ja", "zh"] },
3494
+ defaultLang: {},
3495
+ multiline: { type: Boolean, default: !1 },
3496
+ placeholder: {}
3497
+ },
3498
+ emits: ["update:modelValue"],
3499
+ setup(e, { emit: t }) {
3500
+ const r = e, o = t, a = D(() => qe(r.modelValue)), i = D(
3501
+ () => qe(r.modelValue) ? r.modelValue.key : ""
3502
+ );
3503
+ function l() {
3504
+ const E = r.defaultLang;
3505
+ return E && r.languages.includes(E) ? E : r.languages[0] ?? "ko";
3506
+ }
3507
+ const s = Y(l());
3508
+ ut(
3509
+ () => [r.languages, r.defaultLang],
3510
+ () => {
3511
+ r.languages.includes(s.value) || (s.value = l());
3512
+ }
3513
+ );
3514
+ const c = D(() => {
3515
+ const E = r.modelValue;
3516
+ return E == null || a.value ? {} : typeof E == "string" ? E.trim() ? { [s.value]: E } : {} : E;
3517
+ });
3518
+ function u(E) {
3519
+ var m;
3520
+ return !!((m = c.value[E]) != null && m.trim());
3521
+ }
3522
+ const d = D(() => c.value[s.value] ?? "");
3523
+ function h(E) {
3524
+ const m = { ...c.value };
3525
+ E.trim() === "" ? delete m[s.value] : m[s.value] = E, o("update:modelValue", m);
3526
+ }
3527
+ return (E, m) => a.value ? (L(), I("code", {
3528
+ key: 0,
3529
+ class: "ui-mlang__key",
3530
+ title: `메시지 키: ${i.value}`
3531
+ }, "#" + X("{") + X(i.value) + X("}"), 9, tr)) : (L(), I("div", nr, [
3532
+ U("div", or, [
3533
+ (L(!0), I(z, null, Z(e.languages, (S) => (L(), I("button", {
3534
+ key: S,
3535
+ type: "button",
3536
+ class: be(["ui-mlang__tab", { "is-active": s.value === S }]),
3537
+ role: "tab",
3538
+ "aria-selected": s.value === S,
3539
+ onClick: (P) => s.value = S
3540
+ }, [
3541
+ Jt(X(S), 1),
3542
+ u(S) ? (L(), I("span", ar, "•")) : ue("", !0)
3543
+ ], 10, rr))), 128))
3544
+ ]),
3545
+ e.multiline ? (L(), I("textarea", {
3546
+ key: 0,
3547
+ name: `${e.name}-${s.value}`,
3548
+ class: "ui-mlang__input",
3549
+ rows: "3",
3550
+ placeholder: e.placeholder,
3551
+ value: d.value,
3552
+ onInput: m[0] || (m[0] = (S) => h(S.target.value))
3553
+ }, null, 40, ir)) : (L(), I("input", {
3554
+ key: 1,
3555
+ name: `${e.name}-${s.value}`,
3556
+ class: "ui-mlang__input",
3557
+ type: "text",
3558
+ placeholder: e.placeholder,
3559
+ value: d.value,
3560
+ onInput: m[1] || (m[1] = (S) => h(S.target.value))
3561
+ }, null, 40, lr))
3562
+ ]));
3563
+ }
3564
+ }), cr = /* @__PURE__ */ oe(sr, [["__scopeId", "data-v-fa16ddef"]]), ur = {
3565
+ class: "ui-inline-issue__mark",
3566
+ "aria-hidden": "true"
3567
+ }, dr = { class: "ui-inline-issue__msgs" }, pr = /* @__PURE__ */ ne({
3568
+ __name: "InlineIssueBadge",
3569
+ props: {
3570
+ controller: {},
3571
+ refId: {}
3572
+ },
3573
+ setup(e) {
3574
+ const t = e, r = {
3575
+ error: { order: 0, mark: "⛔" },
3576
+ warning: { order: 1, mark: "⚠" },
3577
+ info: { order: 2, mark: "ℹ" }
3578
+ }, o = D(
3579
+ () => t.refId ? t.controller.issuesByRef.value.get(t.refId) ?? [] : []
3580
+ ), a = D(() => {
3581
+ let i = null;
3582
+ for (const l of o.value)
3583
+ (i === null || r[l.severity].order < r[i].order) && (i = l.severity);
3584
+ return i;
3585
+ });
3586
+ return (i, l) => a.value ? (L(), I("p", {
3587
+ key: 0,
3588
+ class: be(["ui-inline-issue", `is-${a.value}`])
3589
+ }, [
3590
+ U("span", ur, X(r[a.value].mark), 1),
3591
+ U("span", dr, [
3592
+ (L(!0), I(z, null, Z(o.value, (s, c) => (L(), I("span", { key: c }, X(s.message), 1))), 128))
3593
+ ])
3594
+ ], 2)) : ue("", !0);
3595
+ }
3596
+ }), $t = /* @__PURE__ */ oe(pr, [["__scopeId", "data-v-a0454177"]]), fr = { class: "ui-props" }, gr = {
3597
+ key: 0,
3598
+ class: "ui-props__empty"
3599
+ }, Tr = { class: "ui-props__head" }, hr = { class: "ui-props__type" }, Er = { class: "ui-props__id" }, mr = ["disabled"], yr = { class: "ui-props__group-title" }, br = ["title"], Sr = { class: "ui-props__field" }, vr = ["checked", "onChange"], Lr = ["value", "onChange"], Or = ["value", "onChange"], Cr = ["value"], Ir = ["value", "onChange"], kr = {
3600
+ key: 5,
3601
+ class: "ui-props__readonly"
3602
+ }, Ar = ["value", "onChange"], xr = /* @__PURE__ */ ne({
3603
+ __name: "PropertyPanel",
3604
+ setup(e) {
3605
+ const t = Be(Re);
3606
+ if (!t) throw new Error("PropertyPanel: EDITOR 컨트롤러가 provide되지 않았습니다");
3607
+ const r = t, o = D(() => r.selectedPart.value), a = D(() => o.value ? r.catalog.get(o.value.partType) : void 0), i = /* @__PURE__ */ new Set(["SELECT", "ALIGN", "ADD_STYLE", "SIZE", "ICON"]), l = /* @__PURE__ */ new Set(["TEXTAREA", "FULL_TEXTAREA", "MESSAGE_TEXTAREA"]), s = /* @__PURE__ */ new Set([
3608
+ "COMPONENT_REF",
3609
+ "DATASOURCE",
3610
+ "DATAMAPPING",
3611
+ "COMMENT",
3612
+ "CASE_MESSAGES",
3613
+ "BUTTON",
3614
+ "SIMPLE_BUTTON",
3615
+ "WINDOW_OPEN_BUTTON",
3616
+ "TEXT_RO_WITH_BUTTON"
3617
+ ]);
3618
+ function c(b) {
3619
+ return s.has(b.editor) ? "readonly" : b.valueType === "bool" ? "bool" : b.valueType === "int" ? "int" : b.valueType === "text" ? "text" : b.valueType === "validator" || b.valueType === "dataSource" || b.valueType === "dataMapping" ? "readonly" : i.has(b.editor) ? "select" : l.has(b.editor) ? "textarea" : "string";
3620
+ }
3621
+ function u(b) {
3622
+ var N;
3623
+ const v = o.value;
3624
+ if (v)
3625
+ return b.layoutAttr ? (N = v.layoutAttrs) == null ? void 0 : N[b.id] : v.attrs[b.id];
3626
+ }
3627
+ function d(b, v) {
3628
+ const N = o.value;
3629
+ if (N)
3630
+ if (b.layoutAttr) {
3631
+ const C = { ...N.layoutAttrs ?? {} };
3632
+ v === void 0 ? delete C[b.id] : C[b.id] = v, r.updatePart(N.partId, { layoutAttrs: C });
3633
+ } else {
3634
+ const C = { ...N.attrs };
3635
+ v === void 0 ? delete C[b.id] : C[b.id] = v, r.updatePart(N.partId, { attrs: C });
3636
+ }
3637
+ }
3638
+ function h(b, v) {
3639
+ d(b, v === "" ? void 0 : te(v));
3640
+ }
3641
+ function E(b, v) {
3642
+ d(b, v === "" ? void 0 : Tt(Number(v)));
3643
+ }
3644
+ function m(b, v) {
3645
+ d(b, w(v));
3646
+ }
3647
+ function S(b, v) {
3648
+ const N = typeof v == "object" && !("key" in v) && Object.keys(v).length === 0;
3649
+ d(b, N || v === "" ? void 0 : ht(v));
3650
+ }
3651
+ function P(b) {
3652
+ var C;
3653
+ const v = (b.param ?? "").split(";").map((x) => x.trim()).filter(Boolean).map((x) => {
3654
+ const y = x.indexOf(":");
3655
+ return y < 0 ? { value: x, label: x } : { value: x.slice(0, y), label: x.slice(y + 1) };
3656
+ }), N = (C = b.agent) == null ? void 0 : C.enum;
3657
+ return N ? v.filter((x) => N.includes(x.value)) : v;
3658
+ }
3659
+ function H(b) {
3660
+ const v = u(b);
3661
+ if (!v) return "—";
3662
+ switch (v.kind) {
3663
+ case "string":
3664
+ case "dataSource":
3665
+ case "dataMapping":
3666
+ return v.value;
3667
+ case "int":
3668
+ return String(v.value);
3669
+ case "bool":
3670
+ return v.value ? "true" : "false";
3671
+ default:
3672
+ return `(${v.kind})`;
3673
+ }
3674
+ }
3675
+ return (b, v) => {
3676
+ var N, C;
3677
+ return L(), I("div", fr, [
3678
+ o.value ? (L(), I(z, { key: 1 }, [
3679
+ U("header", Tr, [
3680
+ U("span", hr, X(((N = a.value) == null ? void 0 : N.partName) ?? o.value.partType), 1),
3681
+ U("code", Er, X(o.value.partId), 1)
3682
+ ]),
3683
+ dt($t, {
3684
+ controller: W(r),
3685
+ "ref-id": o.value.partId
3686
+ }, null, 8, ["controller", "ref-id"]),
3687
+ U("fieldset", {
3688
+ class: "ui-props__form",
3689
+ disabled: !W(r).editable.value
3690
+ }, [
3691
+ (L(!0), I(z, null, Z(((C = a.value) == null ? void 0 : C.groups) ?? [], (x) => (L(), I("section", {
3692
+ key: x.name,
3693
+ class: "ui-props__group"
3694
+ }, [
3695
+ U("h4", yr, X(x.name), 1),
3696
+ (L(!0), I(z, null, Z(x.items, (y) => (L(), I("div", {
3697
+ key: y.id,
3698
+ class: "ui-props__row"
3699
+ }, [
3700
+ U("label", {
3701
+ class: "ui-props__label",
3702
+ title: y.id
3703
+ }, X(y.name), 9, br),
3704
+ U("div", Sr, [
3705
+ c(y) === "bool" ? (L(), I("input", {
3706
+ key: 0,
3707
+ type: "checkbox",
3708
+ checked: W(on)(u(y)),
3709
+ onChange: (B) => m(y, B.target.checked)
3710
+ }, null, 40, vr)) : c(y) === "int" ? (L(), I("input", {
3711
+ key: 1,
3712
+ type: "number",
3713
+ class: "ui-props__input",
3714
+ value: u(y) ? W(nn)(u(y)) : "",
3715
+ onChange: (B) => E(y, B.target.value)
3716
+ }, null, 40, Lr)) : c(y) === "text" ? (L(), Me(cr, {
3717
+ key: 2,
3718
+ name: y.id,
3719
+ "model-value": W(rn)(u(y)),
3720
+ multiline: y.editor === "MESSAGE_TEXTAREA",
3721
+ "onUpdate:modelValue": (B) => S(y, B)
3722
+ }, null, 8, ["name", "model-value", "multiline", "onUpdate:modelValue"])) : c(y) === "select" ? (L(), I("select", {
3723
+ key: 3,
3724
+ class: "ui-props__input",
3725
+ value: W(De)(u(y)),
3726
+ onChange: (B) => h(y, B.target.value)
3727
+ }, [
3728
+ v[0] || (v[0] = U("option", { value: "" }, "—", -1)),
3729
+ (L(!0), I(z, null, Z(P(y), (B) => (L(), I("option", {
3730
+ key: B.value,
3731
+ value: B.value
3732
+ }, X(B.label), 9, Cr))), 128))
3733
+ ], 40, Or)) : c(y) === "textarea" ? (L(), I("textarea", {
3734
+ key: 4,
3735
+ class: "ui-props__input",
3736
+ rows: "3",
3737
+ value: W(De)(u(y)),
3738
+ onChange: (B) => h(y, B.target.value)
3739
+ }, null, 40, Ir)) : c(y) === "readonly" ? (L(), I("span", kr, X(H(y)), 1)) : (L(), I("input", {
3740
+ key: 6,
3741
+ type: "text",
3742
+ class: "ui-props__input",
3743
+ value: W(De)(u(y)),
3744
+ onChange: (B) => h(y, B.target.value)
3745
+ }, null, 40, Ar))
3746
+ ])
3747
+ ]))), 128))
3748
+ ]))), 128))
3749
+ ], 8, mr)
3750
+ ], 64)) : (L(), I("p", gr, "선택된 파트가 없습니다"))
3751
+ ]);
3752
+ };
3753
+ }
3754
+ }), da = /* @__PURE__ */ oe(xr, [["__scopeId", "data-v-74030a51"]]), Mr = { class: "ui-tree-node" }, _r = { class: "ui-tree-type" }, Pr = {
3755
+ key: 0,
3756
+ class: "ui-tree-caption"
3757
+ }, Br = /* @__PURE__ */ ne({
3758
+ __name: "PartTree",
3759
+ props: {
3760
+ node: {},
3761
+ depth: {}
3762
+ },
3763
+ setup(e) {
3764
+ const t = e, r = Be(Re);
3765
+ if (!r) throw new Error("PartTree: EDITOR 컨트롤러가 provide되지 않았습니다");
3766
+ const o = r, a = D(() => t.node ?? o.state.root), i = D(() => t.depth ?? 0), l = D(() => ve(a.value, o.catalog)), s = D(() => o.selection.value === a.value.partId);
3767
+ return (c, u) => {
3768
+ const d = ct("PartTree", !0);
3769
+ return L(), I("div", Mr, [
3770
+ U("button", {
3771
+ type: "button",
3772
+ class: be(["ui-tree-row", { "is-selected": s.value }]),
3773
+ style: pt({ paddingLeft: `${i.value * 14 + 6}px` }),
3774
+ onClick: u[0] || (u[0] = (h) => W(o).select(a.value.partId))
3775
+ }, [
3776
+ U("span", _r, X(a.value.partType), 1),
3777
+ l.value ? (L(), I("span", Pr, X(l.value), 1)) : ue("", !0)
3778
+ ], 6),
3779
+ dt($t, {
3780
+ controller: W(o),
3781
+ "ref-id": a.value.partId
3782
+ }, null, 8, ["controller", "ref-id"]),
3783
+ (L(!0), I(z, null, Z(a.value.children ?? [], (h) => (L(), Me(d, {
3784
+ key: h.partId,
3785
+ node: h,
3786
+ depth: i.value + 1
3787
+ }, null, 8, ["node", "depth"]))), 128))
3788
+ ]);
3789
+ };
3790
+ }
3791
+ }), pa = /* @__PURE__ */ oe(Br, [["__scopeId", "data-v-cfddebcf"]]), Le = "ui-modeler-preview";
3792
+ function Rr(e, t) {
3793
+ return { channel: Le, type: "render", model: e, revision: t };
3794
+ }
3795
+ function fa() {
3796
+ return { channel: Le, type: "ready" };
3797
+ }
3798
+ function ga(e) {
3799
+ return { channel: Le, type: "resize", height: e };
3800
+ }
3801
+ function Ta(e) {
3802
+ return { channel: Le, type: "error", message: e };
3803
+ }
3804
+ function Ht(e) {
3805
+ return typeof e == "object" && e !== null && e.channel === Le && typeof e.type == "string";
3806
+ }
3807
+ const Nr = /* @__PURE__ */ new Set(["ready", "resize", "error"]), Dr = /* @__PURE__ */ new Set(["render"]);
3808
+ function wr(e) {
3809
+ return Ht(e) && Nr.has(e.type);
3810
+ }
3811
+ function ha(e) {
3812
+ return Ht(e) && Dr.has(e.type);
3813
+ }
3814
+ const Fr = ["src"], Gr = /* @__PURE__ */ ne({
3815
+ __name: "IframePreview",
3816
+ props: {
3817
+ model: {},
3818
+ revision: { default: 0 },
3819
+ src: {},
3820
+ targetOrigin: { default: "/" }
3821
+ },
3822
+ emits: ["error", "ready"],
3823
+ setup(e, { emit: t }) {
3824
+ const r = e, o = t, a = Y(null), i = Y(0);
3825
+ let l = !1;
3826
+ function s() {
3827
+ var d;
3828
+ const u = (d = a.value) == null ? void 0 : d.contentWindow;
3829
+ if (!(!u || !l))
3830
+ try {
3831
+ const h = JSON.parse(JSON.stringify(r.model));
3832
+ u.postMessage(Rr(h, r.revision), r.targetOrigin);
3833
+ } catch (h) {
3834
+ o("error", h instanceof Error ? h.message : String(h));
3835
+ }
3836
+ }
3837
+ function c(u) {
3838
+ var d;
3839
+ if (u.source === ((d = a.value) == null ? void 0 : d.contentWindow) && wr(u.data))
3840
+ switch (u.data.type) {
3841
+ case "ready":
3842
+ l = !0, s(), o("ready");
3843
+ break;
3844
+ case "resize":
3845
+ i.value = u.data.height;
3846
+ break;
3847
+ case "error":
3848
+ o("error", u.data.message);
3849
+ break;
3850
+ }
3851
+ }
3852
+ return Zt(() => window.addEventListener("message", c)), Qt(() => window.removeEventListener("message", c)), ut(
3853
+ () => [r.model, r.revision],
3854
+ () => s(),
3855
+ { deep: !1 }
3856
+ ), (u, d) => (L(), I("iframe", {
3857
+ ref_key: "frame",
3858
+ ref: a,
3859
+ class: "ui-iframe-preview",
3860
+ src: e.src,
3861
+ style: pt(i.value ? { height: i.value + "px" } : void 0),
3862
+ title: "실 미리보기"
3863
+ }, null, 12, Fr));
3864
+ }
3865
+ }), Ea = /* @__PURE__ */ oe(Gr, [["__scopeId", "data-v-72e13e1b"]]);
3866
+ export {
3867
+ vn as AGENT_EXPOSE_DEFAULT,
3868
+ ea as APPLY_UI_OPS_INPUT_SCHEMA,
3869
+ Yn as BUILTIN_PART_DEFS,
3870
+ Wr as CASE_MSG_CAPTION,
3871
+ st as CommandStack,
3872
+ Re as EDITOR,
3873
+ Ea as IframePreview,
3874
+ $t as InlineIssueBadge,
3875
+ Bt as MAX_INLINE_DEPTH,
3876
+ cr as MultiLangTextField,
3877
+ oa as OP_KINDS,
3878
+ Po as OpSyncAdapter,
3879
+ gt as PART_CATEGORY,
3880
+ en as PART_TYPES,
3881
+ ft as PART_TYPES_BY_CATEGORY,
3882
+ Le as PREVIEW_CHANNEL,
3883
+ Zr as PROPERTY_EDITORS,
3884
+ ca as PartCanvas,
3885
+ ua as PartPalette,
3886
+ pa as PartTree,
3887
+ da as PropertyPanel,
3888
+ _o as RevCache,
3889
+ ye as STYLE_TOKENS,
3890
+ bt as STYLE_TOKEN_DIM_META,
3891
+ no as SYMBOLIC_OP_KINDS,
3892
+ go as SYMBOLIC_OP_SCHEMA,
3893
+ Xt as SchematicPart,
3894
+ an as accept,
3895
+ ko as addPart,
3896
+ Jr as applyOpsToFlat,
3897
+ on as asBool,
3898
+ nn as asInt,
3899
+ De as asString,
3900
+ rn as asText,
3901
+ Vr as asValidator,
3902
+ Ze as attrMapFrom,
3903
+ fn as attrValFrom,
3904
+ w as bool,
3905
+ aa as buildAgentBatch,
3906
+ ve as captionText,
3907
+ yo as checkStrictSubset,
3908
+ In as classifyStyleClass,
3909
+ zr as collect,
3910
+ zn as createCatalog,
3911
+ Ho as createSchematicRegistry,
3912
+ ia as createUiEditorController,
3913
+ Cn as cssToToken,
3914
+ Hr as dataMapping,
3915
+ $r as dataSource,
3916
+ sn as decodeKeyText,
3917
+ _e as decodeToMultiLang,
3918
+ ra as describeScreen,
3919
+ gn as emptyCoverageReport,
3920
+ Do as emptyRoot,
3921
+ Ta as errorMessage,
3922
+ Qr as extendCatalog,
3923
+ K as findPartById,
3924
+ yt as flattenSubtree,
3925
+ En as fromPersisted,
3926
+ Kr as fromPersistedV2,
3927
+ Tt as int,
3928
+ qe as isMultiLangMessage,
3929
+ $e as isPartType,
3930
+ wr as isPreviewInbound,
3931
+ ha as isPreviewOutbound,
3932
+ ta as isStrictSubset,
3933
+ la as issueCategoryLabel,
3934
+ sa as issueParentRef,
3935
+ qr as migrateV1ToV2,
3936
+ xo as movePart,
3937
+ Se as newPartId,
3938
+ We as parentOf,
3939
+ dn as parseGridSort,
3940
+ jr as parseGridSortList,
3941
+ un as parseValidatorString,
3942
+ Rt as pathOf,
3943
+ Et as pathTo,
3944
+ fa as readyMessage,
3945
+ Mo as removePart,
3946
+ Rr as renderMessage,
3947
+ ga as resizeMessage,
3948
+ Ue as resolveHandle,
3949
+ na as resolveOps,
3950
+ Yo as resolveRenderer,
3951
+ wt as revContainersOf,
3952
+ Ut as schematicProps,
3953
+ te as str,
3954
+ ht as text,
3955
+ to as toAgentCatalog,
3956
+ No as toOpShape,
3957
+ yn as toPersistedV2,
3958
+ On as tokenToCss,
3959
+ St as tokensOf,
3960
+ cn as uiKeyTextToMultiLang,
3961
+ Ao as updatePart,
3962
+ ln as validatePartModel,
3963
+ Yr as validator,
3964
+ Q as walk
3965
+ };