From 96d5694fdb305028d7e6c26f2ca949213d64d6ff Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Fri, 22 May 2026 03:07:28 +0530 Subject: [PATCH 01/22] feat(tokens): sync espresso v2 design tokens from Figma + rebuild foundations docs MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Generator - tailwind/figma-tokens-to-theme.js reads the W3C DTCG token JSON exported from Figma (espresso-v2-design-tokens/) and emits tailwind/generated/{colors,radius,typography}.json - Run with `yarn sync-tokens` - Preserves legacy semantic names (surface-cards, surface-white, ink-gray-9, outline-gray-modals, …) via alias + legacy-entry maps so existing src/ and docs/ usage keeps working through the rename Tailwind - tailwind/colors.json refreshed from Figma; adds *.950 shades, gray-alpha and red-alpha ramps, surface/ink/outline updates - tailwind/plugin.js now consumes radius.json + typography.json instead of hardcoded scales; exposes new sizes (tiny, 4xl..15xl) and the full numeric radius scale (rounded-0..9) alongside the named aliases Docs - New /docs/foundations/* pages replacing /docs/design-system/*: Colours — Base, Colours — Semantic, Typography, Corner Radius, Drop Shadow - Components in docs/components/foundations/ read directly from the generated JSON; light/dark TabButtons toggle; click-to-copy - Layout.vue respects `outline: false` frontmatter (custom OnThisPage was previously unconditional) --- .gitignore | 4 +- components.d.ts | 5 +- docs/components/Docs/sidebarList.ts | 12 +- docs/components/Layout.vue | 2 +- docs/components/foundations/PalettePage.vue | 222 ++ docs/components/foundations/RadiusPage.vue | 93 + docs/components/foundations/SemanticPage.vue | 141 ++ .../components/foundations/TypographyPage.vue | 127 ++ docs/content/docs/design-system/[token].md | 23 - .../docs/design-system/[token].paths.ts | 125 -- docs/content/docs/foundations/colours/base.md | 11 + .../docs/foundations/colours/semantic.md | 11 + .../content/docs/foundations/corner-radius.md | 11 + docs/content/docs/foundations/drop-shadow.md | 11 + docs/content/docs/foundations/typography.md | 11 + .../Styles.Dark.tokens.json | 588 ++++++ .../Styles.Light.tokens.json | 588 ++++++ .../Tokens.Mode 1.tokens.json | 120 ++ .../Typography.Desktop.tokens.json | 204 ++ .../color.styles.tokens.json | 111 + .../effect.styles.tokens.json | 528 +++++ .../grid.styles.tokens.json | 25 + espresso-v2-design-tokens/manifest.json | 44 + .../text.styles.tokens.json | 1804 +++++++++++++++++ ...4\265 Colour primitives.Light.tokens.json" | 1358 +++++++++++++ package.json | 3 +- tailwind/colors.json | 882 ++++---- tailwind/figma-tokens-to-theme.js | 351 ++++ tailwind/generated/colors.json | 675 ++++++ tailwind/generated/radius.json | 20 + tailwind/generated/typography.json | 140 ++ tailwind/plugin.js | 61 +- 32 files changed, 7796 insertions(+), 515 deletions(-) create mode 100644 docs/components/foundations/PalettePage.vue create mode 100644 docs/components/foundations/RadiusPage.vue create mode 100644 docs/components/foundations/SemanticPage.vue create mode 100644 docs/components/foundations/TypographyPage.vue delete mode 100644 docs/content/docs/design-system/[token].md delete mode 100644 docs/content/docs/design-system/[token].paths.ts create mode 100644 docs/content/docs/foundations/colours/base.md create mode 100644 docs/content/docs/foundations/colours/semantic.md create mode 100644 docs/content/docs/foundations/corner-radius.md create mode 100644 docs/content/docs/foundations/drop-shadow.md create mode 100644 docs/content/docs/foundations/typography.md create mode 100644 espresso-v2-design-tokens/Styles.Dark.tokens.json create mode 100644 espresso-v2-design-tokens/Styles.Light.tokens.json create mode 100644 espresso-v2-design-tokens/Tokens.Mode 1.tokens.json create mode 100644 espresso-v2-design-tokens/Typography.Desktop.tokens.json create mode 100644 espresso-v2-design-tokens/color.styles.tokens.json create mode 100644 espresso-v2-design-tokens/effect.styles.tokens.json create mode 100644 espresso-v2-design-tokens/grid.styles.tokens.json create mode 100644 espresso-v2-design-tokens/manifest.json create mode 100644 espresso-v2-design-tokens/text.styles.tokens.json create mode 100644 "espresso-v2-design-tokens/\360\237\224\265 Colour primitives.Light.tokens.json" create mode 100644 tailwind/figma-tokens-to-theme.js create mode 100644 tailwind/generated/colors.json create mode 100644 tailwind/generated/radius.json create mode 100644 tailwind/generated/typography.json diff --git a/.gitignore b/.gitignore index 8b3285e00..a409e24fd 100644 --- a/.gitignore +++ b/.gitignore @@ -41,4 +41,6 @@ docs/content/docs/components/*.md coverage .nyc_output -cypress/screenshots \ No newline at end of file +cypress/screenshots + +.tmp-screenshots diff --git a/components.d.ts b/components.d.ts index f5619dbc8..6554d2161 100644 --- a/components.d.ts +++ b/components.d.ts @@ -1,8 +1,11 @@ /* eslint-disable */ // @ts-nocheck +// biome-ignore lint: disable +// oxlint-disable +// ------ // Generated by unplugin-vue-components // Read more: https://github.com/vuejs/core/pull/3399 -// biome-ignore lint: disable + export {} /* prettier-ignore */ diff --git a/docs/components/Docs/sidebarList.ts b/docs/components/Docs/sidebarList.ts index f312019f0..074375581 100644 --- a/docs/components/Docs/sidebarList.ts +++ b/docs/components/Docs/sidebarList.ts @@ -42,13 +42,13 @@ export function getSidebarList(componentList: string[]): SidebarSection[] { ], }, { - text: 'Design System', + text: 'Foundations', items: [ - { text: 'Background Color', link: '/docs/design-system/background-color' }, - { text: 'Text Design', link: '/docs/design-system/text' }, - { text: 'Border Color', link: '/docs/design-system/border-color' }, - { text: 'Drop Shadow', link: '/docs/design-system/drop-shadow' }, - { text: 'Border Radius', link: '/docs/design-system/border-radius' }, + { text: 'Colours — Base', link: '/docs/foundations/colours/base' }, + { text: 'Colours — Semantic', link: '/docs/foundations/colours/semantic' }, + { text: 'Typography', link: '/docs/foundations/typography' }, + { text: 'Corner Radius', link: '/docs/foundations/corner-radius' }, + { text: 'Drop Shadow', link: '/docs/foundations/drop-shadow' }, ], }, { diff --git a/docs/components/Layout.vue b/docs/components/Layout.vue index 9d9928633..0cb03bab6 100644 --- a/docs/components/Layout.vue +++ b/docs/components/Layout.vue @@ -41,7 +41,7 @@ const { frontmatter } = useData() /> - + diff --git a/docs/components/foundations/PalettePage.vue b/docs/components/foundations/PalettePage.vue new file mode 100644 index 000000000..9a5dc5161 --- /dev/null +++ b/docs/components/foundations/PalettePage.vue @@ -0,0 +1,222 @@ + + + diff --git a/docs/components/foundations/RadiusPage.vue b/docs/components/foundations/RadiusPage.vue new file mode 100644 index 000000000..01da75f5d --- /dev/null +++ b/docs/components/foundations/RadiusPage.vue @@ -0,0 +1,93 @@ + + + diff --git a/docs/components/foundations/SemanticPage.vue b/docs/components/foundations/SemanticPage.vue new file mode 100644 index 000000000..99f8336aa --- /dev/null +++ b/docs/components/foundations/SemanticPage.vue @@ -0,0 +1,141 @@ + + + diff --git a/docs/components/foundations/TypographyPage.vue b/docs/components/foundations/TypographyPage.vue new file mode 100644 index 000000000..946ac76ee --- /dev/null +++ b/docs/components/foundations/TypographyPage.vue @@ -0,0 +1,127 @@ + + + diff --git a/docs/content/docs/design-system/[token].md b/docs/content/docs/design-system/[token].md deleted file mode 100644 index 8234e7149..000000000 --- a/docs/content/docs/design-system/[token].md +++ /dev/null @@ -1,23 +0,0 @@ - - -

-{{ title }} -

- - - - - - diff --git a/docs/content/docs/design-system/[token].paths.ts b/docs/content/docs/design-system/[token].paths.ts deleted file mode 100644 index 356bcbb51..000000000 --- a/docs/content/docs/design-system/[token].paths.ts +++ /dev/null @@ -1,125 +0,0 @@ -import resolveConfig from 'tailwindcss/resolveConfig' -import config from '../../../../tailwind.config' - -const designTokens = resolveConfig(config).theme - -const getBgColors = () => { - let colors: { name: string; value?: string }[] = [] - const list = designTokens.backgroundColor.surface - - for (const [key, value] of Object.entries(list)) { - const classname = `bg-surface-${key}` - - if (colors.length > 0) { - const lastcolor = colors.at(-1).name.split('-')[2] - const curColor = key.split('-')[0] - if (lastcolor !== curColor) colors.push({ name: curColor }) - } - - colors.push({ name: classname, value }) - } - - return colors -} - -const bgColors = getBgColors() - -const getTextColors = () => { - let colors: { name: string; value?: string }[] = [] - const list = designTokens.textColor.ink - - for (const [key, value] of Object.entries(list)) { - const classname = `text-ink-${key}` - - if (colors.length > 0) { - const lastcolor = colors.at(-1).name.split('-')[2] - const curColor = key.split('-')[0] - if (lastcolor !== curColor) colors.push({ name: curColor }) - } - - colors.push({ name: classname, value }) - } - - return colors -} - -const txtColors = getTextColors() - -const getBorderColors = () => { - let colors: { name: string; value?: string }[] = [] - const list = designTokens.borderColor.outline - - for (const [key, value] of Object.entries(list)) { - const classname = `border-outline-${key}` - - if (colors.length > 0) { - const lastcolor = colors.at(-1).name.split('-')[2] - const curColor = key.split('-')[0] - if (lastcolor !== curColor) colors.push({ name: curColor }) - } - - colors.push({ name: classname, value }) - } - - return colors -} - -const borderColors = getBorderColors() - -const fontSize = Object.entries(designTokens.fontSize).map(([name, value]) => ({ - name, - value, -})) - -const fontWeight = Object.entries(designTokens.fontWeight).map( - ([name, value]) => ({ - name, - value, - }), -) - -const letterSpacing = Object.entries(designTokens.letterSpacing).map( - ([name, value]) => ({ - name, - value, - }), -) - -const lineHeight = Object.entries(designTokens.lineHeight).map( - ([name, value]) => ({ - name, - value, - }), -) - -// const dropShadow = Object.entries(designTokens.dropShadow).map( -// ([name, value]) => ({ -// name, -// value, -// }), -// ) - -const borderRadius = Object.entries(designTokens.borderRadius).map( - ([name, value]) => ({ - name, - value, - }), -) - -export default { - paths() { - return [ - { params: { token: 'background-color', data: bgColors } }, - { params: { token: 'text-color', data: txtColors } }, - { params: { token: 'border-color', data: borderColors } }, - { - params: { - token: 'text', - data: { fontSize, fontWeight, letterSpacing, lineHeight, txtColors }, - }, - }, - { params: { token: 'drop-shadow' } }, - { params: { token: 'border-radius', data: borderRadius } }, - ] - }, -} diff --git a/docs/content/docs/foundations/colours/base.md b/docs/content/docs/foundations/colours/base.md new file mode 100644 index 000000000..09e5abd9e --- /dev/null +++ b/docs/content/docs/foundations/colours/base.md @@ -0,0 +1,11 @@ +--- +outline: false +--- + + + +# Base Palette + + diff --git a/docs/content/docs/foundations/colours/semantic.md b/docs/content/docs/foundations/colours/semantic.md new file mode 100644 index 000000000..b4d0afd94 --- /dev/null +++ b/docs/content/docs/foundations/colours/semantic.md @@ -0,0 +1,11 @@ +--- +outline: false +--- + + + +# Semantic Colours + + diff --git a/docs/content/docs/foundations/corner-radius.md b/docs/content/docs/foundations/corner-radius.md new file mode 100644 index 000000000..0b8eacb57 --- /dev/null +++ b/docs/content/docs/foundations/corner-radius.md @@ -0,0 +1,11 @@ +--- +outline: false +--- + + + +# Corner Radius + + diff --git a/docs/content/docs/foundations/drop-shadow.md b/docs/content/docs/foundations/drop-shadow.md new file mode 100644 index 000000000..b50726df3 --- /dev/null +++ b/docs/content/docs/foundations/drop-shadow.md @@ -0,0 +1,11 @@ +--- +outline: false +--- + + + +# Drop Shadow + + diff --git a/docs/content/docs/foundations/typography.md b/docs/content/docs/foundations/typography.md new file mode 100644 index 000000000..6a74a1020 --- /dev/null +++ b/docs/content/docs/foundations/typography.md @@ -0,0 +1,11 @@ +--- +outline: false +--- + + + +# Typography + + diff --git a/espresso-v2-design-tokens/Styles.Dark.tokens.json b/espresso-v2-design-tokens/Styles.Dark.tokens.json new file mode 100644 index 000000000..9e461d92c --- /dev/null +++ b/espresso-v2-design-tokens/Styles.Dark.tokens.json @@ -0,0 +1,588 @@ +{ + "surface": { + "base": { + "$type": "color", + "$value": "{dark.gray.950}" + }, + "gray-1": { + "$type": "color", + "$value": "{dark.gray.800}" + }, + "gray-2": { + "$type": "color", + "$value": "{dark.gray.700}" + }, + "gray-3": { + "$type": "color", + "$value": "{dark.gray.600}" + }, + "gray-4": { + "$type": "color", + "$value": "{dark.gray.500}" + }, + "gray-5": { + "$type": "color", + "$value": "{dark.gray.200}" + }, + "gray-6": { + "$type": "color", + "$value": "{dark.gray.100}" + }, + "gray-7": { + "$type": "color", + "$value": "{dark.gray.50}" + }, + "menu-bar": { + "$type": "color", + "$value": "{dark.gray.950}" + }, + "base-contrast": { + "$type": "color", + "$value": "{dark.gray.900}" + }, + "gray-1-contrast": { + "$type": "color", + "$value": "{dark.gray.900}" + }, + "gray-2-contrast": { + "$type": "color", + "$value": "{dark.gray.600}" + }, + "red-1": { + "$type": "color", + "$value": "{dark.red.950}" + }, + "red-2": { + "$type": "color", + "$value": "{dark.red.900}" + }, + "red-3": { + "$type": "color", + "$value": "{dark.red.800}" + }, + "red-4": { + "$type": "color", + "$value": "{dark.red.700}" + }, + "red-5": { + "$type": "color", + "$value": "{dark.red.500}" + }, + "red-6": { + "$type": "color", + "$value": "{dark.red.400}" + }, + "red-7": { + "$type": "color", + "$value": "{dark.red.600}" + }, + "green-1": { + "$type": "color", + "$value": "{dark.green.900}" + }, + "green-2": { + "$type": "color", + "$value": "{dark.green.900}" + }, + "green-3": { + "$type": "color", + "$value": "{dark.green.800}" + }, + "green-4": { + "$type": "color", + "$value": "{dark.green.700}" + }, + "green-5": { + "$type": "color", + "$value": "{dark.green.500}" + }, + "green-6": { + "$type": "color", + "$value": "{dark.green.400}" + }, + "green-7": { + "$type": "color", + "$value": "{dark.green.600}" + }, + "amber-1": { + "$type": "color", + "$value": "{dark.amber.950}" + }, + "amber-2": { + "$type": "color", + "$value": "{dark.amber.900}" + }, + "amber-3": { + "$type": "color", + "$value": "{dark.amber.800}" + }, + "amber-4": { + "$type": "color", + "$value": "{dark.amber.700}" + }, + "amber-5": { + "$type": "color", + "$value": "{dark.amber.500}" + }, + "amber-6": { + "$type": "color", + "$value": "{dark.amber.400}" + }, + "amber-7": { + "$type": "color", + "$value": "{dark.amber.600}" + }, + "blue-1": { + "$type": "color", + "$value": "{dark.blue.950}" + }, + "blue-2": { + "$type": "color", + "$value": "{dark.blue.900}" + }, + "blue-3": { + "$type": "color", + "$value": "{dark.blue.800}" + }, + "blue-4": { + "$type": "color", + "$value": "{dark.blue.700}" + }, + "blue-5": { + "$type": "color", + "$value": "{dark.blue.500}" + }, + "blue-6": { + "$type": "color", + "$value": "{dark.blue.400}" + }, + "blue-7": { + "$type": "color", + "$value": "{dark.blue.600}" + }, + "orange-2": { + "$type": "color", + "$value": "{dark.orange.900}" + }, + "violet-2": { + "$type": "color", + "$value": "{dark.violet.900}" + }, + "violet-3": { + "$type": "color", + "$value": "{dark.violet.800}" + }, + "violet-4": { + "$type": "color", + "$value": "{dark.violet.700}" + }, + "violet-5": { + "$type": "color", + "$value": "{dark.violet.500}" + }, + "violet-6": { + "$type": "color", + "$value": "{dark.violet.400}" + }, + "violet-7": { + "$type": "color", + "$value": "{dark.violet.600}" + }, + "cyan-2": { + "$type": "color", + "$value": "{dark.cyan.900}" + }, + "alert-button-default": { + "$type": "color", + "$value": "{dark.gray.500}" + }, + "alert-button-info": { + "$type": "color", + "$value": "{dark.blue.700}" + }, + "alert-button-success": { + "$type": "color", + "$value": "{dark.green.700}" + }, + "alert-button-warning": { + "$type": "color", + "$value": "{dark.amber.700}" + }, + "alert-button-error": { + "$type": "color", + "$value": "{dark.red.700}" + } + }, + "surface-alpha": { + "base": { + "$type": "color", + "$value": "{dark.gray-alpha.950}" + }, + "gray-1": { + "$type": "color", + "$value": "{dark.gray-alpha.800}" + }, + "gray-2": { + "$type": "color", + "$value": "{dark.gray-alpha.700}" + }, + "gray-3": { + "$type": "color", + "$value": "{dark.gray-alpha.600}" + }, + "gray-4": { + "$type": "color", + "$value": "{dark.gray-alpha.500}" + }, + "gray-5": { + "$type": "color", + "$value": "{dark.gray-alpha.200}" + }, + "gray-6": { + "$type": "color", + "$value": "{dark.gray-alpha.100}" + }, + "gray-7": { + "$type": "color", + "$value": "{dark.gray-alpha.50}" + }, + "menu-bar": { + "$type": "color", + "$value": "{dark.gray-alpha.950}" + }, + "base-contrast": { + "$type": "color", + "$value": "{dark.gray-alpha.900}" + }, + "gray-1-contrast": { + "$type": "color", + "$value": "{dark.gray-alpha.800}" + }, + "gray-2-contrast": { + "$type": "color", + "$value": "{dark.gray-alpha.600}" + }, + "red-1": { + "$type": "color", + "$value": "{dark.red-alpha.950}" + }, + "red-2": { + "$type": "color", + "$value": "{dark.red-alpha.900}" + }, + "red-3": { + "$type": "color", + "$value": "{dark.red-alpha.800}" + }, + "red-4": { + "$type": "color", + "$value": "{dark.red-alpha.700}" + }, + "red-5": { + "$type": "color", + "$value": "{dark.red-alpha.500}" + }, + "red-6": { + "$type": "color", + "$value": "{dark.red-alpha.400}" + }, + "red-7": { + "$type": "color", + "$value": "{dark.red-alpha.600}" + }, + "gray-2-overlay": { + "$type": "color", + "$value": "{white-alpha.50}" + } + }, + "ink": { + "base": { + "$type": "color", + "$value": "{dark.gray.950}" + }, + "gray-1": { + "$type": "color", + "$value": "{dark.gray.800}" + }, + "gray-2": { + "$type": "color", + "$value": "{dark.gray.600}" + }, + "gray-3": { + "$type": "color", + "$value": "{dark.gray.500}" + }, + "gray-4": { + "$type": "color", + "$value": "{dark.gray.450}" + }, + "gray-5": { + "$type": "color", + "$value": "{dark.gray.400}" + }, + "gray-6": { + "$type": "color", + "$value": "{dark.gray.300}" + }, + "gray-7": { + "$type": "color", + "$value": "{dark.gray.200}" + }, + "gray-8": { + "$type": "color", + "$value": "{dark.gray.100}" + }, + "red-1": { + "$type": "color", + "$value": "{neutral.white}" + }, + "red-2": { + "$type": "color", + "$value": "{dark.red.700}" + }, + "red-3": { + "$type": "color", + "$value": "{dark.red.400}" + }, + "red-4": { + "$type": "color", + "$value": "{dark.red.300}" + }, + "green-1": { + "$type": "color", + "$value": "{neutral.white}" + }, + "green-2": { + "$type": "color", + "$value": "{dark.green.700}" + }, + "green-3": { + "$type": "color", + "$value": "{dark.green.400}" + }, + "green-4": { + "$type": "color", + "$value": "{dark.green.300}" + }, + "green-6": { + "$type": "color", + "$value": "{dark.green.400}" + }, + "amber-1": { + "$type": "color", + "$value": "{neutral.white}" + }, + "amber-2": { + "$type": "color", + "$value": "{dark.amber.700}" + }, + "amber-3": { + "$type": "color", + "$value": "{dark.amber.500}" + }, + "amber-4": { + "$type": "color", + "$value": "{dark.amber.400}" + }, + "blue-1": { + "$type": "color", + "$value": "{neutral.white}" + }, + "blue-2": { + "$type": "color", + "$value": "{dark.blue.700}" + }, + "blue-3": { + "$type": "color", + "$value": "{dark.blue.400}" + }, + "blue-4": { + "$type": "color", + "$value": "{dark.blue.300}" + }, + "cyan-3": { + "$type": "color", + "$value": "{dark.cyan.400}" + }, + "violet-1": { + "$type": "color", + "$value": "{neutral.white}" + }, + "violet-2": { + "$type": "color", + "$value": "{dark.violet.700}" + }, + "violet-3": { + "$type": "color", + "$value": "{dark.violet.400}" + }, + "violet-4": { + "$type": "color", + "$value": "{dark.violet.300}" + }, + "blue-link": { + "$type": "color", + "$value": "{dark.blue.500}" + }, + "alert-button-default": { + "$type": "color", + "$value": "{dark.gray.50}" + }, + "alert-button-info": { + "$type": "color", + "$value": "{dark.blue.200}" + }, + "alert-button-success": { + "$type": "color", + "$value": "{dark.green.200}" + }, + "alert-button-warning": { + "$type": "color", + "$value": "{dark.amber.200}" + }, + "alert-button-error": { + "$type": "color", + "$value": "{dark.red.200}" + } + }, + "outline": { + "base": { + "$type": "color", + "$value": "{dark.gray.950}" + }, + "gray-1": { + "$type": "color", + "$value": "{dark.gray.800}" + }, + "gray-1-contrast": { + "$type": "color", + "$value": "{dark.gray.700}" + }, + "gray-2": { + "$type": "color", + "$value": "{dark.gray.600}" + }, + "gray-3": { + "$type": "color", + "$value": "{dark.gray.500}" + }, + "gray-4": { + "$type": "color", + "$value": "{dark.gray.450}" + }, + "gray-5": { + "$type": "color", + "$value": "{light.gray.200}" + }, + "red-2": { + "$type": "color", + "$value": "{dark.red.800}" + }, + "red-3": { + "$type": "color", + "$value": "{dark.red.700}" + }, + "red-4": { + "$type": "color", + "$value": "{dark.red.600}" + }, + "green-2": { + "$type": "color", + "$value": "{dark.green.800}" + }, + "green-3": { + "$type": "color", + "$value": "{dark.green.700}" + }, + "green-4": { + "$type": "color", + "$value": "{dark.green.600}" + }, + "amber-2": { + "$type": "color", + "$value": "{dark.amber.800}" + }, + "amber-3": { + "$type": "color", + "$value": "{dark.amber.700}" + }, + "amber-4": { + "$type": "color", + "$value": "{dark.amber.600}" + }, + "blue-2": { + "$type": "color", + "$value": "{dark.blue.800}" + }, + "blue-3": { + "$type": "color", + "$value": "{dark.blue.700}" + }, + "blue-4": { + "$type": "color", + "$value": "{dark.blue.600}" + }, + "orange-3": { + "$type": "color", + "$value": "{dark.orange.700}" + }, + "violet-2": { + "$type": "color", + "$value": "{dark.violet.800}" + }, + "violet-3": { + "$type": "color", + "$value": "{dark.violet.700}" + }, + "violet-4": { + "$type": "color", + "$value": "{dark.violet.600}" + }, + "gray-modal": { + "$type": "color", + "$value": "{dark.gray.600}" + } + }, + "outline-alpha": { + "base": { + "$type": "color", + "$value": "{dark.gray-alpha.950}" + }, + "gray-1": { + "$type": "color", + "$value": "{dark.gray-alpha.800}" + }, + "gray-2": { + "$type": "color", + "$value": "{dark.gray-alpha.600}" + }, + "gray-3": { + "$type": "color", + "$value": "{dark.gray-alpha.500}" + }, + "gray-4": { + "$type": "color", + "$value": "{dark.gray-alpha.450}" + }, + "gray-5": { + "$type": "color", + "$value": "{dark.gray-alpha.200}" + }, + "red-2": { + "$type": "color", + "$value": "{dark.red-alpha.800}" + }, + "red-3": { + "$type": "color", + "$value": "{dark.red-alpha.700}" + }, + "red-4": { + "$type": "color", + "$value": "{dark.red-alpha.600}" + }, + "gray-modal": { + "$type": "color", + "$value": "{dark.gray-alpha.600}" + } + } +} \ No newline at end of file diff --git a/espresso-v2-design-tokens/Styles.Light.tokens.json b/espresso-v2-design-tokens/Styles.Light.tokens.json new file mode 100644 index 000000000..50b58bfa8 --- /dev/null +++ b/espresso-v2-design-tokens/Styles.Light.tokens.json @@ -0,0 +1,588 @@ +{ + "surface": { + "base": { + "$type": "color", + "$value": "{neutral.white}" + }, + "gray-1": { + "$type": "color", + "$value": "{light.gray.50}" + }, + "gray-2": { + "$type": "color", + "$value": "{light.gray.100}" + }, + "gray-3": { + "$type": "color", + "$value": "{light.gray.200}" + }, + "gray-4": { + "$type": "color", + "$value": "{light.gray.300}" + }, + "gray-5": { + "$type": "color", + "$value": "{light.gray.700}" + }, + "gray-6": { + "$type": "color", + "$value": "{light.gray.800}" + }, + "gray-7": { + "$type": "color", + "$value": "{light.gray.900}" + }, + "menu-bar": { + "$type": "color", + "$value": "{light.gray.50}" + }, + "base-contrast": { + "$type": "color", + "$value": "{neutral.white}" + }, + "gray-1-contrast": { + "$type": "color", + "$value": "{neutral.white}" + }, + "gray-2-contrast": { + "$type": "color", + "$value": "{neutral.white}" + }, + "red-1": { + "$type": "color", + "$value": "{light.red.50}" + }, + "red-2": { + "$type": "color", + "$value": "{light.red.100}" + }, + "red-3": { + "$type": "color", + "$value": "{light.red.200}" + }, + "red-4": { + "$type": "color", + "$value": "{light.red.300}" + }, + "red-5": { + "$type": "color", + "$value": "{light.red.600}" + }, + "red-6": { + "$type": "color", + "$value": "{light.red.700}" + }, + "red-7": { + "$type": "color", + "$value": "{light.red.800}" + }, + "green-1": { + "$type": "color", + "$value": "{light.green.50}" + }, + "green-2": { + "$type": "color", + "$value": "{light.green.100}" + }, + "green-3": { + "$type": "color", + "$value": "{light.green.200}" + }, + "green-4": { + "$type": "color", + "$value": "{light.green.300}" + }, + "green-5": { + "$type": "color", + "$value": "{light.green.600}" + }, + "green-6": { + "$type": "color", + "$value": "{light.green.700}" + }, + "green-7": { + "$type": "color", + "$value": "{light.green.800}" + }, + "amber-1": { + "$type": "color", + "$value": "{light.amber.50}" + }, + "amber-2": { + "$type": "color", + "$value": "{light.amber.100}" + }, + "amber-3": { + "$type": "color", + "$value": "{light.amber.200}" + }, + "amber-4": { + "$type": "color", + "$value": "{light.amber.300}" + }, + "amber-5": { + "$type": "color", + "$value": "{light.amber.600}" + }, + "amber-6": { + "$type": "color", + "$value": "{light.amber.700}" + }, + "amber-7": { + "$type": "color", + "$value": "{light.amber.800}" + }, + "blue-1": { + "$type": "color", + "$value": "{light.blue.50}" + }, + "blue-2": { + "$type": "color", + "$value": "{light.blue.100}" + }, + "blue-3": { + "$type": "color", + "$value": "{light.blue.200}" + }, + "blue-4": { + "$type": "color", + "$value": "{light.blue.300}" + }, + "blue-5": { + "$type": "color", + "$value": "{light.blue.600}" + }, + "blue-6": { + "$type": "color", + "$value": "{light.blue.700}" + }, + "blue-7": { + "$type": "color", + "$value": "{light.blue.800}" + }, + "orange-2": { + "$type": "color", + "$value": "{light.orange.100}" + }, + "violet-2": { + "$type": "color", + "$value": "{light.violet.100}" + }, + "violet-3": { + "$type": "color", + "$value": "{light.violet.200}" + }, + "violet-4": { + "$type": "color", + "$value": "{light.violet.300}" + }, + "violet-5": { + "$type": "color", + "$value": "{light.violet.600}" + }, + "violet-6": { + "$type": "color", + "$value": "{light.violet.700}" + }, + "violet-7": { + "$type": "color", + "$value": "{light.violet.800}" + }, + "cyan-2": { + "$type": "color", + "$value": "{light.cyan.100}" + }, + "alert-button-default": { + "$type": "color", + "$value": "{neutral.white}" + }, + "alert-button-info": { + "$type": "color", + "$value": "{neutral.white}" + }, + "alert-button-success": { + "$type": "color", + "$value": "{neutral.white}" + }, + "alert-button-warning": { + "$type": "color", + "$value": "{neutral.white}" + }, + "alert-button-error": { + "$type": "color", + "$value": "{neutral.white}" + } + }, + "surface-alpha": { + "base": { + "$type": "color", + "$value": "{neutral.white}" + }, + "gray-1": { + "$type": "color", + "$value": "{light.gray-alpha.50}" + }, + "gray-2": { + "$type": "color", + "$value": "{light.gray-alpha.100}" + }, + "gray-3": { + "$type": "color", + "$value": "{light.gray-alpha.200}" + }, + "gray-4": { + "$type": "color", + "$value": "{light.gray-alpha.300}" + }, + "gray-5": { + "$type": "color", + "$value": "{light.gray-alpha.700}" + }, + "gray-6": { + "$type": "color", + "$value": "{light.gray-alpha.800}" + }, + "gray-7": { + "$type": "color", + "$value": "{light.gray-alpha.900}" + }, + "menu-bar": { + "$type": "color", + "$value": "{light.gray.50}" + }, + "base-contrast": { + "$type": "color", + "$value": "{neutral.white}" + }, + "gray-1-contrast": { + "$type": "color", + "$value": "{neutral.white}" + }, + "gray-2-contrast": { + "$type": "color", + "$value": "{neutral.white}" + }, + "red-1": { + "$type": "color", + "$value": "{light.red.50}" + }, + "red-2": { + "$type": "color", + "$value": "{light.red.100}" + }, + "red-3": { + "$type": "color", + "$value": "{light.red.200}" + }, + "red-4": { + "$type": "color", + "$value": "{light.red.300}" + }, + "red-5": { + "$type": "color", + "$value": "{light.red.600}" + }, + "red-6": { + "$type": "color", + "$value": "{light.red.700}" + }, + "red-7": { + "$type": "color", + "$value": "{light.red.800}" + }, + "gray-2-overlay": { + "$type": "color", + "$value": "{black-alpha.50}" + } + }, + "ink": { + "base": { + "$type": "color", + "$value": "{neutral.white}" + }, + "gray-1": { + "$type": "color", + "$value": "{light.gray.200}" + }, + "gray-2": { + "$type": "color", + "$value": "{light.gray.300}" + }, + "gray-3": { + "$type": "color", + "$value": "{light.gray.400}" + }, + "gray-4": { + "$type": "color", + "$value": "{light.gray.500}" + }, + "gray-5": { + "$type": "color", + "$value": "{light.gray.600}" + }, + "gray-6": { + "$type": "color", + "$value": "{light.gray.700}" + }, + "gray-7": { + "$type": "color", + "$value": "{light.gray.800}" + }, + "gray-8": { + "$type": "color", + "$value": "{light.gray.900}" + }, + "red-1": { + "$type": "color", + "$value": "{light.red.50}" + }, + "red-2": { + "$type": "color", + "$value": "{light.red.400}" + }, + "red-3": { + "$type": "color", + "$value": "{light.red.500}" + }, + "red-4": { + "$type": "color", + "$value": "{light.red.700}" + }, + "green-1": { + "$type": "color", + "$value": "{light.green.50}" + }, + "green-2": { + "$type": "color", + "$value": "{light.green.400}" + }, + "green-3": { + "$type": "color", + "$value": "{light.green.500}" + }, + "green-4": { + "$type": "color", + "$value": "{light.green.700}" + }, + "green-6": { + "$type": "color", + "$value": "{light.green.600}" + }, + "amber-1": { + "$type": "color", + "$value": "{light.amber.50}" + }, + "amber-2": { + "$type": "color", + "$value": "{light.amber.400}" + }, + "amber-3": { + "$type": "color", + "$value": "{light.amber.500}" + }, + "amber-4": { + "$type": "color", + "$value": "{light.amber.700}" + }, + "blue-1": { + "$type": "color", + "$value": "{light.blue.50}" + }, + "blue-2": { + "$type": "color", + "$value": "{light.blue.400}" + }, + "blue-3": { + "$type": "color", + "$value": "{light.blue.500}" + }, + "blue-4": { + "$type": "color", + "$value": "{light.blue.700}" + }, + "cyan-3": { + "$type": "color", + "$value": "{light.cyan.500}" + }, + "violet-1": { + "$type": "color", + "$value": "{light.violet.50}" + }, + "violet-2": { + "$type": "color", + "$value": "{light.violet.400}" + }, + "violet-3": { + "$type": "color", + "$value": "{light.violet.500}" + }, + "violet-4": { + "$type": "color", + "$value": "{light.violet.700}" + }, + "blue-link": { + "$type": "color", + "$value": "{light.blue.400}" + }, + "alert-button-default": { + "$type": "color", + "$value": "{light.gray.900}" + }, + "alert-button-info": { + "$type": "color", + "$value": "{light.gray.900}" + }, + "alert-button-success": { + "$type": "color", + "$value": "{light.gray.900}" + }, + "alert-button-warning": { + "$type": "color", + "$value": "{light.gray.900}" + }, + "alert-button-error": { + "$type": "color", + "$value": "{light.gray.900}" + } + }, + "outline": { + "base": { + "$type": "color", + "$value": "{neutral.white}" + }, + "gray-1": { + "$type": "color", + "$value": "{light.gray.200}" + }, + "gray-1-contrast": { + "$type": "color", + "$value": "{light.gray.200}" + }, + "gray-2": { + "$type": "color", + "$value": "{light.gray.300}" + }, + "gray-3": { + "$type": "color", + "$value": "{light.gray.400}" + }, + "gray-4": { + "$type": "color", + "$value": "{light.gray.500}" + }, + "gray-5": { + "$type": "color", + "$value": "{light.gray.800}" + }, + "red-2": { + "$type": "color", + "$value": "{light.red.300}" + }, + "red-3": { + "$type": "color", + "$value": "{light.red.400}" + }, + "red-4": { + "$type": "color", + "$value": "{light.red.500}" + }, + "green-2": { + "$type": "color", + "$value": "{light.green.300}" + }, + "green-3": { + "$type": "color", + "$value": "{light.green.400}" + }, + "green-4": { + "$type": "color", + "$value": "{light.green.500}" + }, + "amber-2": { + "$type": "color", + "$value": "{light.amber.300}" + }, + "amber-3": { + "$type": "color", + "$value": "{light.amber.400}" + }, + "amber-4": { + "$type": "color", + "$value": "{light.amber.500}" + }, + "blue-2": { + "$type": "color", + "$value": "{light.blue.300}" + }, + "blue-3": { + "$type": "color", + "$value": "{light.blue.400}" + }, + "blue-4": { + "$type": "color", + "$value": "{light.blue.500}" + }, + "orange-3": { + "$type": "color", + "$value": "{light.orange.400}" + }, + "violet-2": { + "$type": "color", + "$value": "{light.violet.300}" + }, + "violet-3": { + "$type": "color", + "$value": "{light.violet.400}" + }, + "violet-4": { + "$type": "color", + "$value": "{light.violet.500}" + }, + "gray-modal": { + "$type": "color", + "$value": "{light.gray.200}" + } + }, + "outline-alpha": { + "base": { + "$type": "color", + "$value": "{neutral.white}" + }, + "gray-1": { + "$type": "color", + "$value": "{light.gray-alpha.200}" + }, + "gray-2": { + "$type": "color", + "$value": "{light.gray-alpha.300}" + }, + "gray-3": { + "$type": "color", + "$value": "{light.gray-alpha.400}" + }, + "gray-4": { + "$type": "color", + "$value": "{light.gray-alpha.500}" + }, + "gray-5": { + "$type": "color", + "$value": "{light.gray-alpha.800}" + }, + "red-2": { + "$type": "color", + "$value": "{light.red.300}" + }, + "red-3": { + "$type": "color", + "$value": "{light.red.400}" + }, + "red-4": { + "$type": "color", + "$value": "{light.red.500}" + }, + "gray-modal": { + "$type": "color", + "$value": "{light.gray-alpha.200}" + } + } +} \ No newline at end of file diff --git a/espresso-v2-design-tokens/Tokens.Mode 1.tokens.json b/espresso-v2-design-tokens/Tokens.Mode 1.tokens.json new file mode 100644 index 000000000..13686899b --- /dev/null +++ b/espresso-v2-design-tokens/Tokens.Mode 1.tokens.json @@ -0,0 +1,120 @@ +{ + "radius": { + "0": { + "$type": "dimension", + "$value": "0px" + }, + "1": { + "$type": "dimension", + "$value": "4px" + }, + "2": { + "$type": "dimension", + "$value": "5px" + }, + "3": { + "$type": "dimension", + "$value": "6px" + }, + "4": { + "$type": "dimension", + "$value": "8px" + }, + "5": { + "$type": "dimension", + "$value": "10px" + }, + "6": { + "$type": "dimension", + "$value": "12px" + }, + "7": { + "$type": "dimension", + "$value": "16px" + }, + "8": { + "$type": "dimension", + "$value": "20px" + }, + "9": { + "$type": "dimension", + "$value": "100px" + } + }, + "spacing": { + "0": { + "$type": "dimension", + "$value": "0px" + }, + "1": { + "$type": "dimension", + "$value": "1px" + }, + "2": { + "$type": "dimension", + "$value": "2px" + }, + "3": { + "$type": "dimension", + "$value": "3px" + }, + "4": { + "$type": "dimension", + "$value": "4px" + }, + "5": { + "$type": "dimension", + "$value": "5px" + }, + "6": { + "$type": "dimension", + "$value": "6px" + }, + "7": { + "$type": "dimension", + "$value": "7px" + }, + "8": { + "$type": "dimension", + "$value": "8px" + }, + "9": { + "$type": "dimension", + "$value": "9px" + }, + "10": { + "$type": "dimension", + "$value": "10px" + }, + "11": { + "$type": "dimension", + "$value": "11px" + }, + "12": { + "$type": "dimension", + "$value": "12px" + }, + "13": { + "$type": "dimension", + "$value": "14px" + }, + "14": { + "$type": "dimension", + "$value": "16px" + }, + "15": { + "$type": "dimension", + "$value": "20px" + }, + "16": { + "$type": "dimension", + "$value": "26px" + } + }, + "max-width": { + "1": { + "$type": "dimension", + "$value": "75px" + } + } +} \ No newline at end of file diff --git a/espresso-v2-design-tokens/Typography.Desktop.tokens.json b/espresso-v2-design-tokens/Typography.Desktop.tokens.json new file mode 100644 index 000000000..df76333a6 --- /dev/null +++ b/espresso-v2-design-tokens/Typography.Desktop.tokens.json @@ -0,0 +1,204 @@ +{ + "font": { + "family": { + "text": { + "$type": "string", + "$value": "Inter Variable" + } + }, + "weight": { + "regular": { + "$type": "string", + "$value": "regular" + }, + "medium": { + "$type": "string", + "$value": "medium" + }, + "semibold": { + "$type": "string", + "$value": "semibold" + }, + "bold": { + "$type": "string", + "$value": "bold" + }, + "black": { + "$type": "string", + "$value": "extrabold" + } + }, + "size": { + "tiny": { + "$type": "dimension", + "$value": "11px" + }, + "2xs": { + "$type": "dimension", + "$value": "11px" + }, + "xs": { + "$type": "dimension", + "$value": "12px" + }, + "sm": { + "$type": "dimension", + "$value": "13px" + }, + "base": { + "$type": "dimension", + "$value": "14px" + }, + "lg": { + "$type": "dimension", + "$value": "16px" + }, + "xl": { + "$type": "dimension", + "$value": "18px" + }, + "2xl": { + "$type": "dimension", + "$value": "20px" + }, + "3xl": { + "$type": "dimension", + "$value": "24px" + }, + "4xl": { + "$type": "dimension", + "$value": "26px" + }, + "5xl": { + "$type": "dimension", + "$value": "28px" + }, + "6xl": { + "$type": "dimension", + "$value": "32px" + }, + "7xl": { + "$type": "dimension", + "$value": "40px" + }, + "8xl": { + "$type": "dimension", + "$value": "44px" + }, + "9xl": { + "$type": "dimension", + "$value": "48px" + }, + "10xl": { + "$type": "dimension", + "$value": "52px" + }, + "11xl": { + "$type": "dimension", + "$value": "56px" + }, + "12xl": { + "$type": "dimension", + "$value": "64px" + }, + "13xl": { + "$type": "dimension", + "$value": "72px" + }, + "14xl": { + "$type": "dimension", + "$value": "80px" + }, + "15xl": { + "$type": "dimension", + "$value": "88px" + } + }, + "line-height": { + "tiny": { + "$type": "dimension", + "$value": "0px" + }, + "2xs": { + "$type": "dimension", + "$value": "13px" + }, + "xs": { + "$type": "dimension", + "$value": "14px" + }, + "sm": { + "$type": "dimension", + "$value": "15px" + }, + "base": { + "$type": "dimension", + "$value": "16px" + }, + "lg": { + "$type": "dimension", + "$value": "18px" + }, + "xl": { + "$type": "dimension", + "$value": "21px" + }, + "2xl": { + "$type": "dimension", + "$value": "23px" + }, + "3xl": { + "$type": "dimension", + "$value": "28px" + }, + "4xl": { + "$type": "dimension", + "$value": "42px" + }, + "5xl": { + "$type": "dimension", + "$value": "45px" + }, + "6xl": { + "$type": "dimension", + "$value": "51px" + }, + "7xl": { + "$type": "dimension", + "$value": "56px" + }, + "8xl": { + "$type": "dimension", + "$value": "62px" + }, + "9xl": { + "$type": "dimension", + "$value": "67px" + }, + "10xl": { + "$type": "dimension", + "$value": "73px" + }, + "11xl": { + "$type": "dimension", + "$value": "78px" + }, + "12xl": { + "$type": "dimension", + "$value": "83px" + }, + "13xl": { + "$type": "dimension", + "$value": "92px" + }, + "14xl": { + "$type": "dimension", + "$value": "96px" + }, + "15xl": { + "$type": "dimension", + "$value": "106px" + } + } + } +} \ No newline at end of file diff --git a/espresso-v2-design-tokens/color.styles.tokens.json b/espresso-v2-design-tokens/color.styles.tokens.json new file mode 100644 index 000000000..8e894d4ed --- /dev/null +++ b/espresso-v2-design-tokens/color.styles.tokens.json @@ -0,0 +1,111 @@ +{ + "angular": { + "white": { + "$type": "gradient", + "$description": "White", + "$value": { + "type": "conic", + "angle": 351, + "stops": [ + { + "color": "#ffffff", + "position": 0.72 + }, + { + "color": "#ffffff00", + "position": 1 + } + ] + } + }, + "black": { + "$type": "gradient", + "$description": "Black", + "$value": { + "type": "conic", + "angle": 351, + "stops": [ + { + "color": "#383838", + "position": 0.72 + }, + { + "color": "#38383800", + "position": 1 + } + ] + } + }, + "green": { + "$type": "gradient", + "$description": "Green", + "$value": { + "type": "conic", + "angle": 351, + "stops": [ + { + "color": "#17754b", + "position": 0.72 + }, + { + "color": "#17754b00", + "position": 1 + } + ] + } + }, + "amber": { + "$type": "gradient", + "$value": { + "type": "conic", + "angle": 180, + "stops": [ + { + "color": "#e79913", + "position": 0.22 + }, + { + "color": "#e7991300", + "position": 0.47 + } + ] + } + }, + "red": { + "$type": "gradient", + "$description": "Red", + "$value": { + "type": "conic", + "angle": 351, + "stops": [ + { + "color": "#cd2929", + "position": 0.72 + }, + { + "color": "#cd292900", + "position": 1 + } + ] + } + }, + "blue": { + "$type": "gradient", + "$description": "Blue", + "$value": { + "type": "conic", + "angle": 351, + "stops": [ + { + "color": "#006edb", + "position": 0.72 + }, + { + "color": "#006edb00", + "position": 1 + } + ] + } + } + } +} \ No newline at end of file diff --git a/espresso-v2-design-tokens/effect.styles.tokens.json b/espresso-v2-design-tokens/effect.styles.tokens.json new file mode 100644 index 000000000..d70156197 --- /dev/null +++ b/espresso-v2-design-tokens/effect.styles.tokens.json @@ -0,0 +1,528 @@ +{ + "shadow-test": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "0px", + "spread": "2px", + "color": "{outline.base}" + } + ] + }, + "elevation": { + "light": { + "sm": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "1px", + "blur": "3px", + "spread": "0px", + "color": "#00000024" + }, + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "1px", + "spread": "0px", + "color": "#00000024" + }, + { + "offsetX": "0px", + "offsetY": "0.25px", + "blur": "1.5px", + "spread": "0px", + "color": "#ffffff14", + "inset": true + } + ] + }, + "base": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "2px", + "blur": "5px", + "spread": "0px", + "color": "#00000024" + }, + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "1.5px", + "spread": "0px", + "color": "#00000029" + }, + { + "offsetX": "0px", + "offsetY": "0.25px", + "blur": "1.5px", + "spread": "0px", + "color": "#ffffff14", + "inset": true + } + ] + }, + "md": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "6px", + "blur": "12px", + "spread": "-2px", + "color": "#0000001f" + }, + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "6px", + "spread": "2px", + "color": "#00000008" + }, + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "1.5px", + "spread": "0px", + "color": "#00000026" + }, + { + "offsetX": "0px", + "offsetY": "0.25px", + "blur": "1.5px", + "spread": "0px", + "color": "#ffffff14", + "inset": true + } + ] + }, + "lg": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "18px", + "blur": "22px", + "spread": "-6px", + "color": "#0000001a" + }, + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "6px", + "spread": "3px", + "color": "#00000008" + }, + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "1.5px", + "spread": "0px", + "color": "#0000002e" + } + ] + }, + "xl": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "24px", + "blur": "30px", + "spread": "-8px", + "color": "#0000001a" + }, + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "10px", + "spread": "2px", + "color": "#0000000a" + }, + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "1px", + "spread": "0px", + "color": "#00000033" + }, + { + "offsetX": "0px", + "offsetY": "0.25px", + "blur": "2px", + "spread": "0px", + "color": "#ffffff26", + "inset": true + } + ] + }, + "2xl": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "44px", + "blur": "52px", + "spread": "-10px", + "color": "#0000001a" + }, + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "10px", + "spread": "2px", + "color": "#00000008" + }, + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "1.5px", + "spread": "0px", + "color": "#00000040" + }, + { + "offsetX": "0px", + "offsetY": "0.1px", + "blur": "2px", + "spread": "0px", + "color": "#ffffff14", + "inset": true + } + ] + } + }, + "dark": { + "sm": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "1px", + "blur": "3px", + "spread": "0px", + "color": "#000000b2" + }, + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "14px", + "spread": "0px", + "color": "#0000002e" + }, + { + "offsetX": "0px", + "offsetY": "0.5px", + "blur": "0.5px", + "spread": "0.5px", + "color": "#ffffff08", + "inset": true + } + ] + }, + "base": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "2px", + "blur": "5px", + "spread": "0px", + "color": "#00000099" + }, + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "14px", + "spread": "0px", + "color": "#0000002e" + }, + { + "offsetX": "0px", + "offsetY": "0.5px", + "blur": "0.5px", + "spread": "0.5px", + "color": "#ffffff08", + "inset": true + } + ] + }, + "md": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "6px", + "blur": "12px", + "spread": "-2px", + "color": "#00000099" + }, + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "16px", + "spread": "2px", + "color": "#00000033" + }, + { + "offsetX": "0px", + "offsetY": "0.5px", + "blur": "0.5px", + "spread": "0.5px", + "color": "#ffffff08", + "inset": true + } + ] + }, + "lg": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "18px", + "blur": "20px", + "spread": "-8px", + "color": "#00000085" + }, + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "16px", + "spread": "0px", + "color": "#0000001a" + }, + { + "offsetX": "0px", + "offsetY": "0.5px", + "blur": "1.5px", + "spread": "0.5px", + "color": "#ffffff0a", + "inset": true + } + ] + }, + "xl": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "26px", + "blur": "34px", + "spread": "-6px", + "color": "#0000006b" + }, + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "14px", + "spread": "2px", + "color": "#0000001f" + }, + { + "offsetX": "0px", + "offsetY": "0.5px", + "blur": "1.5px", + "spread": "0.5px", + "color": "#ffffff0a", + "inset": true + } + ] + }, + "2xl": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "44px", + "blur": "52px", + "spread": "-4px", + "color": "#0000006b" + }, + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "14px", + "spread": "10px", + "color": "#0000001f" + }, + { + "offsetX": "0px", + "offsetY": "0.5px", + "blur": "1.5px", + "spread": "0.5px", + "color": "#ffffff0f", + "inset": true + } + ] + } + }, + "custom": { + "status": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "0px", + "spread": "1.5px", + "color": "#ffffff" + } + ] + } + } + }, + "focus": { + "light": { + "default": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "0px", + "spread": "2px", + "color": "#c9c9c9e5" + } + ] + }, + "red": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "0px", + "spread": "2px", + "color": "#fa9c9de5" + } + ] + }, + "green": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "0px", + "spread": "2px", + "color": "#5ed29ce5" + } + ] + }, + "amber": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "0px", + "spread": "2px", + "color": "#ffda7ce5" + } + ] + }, + "blue": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "0px", + "spread": "2px", + "color": "#65b9fce5" + } + ] + }, + "violet": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "0px", + "spread": "2px", + "color": "#bea2fce5" + } + ] + } + }, + "dark": { + "default": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "0px", + "spread": "3px", + "color": "#464646cc" + } + ] + }, + "red": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "0px", + "spread": "3px", + "color": "#751819cc" + } + ] + }, + "green": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "0px", + "spread": "3px", + "color": "#1d563bcc" + } + ] + }, + "amber": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "0px", + "spread": "3px", + "color": "#744811cc" + } + ] + }, + "blue": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "0px", + "spread": "3px", + "color": "#0e3d62cc" + } + ] + }, + "violet": { + "$type": "shadow", + "$value": [ + { + "offsetX": "0px", + "offsetY": "0px", + "blur": "0px", + "spread": "3px", + "color": "#412d87cc" + } + ] + } + } + } +} \ No newline at end of file diff --git a/espresso-v2-design-tokens/grid.styles.tokens.json b/espresso-v2-design-tokens/grid.styles.tokens.json new file mode 100644 index 000000000..f8057a7cc --- /dev/null +++ b/espresso-v2-design-tokens/grid.styles.tokens.json @@ -0,0 +1,25 @@ +{ + "icon grid": { + "$type": "grid", + "$value": [ + { + "pattern": "columns", + "visible": true, + "alignment": "stretch", + "color": "#ff00001a", + "gutterSize": "0px", + "count": 1, + "offset": "1px" + }, + { + "pattern": "rows", + "visible": true, + "alignment": "stretch", + "color": "#ff00001a", + "gutterSize": "0px", + "count": 1, + "offset": "1px" + } + ] + } +} \ No newline at end of file diff --git a/espresso-v2-design-tokens/manifest.json b/espresso-v2-design-tokens/manifest.json new file mode 100644 index 000000000..19b28dadf --- /dev/null +++ b/espresso-v2-design-tokens/manifest.json @@ -0,0 +1,44 @@ +{ + "name": "Design Tokens", + "collections": { + "🔵 Colour primitives": { + "modes": { + "Light": [ + "🔵 Colour primitives.Light.tokens.json" + ] + } + }, + "Tokens": { + "modes": { + "Mode 1": [ + "Tokens.Mode 1.tokens.json" + ] + } + }, + "Typography": { + "modes": { + "Desktop": [ + "Typography.Desktop.tokens.json" + ] + } + } + }, + "styles": { + "Styles": [ + "Styles.Light.tokens.json", + "Styles.Dark.tokens.json" + ], + "text": [ + "text.styles.tokens.json" + ], + "effect": [ + "effect.styles.tokens.json" + ], + "color": [ + "color.styles.tokens.json" + ], + "grid": [ + "grid.styles.tokens.json" + ] + } +} \ No newline at end of file diff --git a/espresso-v2-design-tokens/text.styles.tokens.json b/espresso-v2-design-tokens/text.styles.tokens.json new file mode 100644 index 000000000..341604051 --- /dev/null +++ b/espresso-v2-design-tokens/text.styles.tokens.json @@ -0,0 +1,1804 @@ +{ + "text": { + "tiny": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "11px", + "fontWeight": 400, + "letterSpacing": "9%", + "lineHeight": "115%", + "textTransform": "uppercase", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "11px", + "fontWeight": 500, + "letterSpacing": "9%", + "lineHeight": "115%", + "textTransform": "uppercase", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "11px", + "fontWeight": 600, + "letterSpacing": "9%", + "lineHeight": "115%", + "textTransform": "uppercase", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "11px", + "fontWeight": 700, + "letterSpacing": "9%", + "lineHeight": "115%", + "textTransform": "uppercase", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "11px", + "fontWeight": 700, + "letterSpacing": "9%", + "lineHeight": "115%", + "textTransform": "uppercase", + "textDecoration": "none" + } + } + }, + "2xs": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "11px", + "fontWeight": 400, + "letterSpacing": "1%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "11px", + "fontWeight": 500, + "letterSpacing": "1%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "11px", + "fontWeight": 600, + "letterSpacing": "1%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "11px", + "fontWeight": 700, + "letterSpacing": "1%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "11px", + "fontWeight": 700, + "letterSpacing": "1%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "xs": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "12px", + "fontWeight": 400, + "letterSpacing": "2%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "12px", + "fontWeight": 500, + "letterSpacing": "2%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "12px", + "fontWeight": 600, + "letterSpacing": "1.5%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "12px", + "fontWeight": 700, + "letterSpacing": "1.5%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "12px", + "fontWeight": 700, + "letterSpacing": "1.5%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "sm": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "13px", + "fontWeight": 100, + "letterSpacing": "2%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "13px", + "fontWeight": 500, + "letterSpacing": "2%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "13px", + "fontWeight": 600, + "letterSpacing": "1.5%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "13px", + "fontWeight": 700, + "letterSpacing": "1.5%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "13px", + "fontWeight": 700, + "letterSpacing": "1.5%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "base": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "14px", + "fontWeight": 100, + "letterSpacing": "2%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "14px", + "fontWeight": 500, + "letterSpacing": "1.5%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "14px", + "fontWeight": 600, + "letterSpacing": "1.5%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "14px", + "fontWeight": 700, + "letterSpacing": "1.5%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "14px", + "fontWeight": 700, + "letterSpacing": "1.5%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "lg": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "16px", + "fontWeight": 400, + "letterSpacing": "2%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "16px", + "fontWeight": 500, + "letterSpacing": "1.5%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "16px", + "fontWeight": 600, + "letterSpacing": "1.5%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "16px", + "fontWeight": 700, + "letterSpacing": "1.5%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "16px", + "fontWeight": 700, + "letterSpacing": "1.5%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "xl": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "18px", + "fontWeight": 400, + "letterSpacing": "1%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "18px", + "fontWeight": 500, + "letterSpacing": "1%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "18px", + "fontWeight": 600, + "letterSpacing": "1%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "18px", + "fontWeight": 700, + "letterSpacing": "1%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "18px", + "fontWeight": 700, + "letterSpacing": "1%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "2xl": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "20px", + "fontWeight": 400, + "letterSpacing": "0.5%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "20px", + "fontWeight": 500, + "letterSpacing": "1%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "20px", + "fontWeight": 600, + "letterSpacing": "1%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "20px", + "fontWeight": 700, + "letterSpacing": "1%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "20px", + "fontWeight": 700, + "letterSpacing": "1%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "3xl": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "24px", + "fontWeight": 400, + "letterSpacing": "0.5%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "24px", + "fontWeight": 500, + "letterSpacing": "0.5%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "24px", + "fontWeight": 600, + "letterSpacing": "0.5%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "24px", + "fontWeight": 700, + "letterSpacing": "0.5%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "24px", + "fontWeight": 700, + "letterSpacing": "0.5%", + "lineHeight": "115%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "4xl": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "26px", + "fontWeight": 400, + "letterSpacing": "1%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "26px", + "fontWeight": 500, + "letterSpacing": "0.5%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "26px", + "fontWeight": 600, + "letterSpacing": "0.5%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "26px", + "fontWeight": 700, + "letterSpacing": "0.5%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "26px", + "fontWeight": 700, + "letterSpacing": "1%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "5xl": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "28px", + "fontWeight": 400, + "letterSpacing": "1%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "28px", + "fontWeight": 500, + "letterSpacing": "0.5%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "28px", + "fontWeight": 600, + "letterSpacing": "1%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "28px", + "fontWeight": 700, + "letterSpacing": "1.5%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "28px", + "fontWeight": 700, + "letterSpacing": "1%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "6xl": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "32px", + "fontWeight": 400, + "letterSpacing": "2%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "32px", + "fontWeight": 500, + "letterSpacing": "1.5%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "32px", + "fontWeight": 600, + "letterSpacing": "1.5%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "32px", + "fontWeight": 700, + "letterSpacing": "1.5%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "32px", + "fontWeight": 700, + "letterSpacing": "0.5%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "7xl": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "40px", + "fontWeight": 400, + "letterSpacing": "0%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "40px", + "fontWeight": 500, + "letterSpacing": "0%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "40px", + "fontWeight": 600, + "letterSpacing": "0%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "40px", + "fontWeight": 700, + "letterSpacing": "0%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "40px", + "fontWeight": 700, + "letterSpacing": "0%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "8xl": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "44px", + "fontWeight": 400, + "letterSpacing": "0%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "44px", + "fontWeight": 500, + "letterSpacing": "0%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "44px", + "fontWeight": 600, + "letterSpacing": "0%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "44px", + "fontWeight": 700, + "letterSpacing": "0%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "44px", + "fontWeight": 700, + "letterSpacing": "0%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "9xl": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "48px", + "fontWeight": 400, + "letterSpacing": "0%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "48px", + "fontWeight": 500, + "letterSpacing": "0%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "48px", + "fontWeight": 600, + "letterSpacing": "0%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "48px", + "fontWeight": 700, + "letterSpacing": "0.5%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "48px", + "fontWeight": 700, + "letterSpacing": "0.5%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "10xl": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "52px", + "fontWeight": 400, + "letterSpacing": "0%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "52px", + "fontWeight": 500, + "letterSpacing": "0%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "52px", + "fontWeight": 600, + "letterSpacing": "0%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "52px", + "fontWeight": 700, + "letterSpacing": "0%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "52px", + "fontWeight": 700, + "letterSpacing": "0.5%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "11xl": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "56px", + "fontWeight": 400, + "letterSpacing": "0.5%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "56px", + "fontWeight": 500, + "letterSpacing": "0%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "56px", + "fontWeight": 600, + "letterSpacing": "0%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "56px", + "fontWeight": 700, + "letterSpacing": "0%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "56px", + "fontWeight": 700, + "letterSpacing": "0%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "12xl": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "64px", + "fontWeight": 400, + "letterSpacing": "0%", + "lineHeight": "130%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "64px", + "fontWeight": 500, + "letterSpacing": "0%", + "lineHeight": "130%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "64px", + "fontWeight": 600, + "letterSpacing": "0%", + "lineHeight": "130%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "64px", + "fontWeight": 700, + "letterSpacing": "0%", + "lineHeight": "130%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "64px", + "fontWeight": 700, + "letterSpacing": "0%", + "lineHeight": "130%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "13xl": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "72px", + "fontWeight": 400, + "letterSpacing": "0%", + "lineHeight": "130%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "72px", + "fontWeight": 500, + "letterSpacing": "0%", + "lineHeight": "130%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "72px", + "fontWeight": 600, + "letterSpacing": "0%", + "lineHeight": "130%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "72px", + "fontWeight": 700, + "letterSpacing": "0%", + "lineHeight": "130%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "72px", + "fontWeight": 700, + "letterSpacing": "0%", + "lineHeight": "130%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "14xl": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "80px", + "fontWeight": 400, + "letterSpacing": "0%", + "lineHeight": "120%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "80px", + "fontWeight": 500, + "letterSpacing": "0.5%", + "lineHeight": "120%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "80px", + "fontWeight": 600, + "letterSpacing": "0%", + "lineHeight": "120%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "80px", + "fontWeight": 700, + "letterSpacing": "0%", + "lineHeight": "120%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "80px", + "fontWeight": 700, + "letterSpacing": "0%", + "lineHeight": "120%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "15xl": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "88px", + "fontWeight": 400, + "letterSpacing": "0%", + "lineHeight": "120%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "88px", + "fontWeight": 500, + "letterSpacing": "0%", + "lineHeight": "120%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "88px", + "fontWeight": 600, + "letterSpacing": "0%", + "lineHeight": "120%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "88px", + "fontWeight": 700, + "letterSpacing": "0%", + "lineHeight": "120%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "88px", + "fontWeight": 700, + "letterSpacing": "0%", + "lineHeight": "120%", + "textTransform": "none", + "textDecoration": "none" + } + } + } + }, + "paragraph": { + "2xs": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "11px", + "fontWeight": 400, + "letterSpacing": "1%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "11px", + "fontWeight": 500, + "letterSpacing": "1%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "11px", + "fontWeight": 600, + "letterSpacing": "1%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "11px", + "fontWeight": 700, + "letterSpacing": "1%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "11px", + "fontWeight": 700, + "letterSpacing": "1%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "xs": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "12px", + "fontWeight": 400, + "letterSpacing": "2%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "12px", + "fontWeight": 500, + "letterSpacing": "2%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "12px", + "fontWeight": 600, + "letterSpacing": "1.5%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "12px", + "fontWeight": 700, + "letterSpacing": "1.5%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "12px", + "fontWeight": 700, + "letterSpacing": "1.5%", + "lineHeight": "160%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "sm": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "13px", + "fontWeight": 100, + "letterSpacing": "1.5%", + "lineHeight": "150%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "13px", + "fontWeight": 500, + "letterSpacing": "2%", + "lineHeight": "150%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "13px", + "fontWeight": 600, + "letterSpacing": "1.5%", + "lineHeight": "150%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "13px", + "fontWeight": 700, + "letterSpacing": "1.5%", + "lineHeight": "150%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "13px", + "fontWeight": 700, + "letterSpacing": "1.5%", + "lineHeight": "150%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "base": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "14px", + "fontWeight": 400, + "letterSpacing": "2%", + "lineHeight": "150%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "14px", + "fontWeight": 500, + "letterSpacing": "1.5%", + "lineHeight": "150%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "14px", + "fontWeight": 600, + "letterSpacing": "1.5%", + "lineHeight": "150%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "14px", + "fontWeight": 700, + "letterSpacing": "1.5%", + "lineHeight": "150%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "14px", + "fontWeight": 700, + "letterSpacing": "1.5%", + "lineHeight": "150%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "lg": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "16px", + "fontWeight": 400, + "letterSpacing": "2%", + "lineHeight": "150%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "16px", + "fontWeight": 500, + "letterSpacing": "1.5%", + "lineHeight": "150%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "16px", + "fontWeight": 600, + "letterSpacing": "1.5%", + "lineHeight": "150%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "16px", + "fontWeight": 700, + "letterSpacing": "1.5%", + "lineHeight": "150%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "16px", + "fontWeight": 700, + "letterSpacing": "1.5%", + "lineHeight": "150%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "xl": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "18px", + "fontWeight": 400, + "letterSpacing": "1%", + "lineHeight": "150%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "18px", + "fontWeight": 500, + "letterSpacing": "1%", + "lineHeight": "150%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "18px", + "fontWeight": 600, + "letterSpacing": "1%", + "lineHeight": "150%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "18px", + "fontWeight": 700, + "letterSpacing": "1%", + "lineHeight": "150%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "18px", + "fontWeight": 700, + "letterSpacing": "1%", + "lineHeight": "150%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "2xl": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "20px", + "fontWeight": 400, + "letterSpacing": "1%", + "lineHeight": "148%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "20px", + "fontWeight": 500, + "letterSpacing": "1%", + "lineHeight": "148%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "20px", + "fontWeight": 600, + "letterSpacing": "1%", + "lineHeight": "148%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "20px", + "fontWeight": 700, + "letterSpacing": "1%", + "lineHeight": "148%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "20px", + "fontWeight": 700, + "letterSpacing": "1%", + "lineHeight": "148%", + "textTransform": "none", + "textDecoration": "none" + } + } + }, + "3xl": { + "regular": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "24px", + "fontWeight": 400, + "letterSpacing": "0.5px", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "medium": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "24px", + "fontWeight": 500, + "letterSpacing": "0.5px", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "semibold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "24px", + "fontWeight": 600, + "letterSpacing": "0.5%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "bold": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "24px", + "fontWeight": 700, + "letterSpacing": "0.5%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + }, + "black": { + "$type": "typography", + "$value": { + "fontFamily": "Inter Variable", + "fontSize": "24px", + "fontWeight": 700, + "letterSpacing": "0.5%", + "lineHeight": "140%", + "textTransform": "none", + "textDecoration": "none" + } + } + } + } +} \ No newline at end of file diff --git "a/espresso-v2-design-tokens/\360\237\224\265 Colour primitives.Light.tokens.json" "b/espresso-v2-design-tokens/\360\237\224\265 Colour primitives.Light.tokens.json" new file mode 100644 index 000000000..49d278569 --- /dev/null +++ "b/espresso-v2-design-tokens/\360\237\224\265 Colour primitives.Light.tokens.json" @@ -0,0 +1,1358 @@ +{ + "neutral": { + "white": { + "$type": "color", + "$value": "#ffffff" + }, + "black": { + "$type": "color", + "$value": "#000000" + } + }, + "light": { + "gray": { + "50": { + "$type": "color", + "$value": "#f8f8f8" + }, + "100": { + "$type": "color", + "$value": "#f3f3f3" + }, + "200": { + "$type": "color", + "$value": "#ededed" + }, + "300": { + "$type": "color", + "$value": "#e2e2e2" + }, + "400": { + "$type": "color", + "$value": "#c7c7c7" + }, + "500": { + "$type": "color", + "$value": "#999999" + }, + "600": { + "$type": "color", + "$value": "#7c7c7c" + }, + "700": { + "$type": "color", + "$value": "#525252" + }, + "800": { + "$type": "color", + "$value": "#383838" + }, + "900": { + "$type": "color", + "$value": "#171717" + }, + "950": { + "$type": "color", + "$value": "#0f0f0f" + } + }, + "gray-alpha": { + "50": { + "$type": "color", + "$value": "#00000008" + }, + "100": { + "$type": "color", + "$value": "#0000000b" + }, + "200": { + "$type": "color", + "$value": "#00000012" + }, + "300": { + "$type": "color", + "$value": "#0000001d" + }, + "400": { + "$type": "color", + "$value": "#00000038" + }, + "500": { + "$type": "color", + "$value": "#00000066" + }, + "600": { + "$type": "color", + "$value": "#00000083" + }, + "700": { + "$type": "color", + "$value": "#000000ad" + }, + "800": { + "$type": "color", + "$value": "#000000c7" + }, + "900": { + "$type": "color", + "$value": "#000000e8" + }, + "950": { + "$type": "color", + "$value": "#000000f0" + } + }, + "blue": { + "50": { + "$type": "color", + "$value": "#f0f7fc" + }, + "100": { + "$type": "color", + "$value": "#e6f4ff" + }, + "200": { + "$type": "color", + "$value": "#c8e6ff" + }, + "300": { + "$type": "color", + "$value": "#a7d7fd" + }, + "400": { + "$type": "color", + "$value": "#73bbf6" + }, + "500": { + "$type": "color", + "$value": "#0289f7" + }, + "600": { + "$type": "color", + "$value": "#007be0" + }, + "700": { + "$type": "color", + "$value": "#0070cc" + }, + "800": { + "$type": "color", + "$value": "#005ca3" + }, + "900": { + "$type": "color", + "$value": "#004880" + }, + "950": { + "$type": "color", + "$value": "#032e63" + } + }, + "green": { + "50": { + "$type": "color", + "$value": "#f1fbf5" + }, + "100": { + "$type": "color", + "$value": "#e4faeb" + }, + "200": { + "$type": "color", + "$value": "#c3f9d3" + }, + "300": { + "$type": "color", + "$value": "#a6efc0" + }, + "400": { + "$type": "color", + "$value": "#78e09f" + }, + "500": { + "$type": "color", + "$value": "#46b37e" + }, + "600": { + "$type": "color", + "$value": "#268c5c" + }, + "700": { + "$type": "color", + "$value": "#137949" + }, + "800": { + "$type": "color", + "$value": "#075e35" + }, + "900": { + "$type": "color", + "$value": "#173b2c" + }, + "950": { + "$type": "color", + "$value": "#0a3020" + } + }, + "red": { + "50": { + "$type": "color", + "$value": "#fff7f7" + }, + "100": { + "$type": "color", + "$value": "#ffe7e7" + }, + "200": { + "$type": "color", + "$value": "#ffd8d8" + }, + "300": { + "$type": "color", + "$value": "#fdc2c2" + }, + "400": { + "$type": "color", + "$value": "#f79596" + }, + "500": { + "$type": "color", + "$value": "#e03636" + }, + "600": { + "$type": "color", + "$value": "#cc2929" + }, + "700": { + "$type": "color", + "$value": "#b52a2a" + }, + "800": { + "$type": "color", + "$value": "#941f1f" + }, + "900": { + "$type": "color", + "$value": "#6b1515" + }, + "950": { + "$type": "color", + "$value": "#4c0d0d" + } + }, + "amber": { + "50": { + "$type": "color", + "$value": "#fdfaed" + }, + "100": { + "$type": "color", + "$value": "#fff7d3" + }, + "200": { + "$type": "color", + "$value": "#feeda9" + }, + "300": { + "$type": "color", + "$value": "#fbdb73" + }, + "400": { + "$type": "color", + "$value": "#fbc53f" + }, + "500": { + "$type": "color", + "$value": "#e79913" + }, + "600": { + "$type": "color", + "$value": "#d47408" + }, + "700": { + "$type": "color", + "$value": "#b35309" + }, + "800": { + "$type": "color", + "$value": "#91400d" + }, + "900": { + "$type": "color", + "$value": "#763813" + }, + "950": { + "$type": "color", + "$value": "#4e2209" + } + }, + "orange": { + "50": { + "$type": "color", + "$value": "#fff4ed" + }, + "100": { + "$type": "color", + "$value": "#ffefe4" + }, + "200": { + "$type": "color", + "$value": "#ffdec5" + }, + "300": { + "$type": "color", + "$value": "#ffcba3" + }, + "400": { + "$type": "color", + "$value": "#f4b07f" + }, + "500": { + "$type": "color", + "$value": "#e86c13" + }, + "600": { + "$type": "color", + "$value": "#d35a09" + }, + "700": { + "$type": "color", + "$value": "#bd3e0c" + }, + "800": { + "$type": "color", + "$value": "#9e3513" + }, + "900": { + "$type": "color", + "$value": "#6b2711" + }, + "950": { + "$type": "color", + "$value": "#491605" + } + }, + "yellow": { + "50": { + "$type": "color", + "$value": "#fcfbe8" + }, + "100": { + "$type": "color", + "$value": "#fff7d3" + }, + "200": { + "$type": "color", + "$value": "#f7e9a8" + }, + "300": { + "$type": "color", + "$value": "#f5e171" + }, + "400": { + "$type": "color", + "$value": "#f2d14b" + }, + "500": { + "$type": "color", + "$value": "#edba13" + }, + "600": { + "$type": "color", + "$value": "#ab790d" + }, + "700": { + "$type": "color", + "$value": "#9a6304" + }, + "800": { + "$type": "color", + "$value": "#8c5600" + }, + "900": { + "$type": "color", + "$value": "#733f12" + }, + "950": { + "$type": "color", + "$value": "#512a09" + } + }, + "teal": { + "50": { + "$type": "color", + "$value": "#eefbf8" + }, + "100": { + "$type": "color", + "$value": "#e6f7f4" + }, + "200": { + "$type": "color", + "$value": "#bae8e1" + }, + "300": { + "$type": "color", + "$value": "#97ded4" + }, + "400": { + "$type": "color", + "$value": "#73d1c4" + }, + "500": { + "$type": "color", + "$value": "#36baad" + }, + "600": { + "$type": "color", + "$value": "#0a857b" + }, + "700": { + "$type": "color", + "$value": "#0f736b" + }, + "800": { + "$type": "color", + "$value": "#115c57" + }, + "900": { + "$type": "color", + "$value": "#114541" + }, + "950": { + "$type": "color", + "$value": "#053734" + } + }, + "cyan": { + "50": { + "$type": "color", + "$value": "#f2fbfd" + }, + "100": { + "$type": "color", + "$value": "#ddf7ff" + }, + "200": { + "$type": "color", + "$value": "#b3e8f7" + }, + "300": { + "$type": "color", + "$value": "#99e2f8" + }, + "400": { + "$type": "color", + "$value": "#72d5f3" + }, + "500": { + "$type": "color", + "$value": "#3bbde5" + }, + "600": { + "$type": "color", + "$value": "#1f8cad" + }, + "700": { + "$type": "color", + "$value": "#1d7f9d" + }, + "800": { + "$type": "color", + "$value": "#125c73" + }, + "900": { + "$type": "color", + "$value": "#164759" + }, + "950": { + "$type": "color", + "$value": "#05383f" + } + }, + "purple": { + "50": { + "$type": "color", + "$value": "#f8f3fb" + }, + "100": { + "$type": "color", + "$value": "#f6e9ff" + }, + "200": { + "$type": "color", + "$value": "#ecd3ff" + }, + "300": { + "$type": "color", + "$value": "#e2b9fc" + }, + "400": { + "$type": "color", + "$value": "#bf78fa" + }, + "500": { + "$type": "color", + "$value": "#9c45e3" + }, + "600": { + "$type": "color", + "$value": "#8e49ca" + }, + "700": { + "$type": "color", + "$value": "#6e399d" + }, + "800": { + "$type": "color", + "$value": "#5c2f83" + }, + "900": { + "$type": "color", + "$value": "#401863" + }, + "950": { + "$type": "color", + "$value": "#2d084e" + } + }, + "pink": { + "50": { + "$type": "color", + "$value": "#fff7fc" + }, + "100": { + "$type": "color", + "$value": "#fde8f5" + }, + "200": { + "$type": "color", + "$value": "#ffd5f0" + }, + "300": { + "$type": "color", + "$value": "#f9b9e0" + }, + "400": { + "$type": "color", + "$value": "#f77cc6" + }, + "500": { + "$type": "color", + "$value": "#e34aa6" + }, + "600": { + "$type": "color", + "$value": "#cf3a96" + }, + "700": { + "$type": "color", + "$value": "#9c2671" + }, + "800": { + "$type": "color", + "$value": "#801458" + }, + "900": { + "$type": "color", + "$value": "#570f3e" + }, + "950": { + "$type": "color", + "$value": "#40062c" + } + }, + "violet": { + "50": { + "$type": "color", + "$value": "#f5f3fc" + }, + "100": { + "$type": "color", + "$value": "#eee8ff" + }, + "200": { + "$type": "color", + "$value": "#dbd5ff" + }, + "300": { + "$type": "color", + "$value": "#c9bafb" + }, + "400": { + "$type": "color", + "$value": "#a68efe" + }, + "500": { + "$type": "color", + "$value": "#7757ee" + }, + "600": { + "$type": "color", + "$value": "#6b53d0" + }, + "700": { + "$type": "color", + "$value": "#4f3da1" + }, + "800": { + "$type": "color", + "$value": "#392980" + }, + "900": { + "$type": "color", + "$value": "#251959" + }, + "950": { + "$type": "color", + "$value": "#150655" + } + } + }, + "dark": { + "gray": { + "50": { + "$type": "color", + "$value": "#f8f8f8" + }, + "100": { + "$type": "color", + "$value": "#d9d9d9" + }, + "200": { + "$type": "color", + "$value": "#afafaf" + }, + "300": { + "$type": "color", + "$value": "#808080" + }, + "400": { + "$type": "color", + "$value": "#717171" + }, + "450": { + "$type": "color", + "$value": "#575757" + }, + "500": { + "$type": "color", + "$value": "#424242" + }, + "600": { + "$type": "color", + "$value": "#343434" + }, + "700": { + "$type": "color", + "$value": "#2b2b2b" + }, + "800": { + "$type": "color", + "$value": "#242424" + }, + "900": { + "$type": "color", + "$value": "#1f1f1f" + }, + "950": { + "$type": "color", + "$value": "#171717" + } + }, + "gray-alpha": { + "50": { + "$type": "color", + "$value": "#fffffff7" + }, + "100": { + "$type": "color", + "$value": "#ffffffd1" + }, + "200": { + "$type": "color", + "$value": "#ffffffab" + }, + "300": { + "$type": "color", + "$value": "#ffffff78" + }, + "400": { + "$type": "color", + "$value": "#ffffff69" + }, + "450": { + "$type": "color", + "$value": "#ffffff4d" + }, + "500": { + "$type": "color", + "$value": "#ffffff36" + }, + "600": { + "$type": "color", + "$value": "#ffffff26" + }, + "700": { + "$type": "color", + "$value": "#ffffff1f" + }, + "800": { + "$type": "color", + "$value": "#ffffff14" + }, + "900": { + "$type": "color", + "$value": "#ffffff0f" + }, + "950": { + "$type": "color", + "$value": "#0000000a" + } + }, + "blue": { + "50": { + "$type": "color", + "$value": "#c9e0f5" + }, + "100": { + "$type": "color", + "$value": "#add2f5" + }, + "200": { + "$type": "color", + "$value": "#8cc1ec" + }, + "300": { + "$type": "color", + "$value": "#5aaef2" + }, + "400": { + "$type": "color", + "$value": "#2a8edf" + }, + "500": { + "$type": "color", + "$value": "#1580d8" + }, + "600": { + "$type": "color", + "$value": "#155999" + }, + "700": { + "$type": "color", + "$value": "#063d71" + }, + "800": { + "$type": "color", + "$value": "#052b53" + }, + "900": { + "$type": "color", + "$value": "#10233d" + }, + "950": { + "$type": "color", + "$value": "#0e1c2f" + } + }, + "green": { + "50": { + "$type": "color", + "$value": "#c8f3de" + }, + "100": { + "$type": "color", + "$value": "#9be6c1" + }, + "200": { + "$type": "color", + "$value": "#78d7a9" + }, + "300": { + "$type": "color", + "$value": "#58c08e" + }, + "400": { + "$type": "color", + "$value": "#469170" + }, + "500": { + "$type": "color", + "$value": "#148950" + }, + "600": { + "$type": "color", + "$value": "#077241" + }, + "700": { + "$type": "color", + "$value": "#035831" + }, + "800": { + "$type": "color", + "$value": "#0a3f27" + }, + "900": { + "$type": "color", + "$value": "#0c2d1c" + }, + "950": { + "$type": "color", + "$value": "#0b1e14" + } + }, + "red": { + "50": { + "$type": "color", + "$value": "#ffdede" + }, + "100": { + "$type": "color", + "$value": "#ffc1c1" + }, + "200": { + "$type": "color", + "$value": "#fe7c7c" + }, + "300": { + "$type": "color", + "$value": "#eb4d52" + }, + "400": { + "$type": "color", + "$value": "#ce5a5a" + }, + "500": { + "$type": "color", + "$value": "#b01f1f" + }, + "600": { + "$type": "color", + "$value": "#862020" + }, + "700": { + "$type": "color", + "$value": "#661717" + }, + "800": { + "$type": "color", + "$value": "#521515" + }, + "900": { + "$type": "color", + "$value": "#441316" + }, + "950": { + "$type": "color", + "$value": "#271111" + } + }, + "red-alpha": { + "50": { + "$type": "color", + "$value": "#ffdede" + }, + "100": { + "$type": "color", + "$value": "#ffc1c1" + }, + "200": { + "$type": "color", + "$value": "#fe7c7c" + }, + "300": { + "$type": "color", + "$value": "#ff5858f0" + }, + "400": { + "$type": "color", + "$value": "#fa3c3cd9" + }, + "500": { + "$type": "color", + "$value": "#ed2222ba" + }, + "600": { + "$type": "color", + "$value": "#ed2d2d8a" + }, + "700": { + "$type": "color", + "$value": "#c120207d" + }, + "800": { + "$type": "color", + "$value": "#c01b1b61" + }, + "900": { + "$type": "color", + "$value": "#5f16168f" + }, + "950": { + "$type": "color", + "$value": "#53060666" + } + }, + "amber": { + "50": { + "$type": "color", + "$value": "#ffe59a" + }, + "100": { + "$type": "color", + "$value": "#f4c25f" + }, + "200": { + "$type": "color", + "$value": "#ffaa3e" + }, + "300": { + "$type": "color", + "$value": "#fa961f" + }, + "400": { + "$type": "color", + "$value": "#c87a2d" + }, + "500": { + "$type": "color", + "$value": "#bd660f" + }, + "600": { + "$type": "color", + "$value": "#975215" + }, + "700": { + "$type": "color", + "$value": "#753a07" + }, + "800": { + "$type": "color", + "$value": "#4b2606" + }, + "900": { + "$type": "color", + "$value": "#371e06" + }, + "950": { + "$type": "color", + "$value": "#281808" + } + }, + "yellow": { + "50": { + "$type": "color", + "$value": "#ffeeb8" + }, + "100": { + "$type": "color", + "$value": "#ffe386" + }, + "200": { + "$type": "color", + "$value": "#f8d76a" + }, + "300": { + "$type": "color", + "$value": "#ecc02e" + }, + "400": { + "$type": "color", + "$value": "#bb972a" + }, + "500": { + "$type": "color", + "$value": "#9c7e1c" + }, + "600": { + "$type": "color", + "$value": "#99780a" + }, + "700": { + "$type": "color", + "$value": "#705606" + }, + "800": { + "$type": "color", + "$value": "#5b4605" + }, + "900": { + "$type": "color", + "$value": "#3a2c04" + }, + "950": { + "$type": "color", + "$value": "#261d03" + } + }, + "orange": { + "50": { + "$type": "color", + "$value": "#ffcdad" + }, + "100": { + "$type": "color", + "$value": "#ffa873" + }, + "200": { + "$type": "color", + "$value": "#fa8a40" + }, + "300": { + "$type": "color", + "$value": "#e3701c" + }, + "400": { + "$type": "color", + "$value": "#e16914" + }, + "500": { + "$type": "color", + "$value": "#984509" + }, + "600": { + "$type": "color", + "$value": "#823906" + }, + "700": { + "$type": "color", + "$value": "#683108" + }, + "800": { + "$type": "color", + "$value": "#532707" + }, + "900": { + "$type": "color", + "$value": "#361c09" + }, + "950": { + "$type": "color", + "$value": "#2b1708" + } + }, + "teal": { + "50": { + "$type": "color", + "$value": "#a0f7ed" + }, + "100": { + "$type": "color", + "$value": "#7ef3e7" + }, + "200": { + "$type": "color", + "$value": "#51decf" + }, + "300": { + "$type": "color", + "$value": "#28bcac" + }, + "400": { + "$type": "color", + "$value": "#2ca094" + }, + "500": { + "$type": "color", + "$value": "#1b7169" + }, + "600": { + "$type": "color", + "$value": "#145b54" + }, + "700": { + "$type": "color", + "$value": "#0b4942" + }, + "800": { + "$type": "color", + "$value": "#0b3a35" + }, + "900": { + "$type": "color", + "$value": "#0a2d29" + }, + "950": { + "$type": "color", + "$value": "#0b2320" + } + }, + "cyan": { + "50": { + "$type": "color", + "$value": "#d0f0fa" + }, + "100": { + "$type": "color", + "$value": "#95e3f6" + }, + "200": { + "$type": "color", + "$value": "#62cae9" + }, + "300": { + "$type": "color", + "$value": "#3cb8dc" + }, + "400": { + "$type": "color", + "$value": "#249cc2" + }, + "500": { + "$type": "color", + "$value": "#107b9b" + }, + "600": { + "$type": "color", + "$value": "#0c6783" + }, + "700": { + "$type": "color", + "$value": "#104f62" + }, + "800": { + "$type": "color", + "$value": "#0d3b49" + }, + "900": { + "$type": "color", + "$value": "#0b2932" + }, + "950": { + "$type": "color", + "$value": "#0b2028" + } + }, + "purple": { + "50": { + "$type": "color", + "$value": "#e5c6fb" + }, + "100": { + "$type": "color", + "$value": "#d9aff5" + }, + "200": { + "$type": "color", + "$value": "#c993ef" + }, + "300": { + "$type": "color", + "$value": "#b168e8" + }, + "400": { + "$type": "color", + "$value": "#a26fce" + }, + "500": { + "$type": "color", + "$value": "#7a2db9" + }, + "600": { + "$type": "color", + "$value": "#622195" + }, + "700": { + "$type": "color", + "$value": "#491870" + }, + "800": { + "$type": "color", + "$value": "#391457" + }, + "900": { + "$type": "color", + "$value": "#2c1042" + }, + "950": { + "$type": "color", + "$value": "#23132f" + } + }, + "pink": { + "50": { + "$type": "color", + "$value": "#ffbbe4" + }, + "100": { + "$type": "color", + "$value": "#f69ad1" + }, + "200": { + "$type": "color", + "$value": "#ed77be" + }, + "300": { + "$type": "color", + "$value": "#e359ab" + }, + "400": { + "$type": "color", + "$value": "#cb5d9e" + }, + "500": { + "$type": "color", + "$value": "#ac377d" + }, + "600": { + "$type": "color", + "$value": "#892660" + }, + "700": { + "$type": "color", + "$value": "#6f1d4d" + }, + "800": { + "$type": "color", + "$value": "#5b183f" + }, + "900": { + "$type": "color", + "$value": "#42132f" + }, + "950": { + "$type": "color", + "$value": "#2e0f22" + } + }, + "violet": { + "50": { + "$type": "color", + "$value": "#cdbeff" + }, + "100": { + "$type": "color", + "$value": "#bca9fc" + }, + "200": { + "$type": "color", + "$value": "#9f87ed" + }, + "300": { + "$type": "color", + "$value": "#9478f8" + }, + "400": { + "$type": "color", + "$value": "#9683d8" + }, + "500": { + "$type": "color", + "$value": "#785fce" + }, + "600": { + "$type": "color", + "$value": "#403397" + }, + "700": { + "$type": "color", + "$value": "#3d3286" + }, + "800": { + "$type": "color", + "$value": "#291d64" + }, + "900": { + "$type": "color", + "$value": "#1f1841" + }, + "950": { + "$type": "color", + "$value": "#18142e" + } + } + }, + "white-alpha": { + "50": { + "$type": "color", + "$value": "#ffffff1a" + }, + "100": { + "$type": "color", + "$value": "#ffffff2e" + }, + "200": { + "$type": "color", + "$value": "#ffffff45" + }, + "300": { + "$type": "color", + "$value": "#ffffff5c" + }, + "400": { + "$type": "color", + "$value": "#ffffff73" + }, + "500": { + "$type": "color", + "$value": "#ffffff8a" + }, + "600": { + "$type": "color", + "$value": "#ffffffa1" + }, + "700": { + "$type": "color", + "$value": "#ffffffb8" + }, + "800": { + "$type": "color", + "$value": "#ffffffcf" + }, + "900": { + "$type": "color", + "$value": "#ffffffe5" + }, + "950": { + "$type": "color", + "$value": "#fffffff2" + } + }, + "black-alpha": { + "50": { + "$type": "color", + "$value": "#00000017" + }, + "100": { + "$type": "color", + "$value": "#0000002e" + }, + "200": { + "$type": "color", + "$value": "#00000045" + }, + "300": { + "$type": "color", + "$value": "#0000005c" + }, + "400": { + "$type": "color", + "$value": "#00000073" + }, + "500": { + "$type": "color", + "$value": "#0000008a" + }, + "600": { + "$type": "color", + "$value": "#000000a1" + }, + "700": { + "$type": "color", + "$value": "#000000b8" + }, + "800": { + "$type": "color", + "$value": "#000000cf" + }, + "900": { + "$type": "color", + "$value": "#000000e5" + }, + "950": { + "$type": "color", + "$value": "#000000f2" + } + } +} \ No newline at end of file diff --git a/package.json b/package.json index 1605273dd..caefcadde 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,8 @@ "docs:build": "vitepress build docs", "docs:preview": "vitepress preview docs", "docs:gen": "tsx docs/scripts/propsgen.ts", - "docs:gen:all": "yarn docs:gen --all" + "docs:gen:all": "yarn docs:gen --all", + "sync-tokens": "node tailwind/figma-tokens-to-theme.js" }, "exports": { ".": { diff --git a/tailwind/colors.json b/tailwind/colors.json index 5ececaedb..c8c9885f9 100644 --- a/tailwind/colors.json +++ b/tailwind/colors.json @@ -1,355 +1,397 @@ { "lightMode": { "gray": { - "50": "#F8F8F8", - "100": "#F3F3F3", - "200": "#EDEDED", - "300": "#E2E2E2", - "400": "#C7C7C7", + "50": "#f8f8f8", + "100": "#f3f3f3", + "200": "#ededed", + "300": "#e2e2e2", + "400": "#c7c7c7", "500": "#999999", - "600": "#7C7C7C", + "600": "#7c7c7c", "700": "#525252", "800": "#383838", - "900": "#171717" + "900": "#171717", + "950": "#0f0f0f" }, "blue": { - "50": "#F2F9FF", - "100": "#E6F4FF", - "200": "#C8E6FF", - "300": "#A7D7FD", - "400": "#73BBF6", - "500": "#0289F7", - "600": "#007BE0", - "700": "#0070CC", - "800": "#005CA3", - "900": "#004880" + "50": "#f0f7fc", + "100": "#e6f4ff", + "200": "#c8e6ff", + "300": "#a7d7fd", + "400": "#73bbf6", + "500": "#0289f7", + "600": "#007be0", + "700": "#0070cc", + "800": "#005ca3", + "900": "#004880", + "950": "#032e63" }, "green": { - "50": "#F2FDF4", - "100": "#E4FAEB", - "200": "#C3F9D3", - "300": "#A6EFC0", - "400": "#86E0A8", - "500": "#46B37E", - "600": "#278F5E", + "50": "#f1fbf5", + "100": "#e4faeb", + "200": "#c3f9d3", + "300": "#a6efc0", + "400": "#78e09f", + "500": "#46b37e", + "600": "#268c5c", "700": "#137949", - "800": "#075E35", - "900": "#173B2C" + "800": "#075e35", + "900": "#173b2c", + "950": "#0a3020" }, "red": { - "50": "#FFF7F7", - "100": "#FFE7E7", - "200": "#FFD8D8", - "300": "#FDC2C2", - "400": "#F79596", - "500": "#E03636", - "600": "#CC2929", - "700": "#B52A2A", - "800": "#941F1F", - "900": "#6B1515" - }, - "amber": { - "50": "#FDFAED", - "100": "#FFF7D3", - "200": "#FEEDA9", - "300": "#FBDB73", - "400": "#FBCC55", - "500": "#E79913", - "600": "#DB7706", - "700": "#B35309", - "800": "#91400D", - "900": "#763813" + "50": "#fff7f7", + "100": "#ffe7e7", + "200": "#ffd8d8", + "300": "#fdc2c2", + "400": "#f79596", + "500": "#e03636", + "600": "#cc2929", + "700": "#b52a2a", + "800": "#941f1f", + "900": "#6b1515", + "950": "#4c0d0d" }, "orange": { - "50": "#FFF9F5", - "100": "#FFEFE4", - "200": "#FFDEC5", - "300": "#FFCBA3", - "400": "#F4B07F", - "500": "#E86C13", - "600": "#D45A08", - "700": "#BD3E0C", - "800": "#9E3513", - "900": "#6B2711" + "50": "#fff4ed", + "100": "#ffefe4", + "200": "#ffdec5", + "300": "#ffcba3", + "400": "#f4b07f", + "500": "#e86c13", + "600": "#d35a09", + "700": "#bd3e0c", + "800": "#9e3513", + "900": "#6b2711", + "950": "#491605" + }, + "amber": { + "50": "#fdfaed", + "100": "#fff7d3", + "200": "#feeda9", + "300": "#fbdb73", + "400": "#fbc53f", + "500": "#e79913", + "600": "#d47408", + "700": "#b35309", + "800": "#91400d", + "900": "#763813", + "950": "#4e2209" }, "yellow": { - "50": "#FFFCEF", - "100": "#FFF7D3", - "200": "#F7E9A8", - "300": "#F5E171", - "400": "#F2D14B", - "500": "#EDBA13", - "600": "#D1930D", - "700": "#AB6E05", - "800": "#8C5600", - "900": "#733F12" + "50": "#fcfbe8", + "100": "#fff7d3", + "200": "#f7e9a8", + "300": "#f5e171", + "400": "#f2d14b", + "500": "#edba13", + "600": "#ab790d", + "700": "#9a6304", + "800": "#8c5600", + "900": "#733f12", + "950": "#512a09" }, "teal": { - "50": "#F0FDFA", - "100": "#E6F7F4", - "200": "#BAE8E1", - "300": "#97DED4", - "400": "#73D1C4", - "500": "#36BAAD", - "600": "#0B9E92", - "700": "#0F736B", - "800": "#115C57", - "900": "#114541" + "50": "#eefbf8", + "100": "#e6f7f4", + "200": "#bae8e1", + "300": "#97ded4", + "400": "#73d1c4", + "500": "#36baad", + "600": "#0a857b", + "700": "#0f736b", + "800": "#115c57", + "900": "#114541", + "950": "#053734" }, "cyan": { - "50": "#F5FBFC", - "100": "#DDF7FF", - "200": "#B3E8F7", - "300": "#99E2F8", - "400": "#72D5F3", - "500": "#3BBDE5", - "600": "#32A4C7", - "700": "#267A94", - "800": "#125C73", - "900": "#164759" + "50": "#f2fbfd", + "100": "#ddf7ff", + "200": "#b3e8f7", + "300": "#99e2f8", + "400": "#72d5f3", + "500": "#3bbde5", + "600": "#1f8cad", + "700": "#1d7f9d", + "800": "#125c73", + "900": "#164759", + "950": "#05383f" }, "purple": { - "50": "#FDFAFF", - "100": "#F6E9FF", - "200": "#ECD3FF", - "300": "#E2B9FC", - "400": "#CFA1F2", - "500": "#9C45E3", - "600": "#8642C2", - "700": "#6E399D", - "800": "#5C2F83", - "900": "#401863" + "50": "#f8f3fb", + "100": "#f6e9ff", + "200": "#ecd3ff", + "300": "#e2b9fc", + "400": "#bf78fa", + "500": "#9c45e3", + "600": "#8e49ca", + "700": "#6e399d", + "800": "#5c2f83", + "900": "#401863", + "950": "#2d084e" }, "pink": { - "50": "#FFF7FC", - "100": "#FDE8F5", - "200": "#FFD5F0", - "300": "#F9B9E0", - "400": "#F6A7D6", - "500": "#E34AA6", - "600": "#CF3A96", - "700": "#9C2671", + "50": "#fff7fc", + "100": "#fde8f5", + "200": "#ffd5f0", + "300": "#f9b9e0", + "400": "#f77cc6", + "500": "#e34aa6", + "600": "#cf3a96", + "700": "#9c2671", "800": "#801458", - "900": "#570F3E" + "900": "#570f3e", + "950": "#40062c" }, "violet": { - "50": "#FBFAFF", - "100": "#F0EBFF", - "200": "#DBD5FF", - "300": "#C9BAFB", - "400": "#B3A1F5", - "500": "#6846E3", - "600": "#5F46C7", - "700": "#4F3DA1", + "50": "#f5f3fc", + "100": "#eee8ff", + "200": "#dbd5ff", + "300": "#c9bafb", + "400": "#a68efe", + "500": "#7757ee", + "600": "#6b53d0", + "700": "#4f3da1", "800": "#392980", - "900": "#251959" + "900": "#251959", + "950": "#150655" + }, + "gray-alpha": { + "50": "#00000008", + "100": "#0000000b", + "200": "#00000012", + "300": "#0000001d", + "400": "#00000038", + "500": "#00000066", + "600": "#00000083", + "700": "#000000ad", + "800": "#000000c7", + "900": "#000000e8", + "950": "#000000f0" } }, "darkMode": { "gray": { - "50": "#F8F8F8", - "100": "#D4D4D4", - "200": "#AFAFAF", - "250": "#999999", + "50": "#f8f8f8", + "100": "#d9d9d9", + "200": "#afafaf", "300": "#808080", "400": "#717171", + "450": "#575757", "500": "#424242", "600": "#343434", - "650": "#2B2B2B", - "700": "#232323", - "800": "#1C1C1C", - "900": "#0F0F0F" + "700": "#2b2b2b", + "800": "#242424", + "900": "#1f1f1f", + "950": "#171717" }, "blue": { - "50": "#C9E0F5", - "100": "#ADD2F5", - "200": "#8CC1EC", - "300": "#5AAEF2", - "400": "#3294E3", - "500": "#1580D8", + "50": "#c9e0f5", + "100": "#add2f5", + "200": "#8cc1ec", + "300": "#5aaef2", + "400": "#2a8edf", + "500": "#1580d8", "600": "#155999", - "700": "#063D71", - "800": "#052B53", - "900": "#0E2037", - "900-80": "#0E2037CC" + "700": "#063d71", + "800": "#052b53", + "900": "#10233d", + "950": "#0e1c2f" }, "green": { - "50": "#C8F3DE", - "100": "#9BE6C1", - "200": "#78D7A9", - "300": "#58C08E", - "400": "#1BA964", - "500": "#0A9752", - "600": "#0F814A", + "50": "#c8f3de", + "100": "#9be6c1", + "200": "#78d7a9", + "300": "#58c08e", + "400": "#469170", + "500": "#148950", + "600": "#077241", "700": "#035831", - "800": "#0A3F27", - "900": "#0B2E1C" + "800": "#0a3f27", + "900": "#0c2d1c", + "950": "#0b1e14" }, "red": { - "50": "#FFC1C1", - "100": "#FF9595", - "200": "#FC7474", - "300": "#EB4D52", - "400": "#E43838", - "500": "#C12020", - "600": "#901818", - "700": "#681916", + "50": "#ffdede", + "100": "#ffc1c1", + "200": "#fe7c7c", + "300": "#eb4d52", + "400": "#ce5a5a", + "500": "#b01f1f", + "600": "#862020", + "700": "#661717", "800": "#521515", - "900": "#361515", - "800-90": "#521515E6", - "900-90": "#361515E6" - }, - "amber": { - "50": "#F9E8A5", - "100": "#F8D16E", - "200": "#F0BA31", - "300": "#E79913", - "400": "#E37D00", - "500": "#CB6D10", - "600": "#824108", - "700": "#603007", - "800": "#4B2606", - "900": "#371E06" + "900": "#441316", + "950": "#271111" }, "orange": { - "50": "#FFCDAD", - "100": "#FFA873", - "200": "#FA8A40", - "300": "#DE6D1B", - "400": "#C45A0E", + "50": "#ffcdad", + "100": "#ffa873", + "200": "#fa8a40", + "300": "#e3701c", + "400": "#e16914", "500": "#984509", "600": "#823906", "700": "#683108", "800": "#532707", - "900": "#401F07", - "900-80": "#401F07CC" + "900": "#361c09", + "950": "#2b1708" + }, + "amber": { + "50": "#ffe59a", + "100": "#f4c25f", + "200": "#ffaa3e", + "300": "#fa961f", + "400": "#c87a2d", + "500": "#bd660f", + "600": "#975215", + "700": "#753a07", + "800": "#4b2606", + "900": "#371e06", + "950": "#281808" }, "yellow": { - "50": "#FFE89D", - "100": "#F8D76A", - "200": "#ECC02E", - "300": "#DAAE15", - "400": "#C69C12", - "500": "#9C7A0A", - "600": "#705606", - "700": "#5B4605", - "800": "#3F3004", - "900": "#322604" + "50": "#ffeeb8", + "100": "#ffe386", + "200": "#f8d76a", + "300": "#ecc02e", + "400": "#bb972a", + "500": "#9c7e1c", + "600": "#99780a", + "700": "#705606", + "800": "#5b4605", + "900": "#3a2c04", + "950": "#261d03" }, "teal": { - "50": "#93F2E8", - "100": "#6EE7DB", - "200": "#52DACC", - "300": "#3DC6B8", - "400": "#219C8F", - "500": "#1B7169", - "600": "#13564F", - "700": "#0C423C", - "800": "#0B3A35", - "900": "#0A2D29" + "50": "#a0f7ed", + "100": "#7ef3e7", + "200": "#51decf", + "300": "#28bcac", + "400": "#2ca094", + "500": "#1b7169", + "600": "#145b54", + "700": "#0b4942", + "800": "#0b3a35", + "900": "#0a2d29", + "950": "#0b2320" }, "cyan": { - "50": "#D0F0FA", - "100": "#A0E6F7", - "200": "#68D3F3", - "300": "#3CB8DC", - "400": "#2B8DAB", - "500": "#23728B", - "600": "#155266", - "700": "#0E3B49", - "800": "#0D2B36", - "900": "#0B252D" + "50": "#d0f0fa", + "100": "#95e3f6", + "200": "#62cae9", + "300": "#3cb8dc", + "400": "#249cc2", + "500": "#107b9b", + "600": "#0c6783", + "700": "#104f62", + "800": "#0d3b49", + "900": "#0b2932", + "950": "#0b2028" }, "purple": { - "50": "#E5C6FB", - "100": "#D9AFF5", - "200": "#C993EF", - "300": "#B168E8", - "400": "#984BD8", - "500": "#7A2DB9", - "600": "#591F89", - "700": "#47176E", + "50": "#e5c6fb", + "100": "#d9aff5", + "200": "#c993ef", + "300": "#b168e8", + "400": "#a26fce", + "500": "#7a2db9", + "600": "#622195", + "700": "#491870", "800": "#391457", - "900": "#2E1146" + "900": "#2c1042", + "950": "#23132f" }, "pink": { - "50": "#F6C5DE", - "100": "#F69AD1", - "200": "#ED77BE", - "300": "#E359AB", - "400": "#CB4394", - "500": "#AC377D", - "600": "#822A5F", - "700": "#68204B", - "800": "#601D46", - "900": "#471432", - "900-80": "#471432CC" + "50": "#ffbbe4", + "100": "#f69ad1", + "200": "#ed77be", + "300": "#e359ab", + "400": "#cb5d9e", + "500": "#ac377d", + "600": "#892660", + "700": "#6f1d4d", + "800": "#5b183f", + "900": "#42132f", + "950": "#2e0f22" }, "violet": { - "50": "#DACBF7", - "100": "#C4AFEE", - "200": "#B398EF", - "300": "#9D7CEA", - "400": "#8867E8", - "500": "#5C3FC2", - "600": "#4639A6", - "700": "#332978", - "800": "#281E5D", - "900": "#221C42" + "50": "#cdbeff", + "100": "#bca9fc", + "200": "#9f87ed", + "300": "#9478f8", + "400": "#9683d8", + "500": "#785fce", + "600": "#403397", + "700": "#3d3286", + "800": "#291d64", + "900": "#1f1841", + "950": "#18142e" + }, + "gray-alpha": { + "50": "#fffffff7", + "100": "#ffffffd1", + "200": "#ffffffab", + "300": "#ffffff78", + "400": "#ffffff69", + "450": "#ffffff4d", + "500": "#ffffff36", + "600": "#ffffff26", + "700": "#ffffff1f", + "800": "#ffffff14", + "900": "#ffffff0f", + "950": "#0000000a" + }, + "red-alpha": { + "50": "#ffdede", + "100": "#ffc1c1", + "200": "#fe7c7c", + "300": "#ff5858f0", + "400": "#fa3c3cd9", + "500": "#ed2222ba", + "600": "#ed2d2d8a", + "700": "#c120207d", + "800": "#c01b1b61", + "900": "#5f16168f", + "950": "#53060666" } }, "overlay": { "white": { - "50": "#FFFFFF1A", - "100": "#FFFFFF2E", - "200": "#FFFFFF45", - "300": "#FFFFFF5C", - "400": "#FFFFFF73", - "500": "#FFFFFF8A", - "600": "#FFFFFFA1", - "700": "#FFFFFFB8", - "800": "#FFFFFFCF", - "900": "#FFFFFFE6" + "50": "#ffffff1a", + "100": "#ffffff2e", + "200": "#ffffff45", + "300": "#ffffff5c", + "400": "#ffffff73", + "500": "#ffffff8a", + "600": "#ffffffa1", + "700": "#ffffffb8", + "800": "#ffffffcf", + "900": "#ffffffe5", + "950": "#fffffff2" }, "black": { "50": "#00000017", - "100": "#0000002E", + "100": "#0000002e", "200": "#00000045", - "300": "#0000005C", + "300": "#0000005c", "400": "#00000073", - "500": "#0000008A", - "600": "#000000A1", - "700": "#000000B8", - "800": "#000000CF", - "900": "#000000E6" + "500": "#0000008a", + "600": "#000000a1", + "700": "#000000b8", + "800": "#000000cf", + "900": "#000000e5", + "950": "#000000f2" } }, "neutral": { - "white": "#FFFFFF", + "white": "#ffffff", "black": "#000000" }, "themedVariables": { "light": { - "outline": { - "white": "neutral/white", - "gray-1": "lightMode/gray/200", - "gray-2": "lightMode/gray/300", - "gray-3": "lightMode/gray/400", - "gray-4": "lightMode/gray/500", - "gray-5": "lightMode/gray/800", - "red-1": "lightMode/red/300", - "red-2": "lightMode/red/400", - "red-3": "lightMode/red/500", - "green-1": "lightMode/green/300", - "green-2": "lightMode/green/400", - "amber-1": "lightMode/amber/300", - "amber-2": "lightMode/amber/400", - "blue-1": "lightMode/blue/300", - "orange-1": "lightMode/orange/400", - "gray-modals": "lightMode/gray/200" - }, "surface": { - "white": "neutral/white", + "base": "neutral/white", "gray-1": "lightMode/gray/50", "gray-2": "lightMode/gray/100", "gray-3": "lightMode/gray/200", @@ -357,6 +399,10 @@ "gray-5": "lightMode/gray/700", "gray-6": "lightMode/gray/800", "gray-7": "lightMode/gray/900", + "menu-bar": "lightMode/gray/50", + "base-contrast": "neutral/white", + "gray-1-contrast": "neutral/white", + "gray-2-contrast": "neutral/white", "red-1": "lightMode/red/50", "red-2": "lightMode/red/100", "red-3": "lightMode/red/200", @@ -366,133 +412,263 @@ "red-7": "lightMode/red/800", "green-1": "lightMode/green/50", "green-2": "lightMode/green/100", - "green-3": "lightMode/green/600", + "green-3": "lightMode/green/200", + "green-4": "lightMode/green/300", + "green-5": "lightMode/green/600", + "green-6": "lightMode/green/700", + "green-7": "lightMode/green/800", "amber-1": "lightMode/amber/50", "amber-2": "lightMode/amber/100", - "amber-3": "lightMode/amber/600", + "amber-3": "lightMode/amber/200", + "amber-4": "lightMode/amber/300", + "amber-5": "lightMode/amber/600", + "amber-6": "lightMode/amber/700", + "amber-7": "lightMode/amber/800", "blue-1": "lightMode/blue/50", "blue-2": "lightMode/blue/100", - "blue-3": "lightMode/blue/600", - "orange-1": "lightMode/orange/100", - "violet-1": "lightMode/violet/100", + "blue-3": "lightMode/blue/200", + "blue-4": "lightMode/blue/300", + "blue-5": "lightMode/blue/600", + "blue-6": "lightMode/blue/700", + "blue-7": "lightMode/blue/800", + "orange-2": "lightMode/orange/100", + "violet-2": "lightMode/violet/100", + "violet-3": "lightMode/violet/200", + "violet-4": "lightMode/violet/300", + "violet-5": "lightMode/violet/600", + "violet-6": "lightMode/violet/700", + "violet-7": "lightMode/violet/800", + "cyan-2": "lightMode/cyan/100", + "alert-button-default": "neutral/white", + "alert-button-info": "neutral/white", + "alert-button-success": "neutral/white", + "alert-button-warning": "neutral/white", + "alert-button-error": "neutral/white", + "white": "neutral/white", + "modal": "neutral/white", + "selected": "neutral/white", + "cards": "neutral/white", "cyan-1": "lightMode/cyan/100", "pink-1": "lightMode/pink/100", - "menu-bar": "lightMode/gray/50", - "cards": "neutral/white", - "modal": "neutral/white", - "selected": "neutral/white" + "orange-1": "lightMode/orange/100", + "violet-1": "lightMode/violet/100" }, "ink": { - "white": "neutral/white", + "base": "neutral/white", "gray-1": "lightMode/gray/200", "gray-2": "lightMode/gray/300", "gray-3": "lightMode/gray/400", "gray-4": "lightMode/gray/500", "gray-5": "lightMode/gray/600", "gray-6": "lightMode/gray/700", - "gray-7": "lightMode/gray/700", - "gray-8": "lightMode/gray/800", - "gray-9": "lightMode/gray/900", + "gray-7": "lightMode/gray/800", + "gray-8": "lightMode/gray/900", "red-1": "lightMode/red/50", "red-2": "lightMode/red/400", "red-3": "lightMode/red/500", - "red-4": "lightMode/red/600", + "red-4": "lightMode/red/700", "green-1": "lightMode/green/50", - "green-2": "lightMode/green/500", - "green-3": "lightMode/green/600", + "green-2": "lightMode/green/400", + "green-3": "lightMode/green/500", + "green-4": "lightMode/green/700", + "green-6": "lightMode/green/600", "amber-1": "lightMode/amber/50", - "amber-2": "lightMode/amber/500", - "amber-3": "lightMode/amber/600", + "amber-2": "lightMode/amber/400", + "amber-3": "lightMode/amber/500", + "amber-4": "lightMode/amber/700", "blue-1": "lightMode/blue/50", - "blue-2": "lightMode/blue/500", - "blue-3": "lightMode/blue/600", + "blue-2": "lightMode/blue/400", + "blue-3": "lightMode/blue/500", + "blue-4": "lightMode/blue/700", + "cyan-3": "lightMode/cyan/500", + "violet-1": "lightMode/violet/50", + "violet-2": "lightMode/violet/400", + "violet-3": "lightMode/violet/500", + "violet-4": "lightMode/violet/700", + "blue-link": "lightMode/blue/400", + "alert-button-default": "lightMode/gray/900", + "alert-button-info": "lightMode/gray/900", + "alert-button-success": "lightMode/gray/900", + "alert-button-warning": "lightMode/gray/900", + "alert-button-error": "lightMode/gray/900", + "white": "neutral/white", + "gray-9": "lightMode/gray/900", "cyan-1": "lightMode/cyan/500", - "pink-1": "lightMode/pink/500", - "violet-1": "lightMode/violet/500", - "blue-link": "lightMode/blue/400" + "pink-1": "lightMode/pink/500" + }, + "outline": { + "base": "neutral/white", + "gray-1": "lightMode/gray/200", + "gray-1-contrast": "lightMode/gray/200", + "gray-2": "lightMode/gray/300", + "gray-3": "lightMode/gray/400", + "gray-4": "lightMode/gray/500", + "gray-5": "lightMode/gray/800", + "red-2": "lightMode/red/300", + "red-3": "lightMode/red/400", + "red-4": "lightMode/red/500", + "green-2": "lightMode/green/300", + "green-3": "lightMode/green/400", + "green-4": "lightMode/green/500", + "amber-2": "lightMode/amber/300", + "amber-3": "lightMode/amber/400", + "amber-4": "lightMode/amber/500", + "blue-2": "lightMode/blue/300", + "blue-3": "lightMode/blue/400", + "blue-4": "lightMode/blue/500", + "orange-3": "lightMode/orange/400", + "violet-2": "lightMode/violet/300", + "violet-3": "lightMode/violet/400", + "violet-4": "lightMode/violet/500", + "gray-modal": "lightMode/gray/200", + "gray-modals": "lightMode/gray/200", + "white": "neutral/white", + "blue-1": "lightMode/blue/300", + "red-1": "lightMode/red/300", + "green-1": "lightMode/green/200", + "amber-1": "lightMode/amber/200", + "orange-1": "lightMode/orange/200" } }, "dark": { - "outline": { - "white": "darkMode/gray/800", - "gray-1": "darkMode/gray/700", - "gray-2": "darkMode/gray/600", - "gray-3": "darkMode/gray/500", - "gray-4": "darkMode/gray/300", - "gray-5": "lightMode/gray/200", - "red-1": "darkMode/red/800", - "red-2": "darkMode/red/700", - "red-3": "darkMode/red/600", - "green-1": "darkMode/green/800", - "green-2": "darkMode/green/700", - "amber-1": "darkMode/amber/800", - "amber-2": "darkMode/amber/700", - "blue-1": "darkMode/blue/800", - "orange-1": "darkMode/orange/700", - "gray-modals": "darkMode/gray/600" - }, "surface": { - "white": "darkMode/gray/900", - "gray-1": "darkMode/gray/700", - "gray-2": "darkMode/gray/650", + "base": "darkMode/gray/950", + "gray-1": "darkMode/gray/800", + "gray-2": "darkMode/gray/700", "gray-3": "darkMode/gray/600", "gray-4": "darkMode/gray/500", "gray-5": "darkMode/gray/200", "gray-6": "darkMode/gray/100", "gray-7": "darkMode/gray/50", - "red-1": "darkMode/red/900", - "red-2": "darkMode/red/900-90", - "red-3": "darkMode/red/800-90", + "menu-bar": "darkMode/gray/950", + "base-contrast": "darkMode/gray/900", + "gray-1-contrast": "darkMode/gray/900", + "gray-2-contrast": "darkMode/gray/600", + "red-1": "darkMode/red/950", + "red-2": "darkMode/red/900", + "red-3": "darkMode/red/800", "red-4": "darkMode/red/700", - "red-5": "darkMode/red/400", - "red-6": "darkMode/red/500", + "red-5": "darkMode/red/500", + "red-6": "darkMode/red/400", "red-7": "darkMode/red/600", "green-1": "darkMode/green/900", - "green-2": "darkMode/green/800", - "green-3": "darkMode/green/400", - "amber-1": "darkMode/amber/900", - "amber-2": "darkMode/amber/800", - "amber-3": "darkMode/amber/400", - "blue-1": "darkMode/blue/900", - "blue-2": "darkMode/blue/800", - "blue-3": "darkMode/blue/400", - "orange-1": "darkMode/orange/900-80", - "violet-1": "darkMode/violet/900", - "cyan-1": "darkMode/cyan/900", - "pink-1": "darkMode/pink/900-80", - "menu-bar": "darkMode/gray/900", - "cards": "darkMode/gray/800", + "green-2": "darkMode/green/900", + "green-3": "darkMode/green/800", + "green-4": "darkMode/green/700", + "green-5": "darkMode/green/500", + "green-6": "darkMode/green/400", + "green-7": "darkMode/green/600", + "amber-1": "darkMode/amber/950", + "amber-2": "darkMode/amber/900", + "amber-3": "darkMode/amber/800", + "amber-4": "darkMode/amber/700", + "amber-5": "darkMode/amber/500", + "amber-6": "darkMode/amber/400", + "amber-7": "darkMode/amber/600", + "blue-1": "darkMode/blue/950", + "blue-2": "darkMode/blue/900", + "blue-3": "darkMode/blue/800", + "blue-4": "darkMode/blue/700", + "blue-5": "darkMode/blue/500", + "blue-6": "darkMode/blue/400", + "blue-7": "darkMode/blue/600", + "orange-2": "darkMode/orange/900", + "violet-2": "darkMode/violet/900", + "violet-3": "darkMode/violet/800", + "violet-4": "darkMode/violet/700", + "violet-5": "darkMode/violet/500", + "violet-6": "darkMode/violet/400", + "violet-7": "darkMode/violet/600", + "cyan-2": "darkMode/cyan/900", + "alert-button-default": "darkMode/gray/500", + "alert-button-info": "darkMode/blue/700", + "alert-button-success": "darkMode/green/700", + "alert-button-warning": "darkMode/amber/700", + "alert-button-error": "darkMode/red/700", + "white": "darkMode/gray/900", "modal": "darkMode/gray/700", - "selected": "darkMode/gray/500" + "selected": "darkMode/gray/500", + "cards": "darkMode/gray/800", + "cyan-1": "darkMode/cyan/900", + "pink-1": "darkMode/pink/900", + "orange-1": "darkMode/orange/900", + "violet-1": "darkMode/violet/900" }, "ink": { - "white": "darkMode/gray/900", - "gray-1": "darkMode/gray/700", - "gray-2": "darkMode/gray/500", - "gray-3": "darkMode/gray/400", - "gray-4": "darkMode/gray/400", - "gray-5": "darkMode/gray/300", - "gray-6": "darkMode/gray/250", + "base": "darkMode/gray/950", + "gray-1": "darkMode/gray/800", + "gray-2": "darkMode/gray/600", + "gray-3": "darkMode/gray/500", + "gray-4": "darkMode/gray/450", + "gray-5": "darkMode/gray/400", + "gray-6": "darkMode/gray/300", "gray-7": "darkMode/gray/200", "gray-8": "darkMode/gray/100", - "gray-9": "darkMode/gray/50", "red-1": "neutral/white", "red-2": "darkMode/red/700", "red-3": "darkMode/red/400", - "red-4": "darkMode/red/200", + "red-4": "darkMode/red/300", "green-1": "neutral/white", - "green-2": "darkMode/green/400", - "green-3": "darkMode/green/300", + "green-2": "darkMode/green/700", + "green-3": "darkMode/green/400", + "green-4": "darkMode/green/300", + "green-6": "darkMode/green/400", "amber-1": "neutral/white", - "amber-2": "darkMode/amber/400", - "amber-3": "darkMode/amber/300", + "amber-2": "darkMode/amber/700", + "amber-3": "darkMode/amber/500", + "amber-4": "darkMode/amber/400", "blue-1": "neutral/white", - "blue-2": "darkMode/blue/400", - "blue-3": "darkMode/blue/300", - "cyan-1": "darkMode/cyan/300", - "pink-1": "darkMode/pink/300", - "violet-1": "darkMode/violet/300", - "blue-link": "darkMode/blue/500" + "blue-2": "darkMode/blue/700", + "blue-3": "darkMode/blue/400", + "blue-4": "darkMode/blue/300", + "cyan-3": "darkMode/cyan/400", + "violet-1": "neutral/white", + "violet-2": "darkMode/violet/700", + "violet-3": "darkMode/violet/400", + "violet-4": "darkMode/violet/300", + "blue-link": "darkMode/blue/500", + "alert-button-default": "darkMode/gray/50", + "alert-button-info": "darkMode/blue/200", + "alert-button-success": "darkMode/green/200", + "alert-button-warning": "darkMode/amber/200", + "alert-button-error": "darkMode/red/200", + "white": "darkMode/gray/900", + "gray-9": "darkMode/gray/50", + "cyan-1": "darkMode/cyan/500", + "pink-1": "darkMode/pink/500" + }, + "outline": { + "base": "darkMode/gray/950", + "gray-1": "darkMode/gray/800", + "gray-1-contrast": "darkMode/gray/700", + "gray-2": "darkMode/gray/600", + "gray-3": "darkMode/gray/500", + "gray-4": "darkMode/gray/450", + "gray-5": "lightMode/gray/200", + "red-2": "darkMode/red/800", + "red-3": "darkMode/red/700", + "red-4": "darkMode/red/600", + "green-2": "darkMode/green/800", + "green-3": "darkMode/green/700", + "green-4": "darkMode/green/600", + "amber-2": "darkMode/amber/800", + "amber-3": "darkMode/amber/700", + "amber-4": "darkMode/amber/600", + "blue-2": "darkMode/blue/800", + "blue-3": "darkMode/blue/700", + "blue-4": "darkMode/blue/600", + "orange-3": "darkMode/orange/700", + "violet-2": "darkMode/violet/800", + "violet-3": "darkMode/violet/700", + "violet-4": "darkMode/violet/600", + "gray-modal": "darkMode/gray/600", + "gray-modals": "darkMode/gray/600", + "white": "darkMode/gray/900", + "blue-1": "darkMode/blue/800", + "red-1": "darkMode/red/800", + "green-1": "darkMode/green/800", + "amber-1": "darkMode/amber/800", + "orange-1": "darkMode/orange/800" } } } diff --git a/tailwind/figma-tokens-to-theme.js b/tailwind/figma-tokens-to-theme.js new file mode 100644 index 000000000..805aa33d9 --- /dev/null +++ b/tailwind/figma-tokens-to-theme.js @@ -0,0 +1,351 @@ +/** + * Generator: reads the W3C Design Tokens Community Group JSON exported from + * Figma (espresso-v2-design-tokens/) and emits theme JSON files that the + * tailwind plugin can consume. + * + * Inputs: espresso-v2-design-tokens/*.tokens.json + * Outputs: tailwind/generated/{colors,radius,typography}.json + * + * Run with: yarn sync-tokens + */ + +import fs from 'fs' +import path from 'path' +import { fileURLToPath } from 'url' + +const __dirname = path.dirname(fileURLToPath(import.meta.url)) +const REPO_ROOT = path.resolve(__dirname, '..') +const TOKENS_DIR = path.join(REPO_ROOT, 'espresso-v2-design-tokens') +const OUT_DIR = path.join(__dirname, 'generated') + +// Color families mirrored from Figma's "🔵 Colour primitives" collection. +// Each appears under `light.` and `dark.` plus their alpha pair. +const COLOR_FAMILIES = [ + 'gray', + 'blue', + 'green', + 'red', + 'orange', + 'amber', + 'yellow', + 'teal', + 'cyan', + 'purple', + 'pink', + 'violet', +] +const ALPHA_FAMILIES = ['gray-alpha', 'red-alpha'] + +// Named aliases layered on top of Figma's numeric radius keys. +// Each name is matched by px value, so the alias stays correct if Figma shifts. +const RADIUS_NAME_BY_PX = { + '0px': 'none', + '4px': 'sm', + '8px': 'DEFAULT', + '10px': 'md', + '12px': 'lg', + '16px': 'xl', + '20px': '2xl', +} +// Preserved from current plugin.js — Figma doesn't model `full`. +const RADIUS_EXTRA = { full: '9999px' } + +// Figma's font weight strings → tailwind numeric weights. +const FONT_WEIGHT_MAP = { + regular: 400, + medium: 500, + semibold: 600, + bold: 700, + extrabold: 800, +} + +function readTokens(filename) { + return JSON.parse(fs.readFileSync(path.join(TOKENS_DIR, filename), 'utf8')) +} + +function ensureOutDir() { + fs.mkdirSync(OUT_DIR, { recursive: true }) +} + +function writeJSON(filename, data) { + const filepath = path.join(OUT_DIR, filename) + fs.writeFileSync(filepath, JSON.stringify(data, null, 2) + '\n') + console.log(` wrote ${path.relative(REPO_ROOT, filepath)}`) +} + +// ---------- COLORS ---------- + +// Build colors.json in the shape colorPalette.js already consumes: +// { lightMode, darkMode, overlay, neutral, themedVariables: { light, dark } } +function buildColors() { + const primitives = readTokens('🔵 Colour primitives.Light.tokens.json') + const stylesLight = readTokens('Styles.Light.tokens.json') + const stylesDark = readTokens('Styles.Dark.tokens.json') + + const colors = { + lightMode: {}, + darkMode: {}, + overlay: { white: {}, black: {} }, + neutral: { + white: primitives.neutral.white.$value, + black: primitives.neutral.black.$value, + }, + themedVariables: { + light: { surface: {}, ink: {}, outline: {} }, + dark: { surface: {}, ink: {}, outline: {} }, + }, + } + + // Primitive ramps — light.. + for (const family of [...COLOR_FAMILIES, ...ALPHA_FAMILIES]) { + if (primitives.light?.[family]) { + colors.lightMode[family] = mapShades(primitives.light[family]) + } + if (primitives.dark?.[family]) { + colors.darkMode[family] = mapShades(primitives.dark[family]) + } + } + + // Overlay ramps — white-alpha / black-alpha at top level of primitives. + if (primitives['white-alpha']) { + colors.overlay.white = mapShades(primitives['white-alpha']) + } + if (primitives['black-alpha']) { + colors.overlay.black = mapShades(primitives['black-alpha']) + } + + // Semantic aliases — Styles.Light/Dark → themedVariables.{light,dark} + collectSemanticCategory(stylesLight, 'surface', colors.themedVariables.light) + collectSemanticCategory(stylesLight, 'ink', colors.themedVariables.light) + collectSemanticCategory(stylesLight, 'outline', colors.themedVariables.light) + collectSemanticCategory(stylesDark, 'surface', colors.themedVariables.dark) + collectSemanticCategory(stylesDark, 'ink', colors.themedVariables.dark) + collectSemanticCategory(stylesDark, 'outline', colors.themedVariables.dark) + + applyAliases(colors.themedVariables.light) + applyAliases(colors.themedVariables.dark) + applyLegacyEntries(colors.themedVariables.light, LEGACY_ENTRIES.light) + applyLegacyEntries(colors.themedVariables.dark, LEGACY_ENTRIES.dark) + + return colors +} + +// Renames — legacy name points at the current Figma name in the same category. +// Resolves dynamically so the legacy entry tracks any future value change. +const ALIASES = { + outline: { + 'gray-modals': 'gray-modal', + }, +} + +// Legacy semantic tokens with no surviving Figma equivalent — keep them pinned +// to a primitive reference so src/ consumers keep working. Values use the +// colorsData reference shape ("lightMode/gray/900", "neutral/white") that +// colorPalette.js#resolveColorReference already understands. Only added when +// the Figma export doesn't already define the name. +const LEGACY_ENTRIES = { + light: { + surface: { + white: 'neutral/white', + modal: 'neutral/white', + selected: 'neutral/white', + cards: 'neutral/white', + 'cyan-1': 'lightMode/cyan/100', + 'pink-1': 'lightMode/pink/100', + 'orange-1': 'lightMode/orange/100', + 'violet-1': 'lightMode/violet/100', + 'green-3': 'lightMode/green/600', + 'amber-3': 'lightMode/amber/600', + 'blue-3': 'lightMode/blue/600', + }, + ink: { + white: 'neutral/white', + 'gray-9': 'lightMode/gray/900', + 'cyan-1': 'lightMode/cyan/500', + 'pink-1': 'lightMode/pink/500', + 'violet-1': 'lightMode/violet/500', + }, + outline: { + white: 'neutral/white', + 'blue-1': 'lightMode/blue/300', + 'red-1': 'lightMode/red/300', + 'green-1': 'lightMode/green/200', + 'amber-1': 'lightMode/amber/200', + 'orange-1': 'lightMode/orange/200', + }, + }, + dark: { + surface: { + white: 'darkMode/gray/900', + modal: 'darkMode/gray/700', + selected: 'darkMode/gray/500', + cards: 'darkMode/gray/800', + 'cyan-1': 'darkMode/cyan/900', + 'pink-1': 'darkMode/pink/900', + 'orange-1': 'darkMode/orange/900', + 'violet-1': 'darkMode/violet/900', + 'green-3': 'darkMode/green/400', + 'amber-3': 'darkMode/amber/400', + 'blue-3': 'darkMode/blue/400', + }, + ink: { + white: 'darkMode/gray/900', + 'gray-9': 'darkMode/gray/50', + 'cyan-1': 'darkMode/cyan/500', + 'pink-1': 'darkMode/pink/500', + 'violet-1': 'darkMode/violet/500', + }, + outline: { + white: 'darkMode/gray/900', + 'blue-1': 'darkMode/blue/800', + 'red-1': 'darkMode/red/800', + 'green-1': 'darkMode/green/800', + 'amber-1': 'darkMode/amber/800', + 'orange-1': 'darkMode/orange/800', + }, + }, +} + +function applyAliases(themed) { + for (const [category, map] of Object.entries(ALIASES)) { + if (!themed[category]) continue + for (const [legacy, current] of Object.entries(map)) { + if (themed[category][current] && !themed[category][legacy]) { + themed[category][legacy] = themed[category][current] + } + } + } +} + +function applyLegacyEntries(themed, legacy) { + for (const [category, entries] of Object.entries(legacy)) { + themed[category] = themed[category] || {} + for (const [name, ref] of Object.entries(entries)) { + if (!themed[category][name]) { + themed[category][name] = ref + } + } + } +} + +function mapShades(family) { + const out = {} + for (const [shade, token] of Object.entries(family)) { + if (token && token.$value) { + out[shade] = token.$value + } + } + return out +} + +function collectSemanticCategory(styles, category, target) { + const section = styles[category] + if (!section) return + target[category] = target[category] || {} + for (const [name, token] of Object.entries(section)) { + if (!token?.$value) continue + // Resolve `{path.to.token}` aliases into the "lightMode/family/shade" format + // that colorPalette.js#resolveColorReference understands. + target[category][name] = aliasToReference(token.$value) + } +} + +// Convert a DTCG alias string like "{light.gray.50}" into the reference shape +// stored in colors.json today: "lightMode/gray/50". Non-aliases (literal hex) +// pass through unchanged so the consumer can decide whether to treat them as +// resolved values. +function aliasToReference(value) { + if (typeof value !== 'string') return value + const match = value.match(/^\{(.+)\}$/) + if (!match) return value + const segments = match[1].split('.') + + // {neutral.white} | {neutral.black} + if (segments[0] === 'neutral' && segments.length === 2) { + return `neutral/${segments[1]}` + } + // {white-alpha.50} | {black-alpha.50} → overlay/white/50 | overlay/black/50 + if (segments[0] === 'white-alpha' || segments[0] === 'black-alpha') { + const color = segments[0].split('-')[0] + return `overlay/${color}/${segments[1]}` + } + // {light.gray.50} → lightMode/gray/50 + // {light.gray-alpha.50} → lightMode/gray-alpha/50 + if (segments[0] === 'light') { + return `lightMode/${segments.slice(1, -1).join('-')}/${segments[segments.length - 1]}` + } + if (segments[0] === 'dark') { + return `darkMode/${segments.slice(1, -1).join('-')}/${segments[segments.length - 1]}` + } + console.warn(` ⚠ unresolved alias: ${value}`) + return value +} + +// ---------- RADIUS ---------- + +function buildRadius() { + const tokens = readTokens('Tokens.Mode 1.tokens.json') + const radius = { ...RADIUS_EXTRA } + + for (const [key, token] of Object.entries(tokens.radius || {})) { + const px = token.$value + radius[key] = px + const name = RADIUS_NAME_BY_PX[px] + if (name) radius[name] = px + } + return radius +} + +// ---------- TYPOGRAPHY ---------- + +function buildTypography() { + const tokens = readTokens('Typography.Desktop.tokens.json') + const sizes = tokens.font?.size || {} + const lineHeights = tokens.font?.['line-height'] || {} + const weights = tokens.font?.weight || {} + const families = tokens.font?.family || {} + + const fontSize = {} + for (const [key, token] of Object.entries(sizes)) { + const lh = lineHeights[key]?.$value + fontSize[key] = [ + token.$value, + { + lineHeight: lh || '1.15', + }, + ] + } + + const fontWeight = {} + for (const [key, token] of Object.entries(weights)) { + const numeric = FONT_WEIGHT_MAP[token.$value] + fontWeight[key] = numeric ?? token.$value + } + + const fontFamily = {} + for (const [key, token] of Object.entries(families)) { + fontFamily[key] = token.$value + } + + return { fontFamily, fontSize, fontWeight } +} + +// ---------- MAIN ---------- + +function main() { + if (!fs.existsSync(TOKENS_DIR)) { + console.error(`✗ tokens directory not found: ${TOKENS_DIR}`) + process.exit(1) + } + + console.log(`Reading tokens from ${path.relative(REPO_ROOT, TOKENS_DIR)}/`) + ensureOutDir() + + writeJSON('colors.json', buildColors()) + writeJSON('radius.json', buildRadius()) + writeJSON('typography.json', buildTypography()) + + console.log('✓ done') +} + +main() diff --git a/tailwind/generated/colors.json b/tailwind/generated/colors.json new file mode 100644 index 000000000..c8c9885f9 --- /dev/null +++ b/tailwind/generated/colors.json @@ -0,0 +1,675 @@ +{ + "lightMode": { + "gray": { + "50": "#f8f8f8", + "100": "#f3f3f3", + "200": "#ededed", + "300": "#e2e2e2", + "400": "#c7c7c7", + "500": "#999999", + "600": "#7c7c7c", + "700": "#525252", + "800": "#383838", + "900": "#171717", + "950": "#0f0f0f" + }, + "blue": { + "50": "#f0f7fc", + "100": "#e6f4ff", + "200": "#c8e6ff", + "300": "#a7d7fd", + "400": "#73bbf6", + "500": "#0289f7", + "600": "#007be0", + "700": "#0070cc", + "800": "#005ca3", + "900": "#004880", + "950": "#032e63" + }, + "green": { + "50": "#f1fbf5", + "100": "#e4faeb", + "200": "#c3f9d3", + "300": "#a6efc0", + "400": "#78e09f", + "500": "#46b37e", + "600": "#268c5c", + "700": "#137949", + "800": "#075e35", + "900": "#173b2c", + "950": "#0a3020" + }, + "red": { + "50": "#fff7f7", + "100": "#ffe7e7", + "200": "#ffd8d8", + "300": "#fdc2c2", + "400": "#f79596", + "500": "#e03636", + "600": "#cc2929", + "700": "#b52a2a", + "800": "#941f1f", + "900": "#6b1515", + "950": "#4c0d0d" + }, + "orange": { + "50": "#fff4ed", + "100": "#ffefe4", + "200": "#ffdec5", + "300": "#ffcba3", + "400": "#f4b07f", + "500": "#e86c13", + "600": "#d35a09", + "700": "#bd3e0c", + "800": "#9e3513", + "900": "#6b2711", + "950": "#491605" + }, + "amber": { + "50": "#fdfaed", + "100": "#fff7d3", + "200": "#feeda9", + "300": "#fbdb73", + "400": "#fbc53f", + "500": "#e79913", + "600": "#d47408", + "700": "#b35309", + "800": "#91400d", + "900": "#763813", + "950": "#4e2209" + }, + "yellow": { + "50": "#fcfbe8", + "100": "#fff7d3", + "200": "#f7e9a8", + "300": "#f5e171", + "400": "#f2d14b", + "500": "#edba13", + "600": "#ab790d", + "700": "#9a6304", + "800": "#8c5600", + "900": "#733f12", + "950": "#512a09" + }, + "teal": { + "50": "#eefbf8", + "100": "#e6f7f4", + "200": "#bae8e1", + "300": "#97ded4", + "400": "#73d1c4", + "500": "#36baad", + "600": "#0a857b", + "700": "#0f736b", + "800": "#115c57", + "900": "#114541", + "950": "#053734" + }, + "cyan": { + "50": "#f2fbfd", + "100": "#ddf7ff", + "200": "#b3e8f7", + "300": "#99e2f8", + "400": "#72d5f3", + "500": "#3bbde5", + "600": "#1f8cad", + "700": "#1d7f9d", + "800": "#125c73", + "900": "#164759", + "950": "#05383f" + }, + "purple": { + "50": "#f8f3fb", + "100": "#f6e9ff", + "200": "#ecd3ff", + "300": "#e2b9fc", + "400": "#bf78fa", + "500": "#9c45e3", + "600": "#8e49ca", + "700": "#6e399d", + "800": "#5c2f83", + "900": "#401863", + "950": "#2d084e" + }, + "pink": { + "50": "#fff7fc", + "100": "#fde8f5", + "200": "#ffd5f0", + "300": "#f9b9e0", + "400": "#f77cc6", + "500": "#e34aa6", + "600": "#cf3a96", + "700": "#9c2671", + "800": "#801458", + "900": "#570f3e", + "950": "#40062c" + }, + "violet": { + "50": "#f5f3fc", + "100": "#eee8ff", + "200": "#dbd5ff", + "300": "#c9bafb", + "400": "#a68efe", + "500": "#7757ee", + "600": "#6b53d0", + "700": "#4f3da1", + "800": "#392980", + "900": "#251959", + "950": "#150655" + }, + "gray-alpha": { + "50": "#00000008", + "100": "#0000000b", + "200": "#00000012", + "300": "#0000001d", + "400": "#00000038", + "500": "#00000066", + "600": "#00000083", + "700": "#000000ad", + "800": "#000000c7", + "900": "#000000e8", + "950": "#000000f0" + } + }, + "darkMode": { + "gray": { + "50": "#f8f8f8", + "100": "#d9d9d9", + "200": "#afafaf", + "300": "#808080", + "400": "#717171", + "450": "#575757", + "500": "#424242", + "600": "#343434", + "700": "#2b2b2b", + "800": "#242424", + "900": "#1f1f1f", + "950": "#171717" + }, + "blue": { + "50": "#c9e0f5", + "100": "#add2f5", + "200": "#8cc1ec", + "300": "#5aaef2", + "400": "#2a8edf", + "500": "#1580d8", + "600": "#155999", + "700": "#063d71", + "800": "#052b53", + "900": "#10233d", + "950": "#0e1c2f" + }, + "green": { + "50": "#c8f3de", + "100": "#9be6c1", + "200": "#78d7a9", + "300": "#58c08e", + "400": "#469170", + "500": "#148950", + "600": "#077241", + "700": "#035831", + "800": "#0a3f27", + "900": "#0c2d1c", + "950": "#0b1e14" + }, + "red": { + "50": "#ffdede", + "100": "#ffc1c1", + "200": "#fe7c7c", + "300": "#eb4d52", + "400": "#ce5a5a", + "500": "#b01f1f", + "600": "#862020", + "700": "#661717", + "800": "#521515", + "900": "#441316", + "950": "#271111" + }, + "orange": { + "50": "#ffcdad", + "100": "#ffa873", + "200": "#fa8a40", + "300": "#e3701c", + "400": "#e16914", + "500": "#984509", + "600": "#823906", + "700": "#683108", + "800": "#532707", + "900": "#361c09", + "950": "#2b1708" + }, + "amber": { + "50": "#ffe59a", + "100": "#f4c25f", + "200": "#ffaa3e", + "300": "#fa961f", + "400": "#c87a2d", + "500": "#bd660f", + "600": "#975215", + "700": "#753a07", + "800": "#4b2606", + "900": "#371e06", + "950": "#281808" + }, + "yellow": { + "50": "#ffeeb8", + "100": "#ffe386", + "200": "#f8d76a", + "300": "#ecc02e", + "400": "#bb972a", + "500": "#9c7e1c", + "600": "#99780a", + "700": "#705606", + "800": "#5b4605", + "900": "#3a2c04", + "950": "#261d03" + }, + "teal": { + "50": "#a0f7ed", + "100": "#7ef3e7", + "200": "#51decf", + "300": "#28bcac", + "400": "#2ca094", + "500": "#1b7169", + "600": "#145b54", + "700": "#0b4942", + "800": "#0b3a35", + "900": "#0a2d29", + "950": "#0b2320" + }, + "cyan": { + "50": "#d0f0fa", + "100": "#95e3f6", + "200": "#62cae9", + "300": "#3cb8dc", + "400": "#249cc2", + "500": "#107b9b", + "600": "#0c6783", + "700": "#104f62", + "800": "#0d3b49", + "900": "#0b2932", + "950": "#0b2028" + }, + "purple": { + "50": "#e5c6fb", + "100": "#d9aff5", + "200": "#c993ef", + "300": "#b168e8", + "400": "#a26fce", + "500": "#7a2db9", + "600": "#622195", + "700": "#491870", + "800": "#391457", + "900": "#2c1042", + "950": "#23132f" + }, + "pink": { + "50": "#ffbbe4", + "100": "#f69ad1", + "200": "#ed77be", + "300": "#e359ab", + "400": "#cb5d9e", + "500": "#ac377d", + "600": "#892660", + "700": "#6f1d4d", + "800": "#5b183f", + "900": "#42132f", + "950": "#2e0f22" + }, + "violet": { + "50": "#cdbeff", + "100": "#bca9fc", + "200": "#9f87ed", + "300": "#9478f8", + "400": "#9683d8", + "500": "#785fce", + "600": "#403397", + "700": "#3d3286", + "800": "#291d64", + "900": "#1f1841", + "950": "#18142e" + }, + "gray-alpha": { + "50": "#fffffff7", + "100": "#ffffffd1", + "200": "#ffffffab", + "300": "#ffffff78", + "400": "#ffffff69", + "450": "#ffffff4d", + "500": "#ffffff36", + "600": "#ffffff26", + "700": "#ffffff1f", + "800": "#ffffff14", + "900": "#ffffff0f", + "950": "#0000000a" + }, + "red-alpha": { + "50": "#ffdede", + "100": "#ffc1c1", + "200": "#fe7c7c", + "300": "#ff5858f0", + "400": "#fa3c3cd9", + "500": "#ed2222ba", + "600": "#ed2d2d8a", + "700": "#c120207d", + "800": "#c01b1b61", + "900": "#5f16168f", + "950": "#53060666" + } + }, + "overlay": { + "white": { + "50": "#ffffff1a", + "100": "#ffffff2e", + "200": "#ffffff45", + "300": "#ffffff5c", + "400": "#ffffff73", + "500": "#ffffff8a", + "600": "#ffffffa1", + "700": "#ffffffb8", + "800": "#ffffffcf", + "900": "#ffffffe5", + "950": "#fffffff2" + }, + "black": { + "50": "#00000017", + "100": "#0000002e", + "200": "#00000045", + "300": "#0000005c", + "400": "#00000073", + "500": "#0000008a", + "600": "#000000a1", + "700": "#000000b8", + "800": "#000000cf", + "900": "#000000e5", + "950": "#000000f2" + } + }, + "neutral": { + "white": "#ffffff", + "black": "#000000" + }, + "themedVariables": { + "light": { + "surface": { + "base": "neutral/white", + "gray-1": "lightMode/gray/50", + "gray-2": "lightMode/gray/100", + "gray-3": "lightMode/gray/200", + "gray-4": "lightMode/gray/300", + "gray-5": "lightMode/gray/700", + "gray-6": "lightMode/gray/800", + "gray-7": "lightMode/gray/900", + "menu-bar": "lightMode/gray/50", + "base-contrast": "neutral/white", + "gray-1-contrast": "neutral/white", + "gray-2-contrast": "neutral/white", + "red-1": "lightMode/red/50", + "red-2": "lightMode/red/100", + "red-3": "lightMode/red/200", + "red-4": "lightMode/red/300", + "red-5": "lightMode/red/600", + "red-6": "lightMode/red/700", + "red-7": "lightMode/red/800", + "green-1": "lightMode/green/50", + "green-2": "lightMode/green/100", + "green-3": "lightMode/green/200", + "green-4": "lightMode/green/300", + "green-5": "lightMode/green/600", + "green-6": "lightMode/green/700", + "green-7": "lightMode/green/800", + "amber-1": "lightMode/amber/50", + "amber-2": "lightMode/amber/100", + "amber-3": "lightMode/amber/200", + "amber-4": "lightMode/amber/300", + "amber-5": "lightMode/amber/600", + "amber-6": "lightMode/amber/700", + "amber-7": "lightMode/amber/800", + "blue-1": "lightMode/blue/50", + "blue-2": "lightMode/blue/100", + "blue-3": "lightMode/blue/200", + "blue-4": "lightMode/blue/300", + "blue-5": "lightMode/blue/600", + "blue-6": "lightMode/blue/700", + "blue-7": "lightMode/blue/800", + "orange-2": "lightMode/orange/100", + "violet-2": "lightMode/violet/100", + "violet-3": "lightMode/violet/200", + "violet-4": "lightMode/violet/300", + "violet-5": "lightMode/violet/600", + "violet-6": "lightMode/violet/700", + "violet-7": "lightMode/violet/800", + "cyan-2": "lightMode/cyan/100", + "alert-button-default": "neutral/white", + "alert-button-info": "neutral/white", + "alert-button-success": "neutral/white", + "alert-button-warning": "neutral/white", + "alert-button-error": "neutral/white", + "white": "neutral/white", + "modal": "neutral/white", + "selected": "neutral/white", + "cards": "neutral/white", + "cyan-1": "lightMode/cyan/100", + "pink-1": "lightMode/pink/100", + "orange-1": "lightMode/orange/100", + "violet-1": "lightMode/violet/100" + }, + "ink": { + "base": "neutral/white", + "gray-1": "lightMode/gray/200", + "gray-2": "lightMode/gray/300", + "gray-3": "lightMode/gray/400", + "gray-4": "lightMode/gray/500", + "gray-5": "lightMode/gray/600", + "gray-6": "lightMode/gray/700", + "gray-7": "lightMode/gray/800", + "gray-8": "lightMode/gray/900", + "red-1": "lightMode/red/50", + "red-2": "lightMode/red/400", + "red-3": "lightMode/red/500", + "red-4": "lightMode/red/700", + "green-1": "lightMode/green/50", + "green-2": "lightMode/green/400", + "green-3": "lightMode/green/500", + "green-4": "lightMode/green/700", + "green-6": "lightMode/green/600", + "amber-1": "lightMode/amber/50", + "amber-2": "lightMode/amber/400", + "amber-3": "lightMode/amber/500", + "amber-4": "lightMode/amber/700", + "blue-1": "lightMode/blue/50", + "blue-2": "lightMode/blue/400", + "blue-3": "lightMode/blue/500", + "blue-4": "lightMode/blue/700", + "cyan-3": "lightMode/cyan/500", + "violet-1": "lightMode/violet/50", + "violet-2": "lightMode/violet/400", + "violet-3": "lightMode/violet/500", + "violet-4": "lightMode/violet/700", + "blue-link": "lightMode/blue/400", + "alert-button-default": "lightMode/gray/900", + "alert-button-info": "lightMode/gray/900", + "alert-button-success": "lightMode/gray/900", + "alert-button-warning": "lightMode/gray/900", + "alert-button-error": "lightMode/gray/900", + "white": "neutral/white", + "gray-9": "lightMode/gray/900", + "cyan-1": "lightMode/cyan/500", + "pink-1": "lightMode/pink/500" + }, + "outline": { + "base": "neutral/white", + "gray-1": "lightMode/gray/200", + "gray-1-contrast": "lightMode/gray/200", + "gray-2": "lightMode/gray/300", + "gray-3": "lightMode/gray/400", + "gray-4": "lightMode/gray/500", + "gray-5": "lightMode/gray/800", + "red-2": "lightMode/red/300", + "red-3": "lightMode/red/400", + "red-4": "lightMode/red/500", + "green-2": "lightMode/green/300", + "green-3": "lightMode/green/400", + "green-4": "lightMode/green/500", + "amber-2": "lightMode/amber/300", + "amber-3": "lightMode/amber/400", + "amber-4": "lightMode/amber/500", + "blue-2": "lightMode/blue/300", + "blue-3": "lightMode/blue/400", + "blue-4": "lightMode/blue/500", + "orange-3": "lightMode/orange/400", + "violet-2": "lightMode/violet/300", + "violet-3": "lightMode/violet/400", + "violet-4": "lightMode/violet/500", + "gray-modal": "lightMode/gray/200", + "gray-modals": "lightMode/gray/200", + "white": "neutral/white", + "blue-1": "lightMode/blue/300", + "red-1": "lightMode/red/300", + "green-1": "lightMode/green/200", + "amber-1": "lightMode/amber/200", + "orange-1": "lightMode/orange/200" + } + }, + "dark": { + "surface": { + "base": "darkMode/gray/950", + "gray-1": "darkMode/gray/800", + "gray-2": "darkMode/gray/700", + "gray-3": "darkMode/gray/600", + "gray-4": "darkMode/gray/500", + "gray-5": "darkMode/gray/200", + "gray-6": "darkMode/gray/100", + "gray-7": "darkMode/gray/50", + "menu-bar": "darkMode/gray/950", + "base-contrast": "darkMode/gray/900", + "gray-1-contrast": "darkMode/gray/900", + "gray-2-contrast": "darkMode/gray/600", + "red-1": "darkMode/red/950", + "red-2": "darkMode/red/900", + "red-3": "darkMode/red/800", + "red-4": "darkMode/red/700", + "red-5": "darkMode/red/500", + "red-6": "darkMode/red/400", + "red-7": "darkMode/red/600", + "green-1": "darkMode/green/900", + "green-2": "darkMode/green/900", + "green-3": "darkMode/green/800", + "green-4": "darkMode/green/700", + "green-5": "darkMode/green/500", + "green-6": "darkMode/green/400", + "green-7": "darkMode/green/600", + "amber-1": "darkMode/amber/950", + "amber-2": "darkMode/amber/900", + "amber-3": "darkMode/amber/800", + "amber-4": "darkMode/amber/700", + "amber-5": "darkMode/amber/500", + "amber-6": "darkMode/amber/400", + "amber-7": "darkMode/amber/600", + "blue-1": "darkMode/blue/950", + "blue-2": "darkMode/blue/900", + "blue-3": "darkMode/blue/800", + "blue-4": "darkMode/blue/700", + "blue-5": "darkMode/blue/500", + "blue-6": "darkMode/blue/400", + "blue-7": "darkMode/blue/600", + "orange-2": "darkMode/orange/900", + "violet-2": "darkMode/violet/900", + "violet-3": "darkMode/violet/800", + "violet-4": "darkMode/violet/700", + "violet-5": "darkMode/violet/500", + "violet-6": "darkMode/violet/400", + "violet-7": "darkMode/violet/600", + "cyan-2": "darkMode/cyan/900", + "alert-button-default": "darkMode/gray/500", + "alert-button-info": "darkMode/blue/700", + "alert-button-success": "darkMode/green/700", + "alert-button-warning": "darkMode/amber/700", + "alert-button-error": "darkMode/red/700", + "white": "darkMode/gray/900", + "modal": "darkMode/gray/700", + "selected": "darkMode/gray/500", + "cards": "darkMode/gray/800", + "cyan-1": "darkMode/cyan/900", + "pink-1": "darkMode/pink/900", + "orange-1": "darkMode/orange/900", + "violet-1": "darkMode/violet/900" + }, + "ink": { + "base": "darkMode/gray/950", + "gray-1": "darkMode/gray/800", + "gray-2": "darkMode/gray/600", + "gray-3": "darkMode/gray/500", + "gray-4": "darkMode/gray/450", + "gray-5": "darkMode/gray/400", + "gray-6": "darkMode/gray/300", + "gray-7": "darkMode/gray/200", + "gray-8": "darkMode/gray/100", + "red-1": "neutral/white", + "red-2": "darkMode/red/700", + "red-3": "darkMode/red/400", + "red-4": "darkMode/red/300", + "green-1": "neutral/white", + "green-2": "darkMode/green/700", + "green-3": "darkMode/green/400", + "green-4": "darkMode/green/300", + "green-6": "darkMode/green/400", + "amber-1": "neutral/white", + "amber-2": "darkMode/amber/700", + "amber-3": "darkMode/amber/500", + "amber-4": "darkMode/amber/400", + "blue-1": "neutral/white", + "blue-2": "darkMode/blue/700", + "blue-3": "darkMode/blue/400", + "blue-4": "darkMode/blue/300", + "cyan-3": "darkMode/cyan/400", + "violet-1": "neutral/white", + "violet-2": "darkMode/violet/700", + "violet-3": "darkMode/violet/400", + "violet-4": "darkMode/violet/300", + "blue-link": "darkMode/blue/500", + "alert-button-default": "darkMode/gray/50", + "alert-button-info": "darkMode/blue/200", + "alert-button-success": "darkMode/green/200", + "alert-button-warning": "darkMode/amber/200", + "alert-button-error": "darkMode/red/200", + "white": "darkMode/gray/900", + "gray-9": "darkMode/gray/50", + "cyan-1": "darkMode/cyan/500", + "pink-1": "darkMode/pink/500" + }, + "outline": { + "base": "darkMode/gray/950", + "gray-1": "darkMode/gray/800", + "gray-1-contrast": "darkMode/gray/700", + "gray-2": "darkMode/gray/600", + "gray-3": "darkMode/gray/500", + "gray-4": "darkMode/gray/450", + "gray-5": "lightMode/gray/200", + "red-2": "darkMode/red/800", + "red-3": "darkMode/red/700", + "red-4": "darkMode/red/600", + "green-2": "darkMode/green/800", + "green-3": "darkMode/green/700", + "green-4": "darkMode/green/600", + "amber-2": "darkMode/amber/800", + "amber-3": "darkMode/amber/700", + "amber-4": "darkMode/amber/600", + "blue-2": "darkMode/blue/800", + "blue-3": "darkMode/blue/700", + "blue-4": "darkMode/blue/600", + "orange-3": "darkMode/orange/700", + "violet-2": "darkMode/violet/800", + "violet-3": "darkMode/violet/700", + "violet-4": "darkMode/violet/600", + "gray-modal": "darkMode/gray/600", + "gray-modals": "darkMode/gray/600", + "white": "darkMode/gray/900", + "blue-1": "darkMode/blue/800", + "red-1": "darkMode/red/800", + "green-1": "darkMode/green/800", + "amber-1": "darkMode/amber/800", + "orange-1": "darkMode/orange/800" + } + } + } +} diff --git a/tailwind/generated/radius.json b/tailwind/generated/radius.json new file mode 100644 index 000000000..2e9a6ba5e --- /dev/null +++ b/tailwind/generated/radius.json @@ -0,0 +1,20 @@ +{ + "0": "0px", + "1": "4px", + "2": "5px", + "3": "6px", + "4": "8px", + "5": "10px", + "6": "12px", + "7": "16px", + "8": "20px", + "9": "100px", + "full": "9999px", + "none": "0px", + "sm": "4px", + "DEFAULT": "8px", + "md": "10px", + "lg": "12px", + "xl": "16px", + "2xl": "20px" +} diff --git a/tailwind/generated/typography.json b/tailwind/generated/typography.json new file mode 100644 index 000000000..9d18f8cf6 --- /dev/null +++ b/tailwind/generated/typography.json @@ -0,0 +1,140 @@ +{ + "fontFamily": { + "text": "Inter Variable" + }, + "fontSize": { + "tiny": [ + "11px", + { + "lineHeight": "0px" + } + ], + "2xs": [ + "11px", + { + "lineHeight": "13px" + } + ], + "xs": [ + "12px", + { + "lineHeight": "14px" + } + ], + "sm": [ + "13px", + { + "lineHeight": "15px" + } + ], + "base": [ + "14px", + { + "lineHeight": "16px" + } + ], + "lg": [ + "16px", + { + "lineHeight": "18px" + } + ], + "xl": [ + "18px", + { + "lineHeight": "21px" + } + ], + "2xl": [ + "20px", + { + "lineHeight": "23px" + } + ], + "3xl": [ + "24px", + { + "lineHeight": "28px" + } + ], + "4xl": [ + "26px", + { + "lineHeight": "42px" + } + ], + "5xl": [ + "28px", + { + "lineHeight": "45px" + } + ], + "6xl": [ + "32px", + { + "lineHeight": "51px" + } + ], + "7xl": [ + "40px", + { + "lineHeight": "56px" + } + ], + "8xl": [ + "44px", + { + "lineHeight": "62px" + } + ], + "9xl": [ + "48px", + { + "lineHeight": "67px" + } + ], + "10xl": [ + "52px", + { + "lineHeight": "73px" + } + ], + "11xl": [ + "56px", + { + "lineHeight": "78px" + } + ], + "12xl": [ + "64px", + { + "lineHeight": "83px" + } + ], + "13xl": [ + "72px", + { + "lineHeight": "92px" + } + ], + "14xl": [ + "80px", + { + "lineHeight": "96px" + } + ], + "15xl": [ + "88px", + { + "lineHeight": "106px" + } + ] + }, + "fontWeight": { + "regular": 400, + "medium": 500, + "semibold": 600, + "bold": 700, + "black": 800 + } +} diff --git a/tailwind/plugin.js b/tailwind/plugin.js index e63f855ca..bd33124ac 100644 --- a/tailwind/plugin.js +++ b/tailwind/plugin.js @@ -4,12 +4,55 @@ import { generateSemanticColors, generateCSSVariables, } from './colorPalette.js' -import { borderRadius, boxShadow, fontSize } from './tokens.js' +import radiusTokens from './generated/radius.json' +import typographyTokens from './generated/typography.json' let colorPalette = generateColorPalette() let semanticColors = generateSemanticColors() let cssVariables = generateCSSVariables() +// Per-size augmentation preserved from pre-Figma config — letterSpacing and +// fontWeight aren't modelled on `font.size.*` in the Figma export, so we keep +// the historical values keyed by size name. +const FONT_SIZE_AUGMENT = { + '2xs': { letterSpacing: '0.01em', fontWeight: '420' }, + xs: { letterSpacing: '0.02em', fontWeight: '420' }, + sm: { letterSpacing: '0.02em', fontWeight: '420' }, + base: { letterSpacing: '0.02em', fontWeight: '420' }, + lg: { letterSpacing: '0.02em', fontWeight: '400' }, + xl: { letterSpacing: '0.01em', fontWeight: '400' }, + '2xl': { letterSpacing: '0.01em', fontWeight: '400' }, + '3xl': { letterSpacing: '0.005em', fontWeight: '400' }, +} + +// Paragraph variants — same sizes but looser line-heights for reading. +const PARAGRAPH_LINE_HEIGHT = { + '2xs': '1.6', + xs: '1.6', + sm: '1.5', + base: '1.5', + lg: '1.5', + xl: '1.42', + '2xl': '1.38', + '3xl': '1.2', +} + +function buildFontSize() { + const out = {} + for (const [key, [size, meta]] of Object.entries(typographyTokens.fontSize)) { + // `tiny` arrives with lineHeight 0px from Figma — fall back to a sane ratio. + const lineHeight = meta.lineHeight === '0px' ? '1.15' : meta.lineHeight + out[key] = [size, { lineHeight, ...(FONT_SIZE_AUGMENT[key] || {}) }] + } + // Paragraph variants for the size set that defined them previously. + for (const [key, lineHeight] of Object.entries(PARAGRAPH_LINE_HEIGHT)) { + if (!out[key]) continue + const [size, meta] = out[key] + out[`p-${key}`] = [size, { ...meta, lineHeight }] + } + return out +} + let globalStyles = (theme) => ({ html: { 'font-family': `InterVar, ${theme('fontFamily.sans')}`, @@ -53,14 +96,24 @@ export default plugin( { theme: { colors: colorPalette, - borderRadius: borderRadius, - boxShadow: boxShadow, + borderRadius: radiusTokens, + boxShadow: { + sm: '0px 1px 2px rgba(0, 0, 0, 0.1)', + DEFAULT: + '0px 0px 1px rgba(0, 0, 0, 0.45), 0px 1px 2px rgba(0, 0, 0, 0.1)', + md: '0px 0px 1px rgba(0, 0, 0, 0.12), 0px 0.5px 2px rgba(0, 0, 0, 0.15), 0px 2px 3px rgba(0, 0, 0, 0.16)', + lg: '0px 0px 1px rgba(0, 0, 0, 0.35), 0px 6px 8px -4px rgba(0, 0, 0, 0.1)', + xl: '0px 0px 1px rgba(0, 0, 0, 0.19), 0px 1px 2px rgba(0, 0, 0, 0.07), 0px 6px 15px -5px rgba(0, 0, 0, 0.11)', + '2xl': + '0px 0px 1px rgba(0, 0, 0, 0.2), 0px 1px 3px rgba(0, 0, 0, 0.05), 0px 10px 24px -3px rgba(0, 0, 0, 0.1)', + none: 'none', + }, container: { padding: { xl: '5rem', }, }, - fontSize: fontSize, + fontSize: buildFontSize(), screens: { sm: '640px', md: '768px', From c950fd28c5efd53f89128c82dc24180cbce2f68c Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Fri, 22 May 2026 03:09:26 +0530 Subject: [PATCH 02/22] docs(foundations): use gray for corner radius example tiles --- docs/components/foundations/RadiusPage.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/components/foundations/RadiusPage.vue b/docs/components/foundations/RadiusPage.vue index 01da75f5d..90b7da080 100644 --- a/docs/components/foundations/RadiusPage.vue +++ b/docs/components/foundations/RadiusPage.vue @@ -50,7 +50,7 @@ function copy(text: string) { @click="copy(`rounded-${r.name}`)" >
From 67c2eb218b7d46a74da02591428e950e0cd1a8be Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Fri, 22 May 2026 10:21:14 +0530 Subject: [PATCH 03/22] docs(foundations): square palette swatches Co-Authored-By: Claude Opus 4.7 --- docs/components/foundations/PalettePage.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/components/foundations/PalettePage.vue b/docs/components/foundations/PalettePage.vue index 9a5dc5161..3755e99d8 100644 --- a/docs/components/foundations/PalettePage.vue +++ b/docs/components/foundations/PalettePage.vue @@ -97,7 +97,7 @@ function copy(text: string) { @click="copy(`${mode === 'darkMode' ? 'dark-' : ''}${family.key}-${shade}`)" >
@@ -138,7 +138,7 @@ function copy(text: string) { @click="copy(`${family.key}-${shade}`)" >
From 3aea83b0bfc77607a2bd5138fb3bb994ccbf2b59 Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Fri, 22 May 2026 10:21:21 +0530 Subject: [PATCH 04/22] fix(docs): restore shiki colors in dev transformerStyleToClass only flushes its CSS at buildEnd, so in dev the generated shiki.css stays empty and code blocks lose their syntax highlighting. Skip the transformer in dev and let shiki emit inline --shiki-light/dark styles directly. Co-Authored-By: Claude Opus 4.7 --- docs/.vitepress/config.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/.vitepress/config.ts b/docs/.vitepress/config.ts index 47cd0fd20..c0ca207eb 100644 --- a/docs/.vitepress/config.ts +++ b/docs/.vitepress/config.ts @@ -60,7 +60,10 @@ export default defineConfig({ dark: 'tokyo-night', light: 'github-light', }, - codeTransformers: [toClass], + // transformerStyleToClass flushes its CSS only at buildEnd, so in dev + // the generated shiki.css stays empty and code blocks lose colors — + // skip it in dev and let shiki emit inline --shiki-light/dark styles. + codeTransformers: isDev ? [] : [toClass], config(md) { md.use(componentTransformer) }, From 30ce4f4979ae63c0749b5d5bd07d0832a692a76e Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Sun, 24 May 2026 01:57:28 +0530 Subject: [PATCH 05/22] feat(foundations): align Button with Figma + add foundations spec - Add text-{size}-medium utilities (ADR-0004) for Figma's named typography styles; Button md/lg adopt them for exact tracking parity - Switch Button focus ring to ring-2 to match Figma's 2px shadow (ADR-0005) - Adopt numbered radius tokens as canonical (ADR-0006); Button migrates from named aliases; named aliases flagged for migration - Add spec/foundations.md covering typography, focus, radius, themes, code-only extensions, and the Figma verification process Co-Authored-By: Claude Opus 4.7 --- spec/README.md | 4 + spec/adr/0004-typography-style-utilities.md | 60 +++++++ spec/adr/0005-focus-ring-2px.md | 42 +++++ spec/adr/0006-numbered-radius-tokens.md | 54 +++++++ spec/adr/README.md | 3 + spec/foundations.md | 165 ++++++++++++++++++++ src/components/Button/Button.vue | 28 ++-- tailwind/plugin.js | 29 ++++ 8 files changed, 371 insertions(+), 14 deletions(-) create mode 100644 spec/adr/0004-typography-style-utilities.md create mode 100644 spec/adr/0005-focus-ring-2px.md create mode 100644 spec/adr/0006-numbered-radius-tokens.md create mode 100644 spec/foundations.md diff --git a/spec/README.md b/spec/README.md index ca4050c8d..86c81d1fa 100644 --- a/spec/README.md +++ b/spec/README.md @@ -11,6 +11,10 @@ Current API contracts and durable design decisions for `frappe-ui`. If these disagree, update the lower-authority document or mark it historical. +## Foundations + +- [`foundations.md`](./foundations.md) — typography, focus, radius, color themes; Figma source-of-truth rules. + ## Component specs - [`dialog.md`](./dialog.md) diff --git a/spec/adr/0004-typography-style-utilities.md b/spec/adr/0004-typography-style-utilities.md new file mode 100644 index 000000000..6ecea70f9 --- /dev/null +++ b/spec/adr/0004-typography-style-utilities.md @@ -0,0 +1,60 @@ +# Named typography style utilities (`text-{size}-{weight}`) + +**Status**: accepted + +## Context + +Figma models typography in espresso v2 as **named styles**, not as independent size/weight/tracking axes. Each style is an atomic token: + +| Figma style | font-size | weight | letter-spacing | +|---|---|---|---| +| `text/base/regular` | 14px | 420 | 2% (0.28px) | +| `text/base/medium` | 14px | 500 | **1.5%** (0.21px) | +| `text/lg/medium` | 16px | 500 | **1.5%** (0.24px) | + +Medium-weight text is **tracked tighter** than regular-weight text of the same size. This is a deliberate optical correction baked into the design system. + +Tailwind's `fontSize` utility carries `letterSpacing` keyed only by size. So `text-base` always emits the same letter-spacing regardless of whether `font-medium` is also applied. Any component that did `text-base font-medium` (Button md/lg, Tabs, FormControl labels, Tooltip titles…) drifted ~0.07–0.08px from the Figma design — visually subtle but systemic. + +The Figma token export (`espresso-v2-design-tokens/Typography.Desktop.tokens.json`) only contains atomic `font.size.*`, `font.weight.*`, `font.line-height.*`, `font.family.*` tokens. The composite named styles are not exported — they exist only in the Figma UI. + +## Decision + +Expose Figma's named typography styles as Tailwind **component utilities** generated by the design-system plugin: + +```css +.text-base-medium { font-size: 14px; line-height: 16px; font-weight: 500; letter-spacing: 0.015em; } +.text-lg-medium { font-size: 16px; line-height: 18px; font-weight: 500; letter-spacing: 0.015em; } +``` + +Generation lives in `tailwind/plugin.js`: + +- `FONT_SIZE_MEDIUM_TRACKING` — a per-size map of the medium-variant letter-spacing. Only sizes whose medium tracking is confirmed in Figma are listed. +- `buildTextStyleUtilities()` — reads that map plus `typographyTokens.fontSize` and emits one `.text-{size}-medium` rule per entry. Registered via `addComponents()`. + +Components opt in by replacing `text-{size} font-medium` with `text-{size}-medium`. + +The base `text-{size}` utility continues to carry the **regular**-weight tracking (the historical `FONT_SIZE_AUGMENT` values). The new utilities only override what's specific to the medium variant. + +## Rationale + +Three alternatives were considered: + +1. **Per-component override** (`tracking-[0.015em]` inline in Button). + Surgical but doesn't scale — every component re-discovers the rule. Drift returns the moment a new component is added. + +2. **Auto-tighten on `font-medium` globally** (e.g. via a `@layer utilities` rule that combines weight + tracking). + Zero migration cost, but applies to body paragraphs too. We have no evidence Figma wants medium-weight body copy tighter — only UI labels. Risk of unwanted side-effects on Markdown content, paragraph text, etc. + +3. **Named-style utilities** (chosen). + 1:1 with Figma's mental model. Components that need exact Figma parity opt in by name. Components that use the bare `text-base font-medium` continue to work — they just don't get the optical correction until migrated. Auditable: grep for `font-medium` next to `text-*` to find migration candidates. + +Naming follows Figma's slash convention flattened to hyphens: `text/base/medium` → `text-base-medium`. Regular-weight variants don't get their own utility because the base `text-{size}` utility already encodes regular-weight tracking — `text-base-regular` would be a redundant alias. + +## Consequences + +- `tailwind/plugin.js` is the single source of truth for which medium variants exist. Adding a new one is a one-line addition to `FONT_SIZE_MEDIUM_TRACKING`. +- The Figma token pipeline (`espresso-v2-design-tokens/`) does **not** model these — the values are hand-encoded in `plugin.js` from Figma observation. If the token export gains composite styles later, `buildTextStyleUtilities()` should be rewritten to read from the export instead. +- Migration is incremental. Components that haven't moved off `text-base font-medium` still render; they just have 0.07–0.08px of tracking drift from Figma. +- Currently emitted: `text-base-medium`, `text-lg-medium` (confirmed against Figma). Other sizes pending Figma verification. +- Button md (`text-base-medium`) and Button lg (`text-lg-medium`) are the first consumers; verified pixel-exact against Figma node `25393-27651`. diff --git a/spec/adr/0005-focus-ring-2px.md b/spec/adr/0005-focus-ring-2px.md new file mode 100644 index 000000000..563a4cf45 --- /dev/null +++ b/spec/adr/0005-focus-ring-2px.md @@ -0,0 +1,42 @@ +# Focus ring is 2px + +**Status**: accepted + +## Context + +Figma espresso v2 specifies the keyboard focus indicator as a 2px outset drop-shadow with no offset and no blur — effectively a 2px solid ring tight against the component edge: + +- gray: `0 0 0 2px #C9C9C9E5` (~90% opacity gray) +- red: `0 0 0 2px #FA9C9DE5` (~90% opacity red) + +The Figma typography variables expose these as `focus/light/default` and `focus/light/red`. + +The historical implementation in `frappe-ui` components used Tailwind's `focus-visible:ring` utility, which defaults to a **3px** ring width. The result was a focus indicator 50% wider than the design intended, with subtly different color (`outline-gray-3` = `#c7c7c7` vs Figma's `#C9C9C9`). + +## Decision + +All interactive components use `focus-visible:ring-2` (2px width) with theme-appropriate `ring-` for the color stop. The ring is **not** offset and has no blur — matching Figma's `0 0 0 2px ` drop-shadow exactly. + +Theme color mapping for the ring stop: + +| Theme | Ring color utility | +|---|---| +| gray (default) | `ring-outline-gray-3` | +| red | `ring-outline-red-2` | +| blue | `ring-blue-400` | +| green | `ring-outline-green-2` | + +Blue and green theme ring colors are project conventions — Figma does not define focus colors for those themes (see [`foundations.md`](../foundations.md#themes--colors)). + +## Rationale + +- Tailwind's `ring` defaults to 3px because that's Tailwind's house style, not a design-system decision. Adopting `ring-2` brings the implementation to the Figma spec without re-implementing the box-shadow machinery. +- Using `ring-2` instead of a custom `shadow-[0_0_0_2px_…]` keeps consumer-app dark-mode overrides via `--tw-ring-color` working, and preserves the existing CSS-variable plumbing. +- The 90%-opacity color stop (`E5` alpha in Figma) is approximated by the solid `outline-gray-3` / `outline-red-2` tokens. The visual difference is sub-perceptual against most backgrounds; if exact alpha is needed later, the `ring-` token can be redefined globally. + +## Consequences + +- Every interactive component (Button, FormControl, Tabs, Checkbox, MenuItem, etc.) should converge on `focus-visible:ring-2 focus-visible:ring-`. Existing usages of bare `focus-visible:ring` are drift and should migrate. +- Button is the first migration; verified against Figma node `25393-27651`. +- `form-input` / `form-textarea` / `form-select` already use `focus-visible:ring-2` in `tailwind/plugin.js` — no change needed there. +- If a future Figma update changes the ring width, this is a single-token change (`ring-2` → `ring-`) per component. diff --git a/spec/adr/0006-numbered-radius-tokens.md b/spec/adr/0006-numbered-radius-tokens.md new file mode 100644 index 000000000..c8fd72bdd --- /dev/null +++ b/spec/adr/0006-numbered-radius-tokens.md @@ -0,0 +1,54 @@ +# Numbered radius tokens are canonical + +**Status**: accepted + +## Context + +Figma espresso v2 exposes border-radius as a numbered scale: `radius/0`, `radius/1`, … `radius/9`. The numbers are positions on the scale, not abstract sizes — `radius/4` is the 5th step (`8px`), `radius/5` is the 6th step (`10px`), and so on. The scale is dense and ordered: there are five distinct values in the 0–12px range alone. + +The pre-Figma Tailwind preset used named radii — `sm`, `DEFAULT`, `md`, `lg`, `xl`, `2xl` — inherited from Tailwind's house scale but with rebound pixel values (`rounded-md` = 10px, not Tailwind's 6px; `rounded-lg` = 12px, not Tailwind's 8px). The current `tailwind/generated/radius.json` ships both: numbered tokens (`0`–`9`, `full`) **and** named aliases (`sm`, `DEFAULT`, `md`, `lg`, `xl`, `2xl`). + +This creates two problems: + +1. **Ambiguous mapping.** `rounded-md` exists in two design systems with two different values (Tailwind 6px vs frappe-ui 10px). Component authors reading `rounded-md` can't tell which scale they're in. +2. **Sparse coverage.** The named aliases skip steps. `radius/2` (5px), `radius/3` (6px), `radius/8` (20px) have no named equivalent. New components that need those values either reach for arbitrary classes (`rounded-[5px]`) or pick the wrong neighbor. + +## Decision + +Numbered radius tokens (`rounded-0` … `rounded-9`, plus `rounded-full`) are the **canonical** way to set border-radius in `frappe-ui`. All new code must use them. + +Named aliases (`rounded-sm`, `rounded` / `rounded-DEFAULT`, `rounded-md`, `rounded-lg`, `rounded-xl`, `rounded-2xl`) remain in [`tailwind/generated/radius.json`](../../tailwind/generated/radius.json) as **deprecated migration aliases**. Existing usages must be migrated. New usages are not permitted. + +The canonical mapping: + +| Numbered token | px | Deprecated alias | +|---|---|---| +| `rounded-0` | 0 | `rounded-none` (kept; non-numbered but unambiguous) | +| `rounded-1` | 4 | `rounded-sm` | +| `rounded-2` | 5 | — | +| `rounded-3` | 6 | — | +| `rounded-4` | 8 | `rounded` / `rounded-DEFAULT` | +| `rounded-5` | 10 | `rounded-md` | +| `rounded-6` | 12 | `rounded-lg` | +| `rounded-7` | 16 | `rounded-xl` | +| `rounded-8` | 20 | `rounded-2xl` | +| `rounded-9` | 100 | — | +| `rounded-full` | 9999 | — (kept; semantically meaningful, not part of the scale) | + +`rounded-none` and `rounded-full` are retained — they're semantic, not size-named, and have no numbered ambiguity. + +## Rationale + +- Numbered tokens preserve Figma's mental model exactly. A designer specifying `radius/5` and an engineer writing `rounded-5` are speaking the same vocabulary. The lookup table collapses. +- The named scale was a Tailwind-house decision adopted before the design system had its own scale. With espresso v2, the design system owns the scale; aliases keep the lookup table. +- Removing aliases entirely would break every consumer app immediately. Marking them deprecated lets us migrate the library and downstream apps incrementally, then drop the aliases in a later major version. +- Sparse named aliases skip the 5px and 6px steps. New components needing those values force either arbitrary classes or "round up to the nearest alias" drift. Numbered tokens cover every step. + +## Consequences + +- All component code in `src/` migrates to numbered tokens. `Button.vue` is the first migration; pattern is mechanical (`rounded` → `rounded-4`, `rounded-md` → `rounded-5`, …). +- Component specs and foundation docs use numbered tokens in examples. +- Named aliases (`sm`, `DEFAULT`, `md`, `lg`, `xl`, `2xl`) are kept in [`tailwind/generated/radius.json`](../../tailwind/generated/radius.json) so consumer apps don't break, but they're flagged for migration in [`foundations.md`](../foundations.md#radius) and should be removed in the next breaking release. +- `rounded` (bare, = `rounded-DEFAULT` = 8px) is the most common drift surface in the codebase — components that use it must migrate to `rounded-4`. The two render identically; the migration is purely vocabulary. +- ESLint rule or codemod to flag named aliases in `src/` is not built today; greppable. A future task can automate. +- The Figma export pipeline ([`tailwind/figma-tokens-to-theme.js`](../../tailwind/figma-tokens-to-theme.js)) is unchanged — numbered tokens already come straight from `radius.*` Figma tokens. The deprecated aliases live in `RADIUS_EXTRA` (or equivalent) in the build script; they should be moved to a clearly-marked deprecated section. diff --git a/spec/adr/README.md b/spec/adr/README.md index 8b6a80ac5..33dd94360 100644 --- a/spec/adr/README.md +++ b/spec/adr/README.md @@ -9,3 +9,6 @@ Specs describe the current contract. ADRs explain why decisions were made. Super | [0001 — Single `Dialog` component](./0001-single-dialog-component.md) | Accepted | One modal component; no separate `AlertDialog`. | | [0002 — Imperative dialog resolves on click](./0002-imperative-dialog-caller-closes.md) | Superseded | Replaced by ADR-0003. Historical only. | | [0003 — Imperative dialog uses `onConfirm`](./0003-imperative-dialog-onconfirm.md) | Accepted | Current imperative dialog lifecycle. | +| [0004 — Named typography style utilities](./0004-typography-style-utilities.md) | Accepted | `text-{size}-medium` utilities for Figma's medium-weight tracking. | +| [0005 — 2px focus ring](./0005-focus-ring-2px.md) | Accepted | `focus-visible:ring-2` matches Figma's 2px focus shadow. | +| [0006 — Numbered radius tokens](./0006-numbered-radius-tokens.md) | Accepted | `rounded-1`…`rounded-9` are canonical; named aliases deprecated. | diff --git a/spec/foundations.md b/spec/foundations.md new file mode 100644 index 000000000..a709f8cab --- /dev/null +++ b/spec/foundations.md @@ -0,0 +1,165 @@ +# Foundations Spec + +Status: accepted direction for `frappe-ui` v1 (espresso v2 tokens). + +This document defines the foundation layer of the design system — typography, focus, radius, color ramps — and the rules by which it stays aligned with Figma. Component specs ([`dialog.md`](./dialog.md), [`inputs.md`](./inputs.md), etc.) build on this. + +Architectural calls in this spec are recorded as ADRs: + +- [`adr/0004-typography-style-utilities.md`](./adr/0004-typography-style-utilities.md) — why named typography utilities (`text-{size}-medium`) exist instead of per-component overrides. +- [`adr/0005-focus-ring-2px.md`](./adr/0005-focus-ring-2px.md) — why focus rings are 2px. +- [`adr/0006-numbered-radius-tokens.md`](./adr/0006-numbered-radius-tokens.md) — why numbered radius tokens (`rounded-1`…`rounded-9`) are canonical and named aliases are deprecated. + +## Source of truth + +Figma is the source of truth. The current design file is **espresso 2.0**: + +Token export lives in [`espresso-v2-design-tokens/`](../espresso-v2-design-tokens/) and is consumed by [`tailwind/figma-tokens-to-theme.js`](../tailwind/figma-tokens-to-theme.js), which writes the generated theme JSON to [`tailwind/generated/`](../tailwind/generated/). + +Anything in this repo that diverges from Figma is either (a) drift to be fixed, or (b) an intentional code-only extension explicitly listed in [§ Code-only extensions](#code-only-extensions). There is no third category. + +## Decisions at a glance + +| Decision | Direction | +|---|---| +| Source of truth | Figma file `espresso-2.0` | +| Typography model | Atomic size/weight/line-height tokens from Figma export, plus named-style utilities for composite styles | +| Named typography utilities | `text-{size}-medium` for sizes whose medium-variant tracking is confirmed in Figma. See [ADR-0004](./adr/0004-typography-style-utilities.md) | +| Focus indicator | `focus-visible:ring-2` + themed `ring-`. No offset, no blur. See [ADR-0005](./adr/0005-focus-ring-2px.md) | +| Radius scale | Numbered tokens `rounded-0`…`rounded-9` are canonical. Named aliases (`rounded`, `rounded-md`, …) are deprecated. See [ADR-0006](./adr/0006-numbered-radius-tokens.md) | +| Color themes | Figma defines `default` (gray) and `red`. `blue` and `green` are code-only extensions (see below) | +| Component size scale | Figma defines `sm` / `md` / `lg`. `xl` and `2xl` are code-only extensions | + +## Typography + +### Token model + +Atomic tokens are exported from Figma to [`tailwind/generated/typography.json`](../tailwind/generated/typography.json): + +- `fontFamily` — `text: 'Inter Variable'` +- `fontSize` — keyed by size name (`tiny`, `2xs`, `xs`, `sm`, `base`, `lg`, `xl`, `2xl`, `3xl`, …), each paired with a `lineHeight` +- `fontWeight` — named weights: `regular: 400`, `medium: 500`, `semibold: 600`, `bold: 700`, `black: 800` + +Letter-spacing is **not** exported from Figma — it is encoded by hand in [`tailwind/plugin.js`](../tailwind/plugin.js) via `FONT_SIZE_AUGMENT` (for the regular-weight variant of each size) and `FONT_SIZE_MEDIUM_TRACKING` (for the medium-weight variant). + +### Named style utilities + +Figma models typography as named styles (`text/base/regular`, `text/base/medium`, `text/lg/medium`, …) where medium-weight text is tracked tighter than regular at the same size. To preserve this in CSS, `tailwind/plugin.js` emits component utilities: + +| Utility | font-size | line-height | weight | letter-spacing | Figma | +|---|---|---|---|---|---| +| `text-base-medium` | 14px | 16px | 500 | 0.015em (1.5%) | `text/base/medium` | +| `text-lg-medium` | 16px | 18px | 500 | 0.015em (1.5%) | `text/lg/medium` | + +Regular-weight tracking is carried by the base `text-{size}` utility — there is no `text-{size}-regular` because it would be a redundant alias. + +**Migration guidance**: components using `text-{size} font-medium` should migrate to `text-{size}-medium` where the named utility exists. Bare `text-{size} font-medium` continues to render correctly but drifts ~0.07–0.08px tighter than Figma intends. + +See [ADR-0004](./adr/0004-typography-style-utilities.md) for the reasoning and the alternatives considered. + +### Verified font-size tokens + +Confirmed against Figma typography variables on `2026-05-24`: + +| Tailwind size | font-size | line-height | Figma variable | +|---|---|---|---| +| `text-base` | 14px | 16px | `text/base/regular` (with weight 420, ls 2%) | +| `text-base-medium` | 14px | 16px | `text/base/medium` (weight 500, ls 1.5%) | +| `text-lg` | 16px | 18px | (no Figma usage in component scope yet) | +| `text-lg-medium` | 16px | 18px | `text/lg/medium` (weight 500, ls 1.5%) | + +## Focus ring + +All interactive components use `focus-visible:ring-2` paired with a themed `ring-`: + +| Theme | Ring color | Figma | +|---|---|---| +| gray (default) | `ring-outline-gray-3` | `focus/light/default` | +| red | `ring-outline-red-2` | `focus/light/red` | +| blue | `ring-blue-400` | code-only | +| green | `ring-outline-green-2` | code-only | + +The ring is outset, no offset, no blur — matches Figma's 2px drop-shadow spec exactly. + +See [ADR-0005](./adr/0005-focus-ring-2px.md). + +## Radius + +Numbered radius tokens are the canonical way to set border-radius. See [ADR-0006](./adr/0006-numbered-radius-tokens.md). + +### Canonical (use these) + +Generated from Figma `radius.*` tokens into [`tailwind/generated/radius.json`](../tailwind/generated/radius.json): + +| Tailwind | px | Figma token | +|---|---|---| +| `rounded-0` | 0 | `radius/0` | +| `rounded-1` | 4 | `radius/1` | +| `rounded-2` | 5 | `radius/2` | +| `rounded-3` | 6 | `radius/3` | +| `rounded-4` | 8 | `radius/4` | +| `rounded-5` | 10 | `radius/5` | +| `rounded-6` | 12 | `radius/6` | +| `rounded-7` | 16 | `radius/7` | +| `rounded-8` | 20 | `radius/8` | +| `rounded-9` | 100 | `radius/9` | +| `rounded-none` | 0 | — (semantic alias for `rounded-0`) | +| `rounded-full` | 9999 | — (semantic, not on the scale) | + +### Deprecated — flagged for migration + +These aliases remain in `tailwind/generated/radius.json` so consumer apps keep working, but they are **not** to be used in new code. Migrate existing usages in `src/` to the numbered equivalent: + +| Deprecated alias | Migrate to | px | +|---|---|---| +| `rounded` / `rounded-DEFAULT` | `rounded-4` | 8 | +| `rounded-sm` | `rounded-1` | 4 | +| `rounded-md` | `rounded-5` | 10 | +| `rounded-lg` | `rounded-6` | 12 | +| `rounded-xl` | `rounded-7` | 16 | +| `rounded-2xl` | `rounded-8` | 20 | + +Migration is purely vocabulary — pixel values are identical. The aliases will be removed in the next breaking release. + +To find usages: `grep -rE "rounded(-md|-lg|-xl|-2xl|-sm|-DEFAULT)?\\b" src/`. A bare `rounded` (not `rounded-N`) is the most common occurrence. + +## Themes & colors + +Figma espresso v2 defines two component color themes: + +- **`default`** — the gray ramp (`surface-gray-*`, `ink-gray-*`, `outline-gray-*`) +- **`red`** — the red ramp (`surface-red-*`, `ink-red-*`, `outline-red-*`) + +Both are exported via [`tailwind/colors.json`](../tailwind/colors.json) → [`tailwind/generated/colors.json`](../tailwind/generated/colors.json) and resolved to CSS variables by [`tailwind/colorPalette.js`](../tailwind/colorPalette.js). + +Solid/subtle/outline/ghost ramps for these two themes are pixel-accurate to Figma. + +## Code-only extensions + +Extensions to the Figma spec that the library ships **intentionally**, not as drift: + +| Extension | Where | Reason | +|---|---|---| +| `xl`, `2xl` button sizes | `Button.vue` `sizeClasses` | Pre-espresso-v2 sizes preserved for back-compat. No Figma reference — use at own risk; visual treatment may shift if Figma adds these later. | +| `blue`, `green`, (and other) themes | `Button.vue` `buttonClasses`, plus `Badge`, `Alert`, `Toast`, etc. | Semantic theming surface that pre-dates espresso v2. Figma currently only models `default` + `red` for components, but the underlying color ramps (blue, green, yellow, …) are first-class in the token export. | +| Letter-spacing per size | `tailwind/plugin.js` `FONT_SIZE_AUGMENT` | Figma exports `font.size`, `font.weight`, `font.line-height`, `font.family` — letter-spacing is composed in Figma styles but not in the token JSON. Encoded by hand. | +| Medium-variant tracking | `tailwind/plugin.js` `FONT_SIZE_MEDIUM_TRACKING` | Same — Figma composes it in named styles; we re-derive per size. Only sizes whose medium tracking is confirmed in Figma are listed. | + +If Figma adds any of these later, the extensions become drift and should be reconciled. + +## Verification process + +When verifying a component against Figma: + +1. Open the component frame in Figma Dev Mode. The Figma MCP server (`mcp__figma__*`) is the canonical way to read design specs — `get_design_context` for code+screenshot, `get_variable_defs` for token mappings. +2. Compare against the rendered component in the dev docs (Vite dev server on `:5173`). Use `getComputedStyle()` to read actual `letter-spacing`, `border-radius`, etc. — pixel comparison beats screenshot comparison for spacing/typography. +3. Drift falls into three buckets: + - **Token drift** — a token value disagrees with Figma. Fix in the export pipeline or in `tailwind/plugin.js`. + - **Component drift** — the component uses the wrong token. Fix in the component. + - **Intentional extension** — must be listed in [§ Code-only extensions](#code-only-extensions). Add it there. + +Latest full-component verifications: + +| Component | Figma node | Date | Notes | +|---|---|---|---| +| `Button` (sm/md/lg) | [`25393-27651`](https://www.figma.com/design/kMYnZ9ougpSSQBdjZCgtdX/espresso-2.0?node-id=25393-27651) | 2026-05-24 | Pixel-accurate after ADR-0004 and ADR-0005. xl/2xl + blue/green/etc. themes are code-only extensions. | diff --git a/src/components/Button/Button.vue b/src/components/Button/Button.vue index b8aa98273..6ccf84f85 100644 --- a/src/components/Button/Button.vue +++ b/src/components/Button/Button.vue @@ -142,10 +142,10 @@ const buttonClasses = computed(() => { }[props.theme] let focusClasses = { - gray: 'focus-visible:ring focus-visible:ring-outline-gray-3', - blue: 'focus-visible:ring focus-visible:ring-blue-400', - green: 'focus-visible:ring focus-visible:ring-outline-green-2', - red: 'focus-visible:ring focus-visible:ring-outline-red-2', + gray: 'focus-visible:ring-2 focus-visible:ring-outline-gray-3', + blue: 'focus-visible:ring-2 focus-visible:ring-blue-400', + green: 'focus-visible:ring-2 focus-visible:ring-outline-green-2', + red: 'focus-visible:ring-2 focus-visible:ring-outline-red-2', }[props.theme] let variantClasses = { @@ -185,20 +185,20 @@ const buttonClasses = computed(() => { let disabledClasses = disabledClassesMap[themeVariant] let sizeClasses = { - sm: 'h-7 text-base px-2 rounded', - md: 'h-8 text-base font-medium px-2.5 rounded', - lg: 'h-10 text-lg font-medium px-3 rounded-md', - xl: 'h-11.5 text-xl font-medium px-3.5 rounded-lg', - '2xl': 'h-13 text-2xl font-medium px-3.5 rounded-xl', + sm: 'h-7 text-base px-2 rounded-4', + md: 'h-8 text-base-medium px-2.5 rounded-4', + lg: 'h-10 text-lg-medium px-3 rounded-5', + xl: 'h-11.5 text-xl font-medium px-3.5 rounded-6', + '2xl': 'h-13 text-2xl font-medium px-3.5 rounded-7', }[props.size] if (isIconButton.value) { sizeClasses = { - sm: 'h-7 w-7 rounded', - md: 'h-8 w-8 rounded', - lg: 'h-10 w-10 rounded-md', - xl: 'h-11.5 w-11.5 rounded-lg', - '2xl': 'h-13 w-13 rounded-xl', + sm: 'h-7 w-7 rounded-4', + md: 'h-8 w-8 rounded-4', + lg: 'h-10 w-10 rounded-5', + xl: 'h-11.5 w-11.5 rounded-6', + '2xl': 'h-13 w-13 rounded-7', }[props.size] } diff --git a/tailwind/plugin.js b/tailwind/plugin.js index bd33124ac..3cf3c8e04 100644 --- a/tailwind/plugin.js +++ b/tailwind/plugin.js @@ -25,6 +25,17 @@ const FONT_SIZE_AUGMENT = { '3xl': { letterSpacing: '0.005em', fontWeight: '400' }, } +// Tracking for the `medium` weight variant of each size. Figma models typography +// as named styles (`text/base/medium`, `text/lg/medium`, …) where medium-weight +// text is tracked tighter than its regular-weight sibling. Tailwind's fontSize +// utility is keyed by size only, so we expose these as component classes +// (`.text-base-medium`, `.text-lg-medium`) via `buildTextStyleUtilities()`. +// Only add entries here for sizes whose medium tracking is confirmed in Figma. +const FONT_SIZE_MEDIUM_TRACKING = { + base: '0.015em', + lg: '0.015em', +} + // Paragraph variants — same sizes but looser line-heights for reading. const PARAGRAPH_LINE_HEIGHT = { '2xs': '1.6', @@ -53,6 +64,23 @@ function buildFontSize() { return out } +function buildTextStyleUtilities() { + const out = {} + for (const [key, tracking] of Object.entries(FONT_SIZE_MEDIUM_TRACKING)) { + const entry = typographyTokens.fontSize[key] + if (!entry) continue + const [size, meta] = entry + const lineHeight = meta.lineHeight === '0px' ? '1.15' : meta.lineHeight + out[`.text-${key}-medium`] = { + fontSize: size, + lineHeight, + fontWeight: '500', + letterSpacing: tracking, + } + } + return out +} + let globalStyles = (theme) => ({ html: { 'font-family': `InterVar, ${theme('fontFamily.sans')}`, @@ -92,6 +120,7 @@ export default plugin( function ({ addBase, addComponents, theme }) { addBase({ ...globalStyles(theme), ...cssVariables }) addComponents(componentStyles) + addComponents(buildTextStyleUtilities()) }, { theme: { From 30110092aaca092c28fa2b72883cc3d86b22b01d Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Sun, 24 May 2026 02:29:38 +0530 Subject: [PATCH 06/22] docs(button): replace prop stories with Figma examples + playground - Delete Variants/Themes/Sizes/Icons stories; the API table already covers prop variations - Add 6 contextual stories matching the Button Figma file: section controls, section action, selection toolbar, inline actions, stacked actions, and a live-class card - Add a Playground builder (TabButtons + Switch knobs) with live preview and dynamically generated Vue snippet; registered globally as in the VitePress theme Co-Authored-By: Claude Opus 4.7 --- docs/.vitepress/theme/index.ts | 2 + docs/components/Docs/ButtonBuilder.vue | 163 ++++++++++++++++++ src/components/Button/Button.md | 28 ++- src/components/Button/stories/Icons.vue | 27 --- .../Button/stories/InlineActions.vue | 10 ++ .../Button/stories/LiveClassCard.vue | 34 ++++ .../Button/stories/SectionAction.vue | 17 ++ .../Button/stories/SectionControls.vue | 28 +++ .../Button/stories/SelectionToolbar.vue | 20 +++ src/components/Button/stories/Sizes.vue | 11 -- .../Button/stories/StackedActions.vue | 10 ++ src/components/Button/stories/Themes.vue | 10 -- src/components/Button/stories/Variants.vue | 10 -- 13 files changed, 304 insertions(+), 66 deletions(-) create mode 100644 docs/components/Docs/ButtonBuilder.vue delete mode 100644 src/components/Button/stories/Icons.vue create mode 100644 src/components/Button/stories/InlineActions.vue create mode 100644 src/components/Button/stories/LiveClassCard.vue create mode 100644 src/components/Button/stories/SectionAction.vue create mode 100644 src/components/Button/stories/SectionControls.vue create mode 100644 src/components/Button/stories/SelectionToolbar.vue delete mode 100644 src/components/Button/stories/Sizes.vue create mode 100644 src/components/Button/stories/StackedActions.vue delete mode 100644 src/components/Button/stories/Themes.vue delete mode 100644 src/components/Button/stories/Variants.vue diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index 5d47ce4bf..9b169b7b9 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -3,6 +3,7 @@ import "../../../src/fonts/Inter/inter.css" import "../../css/style.css" import "../../css/shiki.css" import Demo from '../../components/Docs/Demo.vue' +import ButtonBuilder from '../../components/Docs/ButtonBuilder.vue' import Layout from '../../components/Layout.vue' if (process.env.NODE_ENV === 'production') { @@ -13,5 +14,6 @@ export default { Layout, enhanceApp({ app, router, siteData }) { app.component('ComponentPreview', Demo) + app.component('ButtonBuilder', ButtonBuilder) }, } satisfies Theme diff --git a/docs/components/Docs/ButtonBuilder.vue b/docs/components/Docs/ButtonBuilder.vue new file mode 100644 index 000000000..13b84fa2e --- /dev/null +++ b/docs/components/Docs/ButtonBuilder.vue @@ -0,0 +1,163 @@ + + + + + diff --git a/src/components/Button/Button.md b/src/components/Button/Button.md index aa7fae1fc..5982d258b 100644 --- a/src/components/Button/Button.md +++ b/src/components/Button/Button.md @@ -2,20 +2,32 @@ An interactive element used to trigger actions, submit forms, or navigate between views. -## Variants +## Playground - + -## Themes +## Section controls - + -## Sizes +## Section action - + -## Icons +## Selection toolbar - + + +## Inline actions + + + +## Stacked actions + + + +## Card actions + + diff --git a/src/components/Button/stories/Icons.vue b/src/components/Button/stories/Icons.vue deleted file mode 100644 index 47cb8f43f..000000000 --- a/src/components/Button/stories/Icons.vue +++ /dev/null @@ -1,27 +0,0 @@ - - - diff --git a/src/components/Button/stories/InlineActions.vue b/src/components/Button/stories/InlineActions.vue new file mode 100644 index 000000000..b589437d9 --- /dev/null +++ b/src/components/Button/stories/InlineActions.vue @@ -0,0 +1,10 @@ + + + diff --git a/src/components/Button/stories/LiveClassCard.vue b/src/components/Button/stories/LiveClassCard.vue new file mode 100644 index 000000000..5703887dd --- /dev/null +++ b/src/components/Button/stories/LiveClassCard.vue @@ -0,0 +1,34 @@ + + + diff --git a/src/components/Button/stories/SectionAction.vue b/src/components/Button/stories/SectionAction.vue new file mode 100644 index 000000000..73114e429 --- /dev/null +++ b/src/components/Button/stories/SectionAction.vue @@ -0,0 +1,17 @@ + + + diff --git a/src/components/Button/stories/SectionControls.vue b/src/components/Button/stories/SectionControls.vue new file mode 100644 index 000000000..c7b2b16dd --- /dev/null +++ b/src/components/Button/stories/SectionControls.vue @@ -0,0 +1,28 @@ + + + diff --git a/src/components/Button/stories/SelectionToolbar.vue b/src/components/Button/stories/SelectionToolbar.vue new file mode 100644 index 000000000..0545532e6 --- /dev/null +++ b/src/components/Button/stories/SelectionToolbar.vue @@ -0,0 +1,20 @@ + + + diff --git a/src/components/Button/stories/Sizes.vue b/src/components/Button/stories/Sizes.vue deleted file mode 100644 index af481c64a..000000000 --- a/src/components/Button/stories/Sizes.vue +++ /dev/null @@ -1,11 +0,0 @@ - - - diff --git a/src/components/Button/stories/StackedActions.vue b/src/components/Button/stories/StackedActions.vue new file mode 100644 index 000000000..8fb214f34 --- /dev/null +++ b/src/components/Button/stories/StackedActions.vue @@ -0,0 +1,10 @@ + + + diff --git a/src/components/Button/stories/Themes.vue b/src/components/Button/stories/Themes.vue deleted file mode 100644 index 1d2e1898d..000000000 --- a/src/components/Button/stories/Themes.vue +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/src/components/Button/stories/Variants.vue b/src/components/Button/stories/Variants.vue deleted file mode 100644 index 6099b87bc..000000000 --- a/src/components/Button/stories/Variants.vue +++ /dev/null @@ -1,10 +0,0 @@ - - - From 8b257c6f9c54e5a8d99e2498906622523a80235b Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Sun, 24 May 2026 03:06:50 +0530 Subject: [PATCH 07/22] feat(components): refine badge and button examples --- docs/.vitepress/theme/index.ts | 2 + docs/components/Docs/BadgeBuilder.vue | 171 +++++++++++++++++++ docs/components/Docs/ButtonBuilder.vue | 29 +++- spec/foundations.md | 6 +- src/components/Badge/Badge.api.md | 2 +- src/components/Badge/Badge.cy.ts | 44 +++-- src/components/Badge/Badge.md | 24 ++- src/components/Badge/Badge.vue | 105 +++++++----- src/components/Badge/stories/CallMeta.vue | 35 ++++ src/components/Badge/stories/EventStatus.vue | 16 ++ src/components/Badge/stories/ListStatus.vue | 91 ++++++++++ src/components/Badge/stories/Reactions.vue | 33 ++++ src/components/Badge/stories/RowTags.vue | 39 +++++ src/components/Badge/stories/Themes.vue | 10 -- src/components/Badge/stories/Variants.vue | 10 -- src/components/Badge/types.ts | 3 +- src/components/Button/Button.cy.ts | 18 +- src/components/Button/Button.vue | 5 + src/components/Button/types.ts | 2 +- src/components/Sidebar/Sidebar.api.md | 12 +- 20 files changed, 558 insertions(+), 99 deletions(-) create mode 100644 docs/components/Docs/BadgeBuilder.vue create mode 100644 src/components/Badge/stories/CallMeta.vue create mode 100644 src/components/Badge/stories/EventStatus.vue create mode 100644 src/components/Badge/stories/ListStatus.vue create mode 100644 src/components/Badge/stories/Reactions.vue create mode 100644 src/components/Badge/stories/RowTags.vue delete mode 100644 src/components/Badge/stories/Themes.vue delete mode 100644 src/components/Badge/stories/Variants.vue diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index 9b169b7b9..5f44030f7 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -4,6 +4,7 @@ import "../../css/style.css" import "../../css/shiki.css" import Demo from '../../components/Docs/Demo.vue' import ButtonBuilder from '../../components/Docs/ButtonBuilder.vue' +import BadgeBuilder from '../../components/Docs/BadgeBuilder.vue' import Layout from '../../components/Layout.vue' if (process.env.NODE_ENV === 'production') { @@ -15,5 +16,6 @@ export default { enhanceApp({ app, router, siteData }) { app.component('ComponentPreview', Demo) app.component('ButtonBuilder', ButtonBuilder) + app.component('BadgeBuilder', BadgeBuilder) }, } satisfies Theme diff --git a/docs/components/Docs/BadgeBuilder.vue b/docs/components/Docs/BadgeBuilder.vue new file mode 100644 index 000000000..2d2296536 --- /dev/null +++ b/docs/components/Docs/BadgeBuilder.vue @@ -0,0 +1,171 @@ + + + + + diff --git a/docs/components/Docs/ButtonBuilder.vue b/docs/components/Docs/ButtonBuilder.vue index 13b84fa2e..eadd39602 100644 --- a/docs/components/Docs/ButtonBuilder.vue +++ b/docs/components/Docs/ButtonBuilder.vue @@ -3,10 +3,12 @@ import { computed, ref } from 'vue' import { Button, Switch, TabButtons } from 'frappe-ui' const label = ref('Save') -const theme = ref<'gray' | 'blue' | 'green' | 'red'>('gray') +const theme = ref<'gray' | 'red'>('gray') const variant = ref<'solid' | 'subtle' | 'outline' | 'ghost'>('subtle') -const size = ref<'sm' | 'md' | 'lg' | 'xl' | '2xl'>('sm') +const size = ref<'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'>('sm') +const iconLeft = ref(false) const icon = ref(false) +const iconRight = ref(false) const loading = ref(false) const disabled = ref(false) @@ -18,11 +20,10 @@ const variantButtons = [ ] const themeButtons = [ { label: 'gray', value: 'gray' }, - { label: 'blue', value: 'blue' }, - { label: 'green', value: 'green' }, { label: 'red', value: 'red' }, ] const sizeButtons = [ + { label: 'xs', value: 'xs' }, { label: 'sm', value: 'sm' }, { label: 'md', value: 'md' }, { label: 'lg', value: 'lg' }, @@ -37,7 +38,12 @@ const code = computed(() => { `size="${size.value}"`, `label="${label.value}"`, ] - if (icon.value) attrs.push(`icon-left="lucide-plus"`) + if (icon.value) { + attrs.push(`icon="lucide-plus"`) + } else { + if (iconLeft.value) attrs.push(`icon-left="lucide-plus"`) + if (iconRight.value) attrs.push(`icon-right="lucide-chevron-right"`) + } if (disabled.value) attrs.push('disabled') if (loading.value) attrs.push('loading') @@ -64,7 +70,10 @@ function onCopy() { :theme="theme" :variant="variant" :size="size" - :icon-left="icon ? 'lucide-plus' : undefined" + :label="label" + :icon-left="!icon && iconLeft ? 'lucide-plus' : undefined" + :icon="icon ? 'lucide-plus' : undefined" + :icon-right="!icon && iconRight ? 'lucide-chevron-right' : undefined" :loading="loading" :disabled="disabled" > @@ -94,10 +103,18 @@ function onCopy() {
+
+ iconLeft + +
icon
+
+ iconRight + +
disabled diff --git a/spec/foundations.md b/spec/foundations.md index a709f8cab..241a2bc5c 100644 --- a/spec/foundations.md +++ b/spec/foundations.md @@ -28,7 +28,7 @@ Anything in this repo that diverges from Figma is either (a) drift to be fixed, | Focus indicator | `focus-visible:ring-2` + themed `ring-`. No offset, no blur. See [ADR-0005](./adr/0005-focus-ring-2px.md) | | Radius scale | Numbered tokens `rounded-0`…`rounded-9` are canonical. Named aliases (`rounded`, `rounded-md`, …) are deprecated. See [ADR-0006](./adr/0006-numbered-radius-tokens.md) | | Color themes | Figma defines `default` (gray) and `red`. `blue` and `green` are code-only extensions (see below) | -| Component size scale | Figma defines `sm` / `md` / `lg`. `xl` and `2xl` are code-only extensions | +| Component size scale | Figma defines `sm` / `md` / `lg`. `xs`, `xl`, and `2xl` are code-only extensions | ## Typography @@ -140,7 +140,7 @@ Extensions to the Figma spec that the library ships **intentionally**, not as dr | Extension | Where | Reason | |---|---|---| -| `xl`, `2xl` button sizes | `Button.vue` `sizeClasses` | Pre-espresso-v2 sizes preserved for back-compat. No Figma reference — use at own risk; visual treatment may shift if Figma adds these later. | +| `xs`, `xl`, `2xl` button sizes | `Button.vue` `sizeClasses` | Sizes outside Figma's `sm`/`md`/`lg` scale. `xs` (24px, `text-xs`, `rounded-3`) covers compact toolbars/badges-as-buttons; `xl`/`2xl` are pre-espresso-v2 sizes preserved for back-compat. No Figma reference — use at own risk; visual treatment may shift if Figma adds these later. | | `blue`, `green`, (and other) themes | `Button.vue` `buttonClasses`, plus `Badge`, `Alert`, `Toast`, etc. | Semantic theming surface that pre-dates espresso v2. Figma currently only models `default` + `red` for components, but the underlying color ramps (blue, green, yellow, …) are first-class in the token export. | | Letter-spacing per size | `tailwind/plugin.js` `FONT_SIZE_AUGMENT` | Figma exports `font.size`, `font.weight`, `font.line-height`, `font.family` — letter-spacing is composed in Figma styles but not in the token JSON. Encoded by hand. | | Medium-variant tracking | `tailwind/plugin.js` `FONT_SIZE_MEDIUM_TRACKING` | Same — Figma composes it in named styles; we re-derive per size. Only sizes whose medium tracking is confirmed in Figma are listed. | @@ -162,4 +162,4 @@ Latest full-component verifications: | Component | Figma node | Date | Notes | |---|---|---|---| -| `Button` (sm/md/lg) | [`25393-27651`](https://www.figma.com/design/kMYnZ9ougpSSQBdjZCgtdX/espresso-2.0?node-id=25393-27651) | 2026-05-24 | Pixel-accurate after ADR-0004 and ADR-0005. xl/2xl + blue/green/etc. themes are code-only extensions. | +| `Button` (sm/md/lg) | [`25393-27651`](https://www.figma.com/design/kMYnZ9ougpSSQBdjZCgtdX/espresso-2.0?node-id=25393-27651) | 2026-05-24 | Pixel-accurate after ADR-0004 and ADR-0005. xs/xl/2xl + blue/green/etc. themes are code-only extensions. | diff --git a/src/components/Badge/Badge.api.md b/src/components/Badge/Badge.api.md index 146a665a4..3c69d6827 100644 --- a/src/components/Badge/Badge.api.md +++ b/src/components/Badge/Badge.api.md @@ -9,7 +9,7 @@ name: 'theme', description: 'Visual color theme of the badge', required: false, - type: '"blue" | "red" | "green" | "gray" | "orange"', + type: '"blue" | "red" | "green" | "gray" | "amber" | "violet" | "orange"', default: '"gray"' }, { diff --git a/src/components/Badge/Badge.cy.ts b/src/components/Badge/Badge.cy.ts index 8d1febe1e..682c47049 100644 --- a/src/components/Badge/Badge.cy.ts +++ b/src/components/Badge/Badge.cy.ts @@ -41,7 +41,7 @@ describe('', () => { label: 'Blue', }, }) - cy.get('.inline-flex.rounded-full').should('have.class', 'text-ink-blue-2') + cy.get('.inline-flex.rounded-full').should('have.class', 'text-ink-blue-4') cy.get('.inline-flex.rounded-full').should('have.class', 'bg-surface-blue-2') // Green @@ -51,18 +51,28 @@ describe('', () => { label: 'Green', }, }) - cy.get('.inline-flex.rounded-full').should('have.class', 'text-ink-green-3') + cy.get('.inline-flex.rounded-full').should('have.class', 'text-ink-green-4') cy.get('.inline-flex.rounded-full').should('have.class', 'bg-surface-green-2') - // Orange + // Amber + cy.mount(Badge, { + props: { + theme: 'amber', + label: 'Amber', + }, + }) + cy.get('.inline-flex.rounded-full').should('have.class', 'text-ink-amber-4') + cy.get('.inline-flex.rounded-full').should('have.class', 'bg-surface-amber-2') + + // Orange (deprecated alias for amber) cy.mount(Badge, { props: { theme: 'orange', label: 'Orange', }, }) - cy.get('.inline-flex.rounded-full').should('have.class', 'text-ink-amber-3') - cy.get('.inline-flex.rounded-full').should('have.class', 'bg-surface-amber-1') + cy.get('.inline-flex.rounded-full').should('have.class', 'text-ink-amber-4') + cy.get('.inline-flex.rounded-full').should('have.class', 'bg-surface-amber-2') // Red cy.mount(Badge, { @@ -73,10 +83,20 @@ describe('', () => { }) cy.get('.inline-flex.rounded-full').should('have.class', 'text-ink-red-4') cy.get('.inline-flex.rounded-full').should('have.class', 'bg-surface-red-2') + + // Violet + cy.mount(Badge, { + props: { + theme: 'violet', + label: 'Violet', + }, + }) + cy.get('.inline-flex.rounded-full').should('have.class', 'text-ink-violet-4') + cy.get('.inline-flex.rounded-full').should('have.class', 'bg-surface-violet-2') }) it('renders different variants with gray theme', () => { - // Solid + // Solid (gray uses semantic token; non-gray solids use raw palette) cy.mount(Badge, { props: { variant: 'solid', @@ -104,8 +124,7 @@ describe('', () => { }, }) cy.get('.inline-flex.rounded-full').should('have.class', 'text-ink-gray-6') - cy.get('.inline-flex.rounded-full').should('have.class', 'bg-transparent') - cy.get('.inline-flex.rounded-full').should('have.class', 'border-outline-gray-1') + cy.get('.inline-flex.rounded-full').should('have.class', 'border-outline-gray-2') // Ghost cy.mount(Badge, { @@ -115,7 +134,6 @@ describe('', () => { }, }) cy.get('.inline-flex.rounded-full').should('have.class', 'text-ink-gray-6') - cy.get('.inline-flex.rounded-full').should('have.class', 'bg-transparent') }) it('renders different sizes', () => { @@ -149,7 +167,7 @@ describe('', () => { }, }) cy.get('.inline-flex.rounded-full').should('have.class', 'h-6') - cy.get('.inline-flex.rounded-full').should('have.class', 'text-sm') + cy.get('.inline-flex.rounded-full').should('have.class', 'text-[13px]') cy.get('.inline-flex.rounded-full').should('have.class', 'px-2') }) @@ -250,7 +268,7 @@ describe('', () => { prefix: () => h(TestIcon), }, }) - cy.get('[data-cy="prefix-icon"]').parent().should('have.class', 'max-h-4') + cy.get('[data-cy="prefix-icon"]').parent().should('have.class', 'size-2.5') // Test with md size (default) cy.mount(Badge, { @@ -259,7 +277,7 @@ describe('', () => { prefix: () => h(TestIcon), }, }) - cy.get('[data-cy="prefix-icon"]').parent().should('have.class', 'max-h-4') + cy.get('[data-cy="prefix-icon"]').parent().should('have.class', 'size-2.5') // Test with lg size cy.mount(Badge, { @@ -268,6 +286,6 @@ describe('', () => { prefix: () => h(TestIcon), }, }) - cy.get('[data-cy="prefix-icon"]').parent().should('have.class', 'max-h-6') + cy.get('[data-cy="prefix-icon"]').parent().should('have.class', 'size-3') }) }) diff --git a/src/components/Badge/Badge.md b/src/components/Badge/Badge.md index 346016f66..e2b972f77 100644 --- a/src/components/Badge/Badge.md +++ b/src/components/Badge/Badge.md @@ -2,12 +2,28 @@ A small label used to highlight status, counts, or metadata associated with an element. -## Variants +## Playground - + -## Themes +## Event status - + + +## Call metadata + + + +## List status + + + +## Row tags + + + +## Reactions + + diff --git a/src/components/Badge/Badge.vue b/src/components/Badge/Badge.vue index 8099ae703..ee0aed729 100644 --- a/src/components/Badge/Badge.vue +++ b/src/components/Badge/Badge.vue @@ -1,18 +1,20 @@ - diff --git a/src/components/TabButtons/TabButtons.vue b/src/components/TabButtons/TabButtons.vue index 6d99d7eb2..975c11e22 100644 --- a/src/components/TabButtons/TabButtons.vue +++ b/src/components/TabButtons/TabButtons.vue @@ -288,4 +288,3 @@ function tabElementProps(button: (typeof resolvedButtons.value)[number]) {
- From 1ffc0db19e21b596f46f7e2a768456bd9dd707df Mon Sep 17 00:00:00 2001 From: Faris Ansari Date: Mon, 25 May 2026 02:27:52 +0530 Subject: [PATCH 15/22] refactor(focus-ring): adopt focus-ring utilities across components MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Swap the per-site focus-visible:ring-* + ring-outline-gray-* patterns for the new focus-ring / focus-ring-{theme} utilities backed by the --focus-* design tokens. Button maps theme → themed focus-ring (blue/green/red); other components use the default gray focus-ring. Triggers in Select / shared selection / MultiSelect TagsTrigger also adopt focus-ring on data-[state=open] so the open ring matches the focus ring exactly. Intentional suppression sites (Sidebar item, ghost input variants) left unchanged. Co-Authored-By: Claude Opus 4.7 --- src/components/Breadcrumbs/Breadcrumbs.vue | 6 +++--- src/components/Button/Button.vue | 8 ++++---- src/components/Checkbox/Checkbox.vue | 2 +- src/components/MultiSelect/stories/TagsTrigger.vue | 2 +- src/components/Rating/Rating.vue | 4 ++-- src/components/Select/utils.ts | 2 +- src/components/Switch/Switch.vue | 4 ++-- src/components/TextInput/TextInput.vue | 4 ++-- src/components/Textarea/Textarea.vue | 4 ++-- src/components/Toast/Toast.vue | 4 ++-- src/components/shared/selection/utils.ts | 4 ++-- 11 files changed, 22 insertions(+), 22 deletions(-) diff --git a/src/components/Breadcrumbs/Breadcrumbs.vue b/src/components/Breadcrumbs/Breadcrumbs.vue index 1ca275fd4..5ed9f2587 100644 --- a/src/components/Breadcrumbs/Breadcrumbs.vue +++ b/src/components/Breadcrumbs/Breadcrumbs.vue @@ -19,7 +19,7 @@ v-if="item.route" :to="item.route" @click="item.onClick ? item.onClick() : null" - class="flex items-center rounded px-0.5 py-1 text-lg font-medium focus:outline-none focus-visible:ring-2 focus-visible:ring-outline-gray-3" + class="flex items-center rounded px-0.5 py-1 text-lg font-medium focus:outline-none focus-visible:focus-ring" :class="[ i == crumbs.length - 1 ? 'min-w-0 text-ink-gray-9' @@ -39,7 +39,7 @@ v-else-if="item.href" :href="item.href" @click="item.onClick ? item.onClick() : null" - class="flex items-center rounded px-0.5 py-1 text-lg font-medium focus:outline-none focus-visible:ring-2 focus-visible:ring-outline-gray-3" + class="flex items-center rounded px-0.5 py-1 text-lg font-medium focus:outline-none focus-visible:focus-ring" :class="[ i == crumbs.length - 1 ? 'min-w-0 text-ink-gray-9' @@ -58,7 +58,7 @@