vue2-excel-grid 2.10.0 → 2.11.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/dist/vue2-excel-grid.esm.js +56 -7
- package/dist/vue2-excel-grid.umd.js +3 -3
- package/package.json +1 -1
- package/src/components/ExcelGrid.vue +149 -1
- package/src/config.js +22 -0
- package/src/index.js +5 -2
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div
|
|
3
3
|
class="eg-shell"
|
|
4
|
-
:class="['eg-size-' + internalSize, 'eg-theme-' + internalTheme, { 'eg-shell-fullscreen': isFullscreen, 'eg-locked': internalLocked }]"
|
|
4
|
+
:class="['eg-size-' + internalSize, 'eg-theme-' + internalTheme, { 'eg-shell-fullscreen': isFullscreen, 'eg-locked': internalLocked, 'eg-dark': isDarkMode }]"
|
|
5
5
|
:style="shellStyle"
|
|
6
6
|
>
|
|
7
7
|
<!-- Toolbar -->
|
|
@@ -1021,6 +1021,7 @@ import { formatNumber as _formatNumber } from '../utils/numberFormat.js'
|
|
|
1021
1021
|
import { Mask, MaskInput } from '../utils/mask.js'
|
|
1022
1022
|
import { listVersions, getVersion, deleteVersion, saveOrTouchVersion, putBuffer, getBuffer, clearBuffer } from '../utils/idbStore.js'
|
|
1023
1023
|
import { hashRows, hashRowsAsync } from '../utils/dataHash.js'
|
|
1024
|
+
import { globalConfig } from '../config.js'
|
|
1024
1025
|
|
|
1025
1026
|
const SIZE_CONFIG = {
|
|
1026
1027
|
small: { row: 22, header: 24, footer: 24, filter: 26 },
|
|
@@ -1475,6 +1476,15 @@ const ExcelGridComponent = {
|
|
|
1475
1476
|
*/
|
|
1476
1477
|
theme: { type: String, default: 'antd' },
|
|
1477
1478
|
|
|
1479
|
+
/**
|
|
1480
|
+
* Dark mode toggle.
|
|
1481
|
+
* - `true`: enables dark mode styling and sets `color-scheme: dark`.
|
|
1482
|
+
* - `false`: forces light mode styling and sets `color-scheme: light` (prevents OS dark mode leak).
|
|
1483
|
+
* - `null` / `undefined` (default): inherits the global configuration from `Vue.use(Vue2ExcelGrid, { darkMode })`.
|
|
1484
|
+
* Accepts a Boolean, a getter Function (`() => boolean`), or `'auto'` / `'system'`.
|
|
1485
|
+
*/
|
|
1486
|
+
darkMode: { type: [Boolean, Function, String], default: null },
|
|
1487
|
+
|
|
1478
1488
|
/**
|
|
1479
1489
|
* Shows a filter row directly beneath the column headers (inside the
|
|
1480
1490
|
* sticky header area). Each leaf column gets a filter control matched to
|
|
@@ -1844,6 +1854,19 @@ const ExcelGridComponent = {
|
|
|
1844
1854
|
},
|
|
1845
1855
|
|
|
1846
1856
|
computed: {
|
|
1857
|
+
isDarkMode() {
|
|
1858
|
+
let val = this.darkMode
|
|
1859
|
+
if (val === null || val === undefined) {
|
|
1860
|
+
val = globalConfig ? globalConfig.darkMode : null
|
|
1861
|
+
}
|
|
1862
|
+
if (typeof val === 'function') {
|
|
1863
|
+
val = val()
|
|
1864
|
+
}
|
|
1865
|
+
if (val === 'auto' || val === 'system') {
|
|
1866
|
+
return typeof window !== 'undefined' && !!window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches
|
|
1867
|
+
}
|
|
1868
|
+
return Boolean(val)
|
|
1869
|
+
},
|
|
1847
1870
|
hoverTooltipStyle() {
|
|
1848
1871
|
if (!this.hoverTooltip) return {}
|
|
1849
1872
|
const { rect, text } = this.hoverTooltip
|
|
@@ -7404,6 +7427,9 @@ export default ExcelGridComponent
|
|
|
7404
7427
|
border: 1px solid var(--eg-color-border, var(--eg-color-border-default));
|
|
7405
7428
|
border-radius: var(--eg-radius, var(--eg-radius-default));
|
|
7406
7429
|
overflow: hidden;
|
|
7430
|
+
color-scheme: light;
|
|
7431
|
+
background: var(--eg-color-cell-bg, var(--eg-color-cell-bg-default));
|
|
7432
|
+
color: var(--eg-color-text, var(--eg-color-text-default));
|
|
7407
7433
|
}
|
|
7408
7434
|
|
|
7409
7435
|
.eg-shell-fullscreen {
|
|
@@ -7698,6 +7724,128 @@ export default ExcelGridComponent
|
|
|
7698
7724
|
--eg-color-row-stripe-default: #FAFBFB;
|
|
7699
7725
|
}
|
|
7700
7726
|
|
|
7727
|
+
/* ── Dark Mode ─────────────────────────────────────────────────── */
|
|
7728
|
+
.eg-shell.eg-dark {
|
|
7729
|
+
color-scheme: dark;
|
|
7730
|
+
|
|
7731
|
+
/* Accent (lighter for dark backgrounds) */
|
|
7732
|
+
--eg-color-accent-default: #4aba7c;
|
|
7733
|
+
--eg-color-accent-dark-default: #2d9e5c;
|
|
7734
|
+
--eg-color-accent-soft-default: rgba(74, 186, 124, 0.2);
|
|
7735
|
+
|
|
7736
|
+
/* Error */
|
|
7737
|
+
--eg-color-error-default: #f87171;
|
|
7738
|
+
--eg-color-error-soft-default: #2d0f0f;
|
|
7739
|
+
--eg-color-error-dark-default: #fca5a5;
|
|
7740
|
+
|
|
7741
|
+
/* Borders */
|
|
7742
|
+
--eg-color-border-default: #3d3d3d;
|
|
7743
|
+
--eg-color-border-cell-default: #2a2a2a;
|
|
7744
|
+
--eg-color-border-strong-default: #555555;
|
|
7745
|
+
|
|
7746
|
+
/* Headers */
|
|
7747
|
+
--eg-color-header-bg-default: #252525;
|
|
7748
|
+
--eg-color-header-group-bg-default: #252525;
|
|
7749
|
+
--eg-color-group-border-default: #2d9e5c;
|
|
7750
|
+
--eg-color-group-bg-collapsed-default: #217346;
|
|
7751
|
+
|
|
7752
|
+
/* Cell states */
|
|
7753
|
+
--eg-color-cell-bg-default: #1e1e1e;
|
|
7754
|
+
--eg-color-cell-selected-default: #1a3d2a;
|
|
7755
|
+
--eg-color-cell-fill-preview-default: #145022;
|
|
7756
|
+
--eg-color-cell-readonly-default: #171717;
|
|
7757
|
+
--eg-color-cell-readonly-selected-default: #163020;
|
|
7758
|
+
--eg-color-cell-readonly-pattern-default: rgba(255, 255, 255, 0.06);
|
|
7759
|
+
--eg-color-footer-bg-default: #1a1a1a;
|
|
7760
|
+
|
|
7761
|
+
/* Row effects */
|
|
7762
|
+
--eg-color-row-hover-default: #242f27;
|
|
7763
|
+
--eg-color-row-stripe-default: #1a1a1a;
|
|
7764
|
+
|
|
7765
|
+
/* Dropdown / Select / Context menu */
|
|
7766
|
+
--eg-color-option-hover-bg-default: #242f27;
|
|
7767
|
+
--eg-color-option-active-hover-bg-default: #1a4d30;
|
|
7768
|
+
--eg-color-overlay-bg-default: rgba(28, 28, 28, 0.95);
|
|
7769
|
+
|
|
7770
|
+
/* Checkbox */
|
|
7771
|
+
--eg-color-checkbox-border-default: #6e6e6e;
|
|
7772
|
+
--eg-color-checkbox-disabled-checked-default: #404040;
|
|
7773
|
+
|
|
7774
|
+
/* Text */
|
|
7775
|
+
--eg-color-text-default: #d4d4d4;
|
|
7776
|
+
--eg-color-text-secondary-default: #a0a0a0;
|
|
7777
|
+
--eg-color-text-muted-default: #6e6e6e;
|
|
7778
|
+
|
|
7779
|
+
/* Shadows */
|
|
7780
|
+
--eg-shadow-dropdown-default: 1px 2px 10px rgba(0, 0, 0, 0.55);
|
|
7781
|
+
--eg-shadow-dialog-default: 0 2px 16px rgba(0, 0, 0, 0.65);
|
|
7782
|
+
--eg-shadow-tooltip-default: 0 1px 5px rgba(0, 0, 0, 0.55);
|
|
7783
|
+
--eg-color-freeze-shadow-default: rgba(0, 0, 0, 0.45);
|
|
7784
|
+
}
|
|
7785
|
+
|
|
7786
|
+
/* Theme-specific dark mode adjustments */
|
|
7787
|
+
.eg-shell.eg-theme-antd.eg-dark {
|
|
7788
|
+
--eg-color-accent-default: #1668DC;
|
|
7789
|
+
--eg-color-accent-dark-default: #1554AD;
|
|
7790
|
+
--eg-color-accent-soft-default: #111A2C;
|
|
7791
|
+
--eg-color-cell-selected-default: #111A2C;
|
|
7792
|
+
--eg-color-cell-fill-preview-default: #153450;
|
|
7793
|
+
--eg-color-row-hover-default: #1f1f1f;
|
|
7794
|
+
--eg-color-option-hover-bg-default: #111A2C;
|
|
7795
|
+
}
|
|
7796
|
+
|
|
7797
|
+
.eg-shell.eg-theme-material.eg-dark {
|
|
7798
|
+
--eg-color-accent-default: #90CAF9;
|
|
7799
|
+
--eg-color-accent-dark-default: #42A5F5;
|
|
7800
|
+
--eg-color-accent-soft-default: #1E2A38;
|
|
7801
|
+
--eg-color-cell-selected-default: #1E2A38;
|
|
7802
|
+
}
|
|
7803
|
+
|
|
7804
|
+
.eg-shell.eg-theme-polaris.eg-dark {
|
|
7805
|
+
--eg-color-accent-default: #00A67E;
|
|
7806
|
+
--eg-color-accent-dark-default: #008060;
|
|
7807
|
+
--eg-color-accent-soft-default: #102A22;
|
|
7808
|
+
--eg-color-cell-selected-default: #102A22;
|
|
7809
|
+
}
|
|
7810
|
+
|
|
7811
|
+
.eg-shell.eg-theme-carbon.eg-dark {
|
|
7812
|
+
--eg-color-accent-default: #4589FF;
|
|
7813
|
+
--eg-color-accent-dark-default: #0F62FE;
|
|
7814
|
+
--eg-color-accent-soft-default: #002D9C;
|
|
7815
|
+
--eg-color-cell-selected-default: #002D9C;
|
|
7816
|
+
}
|
|
7817
|
+
|
|
7818
|
+
.eg-shell.eg-theme-fluent.eg-dark {
|
|
7819
|
+
--eg-color-accent-default: #2886DE;
|
|
7820
|
+
--eg-color-accent-dark-default: #0078D4;
|
|
7821
|
+
--eg-color-accent-soft-default: #0C2B47;
|
|
7822
|
+
--eg-color-cell-selected-default: #0C2B47;
|
|
7823
|
+
}
|
|
7824
|
+
|
|
7825
|
+
/* Dark scrollbars */
|
|
7826
|
+
.eg-shell.eg-dark .eg-container::-webkit-scrollbar,
|
|
7827
|
+
.eg-shell.eg-dark .eg-scroll-body::-webkit-scrollbar,
|
|
7828
|
+
.eg-shell.eg-dark .eg-main-cells::-webkit-scrollbar {
|
|
7829
|
+
width: 10px;
|
|
7830
|
+
height: 10px;
|
|
7831
|
+
}
|
|
7832
|
+
.eg-shell.eg-dark .eg-container::-webkit-scrollbar-track,
|
|
7833
|
+
.eg-shell.eg-dark .eg-scroll-body::-webkit-scrollbar-track,
|
|
7834
|
+
.eg-shell.eg-dark .eg-main-cells::-webkit-scrollbar-track {
|
|
7835
|
+
background: #1e1e1e;
|
|
7836
|
+
}
|
|
7837
|
+
.eg-shell.eg-dark .eg-container::-webkit-scrollbar-thumb,
|
|
7838
|
+
.eg-shell.eg-dark .eg-scroll-body::-webkit-scrollbar-thumb,
|
|
7839
|
+
.eg-shell.eg-dark .eg-main-cells::-webkit-scrollbar-thumb {
|
|
7840
|
+
background: #3d3d3d;
|
|
7841
|
+
border-radius: 4px;
|
|
7842
|
+
}
|
|
7843
|
+
.eg-shell.eg-dark .eg-container::-webkit-scrollbar-thumb:hover,
|
|
7844
|
+
.eg-shell.eg-dark .eg-scroll-body::-webkit-scrollbar-thumb:hover,
|
|
7845
|
+
.eg-shell.eg-dark .eg-main-cells::-webkit-scrollbar-thumb:hover {
|
|
7846
|
+
background: #555555;
|
|
7847
|
+
}
|
|
7848
|
+
|
|
7701
7849
|
.eg-wrapper {
|
|
7702
7850
|
display: flex;
|
|
7703
7851
|
flex-direction: column;
|
package/src/config.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import Vue from 'vue'
|
|
2
|
+
|
|
3
|
+
const state = (Vue && typeof Vue.observable === 'function')
|
|
4
|
+
? Vue.observable({ darkMode: null })
|
|
5
|
+
: { darkMode: null }
|
|
6
|
+
|
|
7
|
+
export const globalConfig = state
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Update global vue2-excel-grid configuration reactively.
|
|
11
|
+
* @param {Object} options
|
|
12
|
+
*/
|
|
13
|
+
export function setGlobalGridConfig(options = {}) {
|
|
14
|
+
if (options && typeof options === 'object') {
|
|
15
|
+
Object.keys(options).forEach(key => {
|
|
16
|
+
globalConfig[key] = options[key]
|
|
17
|
+
})
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export const setGlobalConfig = setGlobalGridConfig
|
|
22
|
+
|
package/src/index.js
CHANGED
|
@@ -3,15 +3,17 @@ import EgCheckbox from './components/EgCheckbox.vue'
|
|
|
3
3
|
import EgSelect from './components/EgSelect.vue'
|
|
4
4
|
import EgTreeSelect from './components/EgTreeSelect.vue'
|
|
5
5
|
import { version } from '../package.json'
|
|
6
|
+
import { globalConfig, setGlobalGridConfig, setGlobalConfig } from './config.js'
|
|
6
7
|
|
|
7
|
-
export { ExcelGrid, EgCheckbox, EgSelect, EgTreeSelect, version }
|
|
8
|
+
export { ExcelGrid, EgCheckbox, EgSelect, EgTreeSelect, version, globalConfig, setGlobalGridConfig, setGlobalConfig }
|
|
8
9
|
|
|
9
10
|
export default {
|
|
10
11
|
version,
|
|
11
12
|
install(Vue, options = {}) {
|
|
12
13
|
if (options && typeof options === 'object') {
|
|
13
14
|
Object.keys(options).forEach(key => {
|
|
14
|
-
|
|
15
|
+
globalConfig[key] = options[key]
|
|
16
|
+
if (key !== 'darkMode' && ExcelGrid.props && ExcelGrid.props[key] !== undefined) {
|
|
15
17
|
const val = options[key]
|
|
16
18
|
if (typeof ExcelGrid.props[key] !== 'object') {
|
|
17
19
|
// Convert to object notation if it was just a constructor like `props: { fitColumns: Boolean }`
|
|
@@ -21,6 +23,7 @@ export default {
|
|
|
21
23
|
}
|
|
22
24
|
})
|
|
23
25
|
}
|
|
26
|
+
Vue.prototype.$excelGridConfig = globalConfig
|
|
24
27
|
Vue.component('Vue2ExcelGrid', ExcelGrid)
|
|
25
28
|
Vue.component('Vue2EgCheckbox', EgCheckbox)
|
|
26
29
|
Vue.component('Vue2EgSelect', EgSelect)
|