Build Options
- Type:
BuildConfig
Confiure the build in your theemo.config.js.
import { defineConfig } from '@theemo/cli';
export default defineConfig({
build: {
// ...
}
});build.outDir
- Type:
string - Default:
dist
This is where files will be build into.
build.files
- Type:
string[] - Default:
[]
The files that will be concatenated into the output file.
build.features
- Type:
BuildFeature[] - Default:
[] - Related: Features
When your theme supports features, you describe them here so they can be created appropriately.
Color Scheme
Color Scheme is supported by browser mechanics. Theemo expects your CSS files to use light-dark() function.
import { defineConfig } from '@theemo/cli';
export default defineConfig({
build: {
features: [
{
name: 'color-scheme',
browserFeature: 'color-scheme',
options: ['light', 'dark']
}
]
}
});:root {
--text-normal: light-dark(var(--palette-letters-dark), var(--palette-letters-light));
/* more tokens */
color-scheme: light dark;
}
[data-theemo-color-scheme="light"] {
color-scheme: light;
}
[data-theemo-color-scheme="dark"] {
color-scheme: dark;
}The options define the order being used for color-scheme CSS property (change the order to make dark the default).
Theemo generates [data-theemo-color-scheme="light"] these selectors to manually set a certain color scheme.
Color Contrast
Color contrast is supported by browsers with a media query. As such, theemo requires CSS files for all the media query values you want to support. Theemo then wraps them in the necessary media query.
import { defineConfig } from '@theemo/cli';
export default defineConfig({
build: {
features: [
{
name: 'color-contrast',
browserFeature: 'color-contrast',
options: {
less: 'build/contrast-less.css',
more: 'build/contrast-more.css'
}
}
]
}
});@media (prefers-contrast: less) {
:root {
--text-contrast: var(--text-subtle);
}
}
@media (prefers-contrast: more) {
:root {
--text-contrast: var(--text-muted);
}
}:root {
--text-contrast: var(--text-subtle);
}:root {
--text-contrast: var(--text-muted);
}Motion
Motion is supported by browsers with a media query. As such, theemo requires CSS files for all the media query values you want to support. Theemo then wraps them in the necessary media query.
import { defineConfig } from '@theemo/cli';
export default defineConfig({
build: {
features: [
{
name: 'motion',
browserFeature: 'motion',
options: {
'no-preference': 'build/motion.css',
reduce: 'build/motion-reduce.css'
}
}
]
}
});@media (prefers-reduced-motion: no-preference) {
:root {
--animation-speed: 500ms;
}
}
@media (prefers-reduced-motion: reduce) {
:root {
--animation-speed: 1s;
}
}:root {
--animation-speed: 500ms;
}:root {
--animation-speed: 1s;
}Custom
Any non-browser-supported feature is a custom feature. As such you need to configure the options, to which CSS files they point and the defaultOption.
import { defineConfig } from '@theemo/cli';
export default defineConfig({
build: {
features: [
{
name: 'density',
options: {
compact: 'build/density-compact.css',
comfortable: 'build/density-comfortable.css',
spacious: 'build/density-spacious.css'
},
defaultOption: 'comfortable'
}
]
}
});[data-theemo-density="compact"] {
--spacing-density: .8;
}
:root, [data-theemo-density="comfortable"] {
--spacing-density: 1;
}
[data-theemo-density="spacious"] {
--spacing-density: 1.2;
}build.lightningcss
- Type:
BuildConfig.lightningcss - Default:
true - Related:
lightningcssDocumentation
The final CSS file will be optimized by lightningcss. You can turn this off by setting this value to false or provide options to lightningcss.