@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.
- package/dist/SvGrid.css +17 -5
- package/dist/cdn/{GridMenus-0AK9O7qG.js → GridMenus-GfCAHgkZ.js} +1 -1
- package/dist/cdn/{GridMenus-BjUoCXoD.js → GridMenus-GiVNSeDU.js} +1 -1
- package/dist/cdn/{src-BwnUVj3T.js → src-DysW9qbk.js} +2592 -2371
- package/dist/cdn/{src-BLhdLmoN.js → src-bYfr_7aR.js} +2647 -2426
- package/dist/cdn/svgrid.js +2 -2
- package/dist/cdn/svgrid.svelte-external.js +2 -2
- package/dist/themes/index.d.ts +24 -1
- package/dist/themes/index.js +38 -3
- package/package.json +3 -2
- package/src/SvGrid.css +17 -5
- package/src/themes/index.ts +59 -3
- package/themes/ember.css +71 -0
package/dist/themes/index.d.ts
CHANGED
|
@@ -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 (
|
|
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;
|
package/dist/themes/index.js
CHANGED
|
@@ -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 (
|
|
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
|
-
|
|
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.
|
|
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
|
|
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
|
-
|
|
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
|
}
|
package/src/themes/index.ts
CHANGED
|
@@ -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 (
|
|
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
|
-
|
|
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,
|
package/themes/ember.css
ADDED
|
@@ -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
|
+
}
|