@opencorestack/opengridx 0.1.6 → 0.1.7

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.
Files changed (129) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +9 -0
  3. package/dist/index.d.ts +6 -0
  4. package/dist/opengridx.es.js +6 -6
  5. package/dist/opengridx.es.js.map +1 -1
  6. package/dist/opengridx.umd.js +4 -4
  7. package/dist/opengridx.umd.js.map +1 -1
  8. package/docs/API_REFERENCE.md +177 -0
  9. package/docs/README.md +60 -0
  10. package/docs/components/cell.md +44 -0
  11. package/docs/components/column-group-header.md +57 -0
  12. package/docs/components/column-resize.md +63 -0
  13. package/docs/components/column-visibility.md +61 -0
  14. package/docs/components/datagrid.md +70 -0
  15. package/docs/components/filter-panel.md +26 -0
  16. package/docs/components/header.md +39 -0
  17. package/docs/components/pagination.md +34 -0
  18. package/docs/components/row.md +31 -0
  19. package/docs/components/toolbar.md +40 -0
  20. package/docs/components/tooltip.md +68 -0
  21. package/docs/customization/slots-api.md +227 -0
  22. package/docs/customization/theming.md +293 -0
  23. package/docs/features/aggregation-pivot.md +79 -0
  24. package/docs/features/cell-spanning.md +520 -0
  25. package/docs/features/clipboard.md +76 -0
  26. package/docs/features/custom-pagination.md +143 -0
  27. package/docs/features/data-source.md +72 -0
  28. package/docs/features/editing-reordering.md +99 -0
  29. package/docs/features/export-guide.md +434 -0
  30. package/docs/features/filtering.md +83 -0
  31. package/docs/features/infinite-scroll.md +87 -0
  32. package/docs/features/list-view.md +65 -0
  33. package/docs/features/loading-states.md +68 -0
  34. package/docs/features/master-detail.md +46 -0
  35. package/docs/features/pinning.md +67 -0
  36. package/docs/features/selection.md +70 -0
  37. package/docs/features/sorting-pagination.md +66 -0
  38. package/docs/features/state-persistence.md +67 -0
  39. package/docs/features/tree-data-grouping.md +67 -0
  40. package/docs/features/virtualization.md +188 -0
  41. package/docs/roadmap.md +71 -0
  42. package/lib/components/Cell/Cell.css +119 -0
  43. package/lib/components/Cell/Cell.tsx +264 -0
  44. package/lib/components/Cell/GridEditInputCell.css +62 -0
  45. package/lib/components/Cell/GridEditInputCell.tsx +152 -0
  46. package/lib/components/ColumnGroupHeader/ColumnGroupHeader.css +67 -0
  47. package/lib/components/ColumnGroupHeader/ColumnGroupHeader.tsx +220 -0
  48. package/lib/components/ColumnResizeHandle/ColumnResizeHandle.css +31 -0
  49. package/lib/components/ColumnResizeHandle/ColumnResizeHandle.tsx +85 -0
  50. package/lib/components/ColumnVisibilityPanel/ColumnVisibilityPanel.css +137 -0
  51. package/lib/components/ColumnVisibilityPanel/ColumnVisibilityPanel.tsx +190 -0
  52. package/lib/components/DataGrid/DataGrid.css +224 -0
  53. package/lib/components/DataGrid/DataGrid.tsx +2253 -0
  54. package/lib/components/DetailPanel/DetailPanel.css +36 -0
  55. package/lib/components/DetailPanel/DetailPanel.tsx +34 -0
  56. package/lib/components/FilterPanel/FilterPanel.css +196 -0
  57. package/lib/components/FilterPanel/FilterPanel.tsx +183 -0
  58. package/lib/components/FilterPanel/index.ts +1 -0
  59. package/lib/components/Header/ColumnMenu.css +68 -0
  60. package/lib/components/Header/ColumnMenu.tsx +249 -0
  61. package/lib/components/Header/Header.css +224 -0
  62. package/lib/components/Header/Header.tsx +516 -0
  63. package/lib/components/ListView/ListView.css +112 -0
  64. package/lib/components/ListView/ListViewRow.tsx +63 -0
  65. package/lib/components/Pagination/Pagination.css +91 -0
  66. package/lib/components/Pagination/Pagination.tsx +151 -0
  67. package/lib/components/QuickFilter/QuickFilter.css +23 -0
  68. package/lib/components/QuickFilter/QuickFilter.tsx +79 -0
  69. package/lib/components/Row/Row.css +126 -0
  70. package/lib/components/Row/Row.tsx +377 -0
  71. package/lib/components/Skeleton/Skeleton.css +55 -0
  72. package/lib/components/Skeleton/Skeleton.tsx +22 -0
  73. package/lib/components/SkeletonRow/SkeletonRow.css +32 -0
  74. package/lib/components/SkeletonRow/SkeletonRow.tsx +89 -0
  75. package/lib/components/SkeletonRow/index.ts +1 -0
  76. package/lib/components/Toolbar/GlobalSearch.css +113 -0
  77. package/lib/components/Toolbar/GlobalSearch.tsx +120 -0
  78. package/lib/components/Toolbar/GridToolbar.css +204 -0
  79. package/lib/components/Toolbar/GridToolbar.tsx +647 -0
  80. package/lib/components/Toolbar/PivotPanel.css +212 -0
  81. package/lib/components/Toolbar/PivotPanel.tsx +239 -0
  82. package/lib/components/Tooltip/Tooltip.css +59 -0
  83. package/lib/components/Tooltip/Tooltip.tsx +106 -0
  84. package/lib/components/ui/Button.css +89 -0
  85. package/lib/components/ui/Button.tsx +39 -0
  86. package/lib/components/ui/Checkbox.css +71 -0
  87. package/lib/components/ui/Checkbox.tsx +66 -0
  88. package/lib/components/ui/DragHandleIcon.css +19 -0
  89. package/lib/components/ui/DragHandleIcon.tsx +18 -0
  90. package/lib/components/ui/ExpandIcon.css +38 -0
  91. package/lib/components/ui/ExpandIcon.tsx +75 -0
  92. package/lib/components/ui/Input.css +59 -0
  93. package/lib/components/ui/Input.tsx +45 -0
  94. package/lib/components/ui/index.ts +15 -0
  95. package/lib/hooks/core/useDataGrid.ts +392 -0
  96. package/lib/hooks/core/useGridApiRef.ts +10 -0
  97. package/lib/hooks/features/useAggregation.ts +143 -0
  98. package/lib/hooks/features/useGridClipboard.ts +133 -0
  99. package/lib/hooks/features/useGridDataSource.ts +190 -0
  100. package/lib/hooks/features/useGridEditing.ts +100 -0
  101. package/lib/hooks/features/useGridSpanning.ts +349 -0
  102. package/lib/hooks/features/usePivot.ts +149 -0
  103. package/lib/hooks/useColumnReorder.ts +114 -0
  104. package/lib/hooks/useRowGrouping.ts +302 -0
  105. package/lib/hooks/useRowReorder.ts +83 -0
  106. package/lib/hooks/useTreeData.ts +323 -0
  107. package/lib/index.ts +106 -0
  108. package/lib/state/index.ts +17 -0
  109. package/lib/state/types.ts +48 -0
  110. package/lib/state/useGridStateStorage.ts +113 -0
  111. package/lib/styles/base/reset.css +21 -0
  112. package/lib/styles/base/variables.css +161 -0
  113. package/lib/styles/opengridx.css +27 -0
  114. package/lib/styles/opengridx.css.d.ts +4 -0
  115. package/lib/theme/DataGridThemeProvider.tsx +276 -0
  116. package/lib/theme/defaultStyles.ts +0 -0
  117. package/lib/theme/index.ts +21 -0
  118. package/lib/theme/presets.ts +148 -0
  119. package/lib/theme/types.ts +155 -0
  120. package/lib/types/index.ts +764 -0
  121. package/lib/utils/export/exportToExcelAdvanced.ts +516 -0
  122. package/lib/utils/export/index.ts +550 -0
  123. package/lib/utils/filtering/index.ts +240 -0
  124. package/lib/utils/pinning/index.ts +282 -0
  125. package/lib/utils/sorting/index.ts +55 -0
  126. package/lib/utils/virtualization/index.ts +106 -0
  127. package/lib/vite-env.d.ts +1 -0
  128. package/llms.txt +2 -1
  129. package/package.json +13 -4
@@ -0,0 +1,161 @@
1
+ :root {
2
+ --ogx-row-height: 52px;
3
+ --ogx-header-height: 56px;
4
+ --ogx-cell-padding: 16px;
5
+ --ogx-color-primary: #3b82f6;
6
+ --ogx-color-primary-dark: #2563eb;
7
+ --ogx-color-primary-light: #eff6ff;
8
+ --ogx-color-primary-focus: rgba(59, 130, 246, 0.5);
9
+ --ogx-color-secondary: #8b5cf6;
10
+ --ogx-color-secondary-dark: #7c3aed;
11
+ --ogx-color-secondary-light: #f5f3ff;
12
+ --ogx-color-white: #ffffff;
13
+ --ogx-color-black: #0f172a;
14
+ --ogx-color-gray-50: #f8fafc;
15
+ --ogx-color-gray-100: #f1f5f9;
16
+ --ogx-color-gray-200: #e2e8f0;
17
+ --ogx-color-gray-300: #cbd5e1;
18
+ --ogx-color-gray-400: #94a3b8;
19
+ --ogx-color-gray-500: #64748b;
20
+ --ogx-color-gray-600: #475569;
21
+ --ogx-color-gray-700: #334155;
22
+ --ogx-color-gray-800: #1e293b;
23
+ --ogx-color-gray-900: #0f172a;
24
+ --ogx-color-success: #10b981;
25
+ --ogx-color-warning: #f59e0b;
26
+ --ogx-color-error: #ef4444;
27
+ --ogx-color-info: #0ea5e9;
28
+ --ogx-font-family: 'Inter', -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
29
+ --ogx-font-family-mono: 'JetBrains Mono', 'Fira Code', 'Courier New', Courier, monospace;
30
+ --ogx-font-size-xs: 0.75rem;
31
+ --ogx-font-size-sm: 0.875rem;
32
+ --ogx-font-size-md: 1rem;
33
+ --ogx-font-size-lg: 1.125rem;
34
+ --ogx-font-size-xl: 1.25rem;
35
+ --ogx-font-weight-light: 300;
36
+ --ogx-font-weight-regular: 400;
37
+ --ogx-font-weight-medium: 500;
38
+ --ogx-font-weight-semibold: 600;
39
+ --ogx-font-weight-bold: 700;
40
+ --ogx-line-height-tight: 1.2;
41
+ --ogx-line-height-normal: 1.5;
42
+ --ogx-line-height-relaxed: 1.75;
43
+ --ogx-spacing-xs: 0.25rem;
44
+ --ogx-spacing-sm: 0.5rem;
45
+ --ogx-spacing-md: 1rem;
46
+ --ogx-spacing-lg: 1.5rem;
47
+ --ogx-spacing-xl: 2rem;
48
+ --ogx-spacing-xxl: 3rem;
49
+ --ogx-border-width-thin: 1px;
50
+ --ogx-border-width-medium: 2px;
51
+ --ogx-border-width-thick: 3px;
52
+ --ogx-border-radius-sm: 4px;
53
+ --ogx-border-radius-md: 8px;
54
+ --ogx-border-radius-lg: 12px;
55
+ --ogx-border-radius-xl: 16px;
56
+ --ogx-border-radius-round: 50%;
57
+ --ogx-border-color: var(--ogx-color-gray-200);
58
+ --ogx-border-color-hover: var(--ogx-color-gray-300);
59
+ --ogx-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
60
+ --ogx-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03);
61
+ --ogx-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.05), 0 4px 6px -2px rgba(0, 0, 0, 0.02);
62
+ --ogx-shadow-xl: 0 20px 25px -5px rgba(0, 0, 0, 0.05), 0 10px 10px -5px rgba(0, 0, 0, 0.02);
63
+ --ogx-z-index-base: 0;
64
+ --ogx-z-index-dropdown: 1000;
65
+ --ogx-z-index-sticky: 1020;
66
+ --ogx-z-index-fixed: 1030;
67
+ --ogx-z-index-modal-backdrop: 1040;
68
+ --ogx-z-index-modal: 1050;
69
+ --ogx-z-index-popover: 1060;
70
+ --ogx-z-index-tooltip: 1070;
71
+ --ogx-transition-duration-fast: 150ms;
72
+ --ogx-transition-duration-normal: 250ms;
73
+ --ogx-transition-duration-slow: 350ms;
74
+ --ogx-transition-easing: cubic-bezier(0.4, 0, 0.2, 1);
75
+ --ogx-grid-row-height-compact: 32px;
76
+ --ogx-grid-row-height-standard: 52px;
77
+ --ogx-grid-row-height-comfortable: 72px;
78
+ --ogx-grid-header-height: 56px;
79
+ --ogx-grid-cell-padding-x: 10px;
80
+ --ogx-grid-cell-padding-y: 8px;
81
+ --ogx-grid-cell-font-size: 13px;
82
+ --ogx-grid-header-font-size: 13px;
83
+ --ogx-grid-line-height: var(--ogx-line-height-normal);
84
+ --ogx-grid-background: var(--ogx-color-white);
85
+ --ogx-grid-border-color: var(--ogx-color-gray-200);
86
+ --ogx-grid-header-background: var(--ogx-color-gray-50);
87
+ --ogx-grid-header-text: var(--ogx-color-gray-700);
88
+ --ogx-grid-header-hover-background: var(--ogx-color-gray-100);
89
+ --ogx-grid-header-sorted-background: var(--ogx-color-gray-50);
90
+ --ogx-grid-row-text: var(--ogx-color-gray-800);
91
+ --ogx-grid-row-hover-background: var(--ogx-color-gray-50);
92
+ --ogx-grid-row-alternate-background: var(--ogx-grid-background);
93
+ --ogx-grid-row-selected-background: var(--ogx-color-primary-light);
94
+ --ogx-grid-row-selected-hover-background: #dbeafe;
95
+ --ogx-grid-cell-focus-border: var(--ogx-color-primary);
96
+ --ogx-grid-pinned-left-shadow: 4px 0 24px -4px rgba(0, 0, 0, 0.05);
97
+ --ogx-grid-pinned-right-shadow: -4px 0 24px -4px rgba(0, 0, 0, 0.05);
98
+ --ogx-skeleton-base: #f0f0f0;
99
+ --ogx-skeleton-highlight: #f8f8f8;
100
+ /* ── Overlay / Menu / Dropdown tokens ───────────────────────────────── */
101
+ --ogx-overlay-background: #ffffff;
102
+ --ogx-overlay-border: #e2e8f0;
103
+ --ogx-overlay-text: #334155;
104
+ --ogx-overlay-shadow: 0 4px 6px -1px rgba(0,0,0,0.08), 0 2px 4px -1px rgba(0,0,0,0.06), 0 0 0 1px rgba(0,0,0,0.06);
105
+ --ogx-overlay-item-hover-bg: #f8fafc;
106
+ --ogx-overlay-item-hover-text: #0f172a;
107
+ --ogx-overlay-item-selected-text: var(--ogx-color-primary);
108
+ --ogx-overlay-item-selected-bg: var(--ogx-color-primary-light);
109
+ }
110
+ @media (prefers-color-scheme: dark) {
111
+ :root {
112
+ --ogx-color-primary: #60a5fa;
113
+ --ogx-color-primary-dark: #3b82f6;
114
+ --ogx-color-primary-light: #1e3a5f;
115
+ --ogx-color-primary-focus: rgba(96, 165, 250, 0.4);
116
+ --ogx-color-white: #0f172a;
117
+ --ogx-color-black: #f8fafc;
118
+ --ogx-color-gray-50: #1e293b;
119
+ --ogx-color-gray-100: #334155;
120
+ --ogx-color-gray-200: #475569;
121
+ --ogx-color-gray-300: #64748b;
122
+ --ogx-color-gray-400: #94a3b8;
123
+ --ogx-color-gray-500: #cbd5e1;
124
+ --ogx-color-gray-600: #e2e8f0;
125
+ --ogx-color-gray-700: #e2e8f0;
126
+ --ogx-color-gray-800: #f1f5f9;
127
+ --ogx-color-gray-900: #f8fafc;
128
+ --ogx-border-color: #334155;
129
+ --ogx-border-color-hover: #475569;
130
+ --ogx-shadow-sm: 0 1px 2px 0 rgba(0, 0, 0, 0.3);
131
+ --ogx-shadow-md: 0 4px 6px -1px rgba(0, 0, 0, 0.3);
132
+ --ogx-shadow-lg: 0 10px 15px -3px rgba(0, 0, 0, 0.3);
133
+ --ogx-grid-background: #0f172a;
134
+ --ogx-grid-border-color: #334155;
135
+ --ogx-grid-header-background: #1e293b;
136
+ --ogx-grid-header-text: #e2e8f0;
137
+ --ogx-grid-header-hover-background: #334155;
138
+ --ogx-grid-header-sorted-background: #1e3a5f;
139
+ --ogx-grid-row-text: #cbd5e1;
140
+ --ogx-grid-row-hover-background: #1e293b;
141
+ --ogx-grid-row-alternate-background: #162032;
142
+ --ogx-grid-row-selected-background: #1e3a5f;
143
+ --ogx-grid-row-selected-hover-background: #1d4ed8;
144
+ --ogx-grid-cell-focus-border: #60a5fa;
145
+ --ogx-checkbox-bg: #1e293b;
146
+ --ogx-checkbox-border: #64748b;
147
+ --ogx-grid-pinned-left-shadow: 4px 0 24px -4px rgba(0, 0, 0, 0.3);
148
+ --ogx-grid-pinned-right-shadow: -4px 0 24px -4px rgba(0, 0, 0, 0.3);
149
+ --ogx-skeleton-base: #2a2a2a;
150
+ --ogx-skeleton-highlight: #333333;
151
+ /* ── Overlay / Menu / Dropdown tokens (dark) ────────────────────────── */
152
+ --ogx-overlay-background: #1e293b;
153
+ --ogx-overlay-border: #334155;
154
+ --ogx-overlay-text: #cbd5e1;
155
+ --ogx-overlay-shadow: 0 4px 6px -1px rgba(0,0,0,0.4), 0 2px 4px -1px rgba(0,0,0,0.3), 0 0 0 1px rgba(0,0,0,0.2);
156
+ --ogx-overlay-item-hover-bg: #334155;
157
+ --ogx-overlay-item-hover-text: #f1f5f9;
158
+ --ogx-overlay-item-selected-text: var(--ogx-color-primary);
159
+ --ogx-overlay-item-selected-bg: #1e3a5f;
160
+ }
161
+ }
@@ -0,0 +1,27 @@
1
+ @import './base/variables.css';
2
+ @import './base/reset.css';
3
+ @import '../components/DataGrid/DataGrid.css';
4
+ @import '../components/Header/Header.css';
5
+ @import '../components/Row/Row.css';
6
+ @import '../components/Cell/Cell.css';
7
+ @import '../components/Cell/GridEditInputCell.css';
8
+ @import '../components/Pagination/Pagination.css';
9
+ @import '../components/SkeletonRow/SkeletonRow.css';
10
+ @import '../components/Skeleton/Skeleton.css';
11
+ @import '../components/DetailPanel/DetailPanel.css';
12
+ @import '../components/ColumnResizeHandle/ColumnResizeHandle.css';
13
+ @import '../components/ColumnVisibilityPanel/ColumnVisibilityPanel.css';
14
+ @import '../components/QuickFilter/QuickFilter.css';
15
+ @import '../components/ui/Button.css';
16
+ @import '../components/ui/Checkbox.css';
17
+ @import '../components/ui/DragHandleIcon.css';
18
+ @import '../components/ui/ExpandIcon.css';
19
+ @import '../components/ui/Input.css';
20
+ @import '../components/Toolbar/GridToolbar.css';
21
+ @import '../components/Toolbar/PivotPanel.css';
22
+ @import '../components/FilterPanel/FilterPanel.css';
23
+ @import '../components/Toolbar/GlobalSearch.css';
24
+ @import '../components/Header/ColumnMenu.css';
25
+ @import '../components/ListView/ListView.css';
26
+ @import '../components/ColumnGroupHeader/ColumnGroupHeader.css';
27
+ @import '../components/Tooltip/Tooltip.css';
@@ -0,0 +1,4 @@
1
+ // Type declaration for @opencorestack/opengridx/styles
2
+ // This is a CSS file — importing it applies the OpenGridX styles globally.
3
+ declare const styles: never;
4
+ export default styles;
@@ -0,0 +1,276 @@
1
+ import React from 'react';
2
+ import type { GridTheme } from './types';
3
+
4
+ const lightBase: Record<string, string> = {
5
+
6
+ '--ogx-color-primary': '#3b82f6',
7
+ '--ogx-color-primary-dark': '#2563eb',
8
+ '--ogx-color-primary-light': '#eff6ff',
9
+ '--ogx-color-primary-focus': 'rgba(59, 130, 246, 0.5)',
10
+
11
+ '--ogx-color-secondary': '#8b5cf6',
12
+ '--ogx-color-secondary-dark': '#7c3aed',
13
+ '--ogx-color-secondary-light': '#f5f3ff',
14
+
15
+ '--ogx-color-white': '#ffffff',
16
+ '--ogx-color-black': '#0f172a',
17
+
18
+ '--ogx-border-color': '#e2e8f0',
19
+ '--ogx-border-color-hover': '#cbd5e1',
20
+
21
+ '--ogx-shadow-sm': '0 1px 2px 0 rgba(0, 0, 0, 0.05)',
22
+ '--ogx-shadow-md': '0 4px 6px -1px rgba(0, 0, 0, 0.05), 0 2px 4px -1px rgba(0, 0, 0, 0.03)',
23
+ '--ogx-shadow-lg': '0 10px 15px -3px rgba(0, 0, 0, 0.05), 0 4px 6px -2px rgba(0, 0, 0, 0.02)',
24
+
25
+ '--ogx-grid-background': '#ffffff',
26
+ '--ogx-grid-border-color': '#e2e8f0',
27
+ '--ogx-grid-header-background': '#f8fafc',
28
+ '--ogx-grid-header-text': '#334155',
29
+ '--ogx-grid-header-hover-background': '#f1f5f9',
30
+ '--ogx-grid-header-sorted-background': '#f8fafc',
31
+ '--ogx-grid-row-text': '#1e293b',
32
+ '--ogx-grid-row-hover-background': '#f8fafc',
33
+ '--ogx-grid-row-alternate-background': 'transparent',
34
+ '--ogx-grid-row-selected-background': '#eff6ff',
35
+ '--ogx-grid-row-selected-hover-background': '#dbeafe',
36
+ '--ogx-grid-cell-focus-border': '#3b82f6',
37
+
38
+ '--ogx-checkbox-bg': '#ffffff',
39
+ '--ogx-checkbox-border': '#94a3b8',
40
+
41
+ '--ogx-grid-pinned-left-shadow': '4px 0 24px -4px rgba(0, 0, 0, 0.05)',
42
+ '--ogx-grid-pinned-right-shadow': '-4px 0 24px -4px rgba(0, 0, 0, 0.05)',
43
+
44
+ // Toolbars
45
+ '--ogx-toolbar-background': 'transparent',
46
+ '--ogx-toolbar-text': '#1e293b',
47
+ '--ogx-toolbar-border': '#e2e8f0',
48
+ '--ogx-toolbar-btn-bg': 'transparent',
49
+ '--ogx-toolbar-btn-hover': '#f1f5f9',
50
+ '--ogx-toolbar-btn-text': '#334155',
51
+ '--ogx-toolbar-btn-primary-bg': '#3b82f6',
52
+ '--ogx-toolbar-btn-primary-hover': '#2563eb',
53
+ '--ogx-toolbar-btn-primary-text': '#ffffff',
54
+ '--ogx-toolbar-btn-danger-bg': 'rgba(239, 68, 68, 0.08)',
55
+ '--ogx-toolbar-btn-danger-hover': 'rgba(239, 68, 68, 0.15)',
56
+ '--ogx-toolbar-btn-danger-text': '#ef4444',
57
+ '--ogx-toolbar-input-bg': '#ffffff',
58
+ '--ogx-toolbar-input-text': '#1e293b',
59
+ '--ogx-toolbar-input-border': '#cbd5e1',
60
+ '--ogx-toolbar-input-focus-border': '#3b82f6',
61
+ '--ogx-toolbar-input-focus-shadow': '0 0 0 3px rgba(59, 130, 246, 0.12)',
62
+ '--ogx-toolbar-chip-bg': '#f1f5f9',
63
+ '--ogx-toolbar-chip-text': '#475569',
64
+ '--ogx-toolbar-chip-active-bg': 'rgba(59, 130, 246, 0.12)',
65
+ '--ogx-toolbar-chip-active-text': '#2563eb',
66
+
67
+ // Overlays & Menus
68
+ '--ogx-overlay-background': '#ffffff',
69
+ '--ogx-overlay-text': '#1e293b',
70
+ '--ogx-overlay-border': '#e2e8f0',
71
+ '--ogx-overlay-shadow': '0 4px 6px -1px rgba(0,0,0,0.08), 0 2px 4px -1px rgba(0,0,0,0.06), 0 0 0 1px rgba(0,0,0,0.06)',
72
+ '--ogx-overlay-item-hover-bg': '#f8fafc',
73
+ '--ogx-overlay-item-hover-text': '#0f172a',
74
+ '--ogx-overlay-item-selected-bg': 'rgba(59, 130, 246, 0.08)',
75
+ '--ogx-overlay-item-selected-text': '#2563eb',
76
+ '--ogx-overlay-item-danger-bg': 'rgba(239, 68, 68, 0.08)',
77
+ '--ogx-overlay-item-danger-text': '#ef4444',
78
+
79
+ // Scrollbars
80
+ '--ogx-scrollbar-thumb': 'rgba(148, 163, 184, 0.5)',
81
+ '--ogx-scrollbar-track': 'transparent',
82
+ '--ogx-scrollbar-size': '10px',
83
+
84
+ // Skeletons
85
+ '--ogx-skeleton-base': '#f1f5f9',
86
+ '--ogx-skeleton-highlight': '#ffffff',
87
+ '--ogx-skeleton-dark-base': '#e2e8f0',
88
+ '--ogx-skeleton-dark-highlight': '#f8fafc',
89
+ };
90
+
91
+ function themeToCSS(theme: GridTheme): Record<string, string> {
92
+ const vars: Record<string, string> = {};
93
+
94
+ function set(cssVar: string, value: string | undefined) {
95
+ if (value !== undefined) {
96
+ vars[cssVar] = value;
97
+ }
98
+ }
99
+
100
+ if (theme.colors) {
101
+ const c = theme.colors;
102
+ set('--ogx-color-primary', c.primary);
103
+ set('--ogx-color-primary-dark', c.primaryDark);
104
+ set('--ogx-color-primary-light', c.primaryLight);
105
+ set('--ogx-color-primary-focus', c.primaryFocus);
106
+ set('--ogx-color-secondary', c.secondary);
107
+ set('--ogx-color-secondary-dark', c.secondaryDark);
108
+ set('--ogx-color-secondary-light', c.secondaryLight);
109
+ set('--ogx-color-success', c.success);
110
+ set('--ogx-color-warning', c.warning);
111
+ set('--ogx-color-error', c.error);
112
+ set('--ogx-color-info', c.info);
113
+ }
114
+
115
+ if (theme.typography) {
116
+ const t = theme.typography;
117
+ set('--ogx-font-family', t.fontFamily);
118
+ set('--ogx-font-family-mono', t.fontFamilyMono);
119
+ set('--ogx-font-size-xs', t.fontSizeXs);
120
+ set('--ogx-font-size-sm', t.fontSizeSm);
121
+ set('--ogx-font-size-md', t.fontSizeMd);
122
+ set('--ogx-font-size-lg', t.fontSizeLg);
123
+ set('--ogx-font-size-xl', t.fontSizeXl);
124
+ }
125
+
126
+ if (theme.spacing) {
127
+ const s = theme.spacing;
128
+ set('--ogx-spacing-xs', s.xs);
129
+ set('--ogx-spacing-sm', s.sm);
130
+ set('--ogx-spacing-md', s.md);
131
+ set('--ogx-spacing-lg', s.lg);
132
+ set('--ogx-spacing-xl', s.xl);
133
+ set('--ogx-spacing-xxl', s.xxl);
134
+ }
135
+
136
+ if (theme.borders) {
137
+ const b = theme.borders;
138
+ set('--ogx-border-width-thin', b.widthThin);
139
+ set('--ogx-border-width-medium', b.widthMedium);
140
+ set('--ogx-border-width-thick', b.widthThick);
141
+ set('--ogx-border-radius-sm', b.radiusSm);
142
+ set('--ogx-border-radius-md', b.radiusMd);
143
+ set('--ogx-border-radius-lg', b.radiusLg);
144
+ set('--ogx-border-radius-xl', b.radiusXl);
145
+ set('--ogx-border-color', b.color);
146
+ set('--ogx-border-color-hover', b.colorHover);
147
+ }
148
+
149
+ if (theme.shadows) {
150
+ const sh = theme.shadows;
151
+ set('--ogx-shadow-sm', sh.sm);
152
+ set('--ogx-shadow-md', sh.md);
153
+ set('--ogx-shadow-lg', sh.lg);
154
+ set('--ogx-shadow-xl', sh.xl);
155
+ }
156
+
157
+ if (theme.grid) {
158
+ const g = theme.grid;
159
+ set('--ogx-grid-row-height-compact', g.rowHeightCompact);
160
+ set('--ogx-grid-row-height-standard', g.rowHeightStandard);
161
+ set('--ogx-row-height', g.rowHeightStandard);
162
+ set('--ogx-grid-row-height-comfortable', g.rowHeightComfortable);
163
+ set('--ogx-grid-header-height', g.headerHeight);
164
+ set('--ogx-header-height', g.headerHeight);
165
+ set('--ogx-grid-cell-padding-x', g.cellPaddingX);
166
+ set('--ogx-grid-cell-padding-y', g.cellPaddingY);
167
+ set('--ogx-grid-background', g.background);
168
+ set('--ogx-grid-border-color', g.borderColor);
169
+ set('--ogx-grid-header-background', g.headerBackground);
170
+ set('--ogx-grid-header-text', g.headerText);
171
+ set('--ogx-grid-header-hover-background', g.headerHoverBackground);
172
+ set('--ogx-grid-header-sorted-background', g.headerSortedBackground);
173
+ set('--ogx-grid-row-text', g.rowText);
174
+ set('--ogx-grid-row-hover-background', g.rowHoverBackground);
175
+ set('--ogx-grid-row-alternate-background', g.rowAlternateBackground);
176
+ set('--ogx-grid-row-selected-background', g.rowSelectedBackground);
177
+ set('--ogx-grid-row-selected-hover-background', g.rowSelectedHoverBackground);
178
+ set('--ogx-grid-cell-focus-border', g.cellFocusBorder);
179
+ set('--ogx-grid-pinned-left-shadow', g.pinnedLeftShadow);
180
+ set('--ogx-grid-pinned-right-shadow', g.pinnedRightShadow);
181
+ set('--ogx-checkbox-bg', g.checkboxBg);
182
+ set('--ogx-checkbox-border', g.checkboxBorder);
183
+ }
184
+
185
+ if (theme.transitions) {
186
+ const tr = theme.transitions;
187
+ set('--ogx-transition-duration-fast', tr.durationFast);
188
+ set('--ogx-transition-duration-normal', tr.durationNormal);
189
+ set('--ogx-transition-duration-slow', tr.durationSlow);
190
+ set('--ogx-transition-easing', tr.easing);
191
+ }
192
+
193
+ if (theme.toolbar) {
194
+ const tb = theme.toolbar;
195
+ set('--ogx-toolbar-background', tb.background);
196
+ set('--ogx-toolbar-text', tb.text);
197
+ set('--ogx-toolbar-border', tb.border);
198
+ set('--ogx-toolbar-btn-bg', tb.buttonBackground);
199
+ set('--ogx-toolbar-btn-hover', tb.buttonHoverBackground);
200
+ set('--ogx-toolbar-btn-text', tb.buttonText);
201
+ set('--ogx-toolbar-btn-primary-bg', tb.buttonPrimaryBackground);
202
+ set('--ogx-toolbar-btn-primary-hover', tb.buttonPrimaryHoverBackground);
203
+ set('--ogx-toolbar-btn-primary-text', tb.buttonPrimaryText);
204
+ set('--ogx-toolbar-btn-danger-bg', tb.buttonDangerBackground);
205
+ set('--ogx-toolbar-btn-danger-hover', tb.buttonDangerHoverBackground);
206
+ set('--ogx-toolbar-btn-danger-text', tb.buttonDangerText);
207
+ set('--ogx-toolbar-input-bg', tb.inputBackground);
208
+ set('--ogx-toolbar-input-text', tb.inputText);
209
+ set('--ogx-toolbar-input-border', tb.inputBorder);
210
+ set('--ogx-toolbar-input-focus-border', tb.inputFocusBorder);
211
+ set('--ogx-toolbar-input-focus-shadow', tb.inputFocusShadow);
212
+ set('--ogx-toolbar-chip-bg', tb.chipBackground);
213
+ set('--ogx-toolbar-chip-text', tb.chipText);
214
+ set('--ogx-toolbar-chip-active-bg', tb.chipActiveBackground);
215
+ set('--ogx-toolbar-chip-active-text', tb.chipActiveText);
216
+ }
217
+
218
+ if (theme.overlays) {
219
+ const o = theme.overlays;
220
+ set('--ogx-overlay-background', o.background);
221
+ set('--ogx-overlay-text', o.text);
222
+ set('--ogx-overlay-border', o.border);
223
+ set('--ogx-overlay-shadow', o.shadow);
224
+ set('--ogx-overlay-item-hover-bg', o.itemHoverBackground);
225
+ set('--ogx-overlay-item-hover-text', o.itemHoverText);
226
+ set('--ogx-overlay-item-selected-bg', o.itemSelectedBackground);
227
+ set('--ogx-overlay-item-selected-text', o.itemSelectedText);
228
+ set('--ogx-overlay-item-danger-bg', o.itemDangerBackground);
229
+ set('--ogx-overlay-item-danger-text', o.itemDangerText);
230
+ }
231
+
232
+ if (theme.scrollbar) {
233
+ const scr = theme.scrollbar;
234
+ set('--ogx-scrollbar-thumb', scr.thumbColor);
235
+ set('--ogx-scrollbar-track', scr.trackColor);
236
+ set('--ogx-scrollbar-size', scr.size);
237
+ }
238
+
239
+ if (theme.skeleton) {
240
+ const sk = theme.skeleton;
241
+ set('--ogx-skeleton-base', sk.baseColor);
242
+ set('--ogx-skeleton-highlight', sk.highlightColor);
243
+ set('--ogx-skeleton-dark-base', sk.darkBaseColor);
244
+ set('--ogx-skeleton-dark-highlight', sk.darkHighlightColor);
245
+ }
246
+
247
+ return vars;
248
+ }
249
+
250
+ export interface DataGridThemeProviderProps {
251
+ theme: GridTheme;
252
+ children: React.ReactNode;
253
+ className?: string;
254
+ style?: React.CSSProperties;
255
+ }
256
+
257
+ export function DataGridThemeProvider({
258
+ theme,
259
+ children,
260
+ className,
261
+ style
262
+ }: DataGridThemeProviderProps) {
263
+ const cssVars = React.useMemo(() => {
264
+
265
+ return { ...lightBase, ...themeToCSS(theme) };
266
+ }, [theme]);
267
+
268
+ return (
269
+ <div
270
+ className={`ogx-theme-provider ${className || ''}`.trim()}
271
+ style={{ ...style, ...cssVars } as React.CSSProperties}
272
+ >
273
+ {children}
274
+ </div>
275
+ );
276
+ }
File without changes
@@ -0,0 +1,21 @@
1
+ export type {
2
+ GridTheme,
3
+ GridThemeColors,
4
+ GridThemeTypography,
5
+ GridThemeSpacing,
6
+ GridThemeBorders,
7
+ GridThemeShadows,
8
+ GridThemeGrid,
9
+ GridThemeTransitions,
10
+ } from './types';
11
+
12
+ export { DataGridThemeProvider } from './DataGridThemeProvider';
13
+ export type { DataGridThemeProviderProps } from './DataGridThemeProvider';
14
+
15
+ export {
16
+ darkTheme,
17
+ roseTheme,
18
+ emeraldTheme,
19
+ amberTheme,
20
+ compactTheme,
21
+ } from './presets';
@@ -0,0 +1,148 @@
1
+ import type { GridTheme } from './types';
2
+
3
+ export const darkTheme: GridTheme = {
4
+ colors: {
5
+ primary: '#60a5fa',
6
+ primaryDark: '#3b82f6',
7
+ primaryLight: '#1e3a5f',
8
+ primaryFocus: 'rgba(96, 165, 250, 0.4)',
9
+ },
10
+ grid: {
11
+ background: '#0f172a',
12
+ headerBackground: '#1e293b',
13
+ headerText: '#e2e8f0',
14
+ headerHoverBackground: '#334155',
15
+ headerSortedBackground: '#1e3a5f',
16
+ rowText: '#cbd5e1',
17
+ borderColor: '#334155',
18
+ rowHoverBackground: '#1e293b',
19
+ rowAlternateBackground: '#162032',
20
+ rowSelectedBackground: '#1e3a5f',
21
+ rowSelectedHoverBackground: '#1d4ed8',
22
+ cellFocusBorder: '#60a5fa',
23
+ checkboxBg: '#1e293b',
24
+ checkboxBorder: '#64748b',
25
+ },
26
+ borders: {
27
+ color: '#334155',
28
+ colorHover: '#475569',
29
+ },
30
+ shadows: {
31
+ sm: '0 1px 2px 0 rgba(0, 0, 0, 0.3)',
32
+ md: '0 4px 6px -1px rgba(0, 0, 0, 0.3)',
33
+ },
34
+ toolbar: {
35
+ background: 'transparent',
36
+ text: '#cbd5e1',
37
+ border: '#334155',
38
+ buttonBackground: 'transparent',
39
+ buttonHoverBackground: '#1e293b',
40
+ buttonText: '#e2e8f0',
41
+ buttonPrimaryBackground: '#3b82f6',
42
+ buttonPrimaryHoverBackground: '#2563eb',
43
+ buttonPrimaryText: '#ffffff',
44
+ buttonDangerBackground: 'rgba(239, 68, 68, 0.15)',
45
+ buttonDangerHoverBackground: 'rgba(239, 68, 68, 0.25)',
46
+ buttonDangerText: '#fca5a5',
47
+ inputBackground: '#0f172a',
48
+ inputText: '#f8fafc',
49
+ inputBorder: '#334155',
50
+ inputFocusBorder: '#60a5fa',
51
+ inputFocusShadow: '0 0 0 3px rgba(96, 165, 250, 0.2)',
52
+ chipBackground: '#1e293b',
53
+ chipText: '#94a3b8',
54
+ chipActiveBackground: 'rgba(96, 165, 250, 0.2)',
55
+ chipActiveText: '#60a5fa',
56
+ },
57
+ overlays: {
58
+ background: '#1e293b',
59
+ text: '#f8fafc',
60
+ border: '#334155',
61
+ shadow: '0 10px 15px -3px rgba(0, 0, 0, 0.5), 0 4px 6px -2px rgba(0, 0, 0, 0.3)',
62
+ itemHoverBackground: '#334155',
63
+ itemHoverText: '#ffffff',
64
+ itemSelectedBackground: 'rgba(96, 165, 250, 0.15)',
65
+ itemSelectedText: '#60a5fa',
66
+ itemDangerBackground: 'rgba(239, 68, 68, 0.15)',
67
+ itemDangerText: '#fca5a5',
68
+ },
69
+ scrollbar: {
70
+ thumbColor: 'rgba(148, 163, 184, 0.2)',
71
+ trackColor: 'transparent',
72
+ },
73
+ skeleton: {
74
+ baseColor: '#1e293b',
75
+ highlightColor: '#334155',
76
+ darkBaseColor: '#0f172a',
77
+ darkHighlightColor: '#1e293b',
78
+ }
79
+ };
80
+
81
+ export const roseTheme: GridTheme = {
82
+ colors: {
83
+ primary: '#e11d48',
84
+ primaryDark: '#be123c',
85
+ primaryLight: '#fff1f2',
86
+ primaryFocus: 'rgba(225, 29, 72, 0.4)',
87
+ },
88
+ grid: {
89
+ headerBackground: '#fff1f2',
90
+ headerHoverBackground: '#ffe4e6',
91
+ headerSortedBackground: '#fecdd3',
92
+ rowAlternateBackground: '#fff8f8',
93
+ rowSelectedBackground: '#ffe4e6',
94
+ rowSelectedHoverBackground: '#fecdd3',
95
+ cellFocusBorder: '#e11d48',
96
+ },
97
+ };
98
+
99
+ export const emeraldTheme: GridTheme = {
100
+ colors: {
101
+ primary: '#059669',
102
+ primaryDark: '#047857',
103
+ primaryLight: '#ecfdf5',
104
+ primaryFocus: 'rgba(5, 150, 105, 0.4)',
105
+ },
106
+ grid: {
107
+ headerBackground: '#ecfdf5',
108
+ headerHoverBackground: '#d1fae5',
109
+ headerSortedBackground: '#a7f3d0',
110
+ rowAlternateBackground: '#f6fdf9',
111
+ rowSelectedBackground: '#d1fae5',
112
+ rowSelectedHoverBackground: '#a7f3d0',
113
+ cellFocusBorder: '#059669',
114
+ },
115
+ };
116
+
117
+ export const amberTheme: GridTheme = {
118
+ colors: {
119
+ primary: '#d97706',
120
+ primaryDark: '#b45309',
121
+ primaryLight: '#fffbeb',
122
+ primaryFocus: 'rgba(217, 119, 6, 0.4)',
123
+ },
124
+ grid: {
125
+ headerBackground: '#fffbeb',
126
+ headerHoverBackground: '#fef3c7',
127
+ headerSortedBackground: '#fde68a',
128
+ rowAlternateBackground: '#fffdf5',
129
+ rowSelectedBackground: '#fef3c7',
130
+ rowSelectedHoverBackground: '#fde68a',
131
+ cellFocusBorder: '#d97706',
132
+ },
133
+ };
134
+
135
+ export const compactTheme: GridTheme = {
136
+ grid: {
137
+ rowHeightCompact: '28px',
138
+ rowHeightStandard: '36px',
139
+ rowHeightComfortable: '48px',
140
+ headerHeight: '40px',
141
+ cellPaddingX: '8px',
142
+ cellPaddingY: '4px',
143
+ },
144
+ typography: {
145
+ fontSizeSm: '0.8rem',
146
+ fontSizeMd: '0.875rem',
147
+ },
148
+ };