diff --git a/CHANGELOG.md b/CHANGELOG.md index 8b67d3d..c39e528 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,7 +7,32 @@ ## [Unreleased] -## [0.2.0] - 2025-01-14 +## [0.2.1] - 2026-01-18 + +### Changed + +- CSS 파일 구조 개선 + - `src/styles/tailwind.css`를 관심사별로 분리 + - `tokens/`: CSS 변수 정의 (colors, typography, shadows) + - `theme/`: Tailwind 테마 설정 (colors, typography) + - `utilities/`: 커스텀 유틸리티 클래스 (typography) +- 색상 토큰 재구성 + - `:root`에 실제 색상 이름으로 CSS 변수 정의 (`--color-orange-*`, `--color-green-*`, `--color-red-*`) + - `@theme`에서 시멘틱 색상으로 매핑 (`primary` → Orange, `secondary` → Green, `tertiary` → Red) + - 실제 색상(`bg-orange-500`)과 시멘틱 색상(`bg-primary-500`) 모두 사용 가능 + - CSS 변수(`var(--color-orange-500)`, `var(--color-primary-500)`) 직접 사용 가능 +- README 업데이트 + - 색상 사용 방법 명확화 (실제 색상 vs 시멘틱 색상) + - Tailwind 테마 커스터마이징 가이드 개선 + - CSS 변수 사용 예시 추가 + +### Removed + +- vanilla-extract 관련 의존성 완전 제거 + - `@vanilla-extract/css`, `@vanilla-extract/esbuild-plugin`, `@vanilla-extract/vite-plugin` 제거 + - `vitest.config.ts`, `vite.config.ts`, `tsup.config.ts`에서 vanilla-extract 플러그인 제거 + +## [0.2.0] - 2026-01-14 ### Added @@ -34,7 +59,7 @@ - README에 썸네일 이미지 추가 -## [0.1.6] - 2025-01-14 +## [0.1.6] - 2026-01-14 ### Added @@ -176,7 +201,8 @@ - Storybook 설정 - Vitest 테스트 설정 -[Unreleased]: https://github.com/Team-NumberOne/daepiro-design-system/compare/v0.2.0...HEAD +[Unreleased]: https://github.com/Team-NumberOne/daepiro-design-system/compare/v0.2.1...HEAD +[0.2.1]: https://github.com/Team-NumberOne/daepiro-design-system/compare/v0.2.0...v0.2.1 [0.2.0]: https://github.com/Team-NumberOne/daepiro-design-system/compare/v0.1.6...v0.2.0 [0.1.6]: https://github.com/Team-NumberOne/daepiro-design-system/compare/v0.1.5...v0.1.6 [0.1.5]: https://github.com/Team-NumberOne/daepiro-design-system/compare/v0.1.4...v0.1.5 diff --git a/README.md b/README.md index f5f6239..6ee49b3 100644 --- a/README.md +++ b/README.md @@ -143,14 +143,60 @@ import { Icon, Icons } from "@team-numberone/daepiro-design-system"; ### Colors +#### JavaScript/TypeScript에서 사용 + ```tsx import { colors } from "@team-numberone/daepiro-design-system"; -colors.O[500]; // Orange 500 -colors.Gre[300]; // Green 300 -colors.G[900]; // Gray 900 +// 실제 색상 팔레트 (디자인 토큰) +colors.O[500]; // Orange 500 - #FF6929 +colors.Gre[300]; // Green 300 - #6ACF98 +colors.R[500]; // Red 500 - #FA2C1F +colors.G[900]; // Gray 900 - #222530 +``` + +**CSS 변수로 사용:** + +```css +/* 실제 색상 이름 */ +background-color: var(--color-orange-500); +color: var(--color-green-300); + +/* 시멘틱 색상 이름 */ +background-color: var(--color-primary-500); /* Orange */ +color: var(--color-secondary-300); /* Green */ +``` + +#### Tailwind CSS 유틸리티 클래스로 바로 사용 + +`@theme`에 정의된 색상은 Tailwind 유틸리티 클래스로 바로 사용할 수 있습니다: + +```tsx +// 실제 색상 이름으로 사용 +
Orange 배경
+
Green 배경
+
Red 배경
+ +// 시멘틱 색상 이름으로 사용 (Orange → Primary, Green → Secondary, Red → Tertiary) +
Primary(Orange) 배경
+
Secondary(Green) 배경
+
Tertiary(Red) 배경
+ +// Gray 색상 +
Gray 배경
+
Gray-75 배경
+
Gray 텍스트
+ +// 모든 색상 스케일 사용 가능 (50-900) +
호버 효과
+
Orange 호버 효과
``` +**색상 매핑:** +- `orange-*` = `primary-*` (Orange → Primary) +- `green-*` = `secondary-*` (Green → Secondary) +- `red-*` = `tertiary-*` (Red → Tertiary) + ### Typography ```tsx @@ -175,12 +221,67 @@ shadows.large; 이 디자인 시스템은 Tailwind CSS v4를 사용하며, `@theme` 문법을 통해 테마를 커스터마이징할 수 있습니다. +#### 기본 사용법 + +```tsx +// 색상 사용 +
+ Primary 배경 +
+ +// 타이포그래피 사용 +

제목 1

+

본문 텍스트

+``` + +#### 테마 오버라이드 (사용처에서) + +디자인 시스템의 색상을 커스터마이징할 수 있습니다. 예를 들어, Primary 색상을 그린(Secondary)으로 변경: + ```css -/* 사용처에서 Tailwind 테마 오버라이드 */ +/* globals.css */ +@import "@team-numberone/daepiro-design-system/dist/index.css"; @import "tailwindcss"; +/* Primary 색상을 Green으로 오버라이드 */ +@theme { + --color-primary-50: var(--color-green-50); + --color-primary-100: var(--color-green-100); + --color-primary-200: var(--color-green-200); + --color-primary-300: var(--color-green-300); + --color-primary-400: var(--color-green-400); + --color-primary-500: var(--color-green-500); + --color-primary-600: var(--color-green-600); + --color-primary-700: var(--color-green-700); + --color-primary-800: var(--color-green-800); + --color-primary-900: var(--color-green-900); +} + +/* 디자인 시스템 컴포넌트의 CSS 변수도 오버라이드 */ +:root { + --color-primary-50: var(--color-green-50); + --color-primary-100: var(--color-green-100); + --color-primary-200: var(--color-green-200); + --color-primary-300: var(--color-green-300); + --color-primary-400: var(--color-green-400); + --color-primary-500: var(--color-green-500); + --color-primary-600: var(--color-green-600); + --color-primary-700: var(--color-green-700); + --color-primary-800: var(--color-green-800); + --color-primary-900: var(--color-green-900); +} +``` + +이렇게 하면: +- 사용처의 `bg-primary-500` 클래스가 Green 색상으로 적용됩니다 +- 디자인 시스템의 Button 컴포넌트도 Green 색상을 사용합니다 +- 디자인 시스템이 제공하는 `--color-green-*`, `--color-orange-*`, `--color-red-*` CSS 변수를 참조할 수 있습니다 + +#### 커스텀 색상 정의 + +```css @theme { - /* 색상 커스터마이징 */ + /* 완전히 새로운 색상 정의 */ --color-primary-500: #ff0000; --color-gray-900: #1a1a1a; @@ -189,14 +290,6 @@ shadows.large; } ``` -또는 Tailwind 유틸리티 클래스를 직접 사용할 수 있습니다: - -```tsx -
- 커스텀 스타일 -
-``` - ## 🛠️ 개발 ### 사전 요구사항 diff --git a/package.json b/package.json index f4bc769..08b9135 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@team-numberone/daepiro-design-system", - "version": "0.2.0", + "version": "0.2.1", "description": "대피로 디자인 시스템 - React 컴포넌트 라이브러리", "private": false, "packageManager": "pnpm@10.25.0", @@ -66,9 +66,6 @@ "@types/node": "^24.10.2", "@types/react": "^19.2.7", "@types/react-dom": "^19.2.3", - "@vanilla-extract/css": "^1.17.5", - "@vanilla-extract/esbuild-plugin": "^2.3.20", - "@vanilla-extract/vite-plugin": "^5.1.3", "@vitejs/plugin-react-swc": "^4.2.2", "@vitest/coverage-v8": "4.0.15", "@vitest/ui": "^4.0.15", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5ac03d1..81d1640 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -66,15 +66,6 @@ importers: '@types/react-dom': specifier: ^19.2.3 version: 19.2.3(@types/react@19.2.7) - '@vanilla-extract/css': - specifier: ^1.17.5 - version: 1.17.5 - '@vanilla-extract/esbuild-plugin': - specifier: ^2.3.20 - version: 2.3.20(esbuild@0.27.1) - '@vanilla-extract/vite-plugin': - specifier: ^5.1.3 - version: 5.1.3(@types/node@24.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(vite@7.2.7(@types/node@24.10.2)(jiti@2.6.1)(lightningcss@1.30.2)) '@vitejs/plugin-react-swc': specifier: ^4.2.2 version: 4.2.2(vite@7.2.7(@types/node@24.10.2)(jiti@2.6.1)(lightningcss@1.30.2)) @@ -412,9 +403,6 @@ packages: '@emnapi/wasi-threads@1.1.0': resolution: {integrity: sha512-WI0DdZ8xFSbgMjR1sFsKABJ/C5OnRrjT06JXbZKexJGrDuPTzZdDYfFlsgcCXCyf+suG5QU2e/y1Wo2V/OapLQ==} - '@emotion/hash@0.9.2': - resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==} - '@esbuild/aix-ppc64@0.25.12': resolution: {integrity: sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==} engines: {node: '>=18'} @@ -1568,34 +1556,6 @@ packages: cpu: [x64] os: [win32] - '@vanilla-extract/babel-plugin-debug-ids@1.2.2': - resolution: {integrity: sha512-MeDWGICAF9zA/OZLOKwhoRlsUW+fiMwnfuOAqFVohL31Agj7Q/RBWAYweqjHLgFBCsdnr6XIfwjJnmb2znEWxw==} - - '@vanilla-extract/compiler@0.3.3': - resolution: {integrity: sha512-y/RCcjhITi/JV/jbH22QN0aDSTtWELOBbkod/rcrUfGTS8bfVrthSsFmH+0ZoL9LJBx3vHrf0Qaf24xZkoiJoQ==} - - '@vanilla-extract/css@1.17.5': - resolution: {integrity: sha512-u29cUVL5Z2qjJ2Eh8pusT1ToGtTeA4eb/y0ygaw2vWv9XFQSixtkBYEsVkrJExSI/0+SR1g8n5NYas4KlWOdfA==} - - '@vanilla-extract/esbuild-plugin@2.3.20': - resolution: {integrity: sha512-QTSHqzD42L7Pi2LwAjIidP26nsOVlnZ7FQKT2S9A9FCaqnrVQmn1tPtgbV0wCo74gVrmaORK3vD2NuNhxyMOKg==} - peerDependencies: - esbuild: '>=0.17.6' - peerDependenciesMeta: - esbuild: - optional: true - - '@vanilla-extract/integration@8.0.6': - resolution: {integrity: sha512-BlDtXtb6Fin8XEGwf4BhsJkKQh0rhj/YiN6ylNNOqXtRU0+DQmzE5WGE056ScKg3p5e0IFaeH7PPxuWJca9aXw==} - - '@vanilla-extract/private@1.0.9': - resolution: {integrity: sha512-gT2jbfZuaaCLrAxwXbRgIhGhcXbRZCG3v4TTUnjw0EJ7ArdBRxkq4msNJkbuRkCgfIK5ATmprB5t9ljvLeFDEA==} - - '@vanilla-extract/vite-plugin@5.1.3': - resolution: {integrity: sha512-QKojhn+O4NIjPQsjfF3Lz+DCC9VaGE/P6eNXcZGoWhdCuGXbMOdSX0xogCX9O6ewzwJOiJJ++3NvuSlh7oVkcw==} - peerDependencies: - vite: ^5.0.0 || ^6.0.0 || ^7.0.0 - '@vitejs/plugin-react-swc@4.2.2': resolution: {integrity: sha512-x+rE6tsxq/gxrEJN3Nv3dIV60lFflPj94c90b+NNo6n1QV1QQUTLoL0MpaOVasUZ0zqVBn7ead1B5ecx1JAGfA==} engines: {node: ^20.19.0 || >=22.12.0} @@ -2022,11 +1982,6 @@ packages: css.escape@1.5.1: resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==} - cssesc@3.0.0: - resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} - engines: {node: '>=4'} - hasBin: true - csso@5.0.5: resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} @@ -2078,9 +2033,6 @@ packages: resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==} engines: {node: '>=6'} - deep-object-diff@1.1.9: - resolution: {integrity: sha512-Rn+RuwkmkDwCi2/oXOFS9Gsr5lJZu/yTGpK7wAaAIE75CC+LCGEZHpY6VQJa/RoJcrmaA/docWJZvYohlNkWPA==} - deepmerge@4.3.1: resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} engines: {node: '>=0.10.0'} @@ -2254,10 +2206,6 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - eval@0.1.8: - resolution: {integrity: sha512-EzV94NYKoO09GLXGjXj9JIlXijVck4ONSr5wiCWDvhsvj5jxSrzTmRU/9C1DyB6uToszLs8aifA6NQ7lEQdvFw==} - engines: {node: '>= 0.8'} - execa@5.1.1: resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} engines: {node: '>=10'} @@ -2328,10 +2276,6 @@ packages: resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} engines: {node: '>=8'} - find-up@5.0.0: - resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} - engines: {node: '>=10'} - fix-dts-default-cjs-exports@1.0.1: resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==} @@ -2597,9 +2541,6 @@ packages: jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} - javascript-stringify@2.1.0: - resolution: {integrity: sha512-JVAfqNPTvNq3sB/VHQJAFxN/sPgKnsKrCwyRt15zwNCdrMMJDdcEOdubuy+DuJYYdm0ox1J4uzEuYKkN+9yhVg==} - jest-changed-files@30.2.0: resolution: {integrity: sha512-L8lR1ChrRnSdfeOvTrwZMlnWV8G/LLjQ0nG9MBclwWZidA2N5FviRki0Bvh20WRMOX31/JYvzdqTJrk5oBdydQ==} engines: {node: ^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0} @@ -2892,10 +2833,6 @@ packages: resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} engines: {node: '>=8'} - locate-path@6.0.0: - resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} - engines: {node: '>=10'} - lodash.flattendeep@4.4.0: resolution: {integrity: sha512-uHaJFihxmJcEX3kT4I23ABqKKalJ/zDrDg0lsFtc1h+3uw49SIJ5beyhx5ExVRti3AvKoOJngIj7xz3oylPdWQ==} @@ -2956,9 +2893,6 @@ packages: mdn-data@2.12.2: resolution: {integrity: sha512-IEn+pegP1aManZuckezWCO+XZQDplx1366JoVhTpMpBB1sPey/SbveZQUosKiKiGYjg1wH4pMlNgXbCiYgihQA==} - media-query-parser@2.0.2: - resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==} - merge-stream@2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -3008,9 +2942,6 @@ packages: mlly@1.8.0: resolution: {integrity: sha512-l8D9ODSRWLe2KHJSifWGwBqpTZXIXTeo8mlKjY+E2HAakaTeNpqAyBZ8GSqLzHgw4XmHmC8whvpjJNMbFZN7/g==} - modern-ahocorasick@1.1.0: - resolution: {integrity: sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==} - mrmime@2.0.1: resolution: {integrity: sha512-Y3wQdFg2Va6etvQ5I82yUhGdsKrcYox6p7FfL1LbK2J4V01F9TGlepTIhnK24t7koZibmg82KGglhA1XK5IsLQ==} engines: {node: '>=10'} @@ -3097,10 +3028,6 @@ packages: resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} engines: {node: '>=8'} - p-locate@5.0.0: - resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} - engines: {node: '>=10'} - p-map@3.0.0: resolution: {integrity: sha512-d3qXVTF/s+W+CdJ5A29wywV2n8CQQYahlgz2bFiA+4eVNJbHJodPZ+/gXwPGh0bOqA+j8S+6+ckmvLGPk1QpxQ==} engines: {node: '>=8'} @@ -3301,9 +3228,6 @@ packages: resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} engines: {node: '>=0.10.0'} - require-like@0.1.2: - resolution: {integrity: sha512-oyrU88skkMtDdauHDuKVrgR+zuItqr6/c//FXzvmxRGMexSDc6hNvJInGW3LL46n+8b50RykrvwSUIIQH2LQ5A==} - require-main-filename@2.0.0: resolution: {integrity: sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==} @@ -3701,11 +3625,6 @@ packages: resolution: {integrity: sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==} engines: {node: '>=10.12.0'} - vite-node@3.2.4: - resolution: {integrity: sha512-EbKSKh+bh1E1IFxeO0pg1n4dvoOTt0UDiXMd/qn++r98+jPO1xtJilvXldeuQ8giIB5IkpjCgMleHMNEsGH6pg==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} - hasBin: true - vite@7.2.7: resolution: {integrity: sha512-ITcnkFeR3+fI8P1wMgItjGrR10170d8auB4EpMLPqmx6uxElH3a/hHGQabSHKdqd4FXWO1nFIp9rRn7JQ34ACQ==} engines: {node: ^20.19.0 || >=22.12.0} @@ -4203,8 +4122,6 @@ snapshots: tslib: 2.8.1 optional: true - '@emotion/hash@0.9.2': {} - '@esbuild/aix-ppc64@0.25.12': optional: true @@ -5262,97 +5179,6 @@ snapshots: '@unrs/resolver-binding-win32-x64-msvc@1.11.1': optional: true - '@vanilla-extract/babel-plugin-debug-ids@1.2.2': - dependencies: - '@babel/core': 7.28.5 - transitivePeerDependencies: - - supports-color - - '@vanilla-extract/compiler@0.3.3(@types/node@24.10.2)(jiti@2.6.1)(lightningcss@1.30.2)': - dependencies: - '@vanilla-extract/css': 1.17.5 - '@vanilla-extract/integration': 8.0.6 - vite: 7.2.7(@types/node@24.10.2)(jiti@2.6.1)(lightningcss@1.30.2) - vite-node: 3.2.4(@types/node@24.10.2)(jiti@2.6.1)(lightningcss@1.30.2) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - - '@vanilla-extract/css@1.17.5': - dependencies: - '@emotion/hash': 0.9.2 - '@vanilla-extract/private': 1.0.9 - css-what: 6.2.2 - cssesc: 3.0.0 - csstype: 3.2.3 - dedent: 1.7.0 - deep-object-diff: 1.1.9 - deepmerge: 4.3.1 - lru-cache: 10.4.3 - media-query-parser: 2.0.2 - modern-ahocorasick: 1.1.0 - picocolors: 1.1.1 - transitivePeerDependencies: - - babel-plugin-macros - - '@vanilla-extract/esbuild-plugin@2.3.20(esbuild@0.27.1)': - dependencies: - '@vanilla-extract/integration': 8.0.6 - optionalDependencies: - esbuild: 0.27.1 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - '@vanilla-extract/integration@8.0.6': - dependencies: - '@babel/core': 7.28.5 - '@babel/plugin-syntax-typescript': 7.27.1(@babel/core@7.28.5) - '@vanilla-extract/babel-plugin-debug-ids': 1.2.2 - '@vanilla-extract/css': 1.17.5 - dedent: 1.7.0 - esbuild: 0.27.1 - eval: 0.1.8 - find-up: 5.0.0 - javascript-stringify: 2.1.0 - mlly: 1.8.0 - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - '@vanilla-extract/private@1.0.9': {} - - '@vanilla-extract/vite-plugin@5.1.3(@types/node@24.10.2)(jiti@2.6.1)(lightningcss@1.30.2)(vite@7.2.7(@types/node@24.10.2)(jiti@2.6.1)(lightningcss@1.30.2))': - dependencies: - '@vanilla-extract/compiler': 0.3.3(@types/node@24.10.2)(jiti@2.6.1)(lightningcss@1.30.2) - '@vanilla-extract/integration': 8.0.6 - vite: 7.2.7(@types/node@24.10.2)(jiti@2.6.1)(lightningcss@1.30.2) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - '@vitejs/plugin-react-swc@4.2.2(vite@7.2.7(@types/node@24.10.2)(jiti@2.6.1)(lightningcss@1.30.2))': dependencies: '@rolldown/pluginutils': 1.0.0-beta.47 @@ -5814,8 +5640,6 @@ snapshots: css.escape@1.5.1: {} - cssesc@3.0.0: {} - csso@5.0.5: dependencies: css-tree: 2.2.1 @@ -5852,8 +5676,6 @@ snapshots: deep-eql@5.0.2: {} - deep-object-diff@1.1.9: {} - deepmerge@4.3.1: {} default-require-extensions@3.0.1: @@ -6049,11 +5871,6 @@ snapshots: esutils@2.0.3: {} - eval@0.1.8: - dependencies: - '@types/node': 24.10.2 - require-like: 0.1.2 - execa@5.1.1: dependencies: cross-spawn: 7.0.6 @@ -6129,11 +5946,6 @@ snapshots: locate-path: 5.0.0 path-exists: 4.0.0 - find-up@5.0.0: - dependencies: - locate-path: 6.0.0 - path-exists: 4.0.0 - fix-dts-default-cjs-exports@1.0.1: dependencies: magic-string: 0.30.21 @@ -6418,8 +6230,6 @@ snapshots: optionalDependencies: '@pkgjs/parseargs': 0.11.0 - javascript-stringify@2.1.0: {} - jest-changed-files@30.2.0: dependencies: execa: 5.1.1 @@ -6898,10 +6708,6 @@ snapshots: dependencies: p-locate: 4.1.0 - locate-path@6.0.0: - dependencies: - p-locate: 5.0.0 - lodash.flattendeep@4.4.0: {} lodash@4.17.21: {} @@ -6954,10 +6760,6 @@ snapshots: mdn-data@2.12.2: {} - media-query-parser@2.0.2: - dependencies: - '@babel/runtime': 7.28.4 - merge-stream@2.0.0: {} micromatch@4.0.8: @@ -7000,8 +6802,6 @@ snapshots: pkg-types: 1.3.1 ufo: 1.6.1 - modern-ahocorasick@1.1.0: {} - mrmime@2.0.1: {} ms@2.1.3: {} @@ -7101,10 +6901,6 @@ snapshots: dependencies: p-limit: 2.3.0 - p-locate@5.0.0: - dependencies: - p-limit: 3.1.0 - p-map@3.0.0: dependencies: aggregate-error: 3.1.0 @@ -7285,8 +7081,6 @@ snapshots: require-from-string@2.0.2: {} - require-like@0.1.2: {} - require-main-filename@2.0.0: {} resolve-cwd@3.0.0: @@ -7710,27 +7504,6 @@ snapshots: '@types/istanbul-lib-coverage': 2.0.6 convert-source-map: 2.0.0 - vite-node@3.2.4(@types/node@24.10.2)(jiti@2.6.1)(lightningcss@1.30.2): - dependencies: - cac: 6.7.14 - debug: 4.4.3 - es-module-lexer: 1.7.0 - pathe: 2.0.3 - vite: 7.2.7(@types/node@24.10.2)(jiti@2.6.1)(lightningcss@1.30.2) - transitivePeerDependencies: - - '@types/node' - - jiti - - less - - lightningcss - - sass - - sass-embedded - - stylus - - sugarss - - supports-color - - terser - - tsx - - yaml - vite@7.2.7(@types/node@24.10.2)(jiti@2.6.1)(lightningcss@1.30.2): dependencies: esbuild: 0.25.12 diff --git a/src/styles/tailwind.css b/src/styles/tailwind.css index df67445..2a6de8f 100644 --- a/src/styles/tailwind.css +++ b/src/styles/tailwind.css @@ -1,63 +1,13 @@ @import "tailwindcss"; -@theme { - /* Colors - Primary (Orange) */ - --color-primary-50: #fff0ea; - --color-primary-100: #ffd1bd; - --color-primary-200: #ffba9d; - --color-primary-300: #ff9b70; - --color-primary-400: #ff8754; - --color-primary-500: #ff6929; - --color-primary-600: #e86025; - --color-primary-700: #b54b1d; - --color-primary-800: #8c3a17; - --color-primary-900: #6b2c11; +/* Import Design Tokens (CSS Variables in :root) */ +@import "./tokens/colors.css"; +@import "./tokens/typography.css"; +@import "./tokens/shadows.css"; - /* Colors - Secondary (Green) */ - --color-secondary-50: #e9f8f0; - --color-secondary-100: #bae9d0; - --color-secondary-200: #98deb9; - --color-secondary-300: #6acf98; - --color-secondary-400: #4dc585; - --color-secondary-500: #20b766; - --color-secondary-600: #1da75d; - --color-secondary-700: #178248; - --color-secondary-800: #126538; - --color-secondary-900: #0d4d2b; +/* Import Tailwind Theme Configuration */ +@import "./theme/colors.css"; +@import "./theme/typography.css"; - /* Colors - Tertiary (Red) */ - --color-tertiary-50: #ffeae9; - --color-tertiary-100: #fdbeba; - --color-tertiary-200: #fd9e98; - --color-tertiary-300: #fc7269; - --color-tertiary-400: #fb564c; - --color-tertiary-500: #fa2c1f; - --color-tertiary-600: #e4281c; - --color-tertiary-700: #b21f16; - --color-tertiary-800: #8a1811; - --color-tertiary-900: #69120d; - - /* Colors - Gray */ - --color-gray-50: #f5f5f7; - --color-gray-75: #e4e5ea; - --color-gray-100: #c9ccd4; - --color-gray-200: #afb3bf; - --color-gray-300: #8b90a1; - --color-gray-400: #757a8f; - --color-gray-500: #525973; - --color-gray-600: #4b5169; - --color-gray-700: #3a3f52; - --color-gray-800: #2d313f; - --color-gray-900: #222530; - - /* Typography */ - --font-family-sans: Pretendard, -apple-system, BlinkMacSystemFont, system-ui, - sans-serif; - - /* Shadows */ - --shadow-floating: 2px 2px 4px 0 rgba(0, 0, 0, 0.1), 0 0 4px 0 - rgba(0, 0, 0, 0.15); - --shadow-btn-pressed: 0 0 1px 0 rgba(34, 37, 48, 0.15), 1px 1px 2px 0 - rgba(34, 37, 48, 0.15); - --shadow-dimmed: 0 0 8px 0 rgba(0, 0, 0, 0.1), 0 0 20px 0 rgba(0, 0, 0, 0.1); -} +/* Import Custom Utilities */ +@import "./utilities/typography.css"; diff --git a/src/styles/theme/colors.css b/src/styles/theme/colors.css new file mode 100644 index 0000000..4444493 --- /dev/null +++ b/src/styles/theme/colors.css @@ -0,0 +1,87 @@ +/* Tailwind Theme - Colors */ +@theme { + /* Colors - Orange (for Tailwind utilities: bg-orange-500, text-orange-500, etc.) */ + --color-orange-50: var(--color-orange-50); + --color-orange-100: var(--color-orange-100); + --color-orange-200: var(--color-orange-200); + --color-orange-300: var(--color-orange-300); + --color-orange-400: var(--color-orange-400); + --color-orange-500: var(--color-orange-500); + --color-orange-600: var(--color-orange-600); + --color-orange-700: var(--color-orange-700); + --color-orange-800: var(--color-orange-800); + --color-orange-900: var(--color-orange-900); + + /* Colors - Green (for Tailwind utilities: bg-green-500, text-green-500, etc.) */ + --color-green-50: var(--color-green-50); + --color-green-100: var(--color-green-100); + --color-green-200: var(--color-green-200); + --color-green-300: var(--color-green-300); + --color-green-400: var(--color-green-400); + --color-green-500: var(--color-green-500); + --color-green-600: var(--color-green-600); + --color-green-700: var(--color-green-700); + --color-green-800: var(--color-green-800); + --color-green-900: var(--color-green-900); + + /* Colors - Red (for Tailwind utilities: bg-red-500, text-red-500, etc.) */ + --color-red-50: var(--color-red-50); + --color-red-100: var(--color-red-100); + --color-red-200: var(--color-red-200); + --color-red-300: var(--color-red-300); + --color-red-400: var(--color-red-400); + --color-red-500: var(--color-red-500); + --color-red-600: var(--color-red-600); + --color-red-700: var(--color-red-700); + --color-red-800: var(--color-red-800); + --color-red-900: var(--color-red-900); + + /* Colors - Gray (for Tailwind utilities: bg-gray-500, text-gray-500, etc.) */ + --color-gray-50: var(--color-gray-50); + --color-gray-75: var(--color-gray-75); + --color-gray-100: var(--color-gray-100); + --color-gray-200: var(--color-gray-200); + --color-gray-300: var(--color-gray-300); + --color-gray-400: var(--color-gray-400); + --color-gray-500: var(--color-gray-500); + --color-gray-600: var(--color-gray-600); + --color-gray-700: var(--color-gray-700); + --color-gray-800: var(--color-gray-800); + --color-gray-900: var(--color-gray-900); + + /* Semantic Colors - Primary (maps to Orange) */ + --color-primary-50: var(--color-orange-50); + --color-primary-100: var(--color-orange-100); + --color-primary-200: var(--color-orange-200); + --color-primary-300: var(--color-orange-300); + --color-primary-400: var(--color-orange-400); + --color-primary-500: var(--color-orange-500); + --color-primary-600: var(--color-orange-600); + --color-primary-700: var(--color-orange-700); + --color-primary-800: var(--color-orange-800); + --color-primary-900: var(--color-orange-900); + + /* Semantic Colors - Secondary (maps to Green) */ + --color-secondary-50: var(--color-green-50); + --color-secondary-100: var(--color-green-100); + --color-secondary-200: var(--color-green-200); + --color-secondary-300: var(--color-green-300); + --color-secondary-400: var(--color-green-400); + --color-secondary-500: var(--color-green-500); + --color-secondary-600: var(--color-green-600); + --color-secondary-700: var(--color-green-700); + --color-secondary-800: var(--color-green-800); + --color-secondary-900: var(--color-green-900); + + /* Semantic Colors - Tertiary (maps to Red) */ + --color-tertiary-50: var(--color-red-50); + --color-tertiary-100: var(--color-red-100); + --color-tertiary-200: var(--color-red-200); + --color-tertiary-300: var(--color-red-300); + --color-tertiary-400: var(--color-red-400); + --color-tertiary-500: var(--color-red-500); + --color-tertiary-600: var(--color-red-600); + --color-tertiary-700: var(--color-red-700); + --color-tertiary-800: var(--color-red-800); + --color-tertiary-900: var(--color-red-900); +} diff --git a/src/styles/theme/typography.css b/src/styles/theme/typography.css new file mode 100644 index 0000000..2907b4a --- /dev/null +++ b/src/styles/theme/typography.css @@ -0,0 +1,57 @@ +/* Tailwind Theme - Typography */ +@theme { + /* Typography - Font Family */ + --font-family-sans: Pretendard, -apple-system, BlinkMacSystemFont, system-ui, + sans-serif; + + /* Typography - Font Sizes */ + --font-size-h1: 96px; + --font-size-h2: 60px; + --font-size-h3: 48px; + --font-size-h4: 34px; + --font-size-h5: 24px; + --font-size-h6: 20px; + --font-size-body-1: 16px; + --font-size-body-2: 14px; + --font-size-caption: 12px; + --font-size-overline: 10px; + + /* Typography - Font Weights */ + --font-weight-regular: 400; + --font-weight-medium: 500; + --font-weight-semibold: 600; + --font-weight-bold: 700; + + /* Typography - Line Heights */ + --line-height-h1: 115px; + --line-height-h2: 72px; + --line-height-h3: 58px; + --line-height-h4: 42px; + --line-height-h5: 32px; + --line-height-h6: 28px; + --line-height-body-1: 24px; + --line-height-body-2: 22px; + --line-height-caption: 16px; + --line-height-overline: 12px; + + /* Typography - Letter Spacing */ + --letter-spacing-h1: -1.5px; + --letter-spacing-h2: -0.5px; + --letter-spacing-h3: 0px; + --letter-spacing-h4: 0px; + --letter-spacing-h5: 0px; + --letter-spacing-h6: 0.1px; + --letter-spacing-subtitle-1: 0.15px; + --letter-spacing-body-1: 0.15px; + --letter-spacing-subtitle-2: -0.25px; + --letter-spacing-body-2: -0.25px; + --letter-spacing-caption: 0px; + --letter-spacing-overline: 0px; + + /* Shadows */ + --shadow-floating: 2px 2px 4px 0 rgba(0, 0, 0, 0.1), 0 0 4px 0 + rgba(0, 0, 0, 0.15); + --shadow-btn-pressed: 0 0 1px 0 rgba(34, 37, 48, 0.15), 1px 1px 2px 0 + rgba(34, 37, 48, 0.15); + --shadow-dimmed: 0 0 8px 0 rgba(0, 0, 0, 0.1), 0 0 20px 0 rgba(0, 0, 0, 0.1); +} diff --git a/src/styles/tokens/colors.css b/src/styles/tokens/colors.css new file mode 100644 index 0000000..76b0637 --- /dev/null +++ b/src/styles/tokens/colors.css @@ -0,0 +1,51 @@ +/* Color Tokens - CSS Variables */ +:root { + /* Colors - Orange */ + --color-orange-50: #fff0ea; + --color-orange-100: #ffd1bd; + --color-orange-200: #ffba9d; + --color-orange-300: #ff9b70; + --color-orange-400: #ff8754; + --color-orange-500: #ff6929; + --color-orange-600: #e86025; + --color-orange-700: #b54b1d; + --color-orange-800: #8c3a17; + --color-orange-900: #6b2c11; + + /* Colors - Green */ + --color-green-50: #e9f8f0; + --color-green-100: #bae9d0; + --color-green-200: #98deb9; + --color-green-300: #6acf98; + --color-green-400: #4dc585; + --color-green-500: #20b766; + --color-green-600: #1da75d; + --color-green-700: #178248; + --color-green-800: #126538; + --color-green-900: #0d4d2b; + + /* Colors - Red */ + --color-red-50: #ffeae9; + --color-red-100: #fdbeba; + --color-red-200: #fd9e98; + --color-red-300: #fc7269; + --color-red-400: #fb564c; + --color-red-500: #fa2c1f; + --color-red-600: #e4281c; + --color-red-700: #b21f16; + --color-red-800: #8a1811; + --color-red-900: #69120d; + + /* Colors - Gray */ + --color-gray-50: #f5f5f7; + --color-gray-75: #e4e5ea; + --color-gray-100: #c9ccd4; + --color-gray-200: #afb3bf; + --color-gray-300: #8b90a1; + --color-gray-400: #757a8f; + --color-gray-500: #525973; + --color-gray-600: #4b5169; + --color-gray-700: #3a3f52; + --color-gray-800: #2d313f; + --color-gray-900: #222530; +} diff --git a/src/styles/tokens/shadows.css b/src/styles/tokens/shadows.css new file mode 100644 index 0000000..c1c4969 --- /dev/null +++ b/src/styles/tokens/shadows.css @@ -0,0 +1,9 @@ +/* Shadow Tokens - CSS Variables */ +:root { + /* Shadows */ + --shadow-floating: 2px 2px 4px 0 rgba(0, 0, 0, 0.1), 0 0 4px 0 + rgba(0, 0, 0, 0.15); + --shadow-btn-pressed: 0 0 1px 0 rgba(34, 37, 48, 0.15), 1px 1px 2px 0 + rgba(34, 37, 48, 0.15); + --shadow-dimmed: 0 0 8px 0 rgba(0, 0, 0, 0.1), 0 0 20px 0 rgba(0, 0, 0, 0.1); +} diff --git a/src/styles/tokens/typography.css b/src/styles/tokens/typography.css new file mode 100644 index 0000000..b7c2afe --- /dev/null +++ b/src/styles/tokens/typography.css @@ -0,0 +1,50 @@ +/* Typography Tokens - CSS Variables */ +:root { + /* Typography - Font Family */ + --font-family-sans: Pretendard, -apple-system, BlinkMacSystemFont, system-ui, + sans-serif; + + /* Typography - Font Sizes */ + --font-size-h1: 96px; + --font-size-h2: 60px; + --font-size-h3: 48px; + --font-size-h4: 34px; + --font-size-h5: 24px; + --font-size-h6: 20px; + --font-size-body-1: 16px; + --font-size-body-2: 14px; + --font-size-caption: 12px; + --font-size-overline: 10px; + + /* Typography - Font Weights */ + --font-weight-regular: 400; + --font-weight-medium: 500; + --font-weight-semibold: 600; + --font-weight-bold: 700; + + /* Typography - Line Heights */ + --line-height-h1: 115px; + --line-height-h2: 72px; + --line-height-h3: 58px; + --line-height-h4: 42px; + --line-height-h5: 32px; + --line-height-h6: 28px; + --line-height-body-1: 24px; + --line-height-body-2: 22px; + --line-height-caption: 16px; + --line-height-overline: 12px; + + /* Typography - Letter Spacing */ + --letter-spacing-h1: -1.5px; + --letter-spacing-h2: -0.5px; + --letter-spacing-h3: 0px; + --letter-spacing-h4: 0px; + --letter-spacing-h5: 0px; + --letter-spacing-h6: 0.1px; + --letter-spacing-subtitle-1: 0.15px; + --letter-spacing-body-1: 0.15px; + --letter-spacing-subtitle-2: -0.25px; + --letter-spacing-body-2: -0.25px; + --letter-spacing-caption: 0px; + --letter-spacing-overline: 0px; +} diff --git a/src/styles/utilities/typography.css b/src/styles/utilities/typography.css new file mode 100644 index 0000000..3a845ac --- /dev/null +++ b/src/styles/utilities/typography.css @@ -0,0 +1,104 @@ +/* Typography Utility Classes */ +@utility text-h1 { + font-family: var(--font-family-sans); + font-size: var(--font-size-h1); + font-weight: var(--font-weight-regular); + line-height: var(--line-height-h1); + letter-spacing: var(--letter-spacing-h1); +} + +@utility text-h2 { + font-family: var(--font-family-sans); + font-size: var(--font-size-h2); + font-weight: var(--font-weight-regular); + line-height: var(--line-height-h2); + letter-spacing: var(--letter-spacing-h2); +} + +@utility text-h3 { + font-family: var(--font-family-sans); + font-size: var(--font-size-h3); + font-weight: var(--font-weight-medium); + line-height: var(--line-height-h3); + letter-spacing: var(--letter-spacing-h3); +} + +@utility text-h4 { + font-family: var(--font-family-sans); + font-size: var(--font-size-h4); + font-weight: var(--font-weight-semibold); + line-height: var(--line-height-h4); + letter-spacing: var(--letter-spacing-h4); +} + +@utility text-h5 { + font-family: var(--font-family-sans); + font-size: var(--font-size-h5); + font-weight: var(--font-weight-bold); + line-height: var(--line-height-h5); + letter-spacing: var(--letter-spacing-h5); +} + +@utility text-h6 { + font-family: var(--font-family-sans); + font-size: var(--font-size-h6); + font-weight: var(--font-weight-semibold); + line-height: var(--line-height-h6); + letter-spacing: var(--letter-spacing-h6); +} + +@utility text-subtitle-1 { + font-family: var(--font-family-sans); + font-size: var(--font-size-body-1); + font-weight: var(--font-weight-bold); + line-height: var(--line-height-body-1); + letter-spacing: var(--letter-spacing-subtitle-1); +} + +@utility text-body-1 { + font-family: var(--font-family-sans); + font-size: var(--font-size-body-1); + font-weight: var(--font-weight-medium); + line-height: var(--line-height-body-1); + letter-spacing: var(--letter-spacing-body-1); +} + +@utility text-body-1-b { + font-family: var(--font-family-sans); + font-size: var(--font-size-body-1); + font-weight: var(--font-weight-bold); + line-height: var(--line-height-body-1); + letter-spacing: var(--letter-spacing-body-1); +} + +@utility text-subtitle-2 { + font-family: var(--font-family-sans); + font-size: var(--font-size-body-2); + font-weight: var(--font-weight-bold); + line-height: var(--line-height-body-2); + letter-spacing: var(--letter-spacing-subtitle-2); +} + +@utility text-body-2 { + font-family: var(--font-family-sans); + font-size: var(--font-size-body-2); + font-weight: var(--font-weight-medium); + line-height: var(--line-height-body-2); + letter-spacing: var(--letter-spacing-body-2); +} + +@utility text-caption { + font-family: var(--font-family-sans); + font-size: var(--font-size-caption); + font-weight: var(--font-weight-medium); + line-height: var(--line-height-caption); + letter-spacing: var(--letter-spacing-caption); +} + +@utility text-overline { + font-family: var(--font-family-sans); + font-size: var(--font-size-overline); + font-weight: var(--font-weight-medium); + line-height: var(--line-height-overline); + letter-spacing: var(--letter-spacing-overline); +} diff --git a/tsup.config.ts b/tsup.config.ts index cad8e00..b5df728 100644 --- a/tsup.config.ts +++ b/tsup.config.ts @@ -1,4 +1,3 @@ -import { vanillaExtractPlugin } from "@vanilla-extract/esbuild-plugin"; import { defineConfig } from "tsup"; export default defineConfig({ @@ -8,5 +7,4 @@ export default defineConfig({ sourcemap: true, clean: true, external: ["react", "react-dom"], - esbuildPlugins: [vanillaExtractPlugin()], }); diff --git a/vite.config.ts b/vite.config.ts index ef54e1e..c64c83a 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -1,10 +1,9 @@ import path from "node:path"; -import { vanillaExtractPlugin } from "@vanilla-extract/vite-plugin"; import react from "@vitejs/plugin-react-swc"; import { defineConfig } from "vite"; export default defineConfig({ - plugins: [react(), vanillaExtractPlugin()], + plugins: [react()], resolve: { alias: { "@": path.resolve(__dirname, "src"), diff --git a/vitest.config.ts b/vitest.config.ts index 623cb42..eef1e76 100644 --- a/vitest.config.ts +++ b/vitest.config.ts @@ -1,10 +1,9 @@ import path from "node:path"; -import { vanillaExtractPlugin } from "@vanilla-extract/vite-plugin"; import react from "@vitejs/plugin-react-swc"; import { defineConfig } from "vitest/config"; export default defineConfig({ - plugins: [react(), vanillaExtractPlugin()], + plugins: [react()], test: { globals: true, environment: "jsdom",