@svgrid/grid 2.2.32 → 2.4.0
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/README.md +199 -199
- package/dist/DockNodeView.svelte +1 -1
- package/dist/FlexRender.svelte +96 -96
- package/dist/GridFooter.svelte +178 -179
- package/dist/GridMenus.svelte +705 -782
- package/dist/SvAutoComplete.svelte +165 -165
- package/dist/SvAvatar.svelte +75 -75
- package/dist/SvCalendar.svelte +503 -503
- package/dist/SvCarousel.svelte +141 -141
- package/dist/SvCheckBox.svelte +102 -102
- package/dist/SvCircularProgress.svelte +109 -109
- package/dist/SvColorInput.svelte +181 -181
- package/dist/SvComboBox.svelte +275 -275
- package/dist/SvContextMenu.svelte +116 -116
- package/dist/SvCountryInput.svelte +160 -160
- package/dist/SvDateRangeInput.svelte +1 -1
- package/dist/SvDrawer.svelte +254 -254
- package/dist/SvDropDownList.svelte +374 -374
- package/dist/SvDurationInput.svelte +126 -126
- package/dist/SvField.svelte +293 -293
- package/dist/SvForm.svelte +437 -437
- package/dist/SvGrid.css +2814 -2804
- package/dist/SvGrid.svelte +3490 -3513
- package/dist/SvGridChart.svelte +1716 -1724
- package/dist/SvGridChartPanel.svelte +485 -485
- package/dist/SvGridChartView.svelte +70 -70
- package/dist/SvGridDropdown.svelte +728 -728
- package/dist/SvGridSelect.svelte +266 -268
- package/dist/SvGroupCell.svelte +116 -116
- package/dist/SvKbd.svelte +1 -1
- package/dist/SvList.svelte +1 -1
- package/dist/SvListBox.svelte +326 -326
- package/dist/SvMaskedInput.svelte +122 -122
- package/dist/SvMenu.svelte +124 -124
- package/dist/SvMenuList.svelte +146 -146
- package/dist/SvMenubar.svelte +1 -1
- package/dist/SvMultiSelect.svelte +289 -290
- package/dist/SvNumberInput.svelte +168 -168
- package/dist/SvOtpInput.svelte +158 -158
- package/dist/SvPasswordInput.svelte +151 -151
- package/dist/SvPhoneInput.svelte +133 -133
- package/dist/SvPopover.svelte +197 -197
- package/dist/SvProgress.svelte +116 -116
- package/dist/SvRadioGroup.svelte +107 -107
- package/dist/SvRating.svelte +112 -112
- package/dist/SvResult.svelte +73 -73
- package/dist/SvRichText.svelte +211 -207
- package/dist/SvRowGroupPanel.svelte +170 -170
- package/dist/SvScrollArea.svelte +61 -61
- package/dist/SvSlider.svelte +200 -200
- package/dist/SvSwitchButton.svelte +108 -108
- package/dist/SvTagsInput.svelte +112 -112
- package/dist/SvTextInput.svelte +147 -147
- package/dist/SvTimePicker.svelte +245 -245
- package/dist/SvToaster.svelte +159 -159
- package/dist/SvToggleButton.svelte +85 -85
- package/dist/SvTooltip.svelte +161 -161
- package/dist/SvTour.svelte +208 -204
- package/dist/SvTree.svelte +444 -444
- package/dist/SvTreeSelect.svelte +235 -237
- package/dist/cdn/{GridMenus-C6ixSGWW.js → GridMenus-BpVcKyUr.js} +5 -7
- package/dist/cdn/{GridMenus-Cyk3qpJ7.js → GridMenus-CeXL5IW4.js} +153 -152
- package/dist/cdn/{SvDateTimePicker-ClqtVIj3.js → SvDateTimePicker-DSUhIta8.js} +165 -165
- package/dist/cdn/{SvDateTimePicker-CdqaP61H.js → SvDateTimePicker-h9kPyszT.js} +572 -555
- package/dist/cdn/{SvGridChart-BcLCYvw9.js → SvGridChart-Bs2GIR2Q.js} +28 -21
- package/dist/cdn/{SvGridChart-BhnFdLd0.js → SvGridChart-CwhFz7GV.js} +2 -2
- package/dist/cdn/{SvGridChartPanel-Cmx9DHAS.js → SvGridChartPanel-1WXuStzM.js} +2 -2
- package/dist/cdn/{SvGridChartPanel-DvjwxLvK.js → SvGridChartPanel-e5_nqNP9.js} +22 -14
- package/dist/cdn/{SvGridChartView-PwqI4s02.js → SvGridChartView-SmPW10dI.js} +3 -3
- package/dist/cdn/{SvGridChartView-B40DTJSX.js → SvGridChartView-eSPuJE6g.js} +2 -2
- package/dist/cdn/{SvGridDropdown-D0VdjeR8.js → SvGridDropdown-B1ZcLpgs.js} +1 -1
- package/dist/cdn/{SvGridDropdown-Dh-2ej8j.js → SvGridDropdown-CtdbHcIS.js} +6 -5
- package/dist/cdn/{chart-T1usDN0o.js → chart-i4XcXyHJ.js} +12 -10
- package/dist/cdn/disclose-version-Dr7rEVv-.js +2866 -0
- package/dist/cdn/{export-format-JT5pWVT8.js → export-format-Cv1Dll6k.js} +66 -245
- package/dist/cdn/{src-CgD-wiuS.js → src-DbeN1ReZ.js} +9223 -8944
- package/dist/cdn/{src-BgHjWF0Q.js → src-DmEQFW5_.js} +9023 -8828
- package/dist/cdn/svgrid.js +9 -9
- package/dist/cdn/svgrid.svelte-external.js +9 -9
- package/dist/chart-export.js +8 -8
- package/dist/chart.d.ts +2 -0
- package/dist/chart.js +1 -4
- package/dist/columns.js +9 -2
- package/dist/createMenu.svelte.js +0 -1
- package/dist/createPopoverSelect.svelte.d.ts +2 -2
- package/dist/editing.js +1 -1
- package/dist/export-format.js +3 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/_svelte_metadata.json +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/_metadata.json +178 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/attachments-qzRy9DX4.js +3843 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/attachments-qzRy9DX4.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/constants-RLNOXCpz.js +23 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/constants-RLNOXCpz.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/dev-DPd12uEU.js +1925 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/dev-DPd12uEU.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/events-CDC4DKuQ.js +206 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/events-CDC4DKuQ.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/flags-BD-lYX7s.js +20 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/flags-BD-lYX7s.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/hydration-D3UBU2t8.js +264 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/hydration-D3UBU2t8.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/legacy-client-B0ZUlbSQ.js +698 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/legacy-client-B0ZUlbSQ.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/package.json +3 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte.js +135 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_animate.js +57 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_animate.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_attachments.js +2 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_compiler.js +46691 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_compiler.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_easing.js +239 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_easing.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_events.js +2 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal.js +6 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_client.js +7 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_disclose-version.js +6 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_disclose-version.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_async.js +7 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_async.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_legacy.js +7 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_legacy.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_tracing.js +7 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_tracing.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_server.js +6 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_legacy.js +85 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_legacy.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_motion.js +561 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_motion.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity.js +26 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity_window.js +124 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity_window.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_server.js +2 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_store.js +91 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_store.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_transition.js +242 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_transition.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-lObbumRX.js +497 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-lObbumRX.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-mR9mAWyK.js +4929 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-mR9mAWyK.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/validate-CezNmRkM.js +192 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/validate-CezNmRkM.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/version-BHHo0WE-.js +10 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/version-BHHo0WE-.js.map +1 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/warnings-yiExAB06.js +140 -0
- package/dist/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/warnings-yiExAB06.js.map +1 -0
- package/dist/selection.js +0 -1
- package/package.json +11 -10
- package/src/DockNodeView.svelte +1 -1
- package/src/FlexRender.svelte +96 -96
- package/src/GridFooter.svelte +178 -179
- package/src/GridMenus.svelte +705 -782
- package/src/SvAutoComplete.svelte +165 -165
- package/src/SvAvatar.svelte +75 -75
- package/src/SvCalendar.svelte +503 -503
- package/src/SvCalendar.test.ts +226 -226
- package/src/SvCarousel.svelte +141 -141
- package/src/SvCheckBox.svelte +102 -102
- package/src/SvCircularProgress.svelte +109 -109
- package/src/SvColorInput.svelte +181 -181
- package/src/SvComboBox.svelte +275 -275
- package/src/SvContextMenu.svelte +116 -116
- package/src/SvCountryInput.svelte +160 -160
- package/src/SvDateRangeInput.svelte +1 -1
- package/src/SvDrawer.svelte +254 -254
- package/src/SvDropDownList.svelte +374 -374
- package/src/SvDurationInput.svelte +126 -126
- package/src/SvField.svelte +293 -293
- package/src/SvForm.svelte +437 -437
- package/src/SvForm.test.ts +411 -411
- package/src/SvGrid.controller.svelte.ts +3680 -3685
- package/src/SvGrid.css +2814 -2804
- package/src/SvGrid.svelte +3490 -3513
- package/src/SvGrid.types.ts +1708 -1709
- package/src/SvGridChart.svelte +1716 -1724
- package/src/SvGridChartPanel.svelte +485 -485
- package/src/SvGridChartView.svelte +70 -70
- package/src/SvGridDropdown.svelte +728 -728
- package/src/SvGridSelect.svelte +266 -268
- package/src/SvGroupCell.svelte +116 -116
- package/src/SvKbd.svelte +1 -1
- package/src/SvList.svelte +1 -1
- package/src/SvListBox.svelte +326 -326
- package/src/SvMaskedInput.svelte +122 -122
- package/src/SvMenu.svelte +124 -124
- package/src/SvMenu.test.ts +97 -97
- package/src/SvMenuList.svelte +146 -146
- package/src/SvMenubar.svelte +1 -1
- package/src/SvMultiSelect.svelte +289 -290
- package/src/SvNumberInput.svelte +168 -168
- package/src/SvOtpInput.svelte +158 -158
- package/src/SvPasswordInput.svelte +151 -151
- package/src/SvPhoneInput.svelte +133 -133
- package/src/SvPopover.svelte +197 -197
- package/src/SvProgress.svelte +116 -116
- package/src/SvRadioGroup.svelte +107 -107
- package/src/SvRating.svelte +112 -112
- package/src/SvResult.svelte +73 -73
- package/src/SvRichText.svelte +211 -207
- package/src/SvRowGroupPanel.svelte +170 -170
- package/src/SvScrollArea.svelte +61 -61
- package/src/SvSlider.svelte +200 -200
- package/src/SvSwitchButton.svelte +108 -108
- package/src/SvTagsInput.svelte +112 -112
- package/src/SvTextInput.svelte +147 -147
- package/src/SvTimePicker.svelte +245 -245
- package/src/SvToaster.svelte +159 -159
- package/src/SvToaster.test.ts +95 -95
- package/src/SvToggleButton.svelte +85 -85
- package/src/SvTooltip.svelte +161 -161
- package/src/SvTour.svelte +208 -204
- package/src/SvTree.svelte +444 -444
- package/src/SvTreeSelect.svelte +235 -237
- package/src/a11y/dismissable.test.ts +119 -119
- package/src/a11y/dismissable.ts +114 -114
- package/src/a11y.contract.test.ts +49 -49
- package/src/a11y.test.ts +59 -59
- package/src/a11y.ts +61 -61
- package/src/ai.test.ts +502 -502
- package/src/ai.ts +1391 -1391
- package/src/build-api.coverage.test.ts +633 -633
- package/src/build-api.ts +805 -910
- package/src/builtin-editors.grid.test.ts +85 -85
- package/src/cell-formatting.test.ts +1 -1
- package/src/cell-formatting.ts +169 -169
- package/src/cell-render.test.ts +513 -513
- package/src/cell-render.ts +496 -590
- package/src/cell-values.ts +118 -118
- package/src/chart-export.ts +201 -201
- package/src/chart-view.svelte.ts +36 -36
- package/src/chart.ts +2295 -2296
- package/src/clipboard.ts +0 -102
- package/src/collaboration.test.ts +104 -104
- package/src/collaboration.ts +167 -167
- package/src/columns.ts +7 -117
- package/src/core.performance.test.ts +30 -30
- package/src/core.ts +1261 -1261
- package/src/createAutocomplete.svelte.ts +132 -132
- package/src/createCombobox.svelte.ts +191 -191
- package/src/createCountryInput.svelte.ts +157 -157
- package/src/createDropdownList.svelte.ts +168 -168
- package/src/createForm.svelte.ts +386 -386
- package/src/createGrid.svelte.ts +42 -42
- package/src/createGrid.test.ts +10 -10
- package/src/createGridState.svelte.ts +17 -17
- package/src/createListbox.svelte.ts +250 -250
- package/src/createMenu.svelte.ts +224 -225
- package/src/createPopoverSelect.svelte.ts +213 -213
- package/src/createSlider.svelte.ts +191 -191
- package/src/createTooltip.svelte.ts +144 -144
- package/src/createTree.svelte.ts +319 -319
- package/src/editing.test.ts +949 -949
- package/src/editing.ts +606 -709
- package/src/editor-contract.ts +164 -164
- package/src/editor-registry.grid.test.ts +144 -146
- package/src/editor-registry.ts +122 -122
- package/src/export-data-api.test.ts +126 -126
- package/src/export-format.test.ts +107 -107
- package/src/export-format.ts +601 -598
- package/src/features.ts +0 -90
- package/src/filter-operators.ts +157 -157
- package/src/flex-render.ts +3 -3
- package/src/form-field.ts +127 -127
- package/src/group-display.test.ts +167 -167
- package/src/group-display.ts +200 -200
- package/src/index.ts +724 -724
- package/src/js-scroller.svelte.ts +173 -173
- package/src/keyboard-handlers.coverage.test.ts +1 -1
- package/src/keyboard-handlers.ts +270 -390
- package/src/keyboard.test.ts +59 -59
- package/src/keyboard.ts +97 -97
- package/src/list-nav.test.ts +49 -49
- package/src/list-nav.ts +29 -29
- package/src/list-option.test.ts +56 -56
- package/src/list-option.ts +172 -172
- package/src/menus.test.ts +0 -1
- package/src/menus.ts +567 -679
- package/src/merge-objects.ts +48 -48
- package/src/new-features.test.ts +3 -1
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/_svelte_metadata.json +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/_metadata.json +178 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/attachments-qzRy9DX4.js +3843 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/attachments-qzRy9DX4.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/constants-RLNOXCpz.js +23 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/constants-RLNOXCpz.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/dev-DPd12uEU.js +1925 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/dev-DPd12uEU.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/events-CDC4DKuQ.js +206 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/events-CDC4DKuQ.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/flags-BD-lYX7s.js +20 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/flags-BD-lYX7s.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/hydration-D3UBU2t8.js +264 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/hydration-D3UBU2t8.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/legacy-client-B0ZUlbSQ.js +698 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/legacy-client-B0ZUlbSQ.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/package.json +3 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte.js +135 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_animate.js +57 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_animate.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_attachments.js +2 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_compiler.js +46691 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_compiler.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_easing.js +239 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_easing.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_events.js +2 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal.js +6 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_client.js +7 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_disclose-version.js +6 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_disclose-version.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_async.js +7 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_async.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_legacy.js +7 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_legacy.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_tracing.js +7 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_flags_tracing.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_internal_server.js +6 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_legacy.js +85 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_legacy.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_motion.js +561 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_motion.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity.js +26 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity_window.js +124 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_reactivity_window.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_server.js +2 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_store.js +91 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_store.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_transition.js +242 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/svelte_transition.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-lObbumRX.js +497 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-lObbumRX.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-mR9mAWyK.js +4929 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/utils-mR9mAWyK.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/validate-CezNmRkM.js +192 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/validate-CezNmRkM.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/version-BHHo0WE-.js +10 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/version-BHHo0WE-.js.map +1 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/warnings-yiExAB06.js +140 -0
- package/src/node_modules/.vite/vitest/67d8ed22ed986c5e2e948f64d892f30be166cc36/deps___vitest__/warnings-yiExAB06.js.map +1 -0
- package/src/overlays.test.ts +90 -90
- package/src/render-component.ts +28 -28
- package/src/row-drag.test.ts +1 -1
- package/src/row-resize.test.ts +1 -2
- package/src/row-resize.ts +210 -210
- package/src/scheduler-model.test.ts +562 -562
- package/src/scheduler-model.ts +872 -872
- package/src/scroll-sync.test.ts +4 -7
- package/src/scroll-sync.ts +0 -122
- package/src/selection.test.ts +754 -754
- package/src/selection.ts +491 -600
- package/src/server-data-source.test.ts +289 -289
- package/src/server-data-source.ts +413 -413
- package/src/server-group-model.test.ts +2 -2
- package/src/sparkline.test.ts +68 -68
- package/src/sparkline.ts +169 -169
- package/src/spreadsheet.test.ts +488 -488
- package/src/spreadsheet.ts +312 -312
- package/src/static-functions.ts +11 -11
- package/src/subscribe.ts +38 -38
- package/src/summaries.ts +0 -112
- package/src/svgrid-wrapper.types.ts +526 -526
- package/src/svgrid.async-editor-options.test.ts +271 -271
- package/src/svgrid.auto-row-height.test.ts +204 -204
- package/src/svgrid.behavior.test.ts +705 -706
- package/src/svgrid.charting.test.ts +534 -534
- package/src/svgrid.column-reorder.test.ts +0 -8
- package/src/svgrid.comments-autocomplete.test.ts +123 -123
- package/src/svgrid.context-menu.test.ts +147 -147
- package/src/svgrid.features.test.ts +157 -157
- package/src/svgrid.filter-depth.test.ts +163 -163
- package/src/svgrid.filter-menu-listbox.svelte.test.ts +322 -322
- package/src/svgrid.filter-menu-scroll.test.ts +112 -112
- package/src/svgrid.footer-pagesize.svelte.test.ts +86 -0
- package/src/svgrid.grand-total.test.ts +188 -188
- package/src/svgrid.group-display-mode.test.ts +171 -171
- package/src/svgrid.group-footers.test.ts +121 -121
- package/src/svgrid.group-pagination.test.ts +153 -153
- package/src/svgrid.new-features.wrapper.test.ts +251 -251
- package/src/svgrid.tree-data.test.ts +186 -186
- package/src/svgrid.wrapper.test.ts +40 -40
- package/src/svgriddropdown.async-panel.svelte.test.ts +195 -195
- package/src/test-setup.ts +62 -62
- package/src/themes/index.ts +257 -257
- package/src/toast-store.svelte.ts +246 -246
- package/src/toast-store.test.ts +147 -147
- package/src/tree-row-model.test.ts +168 -169
- package/src/ui-buttons.test.ts +144 -144
- package/src/ui-inputs.test.ts +118 -118
- package/src/ui-localization.test.ts +113 -113
- package/src/ui-range.test.ts +70 -70
- package/src/ui-selection.test.ts +155 -155
- package/src/ui-tier1.test.ts +142 -142
- package/src/virtual.test.ts +88 -88
- package/src/virtualization/column-virtualizer.test.ts +27 -27
- package/src/virtualization/column-virtualizer.ts +30 -30
- package/src/virtualization/svelte-virtualizer.svelte.ts +26 -26
- package/src/virtualization/types.ts +30 -30
- package/src/virtualization/virtualizer.test.ts +47 -47
- package/src/virtualization/virtualizer.ts +296 -296
- package/dist/cdn/disclose-version-DoD9AFD_.js +0 -2958
package/src/themes/index.ts
CHANGED
|
@@ -1,257 +1,257 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* SvGrid's built-in design-system theme presets (shadcn/ui, Tailwind, Material 3,
|
|
3
|
-
* Excel, Fluent 2, ...). Each preset carries an explicit light + dark palette;
|
|
4
|
-
* resolving one (plus a light/dark mode) yields the full `--sg-*` token set that
|
|
5
|
-
* restyles the whole grid - not just the accent.
|
|
6
|
-
*
|
|
7
|
-
* Pure, framework-agnostic data + helpers - safe to import from Node or the
|
|
8
|
-
* browser. `@svgrid/enterprise`'s Studio layer builds its `ProjectTheme`-aware
|
|
9
|
-
* wrapper on top of this module instead of keeping its own copy.
|
|
10
|
-
*/
|
|
11
|
-
|
|
12
|
-
export type ThemeMode = 'light' | 'dark'
|
|
13
|
-
|
|
14
|
-
/** The core palette for one mode. */
|
|
15
|
-
export type ThemePalette = {
|
|
16
|
-
bg: string; fg: string; muted: string; border: string
|
|
17
|
-
headerBg: string; headerFg: string; accent: string
|
|
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
|
|
38
|
-
/* Semantic status colors. The UI kit reads these for destructive buttons,
|
|
39
|
-
validation errors, alert variants, badges and the rating star. A preset
|
|
40
|
-
that omits them gets the mode-appropriate defaults below, which match the
|
|
41
|
-
inline fallbacks the components shipped with - so adding these changed
|
|
42
|
-
nothing for existing presets, it only made them themeable. */
|
|
43
|
-
/** Errors, destructive actions, invalid cells. */
|
|
44
|
-
danger?: string
|
|
45
|
-
/** Confirmations, positive deltas. */
|
|
46
|
-
success?: string
|
|
47
|
-
/** Cautions, pending states, the rating star. */
|
|
48
|
-
warning?: string
|
|
49
|
-
/** Neutral informational callouts. */
|
|
50
|
-
info?: string
|
|
51
|
-
/** Focus outline color. Defaults to the preset's accent. */
|
|
52
|
-
focusRing?: string
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/** Status-color defaults per mode - dark mode lifts them so they stay legible
|
|
56
|
-
* on a dark ground. Values match the components' own inline fallbacks. */
|
|
57
|
-
const STATUS_DEFAULTS: Record<ThemeMode, { danger: string; success: string; warning: string; info: string }> = {
|
|
58
|
-
light: { danger: '#dc2626', success: '#16a34a', warning: '#d97706', info: '#0891b2' },
|
|
59
|
-
dark: { danger: '#f87171', success: '#4ade80', warning: '#fbbf24', info: '#22d3ee' },
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
export type ThemePreset = {
|
|
63
|
-
/** Stable id, e.g. used as a CSS file name (`themes/<id>.css`). */
|
|
64
|
-
id: string
|
|
65
|
-
/** Display name shown on a theme picker. */
|
|
66
|
-
name: string
|
|
67
|
-
/** Control corner rounding (px). */
|
|
68
|
-
radius: number
|
|
69
|
-
/** Font stack applied to the app surface. */
|
|
70
|
-
font: string
|
|
71
|
-
/** Header label typography. Mode-independent, like `radius` and `font`. */
|
|
72
|
-
headerType?: { weight?: string; size?: string; transform?: string; tracking?: string }
|
|
73
|
-
light: ThemePalette
|
|
74
|
-
dark: ThemePalette
|
|
75
|
-
}
|
|
76
|
-
|
|
77
|
-
/** The built-in theme presets, in gallery order (SvGrid's own theme first). */
|
|
78
|
-
export const themePresets: ThemePreset[] = [
|
|
79
|
-
// Ember is SvGrid's signature look - the palette svgrid.com itself runs on, so
|
|
80
|
-
// a screenshot of the site's grids is reproducible with one stylesheet import.
|
|
81
|
-
// It is shaped like the shadcn/ui preset below - white ground, stone neutrals,
|
|
82
|
-
// 6px rounding, a medium-weight muted header row, no zebra - with SvGrid's
|
|
83
|
-
// orange standing in for shadcn's near-black primary. Stone rather than zinc
|
|
84
|
-
// because the neutral has to sit next to orange without going cold, which is
|
|
85
|
-
// the same pairing shadcn's own orange base color makes.
|
|
86
|
-
// Orange is spent only on selection, focus and the active-cell ring; nothing
|
|
87
|
-
// in the chrome is tinted. The frozen columns name a neutral explicitly
|
|
88
|
-
// instead of letting the grid derive a tint from the accent (that tint landed
|
|
89
|
-
// right on top of the selection color).
|
|
90
|
-
{ id: 'ember', name: 'Ember', radius: 6, font: 'ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif',
|
|
91
|
-
headerType: { weight: '500' },
|
|
92
|
-
light: { bg: '#ffffff', fg: '#1c1917', muted: '#78716c', border: '#e7e5e4', headerBg: '#fafaf9', headerFg: '#78716c', accent: '#ff3e00', rowAlt: '#ffffff', rowHover: '#f5f5f4', selectionBg: '#ffece3',
|
|
93
|
-
bgSubtle: '#fafaf9',
|
|
94
|
-
pinnedBg: '#fafaf9', pinnedHeaderBg: '#f5f5f4', pinnedDivider: '#e7e5e4', pinnedBorder: '#e7e5e4', pinnedShadow: 'rgba(28, 25, 23, 0.10)' },
|
|
95
|
-
dark: { bg: '#0c0a09', fg: '#fafaf9', muted: '#a8a29e', border: '#292524', headerBg: '#1c1917', headerFg: '#a8a29e', accent: '#ff5a1f', rowAlt: '#0c0a09', rowHover: '#1c1917', selectionBg: '#3a2318',
|
|
96
|
-
bgSubtle: '#1c1917',
|
|
97
|
-
pinnedBg: '#151312', pinnedHeaderBg: '#1c1917', pinnedDivider: '#292524', pinnedBorder: '#292524', pinnedShadow: 'rgba(0, 0, 0, 0.50)' } },
|
|
98
|
-
{ id: 'shadcn', name: 'shadcn/ui', radius: 6, font: 'ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif',
|
|
99
|
-
light: { bg: '#ffffff', fg: '#09090b', muted: '#71717a', border: '#e4e4e7', headerBg: '#fafafa', headerFg: '#71717a', accent: '#18181b', rowAlt: '#ffffff', rowHover: '#f4f4f5', selectionBg: '#f4f4f5' },
|
|
100
|
-
dark: { bg: '#0a0a0a', fg: '#fafafa', muted: '#a1a1aa', border: '#27272a', headerBg: '#18181b', headerFg: '#a1a1aa', accent: '#fafafa', rowAlt: '#0a0a0a', rowHover: '#18181b', selectionBg: '#27272a' } },
|
|
101
|
-
{ id: 'tailwind', name: 'Tailwind', radius: 6, font: 'Inter, ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif',
|
|
102
|
-
light: { bg: '#ffffff', fg: '#0f172a', muted: '#64748b', border: '#e2e8f0', headerBg: '#f8fafc', headerFg: '#0f172a', accent: '#4f46e5', rowAlt: '#ffffff', rowHover: '#f1f5f9', selectionBg: '#e0e7ff' },
|
|
103
|
-
dark: { bg: '#0f172a', fg: '#f8fafc', muted: '#94a3b8', border: '#334155', headerBg: '#1e293b', headerFg: '#f8fafc', accent: '#818cf8', rowAlt: '#0f172a', rowHover: '#1e293b', selectionBg: '#312e81' } },
|
|
104
|
-
{ id: 'material', name: 'Material 3', radius: 8, font: '"Roboto Flex", Roboto, "Segoe UI", system-ui, sans-serif',
|
|
105
|
-
light: { bg: '#fef7ff', fg: '#1d1b20', muted: '#49454f', border: '#cac4d0', headerBg: '#f3edf7', headerFg: '#1d1b20', accent: '#6750a4', rowAlt: '#fffbfe', rowHover: '#ece6f0', selectionBg: '#e8def8' },
|
|
106
|
-
dark: { bg: '#141218', fg: '#e6e0e9', muted: '#cac4d0', border: '#49454f', headerBg: '#211f26', headerFg: '#e6e0e9', accent: '#d0bcff', rowAlt: '#141218', rowHover: '#2b2930', selectionBg: '#4a4458' } },
|
|
107
|
-
{ id: 'excel', name: 'Excel', radius: 0, font: '"Aptos", "Segoe UI", Calibri, Arial, sans-serif',
|
|
108
|
-
light: { bg: '#ffffff', fg: '#323130', muted: '#605e5c', border: '#d2d0ce', headerBg: '#f3f2f1', headerFg: '#444444', accent: '#107c41', rowAlt: '#ffffff', rowHover: '#edebe9', selectionBg: 'rgba(16, 124, 65, 0.10)' },
|
|
109
|
-
dark: { bg: '#1b1a19', fg: '#f3f2f1', muted: '#c8c6c4', border: '#3b3a39', headerBg: '#252423', headerFg: '#c8c6c4', accent: '#58c188', rowAlt: '#1b1a19', rowHover: '#323130', selectionBg: 'rgba(88, 193, 136, 0.16)' } },
|
|
110
|
-
{ id: 'fluent', name: 'Fluent 2', radius: 4, font: '"Segoe UI Variable", "Segoe UI", system-ui, sans-serif',
|
|
111
|
-
light: { bg: '#ffffff', fg: '#242424', muted: '#616161', border: '#e0e0e0', headerBg: '#f5f5f5', headerFg: '#242424', accent: '#0f6cbd', rowAlt: '#fafafa', rowHover: '#f0f0f0', selectionBg: '#ebebeb' },
|
|
112
|
-
dark: { bg: '#1f1f1f', fg: '#ffffff', muted: '#d6d6d6', border: '#666666', headerBg: '#141414', headerFg: '#ffffff', accent: '#479ef5', rowAlt: '#1a1a1a', rowHover: '#3d3d3d', selectionBg: '#383838' } },
|
|
113
|
-
{ id: 'carbon', name: 'Carbon', radius: 0, font: '"IBM Plex Sans", "Helvetica Neue", Arial, sans-serif',
|
|
114
|
-
light: { bg: '#ffffff', fg: '#161616', muted: '#525252', border: '#e0e0e0', headerBg: '#e0e0e0', headerFg: '#161616', accent: '#0f62fe', rowAlt: '#f4f4f4', rowHover: '#e8e8e8', selectionBg: '#d0e2ff' },
|
|
115
|
-
dark: { bg: '#161616', fg: '#f4f4f4', muted: '#c6c6c6', border: '#393939', headerBg: '#393939', headerFg: '#f4f4f4', accent: '#78a9ff', rowAlt: '#262626', rowHover: '#333333', selectionBg: '#393939' } },
|
|
116
|
-
{ id: 'sap', name: 'SAP Fiori', radius: 6, font: '"72", "72full", "Arial", sans-serif',
|
|
117
|
-
light: { bg: '#f5f6f7', fg: '#131e29', muted: '#556b82', border: '#e5e5e5', headerBg: '#ffffff', headerFg: '#131e29', accent: '#0070f2', rowAlt: '#f5f6f7', rowHover: '#eaecee', selectionBg: '#ebf8ff' },
|
|
118
|
-
dark: { bg: '#12171c', fg: '#f5f6f7', muted: '#8396a8', border: '#2e3742', headerBg: '#1d232a', headerFg: '#f5f6f7', accent: '#4db1ff', rowAlt: '#12171c', rowHover: '#222b35', selectionBg: '#1d2d3e' } },
|
|
119
|
-
{ id: 'salesforce', name: 'Salesforce', radius: 4, font: '"Salesforce Sans", "SF Pro", Helvetica, Arial, sans-serif',
|
|
120
|
-
light: { bg: '#ffffff', fg: '#181818', muted: '#757575', border: '#c9c9c9', headerBg: '#f3f3f3', headerFg: '#181818', accent: '#0176d3', rowAlt: '#ffffff', rowHover: '#f3f3f3', selectionBg: '#ecebea' },
|
|
121
|
-
dark: { bg: '#181818', fg: '#ffffff', muted: '#c9c9c9', border: '#3e3e3c', headerBg: '#2e2e2e', headerFg: '#ffffff', accent: '#1b96ff', rowAlt: '#181818', rowHover: '#2e2e2e', selectionBg: '#1e4d8e' } },
|
|
122
|
-
{ id: 'atlassian', name: 'Atlassian', radius: 3, font: '"Charlie Display", "Atlassian Sans", -apple-system, "Segoe UI", sans-serif',
|
|
123
|
-
light: { bg: '#ffffff', fg: '#172b4d', muted: '#44546f', border: '#dcdfe4', headerBg: '#fafbfc', headerFg: '#44546f', accent: '#0c66e4', rowAlt: '#ffffff', rowHover: '#f1f2f4', selectionBg: '#e9f2ff' },
|
|
124
|
-
dark: { bg: '#1d2125', fg: '#b6c2cf', muted: '#8590a2', border: '#38414a', headerBg: '#22272b', headerFg: '#8590a2', accent: '#579dff', rowAlt: '#1d2125', rowHover: '#2c333a', selectionBg: '#09326c' } },
|
|
125
|
-
{ id: 'github', name: 'GitHub', radius: 6, font: '-apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif',
|
|
126
|
-
light: { bg: '#ffffff', fg: '#1f2328', muted: '#59636e', border: '#d1d9e0', headerBg: '#f6f8fa', headerFg: '#59636e', accent: '#0969da', rowAlt: '#ffffff', rowHover: '#f6f8fa', selectionBg: '#ddf4ff' },
|
|
127
|
-
dark: { bg: '#0d1117', fg: '#f0f6fc', muted: '#9198a1', border: '#3d444d', headerBg: '#151b23', headerFg: '#9198a1', accent: '#4493f8', rowAlt: '#0d1117', rowHover: '#151b23', selectionBg: 'rgba(56, 139, 253, 0.10)' } },
|
|
128
|
-
{ id: 'antd', name: 'Ant Design', radius: 6, font: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", sans-serif',
|
|
129
|
-
light: { bg: '#ffffff', fg: 'rgba(0, 0, 0, 0.88)', muted: 'rgba(0, 0, 0, 0.65)', border: '#d9d9d9', headerBg: '#fafafa', headerFg: 'rgba(0, 0, 0, 0.88)', accent: '#1677ff', rowAlt: '#ffffff', rowHover: '#f5f5f5', selectionBg: '#e6f4ff' },
|
|
130
|
-
dark: { bg: '#141414', fg: 'rgba(255, 255, 255, 0.85)', muted: 'rgba(255, 255, 255, 0.65)', border: '#424242', headerBg: '#1f1f1f', headerFg: 'rgba(255, 255, 255, 0.85)', accent: '#177ddc', rowAlt: '#141414', rowHover: '#262626', selectionBg: '#111a2c' } },
|
|
131
|
-
{ id: 'ag-alpine', name: 'Alpine', radius: 3, font: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
|
|
132
|
-
light: { bg: '#ffffff', fg: '#181d1f', muted: 'rgba(24, 29, 31, 0.5)', border: '#babfc7', headerBg: '#f8f8f8', headerFg: '#181d1f', accent: '#2196f3', rowAlt: '#fcfcfc', rowHover: 'rgba(33, 150, 243, 0.1)', selectionBg: 'rgba(33, 150, 243, 0.3)' },
|
|
133
|
-
dark: { bg: '#181d1f', fg: '#ffffff', muted: 'rgba(255, 255, 255, 0.5)', border: '#68686e', headerBg: '#222628', headerFg: '#ffffff', accent: '#2196f3', rowAlt: '#222628', rowHover: 'rgba(33, 150, 243, 0.1)', selectionBg: 'rgba(33, 150, 243, 0.3)' } },
|
|
134
|
-
{ id: 'bootstrap', name: 'Bootstrap 5', radius: 6, font: 'system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',
|
|
135
|
-
light: { bg: '#ffffff', fg: '#212529', muted: '#6c757d', border: '#dee2e6', headerBg: '#f8f9fa', headerFg: '#212529', accent: '#0d6efd', rowAlt: '#fcfcfd', rowHover: '#f2f2f2', selectionBg: '#cfe2ff' },
|
|
136
|
-
dark: { bg: '#212529', fg: '#dee2e6', muted: '#adb5bd', border: '#495057', headerBg: '#2b3035', headerFg: '#dee2e6', accent: '#0d6efd', rowAlt: '#25292e', rowHover: '#2c3034', selectionBg: '#031633' } },
|
|
137
|
-
{ id: 'vercel', name: 'Vercel', radius: 6, font: '"Geist", "Geist Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
|
|
138
|
-
light: { bg: '#ffffff', fg: '#000000', muted: '#666666', border: '#eaeaea', headerBg: '#fafafa', headerFg: '#666666', accent: '#0070f3', rowAlt: '#fafafa', rowHover: '#f5f5f5', selectionBg: '#e8f0fe' },
|
|
139
|
-
dark: { bg: '#000000', fg: '#ffffff', muted: '#888888', border: '#333333', headerBg: '#111111', headerFg: '#888888', accent: '#3291ff', rowAlt: '#0a0a0a', rowHover: '#1a1a1a', selectionBg: '#0d2847' } },
|
|
140
|
-
{ id: 'linear', name: 'Linear', radius: 6, font: '"Inter Variable", "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',
|
|
141
|
-
light: { bg: '#ffffff', fg: '#282a30', muted: '#6b6f76', border: '#e9e9eb', headerBg: '#f7f8f8', headerFg: '#6b6f76', accent: '#5e6ad2', rowAlt: '#fbfbfc', rowHover: '#f4f4f5', selectionBg: '#e8eafd' },
|
|
142
|
-
dark: { bg: '#08090a', fg: '#f7f8f8', muted: '#8a8f98', border: '#23252a', headerBg: '#0f1011', headerFg: '#8a8f98', accent: '#5e6ad2', rowAlt: '#0f1011', rowHover: '#1a1b1e', selectionBg: '#2a2d4a' } },
|
|
143
|
-
{ id: 'notion', name: 'Notion', radius: 4, font: 'ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif',
|
|
144
|
-
light: { bg: '#ffffff', fg: '#37352f', muted: '#787774', border: '#e9e9e7', headerBg: '#f7f6f3', headerFg: '#787774', accent: '#2383e2', rowAlt: '#fbfbfa', rowHover: '#f1f1ef', selectionBg: '#d9eaf7' },
|
|
145
|
-
dark: { bg: '#191919', fg: '#d4d4d4', muted: '#9b9b9b', border: '#2f2f2f', headerBg: '#202020', headerFg: '#9b9b9b', accent: '#529cca', rowAlt: '#1c1c1c', rowHover: '#252525', selectionBg: '#20415c' } },
|
|
146
|
-
{ id: 'nord', name: 'Nord', radius: 4, font: '"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
|
|
147
|
-
light: { bg: '#eceff4', fg: '#2e3440', muted: '#4c566a', border: '#d8dee9', headerBg: '#e5e9f0', headerFg: '#2e3440', accent: '#5e81ac', rowAlt: '#e5e9f0', rowHover: '#dde3ec', selectionBg: '#d8dee9' },
|
|
148
|
-
dark: { bg: '#2e3440', fg: '#d8dee9', muted: '#4c566a', border: '#434c5e', headerBg: '#3b4252', headerFg: '#e5e9f0', accent: '#88c0d0', rowAlt: '#333b48', rowHover: '#3b4252', selectionBg: '#434c5e' } },
|
|
149
|
-
{ id: 'dracula', name: 'Dracula', radius: 6, font: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
|
|
150
|
-
light: { bg: '#fffbeb', fg: '#1f1f1f', muted: '#6c664b', border: '#dedccf', headerBg: '#ece9df', headerFg: '#1f1f1f', accent: '#644ac9', rowAlt: '#fffdf5', rowHover: '#f2efe3', selectionBg: '#cfcfde' },
|
|
151
|
-
dark: { bg: '#282a36', fg: '#f8f8f2', muted: '#6272a4', border: '#44475a', headerBg: '#21222c', headerFg: '#f8f8f2', accent: '#bd93f9', rowAlt: '#2d2f3b', rowHover: '#343746', selectionBg: '#44475a' } },
|
|
152
|
-
{ id: 'catppuccin', name: 'Catppuccin', radius: 8, font: '"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
|
|
153
|
-
light: { bg: '#eff1f5', fg: '#4c4f69', muted: '#6c6f85', border: '#ccd0da', headerBg: '#e6e9ef', headerFg: '#4c4f69', accent: '#8839ef', rowAlt: '#e6e9ef', rowHover: '#dce0e8', selectionBg: '#dce0e8' },
|
|
154
|
-
dark: { bg: '#1e1e2e', fg: '#cdd6f4', muted: '#a6adc8', border: '#313244', headerBg: '#181825', headerFg: '#cdd6f4', accent: '#cba6f7', rowAlt: '#1a1a28', rowHover: '#313244', selectionBg: '#45475a' } },
|
|
155
|
-
]
|
|
156
|
-
|
|
157
|
-
/** The default preset (used when nothing is chosen). */
|
|
158
|
-
export const defaultThemePreset: ThemePreset = themePresets.find((t) => t.id === 'tailwind') ?? themePresets[0]!
|
|
159
|
-
|
|
160
|
-
/** Look up a preset by id. */
|
|
161
|
-
export const getThemePreset = (id?: string): ThemePreset | undefined =>
|
|
162
|
-
id ? themePresets.find((t) => t.id === id) : undefined
|
|
163
|
-
|
|
164
|
-
/** A readable (near-black / white) foreground for text placed on the accent. */
|
|
165
|
-
function onAccent(accent: string): string {
|
|
166
|
-
const m = /^#?([0-9a-f]{6})$/i.exec(accent.trim())
|
|
167
|
-
if (!m) return '#ffffff'
|
|
168
|
-
const n = parseInt(m[1]!, 16)
|
|
169
|
-
const r = (n >> 16) & 255, g = (n >> 8) & 255, b = n & 255
|
|
170
|
-
// Perceived luminance (sRGB, quick approximation).
|
|
171
|
-
const lum = (0.299 * r + 0.587 * g + 0.114 * b) / 255
|
|
172
|
-
return lum > 0.6 ? '#18181b' : '#ffffff'
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
/** Resolve the effective `--sg-*` tokens for a preset in a given mode, with an
|
|
176
|
-
* optional accent override applied. */
|
|
177
|
-
export function resolveThemeTokens(preset: ThemePreset | undefined, mode: ThemeMode, accentOverride?: string): Record<string, string> {
|
|
178
|
-
const resolved = preset ?? defaultThemePreset
|
|
179
|
-
const p = resolved[mode]
|
|
180
|
-
const accent = accentOverride || p.accent
|
|
181
|
-
const status = STATUS_DEFAULTS[mode]
|
|
182
|
-
return {
|
|
183
|
-
'--sg-bg': p.bg,
|
|
184
|
-
'--sg-fg': p.fg,
|
|
185
|
-
'--sg-muted': p.muted,
|
|
186
|
-
'--sg-border': p.border,
|
|
187
|
-
'--sg-header-bg': p.headerBg,
|
|
188
|
-
'--sg-header-fg': p.headerFg,
|
|
189
|
-
...(p.headerBorder ? { '--sg-header-border': p.headerBorder } : {}),
|
|
190
|
-
...(p.headerLabel ? { '--sg-header-label-color': p.headerLabel } : {}),
|
|
191
|
-
...(resolved.headerType?.weight ? { '--sg-header-weight': resolved.headerType.weight } : {}),
|
|
192
|
-
...(resolved.headerType?.size ? { '--sg-header-size': resolved.headerType.size } : {}),
|
|
193
|
-
...(resolved.headerType?.transform ? { '--sg-header-transform': resolved.headerType.transform } : {}),
|
|
194
|
-
...(resolved.headerType?.tracking ? { '--sg-header-tracking': resolved.headerType.tracking } : {}),
|
|
195
|
-
// A subtle inset surface (used by e.g. the master-detail region behind the
|
|
196
|
-
// nested grid). Themed so it isn't a fixed light grey on dark presets.
|
|
197
|
-
// Presets whose header sits almost on the page ground set `bgSubtle`
|
|
198
|
-
// separately, otherwise their inset surfaces would vanish.
|
|
199
|
-
'--sg-bg-subtle': p.bgSubtle ?? p.headerBg,
|
|
200
|
-
'--sg-row-alt-bg': p.rowAlt,
|
|
201
|
-
'--sg-row-hover-bg': p.rowHover,
|
|
202
|
-
'--sg-selection-bg': p.selectionBg,
|
|
203
|
-
// Frozen columns/rows. Left unset the grid mixes the accent into the header
|
|
204
|
-
// color, which suits presets with a cool, low-chroma accent; a preset with a
|
|
205
|
-
// saturated accent should name these instead.
|
|
206
|
-
...(p.pinnedBg ? { '--sg-pinned-bg': p.pinnedBg } : {}),
|
|
207
|
-
...(p.pinnedHeaderBg ? { '--sg-pinned-header-bg': p.pinnedHeaderBg } : {}),
|
|
208
|
-
...(p.pinnedDivider ? { '--sg-pinned-divider': p.pinnedDivider } : {}),
|
|
209
|
-
...(p.pinnedBorder ? { '--sg-pinned-border': p.pinnedBorder } : {}),
|
|
210
|
-
...(p.pinnedShadow ? { '--sg-pinned-shadow-color': p.pinnedShadow } : {}),
|
|
211
|
-
// Inputs/checkboxes: pin to the theme's own surface so they never borrow the
|
|
212
|
-
// host page's input tokens (which is how a themed grid ended up with dark
|
|
213
|
-
// checkboxes on a light page when the host mode differed).
|
|
214
|
-
'--sg-input-bg': p.bg,
|
|
215
|
-
'--sg-input-border': p.border,
|
|
216
|
-
'--sg-accent': accent,
|
|
217
|
-
'--sg-on-accent': onAccent(accent),
|
|
218
|
-
'--sg-radius': `${resolved.radius}px`,
|
|
219
|
-
'--sg-font': resolved.font,
|
|
220
|
-
// Semantic status colors. Same reasoning as the scrollbar tokens below:
|
|
221
|
-
// the UI kit consumes these (destructive buttons, alerts, validation,
|
|
222
|
-
// badges, the rating star), so a preset that doesn't define them leaves
|
|
223
|
-
// every status color at a hard-coded red/green/amber that ignores the
|
|
224
|
-
// theme and, on dark presets, sits at the wrong lightness.
|
|
225
|
-
'--sg-danger': p.danger ?? status.danger,
|
|
226
|
-
'--sg-success': p.success ?? status.success,
|
|
227
|
-
'--sg-warning': p.warning ?? status.warning,
|
|
228
|
-
'--sg-info': p.info ?? status.info,
|
|
229
|
-
// A COLOR, not a shadow - consumed as `outline: 2px solid var(...)`.
|
|
230
|
-
'--sg-focus-ring': p.focusRing ?? accent,
|
|
231
|
-
// Derived surfaces + shape the kit reads. Deriving from the palette keeps
|
|
232
|
-
// them following the preset and the light/dark mode.
|
|
233
|
-
'--sg-muted-bg': p.rowHover,
|
|
234
|
-
'--sg-skeleton-bg': p.rowHover,
|
|
235
|
-
'--sg-radius-lg': `${resolved.radius * 2}px`,
|
|
236
|
-
'--sg-rating-on': p.warning ?? status.warning,
|
|
237
|
-
'--sg-rating-empty': p.border,
|
|
238
|
-
'--sg-invalid-fg': p.danger ?? status.danger,
|
|
239
|
-
// The grid's custom scrollbar is a shadow-DOM web component that reads its
|
|
240
|
-
// OWN --sg-scrollbar-* tokens (with fixed light-mode fallbacks). Without
|
|
241
|
-
// these it ignores the theme entirely - a light scrollbar left on a dark
|
|
242
|
-
// grid. CSS custom properties pierce shadow DOM, so defining them here (on
|
|
243
|
-
// the themed container) reaches the scrollbar. Derive them from the palette
|
|
244
|
-
// so the scrollbar tracks the preset + light/dark mode like everything else.
|
|
245
|
-
'--sg-scrollbar-bg': p.bgSubtle ?? p.headerBg,
|
|
246
|
-
'--sg-scrollbar-border': p.border,
|
|
247
|
-
'--sg-scrollbar-thumb': p.muted,
|
|
248
|
-
'--sg-scrollbar-thumb-hover': p.fg,
|
|
249
|
-
'--sg-scrollbar-thumb-active': p.fg,
|
|
250
|
-
'--sg-scrollbar-arrow': p.muted,
|
|
251
|
-
'--sg-scrollbar-arrow-hover': p.fg,
|
|
252
|
-
'--sg-scrollbar-arrow-hover-bg': p.rowHover,
|
|
253
|
-
'--sg-scrollbar-arrow-active': p.fg,
|
|
254
|
-
'--sg-scrollbar-arrow-active-bg': p.selectionBg,
|
|
255
|
-
'--sg-scrollbar-arrow-disabled': p.border,
|
|
256
|
-
}
|
|
257
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* SvGrid's built-in design-system theme presets (shadcn/ui, Tailwind, Material 3,
|
|
3
|
+
* Excel, Fluent 2, ...). Each preset carries an explicit light + dark palette;
|
|
4
|
+
* resolving one (plus a light/dark mode) yields the full `--sg-*` token set that
|
|
5
|
+
* restyles the whole grid - not just the accent.
|
|
6
|
+
*
|
|
7
|
+
* Pure, framework-agnostic data + helpers - safe to import from Node or the
|
|
8
|
+
* browser. `@svgrid/enterprise`'s Studio layer builds its `ProjectTheme`-aware
|
|
9
|
+
* wrapper on top of this module instead of keeping its own copy.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
export type ThemeMode = 'light' | 'dark'
|
|
13
|
+
|
|
14
|
+
/** The core palette for one mode. */
|
|
15
|
+
export type ThemePalette = {
|
|
16
|
+
bg: string; fg: string; muted: string; border: string
|
|
17
|
+
headerBg: string; headerFg: string; accent: string
|
|
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
|
|
38
|
+
/* Semantic status colors. The UI kit reads these for destructive buttons,
|
|
39
|
+
validation errors, alert variants, badges and the rating star. A preset
|
|
40
|
+
that omits them gets the mode-appropriate defaults below, which match the
|
|
41
|
+
inline fallbacks the components shipped with - so adding these changed
|
|
42
|
+
nothing for existing presets, it only made them themeable. */
|
|
43
|
+
/** Errors, destructive actions, invalid cells. */
|
|
44
|
+
danger?: string
|
|
45
|
+
/** Confirmations, positive deltas. */
|
|
46
|
+
success?: string
|
|
47
|
+
/** Cautions, pending states, the rating star. */
|
|
48
|
+
warning?: string
|
|
49
|
+
/** Neutral informational callouts. */
|
|
50
|
+
info?: string
|
|
51
|
+
/** Focus outline color. Defaults to the preset's accent. */
|
|
52
|
+
focusRing?: string
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/** Status-color defaults per mode - dark mode lifts them so they stay legible
|
|
56
|
+
* on a dark ground. Values match the components' own inline fallbacks. */
|
|
57
|
+
const STATUS_DEFAULTS: Record<ThemeMode, { danger: string; success: string; warning: string; info: string }> = {
|
|
58
|
+
light: { danger: '#dc2626', success: '#16a34a', warning: '#d97706', info: '#0891b2' },
|
|
59
|
+
dark: { danger: '#f87171', success: '#4ade80', warning: '#fbbf24', info: '#22d3ee' },
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export type ThemePreset = {
|
|
63
|
+
/** Stable id, e.g. used as a CSS file name (`themes/<id>.css`). */
|
|
64
|
+
id: string
|
|
65
|
+
/** Display name shown on a theme picker. */
|
|
66
|
+
name: string
|
|
67
|
+
/** Control corner rounding (px). */
|
|
68
|
+
radius: number
|
|
69
|
+
/** Font stack applied to the app surface. */
|
|
70
|
+
font: string
|
|
71
|
+
/** Header label typography. Mode-independent, like `radius` and `font`. */
|
|
72
|
+
headerType?: { weight?: string; size?: string; transform?: string; tracking?: string }
|
|
73
|
+
light: ThemePalette
|
|
74
|
+
dark: ThemePalette
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
/** The built-in theme presets, in gallery order (SvGrid's own theme first). */
|
|
78
|
+
export const themePresets: ThemePreset[] = [
|
|
79
|
+
// Ember is SvGrid's signature look - the palette svgrid.com itself runs on, so
|
|
80
|
+
// a screenshot of the site's grids is reproducible with one stylesheet import.
|
|
81
|
+
// It is shaped like the shadcn/ui preset below - white ground, stone neutrals,
|
|
82
|
+
// 6px rounding, a medium-weight muted header row, no zebra - with SvGrid's
|
|
83
|
+
// orange standing in for shadcn's near-black primary. Stone rather than zinc
|
|
84
|
+
// because the neutral has to sit next to orange without going cold, which is
|
|
85
|
+
// the same pairing shadcn's own orange base color makes.
|
|
86
|
+
// Orange is spent only on selection, focus and the active-cell ring; nothing
|
|
87
|
+
// in the chrome is tinted. The frozen columns name a neutral explicitly
|
|
88
|
+
// instead of letting the grid derive a tint from the accent (that tint landed
|
|
89
|
+
// right on top of the selection color).
|
|
90
|
+
{ id: 'ember', name: 'Ember', radius: 6, font: 'ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif',
|
|
91
|
+
headerType: { weight: '500' },
|
|
92
|
+
light: { bg: '#ffffff', fg: '#1c1917', muted: '#78716c', border: '#e7e5e4', headerBg: '#fafaf9', headerFg: '#78716c', accent: '#ff3e00', rowAlt: '#ffffff', rowHover: '#f5f5f4', selectionBg: '#ffece3',
|
|
93
|
+
bgSubtle: '#fafaf9',
|
|
94
|
+
pinnedBg: '#fafaf9', pinnedHeaderBg: '#f5f5f4', pinnedDivider: '#e7e5e4', pinnedBorder: '#e7e5e4', pinnedShadow: 'rgba(28, 25, 23, 0.10)' },
|
|
95
|
+
dark: { bg: '#0c0a09', fg: '#fafaf9', muted: '#a8a29e', border: '#292524', headerBg: '#1c1917', headerFg: '#a8a29e', accent: '#ff5a1f', rowAlt: '#0c0a09', rowHover: '#1c1917', selectionBg: '#3a2318',
|
|
96
|
+
bgSubtle: '#1c1917',
|
|
97
|
+
pinnedBg: '#151312', pinnedHeaderBg: '#1c1917', pinnedDivider: '#292524', pinnedBorder: '#292524', pinnedShadow: 'rgba(0, 0, 0, 0.50)' } },
|
|
98
|
+
{ id: 'shadcn', name: 'shadcn/ui', radius: 6, font: 'ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif',
|
|
99
|
+
light: { bg: '#ffffff', fg: '#09090b', muted: '#71717a', border: '#e4e4e7', headerBg: '#fafafa', headerFg: '#71717a', accent: '#18181b', rowAlt: '#ffffff', rowHover: '#f4f4f5', selectionBg: '#f4f4f5' },
|
|
100
|
+
dark: { bg: '#0a0a0a', fg: '#fafafa', muted: '#a1a1aa', border: '#27272a', headerBg: '#18181b', headerFg: '#a1a1aa', accent: '#fafafa', rowAlt: '#0a0a0a', rowHover: '#18181b', selectionBg: '#27272a' } },
|
|
101
|
+
{ id: 'tailwind', name: 'Tailwind', radius: 6, font: 'Inter, ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif',
|
|
102
|
+
light: { bg: '#ffffff', fg: '#0f172a', muted: '#64748b', border: '#e2e8f0', headerBg: '#f8fafc', headerFg: '#0f172a', accent: '#4f46e5', rowAlt: '#ffffff', rowHover: '#f1f5f9', selectionBg: '#e0e7ff' },
|
|
103
|
+
dark: { bg: '#0f172a', fg: '#f8fafc', muted: '#94a3b8', border: '#334155', headerBg: '#1e293b', headerFg: '#f8fafc', accent: '#818cf8', rowAlt: '#0f172a', rowHover: '#1e293b', selectionBg: '#312e81' } },
|
|
104
|
+
{ id: 'material', name: 'Material 3', radius: 8, font: '"Roboto Flex", Roboto, "Segoe UI", system-ui, sans-serif',
|
|
105
|
+
light: { bg: '#fef7ff', fg: '#1d1b20', muted: '#49454f', border: '#cac4d0', headerBg: '#f3edf7', headerFg: '#1d1b20', accent: '#6750a4', rowAlt: '#fffbfe', rowHover: '#ece6f0', selectionBg: '#e8def8' },
|
|
106
|
+
dark: { bg: '#141218', fg: '#e6e0e9', muted: '#cac4d0', border: '#49454f', headerBg: '#211f26', headerFg: '#e6e0e9', accent: '#d0bcff', rowAlt: '#141218', rowHover: '#2b2930', selectionBg: '#4a4458' } },
|
|
107
|
+
{ id: 'excel', name: 'Excel', radius: 0, font: '"Aptos", "Segoe UI", Calibri, Arial, sans-serif',
|
|
108
|
+
light: { bg: '#ffffff', fg: '#323130', muted: '#605e5c', border: '#d2d0ce', headerBg: '#f3f2f1', headerFg: '#444444', accent: '#107c41', rowAlt: '#ffffff', rowHover: '#edebe9', selectionBg: 'rgba(16, 124, 65, 0.10)' },
|
|
109
|
+
dark: { bg: '#1b1a19', fg: '#f3f2f1', muted: '#c8c6c4', border: '#3b3a39', headerBg: '#252423', headerFg: '#c8c6c4', accent: '#58c188', rowAlt: '#1b1a19', rowHover: '#323130', selectionBg: 'rgba(88, 193, 136, 0.16)' } },
|
|
110
|
+
{ id: 'fluent', name: 'Fluent 2', radius: 4, font: '"Segoe UI Variable", "Segoe UI", system-ui, sans-serif',
|
|
111
|
+
light: { bg: '#ffffff', fg: '#242424', muted: '#616161', border: '#e0e0e0', headerBg: '#f5f5f5', headerFg: '#242424', accent: '#0f6cbd', rowAlt: '#fafafa', rowHover: '#f0f0f0', selectionBg: '#ebebeb' },
|
|
112
|
+
dark: { bg: '#1f1f1f', fg: '#ffffff', muted: '#d6d6d6', border: '#666666', headerBg: '#141414', headerFg: '#ffffff', accent: '#479ef5', rowAlt: '#1a1a1a', rowHover: '#3d3d3d', selectionBg: '#383838' } },
|
|
113
|
+
{ id: 'carbon', name: 'Carbon', radius: 0, font: '"IBM Plex Sans", "Helvetica Neue", Arial, sans-serif',
|
|
114
|
+
light: { bg: '#ffffff', fg: '#161616', muted: '#525252', border: '#e0e0e0', headerBg: '#e0e0e0', headerFg: '#161616', accent: '#0f62fe', rowAlt: '#f4f4f4', rowHover: '#e8e8e8', selectionBg: '#d0e2ff' },
|
|
115
|
+
dark: { bg: '#161616', fg: '#f4f4f4', muted: '#c6c6c6', border: '#393939', headerBg: '#393939', headerFg: '#f4f4f4', accent: '#78a9ff', rowAlt: '#262626', rowHover: '#333333', selectionBg: '#393939' } },
|
|
116
|
+
{ id: 'sap', name: 'SAP Fiori', radius: 6, font: '"72", "72full", "Arial", sans-serif',
|
|
117
|
+
light: { bg: '#f5f6f7', fg: '#131e29', muted: '#556b82', border: '#e5e5e5', headerBg: '#ffffff', headerFg: '#131e29', accent: '#0070f2', rowAlt: '#f5f6f7', rowHover: '#eaecee', selectionBg: '#ebf8ff' },
|
|
118
|
+
dark: { bg: '#12171c', fg: '#f5f6f7', muted: '#8396a8', border: '#2e3742', headerBg: '#1d232a', headerFg: '#f5f6f7', accent: '#4db1ff', rowAlt: '#12171c', rowHover: '#222b35', selectionBg: '#1d2d3e' } },
|
|
119
|
+
{ id: 'salesforce', name: 'Salesforce', radius: 4, font: '"Salesforce Sans", "SF Pro", Helvetica, Arial, sans-serif',
|
|
120
|
+
light: { bg: '#ffffff', fg: '#181818', muted: '#757575', border: '#c9c9c9', headerBg: '#f3f3f3', headerFg: '#181818', accent: '#0176d3', rowAlt: '#ffffff', rowHover: '#f3f3f3', selectionBg: '#ecebea' },
|
|
121
|
+
dark: { bg: '#181818', fg: '#ffffff', muted: '#c9c9c9', border: '#3e3e3c', headerBg: '#2e2e2e', headerFg: '#ffffff', accent: '#1b96ff', rowAlt: '#181818', rowHover: '#2e2e2e', selectionBg: '#1e4d8e' } },
|
|
122
|
+
{ id: 'atlassian', name: 'Atlassian', radius: 3, font: '"Charlie Display", "Atlassian Sans", -apple-system, "Segoe UI", sans-serif',
|
|
123
|
+
light: { bg: '#ffffff', fg: '#172b4d', muted: '#44546f', border: '#dcdfe4', headerBg: '#fafbfc', headerFg: '#44546f', accent: '#0c66e4', rowAlt: '#ffffff', rowHover: '#f1f2f4', selectionBg: '#e9f2ff' },
|
|
124
|
+
dark: { bg: '#1d2125', fg: '#b6c2cf', muted: '#8590a2', border: '#38414a', headerBg: '#22272b', headerFg: '#8590a2', accent: '#579dff', rowAlt: '#1d2125', rowHover: '#2c333a', selectionBg: '#09326c' } },
|
|
125
|
+
{ id: 'github', name: 'GitHub', radius: 6, font: '-apple-system, BlinkMacSystemFont, "Segoe UI", "Noto Sans", Helvetica, Arial, sans-serif',
|
|
126
|
+
light: { bg: '#ffffff', fg: '#1f2328', muted: '#59636e', border: '#d1d9e0', headerBg: '#f6f8fa', headerFg: '#59636e', accent: '#0969da', rowAlt: '#ffffff', rowHover: '#f6f8fa', selectionBg: '#ddf4ff' },
|
|
127
|
+
dark: { bg: '#0d1117', fg: '#f0f6fc', muted: '#9198a1', border: '#3d444d', headerBg: '#151b23', headerFg: '#9198a1', accent: '#4493f8', rowAlt: '#0d1117', rowHover: '#151b23', selectionBg: 'rgba(56, 139, 253, 0.10)' } },
|
|
128
|
+
{ id: 'antd', name: 'Ant Design', radius: 6, font: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "PingFang SC", sans-serif',
|
|
129
|
+
light: { bg: '#ffffff', fg: 'rgba(0, 0, 0, 0.88)', muted: 'rgba(0, 0, 0, 0.65)', border: '#d9d9d9', headerBg: '#fafafa', headerFg: 'rgba(0, 0, 0, 0.88)', accent: '#1677ff', rowAlt: '#ffffff', rowHover: '#f5f5f5', selectionBg: '#e6f4ff' },
|
|
130
|
+
dark: { bg: '#141414', fg: 'rgba(255, 255, 255, 0.85)', muted: 'rgba(255, 255, 255, 0.65)', border: '#424242', headerBg: '#1f1f1f', headerFg: 'rgba(255, 255, 255, 0.85)', accent: '#177ddc', rowAlt: '#141414', rowHover: '#262626', selectionBg: '#111a2c' } },
|
|
131
|
+
{ id: 'ag-alpine', name: 'Alpine', radius: 3, font: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
|
|
132
|
+
light: { bg: '#ffffff', fg: '#181d1f', muted: 'rgba(24, 29, 31, 0.5)', border: '#babfc7', headerBg: '#f8f8f8', headerFg: '#181d1f', accent: '#2196f3', rowAlt: '#fcfcfc', rowHover: 'rgba(33, 150, 243, 0.1)', selectionBg: 'rgba(33, 150, 243, 0.3)' },
|
|
133
|
+
dark: { bg: '#181d1f', fg: '#ffffff', muted: 'rgba(255, 255, 255, 0.5)', border: '#68686e', headerBg: '#222628', headerFg: '#ffffff', accent: '#2196f3', rowAlt: '#222628', rowHover: 'rgba(33, 150, 243, 0.1)', selectionBg: 'rgba(33, 150, 243, 0.3)' } },
|
|
134
|
+
{ id: 'bootstrap', name: 'Bootstrap 5', radius: 6, font: 'system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif',
|
|
135
|
+
light: { bg: '#ffffff', fg: '#212529', muted: '#6c757d', border: '#dee2e6', headerBg: '#f8f9fa', headerFg: '#212529', accent: '#0d6efd', rowAlt: '#fcfcfd', rowHover: '#f2f2f2', selectionBg: '#cfe2ff' },
|
|
136
|
+
dark: { bg: '#212529', fg: '#dee2e6', muted: '#adb5bd', border: '#495057', headerBg: '#2b3035', headerFg: '#dee2e6', accent: '#0d6efd', rowAlt: '#25292e', rowHover: '#2c3034', selectionBg: '#031633' } },
|
|
137
|
+
{ id: 'vercel', name: 'Vercel', radius: 6, font: '"Geist", "Geist Sans", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
|
|
138
|
+
light: { bg: '#ffffff', fg: '#000000', muted: '#666666', border: '#eaeaea', headerBg: '#fafafa', headerFg: '#666666', accent: '#0070f3', rowAlt: '#fafafa', rowHover: '#f5f5f5', selectionBg: '#e8f0fe' },
|
|
139
|
+
dark: { bg: '#000000', fg: '#ffffff', muted: '#888888', border: '#333333', headerBg: '#111111', headerFg: '#888888', accent: '#3291ff', rowAlt: '#0a0a0a', rowHover: '#1a1a1a', selectionBg: '#0d2847' } },
|
|
140
|
+
{ id: 'linear', name: 'Linear', radius: 6, font: '"Inter Variable", "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif',
|
|
141
|
+
light: { bg: '#ffffff', fg: '#282a30', muted: '#6b6f76', border: '#e9e9eb', headerBg: '#f7f8f8', headerFg: '#6b6f76', accent: '#5e6ad2', rowAlt: '#fbfbfc', rowHover: '#f4f4f5', selectionBg: '#e8eafd' },
|
|
142
|
+
dark: { bg: '#08090a', fg: '#f7f8f8', muted: '#8a8f98', border: '#23252a', headerBg: '#0f1011', headerFg: '#8a8f98', accent: '#5e6ad2', rowAlt: '#0f1011', rowHover: '#1a1b1e', selectionBg: '#2a2d4a' } },
|
|
143
|
+
{ id: 'notion', name: 'Notion', radius: 4, font: 'ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif',
|
|
144
|
+
light: { bg: '#ffffff', fg: '#37352f', muted: '#787774', border: '#e9e9e7', headerBg: '#f7f6f3', headerFg: '#787774', accent: '#2383e2', rowAlt: '#fbfbfa', rowHover: '#f1f1ef', selectionBg: '#d9eaf7' },
|
|
145
|
+
dark: { bg: '#191919', fg: '#d4d4d4', muted: '#9b9b9b', border: '#2f2f2f', headerBg: '#202020', headerFg: '#9b9b9b', accent: '#529cca', rowAlt: '#1c1c1c', rowHover: '#252525', selectionBg: '#20415c' } },
|
|
146
|
+
{ id: 'nord', name: 'Nord', radius: 4, font: '"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
|
|
147
|
+
light: { bg: '#eceff4', fg: '#2e3440', muted: '#4c566a', border: '#d8dee9', headerBg: '#e5e9f0', headerFg: '#2e3440', accent: '#5e81ac', rowAlt: '#e5e9f0', rowHover: '#dde3ec', selectionBg: '#d8dee9' },
|
|
148
|
+
dark: { bg: '#2e3440', fg: '#d8dee9', muted: '#4c566a', border: '#434c5e', headerBg: '#3b4252', headerFg: '#e5e9f0', accent: '#88c0d0', rowAlt: '#333b48', rowHover: '#3b4252', selectionBg: '#434c5e' } },
|
|
149
|
+
{ id: 'dracula', name: 'Dracula', radius: 6, font: '-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
|
|
150
|
+
light: { bg: '#fffbeb', fg: '#1f1f1f', muted: '#6c664b', border: '#dedccf', headerBg: '#ece9df', headerFg: '#1f1f1f', accent: '#644ac9', rowAlt: '#fffdf5', rowHover: '#f2efe3', selectionBg: '#cfcfde' },
|
|
151
|
+
dark: { bg: '#282a36', fg: '#f8f8f2', muted: '#6272a4', border: '#44475a', headerBg: '#21222c', headerFg: '#f8f8f2', accent: '#bd93f9', rowAlt: '#2d2f3b', rowHover: '#343746', selectionBg: '#44475a' } },
|
|
152
|
+
{ id: 'catppuccin', name: 'Catppuccin', radius: 8, font: '"Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif',
|
|
153
|
+
light: { bg: '#eff1f5', fg: '#4c4f69', muted: '#6c6f85', border: '#ccd0da', headerBg: '#e6e9ef', headerFg: '#4c4f69', accent: '#8839ef', rowAlt: '#e6e9ef', rowHover: '#dce0e8', selectionBg: '#dce0e8' },
|
|
154
|
+
dark: { bg: '#1e1e2e', fg: '#cdd6f4', muted: '#a6adc8', border: '#313244', headerBg: '#181825', headerFg: '#cdd6f4', accent: '#cba6f7', rowAlt: '#1a1a28', rowHover: '#313244', selectionBg: '#45475a' } },
|
|
155
|
+
]
|
|
156
|
+
|
|
157
|
+
/** The default preset (used when nothing is chosen). */
|
|
158
|
+
export const defaultThemePreset: ThemePreset = themePresets.find((t) => t.id === 'tailwind') ?? themePresets[0]!
|
|
159
|
+
|
|
160
|
+
/** Look up a preset by id. */
|
|
161
|
+
export const getThemePreset = (id?: string): ThemePreset | undefined =>
|
|
162
|
+
id ? themePresets.find((t) => t.id === id) : undefined
|
|
163
|
+
|
|
164
|
+
/** A readable (near-black / white) foreground for text placed on the accent. */
|
|
165
|
+
function onAccent(accent: string): string {
|
|
166
|
+
const m = /^#?([0-9a-f]{6})$/i.exec(accent.trim())
|
|
167
|
+
if (!m) return '#ffffff'
|
|
168
|
+
const n = parseInt(m[1]!, 16)
|
|
169
|
+
const r = (n >> 16) & 255, g = (n >> 8) & 255, b = n & 255
|
|
170
|
+
// Perceived luminance (sRGB, quick approximation).
|
|
171
|
+
const lum = (0.299 * r + 0.587 * g + 0.114 * b) / 255
|
|
172
|
+
return lum > 0.6 ? '#18181b' : '#ffffff'
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
/** Resolve the effective `--sg-*` tokens for a preset in a given mode, with an
|
|
176
|
+
* optional accent override applied. */
|
|
177
|
+
export function resolveThemeTokens(preset: ThemePreset | undefined, mode: ThemeMode, accentOverride?: string): Record<string, string> {
|
|
178
|
+
const resolved = preset ?? defaultThemePreset
|
|
179
|
+
const p = resolved[mode]
|
|
180
|
+
const accent = accentOverride || p.accent
|
|
181
|
+
const status = STATUS_DEFAULTS[mode]
|
|
182
|
+
return {
|
|
183
|
+
'--sg-bg': p.bg,
|
|
184
|
+
'--sg-fg': p.fg,
|
|
185
|
+
'--sg-muted': p.muted,
|
|
186
|
+
'--sg-border': p.border,
|
|
187
|
+
'--sg-header-bg': p.headerBg,
|
|
188
|
+
'--sg-header-fg': p.headerFg,
|
|
189
|
+
...(p.headerBorder ? { '--sg-header-border': p.headerBorder } : {}),
|
|
190
|
+
...(p.headerLabel ? { '--sg-header-label-color': p.headerLabel } : {}),
|
|
191
|
+
...(resolved.headerType?.weight ? { '--sg-header-weight': resolved.headerType.weight } : {}),
|
|
192
|
+
...(resolved.headerType?.size ? { '--sg-header-size': resolved.headerType.size } : {}),
|
|
193
|
+
...(resolved.headerType?.transform ? { '--sg-header-transform': resolved.headerType.transform } : {}),
|
|
194
|
+
...(resolved.headerType?.tracking ? { '--sg-header-tracking': resolved.headerType.tracking } : {}),
|
|
195
|
+
// A subtle inset surface (used by e.g. the master-detail region behind the
|
|
196
|
+
// nested grid). Themed so it isn't a fixed light grey on dark presets.
|
|
197
|
+
// Presets whose header sits almost on the page ground set `bgSubtle`
|
|
198
|
+
// separately, otherwise their inset surfaces would vanish.
|
|
199
|
+
'--sg-bg-subtle': p.bgSubtle ?? p.headerBg,
|
|
200
|
+
'--sg-row-alt-bg': p.rowAlt,
|
|
201
|
+
'--sg-row-hover-bg': p.rowHover,
|
|
202
|
+
'--sg-selection-bg': p.selectionBg,
|
|
203
|
+
// Frozen columns/rows. Left unset the grid mixes the accent into the header
|
|
204
|
+
// color, which suits presets with a cool, low-chroma accent; a preset with a
|
|
205
|
+
// saturated accent should name these instead.
|
|
206
|
+
...(p.pinnedBg ? { '--sg-pinned-bg': p.pinnedBg } : {}),
|
|
207
|
+
...(p.pinnedHeaderBg ? { '--sg-pinned-header-bg': p.pinnedHeaderBg } : {}),
|
|
208
|
+
...(p.pinnedDivider ? { '--sg-pinned-divider': p.pinnedDivider } : {}),
|
|
209
|
+
...(p.pinnedBorder ? { '--sg-pinned-border': p.pinnedBorder } : {}),
|
|
210
|
+
...(p.pinnedShadow ? { '--sg-pinned-shadow-color': p.pinnedShadow } : {}),
|
|
211
|
+
// Inputs/checkboxes: pin to the theme's own surface so they never borrow the
|
|
212
|
+
// host page's input tokens (which is how a themed grid ended up with dark
|
|
213
|
+
// checkboxes on a light page when the host mode differed).
|
|
214
|
+
'--sg-input-bg': p.bg,
|
|
215
|
+
'--sg-input-border': p.border,
|
|
216
|
+
'--sg-accent': accent,
|
|
217
|
+
'--sg-on-accent': onAccent(accent),
|
|
218
|
+
'--sg-radius': `${resolved.radius}px`,
|
|
219
|
+
'--sg-font': resolved.font,
|
|
220
|
+
// Semantic status colors. Same reasoning as the scrollbar tokens below:
|
|
221
|
+
// the UI kit consumes these (destructive buttons, alerts, validation,
|
|
222
|
+
// badges, the rating star), so a preset that doesn't define them leaves
|
|
223
|
+
// every status color at a hard-coded red/green/amber that ignores the
|
|
224
|
+
// theme and, on dark presets, sits at the wrong lightness.
|
|
225
|
+
'--sg-danger': p.danger ?? status.danger,
|
|
226
|
+
'--sg-success': p.success ?? status.success,
|
|
227
|
+
'--sg-warning': p.warning ?? status.warning,
|
|
228
|
+
'--sg-info': p.info ?? status.info,
|
|
229
|
+
// A COLOR, not a shadow - consumed as `outline: 2px solid var(...)`.
|
|
230
|
+
'--sg-focus-ring': p.focusRing ?? accent,
|
|
231
|
+
// Derived surfaces + shape the kit reads. Deriving from the palette keeps
|
|
232
|
+
// them following the preset and the light/dark mode.
|
|
233
|
+
'--sg-muted-bg': p.rowHover,
|
|
234
|
+
'--sg-skeleton-bg': p.rowHover,
|
|
235
|
+
'--sg-radius-lg': `${resolved.radius * 2}px`,
|
|
236
|
+
'--sg-rating-on': p.warning ?? status.warning,
|
|
237
|
+
'--sg-rating-empty': p.border,
|
|
238
|
+
'--sg-invalid-fg': p.danger ?? status.danger,
|
|
239
|
+
// The grid's custom scrollbar is a shadow-DOM web component that reads its
|
|
240
|
+
// OWN --sg-scrollbar-* tokens (with fixed light-mode fallbacks). Without
|
|
241
|
+
// these it ignores the theme entirely - a light scrollbar left on a dark
|
|
242
|
+
// grid. CSS custom properties pierce shadow DOM, so defining them here (on
|
|
243
|
+
// the themed container) reaches the scrollbar. Derive them from the palette
|
|
244
|
+
// so the scrollbar tracks the preset + light/dark mode like everything else.
|
|
245
|
+
'--sg-scrollbar-bg': p.bgSubtle ?? p.headerBg,
|
|
246
|
+
'--sg-scrollbar-border': p.border,
|
|
247
|
+
'--sg-scrollbar-thumb': p.muted,
|
|
248
|
+
'--sg-scrollbar-thumb-hover': p.fg,
|
|
249
|
+
'--sg-scrollbar-thumb-active': p.fg,
|
|
250
|
+
'--sg-scrollbar-arrow': p.muted,
|
|
251
|
+
'--sg-scrollbar-arrow-hover': p.fg,
|
|
252
|
+
'--sg-scrollbar-arrow-hover-bg': p.rowHover,
|
|
253
|
+
'--sg-scrollbar-arrow-active': p.fg,
|
|
254
|
+
'--sg-scrollbar-arrow-active-bg': p.selectionBg,
|
|
255
|
+
'--sg-scrollbar-arrow-disabled': p.border,
|
|
256
|
+
}
|
|
257
|
+
}
|