What is Pinceau?

Pinceau is a playful styling framework for your Vue components.

It offers incrementally adoptable solutions that integrates nicely with existing components.

The objective is to take all the <style> related logic out of your <script> tags.

What does it look like?

Pinceau usage flows around your tokens.config file.

In this file, you can store all your Design tokens, Media queries and Utils properties.

tokens.config.ts
import { defineTheme } from 'pinceau'defineTheme({  // Media queries  media: {    mobile: '(min-width: 320px)',    tablet: '(min-width: 768px)',    desktop: '(min-width: 1280px)'  },  // Some Design tokens  color: {    red: {      1: '#FCDFDA',      2: '#F48E7C',      3: '#ED4D31',      4: '#A0240E',      5: '#390D05',    },    green: {      1: '#CDF4E5',      2: '#9AE9CB',      3: '#36D397',      4: '#1B7D58',      5: '#072117',    }  },  space: {    1: '0.25rem',    2: '0.5rem',    3: '0.75rem',    4: '1rem'  },  // Utils properties  utils: {    px: (value: PropertyValue<'padding'>) => ({ paddingLeft: value, paddingRight: value }),    py: (value: PropertyValue<'padding'>) => ({ paddingTop: value, paddingBottom: value })  }})

Once defined, these tokens will then be accessible accross you app in multiple ways.

  • In CSS or PostCSS, JS, TS or <style> tags:
component.vue
<style lang="postcss">button {  padding: $dt('space.1') $dt('space.2');  background-color: $dt('red.1');  @dark {    background-color: $dt('red.5')  }  @desktop {    padding: $dt('space.2') $dt('space.4');  }}</style>
main.ts
const green500 = $dt('color.green.500');
  • Or even better, using the css() function in your <style lang="ts"> blocks:
<template>  <button class="my-button">    <slot />  </button></template><script setup>defineProps({  color: computedStyle<keyof PinceauTheme['color']>('green'),  ...variants})</script><style lang="ts">css({  '.my-button': {    px: '{space.4}',    color: 'white',    backgroundColor: (props) => `{color.${props.color}.4}`,  },  variants: {    size: {      sm: {        padding: '{space.2}'      },      md: {        padding: '{space.3}'      },      lg: {        padding: '{space.4}'      },      options: {        default: 'sm'      }    }  }})</style>

How does it work?

Pinceau is a Vite plugin that reads and transform your Vue components.

It also comes with a Nuxt module, that supports Nuxt Studio.

It starts with a configuration file, that supports:

Once you are all setup with your theme, you're all set to use the styling features: