Docs / Getting started / Theming Theming Every color, radius, shadow, space and control size is a --q-* CSS custom property, so a theme is a remap of tokens.
QuartileProvider takes theme (light, dark or system) and density (comfortable or compact). Providers nest, so one panel can differ from the page around it, as below.
light dark
comfortable compact
4 bars. Highest Organic search at $119.9K; lowest Direct at $55.4K.
Revenue by channel Channel Revenue Organic search $119.9K Paid social $117.3K Email $91.1K Direct $55.4K
Copy <QuartileProvider theme ="dark" density ="comfortable" >
<Card
title ="Revenue by channel"
subtitle ="Sep 7 – Oct 6, 2026"
actions ={
<Select
aria-label ="Sort"
size ="sm"
value ={sort}
onChange ={setSort}
options ={[
{ value: 'desc' , label: 'Highest first' },
{ value: 'asc' , label: 'Lowest first' },
]}
/>
}
>
<BarChart data ={orders} x ="channel" y ="amount" sort ={sort} format ="currency-compact" />
</Card >
</QuartileProvider >Compact density remaps control heights, paddings, row height and card padding; components do not branch on density in JavaScript.
Tokens are defined on :root and [data-theme='light'], with dark values under [data-theme='dark'] and compact values under [data-density='compact']. Override them in your own stylesheet, loaded after Quartile's, scoped the same way.
Copy /* Your stylesheet, loaded after @quartile/react/styles.css */
[data-theme='light'] {
--q-signal : #0f7b6c ; /* buttons, selections, focus */
--q-cat-1 : #0f7b6c ; /* first chart series */
--q-font-sans : 'Inter', system-ui, sans-serif;
}All 104 tokens, read from the library's tokens.css when this site was built.
Neutrals Token Light / default Dark --q-bg #f5f3ee #11110f--q-surface #ffffff #191916--q-subtle #f0ede6 #22221e--q-muted #faf9f6 #161613--q-raised #ffffff #3b3a35--q-hover #eae7df #26261f--q-pressed #e3dfd5 #2e2d28--q-grid #efece5 #23231f--q-line #e5e1d8 #2b2a26--q-line-strong #d3cdc0 #3b3a35--q-line-input #cfc9bc #4a4842--q-text-4 #b3aea3 #5e5b53--q-text-3 #6d6962 #8f8b80--q-text-2 #58554c #b9b5aa--q-text #16150f #f2f0e9
Ink Token Light / default Dark --q-ink #16150f #f2f0e9--q-ink-hover #2e2c25 #dcd7cc--q-ink-pressed #000000 #c9c4b8--q-on-ink #ffffff #11110f
Inverse surfaces Token Light / default Dark --q-inverse #16150f #0b0b0a--q-inverse-2 #2b2a26 #22221e--q-inverse-line #2b2a26 #3b3a35--q-inverse-text #f2f0e9— --q-inverse-text-2 #b9b5aa— --q-code-bg #11110f #0b0b0a
Signal and semantic colors Token Light / default Dark --q-signal #2f45e8 #7383ff--q-signal-hover #2236d0 #8593ff--q-signal-pressed #1b2cb0 #9aa6ff--q-signal-soft #eef0fd rgba(115, 131, 255, 0.14)--q-signal-soft-2 #d3d9fb rgba(115, 131, 255, 0.28)--q-signal-ink #1e2da8 #c9d0ff--q-on-signal #ffffff #0b0b0a--q-positive #14a06f #3dc492--q-positive-soft #e2f3ec rgba(61, 196, 146, 0.14)--q-positive-ink #0e7a5a #5fd3a5--q-negative #e4572e #ff7d5c--q-negative-soft #fbe9e3 rgba(255, 125, 92, 0.14)--q-negative-ink #be3b20 #ff9373--q-danger #c83e22 #e4572e--q-danger-hover #b0341b #ee6a43--q-danger-pressed #962b15 #f27d58--q-warning #e9a923 #f5c04a--q-warning-soft #fbf0dc rgba(245, 192, 74, 0.14)--q-warning-ink #996010 #f5c04a
Data Token Light / default Dark --q-cat-1 #2f45e8 #7383ff--q-cat-2 #f26b3a #ff8b5e--q-cat-3 #10a296 #2dc8b9--q-cat-4 #e9a923 #f5c04a--q-cat-5 #8e4fd0 #b07ef2--q-cat-6 #5ab0e8 #7fc8f5--q-cat-7 #e0628a #f283a7--q-cat-8 #6e9f3c #92c45c--q-series-muted #a6a194 #6f6b61--q-seq-0 #eef0fd #1d1f33--q-seq-1 #d3d9fb #252b5a--q-seq-2 #aab5f7 #2f3a8a--q-seq-3 #7b8bf1 #3d4dbf--q-seq-4 #4f63eb #5568e8--q-seq-5 #2f45e8 #7383ff--q-seq-6 #1f2fb0 #a3aeff--q-seq-7 #141f78 #d0d6ff--q-div-n3 #c8502a #ff7d5c--q-div-n2 #ee8a63 #c8603f--q-div-n1 #f7c7b3 #6b3a2b--q-div-0 #efece6 #2b2a26--q-div-p1 #bfc8f8 #2e3870--q-div-p2 #7d8df0 #4f5fd0--q-div-p3 #2f45e8 #7383ff
Elevation Token Light / default Dark --q-shadow-0 0 0 0 1px var(--q-line), 0 1px 2px rgba(22, 21, 15, 0.06) 0 0 0 1px var(--q-line) --q-shadow-1 0 1px 2px rgba(22, 21, 15, 0.06), 0 18px 40px -12px rgba(22, 21, 15, 0.22) 0 0 0 1px var(--q-line-strong), 0 18px 40px -12px rgba(0, 0, 0, 0.6) --q-shadow-2 0 2px 4px rgba(22, 21, 15, 0.06), 0 40px 80px -24px rgba(22, 21, 15, 0.35) 0 0 0 1px var(--q-line-strong), 0 40px 80px -24px rgba(0, 0, 0, 0.7) --q-shadow-tooltip 0 14px 34px -10px rgba(22, 21, 15, 0.45) 0 0 0 1px var(--q-inverse-line), 0 14px 34px -10px rgba(0, 0, 0, 0.6) --q-shadow-thumb 0 1px 2px rgba(22, 21, 15, 0.3) 0 1px 2px rgba(0, 0, 0, 0.5) --q-shadow-segment 0 1px 2px rgba(22, 21, 15, 0.12) 0 1px 2px rgba(0, 0, 0, 0.4) --q-focus-ring 0 0 0 2px var(--q-surface), 0 0 0 4px var(--q-signal) — --q-input-ring 0 0 0 3px var(--q-signal-soft-2) 0 0 0 3px rgba(115, 131, 255, 0.22)
Typography Token Light / default Dark --q-font-sans "Schibsted Grotesk", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif — --q-font-mono "IBM Plex Mono", ui-monospace, "SFMono-Regular", Menlo, Consolas, monospace —
Space Token Light / default Dark --q-space-1 4px — --q-space-2 8px — --q-space-3 12px — --q-space-4 16px — --q-space-5 20px — --q-space-6 24px — --q-space-8 32px — --q-space-10 40px — --q-space-14 56px — --q-space-20 80px —
Radius Token Light / default Dark --q-radius-xs 4px — --q-radius-sm 6px — --q-radius-md 8px — --q-radius-lg 12px — --q-radius-xl 16px — --q-radius-pill 999px —
Motion Token Light / default Dark --q-ease cubic-bezier(0.2, 0, 0, 1) — --q-duration-fast 120ms — --q-duration 180ms —
Density Token Light / default Compact --q-control-h 36px 28px --q-control-h-sm 28px 24px --q-control-h-lg 44px 36px --q-control-px 14px 10px --q-control-font 14px 13px --q-row-h 44px 32px --q-card-pad 20px 14px