@cratis/components 4.10.4 → 4.11.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.
@@ -0,0 +1,908 @@
1
+ @layer cratis-components {
2
+ /* @cratis/components/TimeMachine/styles — requires @cratis/components/styles/base. Areas: TimeMachine. */
3
+ /* ── ./TimeMachine/EventsView.css ─────────────────────────────────────── */
4
+ /* Events View Container */
5
+ .events-view-container {
6
+ position: absolute;
7
+ inset: 0;
8
+ padding: 5rem 2rem 2rem;
9
+ overflow-y: auto;
10
+ background: transparent;
11
+ z-index: 1;
12
+ }
13
+
14
+ /* Timeline customization */
15
+ .events-view-timeline {
16
+ display: flex;
17
+ max-width: 1200px;
18
+ margin: 0 auto;
19
+ padding: 2.5rem 0 3rem;
20
+ flex-direction: column;
21
+ }
22
+
23
+ .events-view-scroll-button {
24
+ position: relative;
25
+ margin-right: 0.5rem;
26
+ width: 44px;
27
+ height: 44px;
28
+ border-radius: 50%;
29
+ border: 1px solid var(--tm-border-subtle);
30
+ background: var(--tm-dark-surface);
31
+ color: var(--tm-text);
32
+ display: flex;
33
+ align-items: center;
34
+ justify-content: center;
35
+ backdrop-filter: blur(8px);
36
+ box-shadow: 0 6px 18px rgba(0, 0, 0, 0.3);
37
+ transition:
38
+ transform 0.2s ease,
39
+ box-shadow 0.2s ease;
40
+ z-index: 5;
41
+ pointer-events: auto;
42
+ }
43
+
44
+ .events-view-scroll-button:hover {
45
+ transform: translateY(-2px);
46
+ box-shadow: 0 10px 24px rgba(0, 0, 0, 0.4);
47
+ }
48
+
49
+ .events-view-scroll-button:active {
50
+ transform: translateY(0);
51
+ }
52
+
53
+ .events-view-scroll-button--top {
54
+ top: auto;
55
+ }
56
+
57
+ .events-view-scroll-button--bottom {
58
+ bottom: auto;
59
+ }
60
+
61
+ .events-view-scroll-button-wrapper {
62
+ position: sticky;
63
+ display: flex;
64
+ justify-content: flex-end;
65
+ padding-right: 0.5rem;
66
+ pointer-events: none;
67
+ z-index: 5;
68
+ height: 0;
69
+ overflow: visible;
70
+ }
71
+
72
+ .events-view-scroll-button-wrapper--top {
73
+ top: 4.5rem;
74
+ }
75
+
76
+ .events-view-scroll-button-wrapper--bottom {
77
+ bottom: 2.5rem;
78
+ }
79
+
80
+ /* Event Card */
81
+ .events-view-event-card {
82
+ background: var(--tm-surface);
83
+ border: 1px solid var(--tm-border);
84
+ border-radius: 12px;
85
+ padding: 1.5rem;
86
+ backdrop-filter: blur(10px);
87
+ transition: all 0.3s ease;
88
+ max-width: 380px;
89
+ }
90
+
91
+ .events-view-event-card:hover {
92
+ background: var(--tm-surface-hover);
93
+ border-color: var(--tm-accent-border);
94
+ transform: translateY(-2px);
95
+ box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3);
96
+ }
97
+
98
+ /* Event Header */
99
+ .events-view-event-header {
100
+ margin-bottom: 1rem;
101
+ padding-bottom: 1rem;
102
+ border-bottom: 1px solid var(--tm-border);
103
+ }
104
+
105
+ .events-view-event-name {
106
+ font-size: 1.25rem;
107
+ font-weight: 600;
108
+ color: var(--tm-text);
109
+ margin: 0 0 0.5rem 0;
110
+ font-family:
111
+ -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Segoe UI', Roboto,
112
+ sans-serif;
113
+ }
114
+
115
+ .events-view-event-timestamp {
116
+ font-size: 0.875rem;
117
+ color: var(--tm-text-muted);
118
+ font-family: -apple-system, BlinkMacSystemFont, 'SF Mono', monospace;
119
+ }
120
+
121
+ .events-view-event-header--right {
122
+ text-align: right;
123
+ }
124
+
125
+ .events-view-event-name--right,
126
+ .events-view-event-timestamp--right {
127
+ text-align: right;
128
+ }
129
+
130
+ /* Event Properties */
131
+ .events-view-event-properties {
132
+ margin-top: 1rem;
133
+ }
134
+
135
+ /* Custom Marker */
136
+ .events-view-marker {
137
+ display: flex;
138
+ align-items: center;
139
+ justify-content: center;
140
+ width: 2.5rem;
141
+ height: 2.5rem;
142
+ background: linear-gradient(135deg, var(--tm-accent-bg), rgba(100, 150, 255, 0.1));
143
+ border: 2px solid var(--tm-accent-border);
144
+ border-radius: 50%;
145
+ position: relative;
146
+ backdrop-filter: blur(5px);
147
+ transition: all 0.3s ease;
148
+ }
149
+
150
+ .events-view-marker:hover {
151
+ background: linear-gradient(135deg, var(--tm-accent-bg-hover), var(--tm-accent-bg));
152
+ border-color: var(--tm-accent-border-hover);
153
+ transform: scale(1.1);
154
+ }
155
+
156
+ .events-view-marker-dot {
157
+ width: 0.75rem;
158
+ height: 0.75rem;
159
+ background: var(--tm-accent);
160
+ border-radius: 50%;
161
+ box-shadow: 0 0 10px var(--tm-accent-glow);
162
+ }
163
+
164
+ .events-view-timeline-event {
165
+ display: grid;
166
+ min-height: 5rem;
167
+ grid-template-columns: minmax(0, 1fr) 2.5rem minmax(0, 1fr);
168
+ align-items: stretch;
169
+ }
170
+
171
+ .events-view-timeline-separator {
172
+ position: relative;
173
+ grid-column: 2;
174
+ display: flex;
175
+ align-items: center;
176
+ flex-direction: column;
177
+ }
178
+
179
+ .events-view-timeline-connector {
180
+ width: 2px;
181
+ min-height: 3rem;
182
+ flex: 1;
183
+ background: linear-gradient(to bottom, var(--tm-accent-border), var(--tm-accent-bg));
184
+ }
185
+
186
+ .events-view-timeline-content {
187
+ display: flex;
188
+ padding: 0 1.5rem 1.5rem;
189
+ align-items: flex-start;
190
+ }
191
+
192
+ .events-view-timeline-event[data-position='right'] .events-view-timeline-content {
193
+ grid-column: 3;
194
+ justify-content: flex-start;
195
+ }
196
+
197
+ .events-view-timeline-event[data-position='left'] .events-view-timeline-content {
198
+ grid-column: 1;
199
+ grid-row: 1;
200
+ justify-content: flex-end;
201
+ text-align: right;
202
+ }
203
+
204
+ .events-view-event-card--left,
205
+ .events-view-event-card--right {
206
+ max-width: 380px;
207
+ }
208
+ .events-view-event-card--left table {
209
+ margin-left: auto;
210
+ direction: rtl;
211
+ }
212
+ .events-view-event-card--left table td {
213
+ direction: ltr;
214
+ text-align: right;
215
+ }
216
+
217
+ @media (prefers-reduced-motion: reduce) {
218
+ .events-view-container,
219
+ .events-view-container * {
220
+ scroll-behavior: auto !important;
221
+ transition: none !important;
222
+ animation: none !important;
223
+ }
224
+ }
225
+
226
+ /* ── ./TimeMachine/Properties.css ─────────────────────────────────────── */
227
+ /* Copyright (c) Cratis. All rights reserved. */
228
+ /* Licensed under the MIT license. See LICENSE file in the project root for full license information. */
229
+
230
+ .tm-properties-table {
231
+ width: 100%;
232
+ border-collapse: collapse;
233
+ font-family: -apple-system, BlinkMacSystemFont, 'SF Mono', monospace;
234
+ font-size: 13px;
235
+ }
236
+
237
+ .tm-properties-row {
238
+ border-bottom: 1px solid var(--tm-border, rgba(255, 255, 255, 0.1));
239
+ }
240
+
241
+ .tm-properties-label {
242
+ padding: 8px 12px;
243
+ color: var(--tm-text-muted, rgba(255, 255, 255, 0.6));
244
+ font-weight: 500;
245
+ width: 40%;
246
+ }
247
+
248
+ .tm-properties-label--right {
249
+ text-align: right;
250
+ }
251
+
252
+ .tm-properties-value {
253
+ padding: 8px 12px;
254
+ color: var(--tm-text, rgba(255, 255, 255, 0.9));
255
+ }
256
+
257
+ .tm-properties-value--right {
258
+ text-align: right;
259
+ }
260
+
261
+ .tm-properties-null {
262
+ color: var(--tm-text-faint, var(--cratis-text-color-secondary));
263
+ }
264
+
265
+ .tm-properties-boolean-true {
266
+ color: #4ade80;
267
+ }
268
+
269
+ .tm-properties-boolean-false {
270
+ color: #f87171;
271
+ }
272
+
273
+ .tm-properties-number {
274
+ color: #fbbf24;
275
+ }
276
+
277
+ .tm-properties-date {
278
+ color: #60a5fa;
279
+ }
280
+
281
+ .tm-properties-complex {
282
+ color: var(--tm-text-dim, rgba(255, 255, 255, 0.7));
283
+ }
284
+
285
+ /* ── ./TimeMachine/TimeMachine.css ─────────────────────────────────────── */
286
+ /* Time Machine Container */
287
+ .time-machine {
288
+ /* Color tokens — intentional dark space theme. Override to customize. */
289
+ --tm-bg-deep: #0a0a1a;
290
+ --tm-bg-deepest: #000005;
291
+ --tm-text: rgba(255, 255, 255, 0.9);
292
+ --tm-text-muted: rgba(255, 255, 255, 0.6);
293
+ --tm-text-dim: rgba(255, 255, 255, 0.7);
294
+ --tm-text-faint: rgba(255, 255, 255, 0.4);
295
+ --tm-surface: rgba(255, 255, 255, 0.05);
296
+ --tm-surface-hover: rgba(255, 255, 255, 0.08);
297
+ --tm-surface-active: rgba(255, 255, 255, 0.1);
298
+ --tm-border: rgba(255, 255, 255, 0.1);
299
+ --tm-border-subtle: rgba(255, 255, 255, 0.15);
300
+ --tm-accent: rgba(100, 150, 255, 1);
301
+ --tm-accent-bg: rgba(100, 150, 255, 0.2);
302
+ --tm-accent-bg-hover: rgba(100, 150, 255, 0.4);
303
+ --tm-accent-border: rgba(100, 150, 255, 0.3);
304
+ --tm-accent-border-hover: rgba(100, 150, 255, 0.8);
305
+ --tm-accent-glow: rgba(100, 150, 255, 0.3);
306
+ --tm-dark-surface: rgba(15, 23, 42, 0.75);
307
+
308
+ position: relative;
309
+ width: 100%;
310
+ height: 100vh;
311
+ overflow: hidden;
312
+ background: radial-gradient(
313
+ ellipse at center,
314
+ var(--tm-bg-deep) 0%,
315
+ var(--tm-bg-deepest) 100%
316
+ );
317
+ font-family:
318
+ -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Segoe UI', Roboto,
319
+ sans-serif;
320
+ }
321
+
322
+ /* View Switcher */
323
+ .view-switcher {
324
+ position: absolute;
325
+ top: 20px;
326
+ left: 50%;
327
+ transform: translateX(-50%);
328
+ display: flex;
329
+ gap: 8px;
330
+ background: var(--tm-surface);
331
+ padding: 6px;
332
+ border-radius: 12px;
333
+ backdrop-filter: blur(10px);
334
+ border: 1px solid var(--tm-border);
335
+ z-index: 100;
336
+ }
337
+
338
+ .view-button {
339
+ width: 48px;
340
+ height: 48px;
341
+ border: none;
342
+ border-radius: 8px;
343
+ background: transparent;
344
+ color: var(--tm-text-muted);
345
+ font-size: 20px;
346
+ cursor: pointer;
347
+ display: flex;
348
+ align-items: center;
349
+ justify-content: center;
350
+ transition: all 0.2s ease;
351
+ }
352
+
353
+ .view-button:hover {
354
+ background: var(--tm-surface-active);
355
+ color: var(--tm-text);
356
+ }
357
+
358
+ .view-button.active {
359
+ background: var(--tm-accent-bg);
360
+ color: var(--tm-accent);
361
+ box-shadow: 0 0 15px var(--tm-accent-glow);
362
+ }
363
+
364
+ .view-button i {
365
+ font-size: 20px;
366
+ }
367
+
368
+ /* Starfield Background */
369
+ .time-machine-background {
370
+ position: absolute;
371
+ inset: 0;
372
+ overflow: hidden;
373
+ z-index: 0;
374
+ perspective: 500px;
375
+ perspective-origin: 50% 50%;
376
+ }
377
+
378
+ .stars {
379
+ position: absolute;
380
+ top: 50%;
381
+ left: 50%;
382
+ width: 2px;
383
+ height: 2px;
384
+ background: transparent;
385
+ transform-style: preserve-3d;
386
+ animation: starfield 16s linear infinite;
387
+ box-shadow:
388
+ /* Layer 1 - close stars */
389
+ 24vw -15vh 0 0px rgba(255, 255, 255, 0.9),
390
+ -32vw 28vh 0 0px rgba(255, 255, 255, 0.8),
391
+ 45vw 35vh 0 0px rgba(255, 255, 255, 0.7),
392
+ -18vw -40vh 0 0px rgba(255, 255, 255, 0.9),
393
+ 38vw -25vh 0 0px rgba(255, 255, 255, 0.8),
394
+ -42vw 15vh 0 0px rgba(255, 255, 255, 0.7),
395
+ 12vw 42vh 0 0px rgba(255, 255, 255, 0.9),
396
+ -28vw -18vh 0 0px rgba(255, 255, 255, 0.8),
397
+ 48vw 8vh 0 0px rgba(255, 255, 255, 0.7),
398
+ -15vw 38vh 0 0px rgba(255, 255, 255, 0.9),
399
+ 32vw -42vh 0 0px rgba(255, 255, 255, 0.8),
400
+ -45vw -8vh 0 0px rgba(255, 255, 255, 0.7),
401
+ 8vw -35vh 0 0px rgba(255, 255, 255, 0.9),
402
+ -38vw 42vh 0 0px rgba(255, 255, 255, 0.8),
403
+ 42vw 18vh 0 0px rgba(255, 255, 255, 0.7),
404
+ -8vw -28vh 0 0px rgba(255, 255, 255, 0.9),
405
+ 28vw 45vh 0 0px rgba(255, 255, 255, 0.8),
406
+ -48vw 25vh 0 0px rgba(255, 255, 255, 0.7),
407
+ 15vw -8vh 0 0px rgba(255, 255, 255, 0.9),
408
+ -22vw 12vh 0 0px rgba(255, 255, 255, 0.8);
409
+ }
410
+
411
+ .stars-2 {
412
+ animation: starfield 16s linear infinite;
413
+ animation-delay: -5.33s;
414
+ box-shadow:
415
+ /* Layer 2 - medium stars */
416
+ -12vw 22vh 0 0px rgba(255, 255, 255, 0.9),
417
+ 35vw -32vh 0 0px rgba(255, 255, 255, 0.8),
418
+ -40vw -15vh 0 0px rgba(255, 255, 255, 0.7),
419
+ 22vw 40vh 0 0px rgba(255, 255, 255, 0.9),
420
+ -25vw -35vh 0 0px rgba(255, 255, 255, 0.8),
421
+ 40vw 12vh 0 0px rgba(255, 255, 255, 0.7),
422
+ -35vw 32vh 0 0px rgba(255, 255, 255, 0.9),
423
+ 18vw -22vh 0 0px rgba(255, 255, 255, 0.8),
424
+ -10vw 45vh 0 0px rgba(255, 255, 255, 0.7),
425
+ 45vw -10vh 0 0px rgba(255, 255, 255, 0.9),
426
+ -30vw -42vh 0 0px rgba(255, 255, 255, 0.8),
427
+ 5vw 30vh 0 0px rgba(255, 255, 255, 0.7),
428
+ -45vw 5vh 0 0px rgba(255, 255, 255, 0.9),
429
+ 30vw 22vh 0 0px rgba(255, 255, 255, 0.8),
430
+ -20vw -12vh 0 0px rgba(255, 255, 255, 0.7),
431
+ 48vw -38vh 0 0px rgba(255, 255, 255, 0.9),
432
+ -5vw 18vh 0 0px rgba(255, 255, 255, 0.8),
433
+ 25vw -45vh 0 0px rgba(255, 255, 255, 0.7),
434
+ -48vw 38vh 0 0px rgba(255, 255, 255, 0.9),
435
+ 10vw -5vh 0 0px rgba(255, 255, 255, 0.8);
436
+ }
437
+
438
+ .stars-3 {
439
+ animation: starfield 16s linear infinite;
440
+ animation-delay: -10.66s;
441
+ box-shadow:
442
+ /* Layer 3 - far stars */
443
+ 18vw -28vh 0 0px rgba(255, 255, 255, 0.9),
444
+ -28vw 35vh 0 0px rgba(255, 255, 255, 0.8),
445
+ 42vw 25vh 0 0px rgba(255, 255, 255, 0.7),
446
+ -15vw -45vh 0 0px rgba(255, 255, 255, 0.9),
447
+ 35vw -18vh 0 0px rgba(255, 255, 255, 0.8),
448
+ -42vw 8vh 0 0px rgba(255, 255, 255, 0.7),
449
+ 8vw 48vh 0 0px rgba(255, 255, 255, 0.9),
450
+ -35vw -25vh 0 0px rgba(255, 255, 255, 0.8),
451
+ 48vw -5vh 0 0px rgba(255, 255, 255, 0.7),
452
+ -8vw 28vh 0 0px rgba(255, 255, 255, 0.9),
453
+ 25vw -48vh 0 0px rgba(255, 255, 255, 0.8),
454
+ -48vw -18vh 0 0px rgba(255, 255, 255, 0.7),
455
+ 5vw -38vh 0 0px rgba(255, 255, 255, 0.9),
456
+ -25vw 48vh 0 0px rgba(255, 255, 255, 0.8),
457
+ 38vw 5vh 0 0px rgba(255, 255, 255, 0.7),
458
+ -18vw -32vh 0 0px rgba(255, 255, 255, 0.9),
459
+ 32vw 38vh 0 0px rgba(255, 255, 255, 0.8),
460
+ -38vw 18vh 0 0px rgba(255, 255, 255, 0.7),
461
+ 12vw -15vh 0 0px rgba(255, 255, 255, 0.9),
462
+ -32vw 5vh 0 0px rgba(255, 255, 255, 0.8);
463
+ }
464
+
465
+ @keyframes starfield {
466
+ 0% {
467
+ transform: translateZ(-600px);
468
+ opacity: 0;
469
+ }
470
+ 5% {
471
+ opacity: 1;
472
+ }
473
+ 90% {
474
+ opacity: 1;
475
+ }
476
+ 100% {
477
+ transform: translateZ(500px);
478
+ opacity: 0;
479
+ }
480
+ }
481
+
482
+ /* Viewport for 3D Windows */
483
+ .time-machine-viewport {
484
+ position: absolute;
485
+ inset: 0;
486
+ display: flex;
487
+ align-items: center;
488
+ justify-content: center;
489
+ perspective: 1200px;
490
+ perspective-origin: center 25%;
491
+ z-index: 1;
492
+ box-sizing: border-box;
493
+ }
494
+
495
+ .windows-container {
496
+ position: relative;
497
+ width: 60%;
498
+ max-width: 700px;
499
+ height: 55%;
500
+ max-height: 500px;
501
+ transform-style: preserve-3d;
502
+ }
503
+
504
+ /* Individual Version Window */
505
+ .version-window {
506
+ position: absolute;
507
+ inset: 0;
508
+ background: transparent;
509
+ overflow: visible;
510
+ cursor: pointer;
511
+ transform: translateZ(calc(var(--z-offset) * 1px))
512
+ translateY(calc(var(--depth) * -35px)) scale(var(--scale));
513
+ opacity: var(--opacity);
514
+ transition:
515
+ transform 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94),
516
+ opacity 0.4s ease;
517
+ transform-style: preserve-3d;
518
+ will-change: transform, opacity;
519
+ perspective: 1500px;
520
+ }
521
+
522
+ .version-window-inner {
523
+ position: absolute;
524
+ inset: 0;
525
+ border-radius: 12px;
526
+ transform-style: preserve-3d;
527
+ transition: transform 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94);
528
+ box-shadow:
529
+ 0 0 0 1px rgba(255, 255, 255, 0.1),
530
+ 0 20px 60px rgba(0, 0, 0, 0.5),
531
+ 0 0 40px rgba(100, 100, 255, 0.1);
532
+ }
533
+
534
+ .version-window.flipped .version-window-inner {
535
+ transform: rotateY(180deg);
536
+ }
537
+
538
+ .version-window-face {
539
+ position: absolute;
540
+ inset: 0;
541
+ display: flex;
542
+ flex-direction: column;
543
+ border-radius: inherit;
544
+ background: linear-gradient(180deg, #3a3a4a 0%, #2a2a3a 2%, #1e1e28 100%);
545
+ backface-visibility: hidden;
546
+ overflow: hidden;
547
+ pointer-events: auto;
548
+ }
549
+
550
+ .version-window-face--back {
551
+ transform: rotateY(180deg);
552
+ background: linear-gradient(180deg, #262638 0%, #1b1b27 100%);
553
+ }
554
+
555
+ .version-window.flipped .version-window-face--front {
556
+ pointer-events: none;
557
+ }
558
+
559
+ .version-window:not(.flipped) .version-window-face--back {
560
+ pointer-events: none;
561
+ }
562
+
563
+ .version-window.active .version-window-inner {
564
+ box-shadow:
565
+ 0 0 0 2px rgba(100, 150, 255, 0.5),
566
+ 0 20px 60px rgba(0, 0, 0, 0.5),
567
+ 0 0 60px rgba(100, 150, 255, 0.2);
568
+ }
569
+
570
+ .version-window:hover:not(.active) .version-window-inner {
571
+ box-shadow:
572
+ 0 0 0 1px rgba(255, 255, 255, 0.2),
573
+ 0 25px 70px rgba(0, 0, 0, 0.6),
574
+ 0 0 50px rgba(100, 100, 255, 0.15);
575
+ }
576
+
577
+ /* Window Chrome (Title Bar) */
578
+ .window-chrome {
579
+ display: grid;
580
+ grid-template-columns: auto 1fr auto;
581
+ align-items: center;
582
+ height: 36px;
583
+ padding: 0 12px;
584
+ background: linear-gradient(180deg, #4a4a5a 0%, #3a3a4a 100%);
585
+ border-bottom: 1px solid rgba(0, 0, 0, 0.3);
586
+ gap: 12px;
587
+ }
588
+
589
+ .window-controls {
590
+ display: flex;
591
+ gap: 8px;
592
+ }
593
+
594
+ .control {
595
+ width: 12px;
596
+ height: 12px;
597
+ border-radius: 50%;
598
+ background: #666;
599
+ }
600
+
601
+ .control.close {
602
+ background: #ff5f57;
603
+ }
604
+
605
+ .control.minimize {
606
+ background: #ffbd2e;
607
+ }
608
+
609
+ .control.maximize {
610
+ background: #28ca41;
611
+ }
612
+
613
+ .window-title {
614
+ text-align: center;
615
+ font-size: 13px;
616
+ font-weight: 500;
617
+ color: rgba(255, 255, 255, 0.85);
618
+ margin: 0;
619
+ }
620
+
621
+ .window-actions {
622
+ display: flex;
623
+ align-items: center;
624
+ justify-content: flex-end;
625
+ }
626
+
627
+ .window-flip-button {
628
+ display: flex;
629
+ align-items: center;
630
+ justify-content: center;
631
+ width: 28px;
632
+ height: 28px;
633
+ border-radius: 6px;
634
+ border: 1px solid var(--tm-border-subtle);
635
+ background: linear-gradient(
636
+ 180deg,
637
+ rgba(120, 130, 220, 0.25) 0%,
638
+ rgba(60, 70, 140, 0.25) 100%
639
+ );
640
+ color: var(--tm-text);
641
+ cursor: pointer;
642
+ transition:
643
+ transform 0.2s ease,
644
+ box-shadow 0.2s ease,
645
+ border-color 0.2s ease;
646
+ }
647
+
648
+ .window-flip-button:hover {
649
+ transform: translateY(-1px);
650
+ box-shadow: 0 8px 18px rgba(0, 0, 0, 0.35);
651
+ border-color: rgba(120, 160, 255, 0.4);
652
+ }
653
+
654
+ .window-flip-button:active {
655
+ transform: translateY(0);
656
+ }
657
+
658
+ .window-flip-button:focus-visible {
659
+ outline: 2px solid rgba(120, 160, 255, 0.85);
660
+ outline-offset: 2px;
661
+ }
662
+
663
+ .window-flip-button i {
664
+ font-size: 14px;
665
+ }
666
+
667
+ .window-chrome--back {
668
+ background: linear-gradient(180deg, #35354a 0%, #2b2b3c 100%);
669
+ }
670
+
671
+ /* Window Content */
672
+ .window-content {
673
+ height: calc(100% - 36px);
674
+ padding: 20px;
675
+ overflow: auto;
676
+ background: linear-gradient(180deg, #1e1e28 0%, #16161e 100%);
677
+ color: #e0e0e0;
678
+ }
679
+
680
+ .window-content--events {
681
+ display: flex;
682
+ flex-direction: column;
683
+ gap: 1.5rem;
684
+ }
685
+
686
+ .snapshot-event-list {
687
+ display: flex;
688
+ flex-direction: column;
689
+ gap: 1.25rem;
690
+ }
691
+
692
+ .snapshot-event {
693
+ background: var(--tm-surface);
694
+ border: 1px solid var(--tm-border);
695
+ border-radius: 10px;
696
+ padding: 1rem 1.25rem;
697
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.3);
698
+ }
699
+
700
+ .snapshot-event-header {
701
+ display: flex;
702
+ align-items: baseline;
703
+ justify-content: space-between;
704
+ gap: 0.75rem;
705
+ margin-bottom: 0.75rem;
706
+ }
707
+
708
+ .snapshot-event-name {
709
+ font-size: 1rem;
710
+ font-weight: 600;
711
+ color: #ffffff;
712
+ }
713
+
714
+ .snapshot-event-timestamp {
715
+ font-size: 0.75rem;
716
+ color: var(--tm-text-muted);
717
+ font-family: -apple-system, BlinkMacSystemFont, 'SF Mono', monospace;
718
+ }
719
+
720
+ /* Timeline */
721
+ .timeline {
722
+ position: absolute;
723
+ right: 20px;
724
+ top: 50%;
725
+ transform: translateY(-50%);
726
+ display: flex;
727
+ flex-direction: column;
728
+ justify-content: center;
729
+ z-index: 10;
730
+ }
731
+
732
+ .timeline-track {
733
+ display: flex;
734
+ flex-direction: column;
735
+ gap: 2px;
736
+ padding: 20px 0;
737
+ }
738
+
739
+ .timeline-track::-webkit-scrollbar {
740
+ display: none;
741
+ }
742
+
743
+ /* Timeline Entry */
744
+ .timeline-entry {
745
+ display: flex;
746
+ align-items: center;
747
+ justify-content: flex-end;
748
+ gap: 10px;
749
+ padding: 4px 0;
750
+ border: 0;
751
+ background: transparent;
752
+ color: inherit;
753
+ font: inherit;
754
+ cursor: pointer;
755
+ transform-origin: right center;
756
+ transform: scale(var(--magnification, 1));
757
+ transition: transform 0.15s cubic-bezier(0.25, 0.46, 0.45, 0.94);
758
+ }
759
+
760
+ .timeline-tick {
761
+ width: calc(20px * var(--magnification, 1));
762
+ height: calc(2px * var(--magnification, 1));
763
+ background: var(--tm-text-faint);
764
+ border-radius: 1px;
765
+ transition:
766
+ width 0.15s ease,
767
+ height 0.15s ease,
768
+ background 0.15s ease;
769
+ }
770
+
771
+ .timeline-entry:focus-visible {
772
+ outline: none;
773
+ border-radius: var(--cratis-border-radius);
774
+ box-shadow: var(--cratis-focus-ring);
775
+ }
776
+
777
+ .timeline-entry.selected .timeline-tick {
778
+ background: #6a9fff;
779
+ box-shadow: 0 0 8px rgba(106, 159, 255, 0.6);
780
+ }
781
+
782
+ .timeline-entry.hovered .timeline-tick {
783
+ background: var(--tm-text);
784
+ box-shadow: 0 0 6px var(--tm-surface-active);
785
+ }
786
+
787
+ .timeline-label {
788
+ display: flex;
789
+ flex-direction: column;
790
+ align-items: flex-end;
791
+ opacity: 0;
792
+ transform: translateX(10px);
793
+ transition:
794
+ opacity 0.2s ease,
795
+ transform 0.2s ease;
796
+ pointer-events: none;
797
+ white-space: nowrap;
798
+ }
799
+
800
+ .timeline-entry.hovered .timeline-label,
801
+ .timeline-entry.selected .timeline-label {
802
+ opacity: 1;
803
+ transform: translateX(0);
804
+ }
805
+
806
+ .timeline-date {
807
+ font-size: 11px;
808
+ font-weight: 600;
809
+ color: #fff;
810
+ text-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
811
+ }
812
+
813
+ .timeline-time {
814
+ font-size: 10px;
815
+ color: var(--tm-text-dim);
816
+ text-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
817
+ }
818
+
819
+ @media (prefers-reduced-motion: reduce) {
820
+ .timeline-entry,
821
+ .timeline-tick,
822
+ .timeline-label,
823
+ .time-machine * {
824
+ transition: none !important;
825
+ animation: none !important;
826
+ }
827
+ }
828
+
829
+ /* Navigation Controls */
830
+ .navigation-controls {
831
+ position: absolute;
832
+ bottom: 30px;
833
+ left: 50%;
834
+ transform: translateX(-50%);
835
+ display: flex;
836
+ gap: 20px;
837
+ z-index: 10;
838
+ }
839
+
840
+ .nav-button {
841
+ width: 60px;
842
+ height: 60px;
843
+ border: none;
844
+ border-radius: 50%;
845
+ background: linear-gradient(
846
+ 180deg,
847
+ rgba(100, 100, 130, 0.8) 0%,
848
+ rgba(60, 60, 90, 0.8) 100%
849
+ );
850
+ color: white;
851
+ font-size: 28px;
852
+ font-weight: 300;
853
+ cursor: pointer;
854
+ display: flex;
855
+ align-items: center;
856
+ justify-content: center;
857
+ line-height: 1;
858
+ padding: 0;
859
+ box-shadow:
860
+ 0 4px 20px rgba(0, 0, 0, 0.4),
861
+ inset 0 1px 0 rgba(255, 255, 255, 0.2);
862
+ transition:
863
+ transform 0.2s ease,
864
+ box-shadow 0.2s ease,
865
+ opacity 0.2s ease;
866
+ backdrop-filter: blur(10px);
867
+ }
868
+
869
+ .nav-button:hover:not(:disabled) {
870
+ transform: scale(1.1);
871
+ box-shadow:
872
+ 0 6px 25px rgba(0, 0, 0, 0.5),
873
+ inset 0 1px 0 rgba(255, 255, 255, 0.3),
874
+ 0 0 20px rgba(100, 150, 255, 0.3);
875
+ }
876
+
877
+ .nav-button:active:not(:disabled) {
878
+ transform: scale(0.95);
879
+ }
880
+
881
+ .nav-button:disabled {
882
+ opacity: 0.3;
883
+ cursor: not-allowed;
884
+ }
885
+
886
+ /* Responsive adjustments */
887
+ @media (max-width: 768px) {
888
+ .time-machine-viewport {
889
+ width: calc(100% - 120px);
890
+ }
891
+
892
+ .timeline {
893
+ width: 100px;
894
+ }
895
+
896
+ .windows-container {
897
+ width: 85%;
898
+ height: 60%;
899
+ }
900
+
901
+ .nav-button {
902
+ width: 50px;
903
+ height: 50px;
904
+ font-size: 24px;
905
+ }
906
+ }
907
+
908
+ }