@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
@@ -1,342 +1,346 @@
1
- /**
2
- * Loading Indicator Styles
3
- *
4
- * Provides styles for 4 loading templates with animations:
5
- * 1. Simple - Basic text
6
- * 2. Animated - Rotating dots
7
- * 3. Modern - Circular loader
8
- * 4. Skeleton - Shimmer screen
9
- */
10
-
11
- /* ========================================
12
- Base Loading Styles
13
- ======================================== */
14
-
15
- .zg-loading {
16
- position: absolute;
17
- top: 0;
18
- left: 0;
19
- width: 100%;
20
- height: 100%;
21
- z-index: 1000;
22
- font-family: var(--zg-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif);
23
- font-size: var(--zg-font-size, 14px);
24
- color: var(--zg-text-primary, #333);
25
- user-select: none;
26
- pointer-events: all;
27
- opacity: 0;
28
- transition: opacity 0.2s ease-in-out;
29
- display: flex;
30
- align-items: center;
31
- justify-content: center;
32
- }
33
-
34
- .zg-loading-active {
35
- opacity: 1;
36
- }
37
-
38
- .zg-loading-hiding {
39
- opacity: 0;
40
- }
41
-
42
- /* Add backdrop to non-skeleton templates */
43
- .zg-loading:not(.zg-loading-skeleton)::before {
44
- content: '';
45
- position: absolute;
46
- top: 0;
47
- left: 0;
48
- right: 0;
49
- bottom: 0;
50
- background: var(--zg-bg-primary, rgba(255, 255, 255, 0.85));
51
- opacity: 0.85;
52
- backdrop-filter: blur(3px);
53
- z-index: -1;
54
- }
55
-
56
- /* Position variants */
57
- .zg-loading-top {
58
- align-items: flex-start;
59
- padding-top: 20px;
60
- }
61
-
62
- .zg-loading-center {
63
- align-items: center;
64
- }
65
-
66
- .zg-loading-bottom {
67
- align-items: flex-end;
68
- padding-bottom: 20px;
69
- }
70
-
71
- .zg-loading-message {
72
- margin-top: 12px;
73
- text-align: center;
74
- font-size: 14px;
75
- color: var(--zg-text-secondary, #666);
76
- }
77
-
78
- /* ========================================
79
- Template 1: Simple
80
- ======================================== */
81
-
82
- .zg-loading-simple {
83
- display: flex;
84
- flex-direction: column;
85
- align-items: center;
86
- padding: 20px 32px;
87
- background: var(--zg-bg-primary, rgba(255, 255, 255, 0.95));
88
- border-radius: 8px;
89
- box-shadow: var(--zg-shadow-lg, 0 4px 16px rgba(0, 0, 0, 0.15));
90
- backdrop-filter: blur(4px);
91
- }
92
-
93
- .zg-loading-simple .zg-loading-message {
94
- margin: 0;
95
- font-size: 14px;
96
- font-weight: 500;
97
- }
98
-
99
- /* ========================================
100
- Template 2: Animated - Rotating Dots
101
- ======================================== */
102
-
103
- .zg-loading-animated {
104
- display: flex;
105
- flex-direction: column;
106
- align-items: center;
107
- padding: 24px 32px;
108
- background: var(--zg-bg-primary, rgba(255, 255, 255, 0.95));
109
- border-radius: 8px;
110
- box-shadow: var(--zg-shadow-lg, 0 4px 16px rgba(0, 0, 0, 0.15));
111
- backdrop-filter: blur(4px);
112
- }
113
-
114
- .zg-loading-spinner {
115
- display: flex;
116
- gap: 8px;
117
- align-items: center;
118
- justify-content: center;
119
- }
120
-
121
- .zg-loading-dot {
122
- width: 12px;
123
- height: 12px;
124
- background: var(--zg-border-active, #2196f3);
125
- border-radius: 50%;
126
- animation: zg-dot-bounce 1.4s infinite ease-in-out both;
127
- }
128
-
129
- .zg-loading-dot:nth-child(1) {
130
- animation-delay: -0.32s;
131
- }
132
-
133
- .zg-loading-dot:nth-child(2) {
134
- animation-delay: -0.16s;
135
- }
136
-
137
- .zg-loading-dot:nth-child(3) {
138
- animation-delay: 0s;
139
- }
140
-
141
- @keyframes zg-dot-bounce {
142
- 0%, 80%, 100% {
143
- transform: scale(0.6);
144
- opacity: 0.5;
145
- }
146
- 40% {
147
- transform: scale(1);
148
- opacity: 1;
149
- }
150
- }
151
-
152
- /* ========================================
153
- Template 3: Modern - Circular Loader
154
- ======================================== */
155
-
156
- .zg-loading-modern {
157
- display: flex;
158
- flex-direction: column;
159
- align-items: center;
160
- padding: 24px 32px;
161
- background: var(--zg-bg-primary, rgba(255, 255, 255, 0.95));
162
- border-radius: 8px;
163
- box-shadow: var(--zg-shadow-lg, 0 4px 16px rgba(0, 0, 0, 0.15));
164
- backdrop-filter: blur(4px);
165
- }
166
-
167
- .zg-loading-spinner-circle {
168
- width: 48px;
169
- height: 48px;
170
- }
171
-
172
- .zg-loading-svg {
173
- width: 100%;
174
- height: 100%;
175
- animation: zg-rotate 2s linear infinite;
176
- }
177
-
178
- .zg-loading-circle-path {
179
- stroke: var(--zg-border-active, #2196f3);
180
- stroke-width: 3;
181
- stroke-linecap: round;
182
- stroke-dasharray: 90, 150;
183
- stroke-dashoffset: 0;
184
- animation: zg-dash 1.5s ease-in-out infinite;
185
- }
186
-
187
- @keyframes zg-rotate {
188
- 100% {
189
- transform: rotate(360deg);
190
- }
191
- }
192
-
193
- @keyframes zg-dash {
194
- 0% {
195
- stroke-dasharray: 1, 150;
196
- stroke-dashoffset: 0;
197
- }
198
- 50% {
199
- stroke-dasharray: 90, 150;
200
- stroke-dashoffset: -35;
201
- }
202
- 100% {
203
- stroke-dasharray: 90, 150;
204
- stroke-dashoffset: -124;
205
- }
206
- }
207
-
208
- /* ========================================
209
- Template 4: Skeleton - Shimmer Screen
210
- ======================================== */
211
-
212
- .zg-loading-skeleton {
213
- width: 100%;
214
- height: 100%;
215
- display: flex;
216
- flex-direction: column;
217
- align-items: center;
218
- justify-content: center;
219
- background: var(--zg-bg-secondary, rgba(248, 248, 248, 0.98));
220
- padding: 0;
221
- box-shadow: none;
222
- }
223
-
224
- .zg-loading-skeleton-grid {
225
- width: 100%;
226
- height: 100%;
227
- display: flex;
228
- flex-direction: column;
229
- overflow: hidden;
230
- }
231
-
232
- .zg-loading-skeleton-row {
233
- display: flex;
234
- height: 32px;
235
- border-bottom: 1px solid var(--zg-border-color, #e0e0e0);
236
- }
237
-
238
- .zg-loading-skeleton-cell {
239
- flex: 1;
240
- min-width: 100px;
241
- background: var(--zg-bg-secondary, #f5f5f5);
242
- border-right: 1px solid var(--zg-border-color, #e0e0e0);
243
- overflow: hidden;
244
- position: relative;
245
- padding: 8px;
246
- }
247
-
248
- .zg-loading-skeleton-cell::before {
249
- content: '';
250
- display: block;
251
- height: 12px;
252
- background: var(--zg-border-color, #e0e0e0);
253
- border-radius: 2px;
254
- width: 80%;
255
- }
256
-
257
- .zg-loading-skeleton-shimmer {
258
- position: absolute;
259
- top: 0;
260
- left: -100%;
261
- width: 100%;
262
- height: 100%;
263
- background: linear-gradient(
264
- 90deg,
265
- transparent 0%,
266
- rgba(255, 255, 255, 0.8) 50%,
267
- transparent 100%
268
- );
269
- animation: zg-shimmer 1.5s infinite;
270
- }
271
-
272
- @keyframes zg-shimmer {
273
- 0% {
274
- left: -100%;
275
- }
276
- 100% {
277
- left: 100%;
278
- }
279
- }
280
-
281
- /* ========================================
282
- Responsive Design
283
- ======================================== */
284
-
285
- @media (max-width: 768px) {
286
- .zg-loading-animated,
287
- .zg-loading-modern,
288
- .zg-loading-simple {
289
- padding: 16px;
290
- }
291
-
292
- .zg-loading-message {
293
- font-size: 13px;
294
- }
295
-
296
- .zg-loading-skeleton-grid {
297
- padding: 12px;
298
- }
299
-
300
- .zg-loading-skeleton-row {
301
- gap: 8px;
302
- }
303
-
304
- .zg-loading-skeleton-cell {
305
- height: 32px;
306
- }
307
- }
308
-
309
- /* ========================================
310
- Accessibility
311
- ======================================== */
312
-
313
- /* Screen reader only text */
314
- .zg-loading[aria-live="polite"]::before {
315
- content: attr(aria-label);
316
- position: absolute;
317
- width: 1px;
318
- height: 1px;
319
- padding: 0;
320
- margin: -1px;
321
- overflow: hidden;
322
- clip: rect(0, 0, 0, 0);
323
- white-space: nowrap;
324
- border-width: 0;
325
- }
326
-
327
- /* Reduced motion support */
328
- @media (prefers-reduced-motion: reduce) {
329
- .zg-loading,
330
- .zg-loading-dot,
331
- .zg-loading-svg,
332
- .zg-loading-circle-path,
333
- .zg-loading-skeleton-shimmer,
334
- .zg-loading-progress-fill {
335
- animation: none !important;
336
- transition: none !important;
337
- }
338
-
339
- .zg-loading-spinner-circle {
340
- opacity: 0.7;
341
- }
342
- }
1
+ /**
2
+ * Loading Indicator Styles
3
+ *
4
+ * Provides styles for 4 loading templates with animations:
5
+ * 1. Simple - Basic text
6
+ * 2. Animated - Rotating dots
7
+ * 3. Modern - Circular loader
8
+ * 4. Skeleton - Shimmer screen
9
+ */
10
+
11
+ /* ========================================
12
+ Base Loading Styles
13
+ ======================================== */
14
+
15
+ .zg-loading {
16
+ position: absolute;
17
+ top: 0;
18
+ left: 0;
19
+ width: 100%;
20
+ height: 100%;
21
+ /* Reset the small-box centering transform from the core overlays.css rule:
22
+ this stylesheet makes .zg-loading a full-size overlay, so the
23
+ translate(-50%, -50%) would otherwise shove it off the top-left. */
24
+ transform: none;
25
+ z-index: 1000;
26
+ font-family: var(--zg-font-family, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, sans-serif);
27
+ font-size: var(--zg-font-size, 14px);
28
+ color: var(--zg-text-primary, #333);
29
+ user-select: none;
30
+ pointer-events: all;
31
+ opacity: 0;
32
+ transition: opacity 0.2s ease-in-out;
33
+ display: flex;
34
+ align-items: center;
35
+ justify-content: center;
36
+ }
37
+
38
+ .zg-loading-active {
39
+ opacity: 1;
40
+ }
41
+
42
+ .zg-loading-hiding {
43
+ opacity: 0;
44
+ }
45
+
46
+ /* Add backdrop to non-skeleton templates */
47
+ .zg-loading:not(.zg-loading-skeleton)::before {
48
+ content: '';
49
+ position: absolute;
50
+ top: 0;
51
+ left: 0;
52
+ right: 0;
53
+ bottom: 0;
54
+ background: var(--zg-bg-primary, rgba(255, 255, 255, 0.85));
55
+ opacity: 0.85;
56
+ backdrop-filter: blur(3px);
57
+ z-index: -1;
58
+ }
59
+
60
+ /* Position variants */
61
+ .zg-loading-top {
62
+ align-items: flex-start;
63
+ padding-top: 20px;
64
+ }
65
+
66
+ .zg-loading-center {
67
+ align-items: center;
68
+ }
69
+
70
+ .zg-loading-bottom {
71
+ align-items: flex-end;
72
+ padding-bottom: 20px;
73
+ }
74
+
75
+ .zg-loading-message {
76
+ margin-top: 12px;
77
+ text-align: center;
78
+ font-size: 14px;
79
+ color: var(--zg-text-secondary, #666);
80
+ }
81
+
82
+ /* ========================================
83
+ Template 1: Simple
84
+ ======================================== */
85
+
86
+ .zg-loading-simple {
87
+ display: flex;
88
+ flex-direction: column;
89
+ align-items: center;
90
+ padding: 20px 32px;
91
+ background: var(--zg-bg-primary, rgba(255, 255, 255, 0.95));
92
+ border-radius: 8px;
93
+ box-shadow: var(--zg-shadow-lg, 0 4px 16px rgba(0, 0, 0, 0.15));
94
+ backdrop-filter: blur(4px);
95
+ }
96
+
97
+ .zg-loading-simple .zg-loading-message {
98
+ margin: 0;
99
+ font-size: 14px;
100
+ font-weight: 500;
101
+ }
102
+
103
+ /* ========================================
104
+ Template 2: Animated - Rotating Dots
105
+ ======================================== */
106
+
107
+ .zg-loading-animated {
108
+ display: flex;
109
+ flex-direction: column;
110
+ align-items: center;
111
+ padding: 24px 32px;
112
+ background: var(--zg-bg-primary, rgba(255, 255, 255, 0.95));
113
+ border-radius: 8px;
114
+ box-shadow: var(--zg-shadow-lg, 0 4px 16px rgba(0, 0, 0, 0.15));
115
+ backdrop-filter: blur(4px);
116
+ }
117
+
118
+ .zg-loading-spinner {
119
+ display: flex;
120
+ gap: 8px;
121
+ align-items: center;
122
+ justify-content: center;
123
+ }
124
+
125
+ .zg-loading-dot {
126
+ width: 12px;
127
+ height: 12px;
128
+ background: var(--zg-border-active, #2196f3);
129
+ border-radius: 50%;
130
+ animation: zg-dot-bounce 1.4s infinite ease-in-out both;
131
+ }
132
+
133
+ .zg-loading-dot:nth-child(1) {
134
+ animation-delay: -0.32s;
135
+ }
136
+
137
+ .zg-loading-dot:nth-child(2) {
138
+ animation-delay: -0.16s;
139
+ }
140
+
141
+ .zg-loading-dot:nth-child(3) {
142
+ animation-delay: 0s;
143
+ }
144
+
145
+ @keyframes zg-dot-bounce {
146
+ 0%, 80%, 100% {
147
+ transform: scale(0.6);
148
+ opacity: 0.5;
149
+ }
150
+ 40% {
151
+ transform: scale(1);
152
+ opacity: 1;
153
+ }
154
+ }
155
+
156
+ /* ========================================
157
+ Template 3: Modern - Circular Loader
158
+ ======================================== */
159
+
160
+ .zg-loading-modern {
161
+ display: flex;
162
+ flex-direction: column;
163
+ align-items: center;
164
+ padding: 24px 32px;
165
+ background: var(--zg-bg-primary, rgba(255, 255, 255, 0.95));
166
+ border-radius: 8px;
167
+ box-shadow: var(--zg-shadow-lg, 0 4px 16px rgba(0, 0, 0, 0.15));
168
+ backdrop-filter: blur(4px);
169
+ }
170
+
171
+ .zg-loading-spinner-circle {
172
+ width: 48px;
173
+ height: 48px;
174
+ }
175
+
176
+ .zg-loading-svg {
177
+ width: 100%;
178
+ height: 100%;
179
+ animation: zg-rotate 2s linear infinite;
180
+ }
181
+
182
+ .zg-loading-circle-path {
183
+ stroke: var(--zg-border-active, #2196f3);
184
+ stroke-width: 3;
185
+ stroke-linecap: round;
186
+ stroke-dasharray: 90, 150;
187
+ stroke-dashoffset: 0;
188
+ animation: zg-dash 1.5s ease-in-out infinite;
189
+ }
190
+
191
+ @keyframes zg-rotate {
192
+ 100% {
193
+ transform: rotate(360deg);
194
+ }
195
+ }
196
+
197
+ @keyframes zg-dash {
198
+ 0% {
199
+ stroke-dasharray: 1, 150;
200
+ stroke-dashoffset: 0;
201
+ }
202
+ 50% {
203
+ stroke-dasharray: 90, 150;
204
+ stroke-dashoffset: -35;
205
+ }
206
+ 100% {
207
+ stroke-dasharray: 90, 150;
208
+ stroke-dashoffset: -124;
209
+ }
210
+ }
211
+
212
+ /* ========================================
213
+ Template 4: Skeleton - Shimmer Screen
214
+ ======================================== */
215
+
216
+ .zg-loading-skeleton {
217
+ width: 100%;
218
+ height: 100%;
219
+ display: flex;
220
+ flex-direction: column;
221
+ align-items: center;
222
+ justify-content: center;
223
+ background: var(--zg-bg-secondary, rgba(248, 248, 248, 0.98));
224
+ padding: 0;
225
+ box-shadow: none;
226
+ }
227
+
228
+ .zg-loading-skeleton-grid {
229
+ width: 100%;
230
+ height: 100%;
231
+ display: flex;
232
+ flex-direction: column;
233
+ overflow: hidden;
234
+ }
235
+
236
+ .zg-loading-skeleton-row {
237
+ display: flex;
238
+ height: 32px;
239
+ border-bottom: 1px solid var(--zg-border-color, #e0e0e0);
240
+ }
241
+
242
+ .zg-loading-skeleton-cell {
243
+ flex: 1;
244
+ min-width: 100px;
245
+ background: var(--zg-bg-secondary, #f5f5f5);
246
+ border-right: 1px solid var(--zg-border-color, #e0e0e0);
247
+ overflow: hidden;
248
+ position: relative;
249
+ padding: 8px;
250
+ }
251
+
252
+ .zg-loading-skeleton-cell::before {
253
+ content: '';
254
+ display: block;
255
+ height: 12px;
256
+ background: var(--zg-border-color, #e0e0e0);
257
+ border-radius: 2px;
258
+ width: 80%;
259
+ }
260
+
261
+ .zg-loading-skeleton-shimmer {
262
+ position: absolute;
263
+ top: 0;
264
+ left: -100%;
265
+ width: 100%;
266
+ height: 100%;
267
+ background: linear-gradient(
268
+ 90deg,
269
+ transparent 0%,
270
+ rgba(255, 255, 255, 0.8) 50%,
271
+ transparent 100%
272
+ );
273
+ animation: zg-shimmer 1.5s infinite;
274
+ }
275
+
276
+ @keyframes zg-shimmer {
277
+ 0% {
278
+ left: -100%;
279
+ }
280
+ 100% {
281
+ left: 100%;
282
+ }
283
+ }
284
+
285
+ /* ========================================
286
+ Responsive Design
287
+ ======================================== */
288
+
289
+ @media (max-width: 768px) {
290
+ .zg-loading-animated,
291
+ .zg-loading-modern,
292
+ .zg-loading-simple {
293
+ padding: 16px;
294
+ }
295
+
296
+ .zg-loading-message {
297
+ font-size: 13px;
298
+ }
299
+
300
+ .zg-loading-skeleton-grid {
301
+ padding: 12px;
302
+ }
303
+
304
+ .zg-loading-skeleton-row {
305
+ gap: 8px;
306
+ }
307
+
308
+ .zg-loading-skeleton-cell {
309
+ height: 32px;
310
+ }
311
+ }
312
+
313
+ /* ========================================
314
+ Accessibility
315
+ ======================================== */
316
+
317
+ /* Screen reader only text */
318
+ .zg-loading[aria-live="polite"]::before {
319
+ content: attr(aria-label);
320
+ position: absolute;
321
+ width: 1px;
322
+ height: 1px;
323
+ padding: 0;
324
+ margin: -1px;
325
+ overflow: hidden;
326
+ clip: rect(0, 0, 0, 0);
327
+ white-space: nowrap;
328
+ border-width: 0;
329
+ }
330
+
331
+ /* Reduced motion support */
332
+ @media (prefers-reduced-motion: reduce) {
333
+ .zg-loading,
334
+ .zg-loading-dot,
335
+ .zg-loading-svg,
336
+ .zg-loading-circle-path,
337
+ .zg-loading-skeleton-shimmer,
338
+ .zg-loading-progress-fill {
339
+ animation: none !important;
340
+ transition: none !important;
341
+ }
342
+
343
+ .zg-loading-spinner-circle {
344
+ opacity: 0.7;
345
+ }
346
+ }