diff --git a/.coderabbit.yaml b/.coderabbit.yaml
new file mode 100644
index 00000000..80603b2f
--- /dev/null
+++ b/.coderabbit.yaml
@@ -0,0 +1,140 @@
+language: "en"
+early_access: false
+reviews:
+ profile: "assertive"
+ high_level_summary: true
+ poem: false
+ review_status: true
+ collapse_walkthrough: false
+ path_filters:
+ - "!.templates/**"
+ - "!.changeset/**"
+ - "!**/pnpm-lock.yaml"
+ - "!**/node_modules/**"
+ - "!**/dist/**"
+ - "!**/storybook-static/**"
+ - "!**/*.d.ts"
+ path_instructions:
+ # React Components
+ - path: "**/packages/*/src/*.tsx"
+ instructions: |
+ Review React component code for:
+ - Consistent component patterns following existing components (forwardRef, props interface, const enums)
+ - Proper TypeScript usage with strict typing
+ - Accessibility best practices (semantic HTML, ARIA attributes)
+ - Component composition patterns using Radix UI Slot when applicable
+ - ThemeProvider integration - components should work with all theme variants (1st-4th)
+ - Consistent prop naming and structure with existing components
+ - Proper use of clsx for conditional className handling
+ - Integration with design token system and theme contract variables
+
+ # Vanilla Extract CSS
+ - path: "**/packages/*/src/*.css.ts"
+ instructions: |
+ Review Vanilla Extract styling for:
+ - Proper usage of design tokens from @sipe-team/tokens (vars.color, vars.spacing, etc.)
+ - ThemeProvider compatibility - use vars.color.primary instead of hardcoded colors
+ - Consistent recipe patterns with variants and compound variants
+ - Proper hover states and transitions following existing patterns
+ - Theme-aware color usage that works with multiple theme variants (1st-4th themes)
+ - Avoid hardcoded colors like '#00ffff' - use theme contract variables instead
+ - Responsive design considerations using token-based breakpoints
+ - Performance-optimized CSS generation with proper CSS layers
+
+ # Test Files
+ - path: "**/packages/*/src/*.test.tsx"
+ instructions: |
+ Review test files for:
+ - English test descriptions (convert Korean descriptions to English)
+ - Comprehensive test coverage including visual, behavioral, and accessibility tests
+ - Theme compatibility testing - ensure components work with different theme variants
+ - Proper use of @testing-library/react patterns
+ - Testing component variants, props, and edge cases
+ - ThemeProvider wrapper in tests when testing theme-dependent components
+ - Consistent test structure and naming conventions
+ - Proper setup and cleanup in test files
+
+ # Storybook Stories
+ - path: "**/packages/*/src/*.stories.tsx"
+ instructions: |
+ Review Storybook stories for:
+ - Complete component variant coverage in stories
+ - Theme showcase - demonstrate components with different theme variants (1st-4th)
+ - ThemeProvider integration in stories for theme-dependent components
+ - Proper story naming and organization
+ - Accessible and informative story descriptions
+ - Consistent args and argTypes definitions
+ - Documentation value for design system users
+
+ # Design Tokens
+ - path: "**/packages/tokens/src/**/*.ts"
+ instructions: |
+ Review design token changes for:
+ - Backward compatibility with existing components
+ - Consistent naming conventions following established patterns
+ - Proper TypeScript exports and type definitions
+ - Impact on overall design system consistency
+ - Documentation of token usage and purpose
+
+ # Package Configuration
+ - path: "**/packages/*/package.json"
+ instructions: |
+ Review package.json changes for:
+ - Version consistency with changeset workflow
+ - Proper dependency management (peer deps, dev deps)
+ - Consistent package structure and scripts
+ - Proper exports and entry points configuration
+
+ # TypeScript Configuration
+ - path: "**/tsconfig.json"
+ instructions: |
+ Review TypeScript configuration for:
+ - Strict type checking maintenance
+ - Consistent compiler options across packages
+ - Proper path mappings and module resolution
+ - Build optimization settings
+
+ # Build Configuration
+ - path: "**/packages/*/tsup.config.ts"
+ instructions: |
+ Review build configuration for:
+ - Consistent build targets and formats
+ - Proper external dependencies handling
+ - Source map and declaration generation
+ - Bundle optimization settings
+
+ # Root Configuration Files
+ - path: "biome.json"
+ instructions: |
+ Review Biome configuration for:
+ - Consistent formatting and linting rules
+ - Import organization rules following established patterns
+ - Accessibility rule consistency
+ - Integration with existing toolchain
+
+ # Documentation
+ - path: "**/README.md"
+ instructions: |
+ Review documentation for:
+ - Clear usage examples and API documentation
+ - Consistency with design system documentation standards
+ - Accessibility guidelines and examples
+ - Installation and setup instructions
+
+ auto_review:
+ enabled: true
+ ignore_title_keywords:
+ - "Version Packages"
+ - "WIP"
+ - "DO NOT MERGE"
+ - "[WIP]"
+ - "draft"
+ - "Release"
+ - "release"
+ drafts: false
+ base_branches:
+ - "main"
+ - "release/v1"
+ auto_incremental_review: true
+chat:
+ auto_reply: true
diff --git a/.github/workflows/chromatic.yaml b/.github/workflows/chromatic.yaml
deleted file mode 100644
index 0dea784a..00000000
--- a/.github/workflows/chromatic.yaml
+++ /dev/null
@@ -1,46 +0,0 @@
-name: Chromatic
-
-on:
- pull_request:
- types: [opened, ready_for_review, synchronize]
- branches:
- - main
- paths:
- - '**/*.stories.@(js|jsx|ts|tsx)'
- push:
- branches:
- - main
- paths:
- - '**/*.stories.@(js|jsx|ts|tsx)'
-
-jobs:
- chromatic:
- runs-on: ubuntu-latest
-
- steps:
- - uses: actions/checkout@v4
- with:
- fetch-depth: 0
- - name: Install pnpm
- uses: pnpm/action-setup@v4
- with:
- run_install: false
- - name: Setup Node.js environment
- uses: actions/setup-node@v4
- with:
- cache: pnpm
- node-version-file: .nvmrc
- - name: Install dependencies
- run: pnpm install
- - name: Run Chromatic
- id: chromatic
- uses: chromaui/action@latest
- with:
- projectToken: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
- - name: comment PR
- uses: thollander/actions-comment-pull-request@v1
- if: ${{ github.event_name == 'pull_request' }}
- env:
- GITHUB_TOKEN: ${{ secrets.RELEASE_BOT_TOKEN }}
- with:
- message: "๐
The Storybook has been updated! Click [here](${{ steps.chromatic.outputs.storybookUrl }}) to check it out."
diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml
index a78d5e92..9bfed66c 100644
--- a/.github/workflows/ci.yaml
+++ b/.github/workflows/ci.yaml
@@ -24,7 +24,7 @@ jobs:
- name: Install dependencies
run: pnpm install
- name: Lint
- run: pnpm --filter="...[origin/${{ github.base_ref }}]" "/lint:*/"
+ run: pnpm --filter="...[origin/${{ github.base_ref }}]" lint
- name: Test
run: pnpm --filter="...[origin/${{ github.base_ref }}]" test
- name: Type check
diff --git a/.github/workflows/storybook-deploy.yaml b/.github/workflows/storybook-deploy.yaml
deleted file mode 100644
index 8eeb9940..00000000
--- a/.github/workflows/storybook-deploy.yaml
+++ /dev/null
@@ -1,38 +0,0 @@
-name: Deploy Storybook
-
-on:
- push:
- branches:
- - main
- paths:
- - 'packages/**/src/**/*.stories.@(js|jsx|ts|tsx)'
- workflow_dispatch:
-
-jobs:
- build:
- runs-on: ubuntu-latest
- container: pandoc/latex
- steps:
- - uses: actions/checkout@v2
- - name: Install mustache (to update the date)
- run: apk add ruby && gem install mustache
- - name: creates output
- run: sh ./build.sh
- - name: Copy .storybook folder
- run: cp -r .storybook output/
- - name: Pushes to another repository
- id: push_directory
- uses: cpina/github-action-push-to-another-repository@main
- env:
- API_TOKEN_GITHUB: ${{ secrets.GH_TOKEN }}
- DESTINATION_USERNAME: "froggy1014"
- DESTINATION_REPO: "side-storybook"
- with:
- source-directory: "output"
- destination-github-username: ${{ env.DESTINATION_USERNAME }}
- destination-repository-name: ${{ env.DESTINATION_REPO }}
- user-email: ${{ secrets.EMAIL }}
- commit-message: ${{ github.event.commits[0].message || 'Manual deployment via workflow_dispatch' }}
- target-branch: main
- - name: Test get variable exported by push-to-another-repository
- run: echo $DESTINATION_CLONED_DIRECTORY
diff --git a/.storybook/preview.ts b/.storybook/preview.ts
index 836149df..1a8d8f33 100644
--- a/.storybook/preview.ts
+++ b/.storybook/preview.ts
@@ -1,7 +1,15 @@
import 'sanitize.css';
import 'sanitize.css/typography.css';
+
import type { Preview } from '@storybook/react';
export default {
tags: ['autodocs'],
+ parameters: {
+ options: {
+ storySort: {
+ order: ['INTRO', 'Components'],
+ },
+ },
+ },
} satisfies Preview;
diff --git a/.templates/component/package.json b/.templates/component/package.json
index 2ed5cdcf..6f655c1f 100644
--- a/.templates/component/package.json
+++ b/.templates/component/package.json
@@ -14,8 +14,7 @@
"build": "tsup",
"build:storybook": "storybook build",
"dev:storybook": "storybook dev -p 6006",
- "lint:biome": "pnpm exec biome lint",
- "lint:eslint": "pnpm exec eslint",
+ "lint": "pnpm exec biome lint",
"test": "vitest",
"typecheck": "tsc",
"prepack": "pnpm run build"
diff --git a/.vscode/extensions.json b/.vscode/extensions.json
index f2a6e32e..162f7a46 100644
--- a/.vscode/extensions.json
+++ b/.vscode/extensions.json
@@ -1,7 +1,6 @@
{
"recommendations": [
"biomejs.biome",
- "dbaeumer.vscode-eslint",
"github.vscode-github-actions"
]
}
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 575d6e0b..b59dd216 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -1,7 +1,26 @@
{
"editor.defaultFormatter": "biomejs.biome",
+ "editor.formatOnSave": true,
"editor.codeActionsOnSave": {
"quickfix.biome": "explicit",
"source.organizeImports.biome": "explicit"
- }
+ },
+ "[typescript]": {
+ "editor.defaultFormatter": "biomejs.biome"
+ },
+ "[javascript]": {
+ "editor.defaultFormatter": "biomejs.biome"
+ },
+ "[javascriptreact]": {
+ "editor.defaultFormatter": "biomejs.biome"
+ },
+ "[typescriptreact]": {
+ "editor.defaultFormatter": "biomejs.biome"
+ },
+ "[json]": {
+ "editor.defaultFormatter": "biomejs.biome"
+ },
+ "[jsonc]": {
+ "editor.defaultFormatter": "biomejs.biome"
+ },
}
diff --git a/README.md b/README.md
index e5f216ad..cfcfc5d3 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,7 @@

# Sipe Design System
-[](https://github.com/sipe-team/side/blob/main/LICENSE)  [](https://67417e47644abe8d4e63f82f-lynsfaiqst.chromatic.com)  [](https://codecov.io/gh/sipe-team/side)
+[](https://github.com/sipe-team/side/blob/main/LICENSE)  [](https://storybook.sipe.team/?path=/docs/what-is-side--docs)  [](https://codecov.io/gh/sipe-team/side)
Sipe Design System is a monorepo-based component library built to modernize and standardize the official Sipe website. Drawing inspiration from our existing design patterns, we're creating a robust, type-safe, and accessible component system that can be used across all Sipe projects.
diff --git a/biome.json b/biome.json
index 27f6d1e0..b2030f4d 100644
--- a/biome.json
+++ b/biome.json
@@ -9,8 +9,10 @@
"indentStyle": "space",
"lineWidth": 120
},
-
"linter": {
+ "domains": {
+ "react": "recommended"
+ },
"enabled": true,
"rules": {
"correctness": {
@@ -30,5 +32,37 @@
"formatter": {
"quoteStyle": "single"
}
+ },
+ "vcs": {
+ "enabled": true,
+ "clientKind": "git",
+ "useIgnoreFile": true,
+ "root": "."
+ },
+ "assist": {
+ "actions": {
+ "source": {
+ "organizeImports": {
+ "level": "on",
+ "options": {
+ "groups": [
+ ":NODE:",
+ ":BLANK_LINE:",
+ ["react", "react/**", "react-*", "react-*/**"],
+ ":BLANK_LINE:",
+ ["@sipe-team/tokens", "@sipe-team/typography", "@sipe-team/**"],
+ ":BLANK_LINE:",
+ ["@vanilla-extract/**"],
+ ":BLANK_LINE:",
+ ["@radix-ui/**"],
+ ":BLANK_LINE:",
+ ":PACKAGE:",
+ ":BLANK_LINE:",
+ ":PATH:"
+ ]
+ }
+ }
+ }
+ }
}
}
diff --git a/build.sh b/build.sh
deleted file mode 100644
index 98817681..00000000
--- a/build.sh
+++ /dev/null
@@ -1,8 +0,0 @@
-#!/bin/sh
-cd ../
-mkdir output
-
-cp -r .storybook output/
-cp -r .gitignore output/
-cp -R ./side/* ./output
-cp -R ./output ./side/
\ No newline at end of file
diff --git a/chromatic.config.json b/chromatic.config.json
deleted file mode 100644
index 2ed4407c..00000000
--- a/chromatic.config.json
+++ /dev/null
@@ -1,4 +0,0 @@
-{
- "$schema": "https://www.chromatic.com/config-file.schema.json",
- "buildScriptName": "build:storybook"
-}
diff --git a/docs/introduction.mdx b/docs/introduction.mdx
index d1153b9c..a14255f6 100644
--- a/docs/introduction.mdx
+++ b/docs/introduction.mdx
@@ -1,17 +1,11 @@
import { Meta } from '@storybook/addon-docs';
import { Typography } from '../packages/typography/src';
-
+
-
+
Sipe Design System
diff --git a/docs/tokens.mdx b/docs/tokens.mdx
new file mode 100644
index 00000000..cede9f15
--- /dev/null
+++ b/docs/tokens.mdx
@@ -0,0 +1,798 @@
+import { Meta } from '@storybook/addon-docs';
+import { color, semanticColor, themeColor } from '../packages/tokens/src/colors/colors';
+import { fontSize, fontWeight, lineHeight } from '../packages/tokens/src/typography/fonts';
+import { Typography } from '../packages/typography/src';
+
+
+
+
+
+
+ Design Tokens
+
+
+ These are the core tokens of the SIPE design system. They define the fundamental elements for design consistency including colors, typography, spacing, and more.
+
+
+
+ {/* Base Colors Section */}
+
+
+ Base Colors
+
+
+ This is the basic color palette used in the SIPE design system. Each color is organized in steps from 50 to 950.
+
+
+
+ {['gray', 'red', 'pink', 'purple', 'cyan', 'blue', 'teal', 'green', 'yellow', 'orange'].map((colorName) => {
+ const colors = Object.entries(color)
+ .filter(([key]) => key.startsWith(colorName))
+ .sort((a, b) => {
+ const aNum = parseInt(a[0].replace(colorName, '')) || 0;
+ const bNum = parseInt(b[0].replace(colorName, '')) || 0;
+ return aNum - bNum;
+ });
+
+ return (
+
+
+ {colorName}
+
+
+ {colors.map(([key, value]) => (
+
{
+ try {
+ await navigator.clipboard.writeText(value);
+ console.log(`Copied: ${value}`);
+ } catch (err) {
+ console.error('Failed to copy: ', err);
+ }
+ }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.transform = 'scale(1.05)';
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.transform = 'scale(1)';
+ }}
+ title={`${key}: ${value}`}>
+
+
+ {key.replace(colorName, '')}
+
+
+ {value}
+
+
+ ))}
+
+
+ );
+ })}
+
+
+
+ {/* Theme Colors Section */}
+
+
+ Theme Colors
+
+
+ These are theme-specific colors used in the SIPE design system. Each theme includes primary, secondary, background, text colors and gradients.
+
+
+
+ {Object.entries(themeColor).map(([themeName, theme]) => (
+
+
+ {themeName}
+
+
+ {Object.entries(theme).filter(([key]) => key !== 'gradient').map(([key, value]) => (
+
{
+ try {
+ await navigator.clipboard.writeText(value);
+ console.log(`Copied: ${value}`);
+ } catch (err) {
+ console.error('Failed to copy: ', err);
+ }
+ }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.transform = 'scale(1.05)';
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.transform = 'scale(1)';
+ }}
+ title={`${key}: ${value}`}>
+
+
+ {key}
+
+
+ {value}
+
+
+ ))}
+
+ {theme.gradient && (
+
{
+ try {
+ await navigator.clipboard.writeText(theme.gradient);
+ console.log(`Copied: ${theme.gradient}`);
+ } catch (err) {
+ console.error('Failed to copy: ', err);
+ }
+ }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.transform = 'scale(1.02)';
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.transform = 'scale(1)';
+ }}
+ title={`gradient: ${theme.gradient}`}>
+
+
+
+ gradient
+
+
+ {theme.gradient}
+
+
+
+ )}
+
+ ))}
+
+
+
+ {/* Semantic Colors Section */}
+
+
+ Semantic Colors
+
+
+ Colors defined by their semantic meaning. These include colors that represent states such as success, warning, error, and more.
+
+
+
+
+ {Object.entries(semanticColor).map(([key, value]) => (
+
{
+ try {
+ await navigator.clipboard.writeText(value);
+ console.log(`Copied: ${value}`);
+ } catch (err) {
+ console.error('Failed to copy: ', err);
+ }
+ }}
+ onMouseEnter={(e) => {
+ e.currentTarget.style.transform = 'scale(1.05)';
+ }}
+ onMouseLeave={(e) => {
+ e.currentTarget.style.transform = 'scale(1)';
+ }}
+ title={`${key}: ${value}`}>
+
+
+ {key}
+
+
+ {value}
+
+
+ ))}
+
+
+
+
+ {/* Typography Section */}
+
+
+ Typography
+
+
+ Typography tokens used in the SIPE design system. Based on the Pretendard Variable font.
+
+
+
+
+ Font Family
+
+
+ Pretendard Variable Font
+
+
+
+ {/* Font Sizes */}
+
+
+ Font Sizes
+
+
+
+
+
+
+ Token
+
+
+ Size
+
+
+ Example
+
+
+
+
+ {Object.entries(fontSize).map(([key, value]) => (
+
+
+ fontSize.{key}
+
+
+ {value}px
+
+
+ SIPE Design System
+
+
+ ))}
+
+
+
+
+
+ {/* Font Weights */}
+
+
+ Font Weights
+
+
+
+
+
+
+ Token
+
+
+ Weight
+
+
+ Example
+
+
+
+
+ {Object.entries(fontWeight).map(([key, value]) => (
+
+
+ fontWeight.{key}
+
+
+ {value}
+
+
+ SIPE Design System
+
+
+ ))}
+
+
+
+
+
+ {/* Line Heights */}
+
+
+ Line Heights
+
+
+
+
+
+
+ Token
+
+
+ Value
+
+
+ Example
+
+
+
+
+ {Object.entries(lineHeight).map(([key, value]) => (
+
+
+ lineHeight.{key}
+
+
+ {Math.round(value * 100)}%
+
+
+ This is an example of line spacing used in the SIPE Design System.
+ When text spans multiple lines, you can see
+ the spacing between lines.
+
+
+ ))}
+
+
+
+
+
+
+ {/* Usage Guidelines */}
+
+
+ Usage Guidelines
+
+
+
+
+ How to Use Tokens
+
+
+
+
+ Import Tokens
+
+
+ {`import { color, semanticColor, themeColor } from '@sipe/tokens';
+import { fontSize, fontWeight, lineHeight } from '@sipe/tokens';`}
+
+
+
+
+
+ Use in Styles
+
+
+ {`const styles = {
+ color: color.gray900,
+ backgroundColor: color.blue50,
+ fontSize: fontSize[16],
+ fontWeight: fontWeight.medium,
+ lineHeight: lineHeight.normal,
+};`}
+
+
+
+
+
+ Best Practices
+
+
+ Always use tokens to avoid hardcoded values
+ Prioritize semantic colors
+ Use theme colors where branding is needed
+ Apply typography scales consistently
+
+
+
+
+
diff --git a/eslint.config.ts b/eslint.config.ts
deleted file mode 100644
index f4d23c80..00000000
--- a/eslint.config.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-import { FlatCompat } from '@eslint/eslintrc';
-import eslint from '@eslint/js';
-import reactPlugin from 'eslint-plugin-react';
-import hooksPlugin from 'eslint-plugin-react-hooks';
-import globals from 'globals';
-import tseslint from 'typescript-eslint';
-
-const compat = new FlatCompat();
-
-// ? https://typescript-eslint.io/getting-started#step-2-configuration
-export default tseslint.config(
- // * Base ESLint recommended configuration
- eslint.configs.recommended,
- // * TypeScript ESLint recommended configuration
- tseslint.configs.recommended,
- // * Custom rules configuration
- {
- rules: {
- '@typescript-eslint/ban-ts-comment': 'off',
- '@typescript-eslint/no-unused-vars': 'off',
- '@typescript-eslint/no-explicit-any': 'off',
- 'no-duplicate-imports': 'off',
- 'no-unused-expressions': 'off',
- '@typescript-eslint/no-unused-expressions': [
- 'error',
- {
- allowShortCircuit: false,
- allowTernary: true,
- },
- ],
- },
- },
-
- // * React plugin configuration
- {
- files: ['**/*.{ts,tsx}'],
- plugins: {
- react: reactPlugin,
- },
- languageOptions: {
- globals: {
- ...globals.serviceworker,
- ...globals.browser,
- },
- },
- rules: {
- ...reactPlugin.configs.recommended.rules,
- 'react/react-in-jsx-scope': 'off',
- 'react/prop-types': 'off',
- },
- settings: {
- react: {
- version: 'detect',
- },
- },
- },
-
- // * React Hooks plugin configuration
- ...compat.extends('plugin:react-hooks/recommended'),
- {
- files: ['**/*.{ts,tsx}'],
- plugins: {
- 'react-hooks': hooksPlugin,
- },
- rules: {
- ...hooksPlugin.configs.recommended.rules,
- },
- },
-
- // * Storybook plugin configuration
- ...compat.extends('plugin:storybook/recommended'),
- {
- files: ['**/*.stories.@(ts|tsx|js|jsx|mjs|cjs)'],
- rules: {},
- },
-
- // Ignore files configuration
- {
- ignores: ['**/*/dist/', '**/node_modules/', '*.config.*'],
- },
-);
diff --git a/package.json b/package.json
index fa4a82db..ab0409ae 100644
--- a/package.json
+++ b/package.json
@@ -5,16 +5,14 @@
"scripts": {
"prepare": "husky",
"cz": "cz",
- "format": "pnpm /^format:.*/",
- "format:biome": "biome format --write",
- "lint": "pnpm /^lint:.*/",
- "lint:biome": "biome lint --write",
- "lint:eslint": "eslint --fix",
+ "format": "biome format --write",
+ "lint": "biome lint --write",
"dev:storybook": "storybook dev -p 6006 public",
"build:storybook": "storybook build public",
"serve:storybook": "serve storybook-static -p 6006",
"create:component": "tsx scripts/createComponent.ts create",
- "test": "vitest"
+ "test": "vitest",
+ "clean": "pnpm --filter './www' clean && pnpm --filter './packages/*' clean"
},
"devDependencies": {
"@biomejs/biome": "^2.4.10",
@@ -24,7 +22,6 @@
"@commitlint/config-conventional": "^19.6.0",
"@commitlint/cz-commitlint": "^19.6.1",
"@commitlint/types": "^19.5.0",
- "@eslint/eslintrc": "^3.2.0",
"@storybook/addon-docs": "^8.4.7",
"@storybook/addon-essentials": "catalog:",
"@storybook/addon-interactions": "catalog:",
@@ -36,19 +33,15 @@
"@storybook/test": "catalog:",
"@storybook/theming": "^8.4.7",
"@tsconfig/strictest": "^2.0.5",
- "@types/eslint__eslintrc": "^2.1.2",
"@types/node": "^22.8.1",
"@types/react": "^18.3.12",
"@types/react-dom": "^18.3.1",
- "@typescript-eslint/parser": "^8.19.0",
+ "@vanilla-extract/esbuild-plugin": "catalog:",
+ "@vanilla-extract/vite-plugin": "catalog:",
"@vitest/coverage-v8": "catalog:",
"chromatic": "^11.19.0",
"clipanion": "4.0.0-rc.4",
"commitizen": "^4.3.1",
- "eslint": "^9.20.0",
- "eslint-plugin-react": "^7.37.3",
- "eslint-plugin-react-hooks": "^5.1.0",
- "eslint-plugin-storybook": "^0.11.2",
"globals": "^15.14.0",
"husky": "^9.1.7",
"knip": "catalog:",
@@ -58,18 +51,13 @@
"tsup": "catalog:",
"tsx": "^4.19.2",
"typescript": "catalog:",
- "typescript-eslint": "^8.19.1",
+ "vite": "catalog:",
"vitest": "catalog:"
},
"packageManager": "pnpm@9.7.1",
"lint-staged": {
- "*.{ts,tsx}": [
- "pnpm format",
- "pnpm lint"
- ],
- "*.{json,css,js}": [
- "pnpm format:biome",
- "pnpm lint:biome"
+ "*.{ts,tsx,css,js}": [
+ "biome check --write --unsafe --no-errors-on-unmatched"
]
},
"config": {
diff --git a/packages/reset/.storybook/main.ts b/packages/accordion/.storybook/main.ts
similarity index 100%
rename from packages/reset/.storybook/main.ts
rename to packages/accordion/.storybook/main.ts
diff --git a/packages/accordion/.storybook/preview.ts b/packages/accordion/.storybook/preview.ts
new file mode 100644
index 00000000..6c95c9f1
--- /dev/null
+++ b/packages/accordion/.storybook/preview.ts
@@ -0,0 +1,8 @@
+import 'sanitize.css';
+import 'sanitize.css/typography.css';
+
+import type { Preview } from '@storybook/react';
+
+export default {
+ tags: ['autodocs'],
+} satisfies Preview;
diff --git a/packages/accordion/README.md b/packages/accordion/README.md
new file mode 100644
index 00000000..a965dc9f
--- /dev/null
+++ b/packages/accordion/README.md
@@ -0,0 +1,108 @@
+# Accordion
+
+A collapsible content component for the Sipe Design System.
+
+## Installation
+
+```bash
+pnpm add @sipe-team/accordion
+```
+
+## Usage
+
+```tsx
+import { Accordion } from '@sipe-team/accordion';
+
+function Example() {
+ return (
+
+
+
+ Trigger
+
+
+ Content
+
+
+
+ );
+}
+```
+
+## Features
+
+- Smooth open/close animations
+- Accessible by default with correct ARIA attributes
+- Customizable styling with vanilla-extract
+- TypeScript support
+- Using compound component pattern
+
+## Components
+
+### Accordion.Root
+
+The container component for accordion items.
+
+#### Props
+
+| Name | Type | Default | Description |
+| -------- | --------- | ------- | ---------------------------------------------------------- |
+| children | ReactNode | - | The accordion items to render |
+| asChild | boolean | false | Change the component to the HTML tag or component supplied |
+| className | string | - | Additional CSS class name|
+| ...props | - | - | All other props are passed to the underlying div element |
+
+### Accordion.Item
+
+An individual accordion section with a header and collapsible content.
+
+#### Props
+
+| Name | Type | Default | Description |
+| ----------- | --------- | ------- | -------------------------------------------------------- |
+| children | ReactNode | - | The content to display when the accordion item is open |
+| defaultOpen | boolean | false | Whether the accordion item should be open by default |
+| className | string | - | Additional CSS class name|
+| ...props | - | - | All other props are passed to the underlying div element |
+
+
+### Accordion.Trigger
+
+The button that toggles the accordion item.
+
+#### Props
+
+| Name | Type | Default | Description |
+| ----------- | --------- | ------- | -------------------------------------------------------- |
+| children | ReactNode | - | TThe content to display in the trigger button|
+| className | string | - | Additional CSS class name|
+| ...props | - | - | All other props are passed to the underlying div element |
+
+
+### Accordion.Content
+
+The collapsible content section.
+
+#### Props
+
+| Name | Type | Default | Description |
+| ----------- | --------- | ------- | -------------------------------------------------------- |
+| children | ReactNode | - | The content to display when the accordion item is open |
+| asChild | boolean | false | Change the component to the HTML tag or component supplied |
+| className | string | - | Additional CSS class name|
+| ...props | - | - | All other props are passed to the underlying div element |
+
+
+## Styling
+
+- This component uses vanilla-extract for styling. The styles are defined in `Accordion.css.ts`.
+- You can customize the appearance by passing className props to individual components.
+
+
+## Preview
+
+- Run Storybook to preview Accodion
+
+```bash
+pnpm dev:storybook
+```
diff --git a/packages/accordion/package.json b/packages/accordion/package.json
new file mode 100644
index 00000000..e9328151
--- /dev/null
+++ b/packages/accordion/package.json
@@ -0,0 +1,73 @@
+{
+ "name": "@sipe-team/accordion",
+ "description": "Accordion for Sipe Design System",
+ "version": "0.1.0",
+ "license": "MIT",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/sipe-team/side"
+ },
+ "type": "module",
+ "exports": "./src/index.ts",
+ "files": ["dist"],
+ "scripts": {
+ "build": "tsup",
+ "build:storybook": "storybook build",
+ "dev:storybook": "storybook dev -p 6006",
+ "lint:biome": "pnpm exec biome lint",
+ "lint:eslint": "pnpm exec eslint",
+ "test": "vitest",
+ "typecheck": "tsc",
+ "prepack": "pnpm run build"
+ },
+ "dependencies": {
+ "@radix-ui/react-slot": "^1.1.0",
+ "@sipe-team/tokens": "workspace:*",
+ "@vanilla-extract/css": "catalog:",
+ "@vanilla-extract/recipes": "^0.5.5",
+ "clsx": "^2.1.0",
+ "@sipe-team/icon": "workspace:*"
+ },
+ "devDependencies": {
+ "@sipe-team/typography": "workspace:*",
+ "@storybook/addon-essentials": "catalog:",
+ "@storybook/addon-interactions": "catalog:",
+ "@storybook/addon-links": "catalog:",
+ "@storybook/blocks": "catalog:",
+ "@storybook/react": "catalog:",
+ "@storybook/react-vite": "catalog:",
+ "@storybook/test": "catalog:",
+ "@testing-library/jest-dom": "catalog:",
+ "@testing-library/react": "catalog:",
+ "@types/react": "^18.3.12",
+ "happy-dom": "catalog:",
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1",
+ "storybook": "catalog:",
+ "tsup": "catalog:",
+ "typescript": "catalog:",
+ "vitest": "catalog:"
+ },
+ "peerDependencies": {
+ "react": ">= 18",
+ "react-dom": ">= 18"
+ },
+ "publishConfig": {
+ "access": "public",
+ "registry": "https://npm.pkg.github.com",
+ "exports": {
+ ".": {
+ "import": {
+ "types": "./dist/index.d.ts",
+ "default": "./dist/index.js"
+ },
+ "require": {
+ "types": "./dist/index.d.cts",
+ "default": "./dist/index.cjs"
+ }
+ },
+ "./styles.css": "./dist/index.css"
+ }
+ },
+ "sideEffects": false
+}
diff --git a/packages/accordion/src/Accordion.css.ts b/packages/accordion/src/Accordion.css.ts
new file mode 100644
index 00000000..7a715e54
--- /dev/null
+++ b/packages/accordion/src/Accordion.css.ts
@@ -0,0 +1,81 @@
+import { color } from '@sipe-team/tokens';
+
+import { style } from '@vanilla-extract/css';
+import { recipe } from '@vanilla-extract/recipes';
+
+const whiteColor = color.white;
+const backgroundColor = '#1a202c';
+const sipeAccordionBackGroundColor = '#2d3748';
+
+export const accordionRoot = style({
+ width: '100%',
+ borderRadius: '12px',
+ overflow: 'hidden',
+ padding: '20px',
+ backgroundColor: backgroundColor,
+ border: `1px solid ${sipeAccordionBackGroundColor}`,
+});
+
+export const accordionItem = style({
+ borderBottom: `1px solid ${backgroundColor}`,
+ ':last-child': {
+ borderBottom: 'none',
+ },
+});
+
+export const accordionTrigger = style({
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'space-between',
+ width: '100%',
+ padding: '16px',
+ backgroundColor: backgroundColor,
+ border: 'none',
+ cursor: 'pointer',
+ textAlign: 'left',
+ color: whiteColor,
+});
+
+export const accordionContentWrapper = recipe({
+ base: {
+ overflow: 'hidden',
+ borderRadius: '8px',
+ backgroundColor: sipeAccordionBackGroundColor,
+ },
+ variants: {
+ shouldTransition: {
+ true: {
+ transition: 'height 0.3s cubic-bezier(0.4, 0, 0.2, 1)',
+ },
+ false: {
+ transition: 'none',
+ },
+ },
+ },
+ defaultVariants: {
+ shouldTransition: false,
+ },
+});
+
+export const accordionContentInner = style({
+ padding: '12px 16px',
+});
+
+export const chevron = recipe({
+ base: {
+ transition: 'transform 0.3s ease',
+ },
+ variants: {
+ isOpen: {
+ true: {
+ transform: 'rotate(0deg)',
+ },
+ false: {
+ transform: 'rotate(180deg)',
+ },
+ },
+ },
+ defaultVariants: {
+ isOpen: false,
+ },
+});
diff --git a/packages/accordion/src/Accordion.stories.tsx b/packages/accordion/src/Accordion.stories.tsx
new file mode 100644
index 00000000..e0e6407a
--- /dev/null
+++ b/packages/accordion/src/Accordion.stories.tsx
@@ -0,0 +1,155 @@
+import { color } from '@sipe-team/tokens';
+import { Typography } from '@sipe-team/typography';
+
+import type { Meta, StoryObj } from '@storybook/react';
+
+import { Accordion } from './Accordion';
+
+const contentTextColor = color.gray200;
+
+const meta: Meta
= {
+ title: 'Components/Accordion',
+ component: Accordion,
+ parameters: {
+ layout: 'centered',
+ },
+ tags: ['autodocs'],
+};
+
+export default meta;
+
+type Story = StoryObj;
+
+export const Basic: Story = {
+ render: () => (
+
+
+
+
+ ์๋๊ถ์ ๊ฑฐ์ฃผํ๊ณ ์์ง ์์ง๋ง ์ฃผ์ ํ๋ ์ง์ญ์ ์๋๊ถ์ธ๋ฐ ํ๋์ ํ ์ ์๋์?
+
+
+
+
+
+ ๋ค ๊ฐ๋ฅํฉ๋๋ค. ๋ค๋ง, ๋ชจ๋ ํ๋์ด ์๋๊ถ์์ ์งํ๋ ์์ ์ผ๋ก, ๊ฒฐ์์ด๋ ์ง๊ฐ์ ํ๋ ๊ฒฝ์ฐ ์๋ฃ ์กฐ๊ฑด์ ์ํฅ์ด
+ ์์ ์ ์์ต๋๋ค.
+
+
+
+
+ ),
+};
+
+export const WithDefaultOpen: Story = {
+ render: () => (
+
+
+
+ ์ด ํญ๋ชฉ์ ๊ธฐ๋ณธ์ผ๋ก ์ด๋ ค์์ต๋๋ค.
+
+
+
+
+ `Accordion.Item` ์ปดํฌ๋ํธ์ `defaultOpen` prop์ ์ ๋ฌํ์ฌ ๊ธฐ๋ณธ ์ํ๋ฅผ ์ด๋ฆผ์ผ๋ก ์ค์ ํ ์ ์์ต๋๋ค.
+
+
+
+
+
+
+ ์ด ํญ๋ชฉ์ ๋ซํ์์ต๋๋ค.
+
+
+
+
+ ๋ ๋ฒ์งธ ํญ๋ชฉ์ ๋ด์ฉ์
๋๋ค.
+
+
+
+
+ ),
+};
+
+export const AccordionList: Story = {
+ render: () => (
+
+
+
+
+ 4๊ธฐ ์ ๋ฐ ๊ธฐ์ค์ ์ด๋ป๊ฒ ๋๋์?
+
+
+
+
+ ํจ๊ป ๋ํํ๊ณ ์ถ์, ๊ตฌ์ฑ์๋ค์ ๊ธฐ์ ์ ์ฑ์ฅ์ ๊ธฐ์ฌํ ์ ์๋, ๊ทธ๋ฆฌ๊ณ ๋์๋ฆฌ ํ๋์ ์ฑ์คํ๊ฒ ์ฐธ์ฌ ๊ฐ๋ฅํ
+ ํ์ง ๊ฐ๋ฐ์๋ฅผ ์ ํฌ์ ์ธ์ฌ์์ผ๋ก ์ผ๊ณ ์์ต๋๋ค.
+
+
+
+
+
+
+
+
+ ์๋๊ถ์ ๊ฑฐ์ฃผํ๊ณ ์์ง ์์ง๋ง ์ฃผ์ ํ๋ ์ง์ญ์ ์๋๊ถ์ธ๋ฐ ํ๋์ ํ ์ ์๋์?
+
+
+
+
+
+ ๋ค ๊ฐ๋ฅํฉ๋๋ค. ๋ค๋ง, ๋ชจ๋ ํ๋์ด ์๋๊ถ์์ ์งํ๋ ์์ ์ผ๋ก, ๊ฒฐ์์ด๋ ์ง๊ฐ์ ํ๋ ๊ฒฝ์ฐ ์๋ฃ ์กฐ๊ฑด์ ์ํฅ์ด
+ ์์ ์ ์์ต๋๋ค.
+
+
+
+
+
+
+
+ 4๊ธฐ ์ ๋ฐ ์ธ์์ ๋ช๋ช
์ธ๊ฐ์?
+
+
+
+
+ 4๊ธฐ๋ 40๋ช
๋ด์ธ๋ก ๊ตฌ์ฑํ ์์ ์ด๋ฉฐ, ์ ๋ฐ ์ธ์์ ์ง์์ ์์ ๋ฐ๋ผ์ ๋ณ๋๋ ์ ์์ต๋๋ค.
+
+
+
+
+
+
+
+ ๋ฏธ์ฑ๋
์์ด์ง๋ง ๊ฐ๋ฐ์๋ก ๊ทผ๋ฌดํ๊ณ ์๋๋ฐ ์ง์ํ ์ ์๋์?
+
+
+
+
+ ์๋์ค. ์์ฝ์ง๋ง ์ฌ์ดํ๋ ๋ฏธ์ฑ๋
์๋ ์ ๋ฐ ๋์์์ ์ ์ธํ๊ณ ์์ต๋๋ค.
+
+
+
+
+
+ ),
+};
+
+export const TriggerUsingAsChild: Story = {
+ render: () => (
+
+
+
+
+
asChild prop์ ์ฌ์ฉํ์ฌ `div`๋ก ๋ ๋๋ง๋ Trigger
+
+
+
+
+
+ `Accordion.Trigger` ์ปดํฌ๋ํธ์ `asChild` prop์ ์ ๋ฌํ์ฌ ๋ค๋ฅธ HTML ์์๋ก ๋ ๋๋งํ ์ ์์ต๋๋ค.
+
+
+
+
+ ),
+};
diff --git a/packages/accordion/src/Accordion.test.tsx b/packages/accordion/src/Accordion.test.tsx
new file mode 100644
index 00000000..1d4948db
--- /dev/null
+++ b/packages/accordion/src/Accordion.test.tsx
@@ -0,0 +1,190 @@
+import { fireEvent, render, screen } from '@testing-library/react';
+import { describe, expect, test } from 'vitest';
+
+import { Accordion } from './Accordion';
+
+describe('Accordion.Root ๊ธฐ๋ณธ ์คํ์ผ', () => {
+ test('Accordion์ Root์ border-radius๋ฅผ ์ฃผ์
ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ๊ฐ "12px"์ผ๋ก border-radius๋ฅผ ์ค์ ํ๋ค.', () => {
+ render(
+
+
+ Test Trigger
+ Test Content
+
+ ,
+ );
+ const root = screen.getByText('Test Trigger').closest('[class*="accordionRoot"]');
+ expect(root).toHaveStyle({ borderRadius: '12px' });
+ });
+
+ test('Accordion์ Root์ border ์ต์
์ ์ฃผ์
ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ๊ฐ "1px solid #2d3748"๋ก border๋ฅผ ์ค์ ํ๋ค.', () => {
+ render(
+
+
+ Test Trigger
+ Test Content
+
+ ,
+ );
+ const root = screen.getByText('Test Trigger').closest('[class*="accordionRoot"]');
+ expect(root).toHaveStyle({ border: '1px solid #2d3748' });
+ });
+
+ test('Accordion์ Root์ background-color ์ต์
์ ์ฃผ์
ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ๊ฐ "#1a202c"๋ก background-color๋ฅผ ์ค์ ํ๋ค.', () => {
+ render(
+
+
+ Test Trigger
+ Test Content
+
+ ,
+ );
+ const root = screen.getByText('Test Trigger').closest('[class*="accordionRoot"]');
+ expect(root).toHaveStyle({ backgroundColor: '#1a202c' });
+ });
+
+ test('Accordion์ Root์ padding ์ต์
์ ์ฃผ์
ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ๊ฐ "20px"๋ก padding์ ์ค์ ํ๋ค.', () => {
+ render(
+
+
+ Test Trigger
+ Test Content
+
+ ,
+ );
+ const root = screen.getByText('Test Trigger').closest('[class*="accordionRoot"]');
+ expect(root).toHaveStyle({ padding: '20px' });
+ });
+});
+
+describe('Accordion.Trigger ๊ธฐ๋ณธ ์คํ์ผ ๋ฐ ์ปดํฌ๋ํธ ๊ตฌ์กฐ', () => {
+ test('Accordion์ Trigger์ ์กด์ฌํ๋ ํ
์คํธ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ผ์ชฝ ์ ๋ ฌ๋๋ค.', () => {
+ render(
+
+
+ Test Trigger
+ Test Content
+
+ ,
+ );
+ const trigger = screen.getByText('Test Trigger').closest('[class*="accordionTrigger"]');
+ expect(trigger).toHaveStyle({
+ textAlign: 'left',
+ });
+ });
+
+ test('aria-expanded๋ฅผ ํตํด ์์ ํ์ฅ ๋ฐ ์ถ์ ์ฌ๋ถ๋ฅผ ํ์ธํ ์ ์๋ค', () => {
+ render(
+
+
+ Test Trigger
+ Test Content
+
+ ,
+ );
+ const trigger = screen.getByRole('button');
+ expect(trigger).toHaveAttribute('aria-expanded', 'false');
+ fireEvent.click(trigger);
+ expect(trigger).toHaveAttribute('aria-expanded', 'true');
+ fireEvent.click(trigger);
+ expect(trigger).toHaveAttribute('aria-expanded', 'false');
+ });
+
+ test('Accordion.Indicator๋ฅผ ์ฌ์ฉํ์ฌ ์์ด์ฝ์ ๋ ๋๋งํ ์ ์๋ค', () => {
+ render(
+
+
+
+ Test Trigger
+
+
+ Test Content
+
+ ,
+ );
+ const trigger = screen.getByRole('button');
+ expect(trigger.querySelector('svg')).toBeInTheDocument();
+ });
+});
+
+describe('Accordion.Content ๊ธฐ๋ณธ ์คํ์ผ', () => {
+ test('Accordion์ Content์ borderRadius๋ฅผ ์ฃผ์
ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ๊ฐ 8px์ผ๋ก borderRadius๋ฅผ ์ค์ ํ๋ค.', () => {
+ render(
+
+
+ Test Trigger
+ Test Content
+
+ ,
+ );
+
+ const contentElement = screen.getByText('Test Content').closest('[class*="accordionContentWrapper"]');
+ expect(contentElement).toHaveStyle({ borderRadius: '8px' });
+ });
+
+ test('Accordion์ Content์ background-color๋ฅผ ์ฃผ์
ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ๊ฐ #2d3748์ผ๋ก background-color๋ฅผ ์ค์ ํ๋ค.', () => {
+ render(
+
+
+ Test Trigger
+ Test Content
+
+ ,
+ );
+
+ const contentElement = screen.getByText('Test Content').closest('[class*="accordionContentWrapper"]');
+ expect(contentElement).toHaveStyle({ backgroundColor: '#2d3748' });
+ });
+
+ test('Accordion์ Content์ padding์ ์ฃผ์
ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ๊ฐ 12px 16px์ผ๋ก padding์ ์ค์ ํ๋ค.', () => {
+ render(
+
+
+ Test Trigger
+ Test Content
+
+ ,
+ );
+
+ const contentElement = screen.getByText('Test Content');
+ expect(contentElement).toHaveStyle({ padding: '12px 16px' });
+ });
+});
+
+describe('Accordion ๋์', () => {
+ test('Trigger ํด๋ฆญ ์ Content์ ๋ด์ฉ์ ๋
ธ์ถ ๋ฐ ์จ๊น ์ฒ๋ฆฌํ ์ ์๋ค', () => {
+ render(
+
+
+ Test Trigger
+ Test Content
+
+ ,
+ );
+ const trigger = screen.getByRole('button');
+ const wrapper = screen.getByText('Test Content').closest('[class*="accordionContentWrapper"]');
+ expect(wrapper).toHaveAttribute('aria-hidden', 'true');
+ fireEvent.click(trigger);
+ expect(wrapper).toHaveAttribute('aria-hidden', 'false');
+ fireEvent.click(trigger);
+ expect(wrapper).toHaveAttribute('aria-hidden', 'true');
+ });
+});
+
+describe('Accordion ๊ตฌ์กฐ', () => {
+ test('Accordion์ children์ผ๋ก ์ ๋ฌํ ์์๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๋งํ ์ ์๋ค', () => {
+ render(
+
+
+ Custom Trigger
+
+ Paragraph
+ Span
+
+
+ ,
+ );
+ expect(screen.getByText('Paragraph')).toBeInTheDocument();
+ expect(screen.getByText('Span')).toBeInTheDocument();
+ });
+});
diff --git a/packages/accordion/src/Accordion.tsx b/packages/accordion/src/Accordion.tsx
new file mode 100644
index 00000000..7f6e76f4
--- /dev/null
+++ b/packages/accordion/src/Accordion.tsx
@@ -0,0 +1,125 @@
+import type { ReactNode } from 'react';
+import { type ComponentProps, type ForwardedRef, forwardRef, useState } from 'react';
+
+import { AccordionArrowIcon } from '@sipe-team/icon';
+
+import { Slot } from '@radix-ui/react-slot';
+
+import { clsx as cx } from 'clsx';
+
+import * as styles from './Accordion.css';
+import { AccordionItemContext, useAccordionItemContext } from './context/AccordionItemContext';
+import { useAccordionAnimation } from './hooks/useAccordionAnimation';
+export interface AccordionRootProps extends ComponentProps<'div'> {
+ children: ReactNode;
+ asChild?: boolean;
+}
+export interface AccordionItemProps {
+ children: ReactNode;
+ className?: string;
+ defaultOpen?: boolean;
+}
+
+export interface AccordionTriggerProps extends ComponentProps<'button'> {
+ children: ReactNode;
+ asChild?: boolean;
+ className?: string;
+}
+
+export interface AccordionContentProps {
+ children: ReactNode;
+ className?: string;
+ asChild?: boolean;
+}
+
+export const AccordionRoot = forwardRef(function AccordionRoot(
+ { children, asChild, className, ...props }: AccordionRootProps,
+ ref: ForwardedRef,
+) {
+ const Component = asChild ? Slot : 'div';
+ return (
+
+ {children}
+
+ );
+});
+
+export const AccordionItem = forwardRef(function AccordionItem(
+ { children, className, defaultOpen = false, ...props }: AccordionItemProps,
+ ref: ForwardedRef,
+) {
+ const [isOpen, setIsOpen] = useState(defaultOpen);
+
+ const toggleAccordion = () => {
+ setIsOpen((prev) => !prev);
+ };
+
+ const contextValue = { isOpen, toggleAccordion };
+
+ return (
+
+
+ {children}
+
+
+ );
+});
+
+export const AccordionTrigger = forwardRef(function AccordionTrigger(
+ { children, className, asChild, ...props }: AccordionTriggerProps,
+ ref: ForwardedRef,
+) {
+ const { isOpen, toggleAccordion } = useAccordionItemContext();
+ const Component = asChild ? Slot : 'button';
+ const buttonProps = asChild ? {} : { type: 'button' as const };
+
+ return (
+
+ {children}
+
+ );
+});
+
+export const AccordionIndicator = () => {
+ const { isOpen } = useAccordionItemContext();
+ return ;
+};
+
+export const AccordionContent = ({ children, asChild, className, ...props }: AccordionContentProps) => {
+ const { isOpen } = useAccordionItemContext();
+ const { ref, height, shouldTransition } = useAccordionAnimation(isOpen);
+
+ const Component = asChild ? Slot : 'div';
+
+ return (
+
+
+ {children}
+
+
+ );
+};
+
+export const Accordion = Object.assign(AccordionRoot, {
+ Root: AccordionRoot,
+ Item: AccordionItem,
+ Trigger: AccordionTrigger,
+ Indicator: AccordionIndicator,
+ Content: AccordionContent,
+});
+
+Accordion.displayName = 'Accordion';
diff --git a/packages/accordion/src/context/AccordionItemContext.tsx b/packages/accordion/src/context/AccordionItemContext.tsx
new file mode 100644
index 00000000..6bd4872a
--- /dev/null
+++ b/packages/accordion/src/context/AccordionItemContext.tsx
@@ -0,0 +1,19 @@
+import { createContext, useContext } from 'react';
+
+interface AccordionItemContextValue {
+ isOpen: boolean;
+ toggleAccordion: () => void;
+}
+
+export const AccordionItemContext = createContext({
+ isOpen: false,
+ toggleAccordion: () => {},
+});
+
+export const useAccordionItemContext = () => {
+ const context = useContext(AccordionItemContext);
+ if (!context) {
+ throw new Error('useAccordionItemContext must be used within an AccordionItem');
+ }
+ return context;
+};
diff --git a/packages/accordion/src/hooks/useAccordionAnimation.ts b/packages/accordion/src/hooks/useAccordionAnimation.ts
new file mode 100644
index 00000000..6abf2159
--- /dev/null
+++ b/packages/accordion/src/hooks/useAccordionAnimation.ts
@@ -0,0 +1,37 @@
+import { useLayoutEffect, useRef, useState } from 'react';
+
+export const useAccordionAnimation = (isOpen: boolean) => {
+ const ref = useRef(null);
+ const [height, setHeight] = useState('0px');
+ const [shouldTransition, setShouldTransition] = useState(false);
+
+ useLayoutEffect(() => {
+ const el = ref.current;
+
+ if (isOpen) {
+ setHeight(`${el?.scrollHeight}px`);
+ setShouldTransition(true);
+
+ const handleTransitionEnd = () => {
+ if (isOpen) setHeight('auto');
+ };
+ el?.addEventListener('transitionend', handleTransitionEnd, { once: true });
+ return () => el?.removeEventListener('transitionend', handleTransitionEnd);
+ }
+
+ if (el?.style.height === 'auto') {
+ setHeight(`${el?.scrollHeight}px`);
+ requestAnimationFrame(() => {
+ setShouldTransition(true);
+ setHeight('0px');
+ });
+ } else {
+ setShouldTransition(true);
+ setHeight('0px');
+ }
+
+ return () => {};
+ }, [isOpen]);
+
+ return { ref, height, shouldTransition };
+};
diff --git a/packages/accordion/src/index.ts b/packages/accordion/src/index.ts
new file mode 100644
index 00000000..63f62bc6
--- /dev/null
+++ b/packages/accordion/src/index.ts
@@ -0,0 +1 @@
+export * from './Accordion';
diff --git a/packages/accordion/tsconfig.json b/packages/accordion/tsconfig.json
new file mode 100644
index 00000000..4082f16a
--- /dev/null
+++ b/packages/accordion/tsconfig.json
@@ -0,0 +1,3 @@
+{
+ "extends": "../../tsconfig.json"
+}
diff --git a/packages/accordion/tsup.config.ts b/packages/accordion/tsup.config.ts
new file mode 100644
index 00000000..c533199b
--- /dev/null
+++ b/packages/accordion/tsup.config.ts
@@ -0,0 +1,8 @@
+import { defineConfig } from 'tsup';
+
+export default defineConfig({
+ entry: ['src/index.ts'],
+ clean: true,
+ dts: true,
+ format: ['esm', 'cjs'],
+});
diff --git a/packages/accordion/vitest.config.ts b/packages/accordion/vitest.config.ts
new file mode 100644
index 00000000..e663baf0
--- /dev/null
+++ b/packages/accordion/vitest.config.ts
@@ -0,0 +1,12 @@
+import { defineProject, mergeConfig } from 'vitest/config';
+
+import defaultConfig from '../../vitest.config';
+
+export default mergeConfig(
+ defaultConfig,
+ defineProject({
+ test: {
+ setupFiles: './vitest.setup.ts',
+ },
+ }),
+);
diff --git a/packages/accordion/vitest.setup.ts b/packages/accordion/vitest.setup.ts
new file mode 100644
index 00000000..7b0828bf
--- /dev/null
+++ b/packages/accordion/vitest.setup.ts
@@ -0,0 +1 @@
+import '@testing-library/jest-dom';
diff --git a/packages/avatar/global.d.ts b/packages/avatar/global.d.ts
deleted file mode 100644
index 60260a3a..00000000
--- a/packages/avatar/global.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-declare module '*.module.css';
diff --git a/packages/avatar/package.json b/packages/avatar/package.json
index 5a3b3816..3a879dc1 100644
--- a/packages/avatar/package.json
+++ b/packages/avatar/package.json
@@ -13,6 +13,7 @@
"scripts": {
"build": "tsup",
"build:storybook": "storybook build",
+ "clean": "rm -rf node_modules dist",
"dev:storybook": "storybook dev -p 6006",
"lint": "biome lint .",
"test": "vitest",
@@ -37,6 +38,7 @@
"@types/react": "catalog:react",
"@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.0.1",
+ "@vanilla-extract/css": "catalog:",
"happy-dom": "catalog:",
"react": "catalog:react",
"react-dom": "catalog:react",
diff --git a/packages/avatar/src/Avatar.css.ts b/packages/avatar/src/Avatar.css.ts
new file mode 100644
index 00000000..e716b4b5
--- /dev/null
+++ b/packages/avatar/src/Avatar.css.ts
@@ -0,0 +1,57 @@
+import { style, styleVariants } from '@vanilla-extract/css';
+import { AvatarShape, AvatarSize } from './Avatar';
+
+export const root = style({
+ alignItems: 'center',
+ backgroundColor: '#e2e8f0',
+ display: 'flex',
+ justifyContent: 'center',
+ overflow: 'hidden',
+});
+
+export const size = styleVariants({
+ [AvatarSize.xs]: {
+ height: 24,
+ width: 24,
+ },
+ [AvatarSize.sm]: {
+ height: 32,
+ width: 32,
+ },
+ [AvatarSize.md]: {
+ height: 40,
+ width: 40,
+ },
+ [AvatarSize.lg]: {
+ height: 70,
+ width: 70,
+ },
+ [AvatarSize.xl]: {
+ height: 96,
+ width: 96,
+ },
+});
+
+export const shape = styleVariants({
+ [AvatarShape.circle]: {
+ borderRadius: '50%',
+ },
+ [AvatarShape.rounded]: {
+ borderRadius: 4,
+ },
+ [AvatarShape.square]: {
+ borderRadius: 0,
+ },
+});
+
+export const image = style({
+ height: '100%',
+ objectFit: 'cover',
+ width: '100%',
+});
+
+export const fallback = style({
+ color: '#2d3748',
+ fontSize: '0.8rem',
+ textAlign: 'center',
+});
diff --git a/packages/avatar/src/Avatar.module.css b/packages/avatar/src/Avatar.module.css
deleted file mode 100644
index b9b7fafd..00000000
--- a/packages/avatar/src/Avatar.module.css
+++ /dev/null
@@ -1,22 +0,0 @@
-.avatar {
- width: var(--avatar-size);
- height: var(--avatar-size);
- border-radius: var(--avatar-shape);
- display: flex;
- align-items: center;
- justify-content: center;
- overflow: hidden;
- background-color: #e2e8f0;
-}
-
-.image {
- width: 100%;
- height: 100%;
- object-fit: cover;
-}
-
-.fallback {
- font-size: 0.8rem;
- color: #2d3748;
- text-align: center;
-}
diff --git a/packages/avatar/src/Avatar.test.tsx b/packages/avatar/src/Avatar.test.tsx
index 5cec13e5..f80e003d 100644
--- a/packages/avatar/src/Avatar.test.tsx
+++ b/packages/avatar/src/Avatar.test.tsx
@@ -1,8 +1,7 @@
import { faker } from '@faker-js/faker';
import { render, screen } from '@testing-library/react';
-import { expect, test, describe, it } from 'vitest';
-import { Avatar } from './Avatar';
-import type { AvatarShape, AvatarSize } from './Avatar';
+import { describe, expect, it, test } from 'vitest';
+import { Avatar, type AvatarShape, type AvatarSize } from './Avatar';
const testImage = faker.image.avatar();
diff --git a/packages/avatar/src/Avatar.tsx b/packages/avatar/src/Avatar.tsx
index 60bbd16f..30ac1d0b 100644
--- a/packages/avatar/src/Avatar.tsx
+++ b/packages/avatar/src/Avatar.tsx
@@ -1,26 +1,7 @@
import { Slot } from '@radix-ui/react-slot';
import { clsx as cx } from 'clsx';
-import { type CSSProperties, type ComponentProps, type ForwardedRef, forwardRef } from 'react';
-import styles from './Avatar.module.css';
-
-/**
-+ * Avatar ์ปดํฌ๋ํธ์ ํฌ๊ธฐ ์ต์
-+ * @type {AvatarSize}
-+ * - xs: 24px
-+ * - sm: 32px
-+ * - md: 40px (๊ธฐ๋ณธ๊ฐ)
-+ * - lg: 70px
-+ */
-export type AvatarSize = 'xs' | 'sm' | 'md' | 'lg' | 'xl';
-
-/**
-+ * Avatar ์ปดํฌ๋ํธ์ ๋ชจ์ ์ต์
-+ * @type {AvatarShape}
-+ * - circle: ์ํ (50% border-radius)
-+ * - rounded: ๋ฅ๊ทผ ๋ชจ์๋ฆฌ (4px border-radius)
-+ * - square: ์ ์ฌ๊ฐํ (0px border-radius)
-+ */
-export type AvatarShape = 'circle' | 'rounded' | 'square';
+import { type ComponentProps, type ForwardedRef, forwardRef } from 'react';
+import * as styles from './Avatar.css';
export interface AvatarProps extends ComponentProps<'div'> {
asChild?: boolean;
@@ -31,21 +12,30 @@ export interface AvatarProps extends ComponentProps<'div'> {
fallback?: string;
}
+export const AvatarSize = {
+ xs: 'xs',
+ sm: 'sm',
+ md: 'md',
+ lg: 'lg',
+ xl: 'xl',
+} as const;
+export type AvatarSize = (typeof AvatarSize)[keyof typeof AvatarSize];
+
+export const AvatarShape = {
+ circle: 'circle',
+ rounded: 'rounded',
+ square: 'square',
+} as const;
+export type AvatarShape = (typeof AvatarShape)[keyof typeof AvatarShape];
+
export const Avatar = forwardRef(function Avatar(
{ asChild, className, src, alt, size = 'md', shape = 'circle', fallback, ...props }: AvatarProps,
ref: ForwardedRef,
) {
const Component = asChild ? Slot : 'div';
- const style = {
- ...props.style,
- width: getAvatarSize(size),
- height: getAvatarSize(size),
- borderRadius: getAvatarShape(shape),
- } as CSSProperties;
-
return (
-
+
{src ? (
);
});
-
-function getAvatarSize(size: AvatarSize) {
- switch (size) {
- case 'xs':
- return '24px';
- case 'sm':
- return '32px';
- case 'md':
- return '40px';
- case 'lg':
- return '70px';
- case 'xl':
- return '96px';
- default:
- return '40px';
- }
-}
-
-function getAvatarShape(shape: AvatarShape) {
- switch (shape) {
- case 'rounded':
- return '4px';
- case 'square':
- return '0px';
- default:
- return '50%';
- }
-}
diff --git a/packages/avatar/src/index.ts b/packages/avatar/src/index.ts
index 9cc3279d..27700fe3 100644
--- a/packages/avatar/src/index.ts
+++ b/packages/avatar/src/index.ts
@@ -1 +1 @@
-export * from './Avatar.tsx';
+export * from './Avatar';
diff --git a/packages/avatar/tsup.config.ts b/packages/avatar/tsup.config.ts
index c533199b..efc295fa 100644
--- a/packages/avatar/tsup.config.ts
+++ b/packages/avatar/tsup.config.ts
@@ -1,8 +1 @@
-import { defineConfig } from 'tsup';
-
-export default defineConfig({
- entry: ['src/index.ts'],
- clean: true,
- dts: true,
- format: ['esm', 'cjs'],
-});
+export { default } from '../../tsup.config';
diff --git a/packages/avatar/vite.config.ts b/packages/avatar/vite.config.ts
new file mode 100644
index 00000000..2484cb4e
--- /dev/null
+++ b/packages/avatar/vite.config.ts
@@ -0,0 +1 @@
+export { default } from '../../vite.config';
diff --git a/packages/avatar/vitest.config.ts b/packages/avatar/vitest.config.ts
index adc7d2f1..a9178275 100644
--- a/packages/avatar/vitest.config.ts
+++ b/packages/avatar/vitest.config.ts
@@ -1,26 +1,11 @@
-import { defineConfig } from 'vitest/config';
-
-export default defineConfig({
- // ํ
์คํธ์ ๊ด๋ จํ ์ค์
- test: {
- // ํ
์คํธ๋ฅผ ์คํํ ํ๊ฒฝ
- // default: 'node'
- // ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ํ
์คํธ๋ฅผ ํฌ๋ง์ - 'jsdom' ๋๋ 'happy-dom'์ผ๋ก ์ค์
- environment: 'happy-dom',
-
- // ๊ธ๋ก๋ฒ API๋ฅผ ์ฌ์ฉํ ์ง ์ฌ๋ถ๋ฅผ ์ ํ
- // ex) describe, it, expect ๋ฑ
- globals: true,
-
- // ํ
์คํธ ์คํ ํ๊ฒฝ์ ํ์ํ ์คํฌ๋ฆฝํธ๋ฅผ ๋ถ๋ฌ์ฌ ์ ์์
- // ex) ๋ชจ๋ mokcing, matcher extend ๋ฑ
- setupFiles: './vitest.setup.ts',
- passWithNoTests: true,
- watch: false,
- css: true,
- },
-
- // ํ๊ฒฝ๋ณ๋ก ์ค์ ํด์ฃผ์ด์ผํ๋ ์ถ๊ฐ ๊ธฐ๋ฅ์ ํ๋ฌ๊ทธ์ธ์ผ๋ก ์ฃผ์
๊ฐ๋ฅ
- // ex) vite-tsconfig-paths
- plugins: [],
-});
+import { defineProject, mergeConfig } from 'vitest/config';
+import defaultConfig from '../../vitest.config';
+
+export default mergeConfig(
+ defaultConfig,
+ defineProject({
+ test: {
+ setupFiles: './vitest.setup.ts',
+ },
+ }),
+);
diff --git a/packages/badge/package.json b/packages/badge/package.json
index 3b644782..9fa182dc 100644
--- a/packages/badge/package.json
+++ b/packages/badge/package.json
@@ -13,14 +13,15 @@
"scripts": {
"build": "tsup",
"build:storybook": "storybook build",
+ "clean": "rm -rf node_modules dist",
"dev:storybook": "storybook dev -p 6006",
- "lint:biome": "pnpm exec biome lint",
- "lint:eslint": "pnpm exec eslint",
+ "lint": "pnpm exec biome lint",
"test": "vitest",
"typecheck": "tsc",
"prepack": "pnpm run build"
},
"dependencies": {
+ "@sipe-team/tokens": "workspace:*",
"@sipe-team/typography": "workspace:*",
"clsx": "^2.1.1"
},
@@ -35,6 +36,7 @@
"@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.0.1",
"@types/react": "catalog:react",
+ "@vanilla-extract/css": "catalog:",
"happy-dom": "catalog:",
"react": "catalog:react",
"react-dom": "catalog:react",
diff --git a/packages/badge/src/Badge.css.ts b/packages/badge/src/Badge.css.ts
new file mode 100644
index 00000000..080da695
--- /dev/null
+++ b/packages/badge/src/Badge.css.ts
@@ -0,0 +1,71 @@
+import { style, styleVariants } from '@vanilla-extract/css';
+import { color as colorToken, fontSize as fontSizeToken } from '@sipe-team/tokens';
+
+// Define the types for our component
+export const BadgeSize = {
+ small: 'small',
+ medium: 'medium',
+ large: 'large',
+} as const;
+
+export const BadgeVariant = {
+ filled: 'filled',
+ outline: 'outline',
+ weak: 'weak',
+} as const;
+
+// Base styles for the badge
+export const root = style({
+ borderRadius: 8,
+ display: 'inline-flex',
+ alignItems: 'center',
+ justifyContent: 'center',
+});
+
+// Size variants
+export const size = styleVariants({
+ [BadgeSize.small]: {
+ padding: '4px 8px',
+ },
+ [BadgeSize.medium]: {
+ padding: '8px 16px',
+ },
+ [BadgeSize.large]: {
+ padding: '12px 24px',
+ },
+});
+
+// Font size by badge size
+export const fontSize = styleVariants({
+ [BadgeSize.small]: {
+ fontSize: fontSizeToken[12],
+ },
+ [BadgeSize.medium]: {
+ fontSize: fontSizeToken[14],
+ },
+ [BadgeSize.large]: {
+ fontSize: fontSizeToken[18],
+ },
+});
+
+// Variant styles
+export const variant = styleVariants({
+ [BadgeVariant.filled]: {
+ backgroundColor: colorToken.cyan900,
+ border: 'none',
+ },
+ [BadgeVariant.outline]: {
+ backgroundColor: 'transparent',
+ border: `2px solid ${colorToken.cyan900}`,
+ },
+ [BadgeVariant.weak]: {
+ backgroundColor: colorToken.gray200,
+ border: 'none',
+ },
+});
+
+// Text style
+export const text = style({
+ color: colorToken.cyan300,
+ fontWeight: 600,
+});
diff --git a/packages/badge/src/Badge.module.css b/packages/badge/src/Badge.module.css
deleted file mode 100644
index e04e6679..00000000
--- a/packages/badge/src/Badge.module.css
+++ /dev/null
@@ -1,6 +0,0 @@
-.root {
- background-color: var(--background-color);
- border: var(--border);
- border-radius: 8px;
- padding: var(--padding);
-}
diff --git a/packages/badge/src/Badge.stories.tsx b/packages/badge/src/Badge.stories.tsx
index 306caaf9..892569fa 100644
--- a/packages/badge/src/Badge.stories.tsx
+++ b/packages/badge/src/Badge.stories.tsx
@@ -1,5 +1,6 @@
import type { Meta, StoryObj } from '@storybook/react';
-import { Badge } from './Badge';
+import { Badge, type BadgeSize, type BadgeVariant } from './Badge';
+import { BadgeSize as BadgeSizeEnum, BadgeVariant as BadgeVariantEnum } from './Badge.css';
const meta = {
title: 'Components/Badge',
@@ -7,6 +8,20 @@ const meta = {
parameters: {
layout: 'centered',
},
+ argTypes: {
+ size: {
+ control: 'select',
+ options: Object.keys(BadgeSizeEnum),
+ description: 'Size of the badge',
+ defaultValue: 'medium',
+ },
+ variant: {
+ control: 'select',
+ options: Object.keys(BadgeVariantEnum),
+ description: 'Visual style of the badge',
+ defaultValue: 'filled',
+ },
+ },
} satisfies Meta;
export default meta;
@@ -15,5 +30,31 @@ type Story = StoryObj;
export const Basic: Story = {
args: {
children: '์ฌ์ดํ',
+ size: 'medium',
+ variant: 'filled',
},
};
+
+export const Sizes: Story = {
+ render: (args) => (
+
+ {Object.keys(BadgeSizeEnum).map((size) => (
+
+ {size}
+
+ ))}
+
+ ),
+};
+
+export const Variants: Story = {
+ render: (args) => (
+
+ {Object.keys(BadgeVariantEnum).map((variant) => (
+
+ {variant}
+
+ ))}
+
+ ),
+};
diff --git a/packages/badge/src/Badge.test.tsx b/packages/badge/src/Badge.test.tsx
index 791c7787..3771bd84 100644
--- a/packages/badge/src/Badge.test.tsx
+++ b/packages/badge/src/Badge.test.tsx
@@ -1,6 +1,7 @@
import { render, screen } from '@testing-library/react';
import { expect, test } from 'vitest';
import { Badge } from './Badge';
+import { color as colorToken } from '@sipe-team/tokens';
test('children์ผ๋ก ์
๋ ฅํ ํ
์คํธ๋ฅผ ํ์ํ๋ค.', () => {
render(ํ
์คํธ );
@@ -14,10 +15,10 @@ test('๋ชจ์๋ฆฌ๊ฐ 8px radius ํํ์ด๋ค.', () => {
expect(screen.getByRole('status')).toHaveStyle({ borderRadius: '8px' });
});
-test('๊ธ๊ผด ์์์ teal(#00FFFF)์ด๋ค.', () => {
+test(`๊ธ๊ผด ์์์ cyan300(${colorToken.cyan300})์ด๋ค.`, () => {
render(ํ
์คํธ );
- expect(screen.getByText('ํ
์คํธ')).toHaveStyle({ color: '#00FFFF' });
+ expect(screen.getByText('ํ
์คํธ')).toHaveStyle({ color: colorToken.cyan300 });
});
test('๊ธ๊ผด ๋๊ป๋ semiBold(600)์ด๋ค.', () => {
@@ -26,28 +27,28 @@ test('๊ธ๊ผด ๋๊ป๋ semiBold(600)์ด๋ค.', () => {
expect(screen.getByText('ํ
์คํธ')).toHaveStyle({ fontWeight: 600 });
});
-test('variant๋ฅผ ์ฃผ์
ํ์ง ์์ผ๋ฉด filled(๋ฐฐ๊ฒฝ์ #2D3748)๋ฅผ ๊ธฐ๋ณธ ํํ๋ก ์ค์ ํ๋ค.', () => {
+test(`variant๋ฅผ ์ฃผ์
ํ์ง ์์ผ๋ฉด filled(${colorToken.cyan900})๋ฅผ ๊ธฐ๋ณธ ํํ๋ก ์ค์ ํ๋ค.`, () => {
render(ํ
์คํธ );
expect(screen.getByRole('status')).toHaveStyle({
- backgroundColor: '#2D3748',
+ backgroundColor: colorToken.cyan900,
});
});
-test('variant๊ฐ weak์ธ ๊ฒฝ์ฐ ๋ฐฐ๊ฒฝ์ #EDF2F7๋ก ํํ๋ฅผ ์ ์ฉํ๋ค.', () => {
+test('variant๊ฐ weak์ธ ๊ฒฝ์ฐ ๋ฐฐ๊ฒฝ์ gray200๋ก ํํ๋ฅผ ์ ์ฉํ๋ค.', () => {
render(ํ
์คํธ );
expect(screen.getByRole('status')).toHaveStyle({
- backgroundColor: '#EDF2F7',
+ backgroundColor: colorToken.gray200,
});
});
-test('variant๊ฐ outline์ธ ๊ฒฝ์ฐ ๋ฐฐ๊ฒฝ์์ ํฌ๋ช
, ํ
๋๋ฆฌ๋ 2px ๋๊ป์ #2D3748 ์์ ํํ๋ฅผ ์ ์ฉํ๋ค.', () => {
+test('variant๊ฐ outline์ธ ๊ฒฝ์ฐ ๋ฐฐ๊ฒฝ์์ ํฌ๋ช
, ํ
๋๋ฆฌ๋ 2px ๋๊ป์ cyan900 ์์ ํํ๋ฅผ ์ ์ฉํ๋ค.', () => {
render(ํ
์คํธ );
expect(screen.getByRole('status')).toHaveStyle({
backgroundColor: 'transparent',
- border: '2px solid #2D3748',
+ border: `2px solid ${colorToken.cyan900}`,
});
});
diff --git a/packages/badge/src/Badge.tsx b/packages/badge/src/Badge.tsx
index 568a0298..91035e40 100644
--- a/packages/badge/src/Badge.tsx
+++ b/packages/badge/src/Badge.tsx
@@ -1,16 +1,10 @@
import { Typography } from '@sipe-team/typography';
import { clsx as cx } from 'clsx';
-import {
- type CSSProperties,
- type ComponentProps,
- type ForwardedRef,
- forwardRef,
-} from 'react';
-import styles from './Badge.module.css';
+import { type ComponentProps, type ForwardedRef, forwardRef } from 'react';
+import * as styles from './Badge.css';
-type BadgeSize = 'small' | 'medium' | 'large';
-
-type BadgeVariant = 'filled' | 'outline' | 'weak';
+export type BadgeSize = keyof typeof styles.BadgeSize;
+export type BadgeVariant = keyof typeof styles.BadgeVariant;
export interface BadgeProps extends ComponentProps<'div'> {
size?: BadgeSize;
@@ -18,71 +12,24 @@ export interface BadgeProps extends ComponentProps<'div'> {
}
export const Badge = forwardRef(function Badge(
- {
- className,
- children,
- size = 'medium',
- style: _style,
- variant = 'filled',
- ...props
- }: BadgeProps,
+ { className, children, size = 'medium', variant = 'filled', ...props }: BadgeProps,
ref: ForwardedRef,
) {
- const backgroundColor = getBackgroundColor(variant);
- const border = variant === 'outline' ? '2px solid #2D3748' : undefined;
- const padding = getPadding(size);
- const style = {
- ..._style,
- '--background-color': backgroundColor,
- '--border': border,
- '--padding': padding,
- } as CSSProperties;
-
- const fontSize = getFontSize(size);
-
return (
-
+
{children}
);
});
-function getBackgroundColor(variant: BadgeVariant) {
- switch (variant) {
- case 'weak':
- return '#EDF2F7';
- case 'outline':
- return 'transparent';
- default:
- return '#2D3748';
- }
-}
-
-function getPadding(size: BadgeSize) {
- switch (size) {
- case 'small':
- return '4px 8px';
- case 'large':
- return '12px 24px';
- default:
- return '8px 16px';
- }
-}
-
-function getFontSize(size: BadgeSize) {
+function getTypographySize(size: BadgeSize): 12 | 14 | 18 {
switch (size) {
case 'small':
return 12;
diff --git a/packages/button/global.d.ts b/packages/button/global.d.ts
deleted file mode 100644
index 60260a3a..00000000
--- a/packages/button/global.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-declare module '*.module.css';
diff --git a/packages/button/package.json b/packages/button/package.json
index 18af3006..2f8daab7 100644
--- a/packages/button/package.json
+++ b/packages/button/package.json
@@ -13,18 +13,19 @@
"scripts": {
"build": "tsup",
"build:storybook": "storybook build",
+ "clean": "rm -rf node_modules dist",
"dev:storybook": "storybook dev -p 6006",
- "lint:biome": "pnpm exec biome lint",
- "lint:eslint": "pnpm exec eslint",
+ "lint": "pnpm exec biome lint",
"test": "vitest",
"typecheck": "tsc",
"prepack": "pnpm run build"
},
"dependencies": {
"@radix-ui/react-slot": "^1.1.0",
+ "@sipe-team/tokens": "workspace:*",
"@sipe-team/typography": "workspace:*",
- "clsx": "^2.1.1",
- "ts-pattern": "^5.6.0"
+ "@vanilla-extract/recipes": "^0.5.5",
+ "clsx": "^2.1.1"
},
"devDependencies": {
"@storybook/addon-essentials": "catalog:",
@@ -37,6 +38,7 @@
"@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.0.1",
"@types/react": "catalog:react",
+ "@vanilla-extract/css": "catalog:",
"happy-dom": "catalog:",
"react": "catalog:react",
"react-dom": "catalog:react",
diff --git a/packages/button/src/Button.css.ts b/packages/button/src/Button.css.ts
new file mode 100644
index 00000000..d6cbe620
--- /dev/null
+++ b/packages/button/src/Button.css.ts
@@ -0,0 +1,74 @@
+import { vars } from '@sipe-team/tokens';
+
+import { style } from '@vanilla-extract/css';
+import { recipe } from '@vanilla-extract/recipes';
+
+import { ButtonSize, ButtonVariant } from './Button';
+
+export const disabled = style({
+ opacity: 0.4,
+ cursor: 'not-allowed',
+ pointerEvents: 'none',
+});
+
+export const button = recipe({
+ base: {
+ display: 'flex',
+ alignItems: 'center',
+ justifyContent: 'center',
+ borderRadius: vars.radius.md,
+ fontWeight: vars.typography.fontWeight.semiBold,
+ cursor: 'pointer',
+ transition: 'all 0.2s ease-in-out',
+ border: 'none',
+ fontFamily: vars.typography.fontFamily,
+ },
+ variants: {
+ variant: {
+ [ButtonVariant.filled]: {
+ backgroundColor: vars.color.primary,
+ color: vars.color.background,
+ border: 'none',
+ ':hover': {
+ opacity: 0.9,
+ },
+ },
+ [ButtonVariant.outline]: {
+ backgroundColor: 'transparent',
+ border: `1px solid ${vars.color.primary}`,
+ color: vars.color.primary,
+ ':hover': {
+ backgroundColor: vars.color.primary,
+ color: vars.color.background,
+ },
+ },
+ [ButtonVariant.ghost]: {
+ backgroundColor: 'transparent',
+ border: 'none',
+ color: vars.color.primary,
+ ':hover': {
+ backgroundColor: `color-mix(in srgb, ${vars.color.primary} 10%, transparent)`,
+ },
+ },
+ },
+ size: {
+ [ButtonSize.sm]: {
+ height: '32px',
+ padding: `0 ${vars.spacing.sm}`,
+ fontSize: vars.typography.fontSize['200'],
+ lineHeight: vars.typography.lineHeight.compact,
+ },
+ [ButtonSize.lg]: {
+ height: '48px',
+ padding: `0 ${vars.spacing.lg}`,
+ fontSize: vars.typography.fontSize['400'],
+ lineHeight: vars.typography.lineHeight.regular,
+ },
+ },
+ },
+ compoundVariants: [],
+ defaultVariants: {
+ variant: ButtonVariant.filled,
+ size: ButtonSize.lg,
+ },
+});
diff --git a/packages/button/src/Button.module.css b/packages/button/src/Button.module.css
deleted file mode 100644
index 84789247..00000000
--- a/packages/button/src/Button.module.css
+++ /dev/null
@@ -1,29 +0,0 @@
-.button {
- display: flex;
- align-items: center;
- justify-content: center;
- padding: 0 16px;
- border-radius: 8px;
- height: 40px;
- font-size: 22px;
- line-height: 30.8px;
- font-weight: bold;
- cursor: pointer;
- transition: all 0.2s ease-in-out;
- background-color: var(--background-color);
- border: var(--border);
- color: var(--color);
-}
-
-.button:hover {
- background-color: var(--hover-background-color);
- color: var(--hover-color);
- opacity: var(--hover-opacity);
-}
-
-/* States */
-.disabled {
- opacity: 0.4;
- cursor: not-allowed;
- pointer-events: none;
-}
diff --git a/packages/button/src/Button.stories.tsx b/packages/button/src/Button.stories.tsx
index 53a0bc42..3c648787 100644
--- a/packages/button/src/Button.stories.tsx
+++ b/packages/button/src/Button.stories.tsx
@@ -1,4 +1,5 @@
import type { Meta, StoryObj } from '@storybook/react';
+
import { Button } from './Button';
const meta = {
@@ -8,18 +9,18 @@ const meta = {
layout: 'centered',
},
argTypes: {
- color: {
- description: '๋ฒํผ์ ์์์ ์ง์ ํฉ๋๋ค',
- options: ['primary', 'black', 'white'],
+ variant: {
+ description: 'The visual style of the button',
+ options: ['filled', 'outline', 'ghost'],
control: { type: 'radio' },
},
- variant: {
- description: '๋ฒํผ์ ์คํ์ผ์ ์ง์ ํฉ๋๋ค',
- options: ['filled', 'outline', 'weak'],
+ size: {
+ description: 'The size of the button',
+ options: ['sm', 'lg'],
control: { type: 'radio' },
},
disabled: {
- description: '๋ฒํผ์ ๋นํ์ฑํ ์ํ๋ฅผ ์ง์ ํฉ๋๋ค',
+ description: 'Whether the button is disabled',
control: { type: 'boolean' },
},
},
@@ -31,45 +32,42 @@ type Story = StoryObj;
export const Basic: Story = {
args: {
children: 'Button',
- color: 'primary',
variant: 'filled',
+ size: 'lg',
},
};
-export const Colors: Story = {
+export const Variants: Story = {
args: {
children: 'Button',
},
render: (args) => (
-
- Primary
+
+ Filled
-
- Black
+
+ Outline
-
- White
+
+ Ghost
),
};
-export const Variants: Story = {
+export const Sizes: Story = {
args: {
children: 'Button',
- color: 'primary',
+ variant: 'filled',
},
render: (args) => (
-
-
- Filled
-
-
- Outline
+
+
+ Small
-
- Weak
+
+ Large
),
@@ -78,7 +76,6 @@ export const Variants: Story = {
export const States: Story = {
args: {
children: 'Button',
- color: 'primary',
},
render: (args) => (
diff --git a/packages/button/src/Button.test.tsx b/packages/button/src/Button.test.tsx
index fd3c7f5e..4c513c63 100644
--- a/packages/button/src/Button.test.tsx
+++ b/packages/button/src/Button.test.tsx
@@ -1,31 +1,80 @@
import { render, screen } from '@testing-library/react';
import { expect, test } from 'vitest';
+
import { Button } from './Button';
-test('children์ผ๋ก ์
๋ ฅํ ํ
์คํธ๋ฅผ ํ์ํ๋ค.', () => {
- render(
ํ
์คํธ );
+test('displays text passed as children', () => {
+ render(
Test );
+
+ expect(screen.getByText('Test')).toBeInTheDocument();
+});
+
+test('applies correct classes', () => {
+ render(
Test );
+
+ const button = screen.getByRole('button');
+
+ // Should have button classes applied
+ expect(button.className).toBeTruthy();
+ expect(button.className.length).toBeGreaterThan(0);
+});
+
+test('uses filled variant as default when variant is not provided', () => {
+ render(
Test );
+
+ const button = screen.getByRole('button');
+
+ // Should render properly
+ expect(button).toBeInTheDocument();
+ expect(button.className).toBeTruthy();
+});
+
+test('size prop works correctly', () => {
+ render(
Test );
+
+ const button = screen.getByRole('button');
+
+ // Should render without errors
+ expect(button).toBeInTheDocument();
+ expect(button.className).toBeTruthy();
+});
- expect(screen.getByText('ํ
์คํธ')).toBeInTheDocument();
+test('ghost variant works correctly', () => {
+ render(
Test );
+
+ const button = screen.getByRole('button');
+
+ // Should render without errors
+ expect(button).toBeInTheDocument();
+ expect(button.className).toBeTruthy();
});
-test('๋ชจ์๋ฆฌ๊ฐ 8px radius ํํ์ด๋ค.', () => {
- render(
ํ
์คํธ );
+test('outline variant works correctly', () => {
+ render(
Test );
+
+ const button = screen.getByRole('button');
- expect(screen.getByRole('button')).toHaveStyle({ borderRadius: '8px' });
+ // Should render without errors
+ expect(button).toBeInTheDocument();
+ expect(button.className).toBeTruthy();
});
-test('variant๋ฅผ ์ฃผ์
ํ์ง ์์ผ๋ฉด filled(๋ฐฐ๊ฒฝ์ #00ffff)๋ฅผ ๊ธฐ๋ณธ ํํ๋ก ์ค์ ํ๋ค.', () => {
- render(
ํ
์คํธ );
+test('disabled state works correctly', () => {
+ render(
Test );
- expect(screen.getByRole('button')).toHaveStyle({
- backgroundColor: '#00ffff',
- });
+ const button = screen.getByRole('button');
+
+ // Should be disabled
+ expect(button).toBeDisabled();
+ expect(button).toBeInTheDocument();
});
-test('color๊ฐ primary์ธ ๊ฒฝ์ฐ ๋ฐฐ๊ฒฝ์ #00ffff ํํ๋ฅผ ์ ์ฉํ๋ค.', () => {
- render(
ํ
์คํธ );
+test('large size works correctly', () => {
+ render(
Test );
+
+ const button = screen.getByRole('button');
- expect(screen.getByRole('button')).toHaveStyle({
- backgroundColor: '#00ffff',
- });
+ // Should render without errors
+ expect(button).toBeInTheDocument();
+ expect(button.className).toBeTruthy();
});
diff --git a/packages/button/src/Button.tsx b/packages/button/src/Button.tsx
index dd3edbec..f5082d93 100644
--- a/packages/button/src/Button.tsx
+++ b/packages/button/src/Button.tsx
@@ -1,117 +1,43 @@
+import { type ComponentProps, type ForwardedRef, forwardRef } from 'react';
+
import { Slot } from '@radix-ui/react-slot';
+
import { clsx as cx } from 'clsx';
-import {
- type CSSProperties,
- type ComponentProps,
- type ReactNode,
- forwardRef,
-} from 'react';
-import { match } from 'ts-pattern';
-import styles from './Button.module.css';
-type ButtonColor = 'primary' | 'black' | 'white';
+import * as styles from './Button.css';
-type ButtonVariant = 'filled' | 'outline' | 'weak';
+export const ButtonVariant = {
+ filled: 'filled',
+ outline: 'outline',
+ ghost: 'ghost',
+} as const;
+export type ButtonVariant = (typeof ButtonVariant)[keyof typeof ButtonVariant];
+
+export const ButtonSize = {
+ sm: 'sm',
+ lg: 'lg',
+} as const;
+export type ButtonSize = (typeof ButtonSize)[keyof typeof ButtonSize];
export interface ButtonProps extends ComponentProps<'button'> {
- color?: ButtonColor;
variant?: ButtonVariant;
- disabled?: boolean;
- className?: string;
- children: ReactNode;
+ size?: ButtonSize;
asChild?: boolean;
}
-export const Button = forwardRef
(
- function Button(
- {
- color = 'primary',
- variant = 'filled',
- asChild,
- disabled,
- className: _className,
- style: _style,
- children,
- ...rest
- },
- ref,
- ) {
- const Comp = asChild ? Slot : 'button';
- const className = cx(
- styles.button,
- { [styles.disabled]: disabled },
- _className,
- );
- const style = {
- ..._style,
- ...getButtonStyle({ color, variant }),
- } as CSSProperties;
-
- return (
-
- {children}
-
- );
- },
-);
-
-function getButtonStyle({
- color,
- variant,
-}: { color: ButtonColor; variant: ButtonVariant }) {
- const primaryColor = '#00ffff';
- const blackColor = 'black';
- const whiteColor = 'white';
- const transparentColor = 'transparent';
-
- const backgroundColor = match([color, variant])
- .with(['primary', 'filled'], () => primaryColor)
- .with(['black', 'filled'], () => blackColor)
- .with(['white', 'filled'], () => whiteColor)
- .otherwise(() => transparentColor);
- const border = match([color, variant])
- .with(['primary', 'outline'], () => `1px solid ${primaryColor}`)
- .with(['black', 'outline'], () => `1px solid ${blackColor}`)
- .with(['white', 'outline'], () => `1px solid ${whiteColor}`)
- .otherwise(() => 'none');
- const fontColor = match([color, variant])
- .with(['primary', 'filled'], () => blackColor)
- .with(['primary', 'outline'], ['primary', 'weak'], () => primaryColor)
- .with(['black', 'filled'], () => whiteColor)
- .with(['black', 'outline'], ['black', 'weak'], () => blackColor)
- .with(['white', 'filled'], () => blackColor)
- .with(['white', 'outline'], ['white', 'weak'], () => whiteColor)
- .exhaustive();
- const hoverBackgroundColor = match([color, variant])
- .with(['primary', 'filled'], () => '#00d2d2')
- .with(['primary', 'outline'], ['primary', 'weak'], () => primaryColor)
- .with(['black', 'filled'], () => '#2d3748')
- .with(['black', 'outline'], ['black', 'weak'], () => blackColor)
- .with(['white', 'filled'], () => '#cbd5e0')
- .with(['white', 'outline'], ['white', 'weak'], () => whiteColor)
- .exhaustive();
- const hoverFontColor = match([color, variant])
- .with(['primary', 'filled'], ['primary', 'outline'], () => blackColor)
- .with(['primary', 'weak'], () => primaryColor)
- .with(['black', 'filled'], ['black', 'outline'], () => whiteColor)
- .with(['black', 'weak'], () => blackColor)
- .with(['white', 'filled'], ['white', 'outline'], () => blackColor)
- .with(['white', 'weak'], () => whiteColor)
- .exhaustive();
- const hoverOpacity = variant === 'weak' ? 0.1 : 1;
-
- return {
- '--background-color': backgroundColor,
- '--border': border,
- '--color': fontColor,
- '--hover-background-color': hoverBackgroundColor,
- '--hover-color': hoverFontColor,
- '--hover-opacity': hoverOpacity,
- };
-}
+export const Button = forwardRef(function Button(
+ {
+ variant = ButtonVariant.filled,
+ size = ButtonSize.lg,
+ asChild,
+ disabled,
+ className: _className,
+ ...props
+ }: ButtonProps,
+ ref: ForwardedRef,
+) {
+ const Comp = asChild ? Slot : 'button';
+ const className = cx(styles.button({ variant, size }), { [styles.disabled]: disabled }, _className);
+
+ return ;
+});
diff --git a/packages/card/package.json b/packages/card/package.json
index 155a5fb1..661c07a9 100644
--- a/packages/card/package.json
+++ b/packages/card/package.json
@@ -13,9 +13,9 @@
"scripts": {
"build": "tsup",
"build:storybook": "storybook build",
+ "clean": "rm -rf node_modules dist",
"dev:storybook": "storybook dev -p 6006",
- "lint:biome": "pnpm exec biome lint",
- "lint:eslint": "pnpm exec eslint",
+ "lint": "pnpm exec biome lint",
"test": "vitest",
"typecheck": "tsc",
"prepack": "pnpm run build"
@@ -36,6 +36,8 @@
"@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.0.1",
"@types/react": "catalog:react",
+ "@vanilla-extract/css": "catalog:",
+ "@vanilla-extract/recipes": "^0.5.5",
"happy-dom": "catalog:",
"react": "catalog:react",
"react-dom": "catalog:react",
diff --git a/packages/card/src/Card.css.ts b/packages/card/src/Card.css.ts
new file mode 100644
index 00000000..4e9cb3b8
--- /dev/null
+++ b/packages/card/src/Card.css.ts
@@ -0,0 +1,61 @@
+import { color } from '@sipe-team/tokens';
+import { recipe } from '@vanilla-extract/recipes';
+
+export const CardVariant = {
+ filled: 'filled',
+ outline: 'outline',
+} as const;
+
+export const CardRatio = {
+ rectangle: 'rectangle',
+ square: 'square',
+ wide: 'wide',
+ portrait: 'portrait',
+ auto: 'auto',
+} as const;
+
+export type CardVariant = (typeof CardVariant)[keyof typeof CardVariant];
+export type CardRatio = (typeof CardRatio)[keyof typeof CardRatio];
+
+export const card = recipe({
+ base: {
+ display: 'flex',
+ justifyContent: 'center',
+ alignItems: 'center',
+ borderRadius: '12px',
+ padding: '20px',
+ },
+ variants: {
+ variant: {
+ [CardVariant.filled]: {
+ backgroundColor: color.gray100,
+ border: `1px solid ${color.gray200}`,
+ },
+ [CardVariant.outline]: {
+ backgroundColor: color.gray50,
+ border: `1px solid ${color.cyan300}`,
+ },
+ },
+ ratio: {
+ [CardRatio.square]: {
+ aspectRatio: '1 / 1',
+ },
+ [CardRatio.rectangle]: {
+ aspectRatio: '16 / 9',
+ },
+ [CardRatio.wide]: {
+ aspectRatio: '21 / 9',
+ },
+ [CardRatio.portrait]: {
+ aspectRatio: '3 / 4',
+ },
+ [CardRatio.auto]: {
+ aspectRatio: 'auto',
+ },
+ },
+ },
+ defaultVariants: {
+ variant: CardVariant.filled,
+ ratio: CardRatio.rectangle,
+ },
+});
diff --git a/packages/card/src/Card.module.css b/packages/card/src/Card.module.css
deleted file mode 100644
index 9afcec34..00000000
--- a/packages/card/src/Card.module.css
+++ /dev/null
@@ -1,7 +0,0 @@
-.card {
- background-color: var(--background-color);
- border: var(--border);
- border-radius: 12px;
- padding: var(--padding);
- aspect-ratio: var(--aspect-ratio);
-}
diff --git a/packages/card/src/Card.stories.tsx b/packages/card/src/Card.stories.tsx
index cafcb08e..36984ca7 100644
--- a/packages/card/src/Card.stories.tsx
+++ b/packages/card/src/Card.stories.tsx
@@ -22,9 +22,121 @@ export default meta;
type Story = StoryObj;
+const RatioVisualizer = ({ label, ratio }: { label: string; ratio: string }) => (
+
+);
+
+// Default example
export const Default: Story = {
args: {
children: Card ,
variant: 'filled',
+ ratio: 'rectangle',
+ style: { width: '300px' },
},
};
+
+// Filled variant with all ratios in a row
+export const FilledVariant: Story = {
+ render: () => (
+
+
Filled Variant - All Ratios
+
+
+
+
+
+
Rectangle (16:9)
+
+
+
+
+
+
+
+
+
+
+
+
+
Auto (Custom Size)
+
+
+
+ ),
+};
+
+// Outline variant with all ratios in a row
+export const OutlineVariant: Story = {
+ render: () => (
+
+
Outline Variant - All Ratios
+
+
+
+
+
+
Rectangle (16:9)
+
+
+
+
+
+
+
+
+
+
+
+
+
Auto (Custom Size)
+
+
+
+ ),
+};
diff --git a/packages/card/src/Card.tsx b/packages/card/src/Card.tsx
index 6321f087..6821a03c 100644
--- a/packages/card/src/Card.tsx
+++ b/packages/card/src/Card.tsx
@@ -1,58 +1,19 @@
import { Slot } from '@radix-ui/react-slot';
-import { color } from '@sipe-team/tokens';
import { clsx as cx } from 'clsx';
-import { type CSSProperties, type ComponentProps, type ForwardedRef, forwardRef } from 'react';
-import styles from './Card.module.css';
-
-export type CardRatio = 'rectangle' | 'square' | 'wide' | 'portrait' | 'auto';
-export type CardVariant = 'filled' | 'outline';
+import { type ComponentProps, type ForwardedRef, forwardRef } from 'react';
+import { card, type CardVariant, type CardRatio } from './Card.css';
export interface CardProps extends ComponentProps<'div'> {
- ratio?: CardRatio;
- variant?: CardVariant;
asChild?: boolean;
+ variant?: CardVariant;
+ ratio?: CardRatio;
}
export const Card = forwardRef(function Card(
- { className, ratio = 'rectangle', style: _style, variant = 'filled', asChild, ...props }: CardProps,
+ { className, variant, ratio, asChild, ...props }: CardProps,
ref: ForwardedRef,
) {
- const style = {
- '--padding': '20px',
- '--background-color': getBackgroundColor(variant),
- '--border': variant === 'outline' ? `1px solid ${color.cyan300}` : `1px solid ${color.gray200}`,
- '--aspect-ratio': getAspectRatio(ratio),
- display: 'flex',
- justifyContent: 'center',
- alignItems: 'center',
- ..._style,
- } as CSSProperties;
-
const Comp = asChild ? Slot : 'div';
- return ;
+ return ;
});
-
-const backgroundColors: Record = {
- outline: color.gray50,
- filled: color.gray100,
-};
-
-function getBackgroundColor(variant: CardVariant) {
- return backgroundColors[variant] ?? color.gray100;
-}
-
-function getAspectRatio(ratio: CardRatio) {
- switch (ratio) {
- case 'square':
- return '1 / 1';
- case 'rectangle':
- return '16 / 9';
- case 'wide':
- return '21 / 9';
- case 'portrait':
- return '3 / 4';
- default:
- return 'auto';
- }
-}
diff --git a/packages/card/src/index.ts b/packages/card/src/index.ts
index ca0b0604..640ae6f8 100644
--- a/packages/card/src/index.ts
+++ b/packages/card/src/index.ts
@@ -1 +1,2 @@
export * from './Card';
+export * from './Card.css';
diff --git a/packages/checkbox/package.json b/packages/checkbox/package.json
index 4c2630f8..079a99ad 100644
--- a/packages/checkbox/package.json
+++ b/packages/checkbox/package.json
@@ -13,17 +13,17 @@
"scripts": {
"build": "tsup",
"build:storybook": "storybook build",
+ "clean": "rm -rf node_modules dist",
"dev:storybook": "storybook dev -p 6006",
- "lint:biome": "pnpm exec biome lint",
- "lint:eslint": "pnpm exec eslint",
+ "lint": "pnpm exec biome lint",
"test": "vitest",
"typecheck": "tsc",
"prepack": "pnpm run build"
},
"dependencies": {
- "@radix-ui/react-slot": "^1.1.0",
+ "@sipe-team/tokens": "workspace:*",
"clsx": "^2.1.1",
- "nanoid": "^5.0.9"
+ "@vanilla-extract/recipes": "^0.5.5"
},
"devDependencies": {
"@storybook/addon-essentials": "catalog:",
@@ -35,7 +35,9 @@
"@storybook/test": "catalog:",
"@testing-library/jest-dom": "catalog:",
"@testing-library/react": "catalog:",
+ "@testing-library/user-event": "catalog:",
"@types/react": "catalog:react",
+ "@vanilla-extract/css": "^1.17.1",
"happy-dom": "catalog:",
"react": "catalog:react",
"react-dom": "catalog:react",
diff --git a/packages/checkbox/src/Checkbox.css.ts b/packages/checkbox/src/Checkbox.css.ts
new file mode 100644
index 00000000..32d65e01
--- /dev/null
+++ b/packages/checkbox/src/Checkbox.css.ts
@@ -0,0 +1,201 @@
+import { color } from '@sipe-team/tokens';
+import type { RecipeVariants } from '@vanilla-extract/recipes';
+import { recipe } from '@vanilla-extract/recipes';
+import { CheckboxSize } from './Checkbox';
+
+export const CHECKBOX_SIZES = {
+ [CheckboxSize.small]: {
+ inputSize: '16px',
+ fontSize: '14px',
+ containerPadding: '8px',
+ containerMargin: '4px',
+ },
+ [CheckboxSize.medium]: {
+ inputSize: '20px',
+ fontSize: '16px',
+ containerPadding: '10px',
+ containerMargin: '6px',
+ },
+ [CheckboxSize.large]: {
+ inputSize: '24px',
+ fontSize: '18px',
+ containerPadding: '12px',
+ containerMargin: '8px',
+ },
+} as const;
+
+const BORDER_RADIUS_PX = 4;
+const BORDER_WIDTH_PX = 1;
+const CONTAINER_GAP_PX = 8;
+
+const COLORS = {
+ border: color.gray300 || '#D1D5DB',
+ background: color.white || '#FFFFFF',
+ checked: '#3B82F6',
+ disabled: color.gray200 || '#E5E7EB',
+ hover: color.gray100 || '#F3F4F6',
+};
+
+const CHECKBOX_STYLE = {
+ borderRadius: BORDER_RADIUS_PX,
+ borderWidth: BORDER_WIDTH_PX,
+ borderColor: COLORS.border,
+ backgroundColor: COLORS.background,
+ checkedColor: COLORS.checked,
+ disabledColor: COLORS.disabled,
+ hoverColor: COLORS.hover,
+ backgroundSize: '100%',
+ backgroundPosition: 'center',
+ backgroundRepeat: 'no-repeat',
+ transition: 'all 0.15s ease-in-out',
+} as const;
+
+export const container = recipe({
+ base: {
+ display: 'flex',
+ alignItems: 'center',
+ gap: `${CONTAINER_GAP_PX}px`,
+ },
+ variants: {
+ size: {
+ [CheckboxSize.small]: {
+ padding: CHECKBOX_SIZES[CheckboxSize.small].containerPadding,
+ margin: CHECKBOX_SIZES[CheckboxSize.small].containerMargin,
+ },
+ [CheckboxSize.medium]: {
+ padding: CHECKBOX_SIZES[CheckboxSize.medium].containerPadding,
+ margin: CHECKBOX_SIZES[CheckboxSize.medium].containerMargin,
+ },
+ [CheckboxSize.large]: {
+ padding: CHECKBOX_SIZES[CheckboxSize.large].containerPadding,
+ margin: CHECKBOX_SIZES[CheckboxSize.large].containerMargin,
+ },
+ },
+ disabled: {
+ true: {},
+ false: {},
+ },
+ },
+ defaultVariants: {
+ size: CheckboxSize.medium,
+ disabled: false,
+ },
+});
+export type ContainerVariants = RecipeVariants;
+
+export const input = recipe({
+ base: {
+ appearance: 'none',
+ border: `${CHECKBOX_STYLE.borderWidth}px solid ${CHECKBOX_STYLE.borderColor}`,
+ backgroundColor: CHECKBOX_STYLE.backgroundColor,
+ backgroundSize: CHECKBOX_STYLE.backgroundSize,
+ backgroundPosition: CHECKBOX_STYLE.backgroundPosition,
+ backgroundRepeat: CHECKBOX_STYLE.backgroundRepeat,
+ transition: CHECKBOX_STYLE.transition,
+ cursor: 'pointer',
+ },
+ variants: {
+ size: {
+ [CheckboxSize.small]: {
+ width: CHECKBOX_SIZES[CheckboxSize.small].inputSize,
+ height: CHECKBOX_SIZES[CheckboxSize.small].inputSize,
+ borderRadius: `${CHECKBOX_STYLE.borderRadius}px`,
+ },
+ [CheckboxSize.medium]: {
+ width: CHECKBOX_SIZES[CheckboxSize.medium].inputSize,
+ height: CHECKBOX_SIZES[CheckboxSize.medium].inputSize,
+ borderRadius: `${CHECKBOX_STYLE.borderRadius}px`,
+ },
+ [CheckboxSize.large]: {
+ width: CHECKBOX_SIZES[CheckboxSize.large].inputSize,
+ height: CHECKBOX_SIZES[CheckboxSize.large].inputSize,
+ borderRadius: `${CHECKBOX_STYLE.borderRadius}px`,
+ },
+ },
+ checked: {
+ true: {
+ backgroundColor: CHECKBOX_STYLE.checkedColor,
+ borderColor: CHECKBOX_STYLE.checkedColor,
+ backgroundImage: `url("public/check.svg")`,
+ },
+ },
+ indeterminate: {
+ true: {
+ backgroundColor: CHECKBOX_STYLE.checkedColor,
+ borderColor: CHECKBOX_STYLE.checkedColor,
+ backgroundImage: `url("public/indeterminate.svg")`,
+ },
+ },
+ disabled: {
+ true: {
+ backgroundColor: CHECKBOX_STYLE.disabledColor,
+ borderColor: CHECKBOX_STYLE.disabledColor,
+ cursor: 'not-allowed',
+ },
+ false: {},
+ },
+ },
+ compoundVariants: [
+ {
+ variants: {
+ checked: true,
+ disabled: true,
+ },
+ style: {
+ backgroundColor: CHECKBOX_STYLE.disabledColor,
+ borderColor: CHECKBOX_STYLE.disabledColor,
+ backgroundImage: `url("public/check.svg")`,
+ opacity: 0.6,
+ },
+ },
+ {
+ variants: {
+ indeterminate: true,
+ disabled: true,
+ },
+ style: {
+ backgroundColor: CHECKBOX_STYLE.disabledColor,
+ borderColor: CHECKBOX_STYLE.disabledColor,
+ backgroundImage: `url("public/indeterminate.svg")`,
+ opacity: 0.6,
+ },
+ },
+ ],
+ defaultVariants: {
+ size: CheckboxSize.medium,
+ disabled: false,
+ },
+});
+export type InputVariants = RecipeVariants;
+
+// Label recipe
+export const label = recipe({
+ base: {
+ cursor: 'pointer',
+ },
+ variants: {
+ size: {
+ [CheckboxSize.small]: {
+ fontSize: CHECKBOX_SIZES[CheckboxSize.small].fontSize,
+ },
+ [CheckboxSize.medium]: {
+ fontSize: CHECKBOX_SIZES[CheckboxSize.medium].fontSize,
+ },
+ [CheckboxSize.large]: {
+ fontSize: CHECKBOX_SIZES[CheckboxSize.large].fontSize,
+ },
+ },
+ disabled: {
+ true: {
+ cursor: 'not-allowed',
+ opacity: 0.6,
+ },
+ false: {},
+ },
+ },
+ defaultVariants: {
+ size: CheckboxSize.medium,
+ disabled: false,
+ },
+});
+export type LabelVariants = RecipeVariants;
diff --git a/packages/checkbox/src/Checkbox.module.css b/packages/checkbox/src/Checkbox.module.css
deleted file mode 100644
index c9a42550..00000000
--- a/packages/checkbox/src/Checkbox.module.css
+++ /dev/null
@@ -1,47 +0,0 @@
-.checkbox {
- display: flex;
- align-items: center;
- gap: 8px;
- margin: var(--checkbox-margin);
- padding: var(--checkbox-padding);
-}
-
-.checkbox-input {
- appearance: none;
- width: var(--checkbox-size);
- height: var(--checkbox-size);
- border: var(--border-width) solid var(--border-color);
- border-radius: var(--border-radius);
- background-color: var(--background-color);
-}
-
-.checkbox-input:disabled {
- background-color: var(--disabled-color);
- border-color: var(--disabled-color);
-}
-
-.checkbox-label {
- font-size: var(--label-size);
- cursor: pointer;
-}
-
-.checkbox.disabled .checkbox-label {
- cursor: not-allowed;
- opacity: 0.6;
-}
-
-.checkbox-input:is(:checked, :indeterminate) {
- background-color: var(--checked-color);
- border-color: var(--checked-color);
- background-size: var(--background-size);
- background-position: var(--background-position);
- background-repeat: var(--background-repeat);
-}
-
-.checkbox-input:checked {
- background-image: var(--checked-icon);
-}
-
-.checkbox-input:indeterminate {
- background-image: var(--indeterminate-icon);
-}
diff --git a/packages/checkbox/src/Checkbox.stories.tsx b/packages/checkbox/src/Checkbox.stories.tsx
index c6a65f1e..facd2254 100644
--- a/packages/checkbox/src/Checkbox.stories.tsx
+++ b/packages/checkbox/src/Checkbox.stories.tsx
@@ -5,11 +5,39 @@ import { useCheckboxGroup } from './hooks/useCheckboxGroup';
const meta = {
title: 'Components/Checkbox',
- component: Checkbox,
+ component: Checkbox.Root,
parameters: {
layout: 'centered',
},
-} satisfies Meta;
+ tags: ['autodocs'],
+ argTypes: {
+ size: {
+ control: 'select',
+ options: ['small', 'medium', 'large'],
+ description: 'Size of the checkbox',
+ defaultValue: 'medium',
+ },
+ disabled: {
+ control: 'boolean',
+ description: 'Whether the checkbox is disabled',
+ defaultValue: false,
+ },
+ checked: {
+ control: 'boolean',
+ description: 'Whether the checkbox is checked (controlled)',
+ },
+ defaultChecked: {
+ control: 'boolean',
+ description: 'Default checked state (uncontrolled)',
+ defaultValue: false,
+ },
+ indeterminate: {
+ control: 'boolean',
+ description: 'Whether the checkbox is in an indeterminate state',
+ defaultValue: false,
+ },
+ },
+} satisfies Meta;
export default meta;
@@ -17,137 +45,106 @@ type Story = StoryObj;
export const Basic: Story = {
args: {
- label: 'Basic Checkbox',
- value: 'test',
- name: 'test',
- },
-};
-
-export const Checked: Story = {
- args: {
- label: 'Checked Checkbox',
- value: 'test',
- name: 'test',
- checked: true,
- },
-};
-
-export const Disabled: Story = {
- args: {
- label: 'Disabled Checkbox',
- value: 'test',
- name: 'test',
- disabled: true,
+ size: 'medium',
+ children: (
+ <>
+
+ Basic checkbox
+ >
+ ),
},
};
export const Sizes: Story = {
- render: () => (
-
-
-
-
-
- ),
-};
-
-export const CustomStyles: Story = {
args: {
- label: 'Custom Styled Checkbox',
- style: {
- padding: '20px',
- border: '2px solid #f8f',
- borderRadius: '10px',
- backgroundColor: '#f8f9fa',
- },
- value: 'test',
- name: 'test',
+ children: (
+
+
+
+ Small size
+
+
+
+ Medium size
+
+
+
+ Large size
+
+
+ ),
},
};
export const Controlled: Story = {
render: () => {
- const [isChecked, setIsChecked] = useState(false);
+ const [checked, setChecked] = useState(false);
- return ;
+ return (
+
+
+
+ Controlled checkbox
+
+
+ );
},
};
export const Uncontrolled: Story = {
args: {
- label: 'Uncontrolled Checkbox',
- value: 'test',
- name: 'test',
+ children: (
+
+
+
+ Uncontrolled checkbox
+
+
+ ),
},
};
-export const CheckboxGroup: Story = {
- render: () => {
- const items = ['Item 1', 'Item 2', 'Item 3'];
- const { checkedItems, updateCheckedItems, setAllChecked, allChecked } = useCheckboxGroup({
- total: items.length,
- });
-
- return (
-
-
- {items.map((item, index) => (
-
updateCheckedItems(index, checked)}
- />
- ))}
+export const Disabled: Story = {
+ args: {
+ children: (
+
+
+
+ Disabled unchecked
+
+
+
+ Disabled checked
+
- );
+ ),
},
};
export const Indeterminate: Story = {
render: () => {
- const [parentChecked, setParentChecked] = useState(false);
- const [parentIndeterminate, setParentIndeterminate] = useState(false);
- const [childChecked, setChildChecked] = useState([false, false]);
-
- const updateParentState = (newChildChecked: boolean[]) => {
- const checkedCount = newChildChecked.filter(Boolean).length;
- setParentIndeterminate(checkedCount > 0 && checkedCount < newChildChecked.length);
- setParentChecked(checkedCount === newChildChecked.length);
- };
-
- const handleParentChange = (checked: boolean) => {
- setParentChecked(checked);
- setParentIndeterminate(false);
- setChildChecked([checked, checked]);
- };
-
- const handleChildChange = (index: number, checked: boolean) => {
- const newChildChecked = [...childChecked];
- newChildChecked[index] = checked;
- setChildChecked(newChildChecked);
- updateParentState(newChildChecked);
- };
+ const { allChecked, indeterminate, checkedItems, updateCheckedItems, setAllChecked } = useCheckboxGroup({
+ total: 3,
+ });
return (
-
-
+
+
+
+ Select all options
+
+
- handleChildChange(0, checked)}
- />
- handleChildChange(1, checked)}
- />
+ {checkedItems.map((item, index) => (
+ updateCheckedItems(index, checked)}
+ >
+
+ {`Option ${index + 1}`}
+
+ ))}
);
diff --git a/packages/checkbox/src/Checkbox.test.tsx b/packages/checkbox/src/Checkbox.test.tsx
index 500282c4..be99b6ea 100644
--- a/packages/checkbox/src/Checkbox.test.tsx
+++ b/packages/checkbox/src/Checkbox.test.tsx
@@ -1,92 +1,263 @@
import { fireEvent, render, screen } from '@testing-library/react';
import { describe, expect, test, vi } from 'vitest';
-import { Checkbox } from './Checkbox';
-import { CHECKBOX_SIZES, type CheckboxSize } from './constants/size';
+import { Checkbox, CheckboxSize, type CheckBoxRootBaseProps } from './Checkbox';
+import { CHECKBOX_SIZES } from './Checkbox.css';
+import userEvent from '@testing-library/user-event';
-describe('Checkbox ๊ธฐ๋ณธ ๋์ ํ
์คํธ', () => {
- test('์ฒดํฌ๋ฐ์ค์ ์ํ๋ฅผ ์ค์ ํ ์ ์๋ค.', () => {
- render(
);
+const RenderBasicCheckbox = ({ label, ...props }: CheckBoxRootBaseProps & { label?: string }) => {
+ return (
+
+
+ {label ?? 'Test Checkbox'}
+
+ );
+};
+
+describe('Checkbox', () => {
+ test('should be checked when checked prop is true', () => {
+ render(
);
const checkbox = screen.getByLabelText('Test Checkbox') as HTMLInputElement;
expect(checkbox.checked).toBe(true);
});
- test('์ฒดํฌ๋ฐ์ค์ ๋ ์ด๋ธ์ ํด๋ฆญํ๋ฉด ์ฒดํฌ๋ฐ์ค์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ค.', () => {
+ test('should call onCheckedChange when label is clicked', () => {
const handleChange = vi.fn();
- render(
);
+ render(
);
const label = screen.getByText('Test Checkbox');
fireEvent.click(label);
expect(handleChange).toHaveBeenCalledWith(true);
});
- test('์ฒดํฌ๋ฐ์ค๋ฅผ ํด๋ฆญํ๋ฉด ์ฒดํฌ๋ฐ์ค์ ์ํ๊ฐ ๋ณ๊ฒฝ๋๋ค.', () => {
+ test('should call onCheckedChange when checkbox is clicked', () => {
const handleChange = vi.fn();
- render(
);
+ render(
);
const checkbox = screen.getByLabelText('Test Checkbox') as HTMLInputElement;
fireEvent.click(checkbox);
expect(handleChange).toHaveBeenCalledWith(true);
});
});
-describe('Checkbox ์คํ์ผ ํ
์คํธ', () => {
- test('์ ๋ฌ๋ฐ์ style์ ์ปดํฌ๋ํธ์ ์ ์ฉํ๋ค.', () => {
- render(
);
- const checkbox = screen.getByLabelText('Test Checkbox').parentElement;
- expect(checkbox).toHaveStyle('margin: 10px');
+describe('Checkbox Styling', () => {
+ test('should apply custom styles to all components', () => {
+ const testRootStyle = { backgroundColor: 'red' };
+ const testInputStyle = { backgroundColor: 'blue' };
+ const testLabelStyle = { color: 'green' };
+
+ render(
+
+
+ Test Checkbox
+ ,
+ );
+ const label = screen.getByText('Test Checkbox');
+ const checkbox = screen.getByRole('checkbox');
+ const container = label.parentElement;
+ expect(container).toHaveStyle(testRootStyle);
+ expect(checkbox).toHaveStyle(testInputStyle);
+ expect(label).toHaveStyle(testLabelStyle);
});
- test('checked๋ฅผ ์ฃผ์
ํ์ง ์์ผ๋ฉด checkbox๊ฐ ์ฒดํฌ๋์ง ์์ ์ํ๋ก ๋ ๋๋ง๋๋ค.', () => {
- render(
);
+ test('should apply custom classNames to all components', () => {
+ const testRootClass = 'root-class';
+ const testInputClass = 'input-class';
+ const testLabelClass = 'label-class';
+
+ render(
+
+
+ Test Checkbox
+ ,
+ );
+
+ const label = screen.getByText('Test Checkbox');
+ const checkbox = screen.getByRole('checkbox');
+ const container = label.parentElement;
+
+ expect(container).toHaveClass(testRootClass);
+ expect(checkbox).toHaveClass(testInputClass);
+ expect(label).toHaveClass(testLabelClass);
+ });
+
+ test('should be unchecked by default when checked prop is not provided', () => {
+ render(
);
+
const checkbox = screen.getByLabelText('Test Checkbox') as HTMLInputElement;
expect(checkbox.checked).toBe(false);
});
- test('checked๋ฅผ ์ฃผ์
ํ๋ฉด checkbox๊ฐ ์ฒดํฌ๋ ์ํ๋ก ๋ ๋๋ง๋๋ค.', () => {
- render(
);
+ test('should be checked when checked prop is true', () => {
+ render(
);
+
const checkbox = screen.getByLabelText('Test Checkbox') as HTMLInputElement;
expect(checkbox.checked).toBe(true);
});
- test('disabled๋ฅผ ์ฃผ์
ํ์ง ์์ผ๋ฉด checkbox๊ฐ ํ์ฑํ๋ ์ํ๋ก ๋ ๋๋ง๋๋ค.', () => {
- render(
);
+ test('should be enabled by default when disabled prop is not provided', () => {
+ render(
);
+
const checkbox = screen.getByLabelText('Test Checkbox') as HTMLInputElement;
expect(checkbox.disabled).toBe(false);
});
- test('disabled๋ฅผ ์ฃผ์
ํ๋ฉด checkbox๊ฐ ๋นํ์ฑํ๋ ์ํ๋ก ๋ ๋๋ง๋๋ค.', () => {
- render(
);
+ test('should be disabled when disabled prop is true', () => {
+ render(
);
+
const checkbox = screen.getByLabelText('Test Checkbox') as HTMLInputElement;
expect(checkbox.disabled).toBe(true);
});
- test.each(['small', 'medium', 'large'])('size๋ก %s์ฃผ์
์ ํด๋น ํฌ๊ธฐ๋ก checkbox์ ํฌ๊ธฐ๋ฅผ ์ค์ ํ๋ค.', (size) => {
- render(
);
- const checkbox = screen.getByLabelText('Test Checkbox').parentElement;
- const expectedSize = CHECKBOX_SIZES[size as CheckboxSize].checkboxSize;
- expect(checkbox).toHaveStyle(`--checkbox-size: ${expectedSize}px`);
+ test.each(Object.values(CheckboxSize))('should have correct size when size prop is %s', (size) => {
+ render(
);
+ const checkbox = screen.getByLabelText('Test Checkbox');
+ expect(checkbox).toHaveStyle({
+ width: CHECKBOX_SIZES[size].inputSize,
+ height: CHECKBOX_SIZES[size].inputSize,
+ });
});
- test('size๋ฅผ ์ฃผ์
ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ๊ฐ medium๋ก ํฌ๊ธฐ๋ฅผ ์ค์ ํ๋ค.', () => {
- render(
);
- const checkbox = screen.getByLabelText('Test Checkbox').parentElement;
- expect(checkbox).toHaveStyle(`--checkbox-size: ${CHECKBOX_SIZES.medium.checkboxSize}px`);
+ test('should have medium size by default when size prop is not provided', () => {
+ render(
);
+
+ const checkbox = screen.getByLabelText('Test Checkbox');
+ expect(checkbox).toHaveStyle({
+ width: CHECKBOX_SIZES[CheckboxSize.medium].inputSize,
+ height: CHECKBOX_SIZES[CheckboxSize.medium].inputSize,
+ });
});
});
-describe('Checkbox ์ด๋ฒคํธ ํ
์คํธ', () => {
- // default
- test('์ฒดํฌ๋ฐ์ค ์์ญ์ ํด๋ฆญํ๋ฉด onChange ์ฝ๋ฐฑ์ด ํธ์ถ๋๋ค.', () => {
+describe('Checkbox Event Handling', () => {
+ test('should call onCheckedChange when checkbox is clicked', () => {
const handleChange = vi.fn();
- render(
);
+ render(
);
+
const checkbox = screen.getByLabelText('Test Checkbox') as HTMLInputElement;
fireEvent.click(checkbox);
+
+ expect(handleChange).toHaveBeenCalledWith(true);
+ });
+});
+
+describe('Checkbox Group Behavior', () => {
+ test('should handle multiple checkboxes with same name as a group', async () => {
+ const handleSubmit = vi.fn((e) => {
+ e.preventDefault();
+ const formData = new FormData(e.target);
+ return formData;
+ });
+
+ render(
+
,
+ );
+
+ const appleCheckbox = screen.getByLabelText('Apple');
+ const orangeCheckbox = screen.getByLabelText('Orange');
+ await userEvent.click(appleCheckbox);
+ await userEvent.click(orangeCheckbox);
+
+ const submitButton = screen.getByText('Submit');
+ fireEvent.click(submitButton);
+
+ expect(handleSubmit).toHaveBeenCalled();
+
+ const formDataEntries = Array.from(handleSubmit.mock.results[0]?.value?.entries() ?? []);
+
+ const fruitValues = formDataEntries
+ .filter((entry): entry is [string, string] => Array.isArray(entry) && entry[0] === 'fruits')
+ .map(([, value]) => value);
+
+ expect(fruitValues).toContain('apple');
+ expect(fruitValues).toContain('orange');
+ expect(fruitValues).not.toContain('banana');
+ expect(fruitValues.length).toBe(2);
+ });
+
+ test('should not include unchecked checkboxes in form data', async () => {
+ const handleSubmit = vi.fn((e) => {
+ e.preventDefault();
+ const formData = new FormData(e.target);
+ return formData;
+ });
+
+ render(
+
,
+ );
+
+ const submitButton = screen.getByText('Submit');
+ fireEvent.click(submitButton);
+
+ expect(handleSubmit).toHaveBeenCalled();
+
+ const formDataEntries = Array.from(handleSubmit.mock.results[0]?.value?.entries() ?? []);
+
+ const hasOption1 =
+ formDataEntries.filter((entry): entry is [string, string] => Array.isArray(entry) && entry[0] === 'option1')
+ .length > 0;
+ const hasOption2 =
+ formDataEntries.filter((entry): entry is [string, string] => Array.isArray(entry) && entry[0] === 'option2')
+ .length > 0;
+
+ expect(hasOption1).toBe(false);
+ expect(hasOption2).toBe(false);
+ });
+});
+
+describe('Checkbox Label Connection', () => {
+ test('should check checkbox when clicking associated label', () => {
+ const handleChange = vi.fn();
+
+ render(
);
+
+ const label = screen.getByText('Test Checkbox');
+ fireEvent.click(label);
+
+ expect(handleChange).toHaveBeenCalledWith(true);
+ });
+
+ test('should automatically connect label and input with generated ID', () => {
+ const handleChange = vi.fn();
+
+ render(
);
+
+ const label = screen.getByText('Test Checkbox');
+ fireEvent.click(label);
+
expect(handleChange).toHaveBeenCalledWith(true);
});
});
-describe('Checkbox ์ ๊ทผ์ฑ ํ
์คํธ', () => {
- test('label์ ํตํด ์ฒดํฌ๋ฐ์ค์ ์ฉ๋๋ฅผ ์ ๊ณตํ๋ค.', () => {
- render(
);
- const checkbox = screen.getByLabelText('Accessible Checkbox');
- expect(checkbox).toBeInTheDocument();
+describe('Required Checkbox Behavior', () => {
+ test('should block form submission when required checkbox is unchecked', async () => {
+ const handleSubmit = vi.fn((e) => {
+ e.preventDefault();
+ });
+
+ const handleInvalid = vi.fn();
+
+ render(
+
,
+ );
+
+ const submitButton = screen.getByText('Submit');
+ fireEvent.click(submitButton);
+ expect(handleSubmit).not.toHaveBeenCalled();
+ expect(handleInvalid).toHaveBeenCalled();
+ const checkbox = screen.getByLabelText('Test Checkbox');
+ fireEvent.click(checkbox);
+ fireEvent.click(submitButton);
+ expect(handleSubmit).toHaveBeenCalled();
});
});
diff --git a/packages/checkbox/src/Checkbox.tsx b/packages/checkbox/src/Checkbox.tsx
index 79923681..df89a165 100644
--- a/packages/checkbox/src/Checkbox.tsx
+++ b/packages/checkbox/src/Checkbox.tsx
@@ -1,119 +1,152 @@
-import { Slot } from '@radix-ui/react-slot';
-import { clsx as cx } from 'clsx';
-import { type CSSProperties, type ComponentProps, type ReactNode, useEffect, useId, useRef } from 'react';
+import clsx from 'clsx';
+import {
+ createContext,
+ forwardRef,
+ useContext,
+ useId,
+ type ChangeEventHandler,
+ type ComponentProps,
+ type Ref,
+} from 'react';
+import { container, input, label } from './Checkbox.css';
+import { useControllableState } from './hooks/useControllableState';
-import styles from './Checkbox.module.css';
-import { type CheckStyleConfig, DEFAULT_CHECK_STYLE } from './constants/checkStyle';
-import { CHECKBOX_SIZES, type CheckboxSize } from './constants/size';
+export const CheckboxSize = {
+ small: 'small',
+ medium: 'medium',
+ large: 'large',
+} as const;
+export type CheckboxSize = (typeof CheckboxSize)[keyof typeof CheckboxSize];
-export interface CheckboxProps extends ComponentProps<'div'> {
- name?: string;
- value?: string;
+export type CheckBoxRootBaseProps = Partial
, 'size'>> & {
size?: CheckboxSize;
- checked?: boolean;
- indeterminate?: boolean;
- disabled?: boolean;
- label?: string;
onCheckedChange?: (checked: boolean) => void;
- asChild?: boolean;
- innerRef?: React.RefObject;
- children?: ReactNode;
- checkStyleConfig?: Partial;
+ indeterminate?: boolean;
+};
+interface CheckboxContextValue extends CheckBoxRootBaseProps {
+ ref?: Ref | undefined;
}
-export const Checkbox = ({
- className,
- name,
- value,
- label,
- asChild = true,
- size = 'medium',
- checked,
- indeterminate = false,
- disabled = false,
- onCheckedChange,
- children,
- style: _style,
- innerRef,
- checkStyleConfig = {},
- ...props
-}: CheckboxProps) => {
- const localRef = useRef(null);
- const inputRef = useRef(null);
- const inputId = useId();
-
- useEffect(() => {
- if (inputRef.current) {
- inputRef.current.indeterminate = indeterminate;
- }
- }, [indeterminate]);
-
- const Component = asChild ? Slot : 'div';
-
- const handleChange = () => {
- if (!disabled && onCheckedChange) {
- onCheckedChange(!checked);
- }
- };
-
- const sizeConfig = CHECKBOX_SIZES[size];
- const mergedStyleConfig = { ...DEFAULT_CHECK_STYLE, ...checkStyleConfig };
-
- const style = {
- '--checkbox-size': `${sizeConfig.checkboxSize}px`,
- '--label-size': `${sizeConfig.labelSize}px`,
- '--checkbox-padding': `${sizeConfig.padding}px`,
- '--checkbox-margin': `${sizeConfig.margin}px`,
- '--border-radius': `${mergedStyleConfig.borderRadius}px`,
- '--border-width': `${mergedStyleConfig.borderWidth}px`,
- '--border-color': mergedStyleConfig.borderColor,
- '--background-color': mergedStyleConfig.backgroundColor,
- '--checked-color': mergedStyleConfig.checkedColor,
- '--disabled-color': mergedStyleConfig.disabledColor,
- '--hover-color': mergedStyleConfig.hoverColor,
- '--checked-icon': `url(${mergedStyleConfig.checkedIcon})`,
- '--indeterminate-icon': `url(${mergedStyleConfig.indeterminateIcon})`,
- '--background-size': mergedStyleConfig.backgroundSize,
- '--background-position': mergedStyleConfig.backgroundPosition,
- '--background-repeat': mergedStyleConfig.backgroundRepeat,
- ..._style,
- } as CSSProperties;
-
- if (!label && children) {
- return <>{children}>;
+const CheckboxContext = createContext(null);
+
+const useCheckbox = () => {
+ const context = useContext(CheckboxContext);
+ if (!context) {
+ throw new Error('Checkbox compound components must be used within Checkbox.Root');
}
+ return context;
+};
+
+const Root = forwardRef(
+ (
+ {
+ className = '',
+ size = CheckboxSize.medium,
+ indeterminate = false,
+ onCheckedChange,
+ children,
+ style,
+ checked,
+ ...props
+ },
+ ref,
+ ) => {
+ const internalId = useId();
+ const id = props.id ?? internalId;
+
+ const [checkedState, setCheckedState] = useControllableState({
+ prop: checked,
+ defaultProp: props.defaultChecked || false,
+ onChange: onCheckedChange || (() => {}),
+ });
+
+ const contextValue: CheckboxContextValue = {
+ ...props,
+ indeterminate,
+ ref,
+ id,
+ size,
+ onCheckedChange: setCheckedState,
+ checked: checkedState === undefined ? false : checkedState,
+ };
+
+ return (
+
+ {children}
+
+ );
+ },
+);
+
+type CheckboxInputProps = Omit, 'size' | 'checked' | 'id'>;
- const content = (
-
+const Input = forwardRef(
+ ({ onChange, value, name, className, ...props }, ref) => {
+ const {
+ id,
+ checked,
+ disabled,
+ size,
+ onChange: contextOnChange,
+ onCheckedChange,
+ name: contextName,
+ value: contextValue,
+ indeterminate,
+ ref: contextRef,
+ ...rootProps
+ } = useCheckbox();
+
+ const handleChange: ChangeEventHandler = (e) => {
+ try {
+ if (onChange) {
+ onChange(e);
+ }
+
+ if (contextOnChange) {
+ contextOnChange(e);
+ }
+
+ onCheckedChange?.(e.target.checked);
+ } catch (error) {
+ console.error('Checkbox onChange error', error);
+ }
+ };
+
+ return (
- {label && (
-
- {label}
-
- )}
-
+ );
+ },
+);
+
+const Label = forwardRef>(({ children, className, ...props }, ref) => {
+ const { id, disabled, size } = useCheckbox();
+
+ return (
+
+ {children}
+
);
+});
+
+Root.displayName = 'Checkbox.Root';
+Input.displayName = 'Checkbox.Input';
+Label.displayName = 'Checkbox.Label';
- return asChild ? {content} : content;
+export const Checkbox = {
+ Root,
+ Input,
+ Label,
};
diff --git a/packages/checkbox/src/constants/checkStyle.ts b/packages/checkbox/src/constants/checkStyle.ts
deleted file mode 100644
index 3bfcac05..00000000
--- a/packages/checkbox/src/constants/checkStyle.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-import CheckboxIcon from '../images/checkbox-icon.svg';
-import minusIcon from '../images/minus-icon.svg';
-
-export interface CheckStyleConfig {
- borderRadius: number;
- borderWidth: number;
- borderColor: string;
- backgroundColor: string;
- checkedColor: string;
- disabledColor: string;
- hoverColor: string;
- checkedIcon: string;
- indeterminateIcon: string;
- backgroundSize: string;
- backgroundPosition: string;
- backgroundRepeat: string;
-}
-
-export const DEFAULT_CHECK_STYLE: CheckStyleConfig = {
- borderRadius: 4,
- borderWidth: 1,
- borderColor: '#D1D5DB',
- backgroundColor: '#FFFFFF',
- checkedColor: '#3B82F6',
- disabledColor: '#E5E7EB',
- hoverColor: '#F3F4F6',
- checkedIcon: CheckboxIcon,
- indeterminateIcon: minusIcon,
- backgroundSize: '100%',
- backgroundPosition: 'center',
- backgroundRepeat: 'no-repeat',
-} as const;
diff --git a/packages/checkbox/src/constants/size.ts b/packages/checkbox/src/constants/size.ts
deleted file mode 100644
index cb6db4fa..00000000
--- a/packages/checkbox/src/constants/size.ts
+++ /dev/null
@@ -1,29 +0,0 @@
-export type CheckboxSize = 'small' | 'medium' | 'large';
-
-export interface SizeConfig {
- checkboxSize: number;
- labelSize: number;
- padding: number;
- margin: number;
-}
-
-export const CHECKBOX_SIZES: Record = {
- small: {
- checkboxSize: 16,
- labelSize: 14,
- padding: 8,
- margin: 4,
- },
- medium: {
- checkboxSize: 20,
- labelSize: 16,
- padding: 10,
- margin: 6,
- },
- large: {
- checkboxSize: 24,
- labelSize: 18,
- padding: 12,
- margin: 8,
- },
-} as const;
diff --git a/packages/checkbox/src/hooks/useControllableState.ts b/packages/checkbox/src/hooks/useControllableState.ts
new file mode 100644
index 00000000..bacfc2eb
--- /dev/null
+++ b/packages/checkbox/src/hooks/useControllableState.ts
@@ -0,0 +1,43 @@
+import { useCallback, useEffect, useRef, useState } from 'react';
+
+type UseControllableStateParams = {
+ prop?: T;
+ defaultProp?: T;
+ onChange?: (state: NonNullable) => void;
+};
+
+function useControllableState({ prop, defaultProp, onChange = () => {} }: UseControllableStateParams) {
+ const [uncontrolledState, setUncontrolledState] = useState(defaultProp);
+ const isControlled = prop !== undefined;
+ const value = isControlled ? prop : uncontrolledState;
+
+ const callbackRef = useRef(onChange);
+ useEffect(() => {
+ callbackRef.current = onChange;
+ });
+
+ const setValue = useCallback(
+ (nextValue: T | ((prevValue: T) => T)) => {
+ const newValue = typeof nextValue === 'function' ? (nextValue as (prevValue: T) => T)(value as T) : nextValue;
+
+ if (isControlled) {
+ if (newValue !== prop) callbackRef.current(newValue as NonNullable);
+ } else {
+ setUncontrolledState(newValue);
+ }
+ },
+ [isControlled, prop, value],
+ );
+
+ const prevValueRef = useRef(value);
+ useEffect(() => {
+ if (!isControlled && prevValueRef.current !== value) {
+ callbackRef.current(value as NonNullable);
+ prevValueRef.current = value;
+ }
+ }, [value, isControlled]);
+
+ return [value, setValue] as const;
+}
+
+export { useControllableState };
diff --git a/packages/checkbox/src/index.ts b/packages/checkbox/src/index.ts
index 0da541d4..7ed57d43 100644
--- a/packages/checkbox/src/index.ts
+++ b/packages/checkbox/src/index.ts
@@ -1,2 +1,3 @@
export * from './Checkbox';
export * from './hooks/useCheckboxGroup';
+export * from './hooks/useControllableState';
diff --git a/packages/checkbox/src/images/checkbox-icon.svg b/packages/checkbox/src/public/check.svg
similarity index 100%
rename from packages/checkbox/src/images/checkbox-icon.svg
rename to packages/checkbox/src/public/check.svg
diff --git a/packages/checkbox/src/images/minus-icon.svg b/packages/checkbox/src/public/indeterminate.svg
similarity index 100%
rename from packages/checkbox/src/images/minus-icon.svg
rename to packages/checkbox/src/public/indeterminate.svg
diff --git a/packages/checkbox/src/types/svg.d.ts b/packages/checkbox/src/types/svg.d.ts
deleted file mode 100644
index cdb2b1a9..00000000
--- a/packages/checkbox/src/types/svg.d.ts
+++ /dev/null
@@ -1,4 +0,0 @@
-declare module '*.svg' {
- const content: string;
- export default content;
-}
diff --git a/packages/checkbox/tsconfig.json b/packages/checkbox/tsconfig.json
index 4082f16a..f264cd9a 100644
--- a/packages/checkbox/tsconfig.json
+++ b/packages/checkbox/tsconfig.json
@@ -1,3 +1,4 @@
{
- "extends": "../../tsconfig.json"
+ "extends": "../../tsconfig.json",
+ "exclude": ["dist", "node_modules"]
}
diff --git a/packages/chip/package.json b/packages/chip/package.json
new file mode 100644
index 00000000..82c1d792
--- /dev/null
+++ b/packages/chip/package.json
@@ -0,0 +1,57 @@
+{
+ "name": "@side/chip",
+ "version": "0.0.1",
+ "description": "Chip component for SIDE design system",
+ "main": "./dist/index.js",
+ "module": "./dist/index.mjs",
+ "types": "./dist/index.d.ts",
+ "exports": {
+ ".": {
+ "import": "./dist/index.mjs",
+ "require": "./dist/index.js",
+ "types": "./dist/index.d.ts"
+ },
+ "./package.json": "./package.json"
+ },
+ "files": [
+ "dist"
+ ],
+ "scripts": {
+ "build": "tsup",
+ "dev": "tsup --watch",
+ "test": "vitest",
+ "test:ui": "vitest --ui",
+ "test:coverage": "vitest --coverage",
+ "typecheck": "tsc --noEmit"
+ },
+ "dependencies": {
+ "@radix-ui/react-slot": "^1.0.2",
+ "@vanilla-extract/css": "^1.14.0",
+ "@vanilla-extract/recipes": "^0.5.1",
+ "clsx": "^2.0.0"
+ },
+ "devDependencies": {
+ "@sipe-team/tokens": "workspace:*",
+ "@testing-library/jest-dom": "catalog:",
+ "@testing-library/react": "catalog:",
+ "@testing-library/user-event": "catalog:",
+ "@types/react": "^18.2.0",
+ "jsdom": "^26.1.0",
+ "react": "^18.2.0",
+ "tsup": "^8.0.0",
+ "typescript": "^5.0.0",
+ "vitest": "^1.0.0"
+ },
+ "peerDependencies": {
+ "react": ">=18.0.0"
+ },
+ "keywords": [
+ "chip",
+ "tag",
+ "badge",
+ "design-system",
+ "react"
+ ],
+ "author": "SIDE Team",
+ "license": "MIT"
+}
diff --git a/packages/chip/src/Chip.constants.ts b/packages/chip/src/Chip.constants.ts
new file mode 100644
index 00000000..0f62c7c5
--- /dev/null
+++ b/packages/chip/src/Chip.constants.ts
@@ -0,0 +1,21 @@
+export const ChipVariant = {
+ filled: 'filled',
+ outline: 'outline',
+} as const;
+export type ChipVariant = (typeof ChipVariant)[keyof typeof ChipVariant];
+
+export const ChipSize = {
+ small: 'small',
+ medium: 'medium',
+ large: 'large',
+} as const;
+export type ChipSize = (typeof ChipSize)[keyof typeof ChipSize];
+
+export const ChipColor = {
+ primary: 'primary',
+ secondary: 'secondary',
+ success: 'success',
+ warning: 'warning',
+ danger: 'danger',
+} as const;
+export type ChipColor = (typeof ChipColor)[keyof typeof ChipColor];
diff --git a/packages/chip/src/Chip.css.ts b/packages/chip/src/Chip.css.ts
new file mode 100644
index 00000000..a835836e
--- /dev/null
+++ b/packages/chip/src/Chip.css.ts
@@ -0,0 +1,358 @@
+import { color } from '@sipe-team/tokens';
+
+import { style } from '@vanilla-extract/css';
+import { recipe } from '@vanilla-extract/recipes';
+
+const transparentColor = 'transparent';
+
+export const disabled = style({
+ opacity: 0.4,
+ cursor: 'not-allowed',
+ pointerEvents: 'none',
+});
+
+export const chip = recipe({
+ base: {
+ display: 'inline-flex',
+ alignItems: 'center',
+ justifyContent: 'center',
+ borderRadius: 9999,
+ fontWeight: 600,
+ cursor: 'pointer',
+ transition: 'all 0.2s ease-in-out',
+ border: '1px solid',
+ outline: 'none',
+ userSelect: 'none',
+ ':disabled': {
+ cursor: 'not-allowed',
+ opacity: 0.4,
+ },
+ },
+ variants: {
+ size: {
+ small: {
+ padding: '4px 12px',
+ fontSize: '12px',
+ lineHeight: '16px',
+ height: '24px',
+ },
+ medium: {
+ padding: '8px 16px',
+ fontSize: '14px',
+ lineHeight: '20px',
+ height: '32px',
+ },
+ large: {
+ padding: '12px 20px',
+ fontSize: '16px',
+ lineHeight: '24px',
+ height: '40px',
+ },
+ },
+ variant: {
+ filled: {
+ borderColor: transparentColor,
+ },
+ outline: {
+ backgroundColor: transparentColor,
+ },
+ },
+ color: {
+ primary: {},
+ secondary: {},
+ success: {},
+ warning: {},
+ danger: {},
+ },
+ state: {
+ default: {},
+ selected: {},
+ },
+ },
+ compoundVariants: [
+ // Primary color combinations
+ {
+ variants: {
+ color: 'primary',
+ variant: 'filled',
+ state: 'default',
+ },
+ style: {
+ backgroundColor: color.gray700,
+ color: color.white,
+ borderColor: color.gray700,
+ ':hover': {
+ backgroundColor: color.gray600,
+ borderColor: color.gray600,
+ },
+ ':focus': {
+ outlineColor: color.gray500,
+ },
+ },
+ },
+ {
+ variants: {
+ color: 'primary',
+ variant: 'filled',
+ state: 'selected',
+ },
+ style: {
+ backgroundColor: color.cyan400,
+ color: color.black,
+ borderColor: color.cyan400,
+ ':hover': {
+ backgroundColor: color.cyan300,
+ borderColor: color.cyan300,
+ },
+ ':focus': {
+ outlineColor: color.cyan300,
+ },
+ },
+ },
+ {
+ variants: {
+ color: 'primary',
+ variant: 'outline',
+ state: 'default',
+ },
+ style: {
+ backgroundColor: transparentColor,
+ color: color.gray700,
+ borderColor: color.gray400,
+ ':hover': {
+ backgroundColor: color.gray100,
+ borderColor: color.gray500,
+ },
+ ':focus': {
+ outlineColor: color.gray500,
+ },
+ },
+ },
+ {
+ variants: {
+ color: 'primary',
+ variant: 'outline',
+ state: 'selected',
+ },
+ style: {
+ backgroundColor: transparentColor,
+ color: color.cyan400,
+ borderColor: color.cyan400,
+ ':hover': {
+ backgroundColor: color.cyan100,
+ borderColor: color.cyan400,
+ },
+ ':focus': {
+ outlineColor: color.cyan400,
+ },
+ },
+ },
+ // Secondary color combinations
+ {
+ variants: {
+ color: 'secondary',
+ variant: 'filled',
+ state: 'default',
+ },
+ style: {
+ backgroundColor: color.gray600,
+ color: color.white,
+ borderColor: color.gray600,
+ ':hover': {
+ backgroundColor: color.gray500,
+ borderColor: color.gray500,
+ },
+ },
+ },
+ {
+ variants: {
+ color: 'secondary',
+ variant: 'filled',
+ state: 'selected',
+ },
+ style: {
+ backgroundColor: color.purple400,
+ color: color.white,
+ borderColor: color.purple400,
+ ':hover': {
+ backgroundColor: color.purple300,
+ borderColor: color.purple300,
+ },
+ },
+ },
+ // Success color combinations
+ {
+ variants: {
+ color: 'success',
+ variant: 'filled',
+ state: 'default',
+ },
+ style: {
+ backgroundColor: color.green500,
+ color: color.white,
+ borderColor: color.green500,
+ ':hover': {
+ backgroundColor: color.green400,
+ borderColor: color.green400,
+ },
+ },
+ },
+ // Warning color combinations
+ {
+ variants: {
+ color: 'warning',
+ variant: 'filled',
+ state: 'default',
+ },
+ style: {
+ backgroundColor: color.orange500,
+ color: color.white,
+ borderColor: color.orange500,
+ ':hover': {
+ backgroundColor: color.orange400,
+ borderColor: color.orange400,
+ },
+ },
+ },
+ // Danger color combinations
+ {
+ variants: {
+ color: 'danger',
+ variant: 'filled',
+ state: 'default',
+ },
+ style: {
+ backgroundColor: color.red500,
+ color: color.white,
+ borderColor: color.red500,
+ ':hover': {
+ backgroundColor: color.red400,
+ borderColor: color.red400,
+ },
+ },
+ },
+ // Success outline combinations
+ {
+ variants: {
+ color: 'success',
+ variant: 'outline',
+ state: 'default',
+ },
+ style: {
+ backgroundColor: transparentColor,
+ color: color.green500,
+ borderColor: color.green500,
+ ':hover': {
+ backgroundColor: color.green100,
+ borderColor: color.green600,
+ },
+ ':focus': {
+ outlineColor: color.green500,
+ },
+ },
+ },
+ {
+ variants: {
+ color: 'success',
+ variant: 'outline',
+ state: 'selected',
+ },
+ style: {
+ backgroundColor: color.green100,
+ color: color.green600,
+ borderColor: color.green500,
+ ':hover': {
+ backgroundColor: color.green200,
+ borderColor: color.green600,
+ },
+ ':focus': {
+ outlineColor: color.green500,
+ },
+ },
+ },
+ // Warning outline combinations
+ {
+ variants: {
+ color: 'warning',
+ variant: 'outline',
+ state: 'default',
+ },
+ style: {
+ backgroundColor: transparentColor,
+ color: color.orange500,
+ borderColor: color.orange500,
+ ':hover': {
+ backgroundColor: color.orange100,
+ borderColor: color.orange600,
+ },
+ ':focus': {
+ outlineColor: color.orange500,
+ },
+ },
+ },
+ {
+ variants: {
+ color: 'warning',
+ variant: 'outline',
+ state: 'selected',
+ },
+ style: {
+ backgroundColor: color.orange100,
+ color: color.orange600,
+ borderColor: color.orange500,
+ ':hover': {
+ backgroundColor: color.orange200,
+ borderColor: color.orange600,
+ },
+ ':focus': {
+ outlineColor: color.orange500,
+ },
+ },
+ },
+ // Danger outline combinations
+ {
+ variants: {
+ color: 'danger',
+ variant: 'outline',
+ state: 'default',
+ },
+ style: {
+ backgroundColor: transparentColor,
+ color: color.red500,
+ borderColor: color.red500,
+ ':hover': {
+ backgroundColor: color.red100,
+ borderColor: color.red600,
+ },
+ ':focus': {
+ outlineColor: color.red500,
+ },
+ },
+ },
+ {
+ variants: {
+ color: 'danger',
+ variant: 'outline',
+ state: 'selected',
+ },
+ style: {
+ backgroundColor: color.red100,
+ color: color.red600,
+ borderColor: color.red500,
+ ':hover': {
+ backgroundColor: color.red200,
+ borderColor: color.red600,
+ },
+ ':focus': {
+ outlineColor: color.red500,
+ },
+ },
+ },
+ ],
+ defaultVariants: {
+ color: 'primary',
+ variant: 'filled',
+ size: 'medium',
+ state: 'default',
+ },
+});
diff --git a/packages/chip/src/Chip.stories.tsx b/packages/chip/src/Chip.stories.tsx
new file mode 100644
index 00000000..bc035fe2
--- /dev/null
+++ b/packages/chip/src/Chip.stories.tsx
@@ -0,0 +1,79 @@
+import type { Meta, StoryObj } from '@storybook/react';
+
+import { Chip } from './Chip';
+import { ChipColor, ChipSize, ChipVariant } from './Chip.constants';
+
+const meta = {
+ title: 'Components/Chip',
+ component: Chip,
+ parameters: {
+ layout: 'centered',
+ },
+ tags: ['autodocs'],
+ argTypes: {
+ color: {
+ control: 'select',
+ options: Object.values(ChipColor),
+ },
+ variant: {
+ control: 'select',
+ options: Object.values(ChipVariant),
+ },
+ size: {
+ control: 'select',
+ options: Object.values(ChipSize),
+ },
+ selected: {
+ control: 'boolean',
+ },
+ },
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+export const Default: Story = {
+ args: {
+ children: 'SIPE chip',
+ },
+};
+
+export const Colors: Story = {
+ render: () => (
+
+ Primary
+ Secondary
+ Success
+ Warning
+ Danger
+
+ ),
+};
+
+export const Variants: Story = {
+ render: () => (
+
+ Filled
+ Outline
+
+ ),
+};
+
+export const Sizes: Story = {
+ render: () => (
+
+ Small
+ Medium
+ Large
+
+ ),
+};
+
+export const States: Story = {
+ render: () => (
+
+ Default
+ Selected
+
+ ),
+};
diff --git a/packages/chip/src/Chip.test.tsx b/packages/chip/src/Chip.test.tsx
new file mode 100644
index 00000000..e01d3011
--- /dev/null
+++ b/packages/chip/src/Chip.test.tsx
@@ -0,0 +1,61 @@
+import { render, screen } from '@testing-library/react';
+import { describe, expect, it } from 'vitest';
+
+import { Chip } from './Chip';
+
+describe('Chip', () => {
+ it('renders correctly', () => {
+ render(Test Chip );
+ expect(screen.getByText('Test Chip')).toBeTruthy();
+ });
+
+ it('applies correct default props', () => {
+ render(Default Chip );
+ const chip = screen.getByText('Default Chip');
+ expect(chip).toBeTruthy();
+ });
+
+ it('applies custom props correctly', () => {
+ render(
+
+ Custom Chip
+ ,
+ );
+ const chip = screen.getByText('Custom Chip');
+ expect(chip).toBeTruthy();
+ });
+
+ it('renders as button by default', () => {
+ render(Button Chip );
+ const chip = screen.getByText('Button Chip');
+ expect(chip.tagName).toBe('BUTTON');
+ });
+
+ it('renders as custom element with asChild', () => {
+ render(
+
+ Div Chip
+ ,
+ );
+ const chip = screen.getByText('Div Chip');
+ expect(chip.tagName).toBe('DIV');
+ });
+
+ it('applies disabled class when disabled', () => {
+ render(Disabled Chip );
+ const chip = screen.getByText('Disabled Chip');
+ expect(chip).toBeTruthy();
+ });
+
+ it('handles selected prop correctly', () => {
+ render(Selected Chip );
+ const chip = screen.getByText('Selected Chip');
+ expect(chip).toBeTruthy();
+ });
+
+ it('handles selected prop as false by default', () => {
+ render(Default Chip );
+ const chip = screen.getByText('Default Chip');
+ expect(chip).toBeTruthy();
+ });
+});
diff --git a/packages/chip/src/Chip.tsx b/packages/chip/src/Chip.tsx
new file mode 100644
index 00000000..4b2f63d1
--- /dev/null
+++ b/packages/chip/src/Chip.tsx
@@ -0,0 +1,41 @@
+import { type ComponentProps, type ForwardedRef, forwardRef } from 'react';
+
+import { Slot } from '@radix-ui/react-slot';
+
+import { clsx as cx } from 'clsx';
+
+import type { ChipColor, ChipSize, ChipVariant } from './Chip.constants';
+import * as styles from './Chip.css';
+
+export interface ChipProps extends ComponentProps<'button'> {
+ color?: ChipColor;
+ variant?: ChipVariant;
+ size?: ChipSize;
+ selected?: boolean;
+ asChild?: boolean;
+}
+
+export const Chip = forwardRef(function Chip(
+ {
+ color = 'primary',
+ variant = 'filled',
+ size = 'medium',
+ selected = false,
+ asChild,
+ disabled,
+ className: _className,
+ children,
+ ...props
+ }: ChipProps,
+ ref: ForwardedRef,
+) {
+ const Component = asChild ? Slot : 'button';
+ const state = selected ? 'selected' : 'default';
+ const className = cx(styles.chip({ color, variant, size, state }), { [styles.disabled]: disabled }, _className);
+
+ return (
+
+ {children}
+
+ );
+});
diff --git a/packages/chip/src/index.ts b/packages/chip/src/index.ts
new file mode 100644
index 00000000..86f09db5
--- /dev/null
+++ b/packages/chip/src/index.ts
@@ -0,0 +1,2 @@
+export * from './Chip';
+export * from './Chip.constants';
diff --git a/packages/chip/tsconfig.json b/packages/chip/tsconfig.json
new file mode 100644
index 00000000..94128fa4
--- /dev/null
+++ b/packages/chip/tsconfig.json
@@ -0,0 +1,5 @@
+{
+ "extends": "../../tsconfig.json",
+ "include": ["src/**/*"],
+ "exclude": ["node_modules", "dist"]
+}
diff --git a/packages/chip/tsup.config.ts b/packages/chip/tsup.config.ts
new file mode 100644
index 00000000..bed0ab27
--- /dev/null
+++ b/packages/chip/tsup.config.ts
@@ -0,0 +1,9 @@
+import { defineConfig } from 'tsup';
+
+export default defineConfig({
+ entry: ['src/index.ts'],
+ format: ['cjs', 'esm'],
+ dts: true,
+ clean: true,
+ external: ['react', '@radix-ui/react-slot', 'clsx'],
+});
diff --git a/packages/chip/vitest.config.ts b/packages/chip/vitest.config.ts
new file mode 100644
index 00000000..e663baf0
--- /dev/null
+++ b/packages/chip/vitest.config.ts
@@ -0,0 +1,12 @@
+import { defineProject, mergeConfig } from 'vitest/config';
+
+import defaultConfig from '../../vitest.config';
+
+export default mergeConfig(
+ defaultConfig,
+ defineProject({
+ test: {
+ setupFiles: './vitest.setup.ts',
+ },
+ }),
+);
diff --git a/packages/chip/vitest.setup.ts b/packages/chip/vitest.setup.ts
new file mode 100644
index 00000000..7b0828bf
--- /dev/null
+++ b/packages/chip/vitest.setup.ts
@@ -0,0 +1 @@
+import '@testing-library/jest-dom';
diff --git a/packages/divider/package.json b/packages/divider/package.json
index 8329e78a..af278cdf 100644
--- a/packages/divider/package.json
+++ b/packages/divider/package.json
@@ -13,15 +13,16 @@
"scripts": {
"build": "tsup",
"build:storybook": "storybook build",
+ "clean": "rm -rf node_modules dist",
"dev:storybook": "storybook dev -p 6006",
- "lint:biome": "pnpm exec biome lint",
- "lint:eslint": "pnpm exec eslint",
+ "lint": "pnpm exec biome lint",
"test": "vitest",
"typecheck": "tsc",
"prepack": "pnpm run build"
},
"dependencies": {
- "clsx": "^2.1.1"
+ "clsx": "^2.1.1",
+ "@sipe-team/tokens": "workspace:*"
},
"devDependencies": {
"@sipe-team/typography": "workspace:*",
@@ -35,6 +36,7 @@
"@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.0.1",
"@types/react": "catalog:react",
+ "@vanilla-extract/css": "catalog:",
"happy-dom": "catalog:",
"react": "catalog:react",
"react-dom": "catalog:react",
diff --git a/packages/divider/src/Divider.css.ts b/packages/divider/src/Divider.css.ts
new file mode 100644
index 00000000..de228394
--- /dev/null
+++ b/packages/divider/src/Divider.css.ts
@@ -0,0 +1,30 @@
+import { color } from '@sipe-team/tokens';
+import { style, styleVariants } from '@vanilla-extract/css';
+import type { ColorType, OrientationType } from './constants';
+
+export const base = style({
+ border: 0,
+ margin: 0,
+ flexShrink: 0,
+});
+
+const orientationStyles: Record = {
+ horizontal: {
+ width: '100%',
+ height: '1px',
+ },
+ vertical: {
+ width: '1px',
+ height: '100%',
+ },
+};
+
+export const orientations = styleVariants(orientationStyles);
+
+const colorStyles: Record = {
+ default: { backgroundColor: color.gray300 },
+ primary: { backgroundColor: color.cyan300 },
+ dark: { backgroundColor: color.gray900 },
+};
+
+export const colors = styleVariants(colorStyles);
diff --git a/packages/divider/src/Divider.module.css b/packages/divider/src/Divider.module.css
deleted file mode 100644
index 97610b6e..00000000
--- a/packages/divider/src/Divider.module.css
+++ /dev/null
@@ -1,16 +0,0 @@
-.divider {
- border: 0;
- margin: 0;
- flex-shrink: 0;
- background-color: black;
-}
-
-.horizontal.divider {
- width: 100%;
- height: 1px;
-}
-
-.vertical.divider {
- width: 1px;
- height: 100%;
-}
diff --git a/packages/divider/src/Divider.stories.tsx b/packages/divider/src/Divider.stories.tsx
index 2bc3fc71..20500b6a 100644
--- a/packages/divider/src/Divider.stories.tsx
+++ b/packages/divider/src/Divider.stories.tsx
@@ -1,6 +1,7 @@
import { Typography } from '@sipe-team/typography';
import type { Meta, StoryObj } from '@storybook/react';
import { Divider } from './Divider';
+import { DIVIDER_COLORS, DIVIDER_ORIENTATIONS } from './constants';
const meta = {
title: 'Components/Divider',
@@ -8,6 +9,18 @@ const meta = {
parameters: {
layout: 'centered',
},
+ argTypes: {
+ orientation: {
+ description: '๊ตฌ๋ถ์ ์ ๋ฐฉํฅ',
+ control: 'radio',
+ options: DIVIDER_ORIENTATIONS,
+ },
+ color: {
+ description: '๊ตฌ๋ถ์ ์ ์์',
+ control: 'radio',
+ options: DIVIDER_COLORS,
+ },
+ },
} satisfies Meta;
export default meta;
@@ -47,26 +60,50 @@ export const Basic: Story = {
- {/* ์คํ์ผ ์น์
*/}
+ {/* ์์ ๋ณํ ์น์
*/}
+
+
+ ์์ ๋ณํ
+
+
+
+
+
๊ธฐ๋ณธ ์์ (default)
+
+
+
+
+
๋ฉ์ธ ์์ (primary)
+
+
+
+
+
์ด๋์ด ์์ (dark)
+
+
+
+
+
+ {/* ๊ณ ๊ธ ์คํ์ผ๋ง ์น์
*/}
- ์คํ์ผ๋ง
+ ๊ณ ๊ธ ์คํ์ผ๋ง
-
default
-
+
์ฌ์ฉ์ ์ ์ ์์
+
-
colored
-
+
๋๊ป๊ฒ (4px)
+
diff --git a/packages/divider/src/Divider.test.tsx b/packages/divider/src/Divider.test.tsx
index e2d7dcb6..694c88e1 100644
--- a/packages/divider/src/Divider.test.tsx
+++ b/packages/divider/src/Divider.test.tsx
@@ -1,9 +1,10 @@
+import { color } from '@sipe-team/tokens';
import { render, screen } from '@testing-library/react';
import { describe, expect, test } from 'vitest';
import { Divider } from './Divider';
describe('Divider', () => {
- test('orientation ์์ฑ์ด ์์ผ๋ฉด ๊ฐ๋ก ๋ฐฉํฅ์ผ๋ก ๊ทธ๋ฆฐ๋ค.', () => {
+ test('orientation ์์ฑ์ด ์์ผ๋ฉด ๊ฐ๋ก ๋ฐฉํฅ์ผ๋ก ๊ทธ๋ฆฌ๊ณ ๊ธฐ๋ณธ ์์์ ๊ฐ์ง๋ค.', () => {
render( );
const divider = screen.getByRole('separator');
@@ -12,6 +13,7 @@ describe('Divider', () => {
expect(divider).toHaveStyle({
width: '100%',
height: '1px',
+ backgroundColor: color.gray300,
});
});
@@ -42,4 +44,20 @@ describe('Divider', () => {
margin: '8px',
});
});
+
+ test('color ์์ฑ์ ๋ฐ๋ผ ๋ฐฐ๊ฒฝ์์ด ๋ณ๊ฒฝ๋๋ค.', () => {
+ render( );
+
+ const divider = screen.getByRole('separator');
+ expect(divider).toHaveStyle({
+ backgroundColor: color.cyan300,
+ });
+ });
+
+ test('className์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฌ๋๋ค.', () => {
+ render( );
+
+ const divider = screen.getByRole('separator');
+ expect(divider).toHaveClass('custom-class');
+ });
});
diff --git a/packages/divider/src/Divider.tsx b/packages/divider/src/Divider.tsx
index 5b002cdf..1db39d65 100644
--- a/packages/divider/src/Divider.tsx
+++ b/packages/divider/src/Divider.tsx
@@ -1,20 +1,23 @@
import { clsx as cx } from 'clsx';
import { type ComponentProps, forwardRef } from 'react';
-import styles from './Divider.module.css';
+import * as styles from './Divider.css';
+import type { ColorType, OrientationType } from './constants';
-interface DividerProps extends ComponentProps<'hr'> {
- orientation?: 'horizontal' | 'vertical';
+export interface DividerProps extends ComponentProps<'hr'> {
+ orientation?: OrientationType;
+ color?: ColorType;
}
-export const Divider = forwardRef(function Divider({
- orientation = 'horizontal',
- ...props
-}: DividerProps) {
+export const Divider = forwardRef(function Divider(
+ { orientation = 'horizontal', color = 'default', className, ...props }: DividerProps,
+ ref,
+) {
return (
);
});
diff --git a/packages/divider/src/constants/index.ts b/packages/divider/src/constants/index.ts
new file mode 100644
index 00000000..5582a3dc
--- /dev/null
+++ b/packages/divider/src/constants/index.ts
@@ -0,0 +1,5 @@
+export const DIVIDER_ORIENTATIONS = ['horizontal', 'vertical'] as const;
+export type OrientationType = (typeof DIVIDER_ORIENTATIONS)[number];
+
+export const DIVIDER_COLORS = ['default', 'primary', 'dark'] as const;
+export type ColorType = (typeof DIVIDER_COLORS)[number];
diff --git a/packages/flex/package.json b/packages/flex/package.json
index 7217a541..63d8bec1 100644
--- a/packages/flex/package.json
+++ b/packages/flex/package.json
@@ -13,9 +13,9 @@
"scripts": {
"build": "tsup",
"build:storybook": "storybook build",
+ "clean": "rm -rf node_modules dist",
"dev:storybook": "storybook dev -p 6006",
- "lint:biome": "pnpm exec biome lint",
- "lint:eslint": "pnpm exec eslint",
+ "lint": "pnpm exec biome lint",
"test": "vitest",
"typecheck": "tsc",
"prepack": "pnpm run build"
@@ -36,6 +36,7 @@
"@testing-library/jest-dom": "catalog:",
"@testing-library/react": "catalog:",
"@types/react": "catalog:react",
+ "@vanilla-extract/css": "catalog:",
"happy-dom": "catalog:",
"react": "catalog:react",
"react-dom": "catalog:react",
diff --git a/packages/flex/src/Flex.css.ts b/packages/flex/src/Flex.css.ts
new file mode 100644
index 00000000..194d13db
--- /dev/null
+++ b/packages/flex/src/Flex.css.ts
@@ -0,0 +1,47 @@
+import { style, styleVariants } from '@vanilla-extract/css';
+import type { FlexDirection, FlexAlign, FlexJustify, FlexWrap } from './constants';
+
+export const base = style({
+ display: 'flex',
+});
+
+const directionStyles: Record = {
+ row: { flexDirection: 'row' },
+ column: { flexDirection: 'column' },
+ 'row-reverse': { flexDirection: 'row-reverse' },
+ 'column-reverse': { flexDirection: 'column-reverse' },
+};
+export const direction = styleVariants(directionStyles);
+
+const alignStyles: Record = {
+ 'flex-start': { alignItems: 'flex-start' },
+ 'flex-end': { alignItems: 'flex-end' },
+ center: { alignItems: 'center' },
+ stretch: { alignItems: 'stretch' },
+ baseline: { alignItems: 'baseline' },
+ normal: { alignItems: 'normal' },
+};
+export const align = styleVariants(alignStyles);
+
+const justifyStyles: Record = {
+ 'flex-start': { justifyContent: 'flex-start' },
+ 'flex-end': { justifyContent: 'flex-end' },
+ center: { justifyContent: 'center' },
+ 'space-between': { justifyContent: 'space-between' },
+ 'space-around': { justifyContent: 'space-around' },
+ 'space-evenly': { justifyContent: 'space-evenly' },
+ normal: { justifyContent: 'normal' },
+};
+export const justify = styleVariants(justifyStyles);
+
+const wrapStyles: Record = {
+ nowrap: { flexWrap: 'nowrap' },
+ wrap: { flexWrap: 'wrap' },
+ 'wrap-reverse': { flexWrap: 'wrap-reverse' },
+};
+export const wrap = styleVariants(wrapStyles);
+
+export const display = styleVariants({
+ flex: { display: 'flex' },
+ 'inline-flex': { display: 'inline-flex' },
+});
diff --git a/packages/flex/src/Flex.module.css b/packages/flex/src/Flex.module.css
deleted file mode 100644
index 22d5bede..00000000
--- a/packages/flex/src/Flex.module.css
+++ /dev/null
@@ -1,11 +0,0 @@
-.flex {
- display: var(--flex-display);
- flex-direction: var(--flex-direction);
- align-items: var(--flex-align);
- justify-content: var(--flex-justify);
- flex-wrap: var(--flex-wrap);
- gap: var(--flex-gap);
- flex-basis: var(--flex-basis);
- flex-grow: var(--flex-grow);
- flex-shrink: var(--flex-shrink);
-}
diff --git a/packages/flex/src/Flex.stories.tsx b/packages/flex/src/Flex.stories.tsx
index 82acd5fa..c8cc435f 100644
--- a/packages/flex/src/Flex.stories.tsx
+++ b/packages/flex/src/Flex.stories.tsx
@@ -13,12 +13,12 @@ const meta = {
},
align: {
control: 'select',
- options: ['flex-start', 'flex-end', 'center', 'stretch', 'baseline'],
+ options: ['flex-start', 'flex-end', 'center', 'stretch', 'baseline', 'normal'],
description: 'Align items',
},
justify: {
control: 'select',
- options: ['flex-start', 'flex-end', 'center', 'space-between', 'space-around', 'space-evenly'],
+ options: ['flex-start', 'flex-end', 'center', 'space-between', 'space-around', 'space-evenly', 'normal'],
description: 'Justify content',
},
wrap: {
@@ -34,6 +34,18 @@ const meta = {
control: 'boolean',
description: 'Display as inline-flex',
},
+ grow: {
+ control: { type: 'number', min: 0, max: 5, step: 1 },
+ description: 'Flex grow factor',
+ },
+ shrink: {
+ control: { type: 'number', min: 0, max: 5, step: 1 },
+ description: 'Flex shrink factor',
+ },
+ basis: {
+ control: 'text',
+ description: 'Flex basis',
+ },
},
} satisfies Meta;
@@ -70,7 +82,7 @@ export const Basic: Story = {
export const Direction: Story = {
args: {
- direction: 'column',
+ direction: 'row',
gap: '1rem',
style: { width: '100%' },
children: [ , , ],
@@ -139,3 +151,26 @@ export const Wrap: Story = {
],
},
};
+
+export const FlexGrowShrink: Story = {
+ render: () => (
+
+ Fixed width
+ Grow 1
+ Grow 2
+
+ ),
+};
+
+export const InlineFlex: Story = {
+ render: () => (
+
+
Text before
+
+ Item 1
+ Item 2
+
+
Text after
+
+ ),
+};
diff --git a/packages/flex/src/Flex.tsx b/packages/flex/src/Flex.tsx
index 93f91dd1..69b88b22 100644
--- a/packages/flex/src/Flex.tsx
+++ b/packages/flex/src/Flex.tsx
@@ -1,13 +1,17 @@
+import { type ComponentProps, type CSSProperties, type ForwardedRef, forwardRef } from 'react';
+
import { Slot } from '@radix-ui/react-slot';
+
import { clsx as cx } from 'clsx';
-import { type CSSProperties, type ComponentProps, type ForwardedRef, forwardRef } from 'react';
-import styles from './Flex.module.css';
+
+import type { FlexAlign, FlexDirection, FlexJustify, FlexWrap } from './constants';
+import * as styles from './Flex.css';
export interface FlexProps extends ComponentProps<'div'> {
- align?: CSSProperties['alignItems'];
- justify?: CSSProperties['justifyContent'];
- wrap?: CSSProperties['flexWrap'];
- direction?: CSSProperties['flexDirection'];
+ direction?: FlexDirection;
+ align?: FlexAlign;
+ justify?: FlexJustify;
+ wrap?: FlexWrap;
basis?: CSSProperties['flexBasis'];
grow?: CSSProperties['flexGrow'];
shrink?: CSSProperties['flexShrink'];
@@ -18,14 +22,14 @@ export interface FlexProps extends ComponentProps<'div'> {
export const Flex = forwardRef(function Flex(
{
- align,
- justify,
- wrap,
- direction,
+ direction = 'row',
+ align = 'normal',
+ justify = 'normal',
+ wrap = 'nowrap',
basis,
grow,
shrink,
- inline,
+ inline = false,
gap,
className,
style,
@@ -33,25 +37,30 @@ export const Flex = forwardRef(function Flex(
asChild,
...rest
}: FlexProps,
- ref: ForwardedRef,
+ ref: ForwardedRef,
) {
const Component = asChild ? Slot : 'div';
- const flexStyle = {
- '--flex-display': inline ? 'inline-flex' : 'flex',
- '--flex-direction': direction ?? 'row',
- '--flex-align': align ?? 'normal',
- '--flex-justify': justify ?? 'normal',
- '--flex-wrap': wrap ?? 'nowrap',
- '--flex-gap': gap,
- '--flex-basis': basis,
- '--flex-grow': grow,
- '--flex-shrink': shrink,
+ const classNames = cx(
+ styles.base,
+ styles.direction[direction],
+ styles.align[align],
+ styles.justify[justify],
+ styles.wrap[wrap],
+ inline ? styles.display['inline-flex'] : styles.display.flex,
+ className,
+ );
+
+ const inlineStyles = {
+ flexBasis: basis,
+ flexGrow: grow,
+ flexShrink: shrink,
+ gap,
...style,
- } as React.CSSProperties;
+ };
return (
-
+
{children}
);
diff --git a/packages/flex/src/constants/index.ts b/packages/flex/src/constants/index.ts
new file mode 100644
index 00000000..05be4d0a
--- /dev/null
+++ b/packages/flex/src/constants/index.ts
@@ -0,0 +1,19 @@
+export const FLEX_DIRECTIONS = ['row', 'column', 'row-reverse', 'column-reverse'] as const;
+export type FlexDirection = (typeof FLEX_DIRECTIONS)[number];
+
+export const FLEX_ALIGNS = ['flex-start', 'flex-end', 'center', 'stretch', 'baseline', 'normal'] as const;
+export type FlexAlign = (typeof FLEX_ALIGNS)[number];
+
+export const FLEX_JUSTIFY_CONTENTS = [
+ 'flex-start',
+ 'flex-end',
+ 'center',
+ 'space-between',
+ 'space-around',
+ 'space-evenly',
+ 'normal',
+] as const;
+export type FlexJustify = (typeof FLEX_JUSTIFY_CONTENTS)[number];
+
+export const FLEX_WRAPS = ['nowrap', 'wrap', 'wrap-reverse'] as const;
+export type FlexWrap = (typeof FLEX_WRAPS)[number];
diff --git a/packages/grid/package.json b/packages/grid/package.json
index 59e8c836..7ccd6dc5 100644
--- a/packages/grid/package.json
+++ b/packages/grid/package.json
@@ -13,9 +13,9 @@
"scripts": {
"build": "tsup",
"build:storybook": "storybook build",
+ "clean": "rm -rf node_modules dist",
"dev:storybook": "storybook dev -p 6006",
- "lint:biome": "pnpm exec biome lint",
- "lint:eslint": "pnpm exec eslint",
+ "lint": "pnpm exec biome lint",
"test": "vitest",
"typecheck": "tsc",
"prepack": "pnpm run build"
@@ -36,6 +36,7 @@
"@testing-library/jest-dom": "catalog:",
"@testing-library/react": "catalog:",
"@types/react": "catalog:react",
+ "@vanilla-extract/css": "catalog:",
"happy-dom": "catalog:",
"react": "catalog:react",
"storybook": "catalog:",
diff --git a/packages/grid/src/Grid.css.ts b/packages/grid/src/Grid.css.ts
new file mode 100644
index 00000000..bc5361e9
--- /dev/null
+++ b/packages/grid/src/Grid.css.ts
@@ -0,0 +1,31 @@
+import { style } from '@vanilla-extract/css';
+
+export const grid = style({
+ display: 'var(--grid-display)',
+ gridTemplateColumns: 'var(--grid-template-columns)',
+ gridTemplateRows: 'var(--grid-template-rows)',
+ gridTemplateAreas: 'var(--grid-template-areas)',
+ gap: 'var(--grid-gap)',
+ gridAutoFlow: 'var(--grid-auto-flow)',
+ alignItems: 'var(--grid-align-items)',
+ justifyItems: 'var(--grid-justify-items)',
+ alignContent: 'var(--grid-align-content)',
+ justifyContent: 'var(--grid-justify-content)',
+});
+
+export const gridItem = style({
+ alignSelf: 'var(--grid-align-self)',
+ justifySelf: 'var(--grid-justify-self)',
+});
+
+export const gridItemArea = style({
+ gridArea: 'var(--grid-area)',
+});
+
+export const gridItemColumn = style({
+ gridColumn: 'var(--grid-column)',
+});
+
+export const gridItemRow = style({
+ gridRow: 'var(--grid-row)',
+});
diff --git a/packages/grid/src/Grid.module.css b/packages/grid/src/Grid.module.css
deleted file mode 100644
index 6a7c2d9b..00000000
--- a/packages/grid/src/Grid.module.css
+++ /dev/null
@@ -1,29 +0,0 @@
-.grid {
- display: var(--grid-display);
- grid-template-columns: var(--grid-template-columns);
- grid-template-rows: var(--grid-template-rows);
- grid-template-areas: var(--grid-template-areas);
- gap: var(--grid-gap);
- grid-auto-flow: var(--grid-auto-flow);
- align-items: var(--grid-align-items);
- justify-items: var(--grid-justify-items);
- align-content: var(--grid-align-content);
- justify-content: var(--grid-justify-content);
-}
-
-.grid-item {
- align-self: var(--grid-align-self);
- justify-self: var(--grid-justify-self);
-}
-
-.grid-item-area {
- grid-area: var(--grid-area);
-}
-
-.grid-item-column {
- grid-column: var(--grid-column);
-}
-
-.grid-item-row {
- grid-row: var(--grid-row);
-}
diff --git a/packages/grid/src/Grid.stories.tsx b/packages/grid/src/Grid.stories.tsx
index a45b18c2..0e54686e 100644
--- a/packages/grid/src/Grid.stories.tsx
+++ b/packages/grid/src/Grid.stories.tsx
@@ -1,4 +1,5 @@
import type { Meta, StoryObj } from '@storybook/react';
+
import * as Grid from './Grid';
const meta = {
diff --git a/packages/grid/src/Grid.test.tsx b/packages/grid/src/Grid.test.tsx
index 59d7506f..935d3261 100644
--- a/packages/grid/src/Grid.test.tsx
+++ b/packages/grid/src/Grid.test.tsx
@@ -1,7 +1,9 @@
+import { createElement } from 'react';
+
import { faker } from '@faker-js/faker';
import { render, screen } from '@testing-library/react';
-import { createElement } from 'react';
import { describe, expect, it } from 'vitest';
+
import * as Grid from './Grid';
describe('Grid', () => {
diff --git a/packages/grid/src/Grid.tsx b/packages/grid/src/Grid.tsx
index e3687963..d27611b6 100644
--- a/packages/grid/src/Grid.tsx
+++ b/packages/grid/src/Grid.tsx
@@ -1,7 +1,10 @@
+import { type ComponentProps, type CSSProperties, type ForwardedRef, forwardRef, useMemo } from 'react';
+
import { Slot } from '@radix-ui/react-slot';
+
import { clsx as cx } from 'clsx';
-import { type CSSProperties, type ComponentProps, type ForwardedRef, forwardRef, useMemo } from 'react';
-import styles from './Grid.module.css';
+
+import * as styles from './Grid.css';
export interface GridProps extends ComponentProps<'div'> {
templateColumns?: CSSProperties['gridTemplateColumns'];
@@ -32,7 +35,7 @@ export const Grid = forwardRef(function Grid(
asChild,
...props
}: GridProps,
- ref: ForwardedRef,
+ ref: ForwardedRef,
) {
const Component = asChild ? Slot : 'div';
@@ -92,7 +95,7 @@ export const GridItem = forwardRef(function GridItem(
children,
...props
}: GridItemProps,
- ref: ForwardedRef,
+ ref: ForwardedRef,
) {
const Component = asChild ? Slot : 'div';
@@ -111,11 +114,11 @@ export const GridItem = forwardRef(function GridItem(
}, [row, rowSpan, rowStart, rowEnd]);
const gridItemClasses = cx(
- styles['grid-item'],
+ styles.gridItem,
{
- [styles['grid-item-column']]: getGridColumn,
- [styles['grid-item-row']]: getGridRow,
- [styles['grid-item-area']]: area,
+ [styles.gridItemColumn]: getGridColumn,
+ [styles.gridItemRow]: getGridRow,
+ [styles.gridItemArea]: area,
},
className,
);
diff --git a/packages/grid/src/index.ts b/packages/grid/src/index.ts
index c3794cb0..5a1f79b1 100644
--- a/packages/grid/src/index.ts
+++ b/packages/grid/src/index.ts
@@ -1,2 +1,2 @@
-export { Grid, GridItem, Root, Item } from './Grid';
-export type { GridProps, GridItemProps } from './Grid';
+export type { GridItemProps, GridProps } from './Grid';
+export { Grid, GridItem, Item, Root } from './Grid';
diff --git a/packages/grid/vitest.config.ts b/packages/grid/vitest.config.ts
index a9178275..e663baf0 100644
--- a/packages/grid/vitest.config.ts
+++ b/packages/grid/vitest.config.ts
@@ -1,4 +1,5 @@
import { defineProject, mergeConfig } from 'vitest/config';
+
import defaultConfig from '../../vitest.config';
export default mergeConfig(
diff --git a/packages/icon/package.json b/packages/icon/package.json
index a46f9a44..6214d761 100644
--- a/packages/icon/package.json
+++ b/packages/icon/package.json
@@ -13,9 +13,9 @@
"scripts": {
"build": "tsup",
"build:storybook": "storybook build",
+ "clean": "rm -rf node_modules dist",
"dev:storybook": "storybook dev -p 6006",
- "lint:biome": "pnpm exec biome lint",
- "lint:eslint": "pnpm exec eslint",
+ "lint": "pnpm exec biome lint",
"test": "vitest",
"typecheck": "tsc",
"prepack": "pnpm run build",
diff --git a/packages/icon/src/components/AccordionArrowIcon.tsx b/packages/icon/src/components/AccordionArrowIcon.tsx
index 9fc23675..fd36920c 100644
--- a/packages/icon/src/components/AccordionArrowIcon.tsx
+++ b/packages/icon/src/components/AccordionArrowIcon.tsx
@@ -1,10 +1,16 @@
import * as React from 'react';
+
import type { IconProps } from '../types';
-export const AccordionArrowIcon = React.forwardRef(
- ({ color, size = 24, ...props }, ref) => {
- return ;
- }
-);
+export const AccordionArrowIcon = React.forwardRef(({ color, size = 24, ...props }, ref) => {
+ return (
+
+
+
+ );
+});
AccordionArrowIcon.displayName = 'AccordionArrowIcon';
diff --git a/packages/input/package.json b/packages/input/package.json
index a28b43a8..aa814153 100644
--- a/packages/input/package.json
+++ b/packages/input/package.json
@@ -13,18 +13,21 @@
"scripts": {
"build": "tsup",
"build:storybook": "storybook build",
+ "clean": "rm -rf node_modules dist",
"dev:storybook": "storybook dev -p 6006",
- "lint:biome": "pnpm exec biome lint",
- "lint:eslint": "pnpm exec eslint",
+ "lint": "pnpm exec biome lint",
"test": "vitest",
"typecheck": "tsc",
"prepack": "pnpm run build"
},
"dependencies": {
"@radix-ui/react-slot": "^1.1.0",
- "classnames": "^2.5.1"
+ "@sipe-team/tokens": "workspace:*",
+ "@vanilla-extract/recipes": "^0.5.5",
+ "clsx": "^2.1.1"
},
"devDependencies": {
+ "@vanilla-extract/css": "catalog:",
"@storybook/addon-essentials": "catalog:",
"@storybook/addon-interactions": "catalog:",
"@storybook/addon-links": "catalog:",
diff --git a/packages/input/src/Input.css.ts b/packages/input/src/Input.css.ts
new file mode 100644
index 00000000..9ab4300a
--- /dev/null
+++ b/packages/input/src/Input.css.ts
@@ -0,0 +1,140 @@
+import { color } from '@sipe-team/tokens';
+
+import { style } from '@vanilla-extract/css';
+import { recipe } from '@vanilla-extract/recipes';
+
+import type { InputFontSize, InputFontWeight } from './Input';
+
+// TODO ThemeProvider ์ ์ฉ
+export const colors = {
+ inputRing: color.gray800,
+ defaultInputOutline: color.gray400,
+ disabledBackground: color.gray300,
+} as const;
+
+export const spacing = {
+ defaultInputPadding: '8px',
+ defaultBorderRadius: '8px',
+ defaultActionSize: '24px',
+} as const;
+
+export const weight = {
+ regular: 400,
+ medium: 500,
+ semiBold: 600,
+ bold: 700,
+} as const;
+
+export const defaultFontSize: InputFontSize = 16;
+export const defaultFontWeight: InputFontWeight = 'regular';
+
+export const inputWrapper = recipe({
+ base: {
+ display: 'flex',
+ flex: 1,
+ alignItems: 'center',
+ fontStyle: 'normal',
+ textAlign: 'start',
+ padding: spacing.defaultInputPadding,
+ borderRadius: spacing.defaultBorderRadius,
+ outline: `1px solid ${colors.defaultInputOutline}`,
+
+ '@supports': {
+ 'selector(:has(*))': {
+ selectors: {
+ '&:where(:has(input:focus))': {
+ outline: `2px solid ${colors.defaultInputOutline}`,
+ outlineOffset: '-1px',
+ },
+ '&:where(:has(input:disabled))': {
+ backgroundColor: colors.disabledBackground,
+ },
+ },
+ },
+ 'not selector(:has(*))': {
+ selectors: {
+ '&:where(:focus-within)': {
+ outline: `2px solid ${colors.defaultInputOutline}`,
+ outlineOffset: '-1px',
+ },
+ },
+ },
+ },
+ },
+ variants: {
+ fontSize: {
+ 12: { fontSize: '12px' },
+ 14: { fontSize: '14px' },
+ 16: { fontSize: '16px' },
+ 18: { fontSize: '18px' },
+ 20: { fontSize: '20px' },
+ 24: { fontSize: '24px' },
+ 28: { fontSize: '28px' },
+ 32: { fontSize: '32px' },
+ 36: { fontSize: '36px' },
+ 48: { fontSize: '48px' },
+ },
+ fontWeight: {
+ regular: { fontWeight: weight.regular },
+ medium: { fontWeight: weight.medium },
+ semiBold: { fontWeight: weight.semiBold },
+ bold: { fontWeight: weight.bold },
+ },
+ },
+ defaultVariants: {
+ fontSize: defaultFontSize,
+ fontWeight: defaultFontWeight,
+ },
+});
+
+export const inputElement = style({
+ width: '100%',
+ display: 'flex',
+ alignItems: 'center',
+ textAlign: 'inherit',
+ outline: '1px solid transparent',
+ border: 'none',
+ fontSize: 'inherit',
+ fontWeight: 'inherit',
+
+ selectors: {
+ '&::-webkit-search-cancel-button': {
+ appearance: 'none',
+ },
+ },
+
+ '@supports': {
+ 'selector(:has(*))': {
+ selectors: {
+ '&:where(:autofill, [data-com-onepassword-filled])': {
+ backgroundClip: 'text',
+ WebkitTextFillColor: color.gray900,
+ },
+ '&:where(:disabled)': {
+ backgroundColor: 'transparent',
+ },
+ },
+ },
+ },
+});
+
+export const inputAction = style({
+ all: 'unset',
+ width: spacing.defaultActionSize,
+ height: spacing.defaultActionSize,
+ display: 'flex',
+ justifyContent: 'center',
+ alignItems: 'center',
+ borderRadius: spacing.defaultBorderRadius,
+
+ '@supports': {
+ 'selector(:has(*))': {
+ selectors: {
+ '&:focus': {
+ outline: `2px solid ${colors.defaultInputOutline}`,
+ outlineOffset: '3px',
+ },
+ },
+ },
+ },
+});
diff --git a/packages/input/src/Input.module.css b/packages/input/src/Input.module.css
deleted file mode 100644
index 794b14d9..00000000
--- a/packages/input/src/Input.module.css
+++ /dev/null
@@ -1,78 +0,0 @@
-.input-wrapper {
- display: flex;
- flex: 1;
- align-items: center;
- font-style: normal;
- text-align: start;
-
- padding: var(--input-padding);
- border-radius: var(--input-border-radius);
- outline: 1px solid var(--input-ring-color);
-
- @supports selector(:has(*)) {
- &:where(:has(.input:focus)) {
- outline: 2px solid var(--input-ring-color);
- outline-offset: -1px;
- }
-
- &:where(:has(.input:disabled)) {
- background-color: var(--input-disabled-color);
- }
- }
- @supports not selector(:has(*)) {
- &:where(:focus-within) {
- outline: 2px solid var(--input-ring-color);
- outline-offset: -1px;
- }
- }
-}
-
-.input {
- width: 100%;
- display: flex;
- align-items: center;
- text-align: inherit;
-
- outline: 1px solid transparent;
- border: none;
-
- font-size: var(--font-size);
- font-weight: var(--font-weight);
-
- /* ๊ธฐ๋ณธ ์ทจ์ ๋ฒํผ ์ ๊ฑฐ */
- &::-webkit-search-cancel-button {
- appearance: none;
- }
-
- @supports selector(:has(*)) {
- &:where(:autofill, [data-com-onepassword-filled]) {
- background-clip: text;
- -webkit-text-fill-color: var(--gray-12);
- }
- }
-
- @supports selector(:has(*)) {
- &:where(:disabled) {
- background-color: transparent;
- }
- }
-}
-
-.input-action {
- all: unset;
-
- width: var(--action-size);
- height: var(--action-size);
-
- display: flex;
- justify-content: center;
- align-items: center;
- border-radius: var(--input-border-radius);
-
- @supports selector(:has(*)) {
- &:focus {
- outline: 2px solid var(--input-ring-color);
- outline-offset: 3px;
- }
- }
-}
diff --git a/packages/input/src/Input.test.tsx b/packages/input/src/Input.test.tsx
index 434d284d..3ed17606 100644
--- a/packages/input/src/Input.test.tsx
+++ b/packages/input/src/Input.test.tsx
@@ -1,11 +1,13 @@
import '@testing-library/jest-dom';
+
+import { createRef } from 'react';
+
import { render, screen } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import { createRef } from 'react';
import { describe, expect, test } from 'vitest';
+
import { Action, Input } from './Input';
-import { colors } from './constants/colors';
-import { Weight, defaultFontSize, defaultFontWeight } from './constants/typhography';
+import { defaultFontSize, defaultFontWeight, weight } from './Input.css';
describe('Input ์ปดํฌ๋ํธ', () => {
describe('๋ ๋๋ง', () => {
@@ -25,12 +27,10 @@ describe('Input ์ปดํฌ๋ํธ', () => {
expect(ref.current).toBeInstanceOf(HTMLInputElement);
});
- test(`disabled์ผ ๋ ๋ฐฐ๊ฒฝ์์ด ์ ์๋ ๋นํ์ฑํ ์์(${colors.disabledBackground})์ผ๋ก ์ค์ ๋๋ค`, () => {
- const disableColor = colors.disabledBackground;
- const { container } = render( );
- const element = container.firstChild as HTMLElement;
- const styles = getComputedStyle(element);
- expect(styles.getPropertyValue('--input-disabled-color')).toBe(disableColor);
+ test('disabled ์ํ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋๋ค', () => {
+ render( );
+ const input = screen.getByRole('textbox');
+ expect(input).toBeDisabled();
});
test('classNames๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉ๋๋ค', () => {
@@ -46,9 +46,10 @@ describe('Input ์ปดํฌ๋ํธ', () => {
test(`fontWeight๊ฐ ๋ฏธ์ง์ ์ ${defaultFontWeight}, fontSize๊ฐ ๋ฏธ์ง์ ์ ${defaultFontSize}px์ด ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ ์ฉ๋๋ค`, () => {
const { container } = render( );
const element = container.firstChild as HTMLElement;
- const styles = getComputedStyle(element);
- expect(styles.getPropertyValue('--font-size')).toBe(`${defaultFontSize}px`);
- expect(styles.getPropertyValue('--font-weight')).toBe(`${Weight[defaultFontWeight]}`);
+ const computedStyle = getComputedStyle(element);
+
+ expect(computedStyle.fontSize).toBe(`${defaultFontSize}px`);
+ expect(computedStyle.fontWeight).toBe(`${weight[defaultFontWeight]}`);
});
test('๋ณ๊ฒฝ ํฐํธ ์ฌ์ด์ฆ, ํฐํธ ์จ์ดํธ ์ ์ฉ๋๋ค.', () => {
@@ -56,9 +57,10 @@ describe('Input ์ปดํฌ๋ํธ', () => {
const fontWeight = 'semiBold';
const { container } = render( );
const element = container.firstChild as HTMLElement;
- const styles = getComputedStyle(element);
- expect(styles.getPropertyValue('--font-size')).toBe(`${fontSize}px`);
- expect(styles.getPropertyValue('--font-weight')).toBe(`${Weight[fontWeight]}`);
+ const computedStyle = getComputedStyle(element);
+
+ expect(computedStyle.fontSize).toBe(`${fontSize}px`);
+ expect(computedStyle.fontWeight).toBe(`${weight[fontWeight]}`);
});
});
diff --git a/packages/input/src/Input.tsx b/packages/input/src/Input.tsx
index c0593c0c..198b6709 100644
--- a/packages/input/src/Input.tsx
+++ b/packages/input/src/Input.tsx
@@ -1,19 +1,20 @@
-import classNames from 'classnames';
-import { type CSSProperties, type ComponentPropsWithoutRef, type ElementRef, forwardRef } from 'react';
+import { type ComponentPropsWithoutRef, type ElementRef, forwardRef } from 'react';
import { Slot } from '@radix-ui/react-slot';
-import styles from './Input.module.css';
-import { colors } from './constants/colors';
-import { spacing } from './constants/spacing';
-import { type FontSize, type FontWeight, Weight, defaultFontSize, defaultFontWeight } from './constants/typhography';
+import cx from 'clsx';
+import { defaultFontSize, defaultFontWeight, inputAction, inputElement, inputWrapper, type weight } from './Input.css';
+
+export type InputFontSize = 12 | 14 | 16 | 18 | 20 | 24 | 28 | 32 | 36 | 48;
+export type InputFontWeight = keyof typeof weight;
type AllowedInputTypes = 'email' | 'password' | 'search' | 'tel' | 'text' | 'url';
type InputFieldElement = ElementRef<'input'>;
+
interface InputProps extends Omit, 'type'> {
type?: AllowedInputTypes;
- fontSize?: FontSize;
- fontWeight?: FontWeight;
+ fontSize?: InputFontSize;
+ fontWeight?: InputFontWeight;
}
const Input = forwardRef((props, forwardedRef) => {
@@ -28,22 +29,8 @@ const Input = forwardRef((props, forwardedRef) =>
} = props;
return (
-
-
+
+
{children}
);
@@ -63,13 +50,12 @@ interface InputFieldActionProps extends Omit
,
}
const InputFieldAction = forwardRef((props, forwardedRef) => {
- const { className, asChild, type = 'button', ...slotProps } = props;
+ const { className, asChild, type, ...slotProps } = props;
const Comp = asChild ? Slot : 'button';
- return ;
+ return ;
});
InputFieldAction.displayName = 'Input.Action';
export { InputFieldAction as Action, Input };
-
export type { InputProps, InputFieldActionProps as SlotProps };
diff --git a/packages/input/src/constants/colors.ts b/packages/input/src/constants/colors.ts
deleted file mode 100644
index 315b4b00..00000000
--- a/packages/input/src/constants/colors.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export type ColorKeys = keyof typeof colors;
-export const colors = {
- inputRing: '#2B2B2B',
- defaultInputOutline: '#adadad',
- disabledBackground: '#BBBBBB',
-} as const;
diff --git a/packages/input/src/constants/spacing.ts b/packages/input/src/constants/spacing.ts
deleted file mode 100644
index c52097c7..00000000
--- a/packages/input/src/constants/spacing.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-export type SpacingKeys = keyof typeof spacing;
-export const spacing = {
- defaultInputPadding: '8px',
- defaultBorderRadius: '8px',
- defaultActionSize: '24px',
-} as const;
diff --git a/packages/input/src/constants/typhography.ts b/packages/input/src/constants/typhography.ts
deleted file mode 100644
index 8dbab86b..00000000
--- a/packages/input/src/constants/typhography.ts
+++ /dev/null
@@ -1,12 +0,0 @@
-export type FontSize = 12 | 14 | 16 | 18 | 20 | 24 | 28 | 32 | 36 | 48;
-export type FontWeight = keyof typeof Weight;
-
-export const defaultFontSize: FontSize = 16;
-export const defaultFontWeight: FontWeight = 'regular';
-
-export const Weight = {
- regular: 400,
- medium: 500,
- semiBold: 600,
- bold: 700,
-} as const;
diff --git a/packages/input/tsconfig.json b/packages/input/tsconfig.json
index 4f0f1797..4082f16a 100644
--- a/packages/input/tsconfig.json
+++ b/packages/input/tsconfig.json
@@ -1,4 +1,3 @@
{
- "extends": "../../tsconfig.json",
- "exclude": ["dist"]
+ "extends": "../../tsconfig.json"
}
diff --git a/packages/plugin-figma-codegen/package.json b/packages/plugin-figma-codegen/package.json
index 48c2a252..75c3c389 100644
--- a/packages/plugin-figma-codegen/package.json
+++ b/packages/plugin-figma-codegen/package.json
@@ -12,6 +12,7 @@
"files": ["dist", "manifest.json"],
"scripts": {
"build": "tsup",
+ "clean": "rm -rf node_modules dist",
"dev": "pnpm build --watch",
"lint": "biome lint .",
"typecheck": "tsc",
diff --git a/packages/radio/package.json b/packages/radio/package.json
index 470d001d..0c722d94 100644
--- a/packages/radio/package.json
+++ b/packages/radio/package.json
@@ -13,13 +13,19 @@
"scripts": {
"build": "tsup",
"build:storybook": "storybook build",
+ "clean": "rm -rf node_modules dist",
"dev:storybook": "storybook dev -p 6006",
- "lint:biome": "pnpm exec biome lint",
- "lint:eslint": "pnpm exec eslint",
+ "lint": "pnpm exec biome lint",
"test": "vitest",
"typecheck": "tsc",
"prepack": "pnpm run build"
},
+ "dependencies": {
+ "@sipe-team/tokens": "workspace:*",
+ "@sipe-team/typography": "workspace:*",
+ "@vanilla-extract/recipes": "^0.5.5",
+ "clsx": "^2.1.1"
+ },
"devDependencies": {
"@storybook/addon-essentials": "catalog:",
"@storybook/addon-interactions": "catalog:",
@@ -31,8 +37,10 @@
"@testing-library/dom": "^10.4.0",
"@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.0.1",
+ "@testing-library/user-event": "^14.5.2",
"@types/react": "catalog:react",
"@types/react-dom": "catalog:react",
+ "@vanilla-extract/css": "catalog:",
"happy-dom": "catalog:",
"react": "catalog:react",
"react-dom": "catalog:react",
diff --git a/packages/radio/src/Radio.css.ts b/packages/radio/src/Radio.css.ts
new file mode 100644
index 00000000..be5551f5
--- /dev/null
+++ b/packages/radio/src/Radio.css.ts
@@ -0,0 +1,240 @@
+import { style, styleVariants } from '@vanilla-extract/css';
+import { type RecipeVariants, recipe } from '@vanilla-extract/recipes';
+import { COLORS } from './constants/colors';
+import { RadioSize } from './constants/sizes';
+import { RADIO_SIZES } from './constants/sizes';
+
+export const radioGroup = style({
+ display: 'flex',
+ flexDirection: 'column',
+ border: 'none',
+ padding: 0,
+ margin: 0,
+});
+
+export const radioGroupLegend = style({
+ padding: 0,
+ margin: 0,
+ marginBottom: '8px',
+ fontSize: '16px',
+ fontWeight: 600,
+ color: COLORS.text,
+});
+
+const radioContainerSizeStyles: Record = {
+ [RadioSize.small]: {
+ padding: RADIO_SIZES[RadioSize.small].containerPadding,
+ gap: RADIO_SIZES[RadioSize.small].containerGap,
+ },
+ [RadioSize.medium]: {
+ padding: RADIO_SIZES[RadioSize.medium].containerPadding,
+ gap: RADIO_SIZES[RadioSize.medium].containerGap,
+ },
+ [RadioSize.large]: {
+ padding: RADIO_SIZES[RadioSize.large].containerPadding,
+ gap: RADIO_SIZES[RadioSize.large].containerGap,
+ },
+};
+
+export const radioContainer = recipe({
+ base: {
+ display: 'flex',
+ alignItems: 'center',
+ cursor: 'pointer',
+ transition: 'all 0.15s ease-in-out',
+
+ ':hover': {
+ opacity: 0.8,
+ },
+ },
+ variants: {
+ size: styleVariants(radioContainerSizeStyles, (sizeStyle) => sizeStyle),
+ disabled: {
+ true: {
+ cursor: 'not-allowed',
+ opacity: 0.6,
+
+ ':hover': {
+ opacity: 0.6,
+ },
+ },
+ },
+ },
+ defaultVariants: {
+ size: RadioSize.medium,
+ disabled: false,
+ },
+});
+
+const radioInputSizeStyles: Record<
+ RadioSize,
+ { width: string; height: string; '::after': { width: string; height: string } }
+> = {
+ [RadioSize.small]: {
+ width: RADIO_SIZES[RadioSize.small].inputSize,
+ height: RADIO_SIZES[RadioSize.small].inputSize,
+ '::after': {
+ width: '4px',
+ height: '4px',
+ },
+ },
+ [RadioSize.medium]: {
+ width: RADIO_SIZES[RadioSize.medium].inputSize,
+ height: RADIO_SIZES[RadioSize.medium].inputSize,
+ '::after': {
+ width: '6px',
+ height: '6px',
+ },
+ },
+ [RadioSize.large]: {
+ width: RADIO_SIZES[RadioSize.large].inputSize,
+ height: RADIO_SIZES[RadioSize.large].inputSize,
+ '::after': {
+ width: '8px',
+ height: '8px',
+ },
+ },
+};
+
+export const radioInput = recipe({
+ base: {
+ appearance: 'none',
+ borderRadius: '50%',
+ border: `2px solid ${COLORS.border}`,
+ backgroundColor: COLORS.background,
+ margin: 0,
+ cursor: 'pointer',
+ transition: 'all 0.15s ease-in-out',
+ position: 'relative',
+ flexShrink: 0,
+
+ '::after': {
+ content: '""',
+ position: 'absolute',
+ top: '50%',
+ left: '50%',
+ transform: 'translate(-50%, -50%) scale(0)',
+ borderRadius: '50%',
+ backgroundColor: COLORS.background,
+ transition: 'transform 0.15s ease-in-out',
+ },
+
+ ':focus': {
+ outline: `2px solid ${COLORS.checked}`,
+ outlineOffset: '2px',
+ },
+
+ selectors: {
+ '&:hover:not(:disabled)': {
+ borderColor: COLORS.checked,
+ backgroundColor: COLORS.hover,
+ },
+ '&:checked::after': {
+ transform: 'translate(-50%, -50%) scale(1)',
+ },
+ },
+
+ ':checked': {
+ borderColor: COLORS.checked,
+ backgroundColor: COLORS.checked,
+ },
+ },
+ variants: {
+ size: styleVariants(radioInputSizeStyles, (sizeStyle) => sizeStyle),
+ checked: {
+ true: {
+ borderColor: COLORS.checked,
+ backgroundColor: COLORS.checked,
+
+ '::after': {
+ transform: 'translate(-50%, -50%) scale(1)',
+ },
+ },
+ false: {},
+ },
+ disabled: {
+ true: {
+ borderColor: COLORS.disabled,
+ backgroundColor: COLORS.disabled,
+ cursor: 'not-allowed',
+
+ ':hover': {
+ borderColor: COLORS.disabled,
+ backgroundColor: COLORS.disabled,
+ },
+
+ ':checked': {
+ borderColor: COLORS.disabled,
+ backgroundColor: COLORS.disabled,
+
+ '::after': {
+ backgroundColor: COLORS.disabled,
+ },
+ },
+ },
+ false: {},
+ },
+ },
+ compoundVariants: [
+ {
+ variants: {
+ checked: true,
+ disabled: true,
+ },
+ style: {
+ borderColor: COLORS.disabled,
+ backgroundColor: COLORS.disabled,
+
+ '::after': {
+ backgroundColor: COLORS.disabled,
+ transform: 'translate(-50%, -50%) scale(1)',
+ },
+ },
+ },
+ ],
+ defaultVariants: {
+ size: RadioSize.medium,
+ checked: false,
+ disabled: false,
+ },
+});
+
+const radioLabelSizeStyles: Record = {
+ [RadioSize.small]: {
+ fontSize: RADIO_SIZES[RadioSize.small].fontSize,
+ },
+ [RadioSize.medium]: {
+ fontSize: RADIO_SIZES[RadioSize.medium].fontSize,
+ },
+ [RadioSize.large]: {
+ fontSize: RADIO_SIZES[RadioSize.large].fontSize,
+ },
+};
+
+export const radioLabel = recipe({
+ base: {
+ cursor: 'pointer',
+ color: COLORS.text,
+ lineHeight: 1.5,
+ userSelect: 'none',
+ marginLeft: '8px',
+ },
+ variants: {
+ size: styleVariants(radioLabelSizeStyles, (sizeStyle) => sizeStyle),
+ disabled: {
+ true: {
+ color: COLORS.textDisabled,
+ cursor: 'not-allowed',
+ },
+ false: {},
+ },
+ },
+ defaultVariants: {
+ size: RadioSize.medium,
+ disabled: false,
+ },
+});
+
+export type RadioContainerVariants = RecipeVariants;
+export type RadioInputVariants = RecipeVariants;
+export type RadioLabelVariants = RecipeVariants;
diff --git a/packages/radio/src/Radio.tsx b/packages/radio/src/Radio.tsx
index 7640ce36..b9b0ba30 100644
--- a/packages/radio/src/Radio.tsx
+++ b/packages/radio/src/Radio.tsx
@@ -1,41 +1,80 @@
-import { type CSSProperties, type ComponentProps, type PropsWithChildren, useContext } from 'react';
+import clsx from 'clsx';
+import { type ComponentProps, type PropsWithChildren, useContext, useId } from 'react';
+import * as styles from './Radio.css';
import { RadioGroupContext } from './RadioGroup';
-import styles from './RadioGroup.module.css';
+import type { RadioSize } from './constants/sizes';
type RadioProps = PropsWithChildren<
- ComponentProps<'input'> & {
- size?: 'small' | 'medium' | 'large';
+ Omit, 'size'> & {
+ size?: RadioSize;
+ className?: string;
}
>;
-export function Radio({ value, defaultChecked, disabled = false, children }: RadioProps) {
+export function Radio({
+ value,
+ defaultChecked,
+ disabled = false,
+ children,
+ className,
+ size: propSize,
+ ...inputProps
+}: RadioProps) {
const groupContext = useContext(RadioGroupContext);
+ const radioId = useId();
- const sizeMap = {
- small: '12px',
- medium: '16px',
- large: '20px',
- };
+ const isDisabled = groupContext.disabled || disabled;
+ const radioSize = propSize || groupContext.size || 'medium';
+
+ const isControlled = groupContext.value !== undefined;
+ const isChecked = isControlled ? groupContext.value === value : undefined;
- const style = {
- width: sizeMap[groupContext.size ?? 'medium'],
- height: sizeMap[groupContext.size ?? 'medium'],
- } as CSSProperties;
+ const handleChange = (e: React.ChangeEvent) => {
+ if (!isDisabled) {
+ groupContext.onChangeValue?.(e.target.value);
+ }
+ inputProps.onChange?.(e);
+ };
return (
-
+
groupContext.onChangeValue?.(e.target.value)}
- style={style}
+ {...(isControlled
+ ? { checked: isChecked }
+ : { defaultChecked: groupContext.defaultValue === value || defaultChecked })}
+ disabled={isDisabled}
+ onChange={handleChange}
/>
- {children}
+
+ {children && (
+
+ {children}
+
+ )}
);
}
diff --git a/packages/radio/src/RadioGroup.module.css b/packages/radio/src/RadioGroup.module.css
deleted file mode 100644
index d651ebed..00000000
--- a/packages/radio/src/RadioGroup.module.css
+++ /dev/null
@@ -1,28 +0,0 @@
-.radioGroup {
- display: flex;
- flex-direction: column;
- border: none;
- padding: 0;
- margin: 0;
-}
-
-.radioGroup legend {
- padding: 0;
- margin: 0;
-}
-
-.radioContainer {
- display: flex;
- align-items: center;
- padding: 6px 0;
-}
-
-.radioIndicator {
- vertical-align: middle;
- margin: 0;
-}
-
-.radioLabelText {
- vertical-align: middle;
- margin-left: 4px;
-}
diff --git a/packages/radio/src/RadioGroup.stories.tsx b/packages/radio/src/RadioGroup.stories.tsx
index f68aaa90..839a9135 100644
--- a/packages/radio/src/RadioGroup.stories.tsx
+++ b/packages/radio/src/RadioGroup.stories.tsx
@@ -2,6 +2,7 @@ import type { Meta, StoryObj } from '@storybook/react';
import { useState } from 'react';
import { Radio } from './Radio';
import { RadioGroup } from './RadioGroup';
+import { RadioSize } from './constants/sizes';
const meta = {
title: 'Components/RadioGroup',
@@ -9,56 +10,81 @@ const meta = {
parameters: {
layout: 'centered',
},
+ argTypes: {
+ size: {
+ control: 'select',
+ options: Object.values(RadioSize),
+ description: 'Size of the radio buttons',
+ defaultValue: 'medium',
+ },
+ disabled: {
+ control: 'boolean',
+ description: 'Whether the entire radio group is disabled',
+ defaultValue: false,
+ },
+ labelText: {
+ control: 'text',
+ description: 'Label text for the radio group',
+ },
+ },
} satisfies Meta;
export default meta;
type Story = StoryObj;
export const Default: Story = {
- render: () => (
-
- ์ฌ๊ณผ
- ์ค๋ ์ง
- ํฌ๋
-
- ),
+ args: {
+ labelText: '๊ณผ์ผ์ ์ ํํ์ธ์',
+ defaultValue: 'orange',
+ size: 'medium',
+ children: (
+ <>
+ ์ฌ๊ณผ
+ ์ค๋ ์ง
+ ํฌ๋
+ >
+ ),
+ },
};
-export const Size: Story = {
+export const Sizes: Story = {
render: () => (
-
-
- ์ต์
1
- ์ต์
2
-
-
-
- ์ต์
1
- ์ต์
2
-
-
-
- ์ต์
1
- ์ต์
2
-
+
+ {Object.values(RadioSize).map((size) => (
+
+ ์ต์
1
+ ์ต์
2
+ ์ต์
3
+
+ ))}
),
};
-// ๋นํ์ฑํ ์ํ
-export const Disabled: Story = {
+export const States: Story = {
render: () => (
-
-
- ์ต์
1
- ์ต์
2
+
+
+ ์ ํ๋ ์ต์
+ ์ ํ๋์ง ์์ ์ต์
-
- ํ์ฑํ ์ต์
-
- ๋นํ์ฑํ ์ต์
+
+ ๋นํ์ฑํ๋ ์ ํ ์ต์
+ ๋นํ์ฑํ๋ ๋ฏธ์ ํ ์ต์
+
+
+
+ ํ์ฑํ๋ ์ ํ ์ต์
+
+ ๋นํ์ฑํ๋ ์ต์
+ ํ์ฑํ๋ ๋ฏธ์ ํ ์ต์
),
@@ -69,14 +95,80 @@ export const Controlled: Story = {
const [selectedValue, setSelectedValue] = useState('option1');
return (
-
+
์ต์
1
์ต์
2
์ต์
3
-
์ ํ๋ ๊ฐ: {selectedValue}
+
+
+ ์ ํ๋ ๊ฐ: {selectedValue}
+
+
+
+ setSelectedValue('option1')}
+ style={{ padding: '0.5rem 1rem', borderRadius: '4px', border: '1px solid #ccc' }}
+ >
+ ์ต์
1 ์ ํ
+
+ setSelectedValue('option2')}
+ style={{ padding: '0.5rem 1rem', borderRadius: '4px', border: '1px solid #ccc' }}
+ >
+ ์ต์
2 ์ ํ
+
+ setSelectedValue('option3')}
+ style={{ padding: '0.5rem 1rem', borderRadius: '4px', border: '1px solid #ccc' }}
+ >
+ ์ต์
3 ์ ํ
+
+
);
},
};
+
+export const WithoutLabel: Story = {
+ args: {
+ size: 'medium',
+ defaultValue: 'option2',
+ children: (
+ <>
+
๋ผ๋ฒจ ์๋ ๋ผ๋์ค ๊ทธ๋ฃน
+
์ต์
2
+
์ต์
3
+ >
+ ),
+ },
+};
+
+export const LongContent: Story = {
+ args: {
+ labelText: '๊ธด ํ
์คํธ๋ฅผ ๊ฐ์ง ๋ผ๋์ค ์ต์
๋ค',
+ size: 'medium',
+ children: (
+ <>
+
+ ์ด๊ฒ์ ๋งค์ฐ ๊ธด ํ
์คํธ๋ฅผ ๊ฐ์ง ๋ผ๋์ค ์ต์
์
๋๋ค. ํ
์คํธ๊ฐ ์ฌ๋ฌ ์ค์ ๊ฑธ์ณ์ ํ์๋ ์ ์์ต๋๋ค.
+
+
+ ๋ ๋ค๋ฅธ ๊ธด ํ
์คํธ ์ต์
์ผ๋ก, ๋ผ๋์ค ๋ฒํผ๊ณผ ํ
์คํธ ์ฌ์ด์ ์ ๋ ฌ์ด ์ฌ๋ฐ๋ฅด๊ฒ ๋๋์ง ํ์ธํ ์ ์์ต๋๋ค.
+
+
์งง์ ์ต์
+ >
+ ),
+ },
+};
diff --git a/packages/radio/src/RadioGroup.test.tsx b/packages/radio/src/RadioGroup.test.tsx
index e73e7a1c..8ff4b467 100644
--- a/packages/radio/src/RadioGroup.test.tsx
+++ b/packages/radio/src/RadioGroup.test.tsx
@@ -1,45 +1,54 @@
-import { render } from '@testing-library/react';
+import { render, screen } from '@testing-library/react';
+import userEvent from '@testing-library/user-event';
import { describe, expect, test, vi } from 'vitest';
+
+import { RADIO_SIZES, RadioSize } from './constants/sizes';
import { Radio } from './Radio';
import { RadioGroup } from './RadioGroup';
describe('Radio Group Component', () => {
test('Radio ์ต์
์ด ์ ํํ ๋ ๋๋ง ๋๋ค.', () => {
- const { getByText } = render(
+ render(
- ์ฌ๊ณผ
- ์ค๋ ์ง
- ํฌ๋
+ ์ฌ๊ณผ
+ ์ค๋ ์ง
+ ํฌ๋
,
);
- expect(getByText('์ฌ๊ณผ')).toBeInTheDocument();
+ expect(screen.getByText('์ฌ๊ณผ')).toBeInTheDocument();
+ expect(screen.getByText('์ค๋ ์ง')).toBeInTheDocument();
+ expect(screen.getByText('ํฌ๋')).toBeInTheDocument();
});
- test('๋น์ ์ด ๋ฐฉ์์์ Radio ์ต์
์ ํด๋ฆญํ๋ฉด ํด๋น ์ต์
์ด ์ ํ ๋์ด์ผ ํ๋ค.', () => {
- const { getByRole } = render(
+ test('๋น์ ์ด ๋ฐฉ์์์ Radio ์ต์
์ ํด๋ฆญํ๋ฉด ํด๋น ์ต์
์ด ์ ํ ๋์ด์ผ ํ๋ค.', async () => {
+ const user = userEvent.setup();
+
+ render(
,
);
- const orangeRadio = getByRole('radio', { name: '์ค๋ ์ง' });
- orangeRadio.click();
+ const orangeRadio = screen.getByRole('radio', { name: '์ค๋ ์ง' });
+ await user.click(orangeRadio);
const form = orangeRadio.closest('form');
- expect(form).toBeInTheDocument(); // form ์กด์ฌ ์ฌ๋ถ ์ฒดํฌ
+ expect(form).toBeInTheDocument();
const formData = new FormData(form as HTMLFormElement);
expect(formData.get('fruits')).toBe('orange');
});
- test('์ ์ด ๋ฐฉ์์์ Radio ์ต์
์ ํด๋ฆญํ๋ฉด ํด๋น ์ต์
์ด ์ ํ ๋์ด์ผ ํ๋ค.', () => {
+ test('์ ์ด ๋ฐฉ์์์ Radio ์ต์
์ ํด๋ฆญํ๋ฉด ํด๋น ์ต์
์ด ์ ํ ๋์ด์ผ ํ๋ค.', async () => {
+ const user = userEvent.setup();
const handleChange = vi.fn();
- const { getByRole } = render(
+
+ render(
์ฌ๊ณผ
์ค๋ ์ง
@@ -47,56 +56,52 @@ describe('Radio Group Component', () => {
,
);
- const orangeRadio = getByRole('radio', { name: '์ค๋ ์ง' });
- orangeRadio.click();
+ const orangeRadio = screen.getByRole('radio', { name: '์ค๋ ์ง' });
+ await user.click(orangeRadio);
expect(handleChange).toHaveBeenCalledWith('orange');
});
- test.each(['small', 'medium', 'large'] as const)('%s ํฌ๊ธฐ๋ก RadioGroup ์ปดํฌ๋ํธ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ํ๋ค.', (size) => {
- const { getByRole } = render(
+ test.each(Object.values(RadioSize))('%s ํฌ๊ธฐ๋ก RadioGroup ์ปดํฌ๋ํธ ํฌ๊ธฐ๋ฅผ ๊ฒฐ์ ํ๋ค.', (size) => {
+ render(
- ์ฌ๊ณผ
- ์ค๋ ์ง
- ํฌ๋
+ ์ฌ๊ณผ
,
);
- const sizeMap = {
- small: '12px',
- medium: '16px',
- large: '20px',
- };
+ const radio = screen.getByRole('radio', { name: '์ฌ๊ณผ' });
- const radio = getByRole('radio', { name: '์ฌ๊ณผ' });
+ const expectedSize = RADIO_SIZES[size].inputSize;
expect(radio).toHaveStyle({
- width: sizeMap[size],
- height: sizeMap[size],
+ width: expectedSize,
+ height: expectedSize,
});
});
- test('RadioGroup์ด ๋นํ์ฑํ(disabled) ์ํ์ผ ๊ฒฝ์ฐ ์ ํํ ์ ์์ด์ผ ํ๋ค.', () => {
+ test('RadioGroup์ด ๋นํ์ฑํ(disabled) ์ํ์ผ ๊ฒฝ์ฐ ์ ํํ ์ ์์ด์ผ ํ๋ค.', async () => {
+ const user = userEvent.setup();
const handleChange = vi.fn();
- const { getByRole } = render(
+ render(
์ฌ๊ณผ
์ค๋ ์ง
,
);
- const orangeRadio = getByRole('radio', { name: '์ค๋ ์ง' });
- orangeRadio.click();
+ const orangeRadio = screen.getByRole('radio', { name: '์ค๋ ์ง' });
+ await user.click(orangeRadio);
expect(handleChange).not.toHaveBeenCalled();
expect(orangeRadio).toBeDisabled();
});
- test('Radio๊ฐ ๋นํ์ฑํ(disabled) ์ํ์ผ ๊ฒฝ์ฐ ์ ํํ ์ ์์ด์ผ ํ๋ค.', () => {
+ test('Radio๊ฐ ๋นํ์ฑํ(disabled) ์ํ์ผ ๊ฒฝ์ฐ ์ ํํ ์ ์์ด์ผ ํ๋ค.', async () => {
+ const user = userEvent.setup();
const handleChange = vi.fn();
- const { getByRole } = render(
-
+ render(
+
์ฌ๊ณผ
์ค๋ ์ง
@@ -105,15 +110,15 @@ describe('Radio Group Component', () => {
,
);
- const orangeRadio = getByRole('radio', { name: '์ค๋ ์ง' });
- orangeRadio.click();
+ const orangeRadio = screen.getByRole('radio', { name: '์ค๋ ์ง' });
+ await user.click(orangeRadio);
expect(handleChange).not.toHaveBeenCalled();
expect(orangeRadio).toBeDisabled();
});
test('์ด๊ธฐ ์ค์ ๋ ๊ธฐ๋ณธ๊ฐ์ด ์๋ค๋ฉด ํด๋น Radio๊ฐ ๋จผ์ ์ ํ๋์ด์ผ ํ๋ค.', () => {
- const { getByRole } = render(
+ render(
์ฌ๊ณผ
์ค๋ ์ง
@@ -121,24 +126,103 @@ describe('Radio Group Component', () => {
,
);
- const orangeRadio = getByRole('radio', { name: '์ค๋ ์ง' });
+ const orangeRadio = screen.getByRole('radio', { name: '์ค๋ ์ง' });
expect(orangeRadio).toBeChecked();
});
- test('Radio๊ฐ ํด๋ฆญ๋ ๋ ์ง์ ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ํธ์ถ๋๋ค', () => {
+ test('Radio๊ฐ ํด๋ฆญ๋ ๋ ์ง์ ๋ ์ด๋ฒคํธ ํธ๋ค๋ฌ๊ฐ ํธ์ถ๋๋ค', async () => {
+ const user = userEvent.setup();
const handleChange = vi.fn();
- const { getByRole } = render(
+ render(
์ฌ๊ณผ
์ค๋ ์ง
,
);
- const orangeRadio = getByRole('radio', { name: '์ค๋ ์ง' });
- orangeRadio.click();
+ const orangeRadio = screen.getByRole('radio', { name: '์ค๋ ์ง' });
+ await user.click(orangeRadio);
expect(handleChange).toHaveBeenCalledTimes(1);
expect(handleChange).toHaveBeenCalledWith('orange');
});
+
+ test('๋ ์ด๋ธ์ด ์ ๊ณต๋๋ฉด fieldset์ legend๋ก ํ์๋๋ค.', () => {
+ const labelText = '์ข์ํ๋ ๊ณผ์ผ์ ์ ํํ์ธ์';
+
+ render(
+
+ ์ฌ๊ณผ
+ ์ค๋ ์ง
+ ,
+ );
+
+ expect(screen.getByText(labelText)).toBeInTheDocument();
+ expect(screen.getByRole('group')).toBeInTheDocument();
+ });
+
+ test('className prop์ด ์ ๋๋ก ์ ์ฉ๋๋ค.', () => {
+ const customClassName = 'custom-radio-group';
+
+ render(
+
+ ์ฌ๊ณผ
+ ,
+ );
+
+ const radioGroup = screen.getByRole('group');
+ expect(radioGroup).toHaveClass(customClassName);
+ });
+
+ test('Radio ์ปดํฌ๋ํธ์ className์ด ์ ๋๋ก ์ ์ฉ๋๋ค.', () => {
+ const customClassName = 'custom-radio';
+
+ render(
+
+
+ ์ฌ๊ณผ
+
+ ,
+ );
+
+ const radioLabel = screen.getByText('์ฌ๊ณผ').closest('label');
+ expect(radioLabel).toHaveClass(customClassName);
+ });
+
+ test('๋ผ๋ฒจ์ ํด๋ฆญํด๋ ๋ผ๋์ค๊ฐ ์ ํ๋๋ค.', async () => {
+ const user = userEvent.setup();
+ const handleChange = vi.fn();
+
+ render(
+
+ ์ฌ๊ณผ
+ ,
+ );
+
+ const label = screen.getByText('์ฌ๊ณผ');
+ await user.click(label);
+
+ expect(handleChange).toHaveBeenCalledWith('apple');
+ });
+
+ test('ํค๋ณด๋ ๋ค๋น๊ฒ์ด์
์ด ์๋ํ๋ค.', async () => {
+ const user = userEvent.setup();
+
+ render(
+
+ ์ฌ๊ณผ
+ ์ค๋ ์ง
+ ํฌ๋
+ ,
+ );
+
+ const firstRadio = screen.getByRole('radio', { name: '์ฌ๊ณผ' });
+
+ await user.click(firstRadio);
+ expect(firstRadio).toHaveFocus();
+
+ await user.keyboard(' ');
+ expect(firstRadio).toBeChecked();
+ });
});
diff --git a/packages/radio/src/RadioGroup.tsx b/packages/radio/src/RadioGroup.tsx
index b278d646..05468b18 100644
--- a/packages/radio/src/RadioGroup.tsx
+++ b/packages/radio/src/RadioGroup.tsx
@@ -1,33 +1,23 @@
-import { type PropsWithChildren, createContext, useId } from 'react';
-import styles from './RadioGroup.module.css';
+import { createContext, type PropsWithChildren, useId } from 'react';
-/**
- * ================================================================
- * RadioGroup Provider
- * ================================================================
- */
-type RadioGroupContext = Omit;
+import clsx from 'clsx';
-export const RadioGroupContext = createContext({});
+import type { RadioSize } from './constants/sizes';
+import { radioGroup } from './Radio.css';
-/**
- * ================================================================
- * RadioGroup
- * ================================================================
- */
+type RadioGroupContext = Omit;
-type RadioSize = 'small' | 'medium' | 'large';
+export const RadioGroupContext = createContext({});
type RadioGroupProps = PropsWithChildren<{
defaultValue?: string;
value?: string;
onChangeValue?: (value: string) => void;
-
labelText?: string;
name?: string;
-
size?: RadioSize;
disabled?: boolean;
+ className?: string;
}>;
export function RadioGroup({
@@ -36,15 +26,15 @@ export function RadioGroup({
disabled = false,
children,
name: propName,
+ className,
...rest
}: RadioGroupProps) {
const fallbackId = useId();
const name = propName ?? fallbackId;
return (
-
- {labelText}
-
+
+ {labelText && {labelText} }
{children}
);
diff --git a/packages/radio/src/constants/colors.ts b/packages/radio/src/constants/colors.ts
new file mode 100644
index 00000000..2cffc614
--- /dev/null
+++ b/packages/radio/src/constants/colors.ts
@@ -0,0 +1,11 @@
+import { color } from '@sipe-team/tokens';
+
+export const COLORS = {
+ border: color.gray300,
+ background: color.white,
+ checked: color.blue500,
+ disabled: color.gray200,
+ hover: color.blue100,
+ text: color.gray900,
+ textDisabled: color.gray500,
+} as const;
diff --git a/packages/radio/src/constants/sizes.ts b/packages/radio/src/constants/sizes.ts
new file mode 100644
index 00000000..5059ab1d
--- /dev/null
+++ b/packages/radio/src/constants/sizes.ts
@@ -0,0 +1,28 @@
+export const RadioSize = {
+ small: 'small',
+ medium: 'medium',
+ large: 'large',
+} as const;
+
+export type RadioSize = (typeof RadioSize)[keyof typeof RadioSize];
+
+export const RADIO_SIZES = {
+ [RadioSize.small]: {
+ inputSize: '12px',
+ fontSize: '14px',
+ containerGap: '6px',
+ containerPadding: '6px 0',
+ },
+ [RadioSize.medium]: {
+ inputSize: '16px',
+ fontSize: '16px',
+ containerGap: '8px',
+ containerPadding: '8px 0',
+ },
+ [RadioSize.large]: {
+ inputSize: '20px',
+ fontSize: '18px',
+ containerGap: '10px',
+ containerPadding: '10px 0',
+ },
+} as const;
diff --git a/packages/reset/README.md b/packages/reset/README.md
index 3ef605e4..f8220134 100644
--- a/packages/reset/README.md
+++ b/packages/reset/README.md
@@ -147,6 +147,11 @@ Using npm:
npm install @sipe-team/reset
```
+Using yarn:
+```bash
+yarn add @sipe-team/reset
+```
+
Using pnpm:
```bash
pnpm add @sipe-team/reset
@@ -154,43 +159,42 @@ pnpm add @sipe-team/reset
## Usage
-### Global Reset
-Import the CSS file in your application:
+### Using the CSS Directly
+Import the CSS file directly in your application:
+
```javascript
-import '@sipe-team/reset/style.css';
+import '@sipe-team/reset/reset.css';
```
-### Component Reset
-For component-level reset:
+### Using the Reset Component
+Add the Reset component to your application root:
+
```tsx
import { Reset } from '@sipe-team/reset';
-// Basic usage
function App() {
return (
-
- Your content here
-
+
+
+ {children}
+
);
}
+```
-// With custom class name
-function CustomApp() {
- return (
-
- Your content here
-
- );
-}
+The `Reset` component applies global CSS styles to the entire application and renders nothing to the DOM. It should be placed once at the top level of your application.
-// As a different element
-function MainApp() {
- return (
-
- Your content here
-
- );
-}
+### Recommended Approach
+While both methods work, directly importing the CSS file is recommended for these reasons:
+
+1. **More explicit** - Directly importing CSS clearly communicates the intention
+2. **Performance** - Avoids an unnecessary React component rendering cycle
+3. **Simplicity** - Follows the conventional pattern used by most CSS reset libraries
+4. **Bundle optimization** - May be more efficiently processed by bundlers
+
+```javascript
+// Recommended
+import '@sipe-team/reset/reset.css';
```
---
@@ -266,7 +270,7 @@ textarea {
```
### 4. ํ
์ด๋ธ ๋ฆฌ์
-ํ
์ด๋ธ ๊ตฌ์กฐ๋ฅผ ๋ค์๊ณผ ๊ฐ์ด ์ ๊ทํํฉ๋๋ค:
+ํ
์ด๋ธ ๊ตฌ์กฐ๋ฅผ ์ ๊ทํํฉ๋๋ค:
```css
table {
border-collapse: collapse;
@@ -279,8 +283,8 @@ th {
}
```
-### 5. ๋ฃจํธ & ๋ฌธ์ ๋ ๋ฒจ ๋ฆฌ์
-์ฌ๋ฐ๋ฅธ ๋ทฐํฌํธ ๋์ด ์ฒ๋ฆฌ์ ์์ ๋งฅ๋ฝ์ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ฅํฉ๋๋ค:
+### 5. ๋ฃจํธ ๋ฐ ๋ฌธ์ ๋ ๋ฒจ ๋ฆฌ์
+์ ์ ํ ๋ทฐํฌํธ ๋์ด ์ฒ๋ฆฌ์ ์์ ๋งฅ๋ฝ์ ๋ณด์ฅํฉ๋๋ค:
```css
body {
min-height: 100vh;
@@ -295,7 +299,7 @@ body {
```
### 6. ์๋งจํฑ ์์ ๋ฆฌ์
-์๋งจํฑ HTML ์์์ display ์์ฑ์ ๋ค์๊ณผ ๊ฐ์ด ์ ๊ทํํฉ๋๋ค:
+์๋งจํฑ HTML ์์์ display ์์ฑ์ ์ ๊ทํํฉ๋๋ค:
```css
article, aside, details, figcaption, figure,
footer, header, hgroup, menu, nav, section, main {
@@ -304,7 +308,7 @@ footer, header, hgroup, menu, nav, section, main {
```
### 7. ๋ฏธ๋์ด ์์ ๋ฆฌ์
-๋ฏธ๋์ด ์์์ ๋ฐ์ํ ๋์์ ๋ค์๊ณผ ๊ฐ์ด ๋ณด์ฅํฉ๋๋ค:
+๋ฏธ๋์ด ์์์ ๋ฐ์ํ ๋์์ ๋ณด์ฅํฉ๋๋ค:
```css
img, picture, video, canvas, svg {
display: block;
@@ -312,8 +316,8 @@ img, picture, video, canvas, svg {
}
```
-### 8. ๋ชฉ๋ก & ๋งํฌ ๋ฆฌ์
-๋ชฉ๋ก๊ณผ ๋งํฌ์ ๊ธฐ๋ณธ ์คํ์ผ์ ๋ค์๊ณผ ๊ฐ์ด ์ ๊ฑฐํฉ๋๋ค:
+### 8. ๋ชฉ๋ก ๋ฐ ๋งํฌ ๋ฆฌ์
+๋ชฉ๋ก๊ณผ ๋งํฌ์ ๊ธฐ๋ณธ ์คํ์ผ์ ์ ๊ฑฐํฉ๋๋ค:
```css
ol, ul {
list-style: none;
@@ -326,7 +330,7 @@ a {
```
### 9. ์ฌ์ฉ์ ๊ฒฝํ ๋ฆฌ์
-๋ชจ์
์ ํธ๋๋ฅผ ๊ณ ๋ คํ ๋ถ๋๋ฌ์ด ์คํฌ๋กค์ ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํฉ๋๋ค:
+๋ชจ์
์ ํธ๋๋ฅผ ๊ณ ๋ คํ ๋ถ๋๋ฌ์ด ์คํฌ๋กค๋ง์ ๊ตฌํํฉ๋๋ค:
```css
@media (prefers-reduced-motion: no-preference) {
html {
@@ -335,13 +339,18 @@ a {
}
```
-## ์ค์น ๋ฐฉ๋ฒ
+## ์ค์น
npm ์ฌ์ฉ:
```bash
npm install @sipe-team/reset
```
+yarn ์ฌ์ฉ:
+```bash
+yarn add @sipe-team/reset
+```
+
pnpm ์ฌ์ฉ:
```bash
pnpm add @sipe-team/reset
@@ -349,41 +358,40 @@ pnpm add @sipe-team/reset
## ์ฌ์ฉ ๋ฐฉ๋ฒ
-### ์ ์ญ ๋ฆฌ์
-์ ํ๋ฆฌ์ผ์ด์
์ CSS ํ์ผ์ ์ํฌํธํด ์ฃผ์ธ์:
+### CSS ์ง์ ์ฌ์ฉํ๊ธฐ
+์ ํ๋ฆฌ์ผ์ด์
์ CSS ํ์ผ์ ์ง์ ๊ฐ์ ธ์ต๋๋ค:
+
```javascript
-import '@sipe-team/reset/style.css';
+import '@sipe-team/reset/reset.css';
```
-### ์ปดํฌ๋ํธ ๋ฆฌ์
-์ปดํฌ๋ํธ ๋ ๋ฒจ์ ๋ฆฌ์
์ด ํ์ํ ๊ฒฝ์ฐ:
+### Reset ์ปดํฌ๋ํธ ์ฌ์ฉํ๊ธฐ
+์ ํ๋ฆฌ์ผ์ด์
๋ฃจํธ์ Reset ์ปดํฌ๋ํธ๋ฅผ ์ถ๊ฐํฉ๋๋ค:
+
```tsx
import { Reset } from '@sipe-team/reset';
-// ๊ธฐ๋ณธ ์ฌ์ฉ๋ฒ
function App() {
return (
-
- ์ปจํ
์ธ
-
+
+
+ {children}
+
);
}
+```
-// ์ปค์คํ
ํด๋์ค๋ช
์ฌ์ฉ
-function CustomApp() {
- return (
-
- ์ปจํ
์ธ
-
- );
-}
+`Reset` ์ปดํฌ๋ํธ๋ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์
์ ์ ์ญ CSS ์คํ์ผ์ ์ ์ฉํ๊ณ DOM์๋ ์๋ฌด๊ฒ๋ ๋ ๋๋งํ์ง ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์ ์ต์์ ๋ ๋ฒจ์ ํ ๋ฒ๋ง ๋ฐฐ์นํด์ผ ํฉ๋๋ค.
-// ๋ค๋ฅธ ์์๋ก ๋ ๋๋ง
-function MainApp() {
- return (
-
- ์ปจํ
์ธ
-
- );
-}
+### ๊ถ์ฅ ์ ๊ทผ๋ฒ
+๋ ๊ฐ์ง ๋ฐฉ๋ฒ ๋ชจ๋ ์๋ํ์ง๋ง, CSS ํ์ผ์ ์ง์ ๊ฐ์ ธ์ค๋ ๋ฐฉ์์ด ๋ค์๊ณผ ๊ฐ์ ์ด์ ๋ก ๊ถ์ฅ๋ฉ๋๋ค:
+
+1. **๋ ๋ช
์์ ** - CSS๋ฅผ ์ง์ ๊ฐ์ ธ์ค๋ ๊ฒ์ด ์๋๋ฅผ ๋ช
ํํ๊ฒ ์ ๋ฌํฉ๋๋ค
+2. **์ฑ๋ฅ** - ๋ถํ์ํ React ์ปดํฌ๋ํธ ๋ ๋๋ง ์ฌ์ดํด์ ํผํ ์ ์์ต๋๋ค
+3. **๋จ์์ฑ** - ๋๋ถ๋ถ์ CSS ๋ฆฌ์
๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ฌ์ฉํ๋ ์ผ๋ฐ์ ์ธ ํจํด์ ๋ฐ๋ฆ
๋๋ค
+4. **๋ฒ๋ค ์ต์ ํ** - ๋ฒ๋ค๋ฌ์ ์ํด ๋ ํจ์จ์ ์ผ๋ก ์ฒ๋ฆฌ๋ ์ ์์ต๋๋ค
+
+```javascript
+// ๊ถ์ฅ ๋ฐฉ๋ฒ
+import '@sipe-team/reset/reset.css';
```
\ No newline at end of file
diff --git a/packages/reset/global.d.ts b/packages/reset/global.d.ts
deleted file mode 100644
index 60260a3a..00000000
--- a/packages/reset/global.d.ts
+++ /dev/null
@@ -1 +0,0 @@
-declare module '*.module.css';
diff --git a/packages/reset/package.json b/packages/reset/package.json
index 51bd1979..83618d52 100644
--- a/packages/reset/package.json
+++ b/packages/reset/package.json
@@ -8,36 +8,26 @@
"url": "https://github.com/sipe-team/side"
},
"type": "module",
- "exports": "./src/index.ts",
- "files": ["dist"],
+ "exports": {
+ ".": "./src/index.ts",
+ "./reset.css": "./src/reset.css"
+ },
+ "files": [
+ "dist"
+ ],
"scripts": {
"build": "tsup",
- "build:storybook": "storybook build",
- "dev:storybook": "storybook dev -p 6006",
- "lint:biome": "pnpm exec biome lint",
- "lint:eslint": "pnpm exec eslint",
+ "lint": "pnpm exec biome lint",
"test": "vitest",
"typecheck": "tsc",
- "prepack": "pnpm run build"
- },
- "dependencies": {
- "@radix-ui/react-slot": "^1.1.0",
- "classnames": "^2.5.1"
+ "clean": "rm -rf node_modules dist"
},
+ "dependencies": {},
"devDependencies": {
- "@storybook/addon-essentials": "catalog:",
- "@storybook/addon-interactions": "catalog:",
- "@storybook/addon-links": "catalog:",
- "@storybook/blocks": "catalog:",
- "@storybook/react": "catalog:",
- "@storybook/react-vite": "catalog:",
- "@storybook/test": "catalog:",
"@testing-library/jest-dom": "catalog:",
"@testing-library/react": "catalog:",
"@types/react": "catalog:react",
- "happy-dom": "catalog:",
"react": "catalog:react",
- "storybook": "catalog:",
"tsup": "catalog:",
"typescript": "catalog:",
"vitest": "catalog:"
@@ -59,7 +49,8 @@
"types": "./dist/index.d.cts",
"default": "./dist/index.cjs"
}
- }
+ },
+ "./reset.css": "./dist/reset.css"
}
},
"sideEffects": false
diff --git a/packages/reset/src/Reset.module.css b/packages/reset/src/Reset.module.css
deleted file mode 100644
index 2e88be4a..00000000
--- a/packages/reset/src/Reset.module.css
+++ /dev/null
@@ -1,86 +0,0 @@
-/*************************
- * Box Model Reset
- *************************/
-.reset *,
-.reset *::before,
-.reset *::after,
-.reset *::backdrop {
- box-sizing: border-box;
- margin: 0;
- padding: 0;
- border-width: 0;
- border-style: solid;
-}
-
-/*************************
- * Typography Reset
- *************************/
-.reset :where(p, h1, h2, h3, h4, h5, h6) {
- overflow-wrap: break-word;
-}
-
-/*************************
- * Form Elements Reset
- *************************/
-.reset :where(button, input, select, textarea) {
- -webkit-appearance: none;
- appearance: none;
- background: none;
- border: 0;
- color: inherit;
- font: inherit;
-}
-
-.reset :where(button, [type="button"], [type="reset"], [type="submit"]) {
- -webkit-appearance: button;
- cursor: pointer;
- user-select: none;
-}
-
-.reset :where(textarea) {
- resize: vertical;
-}
-
-.reset ::placeholder {
- opacity: 1;
-}
-
-/*************************
- * Table Reset
- *************************/
-.reset :where(table) {
- border-collapse: collapse;
- border-spacing: 0;
- text-indent: 0;
-}
-
-.reset :where(th) {
- text-align: inherit;
-}
-
-/*************************
- * Semantic Elements Reset
- *************************/
-.reset :where(article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section, main) {
- display: block;
-}
-
-/*************************
- * Media Elements Reset
- *************************/
-.reset :where(img, picture, video, canvas, svg) {
- display: block;
- max-width: 100%;
-}
-
-/*************************
- * Lists & Links Reset
- *************************/
-.reset :where(ol, ul) {
- list-style: none;
-}
-
-.reset :where(a) {
- color: inherit;
- text-decoration: none;
-}
diff --git a/packages/reset/src/Reset.stories.tsx b/packages/reset/src/Reset.stories.tsx
deleted file mode 100644
index 064fe934..00000000
--- a/packages/reset/src/Reset.stories.tsx
+++ /dev/null
@@ -1,176 +0,0 @@
-import type { Meta, StoryObj } from '@storybook/react';
-import { Reset } from './Reset';
-
-const meta = {
- title: 'Components/Reset',
- component: Reset,
- parameters: {
- layout: 'centered',
- backgrounds: {
- default: 'light',
- },
- },
-} satisfies Meta;
-
-export default meta;
-type Story = StoryObj;
-
-const ComparisonWrapper = ({ children }: { children: React.ReactNode }) => (
-
-
-
Browser Default
- {children}
-
-
-
With Reset
- {children}
-
-
-);
-
-// Typography
-export const Typography: Story = {
- render: () => (
-
- Heading 1
- Heading 2
- Heading 3
-
- Regular paragraph with some bold and italic text.
-
-
-
ThisIsAVeryVeryVeryVeryVeryVeryVeryVeryLongStringWithoutSpaces
-
-
- ),
-};
-
-// Form Elements
-export const FormElements: Story = {
- render: () => (
-
-
-
-
-
-
-
-
-
-
- Select option 1
- Select option 2
-
-
-
-
- Regular Button
-
- Submit Button
-
-
-
- ),
-};
-
-export const Lists: Story = {
- render: () => (
-
-
-
-
Unordered List:
-
- Unordered list item 1
- Unordered list item 2
- Unordered list item 3
-
-
-
-
Ordered List:
-
- Ordered list item 1
- Ordered list item 2
- Ordered list item 3
-
-
-
-
- ),
-};
-
-export const MediaElements: Story = {
- render: () => (
-
-
-
-
-
-
-
-
- ),
-};
-
-export const Table: Story = {
- render: () => (
-
-
-
-
- Header 1
- Header 2
- Header 3
-
-
-
-
- Cell 1
- Cell 2
- Cell 3
-
-
- Cell 4
- Cell 5
- Cell 6
-
-
-
-
- ),
-};
-
-export const Links: Story = {
- render: () => (
-
-
-
- ),
-};
-
-export const SemanticElements: Story = {
- render: () => (
-
-
-
- Navigation
- Main Content
-
-
-
- ),
-};
diff --git a/packages/reset/src/Reset.test.tsx b/packages/reset/src/Reset.test.tsx
index cdd5cc4a..075602f4 100644
--- a/packages/reset/src/Reset.test.tsx
+++ b/packages/reset/src/Reset.test.tsx
@@ -6,9 +6,10 @@ import { Reset } from './Reset';
describe('Reset', () => {
it('renders children correctly', () => {
render(
-
+ <>
+
Test Content
- ,
+ >,
);
expect(screen.getByText('Test Content')).toBeInTheDocument();
@@ -16,7 +17,12 @@ describe('Reset', () => {
it('applies className along with default reset class', () => {
const customClassName = 'custom-class';
- render(Content );
+ render(
+ <>
+
+ Content
+ >,
+ );
const element = screen.getByText('Content');
expect(element).toHaveClass(customClassName);
@@ -50,7 +56,12 @@ describe('Reset', () => {
};
it.each(formElements)('applies reset styles to %s element', (_, element) => {
- render({element} );
+ render(
+ <>
+
+ {element}
+ >,
+ );
const testElement = screen.getByTestId('test-element');
expect(testElement).toBeInTheDocument();
@@ -61,7 +72,12 @@ describe('Reset', () => {
['unordered list', 'ul'],
['ordered list', 'ol'],
])('applies reset styles to %s', (_, type) => {
- render({React.createElement(type, { 'data-testid': 'list' }, Test Item )} );
+ render(
+ <>
+
+ {React.createElement(type, { 'data-testid': 'list' }, Test Item )}
+ >,
+ );
const list = screen.getByTestId('list');
expect(list).toHaveStyle({ listStyle: 'none' });
@@ -74,13 +90,14 @@ describe('Reset', () => {
['canvas', 'canvas'],
])('applies reset styles to %s element', (elementType, testId) => {
render(
-
+ <>
+
{React.createElement(elementType, {
'data-testid': testId,
src: elementType === 'img' ? 'test.jpg' : undefined,
alt: elementType === 'img' ? 'test' : undefined,
})}
- ,
+ >,
);
const element = screen.getByTestId(testId);
@@ -94,7 +111,8 @@ describe('Reset', () => {
'applies reset styles to %s element',
(elementType) => {
render(
-
+ <>
+
{React.createElement(
elementType,
{
@@ -102,7 +120,7 @@ describe('Reset', () => {
},
'Content',
)}
- ,
+ >,
);
const element = screen.getByTestId('semantic-element');
diff --git a/packages/reset/src/Reset.tsx b/packages/reset/src/Reset.tsx
index 9075aefe..36641b30 100644
--- a/packages/reset/src/Reset.tsx
+++ b/packages/reset/src/Reset.tsx
@@ -1,22 +1,7 @@
-import { Slot } from '@radix-ui/react-slot';
-import classNames from 'classnames';
-import { type ComponentPropsWithoutRef, forwardRef } from 'react';
-import styles from './Reset.module.css';
+import './reset.css';
-export interface ResetProps extends ComponentPropsWithoutRef<'div'> {
- asChild?: boolean;
-}
-
-export const Reset = forwardRef(
- ({ asChild = false, children, className, ...props }, ref) => {
- const Component = asChild ? Slot : 'div';
-
- return (
-
- {children}
-
- );
- },
-);
+export const Reset = () => {
+ return null;
+};
Reset.displayName = 'Reset';
diff --git a/packages/reset/src/global.css b/packages/reset/src/global.css
deleted file mode 100644
index 3a000117..00000000
--- a/packages/reset/src/global.css
+++ /dev/null
@@ -1,142 +0,0 @@
-/*************************
- * Root & Document Level Reset
- *************************/
-#root {
- isolation: isolate;
-}
-
-html {
- -webkit-text-size-adjust: 100%;
- -moz-text-size-adjust: 100%;
- -ms-text-size-adjust: 100%;
- text-size-adjust: 100%;
- line-height: 1.5;
-}
-
-@media (prefers-reduced-motion: no-preference) {
- html {
- scroll-behavior: smooth;
- }
-}
-
-body {
- min-height: 100vh;
- @supports (min-height: 100dvh) {
- min-height: 100dvh;
- }
-}
-
-/*************************
- * Box Model Reset
- *************************/
-*,
-*::before,
-*::after,
-*::backdrop {
- box-sizing: border-box;
- margin: 0;
- padding: 0;
- border-width: 0;
- border-style: solid;
-}
-
-/*************************
- * Typography Reset
- *************************/
-p,
-h1,
-h2,
-h3,
-h4,
-h5,
-h6 {
- overflow-wrap: break-word;
-}
-
-/*************************
- * Form Elements Reset
- *************************/
-button,
-input,
-select,
-textarea {
- -webkit-appearance: none;
- appearance: none;
- background: none;
- border: 0;
- color: inherit;
- font: inherit;
-}
-
-button,
-[type="button"],
-[type="reset"],
-[type="submit"] {
- -webkit-appearance: button;
- cursor: pointer;
- user-select: none;
-}
-
-textarea {
- resize: vertical;
-}
-
-::placeholder {
- opacity: 1;
-}
-
-/*************************
- * Table Reset
- *************************/
-table {
- border-collapse: collapse;
- border-spacing: 0;
- text-indent: 0;
-}
-
-th {
- text-align: inherit;
-}
-
-/*************************
- * Semantic Elements Reset
- *************************/
-article,
-aside,
-details,
-figcaption,
-figure,
-footer,
-header,
-hgroup,
-menu,
-nav,
-section,
-main {
- display: block;
-}
-
-/*************************
- * Media Elements Reset
- *************************/
-img,
-picture,
-video,
-canvas,
-svg {
- display: block;
- max-width: 100%;
-}
-
-/*************************
- * Lists & Links Reset
- *************************/
-ol,
-ul {
- list-style: none;
-}
-
-a {
- color: inherit;
- text-decoration: none;
-}
diff --git a/packages/reset/src/index.ts b/packages/reset/src/index.ts
index 3872e174..fb926f0c 100644
--- a/packages/reset/src/index.ts
+++ b/packages/reset/src/index.ts
@@ -1 +1,2 @@
export * from './Reset';
+export * from './reset.css';
diff --git a/packages/reset/src/reset.css b/packages/reset/src/reset.css
new file mode 100644
index 00000000..2ab32126
--- /dev/null
+++ b/packages/reset/src/reset.css
@@ -0,0 +1,268 @@
+/*************************
+ * Root & Document Level Reset
+ *************************/
+#root {
+ isolation: isolate;
+}
+
+html {
+ -webkit-text-size-adjust: 100%;
+ -moz-text-size-adjust: 100%;
+ -ms-text-size-adjust: 100%;
+ text-size-adjust: 100%;
+ line-height: 1.5;
+}
+
+@media (prefers-reduced-motion: no-preference) {
+ html {
+ scroll-behavior: smooth;
+ }
+}
+
+body {
+ min-height: 100vh;
+ @supports (min-height: 100dvh) {
+ min-height: 100dvh;
+ }
+}
+
+/*************************
+ * Box Model Reset
+ *************************/
+*,
+*::before,
+*::after,
+*::backdrop {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+ border-width: 0;
+ border-style: solid;
+}
+
+/*************************
+ * Typography Reset
+ *************************/
+p,
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+ overflow-wrap: break-word;
+}
+
+/*************************
+ * Form Elements Reset
+ *************************/
+button,
+input,
+select,
+textarea {
+ -webkit-appearance: none;
+ appearance: none;
+ background: none;
+ border: 0;
+ color: inherit;
+ font: inherit;
+}
+
+button,
+[type="button"],
+[type="reset"],
+[type="submit"] {
+ -webkit-appearance: button;
+ cursor: pointer;
+ user-select: none;
+}
+
+textarea {
+ resize: vertical;
+}
+
+::placeholder {
+ opacity: 1;
+}
+
+/*************************
+ * Table Reset
+ *************************/
+table {
+ border-collapse: collapse;
+ border-spacing: 0;
+ text-indent: 0;
+}
+
+th {
+ text-align: inherit;
+}
+
+/*************************
+ * Semantic Elements Reset
+ *************************/
+article,
+aside,
+details,
+figcaption,
+figure,
+footer,
+header,
+hgroup,
+menu,
+nav,
+section,
+main {
+ display: block;
+}
+
+/*************************
+ * Media Elements Reset
+ *************************/
+img,
+picture,
+video,
+canvas,
+svg {
+ display: block;
+ max-width: 100%;
+}
+
+/*************************
+ * Lists & Links Reset
+ *************************/
+ol,
+ul {
+ list-style: none;
+}
+
+a {
+ color: inherit;
+ text-decoration: none;
+}
+
+/*************************
+ * Box Model Reset
+ *************************/
+*,
+*::before,
+*::after,
+*::backdrop {
+ box-sizing: border-box;
+ margin: 0;
+ padding: 0;
+ border-width: 0;
+ border-style: solid;
+}
+
+/*************************
+ * Document Reset
+ *************************/
+html {
+ -webkit-text-size-adjust: none;
+ -moz-text-size-adjust: none;
+ text-size-adjust: none;
+}
+
+/*************************
+ * Typography Reset
+ *************************/
+:where(p, h1, h2, h3, h4, h5, h6) {
+ overflow-wrap: break-word;
+}
+
+:where(h1, h2, h3, h4, h5, h6) {
+ line-height: 1.2;
+ text-wrap: balance;
+}
+
+:where(p) {
+ text-wrap: pretty;
+}
+
+/*************************
+ * Form Elements Reset
+ *************************/
+:where(button, input, select, textarea) {
+ -webkit-appearance: none;
+ appearance: none;
+ background: none;
+ border: 0;
+ color: inherit;
+ font: inherit;
+}
+
+:where(button, [type="button"], [type="reset"], [type="submit"]) {
+ -webkit-appearance: button;
+ cursor: pointer;
+ user-select: none;
+}
+
+:where(textarea) {
+ resize: vertical;
+}
+
+:where(textarea:not([rows])) {
+ min-height: 10em;
+}
+
+::placeholder {
+ opacity: 1;
+}
+
+/*************************
+ * Table Reset
+ *************************/
+:where(table) {
+ border-collapse: collapse;
+ border-spacing: 0;
+ text-indent: 0;
+}
+
+:where(th) {
+ text-align: inherit;
+}
+
+/*************************
+ * Semantic Elements Reset
+ *************************/
+:where(article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section, main) {
+ display: block;
+}
+
+/*************************
+ * Media Elements Reset
+ *************************/
+:where(img, picture, video, canvas, svg) {
+ display: block;
+ max-width: 100%;
+}
+
+/*************************
+ * Lists & Links Reset
+ *************************/
+:where(ol, ul) {
+ list-style: none;
+}
+
+:where(a) {
+ color: inherit;
+ text-decoration: none;
+ text-decoration-skip-ink: auto;
+}
+
+/*************************
+ * Accessibility
+ *************************/
+:where(:target) {
+ scroll-margin-block: 5ex;
+}
+
+@media (prefers-reduced-motion: reduce) {
+ *:not(.preserve-motion) {
+ animation-duration: 0.01ms !important;
+ animation-iteration-count: 1 !important;
+ transition-duration: 0.01ms !important;
+ scroll-behavior: auto !important;
+ }
+}
diff --git a/packages/reset/src/reset.css.d.ts b/packages/reset/src/reset.css.d.ts
new file mode 100644
index 00000000..50d9335e
--- /dev/null
+++ b/packages/reset/src/reset.css.d.ts
@@ -0,0 +1,5 @@
+declare const styles: {
+ readonly [key: string]: string;
+};
+
+export default styles;
diff --git a/packages/side/package.json b/packages/side/package.json
index cc37474b..7ff9b257 100644
--- a/packages/side/package.json
+++ b/packages/side/package.json
@@ -9,12 +9,10 @@
},
"type": "module",
"exports": "./src/index.ts",
- "files": [
- "dist",
- "styles.css"
- ],
+ "files": ["dist", "styles.css"],
"scripts": {
"build": "tsup",
+ "clean": "rm -rf node_modules dist",
"prepack": "pnpm run build"
},
"dependencies": {
@@ -26,6 +24,7 @@
"@sipe-team/radio": "workspace:*",
"@sipe-team/skeleton": "workspace:*",
"@sipe-team/switch": "workspace:*",
+ "@sipe-team/theme": "workspace:*",
"@sipe-team/tokens": "workspace:*",
"@sipe-team/tooltip": "workspace:*",
"@sipe-team/typography": "workspace:*",
diff --git a/packages/side/src/index.ts b/packages/side/src/index.ts
index 34286e45..0fea7569 100644
--- a/packages/side/src/index.ts
+++ b/packages/side/src/index.ts
@@ -2,11 +2,12 @@ export * from '@sipe-team/badge';
export * from '@sipe-team/button';
export * from '@sipe-team/card';
export * from '@sipe-team/divider';
+export * from '@sipe-team/flex';
export * from '@sipe-team/input';
export * from '@sipe-team/radio';
export * from '@sipe-team/skeleton';
export * from '@sipe-team/switch';
+export * from '@sipe-team/theme';
export * from '@sipe-team/tokens';
export * from '@sipe-team/tooltip';
export * from '@sipe-team/typography';
-export * from '@sipe-team/flex';
diff --git a/packages/skeleton/package.json b/packages/skeleton/package.json
index 18a6f56f..be0e60fe 100644
--- a/packages/skeleton/package.json
+++ b/packages/skeleton/package.json
@@ -13,15 +13,18 @@
"scripts": {
"build": "tsup",
"build:storybook": "storybook build",
+ "clean": "rm -rf node_modules dist",
"dev:storybook": "storybook dev -p 6006",
- "lint:biome": "pnpm exec biome lint",
- "lint:eslint": "pnpm exec eslint",
+ "lint": "pnpm exec biome lint",
"test": "vitest",
"typecheck": "tsc",
"prepack": "pnpm run build"
},
"dependencies": {
- "@radix-ui/react-slot": "^1.1.0"
+ "@sipe-team/tokens": "workspace:*",
+ "@radix-ui/react-slot": "^1.1.0",
+ "@vanilla-extract/recipes": "^0.5.5",
+ "clsx": "^2.1.1"
},
"devDependencies": {
"@faker-js/faker": "^9.2.0",
@@ -34,6 +37,7 @@
"@storybook/test": "catalog:",
"@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.0.1",
+ "@vanilla-extract/css": "catalog:",
"@types/react": "catalog:react",
"happy-dom": "catalog:",
"react": "catalog:react",
diff --git a/packages/skeleton/src/Skeleton.css.ts b/packages/skeleton/src/Skeleton.css.ts
new file mode 100644
index 00000000..dd479ac8
--- /dev/null
+++ b/packages/skeleton/src/Skeleton.css.ts
@@ -0,0 +1,112 @@
+import { color, radius } from '@sipe-team/tokens';
+
+import { keyframes, style } from '@vanilla-extract/css';
+import { recipe } from '@vanilla-extract/recipes';
+
+const fadeInOut = keyframes({
+ '0%': { opacity: 1 },
+ '50%': { opacity: 0.4 },
+ '100%': { opacity: 1 },
+});
+
+export const SkeletonVariant = {
+ rectangular: 'rectangular',
+ circle: 'circle',
+ text: 'text',
+ rounded: 'rounded',
+} as const;
+
+export type SkeletonVariant = (typeof SkeletonVariant)[keyof typeof SkeletonVariant];
+
+const baseSkeletonStyle = style({
+ backgroundColor: color.gray200,
+ backgroundImage: 'none',
+ backgroundClip: 'border-box',
+ border: 'none',
+ boxShadow: 'none',
+ color: 'transparent',
+ outline: 'none',
+ pointerEvents: 'none',
+ userSelect: 'none',
+ cursor: 'default',
+ overflow: 'hidden',
+ position: 'relative',
+
+ '::before': {
+ content: '""',
+ position: 'absolute',
+ top: 0,
+ left: 0,
+ right: 0,
+ bottom: 0,
+ background: `linear-gradient(90deg, transparent, ${color.gray300}, transparent)`,
+ animation: `${fadeInOut} 1.5s ease-in-out infinite`,
+ },
+});
+
+export const skeleton = recipe({
+ base: baseSkeletonStyle,
+
+ variants: {
+ variant: {
+ [SkeletonVariant.rectangular]: {
+ borderRadius: radius.sm,
+ },
+ [SkeletonVariant.circle]: {
+ borderRadius: radius.full,
+ aspectRatio: '1',
+ },
+ [SkeletonVariant.text]: {
+ borderRadius: radius.sm,
+ height: '1em',
+ width: '100%',
+ },
+ [SkeletonVariant.rounded]: {
+ borderRadius: radius.md,
+ },
+ },
+
+ loading: {
+ true: {},
+ false: {
+ animation: 'none',
+ backgroundColor: 'transparent',
+
+ '::before': {
+ display: 'none',
+ },
+ },
+ },
+
+ pulse: {
+ true: {
+ '::before': {
+ animation: `${fadeInOut} 1.2s ease-in-out infinite`,
+ },
+ },
+ false: {
+ '::before': {
+ animation: `${fadeInOut} 2s ease-in-out infinite`,
+ },
+ },
+ },
+ },
+
+ defaultVariants: {
+ variant: SkeletonVariant.rectangular,
+ loading: true,
+ pulse: true,
+ },
+});
+
+export const shimmer = keyframes({
+ '0%': { transform: 'translateX(-100%)' },
+ '100%': { transform: 'translateX(100%)' },
+});
+
+export const shimmerEffect = style({
+ '::before': {
+ background: `linear-gradient(90deg, transparent, ${color.white}, transparent)`,
+ animation: `${shimmer} 2s infinite`,
+ },
+});
diff --git a/packages/skeleton/src/Skeleton.module.css b/packages/skeleton/src/Skeleton.module.css
deleted file mode 100644
index 8658c157..00000000
--- a/packages/skeleton/src/Skeleton.module.css
+++ /dev/null
@@ -1,30 +0,0 @@
-@keyframes fadeInOut {
- 0% {
- opacity: 1;
- }
- 50% {
- opacity: 0.8;
- }
- 100% {
- opacity: 1;
- }
-}
-
-
-.skeleton{
- animation: fadeInOut 1.5s infinite !important;
- width: var(--width);
- height: var(--height);
- background-color: rgb(155, 155, 155);
-
- background-image: none !important;
- background-clip: border-box !important;
- border: none !important;
- box-shadow: none !important;
- box-decoration-break: clone !important;
- color: transparent !important;
- outline: none !important;
- pointer-events: none !important;
- user-select: none !important;
- cursor: default !important;
-}
\ No newline at end of file
diff --git a/packages/skeleton/src/Skeleton.stories.tsx b/packages/skeleton/src/Skeleton.stories.tsx
index 123cc8aa..84eacdcd 100644
--- a/packages/skeleton/src/Skeleton.stories.tsx
+++ b/packages/skeleton/src/Skeleton.stories.tsx
@@ -1,5 +1,3 @@
-import { faker } from '@faker-js/faker';
-// Skeleton.stories.tsx
import type { Meta, StoryObj } from '@storybook/react';
import { Skeleton } from './Skeleton';
@@ -12,19 +10,42 @@ const meta = {
argTypes: {
variant: {
control: 'select',
- options: ['circle', 'rectangular'],
+ options: ['rectangular', 'circle', 'text', 'rounded'],
+ description: 'Visual variant of the skeleton',
+ defaultValue: 'rectangular',
},
width: {
- control: { type: 'number', min: 20, max: 200, step: 10 },
+ control: { type: 'number', min: 20, max: 500, step: 10 },
+ description: 'Width of the skeleton in pixels',
},
height: {
control: { type: 'number', min: 20, max: 200, step: 10 },
+ description: 'Height of the skeleton in pixels',
},
loading: {
control: 'boolean',
+ description: 'Whether to show skeleton or content',
+ defaultValue: true,
},
asChild: {
control: 'boolean',
+ description: 'Whether to use as a wrapper',
+ defaultValue: false,
+ },
+ pulse: {
+ control: 'boolean',
+ description: 'Enable faster pulse animation',
+ defaultValue: false,
+ },
+ shimmer: {
+ control: 'boolean',
+ description: 'Enable shimmer effect',
+ defaultValue: false,
+ },
+ lines: {
+ control: { type: 'number', min: 1, max: 10, step: 1 },
+ description: 'Number of lines for text variant',
+ defaultValue: 1,
},
},
} satisfies Meta;
@@ -37,12 +58,12 @@ export const Basic: Story = {
args: {
loading: true,
variant: 'rectangular',
- width: 100,
+ width: 200,
height: 100,
},
};
-export const CircleSkeleton: Story = {
+export const Circle: Story = {
args: {
loading: true,
variant: 'circle',
@@ -51,29 +72,40 @@ export const CircleSkeleton: Story = {
},
};
-export const RectangularSkeleton: Story = {
+export const Text: Story = {
args: {
loading: true,
- variant: 'rectangular',
- width: 80,
- height: 30,
+ variant: 'text',
+ width: 300,
+ lines: 3,
},
};
-export const SkeletonWithChildren: Story = {
+export const Rounded: Story = {
+ args: {
+ loading: true,
+ variant: 'rounded',
+ width: 200,
+ height: 60,
+ },
+};
+
+export const WithShimmer: Story = {
args: {
loading: true,
- asChild: true,
- children: Loading... ,
variant: 'rectangular',
+ width: 200,
+ height: 100,
+ shimmer: true,
},
};
-export const SkeletonWithText: Story = {
+export const WithPulse: Story = {
args: {
loading: true,
- asChild: true,
- children: {faker.lorem.lines(2)} ,
variant: 'rectangular',
+ width: 200,
+ height: 100,
+ pulse: true,
},
};
diff --git a/packages/skeleton/src/Skeleton.test.tsx b/packages/skeleton/src/Skeleton.test.tsx
index 3c625618..a593562f 100644
--- a/packages/skeleton/src/Skeleton.test.tsx
+++ b/packages/skeleton/src/Skeleton.test.tsx
@@ -1,55 +1,202 @@
import { render, screen } from '@testing-library/react';
-import { expect, test } from 'vitest';
+import { describe, expect, it, test } from 'vitest';
import { Skeleton } from './Skeleton';
-test('loading์ด true ์ผ ๋ ์ค์ผ๋ ํค์ด ๋ ๋๋ง ๋๋ค.', () => {
- render( );
+describe('Skeleton', () => {
+ test('loading์ด true์ผ ๋ ์ค์ผ๋ ํค์ด ๋ ๋๋ง๋๋ค.', () => {
+ render( );
- const skeleton = screen.getByLabelText('skeleton');
- expect(skeleton).toBeInTheDocument();
-});
+ const skeleton = screen.getByLabelText('skeleton');
+ expect(skeleton).toBeInTheDocument();
+ expect(skeleton).toHaveAttribute('aria-busy', 'true');
+ });
-test('loading์ด false ์ผ ๋ children์ด ๋ ๋๋ง ๋๋ค.', () => {
- render(Childrun );
+ test('loading์ด false์ผ ๋ children์ด ๋ ๋๋ง๋๋ค.', () => {
+ render(Children Content );
- expect(screen.getByText('Childrun')).toBeInTheDocument();
-});
+ expect(screen.getByText('Children Content')).toBeInTheDocument();
+ expect(screen.queryByLabelText('Loading content')).not.toBeInTheDocument();
+ });
-test('variant๊ฐ circle์ผ ๋ borderRadius๊ฐ 50%๋ก ์ค์ ๋๋ค.', () => {
- render( );
+ describe('Variants', () => {
+ it.each([
+ ['rectangular', 'rectangular'],
+ ['circle', 'circle'],
+ ['text', 'text'],
+ ['rounded', 'rounded'],
+ ])('variant๊ฐ %s์ผ ๋ ์ฌ๋ฐ๋ฅธ ํด๋์ค๊ฐ ์ ์ฉ๋๋ค', (variant) => {
+ const { container } = render( );
- const skeleton = screen.getByLabelText('skeleton');
- expect(skeleton).toHaveStyle({ borderRadius: '50%' });
-});
-test('variant๊ฐ rectangular์ผ ๋ borderRadius๊ฐ ๊ธฐ๋ณธ๊ฐ 4px์ผ๋ก ์ค์ ๋๋ค.', () => {
- render(
- ,
- );
+ const skeleton = container.firstChild as HTMLElement;
+ expect(skeleton).toBeInTheDocument();
+ });
+ });
- const skeleton = screen.getByLabelText('skeleton');
- expect(skeleton).toHaveStyle({ borderRadius: '4px' });
-});
-test('width์ height๊ฐ props๋ก ์ ๋ฌ๋ ๋ ์ฌ๋ฐ๋ฅด๊ฒ ์คํ์ผ์ด ์ ์ฉ๋๋ค.', () => {
- render(
- ,
- );
+ describe('Circle variant', () => {
+ test('circle variant๋ 1:1 aspect ratio๋ฅผ ๊ฐ์ง๋ค', () => {
+ render( );
- const skeleton = screen.getByLabelText('skeleton');
- expect(skeleton).toHaveStyle({ width: '150px', height: '50px' });
-});
+ const skeleton = screen.getByTestId('skeleton');
+ expect(skeleton).toHaveStyle({ aspectRatio: '1' });
+ });
+ });
+
+ describe('Text variant', () => {
+ test('text variant๋ ๊ธฐ๋ณธ์ ์ผ๋ก 1์ค์ ๋ ๋๋งํ๋ค', () => {
+ render( );
+
+ const skeleton = screen.getByTestId('skeleton');
+ expect(skeleton).toBeInTheDocument();
+ expect(skeleton).toHaveStyle({ height: '16px' });
+ });
+
+ test('lines prop์ผ๋ก ์ฌ๋ฌ ์ค์ ๋ ๋๋งํ ์ ์๋ค', () => {
+ const { container } = render( );
+
+ const wrapper = container.firstChild as HTMLElement;
+ const lines = wrapper.children;
+ expect(lines).toHaveLength(3);
+ });
+
+ test('๋ง์ง๋ง ์ค์ 75% ๋๋น๋ฅผ ๊ฐ์ง๋ค', () => {
+ const { container } = render( );
+
+ const wrapper = container.firstChild as HTMLElement;
+ const lastLine = wrapper.lastElementChild as HTMLElement;
+ expect(lastLine).toHaveStyle({ width: '75%' });
+ });
+
+ test('text variant์์ height๋ฅผ ์ง์ ํ๋ฉด ์ ์ฉ๋๋ค', () => {
+ render( );
+
+ const skeleton = screen.getByTestId('skeleton');
+ expect(skeleton).toHaveStyle({ height: '32px' });
+ });
+ });
+
+ describe('Size properties', () => {
+ test('width์ height๊ฐ ์ซ์๋ก ์ ๋ฌ๋ ๋ px ๋จ์๋ก ์ ์ฉ๋๋ค', () => {
+ render( );
+
+ const skeleton = screen.getByTestId('skeleton');
+ expect(skeleton).toHaveStyle({
+ width: '150px',
+ height: '50px',
+ });
+ });
+
+ test('width์ height๊ฐ ๋ฌธ์์ด๋ก ์ ๋ฌ๋ ๋ ๊ทธ๋๋ก ์ ์ฉ๋๋ค', () => {
+ render( );
+
+ const skeleton = screen.getByTestId('skeleton');
+ expect(skeleton).toHaveStyle({
+ width: '100%',
+ // 2rem์ ๋ธ๋ผ์ฐ์ ์์ 32px๋ก ๊ณ์ฐ๋จ
+ height: '32px',
+ });
+ });
+
+ test('width์ height๊ฐ ์ง์ ๋์ง ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ด ์ ์ฉ๋๋ค', () => {
+ render( );
+
+ const skeleton = screen.getByTestId('skeleton');
+ expect(skeleton).toBeInTheDocument();
+ });
+ });
+
+ describe('Animation properties', () => {
+ test('pulse prop์ด true์ผ ๋ ์ ์ ํ ํด๋์ค๊ฐ ์ ์ฉ๋๋ค', () => {
+ const { container } = render( );
+
+ const skeleton = container.firstChild as HTMLElement;
+ expect(skeleton).toBeInTheDocument();
+ });
+
+ test('shimmer prop์ด true์ผ ๋ ์ ์ ํ ํด๋์ค๊ฐ ์ ์ฉ๋๋ค', () => {
+ const { container } = render( );
+
+ const skeleton = container.firstChild as HTMLElement;
+ expect(skeleton).toBeInTheDocument();
+ });
+ });
+
+ describe('asChild behavior', () => {
+ test('asChild๊ฐ true์ผ ๋ ์์ ์์์ ํ๊ทธ๊ฐ ์ ์ง๋๋ค', () => {
+ render(
+
+ Button content
+ ,
+ );
+
+ const element = screen.getByTestId('skeleton');
+ expect(element.tagName).toBe('BUTTON');
+ });
+
+ test('asChild๊ฐ false์ด๊ฑฐ๋ ์ง์ ๋์ง ์์ผ๋ฉด div๋ก ๋ ๋๋ง๋๋ค', () => {
+ render( );
+
+ const element = screen.getByTestId('skeleton');
+ expect(element.tagName).toBe('DIV');
+ });
+ });
+
+ describe('Accessibility', () => {
+ test('loading ์ํ์ผ ๋ aria-busy="true"๊ฐ ์ค์ ๋๋ค', () => {
+ render( );
+
+ const skeleton = screen.getByTestId('skeleton');
+ expect(skeleton).toHaveAttribute('aria-busy', 'true');
+ });
+
+ test('loading ์ํ์ผ ๋ ๊ธฐ๋ณธ aria-label์ด ์ค์ ๋๋ค', () => {
+ render( );
+
+ const skeleton = screen.getByLabelText('Loading content');
+ expect(skeleton).toBeInTheDocument();
+ });
+
+ test('์ปค์คํ
aria-label์ ์ค์ ํ ์ ์๋ค', () => {
+ render( );
+
+ const skeleton = screen.getByLabelText('Custom loading message');
+ expect(skeleton).toBeInTheDocument();
+ });
+ });
+
+ describe('Custom styling', () => {
+ test('์ปค์คํ
className์ด ์ ์ฉ๋๋ค', () => {
+ const customClass = 'custom-skeleton';
+ render( );
+
+ const skeleton = screen.getByTestId('skeleton');
+ expect(skeleton).toHaveClass(customClass);
+ });
+
+ test('์ปค์คํ
style์ด ์ ์ฉ๋๋ค', () => {
+ const customStyle = {
+ backgroundColor: 'red',
+ margin: '10px',
+ };
+ render( );
+
+ const skeleton = screen.getByTestId('skeleton');
+ expect(skeleton).toHaveStyle(customStyle);
+ });
+ });
+
+ describe('Edge cases', () => {
+ test('lines๊ฐ 0 ์ดํ์ผ ๋๋ ์ ์ ๋์ํ๋ค', () => {
+ render( );
+
+ const element = screen.getByTestId('skeleton');
+ expect(element).toBeInTheDocument();
+ });
+
+ test('๋งค์ฐ ํฐ lines ๊ฐ๋ ์ฒ๋ฆฌํ ์ ์๋ค', () => {
+ const { container } = render( );
-test('asChild๊ฐ true์ผ ๋, children์ผ๋ก ์ ๋ฌ๋ ์์์ Skeleton ์คํ์ผ์ ์ ์ฉํ๋ค.', () => {
- render(
-
- Child Content
- ,
- );
-
- const child = screen.getByTestId('child');
- expect(child).toBeInTheDocument();
- expect(child).toHaveStyle({
- 'background-color': 'rgb(155, 155, 155)',
- width: '120px',
- height: '30px',
+ const wrapper = container.firstChild as HTMLElement;
+ expect(wrapper.children).toHaveLength(100);
+ });
});
});
diff --git a/packages/skeleton/src/Skeleton.tsx b/packages/skeleton/src/Skeleton.tsx
index 32db98ba..b38390b5 100644
--- a/packages/skeleton/src/Skeleton.tsx
+++ b/packages/skeleton/src/Skeleton.tsx
@@ -1,39 +1,97 @@
+import { type ComponentProps, type CSSProperties, type ForwardedRef, forwardRef } from 'react';
+
import { Slot } from '@radix-ui/react-slot';
-import {
- type CSSProperties,
- type ComponentProps,
- type ForwardedRef,
- forwardRef,
-} from 'react';
-import styles from './Skeleton.module.css';
-type Variant = 'circle' | 'rectangular';
+import { clsx as cx } from 'clsx';
+
+import { type SkeletonVariant, shimmerEffect, skeleton } from './Skeleton.css';
interface SkeletonProps extends ComponentProps<'div'> {
asChild?: boolean;
loading: boolean;
- variant?: Variant;
- width?: number;
- height?: number;
+ variant?: SkeletonVariant;
+ width?: number | string;
+ height?: number | string;
+ pulse?: boolean;
+ shimmer?: boolean;
+ lines?: number;
}
+
export const Skeleton = forwardRef(function Skeleton(
- { asChild, loading, children, ...props }: SkeletonProps,
+ {
+ asChild,
+ loading,
+ children,
+ variant = 'rectangular',
+ width,
+ height,
+ pulse = true,
+ shimmer = false,
+ lines = 1,
+ className,
+ style,
+ ...props
+ }: SkeletonProps,
ref: ForwardedRef,
) {
if (!loading) return children;
const Component = asChild ? Slot : 'div';
- const style = {
- '--width': props.width ? `${props.width}px` : 'auto',
- '--height': props.height ? `${props.height}px` : 'auto',
- borderRadius: props.variant === 'circle' ? '50%' : '4px',
- } as CSSProperties;
+ const skeletonStyle: CSSProperties = {
+ width: typeof width === 'number' ? `${width}px` : width,
+ height: typeof height === 'number' ? `${height}px` : height,
+ ...style,
+ };
+
+ if (variant === 'text' && lines > 1) {
+ return (
+
+ {Array.from({ length: lines }, (_, index) => {
+ const isLast = index === lines - 1;
+ const lineKey = `skeleton-line-${index}-${isLast ? 'last' : 'regular'}`;
+
+ return (
+
+ );
+ })}
+
+ );
+ }
return (
-
- {children}
+
+ {asChild && children}
);
});
+
Skeleton.displayName = 'Skeleton';
diff --git a/packages/switch/.storybook/main.ts b/packages/switch/.storybook/main.ts
index e7f301d3..fcde26a7 100644
--- a/packages/switch/.storybook/main.ts
+++ b/packages/switch/.storybook/main.ts
@@ -1,3 +1,5 @@
+import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin';
+
import type { StorybookConfig } from '@storybook/react-vite';
export default {
@@ -7,4 +9,8 @@ export default {
name: '@storybook/react-vite',
options: {},
},
+ viteFinal: async (config) => {
+ config.plugins = [...(config.plugins || []), vanillaExtractPlugin()];
+ return config;
+ },
} satisfies StorybookConfig;
diff --git a/packages/switch/package.json b/packages/switch/package.json
index 7416d88a..c971150c 100644
--- a/packages/switch/package.json
+++ b/packages/switch/package.json
@@ -13,15 +13,17 @@
"scripts": {
"build": "tsup",
"build:storybook": "storybook build",
+ "clean": "rm -rf node_modules dist",
"dev:storybook": "storybook dev -p 6006",
- "lint:biome": "pnpm exec biome lint",
- "lint:eslint": "pnpm exec eslint",
+ "lint": "pnpm exec biome lint",
"test": "vitest",
"typecheck": "tsc",
"prepack": "pnpm run build"
},
"dependencies": {
+ "@radix-ui/react-use-controllable-state": "^1.2.2",
"@sipe-team/tokens": "workspace:^",
+ "@vanilla-extract/recipes": "^0.5.5",
"clsx": "^2.1.1"
},
"devDependencies": {
@@ -37,6 +39,8 @@
"@testing-library/react": "^16.0.1",
"@testing-library/user-event": "^14.5.2",
"@types/react": "catalog:react",
+ "@vanilla-extract/css": "catalog:",
+ "@vanilla-extract/vite-plugin": "catalog:",
"happy-dom": "catalog:",
"react": "catalog:react",
"react-dom": "catalog:react",
diff --git a/packages/switch/src/Switch.css.ts b/packages/switch/src/Switch.css.ts
new file mode 100644
index 00000000..0e58dd18
--- /dev/null
+++ b/packages/switch/src/Switch.css.ts
@@ -0,0 +1,142 @@
+import { color } from '@sipe-team/tokens';
+
+import { style } from '@vanilla-extract/css';
+import { recipe } from '@vanilla-extract/recipes';
+
+import { SWITCH_SIZES, SwitchSize } from './constants/size';
+
+export const wrapper = style({
+ display: 'inline-flex',
+ alignItems: 'center',
+ cursor: 'pointer',
+ position: 'relative',
+
+ ':focus-within': {
+ outline: `2px solid ${color.blue500}`,
+ outlineOffset: '2px',
+ borderRadius: '4px',
+ },
+
+ selectors: {
+ '&[data-disabled="true"]': {
+ cursor: 'not-allowed',
+ opacity: 0.5,
+ },
+ },
+});
+
+export const input = style({
+ position: 'absolute',
+ width: '1px',
+ height: '1px',
+ padding: 0,
+ margin: '-1px',
+ overflow: 'hidden',
+ clip: 'rect(0, 0, 0, 0)',
+ whiteSpace: 'nowrap',
+ border: 0,
+});
+
+export const track = recipe({
+ base: {
+ position: 'relative',
+ display: 'inline-flex',
+ alignItems: 'center',
+ borderRadius: '100px',
+ backgroundColor: color.gray300,
+ transition: 'all 150ms ease-in-out',
+ cursor: 'pointer',
+
+ ':focus-visible': {
+ outline: `2px solid ${color.blue500}`,
+ outlineOffset: '2px',
+ },
+
+ selectors: {
+ '&[data-disabled="true"]': {
+ cursor: 'not-allowed',
+ backgroundColor: color.gray200,
+ },
+ '&[data-checked="true"]': {
+ backgroundColor: color.blue500,
+ },
+ '&[data-checked="true"][data-disabled="true"]': {
+ backgroundColor: color.blue300,
+ },
+ },
+ },
+ variants: {
+ size: {
+ [SwitchSize.sm]: {
+ width: `${SWITCH_SIZES[SwitchSize.sm].width}px`,
+ height: `${SWITCH_SIZES[SwitchSize.sm].height}px`,
+ padding: `${SWITCH_SIZES[SwitchSize.sm].gap}px`,
+ },
+ [SwitchSize.md]: {
+ width: `${SWITCH_SIZES[SwitchSize.md].width}px`,
+ height: `${SWITCH_SIZES[SwitchSize.md].height}px`,
+ padding: `${SWITCH_SIZES[SwitchSize.md].gap}px`,
+ },
+ [SwitchSize.lg]: {
+ width: `${SWITCH_SIZES[SwitchSize.lg].width}px`,
+ height: `${SWITCH_SIZES[SwitchSize.lg].height}px`,
+ padding: `${SWITCH_SIZES[SwitchSize.lg].gap}px`,
+ },
+ },
+ },
+ defaultVariants: {
+ size: SwitchSize.md,
+ },
+});
+
+export const thumb = recipe({
+ base: {
+ display: 'block',
+ backgroundColor: color.white,
+ transition: 'transform 150ms ease-in-out',
+ boxShadow: `0px 2px 4px ${color.gray900}1A, 0px 0px 1px ${color.gray900}4D`,
+
+ selectors: {
+ '[data-checked="true"] &': {
+ transform: 'translateX(var(--switch-translate-distance))',
+ },
+ },
+ },
+ variants: {
+ size: {
+ [SwitchSize.sm]: {
+ width: `${SWITCH_SIZES[SwitchSize.sm].thumbSize}px`,
+ height: `${SWITCH_SIZES[SwitchSize.sm].thumbSize}px`,
+ borderRadius: `${SWITCH_SIZES[SwitchSize.sm].width - SWITCH_SIZES[SwitchSize.sm].gap}px`,
+ },
+ [SwitchSize.md]: {
+ width: `${SWITCH_SIZES[SwitchSize.md].thumbSize}px`,
+ height: `${SWITCH_SIZES[SwitchSize.md].thumbSize}px`,
+ borderRadius: `${SWITCH_SIZES[SwitchSize.md].width - SWITCH_SIZES[SwitchSize.md].gap}px`,
+ },
+ [SwitchSize.lg]: {
+ width: `${SWITCH_SIZES[SwitchSize.lg].thumbSize}px`,
+ height: `${SWITCH_SIZES[SwitchSize.lg].thumbSize}px`,
+ borderRadius: `${SWITCH_SIZES[SwitchSize.lg].width - SWITCH_SIZES[SwitchSize.lg].gap}px`,
+ },
+ },
+ },
+ defaultVariants: {
+ size: SwitchSize.md,
+ },
+});
+
+export const label = style({
+ marginLeft: '8px',
+ fontSize: '14px',
+ color: color.gray900,
+ cursor: 'pointer',
+ userSelect: 'none',
+
+ selectors: {
+ '[data-disabled="true"] &': {
+ color: color.gray400,
+ cursor: 'not-allowed',
+ },
+ },
+});
diff --git a/packages/switch/src/Switch.module.css b/packages/switch/src/Switch.module.css
deleted file mode 100644
index 0ba047eb..00000000
--- a/packages/switch/src/Switch.module.css
+++ /dev/null
@@ -1,55 +0,0 @@
-.switch-wrapper {
- display: flex;
- align-items: center;
-}
-
-.switch-input {
- border: 0px;
- clip: rect(0px, 0px, 0px, 0px);
- height: 1px;
- margin: -1px;
- overflow: hidden;
- padding: 0px;
- position: absolute;
- width: 1px;
- white-space: nowrap;
- overflow-wrap: normal;
-}
-
-.switch-track {
- position: relative;
- display: inline-flex;
- justify-content: flex-start;
- align-items: center;
- flex-shrink: 0;
- border-radius: var(--switch-border-radius);
- width: var(--switch-width);
- height: var(--switch-height);
- background: var(--switch-background-color);
- cursor: pointer;
-
- &[data-disabled] {
- opacity: 0.5;
- cursor: not-allowed;
- }
-
- &[data-state='checked'] {
- background: var(--switch-checked-background-color);
- }
-}
-
-.switch-thumb {
- width: var(--switch-height);
- height: var(--switch-height);
- scale: 0.8;
- background: var(--switch-thumb-color);
- border-radius: inherit;
- box-shadow: var(--switch-shadow);
-
- transition-property: translate;
- transition-duration: 150ms;
-
- &[data-state='checked'] {
- translate: var(--switch-diff) 0;
- }
-}
diff --git a/packages/switch/src/Switch.stories.tsx b/packages/switch/src/Switch.stories.tsx
index 926cd36f..b9910e35 100644
--- a/packages/switch/src/Switch.stories.tsx
+++ b/packages/switch/src/Switch.stories.tsx
@@ -1,25 +1,71 @@
import type { Meta, StoryObj } from '@storybook/react';
+import { useState } from 'react';
import { Switch } from './Switch';
+import { SWITCH_SIZES } from './constants/size';
const meta = {
title: 'Components/Switch',
component: Switch,
parameters: {
layout: 'centered',
+ docs: {
+ description: {
+ component:
+ '์ฌ์ฉ์๊ฐ ์ค์ ์ ์ผ๊ณ ๋ ์ ์๋ ํ ๊ธ ์ค์์น ์ปดํฌ๋ํธ์
๋๋ค. ์ ๊ทผ์ฑ์ ๊ณ ๋ คํ์ฌ ํค๋ณด๋ ๋ค๋น๊ฒ์ด์
๊ณผ ์คํฌ๋ฆฐ ๋ฆฌ๋๋ฅผ ์ง์ํฉ๋๋ค.',
+ },
+ },
},
args: {
defaultChecked: false,
+ disabled: false,
+ size: 'md',
},
argTypes: {
size: {
control: 'select',
- options: ['sm', 'md', 'lg'],
+ options: Object.values(SWITCH_SIZES),
+ description: '์ค์์น์ ํฌ๊ธฐ๋ฅผ ์ค์ ํฉ๋๋ค.',
+ table: {
+ type: { summary: 'sm | md | lg' },
+ defaultValue: { summary: 'md' },
+ },
},
checked: {
control: 'boolean',
+ description: '์ ์ด ์ปดํฌ๋ํธ๋ก ์ฌ์ฉํ ๋์ ์ฒดํฌ ์ํ์
๋๋ค.',
+ table: {
+ type: { summary: 'boolean' },
+ },
+ },
+ defaultChecked: {
+ control: 'boolean',
+ description: '๋น์ ์ด ์ปดํฌ๋ํธ์ ์ด๊ธฐ ์ฒดํฌ ์ํ์
๋๋ค.',
+ table: {
+ type: { summary: 'boolean' },
+ defaultValue: { summary: 'false' },
+ },
},
disabled: {
control: 'boolean',
+ description: '์ค์์น์ ๋นํ์ฑํ ์ํ๋ฅผ ์ค์ ํฉ๋๋ค.',
+ table: {
+ type: { summary: 'boolean' },
+ defaultValue: { summary: 'false' },
+ },
+ },
+ label: {
+ control: 'text',
+ description: '์ค์์น์ ํจ๊ป ํ์๋ ๋ผ๋ฒจ ํ
์คํธ์
๋๋ค.',
+ table: {
+ type: { summary: 'string' },
+ },
+ },
+ 'aria-label': {
+ control: 'text',
+ description: '์ ๊ทผ์ฑ์ ์ํ aria-label ์์ฑ์
๋๋ค.',
+ table: {
+ type: { summary: 'string' },
+ },
},
},
} satisfies Meta;
@@ -27,32 +73,291 @@ const meta = {
export default meta;
type Story = StoryObj;
-export const Default: Story = {};
+export const Default: Story = {
+ args: {
+ 'aria-label': '๊ธฐ๋ณธ ์ค์์น',
+ },
+};
+
+export const WithLabel: Story = {
+ args: {
+ label: '์๋ฆผ ๋ฐ๊ธฐ',
+ },
+};
export const DefaultChecked: Story = {
args: {
defaultChecked: true,
+ label: '์๋ ์ ์ฅ',
},
};
-export const Checked: Story = {
- args: {
- checked: true,
+export const Controlled: Story = {
+ render: (args) => {
+ const [checked, setChecked] = useState(false);
+
+ return (
+
+
setChecked(e.target.checked)} label="๋คํฌ ๋ชจ๋" />
+
+ ํ์ฌ ์ํ: {checked ? 'ON' : 'OFF'}
+
+ setChecked(!checked)}
+ style={{
+ padding: '8px 16px',
+ borderRadius: '4px',
+ border: '1px solid #ddd',
+ background: '#f9f9f9',
+ cursor: 'pointer',
+ }}
+ >
+ ์ธ๋ถ์์ ํ ๊ธ
+
+
+ );
+ },
+ parameters: {
+ docs: {
+ description: {
+ story: '์ธ๋ถ ์ํ๋ก ์ ์ด๋๋ ์ค์์น์
๋๋ค. checked์ onChange๋ฅผ ํจ๊ป ์ฌ์ฉํฉ๋๋ค.',
+ },
+ },
+ },
+};
+
+export const Sizes: Story = {
+ render: () => (
+
+
+
+ Small (32ร16)
+
+
+
+ Medium (40ร20)
+
+
+
+ Large (48ร24)
+
+
+ ),
+ parameters: {
+ docs: {
+ description: {
+ story: '์ค์์น์ 3๊ฐ์ง ํฌ๊ธฐ๋ฅผ ๋ณด์ฌ์ค๋๋ค. ๊ธฐ๋ณธ๊ฐ์ Medium์
๋๋ค.',
+ },
+ },
},
};
export const Disabled: Story = {
- args: {
- disabled: true,
+ render: () => (
+
+
+
+
+ ),
+ parameters: {
+ docs: {
+ description: {
+ story: '๋นํ์ฑํ๋ ์ํ์ ์ค์์น์
๋๋ค. ์ฌ์ฉ์ ์ํธ์์ฉ์ด ๋ถ๊ฐ๋ฅํฉ๋๋ค.',
+ },
+ },
},
};
-export const Sizes: Story = {
+export const InForm: Story = {
+ render: () => {
+ const [formData, setFormData] = useState({
+ notifications: true,
+ autoSave: false,
+ darkMode: false,
+ marketing: false,
+ });
+
+ const handleSubmit = (e: React.FormEvent) => {
+ e.preventDefault();
+ alert(`ํผ ๋ฐ์ดํฐ: ${JSON.stringify(formData, null, 2)}`);
+ };
+
+ const handleChange = (field: string) => (e: React.ChangeEvent) => {
+ setFormData((prev) => ({
+ ...prev,
+ [field]: e.target.checked,
+ }));
+ };
+
+ return (
+
+ );
+ },
+ parameters: {
+ docs: {
+ description: {
+ story:
+ '์ค์ ํผ์์ ์ค์์น๋ฅผ ์ฌ์ฉํ๋ ์์ ์
๋๋ค. ์ฌ๋ฌ ์ค์์น์ ์ํ๋ฅผ ๊ด๋ฆฌํ๊ณ ํผ ์ ์ถ ์ ๋ฐ์ดํฐ๋ฅผ ์์งํฉ๋๋ค.',
+ },
+ },
+ },
+};
+
+export const AccessibilityDemo: Story = {
render: () => (
-
-
-
-
+
+
+
์ ๊ทผ์ฑ ๊ธฐ๋ฅ
+
+ Tab ํค๋ก ํฌ์ปค์ค ์ด๋
+ Space ๋๋ Enter ํค๋ก ํ ๊ธ
+ ์คํฌ๋ฆฐ ๋ฆฌ๋ ์ง์ <role=switch>
+ aria-checked ์ํ ์
๋ฐ์ดํธ
+
+
+
+
+
+
+
+ aria-labelledby๋ก ์ฐ๊ฒฐ๋ ๋ผ๋ฒจ
+
+
+
+
+
+ ๐ก ์ฌ์ฉ๋ฒ: Tab ํค๋ก ์ค์์น์ ํฌ์ปค์ค๋ฅผ ๋ง์ถ ํ Space ๋๋ Enter ํค๋ฅผ ๋๋ฌ๋ณด์ธ์.
+
),
+ parameters: {
+ docs: {
+ description: {
+ story: '์ค์์น์ ์ ๊ทผ์ฑ ๊ธฐ๋ฅ์ ๋ณด์ฌ์ค๋๋ค. ํค๋ณด๋ ๋ค๋น๊ฒ์ด์
๊ณผ ์คํฌ๋ฆฐ ๋ฆฌ๋ ์ง์์ด ํฌํจ๋์ด ์์ต๋๋ค.',
+ },
+ },
+ },
+};
+
+export const AsyncToggle: Story = {
+ render: () => {
+ const [checked, setChecked] = useState(false);
+ const [loading, setLoading] = useState(false);
+ const [error, setError] = useState
(null);
+
+ const handleToggle = async (e: React.ChangeEvent) => {
+ const newValue = e.target.checked;
+ setLoading(true);
+ setError(null);
+
+ try {
+ await new Promise((resolve, reject) => {
+ setTimeout(() => {
+ if (Math.random() < 0.3) {
+ reject(new Error('์ค์ ์ ์ฅ์ ์คํจํ์ต๋๋ค.'));
+ } else {
+ resolve(undefined);
+ }
+ }, 1000);
+ });
+
+ setChecked(newValue);
+ } catch (err) {
+ setError(err instanceof Error ? err.message : '์ ์ ์๋ ์ค๋ฅ');
+ } finally {
+ setLoading(false);
+ }
+ };
+
+ return (
+
+
+
+ {loading &&
โณ ์ค์ ์ ์ ์ฅํ๊ณ ์์ต๋๋ค...
}
+
+ {error && (
+
+ โ {error}
+
+ )}
+
+ {!loading && !error && (
+
+ ํ์ฌ ์ํ: {checked ? 'ON' : 'OFF'}
+
+ )}
+
+ );
+ },
+ parameters: {
+ docs: {
+ description: {
+ story: '์๋ฒ์ ๋๊ธฐํ๋๋ ๋น๋๊ธฐ ํ ๊ธ์ ์์ ์
๋๋ค. ๋ก๋ฉ ์ํ์ ์๋ฌ ์ฒ๋ฆฌ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค.',
+ },
+ },
+ },
};
diff --git a/packages/switch/src/Switch.test.tsx b/packages/switch/src/Switch.test.tsx
index d9e93dfe..a2037259 100644
--- a/packages/switch/src/Switch.test.tsx
+++ b/packages/switch/src/Switch.test.tsx
@@ -5,51 +5,252 @@ import userEvent from '@testing-library/user-event';
import { createRef } from 'react';
import { describe, expect, test, vi } from 'vitest';
import { Switch } from './Switch';
+import { SWITCH_SIZES, SwitchSize } from './constants/size';
describe('Switch ์ปดํฌ๋ํธ', () => {
- test('checked์ defaultChecked๋ฅผ ์ฃผ์
ํ์ง ์์ผ๋ฉด ์ค์์น๊ฐ ๊บผ์ง ์ํ๋ก ๋ ๋๋ง๋๋ค', () => {
- render( );
- const input = screen.getByRole('switch') as HTMLInputElement;
- expect(input.checked).toBe(false);
+ describe('๊ธฐ๋ณธ ๋ ๋๋ง', () => {
+ test('switch role์ ๊ฐ์ง input์ด ๋ ๋๋ง๋๋ค', () => {
+ render( );
+ const switchElement = screen.getByRole('switch');
+ expect(switchElement).toBeInTheDocument();
+ expect(switchElement).toHaveAttribute('type', 'checkbox');
+ });
+
+ test('๊ธฐ๋ณธ์ ์ผ๋ก ์ฒดํฌ๋์ง ์์ ์ํ๋ก ๋ ๋๋ง๋๋ค', () => {
+ render( );
+ const switchElement = screen.getByRole('switch') as HTMLInputElement;
+ expect(switchElement.checked).toBe(false);
+ expect(switchElement).toHaveAttribute('aria-checked', 'false');
+ });
+
+ test('defaultChecked๊ฐ true์ผ ๋ ์ฒดํฌ๋ ์ํ๋ก ๋ ๋๋ง๋๋ค', () => {
+ render( );
+ const switchElement = screen.getByRole('switch') as HTMLInputElement;
+ expect(switchElement.checked).toBe(true);
+ expect(switchElement).toHaveAttribute('aria-checked', 'true');
+ });
+
+ test('disabled ์ํ์ผ ๋ ๋นํ์ฑํ๋๋ค', () => {
+ render( );
+ const switchElement = screen.getByRole('switch');
+ expect(switchElement).toBeDisabled();
+ });
+ });
+
+ describe('์ ์ด ์ปดํฌ๋ํธ', () => {
+ test('checked prop์ผ๋ก ์ํ๋ฅผ ์ ์ดํ ์ ์๋ค', () => {
+ const { rerender } = render( );
+ const switchElement = screen.getByRole('switch') as HTMLInputElement;
+ expect(switchElement.checked).toBe(false);
+
+ rerender( );
+ expect(switchElement.checked).toBe(true);
+ });
+
+ test('checked๊ฐ ์ฐ์ ์์๋ฅผ ๊ฐ์ง๋ค (defaultChecked ๋ฌด์)', () => {
+ render( );
+ const switchElement = screen.getByRole('switch') as HTMLInputElement;
+ expect(switchElement.checked).toBe(false);
+ });
+ });
+
+ describe('์ฌ์ฉ์ ์ํธ์์ฉ', () => {
+ test('ํด๋ฆญ ์ ์ํ๊ฐ ํ ๊ธ๋๋ค', async () => {
+ const user = userEvent.setup();
+ render( );
+ const switchElement = screen.getByRole('switch') as HTMLInputElement;
+
+ expect(switchElement.checked).toBe(false);
+
+ await user.click(switchElement);
+ expect(switchElement.checked).toBe(true);
+
+ await user.click(switchElement);
+ expect(switchElement.checked).toBe(false);
+ });
+
+ test('Space ํค๋ก ํ ๊ธํ ์ ์๋ค', async () => {
+ const user = userEvent.setup();
+ render( );
+ const switchElement = screen.getByRole('switch') as HTMLInputElement;
+
+ switchElement.focus();
+ expect(switchElement.checked).toBe(false);
+
+ await user.keyboard(' ');
+ expect(switchElement.checked).toBe(true);
+
+ await user.keyboard(' ');
+ expect(switchElement.checked).toBe(false);
+ });
+
+ test('Enter ํค๋ก ํ ๊ธํ ์ ์๋ค', async () => {
+ const user = userEvent.setup();
+ render( );
+ const switchElement = screen.getByRole('switch') as HTMLInputElement;
+
+ switchElement.focus();
+ expect(switchElement.checked).toBe(false);
+
+ await user.keyboard('{Enter}');
+ expect(switchElement.checked).toBe(true);
+ });
+
+ test('disabled ์ํ์์๋ ์ํธ์์ฉ์ด ๋ถ๊ฐ๋ฅํ๋ค', async () => {
+ const user = userEvent.setup();
+ const handleChange = vi.fn();
+ render( );
+ const switchElement = screen.getByRole('switch');
+
+ await user.click(switchElement);
+ expect(handleChange).not.toHaveBeenCalled();
+ });
+
+ test('label์ ํด๋ฆญํด๋ ํ ๊ธ๋๋ค', async () => {
+ const user = userEvent.setup();
+ render( );
+ const label = screen.getByText('์๋ฆผ ์ค์ ');
+ const switchElement = screen.getByRole('switch') as HTMLInputElement;
+
+ expect(switchElement.checked).toBe(false);
+
+ await user.click(label);
+ expect(switchElement.checked).toBe(true);
+ });
});
- test('defaultChecked๋ฅผ ์ฃผ์
ํ๋ฉด ์ค์์น๊ฐ ์ผ์ง ์ํ๋ก ๋ ๋๋ง๋๋ค', () => {
- render( );
- const input = screen.getByRole('switch') as HTMLInputElement;
- expect(input.checked).toBe(true);
+ describe('์ด๋ฒคํธ ํธ๋ค๋ฌ', () => {
+ test('onChange ์ด๋ฒคํธ๊ฐ ํธ์ถ๋๋ค', async () => {
+ const user = userEvent.setup();
+ const handleChange = vi.fn();
+ render( );
+ const switchElement = screen.getByRole('switch');
+
+ await user.click(switchElement);
+
+ expect(handleChange).toHaveBeenCalledTimes(1);
+ expect(handleChange).toHaveBeenCalledWith(
+ expect.objectContaining({
+ target: expect.objectContaining({
+ checked: true,
+ }),
+ }),
+ );
+ });
+
+ test('์ ์ด ์ปดํฌ๋ํธ์์ onChange๊ฐ ํธ์ถ๋๋ค', async () => {
+ const user = userEvent.setup();
+ const handleChange = vi.fn();
+ render( );
+ const switchElement = screen.getByRole('switch');
+
+ await user.click(switchElement);
+
+ expect(handleChange).toHaveBeenCalledTimes(1);
+ });
});
- test('checked๋ฅผ ์ฃผ์
ํ๋ฉด ์ค์์น๊ฐ ์ผ์ง๋ค', () => {
- render( );
- const input = screen.getByRole('switch') as HTMLInputElement;
- expect(input.checked).toBe(true);
+ describe('ํฌ๊ธฐ variants', () => {
+ test.each(Object.values(SwitchSize))('size %s๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉ๋๋ค', (size) => {
+ const { container } = render( );
+ const trackElement = container.querySelector('[data-checked]');
+
+ expect(trackElement).toHaveStyle({
+ width: `${SWITCH_SIZES[size].width}px`,
+ height: `${SWITCH_SIZES[size].height}px`,
+ });
+ });
+
+ test('๊ธฐ๋ณธ ํฌ๊ธฐ๋ md์ด๋ค', () => {
+ const { container } = render( );
+ const trackElement = container.querySelector('[data-checked]');
+
+ expect(trackElement).toHaveStyle({
+ width: `${SWITCH_SIZES.md.width}px`,
+ height: `${SWITCH_SIZES.md.height}px`,
+ });
+ });
});
- test('defaultChecked๋ฅผ ์ฃผ์
ํ๋๋ผ๋ checked๋ฅผ false๋ก ์ฃผ์
ํ๋ฉด ์ค์์น๊ฐ ๊บผ์ง๋ค', () => {
- render( );
- const input = screen.getByRole('switch') as HTMLInputElement;
- expect(input.checked).toBe(false);
+ describe('์ ๊ทผ์ฑ', () => {
+ test('aria-label์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉ๋๋ค', () => {
+ const ariaLabel = '๋คํฌ ๋ชจ๋ ํ ๊ธ';
+ render( );
+ const switchElement = screen.getByRole('switch');
+ expect(switchElement).toHaveAttribute('aria-label', ariaLabel);
+ });
+
+ test('aria-labelledby๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ ์ฉ๋๋ค', () => {
+ const labelId = 'switch-label';
+ render(
+
+ ์ค์
+
+
,
+ );
+ const switchElement = screen.getByRole('switch');
+ expect(switchElement).toHaveAttribute('aria-labelledby', labelId);
+ });
+
+ test('label prop์ผ๋ก ์ ๊ทผ์ฑ ๋ผ๋ฒจ์ด ์ค์ ๋๋ค', () => {
+ const labelText = '์๋ ์ ์ฅ';
+ render( );
+ const switchElement = screen.getByRole('switch');
+ expect(switchElement).toHaveAttribute('aria-label', labelText);
+ });
+
+ test('ํฌ์ปค์ค ์ outline์ด ํ์๋๋ค', async () => {
+ const user = userEvent.setup();
+ render( );
+ const switchElement = screen.getByRole('switch');
+
+ await user.tab();
+ expect(switchElement).toHaveFocus();
+ });
});
- test('disabled ์ํ์์๋ ํด๋ฆญ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ง ์๋๋ค', () => {
- const handleChange = vi.fn();
- render( );
+ describe('์คํ์ผ๋ง', () => {
+ test('์ปค์คํ
className์ด ์ ์ฉ๋๋ค', () => {
+ const customClass = faker.word.noun();
+ const { container } = render( );
+ const wrapperElement = container.firstChild;
+ expect(wrapperElement).toHaveClass(customClass);
+ });
- const input = screen.getByRole('switch') as HTMLInputElement;
- userEvent.click(input);
+ test('์ปค์คํ
style์ด ์ ์ฉ๋๋ค', () => {
+ const customStyle = { marginTop: '20px' };
+ const { container } = render( );
+ const wrapperElement = container.firstChild as HTMLElement;
+ expect(wrapperElement).toHaveStyle(customStyle);
+ });
- expect(handleChange).not.toHaveBeenCalled();
+ test('data attributes๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ค์ ๋๋ค', () => {
+ const { container } = render( );
+ const wrapperElement = container.firstChild;
+ const trackElement = container.querySelector('[data-checked]');
+
+ expect(wrapperElement).toHaveAttribute('data-disabled', 'true');
+ expect(trackElement).toHaveAttribute('data-checked', 'true');
+ expect(trackElement).toHaveAttribute('data-disabled', 'true');
+ });
});
- test('ref๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฌ๋๋ค', () => {
- const ref = createRef();
- render( );
- expect(ref.current).toBeInstanceOf(HTMLInputElement);
+ describe('Ref forwarding', () => {
+ test('ref๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฌ๋๋ค', () => {
+ const ref = createRef();
+ render( );
+ expect(ref.current).toBeInstanceOf(HTMLInputElement);
+ });
});
- test('className์ ์ฃผ์
ํ๋ฉด ์ถ๊ฐ๋ก ์ ๋ฌํ๋ค.', () => {
- const customClassName = faker.word.noun();
- render( );
- expect(screen.getByRole('switch')).toHaveClass(customClassName);
+ describe('์ถ๊ฐ props', () => {
+ test('HTML input ์์ฑ๋ค์ด ์ฌ๋ฐ๋ฅด๊ฒ ์ ๋ฌ๋๋ค', () => {
+ render( );
+ const switchElement = screen.getByRole('switch');
+
+ expect(switchElement).toHaveAttribute('name', 'notifications');
+ expect(switchElement).toHaveAttribute('value', 'enabled');
+ expect(switchElement).toHaveAttribute('id', 'notification-switch');
+ });
});
});
diff --git a/packages/switch/src/Switch.tsx b/packages/switch/src/Switch.tsx
index f314f462..b3cb8241 100644
--- a/packages/switch/src/Switch.tsx
+++ b/packages/switch/src/Switch.tsx
@@ -1,75 +1,111 @@
-import { color } from '@sipe-team/tokens';
-import { clsx as cx } from 'clsx';
-import {
- type CSSProperties,
- type ComponentProps,
- type ForwardedRef,
- forwardRef,
-} from 'react';
-import styles from './Switch.module.css';
-import { type SwitchSize, switchHeight, switchWidth } from './constants/size';
-import useCheckedController from './hooks/useCheckedController';
+import { type ComponentProps, type CSSProperties, type ForwardedRef, forwardRef, useMemo } from 'react';
+
+import { useControllableState } from '@radix-ui/react-use-controllable-state';
+
+import clsx from 'clsx';
+
+import { SWITCH_SIZES, SwitchSize } from './constants/size';
+import * as styles from './Switch.css';
+
+export type { SwitchSize } from './constants/size';
export interface SwitchProps extends Omit, 'size'> {
+ size?: SwitchSize;
defaultChecked?: boolean;
checked?: boolean;
disabled?: boolean;
- size?: SwitchSize;
onChange?: React.ChangeEventHandler;
+ onKeyDown?: React.KeyboardEventHandler;
+ label?: string;
+ 'aria-label'?: string;
+ 'aria-labelledby'?: string;
}
export const Switch = forwardRef(function Switch(
{
className,
+ size = SwitchSize.md,
defaultChecked,
- checked,
- disabled,
+ checked: checkedProp,
+ disabled = false,
onChange,
- size = 'md',
+ onKeyDown,
+ label,
+ 'aria-label': ariaLabel,
+ 'aria-labelledby': ariaLabelledby,
+ style,
...props
}: SwitchProps,
ref: ForwardedRef,
) {
- const { checked: overrideChecked, onChange: overrideOnChange } =
- useCheckedController({
- defaultChecked,
- checked,
- onChange,
- });
-
- const style = {
- '--switch-width': `${switchWidth[size]}px`,
- '--switch-height': `${switchHeight[size]}px`,
- '--switch-diff': `${switchWidth[size] - switchHeight[size]}px`,
- '--switch-border-radius': '100px',
- '--switch-thumb-color': `${color.white}`,
- '--switch-background-color': `${color.gray300}`,
- '--switch-checked-background-color': `${color.blue500}`,
- '--switch-shadow': `0px 2px 4px color-mix(in srgb, ${color.gray900} 10%, transparent), 0px 0px 1px color-mix(in srgb, ${color.gray900} 30%, transparent)`,
- } as CSSProperties;
-
- const state = overrideChecked ? 'checked' : 'unchecked';
+ const [checked = false, setChecked] = useControllableState({
+ prop: checkedProp,
+ defaultProp: defaultChecked,
+ });
+
+ const accessibilityProps = useMemo(() => {
+ if (ariaLabel) {
+ return { 'aria-label': ariaLabel };
+ }
+ if (ariaLabelledby) {
+ return { 'aria-labelledby': ariaLabelledby };
+ }
+ if (label) {
+ return { 'aria-label': label };
+ }
+ return {};
+ }, [ariaLabel, ariaLabelledby, label]);
+
+ const cssVariables = useMemo(() => {
+ const sizeConfig = SWITCH_SIZES[size];
+ const translateDistance = sizeConfig.width - sizeConfig.thumbSize;
+
+ return {
+ '--switch-translate-distance': `${translateDistance}px`,
+ } as CSSProperties;
+ }, [size]);
+
+ const combinedStyle = {
+ ...cssVariables,
+ ...style,
+ };
+
+ const handleKeyDown = (e: React.KeyboardEvent) => {
+ if (e.key === 'Enter' && !disabled) {
+ e.preventDefault();
+ setChecked((prev) => !prev);
+ }
+ onKeyDown?.(e);
+ };
+
+ const handleChange = (e: React.ChangeEvent) => {
+ setChecked(e.target.checked);
+ onChange?.(e);
+ };
return (
-
+
-
-
+
+
+
+
+ {label && {label} }
);
});
+
+Switch.displayName = 'Switch';
diff --git a/packages/switch/src/constants/size.ts b/packages/switch/src/constants/size.ts
index a6ff4ec2..9584ef5c 100644
--- a/packages/switch/src/constants/size.ts
+++ b/packages/switch/src/constants/size.ts
@@ -1,13 +1,28 @@
-export type SwitchSize = 'sm' | 'md' | 'lg';
-
-export const switchWidth = {
- sm: 32,
- md: 40,
- lg: 48,
+export const SwitchSize = {
+ sm: 'sm',
+ md: 'md',
+ lg: 'lg',
} as const;
-export const switchHeight = {
- sm: 16,
- md: 20,
- lg: 24,
+export type SwitchSize = (typeof SwitchSize)[keyof typeof SwitchSize];
+
+export const SWITCH_SIZES = {
+ [SwitchSize.sm]: {
+ width: 32,
+ height: 16,
+ thumbSize: 16,
+ gap: 2,
+ },
+ [SwitchSize.md]: {
+ width: 40,
+ height: 20,
+ thumbSize: 20,
+ gap: 4,
+ },
+ [SwitchSize.lg]: {
+ width: 48,
+ height: 24,
+ thumbSize: 24,
+ gap: 4,
+ },
} as const;
diff --git a/packages/switch/src/hooks/useCheckedController.tsx b/packages/switch/src/hooks/useCheckedController.tsx
deleted file mode 100644
index 7dd0c28a..00000000
--- a/packages/switch/src/hooks/useCheckedController.tsx
+++ /dev/null
@@ -1,37 +0,0 @@
-import { useState } from 'react';
-
-type UseCheckedControllerProps = {
- defaultChecked: boolean | undefined;
- checked: boolean | undefined;
- onChange: React.ChangeEventHandler | undefined;
-};
-
-function useCheckedController({
- defaultChecked,
- checked,
- onChange,
-}: UseCheckedControllerProps) {
- const [internalChecked, setInternalChecked] = useState(
- defaultChecked ?? !!defaultChecked,
- );
-
- const isControlled = checked !== undefined;
- const isChecked = isControlled ? checked : internalChecked;
-
- const overrideOnChange: React.ChangeEventHandler = (
- event,
- ) => {
- if (!isControlled) {
- setInternalChecked(event.target.checked);
- }
-
- onChange?.(event);
- };
-
- return {
- checked: isChecked,
- onChange: overrideOnChange,
- };
-}
-
-export default useCheckedController;
diff --git a/packages/theme/.storybook/main.ts b/packages/theme/.storybook/main.ts
new file mode 100644
index 00000000..e8b17c98
--- /dev/null
+++ b/packages/theme/.storybook/main.ts
@@ -0,0 +1,10 @@
+import type { StorybookConfig } from '@storybook/react-vite';
+
+export default {
+ stories: ['../src/**/*.mdx', '../src/**/*.stories.@(js|jsx|mjs|ts|tsx)'],
+ addons: ['@storybook/addon-essentials'],
+ framework: {
+ name: '@storybook/react-vite',
+ options: {},
+ },
+} satisfies StorybookConfig;
diff --git a/packages/reset/.storybook/preview.ts b/packages/theme/.storybook/preview.ts
similarity index 100%
rename from packages/reset/.storybook/preview.ts
rename to packages/theme/.storybook/preview.ts
diff --git a/packages/theme/README.md b/packages/theme/README.md
new file mode 100644
index 00000000..46c350ac
--- /dev/null
+++ b/packages/theme/README.md
@@ -0,0 +1,118 @@
+# @sipe-team/theme
+
+A type-safe theme system built with vanilla-extract for runtime theme switching in the SIPE Design System.
+
+## Features
+
+- ๐ Light and dark mode support
+- ๐จ CSS variables for colors, typography, spacing, and more design tokens
+- ๐งฉ ThemeProvider component with React Context for theme management
+- ๐ Simple theme toggling and control API
+- ๐ Type-safe styling with vanilla-extract
+
+## Installation
+
+```bash
+npm install @sipe-team/theme
+# or
+yarn add @sipe-team/theme
+# or
+pnpm add @sipe-team/theme
+```
+
+## Usage
+
+### Basic Setup
+
+Wrap your application with the ThemeProvider component:
+
+```tsx
+import { ThemeProvider } from '@sipe-team/theme';
+
+function App() {
+ return (
+
+
+
+ );
+}
+```
+
+### Using Theme Variables in Styled Components
+
+Use the theme contract in your vanilla-extract styles:
+
+```tsx
+import { style } from '@vanilla-extract/css';
+import { vars } from '@sipe-team/theme';
+
+export const button = style({
+ backgroundColor: vars.color.primary,
+ color: vars.color.text,
+ border: `1px solid ${vars.color.border}`,
+ padding: `${vars.spacing.sm} ${vars.spacing.md}`,
+ borderRadius: vars.radius.md,
+ fontFamily: vars.typography.fontFamily,
+ fontSize: vars.typography.fontSize.medium,
+ fontWeight: vars.typography.fontWeight.medium,
+ cursor: 'pointer',
+ boxShadow: vars.shadows.sm,
+ ':hover': {
+ opacity: vars.opacity[90],
+ },
+ ':focus': {
+ outline: `2px solid ${vars.color.primary}`,
+ },
+});
+```
+
+### Accessing Theme in Components
+
+Use the useTheme hook to access and control the theme:
+
+```tsx
+import { useTheme } from '@sipe-team/theme';
+
+function ThemeSwitcher() {
+ const { mode, setMode, toggleMode } = useTheme();
+
+ return (
+
+
Current theme: {mode}
+
+ Toggle to {mode === 'light' ? 'Dark' : 'Light'} Mode
+
+
+ );
+}
+```
+
+## Responsive Styles Utility
+
+The theme package also includes a utility for creating responsive styles:
+
+```tsx
+import { style } from '@vanilla-extract/css';
+import { responsiveStyle } from '@sipe-team/theme';
+
+export const container = style({
+ ...responsiveStyle({
+ mobile: {
+ padding: '16px',
+ fontSize: '14px',
+ },
+ tablet: {
+ padding: '24px',
+ fontSize: '16px',
+ },
+ desktop: {
+ padding: '32px',
+ fontSize: '18px',
+ },
+ }),
+});
+```
+
+## Extending the Theme
+
+You can extend or modify the theme by creating your own theme contract and layers based on this package.
\ No newline at end of file
diff --git a/packages/theme/package.json b/packages/theme/package.json
new file mode 100644
index 00000000..119e9ca0
--- /dev/null
+++ b/packages/theme/package.json
@@ -0,0 +1,62 @@
+{
+ "name": "@sipe-team/theme",
+ "version": "0.0.1",
+ "license": "MIT",
+ "description": "Sipe Design System Theme Provider",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/sipe-team/side"
+ },
+ "type": "module",
+ "exports": {
+ ".": "./src/index.ts"
+ },
+ "files": ["dist"],
+ "scripts": {
+ "build": "tsup",
+ "build:storybook": "storybook build",
+ "clean": "rm -rf node_modules dist",
+ "dev:storybook": "storybook dev -p 6006",
+ "lint": "pnpm exec biome lint",
+ "test": "vitest",
+ "test:ui": "vitest --ui",
+ "typecheck": "tsc",
+ "prepack": "pnpm run build"
+ },
+ "devDependencies": {
+ "@vanilla-extract/css": "^1.14.1",
+ "@storybook/addon-essentials": "catalog:",
+ "@storybook/react": "catalog:",
+ "@storybook/react-vite": "catalog:",
+ "@testing-library/jest-dom": "catalog:",
+ "@testing-library/react": "catalog:",
+ "@types/react": "^18.3.12",
+ "react": "^18.3.1",
+ "react-dom": "^18.3.1",
+ "storybook": "catalog:",
+ "tsup": "catalog:",
+ "typescript": "catalog:",
+ "vitest": "catalog:"
+ },
+ "dependencies": {
+ "@vanilla-extract/dynamic": "^2.1.2",
+ "@sipe-team/tokens": "workspace:*"
+ },
+ "publishConfig": {
+ "access": "public",
+ "registry": "https://npm.pkg.github.com",
+ "exports": {
+ ".": {
+ "import": {
+ "types": "./dist/index.d.ts",
+ "default": "./dist/index.js"
+ },
+ "require": {
+ "types": "./dist/index.d.cts",
+ "default": "./dist/index.cjs"
+ }
+ }
+ }
+ },
+ "sideEffects": false
+}
diff --git a/packages/theme/src/ThemeProvider.stories.tsx b/packages/theme/src/ThemeProvider.stories.tsx
new file mode 100644
index 00000000..3a8f9057
--- /dev/null
+++ b/packages/theme/src/ThemeProvider.stories.tsx
@@ -0,0 +1,461 @@
+import { type ThemeColor, themeColor } from '@sipe-team/tokens';
+
+import type { Meta, StoryObj } from '@storybook/react';
+
+import { ThemeProvider, useTheme } from './ThemeProvider';
+
+const meta = {
+ title: 'Components/ThemeProvider',
+ component: ThemeProvider,
+ parameters: {
+ layout: 'centered',
+ },
+ argTypes: {
+ theme: {
+ control: { type: 'select' },
+ options: ['1st', '2nd', '3rd', '4th'],
+ description: 'Select theme variant',
+ mapping: {
+ '1st': themeColor['1st'],
+ '2nd': themeColor['2nd'],
+ '3rd': themeColor['3rd'],
+ '4th': themeColor['4th'],
+ },
+ },
+ },
+ decorators: [
+ (Story) => (
+
+
+
+ ),
+ ],
+} satisfies Meta;
+
+export default meta;
+type Story = StoryObj;
+
+const ThemeDisplay = () => {
+ const { theme: currentTheme } = useTheme();
+
+ return (
+
+
+
Current Theme: {currentTheme.primary}
+
+
+
Theme Preview
+
+
+ This is regular text using the theme's text color and medium font size.
+
+
+ This is primary-colored text with large font size and bold weight.
+
+
+ This is a primary background container
+
+
+ This is a secondary background container
+
+
+ This is a gradient background container
+
+
+
+
+
+ );
+};
+
+export const Default: Story = {
+ args: {
+ theme: themeColor['4th'],
+ children: ,
+ },
+ render: (args) => {
+ return (
+
+
+
+ );
+ },
+};
+
+const NestedThemeExample = () => {
+ return (
+
+
Nested Theme Override Example
+
+ {/* Parent Theme Container */}
+
+
+
Parent Component (Theme 1st)
+
This is the parent component using the 1st theme.
+
+
+ Parent theme primary color container
+
+
+ {/* Nested Child Theme Container */}
+
+
+
+ Child Component (Theme 3rd - Overridden)
+
+
+ This child component overrides the parent theme with the 3rd theme.
+
+
+
+ Child theme secondary color container
+
+
+ {/* Deeply Nested Component */}
+
+
+
+ Grandchild Component (Theme 4th)
+
+
+ This deeply nested component uses the 4th theme.
+
+
+
+ Grandchild primary container
+
+
+
+
+
+
+
+
+ );
+};
+
+export const NestedThemeOverride: Story = {
+ args: {
+ theme: themeColor['4th'],
+ children: ,
+ },
+ render: () => ,
+ parameters: {
+ docs: {
+ description: {
+ story:
+ 'This example demonstrates how themes can be overridden in nested components. Each ThemeProvider creates a new theme context that overrides its parent.',
+ },
+ },
+ },
+};
+
+const CustomThemeExample = () => {
+ // Custom theme object
+ const customTheme: ThemeColor = {
+ primary: '#ff6b6b',
+ secondary: '#4ecdc4',
+ background: '#f8f9fa',
+ text: '#343a40',
+ gradient: 'linear-gradient(135deg, #ff6b6b 0%, #4ecdc4 100%)',
+ };
+
+ return (
+
+
Custom Theme Injection Example
+
+ {/* Custom Theme Container */}
+
+
+
Custom Theme Component
+
+ This component uses a completely custom theme with custom colors:
+
+
+
+
+ Primary: #ff6b6b
+
+
+ Secondary: #4ecdc4
+
+
+
+
+ Custom Gradient Background
+
+
+ {/* Nested with predefined theme */}
+
+
+
+ Nested Predefined Theme (2nd)
+
+
+ This shows how you can nest predefined themes within custom themes.
+
+
+
+ Predefined theme container
+
+
+
+
+
+
+ {/* Multiple Custom Themes Side by Side */}
+
+
+
+
Purple Theme
+
+ Custom Purple
+
+
+
+
+
+
+
Green Theme
+
+ Custom Green
+
+
+
+
+
+ );
+};
+
+export const CustomThemeInjection: Story = {
+ args: {
+ theme: themeColor['4th'],
+ children: ,
+ },
+ render: () => ,
+ parameters: {
+ docs: {
+ description: {
+ story:
+ 'This example demonstrates how to inject completely custom theme objects. You can create custom themes with any color values and use them alongside predefined themes.',
+ },
+ },
+ },
+};
diff --git a/packages/theme/src/ThemeProvider.test.tsx b/packages/theme/src/ThemeProvider.test.tsx
new file mode 100644
index 00000000..a67cbdac
--- /dev/null
+++ b/packages/theme/src/ThemeProvider.test.tsx
@@ -0,0 +1,215 @@
+import { type ThemeColor, themeColor } from '@sipe-team/tokens';
+
+import { act, render, screen } from '@testing-library/react';
+import { describe, expect, it, test } from 'vitest';
+
+import { ThemeProvider, useTheme } from './ThemeProvider';
+
+const TestComponent = () => {
+ const { theme, setTheme } = useTheme();
+
+ return (
+
+ {theme.primary}
+ setTheme(themeColor['1st'])}>
+ Set 1st Theme
+
+ setTheme(themeColor['2nd'])}>
+ Set 2nd Theme
+
+ setTheme(themeColor['3rd'])}>
+ Set 3rd Theme
+
+ setTheme(themeColor['4th'])}>
+ Set 4th Theme
+
+
+ );
+};
+
+const ComponentWithoutProvider = () => {
+ const { theme } = useTheme();
+ return {theme.primary}
;
+};
+
+describe('ThemeProvider', () => {
+ test('sets 4th generation theme as default', () => {
+ render(
+
+
+ ,
+ );
+
+ expect(screen.getByTestId('current-theme')).toHaveTextContent(themeColor['4th'].primary);
+ });
+
+ test('sets the theme to the provided initial theme prop', () => {
+ render(
+
+
+ ,
+ );
+
+ expect(screen.getByTestId('current-theme')).toHaveTextContent(themeColor['2nd'].primary);
+ });
+
+ test('accepts custom theme color objects', () => {
+ const customTheme: ThemeColor = {
+ primary: '#ff0000',
+ secondary: '#00ff00',
+ background: '#0000ff',
+ text: '#ffffff',
+ gradient: 'linear-gradient(45deg, #ff0000 0%, #00ff00 100%)',
+ };
+
+ render(
+
+
+ ,
+ );
+
+ expect(screen.getByTestId('current-theme')).toHaveTextContent(customTheme.primary);
+ });
+
+ test('container div has display: contents style', () => {
+ const { container } = render(
+
+
+ ,
+ );
+
+ const themeContainer = container.firstChild as HTMLElement;
+ expect(themeContainer).toHaveStyle({ display: 'contents' });
+ });
+
+ test('can change theme through setTheme', async () => {
+ render(
+
+
+ ,
+ );
+
+ const currentTheme = screen.getByTestId('current-theme');
+ const set2ndButton = screen.getByTestId('set-2nd');
+
+ expect(currentTheme).toHaveTextContent(themeColor['4th'].primary);
+
+ await act(async () => {
+ set2ndButton.click();
+ });
+
+ expect(currentTheme).toHaveTextContent(themeColor['2nd'].primary);
+ });
+
+ test('theme updates when initial theme changes', () => {
+ const { rerender } = render(
+
+
+ ,
+ );
+
+ expect(screen.getByTestId('current-theme')).toHaveTextContent(themeColor['1st'].primary);
+
+ rerender(
+
+
+ ,
+ );
+
+ expect(screen.getByTestId('current-theme')).toHaveTextContent(themeColor['3rd'].primary);
+ });
+
+ describe('all theme types are set correctly', () => {
+ const themes = [
+ { name: '1st', theme: themeColor['1st'] },
+ { name: '2nd', theme: themeColor['2nd'] },
+ { name: '3rd', theme: themeColor['3rd'] },
+ { name: '4th', theme: themeColor['4th'] },
+ ];
+
+ it.each(themes)('theme "$name" is set correctly', ({ theme }) => {
+ render(
+
+
+ ,
+ );
+
+ const currentTheme = screen.getByTestId('current-theme');
+ expect(currentTheme).toHaveTextContent(theme.primary);
+ });
+ });
+
+ describe('theme change functionality tests', () => {
+ const themeChangeTests = [
+ { from: themeColor['4th'], to: themeColor['1st'], buttonTestId: 'set-1st' },
+ { from: themeColor['1st'], to: themeColor['2nd'], buttonTestId: 'set-2nd' },
+ { from: themeColor['2nd'], to: themeColor['3rd'], buttonTestId: 'set-3rd' },
+ { from: themeColor['3rd'], to: themeColor['4th'], buttonTestId: 'set-4th' },
+ ];
+
+ it.each(themeChangeTests)(
+ 'can change theme from $from.primary to $to.primary',
+ async ({ from, to, buttonTestId }) => {
+ render(
+
+
+ ,
+ );
+
+ const currentTheme = screen.getByTestId('current-theme');
+ const changeButton = screen.getByTestId(buttonTestId);
+
+ // Check initial state
+ expect(currentTheme).toHaveTextContent(from.primary);
+
+ // Change theme
+ await act(async () => {
+ changeButton.click();
+ });
+
+ // Check changed state
+ expect(currentTheme).toHaveTextContent(to.primary);
+ },
+ );
+ });
+
+ test('children are rendered correctly', () => {
+ render(
+
+ Test Content
+ ,
+ );
+
+ expect(screen.getByTestId('child-content')).toBeInTheDocument();
+ expect(screen.getByTestId('child-content')).toHaveTextContent('Test Content');
+ });
+});
+
+describe('useTheme hook', () => {
+ test('throws an error when used outside of ThemeProvider', () => {
+ // Mock console.error to hide console errors
+ const originalError = console.error;
+ console.error = () => {};
+
+ expect(() => {
+ render( );
+ }).toThrow('useTheme must be used within a ThemeProvider');
+
+ // Restore console.error
+ console.error = originalError;
+ });
+
+ test('returns correct context values when used inside ThemeProvider', () => {
+ render(
+
+
+ ,
+ );
+
+ expect(screen.getByTestId('current-theme')).toHaveTextContent(themeColor['2nd'].primary);
+ expect(screen.getByTestId('set-1st')).toBeInTheDocument();
+ expect(screen.getByTestId('set-2nd')).toBeInTheDocument();
+ expect(screen.getByTestId('set-3rd')).toBeInTheDocument();
+ expect(screen.getByTestId('set-4th')).toBeInTheDocument();
+ });
+});
diff --git a/packages/theme/src/ThemeProvider.tsx b/packages/theme/src/ThemeProvider.tsx
new file mode 100644
index 00000000..128dc3a2
--- /dev/null
+++ b/packages/theme/src/ThemeProvider.tsx
@@ -0,0 +1,52 @@
+import type React from 'react';
+import { createContext, useContext, useEffect, useMemo, useState } from 'react';
+
+import { type ThemeColor, themeColor, vars } from '@sipe-team/tokens';
+
+import { assignInlineVars } from '@vanilla-extract/dynamic';
+
+interface ThemeContextType {
+ theme: ThemeColor;
+ setTheme: (theme: ThemeColor) => void;
+}
+
+const ThemeContext = createContext(undefined);
+
+export const useTheme = (): ThemeContextType => {
+ const context = useContext(ThemeContext);
+ if (!context) {
+ throw new Error('useTheme must be used within a ThemeProvider');
+ }
+ return context;
+};
+
+interface ThemeProviderProps {
+ children: React.ReactNode;
+ theme?: ThemeColor;
+}
+
+export const ThemeProvider: React.FC = ({ children, theme: initialTheme = themeColor['4th'] }) => {
+ const [theme, setTheme] = useState(initialTheme);
+
+ useEffect(() => {
+ setTheme(initialTheme);
+ }, [initialTheme]);
+
+ const contextValue = useMemo(
+ () => ({
+ theme,
+ setTheme,
+ }),
+ [theme],
+ );
+
+ const themeVars = assignInlineVars(vars.color, theme);
+
+ return (
+
+ {children}
+
+ );
+};
+
+export const theme = vars;
diff --git a/packages/theme/src/index.ts b/packages/theme/src/index.ts
new file mode 100644
index 00000000..ca016d42
--- /dev/null
+++ b/packages/theme/src/index.ts
@@ -0,0 +1,3 @@
+export { themeLayer, vars } from '@sipe-team/tokens';
+
+export { ThemeProvider, theme, useTheme } from './ThemeProvider';
diff --git a/packages/theme/tsconfig.json b/packages/theme/tsconfig.json
new file mode 100644
index 00000000..f264cd9a
--- /dev/null
+++ b/packages/theme/tsconfig.json
@@ -0,0 +1,4 @@
+{
+ "extends": "../../tsconfig.json",
+ "exclude": ["dist", "node_modules"]
+}
diff --git a/packages/theme/tsup.config.ts b/packages/theme/tsup.config.ts
new file mode 100644
index 00000000..c533199b
--- /dev/null
+++ b/packages/theme/tsup.config.ts
@@ -0,0 +1,8 @@
+import { defineConfig } from 'tsup';
+
+export default defineConfig({
+ entry: ['src/index.ts'],
+ clean: true,
+ dts: true,
+ format: ['esm', 'cjs'],
+});
diff --git a/packages/theme/vitest.config.ts b/packages/theme/vitest.config.ts
new file mode 100644
index 00000000..e663baf0
--- /dev/null
+++ b/packages/theme/vitest.config.ts
@@ -0,0 +1,12 @@
+import { defineProject, mergeConfig } from 'vitest/config';
+
+import defaultConfig from '../../vitest.config';
+
+export default mergeConfig(
+ defaultConfig,
+ defineProject({
+ test: {
+ setupFiles: './vitest.setup.ts',
+ },
+ }),
+);
diff --git a/packages/theme/vitest.setup.ts b/packages/theme/vitest.setup.ts
new file mode 100644
index 00000000..7b0828bf
--- /dev/null
+++ b/packages/theme/vitest.setup.ts
@@ -0,0 +1 @@
+import '@testing-library/jest-dom';
diff --git a/packages/tokens/package.json b/packages/tokens/package.json
index 8e3053e9..d7915215 100644
--- a/packages/tokens/package.json
+++ b/packages/tokens/package.json
@@ -13,15 +13,16 @@
"scripts": {
"build": "tsup",
"build:storybook": "storybook build",
+ "clean": "rm -rf node_modules dist",
"dev:storybook": "storybook dev -p 6006",
- "lint:biome": "pnpm exec biome lint",
- "lint:eslint": "pnpm exec eslint",
+ "lint": "pnpm exec biome lint",
"typecheck": "tsc",
"prepack": "pnpm run build"
},
+ "dependencies": {
+ "@vanilla-extract/css": "catalog:"
+ },
"devDependencies": {
- "@faker-js/faker": "^9.2.0",
- "@sipe-team/typography": "workspace:*",
"@storybook/addon-essentials": "catalog:",
"@storybook/react": "catalog:",
"@storybook/react-vite": "catalog:",
diff --git a/packages/tokens/src/Tokens.stories.tsx b/packages/tokens/src/Tokens.stories.tsx
deleted file mode 100644
index 57a2d148..00000000
--- a/packages/tokens/src/Tokens.stories.tsx
+++ /dev/null
@@ -1,118 +0,0 @@
-import { faker } from '@faker-js/faker';
-import { Typography } from '@sipe-team/typography';
-import type { Meta, StoryObj } from '@storybook/react';
-import { color } from './colors';
-import { fontSize, fontWeight, lineHeight } from './fonts';
-
-const meta = {
- title: 'Components/Tokens',
-} satisfies Meta;
-export default meta;
-
-type Story = StoryObj;
-
-export const Colors: Story = {
- render: () => {
- return (
-
-
- ์์
-
-
- {['gray', 'red', 'pink', 'purple', 'cyan', 'blue', 'teal', 'green', 'yellow', 'orange'].map((name) => (
-
- ))}
-
-
- );
- },
-};
-
-function ColorCardGroup({ groupName }: { groupName: string }) {
- return (
-
- {groupName}
-
- {Object.entries(color)
- .filter(([key]) => key.startsWith(groupName))
- .map(([key, value]) => (
-
- ))}
-
-
- );
-}
-
-function ColorCard({ name, value }: { name: string; value: string }) {
- return (
-
-
-
- {name}
-
-
- {value}
-
-
- );
-}
-
-export const Fonts: Story = {
- render: () => {
- return (
-
-
- ๊ธ๊ผด ํฌ๊ธฐ
-
-
- {Object.entries(fontSize).map(([key, value]) => (
-
- {value} / ์ฌ์ดํ ๋์์ธ ์์คํ
-
- ))}
-
-
- ๊ธ๊ผด ๋๊ป
-
-
- {Object.entries(fontWeight).map(([key, value]) => (
-
- {key} / {value} / ์ฌ์ดํ ๋์์ธ ์์คํ
-
- ))}
-
-
- ์ค ๋์ด
-
-
- {Object.entries(lineHeight).map(([key, value]) => (
-
-
- {key} / {value}
-
- {faker.lorem.paragraphs(4)}
-
- ))}
-
-
- );
- },
-};
diff --git a/packages/tokens/src/colors.ts b/packages/tokens/src/colors/colors.ts
similarity index 67%
rename from packages/tokens/src/colors.ts
rename to packages/tokens/src/colors/colors.ts
index 75ed595d..782beece 100644
--- a/packages/tokens/src/colors.ts
+++ b/packages/tokens/src/colors/colors.ts
@@ -1,5 +1,6 @@
+// Base color palette (primitive colors)
export const color = {
- black: '#000000',
+ black: '#131518',
white: '#ffffff',
gray50: '#fafafa',
@@ -122,3 +123,57 @@ export const color = {
pink900: '#45061f',
pink950: '#2c0514',
} as const;
+
+export const semanticColor = {
+ success: color.green500,
+ warning: color.orange400,
+ danger: color.red500,
+ positive: color.blue400,
+} as const;
+
+export interface ThemeColor {
+ primary: string;
+ secondary: string;
+ background: string;
+ text: string;
+ gradient: string;
+}
+
+export const theme1st: ThemeColor = {
+ primary: '#01fe13',
+ secondary: '#01fe13',
+ background: '#000000',
+ text: color.white,
+ gradient: 'linear-gradient(45deg, #01fe13 0%, #000000 100%)',
+};
+
+export const theme2nd: ThemeColor = {
+ primary: '#03ff31',
+ secondary: '#06ffe3',
+ background: '#131518',
+ text: color.white,
+ gradient: 'linear-gradient(45deg, #03ff31 0%, #06ffe3 100%)',
+};
+
+export const theme3rd: ThemeColor = {
+ primary: '#00ffff',
+ secondary: '#00ff99',
+ background: '#0d0d0d',
+ text: color.white,
+ gradient: 'linear-gradient(45deg, #00FFFF 0%, #00FF99 100%)',
+};
+
+export const theme4th: ThemeColor = {
+ primary: '#f4a1a0',
+ secondary: '#f4a1a0',
+ background: '#0f1010',
+ text: color.white,
+ gradient: 'linear-gradient(45deg, #FF9595 0%, #FFE5B1 100%)',
+};
+
+export const themeColor = {
+ '1st': theme1st,
+ '2nd': theme2nd,
+ '3rd': theme3rd,
+ '4th': theme4th,
+} as const;
diff --git a/packages/tokens/src/colors/index.ts b/packages/tokens/src/colors/index.ts
new file mode 100644
index 00000000..1bae1c0e
--- /dev/null
+++ b/packages/tokens/src/colors/index.ts
@@ -0,0 +1 @@
+export * from './colors';
diff --git a/packages/tokens/src/effects/border.ts b/packages/tokens/src/effects/border.ts
new file mode 100644
index 00000000..42c5bbd3
--- /dev/null
+++ b/packages/tokens/src/effects/border.ts
@@ -0,0 +1,15 @@
+export const borderWidth = {
+ none: 0,
+ thin: 1,
+ medium: 2,
+ thick: 4,
+} as const;
+
+export const borderStyle = {
+ solid: 'solid',
+ dashed: 'dashed',
+ dotted: 'dotted',
+} as const;
+
+export type BorderWidth = keyof typeof borderWidth;
+export type BorderStyle = keyof typeof borderStyle;
diff --git a/packages/tokens/src/effects/index.ts b/packages/tokens/src/effects/index.ts
new file mode 100644
index 00000000..33d900f4
--- /dev/null
+++ b/packages/tokens/src/effects/index.ts
@@ -0,0 +1,5 @@
+export * from './border';
+export * from './opacity';
+export * from './radius';
+export * from './shadows';
+export * from './zIndex';
diff --git a/packages/tokens/src/effects/opacity.ts b/packages/tokens/src/effects/opacity.ts
new file mode 100644
index 00000000..17d50a0e
--- /dev/null
+++ b/packages/tokens/src/effects/opacity.ts
@@ -0,0 +1,19 @@
+export const opacity = {
+ 0: 0,
+ 5: 0.05,
+ 10: 0.1,
+ 20: 0.2,
+ 25: 0.25,
+ 30: 0.3,
+ 40: 0.4,
+ 50: 0.5,
+ 60: 0.6,
+ 70: 0.7,
+ 75: 0.75,
+ 80: 0.8,
+ 90: 0.9,
+ 95: 0.95,
+ 100: 1,
+} as const;
+
+export type Opacity = keyof typeof opacity;
diff --git a/packages/tokens/src/effects/radius.ts b/packages/tokens/src/effects/radius.ts
new file mode 100644
index 00000000..cbb30fa5
--- /dev/null
+++ b/packages/tokens/src/effects/radius.ts
@@ -0,0 +1,10 @@
+export const radius = {
+ none: '0',
+ sm: '2px',
+ md: '4px',
+ lg: '8px',
+ xl: '12px',
+ full: '9999px',
+} as const;
+
+export type Radius = keyof typeof radius;
diff --git a/packages/tokens/src/effects/shadows.ts b/packages/tokens/src/effects/shadows.ts
new file mode 100644
index 00000000..f3da5f99
--- /dev/null
+++ b/packages/tokens/src/effects/shadows.ts
@@ -0,0 +1,10 @@
+export const shadows = {
+ none: 'none',
+ sm: '0 1px 2px 0 rgba(0, 0, 0, 0.05)',
+ md: '0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06)',
+ lg: '0 10px 15px -3px rgba(0, 0, 0, 0.1), 0 4px 6px -2px rgba(0, 0, 0, 0.05)',
+ xl: '0 20px 25px -5px rgba(0, 0, 0, 0.1), 0 10px 10px -5px rgba(0, 0, 0, 0.04)',
+ '2xl': '0 25px 50px -12px rgba(0, 0, 0, 0.25)',
+} as const;
+
+export type Shadow = keyof typeof shadows;
diff --git a/packages/tokens/src/effects/zIndex.ts b/packages/tokens/src/effects/zIndex.ts
new file mode 100644
index 00000000..05ec898d
--- /dev/null
+++ b/packages/tokens/src/effects/zIndex.ts
@@ -0,0 +1,14 @@
+export const zIndex = {
+ hide: -1,
+ base: 0,
+ dropdown: 1000,
+ sticky: 1100,
+ fixed: 1200,
+ overlay: 1300,
+ modal: 1400,
+ popover: 1500,
+ toast: 1600,
+ tooltip: 1700,
+} as const;
+
+export type ZIndex = keyof typeof zIndex;
diff --git a/packages/tokens/src/index.ts b/packages/tokens/src/index.ts
index 69da6953..42507931 100644
--- a/packages/tokens/src/index.ts
+++ b/packages/tokens/src/index.ts
@@ -1,2 +1,5 @@
export * from './colors';
-export * from './fonts';
+export * from './effects';
+export * from './layout';
+export * from './theme';
+export * from './typography';
diff --git a/packages/tokens/src/layout/breakpoints.ts b/packages/tokens/src/layout/breakpoints.ts
new file mode 100644
index 00000000..ca9dd0aa
--- /dev/null
+++ b/packages/tokens/src/layout/breakpoints.ts
@@ -0,0 +1,9 @@
+export const breakpointNames = ['sm', 'md', 'lg'] as const;
+
+export const breakpoints = {
+ sm: 0,
+ md: 780,
+ lg: 1060,
+} as const;
+
+export type Breakpoint = keyof typeof breakpoints;
diff --git a/packages/tokens/src/layout/grid.ts b/packages/tokens/src/layout/grid.ts
new file mode 100644
index 00000000..bac2e3a5
--- /dev/null
+++ b/packages/tokens/src/layout/grid.ts
@@ -0,0 +1,18 @@
+export const grid = {
+ columns: 12,
+ gutter: {
+ sm: 8,
+ md: 16,
+ lg: 24,
+ },
+ container: {
+ sm: 540,
+ md: 720,
+ lg: 960,
+ xl: 1140,
+ xxl: 1320,
+ },
+} as const;
+
+export type GridGutter = keyof typeof grid.gutter;
+export type GridContainer = keyof typeof grid.container;
diff --git a/packages/tokens/src/layout/index.ts b/packages/tokens/src/layout/index.ts
new file mode 100644
index 00000000..27e99c92
--- /dev/null
+++ b/packages/tokens/src/layout/index.ts
@@ -0,0 +1,4 @@
+export * from './breakpoints';
+export * from './grid';
+export * from './responsiveStyle';
+export * from './spacing';
diff --git a/packages/tokens/src/layout/responsiveStyle.ts b/packages/tokens/src/layout/responsiveStyle.ts
new file mode 100644
index 00000000..2807f314
--- /dev/null
+++ b/packages/tokens/src/layout/responsiveStyle.ts
@@ -0,0 +1,49 @@
+// ? https://seek-oss.github.io/braid-design-system/css/responsiveStyle/
+
+import type { StyleRule } from '@vanilla-extract/css';
+
+import { breakpoints } from './breakpoints';
+
+function mapValues(obj: T, fn: (value: T[keyof T], key: keyof T) => TResult) {
+ return Object.entries(obj).reduce(
+ (acc, [key, value]) => {
+ acc[key as keyof T] = fn(value, key as keyof T);
+ return acc;
+ },
+ {} as Record,
+ );
+}
+
+const { sm: _, ...breakpointsAboveSm } = breakpoints;
+export const breakpointQuery = mapValues(breakpointsAboveSm, (bp) => `screen and (min-width: ${bp}px)`);
+
+const makeMediaQuery = (breakpoint: keyof typeof breakpointQuery) => (styles?: CSSProps) =>
+ !styles || Object.keys(styles).length === 0
+ ? {}
+ : {
+ [breakpointQuery[breakpoint]]: styles,
+ };
+
+const mediaQuery = {
+ md: makeMediaQuery('md'),
+ lg: makeMediaQuery('lg'),
+};
+
+type CSSProps = Omit;
+interface ResponsiveStyle {
+ sm?: CSSProps;
+ md?: CSSProps;
+ lg?: CSSProps;
+}
+
+export const responsiveStyle = ({ sm, md, lg }: ResponsiveStyle): StyleRule => ({
+ ...sm,
+ ...(md || lg
+ ? {
+ '@media': {
+ ...mediaQuery.md(md ?? {}),
+ ...mediaQuery.lg(lg ?? {}),
+ },
+ }
+ : {}),
+});
diff --git a/packages/tokens/src/layout/spacing.ts b/packages/tokens/src/layout/spacing.ts
new file mode 100644
index 00000000..0af454fb
--- /dev/null
+++ b/packages/tokens/src/layout/spacing.ts
@@ -0,0 +1,17 @@
+export const spacing = {
+ 0: 0,
+ 1: 4,
+ 2: 8,
+ 3: 12,
+ 4: 16,
+ 5: 20,
+ 6: 24,
+ 8: 32,
+ 10: 40,
+ 12: 48,
+ 16: 64,
+ 20: 80,
+ 24: 96,
+} as const;
+
+export type Spacing = keyof typeof spacing;
diff --git a/packages/tokens/src/theme/contract.css.ts b/packages/tokens/src/theme/contract.css.ts
new file mode 100644
index 00000000..ef3a5013
--- /dev/null
+++ b/packages/tokens/src/theme/contract.css.ts
@@ -0,0 +1,66 @@
+import { createGlobalThemeContract, globalLayer } from '@vanilla-extract/css';
+
+export const themeLayer = globalLayer('theme');
+
+export const vars = createGlobalThemeContract(
+ {
+ color: {
+ primary: 'color-primary',
+ secondary: 'color-secondary',
+ background: 'color-background',
+ text: 'color-text',
+ gradient: 'color-gradient',
+ },
+ spacing: {
+ xs: 'spacing-xs',
+ sm: 'spacing-sm',
+ md: 'spacing-md',
+ lg: 'spacing-lg',
+ xl: 'spacing-xl',
+ },
+ typography: {
+ fontFamily: 'font-family',
+ fontSize: {
+ '050': 'font-size-050',
+ '100': 'font-size-100',
+ '200': 'font-size-200',
+ '300': 'font-size-300',
+ '400': 'font-size-400',
+ '500': 'font-size-500',
+ '600': 'font-size-600',
+ '700': 'font-size-700',
+ '800': 'font-size-800',
+ '900': 'font-size-900',
+ },
+ lineHeight: {
+ regular: 'line-height-regular',
+ compact: 'line-height-compact',
+ },
+ fontWeight: {
+ regular: 'font-weight-regular',
+ medium: 'font-weight-medium',
+ semiBold: 'font-weight-semi-bold',
+ bold: 'font-weight-bold',
+ },
+ },
+ radius: {
+ none: 'radius-none',
+ sm: 'radius-sm',
+ md: 'radius-md',
+ lg: 'radius-lg',
+ xl: 'radius-xl',
+ full: 'radius-full',
+ },
+ shadows: {
+ none: 'shadow-none',
+ sm: 'shadow-sm',
+ md: 'shadow-md',
+ lg: 'shadow-lg',
+ xl: 'shadow-xl',
+ '2xl': 'shadow-2xl',
+ },
+ mode: 'theme-mode',
+ theme: 'theme-name',
+ },
+ (value) => `side-${value}`,
+);
diff --git a/packages/tokens/src/theme/index.ts b/packages/tokens/src/theme/index.ts
new file mode 100644
index 00000000..0f7cb0ce
--- /dev/null
+++ b/packages/tokens/src/theme/index.ts
@@ -0,0 +1,2 @@
+export * from './contract.css';
+export * from './themes.css';
diff --git a/packages/tokens/src/theme/themes.css.ts b/packages/tokens/src/theme/themes.css.ts
new file mode 100644
index 00000000..4f81dc7d
--- /dev/null
+++ b/packages/tokens/src/theme/themes.css.ts
@@ -0,0 +1,81 @@
+import { createGlobalTheme } from '@vanilla-extract/css';
+
+import { themeColor } from '../colors/colors';
+import { radius } from '../effects/radius';
+import { shadows } from '../effects/shadows';
+import { spacing } from '../layout/spacing';
+import { fontSize, fontWeight, lineHeight } from '../typography/fonts';
+import { themeLayer, vars } from './contract.css';
+
+const baseTheme = {
+ '@layer': themeLayer,
+ spacing: {
+ xs: `${spacing[2]}px`,
+ sm: `${spacing[4]}px`,
+ md: `${spacing[6]}px`,
+ lg: `${spacing[8]}px`,
+ xl: `${spacing[12]}px`,
+ },
+ typography: {
+ fontFamily: 'Pretendard, system-ui, sans-serif',
+ fontSize: {
+ '050': `${fontSize[12]}px`,
+ '100': `${fontSize[14]}px`,
+ '200': `${fontSize[16]}px`,
+ '300': `${fontSize[18]}px`,
+ '400': `${fontSize[20]}px`,
+ '500': `${fontSize[24]}px`,
+ '600': `${fontSize[28]}px`,
+ '700': `${fontSize[32]}px`,
+ '800': `${fontSize[36]}px`,
+ '900': `${fontSize[48]}px`,
+ },
+ lineHeight: {
+ regular: `${lineHeight.regular}`,
+ compact: `${lineHeight.compact}`,
+ },
+ fontWeight: {
+ regular: `${fontWeight.regular}`,
+ medium: `${fontWeight.medium}`,
+ semiBold: `${fontWeight.semiBold}`,
+ bold: `${fontWeight.bold}`,
+ },
+ },
+ shadows: {
+ none: `${shadows.none}`,
+ sm: `${shadows.sm}`,
+ md: `${shadows.md}`,
+ lg: `${shadows.lg}`,
+ xl: `${shadows.xl}`,
+ '2xl': `${shadows['2xl']}`,
+ },
+ radius: {
+ none: `${radius.none}`,
+ sm: `${radius.sm}`,
+ md: `${radius.md}`,
+ lg: `${radius.lg}`,
+ xl: `${radius.xl}`,
+ full: `${radius.full}`,
+ },
+};
+
+export const defaultTheme = createGlobalTheme(':root', vars, {
+ ...baseTheme,
+ color: themeColor['4th'],
+ mode: 'light',
+ theme: '4th',
+});
+
+// TODO: ๋คํฌ ๋ชจ๋ ์ถ๊ฐ ํ์
+// export const darkTheme1st = createGlobalTheme('[data-theme="1st"][data-mode="dark"]', vars, {
+// ...baseTheme,
+// color: {
+// primary: themeColor['1st'].primary,
+// secondary: themeColor['1st'].secondary,
+// background: themeColor['1st'].background,
+// text: themeColor['1st'].text,
+// gradient: themeColor['1st'].gradient,
+// },
+// mode: 'dark',
+// theme: '1st',
+// });
diff --git a/packages/tokens/src/fonts.ts b/packages/tokens/src/typography/fonts.ts
similarity index 66%
rename from packages/tokens/src/fonts.ts
rename to packages/tokens/src/typography/fonts.ts
index 545fa222..b24da556 100644
--- a/packages/tokens/src/fonts.ts
+++ b/packages/tokens/src/typography/fonts.ts
@@ -1,3 +1,6 @@
+/**
+ * Font sizes following SIPE Typography system
+ */
export const fontSize = {
12: 12,
14: 14,
@@ -12,18 +15,18 @@ export const fontSize = {
} as const;
/**
- * Font weights following MDN guidelines
- * @see https://developer.mozilla.org/en-US/docs/Web/CSS/font-weight
+ * Font weights following SIPE Typography system
*/
export const fontWeight = {
regular: 400,
medium: 500,
semiBold: 600,
bold: 700,
- extraBold: 800,
- black: 900,
} as const;
+/**
+ * Line heights following SIPE Typography system
+ */
export const lineHeight = {
regular: 1.5,
compact: 1.3,
diff --git a/packages/tokens/src/typography/index.ts b/packages/tokens/src/typography/index.ts
new file mode 100644
index 00000000..e3dc4916
--- /dev/null
+++ b/packages/tokens/src/typography/index.ts
@@ -0,0 +1 @@
+export * from './fonts';
diff --git a/packages/tooltip/package.json b/packages/tooltip/package.json
index f1da84ba..962e4821 100644
--- a/packages/tooltip/package.json
+++ b/packages/tooltip/package.json
@@ -13,9 +13,9 @@
"scripts": {
"build": "tsup",
"build:storybook": "storybook build",
+ "clean": "rm -rf node_modules dist",
"dev:storybook": "storybook dev -p 6006",
- "lint:biome": "pnpm exec biome lint",
- "lint:eslint": "pnpm exec eslint",
+ "lint": "pnpm exec biome lint",
"test": "vitest",
"typecheck": "tsc",
"prepack": "pnpm run build"
@@ -38,6 +38,7 @@
"@testing-library/user-event": "^14.5.2",
"@types/react": "catalog:react",
"@types/react-dom": "catalog:react",
+ "@vanilla-extract/css": "catalog:",
"happy-dom": "catalog:",
"react": "catalog:react",
"react-dom": "catalog:react",
diff --git a/packages/tooltip/src/Tooltip.css.ts b/packages/tooltip/src/Tooltip.css.ts
new file mode 100644
index 00000000..6e7869cf
--- /dev/null
+++ b/packages/tooltip/src/Tooltip.css.ts
@@ -0,0 +1,133 @@
+import { style, styleVariants } from '@vanilla-extract/css';
+
+export const tooltip = style({
+ position: 'fixed',
+ backgroundColor: 'var(--tooltip-bg-color, #000000)',
+ color: '#ffffff',
+ padding: '8px 12px',
+ borderRadius: '8px',
+ fontSize: '12px',
+ lineHeight: 1.5,
+ whiteSpace: 'normal',
+ wordWrap: 'break-word',
+ maxWidth: '250px',
+ boxShadow: '0 4px 8px rgba(0, 0, 0, 0.2)',
+ zIndex: 1000,
+ opacity: 0,
+ transform: 'scale(0.95)',
+ transition: 'opacity 0.3s ease, transform 0.3s ease',
+ pointerEvents: 'none',
+ selectors: {
+ '&.visible': {
+ opacity: 1,
+ transform: 'scale(1)',
+ pointerEvents: 'auto',
+ },
+ '&::after': {
+ content: '""',
+ position: 'absolute',
+ width: 0,
+ height: 0,
+ borderStyle: 'solid',
+ },
+ },
+});
+
+export const placement = styleVariants({
+ 'top-left': {
+ selectors: {
+ '&::after': {
+ bottom: '-6px',
+ left: '8px',
+ borderWidth: '6px 6px 0 6px',
+ borderColor: 'var(--tooltip-bg-color, #000000) transparent transparent transparent',
+ },
+ },
+ },
+ 'top-right': {
+ selectors: {
+ '&::after': {
+ bottom: '-6px',
+ right: '8px',
+ borderWidth: '6px 6px 0 6px',
+ borderColor: 'var(--tooltip-bg-color, #000000) transparent transparent transparent',
+ },
+ },
+ },
+ 'bottom-left': {
+ selectors: {
+ '&::after': {
+ top: '-6px',
+ left: '8px',
+ borderWidth: '0 6px 6px 6px',
+ borderColor: 'transparent transparent var(--tooltip-bg-color, #000000) transparent',
+ },
+ },
+ },
+ 'bottom-right': {
+ selectors: {
+ '&::after': {
+ top: '-6px',
+ right: '8px',
+ borderWidth: '0 6px 6px 6px',
+ borderColor: 'transparent transparent var(--tooltip-bg-color, #000000) transparent',
+ },
+ },
+ },
+ top: {
+ selectors: {
+ '&::after': {
+ bottom: '-6px',
+ left: '50%',
+ transform: 'translateX(-50%)',
+ borderWidth: '6px 6px 0 6px',
+ borderColor: 'var(--tooltip-bg-color, #000000) transparent transparent transparent',
+ },
+ },
+ },
+ bottom: {
+ selectors: {
+ '&::after': {
+ top: '-6px',
+ left: '50%',
+ transform: 'translateX(-50%)',
+ borderWidth: '0 6px 6px 6px',
+ borderColor: 'transparent transparent var(--tooltip-bg-color, #000000) transparent',
+ },
+ },
+ },
+ left: {
+ selectors: {
+ '&::after': {
+ right: '-6px',
+ top: '50%',
+ transform: 'translateY(-50%)',
+ borderWidth: '6px 0 6px 6px',
+ borderColor: 'transparent transparent transparent var(--tooltip-bg-color, #000000)',
+ },
+ },
+ },
+ right: {
+ selectors: {
+ '&::after': {
+ left: '-6px',
+ top: '50%',
+ transform: 'translateY(-50%)',
+ borderWidth: '6px 6px 6px 0',
+ borderColor: 'transparent var(--tooltip-bg-color, #000000) transparent transparent',
+ },
+ },
+ },
+});
+
+export const button = style({
+ padding: '8px 12px',
+ fontSize: '14px',
+ border: '1px solid #ccc',
+ borderRadius: '4px',
+ backgroundColor: '#f9f9f9',
+ cursor: 'pointer',
+ ':hover': {
+ backgroundColor: '#e6e6e6',
+ },
+});
diff --git a/packages/tooltip/src/Tooltip.module.css b/packages/tooltip/src/Tooltip.module.css
deleted file mode 100644
index 3e6f65d4..00000000
--- a/packages/tooltip/src/Tooltip.module.css
+++ /dev/null
@@ -1,105 +0,0 @@
-.tooltip {
- position: fixed;
- background-color: #000000;
- color: #ffffff;
- padding: 8px 12px;
- border-radius: 8px;
- font-size: 12px;
- line-height: 1.5;
- white-space: normal;
- word-wrap: break-word;
- max-width: 250px;
- box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);
- z-index: 1000;
- opacity: 0;
- transform: scale(0.95);
- transition: opacity 0.3s ease, transform 0.3s ease;
- pointer-events: none;
-}
-
-.tooltip.visible {
- opacity: 1;
- transform: scale(1);
- pointer-events: auto;
-}
-
-.tooltip::after {
- content: "";
- position: absolute;
- width: 0;
- height: 0;
- border-style: solid;
-}
-
-.tooltip.top-left::after {
- bottom: -6px;
- left: 8px;
- border-width: 6px 6px 0 6px;
- border-color: #000000 transparent transparent transparent;
-}
-
-.tooltip.top-right::after {
- bottom: -6px;
- right: 8px;
- border-width: 6px 6px 0 6px;
- border-color: #000000 transparent transparent transparent;
-}
-
-.tooltip.bottom-left::after {
- top: -6px;
- left: 8px;
- border-width: 0 6px 6px 6px;
- border-color: transparent transparent #000000 transparent;
-}
-
-.tooltip.bottom-right::after {
- top: -6px;
- right: 8px;
- border-width: 0 6px 6px 6px;
- border-color: transparent transparent #000000 transparent;
-}
-
-.tooltip.top::after {
- bottom: -6px;
- left: 50%;
- transform: translateX(-50%);
- border-width: 6px 6px 0 6px;
- border-color: #000000 transparent transparent transparent;
-}
-
-.tooltip.bottom::after {
- top: -6px;
- left: 50%;
- transform: translateX(-50%);
- border-width: 0 6px 6px 6px;
- border-color: transparent transparent #000000 transparent;
-}
-
-.tooltip.left::after {
- right: -6px;
- top: 50%;
- transform: translateY(-50%);
- border-width: 6px 0 6px 6px;
- border-color: transparent transparent transparent #000000;
-}
-
-.tooltip.right::after {
- left: -6px;
- top: 50%;
- transform: translateY(-50%);
- border-width: 6px 6px 6px 0;
- border-color: transparent #000000 transparent transparent;
-}
-
-.button {
- padding: 8px 12px;
- font-size: 14px;
- border: 1px solid #ccc;
- border-radius: 4px;
- background-color: #f9f9f9;
- cursor: pointer;
-}
-
-.button:hover {
- background-color: #e6e6e6;
-}
diff --git a/packages/tooltip/src/Tooltip.test.tsx b/packages/tooltip/src/Tooltip.test.tsx
index d5a95f14..309050bd 100644
--- a/packages/tooltip/src/Tooltip.test.tsx
+++ b/packages/tooltip/src/Tooltip.test.tsx
@@ -1,7 +1,9 @@
+import { useEffect, useState } from 'react';
+
import { render, screen, waitFor } from '@testing-library/react';
import userEvent from '@testing-library/user-event';
-import { useEffect, useState } from 'react';
import { describe, expect, test } from 'vitest';
+
import { Tooltip, type TooltipPosition } from './Tooltip';
describe('Tooltip ๊ธฐ๋ณธ ๋์ ํ
์คํธ', () => {
@@ -97,32 +99,23 @@ describe('Tooltip ์์น ํ
์คํธ', () => {
expect(tooltip.className).toContain('top');
});
- test.each([
- ['top-left'],
- ['top'],
- ['top-right'],
- ['bottom-left'],
- ['bottom'],
- ['bottom-right'],
- ['left'],
- ['right'],
- ])('Tooltip์ด %s ์์น์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๋ง๋๋ค.', async (placement) => {
- render(
-
- Trigger
- ,
- );
-
- const trigger = screen.getByText('Trigger');
- await userEvent.hover(trigger);
-
- const tooltip = await screen.findByText('Tooltip content');
- expect(tooltip).toBeInTheDocument();
- expect(tooltip.className).toContain(placement as string);
- });
+ test.each([['top-left'], ['top'], ['top-right'], ['bottom-left'], ['bottom'], ['bottom-right'], ['left'], ['right']])(
+ 'Tooltip์ด %s ์์น์ ์ฌ๋ฐ๋ฅด๊ฒ ๋ ๋๋ง๋๋ค.',
+ async (placement) => {
+ render(
+
+ Trigger
+ ,
+ );
+
+ const trigger = screen.getByText('Trigger');
+ await userEvent.hover(trigger);
+
+ const tooltip = await screen.findByText('Tooltip content');
+ expect(tooltip).toBeInTheDocument();
+ expect(tooltip.className).toContain(placement as string);
+ },
+ );
});
describe('Tooltip ์ ๊ทผ์ฑ ํ
์คํธ', () => {
@@ -160,10 +153,7 @@ describe('Tooltip ์ ๊ทผ์ฑ ํ
์คํธ', () => {
describe('Tooltip ์คํ์ผ ํ
์คํธ', () => {
test('props๋ก ์ฃผ์
ํ backgroundColor์ padding์ด CSS ๋ณ์์ ๋ฐ์๋๋ค.', async () => {
render(
-
+
Hover me
,
);
@@ -216,9 +206,7 @@ describe('Tooltip ์คํ์ผ ํ
์คํธ', () => {
test('Tooltip์ด ๋น๋๊ธฐ ๋ฐ์ดํฐ๋ก ์
๋ฐ์ดํธ๋๋ค.', async () => {
const fetchMockData = async () => {
- return new Promise((resolve) =>
- setTimeout(() => resolve('Fetched Content'), 500),
- );
+ return new Promise((resolve) => setTimeout(() => resolve('Fetched Content'), 500));
};
const AsyncTooltip = () => {
diff --git a/packages/tooltip/src/Tooltip.tsx b/packages/tooltip/src/Tooltip.tsx
index 7b967aad..2f6e46ba 100644
--- a/packages/tooltip/src/Tooltip.tsx
+++ b/packages/tooltip/src/Tooltip.tsx
@@ -1,17 +1,19 @@
-import { Slot } from '@radix-ui/react-slot';
-
-import clsx from 'clsx';
import {
- type CSSProperties,
type ComponentProps,
+ type CSSProperties,
type ForwardedRef,
- type ReactNode,
forwardRef,
+ type ReactNode,
useImperativeHandle,
} from 'react';
import { createPortal } from 'react-dom';
-import styles from './Tooltip.module.css';
+
+import { Slot } from '@radix-ui/react-slot';
+
+import clsx from 'clsx';
+
import { useTooltip } from './hooks/useTooltip';
+import * as styles from './Tooltip.css';
export type TooltipPosition =
| 'top-left'
@@ -38,7 +40,7 @@ export interface TooltipProps extends ComponentProps<'div'> {
export const Tooltip = forwardRef(function Tooltip(
{
tooltipContent,
- placement = 'top',
+ placement: placementProp = 'top',
trigger = 'hover',
asChild = true,
children,
@@ -49,7 +51,7 @@ export const Tooltip = forwardRef(function Tooltip(
ref: ForwardedRef,
) {
const { isVisible, toggleTooltip, tooltipStyles, wrapperRef, tooltipRef, handleKeyDown } = useTooltip({
- placement,
+ placement: placementProp,
gap,
trigger,
});
@@ -72,7 +74,7 @@ export const Tooltip = forwardRef(function Tooltip(
onClick={trigger === 'click' ? () => toggleTooltip(!isVisible) : undefined}
onKeyDown={handleKeyDown}
tabIndex={trigger === 'click' ? 0 : undefined}
- className={clsx(styles.trigger, { [styles.asChild]: asChild })}
+ className={styles.button}
>
{children}
@@ -80,8 +82,14 @@ export const Tooltip = forwardRef(function Tooltip(
createPortal(
{tooltipContent}
,
diff --git a/packages/tooltip/src/hooks/useTooltip/useTooltip.tsx b/packages/tooltip/src/hooks/useTooltip/useTooltip.tsx
index 12ab2fe2..1732ca58 100644
--- a/packages/tooltip/src/hooks/useTooltip/useTooltip.tsx
+++ b/packages/tooltip/src/hooks/useTooltip/useTooltip.tsx
@@ -1,10 +1,5 @@
-import {
- type CSSProperties,
- type KeyboardEvent as ReactKeyboardEvent,
- useEffect,
- useRef,
- useState,
-} from 'react';
+import { type CSSProperties, type KeyboardEvent as ReactKeyboardEvent, useEffect, useRef, useState } from 'react';
+
import type { TooltipPosition, TooltipTrigger } from '../../Tooltip';
interface useTooltipProps {
@@ -24,12 +19,7 @@ export function useTooltip({ placement, gap, trigger }: useTooltipProps) {
const wrapper = wrapperRef.current;
const tooltip = tooltipRef.current;
- if (
- wrapper &&
- !wrapper.contains(event.target as Node) &&
- tooltip &&
- !tooltip.contains(event.target as Node)
- ) {
+ if (wrapper && !wrapper.contains(event.target as Node) && tooltip && !tooltip.contains(event.target as Node)) {
setIsVisible(false);
}
};
@@ -80,10 +70,7 @@ export function useTooltip({ placement, gap, trigger }: useTooltipProps) {
};
const handleKeyDown = (event: ReactKeyboardEvent) => {
- if (
- (event.code === 'Enter' || event.code === 'space') &&
- trigger === 'click'
- ) {
+ if ((event.code === 'Enter' || event.code === 'space') && trigger === 'click') {
event.preventDefault();
toggleTooltip(!isVisible);
}
@@ -105,12 +92,10 @@ interface CalculateTooltipPositionParams {
placement: TooltipPosition;
gap: number;
}
-function calculateTooltipPosition({
- wrapperRect,
- tooltipRect,
- placement,
- gap,
-}: CalculateTooltipPositionParams): { top: number; left: number } {
+function calculateTooltipPosition({ wrapperRect, tooltipRect, placement, gap }: CalculateTooltipPositionParams): {
+ top: number;
+ left: number;
+} {
let top = 0;
let left = 0;
@@ -152,14 +137,8 @@ function calculateTooltipPosition({
return { top: 0, left: 0 };
}
- top = Math.max(
- gap,
- Math.min(top, window.innerHeight - tooltipRect.height - gap),
- );
- left = Math.max(
- gap,
- Math.min(left, window.innerWidth - tooltipRect.width - gap),
- );
+ top = Math.max(gap, Math.min(top, window.innerHeight - tooltipRect.height - gap));
+ left = Math.max(gap, Math.min(left, window.innerWidth - tooltipRect.width - gap));
return { top, left };
}
diff --git a/packages/tooltip/tsconfig.json b/packages/tooltip/tsconfig.json
index 4f0f1797..4082f16a 100644
--- a/packages/tooltip/tsconfig.json
+++ b/packages/tooltip/tsconfig.json
@@ -1,4 +1,3 @@
{
- "extends": "../../tsconfig.json",
- "exclude": ["dist"]
+ "extends": "../../tsconfig.json"
}
diff --git a/packages/typography/package.json b/packages/typography/package.json
index d9613c90..6637d109 100644
--- a/packages/typography/package.json
+++ b/packages/typography/package.json
@@ -13,9 +13,9 @@
"scripts": {
"build": "tsup",
"build:storybook": "storybook build",
+ "clean": "rm -rf node_modules dist",
"dev:storybook": "storybook dev -p 6006",
- "lint:biome": "pnpm exec biome lint",
- "lint:eslint": "pnpm exec eslint",
+ "lint": "pnpm exec biome lint",
"test": "vitest",
"typecheck": "tsc",
"prepack": "pnpm run build"
@@ -23,6 +23,7 @@
"dependencies": {
"@radix-ui/react-slot": "^1.1.0",
"@sipe-team/tokens": "workspace:^",
+ "@vanilla-extract/dynamic": "^2.1.3",
"clsx": "^2.1.1"
},
"devDependencies": {
@@ -37,6 +38,7 @@
"@testing-library/jest-dom": "^6.6.3",
"@testing-library/react": "^16.0.1",
"@types/react": "catalog:react",
+ "@vanilla-extract/css": "catalog:",
"happy-dom": "catalog:",
"react": "catalog:react",
"react-dom": "catalog:react",
diff --git a/packages/typography/src/Typography.css.ts b/packages/typography/src/Typography.css.ts
new file mode 100644
index 00000000..83f6056e
--- /dev/null
+++ b/packages/typography/src/Typography.css.ts
@@ -0,0 +1,27 @@
+import { fontSize, fontWeight, lineHeight } from '@sipe-team/tokens';
+import { style, styleVariants, createVar } from '@vanilla-extract/css';
+
+export const textColorVar = createVar();
+
+export const base = style({
+ margin: 0,
+ color: textColorVar,
+});
+
+export const size = styleVariants(fontSize, (value) => ({
+ fontSize: `${value}px`,
+}));
+
+export const weight = styleVariants(fontWeight, (value) => ({
+ fontWeight: value,
+}));
+
+export const lineHeightVariants = styleVariants(lineHeight, (value) => ({
+ lineHeight: value,
+}));
+
+export type TypographyVariants = {
+ size?: keyof typeof size;
+ weight?: keyof typeof weight;
+ lineHeight?: keyof typeof lineHeightVariants;
+};
diff --git a/packages/typography/src/Typography.module.css b/packages/typography/src/Typography.module.css
deleted file mode 100644
index f5365618..00000000
--- a/packages/typography/src/Typography.module.css
+++ /dev/null
@@ -1,6 +0,0 @@
-.typography {
- color: var(--font-color);
- font-size: var(--font-size);
- font-weight: var(--font-weight);
- line-height: var(--line-height);
-}
diff --git a/packages/typography/src/Typography.stories.tsx b/packages/typography/src/Typography.stories.tsx
index 04c4f1da..f7c1a3d0 100644
--- a/packages/typography/src/Typography.stories.tsx
+++ b/packages/typography/src/Typography.stories.tsx
@@ -1,3 +1,4 @@
+import { fontSize, fontWeight, lineHeight } from '@sipe-team/tokens';
import type { Meta, StoryObj } from '@storybook/react';
import { Typography } from './Typography';
@@ -7,6 +8,31 @@ const meta = {
parameters: {
layout: 'centered',
},
+ argTypes: {
+ weight: {
+ control: 'select',
+ options: Object.keys(fontWeight),
+ description: '๊ธ๊ผด ๊ตต๊ธฐ',
+ },
+ size: {
+ control: 'select',
+ options: Object.keys(fontSize),
+ description: '๊ธ๊ผด ํฌ๊ธฐ',
+ },
+ lineHeight: {
+ control: 'select',
+ options: Object.keys(lineHeight),
+ description: '์ค ๋์ด',
+ },
+ color: {
+ control: 'color',
+ description: '๊ธ๊ผด ์์',
+ },
+ asChild: {
+ control: 'boolean',
+ description: '์์ ์์์ ํ๊ทธ๋ฅผ ์ฌ์ฉ',
+ },
+ },
} satisfies Meta;
export default meta;
@@ -15,35 +41,139 @@ type Story = StoryObj;
export const Basic: Story = {
render() {
return (
-
-
- Weight
-
- [๊ธฐ๋ณธ ๊ฐ] regular(400) - ์ฌ์ดํ ๋์์ธ ์์คํ
- medium(500) - ์ฌ์ดํ ๋์์ธ ์์คํ
- semiBold(600) - ์ฌ์ดํ ๋์์ธ ์์คํ
- bold(700) - ์ฌ์ดํ ๋์์ธ ์์คํ
-
-
- Size
-
- 12 - ์ฌ์ดํ ๋์์ธ ์์คํ
- [๊ธฐ๋ณธ ๊ฐ] 14 - ์ฌ์ดํ ๋์์ธ ์์คํ
- 16 - ์ฌ์ดํ ๋์์ธ ์์คํ
- 18 - ์ฌ์ดํ ๋์์ธ ์์คํ
- 20 - ์ฌ์ดํ ๋์์ธ ์์คํ
- 24 - ์ฌ์ดํ ๋์์ธ ์์คํ
- 28 - ์ฌ์ดํ ๋์์ธ ์์คํ
- 32 - ์ฌ์ดํ ๋์์ธ ์์คํ
- 36 - ์ฌ์ดํ ๋์์ธ ์์คํ
- 48 - ์ฌ์ดํ ๋์์ธ ์์คํ
-
-
- Line Height
-
- [๊ธฐ๋ณธ ๊ฐ] regular(1.5) - ์ฌ์ดํ ๋์์ธ ์์คํ
- compact(1.3) - ์ฌ์ดํ ๋์์ธ ์์คํ
+
+
+ Typography
+
+
+
+ Weight
+
+
+ [๊ธฐ๋ณธ ๊ฐ] regular(400) - ์ฌ์ดํ ๋์์ธ ์์คํ
+ medium(500) - ์ฌ์ดํ ๋์์ธ ์์คํ
+ semiBold(600) - ์ฌ์ดํ ๋์์ธ ์์คํ
+ bold(700) - ์ฌ์ดํ ๋์์ธ ์์คํ
+
+
+
+ Size
+
+
+ 12 - ์ฌ์ดํ ๋์์ธ ์์คํ
+ [๊ธฐ๋ณธ ๊ฐ] 14 - ์ฌ์ดํ ๋์์ธ ์์คํ
+ 16 - ์ฌ์ดํ ๋์์ธ ์์คํ
+ 18 - ์ฌ์ดํ ๋์์ธ ์์คํ
+ 20 - ์ฌ์ดํ ๋์์ธ ์์คํ
+ 24 - ์ฌ์ดํ ๋์์ธ ์์คํ
+ 28 - ์ฌ์ดํ ๋์์ธ ์์คํ
+ 32 - ์ฌ์ดํ ๋์์ธ ์์คํ
+ 36 - ์ฌ์ดํ ๋์์ธ ์์คํ
+ 48 - ์ฌ์ดํ ๋์์ธ ์์คํ
+
+
+
+ Line Height
+
+
+
+ regular(1.5) - ๊ธฐ๋ณธ๊ฐ
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et
+ dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex
+ ea commodo consequat.
+
+
+
+ compact(1.3)
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et
+ dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex
+ ea commodo consequat.
+
+
+
);
},
};
+
+export const ColorVariants: Story = {
+ render() {
+ return (
+
+ ๋นจ๊ฐ์ ํ
์คํธ
+ ๋
น์ ํ
์คํธ
+ ํ๋์ ํ
์คํธ
+ ํํฌ์ ํ
์คํธ
+ ๋ฐํฌ๋ช
ํ
์คํธ
+
+ );
+ },
+};
+
+export const SemanticElements: Story = {
+ render() {
+ return (
+
+
+ ์ ๋ชฉ 1
+
+
+ ์ ๋ชฉ 2
+
+
+ ์ ๋ชฉ 3
+
+
+ ์ ๋ชฉ 4
+
+
+ ์ ๋ชฉ 5
+
+
+ ์ ๋ชฉ 6
+
+ ์ผ๋ฐ ํ
์คํธ ๋จ๋ฝ์
๋๋ค.
+ ์ธ๋ผ์ธ ํ
์คํธ์
๋๋ค.
+
+ );
+ },
+};
+
+export const Polymorphic: Story = {
+ render() {
+ return (
+
+ );
+ },
+};
diff --git a/packages/typography/src/Typography.test.tsx b/packages/typography/src/Typography.test.tsx
index a2ebd36d..b17af81b 100644
--- a/packages/typography/src/Typography.test.tsx
+++ b/packages/typography/src/Typography.test.tsx
@@ -1,24 +1,20 @@
import { faker } from '@faker-js/faker';
+import { fontWeight, lineHeight } from '@sipe-team/tokens';
import { render, screen, waitFor } from '@testing-library/react';
import { expect, test } from 'vitest';
-import {
- type FontSize,
- type FontWeight,
- type LineHeight,
- Typography,
-} from './Typography';
+import { type FontSize, type FontWeight, type LineHeight, Typography } from './Typography';
test('weight๋ฅผ ์ฃผ์
ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ๊ฐ regular(400)๋ก ๊ธ๊ผด์ ๋๊ป๋ฅผ ์ค์ ํ๋ค.', () => {
render(ํ
์คํธ );
- expect(screen.getByText('ํ
์คํธ')).toHaveStyle({ fontWeight: 400 });
+ expect(screen.getByText('ํ
์คํธ')).toHaveStyle({ fontWeight: fontWeight.regular });
});
test.each([
- { weight: 'regular', numericWeight: 400 },
- { weight: 'medium', numericWeight: 500 },
- { weight: 'semiBold', numericWeight: 600 },
- { weight: 'bold', numericWeight: 700 },
+ { weight: 'regular', numericWeight: fontWeight.regular },
+ { weight: 'medium', numericWeight: fontWeight.medium },
+ { weight: 'semiBold', numericWeight: fontWeight.semiBold },
+ { weight: 'bold', numericWeight: fontWeight.bold },
] satisfies Array<{ weight: FontWeight; numericWeight: number }>)(
'์ฃผ์
ํ $weight($numericWeight) weight์ ๊ธฐ์ค์ผ๋ก ๊ธ๊ผด์ ๋๊ป๋ฅผ ์ค์ ํ๋ค.',
({ weight, numericWeight }) => {
@@ -48,16 +44,16 @@ test.each([12, 14, 16, 18, 20, 24, 28, 32, 36, 48] satisfies FontSize[])(
test('lineHeight์ ์ฃผ์
ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ๊ฐ regular(1.5)๋ก ์ค ๋์ด๋ฅผ ์ค์ ํ๋ค.', () => {
render(ํ
์คํธ );
- expect(screen.getByText('ํ
์คํธ')).toHaveStyle({ lineHeight: 1.5 });
+ expect(screen.getByText('ํ
์คํธ')).toHaveStyle({ lineHeight: lineHeight.regular });
});
test.each([
- { lineHeight: 'regular', numericLineHeight: 1.5 },
- { lineHeight: 'compact', numericLineHeight: 1.3 },
+ { lineHeight: 'regular', numericLineHeight: lineHeight.regular },
+ { lineHeight: 'compact', numericLineHeight: lineHeight.compact },
] satisfies Array<{ lineHeight: LineHeight; numericLineHeight: number }>)(
'์ฃผ์
ํ %s lineHeight์ ๊ธฐ์ค์ผ๋ก ์ค ๋์ด๋ฅผ ์ค์ ํ๋ค.',
- ({ lineHeight, numericLineHeight }) => {
- render(ํ
์คํธ );
+ ({ lineHeight: lineHeightValue, numericLineHeight }) => {
+ render(ํ
์คํธ );
expect(screen.getByText('ํ
์คํธ')).toHaveStyle({
lineHeight: numericLineHeight,
@@ -98,7 +94,7 @@ test('className์ ์ฃผ์
ํ๋ฉด ์ถ๊ฐ๋ก ์ ๋ฌํ๋ค.', () => {
render(ํ
์คํธ );
- expect(screen.getByText('ํ
์คํธ')).toHaveClass(customClassName);
+ expect(screen.getByText('ํ
์คํธ').className).toContain(customClassName);
});
test('style์ ์ฃผ์
ํ๋ฉด ์ถ๊ฐ๋ก ์ ๋ฌํ๋ค.', () => {
diff --git a/packages/typography/src/Typography.tsx b/packages/typography/src/Typography.tsx
index 91f5cc7b..0db830c5 100644
--- a/packages/typography/src/Typography.tsx
+++ b/packages/typography/src/Typography.tsx
@@ -1,29 +1,30 @@
import { Slot } from '@radix-ui/react-slot';
-import {
+import type {
fontSize as fontSizeToken,
fontWeight as fontWeightToken,
lineHeight as lineHeightToken,
} from '@sipe-team/tokens';
-import { clsx as cx } from 'clsx';
+import { assignInlineVars } from '@vanilla-extract/dynamic';
+import cx from 'clsx';
+import { type CSSProperties, type ComponentProps, type ForwardedRef, forwardRef } from 'react';
import {
- type CSSProperties,
- type ComponentProps,
- type ForwardedRef,
- forwardRef,
-} from 'react';
-import styles from './Typography.module.css';
+ base,
+ lineHeightVariants,
+ size as sizeVariants,
+ textColorVar,
+ weight as weightVariants,
+} from './Typography.css';
export type FontSize = keyof typeof fontSizeToken;
-
export type FontWeight = keyof typeof fontWeightToken;
-
export type LineHeight = keyof typeof lineHeightToken;
-export interface TypographyProps extends ComponentProps<'p'> {
+export interface TypographyProps extends Omit, 'color'> {
asChild?: boolean;
lineHeight?: LineHeight;
size?: FontSize;
weight?: FontWeight;
+ color?: string;
}
export const Typography = forwardRef(function Typography(
@@ -37,23 +38,23 @@ export const Typography = forwardRef(function Typography(
weight = 'regular',
...props
}: TypographyProps,
- ref: ForwardedRef,
+ ref: ForwardedRef,
) {
const Component = asChild ? Slot : 'p';
+ const dynamicStyles = assignInlineVars({
+ ...(color && { [textColorVar]: color }),
+ });
const style = {
..._style,
- '--font-color': color,
- '--font-size': `${fontSizeToken[size]}px`,
- '--font-weight': fontWeightToken[weight],
- '--line-height': lineHeightToken[lineHeight],
+ ...dynamicStyles,
} as CSSProperties;
+ const typographyClassName = cx(base, sizeVariants[size], weightVariants[weight], lineHeightVariants[lineHeight]);
+ const combinedClassName = cx(typographyClassName, className);
+
return (
-
+ } className={combinedClassName} style={style} {...props} />
);
});
+
+Typography.displayName = 'Typography';
diff --git a/packages/typography/tsconfig.json b/packages/typography/tsconfig.json
index 4f0f1797..4082f16a 100644
--- a/packages/typography/tsconfig.json
+++ b/packages/typography/tsconfig.json
@@ -1,4 +1,3 @@
{
- "extends": "../../tsconfig.json",
- "exclude": ["dist"]
+ "extends": "../../tsconfig.json"
}
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 9a2593d2..bd5debca 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -33,6 +33,18 @@ catalogs:
'@testing-library/react':
specifier: ^16.0.1
version: 16.0.1
+ '@testing-library/user-event':
+ specifier: ^14.6.1
+ version: 14.6.1
+ '@vanilla-extract/css':
+ specifier: ^1.14.1
+ version: 1.20.1
+ '@vanilla-extract/esbuild-plugin':
+ specifier: ^2.3.15
+ version: 2.3.22
+ '@vanilla-extract/vite-plugin':
+ specifier: ^5.0.1
+ version: 5.2.2
'@vitest/coverage-v8':
specifier: ^2.1.8
version: 2.1.8
@@ -46,11 +58,14 @@ catalogs:
specifier: ^8.4.7
version: 8.5.0
tsup:
- specifier: ^8.3.5
- version: 8.3.5
+ specifier: ^8.4.0
+ version: 8.5.1
typescript:
specifier: ^5.6.3
version: 5.6.3
+ vite:
+ specifier: ^5.4.11
+ version: 5.4.11
vitest:
specifier: ^2.1.8
version: 2.1.8
@@ -93,9 +108,6 @@ importers:
'@commitlint/types':
specifier: ^19.5.0
version: 19.5.0
- '@eslint/eslintrc':
- specifier: ^3.2.0
- version: 3.2.0
'@storybook/addon-docs':
specifier: ^8.4.7
version: 8.5.2(@types/react@18.3.13)(storybook@8.5.0(prettier@2.8.8))
@@ -119,7 +131,7 @@ importers:
version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)
'@storybook/react-vite':
specifier: 'catalog:'
- version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.28.0)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))
+ version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.60.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0))
'@storybook/test':
specifier: 'catalog:'
version: 8.4.6(storybook@8.5.0(prettier@2.8.8))
@@ -129,9 +141,6 @@ importers:
'@tsconfig/strictest':
specifier: ^2.0.5
version: 2.0.5
- '@types/eslint__eslintrc':
- specifier: ^2.1.2
- version: 2.1.2
'@types/node':
specifier: ^22.8.1
version: 22.10.1
@@ -141,12 +150,15 @@ importers:
'@types/react-dom':
specifier: ^18.3.1
version: 18.3.1
- '@typescript-eslint/parser':
- specifier: ^8.19.0
- version: 8.19.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)
+ '@vanilla-extract/esbuild-plugin':
+ specifier: 'catalog:'
+ version: 2.3.22(esbuild@0.27.7)
+ '@vanilla-extract/vite-plugin':
+ specifier: 'catalog:'
+ version: 5.2.2(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(lightningcss@1.32.0)(terser@5.37.0)(tsx@4.19.2)(vite@5.4.11(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0))(yaml@2.6.1)
'@vitest/coverage-v8':
specifier: 'catalog:'
- version: 2.1.8(vitest@2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(terser@5.37.0))
+ version: 2.1.8(vitest@2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0))
chromatic:
specifier: ^11.19.0
version: 11.19.0
@@ -156,18 +168,6 @@ importers:
commitizen:
specifier: ^4.3.1
version: 4.3.1(@types/node@22.10.1)(typescript@5.6.3)
- eslint:
- specifier: ^9.20.0
- version: 9.20.0(jiti@2.4.1)
- eslint-plugin-react:
- specifier: ^7.37.3
- version: 7.37.4(eslint@9.20.0(jiti@2.4.1))
- eslint-plugin-react-hooks:
- specifier: ^5.1.0
- version: 5.1.0(eslint@9.20.0(jiti@2.4.1))
- eslint-plugin-storybook:
- specifier: ^0.11.2
- version: 0.11.2(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)
globals:
specifier: ^15.14.0
version: 15.14.0
@@ -188,22 +188,44 @@ importers:
version: 8.5.0(prettier@2.8.8)
tsup:
specifier: 'catalog:'
- version: 8.3.5(jiti@2.4.1)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
+ version: 8.5.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
tsx:
specifier: ^4.19.2
version: 4.19.2
typescript:
specifier: 'catalog:'
version: 5.6.3
- typescript-eslint:
- specifier: ^8.19.1
- version: 8.22.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)
+ vite:
+ specifier: 'catalog:'
+ version: 5.4.11(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0)
vitest:
specifier: 'catalog:'
- version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(terser@5.37.0)
+ version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0)
- .templates/component:
+ packages/accordion:
+ dependencies:
+ '@radix-ui/react-slot':
+ specifier: ^1.1.0
+ version: 1.1.0(@types/react@18.3.13)(react@18.3.1)
+ '@sipe-team/icon':
+ specifier: workspace:*
+ version: link:../icon
+ '@sipe-team/tokens':
+ specifier: workspace:*
+ version: link:../tokens
+ '@vanilla-extract/css':
+ specifier: 'catalog:'
+ version: 1.20.1
+ '@vanilla-extract/recipes':
+ specifier: ^0.5.5
+ version: 0.5.7(@vanilla-extract/css@1.20.1)
+ clsx:
+ specifier: ^2.1.0
+ version: 2.1.1
devDependencies:
+ '@sipe-team/typography':
+ specifier: workspace:*
+ version: link:../typography
'@storybook/addon-essentials':
specifier: 'catalog:'
version: 8.4.6(@types/react@18.3.13)(storybook@8.5.0(prettier@2.8.8))
@@ -221,7 +243,7 @@ importers:
version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)
'@storybook/react-vite':
specifier: 'catalog:'
- version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.28.0)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))
+ version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.60.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0))
'@storybook/test':
specifier: 'catalog:'
version: 8.4.6(storybook@8.5.0(prettier@2.8.8))
@@ -232,29 +254,29 @@ importers:
specifier: 'catalog:'
version: 16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.1)(@types/react@18.3.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@types/react':
- specifier: catalog:react
+ specifier: ^18.3.12
version: 18.3.13
happy-dom:
specifier: 'catalog:'
version: 15.11.7
react:
- specifier: catalog:react
+ specifier: ^18.3.1
version: 18.3.1
react-dom:
- specifier: catalog:react
+ specifier: ^18.3.1
version: 18.3.1(react@18.3.1)
storybook:
specifier: 'catalog:'
version: 8.5.0(prettier@2.8.8)
tsup:
specifier: 'catalog:'
- version: 8.3.5(jiti@2.4.1)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
+ version: 8.5.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
typescript:
specifier: 'catalog:'
version: 5.6.3
vitest:
specifier: 'catalog:'
- version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(terser@5.37.0)
+ version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0)
packages/avatar:
dependencies:
@@ -291,7 +313,7 @@ importers:
version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)
'@storybook/react-vite':
specifier: 'catalog:'
- version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.28.0)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))
+ version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.60.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
'@storybook/test':
specifier: 'catalog:'
version: 8.4.6(storybook@8.5.0(prettier@2.8.8))
@@ -304,6 +326,9 @@ importers:
'@types/react':
specifier: catalog:react
version: 18.3.13
+ '@vanilla-extract/css':
+ specifier: 'catalog:'
+ version: 1.20.1
happy-dom:
specifier: 'catalog:'
version: 15.11.7
@@ -318,16 +343,19 @@ importers:
version: 8.5.0(prettier@2.8.8)
tsup:
specifier: 'catalog:'
- version: 8.3.5(jiti@2.4.1)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
+ version: 8.5.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
typescript:
specifier: 'catalog:'
version: 5.6.3
vitest:
specifier: 'catalog:'
- version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(terser@5.37.0)
+ version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0)
packages/badge:
dependencies:
+ '@sipe-team/tokens':
+ specifier: workspace:*
+ version: link:../tokens
'@sipe-team/typography':
specifier: workspace:*
version: link:../typography
@@ -352,7 +380,7 @@ importers:
version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)
'@storybook/react-vite':
specifier: 'catalog:'
- version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.28.0)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))
+ version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.60.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
'@storybook/test':
specifier: 'catalog:'
version: 8.4.6(storybook@8.5.0(prettier@2.8.8))
@@ -365,6 +393,9 @@ importers:
'@types/react':
specifier: catalog:react
version: 18.3.13
+ '@vanilla-extract/css':
+ specifier: 'catalog:'
+ version: 1.20.1
happy-dom:
specifier: 'catalog:'
version: 15.11.7
@@ -382,28 +413,31 @@ importers:
version: 8.5.0(prettier@2.8.8)
tsup:
specifier: 'catalog:'
- version: 8.3.5(jiti@2.4.1)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
+ version: 8.5.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
typescript:
specifier: 'catalog:'
version: 5.6.3
vitest:
specifier: 'catalog:'
- version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(terser@5.37.0)
+ version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0)
packages/button:
dependencies:
'@radix-ui/react-slot':
specifier: ^1.1.0
version: 1.1.0(@types/react@18.3.13)(react@18.3.1)
+ '@sipe-team/tokens':
+ specifier: workspace:*
+ version: link:../tokens
'@sipe-team/typography':
specifier: workspace:*
version: link:../typography
+ '@vanilla-extract/recipes':
+ specifier: ^0.5.5
+ version: 0.5.7(@vanilla-extract/css@1.20.1)
clsx:
specifier: ^2.1.1
version: 2.1.1
- ts-pattern:
- specifier: ^5.6.0
- version: 5.6.0
devDependencies:
'@storybook/addon-essentials':
specifier: 'catalog:'
@@ -422,7 +456,7 @@ importers:
version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)
'@storybook/react-vite':
specifier: 'catalog:'
- version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.28.0)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))
+ version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.60.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
'@storybook/test':
specifier: 'catalog:'
version: 8.4.6(storybook@8.5.0(prettier@2.8.8))
@@ -435,6 +469,9 @@ importers:
'@types/react':
specifier: catalog:react
version: 18.3.13
+ '@vanilla-extract/css':
+ specifier: 'catalog:'
+ version: 1.20.1
happy-dom:
specifier: 'catalog:'
version: 15.11.7
@@ -452,13 +489,13 @@ importers:
version: 8.5.0(prettier@2.8.8)
tsup:
specifier: 'catalog:'
- version: 8.3.5(jiti@2.4.1)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
+ version: 8.5.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
typescript:
specifier: 'catalog:'
version: 5.6.3
vitest:
specifier: 'catalog:'
- version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(terser@5.37.0)
+ version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0)
packages/card:
dependencies:
@@ -489,7 +526,7 @@ importers:
version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)
'@storybook/react-vite':
specifier: 'catalog:'
- version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.28.0)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))
+ version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.60.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
'@storybook/test':
specifier: 'catalog:'
version: 8.4.6(storybook@8.5.0(prettier@2.8.8))
@@ -502,6 +539,12 @@ importers:
'@types/react':
specifier: catalog:react
version: 18.3.13
+ '@vanilla-extract/css':
+ specifier: 'catalog:'
+ version: 1.20.1
+ '@vanilla-extract/recipes':
+ specifier: ^0.5.5
+ version: 0.5.7(@vanilla-extract/css@1.20.1)
happy-dom:
specifier: 'catalog:'
version: 15.11.7
@@ -519,25 +562,25 @@ importers:
version: 8.5.0(prettier@2.8.8)
tsup:
specifier: 'catalog:'
- version: 8.3.5(jiti@2.4.1)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
+ version: 8.5.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
typescript:
specifier: 'catalog:'
version: 5.6.3
vitest:
specifier: 'catalog:'
- version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(terser@5.37.0)
+ version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0)
packages/checkbox:
dependencies:
- '@radix-ui/react-slot':
- specifier: ^1.1.0
- version: 1.1.0(@types/react@18.3.13)(react@18.3.1)
+ '@sipe-team/tokens':
+ specifier: workspace:*
+ version: link:../tokens
+ '@vanilla-extract/recipes':
+ specifier: ^0.5.5
+ version: 0.5.7(@vanilla-extract/css@1.20.1)
clsx:
specifier: ^2.1.1
version: 2.1.1
- nanoid:
- specifier: ^5.0.9
- version: 5.0.9
devDependencies:
'@storybook/addon-essentials':
specifier: 'catalog:'
@@ -556,7 +599,7 @@ importers:
version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)
'@storybook/react-vite':
specifier: 'catalog:'
- version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.28.0)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))
+ version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.60.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
'@storybook/test':
specifier: 'catalog:'
version: 8.4.6(storybook@8.5.0(prettier@2.8.8))
@@ -566,9 +609,15 @@ importers:
'@testing-library/react':
specifier: 'catalog:'
version: 16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.1)(@types/react@18.3.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@testing-library/user-event':
+ specifier: 'catalog:'
+ version: 14.6.1(@testing-library/dom@10.4.0)
'@types/react':
specifier: catalog:react
version: 18.3.13
+ '@vanilla-extract/css':
+ specifier: ^1.17.1
+ version: 1.20.1
happy-dom:
specifier: 'catalog:'
version: 15.11.7
@@ -583,16 +632,65 @@ importers:
version: 8.5.0(prettier@2.8.8)
tsup:
specifier: 'catalog:'
- version: 8.3.5(jiti@2.4.1)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
+ version: 8.5.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
typescript:
specifier: 'catalog:'
version: 5.6.3
vitest:
specifier: 'catalog:'
- version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(terser@5.37.0)
+ version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0)
+
+ packages/chip:
+ dependencies:
+ '@radix-ui/react-slot':
+ specifier: ^1.0.2
+ version: 1.1.0(@types/react@18.3.13)(react@18.3.1)
+ '@vanilla-extract/css':
+ specifier: ^1.14.0
+ version: 1.20.1
+ '@vanilla-extract/recipes':
+ specifier: ^0.5.1
+ version: 0.5.7(@vanilla-extract/css@1.20.1)
+ clsx:
+ specifier: ^2.0.0
+ version: 2.1.1
+ devDependencies:
+ '@sipe-team/tokens':
+ specifier: workspace:*
+ version: link:../tokens
+ '@testing-library/jest-dom':
+ specifier: 'catalog:'
+ version: 6.6.3
+ '@testing-library/react':
+ specifier: 'catalog:'
+ version: 16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.1)(@types/react@18.3.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@testing-library/user-event':
+ specifier: 'catalog:'
+ version: 14.6.1(@testing-library/dom@10.4.0)
+ '@types/react':
+ specifier: ^18.2.0
+ version: 18.3.13
+ jsdom:
+ specifier: ^26.1.0
+ version: 26.1.0
+ react:
+ specifier: ^18.2.0
+ version: 18.3.1
+ tsup:
+ specifier: ^8.0.0
+ version: 8.3.5(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
+ typescript:
+ specifier: ^5.0.0
+ version: 5.6.3
+ vitest:
+ specifier: ^1.0.0
+ version: 1.6.1(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0)
packages/divider:
dependencies:
+ '@sipe-team/tokens':
+ specifier: workspace:*
+ version: link:../tokens
clsx:
specifier: ^2.1.1
version: 2.1.1
@@ -617,7 +715,7 @@ importers:
version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)
'@storybook/react-vite':
specifier: 'catalog:'
- version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.28.0)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))
+ version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.60.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
'@storybook/test':
specifier: 'catalog:'
version: 8.4.6(storybook@8.5.0(prettier@2.8.8))
@@ -630,6 +728,9 @@ importers:
'@types/react':
specifier: catalog:react
version: 18.3.13
+ '@vanilla-extract/css':
+ specifier: 'catalog:'
+ version: 1.20.1
happy-dom:
specifier: 'catalog:'
version: 15.11.7
@@ -644,13 +745,13 @@ importers:
version: 8.5.0(prettier@2.8.8)
tsup:
specifier: 'catalog:'
- version: 8.3.5(jiti@2.4.1)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
+ version: 8.5.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
typescript:
specifier: 'catalog:'
version: 5.6.3
vitest:
specifier: 'catalog:'
- version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(terser@5.37.0)
+ version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0)
packages/flex:
dependencies:
@@ -681,7 +782,7 @@ importers:
version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)
'@storybook/react-vite':
specifier: 'catalog:'
- version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.28.0)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))
+ version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.60.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
'@storybook/test':
specifier: 'catalog:'
version: 8.4.6(storybook@8.5.0(prettier@2.8.8))
@@ -694,6 +795,9 @@ importers:
'@types/react':
specifier: catalog:react
version: 18.3.13
+ '@vanilla-extract/css':
+ specifier: 'catalog:'
+ version: 1.20.1
happy-dom:
specifier: 'catalog:'
version: 15.11.7
@@ -708,13 +812,13 @@ importers:
version: 8.5.0(prettier@2.8.8)
tsup:
specifier: 'catalog:'
- version: 8.3.5(jiti@2.4.1)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
+ version: 8.5.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
typescript:
specifier: 'catalog:'
version: 5.6.3
vitest:
specifier: 'catalog:'
- version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(terser@5.37.0)
+ version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0)
packages/grid:
dependencies:
@@ -748,7 +852,7 @@ importers:
version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)
'@storybook/react-vite':
specifier: 'catalog:'
- version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.28.0)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))
+ version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.60.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
'@storybook/test':
specifier: 'catalog:'
version: 8.4.6(storybook@8.5.0(prettier@2.8.8))
@@ -761,6 +865,9 @@ importers:
'@types/react':
specifier: catalog:react
version: 18.3.13
+ '@vanilla-extract/css':
+ specifier: 'catalog:'
+ version: 1.20.1
happy-dom:
specifier: 'catalog:'
version: 15.11.7
@@ -772,13 +879,13 @@ importers:
version: 8.5.0(prettier@2.8.8)
tsup:
specifier: 'catalog:'
- version: 8.3.5(jiti@2.4.1)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
+ version: 8.5.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
typescript:
specifier: 'catalog:'
version: 5.6.3
vitest:
specifier: 'catalog:'
- version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(terser@5.37.0)
+ version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0)
packages/icon:
devDependencies:
@@ -799,7 +906,7 @@ importers:
version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)
'@storybook/react-vite':
specifier: 'catalog:'
- version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.28.0)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))
+ version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.60.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
'@storybook/test':
specifier: 'catalog:'
version: 8.4.6(storybook@8.5.0(prettier@2.8.8))
@@ -829,22 +936,28 @@ importers:
version: 3.3.2
tsup:
specifier: 'catalog:'
- version: 8.3.5(jiti@2.4.1)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
+ version: 8.5.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
typescript:
specifier: 'catalog:'
version: 5.6.3
vitest:
specifier: 'catalog:'
- version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(terser@5.37.0)
+ version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0)
packages/input:
dependencies:
'@radix-ui/react-slot':
specifier: ^1.1.0
version: 1.1.0(@types/react@18.3.13)(react@18.3.1)
- classnames:
- specifier: ^2.5.1
- version: 2.5.1
+ '@sipe-team/tokens':
+ specifier: workspace:*
+ version: link:../tokens
+ '@vanilla-extract/recipes':
+ specifier: ^0.5.5
+ version: 0.5.7(@vanilla-extract/css@1.20.1)
+ clsx:
+ specifier: ^2.1.1
+ version: 2.1.1
devDependencies:
'@storybook/addon-essentials':
specifier: 'catalog:'
@@ -863,7 +976,7 @@ importers:
version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)
'@storybook/react-vite':
specifier: 'catalog:'
- version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.28.0)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))
+ version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.60.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
'@storybook/test':
specifier: 'catalog:'
version: 8.4.6(storybook@8.5.0(prettier@2.8.8))
@@ -879,6 +992,9 @@ importers:
'@types/react':
specifier: catalog:react
version: 18.3.13
+ '@vanilla-extract/css':
+ specifier: 'catalog:'
+ version: 1.20.1
happy-dom:
specifier: 'catalog:'
version: 15.11.7
@@ -893,13 +1009,13 @@ importers:
version: 8.5.0(prettier@2.8.8)
tsup:
specifier: 'catalog:'
- version: 8.3.5(jiti@2.4.1)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
+ version: 8.5.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
typescript:
specifier: 'catalog:'
version: 5.6.3
vitest:
specifier: 'catalog:'
- version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(terser@5.37.0)
+ version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0)
packages/plugin-figma-codegen:
devDependencies:
@@ -908,12 +1024,25 @@ importers:
version: 1.108.0
tsup:
specifier: 'catalog:'
- version: 8.3.5(jiti@2.4.1)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
+ version: 8.5.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
typescript:
specifier: 'catalog:'
version: 5.6.3
packages/radio:
+ dependencies:
+ '@sipe-team/tokens':
+ specifier: workspace:*
+ version: link:../tokens
+ '@sipe-team/typography':
+ specifier: workspace:*
+ version: link:../typography
+ '@vanilla-extract/recipes':
+ specifier: ^0.5.5
+ version: 0.5.7(@vanilla-extract/css@1.20.1)
+ clsx:
+ specifier: ^2.1.1
+ version: 2.1.1
devDependencies:
'@storybook/addon-essentials':
specifier: 'catalog:'
@@ -932,7 +1061,7 @@ importers:
version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)
'@storybook/react-vite':
specifier: 'catalog:'
- version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.28.0)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))
+ version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.60.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
'@storybook/test':
specifier: 'catalog:'
version: 8.4.6(storybook@8.5.0(prettier@2.8.8))
@@ -945,12 +1074,18 @@ importers:
'@testing-library/react':
specifier: ^16.0.1
version: 16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.1)(@types/react@18.3.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@testing-library/user-event':
+ specifier: ^14.5.2
+ version: 14.5.2(@testing-library/dom@10.4.0)
'@types/react':
specifier: catalog:react
version: 18.3.13
'@types/react-dom':
specifier: catalog:react
version: 18.3.1
+ '@vanilla-extract/css':
+ specifier: 'catalog:'
+ version: 1.20.1
happy-dom:
specifier: 'catalog:'
version: 15.11.7
@@ -965,47 +1100,20 @@ importers:
version: 8.5.0(prettier@2.8.8)
tsup:
specifier: 'catalog:'
- version: 8.3.5(jiti@2.4.1)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
+ version: 8.5.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
typescript:
specifier: 'catalog:'
version: 5.6.3
vitest:
specifier: 'catalog:'
- version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(terser@5.37.0)
+ version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0)
packages/reset:
dependencies:
- '@radix-ui/react-slot':
- specifier: ^1.1.0
- version: 1.1.0(@types/react@18.3.13)(react@18.3.1)
- classnames:
- specifier: ^2.5.1
- version: 2.5.1
react-dom:
specifier: '>= 18'
version: 18.3.1(react@18.3.1)
devDependencies:
- '@storybook/addon-essentials':
- specifier: 'catalog:'
- version: 8.4.6(@types/react@18.3.13)(storybook@8.5.0(prettier@2.8.8))
- '@storybook/addon-interactions':
- specifier: 'catalog:'
- version: 8.4.6(storybook@8.5.0(prettier@2.8.8))
- '@storybook/addon-links':
- specifier: 'catalog:'
- version: 8.4.6(react@18.3.1)(storybook@8.5.0(prettier@2.8.8))
- '@storybook/blocks':
- specifier: 'catalog:'
- version: 8.5.2(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@2.8.8))
- '@storybook/react':
- specifier: 'catalog:'
- version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)
- '@storybook/react-vite':
- specifier: 'catalog:'
- version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.28.0)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))
- '@storybook/test':
- specifier: 'catalog:'
- version: 8.4.6(storybook@8.5.0(prettier@2.8.8))
'@testing-library/jest-dom':
specifier: 'catalog:'
version: 6.6.3
@@ -1015,24 +1123,18 @@ importers:
'@types/react':
specifier: catalog:react
version: 18.3.13
- happy-dom:
- specifier: 'catalog:'
- version: 15.11.7
react:
specifier: catalog:react
version: 18.3.1
- storybook:
- specifier: 'catalog:'
- version: 8.5.0(prettier@2.8.8)
tsup:
specifier: 'catalog:'
- version: 8.3.5(jiti@2.4.1)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
+ version: 8.5.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
typescript:
specifier: 'catalog:'
version: 5.6.3
vitest:
specifier: 'catalog:'
- version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(terser@5.37.0)
+ version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0)
packages/side:
dependencies:
@@ -1063,6 +1165,9 @@ importers:
'@sipe-team/switch':
specifier: workspace:*
version: link:../switch
+ '@sipe-team/theme':
+ specifier: workspace:*
+ version: link:../theme
'@sipe-team/tokens':
specifier: workspace:*
version: link:../tokens
@@ -1081,7 +1186,7 @@ importers:
devDependencies:
tsup:
specifier: 'catalog:'
- version: 8.3.5(jiti@2.4.1)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
+ version: 8.5.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
typescript:
specifier: 'catalog:'
version: 5.6.3
@@ -1091,6 +1196,15 @@ importers:
'@radix-ui/react-slot':
specifier: ^1.1.0
version: 1.1.0(@types/react@18.3.13)(react@18.3.1)
+ '@sipe-team/tokens':
+ specifier: workspace:*
+ version: link:../tokens
+ '@vanilla-extract/recipes':
+ specifier: ^0.5.5
+ version: 0.5.7(@vanilla-extract/css@1.20.1)
+ clsx:
+ specifier: ^2.1.1
+ version: 2.1.1
devDependencies:
'@faker-js/faker':
specifier: ^9.2.0
@@ -1112,7 +1226,7 @@ importers:
version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)
'@storybook/react-vite':
specifier: 'catalog:'
- version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.28.0)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))
+ version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.60.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
'@storybook/test':
specifier: 'catalog:'
version: 8.4.6(storybook@8.5.0(prettier@2.8.8))
@@ -1125,6 +1239,9 @@ importers:
'@types/react':
specifier: catalog:react
version: 18.3.13
+ '@vanilla-extract/css':
+ specifier: 'catalog:'
+ version: 1.20.1
happy-dom:
specifier: 'catalog:'
version: 15.11.7
@@ -1139,19 +1256,25 @@ importers:
version: 8.5.0(prettier@2.8.8)
tsup:
specifier: 'catalog:'
- version: 8.3.5(jiti@2.4.1)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
+ version: 8.5.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
typescript:
specifier: 'catalog:'
version: 5.6.3
vitest:
specifier: 'catalog:'
- version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(terser@5.37.0)
+ version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0)
packages/switch:
dependencies:
+ '@radix-ui/react-use-controllable-state':
+ specifier: ^1.2.2
+ version: 1.2.2(@types/react@18.3.13)(react@18.3.1)
'@sipe-team/tokens':
specifier: workspace:^
version: link:../tokens
+ '@vanilla-extract/recipes':
+ specifier: ^0.5.5
+ version: 0.5.7(@vanilla-extract/css@1.20.1)
clsx:
specifier: ^2.1.1
version: 2.1.1
@@ -1176,7 +1299,7 @@ importers:
version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)
'@storybook/react-vite':
specifier: 'catalog:'
- version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.28.0)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))
+ version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.60.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
'@storybook/test':
specifier: 'catalog:'
version: 8.4.6(storybook@8.5.0(prettier@2.8.8))
@@ -1192,6 +1315,12 @@ importers:
'@types/react':
specifier: catalog:react
version: 18.3.13
+ '@vanilla-extract/css':
+ specifier: 'catalog:'
+ version: 1.20.1
+ '@vanilla-extract/vite-plugin':
+ specifier: 'catalog:'
+ version: 5.2.2(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(lightningcss@1.32.0)(terser@5.37.0)(tsx@4.19.2)(vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))(yaml@2.6.1)
happy-dom:
specifier: 'catalog:'
version: 15.11.7
@@ -1206,22 +1335,69 @@ importers:
version: 8.5.0(prettier@2.8.8)
tsup:
specifier: 'catalog:'
- version: 8.3.5(jiti@2.4.1)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
+ version: 8.5.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
+ typescript:
+ specifier: 'catalog:'
+ version: 5.6.3
+ vitest:
+ specifier: 'catalog:'
+ version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0)
+
+ packages/theme:
+ dependencies:
+ '@sipe-team/tokens':
+ specifier: workspace:*
+ version: link:../tokens
+ '@vanilla-extract/dynamic':
+ specifier: ^2.1.2
+ version: 2.1.5
+ devDependencies:
+ '@storybook/addon-essentials':
+ specifier: 'catalog:'
+ version: 8.4.6(@types/react@18.3.13)(storybook@8.5.0(prettier@2.8.8))
+ '@storybook/react':
+ specifier: 'catalog:'
+ version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)
+ '@storybook/react-vite':
+ specifier: 'catalog:'
+ version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.60.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
+ '@testing-library/jest-dom':
+ specifier: 'catalog:'
+ version: 6.6.3
+ '@testing-library/react':
+ specifier: 'catalog:'
+ version: 16.0.1(@testing-library/dom@10.4.0)(@types/react-dom@18.3.1)(@types/react@18.3.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@types/react':
+ specifier: ^18.3.12
+ version: 18.3.13
+ '@vanilla-extract/css':
+ specifier: ^1.14.1
+ version: 1.20.1
+ react:
+ specifier: ^18.3.1
+ version: 18.3.1
+ react-dom:
+ specifier: ^18.3.1
+ version: 18.3.1(react@18.3.1)
+ storybook:
+ specifier: 'catalog:'
+ version: 8.5.0(prettier@2.8.8)
+ tsup:
+ specifier: 'catalog:'
+ version: 8.5.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
typescript:
specifier: 'catalog:'
version: 5.6.3
vitest:
specifier: 'catalog:'
- version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(terser@5.37.0)
+ version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0)
packages/tokens:
+ dependencies:
+ '@vanilla-extract/css':
+ specifier: 'catalog:'
+ version: 1.20.1
devDependencies:
- '@faker-js/faker':
- specifier: ^9.2.0
- version: 9.2.0
- '@sipe-team/typography':
- specifier: workspace:*
- version: link:../typography
'@storybook/addon-essentials':
specifier: 'catalog:'
version: 8.4.6(@types/react@18.3.13)(storybook@8.5.0(prettier@2.8.8))
@@ -1230,7 +1406,7 @@ importers:
version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)
'@storybook/react-vite':
specifier: 'catalog:'
- version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.28.0)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))
+ version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.60.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
'@types/react':
specifier: catalog:react
version: 18.3.13
@@ -1245,7 +1421,7 @@ importers:
version: 8.5.0(prettier@2.8.8)
tsup:
specifier: 'catalog:'
- version: 8.3.5(jiti@2.4.1)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
+ version: 8.5.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
typescript:
specifier: 'catalog:'
version: 5.6.3
@@ -1279,7 +1455,7 @@ importers:
version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)
'@storybook/react-vite':
specifier: 'catalog:'
- version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.28.0)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))
+ version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.60.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
'@storybook/test':
specifier: 'catalog:'
version: 8.4.6(storybook@8.5.0(prettier@2.8.8))
@@ -1298,6 +1474,9 @@ importers:
'@types/react-dom':
specifier: catalog:react
version: 18.3.1
+ '@vanilla-extract/css':
+ specifier: 'catalog:'
+ version: 1.20.1
happy-dom:
specifier: 'catalog:'
version: 15.11.7
@@ -1312,13 +1491,13 @@ importers:
version: 8.5.0(prettier@2.8.8)
tsup:
specifier: 'catalog:'
- version: 8.3.5(jiti@2.4.1)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
+ version: 8.5.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
typescript:
specifier: 'catalog:'
version: 5.6.3
vitest:
specifier: 'catalog:'
- version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(terser@5.37.0)
+ version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0)
packages/typography:
dependencies:
@@ -1328,6 +1507,9 @@ importers:
'@sipe-team/tokens':
specifier: workspace:^
version: link:../tokens
+ '@vanilla-extract/dynamic':
+ specifier: ^2.1.3
+ version: 2.1.5
clsx:
specifier: ^2.1.1
version: 2.1.1
@@ -1352,7 +1534,7 @@ importers:
version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)
'@storybook/react-vite':
specifier: 'catalog:'
- version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.28.0)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))
+ version: 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.60.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
'@storybook/test':
specifier: 'catalog:'
version: 8.4.6(storybook@8.5.0(prettier@2.8.8))
@@ -1365,6 +1547,9 @@ importers:
'@types/react':
specifier: catalog:react
version: 18.3.13
+ '@vanilla-extract/css':
+ specifier: 'catalog:'
+ version: 1.20.1
happy-dom:
specifier: 'catalog:'
version: 15.11.7
@@ -1379,22 +1564,22 @@ importers:
version: 8.5.0(prettier@2.8.8)
tsup:
specifier: 'catalog:'
- version: 8.3.5(jiti@2.4.1)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
+ version: 8.5.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1)
typescript:
specifier: 'catalog:'
version: 5.6.3
vitest:
specifier: 'catalog:'
- version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(terser@5.37.0)
+ version: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0)
www:
dependencies:
'@docusaurus/core':
specifier: 3.6.3
- version: 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ version: 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/preset-classic':
specifier: 3.6.3
- version: 3.6.3(@algolia/client-search@5.20.0)(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(@types/react@18.3.13)(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3)
+ version: 3.6.3(@algolia/client-search@5.20.0)(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(@types/react@18.3.13)(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3)
'@mdx-js/react':
specifier: ^3.0.0
version: 3.1.0(@types/react@18.3.13)(react@18.3.1)
@@ -1413,13 +1598,13 @@ importers:
devDependencies:
'@docusaurus/module-type-aliases':
specifier: 3.6.3
- version: 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ version: 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@docusaurus/tsconfig':
specifier: 3.6.3
version: 3.6.3
'@docusaurus/types':
specifier: 3.6.3
- version: 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ version: 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
typescript:
specifier: ~5.6.2
version: 5.6.3
@@ -1553,6 +1738,9 @@ packages:
resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
engines: {node: '>=6.0.0'}
+ '@asamuzakjp/css-color@3.2.0':
+ resolution: {integrity: sha512-K1A6z8tS3XsmCMM86xoWdn7Fkdn9m6RSVtocUrJYIwZnFVkng/PvkEoWtOWmP+Scc6saYWHWZYbndEEXxl24jw==}
+
'@babel/code-frame@7.26.2':
resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
engines: {node: '>=6.9.0'}
@@ -2329,6 +2517,10 @@ packages:
resolution: {integrity: sha512-MKtmkA0BX87PKaO1NFRTFH+UnkgnmySQOvNxJubsadusqPEC2aJ9MOQiMceZJJ6oitUl/i0L6u0M1IrmAOmgBA==}
engines: {node: '>=18'}
+ '@csstools/color-helpers@5.1.0':
+ resolution: {integrity: sha512-S11EXWJyy0Mz5SYvRmY8nJYTFFd1LCNV+7cXyAgQtOOuzb4EsgfqDufL+9esx72/eLhsRdGZwaldu/h+E4t4BA==}
+ engines: {node: '>=18'}
+
'@csstools/css-calc@2.1.1':
resolution: {integrity: sha512-rL7kaUnTkL9K+Cvo2pnCieqNpTKgQzy5f+N+5Iuko9HAoasP+xgprVh7KN/MaJVvVL1l0EzQq2MoqBHKSrDrag==}
engines: {node: '>=18'}
@@ -2336,6 +2528,13 @@ packages:
'@csstools/css-parser-algorithms': ^3.0.4
'@csstools/css-tokenizer': ^3.0.3
+ '@csstools/css-calc@2.1.4':
+ resolution: {integrity: sha512-3N8oaj+0juUw/1H3YwmDDJXCgTB1gKU6Hc/bB502u9zR0q2vd786XJH9QfrKIEgFlZmhZiq6epXl4rHqhzsIgQ==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@csstools/css-parser-algorithms': ^3.0.5
+ '@csstools/css-tokenizer': ^3.0.4
+
'@csstools/css-color-parser@3.0.7':
resolution: {integrity: sha512-nkMp2mTICw32uE5NN+EsJ4f5N+IGFeCFu4bGpiKgb2Pq/7J/MpyLBeQ5ry4KKtRFZaYs6sTmcMYrSRIyj5DFKA==}
engines: {node: '>=18'}
@@ -2343,6 +2542,13 @@ packages:
'@csstools/css-parser-algorithms': ^3.0.4
'@csstools/css-tokenizer': ^3.0.3
+ '@csstools/css-color-parser@3.1.0':
+ resolution: {integrity: sha512-nbtKwh3a6xNVIp/VRuXV64yTKnb1IjTAEEh3irzS+HkKjAOYLTGNb9pmVNntZ8iVBHcWDA2Dof0QtPgFI1BaTA==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ '@csstools/css-parser-algorithms': ^3.0.5
+ '@csstools/css-tokenizer': ^3.0.4
+
'@csstools/css-parser-algorithms@3.0.4':
resolution: {integrity: sha512-Up7rBoV77rv29d3uKHUIVubz1BTcgyUK72IvCQAbfbMv584xHcGKCKbWh7i8hPrRJ7qU4Y8IO3IY9m+iTB7P3A==}
engines: {node: '>=18'}
@@ -2753,6 +2959,18 @@ packages:
resolution: {integrity: sha512-0R/FR3bKVl4yl8QwbL4TYFfR+OXBRpVUaTJdENapBGR3YMwfM6/JnhGilWQO8AOwPJGtGoDK7ib8+8UF9f3OZQ==}
engines: {node: '>=18.0'}
+ '@emnapi/core@1.9.2':
+ resolution: {integrity: sha512-UC+ZhH3XtczQYfOlu3lNEkdW/p4dsJ1r/bP7H8+rhao3TTTMO1ATq/4DdIi23XuGoFY+Cz0JmCbdVl0hz9jZcA==}
+
+ '@emnapi/runtime@1.9.2':
+ resolution: {integrity: sha512-3U4+MIWHImeyu1wnmVygh5WlgfYDtyf0k8AbLhMFxOipihf6nrWC4syIm/SwEeec0mNSafiiNnMJwbza/Is6Lw==}
+
+ '@emnapi/wasi-threads@1.2.1':
+ resolution: {integrity: sha512-uTII7OYF+/Mes/MrcIOYp5yOtSMLBWSIoLPpcgwipoiKbli6k322tcoFsxoIIxPDqW01SQGAgko4EzZi2BNv2w==}
+
+ '@emotion/hash@0.9.2':
+ resolution: {integrity: sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==}
+
'@esbuild/aix-ppc64@0.21.5':
resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==}
engines: {node: '>=12'}
@@ -2771,6 +2989,12 @@ packages:
cpu: [ppc64]
os: [aix]
+ '@esbuild/aix-ppc64@0.27.7':
+ resolution: {integrity: sha512-EKX3Qwmhz1eMdEJokhALr0YiD0lhQNwDqkPYyPhiSwKrh7/4KRjQc04sZ8db+5DVVnZ1LmbNDI1uAMPEUBnQPg==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [aix]
+
'@esbuild/android-arm64@0.21.5':
resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==}
engines: {node: '>=12'}
@@ -2789,6 +3013,12 @@ packages:
cpu: [arm64]
os: [android]
+ '@esbuild/android-arm64@0.27.7':
+ resolution: {integrity: sha512-62dPZHpIXzvChfvfLJow3q5dDtiNMkwiRzPylSCfriLvZeq0a1bWChrGx/BbUbPwOrsWKMn8idSllklzBy+dgQ==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [android]
+
'@esbuild/android-arm@0.21.5':
resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==}
engines: {node: '>=12'}
@@ -2807,6 +3037,12 @@ packages:
cpu: [arm]
os: [android]
+ '@esbuild/android-arm@0.27.7':
+ resolution: {integrity: sha512-jbPXvB4Yj2yBV7HUfE2KHe4GJX51QplCN1pGbYjvsyCZbQmies29EoJbkEc+vYuU5o45AfQn37vZlyXy4YJ8RQ==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [android]
+
'@esbuild/android-x64@0.21.5':
resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==}
engines: {node: '>=12'}
@@ -2825,6 +3061,12 @@ packages:
cpu: [x64]
os: [android]
+ '@esbuild/android-x64@0.27.7':
+ resolution: {integrity: sha512-x5VpMODneVDb70PYV2VQOmIUUiBtY3D3mPBG8NxVk5CogneYhkR7MmM3yR/uMdITLrC1ml/NV1rj4bMJuy9MCg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [android]
+
'@esbuild/darwin-arm64@0.21.5':
resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==}
engines: {node: '>=12'}
@@ -2843,6 +3085,12 @@ packages:
cpu: [arm64]
os: [darwin]
+ '@esbuild/darwin-arm64@0.27.7':
+ resolution: {integrity: sha512-5lckdqeuBPlKUwvoCXIgI2D9/ABmPq3Rdp7IfL70393YgaASt7tbju3Ac+ePVi3KDH6N2RqePfHnXkaDtY9fkw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [darwin]
+
'@esbuild/darwin-x64@0.21.5':
resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==}
engines: {node: '>=12'}
@@ -2861,6 +3109,12 @@ packages:
cpu: [x64]
os: [darwin]
+ '@esbuild/darwin-x64@0.27.7':
+ resolution: {integrity: sha512-rYnXrKcXuT7Z+WL5K980jVFdvVKhCHhUwid+dDYQpH+qu+TefcomiMAJpIiC2EM3Rjtq0sO3StMV/+3w3MyyqQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [darwin]
+
'@esbuild/freebsd-arm64@0.21.5':
resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==}
engines: {node: '>=12'}
@@ -2879,6 +3133,12 @@ packages:
cpu: [arm64]
os: [freebsd]
+ '@esbuild/freebsd-arm64@0.27.7':
+ resolution: {integrity: sha512-B48PqeCsEgOtzME2GbNM2roU29AMTuOIN91dsMO30t+Ydis3z/3Ngoj5hhnsOSSwNzS+6JppqWsuhTp6E82l2w==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [freebsd]
+
'@esbuild/freebsd-x64@0.21.5':
resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==}
engines: {node: '>=12'}
@@ -2897,6 +3157,12 @@ packages:
cpu: [x64]
os: [freebsd]
+ '@esbuild/freebsd-x64@0.27.7':
+ resolution: {integrity: sha512-jOBDK5XEjA4m5IJK3bpAQF9/Lelu/Z9ZcdhTRLf4cajlB+8VEhFFRjWgfy3M1O4rO2GQ/b2dLwCUGpiF/eATNQ==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [freebsd]
+
'@esbuild/linux-arm64@0.21.5':
resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==}
engines: {node: '>=12'}
@@ -2915,6 +3181,12 @@ packages:
cpu: [arm64]
os: [linux]
+ '@esbuild/linux-arm64@0.27.7':
+ resolution: {integrity: sha512-RZPHBoxXuNnPQO9rvjh5jdkRmVizktkT7TCDkDmQ0W2SwHInKCAV95GRuvdSvA7w4VMwfCjUiPwDi0ZO6Nfe9A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [linux]
+
'@esbuild/linux-arm@0.21.5':
resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==}
engines: {node: '>=12'}
@@ -2933,6 +3205,12 @@ packages:
cpu: [arm]
os: [linux]
+ '@esbuild/linux-arm@0.27.7':
+ resolution: {integrity: sha512-RkT/YXYBTSULo3+af8Ib0ykH8u2MBh57o7q/DAs3lTJlyVQkgQvlrPTnjIzzRPQyavxtPtfg0EopvDyIt0j1rA==}
+ engines: {node: '>=18'}
+ cpu: [arm]
+ os: [linux]
+
'@esbuild/linux-ia32@0.21.5':
resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==}
engines: {node: '>=12'}
@@ -2951,6 +3229,12 @@ packages:
cpu: [ia32]
os: [linux]
+ '@esbuild/linux-ia32@0.27.7':
+ resolution: {integrity: sha512-GA48aKNkyQDbd3KtkplYWT102C5sn/EZTY4XROkxONgruHPU72l+gW+FfF8tf2cFjeHaRbWpOYa/uRBz/Xq1Pg==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [linux]
+
'@esbuild/linux-loong64@0.21.5':
resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==}
engines: {node: '>=12'}
@@ -2969,6 +3253,12 @@ packages:
cpu: [loong64]
os: [linux]
+ '@esbuild/linux-loong64@0.27.7':
+ resolution: {integrity: sha512-a4POruNM2oWsD4WKvBSEKGIiWQF8fZOAsycHOt6JBpZ+JN2n2JH9WAv56SOyu9X5IqAjqSIPTaJkqN8F7XOQ5Q==}
+ engines: {node: '>=18'}
+ cpu: [loong64]
+ os: [linux]
+
'@esbuild/linux-mips64el@0.21.5':
resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==}
engines: {node: '>=12'}
@@ -2987,6 +3277,12 @@ packages:
cpu: [mips64el]
os: [linux]
+ '@esbuild/linux-mips64el@0.27.7':
+ resolution: {integrity: sha512-KabT5I6StirGfIz0FMgl1I+R1H73Gp0ofL9A3nG3i/cYFJzKHhouBV5VWK1CSgKvVaG4q1RNpCTR2LuTVB3fIw==}
+ engines: {node: '>=18'}
+ cpu: [mips64el]
+ os: [linux]
+
'@esbuild/linux-ppc64@0.21.5':
resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==}
engines: {node: '>=12'}
@@ -3005,9 +3301,15 @@ packages:
cpu: [ppc64]
os: [linux]
- '@esbuild/linux-riscv64@0.21.5':
- resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==}
- engines: {node: '>=12'}
+ '@esbuild/linux-ppc64@0.27.7':
+ resolution: {integrity: sha512-gRsL4x6wsGHGRqhtI+ifpN/vpOFTQtnbsupUF5R5YTAg+y/lKelYR1hXbnBdzDjGbMYjVJLJTd2OFmMewAgwlQ==}
+ engines: {node: '>=18'}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@esbuild/linux-riscv64@0.21.5':
+ resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==}
+ engines: {node: '>=12'}
cpu: [riscv64]
os: [linux]
@@ -3023,6 +3325,12 @@ packages:
cpu: [riscv64]
os: [linux]
+ '@esbuild/linux-riscv64@0.27.7':
+ resolution: {integrity: sha512-hL25LbxO1QOngGzu2U5xeXtxXcW+/GvMN3ejANqXkxZ/opySAZMrc+9LY/WyjAan41unrR3YrmtTsUpwT66InQ==}
+ engines: {node: '>=18'}
+ cpu: [riscv64]
+ os: [linux]
+
'@esbuild/linux-s390x@0.21.5':
resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==}
engines: {node: '>=12'}
@@ -3041,6 +3349,12 @@ packages:
cpu: [s390x]
os: [linux]
+ '@esbuild/linux-s390x@0.27.7':
+ resolution: {integrity: sha512-2k8go8Ycu1Kb46vEelhu1vqEP+UeRVj2zY1pSuPdgvbd5ykAw82Lrro28vXUrRmzEsUV0NzCf54yARIK8r0fdw==}
+ engines: {node: '>=18'}
+ cpu: [s390x]
+ os: [linux]
+
'@esbuild/linux-x64@0.21.5':
resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==}
engines: {node: '>=12'}
@@ -3059,6 +3373,18 @@ packages:
cpu: [x64]
os: [linux]
+ '@esbuild/linux-x64@0.27.7':
+ resolution: {integrity: sha512-hzznmADPt+OmsYzw1EE33ccA+HPdIqiCRq7cQeL1Jlq2gb1+OyWBkMCrYGBJ+sxVzve2ZJEVeePbLM2iEIZSxA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [linux]
+
+ '@esbuild/netbsd-arm64@0.27.7':
+ resolution: {integrity: sha512-b6pqtrQdigZBwZxAn1UpazEisvwaIDvdbMbmrly7cDTMFnw/+3lVxxCTGOrkPVnsYIosJJXAsILG9XcQS+Yu6w==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [netbsd]
+
'@esbuild/netbsd-x64@0.21.5':
resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==}
engines: {node: '>=12'}
@@ -3077,6 +3403,12 @@ packages:
cpu: [x64]
os: [netbsd]
+ '@esbuild/netbsd-x64@0.27.7':
+ resolution: {integrity: sha512-OfatkLojr6U+WN5EDYuoQhtM+1xco+/6FSzJJnuWiUw5eVcicbyK3dq5EeV/QHT1uy6GoDhGbFpprUiHUYggrw==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [netbsd]
+
'@esbuild/openbsd-arm64@0.23.1':
resolution: {integrity: sha512-3x37szhLexNA4bXhLrCC/LImN/YtWis6WXr1VESlfVtVeoFJBRINPJ3f0a/6LV8zpikqoUg4hyXw0sFBt5Cr+Q==}
engines: {node: '>=18'}
@@ -3089,6 +3421,12 @@ packages:
cpu: [arm64]
os: [openbsd]
+ '@esbuild/openbsd-arm64@0.27.7':
+ resolution: {integrity: sha512-AFuojMQTxAz75Fo8idVcqoQWEHIXFRbOc1TrVcFSgCZtQfSdc1RXgB3tjOn/krRHENUB4j00bfGjyl2mJrU37A==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openbsd]
+
'@esbuild/openbsd-x64@0.21.5':
resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==}
engines: {node: '>=12'}
@@ -3107,6 +3445,18 @@ packages:
cpu: [x64]
os: [openbsd]
+ '@esbuild/openbsd-x64@0.27.7':
+ resolution: {integrity: sha512-+A1NJmfM8WNDv5CLVQYJ5PshuRm/4cI6WMZRg1by1GwPIQPCTs1GLEUHwiiQGT5zDdyLiRM/l1G0Pv54gvtKIg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@esbuild/openharmony-arm64@0.27.7':
+ resolution: {integrity: sha512-+KrvYb/C8zA9CU/g0sR6w2RBw7IGc5J2BPnc3dYc5VJxHCSF1yNMxTV5LQ7GuKteQXZtspjFbiuW5/dOj7H4Yw==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [openharmony]
+
'@esbuild/sunos-x64@0.21.5':
resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==}
engines: {node: '>=12'}
@@ -3125,6 +3475,12 @@ packages:
cpu: [x64]
os: [sunos]
+ '@esbuild/sunos-x64@0.27.7':
+ resolution: {integrity: sha512-ikktIhFBzQNt/QDyOL580ti9+5mL/YZeUPKU2ivGtGjdTYoqz6jObj6nOMfhASpS4GU4Q/Clh1QtxWAvcYKamA==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [sunos]
+
'@esbuild/win32-arm64@0.21.5':
resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==}
engines: {node: '>=12'}
@@ -3143,6 +3499,12 @@ packages:
cpu: [arm64]
os: [win32]
+ '@esbuild/win32-arm64@0.27.7':
+ resolution: {integrity: sha512-7yRhbHvPqSpRUV7Q20VuDwbjW5kIMwTHpptuUzV+AA46kiPze5Z7qgt6CLCK3pWFrHeNfDd1VKgyP4O+ng17CA==}
+ engines: {node: '>=18'}
+ cpu: [arm64]
+ os: [win32]
+
'@esbuild/win32-ia32@0.21.5':
resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==}
engines: {node: '>=12'}
@@ -3161,6 +3523,12 @@ packages:
cpu: [ia32]
os: [win32]
+ '@esbuild/win32-ia32@0.27.7':
+ resolution: {integrity: sha512-SmwKXe6VHIyZYbBLJrhOoCJRB/Z1tckzmgTLfFYOfpMAx63BJEaL9ExI8x7v0oAO3Zh6D/Oi1gVxEYr5oUCFhw==}
+ engines: {node: '>=18'}
+ cpu: [ia32]
+ os: [win32]
+
'@esbuild/win32-x64@0.21.5':
resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==}
engines: {node: '>=12'}
@@ -3179,6 +3547,12 @@ packages:
cpu: [x64]
os: [win32]
+ '@esbuild/win32-x64@0.27.7':
+ resolution: {integrity: sha512-56hiAJPhwQ1R4i+21FVF7V8kSD5zZTdHcVuRFMW0hn753vVfQN8xlx4uOPT4xoGH0Z/oVATuR82AiqSTDIpaHg==}
+ engines: {node: '>=18'}
+ cpu: [x64]
+ os: [win32]
+
'@eslint-community/eslint-utils@4.4.1':
resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -3294,6 +3668,9 @@ packages:
'@jridgewell/sourcemap-codec@1.5.0':
resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
+ '@jridgewell/sourcemap-codec@1.5.5':
+ resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
+
'@jridgewell/trace-mapping@0.3.25':
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
@@ -3315,6 +3692,12 @@ packages:
'@types/react': '>=16'
react: '>=16'
+ '@napi-rs/wasm-runtime@1.1.3':
+ resolution: {integrity: sha512-xK9sGVbJWYb08+mTJt3/YV24WxvxpXcXtP6B172paPZ+Ts69Re9dAr7lKwJoeIx8OoeuimEiRZ7umkiUVClmmQ==}
+ peerDependencies:
+ '@emnapi/core': ^1.7.1
+ '@emnapi/runtime': ^1.7.1
+
'@nodelib/fs.scandir@2.1.5':
resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==}
engines: {node: '>= 8'}
@@ -3327,6 +3710,9 @@ packages:
resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==}
engines: {node: '>= 8'}
+ '@oxc-project/types@0.124.0':
+ resolution: {integrity: sha512-VBFWMTBvHxS11Z5Lvlr3IWgrwhMTXV+Md+EQF0Xf60+wAdsGFTBx7X7K/hP4pi8N7dcm1RvcHwDxZ16Qx8keUg==}
+
'@pkgjs/parseargs@0.11.0':
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
@@ -3364,6 +3750,125 @@ packages:
'@types/react':
optional: true
+ '@radix-ui/react-use-controllable-state@1.2.2':
+ resolution: {integrity: sha512-BjasUjixPFdS+NKkypcyyN5Pmg83Olst0+c6vGov0diwTEo6mgdqVR6hxcEgFuh4QrAs7Rc+9KuGJ9TVCj0Zzg==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-effect-event@0.0.2':
+ resolution: {integrity: sha512-Qp8WbZOBe+blgpuUT+lw2xheLP8q0oatc9UpmiemEICxGvFLYmHm9QowVZGHtJlGbS6A6yJ3iViad/2cVjnOiA==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@radix-ui/react-use-layout-effect@1.1.1':
+ resolution: {integrity: sha512-RbJRS4UWQFkzHTTwVymMTUv8EqYhOp8dOOviLj2ugtTiXRaRQS7GLGxZTLL1jWhMeoSCf5zmcZkqTl9IiYfXcQ==}
+ peerDependencies:
+ '@types/react': '*'
+ react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
+ peerDependenciesMeta:
+ '@types/react':
+ optional: true
+
+ '@rolldown/binding-android-arm64@1.0.0-rc.15':
+ resolution: {integrity: sha512-YYe6aWruPZDtHNpwu7+qAHEMbQ/yRl6atqb/AhznLTnD3UY99Q1jE7ihLSahNWkF4EqRPVC4SiR4O0UkLK02tA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [android]
+
+ '@rolldown/binding-darwin-arm64@1.0.0-rc.15':
+ resolution: {integrity: sha512-oArR/ig8wNTPYsXL+Mzhs0oxhxfuHRfG7Ikw7jXsw8mYOtk71W0OkF2VEVh699pdmzjPQsTjlD1JIOoHkLP1Fg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [darwin]
+
+ '@rolldown/binding-darwin-x64@1.0.0-rc.15':
+ resolution: {integrity: sha512-YzeVqOqjPYvUbJSWJ4EDL8ahbmsIXQpgL3JVipmN+MX0XnXMeWomLN3Fb+nwCmP/jfyqte5I3XRSm7OfQrbyxw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [darwin]
+
+ '@rolldown/binding-freebsd-x64@1.0.0-rc.15':
+ resolution: {integrity: sha512-9Erhx956jeQ0nNTyif1+QWAXDRD38ZNjr//bSHrt6wDwB+QkAfl2q6Mn1k6OBPerznjRmbM10lgRb1Pli4xZPw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [freebsd]
+
+ '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.15':
+ resolution: {integrity: sha512-cVwk0w8QbZJGTnP/AHQBs5yNwmpgGYStL88t4UIaqcvYJWBfS0s3oqVLZPwsPU6M0zlW4GqjP0Zq5MnAGwFeGA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm]
+ os: [linux]
+
+ '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.15':
+ resolution: {integrity: sha512-eBZ/u8iAK9SoHGanqe/jrPnY0JvBN6iXbVOsbO38mbz+ZJsaobExAm1Iu+rxa4S1l2FjG0qEZn4Rc6X8n+9M+w==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rolldown/binding-linux-arm64-musl@1.0.0-rc.15':
+ resolution: {integrity: sha512-ZvRYMGrAklV9PEkgt4LQM6MjQX2P58HPAuecwYObY2DhS2t35R0I810bKi0wmaYORt6m/2Sm+Z+nFgb0WhXNcQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.15':
+ resolution: {integrity: sha512-VDpgGBzgfg5hLg+uBpCLoFG5kVvEyafmfxGUV0UHLcL5irxAK7PKNeC2MwClgk6ZAiNhmo9FLhRYgvMmedLtnQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.15':
+ resolution: {integrity: sha512-y1uXY3qQWCzcPgRJATPSOUP4tCemh4uBdY7e3EZbVwCJTY3gLJWnQABgeUetvED+bt1FQ01OeZwvhLS2bpNrAQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [s390x]
+ os: [linux]
+
+ '@rolldown/binding-linux-x64-gnu@1.0.0-rc.15':
+ resolution: {integrity: sha512-023bTPBod7J3Y/4fzAN6QtpkSABR0rigtrwaP+qSEabUh5zf6ELr9Nc7GujaROuPY3uwdSIXWrvhn1KxOvurWA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@rolldown/binding-linux-x64-musl@1.0.0-rc.15':
+ resolution: {integrity: sha512-witB2O0/hU4CgfOOKUoeFgQ4GktPi1eEbAhaLAIpgD6+ZnhcPkUtPsoKKHRzmOoWPZue46IThdSgdo4XneOLYw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [linux]
+
+ '@rolldown/binding-openharmony-arm64@1.0.0-rc.15':
+ resolution: {integrity: sha512-UCL68NJ0Ud5zRipXZE9dF5PmirzJE4E4BCIOOssEnM7wLDsxjc6Qb0sGDxTNRTP53I6MZpygyCpY8Aa8sPfKPg==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [openharmony]
+
+ '@rolldown/binding-wasm32-wasi@1.0.0-rc.15':
+ resolution: {integrity: sha512-ApLruZq/ig+nhaE7OJm4lDjayUnOHVUa77zGeqnqZ9pn0ovdVbbNPerVibLXDmWeUZXjIYIT8V3xkT58Rm9u5Q==}
+ engines: {node: '>=14.0.0'}
+ cpu: [wasm32]
+
+ '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15':
+ resolution: {integrity: sha512-KmoUoU7HnN+Si5YWJigfTws1jz1bKBYDQKdbLspz0UaqjjFkddHsqorgiW1mxcAj88lYUE6NC/zJNwT+SloqtA==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [arm64]
+ os: [win32]
+
+ '@rolldown/binding-win32-x64-msvc@1.0.0-rc.15':
+ resolution: {integrity: sha512-3P2A8L+x75qavWLe/Dll3EYBJLQmtkJN8rfh+U/eR3MqMgL/h98PhYI+JFfXuDPgPeCB7iZAKiqii5vqOvnA0g==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ cpu: [x64]
+ os: [win32]
+
+ '@rolldown/pluginutils@1.0.0-rc.15':
+ resolution: {integrity: sha512-UromN0peaE53IaBRe9W7CjrZgXl90fqGpK+mIZbA3qSTeYqg3pqpROBdIPvOG3F5ereDHNwoHBI2e50n1BDr1g==}
+
'@rollup/pluginutils@5.1.3':
resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==}
engines: {node: '>=14.0.0'}
@@ -3378,91 +3883,216 @@ packages:
cpu: [arm]
os: [android]
+ '@rollup/rollup-android-arm-eabi@4.60.1':
+ resolution: {integrity: sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==}
+ cpu: [arm]
+ os: [android]
+
'@rollup/rollup-android-arm64@4.28.0':
resolution: {integrity: sha512-eiNkznlo0dLmVG/6wf+Ifi/v78G4d4QxRhuUl+s8EWZpDewgk7PX3ZyECUXU0Zq/Ca+8nU8cQpNC4Xgn2gFNDA==}
cpu: [arm64]
os: [android]
+ '@rollup/rollup-android-arm64@4.60.1':
+ resolution: {integrity: sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==}
+ cpu: [arm64]
+ os: [android]
+
'@rollup/rollup-darwin-arm64@4.28.0':
resolution: {integrity: sha512-lmKx9yHsppblnLQZOGxdO66gT77bvdBtr/0P+TPOseowE7D9AJoBw8ZDULRasXRWf1Z86/gcOdpBrV6VDUY36Q==}
cpu: [arm64]
os: [darwin]
+ '@rollup/rollup-darwin-arm64@4.60.1':
+ resolution: {integrity: sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==}
+ cpu: [arm64]
+ os: [darwin]
+
'@rollup/rollup-darwin-x64@4.28.0':
resolution: {integrity: sha512-8hxgfReVs7k9Js1uAIhS6zq3I+wKQETInnWQtgzt8JfGx51R1N6DRVy3F4o0lQwumbErRz52YqwjfvuwRxGv1w==}
cpu: [x64]
os: [darwin]
+ '@rollup/rollup-darwin-x64@4.60.1':
+ resolution: {integrity: sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==}
+ cpu: [x64]
+ os: [darwin]
+
'@rollup/rollup-freebsd-arm64@4.28.0':
resolution: {integrity: sha512-lA1zZB3bFx5oxu9fYud4+g1mt+lYXCoch0M0V/xhqLoGatbzVse0wlSQ1UYOWKpuSu3gyN4qEc0Dxf/DII1bhQ==}
cpu: [arm64]
os: [freebsd]
+ '@rollup/rollup-freebsd-arm64@4.60.1':
+ resolution: {integrity: sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==}
+ cpu: [arm64]
+ os: [freebsd]
+
'@rollup/rollup-freebsd-x64@4.28.0':
resolution: {integrity: sha512-aI2plavbUDjCQB/sRbeUZWX9qp12GfYkYSJOrdYTL/C5D53bsE2/nBPuoiJKoWp5SN78v2Vr8ZPnB+/VbQ2pFA==}
cpu: [x64]
os: [freebsd]
+ '@rollup/rollup-freebsd-x64@4.60.1':
+ resolution: {integrity: sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==}
+ cpu: [x64]
+ os: [freebsd]
+
'@rollup/rollup-linux-arm-gnueabihf@4.28.0':
resolution: {integrity: sha512-WXveUPKtfqtaNvpf0iOb0M6xC64GzUX/OowbqfiCSXTdi/jLlOmH0Ba94/OkiY2yTGTwteo4/dsHRfh5bDCZ+w==}
cpu: [arm]
os: [linux]
+ '@rollup/rollup-linux-arm-gnueabihf@4.60.1':
+ resolution: {integrity: sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==}
+ cpu: [arm]
+ os: [linux]
+
'@rollup/rollup-linux-arm-musleabihf@4.28.0':
resolution: {integrity: sha512-yLc3O2NtOQR67lI79zsSc7lk31xjwcaocvdD1twL64PK1yNaIqCeWI9L5B4MFPAVGEVjH5k1oWSGuYX1Wutxpg==}
cpu: [arm]
os: [linux]
+ '@rollup/rollup-linux-arm-musleabihf@4.60.1':
+ resolution: {integrity: sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==}
+ cpu: [arm]
+ os: [linux]
+
'@rollup/rollup-linux-arm64-gnu@4.28.0':
resolution: {integrity: sha512-+P9G9hjEpHucHRXqesY+3X9hD2wh0iNnJXX/QhS/J5vTdG6VhNYMxJ2rJkQOxRUd17u5mbMLHM7yWGZdAASfcg==}
cpu: [arm64]
os: [linux]
+ '@rollup/rollup-linux-arm64-gnu@4.60.1':
+ resolution: {integrity: sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==}
+ cpu: [arm64]
+ os: [linux]
+
'@rollup/rollup-linux-arm64-musl@4.28.0':
resolution: {integrity: sha512-1xsm2rCKSTpKzi5/ypT5wfc+4bOGa/9yI/eaOLW0oMs7qpC542APWhl4A37AENGZ6St6GBMWhCCMM6tXgTIplw==}
cpu: [arm64]
os: [linux]
+ '@rollup/rollup-linux-arm64-musl@4.60.1':
+ resolution: {integrity: sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==}
+ cpu: [arm64]
+ os: [linux]
+
+ '@rollup/rollup-linux-loong64-gnu@4.60.1':
+ resolution: {integrity: sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==}
+ cpu: [loong64]
+ os: [linux]
+
+ '@rollup/rollup-linux-loong64-musl@4.60.1':
+ resolution: {integrity: sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==}
+ cpu: [loong64]
+ os: [linux]
+
'@rollup/rollup-linux-powerpc64le-gnu@4.28.0':
resolution: {integrity: sha512-zgWxMq8neVQeXL+ouSf6S7DoNeo6EPgi1eeqHXVKQxqPy1B2NvTbaOUWPn/7CfMKL7xvhV0/+fq/Z/J69g1WAQ==}
cpu: [ppc64]
os: [linux]
+ '@rollup/rollup-linux-ppc64-gnu@4.60.1':
+ resolution: {integrity: sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==}
+ cpu: [ppc64]
+ os: [linux]
+
+ '@rollup/rollup-linux-ppc64-musl@4.60.1':
+ resolution: {integrity: sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==}
+ cpu: [ppc64]
+ os: [linux]
+
'@rollup/rollup-linux-riscv64-gnu@4.28.0':
resolution: {integrity: sha512-VEdVYacLniRxbRJLNtzwGt5vwS0ycYshofI7cWAfj7Vg5asqj+pt+Q6x4n+AONSZW/kVm+5nklde0qs2EUwU2g==}
cpu: [riscv64]
os: [linux]
+ '@rollup/rollup-linux-riscv64-gnu@4.60.1':
+ resolution: {integrity: sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==}
+ cpu: [riscv64]
+ os: [linux]
+
+ '@rollup/rollup-linux-riscv64-musl@4.60.1':
+ resolution: {integrity: sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==}
+ cpu: [riscv64]
+ os: [linux]
+
'@rollup/rollup-linux-s390x-gnu@4.28.0':
resolution: {integrity: sha512-LQlP5t2hcDJh8HV8RELD9/xlYtEzJkm/aWGsauvdO2ulfl3QYRjqrKW+mGAIWP5kdNCBheqqqYIGElSRCaXfpw==}
cpu: [s390x]
os: [linux]
+ '@rollup/rollup-linux-s390x-gnu@4.60.1':
+ resolution: {integrity: sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==}
+ cpu: [s390x]
+ os: [linux]
+
'@rollup/rollup-linux-x64-gnu@4.28.0':
resolution: {integrity: sha512-Nl4KIzteVEKE9BdAvYoTkW19pa7LR/RBrT6F1dJCV/3pbjwDcaOq+edkP0LXuJ9kflW/xOK414X78r+K84+msw==}
cpu: [x64]
os: [linux]
+ '@rollup/rollup-linux-x64-gnu@4.60.1':
+ resolution: {integrity: sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==}
+ cpu: [x64]
+ os: [linux]
+
'@rollup/rollup-linux-x64-musl@4.28.0':
resolution: {integrity: sha512-eKpJr4vBDOi4goT75MvW+0dXcNUqisK4jvibY9vDdlgLx+yekxSm55StsHbxUsRxSTt3JEQvlr3cGDkzcSP8bw==}
cpu: [x64]
os: [linux]
+ '@rollup/rollup-linux-x64-musl@4.60.1':
+ resolution: {integrity: sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==}
+ cpu: [x64]
+ os: [linux]
+
+ '@rollup/rollup-openbsd-x64@4.60.1':
+ resolution: {integrity: sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==}
+ cpu: [x64]
+ os: [openbsd]
+
+ '@rollup/rollup-openharmony-arm64@4.60.1':
+ resolution: {integrity: sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==}
+ cpu: [arm64]
+ os: [openharmony]
+
'@rollup/rollup-win32-arm64-msvc@4.28.0':
resolution: {integrity: sha512-Vi+WR62xWGsE/Oj+mD0FNAPY2MEox3cfyG0zLpotZdehPFXwz6lypkGs5y38Jd/NVSbOD02aVad6q6QYF7i8Bg==}
cpu: [arm64]
os: [win32]
+ '@rollup/rollup-win32-arm64-msvc@4.60.1':
+ resolution: {integrity: sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==}
+ cpu: [arm64]
+ os: [win32]
+
'@rollup/rollup-win32-ia32-msvc@4.28.0':
resolution: {integrity: sha512-kN/Vpip8emMLn/eOza+4JwqDZBL6MPNpkdaEsgUtW1NYN3DZvZqSQrbKzJcTL6hd8YNmFTn7XGWMwccOcJBL0A==}
cpu: [ia32]
os: [win32]
+ '@rollup/rollup-win32-ia32-msvc@4.60.1':
+ resolution: {integrity: sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==}
+ cpu: [ia32]
+ os: [win32]
+
+ '@rollup/rollup-win32-x64-gnu@4.60.1':
+ resolution: {integrity: sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==}
+ cpu: [x64]
+ os: [win32]
+
'@rollup/rollup-win32-x64-msvc@4.28.0':
resolution: {integrity: sha512-Bvno2/aZT6usSa7lRDL2+hMjVAGjuqaymF1ApZm31JXzniR/hvr14jpU+/z4X6Gt5BPlzosscyJZGUvguXIqeQ==}
cpu: [x64]
os: [win32]
+ '@rollup/rollup-win32-x64-msvc@4.60.1':
+ resolution: {integrity: sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==}
+ cpu: [x64]
+ os: [win32]
+
'@sideway/address@4.1.5':
resolution: {integrity: sha512-IqO/DUQHUkPeixNQ8n0JA6102hT9CmaljNTPmQ1u8MEhBo/R4Q8eKLN/vGZxuebwOroDB4cbpjheD4+/sKFK4Q==}
@@ -3814,6 +4444,12 @@ packages:
peerDependencies:
'@testing-library/dom': '>=7.21.4'
+ '@testing-library/user-event@14.6.1':
+ resolution: {integrity: sha512-vq7fv0rnt+QTXgPxr5Hjc210p6YKq2kmdziLgnsZGgLJ9e6VAShx1pACLuRjd/AS/sr7phAR58OIIpf0LlmQNw==}
+ engines: {node: '>=12', npm: '>=6'}
+ peerDependencies:
+ '@testing-library/dom': '>=7.21.4'
+
'@trysound/sax@0.2.0':
resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==}
engines: {node: '>=10.13.0'}
@@ -3821,6 +4457,9 @@ packages:
'@tsconfig/strictest@2.0.5':
resolution: {integrity: sha512-ec4tjL2Rr0pkZ5hww65c+EEPYwxOi4Ryv+0MtjeaSQRJyq322Q27eOQiFbuNgw2hpL4hB1/W/HBGk3VKS43osg==}
+ '@tybys/wasm-util@0.10.1':
+ resolution: {integrity: sha512-9tTaPJLSiejZKx+Bmog4uSubteqTvFrVrURwkmHixBo0G4seD0zUxp98E1DzUBJxLQ3NPwXrGKDiVjwx/DpPsg==}
+
'@types/acorn@4.0.6':
resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==}
@@ -3866,15 +4505,15 @@ packages:
'@types/eslint@9.6.1':
resolution: {integrity: sha512-FXx2pKgId/WyYo2jXw63kk7/+TY7u7AziEJxJAnSFzHlqTAS3Ync6SvgYAN/k4/PQpnnVuzoMuVnByKK2qp0ag==}
- '@types/eslint__eslintrc@2.1.2':
- resolution: {integrity: sha512-qXvzPFY7Rz05xD8ZApXJ3S8xStQD2Ibzu3EFIF0UMNOAfLY5xUu3H61q0JrHo2OXD6rcFG75yUxNQbkKtFKBSw==}
-
'@types/estree-jsx@1.0.5':
resolution: {integrity: sha512-52CcUVNFyfb1A2ALocQw/Dd1BQFNmSdkuC3BkZ6iqhdMfQz7JWOFRuJFloOzjk+6WijU56m9oKXFAXc7o3Towg==}
'@types/estree@1.0.6':
resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
+ '@types/estree@1.0.8':
+ resolution: {integrity: sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==}
+
'@types/express-serve-static-core@4.19.6':
resolution: {integrity: sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A==}
@@ -4010,80 +4649,44 @@ packages:
'@types/yargs@17.0.33':
resolution: {integrity: sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==}
- '@typescript-eslint/eslint-plugin@8.22.0':
- resolution: {integrity: sha512-4Uta6REnz/xEJMvwf72wdUnC3rr4jAQf5jnTkeRQ9b6soxLxhDEbS/pfMPoJLDfFPNVRdryqWUIV/2GZzDJFZw==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0
- eslint: ^8.57.0 || ^9.0.0
- typescript: '>=4.8.4 <5.8.0'
+ '@ungap/structured-clone@1.3.0':
+ resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
- '@typescript-eslint/parser@8.19.0':
- resolution: {integrity: sha512-6M8taKyOETY1TKHp0x8ndycipTVgmp4xtg5QpEZzXxDhNvvHOJi5rLRkLr8SK3jTgD5l4fTlvBiRdfsuWydxBw==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- eslint: ^8.57.0 || ^9.0.0
- typescript: '>=4.8.4 <5.8.0'
+ '@vanilla-extract/babel-plugin-debug-ids@1.2.2':
+ resolution: {integrity: sha512-MeDWGICAF9zA/OZLOKwhoRlsUW+fiMwnfuOAqFVohL31Agj7Q/RBWAYweqjHLgFBCsdnr6XIfwjJnmb2znEWxw==}
- '@typescript-eslint/parser@8.22.0':
- resolution: {integrity: sha512-MqtmbdNEdoNxTPzpWiWnqNac54h8JDAmkWtJExBVVnSrSmi9z+sZUt0LfKqk9rjqmKOIeRhO4fHHJ1nQIjduIQ==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- eslint: ^8.57.0 || ^9.0.0
- typescript: '>=4.8.4 <5.8.0'
+ '@vanilla-extract/compiler@0.7.0':
+ resolution: {integrity: sha512-rZQ40HVmsxfGLjoflwwsaUBLfpbpKDoZC19oiDA0FHq4LdrYtyVbFkc0MfqkNo/qBCvaZfsRezCqk0QQxCqZ8w==}
- '@typescript-eslint/scope-manager@8.19.0':
- resolution: {integrity: sha512-hkoJiKQS3GQ13TSMEiuNmSCvhz7ujyqD1x3ShbaETATHrck+9RaDdUbt+osXaUuns9OFwrDTTrjtwsU8gJyyRA==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@vanilla-extract/css@1.20.1':
+ resolution: {integrity: sha512-5I9RNo5uZW9tsBnqrWzJqELegOqTHBrZyDFnES0gR9gJJHBB9dom1N0bwITM9tKwBcfKrTX4a6DHVeQdJ2ubQA==}
- '@typescript-eslint/scope-manager@8.22.0':
- resolution: {integrity: sha512-/lwVV0UYgkj7wPSw0o8URy6YI64QmcOdwHuGuxWIYznO6d45ER0wXUbksr9pYdViAofpUCNJx/tAzNukgvaaiQ==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@vanilla-extract/dynamic@2.1.5':
+ resolution: {integrity: sha512-QGIFGb1qyXQkbzx6X6i3+3LMc/iv/ZMBttMBL+Wm/DetQd36KsKsFg5CtH3qy+1hCA/5w93mEIIAiL4fkM8ycw==}
- '@typescript-eslint/type-utils@8.22.0':
- resolution: {integrity: sha512-NzE3aB62fDEaGjaAYZE4LH7I1MUwHooQ98Byq0G0y3kkibPJQIXVUspzlFOmOfHhiDLwKzMlWxaNv+/qcZurJA==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@vanilla-extract/esbuild-plugin@2.3.22':
+ resolution: {integrity: sha512-unxruCeuGR2BpmEuSV49++V4whdX7uPWADIiPwAe6zEOXwPrXQK+VtXjjZ/yN40vGfE7OJP/4WSDM5RuYX4LoQ==}
peerDependencies:
- eslint: ^8.57.0 || ^9.0.0
- typescript: '>=4.8.4 <5.8.0'
-
- '@typescript-eslint/types@8.19.0':
- resolution: {integrity: sha512-8XQ4Ss7G9WX8oaYvD4OOLCjIQYgRQxO+qCiR2V2s2GxI9AUpo7riNwo6jDhKtTcaJjT8PY54j2Yb33kWtSJsmA==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ esbuild: '>=0.17.6'
+ peerDependenciesMeta:
+ esbuild:
+ optional: true
- '@typescript-eslint/types@8.22.0':
- resolution: {integrity: sha512-0S4M4baNzp612zwpD4YOieP3VowOARgK2EkN/GBn95hpyF8E2fbMT55sRHWBq+Huaqk3b3XK+rxxlM8sPgGM6A==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@vanilla-extract/integration@8.0.10':
+ resolution: {integrity: sha512-01IB5gbrgTe8IIrtfRXXTmACl5D8Enzqp2cKbCWaMKXmnoilXXVCPbJoA96q88PXkNDXsXepCxUugMvEmL3c7A==}
- '@typescript-eslint/typescript-estree@8.19.0':
- resolution: {integrity: sha512-WW9PpDaLIFW9LCbucMSdYUuGeFUz1OkWYS/5fwZwTA+l2RwlWFdJvReQqMUMBw4yJWJOfqd7An9uwut2Oj8sLw==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- typescript: '>=4.8.4 <5.8.0'
+ '@vanilla-extract/private@1.0.9':
+ resolution: {integrity: sha512-gT2jbfZuaaCLrAxwXbRgIhGhcXbRZCG3v4TTUnjw0EJ7ArdBRxkq4msNJkbuRkCgfIK5ATmprB5t9ljvLeFDEA==}
- '@typescript-eslint/typescript-estree@8.22.0':
- resolution: {integrity: sha512-SJX99NAS2ugGOzpyhMza/tX+zDwjvwAtQFLsBo3GQxiGcvaKlqGBkmZ+Y1IdiSi9h4Q0Lr5ey+Cp9CGWNY/F/w==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@vanilla-extract/recipes@0.5.7':
+ resolution: {integrity: sha512-Fvr+htdyb6LVUu+PhH61UFPhwkjgDEk8L4Zq9oIdte42sntpKrgFy90MyTRtGwjVALmrJ0pwRUVr8UoByYeW8A==}
peerDependencies:
- typescript: '>=4.8.4 <5.8.0'
+ '@vanilla-extract/css': ^1.0.0
- '@typescript-eslint/utils@8.22.0':
- resolution: {integrity: sha512-T8oc1MbF8L+Bk2msAvCUzjxVB2Z2f+vXYfcucE2wOmYs7ZUwco5Ep0fYZw8quNwOiw9K8GYVL+Kgc2pETNTLOg==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
+ '@vanilla-extract/vite-plugin@5.2.2':
+ resolution: {integrity: sha512-AUyB4fDR2b/Mo0lcXhhlf6RxnDPYwFMyKKopalJ4BwQNKYzZSoTwHJ1PLPO9SKhpz7lzXc0Z18GHQZOewzl3YA==}
peerDependencies:
- eslint: ^8.57.0 || ^9.0.0
- typescript: '>=4.8.4 <5.8.0'
-
- '@typescript-eslint/visitor-keys@8.19.0':
- resolution: {integrity: sha512-mCFtBbFBJDCNCWUl5y6sZSCHXw1DEFEk3c/M3nRK2a4XUB8StGFtmcEMizdjKuBzB6e/smJAAWYug3VrdLMr1w==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
- '@typescript-eslint/visitor-keys@8.22.0':
- resolution: {integrity: sha512-AWpYAXnUgvLNabGTy3uBylkgZoosva/miNd1I8Bz3SjotmQPbVqhO4Cczo8AsZ44XVErEBPr/CRSgaj8sG7g0w==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
- '@ungap/structured-clone@1.3.0':
- resolution: {integrity: sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==}
+ vite: ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0
'@vitest/coverage-v8@2.1.8':
resolution: {integrity: sha512-2Y7BPlKH18mAZYAW1tYByudlCYrQyl5RGvnnDYJKW5tCiO5qg3KSAy3XAxcxKz900a0ZXxWtKrMuZLe3lKBpJw==}
@@ -4094,6 +4697,9 @@ packages:
'@vitest/browser':
optional: true
+ '@vitest/expect@1.6.1':
+ resolution: {integrity: sha512-jXL+9+ZNIJKruofqXuuTClf44eSpcHlgj3CiuNihUF3Ioujtmc0zIa3UJOW5RjDK1YLBJZnWBlPuqhYycLioog==}
+
'@vitest/expect@2.0.5':
resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==}
@@ -4117,18 +4723,30 @@ packages:
'@vitest/pretty-format@2.1.8':
resolution: {integrity: sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==}
+ '@vitest/runner@1.6.1':
+ resolution: {integrity: sha512-3nSnYXkVkf3mXFfE7vVyPmi3Sazhb/2cfZGGs0JRzFsPFvAMBEcrweV1V1GsrstdXeKCTXlJbvnQwGWgEIHmOA==}
+
'@vitest/runner@2.1.8':
resolution: {integrity: sha512-17ub8vQstRnRlIU5k50bG+QOMLHRhYPAna5tw8tYbj+jzjcspnwnwtPtiOlkuKC4+ixDPTuLZiqiWWQ2PSXHVg==}
+ '@vitest/snapshot@1.6.1':
+ resolution: {integrity: sha512-WvidQuWAzU2p95u8GAKlRMqMyN1yOJkGHnx3M1PL9Raf7AQ1kwLKg04ADlCa3+OXUZE7BceOhVZiuWAbzCKcUQ==}
+
'@vitest/snapshot@2.1.8':
resolution: {integrity: sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==}
+ '@vitest/spy@1.6.1':
+ resolution: {integrity: sha512-MGcMmpGkZebsMZhbQKkAf9CX5zGvjkBTqf8Zx3ApYWXr3wG+QvEu2eXWfnIIWYSJExIp4V9FCKDEeygzkYrXMw==}
+
'@vitest/spy@2.0.5':
resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==}
'@vitest/spy@2.1.8':
resolution: {integrity: sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==}
+ '@vitest/utils@1.6.1':
+ resolution: {integrity: sha512-jOrrUvXM4Av9ZWiG1EajNto0u96kWAhJ1LmPmJhXXQx/32MecEKd10pOLYgS2BQx1TgkGhloPU1ArDW2vvaY6g==}
+
'@vitest/utils@2.0.5':
resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==}
@@ -4208,10 +4826,19 @@ packages:
engines: {node: '>=0.4.0'}
hasBin: true
+ acorn@8.16.0:
+ resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==}
+ engines: {node: '>=0.4.0'}
+ hasBin: true
+
address@1.2.2:
resolution: {integrity: sha512-4B/qKCfeE/ODUaAUpSwfzazo5x29WD4r3vXiWsB7I2mSDAihwEqKO+g8GELZUQSSAo5e1XTYh3ZVfLyxBc12nA==}
engines: {node: '>= 10.0.0'}
+ agent-base@7.1.4:
+ resolution: {integrity: sha512-MnA+YT8fwfJPgBx3m60MNqakm30XOkyIoH1y6huTQvC0PwZG7ki8NacLBcrPbNoo8vEZy7Jpuk7+jMO+CUovTQ==}
+ engines: {node: '>= 14'}
+
aggregate-error@3.1.0:
resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==}
engines: {node: '>=8'}
@@ -4319,43 +4946,18 @@ packages:
resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
engines: {node: '>= 0.4'}
- array-buffer-byte-length@1.0.2:
- resolution: {integrity: sha512-LHE+8BuR7RYGDKvnrmcuSq3tDcKv9OFEXQt/HpbZhY7V6h0zlUXutnAD82GiFx9rdieCMjkvtcsPqBwgUl1Iiw==}
- engines: {node: '>= 0.4'}
-
array-flatten@1.1.1:
resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==}
array-ify@1.0.0:
resolution: {integrity: sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==}
- array-includes@3.1.8:
- resolution: {integrity: sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==}
- engines: {node: '>= 0.4'}
-
array-union@2.1.0:
resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==}
engines: {node: '>=8'}
- array.prototype.findlast@1.2.5:
- resolution: {integrity: sha512-CVvd6FHg1Z3POpBLxO6E6zr+rSKEQ9L6rZHAaY7lLfhKsWYUBBOuMs0e9o24oopj6H+geRCX0YJ+TJLBK2eHyQ==}
- engines: {node: '>= 0.4'}
-
- array.prototype.flat@1.3.3:
- resolution: {integrity: sha512-rwG/ja1neyLqCuGZ5YYrznA62D4mZXg0i1cIskIUKSiqF3Cje9/wXAls9B9s1Wa2fomMsIv8czB8jZcPmxCXFg==}
- engines: {node: '>= 0.4'}
-
- array.prototype.flatmap@1.3.3:
- resolution: {integrity: sha512-Y7Wt51eKJSyi80hFrJCePGGNo5ktJCslFuboqJsbf57CCPcm5zztluPlc4/aD8sWsKvlwatezpV4U1efk8kpjg==}
- engines: {node: '>= 0.4'}
-
- array.prototype.tosorted@1.1.4:
- resolution: {integrity: sha512-p6Fx8B7b7ZhL/gmUsAy0D15WhvDccw3mnGNbZpi3pmeJdxtWsj2jEaI4Y6oo3XiHfzuSgPwKc04MYt6KgvC/wA==}
- engines: {node: '>= 0.4'}
-
- arraybuffer.prototype.slice@1.0.4:
- resolution: {integrity: sha512-BNoCY6SXXPQ7gF2opIP4GBE+Xw7U+pHMYKuzjgCN3GwiaIR09UUeKfheyIry77QtrCBlC0KK0q5/TER/tYh3PQ==}
- engines: {node: '>= 0.4'}
+ assertion-error@1.1.0:
+ resolution: {integrity: sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==}
assertion-error@2.0.1:
resolution: {integrity: sha512-Izi8RQcffqCeNVgFigKli1ssklIbpHnCYc6AknXGYoB6grJqyeby7jv12JUQgmTAnIDnbck1uxksT4dzN3PWBA==}
@@ -4369,10 +4971,6 @@ packages:
resolution: {integrity: sha512-LElXdjswlqjWrPpJFg1Fx4wpkOCxj1TDHlSV4PlaRxHGWko024xICaa97ZkMfs6DRKlCguiAI+rbXv5GWwXIkg==}
hasBin: true
- async-function@1.0.0:
- resolution: {integrity: sha512-hsU18Ae8CDTR6Kgu9DYf0EbCr/a5iGL0rytQDobUcdpYOKokk8LEjVphnXkDkgpi0wYVsqrXuP0bZxJaTqdgoA==}
- engines: {node: '>= 0.4'}
-
at-least-node@1.0.0:
resolution: {integrity: sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==}
engines: {node: '>= 4.0.0'}
@@ -4491,6 +5089,12 @@ packages:
peerDependencies:
esbuild: '>=0.18'
+ bundle-require@5.1.0:
+ resolution: {integrity: sha512-3WrrOuZiyaaZPWiEt4G3+IffISVC9HYlWueJEBWED4ZH4aIAC2PnkdnuRrR94M+w6yGWn4AglWtJtBI8YqvgoA==}
+ engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ peerDependencies:
+ esbuild: '>=0.18'
+
bytes@3.0.0:
resolution: {integrity: sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==}
engines: {node: '>= 0.8'}
@@ -4503,6 +5107,10 @@ packages:
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
engines: {node: '>=8'}
+ cac@7.0.0:
+ resolution: {integrity: sha512-tixWYgm5ZoOD+3g6UTea91eow5z6AAHaho3g0V9CNSNb45gM8SmflpAc+GRd1InC4AqN/07Unrgp56Y94N9hJQ==}
+ engines: {node: '>=20.19.0'}
+
cacheable-lookup@7.0.0:
resolution: {integrity: sha512-+qJyx4xiKra8mZrcwhjMRMUhD5NR1R8esPkzIYxX96JiecFoxAXFuz/GpR3+ev4PE1WamHip78wV0vcmPQtp8w==}
engines: {node: '>=14.16'}
@@ -4551,6 +5159,10 @@ packages:
ccount@2.0.1:
resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==}
+ chai@4.5.0:
+ resolution: {integrity: sha512-RITGBfijLkBddZvnn8jdqoTypxvqbOLYQkGGxXzeFjVHvudaPw0HNFD9x928/eUwYWd2dPCugVqspGALTZZQKw==}
+ engines: {node: '>=4'}
+
chai@5.1.2:
resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==}
engines: {node: '>=12'}
@@ -4590,6 +5202,9 @@ packages:
chardet@0.7.0:
resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==}
+ check-error@1.0.3:
+ resolution: {integrity: sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==}
+
check-error@2.1.1:
resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==}
engines: {node: '>= 16'}
@@ -4609,6 +5224,10 @@ packages:
resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==}
engines: {node: '>= 14.16.0'}
+ chokidar@4.0.3:
+ resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==}
+ engines: {node: '>= 14.16.0'}
+
chromatic@11.19.0:
resolution: {integrity: sha512-3JZ1Tt26N2uDok6nXApsvHmTnkrgE0HClq1bmfF5WmCJ61bMN80CObhuFc7kiBCv5QbE7GOe3rpy3MiuZ4h9IA==}
hasBin: true
@@ -4629,9 +5248,6 @@ packages:
resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==}
engines: {node: '>=8'}
- classnames@2.5.1:
- resolution: {integrity: sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==}
-
clean-css@5.3.3:
resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==}
engines: {node: '>= 10.0'}
@@ -4767,6 +5383,9 @@ packages:
concat-map@0.0.1:
resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==}
+ confbox@0.1.8:
+ resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==}
+
config-chain@1.1.13:
resolution: {integrity: sha512-qj+f8APARXHrM0hraqXYb2/bOVSV4PvJQlNZ/DVj0QrmNM2q2euizkeuVckQ57J+W0mRH6Hvi+k50M4Jul2VRQ==}
@@ -4782,6 +5401,10 @@ packages:
resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==}
engines: {node: ^14.18.0 || >=16.10.0}
+ consola@3.4.2:
+ resolution: {integrity: sha512-5IKcdX0nnYavi6G7TtOhwkYzyjfJlatbjMjuLSfE2kYT5pMDOilZ4OvMhi637CcDICTmz3wARPoyhqyX1Y+XvA==}
+ engines: {node: ^14.18.0 || >=16.10.0}
+
content-disposition@0.5.2:
resolution: {integrity: sha512-kRGRZw3bLlFISDBgwTSA1TMBFN6J6GWDeubmDE3AF+3+yXL8hTWv8r5rkLbqYXY4RjPk/EzHnClI3zQf1cFmHA==}
engines: {node: '>= 0.6'}
@@ -4998,9 +5621,16 @@ packages:
resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
+ cssstyle@4.6.0:
+ resolution: {integrity: sha512-2z+rWdzbbSZv6/rhtvzvqeZQHrBaqgogqt85sqFNbabZOuFbCVFb8kPeEtZjiKkbrm395irpNKiYeFeLiQnFPg==}
+ engines: {node: '>=18'}
+
csstype@3.1.3:
resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==}
+ csstype@3.2.3:
+ resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
+
cz-conventional-changelog@3.3.0:
resolution: {integrity: sha512-U466fIzU5U22eES5lTNiNbZ+d8dfcHcssH4o7QsdWaCcRs/feIPCxKYSWkYBNs5mny7MvEfwpTLWjvbm94hecw==}
engines: {node: '>= 10'}
@@ -5009,17 +5639,9 @@ packages:
resolution: {integrity: sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==}
engines: {node: '>=12'}
- data-view-buffer@1.0.2:
- resolution: {integrity: sha512-EmKO5V3OLXh1rtK2wgXRansaK1/mtVdTUEiEI0W8RkvgT05kfxaH29PliLnpLP73yYO6142Q72QNa8Wx/A5CqQ==}
- engines: {node: '>= 0.4'}
-
- data-view-byte-length@1.0.2:
- resolution: {integrity: sha512-tuhGbE6CfTM9+5ANGf+oQb72Ky/0+s3xKUpHvShfiz2RxMFgFPjsXuRLBVMtvMs15awe45SRb83D6wH4ew6wlQ==}
- engines: {node: '>= 0.4'}
-
- data-view-byte-offset@1.0.1:
- resolution: {integrity: sha512-BS8PfmtDGnrgYdOonGZQdLZslWIeCGFP9tpan0hi1Co2Zr2NKADsvGYA8XxuG/4UWgJ6Cjtv+YJnB6MM69QGlQ==}
- engines: {node: '>= 0.4'}
+ data-urls@5.0.0:
+ resolution: {integrity: sha512-ZYP5VBHshaDAiVZxjbRVcFJpc+4xGgT0bK3vzy1HLN8jTO975HEbuYzZJcHoQEY5K1a0z8YayJkyVETa08eNTg==}
+ engines: {node: '>=18'}
debounce@1.2.1:
resolution: {integrity: sha512-XRRe6Glud4rd/ZGQfiV1ruXSfbvfJedlV9Y6zOlP+2K04vBYiJEte6stfFkCP03aMnY5tsipamumUjL14fofug==}
@@ -5032,15 +5654,6 @@ packages:
supports-color:
optional: true
- debug@4.3.7:
- resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==}
- engines: {node: '>=6.0'}
- peerDependencies:
- supports-color: '*'
- peerDependenciesMeta:
- supports-color:
- optional: true
-
debug@4.4.0:
resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==}
engines: {node: '>=6.0'}
@@ -5050,6 +5663,9 @@ packages:
supports-color:
optional: true
+ decimal.js@10.6.0:
+ resolution: {integrity: sha512-YpgQiITW3JXGntzdUmyUR1V812Hn8T1YVXhCu+wO3OpS4eU9l4YdD3qjyiKdV6mvV29zapkMeD390UVEf2lkUg==}
+
decode-named-character-reference@1.0.2:
resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==}
@@ -5060,6 +5676,18 @@ packages:
dedent@0.7.0:
resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==}
+ dedent@1.7.2:
+ resolution: {integrity: sha512-WzMx3mW98SN+zn3hgemf4OzdmyNhhhKz5Ay0pUfQiMQ3e1g+xmTJWp/pKdwKVXhdSkAEGIIzqeuWrL3mV/AXbA==}
+ peerDependencies:
+ babel-plugin-macros: ^3.1.0
+ peerDependenciesMeta:
+ babel-plugin-macros:
+ optional: true
+
+ deep-eql@4.1.4:
+ resolution: {integrity: sha512-SUwdGfqdKOwxCPeVYjwSyRpJ7Z+fhpwIAtmCUdZIWZ/YP5R9WAsyuSgpLVDi9bjWoN2LXHNss/dk3urXtdQxGg==}
+ engines: {node: '>=6'}
+
deep-eql@5.0.2:
resolution: {integrity: sha512-h5k/5U50IJJFpzfL6nO9jaaumfjO/f2NjK/oYB2Djzm4p9L+3T9qWpZqZ2hAbLPuuYq9wrU08WQyBTL5GbPk5Q==}
engines: {node: '>=6'}
@@ -5071,6 +5699,9 @@ packages:
deep-is@0.1.4:
resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==}
+ 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'}
@@ -5126,6 +5757,10 @@ packages:
resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==}
engines: {node: '>=8'}
+ detect-libc@2.1.2:
+ resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
+ engines: {node: '>=8'}
+
detect-node@2.1.0:
resolution: {integrity: sha512-T0NIuQpnTvFDATNuHN5roPwSBG83rFsuO+MXXH9/3N1eFbn4wcPjttvjMLEPWJ0RGUYgQE7cGgS3tNxbqCGM7g==}
@@ -5142,6 +5777,10 @@ packages:
devlop@1.1.0:
resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==}
+ diff-sequences@29.6.3:
+ resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
dir-glob@3.0.1:
resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==}
engines: {node: '>=8'}
@@ -5150,10 +5789,6 @@ packages:
resolution: {integrity: sha512-l4gcSouhcgIKRvyy99RNVOgxXiicE+2jZoNmaNmZ6JXiGajBOJAesk1OBlJuM5k2c+eudGdLxDqXuPCKIj6kpw==}
engines: {node: '>=6'}
- doctrine@2.1.0:
- resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==}
- engines: {node: '>=0.10.0'}
-
doctrine@3.0.0:
resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
engines: {node: '>=6.0.0'}
@@ -5273,10 +5908,6 @@ packages:
error-ex@1.3.2:
resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==}
- es-abstract@1.23.9:
- resolution: {integrity: sha512-py07lI0wjxAC/DcfK1S6G7iANonniZwTISvdPzk9hzeH0IZIshbuuFxLIU96OyF89Yb9hiqWn8M/bY83KY5vzA==}
- engines: {node: '>= 0.4'}
-
es-define-property@1.0.1:
resolution: {integrity: sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==}
engines: {node: '>= 0.4'}
@@ -5285,28 +5916,16 @@ packages:
resolution: {integrity: sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==}
engines: {node: '>= 0.4'}
- es-iterator-helpers@1.2.1:
- resolution: {integrity: sha512-uDn+FE1yrDzyC0pCo961B2IHbdM8y/ACZsKD4dG6WqrjV53BADjwa7D+1aom2rsNVfLyDgU/eigvlJGJ08OQ4w==}
- engines: {node: '>= 0.4'}
-
es-module-lexer@1.5.4:
resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==}
+ es-module-lexer@2.0.0:
+ resolution: {integrity: sha512-5POEcUuZybH7IdmGsD8wlf0AI55wMecM9rVBTI/qEAy2c1kTOm3DjFYjrBdI2K3BaJjJYfYFeRtM0t9ssnRuxw==}
+
es-object-atoms@1.1.1:
resolution: {integrity: sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==}
engines: {node: '>= 0.4'}
- es-set-tostringtag@2.1.0:
- resolution: {integrity: sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==}
- engines: {node: '>= 0.4'}
-
- es-shim-unscopables@1.0.2:
- resolution: {integrity: sha512-J3yBRXCzDu4ULnQwxyToo/OjdMx6akgVC7K6few0a7F/0wLtmKKN7I73AH5T2836UuXRqN7Qg+IIUw/+YJksRw==}
-
- es-to-primitive@1.3.0:
- resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
- engines: {node: '>= 0.4'}
-
esast-util-from-estree@2.0.0:
resolution: {integrity: sha512-4CyanoAudUSBAn5K13H4JhsMH6L9ZP7XbLVe/dKybkxMO7eDyLsT8UHl9TRNrU2Gr9nz+FovfSIjuXWJ81uVwQ==}
@@ -5333,6 +5952,11 @@ packages:
engines: {node: '>=18'}
hasBin: true
+ esbuild@0.27.7:
+ resolution: {integrity: sha512-IxpibTjyVnmrIQo5aqNpCgoACA/dTKLTlhMHihVHhdkxKyPO1uBBthumT0rdHmcsk9uMonIWS0m4FljWzILh3w==}
+ engines: {node: '>=18'}
+ hasBin: true
+
escalade@3.2.0:
resolution: {integrity: sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==}
engines: {node: '>=6'}
@@ -5356,24 +5980,6 @@ packages:
resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==}
engines: {node: '>=12'}
- eslint-plugin-react-hooks@5.1.0:
- resolution: {integrity: sha512-mpJRtPgHN2tNAvZ35AMfqeB3Xqeo273QxrHJsbBEPWODRM4r0yB6jfoROqKEYrOn27UtRPpcpHc2UqyBSuUNTw==}
- engines: {node: '>=10'}
- peerDependencies:
- eslint: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0
-
- eslint-plugin-react@7.37.4:
- resolution: {integrity: sha512-BGP0jRmfYyvOyvMoRX/uoUeW+GqNj9y16bPQzqAHf3AYII/tDs+jMN0dBVkl88/OZwNGwrVFxE7riHsXVfy/LQ==}
- engines: {node: '>=4'}
- peerDependencies:
- eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
-
- eslint-plugin-storybook@0.11.2:
- resolution: {integrity: sha512-0Z4DUklJrC+GHjCRXa7PYfPzWC15DaVnwaOYenpgXiCEijXPZkLKCms+rHhtoRcWccP7Z8DpOOaP1gc3P9oOwg==}
- engines: {node: '>= 18'}
- peerDependencies:
- eslint: '>=8'
-
eslint-scope@5.1.1:
resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==}
engines: {node: '>=8.0.0'}
@@ -5546,6 +6152,15 @@ packages:
picomatch:
optional: true
+ fdir@6.5.0:
+ resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
+ engines: {node: '>=12.0.0'}
+ peerDependencies:
+ picomatch: ^3 || ^4
+ peerDependenciesMeta:
+ picomatch:
+ optional: true
+
feed@4.2.2:
resolution: {integrity: sha512-u5/sxGfiMfZNtJ3OvQpXcvotFpYkL0n9u9mM2vkui2nGo8b4wvDkJ8gAkYqbA8QpGyFCv3RK0Z+Iv+9veCS9bQ==}
engines: {node: '>=0.4.0'}
@@ -5610,6 +6225,9 @@ packages:
resolution: {integrity: sha512-6jvvn/12IC4quLBL1KNokxC7wWTvYncaVUYSoxWw7YykPLuRrnv4qdHcSOywOI5RpkOVGeQRtWM8/q+G6W6qfQ==}
engines: {node: '>= 8'}
+ fix-dts-default-cjs-exports@1.0.1:
+ resolution: {integrity: sha512-pVIECanWFC61Hzl2+oOCtoJ3F17kglZC/6N94eRWycFgBH35hHx0Li604ZIzhseh97mf2p0cv7vVrOZGoqhlEg==}
+
flat-cache@4.0.1:
resolution: {integrity: sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==}
engines: {node: '>=16'}
@@ -5700,13 +6318,6 @@ packages:
function-bind@1.1.2:
resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==}
- function.prototype.name@1.1.8:
- resolution: {integrity: sha512-e5iwyodOHhbMr/yNrc7fDYG4qlbIvI5gajyzPnb5TCwyhjApznQh1BMFou9b30SevY43gCJKXycoCBjMbsuW0Q==}
- engines: {node: '>= 0.4'}
-
- functions-have-names@1.2.3:
- resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
-
gensync@1.0.0-beta.2:
resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
engines: {node: '>=6.9.0'}
@@ -5719,6 +6330,9 @@ packages:
resolution: {integrity: sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==}
engines: {node: '>=18'}
+ get-func-name@2.0.2:
+ resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==}
+
get-intrinsic@1.2.7:
resolution: {integrity: sha512-VW6Pxhsrk0KAOqs3WEd0klDiF/+V7gQOpAvY1jVU/LHmaD/kQO4523aiJuikX/QAKYiW6x8Jh+RJej1almdtCA==}
engines: {node: '>= 0.4'}
@@ -5738,10 +6352,6 @@ packages:
resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==}
engines: {node: '>=16'}
- get-symbol-description@1.1.0:
- resolution: {integrity: sha512-w9UMqWwJxHNOvoNzSJ2oPF5wvYcvP7jUvYzhp67yEhTi17ZDBBC1z9pTdGuzjD+EFIqLSYRweZjqfiPzQ06Ebg==}
- engines: {node: '>= 0.4'}
-
get-tsconfig@4.8.1:
resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==}
@@ -5810,10 +6420,6 @@ packages:
resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==}
engines: {node: '>=18'}
- globalthis@1.0.4:
- resolution: {integrity: sha512-DpLKbNU4WylpxJykQujfCcwYWiV/Jhm50Goo0wrVILAv5jOr9d+H+UR3PhSCD2rCCEIg0uc+G+muBTwD54JhDQ==}
- engines: {node: '>= 0.4'}
-
globby@11.1.0:
resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==}
engines: {node: '>=10'}
@@ -5836,9 +6442,6 @@ packages:
graceful-fs@4.2.11:
resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==}
- graphemer@1.4.0:
- resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==}
-
gray-matter@4.0.3:
resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==}
engines: {node: '>=6.0'}
@@ -5854,10 +6457,6 @@ packages:
resolution: {integrity: sha512-KyrFvnl+J9US63TEzwoiJOQzZBJY7KgBushJA8X61DMbNsH+2ONkDuLDnCnwUiPTF42tLoEmrPyoqbenVA5zrg==}
engines: {node: '>=18.0.0'}
- has-bigints@1.1.0:
- resolution: {integrity: sha512-R3pbpkcIqv2Pm3dUwgjclDRVmWpTJW2DcMzcIhEXEx1oh/CEMObMm3KLmRJOdvhM7o4uQBnwr8pzRK2sJWIqfg==}
- engines: {node: '>= 0.4'}
-
has-flag@3.0.0:
resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==}
engines: {node: '>=4'}
@@ -5869,10 +6468,6 @@ packages:
has-property-descriptors@1.0.2:
resolution: {integrity: sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==}
- has-proto@1.2.0:
- resolution: {integrity: sha512-KIL7eQPfHQRC8+XluaIw7BHUwwqL19bQn4hzNgdr+1wXoU0KKj6rufu47lhY7KbJR2C6T6+PfyN0Ea7wkSS+qQ==}
- engines: {node: '>= 0.4'}
-
has-symbols@1.1.0:
resolution: {integrity: sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==}
engines: {node: '>= 0.4'}
@@ -5930,6 +6525,10 @@ packages:
hpack.js@2.1.6:
resolution: {integrity: sha512-zJxVehUdMGIKsRaNt7apO2Gqp0BdqW5yaiGHXXmbpvxgBYVZnAql+BJb4RO5ad2MgpbZKn5G6nMnegrH1FcNYQ==}
+ html-encoding-sniffer@4.0.0:
+ resolution: {integrity: sha512-Y22oTqIU4uuPgEemfz7NDJz6OeKf12Lsu+QC+s3BVpda64lTiMYCyGwg5ki4vFxkMwQdeZDl2adZoqUgdFuTgQ==}
+ engines: {node: '>=18'}
+
html-entities@2.5.2:
resolution: {integrity: sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==}
@@ -5988,6 +6587,10 @@ packages:
http-parser-js@0.5.9:
resolution: {integrity: sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==}
+ http-proxy-agent@7.0.2:
+ resolution: {integrity: sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==}
+ engines: {node: '>= 14'}
+
http-proxy-middleware@2.0.7:
resolution: {integrity: sha512-fgVY8AV7qU7z/MmXJ/rxwbrtQH4jBQ9m7kp3llF0liB7glmFeVZFBepQb32T3y8n8k2+AEYuMPCpinYW+/CuRA==}
engines: {node: '>=12.0.0'}
@@ -6005,6 +6608,10 @@ packages:
resolution: {integrity: sha512-V5nVw1PAOgfI3Lmeaj2Exmeg7fenjhRUgz1lPSezy1CuhPYbgQtbQj4jZfEAEMlaL+vupsvhjqCyjzob0yxsmQ==}
engines: {node: '>=10.19.0'}
+ https-proxy-agent@7.0.6:
+ resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==}
+ engines: {node: '>= 14'}
+
human-id@1.0.2:
resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==}
@@ -6025,6 +6632,10 @@ packages:
resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==}
engines: {node: '>=0.10.0'}
+ iconv-lite@0.6.3:
+ resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==}
+ engines: {node: '>=0.10.0'}
+
icss-utils@5.1.0:
resolution: {integrity: sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==}
engines: {node: ^10 || ^12 || >= 14}
@@ -6097,10 +6708,6 @@ packages:
resolution: {integrity: sha512-QAgPDQMEgrDssk1XiwwHoOGYF9BAbUcc1+j+FhEvaOt8/cKRqyLn0U5qA6F74fGhTMGxf92pOvPBeh29jQJDTQ==}
engines: {node: '>=12.0.0'}
- internal-slot@1.1.0:
- resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
- engines: {node: '>= 0.4'}
-
interpret@1.4.0:
resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==}
engines: {node: '>= 0.10'}
@@ -6126,29 +6733,13 @@ packages:
resolution: {integrity: sha512-8Q7EARjzEnKpt/PCD7e1cgUS0a6X8u5tdSiMqXhojOdoV9TsMsiO+9VLC5vAmO8N7/GmXn7yjR8qnA6bVAEzfA==}
engines: {node: '>= 0.4'}
- is-array-buffer@3.0.5:
- resolution: {integrity: sha512-DDfANUiiG2wC1qawP66qlTugJeL5HyzMpfr8lLK+jMQirGzNod0B12cFB/9q838Ru27sBwfw78/rdoU7RERz6A==}
- engines: {node: '>= 0.4'}
-
is-arrayish@0.2.1:
resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==}
- is-async-function@2.1.1:
- resolution: {integrity: sha512-9dgM/cZBnNvjzaMYHVoxxfPj2QXt22Ev7SuuPrs+xav0ukGB0S6d4ydZdEiM48kLx5kDV+QBPrpVnFyefL8kkQ==}
- engines: {node: '>= 0.4'}
-
- is-bigint@1.1.0:
- resolution: {integrity: sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==}
- engines: {node: '>= 0.4'}
-
is-binary-path@2.1.0:
resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==}
engines: {node: '>=8'}
- is-boolean-object@1.2.1:
- resolution: {integrity: sha512-l9qO6eFlUETHtuihLcYOaLKByJ1f+N4kthcU9YjHy3N+B3hWv0y/2Nd0mu/7lTFnRQHTrSdXF50HQ3bl5fEnng==}
- engines: {node: '>= 0.4'}
-
is-callable@1.2.7:
resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==}
engines: {node: '>= 0.4'}
@@ -6161,14 +6752,6 @@ packages:
resolution: {integrity: sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==}
engines: {node: '>= 0.4'}
- is-data-view@1.0.2:
- resolution: {integrity: sha512-RKtWF8pGmS87i2D6gqQu/l7EYRlVdfzemCJN/P3UOs//x1QE7mfhvzHIApBTRf7axvT6DMGwSwBXYCT0nfB9xw==}
- engines: {node: '>= 0.4'}
-
- is-date-object@1.1.0:
- resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
- engines: {node: '>= 0.4'}
-
is-decimal@2.0.1:
resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==}
@@ -6185,10 +6768,6 @@ packages:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
- is-finalizationregistry@1.1.1:
- resolution: {integrity: sha512-1pC6N8qWJbWoPtEjgcL2xyhQOP491EQjeUo3qTKcmV8YSDDJrOepfG8pcC7h/QgnQHYSv0mJ3Z/ZWxmatVrysg==}
- engines: {node: '>= 0.4'}
-
is-fullwidth-code-point@3.0.0:
resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==}
engines: {node: '>=8'}
@@ -6220,18 +6799,10 @@ packages:
resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==}
engines: {node: '>=8'}
- is-map@2.0.3:
- resolution: {integrity: sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==}
- engines: {node: '>= 0.4'}
-
is-npm@6.0.0:
resolution: {integrity: sha512-JEjxbSmtPSt1c8XTkVrlujcXdKV1/tvuQ7GwKcAlyiVLeYFQ2VHat8xfrDJsIkhCdF/tZ7CiIR3sy141c6+gPQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- is-number-object@1.1.1:
- resolution: {integrity: sha512-lZhclumE1G6VYD8VHe35wFaIif+CTy5SJIi5+3y4psDgWu4wPDoBhF8NxUOinEc7pHgiTsT6MaBb92rKhhD+Xw==}
- engines: {node: '>= 0.4'}
-
is-number@7.0.0:
resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==}
engines: {node: '>=0.12.0'}
@@ -6264,9 +6835,8 @@ packages:
resolution: {integrity: sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==}
engines: {node: '>=0.10.0'}
- is-regex@1.2.1:
- resolution: {integrity: sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==}
- engines: {node: '>= 0.4'}
+ is-potential-custom-element-name@1.0.1:
+ resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==}
is-regexp@1.0.0:
resolution: {integrity: sha512-7zjFAPO4/gwyQAAgRRmqeEeyIICSdmCqa3tsVHMdBzaXXRiqopZL4Cyghg/XulGWrtABTpbnYYzzIRffLkP4oA==}
@@ -6276,14 +6846,6 @@ packages:
resolution: {integrity: sha512-AGOriNp96vNBd3HtU+RzFEc75FfR5ymiYv8E553I71SCeXBiMsVDUtdio1OEFvrPyLIQ9tVR5RxXIFe5PUFjMg==}
engines: {node: '>=6'}
- is-set@2.0.3:
- resolution: {integrity: sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==}
- engines: {node: '>= 0.4'}
-
- is-shared-array-buffer@1.0.4:
- resolution: {integrity: sha512-ISWac8drv4ZGfwKl5slpHG9OwPNty4jOWPRIhBpxOoD+hqITiwuipOQ2bNthAzwA3B4fIjO4Nln74N0S9byq8A==}
- engines: {node: '>= 0.4'}
-
is-stream@2.0.1:
resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
engines: {node: '>=8'}
@@ -6292,18 +6854,10 @@ packages:
resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
- is-string@1.1.1:
- resolution: {integrity: sha512-BtEeSsoaQjlSPBemMQIrY1MY0uM6vnS1g5fmufYOtnxLGUZM2178PKbhsk7Ffv58IX+ZtcvoGwccYsh0PglkAA==}
- engines: {node: '>= 0.4'}
-
is-subdir@1.2.0:
resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==}
engines: {node: '>=4'}
- is-symbol@1.1.1:
- resolution: {integrity: sha512-9gGx6GTtCQM73BgmHQXfDmLtfjjTUDSyoxTCbp5WtoixAhfgsDirWIcVQ/IHpvI5Vgd5i/J5F7B9cN/WlVbC/w==}
- engines: {node: '>= 0.4'}
-
is-text-path@2.0.0:
resolution: {integrity: sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==}
engines: {node: '>=8'}
@@ -6322,18 +6876,6 @@ packages:
is-utf8@0.2.1:
resolution: {integrity: sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==}
- is-weakmap@2.0.2:
- resolution: {integrity: sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==}
- engines: {node: '>= 0.4'}
-
- is-weakref@1.1.0:
- resolution: {integrity: sha512-SXM8Nwyys6nT5WP6pltOwKytLV7FqQ4UiibxVmW+EIosHcmCqkkjViTb5SNssDlkCiEYRP1/pdWUKVvZBmsR2Q==}
- engines: {node: '>= 0.4'}
-
- is-weakset@2.0.4:
- resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
- engines: {node: '>= 0.4'}
-
is-windows@1.0.2:
resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
engines: {node: '>=0.10.0'}
@@ -6352,9 +6894,6 @@ packages:
isarray@1.0.0:
resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
- isarray@2.0.5:
- resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
-
isexe@2.0.0:
resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==}
@@ -6378,13 +6917,12 @@ packages:
resolution: {integrity: sha512-BewmUXImeuRk2YY0PVbxgKAysvhRPUQE0h5QRM++nVWyubKGV0l8qQ5op8+B2DOmwSe63Jivj0BjkPQVf8fP5g==}
engines: {node: '>=8'}
- iterator.prototype@1.1.5:
- resolution: {integrity: sha512-H0dkQoCa3b2VEeKQBOxFph+JAbcrQdE7KC0UkqwpLmv2EC4P41QXP+rqo9wYodACiG5/WM5s9oDApTU8utwj9g==}
- engines: {node: '>= 0.4'}
-
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-util@29.7.0:
resolution: {integrity: sha512-z6EbKajIpqGKU56y5KBUgy1dt1ihhQJgWzUlZHArA/+X2ad7Cb5iF+AK1EWVL/Bo7Rz9uurpqw6SiBCefUbCGA==}
engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
@@ -6415,6 +6953,9 @@ packages:
js-tokens@4.0.0:
resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==}
+ js-tokens@9.0.1:
+ resolution: {integrity: sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==}
+
js-yaml@3.14.1:
resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==}
hasBin: true
@@ -6427,6 +6968,15 @@ packages:
resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==}
engines: {node: '>=12.0.0'}
+ jsdom@26.1.0:
+ resolution: {integrity: sha512-Cvc9WUhxSMEo4McES3P7oK3QaXldCfNWp7pl2NNeiIFlCoLr3kfq9kb1fxftiwk1FLV7CvpvDfonxtzUDeSOPg==}
+ engines: {node: '>=18'}
+ peerDependencies:
+ canvas: ^3.0.0
+ peerDependenciesMeta:
+ canvas:
+ optional: true
+
jsesc@3.0.2:
resolution: {integrity: sha512-xKqzzWXDttJuOcawBt4KnKHHIf5oQ/Cxax+0PWFG+DFDgHNAdi+TXECADI+RYiFUMmx8792xsMbbgXj4CwnP4g==}
engines: {node: '>=6'}
@@ -6462,10 +7012,6 @@ packages:
resolution: {integrity: sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==}
engines: {'0': node >= 0.2.0}
- jsx-ast-utils@3.3.5:
- resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
- engines: {node: '>=4.0'}
-
keyv@4.5.4:
resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==}
@@ -6500,6 +7046,76 @@ packages:
resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==}
engines: {node: '>= 0.8.0'}
+ lightningcss-android-arm64@1.32.0:
+ resolution: {integrity: sha512-YK7/ClTt4kAK0vo6w3X+Pnm0D2cf2vPHbhOXdoNti1Ga0al1P4TBZhwjATvjNwLEBCnKvjJc2jQgHXH0NEwlAg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [android]
+
+ lightningcss-darwin-arm64@1.32.0:
+ resolution: {integrity: sha512-RzeG9Ju5bag2Bv1/lwlVJvBE3q6TtXskdZLLCyfg5pt+HLz9BqlICO7LZM7VHNTTn/5PRhHFBSjk5lc4cmscPQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [darwin]
+
+ lightningcss-darwin-x64@1.32.0:
+ resolution: {integrity: sha512-U+QsBp2m/s2wqpUYT/6wnlagdZbtZdndSmut/NJqlCcMLTWp5muCrID+K5UJ6jqD2BFshejCYXniPDbNh73V8w==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [darwin]
+
+ lightningcss-freebsd-x64@1.32.0:
+ resolution: {integrity: sha512-JCTigedEksZk3tHTTthnMdVfGf61Fky8Ji2E4YjUTEQX14xiy/lTzXnu1vwiZe3bYe0q+SpsSH/CTeDXK6WHig==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [freebsd]
+
+ lightningcss-linux-arm-gnueabihf@1.32.0:
+ resolution: {integrity: sha512-x6rnnpRa2GL0zQOkt6rts3YDPzduLpWvwAF6EMhXFVZXD4tPrBkEFqzGowzCsIWsPjqSK+tyNEODUBXeeVHSkw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm]
+ os: [linux]
+
+ lightningcss-linux-arm64-gnu@1.32.0:
+ resolution: {integrity: sha512-0nnMyoyOLRJXfbMOilaSRcLH3Jw5z9HDNGfT/gwCPgaDjnx0i8w7vBzFLFR1f6CMLKF8gVbebmkUN3fa/kQJpQ==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ lightningcss-linux-arm64-musl@1.32.0:
+ resolution: {integrity: sha512-UpQkoenr4UJEzgVIYpI80lDFvRmPVg6oqboNHfoH4CQIfNA+HOrZ7Mo7KZP02dC6LjghPQJeBsvXhJod/wnIBg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [linux]
+
+ lightningcss-linux-x64-gnu@1.32.0:
+ resolution: {integrity: sha512-V7Qr52IhZmdKPVr+Vtw8o+WLsQJYCTd8loIfpDaMRWGUZfBOYEJeyJIkqGIDMZPwPx24pUMfwSxxI8phr/MbOA==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ lightningcss-linux-x64-musl@1.32.0:
+ resolution: {integrity: sha512-bYcLp+Vb0awsiXg/80uCRezCYHNg1/l3mt0gzHnWV9XP1W5sKa5/TCdGWaR/zBM2PeF/HbsQv/j2URNOiVuxWg==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [linux]
+
+ lightningcss-win32-arm64-msvc@1.32.0:
+ resolution: {integrity: sha512-8SbC8BR40pS6baCM8sbtYDSwEVQd4JlFTOlaD3gWGHfThTcABnNDBda6eTZeqbofalIJhFx0qKzgHJmcPTnGdw==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [arm64]
+ os: [win32]
+
+ lightningcss-win32-x64-msvc@1.32.0:
+ resolution: {integrity: sha512-Amq9B/SoZYdDi1kFrojnoqPLxYhQ4Wo5XiL8EVJrVsB8ARoC1PWW6VGtT0WKCemjy8aC+louJnjS7U18x3b06Q==}
+ engines: {node: '>= 12.0.0'}
+ cpu: [x64]
+ os: [win32]
+
+ lightningcss@1.32.0:
+ resolution: {integrity: sha512-NXYBzinNrblfraPGyrbPoD19C1h9lfI/1mzgWYvXUTe414Gz/X1FD2XBZSZM7rRTrMA8JL3OtAaGifrIKhQ5yQ==}
+ engines: {node: '>= 12.0.0'}
+
lilconfig@3.1.3:
resolution: {integrity: sha512-/vlFKAoH5Cgt3Ie+JLhRbwOsCQePABiU3tJ1egGvyQ+33R/vcwM2Zl2QR/LzjsBeItPt3oSVXapn+m4nQDvpzw==}
engines: {node: '>=14'}
@@ -6532,6 +7148,10 @@ packages:
resolution: {integrity: sha512-FMJTLMXfCLMLfJxcX9PFqX5qD88Z5MRGaZCVzfuqeZSPsyiBzs+pahDQjbIWz2QIzPZz0NX9Zy4FX3lmK6YHIg==}
engines: {node: '>= 12.13.0'}
+ local-pkg@0.5.1:
+ resolution: {integrity: sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==}
+ engines: {node: '>=14'}
+
locate-path@3.0.0:
resolution: {integrity: sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==}
engines: {node: '>=6'}
@@ -6609,6 +7229,9 @@ packages:
resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==}
hasBin: true
+ loupe@2.3.7:
+ resolution: {integrity: sha512-zSMINGVYkdpYSOBmLi0D1Uo7JU9nVdQKrHxC8eYlV+9YKK9WePqAlL7lSlorG/U2Fw1w0hTBmaa/jrQ3UbPHtA==}
+
loupe@3.1.2:
resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==}
@@ -6636,6 +7259,9 @@ packages:
magic-string@0.30.14:
resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==}
+ magic-string@0.30.21:
+ resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
+
magicast@0.3.5:
resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==}
@@ -6720,6 +7346,9 @@ packages:
mdn-data@2.0.30:
resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==}
+ media-query-parser@2.0.2:
+ resolution: {integrity: sha512-1N4qp+jE0pL5Xv4uEcwVUhIkwdUO3S/9gML90nqKA7v7FcOS5vUtatfzok9S9U1EJU8dHWlcv95WLnKmmxZI9w==}
+
media-typer@0.3.0:
resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==}
engines: {node: '>= 0.6'}
@@ -6954,6 +7583,12 @@ packages:
resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==}
engines: {node: '>=16 || 14 >=14.17'}
+ mlly@1.8.2:
+ resolution: {integrity: sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==}
+
+ modern-ahocorasick@1.1.0:
+ resolution: {integrity: sha512-sEKPVl2rM+MNVkGQt3ChdmD8YsigmXdn5NifZn6jiwn9LRJpWm8F3guhaqrJT/JOat6pwpbXEk6kv+b9DMIjsQ==}
+
mri@1.2.0:
resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==}
engines: {node: '>=4'}
@@ -6978,14 +7613,14 @@ packages:
mz@2.7.0:
resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==}
- nanoid@3.3.8:
- resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
+ nanoid@3.3.11:
+ resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
- nanoid@5.0.9:
- resolution: {integrity: sha512-Aooyr6MXU6HpvvWXKoVoXwKMs/KyVakWwg7xQfv5/S/RIgJMy0Ifa45H9qqYy7pTCszrHzP21Uk4PZq2HpEM8Q==}
- engines: {node: ^18 || >=20}
+ nanoid@3.3.8:
+ resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==}
+ engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
natural-compare@1.4.0:
@@ -7048,6 +7683,9 @@ packages:
peerDependencies:
webpack: ^4.0.0 || ^5.0.0
+ nwsapi@2.2.23:
+ resolution: {integrity: sha512-7wfH4sLbt4M0gCDzGE6vzQBo0bfTKjU7Sfpqy/7gs1qBfYz2vEJH6vXcBKpO3+6Yu1telwd0t9HpyOoLEQQbIQ==}
+
object-assign@4.1.1:
resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==}
engines: {node: '>=0.10.0'}
@@ -7064,21 +7702,12 @@ packages:
resolution: {integrity: sha512-nK28WOo+QIjBkDduTINE4JkF/UJJKyf2EJxvJKfblDpyg0Q+pkOHNTL0Qwy6NP6FhE/EnzV73BxxqcJaXY9anw==}
engines: {node: '>= 0.4'}
- object.entries@1.1.8:
- resolution: {integrity: sha512-cmopxi8VwRIAw/fkijJohSfpef5PdN0pMQJN6VC/ZKvn0LIknWD8KtgY6KlQdEc4tIjcQ3HxSMmnvtzIscdaYQ==}
- engines: {node: '>= 0.4'}
-
- object.fromentries@2.0.8:
- resolution: {integrity: sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==}
- engines: {node: '>= 0.4'}
-
- object.values@1.2.1:
- resolution: {integrity: sha512-gXah6aZrcUxjWg2zR2MwouP2eHlCBzdV4pygudehaKXSGW4v2AsRQUK+lwwXhii6KFZcunEnmSUoYp5CXibxtA==}
- engines: {node: '>= 0.4'}
-
obuf@1.1.2:
resolution: {integrity: sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==}
+ obug@2.1.1:
+ resolution: {integrity: sha512-uTqF9MuPraAQ+IsnPf366RG4cP9RtUi7MLO1N3KEc+wb0a6yKpeL0lmk2IB1jY5KHPAlTc6T/JRdC/YqxHNwkQ==}
+
on-finished@2.4.1:
resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==}
engines: {node: '>= 0.8'}
@@ -7125,10 +7754,6 @@ packages:
outdent@0.5.0:
resolution: {integrity: sha512-/jHxFIzoMXdqPzTaCpFzAAWhpkSjZPF4Vsn6jAfNpmbH/ymsmd7Qc6VE9BGn0L6YMj6uwpQLxCECpus4ukKS9Q==}
- own-keys@1.0.1:
- resolution: {integrity: sha512-qFOyK5PjiWZd+QQIh+1jhdb9LpxTF0qs7Pm8o5QHYZ0M3vKqSqzsZaEB6oWlxZ+q2sJBMI/Ktgd2N5ZwQoRHfg==}
- engines: {node: '>= 0.4'}
-
p-cancelable@3.0.0:
resolution: {integrity: sha512-mlVgR3PGuzlo0MmTdk4cXqXWlwQDLnONTAg6sm62XkMJEiRxN3GL3SffkYvqwonbkJBcrI7Uvv5Zh9yjvn2iUw==}
engines: {node: '>=12.20'}
@@ -7149,6 +7774,10 @@ packages:
resolution: {integrity: sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
+ p-limit@5.0.0:
+ resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==}
+ engines: {node: '>=18'}
+
p-locate@3.0.0:
resolution: {integrity: sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==}
engines: {node: '>=6'}
@@ -7279,6 +7908,12 @@ packages:
pathe@1.1.2:
resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==}
+ pathe@2.0.3:
+ resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==}
+
+ pathval@1.1.1:
+ resolution: {integrity: sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==}
+
pathval@2.0.0:
resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==}
engines: {node: '>= 14.16'}
@@ -7294,6 +7929,10 @@ packages:
resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
engines: {node: '>=12'}
+ picomatch@4.0.4:
+ resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==}
+ engines: {node: '>=12'}
+
pidtree@0.6.0:
resolution: {integrity: sha512-eG2dWTVw5bzqGRztnHExczNxt5VGsE6OwTeCG3fdUf9KBsZzO3R5OIIIzWR+iZA0NtZ+RDVdaoE2dK1cn6jH4g==}
engines: {node: '>=0.10'}
@@ -7311,6 +7950,9 @@ packages:
resolution: {integrity: sha512-Ie9z/WINcxxLp27BKOCHGde4ITq9UklYKDzVo1nhk5sqGEXU3FpkwP5GM2voTGJkGd9B3Otl+Q4uwSOeSUtOBA==}
engines: {node: '>=14.16'}
+ pkg-types@1.3.1:
+ resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==}
+
pkg-up@3.1.0:
resolution: {integrity: sha512-nDywThFk1i4BQK4twPQ6TA4RT8bDY96yeuCVBWL3ePARCiEKDRSrNGbFIgUJpLp+XeIR65v8ra7WuJOFUBtkMA==}
engines: {node: '>=8'}
@@ -7732,6 +8374,10 @@ packages:
resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==}
engines: {node: ^10 || ^12 || >=14}
+ postcss@8.5.9:
+ resolution: {integrity: sha512-7a70Nsot+EMX9fFU3064K/kdHWZqGVY+BADLyXc8Dfv+mTLLVl6JzJpPaCZ2kQL9gIJvKXSLMHhqdRRjwQeFtw==}
+ engines: {node: ^10 || ^12 || >=14}
+
prelude-ls@1.2.1:
resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==}
engines: {node: '>= 0.8.0'}
@@ -7748,6 +8394,10 @@ packages:
resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
+ pretty-format@29.7.0:
+ resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==}
+ engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0}
+
pretty-ms@9.2.0:
resolution: {integrity: sha512-4yf0QO/sllf/1zbZWYnvWw3NxCQwLXKzIj0G849LSufP15BXKM0rbD2Z3wVnkMfjdn/CB0Dpp444gYAACdsplg==}
engines: {node: '>=18'}
@@ -7877,6 +8527,9 @@ packages:
react-is@17.0.2:
resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
+ react-is@18.3.1:
+ resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==}
+
react-json-view-lite@1.5.0:
resolution: {integrity: sha512-nWqA1E4jKPklL2jvHWs6s+7Na0qNgw9HCP6xehdQJeg6nPBTFZgGwyko9Q0oj+jQWKTTVRS30u0toM5wiuL3iw==}
engines: {node: '>=14'}
@@ -7960,10 +8613,6 @@ packages:
resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
engines: {node: '>=8'}
- reflect.getprototypeof@1.0.10:
- resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
- engines: {node: '>= 0.4'}
-
regenerate-unicode-properties@10.2.0:
resolution: {integrity: sha512-DqHn3DwbmmPVzeKj9woBadqmXxLvQoQIwu7nopMc72ztvxVmVk2SBhSnx67zuye5TP+lJsb/TBQsjLKhnDf3MA==}
engines: {node: '>=4'}
@@ -7977,10 +8626,6 @@ packages:
regenerator-transform@0.15.2:
resolution: {integrity: sha512-hfMp2BoF0qOk3uc5V20ALGDS2ddjQaLrdl7xrGXvAIow7qeWRM2VA2HuCHkUKk9slq3VwEwLNK3DFBqDfPGYtg==}
- regexp.prototype.flags@1.5.4:
- resolution: {integrity: sha512-dYqgNSZbDwkaJ2ceRd9ojCGjBq+mOm9LmtXnAnEGyHhN/5R7iDW2TRw3h+o/jCFxus3P2LfWIIiwowAjANm7IA==}
- engines: {node: '>= 0.4'}
-
regexpu-core@6.2.0:
resolution: {integrity: sha512-H66BPQMrv+V16t8xtmq+UC0CBpiTBA60V8ibS1QVReIp8T1z8hwFxqcGzm9K6lgsN7sB5edVH8a+ze6Fqm4weA==}
engines: {node: '>=4'}
@@ -8081,10 +8726,6 @@ packages:
resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==}
hasBin: true
- resolve@2.0.0-next.5:
- resolution: {integrity: sha512-U7WjGVG9sH8tvjW5SmGbQuui75FiyjAX72HX15DwBBwF9dNiQZRQAg9nnPhYy+TUnE0+VcrttuvNI8oSxZcocA==}
- hasBin: true
-
responselike@3.0.0:
resolution: {integrity: sha512-40yHxbNcl2+rzXvZuVkrYohathsSJlMTXKryG5y8uciHv1+xDLHQpgjG64JUO9nrEq2jGLH6IZ8BcZyw3wrweg==}
engines: {node: '>=14.16'}
@@ -8113,11 +8754,24 @@ packages:
deprecated: Rimraf versions prior to v4 are no longer supported
hasBin: true
+ rolldown@1.0.0-rc.15:
+ resolution: {integrity: sha512-Ff31guA5zT6WjnGp0SXw76X6hzGRk/OQq2hE+1lcDe+lJdHSgnSX6nK3erbONHyCbpSj9a9E+uX/OvytZoWp2g==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+
rollup@4.28.0:
resolution: {integrity: sha512-G9GOrmgWHBma4YfCcX8PjH0qhXSdH8B4HDE2o4/jaxj93S4DPCIDoLcXz99eWMji4hB29UFCEd7B2gwGJDR9cQ==}
engines: {node: '>=18.0.0', npm: '>=8.0.0'}
hasBin: true
+ rollup@4.60.1:
+ resolution: {integrity: sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==}
+ engines: {node: '>=18.0.0', npm: '>=8.0.0'}
+ hasBin: true
+
+ rrweb-cssom@0.8.0:
+ resolution: {integrity: sha512-guoltQEx+9aMf2gDZ0s62EcV8lsXR+0w8915TC3ITdn2YueuNjdAYh/levpU9nFaoChh9RUS5ZdQMrKfVEN9tw==}
+
rtl-detect@1.1.2:
resolution: {integrity: sha512-PGMBq03+TTG/p/cRB7HCLKJ1MgDIi07+QU1faSjiYRfmY5UsAttV9Hs08jDAHVwcOwmVLcSJkpwyfXszVjWfIQ==}
@@ -8136,24 +8790,12 @@ packages:
rxjs@7.8.1:
resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==}
- safe-array-concat@1.1.3:
- resolution: {integrity: sha512-AURm5f0jYEOydBj7VQlVvDrjeFgthDdEF5H1dP+6mNpoXOMo1quQqJ4wvJDyRZ9+pO3kGWoOdmV08cSv2aJV6Q==}
- engines: {node: '>=0.4'}
-
safe-buffer@5.1.2:
resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==}
safe-buffer@5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
- safe-push-apply@1.0.0:
- resolution: {integrity: sha512-iKE9w/Z7xCzUMIZqdBsp6pEQvwuEebH4vdpjcDWnyzaI6yl6O9FHvVpmGelvEHNsoY6wGblkxR6Zty/h00WiSA==}
- engines: {node: '>= 0.4'}
-
- safe-regex-test@1.1.0:
- resolution: {integrity: sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==}
- engines: {node: '>= 0.4'}
-
safer-buffer@2.1.2:
resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==}
@@ -8163,6 +8805,10 @@ packages:
sax@1.4.1:
resolution: {integrity: sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==}
+ saxes@6.0.0:
+ resolution: {integrity: sha512-xAg7SOnEhrm5zI3puOOKyy1OMcMlIJZYNJY7xLBwSze0UjhPLnWfj2GF2EpT0jmzaJKIWKHLsaSSajf35bcYnA==}
+ engines: {node: '>=v12.22.7'}
+
scheduler@0.23.2:
resolution: {integrity: sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==}
@@ -8227,14 +8873,6 @@ packages:
resolution: {integrity: sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==}
engines: {node: '>= 0.4'}
- set-function-name@2.0.2:
- resolution: {integrity: sha512-7PGFlmtwsEADb0WYyvCMa1t+yke6daIG4Wirafur5kcf+MhUnPms1UeR0CKQdTZD81yESwMHbtn+TR+dMviakQ==}
- engines: {node: '>= 0.4'}
-
- set-proto@1.0.0:
- resolution: {integrity: sha512-RJRdvCo6IAnPdsvP/7m6bsQqNnn1FCBX5ZNtFL98MmFF/4xAIJTIg1YbHW5DC2W5SKZanrC6i4HsJqlajw/dZw==}
- engines: {node: '>= 0.4'}
-
setprototypeof@1.1.0:
resolution: {integrity: sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==}
@@ -8352,6 +8990,10 @@ packages:
resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==}
engines: {node: '>= 8'}
+ source-map@0.7.6:
+ resolution: {integrity: sha512-i5uvt8C3ikiWeNZSVZNWcfZPItFQOsYTUAOkcUPGd8DqDy1uOUikjt5dG+uRlwyvR108Fb9DOd4GvXfT0N2/uQ==}
+ engines: {node: '>= 12'}
+
source-map@0.8.0-beta.0:
resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==}
engines: {node: '>= 8'}
@@ -8420,25 +9062,6 @@ packages:
resolution: {integrity: sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==}
engines: {node: '>=18'}
- string.prototype.matchall@4.0.12:
- resolution: {integrity: sha512-6CC9uyBL+/48dYizRf7H7VAYCMCNTBeM78x/VTUe9bFEaxBepPJDa1Ow99LqI/1yF7kuy7Q3cQsYMrcjGUcskA==}
- engines: {node: '>= 0.4'}
-
- string.prototype.repeat@1.0.0:
- resolution: {integrity: sha512-0u/TldDbKD8bFCQ/4f5+mNRrXwZ8hg2w7ZR8wa16e8z9XpePWl3eGEcUD0OXpEH/VJH/2G3gjUtR3ZOiBe2S/w==}
-
- string.prototype.trim@1.2.10:
- resolution: {integrity: sha512-Rs66F0P/1kedk5lyYyH9uBzuiI/kNRmwJAR9quK6VOtIpZ2G+hMZd+HQbbv25MgCA6gEffoMZYxlTod4WcdrKA==}
- engines: {node: '>= 0.4'}
-
- string.prototype.trimend@1.0.9:
- resolution: {integrity: sha512-G7Ok5C6E/j4SGfyLCloXTrngQIQU3PWtXGst3yM7Bea9FRURf1S42ZHlZZtsNque2FN2PoUhfZXYLNWwEr4dLQ==}
- engines: {node: '>= 0.4'}
-
- string.prototype.trimstart@1.0.8:
- resolution: {integrity: sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==}
- engines: {node: '>= 0.4'}
-
string_decoder@1.1.1:
resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==}
@@ -8500,6 +9123,9 @@ packages:
resolution: {integrity: sha512-0fk9zBqO67Nq5M/m45qHCJxylV/DhBlIOVExqgOMiCCrzrhU6tCibRXNqE3jwJLftzE9SNuZtYbpzcO+i9FiKw==}
engines: {node: '>=14.16'}
+ strip-literal@2.1.1:
+ resolution: {integrity: sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==}
+
style-to-object@1.0.8:
resolution: {integrity: sha512-xT47I/Eo0rwJmaXC4oilDGDWLohVhR6o/xAQcPQN8q6QBuZVL8qMYL85kLmST5cPjAorwvqIA4qXTRQoYHaL6g==}
@@ -8541,6 +9167,9 @@ packages:
engines: {node: '>=14.0.0'}
hasBin: true
+ symbol-tree@3.2.4:
+ resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==}
+
tapable@1.1.3:
resolution: {integrity: sha512-4WK/bYZmj8xLr+HUCODHGF1ZFzsYffasLUgEiMBY4fgtltdO6B4WJtlSbPaDTLpYTcGVwM2qLnFTICEcNxs3kA==}
engines: {node: '>=6'}
@@ -8610,10 +9239,21 @@ packages:
tinyexec@0.3.1:
resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==}
+ tinyexec@0.3.2:
+ resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==}
+
tinyglobby@0.2.10:
resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==}
engines: {node: '>=12.0.0'}
+ tinyglobby@0.2.16:
+ resolution: {integrity: sha512-pn99VhoACYR8nFHhxqix+uvsbXineAasWm5ojXoN8xEwK5Kd3/TrhNn1wByuD52UxWRLy8pu+kRMniEi6Eq9Zg==}
+ engines: {node: '>=12.0.0'}
+
+ tinypool@0.8.4:
+ resolution: {integrity: sha512-i11VH5gS6IFeLY3gMBQ00/MmLncVP7JLXOw1vlgkytLmJK7QnEr7NXf0LBdxfmNPAeyetukOk0bOYrJrFGjYJQ==}
+ engines: {node: '>=14.0.0'}
+
tinypool@1.0.2:
resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==}
engines: {node: ^18.0.0 || >=20.0.0}
@@ -8622,10 +9262,21 @@ packages:
resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==}
engines: {node: '>=14.0.0'}
+ tinyspy@2.2.1:
+ resolution: {integrity: sha512-KYad6Vy5VDWV4GH3fjpseMQ/XU2BhIYP7Vzd0LG44qRWm/Yt2WCOTicFdvmgo6gWaqooMQCawTtILVQJupKu7A==}
+ engines: {node: '>=14.0.0'}
+
tinyspy@3.0.2:
resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==}
engines: {node: '>=14.0.0'}
+ tldts-core@6.1.86:
+ resolution: {integrity: sha512-Je6p7pkk+KMzMv2XXKmAE3McmolOQFdxkKw0R8EYNr7sELW46JqnNeTX8ybPiQgvg1ymCoF8LXs5fzFaZvJPTA==}
+
+ tldts@6.1.86:
+ resolution: {integrity: sha512-WMi/OQ2axVTf/ykqCQgXiIct+mSQDFdH2fkwhPwgEwvJ1kSzZRiinb0zF2Xb8u4+OqPChmyI6MEu4EezNJz+FQ==}
+ hasBin: true
+
tmp@0.0.33:
resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==}
engines: {node: '>=0.6.0'}
@@ -8642,9 +9293,17 @@ packages:
resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==}
engines: {node: '>=6'}
+ tough-cookie@5.1.2:
+ resolution: {integrity: sha512-FVDYdxtnj0G6Qm/DhNPSb8Ju59ULcup3tuJxkFb5K8Bv2pUXILbf0xZWU8PX8Ov19OXljbUyveOFwRMwkXzO+A==}
+ engines: {node: '>=16'}
+
tr46@1.0.1:
resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==}
+ tr46@5.1.1:
+ resolution: {integrity: sha512-hdF5ZgjTqgAntKkklYw0R03MG2x/bSzTtkxmIRw/sTNV8YXsCJ1tfLAX23lhxhHJlEf3CRCOCGGWw3vI3GaSPw==}
+ engines: {node: '>=18'}
+
tree-kill@1.2.2:
resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
hasBin: true
@@ -8655,18 +9314,6 @@ packages:
trough@2.2.0:
resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==}
- ts-api-utils@1.4.3:
- resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==}
- engines: {node: '>=16'}
- peerDependencies:
- typescript: '>=4.2.0'
-
- ts-api-utils@2.0.0:
- resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==}
- engines: {node: '>=18.12'}
- peerDependencies:
- typescript: '>=4.8.4'
-
ts-dedent@2.2.0:
resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==}
engines: {node: '>=6.10'}
@@ -8674,9 +9321,6 @@ packages:
ts-interface-checker@0.1.13:
resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==}
- ts-pattern@5.6.0:
- resolution: {integrity: sha512-SL8u60X5+LoEy9tmQHWCdPc2hhb2pKI6I1tU5Jue3v8+iRqZdcT3mWPwKKJy1fMfky6uha82c8ByHAE8PMhKHw==}
-
tsconfig-paths@4.2.0:
resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==}
engines: {node: '>=6'}
@@ -8703,6 +9347,25 @@ packages:
typescript:
optional: true
+ tsup@8.5.1:
+ resolution: {integrity: sha512-xtgkqwdhpKWr3tKPmCkvYmS9xnQK3m3XgxZHwSUjvfTjp7YfXe5tT3GgWi0F2N+ZSMsOeWeZFh7ZZFg5iPhing==}
+ engines: {node: '>=18'}
+ hasBin: true
+ peerDependencies:
+ '@microsoft/api-extractor': ^7.36.0
+ '@swc/core': ^1
+ postcss: ^8.4.12
+ typescript: '>=4.5.0'
+ peerDependenciesMeta:
+ '@microsoft/api-extractor':
+ optional: true
+ '@swc/core':
+ optional: true
+ postcss:
+ optional: true
+ typescript:
+ optional: true
+
tsx@4.19.2:
resolution: {integrity: sha512-pOUl6Vo2LUq/bSa8S5q7b91cgNSjctn9ugq/+Mvow99qW6x/UZYwzxy/3NmqoT66eHYfCVvFvACC58UBPFf28g==}
engines: {node: '>=18.0.0'}
@@ -8715,6 +9378,10 @@ packages:
resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==}
engines: {node: '>= 0.8.0'}
+ type-detect@4.1.0:
+ resolution: {integrity: sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==}
+ engines: {node: '>=4'}
+
type-fest@0.21.3:
resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
engines: {node: '>=10'}
@@ -8731,40 +9398,16 @@ packages:
resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==}
engines: {node: '>= 0.6'}
- typed-array-buffer@1.0.3:
- resolution: {integrity: sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==}
- engines: {node: '>= 0.4'}
-
- typed-array-byte-length@1.0.3:
- resolution: {integrity: sha512-BaXgOuIxz8n8pIq3e7Atg/7s+DpiYrxn4vdot3w9KbnBhcRQq6o3xemQdIfynqSeXeDrF32x+WvfzmOjPiY9lg==}
- engines: {node: '>= 0.4'}
-
- typed-array-byte-offset@1.0.4:
- resolution: {integrity: sha512-bTlAFB/FBYMcuX81gbL4OcpH5PmlFHqlCCpAl8AlEzMz5k53oNDvN8p1PNOWLEmI2x4orp3raOFB51tv9X+MFQ==}
- engines: {node: '>= 0.4'}
-
- typed-array-length@1.0.7:
- resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==}
- engines: {node: '>= 0.4'}
-
typedarray-to-buffer@3.1.5:
resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==}
- typescript-eslint@8.22.0:
- resolution: {integrity: sha512-Y2rj210FW1Wb6TWXzQc5+P+EWI9/zdS57hLEc0gnyuvdzWo8+Y8brKlbj0muejonhMI/xAZCnZZwjbIfv1CkOw==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- eslint: ^8.57.0 || ^9.0.0
- typescript: '>=4.8.4 <5.8.0'
-
typescript@5.6.3:
resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==}
engines: {node: '>=14.17'}
hasBin: true
- unbox-primitive@1.1.0:
- resolution: {integrity: sha512-nWJ91DjeOkej/TA8pXQ3myruKpKEYgqvpw9lz4OPHj/NWFNluYrjbz9j01CJ8yKQd2g4jFoOkINCTW2I5LEEyw==}
- engines: {node: '>= 0.4'}
+ ufo@1.6.3:
+ resolution: {integrity: sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==}
undici-types@6.20.0:
resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
@@ -8898,11 +9541,21 @@ packages:
vfile@6.0.3:
resolution: {integrity: sha512-KzIbH/9tXat2u30jf+smMwFCsno4wHVdNmzFyL+T/L3UGqqk6JKfVqOFOZEpZSHADH1k40ab6NUIXZq422ov3Q==}
+ vite-node@1.6.1:
+ resolution: {integrity: sha512-YAXkfvGtuTzwWbDSACdJSg4A4DZiAqckWe90Zapc/sEX3XvHcw1NdurM/6od8J207tSDqNbSsgdCacBgvJKFuA==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+
vite-node@2.1.8:
resolution: {integrity: sha512-uPAwSr57kYjAUux+8E2j0q0Fxpn8M9VoyfGiRI8Kfktz9NcYMCenwY5RnZxnF1WTu3TGiYipirIzacLL3VVGFg==}
engines: {node: ^18.0.0 || >=20.0.0}
hasBin: true
+ vite-node@6.0.0:
+ resolution: {integrity: sha512-oj4PVrT+pDh6GYf5wfUXkcZyekYS8kKPfLPXVl8qe324Ec6l4K2DUKNadRbZ3LQl0qGcDz+PyOo7ZAh00Y+JjQ==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+
vite@5.4.11:
resolution: {integrity: sha512-c7jFQRklXua0mTzneGW9QVyxFjUgwcihC4bXEtujIo2ouWCe1Ajt/amn2PCxYnhYfd5k09JX3SB7OYWFKYqj8Q==}
engines: {node: ^18.0.0 || >=20.0.0}
@@ -8919,9 +9572,48 @@ packages:
peerDependenciesMeta:
'@types/node':
optional: true
- less:
+ less:
+ optional: true
+ lightningcss:
+ optional: true
+ sass:
+ optional: true
+ sass-embedded:
+ optional: true
+ stylus:
+ optional: true
+ sugarss:
+ optional: true
+ terser:
+ optional: true
+
+ vite@8.0.8:
+ resolution: {integrity: sha512-dbU7/iLVa8KZALJyLOBOQ88nOXtNG8vxKuOT4I2mD+Ya70KPceF4IAmDsmU0h1Qsn5bPrvsY9HJstCRh3hG6Uw==}
+ engines: {node: ^20.19.0 || >=22.12.0}
+ hasBin: true
+ peerDependencies:
+ '@types/node': ^20.19.0 || >=22.12.0
+ '@vitejs/devtools': ^0.1.0
+ esbuild: ^0.27.0 || ^0.28.0
+ jiti: '>=1.21.0'
+ less: ^4.0.0
+ sass: ^1.70.0
+ sass-embedded: ^1.70.0
+ stylus: '>=0.54.8'
+ sugarss: ^5.0.0
+ terser: ^5.16.0
+ tsx: ^4.8.1
+ yaml: ^2.4.2
+ peerDependenciesMeta:
+ '@types/node':
+ optional: true
+ '@vitejs/devtools':
+ optional: true
+ esbuild:
+ optional: true
+ jiti:
optional: true
- lightningcss:
+ less:
optional: true
sass:
optional: true
@@ -8933,6 +9625,35 @@ packages:
optional: true
terser:
optional: true
+ tsx:
+ optional: true
+ yaml:
+ optional: true
+
+ vitest@1.6.1:
+ resolution: {integrity: sha512-Ljb1cnSJSivGN0LqXd/zmDbWEM0RNNg2t1QW/XUhYl/qPqyu7CsqeWtqQXHVaJsecLPuDoak2oJcZN2QoRIOag==}
+ engines: {node: ^18.0.0 || >=20.0.0}
+ hasBin: true
+ peerDependencies:
+ '@edge-runtime/vm': '*'
+ '@types/node': ^18.0.0 || >=20.0.0
+ '@vitest/browser': 1.6.1
+ '@vitest/ui': 1.6.1
+ happy-dom: '*'
+ jsdom: '*'
+ peerDependenciesMeta:
+ '@edge-runtime/vm':
+ optional: true
+ '@types/node':
+ optional: true
+ '@vitest/browser':
+ optional: true
+ '@vitest/ui':
+ optional: true
+ happy-dom:
+ optional: true
+ jsdom:
+ optional: true
vitest@2.1.8:
resolution: {integrity: sha512-1vBKTZskHw/aosXqQUlVWWlGUxSJR8YtiyZDJAFeW2kPAeX6S3Sool0mjspO+kXLuxVWlEDDowBAeqeAQefqLQ==}
@@ -8959,6 +9680,10 @@ packages:
jsdom:
optional: true
+ w3c-xmlserializer@5.0.0:
+ resolution: {integrity: sha512-o8qghlI8NZHU1lLPrpi2+Uq7abh4GGPpYANlalzWxyWteJOCsr/P+oPBA49TOLu5FTZO4d3F9MnWJfiMo4BkmA==}
+ engines: {node: '>=18'}
+
watchpack@2.4.2:
resolution: {integrity: sha512-TnbFSbcOCcDgjZ4piURLCbJ3nJhznVh9kw6F6iokjiFPl8ONxe9A6nMDVXDiNbrSfLILs6vB07F7wLBrwPYzJw==}
engines: {node: '>=10.13.0'}
@@ -9042,24 +9767,25 @@ packages:
resolution: {integrity: sha512-OqedPIGOfsDlo31UNwYbCFMSaO9m9G/0faIHj5/dZFDMFqPTcx6UwqyOy3COEaEOg/9VsGIpdqn62W5KhoKSpg==}
engines: {node: '>=0.8.0'}
+ whatwg-encoding@3.1.1:
+ resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
+ engines: {node: '>=18'}
+ deprecated: Use @exodus/bytes instead for a more spec-conformant and faster implementation
+
whatwg-mimetype@3.0.0:
resolution: {integrity: sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==}
engines: {node: '>=12'}
- whatwg-url@7.1.0:
- resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==}
-
- which-boxed-primitive@1.1.1:
- resolution: {integrity: sha512-TbX3mj8n0odCBFVlY8AxkqcHASw3L60jIuF8jFP78az3C2YhmGvqbHBpAjTRH2/xqYunrJ9g1jSyjCjpoWzIAA==}
- engines: {node: '>= 0.4'}
+ whatwg-mimetype@4.0.0:
+ resolution: {integrity: sha512-QaKxh0eNIi2mE9p2vEdzfagOKHCcj1pJ56EEHGQOVxp8r9/iszLUUV7v89x9O1p/T+NlTM5W7jW6+cz4Fq1YVg==}
+ engines: {node: '>=18'}
- which-builtin-type@1.2.1:
- resolution: {integrity: sha512-6iBczoX+kDQ7a3+YJBnh3T+KZRxM/iYNPXicqk66/Qfm1b93iu+yOImkg0zHbj5LNOcNv1TEADiZ0xa34B4q6Q==}
- engines: {node: '>= 0.4'}
+ whatwg-url@14.2.0:
+ resolution: {integrity: sha512-De72GdQZzNTUBBChsXueQUnPKDkg/5A5zp7pFDuQAj5UFoENpiACU0wlCvzpAGnTkj++ihpKwKyYewn/XNUbKw==}
+ engines: {node: '>=18'}
- which-collection@1.0.2:
- resolution: {integrity: sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==}
- engines: {node: '>= 0.4'}
+ whatwg-url@7.1.0:
+ resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==}
which-typed-array@1.1.18:
resolution: {integrity: sha512-qEcY+KJYlWyLH9vNbsr6/5j59AXk5ni5aakf8ldzBvGde6Iz4sxZGkJyWSAueTG7QhOvNRYb1lDdFmL5Td0QKA==}
@@ -9140,6 +9866,13 @@ packages:
resolution: {integrity: sha512-7rVi2KMfwfWFl+GpPg6m80IVMWXLRjO+PxTq7V2CDhoGak0wzYzFgUY2m4XJ47OGdXd8eLE8EmwfAmdjw7lC1g==}
hasBin: true
+ xml-name-validator@5.0.0:
+ resolution: {integrity: sha512-EvGK8EJ3DhaHfbRlETOWAS5pO9MZITeauHKJyb8wyajUfQUenkIg2MvLDTZ4T/TgIcm3HU0TFBgWWboAZ30UHg==}
+ engines: {node: '>=18'}
+
+ xmlchars@2.2.0:
+ resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==}
+
y18n@5.0.8:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}
@@ -9376,6 +10109,14 @@ snapshots:
'@jridgewell/gen-mapping': 0.3.5
'@jridgewell/trace-mapping': 0.3.25
+ '@asamuzakjp/css-color@3.2.0':
+ dependencies:
+ '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+ '@csstools/css-color-parser': 3.1.0(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+ '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3)
+ '@csstools/css-tokenizer': 3.0.3
+ lru-cache: 10.4.3
+
'@babel/code-frame@7.26.2':
dependencies:
'@babel/helper-validator-identifier': 7.25.9
@@ -10449,11 +11190,18 @@ snapshots:
'@csstools/color-helpers@5.0.1': {}
+ '@csstools/color-helpers@5.1.0': {}
+
'@csstools/css-calc@2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)':
dependencies:
'@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3)
'@csstools/css-tokenizer': 3.0.3
+ '@csstools/css-calc@2.1.4(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)':
+ dependencies:
+ '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3)
+ '@csstools/css-tokenizer': 3.0.3
+
'@csstools/css-color-parser@3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)':
dependencies:
'@csstools/color-helpers': 5.0.1
@@ -10461,6 +11209,13 @@ snapshots:
'@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3)
'@csstools/css-tokenizer': 3.0.3
+ '@csstools/css-color-parser@3.1.0(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)':
+ dependencies:
+ '@csstools/color-helpers': 5.1.0
+ '@csstools/css-calc': 2.1.4(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
+ '@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3)
+ '@csstools/css-tokenizer': 3.0.3
+
'@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)':
dependencies:
'@csstools/css-tokenizer': 3.0.3
@@ -10712,7 +11467,7 @@ snapshots:
transitivePeerDependencies:
- '@algolia/client-search'
- '@docusaurus/babel@3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
+ '@docusaurus/babel@3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
'@babel/core': 7.26.0
'@babel/generator': 7.26.5
@@ -10725,7 +11480,7 @@ snapshots:
'@babel/runtime-corejs3': 7.26.7
'@babel/traverse': 7.26.5
'@docusaurus/logger': 3.6.3
- '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
babel-plugin-dynamic-import-node: 2.3.3
fs-extra: 11.3.0
tslib: 2.8.1
@@ -10740,33 +11495,33 @@ snapshots:
- uglify-js
- webpack-cli
- '@docusaurus/bundler@3.6.3(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
+ '@docusaurus/bundler@3.6.3(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
'@babel/core': 7.26.0
- '@docusaurus/babel': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/babel': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/cssnano-preset': 3.6.3
'@docusaurus/logger': 3.6.3
- '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- babel-loader: 9.2.1(@babel/core@7.26.0)(webpack@5.97.1(esbuild@0.24.0))
+ '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ babel-loader: 9.2.1(@babel/core@7.26.0)(webpack@5.97.1(esbuild@0.27.7))
clean-css: 5.3.3
- copy-webpack-plugin: 11.0.0(webpack@5.97.1(esbuild@0.24.0))
- css-loader: 6.11.0(webpack@5.97.1(esbuild@0.24.0))
- css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(esbuild@0.24.0)(webpack@5.97.1(esbuild@0.24.0))
+ copy-webpack-plugin: 11.0.0(webpack@5.97.1(esbuild@0.27.7))
+ css-loader: 6.11.0(webpack@5.97.1(esbuild@0.27.7))
+ css-minimizer-webpack-plugin: 5.0.1(clean-css@5.3.3)(esbuild@0.27.7)(lightningcss@1.32.0)(webpack@5.97.1(esbuild@0.27.7))
cssnano: 6.1.2(postcss@8.4.49)
- file-loader: 6.2.0(webpack@5.97.1(esbuild@0.24.0))
+ file-loader: 6.2.0(webpack@5.97.1(esbuild@0.27.7))
html-minifier-terser: 7.2.0
- mini-css-extract-plugin: 2.9.2(webpack@5.97.1(esbuild@0.24.0))
- null-loader: 4.0.1(webpack@5.97.1(esbuild@0.24.0))
+ mini-css-extract-plugin: 2.9.2(webpack@5.97.1(esbuild@0.27.7))
+ null-loader: 4.0.1(webpack@5.97.1(esbuild@0.27.7))
postcss: 8.4.49
- postcss-loader: 7.3.4(postcss@8.4.49)(typescript@5.6.3)(webpack@5.97.1(esbuild@0.24.0))
+ postcss-loader: 7.3.4(postcss@8.4.49)(typescript@5.6.3)(webpack@5.97.1(esbuild@0.27.7))
postcss-preset-env: 10.1.3(postcss@8.4.49)
- react-dev-utils: 12.0.1(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)(webpack@5.97.1(esbuild@0.24.0))
- terser-webpack-plugin: 5.3.11(esbuild@0.24.0)(webpack@5.97.1(esbuild@0.24.0))
+ react-dev-utils: 12.0.1(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)(webpack@5.97.1(esbuild@0.27.7))
+ terser-webpack-plugin: 5.3.11(esbuild@0.27.7)(webpack@5.97.1(esbuild@0.27.7))
tslib: 2.8.1
- url-loader: 4.1.1(file-loader@6.2.0(webpack@5.97.1(esbuild@0.24.0)))(webpack@5.97.1(esbuild@0.24.0))
- webpack: 5.97.1(esbuild@0.24.0)
- webpackbar: 6.0.1(webpack@5.97.1(esbuild@0.24.0))
+ url-loader: 4.1.1(file-loader@6.2.0(webpack@5.97.1(esbuild@0.27.7)))(webpack@5.97.1(esbuild@0.27.7))
+ webpack: 5.97.1(esbuild@0.27.7)
+ webpackbar: 6.0.1(webpack@5.97.1(esbuild@0.27.7))
transitivePeerDependencies:
- '@parcel/css'
- '@rspack/core'
@@ -10785,15 +11540,15 @@ snapshots:
- vue-template-compiler
- webpack-cli
- '@docusaurus/core@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
+ '@docusaurus/core@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
- '@docusaurus/babel': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/bundler': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/babel': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/bundler': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/logger': 3.6.3
- '@docusaurus/mdx-loader': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/utils-common': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils-validation': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/mdx-loader': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils-validation': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@mdx-js/react': 3.1.0(@types/react@18.3.13)(react@18.3.1)
boxen: 6.2.1
chalk: 4.1.2
@@ -10809,17 +11564,17 @@ snapshots:
eval: 0.1.8
fs-extra: 11.3.0
html-tags: 3.3.1
- html-webpack-plugin: 5.6.3(webpack@5.97.1(esbuild@0.24.0))
+ html-webpack-plugin: 5.6.3(webpack@5.97.1(esbuild@0.27.7))
leven: 3.1.0
lodash: 4.17.21
p-map: 4.0.0
prompts: 2.4.2
react: 18.3.1
- react-dev-utils: 12.0.1(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)(webpack@5.97.1(esbuild@0.24.0))
+ react-dev-utils: 12.0.1(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)(webpack@5.97.1(esbuild@0.27.7))
react-dom: 18.3.1(react@18.3.1)
react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)'
- react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.97.1(esbuild@0.24.0))
+ react-loadable-ssr-addon-v5-slorber: 1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.97.1(esbuild@0.27.7))
react-router: 5.3.4(react@18.3.1)
react-router-config: 5.1.1(react-router@5.3.4(react@18.3.1))(react@18.3.1)
react-router-dom: 5.3.4(react@18.3.1)
@@ -10829,9 +11584,9 @@ snapshots:
shelljs: 0.8.5
tslib: 2.8.1
update-notifier: 6.0.2
- webpack: 5.97.1(esbuild@0.24.0)
+ webpack: 5.97.1(esbuild@0.27.7)
webpack-bundle-analyzer: 4.10.2
- webpack-dev-server: 4.15.2(webpack@5.97.1(esbuild@0.24.0))
+ webpack-dev-server: 4.15.2(webpack@5.97.1(esbuild@0.27.7))
webpack-merge: 6.0.1
transitivePeerDependencies:
- '@docusaurus/faster'
@@ -10865,16 +11620,16 @@ snapshots:
chalk: 4.1.2
tslib: 2.8.1
- '@docusaurus/mdx-loader@3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
+ '@docusaurus/mdx-loader@3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
'@docusaurus/logger': 3.6.3
- '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/utils-validation': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/utils-validation': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@mdx-js/mdx': 3.1.0(acorn@8.14.0)
'@slorber/remark-comment': 1.0.0
escape-html: 1.0.3
estree-util-value-to-estree: 3.2.1
- file-loader: 6.2.0(webpack@5.97.1(esbuild@0.24.0))
+ file-loader: 6.2.0(webpack@5.97.1(esbuild@0.27.7))
fs-extra: 11.3.0
image-size: 1.2.0
mdast-util-mdx: 3.0.0
@@ -10890,9 +11645,9 @@ snapshots:
tslib: 2.8.1
unified: 11.0.5
unist-util-visit: 5.0.0
- url-loader: 4.1.1(file-loader@6.2.0(webpack@5.97.1(esbuild@0.24.0)))(webpack@5.97.1(esbuild@0.24.0))
+ url-loader: 4.1.1(file-loader@6.2.0(webpack@5.97.1(esbuild@0.27.7)))(webpack@5.97.1(esbuild@0.27.7))
vfile: 6.0.3
- webpack: 5.97.1(esbuild@0.24.0)
+ webpack: 5.97.1(esbuild@0.27.7)
transitivePeerDependencies:
- '@swc/core'
- acorn
@@ -10902,9 +11657,9 @@ snapshots:
- uglify-js
- webpack-cli
- '@docusaurus/module-type-aliases@3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ '@docusaurus/module-type-aliases@3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@types/history': 4.7.11
'@types/react': 18.3.13
'@types/react-router-config': 5.0.11
@@ -10921,17 +11676,17 @@ snapshots:
- uglify-js
- webpack-cli
- '@docusaurus/plugin-content-blog@3.6.3(@docusaurus/plugin-content-docs@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
+ '@docusaurus/plugin-content-blog@3.6.3(@docusaurus/plugin-content-docs@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
- '@docusaurus/core': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/core': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/logger': 3.6.3
- '@docusaurus/mdx-loader': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/plugin-content-docs': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/theme-common': 3.6.3(@docusaurus/plugin-content-docs@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/utils-common': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils-validation': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/mdx-loader': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-content-docs': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/theme-common': 3.6.3(@docusaurus/plugin-content-docs@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils-validation': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
cheerio: 1.0.0-rc.12
feed: 4.2.2
fs-extra: 11.3.0
@@ -10943,7 +11698,7 @@ snapshots:
tslib: 2.8.1
unist-util-visit: 5.0.0
utility-types: 3.11.0
- webpack: 5.97.1(esbuild@0.24.0)
+ webpack: 5.97.1(esbuild@0.27.7)
transitivePeerDependencies:
- '@docusaurus/faster'
- '@mdx-js/react'
@@ -10965,17 +11720,17 @@ snapshots:
- vue-template-compiler
- webpack-cli
- '@docusaurus/plugin-content-docs@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
+ '@docusaurus/plugin-content-docs@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
- '@docusaurus/core': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/core': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/logger': 3.6.3
- '@docusaurus/mdx-loader': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/module-type-aliases': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/theme-common': 3.6.3(@docusaurus/plugin-content-docs@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/utils-common': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils-validation': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/mdx-loader': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/module-type-aliases': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/theme-common': 3.6.3(@docusaurus/plugin-content-docs@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils-validation': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@types/react-router-config': 5.0.11
combine-promises: 1.2.0
fs-extra: 11.3.0
@@ -10985,7 +11740,7 @@ snapshots:
react-dom: 18.3.1(react@18.3.1)
tslib: 2.8.1
utility-types: 3.11.0
- webpack: 5.97.1(esbuild@0.24.0)
+ webpack: 5.97.1(esbuild@0.27.7)
transitivePeerDependencies:
- '@docusaurus/faster'
- '@mdx-js/react'
@@ -11007,18 +11762,18 @@ snapshots:
- vue-template-compiler
- webpack-cli
- '@docusaurus/plugin-content-pages@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
+ '@docusaurus/plugin-content-pages@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
- '@docusaurus/core': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/mdx-loader': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/utils-validation': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/core': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/mdx-loader': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/utils-validation': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
fs-extra: 11.3.0
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
tslib: 2.8.1
- webpack: 5.97.1(esbuild@0.24.0)
+ webpack: 5.97.1(esbuild@0.27.7)
transitivePeerDependencies:
- '@docusaurus/faster'
- '@mdx-js/react'
@@ -11040,11 +11795,11 @@ snapshots:
- vue-template-compiler
- webpack-cli
- '@docusaurus/plugin-debug@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
+ '@docusaurus/plugin-debug@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
- '@docusaurus/core': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/core': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
fs-extra: 11.3.0
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
@@ -11071,11 +11826,11 @@ snapshots:
- vue-template-compiler
- webpack-cli
- '@docusaurus/plugin-google-analytics@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
+ '@docusaurus/plugin-google-analytics@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
- '@docusaurus/core': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils-validation': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/core': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils-validation': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
tslib: 2.8.1
@@ -11100,11 +11855,11 @@ snapshots:
- vue-template-compiler
- webpack-cli
- '@docusaurus/plugin-google-gtag@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
+ '@docusaurus/plugin-google-gtag@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
- '@docusaurus/core': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils-validation': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/core': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils-validation': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@types/gtag.js': 0.0.12
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
@@ -11130,11 +11885,11 @@ snapshots:
- vue-template-compiler
- webpack-cli
- '@docusaurus/plugin-google-tag-manager@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
+ '@docusaurus/plugin-google-tag-manager@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
- '@docusaurus/core': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils-validation': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/core': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils-validation': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
tslib: 2.8.1
@@ -11159,14 +11914,14 @@ snapshots:
- vue-template-compiler
- webpack-cli
- '@docusaurus/plugin-sitemap@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
+ '@docusaurus/plugin-sitemap@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
- '@docusaurus/core': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/core': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/logger': 3.6.3
- '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/utils-common': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils-validation': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils-validation': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
fs-extra: 11.3.0
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
@@ -11193,21 +11948,21 @@ snapshots:
- vue-template-compiler
- webpack-cli
- '@docusaurus/preset-classic@3.6.3(@algolia/client-search@5.20.0)(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(@types/react@18.3.13)(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3)':
- dependencies:
- '@docusaurus/core': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/plugin-content-blog': 3.6.3(@docusaurus/plugin-content-docs@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/plugin-content-docs': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/plugin-content-pages': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/plugin-debug': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/plugin-google-analytics': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/plugin-google-gtag': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/plugin-google-tag-manager': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/plugin-sitemap': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/theme-classic': 3.6.3(@types/react@18.3.13)(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/theme-common': 3.6.3(@docusaurus/plugin-content-docs@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/theme-search-algolia': 3.6.3(@algolia/client-search@5.20.0)(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(@types/react@18.3.13)(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3)
- '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/preset-classic@3.6.3(@algolia/client-search@5.20.0)(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(@types/react@18.3.13)(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3)':
+ dependencies:
+ '@docusaurus/core': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-content-blog': 3.6.3(@docusaurus/plugin-content-docs@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-content-docs': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-content-pages': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-debug': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-google-analytics': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-google-gtag': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-google-tag-manager': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-sitemap': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/theme-classic': 3.6.3(@types/react@18.3.13)(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/theme-common': 3.6.3(@docusaurus/plugin-content-docs@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/theme-search-algolia': 3.6.3(@algolia/client-search@5.20.0)(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(@types/react@18.3.13)(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3)
+ '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
transitivePeerDependencies:
@@ -11239,21 +11994,21 @@ snapshots:
'@types/react': 18.3.13
react: 18.3.1
- '@docusaurus/theme-classic@3.6.3(@types/react@18.3.13)(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
+ '@docusaurus/theme-classic@3.6.3(@types/react@18.3.13)(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
- '@docusaurus/core': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/core': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/logger': 3.6.3
- '@docusaurus/mdx-loader': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/module-type-aliases': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/plugin-content-blog': 3.6.3(@docusaurus/plugin-content-docs@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/plugin-content-docs': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/plugin-content-pages': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/theme-common': 3.6.3(@docusaurus/plugin-content-docs@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/mdx-loader': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/module-type-aliases': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/plugin-content-blog': 3.6.3(@docusaurus/plugin-content-docs@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-content-docs': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-content-pages': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/theme-common': 3.6.3(@docusaurus/plugin-content-docs@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/theme-translations': 3.6.3
- '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/utils-common': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils-validation': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils-validation': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@mdx-js/react': 3.1.0(@types/react@18.3.13)(react@18.3.1)
clsx: 2.1.1
copy-text-to-clipboard: 3.2.0
@@ -11290,13 +12045,13 @@ snapshots:
- vue-template-compiler
- webpack-cli
- '@docusaurus/theme-common@3.6.3(@docusaurus/plugin-content-docs@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
+ '@docusaurus/theme-common@3.6.3(@docusaurus/plugin-content-docs@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
- '@docusaurus/mdx-loader': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/module-type-aliases': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/plugin-content-docs': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/utils-common': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/mdx-loader': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/module-type-aliases': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/plugin-content-docs': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@types/history': 4.7.11
'@types/react': 18.3.13
'@types/react-router-config': 5.0.11
@@ -11316,16 +12071,16 @@ snapshots:
- uglify-js
- webpack-cli
- '@docusaurus/theme-search-algolia@3.6.3(@algolia/client-search@5.20.0)(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(@types/react@18.3.13)(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3)':
+ '@docusaurus/theme-search-algolia@3.6.3(@algolia/client-search@5.20.0)(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(@types/react@18.3.13)(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)(typescript@5.6.3)':
dependencies:
'@docsearch/react': 3.8.3(@algolia/client-search@5.20.0)(@types/react@18.3.13)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(search-insights@2.17.3)
- '@docusaurus/core': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/core': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/logger': 3.6.3
- '@docusaurus/plugin-content-docs': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/theme-common': 3.6.3(@docusaurus/plugin-content-docs@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.24.0)(eslint@9.20.0(jiti@2.4.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/plugin-content-docs': 3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/theme-common': 3.6.3(@docusaurus/plugin-content-docs@3.6.3(@mdx-js/react@3.1.0(@types/react@18.3.13)(react@18.3.1))(acorn@8.14.0)(esbuild@0.27.7)(eslint@9.20.0(jiti@2.4.1))(lightningcss@1.32.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3))(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
'@docusaurus/theme-translations': 3.6.3
- '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/utils-validation': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/utils-validation': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
algoliasearch: 4.24.0
algoliasearch-helper: 3.24.1(algoliasearch@4.24.0)
clsx: 2.1.1
@@ -11367,7 +12122,7 @@ snapshots:
'@docusaurus/tsconfig@3.6.3': {}
- '@docusaurus/types@3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ '@docusaurus/types@3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
'@mdx-js/mdx': 3.1.0(acorn@8.14.0)
'@types/history': 4.7.11
@@ -11378,7 +12133,7 @@ snapshots:
react-dom: 18.3.1(react@18.3.1)
react-helmet-async: 1.3.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
utility-types: 3.11.0
- webpack: 5.97.1(esbuild@0.24.0)
+ webpack: 5.97.1(esbuild@0.27.7)
webpack-merge: 5.10.0
transitivePeerDependencies:
- '@swc/core'
@@ -11388,9 +12143,9 @@ snapshots:
- uglify-js
- webpack-cli
- '@docusaurus/utils-common@3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
+ '@docusaurus/utils-common@3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
- '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
tslib: 2.8.1
transitivePeerDependencies:
- '@swc/core'
@@ -11402,11 +12157,11 @@ snapshots:
- uglify-js
- webpack-cli
- '@docusaurus/utils-validation@3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
+ '@docusaurus/utils-validation@3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
'@docusaurus/logger': 3.6.3
- '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
- '@docusaurus/utils-common': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)
+ '@docusaurus/utils-common': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
fs-extra: 11.3.0
joi: 17.13.3
js-yaml: 4.1.0
@@ -11423,14 +12178,14 @@ snapshots:
- uglify-js
- webpack-cli
- '@docusaurus/utils@3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
+ '@docusaurus/utils@3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(typescript@5.6.3)':
dependencies:
'@docusaurus/logger': 3.6.3
- '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@docusaurus/utils-common': 3.6.3(acorn@8.14.0)(esbuild@0.24.0)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/types': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
+ '@docusaurus/utils-common': 3.6.3(acorn@8.14.0)(esbuild@0.27.7)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@svgr/webpack': 8.1.0(typescript@5.6.3)
escape-string-regexp: 4.0.0
- file-loader: 6.2.0(webpack@5.97.1(esbuild@0.24.0))
+ file-loader: 6.2.0(webpack@5.97.1(esbuild@0.27.7))
fs-extra: 11.3.0
github-slugger: 1.5.0
globby: 11.1.0
@@ -11443,9 +12198,9 @@ snapshots:
resolve-pathname: 3.0.0
shelljs: 0.8.5
tslib: 2.8.1
- url-loader: 4.1.1(file-loader@6.2.0(webpack@5.97.1(esbuild@0.24.0)))(webpack@5.97.1(esbuild@0.24.0))
+ url-loader: 4.1.1(file-loader@6.2.0(webpack@5.97.1(esbuild@0.27.7)))(webpack@5.97.1(esbuild@0.27.7))
utility-types: 3.11.0
- webpack: 5.97.1(esbuild@0.24.0)
+ webpack: 5.97.1(esbuild@0.27.7)
transitivePeerDependencies:
- '@swc/core'
- acorn
@@ -11457,6 +12212,24 @@ snapshots:
- uglify-js
- webpack-cli
+ '@emnapi/core@1.9.2':
+ dependencies:
+ '@emnapi/wasi-threads': 1.2.1
+ tslib: 2.8.1
+ optional: true
+
+ '@emnapi/runtime@1.9.2':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@emnapi/wasi-threads@1.2.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
+ '@emotion/hash@0.9.2': {}
+
'@esbuild/aix-ppc64@0.21.5':
optional: true
@@ -11466,6 +12239,9 @@ snapshots:
'@esbuild/aix-ppc64@0.24.0':
optional: true
+ '@esbuild/aix-ppc64@0.27.7':
+ optional: true
+
'@esbuild/android-arm64@0.21.5':
optional: true
@@ -11475,6 +12251,9 @@ snapshots:
'@esbuild/android-arm64@0.24.0':
optional: true
+ '@esbuild/android-arm64@0.27.7':
+ optional: true
+
'@esbuild/android-arm@0.21.5':
optional: true
@@ -11484,6 +12263,9 @@ snapshots:
'@esbuild/android-arm@0.24.0':
optional: true
+ '@esbuild/android-arm@0.27.7':
+ optional: true
+
'@esbuild/android-x64@0.21.5':
optional: true
@@ -11493,6 +12275,9 @@ snapshots:
'@esbuild/android-x64@0.24.0':
optional: true
+ '@esbuild/android-x64@0.27.7':
+ optional: true
+
'@esbuild/darwin-arm64@0.21.5':
optional: true
@@ -11502,6 +12287,9 @@ snapshots:
'@esbuild/darwin-arm64@0.24.0':
optional: true
+ '@esbuild/darwin-arm64@0.27.7':
+ optional: true
+
'@esbuild/darwin-x64@0.21.5':
optional: true
@@ -11511,6 +12299,9 @@ snapshots:
'@esbuild/darwin-x64@0.24.0':
optional: true
+ '@esbuild/darwin-x64@0.27.7':
+ optional: true
+
'@esbuild/freebsd-arm64@0.21.5':
optional: true
@@ -11520,6 +12311,9 @@ snapshots:
'@esbuild/freebsd-arm64@0.24.0':
optional: true
+ '@esbuild/freebsd-arm64@0.27.7':
+ optional: true
+
'@esbuild/freebsd-x64@0.21.5':
optional: true
@@ -11529,6 +12323,9 @@ snapshots:
'@esbuild/freebsd-x64@0.24.0':
optional: true
+ '@esbuild/freebsd-x64@0.27.7':
+ optional: true
+
'@esbuild/linux-arm64@0.21.5':
optional: true
@@ -11538,6 +12335,9 @@ snapshots:
'@esbuild/linux-arm64@0.24.0':
optional: true
+ '@esbuild/linux-arm64@0.27.7':
+ optional: true
+
'@esbuild/linux-arm@0.21.5':
optional: true
@@ -11547,6 +12347,9 @@ snapshots:
'@esbuild/linux-arm@0.24.0':
optional: true
+ '@esbuild/linux-arm@0.27.7':
+ optional: true
+
'@esbuild/linux-ia32@0.21.5':
optional: true
@@ -11556,6 +12359,9 @@ snapshots:
'@esbuild/linux-ia32@0.24.0':
optional: true
+ '@esbuild/linux-ia32@0.27.7':
+ optional: true
+
'@esbuild/linux-loong64@0.21.5':
optional: true
@@ -11565,6 +12371,9 @@ snapshots:
'@esbuild/linux-loong64@0.24.0':
optional: true
+ '@esbuild/linux-loong64@0.27.7':
+ optional: true
+
'@esbuild/linux-mips64el@0.21.5':
optional: true
@@ -11574,6 +12383,9 @@ snapshots:
'@esbuild/linux-mips64el@0.24.0':
optional: true
+ '@esbuild/linux-mips64el@0.27.7':
+ optional: true
+
'@esbuild/linux-ppc64@0.21.5':
optional: true
@@ -11583,6 +12395,9 @@ snapshots:
'@esbuild/linux-ppc64@0.24.0':
optional: true
+ '@esbuild/linux-ppc64@0.27.7':
+ optional: true
+
'@esbuild/linux-riscv64@0.21.5':
optional: true
@@ -11592,6 +12407,9 @@ snapshots:
'@esbuild/linux-riscv64@0.24.0':
optional: true
+ '@esbuild/linux-riscv64@0.27.7':
+ optional: true
+
'@esbuild/linux-s390x@0.21.5':
optional: true
@@ -11601,6 +12419,9 @@ snapshots:
'@esbuild/linux-s390x@0.24.0':
optional: true
+ '@esbuild/linux-s390x@0.27.7':
+ optional: true
+
'@esbuild/linux-x64@0.21.5':
optional: true
@@ -11610,6 +12431,12 @@ snapshots:
'@esbuild/linux-x64@0.24.0':
optional: true
+ '@esbuild/linux-x64@0.27.7':
+ optional: true
+
+ '@esbuild/netbsd-arm64@0.27.7':
+ optional: true
+
'@esbuild/netbsd-x64@0.21.5':
optional: true
@@ -11619,12 +12446,18 @@ snapshots:
'@esbuild/netbsd-x64@0.24.0':
optional: true
+ '@esbuild/netbsd-x64@0.27.7':
+ optional: true
+
'@esbuild/openbsd-arm64@0.23.1':
optional: true
'@esbuild/openbsd-arm64@0.24.0':
optional: true
+ '@esbuild/openbsd-arm64@0.27.7':
+ optional: true
+
'@esbuild/openbsd-x64@0.21.5':
optional: true
@@ -11634,6 +12467,12 @@ snapshots:
'@esbuild/openbsd-x64@0.24.0':
optional: true
+ '@esbuild/openbsd-x64@0.27.7':
+ optional: true
+
+ '@esbuild/openharmony-arm64@0.27.7':
+ optional: true
+
'@esbuild/sunos-x64@0.21.5':
optional: true
@@ -11643,6 +12482,9 @@ snapshots:
'@esbuild/sunos-x64@0.24.0':
optional: true
+ '@esbuild/sunos-x64@0.27.7':
+ optional: true
+
'@esbuild/win32-arm64@0.21.5':
optional: true
@@ -11652,6 +12494,9 @@ snapshots:
'@esbuild/win32-arm64@0.24.0':
optional: true
+ '@esbuild/win32-arm64@0.27.7':
+ optional: true
+
'@esbuild/win32-ia32@0.21.5':
optional: true
@@ -11661,6 +12506,9 @@ snapshots:
'@esbuild/win32-ia32@0.24.0':
optional: true
+ '@esbuild/win32-ia32@0.27.7':
+ optional: true
+
'@esbuild/win32-x64@0.21.5':
optional: true
@@ -11670,12 +12518,17 @@ snapshots:
'@esbuild/win32-x64@0.24.0':
optional: true
+ '@esbuild/win32-x64@0.27.7':
+ optional: true
+
'@eslint-community/eslint-utils@4.4.1(eslint@9.20.0(jiti@2.4.1))':
dependencies:
eslint: 9.20.0(jiti@2.4.1)
eslint-visitor-keys: 3.4.3
+ optional: true
- '@eslint-community/regexpp@4.12.1': {}
+ '@eslint-community/regexpp@4.12.1':
+ optional: true
'@eslint/config-array@0.19.1':
dependencies:
@@ -11684,14 +12537,17 @@ snapshots:
minimatch: 3.1.2
transitivePeerDependencies:
- supports-color
+ optional: true
'@eslint/core@0.10.0':
dependencies:
'@types/json-schema': 7.0.15
+ optional: true
'@eslint/core@0.11.0':
dependencies:
'@types/json-schema': 7.0.15
+ optional: true
'@eslint/eslintrc@3.2.0':
dependencies:
@@ -11706,15 +12562,19 @@ snapshots:
strip-json-comments: 3.1.1
transitivePeerDependencies:
- supports-color
+ optional: true
- '@eslint/js@9.20.0': {}
+ '@eslint/js@9.20.0':
+ optional: true
- '@eslint/object-schema@2.1.5': {}
+ '@eslint/object-schema@2.1.5':
+ optional: true
'@eslint/plugin-kit@0.2.5':
dependencies:
'@eslint/core': 0.10.0
levn: 0.4.1
+ optional: true
'@faker-js/faker@9.2.0': {}
@@ -11726,18 +12586,23 @@ snapshots:
dependencies:
'@hapi/hoek': 9.3.0
- '@humanfs/core@0.19.1': {}
+ '@humanfs/core@0.19.1':
+ optional: true
'@humanfs/node@0.16.6':
dependencies:
'@humanfs/core': 0.19.1
'@humanwhocodes/retry': 0.3.1
+ optional: true
- '@humanwhocodes/module-importer@1.0.1': {}
+ '@humanwhocodes/module-importer@1.0.1':
+ optional: true
- '@humanwhocodes/retry@0.3.1': {}
+ '@humanwhocodes/retry@0.3.1':
+ optional: true
- '@humanwhocodes/retry@0.4.1': {}
+ '@humanwhocodes/retry@0.4.1':
+ optional: true
'@isaacs/cliui@8.0.2':
dependencies:
@@ -11763,11 +12628,19 @@ snapshots:
'@types/yargs': 17.0.33
chalk: 4.1.2
- '@joshwooding/vite-plugin-react-docgen-typescript@0.4.2(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))':
+ '@joshwooding/vite-plugin-react-docgen-typescript@0.4.2(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0))':
+ dependencies:
+ magic-string: 0.27.0
+ react-docgen-typescript: 2.2.2(typescript@5.6.3)
+ vite: 5.4.11(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0)
+ optionalDependencies:
+ typescript: 5.6.3
+
+ '@joshwooding/vite-plugin-react-docgen-typescript@0.4.2(typescript@5.6.3)(vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))':
dependencies:
magic-string: 0.27.0
react-docgen-typescript: 2.2.2(typescript@5.6.3)
- vite: 5.4.11(@types/node@22.10.1)(terser@5.37.0)
+ vite: 8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
optionalDependencies:
typescript: 5.6.3
@@ -11788,6 +12661,8 @@ snapshots:
'@jridgewell/sourcemap-codec@1.5.0': {}
+ '@jridgewell/sourcemap-codec@1.5.5': {}
+
'@jridgewell/trace-mapping@0.3.25':
dependencies:
'@jridgewell/resolve-uri': 3.1.2
@@ -11847,6 +12722,13 @@ snapshots:
'@types/react': 18.3.13
react: 18.3.1
+ '@napi-rs/wasm-runtime@1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)':
+ dependencies:
+ '@emnapi/core': 1.9.2
+ '@emnapi/runtime': 1.9.2
+ '@tybys/wasm-util': 0.10.1
+ optional: true
+
'@nodelib/fs.scandir@2.1.5':
dependencies:
'@nodelib/fs.stat': 2.0.5
@@ -11859,6 +12741,8 @@ snapshots:
'@nodelib/fs.scandir': 2.1.5
fastq: 1.17.1
+ '@oxc-project/types@0.124.0': {}
+
'@pkgjs/parseargs@0.11.0':
optional: true
@@ -11889,66 +12773,213 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.13
- '@rollup/pluginutils@5.1.3(rollup@4.28.0)':
+ '@radix-ui/react-use-controllable-state@1.2.2(@types/react@18.3.13)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-use-effect-event': 0.0.2(@types/react@18.3.13)(react@18.3.1)
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.13)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.13
+
+ '@radix-ui/react-use-effect-event@0.0.2(@types/react@18.3.13)(react@18.3.1)':
+ dependencies:
+ '@radix-ui/react-use-layout-effect': 1.1.1(@types/react@18.3.13)(react@18.3.1)
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.13
+
+ '@radix-ui/react-use-layout-effect@1.1.1(@types/react@18.3.13)(react@18.3.1)':
+ dependencies:
+ react: 18.3.1
+ optionalDependencies:
+ '@types/react': 18.3.13
+
+ '@rolldown/binding-android-arm64@1.0.0-rc.15':
+ optional: true
+
+ '@rolldown/binding-darwin-arm64@1.0.0-rc.15':
+ optional: true
+
+ '@rolldown/binding-darwin-x64@1.0.0-rc.15':
+ optional: true
+
+ '@rolldown/binding-freebsd-x64@1.0.0-rc.15':
+ optional: true
+
+ '@rolldown/binding-linux-arm-gnueabihf@1.0.0-rc.15':
+ optional: true
+
+ '@rolldown/binding-linux-arm64-gnu@1.0.0-rc.15':
+ optional: true
+
+ '@rolldown/binding-linux-arm64-musl@1.0.0-rc.15':
+ optional: true
+
+ '@rolldown/binding-linux-ppc64-gnu@1.0.0-rc.15':
+ optional: true
+
+ '@rolldown/binding-linux-s390x-gnu@1.0.0-rc.15':
+ optional: true
+
+ '@rolldown/binding-linux-x64-gnu@1.0.0-rc.15':
+ optional: true
+
+ '@rolldown/binding-linux-x64-musl@1.0.0-rc.15':
+ optional: true
+
+ '@rolldown/binding-openharmony-arm64@1.0.0-rc.15':
+ optional: true
+
+ '@rolldown/binding-wasm32-wasi@1.0.0-rc.15':
+ dependencies:
+ '@emnapi/core': 1.9.2
+ '@emnapi/runtime': 1.9.2
+ '@napi-rs/wasm-runtime': 1.1.3(@emnapi/core@1.9.2)(@emnapi/runtime@1.9.2)
+ optional: true
+
+ '@rolldown/binding-win32-arm64-msvc@1.0.0-rc.15':
+ optional: true
+
+ '@rolldown/binding-win32-x64-msvc@1.0.0-rc.15':
+ optional: true
+
+ '@rolldown/pluginutils@1.0.0-rc.15': {}
+
+ '@rollup/pluginutils@5.1.3(rollup@4.60.1)':
dependencies:
'@types/estree': 1.0.6
estree-walker: 2.0.2
picomatch: 4.0.2
optionalDependencies:
- rollup: 4.28.0
+ rollup: 4.60.1
'@rollup/rollup-android-arm-eabi@4.28.0':
optional: true
+ '@rollup/rollup-android-arm-eabi@4.60.1':
+ optional: true
+
'@rollup/rollup-android-arm64@4.28.0':
optional: true
+ '@rollup/rollup-android-arm64@4.60.1':
+ optional: true
+
'@rollup/rollup-darwin-arm64@4.28.0':
optional: true
+ '@rollup/rollup-darwin-arm64@4.60.1':
+ optional: true
+
'@rollup/rollup-darwin-x64@4.28.0':
optional: true
+ '@rollup/rollup-darwin-x64@4.60.1':
+ optional: true
+
'@rollup/rollup-freebsd-arm64@4.28.0':
optional: true
+ '@rollup/rollup-freebsd-arm64@4.60.1':
+ optional: true
+
'@rollup/rollup-freebsd-x64@4.28.0':
optional: true
+ '@rollup/rollup-freebsd-x64@4.60.1':
+ optional: true
+
'@rollup/rollup-linux-arm-gnueabihf@4.28.0':
optional: true
+ '@rollup/rollup-linux-arm-gnueabihf@4.60.1':
+ optional: true
+
'@rollup/rollup-linux-arm-musleabihf@4.28.0':
optional: true
+ '@rollup/rollup-linux-arm-musleabihf@4.60.1':
+ optional: true
+
'@rollup/rollup-linux-arm64-gnu@4.28.0':
optional: true
+ '@rollup/rollup-linux-arm64-gnu@4.60.1':
+ optional: true
+
'@rollup/rollup-linux-arm64-musl@4.28.0':
optional: true
+ '@rollup/rollup-linux-arm64-musl@4.60.1':
+ optional: true
+
+ '@rollup/rollup-linux-loong64-gnu@4.60.1':
+ optional: true
+
+ '@rollup/rollup-linux-loong64-musl@4.60.1':
+ optional: true
+
'@rollup/rollup-linux-powerpc64le-gnu@4.28.0':
optional: true
+ '@rollup/rollup-linux-ppc64-gnu@4.60.1':
+ optional: true
+
+ '@rollup/rollup-linux-ppc64-musl@4.60.1':
+ optional: true
+
'@rollup/rollup-linux-riscv64-gnu@4.28.0':
optional: true
+ '@rollup/rollup-linux-riscv64-gnu@4.60.1':
+ optional: true
+
+ '@rollup/rollup-linux-riscv64-musl@4.60.1':
+ optional: true
+
'@rollup/rollup-linux-s390x-gnu@4.28.0':
optional: true
+ '@rollup/rollup-linux-s390x-gnu@4.60.1':
+ optional: true
+
'@rollup/rollup-linux-x64-gnu@4.28.0':
optional: true
+ '@rollup/rollup-linux-x64-gnu@4.60.1':
+ optional: true
+
'@rollup/rollup-linux-x64-musl@4.28.0':
optional: true
+ '@rollup/rollup-linux-x64-musl@4.60.1':
+ optional: true
+
+ '@rollup/rollup-openbsd-x64@4.60.1':
+ optional: true
+
+ '@rollup/rollup-openharmony-arm64@4.60.1':
+ optional: true
+
'@rollup/rollup-win32-arm64-msvc@4.28.0':
optional: true
+ '@rollup/rollup-win32-arm64-msvc@4.60.1':
+ optional: true
+
'@rollup/rollup-win32-ia32-msvc@4.28.0':
optional: true
- '@rollup/rollup-win32-x64-msvc@4.28.0':
+ '@rollup/rollup-win32-ia32-msvc@4.60.1':
+ optional: true
+
+ '@rollup/rollup-win32-x64-gnu@4.60.1':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.28.0':
+ optional: true
+
+ '@rollup/rollup-win32-x64-msvc@4.60.1':
optional: true
'@sideway/address@4.1.5':
@@ -12106,13 +13137,21 @@ snapshots:
react: 18.3.1
react-dom: 18.3.1(react@18.3.1)
- '@storybook/builder-vite@8.4.6(storybook@8.5.0(prettier@2.8.8))(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))':
+ '@storybook/builder-vite@8.4.6(storybook@8.5.0(prettier@2.8.8))(vite@5.4.11(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0))':
+ dependencies:
+ '@storybook/csf-plugin': 8.4.6(storybook@8.5.0(prettier@2.8.8))
+ browser-assert: 1.2.1
+ storybook: 8.5.0(prettier@2.8.8)
+ ts-dedent: 2.2.0
+ vite: 5.4.11(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0)
+
+ '@storybook/builder-vite@8.4.6(storybook@8.5.0(prettier@2.8.8))(vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))':
dependencies:
'@storybook/csf-plugin': 8.4.6(storybook@8.5.0(prettier@2.8.8))
browser-assert: 1.2.1
storybook: 8.5.0(prettier@2.8.8)
ts-dedent: 2.2.0
- vite: 5.4.11(@types/node@22.10.1)(terser@5.37.0)
+ vite: 8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
'@storybook/components@8.4.6(storybook@8.5.0(prettier@2.8.8))':
dependencies:
@@ -12189,11 +13228,32 @@ snapshots:
react-dom: 18.3.1(react@18.3.1)
storybook: 8.5.0(prettier@2.8.8)
- '@storybook/react-vite@8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.28.0)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))':
+ '@storybook/react-vite@8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.60.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0))':
+ dependencies:
+ '@joshwooding/vite-plugin-react-docgen-typescript': 0.4.2(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0))
+ '@rollup/pluginutils': 5.1.3(rollup@4.60.1)
+ '@storybook/builder-vite': 8.4.6(storybook@8.5.0(prettier@2.8.8))(vite@5.4.11(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0))
+ '@storybook/react': 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)
+ find-up: 5.0.0
+ magic-string: 0.30.14
+ react: 18.3.1
+ react-docgen: 7.1.0
+ react-dom: 18.3.1(react@18.3.1)
+ resolve: 1.22.8
+ storybook: 8.5.0(prettier@2.8.8)
+ tsconfig-paths: 4.2.0
+ vite: 5.4.11(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0)
+ transitivePeerDependencies:
+ - '@storybook/test'
+ - rollup
+ - supports-color
+ - typescript
+
+ '@storybook/react-vite@8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.60.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)(vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))':
dependencies:
- '@joshwooding/vite-plugin-react-docgen-typescript': 0.4.2(typescript@5.6.3)(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))
- '@rollup/pluginutils': 5.1.3(rollup@4.28.0)
- '@storybook/builder-vite': 8.4.6(storybook@8.5.0(prettier@2.8.8))(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))
+ '@joshwooding/vite-plugin-react-docgen-typescript': 0.4.2(typescript@5.6.3)(vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
+ '@rollup/pluginutils': 5.1.3(rollup@4.60.1)
+ '@storybook/builder-vite': 8.4.6(storybook@8.5.0(prettier@2.8.8))(vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))
'@storybook/react': 8.4.6(@storybook/test@8.4.6(storybook@8.5.0(prettier@2.8.8)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@2.8.8))(typescript@5.6.3)
find-up: 5.0.0
magic-string: 0.30.14
@@ -12203,7 +13263,7 @@ snapshots:
resolve: 1.22.8
storybook: 8.5.0(prettier@2.8.8)
tsconfig-paths: 4.2.0
- vite: 5.4.11(@types/node@22.10.1)(terser@5.37.0)
+ vite: 8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
transitivePeerDependencies:
- '@storybook/test'
- rollup
@@ -12387,10 +13447,19 @@ snapshots:
dependencies:
'@testing-library/dom': 10.4.0
+ '@testing-library/user-event@14.6.1(@testing-library/dom@10.4.0)':
+ dependencies:
+ '@testing-library/dom': 10.4.0
+
'@trysound/sax@0.2.0': {}
'@tsconfig/strictest@2.0.5': {}
+ '@tybys/wasm-util@0.10.1':
+ dependencies:
+ tslib: 2.8.1
+ optional: true
+
'@types/acorn@4.0.6':
dependencies:
'@types/estree': 1.0.6
@@ -12456,16 +13525,14 @@ snapshots:
'@types/estree': 1.0.6
'@types/json-schema': 7.0.15
- '@types/eslint__eslintrc@2.1.2':
- dependencies:
- '@types/eslint': 9.6.1
-
'@types/estree-jsx@1.0.5':
dependencies:
'@types/estree': 1.0.6
'@types/estree@1.0.6': {}
+ '@types/estree@1.0.8': {}
+
'@types/express-serve-static-core@4.19.6':
dependencies:
'@types/node': 22.10.1
@@ -12618,124 +13685,133 @@ snapshots:
dependencies:
'@types/yargs-parser': 21.0.3
- '@typescript-eslint/eslint-plugin@8.22.0(@typescript-eslint/parser@8.22.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3))(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)':
+ '@ungap/structured-clone@1.3.0': {}
+
+ '@vanilla-extract/babel-plugin-debug-ids@1.2.2':
dependencies:
- '@eslint-community/regexpp': 4.12.1
- '@typescript-eslint/parser': 8.22.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)
- '@typescript-eslint/scope-manager': 8.22.0
- '@typescript-eslint/type-utils': 8.22.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)
- '@typescript-eslint/utils': 8.22.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)
- '@typescript-eslint/visitor-keys': 8.22.0
- eslint: 9.20.0(jiti@2.4.1)
- graphemer: 1.4.0
- ignore: 5.3.2
- natural-compare: 1.4.0
- ts-api-utils: 2.0.0(typescript@5.6.3)
- typescript: 5.6.3
+ '@babel/core': 7.26.0
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/parser@8.19.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)':
+ '@vanilla-extract/compiler@0.7.0(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(lightningcss@1.32.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)':
dependencies:
- '@typescript-eslint/scope-manager': 8.19.0
- '@typescript-eslint/types': 8.19.0
- '@typescript-eslint/typescript-estree': 8.19.0(typescript@5.6.3)
- '@typescript-eslint/visitor-keys': 8.19.0
- debug: 4.3.7
- eslint: 9.20.0(jiti@2.4.1)
- typescript: 5.6.3
+ '@vanilla-extract/css': 1.20.1
+ '@vanilla-extract/integration': 8.0.10
+ vite: 5.4.11(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0)
+ vite-node: 6.0.0(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
transitivePeerDependencies:
+ - '@types/node'
+ - '@vitejs/devtools'
+ - babel-plugin-macros
+ - esbuild
+ - jiti
+ - less
+ - lightningcss
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
- supports-color
+ - terser
+ - tsx
+ - yaml
- '@typescript-eslint/parser@8.22.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)':
+ '@vanilla-extract/css@1.20.1':
dependencies:
- '@typescript-eslint/scope-manager': 8.22.0
- '@typescript-eslint/types': 8.22.0
- '@typescript-eslint/typescript-estree': 8.22.0(typescript@5.6.3)
- '@typescript-eslint/visitor-keys': 8.22.0
- debug: 4.4.0
- eslint: 9.20.0(jiti@2.4.1)
- typescript: 5.6.3
+ '@emotion/hash': 0.9.2
+ '@vanilla-extract/private': 1.0.9
+ css-what: 6.1.0
+ csstype: 3.2.3
+ dedent: 1.7.2
+ 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:
- - supports-color
+ - babel-plugin-macros
- '@typescript-eslint/scope-manager@8.19.0':
+ '@vanilla-extract/dynamic@2.1.5':
dependencies:
- '@typescript-eslint/types': 8.19.0
- '@typescript-eslint/visitor-keys': 8.19.0
+ '@vanilla-extract/private': 1.0.9
- '@typescript-eslint/scope-manager@8.22.0':
+ '@vanilla-extract/esbuild-plugin@2.3.22(esbuild@0.27.7)':
dependencies:
- '@typescript-eslint/types': 8.22.0
- '@typescript-eslint/visitor-keys': 8.22.0
+ '@vanilla-extract/integration': 8.0.10
+ optionalDependencies:
+ esbuild: 0.27.7
+ transitivePeerDependencies:
+ - babel-plugin-macros
+ - supports-color
- '@typescript-eslint/type-utils@8.22.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)':
+ '@vanilla-extract/integration@8.0.10':
dependencies:
- '@typescript-eslint/typescript-estree': 8.22.0(typescript@5.6.3)
- '@typescript-eslint/utils': 8.22.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)
- debug: 4.4.0
- eslint: 9.20.0(jiti@2.4.1)
- ts-api-utils: 2.0.0(typescript@5.6.3)
- typescript: 5.6.3
+ '@babel/core': 7.26.0
+ '@babel/plugin-syntax-typescript': 7.25.9(@babel/core@7.26.0)
+ '@vanilla-extract/babel-plugin-debug-ids': 1.2.2
+ '@vanilla-extract/css': 1.20.1
+ dedent: 1.7.2
+ esbuild: 0.24.0
+ eval: 0.1.8
+ find-up: 5.0.0
+ javascript-stringify: 2.1.0
+ mlly: 1.8.2
transitivePeerDependencies:
+ - babel-plugin-macros
- supports-color
- '@typescript-eslint/types@8.19.0': {}
-
- '@typescript-eslint/types@8.22.0': {}
+ '@vanilla-extract/private@1.0.9': {}
- '@typescript-eslint/typescript-estree@8.19.0(typescript@5.6.3)':
+ '@vanilla-extract/recipes@0.5.7(@vanilla-extract/css@1.20.1)':
dependencies:
- '@typescript-eslint/types': 8.19.0
- '@typescript-eslint/visitor-keys': 8.19.0
- debug: 4.4.0
- fast-glob: 3.3.2
- is-glob: 4.0.3
- minimatch: 9.0.5
- semver: 7.6.3
- ts-api-utils: 1.4.3(typescript@5.6.3)
- typescript: 5.6.3
- transitivePeerDependencies:
- - supports-color
+ '@vanilla-extract/css': 1.20.1
- '@typescript-eslint/typescript-estree@8.22.0(typescript@5.6.3)':
+ '@vanilla-extract/vite-plugin@5.2.2(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(lightningcss@1.32.0)(terser@5.37.0)(tsx@4.19.2)(vite@5.4.11(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0))(yaml@2.6.1)':
dependencies:
- '@typescript-eslint/types': 8.22.0
- '@typescript-eslint/visitor-keys': 8.22.0
- debug: 4.4.0
- fast-glob: 3.3.2
- is-glob: 4.0.3
- minimatch: 9.0.5
- semver: 7.6.3
- ts-api-utils: 2.0.0(typescript@5.6.3)
- typescript: 5.6.3
+ '@vanilla-extract/compiler': 0.7.0(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(lightningcss@1.32.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
+ '@vanilla-extract/integration': 8.0.10
+ vite: 5.4.11(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0)
transitivePeerDependencies:
+ - '@types/node'
+ - '@vitejs/devtools'
+ - babel-plugin-macros
+ - esbuild
+ - jiti
+ - less
+ - lightningcss
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
- supports-color
+ - terser
+ - tsx
+ - yaml
- '@typescript-eslint/utils@8.22.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)':
+ '@vanilla-extract/vite-plugin@5.2.2(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(lightningcss@1.32.0)(terser@5.37.0)(tsx@4.19.2)(vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1))(yaml@2.6.1)':
dependencies:
- '@eslint-community/eslint-utils': 4.4.1(eslint@9.20.0(jiti@2.4.1))
- '@typescript-eslint/scope-manager': 8.22.0
- '@typescript-eslint/types': 8.22.0
- '@typescript-eslint/typescript-estree': 8.22.0(typescript@5.6.3)
- eslint: 9.20.0(jiti@2.4.1)
- typescript: 5.6.3
+ '@vanilla-extract/compiler': 0.7.0(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(lightningcss@1.32.0)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
+ '@vanilla-extract/integration': 8.0.10
+ vite: 8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
transitivePeerDependencies:
+ - '@types/node'
+ - '@vitejs/devtools'
+ - babel-plugin-macros
+ - esbuild
+ - jiti
+ - less
+ - lightningcss
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
- supports-color
+ - terser
+ - tsx
+ - yaml
- '@typescript-eslint/visitor-keys@8.19.0':
- dependencies:
- '@typescript-eslint/types': 8.19.0
- eslint-visitor-keys: 4.2.0
-
- '@typescript-eslint/visitor-keys@8.22.0':
- dependencies:
- '@typescript-eslint/types': 8.22.0
- eslint-visitor-keys: 4.2.0
-
- '@ungap/structured-clone@1.3.0': {}
-
- '@vitest/coverage-v8@2.1.8(vitest@2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(terser@5.37.0))':
+ '@vitest/coverage-v8@2.1.8(vitest@2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0))':
dependencies:
'@ampproject/remapping': 2.3.0
'@bcoe/v8-coverage': 0.2.3
@@ -12749,10 +13825,16 @@ snapshots:
std-env: 3.8.0
test-exclude: 7.0.1
tinyrainbow: 1.2.0
- vitest: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(terser@5.37.0)
+ vitest: 2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0)
transitivePeerDependencies:
- supports-color
+ '@vitest/expect@1.6.1':
+ dependencies:
+ '@vitest/spy': 1.6.1
+ '@vitest/utils': 1.6.1
+ chai: 4.5.0
+
'@vitest/expect@2.0.5':
dependencies:
'@vitest/spy': 2.0.5
@@ -12767,13 +13849,13 @@ snapshots:
chai: 5.1.2
tinyrainbow: 1.2.0
- '@vitest/mocker@2.1.8(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))':
+ '@vitest/mocker@2.1.8(vite@5.4.11(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0))':
dependencies:
'@vitest/spy': 2.1.8
estree-walker: 3.0.3
magic-string: 0.30.14
optionalDependencies:
- vite: 5.4.11(@types/node@22.10.1)(terser@5.37.0)
+ vite: 5.4.11(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0)
'@vitest/pretty-format@2.0.5':
dependencies:
@@ -12783,17 +13865,33 @@ snapshots:
dependencies:
tinyrainbow: 1.2.0
+ '@vitest/runner@1.6.1':
+ dependencies:
+ '@vitest/utils': 1.6.1
+ p-limit: 5.0.0
+ pathe: 1.1.2
+
'@vitest/runner@2.1.8':
dependencies:
'@vitest/utils': 2.1.8
pathe: 1.1.2
+ '@vitest/snapshot@1.6.1':
+ dependencies:
+ magic-string: 0.30.14
+ pathe: 1.1.2
+ pretty-format: 29.7.0
+
'@vitest/snapshot@2.1.8':
dependencies:
'@vitest/pretty-format': 2.1.8
magic-string: 0.30.14
pathe: 1.1.2
+ '@vitest/spy@1.6.1':
+ dependencies:
+ tinyspy: 2.2.1
+
'@vitest/spy@2.0.5':
dependencies:
tinyspy: 3.0.2
@@ -12802,6 +13900,13 @@ snapshots:
dependencies:
tinyspy: 3.0.2
+ '@vitest/utils@1.6.1':
+ dependencies:
+ diff-sequences: 29.6.3
+ estree-walker: 3.0.3
+ loupe: 2.3.7
+ pretty-format: 29.7.0
+
'@vitest/utils@2.0.5':
dependencies:
'@vitest/pretty-format': 2.0.5
@@ -12915,8 +14020,12 @@ snapshots:
acorn@8.14.0: {}
+ acorn@8.16.0: {}
+
address@1.2.2: {}
+ agent-base@7.1.4: {}
+
aggregate-error@3.1.0:
dependencies:
clean-stack: 2.2.0
@@ -13041,66 +14150,13 @@ snapshots:
aria-query@5.3.2: {}
- array-buffer-byte-length@1.0.2:
- dependencies:
- call-bound: 1.0.3
- is-array-buffer: 3.0.5
-
array-flatten@1.1.1: {}
array-ify@1.0.0: {}
- array-includes@3.1.8:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-abstract: 1.23.9
- es-object-atoms: 1.1.1
- get-intrinsic: 1.2.7
- is-string: 1.1.1
-
array-union@2.1.0: {}
- array.prototype.findlast@1.2.5:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-abstract: 1.23.9
- es-errors: 1.3.0
- es-object-atoms: 1.1.1
- es-shim-unscopables: 1.0.2
-
- array.prototype.flat@1.3.3:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-abstract: 1.23.9
- es-shim-unscopables: 1.0.2
-
- array.prototype.flatmap@1.3.3:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-abstract: 1.23.9
- es-shim-unscopables: 1.0.2
-
- array.prototype.tosorted@1.1.4:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-abstract: 1.23.9
- es-errors: 1.3.0
- es-shim-unscopables: 1.0.2
-
- arraybuffer.prototype.slice@1.0.4:
- dependencies:
- array-buffer-byte-length: 1.0.2
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-abstract: 1.23.9
- es-errors: 1.3.0
- get-intrinsic: 1.2.7
- is-array-buffer: 3.0.5
+ assertion-error@1.1.0: {}
assertion-error@2.0.1: {}
@@ -13110,8 +14166,6 @@ snapshots:
astring@1.9.0: {}
- async-function@1.0.0: {}
-
at-least-node@1.0.0: {}
autoprefixer@10.4.20(postcss@8.4.49):
@@ -13128,12 +14182,12 @@ snapshots:
dependencies:
possible-typed-array-names: 1.0.0
- babel-loader@9.2.1(@babel/core@7.26.0)(webpack@5.97.1(esbuild@0.24.0)):
+ babel-loader@9.2.1(@babel/core@7.26.0)(webpack@5.97.1(esbuild@0.27.7)):
dependencies:
'@babel/core': 7.26.0
find-cache-dir: 4.0.0
schema-utils: 4.3.0
- webpack: 5.97.1(esbuild@0.24.0)
+ webpack: 5.97.1(esbuild@0.27.7)
babel-plugin-dynamic-import-node@2.3.3:
dependencies:
@@ -13269,12 +14323,19 @@ snapshots:
esbuild: 0.24.0
load-tsconfig: 0.2.5
+ bundle-require@5.1.0(esbuild@0.27.7):
+ dependencies:
+ esbuild: 0.27.7
+ load-tsconfig: 0.2.5
+
bytes@3.0.0: {}
bytes@3.1.2: {}
cac@6.7.14: {}
+ cac@7.0.0: {}
+
cacheable-lookup@7.0.0: {}
cacheable-request@10.2.14:
@@ -13328,6 +14389,16 @@ snapshots:
ccount@2.0.1: {}
+ chai@4.5.0:
+ dependencies:
+ assertion-error: 1.1.0
+ check-error: 1.0.3
+ deep-eql: 4.1.4
+ get-func-name: 2.0.2
+ loupe: 2.3.7
+ pathval: 1.1.1
+ type-detect: 4.1.0
+
chai@5.1.2:
dependencies:
assertion-error: 2.0.1
@@ -13366,6 +14437,10 @@ snapshots:
chardet@0.7.0: {}
+ check-error@1.0.3:
+ dependencies:
+ get-func-name: 2.0.2
+
check-error@2.1.1: {}
cheerio-select@2.1.0:
@@ -13403,14 +14478,16 @@ snapshots:
dependencies:
readdirp: 4.0.2
+ chokidar@4.0.3:
+ dependencies:
+ readdirp: 4.0.2
+
chromatic@11.19.0: {}
chrome-trace-event@1.0.4: {}
ci-info@3.9.0: {}
- classnames@2.5.1: {}
-
clean-css@5.3.3:
dependencies:
source-map: 0.6.1
@@ -13543,6 +14620,8 @@ snapshots:
concat-map@0.0.1: {}
+ confbox@0.1.8: {}
+
config-chain@1.1.13:
dependencies:
ini: 1.3.8
@@ -13560,6 +14639,8 @@ snapshots:
consola@3.2.3: {}
+ consola@3.4.2: {}
+
content-disposition@0.5.2: {}
content-disposition@0.5.4:
@@ -13593,7 +14674,7 @@ snapshots:
copy-text-to-clipboard@3.2.0: {}
- copy-webpack-plugin@11.0.0(webpack@5.97.1(esbuild@0.24.0)):
+ copy-webpack-plugin@11.0.0(webpack@5.97.1(esbuild@0.27.7)):
dependencies:
fast-glob: 3.3.2
glob-parent: 6.0.2
@@ -13601,7 +14682,7 @@ snapshots:
normalize-path: 3.0.0
schema-utils: 4.3.0
serialize-javascript: 6.0.2
- webpack: 5.97.1(esbuild@0.24.0)
+ webpack: 5.97.1(esbuild@0.27.7)
core-js-compat@3.40.0:
dependencies:
@@ -13672,7 +14753,7 @@ snapshots:
postcss-selector-parser: 7.0.0
postcss-value-parser: 4.2.0
- css-loader@6.11.0(webpack@5.97.1(esbuild@0.24.0)):
+ css-loader@6.11.0(webpack@5.97.1(esbuild@0.27.7)):
dependencies:
icss-utils: 5.1.0(postcss@8.4.49)
postcss: 8.4.49
@@ -13683,9 +14764,9 @@ snapshots:
postcss-value-parser: 4.2.0
semver: 7.6.3
optionalDependencies:
- webpack: 5.97.1(esbuild@0.24.0)
+ webpack: 5.97.1(esbuild@0.27.7)
- css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(esbuild@0.24.0)(webpack@5.97.1(esbuild@0.24.0)):
+ css-minimizer-webpack-plugin@5.0.1(clean-css@5.3.3)(esbuild@0.27.7)(lightningcss@1.32.0)(webpack@5.97.1(esbuild@0.27.7)):
dependencies:
'@jridgewell/trace-mapping': 0.3.25
cssnano: 6.1.2(postcss@8.4.49)
@@ -13693,10 +14774,11 @@ snapshots:
postcss: 8.4.49
schema-utils: 4.3.0
serialize-javascript: 6.0.2
- webpack: 5.97.1(esbuild@0.24.0)
+ webpack: 5.97.1(esbuild@0.27.7)
optionalDependencies:
clean-css: 5.3.3
- esbuild: 0.24.0
+ esbuild: 0.27.7
+ lightningcss: 1.32.0
css-prefers-color-scheme@10.0.0(postcss@8.4.49):
dependencies:
@@ -13795,8 +14877,15 @@ snapshots:
dependencies:
css-tree: 2.2.1
+ cssstyle@4.6.0:
+ dependencies:
+ '@asamuzakjp/css-color': 3.2.0
+ rrweb-cssom: 0.8.0
+
csstype@3.1.3: {}
+ csstype@3.2.3: {}
+
cz-conventional-changelog@3.3.0(@types/node@22.10.1)(typescript@5.6.3):
dependencies:
chalk: 2.4.2
@@ -13813,23 +14902,10 @@ snapshots:
dargs@8.1.0: {}
- data-view-buffer@1.0.2:
- dependencies:
- call-bound: 1.0.3
- es-errors: 1.3.0
- is-data-view: 1.0.2
-
- data-view-byte-length@1.0.2:
- dependencies:
- call-bound: 1.0.3
- es-errors: 1.3.0
- is-data-view: 1.0.2
-
- data-view-byte-offset@1.0.1:
+ data-urls@5.0.0:
dependencies:
- call-bound: 1.0.3
- es-errors: 1.3.0
- is-data-view: 1.0.2
+ whatwg-mimetype: 4.0.0
+ whatwg-url: 14.2.0
debounce@1.2.1: {}
@@ -13837,14 +14913,12 @@ snapshots:
dependencies:
ms: 2.0.0
- debug@4.3.7:
- dependencies:
- ms: 2.1.3
-
debug@4.4.0:
dependencies:
ms: 2.1.3
+ decimal.js@10.6.0: {}
+
decode-named-character-reference@1.0.2:
dependencies:
character-entities: 2.0.2
@@ -13855,11 +14929,20 @@ snapshots:
dedent@0.7.0: {}
+ dedent@1.7.2: {}
+
+ deep-eql@4.1.4:
+ dependencies:
+ type-detect: 4.1.0
+
deep-eql@5.0.2: {}
deep-extend@0.6.0: {}
- deep-is@0.1.4: {}
+ deep-is@0.1.4:
+ optional: true
+
+ deep-object-diff@1.1.9: {}
deepmerge@4.3.1: {}
@@ -13910,6 +14993,8 @@ snapshots:
detect-indent@6.1.0: {}
+ detect-libc@2.1.2: {}
+
detect-node@2.1.0: {}
detect-port-alt@1.1.6:
@@ -13930,6 +15015,8 @@ snapshots:
dependencies:
dequal: 2.0.3
+ diff-sequences@29.6.3: {}
+
dir-glob@3.0.1:
dependencies:
path-type: 4.0.0
@@ -13938,10 +15025,6 @@ snapshots:
dependencies:
'@leichtgewicht/ip-codec': 2.0.5
- doctrine@2.1.0:
- dependencies:
- esutils: 2.0.3
-
doctrine@3.0.0:
dependencies:
esutils: 2.0.3
@@ -14059,105 +15142,17 @@ snapshots:
dependencies:
is-arrayish: 0.2.1
- es-abstract@1.23.9:
- dependencies:
- array-buffer-byte-length: 1.0.2
- arraybuffer.prototype.slice: 1.0.4
- available-typed-arrays: 1.0.7
- call-bind: 1.0.8
- call-bound: 1.0.3
- data-view-buffer: 1.0.2
- data-view-byte-length: 1.0.2
- data-view-byte-offset: 1.0.1
- es-define-property: 1.0.1
- es-errors: 1.3.0
- es-object-atoms: 1.1.1
- es-set-tostringtag: 2.1.0
- es-to-primitive: 1.3.0
- function.prototype.name: 1.1.8
- get-intrinsic: 1.2.7
- get-proto: 1.0.1
- get-symbol-description: 1.1.0
- globalthis: 1.0.4
- gopd: 1.2.0
- has-property-descriptors: 1.0.2
- has-proto: 1.2.0
- has-symbols: 1.1.0
- hasown: 2.0.2
- internal-slot: 1.1.0
- is-array-buffer: 3.0.5
- is-callable: 1.2.7
- is-data-view: 1.0.2
- is-regex: 1.2.1
- is-shared-array-buffer: 1.0.4
- is-string: 1.1.1
- is-typed-array: 1.1.15
- is-weakref: 1.1.0
- math-intrinsics: 1.1.0
- object-inspect: 1.13.3
- object-keys: 1.1.1
- object.assign: 4.1.7
- own-keys: 1.0.1
- regexp.prototype.flags: 1.5.4
- safe-array-concat: 1.1.3
- safe-push-apply: 1.0.0
- safe-regex-test: 1.1.0
- set-proto: 1.0.0
- string.prototype.trim: 1.2.10
- string.prototype.trimend: 1.0.9
- string.prototype.trimstart: 1.0.8
- typed-array-buffer: 1.0.3
- typed-array-byte-length: 1.0.3
- typed-array-byte-offset: 1.0.4
- typed-array-length: 1.0.7
- unbox-primitive: 1.1.0
- which-typed-array: 1.1.18
-
es-define-property@1.0.1: {}
es-errors@1.3.0: {}
- es-iterator-helpers@1.2.1:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.3
- define-properties: 1.2.1
- es-abstract: 1.23.9
- es-errors: 1.3.0
- es-set-tostringtag: 2.1.0
- function-bind: 1.1.2
- get-intrinsic: 1.2.7
- globalthis: 1.0.4
- gopd: 1.2.0
- has-property-descriptors: 1.0.2
- has-proto: 1.2.0
- has-symbols: 1.1.0
- internal-slot: 1.1.0
- iterator.prototype: 1.1.5
- safe-array-concat: 1.1.3
-
- es-module-lexer@1.5.4: {}
-
- es-object-atoms@1.1.1:
- dependencies:
- es-errors: 1.3.0
-
- es-set-tostringtag@2.1.0:
- dependencies:
- es-errors: 1.3.0
- get-intrinsic: 1.2.7
- has-tostringtag: 1.0.2
- hasown: 2.0.2
+ es-module-lexer@1.5.4: {}
- es-shim-unscopables@1.0.2:
- dependencies:
- hasown: 2.0.2
+ es-module-lexer@2.0.0: {}
- es-to-primitive@1.3.0:
+ es-object-atoms@1.1.1:
dependencies:
- is-callable: 1.2.7
- is-date-object: 1.1.0
- is-symbol: 1.1.1
+ es-errors: 1.3.0
esast-util-from-estree@2.0.0:
dependencies:
@@ -14260,6 +15255,35 @@ snapshots:
'@esbuild/win32-ia32': 0.24.0
'@esbuild/win32-x64': 0.24.0
+ esbuild@0.27.7:
+ optionalDependencies:
+ '@esbuild/aix-ppc64': 0.27.7
+ '@esbuild/android-arm': 0.27.7
+ '@esbuild/android-arm64': 0.27.7
+ '@esbuild/android-x64': 0.27.7
+ '@esbuild/darwin-arm64': 0.27.7
+ '@esbuild/darwin-x64': 0.27.7
+ '@esbuild/freebsd-arm64': 0.27.7
+ '@esbuild/freebsd-x64': 0.27.7
+ '@esbuild/linux-arm': 0.27.7
+ '@esbuild/linux-arm64': 0.27.7
+ '@esbuild/linux-ia32': 0.27.7
+ '@esbuild/linux-loong64': 0.27.7
+ '@esbuild/linux-mips64el': 0.27.7
+ '@esbuild/linux-ppc64': 0.27.7
+ '@esbuild/linux-riscv64': 0.27.7
+ '@esbuild/linux-s390x': 0.27.7
+ '@esbuild/linux-x64': 0.27.7
+ '@esbuild/netbsd-arm64': 0.27.7
+ '@esbuild/netbsd-x64': 0.27.7
+ '@esbuild/openbsd-arm64': 0.27.7
+ '@esbuild/openbsd-x64': 0.27.7
+ '@esbuild/openharmony-arm64': 0.27.7
+ '@esbuild/sunos-x64': 0.27.7
+ '@esbuild/win32-arm64': 0.27.7
+ '@esbuild/win32-ia32': 0.27.7
+ '@esbuild/win32-x64': 0.27.7
+
escalade@3.2.0: {}
escape-goat@4.0.0: {}
@@ -14272,42 +15296,6 @@ snapshots:
escape-string-regexp@5.0.0: {}
- eslint-plugin-react-hooks@5.1.0(eslint@9.20.0(jiti@2.4.1)):
- dependencies:
- eslint: 9.20.0(jiti@2.4.1)
-
- eslint-plugin-react@7.37.4(eslint@9.20.0(jiti@2.4.1)):
- dependencies:
- array-includes: 3.1.8
- array.prototype.findlast: 1.2.5
- array.prototype.flatmap: 1.3.3
- array.prototype.tosorted: 1.1.4
- doctrine: 2.1.0
- es-iterator-helpers: 1.2.1
- eslint: 9.20.0(jiti@2.4.1)
- estraverse: 5.3.0
- hasown: 2.0.2
- jsx-ast-utils: 3.3.5
- minimatch: 3.1.2
- object.entries: 1.1.8
- object.fromentries: 2.0.8
- object.values: 1.2.1
- prop-types: 15.8.1
- resolve: 2.0.0-next.5
- semver: 6.3.1
- string.prototype.matchall: 4.0.12
- string.prototype.repeat: 1.0.0
-
- eslint-plugin-storybook@0.11.2(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3):
- dependencies:
- '@storybook/csf': 0.1.12
- '@typescript-eslint/utils': 8.22.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)
- eslint: 9.20.0(jiti@2.4.1)
- ts-dedent: 2.2.0
- transitivePeerDependencies:
- - supports-color
- - typescript
-
eslint-scope@5.1.1:
dependencies:
esrecurse: 4.3.0
@@ -14317,10 +15305,13 @@ snapshots:
dependencies:
esrecurse: 4.3.0
estraverse: 5.3.0
+ optional: true
- eslint-visitor-keys@3.4.3: {}
+ eslint-visitor-keys@3.4.3:
+ optional: true
- eslint-visitor-keys@4.2.0: {}
+ eslint-visitor-keys@4.2.0:
+ optional: true
eslint@9.20.0(jiti@2.4.1):
dependencies:
@@ -14362,18 +15353,21 @@ snapshots:
jiti: 2.4.1
transitivePeerDependencies:
- supports-color
+ optional: true
espree@10.3.0:
dependencies:
acorn: 8.14.0
acorn-jsx: 5.3.2(acorn@8.14.0)
eslint-visitor-keys: 4.2.0
+ optional: true
esprima@4.0.1: {}
esquery@1.6.0:
dependencies:
estraverse: 5.3.0
+ optional: true
esrecurse@4.3.0:
dependencies:
@@ -14531,7 +15525,8 @@ snapshots:
fast-json-stable-stringify@2.1.0: {}
- fast-levenshtein@2.0.6: {}
+ fast-levenshtein@2.0.6:
+ optional: true
fast-uri@3.0.3: {}
@@ -14551,6 +15546,10 @@ snapshots:
optionalDependencies:
picomatch: 4.0.2
+ fdir@6.5.0(picomatch@4.0.4):
+ optionalDependencies:
+ picomatch: 4.0.4
+
feed@4.2.2:
dependencies:
xml-js: 1.6.11
@@ -14562,12 +15561,13 @@ snapshots:
file-entry-cache@8.0.0:
dependencies:
flat-cache: 4.0.1
+ optional: true
- file-loader@6.2.0(webpack@5.97.1(esbuild@0.24.0)):
+ file-loader@6.2.0(webpack@5.97.1(esbuild@0.27.7)):
dependencies:
loader-utils: 2.0.4
schema-utils: 3.3.0
- webpack: 5.97.1(esbuild@0.24.0)
+ webpack: 5.97.1(esbuild@0.27.7)
filesize@8.0.7: {}
@@ -14631,14 +15631,22 @@ snapshots:
micromatch: 4.0.8
resolve-dir: 1.0.1
+ fix-dts-default-cjs-exports@1.0.1:
+ dependencies:
+ magic-string: 0.30.21
+ mlly: 1.8.2
+ rollup: 4.60.1
+
flat-cache@4.0.1:
dependencies:
flatted: 3.3.2
keyv: 4.5.4
+ optional: true
flat@5.0.2: {}
- flatted@3.3.2: {}
+ flatted@3.3.2:
+ optional: true
follow-redirects@1.15.9: {}
@@ -14651,7 +15659,7 @@ snapshots:
cross-spawn: 7.0.6
signal-exit: 4.1.0
- fork-ts-checker-webpack-plugin@6.5.3(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)(webpack@5.97.1(esbuild@0.24.0)):
+ fork-ts-checker-webpack-plugin@6.5.3(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)(webpack@5.97.1(esbuild@0.27.7)):
dependencies:
'@babel/code-frame': 7.26.2
'@types/json-schema': 7.0.15
@@ -14667,7 +15675,7 @@ snapshots:
semver: 7.6.3
tapable: 1.1.3
typescript: 5.6.3
- webpack: 5.97.1(esbuild@0.24.0)
+ webpack: 5.97.1(esbuild@0.27.7)
optionalDependencies:
eslint: 9.20.0(jiti@2.4.1)
@@ -14715,23 +15723,14 @@ snapshots:
function-bind@1.1.2: {}
- function.prototype.name@1.1.8:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.3
- define-properties: 1.2.1
- functions-have-names: 1.2.3
- hasown: 2.0.2
- is-callable: 1.2.7
-
- functions-have-names@1.2.3: {}
-
gensync@1.0.0-beta.2: {}
get-caller-file@2.0.5: {}
get-east-asian-width@1.3.0: {}
+ get-func-name@2.0.2: {}
+
get-intrinsic@1.2.7:
dependencies:
call-bind-apply-helpers: 1.0.1
@@ -14756,12 +15755,6 @@ snapshots:
get-stream@8.0.1: {}
- get-symbol-description@1.1.0:
- dependencies:
- call-bound: 1.0.3
- es-errors: 1.3.0
- get-intrinsic: 1.2.7
-
get-tsconfig@4.8.1:
dependencies:
resolve-pkg-maps: 1.0.0
@@ -14836,15 +15829,11 @@ snapshots:
globals@11.12.0: {}
- globals@14.0.0: {}
+ globals@14.0.0:
+ optional: true
globals@15.14.0: {}
- globalthis@1.0.4:
- dependencies:
- define-properties: 1.2.1
- gopd: 1.2.0
-
globby@11.1.0:
dependencies:
array-union: 2.1.0
@@ -14882,8 +15871,6 @@ snapshots:
graceful-fs@4.2.11: {}
- graphemer@1.4.0: {}
-
gray-matter@4.0.3:
dependencies:
js-yaml: 3.14.1
@@ -14903,8 +15890,6 @@ snapshots:
webidl-conversions: 7.0.0
whatwg-mimetype: 3.0.0
- has-bigints@1.1.0: {}
-
has-flag@3.0.0: {}
has-flag@4.0.0: {}
@@ -14913,10 +15898,6 @@ snapshots:
dependencies:
es-define-property: 1.0.1
- has-proto@1.2.0:
- dependencies:
- dunder-proto: 1.0.1
-
has-symbols@1.1.0: {}
has-tostringtag@1.0.2:
@@ -15049,6 +16030,10 @@ snapshots:
readable-stream: 2.3.8
wbuf: 1.7.3
+ html-encoding-sniffer@4.0.0:
+ dependencies:
+ whatwg-encoding: 3.1.1
+
html-entities@2.5.2: {}
html-escaper@2.0.2: {}
@@ -15077,7 +16062,7 @@ snapshots:
html-void-elements@3.0.0: {}
- html-webpack-plugin@5.6.3(webpack@5.97.1(esbuild@0.24.0)):
+ html-webpack-plugin@5.6.3(webpack@5.97.1(esbuild@0.27.7)):
dependencies:
'@types/html-minifier-terser': 6.1.0
html-minifier-terser: 6.1.0
@@ -15085,7 +16070,7 @@ snapshots:
pretty-error: 4.0.0
tapable: 2.2.1
optionalDependencies:
- webpack: 5.97.1(esbuild@0.24.0)
+ webpack: 5.97.1(esbuild@0.27.7)
htmlparser2@6.1.0:
dependencies:
@@ -15122,6 +16107,13 @@ snapshots:
http-parser-js@0.5.9: {}
+ http-proxy-agent@7.0.2:
+ dependencies:
+ agent-base: 7.1.4
+ debug: 4.4.0
+ transitivePeerDependencies:
+ - supports-color
+
http-proxy-middleware@2.0.7(@types/express@4.17.21):
dependencies:
'@types/http-proxy': 1.17.15
@@ -15147,6 +16139,13 @@ snapshots:
quick-lru: 5.1.1
resolve-alpn: 1.2.1
+ https-proxy-agent@7.0.6:
+ dependencies:
+ agent-base: 7.1.4
+ debug: 4.4.0
+ transitivePeerDependencies:
+ - supports-color
+
human-id@1.0.2: {}
human-signals@2.1.0: {}
@@ -15159,6 +16158,10 @@ snapshots:
dependencies:
safer-buffer: 2.1.2
+ iconv-lite@0.6.3:
+ dependencies:
+ safer-buffer: 2.1.2
+
icss-utils@5.1.0(postcss@8.4.49):
dependencies:
postcss: 8.4.49
@@ -15223,12 +16226,6 @@ snapshots:
through: 2.3.8
wrap-ansi: 7.0.0
- internal-slot@1.1.0:
- dependencies:
- es-errors: 1.3.0
- hasown: 2.0.2
- side-channel: 1.1.0
-
interpret@1.4.0: {}
invariant@2.2.4:
@@ -15251,35 +16248,12 @@ snapshots:
call-bind: 1.0.8
has-tostringtag: 1.0.2
- is-array-buffer@3.0.5:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.3
- get-intrinsic: 1.2.7
-
is-arrayish@0.2.1: {}
- is-async-function@2.1.1:
- dependencies:
- async-function: 1.0.0
- call-bound: 1.0.3
- get-proto: 1.0.1
- has-tostringtag: 1.0.2
- safe-regex-test: 1.1.0
-
- is-bigint@1.1.0:
- dependencies:
- has-bigints: 1.1.0
-
is-binary-path@2.1.0:
dependencies:
binary-extensions: 2.3.0
- is-boolean-object@1.2.1:
- dependencies:
- call-bound: 1.0.3
- has-tostringtag: 1.0.2
-
is-callable@1.2.7: {}
is-ci@3.0.1:
@@ -15290,17 +16264,6 @@ snapshots:
dependencies:
hasown: 2.0.2
- is-data-view@1.0.2:
- dependencies:
- call-bound: 1.0.3
- get-intrinsic: 1.2.7
- is-typed-array: 1.1.15
-
- is-date-object@1.1.0:
- dependencies:
- call-bound: 1.0.3
- has-tostringtag: 1.0.2
-
is-decimal@2.0.1: {}
is-docker@2.2.1: {}
@@ -15309,10 +16272,6 @@ snapshots:
is-extglob@2.1.1: {}
- is-finalizationregistry@1.1.1:
- dependencies:
- call-bound: 1.0.3
-
is-fullwidth-code-point@3.0.0: {}
is-fullwidth-code-point@4.0.0: {}
@@ -15338,15 +16297,8 @@ snapshots:
is-interactive@1.0.0: {}
- is-map@2.0.3: {}
-
is-npm@6.0.0: {}
- is-number-object@1.1.1:
- dependencies:
- call-bound: 1.0.3
- has-tostringtag: 1.0.2
-
is-number@7.0.0: {}
is-obj@1.0.1: {}
@@ -15365,42 +16317,20 @@ snapshots:
dependencies:
isobject: 3.0.1
- is-regex@1.2.1:
- dependencies:
- call-bound: 1.0.3
- gopd: 1.2.0
- has-tostringtag: 1.0.2
- hasown: 2.0.2
+ is-potential-custom-element-name@1.0.1: {}
is-regexp@1.0.0: {}
is-root@2.1.0: {}
- is-set@2.0.3: {}
-
- is-shared-array-buffer@1.0.4:
- dependencies:
- call-bound: 1.0.3
-
is-stream@2.0.1: {}
is-stream@3.0.0: {}
- is-string@1.1.1:
- dependencies:
- call-bound: 1.0.3
- has-tostringtag: 1.0.2
-
is-subdir@1.2.0:
dependencies:
better-path-resolve: 1.0.0
- is-symbol@1.1.1:
- dependencies:
- call-bound: 1.0.3
- has-symbols: 1.1.0
- safe-regex-test: 1.1.0
-
is-text-path@2.0.0:
dependencies:
text-extensions: 2.4.0
@@ -15415,17 +16345,6 @@ snapshots:
is-utf8@0.2.1: {}
- is-weakmap@2.0.2: {}
-
- is-weakref@1.1.0:
- dependencies:
- call-bound: 1.0.3
-
- is-weakset@2.0.4:
- dependencies:
- call-bound: 1.0.3
- get-intrinsic: 1.2.7
-
is-windows@1.0.2: {}
is-wsl@2.2.0:
@@ -15438,8 +16357,6 @@ snapshots:
isarray@1.0.0: {}
- isarray@2.0.5: {}
-
isexe@2.0.0: {}
isobject@3.0.1: {}
@@ -15465,21 +16382,14 @@ snapshots:
html-escaper: 2.0.2
istanbul-lib-report: 3.0.1
- iterator.prototype@1.1.5:
- dependencies:
- define-data-property: 1.1.4
- es-object-atoms: 1.1.1
- get-intrinsic: 1.2.7
- get-proto: 1.0.1
- has-symbols: 1.1.0
- set-function-name: 2.0.2
-
jackspeak@3.4.3:
dependencies:
'@isaacs/cliui': 8.0.2
optionalDependencies:
'@pkgjs/parseargs': 0.11.0
+ javascript-stringify@2.1.0: {}
+
jest-util@29.7.0:
dependencies:
'@jest/types': 29.6.3
@@ -15518,6 +16428,8 @@ snapshots:
js-tokens@4.0.0: {}
+ js-tokens@9.0.1: {}
+
js-yaml@3.14.1:
dependencies:
argparse: 1.0.10
@@ -15529,6 +16441,33 @@ snapshots:
jsdoc-type-pratt-parser@4.1.0: {}
+ jsdom@26.1.0:
+ dependencies:
+ cssstyle: 4.6.0
+ data-urls: 5.0.0
+ decimal.js: 10.6.0
+ html-encoding-sniffer: 4.0.0
+ http-proxy-agent: 7.0.2
+ https-proxy-agent: 7.0.6
+ is-potential-custom-element-name: 1.0.1
+ nwsapi: 2.2.23
+ parse5: 7.2.1
+ rrweb-cssom: 0.8.0
+ saxes: 6.0.0
+ symbol-tree: 3.2.4
+ tough-cookie: 5.1.2
+ w3c-xmlserializer: 5.0.0
+ webidl-conversions: 7.0.0
+ whatwg-encoding: 3.1.1
+ whatwg-mimetype: 4.0.0
+ whatwg-url: 14.2.0
+ ws: 8.18.0
+ xml-name-validator: 5.0.0
+ transitivePeerDependencies:
+ - bufferutil
+ - supports-color
+ - utf-8-validate
+
jsesc@3.0.2: {}
json-buffer@3.0.1: {}
@@ -15539,7 +16478,8 @@ snapshots:
json-schema-traverse@1.0.0: {}
- json-stable-stringify-without-jsonify@1.0.1: {}
+ json-stable-stringify-without-jsonify@1.0.1:
+ optional: true
json5@2.2.3: {}
@@ -15555,13 +16495,6 @@ snapshots:
jsonparse@1.3.1: {}
- jsx-ast-utils@3.3.5:
- dependencies:
- array-includes: 3.1.8
- array.prototype.flat: 1.3.3
- object.assign: 4.1.7
- object.values: 1.2.1
-
keyv@4.5.4:
dependencies:
json-buffer: 3.0.1
@@ -15606,6 +16539,56 @@ snapshots:
dependencies:
prelude-ls: 1.2.1
type-check: 0.4.0
+ optional: true
+
+ lightningcss-android-arm64@1.32.0:
+ optional: true
+
+ lightningcss-darwin-arm64@1.32.0:
+ optional: true
+
+ lightningcss-darwin-x64@1.32.0:
+ optional: true
+
+ lightningcss-freebsd-x64@1.32.0:
+ optional: true
+
+ lightningcss-linux-arm-gnueabihf@1.32.0:
+ optional: true
+
+ lightningcss-linux-arm64-gnu@1.32.0:
+ optional: true
+
+ lightningcss-linux-arm64-musl@1.32.0:
+ optional: true
+
+ lightningcss-linux-x64-gnu@1.32.0:
+ optional: true
+
+ lightningcss-linux-x64-musl@1.32.0:
+ optional: true
+
+ lightningcss-win32-arm64-msvc@1.32.0:
+ optional: true
+
+ lightningcss-win32-x64-msvc@1.32.0:
+ optional: true
+
+ lightningcss@1.32.0:
+ dependencies:
+ detect-libc: 2.1.2
+ optionalDependencies:
+ lightningcss-android-arm64: 1.32.0
+ lightningcss-darwin-arm64: 1.32.0
+ lightningcss-darwin-x64: 1.32.0
+ lightningcss-freebsd-x64: 1.32.0
+ lightningcss-linux-arm-gnueabihf: 1.32.0
+ lightningcss-linux-arm64-gnu: 1.32.0
+ lightningcss-linux-arm64-musl: 1.32.0
+ lightningcss-linux-x64-gnu: 1.32.0
+ lightningcss-linux-x64-musl: 1.32.0
+ lightningcss-win32-arm64-msvc: 1.32.0
+ lightningcss-win32-x64-msvc: 1.32.0
lilconfig@3.1.3: {}
@@ -15647,6 +16630,11 @@ snapshots:
loader-utils@3.3.1: {}
+ local-pkg@0.5.1:
+ dependencies:
+ mlly: 1.8.2
+ pkg-types: 1.3.1
+
locate-path@3.0.0:
dependencies:
p-locate: 3.0.0
@@ -15713,6 +16701,10 @@ snapshots:
dependencies:
js-tokens: 4.0.0
+ loupe@2.3.7:
+ dependencies:
+ get-func-name: 2.0.2
+
loupe@3.1.2: {}
lower-case@2.0.2:
@@ -15737,6 +16729,10 @@ snapshots:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
+ magic-string@0.30.21:
+ dependencies:
+ '@jridgewell/sourcemap-codec': 1.5.5
+
magicast@0.3.5:
dependencies:
'@babel/parser': 7.26.5
@@ -15951,6 +16947,10 @@ snapshots:
mdn-data@2.0.30: {}
+ media-query-parser@2.0.2:
+ dependencies:
+ '@babel/runtime': 7.26.0
+
media-typer@0.3.0: {}
memfs@3.5.3:
@@ -16303,11 +17303,11 @@ snapshots:
min-indent@1.0.1: {}
- mini-css-extract-plugin@2.9.2(webpack@5.97.1(esbuild@0.24.0)):
+ mini-css-extract-plugin@2.9.2(webpack@5.97.1(esbuild@0.27.7)):
dependencies:
schema-utils: 4.3.0
tapable: 2.2.1
- webpack: 5.97.1(esbuild@0.24.0)
+ webpack: 5.97.1(esbuild@0.27.7)
minimalistic-assert@1.0.1: {}
@@ -16325,6 +17325,15 @@ snapshots:
minipass@7.1.2: {}
+ mlly@1.8.2:
+ dependencies:
+ acorn: 8.16.0
+ pathe: 2.0.3
+ pkg-types: 1.3.1
+ ufo: 1.6.3
+
+ modern-ahocorasick@1.1.0: {}
+
mri@1.2.0: {}
mrmime@2.0.0: {}
@@ -16346,11 +17355,12 @@ snapshots:
object-assign: 4.1.1
thenify-all: 1.6.0
- nanoid@3.3.8: {}
+ nanoid@3.3.11: {}
- nanoid@5.0.9: {}
+ nanoid@3.3.8: {}
- natural-compare@1.4.0: {}
+ natural-compare@1.4.0:
+ optional: true
negotiator@0.6.3: {}
@@ -16394,11 +17404,13 @@ snapshots:
dependencies:
boolbase: 1.0.0
- null-loader@4.0.1(webpack@5.97.1(esbuild@0.24.0)):
+ null-loader@4.0.1(webpack@5.97.1(esbuild@0.27.7)):
dependencies:
loader-utils: 2.0.4
schema-utils: 3.3.0
- webpack: 5.97.1(esbuild@0.24.0)
+ webpack: 5.97.1(esbuild@0.27.7)
+
+ nwsapi@2.2.23: {}
object-assign@4.1.1: {}
@@ -16415,28 +17427,10 @@ snapshots:
has-symbols: 1.1.0
object-keys: 1.1.1
- object.entries@1.1.8:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-object-atoms: 1.1.1
-
- object.fromentries@2.0.8:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-abstract: 1.23.9
- es-object-atoms: 1.1.1
-
- object.values@1.2.1:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.3
- define-properties: 1.2.1
- es-object-atoms: 1.1.1
-
obuf@1.1.2: {}
+ obug@2.1.1: {}
+
on-finished@2.4.1:
dependencies:
ee-first: 1.1.1
@@ -16475,6 +17469,7 @@ snapshots:
prelude-ls: 1.2.1
type-check: 0.4.0
word-wrap: 1.2.5
+ optional: true
ora@5.4.1:
dependencies:
@@ -16492,12 +17487,6 @@ snapshots:
outdent@0.5.0: {}
- own-keys@1.0.1:
- dependencies:
- get-intrinsic: 1.2.7
- object-keys: 1.1.1
- safe-push-apply: 1.0.0
-
p-cancelable@3.0.0: {}
p-filter@2.1.0:
@@ -16516,6 +17505,10 @@ snapshots:
dependencies:
yocto-queue: 1.1.1
+ p-limit@5.0.0:
+ dependencies:
+ yocto-queue: 1.1.1
+
p-locate@3.0.0:
dependencies:
p-limit: 2.3.0
@@ -16637,6 +17630,10 @@ snapshots:
pathe@1.1.2: {}
+ pathe@2.0.3: {}
+
+ pathval@1.1.1: {}
+
pathval@2.0.0: {}
picocolors@1.1.1: {}
@@ -16645,6 +17642,8 @@ snapshots:
picomatch@4.0.2: {}
+ picomatch@4.0.4: {}
+
pidtree@0.6.0: {}
pify@4.0.1: {}
@@ -16655,6 +17654,12 @@ snapshots:
dependencies:
find-up: 6.3.0
+ pkg-types@1.3.1:
+ dependencies:
+ confbox: 0.1.8
+ mlly: 1.8.2
+ pathe: 2.0.3
+
pkg-up@3.1.0:
dependencies:
find-up: 3.0.0
@@ -16807,22 +17812,22 @@ snapshots:
'@csstools/utilities': 2.0.0(postcss@8.4.49)
postcss: 8.4.49
- postcss-load-config@6.0.1(jiti@2.4.1)(postcss@8.4.49)(tsx@4.19.2)(yaml@2.6.1):
+ postcss-load-config@6.0.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(yaml@2.6.1):
dependencies:
lilconfig: 3.1.3
optionalDependencies:
jiti: 2.4.1
- postcss: 8.4.49
+ postcss: 8.5.9
tsx: 4.19.2
yaml: 2.6.1
- postcss-loader@7.3.4(postcss@8.4.49)(typescript@5.6.3)(webpack@5.97.1(esbuild@0.24.0)):
+ postcss-loader@7.3.4(postcss@8.4.49)(typescript@5.6.3)(webpack@5.97.1(esbuild@0.27.7)):
dependencies:
cosmiconfig: 8.3.6(typescript@5.6.3)
jiti: 1.21.7
postcss: 8.4.49
semver: 7.6.3
- webpack: 5.97.1(esbuild@0.24.0)
+ webpack: 5.97.1(esbuild@0.27.7)
transitivePeerDependencies:
- typescript
@@ -17101,13 +18106,20 @@ snapshots:
dependencies:
postcss: 8.4.49
- postcss@8.4.49:
+ postcss@8.4.49:
+ dependencies:
+ nanoid: 3.3.8
+ picocolors: 1.1.1
+ source-map-js: 1.2.1
+
+ postcss@8.5.9:
dependencies:
- nanoid: 3.3.8
+ nanoid: 3.3.11
picocolors: 1.1.1
source-map-js: 1.2.1
- prelude-ls@1.2.1: {}
+ prelude-ls@1.2.1:
+ optional: true
prettier@2.8.8: {}
@@ -17122,6 +18134,12 @@ snapshots:
ansi-styles: 5.2.0
react-is: 17.0.2
+ pretty-format@29.7.0:
+ dependencies:
+ '@jest/schemas': 29.6.3
+ ansi-styles: 5.2.0
+ react-is: 18.3.1
+
pretty-ms@9.2.0:
dependencies:
parse-ms: 4.0.0
@@ -17200,7 +18218,7 @@ snapshots:
minimist: 1.2.8
strip-json-comments: 2.0.1
- react-dev-utils@12.0.1(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)(webpack@5.97.1(esbuild@0.24.0)):
+ react-dev-utils@12.0.1(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)(webpack@5.97.1(esbuild@0.27.7)):
dependencies:
'@babel/code-frame': 7.26.2
address: 1.2.2
@@ -17211,7 +18229,7 @@ snapshots:
escape-string-regexp: 4.0.0
filesize: 8.0.7
find-up: 5.0.0
- fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)(webpack@5.97.1(esbuild@0.24.0))
+ fork-ts-checker-webpack-plugin: 6.5.3(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)(webpack@5.97.1(esbuild@0.27.7))
global-modules: 2.0.0
globby: 11.1.0
gzip-size: 6.0.0
@@ -17226,7 +18244,7 @@ snapshots:
shell-quote: 1.8.2
strip-ansi: 6.0.1
text-table: 0.2.0
- webpack: 5.97.1(esbuild@0.24.0)
+ webpack: 5.97.1(esbuild@0.27.7)
optionalDependencies:
typescript: 5.6.3
transitivePeerDependencies:
@@ -17284,15 +18302,17 @@ snapshots:
react-is@17.0.2: {}
+ react-is@18.3.1: {}
+
react-json-view-lite@1.5.0(react@18.3.1):
dependencies:
react: 18.3.1
- react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.97.1(esbuild@0.24.0)):
+ react-loadable-ssr-addon-v5-slorber@1.0.1(@docusaurus/react-loadable@6.0.0(react@18.3.1))(webpack@5.97.1(esbuild@0.27.7)):
dependencies:
'@babel/runtime': 7.26.0
react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)'
- webpack: 5.97.1(esbuild@0.24.0)
+ webpack: 5.97.1(esbuild@0.27.7)
react-router-config@5.1.1(react-router@5.3.4(react@18.3.1))(react@18.3.1):
dependencies:
@@ -17410,17 +18430,6 @@ snapshots:
indent-string: 4.0.0
strip-indent: 3.0.0
- reflect.getprototypeof@1.0.10:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-abstract: 1.23.9
- es-errors: 1.3.0
- es-object-atoms: 1.1.1
- get-intrinsic: 1.2.7
- get-proto: 1.0.1
- which-builtin-type: 1.2.1
-
regenerate-unicode-properties@10.2.0:
dependencies:
regenerate: 1.4.2
@@ -17433,15 +18442,6 @@ snapshots:
dependencies:
'@babel/runtime': 7.26.0
- regexp.prototype.flags@1.5.4:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-errors: 1.3.0
- get-proto: 1.0.1
- gopd: 1.2.0
- set-function-name: 2.0.2
-
regexpu-core@6.2.0:
dependencies:
regenerate: 1.4.2
@@ -17587,12 +18587,6 @@ snapshots:
path-parse: 1.0.7
supports-preserve-symlinks-flag: 1.0.0
- resolve@2.0.0-next.5:
- dependencies:
- is-core-module: 2.15.1
- path-parse: 1.0.7
- supports-preserve-symlinks-flag: 1.0.0
-
responselike@3.0.0:
dependencies:
lowercase-keys: 3.0.0
@@ -17617,6 +18611,27 @@ snapshots:
dependencies:
glob: 7.2.3
+ rolldown@1.0.0-rc.15:
+ dependencies:
+ '@oxc-project/types': 0.124.0
+ '@rolldown/pluginutils': 1.0.0-rc.15
+ optionalDependencies:
+ '@rolldown/binding-android-arm64': 1.0.0-rc.15
+ '@rolldown/binding-darwin-arm64': 1.0.0-rc.15
+ '@rolldown/binding-darwin-x64': 1.0.0-rc.15
+ '@rolldown/binding-freebsd-x64': 1.0.0-rc.15
+ '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-rc.15
+ '@rolldown/binding-linux-arm64-gnu': 1.0.0-rc.15
+ '@rolldown/binding-linux-arm64-musl': 1.0.0-rc.15
+ '@rolldown/binding-linux-ppc64-gnu': 1.0.0-rc.15
+ '@rolldown/binding-linux-s390x-gnu': 1.0.0-rc.15
+ '@rolldown/binding-linux-x64-gnu': 1.0.0-rc.15
+ '@rolldown/binding-linux-x64-musl': 1.0.0-rc.15
+ '@rolldown/binding-openharmony-arm64': 1.0.0-rc.15
+ '@rolldown/binding-wasm32-wasi': 1.0.0-rc.15
+ '@rolldown/binding-win32-arm64-msvc': 1.0.0-rc.15
+ '@rolldown/binding-win32-x64-msvc': 1.0.0-rc.15
+
rollup@4.28.0:
dependencies:
'@types/estree': 1.0.6
@@ -17641,6 +18656,39 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.28.0
fsevents: 2.3.3
+ rollup@4.60.1:
+ dependencies:
+ '@types/estree': 1.0.8
+ optionalDependencies:
+ '@rollup/rollup-android-arm-eabi': 4.60.1
+ '@rollup/rollup-android-arm64': 4.60.1
+ '@rollup/rollup-darwin-arm64': 4.60.1
+ '@rollup/rollup-darwin-x64': 4.60.1
+ '@rollup/rollup-freebsd-arm64': 4.60.1
+ '@rollup/rollup-freebsd-x64': 4.60.1
+ '@rollup/rollup-linux-arm-gnueabihf': 4.60.1
+ '@rollup/rollup-linux-arm-musleabihf': 4.60.1
+ '@rollup/rollup-linux-arm64-gnu': 4.60.1
+ '@rollup/rollup-linux-arm64-musl': 4.60.1
+ '@rollup/rollup-linux-loong64-gnu': 4.60.1
+ '@rollup/rollup-linux-loong64-musl': 4.60.1
+ '@rollup/rollup-linux-ppc64-gnu': 4.60.1
+ '@rollup/rollup-linux-ppc64-musl': 4.60.1
+ '@rollup/rollup-linux-riscv64-gnu': 4.60.1
+ '@rollup/rollup-linux-riscv64-musl': 4.60.1
+ '@rollup/rollup-linux-s390x-gnu': 4.60.1
+ '@rollup/rollup-linux-x64-gnu': 4.60.1
+ '@rollup/rollup-linux-x64-musl': 4.60.1
+ '@rollup/rollup-openbsd-x64': 4.60.1
+ '@rollup/rollup-openharmony-arm64': 4.60.1
+ '@rollup/rollup-win32-arm64-msvc': 4.60.1
+ '@rollup/rollup-win32-ia32-msvc': 4.60.1
+ '@rollup/rollup-win32-x64-gnu': 4.60.1
+ '@rollup/rollup-win32-x64-msvc': 4.60.1
+ fsevents: 2.3.3
+
+ rrweb-cssom@0.8.0: {}
+
rtl-detect@1.1.2: {}
rtlcss@4.3.0:
@@ -17660,35 +18708,20 @@ snapshots:
dependencies:
tslib: 2.8.1
- safe-array-concat@1.1.3:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.3
- get-intrinsic: 1.2.7
- has-symbols: 1.1.0
- isarray: 2.0.5
-
safe-buffer@5.1.2: {}
safe-buffer@5.2.1: {}
- safe-push-apply@1.0.0:
- dependencies:
- es-errors: 1.3.0
- isarray: 2.0.5
-
- safe-regex-test@1.1.0:
- dependencies:
- call-bound: 1.0.3
- es-errors: 1.3.0
- is-regex: 1.2.1
-
safer-buffer@2.1.2: {}
sanitize.css@13.0.0: {}
sax@1.4.1: {}
+ saxes@6.0.0:
+ dependencies:
+ xmlchars: 2.2.0
+
scheduler@0.23.2:
dependencies:
loose-envify: 1.4.0
@@ -17796,19 +18829,6 @@ snapshots:
gopd: 1.2.0
has-property-descriptors: 1.0.2
- set-function-name@2.0.2:
- dependencies:
- define-data-property: 1.1.4
- es-errors: 1.3.0
- functions-have-names: 1.2.3
- has-property-descriptors: 1.0.2
-
- set-proto@1.0.0:
- dependencies:
- dunder-proto: 1.0.1
- es-errors: 1.3.0
- es-object-atoms: 1.1.1
-
setprototypeof@1.1.0: {}
setprototypeof@1.2.0: {}
@@ -17926,6 +18946,8 @@ snapshots:
source-map@0.7.4: {}
+ source-map@0.7.6: {}
+
source-map@0.8.0-beta.0:
dependencies:
whatwg-url: 7.1.0
@@ -18002,50 +19024,6 @@ snapshots:
get-east-asian-width: 1.3.0
strip-ansi: 7.1.0
- string.prototype.matchall@4.0.12:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.3
- define-properties: 1.2.1
- es-abstract: 1.23.9
- es-errors: 1.3.0
- es-object-atoms: 1.1.1
- get-intrinsic: 1.2.7
- gopd: 1.2.0
- has-symbols: 1.1.0
- internal-slot: 1.1.0
- regexp.prototype.flags: 1.5.4
- set-function-name: 2.0.2
- side-channel: 1.1.0
-
- string.prototype.repeat@1.0.0:
- dependencies:
- define-properties: 1.2.1
- es-abstract: 1.23.9
-
- string.prototype.trim@1.2.10:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.3
- define-data-property: 1.1.4
- define-properties: 1.2.1
- es-abstract: 1.23.9
- es-object-atoms: 1.1.1
- has-property-descriptors: 1.0.2
-
- string.prototype.trimend@1.0.9:
- dependencies:
- call-bind: 1.0.8
- call-bound: 1.0.3
- define-properties: 1.2.1
- es-object-atoms: 1.1.1
-
- string.prototype.trimstart@1.0.8:
- dependencies:
- call-bind: 1.0.8
- define-properties: 1.2.1
- es-object-atoms: 1.1.1
-
string_decoder@1.1.1:
dependencies:
safe-buffer: 5.1.2
@@ -18097,6 +19075,10 @@ snapshots:
strip-json-comments@5.0.1: {}
+ strip-literal@2.1.1:
+ dependencies:
+ js-tokens: 9.0.1
+
style-to-object@1.0.8:
dependencies:
inline-style-parser: 0.2.4
@@ -18145,22 +19127,24 @@ snapshots:
csso: 5.0.5
picocolors: 1.1.1
+ symbol-tree@3.2.4: {}
+
tapable@1.1.3: {}
tapable@2.2.1: {}
term-size@2.2.1: {}
- terser-webpack-plugin@5.3.11(esbuild@0.24.0)(webpack@5.97.1(esbuild@0.24.0)):
+ terser-webpack-plugin@5.3.11(esbuild@0.27.7)(webpack@5.97.1(esbuild@0.27.7)):
dependencies:
'@jridgewell/trace-mapping': 0.3.25
jest-worker: 27.5.1
schema-utils: 4.3.0
serialize-javascript: 6.0.2
terser: 5.37.0
- webpack: 5.97.1(esbuild@0.24.0)
+ webpack: 5.97.1(esbuild@0.27.7)
optionalDependencies:
- esbuild: 0.24.0
+ esbuild: 0.27.7
terser@5.37.0:
dependencies:
@@ -18199,17 +19183,34 @@ snapshots:
tinyexec@0.3.1: {}
+ tinyexec@0.3.2: {}
+
tinyglobby@0.2.10:
dependencies:
fdir: 6.4.2(picomatch@4.0.2)
picomatch: 4.0.2
+ tinyglobby@0.2.16:
+ dependencies:
+ fdir: 6.5.0(picomatch@4.0.4)
+ picomatch: 4.0.4
+
+ tinypool@0.8.4: {}
+
tinypool@1.0.2: {}
tinyrainbow@1.2.0: {}
+ tinyspy@2.2.1: {}
+
tinyspy@3.0.2: {}
+ tldts-core@6.1.86: {}
+
+ tldts@6.1.86:
+ dependencies:
+ tldts-core: 6.1.86
+
tmp@0.0.33:
dependencies:
os-tmpdir: 1.0.2
@@ -18222,30 +19223,28 @@ snapshots:
totalist@3.0.1: {}
+ tough-cookie@5.1.2:
+ dependencies:
+ tldts: 6.1.86
+
tr46@1.0.1:
dependencies:
punycode: 2.3.1
+ tr46@5.1.1:
+ dependencies:
+ punycode: 2.3.1
+
tree-kill@1.2.2: {}
trim-lines@3.0.1: {}
trough@2.2.0: {}
- ts-api-utils@1.4.3(typescript@5.6.3):
- dependencies:
- typescript: 5.6.3
-
- ts-api-utils@2.0.0(typescript@5.6.3):
- dependencies:
- typescript: 5.6.3
-
ts-dedent@2.2.0: {}
ts-interface-checker@0.1.13: {}
- ts-pattern@5.6.0: {}
-
tsconfig-paths@4.2.0:
dependencies:
json5: 2.2.3
@@ -18254,7 +19253,7 @@ snapshots:
tslib@2.8.1: {}
- tsup@8.3.5(jiti@2.4.1)(postcss@8.4.49)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1):
+ tsup@8.3.5(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1):
dependencies:
bundle-require: 5.0.0(esbuild@0.24.0)
cac: 6.7.14
@@ -18264,7 +19263,7 @@ snapshots:
esbuild: 0.24.0
joycon: 3.1.1
picocolors: 1.1.1
- postcss-load-config: 6.0.1(jiti@2.4.1)(postcss@8.4.49)(tsx@4.19.2)(yaml@2.6.1)
+ postcss-load-config: 6.0.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(yaml@2.6.1)
resolve-from: 5.0.0
rollup: 4.28.0
source-map: 0.8.0-beta.0
@@ -18273,7 +19272,35 @@ snapshots:
tinyglobby: 0.2.10
tree-kill: 1.2.2
optionalDependencies:
- postcss: 8.4.49
+ postcss: 8.5.9
+ typescript: 5.6.3
+ transitivePeerDependencies:
+ - jiti
+ - supports-color
+ - tsx
+ - yaml
+
+ tsup@8.5.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(typescript@5.6.3)(yaml@2.6.1):
+ dependencies:
+ bundle-require: 5.1.0(esbuild@0.27.7)
+ cac: 6.7.14
+ chokidar: 4.0.3
+ consola: 3.4.2
+ debug: 4.4.0
+ esbuild: 0.27.7
+ fix-dts-default-cjs-exports: 1.0.1
+ joycon: 3.1.1
+ picocolors: 1.1.1
+ postcss-load-config: 6.0.1(jiti@2.4.1)(postcss@8.5.9)(tsx@4.19.2)(yaml@2.6.1)
+ resolve-from: 5.0.0
+ rollup: 4.60.1
+ source-map: 0.7.6
+ sucrase: 3.35.0
+ tinyexec: 0.3.2
+ tinyglobby: 0.2.16
+ tree-kill: 1.2.2
+ optionalDependencies:
+ postcss: 8.5.9
typescript: 5.6.3
transitivePeerDependencies:
- jiti
@@ -18293,6 +19320,9 @@ snapshots:
type-check@0.4.0:
dependencies:
prelude-ls: 1.2.1
+ optional: true
+
+ type-detect@4.1.0: {}
type-fest@0.21.3: {}
@@ -18305,61 +19335,13 @@ snapshots:
media-typer: 0.3.0
mime-types: 2.1.35
- typed-array-buffer@1.0.3:
- dependencies:
- call-bound: 1.0.3
- es-errors: 1.3.0
- is-typed-array: 1.1.15
-
- typed-array-byte-length@1.0.3:
- dependencies:
- call-bind: 1.0.8
- for-each: 0.3.3
- gopd: 1.2.0
- has-proto: 1.2.0
- is-typed-array: 1.1.15
-
- typed-array-byte-offset@1.0.4:
- dependencies:
- available-typed-arrays: 1.0.7
- call-bind: 1.0.8
- for-each: 0.3.3
- gopd: 1.2.0
- has-proto: 1.2.0
- is-typed-array: 1.1.15
- reflect.getprototypeof: 1.0.10
-
- typed-array-length@1.0.7:
- dependencies:
- call-bind: 1.0.8
- for-each: 0.3.3
- gopd: 1.2.0
- is-typed-array: 1.1.15
- possible-typed-array-names: 1.0.0
- reflect.getprototypeof: 1.0.10
-
typedarray-to-buffer@3.1.5:
dependencies:
is-typedarray: 1.0.0
- typescript-eslint@8.22.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3):
- dependencies:
- '@typescript-eslint/eslint-plugin': 8.22.0(@typescript-eslint/parser@8.22.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3))(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)
- '@typescript-eslint/parser': 8.22.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)
- '@typescript-eslint/utils': 8.22.0(eslint@9.20.0(jiti@2.4.1))(typescript@5.6.3)
- eslint: 9.20.0(jiti@2.4.1)
- typescript: 5.6.3
- transitivePeerDependencies:
- - supports-color
-
typescript@5.6.3: {}
- unbox-primitive@1.1.0:
- dependencies:
- call-bound: 1.0.3
- has-bigints: 1.1.0
- has-symbols: 1.1.0
- which-boxed-primitive: 1.1.1
+ ufo@1.6.3: {}
undici-types@6.20.0: {}
@@ -18457,14 +19439,14 @@ snapshots:
dependencies:
punycode: 2.3.1
- url-loader@4.1.1(file-loader@6.2.0(webpack@5.97.1(esbuild@0.24.0)))(webpack@5.97.1(esbuild@0.24.0)):
+ url-loader@4.1.1(file-loader@6.2.0(webpack@5.97.1(esbuild@0.27.7)))(webpack@5.97.1(esbuild@0.27.7)):
dependencies:
loader-utils: 2.0.4
mime-types: 2.1.35
schema-utils: 3.3.0
- webpack: 5.97.1(esbuild@0.24.0)
+ webpack: 5.97.1(esbuild@0.27.7)
optionalDependencies:
- file-loader: 6.2.0(webpack@5.97.1(esbuild@0.24.0))
+ file-loader: 6.2.0(webpack@5.97.1(esbuild@0.27.7))
util-deprecate@1.0.2: {}
@@ -18505,13 +19487,31 @@ snapshots:
'@types/unist': 3.0.3
vfile-message: 4.0.2
- vite-node@2.1.8(@types/node@22.10.1)(terser@5.37.0):
+ vite-node@1.6.1(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0):
+ dependencies:
+ cac: 6.7.14
+ debug: 4.4.0
+ pathe: 1.1.2
+ picocolors: 1.1.1
+ vite: 5.4.11(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0)
+ transitivePeerDependencies:
+ - '@types/node'
+ - less
+ - lightningcss
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
+
+ vite-node@2.1.8(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0):
dependencies:
cac: 6.7.14
debug: 4.4.0
es-module-lexer: 1.5.4
pathe: 1.1.2
- vite: 5.4.11(@types/node@22.10.1)(terser@5.37.0)
+ vite: 5.4.11(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0)
transitivePeerDependencies:
- '@types/node'
- less
@@ -18523,7 +19523,28 @@ snapshots:
- supports-color
- terser
- vite@5.4.11(@types/node@22.10.1)(terser@5.37.0):
+ vite-node@6.0.0(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1):
+ dependencies:
+ cac: 7.0.0
+ es-module-lexer: 2.0.0
+ obug: 2.1.1
+ pathe: 2.0.3
+ vite: 8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1)
+ transitivePeerDependencies:
+ - '@types/node'
+ - '@vitejs/devtools'
+ - esbuild
+ - jiti
+ - less
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - terser
+ - tsx
+ - yaml
+
+ vite@5.4.11(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0):
dependencies:
esbuild: 0.21.5
postcss: 8.4.49
@@ -18531,12 +19552,65 @@ snapshots:
optionalDependencies:
'@types/node': 22.10.1
fsevents: 2.3.3
+ lightningcss: 1.32.0
+ terser: 5.37.0
+
+ vite@8.0.8(@types/node@22.10.1)(esbuild@0.27.7)(jiti@2.4.1)(terser@5.37.0)(tsx@4.19.2)(yaml@2.6.1):
+ dependencies:
+ lightningcss: 1.32.0
+ picomatch: 4.0.4
+ postcss: 8.5.9
+ rolldown: 1.0.0-rc.15
+ tinyglobby: 0.2.16
+ optionalDependencies:
+ '@types/node': 22.10.1
+ esbuild: 0.27.7
+ fsevents: 2.3.3
+ jiti: 2.4.1
terser: 5.37.0
+ tsx: 4.19.2
+ yaml: 2.6.1
+
+ vitest@1.6.1(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0):
+ dependencies:
+ '@vitest/expect': 1.6.1
+ '@vitest/runner': 1.6.1
+ '@vitest/snapshot': 1.6.1
+ '@vitest/spy': 1.6.1
+ '@vitest/utils': 1.6.1
+ acorn-walk: 8.3.4
+ chai: 4.5.0
+ debug: 4.4.0
+ execa: 8.0.1
+ local-pkg: 0.5.1
+ magic-string: 0.30.14
+ pathe: 1.1.2
+ picocolors: 1.1.1
+ std-env: 3.8.0
+ strip-literal: 2.1.1
+ tinybench: 2.9.0
+ tinypool: 0.8.4
+ vite: 5.4.11(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0)
+ vite-node: 1.6.1(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0)
+ why-is-node-running: 2.3.0
+ optionalDependencies:
+ '@types/node': 22.10.1
+ happy-dom: 15.11.7
+ jsdom: 26.1.0
+ transitivePeerDependencies:
+ - less
+ - lightningcss
+ - sass
+ - sass-embedded
+ - stylus
+ - sugarss
+ - supports-color
+ - terser
- vitest@2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(terser@5.37.0):
+ vitest@2.1.8(@types/node@22.10.1)(happy-dom@15.11.7)(jsdom@26.1.0)(lightningcss@1.32.0)(terser@5.37.0):
dependencies:
'@vitest/expect': 2.1.8
- '@vitest/mocker': 2.1.8(vite@5.4.11(@types/node@22.10.1)(terser@5.37.0))
+ '@vitest/mocker': 2.1.8(vite@5.4.11(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0))
'@vitest/pretty-format': 2.1.8
'@vitest/runner': 2.1.8
'@vitest/snapshot': 2.1.8
@@ -18552,12 +19626,13 @@ snapshots:
tinyexec: 0.3.1
tinypool: 1.0.2
tinyrainbow: 1.2.0
- vite: 5.4.11(@types/node@22.10.1)(terser@5.37.0)
- vite-node: 2.1.8(@types/node@22.10.1)(terser@5.37.0)
+ vite: 5.4.11(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0)
+ vite-node: 2.1.8(@types/node@22.10.1)(lightningcss@1.32.0)(terser@5.37.0)
why-is-node-running: 2.3.0
optionalDependencies:
'@types/node': 22.10.1
happy-dom: 15.11.7
+ jsdom: 26.1.0
transitivePeerDependencies:
- less
- lightningcss
@@ -18569,6 +19644,10 @@ snapshots:
- supports-color
- terser
+ w3c-xmlserializer@5.0.0:
+ dependencies:
+ xml-name-validator: 5.0.0
+
watchpack@2.4.2:
dependencies:
glob-to-regexp: 0.4.1
@@ -18606,16 +19685,16 @@ snapshots:
- bufferutil
- utf-8-validate
- webpack-dev-middleware@5.3.4(webpack@5.97.1(esbuild@0.24.0)):
+ webpack-dev-middleware@5.3.4(webpack@5.97.1(esbuild@0.27.7)):
dependencies:
colorette: 2.0.20
memfs: 3.5.3
mime-types: 2.1.35
range-parser: 1.2.1
schema-utils: 4.3.0
- webpack: 5.97.1(esbuild@0.24.0)
+ webpack: 5.97.1(esbuild@0.27.7)
- webpack-dev-server@4.15.2(webpack@5.97.1(esbuild@0.24.0)):
+ webpack-dev-server@4.15.2(webpack@5.97.1(esbuild@0.27.7)):
dependencies:
'@types/bonjour': 3.5.13
'@types/connect-history-api-fallback': 1.5.4
@@ -18645,10 +19724,10 @@ snapshots:
serve-index: 1.9.1
sockjs: 0.3.24
spdy: 4.0.2
- webpack-dev-middleware: 5.3.4(webpack@5.97.1(esbuild@0.24.0))
+ webpack-dev-middleware: 5.3.4(webpack@5.97.1(esbuild@0.27.7))
ws: 8.18.0
optionalDependencies:
- webpack: 5.97.1(esbuild@0.24.0)
+ webpack: 5.97.1(esbuild@0.27.7)
transitivePeerDependencies:
- bufferutil
- debug
@@ -18671,7 +19750,7 @@ snapshots:
webpack-virtual-modules@0.6.2: {}
- webpack@5.97.1(esbuild@0.24.0):
+ webpack@5.97.1(esbuild@0.27.7):
dependencies:
'@types/eslint-scope': 3.7.7
'@types/estree': 1.0.6
@@ -18693,7 +19772,7 @@ snapshots:
neo-async: 2.6.2
schema-utils: 3.3.0
tapable: 2.2.1
- terser-webpack-plugin: 5.3.11(esbuild@0.24.0)(webpack@5.97.1(esbuild@0.24.0))
+ terser-webpack-plugin: 5.3.11(esbuild@0.27.7)(webpack@5.97.1(esbuild@0.27.7))
watchpack: 2.4.2
webpack-sources: 3.2.3
transitivePeerDependencies:
@@ -18701,7 +19780,7 @@ snapshots:
- esbuild
- uglify-js
- webpackbar@6.0.1(webpack@5.97.1(esbuild@0.24.0)):
+ webpackbar@6.0.1(webpack@5.97.1(esbuild@0.27.7)):
dependencies:
ansi-escapes: 4.3.2
chalk: 4.1.2
@@ -18710,7 +19789,7 @@ snapshots:
markdown-table: 2.0.0
pretty-time: 1.1.0
std-env: 3.8.0
- webpack: 5.97.1(esbuild@0.24.0)
+ webpack: 5.97.1(esbuild@0.27.7)
wrap-ansi: 7.0.0
websocket-driver@0.7.4:
@@ -18721,45 +19800,25 @@ snapshots:
websocket-extensions@0.1.4: {}
+ whatwg-encoding@3.1.1:
+ dependencies:
+ iconv-lite: 0.6.3
+
whatwg-mimetype@3.0.0: {}
+ whatwg-mimetype@4.0.0: {}
+
+ whatwg-url@14.2.0:
+ dependencies:
+ tr46: 5.1.1
+ webidl-conversions: 7.0.0
+
whatwg-url@7.1.0:
dependencies:
lodash.sortby: 4.7.0
tr46: 1.0.1
webidl-conversions: 4.0.2
- which-boxed-primitive@1.1.1:
- dependencies:
- is-bigint: 1.1.0
- is-boolean-object: 1.2.1
- is-number-object: 1.1.1
- is-string: 1.1.1
- is-symbol: 1.1.1
-
- which-builtin-type@1.2.1:
- dependencies:
- call-bound: 1.0.3
- function.prototype.name: 1.1.8
- has-tostringtag: 1.0.2
- is-async-function: 2.1.1
- is-date-object: 1.1.0
- is-finalizationregistry: 1.1.1
- is-generator-function: 1.0.10
- is-regex: 1.2.1
- is-weakref: 1.1.0
- isarray: 2.0.5
- which-boxed-primitive: 1.1.1
- which-collection: 1.0.2
- which-typed-array: 1.1.18
-
- which-collection@1.0.2:
- dependencies:
- is-map: 2.0.3
- is-set: 2.0.3
- is-weakmap: 2.0.2
- is-weakset: 2.0.4
-
which-typed-array@1.1.18:
dependencies:
available-typed-arrays: 1.0.7
@@ -18827,6 +19886,10 @@ snapshots:
dependencies:
sax: 1.4.1
+ xml-name-validator@5.0.0: {}
+
+ xmlchars@2.2.0: {}
+
y18n@5.0.8: {}
yallist@3.1.1: {}
diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml
index a7ab8883..d370007e 100644
--- a/pnpm-workspace.yaml
+++ b/pnpm-workspace.yaml
@@ -1,5 +1,4 @@
packages:
- - .templates/*
- packages/*
- www
@@ -13,12 +12,17 @@ catalog:
'@storybook/test': ^8.4.5
'@testing-library/jest-dom': ^6.6.3
'@testing-library/react': ^16.0.1
+ '@testing-library/user-event': ^14.6.1
+ '@vanilla-extract/css': ^1.14.1
+ '@vanilla-extract/esbuild-plugin': ^2.3.15
+ '@vanilla-extract/vite-plugin': ^5.0.1
'@vitest/coverage-v8': ^2.1.8
happy-dom: ^15.7.4
knip: ^5.34.1
storybook: ^8.4.7
- tsup: ^8.3.5
+ tsup: ^8.4.0
typescript: ^5.6.3
+ vite: ^5.4.11
vitest: ^2.1.8
catalogs:
diff --git a/tsconfig.json b/tsconfig.json
index cd33d286..15ca9411 100644
--- a/tsconfig.json
+++ b/tsconfig.json
@@ -11,5 +11,6 @@
"noEmit": true,
"target": "ESNext",
"verbatimModuleSyntax": true
- }
+ },
+ "exclude": ["**/dist", "**/node_modules", "**/storybook-static"]
}
diff --git a/tsup.config.ts b/tsup.config.ts
index 0518621d..fc6285a4 100644
--- a/tsup.config.ts
+++ b/tsup.config.ts
@@ -1,11 +1,10 @@
+import { vanillaExtractPlugin } from '@vanilla-extract/esbuild-plugin';
import { defineConfig } from 'tsup';
export default defineConfig({
entry: ['src/index.ts'],
clean: true,
dts: true,
+ esbuildPlugins: [vanillaExtractPlugin()],
format: ['esm', 'cjs'],
- loader: {
- '.css': 'local-css',
- },
});
diff --git a/vite.config.ts b/vite.config.ts
new file mode 100644
index 00000000..1b03dd87
--- /dev/null
+++ b/vite.config.ts
@@ -0,0 +1,6 @@
+import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin';
+import { defineConfig } from 'vite';
+
+export default defineConfig({
+ plugins: [vanillaExtractPlugin()],
+});
diff --git a/vitest.config.ts b/vitest.config.ts
index 17450c54..b47bb480 100644
--- a/vitest.config.ts
+++ b/vitest.config.ts
@@ -1,6 +1,9 @@
+import { vanillaExtractPlugin } from '@vanilla-extract/vite-plugin';
+
import { defineConfig } from 'vitest/config';
export default defineConfig({
+ plugins: [vanillaExtractPlugin()],
test: {
css: true,
environment: 'happy-dom',
@@ -9,7 +12,7 @@ export default defineConfig({
watch: false,
coverage: {
include: ['**/src'],
- exclude: ['.templates', '**/src/*.stories.tsx', '**/src/index.ts', 'www/**'],
+ exclude: ['.templates', '**/src/*.stories.tsx', '**/src/index.ts', 'www/**', 'packages/tokens'],
},
},
});
diff --git a/www/docs/components/_category_.json b/www/docs/components/_category_.json
index aa0d0dd6..c9f6fe05 100644
--- a/www/docs/components/_category_.json
+++ b/www/docs/components/_category_.json
@@ -3,6 +3,6 @@
"position": 2,
"link": {
"type": "generated-index",
- "description": "Components of the Side Design System"
+ "description": "Components of the Sipe Design System"
}
}
diff --git a/www/docs/overview/Installation.mdx b/www/docs/overview/Installation.mdx
index 1196c994..c4078edf 100644
--- a/www/docs/overview/Installation.mdx
+++ b/www/docs/overview/Installation.mdx
@@ -1,8 +1,8 @@
# Installation Guide
-To get started with the Side Design System, follow these steps. Note that Side Component packages require configuration to use the GitHub Package Registry. Please follow this guide before proceeding with the installation.
+To get started with the Sipe Design System(side), follow these steps. Note that Side Component packages require configuration to use the GitHub Package Registry. Please follow this guide before proceeding with the installation.
-if you didn't you might entercount error as below
+if you didn't, you might encounter an error as below
```
@sipe-team/side is not in the npm registry, or you have no permission to fetch it
diff --git a/www/docs/overview/_category_.json b/www/docs/overview/_category_.json
index 9a773da7..4aae0af3 100644
--- a/www/docs/overview/_category_.json
+++ b/www/docs/overview/_category_.json
@@ -3,6 +3,6 @@
"position": 1,
"link": {
"type": "generated-index",
- "description": "Overview of the Side Design System"
+ "description": "Overview of the Sipe Design System"
}
}
diff --git a/www/package.json b/www/package.json
index dd769dd6..3884895f 100644
--- a/www/package.json
+++ b/www/package.json
@@ -11,7 +11,8 @@
"serve": "docusaurus serve",
"write-translations": "docusaurus write-translations",
"write-heading-ids": "docusaurus write-heading-ids",
- "typecheck": "tsc"
+ "typecheck": "tsc",
+ "clean": "rm -rf node_modules build .docusaurus"
},
"dependencies": {
"@docusaurus/core": "3.6.3",