@svgrid/grid 2.2.18 → 2.2.20

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -21,6 +21,22 @@ export type ThemePalette = {
21
21
  rowAlt: string;
22
22
  rowHover: string;
23
23
  selectionBg: string;
24
+ /** Inset surface (master-detail region, generated auth pages). Defaults to `headerBg`. */
25
+ bgSubtle?: string;
26
+ /** Underline below the leaf header row, when it should read stronger than a cell border. */
27
+ headerBorder?: string;
28
+ /** Header label color, when it should differ from `headerFg`. */
29
+ headerLabel?: string;
30
+ /** Frozen-column body cells. Without it the grid derives a tint from `headerBg` + `accent`. */
31
+ pinnedBg?: string;
32
+ /** Frozen-column header cells. */
33
+ pinnedHeaderBg?: string;
34
+ /** The 1px line on a pinned column's inside edge. Defaults to `border`. */
35
+ pinnedDivider?: string;
36
+ /** Top/bottom border of pinned ROWS. Defaults to a translucent accent. */
37
+ pinnedBorder?: string;
38
+ /** Drop shadow cast by a pinned column into the scroll area. */
39
+ pinnedShadow?: string;
24
40
  };
25
41
  export type ThemePreset = {
26
42
  /** Stable id, e.g. used as a CSS file name (`themes/<id>.css`). */
@@ -31,10 +47,17 @@ export type ThemePreset = {
31
47
  radius: number;
32
48
  /** Font stack applied to the app surface. */
33
49
  font: string;
50
+ /** Header label typography. Mode-independent, like `radius` and `font`. */
51
+ headerType?: {
52
+ weight?: string;
53
+ size?: string;
54
+ transform?: string;
55
+ tracking?: string;
56
+ };
34
57
  light: ThemePalette;
35
58
  dark: ThemePalette;
36
59
  };
37
- /** The built-in theme presets, in gallery order (default first). */
60
+ /** The built-in theme presets, in gallery order (SvGrid's own theme first). */
38
61
  export declare const themePresets: ThemePreset[];
39
62
  /** The default preset (used when nothing is chosen). */
40
63
  export declare const defaultThemePreset: ThemePreset;
@@ -8,8 +8,27 @@
8
8
  * browser. `@svgrid/enterprise`'s Studio layer builds its `ProjectTheme`-aware
9
9
  * wrapper on top of this module instead of keeping its own copy.
10
10
  */
11
- /** The built-in theme presets, in gallery order (default first). */
11
+ /** The built-in theme presets, in gallery order (SvGrid's own theme first). */
12
12
  export const themePresets = [
13
+ // Ember is SvGrid's signature look - the palette svgrid.com itself runs on, so
14
+ // a screenshot of the site's grids is reproducible with one stylesheet import.
15
+ // It is shaped like the shadcn/ui preset below - white ground, stone neutrals,
16
+ // 6px rounding, a medium-weight muted header row, no zebra - with SvGrid's
17
+ // orange standing in for shadcn's near-black primary. Stone rather than zinc
18
+ // because the neutral has to sit next to orange without going cold, which is
19
+ // the same pairing shadcn's own orange base color makes.
20
+ // Orange is spent only on selection, focus and the active-cell ring; nothing
21
+ // in the chrome is tinted. The frozen columns name a neutral explicitly
22
+ // instead of letting the grid derive a tint from the accent (that tint landed
23
+ // right on top of the selection color).
24
+ { id: 'ember', name: 'Ember', radius: 6, font: 'ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif',
25
+ headerType: { weight: '500' },
26
+ light: { bg: '#ffffff', fg: '#1c1917', muted: '#78716c', border: '#e7e5e4', headerBg: '#fafaf9', headerFg: '#78716c', accent: '#ff3e00', rowAlt: '#ffffff', rowHover: '#f5f5f4', selectionBg: '#ffece3',
27
+ bgSubtle: '#fafaf9',
28
+ pinnedBg: '#fafaf9', pinnedHeaderBg: '#f5f5f4', pinnedDivider: '#e7e5e4', pinnedBorder: '#e7e5e4', pinnedShadow: 'rgba(28, 25, 23, 0.10)' },
29
+ dark: { bg: '#0c0a09', fg: '#fafaf9', muted: '#a8a29e', border: '#292524', headerBg: '#1c1917', headerFg: '#a8a29e', accent: '#ff5a1f', rowAlt: '#0c0a09', rowHover: '#1c1917', selectionBg: '#3a2318',
30
+ bgSubtle: '#1c1917',
31
+ pinnedBg: '#151312', pinnedHeaderBg: '#1c1917', pinnedDivider: '#292524', pinnedBorder: '#292524', pinnedShadow: 'rgba(0, 0, 0, 0.50)' } },
13
32
  { id: 'shadcn', name: 'shadcn/ui', radius: 6, font: 'ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif',
14
33
  light: { bg: '#ffffff', fg: '#09090b', muted: '#71717a', border: '#e4e4e7', headerBg: '#fafafa', headerFg: '#71717a', accent: '#18181b', rowAlt: '#ffffff', rowHover: '#f4f4f5', selectionBg: '#f4f4f5' },
15
34
  dark: { bg: '#0a0a0a', fg: '#fafafa', muted: '#a1a1aa', border: '#27272a', headerBg: '#18181b', headerFg: '#a1a1aa', accent: '#fafafa', rowAlt: '#0a0a0a', rowHover: '#18181b', selectionBg: '#27272a' } },
@@ -96,12 +115,28 @@ export function resolveThemeTokens(preset, mode, accentOverride) {
96
115
  '--sg-border': p.border,
97
116
  '--sg-header-bg': p.headerBg,
98
117
  '--sg-header-fg': p.headerFg,
118
+ ...(p.headerBorder ? { '--sg-header-border': p.headerBorder } : {}),
119
+ ...(p.headerLabel ? { '--sg-header-label-color': p.headerLabel } : {}),
120
+ ...(resolved.headerType?.weight ? { '--sg-header-weight': resolved.headerType.weight } : {}),
121
+ ...(resolved.headerType?.size ? { '--sg-header-size': resolved.headerType.size } : {}),
122
+ ...(resolved.headerType?.transform ? { '--sg-header-transform': resolved.headerType.transform } : {}),
123
+ ...(resolved.headerType?.tracking ? { '--sg-header-tracking': resolved.headerType.tracking } : {}),
99
124
  // A subtle inset surface (used by e.g. the master-detail region behind the
100
125
  // nested grid). Themed so it isn't a fixed light grey on dark presets.
101
- '--sg-bg-subtle': p.headerBg,
126
+ // Presets whose header sits almost on the page ground set `bgSubtle`
127
+ // separately, otherwise their inset surfaces would vanish.
128
+ '--sg-bg-subtle': p.bgSubtle ?? p.headerBg,
102
129
  '--sg-row-alt-bg': p.rowAlt,
103
130
  '--sg-row-hover-bg': p.rowHover,
104
131
  '--sg-selection-bg': p.selectionBg,
132
+ // Frozen columns/rows. Left unset the grid mixes the accent into the header
133
+ // color, which suits presets with a cool, low-chroma accent; a preset with a
134
+ // saturated accent should name these instead.
135
+ ...(p.pinnedBg ? { '--sg-pinned-bg': p.pinnedBg } : {}),
136
+ ...(p.pinnedHeaderBg ? { '--sg-pinned-header-bg': p.pinnedHeaderBg } : {}),
137
+ ...(p.pinnedDivider ? { '--sg-pinned-divider': p.pinnedDivider } : {}),
138
+ ...(p.pinnedBorder ? { '--sg-pinned-border': p.pinnedBorder } : {}),
139
+ ...(p.pinnedShadow ? { '--sg-pinned-shadow-color': p.pinnedShadow } : {}),
105
140
  // Inputs/checkboxes: pin to the theme's own surface so they never borrow the
106
141
  // host page's input tokens (which is how a themed grid ended up with dark
107
142
  // checkboxes on a light page when the host mode differed).
@@ -117,7 +152,7 @@ export function resolveThemeTokens(preset, mode, accentOverride) {
117
152
  // grid. CSS custom properties pierce shadow DOM, so defining them here (on
118
153
  // the themed container) reaches the scrollbar. Derive them from the palette
119
154
  // so the scrollbar tracks the preset + light/dark mode like everything else.
120
- '--sg-scrollbar-bg': p.headerBg,
155
+ '--sg-scrollbar-bg': p.bgSubtle ?? p.headerBg,
121
156
  '--sg-scrollbar-border': p.border,
122
157
  '--sg-scrollbar-thumb': p.muted,
123
158
  '--sg-scrollbar-thumb-hover': p.fg,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@svgrid/grid",
3
- "version": "2.2.18",
3
+ "version": "2.2.20",
4
4
  "description": "SvGrid - a headless-first, Svelte 5-native data grid engine and render component.",
5
5
  "author": "jQWidgets <boikom@jqwidgets.com>",
6
6
  "license": "MIT",
@@ -23,7 +23,8 @@
23
23
  ],
24
24
  "type": "module",
25
25
  "sideEffects": [
26
- "**/*.css"
26
+ "**/*.css",
27
+ "**/sv-grid-scrollbar.*"
27
28
  ],
28
29
  "types": "dist/index.d.ts",
29
30
  "module": "dist/index.js",
package/src/SvGrid.css CHANGED
@@ -394,8 +394,10 @@
394
394
  }
395
395
 
396
396
  /* Pinned columns read as "frozen" via three layered cues:
397
- 1. A distinct tint (slightly stronger than the header) so the
398
- pinned strip is visible even before you scroll.
397
+ 1. A distinct fill (slightly stronger than the header) so the
398
+ pinned strip is visible even before you scroll. Themes with a
399
+ saturated accent set --sg-pinned-bg / --sg-pinned-header-bg to a
400
+ neutral instead of taking the accent mix below.
399
401
  2. A solid 1px divider on the inside edge (toward the scrollable
400
402
  middle) and a soft drop shadow extending into the scroll area.
401
403
  3. A thin accent stripe on the outermost edge that turns on when
@@ -407,14 +409,14 @@
407
409
  background: var(--sg-pinned-bg, color-mix(in oklab, var(--sg-header-bg, #f1f5f9) 92%, var(--sg-accent, #2563eb) 8%));
408
410
  box-shadow:
409
411
  inset -1px 0 0 var(--sg-pinned-divider, var(--sg-border, #cbd5e1)),
410
- 8px 0 12px -6px rgba(15, 23, 42, 0.22);
412
+ 8px 0 12px -6px var(--sg-pinned-shadow-color, rgba(15, 23, 42, 0.22));
411
413
  }
412
414
  .sv-grid-cell[data-pinned="right"],
413
415
  .sv-grid-column[data-pinned="right"] {
414
416
  background: var(--sg-pinned-bg, color-mix(in oklab, var(--sg-header-bg, #f1f5f9) 92%, var(--sg-accent, #2563eb) 8%));
415
417
  box-shadow:
416
418
  inset 1px 0 0 var(--sg-pinned-divider, var(--sg-border, #cbd5e1)),
417
- -8px 0 12px -6px rgba(15, 23, 42, 0.22);
419
+ -8px 0 12px -6px var(--sg-pinned-shadow-color, rgba(15, 23, 42, 0.22));
418
420
  }
419
421
  /* Header row pinned cells get a slightly darker variant + bolder font
420
422
  so the frozen header itself reads as part of the grid chrome. */
@@ -586,6 +588,10 @@
586
588
  font-size: var(--sg-header-size, inherit);
587
589
  text-transform: var(--sg-header-transform, none);
588
590
  letter-spacing: var(--sg-header-tracking, normal);
591
+ /* Themes that keep the header close to the page ground lean on this line
592
+ rather than a fill to separate header from body. Scoped to the leaf header
593
+ row so strengthening it doesn't thicken every cell border. */
594
+ border-bottom-color: var(--sg-header-border, var(--sg-border, #e2e8f0));
589
595
  }
590
596
 
591
597
  /* Header drag-to-reorder. The `draggable` attribute is only set
@@ -815,7 +821,8 @@
815
821
  inset-inline-end: 0;
816
822
  width: 16px;
817
823
  background: var(--sg-header-bg, #f5f7fb);
818
- border-bottom: 1px solid rgba(15, 23, 42, 0.08);
824
+ /* Continues the leaf-header underline across the scrollbar gutter. */
825
+ border-bottom: 1px solid var(--sg-header-border, rgba(15, 23, 42, 0.08));
819
826
  /* Above pinned header cells (z-index 30) so the gap above the
820
827
  vertical scrollbar stays clean over a frozen column. */
821
828
  z-index: 41;
@@ -1625,6 +1632,11 @@ select.sv-grid-fr-editor {
1625
1632
  background: transparent;
1626
1633
  font: inherit;
1627
1634
  color: inherit;
1635
+ /* Form controls get `text-transform: none` from the UA sheet, which the
1636
+ `font` shorthand doesn't undo. Without this the label ignores
1637
+ --sg-header-transform on every sortable column. */
1638
+ text-transform: inherit;
1639
+ letter-spacing: inherit;
1628
1640
  text-align: left;
1629
1641
  cursor: pointer;
1630
1642
  }
@@ -16,6 +16,25 @@ export type ThemePalette = {
16
16
  bg: string; fg: string; muted: string; border: string
17
17
  headerBg: string; headerFg: string; accent: string
18
18
  rowAlt: string; rowHover: string; selectionBg: string
19
+ /* Optional refinements. A preset that leaves these out keeps the derived
20
+ behaviour it had before they existed, so adding one to a single preset
21
+ never shifts the others. */
22
+ /** Inset surface (master-detail region, generated auth pages). Defaults to `headerBg`. */
23
+ bgSubtle?: string
24
+ /** Underline below the leaf header row, when it should read stronger than a cell border. */
25
+ headerBorder?: string
26
+ /** Header label color, when it should differ from `headerFg`. */
27
+ headerLabel?: string
28
+ /** Frozen-column body cells. Without it the grid derives a tint from `headerBg` + `accent`. */
29
+ pinnedBg?: string
30
+ /** Frozen-column header cells. */
31
+ pinnedHeaderBg?: string
32
+ /** The 1px line on a pinned column's inside edge. Defaults to `border`. */
33
+ pinnedDivider?: string
34
+ /** Top/bottom border of pinned ROWS. Defaults to a translucent accent. */
35
+ pinnedBorder?: string
36
+ /** Drop shadow cast by a pinned column into the scroll area. */
37
+ pinnedShadow?: string
19
38
  }
20
39
 
21
40
  export type ThemePreset = {
@@ -27,12 +46,33 @@ export type ThemePreset = {
27
46
  radius: number
28
47
  /** Font stack applied to the app surface. */
29
48
  font: string
49
+ /** Header label typography. Mode-independent, like `radius` and `font`. */
50
+ headerType?: { weight?: string; size?: string; transform?: string; tracking?: string }
30
51
  light: ThemePalette
31
52
  dark: ThemePalette
32
53
  }
33
54
 
34
- /** The built-in theme presets, in gallery order (default first). */
55
+ /** The built-in theme presets, in gallery order (SvGrid's own theme first). */
35
56
  export const themePresets: ThemePreset[] = [
57
+ // Ember is SvGrid's signature look - the palette svgrid.com itself runs on, so
58
+ // a screenshot of the site's grids is reproducible with one stylesheet import.
59
+ // It is shaped like the shadcn/ui preset below - white ground, stone neutrals,
60
+ // 6px rounding, a medium-weight muted header row, no zebra - with SvGrid's
61
+ // orange standing in for shadcn's near-black primary. Stone rather than zinc
62
+ // because the neutral has to sit next to orange without going cold, which is
63
+ // the same pairing shadcn's own orange base color makes.
64
+ // Orange is spent only on selection, focus and the active-cell ring; nothing
65
+ // in the chrome is tinted. The frozen columns name a neutral explicitly
66
+ // instead of letting the grid derive a tint from the accent (that tint landed
67
+ // right on top of the selection color).
68
+ { id: 'ember', name: 'Ember', radius: 6, font: 'ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif',
69
+ headerType: { weight: '500' },
70
+ light: { bg: '#ffffff', fg: '#1c1917', muted: '#78716c', border: '#e7e5e4', headerBg: '#fafaf9', headerFg: '#78716c', accent: '#ff3e00', rowAlt: '#ffffff', rowHover: '#f5f5f4', selectionBg: '#ffece3',
71
+ bgSubtle: '#fafaf9',
72
+ pinnedBg: '#fafaf9', pinnedHeaderBg: '#f5f5f4', pinnedDivider: '#e7e5e4', pinnedBorder: '#e7e5e4', pinnedShadow: 'rgba(28, 25, 23, 0.10)' },
73
+ dark: { bg: '#0c0a09', fg: '#fafaf9', muted: '#a8a29e', border: '#292524', headerBg: '#1c1917', headerFg: '#a8a29e', accent: '#ff5a1f', rowAlt: '#0c0a09', rowHover: '#1c1917', selectionBg: '#3a2318',
74
+ bgSubtle: '#1c1917',
75
+ pinnedBg: '#151312', pinnedHeaderBg: '#1c1917', pinnedDivider: '#292524', pinnedBorder: '#292524', pinnedShadow: 'rgba(0, 0, 0, 0.50)' } },
36
76
  { id: 'shadcn', name: 'shadcn/ui', radius: 6, font: 'ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif',
37
77
  light: { bg: '#ffffff', fg: '#09090b', muted: '#71717a', border: '#e4e4e7', headerBg: '#fafafa', headerFg: '#71717a', accent: '#18181b', rowAlt: '#ffffff', rowHover: '#f4f4f5', selectionBg: '#f4f4f5' },
38
78
  dark: { bg: '#0a0a0a', fg: '#fafafa', muted: '#a1a1aa', border: '#27272a', headerBg: '#18181b', headerFg: '#a1a1aa', accent: '#fafafa', rowAlt: '#0a0a0a', rowHover: '#18181b', selectionBg: '#27272a' } },
@@ -123,12 +163,28 @@ export function resolveThemeTokens(preset: ThemePreset | undefined, mode: ThemeM
123
163
  '--sg-border': p.border,
124
164
  '--sg-header-bg': p.headerBg,
125
165
  '--sg-header-fg': p.headerFg,
166
+ ...(p.headerBorder ? { '--sg-header-border': p.headerBorder } : {}),
167
+ ...(p.headerLabel ? { '--sg-header-label-color': p.headerLabel } : {}),
168
+ ...(resolved.headerType?.weight ? { '--sg-header-weight': resolved.headerType.weight } : {}),
169
+ ...(resolved.headerType?.size ? { '--sg-header-size': resolved.headerType.size } : {}),
170
+ ...(resolved.headerType?.transform ? { '--sg-header-transform': resolved.headerType.transform } : {}),
171
+ ...(resolved.headerType?.tracking ? { '--sg-header-tracking': resolved.headerType.tracking } : {}),
126
172
  // A subtle inset surface (used by e.g. the master-detail region behind the
127
173
  // nested grid). Themed so it isn't a fixed light grey on dark presets.
128
- '--sg-bg-subtle': p.headerBg,
174
+ // Presets whose header sits almost on the page ground set `bgSubtle`
175
+ // separately, otherwise their inset surfaces would vanish.
176
+ '--sg-bg-subtle': p.bgSubtle ?? p.headerBg,
129
177
  '--sg-row-alt-bg': p.rowAlt,
130
178
  '--sg-row-hover-bg': p.rowHover,
131
179
  '--sg-selection-bg': p.selectionBg,
180
+ // Frozen columns/rows. Left unset the grid mixes the accent into the header
181
+ // color, which suits presets with a cool, low-chroma accent; a preset with a
182
+ // saturated accent should name these instead.
183
+ ...(p.pinnedBg ? { '--sg-pinned-bg': p.pinnedBg } : {}),
184
+ ...(p.pinnedHeaderBg ? { '--sg-pinned-header-bg': p.pinnedHeaderBg } : {}),
185
+ ...(p.pinnedDivider ? { '--sg-pinned-divider': p.pinnedDivider } : {}),
186
+ ...(p.pinnedBorder ? { '--sg-pinned-border': p.pinnedBorder } : {}),
187
+ ...(p.pinnedShadow ? { '--sg-pinned-shadow-color': p.pinnedShadow } : {}),
132
188
  // Inputs/checkboxes: pin to the theme's own surface so they never borrow the
133
189
  // host page's input tokens (which is how a themed grid ended up with dark
134
190
  // checkboxes on a light page when the host mode differed).
@@ -144,7 +200,7 @@ export function resolveThemeTokens(preset: ThemePreset | undefined, mode: ThemeM
144
200
  // grid. CSS custom properties pierce shadow DOM, so defining them here (on
145
201
  // the themed container) reaches the scrollbar. Derive them from the palette
146
202
  // so the scrollbar tracks the preset + light/dark mode like everything else.
147
- '--sg-scrollbar-bg': p.headerBg,
203
+ '--sg-scrollbar-bg': p.bgSubtle ?? p.headerBg,
148
204
  '--sg-scrollbar-border': p.border,
149
205
  '--sg-scrollbar-thumb': p.muted,
150
206
  '--sg-scrollbar-thumb-hover': p.fg,
@@ -0,0 +1,71 @@
1
+ /* Ember - generated from packages/grid/src/themes/index.ts. Do not edit by hand. */
2
+ :root {
3
+ --sg-bg: #ffffff;
4
+ --sg-fg: #1c1917;
5
+ --sg-muted: #78716c;
6
+ --sg-border: #e7e5e4;
7
+ --sg-header-bg: #fafaf9;
8
+ --sg-header-fg: #78716c;
9
+ --sg-header-weight: 500;
10
+ --sg-bg-subtle: #fafaf9;
11
+ --sg-row-alt-bg: #ffffff;
12
+ --sg-row-hover-bg: #f5f5f4;
13
+ --sg-selection-bg: #ffece3;
14
+ --sg-pinned-bg: #fafaf9;
15
+ --sg-pinned-header-bg: #f5f5f4;
16
+ --sg-pinned-divider: #e7e5e4;
17
+ --sg-pinned-border: #e7e5e4;
18
+ --sg-pinned-shadow-color: rgba(28, 25, 23, 0.10);
19
+ --sg-input-bg: #ffffff;
20
+ --sg-input-border: #e7e5e4;
21
+ --sg-accent: #ff3e00;
22
+ --sg-on-accent: #ffffff;
23
+ --sg-radius: 6px;
24
+ --sg-font: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
25
+ --sg-scrollbar-bg: #fafaf9;
26
+ --sg-scrollbar-border: #e7e5e4;
27
+ --sg-scrollbar-thumb: #78716c;
28
+ --sg-scrollbar-thumb-hover: #1c1917;
29
+ --sg-scrollbar-thumb-active: #1c1917;
30
+ --sg-scrollbar-arrow: #78716c;
31
+ --sg-scrollbar-arrow-hover: #1c1917;
32
+ --sg-scrollbar-arrow-hover-bg: #f5f5f4;
33
+ --sg-scrollbar-arrow-active: #1c1917;
34
+ --sg-scrollbar-arrow-active-bg: #ffece3;
35
+ --sg-scrollbar-arrow-disabled: #e7e5e4;
36
+ }
37
+ :root[data-theme='dark'] {
38
+ --sg-bg: #0c0a09;
39
+ --sg-fg: #fafaf9;
40
+ --sg-muted: #a8a29e;
41
+ --sg-border: #292524;
42
+ --sg-header-bg: #1c1917;
43
+ --sg-header-fg: #a8a29e;
44
+ --sg-header-weight: 500;
45
+ --sg-bg-subtle: #1c1917;
46
+ --sg-row-alt-bg: #0c0a09;
47
+ --sg-row-hover-bg: #1c1917;
48
+ --sg-selection-bg: #3a2318;
49
+ --sg-pinned-bg: #151312;
50
+ --sg-pinned-header-bg: #1c1917;
51
+ --sg-pinned-divider: #292524;
52
+ --sg-pinned-border: #292524;
53
+ --sg-pinned-shadow-color: rgba(0, 0, 0, 0.50);
54
+ --sg-input-bg: #0c0a09;
55
+ --sg-input-border: #292524;
56
+ --sg-accent: #ff5a1f;
57
+ --sg-on-accent: #ffffff;
58
+ --sg-radius: 6px;
59
+ --sg-font: ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
60
+ --sg-scrollbar-bg: #1c1917;
61
+ --sg-scrollbar-border: #292524;
62
+ --sg-scrollbar-thumb: #a8a29e;
63
+ --sg-scrollbar-thumb-hover: #fafaf9;
64
+ --sg-scrollbar-thumb-active: #fafaf9;
65
+ --sg-scrollbar-arrow: #a8a29e;
66
+ --sg-scrollbar-arrow-hover: #fafaf9;
67
+ --sg-scrollbar-arrow-hover-bg: #1c1917;
68
+ --sg-scrollbar-arrow-active: #fafaf9;
69
+ --sg-scrollbar-arrow-active-bg: #3a2318;
70
+ --sg-scrollbar-arrow-disabled: #292524;
71
+ }