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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vue2-excel-grid",
3
- "version": "2.10.0",
3
+ "version": "2.11.0",
4
4
  "description": "Excel-style grid component for Vue 2.6.14 with virtual scrolling",
5
5
  "license": "MIT",
6
6
  "author": "Fozilbek Raimberdiyev",
@@ -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
- if (ExcelGrid.props && ExcelGrid.props[key] !== undefined) {
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)