zenkit-css 1.2.2 → 1.2.3

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,576 @@
1
+ // ========================================
2
+ // ZenKit - Snippet Component
3
+ // Code snippet with copy button
4
+ // ========================================
5
+
6
+ @use '../abstracts/variables' as *;
7
+
8
+ // ----------------------------------------
9
+ // Snippet Container
10
+ // ----------------------------------------
11
+ .snippet {
12
+ position: relative;
13
+ display: flex;
14
+ align-items: center;
15
+ padding: 0.5rem 0.75rem;
16
+ padding-right: 2.5rem;
17
+ font-family: var(--font-mono);
18
+ font-size: var(--text-sm);
19
+ color: var(--text);
20
+ background-color: var(--gray-100);
21
+ border: 1px solid var(--border);
22
+ border-radius: $border-radius;
23
+ }
24
+
25
+ .snippet-symbol {
26
+ color: var(--text-muted);
27
+ margin-right: 0.5rem;
28
+ user-select: none;
29
+ }
30
+
31
+ .snippet-content {
32
+ flex: 1;
33
+ overflow-x: auto;
34
+ white-space: nowrap;
35
+
36
+ &::-webkit-scrollbar {
37
+ height: 4px;
38
+ }
39
+
40
+ &::-webkit-scrollbar-thumb {
41
+ background-color: var(--gray-300);
42
+ border-radius: 2px;
43
+ }
44
+ }
45
+
46
+ // ----------------------------------------
47
+ // Snippet Copy Button
48
+ // ----------------------------------------
49
+ .snippet-copy {
50
+ position: absolute;
51
+ right: 0.5rem;
52
+ top: 50%;
53
+ transform: translateY(-50%);
54
+ display: flex;
55
+ align-items: center;
56
+ justify-content: center;
57
+ width: 1.75rem;
58
+ height: 1.75rem;
59
+ padding: 0;
60
+ color: var(--text-muted);
61
+ background-color: transparent;
62
+ border: none;
63
+ border-radius: $border-radius-sm;
64
+ cursor: pointer;
65
+ transition: color $transition-fast $transition-timing,
66
+ background-color $transition-fast $transition-timing;
67
+
68
+ &:hover {
69
+ color: var(--text);
70
+ background-color: var(--gray-200);
71
+ }
72
+
73
+ svg {
74
+ width: 1rem;
75
+ height: 1rem;
76
+ }
77
+ }
78
+
79
+ .snippet-copy-success {
80
+ color: var(--success);
81
+
82
+ &:hover {
83
+ color: var(--success);
84
+ }
85
+ }
86
+
87
+ // ----------------------------------------
88
+ // Snippet Block (Multi-line)
89
+ // ----------------------------------------
90
+ .snippet-block {
91
+ display: block;
92
+ padding: 1rem;
93
+ padding-right: 3rem;
94
+ overflow-x: auto;
95
+
96
+ .snippet-content {
97
+ white-space: pre;
98
+ display: block;
99
+ }
100
+
101
+ .snippet-copy {
102
+ top: 0.75rem;
103
+ right: 0.75rem;
104
+ transform: none;
105
+ }
106
+ }
107
+
108
+ // ----------------------------------------
109
+ // Snippet with Header
110
+ // ----------------------------------------
111
+ .snippet-with-header {
112
+ flex-direction: column;
113
+ align-items: stretch;
114
+ padding: 0;
115
+
116
+ .snippet-header {
117
+ display: flex;
118
+ align-items: center;
119
+ justify-content: space-between;
120
+ padding: 0.5rem 0.75rem;
121
+ background-color: var(--gray-200);
122
+ border-bottom: 1px solid var(--border);
123
+ border-radius: $border-radius $border-radius 0 0;
124
+ }
125
+
126
+ .snippet-content {
127
+ padding: 1rem;
128
+ white-space: pre;
129
+ }
130
+
131
+ .snippet-copy {
132
+ position: static;
133
+ transform: none;
134
+ }
135
+ }
136
+
137
+ .snippet-filename {
138
+ font-size: var(--text-xs);
139
+ font-weight: $font-weight-medium;
140
+ color: var(--text-muted);
141
+ }
142
+
143
+ .snippet-language {
144
+ display: inline-flex;
145
+ align-items: center;
146
+ padding: 0.125rem 0.5rem;
147
+ font-size: var(--text-xs);
148
+ font-weight: $font-weight-medium;
149
+ color: var(--text-muted);
150
+ background-color: var(--gray-300);
151
+ border-radius: $border-radius-sm;
152
+ }
153
+
154
+ // ----------------------------------------
155
+ // Snippet Sizes
156
+ // ----------------------------------------
157
+ .snippet-sm {
158
+ padding: 0.375rem 0.625rem;
159
+ padding-right: 2.25rem;
160
+ font-size: var(--text-xs);
161
+
162
+ .snippet-copy {
163
+ width: 1.5rem;
164
+ height: 1.5rem;
165
+
166
+ svg {
167
+ width: 0.875rem;
168
+ height: 0.875rem;
169
+ }
170
+ }
171
+ }
172
+
173
+ .snippet-lg {
174
+ padding: 0.75rem 1rem;
175
+ padding-right: 3rem;
176
+ font-size: var(--text-base);
177
+
178
+ .snippet-copy {
179
+ width: 2rem;
180
+ height: 2rem;
181
+
182
+ svg {
183
+ width: 1.25rem;
184
+ height: 1.25rem;
185
+ }
186
+ }
187
+ }
188
+
189
+ // ----------------------------------------
190
+ // Snippet Variants
191
+ // ----------------------------------------
192
+
193
+ // Bordered variant
194
+ .snippet-bordered {
195
+ background-color: transparent;
196
+ border-width: 2px;
197
+ }
198
+
199
+ // Flat variant
200
+ .snippet-flat {
201
+ border: none;
202
+ border-radius: 0;
203
+ }
204
+
205
+ // Ghost variant
206
+ .snippet-ghost {
207
+ background-color: transparent;
208
+ border-color: transparent;
209
+
210
+ &:hover {
211
+ background-color: var(--gray-100);
212
+ }
213
+ }
214
+
215
+ // ----------------------------------------
216
+ // Snippet Colors
217
+ // ----------------------------------------
218
+ .snippet-dark {
219
+ color: var(--gray-100);
220
+ background-color: var(--gray-900);
221
+ border-color: var(--gray-700);
222
+
223
+ .snippet-symbol {
224
+ color: var(--gray-500);
225
+ }
226
+
227
+ .snippet-copy {
228
+ color: var(--gray-400);
229
+
230
+ &:hover {
231
+ color: var(--gray-100);
232
+ background-color: var(--gray-800);
233
+ }
234
+ }
235
+
236
+ .snippet-copy-success {
237
+ color: var(--success);
238
+ }
239
+
240
+ &.snippet-with-header {
241
+ .snippet-header {
242
+ background-color: var(--gray-800);
243
+ border-color: var(--gray-700);
244
+ }
245
+
246
+ .snippet-language {
247
+ background-color: var(--gray-700);
248
+ color: var(--gray-300);
249
+ }
250
+ }
251
+ }
252
+
253
+ .snippet-primary {
254
+ color: var(--primary-900);
255
+ background-color: var(--primary-50);
256
+ border-color: var(--primary-200);
257
+
258
+ .snippet-copy:hover {
259
+ background-color: var(--primary-100);
260
+ }
261
+ }
262
+
263
+ .snippet-success {
264
+ color: var(--success-900);
265
+ background-color: var(--success-50);
266
+ border-color: var(--success-200);
267
+
268
+ .snippet-copy:hover {
269
+ background-color: var(--success-100);
270
+ }
271
+ }
272
+
273
+ .snippet-warning {
274
+ color: var(--warning-900);
275
+ background-color: var(--warning-50);
276
+ border-color: var(--warning-200);
277
+
278
+ .snippet-copy:hover {
279
+ background-color: var(--warning-100);
280
+ }
281
+ }
282
+
283
+ // ----------------------------------------
284
+ // Snippet with Line Numbers
285
+ // ----------------------------------------
286
+ .snippet-line-numbers {
287
+ display: grid;
288
+ grid-template-columns: auto 1fr;
289
+ padding: 0;
290
+
291
+ .snippet-lines {
292
+ display: flex;
293
+ flex-direction: column;
294
+ padding: 1rem 0.75rem;
295
+ background-color: var(--gray-200);
296
+ border-right: 1px solid var(--border);
297
+ text-align: right;
298
+ user-select: none;
299
+ }
300
+
301
+ .snippet-line-number {
302
+ font-size: var(--text-xs);
303
+ color: var(--text-muted);
304
+ line-height: 1.5rem;
305
+ }
306
+
307
+ .snippet-content {
308
+ padding: 1rem;
309
+ padding-right: 3rem;
310
+
311
+ code {
312
+ display: block;
313
+ line-height: 1.5rem;
314
+ }
315
+ }
316
+ }
317
+
318
+ // ----------------------------------------
319
+ // Snippet Highlighted Lines
320
+ // ----------------------------------------
321
+ .snippet-line-highlighted {
322
+ background-color: var(--warning-100);
323
+ margin: 0 -1rem;
324
+ padding: 0 1rem;
325
+ }
326
+
327
+ // ----------------------------------------
328
+ // Snippet with Diff
329
+ // ----------------------------------------
330
+ .snippet-diff {
331
+ .snippet-line-added {
332
+ background-color: var(--success-100);
333
+
334
+ &::before {
335
+ content: "+ ";
336
+ color: var(--success);
337
+ }
338
+ }
339
+
340
+ .snippet-line-removed {
341
+ background-color: var(--danger-100);
342
+
343
+ &::before {
344
+ content: "- ";
345
+ color: var(--danger);
346
+ }
347
+ }
348
+ }
349
+
350
+ // ----------------------------------------
351
+ // Snippet Group (Multiple snippets)
352
+ // ----------------------------------------
353
+ .snippet-group {
354
+ display: flex;
355
+ flex-direction: column;
356
+ gap: 0;
357
+
358
+ .snippet {
359
+ border-radius: 0;
360
+ margin-top: -1px;
361
+
362
+ &:first-child {
363
+ border-radius: $border-radius $border-radius 0 0;
364
+ margin-top: 0;
365
+ }
366
+
367
+ &:last-child {
368
+ border-radius: 0 0 $border-radius $border-radius;
369
+ }
370
+ }
371
+ }
372
+
373
+ // ----------------------------------------
374
+ // Snippet Tabs
375
+ // ----------------------------------------
376
+ .snippet-tabs {
377
+ .snippet-tabs-header {
378
+ display: flex;
379
+ background-color: var(--gray-200);
380
+ border: 1px solid var(--border);
381
+ border-bottom: none;
382
+ border-radius: $border-radius $border-radius 0 0;
383
+ overflow-x: auto;
384
+ }
385
+
386
+ .snippet-tab {
387
+ padding: 0.5rem 1rem;
388
+ font-size: var(--text-sm);
389
+ font-weight: $font-weight-medium;
390
+ color: var(--text-muted);
391
+ background: transparent;
392
+ border: none;
393
+ border-bottom: 2px solid transparent;
394
+ cursor: pointer;
395
+ transition: color $transition-fast $transition-timing,
396
+ background-color $transition-fast $transition-timing;
397
+ white-space: nowrap;
398
+
399
+ &:hover {
400
+ color: var(--text);
401
+ background-color: var(--gray-300);
402
+ }
403
+
404
+ &.is-active {
405
+ color: var(--primary);
406
+ background-color: var(--gray-100);
407
+ border-bottom-color: var(--primary);
408
+ }
409
+ }
410
+
411
+ .snippet {
412
+ border-radius: 0 0 $border-radius $border-radius;
413
+ }
414
+ }
415
+
416
+ // ----------------------------------------
417
+ // Snippet Tooltip (Copy feedback)
418
+ // ----------------------------------------
419
+ .snippet-tooltip {
420
+ position: absolute;
421
+ right: 0.5rem;
422
+ top: -2rem;
423
+ padding: 0.25rem 0.5rem;
424
+ font-size: var(--text-xs);
425
+ font-family: var(--font-sans);
426
+ color: var(--white);
427
+ background-color: var(--gray-900);
428
+ border-radius: $border-radius-sm;
429
+ opacity: 0;
430
+ visibility: hidden;
431
+ transform: translateY(4px);
432
+ transition: opacity $transition-fast $transition-timing,
433
+ visibility $transition-fast $transition-timing,
434
+ transform $transition-fast $transition-timing;
435
+
436
+ &.is-visible {
437
+ opacity: 1;
438
+ visibility: visible;
439
+ transform: translateY(0);
440
+ }
441
+
442
+ &::after {
443
+ content: "";
444
+ position: absolute;
445
+ top: 100%;
446
+ right: 0.75rem;
447
+ border: 4px solid transparent;
448
+ border-top-color: var(--gray-900);
449
+ }
450
+ }
451
+
452
+ // ----------------------------------------
453
+ // Snippet Wordwrap
454
+ // ----------------------------------------
455
+ .snippet-wrap {
456
+ .snippet-content {
457
+ white-space: pre-wrap;
458
+ word-break: break-all;
459
+ }
460
+ }
461
+
462
+ // ----------------------------------------
463
+ // Snippet Collapsible
464
+ // ----------------------------------------
465
+ .snippet-collapsible {
466
+ .snippet-content {
467
+ max-height: 200px;
468
+ overflow-y: hidden;
469
+ transition: max-height $transition-base $transition-timing;
470
+ }
471
+
472
+ &.is-expanded .snippet-content {
473
+ max-height: none;
474
+ }
475
+ }
476
+
477
+ .snippet-expand {
478
+ display: flex;
479
+ justify-content: center;
480
+ padding: 0.5rem;
481
+ border-top: 1px solid var(--border);
482
+ background: linear-gradient(to bottom, transparent, var(--gray-100));
483
+ margin-top: -2rem;
484
+ position: relative;
485
+ z-index: 1;
486
+
487
+ button {
488
+ padding: 0.25rem 0.75rem;
489
+ font-size: var(--text-xs);
490
+ color: var(--text-muted);
491
+ background-color: var(--bg);
492
+ border: 1px solid var(--border);
493
+ border-radius: $border-radius-full;
494
+ cursor: pointer;
495
+ transition: color $transition-fast $transition-timing;
496
+
497
+ &:hover {
498
+ color: var(--text);
499
+ }
500
+ }
501
+ }
502
+
503
+ // ----------------------------------------
504
+ // Dark Mode
505
+ // ----------------------------------------
506
+ [data-theme="dark"] {
507
+ .snippet {
508
+ background-color: var(--gray-800);
509
+ border-color: var(--gray-700);
510
+ }
511
+
512
+ .snippet-copy:hover {
513
+ background-color: var(--gray-700);
514
+ }
515
+
516
+ .snippet-content::-webkit-scrollbar-thumb {
517
+ background-color: var(--gray-600);
518
+ }
519
+
520
+ .snippet-with-header {
521
+ .snippet-header {
522
+ background-color: var(--gray-700);
523
+ border-color: var(--gray-600);
524
+ }
525
+
526
+ .snippet-language {
527
+ background-color: var(--gray-600);
528
+ }
529
+ }
530
+
531
+ .snippet-line-numbers {
532
+ .snippet-lines {
533
+ background-color: var(--gray-700);
534
+ border-color: var(--gray-600);
535
+ }
536
+ }
537
+
538
+ .snippet-line-highlighted {
539
+ background-color: rgba($warning, 0.2);
540
+ }
541
+
542
+ .snippet-diff {
543
+ .snippet-line-added {
544
+ background-color: rgba($success, 0.2);
545
+ }
546
+
547
+ .snippet-line-removed {
548
+ background-color: rgba($danger, 0.2);
549
+ }
550
+ }
551
+
552
+ .snippet-tabs {
553
+ .snippet-tabs-header {
554
+ background-color: var(--gray-700);
555
+ border-color: var(--gray-600);
556
+ }
557
+
558
+ .snippet-tab:hover {
559
+ background-color: var(--gray-600);
560
+ }
561
+
562
+ .snippet-tab.is-active {
563
+ background-color: var(--gray-800);
564
+ }
565
+ }
566
+
567
+ .snippet-expand {
568
+ background: linear-gradient(to bottom, transparent, var(--gray-800));
569
+ border-color: var(--gray-700);
570
+
571
+ button {
572
+ background-color: var(--gray-900);
573
+ border-color: var(--gray-600);
574
+ }
575
+ }
576
+ }