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..f17cdeea3 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 */ @@ -27,16 +30,12 @@ declare module 'vue' { Checkbox: typeof import('./src/components/Checkbox/Checkbox.vue')['default'] CircularProgressBar: typeof import('./src/components/CircularProgressBar/CircularProgressBar.vue')['default'] 'CircularProgressBar.story': typeof import('./src/components/CircularProgressBar/CircularProgressBar.story.vue')['default'] - Clearable: typeof import('./src/components/Rating/stories/Clearable.vue')['default'] CodeBlockComponent: typeof import('./src/components/TextEditor/components/CodeBlockComponent.vue')['default'] Combobox: typeof import('./src/components/Combobox/Combobox.vue')['default'] ComboboxResults: typeof import('./src/components/Combobox/ComboboxResults.vue')['default'] CommandPalette: typeof import('./src/components/CommandPalette/CommandPalette.vue')['default'] CommandPaletteItem: typeof import('./src/components/CommandPalette/CommandPaletteItem.vue')['default'] ConfirmDialog: typeof import('./src/components/ConfirmDialog.vue')['default'] - CustomColor: typeof import('./src/components/Rating/stories/CustomColor.vue')['default'] - CustomIcon: typeof import('./src/components/Rating/stories/CustomIcon.vue')['default'] - CustomSlot: typeof import('./src/components/Rating/stories/CustomSlot.vue')['default'] DatePicker: typeof import('./src/components/DatePicker/DatePicker.vue')['default'] DateRangePicker: typeof import('./src/components/DatePicker/DateRangePicker.vue')['default'] DateTimePicker: typeof import('./src/components/DatePicker/DateTimePicker.vue')['default'] @@ -63,8 +62,7 @@ declare module 'vue' { FormLabel: typeof import('./src/components/FormLabel.vue')['default'] FrappeUIProvider: typeof import('./src/components/Provider/FrappeUIProvider.vue')['default'] FunnelChart: typeof import('./src/components/Charts/FunnelChart.vue')['default'] - HalfStep: typeof import('./src/components/Rating/stories/HalfStep.vue')['default'] - HalfStepCustomColor: typeof import('./src/components/Rating/stories/HalfStepCustomColor.vue')['default'] + Icon: typeof import('./src/components/Icon/Icon.vue')['default'] IframeNodeView: typeof import('./src/components/TextEditor/extensions/iframe/IframeNodeView.vue')['default'] ImageGroupNodeView: typeof import('./src/components/TextEditor/extensions/image-group/ImageGroupNodeView.vue')['default'] ImageGroupUploadDialog: typeof import('./src/components/TextEditor/extensions/image-group/ImageGroupUploadDialog.vue')['default'] @@ -111,6 +109,7 @@ declare module 'vue' { OptionIcon: typeof import('./src/components/shared/selection/OptionIcon.vue')['default'] Password: typeof import('./src/components/Password/Password.vue')['default'] PickerShell: typeof import('./src/components/shared/picker/PickerShell.vue')['default'] + Pill: typeof import('./src/components/Pill/Pill.vue')['default'] Popover: typeof import('./src/components/Popover/Popover.vue')['default'] Progress: typeof import('./src/components/Progress/Progress.vue')['default'] Rating: typeof import('./src/components/Rating/Rating.vue')['default'] 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) }, diff --git a/docs/.vitepress/theme/index.ts b/docs/.vitepress/theme/index.ts index 5d47ce4bf..e15ae1f28 100644 --- a/docs/.vitepress/theme/index.ts +++ b/docs/.vitepress/theme/index.ts @@ -1,8 +1,12 @@ import type { Theme } from 'vitepress' -import "../../../src/fonts/Inter/inter.css" -import "../../css/style.css" -import "../../css/shiki.css" +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 BadgeBuilder from '../../components/Docs/BadgeBuilder.vue' +import PillBuilder from '../../components/Docs/PillBuilder.vue' +import TabButtonsBuilder from '../../components/Docs/TabButtonsBuilder.vue' import Layout from '../../components/Layout.vue' if (process.env.NODE_ENV === 'production') { @@ -10,8 +14,12 @@ if (process.env.NODE_ENV === 'production') { } export default { - Layout, + Layout, enhanceApp({ app, router, siteData }) { app.component('ComponentPreview', Demo) + app.component('ButtonBuilder', ButtonBuilder) + app.component('BadgeBuilder', BadgeBuilder) + app.component('PillBuilder', PillBuilder) + app.component('TabButtonsBuilder', TabButtonsBuilder) }, } satisfies Theme diff --git a/docs/components/Docs/BadgeBuilder.vue b/docs/components/Docs/BadgeBuilder.vue new file mode 100644 index 000000000..68b1699e5 --- /dev/null +++ b/docs/components/Docs/BadgeBuilder.vue @@ -0,0 +1,79 @@ + + + diff --git a/docs/components/Docs/ButtonBuilder.vue b/docs/components/Docs/ButtonBuilder.vue new file mode 100644 index 000000000..26b130395 --- /dev/null +++ b/docs/components/Docs/ButtonBuilder.vue @@ -0,0 +1,97 @@ + + + diff --git a/docs/components/Docs/ComponentPlayground.vue b/docs/components/Docs/ComponentPlayground.vue new file mode 100644 index 000000000..23bf301a0 --- /dev/null +++ b/docs/components/Docs/ComponentPlayground.vue @@ -0,0 +1,174 @@ + + + + + diff --git a/docs/components/Docs/PillBuilder.vue b/docs/components/Docs/PillBuilder.vue new file mode 100644 index 000000000..03431197f --- /dev/null +++ b/docs/components/Docs/PillBuilder.vue @@ -0,0 +1,88 @@ + + + diff --git a/docs/components/Docs/TabButtonsBuilder.vue b/docs/components/Docs/TabButtonsBuilder.vue new file mode 100644 index 000000000..a56c90106 --- /dev/null +++ b/docs/components/Docs/TabButtonsBuilder.vue @@ -0,0 +1,119 @@ + + + diff --git a/docs/components/Docs/sidebarList.ts b/docs/components/Docs/sidebarList.ts index f312019f0..c79cec547 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: 'Base Colors', link: '/docs/foundations/colours/base' }, + { text: 'Semantic Colors', link: '/docs/foundations/colours/semantic' }, + { text: 'Typography', link: '/docs/foundations/typography' }, + { text: 'Radius', link: '/docs/foundations/radius' }, + { text: 'Elevation', link: '/docs/foundations/elevation' }, ], }, { 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/ElevationPreview.vue b/docs/components/foundations/ElevationPreview.vue new file mode 100644 index 000000000..0cbe9d0b1 --- /dev/null +++ b/docs/components/foundations/ElevationPreview.vue @@ -0,0 +1,64 @@ + + + diff --git a/docs/components/foundations/FocusRingPreview.vue b/docs/components/foundations/FocusRingPreview.vue new file mode 100644 index 000000000..c0cb74eb2 --- /dev/null +++ b/docs/components/foundations/FocusRingPreview.vue @@ -0,0 +1,22 @@ + + + diff --git a/docs/components/foundations/PalettePage.vue b/docs/components/foundations/PalettePage.vue new file mode 100644 index 000000000..6ff105ad6 --- /dev/null +++ b/docs/components/foundations/PalettePage.vue @@ -0,0 +1,237 @@ + + + diff --git a/docs/components/foundations/RadiusPage.vue b/docs/components/foundations/RadiusPage.vue new file mode 100644 index 000000000..c6d607183 --- /dev/null +++ b/docs/components/foundations/RadiusPage.vue @@ -0,0 +1,97 @@ + + + diff --git a/docs/components/foundations/SemanticPage.vue b/docs/components/foundations/SemanticPage.vue new file mode 100644 index 000000000..3a2a0381f --- /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..0290ec266 --- /dev/null +++ b/docs/components/foundations/TypographyPage.vue @@ -0,0 +1,144 @@ + + + diff --git a/docs/components/tokens/DropShadow.vue b/docs/components/tokens/DropShadow.vue deleted file mode 100644 index e07d6e50d..000000000 --- a/docs/components/tokens/DropShadow.vue +++ /dev/null @@ -1,24 +0,0 @@ - - - diff --git a/docs/composables/useTheme.ts b/docs/composables/useTheme.ts new file mode 100644 index 000000000..9d0a880b7 --- /dev/null +++ b/docs/composables/useTheme.ts @@ -0,0 +1,31 @@ +import { onBeforeUnmount, onMounted, ref } from 'vue' + +export type DocsTheme = 'light' | 'dark' + +// Navbar.vue sets `data-theme` on ; observe it so other pages can +// react to global theme toggles without coupling to the Navbar component. +export function useTheme() { + const theme = ref('light') + let observer: MutationObserver | null = null + + const read = () => { + const value = document.documentElement.getAttribute('data-theme') + theme.value = value === 'dark' ? 'dark' : 'light' + } + + onMounted(() => { + read() + observer = new MutationObserver(read) + observer.observe(document.documentElement, { + attributes: true, + attributeFilter: ['data-theme'], + }) + }) + + onBeforeUnmount(() => { + observer?.disconnect() + observer = null + }) + + return theme +} 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..878664691 --- /dev/null +++ b/docs/content/docs/foundations/colours/base.md @@ -0,0 +1,11 @@ +--- +outline: false +--- + + + +# Base Colors + + diff --git a/docs/content/docs/foundations/colours/semantic.md b/docs/content/docs/foundations/colours/semantic.md new file mode 100644 index 000000000..643b1894a --- /dev/null +++ b/docs/content/docs/foundations/colours/semantic.md @@ -0,0 +1,11 @@ +--- +outline: false +--- + + + +# Semantic Colors + + diff --git a/docs/content/docs/foundations/elevation.md b/docs/content/docs/foundations/elevation.md new file mode 100644 index 000000000..20e701d09 --- /dev/null +++ b/docs/content/docs/foundations/elevation.md @@ -0,0 +1,68 @@ +--- +outline: false +--- + + + +# Elevation + +Elevation conveys depth and hierarchy. Each step is a CSS variable +(`--elevation-*`) that resolves to the same value in both themes — Espresso 2.0 +uses one shadow set for light and dark, so the same `shadow-*` utility works in +either mode without overrides. + +## Elevation scale + +Six steps from inset hairline to floating overlay, plus `shadow-status` for +status-dot rings. + + + +## Focus rings + +Component utilities backed by `--focus-*`. Width flips from 2px (light) to 3px +(dark) automatically. Pair with `focus-visible:` for keyboard-only highlight. + + + +## Surface pairing + +In dark mode, shadows fade against dark backgrounds — depth is carried by a +lighter surface underneath. Recommended pairings for floating components: + +| Use case | Shadow | Dark surface | +| ----------------- | -------------- | ----------------- | +| Inset / pressed | `shadow-sm` | `surface-gray-1` | +| Card | `shadow-base` | `surface-gray-1` | +| Dropdown / menu | `shadow-md` | `surface-gray-1` | +| Popover | `shadow-lg` | `surface-gray-2` | +| Modal | `shadow-xl` | `surface-gray-2` | +| Toast / overlay | `shadow-2xl` | `surface-gray-3` | + +## Migration + +**Shadow values updated.** `shadow-sm` through `shadow-2xl` are now backed by +the Figma elevation scale. Y-offset, blur, and spread are all larger than +before, and most steps now include a subtle inner white highlight. Visual diff +is expected wherever shadows are used. + +**New: `shadow-base`.** Sits between `shadow-sm` and `shadow-md` for resting +cards. `shadow` (the bare utility) remains as an alias. + +**New: `shadow-status`.** A 1.5px white halo for status dots over coloured +backgrounds. + +**One shadow set for both themes.** `shadow-*` utilities resolve to a single +value (`var(--elevation-*)`) regardless of theme — matching how Espresso 2.0 +applies shadows in the Figma dark-mode page. Remove any conditional +`dark:shadow-*` overrides. If a component genuinely needs a heavier +dark-mode-specific shadow, opt in with `shadow-dark-{sm,base,md,lg,xl,2xl}`. + +**Focus rings.** Replace `focus-visible:ring-2 ring-outline-gray-3` with +`focus-visible:focus-ring`; semantic variants exist for red (error), green +(success), amber, blue, violet. Existing `ring-*` utilities are unchanged — +migrate only focus state, not selection rings (e.g. media nodes using +`ring-offset-2`). diff --git a/docs/content/docs/foundations/radius.md b/docs/content/docs/foundations/radius.md new file mode 100644 index 000000000..94acbafb3 --- /dev/null +++ b/docs/content/docs/foundations/radius.md @@ -0,0 +1,11 @@ +--- +outline: false +--- + + + +# Radius + + 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/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..241a2bc5c --- /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`. `xs`, `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 | +|---|---|---| +| `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. | + +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. 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/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 @@ - - - diff --git a/src/components/Button/types.ts b/src/components/Button/types.ts index 7848f3531..21b0667f6 100644 --- a/src/components/Button/types.ts +++ b/src/components/Button/types.ts @@ -2,7 +2,7 @@ import { type RouterLinkProps } from 'vue-router' import { type Component } from 'vue' type Theme = 'gray' | 'blue' | 'green' | 'red' -type Size = 'sm' | 'md' | 'md' | 'lg' | 'xl' | '2xl' +type Size = 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl' type Variant = 'solid' | 'subtle' | 'outline' | 'ghost' export interface ButtonProps { diff --git a/src/components/Checkbox/Checkbox.vue b/src/components/Checkbox/Checkbox.vue index d8e44533c..e3b4e42e6 100644 --- a/src/components/Checkbox/Checkbox.vue +++ b/src/components/Checkbox/Checkbox.vue @@ -135,7 +135,7 @@ const inputClasses = computed(() => { ? '' : props.padding ? 'focus:ring-0' - : 'hover:shadow-sm focus:ring-0 focus-visible:ring-2 focus-visible:ring-outline-gray-3 active:bg-surface-gray-2' + : 'hover:shadow-sm focus:ring-0 focus-visible:focus-ring active:bg-surface-gray-2' let sizeClasses = { sm: 'w-3.5 h-3.5', diff --git a/src/components/Divider/Divider.api.md b/src/components/Divider/Divider.api.md index b908b0ce6..730a6535f 100644 --- a/src/components/Divider/Divider.api.md +++ b/src/components/Divider/Divider.api.md @@ -9,7 +9,7 @@ name: 'orientation', description: '', required: false, - type: '"horizontal" | "vertical"', + type: '"vertical" | "horizontal"', default: '"horizontal"' }, { diff --git a/src/components/Icon/Icon.cy.ts b/src/components/Icon/Icon.cy.ts new file mode 100644 index 000000000..d334a76de --- /dev/null +++ b/src/components/Icon/Icon.cy.ts @@ -0,0 +1,78 @@ +import { h } from 'vue' +import Icon from './Icon.vue' + +describe('', () => { + it('renders a lucide string as a span with the class', () => { + cy.mount(Icon, { props: { name: 'lucide-star' } }) + cy.get('span').should('have.class', 'lucide-star') + cy.get('span').should('have.attr', 'aria-hidden', 'true') + cy.get('span').should('be.empty') + }) + + it('passes through fallthrough class on lucide spans', () => { + cy.mount(Icon, { + props: { name: 'lucide-check' }, + attrs: { class: 'size-4 text-ink-gray-6' }, + }) + cy.get('span') + .should('have.class', 'lucide-check') + .and('have.class', 'size-4') + .and('have.class', 'text-ink-gray-6') + }) + + it('renders an emoji string as text content', () => { + cy.mount(Icon, { props: { name: '🚀' } }) + cy.get('span').should('have.text', '🚀') + cy.get('span').should('have.attr', 'aria-hidden', 'true') + }) + + it('treats other glyphs (no ASCII letters/digits) as emoji', () => { + cy.mount(Icon, { props: { name: '✨' } }) + cy.get('span').should('have.text', '✨') + }) + + it('renders a legacy feather name via FeatherIcon (svg)', () => { + cy.mount(Icon, { props: { name: 'check' } }) + cy.get('svg').should('exist') + cy.get('svg').should('have.attr', 'aria-hidden', 'true') + }) + + it('renders a Component value via ', () => { + const CustomIcon = { + name: 'custom-icon', + render() { + return h('svg', { 'data-cy': 'custom-icon' }) + }, + } + cy.mount(Icon, { props: { name: CustomIcon } }) + cy.get('[data-cy="custom-icon"]').should('exist') + }) + + it('passes fallthrough attrs to the rendered Component', () => { + const CustomIcon = { + name: 'custom-icon', + render() { + return h('svg', { 'data-cy': 'custom-icon' }) + }, + } + cy.mount(Icon, { + props: { name: CustomIcon }, + attrs: { class: 'size-5' }, + }) + cy.get('[data-cy="custom-icon"]').should('have.class', 'size-5') + }) + + it('renders nothing when name is falsy', () => { + cy.mount(Icon, { props: { name: null } }) + cy.get('span').should('not.exist') + cy.get('svg').should('not.exist') + + cy.mount(Icon, { props: { name: '' } }) + cy.get('span').should('not.exist') + cy.get('svg').should('not.exist') + + cy.mount(Icon, { props: {} }) + cy.get('span').should('not.exist') + cy.get('svg').should('not.exist') + }) +}) diff --git a/src/components/Icon/Icon.vue b/src/components/Icon/Icon.vue new file mode 100644 index 000000000..ce009d9fd --- /dev/null +++ b/src/components/Icon/Icon.vue @@ -0,0 +1,50 @@ + + + diff --git a/src/components/Icon/index.ts b/src/components/Icon/index.ts new file mode 100644 index 000000000..ea5ccfd44 --- /dev/null +++ b/src/components/Icon/index.ts @@ -0,0 +1 @@ +export { default as Icon } from './Icon.vue' diff --git a/src/components/MultiSelect/stories/TagsTrigger.vue b/src/components/MultiSelect/stories/TagsTrigger.vue index faa483e99..644bfbd5b 100644 --- a/src/components/MultiSelect/stories/TagsTrigger.vue +++ b/src/components/MultiSelect/stories/TagsTrigger.vue @@ -33,7 +33,7 @@ function removeTag(value: string) {