@newtil/materials 0.4.11 → 0.4.14

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/spec.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "$schema": "newtil-component-spec/1",
3
3
  "package": "@newtil/materials",
4
- "version": "0.4.11",
4
+ "version": "0.4.14",
5
5
  "generatedAt": "2026-09-17",
6
6
  "conventions": {
7
- "option": "클래스 `그룹:값` — 예 `btn:outlined`, `btn-size:sm`. 값이 없는 옵션은 flags.",
7
+ "option": "클래스 `그룹:값` — 예 `btn:outlined`, `btn-size:sm`. 값이 없는 옵션은 flags. slotOptions 는 슬롯 요소에 붙이는 옵션 (예 card-media 에 `card-media:square`).",
8
8
  "variable": "컴포넌트 요소 자신에 준다: 인라인 style 또는 `.scope .m3-x { --x-*: … }`. 부모 요소의 style 은 상속되지 않는다.",
9
9
  "order": "타입(class) → 옵션(options/flags) → 변수(variables). 변수는 옵션으로 안 될 때만.",
10
10
  "tokens": "색·간격·모서리·글꼴은 design-tokens 변수만. tokens.groups 에 없는 이름은 존재하지 않는다.",
@@ -16,6 +16,7 @@
16
16
  "class": "m3-badge",
17
17
  "description": " ====== M3 Badge\nM3 spec: small dot (6dp) or large with number (16dp height)\nPosition: top-right corner of parent (needs relative parent)\n사용법:\n <div style=\"position: relative; display: inline-flex;\">\n <i class=\"m3-icon icon:mail\"></i>",
18
18
  "slots": [],
19
+ "slotOptions": {},
19
20
  "options": {
20
21
  "badge": [
21
22
  "dot",
@@ -77,6 +78,7 @@
77
78
  "sheet-drag-handle",
78
79
  "sheet-headline"
79
80
  ],
81
+ "slotOptions": {},
80
82
  "options": {
81
83
  "sheet": [
82
84
  "modal"
@@ -173,11 +175,61 @@
173
175
  },
174
176
  "usage": "<div class=\"m3-bottom-sheet sheet-open\">\n <div class=\"sheet-drag-handle\"></div>\n <div class=\"sheet-content\">\n <h3 class=\"sheet-headline\">시트 제목</h3>\n <p>시트 본문 내용입니다.</p>\n </div>\n</div>"
175
177
  },
178
+ {
179
+ "name": "breadcrumb",
180
+ "class": "m3-breadcrumb",
181
+ "description": " ====== Breadcrumb (newtil 확장)\n현재 위치 경로: 홈 / 메뉴 / 커피 / 카페라떼. M3 스펙에는 없다.\n구분 기호는 CSS 가 그린다 — 마크업에 \"/\" 를 넣지 않는다.\n사용법:\n <nav class=\"m3-breadcrumb\" aria-label=\"현재 위치\">\n <a href=\"/\">홈</a>",
182
+ "slots": [],
183
+ "slotOptions": {},
184
+ "options": {
185
+ "breadcrumb-separator": [
186
+ "chevron",
187
+ "dot",
188
+ "slash"
189
+ ],
190
+ "breadcrumb-size": [
191
+ "md",
192
+ "sm"
193
+ ]
194
+ },
195
+ "flags": [],
196
+ "variables": {
197
+ "--breadcrumb-gap": {
198
+ "default": "var(--space-3)"
199
+ },
200
+ "--breadcrumb-margin": {
201
+ "default": "0 0 var(--space-7)"
202
+ },
203
+ "--breadcrumb-font-size": {
204
+ "default": "var(--font-size-body-sm)"
205
+ },
206
+ "--breadcrumb-color": {
207
+ "default": "var(--color-text-muted)"
208
+ },
209
+ "--breadcrumb-color-hover": {
210
+ "default": "var(--color-text)"
211
+ },
212
+ "--breadcrumb-current-color": {
213
+ "default": "var(--color-text)"
214
+ },
215
+ "--breadcrumb-current-weight": {
216
+ "default": "var(--font-weight-semibold)"
217
+ },
218
+ "--breadcrumb-separator": {
219
+ "default": "\"/\""
220
+ },
221
+ "--breadcrumb-separator-color": {
222
+ "default": "var(--color-text-subtle)"
223
+ }
224
+ },
225
+ "usage": "<nav class=\"m3-breadcrumb\" aria-label=\"현재 위치\">\n <a href=\"#\">홈</a>\n <a href=\"#\">메뉴</a>\n <a href=\"#\">커피</a>\n <span aria-current=\"page\">카페라떼</span>\n</nav>\n<nav class=\"m3-breadcrumb breadcrumb-separator:chevron breadcrumb-size:sm\" aria-label=\"현재 위치\">\n <a href=\"#\">관리자</a>\n <a href=\"#\">메뉴 관리</a>\n <span aria-current=\"page\">새 메뉴</span>\n</nav>"
226
+ },
176
227
  {
177
228
  "name": "btn",
178
229
  "class": "m3-btn",
179
230
  "description": " ====== M3 Button (Material Design 3 spec-aligned)\nSize : xs | sm (default) | md | lg | xl\nShape: round (default) | square\nType : filled (default) | elevated | tonal | outlined | text\nState: enabled (default) | disabled | hover | focus | active\nM3 spec source: material-components/material-web tokens",
180
231
  "slots": [],
232
+ "slotOptions": {},
181
233
  "options": {
182
234
  "btn-state": [
183
235
  "active",
@@ -376,6 +428,16 @@
376
428
  "card-subhead",
377
429
  "card-titles"
378
430
  ],
431
+ "slotOptions": {
432
+ "card-media": {
433
+ "card-media": [
434
+ "landscape",
435
+ "square",
436
+ "video",
437
+ "wide"
438
+ ]
439
+ }
440
+ },
379
441
  "options": {
380
442
  "card-state": [
381
443
  "disabled",
@@ -524,6 +586,12 @@
524
586
  "--card-media-width": {
525
587
  "default": "auto"
526
588
  },
589
+ "--card-media-ratio": {
590
+ "default": "auto"
591
+ },
592
+ "--card-media-badge-offset": {
593
+ "default": "var(--space-3)"
594
+ },
527
595
  "--card-actions-gap": {
528
596
  "default": "0.5rem"
529
597
  },
@@ -556,6 +624,7 @@
556
624
  "class": "m3-checkbox",
557
625
  "description": " ====== M3 Checkbox\nM3 spec: 18dp box, 2dp radius, primary when checked\nVariable API: --checkbox-* 변수로 커스텀 가능",
558
626
  "slots": [],
627
+ "slotOptions": {},
559
628
  "options": {
560
629
  "checkbox-mode": [
561
630
  "indeterminate"
@@ -651,6 +720,7 @@
651
720
  "chip-close",
652
721
  "chip-icon"
653
722
  ],
723
+ "slotOptions": {},
654
724
  "options": {
655
725
  "chip-state": [
656
726
  "disabled"
@@ -743,6 +813,7 @@
743
813
  "class": "m3-deco",
744
814
  "description": " ====== M3 Deco (Icon + Text Decoration)\n아이콘과 텍스트를 방향에 따라 조합하는 장식 컴포넌트.\nNavigation Bar, Navigation Rail, Tab Bar, 사이드바 메뉴 항목 등에 사용.\n사용법:\n <span class=\"m3-deco icon:home deco-pos:left\">홈</span>\n <span class=\"m3-deco icon:home deco-pos:top deco-active\">홈</span>",
745
815
  "slots": [],
816
+ "slotOptions": {},
746
817
  "options": {
747
818
  "deco-pos": [
748
819
  "bottom",
@@ -866,6 +937,7 @@
866
937
  "dialog-headline",
867
938
  "dialog-icon"
868
939
  ],
940
+ "slotOptions": {},
869
941
  "options": {},
870
942
  "flags": [
871
943
  "dialog-open"
@@ -951,6 +1023,7 @@
951
1023
  "class": "m3-divider",
952
1024
  "description": " ====== M3 Divider (Material Design 3 spec-aligned)\nType : full-width (default) | inset | middle-inset | vertical\nM3 spec: 1dp height, outline-variant color\nRef: https://m3.material.io/components/divider/specs\nVariable API: --divider-* 변수로 모든 시각 요소 커스텀 가능",
953
1025
  "slots": [],
1026
+ "slotOptions": {},
954
1027
  "options": {
955
1028
  "divider": [
956
1029
  "inset",
@@ -993,6 +1066,7 @@
993
1066
  "class": "m3-fab",
994
1067
  "description": " ====== M3 FAB (Material Design 3 spec-aligned)\nSize : fab (default 56dp) | fab:small (40dp) | fab:large (96dp) | fab:extended\nColor: surface (default) | primary | secondary | tertiary\nState: enabled (default) | hover | focus | active | disabled\nM3 spec: level3 shadow at rest, level4 on hover\nRef: https://m3.material.io/components/floating-action-button/specs",
995
1068
  "slots": [],
1069
+ "slotOptions": {},
996
1070
  "options": {
997
1071
  "fab-state": [
998
1072
  "active",
@@ -1096,12 +1170,40 @@
1096
1170
  "description": " ====== M3 Form (newtil 확장)\nM3 스펙에는 Form 전용 컴포넌트가 없습니다. 이 컴포넌트는\n폼의 공통 레이아웃 패턴(헤더 / 필드 / 액션 / 메시지)을 표준화하기 위한\nnewtil 확장입니다.\n사용법:\n <form class=\"m3-form\">",
1097
1171
  "slots": [
1098
1172
  "form-actions",
1173
+ "form-choice-extra",
1099
1174
  "form-description",
1100
1175
  "form-fields",
1176
+ "form-group",
1177
+ "form-group-choices",
1178
+ "form-group-label",
1101
1179
  "form-header",
1102
1180
  "form-headline",
1103
1181
  "form-message"
1104
1182
  ],
1183
+ "slotOptions": {
1184
+ "form-actions": {
1185
+ "form-actions": [
1186
+ "between",
1187
+ "center",
1188
+ "end",
1189
+ "start",
1190
+ "stretch"
1191
+ ]
1192
+ },
1193
+ "form-message": {
1194
+ "form-message": [
1195
+ "error",
1196
+ "info",
1197
+ "success",
1198
+ "warning"
1199
+ ]
1200
+ },
1201
+ "form-group": {
1202
+ "form-group": [
1203
+ "inline"
1204
+ ]
1205
+ }
1206
+ },
1105
1207
  "options": {
1106
1208
  "form": [
1107
1209
  "compact",
@@ -1125,6 +1227,22 @@
1125
1227
  "--form-header-gap": {
1126
1228
  "default": "0.25rem"
1127
1229
  },
1230
+ "--form-group-gap": {
1231
+ "default": "var(--space-2)"
1232
+ },
1233
+ "--form-group-label-width": {
1234
+ "default": "5.5rem",
1235
+ "note": "form-group:inline 의 레이블 칸"
1236
+ },
1237
+ "--form-group-label-size": {
1238
+ "default": "var(--font-size-body-sm)"
1239
+ },
1240
+ "--form-group-label-weight": {
1241
+ "default": "var(--font-weight-semibold)"
1242
+ },
1243
+ "--form-group-choices-gap": {
1244
+ "default": "var(--space-5)"
1245
+ },
1128
1246
  "--form-headline-size": {
1129
1247
  "default": "1.5rem"
1130
1248
  },
@@ -1190,6 +1308,7 @@
1190
1308
  "class": "m3-grid",
1191
1309
  "description": " ====== Grid (newtil 확장)\n카드·항목을 반응형 격자로 놓는 콘텐츠 블록. \"가구를 방에 놓는 틀\" 이다.\nM3 스펙에는 없다. 안에 무엇이 들어가든(m3-card, m3-list 항목, 이미지) 격자만 책임진다.\n사용법:\n <ul class=\"m3-grid grid-cols:3\">\n <li class=\"m3-card card:outlined\">…</li>",
1192
1310
  "slots": [],
1311
+ "slotOptions": {},
1193
1312
  "options": {
1194
1313
  "grid-cols": [
1195
1314
  "1",
@@ -1233,8 +1352,9 @@
1233
1352
  {
1234
1353
  "name": "icon-btn",
1235
1354
  "class": "m3-icon-btn",
1236
- "description": " ====== M3 Icon Button (Material Design 3 spec-aligned)\nType : standard (default) | filled | tonal | outlined\nToggle: icon-btn-toggle:selected | icon-btn-toggle:unselected\nState: enabled (default) | hover | focus | active | disabled\nM3 spec: 48dp touch target, 40dp visible container\nRef: https://m3.material.io/components/icon-buttons/specs",
1355
+ "description": " ====== M3 Icon Button (Material Design 3 spec-aligned)\nType : standard (default) | filled | tonal | outlined\nToggle: icon-btn-toggle:selected | icon-btn-toggle:unselected\nSize : icon-btn-size:xs (28px) | sm (32px) | md (40px, 기본, 터치 48px) | lg (48px)\n xs·sm 터치 영역을 늘리지 않는다 카드 액션·표 셀·스테퍼처럼 텍스트 버튼 옆에 나란히 놓는 자리용.\nState: enabled (default) | hover | focus | active | disabled",
1237
1356
  "slots": [],
1357
+ "slotOptions": {},
1238
1358
  "options": {
1239
1359
  "icon-btn-state": [
1240
1360
  "active",
@@ -1242,6 +1362,12 @@
1242
1362
  "focus",
1243
1363
  "hover"
1244
1364
  ],
1365
+ "icon-btn-size": [
1366
+ "lg",
1367
+ "md",
1368
+ "sm",
1369
+ "xs"
1370
+ ],
1245
1371
  "icon-btn": [
1246
1372
  "filled",
1247
1373
  "outlined",
@@ -1318,6 +1444,7 @@
1318
1444
  "class": "m3-icon",
1319
1445
  "description": " ====== M3 Icon (Material Symbols)\nMaterial Symbols 폰트 기반 아이콘 컴포넌트.\n아이콘 코드포인트는 icon-essential.css (또는 사용자 정의)에서 ::before content로 제공.\n사용법:\n <i class=\"m3-icon icon:home\"></i>\n <i class=\"m3-icon icon:search icon-style:rounded icon-filled:1\"></i>",
1320
1446
  "slots": [],
1447
+ "slotOptions": {},
1321
1448
  "options": {
1322
1449
  "icon-style": [
1323
1450
  "outlined",
@@ -1427,6 +1554,7 @@
1427
1554
  "layout-content",
1428
1555
  "layout-header"
1429
1556
  ],
1557
+ "slotOptions": {},
1430
1558
  "options": {
1431
1559
  "layout": [
1432
1560
  "fixed-drawer",
@@ -1492,6 +1620,14 @@
1492
1620
  "list-divider",
1493
1621
  "list-item"
1494
1622
  ],
1623
+ "slotOptions": {
1624
+ "list-divider": {
1625
+ "list-divider": [
1626
+ "full",
1627
+ "inset"
1628
+ ]
1629
+ }
1630
+ },
1495
1631
  "options": {
1496
1632
  "list-size": [
1497
1633
  "compact",
@@ -1613,6 +1749,7 @@
1613
1749
  "menu-divider",
1614
1750
  "menu-item"
1615
1751
  ],
1752
+ "slotOptions": {},
1616
1753
  "options": {},
1617
1754
  "flags": [
1618
1755
  "menu-open"
@@ -1710,6 +1847,7 @@
1710
1847
  "class": "m3-nav-bar",
1711
1848
  "description": " ====== M3 Navigation Bar (Bottom Navigation)\nM3 spec: 80dp height, fixed bottom, 3-5 destinations, surface bg\n내부 아이템은 m3-deco 컴포넌트를 사용하여 icon+text 렌더링.\n사용법:\n <nav class=\"m3-nav-bar\">\n <a href=\"#\" class=\"m3-deco icon:home deco-pos:top deco-active\">홈</a>",
1712
1849
  "slots": [],
1850
+ "slotOptions": {},
1713
1851
  "options": {
1714
1852
  "nav-bar": [
1715
1853
  "elevated",
@@ -1776,6 +1914,7 @@
1776
1914
  "drawer-item",
1777
1915
  "drawer-section-header"
1778
1916
  ],
1917
+ "slotOptions": {},
1779
1918
  "options": {
1780
1919
  "drawer": [
1781
1920
  "modal"
@@ -1911,6 +2050,7 @@
1911
2050
  "rail-header",
1912
2051
  "rail-items"
1913
2052
  ],
2053
+ "slotOptions": {},
1914
2054
  "options": {
1915
2055
  "rail": [
1916
2056
  "elevated",
@@ -1988,6 +2128,7 @@
1988
2128
  "pager-ellipsis",
1989
2129
  "pager-item"
1990
2130
  ],
2131
+ "slotOptions": {},
1991
2132
  "options": {
1992
2133
  "pager": [
1993
2134
  "text"
@@ -2077,6 +2218,7 @@
2077
2218
  "class": "m3-progress",
2078
2219
  "description": " ====== M3 Progress Indicator\nType: linear (default) | circular\nM3 spec: primary track color, 4dp height (linear), 48dp (circular)\n사용법:\n <div class=\"m3-progress\" style=\"--progress-value: 60%;\"></div>\n <div class=\"m3-progress progress:indeterminate\"></div>",
2079
2220
  "slots": [],
2221
+ "slotOptions": {},
2080
2222
  "options": {
2081
2223
  "progress": [
2082
2224
  "circular",
@@ -2127,6 +2269,7 @@
2127
2269
  "class": "m3-radio",
2128
2270
  "description": " ====== M3 Radio Button\nM3 spec: 20dp outer ring, 10dp inner dot, primary when selected\nVariable API: --radio-* 변수로 커스텀 가능",
2129
2271
  "slots": [],
2272
+ "slotOptions": {},
2130
2273
  "options": {
2131
2274
  "radio-color": [
2132
2275
  "danger",
@@ -2214,11 +2357,206 @@
2214
2357
  },
2215
2358
  "usage": "<label class=\"m3-radio\">\n <input type=\"radio\" name=\"option\" value=\"1\">\n <span>옵션 1</span>\n</label>\n\n<label class=\"m3-radio\">\n <input type=\"radio\" name=\"option\" value=\"2\">\n <span>옵션 2</span>\n</label>\n\n<label class=\"m3-radio\">\n <input type=\"radio\" name=\"option\" value=\"3\" checked>\n <span>옵션 3 (선택됨)</span>\n</label>"
2216
2359
  },
2360
+ {
2361
+ "name": "section",
2362
+ "class": "m3-section",
2363
+ "description": " ====== Section (newtil 확장)\n제목 · 설명 · 본문으로 된 글 덩어리. 상세 페이지의 \"상세 설명 / 영양 정보 / 유의 사항\",\n소개 페이지의 절, 설정 화면의 묶음이 모두 이것이다. M3 스펙에는 없다.\n사용법:\n <section class=\"m3-section section:divided\">\n <h2 class=\"section-title\">영양 정보</h2>",
2364
+ "slots": [
2365
+ "section-body",
2366
+ "section-caption",
2367
+ "section-title"
2368
+ ],
2369
+ "slotOptions": {},
2370
+ "options": {
2371
+ "section": [
2372
+ "card",
2373
+ "divided"
2374
+ ],
2375
+ "section-size": [
2376
+ "lg",
2377
+ "md",
2378
+ "sm"
2379
+ ]
2380
+ },
2381
+ "flags": [],
2382
+ "variables": {
2383
+ "--section-padding": {
2384
+ "default": "var(--space-8) 0"
2385
+ },
2386
+ "--section-gap": {
2387
+ "default": "var(--space-4)"
2388
+ },
2389
+ "--section-border": {
2390
+ "default": "none"
2391
+ },
2392
+ "--section-background": {
2393
+ "default": "transparent"
2394
+ },
2395
+ "--section-border-radius": {
2396
+ "default": "0"
2397
+ },
2398
+ "--section-title-size": {
2399
+ "default": "var(--font-size-heading-sm)"
2400
+ },
2401
+ "--section-title-weight": {
2402
+ "default": "var(--font-weight-bold)"
2403
+ },
2404
+ "--section-title-color": {
2405
+ "default": "var(--color-text)"
2406
+ },
2407
+ "--section-caption-size": {
2408
+ "default": "var(--font-size-caption)"
2409
+ },
2410
+ "--section-caption-color": {
2411
+ "default": "var(--color-text-muted)"
2412
+ },
2413
+ "--section-body-size": {
2414
+ "default": "var(--font-size-body)"
2415
+ },
2416
+ "--section-body-line-height": {
2417
+ "default": "var(--line-height-loose)"
2418
+ },
2419
+ "--section-body-color": {
2420
+ "default": "var(--color-text-muted)"
2421
+ },
2422
+ "--section-body-gap": {
2423
+ "default": "var(--space-4)"
2424
+ }
2425
+ },
2426
+ "usage": "<section class=\"m3-section section:divided\">\n <h2 class=\"section-title\">상세 설명</h2>\n <div class=\"section-body\">\n <p>브라질과 콜롬비아 원두를 블렌딩한 하우스 블렌드 에스프레소를 사용합니다.</p>\n <p>HOT 은 머그로, ICE 는 얼음과 함께 투명 컵으로 제공됩니다.</p>\n </div>\n</section>\n<section class=\"m3-section section:divided\">\n <h2 class=\"section-title\">유의 사항</h2>\n <p class=\"section-caption\">2026년 9월 기준</p>\n <div class=\"section-body\">\n <ul><li>우유가 포함된 제품입니다.</li><li>주문 후 30분 이내 픽업해 주세요.</li></ul>\n </div>\n</section>"
2427
+ },
2428
+ {
2429
+ "name": "site",
2430
+ "class": "m3-site",
2431
+ "description": " ====== Site (newtil 확장)\n공개 사이트의 \"방\": 상단 헤더 · 본문 · 푸터가 세로로 흐르고 본문은 가운데 컨테이너 안에 놓인다.\nm3-layout(드로어 앱 셸)과 다른 종류의 방이다. M3 스펙에는 없다.\n사용법:\n <div class=\"m3-site\">\n <header class=\"site-header\">",
2432
+ "slots": [
2433
+ "site-actions",
2434
+ "site-aside",
2435
+ "site-body",
2436
+ "site-container",
2437
+ "site-content",
2438
+ "site-copyright",
2439
+ "site-footer",
2440
+ "site-footer-inner",
2441
+ "site-footer-links",
2442
+ "site-header",
2443
+ "site-header-inner",
2444
+ "site-logo",
2445
+ "site-main",
2446
+ "site-nav"
2447
+ ],
2448
+ "slotOptions": {
2449
+ "site-body": {
2450
+ "site-body": [
2451
+ "aside",
2452
+ "aside-end"
2453
+ ]
2454
+ }
2455
+ },
2456
+ "options": {
2457
+ "site-width": [
2458
+ "default",
2459
+ "narrow",
2460
+ "wide"
2461
+ ],
2462
+ "site-aside": [
2463
+ "lg",
2464
+ "md",
2465
+ "sm"
2466
+ ]
2467
+ },
2468
+ "flags": [],
2469
+ "variables": {
2470
+ "--site-max-width": {
2471
+ "default": "70rem"
2472
+ },
2473
+ "--site-gutter": {
2474
+ "default": "var(--space-7)",
2475
+ "note": "24px"
2476
+ },
2477
+ "--site-background": {
2478
+ "default": "var(--color-surface-1)"
2479
+ },
2480
+ "--site-header-height": {
2481
+ "default": "4rem",
2482
+ "note": "64px"
2483
+ },
2484
+ "--site-header-background": {
2485
+ "default": "var(--color-surface)"
2486
+ },
2487
+ "--site-header-border": {
2488
+ "default": "0.0625rem solid var(--color-border)"
2489
+ },
2490
+ "--site-header-gap": {
2491
+ "default": "var(--space-8)"
2492
+ },
2493
+ "--site-logo-size": {
2494
+ "default": "var(--font-size-heading-sm)"
2495
+ },
2496
+ "--site-logo-weight": {
2497
+ "default": "var(--font-weight-bold)"
2498
+ },
2499
+ "--site-logo-color": {
2500
+ "default": "var(--color-primary)"
2501
+ },
2502
+ "--site-nav-gap": {
2503
+ "default": "var(--space-6)"
2504
+ },
2505
+ "--site-nav-size": {
2506
+ "default": "var(--font-size-body-sm)"
2507
+ },
2508
+ "--site-nav-color": {
2509
+ "default": "var(--color-text-muted)"
2510
+ },
2511
+ "--site-nav-color-active": {
2512
+ "default": "var(--color-text)"
2513
+ },
2514
+ "--site-nav-weight-active": {
2515
+ "default": "var(--font-weight-semibold)"
2516
+ },
2517
+ "--site-actions-gap": {
2518
+ "default": "var(--space-3)"
2519
+ },
2520
+ "--site-main-padding-top": {
2521
+ "default": "var(--space-9)"
2522
+ },
2523
+ "--site-main-padding-bottom": {
2524
+ "default": "var(--space-11)"
2525
+ },
2526
+ "--site-aside-width": {
2527
+ "default": "12.5rem",
2528
+ "note": "200px"
2529
+ },
2530
+ "--site-body-gap": {
2531
+ "default": "var(--space-8)"
2532
+ },
2533
+ "--site-aside-gap": {
2534
+ "default": "var(--space-5)"
2535
+ },
2536
+ "--site-footer-padding": {
2537
+ "default": "var(--space-8) 0"
2538
+ },
2539
+ "--site-footer-border": {
2540
+ "default": "0.0625rem solid var(--color-border)"
2541
+ },
2542
+ "--site-footer-size": {
2543
+ "default": "var(--font-size-body-sm)"
2544
+ },
2545
+ "--site-footer-color": {
2546
+ "default": "var(--color-text-muted)"
2547
+ },
2548
+ "--site-footer-links-gap": {
2549
+ "default": "var(--space-5)"
2550
+ }
2551
+ },
2552
+ "usage": "<div class=\"m3-site\" style=\"min-height: 22rem;\">\n <header class=\"site-header\">\n <div class=\"site-container site-header-inner\">\n <a class=\"site-logo\" href=\"#\">NCafe</a>\n <nav class=\"site-nav\"><a href=\"#\" aria-current=\"page\">메뉴</a><a href=\"#\">소개</a><a href=\"#\">장바구니</a></nav>\n <div class=\"site-actions\"><button class=\"m3-btn btn:outlined btn-size:xs\">로그인</button><button class=\"m3-btn btn-size:xs\">회원가입</button></div>\n </div>\n </header>\n <main class=\"site-main\">\n <div class=\"site-container\">\n <div class=\"site-body site-body:aside\">\n <aside class=\"site-aside\"><div class=\"m3-card card:outlined card-padding:self\">사이드</div></aside>\n <div class=\"site-content\"><div class=\"m3-card card:outlined card-padding:self\">본문</div></div>\n </div>\n </div>\n </main>\n <footer class=\"site-footer\">\n <div class=\"site-container site-footer-inner\">\n <p class=\"site-copyright\">© 2026 NCafe</p>\n <nav class=\"site-footer-links\"><a href=\"#\">소개</a><a href=\"#\">이용약관</a></nav>\n </div>\n </footer>\n</div>"
2553
+ },
2217
2554
  {
2218
2555
  "name": "slider",
2219
2556
  "class": "m3-slider",
2220
2557
  "description": " ====== M3 Slider\nM3 spec: Track 4dp height, handle 20dp, active track uses primary\nTypes: continuous (default), discrete (with tick marks)\n사용법:\n <div class=\"m3-slider\">\n <input type=\"range\" min=\"0\" max=\"100\" value=\"50\">",
2221
2558
  "slots": [],
2559
+ "slotOptions": {},
2222
2560
  "options": {
2223
2561
  "slider": [
2224
2562
  "discrete"
@@ -2312,6 +2650,7 @@
2312
2650
  "snackbar-close",
2313
2651
  "snackbar-text"
2314
2652
  ],
2653
+ "slotOptions": {},
2315
2654
  "options": {
2316
2655
  "snackbar-color": [
2317
2656
  "danger",
@@ -2392,6 +2731,85 @@
2392
2731
  },
2393
2732
  "usage": "<div class=\"m3-snackbar snackbar-open\">\n <span class=\"snackbar-text\">파일이 저장되었습니다</span>\n</div>"
2394
2733
  },
2734
+ {
2735
+ "name": "stepper",
2736
+ "class": "m3-stepper",
2737
+ "description": " ====== Stepper (newtil 확장)\n수량 −/+ 입력. 장바구니·상세 페이지의 \"가구\" 다. M3 스펙에는 없다.\n한 테두리 안에 [빼기][숫자][더하기] 가 붙어 있는 모양이 기본이고, 값 바꾸는 동작은 앱이 맡는다.\n사용법:\n <div class=\"m3-stepper\" role=\"group\" aria-label=\"수량\">\n <button type=\"button\" class=\"stepper-btn\" aria-label=\"수량 감소\"><i class=\"m3-icon icon:remove\"></i></button>",
2738
+ "slots": [
2739
+ "stepper-btn",
2740
+ "stepper-input"
2741
+ ],
2742
+ "slotOptions": {},
2743
+ "options": {
2744
+ "stepper": [
2745
+ "outlined",
2746
+ "separated"
2747
+ ],
2748
+ "stepper-size": [
2749
+ "lg",
2750
+ "md",
2751
+ "sm"
2752
+ ]
2753
+ },
2754
+ "flags": [],
2755
+ "variables": {
2756
+ "--stepper-height": {
2757
+ "default": "2.125rem",
2758
+ "note": "34px"
2759
+ },
2760
+ "--stepper-btn-width": {
2761
+ "default": "2rem",
2762
+ "note": "32px"
2763
+ },
2764
+ "--stepper-input-width": {
2765
+ "default": "2.75rem",
2766
+ "note": "44px"
2767
+ },
2768
+ "--stepper-gap": {
2769
+ "default": "0"
2770
+ },
2771
+ "--stepper-font-size": {
2772
+ "default": "var(--font-size-body-sm)"
2773
+ },
2774
+ "--stepper-font-weight": {
2775
+ "default": "var(--font-weight-semibold)"
2776
+ },
2777
+ "--stepper-icon-size": {
2778
+ "default": "1rem"
2779
+ },
2780
+ "--stepper-border-width": {
2781
+ "default": "0.0625rem"
2782
+ },
2783
+ "--stepper-border-color": {
2784
+ "default": "var(--color-border)"
2785
+ },
2786
+ "--stepper-border-radius": {
2787
+ "default": "var(--radius-2)"
2788
+ },
2789
+ "--stepper-background": {
2790
+ "default": "var(--color-surface)"
2791
+ },
2792
+ "--stepper-btn-background": {
2793
+ "default": "var(--color-surface)"
2794
+ },
2795
+ "--stepper-btn-hover-background": {
2796
+ "default": "var(--color-surface-1)"
2797
+ },
2798
+ "--stepper-btn-color": {
2799
+ "default": "var(--color-text)"
2800
+ },
2801
+ "--stepper-input-color": {
2802
+ "default": "var(--color-text)"
2803
+ },
2804
+ "--stepper-divider": {
2805
+ "default": "var(--stepper-border-width) solid var(--stepper-border-color)"
2806
+ },
2807
+ "--stepper-disabled-opacity": {
2808
+ "default": "0.38"
2809
+ }
2810
+ },
2811
+ "usage": "<div class=\"m3-stepper\" role=\"group\" aria-label=\"수량\">\n <button type=\"button\" class=\"stepper-btn\" aria-label=\"수량 감소\"><i class=\"m3-icon icon:remove\"></i></button>\n <input class=\"stepper-input\" type=\"number\" value=\"1\" min=\"1\" aria-label=\"수량\">\n <button type=\"button\" class=\"stepper-btn\" aria-label=\"수량 증가\"><i class=\"m3-icon icon:add\"></i></button>\n</div>\n<div class=\"m3-stepper stepper-size:lg\" role=\"group\" aria-label=\"수량\">\n <button type=\"button\" class=\"stepper-btn\" aria-label=\"수량 감소\"><i class=\"m3-icon icon:remove\"></i></button>\n <input class=\"stepper-input\" type=\"number\" value=\"2\" min=\"1\" aria-label=\"수량\">\n <button type=\"button\" class=\"stepper-btn\" aria-label=\"수량 증가\"><i class=\"m3-icon icon:add\"></i></button>\n</div>\n<div class=\"m3-stepper stepper:separated\" role=\"group\" aria-label=\"수량\">\n <button type=\"button\" class=\"stepper-btn\" aria-label=\"수량 감소\"><i class=\"m3-icon icon:remove\"></i></button>\n <input class=\"stepper-input\" type=\"number\" value=\"3\" min=\"1\" aria-label=\"수량\">\n <button type=\"button\" class=\"stepper-btn\" aria-label=\"수량 증가\"><i class=\"m3-icon icon:add\"></i></button>\n</div>"
2812
+ },
2395
2813
  {
2396
2814
  "name": "switch",
2397
2815
  "class": "m3-switch",
@@ -2399,6 +2817,7 @@
2399
2817
  "slots": [
2400
2818
  "switch-label"
2401
2819
  ],
2820
+ "slotOptions": {},
2402
2821
  "options": {
2403
2822
  "switch-color": [
2404
2823
  "danger",
@@ -2491,6 +2910,71 @@
2491
2910
  },
2492
2911
  "usage": "<label class=\"m3-switch\">\n <input type=\"checkbox\">\n <span class=\"switch-label\">Wi-Fi</span>\n</label>\n\n<!-- 켜짐 상태 -->\n<label class=\"m3-switch\">\n <input type=\"checkbox\" checked>\n <span class=\"switch-label\">블루투스</span>\n</label>"
2493
2912
  },
2913
+ {
2914
+ "name": "table",
2915
+ "class": "m3-table",
2916
+ "description": " ====== Table (newtil 확장)\n표. M3 에는 data table 스펙이 없어 newtil 이 정한다. 두 쓰임을 한 클래스로:\n - 데이터 표 (thead + tbody, 관리자 목록)\n - 항목–값 표 (th scope=row 가 항목, td 가 값 — 영양 정보·주문 정보)\n사용법:\n <table class=\"m3-table\">",
2917
+ "slots": [
2918
+ "table-align"
2919
+ ],
2920
+ "slotOptions": {},
2921
+ "options": {
2922
+ "table": [
2923
+ "bordered",
2924
+ "hover",
2925
+ "key-value",
2926
+ "striped"
2927
+ ],
2928
+ "table-size": [
2929
+ "lg",
2930
+ "md",
2931
+ "sm"
2932
+ ]
2933
+ },
2934
+ "flags": [],
2935
+ "variables": {
2936
+ "--table-width": {
2937
+ "default": "100%"
2938
+ },
2939
+ "--table-max-width": {
2940
+ "default": "none"
2941
+ },
2942
+ "--table-font-size": {
2943
+ "default": "var(--font-size-body-sm)"
2944
+ },
2945
+ "--table-color": {
2946
+ "default": "var(--color-text)"
2947
+ },
2948
+ "--table-cell-padding": {
2949
+ "default": "var(--space-3) var(--space-4)"
2950
+ },
2951
+ "--table-border-width": {
2952
+ "default": "var(--border-width-1)"
2953
+ },
2954
+ "--table-border-color": {
2955
+ "default": "var(--color-border-subtle)"
2956
+ },
2957
+ "--table-head-background": {
2958
+ "default": "var(--color-surface-2)"
2959
+ },
2960
+ "--table-head-color": {
2961
+ "default": "var(--color-text-muted)"
2962
+ },
2963
+ "--table-head-weight": {
2964
+ "default": "var(--font-weight-semibold)"
2965
+ },
2966
+ "--table-row-hover-background": {
2967
+ "default": "transparent"
2968
+ },
2969
+ "--table-stripe-background": {
2970
+ "default": "var(--color-surface-1)"
2971
+ },
2972
+ "--table-key-width": {
2973
+ "default": "25%"
2974
+ }
2975
+ },
2976
+ "usage": "<table class=\"m3-table\">\n <thead><tr><th>메뉴</th><th>카테고리</th><th class=\"table-align:end\">가격</th></tr></thead>\n <tbody>\n <tr><td>아메리카노</td><td>커피</td><td class=\"table-align:end\">3,500원</td></tr>\n <tr><td>카페라떼</td><td>커피</td><td class=\"table-align:end\">4,500원</td></tr>\n </tbody>\n</table>\n<table class=\"m3-table table:key-value\" style=\"--table-max-width: 40rem\">\n <tbody>\n <tr><th scope=\"row\">칼로리</th><td>180 kcal</td><th scope=\"row\">나트륨</th><td>115 mg</td></tr>\n <tr><th scope=\"row\">당류</th><td>13 g</td><th scope=\"row\">포화지방</th><td>4.5 g</td></tr>\n </tbody>\n</table>"
2977
+ },
2494
2978
  {
2495
2979
  "name": "tabs",
2496
2980
  "class": "m3-tabs",
@@ -2498,6 +2982,7 @@
2498
2982
  "slots": [
2499
2983
  "tab-item"
2500
2984
  ],
2985
+ "slotOptions": {},
2501
2986
  "options": {
2502
2987
  "tabs": [
2503
2988
  "full",
@@ -2592,6 +3077,7 @@
2592
3077
  "field-label",
2593
3078
  "field-supporting"
2594
3079
  ],
3080
+ "slotOptions": {},
2595
3081
  "options": {
2596
3082
  "field": [
2597
3083
  "outlined"
@@ -2823,7 +3309,51 @@
2823
3309
  "default": "all var(--duration-fast) var(--ease-in-out)"
2824
3310
  }
2825
3311
  },
2826
- "usage": "<div style=\"display: flex; flex-wrap: wrap; gap: 0.75rem; align-items: center;\">\n <button class=\"m3-btn\">저장</button>\n <div class=\"m3-text-field\" style=\"max-width: 14rem;\">\n <input type=\"text\" placeholder=\" \">\n <label>이름</label>\n </div>\n <label class=\"m3-checkbox\"><input type=\"checkbox\" checked> 동의</label>\n</div>"
3312
+ "usage": "<div class=\"m3-toolbar\">\n <div class=\"toolbar-start\">총 <strong>31</strong>개의 메뉴</div>\n <div class=\"toolbar-end\">\n <div class=\"m3-text-field field:outlined field-label:none\"><select><option>인기순</option><option>최신순</option></select></div>\n </div>\n</div>\n<form class=\"m3-toolbar toolbar:fill\">\n <div class=\"m3-text-field field:outlined field-label:none\"><select><option>전체 카테고리</option></select></div>\n <div class=\"m3-text-field field:outlined field-label:none toolbar-grow\"><input type=\"search\" placeholder=\"메뉴 이름 검색\"></div>\n <button type=\"button\" class=\"m3-btn btn:outlined\">검색</button>\n</form>"
3313
+ },
3314
+ {
3315
+ "name": "toolbar",
3316
+ "class": "m3-toolbar",
3317
+ "description": " ====== Toolbar (newtil 확장)\n목록 위·표 위에 놓이는 한 줄: 왼쪽 정보(건수·선택 상태) · 오른쪽 동작(정렬·필터·버튼).\nM3 스펙에는 없다. 필터 바(입력 여러 개가 한 줄)도 같은 블록으로 만든다.\n사용법:\n <div class=\"m3-toolbar\">\n <div class=\"toolbar-start\">총 <strong>31</strong>개</div>",
3318
+ "slots": [
3319
+ "toolbar-end",
3320
+ "toolbar-start"
3321
+ ],
3322
+ "slotOptions": {},
3323
+ "options": {
3324
+ "toolbar": [
3325
+ "card",
3326
+ "fill"
3327
+ ]
3328
+ },
3329
+ "flags": [],
3330
+ "variables": {
3331
+ "--toolbar-gap": {
3332
+ "default": "var(--space-3)"
3333
+ },
3334
+ "--toolbar-margin": {
3335
+ "default": "0 0 var(--space-5)"
3336
+ },
3337
+ "--toolbar-padding": {
3338
+ "default": "0"
3339
+ },
3340
+ "--toolbar-font-size": {
3341
+ "default": "var(--font-size-body-sm)"
3342
+ },
3343
+ "--toolbar-color": {
3344
+ "default": "var(--color-text-muted)"
3345
+ },
3346
+ "--toolbar-strong-color": {
3347
+ "default": "var(--color-text)"
3348
+ },
3349
+ "--toolbar-border-bottom": {
3350
+ "default": "none"
3351
+ },
3352
+ "--toolbar-min-height": {
3353
+ "default": "2.5rem"
3354
+ }
3355
+ },
3356
+ "usage": "<div class=\"m3-toolbar\">\n <div class=\"toolbar-start\">총 <strong>31</strong>개의 메뉴</div>\n <div class=\"toolbar-end\">\n <div class=\"m3-text-field field:outlined field-label:none\"><select><option>인기순</option><option>최신순</option></select></div>\n </div>\n</div>\n<form class=\"m3-toolbar toolbar:fill\">\n <div class=\"m3-text-field field:outlined field-label:none\"><select><option>전체 카테고리</option></select></div>\n <div class=\"m3-text-field field:outlined field-label:none toolbar-grow\"><input type=\"search\" placeholder=\"메뉴 이름 검색\"></div>\n <button type=\"button\" class=\"m3-btn btn:outlined\">검색</button>\n</form>"
2827
3357
  },
2828
3358
  {
2829
3359
  "name": "tooltip",
@@ -2834,6 +3364,7 @@
2834
3364
  "tooltip-content",
2835
3365
  "tooltip-title"
2836
3366
  ],
3367
+ "slotOptions": {},
2837
3368
  "options": {
2838
3369
  "tooltip": [
2839
3370
  "rich"
@@ -2937,6 +3468,7 @@
2937
3468
  "bar-title",
2938
3469
  "bar-trailing"
2939
3470
  ],
3471
+ "slotOptions": {},
2940
3472
  "options": {
2941
3473
  "bar": [
2942
3474
  "center",