@jjlmoya/utils-tabletop 1.11.0 → 1.13.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 (35) hide show
  1. package/package.json +1 -1
  2. package/src/entries.ts +4 -0
  3. package/src/tests/locale_completeness.test.ts +1 -1
  4. package/src/tests/tool_validation.test.ts +1 -1
  5. package/src/tool/dice-roller-simulator/component.astro +116 -26
  6. package/src/tool/scatter-direction-selector/animation.ts +278 -0
  7. package/src/tool/scatter-direction-selector/bibliography.astro +16 -0
  8. package/src/tool/scatter-direction-selector/bibliography.ts +12 -0
  9. package/src/tool/scatter-direction-selector/client.ts +293 -0
  10. package/src/tool/scatter-direction-selector/component.astro +183 -0
  11. package/src/tool/scatter-direction-selector/entry.ts +59 -0
  12. package/src/tool/scatter-direction-selector/history.ts +71 -0
  13. package/src/tool/scatter-direction-selector/i18n/de.ts +143 -0
  14. package/src/tool/scatter-direction-selector/i18n/en.ts +231 -0
  15. package/src/tool/scatter-direction-selector/i18n/es.ts +143 -0
  16. package/src/tool/scatter-direction-selector/i18n/fr.ts +143 -0
  17. package/src/tool/scatter-direction-selector/i18n/id.ts +143 -0
  18. package/src/tool/scatter-direction-selector/i18n/it.ts +143 -0
  19. package/src/tool/scatter-direction-selector/i18n/ja.ts +143 -0
  20. package/src/tool/scatter-direction-selector/i18n/ko.ts +143 -0
  21. package/src/tool/scatter-direction-selector/i18n/nl.ts +143 -0
  22. package/src/tool/scatter-direction-selector/i18n/pl.ts +143 -0
  23. package/src/tool/scatter-direction-selector/i18n/pt.ts +143 -0
  24. package/src/tool/scatter-direction-selector/i18n/ru.ts +143 -0
  25. package/src/tool/scatter-direction-selector/i18n/sv.ts +143 -0
  26. package/src/tool/scatter-direction-selector/i18n/tr.ts +143 -0
  27. package/src/tool/scatter-direction-selector/i18n/zh.ts +143 -0
  28. package/src/tool/scatter-direction-selector/index.ts +10 -0
  29. package/src/tool/scatter-direction-selector/logic.test.ts +62 -0
  30. package/src/tool/scatter-direction-selector/logic.ts +52 -0
  31. package/src/tool/scatter-direction-selector/scatter-direction-selector.css +809 -0
  32. package/src/tool/scatter-direction-selector/seo.astro +16 -0
  33. package/src/tool/scatter-direction-selector/settings.ts +81 -0
  34. package/src/tool/scatter-direction-selector/sound.ts +22 -0
  35. package/src/tools.ts +2 -0
@@ -0,0 +1,809 @@
1
+ .theme-light {
2
+ --sds-accent: #0369a1;
3
+ --sds-accent-rgb: 3, 105, 161;
4
+ --sds-glow-inner: #0284c7;
5
+ --sds-glow-outer: #0ea5e9;
6
+ --sds-border-glow: rgba(3, 105, 161, 0.2);
7
+ --sds-success: #059669;
8
+ --sds-success-rgb: 5, 150, 105;
9
+ --sds-success-glow: rgba(5, 150, 105, 0.25);
10
+ --sds-danger: #dc2626;
11
+ --sds-danger-rgb: 220, 38, 38;
12
+ --sds-danger-glow: rgba(220, 38, 38, 0.25);
13
+ --sds-compass-center: #f1f5f9;
14
+ --sds-center-text: #0f172a;
15
+ --sds-center-muted: #475569;
16
+ }
17
+
18
+ .theme-dark {
19
+ --sds-accent: #38bdf8;
20
+ --sds-accent-rgb: 56, 189, 248;
21
+ --sds-glow-inner: #7dd3fc;
22
+ --sds-glow-outer: #38bdf8;
23
+ --sds-border-glow: rgba(56, 189, 248, 0.25);
24
+ --sds-success: #34d399;
25
+ --sds-success-rgb: 52, 211, 153;
26
+ --sds-success-glow: rgba(52, 211, 153, 0.35);
27
+ --sds-danger: #f87171;
28
+ --sds-danger-rgb: 248, 113, 113;
29
+ --sds-danger-glow: rgba(248, 113, 113, 0.35);
30
+ --sds-compass-center: #0b0e18;
31
+ --sds-center-text: #f0f6ff;
32
+ --sds-center-muted: #94a3b8;
33
+ }
34
+
35
+ .sds-container {
36
+ position: relative;
37
+ width: 100%;
38
+ max-width: 1000px;
39
+ margin: 0 auto;
40
+ background: var(--bg-surface);
41
+ color: var(--text-base);
42
+ font: 400 1rem/1.5 Inter, system-ui, sans-serif;
43
+ border-radius: 20px;
44
+ border: 1px solid var(--border-color);
45
+ padding: 2rem;
46
+ overflow: hidden;
47
+ box-shadow: 0 20px 50px rgba(0, 0, 0, 0.15);
48
+ }
49
+
50
+ .sds-particles-canvas {
51
+ position: absolute;
52
+ top: 0;
53
+ left: 0;
54
+ width: 100%;
55
+ height: 100%;
56
+ pointer-events: none;
57
+ z-index: 0;
58
+ }
59
+
60
+ .sds-header {
61
+ position: relative;
62
+ z-index: 1;
63
+ display: flex;
64
+ justify-content: space-between;
65
+ align-items: center;
66
+ margin-bottom: 2rem;
67
+ border-bottom: 1px solid var(--border-color);
68
+ padding-bottom: 1rem;
69
+ }
70
+
71
+ .sds-title {
72
+ font: 800 1.8rem Orbitron, Outfit, sans-serif;
73
+ background: linear-gradient(135deg, var(--text-base) 30%, var(--sds-accent) 100%);
74
+ -webkit-background-clip: text;
75
+ -webkit-text-fill-color: transparent;
76
+ margin: 0;
77
+ letter-spacing: 1px;
78
+ }
79
+
80
+ .sds-subtitle {
81
+ font-size: 0.875rem;
82
+ color: var(--text-muted);
83
+ margin: 0.25rem 0 0;
84
+ }
85
+
86
+ .sds-sound-btn {
87
+ background: var(--bg-page);
88
+ border: 1px solid var(--border-color);
89
+ color: var(--text-base);
90
+ width: 40px;
91
+ height: 40px;
92
+ border-radius: 50%;
93
+ cursor: pointer;
94
+ display: flex;
95
+ align-items: center;
96
+ justify-content: center;
97
+ transition: transform 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275), background 0.2s, border-color 0.2s;
98
+ }
99
+
100
+ .sds-sound-btn:hover {
101
+ transform: scale(1.1);
102
+ background: var(--bg-surface);
103
+ border-color: var(--sds-accent);
104
+ }
105
+
106
+ .sds-sound-btn:active {
107
+ transform: scale(0.95);
108
+ }
109
+
110
+ .sds-grid {
111
+ position: relative;
112
+ z-index: 1;
113
+ display: grid;
114
+ grid-template-columns: 1.2fr 1fr;
115
+ gap: 2.5rem;
116
+ align-items: start;
117
+ }
118
+
119
+ @media (max-width: 768px) {
120
+ .sds-grid {
121
+ grid-template-columns: 1fr;
122
+ gap: 2rem;
123
+ }
124
+ }
125
+
126
+ .sds-compass-area {
127
+ display: flex;
128
+ flex-direction: column;
129
+ align-items: center;
130
+ justify-content: center;
131
+ padding: 1.5rem 0;
132
+ }
133
+
134
+ .sds-compass-wrapper {
135
+ position: relative;
136
+ width: 300px;
137
+ height: 300px;
138
+ margin: 0 auto;
139
+ }
140
+
141
+ .sds-compass {
142
+ position: relative;
143
+ width: 100%;
144
+ height: 100%;
145
+ border-radius: 50%;
146
+ touch-action: none;
147
+ cursor: grab;
148
+ }
149
+
150
+ .sds-compass:active {
151
+ cursor: grabbing;
152
+ }
153
+
154
+ .sds-compass-ring {
155
+ position: absolute;
156
+ top: 0;
157
+ left: 0;
158
+ width: 100%;
159
+ height: 100%;
160
+ border-radius: 50%;
161
+ border: 4px solid var(--border-color);
162
+ box-shadow: 0 0 20px rgba(var(--sds-accent-rgb), 0.05), inset 0 0 20px rgba(var(--sds-accent-rgb), 0.05);
163
+ pointer-events: none;
164
+ transition: border-color 0.3s;
165
+ }
166
+
167
+ .sds-compass:hover .sds-compass-ring {
168
+ border-color: rgba(var(--sds-accent-rgb), 0.3);
169
+ }
170
+
171
+ .sds-compass-svg {
172
+ position: absolute;
173
+ top: 0;
174
+ left: 0;
175
+ width: 100%;
176
+ height: 100%;
177
+ pointer-events: none;
178
+ }
179
+
180
+ .sds-pointer {
181
+ position: absolute;
182
+ top: 0;
183
+ left: 0;
184
+ width: 100%;
185
+ height: 100%;
186
+ pointer-events: none;
187
+ transform: rotate(0deg);
188
+ transform-origin: center center;
189
+ transition: transform 0.6s cubic-bezier(0.25, 0.8, 0.25, 1.25);
190
+ }
191
+
192
+ .sds-pointer-wind {
193
+ opacity: 0.55;
194
+ }
195
+
196
+ .sds-pointer-scatter {
197
+ filter: drop-shadow(0 0 6px rgba(var(--sds-danger-rgb), 0.8));
198
+ animation: sds-scatter-arrive 0.5s cubic-bezier(0.34, 1.56, 0.64, 1) both;
199
+ }
200
+
201
+ @keyframes sds-scatter-arrive {
202
+ from {
203
+ opacity: 0;
204
+ filter: drop-shadow(0 0 20px rgba(var(--sds-danger-rgb), 1));
205
+ }
206
+ to {
207
+ opacity: 1;
208
+ filter: drop-shadow(0 0 6px rgba(var(--sds-danger-rgb), 0.8));
209
+ }
210
+ }
211
+
212
+ .sds-pointer-svg {
213
+ width: 100%;
214
+ height: 100%;
215
+ }
216
+
217
+ .sds-center-core {
218
+ position: absolute;
219
+ top: 50%;
220
+ left: 50%;
221
+ transform: translate(-50%, -50%);
222
+ width: 120px;
223
+ height: 120px;
224
+ background: var(--sds-compass-center);
225
+ border: 2px solid var(--border-color);
226
+ border-radius: 50%;
227
+ display: flex;
228
+ align-items: center;
229
+ justify-content: center;
230
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.3), inset 0 0 20px rgba(var(--sds-accent-rgb), 0.08);
231
+ z-index: 2;
232
+ transition: border-color 0.3s, box-shadow 0.3s, transform 0.1s;
233
+ }
234
+
235
+ .sds-sigil {
236
+ position: absolute;
237
+ width: 76px;
238
+ height: 76px;
239
+ display: none;
240
+ align-items: center;
241
+ justify-content: center;
242
+ pointer-events: none;
243
+ opacity: 0;
244
+ transition: opacity 0.35s ease-out, transform 0.35s cubic-bezier(0.34, 1.56, 0.64, 1);
245
+ z-index: 1;
246
+ }
247
+
248
+ .sds-sigil svg {
249
+ width: 100%;
250
+ height: 100%;
251
+ }
252
+
253
+ .sds-peak-result #sds-sigil-target {
254
+ display: flex;
255
+ opacity: 1;
256
+ color: var(--sds-success);
257
+ filter: drop-shadow(0 0 6px rgba(var(--sds-success-rgb), 0.8));
258
+ animation: sds-spin-glow 20s linear infinite;
259
+ }
260
+
261
+ .sds-peak-result #sds-digital-display {
262
+ opacity: 0;
263
+ pointer-events: none;
264
+ }
265
+
266
+ .sds-warning-result #sds-sigil-warning {
267
+ display: flex;
268
+ opacity: 1;
269
+ color: var(--sds-danger);
270
+ filter: drop-shadow(0 0 6px rgba(var(--sds-danger-rgb), 0.8));
271
+ }
272
+
273
+ .sds-warning-result #sds-digital-display {
274
+ opacity: 0;
275
+ pointer-events: none;
276
+ }
277
+
278
+ @keyframes sds-spin-glow {
279
+ to { transform: rotate(360deg); }
280
+ }
281
+
282
+ .sds-digital-display {
283
+ display: flex;
284
+ flex-direction: column;
285
+ align-items: center;
286
+ justify-content: center;
287
+ font: 700 0.8rem/1 Orbitron, Outfit, sans-serif;
288
+ z-index: 2;
289
+ transition: opacity 0.25s ease-out;
290
+ }
291
+
292
+ .sds-display-status {
293
+ font-size: 0.6rem;
294
+ font-weight: 700;
295
+ letter-spacing: 2px;
296
+ color: var(--sds-center-muted, var(--text-muted));
297
+ text-transform: uppercase;
298
+ margin-bottom: 0.2rem;
299
+ transition: color 0.3s;
300
+ }
301
+
302
+ .sds-display-nums {
303
+ font-size: 1.3rem;
304
+ font-weight: 800;
305
+ color: var(--sds-center-text, var(--text-base));
306
+ text-shadow: 0 1px 4px rgba(0, 0, 0, 0.5);
307
+ transition: color 0.3s, text-shadow 0.3s;
308
+ }
309
+
310
+ .sds-control-panel {
311
+ display: flex;
312
+ flex-direction: column;
313
+ gap: 1.5rem;
314
+ }
315
+
316
+ .sds-panel-card {
317
+ background: var(--bg-page);
318
+ border: 1px solid var(--border-color);
319
+ border-radius: 16px;
320
+ padding: 1.5rem;
321
+ backdrop-filter: blur(10px);
322
+ -webkit-backdrop-filter: blur(10px);
323
+ }
324
+
325
+ .sds-panel-title {
326
+ font: 700 1.1rem Orbitron, Outfit, sans-serif;
327
+ margin: 0 0 1.25rem;
328
+ color: var(--text-base);
329
+ }
330
+
331
+ .sds-control-group {
332
+ display: flex;
333
+ flex-direction: column;
334
+ gap: 0.5rem;
335
+ margin-bottom: 1.25rem;
336
+ }
337
+
338
+ .sds-control-group:last-of-type {
339
+ margin-bottom: 1.5rem;
340
+ }
341
+
342
+ .sds-label {
343
+ font-size: 0.8rem;
344
+ font-weight: 600;
345
+ text-transform: uppercase;
346
+ letter-spacing: 1px;
347
+ color: var(--text-muted);
348
+ }
349
+
350
+ .sds-segmented-control {
351
+ display: flex;
352
+ background: var(--bg-surface);
353
+ border: 1px solid var(--border-color);
354
+ border-radius: 8px;
355
+ padding: 0.25rem;
356
+ }
357
+
358
+ .sds-segment-btn {
359
+ flex: 1;
360
+ background: none;
361
+ border: none;
362
+ color: var(--text-muted);
363
+ font-size: 0.8rem;
364
+ font-weight: 600;
365
+ padding: 0.5rem;
366
+ cursor: pointer;
367
+ border-radius: 6px;
368
+ transition: color 0.2s, background 0.2s, transform 0.1s;
369
+ }
370
+
371
+ .sds-segment-btn:hover {
372
+ color: var(--text-base);
373
+ }
374
+
375
+ .sds-segment-btn.active {
376
+ background: var(--bg-page);
377
+ color: var(--sds-accent);
378
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.05);
379
+ }
380
+
381
+ .sds-select-wrapper {
382
+ position: relative;
383
+ width: 100%;
384
+ }
385
+
386
+ .sds-select {
387
+ width: 100%;
388
+ background: var(--bg-surface);
389
+ border: 1px solid var(--border-color);
390
+ color: var(--text-base);
391
+ font-size: 0.85rem;
392
+ font-weight: 600;
393
+ padding: 0.7rem 2.5rem 0.7rem 1rem;
394
+ border-radius: 10px;
395
+ outline: none;
396
+ cursor: pointer;
397
+ appearance: none;
398
+ letter-spacing: 0.3px;
399
+ box-shadow: inset 0 1px 3px rgba(0, 0, 0, 0.08);
400
+ transition: border-color 0.2s, box-shadow 0.25s, background 0.2s;
401
+ }
402
+
403
+ .sds-select:hover {
404
+ border-color: var(--sds-accent);
405
+ background: var(--bg-page);
406
+ }
407
+
408
+ .sds-select:focus {
409
+ border-color: var(--sds-accent);
410
+ box-shadow: 0 0 0 3px rgba(var(--sds-accent-rgb), 0.12), inset 0 1px 3px rgba(0, 0, 0, 0.08);
411
+ }
412
+
413
+ .sds-select option {
414
+ background: var(--bg-surface);
415
+ color: var(--text-base);
416
+ font-weight: 500;
417
+ padding: 0.5rem;
418
+ }
419
+
420
+ .sds-select-wrapper::after {
421
+ content: '\25BC';
422
+ position: absolute;
423
+ right: 0.85rem;
424
+ top: 50%;
425
+ transform: translateY(-50%);
426
+ font-size: 0.55rem;
427
+ color: var(--sds-accent);
428
+ pointer-events: none;
429
+ opacity: 0.7;
430
+ transition: opacity 0.2s, transform 0.2s;
431
+ }
432
+
433
+ .sds-select-wrapper:hover::after {
434
+ opacity: 1;
435
+ transform: translateY(-50%) scale(1.1);
436
+ }
437
+
438
+ .sds-input {
439
+ background: var(--bg-surface);
440
+ border: 1px solid var(--border-color);
441
+ color: var(--text-base);
442
+ font-size: 0.9rem;
443
+ padding: 0.65rem 1rem;
444
+ border-radius: 8px;
445
+ outline: none;
446
+ transition: border-color 0.2s, box-shadow 0.2s;
447
+ }
448
+
449
+ .sds-input:hover {
450
+ border-color: var(--sds-accent);
451
+ }
452
+
453
+ .sds-input:focus {
454
+ border-color: var(--sds-accent);
455
+ box-shadow: 0 0 10px rgba(var(--sds-accent-rgb), 0.15);
456
+ }
457
+
458
+ .sds-label-row {
459
+ display: flex;
460
+ justify-content: space-between;
461
+ align-items: center;
462
+ }
463
+
464
+ .sds-value-display {
465
+ font: 700 0.9rem Orbitron, Outfit, sans-serif;
466
+ color: var(--sds-accent);
467
+ }
468
+
469
+ .sds-slider {
470
+ width: 100%;
471
+ height: 6px;
472
+ border-radius: 3px;
473
+ background: var(--border-color);
474
+ outline: none;
475
+ margin: 0.5rem 0;
476
+ cursor: pointer;
477
+ appearance: none;
478
+ }
479
+
480
+ .sds-slider::-webkit-slider-thumb {
481
+ appearance: none;
482
+ width: 16px;
483
+ height: 16px;
484
+ border-radius: 50%;
485
+ background: var(--sds-accent);
486
+ box-shadow: 0 0 10px rgba(var(--sds-accent-rgb), 0.5);
487
+ transition: transform 0.1s;
488
+ }
489
+
490
+ .sds-slider::-webkit-slider-thumb:hover {
491
+ transform: scale(1.2);
492
+ }
493
+
494
+ .sds-btn-primary {
495
+ position: relative;
496
+ width: 100%;
497
+ background: linear-gradient(135deg, var(--sds-accent), var(--sds-glow-inner));
498
+ border: none;
499
+ color: var(--sds-compass-center);
500
+ font: 700 1rem Orbitron, Outfit, sans-serif;
501
+ letter-spacing: 1px;
502
+ padding: 1rem;
503
+ border-radius: 10px;
504
+ cursor: pointer;
505
+ display: flex;
506
+ align-items: center;
507
+ justify-content: center;
508
+ overflow: hidden;
509
+ transition: transform 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275), box-shadow 0.2s;
510
+ }
511
+
512
+ .sds-btn-primary:hover {
513
+ transform: translateY(-2px);
514
+ box-shadow: 0 10px 20px rgba(var(--sds-accent-rgb), 0.3);
515
+ }
516
+
517
+ .sds-btn-primary:active {
518
+ transform: translateY(1px);
519
+ }
520
+
521
+ .sds-btn-glow {
522
+ position: absolute;
523
+ top: 0;
524
+ left: 0;
525
+ width: 100%;
526
+ height: 100%;
527
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);
528
+ transform: translateX(-100%);
529
+ }
530
+
531
+ .sds-btn-primary:hover .sds-btn-glow {
532
+ animation: sds-shimmer 1.5s infinite;
533
+ }
534
+
535
+ @keyframes sds-shimmer {
536
+ 100% {
537
+ transform: translateX(100%);
538
+ }
539
+ }
540
+
541
+ .sds-header-row {
542
+ display: flex;
543
+ justify-content: space-between;
544
+ align-items: center;
545
+ margin-bottom: 1rem;
546
+ }
547
+
548
+ .sds-btn-secondary {
549
+ background: none;
550
+ border: none;
551
+ color: var(--text-muted);
552
+ font-size: 0.75rem;
553
+ font-weight: 600;
554
+ text-transform: uppercase;
555
+ cursor: pointer;
556
+ padding: 0.25rem 0.5rem;
557
+ border-radius: 4px;
558
+ transition: color 0.2s, background 0.2s;
559
+ }
560
+
561
+ .sds-btn-secondary:hover {
562
+ color: var(--text-base);
563
+ background: var(--bg-surface);
564
+ }
565
+
566
+ .sds-history-list {
567
+ display: flex;
568
+ flex-direction: column;
569
+ gap: 0.75rem;
570
+ max-height: 160px;
571
+ overflow-y: auto;
572
+ }
573
+
574
+ .sds-history-item {
575
+ display: flex;
576
+ justify-content: space-between;
577
+ align-items: center;
578
+ background: var(--bg-surface);
579
+ border: 1px solid var(--border-color);
580
+ border-radius: 8px;
581
+ padding: 0.5rem 0.75rem;
582
+ font-size: 0.8rem;
583
+ animation: sds-slide-in 0.3s ease-out;
584
+ }
585
+
586
+ @keyframes sds-slide-in {
587
+ from {
588
+ opacity: 0;
589
+ transform: translateY(-5px);
590
+ }
591
+ to {
592
+ opacity: 1;
593
+ transform: translateY(0);
594
+ }
595
+ }
596
+
597
+ .sds-history-badge {
598
+ font: 700 0.7rem Orbitron, Outfit, sans-serif;
599
+ padding: 0.2rem 0.5rem;
600
+ border-radius: 4px;
601
+ text-transform: uppercase;
602
+ }
603
+
604
+ .sds-history-badge.hit {
605
+ background: rgba(16, 185, 129, 0.1);
606
+ color: var(--sds-success);
607
+ border: 1px solid rgba(16, 185, 129, 0.2);
608
+ }
609
+
610
+ .sds-history-badge.scatter {
611
+ background: rgba(var(--sds-accent-rgb), 0.1);
612
+ color: var(--sds-accent);
613
+ border: 1px solid rgba(var(--sds-accent-rgb), 0.2);
614
+ }
615
+
616
+ .sds-history-val {
617
+ color: var(--text-base);
618
+ font-weight: 600;
619
+ }
620
+
621
+ .sds-history-time {
622
+ color: var(--text-muted);
623
+ font-size: 0.7rem;
624
+ }
625
+
626
+ .sds-peak-result {
627
+ animation: sds-pulse-glow 0.8s ease-out infinite alternate;
628
+ border-color: var(--sds-success);
629
+ box-shadow: 0 0 20px var(--sds-success-glow);
630
+ }
631
+
632
+ .sds-peak-display-nums {
633
+ color: var(--sds-success);
634
+ text-shadow: 0 0 12px rgba(var(--sds-success-rgb), 0.7);
635
+ }
636
+
637
+ .sds-peak-display-status {
638
+ color: var(--sds-success);
639
+ }
640
+
641
+ .sds-warning-result {
642
+ animation: sds-shiver 0.5s ease-in-out;
643
+ border-color: var(--sds-danger);
644
+ box-shadow: 0 0 20px var(--sds-danger-glow);
645
+ }
646
+
647
+ .sds-warning-display-nums {
648
+ color: var(--sds-danger);
649
+ text-shadow: 0 0 12px rgba(var(--sds-danger-rgb), 0.7);
650
+ }
651
+
652
+ .sds-warning-display-status {
653
+ color: var(--sds-danger);
654
+ }
655
+
656
+ @keyframes sds-pulse-glow {
657
+ 0% {
658
+ transform: translate(-50%, -50%) scale(1);
659
+ }
660
+ 100% {
661
+ transform: translate(-50%, -50%) scale(1.08);
662
+ }
663
+ }
664
+
665
+ @keyframes sds-shiver {
666
+ 0%, 100% { transform: translate(-50%, -50%) rotate(0deg); }
667
+ 20%, 60% { transform: translate(-50%, -50%) rotate(-3deg) scale(0.95); }
668
+ 40%, 80% { transform: translate(-50%, -50%) rotate(3deg) scale(0.95); }
669
+ }
670
+
671
+ .sds-click-particle {
672
+ position: absolute;
673
+ pointer-events: none;
674
+ font: 800 0.9rem Orbitron, Outfit, sans-serif;
675
+ color: var(--sds-accent);
676
+ text-shadow: 0 0 8px var(--sds-accent);
677
+ z-index: 9999;
678
+ animation: sds-particle-fade 0.8s ease-out forwards;
679
+ }
680
+
681
+ @keyframes sds-particle-fade {
682
+ 0% {
683
+ opacity: 1;
684
+ transform: translate(-50%, -50%) scale(1) translateY(0);
685
+ }
686
+ 100% {
687
+ opacity: 0;
688
+ transform: translate(-50%, -50%) scale(0.6) translateY(-40px);
689
+ }
690
+ }
691
+
692
+ .sds-mode-hint {
693
+ font-size: 0.7rem;
694
+ color: var(--sds-accent);
695
+ margin-top: 0.35rem;
696
+ line-height: 1.4;
697
+ opacity: 0.85;
698
+ }
699
+
700
+ .sds-guide {
701
+ list-style: none;
702
+ margin: 1.25rem 0 0;
703
+ padding: 0;
704
+ display: flex;
705
+ flex-direction: column;
706
+ gap: 0.5rem;
707
+ width: 100%;
708
+ }
709
+
710
+ .sds-guide-step {
711
+ display: flex;
712
+ align-items: center;
713
+ gap: 0.625rem;
714
+ background: var(--bg-page);
715
+ border: 1px solid var(--border-color);
716
+ border-radius: 10px;
717
+ padding: 0.5rem 0.75rem;
718
+ transition: border-color 0.2s;
719
+ }
720
+
721
+ .sds-guide-step:hover {
722
+ border-color: rgba(var(--sds-accent-rgb), 0.4);
723
+ }
724
+
725
+ .sds-guide-num {
726
+ flex-shrink: 0;
727
+ width: 20px;
728
+ height: 20px;
729
+ border-radius: 50%;
730
+ background: rgba(var(--sds-accent-rgb), 0.15);
731
+ border: 1px solid rgba(var(--sds-accent-rgb), 0.35);
732
+ color: var(--sds-accent);
733
+ font: 800 0.65rem Orbitron, Outfit, sans-serif;
734
+ display: flex;
735
+ align-items: center;
736
+ justify-content: center;
737
+ }
738
+
739
+ .sds-guide-icon {
740
+ flex-shrink: 0;
741
+ width: 14px;
742
+ height: 14px;
743
+ color: var(--text-muted);
744
+ stroke-width: 2;
745
+ }
746
+
747
+ .sds-guide-label {
748
+ font-size: 0.75rem;
749
+ font-weight: 600;
750
+ color: var(--text-muted);
751
+ line-height: 1.4;
752
+ }
753
+
754
+ .sds-guide-step-block {
755
+ align-items: flex-start;
756
+ padding-top: 0.625rem;
757
+ padding-bottom: 0.625rem;
758
+ }
759
+
760
+ .sds-guide-step-block .sds-guide-num,
761
+ .sds-guide-step-block .sds-guide-icon {
762
+ margin-top: 2px;
763
+ }
764
+
765
+ .sds-guide-outcomes {
766
+ display: flex;
767
+ flex-direction: column;
768
+ gap: 0.35rem;
769
+ flex: 1;
770
+ }
771
+
772
+ .sds-guide-outcome {
773
+ display: flex;
774
+ align-items: flex-start;
775
+ gap: 0.4rem;
776
+ font-size: 0.72rem;
777
+ font-weight: 600;
778
+ line-height: 1.4;
779
+ color: var(--text-muted);
780
+ }
781
+
782
+ .sds-guide-dot {
783
+ flex-shrink: 0;
784
+ width: 7px;
785
+ height: 7px;
786
+ border-radius: 50%;
787
+ margin-top: 4px;
788
+ }
789
+
790
+ .sds-guide-dot-hit {
791
+ background: var(--sds-success);
792
+ box-shadow: 0 0 5px rgba(var(--sds-success-rgb), 0.6);
793
+ }
794
+
795
+ .sds-guide-dot-scatter {
796
+ background: var(--sds-accent);
797
+ box-shadow: 0 0 5px rgba(var(--sds-accent-rgb), 0.5);
798
+ }
799
+
800
+ .sds-anim-canvas {
801
+ position: absolute;
802
+ top: 0;
803
+ left: 0;
804
+ width: 100%;
805
+ height: 100%;
806
+ pointer-events: none;
807
+ z-index: 5;
808
+ border-radius: 50%;
809
+ }