@jjlmoya/utils-tabletop 1.11.0 → 1.12.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 +296 -0
  10. package/src/tool/scatter-direction-selector/component.astro +184 -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 +794 -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,794 @@
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.9rem;
392
+ padding: 0.65rem 1rem;
393
+ border-radius: 8px;
394
+ outline: none;
395
+ cursor: pointer;
396
+ appearance: none;
397
+ transition: border-color 0.2s, box-shadow 0.2s;
398
+ }
399
+
400
+ .sds-select:hover {
401
+ border-color: var(--sds-accent);
402
+ }
403
+
404
+ .sds-select:focus {
405
+ border-color: var(--sds-accent);
406
+ box-shadow: 0 0 10px rgba(var(--sds-accent-rgb), 0.15);
407
+ }
408
+
409
+ .sds-select-wrapper::after {
410
+ content: '';
411
+ position: absolute;
412
+ right: 1rem;
413
+ top: 50%;
414
+ transform: translateY(-50%);
415
+ width: 0;
416
+ height: 0;
417
+ border-left: 5px solid transparent;
418
+ border-right: 5px solid transparent;
419
+ border-top: 5px solid var(--text-muted);
420
+ pointer-events: none;
421
+ }
422
+
423
+ .sds-input {
424
+ background: var(--bg-surface);
425
+ border: 1px solid var(--border-color);
426
+ color: var(--text-base);
427
+ font-size: 0.9rem;
428
+ padding: 0.65rem 1rem;
429
+ border-radius: 8px;
430
+ outline: none;
431
+ transition: border-color 0.2s, box-shadow 0.2s;
432
+ }
433
+
434
+ .sds-input:hover {
435
+ border-color: var(--sds-accent);
436
+ }
437
+
438
+ .sds-input:focus {
439
+ border-color: var(--sds-accent);
440
+ box-shadow: 0 0 10px rgba(var(--sds-accent-rgb), 0.15);
441
+ }
442
+
443
+ .sds-label-row {
444
+ display: flex;
445
+ justify-content: space-between;
446
+ align-items: center;
447
+ }
448
+
449
+ .sds-value-display {
450
+ font: 700 0.9rem Orbitron, Outfit, sans-serif;
451
+ color: var(--sds-accent);
452
+ }
453
+
454
+ .sds-slider {
455
+ width: 100%;
456
+ height: 6px;
457
+ border-radius: 3px;
458
+ background: var(--border-color);
459
+ outline: none;
460
+ margin: 0.5rem 0;
461
+ cursor: pointer;
462
+ appearance: none;
463
+ }
464
+
465
+ .sds-slider::-webkit-slider-thumb {
466
+ appearance: none;
467
+ width: 16px;
468
+ height: 16px;
469
+ border-radius: 50%;
470
+ background: var(--sds-accent);
471
+ box-shadow: 0 0 10px rgba(var(--sds-accent-rgb), 0.5);
472
+ transition: transform 0.1s;
473
+ }
474
+
475
+ .sds-slider::-webkit-slider-thumb:hover {
476
+ transform: scale(1.2);
477
+ }
478
+
479
+ .sds-btn-primary {
480
+ position: relative;
481
+ width: 100%;
482
+ background: linear-gradient(135deg, var(--sds-accent), var(--sds-glow-inner));
483
+ border: none;
484
+ color: var(--sds-compass-center);
485
+ font: 700 1rem Orbitron, Outfit, sans-serif;
486
+ letter-spacing: 1px;
487
+ padding: 1rem;
488
+ border-radius: 10px;
489
+ cursor: pointer;
490
+ display: flex;
491
+ align-items: center;
492
+ justify-content: center;
493
+ overflow: hidden;
494
+ transition: transform 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275), box-shadow 0.2s;
495
+ }
496
+
497
+ .sds-btn-primary:hover {
498
+ transform: translateY(-2px);
499
+ box-shadow: 0 10px 20px rgba(var(--sds-accent-rgb), 0.3);
500
+ }
501
+
502
+ .sds-btn-primary:active {
503
+ transform: translateY(1px);
504
+ }
505
+
506
+ .sds-btn-glow {
507
+ position: absolute;
508
+ top: 0;
509
+ left: 0;
510
+ width: 100%;
511
+ height: 100%;
512
+ background: linear-gradient(90deg, transparent, rgba(255, 255, 255, 0.3), transparent);
513
+ transform: translateX(-100%);
514
+ }
515
+
516
+ .sds-btn-primary:hover .sds-btn-glow {
517
+ animation: sds-shimmer 1.5s infinite;
518
+ }
519
+
520
+ @keyframes sds-shimmer {
521
+ 100% {
522
+ transform: translateX(100%);
523
+ }
524
+ }
525
+
526
+ .sds-header-row {
527
+ display: flex;
528
+ justify-content: space-between;
529
+ align-items: center;
530
+ margin-bottom: 1rem;
531
+ }
532
+
533
+ .sds-btn-secondary {
534
+ background: none;
535
+ border: none;
536
+ color: var(--text-muted);
537
+ font-size: 0.75rem;
538
+ font-weight: 600;
539
+ text-transform: uppercase;
540
+ cursor: pointer;
541
+ padding: 0.25rem 0.5rem;
542
+ border-radius: 4px;
543
+ transition: color 0.2s, background 0.2s;
544
+ }
545
+
546
+ .sds-btn-secondary:hover {
547
+ color: var(--text-base);
548
+ background: var(--bg-surface);
549
+ }
550
+
551
+ .sds-history-list {
552
+ display: flex;
553
+ flex-direction: column;
554
+ gap: 0.75rem;
555
+ max-height: 160px;
556
+ overflow-y: auto;
557
+ }
558
+
559
+ .sds-history-item {
560
+ display: flex;
561
+ justify-content: space-between;
562
+ align-items: center;
563
+ background: var(--bg-surface);
564
+ border: 1px solid var(--border-color);
565
+ border-radius: 8px;
566
+ padding: 0.5rem 0.75rem;
567
+ font-size: 0.8rem;
568
+ animation: sds-slide-in 0.3s ease-out;
569
+ }
570
+
571
+ @keyframes sds-slide-in {
572
+ from {
573
+ opacity: 0;
574
+ transform: translateY(-5px);
575
+ }
576
+ to {
577
+ opacity: 1;
578
+ transform: translateY(0);
579
+ }
580
+ }
581
+
582
+ .sds-history-badge {
583
+ font: 700 0.7rem Orbitron, Outfit, sans-serif;
584
+ padding: 0.2rem 0.5rem;
585
+ border-radius: 4px;
586
+ text-transform: uppercase;
587
+ }
588
+
589
+ .sds-history-badge.hit {
590
+ background: rgba(16, 185, 129, 0.1);
591
+ color: var(--sds-success);
592
+ border: 1px solid rgba(16, 185, 129, 0.2);
593
+ }
594
+
595
+ .sds-history-badge.scatter {
596
+ background: rgba(var(--sds-accent-rgb), 0.1);
597
+ color: var(--sds-accent);
598
+ border: 1px solid rgba(var(--sds-accent-rgb), 0.2);
599
+ }
600
+
601
+ .sds-history-val {
602
+ color: var(--text-base);
603
+ font-weight: 600;
604
+ }
605
+
606
+ .sds-history-time {
607
+ color: var(--text-muted);
608
+ font-size: 0.7rem;
609
+ }
610
+
611
+ .sds-peak-result {
612
+ animation: sds-pulse-glow 0.8s ease-out infinite alternate;
613
+ border-color: var(--sds-success);
614
+ box-shadow: 0 0 20px var(--sds-success-glow);
615
+ }
616
+
617
+ .sds-peak-display-nums {
618
+ color: var(--sds-success);
619
+ text-shadow: 0 0 12px rgba(var(--sds-success-rgb), 0.7);
620
+ }
621
+
622
+ .sds-peak-display-status {
623
+ color: var(--sds-success);
624
+ }
625
+
626
+ .sds-warning-result {
627
+ animation: sds-shiver 0.5s ease-in-out;
628
+ border-color: var(--sds-danger);
629
+ box-shadow: 0 0 20px var(--sds-danger-glow);
630
+ }
631
+
632
+ .sds-warning-display-nums {
633
+ color: var(--sds-danger);
634
+ text-shadow: 0 0 12px rgba(var(--sds-danger-rgb), 0.7);
635
+ }
636
+
637
+ .sds-warning-display-status {
638
+ color: var(--sds-danger);
639
+ }
640
+
641
+ @keyframes sds-pulse-glow {
642
+ 0% {
643
+ transform: translate(-50%, -50%) scale(1);
644
+ }
645
+ 100% {
646
+ transform: translate(-50%, -50%) scale(1.08);
647
+ }
648
+ }
649
+
650
+ @keyframes sds-shiver {
651
+ 0%, 100% { transform: translate(-50%, -50%) rotate(0deg); }
652
+ 20%, 60% { transform: translate(-50%, -50%) rotate(-3deg) scale(0.95); }
653
+ 40%, 80% { transform: translate(-50%, -50%) rotate(3deg) scale(0.95); }
654
+ }
655
+
656
+ .sds-click-particle {
657
+ position: absolute;
658
+ pointer-events: none;
659
+ font: 800 0.9rem Orbitron, Outfit, sans-serif;
660
+ color: var(--sds-accent);
661
+ text-shadow: 0 0 8px var(--sds-accent);
662
+ z-index: 9999;
663
+ animation: sds-particle-fade 0.8s ease-out forwards;
664
+ }
665
+
666
+ @keyframes sds-particle-fade {
667
+ 0% {
668
+ opacity: 1;
669
+ transform: translate(-50%, -50%) scale(1) translateY(0);
670
+ }
671
+ 100% {
672
+ opacity: 0;
673
+ transform: translate(-50%, -50%) scale(0.6) translateY(-40px);
674
+ }
675
+ }
676
+
677
+ .sds-mode-hint {
678
+ font-size: 0.7rem;
679
+ color: var(--sds-accent);
680
+ margin-top: 0.35rem;
681
+ line-height: 1.4;
682
+ opacity: 0.85;
683
+ }
684
+
685
+ .sds-guide {
686
+ list-style: none;
687
+ margin: 1.25rem 0 0;
688
+ padding: 0;
689
+ display: flex;
690
+ flex-direction: column;
691
+ gap: 0.5rem;
692
+ width: 100%;
693
+ }
694
+
695
+ .sds-guide-step {
696
+ display: flex;
697
+ align-items: center;
698
+ gap: 0.625rem;
699
+ background: var(--bg-page);
700
+ border: 1px solid var(--border-color);
701
+ border-radius: 10px;
702
+ padding: 0.5rem 0.75rem;
703
+ transition: border-color 0.2s;
704
+ }
705
+
706
+ .sds-guide-step:hover {
707
+ border-color: rgba(var(--sds-accent-rgb), 0.4);
708
+ }
709
+
710
+ .sds-guide-num {
711
+ flex-shrink: 0;
712
+ width: 20px;
713
+ height: 20px;
714
+ border-radius: 50%;
715
+ background: rgba(var(--sds-accent-rgb), 0.15);
716
+ border: 1px solid rgba(var(--sds-accent-rgb), 0.35);
717
+ color: var(--sds-accent);
718
+ font: 800 0.65rem Orbitron, Outfit, sans-serif;
719
+ display: flex;
720
+ align-items: center;
721
+ justify-content: center;
722
+ }
723
+
724
+ .sds-guide-icon {
725
+ flex-shrink: 0;
726
+ width: 14px;
727
+ height: 14px;
728
+ color: var(--text-muted);
729
+ stroke-width: 2;
730
+ }
731
+
732
+ .sds-guide-label {
733
+ font-size: 0.75rem;
734
+ font-weight: 600;
735
+ color: var(--text-muted);
736
+ line-height: 1.4;
737
+ }
738
+
739
+ .sds-guide-step-block {
740
+ align-items: flex-start;
741
+ padding-top: 0.625rem;
742
+ padding-bottom: 0.625rem;
743
+ }
744
+
745
+ .sds-guide-step-block .sds-guide-num,
746
+ .sds-guide-step-block .sds-guide-icon {
747
+ margin-top: 2px;
748
+ }
749
+
750
+ .sds-guide-outcomes {
751
+ display: flex;
752
+ flex-direction: column;
753
+ gap: 0.35rem;
754
+ flex: 1;
755
+ }
756
+
757
+ .sds-guide-outcome {
758
+ display: flex;
759
+ align-items: flex-start;
760
+ gap: 0.4rem;
761
+ font-size: 0.72rem;
762
+ font-weight: 600;
763
+ line-height: 1.4;
764
+ color: var(--text-muted);
765
+ }
766
+
767
+ .sds-guide-dot {
768
+ flex-shrink: 0;
769
+ width: 7px;
770
+ height: 7px;
771
+ border-radius: 50%;
772
+ margin-top: 4px;
773
+ }
774
+
775
+ .sds-guide-dot-hit {
776
+ background: var(--sds-success);
777
+ box-shadow: 0 0 5px rgba(var(--sds-success-rgb), 0.6);
778
+ }
779
+
780
+ .sds-guide-dot-scatter {
781
+ background: var(--sds-accent);
782
+ box-shadow: 0 0 5px rgba(var(--sds-accent-rgb), 0.5);
783
+ }
784
+
785
+ .sds-anim-canvas {
786
+ position: absolute;
787
+ top: 0;
788
+ left: 0;
789
+ width: 100%;
790
+ height: 100%;
791
+ pointer-events: none;
792
+ z-index: 5;
793
+ border-radius: 50%;
794
+ }