@seed-design/css 1.2.15 → 2.0.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/all.css +4956 -1925
- package/all.layered.css +5922 -2883
- package/all.layered.min.css +1 -1
- package/all.min.css +1 -1
- package/base.css +348 -35
- package/base.layered.css +348 -35
- package/base.layered.min.css +1 -1
- package/base.min.css +1 -1
- package/breakpoints/index.d.ts +7 -0
- package/breakpoints/index.mjs +17 -0
- package/package.json +6 -1
- package/recipes/accordion.css +268 -0
- package/recipes/accordion.d.ts +33 -0
- package/recipes/accordion.layered.css +308 -0
- package/recipes/accordion.layered.mjs +94 -0
- package/recipes/accordion.mjs +94 -0
- package/recipes/action-button.css +56 -4
- package/recipes/action-button.d.ts +16 -0
- package/recipes/action-button.layered.css +60 -4
- package/recipes/app-bar.css +0 -3
- package/recipes/app-bar.d.ts +0 -4
- package/recipes/app-bar.layered.css +0 -4
- package/recipes/app-bar.layered.mjs +1 -5
- package/recipes/app-bar.mjs +1 -5
- package/recipes/app-screen.css +3 -0
- package/recipes/app-screen.layered.css +4 -0
- package/recipes/attachment-input-item.css +275 -0
- package/recipes/attachment-input-item.d.ts +24 -0
- package/recipes/attachment-input-item.layered.css +288 -0
- package/recipes/attachment-input-item.layered.mjs +79 -0
- package/recipes/attachment-input-item.mjs +79 -0
- package/recipes/attachment-input-trigger.css +71 -0
- package/recipes/attachment-input-trigger.d.ts +21 -0
- package/recipes/attachment-input-trigger.layered.css +85 -0
- package/recipes/attachment-input-trigger.layered.mjs +48 -0
- package/recipes/attachment-input-trigger.mjs +48 -0
- package/recipes/attachment-input.css +55 -0
- package/recipes/attachment-input.d.ts +21 -0
- package/recipes/attachment-input.layered.css +64 -0
- package/recipes/attachment-input.layered.mjs +48 -0
- package/recipes/attachment-input.mjs +48 -0
- package/recipes/avatar.d.ts +9 -0
- package/recipes/badge.d.ts +10 -0
- package/recipes/bottom-sheet.css +62 -5
- package/recipes/bottom-sheet.layered.css +67 -5
- package/recipes/callout.d.ts +7 -0
- package/recipes/checkmark.d.ts +3 -0
- package/recipes/chip-tabs.css +8 -52
- package/recipes/chip-tabs.d.ts +1 -1
- package/recipes/chip-tabs.layered.css +8 -62
- package/recipes/chip-tabs.layered.mjs +1 -2
- package/recipes/chip-tabs.mjs +1 -2
- package/recipes/chip.d.ts +4 -0
- package/recipes/contextual-floating-button.d.ts +6 -0
- package/recipes/dialog.css +14 -11
- package/recipes/dialog.layered.css +4 -0
- package/recipes/footer.css +44 -0
- package/recipes/footer.d.ts +24 -0
- package/recipes/footer.layered.css +52 -0
- package/recipes/footer.layered.mjs +39 -0
- package/recipes/footer.mjs +39 -0
- package/recipes/help-bubble.css +29 -1
- package/recipes/help-bubble.layered.css +34 -1
- package/recipes/image-frame.css +0 -3
- package/recipes/image-frame.d.ts +0 -4
- package/recipes/image-frame.layered.css +0 -4
- package/recipes/image-frame.layered.mjs +1 -6
- package/recipes/image-frame.mjs +1 -6
- package/recipes/input-button.css +176 -20
- package/recipes/input-button.d.ts +8 -1
- package/recipes/input-button.layered.css +197 -21
- package/recipes/input-button.layered.mjs +10 -2
- package/recipes/input-button.mjs +10 -2
- package/recipes/layout.css +25 -0
- package/recipes/layout.d.ts +24 -0
- package/recipes/layout.layered.css +25 -0
- package/recipes/layout.layered.mjs +44 -0
- package/recipes/layout.mjs +44 -0
- package/recipes/list-item.css +72 -4
- package/recipes/list-item.layered.css +84 -4
- package/recipes/menu-item.css +174 -0
- package/recipes/menu-item.d.ts +35 -0
- package/recipes/menu-item.layered.css +200 -0
- package/recipes/menu-item.layered.mjs +57 -0
- package/recipes/menu-item.mjs +57 -0
- package/recipes/menu-sheet-item.d.ts +6 -0
- package/recipes/menu-sheet.css +19 -1
- package/recipes/menu-sheet.layered.css +22 -1
- package/recipes/menu.css +119 -0
- package/recipes/menu.d.ts +28 -0
- package/recipes/menu.layered.css +139 -0
- package/recipes/menu.layered.mjs +56 -0
- package/recipes/menu.mjs +56 -0
- package/recipes/notification-badge.d.ts +3 -0
- package/recipes/page-banner.d.ts +5 -0
- package/recipes/progress-circle.d.ts +7 -0
- package/recipes/{selectBoxCheckmark.css → select-box-checkmark.css} +6 -6
- package/recipes/{selectBoxCheckmark.layered.css → select-box-checkmark.layered.css} +6 -6
- package/recipes/{selectBoxCheckmark.layered.mjs → select-box-checkmark.layered.mjs} +4 -4
- package/recipes/{selectBoxCheckmark.mjs → select-box-checkmark.mjs} +4 -4
- package/recipes/side-navigation-inset.css +4 -0
- package/recipes/side-navigation-inset.d.ts +19 -0
- package/recipes/side-navigation-inset.layered.css +6 -0
- package/recipes/side-navigation-inset.layered.mjs +22 -0
- package/recipes/side-navigation-inset.mjs +22 -0
- package/recipes/side-navigation-menu-item.css +135 -0
- package/recipes/side-navigation-menu-item.d.ts +21 -0
- package/recipes/side-navigation-menu-item.layered.css +156 -0
- package/recipes/side-navigation-menu-item.layered.mjs +48 -0
- package/recipes/side-navigation-menu-item.mjs +48 -0
- package/recipes/side-navigation.css +115 -0
- package/recipes/side-navigation.d.ts +24 -0
- package/recipes/side-navigation.layered.css +132 -0
- package/recipes/side-navigation.layered.mjs +63 -0
- package/recipes/side-navigation.mjs +63 -0
- package/recipes/side-panel.css +327 -0
- package/recipes/side-panel.d.ts +24 -0
- package/recipes/side-panel.layered.css +361 -0
- package/recipes/side-panel.layered.mjs +72 -0
- package/recipes/side-panel.mjs +72 -0
- package/recipes/skeleton.css +36 -2
- package/recipes/skeleton.d.ts +8 -0
- package/recipes/skeleton.layered.css +40 -2
- package/recipes/text-input.css +323 -52
- package/recipes/text-input.d.ts +8 -1
- package/recipes/text-input.layered.css +385 -51
- package/recipes/text-input.layered.mjs +18 -1
- package/recipes/text-input.mjs +18 -1
- package/recipes/text.css +180 -0
- package/recipes/text.d.ts +59 -1
- package/recipes/text.layered.css +216 -0
- package/recipes/text.layered.mjs +37 -1
- package/recipes/text.mjs +37 -1
- package/recipes/toggle-button.d.ts +3 -0
- package/vars/color/bg.d.ts +2 -2
- package/vars/color/bg.mjs +2 -1
- package/vars/color/stroke.d.ts +2 -2
- package/vars/color/stroke.mjs +2 -2
- package/vars/component/accordion-item.d.ts +132 -0
- package/vars/component/accordion-item.mjs +126 -0
- package/vars/component/accordion.d.ts +22 -0
- package/vars/component/accordion.mjs +16 -0
- package/vars/component/attachment-input-dropzone.d.ts +32 -0
- package/vars/component/attachment-input-dropzone.mjs +30 -0
- package/vars/component/attachment-input-item-action-button.d.ts +37 -0
- package/vars/component/attachment-input-item-action-button.mjs +37 -0
- package/vars/component/attachment-input-item-remove-button.d.ts +28 -0
- package/vars/component/attachment-input-item-remove-button.mjs +28 -0
- package/vars/component/attachment-input-item.d.ts +103 -0
- package/vars/component/attachment-input-item.mjs +102 -0
- package/vars/component/attachment-input-trigger.d.ts +46 -0
- package/vars/component/attachment-input-trigger.mjs +46 -0
- package/vars/component/attachment-input.d.ts +14 -0
- package/vars/component/attachment-input.mjs +12 -0
- package/vars/component/chip-tablist.d.ts +0 -7
- package/vars/component/chip-tablist.mjs +0 -7
- package/vars/component/image-frame.d.ts +1 -22
- package/vars/component/image-frame.mjs +1 -9
- package/vars/component/index.d.ts +12 -1
- package/vars/component/index.mjs +12 -1
- package/vars/component/input-button.d.ts +90 -17
- package/vars/component/input-button.mjs +84 -17
- package/vars/component/menu-item.d.ts +129 -0
- package/vars/component/menu-item.mjs +117 -0
- package/vars/component/menu.d.ts +68 -0
- package/vars/component/menu.mjs +60 -0
- package/vars/component/side-panel-close-button.d.ts +23 -0
- package/vars/component/side-panel-close-button.mjs +23 -0
- package/vars/component/side-panel.d.ts +94 -0
- package/vars/component/side-panel.mjs +83 -0
- package/vars/component/text-input.d.ts +92 -24
- package/vars/component/text-input.mjs +76 -24
- package/vars/component/typography.d.ts +414 -0
- package/vars/component/typography.mjs +324 -0
- package/vars/font-size.d.ts +17 -1
- package/vars/font-size.mjs +9 -1
- package/vars/gradient.d.ts +0 -8
- package/vars/gradient.mjs +0 -2
- package/vars/line-height.d.ts +17 -1
- package/vars/line-height.mjs +9 -1
- package/vars/component/chip-tab.d.ts +0 -162
- package/vars/component/chip-tab.mjs +0 -162
- /package/recipes/{selectBoxCheckmark.d.ts → select-box-checkmark.d.ts} +0 -0
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import './menu-item.layered.css';
|
|
2
|
+
import { createClassName, mergeVariants, splitVariantProps } from "./shared.mjs";
|
|
3
|
+
|
|
4
|
+
const menuItemSlotNames = [
|
|
5
|
+
[
|
|
6
|
+
"root",
|
|
7
|
+
"seed-menu-item__root"
|
|
8
|
+
],
|
|
9
|
+
[
|
|
10
|
+
"body",
|
|
11
|
+
"seed-menu-item__body"
|
|
12
|
+
],
|
|
13
|
+
[
|
|
14
|
+
"label",
|
|
15
|
+
"seed-menu-item__label"
|
|
16
|
+
],
|
|
17
|
+
[
|
|
18
|
+
"description",
|
|
19
|
+
"seed-menu-item__description"
|
|
20
|
+
]
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
const defaultVariant = {
|
|
24
|
+
"size": "medium",
|
|
25
|
+
"tone": "neutral"
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const compoundVariants = [];
|
|
29
|
+
|
|
30
|
+
export const menuItemVariantMap = {
|
|
31
|
+
"size": [
|
|
32
|
+
"medium",
|
|
33
|
+
"small",
|
|
34
|
+
"responsive"
|
|
35
|
+
],
|
|
36
|
+
"tone": [
|
|
37
|
+
"neutral",
|
|
38
|
+
"critical"
|
|
39
|
+
]
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export const menuItemVariantKeys = Object.keys(menuItemVariantMap);
|
|
43
|
+
|
|
44
|
+
export function menuItem(props) {
|
|
45
|
+
return Object.fromEntries(
|
|
46
|
+
menuItemSlotNames.map(([slot, className]) => {
|
|
47
|
+
return [
|
|
48
|
+
slot,
|
|
49
|
+
createClassName(className, mergeVariants(defaultVariant, props), compoundVariants),
|
|
50
|
+
];
|
|
51
|
+
}),
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
Object.assign(menuItem, { splitVariantProps: (props) => splitVariantProps(props, menuItemVariantMap) });
|
|
56
|
+
|
|
57
|
+
// @recipe(seed): menu-item
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import './menu-item.css';
|
|
2
|
+
import { createClassName, mergeVariants, splitVariantProps } from "./shared.mjs";
|
|
3
|
+
|
|
4
|
+
const menuItemSlotNames = [
|
|
5
|
+
[
|
|
6
|
+
"root",
|
|
7
|
+
"seed-menu-item__root"
|
|
8
|
+
],
|
|
9
|
+
[
|
|
10
|
+
"body",
|
|
11
|
+
"seed-menu-item__body"
|
|
12
|
+
],
|
|
13
|
+
[
|
|
14
|
+
"label",
|
|
15
|
+
"seed-menu-item__label"
|
|
16
|
+
],
|
|
17
|
+
[
|
|
18
|
+
"description",
|
|
19
|
+
"seed-menu-item__description"
|
|
20
|
+
]
|
|
21
|
+
];
|
|
22
|
+
|
|
23
|
+
const defaultVariant = {
|
|
24
|
+
"size": "medium",
|
|
25
|
+
"tone": "neutral"
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
const compoundVariants = [];
|
|
29
|
+
|
|
30
|
+
export const menuItemVariantMap = {
|
|
31
|
+
"size": [
|
|
32
|
+
"medium",
|
|
33
|
+
"small",
|
|
34
|
+
"responsive"
|
|
35
|
+
],
|
|
36
|
+
"tone": [
|
|
37
|
+
"neutral",
|
|
38
|
+
"critical"
|
|
39
|
+
]
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
export const menuItemVariantKeys = Object.keys(menuItemVariantMap);
|
|
43
|
+
|
|
44
|
+
export function menuItem(props) {
|
|
45
|
+
return Object.fromEntries(
|
|
46
|
+
menuItemSlotNames.map(([slot, className]) => {
|
|
47
|
+
return [
|
|
48
|
+
slot,
|
|
49
|
+
createClassName(className, mergeVariants(defaultVariant, props), compoundVariants),
|
|
50
|
+
];
|
|
51
|
+
}),
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
Object.assign(menuItem, { splitVariantProps: (props) => splitVariantProps(props, menuItemVariantMap) });
|
|
56
|
+
|
|
57
|
+
// @recipe(seed): menu-item
|
|
@@ -1,9 +1,15 @@
|
|
|
1
1
|
declare interface MenuSheetItemVariant {
|
|
2
2
|
/**
|
|
3
|
+
* - `neutral`: 일반적인 작업을 수행하는 기본 아이템입니다.
|
|
4
|
+
* - `critical`: 데이터 삭제와 같이 되돌릴 수 없는 작업을 수행하는 아이템입니다.
|
|
5
|
+
*
|
|
3
6
|
* @default "neutral"
|
|
4
7
|
*/
|
|
5
8
|
tone: "neutral" | "critical";
|
|
6
9
|
/**
|
|
10
|
+
* - `left`: 라벨을 왼쪽 정렬합니다.
|
|
11
|
+
* - `center`: 라벨을 중앙 정렬합니다.
|
|
12
|
+
*
|
|
7
13
|
* @default "left"
|
|
8
14
|
*/
|
|
9
15
|
labelAlign: "left" | "center";
|
package/recipes/menu-sheet.css
CHANGED
|
@@ -32,11 +32,29 @@
|
|
|
32
32
|
background: var(--seed-color-bg-layer-floating);
|
|
33
33
|
padding-left: var(--seed-dimension-spacing-x-global-gutter);
|
|
34
34
|
padding-right: var(--seed-dimension-spacing-x-global-gutter);
|
|
35
|
-
padding-top: var(--seed-dimension-x4);
|
|
35
|
+
padding-top: var(--menu-sheet-header-padding-top, var(--seed-dimension-x4));
|
|
36
36
|
padding-bottom: calc(var(--seed-dimension-x4) + var(--seed-safe-area-bottom));
|
|
37
37
|
border-top-left-radius: var(--seed-radius-r5);
|
|
38
38
|
border-top-right-radius: var(--seed-radius-r5);
|
|
39
39
|
}
|
|
40
|
+
.seed-menu-sheet__content:is(:focus, [data-focus]) {
|
|
41
|
+
outline: none;
|
|
42
|
+
}
|
|
43
|
+
.seed-menu-sheet__content[data-drawer] {
|
|
44
|
+
touch-action: none;
|
|
45
|
+
will-change: transform;
|
|
46
|
+
--menu-sheet-header-padding-top: var(--seed-dimension-x6);
|
|
47
|
+
}
|
|
48
|
+
.seed-menu-sheet__content[data-drawer]::after {
|
|
49
|
+
top: 100%;
|
|
50
|
+
height: 200vh;
|
|
51
|
+
content: "";
|
|
52
|
+
position: absolute;
|
|
53
|
+
left: 0;
|
|
54
|
+
right: 0;
|
|
55
|
+
background: inherit;
|
|
56
|
+
z-index: -1;
|
|
57
|
+
}
|
|
40
58
|
.seed-menu-sheet__header {
|
|
41
59
|
display: flex;
|
|
42
60
|
flex-direction: column;
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
background: var(--seed-color-bg-layer-floating);
|
|
25
25
|
padding-left: var(--seed-dimension-spacing-x-global-gutter);
|
|
26
26
|
padding-right: var(--seed-dimension-spacing-x-global-gutter);
|
|
27
|
-
padding-top: var(--seed-dimension-x4);
|
|
27
|
+
padding-top: var(--menu-sheet-header-padding-top, var(--seed-dimension-x4));
|
|
28
28
|
padding-bottom: calc(var(--seed-dimension-x4) + var(--seed-safe-area-bottom));
|
|
29
29
|
border-top-left-radius: var(--seed-radius-r5);
|
|
30
30
|
border-top-right-radius: var(--seed-radius-r5);
|
|
@@ -35,6 +35,27 @@
|
|
|
35
35
|
position: relative;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
.seed-menu-sheet__content:is(:focus, [data-focus]) {
|
|
39
|
+
outline: none;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.seed-menu-sheet__content[data-drawer] {
|
|
43
|
+
touch-action: none;
|
|
44
|
+
will-change: transform;
|
|
45
|
+
--menu-sheet-header-padding-top: var(--seed-dimension-x6);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.seed-menu-sheet__content[data-drawer]:after {
|
|
49
|
+
content: "";
|
|
50
|
+
background: inherit;
|
|
51
|
+
z-index: -1;
|
|
52
|
+
height: 200vh;
|
|
53
|
+
position: absolute;
|
|
54
|
+
top: 100%;
|
|
55
|
+
left: 0;
|
|
56
|
+
right: 0;
|
|
57
|
+
}
|
|
58
|
+
|
|
38
59
|
.seed-menu-sheet__header {
|
|
39
60
|
text-align: center;
|
|
40
61
|
align-items: center;
|
package/recipes/menu.css
ADDED
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
.seed-menu__positioner {
|
|
2
|
+
--menu-z-index: 99999;
|
|
3
|
+
z-index: calc(var(--menu-z-index) + var(--z-index-offset, 0));
|
|
4
|
+
outline: none;
|
|
5
|
+
}
|
|
6
|
+
.seed-menu__content {
|
|
7
|
+
border-radius: var(--seed-radius-r5);
|
|
8
|
+
background: var(--seed-color-bg-layer-floating);
|
|
9
|
+
box-shadow: var(--seed-shadow-s3);
|
|
10
|
+
transform-origin: var(--seed-menu-transform-origin);
|
|
11
|
+
overflow: hidden;
|
|
12
|
+
}
|
|
13
|
+
.seed-menu__content:is([data-state="open"], [data-open]) {
|
|
14
|
+
animation: seed-enter;
|
|
15
|
+
animation-timing-function: var(--seed-timing-function-enter);
|
|
16
|
+
animation-duration: var(--seed-duration-d3);
|
|
17
|
+
--seed-enter-translate-x: 0;
|
|
18
|
+
--seed-enter-translate-y: 0;
|
|
19
|
+
--seed-enter-opacity: 0;
|
|
20
|
+
--seed-enter-scale: 0.95;
|
|
21
|
+
}
|
|
22
|
+
.seed-menu__content:not(:is([data-state="open"], [data-open])) {
|
|
23
|
+
animation: seed-exit;
|
|
24
|
+
animation-timing-function: var(--seed-timing-function-exit);
|
|
25
|
+
animation-duration: var(--seed-duration-d2);
|
|
26
|
+
animation-fill-mode: forwards;
|
|
27
|
+
--seed-exit-translate-x: 0;
|
|
28
|
+
--seed-exit-translate-y: 0;
|
|
29
|
+
--seed-exit-opacity: 0;
|
|
30
|
+
--seed-exit-scale: 0.95;
|
|
31
|
+
}
|
|
32
|
+
.seed-menu__content[data-instant] {
|
|
33
|
+
animation-duration: 0s;
|
|
34
|
+
}
|
|
35
|
+
.seed-menu__content:is([hidden], [data-hidden]) {
|
|
36
|
+
display: none !important;
|
|
37
|
+
}
|
|
38
|
+
.seed-menu__content:is(:focus, [data-focus]) {
|
|
39
|
+
outline: none;
|
|
40
|
+
}
|
|
41
|
+
.seed-menu__scrollArea {
|
|
42
|
+
overflow-y: auto;
|
|
43
|
+
max-height: min(480px, var(--seed-menu-available-height, 480px));
|
|
44
|
+
box-sizing: border-box;
|
|
45
|
+
padding-top: var(--seed-dimension-x2);
|
|
46
|
+
padding-bottom: var(--seed-dimension-x2);
|
|
47
|
+
display: flex;
|
|
48
|
+
flex-direction: column;
|
|
49
|
+
gap: var(--seed-dimension-x2);
|
|
50
|
+
}
|
|
51
|
+
.seed-menu__group {
|
|
52
|
+
display: flex;
|
|
53
|
+
flex-direction: column;
|
|
54
|
+
}
|
|
55
|
+
.seed-menu__group + .seed-menu__group::before {
|
|
56
|
+
content: "";
|
|
57
|
+
display: block;
|
|
58
|
+
margin-left: var(--seed-dimension-x4);
|
|
59
|
+
margin-right: var(--seed-dimension-x4);
|
|
60
|
+
margin-bottom: var(--seed-dimension-x2);
|
|
61
|
+
height: 1px;
|
|
62
|
+
flex-shrink: 0;
|
|
63
|
+
background-color: var(--seed-color-stroke-neutral-muted);
|
|
64
|
+
}
|
|
65
|
+
.seed-menu__groupLabel {
|
|
66
|
+
color: var(--seed-color-fg-neutral-subtle);
|
|
67
|
+
}
|
|
68
|
+
.seed-menu__content--size_medium {
|
|
69
|
+
width: var(--seed-menu-reference-width, 240px);
|
|
70
|
+
}
|
|
71
|
+
.seed-menu__groupLabel--size_medium {
|
|
72
|
+
padding-top: var(--seed-dimension-x2_5);
|
|
73
|
+
padding-bottom: var(--seed-dimension-x2_5);
|
|
74
|
+
padding-left: var(--seed-dimension-x4);
|
|
75
|
+
padding-right: var(--seed-dimension-x4);
|
|
76
|
+
font-size: var(--seed-font-size-t4);
|
|
77
|
+
line-height: var(--seed-line-height-t4);
|
|
78
|
+
font-weight: var(--seed-font-weight-medium);
|
|
79
|
+
}
|
|
80
|
+
.seed-menu__content--size_small {
|
|
81
|
+
width: var(--seed-menu-reference-width, 200px);
|
|
82
|
+
}
|
|
83
|
+
.seed-menu__groupLabel--size_small {
|
|
84
|
+
padding-top: var(--seed-dimension-x2);
|
|
85
|
+
padding-bottom: var(--seed-dimension-x2);
|
|
86
|
+
padding-left: var(--seed-dimension-x4);
|
|
87
|
+
padding-right: var(--seed-dimension-x4);
|
|
88
|
+
font-size: var(--seed-font-size-t3);
|
|
89
|
+
line-height: var(--seed-line-height-t3);
|
|
90
|
+
font-weight: var(--seed-font-weight-regular);
|
|
91
|
+
}
|
|
92
|
+
.seed-menu__content--size_responsive {
|
|
93
|
+
width: var(--seed-menu-reference-width, 240px);
|
|
94
|
+
}
|
|
95
|
+
@media (min-width: 1280px) {
|
|
96
|
+
.seed-menu__content--size_responsive {
|
|
97
|
+
width: var(--seed-menu-reference-width, 200px);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
.seed-menu__groupLabel--size_responsive {
|
|
101
|
+
padding-top: var(--seed-dimension-x2_5);
|
|
102
|
+
padding-bottom: var(--seed-dimension-x2_5);
|
|
103
|
+
padding-left: var(--seed-dimension-x4);
|
|
104
|
+
padding-right: var(--seed-dimension-x4);
|
|
105
|
+
font-size: var(--seed-font-size-t4);
|
|
106
|
+
line-height: var(--seed-line-height-t4);
|
|
107
|
+
font-weight: var(--seed-font-weight-medium);
|
|
108
|
+
}
|
|
109
|
+
@media (min-width: 1280px) {
|
|
110
|
+
.seed-menu__groupLabel--size_responsive {
|
|
111
|
+
padding-top: var(--seed-dimension-x2);
|
|
112
|
+
padding-bottom: var(--seed-dimension-x2);
|
|
113
|
+
padding-left: var(--seed-dimension-x4);
|
|
114
|
+
padding-right: var(--seed-dimension-x4);
|
|
115
|
+
font-size: var(--seed-font-size-t3);
|
|
116
|
+
line-height: var(--seed-line-height-t3);
|
|
117
|
+
font-weight: var(--seed-font-weight-regular);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
declare interface MenuVariant {
|
|
2
|
+
/**
|
|
3
|
+
* - `medium`: 뷰포트 너비와 관계없이 사용할 수 있습니다.
|
|
4
|
+
* - `small`: Breakpoint `lg` 이상(데스크톱)에서만 사용하고, 모바일에서는 사용하지 않습니다. 정밀한 선택이 가능한 마우스 입력 환경에서 사이즈를 더 작게 만들고자 할 때 사용합니다.
|
|
5
|
+
* - `responsive`: 뷰포트 너비에 따라 적용되는 사이즈가 달라집니다. Breakpoint `lg` 미만에서는 `medium`, `lg` 이상에서는 `small`로 적용됩니다.
|
|
6
|
+
*
|
|
7
|
+
* @default "medium"
|
|
8
|
+
*/
|
|
9
|
+
size: "medium" | "small" | "responsive";
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
declare type MenuVariantMap = {
|
|
13
|
+
[key in keyof MenuVariant]: Array<MenuVariant[key]>;
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export declare type MenuVariantProps = Partial<MenuVariant>;
|
|
17
|
+
|
|
18
|
+
export declare type MenuSlotName = "positioner" | "content" | "scrollArea" | "group" | "groupLabel";
|
|
19
|
+
|
|
20
|
+
export declare const menuVariantMap: MenuVariantMap;
|
|
21
|
+
|
|
22
|
+
export declare const menu: ((
|
|
23
|
+
props?: MenuVariantProps,
|
|
24
|
+
) => Record<MenuSlotName, string>) & {
|
|
25
|
+
splitVariantProps: <T extends MenuVariantProps>(
|
|
26
|
+
props: T,
|
|
27
|
+
) => [MenuVariantProps, Omit<T, keyof MenuVariantProps>];
|
|
28
|
+
}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
@layer seed-components {
|
|
2
|
+
.seed-menu__positioner {
|
|
3
|
+
--menu-z-index: 99999;
|
|
4
|
+
z-index: calc(var(--menu-z-index) + var(--z-index-offset, 0));
|
|
5
|
+
outline: none;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
.seed-menu__content {
|
|
9
|
+
border-radius: var(--seed-radius-r5);
|
|
10
|
+
background: var(--seed-color-bg-layer-floating);
|
|
11
|
+
box-shadow: var(--seed-shadow-s3);
|
|
12
|
+
transform-origin: var(--seed-menu-transform-origin);
|
|
13
|
+
overflow: hidden;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
.seed-menu__content:is([data-state="open"], [data-open]) {
|
|
17
|
+
animation: seed-enter;
|
|
18
|
+
animation-timing-function: var(--seed-timing-function-enter);
|
|
19
|
+
animation-duration: var(--seed-duration-d3);
|
|
20
|
+
--seed-enter-translate-x: 0;
|
|
21
|
+
--seed-enter-translate-y: 0;
|
|
22
|
+
--seed-enter-opacity: 0;
|
|
23
|
+
--seed-enter-scale: .95;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.seed-menu__content:not(:is([data-state="open"], [data-open])) {
|
|
27
|
+
animation: seed-exit;
|
|
28
|
+
animation-timing-function: var(--seed-timing-function-exit);
|
|
29
|
+
animation-duration: var(--seed-duration-d2);
|
|
30
|
+
--seed-exit-translate-x: 0;
|
|
31
|
+
--seed-exit-translate-y: 0;
|
|
32
|
+
--seed-exit-opacity: 0;
|
|
33
|
+
--seed-exit-scale: .95;
|
|
34
|
+
animation-fill-mode: forwards;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
.seed-menu__content[data-instant] {
|
|
38
|
+
animation-duration: 0s;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
.seed-menu__content:is([hidden], [data-hidden]) {
|
|
42
|
+
display: none !important;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
.seed-menu__content:is(:focus, [data-focus]) {
|
|
46
|
+
outline: none;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
.seed-menu__scrollArea {
|
|
50
|
+
max-height: min(480px, var(--seed-menu-available-height, 480px));
|
|
51
|
+
box-sizing: border-box;
|
|
52
|
+
padding-top: var(--seed-dimension-x2);
|
|
53
|
+
padding-bottom: var(--seed-dimension-x2);
|
|
54
|
+
gap: var(--seed-dimension-x2);
|
|
55
|
+
flex-direction: column;
|
|
56
|
+
display: flex;
|
|
57
|
+
overflow-y: auto;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
.seed-menu__group {
|
|
61
|
+
flex-direction: column;
|
|
62
|
+
display: flex;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
.seed-menu__group + .seed-menu__group:before {
|
|
66
|
+
content: "";
|
|
67
|
+
margin-left: var(--seed-dimension-x4);
|
|
68
|
+
margin-right: var(--seed-dimension-x4);
|
|
69
|
+
margin-bottom: var(--seed-dimension-x2);
|
|
70
|
+
background-color: var(--seed-color-stroke-neutral-muted);
|
|
71
|
+
flex-shrink: 0;
|
|
72
|
+
height: 1px;
|
|
73
|
+
display: block;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
.seed-menu__groupLabel {
|
|
77
|
+
color: var(--seed-color-fg-neutral-subtle);
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.seed-menu__content--size_medium {
|
|
81
|
+
width: var(--seed-menu-reference-width, 240px);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.seed-menu__groupLabel--size_medium {
|
|
85
|
+
padding-top: var(--seed-dimension-x2_5);
|
|
86
|
+
padding-bottom: var(--seed-dimension-x2_5);
|
|
87
|
+
padding-left: var(--seed-dimension-x4);
|
|
88
|
+
padding-right: var(--seed-dimension-x4);
|
|
89
|
+
font-size: var(--seed-font-size-t4);
|
|
90
|
+
line-height: var(--seed-line-height-t4);
|
|
91
|
+
font-weight: var(--seed-font-weight-medium);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.seed-menu__content--size_small {
|
|
95
|
+
width: var(--seed-menu-reference-width, 200px);
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
.seed-menu__groupLabel--size_small {
|
|
99
|
+
padding-top: var(--seed-dimension-x2);
|
|
100
|
+
padding-bottom: var(--seed-dimension-x2);
|
|
101
|
+
padding-left: var(--seed-dimension-x4);
|
|
102
|
+
padding-right: var(--seed-dimension-x4);
|
|
103
|
+
font-size: var(--seed-font-size-t3);
|
|
104
|
+
line-height: var(--seed-line-height-t3);
|
|
105
|
+
font-weight: var(--seed-font-weight-regular);
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
.seed-menu__content--size_responsive {
|
|
109
|
+
width: var(--seed-menu-reference-width, 240px);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
@media (width >= 1280px) {
|
|
113
|
+
.seed-menu__content--size_responsive {
|
|
114
|
+
width: var(--seed-menu-reference-width, 200px);
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
.seed-menu__groupLabel--size_responsive {
|
|
119
|
+
padding-top: var(--seed-dimension-x2_5);
|
|
120
|
+
padding-bottom: var(--seed-dimension-x2_5);
|
|
121
|
+
padding-left: var(--seed-dimension-x4);
|
|
122
|
+
padding-right: var(--seed-dimension-x4);
|
|
123
|
+
font-size: var(--seed-font-size-t4);
|
|
124
|
+
line-height: var(--seed-line-height-t4);
|
|
125
|
+
font-weight: var(--seed-font-weight-medium);
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
@media (width >= 1280px) {
|
|
129
|
+
.seed-menu__groupLabel--size_responsive {
|
|
130
|
+
padding-top: var(--seed-dimension-x2);
|
|
131
|
+
padding-bottom: var(--seed-dimension-x2);
|
|
132
|
+
padding-left: var(--seed-dimension-x4);
|
|
133
|
+
padding-right: var(--seed-dimension-x4);
|
|
134
|
+
font-size: var(--seed-font-size-t3);
|
|
135
|
+
line-height: var(--seed-line-height-t3);
|
|
136
|
+
font-weight: var(--seed-font-weight-regular);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import './menu.layered.css';
|
|
2
|
+
import { createClassName, mergeVariants, splitVariantProps } from "./shared.mjs";
|
|
3
|
+
|
|
4
|
+
const menuSlotNames = [
|
|
5
|
+
[
|
|
6
|
+
"positioner",
|
|
7
|
+
"seed-menu__positioner"
|
|
8
|
+
],
|
|
9
|
+
[
|
|
10
|
+
"content",
|
|
11
|
+
"seed-menu__content"
|
|
12
|
+
],
|
|
13
|
+
[
|
|
14
|
+
"scrollArea",
|
|
15
|
+
"seed-menu__scrollArea"
|
|
16
|
+
],
|
|
17
|
+
[
|
|
18
|
+
"group",
|
|
19
|
+
"seed-menu__group"
|
|
20
|
+
],
|
|
21
|
+
[
|
|
22
|
+
"groupLabel",
|
|
23
|
+
"seed-menu__groupLabel"
|
|
24
|
+
]
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
const defaultVariant = {
|
|
28
|
+
"size": "medium"
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const compoundVariants = [];
|
|
32
|
+
|
|
33
|
+
export const menuVariantMap = {
|
|
34
|
+
"size": [
|
|
35
|
+
"medium",
|
|
36
|
+
"small",
|
|
37
|
+
"responsive"
|
|
38
|
+
]
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export const menuVariantKeys = Object.keys(menuVariantMap);
|
|
42
|
+
|
|
43
|
+
export function menu(props) {
|
|
44
|
+
return Object.fromEntries(
|
|
45
|
+
menuSlotNames.map(([slot, className]) => {
|
|
46
|
+
return [
|
|
47
|
+
slot,
|
|
48
|
+
createClassName(className, mergeVariants(defaultVariant, props), compoundVariants),
|
|
49
|
+
];
|
|
50
|
+
}),
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
Object.assign(menu, { splitVariantProps: (props) => splitVariantProps(props, menuVariantMap) });
|
|
55
|
+
|
|
56
|
+
// @recipe(seed): menu
|
package/recipes/menu.mjs
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import './menu.css';
|
|
2
|
+
import { createClassName, mergeVariants, splitVariantProps } from "./shared.mjs";
|
|
3
|
+
|
|
4
|
+
const menuSlotNames = [
|
|
5
|
+
[
|
|
6
|
+
"positioner",
|
|
7
|
+
"seed-menu__positioner"
|
|
8
|
+
],
|
|
9
|
+
[
|
|
10
|
+
"content",
|
|
11
|
+
"seed-menu__content"
|
|
12
|
+
],
|
|
13
|
+
[
|
|
14
|
+
"scrollArea",
|
|
15
|
+
"seed-menu__scrollArea"
|
|
16
|
+
],
|
|
17
|
+
[
|
|
18
|
+
"group",
|
|
19
|
+
"seed-menu__group"
|
|
20
|
+
],
|
|
21
|
+
[
|
|
22
|
+
"groupLabel",
|
|
23
|
+
"seed-menu__groupLabel"
|
|
24
|
+
]
|
|
25
|
+
];
|
|
26
|
+
|
|
27
|
+
const defaultVariant = {
|
|
28
|
+
"size": "medium"
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
const compoundVariants = [];
|
|
32
|
+
|
|
33
|
+
export const menuVariantMap = {
|
|
34
|
+
"size": [
|
|
35
|
+
"medium",
|
|
36
|
+
"small",
|
|
37
|
+
"responsive"
|
|
38
|
+
]
|
|
39
|
+
};
|
|
40
|
+
|
|
41
|
+
export const menuVariantKeys = Object.keys(menuVariantMap);
|
|
42
|
+
|
|
43
|
+
export function menu(props) {
|
|
44
|
+
return Object.fromEntries(
|
|
45
|
+
menuSlotNames.map(([slot, className]) => {
|
|
46
|
+
return [
|
|
47
|
+
slot,
|
|
48
|
+
createClassName(className, mergeVariants(defaultVariant, props), compoundVariants),
|
|
49
|
+
];
|
|
50
|
+
}),
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
Object.assign(menu, { splitVariantProps: (props) => splitVariantProps(props, menuVariantMap) });
|
|
55
|
+
|
|
56
|
+
// @recipe(seed): menu
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
declare interface NotificationBadgeVariant {
|
|
2
2
|
/**
|
|
3
|
+
* - `small`: 간결한 도트 형태로, 텍스트 없이 상태 변화만 표시합니다. 알림의 존재 여부만 중요하거나 공간이 제한된 경우에 적합합니다. 내부 라벨은 지원하지 않습니다.
|
|
4
|
+
* - `large`: 라벨을 포함해 구체적인 알림 수나 상태 정보를 제공합니다. 세부 정보가 중요하고 충분한 공간이 있을 때 사용합니다. 내부 라벨을 반드시 포함해야 합니다.
|
|
5
|
+
*
|
|
3
6
|
* @default "large"
|
|
4
7
|
*/
|
|
5
8
|
size: "small" | "large";
|
package/recipes/page-banner.d.ts
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
declare interface PageBannerVariant {
|
|
2
2
|
/**
|
|
3
|
+
* - `weak`: 배경색이 연한 스타일입니다.
|
|
4
|
+
* - `solid`: 배경색이 진한 스타일입니다.
|
|
5
|
+
*
|
|
3
6
|
* @default "weak"
|
|
4
7
|
*/
|
|
5
8
|
variant: "weak" | "solid";
|
|
6
9
|
/**
|
|
10
|
+
* - `magic`: AI 기능을 나타냅니다. variant=solid와 조합하여 사용하지 않습니다.
|
|
11
|
+
*
|
|
7
12
|
* @default "neutral"
|
|
8
13
|
*/
|
|
9
14
|
tone: "neutral" | "informative" | "positive" | "warning" | "critical" | "magic";
|
|
@@ -1,9 +1,16 @@
|
|
|
1
1
|
declare interface ProgressCircleVariant {
|
|
2
2
|
/**
|
|
3
|
+
* - `neutral`: 가장 보편적으로 사용되며 스타일보다는 로딩 상태의 인식이 더 중요한 경우 사용합니다.
|
|
4
|
+
* - `brand`: 사용자 경험의 초기 단계에서 브랜드 컬러를 통해 주요 전환점을 강조할 때 사용합니다.
|
|
5
|
+
* - `staticWhite`: 화면 전체를 어둡게 덮는 오버레이(Overlay) 위에 로딩 상태를 표시할 때 사용합니다.
|
|
6
|
+
*
|
|
3
7
|
* @default "neutral"
|
|
4
8
|
*/
|
|
5
9
|
tone: "neutral" | "brand" | "staticWhite" | "inherit";
|
|
6
10
|
/**
|
|
11
|
+
* - `24`: 특정 요소 안에서 사용하는 경우 사용합니다.
|
|
12
|
+
* - `40`: 주로 전체 페이지 로딩에 사용합니다.
|
|
13
|
+
*
|
|
7
14
|
* @default 40
|
|
8
15
|
*/
|
|
9
16
|
size: "24" | "40" | "inherit";
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
.seed-
|
|
1
|
+
.seed-select-box-checkmark__root {
|
|
2
2
|
position: relative;
|
|
3
3
|
box-sizing: border-box;
|
|
4
4
|
flex: none;
|
|
5
5
|
width: var(--seed-dimension-x5);
|
|
6
6
|
height: var(--seed-dimension-x5);
|
|
7
7
|
}
|
|
8
|
-
.seed-
|
|
8
|
+
.seed-select-box-checkmark__icon {
|
|
9
9
|
display: block;
|
|
10
10
|
position: absolute;
|
|
11
11
|
margin: auto;
|
|
@@ -21,18 +21,18 @@
|
|
|
21
21
|
transition: color var(--seed-duration-color-transition) var(--seed-timing-function-easing);
|
|
22
22
|
}
|
|
23
23
|
@media (hover: hover) and (pointer: fine) {
|
|
24
|
-
.seed-
|
|
24
|
+
.seed-select-box-checkmark__icon:not(:is(:disabled, [disabled], [data-disabled])):is(:hover, [data-hover]) {
|
|
25
25
|
color: var(--seed-color-fg-neutral-subtle);
|
|
26
26
|
}
|
|
27
27
|
}
|
|
28
28
|
@media not all and (hover: hover) and (pointer: fine) {
|
|
29
|
-
.seed-
|
|
29
|
+
.seed-select-box-checkmark__icon:not(:is(:disabled, [disabled], [data-disabled])):is(:active, [data-active]) {
|
|
30
30
|
color: var(--seed-color-fg-neutral-subtle);
|
|
31
31
|
}
|
|
32
32
|
}
|
|
33
|
-
.seed-
|
|
33
|
+
.seed-select-box-checkmark__icon:not(:is(:disabled, [disabled], [data-disabled])):is(:checked, [data-checked]) {
|
|
34
34
|
color: var(--seed-color-fg-neutral);
|
|
35
35
|
}
|
|
36
|
-
.seed-
|
|
36
|
+
.seed-select-box-checkmark__icon:is(:disabled, [disabled], [data-disabled]) {
|
|
37
37
|
color: var(--seed-color-fg-disabled);
|
|
38
38
|
}
|