photon-grid-core 2.0.4 → 2.0.5

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 (122) hide show
  1. package/cell-selection/cell-selection-engine.d.ts +14 -0
  2. package/cell-selection/cell-selection-engine.d.ts.map +1 -1
  3. package/cell-selection/cell-selection-engine.js +52 -0
  4. package/cell-selection/cell-selection-engine.js.map +1 -1
  5. package/core/grid-api.d.ts +24 -0
  6. package/core/grid-api.d.ts.map +1 -1
  7. package/core/grid-api.js +30 -0
  8. package/core/grid-api.js.map +1 -1
  9. package/core/grid-core.d.ts.map +1 -1
  10. package/core/grid-core.js +13 -4
  11. package/core/grid-core.js.map +1 -1
  12. package/engines/master-detail/master-detail-engine.d.ts +4 -3
  13. package/engines/master-detail/master-detail-engine.d.ts.map +1 -1
  14. package/engines/master-detail/master-detail-engine.js +14 -5
  15. package/engines/master-detail/master-detail-engine.js.map +1 -1
  16. package/engines/selection/row-selection-engine.d.ts +41 -0
  17. package/engines/selection/row-selection-engine.d.ts.map +1 -1
  18. package/engines/selection/row-selection-engine.js +103 -0
  19. package/engines/selection/row-selection-engine.js.map +1 -1
  20. package/index.d.ts +2 -1
  21. package/index.d.ts.map +1 -1
  22. package/index.js +1 -0
  23. package/index.js.map +1 -1
  24. package/package.json +1 -1
  25. package/photon-grid.min.js +255 -487
  26. package/renderer/detail-row-renderer.d.ts.map +1 -1
  27. package/renderer/detail-row-renderer.js +1 -1
  28. package/renderer/detail-row-renderer.js.map +1 -1
  29. package/renderer/grid-renderer.d.ts +13 -1
  30. package/renderer/grid-renderer.d.ts.map +1 -1
  31. package/renderer/grid-renderer.js +21 -1
  32. package/renderer/grid-renderer.js.map +1 -1
  33. package/renderer/header-renderer.d.ts +5 -0
  34. package/renderer/header-renderer.d.ts.map +1 -1
  35. package/renderer/header-renderer.js +14 -3
  36. package/renderer/header-renderer.js.map +1 -1
  37. package/renderer/row-animator.d.ts +18 -1
  38. package/renderer/row-animator.d.ts.map +1 -1
  39. package/renderer/row-animator.js +93 -17
  40. package/renderer/row-animator.js.map +1 -1
  41. package/renderer/scroll-controller.d.ts.map +1 -1
  42. package/renderer/scroll-controller.js +31 -13
  43. package/renderer/scroll-controller.js.map +1 -1
  44. package/styles/base/cells.css.d.ts +1 -1
  45. package/styles/base/cells.css.d.ts.map +1 -1
  46. package/styles/base/cells.css.js +13 -13
  47. package/styles/base/column-context-menu.css.d.ts +1 -1
  48. package/styles/base/column-context-menu.css.d.ts.map +1 -1
  49. package/styles/base/column-context-menu.css.js +19 -5
  50. package/styles/base/column-context-menu.css.js.map +1 -1
  51. package/styles/base/column-group-header.css.d.ts +1 -1
  52. package/styles/base/column-group-header.css.d.ts.map +1 -1
  53. package/styles/base/column-group-header.css.js +1 -1
  54. package/styles/base/context-menu.css.d.ts +1 -1
  55. package/styles/base/context-menu.css.d.ts.map +1 -1
  56. package/styles/base/context-menu.css.js +8 -0
  57. package/styles/base/context-menu.css.js.map +1 -1
  58. package/styles/base/filter.css.d.ts +1 -1
  59. package/styles/base/filter.css.d.ts.map +1 -1
  60. package/styles/base/filter.css.js +6 -6
  61. package/styles/base/group-drop-zone.css.d.ts +1 -1
  62. package/styles/base/group-drop-zone.css.d.ts.map +1 -1
  63. package/styles/base/group-drop-zone.css.js +3 -3
  64. package/styles/base/header.css.d.ts +1 -1
  65. package/styles/base/header.css.d.ts.map +1 -1
  66. package/styles/base/header.css.js +4 -0
  67. package/styles/base/header.css.js.map +1 -1
  68. package/styles/base/row-drag.css.d.ts +1 -1
  69. package/styles/base/row-drag.css.d.ts.map +1 -1
  70. package/styles/base/row-drag.css.js +1 -1
  71. package/styles/base/rows.css.d.ts +1 -1
  72. package/styles/base/rows.css.d.ts.map +1 -1
  73. package/styles/base/rows.css.js +4 -16
  74. package/styles/base/rows.css.js.map +1 -1
  75. package/styles/base/scrollbars.css.d.ts +1 -1
  76. package/styles/base/scrollbars.css.d.ts.map +1 -1
  77. package/styles/base/scrollbars.css.js +6 -3
  78. package/styles/base/scrollbars.css.js.map +1 -1
  79. package/styles/base/sparkline.css.d.ts +1 -1
  80. package/styles/base/sparkline.css.d.ts.map +1 -1
  81. package/styles/base/sparkline.css.js +6 -0
  82. package/styles/base/sparkline.css.js.map +1 -1
  83. package/styles/base/tooltip.css.d.ts +1 -1
  84. package/styles/base/tooltip.css.d.ts.map +1 -1
  85. package/styles/base/tooltip.css.js +1 -1
  86. package/styles/base-styles.d.ts.map +1 -1
  87. package/styles/base-styles.js +5 -2
  88. package/styles/base-styles.js.map +1 -1
  89. package/styles/themes/theme-alpine.d.ts +9 -1
  90. package/styles/themes/theme-alpine.d.ts.map +1 -1
  91. package/styles/themes/theme-alpine.js +34 -43
  92. package/styles/themes/theme-alpine.js.map +1 -1
  93. package/styles/themes/theme-balham.d.ts +9 -1
  94. package/styles/themes/theme-balham.d.ts.map +1 -1
  95. package/styles/themes/theme-balham.js +33 -42
  96. package/styles/themes/theme-balham.js.map +1 -1
  97. package/styles/themes/theme-material.d.ts +9 -1
  98. package/styles/themes/theme-material.d.ts.map +1 -1
  99. package/styles/themes/theme-material.js +35 -43
  100. package/styles/themes/theme-material.js.map +1 -1
  101. package/styles/themes/theme-quartz.d.ts +14 -1
  102. package/styles/themes/theme-quartz.d.ts.map +1 -1
  103. package/styles/themes/theme-quartz.js +63 -43
  104. package/styles/themes/theme-quartz.js.map +1 -1
  105. package/theme/theme-manager.d.ts +55 -7
  106. package/theme/theme-manager.d.ts.map +1 -1
  107. package/theme/theme-manager.js +139 -35
  108. package/theme/theme-manager.js.map +1 -1
  109. package/types/column.types.d.ts +42 -0
  110. package/types/column.types.d.ts.map +1 -1
  111. package/types/column.types.js +26 -1
  112. package/types/column.types.js.map +1 -1
  113. package/types/grid.types.d.ts +90 -2
  114. package/types/grid.types.d.ts.map +1 -1
  115. package/types/theme.types.d.ts +19 -0
  116. package/types/theme.types.d.ts.map +1 -1
  117. package/types/theme.types.js +7 -1
  118. package/types/theme.types.js.map +1 -1
  119. package/styles/themes/theme-dark.d.ts +0 -2
  120. package/styles/themes/theme-dark.d.ts.map +0 -1
  121. package/styles/themes/theme-dark.js +0 -219
  122. package/styles/themes/theme-dark.js.map +0 -1
@@ -1,27 +1,16 @@
1
- /* pg-balham-theme — compact, professional, amber accent */
1
+ /**
2
+ * pg-balham-theme — compact, professional (amber accent).
3
+ *
4
+ * Cosmetic variant layered on the active mode (light/dark). Overrides only
5
+ * density, radii, typography, accent and motion; base colors come from the
6
+ * mode tokens so it works in both light and dark. See {@link themeQuartzCss}
7
+ * for the shared design rationale.
8
+ */
2
9
  export const themeBalhamCss = `
3
10
 
4
- /* ──────────── pg-balham-theme variables ──────────── */
11
+ /* ──────────── pg-balham-theme: structural + accent tokens ──────────── */
5
12
  .pg-balham-theme .pg-grid {
6
- --pg-colors-border: #d1d5db;
7
- --pg-colors-header-background: #f3f4f6;
8
- --pg-colors-header-border: #d1d5db;
9
- --pg-colors-header-text: #374151;
10
- --pg-colors-row-background: #ffffff;
11
- --pg-colors-row-alt-background: #f9fafb;
12
- --pg-colors-row-hover: #fef3c7;
13
- --pg-colors-row-selected: #fffbeb;
14
- --pg-colors-row-selected-hover: #fef08a;
15
- --pg-colors-text-primary: #111827;
16
- --pg-colors-text-secondary: #6b7280;
17
- --pg-colors-text-muted: #9ca3af;
18
- --pg-colors-text-disabled: #d1d5db;
19
13
  --pg-colors-primary: #d97706;
20
- --pg-colors-filter-background: #ffffff;
21
- --pg-colors-scrollbar-bg: #f3f4f6;
22
- --pg-colors-badge-background: #fef3c7;
23
- --pg-colors-badge-text: #92400e;
24
- --pg-colors-resize-handle-color: #d1d5db;
25
14
 
26
15
  --pg-typography-font-family: 'Segoe UI', system-ui, -apple-system, sans-serif;
27
16
  --pg-typography-font-size-sm: 11px;
@@ -32,54 +21,56 @@ export const themeBalhamCss = `
32
21
 
33
22
  --pg-header-row-height: 36px;
34
23
  --pg-row-height: 32px;
24
+
35
25
  --pg-borders-radius-md: 2px;
36
26
  --pg-borders-radius-sm: 0px;
37
27
  --pg-borders-radius-pill: 2px;
38
- --pg-transitions-duration-fast: 80ms;
39
28
  --pg-sizing-checkbox-size: 14px;
29
+
30
+ --pg-transitions-duration-fast: 80ms;
40
31
  }
41
32
 
42
- /* Balham header — dense, uppercase, pronounced border */
33
+ /* Balham header — dense, uppercase, pronounced border; color follows the mode. */
43
34
  .pg-balham-theme .pg-th {
44
35
  text-transform: uppercase;
45
36
  font-size: 10px;
46
37
  font-weight: 700;
47
38
  letter-spacing: 0.06em;
48
- color: #374151;
39
+ color: var(--pg-colors-header-text);
49
40
  }
50
- .pg-balham-theme .pg-th--sorted { color: #d97706; }
51
- .pg-balham-theme .pg-grid__header { border-bottom: 2px solid #d1d5db; }
41
+ .pg-balham-theme .pg-th--sorted { color: var(--pg-colors-primary); }
42
+ .pg-balham-theme .pg-grid__header { border-bottom: 2px solid var(--pg-colors-header-border); }
52
43
 
53
44
  /* Balham rows — full row border, classic spreadsheet look */
54
- .pg-balham-theme .pg-row { border-bottom: 1px solid #e5e7eb; }
45
+ .pg-balham-theme .pg-row { border-bottom: 1px solid var(--pg-colors-border); }
55
46
 
56
- /* Balham icon tones — warmer grays */
57
- .pg-balham-theme .pg-icon { color: #6b7280; }
58
- .pg-balham-theme .pg-th--sorted .pg-icon { color: #d97706; }
59
- .pg-balham-theme .pg-row-drag-handle { color: #9ca3af; }
47
+ /* Balham icon tones — mode-aware */
48
+ .pg-balham-theme .pg-icon { color: var(--pg-colors-text-secondary); }
49
+ .pg-balham-theme .pg-th--sorted .pg-icon { color: var(--pg-colors-primary); }
50
+ .pg-balham-theme .pg-row-drag-handle { color: var(--pg-colors-text-disabled); }
60
51
 
61
- /* Balham checkbox — 14px, square (0 radius), flat amber fill */
52
+ /* Balham checkbox — 14px, square (0 radius), flat accent fill */
62
53
  .pg-balham-theme .pg-checkbox {
63
54
  appearance: none;
64
55
  -webkit-appearance: none;
65
56
  width: 14px;
66
57
  height: 14px;
67
- border: 1px solid #9ca3af;
58
+ border: 1px solid var(--pg-colors-checkbox-border);
68
59
  border-radius: 0px;
69
- background: #fff;
60
+ background: var(--pg-colors-checkbox-background);
70
61
  cursor: pointer;
71
62
  position: relative;
72
63
  flex-shrink: 0;
73
64
  transition: background 80ms linear, border-color 80ms linear;
74
65
  }
75
- .pg-balham-theme .pg-checkbox:hover { border-color: #d97706; }
66
+ .pg-balham-theme .pg-checkbox:hover { border-color: var(--pg-colors-primary); }
76
67
  .pg-balham-theme .pg-checkbox:focus-visible {
77
- outline: 1px solid #d97706;
68
+ outline: 1px solid var(--pg-colors-primary);
78
69
  outline-offset: 1px;
79
70
  }
80
71
  .pg-balham-theme .pg-checkbox:checked {
81
- background: #d97706;
82
- border-color: #d97706;
72
+ background: var(--pg-colors-primary);
73
+ border-color: var(--pg-colors-primary);
83
74
  }
84
75
  .pg-balham-theme .pg-checkbox:checked::after {
85
76
  content: '';
@@ -88,14 +79,14 @@ export const themeBalhamCss = `
88
79
  top: 1px;
89
80
  width: 5px;
90
81
  height: 8px;
91
- border: 2px solid #fff;
82
+ border: 2px solid var(--pg-colors-primary-text);
92
83
  border-top: none;
93
84
  border-left: none;
94
85
  transform: rotate(45deg);
95
86
  }
96
87
  .pg-balham-theme .pg-checkbox:indeterminate {
97
- background: #d97706;
98
- border-color: #d97706;
88
+ background: var(--pg-colors-primary);
89
+ border-color: var(--pg-colors-primary);
99
90
  }
100
91
  .pg-balham-theme .pg-checkbox:indeterminate::after {
101
92
  content: '';
@@ -104,12 +95,12 @@ export const themeBalhamCss = `
104
95
  top: 50%;
105
96
  width: 8px;
106
97
  height: 2px;
107
- background: #fff;
98
+ background: var(--pg-colors-primary-text);
108
99
  transform: translateY(-50%);
109
100
  }
110
101
 
111
102
  /* Balham selection — amber left accent bar */
112
- .pg-balham-theme .pg-row--selected { box-shadow: inset 3px 0 0 #d97706; }
103
+ .pg-balham-theme .pg-row--selected { box-shadow: inset 3px 0 0 var(--pg-colors-primary); }
113
104
 
114
105
  /* Balham row-drag — very fast, minimal */
115
106
  .pg-balham-theme .pg-grid--row-dragging .pg-row {
@@ -1 +1 @@
1
- {"version":3,"file":"theme-balham.js","sourceRoot":"","sources":["../../../src/styles/themes/theme-balham.ts"],"names":[],"mappings":"AAAA,2DAA2D;AAC3D,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoH7B,CAAC"}
1
+ {"version":3,"file":"theme-balham.js","sourceRoot":"","sources":["../../../src/styles/themes/theme-balham.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoG7B,CAAC"}
@@ -1,2 +1,10 @@
1
- export declare const themeMaterialCss = "\n\n/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 pg-material-theme variables \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.pg-material-theme .pg-grid {\n border-radius: 4px;\n border-color: transparent;\n box-shadow: 0 2px 1px -1px rgba(0,0,0,.2), 0 1px 1px 0 rgba(0,0,0,.14), 0 1px 3px 0 rgba(0,0,0,.12);\n\n --pg-colors-border: rgba(0,0,0,.12);\n --pg-colors-header-background: #ffffff;\n --pg-colors-header-border: transparent;\n --pg-colors-header-text: rgba(0,0,0,.54);\n --pg-colors-row-background: #ffffff;\n --pg-colors-row-alt-background: #fafafa;\n --pg-colors-row-hover: rgba(0,0,0,.04);\n --pg-colors-row-selected: rgba(25,118,210,.10);\n --pg-colors-row-selected-hover: rgba(25,118,210,.16);\n --pg-colors-text-primary: rgba(0,0,0,.87);\n --pg-colors-text-secondary: rgba(0,0,0,.54);\n --pg-colors-text-muted: rgba(0,0,0,.38);\n --pg-colors-text-disabled: rgba(0,0,0,.26);\n --pg-colors-primary: #1976d2;\n --pg-colors-filter-background: #ffffff;\n --pg-colors-scrollbar-bg: #fafafa;\n --pg-colors-badge-background: #e3f2fd;\n --pg-colors-badge-text: #0d47a1;\n --pg-colors-resize-handle-color: rgba(0,0,0,.20);\n\n --pg-typography-font-family: Roboto, 'Helvetica Neue', Arial, sans-serif;\n --pg-typography-font-size-sm: 12px;\n --pg-typography-font-size-xs: 11px;\n --pg-typography-font-weight-medium: 400;\n --pg-typography-font-weight-semi-bold: 500;\n --pg-typography-letter-spacing-wide: 0.04em;\n\n --pg-header-row-height: 56px;\n --pg-row-height: 52px;\n --pg-borders-radius-md: 4px;\n --pg-borders-radius-sm: 2px;\n --pg-borders-radius-pill: 4px;\n --pg-transitions-duration-fast: 200ms;\n --pg-sizing-checkbox-size: 18px;\n}\n\n/* Material header \u2014 no uppercase, medium weight, subdued */\n.pg-material-theme .pg-th {\n text-transform: none;\n font-size: 12px;\n font-weight: 500;\n letter-spacing: 0.04em;\n color: rgba(0,0,0,.54);\n}\n.pg-material-theme .pg-th--sorted { color: #1976d2; }\n.pg-material-theme .pg-grid__header { border-bottom: 1px solid rgba(0,0,0,.12); }\n\n/* Material rows \u2014 thin divider lines */\n.pg-material-theme .pg-row { border-bottom: 1px solid rgba(0,0,0,.06); }\n.pg-material-theme .pg-cell--v-border { border-right-color: rgba(0,0,0,.06); }\n\n/* Material filter row */\n.pg-material-theme .pg-filter-row { border-top-color: rgba(0,0,0,.08); }\n\n/* Material icon tones */\n.pg-material-theme .pg-icon { color: rgba(0,0,0,.54); }\n.pg-material-theme .pg-th--sorted .pg-icon { color: #1976d2; }\n.pg-material-theme .pg-row-drag-handle { color: rgba(0,0,0,.38); }\n\n/* Material checkbox \u2014 18px, 2px radius, blue, Material motion */\n.pg-material-theme .pg-checkbox {\n appearance: none;\n -webkit-appearance: none;\n width: 18px;\n height: 18px;\n border: 2px solid rgba(0,0,0,.38);\n border-radius: 2px;\n background: transparent;\n cursor: pointer;\n position: relative;\n flex-shrink: 0;\n transition: background 200ms cubic-bezier(0.4,0,0.2,1),\n border-color 200ms cubic-bezier(0.4,0,0.2,1),\n box-shadow 200ms cubic-bezier(0.4,0,0.2,1);\n}\n.pg-material-theme .pg-checkbox:hover {\n border-color: #1976d2;\n box-shadow: 0 0 0 8px rgba(25,118,210,.1);\n}\n.pg-material-theme .pg-checkbox:focus-visible {\n outline: none;\n box-shadow: 0 0 0 8px rgba(25,118,210,.2);\n}\n.pg-material-theme .pg-checkbox:checked {\n background: #1976d2;\n border-color: #1976d2;\n}\n.pg-material-theme .pg-checkbox:checked::after {\n content: '';\n position: absolute;\n left: 4px;\n top: 1px;\n width: 7px;\n height: 11px;\n border: 2px solid #fff;\n border-top: none;\n border-left: none;\n transform: rotate(45deg);\n}\n.pg-material-theme .pg-checkbox:indeterminate {\n background: #1976d2;\n border-color: #1976d2;\n}\n.pg-material-theme .pg-checkbox:indeterminate::after {\n content: '';\n position: absolute;\n left: 2px;\n top: 50%;\n width: 10px;\n height: 2px;\n background: #fff;\n transform: translateY(-50%);\n}\n\n/* Material selection \u2014 no left bar, full-row tint only */\n.pg-material-theme .pg-row--selected { box-shadow: none; }\n\n/* Material row-drag animation \u2014 Material motion curve */\n.pg-material-theme .pg-grid--row-dragging .pg-row {\n transition: background 200ms cubic-bezier(0.4,0,0.2,1),\n top 200ms cubic-bezier(0.4,0,0.2,1);\n}\n";
1
+ /**
2
+ * pg-material-theme — Material Design 3 (indigo accent).
3
+ *
4
+ * Cosmetic variant layered on the active mode (light/dark). Overrides only
5
+ * density, radii, typography, accent, elevation and motion; base colors come
6
+ * from the mode tokens so it works in both light and dark. See
7
+ * {@link themeQuartzCss} for the shared design rationale.
8
+ */
9
+ export declare const themeMaterialCss = "\n\n/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 pg-material-theme: structural + accent tokens \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.pg-material-theme .pg-grid {\n /* Material uses elevation instead of a hard border. */\n border-radius: 4px;\n border-color: transparent;\n box-shadow: 0 2px 1px -1px rgba(0,0,0,.2), 0 1px 1px 0 rgba(0,0,0,.14), 0 1px 3px 0 rgba(0,0,0,.12);\n\n --pg-colors-primary: #1976d2;\n\n --pg-typography-font-family: Roboto, 'Helvetica Neue', Arial, sans-serif;\n --pg-typography-font-size-sm: 12px;\n --pg-typography-font-size-xs: 11px;\n --pg-typography-font-weight-medium: 400;\n --pg-typography-font-weight-semi-bold: 500;\n --pg-typography-letter-spacing-wide: 0.04em;\n\n --pg-header-row-height: 56px;\n --pg-row-height: 52px;\n\n --pg-borders-radius-md: 4px;\n --pg-borders-radius-sm: 2px;\n --pg-borders-radius-pill: 4px;\n --pg-sizing-checkbox-size: 18px;\n\n --pg-transitions-duration-fast: 200ms;\n}\n\n/* Material header \u2014 no uppercase, medium weight; color follows the mode. */\n.pg-material-theme .pg-th {\n text-transform: none;\n font-size: 12px;\n font-weight: 500;\n letter-spacing: 0.04em;\n color: var(--pg-colors-header-text);\n}\n.pg-material-theme .pg-th--sorted { color: var(--pg-colors-primary); }\n.pg-material-theme .pg-grid__header { border-bottom: 1px solid var(--pg-colors-header-border); }\n\n/* Material rows \u2014 thin divider lines */\n.pg-material-theme .pg-row { border-bottom: 1px solid var(--pg-colors-border); }\n.pg-material-theme .pg-cell--v-border { border-right-color: var(--pg-colors-border); }\n\n/* Material filter row */\n.pg-material-theme .pg-filter-row { border-top-color: var(--pg-colors-border); }\n\n/* Material icon tones \u2014 mode-aware */\n.pg-material-theme .pg-icon { color: var(--pg-colors-text-secondary); }\n.pg-material-theme .pg-th--sorted .pg-icon { color: var(--pg-colors-primary); }\n.pg-material-theme .pg-row-drag-handle { color: var(--pg-colors-text-disabled); }\n\n/* Material checkbox \u2014 18px, 2px radius, accent, Material motion + ripple */\n.pg-material-theme .pg-checkbox {\n appearance: none;\n -webkit-appearance: none;\n width: 18px;\n height: 18px;\n border: 2px solid var(--pg-colors-checkbox-border);\n border-radius: 2px;\n background: transparent;\n cursor: pointer;\n position: relative;\n flex-shrink: 0;\n transition: background 200ms cubic-bezier(0.4,0,0.2,1),\n border-color 200ms cubic-bezier(0.4,0,0.2,1),\n box-shadow 200ms cubic-bezier(0.4,0,0.2,1);\n}\n.pg-material-theme .pg-checkbox:hover {\n border-color: var(--pg-colors-primary);\n box-shadow: 0 0 0 8px color-mix(in srgb, var(--pg-colors-primary) 10%, transparent);\n}\n.pg-material-theme .pg-checkbox:focus-visible {\n outline: none;\n box-shadow: 0 0 0 8px color-mix(in srgb, var(--pg-colors-primary) 20%, transparent);\n}\n.pg-material-theme .pg-checkbox:checked {\n background: var(--pg-colors-primary);\n border-color: var(--pg-colors-primary);\n}\n.pg-material-theme .pg-checkbox:checked::after {\n content: '';\n position: absolute;\n left: 4px;\n top: 1px;\n width: 7px;\n height: 11px;\n border: 2px solid var(--pg-colors-primary-text);\n border-top: none;\n border-left: none;\n transform: rotate(45deg);\n}\n.pg-material-theme .pg-checkbox:indeterminate {\n background: var(--pg-colors-primary);\n border-color: var(--pg-colors-primary);\n}\n.pg-material-theme .pg-checkbox:indeterminate::after {\n content: '';\n position: absolute;\n left: 2px;\n top: 50%;\n width: 10px;\n height: 2px;\n background: var(--pg-colors-primary-text);\n transform: translateY(-50%);\n}\n\n/* Material selection \u2014 no left bar, full-row tint only */\n.pg-material-theme .pg-row--selected { box-shadow: none; }\n\n/* Material row-drag animation \u2014 Material motion curve */\n.pg-material-theme .pg-grid--row-dragging .pg-row {\n transition: background 200ms cubic-bezier(0.4,0,0.2,1),\n top 200ms cubic-bezier(0.4,0,0.2,1);\n}\n";
2
10
  //# sourceMappingURL=theme-material.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme-material.d.ts","sourceRoot":"","sources":["../../../src/styles/themes/theme-material.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,gBAAgB,0zIAkI5B,CAAC"}
1
+ {"version":3,"file":"theme-material.d.ts","sourceRoot":"","sources":["../../../src/styles/themes/theme-material.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,eAAO,MAAM,gBAAgB,s/HAmH5B,CAAC"}
@@ -1,31 +1,21 @@
1
- /* pg-material-theme — Material Design 3, indigo blue */
1
+ /**
2
+ * pg-material-theme — Material Design 3 (indigo accent).
3
+ *
4
+ * Cosmetic variant layered on the active mode (light/dark). Overrides only
5
+ * density, radii, typography, accent, elevation and motion; base colors come
6
+ * from the mode tokens so it works in both light and dark. See
7
+ * {@link themeQuartzCss} for the shared design rationale.
8
+ */
2
9
  export const themeMaterialCss = `
3
10
 
4
- /* ──────────── pg-material-theme variables ──────────── */
11
+ /* ──────────── pg-material-theme: structural + accent tokens ──────────── */
5
12
  .pg-material-theme .pg-grid {
13
+ /* Material uses elevation instead of a hard border. */
6
14
  border-radius: 4px;
7
15
  border-color: transparent;
8
16
  box-shadow: 0 2px 1px -1px rgba(0,0,0,.2), 0 1px 1px 0 rgba(0,0,0,.14), 0 1px 3px 0 rgba(0,0,0,.12);
9
17
 
10
- --pg-colors-border: rgba(0,0,0,.12);
11
- --pg-colors-header-background: #ffffff;
12
- --pg-colors-header-border: transparent;
13
- --pg-colors-header-text: rgba(0,0,0,.54);
14
- --pg-colors-row-background: #ffffff;
15
- --pg-colors-row-alt-background: #fafafa;
16
- --pg-colors-row-hover: rgba(0,0,0,.04);
17
- --pg-colors-row-selected: rgba(25,118,210,.10);
18
- --pg-colors-row-selected-hover: rgba(25,118,210,.16);
19
- --pg-colors-text-primary: rgba(0,0,0,.87);
20
- --pg-colors-text-secondary: rgba(0,0,0,.54);
21
- --pg-colors-text-muted: rgba(0,0,0,.38);
22
- --pg-colors-text-disabled: rgba(0,0,0,.26);
23
18
  --pg-colors-primary: #1976d2;
24
- --pg-colors-filter-background: #ffffff;
25
- --pg-colors-scrollbar-bg: #fafafa;
26
- --pg-colors-badge-background: #e3f2fd;
27
- --pg-colors-badge-text: #0d47a1;
28
- --pg-colors-resize-handle-color: rgba(0,0,0,.20);
29
19
 
30
20
  --pg-typography-font-family: Roboto, 'Helvetica Neue', Arial, sans-serif;
31
21
  --pg-typography-font-size-sm: 12px;
@@ -36,43 +26,45 @@ export const themeMaterialCss = `
36
26
 
37
27
  --pg-header-row-height: 56px;
38
28
  --pg-row-height: 52px;
29
+
39
30
  --pg-borders-radius-md: 4px;
40
31
  --pg-borders-radius-sm: 2px;
41
32
  --pg-borders-radius-pill: 4px;
42
- --pg-transitions-duration-fast: 200ms;
43
33
  --pg-sizing-checkbox-size: 18px;
34
+
35
+ --pg-transitions-duration-fast: 200ms;
44
36
  }
45
37
 
46
- /* Material header — no uppercase, medium weight, subdued */
38
+ /* Material header — no uppercase, medium weight; color follows the mode. */
47
39
  .pg-material-theme .pg-th {
48
40
  text-transform: none;
49
41
  font-size: 12px;
50
42
  font-weight: 500;
51
43
  letter-spacing: 0.04em;
52
- color: rgba(0,0,0,.54);
44
+ color: var(--pg-colors-header-text);
53
45
  }
54
- .pg-material-theme .pg-th--sorted { color: #1976d2; }
55
- .pg-material-theme .pg-grid__header { border-bottom: 1px solid rgba(0,0,0,.12); }
46
+ .pg-material-theme .pg-th--sorted { color: var(--pg-colors-primary); }
47
+ .pg-material-theme .pg-grid__header { border-bottom: 1px solid var(--pg-colors-header-border); }
56
48
 
57
49
  /* Material rows — thin divider lines */
58
- .pg-material-theme .pg-row { border-bottom: 1px solid rgba(0,0,0,.06); }
59
- .pg-material-theme .pg-cell--v-border { border-right-color: rgba(0,0,0,.06); }
50
+ .pg-material-theme .pg-row { border-bottom: 1px solid var(--pg-colors-border); }
51
+ .pg-material-theme .pg-cell--v-border { border-right-color: var(--pg-colors-border); }
60
52
 
61
53
  /* Material filter row */
62
- .pg-material-theme .pg-filter-row { border-top-color: rgba(0,0,0,.08); }
54
+ .pg-material-theme .pg-filter-row { border-top-color: var(--pg-colors-border); }
63
55
 
64
- /* Material icon tones */
65
- .pg-material-theme .pg-icon { color: rgba(0,0,0,.54); }
66
- .pg-material-theme .pg-th--sorted .pg-icon { color: #1976d2; }
67
- .pg-material-theme .pg-row-drag-handle { color: rgba(0,0,0,.38); }
56
+ /* Material icon tones — mode-aware */
57
+ .pg-material-theme .pg-icon { color: var(--pg-colors-text-secondary); }
58
+ .pg-material-theme .pg-th--sorted .pg-icon { color: var(--pg-colors-primary); }
59
+ .pg-material-theme .pg-row-drag-handle { color: var(--pg-colors-text-disabled); }
68
60
 
69
- /* Material checkbox — 18px, 2px radius, blue, Material motion */
61
+ /* Material checkbox — 18px, 2px radius, accent, Material motion + ripple */
70
62
  .pg-material-theme .pg-checkbox {
71
63
  appearance: none;
72
64
  -webkit-appearance: none;
73
65
  width: 18px;
74
66
  height: 18px;
75
- border: 2px solid rgba(0,0,0,.38);
67
+ border: 2px solid var(--pg-colors-checkbox-border);
76
68
  border-radius: 2px;
77
69
  background: transparent;
78
70
  cursor: pointer;
@@ -83,16 +75,16 @@ export const themeMaterialCss = `
83
75
  box-shadow 200ms cubic-bezier(0.4,0,0.2,1);
84
76
  }
85
77
  .pg-material-theme .pg-checkbox:hover {
86
- border-color: #1976d2;
87
- box-shadow: 0 0 0 8px rgba(25,118,210,.1);
78
+ border-color: var(--pg-colors-primary);
79
+ box-shadow: 0 0 0 8px color-mix(in srgb, var(--pg-colors-primary) 10%, transparent);
88
80
  }
89
81
  .pg-material-theme .pg-checkbox:focus-visible {
90
82
  outline: none;
91
- box-shadow: 0 0 0 8px rgba(25,118,210,.2);
83
+ box-shadow: 0 0 0 8px color-mix(in srgb, var(--pg-colors-primary) 20%, transparent);
92
84
  }
93
85
  .pg-material-theme .pg-checkbox:checked {
94
- background: #1976d2;
95
- border-color: #1976d2;
86
+ background: var(--pg-colors-primary);
87
+ border-color: var(--pg-colors-primary);
96
88
  }
97
89
  .pg-material-theme .pg-checkbox:checked::after {
98
90
  content: '';
@@ -101,14 +93,14 @@ export const themeMaterialCss = `
101
93
  top: 1px;
102
94
  width: 7px;
103
95
  height: 11px;
104
- border: 2px solid #fff;
96
+ border: 2px solid var(--pg-colors-primary-text);
105
97
  border-top: none;
106
98
  border-left: none;
107
99
  transform: rotate(45deg);
108
100
  }
109
101
  .pg-material-theme .pg-checkbox:indeterminate {
110
- background: #1976d2;
111
- border-color: #1976d2;
102
+ background: var(--pg-colors-primary);
103
+ border-color: var(--pg-colors-primary);
112
104
  }
113
105
  .pg-material-theme .pg-checkbox:indeterminate::after {
114
106
  content: '';
@@ -117,7 +109,7 @@ export const themeMaterialCss = `
117
109
  top: 50%;
118
110
  width: 10px;
119
111
  height: 2px;
120
- background: #fff;
112
+ background: var(--pg-colors-primary-text);
121
113
  transform: translateY(-50%);
122
114
  }
123
115
 
@@ -1 +1 @@
1
- {"version":3,"file":"theme-material.js","sourceRoot":"","sources":["../../../src/styles/themes/theme-material.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAkI/B,CAAC"}
1
+ {"version":3,"file":"theme-material.js","sourceRoot":"","sources":["../../../src/styles/themes/theme-material.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAmH/B,CAAC"}
@@ -1,2 +1,15 @@
1
- export declare const themeQuartzCss = "\n\n/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 pg-quartz-theme variables \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.pg-quartz-theme .pg-grid {\n --pg-colors-border: #ddddde;\n --pg-colors-header-background: #f8fafc;\n --pg-colors-header-border: #ddddde;\n --pg-colors-header-text: #475569;\n --pg-colors-row-background: #ffffff;\n --pg-colors-row-alt-background: #f8fafc;\n --pg-colors-row-hover: #f1f5f9;\n --pg-colors-row-selected: #eff6ff;\n --pg-colors-row-selected-hover: #dbeafe;\n --pg-colors-text-primary: #0f172a;\n --pg-colors-text-secondary: #64748b;\n --pg-colors-text-muted: #94a3b8;\n --pg-colors-text-disabled: #cbd5e1;\n --pg-colors-primary: #2563eb;\n --pg-colors-filter-background: #ffffff;\n --pg-colors-scrollbar-bg: #f8fafc;\n --pg-colors-badge-background: #dbeafe;\n --pg-colors-badge-text: #1e40af;\n\n --pg-typography-font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n --pg-typography-font-size-md: 0.8rem;\n --pg-typography-font-size-sm: 12px;\n --pg-typography-font-size-xs: 11px;\n --pg-typography-font-weight-medium: 400;\n --pg-typography-font-weight-semi-bold: 600;\n --pg-typography-letter-spacing-wide: 0.06em;\n\n --pg-header-row-height: 40px;\n --pg-row-height: 44px;\n --pg-borders-radius-md: 6px;\n --pg-borders-radius-sm: 4px;\n --pg-borders-radius-pill: 9999px;\n --pg-transitions-duration-fast: 150ms;\n --pg-sizing-checkbox-size: 16px;\n --pg-colors-resize-handle-color: #ddddde;\n}\n\n/* Quartz header \u2014 title case, semi-bold */\n.pg-quartz-theme .pg-th {\n text-transform: capitalize;\n font-size: 13px;\n font-weight: 600;\n letter-spacing: 0;\n color: #475569;\n}\n// .pg-quartz-theme .pg-th--sorted { color: #2563eb; }\n\n/* Quartz row \u2014 bottom divider uses the theme border color */\n.pg-quartz-theme .pg-row { border-bottom: 1px solid var(--pg-colors-border); }\n\n/* Quartz icon tones */\n.pg-quartz-theme .pg-icon { color: #64748b; }\n.pg-quartz-theme .pg-th--sorted .pg-icon { color: #2563eb; }\n.pg-quartz-theme .pg-row-drag-handle { color: #94a3b8; }\n.pg-quartz-theme .pg-th--no-group { background-color: #f8fafc; }\n\n/* Quartz checkbox \u2014 16px, 4px-radius square, solid blue on check */\n.pg-quartz-theme .pg-checkbox {\n appearance: none;\n -webkit-appearance: none;\n width: 16px;\n height: 16px;\n border: 2px solid #cbd5e1;\n border-radius: 4px;\n background: #fff;\n cursor: pointer;\n position: relative;\n flex-shrink: 0;\n transition: background 150ms ease, border-color 150ms ease, box-shadow 150ms ease;\n}\n.pg-quartz-theme .pg-checkbox:hover { border-color: #2563eb; }\n.pg-quartz-theme .pg-checkbox:focus-visible {\n outline: none;\n box-shadow: 0 0 0 3px rgba(37,99,235,0.25);\n}\n.pg-quartz-theme .pg-checkbox:checked {\n background: #2563eb;\n border-color: #2563eb;\n}\n.pg-quartz-theme .pg-checkbox:checked::after {\n content: '';\n position: absolute;\n left: 4px;\n top: 1px;\n width: 5px;\n height: 9px;\n border: 2px solid #fff;\n border-top: none;\n border-left: none;\n transform: rotate(45deg);\n}\n.pg-quartz-theme .pg-checkbox:indeterminate {\n background: #2563eb;\n border-color: #2563eb;\n}\n.pg-quartz-theme .pg-checkbox:indeterminate::after {\n content: '';\n position: absolute;\n left: 2px;\n top: 50%;\n width: 8px;\n height: 2px;\n background: #fff;\n transform: translateY(-50%);\n}\n\n/* Quartz row selection highlight \u2014 blue left bar */\n.pg-quartz-theme .pg-row--selected { box-shadow: inset 3px 0 0 #2563eb; }\n\n/* Quartz row-drag animation \u2014 smooth cubic-bezier */\n.pg-quartz-theme .pg-grid--row-dragging .pg-row {\n transition: background 150ms ease, top 130ms cubic-bezier(0.2, 0, 0, 1);\n}\n";
1
+ /**
2
+ * pg-quartz-theme — clean, modern (blue accent).
3
+ *
4
+ * A cosmetic *variant* layered on top of the active color mode (light/dark).
5
+ * It only overrides structural / appearance concerns — density, radii,
6
+ * typography, accent color, checkbox shape, motion, and the distinctive quartz
7
+ * "chrome" tint. All base surface, text and border colors are inherited from
8
+ * the mode tokens (`var(--pg-colors-*)`), so this variant renders correctly in
9
+ * both light and dark.
10
+ *
11
+ * The container carries the `.pg-quartz-theme` class; `.pg-grid` is its child,
12
+ * hence the descendant selectors below.
13
+ */
14
+ export declare const themeQuartzCss = "\n\n/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 pg-quartz-theme: structural + accent tokens \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 */\n.pg-quartz-theme .pg-grid {\n /* Accent identity \u2014 drives sorted headers, selection, checkboxes, links. */\n --pg-colors-primary: #2563eb;\n\n /* Quartz \"chrome\" surface \u2014 the flat tint shared by every non-data surface\n (header, footer/pagination, top grouping row, scrollbars, serial-number\n column). Derived from the mode's alt background so it tints correctly in\n both light and dark; defined once here so the look changes in one place. */\n --pg-quartz-chrome-background: var(--pg-colors-background-alt);\n --pg-colors-header-background: var(--pg-quartz-chrome-background);\n --pg-colors-footer-background: var(--pg-quartz-chrome-background);\n --pg-colors-scrollbar-bg: var(--pg-quartz-chrome-background);\n --pg-colors-scrollbar-track: var(--pg-quartz-chrome-background);\n\n /* Typography identity */\n --pg-typography-font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;\n --pg-typography-font-size-md: 0.8rem;\n --pg-typography-font-size-sm: 12px;\n --pg-typography-font-size-xs: 11px;\n --pg-typography-font-weight-medium: 400;\n --pg-typography-font-weight-semi-bold: 600;\n --pg-typography-letter-spacing-wide: 0.06em;\n\n /* Density */\n --pg-header-row-height: 40px;\n --pg-row-height: 44px;\n\n /* Shape */\n --pg-borders-radius-md: 6px;\n --pg-borders-radius-sm: 4px;\n --pg-borders-radius-pill: 9999px;\n --pg-sizing-checkbox-size: 16px;\n\n /* Motion */\n --pg-transitions-duration-fast: 150ms;\n}\n\n/* Quartz header \u2014 capitalized, semi-bold; color follows the mode. */\n.pg-quartz-theme .pg-th {\n text-transform: capitalize;\n font-size: 13px;\n font-weight: 600;\n letter-spacing: 0;\n color: var(--pg-colors-header-text);\n}\n\n/* Quartz row \u2014 bottom divider uses the mode border color */\n.pg-quartz-theme .pg-row { border-bottom: 1px solid var(--pg-colors-border); }\n\n/* Quartz icon tones \u2014 mode-aware */\n.pg-quartz-theme .pg-icon { color: var(--pg-colors-text-secondary); }\n.pg-quartz-theme .pg-th--sorted .pg-icon { color: var(--pg-colors-primary); }\n.pg-quartz-theme .pg-row-drag-handle { color: var(--pg-colors-text-disabled); }\n.pg-quartz-theme .pg-th--no-group { background: var(--pg-quartz-chrome-background); }\n\n/* Quartz checkbox \u2014 16px, 4px-radius square, solid accent on check */\n.pg-quartz-theme .pg-checkbox {\n appearance: none;\n -webkit-appearance: none;\n width: 16px;\n height: 16px;\n border: 2px solid var(--pg-colors-checkbox-border);\n border-radius: 4px;\n background: var(--pg-colors-checkbox-background);\n cursor: pointer;\n position: relative;\n flex-shrink: 0;\n transition: background 150ms ease, border-color 150ms ease, box-shadow 150ms ease;\n}\n.pg-quartz-theme .pg-checkbox:hover { border-color: var(--pg-colors-primary); }\n.pg-quartz-theme .pg-checkbox:focus-visible {\n outline: none;\n box-shadow: 0 0 0 3px color-mix(in srgb, var(--pg-colors-primary) 25%, transparent);\n}\n.pg-quartz-theme .pg-checkbox:checked {\n background: var(--pg-colors-primary);\n border-color: var(--pg-colors-primary);\n}\n.pg-quartz-theme .pg-checkbox:checked::after {\n content: '';\n position: absolute;\n left: 4px;\n top: 1px;\n width: 5px;\n height: 9px;\n border: 2px solid var(--pg-colors-primary-text);\n border-top: none;\n border-left: none;\n transform: rotate(45deg);\n}\n.pg-quartz-theme .pg-checkbox:indeterminate {\n background: var(--pg-colors-primary);\n border-color: var(--pg-colors-primary);\n}\n.pg-quartz-theme .pg-checkbox:indeterminate::after {\n content: '';\n position: absolute;\n left: 2px;\n top: 50%;\n width: 8px;\n height: 2px;\n background: var(--pg-colors-primary-text);\n transform: translateY(-50%);\n}\n\n/* Quartz row selection highlight \u2014 accent left bar */\n.pg-quartz-theme .pg-row--selected { box-shadow: inset 3px 0 0 var(--pg-colors-primary); }\n\n/* Quartz row-drag animation \u2014 smooth cubic-bezier */\n.pg-quartz-theme .pg-grid--row-dragging .pg-row {\n transition: background 150ms ease, top 130ms cubic-bezier(0.2, 0, 0, 1);\n}\n\n/* \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500 Quartz chrome tint \u2014 serial (row number) column \u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\n Header, filter and body cells of the serial column share the chrome surface\n so the number gutter reads as grid chrome rather than data. (Scrollbars and\n the header/footer/grouping surfaces are driven by the tokens above.) */\n.pg-quartz-theme .pg-th--serial,\n.pg-quartz-theme .pg-filter-cell--serial,\n.pg-quartz-theme .pg-cell--serial {\n background: var(--pg-quartz-chrome-background);\n}\n";
2
15
  //# sourceMappingURL=theme-quartz.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme-quartz.d.ts","sourceRoot":"","sources":["../../../src/styles/themes/theme-quartz.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,cAAc,stHAqH1B,CAAC"}
1
+ {"version":3,"file":"theme-quartz.d.ts","sourceRoot":"","sources":["../../../src/styles/themes/theme-quartz.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,cAAc,gyJA6H1B,CAAC"}
@@ -1,27 +1,34 @@
1
- /* pg-quartz-theme — clean, modern blue (default look) */
1
+ /**
2
+ * pg-quartz-theme — clean, modern (blue accent).
3
+ *
4
+ * A cosmetic *variant* layered on top of the active color mode (light/dark).
5
+ * It only overrides structural / appearance concerns — density, radii,
6
+ * typography, accent color, checkbox shape, motion, and the distinctive quartz
7
+ * "chrome" tint. All base surface, text and border colors are inherited from
8
+ * the mode tokens (`var(--pg-colors-*)`), so this variant renders correctly in
9
+ * both light and dark.
10
+ *
11
+ * The container carries the `.pg-quartz-theme` class; `.pg-grid` is its child,
12
+ * hence the descendant selectors below.
13
+ */
2
14
  export const themeQuartzCss = `
3
15
 
4
- /* ──────────── pg-quartz-theme variables ──────────── */
16
+ /* ──────────── pg-quartz-theme: structural + accent tokens ──────────── */
5
17
  .pg-quartz-theme .pg-grid {
6
- --pg-colors-border: #ddddde;
7
- --pg-colors-header-background: #f8fafc;
8
- --pg-colors-header-border: #ddddde;
9
- --pg-colors-header-text: #475569;
10
- --pg-colors-row-background: #ffffff;
11
- --pg-colors-row-alt-background: #f8fafc;
12
- --pg-colors-row-hover: #f1f5f9;
13
- --pg-colors-row-selected: #eff6ff;
14
- --pg-colors-row-selected-hover: #dbeafe;
15
- --pg-colors-text-primary: #0f172a;
16
- --pg-colors-text-secondary: #64748b;
17
- --pg-colors-text-muted: #94a3b8;
18
- --pg-colors-text-disabled: #cbd5e1;
18
+ /* Accent identity — drives sorted headers, selection, checkboxes, links. */
19
19
  --pg-colors-primary: #2563eb;
20
- --pg-colors-filter-background: #ffffff;
21
- --pg-colors-scrollbar-bg: #f8fafc;
22
- --pg-colors-badge-background: #dbeafe;
23
- --pg-colors-badge-text: #1e40af;
24
20
 
21
+ /* Quartz "chrome" surface — the flat tint shared by every non-data surface
22
+ (header, footer/pagination, top grouping row, scrollbars, serial-number
23
+ column). Derived from the mode's alt background so it tints correctly in
24
+ both light and dark; defined once here so the look changes in one place. */
25
+ --pg-quartz-chrome-background: var(--pg-colors-background-alt);
26
+ --pg-colors-header-background: var(--pg-quartz-chrome-background);
27
+ --pg-colors-footer-background: var(--pg-quartz-chrome-background);
28
+ --pg-colors-scrollbar-bg: var(--pg-quartz-chrome-background);
29
+ --pg-colors-scrollbar-track: var(--pg-quartz-chrome-background);
30
+
31
+ /* Typography identity */
25
32
  --pg-typography-font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
26
33
  --pg-typography-font-size-md: 0.8rem;
27
34
  --pg-typography-font-size-sm: 12px;
@@ -30,57 +37,60 @@ export const themeQuartzCss = `
30
37
  --pg-typography-font-weight-semi-bold: 600;
31
38
  --pg-typography-letter-spacing-wide: 0.06em;
32
39
 
40
+ /* Density */
33
41
  --pg-header-row-height: 40px;
34
42
  --pg-row-height: 44px;
43
+
44
+ /* Shape */
35
45
  --pg-borders-radius-md: 6px;
36
46
  --pg-borders-radius-sm: 4px;
37
47
  --pg-borders-radius-pill: 9999px;
38
- --pg-transitions-duration-fast: 150ms;
39
48
  --pg-sizing-checkbox-size: 16px;
40
- --pg-colors-resize-handle-color: #ddddde;
49
+
50
+ /* Motion */
51
+ --pg-transitions-duration-fast: 150ms;
41
52
  }
42
53
 
43
- /* Quartz header — title case, semi-bold */
54
+ /* Quartz header — capitalized, semi-bold; color follows the mode. */
44
55
  .pg-quartz-theme .pg-th {
45
56
  text-transform: capitalize;
46
57
  font-size: 13px;
47
58
  font-weight: 600;
48
59
  letter-spacing: 0;
49
- color: #475569;
60
+ color: var(--pg-colors-header-text);
50
61
  }
51
- // .pg-quartz-theme .pg-th--sorted { color: #2563eb; }
52
62
 
53
- /* Quartz row — bottom divider uses the theme border color */
63
+ /* Quartz row — bottom divider uses the mode border color */
54
64
  .pg-quartz-theme .pg-row { border-bottom: 1px solid var(--pg-colors-border); }
55
65
 
56
- /* Quartz icon tones */
57
- .pg-quartz-theme .pg-icon { color: #64748b; }
58
- .pg-quartz-theme .pg-th--sorted .pg-icon { color: #2563eb; }
59
- .pg-quartz-theme .pg-row-drag-handle { color: #94a3b8; }
60
- .pg-quartz-theme .pg-th--no-group { background-color: #f8fafc; }
66
+ /* Quartz icon tones — mode-aware */
67
+ .pg-quartz-theme .pg-icon { color: var(--pg-colors-text-secondary); }
68
+ .pg-quartz-theme .pg-th--sorted .pg-icon { color: var(--pg-colors-primary); }
69
+ .pg-quartz-theme .pg-row-drag-handle { color: var(--pg-colors-text-disabled); }
70
+ .pg-quartz-theme .pg-th--no-group { background: var(--pg-quartz-chrome-background); }
61
71
 
62
- /* Quartz checkbox — 16px, 4px-radius square, solid blue on check */
72
+ /* Quartz checkbox — 16px, 4px-radius square, solid accent on check */
63
73
  .pg-quartz-theme .pg-checkbox {
64
74
  appearance: none;
65
75
  -webkit-appearance: none;
66
76
  width: 16px;
67
77
  height: 16px;
68
- border: 2px solid #cbd5e1;
78
+ border: 2px solid var(--pg-colors-checkbox-border);
69
79
  border-radius: 4px;
70
- background: #fff;
80
+ background: var(--pg-colors-checkbox-background);
71
81
  cursor: pointer;
72
82
  position: relative;
73
83
  flex-shrink: 0;
74
84
  transition: background 150ms ease, border-color 150ms ease, box-shadow 150ms ease;
75
85
  }
76
- .pg-quartz-theme .pg-checkbox:hover { border-color: #2563eb; }
86
+ .pg-quartz-theme .pg-checkbox:hover { border-color: var(--pg-colors-primary); }
77
87
  .pg-quartz-theme .pg-checkbox:focus-visible {
78
88
  outline: none;
79
- box-shadow: 0 0 0 3px rgba(37,99,235,0.25);
89
+ box-shadow: 0 0 0 3px color-mix(in srgb, var(--pg-colors-primary) 25%, transparent);
80
90
  }
81
91
  .pg-quartz-theme .pg-checkbox:checked {
82
- background: #2563eb;
83
- border-color: #2563eb;
92
+ background: var(--pg-colors-primary);
93
+ border-color: var(--pg-colors-primary);
84
94
  }
85
95
  .pg-quartz-theme .pg-checkbox:checked::after {
86
96
  content: '';
@@ -89,14 +99,14 @@ export const themeQuartzCss = `
89
99
  top: 1px;
90
100
  width: 5px;
91
101
  height: 9px;
92
- border: 2px solid #fff;
102
+ border: 2px solid var(--pg-colors-primary-text);
93
103
  border-top: none;
94
104
  border-left: none;
95
105
  transform: rotate(45deg);
96
106
  }
97
107
  .pg-quartz-theme .pg-checkbox:indeterminate {
98
- background: #2563eb;
99
- border-color: #2563eb;
108
+ background: var(--pg-colors-primary);
109
+ border-color: var(--pg-colors-primary);
100
110
  }
101
111
  .pg-quartz-theme .pg-checkbox:indeterminate::after {
102
112
  content: '';
@@ -105,16 +115,26 @@ export const themeQuartzCss = `
105
115
  top: 50%;
106
116
  width: 8px;
107
117
  height: 2px;
108
- background: #fff;
118
+ background: var(--pg-colors-primary-text);
109
119
  transform: translateY(-50%);
110
120
  }
111
121
 
112
- /* Quartz row selection highlight — blue left bar */
113
- .pg-quartz-theme .pg-row--selected { box-shadow: inset 3px 0 0 #2563eb; }
122
+ /* Quartz row selection highlight — accent left bar */
123
+ .pg-quartz-theme .pg-row--selected { box-shadow: inset 3px 0 0 var(--pg-colors-primary); }
114
124
 
115
125
  /* Quartz row-drag animation — smooth cubic-bezier */
116
126
  .pg-quartz-theme .pg-grid--row-dragging .pg-row {
117
127
  transition: background 150ms ease, top 130ms cubic-bezier(0.2, 0, 0, 1);
118
128
  }
129
+
130
+ /* ──────────── Quartz chrome tint — serial (row number) column ────────────
131
+ Header, filter and body cells of the serial column share the chrome surface
132
+ so the number gutter reads as grid chrome rather than data. (Scrollbars and
133
+ the header/footer/grouping surfaces are driven by the tokens above.) */
134
+ .pg-quartz-theme .pg-th--serial,
135
+ .pg-quartz-theme .pg-filter-cell--serial,
136
+ .pg-quartz-theme .pg-cell--serial {
137
+ background: var(--pg-quartz-chrome-background);
138
+ }
119
139
  `;
120
140
  //# sourceMappingURL=theme-quartz.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme-quartz.js","sourceRoot":"","sources":["../../../src/styles/themes/theme-quartz.ts"],"names":[],"mappings":"AAAA,yDAAyD;AACzD,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqH7B,CAAC"}
1
+ {"version":3,"file":"theme-quartz.js","sourceRoot":"","sources":["../../../src/styles/themes/theme-quartz.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA6H7B,CAAC"}
@@ -1,20 +1,68 @@
1
- import type { Theme, BuiltInThemeName } from '../types/theme.types';
1
+ import type { Theme, BuiltInThemeName, ThemeMode, ThemeVariant } from '../types/theme.types';
2
2
  import type { EventBus } from '../event-bus/event-bus';
3
+ /**
4
+ * Coordinates the two independent theming axes:
5
+ *
6
+ * 1. **Mode** (`light` / `dark`) — the full color palette, injected as design
7
+ * tokens (CSS custom properties) scoped to the grid's container element.
8
+ * 2. **Variant** (`quartz` / `alpine` / …) — a cosmetic skin applied as a CSS
9
+ * class on that same container. Variant stylesheets only override structural
10
+ * and accent concerns, so any variant composes with either mode.
11
+ *
12
+ * Mode tokens are additionally mirrored onto `:root` so fixed/portal elements
13
+ * (menus, dropdowns, overlays appended to `<body>`) inherit the palette.
14
+ */
3
15
  export declare class ThemeManager {
4
- private eventBus;
5
- private injector;
6
- private rootInjector;
7
- private registry;
8
- private activeTheme;
16
+ private readonly eventBus;
17
+ /** Per-instance stylesheet carrying the active mode's tokens. */
18
+ private readonly injector;
19
+ /** Mirrors mode tokens onto `:root` for portaled elements. */
20
+ private readonly rootInjector;
21
+ private readonly registry;
22
+ private activeMode;
23
+ private activeVariant;
9
24
  private scopeEl;
25
+ /** Monotonic source for unique per-instance scope ids. */
26
+ private static scopeSeq;
10
27
  constructor(eventBus: EventBus);
28
+ /** Register (or replace) a mode theme so it can be resolved by name. */
11
29
  registerTheme(theme: Theme): void;
30
+ /**
31
+ * Apply a color mode (light/dark) by injecting its tokens. Colors cascade
32
+ * from the container down to every cell; the same tokens are mirrored to
33
+ * `:root` for portaled UI. Does not touch the active variant.
34
+ */
35
+ applyMode(modeOrTheme: ThemeMode | Theme, scopeEl?: HTMLElement): void;
36
+ /**
37
+ * Apply (or clear) the cosmetic variant skin. Swaps the `pg-<variant>-theme`
38
+ * class on the scope container; passing `'none'` removes any active variant.
39
+ */
40
+ applyVariant(variant: ThemeVariant | 'none', scopeEl?: HTMLElement): void;
41
+ /**
42
+ * Backward-compatible entry point for the deprecated `theme` option / API.
43
+ * Normalizes a legacy value (e.g. `'dark'`, `'quartz'`, `'pg-quartz-theme'`,
44
+ * `'quartz-dark'`) onto the mode/variant axes and applies it.
45
+ *
46
+ * @deprecated Prefer {@link applyMode} + {@link applyVariant}.
47
+ */
12
48
  applyTheme(nameOrTheme: BuiltInThemeName | string | Theme, scopeEl?: HTMLElement): void;
13
- getActiveTheme(): Theme | null;
49
+ /** The active mode theme (light/dark). Never null after construction. */
50
+ getActiveTheme(): Theme;
51
+ /** The active mode as a plain string. */
52
+ getActiveMode(): ThemeMode;
53
+ /** The active variant, or `'none'` when no skin is applied. */
54
+ getActiveVariant(): ThemeVariant | 'none';
14
55
  getTheme(name: string): Theme | undefined;
15
56
  getAllThemes(): Theme[];
57
+ /** Toggle between light and dark mode, preserving the active variant. */
16
58
  toggleDarkMode(): void;
17
59
  isDarkMode(): boolean;
18
60
  destroy(): void;
61
+ /** Resolve a mode name or Theme object to a concrete light/dark Theme. */
62
+ private resolveModeTheme;
63
+ /** Ensure the scope element carries a stable id used to target its tokens. */
64
+ private ensureScopeId;
65
+ /** Map a legacy `theme` string onto the mode/variant axes. */
66
+ private static parseLegacyTheme;
19
67
  }
20
68
  //# sourceMappingURL=theme-manager.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"theme-manager.d.ts","sourceRoot":"","sources":["../../src/theme/theme-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAMvD,qBAAa,YAAY;IASX,OAAO,CAAC,QAAQ;IAR5B,OAAO,CAAC,QAAQ,CAAwB;IAGxC,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,QAAQ,CAA4B;IAC5C,OAAO,CAAC,WAAW,CAAsB;IACzC,OAAO,CAAC,OAAO,CAA4B;gBAEvB,QAAQ,EAAE,QAAQ;IAKtC,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAIjC,UAAU,CACR,WAAW,EAAE,gBAAgB,GAAG,MAAM,GAAG,KAAK,EAC9C,OAAO,CAAC,EAAE,WAAW,GACpB,IAAI;IAoCP,cAAc,IAAI,KAAK,GAAG,IAAI;IAI9B,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAIzC,YAAY,IAAI,KAAK,EAAE;IAIvB,cAAc,IAAI,IAAI;IAQtB,UAAU,IAAI,OAAO;IAIrB,OAAO,IAAI,IAAI;CAKhB"}
1
+ {"version":3,"file":"theme-manager.d.ts","sourceRoot":"","sources":["../../src/theme/theme-manager.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,gBAAgB,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AAE7F,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAoBvD;;;;;;;;;;;GAWG;AACH,qBAAa,YAAY;IAcX,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAbrC,iEAAiE;IACjE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAwB;IACjD,8DAA8D;IAC9D,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAwB;IACrD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAA4B;IAErD,OAAO,CAAC,UAAU,CAAQ;IAC1B,OAAO,CAAC,aAAa,CAAiC;IACtD,OAAO,CAAC,OAAO,CAA4B;IAE3C,0DAA0D;IAC1D,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAK;gBAEC,QAAQ,EAAE,QAAQ;IAM/C,wEAAwE;IACxE,aAAa,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI;IAIjC;;;;OAIG;IACH,SAAS,CAAC,WAAW,EAAE,SAAS,GAAG,KAAK,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI;IA2BtE;;;OAGG;IACH,YAAY,CAAC,OAAO,EAAE,YAAY,GAAG,MAAM,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI;IAkBzE;;;;;;OAMG;IACH,UAAU,CAAC,WAAW,EAAE,gBAAgB,GAAG,MAAM,GAAG,KAAK,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI;IAmBvF,yEAAyE;IACzE,cAAc,IAAI,KAAK;IAIvB,yCAAyC;IACzC,aAAa,IAAI,SAAS;IAI1B,+DAA+D;IAC/D,gBAAgB,IAAI,YAAY,GAAG,MAAM;IAIzC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,SAAS;IAIzC,YAAY,IAAI,KAAK,EAAE;IAIvB,yEAAyE;IACzE,cAAc,IAAI,IAAI;IAItB,UAAU,IAAI,OAAO;IAIrB,OAAO,IAAI,IAAI;IAOf,0EAA0E;IAC1E,OAAO,CAAC,gBAAgB;IAKxB,8EAA8E;IAC9E,OAAO,CAAC,aAAa;IASrB,8DAA8D;IAC9D,OAAO,CAAC,MAAM,CAAC,gBAAgB;CAuBhC"}