@mzc-fe/design-system 0.0.1-rc.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 (160) hide show
  1. package/.husky/pre-push +21 -0
  2. package/.storybook/main.ts +11 -0
  3. package/.storybook/preview.tsx +30 -0
  4. package/.vscode/settings.json +12 -0
  5. package/.vscode/tailwind.json +105 -0
  6. package/README.md +136 -0
  7. package/bitbucket-pipelines.yml +52 -0
  8. package/components.json +21 -0
  9. package/eslint.config.js +38 -0
  10. package/package.json +98 -0
  11. package/public/vite.svg +1 -0
  12. package/src/components/accordion.stories.tsx +258 -0
  13. package/src/components/accordion.test.tsx +390 -0
  14. package/src/components/accordion.tsx +64 -0
  15. package/src/components/alert-dialog.stories.tsx +213 -0
  16. package/src/components/alert-dialog.test.tsx +80 -0
  17. package/src/components/alert-dialog.tsx +155 -0
  18. package/src/components/alert.stories.tsx +84 -0
  19. package/src/components/alert.test.tsx +35 -0
  20. package/src/components/alert.tsx +66 -0
  21. package/src/components/aspect-ratio.stories.tsx +97 -0
  22. package/src/components/aspect-ratio.test.tsx +47 -0
  23. package/src/components/aspect-ratio.tsx +11 -0
  24. package/src/components/avatar.stories.tsx +76 -0
  25. package/src/components/avatar.test.tsx +50 -0
  26. package/src/components/avatar.tsx +51 -0
  27. package/src/components/badge.stories.tsx +64 -0
  28. package/src/components/badge.test.tsx +34 -0
  29. package/src/components/badge.tsx +46 -0
  30. package/src/components/breadcrumb.stories.tsx +86 -0
  31. package/src/components/breadcrumb.test.tsx +74 -0
  32. package/src/components/breadcrumb.tsx +109 -0
  33. package/src/components/button-group.stories.tsx +62 -0
  34. package/src/components/button-group.tsx +83 -0
  35. package/src/components/button.stories.tsx +118 -0
  36. package/src/components/button.test.tsx +64 -0
  37. package/src/components/button.tsx +62 -0
  38. package/src/components/calendar.stories.tsx +81 -0
  39. package/src/components/calendar.tsx +220 -0
  40. package/src/components/card.stories.tsx +110 -0
  41. package/src/components/card.test.tsx +56 -0
  42. package/src/components/card.tsx +92 -0
  43. package/src/components/carousel.stories.tsx +90 -0
  44. package/src/components/carousel.tsx +239 -0
  45. package/src/components/chart.tsx +357 -0
  46. package/src/components/checkbox.stories.tsx +108 -0
  47. package/src/components/checkbox.test.tsx +67 -0
  48. package/src/components/checkbox.tsx +32 -0
  49. package/src/components/collapsible.stories.tsx +106 -0
  50. package/src/components/collapsible.test.tsx +92 -0
  51. package/src/components/collapsible.tsx +31 -0
  52. package/src/components/command.stories.tsx +90 -0
  53. package/src/components/command.tsx +182 -0
  54. package/src/components/context-menu.stories.tsx +63 -0
  55. package/src/components/context-menu.tsx +252 -0
  56. package/src/components/dialog.stories.tsx +128 -0
  57. package/src/components/dialog.tsx +141 -0
  58. package/src/components/drawer.stories.tsx +104 -0
  59. package/src/components/drawer.tsx +135 -0
  60. package/src/components/dropdown-menu.stories.tsx +97 -0
  61. package/src/components/dropdown-menu.tsx +255 -0
  62. package/src/components/empty.stories.tsx +90 -0
  63. package/src/components/empty.test.tsx +55 -0
  64. package/src/components/empty.tsx +104 -0
  65. package/src/components/field.tsx +246 -0
  66. package/src/components/form.tsx +168 -0
  67. package/src/components/hover-card.stories.tsx +66 -0
  68. package/src/components/hover-card.tsx +44 -0
  69. package/src/components/input-group.stories.tsx +57 -0
  70. package/src/components/input-group.test.tsx +40 -0
  71. package/src/components/input-group.tsx +170 -0
  72. package/src/components/input-otp.stories.tsx +94 -0
  73. package/src/components/input-otp.test.tsx +60 -0
  74. package/src/components/input-otp.tsx +75 -0
  75. package/src/components/input.stories.tsx +94 -0
  76. package/src/components/input.test.tsx +53 -0
  77. package/src/components/input.tsx +21 -0
  78. package/src/components/item.tsx +193 -0
  79. package/src/components/kbd.stories.tsx +100 -0
  80. package/src/components/kbd.test.tsx +28 -0
  81. package/src/components/kbd.tsx +28 -0
  82. package/src/components/label.stories.tsx +48 -0
  83. package/src/components/label.test.tsx +28 -0
  84. package/src/components/label.tsx +24 -0
  85. package/src/components/menubar.tsx +274 -0
  86. package/src/components/navigation-menu.tsx +168 -0
  87. package/src/components/pagination.stories.tsx +107 -0
  88. package/src/components/pagination.tsx +127 -0
  89. package/src/components/popover.stories.tsx +102 -0
  90. package/src/components/popover.tsx +48 -0
  91. package/src/components/progress.stories.tsx +76 -0
  92. package/src/components/progress.test.tsx +36 -0
  93. package/src/components/progress.tsx +29 -0
  94. package/src/components/radio-group.stories.tsx +73 -0
  95. package/src/components/radio-group.test.tsx +74 -0
  96. package/src/components/radio-group.tsx +45 -0
  97. package/src/components/resizable.stories.tsx +120 -0
  98. package/src/components/resizable.tsx +54 -0
  99. package/src/components/scroll-area.stories.tsx +64 -0
  100. package/src/components/scroll-area.test.tsx +46 -0
  101. package/src/components/scroll-area.tsx +58 -0
  102. package/src/components/select.stories.tsx +111 -0
  103. package/src/components/select.test.tsx +90 -0
  104. package/src/components/select.tsx +188 -0
  105. package/src/components/separator.stories.tsx +76 -0
  106. package/src/components/separator.test.tsx +24 -0
  107. package/src/components/separator.tsx +28 -0
  108. package/src/components/sheet.stories.tsx +122 -0
  109. package/src/components/sheet.tsx +137 -0
  110. package/src/components/sidebar.tsx +726 -0
  111. package/src/components/skeleton.stories.tsx +53 -0
  112. package/src/components/skeleton.test.tsx +24 -0
  113. package/src/components/skeleton.tsx +13 -0
  114. package/src/components/slider.stories.tsx +97 -0
  115. package/src/components/slider.test.tsx +49 -0
  116. package/src/components/slider.tsx +63 -0
  117. package/src/components/sonner.stories.tsx +96 -0
  118. package/src/components/sonner.tsx +38 -0
  119. package/src/components/spinner.stories.tsx +54 -0
  120. package/src/components/spinner.test.tsx +30 -0
  121. package/src/components/spinner.tsx +16 -0
  122. package/src/components/switch.stories.tsx +108 -0
  123. package/src/components/switch.test.tsx +62 -0
  124. package/src/components/switch.tsx +31 -0
  125. package/src/components/table.stories.tsx +139 -0
  126. package/src/components/table.test.tsx +85 -0
  127. package/src/components/table.tsx +114 -0
  128. package/src/components/tabs.stories.tsx +99 -0
  129. package/src/components/tabs.test.tsx +64 -0
  130. package/src/components/tabs.tsx +66 -0
  131. package/src/components/textarea.stories.tsx +89 -0
  132. package/src/components/textarea.test.tsx +53 -0
  133. package/src/components/textarea.tsx +18 -0
  134. package/src/components/toggle-group.stories.tsx +108 -0
  135. package/src/components/toggle-group.test.tsx +66 -0
  136. package/src/components/toggle-group.tsx +81 -0
  137. package/src/components/toggle.stories.tsx +98 -0
  138. package/src/components/toggle.test.tsx +42 -0
  139. package/src/components/toggle.tsx +45 -0
  140. package/src/components/tooltip.stories.tsx +111 -0
  141. package/src/components/tooltip.tsx +61 -0
  142. package/src/foundations/README.md +141 -0
  143. package/src/foundations/ThemeProvider.tsx +77 -0
  144. package/src/foundations/color.css +232 -0
  145. package/src/foundations/color.stories.tsx +719 -0
  146. package/src/foundations/palette.css +249 -0
  147. package/src/foundations/spacing.css +8 -0
  148. package/src/foundations/typography.css +143 -0
  149. package/src/foundations/typography.stories.tsx +17 -0
  150. package/src/hooks/use-mobile.ts +19 -0
  151. package/src/index.css +176 -0
  152. package/src/index.ts +336 -0
  153. package/src/lib/utils.ts +6 -0
  154. package/src/test/setup.ts +8 -0
  155. package/src/vite-env.d.ts +1 -0
  156. package/tsconfig.app.json +33 -0
  157. package/tsconfig.json +13 -0
  158. package/tsconfig.node.json +25 -0
  159. package/vite.config.ts +30 -0
  160. package/vitest.config.ts +25 -0
@@ -0,0 +1,111 @@
1
+ import type { Meta, StoryObj } from "@storybook/react-vite";
2
+ import { Tooltip, TooltipContent, TooltipTrigger } from "./tooltip";
3
+ import { Button } from "./button";
4
+
5
+ const meta = {
6
+ title: "Components/Tooltip",
7
+ component: Tooltip,
8
+ parameters: {
9
+ layout: "padded",
10
+ },
11
+ tags: ["autodocs"],
12
+ } satisfies Meta<typeof Tooltip>;
13
+
14
+ export default meta;
15
+ type Story = StoryObj<typeof meta>;
16
+
17
+ export const Default: Story = {
18
+ render: () => (
19
+ <Tooltip>
20
+ <TooltipTrigger asChild>
21
+ <Button variant="outline">Hover me</Button>
22
+ </TooltipTrigger>
23
+ <TooltipContent>
24
+ <p>This is a tooltip</p>
25
+ </TooltipContent>
26
+ </Tooltip>
27
+ ),
28
+ };
29
+
30
+ export const Multiple: Story = {
31
+ render: () => (
32
+ <div className="flex gap-4">
33
+ <Tooltip>
34
+ <TooltipTrigger asChild>
35
+ <Button variant="outline">Top</Button>
36
+ </TooltipTrigger>
37
+ <TooltipContent side="top">
38
+ <p>Tooltip on top</p>
39
+ </TooltipContent>
40
+ </Tooltip>
41
+ <Tooltip>
42
+ <TooltipTrigger asChild>
43
+ <Button variant="outline">Right</Button>
44
+ </TooltipTrigger>
45
+ <TooltipContent side="right">
46
+ <p>Tooltip on right</p>
47
+ </TooltipContent>
48
+ </Tooltip>
49
+ <Tooltip>
50
+ <TooltipTrigger asChild>
51
+ <Button variant="outline">Bottom</Button>
52
+ </TooltipTrigger>
53
+ <TooltipContent side="bottom">
54
+ <p>Tooltip on bottom</p>
55
+ </TooltipContent>
56
+ </Tooltip>
57
+ <Tooltip>
58
+ <TooltipTrigger asChild>
59
+ <Button variant="outline">Left</Button>
60
+ </TooltipTrigger>
61
+ <TooltipContent side="left">
62
+ <p>Tooltip on left</p>
63
+ </TooltipContent>
64
+ </Tooltip>
65
+ </div>
66
+ ),
67
+ };
68
+
69
+ export const LongContent: Story = {
70
+ render: () => (
71
+ <Tooltip>
72
+ <TooltipTrigger asChild>
73
+ <Button variant="outline">Hover for details</Button>
74
+ </TooltipTrigger>
75
+ <TooltipContent className="max-w-xs">
76
+ <p>
77
+ This is a longer tooltip that contains more information and
78
+ demonstrates how the tooltip handles extended text content.
79
+ </p>
80
+ </TooltipContent>
81
+ </Tooltip>
82
+ ),
83
+ };
84
+
85
+ export const WithIcon: Story = {
86
+ render: () => (
87
+ <div className="flex gap-4">
88
+ <Tooltip>
89
+ <TooltipTrigger asChild>
90
+ <button className="rounded-full border p-2">
91
+ <span className="sr-only">Info</span>
92
+ ℹ️
93
+ </button>
94
+ </TooltipTrigger>
95
+ <TooltipContent>
96
+ <p>Click for more information</p>
97
+ </TooltipContent>
98
+ </Tooltip>
99
+ <Tooltip>
100
+ <TooltipTrigger asChild>
101
+ <button className="rounded-full border p-2">
102
+ <span className="sr-only">Help</span>❓
103
+ </button>
104
+ </TooltipTrigger>
105
+ <TooltipContent>
106
+ <p>Get help</p>
107
+ </TooltipContent>
108
+ </Tooltip>
109
+ </div>
110
+ ),
111
+ };
@@ -0,0 +1,61 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import * as TooltipPrimitive from "@radix-ui/react-tooltip"
5
+
6
+ import { cn } from "@/lib/utils"
7
+
8
+ function TooltipProvider({
9
+ delayDuration = 0,
10
+ ...props
11
+ }: React.ComponentProps<typeof TooltipPrimitive.Provider>) {
12
+ return (
13
+ <TooltipPrimitive.Provider
14
+ data-slot="tooltip-provider"
15
+ delayDuration={delayDuration}
16
+ {...props}
17
+ />
18
+ )
19
+ }
20
+
21
+ function Tooltip({
22
+ ...props
23
+ }: React.ComponentProps<typeof TooltipPrimitive.Root>) {
24
+ return (
25
+ <TooltipProvider>
26
+ <TooltipPrimitive.Root data-slot="tooltip" {...props} />
27
+ </TooltipProvider>
28
+ )
29
+ }
30
+
31
+ function TooltipTrigger({
32
+ ...props
33
+ }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {
34
+ return <TooltipPrimitive.Trigger data-slot="tooltip-trigger" {...props} />
35
+ }
36
+
37
+ function TooltipContent({
38
+ className,
39
+ sideOffset = 0,
40
+ children,
41
+ ...props
42
+ }: React.ComponentProps<typeof TooltipPrimitive.Content>) {
43
+ return (
44
+ <TooltipPrimitive.Portal>
45
+ <TooltipPrimitive.Content
46
+ data-slot="tooltip-content"
47
+ sideOffset={sideOffset}
48
+ className={cn(
49
+ "bg-foreground text-background animate-in fade-in-0 zoom-in-95 data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 z-50 w-fit origin-(--radix-tooltip-content-transform-origin) rounded-md px-3 py-1.5 text-xs text-balance",
50
+ className
51
+ )}
52
+ {...props}
53
+ >
54
+ {children}
55
+ <TooltipPrimitive.Arrow className="bg-foreground fill-foreground z-50 size-2.5 translate-y-[calc(-50%_-_2px)] rotate-45 rounded-[2px]" />
56
+ </TooltipPrimitive.Content>
57
+ </TooltipPrimitive.Portal>
58
+ )
59
+ }
60
+
61
+ export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider }
@@ -0,0 +1,141 @@
1
+ # ~~Foundations~~ (deprecated)
2
+
3
+ ~~이 폴더는 MZC 디자인 시스템의 기본 토큰들을 정의하는 CSS 파일들을 포함합니다. `@theme inline`과 `@utility` 지시어를 활용하여 Tailwind CSS와 완전히 통합된 디자인 시스템을 제공합니다.~~
4
+
5
+ 토큰을 직접 정의하는 것에서 shadcn의 토큰(tailwind 토큰)을 재사용하는 것으로 바뀌었고, 아래 내용들은 참고용으로 남겨둡니다.
6
+
7
+ ## 파일 구조
8
+
9
+ ### 🎨 color.css
10
+
11
+ 컬러 토큰과 테마 변수를 정의합니다.
12
+
13
+ - **토큰 매핑**: `@theme inline`을 통해 CSS 변수를 Tailwind 클래스에 매핑
14
+ - **자동 클래스 생성**: `--background-color-*`, `--text-color-*` 패턴으로 `bg-*`, `text-*` 클래스 자동 생성
15
+ - **테마 지원**: `:root`(라이트 모드)와 `.dark`(다크 모드)에서 각각 색상 정의
16
+
17
+ ```css
18
+ /* 사용 예시 */
19
+ <p className="bg-main text-main ...">Lorem ipsum</p>
20
+ ```
21
+
22
+ ### ✍️ typography.css
23
+
24
+ 타이포그래피 관련 유틸리티 클래스를 정의합니다.
25
+
26
+ - **유틸리티 클래스**: `@utility`를 사용하여 재사용 가능한 타이포그래피 스타일 정의
27
+ - **폰트 패밀리**: Pretendard 폰트 사용
28
+ - **일관된 명명**: `font-{type}-{weight}` 패턴으로 체계적인 명명 규칙
29
+
30
+ ```css
31
+ /* 사용 예시 */
32
+ <h1 className="font-h1-700">제목</h1>
33
+ <p className="font-subtitle1-700">부제목</p>
34
+ ```
35
+
36
+ ### 📏 spacing.css
37
+
38
+ 간격(spacing) 토큰을 정의합니다.
39
+
40
+ - **기본 단위**: 4px 기준의 일관된 간격 시스템
41
+ - **Tailwind 통합**: `p-2` → `padding: 8px` 자동 변환
42
+ - **토큰 매핑**: `@theme inline`을 통해 spacing 변수를 토큰에 매핑
43
+
44
+ ```css
45
+ /* 사용 예시 */
46
+ .spaced-element {
47
+ padding: var(--spacing); /* 4px */
48
+ }
49
+
50
+ /* Tailwind 클래스로 사용 */
51
+ <div className="p-2">내용</div> /* padding: 8px */
52
+ ```
53
+
54
+ ## 사용 방법
55
+
56
+ ### 1. CSS 파일 import
57
+
58
+ ```css
59
+ /* 메인 스타일시트에서 import */
60
+ @import "./foundations/color.css";
61
+ @import "./foundations/spacing.css";
62
+ @import "./foundations/typography.css";
63
+ ```
64
+
65
+ ### 2. 컴포넌트에서 활용
66
+
67
+ ```tsx
68
+ // Tailwind 클래스로 사용
69
+ <div className="bg-main text-main p-2">
70
+ <h1 className="font-h1-700">제목</h1>
71
+ <p className="font-subtitle1-700">부제목</p>
72
+ </div>
73
+
74
+ // CSS 변수로 직접 사용
75
+ <div style={{
76
+ backgroundColor: 'var(--background-color-main)',
77
+ color: 'var(--text-color-main)',
78
+ padding: 'var(--spacing)'
79
+ }}>
80
+ 커스텀 스타일
81
+ </div>
82
+ ```
83
+
84
+ ### 3. 테마 전환
85
+
86
+ ```tsx
87
+ import { ThemeProvider } from "../ThemeProvider";
88
+
89
+ function App() {
90
+ return (
91
+ <ThemeProvider defaultTheme="light">{/* 앱 컴포넌트들 */}</ThemeProvider>
92
+ );
93
+ }
94
+ ```
95
+
96
+ ## 현재 정의된 토큰
97
+
98
+ ## 확장 방법
99
+
100
+ 새로운 토큰을 추가할 때는 다음 단계를 따르세요:
101
+
102
+ ### 1. 색상 토큰 추가
103
+
104
+ ```css
105
+ /* color.css */
106
+ :root {
107
+ --new-color: #your-color;
108
+ }
109
+
110
+ .dark {
111
+ --new-color: #your-dark-color;
112
+ }
113
+
114
+ @theme inline {
115
+ --color-new: var(--new-color);
116
+ --background-color-new: var(--new-color);
117
+ --text-color-new: var(--new-color);
118
+ }
119
+ ```
120
+
121
+ ### 2. 간격 토큰 추가
122
+
123
+ ```css
124
+ /* spacing.css */
125
+ @theme inline {
126
+ --spacing-xl: 32px;
127
+ --spacing-2xl: 48px;
128
+ }
129
+ ```
130
+
131
+ ### 3. 타이포그래피 유틸리티 추가
132
+
133
+ ```css
134
+ /* typography.css */
135
+ @utility font-body-regular {
136
+ font-family: Pretendard;
137
+ font-weight: 400;
138
+ font-size: 16px;
139
+ line-height: 150%;
140
+ }
141
+ ```
@@ -0,0 +1,77 @@
1
+ import { createContext, useContext, useEffect, useRef, useState } from "react";
2
+
3
+ export type Theme = string; //"dark" | "light" | "system" | "test";
4
+
5
+ type ThemeProviderProps = {
6
+ children: React.ReactNode;
7
+ defaultTheme?: Theme;
8
+ storageKey?: string;
9
+ };
10
+
11
+ type ThemeProviderState = {
12
+ theme: Theme;
13
+ setTheme: (theme: Theme) => void;
14
+ };
15
+
16
+ const initialState: ThemeProviderState = {
17
+ theme: "system",
18
+ setTheme: () => null,
19
+ };
20
+
21
+ const ThemeProviderContext = createContext<ThemeProviderState>(initialState);
22
+
23
+ export function ThemeProvider({
24
+ children,
25
+ defaultTheme = "light",
26
+ storageKey = "vite-ui-theme",
27
+ ...props
28
+ }: ThemeProviderProps) {
29
+ const [theme, setTheme] = useState<Theme>(
30
+ () => (localStorage.getItem(storageKey) as Theme) || defaultTheme
31
+ );
32
+ const prevTheme = useRef<Theme>(theme);
33
+
34
+ useEffect(() => {
35
+ const root = window.document.documentElement;
36
+
37
+ root.classList.remove(prevTheme.current);
38
+
39
+ if (theme === "system") {
40
+ const systemTheme = window.matchMedia("(prefers-color-scheme: dark)")
41
+ .matches
42
+ ? "dark"
43
+ : "light";
44
+
45
+ root.classList.add(systemTheme);
46
+ return;
47
+ }
48
+
49
+ root.classList.add(theme);
50
+ }, [theme]);
51
+
52
+ const value = {
53
+ theme,
54
+ setTheme: (theme: Theme) => {
55
+ localStorage.setItem(storageKey, theme);
56
+ setTheme((prev) => {
57
+ prevTheme.current = prev;
58
+ return theme;
59
+ });
60
+ },
61
+ };
62
+
63
+ return (
64
+ <ThemeProviderContext.Provider {...props} value={value}>
65
+ {children}
66
+ </ThemeProviderContext.Provider>
67
+ );
68
+ }
69
+
70
+ export const useTheme = () => {
71
+ const context = useContext(ThemeProviderContext);
72
+
73
+ if (context === undefined)
74
+ throw new Error("useTheme must be used within a ThemeProvider");
75
+
76
+ return context;
77
+ };
@@ -0,0 +1,232 @@
1
+ @import './palette.css';
2
+
3
+ /* Color */
4
+ /**
5
+ * Token에 매칭된 Color 값을 설정합니다.
6
+ */
7
+ @theme inline {
8
+ --color-static-white: var(--static-white);
9
+ --color-static-black: var(--static-black);
10
+
11
+ --color-primary-main: var(--primary-main);
12
+ --color-primary-alternative: var(--primary-alternative);
13
+ --color-primary-subtle: var(--primary-subtle);
14
+
15
+ --color-secondary-main: var(--secondary-main);
16
+ --color-secondary-alternative: var(--secondary-alternative);
17
+ --color-secondary-subtle: var(--secondary-subtle);
18
+
19
+ --color-tertiary-main: var(--tertiary-main);
20
+ --color-tertiary-alternative: var(--tertiary-alternative);
21
+ --color-tertiary-subtle: var(--tertiary-subtle);
22
+
23
+ --color-background-main: var(--background-main);
24
+ --color-background-alternative: var(--background-alternative);
25
+ --color-background-subtle: var(--background-subtle);
26
+ --color-background-elevated-main: var(--background-elevated-main);
27
+ --color-background-elevated-alternative: var(--background-elevated-alternative);
28
+ --color-background-emphize: var(--background-emphize);
29
+ --color-background-quiet: var(--background-quiet);
30
+ --color-background-error: var(--background-error);
31
+ --color-background-success: var(--background-success);
32
+ --color-background-info-subtle: var(--background-info-subtle);
33
+ --color-background-success-subtle: var(--background-success-subtle);
34
+ --color-background-warning-subtle: var(--background-warning-subtle);
35
+ --color-background-error-subtle: var(--background-error-subtle);
36
+
37
+ --color-text-main: var(--text-main);
38
+ --color-text-alternative: var(--text-alternative);
39
+ --color-text-subtle: var(--text-subtle);
40
+ --color-text-ghost: var(--text-ghost);
41
+ --color-text-quiet: var(--text-quiet);
42
+ --color-text-emphize: var(--text-emphize);
43
+ --color-text-interactive: var(--text-interactive);
44
+ --color-text-info: var(--text-info);
45
+ --color-text-success: var(--text-success);
46
+ --color-text-warning: var(--text-warning);
47
+ --color-text-error: var(--text-error);
48
+
49
+ --color-border-main: var(--border-main);
50
+ --color-border-alternative: var(--border-alternative);
51
+ --color-border-subtle: var(--border-subtle);
52
+ --color-border-emphize: var(--border-emphize);
53
+ --color-border-quiet: var(--border-quiet);
54
+ --color-border-main-focusRing: var(--border-main-focusRing);
55
+ --color-border-emphize-focusRing: var(--border-emphize--focusRing);
56
+ --color-border-control-default-focusRing: var(--border-control-default-focusRing);
57
+ --color-border-info: var(--border-info);
58
+ --color-border-success: var(--border-success);
59
+ --color-border-warning: var(--border-warning);
60
+ --color-border-error: var(--border-error);
61
+ --color-border-success-focusRing: var(--border-success-focusRing);
62
+ --color-border-warning-focusRing: var(--border-warning-focusRing);
63
+ --color-border-error-focusRing: var(--border-error-focusRing);
64
+
65
+ --coon-main: var(--icon-main);
66
+ --color-icon-alternative: var(--icon-alternative);
67
+ --color-icon-quiet: var(--icon-quiet);
68
+ --color-icon-emphize: var(--icon-emphize);
69
+ --color-icon-disable: var(--icon-disable);
70
+ --color-icon-info: var(--icon-info);
71
+ --color-icon-success: var(--icon-success);
72
+ --color-icon-warning: var(--icon-warning);
73
+ --color-icon-error: var(--icon-error);
74
+
75
+ --color-state-default: var(--state-default);
76
+ --color-state-hovered: var(--state-hovered);
77
+ --color-state-focused: var(--state-focused);
78
+ --color-state-pressed: var(--state-pressed);
79
+ --color-state-disabled: var(--state-disabled);
80
+
81
+ --color-status-info-main: var(--status-info-main);
82
+ --color-status-info-alternative: var(--status-info-alternative);
83
+ --color-status-info-ghost: var(--status-info-ghost);
84
+ --color-status-success-main: var(--status-success-main);
85
+ --color-status-success-alternative: var(--status-success-alternative);
86
+ --color-status-success-ghost: var(--status-success-ghost);
87
+ --color-status-warning-main: var(--status-warning-main);
88
+ --color-status-warning-alternative: var(--status-warning-alternative);
89
+ --color-status-warning-ghost: var(--status-warning-ghost);
90
+ --color-status-error-main: var(--status-error-main);
91
+ --color-status-error-alternative: var(--status-error-alternative);
92
+ --color-status-error-ghost: var(--status-error-ghost);
93
+
94
+ --color-overlay-main: var(--overlay-main);
95
+ --color-overlay-alternative: var(--overlay-alternative);
96
+ }
97
+
98
+ /**
99
+ * 기본 테마의 Color 값을 설정합니다.
100
+ */
101
+ :root {
102
+ /**
103
+ * 1. Static
104
+ */
105
+ --static-white: var(--white-100);
106
+ --static-black: var(--black-100);
107
+
108
+ /**
109
+ * 2. Primary
110
+ */
111
+ --primary-main: var(--violet-60);
112
+ --primary-alternative: var(--violet-80);
113
+ --primary-subtle: var(--violet-40);
114
+
115
+ /**
116
+ * 3. Secondary
117
+ */
118
+ --secondary-main: var(--indigo-60);
119
+ --secondary-alternative: var(--indigo-80);
120
+ --secondary-subtle: var(--indigo-40);
121
+
122
+ /**
123
+ * 4. Tertiary
124
+ */
125
+ --tertiary-main: var(--navy-60);
126
+ --tertiary-alternative: var(--navy-80);
127
+ --tertiary-subtle: var(--navy-40);
128
+
129
+ /**
130
+ * 5. Background
131
+ */
132
+ --background-main: var(--white-100);
133
+ --background-alternative: var(--cool-neutral-5);
134
+ --background-subtle: var(--cool-neutral-0);
135
+ --background-elevated-main: var(--cool-neutral-10);
136
+ --background-elevated-alternative: var(--cool-neutral-20);
137
+ --background-emphize: var(--cool-neutral-90);
138
+ --background-quiet: --alpha(var(--cool-neutral-90) / 5%);
139
+ --background-success: var(--green-50);
140
+ --background-error: var(--red-50);
141
+ --background-info-subtle: --alpha(var(--blue-50) / 5%);
142
+ --background-success-subtle: --alpha(var(--green-50) / 5%);
143
+ --background-warning-subtle: --alpha(var(--yellow-50) / 5%);
144
+ --background-error-subtle: --alpha(var(--red-50) / 5%);
145
+
146
+ /**
147
+ * 6. Text
148
+ */
149
+ --text-main: var(--cool-neutral-90);
150
+ --text-alternative: var(--cool-neutral-80);
151
+ --text-subtle: var(--cool-neutral-60);
152
+ --text-ghost: var(--cool-neutral-30);
153
+ --text-quiet: var(--cool-neutral-25);
154
+ --text-emphize: var(--cool-neutral-10);
155
+ --text-interactive: var(--violet-60);
156
+ --text-info: var(--blue-70);
157
+ --text-success: var(--green-70);
158
+ --text-warning: var(--yellow-70);
159
+ --text-error: var(--red-70);
160
+
161
+ /**
162
+ * 7. Border
163
+ */
164
+ --border-main: var(--cool-neutral-10);
165
+ --border-alternative: var(--cool-neutral-30);
166
+ --border-subtle: var(--cool-neutral-0);
167
+ --border-emphize: var(--cool-neutral-90);
168
+ --border-quiet: var(--cool-neutral-5);
169
+ --border-main-focusRing: --alpha(var(--cool-neutral-10) / 50%);
170
+ --border-emphize--focusRing: --alpha(var(--cool-neutral-90) / 50%);
171
+ --border-control-default-focusRing: --alpha(var(--cool-neutral-20) / 50%);
172
+ --border-info: var(--blue-50);
173
+ --border-success: var(--green-50);
174
+ --border-warning: var(--orange-50);
175
+ --border-error: var(--red-50);
176
+ --border-success-focusRing: --alpha(var(--green-50) / 50%);
177
+ --border-warning-focusRing: --alpha(var(--orange-50) / 50%);
178
+ --border-error-focusRing: --alpha(var(--red-50) / 50%);
179
+
180
+ /**
181
+ * 8. Icon
182
+ */
183
+ --icon-main: var(--cool-neutral-90);
184
+ --icon-alternative: var(--cool-neutral-70);
185
+ --icon-quiet: var(--cool-neutral-20);
186
+ --icon-emphize: var(--cool-neutral-0);
187
+ --icon-disable: var(--cool-neutral-30);
188
+ --icon-info: var(--blue-50);
189
+ --icon-success: var(--green-50);
190
+ --icon-warning: var(--orange-50);
191
+ --icon-error: var(--red-50);
192
+
193
+ /**
194
+ * 9. State
195
+ */
196
+ --state-default: alpha(var(--cool-neutral-0) / 100%);
197
+ --state-hovered: alpha(var(--cool-neutral-5) / 100%);
198
+ --state-focused: alpha(var(--cool-neutral-10) / 100%);
199
+ --state-pressed: alpha(var(--cool-neutral-15) / 100%);
200
+ --state-disabled: alpha(var(--static-white) / 50%);
201
+
202
+ /**
203
+ * 10. Status
204
+ */
205
+ --status-info-main: var(--blue-50);
206
+ --status-info-alternative: var(--blue-70);
207
+ --status-info-ghost: var(--blue-10);
208
+ --status-success-main: var(--green-50);
209
+ --status-success-alternative: var(--green-70);
210
+ --status-success-ghost: var(--green-10);
211
+ --status-warning-main: var(--orange-50);
212
+ --status-warning-alternative: var(--orange-70);
213
+ --status-warning-ghost: var(--orange-10);
214
+ --status-error-main: var(--red-50);
215
+ --status-error-alternative: var(--red-70);
216
+ --status-error-ghost: var(--red-10);
217
+
218
+ /**
219
+ * 11. Overlay
220
+ */
221
+ --overlay-main: alpha(var(--cool-neutral-90) / 40%);
222
+ --overlay-alternative: alpha(var(--cool-neutral-90) / 20%);
223
+ }
224
+
225
+ /**
226
+ * Dark 테마에서의 Color 값을 설정합니다.
227
+ */
228
+ .dark {
229
+ /**
230
+ * TBD
231
+ */
232
+ }