@spectrabrain/eds 0.1.0 → 0.2.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/AI.md +13 -63
- package/AI_CONTEXT.json +26 -95
- package/CHANGELOG.md +70 -4
- package/CONSUMER_AGENT.md +86 -164
- package/FRONTEND_CONVENTIONS.md +252 -0
- package/QUICKSTART.md +24 -29
- package/README.md +29 -73
- package/TAILWIND_V4.md +52 -184
- package/TOKEN_CONTEXT.md +79 -36
- package/consumer/align/templates/components.json +21 -0
- package/consumer/align/templates/env.mock +1 -0
- package/consumer/align/templates/eslint.config.js +35 -0
- package/consumer/align/templates/package.scripts.json +10 -0
- package/consumer/align/templates/prettierignore +2 -0
- package/consumer/align/templates/prettierrc.json +7 -0
- package/consumer/align/templates/src/app/App.tsx +16 -0
- package/consumer/align/templates/src/app/main.tsx +27 -0
- package/consumer/align/templates/src/app/providers/ErrorBoundary.tsx +58 -0
- package/consumer/align/templates/src/app/providers/ErrorHandler.tsx +29 -0
- package/consumer/align/templates/src/app/router/index.tsx +23 -0
- package/consumer/align/templates/src/app/styles/index.css +2 -0
- package/consumer/align/templates/src/mocks/browser.ts +5 -0
- package/consumer/align/templates/src/mocks/handlers.ts +4 -0
- package/consumer/align/templates/src/shared/api/index.ts +23 -0
- package/consumer/align/templates/src/shared/api/queryClient.ts +24 -0
- package/consumer/align/templates/src/shared/lib/eventBus.ts +44 -0
- package/consumer/align/templates/src/shared/lib/utils/index.ts +6 -0
- package/consumer/align/templates/src/vite-env.d.ts +2 -0
- package/consumer/align/templates/tsconfig.json +22 -0
- package/consumer/align/templates/vite.config.babel.ts +36 -0
- package/consumer/align/templates/vite.config.rolldown.ts +35 -0
- package/consumer/align-analysis.mjs +1159 -0
- package/consumer/align-plan.mjs +377 -0
- package/consumer/align-rules.mjs +473 -0
- package/consumer/align.mjs +401 -0
- package/consumer/cli.mjs +90 -40
- package/consumer/css-root.mjs +24 -4
- package/consumer/doctor.mjs +47 -21
- package/consumer/generate-tailwind.mjs +41 -1
- package/consumer/init.mjs +39 -25
- package/consumer/managed-block.mjs +11 -5
- package/consumer/paths.mjs +69 -14
- package/consumer/register-scripts.mjs +17 -12
- package/consumer/scan-classes.mjs +24 -5
- package/consumer/sync.mjs +35 -13
- package/consumer/update-agent-context.mjs +63 -7
- package/consumer-postinstall.mjs +8 -7
- package/dist/components/Button/README.md +66 -95
- package/dist/components/Button/spec.json +19 -138
- package/dist/components.css +102 -366
- package/dist/index.d.mts +20 -18
- package/dist/index.d.ts +20 -18
- package/dist/index.js +301 -1
- package/dist/index.mjs +301 -1
- package/dist/tokens.css +30 -0
- package/dist/tokens.d.mts +7 -3
- package/dist/tokens.d.ts +7 -3
- package/dist/tokens.js +301 -1
- package/dist/tokens.json +360 -0
- package/dist/tokens.mjs +301 -1
- package/llms.txt +20 -14
- package/package.json +3 -1
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"specVersion": 1,
|
|
3
|
-
"packageVersion": "0.
|
|
3
|
+
"packageVersion": "0.2.0",
|
|
4
4
|
"name": "Button",
|
|
5
5
|
"purpose": "사용자가 즉시 실행할 수 있는 행동과 탐색을 표현하는 인터랙티브 요소입니다.",
|
|
6
6
|
"usageContexts": [
|
|
@@ -8,20 +8,19 @@
|
|
|
8
8
|
"다른 페이지나 콘텐츠로 이동하는 탐색에는 neutral/link branch를 사용합니다.",
|
|
9
9
|
"brand는 화면에서 가장 중요한 행동을 강조할 때 사용합니다.",
|
|
10
10
|
"neutral은 일반적인 액션과 탐색에 사용합니다.",
|
|
11
|
-
"critical은 삭제·초기화처럼 되돌리기 어려운 행동에
|
|
12
|
-
"생성·저장·관리·확인처럼 화면의 핵심 행동에는 brand/solid를
|
|
13
|
-
"검색·조회·일반적인 주요 실행에는 neutral/solid를
|
|
11
|
+
"critical은 삭제·초기화처럼 되돌리기 어려운 행동에 critical/weak로 사용하며, 가능하면 확인 절차를 함께 둡니다.",
|
|
12
|
+
"생성·저장·관리·확인처럼 화면의 핵심 행동에는 brand/solid를 사용합니다.",
|
|
13
|
+
"검색·조회·일반적인 주요 실행에는 neutral/solid를 사용합니다.",
|
|
14
14
|
"취소·닫기·수정 같은 보조 작업에는 neutral/outline을 사용합니다.",
|
|
15
|
-
"
|
|
16
|
-
"되돌리기 어려운 삭제·초기화는 critical/weak와 확인 절차를 먼저 검토합니다.",
|
|
15
|
+
"초기화·갱신처럼 부담이 낮은 반복 행동에는 neutral/weak를 사용합니다.",
|
|
17
16
|
"비동기 저장·확인에는 loading을 사용해 중복 실행을 막고 라벨 공간을 유지합니다.",
|
|
18
|
-
"표 행 조작·pagination처럼 공간이 좁은
|
|
19
|
-
"icon은 생성·수정·삭제·외부 이동·다운로드처럼 행동의 목적이나 방향을 보조할 때 사용합니다."
|
|
20
|
-
"icon-only의 접근성 이름을 제공하려면 aria-label을 지정합니다. aria-label은 필수로 강제하지 않습니다."
|
|
17
|
+
"표 행 조작·pagination처럼 공간이 좁은 곳에는 icon-only를 쓸 수 있습니다(accessible name은 accessibility.iconOnlyName).",
|
|
18
|
+
"icon은 생성·수정·삭제·외부 이동·다운로드처럼 행동의 목적이나 방향을 보조할 때 사용합니다."
|
|
21
19
|
],
|
|
22
20
|
"unsupportedContexts": [
|
|
23
21
|
"문서에 없는 role·variant·상태를 className이나 inline style로 우회하지 않습니다.",
|
|
24
|
-
"상태 변경이나 일반 CTA를 neutral/link로 표현하지 않습니다."
|
|
22
|
+
"상태 변경이나 일반 CTA를 neutral/link로 표현하지 않습니다.",
|
|
23
|
+
"neutral/outline을 neutral/solid와 같은 액션 그룹에 두지 않습니다(neutral/solid 옆 취소 버튼의 조합은 미결)."
|
|
25
24
|
],
|
|
26
25
|
"api": {
|
|
27
26
|
"props": [
|
|
@@ -35,7 +34,7 @@
|
|
|
35
34
|
"name": "role",
|
|
36
35
|
"type": "ButtonRole",
|
|
37
36
|
"required": true,
|
|
38
|
-
"description": "시각적 역할입니다."
|
|
37
|
+
"description": "행동의 의미(brand·neutral·critical)를 나타내는 시각적 역할입니다. DOM의 ARIA role로 전달되지 않으며 ARIA role은 지정할 수 없습니다."
|
|
39
38
|
},
|
|
40
39
|
{
|
|
41
40
|
"name": "variant",
|
|
@@ -48,20 +47,20 @@
|
|
|
48
47
|
"type": "NativeButtonType",
|
|
49
48
|
"required": true,
|
|
50
49
|
"branch": "native button",
|
|
51
|
-
"description": "native button의 동작 유형입니다."
|
|
50
|
+
"description": "native button의 동작 유형입니다. 폼 제출은 submit, 그 밖의 행동은 button을 지정하며 기본값은 없습니다."
|
|
52
51
|
},
|
|
53
52
|
{
|
|
54
53
|
"name": "href",
|
|
55
54
|
"type": "string",
|
|
56
55
|
"required": true,
|
|
57
56
|
"branch": "neutral/link",
|
|
58
|
-
"description": "탐색 대상 주소입니다."
|
|
57
|
+
"description": "탐색 대상 주소입니다. 빈 문자열이나 공백만 있는 값은 render 오류입니다."
|
|
59
58
|
},
|
|
60
59
|
{
|
|
61
60
|
"name": "children",
|
|
62
61
|
"type": "ReactNode",
|
|
63
62
|
"required": false,
|
|
64
|
-
"description": "text label입니다."
|
|
63
|
+
"description": "text label입니다. iconOnly를 뺀 모든 slot에서 필수이며, 렌더링할 내용이 없으면(빈 문자열·공백·null) render 오류입니다. slot 조합은 slots를 따릅니다."
|
|
65
64
|
},
|
|
66
65
|
{
|
|
67
66
|
"name": "icon",
|
|
@@ -103,7 +102,7 @@
|
|
|
103
102
|
"name": "aria-label",
|
|
104
103
|
"type": "string",
|
|
105
104
|
"required": false,
|
|
106
|
-
"description": "accessible name입니다. icon-only
|
|
105
|
+
"description": "accessible name입니다. 지정하면 비어 있지 않아야 하며, 빈 문자열이나 공백은 render 오류입니다. icon-only에서는 accessibility.iconOnlyName을 따릅니다."
|
|
107
106
|
},
|
|
108
107
|
{
|
|
109
108
|
"name": "disabled",
|
|
@@ -115,13 +114,13 @@
|
|
|
115
114
|
"name": "loading",
|
|
116
115
|
"type": "boolean",
|
|
117
116
|
"required": false,
|
|
118
|
-
"description": "처리 중 상태입니다."
|
|
117
|
+
"description": "비동기 처리 중 상태입니다. aria-busy를 적용하고 상호작용을 막으며 label·아이콘 공간과 accessible name을 유지합니다."
|
|
119
118
|
},
|
|
120
119
|
{
|
|
121
120
|
"name": "className",
|
|
122
121
|
"type": "string",
|
|
123
122
|
"required": false,
|
|
124
|
-
"description": "
|
|
123
|
+
"description": "바깥 배치(margin·정렬·grid 위치)용 class입니다."
|
|
125
124
|
},
|
|
126
125
|
{
|
|
127
126
|
"name": "ref",
|
|
@@ -163,7 +162,7 @@
|
|
|
163
162
|
"iconFirst": "children과 startIcon 또는 startIconName을 제공합니다.",
|
|
164
163
|
"iconLast": "children과 endIcon 또는 endIconName을 제공합니다.",
|
|
165
164
|
"iconBoth": "children과 앞·뒤 아이콘을 모두 제공합니다.",
|
|
166
|
-
"iconOnly": "children 없이 icon 또는 iconName을 제공합니다.
|
|
165
|
+
"iconOnly": "children 없이 icon 또는 iconName을 제공합니다. 이름은 accessibility.iconOnlyName을 따릅니다."
|
|
167
166
|
},
|
|
168
167
|
"iconNames": [
|
|
169
168
|
"ArrowLeft",
|
|
@@ -226,127 +225,9 @@
|
|
|
226
225
|
]
|
|
227
226
|
},
|
|
228
227
|
"accessibility": {
|
|
229
|
-
"
|
|
230
|
-
"
|
|
231
|
-
"iconOnlyName": "icon-only layout에서는 접근성 이름을 제공할 때 비어 있지 않은 aria-label을 지정합니다. aria-label은 필수가 아닙니다.",
|
|
232
|
-
"disabledLink": "비활성 link는 href를 제거하고 aria-disabled와 tabIndex를 적용합니다.",
|
|
233
|
-
"loading": "loading 중에는 aria-busy를 적용하고 상호작용을 차단합니다.",
|
|
234
|
-
"focusVisible": "keyboard focus에는 승인된 focus ring을 표시합니다."
|
|
228
|
+
"iconOnlyName": "icon-only의 아이콘은 aria-hidden이므로 항상 비어 있지 않은 aria-label 또는 aria-labelledby로 이름을 지정합니다. 타입이 이를 요구하지 않아 빠뜨려도 typecheck가 통과하며, 빈 aria-label은 render 오류입니다.",
|
|
229
|
+
"loading": "loading 중에도 label·아이콘 공간과 accessible name을 유지합니다. native button은 disabled가 되어 포커스를 잃을 수 있으므로, 끝나면 포커스를 원래 Button이나 결과 요소로 옮기고 결과는 Button 밖의 status·alert 영역으로 알립니다."
|
|
235
230
|
},
|
|
236
|
-
"semanticTokens": [
|
|
237
|
-
{
|
|
238
|
-
"name": "color-bg-brand-primary",
|
|
239
|
-
"usage": "brand solid의 기본 배경입니다."
|
|
240
|
-
},
|
|
241
|
-
{
|
|
242
|
-
"name": "color-bg-brand-primary-hover",
|
|
243
|
-
"usage": "brand solid의 hover 배경입니다."
|
|
244
|
-
},
|
|
245
|
-
{
|
|
246
|
-
"name": "color-bg-critical-weak",
|
|
247
|
-
"usage": "critical weak의 기본 배경입니다."
|
|
248
|
-
},
|
|
249
|
-
{
|
|
250
|
-
"name": "color-bg-critical-weak-hover",
|
|
251
|
-
"usage": "critical weak의 hover 배경입니다."
|
|
252
|
-
},
|
|
253
|
-
{
|
|
254
|
-
"name": "color-bg-disabled",
|
|
255
|
-
"usage": "비활성 배경입니다."
|
|
256
|
-
},
|
|
257
|
-
{
|
|
258
|
-
"name": "color-bg-neutral-inverted",
|
|
259
|
-
"usage": "neutral solid의 기본 배경입니다."
|
|
260
|
-
},
|
|
261
|
-
{
|
|
262
|
-
"name": "color-bg-neutral-inverted-hover",
|
|
263
|
-
"usage": "neutral solid의 hover 배경입니다."
|
|
264
|
-
},
|
|
265
|
-
{
|
|
266
|
-
"name": "color-bg-neutral-weak",
|
|
267
|
-
"usage": "neutral weak의 기본 배경입니다."
|
|
268
|
-
},
|
|
269
|
-
{
|
|
270
|
-
"name": "color-bg-neutral-weak-hover",
|
|
271
|
-
"usage": "neutral weak의 hover 배경입니다."
|
|
272
|
-
},
|
|
273
|
-
{
|
|
274
|
-
"name": "color-bg-transparent",
|
|
275
|
-
"usage": "outline·ghost·link의 투명 배경입니다."
|
|
276
|
-
},
|
|
277
|
-
{
|
|
278
|
-
"name": "color-bg-transparent-hover",
|
|
279
|
-
"usage": "outline·ghost·link의 hover 배경입니다."
|
|
280
|
-
},
|
|
281
|
-
{
|
|
282
|
-
"name": "color-fg-brand",
|
|
283
|
-
"usage": "brand outline의 전경입니다."
|
|
284
|
-
},
|
|
285
|
-
{
|
|
286
|
-
"name": "color-fg-critical",
|
|
287
|
-
"usage": "critical weak의 전경입니다."
|
|
288
|
-
},
|
|
289
|
-
{
|
|
290
|
-
"name": "color-fg-disabled",
|
|
291
|
-
"usage": "비활성 전경입니다."
|
|
292
|
-
},
|
|
293
|
-
{
|
|
294
|
-
"name": "color-fg-neutral",
|
|
295
|
-
"usage": "neutral outline·ghost·link의 전경입니다."
|
|
296
|
-
},
|
|
297
|
-
{
|
|
298
|
-
"name": "color-fg-neutral-inverted",
|
|
299
|
-
"usage": "solid variant의 대비 전경입니다."
|
|
300
|
-
},
|
|
301
|
-
{
|
|
302
|
-
"name": "color-stroke-focusRing",
|
|
303
|
-
"usage": "focus-visible ring의 전경입니다."
|
|
304
|
-
},
|
|
305
|
-
{
|
|
306
|
-
"name": "color-stroke-neutral-secondary",
|
|
307
|
-
"usage": "neutral outline의 경계선입니다."
|
|
308
|
-
},
|
|
309
|
-
{
|
|
310
|
-
"name": "typography-body3-fontFamily",
|
|
311
|
-
"usage": "xs label의 글꼴입니다."
|
|
312
|
-
},
|
|
313
|
-
{
|
|
314
|
-
"name": "typography-body3-fontSize",
|
|
315
|
-
"usage": "xs label의 글꼴 크기입니다."
|
|
316
|
-
},
|
|
317
|
-
{
|
|
318
|
-
"name": "typography-body3-fontWeight",
|
|
319
|
-
"usage": "xs label의 글꼴 두께입니다."
|
|
320
|
-
},
|
|
321
|
-
{
|
|
322
|
-
"name": "typography-body3-letterSpacing",
|
|
323
|
-
"usage": "xs label의 자간입니다."
|
|
324
|
-
},
|
|
325
|
-
{
|
|
326
|
-
"name": "typography-body3-lineHeight",
|
|
327
|
-
"usage": "xs label의 행간입니다."
|
|
328
|
-
},
|
|
329
|
-
{
|
|
330
|
-
"name": "typography-title3-fontFamily",
|
|
331
|
-
"usage": "sm·md label의 글꼴입니다."
|
|
332
|
-
},
|
|
333
|
-
{
|
|
334
|
-
"name": "typography-title3-fontSize",
|
|
335
|
-
"usage": "sm·md label의 글꼴 크기입니다."
|
|
336
|
-
},
|
|
337
|
-
{
|
|
338
|
-
"name": "typography-title3-fontWeight",
|
|
339
|
-
"usage": "sm·md label의 글꼴 두께입니다."
|
|
340
|
-
},
|
|
341
|
-
{
|
|
342
|
-
"name": "typography-title3-letterSpacing",
|
|
343
|
-
"usage": "sm·md label의 자간입니다."
|
|
344
|
-
},
|
|
345
|
-
{
|
|
346
|
-
"name": "typography-title3-lineHeight",
|
|
347
|
-
"usage": "sm·md label의 행간입니다."
|
|
348
|
-
}
|
|
349
|
-
],
|
|
350
231
|
"unsupportedProps": [
|
|
351
232
|
{
|
|
352
233
|
"name": "style",
|