# Styled Mode Choose from a variety of pre-styled themes or develop your own. ## Architecture PrimeReact is a design agnostic library so unlike some other UI libraries it does not enforce a certain styling such as material design. Styling is decoupled from the components using the themes instead. A theme consists of two parts; _base_ and _preset_. The base is the style rules with CSS variables as placeholders whereas the preset is a set of design tokens to feed a base by mapping the tokens to CSS variables. A base may be configured with different presets, currently Aura, Material, Lara and Nora are the available built-in options. ![Architecture](https://primefaces.org/cdn/primevue/images/primevue-v4-styled-architecture.png) The core of the styled mode architecture is based on a concept named _design token_, a preset defines the token configuration in 3 tiers; _primitive_, _semantic_ and _component_. Learn more about design tokens at the [Design Tokens Format Module](https://www.designtokens.org/tr/drafts/format/) specification. ### Primitive Tokens Primitive tokens have no context, a color palette is a good example for a primitive token such as `blue-50` to `blue-900`. A token named `blue-500` may be used as the primary color, the background of a message however on its own, the name of the token does not indicate context. Usually they are utilized by the semantic tokens. ### Semantic Tokens Semantic tokens define content and their names indicate where they are utilized, a well known example of a semantic token is the `primary.color`. Semantic tokens map to primitive tokens or other semantic tokens. The `colorScheme` token group is a special variable to define tokens based on the color scheme active in the application, this allows defining different tokens based on the color scheme like dark mode. ### Component Tokens Component tokens are isolated tokens per component such as `inputtext.background` or `button.color` that map to the semantic tokens. As an example, `button.background` component token maps to the `primary.color` semantic token which maps to the `green.500` primitive token. ### Best Practices Use primitive tokens when defining the core color palette and semantic tokens to specify the common design elements such as focus ring, primary colors and surfaces. Components tokens should only be used when customizing a specific component. By defining your own design tokens as a custom preset, you'll be able to define your own style without touching CSS. Overriding the PrimeReact components using style classes is not a best practice and should be the last resort, design tokens are the suggested approach. ## Configuration API ### Theme The `theme` property is used to customize the initial theme. ```tsx import Aura from '@primeuix/themes/aura'; import { PrimeReactProvider } from '@primereact/core'; import React from 'react'; import ReactDOM from 'react-dom/client'; import App from './App'; const theme = { preset: Aura, // Default options options: { prefix: 'p', darkModeSelector: 'system', cssLayer: false, cssVariables: true, scoped: false } }; ReactDOM.createRoot(document.getElementById('root')).render( ); ``` ### Options The `options` property defines the how the CSS would be generated from the design tokens of the preset. #### prefix The prefix of the CSS variables, defaults to `p`. For instance, the `primary.color` design token would be `var(--p-primary-color)`. ```tsx options: { prefix: 'my'; } ``` #### darkModeSelector The CSS rule to encapsulate the CSS variables of the dark mode, the default is the `system` to generate `@media (prefers-color-scheme: dark)`. If you need to make the dark mode toggleable based on the user selection define a class selector such as `.app-dark` and toggle this class at the document root. See the dark mode toggle section for an example. ```tsx options: { darkModeSelector: '.my-app-dark'; } ``` #### cssLayer Defines whether the styles should be defined inside a [CSS layer](https://developer.mozilla.org/en-US/docs/Web/CSS/@layer) by default or not. A CSS layer would be handy to declare a custom cascade layer for easier customization if necessary. The default is `false`. ```tsx options: { cssLayer: { name: 'primereact', order: 'app-styles, primereact, another-css-library' } } ``` #### cssVariables Controls whether component design tokens are generated as CSS variables or inlined as static values. Primitive and semantic tokens are always generated as CSS variables. #### scoped Scopes the generated CSS variables to the components only instead of the document root and host elements. Defaults to `false`. #### classPrefix Sets the prefix of the component class names, `p` by default. With `my`, the `p-button` class becomes `my-button` in both the generated CSS and the rendered markup. The icon classes `p-icon` and `p-icon-*` keep the `p-` name, and classes passed from the app, such as `className`, are not renamed. ```tsx options: { classPrefix: 'my'; } ``` ### Presets Aura, Material, Lara and Nora are the available built-in options, created to demonstrate the power of the design-agnostic theming. Aura is PrimeTek's own vision, Material follows Google Material Design v2, Lara is based on Bootstrap and Nora is inspired by enterprise applications. Visit the [source code](https://github.com/primefaces/primeuix/tree/main/packages/themes/src/presets) to learn more about the structure of presets. You may use them out of the box with modifications or utilize them as reference in case you need to build your own presets from scratch. ### Reserved Keys Following keys are reserved in the preset scheme and cannot be used as a token name; `primitive`, `semantic`, `components`, `directives`, `colorscheme`, `light`, `dark`, `common`, `root`, `states`, and `extend`. ### Colors Color palette of a preset is defined by the `primitive` design token group. You can access colors using CSS variables or the `$dt` utility. ```tsx // With CSS var(--p-blue-500) // With JS $dt('blue.500').value ``` ## Dark Mode PrimeReact uses the `system` as the default `darkModeSelector` in theme configuration. If you have a dark mode switch in your application, set the `darkModeSelector` to the selector you utilize such as `.my-app-dark` so that PrimeReact can fit in seamlessly with your color scheme. ```tsx import { StrictMode } from 'react'; import { createRoot } from 'react-dom/client'; import App from './App.tsx'; import { PrimeReactProvider } from '@primereact/core'; import Aura from '@primeuix/themes/aura'; const primereact = { theme: { preset: Aura, options: { darkModeSelector: '.my-app-dark' } } }; createRoot(document.getElementById('root')!).render( ); ``` Following is a very basic example implementation of a dark mode switch, you may extend it further by involving `prefers-color-scheme` to retrieve it from the system initially and use `localStorage` to make it stateful. See this [article](https://dev.to/abbeyperini/dark-mode-toggle-and-prefers-color-scheme-4f3m) for more information. ```tsx