zenkit-css 1.0.7 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,380 @@
1
+ // ========================================
2
+ // ZenKit - Skeleton Component
3
+ // ========================================
4
+
5
+ @use '../abstracts/variables' as *;
6
+
7
+ // ----------------------------------------
8
+ // Skeleton Base
9
+ // ----------------------------------------
10
+ .skeleton {
11
+ background: linear-gradient(
12
+ 90deg,
13
+ var(--gray-200) 25%,
14
+ var(--gray-100) 50%,
15
+ var(--gray-200) 75%
16
+ );
17
+ background-size: 200% 100%;
18
+ animation: skeleton-loading 1.5s ease-in-out infinite;
19
+ border-radius: $border-radius;
20
+ }
21
+
22
+ @keyframes skeleton-loading {
23
+ 0% {
24
+ background-position: 200% 0;
25
+ }
26
+ 100% {
27
+ background-position: -200% 0;
28
+ }
29
+ }
30
+
31
+ // ----------------------------------------
32
+ // Skeleton Shapes
33
+ // ----------------------------------------
34
+ .skeleton-text {
35
+ height: 1rem;
36
+ width: 100%;
37
+ margin-bottom: 0.5rem;
38
+
39
+ &:last-child {
40
+ width: 80%;
41
+ margin-bottom: 0;
42
+ }
43
+ }
44
+
45
+ .skeleton-title {
46
+ height: 1.5rem;
47
+ width: 60%;
48
+ margin-bottom: 1rem;
49
+ }
50
+
51
+ .skeleton-circle {
52
+ border-radius: 50%;
53
+ }
54
+
55
+ .skeleton-rect {
56
+ border-radius: $border-radius;
57
+ }
58
+
59
+ .skeleton-rounded {
60
+ border-radius: $border-radius-lg;
61
+ }
62
+
63
+ // ----------------------------------------
64
+ // Skeleton Sizes
65
+ // ----------------------------------------
66
+ .skeleton-xs {
67
+ height: 0.75rem;
68
+ }
69
+
70
+ .skeleton-sm {
71
+ height: 1rem;
72
+ }
73
+
74
+ .skeleton-md {
75
+ height: 1.5rem;
76
+ }
77
+
78
+ .skeleton-lg {
79
+ height: 2rem;
80
+ }
81
+
82
+ .skeleton-xl {
83
+ height: 3rem;
84
+ }
85
+
86
+ // Avatar sizes
87
+ .skeleton-avatar-sm {
88
+ width: 2rem;
89
+ height: 2rem;
90
+ }
91
+
92
+ .skeleton-avatar {
93
+ width: 2.5rem;
94
+ height: 2.5rem;
95
+ }
96
+
97
+ .skeleton-avatar-lg {
98
+ width: 3rem;
99
+ height: 3rem;
100
+ }
101
+
102
+ .skeleton-avatar-xl {
103
+ width: 4rem;
104
+ height: 4rem;
105
+ }
106
+
107
+ // ----------------------------------------
108
+ // Skeleton Card
109
+ // ----------------------------------------
110
+ .skeleton-card {
111
+ padding: 1rem;
112
+ border: 1px solid var(--border);
113
+ border-radius: $border-radius-lg;
114
+ }
115
+
116
+ .skeleton-card-image {
117
+ height: 200px;
118
+ margin-bottom: 1rem;
119
+ border-radius: $border-radius;
120
+ }
121
+
122
+ .skeleton-card-header {
123
+ display: flex;
124
+ align-items: center;
125
+ gap: 0.75rem;
126
+ margin-bottom: 1rem;
127
+ }
128
+
129
+ .skeleton-card-body {
130
+ display: flex;
131
+ flex-direction: column;
132
+ gap: 0.5rem;
133
+ }
134
+
135
+ // ----------------------------------------
136
+ // Skeleton Table
137
+ // ----------------------------------------
138
+ .skeleton-table {
139
+ width: 100%;
140
+
141
+ .skeleton-row {
142
+ display: flex;
143
+ gap: 1rem;
144
+ padding: 0.75rem 0;
145
+ border-bottom: 1px solid var(--border);
146
+
147
+ &:last-child {
148
+ border-bottom: none;
149
+ }
150
+ }
151
+
152
+ .skeleton-cell {
153
+ flex: 1;
154
+ height: 1rem;
155
+ }
156
+ }
157
+
158
+ .skeleton-table-header {
159
+ .skeleton-row {
160
+ border-bottom: 2px solid var(--border);
161
+ }
162
+
163
+ .skeleton-cell {
164
+ height: 1.25rem;
165
+ }
166
+ }
167
+
168
+ // ----------------------------------------
169
+ // Skeleton List
170
+ // ----------------------------------------
171
+ .skeleton-list {
172
+ display: flex;
173
+ flex-direction: column;
174
+ gap: 1rem;
175
+ }
176
+
177
+ .skeleton-list-item {
178
+ display: flex;
179
+ align-items: center;
180
+ gap: 0.75rem;
181
+ }
182
+
183
+ .skeleton-list-content {
184
+ flex: 1;
185
+ display: flex;
186
+ flex-direction: column;
187
+ gap: 0.375rem;
188
+ }
189
+
190
+ // ----------------------------------------
191
+ // Skeleton Paragraph
192
+ // ----------------------------------------
193
+ .skeleton-paragraph {
194
+ display: flex;
195
+ flex-direction: column;
196
+ gap: 0.5rem;
197
+
198
+ .skeleton-text:nth-child(1) { width: 100%; }
199
+ .skeleton-text:nth-child(2) { width: 95%; }
200
+ .skeleton-text:nth-child(3) { width: 90%; }
201
+ .skeleton-text:nth-child(4) { width: 85%; }
202
+ .skeleton-text:last-child { width: 60%; }
203
+ }
204
+
205
+ // ----------------------------------------
206
+ // Skeleton Button
207
+ // ----------------------------------------
208
+ .skeleton-button {
209
+ height: 2.5rem;
210
+ width: 6rem;
211
+ border-radius: $border-radius;
212
+ }
213
+
214
+ .skeleton-button-sm {
215
+ height: 2rem;
216
+ width: 5rem;
217
+ }
218
+
219
+ .skeleton-button-lg {
220
+ height: 3rem;
221
+ width: 8rem;
222
+ }
223
+
224
+ .skeleton-button-icon {
225
+ width: 2.5rem;
226
+ height: 2.5rem;
227
+ }
228
+
229
+ // ----------------------------------------
230
+ // Skeleton Input
231
+ // ----------------------------------------
232
+ .skeleton-input {
233
+ height: 2.5rem;
234
+ width: 100%;
235
+ border-radius: $border-radius;
236
+ }
237
+
238
+ .skeleton-input-sm {
239
+ height: 2rem;
240
+ }
241
+
242
+ .skeleton-input-lg {
243
+ height: 3rem;
244
+ }
245
+
246
+ // ----------------------------------------
247
+ // Skeleton Image
248
+ // ----------------------------------------
249
+ .skeleton-image {
250
+ width: 100%;
251
+ aspect-ratio: 16 / 9;
252
+ border-radius: $border-radius;
253
+ }
254
+
255
+ .skeleton-image-square {
256
+ aspect-ratio: 1 / 1;
257
+ }
258
+
259
+ .skeleton-image-portrait {
260
+ aspect-ratio: 3 / 4;
261
+ }
262
+
263
+ // ----------------------------------------
264
+ // Skeleton Variants
265
+ // ----------------------------------------
266
+
267
+ // Wave animation (default)
268
+ .skeleton-wave {
269
+ animation: skeleton-loading 1.5s ease-in-out infinite;
270
+ }
271
+
272
+ // Pulse animation
273
+ .skeleton-pulse {
274
+ animation: skeleton-pulse 1.5s ease-in-out infinite;
275
+ background: var(--gray-200);
276
+ }
277
+
278
+ @keyframes skeleton-pulse {
279
+ 0%, 100% {
280
+ opacity: 1;
281
+ }
282
+ 50% {
283
+ opacity: 0.4;
284
+ }
285
+ }
286
+
287
+ // No animation
288
+ .skeleton-static {
289
+ animation: none;
290
+ background: var(--gray-200);
291
+ }
292
+
293
+ // ----------------------------------------
294
+ // Skeleton with Content
295
+ // ----------------------------------------
296
+ .skeleton-wrapper {
297
+ position: relative;
298
+ }
299
+
300
+ .skeleton-content {
301
+ opacity: 0;
302
+ transition: opacity 0.3s ease;
303
+ }
304
+
305
+ .skeleton-wrapper.loaded {
306
+ .skeleton {
307
+ display: none;
308
+ }
309
+
310
+ .skeleton-content {
311
+ opacity: 1;
312
+ }
313
+ }
314
+
315
+ // ----------------------------------------
316
+ // Inline Skeleton
317
+ // ----------------------------------------
318
+ .skeleton-inline {
319
+ display: inline-block;
320
+ vertical-align: middle;
321
+ }
322
+
323
+ // ----------------------------------------
324
+ // Skeleton Grid
325
+ // ----------------------------------------
326
+ .skeleton-grid {
327
+ display: grid;
328
+ gap: 1rem;
329
+ }
330
+
331
+ .skeleton-grid-2 {
332
+ grid-template-columns: repeat(2, 1fr);
333
+ }
334
+
335
+ .skeleton-grid-3 {
336
+ grid-template-columns: repeat(3, 1fr);
337
+ }
338
+
339
+ .skeleton-grid-4 {
340
+ grid-template-columns: repeat(4, 1fr);
341
+ }
342
+
343
+ @media (max-width: 767px) {
344
+ .skeleton-grid-2,
345
+ .skeleton-grid-3,
346
+ .skeleton-grid-4 {
347
+ grid-template-columns: 1fr;
348
+ }
349
+ }
350
+
351
+ // ----------------------------------------
352
+ // Dark Mode
353
+ // ----------------------------------------
354
+ [data-theme="dark"] {
355
+ .skeleton {
356
+ background: linear-gradient(
357
+ 90deg,
358
+ var(--gray-700) 25%,
359
+ var(--gray-600) 50%,
360
+ var(--gray-700) 75%
361
+ );
362
+ background-size: 200% 100%;
363
+ }
364
+
365
+ .skeleton-pulse {
366
+ background: var(--gray-700);
367
+ }
368
+
369
+ .skeleton-static {
370
+ background: var(--gray-700);
371
+ }
372
+
373
+ .skeleton-card {
374
+ border-color: var(--gray-700);
375
+ }
376
+
377
+ .skeleton-table .skeleton-row {
378
+ border-color: var(--gray-700);
379
+ }
380
+ }