@spectrabrain/eds 0.0.2 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,299 @@
1
+ {
2
+ "specVersion": 1,
3
+ "packageVersion": "0.0.4",
4
+ "name": "Button",
5
+ "purpose": "사용자가 즉시 실행할 수 있는 행동과 탐색을 표현하는 인터랙티브 요소입니다.",
6
+ "usageContexts": [
7
+ "상태 변경·폼 제출·명령 실행에는 native button branch를 사용합니다.",
8
+ "다른 페이지나 콘텐츠로 이동하는 탐색에는 neutral/link branch를 사용합니다.",
9
+ "brand는 화면에서 가장 중요한 행동을 강조할 때 사용합니다.",
10
+ "neutral은 일반적인 액션과 탐색에 사용합니다.",
11
+ "critical은 삭제·초기화처럼 되돌리기 어려운 행동에 사용합니다.",
12
+ "icon-only의 접근성 이름을 제공하려면 aria-label을 지정합니다. aria-label은 필수로 강제하지 않습니다."
13
+ ],
14
+ "unsupportedContexts": [
15
+ "문서에 없는 role·variant·상태를 className이나 inline style로 우회하지 않습니다.",
16
+ "상태 변경이나 일반 CTA를 neutral/link로 표현하지 않습니다."
17
+ ],
18
+ "api": {
19
+ "props": [
20
+ {
21
+ "name": "size",
22
+ "type": "ButtonSize",
23
+ "required": true,
24
+ "description": "버튼 크기입니다."
25
+ },
26
+ {
27
+ "name": "role",
28
+ "type": "ButtonRole",
29
+ "required": true,
30
+ "description": "시각적 역할입니다."
31
+ },
32
+ {
33
+ "name": "variant",
34
+ "type": "ButtonVariant",
35
+ "required": true,
36
+ "description": "role에 종속된 시각적 위계입니다."
37
+ },
38
+ {
39
+ "name": "type",
40
+ "type": "NativeButtonType",
41
+ "required": true,
42
+ "branch": "native button",
43
+ "description": "native button의 동작 유형입니다."
44
+ },
45
+ {
46
+ "name": "href",
47
+ "type": "string",
48
+ "required": true,
49
+ "branch": "neutral/link",
50
+ "description": "탐색 대상 주소입니다."
51
+ },
52
+ {
53
+ "name": "children",
54
+ "type": "ReactNode",
55
+ "required": false,
56
+ "description": "text label입니다."
57
+ },
58
+ {
59
+ "name": "icon",
60
+ "type": "ReactElement",
61
+ "required": false,
62
+ "description": "icon-only용 custom 아이콘입니다."
63
+ },
64
+ {
65
+ "name": "iconName",
66
+ "type": "ButtonIconName",
67
+ "required": false,
68
+ "description": "icon-only용 lucide 아이콘 이름입니다."
69
+ },
70
+ {
71
+ "name": "startIcon",
72
+ "type": "ReactElement",
73
+ "required": false,
74
+ "description": "label 앞의 custom 아이콘입니다."
75
+ },
76
+ {
77
+ "name": "startIconName",
78
+ "type": "ButtonIconName",
79
+ "required": false,
80
+ "description": "label 앞의 lucide 아이콘 이름입니다."
81
+ },
82
+ {
83
+ "name": "endIcon",
84
+ "type": "ReactElement",
85
+ "required": false,
86
+ "description": "label 뒤의 custom 아이콘입니다."
87
+ },
88
+ {
89
+ "name": "endIconName",
90
+ "type": "ButtonIconName",
91
+ "required": false,
92
+ "description": "label 뒤의 lucide 아이콘 이름입니다."
93
+ },
94
+ {
95
+ "name": "aria-label",
96
+ "type": "string",
97
+ "required": false,
98
+ "description": "accessible name입니다. icon-only의 접근성 이름을 제공할 때 사용합니다."
99
+ },
100
+ {
101
+ "name": "disabled",
102
+ "type": "boolean",
103
+ "required": false,
104
+ "description": "사용할 수 없는 상태입니다."
105
+ },
106
+ {
107
+ "name": "loading",
108
+ "type": "boolean",
109
+ "required": false,
110
+ "description": "처리 중 상태입니다."
111
+ },
112
+ {
113
+ "name": "className",
114
+ "type": "string",
115
+ "required": false,
116
+ "description": "배치·컨테이너 보정용 class입니다."
117
+ },
118
+ {
119
+ "name": "ref",
120
+ "type": "Ref<HTMLButtonElement | HTMLAnchorElement>",
121
+ "required": false,
122
+ "description": "native element ref입니다."
123
+ }
124
+ ],
125
+ "sizes": [
126
+ "xs",
127
+ "sm",
128
+ "md"
129
+ ],
130
+ "roleVariants": {
131
+ "brand": [
132
+ "solid",
133
+ "outline"
134
+ ],
135
+ "neutral": [
136
+ "solid",
137
+ "weak",
138
+ "outline",
139
+ "ghost",
140
+ "link"
141
+ ],
142
+ "critical": [
143
+ "weak"
144
+ ]
145
+ },
146
+ "states": [
147
+ "enabled",
148
+ "hover",
149
+ "disabled",
150
+ "loading",
151
+ "focus-visible"
152
+ ],
153
+ "slots": {
154
+ "textOnly": "children만 제공합니다.",
155
+ "iconFirst": "children과 startIcon 또는 startIconName을 제공합니다.",
156
+ "iconLast": "children과 endIcon 또는 endIconName을 제공합니다.",
157
+ "iconBoth": "children과 앞·뒤 아이콘을 모두 제공합니다.",
158
+ "iconOnly": "children 없이 icon 또는 iconName을 제공합니다. 접근성 이름이 필요하면 aria-label을 지정합니다."
159
+ },
160
+ "typeExports": [
161
+ "ButtonProps",
162
+ "ButtonComponent",
163
+ "ButtonIconName",
164
+ "ButtonLayout",
165
+ "ButtonRole",
166
+ "ButtonSize",
167
+ "ButtonVariant",
168
+ "NativeButtonType"
169
+ ]
170
+ },
171
+ "accessibility": {
172
+ "nativeButtonType": "native button branch에서는 type을 필수로 지정합니다.",
173
+ "linkHref": "neutral/link branch에서는 href를 필수로 지정합니다.",
174
+ "iconOnlyName": "icon-only layout에서는 접근성 이름을 제공할 때 비어 있지 않은 aria-label을 지정합니다. aria-label은 필수가 아닙니다.",
175
+ "disabledLink": "비활성 link는 href를 제거하고 aria-disabled와 tabIndex를 적용합니다.",
176
+ "loading": "loading 중에는 aria-busy를 적용하고 상호작용을 차단합니다.",
177
+ "focusVisible": "keyboard focus에는 승인된 focus ring을 표시합니다."
178
+ },
179
+ "semanticTokens": [
180
+ {
181
+ "name": "color-bg-brand-primary",
182
+ "usage": "brand solid의 기본 배경입니다."
183
+ },
184
+ {
185
+ "name": "color-bg-brand-primary-hover",
186
+ "usage": "brand solid의 hover 배경입니다."
187
+ },
188
+ {
189
+ "name": "color-bg-critical-weak",
190
+ "usage": "critical weak의 기본 배경입니다."
191
+ },
192
+ {
193
+ "name": "color-bg-critical-weak-hover",
194
+ "usage": "critical weak의 hover 배경입니다."
195
+ },
196
+ {
197
+ "name": "color-bg-disabled",
198
+ "usage": "비활성 배경입니다."
199
+ },
200
+ {
201
+ "name": "color-bg-neutral-inverted",
202
+ "usage": "neutral solid의 기본 배경입니다."
203
+ },
204
+ {
205
+ "name": "color-bg-neutral-inverted-hover",
206
+ "usage": "neutral solid의 hover 배경입니다."
207
+ },
208
+ {
209
+ "name": "color-bg-neutral-weak",
210
+ "usage": "neutral weak의 기본 배경입니다."
211
+ },
212
+ {
213
+ "name": "color-bg-neutral-weak-hover",
214
+ "usage": "neutral weak의 hover 배경입니다."
215
+ },
216
+ {
217
+ "name": "color-bg-transparent",
218
+ "usage": "outline·ghost·link의 투명 배경입니다."
219
+ },
220
+ {
221
+ "name": "color-bg-transparent-hover",
222
+ "usage": "outline·ghost·link의 hover 배경입니다."
223
+ },
224
+ {
225
+ "name": "color-fg-brand",
226
+ "usage": "brand outline의 전경입니다."
227
+ },
228
+ {
229
+ "name": "color-fg-critical",
230
+ "usage": "critical weak의 전경입니다."
231
+ },
232
+ {
233
+ "name": "color-fg-disabled",
234
+ "usage": "비활성 전경입니다."
235
+ },
236
+ {
237
+ "name": "color-fg-neutral",
238
+ "usage": "neutral outline·ghost·link의 전경입니다."
239
+ },
240
+ {
241
+ "name": "color-fg-neutral-inverted",
242
+ "usage": "solid variant의 대비 전경입니다."
243
+ },
244
+ {
245
+ "name": "color-stroke-focusRing",
246
+ "usage": "focus-visible ring의 전경입니다."
247
+ },
248
+ {
249
+ "name": "color-stroke-neutral-secondary",
250
+ "usage": "neutral outline의 경계선입니다."
251
+ },
252
+ {
253
+ "name": "typography-body3-fontFamily",
254
+ "usage": "xs label의 글꼴입니다."
255
+ },
256
+ {
257
+ "name": "typography-body3-fontSize",
258
+ "usage": "xs label의 글꼴 크기입니다."
259
+ },
260
+ {
261
+ "name": "typography-body3-fontWeight",
262
+ "usage": "xs label의 글꼴 두께입니다."
263
+ },
264
+ {
265
+ "name": "typography-body3-letterSpacing",
266
+ "usage": "xs label의 자간입니다."
267
+ },
268
+ {
269
+ "name": "typography-body3-lineHeight",
270
+ "usage": "xs label의 행간입니다."
271
+ },
272
+ {
273
+ "name": "typography-title3-fontFamily",
274
+ "usage": "sm·md label의 글꼴입니다."
275
+ },
276
+ {
277
+ "name": "typography-title3-fontSize",
278
+ "usage": "sm·md label의 글꼴 크기입니다."
279
+ },
280
+ {
281
+ "name": "typography-title3-fontWeight",
282
+ "usage": "sm·md label의 글꼴 두께입니다."
283
+ },
284
+ {
285
+ "name": "typography-title3-letterSpacing",
286
+ "usage": "sm·md label의 자간입니다."
287
+ },
288
+ {
289
+ "name": "typography-title3-lineHeight",
290
+ "usage": "sm·md label의 행간입니다."
291
+ }
292
+ ],
293
+ "unsupportedProps": [
294
+ {
295
+ "name": "style",
296
+ "reason": "공개 스타일 override를 제공하지 않습니다."
297
+ }
298
+ ]
299
+ }
@@ -309,22 +309,29 @@
309
309
 
310
310
  .eds-button__progressCircle {
311
311
  position: absolute;
312
- inset: 0;
312
+ top: 50%;
313
+ left: 50%;
313
314
  display: none;
314
315
  align-items: center;
315
316
  justify-content: center;
317
+ transform: translate(-50%, -50%);
316
318
  pointer-events: none;
317
319
  }
318
320
 
319
321
  .eds-button__button[data-loading="true"] .eds-button__progressCircle {
320
322
  display: inline-flex;
321
- animation: eds-button__eds-button-progress-spin 800ms linear infinite;
322
- transform-origin: center;
323
- will-change: transform;
324
323
  }
325
324
 
326
325
  .eds-button__progressCircle > svg {
327
326
  display: block;
327
+ width: 100%;
328
+ height: 100%;
329
+ transform-origin: center;
330
+ }
331
+
332
+ .eds-button__button[data-loading="true"] .eds-button__progressCircle > svg {
333
+ animation: eds-button__eds-button-progress-spin 800ms linear infinite;
334
+ will-change: transform;
328
335
  }
329
336
 
330
337
  .eds-button__progressTrack,
@@ -332,12 +339,12 @@
332
339
  stroke-width: var(--eds-button-size-xs-progressCircle-thickness);
333
340
  }
334
341
 
335
- .eds-button__button[data-size="xs"] .eds-button__progressCircle > svg {
342
+ .eds-button__button[data-size="xs"] .eds-button__progressCircle {
336
343
  width: var(--eds-button-size-xs-progressCircle-size);
337
344
  height: var(--eds-button-size-xs-progressCircle-size);
338
345
  }
339
346
 
340
- .eds-button__button[data-size="sm"] .eds-button__progressCircle > svg {
347
+ .eds-button__button[data-size="sm"] .eds-button__progressCircle {
341
348
  width: var(--eds-button-size-sm-progressCircle-size);
342
349
  height: var(--eds-button-size-sm-progressCircle-size);
343
350
  }
@@ -347,7 +354,7 @@
347
354
  stroke-width: var(--eds-button-size-sm-progressCircle-thickness);
348
355
  }
349
356
 
350
- .eds-button__button[data-size="md"] .eds-button__progressCircle > svg {
357
+ .eds-button__button[data-size="md"] .eds-button__progressCircle {
351
358
  width: var(--eds-button-size-md-progressCircle-size);
352
359
  height: var(--eds-button-size-md-progressCircle-size);
353
360
  }
@@ -364,7 +371,7 @@
364
371
  }
365
372
 
366
373
  @media (prefers-reduced-motion: reduce) {
367
- .eds-button__progressCircle {
374
+ .eds-button__progressCircle > svg {
368
375
  animation: none;
369
376
  will-change: auto;
370
377
  }
package/dist/index.d.mts CHANGED
@@ -48,7 +48,7 @@ type IconOnlySlotProps = {
48
48
  readonly startIconName?: never;
49
49
  readonly endIcon?: never;
50
50
  readonly endIconName?: never;
51
- readonly "aria-label": string;
51
+ readonly "aria-label"?: string;
52
52
  } & ({
53
53
  readonly icon: ReactElement;
54
54
  readonly iconName?: never;
package/dist/index.d.ts CHANGED
@@ -48,7 +48,7 @@ type IconOnlySlotProps = {
48
48
  readonly startIconName?: never;
49
49
  readonly endIcon?: never;
50
50
  readonly endIconName?: never;
51
- readonly "aria-label": string;
51
+ readonly "aria-label"?: string;
52
52
  } & ({
53
53
  readonly icon: ReactElement;
54
54
  readonly iconName?: never;
package/dist/index.js CHANGED
@@ -18,6 +18,18 @@ var tokenMap = {
18
18
  "value": "#DB3700",
19
19
  "cssVariable": "--eds-color-bg-brand-primary-hover"
20
20
  },
21
+ "color-bg-brand-weak": {
22
+ "name": "color-bg-brand-weak",
23
+ "type": "color",
24
+ "value": "#FFA081",
25
+ "cssVariable": "--eds-color-bg-brand-weak"
26
+ },
27
+ "color-bg-brand-weak-hover": {
28
+ "name": "color-bg-brand-weak-hover",
29
+ "type": "color",
30
+ "value": "#FF7141",
31
+ "cssVariable": "--eds-color-bg-brand-weak-hover"
32
+ },
21
33
  "color-bg-critical-primary": {
22
34
  "name": "color-bg-critical-primary",
23
35
  "type": "color",
@@ -33,13 +45,13 @@ var tokenMap = {
33
45
  "color-bg-critical-weak": {
34
46
  "name": "color-bg-critical-weak",
35
47
  "type": "color",
36
- "value": "#FEF2F2",
48
+ "value": "#FEE2E2",
37
49
  "cssVariable": "--eds-color-bg-critical-weak"
38
50
  },
39
51
  "color-bg-critical-weak-hover": {
40
52
  "name": "color-bg-critical-weak-hover",
41
53
  "type": "color",
42
- "value": "#FEE2E2",
54
+ "value": "#FECACA",
43
55
  "cssVariable": "--eds-color-bg-critical-weak-hover"
44
56
  },
45
57
  "color-bg-disabled": {
@@ -63,13 +75,13 @@ var tokenMap = {
63
75
  "color-bg-informative-weak": {
64
76
  "name": "color-bg-informative-weak",
65
77
  "type": "color",
66
- "value": "#EFF6FF",
78
+ "value": "#DBEAFE",
67
79
  "cssVariable": "--eds-color-bg-informative-weak"
68
80
  },
69
81
  "color-bg-informative-weak-hover": {
70
82
  "name": "color-bg-informative-weak-hover",
71
83
  "type": "color",
72
- "value": "#DBEAFE",
84
+ "value": "#BFDBFE",
73
85
  "cssVariable": "--eds-color-bg-informative-weak-hover"
74
86
  },
75
87
  "color-bg-layer-basement": {
@@ -78,6 +90,12 @@ var tokenMap = {
78
90
  "value": "#F3F4F6",
79
91
  "cssVariable": "--eds-color-bg-layer-basement"
80
92
  },
93
+ "color-bg-layer-basement-hover": {
94
+ "name": "color-bg-layer-basement-hover",
95
+ "type": "color",
96
+ "value": "#ECEEF1",
97
+ "cssVariable": "--eds-color-bg-layer-basement-hover"
98
+ },
81
99
  "color-bg-layer-default": {
82
100
  "name": "color-bg-layer-default",
83
101
  "type": "color",
@@ -153,13 +171,13 @@ var tokenMap = {
153
171
  "color-bg-positive-weak": {
154
172
  "name": "color-bg-positive-weak",
155
173
  "type": "color",
156
- "value": "#F0FDF4",
174
+ "value": "#DCFCE7",
157
175
  "cssVariable": "--eds-color-bg-positive-weak"
158
176
  },
159
177
  "color-bg-positive-weak-hover": {
160
178
  "name": "color-bg-positive-weak-hover",
161
179
  "type": "color",
162
- "value": "#DCFCE7",
180
+ "value": "#BBF7D0",
163
181
  "cssVariable": "--eds-color-bg-positive-weak-hover"
164
182
  },
165
183
  "color-bg-transparent": {
@@ -189,13 +207,13 @@ var tokenMap = {
189
207
  "color-bg-warning-weak": {
190
208
  "name": "color-bg-warning-weak",
191
209
  "type": "color",
192
- "value": "#FEFCE8",
210
+ "value": "#FEF9C3",
193
211
  "cssVariable": "--eds-color-bg-warning-weak"
194
212
  },
195
213
  "color-bg-warning-weak-hover": {
196
214
  "name": "color-bg-warning-weak-hover",
197
215
  "type": "color",
198
- "value": "#FEF9C3",
216
+ "value": "#FEF08A",
199
217
  "cssVariable": "--eds-color-bg-warning-weak-hover"
200
218
  },
201
219
  "color-fg-brand": {
@@ -297,7 +315,7 @@ var tokenMap = {
297
315
  "color-fg-warning-contrast": {
298
316
  "name": "color-fg-warning-contrast",
299
317
  "type": "color",
300
- "value": "#713F12",
318
+ "value": "#A16207",
301
319
  "cssVariable": "--eds-color-fg-warning-contrast"
302
320
  },
303
321
  "color-stroke-brand-primary": {
@@ -357,9 +375,15 @@ var tokenMap = {
357
375
  "color-stroke-neutral-secondary": {
358
376
  "name": "color-stroke-neutral-secondary",
359
377
  "type": "color",
360
- "value": "#E5E7EB",
378
+ "value": "#9CA3AF",
361
379
  "cssVariable": "--eds-color-stroke-neutral-secondary"
362
380
  },
381
+ "color-stroke-neutral-tertiary": {
382
+ "name": "color-stroke-neutral-tertiary",
383
+ "type": "color",
384
+ "value": "#E5E7EB",
385
+ "cssVariable": "--eds-color-stroke-neutral-tertiary"
386
+ },
363
387
  "color-stroke-neutral-weak": {
364
388
  "name": "color-stroke-neutral-weak",
365
389
  "type": "color",
@@ -906,6 +930,49 @@ var tokenMap = {
906
930
  },
907
931
  "cssVariable": "--eds-typography-heading3-lineHeight"
908
932
  },
933
+ "typography-heading4-fontFamily": {
934
+ "name": "typography-heading4-fontFamily",
935
+ "type": "fontFamily",
936
+ "value": [
937
+ "Pretendard",
938
+ "system-ui",
939
+ "sans-serif"
940
+ ],
941
+ "cssVariable": "--eds-typography-heading4-fontFamily"
942
+ },
943
+ "typography-heading4-fontSize": {
944
+ "name": "typography-heading4-fontSize",
945
+ "type": "dimension",
946
+ "value": {
947
+ "value": 1.25,
948
+ "unit": "rem"
949
+ },
950
+ "cssVariable": "--eds-typography-heading4-fontSize"
951
+ },
952
+ "typography-heading4-fontWeight": {
953
+ "name": "typography-heading4-fontWeight",
954
+ "type": "fontWeight",
955
+ "value": 550,
956
+ "cssVariable": "--eds-typography-heading4-fontWeight"
957
+ },
958
+ "typography-heading4-letterSpacing": {
959
+ "name": "typography-heading4-letterSpacing",
960
+ "type": "dimension",
961
+ "value": {
962
+ "value": -0.2,
963
+ "unit": "px"
964
+ },
965
+ "cssVariable": "--eds-typography-heading4-letterSpacing"
966
+ },
967
+ "typography-heading4-lineHeight": {
968
+ "name": "typography-heading4-lineHeight",
969
+ "type": "dimension",
970
+ "value": {
971
+ "value": 2,
972
+ "unit": "rem"
973
+ },
974
+ "cssVariable": "--eds-typography-heading4-lineHeight"
975
+ },
909
976
  "typography-title1-fontFamily": {
910
977
  "name": "typography-title1-fontFamily",
911
978
  "type": "fontFamily",
@@ -1083,6 +1150,8 @@ var tokens = Object.freeze(tokenMap);
1083
1150
  var tokenNames = Object.freeze([
1084
1151
  "color-bg-brand-primary",
1085
1152
  "color-bg-brand-primary-hover",
1153
+ "color-bg-brand-weak",
1154
+ "color-bg-brand-weak-hover",
1086
1155
  "color-bg-critical-primary",
1087
1156
  "color-bg-critical-primary-hover",
1088
1157
  "color-bg-critical-weak",
@@ -1093,6 +1162,7 @@ var tokenNames = Object.freeze([
1093
1162
  "color-bg-informative-weak",
1094
1163
  "color-bg-informative-weak-hover",
1095
1164
  "color-bg-layer-basement",
1165
+ "color-bg-layer-basement-hover",
1096
1166
  "color-bg-layer-default",
1097
1167
  "color-bg-layer-default-hover",
1098
1168
  "color-bg-layer-floating",
@@ -1140,6 +1210,7 @@ var tokenNames = Object.freeze([
1140
1210
  "color-stroke-neutral-contrast",
1141
1211
  "color-stroke-neutral-primary",
1142
1212
  "color-stroke-neutral-secondary",
1213
+ "color-stroke-neutral-tertiary",
1143
1214
  "color-stroke-neutral-weak",
1144
1215
  "color-stroke-positive-primary",
1145
1216
  "color-stroke-positive-weak",
@@ -1205,6 +1276,11 @@ var tokenNames = Object.freeze([
1205
1276
  "typography-heading3-fontWeight",
1206
1277
  "typography-heading3-letterSpacing",
1207
1278
  "typography-heading3-lineHeight",
1279
+ "typography-heading4-fontFamily",
1280
+ "typography-heading4-fontSize",
1281
+ "typography-heading4-fontWeight",
1282
+ "typography-heading4-letterSpacing",
1283
+ "typography-heading4-lineHeight",
1208
1284
  "typography-title1-fontFamily",
1209
1285
  "typography-title1-fontSize",
1210
1286
  "typography-title1-fontWeight",
@@ -7553,11 +7629,6 @@ function hasRenderableContent(value) {
7553
7629
  }
7554
7630
  return react.Children.count(value) > 0;
7555
7631
  }
7556
- function requireAccessibleIconLabel(label) {
7557
- if (label === void 0 || label.trim().length === 0) {
7558
- throw new Error("Button icon-only layout requires a non-empty aria-label.");
7559
- }
7560
- }
7561
7632
  function requireLinkHref(href) {
7562
7633
  if (href.trim().length === 0) {
7563
7634
  throw new Error("Button link variant requires a non-empty href.");
@@ -7599,7 +7670,6 @@ function resolveSlots(props) {
7599
7670
  if (hasChildren || startIcon !== void 0 || endIcon !== void 0) {
7600
7671
  throw new Error("Button icon-only layout cannot combine icon with children or start/end icons.");
7601
7672
  }
7602
- requireAccessibleIconLabel(ariaLabel);
7603
7673
  return { layout: "iconOnly", children, icon };
7604
7674
  }
7605
7675
  if (hasChildren === false) {