--gog-*
Theming
Every value the library paints with is a plain CSS custom property. No build step, no Sass config, no JS theming API required to change how it looks.
Pick a component, tweak its tokens live and copy the result — no IDE guesswork.
Guild of Gleks UI is themed entirely through CSS custom properties (--gog-*). There is
no build step, Sass config or JS theming API required to change how it looks — every
value the library paints with can be overridden from plain CSS.
How theming is layered
Foundation — the base palette, type scale, spacing and motion tokens (
--gog-accent-color,--gog-background-color,--gog-text-xs,--gog-radius, …). Overriding these restyles the whole library at once.Component — tokens scoped to one component (
--gog-btn-*,--gog-accordion-*,--gog-table-*, …). Most derive from the foundation layer, so a palette swap already carries through; override a component token directly only when you need to restyle just that component.Instance — a handful of tokens (
--gog-btn-bg,--gog-tag-bg, …) are left undeclared on purpose, as an escape hatch for styling a single element without touching a theme at all:html<gog-button style="--gog-btn-bg: #ff4edb">One-off button</gog-button>
What index.css pulls in
One import is the whole setup, and it is a thin wrapper over four files:
| File | What it carries |
|---|---|
theme.css |
every --gog-* token the components read, in both the light and dark layers |
typography.css |
the font-body / font-heading helpers component templates apply to themselves |
utilities.css |
the utility classes those templates rely on (gog-contained-layout, …) |
button.css 21.4.0 |
the [gogButton] directive's styles — global because that directive styles an element you wrote (an <a>), which no component stylesheet can reach |
fonts.css is deliberately not among them: it pulls three families from Google Fonts, which a
library has no business imposing. Import it explicitly if you want this site's typography.
The full catalogue of tokens ships with the package as TOKENS.md — generated from
theme.css, so it cannot drift. The Token Reference at the bottom of this page is the same data,
browsable.
Built-in themes
The library ships two themes, light and dark, switched with a data-theme
attribute on any element (usually <html>):
<html data-theme="dark"></html>
data-theme can also be scoped to a smaller subtree, so several themes can render
side by side on the same page.
Ready-made presets
Three additional palettes ship as importable stylesheets. Each one declares palette tokens only and still restyles every component — which is the theming contract demonstrated rather than described.
| Preset | data-theme |
Stylesheet |
|---|---|---|
| Slate — cool, indigo | slate |
@guildofgleks/ui/styles/presets/slate.css |
| One Dark — the Atom/JetBrains palette | one-dark |
.../presets/one-dark.css |
| One Light — its light counterpart | one-light |
.../presets/one-light.css |
Add the one you want to your global styles, then set the attribute:
"styles": [
"node_modules/@guildofgleks/ui/styles/index.css",
"node_modules/@guildofgleks/ui/styles/presets/one-dark.css",
"src/styles.scss"
]
The short path is new in 21.3.2 21.3.2. The old
@guildofgleks/ui/src/styles/…still resolves and will keep working until 21.5.0, so this is a rename to make at your leisure — but the short form is the one to write in new setups. It is also listed in the package'sexportsmap, which means it resolves from a SCSS@import '@guildofgleks/ui/styles/theme.css'as well; the old path never did.
<html data-theme="one-dark"></html>
The One presets map the editor's syntax hues onto the library's semantic roles — blue becomes the
accent, and green / red / yellow / cyan become success / danger / warning / info. Neither preset
mentions --gog-btn-primary-bg by name, yet buttons pick it up: that is the derived layer
re-resolving, and it is why a preset can be a short list of colors rather than a fork of the whole
stylesheet.
Switching the theme from code
ThemeService wraps that attribute in a signal-based API:
import { Component, inject } from '@angular/core';
import { ThemeService } from '@guildofgleks/ui';
@Component({
selector: 'app-theme-switcher',
template: `
<button (click)="setDark()">Dark</button>
<button (click)="toggle()">Toggle</button>
`,
})
export class ThemeSwitcher {
private readonly themeService = inject(ThemeService);
protected readonly theme = this.themeService.theme; // Signal<string> — read-only
setDark(): void {
this.themeService.setTheme('dark');
}
toggle(): void {
this.themeService.toggleTheme(); // flips between 'light' and 'dark'
}
}
theme is a read-only Signal, so setTheme / toggleTheme are the only way to change it.
That is the point: the service also writes the data-theme attribute and persists the choice, and
a .set() straight onto the signal skipped both — the document kept its old theme while the signal
claimed otherwise.
Which theme it starts on, whether the choice survives a reload, and whether it follows the OS
setting are all configured through GOG_CONFIG.theme
21.3.2 — see
Global Configuration.
This is exactly what the theme switcher (the palette icon) in this site's header uses.
Building your own theme
Declare a palette against a new data-theme value. List both selectors so the theme
works at the document root and on any subtree:
:root[data-theme='midnight'],
[data-theme='midnight'] {
color-scheme: dark;
/* Surfaces */
--gog-background-color: #0b0f1a;
--gog-surface-color: #131a2b;
--gog-hover-color: #1c2540;
--gog-border-color: #2a355a;
/* Text */
--gog-text-color: #e8ecf7;
--gog-muted-text-color: #8892b0;
--gog-accent-text-color: #0b0f1a;
/* Brand & accents */
--gog-primary-color: #e8ecf7;
--gog-accent-color: #5b8dff;
--gog-accent-bright: #82a9ff;
--gog-accent-dim: #35528f;
--gog-accent-pale: #1c2c52;
--gog-secondary-color: #7b6bff;
/* Semantic */
--gog-success-color: #2fbf71;
--gog-danger-color: #ef4565;
--gog-warning-color: #f2a541;
--gog-info-color: #38bdf8;
}
Then switch to it exactly like a built-in theme:
themeService.setTheme('midnight');
Because every component token derives from these foundation tokens, a new palette propagates through buttons, tables, dialogs and everything else without touching a single component stylesheet.
Rules of thumb
- Prefer overriding foundation tokens over chasing individual component tokens — you get the whole library restyled for the price of one palette.
- Don't hardcode colors in your app that duplicate a token — reference the token instead, so it keeps following theme switches.
- A panel appended to
<body>(dropdowns with[appendToBody], toasts, tooltips, the datepicker's calendar) follows its trigger's theme, not the DOM position it renders at — no extra wiring needed on your side. When the theme is scoped to a subtree the panel gets a copy of thatdata-theme; when it sits on<html>, as it usually does, plain inheritance already does the job. - Custom properties set inline on
<html>reach overlays too, which is what makes a runtime theme editor — like this site's Theme Generator — work. Before 21.4.1 an overlay copied the document'sdata-themeonto itself and, in doing so, re-declared every component token from the plain preset, discarding anything the page had set on the root.
Token Reference
Every CSS custom property a component paints with, grouped by area. Override any of them — on a single instance, a subtree, or a theme — to restyle the library.
| Token | Value | Description |
|---|---|---|
--gog-background-color | | Page / app background. |
--gog-surface-color | | Card, panel and control surface background. |
--gog-hover-color | | Hover background for interactive surfaces. |
--gog-border-color | | Default border color. |
--gog-text-color | | Primary text color. |
--gog-muted-text-color | | Secondary / placeholder text color. |
--gog-accent-text-color | | Text color placed on top of an accent-colored background. |
--gog-primary-color | | Primary brand color. |
--gog-accent-color | | Accent / brand color used for interactive elements. |
--gog-accent-bright | | Brighter accent, used for hover states. |
--gog-accent-dim | | Dimmed accent, used for borders and strokes. |
--gog-accent-pale | | Pale accent tint, used for subtle backgrounds. |
--gog-secondary-color | | Secondary brand color. |
--gog-success-color | | Semantic success color. |
--gog-danger-color | | Semantic danger / error color. |
--gog-warning-color | | Semantic warning color. |
--gog-info-color | | Semantic info color. |
--gog-panel-shadow | | Drop shadow for elevated panels (dialogs, dropdowns). |
| Token | Value | Description |
|---|---|---|
--gog-font-heading | | Font stack used for headings and titles. |
--gog-font-body | | Font stack used for body text. |
--gog-font-mono | | Monospace font stack (code, numeric values). |
--gog-text-xs … --gog-text-3xl | | Type scale, from 0.75rem to 3rem. |
| Token | Value | Description |
|---|---|---|
--gog-space-xs … --gog-space-2xl | | Spacing scale, from 4px to 48px. |
--gog-radius | | Base corner radius used across most components. |
--gog-panel-radius | | Corner radius for larger panels — derived from --gog-radius. |
--gog-panel-border-width / --gog-panel-border-style | | Border width and style for elevated panels. |
| Token | Value | Description |
|---|---|---|
--gog-duration-fast / -base / -slow | | Transition durations used by every animated component. |
--gog-easing | | Default transition easing function. |
--gog-focus-ring-width / --gog-focus-ring-offset | | Keyboard focus ring size and offset. |
--gog-disabled-opacity | | Opacity applied to disabled controls. |
| Token | Value | Description |
|---|---|---|
--gog-control-padding-y / -x | | Shared padding for form controls (buttons, fields). |
--gog-control-icon-offset | | Icon inset shared by form controls. |
--gog-control-border-width / -style | | Shared border width and style for form controls. |
--gog-control-checkbox-{size}-box-size / -label-size / -icon-size | | Checkbox box, label and icon size, per size step (xsm/sm/md/lg/slg). |
--gog-field-float-label-reserve / -in-top / -over-gap / -over-reserve | | Float-label geometry shared by every field. Each control’s own --gog-{control}-float-label-* tokens derive from these, so one declaration retunes them all while a single control can still be overridden. |
| Token | Value | Description |
|---|---|---|
--gog-accordion-border-color / -width / -style | | Header border. |
--gog-accordion-text-color / -accent-color | | Text and accent color. |
--gog-accordion-hover-bg / -hover-ring | | Header hover background and focus ring. |
--gog-accordion-radius / -body-radius | | Corner radius for the header and body. |
--gog-accordion-header-bg / -body-bg | | Header and body background. |
--gog-accordion-header-gap | | Gap between chevron and title. |
--gog-accordion-transition-duration / -body-transition-duration / -chevron-transition-duration | | Expand/collapse animation timing. |
--gog-accordion-{size}-padding-y / -x / -font-size | | Header padding and font size, per size step (xsm/sm/md/lg/slg). |
| Token | Value | Description |
|---|---|---|
--gog-autocomplete-label-color | | Field label color. |
--gog-autocomplete-field-bg / -border-color / -text-color | | Field surface, border and text. |
--gog-autocomplete-radius / -min-width | | Field corner radius and the floor an auto-width field cannot collapse past. |
--gog-autocomplete-focus-ring-color / -focus-ring-width / -hover-border-color | | Focus and hover states. |
--gog-autocomplete-panel-bg / -panel-border-color / -panel-shadow / -panel-max-height | | Suggestion panel surface and height cap. |
--gog-autocomplete-option-hover-bg / -option-selected-bg / -option-height | | Suggestion row states and row height. |
--gog-autocomplete-empty-color / -spinner-size | | The "nothing found" message and the loading spinner. |
--gog-autocomplete-clear-color / -clear-hover-color / -actions-inset | | Clear button color and how far the trailing actions sit from the edge. |
--gog-autocomplete-float-label-reserve / -in-top / -over-gap / -over-reserve | | Float-label geometry, derived from the shared --gog-field-float-label-* scale. |
| Token | Value | Description |
|---|---|---|
--gog-badge-success-bg / -danger-bg / -warning-bg / -info-bg (+ matching -color) | | Fill and text color per semantic variant. |
--gog-badge-size / -dot-size / -padding-inline | | Badge height, the bare-dot diameter, and horizontal padding around a count. |
--gog-badge-radius / -border-color / -border-width / -border-style | | Corner radius and the ring separating the badge from its host. |
--gog-badge-font-family / -font-size / -font-weight / -line-height | | Count typography. |
--gog-badge-offset / -z | | How far the badge overhangs its host corner, and its stacking order. |
| Token | Value | Description |
|---|---|---|
--gog-btn-font-family / -font-weight / -letter-spacing / -text-transform | | Label typography. |
--gog-btn-radius | | Corner radius. |
--gog-btn-border-width / -style | | Border. |
--gog-btn-transition-duration | | Hover / active transition timing. |
--gog-btn-{variant}-bg / -color / -border / -shadow | | Fill, text, border and shadow per variant (primary/secondary/outline/ghost). |
--gog-btn-{variant}-hover-bg / -hover-color / -hover-shadow | | Hover state per variant. |
--gog-btn-bg / -color / -border / -padding / -font-size | | Undeclared by default — the escape hatch for styling a single button instance. |
| Token | Value | Description |
|---|---|---|
--gog-button-toggle-rest-bg / -rest-color | | An unselected button. |
--gog-button-toggle-selected-bg / -selected-color / -selected-border-color | | The selected button. |
--gog-button-toggle-hover-bg / -hover-color | | Hover state. |
--gog-button-toggle-border-color / -border-width / -border-style / -radius | | Group border and corner radius. |
--gog-button-toggle-separated-gap | | Gap between buttons in the "separated" appearance. "joined" shares borders. |
--gog-button-toggle-font-family / -font-weight / -letter-spacing / -text-transform / -icon-size | | Button typography and icon size. |
--gog-button-toggle-focus-ring-color / -focus-ring-width / -focus-ring-offset | | Keyboard focus ring. |
| Token | Value | Description |
|---|---|---|
--gog-calendar-max-width | | How wide the calendar may get. Defaults to max-content, which caps it at its own month grid and follows the size steps, numberOfMonths and showTime on its own — set it to 100% for a calendar that fills its container instead. Also sizes gog-datepicker in inline mode, which renders this component. |
--gog-calendar-padding / -header-gap / -footer-gap / -months-gap | | Grid padding and the gaps between header, footer and side-by-side months. |
--gog-calendar-day-size (per size step: xsm/sm/md/lg/slg) / -day-radius | | Day cell size and shape. |
--gog-calendar-day-rest-bg / -day-hover-bg / -day-outside-color | | Day cell states, including days spilling in from the neighbouring month. |
--gog-calendar-selected-bg / -selected-color / -selected-font-weight | | The selected day. |
--gog-calendar-range-bg / -range-color | | Days between the two ends of a range selection. |
--gog-calendar-today-border-color / -today-font-weight | | The ring marking today. |
--gog-calendar-nav-bg / -nav-hover-bg / -nav-size / -nav-icon-size | | Previous/next month and year buttons. |
--gog-calendar-weekday-color / -weekday-font-size / -weekday-text-transform | | Weekday header row. |
--gog-calendar-time-input-bg / -time-input-width / -time-gap | | The clock section shown under the grid when showTime is on. |
| Token | Value | Description |
|---|---|---|
--gog-checkbox-gap | | Gap between box and label. |
--gog-checkbox-radius | | Box corner radius. |
--gog-checkbox-border-width / -style / -color | | Box border. |
--gog-checkbox-bg / -checked-bg / -checked-border | | Box background, unchecked and checked. |
--gog-checkbox-icon-color | | Checkmark color. |
--gog-checkbox-label-color | | Label text color. |
--gog-checkbox-focus-ring / -focus-ring-width / -focus-ring-offset | | Keyboard focus ring. |
| Token | Value | Description |
|---|---|---|
--gog-chip-bg / -hover-bg | | Background, default and hover. |
--gog-chip-border / -border-width / -style | | Border. |
--gog-chip-color / -font-weight | | Text color and weight. |
--gog-chip-radius / -pill-radius | | Corner radius, square and pill shape. |
--gog-chip-remove-color / -remove-hover-color | | Remove (×) icon color. |
--gog-chip-{size}-font-size / -padding-block / -padding-inline / -gap / -avatar-size / -icon-size | | Full sizing scale, per size step (xsm/sm/md/lg/slg). |
| Token | Value | Description |
|---|---|---|
--gog-collapsible-transition-duration | | Expand/collapse animation timing. |
--gog-collapsible-max-height | | Height an open panel transitions toward. Defaults to max-content, so a panel is as tall as its content and never truncates it. Set a length to cap one deliberately — the panel is overflow: hidden, so a cap clips rather than scrolls. |
--gog-collapsible-disabled-opacity | | Opacity applied to a disabled trigger. |
| Token | Value | Description |
|---|---|---|
--gog-datepicker-label-color | | Field label color. |
--gog-datepicker-field-bg / -border-color / -text-color | | Field surface, border and text. |
--gog-datepicker-radius / -min-width | | Field corner radius and minimum width. |
--gog-datepicker-focus-ring-color / -focus-ring-width / -hover-border-color | | Focus and hover states. |
--gog-datepicker-icon-color / -icon-hover-color / -toggle-icon-size | | The calendar toggle icon. |
--gog-datepicker-panel-bg / -panel-border-color / -panel-shadow / -panel-radius | | The panel wrapping the calendar. The grid itself is themed by --gog-calendar-*. |
--gog-datepicker-panel-width | | Width of the dropdown panel, max-content by default. Inline mode has no panel — it is gog-calendar on its own, so it sizes from --gog-calendar-max-width. |
--gog-datepicker-clear-color / -clear-icon-ratio / -actions-inset | | Clear button color, glyph size and inset. |
--gog-datepicker-error-color / -error-border-color / -error-font-size | | Validation error message and border. |
--gog-datepicker-float-label-reserve / -in-top / -over-gap / -over-reserve | | Float-label geometry, derived from the shared --gog-field-float-label-* scale. |
| Token | Value | Description |
|---|---|---|
--gog-dialog-backdrop-bg / -backdrop-blur | | Scrim behind the dialog. |
--gog-dialog-bg / -color / -border / -radius / -shadow | | Panel surface. |
--gog-dialog-header-padding / -body-padding | | Section padding. |
--gog-dialog-close-color / -close-hover-color / -close-hover-bg | | Close button. |
--gog-confirm-color / -description-color / -actions-gap | | Confirmation dialog variant. |
| Token | Value | Description |
|---|---|---|
--gog-divider-line-color / -line-thickness | | The rule itself. |
--gog-divider-solid-style / -dashed-style / -dotted-style | | The border-style each variant maps to. |
--gog-divider-block-spacing / -inline-spacing | | Margin around a horizontal and a vertical divider respectively. |
--gog-divider-vertical-length | | Fallback length for a vertical divider whose row has no height of its own. |
--gog-divider-inset-size | | How far the inset variant is indented from the leading edge. |
--gog-divider-label-color / -label-font-size / -label-font-weight / -label-gap | | The projected label and the gap punched in the rule around it. |
| Token | Value | Description |
|---|---|---|
--gog-icon-size | | Default icon size. |
--gog-icon-stroke-width | | Stroke width for outline icons. |
--gog-icon-fallback-size | | Size used when no size is set. |
| Token | Value | Description |
|---|---|---|
--gog-input-label-color | | Field label color. |
--gog-input-field-bg / -field-border / -field-color | | Field surface, border and text. |
--gog-input-radius | | Field corner radius. |
--gog-input-focus-border / -focus-ring / -focus-glow | | Focus state. |
--gog-input-error-color | | Validation error color. |
--gog-input-icon-color / -icon-hover-color | | Prefix / suffix icon color. |
--gog-input-float-label-reserve / -in-top / -on-bg / -over-gap / -over-reserve | | Float-label geometry, derived from the shared --gog-field-float-label-* scale. -on-bg is an instance-layer token (undeclared) — the patch that masks the border behind an "on" label. |
--gog-textarea-clear-icon-ratio | | Size of gog-textarea’s clear glyph relative to the field. A textarea is a large multi-line box, so it takes a full-size glyph rather than the dropdowns’ denser 0.7 ratio. |
--gog-textarea-scrollbar-width | | Instance-layer (undeclared): written by the component from its own measured scrollbar width, so a clear button on a scrolling textarea does not end up under the thumb. |
| Token | Value | Description |
|---|---|---|
--gog-multiselect-* (was --gog-ms-*) | | Renamed in 21.3.0. Both spellings work for the whole deprecation window — the --gog-ms-* name stays the declared one and the new name derives from it, so an existing override of either still reaches the component. --gog-ms-* is removed in 21.5.0. |
--gog-multiselect-label-color | | Field label color. |
--gog-multiselect-field-bg / -field-border | | Field surface and border. |
--gog-multiselect-radius / -min-width | | Field corner radius, and the floor an auto-width trigger cannot collapse past. |
--gog-multiselect-focus-border / -focus-ring | | Focus state. |
--gog-multiselect-panel-bg / -panel-border / -panel-shadow / -panel-max-width | | Dropdown panel surface, and the cap on a panel that sizes to its own content rather than to the trigger. |
--gog-multiselect-option-hover-bg / -option-color | | Option row, default and hover. |
--gog-multiselect-checkbox-bg / -checkbox-checked-bg | | Per-option selection checkbox. |
--gog-multiselect-float-label-reserve / -in-top / -on-bg / -over-gap / -over-reserve | | Float-label geometry, derived from the shared --gog-field-float-label-* scale. |
| Token | Value | Description |
|---|---|---|
--gog-paginator-gap | | Gap between page controls. |
--gog-paginator-ellipsis-color / -ellipsis-font-size | | The "…" truncation marker. |
| Token | Value | Description |
|---|---|---|
--gog-progressbar-accent-bg / -success-bg / -danger-bg / -warning-bg / -info-bg | | Fill color per variant. |
--gog-progressbar-{variant}-buffer-bg | | The lighter buffer level shown ahead of the fill in "buffer" mode. |
--gog-progressbar-track-base-bg / -radius | | The unfilled track. |
--gog-progressbar-{size}-height | | Bar thickness, per size step (xsm/sm/md/lg/slg). |
--gog-progressbar-indeterminate-duration / -indeterminate-easing | | Indeterminate animation timing. Replaced by a static stripe under prefers-reduced-motion. |
--gog-progressbar-stripe-color / -stripe-size | | The static stripe that stands in for the animation when motion is reduced. |
--gog-progressbar-value-color / -value-font-size / -value-min-width / -value-gap | | The percentage readout rendered when showValue is on. |
| Token | Value | Description |
|---|---|---|
--gog-radio-bg / -border-color / -border-width / -border-style | | The circle, unchecked. |
--gog-radio-checked-bg / -checked-border / -dot-color / -dot-size-ratio | | The circle and its dot once checked. |
--gog-radio-label-color / -label-line-height / -gap | | Per-option label and the gap to its circle. |
--gog-radio-group-label-color / -group-label-size / -group-gap | | The group’s own label. |
--gog-radio-group-option-gap / -group-option-gap-horizontal | | Gap between options, vertical and horizontal orientation respectively. |
--gog-radio-focus-ring / -focus-ring-width / -focus-ring-offset | | Keyboard focus ring. |
--gog-radio-error-color / -error-font-size / -disabled-opacity | | Validation error message and the disabled state. |
| Token | Value | Description |
|---|---|---|
--gog-scroll-track-bg / -track-radius | | Track background and corner radius. |
--gog-scroll-thumb-bg / -thumb-hover-bg / -thumb-active-bg | | Draggable thumb color, per interaction state. |
--gog-scroll-thumb-radius / -thumb-inset | | Thumb shape and inset from the track edges. |
--gog-scroll-corner-bg | | Background of the corner square where two tracks meet. |
--gog-scroll-fade-duration | | Auto-hide fade animation timing. |
--gog-scroll-focus-ring / -focus-ring-width | | Keyboard focus ring on the viewport. |
--gog-scroll-{normal|thin}-track-width / -thumb-min-size | | Track width and minimum thumb length, per size step. |
| Token | Value | Description |
|---|---|---|
--gog-select-label-color | | Field label color. |
--gog-select-field-bg / -field-border | | Field surface and border. |
--gog-select-radius | | Field corner radius. |
--gog-select-focus-border / -focus-ring | | Focus state. |
--gog-select-panel-bg / -panel-shadow / -panel-max-width | | Dropdown panel surface, and the cap on a panel that sizes to its own content rather than to the trigger. |
--gog-select-min-width | | The floor an auto-width trigger cannot collapse past (120px). |
--gog-select-chevron-color / -chevron-inset | | Dropdown arrow color and inset. Since 21.3.0 the inset lands on --gog-control-icon-offset, the same line as gog-inputfield’s icons — the three controls now line up in a form. |
--gog-select-option-hover-bg / -option-selected-color | | Option row states. |
--gog-select-float-label-reserve / -in-top / -on-bg / -over-gap / -over-reserve | | Float-label geometry, derived from the shared --gog-field-float-label-* scale. |
| Token | Value | Description |
|---|---|---|
--gog-skeleton-base / -shine | | Placeholder base color and shimmer. |
--gog-skeleton-radius / -line-radius | | Corner radius, block and line shapes. |
--gog-skeleton-pulse-duration / -wave-duration | | Loading animation timing. |
| Token | Value | Description |
|---|---|---|
--gog-slider-label-color / -value-color | | Label and current value. |
--gog-slider-track-bg / -fill-bg | | Track, empty and filled. The fill is applied as background rather than background-color, so -fill-bg also accepts a gradient. |
--gog-slider-track-border-width / -track-border-style / -track-border-color | | An optional border on the track — transparent by default, the same opt-in convention as --gog-btn-primary-border. |
--gog-slider-thumb-bg / -thumb-border / -thumb-shadow | | Drag handle. |
--gog-slider-auto-width / -vertical-length | | Size of a slider that does not fill its container: width when horizontal, length when vertical. |
--gog-slider-focus-ring | | Keyboard focus ring. |
| Token | Value | Description |
|---|---|---|
--gog-spinner-track-color | | Background ring. |
--gog-spinner-arc-outer-color / -arc-inner-color | | Spinning arc colors. |
--gog-spinner-diamond-color / -rune-color / -glow-color | | Decorative elements on the larger spinner variants. |
--gog-spinner-spin-duration / -pulse-duration | | Animation timing. |
| Token | Value | Description |
|---|---|---|
--gog-table-border-color / -border-width | | Outer border. |
--gog-table-surface / -text-color / -accent-color | | Surface, body text and header accent. |
--gog-table-hover-bg | | Row hover background. |
--gog-table-muted-color | | Secondary text (e.g. empty state). |
--gog-table-header-letter-spacing / -text-transform | | Header cell typography. |
--gog-table-{size}-padding-v / -th-font-size / -td-font-size | | Row density, per size step (xsm/sm/md/lg/slg). |
| Token | Value | Description |
|---|---|---|
--gog-tabs-rest-color / -hover-color / -active-color | | Tab header label, per state. |
--gog-tabs-indicator-color / -indicator-thickness / -indicator-radius | | The bar marking the active tab. |
--gog-tabs-header-border-color / -header-border-width / -header-border-style | | The rule under the tablist. |
--gog-tabs-{size}-font-size / -{size}-padding | | Header typography and padding, per size step (sm/md/lg/slg). |
--gog-tabs-tab-gap / -gap / -icon-size | | Gap between headers, between a header’s icon and its label, and icon size. |
--gog-tabs-panel-padding / -panel-color | | The content panel below the tablist. |
--gog-tabs-focus-ring-color / -focus-ring-width / -focus-ring-offset / -disabled-opacity | | Keyboard focus ring and the disabled state. |
| Token | Value | Description |
|---|---|---|
--gog-tag-default-color / -success-color / -danger-color / -warning-color / -info-color | | Base color per semantic variant. |
--gog-tag-bg-base / -color-base / -bg-mix / -color-mix | | How the variant color is mixed into background and text. |
--gog-tag-radius / -pill-radius | | Corner radius, square and pill shape. |
--gog-tag-{size}-font-size / -padding-block / -padding-inline / -gap / -icon-size | | Full sizing scale, per size step (xsm/sm/md/lg/slg). |
| Token | Value | Description |
|---|---|---|
--gog-toast-bg / -color / -border | | Card surface. |
--gog-toast-success-color / -error-color / -warning-color / -info-color | | Accent stripe and icon color, per toast type. |
--gog-toast-padding / -radius | | Card padding and corner radius. |
--gog-toast-stack-peek / -stack-scale-step / -stack-expanded-gap | | Card-stack geometry when several toasts are visible at once. |
| Token | Value | Description |
|---|---|---|
--gog-toggle-track-off-bg / -track-on-bg / -on-border-color | | The track, off and on. |
--gog-toggle-thumb-off-bg / -thumb-on-bg / -thumb-shadow / -thumb-inset | | The sliding thumb. |
--gog-toggle-{size}-track-width / -track-height / -thumb-size / -label-size | | Full sizing scale, per size step (xsm/sm/md/lg/slg). |
--gog-toggle-state-color / -state-font-weight / -state-padding-inline / -state-thumb-gap | | The onLabel / offLabel text rendered inside the track. |
--gog-toggle-label-color / -gap / -radius | | The label next to the switch, its gap, and the track corner radius. |
--gog-toggle-focus-ring-color / -focus-ring-width / -focus-ring-offset / -disabled-opacity | | Keyboard focus ring and the disabled state. |
| Token | Value | Description |
|---|---|---|
--gog-tooltip-bg / -color / -border-color / -shadow / -radius | | The bubble surface. Deliberately the same floating-panel recipe as a dialog or dropdown, not a bespoke inverted bubble. |
--gog-tooltip-max-width / -max-height | | Content wraps at the width and scrolls past the height, inside an internal gog-scroll. |
--gog-tooltip-padding / -gap / -arrow-size | | Bubble padding, its distance from the trigger, and the arrow. |
--gog-tooltip-font-family / -font-size / -line-height | | Bubble typography. |
--gog-tooltip-z / -transition-duration | | Stacking order (raised inside a dialog so a tooltip stacks above it) and fade timing. |
Or copy this one block — every token worth overriding to build a fully custom theme, from fonts through the palette to the component layer:
/*
* Theme starter — every token the library paints with, ready to override.
* Order: fonts, palette, structure (spacing/radius/motion), then every
* component token grouped by component.
*
* Copy this after the library import and replace the values.
*/
/* ── Fonts & type scale ──────────────────────────────────────────────────── */
:root {
--gog-font-heading: 'YourHeadingFont', serif;
--gog-font-body: 'YourBodyFont', sans-serif;
--gog-font-mono: 'YourMonoFont', monospace;
--gog-text-xs: 0.75rem;
--gog-text-sm: 0.875rem;
--gog-text-md: 1rem;
--gog-text-lg: 1.125rem;
--gog-text-xl: 1.5rem;
--gog-text-2xl: 2rem;
--gog-text-3xl: 3rem;
}
/* ── Palette — Light (also the default with no data-theme set) ──────────── */
:root,
[data-theme='light'] {
color-scheme: light;
--gog-background-color: #f6f0e6;
--gog-surface-color: #eae0d0;
--gog-hover-color: #dfd3bf;
--gog-border-color: #c4b496;
--gog-text-color: #1e170e;
--gog-accent-text-color: #ece4d0;
--gog-muted-text-color: #6e5438;
--gog-primary-color: #1e170e;
--gog-accent-color: #8c6200;
--gog-accent-bright: #b8860b;
--gog-accent-dim: #634500;
--gog-accent-pale: #f4e8c1;
--gog-secondary-color: #a07800;
--gog-success-color: #2d6a4f;
--gog-danger-color: #9b2226;
--gog-warning-color: #bb3e03;
--gog-info-color: #4a6fa5;
--gog-panel-shadow: 0 12px 28px rgba(30, 23, 14, 0.08);
--gog-spinner-overlay-bg: rgba(246, 240, 230, 0.75);
}
/*
* ── Palette — Dark ─────────────────────────────────────────────────────────
* Same tokens as the light block above, just different values — that's the
* whole pattern for any theme-specific override. Scope it under
* [data-theme='dark'], not a bare :root, or it also becomes the light theme.
*/
[data-theme='dark'] {
color-scheme: dark;
--gog-background-color: #0f0d0a;
--gog-surface-color: #191510;
--gog-hover-color: #262018;
--gog-border-color: #382e22;
--gog-text-color: #e5dec9;
--gog-accent-text-color: #e5dec9;
--gog-muted-text-color: #9e8c72;
--gog-primary-color: #e5dec9;
--gog-accent-color: #f3be3a;
--gog-accent-bright: #ffd05b;
--gog-accent-dim: #b5881a;
--gog-accent-pale: #3d2f0e;
--gog-secondary-color: #d4a373;
--gog-success-color: #52b788;
--gog-danger-color: #e63946;
--gog-warning-color: #f4a261;
--gog-info-color: #64dfdf;
--gog-panel-shadow: 0 14px 34px rgba(0, 0, 0, 0.5);
--gog-spinner-overlay-bg: rgba(15, 13, 10, 0.75);
}
/*
* ── Structure — spacing, radius, borders, motion, focus ─────────────────────
* The geometry every component sizes itself from. Change these to shift the
* whole library's density and shape without touching a single color.
*/
:root {
--gog-space-xs: 4px;
--gog-space-sm: 8px;
--gog-space-md: 16px;
--gog-space-lg: 24px;
--gog-space-2xl: 48px;
--gog-radius: 8px;
--gog-panel-radius: calc(var(--gog-radius) + 8px);
--gog-panel-border-width: 1px;
--gog-panel-border-style: solid;
--gog-duration-fast: 0.12s;
--gog-duration-base: 0.15s;
--gog-duration-slow: 0.2s;
--gog-easing: ease;
--gog-focus-ring-width: 3px;
--gog-focus-ring-offset: 2px;
--gog-disabled-opacity: 0.4;
/* Shared by every form control (button, field, checkbox) */
--gog-control-padding-y: 10px;
--gog-control-padding-x: 14px;
--gog-control-icon-offset: 10px;
--gog-control-border-width: 2px;
--gog-control-border-style: solid;
--gog-icon-size: 1.2em;
--gog-icon-stroke-width: 2;
--gog-icon-fallback-size: 1em;
/* Stacking order for dropdown panels and the spinner overlay */
--gog-dropdown-z: 300;
--gog-spinner-overlay-z: 8000;
}
/*
* ── Component tokens — full ─────────────────────────────────────────────────
* Every color, font, border, radius, shadow, padding and duration a component
* paints with, grouped by component. Everything here derives from the palette
* and structure above, so a palette swap already carries through — override a
* token directly only when that one component needs to differ from the rest.
*/
:root,
[data-theme] {
/* Accordion */
--gog-accordion-font-family: var(--gog-font-heading);
--gog-accordion-body-font-family: var(--gog-font-body);
--gog-accordion-border-color: var(--gog-accent-dim);
--gog-accordion-border-width: var(--gog-control-border-width);
--gog-accordion-border-style: var(--gog-control-border-style);
--gog-accordion-text-color: var(--gog-text-color);
--gog-accordion-accent-color: var(--gog-accent-color);
--gog-accordion-hover-bg: color-mix(in srgb, var(--gog-accent-dim) 10%, transparent);
--gog-accordion-hover-ring: color-mix(in srgb, var(--gog-accent-color) 30%, transparent);
--gog-accordion-focus-ring-width: var(--gog-focus-ring-width);
--gog-accordion-body-color: var(--gog-text-color);
--gog-accordion-body-line-height: 1.6;
--gog-accordion-header-text-transform: uppercase;
--gog-accordion-header-gap: 12px;
--gog-accordion-disabled-opacity: 0.5;
--gog-accordion-transition-duration: var(--gog-duration-base);
--gog-accordion-body-transition-duration: var(--gog-duration-slow);
--gog-accordion-chevron-transition-duration: var(--gog-duration-slow);
--gog-accordion-body-lift: -2px;
/* Flat by default — corner rounding is a look, not a given. */
--gog-accordion-radius: 0px;
--gog-accordion-body-radius: 0px;
--gog-accordion-header-bg: transparent;
--gog-accordion-body-bg: color-mix(in srgb, black 6%, transparent);
/* Per-size metrics (xsm/sm/md/lg/slg) — lg is the default size. */
--gog-accordion-xsm-padding-y: 4px;
--gog-accordion-xsm-padding-x: 8px;
--gog-accordion-xsm-font-size: var(--gog-text-xs);
--gog-accordion-xsm-letter-spacing: 0.2px;
--gog-accordion-xsm-content-gap: 2px;
--gog-accordion-xsm-body-font-size: var(--gog-text-xs);
--gog-accordion-xsm-body-line-height: 1.5;
--gog-accordion-xsm-body-padding-top: 4px;
--gog-accordion-xsm-body-padding-bottom: 6px;
--gog-accordion-xsm-chevron-size: 11px;
--gog-accordion-xsm-chevron-font-size: 10px;
--gog-accordion-sm-padding-y: 6px;
--gog-accordion-sm-padding-x: 10px;
--gog-accordion-sm-font-size: var(--gog-text-xs);
--gog-accordion-sm-letter-spacing: 0.4px;
--gog-accordion-sm-content-gap: 2px;
--gog-accordion-sm-body-font-size: var(--gog-text-xs);
--gog-accordion-sm-body-line-height: var(--gog-accordion-body-line-height);
--gog-accordion-sm-body-padding-top: 6px;
--gog-accordion-sm-body-padding-bottom: 8px;
--gog-accordion-sm-chevron-size: 13px;
--gog-accordion-sm-chevron-font-size: 12px;
--gog-accordion-md-padding-y: 10px;
--gog-accordion-md-padding-x: 14px;
--gog-accordion-md-font-size: var(--gog-text-xs);
--gog-accordion-md-letter-spacing: 0.8px;
--gog-accordion-md-content-gap: 2px;
--gog-accordion-md-body-font-size: var(--gog-text-sm);
--gog-accordion-md-body-line-height: var(--gog-accordion-body-line-height);
--gog-accordion-md-body-padding-top: 8px;
--gog-accordion-md-body-padding-bottom: 12px;
--gog-accordion-md-chevron-size: 15px;
--gog-accordion-md-chevron-font-size: 14px;
--gog-accordion-lg-padding-y: 14px;
--gog-accordion-lg-padding-x: 16px;
--gog-accordion-lg-font-size: var(--gog-text-sm);
--gog-accordion-lg-letter-spacing: 0.8px;
--gog-accordion-lg-content-gap: 4px;
--gog-accordion-lg-body-font-size: var(--gog-text-md);
--gog-accordion-lg-body-line-height: var(--gog-accordion-body-line-height);
--gog-accordion-lg-body-padding-top: 12px;
--gog-accordion-lg-body-padding-bottom: 16px;
--gog-accordion-lg-chevron-size: 18px;
--gog-accordion-lg-chevron-font-size: 16px;
--gog-accordion-slg-padding-y: 18px;
--gog-accordion-slg-padding-x: 18px;
--gog-accordion-slg-font-size: var(--gog-text-md);
--gog-accordion-slg-letter-spacing: 0.8px;
--gog-accordion-slg-content-gap: 4px;
--gog-accordion-slg-body-font-size: var(--gog-text-lg);
--gog-accordion-slg-body-line-height: var(--gog-accordion-body-line-height);
--gog-accordion-slg-body-padding-top: 16px;
--gog-accordion-slg-body-padding-bottom: 20px;
--gog-accordion-slg-chevron-size: 20px;
--gog-accordion-slg-chevron-font-size: 18px;
/* Collapsible — headless: the trigger/content elements a consumer projects are styled
via the global .gog-collapsible__* classes in utilities.css, not a scoped stylesheet. */
--gog-collapsible-transition-duration: var(--gog-duration-slow);
/* Generous fixed cap rather than a measured height — override per-instance if a
particular panel's content can exceed this. */
--gog-collapsible-max-height: 480px;
--gog-collapsible-disabled-opacity: var(--gog-disabled-opacity);
/* Button — the unsuffixed --gog-btn-bg/-color/-border/-shadow/-padding/-font-size
are intentionally left undeclared: the per-instance escape hatch variant/size
classes fall back through, e.g. <gog-button style="--gog-btn-bg: #ff4edb"> */
--gog-btn-font-family: var(--gog-font-heading);
--gog-btn-font-weight: 900;
--gog-btn-letter-spacing: 1px;
--gog-btn-text-transform: uppercase;
--gog-btn-line-height: 1;
--gog-btn-gap: var(--gog-space-sm);
--gog-btn-radius: var(--gog-radius);
--gog-btn-border-width: var(--gog-control-border-width);
--gog-btn-border-style: var(--gog-control-border-style);
--gog-btn-transition-duration: var(--gog-duration-base);
--gog-btn-focus-ring-width: var(--gog-focus-ring-width);
--gog-btn-focus-ring-offset: 3px;
--gog-btn-active-scale: 0.97;
--gog-btn-disabled-opacity: var(--gog-disabled-opacity);
--gog-btn-loading-opacity: 0.7;
--gog-btn-spinner-max-size: 70%;
--gog-btn-primary-bg: var(--gog-accent-color);
--gog-btn-primary-color: var(--gog-accent-text-color, var(--gog-primary-color));
--gog-btn-primary-border: transparent;
--gog-btn-primary-shadow: none;
--gog-btn-primary-hover-bg: var(--gog-accent-bright);
--gog-btn-primary-hover-color: var(--gog-btn-primary-color);
--gog-btn-primary-hover-shadow: 0 0 16px
color-mix(in srgb, var(--gog-accent-bright) 45%, transparent);
--gog-btn-primary-spinner-color: var(--gog-text-color);
--gog-btn-secondary-bg: var(--gog-secondary-color);
--gog-btn-secondary-color: var(--gog-accent-text-color, var(--gog-primary-color));
--gog-btn-secondary-border: transparent;
--gog-btn-secondary-shadow: none;
--gog-btn-secondary-hover-bg: var(--gog-accent-color);
--gog-btn-secondary-hover-color: var(--gog-btn-secondary-color);
--gog-btn-secondary-hover-shadow: none;
--gog-btn-secondary-spinner-color: var(--gog-text-color);
--gog-btn-outline-bg: transparent;
--gog-btn-outline-color: var(--gog-accent-color);
--gog-btn-outline-border: var(--gog-accent-color);
--gog-btn-outline-shadow: none;
--gog-btn-outline-hover-bg: var(--gog-accent-color);
--gog-btn-outline-hover-color: var(--gog-primary-color);
--gog-btn-outline-hover-shadow: none;
--gog-btn-outline-spinner-color: var(--gog-accent-color);
--gog-btn-ghost-bg: transparent;
--gog-btn-ghost-color: var(--gog-accent-color);
--gog-btn-ghost-border: transparent;
--gog-btn-ghost-shadow: none;
--gog-btn-ghost-hover-bg: color-mix(in srgb, var(--gog-accent-color) 12%, transparent);
--gog-btn-ghost-hover-color: var(--gog-btn-ghost-color);
--gog-btn-ghost-hover-shadow: none;
--gog-btn-ghost-spinner-color: var(--gog-accent-color);
/* Per-size padding & font-size (xsm/sm/md/lg/slg) */
--gog-btn-xsm-padding: 0.25rem 0.5rem;
--gog-btn-sm-padding: 0.5rem 0.875rem;
--gog-btn-md-padding: 0.75rem 1.25rem;
--gog-btn-lg-padding: 1rem 1.5rem;
--gog-btn-slg-padding: 1.25rem 1.75rem;
--gog-btn-xsm-font-size: 0.75rem;
--gog-btn-sm-font-size: 0.875rem;
--gog-btn-md-font-size: 1rem;
--gog-btn-lg-font-size: 1.125rem;
--gog-btn-slg-font-size: 1.25rem;
/* Checkbox */
--gog-checkbox-font-family: var(--gog-font-body);
--gog-checkbox-gap: 10px;
--gog-checkbox-radius: var(--gog-radius);
--gog-checkbox-border-width: var(--gog-control-border-width);
--gog-checkbox-border-style: var(--gog-control-border-style);
--gog-checkbox-border-color: var(--gog-accent-dim);
--gog-checkbox-bg: var(--gog-surface-color);
--gog-checkbox-checked-bg: var(--gog-accent-color);
--gog-checkbox-checked-border: var(--gog-accent-color);
--gog-checkbox-icon-color: var(--gog-accent-text-color, var(--gog-primary-color));
--gog-checkbox-label-color: var(--gog-muted-text-color);
--gog-checkbox-label-line-height: 1.3;
--gog-checkbox-focus-ring: color-mix(in srgb, var(--gog-accent-color) 25%, transparent);
--gog-checkbox-focus-ring-width: var(--gog-focus-ring-width);
--gog-checkbox-focus-ring-offset: var(--gog-focus-ring-offset);
--gog-checkbox-disabled-opacity: var(--gog-disabled-opacity);
--gog-checkbox-transition-duration: var(--gog-duration-base);
--gog-checkbox-dash-width-ratio: 0.45;
--gog-checkbox-dash-height: 2px;
--gog-checkbox-dash-radius: 999px;
/* Box/label/icon size per size step (xsm/sm/md/lg/slg) */
--gog-control-checkbox-padding: 6px;
--gog-control-checkbox-box-size-xsm: 12px;
--gog-control-checkbox-box-size-sm: 18px;
--gog-control-checkbox-box-size-md: 24px;
--gog-control-checkbox-box-size-lg: 32px;
--gog-control-checkbox-box-size-slg: 40px;
--gog-control-checkbox-label-size-xsm: 0.6875rem;
--gog-control-checkbox-label-size-sm: 0.8125rem;
--gog-control-checkbox-label-size-md: 0.9375rem;
--gog-control-checkbox-label-size-lg: 1.0625rem;
--gog-control-checkbox-label-size-slg: 1.1875rem;
--gog-control-checkbox-icon-size-xsm: 10px;
--gog-control-checkbox-icon-size-sm: 12px;
--gog-control-checkbox-icon-size-md: 14px;
--gog-control-checkbox-icon-size-lg: 18px;
--gog-control-checkbox-icon-size-slg: 22px;
/* Chip — the unsuffixed --gog-chip-font-size/-padding-`*`/-gap/-avatar-size/-icon-size/
-remove-size are the per-instance escape hatch, left undeclared on purpose. */
--gog-chip-font-family: inherit;
--gog-chip-bg: color-mix(in srgb, var(--gog-surface-color) 88%, var(--gog-hover-color));
--gog-chip-hover-bg: color-mix(in srgb, var(--gog-hover-color) 45%, var(--gog-surface-color));
--gog-chip-border: var(--gog-border-color);
--gog-chip-border-width: 1px;
--gog-chip-border-style: solid;
--gog-chip-color: var(--gog-text-color);
--gog-chip-font-weight: 500;
--gog-chip-line-height: 1.2;
--gog-chip-radius: max(var(--gog-radius), 2px);
--gog-chip-pill-radius: 9999px;
--gog-chip-remove-color: var(--gog-muted-text-color);
--gog-chip-remove-hover-color: var(--gog-text-color);
--gog-chip-remove-scale: 1.1;
--gog-chip-avatar-inset-ratio: 0.9;
--gog-chip-remove-inset-ratio: 0.85;
--gog-chip-disabled-opacity: 0.55;
--gog-chip-focus-ring-width: 2px;
--gog-chip-focus-ring-offset: var(--gog-focus-ring-offset);
--gog-chip-xsm-font-size: 0.6875rem;
--gog-chip-xsm-padding-block: 0.225rem;
--gog-chip-xsm-padding-inline: 0.375rem;
--gog-chip-xsm-gap: 0.275rem;
--gog-chip-xsm-avatar-size: 0.875rem;
--gog-chip-xsm-icon-size: 0.6875rem;
--gog-chip-xsm-remove-size: 0.75rem;
--gog-chip-sm-font-size: 0.75rem;
--gog-chip-sm-padding-block: 0.3rem;
--gog-chip-sm-padding-inline: 0.5rem;
--gog-chip-sm-gap: 0.375rem;
--gog-chip-sm-avatar-size: 1rem;
--gog-chip-sm-icon-size: 0.75rem;
--gog-chip-sm-remove-size: 0.875rem;
--gog-chip-md-font-size: 0.875rem;
--gog-chip-md-padding-block: 0.45rem;
--gog-chip-md-padding-inline: 0.75rem;
--gog-chip-md-gap: 0.5rem;
--gog-chip-md-avatar-size: 1.25rem;
--gog-chip-md-icon-size: 0.875rem;
--gog-chip-md-remove-size: 1rem;
--gog-chip-lg-font-size: 1rem;
--gog-chip-lg-padding-block: 0.6rem;
--gog-chip-lg-padding-inline: 0.875rem;
--gog-chip-lg-gap: 0.625rem;
--gog-chip-lg-avatar-size: 1.5rem;
--gog-chip-lg-icon-size: 1rem;
--gog-chip-lg-remove-size: 1.125rem;
--gog-chip-slg-font-size: 1.125rem;
--gog-chip-slg-padding-block: 0.75rem;
--gog-chip-slg-padding-inline: 1rem;
--gog-chip-slg-gap: 0.75rem;
--gog-chip-slg-avatar-size: 1.75rem;
--gog-chip-slg-icon-size: 1.125rem;
--gog-chip-slg-remove-size: 1.25rem;
/* Dialog (incl. confirmation dialog variant) */
--gog-dialog-font-family: var(--gog-font-heading);
/* Flat value on purpose — the scrim must read the same over any page content. */
--gog-dialog-backdrop-bg: rgba(10, 8, 3, 0.72);
--gog-dialog-backdrop-blur: 2px;
--gog-dialog-backdrop-padding: var(--gog-space-lg);
--gog-dialog-backdrop-fade-duration: var(--gog-duration-base);
--gog-dialog-enter-duration: var(--gog-duration-slow);
--gog-dialog-enter-distance: -12px;
--gog-dialog-bg: var(--gog-surface-color);
--gog-dialog-color: var(--gog-text-color);
--gog-dialog-border: var(--gog-border-color);
--gog-dialog-border-width: var(--gog-panel-border-width);
--gog-dialog-border-style: var(--gog-panel-border-style);
--gog-dialog-radius: var(--gog-radius);
--gog-dialog-shadow: 0 24px 48px rgba(0, 0, 0, 0.5);
--gog-dialog-min-width: 320px;
--gog-dialog-max-height: 90vh;
--gog-dialog-header-padding: 16px 20px 14px;
--gog-dialog-header-gap: 12px;
--gog-dialog-header-border-color: var(--gog-border-color);
--gog-dialog-body-padding: 20px;
--gog-dialog-body-max-height: calc(var(--gog-dialog-max-height) - 60px);
--gog-dialog-close-size: 2rem;
--gog-dialog-close-font-size: 0.875rem;
--gog-dialog-close-color: var(--gog-muted-text-color);
--gog-dialog-close-hover-color: var(--gog-text-color);
--gog-dialog-close-hover-bg: color-mix(in srgb, var(--gog-hover-color) 70%, transparent);
--gog-dialog-close-hover-border: var(--gog-border-color);
--gog-dialog-close-focus-ring: var(--gog-accent-color);
--gog-dialog-close-focus-ring-width: var(--gog-focus-ring-width);
--gog-dialog-close-focus-ring-offset: var(--gog-focus-ring-offset);
--gog-confirm-gap: 12px;
--gog-confirm-min-width: 320px;
--gog-confirm-max-width: 440px;
--gog-confirm-color: var(--gog-text-color);
--gog-confirm-description-color: var(--gog-muted-text-color);
--gog-confirm-actions-gap: var(--gog-space-sm);
--gog-confirm-actions-offset: var(--gog-space-sm);
/* Input field */
--gog-input-font-family: var(--gog-font-body);
--gog-input-label-font-family: var(--gog-font-heading);
--gog-input-gap: 4px;
--gog-input-label-color: var(--gog-accent-color);
--gog-input-label-font-size: var(--gog-text-sm);
--gog-input-label-letter-spacing: 1px;
--gog-input-label-text-transform: uppercase;
--gog-input-field-bg: var(--gog-surface-color);
--gog-input-field-border: var(--gog-accent-dim);
--gog-input-field-border-width: var(--gog-control-border-width);
--gog-input-field-border-style: var(--gog-control-border-style);
--gog-input-radius: var(--gog-radius);
--gog-input-field-color: var(--gog-text-color);
--gog-input-placeholder-color: var(--gog-muted-text-color);
--gog-input-focus-border: var(--gog-accent-color);
--gog-input-focus-ring: color-mix(in srgb, var(--gog-accent-color) 25%, transparent);
--gog-input-focus-glow: 0 0 8px var(--gog-input-focus-ring);
--gog-input-focus-ring-width: var(--gog-focus-ring-width);
--gog-input-focus-ring-offset: var(--gog-focus-ring-offset);
--gog-input-error-color: var(--gog-danger-color);
--gog-input-error-font-size: var(--gog-text-xs);
--gog-input-error-offset: 2px;
--gog-input-icon-color: var(--gog-muted-text-color);
--gog-input-icon-hover-color: var(--gog-accent-color);
--gog-input-icon-action-radius: 4px;
--gog-input-icon-focus-ring-width: 2px;
--gog-input-disabled-opacity: var(--gog-disabled-opacity);
--gog-input-transition-duration: var(--gog-duration-base);
/* Field sizing — shared by Input, Select and Multiselect */
--gog-field-xsm-padding-y: 4px;
--gog-field-xsm-padding-x: 8px;
--gog-field-xsm-icon-offset: 6px;
--gog-field-xsm-icon-inset: 24px;
--gog-field-xsm-font-size: var(--gog-text-xs);
--gog-field-sm-padding-y: 6px;
--gog-field-sm-padding-x: 10px;
--gog-field-sm-icon-offset: 8px;
--gog-field-sm-icon-inset: 30px;
--gog-field-sm-font-size: var(--gog-text-sm);
--gog-field-md-padding-y: var(--gog-control-padding-y);
--gog-field-md-padding-x: var(--gog-control-padding-x);
--gog-field-md-icon-offset: var(--gog-control-icon-offset);
--gog-field-md-icon-inset: 36px;
--gog-field-md-font-size: var(--gog-text-md);
--gog-field-lg-padding-y: 14px;
--gog-field-lg-padding-x: 18px;
--gog-field-lg-icon-offset: 14px;
--gog-field-lg-icon-inset: 44px;
--gog-field-lg-font-size: var(--gog-text-lg);
--gog-field-slg-padding-y: 18px;
--gog-field-slg-padding-x: 22px;
--gog-field-slg-icon-offset: 18px;
--gog-field-slg-icon-inset: 52px;
--gog-field-slg-font-size: 1.25rem;
/* Multiselect */
--gog-ms-font-family: var(--gog-font-body);
--gog-ms-label-font-family: var(--gog-font-heading);
--gog-ms-gap: 4px;
--gog-ms-option-gap: 4px;
--gog-ms-options-padding: 4px;
--gog-ms-label-color: var(--gog-accent-color);
--gog-ms-label-font-size: var(--gog-text-sm);
--gog-ms-label-letter-spacing: 1px;
--gog-ms-label-text-transform: uppercase;
--gog-ms-field-bg: var(--gog-surface-color);
--gog-ms-field-border: var(--gog-accent-dim);
--gog-ms-field-border-width: var(--gog-control-border-width);
--gog-ms-field-border-style: var(--gog-control-border-style);
--gog-ms-radius: var(--gog-radius);
--gog-ms-field-color: var(--gog-text-color);
--gog-ms-value-color: var(--gog-text-color);
--gog-ms-placeholder-color: var(--gog-muted-text-color);
--gog-ms-focus-border: var(--gog-accent-color);
--gog-ms-focus-ring: color-mix(in srgb, var(--gog-accent-color) 25%, transparent);
--gog-ms-focus-glow: 0 0 8px var(--gog-ms-focus-ring);
--gog-ms-focus-ring-width: var(--gog-focus-ring-width);
--gog-ms-focus-ring-offset: var(--gog-focus-ring-offset);
--gog-ms-error-color: var(--gog-danger-color);
--gog-ms-error-font-size: var(--gog-text-xs);
--gog-ms-error-offset: 2px;
--gog-ms-border-color: var(--gog-accent-color);
--gog-ms-panel-bg: var(--gog-surface-color);
--gog-ms-panel-border: var(--gog-accent-color);
--gog-ms-panel-shadow: var(--gog-panel-shadow);
--gog-ms-panel-max-height: 260px;
--gog-ms-panel-offset: 2px;
--gog-ms-option-hover-bg: color-mix(in srgb, var(--gog-accent-color) 10%, transparent);
--gog-ms-option-color: var(--gog-text-color);
--gog-ms-option-gap-inline: 10px;
--gog-ms-option-height: 40px;
--gog-ms-option-radius: calc(var(--gog-radius) - 2px);
--gog-ms-option-disabled-opacity: 0.5;
--gog-ms-option-transition-duration: var(--gog-duration-fast);
--gog-ms-checkbox-border: var(--gog-accent-dim);
--gog-ms-checkbox-bg: var(--gog-background-color);
--gog-ms-checkbox-checked-bg: var(--gog-accent-color);
--gog-ms-checkbox-checked-color: var(--gog-primary-color);
--gog-ms-controls-gap: 4px;
--gog-ms-controls-padding: 6px 10px;
--gog-ms-actions-gap: 6px;
--gog-ms-clear-radius: 2px;
--gog-ms-disabled-opacity: var(--gog-disabled-opacity);
--gog-ms-transition-duration: var(--gog-duration-base);
--gog-ms-arrow-transition-duration: var(--gog-duration-slow);
--gog-ms-clear-icon-ratio: 0.7;
--gog-ms-arrow-icon-ratio: 0.875;
--gog-ms-mark-size-ratio: 1.2375;
--gog-ms-mark-icon-ratio: 1.125;
/* Paginator */
--gog-paginator-gap: 4px;
--gog-paginator-ellipsis-color: var(--gog-muted-text-color);
--gog-paginator-ellipsis-font-size: var(--gog-text-sm);
--gog-paginator-ellipsis-font-family: var(--gog-font-body);
--gog-paginator-ellipsis-min-width: 32px;
/* Scroll */
--gog-scroll-track-bg: transparent;
--gog-scroll-track-radius: var(--gog-radius);
--gog-scroll-thumb-bg: var(--gog-accent-dim);
--gog-scroll-thumb-hover-bg: var(--gog-accent-color);
--gog-scroll-thumb-active-bg: var(--gog-accent-bright);
--gog-scroll-thumb-radius: var(--gog-radius);
--gog-scroll-thumb-inset: 2px;
--gog-scroll-corner-bg: transparent;
--gog-scroll-fade-duration: var(--gog-duration-base);
--gog-scroll-focus-ring: var(--gog-accent-color);
--gog-scroll-focus-ring-width: var(--gog-focus-ring-width);
/* Two-tier track-width/thumb-min-size pair the `size="thin"` input switches between;
`normal` is the unmarked default. */
--gog-scroll-normal-track-width: 10px;
--gog-scroll-thin-track-width: 6px;
--gog-scroll-normal-thumb-min-size: 32px;
--gog-scroll-thin-thumb-min-size: 24px;
/* Select */
--gog-select-font-family: var(--gog-font-body);
--gog-select-label-font-family: var(--gog-font-heading);
--gog-select-gap: 4px;
--gog-select-label-color: var(--gog-accent-color);
--gog-select-label-font-size: var(--gog-text-sm);
--gog-select-label-letter-spacing: 1px;
--gog-select-label-text-transform: uppercase;
--gog-select-field-bg: var(--gog-surface-color);
--gog-select-field-border: var(--gog-accent-dim);
--gog-select-field-border-width: var(--gog-control-border-width);
--gog-select-field-border-style: var(--gog-control-border-style);
--gog-select-radius: var(--gog-radius);
--gog-select-field-color: var(--gog-text-color);
--gog-select-placeholder-color: var(--gog-muted-text-color);
--gog-select-focus-border: var(--gog-accent-color);
--gog-select-focus-ring: color-mix(in srgb, var(--gog-accent-color) 25%, transparent);
--gog-select-focus-glow: 0 0 8px var(--gog-select-focus-ring);
--gog-select-focus-ring-width: var(--gog-focus-ring-width);
--gog-select-focus-ring-offset: var(--gog-focus-ring-offset);
--gog-select-error-color: var(--gog-danger-color);
--gog-select-error-font-size: var(--gog-text-xs);
--gog-select-chevron-color: var(--gog-accent-color);
--gog-select-chevron-inset: 40px;
--gog-select-control-gap: 12px;
--gog-select-panel-bg: var(--gog-surface-color);
--gog-select-panel-shadow: var(--gog-panel-shadow);
--gog-select-panel-max-height: 260px;
--gog-select-panel-offset: 2px;
--gog-select-option-hover-bg: color-mix(in srgb, var(--gog-accent-color) 10%, transparent);
--gog-select-option-selected-color: var(--gog-accent-color);
--gog-select-option-color: var(--gog-text-color);
--gog-select-option-gap: 10px;
--gog-select-option-height: 40px;
--gog-select-option-disabled-opacity: 0.5;
--gog-select-option-transition-duration: var(--gog-duration-fast);
--gog-select-chevron-icon-ratio: 0.875;
--gog-select-mark-size-ratio: 1.125;
--gog-select-mark-icon-ratio: 0.875;
--gog-select-disabled-opacity: var(--gog-disabled-opacity);
--gog-select-transition-duration: var(--gog-duration-base);
/* Skeleton */
--gog-skeleton-base: color-mix(in srgb, var(--gog-border-color) 40%, var(--gog-surface-color));
--gog-skeleton-shine: color-mix(in srgb, var(--gog-skeleton-base), white 35%);
--gog-skeleton-radius: var(--gog-radius);
--gog-skeleton-square-radius: 0px;
--gog-skeleton-line-radius: calc(var(--gog-skeleton-radius) / 2);
--gog-skeleton-line-gap: var(--gog-space-sm);
--gog-skeleton-short-line-width: 60%;
--gog-skeleton-pulse-duration: 1.6s;
--gog-skeleton-pulse-min-opacity: 0.5;
--gog-skeleton-wave-duration: 1.6s;
--gog-skeleton-line-height-xsm: 8px;
--gog-skeleton-line-height-sm: 10px;
--gog-skeleton-line-height-md: 14px;
--gog-skeleton-line-height-lg: 18px;
--gog-skeleton-line-height-slg: 24px;
--gog-skeleton-circle-size-xsm: 24px;
--gog-skeleton-circle-size-sm: 32px;
--gog-skeleton-circle-size-md: 48px;
--gog-skeleton-circle-size-lg: 64px;
--gog-skeleton-circle-size-slg: 96px;
--gog-skeleton-rect-height-xsm: 40px;
--gog-skeleton-rect-height-sm: 64px;
--gog-skeleton-rect-height-md: 120px;
--gog-skeleton-rect-height-lg: 200px;
--gog-skeleton-rect-height-slg: 320px;
/* Slider */
--gog-slider-auto-width: 240px;
--gog-slider-label-font-family: var(--gog-font-heading);
--gog-slider-value-font-family: var(--gog-font-mono);
--gog-slider-error-font-family: var(--gog-font-body);
--gog-slider-gap: 6px;
--gog-slider-label-color: var(--gog-accent-color);
--gog-slider-label-font-size: var(--gog-text-sm);
--gog-slider-label-letter-spacing: 1px;
--gog-slider-label-text-transform: uppercase;
--gog-slider-value-color: var(--gog-accent-color);
--gog-slider-value-font-size: var(--gog-text-sm);
--gog-slider-value-min-width: 40px;
--gog-slider-track-height: 4px;
--gog-slider-track-area-height: 20px;
--gog-slider-track-radius: 0px;
--gog-slider-track-bg: var(--gog-accent-dim);
--gog-slider-fill-bg: var(--gog-accent-color);
--gog-slider-thumb-size: 16px;
--gog-slider-thumb-bg: var(--gog-accent-color);
--gog-slider-thumb-border: var(--gog-background-color);
--gog-slider-thumb-border-width: 2px;
--gog-slider-thumb-radius: 50%;
--gog-slider-thumb-shadow: color-mix(in srgb, var(--gog-accent-bright) 40%, transparent);
--gog-slider-thumb-glow-size: 6px;
--gog-slider-focus-ring: color-mix(in srgb, var(--gog-accent-color) 30%, transparent);
--gog-slider-focus-ring-width: var(--gog-focus-ring-width);
--gog-slider-range-color: var(--gog-muted-text-color);
--gog-slider-range-font-size: var(--gog-text-xs);
--gog-slider-error-color: var(--gog-danger-color);
--gog-slider-error-font-size: var(--gog-text-xs);
--gog-slider-disabled-opacity: var(--gog-disabled-opacity);
/* Spinner */
--gog-spinner-rune-font-family: var(--gog-font-heading);
--gog-spinner-track-color: var(--gog-accent-dim);
--gog-spinner-arc-outer-color: var(--gog-accent-color);
--gog-spinner-arc-inner-color: var(--gog-accent-bright);
--gog-spinner-diamond-color: var(--gog-accent-bright);
--gog-spinner-rune-color: var(--gog-accent-bright);
--gog-spinner-glow-color: var(--gog-accent-color);
--gog-spinner-track-opacity: 0.35;
--gog-spinner-arc-inner-opacity: 0.75;
--gog-spinner-diamond-opacity: 0.85;
--gog-spinner-arc-outer-pulse-opacity: 0.8;
--gog-spinner-arc-inner-pulse-opacity: 0.45;
--gog-spinner-rune-pulse-opacity: 0.4;
--gog-spinner-arc-outer-dash: 100 63;
--gog-spinner-arc-inner-dash: 35 78;
--gog-spinner-arc-inner-stroke-compact: 1;
--gog-spinner-spin-duration: 1.4s;
--gog-spinner-spin-slow-duration: 2s;
--gog-spinner-ticks-duration: 6s;
--gog-spinner-pulse-duration: 2.8s;
--gog-spinner-ring-duration: 1s;
--gog-spinner-ring-padding: 16%;
--gog-spinner-arc-outer-glow: 5px;
--gog-spinner-arc-inner-glow: 4px;
--gog-spinner-diamond-glow: 3px;
--gog-spinner-rune-glow: 6px;
--gog-spinner-ring-glow: 5px;
--gog-spinner-overlay-blur: 3px;
--gog-spinner-overlay-fade-duration: var(--gog-duration-slow);
--gog-spinner-size-xsm: 12px;
--gog-spinner-size-sm: 18px;
--gog-spinner-size-md: 48px;
--gog-spinner-size-lg: 96px;
--gog-spinner-size-slg: 144px;
--gog-spinner-rune-size: 20px;
/* Table */
--gog-table-font-family: var(--gog-font-body);
--gog-table-header-font-family: var(--gog-font-heading);
--gog-table-numeric-font-family: var(--gog-font-mono);
--gog-table-gap: 12px;
--gog-table-border-color: var(--gog-accent-dim);
--gog-table-border-width: 2px;
--gog-table-border-style: solid;
--gog-table-row-border-width: 1px;
--gog-table-surface: var(--gog-surface-color);
--gog-table-text-color: var(--gog-text-color);
--gog-table-accent-color: var(--gog-accent-color);
--gog-table-accent-bright: var(--gog-accent-bright);
--gog-table-hover-bg: var(--gog-accent-pale);
--gog-table-muted-color: var(--gog-muted-text-color);
--gog-table-focus-ring: var(--gog-accent-color);
--gog-table-focus-ring-width: var(--gog-focus-ring-width);
--gog-table-header-letter-spacing: 1px;
--gog-table-header-text-transform: uppercase;
--gog-table-num-col-width: 48px;
--gog-table-th-inner-gap: 6px;
--gog-table-sort-icon-size: 0.9em;
--gog-table-sort-icon-width: 1.1em;
--gog-table-sort-icon-opacity: 0.6;
--gog-table-empty-padding: 24px 14px;
--gog-table-empty-font-size: var(--gog-text-md);
--gog-table-loading-padding: 32px 14px;
--gog-table-loading-opacity: 0.5;
--gog-table-row-transition-duration: var(--gog-duration-fast);
--gog-table-footer-gap: var(--gog-space-sm);
--gog-table-footer-min-height: 32px;
--gog-table-total-font-size: var(--gog-text-xs);
--gog-table-total-letter-spacing: 0.5px;
--gog-table-total-text-transform: uppercase;
--gog-table-num-font-size: var(--gog-text-xs);
--gog-table-padding-h: 14px;
--gog-table-xsm-padding-v: 2px;
--gog-table-xsm-th-font-size: var(--gog-text-xs);
--gog-table-xsm-td-font-size: var(--gog-text-xs);
--gog-table-sm-padding-v: 3px;
--gog-table-sm-th-font-size: var(--gog-text-xs);
--gog-table-sm-td-font-size: var(--gog-text-xs);
--gog-table-md-padding-v: 6px;
--gog-table-md-th-font-size: var(--gog-text-xs);
--gog-table-md-td-font-size: var(--gog-text-sm);
--gog-table-lg-padding-v: 10px;
--gog-table-lg-th-font-size: var(--gog-text-sm);
--gog-table-lg-td-font-size: var(--gog-text-md);
--gog-table-slg-padding-v: 14px;
--gog-table-slg-th-font-size: var(--gog-text-md);
--gog-table-slg-td-font-size: var(--gog-text-lg);
/* Tag — the unsuffixed --gog-tag-bg/-border/-color/-font-size and friends stay
undeclared so variant and size classes can fall through them. */
--gog-tag-font-family: inherit;
--gog-tag-default-color: var(--gog-info-color, var(--gog-muted-text-color));
--gog-tag-success-color: var(--gog-success-color);
--gog-tag-danger-color: var(--gog-danger-color);
--gog-tag-warning-color: var(--gog-warning-color);
--gog-tag-info-color: var(--gog-info-color);
--gog-tag-bg-mix: 10%;
--gog-tag-color-mix: 82%;
--gog-tag-bg-base: var(--gog-surface-color);
--gog-tag-color-base: black;
--gog-tag-border-width: 1px;
--gog-tag-border-style: solid;
--gog-tag-inner-border-width: 1px;
--gog-tag-font-weight: 600;
--gog-tag-line-height: 1;
--gog-tag-radius: max(var(--gog-radius), 2px);
--gog-tag-pill-radius: 9999px;
--gog-tag-xsm-font-size: 0.6875rem;
--gog-tag-xsm-padding-block: 0.1875rem;
--gog-tag-xsm-padding-inline: 0.375rem;
--gog-tag-xsm-gap: 0.1875rem;
--gog-tag-xsm-icon-size: 0.6875rem;
--gog-tag-sm-font-size: 0.75rem;
--gog-tag-sm-padding-block: 0.25rem;
--gog-tag-sm-padding-inline: 0.5rem;
--gog-tag-sm-gap: 0.25rem;
--gog-tag-sm-icon-size: 0.75rem;
--gog-tag-md-font-size: 0.875rem;
--gog-tag-md-padding-block: 0.375rem;
--gog-tag-md-padding-inline: 0.75rem;
--gog-tag-md-gap: 0.375rem;
--gog-tag-md-icon-size: 0.875rem;
--gog-tag-lg-font-size: 1rem;
--gog-tag-lg-padding-block: 0.5rem;
--gog-tag-lg-padding-inline: 0.875rem;
--gog-tag-lg-gap: 0.5rem;
--gog-tag-lg-icon-size: 1rem;
--gog-tag-slg-font-size: 1.125rem;
--gog-tag-slg-padding-block: 0.625rem;
--gog-tag-slg-padding-inline: 1rem;
--gog-tag-slg-gap: 0.625rem;
--gog-tag-slg-icon-size: 1.125rem;
/* Toast */
--gog-toast-font-family: var(--gog-font-body);
--gog-toast-bg: var(--gog-surface-color);
--gog-toast-color: var(--gog-text-color);
--gog-toast-border: var(--gog-accent-color);
--gog-toast-icon-color: var(--gog-accent-color);
--gog-toast-success-color: var(--gog-success-color);
--gog-toast-error-color: var(--gog-danger-color);
--gog-toast-warning-color: var(--gog-accent-bright);
--gog-toast-info-color: var(--gog-accent-color);
--gog-toast-accent-width: 4px;
--gog-toast-padding: 12px 14px;
--gog-toast-radius: 0px;
--gog-toast-content-gap: 10px;
--gog-toast-main-gap: var(--gog-space-sm);
--gog-toast-actions-gap: 6px;
--gog-toast-message-font-size: var(--gog-text-sm);
--gog-toast-message-line-height: 1.5;
--gog-toast-icon-size: 1rem;
--gog-toast-icon-line-height: 1.4;
--gog-toast-action-padding: 0.25rem 0.5rem;
--gog-toast-action-font-size: 0.75rem;
--gog-toast-close-padding: 0.125rem 0.25rem;
--gog-toast-close-font-size: 0.75rem;
--gog-toast-progress-height: 3px;
--gog-toast-progress-opacity: 30%;
--gog-toast-transition-duration: 0.25s;
--gog-toast-base-z: 100;
--gog-toast-min-width: 280px;
--gog-toast-max-width: 400px;
--gog-toast-gap: 10px;
--gog-toast-stack-padding: 16px;
--gog-toast-z-index: 9999;
--gog-toast-enter-distance: 110%;
--gog-toast-shadow: 0 4px 24px rgba(0, 0, 0, 0.25);
--gog-toast-stack-peek: 14px;
--gog-toast-stack-scale-step: 0.06;
--gog-toast-stack-expanded-gap: 84px;
--gog-toast-stack-min-opacity: 0.4;
--gog-toast-stack-opacity-step: 0.18;
--gog-toast-stack-max-depth: 6;
}