zenkit-css 1.0.8 → 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,406 @@
1
+ // ========================================
2
+ // ZenKit - Hover Card Component
3
+ // ========================================
4
+
5
+ @use '../abstracts/variables' as *;
6
+
7
+ // ----------------------------------------
8
+ // Hover Card Trigger
9
+ // ----------------------------------------
10
+ .hover-card-trigger {
11
+ display: inline-block;
12
+ cursor: pointer;
13
+ }
14
+
15
+ // ----------------------------------------
16
+ // Hover Card Container
17
+ // ----------------------------------------
18
+ .hover-card {
19
+ position: relative;
20
+ display: inline-block;
21
+ }
22
+
23
+ // ----------------------------------------
24
+ // Hover Card Content
25
+ // ----------------------------------------
26
+ .hover-card-content {
27
+ position: absolute;
28
+ z-index: 1000;
29
+ width: 320px;
30
+ padding: 1rem;
31
+ background-color: var(--bg);
32
+ border: 1px solid var(--border);
33
+ border-radius: $border-radius-lg;
34
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.15);
35
+ opacity: 0;
36
+ visibility: hidden;
37
+ transform: translateY(5px);
38
+ transition: opacity $transition-base $transition-timing,
39
+ visibility $transition-base $transition-timing,
40
+ transform $transition-base $transition-timing;
41
+ pointer-events: none;
42
+ }
43
+
44
+ .hover-card:hover .hover-card-content,
45
+ .hover-card-content:hover,
46
+ .hover-card.open .hover-card-content {
47
+ opacity: 1;
48
+ visibility: visible;
49
+ transform: translateY(0);
50
+ pointer-events: auto;
51
+ }
52
+
53
+ // ----------------------------------------
54
+ // Hover Card Positions
55
+ // ----------------------------------------
56
+
57
+ // Top (default)
58
+ .hover-card-top .hover-card-content {
59
+ bottom: calc(100% + 8px);
60
+ left: 50%;
61
+ transform: translateX(-50%) translateY(-5px);
62
+ }
63
+
64
+ .hover-card-top:hover .hover-card-content,
65
+ .hover-card-top.open .hover-card-content {
66
+ transform: translateX(-50%) translateY(0);
67
+ }
68
+
69
+ // Bottom
70
+ .hover-card-bottom .hover-card-content {
71
+ top: calc(100% + 8px);
72
+ left: 50%;
73
+ transform: translateX(-50%) translateY(5px);
74
+ }
75
+
76
+ .hover-card-bottom:hover .hover-card-content,
77
+ .hover-card-bottom.open .hover-card-content {
78
+ transform: translateX(-50%) translateY(0);
79
+ }
80
+
81
+ // Left
82
+ .hover-card-left .hover-card-content {
83
+ right: calc(100% + 8px);
84
+ top: 50%;
85
+ transform: translateY(-50%) translateX(-5px);
86
+ }
87
+
88
+ .hover-card-left:hover .hover-card-content,
89
+ .hover-card-left.open .hover-card-content {
90
+ transform: translateY(-50%) translateX(0);
91
+ }
92
+
93
+ // Right
94
+ .hover-card-right .hover-card-content {
95
+ left: calc(100% + 8px);
96
+ top: 50%;
97
+ transform: translateY(-50%) translateX(5px);
98
+ }
99
+
100
+ .hover-card-right:hover .hover-card-content,
101
+ .hover-card-right.open .hover-card-content {
102
+ transform: translateY(-50%) translateX(0);
103
+ }
104
+
105
+ // ----------------------------------------
106
+ // Hover Card Arrow
107
+ // ----------------------------------------
108
+ .hover-card-arrow {
109
+ position: absolute;
110
+ width: 12px;
111
+ height: 12px;
112
+ background-color: var(--bg);
113
+ border: 1px solid var(--border);
114
+ border-right: none;
115
+ border-bottom: none;
116
+ }
117
+
118
+ .hover-card-top .hover-card-arrow {
119
+ bottom: -7px;
120
+ left: 50%;
121
+ transform: translateX(-50%) rotate(-135deg);
122
+ }
123
+
124
+ .hover-card-bottom .hover-card-arrow {
125
+ top: -7px;
126
+ left: 50%;
127
+ transform: translateX(-50%) rotate(45deg);
128
+ }
129
+
130
+ .hover-card-left .hover-card-arrow {
131
+ right: -7px;
132
+ top: 50%;
133
+ transform: translateY(-50%) rotate(135deg);
134
+ }
135
+
136
+ .hover-card-right .hover-card-arrow {
137
+ left: -7px;
138
+ top: 50%;
139
+ transform: translateY(-50%) rotate(-45deg);
140
+ }
141
+
142
+ // ----------------------------------------
143
+ // Hover Card Sizes
144
+ // ----------------------------------------
145
+ .hover-card-sm .hover-card-content {
146
+ width: 240px;
147
+ padding: 0.75rem;
148
+ }
149
+
150
+ .hover-card-lg .hover-card-content {
151
+ width: 400px;
152
+ padding: 1.25rem;
153
+ }
154
+
155
+ .hover-card-xl .hover-card-content {
156
+ width: 480px;
157
+ padding: 1.5rem;
158
+ }
159
+
160
+ .hover-card-auto .hover-card-content {
161
+ width: auto;
162
+ min-width: 200px;
163
+ max-width: 400px;
164
+ }
165
+
166
+ // ----------------------------------------
167
+ // Hover Card Header
168
+ // ----------------------------------------
169
+ .hover-card-header {
170
+ display: flex;
171
+ align-items: flex-start;
172
+ gap: 0.75rem;
173
+ margin-bottom: 0.75rem;
174
+ }
175
+
176
+ .hover-card-avatar {
177
+ flex-shrink: 0;
178
+ width: 3rem;
179
+ height: 3rem;
180
+ border-radius: 50%;
181
+ object-fit: cover;
182
+ }
183
+
184
+ .hover-card-avatar-lg {
185
+ width: 4rem;
186
+ height: 4rem;
187
+ }
188
+
189
+ .hover-card-info {
190
+ flex: 1;
191
+ min-width: 0;
192
+ }
193
+
194
+ .hover-card-title {
195
+ font-size: var(--text-base);
196
+ font-weight: $font-weight-semibold;
197
+ color: var(--text);
198
+ margin-bottom: 0.125rem;
199
+ }
200
+
201
+ .hover-card-subtitle {
202
+ font-size: var(--text-sm);
203
+ color: var(--text-muted);
204
+ }
205
+
206
+ // ----------------------------------------
207
+ // Hover Card Body
208
+ // ----------------------------------------
209
+ .hover-card-body {
210
+ font-size: var(--text-sm);
211
+ color: var(--text);
212
+ line-height: 1.5;
213
+ }
214
+
215
+ .hover-card-description {
216
+ color: var(--text-muted);
217
+ margin-bottom: 0.75rem;
218
+ }
219
+
220
+ // ----------------------------------------
221
+ // Hover Card Footer
222
+ // ----------------------------------------
223
+ .hover-card-footer {
224
+ display: flex;
225
+ align-items: center;
226
+ gap: 0.75rem;
227
+ margin-top: 0.75rem;
228
+ padding-top: 0.75rem;
229
+ border-top: 1px solid var(--border);
230
+ }
231
+
232
+ .hover-card-stats {
233
+ display: flex;
234
+ gap: 1rem;
235
+ }
236
+
237
+ .hover-card-stat {
238
+ text-align: center;
239
+ }
240
+
241
+ .hover-card-stat-value {
242
+ font-size: var(--text-base);
243
+ font-weight: $font-weight-semibold;
244
+ color: var(--text);
245
+ }
246
+
247
+ .hover-card-stat-label {
248
+ font-size: var(--text-xs);
249
+ color: var(--text-muted);
250
+ }
251
+
252
+ // ----------------------------------------
253
+ // Hover Card Actions
254
+ // ----------------------------------------
255
+ .hover-card-actions {
256
+ display: flex;
257
+ gap: 0.5rem;
258
+ margin-top: 0.75rem;
259
+ }
260
+
261
+ .hover-card-btn {
262
+ flex: 1;
263
+ padding: 0.5rem 0.75rem;
264
+ font-size: var(--text-sm);
265
+ font-weight: $font-weight-medium;
266
+ text-align: center;
267
+ border-radius: $border-radius;
268
+ cursor: pointer;
269
+ transition: all $transition-fast $transition-timing;
270
+ }
271
+
272
+ .hover-card-btn-primary {
273
+ background-color: var(--primary);
274
+ color: var(--white);
275
+ border: none;
276
+
277
+ &:hover {
278
+ background-color: var(--primary-600);
279
+ }
280
+ }
281
+
282
+ .hover-card-btn-secondary {
283
+ background-color: transparent;
284
+ color: var(--text);
285
+ border: 1px solid var(--border);
286
+
287
+ &:hover {
288
+ background-color: var(--gray-100);
289
+ }
290
+ }
291
+
292
+ // ----------------------------------------
293
+ // Hover Card Meta
294
+ // ----------------------------------------
295
+ .hover-card-meta {
296
+ display: flex;
297
+ flex-wrap: wrap;
298
+ gap: 0.75rem;
299
+ margin-top: 0.5rem;
300
+ font-size: var(--text-xs);
301
+ color: var(--text-muted);
302
+ }
303
+
304
+ .hover-card-meta-item {
305
+ display: flex;
306
+ align-items: center;
307
+ gap: 0.25rem;
308
+
309
+ svg {
310
+ width: 0.875rem;
311
+ height: 0.875rem;
312
+ }
313
+ }
314
+
315
+ // ----------------------------------------
316
+ // Hover Card Image
317
+ // ----------------------------------------
318
+ .hover-card-image {
319
+ margin: -1rem -1rem 1rem;
320
+ border-radius: $border-radius-lg $border-radius-lg 0 0;
321
+ overflow: hidden;
322
+
323
+ img {
324
+ width: 100%;
325
+ height: 120px;
326
+ object-fit: cover;
327
+ }
328
+ }
329
+
330
+ // ----------------------------------------
331
+ // Hover Card Tags
332
+ // ----------------------------------------
333
+ .hover-card-tags {
334
+ display: flex;
335
+ flex-wrap: wrap;
336
+ gap: 0.375rem;
337
+ margin-top: 0.5rem;
338
+ }
339
+
340
+ .hover-card-tag {
341
+ padding: 0.125rem 0.5rem;
342
+ font-size: var(--text-xs);
343
+ background-color: var(--gray-100);
344
+ border-radius: 999px;
345
+ color: var(--text-muted);
346
+ }
347
+
348
+ // ----------------------------------------
349
+ // Hover Card Delay
350
+ // ----------------------------------------
351
+ .hover-card-delay-100 {
352
+ &:hover .hover-card-content {
353
+ transition-delay: 100ms;
354
+ }
355
+ }
356
+
357
+ .hover-card-delay-200 {
358
+ &:hover .hover-card-content {
359
+ transition-delay: 200ms;
360
+ }
361
+ }
362
+
363
+ .hover-card-delay-300 {
364
+ &:hover .hover-card-content {
365
+ transition-delay: 300ms;
366
+ }
367
+ }
368
+
369
+ .hover-card-delay-500 {
370
+ &:hover .hover-card-content {
371
+ transition-delay: 500ms;
372
+ }
373
+ }
374
+
375
+ // ----------------------------------------
376
+ // Dark Mode
377
+ // ----------------------------------------
378
+ [data-theme="dark"] {
379
+ .hover-card-content {
380
+ background-color: var(--gray-900);
381
+ border-color: var(--gray-700);
382
+ box-shadow: 0 10px 40px rgba(0, 0, 0, 0.4);
383
+ }
384
+
385
+ .hover-card-arrow {
386
+ background-color: var(--gray-900);
387
+ border-color: var(--gray-700);
388
+ }
389
+
390
+ .hover-card-footer {
391
+ border-color: var(--gray-700);
392
+ }
393
+
394
+ .hover-card-btn-secondary {
395
+ border-color: var(--gray-600);
396
+
397
+ &:hover {
398
+ background-color: var(--gray-800);
399
+ }
400
+ }
401
+
402
+ .hover-card-tag {
403
+ background-color: var(--gray-800);
404
+ color: var(--gray-400);
405
+ }
406
+ }
@@ -0,0 +1,338 @@
1
+ // ========================================
2
+ // ZenKit - Icon Component
3
+ // ========================================
4
+
5
+ @use '../abstracts/variables' as *;
6
+
7
+ // ----------------------------------------
8
+ // Icon Base
9
+ // ----------------------------------------
10
+ .icon {
11
+ display: inline-flex;
12
+ align-items: center;
13
+ justify-content: center;
14
+ flex-shrink: 0;
15
+ width: 1em;
16
+ height: 1em;
17
+ font-size: 1.25rem;
18
+ line-height: 1;
19
+ color: currentColor;
20
+ fill: currentColor;
21
+ vertical-align: middle;
22
+
23
+ svg {
24
+ width: 100%;
25
+ height: 100%;
26
+ fill: currentColor;
27
+ }
28
+ }
29
+
30
+ // ----------------------------------------
31
+ // Icon Sizes
32
+ // ----------------------------------------
33
+ .icon-xs {
34
+ font-size: 0.75rem;
35
+ }
36
+
37
+ .icon-sm {
38
+ font-size: 1rem;
39
+ }
40
+
41
+ .icon-md {
42
+ font-size: 1.25rem;
43
+ }
44
+
45
+ .icon-lg {
46
+ font-size: 1.5rem;
47
+ }
48
+
49
+ .icon-xl {
50
+ font-size: 2rem;
51
+ }
52
+
53
+ .icon-2xl {
54
+ font-size: 2.5rem;
55
+ }
56
+
57
+ .icon-3xl {
58
+ font-size: 3rem;
59
+ }
60
+
61
+ // Custom size via CSS variable
62
+ .icon-custom {
63
+ font-size: var(--icon-size, 1.25rem);
64
+ }
65
+
66
+ // ----------------------------------------
67
+ // Icon Colors
68
+ // ----------------------------------------
69
+ .icon-primary {
70
+ color: var(--primary);
71
+ }
72
+
73
+ .icon-secondary {
74
+ color: var(--gray-600);
75
+ }
76
+
77
+ .icon-success {
78
+ color: var(--success);
79
+ }
80
+
81
+ .icon-danger {
82
+ color: var(--danger);
83
+ }
84
+
85
+ .icon-warning {
86
+ color: var(--warning);
87
+ }
88
+
89
+ .icon-info {
90
+ color: var(--info);
91
+ }
92
+
93
+ .icon-muted {
94
+ color: var(--text-muted);
95
+ }
96
+
97
+ .icon-white {
98
+ color: var(--white);
99
+ }
100
+
101
+ .icon-black {
102
+ color: var(--black);
103
+ }
104
+
105
+ // ----------------------------------------
106
+ // Icon Animations
107
+ // ----------------------------------------
108
+ .icon-spin {
109
+ animation: icon-spin 1s linear infinite;
110
+ }
111
+
112
+ @keyframes icon-spin {
113
+ from {
114
+ transform: rotate(0deg);
115
+ }
116
+ to {
117
+ transform: rotate(360deg);
118
+ }
119
+ }
120
+
121
+ .icon-pulse {
122
+ animation: icon-pulse 1s ease-in-out infinite;
123
+ }
124
+
125
+ @keyframes icon-pulse {
126
+ 0%, 100% {
127
+ opacity: 1;
128
+ }
129
+ 50% {
130
+ opacity: 0.4;
131
+ }
132
+ }
133
+
134
+ .icon-bounce {
135
+ animation: icon-bounce 1s ease infinite;
136
+ }
137
+
138
+ @keyframes icon-bounce {
139
+ 0%, 100% {
140
+ transform: translateY(0);
141
+ }
142
+ 50% {
143
+ transform: translateY(-4px);
144
+ }
145
+ }
146
+
147
+ .icon-shake {
148
+ animation: icon-shake 0.5s ease-in-out infinite;
149
+ }
150
+
151
+ @keyframes icon-shake {
152
+ 0%, 100% {
153
+ transform: translateX(0);
154
+ }
155
+ 25% {
156
+ transform: translateX(-2px);
157
+ }
158
+ 75% {
159
+ transform: translateX(2px);
160
+ }
161
+ }
162
+
163
+ // ----------------------------------------
164
+ // Icon Rotate
165
+ // ----------------------------------------
166
+ .icon-rotate-90 {
167
+ transform: rotate(90deg);
168
+ }
169
+
170
+ .icon-rotate-180 {
171
+ transform: rotate(180deg);
172
+ }
173
+
174
+ .icon-rotate-270 {
175
+ transform: rotate(270deg);
176
+ }
177
+
178
+ // ----------------------------------------
179
+ // Icon Flip
180
+ // ----------------------------------------
181
+ .icon-flip-h {
182
+ transform: scaleX(-1);
183
+ }
184
+
185
+ .icon-flip-v {
186
+ transform: scaleY(-1);
187
+ }
188
+
189
+ .icon-flip-both {
190
+ transform: scale(-1);
191
+ }
192
+
193
+ // ----------------------------------------
194
+ // Icon with Text
195
+ // ----------------------------------------
196
+ .icon-text {
197
+ display: inline-flex;
198
+ align-items: center;
199
+ gap: 0.375rem;
200
+ }
201
+
202
+ .icon-text-left .icon {
203
+ order: -1;
204
+ }
205
+
206
+ .icon-text-right .icon {
207
+ order: 1;
208
+ }
209
+
210
+ // ----------------------------------------
211
+ // Icon Stack
212
+ // ----------------------------------------
213
+ .icon-stack {
214
+ position: relative;
215
+ display: inline-flex;
216
+ align-items: center;
217
+ justify-content: center;
218
+ width: 2em;
219
+ height: 2em;
220
+ vertical-align: middle;
221
+ }
222
+
223
+ .icon-stack-bg {
224
+ position: absolute;
225
+ font-size: 2em;
226
+ }
227
+
228
+ .icon-stack-fg {
229
+ position: absolute;
230
+ font-size: 1em;
231
+ }
232
+
233
+ // ----------------------------------------
234
+ // Icon Badge
235
+ // ----------------------------------------
236
+ .icon-badge {
237
+ position: relative;
238
+ display: inline-flex;
239
+ }
240
+
241
+ .icon-badge-dot {
242
+ position: absolute;
243
+ top: -2px;
244
+ right: -2px;
245
+ width: 8px;
246
+ height: 8px;
247
+ background-color: var(--danger);
248
+ border-radius: 50%;
249
+ border: 2px solid var(--bg);
250
+ }
251
+
252
+ .icon-badge-count {
253
+ position: absolute;
254
+ top: -6px;
255
+ right: -6px;
256
+ min-width: 16px;
257
+ height: 16px;
258
+ padding: 0 4px;
259
+ font-size: 10px;
260
+ font-weight: $font-weight-semibold;
261
+ line-height: 16px;
262
+ text-align: center;
263
+ color: var(--white);
264
+ background-color: var(--danger);
265
+ border-radius: 999px;
266
+ }
267
+
268
+ // ----------------------------------------
269
+ // Icon Button Reset (for clickable icons)
270
+ // ----------------------------------------
271
+ .icon-clickable {
272
+ cursor: pointer;
273
+ transition: color $transition-fast $transition-timing,
274
+ transform $transition-fast $transition-timing;
275
+
276
+ &:hover {
277
+ color: var(--primary);
278
+ }
279
+
280
+ &:active {
281
+ transform: scale(0.9);
282
+ }
283
+ }
284
+
285
+ // ----------------------------------------
286
+ // Icon in Inputs
287
+ // ----------------------------------------
288
+ .icon-input-prefix,
289
+ .icon-input-suffix {
290
+ position: absolute;
291
+ top: 50%;
292
+ transform: translateY(-50%);
293
+ color: var(--text-muted);
294
+ pointer-events: none;
295
+ }
296
+
297
+ .icon-input-prefix {
298
+ left: 0.75rem;
299
+ }
300
+
301
+ .icon-input-suffix {
302
+ right: 0.75rem;
303
+ }
304
+
305
+ // ----------------------------------------
306
+ // Icon List
307
+ // ----------------------------------------
308
+ .icon-list {
309
+ list-style: none;
310
+ padding: 0;
311
+ margin: 0;
312
+
313
+ li {
314
+ display: flex;
315
+ align-items: flex-start;
316
+ gap: 0.5rem;
317
+ margin-bottom: 0.5rem;
318
+
319
+ .icon {
320
+ flex-shrink: 0;
321
+ margin-top: 0.125em;
322
+ }
323
+ }
324
+ }
325
+
326
+ // ----------------------------------------
327
+ // Dark Mode
328
+ // ----------------------------------------
329
+ [data-theme="dark"] {
330
+ .icon-badge-dot,
331
+ .icon-badge-count {
332
+ border-color: var(--gray-900);
333
+ }
334
+
335
+ .icon-muted {
336
+ color: var(--gray-500);
337
+ }
338
+ }