1.5.17 • Published 2 years ago

@quak.lib/qtheme v1.5.17

Weekly downloads
-
License
MIT
Repository
github
Last release
2 years ago

Qtheme

Quick links:

~5kb.js, 0 dependencies, fast, fully typed and production-ready css-in-js library for managing themes in your app. Create multiple themes and switch between them with Qtheme.setTheme(theme)

Qtheme lets you:

  • Create infinite number of themes
  • Switch between them easily
  • Set common theme atoms for all themes
  • Initialize already chosen theme on app start
  • Generate CSS classes for you, so you don't have to write it by yourself

React Quick example:

import {Qtheme} from '@quak.lib/qtheme'
import {darkTheme, lightTheme} from './your-themes'

function App() {
  useEffect(() => {
    // Try to initialize theme from localStorage else lightTheme
    Qtheme.init(lightTheme)
  }, [])
  return (
    <div class="bg-color text-color">
      <h1 class="text-primary">Hello world!</h1>
      <p>This is regular text color</p>
      <button onclick={() => Qtheme.setTheme(darkTheme)}>Dark theme</button>
    </div>
  )
}

Angular Quick example:

import {Qtheme} from '@quak.lib/qtheme'
import {darkTheme, lightTheme} from './your-themes'

@Component({
  ..., // selector, stylesUrl,
  template: `<div class="bg-color text-color">
    <h1 class="text-primary">Hello world!</h1>
    <p>This is regular text color</p>
    <button (click)="setDarkTheme()">Dark theme</button>
  </div>`
})
class AppComponent {
  constructor() {
    // Try to initialize theme from localStorage else lightTheme
    Qtheme.init(lightTheme)
  }
  setDarkTheme() {
    Qtheme.setTheme(darkTheme)
  }
}
npm install @quak.lib/qtheme

Documentation & Examples

Documentation with getting started, examples and API reference.

Examples repository

Will work with vanilla JS if supports import/export. (eg. with Vite builder)

Qtheme has separate GitHub repo with examples for:

What is Qtheme?

Import Qtheme

import {Qtheme, Theme, CSSProps} from '@quak.lib/qtheme'

Declare light theme (override atoms in dark/each theme)

const lightTheme: Theme = {
  name: 'light',
  atoms: [
    // SIMPLE ATOMS
    // generates --primary: dodgerblue
    ['primary', 'dodgerblue'],
    
    // COMPOUND ATOMS
    // generates CSS class .btn + .btn:hover 
    // can be ::after, ::before, :focus, etc.
    ['btn', btn],
    ['btn:hover', btnHover],
      
    // ATOMS WITH CSS CLASSES  
    // generates --bg-color: hsl(0, 0%, 100%) 
    // + .bg-color { background-color: var(--bg-color) }
    ['bg-color', 'background-color:hsl(0, 0%, 100%)'],
    ['text-color', 'color:black'],
    ['text-primary', 'color:var(--primary)']
  ] 
}

Initialize lightTheme at app start

Qtheme.setTheme(lightTheme)

// Try to initialize theme from localStorage else lightTheme
Qtheme.init(lightTheme)

Once you initialized atoms you can use class="bg-color" to set background color or class="text-primary" to set primary text color, etc.

<body class="bg-color text-color">
  <h1 class="text-primary">Hello world!</h1>
  <p>This is regular text color</p>
  <btn class="btn">Action</btn>
</body>

Change theme with Qtheme.setTheme(theme).

// btn, btnHover from previous examples
const darkTheme: Theme = {
  name: 'dark',
  atoms: [
    ['primary', 'red'],
    ['btn', btn],
    ['btn:hover', btnHover],
    ['bg-color', 'background-color:hsl(0, 0%, 0%)'],
    ['text-color', 'color:white'],
    ['text-primary', 'color:var(--primary)']
  ]
}

Qtheme.setTheme(darkTheme)

How to declare CSSProps for .btn and .btn:hover

const btn: CSSProps = {
  'text-align': 'center', // simple strings for any CSS you need
  backgroundColor: 'var(--primary)', // or use intelisense   
  color: 'var(--primary-content)',
  fontWeight: 900
}
const btnHover: CSSProps = {
  borderStyle: 'inset',
  cursor: 'pointer'
}

API

You will find all information about Qtheme theming API in Qtheme Docs - API

License

MIT LICENSE

Made & maintained with ❤️ by QUAK

1.5.16

2 years ago

1.5.17

2 years ago

1.5.5

2 years ago

1.5.4

2 years ago

1.5.10

2 years ago

1.5.12

2 years ago

1.5.11

2 years ago

1.5.14

2 years ago

1.5.13

2 years ago

1.5.15

2 years ago

1.5.9

2 years ago

1.5.8

2 years ago

1.5.7

2 years ago

1.5.6

2 years ago

1.5.3

2 years ago

1.5.2

2 years ago

1.5.1

2 years ago

1.5.0

2 years ago

1.4.1

2 years ago

1.4.0

2 years ago

1.3.5

2 years ago

1.3.4

2 years ago

1.3.3

2 years ago

1.3.2

2 years ago

1.3.1

2 years ago

1.3.0

2 years ago

1.2.9

2 years ago

1.2.8

2 years ago

1.2.7

2 years ago

1.2.6

2 years ago

1.2.5

2 years ago

1.2.4

2 years ago

1.2.3

2 years ago

1.2.2

2 years ago

1.2.1

2 years ago

1.2.0

2 years ago

1.1.10

2 years ago

1.0.9

2 years ago

1.0.8

2 years ago

1.0.7

2 years ago

1.0.6

2 years ago

1.0.5

2 years ago

1.0.4

2 years ago

1.0.3

2 years ago

1.0.2

2 years ago

1.0.1

2 years ago

1.0.0

2 years ago