@citron-systems/citron-ds 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,200 @@
1
+
2
+ // Do not edit directly, this file was auto-generated.
3
+
4
+ $inkblot-breakpoint-sm: 640px; // Small devices
5
+ $inkblot-breakpoint-md: 768px; // Tablets
6
+ $inkblot-breakpoint-lg: 1024px; // Laptops
7
+ $inkblot-breakpoint-xl: 1280px; // Desktops
8
+ $inkblot-breakpoint-2xl: 1536px; // Large screens
9
+ $inkblot-color-neutral-white: #ffffff; // Pure white, floating surfaces
10
+ $inkblot-color-neutral-gray-50: #fafaf7; // Warm off-white, body background
11
+ $inkblot-color-neutral-gray-100: #f5f4f0; // Warm surface, secondary bg
12
+ $inkblot-color-neutral-gray-200: #eae9e3; // Subtle warm border, dividers
13
+ $inkblot-color-neutral-gray-300: #d4d3cb; // Medium warm border
14
+ $inkblot-color-neutral-gray-400: #93928a; // Placeholder text, muted
15
+ $inkblot-color-neutral-gray-500: #6b6a63; // Secondary text
16
+ $inkblot-color-neutral-gray-600: #4d4c47; // Emphasized secondary
17
+ $inkblot-color-neutral-gray-700: #3a3935; // Strong text
18
+ $inkblot-color-neutral-gray-800: #2d2c28; // Deep warm dark
19
+ $inkblot-color-neutral-gray-900: #1d1c19; // Primary text — deep slate, never pure black
20
+ $inkblot-color-neutral-gray-950: #0f0e0c; // Deepest warm black
21
+ $inkblot-color-accent-citron-50: #fdfbf3; // Barely there citron wash
22
+ $inkblot-color-accent-citron-100: #faf4df; // Soft cream tint
23
+ $inkblot-color-accent-citron-200: #f3e6b8; // Warm wheat
24
+ $inkblot-color-accent-citron-300: #e8d38a; // Light honey
25
+ $inkblot-color-accent-citron-400: #d9bc58; // Citrus glow
26
+ $inkblot-color-accent-citron-500: #c4a030; // Citron primary — the brand tone
27
+ $inkblot-color-accent-citron-600: #a38427; // Deep citron, hover state
28
+ $inkblot-color-accent-citron-700: #7f671f; // Rich amber
29
+ $inkblot-color-accent-citron-800: #5c4a18; // Dark citron
30
+ $inkblot-color-accent-citron-900: #3d3111; // Deepest citron
31
+ $inkblot-color-semantic-success-light: #3d9e50; // Warm success green
32
+ $inkblot-color-semantic-success-main: #358c46; // Primary success
33
+ $inkblot-color-semantic-success-dark: #2a7538; // Success hover
34
+ $inkblot-color-semantic-warning-light: #e0a020; // Warm amber warning
35
+ $inkblot-color-semantic-warning-main: #c48c1a; // Primary warning — distinct from citron by saturation
36
+ $inkblot-color-semantic-warning-dark: #a67515; // Warning hover
37
+ $inkblot-color-semantic-error-light: #d14940; // Warm red
38
+ $inkblot-color-semantic-error-main: #be3e35; // Primary error
39
+ $inkblot-color-semantic-error-dark: #a3352d; // Error hover
40
+ $inkblot-color-semantic-info-light: #6ba3c2; // Muted warm blue
41
+ $inkblot-color-semantic-info-main: #5790ad; // Primary info — desaturated, warm
42
+ $inkblot-color-semantic-info-dark: #497a94; // Info hover
43
+ $inkblot-duration-instant: 0ms; // No animation
44
+ $inkblot-duration-fast: 120ms; // Micro-interactions, hovers — fast enough to feel physical
45
+ $inkblot-duration-normal: 200ms; // Standard transitions
46
+ $inkblot-duration-slow: 320ms; // Complex transitions, enter/exit
47
+ $inkblot-duration-slower: 500ms; // Page-level transitions, long reveals
48
+ $inkblot-easing-default: cubic-bezier(0.25, 0.1, 0.25, 1); // Standard ease — natural deceleration
49
+ $inkblot-easing-in: cubic-bezier(0.32, 0, 0.67, 0); // Ease in — for exits, things leaving
50
+ $inkblot-easing-out: cubic-bezier(0.33, 1, 0.68, 1); // Ease out — for entrances, things arriving
51
+ $inkblot-easing-in-out: cubic-bezier(0.65, 0, 0.35, 1); // Ease in-out — for position changes, transforms
52
+ $inkblot-easing-expressive: cubic-bezier(0.22, 1, 0.36, 1); // Expressive ease-out — smooth, confident arrival. Replaces bounce.
53
+ $inkblot-grid-columns-mobile: 4rem; // 4-column grid for < 640px
54
+ $inkblot-grid-columns-tablet: 8rem; // 8-column grid for 640–1023px
55
+ $inkblot-grid-columns-desktop: 12rem; // 12-column grid for 1024–1535px
56
+ $inkblot-grid-columns-wide: 16rem; // 16-column grid for 1536px+
57
+ $inkblot-grid-columns-max: 24rem; // 24-column grid for complex dashboards
58
+ $inkblot-grid-gutter-sm: 0.5rem; // 8px - compact mobile gutter
59
+ $inkblot-grid-gutter-md: 1rem; // 16px - standard gutter
60
+ $inkblot-grid-gutter-lg: 1.5rem; // 24px - spacious desktop gutter
61
+ $inkblot-grid-gutter-xl: 2rem; // 32px - wide layout gutter
62
+ $inkblot-grid-margin-mobile: 1rem; // 16px page margin on mobile
63
+ $inkblot-grid-margin-tablet: 2rem; // 32px page margin on tablet
64
+ $inkblot-grid-margin-desktop: 4rem; // 64px page margin on desktop
65
+ $inkblot-grid-margin-wide: auto; // Auto-center on wide screens
66
+ $inkblot-grid-max-width-content: 768px; // Max width for readable content
67
+ $inkblot-grid-max-width-container: 1200px; // Max width for standard layouts
68
+ $inkblot-grid-max-width-wide: 1440px; // Max width for wide layouts
69
+ $inkblot-grid-max-width-full: 1920px; // Max width for full-bleed
70
+ $inkblot-radius-none: 0; // No rounding
71
+ $inkblot-radius-sm: 6px; // Subtle rounding, chips
72
+ $inkblot-radius-md: 10px; // Inputs, small cards
73
+ $inkblot-radius-lg: 14px; // Buttons, interactive elements
74
+ $inkblot-radius-xl: 18px; // Cards, modals
75
+ $inkblot-radius-2xl: 24px; // Large surfaces, hero cards
76
+ $inkblot-radius-full: 9999px; // Pills, avatars, toggles
77
+ $inkblot-border-width-none: 0; // No border
78
+ $inkblot-border-width-thin: 1px; // Subtle dividers, the default
79
+ $inkblot-border-width-medium: 2px; // Focus rings
80
+ $inkblot-border-width-thick: 3px; // Strong emphasis, rarely used
81
+ $inkblot-shadow-none: none; // No shadow
82
+ $inkblot-shadow-xs: 0 1px 2px 0 rgba(29, 28, 25, 0.04); // Barely there lift
83
+ $inkblot-shadow-sm: 0 2px 8px -1px rgba(29, 28, 25, 0.06), 0 1px 3px -1px rgba(29, 28, 25, 0.04); // Cards — soft, warm, diffused
84
+ $inkblot-shadow-md: 0 4px 16px -2px rgba(29, 28, 25, 0.08), 0 2px 6px -2px rgba(29, 28, 25, 0.04); // Elevated cards, dropdowns
85
+ $inkblot-shadow-lg: 0 8px 24px -4px rgba(29, 28, 25, 0.10), 0 4px 10px -4px rgba(29, 28, 25, 0.04); // Modals, popovers
86
+ $inkblot-shadow-xl: 0 16px 40px -8px rgba(29, 28, 25, 0.12), 0 8px 16px -8px rgba(29, 28, 25, 0.04); // Maximum elevation — ambient, not harsh
87
+ $inkblot-opacity-disabled: 0.4; // Disabled elements
88
+ $inkblot-opacity-overlay: 0.45; // Modal backdrops — not too heavy
89
+ $inkblot-opacity-subtle: 0.6; // Secondary content
90
+ $inkblot-opacity-default: 1; // Full opacity
91
+ $inkblot-spacing-0: 0; // No spacing
92
+ $inkblot-spacing-1: 0.25rem; // 4px
93
+ $inkblot-spacing-2: 0.5rem; // 8px
94
+ $inkblot-spacing-3: 0.75rem; // 12px
95
+ $inkblot-spacing-4: 1rem; // 16px
96
+ $inkblot-spacing-5: 1.25rem; // 20px
97
+ $inkblot-spacing-6: 1.5rem; // 24px
98
+ $inkblot-spacing-8: 2rem; // 32px
99
+ $inkblot-spacing-10: 2.5rem; // 40px
100
+ $inkblot-spacing-12: 3rem; // 48px
101
+ $inkblot-spacing-16: 4rem; // 64px
102
+ $inkblot-spacing-20: 5rem; // 80px
103
+ $inkblot-spacing-24: 6rem; // 96px
104
+ $inkblot-spacing-32: 8rem; // 128px
105
+ $inkblot-size-icon-xs: 1rem; // 16px icon
106
+ $inkblot-size-icon-sm: 1.25rem; // 20px icon
107
+ $inkblot-size-icon-md: 1.5rem; // 24px icon
108
+ $inkblot-size-icon-lg: 2rem; // 32px icon
109
+ $inkblot-size-icon-xl: 2.5rem; // 40px icon
110
+ $inkblot-size-touch-target-min: 44px; // Minimum touch target (WCAG)
111
+ $inkblot-size-touch-target-comfortable: 48px; // Comfortable touch target
112
+ $inkblot-typography-font-family-sans: 'Inter', 'SF Pro Text', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; // Primary UI font — humanist, modern, highly legible
113
+ $inkblot-typography-font-family-mono: 'JetBrains Mono', 'SF Mono', ui-monospace, Menlo, Consolas, monospace; // Code and data
114
+ $inkblot-typography-font-family-display: 'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif; // Headlines — same family, optical size variant
115
+ $inkblot-typography-font-size-xs: 0.75rem; // 12px — captions, meta
116
+ $inkblot-typography-font-size-sm: 0.8125rem; // 13px — secondary text
117
+ $inkblot-typography-font-size-base: 0.9375rem; // 15px — body text, slightly refined from 16
118
+ $inkblot-typography-font-size-md: 1.0625rem; // 17px — emphasized body
119
+ $inkblot-typography-font-size-lg: 1.25rem; // 20px — card titles, subheadings
120
+ $inkblot-typography-font-size-xl: 1.5rem; // 24px — section titles
121
+ $inkblot-typography-font-size-2xl: 1.75rem; // 28px — page titles
122
+ $inkblot-typography-font-size-3xl: 2.125rem; // 34px — hero — composed, not shouting
123
+ $inkblot-typography-font-size-4xl: 2.75rem; // 44px — display, rarely used
124
+ $inkblot-typography-font-size-5xl: 3.25rem; // 52px — maximum display
125
+ $inkblot-typography-font-weight-regular: 400; // Body text
126
+ $inkblot-typography-font-weight-medium: 500; // Emphasis, labels, card titles
127
+ $inkblot-typography-font-weight-semibold: 600; // Headings, buttons
128
+ $inkblot-typography-font-weight-bold: 700; // Strong emphasis, sparingly
129
+ $inkblot-typography-line-height-tight: 1.2; // Headlines
130
+ $inkblot-typography-line-height-snug: 1.375; // Subheadings
131
+ $inkblot-typography-line-height-normal: 1.5; // Body text
132
+ $inkblot-typography-line-height-relaxed: 1.65; // Long-form, generous breathing room
133
+ $inkblot-typography-line-height-loose: 1.8; // Very spacious
134
+ $inkblot-typography-letter-spacing-tighter: -0.04em; // Large headlines
135
+ $inkblot-typography-letter-spacing-tight: -0.02em; // Headings
136
+ $inkblot-typography-letter-spacing-normal: 0; // Body
137
+ $inkblot-typography-letter-spacing-wide: 0.02em; // Labels
138
+ $inkblot-typography-letter-spacing-wider: 0.06em; // Uppercase meta
139
+ $inkblot-z-index-hide: -1; // Hidden below base layer
140
+ $inkblot-z-index-base: 0; // Default document flow
141
+ $inkblot-z-index-raised: 1; // Slightly above base (cards on hover)
142
+ $inkblot-z-index-dropdown: 10; // Dropdowns, select menus
143
+ $inkblot-z-index-sticky: 20; // Sticky headers, nav bars
144
+ $inkblot-z-index-overlay: 30; // Backdrop overlays
145
+ $inkblot-z-index-modal: 40; // Modals, dialogs, sheets
146
+ $inkblot-z-index-popover: 50; // Popovers, tooltips
147
+ $inkblot-z-index-toast: 60; // Toast notifications
148
+ $inkblot-z-index-max: 9999; // Emergency override (avoid)
149
+ $inkblot-dark-color-background-primary: #12110e; // Deep warm black, not pure black
150
+ $inkblot-dark-color-background-secondary: #1d1c18; // Elevated warm surface
151
+ $inkblot-dark-color-background-tertiary: #2a2924; // Grouped content, inset
152
+ $inkblot-dark-color-background-inverse: #fafaf7; // Inverted to warm off-white
153
+ $inkblot-dark-color-text-primary: #f5f4f0; // Warm off-white text
154
+ $inkblot-dark-color-text-secondary: #93928a; // Warm muted text
155
+ $inkblot-dark-color-text-tertiary: #6b6a63; // Placeholder, hints
156
+ $inkblot-dark-color-text-inverse: #1d1c19; // Dark text on light
157
+ $inkblot-dark-color-text-link: #d9bc58; // Citron 400 — bright enough for dark bg
158
+ $inkblot-dark-color-text-link-hover: #e8d38a; // Citron 300 — lighter on hover
159
+ $inkblot-dark-color-border-default: #38372f; // Warm subtle border
160
+ $inkblot-dark-color-border-strong: #4d4c44; // Emphasized warm border
161
+ $inkblot-dark-color-border-focus: #d9bc58; // Focus ring — bright citron
162
+ $inkblot-dark-color-interactive-primary: #d9bc58; // Citron 400 — lighter for dark mode contrast
163
+ $inkblot-dark-color-interactive-primary-hover: #e8d38a; // Citron 300 — warm glow on hover
164
+ $inkblot-dark-color-interactive-primary-active: #c4a030; // Citron 500 — anchor on press
165
+ $inkblot-dark-color-interactive-secondary: #2a2924; // Warm dark secondary
166
+ $inkblot-dark-color-interactive-secondary-hover: #38372f; // Warm dark hover
167
+ $inkblot-dark-color-status-success: #4cb864; // Bright warm green on dark
168
+ $inkblot-dark-color-status-warning: #e0a020; // Warm amber on dark
169
+ $inkblot-dark-color-status-error: #e05a52; // Warm red on dark
170
+ $inkblot-dark-color-status-info: #7ab8d6; // Soft warm blue on dark
171
+ $inkblot-semantic-color-background-primary: $inkblot-color-neutral-gray-50; // Body background — warm off-white with barely perceptible beige
172
+ $inkblot-semantic-color-background-secondary: $inkblot-color-neutral-white; // Elevated surfaces — clean white floating above base
173
+ $inkblot-semantic-color-background-tertiary: $inkblot-color-neutral-gray-100; // Grouped content, inset areas
174
+ $inkblot-semantic-color-background-inverse: $inkblot-color-neutral-gray-900; // Inverted surfaces
175
+ $inkblot-semantic-color-text-primary: $inkblot-color-neutral-gray-900; // Primary text — deep warm slate, never pure black
176
+ $inkblot-semantic-color-text-secondary: $inkblot-color-neutral-gray-500; // Secondary text
177
+ $inkblot-semantic-color-text-tertiary: $inkblot-color-neutral-gray-400; // Placeholder, hints, captions
178
+ $inkblot-semantic-color-text-inverse: $inkblot-color-neutral-white; // Text on dark surfaces
179
+ $inkblot-semantic-color-text-link: $inkblot-color-accent-citron-600; // Links — deep citron for readability
180
+ $inkblot-semantic-color-text-link-hover: $inkblot-color-accent-citron-700; // Link hover
181
+ $inkblot-semantic-color-border-default: $inkblot-color-neutral-gray-200; // Subtle warm dividers
182
+ $inkblot-semantic-color-border-strong: $inkblot-color-neutral-gray-300; // Emphasized borders
183
+ $inkblot-semantic-color-border-focus: $inkblot-color-accent-citron-500; // Focus ring — citron accent
184
+ $inkblot-semantic-color-interactive-primary: $inkblot-color-accent-citron-500; // Primary CTA — confident citron
185
+ $inkblot-semantic-color-interactive-primary-hover: $inkblot-color-accent-citron-600; // Primary hover — deeper, subtle shift
186
+ $inkblot-semantic-color-interactive-primary-active: $inkblot-color-accent-citron-700; // Primary pressed
187
+ $inkblot-semantic-color-interactive-secondary: $inkblot-color-neutral-gray-100; // Secondary surfaces with subtle depth
188
+ $inkblot-semantic-color-interactive-secondary-hover: $inkblot-color-neutral-gray-200; // Secondary hover
189
+ $inkblot-semantic-color-status-success: $inkblot-color-semantic-success-main; // Success state
190
+ $inkblot-semantic-color-status-warning: $inkblot-color-semantic-warning-main; // Warning state
191
+ $inkblot-semantic-color-status-error: $inkblot-color-semantic-error-main; // Error state
192
+ $inkblot-semantic-color-status-info: $inkblot-color-semantic-info-main; // Info state
193
+ $inkblot-semantic-typography-heading-1: $inkblot-typography-font-weight-semibold $inkblot-typography-font-size-3xl/$inkblot-typography-line-height-tight $inkblot-typography-font-family-display; // Page title — composed, not dramatic
194
+ $inkblot-semantic-typography-heading-2: $inkblot-typography-font-weight-semibold $inkblot-typography-font-size-2xl/$inkblot-typography-line-height-tight $inkblot-typography-font-family-display; // Section title
195
+ $inkblot-semantic-typography-heading-3: $inkblot-typography-font-weight-medium $inkblot-typography-font-size-xl/$inkblot-typography-line-height-snug $inkblot-typography-font-family-sans; // Subsection title
196
+ $inkblot-semantic-typography-heading-4: $inkblot-typography-font-weight-medium $inkblot-typography-font-size-lg/$inkblot-typography-line-height-snug $inkblot-typography-font-family-sans; // Card title
197
+ $inkblot-semantic-typography-body-default: $inkblot-typography-font-weight-regular $inkblot-typography-font-size-base/$inkblot-typography-line-height-normal $inkblot-typography-font-family-sans; // Body text
198
+ $inkblot-semantic-typography-body-small: $inkblot-typography-font-weight-regular $inkblot-typography-font-size-sm/$inkblot-typography-line-height-normal $inkblot-typography-font-family-sans; // Small body, captions
199
+ $inkblot-semantic-typography-body-large: $inkblot-typography-font-weight-regular $inkblot-typography-font-size-md/$inkblot-typography-line-height-relaxed $inkblot-typography-font-family-sans; // Emphasized body
200
+ $inkblot-semantic-typography-label-default: $inkblot-typography-font-weight-medium $inkblot-typography-font-size-xs/$inkblot-typography-line-height-normal $inkblot-typography-font-family-sans; // Form labels, badges
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@citron-systems/citron-ds",
3
+ "version": "1.0.0",
4
+ "description": "Inkblot Studio design token system — Apple-inspired, accessible, AI-ready. Citron design language.",
5
+ "type": "module",
6
+ "main": "dist/js/inkblot-tokens.js",
7
+ "exports": {
8
+ ".": "./dist/js/inkblot-tokens.js",
9
+ "./css": "./dist/css/inkblot-variables.css",
10
+ "./scss": "./dist/scss/_inkblot-variables.scss",
11
+ "./tokens": "./dist/ai/inkblot-tokens-resolved.json",
12
+ "./ai-reference": "./dist/ai/inkblot-ai-reference.json"
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "tokens",
17
+ "README.md"
18
+ ],
19
+ "scripts": {
20
+ "build": "style-dictionary build --config style-dictionary.config.js && node -e \"require('fs').copyFileSync('system/inkblot-ai-reference.json', 'dist/ai/inkblot-ai-reference.json')\"",
21
+ "build:tokens": "style-dictionary build --config style-dictionary.config.js",
22
+ "dev": "concurrently \"npm run build:watch\" \"vite\"",
23
+ "build:watch": "chokidar \"tokens/**/*.json\" -c \"npm run build\"",
24
+ "preview": "vite preview",
25
+ "prepublishOnly": "npm run build"
26
+ },
27
+ "keywords": [
28
+ "design-tokens",
29
+ "design-system",
30
+ "inkblot-studio",
31
+ "citron",
32
+ "style-dictionary",
33
+ "css-variables",
34
+ "scss",
35
+ "wcag",
36
+ "accessibility",
37
+ "ai-ready"
38
+ ],
39
+ "author": "Inkblot Studio",
40
+ "license": "MIT",
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "https://github.com/GHDryanovski19/inkblot-studio-design-tokens.git"
44
+ },
45
+ "bugs": {
46
+ "url": "https://github.com/GHDryanovski19/inkblot-studio-design-tokens/issues"
47
+ },
48
+ "homepage": "https://github.com/GHDryanovski19/inkblot-studio-design-tokens#readme",
49
+ "engines": {
50
+ "node": ">=18"
51
+ },
52
+ "unpkg": "dist/css/inkblot-variables.css",
53
+ "jsdelivr": "dist/css/inkblot-variables.css",
54
+ "devDependencies": {
55
+ "chokidar-cli": "^3.0.0",
56
+ "concurrently": "^8.2.2",
57
+ "style-dictionary": "^4.0.0",
58
+ "vite": "^5.4.0",
59
+ "vite-plugin-live-reload": "^3.0.1"
60
+ }
61
+ }
@@ -0,0 +1,14 @@
1
+ {
2
+ "$description": "Inkblot Studio breakpoints. Mobile-first responsive design.",
3
+ "inkblot": {
4
+ "breakpoint": {
5
+ "$type": "dimension",
6
+ "$description": "Viewport breakpoints for responsive layouts",
7
+ "sm": { "$value": "640px", "$description": "Small devices" },
8
+ "md": { "$value": "768px", "$description": "Tablets" },
9
+ "lg": { "$value": "1024px", "$description": "Laptops" },
10
+ "xl": { "$value": "1280px", "$description": "Desktops" },
11
+ "2xl": { "$value": "1536px", "$description": "Large screens" }
12
+ }
13
+ }
14
+ }
@@ -0,0 +1,71 @@
1
+ {
2
+ "$description": "Citron primitive color palette. Warm, restrained, premium. Citrus interpreted through restraint and taste — never literal, never loud.",
3
+ "inkblot": {
4
+ "$description": "Inkblot Studio — Citron product line",
5
+ "color": {
6
+ "$type": "color",
7
+ "$description": "Base color primitives — use semantic tokens in components, never raw primitives",
8
+ "neutral": {
9
+ "$type": "color",
10
+ "$description": "Warm neutrals with barely perceptible beige undertone. No blue-tinted greys.",
11
+ "white": {
12
+ "$value": "#ffffff",
13
+ "$description": "Pure white, floating surfaces"
14
+ },
15
+ "gray": {
16
+ "50": { "$value": "#fafaf7", "$description": "Warm off-white, body background" },
17
+ "100": { "$value": "#f5f4f0", "$description": "Warm surface, secondary bg" },
18
+ "200": { "$value": "#eae9e3", "$description": "Subtle warm border, dividers" },
19
+ "300": { "$value": "#d4d3cb", "$description": "Medium warm border" },
20
+ "400": { "$value": "#93928a", "$description": "Placeholder text, muted" },
21
+ "500": { "$value": "#6b6a63", "$description": "Secondary text" },
22
+ "600": { "$value": "#4d4c47", "$description": "Emphasized secondary" },
23
+ "700": { "$value": "#3a3935", "$description": "Strong text" },
24
+ "800": { "$value": "#2d2c28", "$description": "Deep warm dark" },
25
+ "900": { "$value": "#1d1c19", "$description": "Primary text — deep slate, never pure black" },
26
+ "950": { "$value": "#0f0e0c", "$description": "Deepest warm black" }
27
+ }
28
+ },
29
+ "accent": {
30
+ "$type": "color",
31
+ "$description": "Citron brand accent — refined citrus-amber, used sparingly for emphasis. Warm light through citrus peel.",
32
+ "citron": {
33
+ "50": { "$value": "#fdfbf3", "$description": "Barely there citron wash" },
34
+ "100": { "$value": "#faf4df", "$description": "Soft cream tint" },
35
+ "200": { "$value": "#f3e6b8", "$description": "Warm wheat" },
36
+ "300": { "$value": "#e8d38a", "$description": "Light honey" },
37
+ "400": { "$value": "#d9bc58", "$description": "Citrus glow" },
38
+ "500": { "$value": "#c4a030", "$description": "Citron primary — the brand tone" },
39
+ "600": { "$value": "#a38427", "$description": "Deep citron, hover state" },
40
+ "700": { "$value": "#7f671f", "$description": "Rich amber" },
41
+ "800": { "$value": "#5c4a18", "$description": "Dark citron" },
42
+ "900": { "$value": "#3d3111", "$description": "Deepest citron" }
43
+ }
44
+ },
45
+ "semantic": {
46
+ "$type": "color",
47
+ "$description": "Status colors — warm-shifted for cohesion, fully accessible",
48
+ "success": {
49
+ "light": { "$value": "#3d9e50", "$description": "Warm success green" },
50
+ "main": { "$value": "#358c46", "$description": "Primary success" },
51
+ "dark": { "$value": "#2a7538", "$description": "Success hover" }
52
+ },
53
+ "warning": {
54
+ "light": { "$value": "#e0a020", "$description": "Warm amber warning" },
55
+ "main": { "$value": "#c48c1a", "$description": "Primary warning — distinct from citron by saturation" },
56
+ "dark": { "$value": "#a67515", "$description": "Warning hover" }
57
+ },
58
+ "error": {
59
+ "light": { "$value": "#d14940", "$description": "Warm red" },
60
+ "main": { "$value": "#be3e35", "$description": "Primary error" },
61
+ "dark": { "$value": "#a3352d", "$description": "Error hover" }
62
+ },
63
+ "info": {
64
+ "light": { "$value": "#6ba3c2", "$description": "Muted warm blue" },
65
+ "main": { "$value": "#5790ad", "$description": "Primary info — desaturated, warm" },
66
+ "dark": { "$value": "#497a94", "$description": "Info hover" }
67
+ }
68
+ }
69
+ }
70
+ }
71
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "$description": "Citron motion. Fast, smooth, physical. No bounce, no overshoot. Transitions feel like light responding to touch.",
3
+ "inkblot": {
4
+ "duration": {
5
+ "$type": "duration",
6
+ "$description": "Animation durations — snappy, never playful",
7
+ "instant": { "$value": "0ms", "$description": "No animation" },
8
+ "fast": { "$value": "120ms", "$description": "Micro-interactions, hovers — fast enough to feel physical" },
9
+ "normal": { "$value": "200ms", "$description": "Standard transitions" },
10
+ "slow": { "$value": "320ms", "$description": "Complex transitions, enter/exit" },
11
+ "slower": { "$value": "500ms", "$description": "Page-level transitions, long reveals" }
12
+ },
13
+ "easing": {
14
+ "$type": "cubicBezier",
15
+ "$description": "Easing curves — smooth, physical, never bouncy",
16
+ "default": {
17
+ "$value": [0.25, 0.1, 0.25, 1],
18
+ "$description": "Standard ease — natural deceleration"
19
+ },
20
+ "in": {
21
+ "$value": [0.32, 0, 0.67, 0],
22
+ "$description": "Ease in — for exits, things leaving"
23
+ },
24
+ "out": {
25
+ "$value": [0.33, 1, 0.68, 1],
26
+ "$description": "Ease out — for entrances, things arriving"
27
+ },
28
+ "inOut": {
29
+ "$value": [0.65, 0, 0.35, 1],
30
+ "$description": "Ease in-out — for position changes, transforms"
31
+ },
32
+ "expressive": {
33
+ "$value": [0.22, 1, 0.36, 1],
34
+ "$description": "Expressive ease-out — smooth, confident arrival. Replaces bounce."
35
+ }
36
+ }
37
+ }
38
+ }
@@ -0,0 +1,34 @@
1
+ {
2
+ "$description": "Inkblot Studio grid and layout tokens. Modular column system scaling 4–24 columns.",
3
+ "inkblot": {
4
+ "grid": {
5
+ "$type": "dimension",
6
+ "$description": "Grid system tokens for responsive, adaptive layouts",
7
+ "columns": {
8
+ "mobile": { "$value": "4", "$description": "4-column grid for < 640px" },
9
+ "tablet": { "$value": "8", "$description": "8-column grid for 640–1023px" },
10
+ "desktop": { "$value": "12", "$description": "12-column grid for 1024–1535px" },
11
+ "wide": { "$value": "16", "$description": "16-column grid for 1536px+" },
12
+ "max": { "$value": "24", "$description": "24-column grid for complex dashboards" }
13
+ },
14
+ "gutter": {
15
+ "sm": { "$value": "0.5rem", "$description": "8px - compact mobile gutter" },
16
+ "md": { "$value": "1rem", "$description": "16px - standard gutter" },
17
+ "lg": { "$value": "1.5rem", "$description": "24px - spacious desktop gutter" },
18
+ "xl": { "$value": "2rem", "$description": "32px - wide layout gutter" }
19
+ },
20
+ "margin": {
21
+ "mobile": { "$value": "1rem", "$description": "16px page margin on mobile" },
22
+ "tablet": { "$value": "2rem", "$description": "32px page margin on tablet" },
23
+ "desktop": { "$value": "4rem", "$description": "64px page margin on desktop" },
24
+ "wide": { "$value": "auto", "$description": "Auto-center on wide screens" }
25
+ },
26
+ "maxWidth": {
27
+ "content": { "$value": "768px", "$description": "Max width for readable content" },
28
+ "container": { "$value": "1200px", "$description": "Max width for standard layouts" },
29
+ "wide": { "$value": "1440px", "$description": "Max width for wide layouts" },
30
+ "full": { "$value": "1920px", "$description": "Max width for full-bleed" }
31
+ }
32
+ }
33
+ }
34
+ }
@@ -0,0 +1,26 @@
1
+ {
2
+ "$description": "Citron border radius. Soft, premium — 14-16px for interactive elements, generously rounded surfaces.",
3
+ "inkblot": {
4
+ "radius": {
5
+ "$type": "dimension",
6
+ "$description": "Border radius scale — smooth, never sharp",
7
+ "none": { "$value": "0", "$description": "No rounding" },
8
+ "sm": { "$value": "6px", "$description": "Subtle rounding, chips" },
9
+ "md": { "$value": "10px", "$description": "Inputs, small cards" },
10
+ "lg": { "$value": "14px", "$description": "Buttons, interactive elements" },
11
+ "xl": { "$value": "18px", "$description": "Cards, modals" },
12
+ "2xl": { "$value": "24px", "$description": "Large surfaces, hero cards" },
13
+ "full": { "$value": "9999px", "$description": "Pills, avatars, toggles" }
14
+ },
15
+ "border": {
16
+ "$type": "dimension",
17
+ "$description": "Border widths — minimal, no heavy borders",
18
+ "width": {
19
+ "none": { "$value": "0", "$description": "No border" },
20
+ "thin": { "$value": "1px", "$description": "Subtle dividers, the default" },
21
+ "medium": { "$value": "2px", "$description": "Focus rings" },
22
+ "thick": { "$value": "3px", "$description": "Strong emphasis, rarely used" }
23
+ }
24
+ }
25
+ }
26
+ }
@@ -0,0 +1,41 @@
1
+ {
2
+ "$description": "Citron elevation. Warm, diffused shadows — like studio lighting on matte paper. No harsh depth.",
3
+ "inkblot": {
4
+ "shadow": {
5
+ "$type": "shadow",
6
+ "$description": "Box shadows — warm-tinted, diffused. Cards should feel like floating matte paper.",
7
+ "none": {
8
+ "$value": "none",
9
+ "$description": "No shadow"
10
+ },
11
+ "xs": {
12
+ "$value": "0 1px 2px 0 rgba(29, 28, 25, 0.04)",
13
+ "$description": "Barely there lift"
14
+ },
15
+ "sm": {
16
+ "$value": "0 2px 8px -1px rgba(29, 28, 25, 0.06), 0 1px 3px -1px rgba(29, 28, 25, 0.04)",
17
+ "$description": "Cards — soft, warm, diffused"
18
+ },
19
+ "md": {
20
+ "$value": "0 4px 16px -2px rgba(29, 28, 25, 0.08), 0 2px 6px -2px rgba(29, 28, 25, 0.04)",
21
+ "$description": "Elevated cards, dropdowns"
22
+ },
23
+ "lg": {
24
+ "$value": "0 8px 24px -4px rgba(29, 28, 25, 0.10), 0 4px 10px -4px rgba(29, 28, 25, 0.04)",
25
+ "$description": "Modals, popovers"
26
+ },
27
+ "xl": {
28
+ "$value": "0 16px 40px -8px rgba(29, 28, 25, 0.12), 0 8px 16px -8px rgba(29, 28, 25, 0.04)",
29
+ "$description": "Maximum elevation — ambient, not harsh"
30
+ }
31
+ },
32
+ "opacity": {
33
+ "$type": "number",
34
+ "$description": "Opacity scale",
35
+ "disabled": { "$value": 0.4, "$description": "Disabled elements" },
36
+ "overlay": { "$value": 0.45, "$description": "Modal backdrops — not too heavy" },
37
+ "subtle": { "$value": 0.6, "$description": "Secondary content" },
38
+ "default": { "$value": 1, "$description": "Full opacity" }
39
+ }
40
+ }
41
+ }
@@ -0,0 +1,38 @@
1
+ {
2
+ "$description": "Inkblot Studio spacing scale. 4pt base grid for pixel-perfect alignment.",
3
+ "inkblot": {
4
+ "spacing": {
5
+ "$type": "dimension",
6
+ "$description": "Spacing scale - 4pt base unit",
7
+ "0": { "$value": "0", "$description": "No spacing" },
8
+ "1": { "$value": "0.25rem", "$description": "4px" },
9
+ "2": { "$value": "0.5rem", "$description": "8px" },
10
+ "3": { "$value": "0.75rem", "$description": "12px" },
11
+ "4": { "$value": "1rem", "$description": "16px" },
12
+ "5": { "$value": "1.25rem", "$description": "20px" },
13
+ "6": { "$value": "1.5rem", "$description": "24px" },
14
+ "8": { "$value": "2rem", "$description": "32px" },
15
+ "10": { "$value": "2.5rem", "$description": "40px" },
16
+ "12": { "$value": "3rem", "$description": "48px" },
17
+ "16": { "$value": "4rem", "$description": "64px" },
18
+ "20": { "$value": "5rem", "$description": "80px" },
19
+ "24": { "$value": "6rem", "$description": "96px" },
20
+ "32": { "$value": "8rem", "$description": "128px" }
21
+ },
22
+ "size": {
23
+ "$type": "dimension",
24
+ "$description": "Component sizing - icons, touch targets",
25
+ "icon": {
26
+ "xs": { "$value": "1rem", "$description": "16px icon" },
27
+ "sm": { "$value": "1.25rem", "$description": "20px icon" },
28
+ "md": { "$value": "1.5rem", "$description": "24px icon" },
29
+ "lg": { "$value": "2rem", "$description": "32px icon" },
30
+ "xl": { "$value": "2.5rem", "$description": "40px icon" }
31
+ },
32
+ "touchTarget": {
33
+ "min": { "$value": "44px", "$description": "Minimum touch target (WCAG)" },
34
+ "comfortable": { "$value": "48px", "$description": "Comfortable touch target" }
35
+ }
36
+ }
37
+ }
38
+ }
@@ -0,0 +1,60 @@
1
+ {
2
+ "$description": "Citron typography. Modern humanist sans-serif. Clear hierarchy through spacing and weight, not size extremes.",
3
+ "inkblot": {
4
+ "typography": {
5
+ "$type": "fontFamily",
6
+ "$description": "Font families — humanist sans-serif for warmth and readability",
7
+ "fontFamily": {
8
+ "sans": {
9
+ "$value": "'Inter', 'SF Pro Text', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",
10
+ "$description": "Primary UI font — humanist, modern, highly legible"
11
+ },
12
+ "mono": {
13
+ "$value": "'JetBrains Mono', 'SF Mono', ui-monospace, Menlo, Consolas, monospace",
14
+ "$description": "Code and data"
15
+ },
16
+ "display": {
17
+ "$value": "'Inter', 'SF Pro Display', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif",
18
+ "$description": "Headlines — same family, optical size variant"
19
+ }
20
+ },
21
+ "fontSize": {
22
+ "$type": "dimension",
23
+ "$description": "Type scale — restrained, intentional. No oversized dramatic headings.",
24
+ "xs": { "$value": "0.75rem", "$description": "12px — captions, meta" },
25
+ "sm": { "$value": "0.8125rem", "$description": "13px — secondary text" },
26
+ "base": { "$value": "0.9375rem", "$description": "15px — body text, slightly refined from 16" },
27
+ "md": { "$value": "1.0625rem", "$description": "17px — emphasized body" },
28
+ "lg": { "$value": "1.25rem", "$description": "20px — card titles, subheadings" },
29
+ "xl": { "$value": "1.5rem", "$description": "24px — section titles" },
30
+ "2xl": { "$value": "1.75rem", "$description": "28px — page titles" },
31
+ "3xl": { "$value": "2.125rem", "$description": "34px — hero — composed, not shouting" },
32
+ "4xl": { "$value": "2.75rem", "$description": "44px — display, rarely used" },
33
+ "5xl": { "$value": "3.25rem", "$description": "52px — maximum display" }
34
+ },
35
+ "fontWeight": {
36
+ "$type": "fontWeight",
37
+ "regular": { "$value": "400", "$description": "Body text" },
38
+ "medium": { "$value": "500", "$description": "Emphasis, labels, card titles" },
39
+ "semibold": { "$value": "600", "$description": "Headings, buttons" },
40
+ "bold": { "$value": "700", "$description": "Strong emphasis, sparingly" }
41
+ },
42
+ "lineHeight": {
43
+ "$type": "number",
44
+ "tight": { "$value": 1.2, "$description": "Headlines" },
45
+ "snug": { "$value": 1.375, "$description": "Subheadings" },
46
+ "normal": { "$value": 1.5, "$description": "Body text" },
47
+ "relaxed": { "$value": 1.65, "$description": "Long-form, generous breathing room" },
48
+ "loose": { "$value": 1.8, "$description": "Very spacious" }
49
+ },
50
+ "letterSpacing": {
51
+ "$type": "dimension",
52
+ "tighter": { "$value": "-0.04em", "$description": "Large headlines" },
53
+ "tight": { "$value": "-0.02em", "$description": "Headings" },
54
+ "normal": { "$value": "0", "$description": "Body" },
55
+ "wide": { "$value": "0.02em", "$description": "Labels" },
56
+ "wider": { "$value": "0.06em", "$description": "Uppercase meta" }
57
+ }
58
+ }
59
+ }
60
+ }
@@ -0,0 +1,19 @@
1
+ {
2
+ "$description": "Inkblot Studio z-index hierarchy. Predictable layering for all UI surfaces.",
3
+ "inkblot": {
4
+ "zIndex": {
5
+ "$type": "number",
6
+ "$description": "Z-index layering scale. Never use arbitrary z-index values.",
7
+ "hide": { "$value": -1, "$description": "Hidden below base layer" },
8
+ "base": { "$value": 0, "$description": "Default document flow" },
9
+ "raised": { "$value": 1, "$description": "Slightly above base (cards on hover)" },
10
+ "dropdown": { "$value": 10, "$description": "Dropdowns, select menus" },
11
+ "sticky": { "$value": 20, "$description": "Sticky headers, nav bars" },
12
+ "overlay": { "$value": 30, "$description": "Backdrop overlays" },
13
+ "modal": { "$value": 40, "$description": "Modals, dialogs, sheets" },
14
+ "popover": { "$value": 50, "$description": "Popovers, tooltips" },
15
+ "toast": { "$value": 60, "$description": "Toast notifications" },
16
+ "max": { "$value": 9999, "$description": "Emergency override (avoid)" }
17
+ }
18
+ }
19
+ }