@jjlmoya/utils-tabletop 1.4.0 → 1.5.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.
Files changed (123) hide show
  1. package/package.json +1 -1
  2. package/src/entries.ts +11 -1
  3. package/src/index.ts +1 -0
  4. package/src/tests/locale_completeness.test.ts +1 -1
  5. package/src/tests/tool_validation.test.ts +1 -1
  6. package/src/tool/decision-wheel/audio.ts +78 -0
  7. package/src/tool/decision-wheel/bibliography.astro +16 -0
  8. package/src/tool/decision-wheel/bibliography.ts +8 -0
  9. package/src/tool/decision-wheel/client.ts +226 -0
  10. package/src/tool/decision-wheel/component.astro +48 -0
  11. package/src/tool/decision-wheel/components/SegmentEditor.astro +22 -0
  12. package/src/tool/decision-wheel/components/SpinHistory.astro +17 -0
  13. package/src/tool/decision-wheel/components/SpinResult.astro +13 -0
  14. package/src/tool/decision-wheel/components/WheelCanvas.astro +23 -0
  15. package/src/tool/decision-wheel/decision-wheel.css +632 -0
  16. package/src/tool/decision-wheel/drawing.ts +144 -0
  17. package/src/tool/decision-wheel/entry.ts +48 -0
  18. package/src/tool/decision-wheel/i18n/de.ts +97 -0
  19. package/src/tool/decision-wheel/i18n/en.ts +251 -0
  20. package/src/tool/decision-wheel/i18n/es.ts +93 -0
  21. package/src/tool/decision-wheel/i18n/fr.ts +93 -0
  22. package/src/tool/decision-wheel/i18n/id.ts +93 -0
  23. package/src/tool/decision-wheel/i18n/it.ts +93 -0
  24. package/src/tool/decision-wheel/i18n/ja.ts +93 -0
  25. package/src/tool/decision-wheel/i18n/ko.ts +93 -0
  26. package/src/tool/decision-wheel/i18n/nl.ts +93 -0
  27. package/src/tool/decision-wheel/i18n/pl.ts +93 -0
  28. package/src/tool/decision-wheel/i18n/pt.ts +93 -0
  29. package/src/tool/decision-wheel/i18n/ru.ts +75 -0
  30. package/src/tool/decision-wheel/i18n/sv.ts +93 -0
  31. package/src/tool/decision-wheel/i18n/tr.ts +93 -0
  32. package/src/tool/decision-wheel/i18n/zh.ts +93 -0
  33. package/src/tool/decision-wheel/index.ts +9 -0
  34. package/src/tool/decision-wheel/logic.test.ts +163 -0
  35. package/src/tool/decision-wheel/logic.ts +145 -0
  36. package/src/tool/decision-wheel/seo.astro +16 -0
  37. package/src/tool/decision-wheel/types.ts +14 -0
  38. package/src/tool/decision-wheel/ui.ts +121 -0
  39. package/src/tool/fantasy-runes-translator/bibliography.astro +16 -0
  40. package/src/tool/fantasy-runes-translator/bibliography.ts +16 -0
  41. package/src/tool/fantasy-runes-translator/client.ts +205 -0
  42. package/src/tool/fantasy-runes-translator/component.astro +95 -0
  43. package/src/tool/fantasy-runes-translator/entry.ts +56 -0
  44. package/src/tool/fantasy-runes-translator/fantasy-runes-translator.css +712 -0
  45. package/src/tool/fantasy-runes-translator/i18n/de.ts +139 -0
  46. package/src/tool/fantasy-runes-translator/i18n/en.ts +139 -0
  47. package/src/tool/fantasy-runes-translator/i18n/es.ts +139 -0
  48. package/src/tool/fantasy-runes-translator/i18n/fr.ts +139 -0
  49. package/src/tool/fantasy-runes-translator/i18n/id.ts +139 -0
  50. package/src/tool/fantasy-runes-translator/i18n/it.ts +139 -0
  51. package/src/tool/fantasy-runes-translator/i18n/ja.ts +139 -0
  52. package/src/tool/fantasy-runes-translator/i18n/ko.ts +139 -0
  53. package/src/tool/fantasy-runes-translator/i18n/nl.ts +139 -0
  54. package/src/tool/fantasy-runes-translator/i18n/pl.ts +139 -0
  55. package/src/tool/fantasy-runes-translator/i18n/pt.ts +139 -0
  56. package/src/tool/fantasy-runes-translator/i18n/ru.ts +139 -0
  57. package/src/tool/fantasy-runes-translator/i18n/sv.ts +139 -0
  58. package/src/tool/fantasy-runes-translator/i18n/tr.ts +139 -0
  59. package/src/tool/fantasy-runes-translator/i18n/zh.ts +139 -0
  60. package/src/tool/fantasy-runes-translator/index.ts +9 -0
  61. package/src/tool/fantasy-runes-translator/logic.ts +174 -0
  62. package/src/tool/fantasy-runes-translator/seo.astro +16 -0
  63. package/src/tool/fantasy-runes-translator/types.ts +26 -0
  64. package/src/tool/rpg-initiative-tracker/bibliography.astro +16 -0
  65. package/src/tool/rpg-initiative-tracker/bibliography.ts +12 -0
  66. package/src/tool/rpg-initiative-tracker/client.ts +201 -0
  67. package/src/tool/rpg-initiative-tracker/component.astro +23 -0
  68. package/src/tool/rpg-initiative-tracker/components/AddForm.astro +49 -0
  69. package/src/tool/rpg-initiative-tracker/components/CombatantList.astro +16 -0
  70. package/src/tool/rpg-initiative-tracker/components/TurnControls.astro +28 -0
  71. package/src/tool/rpg-initiative-tracker/entry.ts +50 -0
  72. package/src/tool/rpg-initiative-tracker/i18n/de.ts +266 -0
  73. package/src/tool/rpg-initiative-tracker/i18n/en.ts +263 -0
  74. package/src/tool/rpg-initiative-tracker/i18n/es.ts +264 -0
  75. package/src/tool/rpg-initiative-tracker/i18n/fr.ts +263 -0
  76. package/src/tool/rpg-initiative-tracker/i18n/id.ts +263 -0
  77. package/src/tool/rpg-initiative-tracker/i18n/it.ts +263 -0
  78. package/src/tool/rpg-initiative-tracker/i18n/ja.ts +263 -0
  79. package/src/tool/rpg-initiative-tracker/i18n/ko.ts +263 -0
  80. package/src/tool/rpg-initiative-tracker/i18n/nl.ts +263 -0
  81. package/src/tool/rpg-initiative-tracker/i18n/pl.ts +264 -0
  82. package/src/tool/rpg-initiative-tracker/i18n/pt.ts +263 -0
  83. package/src/tool/rpg-initiative-tracker/i18n/ru.ts +264 -0
  84. package/src/tool/rpg-initiative-tracker/i18n/sv.ts +263 -0
  85. package/src/tool/rpg-initiative-tracker/i18n/tr.ts +263 -0
  86. package/src/tool/rpg-initiative-tracker/i18n/zh.ts +263 -0
  87. package/src/tool/rpg-initiative-tracker/index.ts +9 -0
  88. package/src/tool/rpg-initiative-tracker/logic.test.ts +121 -0
  89. package/src/tool/rpg-initiative-tracker/logic.ts +122 -0
  90. package/src/tool/rpg-initiative-tracker/rpg-initiative-tracker.css +617 -0
  91. package/src/tool/rpg-initiative-tracker/seo.astro +16 -0
  92. package/src/tool/rpg-initiative-tracker/types.ts +15 -0
  93. package/src/tool/score-tracker/bibliography.astro +16 -0
  94. package/src/tool/score-tracker/bibliography.ts +12 -0
  95. package/src/tool/score-tracker/client.ts +248 -0
  96. package/src/tool/score-tracker/component.astro +34 -0
  97. package/src/tool/score-tracker/components/Leaderboard.astro +19 -0
  98. package/src/tool/score-tracker/components/PlayerSetup.astro +32 -0
  99. package/src/tool/score-tracker/components/RoundScoring.astro +22 -0
  100. package/src/tool/score-tracker/components/ScoreHistory.astro +25 -0
  101. package/src/tool/score-tracker/entry.ts +57 -0
  102. package/src/tool/score-tracker/i18n/de.ts +278 -0
  103. package/src/tool/score-tracker/i18n/en.ts +278 -0
  104. package/src/tool/score-tracker/i18n/es.ts +251 -0
  105. package/src/tool/score-tracker/i18n/fr.ts +278 -0
  106. package/src/tool/score-tracker/i18n/id.ts +278 -0
  107. package/src/tool/score-tracker/i18n/it.ts +278 -0
  108. package/src/tool/score-tracker/i18n/ja.ts +278 -0
  109. package/src/tool/score-tracker/i18n/ko.ts +278 -0
  110. package/src/tool/score-tracker/i18n/nl.ts +278 -0
  111. package/src/tool/score-tracker/i18n/pl.ts +278 -0
  112. package/src/tool/score-tracker/i18n/pt.ts +278 -0
  113. package/src/tool/score-tracker/i18n/ru.ts +278 -0
  114. package/src/tool/score-tracker/i18n/sv.ts +278 -0
  115. package/src/tool/score-tracker/i18n/tr.ts +278 -0
  116. package/src/tool/score-tracker/i18n/zh.ts +278 -0
  117. package/src/tool/score-tracker/index.ts +9 -0
  118. package/src/tool/score-tracker/logic.test.ts +83 -0
  119. package/src/tool/score-tracker/logic.ts +122 -0
  120. package/src/tool/score-tracker/score-tracker.css +1029 -0
  121. package/src/tool/score-tracker/seo.astro +16 -0
  122. package/src/tool/score-tracker/types.ts +17 -0
  123. package/src/tools.ts +8 -0
@@ -0,0 +1,632 @@
1
+ :root {
2
+ --wheel-border: rgba(212, 175, 55, 0.5);
3
+ --wheel-accent: #6366f1;
4
+ --wheel-glow: rgba(99, 102, 241, 0.35);
5
+ --wheel-danger: #f43f5e;
6
+ }
7
+
8
+ .wheel-dashboard {
9
+ background: var(--bg-surface);
10
+ border: 1px solid var(--border-color);
11
+ border-radius: 2rem;
12
+ padding: 2.5rem;
13
+ color: var(--text-base);
14
+ display: flex;
15
+ flex-direction: column;
16
+ gap: 2.5rem;
17
+ box-shadow: 0 25px 60px rgba(0, 0, 0, 0.08), inset 0 1px 0 rgba(255, 255, 255, 0.5);
18
+ }
19
+
20
+ .wheel-layout {
21
+ display: grid;
22
+ grid-template-columns: 1.15fr 0.85fr;
23
+ gap: 2.5rem;
24
+ align-items: start;
25
+ }
26
+
27
+ @media (max-width: 820px) {
28
+ .wheel-layout {
29
+ grid-template-columns: 1fr;
30
+ gap: 2rem;
31
+ }
32
+ }
33
+
34
+ .canvas-card {
35
+ background: var(--bg-page);
36
+ border: 1px solid var(--border-color);
37
+ border-radius: 1.75rem;
38
+ padding: 2.5rem;
39
+ display: flex;
40
+ flex-direction: column;
41
+ align-items: center;
42
+ justify-content: center;
43
+ position: relative;
44
+ box-shadow: inset 0 4px 15px rgba(0, 0, 0, 0.03);
45
+ transition: all 0.4s cubic-bezier(0.16, 1, 0.3, 1);
46
+ }
47
+
48
+ .canvas-card.spinning {
49
+ box-shadow: inset 0 4px 15px rgba(0, 0, 0, 0.03), 0 0 40px var(--wheel-glow);
50
+ border-color: var(--wheel-accent);
51
+ }
52
+
53
+ .wheel-canvas-container {
54
+ position: relative;
55
+ display: flex;
56
+ flex-direction: column;
57
+ align-items: center;
58
+ gap: 1.25rem;
59
+ }
60
+
61
+ .wheel-canvas {
62
+ display: block;
63
+ border-radius: 50%;
64
+ width: 320px;
65
+ height: 320px;
66
+ filter: drop-shadow(0 12px 24px rgba(0, 0, 0, 0.12));
67
+ }
68
+
69
+ .wheel-pointer {
70
+ position: absolute;
71
+ top: -1.4rem;
72
+ left: 50%;
73
+ transform: translateX(-50%) rotate(0deg);
74
+ transform-origin: 50% 0;
75
+ width: 0;
76
+ height: 0;
77
+ border-left: 15px solid transparent;
78
+ border-right: 15px solid transparent;
79
+ border-top: 30px solid #ffe066;
80
+ filter: drop-shadow(0 4px 6px rgba(0, 0, 0, 0.25)) drop-shadow(0 0 8px #ffe066);
81
+ z-index: 2;
82
+ transition: transform 0.05s cubic-bezier(0.25, 0.8, 0.25, 1);
83
+ }
84
+
85
+ .wheel-pointer::after {
86
+ content: '';
87
+ position: absolute;
88
+ top: -26px;
89
+ left: -5px;
90
+ width: 10px;
91
+ height: 10px;
92
+ background: #f43f5e;
93
+ border-radius: 50%;
94
+ box-shadow: 0 0 10px #f43f5e;
95
+ }
96
+
97
+ .wheel-pointer.tick-active {
98
+ transform: translateX(-50%) rotate(-16deg);
99
+ }
100
+
101
+ .mute-btn {
102
+ position: absolute;
103
+ top: 1.25rem;
104
+ right: 1.25rem;
105
+ width: 2.75rem;
106
+ height: 2.75rem;
107
+ border-radius: 50%;
108
+ border: 1px solid var(--border-color);
109
+ background: var(--bg-surface);
110
+ color: var(--text-muted);
111
+ display: flex;
112
+ align-items: center;
113
+ justify-content: center;
114
+ cursor: pointer;
115
+ transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);
116
+ padding: 0;
117
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.03);
118
+ z-index: 10;
119
+ }
120
+
121
+ .mute-btn:hover {
122
+ background: var(--wheel-accent);
123
+ color: var(--color-white);
124
+ border-color: var(--wheel-accent);
125
+ transform: scale(1.08) rotate(8deg);
126
+ box-shadow: 0 8px 20px var(--wheel-glow);
127
+ }
128
+
129
+ .mute-btn svg {
130
+ width: 1.35rem;
131
+ height: 1.35rem;
132
+ }
133
+
134
+ .wheel-canvas-section {
135
+ display: flex;
136
+ flex-direction: column;
137
+ align-items: center;
138
+ gap: 1.5rem;
139
+ width: 100%;
140
+ }
141
+
142
+ .spin-button {
143
+ width: 100%;
144
+ height: 4rem;
145
+ border-radius: 1.25rem;
146
+ border: none;
147
+ background: linear-gradient(135deg, #6366f1 0%, #4f46e5 100%);
148
+ color: var(--color-white);
149
+ font-size: 1.3rem;
150
+ font-weight: 900;
151
+ letter-spacing: 0.08em;
152
+ cursor: pointer;
153
+ transition: all 0.3s cubic-bezier(0.16, 1, 0.3, 1);
154
+ position: relative;
155
+ overflow: hidden;
156
+ box-shadow: 0 8px 25px rgba(99, 102, 241, 0.25), inset 0 1px 0 rgba(255, 255, 255, 0.3);
157
+ text-transform: uppercase;
158
+ }
159
+
160
+ .spin-button:hover:not(:disabled) {
161
+ transform: translateY(-3px);
162
+ box-shadow: 0 12px 30px rgba(99, 102, 241, 0.4), inset 0 1px 0 rgba(255, 255, 255, 0.4);
163
+ }
164
+
165
+ .spin-button:active:not(:disabled) {
166
+ transform: translateY(1px);
167
+ box-shadow: 0 4px 15px rgba(99, 102, 241, 0.2);
168
+ }
169
+
170
+ .spin-button:disabled {
171
+ opacity: 0.5;
172
+ cursor: not-allowed;
173
+ box-shadow: none;
174
+ transform: none;
175
+ }
176
+
177
+ .tab-container {
178
+ display: flex;
179
+ flex-direction: column;
180
+ height: 100%;
181
+ background: var(--bg-page);
182
+ border: 1px solid var(--border-color);
183
+ border-radius: 1.75rem;
184
+ padding: 1.5rem;
185
+ box-shadow: inset 0 4px 15px rgba(0, 0, 0, 0.02);
186
+ }
187
+
188
+ .tab-headers {
189
+ display: flex;
190
+ gap: 0.25rem;
191
+ margin-bottom: 1.5rem;
192
+ background: var(--bg-surface);
193
+ padding: 0.35rem;
194
+ border-radius: 0.85rem;
195
+ border: 1px solid var(--border-color);
196
+ }
197
+
198
+ .tab-header {
199
+ flex: 1;
200
+ padding: 0.65rem 1rem;
201
+ font-size: 0.85rem;
202
+ font-weight: 800;
203
+ color: var(--text-muted);
204
+ background: transparent;
205
+ border: none;
206
+ cursor: pointer;
207
+ border-radius: 0.6rem;
208
+ transition: all 0.25s cubic-bezier(0.16, 1, 0.3, 1);
209
+ text-transform: uppercase;
210
+ letter-spacing: 0.06em;
211
+ text-align: center;
212
+ }
213
+
214
+ .tab-header:hover {
215
+ color: var(--text-base);
216
+ }
217
+
218
+ .tab-header.active {
219
+ color: var(--color-white);
220
+ background: var(--wheel-accent);
221
+ box-shadow: 0 4px 12px var(--wheel-glow);
222
+ }
223
+
224
+ .tab-pane {
225
+ display: none;
226
+ }
227
+
228
+ .tab-pane.active {
229
+ display: block;
230
+ animation: tab-fade-in 0.35s cubic-bezier(0.16, 1, 0.3, 1);
231
+ }
232
+
233
+ @keyframes tab-fade-in {
234
+ from {
235
+ opacity: 0;
236
+ transform: translateY(8px);
237
+ }
238
+ to {
239
+ opacity: 1;
240
+ transform: translateY(0);
241
+ }
242
+ }
243
+
244
+ .editor-card {
245
+ background: transparent;
246
+ border: none;
247
+ padding: 0;
248
+ display: flex;
249
+ flex-direction: column;
250
+ gap: 1.25rem;
251
+ box-shadow: none;
252
+ }
253
+
254
+ .editor-label {
255
+ font-size: 0.8rem;
256
+ font-weight: 950;
257
+ color: var(--text-muted);
258
+ text-transform: uppercase;
259
+ letter-spacing: 0.12em;
260
+ }
261
+
262
+ .preset-group {
263
+ display: grid;
264
+ grid-template-columns: repeat(auto-fit, minmax(90px, 1fr));
265
+ gap: 0.5rem;
266
+ }
267
+
268
+ .preset-btn {
269
+ padding: 0.55rem 0.75rem;
270
+ border: 1px solid var(--border-color);
271
+ border-radius: 0.6rem;
272
+ background: var(--bg-surface);
273
+ color: var(--text-base);
274
+ font-size: 0.8rem;
275
+ font-weight: 700;
276
+ cursor: pointer;
277
+ transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
278
+ text-align: center;
279
+ }
280
+
281
+ .preset-btn:hover {
282
+ background: var(--wheel-accent);
283
+ color: var(--color-white);
284
+ border-color: var(--wheel-accent);
285
+ transform: translateY(-2px);
286
+ box-shadow: 0 4px 12px var(--wheel-glow);
287
+ }
288
+
289
+ .segment-list {
290
+ display: flex;
291
+ flex-direction: column;
292
+ gap: 0.65rem;
293
+ max-height: 280px;
294
+ overflow-y: auto;
295
+ padding-right: 0.25rem;
296
+ }
297
+
298
+ .segment-list::-webkit-scrollbar {
299
+ width: 5px;
300
+ }
301
+
302
+ .segment-list::-webkit-scrollbar-thumb {
303
+ background: var(--border-color);
304
+ border-radius: 5px;
305
+ }
306
+
307
+ .segment-row {
308
+ display: flex;
309
+ align-items: center;
310
+ gap: 0.65rem;
311
+ background: var(--bg-surface);
312
+ border: 1px solid var(--border-color);
313
+ border-left: 5px solid var(--wheel-accent);
314
+ border-radius: 0.85rem;
315
+ padding: 0.6rem 0.85rem;
316
+ transition: all 0.25s cubic-bezier(0.16, 1, 0.3, 1);
317
+ animation: seg-slide-in 0.3s cubic-bezier(0.16, 1, 0.3, 1);
318
+ }
319
+
320
+ .segment-row:hover {
321
+ transform: translateY(-2px);
322
+ box-shadow: 0 6px 15px rgba(0, 0, 0, 0.03);
323
+ border-left-color: #ffe066;
324
+ }
325
+
326
+ @keyframes seg-slide-in {
327
+ 0% {
328
+ opacity: 0;
329
+ transform: translateY(6px);
330
+ }
331
+ 100% {
332
+ opacity: 1;
333
+ transform: translateY(0);
334
+ }
335
+ }
336
+
337
+ .segment-color {
338
+ width: 1.85rem;
339
+ height: 1.85rem;
340
+ border: 2px solid var(--border-color);
341
+ border-radius: 50%;
342
+ padding: 0;
343
+ cursor: pointer;
344
+ flex-shrink: 0;
345
+ background: transparent;
346
+ box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1);
347
+ transition: transform 0.2s ease;
348
+ }
349
+
350
+ .segment-color:hover {
351
+ transform: scale(1.12);
352
+ }
353
+
354
+ .segment-input {
355
+ flex: 1;
356
+ padding: 0.5rem 0.85rem;
357
+ border: 1px solid var(--border-color);
358
+ border-radius: 0.6rem;
359
+ background: var(--bg-page);
360
+ color: var(--text-base);
361
+ font-weight: 700;
362
+ font-size: 0.85rem;
363
+ min-width: 0;
364
+ transition: all 0.2s ease;
365
+ }
366
+
367
+ .segment-input:focus {
368
+ outline: none;
369
+ border-color: var(--wheel-accent);
370
+ box-shadow: 0 0 0 2.5px rgba(99, 102, 241, 0.12);
371
+ }
372
+
373
+ .segment-weight {
374
+ width: 3.85rem;
375
+ padding: 0.5rem 0.25rem;
376
+ border: 1px solid var(--border-color);
377
+ border-radius: 0.6rem;
378
+ background: var(--bg-page);
379
+ color: var(--text-base);
380
+ font-weight: 800;
381
+ font-size: 0.85rem;
382
+ text-align: center;
383
+ cursor: pointer;
384
+ flex-shrink: 0;
385
+ transition: all 0.2s ease;
386
+ }
387
+
388
+ .segment-weight:focus {
389
+ outline: none;
390
+ border-color: var(--wheel-accent);
391
+ box-shadow: 0 0 0 2.5px rgba(99, 102, 241, 0.12);
392
+ }
393
+
394
+ .btn-remove-segment {
395
+ background: none;
396
+ border: none;
397
+ color: var(--text-muted);
398
+ font-size: 0.75rem;
399
+ font-weight: 900;
400
+ cursor: pointer;
401
+ padding: 0.25rem 0.5rem;
402
+ transition: all 0.2s ease;
403
+ text-transform: uppercase;
404
+ letter-spacing: 0.06em;
405
+ }
406
+
407
+ .btn-remove-segment:hover {
408
+ color: var(--wheel-danger);
409
+ }
410
+
411
+ .btn-add-segment {
412
+ width: 100%;
413
+ padding: 0.85rem;
414
+ border: 2px dashed var(--border-color);
415
+ border-radius: 0.85rem;
416
+ background: transparent;
417
+ color: var(--text-muted);
418
+ font-size: 0.85rem;
419
+ font-weight: 800;
420
+ cursor: pointer;
421
+ transition: all 0.25s ease;
422
+ letter-spacing: 0.06em;
423
+ }
424
+
425
+ .btn-add-segment:hover {
426
+ border-color: var(--wheel-accent);
427
+ color: var(--text-base);
428
+ background: rgba(99, 102, 241, 0.04);
429
+ }
430
+
431
+ .result-section {
432
+ display: flex;
433
+ justify-content: center;
434
+ width: 100%;
435
+ }
436
+
437
+ .result-display {
438
+ width: 100%;
439
+ }
440
+
441
+ .result-placeholder {
442
+ text-align: center;
443
+ padding: 1.5rem;
444
+ color: var(--text-muted);
445
+ font-size: 0.95rem;
446
+ font-weight: 800;
447
+ letter-spacing: 0.05em;
448
+ }
449
+
450
+ .result-card {
451
+ background: var(--bg-page);
452
+ border: 1px solid var(--border-color);
453
+ border-radius: 1.5rem;
454
+ padding: 1.75rem 2.5rem;
455
+ text-align: center;
456
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.04);
457
+ animation: result-fade-in 0.45s cubic-bezier(0.34, 1.56, 0.64, 1);
458
+ position: relative;
459
+ }
460
+
461
+ @keyframes result-fade-in {
462
+ 0% {
463
+ opacity: 0;
464
+ transform: translateY(12px) scale(0.96);
465
+ }
466
+ 100% {
467
+ opacity: 1;
468
+ transform: translateY(0) scale(1);
469
+ }
470
+ }
471
+
472
+ .result-header {
473
+ font-size: 0.85rem;
474
+ font-weight: 900;
475
+ color: var(--text-muted);
476
+ text-transform: uppercase;
477
+ letter-spacing: 0.15em;
478
+ margin-bottom: 0.65rem;
479
+ }
480
+
481
+ .result-value {
482
+ font-size: 2.5rem;
483
+ font-weight: 950;
484
+ color: var(--text-base);
485
+ display: inline-flex;
486
+ align-items: center;
487
+ justify-content: center;
488
+ gap: 0.85rem;
489
+ }
490
+
491
+ .result-color-dot {
492
+ width: 1.35rem;
493
+ height: 1.35rem;
494
+ border-radius: 50%;
495
+ box-shadow: 0 0 10px currentcolor;
496
+ border: 2px solid #fff;
497
+ }
498
+
499
+ .result-emphasis {
500
+ animation: result-emphasis-pop 0.65s cubic-bezier(0.34, 1.56, 0.64, 1);
501
+ }
502
+
503
+ @keyframes result-emphasis-pop {
504
+ 0% {
505
+ transform: scale(1);
506
+ }
507
+ 50% {
508
+ transform: scale(1.04);
509
+ box-shadow: 0 12px 35px var(--wheel-glow);
510
+ }
511
+ 100% {
512
+ transform: scale(1);
513
+ }
514
+ }
515
+
516
+ .history-section {
517
+ background: transparent;
518
+ border: none;
519
+ padding: 0;
520
+ }
521
+
522
+ .history-header {
523
+ display: flex;
524
+ justify-content: space-between;
525
+ align-items: center;
526
+ border-bottom: 1.5px solid var(--border-color);
527
+ padding-bottom: 0.75rem;
528
+ margin-bottom: 1rem;
529
+ }
530
+
531
+ .history-title {
532
+ font-size: 0.9rem;
533
+ font-weight: 950;
534
+ text-transform: uppercase;
535
+ letter-spacing: 0.1em;
536
+ color: var(--text-base);
537
+ margin: 0;
538
+ }
539
+
540
+ .btn-clear-history {
541
+ background: none;
542
+ border: none;
543
+ color: var(--text-muted);
544
+ font-size: 0.8rem;
545
+ font-weight: 900;
546
+ cursor: pointer;
547
+ transition: all 0.2s ease;
548
+ text-transform: uppercase;
549
+ letter-spacing: 0.05em;
550
+ }
551
+
552
+ .btn-clear-history:hover {
553
+ color: var(--text-base);
554
+ }
555
+
556
+ .history-list {
557
+ display: flex;
558
+ flex-direction: column;
559
+ gap: 0.6rem;
560
+ max-height: 250px;
561
+ overflow-y: auto;
562
+ }
563
+
564
+ .history-list::-webkit-scrollbar {
565
+ width: 5px;
566
+ }
567
+
568
+ .history-list::-webkit-scrollbar-thumb {
569
+ background: var(--border-color);
570
+ border-radius: 5px;
571
+ }
572
+
573
+ .history-empty {
574
+ text-align: center;
575
+ padding: 2rem;
576
+ color: var(--text-muted);
577
+ font-size: 0.85rem;
578
+ font-weight: 800;
579
+ }
580
+
581
+ .history-item {
582
+ display: flex;
583
+ justify-content: space-between;
584
+ align-items: center;
585
+ background: var(--bg-surface);
586
+ border: 1px solid var(--border-color);
587
+ border-radius: 0.85rem;
588
+ padding: 0.65rem 1.15rem;
589
+ animation: history-slide-in 0.35s cubic-bezier(0.16, 1, 0.3, 1);
590
+ }
591
+
592
+ @keyframes history-slide-in {
593
+ 0% {
594
+ opacity: 0;
595
+ transform: translateY(-5px);
596
+ }
597
+ 100% {
598
+ opacity: 1;
599
+ transform: translateY(0);
600
+ }
601
+ }
602
+
603
+ .history-item-label {
604
+ font-weight: 800;
605
+ font-size: 0.9rem;
606
+ display: flex;
607
+ align-items: center;
608
+ gap: 0.5rem;
609
+ color: var(--text-base);
610
+ }
611
+
612
+ .history-item-dot {
613
+ width: 0.65rem;
614
+ height: 0.65rem;
615
+ border-radius: 50%;
616
+ display: inline-block;
617
+ border: 1.5px solid #fff;
618
+ }
619
+
620
+ .history-item-time {
621
+ font-weight: 700;
622
+ font-size: 0.8rem;
623
+ color: var(--text-muted);
624
+ }
625
+
626
+ .no-segments-msg {
627
+ text-align: center;
628
+ padding: 2rem;
629
+ color: var(--text-muted);
630
+ font-size: 0.85rem;
631
+ font-weight: 800;
632
+ }