@orioncactuscorp/ui 1.0.0 → 1.1.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/README.md +190 -72
- package/dist/components/ActionArea/ActionArea.css +1 -1
- package/dist/components/ActionArea/ActionArea.js +1 -0
- package/dist/components/Alert/Alert.js +146 -126
- package/dist/components/Badge/Badge.css +1 -1
- package/dist/components/Button/Button.js +1 -0
- package/dist/components/CheckMark/CheckMark.css +1 -1
- package/dist/components/Checkbox/Checkbox.css +1 -1
- package/dist/components/Modal/Modal.css +1 -1
- package/dist/components/Modal/Modal.js +347 -331
- package/dist/components/Modal/useModalDrag.js +604 -673
- package/dist/components/Radio/Radio.css +1 -1
- package/dist/components/Select/Select.css +1 -1
- package/dist/components/TextArea/TextArea.css +1 -1
- package/dist/components/TextInput/TextInput.css +1 -1
- package/dist/foundations/atomic.css +1 -1
- package/dist/foundations.css +1 -1
- package/dist/react/motion.js +1 -0
- package/dist/react/spring.js +1 -0
- package/dist/styles.css +10 -10
- package/dist/ui/src/components/ActionArea/ActionArea.d.ts.map +1 -1
- package/dist/ui/src/components/Alert/Alert.d.ts +1 -1
- package/dist/ui/src/components/Alert/Alert.d.ts.map +1 -1
- package/dist/ui/src/components/Alert/types.d.ts +2 -0
- package/dist/ui/src/components/Alert/types.d.ts.map +1 -1
- package/dist/ui/src/components/Button/Button.d.ts.map +1 -1
- package/dist/ui/src/components/Modal/Modal.d.ts +1 -1
- package/dist/ui/src/components/Modal/Modal.d.ts.map +1 -1
- package/dist/ui/src/components/Modal/index.d.ts +1 -1
- package/dist/ui/src/components/Modal/index.d.ts.map +1 -1
- package/dist/ui/src/components/Modal/types.d.ts +2 -0
- package/dist/ui/src/components/Modal/types.d.ts.map +1 -1
- package/dist/ui/src/components/Modal/useModalDrag.d.ts.map +1 -1
- package/dist/ui/src/index.d.ts +1 -1
- package/dist/ui/src/index.d.ts.map +1 -1
- package/dist/vscode/oc-ui-vars.css +7 -0
- package/package.json +3 -6
- package/src/scss/foundations/atomic.scss +9 -0
package/README.md
CHANGED
|
@@ -2,15 +2,42 @@
|
|
|
2
2
|
|
|
3
3
|
orioncactus 디자인 시스템의 React 19+ UI package입니다.
|
|
4
4
|
|
|
5
|
-
##
|
|
5
|
+
## 요구사항
|
|
6
|
+
|
|
7
|
+
- React 19+, React DOM 19+
|
|
8
|
+
- Node 22+
|
|
9
|
+
- CSS Modules와 CSS `@layer`를 처리하는 bundler
|
|
10
|
+
- package manager: npm-compatible package manager
|
|
11
|
+
|
|
12
|
+
## 설치
|
|
13
|
+
|
|
14
|
+
##### bun
|
|
6
15
|
|
|
7
16
|
```bash
|
|
8
17
|
bun add @orioncactuscorp/ui @orioncactuscorp/icons
|
|
9
18
|
```
|
|
10
19
|
|
|
20
|
+
##### npm
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm install @orioncactuscorp/ui @orioncactuscorp/icons
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
##### yarn
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
yarn add @orioncactuscorp/ui @orioncactuscorp/icons
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
##### pnpm
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
pnpm add @orioncactuscorp/ui @orioncactuscorp/icons
|
|
36
|
+
```
|
|
37
|
+
|
|
11
38
|
앱 코드에서 아이콘을 직접 import한다면 `@orioncactuscorp/icons`를 consumer repository의 direct dependency로 함께 설치하세요. `@orioncactuscorp/ui` 컴포넌트 내부 indicator만 사용한다면 별도 작업은 필요 없습니다.
|
|
12
39
|
|
|
13
|
-
##
|
|
40
|
+
## 사용
|
|
14
41
|
|
|
15
42
|
```tsx
|
|
16
43
|
import '@orioncactuscorp/ui/foundations.css';
|
|
@@ -64,6 +91,117 @@ export default function Example() {
|
|
|
64
91
|
- `@orioncactuscorp/ui/react/spring`
|
|
65
92
|
- `@orioncactuscorp/ui/react/motion`
|
|
66
93
|
|
|
94
|
+
## React Server Components
|
|
95
|
+
|
|
96
|
+
`@orioncactuscorp/ui`는 root barrel 전체를 client boundary로 승격하지 않고, 실제 client-only component/module entry에만 `'use client'` directive를 보존합니다. Next App Router Server Component에서 root barrel로 `Button` 같은 interactive component를 import해도 leaf boundary가 유지되도록 package build에서 검증합니다.
|
|
97
|
+
|
|
98
|
+
Client Component에 전달하는 prop은 React Server Components의 serializable prop 제약을 따릅니다. Server Component에서 `onClick` 같은 function prop을 직접 넘겨야 하는 경우에는 해당 사용 지점을 Client Component로 분리하세요.
|
|
99
|
+
|
|
100
|
+
## Foundation
|
|
101
|
+
|
|
102
|
+
일반적인 사용은 prebuilt CSS를 앱 root에서 한 번 import합니다.
|
|
103
|
+
|
|
104
|
+
```tsx
|
|
105
|
+
import '@orioncactuscorp/ui/foundations.css';
|
|
106
|
+
import '@orioncactuscorp/ui/styles.css';
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
브랜드 색처럼 CSS token 값만 바꾸는 경우에는 import 이후 로드되는 CSS에서 필요한 theme selector의 `--oc-*` 값을 override합니다.
|
|
110
|
+
|
|
111
|
+
```scss
|
|
112
|
+
:root,
|
|
113
|
+
[data-theme='light'],
|
|
114
|
+
[data-theme='dark'] {
|
|
115
|
+
--oc-color-theme-primary-normal: #ff5800;
|
|
116
|
+
}
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
Foundation별 커스텀 방식은 아래 기준으로 나눕니다.
|
|
120
|
+
|
|
121
|
+
| 대상 | 기본 방식 | SCSS source compile 필요 여부 |
|
|
122
|
+
| ------ | --------------------------------------------------------- | ------------------------------------------------ |
|
|
123
|
+
| color | `--oc-color-theme-*` override | theme 출력 범위나 system preference 설정 변경 시 |
|
|
124
|
+
| typo | `$oc-typo-size-overrides`, `$oc-typo-height-overrides` | 필요 |
|
|
125
|
+
| space | `$oc-space-overrides` | 필요 |
|
|
126
|
+
| atomic | radius, width, blur, shadow 같은 `--oc-atomic-*` override | 보통 불필요 |
|
|
127
|
+
|
|
128
|
+
`--oc-typo-scale`은 특정 요소나 section 안의 typography를 함께 키우거나 줄일 때 쓰는 runtime multiplier입니다. 예를 들어 article 영역의 읽기 크기를 전반적으로 키워야 할 때 해당 scope에 `--oc-typo-scale: 1.1`처럼 지정할 수 있습니다.
|
|
129
|
+
|
|
130
|
+
Typography나 spacing token의 responsive 출력 방식까지 바꿔야 하는 경우에는 `foundations.css` 대신 SCSS foundation source를 직접 compile할 수 있습니다. 이때 `foundations.css`를 대체하므로 reset은 별도로 import합니다.
|
|
131
|
+
|
|
132
|
+
```tsx
|
|
133
|
+
import '@orioncactuscorp/ui/reset.css';
|
|
134
|
+
import './styles/foundations.scss';
|
|
135
|
+
import '@orioncactuscorp/ui/styles.css';
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
### SCSS Profile
|
|
139
|
+
|
|
140
|
+
`responsive.config`는 `typo`와 `space`의 responsive 출력 mode를 정합니다. `$oc-responsive-mode`는 공통으로 적용하고, active stop range는 foundation별로 따로 지정할 수 있습니다. `space`는 stepped mode에서 base/media point별 target stop도 지정할 수 있습니다.
|
|
141
|
+
|
|
142
|
+
`$oc-responsive-mode`는 아래 값을 사용합니다.
|
|
143
|
+
|
|
144
|
+
- `fluid`: 기본값. stop 사이를 `clamp()` 기반 fluid value로 보간합니다.
|
|
145
|
+
- `stepped`: stop 값을 breakpoint에서 계단식으로 전환합니다.
|
|
146
|
+
- `static`: 선택한 stop 하나를 전체 viewport에 고정합니다.
|
|
147
|
+
|
|
148
|
+
```scss
|
|
149
|
+
@use '@orioncactuscorp/ui/scss/foundations/responsive.config' with (
|
|
150
|
+
$oc-responsive-mode: stepped,
|
|
151
|
+
$oc-responsive-typo-stops: (
|
|
152
|
+
sm,
|
|
153
|
+
),
|
|
154
|
+
$oc-responsive-space-stops: (
|
|
155
|
+
md,
|
|
156
|
+
lg,
|
|
157
|
+
xl,
|
|
158
|
+
),
|
|
159
|
+
$oc-responsive-space-profile: (
|
|
160
|
+
type: stepped-points,
|
|
161
|
+
points: (
|
|
162
|
+
base: md,
|
|
163
|
+
min-md: max-active-defined,
|
|
164
|
+
),
|
|
165
|
+
)
|
|
166
|
+
);
|
|
167
|
+
|
|
168
|
+
@use '@orioncactuscorp/ui/scss/foundations/color.global' as *;
|
|
169
|
+
@use '@orioncactuscorp/ui/scss/foundations/color.theme.light' as *;
|
|
170
|
+
@use '@orioncactuscorp/ui/scss/foundations/color.theme.dark' as *;
|
|
171
|
+
@use '@orioncactuscorp/ui/scss/foundations/breakpoint' as *;
|
|
172
|
+
@use '@orioncactuscorp/ui/scss/foundations/typo' as * with (
|
|
173
|
+
$oc-typo-size-overrides: (
|
|
174
|
+
title1: (
|
|
175
|
+
sm: 36,
|
|
176
|
+
),
|
|
177
|
+
),
|
|
178
|
+
$oc-typo-height-overrides: (
|
|
179
|
+
title1: (
|
|
180
|
+
sm: 48,
|
|
181
|
+
),
|
|
182
|
+
)
|
|
183
|
+
);
|
|
184
|
+
@use '@orioncactuscorp/ui/scss/foundations/space' as * with (
|
|
185
|
+
$oc-space-overrides: (
|
|
186
|
+
section-padding-viewport-x: (
|
|
187
|
+
md: 20,
|
|
188
|
+
xl: 32,
|
|
189
|
+
),
|
|
190
|
+
)
|
|
191
|
+
);
|
|
192
|
+
@use '@orioncactuscorp/ui/scss/foundations/atomic' as *;
|
|
193
|
+
@use '@orioncactuscorp/ui/scss/foundations/motion' as *;
|
|
194
|
+
@use '@orioncactuscorp/ui/scss/foundations/zindex' as *;
|
|
195
|
+
|
|
196
|
+
:root,
|
|
197
|
+
[data-theme='light'],
|
|
198
|
+
[data-theme='dark'] {
|
|
199
|
+
--oc-color-theme-primary-normal: #ff5800;
|
|
200
|
+
}
|
|
201
|
+
```
|
|
202
|
+
|
|
203
|
+
SCSS foundation profile은 compile-time 설정입니다. Prebuilt `foundations.css` 또는 `styles.css` import에는 적용되지 않습니다.
|
|
204
|
+
|
|
67
205
|
## Icons
|
|
68
206
|
|
|
69
207
|
`@orioncactuscorp/ui`는 `@orioncactuscorp/icons`를 dependency로 사용합니다. `Checkbox`, `Radio`, `Select`, `Accordion`, `ModalClose` 같은 컴포넌트 내부 indicator를 별도 설정 없이 렌더링합니다.
|
|
@@ -78,9 +216,13 @@ import { IconClose, IconDefault } from '@orioncactuscorp/icons';
|
|
|
78
216
|
|
|
79
217
|
아이콘 세트를 나중에 교체할 계획이 있으면, 컴포넌트마다 직접 import하지 말고 앱 내부 icon registry를 거쳐 import하세요.
|
|
80
218
|
|
|
81
|
-
##
|
|
219
|
+
## Motion
|
|
220
|
+
|
|
221
|
+
Motion은 duration/easing 숫자를 직접 고르는 대신 `feedback`, `reveal`, `move` 같은 intent 기준으로 작성합니다. `oc-motion`은 intent, phase, pace를 기반으로 duration token, spring profile, reduced-motion 정책을 함께 적용합니다.
|
|
82
222
|
|
|
83
|
-
|
|
223
|
+
```scss
|
|
224
|
+
@include oc-motion($properties, $intent, $phase: change, $pace: normal);
|
|
225
|
+
```
|
|
84
226
|
|
|
85
227
|
```scss
|
|
86
228
|
@use '@orioncactuscorp/ui/scss/mixins/motion' as *;
|
|
@@ -94,15 +236,52 @@ SCSS consumer는 `oc-motion`으로 transition을 intent 기준으로 작성합
|
|
|
94
236
|
}
|
|
95
237
|
```
|
|
96
238
|
|
|
97
|
-
일반 컴포넌트와 consumer SCSS에서는 `oc-motion`을 우선 사용하고, 직접 spring parameter를 설계해야 하는 고급 케이스에서만 `oc-spring`을 사용합니다.
|
|
239
|
+
일반 컴포넌트와 consumer SCSS에서는 `oc-motion`을 우선 사용하고, 직접 spring parameter를 설계해야 하는 고급 케이스에서만 `oc-spring`을 사용합니다.
|
|
240
|
+
|
|
241
|
+
### Motion Scale
|
|
98
242
|
|
|
99
|
-
|
|
243
|
+
Motion scale은 transform scale, 이동 거리, duration의 전역 강도를 조정하는 runtime token입니다. 기본값보다 작으면 효과가 약해지거나 짧아지고, 크면 효과가 강해지거나 길어집니다. 전체 tone은 parent token으로 먼저 맞추고, 특정 intent만 달라야 할 때 child token을 override합니다.
|
|
244
|
+
|
|
245
|
+
| Token | 기본값 | 비고 |
|
|
246
|
+
| ------------------------------------- | --------------------------------- | -------------------------------------- |
|
|
247
|
+
| `--oc-motion-scale` | `1` | 전체 transform scale amplitude |
|
|
248
|
+
| `--oc-motion-scale-feedback` | `var(--oc-motion-scale)` | press, hover, selected |
|
|
249
|
+
| `--oc-motion-scale-reveal` | `var(--oc-motion-scale)` | menu, tooltip, modal |
|
|
250
|
+
| `--oc-motion-distance-scale` | `1` | 전체 translate/reject 거리 |
|
|
251
|
+
| `--oc-motion-distance-scale-reject` | `var(--oc-motion-distance-scale)` | reject shake |
|
|
252
|
+
| `--oc-motion-distance-scale-reveal` | `var(--oc-motion-distance-scale)` | reveal, move |
|
|
253
|
+
| `--oc-motion-duration-scale` | `1` | 전체 duration. 작으면 빠르고 크면 느림 |
|
|
254
|
+
| `--oc-motion-duration-scale-reduced` | `0.75` | reduced-motion fade/feedback |
|
|
255
|
+
| `--oc-motion-duration-scale-preserve` | `1` | reduced-motion preserve |
|
|
256
|
+
| `--oc-motion-pace-quick` | `0.75` | `quick` pace duration multiplier |
|
|
257
|
+
| `--oc-motion-pace-normal` | `1` | `normal` pace duration multiplier |
|
|
258
|
+
| `--oc-motion-pace-slow` | `1.35` | `slow` pace duration multiplier |
|
|
259
|
+
|
|
260
|
+
### Runtime Motion
|
|
261
|
+
|
|
262
|
+
React에서 height/reveal처럼 CSS transition만으로 안정적으로 다루기 어려운 motion은 `@orioncactuscorp/ui/react/motion` subpath를 사용합니다. `MotionReveal`은 같은 `intent`, `phase`, `pace`, `reduced` vocabulary로 layout size를 JS spring animation에 연결합니다.
|
|
263
|
+
|
|
264
|
+
```tsx
|
|
265
|
+
import { MotionReveal } from '@orioncactuscorp/ui/react/motion';
|
|
266
|
+
|
|
267
|
+
export function Panel({ open, children }) {
|
|
268
|
+
return (
|
|
269
|
+
<MotionReveal open={open} forceMount intent='reveal' pace='normal'>
|
|
270
|
+
{children}
|
|
271
|
+
</MotionReveal>
|
|
272
|
+
);
|
|
273
|
+
}
|
|
274
|
+
```
|
|
275
|
+
|
|
276
|
+
## Spring
|
|
100
277
|
|
|
101
278
|
SCSS에서는 iOS spring의 perceptual duration 기준으로 low-level transition을 작성할 수 있습니다. helper는 실제 CSS duration을 감쇠 settling duration으로 출력합니다.
|
|
102
279
|
|
|
103
280
|
```scss
|
|
104
|
-
|
|
281
|
+
transition: oc-spring($property, $duration, $preset: smooth, $extra-bounce: 0);
|
|
282
|
+
```
|
|
105
283
|
|
|
284
|
+
```scss
|
|
106
285
|
.box {
|
|
107
286
|
transition: oc-spring(transform, 0.5s, snappy);
|
|
108
287
|
}
|
|
@@ -128,7 +307,7 @@ SCSS에서는 iOS spring의 perceptual duration 기준으로 low-level transitio
|
|
|
128
307
|
}
|
|
129
308
|
```
|
|
130
309
|
|
|
131
|
-
property별 tuple은 `(duration, preset, extra-bounce, delay, samples)` 순서입니다. physical spring과 고급 옵션은 named map을 사용합니다.
|
|
310
|
+
property별 tuple은 `(duration, preset, extra-bounce, delay, samples)` 순서입니다. physical spring과 고급 옵션은 named map을 사용합니다.
|
|
132
311
|
|
|
133
312
|
TS 런타임에서는 subpath util을 사용합니다.
|
|
134
313
|
|
|
@@ -183,38 +362,6 @@ export function Follower() {
|
|
|
183
362
|
}
|
|
184
363
|
```
|
|
185
364
|
|
|
186
|
-
runtime reveal이나 height motion이 필요한 React component에서는 `react/motion` subpath를 사용합니다. 이 layer는 `utils/motion`의 intent/phase/pace/reduced-motion 정책을 해석한 뒤 low-level `ocSpring` animator에 연결합니다.
|
|
187
|
-
|
|
188
|
-
```tsx
|
|
189
|
-
import { MotionReveal } from '@orioncactuscorp/ui/react/motion';
|
|
190
|
-
import { ocMotion } from '@orioncactuscorp/ui/utils/motion';
|
|
191
|
-
|
|
192
|
-
const motion = ocMotion.resolve({
|
|
193
|
-
intent: 'reveal',
|
|
194
|
-
phase: 'enter',
|
|
195
|
-
pace: 'normal',
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
export function Panel({ open, children }) {
|
|
199
|
-
return (
|
|
200
|
-
<MotionReveal open={open} forceMount>
|
|
201
|
-
{children}
|
|
202
|
-
</MotionReveal>
|
|
203
|
-
);
|
|
204
|
-
}
|
|
205
|
-
```
|
|
206
|
-
|
|
207
|
-
## Responsive Foundation Profile
|
|
208
|
-
|
|
209
|
-
`@orioncactuscorp/ui/scss/foundations/responsive.config`는 SCSS consumer가 `typo`와 `space` responsive token 출력 방식을 선택할 때 사용합니다. mode는 공통으로 적용하고, `$oc-responsive-typo-stops`와 `$oc-responsive-space-stops`로 foundation별 active stop range를 따로 지정할 수 있습니다. `space`는 `$oc-responsive-space-profile`로 stepped 출력 profile도 바꿀 수 있습니다.
|
|
210
|
-
|
|
211
|
-
- `fluid`: 기본 `fluidClamp()` 출력
|
|
212
|
-
- `stepped`: active stop별 고정 token 값 출력
|
|
213
|
-
- `static`: 명시 stop 또는 각 foundation의 첫 active stop으로 고정
|
|
214
|
-
- `space profile`: `$oc-responsive-mode: stepped`에서 `stepped-points`로 base/media point별 target stop 출력
|
|
215
|
-
|
|
216
|
-
이 설정은 compile-time SCSS profile입니다. Prebuilt `foundations.css` 또는 `styles.css` import에는 적용되지 않습니다. 예시는 [docs/responsive-foundation-profile.md](../../docs/responsive-foundation-profile.md)를 참고하세요.
|
|
217
|
-
|
|
218
365
|
## VS Code CSS Variable Autocomplete
|
|
219
366
|
|
|
220
367
|
package는 VS Code CSS variable autocomplete 확장이 읽을 수 있는 foundation token index를 함께 배포합니다.
|
|
@@ -235,39 +382,10 @@ consumer repository에서 `phoenisx.cssvar` 확장을 사용할 경우 `.vscode/
|
|
|
235
382
|
|
|
236
383
|
이 파일은 `foundations.css`에서 생성되므로 설치된 `@orioncactuscorp/ui` package 버전의 `--oc-*` foundation token과 자동완성 목록이 함께 움직입니다. 자동완성 전용 index이므로 runtime stylesheet로 import하지 않습니다.
|
|
237
384
|
|
|
238
|
-
##
|
|
239
|
-
|
|
240
|
-
package에는 내부 Agent instruction artifact를 포함하지 않습니다. consumer repository에서 oc-ui 사용 지침을 세팅할 때는 아래 public-safe prompt를 Agent에게 붙여넣으세요.
|
|
241
|
-
|
|
242
|
-
```text
|
|
243
|
-
This repository uses @orioncactuscorp/ui.
|
|
244
|
-
|
|
245
|
-
Set up or update this repository's agent instructions for oc-ui usage.
|
|
246
|
-
|
|
247
|
-
Use the installed package and public package docs as the source of truth:
|
|
248
|
-
- package.json
|
|
249
|
-
- node_modules/@orioncactuscorp/ui/package.json
|
|
250
|
-
- node_modules/@orioncactuscorp/ui/README.md
|
|
251
|
-
- node_modules/@orioncactuscorp/icons/package.json
|
|
252
|
-
- node_modules/@orioncactuscorp/icons/README.md
|
|
253
|
-
|
|
254
|
-
Inspect this repository's AGENTS.md and CLAUDE.md files if they exist.
|
|
255
|
-
Preserve repository-local rules.
|
|
256
|
-
Do not overwrite existing project conventions.
|
|
257
|
-
Report conflicts before editing instructions.
|
|
258
|
-
|
|
259
|
-
Document:
|
|
260
|
-
- where @orioncactuscorp/ui/foundations.css and @orioncactuscorp/ui/styles.css are imported
|
|
261
|
-
- whether this repository uses prebuilt CSS or SCSS source customization
|
|
262
|
-
- whether icons are imported directly from @orioncactuscorp/icons
|
|
263
|
-
- which local components should prefer oc-ui primitives
|
|
264
|
-
|
|
265
|
-
Do not assume access to private orioncactus agent documents.
|
|
266
|
-
Do not use the latest upstream main branch as the convention source unless I explicitly ask for that comparison.
|
|
267
|
-
```
|
|
385
|
+
## 참고
|
|
268
386
|
|
|
269
|
-
|
|
387
|
+
- [wanteddev/montage-web](https://github.com/wanteddev/montage-web): foundation, component state, slot, accessibility, interaction 설계 참고
|
|
270
388
|
|
|
271
|
-
##
|
|
389
|
+
## 라이선스
|
|
272
390
|
|
|
273
391
|
MIT
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.oc-ActionArea-module__actionArea__jnxep{position:relative;display:flex;flex-direction:column;inline-size:100%;padding:var(--oc-action-area-padding-y) var(--oc-action-area-padding-x) var(--oc-action-area-padding-bottom);--oc-action-area-padding-x: var(--oc-space-section-padding-viewport-x);--oc-action-area-padding-y: var(--oc-space-section-padding-viewport-y);--oc-action-area-padding-bottom: var(--oc-action-area-padding-y);--oc-action-area-gap: var(--oc-space-item-gap-small);--oc-action-area-actions-gap: var(--oc-space-item-gap-small);--oc-action-area-background-color: var(--oc-color-theme-background-elevated-normal)}.oc-ActionArea-module__actionArea__jnxep:before{position:absolute;inset:0;z-index:0;background:linear-gradient(to bottom,transparent,var(--oc-action-area-background-color) 45%);opacity:0;content:"";pointer-events:none}.oc-ActionArea-module__actionArea__jnxep>*{position:relative;z-index:1}.oc-ActionArea-module__actionArea__jnxep[data-oc-background=true]:before{opacity:1}.oc-ActionArea-module__actionArea__jnxep[data-oc-has-extra=true]{border-block-start:1px solid var(--oc-color-theme-line-normal-neutral);background-color:var(--oc-action-area-background-color)}.oc-ActionArea-module__actionArea__jnxep [data-oc-part=extra-slot]{display:flex;flex-direction:column;align-items:center;margin-block-end:calc(var(--oc-action-area-gap) + var(--oc-action-area-padding-y))}.oc-ActionArea-module__actionArea__jnxep [data-oc-part=caption]{font-size:calc(var(--oc-typo-size-label2) * var(--oc-typo-scale, 1));line-height:calc(var(--oc-typo-height-label2) * var(--oc-typo-scale, 1));letter-spacing:var(--oc-typo-spacing-label2);font-weight:var(--oc-typo-weight-label2-normal);margin:0 0 var(--oc-space-item-gap-medium);color:var(--oc-color-theme-label-alternative);text-align:center}.oc-ActionArea-module__actionArea__jnxep [data-oc-part=actions]{display:flex;gap:var(--oc-action-area-actions-gap);min-width:0}.oc-ActionArea-module__actionArea__jnxep[data-oc-variant=strong] [data-oc-part=actions],.oc-ActionArea-module__actionArea__jnxep[data-oc-variant=cancel] [data-oc-part=actions]{flex-direction:column}.oc-ActionArea-module__actionArea__jnxep[data-oc-variant=neutral] [data-oc-part=actions]{flex-direction:row}.oc-ActionArea-module__actionArea__jnxep[data-oc-variant=neutral] [data-oc-part=actions]>[data-oc-action-area-button=true]{flex:1 1 0}.oc-ActionArea-module__actionArea__jnxep[data-oc-variant=neutral] [data-oc-part=actions]>[data-oc-action-area-button-variant=sub][data-oc-icon-only=true]{flex:0 0 auto}.oc-ActionArea-module__actionArea__jnxep[data-oc-variant=compact] [data-oc-part=actions]{flex-direction:row;justify-content:flex-end}.oc-ActionArea-module__actionArea__jnxep[data-oc-variant=compact] [data-oc-part=actions]:has(>[data-oc-action-area-button-variant=sub][data-oc-icon-only=true]){justify-content:space-between;inline-size:100%}.oc-ActionArea-module__actionArea__jnxep[data-oc-variant=compact] [data-oc-part=compact-row]{display:flex;align-items:center;justify-content:space-between;gap:var(--oc-space-item-gap-medium);min-width:0}.oc-ActionArea-module__actionArea__jnxep[data-oc-variant=compact] [data-oc-part=compact-slot]{display:flex;align-items:center;flex:1 1 auto;min-width:0}.oc-ActionArea-module__actionButton__fKHJQ{min-width:0}.oc-ActionArea-module__actionButton__fKHJQ[data-oc-component=text-button]{flex:0 0 auto;inline-size:fit-content;align-self:center}
|
|
1
|
+
.oc-ActionArea-module__actionArea__jnxep{position:relative;isolation:isolate;display:flex;flex-direction:column;inline-size:100%;padding:var(--oc-action-area-padding-y) var(--oc-action-area-padding-x) var(--oc-action-area-padding-bottom);--oc-action-area-padding-x: var(--oc-space-section-padding-viewport-x);--oc-action-area-padding-y: var(--oc-space-section-padding-viewport-y);--oc-action-area-padding-bottom: var(--oc-action-area-padding-y);--oc-action-area-gap: var(--oc-space-item-gap-small);--oc-action-area-actions-gap: var(--oc-space-item-gap-small);--oc-action-area-background-color: var(--oc-color-theme-background-elevated-normal)}.oc-ActionArea-module__actionArea__jnxep:before{position:absolute;inset:0;z-index:0;background:linear-gradient(to bottom,transparent,var(--oc-action-area-background-color) 45%);opacity:0;content:"";pointer-events:none}.oc-ActionArea-module__actionArea__jnxep>*{position:relative;z-index:1}.oc-ActionArea-module__actionArea__jnxep[data-oc-background=true]:before{opacity:1}.oc-ActionArea-module__actionArea__jnxep[data-oc-has-extra=true]{border-block-start:1px solid var(--oc-color-theme-line-normal-neutral);background-color:var(--oc-action-area-background-color)}.oc-ActionArea-module__actionArea__jnxep [data-oc-part=extra-slot]{display:flex;flex-direction:column;align-items:center;margin-block-end:calc(var(--oc-action-area-gap) + var(--oc-action-area-padding-y))}.oc-ActionArea-module__actionArea__jnxep [data-oc-part=caption]{font-size:calc(var(--oc-typo-size-label2) * var(--oc-typo-scale, 1));line-height:calc(var(--oc-typo-height-label2) * var(--oc-typo-scale, 1));letter-spacing:var(--oc-typo-spacing-label2);font-weight:var(--oc-typo-weight-label2-normal);margin:0 0 var(--oc-space-item-gap-medium);color:var(--oc-color-theme-label-alternative);text-align:center}.oc-ActionArea-module__actionArea__jnxep [data-oc-part=actions]{display:flex;gap:var(--oc-action-area-actions-gap);min-width:0}.oc-ActionArea-module__actionArea__jnxep[data-oc-variant=strong] [data-oc-part=actions],.oc-ActionArea-module__actionArea__jnxep[data-oc-variant=cancel] [data-oc-part=actions]{flex-direction:column}.oc-ActionArea-module__actionArea__jnxep[data-oc-variant=neutral] [data-oc-part=actions]{flex-direction:row}.oc-ActionArea-module__actionArea__jnxep[data-oc-variant=neutral] [data-oc-part=actions]>[data-oc-action-area-button=true]{flex:1 1 0}.oc-ActionArea-module__actionArea__jnxep[data-oc-variant=neutral] [data-oc-part=actions]>[data-oc-action-area-button-variant=sub][data-oc-icon-only=true]{flex:0 0 auto}.oc-ActionArea-module__actionArea__jnxep[data-oc-variant=compact] [data-oc-part=actions]{flex-direction:row;justify-content:flex-end}.oc-ActionArea-module__actionArea__jnxep[data-oc-variant=compact] [data-oc-part=actions]:has(>[data-oc-action-area-button-variant=sub][data-oc-icon-only=true]){justify-content:space-between;inline-size:100%}.oc-ActionArea-module__actionArea__jnxep[data-oc-variant=compact] [data-oc-part=compact-row]{display:flex;align-items:center;justify-content:space-between;gap:var(--oc-space-item-gap-medium);min-width:0}.oc-ActionArea-module__actionArea__jnxep[data-oc-variant=compact] [data-oc-part=compact-slot]{display:flex;align-items:center;flex:1 1 auto;min-width:0}.oc-ActionArea-module__actionButton__fKHJQ{min-width:0}.oc-ActionArea-module__actionButton__fKHJQ[data-oc-component=text-button]{flex:0 0 auto;inline-size:fit-content;align-self:center}
|