Particular.Tech

Colors

Every token is an OKLCH CSS variable, defined once in lib/theme/tokens.ts and published as @particular/theme. Use them through Tailwind: bg-brand, text-success, bg-warning-subtle.

Surfaces

Cool neutrals (hue 264) with just enough chroma to feel deliberate next to the brand violet.

--background
oklch(0.995 0.002 264)
oklch(0.145 0.008 264)
--foreground
oklch(0.18 0.014 264)
oklch(0.97 0.004 264)
--card
oklch(1 0 0)
oklch(0.175 0.009 264)
--card-foreground
oklch(0.18 0.014 264)
oklch(0.97 0.004 264)
--popover
oklch(1 0 0)
oklch(0.19 0.01 264)
--popover-foreground
oklch(0.18 0.014 264)
oklch(0.97 0.004 264)
--muted
oklch(0.962 0.005 264)
oklch(0.235 0.01 264)
--muted-foreground
oklch(0.49 0.016 264)
oklch(0.71 0.014 264)
--accent
oklch(0.95 0.007 264)
oklch(0.255 0.012 264)
--accent-foreground
oklch(0.2 0.016 264)
oklch(0.97 0.004 264)
--border
oklch(0.912 0.007 264)
oklch(1 0 0 / 9%)
--input
oklch(0.885 0.009 264)
oklch(1 0 0 / 14%)

Actions

Primary is near-black in light mode and near-white in dark mode. Brand is the Particular violet: focus rings, links, featured actions.

--primary
oklch(0.2 0.016 264)
oklch(0.96 0.004 264)
--primary-foreground
oklch(0.985 0.002 264)
oklch(0.18 0.014 264)
--secondary
oklch(0.962 0.005 264)
oklch(0.235 0.01 264)
--secondary-foreground
oklch(0.2 0.016 264)
oklch(0.97 0.004 264)
--brand
oklch(0.52 0.23 285)
oklch(0.72 0.16 285)
--brand-foreground
oklch(0.99 0.005 285)
oklch(0.16 0.03 285)
--brand-subtle
oklch(0.96 0.025 285)
oklch(0.24 0.06 285)
--ring
oklch(0.56 0.21 285)
oklch(0.68 0.18 285)

Semantic

Each tone has a strong color for text, icons, and dots, a foreground for text on the strong color, and a subtle tint for backgrounds.

--success
oklch(0.5 0.13 155)
oklch(0.76 0.15 155)
--success-foreground
oklch(0.99 0.01 155)
oklch(0.16 0.03 155)
--success-subtle
oklch(0.965 0.03 155)
oklch(0.23 0.045 155)
--warning
oklch(0.52 0.12 60)
oklch(0.8 0.14 75)
--warning-foreground
oklch(0.99 0.01 75)
oklch(0.18 0.03 75)
--warning-subtle
oklch(0.97 0.035 80)
oklch(0.24 0.045 75)
--info
oklch(0.5 0.15 245)
oklch(0.74 0.13 245)
--info-foreground
oklch(0.99 0.008 245)
oklch(0.16 0.03 245)
--info-subtle
oklch(0.965 0.02 245)
oklch(0.24 0.05 245)
--destructive
oklch(0.53 0.2 25)
oklch(0.7 0.17 22)
--destructive-foreground
oklch(0.99 0.005 25)
oklch(0.16 0.03 22)
--destructive-subtle
oklch(0.965 0.02 25)
oklch(0.24 0.06 22)

Charts

Five series colors harmonized with the brand and semantic hues.

--chart-1
oklch(0.56 0.21 285)
oklch(0.68 0.18 285)
--chart-2
oklch(0.66 0.13 200)
oklch(0.74 0.12 200)
--chart-3
oklch(0.64 0.15 155)
oklch(0.72 0.15 155)
--chart-4
oklch(0.75 0.15 75)
oklch(0.8 0.14 75)
--chart-5
oklch(0.62 0.2 350)
oklch(0.7 0.18 350)

Sidebar

A separate set so the app sidebar can sit one step off the page background.

--sidebar
oklch(0.982 0.004 264)
oklch(0.16 0.009 264)
--sidebar-foreground
oklch(0.18 0.014 264)
oklch(0.97 0.004 264)
--sidebar-primary
oklch(0.2 0.016 264)
oklch(0.72 0.16 285)
--sidebar-primary-foreground
oklch(0.985 0.002 264)
oklch(0.16 0.03 285)
--sidebar-accent
oklch(0.945 0.008 264)
oklch(0.235 0.012 264)
--sidebar-accent-foreground
oklch(0.2 0.016 264)
oklch(0.97 0.004 264)
--sidebar-border
oklch(0.912 0.007 264)
oklch(1 0 0 / 9%)
--sidebar-ring
oklch(0.56 0.21 285)
oklch(0.68 0.18 285)

Contrast

Every text pairing meets WCAG AA (4.5:1). A unit test computes these ratios from the OKLCH values and fails the build if one drops below.

light
18.518.818.817.316.26.25.66.315.65.96.05.45.75.85.25.55.55.15.55.65.25.75.75.3
dark
18.117.416.916.715.37.76.57.414.57.57.66.46.86.95.89.69.88.29.910.48.78.58.77.2