@orioncactuscorp/ui 1.10.0 → 1.11.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.
Files changed (84) hide show
  1. package/README.md +119 -54
  2. package/dist/components/Accordion/Accordion.css +1 -1
  3. package/dist/components/Accordion/Accordion.js +169 -177
  4. package/dist/components/ActionArea/ActionAreaLayout.js +20 -24
  5. package/dist/components/Cell/Cell.css +1 -1
  6. package/dist/components/Cell/Cell.js +57 -58
  7. package/dist/components/CheckMark/CheckMark.css +1 -1
  8. package/dist/components/Checkbox/Checkbox.css +1 -1
  9. package/dist/components/Checkbox/Checkbox.js +50 -51
  10. package/dist/components/Menu/Menu.css +1 -1
  11. package/dist/components/Menu/Menu.module.scss.js +20 -22
  12. package/dist/components/Modal/Modal.js +253 -261
  13. package/dist/components/Modal/useModalContentBlockTransition.js +49 -44
  14. package/dist/components/Radio/Radio.css +1 -1
  15. package/dist/components/ScrollArea/ScrollArea.js +197 -200
  16. package/dist/components/Select/Select.js +31 -34
  17. package/dist/components/Switch/Switch.css +1 -1
  18. package/dist/components/Tabs/Tabs.css +1 -0
  19. package/dist/components/Tabs/Tabs.js +208 -0
  20. package/dist/components/Tabs/Tabs.module.scss.js +27 -0
  21. package/dist/components/Tabs.d.ts +6 -0
  22. package/dist/components/Tabs.js +8 -0
  23. package/dist/components/TextArea/TextArea.js +57 -58
  24. package/dist/components/TextInput/TextInput.js +30 -33
  25. package/dist/components/Tooltip/Tooltip.css +1 -1
  26. package/dist/foundations/color.theme.dark.css +1 -1
  27. package/dist/foundations/color.theme.light.css +1 -1
  28. package/dist/foundations/focus.css +1 -0
  29. package/dist/foundations/reset.css +1 -1
  30. package/dist/foundations.css +4 -3
  31. package/dist/index.js +69 -64
  32. package/dist/react/motion.js +31 -35
  33. package/dist/reset.css +1 -1
  34. package/dist/styles.css +13 -11
  35. package/dist/ui/src/components/Accordion/Accordion.d.ts.map +1 -1
  36. package/dist/ui/src/components/ActionArea/ActionAreaLayout.d.ts.map +1 -1
  37. package/dist/ui/src/components/Cell/Cell.d.ts.map +1 -1
  38. package/dist/ui/src/components/CheckMark/types.d.ts +10 -0
  39. package/dist/ui/src/components/CheckMark/types.d.ts.map +1 -1
  40. package/dist/ui/src/components/Checkbox/Checkbox.d.ts.map +1 -1
  41. package/dist/ui/src/components/Checkbox/types.d.ts +16 -0
  42. package/dist/ui/src/components/Checkbox/types.d.ts.map +1 -1
  43. package/dist/ui/src/components/Modal/Modal.d.ts.map +1 -1
  44. package/dist/ui/src/components/Modal/useModalContentBlockTransition.d.ts.map +1 -1
  45. package/dist/ui/src/components/Radio/types.d.ts +16 -0
  46. package/dist/ui/src/components/Radio/types.d.ts.map +1 -1
  47. package/dist/ui/src/components/ScrollArea/ScrollArea.d.ts.map +1 -1
  48. package/dist/ui/src/components/Select/Select.d.ts.map +1 -1
  49. package/dist/ui/src/components/Switch/types.d.ts +10 -0
  50. package/dist/ui/src/components/Switch/types.d.ts.map +1 -1
  51. package/dist/ui/src/components/Tabs/Tabs.d.ts +7 -0
  52. package/dist/ui/src/components/Tabs/Tabs.d.ts.map +1 -0
  53. package/dist/ui/src/components/Tabs/index.d.ts +3 -0
  54. package/dist/ui/src/components/Tabs/index.d.ts.map +1 -0
  55. package/dist/ui/src/components/Tabs/types.d.ts +26 -0
  56. package/dist/ui/src/components/Tabs/types.d.ts.map +1 -0
  57. package/dist/ui/src/components/TextArea/TextArea.d.ts.map +1 -1
  58. package/dist/ui/src/components/TextInput/TextInput.d.ts.map +1 -1
  59. package/dist/ui/src/index.d.ts +2 -0
  60. package/dist/ui/src/index.d.ts.map +1 -1
  61. package/dist/ui/src/react/motion/index.d.ts.map +1 -1
  62. package/dist/ui/src/utils/mergeRefs.d.ts +13 -0
  63. package/dist/ui/src/utils/mergeRefs.d.ts.map +1 -0
  64. package/dist/utils/mergeRefs.js +24 -0
  65. package/dist/vscode/oc-ui-vars.css +13 -0
  66. package/docs/editor-setup.md +42 -0
  67. package/docs/motion.md +665 -0
  68. package/docs/responsive-foundation-profile.md +230 -0
  69. package/docs/scss-helpers.md +189 -0
  70. package/docs/selector-contract.md +260 -0
  71. package/docs/spring.md +382 -0
  72. package/docs/stability.md +62 -0
  73. package/docs/tokens.md +559 -0
  74. package/package.json +9 -4
  75. package/src/scss/foundations/color-theme.test.ts +14 -0
  76. package/src/scss/foundations/color.theme.dark.scss +1 -0
  77. package/src/scss/foundations/color.theme.light.scss +1 -0
  78. package/src/scss/foundations/focus.scss +4 -0
  79. package/src/scss/foundations/focus.test.ts +48 -0
  80. package/src/scss/foundations/reset.scss +9 -4
  81. package/src/scss/foundations/reset.test.ts +32 -0
  82. package/src/scss/index.scss +2 -0
  83. package/src/scss/mixins/_focus.scss +11 -0
  84. package/src/scss/mixins/_focus.test.ts +58 -0
@@ -0,0 +1,62 @@
1
+ # Stability Policy
2
+
3
+ `@orioncactuscorp/ui`가 무엇을 공개 계약으로 보고, 무엇을 breaking change로 취급하는지 정의합니다. 릴리스는 [Semantic Versioning](https://semver.org/lang/ko/)과 [Changesets](https://github.com/changesets/changesets)로 관리하며, consumer 영향이 있는 변경은 CHANGELOG의 Migration Notes에 기록합니다.
4
+
5
+ ## 공개 계약의 범위
6
+
7
+ **문서화된 표면이 계약입니다.** README와 `docs/`(이 패키지에 동봉)에서 문서화한 것만 안정성을 보장합니다.
8
+
9
+ | 표면 | 계약 기준 |
10
+ | -------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
11
+ | 컴포넌트 props | 패키지 타입 정의 (`types.ts` 기반 공개 타입) |
12
+ | exports map | `package.json` `exports`의 subpath 중 README Exports에 문서화된 것 |
13
+ | selector 계약 | [Selector Contract](./selector-contract.md)의 `data-oc-component` / `data-oc-part` / visual·state selector 표 |
14
+ | CSS 변수 | foundation `--oc-*` 토큰 이름([Token Reference](./tokens.md))과 문서화된 component contract 변수(`--oc-{component}-*`) |
15
+ | SCSS API | [SCSS Helpers](./scss-helpers.md), [Semantic Motion](./motion.md), [Spring Motion](./spring.md), [Responsive Foundation Profile](./responsive-foundation-profile.md)에 문서화된 mixin/function/설정 변수 |
16
+
17
+ 다음은 계약이 **아니며** 예고 없이 바뀔 수 있습니다.
18
+
19
+ - CSS Module 클래스 이름 (해시 포함)
20
+ - selector 계약 표에 없는 내부 DOM 구조·wrapper 요소
21
+ - 문서화되지 않은 SCSS export, 내부 함수(`_` prefix), 내부 CSS 변수
22
+ - `dist/` 내부 파일 구조 (문서화된 exports subpath 경유가 아닌 직접 경로 import)
23
+
24
+ ## Breaking change 기준
25
+
26
+ major 버전에서만 진행하는 변경:
27
+
28
+ - 문서화된 prop, export, mixin/function의 제거 또는 의미 변경
29
+ - `data-oc-*` selector 계약의 제거·이름 변경, selector 표에 있는 slot 구조 변경
30
+ - 문서화된 `--oc-*` 토큰·component contract 변수의 제거·이름 변경
31
+ - [Legacy 호환 attribute](./selector-contract.md#legacy-호환-출력)의 제거
32
+ - 지원 브라우저·React·Node 최소 버전 상향
33
+
34
+ minor에서 진행하는 변경:
35
+
36
+ - 새 컴포넌트, 새 prop, 새 토큰, 새 selector 계약의 추가
37
+ - deprecation 선언 (동작 유지 + Migration Notes 안내)
38
+
39
+ patch에서 진행하는 변경:
40
+
41
+ - 계약을 바꾸지 않는 버그 수정, 시각 결함 수정, 문서 수정
42
+
43
+ 시각 스타일의 세부 값(색·간격·모션 수치)은 디자인 시스템 정책에 따라 minor에서 조정될 수 있습니다. 특정 픽셀 값 자체는 계약이 아니며, 토큰·selector를 통한 override 경로가 계약입니다.
44
+
45
+ ## Deprecation 절차
46
+
47
+ 1. 대체 경로가 준비된 minor 릴리스에서 deprecated로 선언하고 CHANGELOG Migration Notes에 대체 방법을 기록합니다.
48
+ 2. deprecated 표면은 최소 한 번의 minor 주기 동안 동작을 유지합니다.
49
+ 3. 제거는 다음 major 릴리스에서 Migration Notes와 함께 진행합니다.
50
+
51
+ ## 의존성 고지
52
+
53
+ - `@base-ui-components/react`: 현재 `1.0.0-rc` 계열(release candidate)에 의존합니다. Base UI가 안정판을 릴리스하면 minor 버전에서 전환할 예정입니다. RC 기간 동안 Base UI 쪽 데이터 attribute(`data-starting-style` 등)나 내부 동작 변경이 전이될 수 있으며, 확인된 영향은 Migration Notes에 기록합니다.
54
+ - `@orioncactuscorp/icons`: 컴포넌트 내부 indicator용 dependency입니다. 앱 코드에서 아이콘을 직접 import하는 경우에만 직접 의존성으로 추가하세요.
55
+
56
+ ## 지원 환경
57
+
58
+ - React 19+, React DOM 19+
59
+ - Node 22+
60
+ - 브라우저: **`color-mix()`를 지원하는 evergreen 브라우저** — Chrome/Edge 111+, Safari 16.2+, Firefox 113+ (2023년 상반기 이후)
61
+ - `color-mix()`보다 지원 범위가 좁은 CSS 기능은 fallback 또는 `@supports` 가드와 함께 사용합니다. 기준선 미만 브라우저에서 시각 품질 저하는 있을 수 있으나, layout·접근성·상호작용이 깨지는 결함은 버그로 취급합니다.
62
+ - CSS Modules와 CSS `@layer`를 처리하는 bundler
package/docs/tokens.md ADDED
@@ -0,0 +1,559 @@
1
+ # Token Reference
2
+
3
+ <!-- Generated by packages/ui/scripts/generate-token-reference.mjs. Do not edit manually. -->
4
+
5
+ `@orioncactuscorp/ui/foundations.css`가 선언하는 `--oc-*` foundation 토큰 전체 목록입니다. `bun run build:css` 시 자동 재생성됩니다.
6
+
7
+ 토큰 값은 theme(`data-theme`)과 viewport(responsive mode)에 따라 달라질 수 있으므로 이 문서는 이름과 용도를 기준으로 제공합니다. 실제 값은 브라우저 devtools의 computed value 또는 [VS Code 자동완성 index](./editor-setup.md)로 확인하세요.
8
+
9
+ 값 커스터마이즈 방법은 README의 Foundation 섹션과 [Responsive Foundation Profile](./responsive-foundation-profile.md)을 참조하세요.
10
+
11
+ ## Color — theme semantic
12
+
13
+ `:root`, `[data-theme="light"]`, `[data-theme="dark"]`에서 theme별 값으로 선언됩니다. consumer override는 theme selector 스코프에서 수행합니다.
14
+
15
+ - `--oc-color-theme-accent-background-blue`
16
+ - `--oc-color-theme-accent-background-cyan`
17
+ - `--oc-color-theme-accent-background-green`
18
+ - `--oc-color-theme-accent-background-lightBlue`
19
+ - `--oc-color-theme-accent-background-lime`
20
+ - `--oc-color-theme-accent-background-orange`
21
+ - `--oc-color-theme-accent-background-pink`
22
+ - `--oc-color-theme-accent-background-purple`
23
+ - `--oc-color-theme-accent-background-red`
24
+ - `--oc-color-theme-accent-background-redOrange`
25
+ - `--oc-color-theme-accent-background-violet`
26
+ - `--oc-color-theme-accent-foreground-blue`
27
+ - `--oc-color-theme-accent-foreground-cyan`
28
+ - `--oc-color-theme-accent-foreground-green`
29
+ - `--oc-color-theme-accent-foreground-lightBlue`
30
+ - `--oc-color-theme-accent-foreground-lime`
31
+ - `--oc-color-theme-accent-foreground-orange`
32
+ - `--oc-color-theme-accent-foreground-pink`
33
+ - `--oc-color-theme-accent-foreground-purple`
34
+ - `--oc-color-theme-accent-foreground-red`
35
+ - `--oc-color-theme-accent-foreground-redOrange`
36
+ - `--oc-color-theme-accent-foreground-violet`
37
+ - `--oc-color-theme-background-elevated-alternative`
38
+ - `--oc-color-theme-background-elevated-normal`
39
+ - `--oc-color-theme-background-normal-alternative`
40
+ - `--oc-color-theme-background-normal-normal`
41
+ - `--oc-color-theme-fill-alternative`
42
+ - `--oc-color-theme-fill-normal`
43
+ - `--oc-color-theme-fill-strong`
44
+ - `--oc-color-theme-focus-ring`
45
+ - `--oc-color-theme-interaction-disable`
46
+ - `--oc-color-theme-interaction-inactive`
47
+ - `--oc-color-theme-inverse-background`
48
+ - `--oc-color-theme-inverse-label`
49
+ - `--oc-color-theme-inverse-primary`
50
+ - `--oc-color-theme-label-alternative`
51
+ - `--oc-color-theme-label-assistive`
52
+ - `--oc-color-theme-label-disable`
53
+ - `--oc-color-theme-label-neutral`
54
+ - `--oc-color-theme-label-normal`
55
+ - `--oc-color-theme-label-strong`
56
+ - `--oc-color-theme-line-normal-alternative`
57
+ - `--oc-color-theme-line-normal-neutral`
58
+ - `--oc-color-theme-line-normal-normal`
59
+ - `--oc-color-theme-line-normal-strong`
60
+ - `--oc-color-theme-line-solid-alternative`
61
+ - `--oc-color-theme-line-solid-neutral`
62
+ - `--oc-color-theme-line-solid-normal`
63
+ - `--oc-color-theme-line-solid-strong`
64
+ - `--oc-color-theme-material-dimmer`
65
+ - `--oc-color-theme-primary-normal`
66
+ - `--oc-color-theme-static-black`
67
+ - `--oc-color-theme-static-transparent`
68
+ - `--oc-color-theme-static-white`
69
+ - `--oc-color-theme-status-cautionary`
70
+ - `--oc-color-theme-status-negative`
71
+ - `--oc-color-theme-status-positive`
72
+
73
+ ## Color — global primitive
74
+
75
+ theme와 무관한 primitive 값입니다. 컴포넌트에서는 theme semantic 토큰을 우선 사용하세요.
76
+
77
+ - `--oc-color-global-blue-0`
78
+ - `--oc-color-global-blue-10`
79
+ - `--oc-color-global-blue-100`
80
+ - `--oc-color-global-blue-20`
81
+ - `--oc-color-global-blue-30`
82
+ - `--oc-color-global-blue-40`
83
+ - `--oc-color-global-blue-45`
84
+ - `--oc-color-global-blue-50`
85
+ - `--oc-color-global-blue-55`
86
+ - `--oc-color-global-blue-60`
87
+ - `--oc-color-global-blue-65`
88
+ - `--oc-color-global-blue-70`
89
+ - `--oc-color-global-blue-80`
90
+ - `--oc-color-global-blue-90`
91
+ - `--oc-color-global-blue-95`
92
+ - `--oc-color-global-blue-99`
93
+ - `--oc-color-global-common-0`
94
+ - `--oc-color-global-common-100`
95
+ - `--oc-color-global-common-transparent`
96
+ - `--oc-color-global-coolNeutral-0`
97
+ - `--oc-color-global-coolNeutral-10`
98
+ - `--oc-color-global-coolNeutral-100`
99
+ - `--oc-color-global-coolNeutral-15`
100
+ - `--oc-color-global-coolNeutral-17`
101
+ - `--oc-color-global-coolNeutral-20`
102
+ - `--oc-color-global-coolNeutral-22`
103
+ - `--oc-color-global-coolNeutral-23`
104
+ - `--oc-color-global-coolNeutral-25`
105
+ - `--oc-color-global-coolNeutral-30`
106
+ - `--oc-color-global-coolNeutral-40`
107
+ - `--oc-color-global-coolNeutral-5`
108
+ - `--oc-color-global-coolNeutral-50`
109
+ - `--oc-color-global-coolNeutral-60`
110
+ - `--oc-color-global-coolNeutral-7`
111
+ - `--oc-color-global-coolNeutral-70`
112
+ - `--oc-color-global-coolNeutral-80`
113
+ - `--oc-color-global-coolNeutral-90`
114
+ - `--oc-color-global-coolNeutral-95`
115
+ - `--oc-color-global-coolNeutral-96`
116
+ - `--oc-color-global-coolNeutral-97`
117
+ - `--oc-color-global-coolNeutral-98`
118
+ - `--oc-color-global-coolNeutral-99`
119
+ - `--oc-color-global-cyan-0`
120
+ - `--oc-color-global-cyan-10`
121
+ - `--oc-color-global-cyan-100`
122
+ - `--oc-color-global-cyan-20`
123
+ - `--oc-color-global-cyan-30`
124
+ - `--oc-color-global-cyan-40`
125
+ - `--oc-color-global-cyan-50`
126
+ - `--oc-color-global-cyan-60`
127
+ - `--oc-color-global-cyan-70`
128
+ - `--oc-color-global-cyan-80`
129
+ - `--oc-color-global-cyan-90`
130
+ - `--oc-color-global-cyan-95`
131
+ - `--oc-color-global-cyan-99`
132
+ - `--oc-color-global-green-0`
133
+ - `--oc-color-global-green-10`
134
+ - `--oc-color-global-green-100`
135
+ - `--oc-color-global-green-20`
136
+ - `--oc-color-global-green-30`
137
+ - `--oc-color-global-green-40`
138
+ - `--oc-color-global-green-50`
139
+ - `--oc-color-global-green-60`
140
+ - `--oc-color-global-green-70`
141
+ - `--oc-color-global-green-80`
142
+ - `--oc-color-global-green-90`
143
+ - `--oc-color-global-green-95`
144
+ - `--oc-color-global-green-99`
145
+ - `--oc-color-global-lightBlue-0`
146
+ - `--oc-color-global-lightBlue-10`
147
+ - `--oc-color-global-lightBlue-100`
148
+ - `--oc-color-global-lightBlue-20`
149
+ - `--oc-color-global-lightBlue-30`
150
+ - `--oc-color-global-lightBlue-40`
151
+ - `--oc-color-global-lightBlue-50`
152
+ - `--oc-color-global-lightBlue-60`
153
+ - `--oc-color-global-lightBlue-70`
154
+ - `--oc-color-global-lightBlue-80`
155
+ - `--oc-color-global-lightBlue-90`
156
+ - `--oc-color-global-lightBlue-95`
157
+ - `--oc-color-global-lightBlue-99`
158
+ - `--oc-color-global-lime-0`
159
+ - `--oc-color-global-lime-10`
160
+ - `--oc-color-global-lime-100`
161
+ - `--oc-color-global-lime-20`
162
+ - `--oc-color-global-lime-30`
163
+ - `--oc-color-global-lime-37`
164
+ - `--oc-color-global-lime-40`
165
+ - `--oc-color-global-lime-50`
166
+ - `--oc-color-global-lime-60`
167
+ - `--oc-color-global-lime-70`
168
+ - `--oc-color-global-lime-80`
169
+ - `--oc-color-global-lime-90`
170
+ - `--oc-color-global-lime-95`
171
+ - `--oc-color-global-lime-99`
172
+ - `--oc-color-global-neutral-0`
173
+ - `--oc-color-global-neutral-10`
174
+ - `--oc-color-global-neutral-100`
175
+ - `--oc-color-global-neutral-15`
176
+ - `--oc-color-global-neutral-20`
177
+ - `--oc-color-global-neutral-22`
178
+ - `--oc-color-global-neutral-30`
179
+ - `--oc-color-global-neutral-40`
180
+ - `--oc-color-global-neutral-5`
181
+ - `--oc-color-global-neutral-50`
182
+ - `--oc-color-global-neutral-60`
183
+ - `--oc-color-global-neutral-70`
184
+ - `--oc-color-global-neutral-80`
185
+ - `--oc-color-global-neutral-90`
186
+ - `--oc-color-global-neutral-95`
187
+ - `--oc-color-global-neutral-99`
188
+ - `--oc-color-global-opacity-0`
189
+ - `--oc-color-global-opacity-100`
190
+ - `--oc-color-global-opacity-12`
191
+ - `--oc-color-global-opacity-16`
192
+ - `--oc-color-global-opacity-22`
193
+ - `--oc-color-global-opacity-28`
194
+ - `--oc-color-global-opacity-35`
195
+ - `--oc-color-global-opacity-43`
196
+ - `--oc-color-global-opacity-5`
197
+ - `--oc-color-global-opacity-52`
198
+ - `--oc-color-global-opacity-61`
199
+ - `--oc-color-global-opacity-74`
200
+ - `--oc-color-global-opacity-8`
201
+ - `--oc-color-global-opacity-88`
202
+ - `--oc-color-global-opacity-97`
203
+ - `--oc-color-global-orange-0`
204
+ - `--oc-color-global-orange-10`
205
+ - `--oc-color-global-orange-100`
206
+ - `--oc-color-global-orange-20`
207
+ - `--oc-color-global-orange-30`
208
+ - `--oc-color-global-orange-39`
209
+ - `--oc-color-global-orange-40`
210
+ - `--oc-color-global-orange-50`
211
+ - `--oc-color-global-orange-60`
212
+ - `--oc-color-global-orange-70`
213
+ - `--oc-color-global-orange-80`
214
+ - `--oc-color-global-orange-90`
215
+ - `--oc-color-global-orange-95`
216
+ - `--oc-color-global-orange-99`
217
+ - `--oc-color-global-pink-0`
218
+ - `--oc-color-global-pink-10`
219
+ - `--oc-color-global-pink-100`
220
+ - `--oc-color-global-pink-20`
221
+ - `--oc-color-global-pink-30`
222
+ - `--oc-color-global-pink-40`
223
+ - `--oc-color-global-pink-46`
224
+ - `--oc-color-global-pink-50`
225
+ - `--oc-color-global-pink-60`
226
+ - `--oc-color-global-pink-70`
227
+ - `--oc-color-global-pink-80`
228
+ - `--oc-color-global-pink-90`
229
+ - `--oc-color-global-pink-95`
230
+ - `--oc-color-global-pink-99`
231
+ - `--oc-color-global-purple-0`
232
+ - `--oc-color-global-purple-10`
233
+ - `--oc-color-global-purple-100`
234
+ - `--oc-color-global-purple-20`
235
+ - `--oc-color-global-purple-30`
236
+ - `--oc-color-global-purple-40`
237
+ - `--oc-color-global-purple-50`
238
+ - `--oc-color-global-purple-60`
239
+ - `--oc-color-global-purple-70`
240
+ - `--oc-color-global-purple-80`
241
+ - `--oc-color-global-purple-90`
242
+ - `--oc-color-global-purple-95`
243
+ - `--oc-color-global-purple-99`
244
+ - `--oc-color-global-red-0`
245
+ - `--oc-color-global-red-10`
246
+ - `--oc-color-global-red-100`
247
+ - `--oc-color-global-red-20`
248
+ - `--oc-color-global-red-30`
249
+ - `--oc-color-global-red-40`
250
+ - `--oc-color-global-red-50`
251
+ - `--oc-color-global-red-60`
252
+ - `--oc-color-global-red-70`
253
+ - `--oc-color-global-red-80`
254
+ - `--oc-color-global-red-90`
255
+ - `--oc-color-global-red-95`
256
+ - `--oc-color-global-red-99`
257
+ - `--oc-color-global-redOrange-0`
258
+ - `--oc-color-global-redOrange-10`
259
+ - `--oc-color-global-redOrange-100`
260
+ - `--oc-color-global-redOrange-20`
261
+ - `--oc-color-global-redOrange-30`
262
+ - `--oc-color-global-redOrange-40`
263
+ - `--oc-color-global-redOrange-48`
264
+ - `--oc-color-global-redOrange-50`
265
+ - `--oc-color-global-redOrange-60`
266
+ - `--oc-color-global-redOrange-70`
267
+ - `--oc-color-global-redOrange-80`
268
+ - `--oc-color-global-redOrange-90`
269
+ - `--oc-color-global-redOrange-95`
270
+ - `--oc-color-global-redOrange-99`
271
+ - `--oc-color-global-violet-0`
272
+ - `--oc-color-global-violet-10`
273
+ - `--oc-color-global-violet-100`
274
+ - `--oc-color-global-violet-20`
275
+ - `--oc-color-global-violet-30`
276
+ - `--oc-color-global-violet-40`
277
+ - `--oc-color-global-violet-45`
278
+ - `--oc-color-global-violet-50`
279
+ - `--oc-color-global-violet-60`
280
+ - `--oc-color-global-violet-70`
281
+ - `--oc-color-global-violet-80`
282
+ - `--oc-color-global-violet-90`
283
+ - `--oc-color-global-violet-95`
284
+ - `--oc-color-global-violet-99`
285
+
286
+ ## Typography
287
+
288
+ size/height/spacing/weight는 `@include typo($variant, $weight)` 경유가 기본입니다. raw size 토큰 직접 참조는 피하세요.
289
+
290
+ - `--oc-typo-font-family`
291
+ - `--oc-typo-height-body1`
292
+ - `--oc-typo-height-body1reading`
293
+ - `--oc-typo-height-body2`
294
+ - `--oc-typo-height-body2reading`
295
+ - `--oc-typo-height-caption1`
296
+ - `--oc-typo-height-caption2`
297
+ - `--oc-typo-height-display1`
298
+ - `--oc-typo-height-display2`
299
+ - `--oc-typo-height-display3`
300
+ - `--oc-typo-height-heading1`
301
+ - `--oc-typo-height-heading2`
302
+ - `--oc-typo-height-headline1`
303
+ - `--oc-typo-height-headline2`
304
+ - `--oc-typo-height-label1`
305
+ - `--oc-typo-height-label1reading`
306
+ - `--oc-typo-height-label2`
307
+ - `--oc-typo-height-title1`
308
+ - `--oc-typo-height-title2`
309
+ - `--oc-typo-height-title3`
310
+ - `--oc-typo-size-body1`
311
+ - `--oc-typo-size-body1reading`
312
+ - `--oc-typo-size-body2`
313
+ - `--oc-typo-size-body2reading`
314
+ - `--oc-typo-size-caption1`
315
+ - `--oc-typo-size-caption2`
316
+ - `--oc-typo-size-display1`
317
+ - `--oc-typo-size-display2`
318
+ - `--oc-typo-size-display3`
319
+ - `--oc-typo-size-factor`
320
+ - `--oc-typo-size-heading1`
321
+ - `--oc-typo-size-heading2`
322
+ - `--oc-typo-size-headline1`
323
+ - `--oc-typo-size-headline2`
324
+ - `--oc-typo-size-label1`
325
+ - `--oc-typo-size-label1reading`
326
+ - `--oc-typo-size-label2`
327
+ - `--oc-typo-size-title1`
328
+ - `--oc-typo-size-title2`
329
+ - `--oc-typo-size-title3`
330
+ - `--oc-typo-spacing-body1`
331
+ - `--oc-typo-spacing-body1reading`
332
+ - `--oc-typo-spacing-body2`
333
+ - `--oc-typo-spacing-body2reading`
334
+ - `--oc-typo-spacing-caption1`
335
+ - `--oc-typo-spacing-caption2`
336
+ - `--oc-typo-spacing-display1`
337
+ - `--oc-typo-spacing-display2`
338
+ - `--oc-typo-spacing-display3`
339
+ - `--oc-typo-spacing-heading1`
340
+ - `--oc-typo-spacing-heading2`
341
+ - `--oc-typo-spacing-headline1`
342
+ - `--oc-typo-spacing-headline2`
343
+ - `--oc-typo-spacing-label1`
344
+ - `--oc-typo-spacing-label1reading`
345
+ - `--oc-typo-spacing-label2`
346
+ - `--oc-typo-spacing-title1`
347
+ - `--oc-typo-spacing-title2`
348
+ - `--oc-typo-spacing-title3`
349
+ - `--oc-typo-weight-body1-bold`
350
+ - `--oc-typo-weight-body1-medium`
351
+ - `--oc-typo-weight-body1-normal`
352
+ - `--oc-typo-weight-body1reading-bold`
353
+ - `--oc-typo-weight-body1reading-medium`
354
+ - `--oc-typo-weight-body1reading-normal`
355
+ - `--oc-typo-weight-body2-bold`
356
+ - `--oc-typo-weight-body2-medium`
357
+ - `--oc-typo-weight-body2-normal`
358
+ - `--oc-typo-weight-body2reading-bold`
359
+ - `--oc-typo-weight-body2reading-medium`
360
+ - `--oc-typo-weight-body2reading-normal`
361
+ - `--oc-typo-weight-caption1-bold`
362
+ - `--oc-typo-weight-caption1-medium`
363
+ - `--oc-typo-weight-caption1-normal`
364
+ - `--oc-typo-weight-caption2-bold`
365
+ - `--oc-typo-weight-caption2-medium`
366
+ - `--oc-typo-weight-caption2-normal`
367
+ - `--oc-typo-weight-display1-bold`
368
+ - `--oc-typo-weight-display1-medium`
369
+ - `--oc-typo-weight-display1-normal`
370
+ - `--oc-typo-weight-display2-bold`
371
+ - `--oc-typo-weight-display2-medium`
372
+ - `--oc-typo-weight-display2-normal`
373
+ - `--oc-typo-weight-display3-bold`
374
+ - `--oc-typo-weight-display3-medium`
375
+ - `--oc-typo-weight-display3-normal`
376
+ - `--oc-typo-weight-heading1-bold`
377
+ - `--oc-typo-weight-heading1-medium`
378
+ - `--oc-typo-weight-heading1-normal`
379
+ - `--oc-typo-weight-heading2-bold`
380
+ - `--oc-typo-weight-heading2-medium`
381
+ - `--oc-typo-weight-heading2-normal`
382
+ - `--oc-typo-weight-headline1-bold`
383
+ - `--oc-typo-weight-headline1-medium`
384
+ - `--oc-typo-weight-headline1-normal`
385
+ - `--oc-typo-weight-headline2-bold`
386
+ - `--oc-typo-weight-headline2-medium`
387
+ - `--oc-typo-weight-headline2-normal`
388
+ - `--oc-typo-weight-label1-bold`
389
+ - `--oc-typo-weight-label1-medium`
390
+ - `--oc-typo-weight-label1-normal`
391
+ - `--oc-typo-weight-label1reading-bold`
392
+ - `--oc-typo-weight-label1reading-medium`
393
+ - `--oc-typo-weight-label1reading-normal`
394
+ - `--oc-typo-weight-label2-bold`
395
+ - `--oc-typo-weight-label2-medium`
396
+ - `--oc-typo-weight-label2-normal`
397
+ - `--oc-typo-weight-title1-bold`
398
+ - `--oc-typo-weight-title1-medium`
399
+ - `--oc-typo-weight-title1-normal`
400
+ - `--oc-typo-weight-title2-bold`
401
+ - `--oc-typo-weight-title2-medium`
402
+ - `--oc-typo-weight-title2-normal`
403
+ - `--oc-typo-weight-title3-bold`
404
+ - `--oc-typo-weight-title3-medium`
405
+ - `--oc-typo-weight-title3-normal`
406
+
407
+ ## Space
408
+
409
+ responsive mode(fluid/stepped/static)에 따라 viewport별 출력이 달라집니다.
410
+
411
+ - `--oc-space-item-gap-atom`
412
+ - `--oc-space-item-gap-huge`
413
+ - `--oc-space-item-gap-large`
414
+ - `--oc-space-item-gap-medium`
415
+ - `--oc-space-item-gap-micro`
416
+ - `--oc-space-item-gap-mini`
417
+ - `--oc-space-item-gap-nano`
418
+ - `--oc-space-item-gap-small`
419
+ - `--oc-space-item-gap-tiny`
420
+ - `--oc-space-item-gap-xlarge`
421
+ - `--oc-space-item-gap-xsmall`
422
+ - `--oc-space-item-padding-atom`
423
+ - `--oc-space-item-padding-large`
424
+ - `--oc-space-item-padding-medium`
425
+ - `--oc-space-item-padding-micro`
426
+ - `--oc-space-item-padding-mini`
427
+ - `--oc-space-item-padding-nano`
428
+ - `--oc-space-item-padding-small`
429
+ - `--oc-space-item-padding-tiny`
430
+ - `--oc-space-item-padding-xsmall`
431
+ - `--oc-space-section-gap-large`
432
+ - `--oc-space-section-gap-medium`
433
+ - `--oc-space-section-gap-section`
434
+ - `--oc-space-section-gap-xlarge`
435
+ - `--oc-space-section-padding-viewport`
436
+ - `--oc-space-section-padding-viewport-block-safe-end`
437
+ - `--oc-space-section-padding-viewport-block-safe-start`
438
+ - `--oc-space-section-padding-viewport-inline-safe-end`
439
+ - `--oc-space-section-padding-viewport-inline-safe-start`
440
+ - `--oc-space-section-padding-viewport-x`
441
+ - `--oc-space-section-padding-viewport-y`
442
+
443
+ ## Atomic (radius/width/blur/shadow 등)
444
+
445
+ `--oc-atomic-radius-factor`는 radius 전역 배율 runtime multiplier입니다.
446
+
447
+ - `--oc-atomic-blur-compact`
448
+ - `--oc-atomic-blur-normal`
449
+ - `--oc-atomic-radius-factor`
450
+ - `--oc-atomic-radius-huge`
451
+ - `--oc-atomic-radius-large`
452
+ - `--oc-atomic-radius-max`
453
+ - `--oc-atomic-radius-medium`
454
+ - `--oc-atomic-radius-micro`
455
+ - `--oc-atomic-radius-mini`
456
+ - `--oc-atomic-radius-small`
457
+ - `--oc-atomic-radius-tiny`
458
+ - `--oc-atomic-radius-xlarge`
459
+ - `--oc-atomic-radius-xsmall`
460
+ - `--oc-atomic-shadow-normal-large`
461
+ - `--oc-atomic-shadow-normal-medium`
462
+ - `--oc-atomic-shadow-normal-small`
463
+ - `--oc-atomic-shadow-normal-xlarge`
464
+ - `--oc-atomic-shadow-normal-xsmall`
465
+ - `--oc-atomic-shadow-spread-small`
466
+ - `--oc-atomic-shadow-spread-xlarge`
467
+ - `--oc-atomic-width-content`
468
+ - `--oc-atomic-width-section-large`
469
+ - `--oc-atomic-width-section-medium`
470
+ - `--oc-atomic-width-section-small`
471
+ - `--oc-atomic-width-section-xsmall`
472
+
473
+ ## Focus ring
474
+
475
+ 키보드 포커스 링(`:focus-visible`)의 두께/offset입니다. 색상은 theme semantic 토큰 `--oc-color-theme-focus-ring`을 사용하며, 컴포넌트 적용은 `@include oc-focus-ring` 경유가 기본입니다.
476
+
477
+ - `--oc-focus-ring-offset`
478
+ - `--oc-focus-ring-width`
479
+
480
+ ## Motion
481
+
482
+ duration/scale/distance factor는 unitless multiplier입니다. 자세한 정책은 [Semantic Motion](./motion.md)을 참조하세요.
483
+
484
+ - `--oc-motion-distance-factor`
485
+ - `--oc-motion-distance-factor-reject`
486
+ - `--oc-motion-distance-factor-spatial`
487
+ - `--oc-motion-duration-ambient`
488
+ - `--oc-motion-duration-continuous`
489
+ - `--oc-motion-duration-disclosure`
490
+ - `--oc-motion-duration-disclosure-exit`
491
+ - `--oc-motion-duration-expand`
492
+ - `--oc-motion-duration-expand-exit`
493
+ - `--oc-motion-duration-factor`
494
+ - `--oc-motion-duration-factor-preserve`
495
+ - `--oc-motion-duration-factor-reduced`
496
+ - `--oc-motion-duration-fade`
497
+ - `--oc-motion-duration-feedback`
498
+ - `--oc-motion-duration-gesture`
499
+ - `--oc-motion-duration-gesture-release`
500
+ - `--oc-motion-duration-move`
501
+ - `--oc-motion-duration-reject`
502
+ - `--oc-motion-duration-sheet`
503
+ - `--oc-motion-duration-sheet-exit`
504
+ - `--oc-motion-duration-sheet-release`
505
+ - `--oc-motion-duration-surface`
506
+ - `--oc-motion-duration-surface-exit`
507
+ - `--oc-motion-pace-normal`
508
+ - `--oc-motion-pace-quick`
509
+ - `--oc-motion-pace-slow`
510
+ - `--oc-motion-scale-factor`
511
+ - `--oc-motion-scale-factor-feedback`
512
+ - `--oc-motion-scale-factor-spatial`
513
+ - `--oc-motion-timing-ambient`
514
+ - `--oc-motion-timing-continuous`
515
+ - `--oc-motion-timing-disclosure`
516
+ - `--oc-motion-timing-disclosure-exit`
517
+ - `--oc-motion-timing-expand`
518
+ - `--oc-motion-timing-expand-exit`
519
+ - `--oc-motion-timing-fade`
520
+ - `--oc-motion-timing-feedback`
521
+ - `--oc-motion-timing-gesture`
522
+ - `--oc-motion-timing-gesture-release`
523
+ - `--oc-motion-timing-move`
524
+ - `--oc-motion-timing-reject`
525
+ - `--oc-motion-timing-sheet`
526
+ - `--oc-motion-timing-sheet-exit`
527
+ - `--oc-motion-timing-sheet-release`
528
+ - `--oc-motion-timing-surface`
529
+ - `--oc-motion-timing-surface-exit`
530
+
531
+ ## Spring
532
+
533
+ spring preset의 timing/duration scale입니다. 자세한 사용법은 [Spring Motion](./spring.md)을 참조하세요.
534
+
535
+ - `--oc-spring-bouncy-duration-scale`
536
+ - `--oc-spring-bouncy-timing`
537
+ - `--oc-spring-smooth-duration-scale`
538
+ - `--oc-spring-smooth-timing`
539
+ - `--oc-spring-snappy-duration-scale`
540
+ - `--oc-spring-snappy-timing`
541
+
542
+ ## Z-index
543
+
544
+ - `--oc-zindex-0`
545
+ - `--oc-zindex-1`
546
+ - `--oc-zindex-2`
547
+ - `--oc-zindex-3`
548
+ - `--oc-zindex-4`
549
+ - `--oc-zindex-5`
550
+
551
+ ## Breakpoint
552
+
553
+ SCSS에서는 `respond-to(...)` mixin 경유가 기본입니다. raw media query에 직접 사용하지 마세요.
554
+
555
+ - `--oc-breakpoint-hg`
556
+ - `--oc-breakpoint-lg`
557
+ - `--oc-breakpoint-md`
558
+ - `--oc-breakpoint-sm`
559
+ - `--oc-breakpoint-xl`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@orioncactuscorp/ui",
3
- "version": "1.10.0",
3
+ "version": "1.11.0",
4
4
  "description": "orioncactus UI foundations and core primitives",
5
5
  "private": false,
6
6
  "type": "module",
@@ -31,6 +31,7 @@
31
31
  "files": [
32
32
  "dist",
33
33
  "src/scss",
34
+ "docs",
34
35
  "README.md",
35
36
  "LICENSE"
36
37
  ],
@@ -78,14 +79,18 @@
78
79
  },
79
80
  "packageManager": "bun@1.3.6",
80
81
  "scripts": {
81
- "build": "bun run build:lib && bun run build:css && bun run check:exports && bun run check:dist-imports && bun run check:rsc-boundaries",
82
+ "build": "bun run build:lib && bun run build:css && bun run check:exports && bun run check:dist-imports && bun run check:css-injection && bun run check:rsc-boundaries",
82
83
  "build:lib": "vite build && node scripts/preserve-client-directives.mjs",
83
- "build:css": "sass src/scss/foundations:dist/foundations --no-source-map --style=compressed && node scripts/fix-css-module-artifacts.mjs && node scripts/bundle-foundations.mjs && node scripts/generate-vscode-css-vars.mjs",
84
+ "build:css": "sass src/scss/foundations:dist/foundations --no-source-map --style=compressed && node scripts/fix-css-module-artifacts.mjs && node scripts/bundle-foundations.mjs && node scripts/generate-vscode-css-vars.mjs && node scripts/generate-token-reference.mjs",
85
+ "docs:tokens": "node scripts/generate-token-reference.mjs",
86
+ "docs:tokens:check": "node scripts/generate-token-reference.mjs --check",
84
87
  "check:exports": "node scripts/check-package-exports.mjs",
85
88
  "check:dist-imports": "node scripts/check-dist-imports.mjs",
89
+ "check:css-injection": "node scripts/check-css-injection.mjs",
86
90
  "check:rsc-boundaries": "node scripts/check-rsc-client-boundaries.mjs",
87
91
  "test": "vitest",
88
- "test:run": "vitest run",
92
+ "test:run": "vitest run && node --test scripts/*.test.mjs",
93
+ "test:scripts": "node --test scripts/*.test.mjs",
89
94
  "test:coverage": "vitest run --coverage",
90
95
  "test:e2e": "bun run --cwd ../.. build && bun run --cwd ../.. example:build && playwright test",
91
96
  "test:e2e:ci": "bun run --cwd ../.. example:build && playwright test",
@@ -37,6 +37,20 @@ describe('color theme foundations', () => {
37
37
  expect(css).toContain('[data-theme=dark]');
38
38
  });
39
39
 
40
+ it('aliases the focus ring color to the primary semantic in both themes', () => {
41
+ const css = compileScss(`
42
+ @use 'foundations/color.theme.light' as light;
43
+ @use 'foundations/color.theme.dark' as dark;
44
+ `);
45
+
46
+ expect(css).toMatch(
47
+ /:root\{[^}]*--oc-color-theme-focus-ring:var\(--oc-color-theme-primary-normal\)/,
48
+ );
49
+ expect(css).toMatch(
50
+ /\[data-theme=dark\]\{[^}]*--oc-color-theme-focus-ring:var\(--oc-color-theme-primary-normal\)/,
51
+ );
52
+ });
53
+
40
54
  it('emits only light when $oc-color-themes is (light)', () => {
41
55
  const css = compileScss(`
42
56
  @use 'foundations/color.config' with ($oc-color-themes: (light,));
@@ -7,6 +7,7 @@
7
7
  --oc-color-theme-static-black: var(--oc-color-global-common-0);
8
8
  --oc-color-theme-static-transparent: var(--oc-color-global-common-transparent);
9
9
  --oc-color-theme-primary-normal: var(--oc-color-global-redOrange-60);
10
+ --oc-color-theme-focus-ring: var(--oc-color-theme-primary-normal);
10
11
  --oc-color-theme-label-strong: var(--oc-color-global-common-100);
11
12
  --oc-color-theme-label-normal: var(--oc-color-global-coolNeutral-99);
12
13
  --oc-color-theme-label-neutral: #{oc-alpha(coolNeutral-90, 88)};