@cratis/components 0.1.9 → 0.1.10

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 (101) hide show
  1. package/dist/cjs/PivotViewer/PivotViewer.css +1258 -0
  2. package/dist/cjs/PivotViewer/components/Spinner.css +77 -0
  3. package/dist/cjs/TimeMachine/EventsView.css +213 -0
  4. package/dist/cjs/TimeMachine/TimeMachine.css +567 -0
  5. package/dist/esm/PivotViewer/PivotViewer.css +1258 -0
  6. package/dist/esm/PivotViewer/components/Spinner.css +77 -0
  7. package/dist/esm/TimeMachine/EventsView.css +213 -0
  8. package/dist/esm/TimeMachine/TimeMachine.css +567 -0
  9. package/package.json +3 -4
  10. package/.storybook/main.ts +0 -24
  11. package/CommandDialog/CommandDialog.stories.tsx +0 -25
  12. package/CommandDialog/CommandDialog.tsx +0 -161
  13. package/CommandDialog/index.ts +0 -4
  14. package/CommandForm/CommandForm.stories.tsx +0 -24
  15. package/CommandForm/CommandForm.tsx +0 -266
  16. package/CommandForm/CommandFormField.tsx +0 -27
  17. package/CommandForm/CommandFormFields.tsx +0 -142
  18. package/CommandForm/DatePickerField.tsx +0 -57
  19. package/CommandForm/DropdownField.tsx +0 -65
  20. package/CommandForm/InputTextField.tsx +0 -62
  21. package/CommandForm/SliderField.tsx +0 -68
  22. package/CommandForm/index.ts +0 -10
  23. package/Common/ErrorBoundary.stories.tsx +0 -10
  24. package/Common/ErrorBoundary.tsx +0 -41
  25. package/Common/FormElement.stories.tsx +0 -10
  26. package/Common/FormElement.tsx +0 -20
  27. package/Common/Page.stories.tsx +0 -10
  28. package/Common/Page.tsx +0 -21
  29. package/Common/index.ts +0 -6
  30. package/DataPage/DataPage.stories.tsx +0 -10
  31. package/DataPage/DataPage.tsx +0 -191
  32. package/DataPage/index.ts +0 -4
  33. package/DataTables/DataTableForObservableQuery.stories.tsx +0 -10
  34. package/DataTables/DataTableForObservableQuery.tsx +0 -97
  35. package/DataTables/DataTableForQuery.stories.tsx +0 -10
  36. package/DataTables/DataTableForQuery.tsx +0 -97
  37. package/DataTables/index.ts +0 -5
  38. package/Dialogs/BusyIndicatorDialog.stories.tsx +0 -26
  39. package/Dialogs/BusyIndicatorDialog.tsx +0 -26
  40. package/Dialogs/ConfirmationDialog.stories.tsx +0 -36
  41. package/Dialogs/ConfirmationDialog.tsx +0 -75
  42. package/Dialogs/index.ts +0 -5
  43. package/Dropdown/Dropdown.tsx +0 -23
  44. package/Dropdown/index.ts +0 -4
  45. package/PivotViewer/PivotViewer.stories.tsx +0 -24
  46. package/PivotViewer/PivotViewer.tsx +0 -791
  47. package/PivotViewer/components/AxisLabels.tsx +0 -69
  48. package/PivotViewer/components/DetailPanel.tsx +0 -108
  49. package/PivotViewer/components/FilterPanel.tsx +0 -189
  50. package/PivotViewer/components/FilterPanelContainer.tsx +0 -10
  51. package/PivotViewer/components/PivotCanvas.tsx +0 -660
  52. package/PivotViewer/components/PivotViewerMain.tsx +0 -229
  53. package/PivotViewer/components/RangeHistogramFilter.tsx +0 -220
  54. package/PivotViewer/components/Spinner.tsx +0 -21
  55. package/PivotViewer/components/Toolbar.tsx +0 -130
  56. package/PivotViewer/components/ToolbarContainer.tsx +0 -10
  57. package/PivotViewer/components/index.ts +0 -12
  58. package/PivotViewer/components/pivot/animation.ts +0 -108
  59. package/PivotViewer/components/pivot/buckets.ts +0 -152
  60. package/PivotViewer/components/pivot/colorResolver.ts +0 -67
  61. package/PivotViewer/components/pivot/constants.ts +0 -46
  62. package/PivotViewer/components/pivot/sprites.ts +0 -265
  63. package/PivotViewer/components/pivot/visibility.ts +0 -319
  64. package/PivotViewer/constants.ts +0 -9
  65. package/PivotViewer/engine/layout.ts +0 -149
  66. package/PivotViewer/engine/pivot.worker.ts +0 -86
  67. package/PivotViewer/engine/store.ts +0 -437
  68. package/PivotViewer/engine/types.ts +0 -255
  69. package/PivotViewer/hooks/index.ts +0 -13
  70. package/PivotViewer/hooks/useContainerDimensions.ts +0 -45
  71. package/PivotViewer/hooks/useDimensionState.ts +0 -53
  72. package/PivotViewer/hooks/useFilterOptions.ts +0 -36
  73. package/PivotViewer/hooks/useFilterPanelDrag.ts +0 -49
  74. package/PivotViewer/hooks/useFilterState.ts +0 -106
  75. package/PivotViewer/hooks/useFilteredData.ts +0 -119
  76. package/PivotViewer/hooks/usePanning.ts +0 -163
  77. package/PivotViewer/hooks/usePivotEngine.ts +0 -252
  78. package/PivotViewer/hooks/useSelectedItem.ts +0 -402
  79. package/PivotViewer/hooks/useWheelZoom.ts +0 -114
  80. package/PivotViewer/hooks/useZoomState.ts +0 -34
  81. package/PivotViewer/index.ts +0 -7
  82. package/PivotViewer/types.ts +0 -59
  83. package/PivotViewer/utils/animations.ts +0 -249
  84. package/PivotViewer/utils/constants.ts +0 -20
  85. package/PivotViewer/utils/index.ts +0 -6
  86. package/PivotViewer/utils/selection.ts +0 -292
  87. package/PivotViewer/utils/utils.ts +0 -259
  88. package/TimeMachine/EventsView.stories.tsx +0 -10
  89. package/TimeMachine/EventsView.tsx +0 -119
  90. package/TimeMachine/Properties.stories.tsx +0 -10
  91. package/TimeMachine/Properties.tsx +0 -98
  92. package/TimeMachine/ReadModelView.stories.tsx +0 -10
  93. package/TimeMachine/ReadModelView.tsx +0 -143
  94. package/TimeMachine/TimeMachine.stories.tsx +0 -10
  95. package/TimeMachine/TimeMachine.tsx +0 -244
  96. package/TimeMachine/index.ts +0 -8
  97. package/TimeMachine/types.ts +0 -23
  98. package/global.d.ts +0 -11
  99. package/index.ts +0 -22
  100. package/useOverlayZIndex.ts +0 -32
  101. package/vite.config.ts +0 -80
@@ -0,0 +1,567 @@
1
+ /* Time Machine Container */
2
+ .time-machine {
3
+ position: relative;
4
+ width: 100%;
5
+ height: 100vh;
6
+ overflow: hidden;
7
+ background: radial-gradient(ellipse at center, #0a0a1a 0%, #000005 100%);
8
+ font-family: -apple-system, BlinkMacSystemFont, 'SF Pro Display', 'Segoe UI', Roboto, sans-serif;
9
+ }
10
+
11
+ /* View Switcher */
12
+ .view-switcher {
13
+ position: absolute;
14
+ top: 20px;
15
+ left: 50%;
16
+ transform: translateX(-50%);
17
+ display: flex;
18
+ gap: 8px;
19
+ background: rgba(255, 255, 255, 0.05);
20
+ padding: 6px;
21
+ border-radius: 12px;
22
+ backdrop-filter: blur(10px);
23
+ border: 1px solid rgba(255, 255, 255, 0.1);
24
+ z-index: 100;
25
+ }
26
+
27
+ .view-button {
28
+ width: 48px;
29
+ height: 48px;
30
+ border: none;
31
+ border-radius: 8px;
32
+ background: transparent;
33
+ color: rgba(255, 255, 255, 0.6);
34
+ font-size: 20px;
35
+ cursor: pointer;
36
+ display: flex;
37
+ align-items: center;
38
+ justify-content: center;
39
+ transition: all 0.2s ease;
40
+ }
41
+
42
+ .view-button:hover {
43
+ background: rgba(255, 255, 255, 0.1);
44
+ color: rgba(255, 255, 255, 0.9);
45
+ }
46
+
47
+ .view-button.active {
48
+ background: rgba(100, 150, 255, 0.2);
49
+ color: rgba(100, 150, 255, 1);
50
+ box-shadow: 0 0 15px rgba(100, 150, 255, 0.3);
51
+ }
52
+
53
+ .view-button i {
54
+ font-size: 20px;
55
+ }
56
+
57
+
58
+ /* Starfield Background */
59
+ .time-machine-background {
60
+ position: absolute;
61
+ inset: 0;
62
+ overflow: hidden;
63
+ z-index: 0;
64
+ perspective: 500px;
65
+ perspective-origin: 50% 50%;
66
+ }
67
+
68
+ .stars {
69
+ position: absolute;
70
+ top: 50%;
71
+ left: 50%;
72
+ width: 2px;
73
+ height: 2px;
74
+ background: transparent;
75
+ transform-style: preserve-3d;
76
+ animation: starfield 16s linear infinite;
77
+ box-shadow:
78
+ /* Layer 1 - close stars */
79
+ 24vw -15vh 0 0px rgba(255,255,255,0.9),
80
+ -32vw 28vh 0 0px rgba(255,255,255,0.8),
81
+ 45vw 35vh 0 0px rgba(255,255,255,0.7),
82
+ -18vw -40vh 0 0px rgba(255,255,255,0.9),
83
+ 38vw -25vh 0 0px rgba(255,255,255,0.8),
84
+ -42vw 15vh 0 0px rgba(255,255,255,0.7),
85
+ 12vw 42vh 0 0px rgba(255,255,255,0.9),
86
+ -28vw -18vh 0 0px rgba(255,255,255,0.8),
87
+ 48vw 8vh 0 0px rgba(255,255,255,0.7),
88
+ -15vw 38vh 0 0px rgba(255,255,255,0.9),
89
+ 32vw -42vh 0 0px rgba(255,255,255,0.8),
90
+ -45vw -8vh 0 0px rgba(255,255,255,0.7),
91
+ 8vw -35vh 0 0px rgba(255,255,255,0.9),
92
+ -38vw 42vh 0 0px rgba(255,255,255,0.8),
93
+ 42vw 18vh 0 0px rgba(255,255,255,0.7),
94
+ -8vw -28vh 0 0px rgba(255,255,255,0.9),
95
+ 28vw 45vh 0 0px rgba(255,255,255,0.8),
96
+ -48vw 25vh 0 0px rgba(255,255,255,0.7),
97
+ 15vw -8vh 0 0px rgba(255,255,255,0.9),
98
+ -22vw 12vh 0 0px rgba(255,255,255,0.8);
99
+ }
100
+
101
+ .stars-2 {
102
+ animation: starfield 16s linear infinite;
103
+ animation-delay: -5.33s;
104
+ box-shadow:
105
+ /* Layer 2 - medium stars */
106
+ -12vw 22vh 0 0px rgba(255,255,255,0.9),
107
+ 35vw -32vh 0 0px rgba(255,255,255,0.8),
108
+ -40vw -15vh 0 0px rgba(255,255,255,0.7),
109
+ 22vw 40vh 0 0px rgba(255,255,255,0.9),
110
+ -25vw -35vh 0 0px rgba(255,255,255,0.8),
111
+ 40vw 12vh 0 0px rgba(255,255,255,0.7),
112
+ -35vw 32vh 0 0px rgba(255,255,255,0.9),
113
+ 18vw -22vh 0 0px rgba(255,255,255,0.8),
114
+ -10vw 45vh 0 0px rgba(255,255,255,0.7),
115
+ 45vw -10vh 0 0px rgba(255,255,255,0.9),
116
+ -30vw -42vh 0 0px rgba(255,255,255,0.8),
117
+ 5vw 30vh 0 0px rgba(255,255,255,0.7),
118
+ -45vw 5vh 0 0px rgba(255,255,255,0.9),
119
+ 30vw 22vh 0 0px rgba(255,255,255,0.8),
120
+ -20vw -12vh 0 0px rgba(255,255,255,0.7),
121
+ 48vw -38vh 0 0px rgba(255,255,255,0.9),
122
+ -5vw 18vh 0 0px rgba(255,255,255,0.8),
123
+ 25vw -45vh 0 0px rgba(255,255,255,0.7),
124
+ -48vw 38vh 0 0px rgba(255,255,255,0.9),
125
+ 10vw -5vh 0 0px rgba(255,255,255,0.8);
126
+ }
127
+
128
+ .stars-3 {
129
+ animation: starfield 16s linear infinite;
130
+ animation-delay: -10.66s;
131
+ box-shadow:
132
+ /* Layer 3 - far stars */
133
+ 18vw -28vh 0 0px rgba(255,255,255,0.9),
134
+ -28vw 35vh 0 0px rgba(255,255,255,0.8),
135
+ 42vw 25vh 0 0px rgba(255,255,255,0.7),
136
+ -15vw -45vh 0 0px rgba(255,255,255,0.9),
137
+ 35vw -18vh 0 0px rgba(255,255,255,0.8),
138
+ -42vw 8vh 0 0px rgba(255,255,255,0.7),
139
+ 8vw 48vh 0 0px rgba(255,255,255,0.9),
140
+ -35vw -25vh 0 0px rgba(255,255,255,0.8),
141
+ 48vw -5vh 0 0px rgba(255,255,255,0.7),
142
+ -8vw 28vh 0 0px rgba(255,255,255,0.9),
143
+ 25vw -48vh 0 0px rgba(255,255,255,0.8),
144
+ -48vw -18vh 0 0px rgba(255,255,255,0.7),
145
+ 5vw -38vh 0 0px rgba(255,255,255,0.9),
146
+ -25vw 48vh 0 0px rgba(255,255,255,0.8),
147
+ 38vw 5vh 0 0px rgba(255,255,255,0.7),
148
+ -18vw -32vh 0 0px rgba(255,255,255,0.9),
149
+ 32vw 38vh 0 0px rgba(255,255,255,0.8),
150
+ -38vw 18vh 0 0px rgba(255,255,255,0.7),
151
+ 12vw -15vh 0 0px rgba(255,255,255,0.9),
152
+ -32vw 5vh 0 0px rgba(255,255,255,0.8);
153
+ }
154
+
155
+ @keyframes starfield {
156
+ 0% {
157
+ transform: translateZ(-600px);
158
+ opacity: 0;
159
+ }
160
+ 5% {
161
+ opacity: 1;
162
+ }
163
+ 90% {
164
+ opacity: 1;
165
+ }
166
+ 100% {
167
+ transform: translateZ(500px);
168
+ opacity: 0;
169
+ }
170
+ }
171
+
172
+ /* Viewport for 3D Windows */
173
+ .time-machine-viewport {
174
+ position: absolute;
175
+ inset: 0;
176
+ display: flex;
177
+ align-items: center;
178
+ justify-content: center;
179
+ perspective: 1200px;
180
+ perspective-origin: center 25%;
181
+ z-index: 1;
182
+ box-sizing: border-box;
183
+ }
184
+
185
+ .windows-container {
186
+ position: relative;
187
+ width: 60%;
188
+ max-width: 700px;
189
+ height: 55%;
190
+ max-height: 500px;
191
+ transform-style: preserve-3d;
192
+ }
193
+
194
+ /* Individual Version Window */
195
+ .version-window {
196
+ position: absolute;
197
+ inset: 0;
198
+ background: transparent;
199
+ overflow: visible;
200
+ cursor: pointer;
201
+ transform:
202
+ translateZ(calc(var(--z-offset) * 1px))
203
+ translateY(calc(var(--depth) * -35px))
204
+ scale(var(--scale));
205
+ opacity: var(--opacity);
206
+ transition:
207
+ transform 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94),
208
+ opacity 0.4s ease;
209
+ transform-style: preserve-3d;
210
+ will-change: transform, opacity;
211
+ perspective: 1500px;
212
+ }
213
+
214
+ .version-window-inner {
215
+ position: absolute;
216
+ inset: 0;
217
+ border-radius: 12px;
218
+ transform-style: preserve-3d;
219
+ transition: transform 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94);
220
+ box-shadow:
221
+ 0 0 0 1px rgba(255, 255, 255, 0.1),
222
+ 0 20px 60px rgba(0, 0, 0, 0.5),
223
+ 0 0 40px rgba(100, 100, 255, 0.1);
224
+ }
225
+
226
+ .version-window.flipped .version-window-inner {
227
+ transform: rotateY(180deg);
228
+ }
229
+
230
+ .version-window-face {
231
+ position: absolute;
232
+ inset: 0;
233
+ display: flex;
234
+ flex-direction: column;
235
+ border-radius: inherit;
236
+ background: linear-gradient(180deg, #3a3a4a 0%, #2a2a3a 2%, #1e1e28 100%);
237
+ backface-visibility: hidden;
238
+ overflow: hidden;
239
+ pointer-events: auto;
240
+ }
241
+
242
+ .version-window-face--back {
243
+ transform: rotateY(180deg);
244
+ background: linear-gradient(180deg, #262638 0%, #1b1b27 100%);
245
+ }
246
+
247
+ .version-window.flipped .version-window-face--front {
248
+ pointer-events: none;
249
+ }
250
+
251
+ .version-window:not(.flipped) .version-window-face--back {
252
+ pointer-events: none;
253
+ }
254
+
255
+ .version-window.active .version-window-inner {
256
+ box-shadow:
257
+ 0 0 0 2px rgba(100, 150, 255, 0.5),
258
+ 0 20px 60px rgba(0, 0, 0, 0.5),
259
+ 0 0 60px rgba(100, 150, 255, 0.2);
260
+ }
261
+
262
+ .version-window:hover:not(.active) .version-window-inner {
263
+ box-shadow:
264
+ 0 0 0 1px rgba(255, 255, 255, 0.2),
265
+ 0 25px 70px rgba(0, 0, 0, 0.6),
266
+ 0 0 50px rgba(100, 100, 255, 0.15);
267
+ }
268
+
269
+ /* Window Chrome (Title Bar) */
270
+ .window-chrome {
271
+ display: grid;
272
+ grid-template-columns: auto 1fr auto;
273
+ align-items: center;
274
+ height: 36px;
275
+ padding: 0 12px;
276
+ background: linear-gradient(180deg, #4a4a5a 0%, #3a3a4a 100%);
277
+ border-bottom: 1px solid rgba(0, 0, 0, 0.3);
278
+ gap: 12px;
279
+ }
280
+
281
+ .window-controls {
282
+ display: flex;
283
+ gap: 8px;
284
+ }
285
+
286
+ .control {
287
+ width: 12px;
288
+ height: 12px;
289
+ border-radius: 50%;
290
+ background: #666;
291
+ }
292
+
293
+ .control.close {
294
+ background: #ff5f57;
295
+ }
296
+
297
+ .control.minimize {
298
+ background: #ffbd2e;
299
+ }
300
+
301
+ .control.maximize {
302
+ background: #28ca41;
303
+ }
304
+
305
+ .window-title {
306
+ text-align: center;
307
+ font-size: 13px;
308
+ font-weight: 500;
309
+ color: rgba(255, 255, 255, 0.85);
310
+ margin: 0;
311
+ }
312
+
313
+ .window-actions {
314
+ display: flex;
315
+ align-items: center;
316
+ justify-content: flex-end;
317
+ }
318
+
319
+ .window-flip-button {
320
+ display: flex;
321
+ align-items: center;
322
+ justify-content: center;
323
+ width: 28px;
324
+ height: 28px;
325
+ border-radius: 6px;
326
+ border: 1px solid rgba(255, 255, 255, 0.15);
327
+ background: linear-gradient(180deg, rgba(120, 130, 220, 0.25) 0%, rgba(60, 70, 140, 0.25) 100%);
328
+ color: #fff;
329
+ cursor: pointer;
330
+ transition: transform 0.2s ease, box-shadow 0.2s ease, border-color 0.2s ease;
331
+ }
332
+
333
+ .window-flip-button:hover {
334
+ transform: translateY(-1px);
335
+ box-shadow: 0 8px 18px rgba(0, 0, 0, 0.35);
336
+ border-color: rgba(120, 160, 255, 0.4);
337
+ }
338
+
339
+ .window-flip-button:active {
340
+ transform: translateY(0);
341
+ }
342
+
343
+ .window-flip-button:focus-visible {
344
+ outline: 2px solid rgba(120, 160, 255, 0.85);
345
+ outline-offset: 2px;
346
+ }
347
+
348
+ .window-flip-button i {
349
+ font-size: 14px;
350
+ }
351
+
352
+ .window-chrome--back {
353
+ background: linear-gradient(180deg, #35354a 0%, #2b2b3c 100%);
354
+ }
355
+
356
+ /* Window Content */
357
+ .window-content {
358
+ height: calc(100% - 36px);
359
+ padding: 20px;
360
+ overflow: auto;
361
+ background: linear-gradient(180deg, #1e1e28 0%, #16161e 100%);
362
+ color: #e0e0e0;
363
+ }
364
+
365
+ .window-content--events {
366
+ display: flex;
367
+ flex-direction: column;
368
+ gap: 1.5rem;
369
+ }
370
+
371
+ .snapshot-event-list {
372
+ display: flex;
373
+ flex-direction: column;
374
+ gap: 1.25rem;
375
+ }
376
+
377
+ .snapshot-event {
378
+ background: rgba(255, 255, 255, 0.05);
379
+ border: 1px solid rgba(255, 255, 255, 0.1);
380
+ border-radius: 10px;
381
+ padding: 1rem 1.25rem;
382
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.3);
383
+ }
384
+
385
+ .snapshot-event-header {
386
+ display: flex;
387
+ align-items: baseline;
388
+ justify-content: space-between;
389
+ gap: 0.75rem;
390
+ margin-bottom: 0.75rem;
391
+ }
392
+
393
+ .snapshot-event-name {
394
+ font-size: 1rem;
395
+ font-weight: 600;
396
+ color: #ffffff;
397
+ }
398
+
399
+ .snapshot-event-timestamp {
400
+ font-size: 0.75rem;
401
+ color: rgba(255, 255, 255, 0.65);
402
+ font-family: -apple-system, BlinkMacSystemFont, 'SF Mono', monospace;
403
+ }
404
+
405
+ /* Timeline */
406
+ .timeline {
407
+ position: absolute;
408
+ right: 20px;
409
+ top: 50%;
410
+ transform: translateY(-50%);
411
+ display: flex;
412
+ flex-direction: column;
413
+ justify-content: center;
414
+ z-index: 10;
415
+ }
416
+
417
+ .timeline-track {
418
+ display: flex;
419
+ flex-direction: column;
420
+ gap: 2px;
421
+ padding: 20px 0;
422
+ }
423
+
424
+ .timeline-track::-webkit-scrollbar {
425
+ display: none;
426
+ }
427
+
428
+ /* Timeline Entry */
429
+ .timeline-entry {
430
+ display: flex;
431
+ align-items: center;
432
+ justify-content: flex-end;
433
+ gap: 10px;
434
+ padding: 4px 0;
435
+ cursor: pointer;
436
+ transform-origin: right center;
437
+ transform: scale(var(--magnification, 1));
438
+ transition: transform 0.15s cubic-bezier(0.25, 0.46, 0.45, 0.94);
439
+ }
440
+
441
+ .timeline-tick {
442
+ width: calc(20px * var(--magnification, 1));
443
+ height: calc(2px * var(--magnification, 1));
444
+ background: rgba(255, 255, 255, 0.4);
445
+ border-radius: 1px;
446
+ transition:
447
+ width 0.15s ease,
448
+ height 0.15s ease,
449
+ background 0.15s ease;
450
+ }
451
+
452
+ .timeline-entry.selected .timeline-tick {
453
+ background: #6a9fff;
454
+ box-shadow: 0 0 8px rgba(106, 159, 255, 0.6);
455
+ }
456
+
457
+ .timeline-entry.hovered .timeline-tick {
458
+ background: rgba(255, 255, 255, 0.9);
459
+ box-shadow: 0 0 6px rgba(255, 255, 255, 0.4);
460
+ }
461
+
462
+ .timeline-label {
463
+ display: flex;
464
+ flex-direction: column;
465
+ align-items: flex-end;
466
+ opacity: 0;
467
+ transform: translateX(10px);
468
+ transition:
469
+ opacity 0.2s ease,
470
+ transform 0.2s ease;
471
+ pointer-events: none;
472
+ white-space: nowrap;
473
+ }
474
+
475
+ .timeline-entry.hovered .timeline-label,
476
+ .timeline-entry.selected .timeline-label {
477
+ opacity: 1;
478
+ transform: translateX(0);
479
+ }
480
+
481
+ .timeline-date {
482
+ font-size: 11px;
483
+ font-weight: 600;
484
+ color: #fff;
485
+ text-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
486
+ }
487
+
488
+ .timeline-time {
489
+ font-size: 10px;
490
+ color: rgba(255, 255, 255, 0.7);
491
+ text-shadow: 0 1px 3px rgba(0, 0, 0, 0.5);
492
+ }
493
+
494
+ /* Navigation Controls */
495
+ .navigation-controls {
496
+ position: absolute;
497
+ bottom: 30px;
498
+ left: 50%;
499
+ transform: translateX(-50%);
500
+ display: flex;
501
+ gap: 20px;
502
+ z-index: 10;
503
+ }
504
+
505
+ .nav-button {
506
+ width: 60px;
507
+ height: 60px;
508
+ border: none;
509
+ border-radius: 50%;
510
+ background: linear-gradient(180deg, rgba(100, 100, 130, 0.8) 0%, rgba(60, 60, 90, 0.8) 100%);
511
+ color: white;
512
+ font-size: 28px;
513
+ font-weight: 300;
514
+ cursor: pointer;
515
+ display: flex;
516
+ align-items: center;
517
+ justify-content: center;
518
+ line-height: 1;
519
+ padding: 0;
520
+ box-shadow:
521
+ 0 4px 20px rgba(0, 0, 0, 0.4),
522
+ inset 0 1px 0 rgba(255, 255, 255, 0.2);
523
+ transition:
524
+ transform 0.2s ease,
525
+ box-shadow 0.2s ease,
526
+ opacity 0.2s ease;
527
+ backdrop-filter: blur(10px);
528
+ }
529
+
530
+ .nav-button:hover:not(:disabled) {
531
+ transform: scale(1.1);
532
+ box-shadow:
533
+ 0 6px 25px rgba(0, 0, 0, 0.5),
534
+ inset 0 1px 0 rgba(255, 255, 255, 0.3),
535
+ 0 0 20px rgba(100, 150, 255, 0.3);
536
+ }
537
+
538
+ .nav-button:active:not(:disabled) {
539
+ transform: scale(0.95);
540
+ }
541
+
542
+ .nav-button:disabled {
543
+ opacity: 0.3;
544
+ cursor: not-allowed;
545
+ }
546
+
547
+ /* Responsive adjustments */
548
+ @media (max-width: 768px) {
549
+ .time-machine-viewport {
550
+ width: calc(100% - 120px);
551
+ }
552
+
553
+ .timeline {
554
+ width: 100px;
555
+ }
556
+
557
+ .windows-container {
558
+ width: 85%;
559
+ height: 60%;
560
+ }
561
+
562
+ .nav-button {
563
+ width: 50px;
564
+ height: 50px;
565
+ font-size: 24px;
566
+ }
567
+ }