@zengrid/core 1.2.2 → 1.3.1

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 (105) hide show
  1. package/dist/index.cjs.js +1879 -1095
  2. package/dist/index.esm.js +1936 -1161
  3. package/dist/package.json +2 -2
  4. package/dist/src/datetime-core/formatting/date-formatter.d.ts +2 -0
  5. package/dist/src/datetime-core/formatting/date-formatter.d.ts.map +1 -1
  6. package/dist/src/datetime-core/theming/datetime.css +463 -407
  7. package/dist/src/editing/checkbox/checkbox-dom.d.ts.map +1 -1
  8. package/dist/src/editing/datetime/date-editor/date-editor.d.ts.map +1 -1
  9. package/dist/src/editing/datetime/date-range-editor/date-range-calendar.d.ts.map +1 -1
  10. package/dist/src/editing/editor-manager/editor-manager.d.ts +23 -1
  11. package/dist/src/editing/editor-manager/editor-manager.d.ts.map +1 -1
  12. package/dist/src/editing/number/number-editor.d.ts.map +1 -1
  13. package/dist/src/editing/select/select-editor.d.ts.map +1 -1
  14. package/dist/src/features/column-drag/drag-mouse-handler.d.ts +1 -0
  15. package/dist/src/features/column-drag/drag-mouse-handler.d.ts.map +1 -1
  16. package/dist/src/features/copy-paste/clipboard-manager.d.ts +24 -2
  17. package/dist/src/features/copy-paste/clipboard-manager.d.ts.map +1 -1
  18. package/dist/src/features/loading/loading-indicator.d.ts.map +1 -1
  19. package/dist/src/features/loading/loading.styles.css +346 -342
  20. package/dist/src/features/selection/selection-manager.d.ts +14 -0
  21. package/dist/src/features/selection/selection-manager.d.ts.map +1 -1
  22. package/dist/src/grid/grid-core.d.ts.map +1 -1
  23. package/dist/src/grid/grid-setup.d.ts.map +1 -1
  24. package/dist/src/index.d.ts +9 -2
  25. package/dist/src/index.d.ts.map +1 -1
  26. package/dist/src/plugins/clipboard/clipboard-plugin.d.ts +21 -0
  27. package/dist/src/plugins/clipboard/clipboard-plugin.d.ts.map +1 -0
  28. package/dist/src/plugins/clipboard/index.d.ts +3 -0
  29. package/dist/src/plugins/clipboard/index.d.ts.map +1 -0
  30. package/dist/src/plugins/column/column-plugin.d.ts.map +1 -1
  31. package/dist/src/plugins/dom/dom-plugin.d.ts.map +1 -1
  32. package/dist/src/plugins/editing/editing-plugin.d.ts.map +1 -1
  33. package/dist/src/plugins/filter-ui/field-state-utils.d.ts +6 -0
  34. package/dist/src/plugins/filter-ui/field-state-utils.d.ts.map +1 -0
  35. package/dist/src/plugins/filter-ui/filter-chip-bar.d.ts +16 -0
  36. package/dist/src/plugins/filter-ui/filter-chip-bar.d.ts.map +1 -0
  37. package/dist/src/plugins/filter-ui/filter-chip-descriptors.d.ts +4 -0
  38. package/dist/src/plugins/filter-ui/filter-chip-descriptors.d.ts.map +1 -0
  39. package/dist/src/plugins/filter-ui/filter-popup-dom.d.ts +32 -0
  40. package/dist/src/plugins/filter-ui/filter-popup-dom.d.ts.map +1 -0
  41. package/dist/src/plugins/filter-ui/filter-popup.d.ts +3 -0
  42. package/dist/src/plugins/filter-ui/filter-popup.d.ts.map +1 -0
  43. package/dist/src/plugins/filter-ui/filter-ui-operators.d.ts +9 -0
  44. package/dist/src/plugins/filter-ui/filter-ui-operators.d.ts.map +1 -0
  45. package/dist/src/plugins/filter-ui/filter-ui-types.d.ts +56 -0
  46. package/dist/src/plugins/filter-ui/filter-ui-types.d.ts.map +1 -0
  47. package/dist/src/plugins/filter-ui/grid-filter-ui.d.ts +20 -0
  48. package/dist/src/plugins/filter-ui/grid-filter-ui.d.ts.map +1 -0
  49. package/dist/src/plugins/filter-ui/index.d.ts +1 -0
  50. package/dist/src/plugins/filter-ui/index.d.ts.map +1 -1
  51. package/dist/src/plugins/header/header-dom-operations.d.ts +6 -0
  52. package/dist/src/plugins/header/header-dom-operations.d.ts.map +1 -1
  53. package/dist/src/plugins/header/header-plugin.d.ts.map +1 -1
  54. package/dist/src/plugins/header/header-registry-setup.d.ts.map +1 -1
  55. package/dist/src/plugins/header/header-rendering.d.ts.map +1 -1
  56. package/dist/src/plugins/header/header-types.d.ts +8 -1
  57. package/dist/src/plugins/header/header-types.d.ts.map +1 -1
  58. package/dist/src/plugins/index.d.ts +4 -0
  59. package/dist/src/plugins/index.d.ts.map +1 -1
  60. package/dist/src/plugins/keyboard/index.d.ts +3 -0
  61. package/dist/src/plugins/keyboard/index.d.ts.map +1 -0
  62. package/dist/src/plugins/keyboard/keyboard-nav-utils.d.ts +13 -0
  63. package/dist/src/plugins/keyboard/keyboard-nav-utils.d.ts.map +1 -0
  64. package/dist/src/plugins/keyboard/keyboard-plugin.d.ts +17 -0
  65. package/dist/src/plugins/keyboard/keyboard-plugin.d.ts.map +1 -0
  66. package/dist/src/plugins/lifecycle/lifecycle-plugin.d.ts +1 -0
  67. package/dist/src/plugins/lifecycle/lifecycle-plugin.d.ts.map +1 -1
  68. package/dist/src/plugins/pagination/pagination-plugin.d.ts.map +1 -1
  69. package/dist/src/plugins/rendering/rendering-plugin.d.ts.map +1 -1
  70. package/dist/src/plugins/selection/selection-plugin.d.ts.map +1 -1
  71. package/dist/src/reactive/store.d.ts +1 -0
  72. package/dist/src/reactive/store.d.ts.map +1 -1
  73. package/dist/src/reactive/types.d.ts +1 -0
  74. package/dist/src/reactive/types.d.ts.map +1 -1
  75. package/dist/src/rendering/cache/renderer-cache.interface.d.ts +6 -0
  76. package/dist/src/rendering/cache/renderer-cache.interface.d.ts.map +1 -1
  77. package/dist/src/rendering/cell-positioner/cell-positioner.d.ts +21 -0
  78. package/dist/src/rendering/cell-positioner/cell-positioner.d.ts.map +1 -1
  79. package/dist/src/rendering/headers/header-renderer.interface.d.ts +6 -0
  80. package/dist/src/rendering/headers/header-renderer.interface.d.ts.map +1 -1
  81. package/dist/src/rendering/headers/renderers/sortable-header-renderer.d.ts +4 -0
  82. package/dist/src/rendering/headers/renderers/sortable-header-renderer.d.ts.map +1 -1
  83. package/dist/src/rendering/renderers/dropdown/dropdown-dom.d.ts.map +1 -1
  84. package/dist/src/rendering/renderers/dropdown/dropdown-renderer.d.ts +2 -0
  85. package/dist/src/rendering/renderers/dropdown/dropdown-renderer.d.ts.map +1 -1
  86. package/dist/src/rendering/renderers/dropdown/dropdown-state.d.ts.map +1 -1
  87. package/dist/src/rendering/renderers/renderer.interface.d.ts +7 -0
  88. package/dist/src/rendering/renderers/renderer.interface.d.ts.map +1 -1
  89. package/dist/src/styles/a11y.css +20 -0
  90. package/dist/src/styles/calendar.css +291 -0
  91. package/dist/src/styles/cell-overflow.css +129 -0
  92. package/dist/src/styles/cell-renderers.css +90 -0
  93. package/dist/src/styles/date-picker.css +125 -0
  94. package/dist/src/styles/dropdown.css +156 -0
  95. package/dist/src/styles/filter.css +166 -0
  96. package/dist/src/styles/grid.css +91 -287
  97. package/dist/src/styles/header.css +60 -0
  98. package/dist/src/styles/overlays.css +44 -0
  99. package/dist/src/styles/tokens.css +86 -0
  100. package/dist/src/styles.css +24 -1112
  101. package/dist/src/types/grid.d.ts +32 -2
  102. package/dist/src/types/grid.d.ts.map +1 -1
  103. package/package.json +3 -3
  104. package/dist/src/grid/filter-ui.d.ts +0 -71
  105. package/dist/src/grid/filter-ui.d.ts.map +0 -1
@@ -0,0 +1,129 @@
1
+ /**
2
+ * Cell overflow modes (clip / ellipsis / wrap / scroll / expand) and chip cell
3
+ * overflow behaviour, including scrollbar styling.
4
+ */
5
+
6
+ /* Clip mode (default) - already applied in .zg-cell base styles */
7
+ .zg-cell-overflow-clip {
8
+ overflow: hidden;
9
+ white-space: nowrap;
10
+ text-overflow: clip;
11
+ }
12
+
13
+ /* Ellipsis mode - already applied in .zg-cell base styles */
14
+ .zg-cell-overflow-ellipsis {
15
+ overflow: hidden;
16
+ white-space: nowrap;
17
+ text-overflow: ellipsis;
18
+ }
19
+
20
+ /* Wrap mode (requires autoHeight for proper row expansion) */
21
+ .zg-cell-overflow-wrap {
22
+ white-space: normal !important;
23
+ word-wrap: break-word;
24
+ overflow-wrap: break-word;
25
+ overflow: visible !important;
26
+ }
27
+
28
+ /* Scroll mode (scrolls within fixed cell height) */
29
+ .zg-cell-overflow-scroll {
30
+ overflow-y: auto;
31
+ overflow-x: hidden;
32
+ white-space: normal;
33
+ word-wrap: break-word;
34
+ scroll-behavior: smooth;
35
+ scrollbar-width: thin;
36
+ contain: layout style; /* Remove paint containment so scrollbar can render */
37
+ }
38
+
39
+ .zg-cell-overflow-scroll::-webkit-scrollbar {
40
+ width: 6px;
41
+ }
42
+
43
+ .zg-cell-overflow-scroll::-webkit-scrollbar-track {
44
+ background: rgba(0, 0, 0, 0.05);
45
+ border-radius: 3px;
46
+ }
47
+
48
+ .zg-cell-overflow-scroll::-webkit-scrollbar-thumb {
49
+ background: rgba(0, 0, 0, 0.2);
50
+ border-radius: 3px;
51
+ }
52
+
53
+ .zg-cell-overflow-scroll::-webkit-scrollbar-thumb:hover {
54
+ background: rgba(0, 0, 0, 0.3);
55
+ }
56
+
57
+ /* Expand mode (alias for wrap, requires autoHeight) */
58
+ .zg-cell-overflow-expand {
59
+ white-space: normal !important;
60
+ word-wrap: break-word;
61
+ overflow-wrap: break-word;
62
+ overflow: visible !important;
63
+ }
64
+
65
+ /* Chip cell overrides - allow proper overflow handling */
66
+ .zg-cell-chip {
67
+ white-space: nowrap;
68
+ overflow: hidden; /* Clip chips to cell bounds by default */
69
+ contain: layout style; /* Relax paint containment for chip rendering */
70
+ }
71
+
72
+ /* When chip cell has scroll mode, enable horizontal scrolling */
73
+ .zg-cell-overflow-scroll.zg-cell-chip {
74
+ overflow-x: auto; /* Allow horizontal scrolling */
75
+ overflow-y: hidden; /* Prevent vertical overflow */
76
+ display: flex; /* Enable flexbox for proper containment */
77
+ align-items: center; /* Vertically center chips */
78
+ white-space: nowrap; /* Keep chips in single line */
79
+ scrollbar-width: thin; /* Thin scrollbar for Firefox */
80
+ contain: layout style; /* Remove paint containment so scrollbar can render */
81
+ }
82
+
83
+ .zg-cell-overflow-scroll.zg-cell-chip::-webkit-scrollbar {
84
+ height: 6px; /* Horizontal scrollbar height */
85
+ }
86
+
87
+ .zg-cell-overflow-scroll.zg-cell-chip::-webkit-scrollbar-track {
88
+ background: rgba(0, 0, 0, 0.05);
89
+ }
90
+
91
+ .zg-cell-overflow-scroll.zg-cell-chip::-webkit-scrollbar-thumb {
92
+ background: rgba(0, 0, 0, 0.2);
93
+ border-radius: 3px;
94
+ }
95
+
96
+ .zg-cell-overflow-scroll.zg-cell-chip::-webkit-scrollbar-thumb:hover {
97
+ background: rgba(0, 0, 0, 0.3);
98
+ }
99
+
100
+ /* Chip renderer */
101
+ .zg-chip-container {
102
+ display: flex;
103
+ align-items: center;
104
+ gap: 4px;
105
+ max-width: 100%; /* Constrain to cell width */
106
+ }
107
+
108
+ /* Chip container overflow modes */
109
+ .zg-chip-container--wrap {
110
+ flex-wrap: wrap;
111
+ min-height: 100%; /* Allow row to expand */
112
+ }
113
+
114
+ .zg-chip-container--scroll {
115
+ flex-wrap: nowrap;
116
+ overflow-x: auto;
117
+ overflow-y: hidden;
118
+ max-height: 100%;
119
+ scrollbar-width: none; /* Firefox */
120
+ }
121
+
122
+ .zg-chip-container--scroll::-webkit-scrollbar {
123
+ display: none; /* Chrome/Safari */
124
+ }
125
+
126
+ .zg-chip-container--collapse {
127
+ flex-wrap: nowrap;
128
+ overflow: hidden;
129
+ }
@@ -0,0 +1,90 @@
1
+ /**
2
+ * Cell renderers — number, image, advanced (icon + text), badge, button and checkbox.
3
+ */
4
+
5
+ /* Number renderer */
6
+ .zg-cell-number {
7
+ /* Right-align under the flex .zg-cell; text-align alone is a no-op on a flex container */
8
+ justify-content: flex-end;
9
+ text-align: right;
10
+ font-variant-numeric: tabular-nums;
11
+ }
12
+
13
+ .zg-cell-negative {
14
+ color: var(--zg-text-negative, #d32f2f);
15
+ }
16
+
17
+ /* Image renderer */
18
+ .zg-cell-image {
19
+ display: flex;
20
+ align-items: center;
21
+ justify-content: center;
22
+ padding: 2px;
23
+ }
24
+
25
+ .zg-cell-image__img {
26
+ max-width: 100%;
27
+ max-height: 100%;
28
+ object-fit: contain;
29
+ }
30
+
31
+ /* Advanced cell renderer */
32
+ .zg-cell-advanced {
33
+ overflow: hidden;
34
+ }
35
+
36
+ .zg-cell-advanced__icon {
37
+ flex-shrink: 0;
38
+ }
39
+
40
+ .zg-cell-advanced__text {
41
+ flex: 1;
42
+ overflow: hidden;
43
+ text-overflow: ellipsis;
44
+ white-space: nowrap;
45
+ }
46
+
47
+ .zg-badge {
48
+ display: inline-flex;
49
+ align-items: center;
50
+ justify-content: center;
51
+ padding: 2px 6px;
52
+ border-radius: 4px;
53
+ font-size: 0.75em;
54
+ font-weight: 500;
55
+ background: var(--zg-badge-bg, #e0e0e0);
56
+ color: var(--zg-badge-color, #333);
57
+ }
58
+
59
+ /* Button Renderer Styles */
60
+ .zg-cell.zg-cell-button {
61
+ display: flex;
62
+ align-items: center;
63
+ justify-content: center;
64
+ }
65
+
66
+ .zg-button {
67
+ line-height: 1;
68
+ text-align: center;
69
+ }
70
+
71
+ /* Checkbox Renderer Styles */
72
+ .zg-cell.zg-cell-checkbox-container {
73
+ display: flex;
74
+ align-items: center;
75
+ justify-content: center;
76
+ padding: 0 !important; /* Override default cell padding */
77
+ }
78
+
79
+ .zg-checkbox-wrapper {
80
+ display: flex;
81
+ align-items: center;
82
+ justify-content: center;
83
+ }
84
+
85
+ .zg-cell-checkbox {
86
+ cursor: pointer;
87
+ width: 16px;
88
+ height: 16px;
89
+ margin: 0;
90
+ }
@@ -0,0 +1,125 @@
1
+ /**
2
+ * Date picker renderer — trigger button, text/icon, popup and cell state classes.
3
+ */
4
+
5
+ /* Container */
6
+ .zg-date-picker-wrapper {
7
+ display: flex;
8
+ width: 100%;
9
+ height: 100%;
10
+ align-items: center;
11
+ }
12
+
13
+ /* Trigger button */
14
+ .zg-date-picker-trigger {
15
+ display: flex;
16
+ align-items: center;
17
+ justify-content: space-between;
18
+ width: 100%;
19
+ padding: 6px 8px;
20
+ border: 1px solid var(--zg-border-color, #d0d0d0);
21
+ border-radius: 4px;
22
+ background: var(--zg-bg-primary, #ffffff);
23
+ color: var(--zg-text-color, #333333);
24
+ font-family: inherit;
25
+ font-size: inherit;
26
+ cursor: pointer;
27
+ text-align: left;
28
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
29
+ }
30
+
31
+ .zg-date-picker-trigger:hover:not(:disabled) {
32
+ border-color: var(--zg-focus-ring, #1976d2);
33
+ }
34
+
35
+ .zg-date-picker-trigger:focus {
36
+ outline: none;
37
+ border-color: var(--zg-focus-ring, #1976d2);
38
+ box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.2);
39
+ }
40
+
41
+ /* Editing state - use CSS variable, not hardcoded green */
42
+ .zg-cell-editing .zg-date-picker-trigger {
43
+ outline: 2px solid var(--zg-border-editing, #4caf50);
44
+ outline-offset: -1px;
45
+ }
46
+
47
+ /* Open state */
48
+ .zg-date-picker-open .zg-date-picker-trigger {
49
+ border-color: var(--zg-focus-ring, #1976d2);
50
+ }
51
+
52
+ /* Disabled state */
53
+ .zg-date-picker-trigger:disabled,
54
+ .zg-date-picker-disabled {
55
+ background: var(--zg-hover-bg, #f5f5f5);
56
+ color: var(--zg-text-color, #999999);
57
+ opacity: 0.6;
58
+ cursor: not-allowed;
59
+ }
60
+
61
+ /* Text display */
62
+ .zg-date-picker-text {
63
+ flex: 1;
64
+ overflow: hidden;
65
+ text-overflow: ellipsis;
66
+ white-space: nowrap;
67
+ }
68
+
69
+ /* Empty placeholder */
70
+ .zg-date-picker-empty .zg-date-picker-text {
71
+ color: var(--zg-text-color, #999999);
72
+ opacity: 0.6;
73
+ }
74
+
75
+ /* Calendar icon */
76
+ .zg-date-picker-icon {
77
+ flex-shrink: 0;
78
+ margin-left: 8px;
79
+ color: var(--zg-text-color, #666666);
80
+ opacity: 0.7;
81
+ }
82
+
83
+ .zg-date-picker-icon svg {
84
+ display: block;
85
+ width: 16px;
86
+ height: 16px;
87
+ }
88
+
89
+ /* Popup container */
90
+ .zg-date-picker-popup {
91
+ position: fixed;
92
+ z-index: 10003;
93
+ background: var(--zg-calendar-bg, #ffffff);
94
+ border: 1px solid var(--zg-calendar-border, #e0e0e0);
95
+ border-radius: var(--zg-calendar-radius, 8px);
96
+ box-shadow: var(--zg-shadow-lg, 0 4px 20px rgba(0, 0, 0, 0.15));
97
+ }
98
+
99
+ /* Calendar wrapper */
100
+ .zg-date-picker-calendar-wrapper {
101
+ padding: 4px;
102
+ }
103
+
104
+ /* Dark theme adjustments */
105
+ [data-theme="dark"] .zg-date-picker-trigger,
106
+ .zg-theme-dark .zg-date-picker-trigger {
107
+ background: var(--zg-bg-primary, #1e1e1e);
108
+ border-color: var(--zg-border-color, #444444);
109
+ color: var(--zg-text-color, #e0e0e0);
110
+ }
111
+
112
+ [data-theme="dark"] .zg-date-picker-popup,
113
+ .zg-theme-dark .zg-date-picker-popup {
114
+ background: var(--zg-calendar-bg, #2d2d2d);
115
+ border-color: var(--zg-calendar-border, #444444);
116
+ }
117
+
118
+ /* Cell state classes */
119
+ .zg-cell-date-picker {
120
+ /* Cell containing date picker */
121
+ }
122
+
123
+ .zg-date-picker-has-value .zg-date-picker-text {
124
+ font-weight: 400;
125
+ }
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Dropdown renderer.
3
+ * Visual defaults live here (not inline) so apps can re-skin via these classes
4
+ * without !important. The menu is portaled to <body>, so its rules use
5
+ * standalone selectors, not descendants of the wrapper.
6
+ */
7
+
8
+ .zg-cell-dropdown {
9
+ padding: 0;
10
+ }
11
+
12
+ /* Wrapper (in-grid) */
13
+ .zg-dropdown-wrapper {
14
+ display: flex;
15
+ width: 100%;
16
+ height: 100%;
17
+ align-items: center;
18
+ }
19
+
20
+ /* Trigger button (in-grid) */
21
+ .zg-dropdown-trigger {
22
+ display: flex;
23
+ align-items: center;
24
+ justify-content: space-between;
25
+ gap: 8px;
26
+ width: 100%;
27
+ padding: 6px 8px;
28
+ border: 1px solid var(--zg-border-color, #d0d0d0);
29
+ border-radius: 6px;
30
+ background: var(--zg-bg-primary, #ffffff);
31
+ color: var(--zg-text-primary, #333333);
32
+ font-family: inherit;
33
+ font-size: inherit;
34
+ line-height: 1.4;
35
+ cursor: pointer;
36
+ text-align: left;
37
+ white-space: nowrap;
38
+ overflow: hidden;
39
+ text-overflow: ellipsis;
40
+ transition: border-color 0.15s ease, box-shadow 0.15s ease;
41
+ }
42
+
43
+ .zg-dropdown-trigger:hover {
44
+ border-color: var(--zg-focus-ring, #1976d2);
45
+ }
46
+
47
+ .zg-dropdown-trigger:focus-visible {
48
+ outline: none;
49
+ border-color: var(--zg-focus-ring, #1976d2);
50
+ box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.2);
51
+ }
52
+
53
+ .zg-dropdown-wrapper.open .zg-dropdown-trigger {
54
+ border-color: var(--zg-focus-ring, #1976d2);
55
+ }
56
+
57
+ .zg-dropdown-arrow {
58
+ flex-shrink: 0;
59
+ font-size: 10px;
60
+ line-height: 1;
61
+ color: var(--zg-text-secondary, #666666);
62
+ transition: transform 0.15s ease;
63
+ }
64
+
65
+ .zg-dropdown-wrapper.open .zg-dropdown-arrow {
66
+ transform: rotate(180deg);
67
+ }
68
+
69
+ /* Menu (portaled to <body>) */
70
+ .zg-dropdown-menu {
71
+ min-width: 200px;
72
+ overflow-y: auto;
73
+ background: var(--zg-bg-primary, #ffffff);
74
+ color: var(--zg-text-primary, #333333);
75
+ border: 1px solid var(--zg-border-color, #d0d0d0);
76
+ border-radius: 8px;
77
+ box-shadow: var(--zg-shadow-lg, 0 4px 20px rgba(0, 0, 0, 0.15));
78
+ overscroll-behavior: contain;
79
+ }
80
+
81
+ /* Search */
82
+ .zg-dropdown-search {
83
+ padding: 8px;
84
+ border-bottom: 1px solid var(--zg-border-color, #eeeeee);
85
+ }
86
+
87
+ .zg-dropdown-search-input {
88
+ width: 100%;
89
+ padding: 6px 8px;
90
+ border: 1px solid var(--zg-border-color, #d0d0d0);
91
+ border-radius: 6px;
92
+ font: inherit;
93
+ color: inherit;
94
+ background: var(--zg-bg-primary, #ffffff);
95
+ }
96
+
97
+ .zg-dropdown-search-input:focus-visible {
98
+ outline: none;
99
+ border-color: var(--zg-focus-ring, #1976d2);
100
+ box-shadow: 0 0 0 2px rgba(25, 118, 210, 0.2);
101
+ }
102
+
103
+ /* Options */
104
+ .zg-dropdown-options {
105
+ padding: 4px;
106
+ }
107
+
108
+ .zg-dropdown-option {
109
+ display: flex;
110
+ align-items: center;
111
+ gap: 8px;
112
+ padding: 8px 10px;
113
+ border-radius: 6px;
114
+ cursor: pointer;
115
+ color: var(--zg-text-primary, #333333);
116
+ transition: background-color 0.1s ease;
117
+ }
118
+
119
+ .zg-dropdown-option:hover,
120
+ .zg-dropdown-option:focus {
121
+ background: var(--zg-bg-hover, #f0f4f8);
122
+ outline: none;
123
+ }
124
+
125
+ .zg-dropdown-option.selected {
126
+ background: var(--zg-bg-selected, #e3f2fd);
127
+ font-weight: 600;
128
+ }
129
+
130
+ .zg-dropdown-option.disabled {
131
+ color: var(--zg-text-disabled, #999999);
132
+ cursor: not-allowed;
133
+ }
134
+
135
+ .zg-dropdown-group-header {
136
+ padding: 8px 10px 4px;
137
+ font-size: 11px;
138
+ font-weight: 700;
139
+ letter-spacing: 0.04em;
140
+ text-transform: uppercase;
141
+ color: var(--zg-text-secondary, #666666);
142
+ }
143
+
144
+ .zg-dropdown-no-options {
145
+ padding: 12px;
146
+ text-align: center;
147
+ color: var(--zg-text-disabled, #999999);
148
+ }
149
+
150
+ /* Dark theme (in-grid trigger; portaled menu resolves :root vars) */
151
+ [data-theme="dark"] .zg-dropdown-trigger,
152
+ .zg-theme-dark .zg-dropdown-trigger {
153
+ background: var(--zg-bg-primary, #1e1e1e);
154
+ border-color: var(--zg-border-color, #444444);
155
+ color: var(--zg-text-primary, #e0e0e0);
156
+ }
@@ -0,0 +1,166 @@
1
+ /**
2
+ * Filtering UI — active-filter chip bar and the per-column filter popup.
3
+ */
4
+
5
+ /* Active filter chips */
6
+ .zg-filter-chip-bar {
7
+ position: absolute;
8
+ left: 0;
9
+ right: 0;
10
+ z-index: 9;
11
+ display: flex;
12
+ align-items: flex-start;
13
+ gap: 8px;
14
+ padding: 6px 8px;
15
+ border-bottom: 1px solid var(--zg-border-color);
16
+ background: var(--zg-bg-secondary, #f9f9f9);
17
+ box-sizing: border-box;
18
+ }
19
+
20
+ .zg-filter-chip-bar__title {
21
+ font-size: 12px;
22
+ font-weight: 600;
23
+ color: var(--zg-text-secondary, #666666);
24
+ line-height: 24px;
25
+ }
26
+
27
+ .zg-filter-chip-bar__list {
28
+ display: flex;
29
+ flex: 1;
30
+ flex-wrap: wrap;
31
+ gap: 6px;
32
+ }
33
+
34
+ .zg-filter-chip-bar__clear {
35
+ flex-shrink: 0;
36
+ padding: 4px 8px;
37
+ border: 1px solid var(--zg-border-color);
38
+ border-radius: 999px;
39
+ background: transparent;
40
+ color: var(--zg-text-secondary, #666666);
41
+ font-size: 12px;
42
+ cursor: pointer;
43
+ }
44
+
45
+ .zg-filter-chip {
46
+ display: inline-flex;
47
+ align-items: center;
48
+ gap: 6px;
49
+ min-width: 0;
50
+ padding: 4px 8px;
51
+ border: 1px solid var(--zg-border-color);
52
+ border-radius: 999px;
53
+ background: var(--zg-bg-color);
54
+ color: var(--zg-text-color);
55
+ box-shadow: var(--zg-shadow-sm);
56
+ }
57
+
58
+ .zg-filter-chip__label {
59
+ min-width: 0;
60
+ max-width: 320px;
61
+ overflow: hidden;
62
+ text-overflow: ellipsis;
63
+ white-space: nowrap;
64
+ font-size: 12px;
65
+ }
66
+
67
+ .zg-filter-chip__remove {
68
+ flex-shrink: 0;
69
+ border: 0;
70
+ padding: 0;
71
+ background: transparent;
72
+ color: inherit;
73
+ font-size: 14px;
74
+ line-height: 1;
75
+ cursor: pointer;
76
+ }
77
+
78
+ /* Filter popup */
79
+ .zg-filter-popup {
80
+ position: fixed;
81
+ min-width: 220px;
82
+ max-width: 320px;
83
+ background: var(--zg-bg-color);
84
+ color: var(--zg-text-color);
85
+ border: 1px solid var(--zg-border-color);
86
+ border-radius: 6px;
87
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.15);
88
+ padding: 10px;
89
+ z-index: 2000;
90
+ font-size: 13px;
91
+ }
92
+
93
+ .zg-filter-popup__title {
94
+ font-weight: 600;
95
+ margin-bottom: 8px;
96
+ }
97
+
98
+ .zg-filter-popup__row {
99
+ display: flex;
100
+ flex-direction: column;
101
+ gap: 4px;
102
+ margin-bottom: 8px;
103
+ }
104
+
105
+ .zg-filter-popup__conditions {
106
+ display: flex;
107
+ flex-direction: column;
108
+ gap: 8px;
109
+ margin-bottom: 8px;
110
+ }
111
+
112
+ .zg-filter-popup__condition {
113
+ padding: 6px;
114
+ border: 1px solid var(--zg-border-color);
115
+ border-radius: 4px;
116
+ background: var(--zg-bg-secondary, #f9f9f9);
117
+ }
118
+
119
+ .zg-filter-popup__condition-actions {
120
+ display: flex;
121
+ justify-content: flex-end;
122
+ }
123
+
124
+ .zg-filter-popup__select,
125
+ .zg-filter-popup__input {
126
+ width: 100%;
127
+ padding: 6px 8px;
128
+ border: 1px solid var(--zg-border-color);
129
+ border-radius: 4px;
130
+ background: var(--zg-bg-color);
131
+ color: var(--zg-text-color);
132
+ font-size: 13px;
133
+ box-sizing: border-box;
134
+ }
135
+
136
+ .zg-filter-popup__actions {
137
+ display: flex;
138
+ gap: 8px;
139
+ justify-content: flex-end;
140
+ }
141
+
142
+ .zg-filter-popup__btn {
143
+ padding: 6px 10px;
144
+ border: 1px solid var(--zg-border-color);
145
+ background: var(--zg-header-bg);
146
+ color: var(--zg-header-text);
147
+ border-radius: 4px;
148
+ cursor: pointer;
149
+ font-size: 12px;
150
+ }
151
+
152
+ .zg-filter-popup__btn--add {
153
+ width: 100%;
154
+ margin-bottom: 8px;
155
+ }
156
+
157
+ .zg-filter-popup__btn--remove {
158
+ padding: 4px 8px;
159
+ font-size: 11px;
160
+ }
161
+
162
+ .zg-filter-popup__btn.primary {
163
+ background: var(--zg-selected-border);
164
+ border-color: var(--zg-selected-border);
165
+ color: #fff;
166
+ }