@seed-design/css 1.2.16 → 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.
Files changed (183) hide show
  1. package/all.css +4956 -1925
  2. package/all.layered.css +5922 -2883
  3. package/all.layered.min.css +1 -1
  4. package/all.min.css +1 -1
  5. package/base.css +348 -35
  6. package/base.layered.css +348 -35
  7. package/base.layered.min.css +1 -1
  8. package/base.min.css +1 -1
  9. package/breakpoints/index.d.ts +7 -0
  10. package/breakpoints/index.mjs +17 -0
  11. package/package.json +6 -1
  12. package/recipes/accordion.css +268 -0
  13. package/recipes/accordion.d.ts +33 -0
  14. package/recipes/accordion.layered.css +308 -0
  15. package/recipes/accordion.layered.mjs +94 -0
  16. package/recipes/accordion.mjs +94 -0
  17. package/recipes/action-button.css +56 -4
  18. package/recipes/action-button.d.ts +16 -0
  19. package/recipes/action-button.layered.css +60 -4
  20. package/recipes/app-bar.css +0 -3
  21. package/recipes/app-bar.d.ts +0 -4
  22. package/recipes/app-bar.layered.css +0 -4
  23. package/recipes/app-bar.layered.mjs +1 -5
  24. package/recipes/app-bar.mjs +1 -5
  25. package/recipes/app-screen.css +3 -0
  26. package/recipes/app-screen.layered.css +4 -0
  27. package/recipes/attachment-input-item.css +275 -0
  28. package/recipes/attachment-input-item.d.ts +24 -0
  29. package/recipes/attachment-input-item.layered.css +288 -0
  30. package/recipes/attachment-input-item.layered.mjs +79 -0
  31. package/recipes/attachment-input-item.mjs +79 -0
  32. package/recipes/attachment-input-trigger.css +71 -0
  33. package/recipes/attachment-input-trigger.d.ts +21 -0
  34. package/recipes/attachment-input-trigger.layered.css +85 -0
  35. package/recipes/attachment-input-trigger.layered.mjs +48 -0
  36. package/recipes/attachment-input-trigger.mjs +48 -0
  37. package/recipes/attachment-input.css +55 -0
  38. package/recipes/attachment-input.d.ts +21 -0
  39. package/recipes/attachment-input.layered.css +64 -0
  40. package/recipes/attachment-input.layered.mjs +48 -0
  41. package/recipes/attachment-input.mjs +48 -0
  42. package/recipes/avatar.d.ts +9 -0
  43. package/recipes/badge.d.ts +10 -0
  44. package/recipes/bottom-sheet.css +62 -5
  45. package/recipes/bottom-sheet.layered.css +67 -5
  46. package/recipes/callout.d.ts +7 -0
  47. package/recipes/checkmark.d.ts +3 -0
  48. package/recipes/chip-tabs.css +8 -52
  49. package/recipes/chip-tabs.d.ts +1 -1
  50. package/recipes/chip-tabs.layered.css +8 -62
  51. package/recipes/chip-tabs.layered.mjs +1 -2
  52. package/recipes/chip-tabs.mjs +1 -2
  53. package/recipes/chip.d.ts +4 -0
  54. package/recipes/contextual-floating-button.d.ts +6 -0
  55. package/recipes/dialog.css +14 -11
  56. package/recipes/dialog.layered.css +4 -0
  57. package/recipes/footer.css +44 -0
  58. package/recipes/footer.d.ts +24 -0
  59. package/recipes/footer.layered.css +52 -0
  60. package/recipes/footer.layered.mjs +39 -0
  61. package/recipes/footer.mjs +39 -0
  62. package/recipes/help-bubble.css +29 -1
  63. package/recipes/help-bubble.layered.css +34 -1
  64. package/recipes/image-frame.css +0 -3
  65. package/recipes/image-frame.d.ts +0 -4
  66. package/recipes/image-frame.layered.css +0 -4
  67. package/recipes/image-frame.layered.mjs +1 -6
  68. package/recipes/image-frame.mjs +1 -6
  69. package/recipes/input-button.css +176 -20
  70. package/recipes/input-button.d.ts +8 -1
  71. package/recipes/input-button.layered.css +197 -21
  72. package/recipes/input-button.layered.mjs +10 -2
  73. package/recipes/input-button.mjs +10 -2
  74. package/recipes/layout.css +25 -0
  75. package/recipes/layout.d.ts +24 -0
  76. package/recipes/layout.layered.css +25 -0
  77. package/recipes/layout.layered.mjs +44 -0
  78. package/recipes/layout.mjs +44 -0
  79. package/recipes/list-item.css +72 -4
  80. package/recipes/list-item.layered.css +84 -4
  81. package/recipes/menu-item.css +174 -0
  82. package/recipes/menu-item.d.ts +35 -0
  83. package/recipes/menu-item.layered.css +200 -0
  84. package/recipes/menu-item.layered.mjs +57 -0
  85. package/recipes/menu-item.mjs +57 -0
  86. package/recipes/menu-sheet-item.d.ts +6 -0
  87. package/recipes/menu-sheet.css +19 -1
  88. package/recipes/menu-sheet.layered.css +22 -1
  89. package/recipes/menu.css +119 -0
  90. package/recipes/menu.d.ts +28 -0
  91. package/recipes/menu.layered.css +139 -0
  92. package/recipes/menu.layered.mjs +56 -0
  93. package/recipes/menu.mjs +56 -0
  94. package/recipes/notification-badge.d.ts +3 -0
  95. package/recipes/page-banner.d.ts +5 -0
  96. package/recipes/progress-circle.d.ts +7 -0
  97. package/recipes/{selectBoxCheckmark.css → select-box-checkmark.css} +6 -6
  98. package/recipes/{selectBoxCheckmark.layered.css → select-box-checkmark.layered.css} +6 -6
  99. package/recipes/{selectBoxCheckmark.layered.mjs → select-box-checkmark.layered.mjs} +4 -4
  100. package/recipes/{selectBoxCheckmark.mjs → select-box-checkmark.mjs} +4 -4
  101. package/recipes/side-navigation-inset.css +4 -0
  102. package/recipes/side-navigation-inset.d.ts +19 -0
  103. package/recipes/side-navigation-inset.layered.css +6 -0
  104. package/recipes/side-navigation-inset.layered.mjs +22 -0
  105. package/recipes/side-navigation-inset.mjs +22 -0
  106. package/recipes/side-navigation-menu-item.css +135 -0
  107. package/recipes/side-navigation-menu-item.d.ts +21 -0
  108. package/recipes/side-navigation-menu-item.layered.css +156 -0
  109. package/recipes/side-navigation-menu-item.layered.mjs +48 -0
  110. package/recipes/side-navigation-menu-item.mjs +48 -0
  111. package/recipes/side-navigation.css +115 -0
  112. package/recipes/side-navigation.d.ts +24 -0
  113. package/recipes/side-navigation.layered.css +132 -0
  114. package/recipes/side-navigation.layered.mjs +63 -0
  115. package/recipes/side-navigation.mjs +63 -0
  116. package/recipes/side-panel.css +327 -0
  117. package/recipes/side-panel.d.ts +24 -0
  118. package/recipes/side-panel.layered.css +361 -0
  119. package/recipes/side-panel.layered.mjs +72 -0
  120. package/recipes/side-panel.mjs +72 -0
  121. package/recipes/skeleton.css +36 -2
  122. package/recipes/skeleton.d.ts +8 -0
  123. package/recipes/skeleton.layered.css +40 -2
  124. package/recipes/text-input.css +323 -52
  125. package/recipes/text-input.d.ts +8 -1
  126. package/recipes/text-input.layered.css +385 -51
  127. package/recipes/text-input.layered.mjs +18 -1
  128. package/recipes/text-input.mjs +18 -1
  129. package/recipes/text.css +180 -0
  130. package/recipes/text.d.ts +59 -1
  131. package/recipes/text.layered.css +216 -0
  132. package/recipes/text.layered.mjs +37 -1
  133. package/recipes/text.mjs +37 -1
  134. package/recipes/toggle-button.d.ts +3 -0
  135. package/vars/color/bg.d.ts +2 -2
  136. package/vars/color/bg.mjs +2 -1
  137. package/vars/color/stroke.d.ts +2 -2
  138. package/vars/color/stroke.mjs +2 -2
  139. package/vars/component/accordion-item.d.ts +132 -0
  140. package/vars/component/accordion-item.mjs +126 -0
  141. package/vars/component/accordion.d.ts +22 -0
  142. package/vars/component/accordion.mjs +16 -0
  143. package/vars/component/attachment-input-dropzone.d.ts +32 -0
  144. package/vars/component/attachment-input-dropzone.mjs +30 -0
  145. package/vars/component/attachment-input-item-action-button.d.ts +37 -0
  146. package/vars/component/attachment-input-item-action-button.mjs +37 -0
  147. package/vars/component/attachment-input-item-remove-button.d.ts +28 -0
  148. package/vars/component/attachment-input-item-remove-button.mjs +28 -0
  149. package/vars/component/attachment-input-item.d.ts +103 -0
  150. package/vars/component/attachment-input-item.mjs +102 -0
  151. package/vars/component/attachment-input-trigger.d.ts +46 -0
  152. package/vars/component/attachment-input-trigger.mjs +46 -0
  153. package/vars/component/attachment-input.d.ts +14 -0
  154. package/vars/component/attachment-input.mjs +12 -0
  155. package/vars/component/chip-tablist.d.ts +0 -7
  156. package/vars/component/chip-tablist.mjs +0 -7
  157. package/vars/component/image-frame.d.ts +1 -22
  158. package/vars/component/image-frame.mjs +1 -9
  159. package/vars/component/index.d.ts +12 -1
  160. package/vars/component/index.mjs +12 -1
  161. package/vars/component/input-button.d.ts +90 -17
  162. package/vars/component/input-button.mjs +84 -17
  163. package/vars/component/menu-item.d.ts +129 -0
  164. package/vars/component/menu-item.mjs +117 -0
  165. package/vars/component/menu.d.ts +68 -0
  166. package/vars/component/menu.mjs +60 -0
  167. package/vars/component/side-panel-close-button.d.ts +23 -0
  168. package/vars/component/side-panel-close-button.mjs +23 -0
  169. package/vars/component/side-panel.d.ts +94 -0
  170. package/vars/component/side-panel.mjs +83 -0
  171. package/vars/component/text-input.d.ts +92 -24
  172. package/vars/component/text-input.mjs +76 -24
  173. package/vars/component/typography.d.ts +414 -0
  174. package/vars/component/typography.mjs +324 -0
  175. package/vars/font-size.d.ts +17 -1
  176. package/vars/font-size.mjs +9 -1
  177. package/vars/gradient.d.ts +0 -8
  178. package/vars/gradient.mjs +0 -2
  179. package/vars/line-height.d.ts +17 -1
  180. package/vars/line-height.mjs +9 -1
  181. package/vars/component/chip-tab.d.ts +0 -162
  182. package/vars/component/chip-tab.mjs +0 -162
  183. /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";
@@ -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;
@@ -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
@@ -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";
@@ -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-selectBoxCheckmark__root {
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-selectBoxCheckmark__icon {
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-selectBoxCheckmark__icon:not(:is(:disabled, [disabled], [data-disabled])):is(:hover, [data-hover]) {
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-selectBoxCheckmark__icon:not(:is(:disabled, [disabled], [data-disabled])):is(:active, [data-active]) {
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-selectBoxCheckmark__icon:not(:is(:disabled, [disabled], [data-disabled])):is(:checked, [data-checked]) {
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-selectBoxCheckmark__icon:is(:disabled, [disabled], [data-disabled]) {
36
+ .seed-select-box-checkmark__icon:is(:disabled, [disabled], [data-disabled]) {
37
37
  color: var(--seed-color-fg-disabled);
38
38
  }