@spectrabrain/eds 0.0.2 → 0.0.3
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 +7 -6
- package/README.md +7 -4
- package/dist/components/Button/README.md +143 -0
- package/dist/components/Button/spec.json +299 -0
- package/dist/components.css +15 -8
- package/llms.txt +11 -0
- package/package.json +53 -48
package/AI.md
CHANGED
|
@@ -29,14 +29,15 @@ const color = cssVar(token); // var(--eds-color-fg-brand)
|
|
|
29
29
|
|
|
30
30
|
## 컴포넌트 문서 읽기
|
|
31
31
|
|
|
32
|
-
컴포넌트를
|
|
32
|
+
컴포넌트를 사용하기 전에 해당 컴포넌트의 README와 공개 manifest를 먼저 읽습니다. 문서에는 컴포넌트의 개요, 사용 맥락, 공개 API, 접근성 계약, 금지 사례를 기록합니다.
|
|
33
33
|
|
|
34
|
-
현재
|
|
34
|
+
현재 `Button` 문서는 다음 경로에서 확인합니다.
|
|
35
35
|
|
|
36
|
-
|
|
|
37
|
-
| --- | --- |
|
|
38
|
-
|
|
|
36
|
+
| 환경 | 개요·API 문서 | 기계 판독 manifest |
|
|
37
|
+
| --- | --- | --- |
|
|
38
|
+
| 저장소 작업 | `src/components/Button/README.md` | `dist/components/Button/spec.json` |
|
|
39
|
+
| npm 설치 후 | `dist/components/Button/README.md` | `dist/components/Button/spec.json` |
|
|
39
40
|
|
|
40
|
-
컴포넌트별 문서에 없는 props·variant·상태·사용 맥락은 추측해서 추가하지 않습니다.
|
|
41
|
+
패키지의 전체 AI 문서 읽기 순서는 [llms.txt](llms.txt)에서 확인합니다. 컴포넌트별 문서에 없는 props·variant·상태·사용 맥락은 추측해서 추가하지 않습니다.
|
|
41
42
|
|
|
42
43
|
제공되는 EDS 컴포넌트를 유사한 자체 구현보다 우선 사용합니다. typed prop으로 제공하지 않은 색상·상태·variant를 `className`이나 inline style로 우회하지 않으며, native semantics·accessible name·keyboard interaction을 임의로 변경하지 않습니다.
|
package/README.md
CHANGED
|
@@ -33,7 +33,7 @@ export function SaveButton() {
|
|
|
33
33
|
}
|
|
34
34
|
~~~
|
|
35
35
|
|
|
36
|
-
아이콘만 사용하는 경우 `icon`과 비어 있지 않은 `aria-label`을 함께 제공합니다. `style`과
|
|
36
|
+
아이콘만 사용하는 경우 `icon`과 비어 있지 않은 `aria-label`을 함께 제공합니다. `style`과 임의 스타일 override는 지원하지 않습니다. 전체 contract와 접근성 규칙은 설치된 버전의 `AI.md`를 확인합니다.
|
|
37
37
|
|
|
38
38
|
lucide 아이콘은 PascalCase 이름을 `iconName`, `startIconName`, `endIconName`으로 지정합니다. `ButtonIconName`이 TypeScript 자동완성을 제공하며, 같은 슬롯에 custom ReactElement와 이름을 함께 지정하지 않습니다. 이름으로 지정한 아이콘은 `lucide-react`의 기본 시각 설정을 사용하고 Button이 아이콘 영역 크기를 조정합니다.
|
|
39
39
|
|
|
@@ -77,7 +77,7 @@ lucide 아이콘은 PascalCase 이름을 `iconName`, `startIconName`, `endIconNa
|
|
|
77
77
|
| `aria-*` / `data-*` | native 속성으로 전달할 수 있습니다. |
|
|
78
78
|
| `ref` | native button은 `HTMLButtonElement`, link는 `HTMLAnchorElement`를 전달합니다. |
|
|
79
79
|
|
|
80
|
-
`style`과
|
|
80
|
+
`style`과 임의 스타일 override API는 제공하지 않습니다. lucide 이름과 custom `ReactElement`는 같은 슬롯에 함께 지정하지 않습니다. 이름으로 지정한 lucide 아이콘은 `lucide-react` 기본 시각 설정을 사용하며, Button은 아이콘 영역 크기만 조정합니다.
|
|
81
81
|
|
|
82
82
|
슬롯 조합에 따라 layout은 다음처럼 추론합니다.
|
|
83
83
|
|
|
@@ -89,7 +89,7 @@ lucide 아이콘은 PascalCase 이름을 `iconName`, `startIconName`, `endIconNa
|
|
|
89
89
|
| children과 앞·뒤 아이콘을 모두 지정합니다. | `iconBoth` |
|
|
90
90
|
| children 없이 `icon` 또는 `iconName`만 지정합니다. | `iconOnly` |
|
|
91
91
|
|
|
92
|
-
잘못된 슬롯 조합, 빈 label·accessible name·icon은 모든 환경에서 오류로 처리합니다. Button의 개요와 사용 맥락은
|
|
92
|
+
잘못된 슬롯 조합, 빈 label·accessible name·icon은 모든 환경에서 오류로 처리합니다. Button의 개요와 사용 맥락은 설치된 패키지의 `llms.txt`에서 안내하는 Button 문서를 기준으로 합니다.
|
|
93
93
|
|
|
94
94
|
## 토큰 사용
|
|
95
95
|
|
|
@@ -133,13 +133,16 @@ const color = cssVar(token); // var(--eds-color-fg-brand-contrast)
|
|
|
133
133
|
| `@spectrabrain/eds/styles.css` | Pretendard font와 semantic CSS custom property를 함께 불러옵니다. |
|
|
134
134
|
| `@spectrabrain/eds/fonts.css` | Pretendard font만 불러옵니다. |
|
|
135
135
|
| `@spectrabrain/eds/tokens.json` | 도구 연동용 semantic token manifest입니다. |
|
|
136
|
+
| `@spectrabrain/eds/components/Button/README.md` | Button 개요·사용 맥락·공개 API 문서입니다. |
|
|
137
|
+
| `@spectrabrain/eds/components/Button/spec.json` | Button 공개 API와 접근성 계약을 위한 manifest입니다. |
|
|
138
|
+
| `@spectrabrain/eds/llms.txt` | AI 문서 읽기 순서입니다. |
|
|
136
139
|
| `@spectrabrain/eds/package.json` | 패키지 메타데이터입니다. |
|
|
137
140
|
|
|
138
141
|
표에 명시한 경로만 지원합니다. 설치된 패키지 버전의 API를 기준으로 사용합니다.
|
|
139
142
|
|
|
140
143
|
## 소비자 가이드
|
|
141
144
|
|
|
142
|
-
AI와 자동화 도구를 위한 규칙은 [AI.md](AI.md)에서 확인합니다. React
|
|
145
|
+
AI와 자동화 도구를 위한 규칙은 [AI.md](AI.md)와 [llms.txt](llms.txt)에서 확인합니다. React 컴포넌트를 사용하기 전에는 해당 컴포넌트의 공식 API와 사용 규칙을 먼저 확인합니다.
|
|
143
146
|
|
|
144
147
|
## 라이선스
|
|
145
148
|
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# Button — 개요, 사용 맥락, 공개 API
|
|
2
|
+
|
|
3
|
+
이 문서는 `Button` 디렉토리의 기준 문서입니다. `Button`의 개요·사용 맥락·공개 API·접근성 계약을 기록합니다. Button을 사용하기 전에는 이 문서를 먼저 확인합니다.
|
|
4
|
+
|
|
5
|
+
패키지 설치와 공개 경로는 루트 [README.md](../../../README.md)를, 소비처 AI의 공통 규칙은 루트 [AI.md](../../../AI.md)를 참고합니다. 루트 `AI.md`에는 컴포넌트별 정책을 중복해서 기록하지 않습니다.
|
|
6
|
+
|
|
7
|
+
## 개요
|
|
8
|
+
|
|
9
|
+
`Button`은 사용자가 즉시 실행할 수 있는 행동을 표현하는 인터랙티브 요소입니다. `Size`, `Layout`, `Role`, `Variant`, `State`로 버튼의 크기·구조·의미·위계·상태를 정의합니다.
|
|
10
|
+
|
|
11
|
+
탐색 목적의 링크는 `neutral/link` 조합으로 표현하고, 상태 변경·폼 제출·명령 실행은 native `<button>`으로 표현합니다. `Button`은 현재 React 웹과 light theme만 지원합니다.
|
|
12
|
+
|
|
13
|
+
## 사용 맥락
|
|
14
|
+
|
|
15
|
+
### Size
|
|
16
|
+
|
|
17
|
+
사용 가능한 크기는 `xs`, `sm`, `md`입니다. 사용할 공간과 행동의 중요도를 함께 고려합니다.
|
|
18
|
+
|
|
19
|
+
| size | 사용 맥락 |
|
|
20
|
+
| --- | --- |
|
|
21
|
+
| `xs` | 조밀한 영역이나 보조 UI에 사용합니다. 작은 크기가 행동의 중요도를 대신 표현하지는 않습니다. |
|
|
22
|
+
| `sm` | 일반적인 화면 액션에 사용합니다. |
|
|
23
|
+
| `md` | 공간이 충분하거나 중요한 행동을 명확히 강조해야 할 때 사용합니다. |
|
|
24
|
+
|
|
25
|
+
### Layout
|
|
26
|
+
|
|
27
|
+
Layout은 라벨과 아이콘의 조합으로 결정합니다. 아이콘은 행동의 목적이나 방향을 보조할 때만 사용합니다.
|
|
28
|
+
|
|
29
|
+
| layout | 구성 | 사용 맥락 |
|
|
30
|
+
| --- | --- | --- |
|
|
31
|
+
| `textOnly` | 라벨만 제공합니다. | 아이콘 없이도 행동을 명확히 전달할 수 있을 때 사용합니다. |
|
|
32
|
+
| `iconFirst` | 라벨 앞에 아이콘을 둡니다. | 아이콘이 행동의 목적을 보조할 때 사용합니다. |
|
|
33
|
+
| `iconLast` | 라벨 뒤에 아이콘을 둡니다. | 이동 방향이나 다음 단계를 나타낼 때 사용합니다. |
|
|
34
|
+
| `iconBoth` | 라벨 양쪽에 아이콘을 둡니다. | 양쪽 아이콘이 모두 의미를 더하는 명확한 경우에만 사용합니다. |
|
|
35
|
+
| `iconOnly` | 아이콘만 제공합니다. | 아이콘만으로 행동의 의미가 충분히 명확할 때 사용하며, 비어 있지 않은 `aria-label`이 필요합니다. |
|
|
36
|
+
|
|
37
|
+
### Role
|
|
38
|
+
|
|
39
|
+
Role은 색상 취향이 아니라 버튼이 수행하는 행동의 의미를 정의합니다. `role`은 시각적 prop이며 DOM의 ARIA `role` 속성으로 전달하지 않습니다.
|
|
40
|
+
|
|
41
|
+
| role | 사용 맥락 |
|
|
42
|
+
| --- | --- |
|
|
43
|
+
| `brand` | 브랜드와 관련되거나 화면에서 가장 중요한 행동을 강조할 때 사용합니다. |
|
|
44
|
+
| `neutral` | 일반적인 액션과 탐색에 사용합니다. `brand`보다 낮은 주목도가 필요할 때 선택합니다. |
|
|
45
|
+
| `critical` | 삭제·초기화처럼 오류나 되돌리기 어려운 위험한 행동을 나타낼 때 사용합니다. 가능하면 확인 절차와 함께 사용합니다. |
|
|
46
|
+
|
|
47
|
+
### Variant
|
|
48
|
+
|
|
49
|
+
Variant는 같은 Role 안에서 시각적 위계를 정의합니다.
|
|
50
|
+
|
|
51
|
+
| role / variant | 사용 맥락 |
|
|
52
|
+
| --- | --- |
|
|
53
|
+
| `brand/solid` | 서비스의 핵심 행동에 사용합니다. 한 화면에 하나를 권장합니다. |
|
|
54
|
+
| `brand/outline` | `brand/solid`보다 낮은 위계의 브랜드 보조 행동에 사용합니다. `neutral/outline`과 조합할 수 있으며 같은 액션 그룹에서 `brand/solid`와 함께 사용하지 않는 것을 권장합니다. |
|
|
55
|
+
| `neutral/solid` | `brand/solid` 다음 위계의 일반적인 주요 CTA에 사용합니다. 한 화면에 하나를 권장합니다. |
|
|
56
|
+
| `neutral/weak` | CTA를 제외한 일반적인 보조 행동에 사용하며, CTA와 함께 제공할 때 보조 위계를 표현합니다. |
|
|
57
|
+
| `neutral/outline` | 시각적 부담을 낮춘 대안이나 보조 행동에 사용합니다. `neutral/solid`과 같은 액션 그룹에서 함께 사용하지 않으며, `brand/outline`과 조합할 수 있습니다. |
|
|
58
|
+
| `neutral/ghost` | 툴바·헤더·옵션 메뉴처럼 주변 UI와의 간섭을 줄여야 하는 보조 행동에 사용합니다. |
|
|
59
|
+
| `neutral/link` | 다른 페이지·콘텐츠로 이동하거나 관련 정보를 확인하는 탐색성 행동에 사용합니다. 상태 변경이나 일반 CTA에는 사용하지 않습니다. `href`가 필요하며 `<a>`로 렌더링합니다. |
|
|
60
|
+
| `critical/weak` | 삭제·초기화처럼 되돌리기 어려운 행동에 사용합니다. 위험을 분명히 전달하며 가능하면 확인 대화상자나 Alert Dialog와 함께 사용합니다. |
|
|
61
|
+
|
|
62
|
+
지원하지 않는 Role·Variant 조합을 `className`, inline style, 임의 CSS로 우회하지 않습니다.
|
|
63
|
+
|
|
64
|
+
### State
|
|
65
|
+
|
|
66
|
+
| state | 의미 |
|
|
67
|
+
| --- | --- |
|
|
68
|
+
| enabled | 사용자가 실행할 수 있는 기본 상태입니다. |
|
|
69
|
+
| hover | 포인터가 버튼 위에 있을 때의 상태이며 CSS `:hover`로 처리합니다. |
|
|
70
|
+
| loading | 동작을 처리하는 중인 상태입니다. 라벨·아이콘 공간을 유지한 progress circle을 표시하고 상호작용을 차단합니다. |
|
|
71
|
+
| disabled | 사용자가 실행할 수 없는 상태입니다. |
|
|
72
|
+
|
|
73
|
+
`active`, `pressed`, `visited` 등 문서에 없는 상태는 추가하지 않습니다.
|
|
74
|
+
|
|
75
|
+
## 공개 API contract
|
|
76
|
+
|
|
77
|
+
다음 props는 필수입니다.
|
|
78
|
+
|
|
79
|
+
| prop | 허용 값 | 설명 |
|
|
80
|
+
| --- | --- | --- |
|
|
81
|
+
| `size` | `xs`, `sm`, `md` | 버튼 크기입니다. |
|
|
82
|
+
| `role` | `brand`, `neutral`, `critical` | 시각적 역할이며 DOM ARIA `role`로 전달하지 않습니다. |
|
|
83
|
+
| `variant` | role별 아래 표 | 역할에 종속된 표현입니다. |
|
|
84
|
+
| `type` | `button`, `submit`, `reset` | native button branch에서 필수입니다. |
|
|
85
|
+
| `href` | `string` | `neutral/link` branch에서 필수이며 `<a>`로 렌더링합니다. |
|
|
86
|
+
|
|
87
|
+
허용하는 role·variant 조합은 다음과 같습니다.
|
|
88
|
+
|
|
89
|
+
| role | variant |
|
|
90
|
+
| --- | --- |
|
|
91
|
+
| `brand` | `solid`, `outline` |
|
|
92
|
+
| `neutral` | `solid`, `weak`, `outline`, `ghost`, `link` |
|
|
93
|
+
| `critical` | `weak` |
|
|
94
|
+
|
|
95
|
+
### API reference
|
|
96
|
+
|
|
97
|
+
| prop | 타입·규칙 |
|
|
98
|
+
| --- | --- |
|
|
99
|
+
| `children` | `ReactNode` label입니다. 렌더링 가능한 내용이 하나 이상 필요하며 `startIcon`·`endIcon`과 조합할 수 있습니다. |
|
|
100
|
+
| `icon` | icon-only용 단일 custom `ReactElement`입니다. children이나 start/end icon과 함께 사용하지 않습니다. |
|
|
101
|
+
| `iconName` | icon-only용 `ButtonIconName` lucide 이름입니다. |
|
|
102
|
+
| `startIcon` / `endIcon` | label 앞·뒤의 단일 custom `ReactElement` 슬롯입니다. |
|
|
103
|
+
| `startIconName` / `endIconName` | label 앞·뒤의 `ButtonIconName` lucide 이름 슬롯입니다. |
|
|
104
|
+
| `aria-label` | `string`이며 icon-only에서 비어 있지 않은 accessible name으로 필수입니다. |
|
|
105
|
+
| `disabled` | `boolean`입니다. native button은 `disabled`, link는 href 제거·`aria-disabled="true"`·`tabIndex={-1}`를 적용합니다. |
|
|
106
|
+
| `loading` | `boolean`입니다. label·아이콘 공간을 유지한 progress circle을 표시하고 상호작용을 차단합니다. `aria-busy="true"`를 적용합니다. |
|
|
107
|
+
| `className` | `string`이며 배치·컨테이너 보정에만 허용합니다. |
|
|
108
|
+
| `aria-*` / `data-*` | 각 branch의 native HTML 속성으로 전달할 수 있습니다. |
|
|
109
|
+
| `ref` | branch에 따라 `HTMLButtonElement` 또는 `HTMLAnchorElement`를 전달합니다. |
|
|
110
|
+
|
|
111
|
+
`style`과 임의 스타일 override는 공개하지 않습니다. 이름으로 지정한 lucide 아이콘은 `lucide-react` 기본 시각 설정을 사용하며 Button은 아이콘 영역 크기만 조정합니다. 공개 소비처의 role·variant 선택과 사용 맥락도 이 문서를 기준으로 합니다.
|
|
112
|
+
|
|
113
|
+
`variant="link"`는 `role="neutral"`에서만 사용할 수 있으며 `href`가 필수입니다. 이 조합은 `<a>`로 렌더링합니다. native button에는 기본값을 제공하지 않습니다.
|
|
114
|
+
|
|
115
|
+
`startIcon`, `endIcon`, `icon`은 단일 `ReactElement` 슬롯입니다. lucide 아이콘은 `startIconName`, `endIconName`, `iconName`으로 PascalCase 전체 이름을 지정합니다. 이름 prop은 `ButtonIconName` 자동완성을 제공하며 custom ReactElement와 같은 슬롯에 함께 지정할 수 없습니다.
|
|
116
|
+
|
|
117
|
+
이름으로 지정한 lucide 아이콘은 `lucide-react`의 기본 시각 설정을 사용합니다. Button은 아이콘 영역의 크기만 조정하며, `color`, `size`, `strokeWidth`, `strokeLinecap`, `strokeLinejoin`을 소비처 prop으로 노출하거나 덮어쓰지 않습니다. `aria-hidden`과 `focusable`은 Button 접근성 contract에 따라 내부에서 설정합니다.
|
|
118
|
+
|
|
119
|
+
- children만 있으면 `textOnly`입니다.
|
|
120
|
+
- children과 `startIcon`이 있으면 `iconFirst`입니다.
|
|
121
|
+
- children과 `endIcon`이 있으면 `iconLast`입니다.
|
|
122
|
+
- children과 두 아이콘이 있으면 `iconBoth`입니다.
|
|
123
|
+
- children 없이 `icon`만 있으면 `iconOnly`이며 비어 있지 않은 `aria-label`이 필수입니다.
|
|
124
|
+
|
|
125
|
+
빈 label·icon과 잘못된 슬롯 조합은 모든 환경에서 오류로 처리합니다. label은 한 줄을 유지합니다.
|
|
126
|
+
|
|
127
|
+
`className`, native `aria-*`, `data-*`, `forwardRef`를 지원합니다. `style`과 임의 스타일 override는 공개하지 않습니다.
|
|
128
|
+
|
|
129
|
+
`loading`은 선택 prop입니다. 라벨과 아이콘의 공간·접근성 이름을 유지하면서 내부 2색 SVG progress circle을 표시합니다. 라벨과 아이콘은 시각적으로만 숨겨지며, native button은 `disabled`, link는 href 제거·`aria-disabled="true"`·`tabIndex={-1}`로 상호작용을 차단합니다. loading 중에는 `aria-busy="true"`를 적용하며 `disabled`와 함께 지정하면 loading 시각을 우선합니다.
|
|
130
|
+
|
|
131
|
+
## 접근성·상호작용
|
|
132
|
+
|
|
133
|
+
- native button은 `disabled` 속성을 사용합니다.
|
|
134
|
+
- disabled link는 `href`를 제거하고 `aria-disabled="true"`, `tabIndex={-1}`를 적용하며 클릭을 막습니다. href가 제거된 앵커는 의도적으로 link role을 노출하지 않습니다.
|
|
135
|
+
- hover는 CSS `:hover`로 처리합니다.
|
|
136
|
+
- 승인된 시각 상태는 enabled, hover, disabled, loading이며 focus-visible은 별도 focus ring 상태로 제공합니다. active·pressed·visited 상태는 지원하지 않습니다.
|
|
137
|
+
- focus-visible ring은 `color-stroke-focusRing` semantic token과 2px outline·offset 구조값을 사용합니다.
|
|
138
|
+
- 아이콘은 시각 장식으로 `aria-hidden="true"` 처리하며, icon-only의 이름은 Button의 `aria-label`로 제공합니다.
|
|
139
|
+
- loading progress circle은 `800ms linear infinite` 회전하며 `prefers-reduced-motion: reduce`에서는 정지합니다.
|
|
140
|
+
|
|
141
|
+
## 문서와 검증
|
|
142
|
+
|
|
143
|
+
Button의 공개 API와 사용 맥락은 이 문서와 설치된 패키지의 공개 `spec.json`을 함께 기준으로 사용합니다. 공개 Props·variant·상태를 변경할 때는 디자인 시스템 담당자의 검토와 적절한 버전 변경이 필요합니다.
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
{
|
|
2
|
+
"specVersion": 1,
|
|
3
|
+
"packageVersion": "0.0.3",
|
|
4
|
+
"name": "Button",
|
|
5
|
+
"purpose": "사용자가 즉시 실행할 수 있는 행동과 탐색을 표현하는 인터랙티브 요소입니다.",
|
|
6
|
+
"usageContexts": [
|
|
7
|
+
"상태 변경·폼 제출·명령 실행에는 native button branch를 사용합니다.",
|
|
8
|
+
"다른 페이지나 콘텐츠로 이동하는 탐색에는 neutral/link branch를 사용합니다.",
|
|
9
|
+
"brand는 화면에서 가장 중요한 행동을 강조할 때 사용합니다.",
|
|
10
|
+
"neutral은 일반적인 액션과 탐색에 사용합니다.",
|
|
11
|
+
"critical은 삭제·초기화처럼 되돌리기 어려운 행동에 사용합니다."
|
|
12
|
+
],
|
|
13
|
+
"unsupportedContexts": [
|
|
14
|
+
"문서에 없는 role·variant·상태를 className이나 inline style로 우회하지 않습니다.",
|
|
15
|
+
"상태 변경이나 일반 CTA를 neutral/link로 표현하지 않습니다.",
|
|
16
|
+
"icon-only에서는 accessible name 없이 아이콘만 사용하지 않습니다."
|
|
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을 필수로 지정합니다.",
|
|
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
|
+
}
|
package/dist/components.css
CHANGED
|
@@ -309,22 +309,29 @@
|
|
|
309
309
|
|
|
310
310
|
.eds-button__progressCircle {
|
|
311
311
|
position: absolute;
|
|
312
|
-
|
|
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
|
|
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
|
|
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
|
|
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/llms.txt
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# EVA Design System AI 문서 인덱스
|
|
2
|
+
|
|
3
|
+
이 패키지는 React 웹용 EVA 디자인 시스템입니다. 다음 순서로 문서를 읽습니다.
|
|
4
|
+
|
|
5
|
+
1. [AI 사용 규칙](./AI.md)을 읽고 공개 범위와 금지 사례를 확인합니다.
|
|
6
|
+
2. [Button 개요·사용 맥락·API](./dist/components/Button/README.md)를 읽은 뒤 컴포넌트를 사용합니다.
|
|
7
|
+
3. [Button 공개 manifest](./dist/components/Button/spec.json)에서 허용 조합과 접근성 계약을 확인합니다.
|
|
8
|
+
4. [semantic token manifest](./dist/tokens.json)에서 사용 가능한 token 이름을 확인합니다.
|
|
9
|
+
5. [npm 소비자 안내](./README.md)에서 설치와 CSS 진입점을 확인합니다.
|
|
10
|
+
|
|
11
|
+
문서에 없는 API나 시각 상태를 추측하지 않습니다. 구현보다 문서와 TypeScript contract를 우선합니다.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@spectrabrain/eds",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "EVA services' shared React design system",
|
|
5
5
|
"author": "SpectraBrain",
|
|
6
6
|
"license": "UNLICENSED",
|
|
@@ -8,75 +8,48 @@
|
|
|
8
8
|
"main": "./dist/index.js",
|
|
9
9
|
"module": "./dist/index.mjs",
|
|
10
10
|
"types": "./dist/index.d.ts",
|
|
11
|
-
"exports": {
|
|
12
|
-
".": {
|
|
13
|
-
"import": {
|
|
14
|
-
"types": "./dist/index.d.mts",
|
|
15
|
-
"default": "./dist/index.mjs"
|
|
16
|
-
},
|
|
17
|
-
"require": {
|
|
18
|
-
"types": "./dist/index.d.ts",
|
|
19
|
-
"default": "./dist/index.js"
|
|
20
|
-
},
|
|
21
|
-
"default": "./dist/index.js"
|
|
22
|
-
},
|
|
23
|
-
"./tokens": {
|
|
24
|
-
"import": {
|
|
25
|
-
"types": "./dist/tokens.d.mts",
|
|
26
|
-
"default": "./dist/tokens.mjs"
|
|
27
|
-
},
|
|
28
|
-
"require": {
|
|
29
|
-
"types": "./dist/tokens.d.ts",
|
|
30
|
-
"default": "./dist/tokens.js"
|
|
31
|
-
},
|
|
32
|
-
"default": "./dist/tokens.js"
|
|
33
|
-
},
|
|
34
|
-
"./tokens.css": "./dist/tokens.css",
|
|
35
|
-
"./styles.css": "./dist/styles.css",
|
|
36
|
-
"./fonts.css": "./dist/fonts.css",
|
|
37
|
-
"./tokens.json": "./dist/tokens.json",
|
|
38
|
-
"./package.json": "./package.json"
|
|
39
|
-
},
|
|
40
11
|
"files": [
|
|
41
12
|
"dist",
|
|
42
13
|
"README.md",
|
|
43
14
|
"AI.md",
|
|
15
|
+
"llms.txt",
|
|
44
16
|
"NOTICE"
|
|
45
17
|
],
|
|
46
|
-
"engines": {
|
|
47
|
-
"node": ">=18"
|
|
48
|
-
},
|
|
49
|
-
"publishConfig": {
|
|
50
|
-
"access": "public"
|
|
51
|
-
},
|
|
52
|
-
"sideEffects": [
|
|
53
|
-
"./dist/tokens.css",
|
|
54
|
-
"./dist/styles.css",
|
|
55
|
-
"./dist/fonts.css"
|
|
56
|
-
],
|
|
57
|
-
"peerDependencies": {
|
|
58
|
-
"react": ">=18.2 <20"
|
|
59
|
-
},
|
|
60
18
|
"scripts": {
|
|
61
19
|
"tokens:generate": "tsx scripts/build-tokens.ts",
|
|
62
20
|
"components:generate": "tsx scripts/build-components.ts",
|
|
21
|
+
"component-manifest:generate": "tsx scripts/build-component-manifest.ts",
|
|
63
22
|
"tokens:validate": "tsx scripts/build-tokens.ts --validate",
|
|
64
23
|
"tokens:connectivity": "tsx scripts/check-token-connectivity.ts",
|
|
65
24
|
"tokens:connectivity:strict": "npm run tokens:connectivity -- --strict",
|
|
66
|
-
"typecheck": "npm run tokens:generate && npm run components:generate && tsc --noEmit",
|
|
67
25
|
"library:build": "tsup",
|
|
68
26
|
"fonts:build": "tsx scripts/build-font-assets.ts",
|
|
69
|
-
"tokens:build": "npm run typecheck && npm run library:build && npm run fonts:build && npm run public-boundary:check",
|
|
27
|
+
"tokens:build": "npm run typecheck && npm run library:build && npm run component-manifest:generate && npm run fonts:build && npm run public-boundary:check",
|
|
70
28
|
"public-boundary:check": "tsx scripts/check-public-boundary.ts",
|
|
71
|
-
"storybook": "npm run tokens:generate && npm run components:generate && npm run fonts:build && storybook
|
|
29
|
+
"storybook": "npm run tokens:generate && npm run components:generate && npm run component-manifest:generate && npm run fonts:build && node scripts/storybook-dev.mjs",
|
|
72
30
|
"storybook:build": "npm run tokens:build && storybook build",
|
|
73
|
-
"storybook:test": "npm run tokens:generate && npm run components:generate && npm run fonts:build && vitest --config vitest.storybook.config.ts run",
|
|
31
|
+
"storybook:test": "npm run tokens:generate && npm run components:generate && npm run component-manifest:generate && npm run fonts:build && vitest --config vitest.storybook.config.ts run",
|
|
32
|
+
"typecheck": "npm run tokens:generate && npm run components:generate && npm run component-manifest:generate && tsc --noEmit",
|
|
74
33
|
"build": "npm run tokens:build",
|
|
75
34
|
"package:check": "node scripts/check-package-exports.mjs",
|
|
76
35
|
"prepack": "npm run tokens:build",
|
|
77
36
|
"test:unit": "vitest run",
|
|
78
37
|
"test": "npm run tokens:build && npm run test:unit"
|
|
79
38
|
},
|
|
39
|
+
"engines": {
|
|
40
|
+
"node": ">=18"
|
|
41
|
+
},
|
|
42
|
+
"publishConfig": {
|
|
43
|
+
"access": "public"
|
|
44
|
+
},
|
|
45
|
+
"sideEffects": [
|
|
46
|
+
"./dist/tokens.css",
|
|
47
|
+
"./dist/styles.css",
|
|
48
|
+
"./dist/fonts.css"
|
|
49
|
+
],
|
|
50
|
+
"peerDependencies": {
|
|
51
|
+
"react": ">=18.2 <20"
|
|
52
|
+
},
|
|
80
53
|
"devDependencies": {
|
|
81
54
|
"@changesets/cli": "^2.29.7",
|
|
82
55
|
"@storybook/addon-a11y": "^10.6.0",
|
|
@@ -105,5 +78,37 @@
|
|
|
105
78
|
},
|
|
106
79
|
"dependencies": {
|
|
107
80
|
"lucide-react": "1.45.0"
|
|
81
|
+
},
|
|
82
|
+
"exports": {
|
|
83
|
+
".": {
|
|
84
|
+
"import": {
|
|
85
|
+
"types": "./dist/index.d.mts",
|
|
86
|
+
"default": "./dist/index.mjs"
|
|
87
|
+
},
|
|
88
|
+
"require": {
|
|
89
|
+
"types": "./dist/index.d.ts",
|
|
90
|
+
"default": "./dist/index.js"
|
|
91
|
+
},
|
|
92
|
+
"default": "./dist/index.js"
|
|
93
|
+
},
|
|
94
|
+
"./tokens": {
|
|
95
|
+
"import": {
|
|
96
|
+
"types": "./dist/tokens.d.mts",
|
|
97
|
+
"default": "./dist/tokens.mjs"
|
|
98
|
+
},
|
|
99
|
+
"require": {
|
|
100
|
+
"types": "./dist/tokens.d.ts",
|
|
101
|
+
"default": "./dist/tokens.js"
|
|
102
|
+
},
|
|
103
|
+
"default": "./dist/tokens.js"
|
|
104
|
+
},
|
|
105
|
+
"./tokens.css": "./dist/tokens.css",
|
|
106
|
+
"./styles.css": "./dist/styles.css",
|
|
107
|
+
"./fonts.css": "./dist/fonts.css",
|
|
108
|
+
"./tokens.json": "./dist/tokens.json",
|
|
109
|
+
"./components/Button/README.md": "./dist/components/Button/README.md",
|
|
110
|
+
"./components/Button/spec.json": "./dist/components/Button/spec.json",
|
|
111
|
+
"./llms.txt": "./llms.txt",
|
|
112
|
+
"./package.json": "./package.json"
|
|
108
113
|
}
|
|
109
114
|
}
|