Dynamic class injection before client rendering.
Fast and efficient dynamic CSS class injection. CSS classes are injected into the
<html />
component before rendering avoiding flashing on client load.
<html />
tag before browser rendering You can see this module in action by using the customize button at the top right of this page.
Add the nuxt-class-inject dependency to your project.
yarn add --dev nuxt-class-inject
Then add nuxt-class-inject to the modules section of your nuxt.config.ts
ts
nuxt.config.ts
export default defineNuxtConfig({
modules: [
"nuxt-class-inject",
],
});
example
The injected classList can be accessed through $classInject directly. This helper has two properties:
unknown: a boolean value, true if the classList is unknown, false otherwise. classList: the list of injected classes, update it to change injected classes. vue
app.vue
<template>
<div>
<button
v-for="theme in themes"
@click="setTheme(theme)"
>
{{ theme }}
</button>
</div>
</template>
<script setup lang="ts">
const { $classInject } = useNuxtApp();
const themes: string[] = ["theme-light", "theme-dark"];
const setTheme = (theme: string) => {
const current: string[] = $classInject.classList.value;
const classList = current.filter((cls) => {
return !cls.startsWith("theme-")
});
classList.push(theme);
$classInject.classList.value = classList;
};
</script>
<style lang="css">
.theme-light {
background-color: #1e1e1e;
color: #fefefe;
}
.theme-dark {
background-color: #fefefe;
color: #1e1e1e;
}
</style>
You can configure the module through the classInject property in your nuxt.config.js. The default options are
ts
nuxt.config.js
export default defineNuxtConfig {
modules: ["nuxt-class-inject",],
classInject: {
storageKey: "nuxt-class-inject",
globalName: "__NUXT_CLASS_INJECT__",
fallback: [""],
},
}
The config options are:
storageKey: the storage key used to store injected classes in the browser‘s local storage globalName: the global name used by the module which is used to inject JavaScript into the windowfallback: the classes to inject in case no classes are found in local storage example
To work with Tailwind CSS change your CSS classes to change the value of variables:
vue
app.vue
<style lang="css">
.theme-light {
--foreground: #1e1e1e;
--background: #fefefe;
}
.theme-dark {
--foreground: #fefefe;
--background: #1e1e1e;
}
</style>
Then register thos variables in the tailwind.config.js file:
js
tailwind.config.js
/** @type {import('tailwindcss').Config} */
export default {
theme: {
extend: {
colors: {
foreground: "var(--foreground)",
background: "var(--background)",
},
},
},
};
There are a couple of things to keep in mind when using this module.
classList is a WriteableComputedRef<string[]> so that the only way of upating the value is by overwriting it. This is done because vue‘s reactivity for arrays works on property access and assignment and not internal array modifications. The correct manner of updating classList list is as follows: vue
const classList: string[] = $classInject.classList.value;
// make changes to classList
$classInject.classList.value = classList;
This module is “heavily inspired” by the nuxt-color-mode module. i.e. I comlpetely ripped it off, altered it slightly to better suit my needs, and called it my own.