Skip to content
quartiledocsv0.1
GitHub

Theming

Every color, radius, shadow, space and control size is a --q-* CSS custom property, so a theme is a remap of tokens.

Theme and density

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.

Revenue by channel

Sep 7 – Oct 6, 2026

4 bars. Highest Organic search at $119.9K; lowest Direct at $55.4K.

Revenue by channel
ChannelRevenue
Organic search$119.9K
Paid social$117.3K
Email$91.1K
Direct$55.4K
<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.

Overriding tokens

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.

/* 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;
}

Token reference

All 104 tokens, read from the library's tokens.css when this site was built.

Neutrals

TokenLight / defaultDark
--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

TokenLight / defaultDark
--q-ink#16150f#f2f0e9
--q-ink-hover#2e2c25#dcd7cc
--q-ink-pressed#000000#c9c4b8
--q-on-ink#ffffff#11110f

Inverse surfaces

TokenLight / defaultDark
--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

TokenLight / defaultDark
--q-signal#2f45e8#7383ff
--q-signal-hover#2236d0#8593ff
--q-signal-pressed#1b2cb0#9aa6ff
--q-signal-soft#eef0fdrgba(115, 131, 255, 0.14)
--q-signal-soft-2#d3d9fbrgba(115, 131, 255, 0.28)
--q-signal-ink#1e2da8#c9d0ff
--q-on-signal#ffffff#0b0b0a
--q-positive#14a06f#3dc492
--q-positive-soft#e2f3ecrgba(61, 196, 146, 0.14)
--q-positive-ink#0e7a5a#5fd3a5
--q-negative#e4572e#ff7d5c
--q-negative-soft#fbe9e3rgba(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#fbf0dcrgba(245, 192, 74, 0.14)
--q-warning-ink#996010#f5c04a

Data

TokenLight / defaultDark
--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

TokenLight / defaultDark
--q-shadow-00 0 0 1px var(--q-line), 0 1px 2px rgba(22, 21, 15, 0.06)0 0 0 1px var(--q-line)
--q-shadow-10 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-20 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-tooltip0 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-thumb0 1px 2px rgba(22, 21, 15, 0.3)0 1px 2px rgba(0, 0, 0, 0.5)
--q-shadow-segment0 1px 2px rgba(22, 21, 15, 0.12)0 1px 2px rgba(0, 0, 0, 0.4)
--q-focus-ring0 0 0 2px var(--q-surface), 0 0 0 4px var(--q-signal)—
--q-input-ring0 0 0 3px var(--q-signal-soft-2)0 0 0 3px rgba(115, 131, 255, 0.22)

Typography

TokenLight / defaultDark
--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

TokenLight / defaultDark
--q-space-14px—
--q-space-28px—
--q-space-312px—
--q-space-416px—
--q-space-520px—
--q-space-624px—
--q-space-832px—
--q-space-1040px—
--q-space-1456px—
--q-space-2080px—

Radius

TokenLight / defaultDark
--q-radius-xs4px—
--q-radius-sm6px—
--q-radius-md8px—
--q-radius-lg12px—
--q-radius-xl16px—
--q-radius-pill999px—

Motion

TokenLight / defaultDark
--q-easecubic-bezier(0.2, 0, 0, 1)—
--q-duration-fast120ms—
--q-duration180ms—

Density

TokenLight / defaultCompact
--q-control-h36px28px
--q-control-h-sm28px24px
--q-control-h-lg44px36px
--q-control-px14px10px
--q-control-font14px13px
--q-row-h44px32px
--q-card-pad20px14px
Report an issueBuilt Oct 21, 2026