Open Props
Type-safe access to Open Props CSS custom properties
Open Props is a collection of expertly crafted CSS design tokens. This package provides type-safe access to all Open Props tokens directly in TypeScript.
Installation
bash
npm install @typestyles/open-props
Quick Start
ts
import { styles } from 'typestyles';
import { sizes, radius, color, font } from '@typestyles/open-props';
const card = styles.component('card', {
padding: sizes['4'],
borderRadius: radius['3'],
backgroundColor: color['gray-2'],
fontFamily: font['sans'],
});
All tokens return var(--token-name) references that work seamlessly with typestyles.
Available Tokens
Sizes
Spacing and sizing tokens for layout:
ts
sizes['0']; // var(--size-0)
sizes['1']; // var(--size-1)
sizes['2']; // var(--size-2)
sizes['3']; // var(--size-3)
sizes['4']; // var(--size-4)
// ... up to sizes['10']
// Fluid sizes
sizes['fluid-1']; // var(--size-fluid-1)
sizes['fluid-2']; // var(--size-fluid-2)
sizes['fluid-3']; // var(--size-fluid-3)
// Content sizes
sizes['content-1']; // 20ch
sizes['content-2']; // 45ch
sizes['content-3']; // 60ch
Radius
Border radius tokens:
ts
radius['0']; // var(--radius-0)
radius['1']; // var(--radius-1)
radius['2']; // var(--radius-2)
radius['3']; // var(--radius-3)
radius['4']; // var(--radius-4)
// ... up to radius['30']
// Special values
radius['round']; // 100%
radius['pill']; // 9999px
Colors
19 color scales with 13 shades each (0-12):
ts
// Access by color name and shade
color['gray-0']; // var(--color-gray-0)
color['gray-5']; // var(--color-gray-5)
color['gray-10']; // var(--color-gray-10)
color['indigo-0']; // var(--color-indigo-0)
color['blue-6']; // var(--color-blue-6)
color['red-4']; // var(--color-red-4)
Available color palettes:
gray,stone,red,pink,purple,violet,indigo,bluecyan,teal,green,lime,yellow,orangechoco,brown,sand,camo,jungle
Typography
ts
// Font sizes
fontSize['00']; // 0.5rem
fontSize['0']; // 0.75rem
fontSize['1']; // 1rem
fontSize['2']; // 1.1rem
// ... up to fontSize['8']
// Fluid font sizes
fontSize['fluid-0']; // clamp(0.75rem, 2vw, 1rem)
fontSize['fluid-1']; // clamp(1rem, 4vw, 1.5rem)
fontSize['fluid-2']; // clamp(1.5rem, 6vw, 2.5rem)
fontSize['fluid-3']; // clamp(2rem, 9vw, 3.5rem)
// Font weights
fontWeight['1']; // 100
fontWeight['4']; // 400
fontWeight['7']; // 700
fontWeight['9']; // 900
// Letter spacing
fontLetterspacing['0']; // -.05em
fontLetterspacing['4']; // .150em
// Line height
fontLineheight['00']; // .95
fontLineheight['1']; // 1.25
fontLineheight['3']; // 1.5
// Font families
font['sans']; // var(--font-sans)
font['serif']; // var(--font-serif)
font['mono']; // var(--font-mono)
font['system-ui']; // var(--font-system-ui)
font['humanist']; // var(--font-humanist)
// ... and more
Shadows
ts
shadow['1']; // var(--shadow-1)
shadow['2']; // var(--shadow-2)
shadow['3']; // var(--shadow-3)
shadow['4']; // var(--shadow-4)
shadow['5']; // var(--shadow-5)
shadow['6']; // var(--shadow-6)
// Inner shadows
shadow['inner-1']; // var(--shadow-inner-1)
shadow['inner-2']; // var(--shadow-inner-2)
shadow['inner-3']; // var(--shadow-inner-3)
shadow['inner-4']; // var(--shadow-inner-4)
shadow['inner-5']; // var(--shadow-inner-5)
Gradients
30 handcrafted gradients:
ts
gradient['1']; // var(--gradient-1)
gradient['10']; // var(--gradient-10)
gradient['20']; // var(--gradient-20)
gradient['30']; // var(--gradient-30)
Easing
CSS easing functions:
ts
easing['1']; // var(--ease-1)
easing['2']; // var(--ease-2)
easing['3']; // var(--ease-3)
// Directional
easing['in-1']; // var(--ease-in-1)
easing['out-1']; // var(--ease-out-1)
easing['in-out-1']; // var(--ease-in-out-1)
// Elastic
easing['elastic-out-1']; // var(--ease-elastic-out-1)
easing['elastic-in-1']; // var(--ease-elastic-in-1)
// Bounce
easing['bounce-1']; // var(--ease-bounce-1)
Animations
Pre-defined animation names:
ts
animation['fade-in']; // var(--animation-fade-in)
animation['slide-in-up']; // var(--animation-slide-in-up)
animation['scale-in']; // var(--animation-scale-in)
animation['spin']; // var(--animation-spin)
animation['pulse']; // var(--animation-pulse)
// ... and more
Media Queries
Media query conditions for responsive design:
ts
media['motion']; // var(--media-motion)
media['motionReduce']; // var(--media-motionReduce)
media['dark']; // var(--media-dark)
media['light']; // var(--media-light)
media['landscape']; // var(--media-landscape)
media['portrait']; // var(--media-portrait)
// Breakpoints
media['sm']; // var(--media-sm) - 24rem
media['md']; // var(--media-md) - 28rem
media['lg']; // var(--media-lg) - 32rem
media['xl']; // var(--media-xl) - 36rem
media['2xl']; // var(--media-2xl) - 42rem
// ... up to media['9xl']
Other Tokens
ts
// Aspect ratios
ratio['square']; // var(--ratio-square)
ratio['landscape']; // var(--ratio-landscape)
ratio['portrait']; // var(--ratio-portrait)
ratio['widescreen']; // var(--ratio-widescreen)
ratio['golden']; // var(--ratio-golden)
// Z-index layers
zIndex['1']; // var(--zindex-1)
zIndex['max']; // var(--zindex-max)
// Durations
duration['0']; // 0s
duration['1']; // 0.05s
duration['2']; // 0.1s
duration['3']; // 0.2s
duration['4']; // 0.4s
duration['5']; // 0.8s
// Border widths
borderSize['0']; // 0
borderSize['1']; // 1px
borderSize['2']; // 2px
// ... and more
Brand Colors
Brand-specific colors for common services:
ts
brand['facebook']; // var(--brand-facebook)
brand['twitter']; // var(--brand-twitter)
brand['instagram']; // var(--brand-instagram)
brand['youtube']; // var(--brand-youtube)
brand['spotify']; // var(--brand-spotify)
brand['discord']; // var(--brand-discord)
// ... and more
Palette
Dynamic OKLCH palette for creating custom color schemes:
ts
palette['1']; // var(--palette-1)
palette['8']; // var(--palette-8)
palette['16']; // var(--palette-16)
Masks
SVG mask presets:
ts
masksEdges['0']; // var(--masks-edge-0)
masksEdges['4']; // var(--masks-edge-4)
masksCornerCuts['1']; // var(--masks-corner-cuts-1)
masksCornerCuts['6']; // var(--masks-corner-cuts-6)
Using with Styles
All tokens work seamlessly with typestyles:
ts
import { styles } from 'typestyles';
import { sizes, radius, color, shadow, fontSize } from '@typestyles/open-props';
const button = styles.component('button', {
display: 'inline-flex',
alignItems: 'center',
justifyContent: 'center',
padding: `${sizes['2']} ${sizes['4']}`,
borderRadius: radius['2'],
fontSize: fontSize['2'],
backgroundColor: color['blue-6'],
color: color['blue-0'],
boxShadow: shadow['2'],
transition: 'all 200ms var(--ease-2)',
'&:hover': {
boxShadow: shadow['3'],
backgroundColor: color['blue-5'],
},
});
Combining with Custom Tokens
You can mix Open Props with your own custom tokens:
ts
import { tokens } from 'typestyles';
import { color, sizes } from '@typestyles/open-props';
// Your custom tokens
const brand = tokens.create('brand', {
primary: '#ff6b6b',
accent: '#4ecdc4',
});
// Use both together
const container = styles.component('container', {
backgroundColor: brand.primary, // var(--brand-primary)
padding: sizes['4'], // var(--size-4)
borderColor: color['gray-3'], // var(--color-gray-3)
});