Your brand. Your theme.
Turn your brand color into a complete light and dark theme. Try it on real PyColors components, then take the tokens into your app.
Theme workspace
Customize, preview, export.
Northstar
Avery's workspace
Workspace Overview
Dashboard
Your team's delivery, capacity, and upcoming work.
Active projects
12
+2 this month
3 shipping this week
Completed tasks
148
+17.5% vs previous
Last 7 days
Team capacity
86%
4 seats available
8 active team members
Delivery health
98%
+4% this month
Milestones delivered on time
Delivery activity
Completed tasks · last 7 days
Upcoming milestones
What needs your attention next.
- TomorrowReview
Platform handoff
Atlas platform
- In 2 daysAt risk
Launch readiness
Pulse launch
- In 3 daysOn track
Onboarding release
Orbit onboarding
Delivery board
Recent projects across your workspace.
| Project | Status | Owner | Progress | Due |
|---|---|---|---|---|
Orbit onboarding Orbit Labs | On track | Avery Kim | 28 of 36 tasks78% | In 3 days |
Atlas platform Atlas Finance | In review | Sam Patel | 46 of 50 tasks92% | Tomorrow |
Pulse launch Pulse Health | At risk | Morgan Lee | 18 of 40 tasks45% | In 2 days |
Nova design system Nova Studio | On track | Jordan Chen | 16 of 25 tasks64% | Next week |
Live activity
Sam Patel requested a review
Atlas platform
12 min ago
Avery Kim completed 4 tasks
Orbit onboarding
38 min ago
Morgan Lee updated the timeline
Pulse launch
1 hour ago
Jordan Chen published new components
Nova design system
2 hours ago
Component states · Forms, empty states, and focus
Form validation
Test field labels, errors, and helper text.
Use a public hostname before inviting clients.
Empty state
Test quiet surfaces without losing hierarchy.
No pending reviews
New client feedback will appear here.
Focus-ready action
Test the visible keyboard focus treatment.
Usage update
Color readabilityChecks text, field outlines, and keyboard focus in light and dark mode.6 checks need review
28 of 34 checks meet their contrast target.
Contrast is how much text or a control stands out from its background. The items below may be harder to read or find. Review them before using this theme.
Light mode
15 passed · 2 to review
Component borders
Check borders that identify interactive controls. Decorative dividers can stay subtle.
Input field outlines
Fields may blend into the page. Strengthen the outline if it is needed to identify the field.
Dark mode
13 passed · 4 to review
Text on destructive buttons
This text may be hard to read. Increase the difference between the text color and its background.
Keyboard focus outline
The active control may be hard to spot when using a keyboard. Increase the contrast of its focus outline.
Component borders
Check borders that identify interactive controls. Decorative dividers can stay subtle.
Input field outlines
Fields may blend into the page. Strengthen the outline if it is needed to identify the field.
Try another preset to compare. For precise adjustments, edit the CSS variables listed below after export. This checks generated colors, not every state of your interface. Review actual text, hover, disabled, and keyboard focus states in your app.
Technical details
A higher ratio means more contrast. Each row shows the measured ratio and its target for that use. These results describe the exported colors; they do not certify a complete interface as accessible.
Component borders · Light
--border / --background
Measured 1.96:1 · Target 3:1
Input field outlines · Light
--input / --background
Measured 1.96:1 · Target 3:1
Text on destructive buttons · Dark
--destructive-foreground / --destructive
Measured 2.75:1 · Target 4.5:1
Keyboard focus outline · Dark
--ring / --background
Measured 2.89:1 · Target 3:1
Component borders · Dark
--border / --background
Measured 1.64:1 · Target 3:1
Input field outlines · Dark
--input / --background
Measured 1.64:1 · Target 3:1
Automatic color adjustments
- A neutral scale was generated from your brand.
- A color was refined to display reliably. Applied in light mode.
- Text color was strengthened for readability. Applied in light mode.
- Text color was strengthened for readability. Applied in light mode.
- A color was refined to display reliably. Applied in dark mode.
- Text color was strengthened for readability. Applied in dark mode.
Export your theme
Color tokens for both modes, with separate typography CSS. Copy or download your files. Nothing is uploaded.
CSS variables for :root and .dark. Paste after your PyColors token import.
Integration checklist
- 1Keep the PyColors token import in your global stylesheet.
- 2Paste the generated override after that import so it wins predictably.
- 3Review one light and one dark product screen before committing.
CSS
Complete output for light and dark modes.
:root {
--background: #fafafa;
--background: oklch(0.9851 0.0000 0.00);
--foreground: #121116;
--foreground: oklch(0.1800 0.0113 291.61);
--card: #f2f1f8;
--card: oklch(0.9600 0.0095 291.61);
--card-foreground: #121116;
--card-foreground: oklch(0.1800 0.0113 291.61);
--popover: #f2f1f8;
--popover: oklch(0.9600 0.0095 291.61);
--popover-foreground: #121116;
--popover-foreground: oklch(0.1800 0.0113 291.61);
--primary: #6a30d4;
--primary: oklch(0.4904 0.2293 291.61);
--primary-foreground: #fcfbff;
--primary-foreground: oklch(0.9900 0.0051 291.61);
--secondary: #e3e2eb;
--secondary: oklch(0.9151 0.0120 291.61);
--secondary-foreground: #121116;
--secondary-foreground: oklch(0.1800 0.0113 291.61);
--muted: #e3e2eb;
--muted: oklch(0.9151 0.0120 291.61);
--muted-foreground: #121116;
--muted-foreground: oklch(0.1800 0.0113 291.61);
--accent: #e3e0f3;
--accent: oklch(0.9151 0.0252 291.61);
--accent-foreground: #121116;
--accent-foreground: oklch(0.1800 0.0113 291.61);
--destructive: #e40016;
--destructive: oklch(0.5770 0.2354 27.32);
--destructive-foreground: #fafafa;
--destructive-foreground: oklch(0.9850 0.0000 0.00);
--success: #16a34a;
--success: oklch(0.6271 0.1699 149.21);
--success-foreground: #09120b;
--success-foreground: oklch(0.1700 0.0200 152.00);
--warning: #e5c057;
--warning: oklch(0.8200 0.1300 90.00);
--warning-foreground: #201a09;
--warning-foreground: oklch(0.2200 0.0300 90.00);
--border: #b6b4c0;
--border: oklch(0.7752 0.0170 291.61);
--border-subtle: #ceccd7;
--border-subtle: oklch(0.8501 0.0145 291.61);
--border-strong: #838190;
--border-strong: oklch(0.6103 0.0220 291.61);
--input: #b6b4c0;
--input: oklch(0.7752 0.0170 291.61);
--ring: #6a30d4;
--ring: oklch(0.4904 0.2293 291.61);
--surface: #fcfbff;
--surface: oklch(0.9900 0.0051 291.61);
--surface-foreground: #121116;
--surface-foreground: oklch(0.1800 0.0113 291.61);
--surface-muted: #f2f1f8;
--surface-muted: oklch(0.9600 0.0095 291.61);
--surface-elevated: #f2f1f8;
--surface-elevated: oklch(0.9600 0.0095 291.61);
--surface-inverted: #121116;
--surface-inverted: oklch(0.1800 0.0113 291.61);
--surface-inverted-foreground: #fcfbff;
--surface-inverted-foreground: oklch(0.9900 0.0051 291.61);
}
.dark {
--background: #060508;
--background: oklch(0.1200 0.0075 291.61);
--foreground: #f5f4fc;
--foreground: oklch(0.9700 0.0113 291.61);
--card: #0d0c10;
--card: oklch(0.1570 0.0095 291.61);
--card-foreground: #f5f4fc;
--card-foreground: oklch(0.9700 0.0113 291.61);
--popover: #0d0c10;
--popover: oklch(0.1570 0.0095 291.61);
--popover-foreground: #f5f4fc;
--popover-foreground: oklch(0.9700 0.0113 291.61);
--primary: #6a30d4;
--primary: oklch(0.4904 0.2293 291.61);
--primary-foreground: #f5f4fc;
--primary-foreground: oklch(0.9700 0.0113 291.61);
--secondary: #17161c;
--secondary: oklch(0.2052 0.0120 291.61);
--secondary-foreground: #f5f4fc;
--secondary-foreground: oklch(0.9700 0.0113 291.61);
--muted: #17161c;
--muted: oklch(0.2052 0.0120 291.61);
--muted-foreground: #f5f4fc;
--muted-foreground: oklch(0.9700 0.0113 291.61);
--accent: #1a093b;
--accent: oklch(0.2052 0.0894 291.61);
--accent-foreground: #f5f4fc;
--accent-foreground: oklch(0.9700 0.0113 291.61);
--destructive: #ff6568;
--destructive: oklch(0.7040 0.1877 22.22);
--destructive-foreground: #fafafa;
--destructive-foreground: oklch(0.9850 0.0000 0.00);
--success: #22c55e;
--success: oklch(0.7227 0.1920 149.58);
--success-foreground: #040b06;
--success-foreground: oklch(0.1400 0.0200 152.00);
--warning: #e5c057;
--warning: oklch(0.8200 0.1300 90.00);
--warning-foreground: #201a09;
--warning-foreground: oklch(0.2200 0.0300 90.00);
--border: #35333d;
--border: oklch(0.3274 0.0170 291.61);
--border-subtle: #25242c;
--border-subtle: oklch(0.2645 0.0145 291.61);
--border-strong: #514f5d;
--border-strong: oklch(0.4349 0.0220 291.61);
--input: #35333d;
--input: oklch(0.3274 0.0170 291.61);
--ring: #6a30d4;
--ring: oklch(0.4904 0.2293 291.61);
--surface: #060508;
--surface: oklch(0.1200 0.0075 291.61);
--surface-foreground: #f5f4fc;
--surface-foreground: oklch(0.9700 0.0113 291.61);
--surface-muted: #0d0c10;
--surface-muted: oklch(0.1570 0.0095 291.61);
--surface-elevated: #0d0c10;
--surface-elevated: oklch(0.1570 0.0095 291.61);
--surface-inverted: #f5f4fc;
--surface-inverted: oklch(0.9700 0.0113 291.61);
--surface-inverted-foreground: #060508;
--surface-inverted-foreground: oklch(0.1200 0.0075 291.61);
}
Typography
Mona Sans · Copy separately from your color tokens.
Save the font in public/fonts/Mona-Sans.var.woff2, then add this CSS after your token imports. Download font
View typography CSS
/* Save the font file to public/fonts/Mona-Sans.var.woff2 first. */
@font-face {
font-family: "Mona Sans";
src: url("/fonts/Mona-Sans.var.woff2") format("woff2");
font-style: normal;
font-weight: 200 900;
font-display: swap;
}
:root {
--font-sans: "Mona Sans", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
--font-brand: var(--font-sans);
}
body {
font-family: var(--font-sans);
}
From preview to product
Make it part of your app.
- Install
@pycolors/tokensand import@pycolors/tokens/tokens.cssonce in your global stylesheet. - Paste your generated overrides after that import. Keep the existing Tailwind v4
@theme inlinebridge. - Use semantic utilities and public
@pycolors/uiimports, then check your screens in both modes.
Before you ship
Review it in context.
Theme Builder is contrast-aware, not an accessibility certification. Review generated values in the real interface before shipping.
- Brand perception across your product and audience.
- Complete component and page context.
- Color-vision deficiencies and non-color cues.
- States communicated only by color.
- Real focus, hover, and disabled contexts.