chore: import new ui system (#73)

* chore: import new ui system

* chore: modified padding and rounded

* chore: remove vertical padding

* chore: add shadow

* chore: add shadcn popover (#76)

* chore: add circle progress (#77)

* chore: add input (#78)

* feat: add shadcn toast (#80)

* chore: initial import

* chore: style

* chore: important

* chore: add dropdown menu (#81)

* feat: add shadcn tooltip (#79)

* chore: initial import

* chore: style

* chore: fix text size

* chore: add tooltip shortcut

* chore: code cleanup and add flex col

* chore: add avatar (#82)

* chore: add dialog (#83)

---------

Co-authored-by: Richard Shiue <71320345+richardshiue@users.noreply.github.com>
This commit is contained in:
Kilu.He
2025-04-02 15:29:42 +08:00
committed by GitHub
parent 0f281d1587
commit 15ec240887
36 changed files with 5599 additions and 151 deletions

21
components.json Normal file
View File

@@ -0,0 +1,21 @@
{
"$schema": "https://ui.shadcn.com/schema.json",
"style": "new-york",
"rsc": false,
"tsx": true,
"tailwind": {
"config": "",
"css": "src/styles/global.css",
"baseColor": "neutral",
"cssVariables": true,
"prefix": ""
},
"aliases": {
"components": "@/components",
"utils": "@/lib/utils",
"ui": "@/components/ui",
"lib": "@/lib",
"hooks": "@/hooks"
},
"iconLibrary": "lucide"
}

View File

@@ -15,7 +15,8 @@
"test:components": "cypress run --component --browser chrome --headless",
"test:unit": "jest --coverage",
"test:cy": "cypress run",
"coverage": "pnpm run test:unit && pnpm run test:components"
"coverage": "pnpm run test:unit && pnpm run test:components",
"generate-tokens": "node scripts/system-token/convert-tokens.cjs"
},
"dependencies": {
"@appflowyinc/ai-chat": "0.1.25",
@@ -30,11 +31,21 @@
"@mui/icons-material": "^5.11.11",
"@mui/material": "6.0.0-alpha.2",
"@mui/x-date-pickers-pro": "^6.18.2",
"@radix-ui/react-avatar": "^1.1.3",
"@radix-ui/react-dialog": "^1.1.6",
"@radix-ui/react-dropdown-menu": "^2.1.6",
"@radix-ui/react-label": "^2.1.2",
"@radix-ui/react-popover": "^1.1.6",
"@radix-ui/react-separator": "^1.1.2",
"@radix-ui/react-slot": "^1.1.2",
"@radix-ui/react-tooltip": "^1.1.8",
"@reduxjs/toolkit": "2.0.0",
"@slate-yjs/core": "^1.0.2",
"@types/react-swipeable-views": "^0.13.4",
"async-retry": "^1.3.3",
"axios": "^1.6.8",
"class-variance-authority": "^0.7.1",
"clsx": "^2.1.1",
"colorthief": "^2.4.0",
"dayjs": "^1.11.9",
"decimal.js": "^10.4.3",
@@ -59,8 +70,10 @@
"katex": "^0.16.7",
"lightgallery": "^2.7.2",
"lodash-es": "^4.17.21",
"lucide-react": "^0.485.0",
"mermaid": "^11.4.1",
"nanoid": "^4.0.0",
"next-themes": "^0.4.6",
"notistack": "^3.0.1",
"numeral": "^2.0.6",
"prismjs": "^1.29.0",
@@ -100,7 +113,10 @@
"slate-history": "^0.100.0",
"slate-react": "^0.101.3",
"smooth-scroll-into-view-if-needed": "^2.0.2",
"sonner": "^2.0.3",
"tailwind-merge": "^3.0.2",
"ts-results": "^3.3.0",
"tw-animate-css": "^1.2.5",
"unified": "^11.0.5",
"unist": "^0.0.1",
"unsplash-js": "^7.0.19",

253
pnpm-lock.yaml generated
View File

@@ -37,6 +37,30 @@ dependencies:
'@mui/x-date-pickers-pro':
specifier: ^6.18.2
version: 6.20.0(@emotion/react@11.11.4)(@emotion/styled@11.11.5)(@mui/material@6.0.0-alpha.2)(@mui/system@5.15.15)(@types/react@18.2.66)(dayjs@1.11.9)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-avatar':
specifier: ^1.1.3
version: 1.1.3(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-dialog':
specifier: ^1.1.6
version: 1.1.6(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-dropdown-menu':
specifier: ^2.1.6
version: 2.1.6(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-label':
specifier: ^2.1.2
version: 2.1.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-popover':
specifier: ^1.1.6
version: 1.1.6(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-separator':
specifier: ^1.1.2
version: 1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-slot':
specifier: ^1.1.2
version: 1.1.2(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-tooltip':
specifier: ^1.1.8
version: 1.1.8(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@reduxjs/toolkit':
specifier: 2.0.0
version: 2.0.0(react-redux@8.1.3)(react@18.2.0)
@@ -52,6 +76,12 @@ dependencies:
axios:
specifier: ^1.6.8
version: 1.7.2
class-variance-authority:
specifier: ^0.7.1
version: 0.7.1
clsx:
specifier: ^2.1.1
version: 2.1.1
colorthief:
specifier: ^2.4.0
version: 2.4.0
@@ -124,12 +154,18 @@ dependencies:
lodash-es:
specifier: ^4.17.21
version: 4.17.21
lucide-react:
specifier: ^0.485.0
version: 0.485.0(react@18.2.0)
mermaid:
specifier: ^11.4.1
version: 11.4.1
nanoid:
specifier: ^4.0.0
version: 4.0.2
next-themes:
specifier: ^0.4.6
version: 0.4.6(react-dom@18.2.0)(react@18.2.0)
notistack:
specifier: ^3.0.1
version: 3.0.1(csstype@3.1.3)(react-dom@18.2.0)(react@18.2.0)
@@ -247,9 +283,18 @@ dependencies:
smooth-scroll-into-view-if-needed:
specifier: ^2.0.2
version: 2.0.2
sonner:
specifier: ^2.0.3
version: 2.0.3(react-dom@18.2.0)(react@18.2.0)
tailwind-merge:
specifier: ^3.0.2
version: 3.0.2
ts-results:
specifier: ^3.3.0
version: 3.3.0
tw-animate-css:
specifier: ^1.2.5
version: 1.2.5
unified:
specifier: ^11.0.5
version: 11.0.5
@@ -551,15 +596,15 @@ packages:
'@jest/globals': 29.7.0
'@radix-ui/react-avatar': 1.1.3(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-dialog': 1.1.6(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-label': 2.1.1(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-popover': 1.1.4(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-label': 2.1.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-popover': 1.1.6(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-radio-group': 1.2.3(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-select': 2.1.4(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-separator': 1.1.1(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-separator': 1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-slot': 1.1.2(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-switch': 1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-toast': 1.2.6(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-tooltip': 1.1.6(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-tooltip': 1.1.8(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
axios: 1.7.2
class-variance-authority: 0.7.1
clsx: 2.1.1
@@ -601,13 +646,13 @@ packages:
slate-history: ^0.110.3
slate-react: ^0.112.0
dependencies:
'@radix-ui/react-label': 2.1.1(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-popover': 1.1.4(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-label': 2.1.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-popover': 1.1.6(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-select': 2.1.4(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-separator': 1.1.1(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-separator': 1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-slot': 1.1.2(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-switch': 1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-tooltip': 1.1.6(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-tooltip': 1.1.8(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
class-variance-authority: 0.7.1
clsx: 2.1.1
i18next: 22.5.1
@@ -3964,6 +4009,26 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
/@radix-ui/react-arrow@1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-G+KcpzXHq24iH0uGG/pF8LyzpFJYGD4RfLjCIBfGdSLXvjLHST31RUiRVrupIBMvIppMgSzQ6l66iAxl03tdlg==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
optional: true
'@types/react-dom':
optional: true
dependencies:
'@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@types/react': 18.2.66
'@types/react-dom': 18.2.22
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
/@radix-ui/react-avatar@1.1.3(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-Paen00T4P8L8gd9bNsRMw7Cbaz85oxiv+hzomsRZgFm2byltPFDtfcoqlWJ8GyZlIBWgLssJlzLCnKU0G0302g==}
peerDependencies:
@@ -4153,6 +4218,32 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
/@radix-ui/react-dropdown-menu@2.1.6(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-no3X7V5fD487wab/ZYSHXq3H37u4NVeLDKI/Ks724X/eEFSSEFYZxWgsIlr1UBeEyDaM29HM5x9p1Nv8DuTYPA==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
optional: true
'@types/react-dom':
optional: true
dependencies:
'@radix-ui/primitive': 1.1.1
'@radix-ui/react-compose-refs': 1.1.1(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-context': 1.1.1(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-id': 1.1.0(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-menu': 2.1.6(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.66)(react@18.2.0)
'@types/react': 18.2.66
'@types/react-dom': 18.2.22
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
/@radix-ui/react-focus-guards@1.1.1(@types/react@18.2.66)(react@18.2.0):
resolution: {integrity: sha512-pSIwfrT1a6sIoDASCSpFwOasEwKTZWDw/iBdtnqKO7v6FeOzYJ7U53cPzYFVR3geGGXgVHaH+CdngrrAzqUGxg==}
peerDependencies:
@@ -4224,8 +4315,8 @@ packages:
react: 18.2.0
dev: false
/@radix-ui/react-label@2.1.1(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-UUw5E4e/2+4kFMH7+YxORXGWggtY6sM8WIwh5RZchhLuUg2H1hc98Py+pr8HMz6rdaYrK2t296ZEjYLOCO5uUw==}
/@radix-ui/react-label@2.1.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-zo1uGMTaNlHehDyFQcDZXRJhUPDuukcnHz0/jnrup0JA6qL+AFpAnty+7VKa9esuU5xTblAZzTGYJKSKaBxBhw==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -4237,15 +4328,52 @@ packages:
'@types/react-dom':
optional: true
dependencies:
'@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@types/react': 18.2.66
'@types/react-dom': 18.2.22
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
/@radix-ui/react-popover@1.1.4(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-aUACAkXx8LaFymDma+HQVji7WhvEhpFJ7+qPz17Nf4lLZqtreGOFRiNQWQmhzp7kEWg9cOyyQJpdIMUMPc/CPw==}
/@radix-ui/react-menu@2.1.6(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-tBBb5CXDJW3t2mo9WlO7r6GTmWV0F0uzHZVFmlRmYpiSK1CDU5IKojP1pm7oknpBOrFZx/YgBRW9oorPO2S/Lg==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
optional: true
'@types/react-dom':
optional: true
dependencies:
'@radix-ui/primitive': 1.1.1
'@radix-ui/react-collection': 1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-compose-refs': 1.1.1(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-context': 1.1.1(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-direction': 1.1.0(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-focus-guards': 1.1.1(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-id': 1.1.0(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-popper': 1.2.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-portal': 1.1.4(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-presence': 1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-roving-focus': 1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-slot': 1.1.2(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.66)(react@18.2.0)
'@types/react': 18.2.66
'@types/react-dom': 18.2.22
aria-hidden: 1.2.4
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
react-remove-scroll: 2.6.3(@types/react@18.2.66)(react@18.2.0)
dev: false
/@radix-ui/react-popover@1.1.6(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-NQouW0x4/GnkFJ/pRqsIS3rM/k97VzKnVb2jB7Gq7VEGPy5g7uNV1ykySFt7eWSp3i2uSGFwaJcvIRJBAHmmFg==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -4260,15 +4388,15 @@ packages:
'@radix-ui/primitive': 1.1.1
'@radix-ui/react-compose-refs': 1.1.1(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-context': 1.1.1(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-focus-guards': 1.1.1(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-focus-scope': 1.1.1(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-focus-scope': 1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-id': 1.1.0(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-popper': 1.2.1(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-portal': 1.1.3(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-popper': 1.2.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-portal': 1.1.4(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-presence': 1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-slot': 1.1.1(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-slot': 1.1.2(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.66)(react@18.2.0)
'@types/react': 18.2.66
'@types/react-dom': 18.2.22
@@ -4307,6 +4435,35 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
/@radix-ui/react-popper@1.2.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-Rvqc3nOpwseCyj/rgjlJDYAgyfw7OC1tTkKn2ivhaMGcYt8FSBlahHOZak2i3QwkRXUXgGgzeEe2RuqeEHuHgA==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
react: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
react-dom: ^16.8 || ^17.0 || ^18.0 || ^19.0 || ^19.0.0-rc
peerDependenciesMeta:
'@types/react':
optional: true
'@types/react-dom':
optional: true
dependencies:
'@floating-ui/react-dom': 2.1.2(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-arrow': 1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-compose-refs': 1.1.1(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-context': 1.1.1(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-use-callback-ref': 1.1.0(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-use-layout-effect': 1.1.0(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-use-rect': 1.1.0(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-use-size': 1.1.0(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/rect': 1.1.0
'@types/react': 18.2.66
'@types/react-dom': 18.2.22
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
/@radix-ui/react-portal@1.1.3(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-NciRqhXnGojhT93RPyDaMPfLH3ZSl4jjIFbZQ1b/vxvZEdHsBZ49wP9w8L3HzUQwep01LcWtkUvm0OVB5JAHTw==}
peerDependencies:
@@ -4507,8 +4664,8 @@ packages:
react-remove-scroll: 2.6.3(@types/react@18.2.66)(react@18.2.0)
dev: false
/@radix-ui/react-separator@1.1.1(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-RRiNRSrD8iUiXriq/Y5n4/3iE8HzqgLHsusUSg5jVpU2+3tqcUFPJXHDymwEypunc2sWxDUS3UC+rkZRlHedsw==}
/@radix-ui/react-separator@1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-oZfHcaAp2Y6KFBX6I5P1u7CQoy4lheCGiYj+pGFrHy8E/VNRb5E39TkTr3JrV520csPBTZjkuKFdEsjS5EUNKQ==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -4520,7 +4677,7 @@ packages:
'@types/react-dom':
optional: true
dependencies:
'@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@types/react': 18.2.66
'@types/react-dom': 18.2.22
react: 18.2.0
@@ -4612,8 +4769,8 @@ packages:
react-dom: 18.2.0(react@18.2.0)
dev: false
/@radix-ui/react-tooltip@1.1.6(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-TLB5D8QLExS1uDn7+wH/bjEmRurNMTzNrtq7IjaS4kjion9NtzsTGkvR5+i7yc9q01Pi2KMM2cN3f8UG4IvvXA==}
/@radix-ui/react-tooltip@1.1.8(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-YAA2cu48EkJZdAMHC0dqo9kialOcRStbtiY4nJPaht7Ptrhcvpo+eDChaM6BIs8kL6a8Z5l5poiqLnXcNduOkA==}
peerDependencies:
'@types/react': '*'
'@types/react-dom': '*'
@@ -4628,15 +4785,15 @@ packages:
'@radix-ui/primitive': 1.1.1
'@radix-ui/react-compose-refs': 1.1.1(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-context': 1.1.1(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-dismissable-layer': 1.1.3(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-dismissable-layer': 1.1.5(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-id': 1.1.0(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-popper': 1.2.1(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-portal': 1.1.3(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-popper': 1.2.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-portal': 1.1.4(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-presence': 1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-primitive': 2.0.1(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-slot': 1.1.1(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-primitive': 2.0.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-slot': 1.1.2(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-use-controllable-state': 1.1.0(@types/react@18.2.66)(react@18.2.0)
'@radix-ui/react-visually-hidden': 1.1.1(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@radix-ui/react-visually-hidden': 1.1.2(@types/react-dom@18.2.22)(@types/react@18.2.66)(react-dom@18.2.0)(react@18.2.0)
'@types/react': 18.2.66
'@types/react-dom': 18.2.22
react: 18.2.0
@@ -10815,6 +10972,14 @@ packages:
react: 18.2.0
dev: false
/lucide-react@0.485.0(react@18.2.0):
resolution: {integrity: sha512-NvyQJ0LKyyCxL23nPKESlr/jmz8r7fJO1bkuptSNYSy0s8VVj4ojhX0YAgmE1e0ewfxUZjIlZpvH+otfTnla8Q==}
peerDependencies:
react: ^16.5.1 || ^17.0.0 || ^18.0.0 || ^19.0.0
dependencies:
react: 18.2.0
dev: false
/luxon@3.4.4:
resolution: {integrity: sha512-zobTr7akeGHnv7eBOXcRgMeCP6+uyYsczwmeRCauvpvaAltgNyTbLH/+VaEAPUeWBT+1GuNmz4wC/6jtQzbbVA==}
engines: {node: '>=12'}
@@ -11471,6 +11636,16 @@ packages:
resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==}
dev: true
/next-themes@0.4.6(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-pZvgD5L0IEvX5/9GWyHMf3m8BKiVQwsCMHfoFosXtXBMnaS0ZnIJ9ST4b4NqLVKDEm8QBxoNNGNaBv2JNF6XNA==}
peerDependencies:
react: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
react-dom: ^16.8 || ^17 || ^18 || ^19 || ^19.0.0-rc
dependencies:
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
/nice-try@1.0.5:
resolution: {integrity: sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==}
dev: true
@@ -13674,6 +13849,16 @@ packages:
atomic-sleep: 1.0.0
dev: true
/sonner@2.0.3(react-dom@18.2.0)(react@18.2.0):
resolution: {integrity: sha512-njQ4Hht92m0sMqqHVDL32V2Oun9W1+PHO9NDv9FHfJjT3JT22IG4Jpo3FPQy+mouRKCXFWO+r67v6MrHX2zeIA==}
peerDependencies:
react: ^18.0.0 || ^19.0.0 || ^19.0.0-rc
react-dom: ^18.0.0 || ^19.0.0 || ^19.0.0-rc
dependencies:
react: 18.2.0
react-dom: 18.2.0(react@18.2.0)
dev: false
/source-map-js@1.2.0:
resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==}
engines: {node: '>=0.10.0'}
@@ -14004,6 +14189,10 @@ packages:
resolution: {integrity: sha512-0LXunzzAZzo0tEPxV3I297ffKZPlKDrjj7NXphC8V5ak9yHC5zRmxnOe2m/Rd/7ivsOMJe3JZ2JVocoDdQTRBA==}
dev: false
/tailwind-merge@3.0.2:
resolution: {integrity: sha512-l7z+OYZ7mu3DTqrL88RiKrKIqO3NcpEO8V/Od04bNpvk0kiIFndGEoqfuzvj4yuhRkHKjRkII2z+KS2HfPcSxw==}
dev: false
/tailwindcss-animate@1.0.7(tailwindcss@3.4.17):
resolution: {integrity: sha512-bl6mpH3T7I3UFxuvDEXLxy/VuFxBk5bbzplh7tXI68mwMokNYd1t9qPBHlnyTwfa4JGC4zP516I1hYYtQ/vspA==}
peerDependencies:
@@ -14420,6 +14609,10 @@ packages:
dependencies:
safe-buffer: 5.1.2
/tw-animate-css@1.2.5:
resolution: {integrity: sha512-ABzjfgVo+fDbhRREGL4KQZUqqdPgvc5zVrLyeW9/6mVqvaDepXc7EvedA+pYmMnIOsUAQMwcWzNvom26J2qYvQ==}
dev: false
/tweetnacl@0.14.5:
resolution: {integrity: sha512-KXXFFdAbFXY4geFIwoyNK+f5Z1b7swfXABfL7HXCmoIWMKU3dmS26672A4EeQtDzLKy7SXmfBu51JolvEKwtGA==}

View File

@@ -0,0 +1,269 @@
const fs = require('fs');
const path = require('path');
// Ensure target directory exists
function ensureDirectoryExists (dirPath) {
if (!fs.existsSync(dirPath)) {
fs.mkdirSync(dirPath, { recursive: true });
console.log(`Created directory: ${dirPath}`);
}
}
// Read JSON file
function readJsonFile (filePath) {
try {
const data = fs.readFileSync(filePath, 'utf8');
return JSON.parse(data);
} catch (error) {
console.error(`Error reading file ${filePath}:`, error);
process.exit(1);
}
}
// Resolve reference values
function resolveReferences (tokens, primitiveTokens) {
const resolvedTokens = JSON.parse(JSON.stringify(tokens));
function resolveValue (value, visitedRefs = new Set()) {
if (typeof value !== 'string' || !value.startsWith('{') || !value.endsWith('}')) {
return value;
}
const reference = value.slice(1, -1);
if (visitedRefs.has(reference)) {
console.warn(`Circular reference detected: ${reference}`);
return value;
}
visitedRefs.add(reference);
// Split reference path
const parts = reference.split('.');
let current;
// First look in primitive tokens
if (primitiveTokens) {
current = primitiveTokens;
for (const part of parts) {
if (current && current[part]) {
current = current[part];
} else {
current = null;
break;
}
}
}
// If not found in primitives, look in current tokens
if (!current) {
current = resolvedTokens;
for (const part of parts) {
if (current && current[part]) {
current = current[part];
} else {
console.warn(`Reference not found: ${reference}`);
return value;
}
}
}
if (current && current.$value) {
return resolveValue(current.$value, visitedRefs);
}
return current;
}
function processObject (obj) {
for (const key in obj) {
if (typeof obj[key] === 'object' && obj[key] !== null) {
processObject(obj[key]);
} else if (key === '$value') {
obj.$value = resolveValue(obj.$value);
}
}
}
processObject(resolvedTokens);
return resolvedTokens;
}
// Convert to CSS variables
function convertToCssVariables (tokens, prefix = '', isDarkTheme = false, sourceFile) {
let variableNames = []; // Store all generated variable names
// Create CSS file header with warning comments
let css = `/**
* Design system ${isDarkTheme ? 'dark' : 'light'} theme variables
* AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY
*
* Generated from: ${sourceFile}
* Generated time: ${new Date().toISOString()}
*
* To modify these values, edit the source JSON files and run the token conversion script:
* node scripts/system-token/convert-tokens.cjs
*/
`;
// Select root selector based on theme
const rootSelector = isDarkTheme ? ':root[data-dark-mode=true]' : ':root';
function processTokens (obj, path = '') {
for (const key in obj) {
const newPath = path ? `${path}-${key}` : key;
// If object but not a value object (i.e., doesn't have $value)
if (typeof obj[key] === 'object' && obj[key] !== null && !obj[key].$value) {
processTokens(obj[key], newPath);
}
// If it's a value object (has $value)
else if (typeof obj[key] === 'object' && obj[key] !== null && obj[key].$value) {
const token = obj[key];
const variableName = `--${prefix}${newPath.toLowerCase().replace(/_/g, '-')}`;
let value = token.$value;
// Add to variable names list
variableNames.push(variableName.substring(2)); // Remove leading --
// Format value based on type
if (token.$type === 'dimension') {
// Keep dimension values as is, they already include units like px
css += ` ${variableName}: ${value};\n`;
} else if (token.$type === 'color') {
css += ` ${variableName}: ${value};\n`;
} else {
css += ` ${variableName}: ${value};\n`;
}
}
}
}
css += `${rootSelector} {\n`;
processTokens(tokens);
css += '}\n';
return { css, variableNames };
}
// Generate Tailwind color config from CSS variable names
function createTailwindColorsFromVariables (variableNames) {
const colors = {};
// Group by prefix
variableNames.forEach(varName => {
const parts = varName.split('-');
const mainCategory = parts[0];
// Handle main category
if (!colors[mainCategory]) {
colors[mainCategory] = {};
}
// Generate key without main category
const subKey = parts.slice(1).join('-');
// Use 'DEFAULT' if empty
const finalKey = subKey || 'DEFAULT';
// Set CSS variable reference
colors[mainCategory][finalKey] = `var(--${varName})`;
});
// Fix special categories to match Tailwind conventions
delete colors['spacing'];
delete colors['border-radius'];
delete colors['shadow'];
// Generate CommonJS module code
const tailwindCode = `/**
* TailwindCSS color configuration
* AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY
*
* This file is auto-generated by convert-tokens.cjs script
* Generation time: ${new Date().toISOString()}
*
* To modify these colors, edit the source JSON files and run the token conversion script:
* node scripts/system-token/convert-tokens.cjs
*
* These colors reference CSS variables, ensure the corresponding CSS files are loaded
*/
module.exports = ${JSON.stringify(colors, null, 2)};
`;
return tailwindCode;
}
// Main function
function convertDesignTokens (primitiveFilePath, semanticFilePath, outputFilePath, isDarkTheme = false) {
// Read files
const primitiveTokens = readJsonFile(primitiveFilePath);
const semanticTokens = readJsonFile(semanticFilePath);
// Resolve references
const resolvedTokens = resolveReferences(semanticTokens, primitiveTokens);
// Convert to CSS with source file information
const { css, variableNames } = convertToCssVariables(
resolvedTokens,
'',
isDarkTheme,
path.basename(semanticFilePath),
);
// Ensure output directory exists
const outputDir = path.dirname(outputFilePath);
ensureDirectoryExists(outputDir);
// Write file
fs.writeFileSync(outputFilePath, css, 'utf8');
console.log(`CSS variables written to ${outputFilePath}`);
return { variableNames };
}
// Define project root directory
const projectRoot = path.resolve(__dirname, '../..'); // Go up two levels from scripts/system-token to project root
// Define input and output paths
const inputDir = path.join(__dirname); // Current script directory
const cssOutputDir = path.join(projectRoot, 'src/styles/variables');
const tailwindOutputDir = path.join(projectRoot, 'tailwind');
// Ensure output directories exist
ensureDirectoryExists(cssOutputDir);
ensureDirectoryExists(tailwindOutputDir);
// Execute conversion
console.log('Converting design tokens to CSS variables...');
// Collect all variable names
let allVariableNames = [];
// Convert light theme (default theme)
const lightResult = convertDesignTokens(
path.join(inputDir, 'primitive.json'),
path.join(inputDir, 'semantic.light.json'),
path.join(cssOutputDir, 'semantic.light.css'),
false, // Light theme
);
allVariableNames = allVariableNames.concat(lightResult.variableNames);
// Convert dark theme (using data-dark-mode attribute)
const darkResult = convertDesignTokens(
path.join(inputDir, 'primitive.json'),
path.join(inputDir, 'semantic.dark.json'),
path.join(cssOutputDir, 'semantic.dark.css'),
true, // Dark theme
);
// Dark theme variables are the same as light theme, no need to merge
// Generate Tailwind color configuration
console.log('Generating Tailwind color configuration with CSS variable references...');
const tailwindColors = createTailwindColorsFromVariables(allVariableNames);
fs.writeFileSync(path.join(tailwindOutputDir, 'new-colors.cjs'), tailwindColors);
console.log(`Tailwind colors written to ${path.join(tailwindOutputDir, 'new-colors.cjs')}`);
console.log('Conversion completed successfully!');

View File

@@ -0,0 +1,984 @@
{
"Neutral": {
"100": {
"$type": "color",
"$value": "#f8faff"
},
"200": {
"$type": "color",
"$value": "#e4e8f5"
},
"300": {
"$type": "color",
"$value": "#ced3e6"
},
"400": {
"$type": "color",
"$value": "#b5bbd3"
},
"500": {
"$type": "color",
"$value": "#989eb7"
},
"600": {
"$type": "color",
"$value": "#6f748c"
},
"700": {
"$type": "color",
"$value": "#54596e"
},
"800": {
"$type": "color",
"$value": "#3c3f4e"
},
"900": {
"$type": "color",
"$value": "#272930"
},
"1000": {
"$type": "color",
"$value": "#21232a"
},
"black": {
"$type": "color",
"$value": "#000000"
},
"alpha-black-60": {
"$type": "color",
"$value": "#00000099"
},
"white": {
"$type": "color",
"$value": "#ffffff"
},
"alpha-white-0": {
"$type": "color",
"$value": "#ffffff00"
},
"alpha-white-20": {
"$type": "color",
"$value": "#ffffff33"
},
"alpha-white-30": {
"$type": "color",
"$value": "#ffffff4d"
},
"alpha-grey-100-05": {
"$type": "color",
"$value": "#f9fafd0d"
},
"alpha-grey-100-10": {
"$type": "color",
"$value": "#f9fafd1a"
},
"alpha-grey-1000-05": {
"$type": "color",
"$value": "#1f23290d"
},
"alpha-grey-1000-10": {
"$type": "color",
"$value": "#1f23291a"
},
"alpha-grey-1000-70": {
"$type": "color",
"$value": "#1f2329b2"
},
"alpha-grey-1000-80": {
"$type": "color",
"$value": "#1f2329cc"
}
},
"Blue": {
"100": {
"$type": "color",
"$value": "#e3f6ff"
},
"200": {
"$type": "color",
"$value": "#a9e2ff"
},
"300": {
"$type": "color",
"$value": "#80d2ff"
},
"400": {
"$type": "color",
"$value": "#4ec1ff"
},
"500": {
"$type": "color",
"$value": "#00b5ff"
},
"600": {
"$type": "color",
"$value": "#0092d6"
},
"700": {
"$type": "color",
"$value": "#0078c0"
},
"800": {
"$type": "color",
"$value": "#0065a9"
},
"900": {
"$type": "color",
"$value": "#00508f"
},
"1000": {
"$type": "color",
"$value": "#003c77"
},
"alpha-blue-500-15": {
"$type": "color",
"$value": "#00b5ff26"
}
},
"Green": {
"100": {
"$type": "color",
"$value": "#ecf9f5"
},
"200": {
"$type": "color",
"$value": "#c3e5d8"
},
"300": {
"$type": "color",
"$value": "#9ad1bc"
},
"400": {
"$type": "color",
"$value": "#71bd9f"
},
"500": {
"$type": "color",
"$value": "#48a982"
},
"600": {
"$type": "color",
"$value": "#248569"
},
"700": {
"$type": "color",
"$value": "#29725d"
},
"800": {
"$type": "color",
"$value": "#2e6050"
},
"900": {
"$type": "color",
"$value": "#305548"
},
"1000": {
"$type": "color",
"$value": "#305244"
}
},
"Purple": {
"100": {
"$type": "color",
"$value": "#f1e0ff"
},
"200": {
"$type": "color",
"$value": "#e1b3ff"
},
"300": {
"$type": "color",
"$value": "#d185ff"
},
"400": {
"$type": "color",
"$value": "#bc58ff"
},
"500": {
"$type": "color",
"$value": "#9327ff"
},
"600": {
"$type": "color",
"$value": "#7a1dcc"
},
"700": {
"$type": "color",
"$value": "#6617b3"
},
"800": {
"$type": "color",
"$value": "#55138f"
},
"900": {
"$type": "color",
"$value": "#470c72"
},
"1000": {
"$type": "color",
"$value": "#380758"
}
},
"Magenta": {
"100": {
"$type": "color",
"$value": "#ffe5ef"
},
"200": {
"$type": "color",
"$value": "#ffb8d1"
},
"300": {
"$type": "color",
"$value": "#ff8ab2"
},
"400": {
"$type": "color",
"$value": "#ff5c93"
},
"500": {
"$type": "color",
"$value": "#fb006d"
},
"600": {
"$type": "color",
"$value": "#d2005f"
},
"700": {
"$type": "color",
"$value": "#d2005f"
},
"800": {
"$type": "color",
"$value": "#850040"
},
"900": {
"$type": "color",
"$value": "#610031"
},
"1000": {
"$type": "color",
"$value": "#400022"
}
},
"Red": {
"100": {
"$type": "color",
"$value": "#ffd2dd"
},
"200": {
"$type": "color",
"$value": "#ffa5b4"
},
"300": {
"$type": "color",
"$value": "#ff7d87"
},
"400": {
"$type": "color",
"$value": "#ff5050"
},
"500": {
"$type": "color",
"$value": "#f33641"
},
"600": {
"$type": "color",
"$value": "#e71d32"
},
"700": {
"$type": "color",
"$value": "#ad1625"
},
"800": {
"$type": "color",
"$value": "#8c101c"
},
"900": {
"$type": "color",
"$value": "#6e0a1e"
},
"1000": {
"$type": "color",
"$value": "#4c0a17"
},
"alpha-red-500-10": {
"$type": "color",
"$value": "#f336411a"
}
},
"Orange": {
"100": {
"$type": "color",
"$value": "#fff3d5"
},
"200": {
"$type": "color",
"$value": "#ffe4ab"
},
"300": {
"$type": "color",
"$value": "#ffd181"
},
"400": {
"$type": "color",
"$value": "#ffbe62"
},
"500": {
"$type": "color",
"$value": "#ffa02e"
},
"600": {
"$type": "color",
"$value": "#db7e21"
},
"700": {
"$type": "color",
"$value": "#b75f17"
},
"800": {
"$type": "color",
"$value": "#93450e"
},
"900": {
"$type": "color",
"$value": "#7a3108"
},
"1000": {
"$type": "color",
"$value": "#602706"
}
},
"Yellow": {
"100": {
"$type": "color",
"$value": "#fff9b2"
},
"200": {
"$type": "color",
"$value": "#ffec66"
},
"300": {
"$type": "color",
"$value": "#ffdf1a"
},
"400": {
"$type": "color",
"$value": "#ffcc00"
},
"500": {
"$type": "color",
"$value": "#ffce00"
},
"600": {
"$type": "color",
"$value": "#e6b800"
},
"700": {
"$type": "color",
"$value": "#cc9f00"
},
"800": {
"$type": "color",
"$value": "#b38a00"
},
"900": {
"$type": "color",
"$value": "#9a7500"
},
"1000": {
"$type": "color",
"$value": "#7f6200"
}
},
"Subtle_Color": {
"Rose": {
"100": {
"$type": "color",
"$value": "#fcf2f2"
},
"200": {
"$type": "color",
"$value": "#fae3e3"
},
"300": {
"$type": "color",
"$value": "#fad9d9"
},
"400": {
"$type": "color",
"$value": "#edadad"
},
"500": {
"$type": "color",
"$value": "#cc4e4e"
},
"600": {
"$type": "color",
"$value": "#702828"
}
},
"Papaya": {
"100": {
"$type": "color",
"$value": "#fcf4f0"
},
"200": {
"$type": "color",
"$value": "#fae8de"
},
"300": {
"$type": "color",
"$value": "#fadfd2"
},
"400": {
"$type": "color",
"$value": "#f0bda3"
},
"500": {
"$type": "color",
"$value": "#d67240"
},
"600": {
"$type": "color",
"$value": "#6b3215"
}
},
"Tangerine": {
"100": {
"$type": "color",
"$value": "#fff7ed"
},
"200": {
"$type": "color",
"$value": "#fcedd9"
},
"300": {
"$type": "color",
"$value": "#fae5ca"
},
"400": {
"$type": "color",
"$value": "#f2cb99"
},
"500": {
"$type": "color",
"$value": "#db8f2c"
},
"600": {
"$type": "color",
"$value": "#613b0a"
}
},
"Mango": {
"100": {
"$type": "color",
"$value": "#fff9ec"
},
"200": {
"$type": "color",
"$value": "#fcf1d7"
},
"300": {
"$type": "color",
"$value": "#fae9c3"
},
"400": {
"$type": "color",
"$value": "#f5d68e"
},
"500": {
"$type": "color",
"$value": "#e0a416"
},
"600": {
"$type": "color",
"$value": "#5c4102"
}
},
"Lemon": {
"100": {
"$type": "color",
"$value": "#fffbe8"
},
"200": {
"$type": "color",
"$value": "#fcf5cf"
},
"300": {
"$type": "color",
"$value": "#faefb9"
},
"400": {
"$type": "color",
"$value": "#f5e282"
},
"500": {
"$type": "color",
"$value": "#e0bb00"
},
"600": {
"$type": "color",
"$value": "#574800"
}
},
"Olive": {
"100": {
"$type": "color",
"$value": "#f9fae6"
},
"200": {
"$type": "color",
"$value": "#f6f7d0"
},
"300": {
"$type": "color",
"$value": "#f0f2b3"
},
"400": {
"$type": "color",
"$value": "#dbde83"
},
"500": {
"$type": "color",
"$value": "#adb204"
},
"600": {
"$type": "color",
"$value": "#4a4c03"
}
},
"Lime": {
"100": {
"$type": "color",
"$value": "#f6f9e6"
},
"200": {
"$type": "color",
"$value": "#eef5ce"
},
"300": {
"$type": "color",
"$value": "#e7f0bb"
},
"400": {
"$type": "color",
"$value": "#cfdb91"
},
"500": {
"$type": "color",
"$value": "#92a822"
},
"600": {
"$type": "color",
"$value": "#414d05"
}
},
"Grass": {
"100": {
"$type": "color",
"$value": "#f4faeb"
},
"200": {
"$type": "color",
"$value": "#e9f5d7"
},
"300": {
"$type": "color",
"$value": "#def0c5"
},
"400": {
"$type": "color",
"$value": "#bfd998"
},
"500": {
"$type": "color",
"$value": "#75a828"
},
"600": {
"$type": "color",
"$value": "#334d0c"
}
},
"Forest": {
"100": {
"$type": "color",
"$value": "#f1faf0"
},
"200": {
"$type": "color",
"$value": "#e2f5df"
},
"300": {
"$type": "color",
"$value": "#d7f0d3"
},
"400": {
"$type": "color",
"$value": "#a8d6a1"
},
"500": {
"$type": "color",
"$value": "#49a33b"
},
"600": {
"$type": "color",
"$value": "#1e4f16"
}
},
"Jade": {
"100": {
"$type": "color",
"$value": "#f0faf6"
},
"200": {
"$type": "color",
"$value": "#dff5eb"
},
"300": {
"$type": "color",
"$value": "#cef0e1"
},
"400": {
"$type": "color",
"$value": "#90d1b5"
},
"500": {
"$type": "color",
"$value": "#1c9963"
},
"600": {
"$type": "color",
"$value": "#075231"
}
},
"Aqua": {
"100": {
"$type": "color",
"$value": "#f0f9fa"
},
"200": {
"$type": "color",
"$value": "#dff3f5"
},
"300": {
"$type": "color",
"$value": "#ccecf0"
},
"400": {
"$type": "color",
"$value": "#83ccd4"
},
"500": {
"$type": "color",
"$value": "#008e9e"
},
"600": {
"$type": "color",
"$value": "#004e57"
}
},
"Azure": {
"100": {
"$type": "color",
"$value": "#f0f6fa"
},
"200": {
"$type": "color",
"$value": "#e1eef7"
},
"300": {
"$type": "color",
"$value": "#d3e6f5"
},
"400": {
"$type": "color",
"$value": "#88c0eb"
},
"500": {
"$type": "color",
"$value": "#0877cc"
},
"600": {
"$type": "color",
"$value": "#154469"
}
},
"Denim": {
"100": {
"$type": "color",
"$value": "#f0f3fa"
},
"200": {
"$type": "color",
"$value": "#e3ebfa"
},
"300": {
"$type": "color",
"$value": "#d7e2f7"
},
"400": {
"$type": "color",
"$value": "#9ab6ed"
},
"500": {
"$type": "color",
"$value": "#3267d1"
},
"600": {
"$type": "color",
"$value": "#223c70"
}
},
"Mauve": {
"100": {
"$type": "color",
"$value": "#f2f2fc"
},
"200": {
"$type": "color",
"$value": "#e6e6fa"
},
"300": {
"$type": "color",
"$value": "#dcdcf7"
},
"400": {
"$type": "color",
"$value": "#aeaef5"
},
"500": {
"$type": "color",
"$value": "#5555e0"
},
"600": {
"$type": "color",
"$value": "#36366b"
}
},
"Lavender": {
"100": {
"$type": "color",
"$value": "#f6f3fc"
},
"200": {
"$type": "color",
"$value": "#ebe3fa"
},
"300": {
"$type": "color",
"$value": "#e4daf7"
},
"400": {
"$type": "color",
"$value": "#c1aaf0"
},
"500": {
"$type": "color",
"$value": "#8153db"
},
"600": {
"$type": "color",
"$value": "#462f75"
}
},
"Lilac": {
"100": {
"$type": "color",
"$value": "#f7f0fa"
},
"200": {
"$type": "color",
"$value": "#f0e1f7"
},
"300": {
"$type": "color",
"$value": "#edd7f7"
},
"400": {
"$type": "color",
"$value": "#d3a9e8"
},
"500": {
"$type": "color",
"$value": "#9e4cc7"
},
"600": {
"$type": "color",
"$value": "#562d6b"
}
},
"Mallow": {
"100": {
"$type": "color",
"$value": "#faf0fa"
},
"200": {
"$type": "color",
"$value": "#f5e1f4"
},
"300": {
"$type": "color",
"$value": "#f5d7f4"
},
"400": {
"$type": "color",
"$value": "#dea4dc"
},
"500": {
"$type": "color",
"$value": "#b240af"
},
"600": {
"$type": "color",
"$value": "#632861"
}
},
"Camellia": {
"100": {
"$type": "color",
"$value": "#f9eff3"
},
"200": {
"$type": "color",
"$value": "#f7e1eb"
},
"300": {
"$type": "color",
"$value": "#f7d7e5"
},
"400": {
"$type": "color",
"$value": "#e5a3c0"
},
"500": {
"$type": "color",
"$value": "#c24279"
},
"600": {
"$type": "color",
"$value": "#6e2343"
}
},
"Smoke": {
"100": {
"$type": "color",
"$value": "#f5f5f5"
},
"200": {
"$type": "color",
"$value": "#e8e8e8"
},
"300": {
"$type": "color",
"$value": "#dedede"
},
"400": {
"$type": "color",
"$value": "#b8b8b8"
},
"500": {
"$type": "color",
"$value": "#6e6e6e"
},
"600": {
"$type": "color",
"$value": "#404040"
}
},
"Iron": {
"100": {
"$type": "color",
"$value": "#f2f4f7"
},
"200": {
"$type": "color",
"$value": "#e6e9f0"
},
"300": {
"$type": "color",
"$value": "#dadee5"
},
"400": {
"$type": "color",
"$value": "#b0b5bf"
},
"500": {
"$type": "color",
"$value": "#666f80"
},
"600": {
"$type": "color",
"$value": "#394152"
}
}
},
"Spacing": {
"0": {
"$type": "dimension",
"$value": "0px"
},
"100": {
"$type": "dimension",
"$value": "4px"
},
"200": {
"$type": "dimension",
"$value": "6px"
},
"300": {
"$type": "dimension",
"$value": "8px"
},
"400": {
"$type": "dimension",
"$value": "12px"
},
"500": {
"$type": "dimension",
"$value": "16px"
},
"600": {
"$type": "dimension",
"$value": "20px"
},
"1000": {
"$type": "dimension",
"$value": "1000px"
}
},
"Border-Radius": {
"0": {
"$type": "dimension",
"$value": "0px"
},
"100": {
"$type": "dimension",
"$value": "4px"
},
"200": {
"$type": "dimension",
"$value": "6px"
},
"300": {
"$type": "dimension",
"$value": "8px"
},
"400": {
"$type": "dimension",
"$value": "12px"
},
"500": {
"$type": "dimension",
"$value": "16px"
},
"600": {
"$type": "dimension",
"$value": "20px"
},
"1000": {
"$type": "dimension",
"$value": "1000px"
}
}
}

View File

File diff suppressed because it is too large Load Diff

View File

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,5 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10 18C8.89333 18 7.85333 17.79 6.88 17.37C5.90667 16.95 5.06 16.38 4.34 15.66C3.62 14.94 3.05 14.0933 2.63 13.12C2.21 12.1467 2 11.1067 2 10C2 8.89333 2.21 7.85333 2.63 6.88C3.05 5.90667 3.62 5.06 4.34 4.34C5.06 3.62 5.90667 3.05 6.88 2.63C7.85333 2.21 8.89333 2 10 2C11.1067 2 12.1467 2.21 13.12 2.63C14.0933 3.05 14.94 3.62 15.66 4.34C16.38 5.06 16.95 5.90667 17.37 6.88C17.79 7.85333 18 8.89333 18 10C18 11.1067 17.79 12.1467 17.37 13.12C16.95 14.0933 16.38 14.94 15.66 15.66C14.94 16.38 14.0933 16.95 13.12 17.37C12.1467 17.79 11.1067 18 10 18Z" fill="currentColor"/>
<path d="M10 6C9.44772 6 9 6.44772 9 7V9.5C9 10.0523 9.44772 10.5 10 10.5C10.5523 10.5 11 10.0523 11 9.5V7C11 6.44772 10.5523 6 10 6Z" fill="white"/>
<path d="M10 11.5C9.44772 11.5 9 11.9477 9 12.5C9 13.0523 9.44772 13.5 10 13.5C10.5523 13.5 11 13.0523 11 12.5C11 11.9477 10.5523 11.5 10 11.5Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 995 B

View File

@@ -0,0 +1,4 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M10 18C8.89333 18 7.85333 17.79 6.88 17.37C5.90667 16.95 5.06 16.38 4.34 15.66C3.62 14.94 3.05 14.0933 2.63 13.12C2.21 12.1467 2 11.1067 2 10C2 8.89333 2.21 7.85333 2.63 6.88C3.05 5.90667 3.62 5.06 4.34 4.34C5.06 3.62 5.90667 3.05 6.88 2.63C7.85333 2.21 8.89333 2 10 2C11.1067 2 12.1467 2.21 13.12 2.63C14.0933 3.05 14.94 3.62 15.66 4.34C16.38 5.06 16.95 5.90667 17.37 6.88C17.79 7.85333 18 8.89333 18 10C18 11.1067 17.79 12.1467 17.37 13.12C16.95 14.0933 16.38 14.94 15.66 15.66C14.94 16.38 14.0933 16.95 13.12 17.37C12.1467 17.79 11.1067 18 10 18Z" fill="currentColor"/>
<path d="M7.2823 9.41967L8.92823 11.1115L12.7177 7.21639C12.8581 7.07213 13.0367 7 13.2536 7C13.4705 7 13.6491 7.07213 13.7895 7.21639C13.9298 7.36066 14 7.54426 14 7.76721C14 7.99016 13.9298 8.17377 13.7895 8.31803L9.46412 12.7639C9.31101 12.9213 9.13238 13 8.92823 13C8.72408 13 8.54545 12.9213 8.39234 12.7639L6.21053 10.5213C6.07018 10.377 6 10.1934 6 9.97049C6 9.74754 6.07018 9.56393 6.21053 9.41967C6.35088 9.27541 6.52951 9.20328 6.74641 9.20328C6.96332 9.20328 7.14195 9.27541 7.2823 9.41967Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@@ -0,0 +1,5 @@
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M2.31862 17.5C2.16679 17.5 2.02876 17.4618 1.90453 17.3854C1.78031 17.309 1.68369 17.2083 1.61467 17.0833C1.54566 16.9583 1.5077 16.8229 1.5008 16.6771C1.49389 16.5313 1.53185 16.3889 1.61467 16.25L9.27534 2.91667C9.35816 2.77778 9.46513 2.67361 9.59626 2.60417C9.72739 2.53472 9.86197 2.5 10 2.5C10.138 2.5 10.2726 2.53472 10.4037 2.60417C10.5349 2.67361 10.6418 2.77778 10.7247 2.91667L18.3853 16.25C18.4681 16.3889 18.5061 16.5313 18.4992 16.6771C18.4923 16.8229 18.4543 16.9583 18.3853 17.0833C18.3163 17.2083 18.2197 17.309 18.0955 17.3854C17.9712 17.4618 17.8332 17.5 17.6814 17.5H2.31862Z" fill="currentColor"/>
<path d="M10 7.5C9.44772 7.5 9 7.94772 9 8.5V11C9 11.5523 9.44772 12 10 12C10.5523 12 11 11.5523 11 11V8.5C11 7.94772 10.5523 7.5 10 7.5Z" fill="white"/>
<path d="M10 13C9.44772 13 9 13.4477 9 14C9 14.5523 9.44772 15 10 15C10.5523 15 11 14.5523 11 14C11 13.4477 10.5523 13 10 13Z" fill="white"/>
</svg>

After

Width:  |  Height:  |  Size: 1.0 KiB

View File

@@ -52,6 +52,7 @@ export function AppHeader ({
}}
className={'appflowy-top-bar transform-gpu sticky top-0 z-10 flex px-5'}
>
<div className={'flex w-full items-center justify-between gap-4 overflow-hidden'}>
{displayMenuButton && (
<OutlinePopover

View File

@@ -6,7 +6,7 @@ import dayjs from 'dayjs';
import React, { useCallback, useMemo } from 'react';
import { useTranslation } from 'react-i18next';
function DocumentInfo({ viewId }: {
function DocumentInfo ({ viewId }: {
viewId: string;
}) {
const view = useAppView(viewId);
@@ -20,19 +20,19 @@ function DocumentInfo({ viewId }: {
const diffMin = now.diff(past, 'minute');
const diffHour = now.diff(past, 'hour');
if(diffSec < 5) {
if (diffSec < 5) {
return t('globalComment.showSeconds', {
count: 0,
});
}
if(diffMin < 1) {
if (diffMin < 1) {
return t('globalComment.showSeconds', {
count: diffSec,
});
}
if(diffHour < 1) {
if (diffHour < 1) {
return t('globalComment.showMinutes', {
count: diffMin,
});
@@ -45,7 +45,7 @@ function DocumentInfo({ viewId }: {
const words = useMemo(() => getWords(viewName || '') + (wordCount?.words || 0), [viewName, wordCount]);
const chars = useMemo(() => getCharacters(viewName || '') + (wordCount?.characters || 0), [viewName, wordCount]);
if(!view) return null;
if (!view) return null;
return (
<>
@@ -67,7 +67,6 @@ function DocumentInfo({ viewId }: {
{t('moreAction.createdAtLabel')}{formatTime(view.created_at)}
</div>}
</div>
</>
);

View File

@@ -12,7 +12,7 @@ import { Button, CircularProgress } from '@mui/material';
import React, { useState } from 'react';
import { useTranslation } from 'react-i18next';
function MoreActionsContent({ itemClicked, viewId, movePopoverOrigins, onDeleted }: {
function MoreActionsContent ({ itemClicked, viewId, movePopoverOrigins, onDeleted }: {
itemClicked?: () => void;
onDeleted?: () => void;
viewId: string;
@@ -29,15 +29,15 @@ function MoreActionsContent({ itemClicked, viewId, movePopoverOrigins, onDeleted
const {
refreshOutline,
} = useAppHandlers();
const handleDuplicateClick = async() => {
if(!workspaceId || !service) return;
const handleDuplicateClick = async () => {
if (!workspaceId || !service) return;
setDuplicateLoading(true);
try {
await service.duplicateAppPage(workspaceId, viewId);
void refreshOutline?.();
// eslint-disable-next-line
} catch(e: any) {
} catch (e: any) {
notify.error(e.message);
} finally {
setDuplicateLoading(false);

View File

@@ -26,7 +26,6 @@ function RightMenu () {
<Logo className={'h-6 w-6'} />
</button>
</Tooltip>
</div>
);
}

View File

@@ -14,6 +14,7 @@ const AfterPaymentPage = lazy(() => import('@/pages/AfterPaymentPage'));
const ImportPage = lazy(() => import('@/pages/ImportPage'));
import '@/styles/app.scss';
import { Toaster } from '../ui/sonner';
const AppMain = withAppWrapper(() => {
return (
@@ -78,6 +79,7 @@ function App () {
return (
<BrowserRouter>
<AppMain />
<Toaster />
</BrowserRouter>
);
}

View File

@@ -6,8 +6,6 @@ import {
i18nInstance,
} from '@/i18n/config';
import 'src/styles/tailwind.css';
import 'src/styles/template.css';
import { I18nextProvider } from 'react-i18next';
function AppTheme ({ children }: { children: React.ReactNode; }) {

View File

@@ -0,0 +1,90 @@
import { cva, type VariantProps } from 'class-variance-authority';
import * as React from 'react';
import * as AvatarPrimitive from '@radix-ui/react-avatar';
import { cn } from '@/lib/utils';
const avatarVariants = cva(
'relative flex aspect-square shrink-0 overflow-hidden',
{
variants: {
shape: {
circle: 'rounded-full',
square: 'rounded-200',
},
variant: {
default: 'bg-transparent',
outline: 'border-[1.5px] bg-transparent border-border-grey-tertiary',
},
size: {
sm: 'h-6 text-xs leading-[16px] text-icon-primary font-normal',
md: 'h-8 text-sm font-normal',
xl: 'h-20 text-2xl font-normal',
},
},
defaultVariants: {
variant: 'default',
size: 'md',
shape: 'circle',
},
},
);
function Avatar ({
className,
size,
variant,
shape = 'circle',
...props
}: React.ComponentProps<typeof AvatarPrimitive.Root> & VariantProps<typeof avatarVariants>) {
return (
<AvatarPrimitive.Root
data-slot="avatar"
className={cn(
avatarVariants({
size,
variant,
shape,
}),
className,
)}
{...props}
/>
);
}
function AvatarImage ({
className,
...props
}: React.ComponentProps<typeof AvatarPrimitive.Image>) {
return (
<AvatarPrimitive.Image
data-slot="avatar-image"
className={cn('aspect-square size-full', className)}
{...props}
/>
);
}
function AvatarFallback ({
className,
children,
...props
}: React.ComponentProps<typeof AvatarPrimitive.Fallback>) {
const isString = typeof children === 'string';
const char = isString ? children.charAt(0) : '';
return (
<AvatarPrimitive.Fallback
data-slot="avatar-fallback"
className={cn(
'flex text-icon-primary w-full h-full items-center justify-center',
isString ? 'bg-fill-tertiary' : '',
className,
)}
{...props}
>{!isString ? children : char}</AvatarPrimitive.Fallback>
);
}
export { Avatar, AvatarImage, AvatarFallback };

View File

@@ -0,0 +1,61 @@
import * as React from 'react';
import { Slot } from '@radix-ui/react-slot';
import { cva, type VariantProps } from 'class-variance-authority';
import { cn } from '@/lib/utils';
const buttonVariants = cva(
'inline-flex items-center justify-center gap-2 whitespace-nowrap transition-all disabled:pointer-events-none disabled:opacity-50 [&_svg]:pointer-events-none [&_svg:not([class*=\'size-\'])]:size-4 shrink-0 [&_svg]:shrink-0 [&_svg]:h-5 [&_svg]:w-5 outline-none focus-visible:border-border-theme-thick focus-visible:ring-border-theme-thick-hover focus-visible:ring-[0.5px] aria-invalid:ring-border-error-thick aria-invalid:border-border-error-thick-hover',
{
variants: {
variant: {
default:
'bg-fill-theme-thick text-text-on-fill hover:bg-fill-theme-thick-hover disabled:bg-fill-primary-alpha-5 disabled:text-text-tertiary',
destructive:
'bg-fill-error-thick text-text-on-fill hover:bg-fill-error-thick-hover focus-visible:ring-border-error-thick disabled:bg-fill-primary-alpha-5 disabled:text-text-tertiary',
outline:
'border border-border-grey-tertiary bg-background-primary text-text-primary hover:bg-fill-primary-alpha-5 hover:border-border-grey-tertiary-hover disabled:text-text-tertiary',
'destructive-outline':
'bg-background-primary text-text-error hover:bg-fill-error-select hover:text-text-error-hover border border-border-error-thick hover:border-border-error-thick-hover disabled:text-text-tertiary disabled:border-border-grey-tertiary',
ghost:
'hover:bg-fill-primary-alpha-5 text-text-primary disabled:bg-fill-transparent disabled:text-text-tertiary',
},
size: {
sm: 'h-7 text-sm px-4 rounded-300 gap-2 font-normal',
default: 'h-8 text-sm px-4 rounded-300 gap-2 font-normal',
lg: 'h-10 rounded-400 text-sm px-4 gap-2 font-medium',
xl: 'h-14 rounded-500 px-4 text-xl gap-2 font-medium',
icon: 'size-7 p-1 text-icon-primary disabled:text-icon-tertiary',
'icon-lg': 'size-10 p-[10px] text-icon-primary disabled:text-icon-tertiary',
},
},
defaultVariants: {
variant: 'default',
size: 'default',
},
},
);
const Button = React.forwardRef<HTMLButtonElement, React.ComponentProps<'button'> &
VariantProps<typeof buttonVariants> & {
asChild?: boolean
}>(({
className,
variant,
size,
asChild = false,
...props
}, ref) => {
const Comp = asChild ? Slot : 'button';
return (
<Comp
ref={ref}
data-slot="button"
className={cn(buttonVariants({ variant, size, className }))}
{...props}
/>
);
});
export { Button, buttonVariants };

View File

@@ -0,0 +1,179 @@
import * as React from 'react';
import * as DialogPrimitive from '@radix-ui/react-dialog';
import { X as XIcon } from 'lucide-react';
import { cn } from '@/lib/utils';
function Dialog ({
...props
}: React.ComponentProps<typeof DialogPrimitive.Root>) {
return <DialogPrimitive.Root data-slot="dialog" {...props} />;
}
function DialogTrigger ({
...props
}: React.ComponentProps<typeof DialogPrimitive.Trigger>) {
return <DialogPrimitive.Trigger data-slot="dialog-trigger" {...props} />;
}
function DialogPortal ({
...props
}: React.ComponentProps<typeof DialogPrimitive.Portal>) {
return <DialogPrimitive.Portal data-slot="dialog-portal" {...props} />;
}
function DialogClose ({
...props
}: React.ComponentProps<typeof DialogPrimitive.Close>) {
return <DialogPrimitive.Close data-slot="dialog-close" {...props} />;
}
function DialogOverlay ({
className,
...props
}: React.ComponentProps<typeof DialogPrimitive.Overlay>) {
return (
<DialogPrimitive.Overlay
data-slot="dialog-overlay"
className={cn(
// Positioning and stacking
'fixed inset-0 z-50',
// Background styling
'bg-surface-overlay', // Semi-transparent black background
// Animation states for opening/closing
'data-[state=open]:animate-in data-[state=closed]:animate-out',
'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',
className,
)}
{...props}
/>
);
}
function DialogContent ({
className,
children,
...props
}: React.ComponentProps<typeof DialogPrimitive.Content>) {
return (
<DialogPortal data-slot="dialog-portal">
<DialogOverlay />
<DialogPrimitive.Content
data-slot="dialog-content"
className={cn(
// Base appearance
'bg-background-primary rounded-500 shadow-dialog',
// Positioning and sizing
'fixed top-[50%] left-[50%] z-50',
'translate-x-[-50%] translate-y-[-50%]', // Center perfectly
'w-full max-w-[calc(100%-2rem)] sm:max-w-lg', // Responsive width
// Internal layout
'grid gap-3 px-5 py-4',
// Animation settings
'duration-200',
// Animation states for opening/closing
'data-[state=open]:animate-in data-[state=closed]:animate-out',
'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',
'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',
className,
)}
{...props}
>
{children}
<DialogPrimitive.Close
className={cn(
// Positioning
'absolute top-4 right-5',
// Base styling
'rounded-300 text-icon-primary',
// Interactive states
'focus:outline-hidden focus-visible:outline-none',
'disabled:pointer-events-none disabled:text-text-tertiary',
// Open state styling
'data-[state=open]:bg-fill-tertiary data-[state=open]:text-icon-primary',
// Transition
'transition-opacity',
// SVG specific styling
'[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:h-5 [&_svg]:w-5',
)}
>
<XIcon />
</DialogPrimitive.Close>
</DialogPrimitive.Content>
</DialogPortal>
);
}
function DialogHeader ({ className, ...props }: React.ComponentProps<'div'>) {
return (
<div
data-slot="dialog-header"
className={cn('flex flex-col gap-3 text-left', className)}
{...props}
/>
);
}
function DialogFooter ({ className, ...props }: React.ComponentProps<'div'>) {
return (
<div
data-slot="dialog-footer"
className={cn(
'flex flex-col-reverse gap-2 sm:flex-row sm:justify-end',
className,
)}
{...props}
/>
);
}
function DialogTitle ({
className,
...props
}: React.ComponentProps<typeof DialogPrimitive.Title>) {
return (
<DialogPrimitive.Title
data-slot="dialog-title"
className={cn('text-base font-bold', className)}
{...props}
/>
);
}
function DialogDescription ({
className,
...props
}: React.ComponentProps<typeof DialogPrimitive.Description>) {
return (
<DialogPrimitive.Description
data-slot="dialog-description"
className={cn('text-sm font-normal', className)}
{...props}
/>
);
}
export {
Dialog,
DialogClose,
DialogContent,
DialogDescription,
DialogFooter,
DialogHeader,
DialogOverlay,
DialogPortal,
DialogTitle,
DialogTrigger,
};

View File

@@ -0,0 +1,265 @@
import * as React from 'react';
import * as DropdownMenuPrimitive from '@radix-ui/react-dropdown-menu';
import { ChevronRightIcon } from 'lucide-react';
import { cn } from '@/lib/utils';
function DropdownMenu ({
...props
}: React.ComponentProps<typeof DropdownMenuPrimitive.Root>) {
return <DropdownMenuPrimitive.Root data-slot="dropdown-menu" {...props} />;
}
function DropdownMenuPortal ({
...props
}: React.ComponentProps<typeof DropdownMenuPrimitive.Portal>) {
return (
<DropdownMenuPrimitive.Portal data-slot="dropdown-menu-portal" {...props} />
);
}
function DropdownMenuTrigger ({
...props
}: React.ComponentProps<typeof DropdownMenuPrimitive.Trigger>) {
return (
<DropdownMenuPrimitive.Trigger
data-slot="dropdown-menu-trigger"
{...props}
/>
);
}
type DropdownMenuContentProps =
React.ComponentProps<typeof DropdownMenuPrimitive.Content>
& React.ComponentProps<typeof DropdownMenuPrimitive.Portal>
function DropdownMenuContent ({
className,
sideOffset = 4,
container,
forceMount,
...props
}: DropdownMenuContentProps) {
return (
<DropdownMenuPrimitive.Portal
container={container}
forceMount={forceMount}
>
<DropdownMenuPrimitive.Content
data-slot="dropdown-menu-content"
sideOffset={sideOffset}
avoidCollisions
className={cn(
// Base colors and appearance
'bg-background-primary text-text-primary',
'z-50 min-w-[8rem] rounded-400 p-2 shadow-menu',
// Size constraints and overflow behavior
'max-h-(--radix-dropdown-menu-content-available-height)',
'origin-(--radix-dropdown-menu-content-transform-origin)',
'overflow-x-hidden overflow-y-auto',
// Animation states for opening/closing
'data-[state=open]:animate-in data-[state=closed]:animate-out',
'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',
'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',
// Position-based animations
'data-[side=bottom]:slide-in-from-top-2',
'data-[side=left]:slide-in-from-right-2',
'data-[side=right]:slide-in-from-left-2',
'data-[side=top]:slide-in-from-bottom-2',
className,
)}
{...props}
/>
</DropdownMenuPrimitive.Portal>
);
}
function DropdownMenuGroup ({
...props
}: React.ComponentProps<typeof DropdownMenuPrimitive.Group>) {
return (
<DropdownMenuPrimitive.Group data-slot="dropdown-menu-group" {...props} />
);
}
function DropdownMenuItem ({
className,
inset,
variant = 'default',
...props
}: React.ComponentProps<typeof DropdownMenuPrimitive.Item> & {
inset?: boolean
variant?: 'default' | 'destructive'
}) {
return (
<DropdownMenuPrimitive.Item
data-slot="dropdown-menu-item"
data-inset={inset}
data-variant={variant}
className={cn(
// Focus states
'focus:bg-fill-primary-alpha-5 focus-visible:outline-none focus:text-text-primary',
// Destructive variant styling
'data-[variant=destructive]:text-text-error',
'data-[variant=destructive]:focus:bg-fill-error-light',
'data-[variant=destructive]:focus:text-text-error',
'data-[variant=destructive]:*:[svg]:!text-text-error',
// Base layout and appearance
'relative flex cursor-pointer items-center gap-2 rounded-300 px-2 py-1 min-h-[32px]',
'text-sm text-text-primary outline-hidden select-none',
// Disabled state
'data-[disabled]:pointer-events-none data-[disabled]:text-text-tertiary',
// Inset variant (with left padding for icons)
'data-[inset]:pl-8',
// SVG/Icon styling
'[&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg]:h-5 [&_svg]:w-5 [&_svg]:text-icon-primary',
className,
)}
{...props}
/>
);
}
function DropdownMenuLabel ({
className,
inset,
...props
}: React.ComponentProps<typeof DropdownMenuPrimitive.Label> & {
inset?: boolean
}) {
return (
<DropdownMenuPrimitive.Label
data-slot="dropdown-menu-label"
data-inset={inset}
className={cn(
'px-2 py-1 text-xs flex items-center font-semibold min-h-[32px] data-[inset]:pl-8 text-text-tertiary',
className,
)}
{...props}
/>
);
}
function DropdownMenuSeparator ({
className,
...props
}: React.ComponentProps<typeof DropdownMenuPrimitive.Separator>) {
return (
<DropdownMenuPrimitive.Separator
data-slot="dropdown-menu-separator"
className={cn('-mx-2 my-2 border-border-grey-tertiary border-t', className)}
{...props}
/>
);
}
function DropdownMenuShortcut ({
className,
...props
}: React.ComponentProps<'span'>) {
return (
<span
data-slot="dropdown-menu-shortcut"
className={cn(
'text-text-tertiary ml-auto text-xs tracking-widest',
className,
)}
{...props}
/>
);
}
function DropdownMenuSub ({
...props
}: React.ComponentProps<typeof DropdownMenuPrimitive.Sub>) {
return <DropdownMenuPrimitive.Sub data-slot="dropdown-menu-sub" {...props} />;
}
function DropdownMenuSubTrigger ({
className,
inset,
children,
...props
}: React.ComponentProps<typeof DropdownMenuPrimitive.SubTrigger> & {
inset?: boolean
}) {
return (
<DropdownMenuPrimitive.SubTrigger
data-slot="dropdown-menu-sub-trigger"
data-inset={inset}
className={cn(
// Focus and open states
'focus:bg-fill-primary-alpha-5 focus-visible:outline-none focus:text-text-primary',
'data-[state=open]:bg-fill-primary-alpha-5 data-[state=open]:text-text-primary',
// Base layout and appearance
'flex cursor-pointer items-center rounded-300 px-2 py-1 min-h-[32px]',
'text-sm outline-hidden select-none',
// Inset variant (with left padding for icons)
'data-[inset]:pl-8',
className,
)}
{...props}
>
{children}
<ChevronRightIcon className="ml-auto text-icon-tertiary h-5 w-3" />
</DropdownMenuPrimitive.SubTrigger>
);
}
function DropdownMenuSubContent ({
className,
...props
}: React.ComponentProps<typeof DropdownMenuPrimitive.SubContent>) {
return (
<DropdownMenuPrimitive.SubContent
data-slot="dropdown-menu-sub-content"
className={cn(
// Base colors and appearance
'bg-background-primary text-text-primary',
'z-50 min-w-[8rem] rounded-400 p-2 shadow-menu',
'origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden',
// Animation states for opening/closing
'data-[state=open]:animate-in data-[state=closed]:animate-out',
'data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0',
'data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95',
// Position-based animations
'data-[side=bottom]:slide-in-from-top-2',
'data-[side=left]:slide-in-from-right-2',
'data-[side=right]:slide-in-from-left-2',
'data-[side=top]:slide-in-from-bottom-2',
className,
)}
{...props}
/>
);
}
export {
DropdownMenu,
DropdownMenuPortal,
DropdownMenuTrigger,
DropdownMenuContent,
DropdownMenuGroup,
DropdownMenuLabel,
DropdownMenuItem,
DropdownMenuSeparator,
DropdownMenuShortcut,
DropdownMenuSub,
DropdownMenuSubTrigger,
DropdownMenuSubContent,
};

View File

@@ -0,0 +1,86 @@
import * as React from 'react';
import { cva, type VariantProps } from 'class-variance-authority';
import { cn } from '@/lib/utils';
// Base input styles that apply to all variants and sizes
const baseInputStyles = cn(
// Text and placeholder styling
'text-text-primary placeholder:text-text-tertiary',
// Selection styling
'selection:bg-fill-theme-thick selection:text-text-on-fill focus:caret-fill-theme-thick',
'bg-fill-transparent',
// Layout
'flex min-w-0',
// Typography
'text-sm',
// Effects
'outline-none',
// File input styling
'file:inline-flex file:border-0 file:bg-fill-transparent file:text-sm file:font-medium',
// Disabled state
'disabled:pointer-events-none disabled:cursor-not-allowed',
);
const inputVariants = cva(
baseInputStyles,
{
variants: {
variant: {
// Default variant with focus styles
default: 'border-border-grey-tertiary border focus-visible:border-border-theme-thick focus-visible:ring-border-theme-thick focus-visible:ring-[0.5px] disabled:border-border-grey-tertiary disabled:bg-fill-primary-alpha-5 disabled:text-text-tertiary hover:border-border-grey-tertiary-hover',
// Destructive variant for error states
destructive: 'border border-border-error-thick focus-visible:border-border-error-thick focus-visible:ring-border-error-thick focus-visible:ring-[0.5px] focus:caret-text-primary disabled:border-border-grey-tertiary disabled:bg-fill-primary-alpha-5 disabled:text-text-tertiary',
// Ghost variant without visible borders
ghost: 'border-fill-transparent focus-visible:border-transparent focus-visible:ring-transparent disabled:border-fill-transparent disabled:bg-fill-transparent disabled:text-text-tertiary',
},
size: {
// Small size input
sm: 'h-8 px-2 rounded-300',
// Medium size input (default)
md: 'h-10 px-2 rounded-400',
},
},
defaultVariants: {
variant: 'default',
size: 'sm',
},
},
);
export interface InputProps
extends Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size' | 'variant'>,
VariantProps<typeof inputVariants> {}
function Input ({
className,
type,
variant,
size,
...props
}: InputProps) {
return (
<input
type={type}
data-slot="input"
className={cn(
inputVariants({ variant, size }),
// Invalid state styling (applied via aria-invalid attribute)
'aria-invalid:ring-border-error-thick aria-invalid:border-border-error-thick',
className,
)}
{...props}
/>
);
}
export { Input };

View File

@@ -0,0 +1,38 @@
import * as React from 'react';
import * as LabelPrimitive from '@radix-ui/react-label';
import { cn } from '@/lib/utils';
function Label ({
className,
...props
}: React.ComponentProps<typeof LabelPrimitive.Root>) {
return (
<LabelPrimitive.Root
data-slot="label"
className={cn(
// Typography and base appearance
'text-text-secondary text-xs leading-[16px] font-semibold',
// Layout
'flex items-center gap-2',
// Interaction
'select-none',
// Disabled states (for parent group)
'group-data-[disabled=true]:pointer-events-none',
'group-data-[disabled=true]:opacity-50',
// Disabled states (for peer elements)
'peer-disabled:cursor-not-allowed',
'peer-disabled:opacity-50',
className,
)}
{...props}
/>
);
}
export { Label };

View File

@@ -0,0 +1,40 @@
import * as React from 'react';
import * as PopoverPrimitive from '@radix-ui/react-popover';
import { cn } from '@/lib/utils';
function Popover ({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Root>) {
return <PopoverPrimitive.Root data-slot="popover" {...props} />;
}
function PopoverTrigger ({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Trigger>) {
return <PopoverPrimitive.Trigger data-slot="popover-trigger" {...props} />;
}
function PopoverContent ({
className,
align = 'center',
sideOffset = 4,
...props
}: React.ComponentProps<typeof PopoverPrimitive.Content>) {
return (
<PopoverPrimitive.Portal>
<PopoverPrimitive.Content
data-slot="popover-content"
align={align}
sideOffset={sideOffset}
className={cn(
'bg-surface-primary data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2 origin-(--radix-popover-content-transform-origin) outline-hidden shadow-popover z-50 w-72 rounded-400 p-0',
className,
)}
{...props}
/>
</PopoverPrimitive.Portal>
);
}
function PopoverAnchor ({ ...props }: React.ComponentProps<typeof PopoverPrimitive.Anchor>) {
return <PopoverPrimitive.Anchor data-slot="popover-anchor" {...props} />;
}
export { Popover, PopoverTrigger, PopoverContent, PopoverAnchor };

View File

@@ -0,0 +1,153 @@
import * as React from 'react';
import { cva, type VariantProps } from 'class-variance-authority';
import { cn } from '@/lib/utils';
const progressVariants = cva(
'relative block',
{
variants: {
size: {
sm: 'h-4 w-4',
md: 'h-6 w-6',
lg: 'h-8 w-8',
xl: 'h-10 w-10',
},
variant: {
default: '',
success: '',
warning: '',
destructive: '',
theme: '',
},
isIndeterminate: {
true: 'animate-progress-container',
false: '',
},
},
defaultVariants: {
size: 'md',
variant: 'default',
isIndeterminate: false,
},
},
);
const circleVariants = cva(
'fill-fill-transparent ',
{
variants: {
variant: {
default: 'stroke-fill-tertiary',
theme: 'stroke-fill-tertiary',
success: 'stroke-fill-tertiary',
warning: 'stroke-fill-tertiary',
destructive: 'stroke-fill-tertiary',
},
},
defaultVariants: {
variant: 'default',
},
},
);
const progressCircleVariants = cva(
'fill-fill-transparent transition-all',
{
variants: {
variant: {
default: 'stroke-fill-secondary',
theme: 'stroke-fill-theme-thick',
success: 'stroke-fill-success-thick',
warning: 'stroke-warning-thick',
destructive: 'stroke-error-thick',
},
},
defaultVariants: {
variant: 'default',
},
},
);
export interface ProgressProps
extends React.HTMLAttributes<HTMLDivElement>,
VariantProps<typeof progressVariants> {
/** Progress value between 0 and 100. When undefined, shows indeterminate state */
value?: number;
/** Line ending style */
strokeLinecap?: 'round' | 'square';
/** Custom stroke width in pixels */
strokeWidth?: number;
}
export function Progress ({
value,
size = 'md',
variant = 'default',
strokeLinecap = 'round',
strokeWidth = 3.5,
className,
...props
}: ProgressProps) {
// Calculate dimensions based on size variant
const dimensions: number = {
sm: 16,
md: 24,
lg: 32,
xl: 40,
}[size as string] || 24;
const radius = dimensions / 2 - strokeWidth;
const circumference = Math.ceil(2 * Math.PI * radius);
const isIndeterminate = value === undefined;
// Calculate percentage offset for the progress circle
const offset = isIndeterminate
? circumference * 0.25 // 25% offset for indeterminate state
: Math.ceil(circumference * ((100 - Math.min(Math.max(0, value || 0), 100)) / 100));
// Calculate viewBox to add padding around the circles
const viewBox = `-${dimensions * 0.125} -${dimensions * 0.125} ${dimensions * 1.25} ${
dimensions * 1.25
}`;
return (
<div
className={cn(progressVariants({ size, variant, isIndeterminate, className }))}
{...props}
>
<svg
width={dimensions}
height={dimensions}
viewBox={viewBox}
xmlns="http://www.w3.org/2000/svg"
style={{ transform: 'rotate(-90deg)' }}
>
{/* Base Circle */}
<circle
r={radius}
cx={dimensions / 2}
cy={dimensions / 2}
strokeWidth={strokeWidth}
strokeDasharray={circumference}
strokeDashoffset="0"
className={cn(circleVariants({ variant }), isIndeterminate && 'hidden')}
/>
{/* Progress Circle */}
<circle
r={radius}
cx={dimensions / 2}
cy={dimensions / 2}
strokeWidth={strokeWidth}
strokeLinecap={strokeLinecap}
strokeDasharray={circumference}
strokeDashoffset={offset}
className={cn(
progressCircleVariants({
variant,
}),
)}
/>
</svg>
</div>
);
}

View File

@@ -0,0 +1,26 @@
import * as React from 'react';
import * as SeparatorPrimitive from '@radix-ui/react-separator';
import { cn } from '@/lib/utils';
function Separator ({
className,
orientation = 'horizontal',
decorative = true,
...props
}: React.ComponentProps<typeof SeparatorPrimitive.Root>) {
return (
<SeparatorPrimitive.Root
data-slot="separator-root"
decorative={decorative}
orientation={orientation}
className={cn(
'bg-border-grey-tertiary shrink-0 data-[orientation=horizontal]:h-px data-[orientation=horizontal]:w-full data-[orientation=vertical]:h-full data-[orientation=vertical]:w-px',
className,
)}
{...props}
/>
);
}
export { Separator };

View File

@@ -0,0 +1,30 @@
import { useTheme } from 'next-themes';
import { Toaster as Sonner, ToasterProps } from 'sonner';
import { ReactComponent as ToastSuccess } from '@/assets/toast_success.svg';
import { ReactComponent as ToastWarning } from '@/assets/toast_warning.svg';
import { ReactComponent as ToastError } from '@/assets/toast_error.svg';
const Toaster = ({ ...props }: ToasterProps) => {
const { theme = 'system' } = useTheme();
return (
<Sonner
theme={theme as ToasterProps['theme']}
className='toaster group'
{...props}
position='bottom-center'
visibleToasts={1}
toastOptions={{
className:
'!shadow-toast px-4 py-2 gap-2 bg-fill-primary border-none text-text-quaternary w-fit max-w-[360px] rounded-400',
}}
icons={{
success: <ToastSuccess className='h-5 w-5 text-fill-success-thick' />,
warning: <ToastWarning className='h-5 w-5 text-fill-warning-thick' />,
error: <ToastError className='h-5 w-5 text-fill-error-thick' />,
}}
/>
);
};
export { Toaster };

View File

@@ -0,0 +1,63 @@
import * as React from 'react';
import * as TooltipPrimitive from '@radix-ui/react-tooltip';
import { cn } from '@/lib/utils';
function TooltipProvider({ delayDuration = 0, ...props }: React.ComponentProps<typeof TooltipPrimitive.Provider>) {
return <TooltipPrimitive.Provider data-slot='tooltip-provider' delayDuration={delayDuration} {...props} />;
}
function Tooltip({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Root>) {
return (
<TooltipProvider>
<TooltipPrimitive.Root data-slot='tooltip' {...props} />
</TooltipProvider>
);
}
function TooltipTrigger({ ...props }: React.ComponentProps<typeof TooltipPrimitive.Trigger>) {
return <TooltipPrimitive.Trigger data-slot='tooltip-trigger' {...props} />;
}
function TooltipContent({
className,
sideOffset = 0,
children,
...props
}: React.ComponentProps<typeof TooltipPrimitive.Content>) {
return (
<TooltipPrimitive.Portal>
<TooltipPrimitive.Content
data-slot='tooltip-content'
sideOffset={sideOffset}
className={cn(
// Animation behavior
'animate-in fade-in-0 zoom-in-95',
'data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=closed]:zoom-out-95',
// Slide-in effects based on tooltip position
'data-[side=bottom]:slide-in-from-top-2',
'data-[side=left]:slide-in-from-right-2',
'data-[side=right]:slide-in-from-left-2',
'data-[side=top]:slide-in-from-bottom-2',
// Styling and layout
'text-balance shadow-tooltip z-50 origin-[--radix-tooltip-content-transform-origin]',
'w-fit rounded-400 bg-fill-primary px-3 py-2 text-sm text-text-quaternary',
'flex flex-col',
className
)}
{...props}
>
{children}
</TooltipPrimitive.Content>
</TooltipPrimitive.Portal>
);
}
function TooltipShortcut({ className, ...props }: React.ComponentProps<'span'>) {
return <span data-slot='tooltip-shortcut' className={cn('text-text-secondary', className)} {...props} />;
}
export { Tooltip, TooltipTrigger, TooltipContent, TooltipProvider, TooltipShortcut };

6
src/lib/utils.ts Normal file
View File

@@ -0,0 +1,6 @@
import { clsx, type ClassValue } from 'clsx';
import { twMerge } from 'tailwind-merge';
export function cn (...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}

View File

@@ -1,4 +1,5 @@
import ReactDOM from 'react-dom/client';
import App from '@/components/main/App';
import './styles/global.css';
ReactDOM.createRoot(document.getElementById('root')!).render(<App />);

33
src/styles/global.css Normal file
View File

@@ -0,0 +1,33 @@
@import "./tailwind.css";
@import "tw-animate-css";
@import "./variables/semantic.light.css";
@import "./variables/semantic.dark.css";
@import "./template.css";
:root {
/* new shadow */
--custom-shadow-sm: 0px 4px 20px 0px rgba(31, 35, 41, 0.10);
--custom-shadow-md: 0px 4px 32px 0px rgba(31, 34, 37, 0.12);
}
:root[data-dark-mode=true] {
/* new shadow */
--custom-shadow-sm: 0px 2px 16px 0px rgba(0, 0, 0, 0.48);
--custom-shadow-md: 0px 4px 32px 0px rgba(0, 0, 0, 0.48);
}
@layer base {
@keyframes progress-container {
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
}
.animate-progress-container {
animation: progress-container 1s linear infinite;
}
}

View File

@@ -0,0 +1,256 @@
/**
* Design system dark theme variables
* AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY
*
* Generated from: semantic.dark.json
* Generated time: 2025-03-31T09:19:58.458Z
*
* To modify these values, edit the source JSON files and run the token conversion script:
* node scripts/system-token/convert-tokens.cjs
*/
:root[data-dark-mode=true] {
--text-primary: #e4e8f5;
--text-secondary: #b5bbd3;
--text-tertiary: #6f748c;
--text-quaternary: #21232a;
--text-inverse: #21232a;
--text-on-fill: #ffffff;
--text-theme: #00b5ff;
--text-theme-hover: #0092d6;
--text-action: #00b5ff;
--text-action-hover: #0092d6;
--text-info: #00b5ff;
--text-info-hover: #0092d6;
--text-success: #248569;
--text-success-hover: #29725d;
--text-warning: #db7e21;
--text-warning-hover: #b75f17;
--text-error: #f33641;
--text-error-hover: #ff5050;
--text-purple: #9327ff;
--text-purple-hover: #7a1dcc;
--icon-primary: #e4e8f5;
--icon-secondary: #b5bbd3;
--icon-tertiary: #6f748c;
--icon-quaternary: #21232a;
--icon-white: #ffffff;
--icon-purple-thick: #ffffff;
--icon-purple-thick-hover: #ffffff;
--border-grey-primary: #f8faff;
--border-grey-primary-hover: #e4e8f5;
--border-grey-secondary: #ced3e6;
--border-grey-secondary-hover: #b5bbd3;
--border-grey-tertiary: #3c3f4e;
--border-grey-tertiary-hover: #54596e;
--border-grey-quaternary: #21232a;
--border-grey-quaternary-hover: #272930;
--border-transparent: #ffffff00;
--border-theme-thick: #00b5ff;
--border-theme-thick-hover: #0092d6;
--border-info-thick: #00b5ff;
--border-info-thick-hover: #0092d6;
--border-success-thick: #248569;
--border-success-thick-hover: #29725d;
--border-warning-thick: #db7e21;
--border-warning-thick-hover: #b75f17;
--border-error-thick: #f33641;
--border-error-thick-hover: #ff5050;
--border-purple-thick: #9327ff;
--border-purple-thick-hover: #7a1dcc;
--fill-primary: #f8faff;
--fill-primary-hover: #e4e8f5;
--fill-secondary: #ced3e6;
--fill-secondary-hover: #b5bbd3;
--fill-tertiary: #6f748c;
--fill-tertiary-hover: #989eb7;
--fill-quaternary: #21232a;
--fill-quaternary-hover: #272930;
--fill-transparent: #ffffff00;
--fill-primary-alpha-5: #f9fafd0d;
--fill-primary-alpha-5-hover: #f9fafd1a;
--fill-primary-alpha-80: #1f2329cc;
--fill-primary-alpha-80-hover: #1f2329b2;
--fill-white: #ffffff;
--fill-white-alpha: #ffffff33;
--fill-white-alpha-hover: #ffffff4d;
--fill-black: #000000;
--fill-theme-light: #e3f6ff;
--fill-theme-light-hover: #a9e2ff;
--fill-theme-thick: #00b5ff;
--fill-theme-thick-hover: #4ec1ff;
--fill-theme-select: #00b5ff26;
--fill-info-light: #e3f6ff;
--fill-info-light-hover: #a9e2ff;
--fill-info-thick: #00b5ff;
--fill-info-thick-hover: #0092d6;
--fill-success-light: #ecf9f5;
--fill-success-light-hover: #c3e5d8;
--fill-success-thick: #248569;
--fill-success-thick-hover: #29725d;
--fill-warning-light: #fff3d5;
--fill-warning-light-hover: #ffe4ab;
--fill-warning-thick: #db7e21;
--fill-warning-thick-hover: #b75f17;
--fill-error-light: #ffd2dd;
--fill-error-light-hover: #ffa5b4;
--fill-error-thick: #e71d32;
--fill-error-thick-hover: #f33641;
--fill-error-select: #f336411a;
--fill-purple-light: #f1e0ff;
--fill-purple-light-hover: #e1b3ff;
--fill-purple-thick-hover: #7a1dcc;
--fill-purple-thick: #9327ff;
--surface-primary: #272930;
--surface-overlay: #00000099;
--background-primary: #21232a;
--background-secondary: #272930;
--background-tertiary: #3c3f4e;
--background-quaternary: #54596e;
--badge-color-rose-rose-light-1: #fcf2f2;
--badge-color-rose-rose-light-2: #fae3e3;
--badge-color-rose-rose-light-3: #fad9d9;
--badge-color-rose-rose-thick-1: #edadad;
--badge-color-rose-rose-thick-2: #cc4e4e;
--badge-color-rose-rose-thick-3: #702828;
--badge-color-papaya-papaya-light-1: #fcf4f0;
--badge-color-papaya-papaya-light-2: #fae8de;
--badge-color-papaya-papaya-light-3: #fadfd2;
--badge-color-papaya-papaya-thick-1: #f0bda3;
--badge-color-papaya-papaya-thick-2: #d67240;
--badge-color-papaya-papaya-thick-3: #6b3215;
--badge-color-tangerine-tangerine-light-1: #fff7ed;
--badge-color-tangerine-tangerine-light-2: #fcedd9;
--badge-color-tangerine-tangerine-light-3: #fae5ca;
--badge-color-tangerine-tangerine-thick-1: #f2cb99;
--badge-color-tangerine-tangerine-thick-2: #db8f2c;
--badge-color-tangerine-tangerine-thick-3: #613b0a;
--badge-color-mango-mango-light-1: #fff9ec;
--badge-color-mango-mango-light-2: #fcf1d7;
--badge-color-mango-mango-light-3: #fae9c3;
--badge-color-mango-mango-thick-1: #f5d68e;
--badge-color-mango-mango-thick-2: #e0a416;
--badge-color-mango-mango-thick-3: #5c4102;
--badge-color-lemon-lemon-light-1: #fffbe8;
--badge-color-lemon-lemon-light-2: #fcf5cf;
--badge-color-lemon-lemon-light-3: #faefb9;
--badge-color-lemon-lemon-thick-1: #f5e282;
--badge-color-lemon-lemon-thick-2: #e0bb00;
--badge-color-lemon-lemon-thick-3: #574800;
--badge-color-olive-olive-light-1: #f9fae6;
--badge-color-olive-olive-light-2: #f6f7d0;
--badge-color-olive-olive-light-3: #f0f2b3;
--badge-color-olive-olive-thick-1: #dbde83;
--badge-color-olive-olive-thick-2: #adb204;
--badge-color-olive-olive-thick-3: #4a4c03;
--badge-color-lime-lime-light-1: #f6f9e6;
--badge-color-lime-lime-light-2: #eef5ce;
--badge-color-lime-lime-light-3: #e7f0bb;
--badge-color-lime-lime-thick-1: #cfdb91;
--badge-color-lime-lime-thick-2: #92a822;
--badge-color-lime-lime-thick-3: #414d05;
--badge-color-grass-grass-light-1: #f4faeb;
--badge-color-grass-grass-light-2: #e9f5d7;
--badge-color-grass-grass-light-3: #def0c5;
--badge-color-grass-grass-thick-1: #bfd998;
--badge-color-grass-grass-thick-2: #75a828;
--badge-color-grass-grass-thick-3: #334d0c;
--badge-color-forest-forest-light-1: #f1faf0;
--badge-color-forest-forest-light-2: #e2f5df;
--badge-color-forest-forest-light-3: #d7f0d3;
--badge-color-forest-forest-thick-1: #a8d6a1;
--badge-color-forest-forest-thick-2: #49a33b;
--badge-color-forest-forest-thick-3: #1e4f16;
--badge-color-jade-jade-light-1: #f0faf6;
--badge-color-jade-jade-light-2: #dff5eb;
--badge-color-jade-jade-light-3: #cef0e1;
--badge-color-jade-jade-thick-1: #90d1b5;
--badge-color-jade-jade-thick-2: #1c9963;
--badge-color-jade-jade-thick-3: #075231;
--badge-color-aqua-aqua-light-1: #f0f9fa;
--badge-color-aqua-aqua-light-2: #dff3f5;
--badge-color-aqua-aqua-light-3: #ccecf0;
--badge-color-aqua-aqua-thick-1: #83ccd4;
--badge-color-aqua-aqua-thick-2: #008e9e;
--badge-color-aqua-aqua-thick-3: #004e57;
--badge-color-azure-azure-light-1: #f0f6fa;
--badge-color-azure-azure-light-2: #e1eef7;
--badge-color-azure-azure-light-3: #d3e6f5;
--badge-color-azure-azure-thick-1: #88c0eb;
--badge-color-azure-azure-thick-2: #0877cc;
--badge-color-azure-azure-thick-3: #154469;
--badge-color-denim-denim-light-1: #f0f3fa;
--badge-color-denim-denim-light-2: #e3ebfa;
--badge-color-denim-denim-light-3: #d7e2f7;
--badge-color-denim-denim-thick-1: #9ab6ed;
--badge-color-denim-denim-thick-2: #3267d1;
--badge-color-denim-denim-thick-3: #223c70;
--badge-color-mauve-mauve-light-1: #f2f2fc;
--badge-color-mauve-mauve-thick-2: #5555e0;
--badge-color-mauve-mauve-thick-3: #36366b;
--badge-color-mauve-mauve-thick-1: #aeaef5;
--badge-color-lavender-lavender-light-1: #f6f3fc;
--badge-color-lavender-lavender-light-2: #ebe3fa;
--badge-color-lavender-lavender-light-3: #e4daf7;
--badge-color-lavender-lavender-thick-1: #c1aaf0;
--badge-color-lavender-lavender-thick-2: #8153db;
--badge-color-lavender-lavender-thick-3: #462f75;
--badge-color-lilac-liliac-light-1: #f7f0fa;
--badge-color-lilac-liliac-light-2: #f0e1f7;
--badge-color-lilac-liliac-light-3: #edd7f7;
--badge-color-lilac-liliac-thick-1: #d3a9e8;
--badge-color-lilac-liliac-thick-2: #9e4cc7;
--badge-color-lilac-liliac-thick-3: #562d6b;
--badge-color-mallow-mallow-light-1: #faf0fa;
--badge-color-mallow-mallow-light-2: #f5e1f4;
--badge-color-mallow-mallow-light-3: #f5d7f4;
--badge-color-mallow-mallow-thick-1: #dea4dc;
--badge-color-mallow-mallow-thick-2: #b240af;
--badge-color-mallow-mallow-thick-3: #632861;
--badge-color-camellia-camellia-light-1: #f9eff3;
--badge-color-camellia-camellia-light-2: #f7e1eb;
--badge-color-camellia-camellia-light-3: #f7d7e5;
--badge-color-camellia-camellia-thick-1: #e5a3c0;
--badge-color-camellia-camellia-thick-2: #c24279;
--badge-color-camellia-camellia-thick-3: #6e2343;
--badge-color-smoke-smoke-light-1: #f5f5f5;
--badge-color-smoke-smoke-light-2: #e8e8e8;
--badge-color-smoke-smoke-light-3: #dedede;
--badge-color-smoke-smoke-thick-1: #b8b8b8;
--badge-color-smoke-smoke-thick-2: #6e6e6e;
--badge-color-smoke-smoke-thick-3: #404040;
--badge-color-iron-icon-light-1: #f2f4f7;
--badge-color-iron-icon-light-2: #e6e9f0;
--badge-color-iron-icon-light-3: #dadee5;
--badge-color-iron-icon-thick-1: #b0b5bf;
--badge-color-iron-icon-thick-2: #666f80;
--badge-color-iron-icon-thick-3: #394152;
--shadow-sm: 0px;
--shadow-md: 0px;
--brand-skyline: #00b5ff;
--brand-aqua: #00c8ff;
--brand-violet: #9327ff;
--brand-amethyst: #8427e0;
--brand-berry: #e3006d;
--brand-coral: #fb006d;
--brand-golden: #f7931e;
--brand-amber: #ffbd00;
--brand-lemon: #ffce00;
--other-colors-text-highlight: #a9e2ff;
--spacing-spacing-0: 0px;
--spacing-spacing-xs: 4px;
--spacing-spacing-s: 6px;
--spacing-spacing-m: 8px;
--spacing-spacing-l: 12px;
--spacing-spacing-xl: 16px;
--spacing-spacing-xxl: 20px;
--spacing-spacing-full: 1000px;
--border-radius-border-radius-0: 0px;
--border-radius-border-radius-xs: 4px;
--border-radius-border-radius-s: 6px;
--border-radius-border-radius-m: 8px;
--border-radius-border-radius-l: 12px;
--border-radius-border-radius-xl: 16px;
--border-radius-border-radius-xxl: 20px;
--border-radius-border-radius-full: 1000px;
}

View File

@@ -0,0 +1,256 @@
/**
* Design system light theme variables
* AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY
*
* Generated from: semantic.light.json
* Generated time: 2025-03-31T09:19:58.455Z
*
* To modify these values, edit the source JSON files and run the token conversion script:
* node scripts/system-token/convert-tokens.cjs
*/
:root {
--text-primary: #21232a;
--text-secondary: #6f748c;
--text-tertiary: #b5bbd3;
--text-quaternary: #e4e8f5;
--text-inverse: #ffffff;
--text-on-fill: #ffffff;
--text-theme: #00b5ff;
--text-theme-hover: #0092d6;
--text-action: #00b5ff;
--text-action-hover: #0092d6;
--text-info: #00b5ff;
--text-info-hover: #0092d6;
--text-success: #248569;
--text-success-hover: #29725d;
--text-warning: #db7e21;
--text-warning-hover: #b75f17;
--text-error: #e71d32;
--text-error-hover: #ad1625;
--text-purple: #9327ff;
--text-purple-hover: #7a1dcc;
--icon-primary: #21232a;
--icon-secondary: #6f748c;
--icon-tertiary: #b5bbd3;
--icon-quaternary: #e4e8f5;
--icon-white: #ffffff;
--icon-purple-thick: #9327ff;
--icon-purple-thick-hover: #7a1dcc;
--border-grey-primary: #21232a;
--border-grey-primary-hover: #272930;
--border-grey-secondary: #3c3f4e;
--border-grey-secondary-hover: #54596e;
--border-grey-tertiary: #ced3e6;
--border-grey-tertiary-hover: #b5bbd3;
--border-grey-quaternary: #f8faff;
--border-grey-quaternary-hover: #e4e8f5;
--border-transparent: #ffffff00;
--border-theme-thick: #00b5ff;
--border-theme-thick-hover: #0092d6;
--border-info-thick: #00b5ff;
--border-info-thick-hover: #0092d6;
--border-success-thick: #248569;
--border-success-thick-hover: #29725d;
--border-warning-thick: #db7e21;
--border-warning-thick-hover: #b75f17;
--border-error-thick: #e71d32;
--border-error-thick-hover: #ad1625;
--border-purple-thick: #9327ff;
--border-purple-thick-hover: #7a1dcc;
--fill-primary: #21232a;
--fill-primary-hover: #272930;
--fill-secondary: #6f748c;
--fill-secondary-hover: #989eb7;
--fill-tertiary: #ced3e6;
--fill-tertiary-hover: #b5bbd3;
--fill-quaternary: #f8faff;
--fill-quaternary-hover: #e4e8f5;
--fill-transparent: #ffffff00;
--fill-primary-alpha-5: #1f23290d;
--fill-primary-alpha-5-hover: #1f23291a;
--fill-primary-alpha-80: #1f2329cc;
--fill-primary-alpha-80-hover: #1f2329b2;
--fill-white: #ffffff;
--fill-white-alpha: #ffffff33;
--fill-white-alpha-hover: #ffffff4d;
--fill-black: #000000;
--fill-theme-light: #e3f6ff;
--fill-theme-light-hover: #a9e2ff;
--fill-theme-thick: #00b5ff;
--fill-theme-thick-hover: #0092d6;
--fill-theme-select: #00b5ff26;
--fill-info-light: #e3f6ff;
--fill-info-light-hover: #a9e2ff;
--fill-info-thick: #00b5ff;
--fill-info-thick-hover: #0092d6;
--fill-success-light: #ecf9f5;
--fill-success-light-hover: #c3e5d8;
--fill-success-thick: #248569;
--fill-success-thick-hover: #29725d;
--fill-warning-light: #fff3d5;
--fill-warning-light-hover: #ffe4ab;
--fill-warning-thick: #db7e21;
--fill-warning-thick-hover: #b75f17;
--fill-error-light: #ffd2dd;
--fill-error-light-hover: #ffa5b4;
--fill-error-thick: #e71d32;
--fill-error-thick-hover: #ad1625;
--fill-error-select: #f336411a;
--fill-purple-light: #f1e0ff;
--fill-purple-light-hover: #e1b3ff;
--fill-purple-thick-hover: #7a1dcc;
--fill-purple-thick: #9327ff;
--surface-primary: #ffffff;
--surface-overlay: #00000099;
--background-primary: #ffffff;
--background-secondary: #f8faff;
--background-tertiary: #e4e8f5;
--background-quaternary: #ced3e6;
--badge-color-rose-rose-light-1: #fcf2f2;
--badge-color-rose-rose-light-2: #fae3e3;
--badge-color-rose-rose-light-3: #fad9d9;
--badge-color-rose-rose-thick-1: #edadad;
--badge-color-rose-rose-thick-2: #cc4e4e;
--badge-color-rose-rose-thick-3: #702828;
--badge-color-papaya-papaya-light-1: #fcf4f0;
--badge-color-papaya-papaya-light-2: #fae8de;
--badge-color-papaya-papaya-light-3: #fadfd2;
--badge-color-papaya-papaya-thick-1: #f0bda3;
--badge-color-papaya-papaya-thick-2: #d67240;
--badge-color-papaya-papaya-thick-3: #6b3215;
--badge-color-tangerine-tangerine-light-1: #fff7ed;
--badge-color-tangerine-tangerine-light-2: #fcedd9;
--badge-color-tangerine-tangerine-light-3: #fae5ca;
--badge-color-tangerine-tangerine-thick-1: #f2cb99;
--badge-color-tangerine-tangerine-thick-2: #db8f2c;
--badge-color-tangerine-tangerine-thick-3: #613b0a;
--badge-color-mango-mango-light-1: #fff9ec;
--badge-color-mango-mango-light-2: #fcf1d7;
--badge-color-mango-mango-light-3: #fae9c3;
--badge-color-mango-mango-thick-1: #f5d68e;
--badge-color-mango-mango-thick-2: #e0a416;
--badge-color-mango-mango-thick-3: #5c4102;
--badge-color-lemon-lemon-light-1: #fffbe8;
--badge-color-lemon-lemon-light-2: #fcf5cf;
--badge-color-lemon-lemon-light-3: #faefb9;
--badge-color-lemon-lemon-thick-1: #f5e282;
--badge-color-lemon-lemon-thick-2: #e0bb00;
--badge-color-lemon-lemon-thick-3: #574800;
--badge-color-olive-olive-light-1: #f9fae6;
--badge-color-olive-olive-light-2: #f6f7d0;
--badge-color-olive-olive-light-3: #f0f2b3;
--badge-color-olive-olive-thick-1: #dbde83;
--badge-color-olive-olive-thick-2: #adb204;
--badge-color-olive-olive-thick-3: #4a4c03;
--badge-color-lime-lime-light-1: #f6f9e6;
--badge-color-lime-lime-light-2: #eef5ce;
--badge-color-lime-lime-light-3: #e7f0bb;
--badge-color-lime-lime-thick-1: #cfdb91;
--badge-color-lime-lime-thick-2: #92a822;
--badge-color-lime-lime-thick-3: #414d05;
--badge-color-grass-grass-light-1: #f4faeb;
--badge-color-grass-grass-light-2: #e9f5d7;
--badge-color-grass-grass-light-3: #def0c5;
--badge-color-grass-grass-thick-1: #bfd998;
--badge-color-grass-grass-thick-2: #75a828;
--badge-color-grass-grass-thick-3: #334d0c;
--badge-color-forest-forest-light-1: #f1faf0;
--badge-color-forest-forest-light-2: #e2f5df;
--badge-color-forest-forest-light-3: #d7f0d3;
--badge-color-forest-forest-thick-1: #a8d6a1;
--badge-color-forest-forest-thick-2: #49a33b;
--badge-color-forest-forest-thick-3: #1e4f16;
--badge-color-jade-jade-light-1: #f0faf6;
--badge-color-jade-jade-light-2: #dff5eb;
--badge-color-jade-jade-light-3: #cef0e1;
--badge-color-jade-jade-thick-1: #90d1b5;
--badge-color-jade-jade-thick-2: #1c9963;
--badge-color-jade-jade-thick-3: #075231;
--badge-color-aqua-aqua-light-1: #f0f9fa;
--badge-color-aqua-aqua-light-2: #dff3f5;
--badge-color-aqua-aqua-light-3: #ccecf0;
--badge-color-aqua-aqua-thick-1: #83ccd4;
--badge-color-aqua-aqua-thick-2: #008e9e;
--badge-color-aqua-aqua-thick-3: #004e57;
--badge-color-azure-azure-light-1: #f0f6fa;
--badge-color-azure-azure-light-2: #e1eef7;
--badge-color-azure-azure-light-3: #d3e6f5;
--badge-color-azure-azure-thick-1: #88c0eb;
--badge-color-azure-azure-thick-2: #0877cc;
--badge-color-azure-azure-thick-3: #154469;
--badge-color-denim-denim-light-1: #f0f3fa;
--badge-color-denim-denim-light-2: #e3ebfa;
--badge-color-denim-denim-light-3: #d7e2f7;
--badge-color-denim-denim-thick-1: #9ab6ed;
--badge-color-denim-denim-thick-2: #3267d1;
--badge-color-denim-denim-thick-3: #223c70;
--badge-color-mauve-mauve-light-1: #f2f2fc;
--badge-color-mauve-mauve-thick-2: #5555e0;
--badge-color-mauve-mauve-thick-3: #36366b;
--badge-color-mauve-mauve-thick-1: #aeaef5;
--badge-color-lavender-lavender-light-1: #f6f3fc;
--badge-color-lavender-lavender-light-2: #ebe3fa;
--badge-color-lavender-lavender-light-3: #e4daf7;
--badge-color-lavender-lavender-thick-1: #c1aaf0;
--badge-color-lavender-lavender-thick-2: #8153db;
--badge-color-lavender-lavender-thick-3: #462f75;
--badge-color-lilac-liliac-light-1: #f7f0fa;
--badge-color-lilac-liliac-light-2: #f0e1f7;
--badge-color-lilac-liliac-light-3: #edd7f7;
--badge-color-lilac-liliac-thick-1: #d3a9e8;
--badge-color-lilac-liliac-thick-2: #9e4cc7;
--badge-color-lilac-liliac-thick-3: #562d6b;
--badge-color-mallow-mallow-light-1: #faf0fa;
--badge-color-mallow-mallow-light-2: #f5e1f4;
--badge-color-mallow-mallow-light-3: #f5d7f4;
--badge-color-mallow-mallow-thick-1: #dea4dc;
--badge-color-mallow-mallow-thick-2: #b240af;
--badge-color-mallow-mallow-thick-3: #632861;
--badge-color-camellia-camellia-light-1: #f9eff3;
--badge-color-camellia-camellia-light-2: #f7e1eb;
--badge-color-camellia-camellia-light-3: #f7d7e5;
--badge-color-camellia-camellia-thick-1: #e5a3c0;
--badge-color-camellia-camellia-thick-2: #c24279;
--badge-color-camellia-camellia-thick-3: #6e2343;
--badge-color-smoke-smoke-light-1: #f5f5f5;
--badge-color-smoke-smoke-light-2: #e8e8e8;
--badge-color-smoke-smoke-light-3: #dedede;
--badge-color-smoke-smoke-thick-1: #b8b8b8;
--badge-color-smoke-smoke-thick-2: #6e6e6e;
--badge-color-smoke-smoke-thick-3: #404040;
--badge-color-iron-icon-light-1: #f2f4f7;
--badge-color-iron-icon-light-2: #e6e9f0;
--badge-color-iron-icon-light-3: #dadee5;
--badge-color-iron-icon-thick-1: #b0b5bf;
--badge-color-iron-icon-thick-2: #666f80;
--badge-color-iron-icon-thick-3: #394152;
--shadow-sm: 0px;
--shadow-md: 0px;
--brand-skyline: #00b5ff;
--brand-aqua: #00c8ff;
--brand-violet: #9327ff;
--brand-amethyst: #8427e0;
--brand-berry: #e3006d;
--brand-coral: #fb006d;
--brand-golden: #f7931e;
--brand-amber: #ffbd00;
--brand-lemon: #ffce00;
--other-colors-text-highlight: #a9e2ff;
--spacing-spacing-0: 0px;
--spacing-spacing-xs: 4px;
--spacing-spacing-s: 6px;
--spacing-spacing-m: 8px;
--spacing-spacing-l: 12px;
--spacing-spacing-xl: 16px;
--spacing-spacing-xxl: 20px;
--spacing-spacing-full: 1000px;
--border-radius-border-radius-0: 0px;
--border-radius-border-radius-xs: 4px;
--border-radius-border-radius-s: 6px;
--border-radius-border-radius-m: 8px;
--border-radius-border-radius-l: 12px;
--border-radius-border-radius-xl: 16px;
--border-radius-border-radius-xxl: 20px;
--border-radius-border-radius-full: 1000px;
}

View File

@@ -14,6 +14,32 @@ module.exports = {
extend: {
colors,
boxShadow,
borderRadius: {
100: '4px',
200: '6px',
300: '8px',
400: '12px',
500: '16px',
600: '20px',
xs: '4px',
sm: '6px',
md: '12px',
lg: '16px',
xl: '20px',
},
padding: {
100: '4px',
200: '6px',
300: '8px',
400: '12px',
500: '16px',
600: '20px',
xs: '4px',
sm: '6px',
md: '12px',
lg: '16px',
xl: '20px',
},
},
},
plugins: [],

View File

@@ -1,11 +1,9 @@
/**
* Do not edit directly
* Generated on Thu, 27 Mar 2025 11:44:33 GMT
* Generated from $pnpm css:variables
*/
module.exports = {
"md": "var(--shadow)"
'md': 'var(--shadow)',
'popover': 'var(--custom-shadow-sm)',
'menu': 'var(--custom-shadow-sm)',
'toolbar': 'var(--custom-shadow-sm)',
'dialog': 'var(--custom-shadow-md)',
'toast': 'var(--custom-shadow-md)',
'tooltip': 'var(--custom-shadow-md)',
};

View File

@@ -1,114 +1,115 @@
/**
* Do not edit directly
* Generated on Thu, 27 Mar 2025 11:44:33 GMT
* Generated from $pnpm css:variables
*/
const newColors = require('./new-colors.cjs');
module.exports = {
"bg": {
"selection": "var(--bg-selection)",
"body": "var(--bg-body)",
"base": "var(--bg-base)",
"mask": "var(--bg-mask)",
"tips": "var(--bg-tips)",
"brand": "var(--bg-brand)",
"header": "var(--bg-header)",
"footer": "var(--bg-footer)"
'bg': {
'selection': 'var(--bg-selection)',
'body': 'var(--bg-body)',
'base': 'var(--bg-base)',
'mask': 'var(--bg-mask)',
'tips': 'var(--bg-tips)',
'brand': 'var(--bg-brand)',
'header': 'var(--bg-header)',
'footer': 'var(--bg-footer)',
},
"text": {
"title": "var(--text-title)",
"caption": "var(--text-caption)",
"placeholder": "var(--text-placeholder)",
"disabled": "var(--text-disabled)",
"link-default": "var(--text-link-default)",
"link-hover": "var(--text-link-hover)",
"link-pressed": "var(--text-link-pressed)",
"link-disabled": "var(--text-link-disabled)"
'line': {
'border': 'var(--line-border)',
'divider': 'var(--line-divider)',
'default': 'var(--line-default)',
'on-toolbar': 'var(--line-on-toolbar)',
'card': 'var(--line-card)',
},
"icon": {
"primary": "var(--icon-primary)",
"secondary": "var(--icon-secondary)",
"disabled": "var(--icon-disabled)",
"on-toolbar": "var(--icon-on-toolbar)"
'content': {
'blue-400': 'var(--content-blue-400)',
'blue-300': 'var(--content-blue-300)',
'blue-600': 'var(--content-blue-600)',
'blue-700': 'var(--content-blue-700)',
'blue-800': 'var(--content-blue-800)',
'blue-900': 'var(--content-blue-900)',
'blue-100': 'var(--content-blue-100)',
'blue-200': 'var(--content-blue-200)',
'blue-50': 'var(--content-blue-50)',
'on-fill-hover': 'var(--content-on-fill-hover)',
'on-fill': 'var(--content-on-fill)',
'on-tag': 'var(--content-on-tag)',
},
"line": {
"border": "var(--line-border)",
"divider": "var(--line-divider)",
"default": "var(--line-default)",
"on-toolbar": "var(--line-on-toolbar)",
"card": "var(--line-card)"
'function': {
'error': 'var(--function-error)',
'error-hover': 'var(--function-error-hover)',
'warning': 'var(--function-warning)',
'warning-hover': 'var(--function-warning-hover)',
'success': 'var(--function-success)',
'success-hover': 'var(--function-success-hover)',
'info': 'var(--function-info)',
},
"fill": {
"toolbar": "var(--fill-toolbar)",
"default": "var(--fill-default)",
"hover": "var(--fill-hover)",
"pressed": "var(--fill-pressed)",
"active": "var(--fill-active)",
"list-hover": "var(--fill-list-hover)",
"list-active": "var(--fill-list-active)"
'tint': {
'purple': 'var(--tint-purple)',
'pink': 'var(--tint-pink)',
'red': 'var(--tint-red)',
'lime': 'var(--tint-lime)',
'green': 'var(--tint-green)',
'aqua': 'var(--tint-aqua)',
'blue': 'var(--tint-blue)',
'orange': 'var(--tint-orange)',
'yellow': 'var(--tint-yellow)',
},
"content": {
"blue-400": "var(--content-blue-400)",
"blue-300": "var(--content-blue-300)",
"blue-600": "var(--content-blue-600)",
"blue-700": "var(--content-blue-700)",
"blue-800": "var(--content-blue-800)",
"blue-900": "var(--content-blue-900)",
"blue-100": "var(--content-blue-100)",
"blue-200": "var(--content-blue-200)",
"blue-50": "var(--content-blue-50)",
"on-fill-hover": "var(--content-on-fill-hover)",
"on-fill": "var(--content-on-fill)",
"on-tag": "var(--content-on-tag)"
'scrollbar': {
'thumb': 'var(--scrollbar-thumb)',
'track': 'var(--scrollbar-track)',
},
"function": {
"error": "var(--function-error)",
"error-hover": "var(--function-error-hover)",
"warning": "var(--function-warning)",
"warning-hover": "var(--function-warning-hover)",
"success": "var(--function-success)",
"success-hover": "var(--function-success-hover)",
"info": "var(--function-info)"
'note': {
'header': 'var(--note-header)',
},
"tint": {
"purple": "var(--tint-purple)",
"pink": "var(--tint-pink)",
"red": "var(--tint-red)",
"lime": "var(--tint-lime)",
"green": "var(--tint-green)",
"aqua": "var(--tint-aqua)",
"blue": "var(--tint-blue)",
"orange": "var(--tint-orange)",
"yellow": "var(--tint-yellow)"
'billing': {
'primary': 'var(--billing-primary)',
'primary-hover': 'var(--billing-primary-hover)',
},
"badge": {
"purple": "var(--badge-purple)",
"pink": "var(--badge-pink)",
"red": "var(--badge-red)",
"lime": "var(--badge-lime)",
"green": "var(--badge-green)",
"aqua": "var(--badge-aqua)",
"blue": "var(--badge-blue)",
"orange": "var(--badge-orange)",
"yellow": "var(--badge-yellow)"
'ai': {
'primary': 'var(--ai-primary)',
},
"scrollbar": {
"thumb": "var(--scrollbar-thumb)",
"track": "var(--scrollbar-track)"
'writer': {
'placeholder': 'var(--writer-placeholder)',
},
"note": {
"header": "var(--note-header)"
...newColors,
'fill': {
'toolbar': 'var(--fill-toolbar)',
'default': 'var(--fill-default)',
'hover': 'var(--fill-hover)',
'pressed': 'var(--fill-pressed)',
'active': 'var(--fill-active)',
'list-hover': 'var(--fill-list-hover)',
'list-active': 'var(--fill-list-active)',
...newColors['fill'],
},
"billing": {
"primary": "var(--billing-primary)",
"primary-hover": "var(--billing-primary-hover)"
'text': {
'title': 'var(--text-title)',
'caption': 'var(--text-caption)',
'placeholder': 'var(--text-placeholder)',
'disabled': 'var(--text-disabled)',
'link-default': 'var(--text-link-default)',
'link-hover': 'var(--text-link-hover)',
'link-pressed': 'var(--text-link-pressed)',
'link-disabled': 'var(--text-link-disabled)',
...newColors['text'],
},
"ai": {
"primary": "var(--ai-primary)"
'icon': {
'primary': 'var(--icon-primary)',
'secondary': 'var(--icon-secondary)',
'disabled': 'var(--icon-disabled)',
'on-toolbar': 'var(--icon-on-toolbar)',
...newColors['icon'],
},
'badge': {
'purple': 'var(--badge-purple)',
'pink': 'var(--badge-pink)',
'red': 'var(--badge-red)',
'lime': 'var(--badge-lime)',
'green': 'var(--badge-green)',
'aqua': 'var(--badge-aqua)',
'blue': 'var(--badge-blue)',
'orange': 'var(--badge-orange)',
'yellow': 'var(--badge-yellow)',
...newColors['badge'],
},
"writer": {
"placeholder": "var(--writer-placeholder)"
}
};

266
tailwind/new-colors.cjs Normal file
View File

@@ -0,0 +1,266 @@
/**
* TailwindCSS color configuration
* AUTO-GENERATED FILE - DO NOT EDIT DIRECTLY
*
* This file is auto-generated by convert-tokens.cjs script
* Generation time: 2025-03-31T09:19:58.459Z
*
* To modify these colors, edit the source JSON files and run the token conversion script:
* node scripts/system-token/convert-tokens.cjs
*
* These colors reference CSS variables, ensure the corresponding CSS files are loaded
*/
module.exports = {
"text": {
"primary": "var(--text-primary)",
"secondary": "var(--text-secondary)",
"tertiary": "var(--text-tertiary)",
"quaternary": "var(--text-quaternary)",
"inverse": "var(--text-inverse)",
"on-fill": "var(--text-on-fill)",
"theme": "var(--text-theme)",
"theme-hover": "var(--text-theme-hover)",
"action": "var(--text-action)",
"action-hover": "var(--text-action-hover)",
"info": "var(--text-info)",
"info-hover": "var(--text-info-hover)",
"success": "var(--text-success)",
"success-hover": "var(--text-success-hover)",
"warning": "var(--text-warning)",
"warning-hover": "var(--text-warning-hover)",
"error": "var(--text-error)",
"error-hover": "var(--text-error-hover)",
"purple": "var(--text-purple)",
"purple-hover": "var(--text-purple-hover)"
},
"icon": {
"primary": "var(--icon-primary)",
"secondary": "var(--icon-secondary)",
"tertiary": "var(--icon-tertiary)",
"quaternary": "var(--icon-quaternary)",
"white": "var(--icon-white)",
"purple-thick": "var(--icon-purple-thick)",
"purple-thick-hover": "var(--icon-purple-thick-hover)"
},
"border": {
"grey-primary": "var(--border-grey-primary)",
"grey-primary-hover": "var(--border-grey-primary-hover)",
"grey-secondary": "var(--border-grey-secondary)",
"grey-secondary-hover": "var(--border-grey-secondary-hover)",
"grey-tertiary": "var(--border-grey-tertiary)",
"grey-tertiary-hover": "var(--border-grey-tertiary-hover)",
"grey-quaternary": "var(--border-grey-quaternary)",
"grey-quaternary-hover": "var(--border-grey-quaternary-hover)",
"transparent": "var(--border-transparent)",
"theme-thick": "var(--border-theme-thick)",
"theme-thick-hover": "var(--border-theme-thick-hover)",
"info-thick": "var(--border-info-thick)",
"info-thick-hover": "var(--border-info-thick-hover)",
"success-thick": "var(--border-success-thick)",
"success-thick-hover": "var(--border-success-thick-hover)",
"warning-thick": "var(--border-warning-thick)",
"warning-thick-hover": "var(--border-warning-thick-hover)",
"error-thick": "var(--border-error-thick)",
"error-thick-hover": "var(--border-error-thick-hover)",
"purple-thick": "var(--border-purple-thick)",
"purple-thick-hover": "var(--border-purple-thick-hover)",
"radius-border-radius-0": "var(--border-radius-border-radius-0)",
"radius-border-radius-xs": "var(--border-radius-border-radius-xs)",
"radius-border-radius-s": "var(--border-radius-border-radius-s)",
"radius-border-radius-m": "var(--border-radius-border-radius-m)",
"radius-border-radius-l": "var(--border-radius-border-radius-l)",
"radius-border-radius-xl": "var(--border-radius-border-radius-xl)",
"radius-border-radius-xxl": "var(--border-radius-border-radius-xxl)",
"radius-border-radius-full": "var(--border-radius-border-radius-full)"
},
"fill": {
"primary": "var(--fill-primary)",
"primary-hover": "var(--fill-primary-hover)",
"secondary": "var(--fill-secondary)",
"secondary-hover": "var(--fill-secondary-hover)",
"tertiary": "var(--fill-tertiary)",
"tertiary-hover": "var(--fill-tertiary-hover)",
"quaternary": "var(--fill-quaternary)",
"quaternary-hover": "var(--fill-quaternary-hover)",
"transparent": "var(--fill-transparent)",
"primary-alpha-5": "var(--fill-primary-alpha-5)",
"primary-alpha-5-hover": "var(--fill-primary-alpha-5-hover)",
"primary-alpha-80": "var(--fill-primary-alpha-80)",
"primary-alpha-80-hover": "var(--fill-primary-alpha-80-hover)",
"white": "var(--fill-white)",
"white-alpha": "var(--fill-white-alpha)",
"white-alpha-hover": "var(--fill-white-alpha-hover)",
"black": "var(--fill-black)",
"theme-light": "var(--fill-theme-light)",
"theme-light-hover": "var(--fill-theme-light-hover)",
"theme-thick": "var(--fill-theme-thick)",
"theme-thick-hover": "var(--fill-theme-thick-hover)",
"theme-select": "var(--fill-theme-select)",
"info-light": "var(--fill-info-light)",
"info-light-hover": "var(--fill-info-light-hover)",
"info-thick": "var(--fill-info-thick)",
"info-thick-hover": "var(--fill-info-thick-hover)",
"success-light": "var(--fill-success-light)",
"success-light-hover": "var(--fill-success-light-hover)",
"success-thick": "var(--fill-success-thick)",
"success-thick-hover": "var(--fill-success-thick-hover)",
"warning-light": "var(--fill-warning-light)",
"warning-light-hover": "var(--fill-warning-light-hover)",
"warning-thick": "var(--fill-warning-thick)",
"warning-thick-hover": "var(--fill-warning-thick-hover)",
"error-light": "var(--fill-error-light)",
"error-light-hover": "var(--fill-error-light-hover)",
"error-thick": "var(--fill-error-thick)",
"error-thick-hover": "var(--fill-error-thick-hover)",
"error-select": "var(--fill-error-select)",
"purple-light": "var(--fill-purple-light)",
"purple-light-hover": "var(--fill-purple-light-hover)",
"purple-thick-hover": "var(--fill-purple-thick-hover)",
"purple-thick": "var(--fill-purple-thick)"
},
"surface": {
"primary": "var(--surface-primary)",
"overlay": "var(--surface-overlay)"
},
"background": {
"primary": "var(--background-primary)",
"secondary": "var(--background-secondary)",
"tertiary": "var(--background-tertiary)",
"quaternary": "var(--background-quaternary)"
},
"badge": {
"color-rose-rose-light-1": "var(--badge-color-rose-rose-light-1)",
"color-rose-rose-light-2": "var(--badge-color-rose-rose-light-2)",
"color-rose-rose-light-3": "var(--badge-color-rose-rose-light-3)",
"color-rose-rose-thick-1": "var(--badge-color-rose-rose-thick-1)",
"color-rose-rose-thick-2": "var(--badge-color-rose-rose-thick-2)",
"color-rose-rose-thick-3": "var(--badge-color-rose-rose-thick-3)",
"color-papaya-papaya-light-1": "var(--badge-color-papaya-papaya-light-1)",
"color-papaya-papaya-light-2": "var(--badge-color-papaya-papaya-light-2)",
"color-papaya-papaya-light-3": "var(--badge-color-papaya-papaya-light-3)",
"color-papaya-papaya-thick-1": "var(--badge-color-papaya-papaya-thick-1)",
"color-papaya-papaya-thick-2": "var(--badge-color-papaya-papaya-thick-2)",
"color-papaya-papaya-thick-3": "var(--badge-color-papaya-papaya-thick-3)",
"color-tangerine-tangerine-light-1": "var(--badge-color-tangerine-tangerine-light-1)",
"color-tangerine-tangerine-light-2": "var(--badge-color-tangerine-tangerine-light-2)",
"color-tangerine-tangerine-light-3": "var(--badge-color-tangerine-tangerine-light-3)",
"color-tangerine-tangerine-thick-1": "var(--badge-color-tangerine-tangerine-thick-1)",
"color-tangerine-tangerine-thick-2": "var(--badge-color-tangerine-tangerine-thick-2)",
"color-tangerine-tangerine-thick-3": "var(--badge-color-tangerine-tangerine-thick-3)",
"color-mango-mango-light-1": "var(--badge-color-mango-mango-light-1)",
"color-mango-mango-light-2": "var(--badge-color-mango-mango-light-2)",
"color-mango-mango-light-3": "var(--badge-color-mango-mango-light-3)",
"color-mango-mango-thick-1": "var(--badge-color-mango-mango-thick-1)",
"color-mango-mango-thick-2": "var(--badge-color-mango-mango-thick-2)",
"color-mango-mango-thick-3": "var(--badge-color-mango-mango-thick-3)",
"color-lemon-lemon-light-1": "var(--badge-color-lemon-lemon-light-1)",
"color-lemon-lemon-light-2": "var(--badge-color-lemon-lemon-light-2)",
"color-lemon-lemon-light-3": "var(--badge-color-lemon-lemon-light-3)",
"color-lemon-lemon-thick-1": "var(--badge-color-lemon-lemon-thick-1)",
"color-lemon-lemon-thick-2": "var(--badge-color-lemon-lemon-thick-2)",
"color-lemon-lemon-thick-3": "var(--badge-color-lemon-lemon-thick-3)",
"color-olive-olive-light-1": "var(--badge-color-olive-olive-light-1)",
"color-olive-olive-light-2": "var(--badge-color-olive-olive-light-2)",
"color-olive-olive-light-3": "var(--badge-color-olive-olive-light-3)",
"color-olive-olive-thick-1": "var(--badge-color-olive-olive-thick-1)",
"color-olive-olive-thick-2": "var(--badge-color-olive-olive-thick-2)",
"color-olive-olive-thick-3": "var(--badge-color-olive-olive-thick-3)",
"color-lime-lime-light-1": "var(--badge-color-lime-lime-light-1)",
"color-lime-lime-light-2": "var(--badge-color-lime-lime-light-2)",
"color-lime-lime-light-3": "var(--badge-color-lime-lime-light-3)",
"color-lime-lime-thick-1": "var(--badge-color-lime-lime-thick-1)",
"color-lime-lime-thick-2": "var(--badge-color-lime-lime-thick-2)",
"color-lime-lime-thick-3": "var(--badge-color-lime-lime-thick-3)",
"color-grass-grass-light-1": "var(--badge-color-grass-grass-light-1)",
"color-grass-grass-light-2": "var(--badge-color-grass-grass-light-2)",
"color-grass-grass-light-3": "var(--badge-color-grass-grass-light-3)",
"color-grass-grass-thick-1": "var(--badge-color-grass-grass-thick-1)",
"color-grass-grass-thick-2": "var(--badge-color-grass-grass-thick-2)",
"color-grass-grass-thick-3": "var(--badge-color-grass-grass-thick-3)",
"color-forest-forest-light-1": "var(--badge-color-forest-forest-light-1)",
"color-forest-forest-light-2": "var(--badge-color-forest-forest-light-2)",
"color-forest-forest-light-3": "var(--badge-color-forest-forest-light-3)",
"color-forest-forest-thick-1": "var(--badge-color-forest-forest-thick-1)",
"color-forest-forest-thick-2": "var(--badge-color-forest-forest-thick-2)",
"color-forest-forest-thick-3": "var(--badge-color-forest-forest-thick-3)",
"color-jade-jade-light-1": "var(--badge-color-jade-jade-light-1)",
"color-jade-jade-light-2": "var(--badge-color-jade-jade-light-2)",
"color-jade-jade-light-3": "var(--badge-color-jade-jade-light-3)",
"color-jade-jade-thick-1": "var(--badge-color-jade-jade-thick-1)",
"color-jade-jade-thick-2": "var(--badge-color-jade-jade-thick-2)",
"color-jade-jade-thick-3": "var(--badge-color-jade-jade-thick-3)",
"color-aqua-aqua-light-1": "var(--badge-color-aqua-aqua-light-1)",
"color-aqua-aqua-light-2": "var(--badge-color-aqua-aqua-light-2)",
"color-aqua-aqua-light-3": "var(--badge-color-aqua-aqua-light-3)",
"color-aqua-aqua-thick-1": "var(--badge-color-aqua-aqua-thick-1)",
"color-aqua-aqua-thick-2": "var(--badge-color-aqua-aqua-thick-2)",
"color-aqua-aqua-thick-3": "var(--badge-color-aqua-aqua-thick-3)",
"color-azure-azure-light-1": "var(--badge-color-azure-azure-light-1)",
"color-azure-azure-light-2": "var(--badge-color-azure-azure-light-2)",
"color-azure-azure-light-3": "var(--badge-color-azure-azure-light-3)",
"color-azure-azure-thick-1": "var(--badge-color-azure-azure-thick-1)",
"color-azure-azure-thick-2": "var(--badge-color-azure-azure-thick-2)",
"color-azure-azure-thick-3": "var(--badge-color-azure-azure-thick-3)",
"color-denim-denim-light-1": "var(--badge-color-denim-denim-light-1)",
"color-denim-denim-light-2": "var(--badge-color-denim-denim-light-2)",
"color-denim-denim-light-3": "var(--badge-color-denim-denim-light-3)",
"color-denim-denim-thick-1": "var(--badge-color-denim-denim-thick-1)",
"color-denim-denim-thick-2": "var(--badge-color-denim-denim-thick-2)",
"color-denim-denim-thick-3": "var(--badge-color-denim-denim-thick-3)",
"color-mauve-mauve-light-1": "var(--badge-color-mauve-mauve-light-1)",
"color-mauve-mauve-thick-2": "var(--badge-color-mauve-mauve-thick-2)",
"color-mauve-mauve-thick-3": "var(--badge-color-mauve-mauve-thick-3)",
"color-mauve-mauve-thick-1": "var(--badge-color-mauve-mauve-thick-1)",
"color-lavender-lavender-light-1": "var(--badge-color-lavender-lavender-light-1)",
"color-lavender-lavender-light-2": "var(--badge-color-lavender-lavender-light-2)",
"color-lavender-lavender-light-3": "var(--badge-color-lavender-lavender-light-3)",
"color-lavender-lavender-thick-1": "var(--badge-color-lavender-lavender-thick-1)",
"color-lavender-lavender-thick-2": "var(--badge-color-lavender-lavender-thick-2)",
"color-lavender-lavender-thick-3": "var(--badge-color-lavender-lavender-thick-3)",
"color-lilac-liliac-light-1": "var(--badge-color-lilac-liliac-light-1)",
"color-lilac-liliac-light-2": "var(--badge-color-lilac-liliac-light-2)",
"color-lilac-liliac-light-3": "var(--badge-color-lilac-liliac-light-3)",
"color-lilac-liliac-thick-1": "var(--badge-color-lilac-liliac-thick-1)",
"color-lilac-liliac-thick-2": "var(--badge-color-lilac-liliac-thick-2)",
"color-lilac-liliac-thick-3": "var(--badge-color-lilac-liliac-thick-3)",
"color-mallow-mallow-light-1": "var(--badge-color-mallow-mallow-light-1)",
"color-mallow-mallow-light-2": "var(--badge-color-mallow-mallow-light-2)",
"color-mallow-mallow-light-3": "var(--badge-color-mallow-mallow-light-3)",
"color-mallow-mallow-thick-1": "var(--badge-color-mallow-mallow-thick-1)",
"color-mallow-mallow-thick-2": "var(--badge-color-mallow-mallow-thick-2)",
"color-mallow-mallow-thick-3": "var(--badge-color-mallow-mallow-thick-3)",
"color-camellia-camellia-light-1": "var(--badge-color-camellia-camellia-light-1)",
"color-camellia-camellia-light-2": "var(--badge-color-camellia-camellia-light-2)",
"color-camellia-camellia-light-3": "var(--badge-color-camellia-camellia-light-3)",
"color-camellia-camellia-thick-1": "var(--badge-color-camellia-camellia-thick-1)",
"color-camellia-camellia-thick-2": "var(--badge-color-camellia-camellia-thick-2)",
"color-camellia-camellia-thick-3": "var(--badge-color-camellia-camellia-thick-3)",
"color-smoke-smoke-light-1": "var(--badge-color-smoke-smoke-light-1)",
"color-smoke-smoke-light-2": "var(--badge-color-smoke-smoke-light-2)",
"color-smoke-smoke-light-3": "var(--badge-color-smoke-smoke-light-3)",
"color-smoke-smoke-thick-1": "var(--badge-color-smoke-smoke-thick-1)",
"color-smoke-smoke-thick-2": "var(--badge-color-smoke-smoke-thick-2)",
"color-smoke-smoke-thick-3": "var(--badge-color-smoke-smoke-thick-3)",
"color-iron-icon-light-1": "var(--badge-color-iron-icon-light-1)",
"color-iron-icon-light-2": "var(--badge-color-iron-icon-light-2)",
"color-iron-icon-light-3": "var(--badge-color-iron-icon-light-3)",
"color-iron-icon-thick-1": "var(--badge-color-iron-icon-thick-1)",
"color-iron-icon-thick-2": "var(--badge-color-iron-icon-thick-2)",
"color-iron-icon-thick-3": "var(--badge-color-iron-icon-thick-3)"
},
"brand": {
"skyline": "var(--brand-skyline)",
"aqua": "var(--brand-aqua)",
"violet": "var(--brand-violet)",
"amethyst": "var(--brand-amethyst)",
"berry": "var(--brand-berry)",
"coral": "var(--brand-coral)",
"golden": "var(--brand-golden)",
"amber": "var(--brand-amber)",
"lemon": "var(--brand-lemon)"
},
"other": {
"colors-text-highlight": "var(--other-colors-text-highlight)"
}
};