@wipco/sdui 0.3.0 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/meta.js CHANGED
@@ -24,6 +24,7 @@ var ForEachMeta = {
24
24
  }
25
25
  ],
26
26
  children: { accepts: true, text: true, label: "\uD589 \uD558\uB098\uC758 \uB0B4\uC6A9" },
27
+ dom: { element: "fragment" },
27
28
  preset: {
28
29
  component: "ForEach",
29
30
  props: { source: [{ id: "1", name: "\uD56D\uBAA9 A" }] },
@@ -86,6 +87,7 @@ var ActionsMeta = {
86
87
  classNameProp
87
88
  ],
88
89
  children: { accepts: true, text: false, label: "\uC815\uB82C\uD560 \uBC84\uD2BC\uB4E4" },
90
+ dom: { element: "div" },
89
91
  preset: {
90
92
  component: "Actions",
91
93
  props: { justify: "end" },
@@ -142,6 +144,7 @@ var CardMeta = {
142
144
  { name: "footer", label: "\uD478\uD130", description: "\uC6B0\uCE21 \uC815\uB82C \uC561\uC158 \uD589" }
143
145
  ],
144
146
  children: { accepts: true, text: true, label: "\uCE74\uB4DC \uBCF8\uBB38" },
147
+ dom: { element: "div" },
145
148
  preset: {
146
149
  component: "Card",
147
150
  props: { title: "\uCE74\uB4DC \uC81C\uBAA9" },
@@ -157,6 +160,7 @@ var ColMeta = {
157
160
  description: "\uC790\uC2DD\uC744 \uC138\uB85C\uB85C \uC313\uB294\uB2E4(.wp-col).",
158
161
  props: [styleProp, classNameProp],
159
162
  children: { accepts: true, text: true },
163
+ dom: { element: "div" },
160
164
  preset: {
161
165
  component: "Col",
162
166
  children: [{ component: "Text", props: { preset: "body" }, children: ["\uCCAB \uC904"] }]
@@ -171,6 +175,7 @@ var DividerMeta = {
171
175
  description: "\uAC00\uB85C \uAD6C\uBD84\uC120(hr).",
172
176
  props: [styleProp],
173
177
  children: { accepts: false },
178
+ dom: { element: "hr" },
174
179
  preset: { component: "Divider" },
175
180
  resize: { kind: "none" }
176
181
  };
@@ -205,6 +210,7 @@ var GridMeta = {
205
210
  classNameProp
206
211
  ],
207
212
  children: { accepts: true, text: false, label: "\uADF8\uB9AC\uB4DC \uCE78" },
213
+ dom: { element: "div" },
208
214
  preset: {
209
215
  component: "Grid",
210
216
  props: { columns: 2 },
@@ -230,6 +236,7 @@ var PageHeadMeta = {
230
236
  ],
231
237
  // PageHeadProps에는 children이 없다 — 넣어도 렌더되지 않는다.
232
238
  children: { accepts: false },
239
+ dom: { element: "div", slotElement: { title: "h1" } },
233
240
  preset: { component: "PageHead", props: { title: "\uD398\uC774\uC9C0 \uC81C\uBAA9" } },
234
241
  resize: { kind: "none" }
235
242
  };
@@ -257,6 +264,7 @@ var RowMeta = {
257
264
  classNameProp
258
265
  ],
259
266
  children: { accepts: true, text: true },
267
+ dom: { element: "div" },
260
268
  preset: {
261
269
  component: "Row",
262
270
  props: { justify: "between" },
@@ -279,6 +287,7 @@ var SectionMeta = {
279
287
  classNameProp
280
288
  ],
281
289
  children: { accepts: true, text: true },
290
+ dom: { element: "section", slotElement: { title: "h2" } },
282
291
  preset: {
283
292
  component: "Section",
284
293
  props: { title: "\uC139\uC158 \uC81C\uBAA9" },
@@ -311,6 +320,7 @@ var SpacerMeta = {
311
320
  }
312
321
  ],
313
322
  children: { accepts: false },
323
+ dom: { element: "div" },
314
324
  preset: { component: "Spacer" },
315
325
  resize: { kind: "none" }
316
326
  };
@@ -375,6 +385,7 @@ var TabsMeta = {
375
385
  ],
376
386
  // items 프롭으로 탭을 그린다 — 자식을 넣어도 렌더되지 않는다.
377
387
  children: { accepts: false },
388
+ dom: { element: "div" },
378
389
  preset: {
379
390
  component: "Tabs",
380
391
  props: {
@@ -470,6 +481,7 @@ var ButtonMeta = {
470
481
  classNameProp
471
482
  ],
472
483
  children: { accepts: true, text: true, label: "\uBC84\uD2BC \uB77C\uBCA8" },
484
+ dom: { element: "button", elementProp: "as" },
473
485
  preset: {
474
486
  component: "Button",
475
487
  props: { variant: "secondary", size: "sm" },
@@ -507,6 +519,7 @@ var CheckboxMeta = {
507
519
  classNameProp
508
520
  ],
509
521
  children: { accepts: false },
522
+ dom: { element: "label", slotElement: { label: "span", description: "span" } },
510
523
  preset: {
511
524
  component: "Checkbox",
512
525
  props: {
@@ -545,6 +558,7 @@ var DatePickerMeta = {
545
558
  }
546
559
  ],
547
560
  children: { accepts: false },
561
+ dom: { element: "div" },
548
562
  preset: {
549
563
  component: "DatePicker",
550
564
  props: {
@@ -580,6 +594,7 @@ var DateRangePickerMeta = {
580
594
  { name: "disabled", kind: "boolean", label: "\uBE44\uD65C\uC131", default: false, bindable: true, group: "behavior" }
581
595
  ],
582
596
  children: { accepts: false },
597
+ dom: { element: "div" },
583
598
  preset: {
584
599
  component: "DateRangePicker",
585
600
  props: {
@@ -624,6 +639,7 @@ var FieldMeta = {
624
639
  classNameProp
625
640
  ],
626
641
  children: { accepts: true, text: false, label: "\uC785\uB825 \uCEE8\uD2B8\uB864" },
642
+ dom: { element: "div", slotElement: { label: "label", hint: "span", error: "span" } },
627
643
  preset: {
628
644
  component: "Field",
629
645
  props: { label: "\uB77C\uBCA8" },
@@ -694,6 +710,7 @@ var FormMeta = {
694
710
  classNameProp
695
711
  ],
696
712
  children: { accepts: true, text: false, label: "\uD3FC \uB0B4\uC6A9" },
713
+ dom: { element: "form" },
697
714
  preset: {
698
715
  component: "Form",
699
716
  props: {
@@ -791,6 +808,7 @@ var IconButtonMeta = {
791
808
  classNameProp
792
809
  ],
793
810
  children: { accepts: false },
811
+ dom: { element: "button" },
794
812
  preset: { component: "IconButton", props: { icon: "pencil", label: "\uC218\uC815", size: "sm" } },
795
813
  resize: { kind: "enum", prop: "size", values: ["xs", "sm", "md", "lg"] }
796
814
  };
@@ -862,6 +880,7 @@ var InputMeta = {
862
880
  classNameProp
863
881
  ],
864
882
  children: { accepts: false },
883
+ dom: { element: "input" },
865
884
  preset: {
866
885
  component: "Input",
867
886
  props: {
@@ -914,6 +933,7 @@ var SelectMeta = {
914
933
  classNameProp
915
934
  ],
916
935
  children: { accepts: false },
936
+ dom: { element: "div" },
917
937
  preset: {
918
938
  component: "Select",
919
939
  props: {
@@ -952,6 +972,7 @@ var SwitchMeta = {
952
972
  classNameProp
953
973
  ],
954
974
  children: { accepts: false },
975
+ dom: { element: "label", slotElement: { label: "span" } },
955
976
  preset: {
956
977
  component: "Switch",
957
978
  props: {
@@ -979,6 +1000,7 @@ var TextareaMeta = {
979
1000
  classNameProp
980
1001
  ],
981
1002
  children: { accepts: false },
1003
+ dom: { element: "textarea" },
982
1004
  preset: {
983
1005
  component: "Textarea",
984
1006
  props: {
@@ -1028,6 +1050,7 @@ var BadgeMeta = {
1028
1050
  classNameProp
1029
1051
  ],
1030
1052
  children: { accepts: true, text: true, label: "\uBC30\uC9C0 \uBB38\uAD6C" },
1053
+ dom: { element: "span" },
1031
1054
  preset: { component: "Badge", props: { tone: "success" }, children: ["\uC815\uC0C1"] },
1032
1055
  resize: { kind: "enum", prop: "size", values: ["md", "lg"] }
1033
1056
  };
@@ -1052,6 +1075,7 @@ var IconMeta = {
1052
1075
  classNameProp
1053
1076
  ],
1054
1077
  children: { accepts: false },
1078
+ dom: { element: "svg" },
1055
1079
  preset: { component: "Icon", props: { name: "info", size: 18 } },
1056
1080
  resize: { kind: "numeric", widthProp: "size", heightProp: "size", unit: "px", axis: "both" }
1057
1081
  };
@@ -1087,6 +1111,7 @@ var KeyValueListMeta = {
1087
1111
  classNameProp
1088
1112
  ],
1089
1113
  children: { accepts: false },
1114
+ dom: { element: "div" },
1090
1115
  preset: {
1091
1116
  component: "KeyValueList",
1092
1117
  props: {
@@ -1139,6 +1164,7 @@ var StatCardMeta = {
1139
1164
  classNameProp
1140
1165
  ],
1141
1166
  children: { accepts: false },
1167
+ dom: { element: "div" },
1142
1168
  preset: {
1143
1169
  component: "StatCard",
1144
1170
  props: { label: "\uCD1D \uC790\uC0B0", value: 128, unit: "\uB300", icon: "box", trend: "up", delta: "+4" }
@@ -1158,6 +1184,7 @@ var TagMeta = {
1158
1184
  classNameProp
1159
1185
  ],
1160
1186
  children: { accepts: true, text: true, label: "\uD0DC\uADF8 \uBB38\uAD6C" },
1187
+ dom: { element: "span" },
1161
1188
  preset: { component: "Tag", children: ["\uD0DC\uADF8"] },
1162
1189
  resize: { kind: "none" }
1163
1190
  };
@@ -1227,6 +1254,7 @@ var TextMeta = {
1227
1254
  classNameProp
1228
1255
  ],
1229
1256
  children: { accepts: true, text: true, label: "\uD14D\uC2A4\uD2B8" },
1257
+ dom: { element: "p", elementProp: "as" },
1230
1258
  preset: { component: "Text", props: { preset: "body" }, children: ["\uD14D\uC2A4\uD2B8"] },
1231
1259
  resize: { kind: "style", axis: "x" }
1232
1260
  };
@@ -1245,6 +1273,7 @@ var PaginationMeta = {
1245
1273
  classNameProp
1246
1274
  ],
1247
1275
  children: { accepts: false },
1276
+ dom: { element: "div" },
1248
1277
  preset: {
1249
1278
  component: "Pagination",
1250
1279
  props: {
@@ -1329,6 +1358,7 @@ var TableMeta = {
1329
1358
  ],
1330
1359
  // 컬럼·행이 전부 프롭이다 — 자식을 넣어도 렌더되지 않는다.
1331
1360
  children: { accepts: false },
1361
+ dom: { element: "table", slotElement: { empty: "fragment" } },
1332
1362
  preset: {
1333
1363
  component: "Table",
1334
1364
  props: {
@@ -1648,6 +1678,7 @@ var SearchResultsMeta = {
1648
1678
  ],
1649
1679
  slots: searchSlots,
1650
1680
  children: { accepts: false },
1681
+ dom: { element: "div" },
1651
1682
  preset: {
1652
1683
  component: "SearchResults",
1653
1684
  props: {
@@ -1683,6 +1714,7 @@ var RemoteSearchResultsMeta = {
1683
1714
  ],
1684
1715
  slots: searchSlots,
1685
1716
  children: { accepts: false },
1717
+ dom: { element: "div" },
1686
1718
  preset: {
1687
1719
  component: "RemoteSearchResults",
1688
1720
  props: {
@@ -1738,6 +1770,7 @@ var AlertMeta = {
1738
1770
  { name: "actions", label: "\uD558\uB2E8 \uC561\uC158", allow: ["Actions", "Button", "Row", "Show", "Can"] }
1739
1771
  ],
1740
1772
  children: { accepts: true, text: true, label: "\uBCF8\uBB38" },
1773
+ dom: { element: "div", childElement: "span", slotElement: { actions: "div" } },
1741
1774
  preset: {
1742
1775
  component: "Alert",
1743
1776
  props: { tone: "info", title: "\uC548\uB0B4" },
@@ -1787,6 +1820,7 @@ var DialogMeta = {
1787
1820
  { name: "footer", label: "\uD478\uD130 \uC561\uC158", description: "\uBCF4\uC870 \uBC84\uD2BC \uB2E4\uC74C \uC8FC \uBC84\uD2BC", allow: ["Actions", "Button", "Row", "Show", "Can"] }
1788
1821
  ],
1789
1822
  children: { accepts: true, text: true, label: "\uB2E4\uC774\uC5BC\uB85C\uADF8 \uBCF8\uBB38" },
1823
+ dom: { element: "div" },
1790
1824
  preset: {
1791
1825
  component: "Dialog",
1792
1826
  props: { title: "\uC81C\uBAA9", size: "md", onClose: { action: "close", key: "dialog1" } },
@@ -1818,6 +1852,7 @@ var EmptyStateMeta = {
1818
1852
  ],
1819
1853
  slots: [{ name: "actions", label: "\uC561\uC158", allow: ["Actions", "Button", "Row", "Show", "Can"] }],
1820
1854
  children: { accepts: true, text: true, label: "\uC124\uBA85 \uBB38\uAD6C" },
1855
+ dom: { element: "div" },
1821
1856
  preset: {
1822
1857
  component: "EmptyState",
1823
1858
  props: { icon: "square-dashed", title: "\uACB0\uACFC\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4", tight: true },
@@ -1882,6 +1917,7 @@ var ProgressBarMeta = {
1882
1917
  classNameProp
1883
1918
  ],
1884
1919
  children: { accepts: false },
1920
+ dom: { element: "div", slotElement: { label: "span" } },
1885
1921
  preset: { component: "ProgressBar", props: { value: 60, tone: "brand", label: "\uC9C4\uD589\uB960" } },
1886
1922
  resize: { kind: "style", axis: "x" }
1887
1923
  };
@@ -1916,6 +1952,7 @@ var SpinnerMeta = {
1916
1952
  classNameProp
1917
1953
  ],
1918
1954
  children: { accepts: false },
1955
+ dom: { element: "span" },
1919
1956
  preset: { component: "Spinner", props: { size: "md", label: "\uBD88\uB7EC\uC624\uB294 \uC911" } },
1920
1957
  resize: { kind: "enum", prop: "size", values: ["sm", "md", "lg"] }
1921
1958
  };
@@ -1948,6 +1985,7 @@ var ToastMeta = {
1948
1985
  classNameProp
1949
1986
  ],
1950
1987
  children: { accepts: true, text: true, label: "\uBCF8\uBB38" },
1988
+ dom: { element: "div", childElement: "span", slotElement: { action: "div" } },
1951
1989
  preset: { component: "Toast", props: { tone: "info", title: "\uC54C\uB9BC" }, children: ["\uB0B4\uC6A9"] },
1952
1990
  resize: { kind: "none" }
1953
1991
  };
@@ -1977,6 +2015,7 @@ var CanMeta = {
1977
2015
  ],
1978
2016
  slots: [{ name: "fallback", label: "\uCC28\uB2E8 \uC2DC \uB300\uCCB4 \uB0B4\uC6A9", description: "\uC0DD\uB7B5\uD558\uBA74 \uC544\uBB34\uAC83\uB3C4 \uADF8\uB9AC\uC9C0 \uC54A\uB294\uB2E4." }],
1979
2017
  children: { accepts: true, text: true, label: "\uAD8C\uD55C\uC774 \uC788\uC744 \uB54C \uBCF4\uC77C \uB0B4\uC6A9" },
2018
+ dom: { element: "fragment" },
1980
2019
  preset: {
1981
2020
  component: "Can",
1982
2021
  props: { entity: "asset", action: "create" },
@@ -2005,6 +2044,7 @@ var ShowMeta = {
2005
2044
  // 다이얼로그를 여닫는 것이 주 용도지만, 프리셋을 `when: false` + Dialog로 두면
2006
2045
  // 팔레트에서 끌어다 놓는 순간 화면에 아무것도 나타나지 않는다("드롭했는데 사라졌다").
2007
2046
  // 드롭 직후 보이는 쪽을 택하고, 다이얼로그 조합은 description에 적어 뒀다.
2047
+ dom: { element: "fragment" },
2008
2048
  preset: {
2009
2049
  component: "Show",
2010
2050
  props: { when: { $state: "show1", default: true } },
@@ -2054,6 +2094,350 @@ var coreComponentMeta = {
2054
2094
  Toast: ToastMeta
2055
2095
  };
2056
2096
 
2097
+ // src/meta/ds.ts
2098
+ var styleProp2 = {
2099
+ name: "style",
2100
+ kind: "object",
2101
+ label: "\uC778\uB77C\uC778 \uC2A4\uD0C0\uC77C",
2102
+ description: "CSS \uC18D\uC131 \uAC1D\uCCB4. \uD3ED \uC81C\uD55C \uAC19\uC740 \uBBF8\uC138 \uC870\uC815\uC6A9\uC774\uACE0, \uBC30\uCE58\uB294 Row/Col/Grid\uB85C \uD478\uB294 \uD3B8\uC774 \uB0AB\uB2E4.",
2103
+ group: "layout",
2104
+ advanced: true
2105
+ };
2106
+ var classNameProp2 = {
2107
+ name: "className",
2108
+ kind: "string",
2109
+ label: "\uCD94\uAC00 \uD074\uB798\uC2A4",
2110
+ description: "styles.css\uC758 wp-* \uC720\uD2F8 \uD074\uB798\uC2A4\uB97C \uB367\uBD99\uC778\uB2E4.",
2111
+ group: "layout",
2112
+ advanced: true
2113
+ };
2114
+ var RadioMeta = {
2115
+ name: "Radio",
2116
+ label: "\uB77C\uB514\uC624",
2117
+ category: "input",
2118
+ icon: "circle-dot",
2119
+ description: "\uD6C4\uBCF4\uAC00 \uC804\uBD80 \uBCF4\uC774\uB294 \uBC30\uD0C0 \uC120\uD0DD. \uAC19\uC740 name\uC744 \uC900 \uAC83\uB07C\uB9AC \uD55C \uBB36\uC74C\uC774 \uB41C\uB2E4. 5\uAC1C\uB97C \uB118\uC73C\uBA74 Select\uAC00 \uB0AB\uB2E4.",
2120
+ props: [
2121
+ { name: "label", kind: "node", label: "\uB77C\uBCA8", slot: true, group: "content" },
2122
+ { name: "description", kind: "node", label: "\uC124\uBA85", slot: true, description: "\uB77C\uBCA8 \uC544\uB798 \uC605\uC740 \uBCF4\uC870 \uBB38\uAD6C.", group: "content" },
2123
+ {
2124
+ name: "name",
2125
+ kind: "string",
2126
+ label: "\uADF8\uB8F9 \uC774\uB984",
2127
+ description: "\uAC19\uC740 \uAC12\uC744 \uAC00\uC9C4 \uB77C\uB514\uC624\uB07C\uB9AC \uD558\uB098\uB9CC \uC120\uD0DD\uB41C\uB2E4. \uBB36\uC73C\uB824\uBA74 \uBC18\uB4DC\uC2DC \uC918\uC57C \uD55C\uB2E4.",
2128
+ group: "data"
2129
+ },
2130
+ { name: "value", kind: "string", label: "\uAC12", description: "\uC774 \uD56D\uBAA9\uC744 \uACE8\uB790\uC744 \uB54C\uC758 \uAC12.", group: "data" },
2131
+ { name: "checked", kind: "boolean", label: "\uC120\uD0DD\uB428", bindable: true, group: "data" },
2132
+ { name: "onChange", kind: "action", label: "\uBCC0\uACBD", eventArg: "\uC120\uD0DD \uC5EC\uBD80(boolean)", group: "behavior" },
2133
+ { name: "disabled", kind: "boolean", label: "\uBE44\uD65C\uC131", default: false, bindable: true, group: "behavior" },
2134
+ styleProp2,
2135
+ classNameProp2
2136
+ ],
2137
+ children: { accepts: false },
2138
+ dom: { element: "label", slotElement: { label: "span", description: "span" } },
2139
+ preset: {
2140
+ component: "Radio",
2141
+ props: {
2142
+ label: "\uC120\uD0DD\uC9C0",
2143
+ name: "radioGroup",
2144
+ value: "a",
2145
+ checked: { $calc: { op: "eq", args: [{ $state: "radioGroup", default: "a" }, "a"] } },
2146
+ onChange: { action: "setState", key: "radioGroup", value: "a" }
2147
+ }
2148
+ },
2149
+ resize: { kind: "none" }
2150
+ };
2151
+ var SegmentedControlMeta = {
2152
+ name: "SegmentedControl",
2153
+ label: "\uBD84\uD560 \uC120\uD0DD",
2154
+ category: "input",
2155
+ icon: "blocks",
2156
+ description: "\uBAA9\uB85D/\uCE74\uB4DC, \uC77C/\uC8FC/\uC6D4\uCC98\uB7FC \uD6C4\uBCF4 \uB450\uC14B \uC911 \uD558\uB098\uB97C \uACE0\uB974\uB294 \uC804\uD658 \uCEE8\uD2B8\uB864.",
2157
+ props: [
2158
+ {
2159
+ name: "items",
2160
+ kind: "array",
2161
+ label: "\uD56D\uBAA9",
2162
+ required: true,
2163
+ group: "data",
2164
+ item: [
2165
+ { name: "value", kind: "string", label: "\uAC12", required: true },
2166
+ { name: "label", kind: "string", label: "\uD45C\uC2DC", required: true },
2167
+ { name: "icon", kind: "icon", label: "\uC544\uC774\uCF58", description: "\uB77C\uBCA8 \uC55E\uC5D0 \uBD99\uB294\uB2E4." }
2168
+ ]
2169
+ },
2170
+ {
2171
+ name: "value",
2172
+ kind: "string",
2173
+ label: "\uC120\uD0DD\uB41C \uAC12",
2174
+ required: true,
2175
+ bindable: true,
2176
+ description: '\uBCF4\uD1B5 { "$state": "view", "default": "list" }\uB97C \uAC74\uB2E4.',
2177
+ group: "data"
2178
+ },
2179
+ { name: "onChange", kind: "action", label: "\uBCC0\uACBD", eventArg: "\uC120\uD0DD\uB41C \uD56D\uBAA9\uC758 value", group: "behavior" },
2180
+ {
2181
+ name: "size",
2182
+ kind: "enum",
2183
+ label: "\uD06C\uAE30",
2184
+ default: "md",
2185
+ options: [
2186
+ { value: "md", label: "md 24px" },
2187
+ { value: "lg", label: "lg 30px" }
2188
+ ],
2189
+ group: "appearance"
2190
+ },
2191
+ styleProp2,
2192
+ classNameProp2
2193
+ ],
2194
+ children: { accepts: false },
2195
+ dom: { element: "div" },
2196
+ preset: {
2197
+ component: "SegmentedControl",
2198
+ props: {
2199
+ items: [
2200
+ { value: "list", label: "\uBAA9\uB85D" },
2201
+ { value: "card", label: "\uCE74\uB4DC" }
2202
+ ],
2203
+ value: { $state: "view", default: "list" },
2204
+ onChange: { action: "setState", key: "view", fromEvent: true }
2205
+ }
2206
+ },
2207
+ resize: { kind: "enum", prop: "size", values: ["md", "lg"] }
2208
+ };
2209
+ var AvatarMeta = {
2210
+ name: "Avatar",
2211
+ label: "\uC544\uBC14\uD0C0",
2212
+ category: "display",
2213
+ icon: "circle-user",
2214
+ description: "\uC0AC\uB78C\xB7\uD300\xB7\uC790\uC0B0\uC758 \uC2E0\uC6D0 \uD45C\uC2DD. \uC774\uBBF8\uC9C0\uAC00 \uC5C6\uC73C\uBA74 \uC774\uB984 \uC55E \uB450 \uAE00\uC790\uB97C \uB300\uBB38\uC790\uB85C \uC4F4\uB2E4.",
2215
+ props: [
2216
+ {
2217
+ name: "name",
2218
+ kind: "string",
2219
+ label: "\uC774\uB984",
2220
+ bindable: true,
2221
+ description: "\uC774\uB2C8\uC15C\uACFC \uD234\uD301(title)\uC5D0 \uC4F0\uC778\uB2E4.",
2222
+ group: "content"
2223
+ },
2224
+ {
2225
+ name: "src",
2226
+ kind: "string",
2227
+ label: "\uC774\uBBF8\uC9C0 \uC8FC\uC18C",
2228
+ bindable: true,
2229
+ description: "\uC8FC\uBA74 \uC774\uB2C8\uC15C \uB300\uC2E0 \uC774\uBBF8\uC9C0\uB97C \uADF8\uB9B0\uB2E4.",
2230
+ group: "content"
2231
+ },
2232
+ {
2233
+ name: "shape",
2234
+ kind: "enum",
2235
+ label: "\uBAA8\uC591",
2236
+ default: "hex",
2237
+ options: [
2238
+ { value: "hex", label: "\uC721\uAC01\uD615", description: "\uC2EC\uBCFC\uC758 \uC2E4\uB8E8\uC5E3 \u2014 \uAE30\uBCF8\uAC12\uC774\uB2E4." },
2239
+ { value: "round", label: "\uC6D0\uD615", description: "\uC0AC\uB78C" },
2240
+ { value: "square", label: "\uC0AC\uAC01\uD615", description: "\uC790\uC0B0" }
2241
+ ],
2242
+ group: "appearance"
2243
+ },
2244
+ {
2245
+ name: "size",
2246
+ kind: "enum",
2247
+ label: "\uD06C\uAE30",
2248
+ default: "md",
2249
+ options: [
2250
+ { value: "xs", label: "xs 20px" },
2251
+ { value: "sm", label: "sm 24px" },
2252
+ { value: "md", label: "md 28px" },
2253
+ { value: "lg", label: "lg 36px" },
2254
+ { value: "xl", label: "xl 48px" }
2255
+ ],
2256
+ group: "appearance"
2257
+ },
2258
+ {
2259
+ name: "tone",
2260
+ kind: "enum",
2261
+ label: "\uD1A4",
2262
+ default: "brand",
2263
+ options: [
2264
+ { value: "brand", label: "\uBE0C\uB79C\uB4DC \uB124\uC774\uBE44" },
2265
+ { value: "muted", label: "\uD68C\uC0C9" },
2266
+ { value: "accent", label: "\uAC15\uC870 \uB808\uB4DC" }
2267
+ ],
2268
+ group: "appearance"
2269
+ },
2270
+ styleProp2,
2271
+ classNameProp2
2272
+ ],
2273
+ children: { accepts: false },
2274
+ dom: { element: "span" },
2275
+ preset: {
2276
+ component: "Avatar",
2277
+ props: { name: "\uD64D\uAE38\uB3D9", size: "md" }
2278
+ },
2279
+ resize: { kind: "enum", prop: "size", values: ["xs", "sm", "md", "lg", "xl"] }
2280
+ };
2281
+ var BreadcrumbMeta = {
2282
+ name: "Breadcrumb",
2283
+ label: "\uACBD\uB85C",
2284
+ category: "display",
2285
+ icon: "chevron-right",
2286
+ description: "\uD504\uB85C\uC81D\uD2B8\uC5D0\uC11C \uC9C0\uAE08 \uBCF4\uB294 \uAC1D\uCCB4\uAE4C\uC9C0\uC758 \uC704\uCE58. \uB9C8\uC9C0\uB9C9 \uD56D\uBAA9\uC740 \uD604\uC7AC \uC704\uCE58\uB77C \uB9C1\uD06C\uAC00 \uC544\uB2C8\uB2E4.",
2287
+ props: [
2288
+ {
2289
+ name: "items",
2290
+ kind: "array",
2291
+ label: "\uD56D\uBAA9",
2292
+ required: true,
2293
+ bindable: true,
2294
+ group: "data",
2295
+ item: [
2296
+ { name: "label", kind: "node", label: "\uD45C\uC2DC", required: true },
2297
+ { name: "href", kind: "string", label: "\uC8FC\uC18C", description: "\uC5C6\uC73C\uBA74 \uD074\uB9AD\uD574\uB3C4 \uC774\uB3D9\uD558\uC9C0 \uC54A\uB294\uB2E4(onClick\uB9CC \uBC1C\uC0DD)." },
2298
+ { name: "icon", kind: "icon", label: "\uC544\uC774\uCF58" },
2299
+ { name: "onClick", kind: "action", label: "\uD074\uB9AD" }
2300
+ ]
2301
+ },
2302
+ styleProp2,
2303
+ classNameProp2
2304
+ ],
2305
+ children: { accepts: false },
2306
+ dom: { element: "nav" },
2307
+ preset: {
2308
+ component: "Breadcrumb",
2309
+ props: {
2310
+ items: [{ label: "\uD648", href: "/" }, { label: "\uBAA9\uB85D", href: "/list" }, { label: "\uC0C1\uC138" }]
2311
+ }
2312
+ },
2313
+ resize: { kind: "none" }
2314
+ };
2315
+ var TooltipMeta = {
2316
+ name: "Tooltip",
2317
+ label: "\uD234\uD301",
2318
+ category: "display",
2319
+ icon: "message-square",
2320
+ description: "\uC544\uC774\uCF58 \uC804\uC6A9 \uCEE8\uD2B8\uB864\uC774\uB098 \uC798\uB9B0 \uAC12\uC5D0 \uBD99\uC774\uB294 hover/focus \uD78C\uD2B8. \uD2B8\uB9AC\uAC70\uB97C \uAC10\uC2F8\uB294 \uBC29\uC2DD\uC774\uACE0 \uD3EC\uD138\uC744 \uC4F0\uC9C0 \uC54A\uB294\uB2E4.",
2321
+ props: [
2322
+ { name: "label", kind: "node", label: "\uBB38\uAD6C", required: true, slot: true, bindable: true, group: "content" },
2323
+ { name: "shortcut", kind: "string", label: "\uB2E8\uCD95\uD0A4", description: '\uBB38\uAD6C \uC624\uB978\uCABD\uC5D0 \uCE69\uC73C\uB85C \uBD99\uB294\uB2E4. \uC608: "\u2318K"', group: "content" },
2324
+ {
2325
+ name: "placement",
2326
+ kind: "enum",
2327
+ label: "\uC704\uCE58",
2328
+ default: "top",
2329
+ options: [
2330
+ { value: "top", label: "\uC704" },
2331
+ { value: "bottom", label: "\uC544\uB798" },
2332
+ { value: "left", label: "\uC67C\uCABD" },
2333
+ { value: "right", label: "\uC624\uB978\uCABD" }
2334
+ ],
2335
+ group: "appearance"
2336
+ },
2337
+ {
2338
+ name: "wrap",
2339
+ kind: "boolean",
2340
+ label: "\uC5EC\uB7EC \uC904 \uD5C8\uC6A9",
2341
+ default: false,
2342
+ description: "\uCF1C\uBA74 \uCD5C\uB300 240px \uD3ED\uC5D0\uC11C \uC904\uBC14\uAFC8\uD55C\uB2E4.",
2343
+ group: "appearance"
2344
+ },
2345
+ styleProp2,
2346
+ classNameProp2
2347
+ ],
2348
+ children: { accepts: true, text: true, label: "\uD78C\uD2B8\uB97C \uBD99\uC77C \uD2B8\uB9AC\uAC70" },
2349
+ dom: { element: "span" },
2350
+ preset: {
2351
+ component: "Tooltip",
2352
+ props: { label: "\uC124\uBA85 \uBB38\uAD6C" },
2353
+ children: [{ component: "IconButton", props: { icon: "info", "aria-label": "\uB3C4\uC6C0\uB9D0" } }]
2354
+ },
2355
+ resize: { kind: "none" }
2356
+ };
2357
+ var SidebarNavMeta = {
2358
+ name: "SidebarNav",
2359
+ label: "\uC0AC\uC774\uB4DC \uB0B4\uBE44\uAC8C\uC774\uC158",
2360
+ category: "layout",
2361
+ icon: "panel-left",
2362
+ description: "\uC139\uC158\uC73C\uB85C \uBB36\uC778 \uC8FC \uB0B4\uBE44\uAC8C\uC774\uC158 \uBAA9\uB85D. \uD65C\uC131 \uD56D\uBAA9\uC5D0 \uBE68\uAC04 \uC5D0\uC9C0 \uB9C8\uCEE4\uAC00 \uBD99\uB294\uB2E4.",
2363
+ props: [
2364
+ {
2365
+ name: "sections",
2366
+ kind: "array",
2367
+ label: "\uC139\uC158",
2368
+ required: true,
2369
+ bindable: true,
2370
+ group: "data",
2371
+ item: [
2372
+ { name: "label", kind: "node", label: "\uC139\uC158 \uC81C\uBAA9", description: "\uC5C6\uC73C\uBA74 \uAD6C\uBD84 \uC81C\uBAA9 \uC5C6\uC774 \uD56D\uBAA9\uB9CC \uC774\uC5B4 \uADF8\uB9B0\uB2E4." },
2373
+ {
2374
+ name: "items",
2375
+ kind: "array",
2376
+ label: "\uD56D\uBAA9",
2377
+ required: true,
2378
+ description: "{ value, label, icon?, meta?, href? } \uBC30\uC5F4. \uD55C \uB2E8\uACC4 \uC548\uCABD\uC774\uB77C \uC5EC\uAE30\uC11C\uB294 \uD615\uD0DC\uB97C \uB354 \uD3BC\uCE58\uC9C0 \uC54A\uB294\uB2E4.",
2379
+ item: [],
2380
+ itemKind: "object"
2381
+ }
2382
+ ]
2383
+ },
2384
+ {
2385
+ name: "value",
2386
+ kind: "string",
2387
+ label: "\uD65C\uC131 \uD56D\uBAA9",
2388
+ bindable: true,
2389
+ description: "\uD56D\uBAA9\uC758 value\uC640 \uAC19\uC740 \uAC83\uC5D0 aria-current\uC640 \uB9C8\uCEE4\uAC00 \uBD99\uB294\uB2E4.",
2390
+ group: "data"
2391
+ },
2392
+ { name: "onSelect", kind: "action", label: "\uD56D\uBAA9 \uC120\uD0DD", eventArg: "\uC120\uD0DD\uB41C \uD56D\uBAA9\uC758 value", group: "behavior" },
2393
+ {
2394
+ name: "collapsed",
2395
+ kind: "boolean",
2396
+ label: "\uC811\uAE30",
2397
+ default: false,
2398
+ description: "\uC544\uC774\uCF58\uB9CC \uB0A8\uB294 56px \uB808\uC77C\uC774 \uB41C\uB2E4.",
2399
+ group: "appearance"
2400
+ },
2401
+ {
2402
+ name: "light",
2403
+ kind: "boolean",
2404
+ label: "\uBC1D\uC740 \uBCC0\uD615",
2405
+ default: false,
2406
+ description: "\uD770 \uD45C\uBA74(\uC124\uC815 \uD558\uC704 \uB0B4\uBE44) \uC704\uC5D0 \uC5B9\uC744 \uB54C \uC4F4\uB2E4.",
2407
+ group: "appearance"
2408
+ },
2409
+ styleProp2,
2410
+ classNameProp2
2411
+ ],
2412
+ children: { accepts: false },
2413
+ dom: { element: "nav" },
2414
+ preset: {
2415
+ component: "SidebarNav",
2416
+ props: {
2417
+ sections: [
2418
+ {
2419
+ label: "\uC5C5\uBB34",
2420
+ items: [
2421
+ { value: "home", label: "\uD648", icon: "layout-dashboard" },
2422
+ { value: "list", label: "\uBAA9\uB85D", icon: "list" }
2423
+ ]
2424
+ }
2425
+ ],
2426
+ value: { $state: "nav", default: "home" },
2427
+ onSelect: { action: "setState", key: "nav", fromEvent: true }
2428
+ }
2429
+ },
2430
+ resize: { kind: "none" }
2431
+ };
2432
+ var dsComponentMeta = {
2433
+ Avatar: AvatarMeta,
2434
+ Breadcrumb: BreadcrumbMeta,
2435
+ Radio: RadioMeta,
2436
+ SegmentedControl: SegmentedControlMeta,
2437
+ SidebarNav: SidebarNavMeta,
2438
+ Tooltip: TooltipMeta
2439
+ };
2440
+
2057
2441
  // src/meta/rich.ts
2058
2442
  var ChartMeta = {
2059
2443
  name: "Chart",
@@ -2157,6 +2541,7 @@ var ChartMeta = {
2157
2541
  { name: "emptyText", kind: "string", label: "\uB370\uC774\uD130 \uC5C6\uC74C \uBB38\uAD6C", group: "content" }
2158
2542
  ],
2159
2543
  children: { accepts: false },
2544
+ dom: { element: "div" },
2160
2545
  preset: {
2161
2546
  component: "Chart",
2162
2547
  props: {
@@ -2232,6 +2617,8 @@ var MapPreviewMeta = {
2232
2617
  }
2233
2618
  ],
2234
2619
  children: { accepts: false },
2620
+ // ol이 안 깔려 있으면 자리표시자(<div>)로 떨어지지만, 둘 다 flow라 중첩 판정은 같다.
2621
+ dom: { element: "figure" },
2235
2622
  preset: {
2236
2623
  component: "MapPreview",
2237
2624
  props: {
@@ -2246,6 +2633,1223 @@ var richComponentMeta = {
2246
2633
  MapPreview: MapPreviewMeta
2247
2634
  };
2248
2635
 
2636
+ // src/meta/widgets.ts
2637
+ var treeNodeItem = [
2638
+ { name: "id", kind: "string", label: "\uB178\uB4DC id", required: true },
2639
+ { name: "label", kind: "string", label: "\uD45C\uC2DC\uBA85", required: true },
2640
+ { name: "meta", kind: "string", label: "\uBCF4\uC870 \uD14D\uC2A4\uD2B8", description: "\uB77C\uBCA8 \uC624\uB978\uCABD\uC5D0 \uC605\uAC8C \uBD99\uB294\uB2E4." },
2641
+ {
2642
+ name: "children",
2643
+ kind: "array",
2644
+ label: "\uD558\uC704 \uB178\uB4DC",
2645
+ description: "\uAC19\uC740 \uD615\uD0DC\uC758 \uB178\uB4DC \uBC30\uC5F4. \uC7AC\uADC0 \uAD6C\uC870\uB77C \uC5EC\uAE30\uC11C\uB294 \uD615\uD0DC\uB97C \uB354 \uD3BC\uCE58\uC9C0 \uC54A\uB294\uB2E4.",
2646
+ item: [],
2647
+ itemKind: "object"
2648
+ }
2649
+ ];
2650
+ var AutocompleteFieldMeta = {
2651
+ name: "AutocompleteField",
2652
+ label: "\uC790\uB3D9\uC644\uC131",
2653
+ category: "input",
2654
+ icon: "search",
2655
+ description: "\uAC80\uC0C9\uD574\uC11C \uD558\uB098\uB97C \uACE0\uB974\uB294 \uC785\uB825. \uACE0\uB978 \uB4A4\uC5D0\uB294 \uC120\uD0DD \uCE74\uB4DC\uB85C \uC811\uD78C\uB2E4. \uC6D0\uACA9 \uC870\uD68C\uB294 \uC571\uC774 \uC5B9\uC740 \uC5B4\uB311\uD130\uAC00 \uB2F4\uB2F9\uD55C\uB2E4.",
2656
+ props: [
2657
+ {
2658
+ name: "options",
2659
+ kind: "array",
2660
+ label: "\uC815\uC801 \uC635\uC158",
2661
+ bindable: true,
2662
+ description: "endpoint(\uC6D0\uACA9 \uC870\uD68C)\uAC00 \uC5C6\uC744 \uB54C \uB85C\uCEEC \uD544\uD130\uB9C1 \uB300\uC0C1. \uC635\uC158\uC740 \uC790\uC720 \uD615\uC2DD\uC774\uACE0 \uC544\uB798 \uD0A4 \uD504\uB86D\uC73C\uB85C \uC77D\uB294\uB2E4.",
2663
+ group: "data",
2664
+ item: [
2665
+ { name: "value", kind: "string", label: "\uAC12" },
2666
+ { name: "label", kind: "string", label: "\uD45C\uC2DC" },
2667
+ { name: "sub", kind: "string", label: "\uBCF4\uC870 \uC815\uBCF4" }
2668
+ ]
2669
+ },
2670
+ {
2671
+ name: "endpoint",
2672
+ kind: "string",
2673
+ legacy: true,
2674
+ label: "\uAC80\uC0C9 \uACBD\uB85C",
2675
+ description: "\uB77C\uC774\uBE0C\uB7EC\uB9AC \uAD6C\uD604\uC5D0\uB294 \uC5C6\uB2E4 \u2014 \uC774 \uC790\uB9AC\uC758 \uB77C\uC774\uBE0C\uB7EC\uB9AC \uD504\uB86D\uC740 `search`(\uD568\uC218)\uB77C JSON\uC73C\uB85C \uD45C\uD604\uD560 \uC218 \uC5C6\uC5B4\uC11C, \uC18C\uBE44 \uC571\uC774 \uC5B4\uB311\uD130\uB97C \uC50C\uC6CC endpoint\uB97C search\uB85C \uBC14\uAFD4 \uB4F1\uB85D\uD55C\uB2E4(ERP\uC758 `@/components/widgets/AutocompleteField`). \uC2A4\uD399 \uC5B4\uD718\uB294 endpoint \uCABD\uC774\uBBC0\uB85C \uC9C0\uC6B0\uC9C0 \uC54A\uB294\uB2E4.",
2676
+ group: "data"
2677
+ },
2678
+ {
2679
+ name: "value",
2680
+ kind: "string",
2681
+ label: "\uC120\uD0DD\uB41C \uAC12",
2682
+ bindable: true,
2683
+ description: "\uBE48 \uBB38\uC790\uC5F4\uC774\uBA74 \uBBF8\uC120\uD0DD\uC73C\uB85C \uBCF8\uB2E4.",
2684
+ group: "data"
2685
+ },
2686
+ {
2687
+ name: "selectedLabel",
2688
+ kind: "string",
2689
+ label: "\uC120\uD0DD \uD45C\uC2DC \uB77C\uBCA8",
2690
+ bindable: true,
2691
+ description: "\uC6D0\uACA9 \uAC12\uCC98\uB7FC \uB85C\uCEEC\uC5D0\uC11C \uB77C\uBCA8\uC744 \uC54C \uC218 \uC5C6\uC744 \uB54C \uCE74\uB4DC\uC5D0 \uBCF4\uC5EC\uC904 \uBB38\uAD6C.",
2692
+ group: "content"
2693
+ },
2694
+ {
2695
+ name: "onChange",
2696
+ kind: "action",
2697
+ label: "\uC120\uD0DD \uBCC0\uACBD",
2698
+ eventArg: "\uC120\uD0DD\uB41C \uAC12(\uBB38\uC790\uC5F4), \uD574\uC81C\uD558\uBA74 null",
2699
+ group: "behavior"
2700
+ },
2701
+ { name: "labelKey", kind: "string", label: "\uB77C\uBCA8 \uD0A4", default: "label", description: "\uC635\uC158\uC5D0\uC11C \uD45C\uC2DC \uB77C\uBCA8\uC744 \uC77D\uC744 \uD0A4.", group: "data" },
2702
+ { name: "valueKey", kind: "string", label: "\uAC12 \uD0A4", default: "value", description: "\uC635\uC158\uC5D0\uC11C \uAC12\uC744 \uC77D\uC744 \uD0A4.", group: "data" },
2703
+ { name: "subKey", kind: "string", label: "\uBCF4\uC870 \uC815\uBCF4 \uD0A4", description: "\uBAA9\uB85D \uB458\uC9F8 \uC904\uC5D0 \uC4F8 \uD0A4. \uC5C6\uC73C\uBA74 \uD55C \uC904\uB9CC \uADF8\uB9B0\uB2E4.", group: "data" },
2704
+ { name: "placeholder", kind: "string", label: "\uC548\uB0B4 \uBB38\uAD6C", group: "content" },
2705
+ { name: "minChars", kind: "number", label: "\uAC80\uC0C9 \uC2DC\uC791 \uAE00\uC790 \uC218", default: 1, group: "behavior", advanced: true },
2706
+ { name: "debounceMs", kind: "number", label: "\uB514\uBC14\uC6B4\uC2A4(ms)", default: 300, group: "behavior", advanced: true },
2707
+ { name: "invalid", kind: "boolean", label: "\uC624\uB958 \uD45C\uC2DC", default: false, bindable: true, group: "validation" },
2708
+ { name: "disabled", kind: "boolean", label: "\uBE44\uD65C\uC131", default: false, bindable: true, group: "behavior" }
2709
+ ],
2710
+ children: { accepts: false },
2711
+ dom: { element: "div" },
2712
+ preset: {
2713
+ component: "AutocompleteField",
2714
+ props: {
2715
+ placeholder: "\uAC80\uC0C9\uC5B4\uB97C \uC785\uB825\uD558\uC138\uC694",
2716
+ options: [
2717
+ { value: "a", label: "\uD56D\uBAA9 A", sub: "\uBCF4\uC870 \uC815\uBCF4" },
2718
+ { value: "b", label: "\uD56D\uBAA9 B" }
2719
+ ],
2720
+ value: { $state: "picked", default: "" },
2721
+ onChange: { action: "setState", key: "picked", fromEvent: true }
2722
+ }
2723
+ },
2724
+ resize: { kind: "none" }
2725
+ };
2726
+ var InlineEditMeta = {
2727
+ name: "InlineEdit",
2728
+ label: "\uC778\uB77C\uC778 \uD3B8\uC9D1",
2729
+ category: "input",
2730
+ icon: "square-pen",
2731
+ description: "\uD3C9\uC18C\uC5D0\uB294 \uAC12\uB9CC \uBCF4\uC774\uB2E4\uAC00 \uD074\uB9AD\uD558\uBA74 \uADF8 \uC790\uB9AC\uC5D0\uC11C \uACE0\uCE58\uB294 \uC785\uB825. Enter \uC800\uC7A5\xB7Escape \uCDE8\uC18C.",
2732
+ props: [
2733
+ { name: "value", kind: "string", label: "\uAC12", required: true, bindable: true, group: "data" },
2734
+ {
2735
+ name: "onSave",
2736
+ kind: "action",
2737
+ label: "\uC800\uC7A5",
2738
+ eventArg: "\uC785\uB825\uD55C \uAC12(\uBB38\uC790\uC5F4)",
2739
+ description: "Enter \uB610\uB294 \uD655\uC778 \uBC84\uD2BC\uC5D0\uC11C\uB9CC \uBC1C\uC0DD\uD55C\uB2E4 \u2014 \uD0C0\uC774\uD551 \uC911\uC5D0\uB294 \uC624\uC9C0 \uC54A\uB294\uB2E4.",
2740
+ group: "behavior"
2741
+ },
2742
+ {
2743
+ name: "type",
2744
+ kind: "enum",
2745
+ label: "\uC785\uB825 \uC885\uB958",
2746
+ default: "text",
2747
+ options: [
2748
+ { value: "text", label: "\uBB38\uC790" },
2749
+ { value: "number", label: "\uC22B\uC790" }
2750
+ ],
2751
+ group: "behavior"
2752
+ },
2753
+ { name: "mono", kind: "boolean", label: "\uACE0\uC815\uD3ED \uAE00\uAF34", default: false, group: "appearance" },
2754
+ { name: "emptyText", kind: "string", label: "\uBE48 \uAC12 \uD45C\uC2DC", default: "\u2014", group: "content" },
2755
+ { name: "disabled", kind: "boolean", label: "\uBE44\uD65C\uC131", default: false, bindable: true, group: "behavior" }
2756
+ ],
2757
+ children: { accepts: false },
2758
+ dom: { element: "span" },
2759
+ preset: {
2760
+ component: "InlineEdit",
2761
+ props: {
2762
+ value: { $state: "inlineValue", default: "\uAC12\uC744 \uC785\uB825\uD558\uC138\uC694" },
2763
+ onSave: { action: "setState", key: "inlineValue", fromEvent: true }
2764
+ }
2765
+ },
2766
+ resize: { kind: "none" }
2767
+ };
2768
+ var JsonFieldMeta = {
2769
+ name: "JsonField",
2770
+ label: "JSON \uC785\uB825",
2771
+ category: "input",
2772
+ icon: "file-text",
2773
+ description: "JSON \uD3B8\uC9D1\uC6A9 \uD14D\uC2A4\uD2B8 \uC601\uC5ED. \uD3EC\uCEE4\uC2A4\uB97C \uBC97\uC5B4\uB0A0 \uB54C \uD30C\uC2F1\uD574 \uC815\uB82C\uD558\uACE0, \uC2E4\uD328\uD558\uBA74 \uC624\uB958 \uC704\uCE58\uB97C \uC54C\uB824 \uC900 \uB4A4 \uC6D0\uBB38\uC744 \uC720\uC9C0\uD55C\uB2E4.",
2774
+ props: [
2775
+ {
2776
+ name: "value",
2777
+ kind: "binding",
2778
+ label: "\uAC12",
2779
+ bindable: true,
2780
+ description: "\uAC1D\uCCB4 \uB610\uB294 JSON \uBB38\uC790\uC5F4. \uB458 \uB2E4 2\uCE78 \uB4E4\uC5EC\uC4F0\uAE30\uB85C \uC815\uB82C\uD574 \uBCF4\uC5EC\uC900\uB2E4.",
2781
+ group: "data"
2782
+ },
2783
+ {
2784
+ name: "onChange",
2785
+ kind: "action",
2786
+ label: "\uBCC0\uACBD",
2787
+ eventArg: "\uD30C\uC2F1\uB41C \uAC12(\uAC1D\uCCB4\xB7\uBC30\uC5F4 \uB4F1)",
2788
+ description: "\uD30C\uC2F1\uC5D0 \uC131\uACF5\uD55C blur\uC5D0\uC11C\uB9CC \uBC1C\uC0DD\uD55C\uB2E4.",
2789
+ group: "behavior"
2790
+ },
2791
+ { name: "rows", kind: "number", label: "\uC904 \uC218", default: 6, group: "appearance" },
2792
+ { name: "placeholder", kind: "string", label: "\uC548\uB0B4 \uBB38\uAD6C", default: "JSON\uC744 \uC785\uB825\uD558\uC138\uC694", group: "content" },
2793
+ { name: "invalid", kind: "boolean", label: "\uC624\uB958 \uD45C\uC2DC", default: false, bindable: true, group: "validation" },
2794
+ { name: "disabled", kind: "boolean", label: "\uBE44\uD65C\uC131", default: false, bindable: true, group: "behavior" }
2795
+ ],
2796
+ children: { accepts: false },
2797
+ dom: { element: "div" },
2798
+ preset: {
2799
+ component: "JsonField",
2800
+ props: {
2801
+ rows: 6,
2802
+ value: { $state: "jsonValue", default: { name: "\uAC12" } },
2803
+ onChange: { action: "setState", key: "jsonValue", fromEvent: true }
2804
+ }
2805
+ },
2806
+ resize: { kind: "numeric", heightProp: "rows", unit: "row", axis: "y" }
2807
+ };
2808
+ var PeriodFilterMeta = {
2809
+ name: "PeriodFilter",
2810
+ label: "\uAE30\uAC04 \uD544\uD130",
2811
+ category: "input",
2812
+ icon: "funnel",
2813
+ description: "\uC5F0/\uBC18\uAE30/\uBD84\uAE30/\uC6D4/\uC9C1\uC811 \uC9C0\uC815\uC744 \uD55C \uC904\uB85C \uACE0\uB974\uB294 \uAE30\uAC04 \uC120\uD0DD\uAE30.",
2814
+ props: [
2815
+ {
2816
+ name: "value",
2817
+ kind: "object",
2818
+ label: "\uAE30\uAC04",
2819
+ bindable: true,
2820
+ description: "\uBAA8\uB4DC\uC5D0 \uB530\uB77C \uC4F0\uB294 \uD544\uB4DC\uAC00 \uB2E4\uB974\uB2E4. \uBE60\uC9C4 \uD544\uB4DC\uB294 \uC62C\uD574\xB7\uC774\uBC88 \uBD84\uAE30 \uB4F1\uC73C\uB85C \uCC44\uC6CC\uC9C4\uB2E4.",
2821
+ group: "data",
2822
+ fields: [
2823
+ {
2824
+ name: "mode",
2825
+ kind: "enum",
2826
+ label: "\uBAA8\uB4DC",
2827
+ required: true,
2828
+ options: [
2829
+ { value: "year", label: "\uC5F0\uAC04" },
2830
+ { value: "half", label: "\uBC18\uAE30" },
2831
+ { value: "quarter", label: "\uBD84\uAE30" },
2832
+ { value: "month", label: "\uC6D4\uAC04" },
2833
+ { value: "custom", label: "\uC9C1\uC811 \uC9C0\uC815" }
2834
+ ]
2835
+ },
2836
+ { name: "year", kind: "number", label: "\uC5F0\uB3C4" },
2837
+ { name: "half", kind: "number", label: "\uBC18\uAE30", description: "1 \uB610\uB294 2" },
2838
+ { name: "quarter", kind: "number", label: "\uBD84\uAE30", description: "1~4" },
2839
+ { name: "month", kind: "number", label: "\uC6D4", description: "1~12" },
2840
+ { name: "from", kind: "string", label: "\uC2DC\uC791\uC77C", description: "YYYY-MM-DD (custom \uBAA8\uB4DC)" },
2841
+ { name: "to", kind: "string", label: "\uC885\uB8CC\uC77C", description: "YYYY-MM-DD (custom \uBAA8\uB4DC)" }
2842
+ ]
2843
+ },
2844
+ {
2845
+ name: "onChange",
2846
+ kind: "action",
2847
+ label: "\uBCC0\uACBD",
2848
+ eventArg: "\uC815\uADDC\uD654\uB41C \uAE30\uAC04 \uAC1D\uCCB4",
2849
+ group: "behavior"
2850
+ },
2851
+ {
2852
+ name: "years",
2853
+ kind: "array",
2854
+ label: "\uC5F0\uB3C4 \uD6C4\uBCF4",
2855
+ description: "\uC0DD\uB7B5\uD558\uBA74 \uC62C\uD574\uBD80\uD130 5\uB144 \uC804\uAE4C\uC9C0. \uD604\uC7AC \uC120\uD0DD\uB41C \uC5F0\uB3C4\uB294 \uBAA9\uB85D\uC5D0 \uC5C6\uC5B4\uB3C4 \uC790\uB3D9\uC73C\uB85C \uB354\uD574\uC9C4\uB2E4.",
2856
+ group: "data",
2857
+ item: [],
2858
+ itemKind: "number"
2859
+ },
2860
+ {
2861
+ name: "modes",
2862
+ kind: "array",
2863
+ label: "\uB178\uCD9C\uD560 \uBAA8\uB4DC",
2864
+ description: '\uC0DD\uB7B5\uD558\uBA74 \uB2E4\uC12F \uBAA8\uB4DC\uAC00 \uADF8\uB300\uB85C \uB098\uC628\uB2E4. \uBB38\uC790\uC5F4 \uCD95\uC57D\uD615(["month","custom"])\uB3C4 \uBC1B\uB294\uB2E4 \u2014 \uADF8\uB54C\uB294 \uB77C\uBCA8\xB7\uC544\uC774\uCF58\uC774 \uAE30\uBCF8\uAC12\uC774\uB2E4.',
2865
+ group: "behavior",
2866
+ advanced: true,
2867
+ item: [
2868
+ {
2869
+ name: "value",
2870
+ kind: "enum",
2871
+ label: "\uBAA8\uB4DC",
2872
+ required: true,
2873
+ options: [
2874
+ { value: "year", label: "\uC5F0\uAC04" },
2875
+ { value: "half", label: "\uBC18\uAE30" },
2876
+ { value: "quarter", label: "\uBD84\uAE30" },
2877
+ { value: "month", label: "\uC6D4\uAC04" },
2878
+ { value: "custom", label: "\uC9C1\uC811 \uC9C0\uC815" }
2879
+ ]
2880
+ },
2881
+ { name: "label", kind: "string", label: "\uB77C\uBCA8", description: "\uC0DD\uB7B5\uD558\uBA74 \uAE30\uBCF8 \uB77C\uBCA8(\uC5F0\uAC04\xB7\uBC18\uAE30\u2026)." },
2882
+ { name: "icon", kind: "icon", label: "\uC544\uC774\uCF58" }
2883
+ ]
2884
+ }
2885
+ ],
2886
+ children: { accepts: false },
2887
+ dom: { element: "div" },
2888
+ preset: {
2889
+ component: "PeriodFilter",
2890
+ props: {
2891
+ value: { $state: "period", default: { mode: "month" } },
2892
+ onChange: { action: "setState", key: "period", fromEvent: true }
2893
+ }
2894
+ },
2895
+ resize: { kind: "none" }
2896
+ };
2897
+ var SearchableMultiPickerMeta = {
2898
+ name: "SearchableMultiPicker",
2899
+ label: "\uAC80\uC0C9 \uB2E4\uC911 \uC120\uD0DD",
2900
+ category: "input",
2901
+ icon: "list-filter",
2902
+ description: "\uB2E4\uC774\uC5BC\uB85C\uADF8\uB97C \uC5F4\uC5B4 \uAC80\uC0C9\xB7\uC804\uCCB4\uC120\uD0DD\uC73C\uB85C \uC5EC\uB7EC \uAC1C\uB97C \uACE0\uB974\uACE0, \uACE0\uB978 \uAC83\uC740 \uD0DC\uADF8\uB85C \uC811\uC5B4 \uBCF4\uC5EC\uC900\uB2E4.",
2903
+ props: [
2904
+ {
2905
+ name: "options",
2906
+ kind: "array",
2907
+ label: "\uC635\uC158",
2908
+ required: true,
2909
+ bindable: true,
2910
+ group: "data",
2911
+ item: [
2912
+ { name: "value", kind: "string", label: "\uAC12", required: true },
2913
+ { name: "label", kind: "string", label: "\uD45C\uC2DC", required: true },
2914
+ { name: "sub", kind: "string", label: "\uBCF4\uC870 \uC815\uBCF4", description: "\uAC80\uC0C9\uC740 \uB77C\uBCA8\uACFC \uC774 \uAC12\uC744 \uD568\uAED8 \uBCF8\uB2E4." }
2915
+ ]
2916
+ },
2917
+ {
2918
+ name: "values",
2919
+ kind: "array",
2920
+ label: "\uC120\uD0DD\uB41C \uAC12",
2921
+ required: true,
2922
+ bindable: true,
2923
+ description: '\uAC12 \uBB38\uC790\uC5F4 \uBC30\uC5F4. \uBCF4\uD1B5 { "$state": "picked" }\uB97C \uAC74\uB2E4.',
2924
+ group: "data",
2925
+ item: [],
2926
+ itemKind: "string"
2927
+ },
2928
+ { name: "onChange", kind: "action", label: "\uBCC0\uACBD", eventArg: "\uC120\uD0DD\uB41C \uAC12 \uBC30\uC5F4", group: "behavior" },
2929
+ { name: "title", kind: "string", label: "\uB2E4\uC774\uC5BC\uB85C\uADF8 \uC81C\uBAA9", group: "content" },
2930
+ {
2931
+ name: "trigger",
2932
+ kind: "node",
2933
+ slot: true,
2934
+ label: "\uC5EC\uB294 \uBC84\uD2BC",
2935
+ description: "\uC0DD\uB7B5\uD558\uBA74 secondary Button '\uC120\uD0DD'\uC774 \uADF8\uB824\uC9C4\uB2E4.",
2936
+ group: "content"
2937
+ },
2938
+ { name: "disabled", kind: "boolean", label: "\uBE44\uD65C\uC131", default: false, bindable: true, group: "behavior" }
2939
+ ],
2940
+ children: { accepts: false },
2941
+ dom: { element: "button", slotElement: { trigger: "span" } },
2942
+ preset: {
2943
+ component: "SearchableMultiPicker",
2944
+ props: {
2945
+ title: "\uD56D\uBAA9 \uC120\uD0DD",
2946
+ options: [
2947
+ { value: "a", label: "\uD56D\uBAA9 A" },
2948
+ { value: "b", label: "\uD56D\uBAA9 B" },
2949
+ { value: "c", label: "\uD56D\uBAA9 C" }
2950
+ ],
2951
+ values: { $state: "multiPicked", default: [] },
2952
+ onChange: { action: "setState", key: "multiPicked", fromEvent: true }
2953
+ }
2954
+ },
2955
+ resize: { kind: "none" }
2956
+ };
2957
+ var TagMultiSelectMeta = {
2958
+ name: "TagMultiSelect",
2959
+ label: "\uD0DC\uADF8 \uB2E4\uC911 \uC120\uD0DD",
2960
+ category: "input",
2961
+ icon: "tag",
2962
+ description: "\uC635\uC158\uC744 \uD0DC\uADF8\uB85C \uB298\uC5B4\uB193\uACE0 \uB20C\uB7EC\uC11C \uCF1C\uACE0 \uB044\uB294 \uB2E4\uC911 \uC120\uD0DD. \uD6C4\uBCF4\uAC00 10\uAC1C \uC548\uD30E\uC77C \uB54C \uC4F4\uB2E4.",
2963
+ props: [
2964
+ {
2965
+ name: "options",
2966
+ kind: "array",
2967
+ label: "\uC635\uC158",
2968
+ required: true,
2969
+ bindable: true,
2970
+ group: "data",
2971
+ item: [
2972
+ { name: "value", kind: "string", label: "\uAC12", required: true },
2973
+ { name: "label", kind: "string", label: "\uD45C\uC2DC", required: true }
2974
+ ]
2975
+ },
2976
+ {
2977
+ name: "values",
2978
+ kind: "array",
2979
+ label: "\uC120\uD0DD\uB41C \uAC12",
2980
+ required: true,
2981
+ bindable: true,
2982
+ description: "\uB0B4\uBCF4\uB0B4\uB294 \uBC30\uC5F4\uC740 \uD56D\uC0C1 \uC635\uC158 \uC21C\uC11C\uB97C \uB530\uB978\uB2E4.",
2983
+ group: "data",
2984
+ item: [],
2985
+ itemKind: "string"
2986
+ },
2987
+ { name: "onChange", kind: "action", label: "\uBCC0\uACBD", eventArg: "\uC120\uD0DD\uB41C \uAC12 \uBC30\uC5F4", group: "behavior" },
2988
+ { name: "emptyText", kind: "string", label: "\uC635\uC158 \uC5C6\uC74C \uBB38\uAD6C", default: "\uC120\uD0DD\uD560 \uD56D\uBAA9\uC774 \uC5C6\uC2B5\uB2C8\uB2E4", group: "content" },
2989
+ { name: "disabled", kind: "boolean", label: "\uBE44\uD65C\uC131", default: false, bindable: true, group: "behavior" }
2990
+ ],
2991
+ children: { accepts: false },
2992
+ dom: { element: "div" },
2993
+ preset: {
2994
+ component: "TagMultiSelect",
2995
+ props: {
2996
+ options: [
2997
+ { value: "a", label: "\uD56D\uBAA9 A" },
2998
+ { value: "b", label: "\uD56D\uBAA9 B" },
2999
+ { value: "c", label: "\uD56D\uBAA9 C" }
3000
+ ],
3001
+ values: { $state: "tags", default: ["a"] },
3002
+ onChange: { action: "setState", key: "tags", fromEvent: true }
3003
+ }
3004
+ },
3005
+ resize: { kind: "none" }
3006
+ };
3007
+ var TreePickerMeta = {
3008
+ name: "TreePicker",
3009
+ label: "\uD2B8\uB9AC \uC120\uD0DD",
3010
+ category: "input",
3011
+ icon: "folder-open",
3012
+ description: "\uB2E4\uC774\uC5BC\uB85C\uADF8\uC5D0 \uD2B8\uB9AC\uB97C \uB744\uC6CC \uB178\uB4DC \uD558\uB098\uB97C \uACE0\uB974\uB294 \uC785\uB825. \uBD84\uB958\xB7\uC870\uC9C1 \uC120\uD0DD\uC5D0 \uC4F4\uB2E4.",
3013
+ props: [
3014
+ {
3015
+ name: "nodes",
3016
+ kind: "array",
3017
+ label: "\uD2B8\uB9AC",
3018
+ required: true,
3019
+ bindable: true,
3020
+ group: "data",
3021
+ item: treeNodeItem
3022
+ },
3023
+ {
3024
+ name: "value",
3025
+ kind: "string",
3026
+ label: "\uC120\uD0DD\uB41C \uB178\uB4DC id",
3027
+ bindable: true,
3028
+ description: "null\uC774\uBA74 \uC120\uD0DD \uC5C6\uC74C.",
3029
+ group: "data"
3030
+ },
3031
+ {
3032
+ name: "valueLabel",
3033
+ kind: "string",
3034
+ label: "\uC120\uD0DD \uD45C\uC2DC \uB77C\uBCA8",
3035
+ bindable: true,
3036
+ description: "\uD2B8\uB9AC\uC5D0\uC11C id\uB97C \uCC3E\uC9C0 \uBABB\uD560 \uB54C \uB300\uC2E0 \uBCF4\uC5EC\uC904 \uBB38\uAD6C.",
3037
+ group: "content"
3038
+ },
3039
+ {
3040
+ name: "onChange",
3041
+ kind: "action",
3042
+ label: "\uC120\uD0DD \uBCC0\uACBD",
3043
+ eventArg: "\uC120\uD0DD\uB41C \uB178\uB4DC id, \uBE44\uC6B0\uBA74 null",
3044
+ group: "behavior"
3045
+ },
3046
+ { name: "label", kind: "string", label: "\uB77C\uBCA8", description: "\uD544\uB4DC \uB77C\uBCA8 \uACB8 \uB2E4\uC774\uC5BC\uB85C\uADF8 \uC81C\uBAA9.", group: "content" },
3047
+ { name: "placeholder", kind: "string", label: "\uBBF8\uC120\uD0DD \uBB38\uAD6C", default: "\uC120\uD0DD \uC548 \uD568", group: "content" },
3048
+ {
3049
+ name: "excludeIds",
3050
+ kind: "array",
3051
+ label: "\uC81C\uC678\uD560 \uB178\uB4DC",
3052
+ description: "\uC5EC\uAE30 \uC801\uC740 id\uB294 \uC11C\uBE0C\uD2B8\uB9AC\uC9F8 \uC228\uB294\uB2E4. \uC790\uAE30 \uC790\uC2E0\uC744 \uBD80\uBAA8\uB85C \uACE0\uB974\uC9C0 \uBABB\uD558\uAC8C \uD560 \uB54C \uC4F4\uB2E4.",
3053
+ group: "data",
3054
+ item: [],
3055
+ itemKind: "string"
3056
+ },
3057
+ { name: "allowEmpty", kind: "boolean", label: "(\uC5C6\uC74C) \uD5C8\uC6A9", default: true, group: "behavior" },
3058
+ { name: "disabled", kind: "boolean", label: "\uBE44\uD65C\uC131", default: false, bindable: true, group: "behavior" }
3059
+ ],
3060
+ children: { accepts: false },
3061
+ dom: { element: "div" },
3062
+ preset: {
3063
+ component: "TreePicker",
3064
+ props: {
3065
+ label: "\uBD84\uB958",
3066
+ placeholder: "\uC120\uD0DD \uC548 \uD568",
3067
+ nodes: [
3068
+ { id: "a", label: "\uC0C1\uC704 \uBD84\uB958", children: [{ id: "a1", label: "\uD558\uC704 \uBD84\uB958" }] },
3069
+ { id: "b", label: "\uB2E4\uB978 \uBD84\uB958" }
3070
+ ],
3071
+ value: { $state: "treePicked", default: null },
3072
+ onChange: { action: "setState", key: "treePicked", fromEvent: true }
3073
+ }
3074
+ },
3075
+ resize: { kind: "none" }
3076
+ };
3077
+ var DisclosureMeta = {
3078
+ name: "Disclosure",
3079
+ label: "\uC811\uAE30/\uD3BC\uCE58\uAE30",
3080
+ category: "layout",
3081
+ icon: "chevron-right",
3082
+ description: "\uC694\uC57D \uC904\uC744 \uB20C\uB7EC \uB0B4\uC6A9\uC744 \uC5EC\uB2EB\uB294\uB2E4. \uB0B4\uC6A9\uC740 \uB2EB\uD600\uB3C4 DOM\uC5D0 \uB0A8\uC544 \uC788\uC5B4 \uC785\uB825 \uC0C1\uD0DC\uAC00 \uBCF4\uC874\uB41C\uB2E4.",
3083
+ props: [
3084
+ {
3085
+ name: "summary",
3086
+ kind: "node",
3087
+ slot: true,
3088
+ label: "\uC694\uC57D \uC904",
3089
+ required: true,
3090
+ description: "\uD56D\uC0C1 \uBCF4\uC774\uB294 \uBA38\uB9AC \uC904. \uBB38\uC790\uC5F4\uB85C\uB3C4, \uC2AC\uB86F\uC5D0 \uB178\uB4DC\uB97C \uB123\uC5B4\uC11C\uB3C4 \uC904 \uC218 \uC788\uB2E4.",
3091
+ group: "content"
3092
+ },
3093
+ { name: "defaultOpen", kind: "boolean", label: "\uCC98\uC74C\uBD80\uD130 \uD3BC\uCE68", default: false, group: "behavior" },
3094
+ {
3095
+ name: "open",
3096
+ kind: "boolean",
3097
+ label: "\uD3BC\uCE68 \uC0C1\uD0DC",
3098
+ bindable: true,
3099
+ description: "\uC8FC\uBA74 \uC81C\uC5B4 \uBAA8\uB4DC\uAC00 \uB41C\uB2E4 \u2014 onOpenChange\uB85C \uC0C1\uD0DC\uB97C \uC9C1\uC811 \uAD00\uB9AC\uD574\uC57C \uD55C\uB2E4. \uC2A4\uD399\uC5D0\uC11C\uB294 \uBCF4\uD1B5 defaultOpen\uB9CC \uC4F4\uB2E4.",
3100
+ group: "behavior",
3101
+ advanced: true
3102
+ },
3103
+ { name: "onOpenChange", kind: "action", label: "\uC5EC\uB2EB\uD798", eventArg: "\uD3BC\uCE68 \uC5EC\uBD80(boolean)", group: "behavior", advanced: true }
3104
+ ],
3105
+ children: { accepts: true, text: true, label: "\uD3BC\uCCE4\uC744 \uB54C \uBCF4\uC77C \uB0B4\uC6A9" },
3106
+ dom: { element: "div", slotElement: { summary: "span" } },
3107
+ preset: {
3108
+ component: "Disclosure",
3109
+ slots: {
3110
+ summary: [{ component: "Text", props: { preset: "label" }, children: ["\uC790\uC138\uD788"] }]
3111
+ },
3112
+ children: [{ component: "Text", props: { preset: "body" }, children: ["\uD3BC\uCCD0\uC11C \uBCF4\uC774\uB294 \uB0B4\uC6A9"] }]
3113
+ },
3114
+ resize: { kind: "none" }
3115
+ };
3116
+ var ImageLightboxMeta = {
3117
+ name: "ImageLightbox",
3118
+ label: "\uC774\uBBF8\uC9C0 \uD655\uB300",
3119
+ category: "display",
3120
+ icon: "image",
3121
+ description: "\uC378\uB124\uC77C\uC744 \uB204\uB974\uBA74 \uC804\uCCB4 \uD654\uBA74\uC73C\uB85C \uB744\uC6B0\uACE0 \uD655\uB300\xB7\uD68C\uC804\xB7\uB2E4\uC6B4\uB85C\uB4DC\uB97C \uC81C\uACF5\uD55C\uB2E4.",
3122
+ props: [
3123
+ { name: "src", kind: "string", label: "\uC774\uBBF8\uC9C0 \uC8FC\uC18C", required: true, bindable: true, group: "data" },
3124
+ { name: "alt", kind: "string", label: "\uB300\uCCB4 \uD14D\uC2A4\uD2B8", bindable: true, group: "content" },
3125
+ {
3126
+ name: "thumbClassName",
3127
+ kind: "string",
3128
+ label: "\uC378\uB124\uC77C \uD074\uB798\uC2A4",
3129
+ description: "\uAE30\uBCF8 \uC378\uB124\uC77C <img>\uC5D0 \uBD99\uB294\uB2E4. \uCEE4\uC2A4\uD140 \uD2B8\uB9AC\uAC70(\uC790\uC2DD)\uB97C \uC8FC\uBA74 \uC4F0\uC774\uC9C0 \uC54A\uB294\uB2E4.",
3130
+ group: "layout",
3131
+ advanced: true
3132
+ }
3133
+ ],
3134
+ children: { accepts: true, label: "\uCEE4\uC2A4\uD140 \uD2B8\uB9AC\uAC70 \u2014 \uC0DD\uB7B5\uD558\uBA74 \uAE30\uBCF8 \uC378\uB124\uC77C\uC774 \uADF8\uB824\uC9C4\uB2E4" },
3135
+ dom: { element: "span" },
3136
+ preset: {
3137
+ component: "ImageLightbox",
3138
+ // 예전 주석은 "인라인 data URI로 두고 싶지만 URL 정책이 막는다"였다. 그 제약은
3139
+ // 없어졌다 — `data:image/…`(SVG 제외)는 이제 통과한다(asset-url.ts). 요청을 한 건도
3140
+ // 안 내는 인라인 이미지가 금지이고 원격 호스트가 허용이던 역설을 뒤집은 결과다.
3141
+ //
3142
+ // 그런데도 자리표시자를 넣지 않고 빈 값으로 둔다. 집자마자 그림이 박혀 있으면
3143
+ // 사용자가 그것을 지우는 일부터 해야 하고, 빈 값이면 속성 패널이 곧바로 주소를 묻는다.
3144
+ // 바깥 주소를 넣지 않는 원래 이유는 그대로다 — 팔레트에서 집는 것만으로 그 호스트에
3145
+ // 요청이 나간다. (이제 캔버스에서는 `resolveAsset` 관문이 그것도 막지만, 스펙에
3146
+ // 남는 주소는 런타임에 그대로 살아난다. 관문은 편집 중 유출을 막는 것이지
3147
+ // 나쁜 기본값을 고쳐 주는 장치가 아니다.)
3148
+ props: { src: "", alt: "\uC774\uBBF8\uC9C0" }
3149
+ },
3150
+ resize: { kind: "none" }
3151
+ };
3152
+ var LiveClockMeta = {
3153
+ name: "LiveClock",
3154
+ label: "\uC2E4\uC2DC\uAC04 \uC2DC\uACC4",
3155
+ category: "display",
3156
+ icon: "clock",
3157
+ description: "1\uCD08\uB9C8\uB2E4 \uAC31\uC2E0\uB418\uB294 \uC2DC\uACC4. \uC2DC\uC791 \uC2DC\uAC01\uC744 \uC8FC\uBA74 \uD604\uC7AC \uC2DC\uAC01 \uB300\uC2E0 \uACBD\uACFC \uC2DC\uAC04(HH:MM:SS)\uC744 \uC13C\uB2E4.",
3158
+ props: [
3159
+ {
3160
+ name: "startedAt",
3161
+ kind: "string",
3162
+ label: "\uC2DC\uC791 \uC2DC\uAC01",
3163
+ bindable: true,
3164
+ description: "ISO \uC2DC\uAC01 \uBB38\uC790\uC5F4. \uC8FC\uBA74 \uACBD\uACFC \uC2DC\uAC04 \uBAA8\uB4DC\uAC00 \uB41C\uB2E4 \u2014 \uC6CC\uD06C\uC624\uB354 \uAC00\uB3D9 \uC2DC\uAC04 \uB4F1.",
3165
+ group: "data"
3166
+ },
3167
+ {
3168
+ name: "showDate",
3169
+ kind: "boolean",
3170
+ label: "\uB0A0\uC9DC \uD568\uAED8 \uD45C\uC2DC",
3171
+ default: false,
3172
+ description: "\uC2DC\uACC4 \uBAA8\uB4DC\uC5D0\uC11C\uB294 \uC624\uB298 \uB0A0\uC9DC, \uACBD\uACFC \uBAA8\uB4DC\uC5D0\uC11C\uB294 \uC2DC\uC791 \uC2DC\uAC01\uC744 \uC704\uC5D0 \uC801\uB294\uB2E4.",
3173
+ group: "appearance"
3174
+ }
3175
+ ],
3176
+ children: { accepts: false },
3177
+ dom: { element: "div" },
3178
+ preset: {
3179
+ component: "LiveClock",
3180
+ props: { showDate: true }
3181
+ },
3182
+ resize: { kind: "none" }
3183
+ };
3184
+ var StackedMeterMeta = {
3185
+ name: "StackedMeter",
3186
+ label: "\uB204\uC801 \uBE44\uC728 \uB9C9\uB300",
3187
+ category: "data",
3188
+ icon: "gauge",
3189
+ description: "\uC804\uCCB4 \uB300\uBE44 \uAC01 \uD56D\uBAA9\uC758 \uBE44\uC911\uC744 \uD55C \uC904 \uB9C9\uB300\uC640 \uBC94\uB840\uB85C \uBCF4\uC5EC\uC900\uB2E4. \uBC31\uBD84\uC728\uC740 \uAC12\uC5D0\uC11C \uC790\uB3D9 \uACC4\uC0B0\uD55C\uB2E4.",
3190
+ props: [
3191
+ {
3192
+ name: "segments",
3193
+ kind: "array",
3194
+ label: "\uAD6C\uAC04",
3195
+ required: true,
3196
+ bindable: true,
3197
+ description: "\uAC12\uC774 0 \uC774\uD558\uC778 \uAD6C\uAC04\uC740 \uB9C9\uB300\uC5D0\uC11C \uBE60\uC9C0\uACE0 \uBC94\uB840\uC5D0\uB9CC 0%\uB85C \uB0A8\uB294\uB2E4.",
3198
+ group: "data",
3199
+ item: [
3200
+ { name: "label", kind: "string", label: "\uC774\uB984", required: true },
3201
+ { name: "value", kind: "number", label: "\uAC12", required: true, bindable: true },
3202
+ {
3203
+ name: "color",
3204
+ kind: "color",
3205
+ label: "\uC0C9",
3206
+ description: 'CSS \uC0C9\uC0C1 \uB610\uB294 "1"~"8"(\uC2DC\uB9AC\uC988 \uD1A0\uD070 \uBC88\uD638). \uC0DD\uB7B5\uD558\uBA74 \uC21C\uC11C\uB300\uB85C \uC790\uB3D9 \uBC30\uC815.'
3207
+ }
3208
+ ]
3209
+ },
3210
+ { name: "showLegend", kind: "boolean", label: "\uBC94\uB840 \uD45C\uC2DC", default: true, group: "appearance" },
3211
+ { name: "height", kind: "number", label: "\uB9C9\uB300 \uB192\uC774(px)", default: 10, group: "layout" }
3212
+ ],
3213
+ children: { accepts: false },
3214
+ dom: { element: "div" },
3215
+ preset: {
3216
+ component: "StackedMeter",
3217
+ props: {
3218
+ height: 10,
3219
+ segments: [
3220
+ { label: "\uC0AC\uC6A9", value: 54, color: "1" },
3221
+ { label: "\uB300\uAE30", value: 14, color: "3" },
3222
+ { label: "\uC5EC\uC720", value: 32, color: "5" }
3223
+ ]
3224
+ }
3225
+ },
3226
+ resize: { kind: "numeric", heightProp: "height", unit: "px", axis: "y" }
3227
+ };
3228
+ var TimelineMeta = {
3229
+ name: "Timeline",
3230
+ label: "\uC774\uB825",
3231
+ category: "display",
3232
+ icon: "activity",
3233
+ description: "\uBCC0\uACBD \uC774\uB825\xB7\uD65C\uB3D9 \uD53C\uB4DC. \uC720\uD615\uBCC4 \uC544\uC774\uCF58 \uC6D0\uACFC \uC5F0\uACB0\uC120\uC73C\uB85C \uC138\uB85C\uB85C \uC787\uB294\uB2E4.",
3234
+ props: [
3235
+ {
3236
+ name: "items",
3237
+ kind: "array",
3238
+ label: "\uD56D\uBAA9",
3239
+ required: true,
3240
+ bindable: true,
3241
+ group: "data",
3242
+ item: [
3243
+ { name: "id", kind: "string", label: "id", required: true },
3244
+ {
3245
+ name: "type",
3246
+ kind: "enum",
3247
+ label: "\uC720\uD615",
3248
+ default: "info",
3249
+ description: "\uC544\uC774\uCF58\uACFC \uD1A4\uC744 \uC815\uD55C\uB2E4.",
3250
+ options: [
3251
+ { value: "create", label: "\uC0DD\uC131" },
3252
+ { value: "update", label: "\uC218\uC815" },
3253
+ { value: "delete", label: "\uC0AD\uC81C" },
3254
+ { value: "info", label: "\uC815\uBCF4" }
3255
+ ]
3256
+ },
3257
+ { name: "title", kind: "node", label: "\uC81C\uBAA9", required: true },
3258
+ { name: "time", kind: "string", label: "\uC2DC\uAC01", description: "\uADF8\uB300\uB85C \uD45C\uC2DC\uD55C\uB2E4 \u2014 \uD615\uC2DD\uC740 \uC8FC\uB294 \uCABD\uC774 \uB9DE\uCD98\uB2E4." },
3259
+ { name: "description", kind: "node", label: "\uC124\uBA85" },
3260
+ {
3261
+ name: "payload",
3262
+ kind: "object",
3263
+ label: "\uD398\uC774\uB85C\uB4DC",
3264
+ description: '\uC8FC\uBA74 "\uD398\uC774\uB85C\uB4DC" \uC811\uAE30 \uBC84\uD2BC \uC544\uB798 \uC815\uB82C\uB41C JSON \uBE14\uB85D\uC73C\uB85C \uBCF4\uC5EC\uC900\uB2E4.'
3265
+ },
3266
+ { name: "actions", kind: "node", label: "\uD56D\uBAA9 \uC561\uC158", description: "\uBCF8\uBB38 \uD558\uB2E8 \uC6B0\uCE21\uC5D0 \uB193\uC778\uB2E4." }
3267
+ ]
3268
+ },
3269
+ {
3270
+ name: "maxHeight",
3271
+ kind: "string",
3272
+ label: "\uCD5C\uB300 \uB192\uC774",
3273
+ description: 'CSS \uAE38\uC774("320px"). \uB118\uC73C\uBA74 \uC138\uB85C \uC2A4\uD06C\uB864\uD55C\uB2E4.',
3274
+ group: "layout"
3275
+ }
3276
+ ],
3277
+ children: { accepts: false },
3278
+ dom: { element: "ol" },
3279
+ preset: {
3280
+ component: "Timeline",
3281
+ props: {
3282
+ items: [
3283
+ { id: "1", type: "create", title: "\uC0DD\uC131\uB428", time: "2026-01-02 09:10" },
3284
+ { id: "2", type: "update", title: "\uC0C1\uD0DC \uBCC0\uACBD", time: "2026-01-03 14:20", description: "\uB300\uAE30 \u2192 \uC9C4\uD589" }
3285
+ ]
3286
+ }
3287
+ },
3288
+ resize: { kind: "none" }
3289
+ };
3290
+ var ColumnBoardMeta = {
3291
+ name: "ColumnBoard",
3292
+ label: "\uCE78\uBC18 \uBCF4\uB4DC",
3293
+ category: "data",
3294
+ icon: "layout-grid",
3295
+ description: "\uC0C1\uD0DC\uBCC4 \uCEEC\uB7FC\uC5D0 \uCE74\uB4DC\uB97C \uB298\uC5B4\uB193\uACE0 \uC774\uB3D9\uC2DC\uD0A4\uB294 \uBCF4\uB4DC. \uB04C\uAE30 \uB300\uC2E0 \uC774\uB3D9 \uBC84\uD2BC\uC744 \uC4F4\uB2E4(\uD0A4\uBCF4\uB4DC\uB85C\uB3C4 \uC62E\uAE38 \uC218 \uC788\uB2E4).",
3296
+ props: [
3297
+ {
3298
+ name: "columns",
3299
+ kind: "array",
3300
+ label: "\uCEEC\uB7FC",
3301
+ required: true,
3302
+ bindable: true,
3303
+ group: "data",
3304
+ item: [
3305
+ { name: "key", kind: "string", label: "key", required: true, description: "\uD56D\uBAA9\uC758 column\uC774 \uC774 \uAC12\uACFC \uB9DE\uC544\uC57C \uD55C\uB2E4." },
3306
+ { name: "label", kind: "string", label: "\uD45C\uC2DC\uBA85", required: true },
3307
+ {
3308
+ name: "tone",
3309
+ kind: "enum",
3310
+ label: "\uD1A4",
3311
+ default: "neutral",
3312
+ options: [
3313
+ { value: "neutral", label: "\uAE30\uBCF8" },
3314
+ { value: "info", label: "\uC815\uBCF4" },
3315
+ { value: "success", label: "\uC131\uACF5" },
3316
+ { value: "warning", label: "\uC8FC\uC758" },
3317
+ { value: "danger", label: "\uC704\uD5D8" }
3318
+ ]
3319
+ }
3320
+ ]
3321
+ },
3322
+ {
3323
+ name: "items",
3324
+ kind: "array",
3325
+ label: "\uCE74\uB4DC",
3326
+ required: true,
3327
+ bindable: true,
3328
+ group: "data",
3329
+ item: [
3330
+ { name: "id", kind: "string", label: "id", required: true },
3331
+ { name: "column", kind: "string", label: "\uC18C\uC18D \uCEEC\uB7FC key", required: true },
3332
+ { name: "title", kind: "string", label: "\uC81C\uBAA9", required: true },
3333
+ { name: "sub", kind: "string", label: "\uBCF4\uC870 \uD14D\uC2A4\uD2B8" },
3334
+ { name: "badge", kind: "string", label: "\uBC30\uC9C0" }
3335
+ ]
3336
+ },
3337
+ {
3338
+ name: "onMove",
3339
+ kind: "action",
3340
+ label: "\uC774\uB3D9",
3341
+ eventArg: "{ id, toColumn } \uAC1D\uCCB4",
3342
+ description: "\uBC30\uC120\uD558\uC9C0 \uC54A\uC73C\uBA74 \uC774\uB3D9 \uBC84\uD2BC\uC774 \uBE44\uD65C\uC131\uC73C\uB85C \uB0A8\uB294\uB2E4.",
3343
+ group: "behavior"
3344
+ },
3345
+ { name: "onItemClick", kind: "action", label: "\uCE74\uB4DC \uD074\uB9AD", eventArg: "\uCE74\uB4DC \uAC1D\uCCB4", group: "behavior" },
3346
+ { name: "selectable", kind: "boolean", label: "\uC120\uD0DD \uAC00\uB2A5", default: false, group: "behavior" },
3347
+ {
3348
+ name: "selectedIds",
3349
+ kind: "array",
3350
+ label: "\uC120\uD0DD\uB41C \uCE74\uB4DC",
3351
+ bindable: true,
3352
+ description: "\uC8FC\uBA74 \uC81C\uC5B4 \uBAA8\uB4DC\uAC00 \uB41C\uB2E4 \u2014 \uC5C6\uC73C\uBA74 \uB0B4\uBD80 \uC0C1\uD0DC\uB85C \uB3D9\uC791\uD55C\uB2E4.",
3353
+ group: "data",
3354
+ item: [],
3355
+ itemKind: "string",
3356
+ advanced: true
3357
+ },
3358
+ { name: "onSelectChange", kind: "action", label: "\uC120\uD0DD \uBCC0\uACBD", eventArg: "\uC120\uD0DD\uB41C id \uBC30\uC5F4", group: "behavior", advanced: true }
3359
+ ],
3360
+ children: { accepts: false },
3361
+ dom: { element: "div" },
3362
+ preset: {
3363
+ component: "ColumnBoard",
3364
+ props: {
3365
+ columns: [
3366
+ { key: "todo", label: "\uB300\uAE30", tone: "neutral" },
3367
+ { key: "doing", label: "\uC9C4\uD589", tone: "info" },
3368
+ { key: "done", label: "\uC644\uB8CC", tone: "success" }
3369
+ ],
3370
+ items: [
3371
+ { id: "1", column: "todo", title: "\uD56D\uBAA9 A" },
3372
+ { id: "2", column: "doing", title: "\uD56D\uBAA9 B", sub: "\uB2F4\uB2F9 \uD64D\uAE38\uB3D9" }
3373
+ ]
3374
+ }
3375
+ },
3376
+ resize: { kind: "none" }
3377
+ };
3378
+ var DiffViewMeta = {
3379
+ name: "DiffView",
3380
+ label: "\uBCC0\uACBD \uBE44\uAD50",
3381
+ category: "data",
3382
+ icon: "split",
3383
+ description: "\uC774\uC804/\uC774\uD6C4 \uAC12\uC744 \uB098\uB780\uD788 \uB193\uACE0, \uBAA9\uB85D\uD615 \uD56D\uBAA9\uC740 \uCD94\uAC00\xB7\uC0AD\uC81C\xB7\uC720\uC9C0\uB85C \uAC08\uB77C \uBCF4\uC5EC\uC900\uB2E4.",
3384
+ props: [
3385
+ {
3386
+ name: "fields",
3387
+ kind: "array",
3388
+ label: "\uAC12 \uBE44\uAD50",
3389
+ bindable: true,
3390
+ description: "\uC774\uC804\uACFC \uC774\uD6C4\uAC00 \uAC19\uC740 \uD56D\uBAA9\uC740 \uD68C\uC0C9\uC73C\uB85C, \uB2E4\uB974\uBA74 \uAC15\uC870\uB41C\uB2E4.",
3391
+ group: "data",
3392
+ item: [
3393
+ { name: "label", kind: "string", label: "\uD56D\uBAA9\uBA85", required: true },
3394
+ { name: "before", kind: "node", label: "\uC774\uC804" },
3395
+ { name: "after", kind: "node", label: "\uC774\uD6C4" }
3396
+ ]
3397
+ },
3398
+ {
3399
+ name: "lists",
3400
+ kind: "array",
3401
+ label: "\uBAA9\uB85D \uBE44\uAD50",
3402
+ bindable: true,
3403
+ group: "data",
3404
+ item: [
3405
+ { name: "label", kind: "string", label: "\uD56D\uBAA9\uBA85", required: true },
3406
+ { name: "added", kind: "array", label: "\uCD94\uAC00\uB428", item: [], itemKind: "string" },
3407
+ { name: "removed", kind: "array", label: "\uC0AD\uC81C\uB428", item: [], itemKind: "string" },
3408
+ { name: "kept", kind: "array", label: "\uC720\uC9C0\uB428", item: [], itemKind: "string" }
3409
+ ]
3410
+ }
3411
+ ],
3412
+ children: { accepts: false },
3413
+ dom: { element: "div" },
3414
+ preset: {
3415
+ component: "DiffView",
3416
+ props: {
3417
+ fields: [
3418
+ { label: "\uC0C1\uD0DC", before: "\uB300\uAE30", after: "\uC9C4\uD589" },
3419
+ { label: "\uB2F4\uB2F9\uC790", before: "\uD64D\uAE38\uB3D9", after: "\uD64D\uAE38\uB3D9" }
3420
+ ]
3421
+ }
3422
+ },
3423
+ resize: { kind: "none" }
3424
+ };
3425
+ var EventCalendarMeta = {
3426
+ name: "EventCalendar",
3427
+ label: "\uC77C\uC815 \uB2EC\uB825",
3428
+ category: "data",
3429
+ icon: "calendar",
3430
+ description: "\uC6D4\xB7\uC8FC\xB7\uC77C\xB7\uC77C\uC815 \uBAA9\uB85D\uC73C\uB85C \uBCF4\uB294 \uB2EC\uB825. \uC720\uD615 \uCE69\uC73C\uB85C \uAC78\uB7EC \uBCFC \uC218 \uC788\uB2E4.",
3431
+ props: [
3432
+ {
3433
+ name: "events",
3434
+ kind: "array",
3435
+ label: "\uC77C\uC815",
3436
+ required: true,
3437
+ bindable: true,
3438
+ group: "data",
3439
+ item: [
3440
+ { name: "id", kind: "string", label: "id", required: true },
3441
+ { name: "title", kind: "string", label: "\uC81C\uBAA9", required: true },
3442
+ { name: "start", kind: "string", label: "\uC2DC\uC791\uC77C", required: true, description: "YYYY-MM-DD" },
3443
+ { name: "end", kind: "string", label: "\uC885\uB8CC\uC77C", description: "YYYY-MM-DD, \uADF8\uB0A0\uC744 \uD3EC\uD568\uD55C\uB2E4. \uC5C6\uC73C\uBA74 \uC2DC\uC791\uC77C\uACFC \uAC19\uB2E4." },
3444
+ { name: "type", kind: "string", label: "\uC720\uD615", description: "\uC720\uD615 \uCE69\uC758 value\uC640 \uB9DE\uCD98\uB2E4." },
3445
+ { name: "status", kind: "string", label: "\uC0C1\uD0DC", description: "\uC77C\uC815 \uBAA9\uB85D \uBDF0\uC5D0\uC11C \uBC30\uC9C0\uB85C \uBCF4\uC778\uB2E4." },
3446
+ { name: "color", kind: "color", label: "\uC0C9", description: "\uC5C6\uC73C\uBA74 \uC720\uD615\uBCC4\uB85C \uC2DC\uB9AC\uC988 \uD1A0\uD070\uC744 \uC21C\uD658 \uBC30\uC815." }
3447
+ ]
3448
+ },
3449
+ {
3450
+ name: "date",
3451
+ kind: "string",
3452
+ label: "\uAE30\uC900 \uB0A0\uC9DC",
3453
+ bindable: true,
3454
+ description: "YYYY-MM-DD. \uC0DD\uB7B5\uD558\uBA74 \uC624\uB298.",
3455
+ group: "data"
3456
+ },
3457
+ { name: "onDateChange", kind: "action", label: "\uB0A0\uC9DC \uC774\uB3D9", eventArg: "\uAE30\uC900 \uB0A0\uC9DC(YYYY-MM-DD)", group: "behavior" },
3458
+ {
3459
+ name: "view",
3460
+ kind: "enum",
3461
+ label: "\uBCF4\uAE30",
3462
+ default: "month",
3463
+ bindable: true,
3464
+ options: [
3465
+ { value: "month", label: "\uC6D4" },
3466
+ { value: "week", label: "\uC8FC" },
3467
+ { value: "day", label: "\uC77C" },
3468
+ { value: "agenda", label: "\uC77C\uC815 \uBAA9\uB85D" }
3469
+ ],
3470
+ group: "appearance"
3471
+ },
3472
+ { name: "onViewChange", kind: "action", label: "\uBCF4\uAE30 \uBCC0\uACBD", eventArg: "\uC120\uD0DD\uB41C \uBCF4\uAE30", group: "behavior" },
3473
+ {
3474
+ name: "views",
3475
+ kind: "array",
3476
+ label: "\uB178\uCD9C\uD560 \uBCF4\uAE30",
3477
+ description: '\uC0DD\uB7B5\uD558\uBA74 \uC6D4/\uC8FC/\uC77C/\uC77C\uC815 \uB137\uC774 \uB098\uC628\uB2E4. \uBB38\uC790\uC5F4 \uCD95\uC57D\uD615(["month"])\uB3C4 \uBC1B\uB294\uB2E4 \u2014 \uADF8\uB54C\uB294 \uB77C\uBCA8\uC774 \uAE30\uBCF8\uAC12\uC774\uB2E4.',
3478
+ group: "appearance",
3479
+ advanced: true,
3480
+ item: [
3481
+ {
3482
+ name: "value",
3483
+ kind: "enum",
3484
+ label: "\uBCF4\uAE30",
3485
+ required: true,
3486
+ options: [
3487
+ { value: "month", label: "\uC6D4" },
3488
+ { value: "week", label: "\uC8FC" },
3489
+ { value: "day", label: "\uC77C" },
3490
+ { value: "agenda", label: "\uC77C\uC815 \uBAA9\uB85D" }
3491
+ ]
3492
+ },
3493
+ { name: "label", kind: "string", label: "\uB77C\uBCA8" }
3494
+ ]
3495
+ },
3496
+ {
3497
+ name: "types",
3498
+ kind: "array",
3499
+ label: "\uC720\uD615 \uCE69",
3500
+ bindable: true,
3501
+ description: "\uC8FC\uBA74 \uCE69 \uD1A0\uAE00\uB85C \uD574\uB2F9 \uC720\uD615\uC758 \uC77C\uC815\uC744 \uC228\uAE30\uAC70\uB098 \uBCF4\uC778\uB2E4.",
3502
+ group: "data",
3503
+ item: [
3504
+ { name: "value", kind: "string", label: "\uAC12", required: true },
3505
+ { name: "label", kind: "string", label: "\uD45C\uC2DC", required: true },
3506
+ { name: "color", kind: "color", label: "\uC0C9" }
3507
+ ]
3508
+ },
3509
+ { name: "onEventClick", kind: "action", label: "\uC77C\uC815 \uD074\uB9AD", eventArg: "\uC77C\uC815 \uAC1D\uCCB4", group: "behavior" },
3510
+ {
3511
+ name: "selectedId",
3512
+ kind: "string",
3513
+ label: "\uC120\uD0DD\uB41C \uC77C\uC815 id",
3514
+ bindable: true,
3515
+ description: "\uC8FC\uBA74 \uC81C\uC5B4 \uBAA8\uB4DC\uAC00 \uB41C\uB2E4.",
3516
+ group: "data",
3517
+ advanced: true
3518
+ }
3519
+ ],
3520
+ children: { accepts: false },
3521
+ dom: { element: "div" },
3522
+ preset: {
3523
+ component: "EventCalendar",
3524
+ props: {
3525
+ view: "month",
3526
+ events: [
3527
+ { id: "1", title: "\uC810\uAC80", start: "2026-01-05", type: "check" },
3528
+ { id: "2", title: "\uB0A9\uD488", start: "2026-01-12", end: "2026-01-13", type: "ship" }
3529
+ ],
3530
+ types: [
3531
+ { value: "check", label: "\uC810\uAC80" },
3532
+ { value: "ship", label: "\uB0A9\uD488" }
3533
+ ]
3534
+ }
3535
+ },
3536
+ resize: { kind: "none" }
3537
+ };
3538
+ var OrgChartMeta = {
3539
+ name: "OrgChart",
3540
+ label: "\uC870\uC9C1\uB3C4",
3541
+ category: "data",
3542
+ icon: "git-branch",
3543
+ description: "\uD32C\xB7\uC90C \uB418\uB294 \uCE94\uBC84\uC2A4\uC5D0 \uC870\uC9C1 \uD2B8\uB9AC\uB97C \uADF8\uB9B0\uB2E4. \uB178\uB4DC\uB97C \uC811\uC5B4 \uD558\uC704\uB97C \uC228\uAE38 \uC218 \uC788\uB2E4.",
3544
+ props: [
3545
+ {
3546
+ name: "root",
3547
+ kind: "object",
3548
+ label: "\uCD5C\uC0C1\uC704 \uB178\uB4DC",
3549
+ required: true,
3550
+ bindable: true,
3551
+ description: "children\uC73C\uB85C \uD558\uC704\uB97C \uC787\uB294 \uC7AC\uADC0 \uAD6C\uC870\uB2E4.",
3552
+ group: "data",
3553
+ fields: [
3554
+ { name: "id", kind: "string", label: "id", required: true },
3555
+ { name: "label", kind: "string", label: "\uD45C\uC2DC\uBA85", required: true },
3556
+ { name: "sub", kind: "string", label: "\uC9C1\uCC45\xB7\uC9C1\uAE09" },
3557
+ { name: "badge", kind: "string", label: "\uBC30\uC9C0" },
3558
+ {
3559
+ name: "children",
3560
+ kind: "array",
3561
+ label: "\uD558\uC704 \uB178\uB4DC",
3562
+ description: "\uAC19\uC740 \uD615\uD0DC\uC758 \uB178\uB4DC \uBC30\uC5F4. \uC7AC\uADC0 \uAD6C\uC870\uB77C \uC5EC\uAE30\uC11C\uB294 \uD615\uD0DC\uB97C \uB354 \uD3BC\uCE58\uC9C0 \uC54A\uB294\uB2E4.",
3563
+ item: [],
3564
+ itemKind: "object"
3565
+ }
3566
+ ]
3567
+ },
3568
+ { name: "onNodeClick", kind: "action", label: "\uB178\uB4DC \uD074\uB9AD", eventArg: "\uB178\uB4DC \uAC1D\uCCB4", group: "behavior" },
3569
+ {
3570
+ name: "selectedId",
3571
+ kind: "string",
3572
+ label: "\uC120\uD0DD\uB41C \uB178\uB4DC id",
3573
+ bindable: true,
3574
+ description: "\uC8FC\uBA74 \uC81C\uC5B4 \uBAA8\uB4DC\uAC00 \uB41C\uB2E4 \u2014 \uC5C6\uC73C\uBA74 \uB0B4\uBD80 \uC120\uD0DD \uC0C1\uD0DC\uB85C \uB3D9\uC791\uD55C\uB2E4.",
3575
+ group: "data",
3576
+ advanced: true
3577
+ },
3578
+ { name: "height", kind: "number", label: "\uCE94\uBC84\uC2A4 \uB192\uC774(px)", default: 520, group: "layout" }
3579
+ ],
3580
+ children: { accepts: false },
3581
+ dom: { element: "div" },
3582
+ preset: {
3583
+ component: "OrgChart",
3584
+ props: {
3585
+ height: 520,
3586
+ root: {
3587
+ id: "root",
3588
+ label: "\uB300\uD45C\uC774\uC0AC",
3589
+ children: [
3590
+ { id: "a", label: "\uAD00\uB9AC\uBCF8\uBD80", sub: "\uBCF8\uBD80\uC7A5" },
3591
+ { id: "b", label: "\uC0AC\uC5C5\uBCF8\uBD80", sub: "\uBCF8\uBD80\uC7A5" }
3592
+ ]
3593
+ }
3594
+ }
3595
+ },
3596
+ resize: { kind: "numeric", heightProp: "height", unit: "px", axis: "y" }
3597
+ };
3598
+ var SummaryTableMeta = {
3599
+ name: "SummaryTable",
3600
+ label: "\uD569\uACC4 \uD45C",
3601
+ category: "data",
3602
+ icon: "table",
3603
+ description: "\uB9E8 \uC544\uB798 \uD569\uACC4 \uD589\uC774 \uBD99\uB294 \uD45C. \uD569\uACC4\uAC00 \uD544\uC694 \uC5C6\uC73C\uBA74 \uAE30\uBCF8 \uD45C(Table)\uB97C \uC4F4\uB2E4.",
3604
+ props: [
3605
+ {
3606
+ name: "columns",
3607
+ kind: "array",
3608
+ label: "\uCEEC\uB7FC",
3609
+ required: true,
3610
+ group: "data",
3611
+ item: [
3612
+ { name: "key", kind: "string", label: "\uD589\uC758 \uD544\uB4DC", required: true },
3613
+ { name: "header", kind: "node", label: "\uBA38\uB9AC\uAE00", required: true },
3614
+ {
3615
+ name: "align",
3616
+ kind: "enum",
3617
+ label: "\uC815\uB82C",
3618
+ options: [
3619
+ { value: "left", label: "\uC67C\uCABD" },
3620
+ { value: "right", label: "\uC624\uB978\uCABD", description: "\uC22B\uC790 \uC815\uB82C(tabular numerals)\uC774 \uD568\uAED8 \uCF1C\uC9C4\uB2E4." }
3621
+ ]
3622
+ },
3623
+ { name: "mono", kind: "boolean", label: "\uACE0\uC815\uD3ED \uAE00\uAF34" },
3624
+ { name: "strong", kind: "boolean", label: "\uAD75\uAC8C" }
3625
+ ]
3626
+ },
3627
+ {
3628
+ name: "rows",
3629
+ kind: "binding",
3630
+ label: "\uD589 \uB370\uC774\uD130",
3631
+ required: true,
3632
+ bindable: true,
3633
+ description: '\uAC1D\uCCB4 \uBC30\uC5F4. \uAC01 \uCEEC\uB7FC\uC758 key\uB85C \uAC12\uC744 \uAEBC\uB0B8\uB2E4. \uBE44\uBA74 "\uD45C\uC2DC\uD560 \uB370\uC774\uD130\uAC00 \uC5C6\uC2B5\uB2C8\uB2E4" \uD55C \uC904\uC774 \uB098\uC628\uB2E4.',
3634
+ group: "data"
3635
+ },
3636
+ {
3637
+ name: "footer",
3638
+ kind: "object",
3639
+ label: "\uD569\uACC4 \uD589",
3640
+ bindable: true,
3641
+ description: "{ \uCEEC\uB7FC key: \uD45C\uC2DC\uD560 \uAC12 }. \uC8FC\uBA74 \uD569\uACC4 \uD589\uC774 \uC0DD\uAE30\uACE0, \uC5C6\uC73C\uBA74 \uD569\uACC4 \uD589 \uC790\uCCB4\uAC00 \uC5C6\uB2E4.",
3642
+ group: "data"
3643
+ },
3644
+ { name: "dense", kind: "boolean", label: "\uC870\uBC00\uD558\uAC8C", default: false, description: "\uD589 \uB192\uC774 40px \u2192 32px", group: "appearance" }
3645
+ ],
3646
+ children: { accepts: false },
3647
+ dom: { element: "div" },
3648
+ preset: {
3649
+ component: "SummaryTable",
3650
+ props: {
3651
+ columns: [
3652
+ { key: "name", header: "\uD56D\uBAA9" },
3653
+ { key: "amount", header: "\uAE08\uC561", align: "right" }
3654
+ ],
3655
+ rows: [
3656
+ { name: "\uD56D\uBAA9 A", amount: "1,000" },
3657
+ { name: "\uD56D\uBAA9 B", amount: "2,000" }
3658
+ ],
3659
+ footer: { name: "\uD569\uACC4", amount: "3,000" }
3660
+ }
3661
+ },
3662
+ resize: { kind: "none" }
3663
+ };
3664
+ var TreeViewMeta = {
3665
+ name: "TreeView",
3666
+ label: "\uD2B8\uB9AC",
3667
+ category: "data",
3668
+ icon: "folder",
3669
+ description: "\uC811\uACE0 \uD3BC\uCE58\uB294 \uACC4\uCE35 \uBAA9\uB85D. \uAC80\uC0C9\uC744 \uCF1C\uBA74 \uC77C\uCE58\uD558\uB294 \uB178\uB4DC\uC758 \uC870\uC0C1\uC774 \uD3BC\uCCD0\uC9C4 \uCC44 \uC720\uC9C0\uB41C\uB2E4.",
3670
+ props: [
3671
+ {
3672
+ name: "nodes",
3673
+ kind: "array",
3674
+ label: "\uD2B8\uB9AC",
3675
+ required: true,
3676
+ bindable: true,
3677
+ group: "data",
3678
+ item: treeNodeItem
3679
+ },
3680
+ {
3681
+ name: "selectedId",
3682
+ kind: "string",
3683
+ label: "\uC120\uD0DD\uB41C \uB178\uB4DC id",
3684
+ bindable: true,
3685
+ description: "\uC8FC\uBA74 \uC81C\uC5B4 \uBAA8\uB4DC\uAC00 \uB41C\uB2E4 \u2014 \uB0B4\uBD80 \uC120\uD0DD \uC0C1\uD0DC\uB97C \uC4F0\uC9C0 \uC54A\uB294\uB2E4.",
3686
+ group: "data"
3687
+ },
3688
+ { name: "onSelect", kind: "action", label: "\uB178\uB4DC \uC120\uD0DD", eventArg: "\uC120\uD0DD\uB41C \uB178\uB4DC id", group: "behavior" },
3689
+ { name: "searchable", kind: "boolean", label: "\uAC80\uC0C9 \uC785\uB825", default: false, group: "behavior" },
3690
+ {
3691
+ name: "defaultExpandedDepth",
3692
+ kind: "number",
3693
+ label: "\uCD08\uAE30 \uD3BC\uCE68 \uAE4A\uC774",
3694
+ default: 1,
3695
+ description: "1\uC774\uBA74 \uCD5C\uC0C1\uC704\uB9CC \uD3BC\uCE5C\uB2E4.",
3696
+ group: "behavior"
3697
+ },
3698
+ {
3699
+ name: "excludeIds",
3700
+ kind: "array",
3701
+ label: "\uC81C\uC678\uD560 \uB178\uB4DC",
3702
+ description: "\uC5EC\uAE30 \uC801\uC740 id\uB294 \uC11C\uBE0C\uD2B8\uB9AC\uC9F8 \uC228\uB294\uB2E4.",
3703
+ group: "data",
3704
+ item: [],
3705
+ itemKind: "string"
3706
+ },
3707
+ {
3708
+ name: "maxHeight",
3709
+ kind: "string",
3710
+ label: "\uCD5C\uB300 \uB192\uC774",
3711
+ description: 'CSS \uAE38\uC774("320px"). \uB118\uC73C\uBA74 \uC138\uB85C \uC2A4\uD06C\uB864\uD55C\uB2E4.',
3712
+ group: "layout"
3713
+ }
3714
+ ],
3715
+ children: { accepts: false },
3716
+ dom: { element: "div" },
3717
+ preset: {
3718
+ component: "TreeView",
3719
+ props: {
3720
+ defaultExpandedDepth: 1,
3721
+ nodes: [
3722
+ { id: "a", label: "\uC0C1\uC704 \uD56D\uBAA9", children: [{ id: "a1", label: "\uD558\uC704 \uD56D\uBAA9" }] },
3723
+ { id: "b", label: "\uB2E4\uB978 \uD56D\uBAA9" }
3724
+ ]
3725
+ }
3726
+ },
3727
+ resize: { kind: "none" }
3728
+ };
3729
+ var PrintSheetMeta = {
3730
+ name: "PrintSheet",
3731
+ label: "\uC778\uC1C4 \uC2DC\uD2B8",
3732
+ category: "layout",
3733
+ icon: "files",
3734
+ description: "\uD654\uBA74\uC5D0\uC11C\uB294 A4 \uC885\uC774 \uCE74\uB4DC\uB85C, \uC778\uC1C4\uD558\uBA74 A4 \uC5EC\uBC31\uC5D0 \uB9DE\uCDB0 \uD3BC\uCCD0\uC9C0\uB294 \uB798\uD37C. \uC0C1\uB2E8 \uD234\uBC14\uB294 \uC778\uC1C4\uBB3C\uC5D0\uC11C \uBE60\uC9C4\uB2E4.",
3735
+ props: [
3736
+ { name: "title", kind: "string", label: "\uC2DC\uD2B8 \uC81C\uBAA9", bindable: true, group: "content" },
3737
+ {
3738
+ name: "autoPrint",
3739
+ kind: "boolean",
3740
+ label: "\uC790\uB3D9 \uC778\uC1C4",
3741
+ default: false,
3742
+ description: "\uC0C8 \uCC3D(window.opener \uC788\uC74C)\uC73C\uB85C \uC5F4\uB838\uC744 \uB54C\uB9CC \uB3D9\uC791\uD55C\uB2E4 \u2014 \uD398\uC774\uC9C0 \uC548\uC5D0 \uB07C\uC6CC \uB123\uC740 \uACBD\uC6B0\uC5D0\uB294 \uC544\uBB34 \uC77C\uB3C4 \uC5C6\uB2E4.",
3743
+ group: "behavior"
3744
+ }
3745
+ ],
3746
+ children: { accepts: true, text: true, label: "\uC885\uC774\uC5D0 \uC5B9\uC744 \uB0B4\uC6A9" },
3747
+ dom: { element: "div", childElement: "section" },
3748
+ preset: {
3749
+ component: "PrintSheet",
3750
+ props: { title: "\uAC70\uB798\uBA85\uC138\uC11C" },
3751
+ children: [
3752
+ {
3753
+ component: "KeyValueList",
3754
+ props: {
3755
+ items: [
3756
+ { label: "\uBB38\uC11C\uBC88\uD638", value: "DOC-0001" },
3757
+ { label: "\uC791\uC131\uC77C", value: "2026-01-02" }
3758
+ ]
3759
+ }
3760
+ }
3761
+ ]
3762
+ },
3763
+ resize: { kind: "none" }
3764
+ };
3765
+ var SecureScreenMeta = {
3766
+ name: "SecureScreen",
3767
+ label: "\uD654\uBA74 \uBCF4\uD638",
3768
+ category: "layout",
3769
+ icon: "shield-check",
3770
+ description: "\uB0B4\uC6A9\uC5D0 \uC6B0\uD074\uB9AD\xB7\uBCF5\uC0AC\xB7\uB4DC\uB798\uADF8\uB97C \uB9C9\uACE0 \uC6CC\uD130\uB9C8\uD06C\uB97C \uC5B9\uB294\uB2E4. \uCC3D\uC744 \uBC97\uC5B4\uB098\uBA74 \uAC00\uB9BC\uB9C9\uC774 \uB36E\uC778\uB2E4.",
3771
+ props: [
3772
+ {
3773
+ name: "enabled",
3774
+ kind: "boolean",
3775
+ label: "\uBCF4\uD638 \uCF1C\uAE30",
3776
+ default: true,
3777
+ bindable: true,
3778
+ description: "false\uBA74 \uC544\uBB34 \uC81C\uC57D \uC5C6\uC774 \uC790\uC2DD\uC744 \uADF8\uB300\uB85C \uADF8\uB9B0\uB2E4.",
3779
+ group: "behavior"
3780
+ },
3781
+ { name: "notice", kind: "string", label: "\uAC00\uB9BC\uB9C9 \uBB38\uAD6C", group: "content" }
3782
+ ],
3783
+ children: { accepts: true, text: true, label: "\uBCF4\uD638\uD560 \uB0B4\uC6A9" },
3784
+ dom: { element: "div" },
3785
+ preset: {
3786
+ component: "SecureScreen",
3787
+ props: { notice: "\uBCF4\uC548 \uD654\uBA74\uC785\uB2C8\uB2E4" },
3788
+ children: [{ component: "Text", props: { preset: "body" }, children: ["\uBCF4\uD638\uB418\uB294 \uB0B4\uC6A9"] }]
3789
+ },
3790
+ resize: { kind: "none" }
3791
+ };
3792
+ var StripMeta = {
3793
+ name: "Strip",
3794
+ label: "\uAC00\uB85C \uC2A4\uD2B8\uB9BD",
3795
+ category: "layout",
3796
+ icon: "arrow-right",
3797
+ description: "\uC790\uC2DD\uC744 \uC904\uBC14\uAFC8 \uC5C6\uC774 \uD55C \uC904\uB85C \uB298\uC5B4\uB193\uACE0 \uAC00\uB85C\uB85C \uC2A4\uD06C\uB864\uD55C\uB2E4. \uCE74\uB4DC \uCE90\uB7EC\uC140 \uAC19\uC740 \uC790\uB9AC\uC5D0 \uC4F4\uB2E4.",
3798
+ props: [
3799
+ {
3800
+ name: "gap",
3801
+ kind: "string",
3802
+ label: "\uD56D\uBAA9 \uAC04\uACA9",
3803
+ default: "var(--wp-space-3)",
3804
+ description: "CSS \uAE38\uC774. \uAC04\uACA9 \uD1A0\uD070(var(--wp-space-N))\uC744 \uC4F0\uB294 \uD3B8\uC774 \uB0AB\uB2E4.",
3805
+ group: "layout"
3806
+ },
3807
+ {
3808
+ name: "snap",
3809
+ kind: "boolean",
3810
+ label: "\uC2A4\uD06C\uB864 \uC2A4\uB0C5",
3811
+ default: false,
3812
+ description: "\uD56D\uBAA9 \uC2DC\uC791\uC810\uC5D0 \uB531 \uB9DE\uCDB0 \uBA48\uCD98\uB2E4.",
3813
+ group: "behavior"
3814
+ }
3815
+ ],
3816
+ children: { accepts: true, label: "\uD55C \uC904\uB85C \uB298\uC5B4\uB193\uC744 \uD56D\uBAA9\uB4E4" },
3817
+ dom: { element: "div" },
3818
+ preset: {
3819
+ component: "Strip",
3820
+ props: { gap: "var(--wp-space-3)" },
3821
+ children: [
3822
+ { component: "Card", props: { title: "\uCE74\uB4DC 1" } },
3823
+ { component: "Card", props: { title: "\uCE74\uB4DC 2" } },
3824
+ { component: "Card", props: { title: "\uCE74\uB4DC 3" } }
3825
+ ]
3826
+ },
3827
+ resize: { kind: "none" }
3828
+ };
3829
+ var widgetComponentMeta = {
3830
+ AutocompleteField: AutocompleteFieldMeta,
3831
+ ColumnBoard: ColumnBoardMeta,
3832
+ DiffView: DiffViewMeta,
3833
+ Disclosure: DisclosureMeta,
3834
+ EventCalendar: EventCalendarMeta,
3835
+ ImageLightbox: ImageLightboxMeta,
3836
+ InlineEdit: InlineEditMeta,
3837
+ JsonField: JsonFieldMeta,
3838
+ LiveClock: LiveClockMeta,
3839
+ OrgChart: OrgChartMeta,
3840
+ PeriodFilter: PeriodFilterMeta,
3841
+ PrintSheet: PrintSheetMeta,
3842
+ SearchableMultiPicker: SearchableMultiPickerMeta,
3843
+ SecureScreen: SecureScreenMeta,
3844
+ StackedMeter: StackedMeterMeta,
3845
+ Strip: StripMeta,
3846
+ SummaryTable: SummaryTableMeta,
3847
+ TagMultiSelect: TagMultiSelectMeta,
3848
+ Timeline: TimelineMeta,
3849
+ TreePicker: TreePickerMeta,
3850
+ TreeView: TreeViewMeta
3851
+ };
3852
+
2249
3853
  // src/meta/index.ts
2250
3854
  var SDUI_CATEGORIES = [
2251
3855
  { id: "layout", label: "\uB808\uC774\uC544\uC6C3" },
@@ -2258,6 +3862,8 @@ var SDUI_CATEGORIES = [
2258
3862
  var allComponentMeta = {
2259
3863
  ...coreComponentMeta,
2260
3864
  ...richComponentMeta,
3865
+ ...widgetComponentMeta,
3866
+ ...dsComponentMeta,
2261
3867
  ...builtinComponentMeta
2262
3868
  };
2263
3869
  function getComponentMeta(name, catalog = allComponentMeta) {
@@ -2277,4 +3883,4 @@ function paletteGroups(catalog = allComponentMeta) {
2277
3883
  })).filter((group) => group.items.length > 0);
2278
3884
  }
2279
3885
 
2280
- export { ActionsMeta, AlertMeta, BadgeMeta, ButtonMeta, CanMeta, CardMeta, ChartMeta, CheckboxMeta, ColMeta, DatePickerMeta, DateRangePickerMeta, DialogMeta, DividerMeta, EmptyStateMeta, FieldMeta, ForEachMeta, FormMeta, GridMeta, IconButtonMeta, IconMeta, InputMeta, KeyValueListMeta, MapPreviewMeta, PageHeadMeta, PaginationMeta, ProgressBarMeta, RemoteSearchResultsMeta, RowMeta, SDUI_CATEGORIES, SearchResultsMeta, SectionMeta, SelectMeta, ShowMeta, SpacerMeta, SpinnerMeta, StatCardMeta, SwitchMeta, TableMeta, TabsMeta, TagMeta, TextMeta, TextareaMeta, ToastMeta, allComponentMeta, builtinComponentMeta, coreComponentMeta, getComponentMeta, paletteGroups, richComponentMeta, slotNamesOf };
3886
+ export { ActionsMeta, AlertMeta, AutocompleteFieldMeta, AvatarMeta, BadgeMeta, BreadcrumbMeta, ButtonMeta, CanMeta, CardMeta, ChartMeta, CheckboxMeta, ColMeta, ColumnBoardMeta, DatePickerMeta, DateRangePickerMeta, DialogMeta, DiffViewMeta, DisclosureMeta, DividerMeta, EmptyStateMeta, EventCalendarMeta, FieldMeta, ForEachMeta, FormMeta, GridMeta, IconButtonMeta, IconMeta, ImageLightboxMeta, InlineEditMeta, InputMeta, JsonFieldMeta, KeyValueListMeta, LiveClockMeta, MapPreviewMeta, OrgChartMeta, PageHeadMeta, PaginationMeta, PeriodFilterMeta, PrintSheetMeta, ProgressBarMeta, RadioMeta, RemoteSearchResultsMeta, RowMeta, SDUI_CATEGORIES, SearchResultsMeta, SearchableMultiPickerMeta, SectionMeta, SecureScreenMeta, SegmentedControlMeta, SelectMeta, ShowMeta, SidebarNavMeta, SpacerMeta, SpinnerMeta, StackedMeterMeta, StatCardMeta, StripMeta, SummaryTableMeta, SwitchMeta, TableMeta, TabsMeta, TagMeta, TagMultiSelectMeta, TextMeta, TextareaMeta, TimelineMeta, ToastMeta, TooltipMeta, TreePickerMeta, TreeViewMeta, allComponentMeta, builtinComponentMeta, coreComponentMeta, dsComponentMeta, getComponentMeta, paletteGroups, richComponentMeta, slotNamesOf, widgetComponentMeta };