diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..faa0e53 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,3 @@ +[submodule "vendor/colors-helper-tools"] + path = vendor/colors-helper-tools + url = https://github.com/citron03/colors-helper-tools.git diff --git a/README.md b/README.md index af463fa..bca0297 100644 --- a/README.md +++ b/README.md @@ -8,6 +8,8 @@ - `web`: 메인 Next.js 애플리케이션입니다. - `packages`: 여러 앱에서 사용할 수 있는 공유 라이브러리, 컴포넌트 또는 유틸리티를 포함합니다. - (이 디렉토리에 새 패키지를 추가할 수 있습니다.) +- `vendor`: Git Submodule 형태의 외부 저장소를 포함합니다. + - `colors-helper-tools`: 색상 관련 유틸 함수 저장소(서브모듈)입니다. ## 주요 기술 @@ -25,6 +27,19 @@ pnpm install ``` +서브모듈까지 포함해서 처음 클론할 때는 아래 명령을 권장합니다. + +```bash +git clone --recurse-submodules +``` + +이미 클론한 레포라면 다음을 1회 실행하세요. + +```bash +git submodule init +git submodule update +``` + ### 2. 개발 `web` 애플리케이션의 개발 서버를 시작하려면 루트 디렉토리에서 다음 명령을 실행합니다. @@ -73,6 +88,32 @@ pnpm test 5. 루트에서 `pnpm install`을 실행하여 새 패키지를 연결합니다. +## Git Submodule 운영 가이드 + +현재 이 레포에는 `vendor/colors-helper-tools` 서브모듈이 연결되어 있습니다. + +```bash +git submodule status +``` + +서브모듈 최신 커밋 반영 방법: + +```bash +cd vendor/colors-helper-tools +git pull origin main +cd ../.. +git add vendor/colors-helper-tools +git commit -m "Update colors-helper-tools submodule" +``` + +현재 `.gitmodules` URL은 `https://github.com/citron03/colors-helper-tools.git` 입니다. +다른 저장소를 사용하려면 아래 명령으로 변경하세요. + +```bash +git submodule set-url vendor/colors-helper-tools +git submodule sync --recursive +``` + ## Blog / 블로그 -이 레포에서 배운 내용들을 제 블로그(https://citron031.tistory.com/) 에 정리하고 있습니다. 관심 있으시면 놀러와서 읽어주시고 피드백 남겨주세요. \ No newline at end of file +이 레포에서 배운 내용들을 제 블로그(https://citron031.tistory.com/) 에 정리하고 있습니다. 관심 있으시면 놀러와서 읽어주시고 피드백 남겨주세요. diff --git a/apps/web/app/api/submodule-colors/route.ts b/apps/web/app/api/submodule-colors/route.ts new file mode 100644 index 0000000..5cad674 --- /dev/null +++ b/apps/web/app/api/submodule-colors/route.ts @@ -0,0 +1,37 @@ +import { NextResponse } from 'next/server'; + +import { + complementaryColorHex, + darkenHex, + lightenHex, + pasteltoneHex, +} from '../../../../../vendor/colors-helper-tools/packages/colors-helper-tools/src'; + +type Action = 'pastel' | 'complementary' | 'lighten' | 'darken'; + +function isHexColor(value: string) { + return /^#[0-9a-fA-F]{6}$/.test(value); +} + +export function GET(req: Request) { + const { searchParams } = new URL(req.url); + const action = searchParams.get('action') as Action | null; + const color = searchParams.get('color') ?? '#3b82f6'; + + if (!action) { + return NextResponse.json({ error: 'action is required' }, { status: 400 }); + } + + if (action !== 'pastel' && !isHexColor(color)) { + return NextResponse.json({ error: 'color must be #RRGGBB format' }, { status: 400 }); + } + + let nextColor = color; + + if (action === 'pastel') nextColor = pasteltoneHex(); + if (action === 'complementary') nextColor = complementaryColorHex(color); + if (action === 'lighten') nextColor = lightenHex(color, 0.1); + if (action === 'darken') nextColor = darkenHex(color, 0.1); + + return NextResponse.json({ color: nextColor }); +} diff --git a/apps/web/app/page.tsx b/apps/web/app/page.tsx index c3b88a6..2de0d7e 100644 --- a/apps/web/app/page.tsx +++ b/apps/web/app/page.tsx @@ -29,6 +29,7 @@ export default function Home() { IndexDB Page React Event Wrapper Page React Activity Test Page + Submodule Colors Demo
diff --git a/apps/web/app/submodule-colors/page.tsx b/apps/web/app/submodule-colors/page.tsx new file mode 100644 index 0000000..b6661cd --- /dev/null +++ b/apps/web/app/submodule-colors/page.tsx @@ -0,0 +1,133 @@ +'use client'; + +import { useState } from 'react'; + +const DEFAULT_COLOR = '#3b82f6'; + +async function requestColor( + action: 'pastel' | 'complementary' | 'lighten' | 'darken', + color: string, +) { + const query = new URLSearchParams({ action, color }); + const res = await fetch(`/api/submodule-colors?${query.toString()}`); + + if (!res.ok) { + throw new Error(`Failed to get color: ${res.status}`); + } + + const data = (await res.json()) as { color: string }; + return data.color; +} + +export default function SubmoduleColorsPage() { + const [baseColor, setBaseColor] = useState(DEFAULT_COLOR); + const [previousColor, setPreviousColor] = useState(DEFAULT_COLOR); + const [lastAction, setLastAction] = useState('init'); + const [loading, setLoading] = useState(false); + + const runAction = async (action: 'pastel' | 'complementary' | 'lighten' | 'darken') => { + try { + setLoading(true); + setPreviousColor(baseColor); + const nextColor = await requestColor(action, baseColor); + setBaseColor(nextColor); + setLastAction(action); + } finally { + setLoading(false); + } + }; + + return ( +
+

Submodule Colors Demo

+

+ `colors-helper-tools`를 Git Submodule로 연동한 뒤, 라이브러리 함수를 실제 버튼 액션에 연결한 + 예제입니다. +

+ +
+ setBaseColor(e.target.value)} + type="color" + value={baseColor} + /> + + + + + +
+ +

+ 현재 색상: {baseColor} / 이전 색상: {previousColor} / 마지막 액션:{' '} + {lastAction} {loading ? '(계산 중)' : ''} +

+ +
+
+
+

이전 색상

+ {previousColor} +
+
+
+

현재 색상

+ {baseColor} +
+
+
+ ); +} diff --git a/apps/web/next.config.ts b/apps/web/next.config.ts index c51f972..a255efa 100644 --- a/apps/web/next.config.ts +++ b/apps/web/next.config.ts @@ -1,6 +1,5 @@ import withMdxCreate from '@next/mdx'; import { createVanillaExtractPlugin } from '@vanilla-extract/next-plugin'; -import type { NextConfig } from 'next'; const withMDX = withMdxCreate({ // Optionally provide remark and rehype plugins @@ -16,10 +15,12 @@ const withMDX = withMdxCreate({ const withVanillaExtract = createVanillaExtractPlugin(); -const nextConfig: NextConfig = { +const nextConfig = { /* config options here */ reactCompiler: true, - experimental: {}, + experimental: { + externalDir: true, + }, // useEffect 두 번 실행 방지 reactStrictMode: false, }; diff --git a/package.json b/package.json index fe32e59..3d88337 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,11 @@ "catalog:check": "node ./scripts/convert-to-catalog.mjs --dry", "catalog:apply": "node ./scripts/convert-to-catalog.mjs", + "submodule:status": "git submodule status", + "submodule:sync": "git submodule sync --recursive", + "submodule:init": "git submodule update --init --recursive", + "submodule:update": "git submodule update --init --recursive --remote", + "commit": "pnpm --filter scripts commit", "ready": "pnpm --filter scripts ready", "prepare": "husky", @@ -56,7 +61,7 @@ "@loadable/component": "*", "@mdx-js/loader": "*", "@mdx-js/react": "*", - "@next/mdx": "*", + "@next/mdx": "catalog:mdx", "@storybook/addon-essentials": "*", "@storybook/addon-interactions": "*", "@storybook/builder-vite": "*", @@ -82,7 +87,7 @@ "babel-plugin-react-compiler": "*", "chalk": "*", "eslint": "^9.39.1", - "eslint-config-next": "^16.0.3", + "eslint-config-next": "catalog:eslint", "eslint-config-prettier": "^10.1.8", "eslint-plugin-import": "^2.32.0", "eslint-plugin-prettier": "^5.5.4", @@ -96,12 +101,12 @@ "js-yaml": "^4.1.1", "jsdom": "*", "lint-staged": "^16.2.6", - "next": "*", + "next": "catalog:framework", "patch-package": "^8.0.1", "prettier": "^3.6.2", - "react": "^19.2.0", + "react": "catalog:framework", "react-color": "*", - "react-dom": "^19.2.0", + "react-dom": "catalog:framework", "storybook": "*", "stylelint": "^16.25.0", "stylelint-config-prettier": "^9.0.5", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 217d31c..53e7f67 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -181,19 +181,19 @@ importers: version: 9.39.1 '@floating-ui/react': specifier: '*' - version: 0.27.16(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 0.27.16(react-dom@19.0.0-rc.0(react@19.0.0-rc.0))(react@19.0.0-rc.0) '@loadable/component': specifier: '*' - version: 5.16.7(react@19.2.0) + version: 5.16.7(react@19.0.0-rc.0) '@mdx-js/loader': specifier: '*' version: 3.1.1(webpack@5.104.1(esbuild@0.25.12)) '@mdx-js/react': specifier: '*' - version: 3.1.1(@types/react@19.2.5)(react@19.2.0) + version: 3.1.1(@types/react@19.2.5)(react@19.0.0-rc.0) '@next/mdx': - specifier: '*' - version: 16.0.3(@mdx-js/loader@3.1.1(webpack@5.104.1(esbuild@0.25.12)))(@mdx-js/react@3.1.1(@types/react@19.2.5)(react@19.2.0)) + specifier: catalog:mdx + version: 15.5.7(@mdx-js/loader@3.1.1(webpack@5.104.1(esbuild@0.25.12)))(@mdx-js/react@3.1.1(@types/react@19.2.5)(react@19.0.0-rc.0)) '@storybook/addon-essentials': specifier: '*' version: 8.6.14(@types/react@19.2.5)(storybook@8.6.14(prettier@3.6.2)) @@ -208,16 +208,16 @@ importers: version: 8.6.14(@babel/preset-env@7.28.5(@babel/core@7.28.5))(prettier@3.6.2) '@storybook/react': specifier: '*' - version: 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.6.2)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@8.6.14(prettier@3.6.2))(typescript@5.9.3) + version: 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.6.2)))(react-dom@19.0.0-rc.0(react@19.0.0-rc.0))(react@19.0.0-rc.0)(storybook@8.6.14(prettier@3.6.2))(typescript@5.9.3) '@storybook/react-vite': specifier: '*' - version: 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.6.2)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.2)(storybook@8.6.14(prettier@3.6.2))(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) + version: 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.6.2)))(react-dom@19.0.0-rc.0(react@19.0.0-rc.0))(react@19.0.0-rc.0)(rollup@4.53.2)(storybook@8.6.14(prettier@3.6.2))(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) '@testing-library/jest-dom': specifier: '*' version: 6.9.1 '@testing-library/react': specifier: '*' - version: 16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.2.3(@types/react@19.2.5))(@types/react@19.2.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + version: 16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.2.3(@types/react@19.2.5))(@types/react@19.2.5)(react-dom@19.0.0-rc.0(react@19.0.0-rc.0))(react@19.0.0-rc.0) '@testing-library/user-event': specifier: '*' version: 14.6.1(@testing-library/dom@10.4.0) @@ -250,7 +250,7 @@ importers: version: 1.17.4 '@vanilla-extract/next-plugin': specifier: '*' - version: 2.4.14(next@16.0.3(@babel/core@7.28.5)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(webpack@5.104.1(esbuild@0.25.12)) + version: 2.4.14(next@15.5.7(@babel/core@7.28.5)(babel-plugin-react-compiler@1.0.0)(react-dom@19.0.0-rc.0(react@19.0.0-rc.0))(react@19.0.0-rc.0))(webpack@5.104.1(esbuild@0.25.12)) '@vanilla-extract/recipes': specifier: '*' version: 0.5.7(@vanilla-extract/css@1.17.4) @@ -259,7 +259,7 @@ importers: version: 5.1.1(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) '@xstate/react': specifier: '*' - version: 6.0.0(@types/react@19.2.5)(react@19.2.0)(xstate@5.24.0) + version: 6.0.0(@types/react@19.2.5)(react@19.0.0-rc.0)(xstate@5.24.0) babel-plugin-react-compiler: specifier: '*' version: 1.0.0 @@ -270,8 +270,8 @@ importers: specifier: ^9.39.1 version: 9.39.1(jiti@2.6.1) eslint-config-next: - specifier: ^16.0.3 - version: 16.0.3(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + specifier: catalog:eslint + version: 15.5.7(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint-config-prettier: specifier: ^10.1.8 version: 10.1.8(eslint@9.39.1(jiti@2.6.1)) @@ -312,8 +312,8 @@ importers: specifier: ^16.2.6 version: 16.2.6 next: - specifier: '*' - version: 16.0.3(@babel/core@7.28.5)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + specifier: catalog:framework + version: 15.5.7(@babel/core@7.28.5)(babel-plugin-react-compiler@1.0.0)(react-dom@19.0.0-rc.0(react@19.0.0-rc.0))(react@19.0.0-rc.0) patch-package: specifier: ^8.0.1 version: 8.0.1 @@ -321,14 +321,14 @@ importers: specifier: ^3.6.2 version: 3.6.2 react: - specifier: ^19.2.0 - version: 19.2.0 + specifier: catalog:framework + version: 19.0.0-rc.0 react-color: specifier: '*' - version: 2.19.3(react@19.2.0) + version: 2.19.3(react@19.0.0-rc.0) react-dom: - specifier: ^19.2.0 - version: 19.2.0(react@19.2.0) + specifier: catalog:framework + version: 19.0.0-rc.0(react@19.0.0-rc.0) storybook: specifier: '*' version: 8.6.14(prettier@3.6.2) @@ -349,7 +349,7 @@ importers: version: 5.9.3 valtio: specifier: '*' - version: 2.2.0(@types/react@19.2.5)(react@19.2.0) + version: 2.2.0(@types/react@19.2.5)(react@19.0.0-rc.0) vite: specifier: '*' version: 7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1) @@ -2461,15 +2461,9 @@ packages: '@next/env@15.5.7': resolution: {integrity: sha512-4h6Y2NyEkIEN7Z8YxkA27pq6zTkS09bUSYC0xjd0NpwFxjnIKeZEeH591o5WECSmjpUhLn3H2QLJcDye3Uzcvg==} - '@next/env@16.0.3': - resolution: {integrity: sha512-IqgtY5Vwsm14mm/nmQaRMmywCU+yyMIYfk3/MHZ2ZTJvwVbBn3usZnjMi1GacrMVzVcAxJShTCpZlPs26EdEjQ==} - '@next/eslint-plugin-next@15.5.7': resolution: {integrity: sha512-DtRU2N7BkGr8r+pExfuWHwMEPX5SD57FeA6pxdgCHODo+b/UgIgjE+rgWKtJAbEbGhVZ2jtHn4g3wNhWFoNBQQ==} - '@next/eslint-plugin-next@16.0.3': - resolution: {integrity: sha512-6sPWmZetzFWMsz7Dhuxsdmbu3fK+/AxKRtj7OB0/3OZAI2MHB/v2FeYh271LZ9abvnM1WIwWc/5umYjx0jo5sQ==} - '@next/mdx@15.5.7': resolution: {integrity: sha512-ao/NELNlLQkQMkACV0LMimE32DB5z0sqtKL6VbaruVI3LrMw6YMGhNxpSBifxKcgmMBSsIR985mh4CJiqCGcNw==} peerDependencies: @@ -2481,113 +2475,54 @@ packages: '@mdx-js/react': optional: true - '@next/mdx@16.0.3': - resolution: {integrity: sha512-uVl2JSEGAjBV+EVnpt1cZN88SK3lJ2n7Fc+iqTsgVx2g9+Y6ru+P6nuUgXd38OHPUIwzL6k2V1u4iV3kwuTySQ==} - peerDependencies: - '@mdx-js/loader': '>=0.15.0' - '@mdx-js/react': '>=0.15.0' - peerDependenciesMeta: - '@mdx-js/loader': - optional: true - '@mdx-js/react': - optional: true - '@next/swc-darwin-arm64@15.5.7': resolution: {integrity: sha512-IZwtxCEpI91HVU/rAUOOobWSZv4P2DeTtNaCdHqLcTJU4wdNXgAySvKa/qJCgR5m6KI8UsKDXtO2B31jcaw1Yw==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] - '@next/swc-darwin-arm64@16.0.3': - resolution: {integrity: sha512-MOnbd92+OByu0p6QBAzq1ahVWzF6nyfiH07dQDez4/Nku7G249NjxDVyEfVhz8WkLiOEU+KFVnqtgcsfP2nLXg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [darwin] - '@next/swc-darwin-x64@15.5.7': resolution: {integrity: sha512-UP6CaDBcqaCBuiq/gfCEJw7sPEoX1aIjZHnBWN9v9qYHQdMKvCKcAVs4OX1vIjeE+tC5EIuwDTVIoXpUes29lg==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] - '@next/swc-darwin-x64@16.0.3': - resolution: {integrity: sha512-i70C4O1VmbTivYdRlk+5lj9xRc2BlK3oUikt3yJeHT1unL4LsNtN7UiOhVanFdc7vDAgZn1tV/9mQwMkWOJvHg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [darwin] - '@next/swc-linux-arm64-gnu@15.5.7': resolution: {integrity: sha512-NCslw3GrNIw7OgmRBxHtdWFQYhexoUCq+0oS2ccjyYLtcn1SzGzeM54jpTFonIMUjNbHmpKpziXnpxhSWLcmBA==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-gnu@16.0.3': - resolution: {integrity: sha512-O88gCZ95sScwD00mn/AtalyCoykhhlokxH/wi1huFK+rmiP5LAYVs/i2ruk7xST6SuXN4NI5y4Xf5vepb2jf6A==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - '@next/swc-linux-arm64-musl@15.5.7': resolution: {integrity: sha512-nfymt+SE5cvtTrG9u1wdoxBr9bVB7mtKTcj0ltRn6gkP/2Nu1zM5ei8rwP9qKQP0Y//umK+TtkKgNtfboBxRrw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@next/swc-linux-arm64-musl@16.0.3': - resolution: {integrity: sha512-CEErFt78S/zYXzFIiv18iQCbRbLgBluS8z1TNDQoyPi8/Jr5qhR3e8XHAIxVxPBjDbEMITprqELVc5KTfFj0gg==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [linux] - '@next/swc-linux-x64-gnu@15.5.7': resolution: {integrity: sha512-hvXcZvCaaEbCZcVzcY7E1uXN9xWZfFvkNHwbe/n4OkRhFWrs1J1QV+4U1BN06tXLdaS4DazEGXwgqnu/VMcmqw==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-gnu@16.0.3': - resolution: {integrity: sha512-Tc3i+nwt6mQ+Dwzcri/WNDj56iWdycGVh5YwwklleClzPzz7UpfaMw1ci7bLl6GRYMXhWDBfe707EXNjKtiswQ==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - '@next/swc-linux-x64-musl@15.5.7': resolution: {integrity: sha512-4IUO539b8FmF0odY6/SqANJdgwn1xs1GkPO5doZugwZ3ETF6JUdckk7RGmsfSf7ws8Qb2YB5It33mvNL/0acqA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - '@next/swc-linux-x64-musl@16.0.3': - resolution: {integrity: sha512-zTh03Z/5PBBPdTurgEtr6nY0vI9KR9Ifp/jZCcHlODzwVOEKcKRBtQIGrkc7izFgOMuXDEJBmirwpGqdM/ZixA==} - engines: {node: '>= 10'} - cpu: [x64] - os: [linux] - '@next/swc-win32-arm64-msvc@15.5.7': resolution: {integrity: sha512-CpJVTkYI3ZajQkC5vajM7/ApKJUOlm6uP4BknM3XKvJ7VXAvCqSjSLmM0LKdYzn6nBJVSjdclx8nYJSa3xlTgQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] - '@next/swc-win32-arm64-msvc@16.0.3': - resolution: {integrity: sha512-Jc1EHxtZovcJcg5zU43X3tuqzl/sS+CmLgjRP28ZT4vk869Ncm2NoF8qSTaL99gh6uOzgM99Shct06pSO6kA6g==} - engines: {node: '>= 10'} - cpu: [arm64] - os: [win32] - '@next/swc-win32-x64-msvc@15.5.7': resolution: {integrity: sha512-gMzgBX164I6DN+9/PGA+9dQiwmTkE4TloBNx8Kv9UiGARsr9Nba7IpcBRA1iTV9vwlYnrE3Uy6I7Aj6qLjQuqw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] - '@next/swc-win32-x64-msvc@16.0.3': - resolution: {integrity: sha512-N7EJ6zbxgIYpI/sWNzpVKRMbfEGgsWuOIvzkML7wxAAZhPk1Msxuo/JDu1PKjWGrAoOLaZcIX5s+/pF5LIbBBg==} - engines: {node: '>= 10'} - cpu: [x64] - os: [win32] - '@noble/hashes@1.4.0': resolution: {integrity: sha512-V1JJ1WTRUqHHrOSh597hURcMqVKVGL/ea3kv0gSnEdsEZ0/+VyPghM1lMNGc00z7CIQorSvbKpuJkxvuHbvdbg==} engines: {node: '>= 16'} @@ -5250,15 +5185,6 @@ packages: typescript: optional: true - eslint-config-next@16.0.3: - resolution: {integrity: sha512-5F6qDjcZldf0Y0ZbqvWvap9xzYUxyDf7/of37aeyhvkrQokj/4bT1JYWZdlWUr283aeVa+s52mPq9ogmGg+5dw==} - peerDependencies: - eslint: '>=9.0.0' - typescript: '>=3.3.1' - peerDependenciesMeta: - typescript: - optional: true - eslint-config-prettier@10.1.8: resolution: {integrity: sha512-82GZUjRS0p/jganf6q1rEO25VSoHH0hKPCTrgillPjdI/3bgBhAE1QzHrHTizjpRvy6pGAvKjDJtk2pF9NDq8w==} hasBin: true @@ -5785,10 +5711,6 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@16.4.0: - resolution: {integrity: sha512-ob/2LcVVaVGCYN+r14cnwnoDPUufjiYgSqRhiFD0Q1iI4Odora5RE8Iv1D24hAz5oMophRGkGz+yuvQmmUMnMw==} - engines: {node: '>=18'} - globals@16.5.0: resolution: {integrity: sha512-c/c15i26VrJ4IRt5Z89DnIzCGDn9EcebibhAOjw5ibqEHsE1wLUgkPn9RDmNcUKyU87GeaL633nyJ+pplFR2ZQ==} engines: {node: '>=18'} @@ -6935,28 +6857,6 @@ packages: sass: optional: true - next@16.0.3: - resolution: {integrity: sha512-Ka0/iNBblPFcIubTA1Jjh6gvwqfjrGq1Y2MTI5lbjeLIAfmC+p5bQmojpRZqgHHVu5cG4+qdIiwXiBSm/8lZ3w==} - engines: {node: '>=20.9.0'} - deprecated: This version has a security vulnerability. Please upgrade to a patched version. See https://nextjs.org/blog/CVE-2025-66478 for more details. - hasBin: true - peerDependencies: - '@opentelemetry/api': ^1.1.0 - '@playwright/test': ^1.51.1 - babel-plugin-react-compiler: '*' - react: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - react-dom: ^18.2.0 || 19.0.0-rc-de68d2f4-20241204 || ^19.0.0 - sass: ^1.3.0 - peerDependenciesMeta: - '@opentelemetry/api': - optional: true - '@playwright/test': - optional: true - babel-plugin-react-compiler: - optional: true - sass: - optional: true - nf3@0.3.6: resolution: {integrity: sha512-/XRUUILTAyuy1XunyVQuqGp8aEmZ2TfRTn8Rji+FA4xqv20qzL4jV7Reqbuey2XucKgPeRVcEYGScmJM0UnB6Q==} @@ -8341,13 +8241,6 @@ packages: resolution: {integrity: sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==} engines: {node: '>= 0.4'} - typescript-eslint@8.46.4: - resolution: {integrity: sha512-KALyxkpYV5Ix7UhvjTwJXZv76VWsHG+NjNlt/z+a17SOQSiOcBdUXdbJdyXi7RPxrBFECtFOiPwUJQusJuCqrg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - eslint: ^8.57.0 || ^9.0.0 - typescript: '>=4.8.4 <6.0.0' - typescript@5.4.5: resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} engines: {node: '>=14.17'} @@ -10363,12 +10256,6 @@ snapshots: react: 19.0.0-rc.0 react-dom: 19.0.0-rc.0(react@19.0.0-rc.0) - '@floating-ui/react-dom@2.1.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': - dependencies: - '@floating-ui/dom': 1.7.4 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - '@floating-ui/react@0.27.16(react-dom@19.0.0-rc.0(react@19.0.0-rc.0))(react@19.0.0-rc.0)': dependencies: '@floating-ui/react-dom': 2.1.6(react-dom@19.0.0-rc.0(react@19.0.0-rc.0))(react@19.0.0-rc.0) @@ -10377,14 +10264,6 @@ snapshots: react-dom: 19.0.0-rc.0(react@19.0.0-rc.0) tabbable: 6.3.0 - '@floating-ui/react@0.27.16(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': - dependencies: - '@floating-ui/react-dom': 2.1.6(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - '@floating-ui/utils': 0.2.10 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - tabbable: 6.3.0 - '@floating-ui/utils@0.2.10': {} '@humanfs/core@0.19.1': {} @@ -10402,10 +10281,6 @@ snapshots: dependencies: react: 19.0.0-rc.0 - '@icons/material@0.2.4(react@19.2.0)': - dependencies: - react: 19.2.0 - '@img/colour@1.0.0': optional: true @@ -10827,13 +10702,6 @@ snapshots: react: 19.0.0-rc.0 react-is: 16.13.1 - '@loadable/component@5.16.7(react@19.2.0)': - dependencies: - '@babel/runtime': 7.28.4 - hoist-non-react-statics: 3.3.2 - react: 19.2.0 - react-is: 16.13.1 - '@locator/babel-jsx@0.5.1(@babel/core@7.28.5)(tsx@4.21.0)(yaml@2.8.1)': dependencies: '@babel/parser': 7.28.5 @@ -10919,6 +10787,12 @@ snapshots: '@types/react': 19.0.7 react: 19.0.0-rc.0 + '@mdx-js/react@3.1.1(@types/react@19.2.5)(react@19.0.0-rc.0)': + dependencies: + '@types/mdx': 2.0.13 + '@types/react': 19.2.5 + react: 19.0.0-rc.0 + '@mdx-js/react@3.1.1(@types/react@19.2.5)(react@19.2.0)': dependencies: '@types/mdx': 2.0.13 @@ -10941,16 +10815,10 @@ snapshots: '@next/env@15.5.7': {} - '@next/env@16.0.3': {} - '@next/eslint-plugin-next@15.5.7': dependencies: fast-glob: 3.3.1 - '@next/eslint-plugin-next@16.0.3': - dependencies: - fast-glob: 3.3.1 - '@next/mdx@15.5.7(@mdx-js/loader@3.1.0(webpack@5.104.1(esbuild@0.25.12)))(@mdx-js/react@3.1.0(@types/react@19.0.7)(react@19.0.0-rc.0))': dependencies: source-map: 0.7.6 @@ -10958,61 +10826,37 @@ snapshots: '@mdx-js/loader': 3.1.0(webpack@5.104.1(esbuild@0.25.12)) '@mdx-js/react': 3.1.0(@types/react@19.0.7)(react@19.0.0-rc.0) - '@next/mdx@16.0.3(@mdx-js/loader@3.1.1(webpack@5.104.1(esbuild@0.25.12)))(@mdx-js/react@3.1.1(@types/react@19.2.5)(react@19.2.0))': + '@next/mdx@15.5.7(@mdx-js/loader@3.1.1(webpack@5.104.1(esbuild@0.25.12)))(@mdx-js/react@3.1.1(@types/react@19.2.5)(react@19.0.0-rc.0))': dependencies: source-map: 0.7.6 optionalDependencies: '@mdx-js/loader': 3.1.1(webpack@5.104.1(esbuild@0.25.12)) - '@mdx-js/react': 3.1.1(@types/react@19.2.5)(react@19.2.0) + '@mdx-js/react': 3.1.1(@types/react@19.2.5)(react@19.0.0-rc.0) '@next/swc-darwin-arm64@15.5.7': optional: true - '@next/swc-darwin-arm64@16.0.3': - optional: true - '@next/swc-darwin-x64@15.5.7': optional: true - '@next/swc-darwin-x64@16.0.3': - optional: true - '@next/swc-linux-arm64-gnu@15.5.7': optional: true - '@next/swc-linux-arm64-gnu@16.0.3': - optional: true - '@next/swc-linux-arm64-musl@15.5.7': optional: true - '@next/swc-linux-arm64-musl@16.0.3': - optional: true - '@next/swc-linux-x64-gnu@15.5.7': optional: true - '@next/swc-linux-x64-gnu@16.0.3': - optional: true - '@next/swc-linux-x64-musl@15.5.7': optional: true - '@next/swc-linux-x64-musl@16.0.3': - optional: true - '@next/swc-win32-arm64-msvc@15.5.7': optional: true - '@next/swc-win32-arm64-msvc@16.0.3': - optional: true - '@next/swc-win32-x64-msvc@15.5.7': optional: true - '@next/swc-win32-x64-msvc@16.0.3': - optional: true - '@noble/hashes@1.4.0': {} '@nodelib/fs.scandir@2.1.5': @@ -11648,17 +11492,17 @@ snapshots: - supports-color - typescript - '@storybook/react-vite@8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.6.2)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(rollup@4.53.2)(storybook@8.6.14(prettier@3.6.2))(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))': + '@storybook/react-vite@8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.6.2)))(react-dom@19.0.0-rc.0(react@19.0.0-rc.0))(react@19.0.0-rc.0)(rollup@4.53.2)(storybook@8.6.14(prettier@3.6.2))(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1))': dependencies: '@joshwooding/vite-plugin-react-docgen-typescript': 0.5.0(typescript@5.9.3)(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) '@rollup/pluginutils': 5.3.0(rollup@4.53.2) '@storybook/builder-vite': 8.6.14(storybook@8.6.14(prettier@3.6.2))(vite@7.2.2(@types/node@24.10.1)(jiti@2.6.1)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)) - '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.6.2)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@8.6.14(prettier@3.6.2))(typescript@5.9.3) + '@storybook/react': 8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.6.2)))(react-dom@19.0.0-rc.0(react@19.0.0-rc.0))(react@19.0.0-rc.0)(storybook@8.6.14(prettier@3.6.2))(typescript@5.9.3) find-up: 5.0.0 magic-string: 0.30.21 - react: 19.2.0 + react: 19.0.0-rc.0 react-docgen: 7.1.1 - react-dom: 19.2.0(react@19.2.0) + react-dom: 19.0.0-rc.0(react@19.0.0-rc.0) resolve: 1.22.11 storybook: 8.6.14(prettier@3.6.2) tsconfig-paths: 4.2.0 @@ -11685,16 +11529,16 @@ snapshots: '@storybook/test': 8.6.14(storybook@8.6.14(prettier@3.6.2)) typescript: 5.4.5 - '@storybook/react@8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.6.2)))(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@8.6.14(prettier@3.6.2))(typescript@5.9.3)': + '@storybook/react@8.6.14(@storybook/test@8.6.14(storybook@8.6.14(prettier@3.6.2)))(react-dom@19.0.0-rc.0(react@19.0.0-rc.0))(react@19.0.0-rc.0)(storybook@8.6.14(prettier@3.6.2))(typescript@5.9.3)': dependencies: '@storybook/components': 8.6.14(storybook@8.6.14(prettier@3.6.2)) '@storybook/global': 5.0.0 '@storybook/manager-api': 8.6.14(storybook@8.6.14(prettier@3.6.2)) '@storybook/preview-api': 8.6.14(storybook@8.6.14(prettier@3.6.2)) - '@storybook/react-dom-shim': 8.6.14(react-dom@19.2.0(react@19.2.0))(react@19.2.0)(storybook@8.6.14(prettier@3.6.2)) + '@storybook/react-dom-shim': 8.6.14(react-dom@19.0.0-rc.0(react@19.0.0-rc.0))(react@19.0.0-rc.0)(storybook@8.6.14(prettier@3.6.2)) '@storybook/theming': 8.6.14(storybook@8.6.14(prettier@3.6.2)) - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) + react: 19.0.0-rc.0 + react-dom: 19.0.0-rc.0(react@19.0.0-rc.0) storybook: 8.6.14(prettier@3.6.2) optionalDependencies: '@storybook/test': 8.6.14(storybook@8.6.14(prettier@3.6.2)) @@ -12166,6 +12010,16 @@ snapshots: '@types/react': 19.0.7 '@types/react-dom': 19.0.3(@types/react@19.0.7) + '@testing-library/react@16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.2.3(@types/react@19.2.5))(@types/react@19.2.5)(react-dom@19.0.0-rc.0(react@19.0.0-rc.0))(react@19.0.0-rc.0)': + dependencies: + '@babel/runtime': 7.28.4 + '@testing-library/dom': 10.4.0 + react: 19.0.0-rc.0 + react-dom: 19.0.0-rc.0(react@19.0.0-rc.0) + optionalDependencies: + '@types/react': 19.2.5 + '@types/react-dom': 19.2.3(@types/react@19.2.5) + '@testing-library/react@16.3.0(@testing-library/dom@10.4.0)(@types/react-dom@19.2.3(@types/react@19.2.5))(@types/react@19.2.5)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': dependencies: '@babel/runtime': 7.28.4 @@ -12813,15 +12667,6 @@ snapshots: - supports-color - webpack - '@vanilla-extract/next-plugin@2.4.14(next@16.0.3(@babel/core@7.28.5)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0))(webpack@5.104.1(esbuild@0.25.12))': - dependencies: - '@vanilla-extract/webpack-plugin': 2.3.22(webpack@5.104.1(esbuild@0.25.12)) - next: 16.0.3(@babel/core@7.28.5)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) - transitivePeerDependencies: - - babel-plugin-macros - - supports-color - - webpack - '@vanilla-extract/private@1.0.9': {} '@vanilla-extract/recipes@0.5.7(@vanilla-extract/css@1.15.1)': @@ -13126,11 +12971,11 @@ snapshots: transitivePeerDependencies: - '@types/react' - '@xstate/react@6.0.0(@types/react@19.2.5)(react@19.2.0)(xstate@5.24.0)': + '@xstate/react@6.0.0(@types/react@19.2.5)(react@19.0.0-rc.0)(xstate@5.24.0)': dependencies: - react: 19.2.0 - use-isomorphic-layout-effect: 1.2.1(@types/react@19.2.5)(react@19.2.0) - use-sync-external-store: 1.6.0(react@19.2.0) + react: 19.0.0-rc.0 + use-isomorphic-layout-effect: 1.2.1(@types/react@19.2.5)(react@19.0.0-rc.0) + use-sync-external-store: 1.6.0(react@19.0.0-rc.0) optionalDependencies: xstate: 5.24.0 transitivePeerDependencies: @@ -14267,22 +14112,22 @@ snapshots: - eslint-plugin-import-x - supports-color - eslint-config-next@16.0.3(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): + eslint-config-next@15.5.7(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): dependencies: - '@next/eslint-plugin-next': 16.0.3 + '@next/eslint-plugin-next': 15.5.7 + '@rushstack/eslint-patch': 1.15.0 + '@typescript-eslint/eslint-plugin': 8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + '@typescript-eslint/parser': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) eslint: 9.39.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.32.0)(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-import: 2.32.0(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.39.1(jiti@2.6.1)) eslint-plugin-react: 7.37.5(eslint@9.39.1(jiti@2.6.1)) - eslint-plugin-react-hooks: 7.0.1(eslint@9.39.1(jiti@2.6.1)) - globals: 16.4.0 - typescript-eslint: 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) + eslint-plugin-react-hooks: 5.2.0(eslint@9.39.1(jiti@2.6.1)) optionalDependencies: typescript: 5.9.3 transitivePeerDependencies: - - '@typescript-eslint/parser' - eslint-import-resolver-webpack - eslint-plugin-import-x - supports-color @@ -14563,6 +14408,10 @@ snapshots: dependencies: eslint: 9.34.0(jiti@2.6.1) + eslint-plugin-react-hooks@5.2.0(eslint@9.39.1(jiti@2.6.1)): + dependencies: + eslint: 9.39.1(jiti@2.6.1) + eslint-plugin-react-hooks@7.0.0(eslint@9.34.0(jiti@2.6.1)): dependencies: '@babel/core': 7.28.5 @@ -15156,8 +15005,6 @@ snapshots: globals@14.0.0: {} - globals@16.4.0: {} - globals@16.5.0: {} globalthis@1.0.4: @@ -16506,30 +16353,6 @@ snapshots: - '@babel/core' - babel-plugin-macros - next@16.0.3(@babel/core@7.28.5)(babel-plugin-react-compiler@1.0.0)(react-dom@19.2.0(react@19.2.0))(react@19.2.0): - dependencies: - '@next/env': 16.0.3 - '@swc/helpers': 0.5.15 - caniuse-lite: 1.0.30001754 - postcss: 8.4.31 - react: 19.2.0 - react-dom: 19.2.0(react@19.2.0) - styled-jsx: 5.1.6(@babel/core@7.28.5)(react@19.2.0) - optionalDependencies: - '@next/swc-darwin-arm64': 16.0.3 - '@next/swc-darwin-x64': 16.0.3 - '@next/swc-linux-arm64-gnu': 16.0.3 - '@next/swc-linux-arm64-musl': 16.0.3 - '@next/swc-linux-x64-gnu': 16.0.3 - '@next/swc-linux-x64-musl': 16.0.3 - '@next/swc-win32-arm64-msvc': 16.0.3 - '@next/swc-win32-x64-msvc': 16.0.3 - babel-plugin-react-compiler: 1.0.0 - sharp: 0.34.5 - transitivePeerDependencies: - - '@babel/core' - - babel-plugin-macros - nf3@0.3.6: {} nitro@3.0.1-alpha.2(chokidar@4.0.3)(lru-cache@11.2.2)(rollup@4.53.2)(vite@7.2.2(@types/node@22.19.2)(jiti@1.21.7)(lightningcss@1.30.2)(terser@5.44.1)(tsx@4.21.0)(yaml@2.8.1)): @@ -17093,17 +16916,6 @@ snapshots: reactcss: 1.2.3(react@19.0.0-rc.0) tinycolor2: 1.6.0 - react-color@2.19.3(react@19.2.0): - dependencies: - '@icons/material': 0.2.4(react@19.2.0) - lodash: 4.17.21 - lodash-es: 4.17.21 - material-colors: 1.2.6 - prop-types: 15.8.1 - react: 19.2.0 - reactcss: 1.2.3(react@19.2.0) - tinycolor2: 1.6.0 - react-docgen-typescript@2.4.0(typescript@5.4.5): dependencies: typescript: 5.4.5 @@ -17152,11 +16964,6 @@ snapshots: lodash: 4.17.21 react: 19.0.0-rc.0 - reactcss@1.2.3(react@19.2.0): - dependencies: - lodash: 4.17.21 - react: 19.2.0 - read-cache@1.0.0: dependencies: pify: 2.3.0 @@ -17842,13 +17649,6 @@ snapshots: optionalDependencies: '@babel/core': 7.28.5 - styled-jsx@5.1.6(@babel/core@7.28.5)(react@19.2.0): - dependencies: - client-only: 0.0.1 - react: 19.2.0 - optionalDependencies: - '@babel/core': 7.28.5 - stylelint-config-prettier@9.0.5(stylelint@16.25.0(typescript@5.9.3)): dependencies: stylelint: 16.25.0(typescript@5.9.3) @@ -18223,17 +18023,6 @@ snapshots: possible-typed-array-names: 1.1.0 reflect.getprototypeof: 1.0.10 - typescript-eslint@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3): - dependencies: - '@typescript-eslint/eslint-plugin': 8.46.4(@typescript-eslint/parser@8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3))(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/parser': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - '@typescript-eslint/typescript-estree': 8.46.4(typescript@5.9.3) - '@typescript-eslint/utils': 8.46.4(eslint@9.39.1(jiti@2.6.1))(typescript@5.9.3) - eslint: 9.39.1(jiti@2.6.1) - typescript: 5.9.3 - transitivePeerDependencies: - - supports-color - typescript@5.4.5: {} typescript@5.9.3: {} @@ -18389,9 +18178,9 @@ snapshots: optionalDependencies: '@types/react': 19.0.7 - use-isomorphic-layout-effect@1.2.1(@types/react@19.2.5)(react@19.2.0): + use-isomorphic-layout-effect@1.2.1(@types/react@19.2.5)(react@19.0.0-rc.0): dependencies: - react: 19.2.0 + react: 19.0.0-rc.0 optionalDependencies: '@types/react': 19.2.5 @@ -18426,12 +18215,12 @@ snapshots: '@types/react': 19.0.7 react: 19.0.0-rc.0 - valtio@2.2.0(@types/react@19.2.5)(react@19.2.0): + valtio@2.2.0(@types/react@19.2.5)(react@19.0.0-rc.0): dependencies: proxy-compare: 3.0.1 optionalDependencies: '@types/react': 19.2.5 - react: 19.2.0 + react: 19.0.0-rc.0 vary@1.1.2: {} diff --git a/vendor/colors-helper-tools b/vendor/colors-helper-tools new file mode 160000 index 0000000..3e46f2e --- /dev/null +++ b/vendor/colors-helper-tools @@ -0,0 +1 @@ +Subproject commit 3e46f2e2cca203662a92e432b1089c3c711129d6