@jjlmoya/utils-tabletop 1.9.0 → 1.11.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 (46) 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/decision-wheel/client.ts +5 -1
  6. package/src/tool/decision-wheel/components/SegmentEditor.astro +1 -1
  7. package/src/tool/decision-wheel/decision-wheel.css +23 -7
  8. package/src/tool/hidden-role-dealer/bibliography.astro +16 -0
  9. package/src/tool/hidden-role-dealer/bibliography.ts +12 -0
  10. package/src/tool/hidden-role-dealer/client.ts +265 -0
  11. package/src/tool/hidden-role-dealer/component.astro +184 -0
  12. package/src/tool/hidden-role-dealer/entry.ts +145 -0
  13. package/src/tool/hidden-role-dealer/hidden-role-dealer.css +604 -0
  14. package/src/tool/hidden-role-dealer/i18n/de.ts +195 -0
  15. package/src/tool/hidden-role-dealer/i18n/en.ts +279 -0
  16. package/src/tool/hidden-role-dealer/i18n/es.ts +279 -0
  17. package/src/tool/hidden-role-dealer/i18n/fr.ts +215 -0
  18. package/src/tool/hidden-role-dealer/i18n/id.ts +191 -0
  19. package/src/tool/hidden-role-dealer/i18n/it.ts +191 -0
  20. package/src/tool/hidden-role-dealer/i18n/ja.ts +191 -0
  21. package/src/tool/hidden-role-dealer/i18n/ko.ts +191 -0
  22. package/src/tool/hidden-role-dealer/i18n/nl.ts +191 -0
  23. package/src/tool/hidden-role-dealer/i18n/pl.ts +191 -0
  24. package/src/tool/hidden-role-dealer/i18n/pt.ts +191 -0
  25. package/src/tool/hidden-role-dealer/i18n/ru.ts +191 -0
  26. package/src/tool/hidden-role-dealer/i18n/sv.ts +191 -0
  27. package/src/tool/hidden-role-dealer/i18n/tr.ts +191 -0
  28. package/src/tool/hidden-role-dealer/i18n/zh.ts +191 -0
  29. package/src/tool/hidden-role-dealer/index.ts +10 -0
  30. package/src/tool/hidden-role-dealer/logic.test.ts +99 -0
  31. package/src/tool/hidden-role-dealer/logic.ts +134 -0
  32. package/src/tool/hidden-role-dealer/modules/custom-role-manager.ts +35 -0
  33. package/src/tool/hidden-role-dealer/modules/dealer-logic.ts +73 -0
  34. package/src/tool/hidden-role-dealer/modules/hold-controller.ts +38 -0
  35. package/src/tool/hidden-role-dealer/modules/particle-effects.ts +40 -0
  36. package/src/tool/hidden-role-dealer/modules/player-manager.ts +44 -0
  37. package/src/tool/hidden-role-dealer/modules/presets.ts +46 -0
  38. package/src/tool/hidden-role-dealer/modules/setup-handlers.ts +34 -0
  39. package/src/tool/hidden-role-dealer/modules/storage.ts +23 -0
  40. package/src/tool/hidden-role-dealer/modules/utils.ts +18 -0
  41. package/src/tool/hidden-role-dealer/modules/wizard-html.ts +161 -0
  42. package/src/tool/hidden-role-dealer/modules/wizard-renderer.ts +161 -0
  43. package/src/tool/hidden-role-dealer/modules/writer-handler.ts +70 -0
  44. package/src/tool/hidden-role-dealer/seo.astro +16 -0
  45. package/src/tool/hidden-role-dealer/types.ts +31 -0
  46. package/src/tools.ts +2 -0
@@ -0,0 +1,604 @@
1
+ :root {
2
+ --dealer-bg: var(--bg-surface);
3
+ --dealer-border: var(--border-color);
4
+ --dealer-good: #10b981;
5
+ --dealer-evil: #ef4444;
6
+ --dealer-neutral: #3b82f6;
7
+ --dealer-glow-good: rgba(16, 185, 129, 0.25);
8
+ --dealer-glow-evil: rgba(239, 68, 68, 0.25);
9
+ --dealer-glow-neutral: rgba(59, 130, 246, 0.25);
10
+ --dealer-text-base: var(--text-base);
11
+ --dealer-text-muted: var(--text-muted);
12
+ }
13
+
14
+ .hrd-card {
15
+ background: var(--dealer-bg);
16
+ border: 1px solid var(--dealer-border);
17
+ border-radius: 1.5rem;
18
+ padding: 2rem;
19
+ box-shadow: 0 10px 30px rgba(0, 0, 0, 0.05);
20
+ transition: background-color 0.3s ease, border-color 0.3s ease, box-shadow 0.3s ease;
21
+ max-width: 800px;
22
+ margin: 0 auto;
23
+ }
24
+
25
+ .hrd-setup-grid {
26
+ display: grid;
27
+ grid-template-columns: 1fr 1fr;
28
+ gap: 1.5rem;
29
+ }
30
+
31
+ @media (max-width: 768px) {
32
+ .hrd-setup-grid {
33
+ grid-template-columns: 1fr;
34
+ }
35
+ }
36
+
37
+ .hrd-setup-section {
38
+ display: flex;
39
+ flex-direction: column;
40
+ gap: 1rem;
41
+ }
42
+
43
+ .hrd-section-title {
44
+ font-size: 0.95rem;
45
+ font-weight: 800;
46
+ text-transform: uppercase;
47
+ letter-spacing: 0.05em;
48
+ color: var(--dealer-text-muted);
49
+ margin-bottom: 0.5rem;
50
+ display: flex;
51
+ justify-content: space-between;
52
+ align-items: center;
53
+ }
54
+
55
+ .hrd-input-row {
56
+ display: flex;
57
+ gap: 0.5rem;
58
+ }
59
+
60
+ .hrd-input {
61
+ flex: 1;
62
+ padding: 0.75rem 1rem;
63
+ border: 1px solid var(--dealer-border);
64
+ border-radius: 0.75rem;
65
+ background: var(--bg-page);
66
+ color: var(--dealer-text-base);
67
+ font-size: 0.9rem;
68
+ font-weight: 600;
69
+ transition: all 0.2s ease;
70
+ }
71
+
72
+ .hrd-input:focus {
73
+ outline: none;
74
+ border-color: var(--dealer-neutral);
75
+ box-shadow: 0 0 0 3px var(--dealer-glow-neutral);
76
+ }
77
+
78
+ .hrd-select {
79
+ flex: 1;
80
+ min-width: 100px;
81
+ padding: 0.75rem 2rem 0.75rem 1rem;
82
+ border: 1px solid var(--dealer-border);
83
+ border-radius: 0.75rem;
84
+ background-color: var(--bg-page);
85
+ background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2394a3b8' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><polyline points='6 9 12 15 18 9'></polyline></svg>");
86
+ background-repeat: no-repeat;
87
+ background-position: right 0.75rem center;
88
+ background-size: 0.85rem;
89
+ color: var(--dealer-text-base);
90
+ font-size: 0.9rem;
91
+ font-weight: 600;
92
+ cursor: pointer;
93
+ appearance: none;
94
+ -webkit-appearance: none;
95
+ transition: all 0.2s ease;
96
+ }
97
+
98
+ .hrd-select:focus {
99
+ outline: none;
100
+ border-color: var(--dealer-neutral);
101
+ box-shadow: 0 0 0 3px var(--dealer-glow-neutral);
102
+ }
103
+
104
+ .hrd-btn-primary {
105
+ padding: 0.75rem 1.5rem;
106
+ border-radius: 0.75rem;
107
+ border: none;
108
+ background: linear-gradient(135deg, #3b82f6 0%, #1d4ed8 100%);
109
+ color: var(--color-white);
110
+ font-weight: 700;
111
+ cursor: pointer;
112
+ transition: all 0.2s cubic-bezier(0.16, 1, 0.3, 1);
113
+ display: inline-flex;
114
+ align-items: center;
115
+ justify-content: center;
116
+ gap: 0.5rem;
117
+ }
118
+
119
+ .hrd-btn-primary:hover {
120
+ transform: translateY(-2px);
121
+ box-shadow: 0 4px 12px var(--dealer-glow-neutral);
122
+ }
123
+
124
+ .hrd-btn-primary:active {
125
+ transform: translateY(0);
126
+ }
127
+
128
+ .hrd-btn-secondary {
129
+ padding: 0.5rem 1rem;
130
+ border-radius: 0.5rem;
131
+ border: 1px solid var(--dealer-border);
132
+ background: var(--bg-page);
133
+ color: var(--dealer-text-base);
134
+ font-weight: 600;
135
+ cursor: pointer;
136
+ transition: all 0.2s ease;
137
+ }
138
+
139
+ .hrd-btn-secondary:hover {
140
+ background: var(--dealer-border);
141
+ }
142
+
143
+ .hrd-presets-list {
144
+ display: flex;
145
+ flex-direction: column;
146
+ gap: 0.5rem;
147
+ }
148
+
149
+ .hrd-preset-card {
150
+ padding: 1rem;
151
+ border: 1px solid var(--dealer-border);
152
+ border-radius: 0.75rem;
153
+ cursor: pointer;
154
+ transition: all 0.2s ease;
155
+ background: var(--bg-page);
156
+ text-align: left;
157
+ }
158
+
159
+ .hrd-preset-card:hover {
160
+ border-color: var(--dealer-neutral);
161
+ transform: translateX(4px);
162
+ }
163
+
164
+ .hrd-preset-card.active {
165
+ border-color: var(--dealer-neutral);
166
+ background: var(--dealer-glow-neutral);
167
+ }
168
+
169
+ .hrd-preset-name {
170
+ font-weight: 750;
171
+ color: var(--dealer-text-base);
172
+ }
173
+
174
+ .hrd-preset-desc {
175
+ font-size: 0.8rem;
176
+ color: var(--dealer-text-muted);
177
+ margin-top: 0.25rem;
178
+ }
179
+
180
+ .hrd-players-container {
181
+ display: flex;
182
+ flex-direction: column;
183
+ gap: 0.5rem;
184
+ max-height: 250px;
185
+ overflow-y: auto;
186
+ }
187
+
188
+ .hrd-player-item {
189
+ display: flex;
190
+ justify-content: space-between;
191
+ align-items: center;
192
+ padding: 0.5rem 0.75rem;
193
+ background: var(--bg-page);
194
+ border: 1px solid var(--dealer-border);
195
+ border-radius: 0.5rem;
196
+ }
197
+
198
+ .hrd-player-name {
199
+ font-weight: 600;
200
+ color: var(--dealer-text-base);
201
+ }
202
+
203
+ .hrd-btn-delete,
204
+ .hrd-btn-delete-role {
205
+ background: transparent;
206
+ border: none;
207
+ color: var(--dealer-text-muted);
208
+ cursor: pointer;
209
+ padding: 0.25rem;
210
+ border-radius: 0.25rem;
211
+ transition: all 0.2s ease;
212
+ }
213
+
214
+ .hrd-btn-delete:hover,
215
+ .hrd-btn-delete-role:hover {
216
+ color: var(--dealer-text-base);
217
+ background: var(--dealer-border);
218
+ }
219
+
220
+ .hrd-role-badge {
221
+ display: inline-flex;
222
+ padding: 0.25rem 0.5rem;
223
+ border-radius: 0.25rem;
224
+ font-size: 0.75rem;
225
+ font-weight: 700;
226
+ text-transform: uppercase;
227
+ }
228
+
229
+ .hrd-role-badge.good {
230
+ background: var(--dealer-glow-good);
231
+ color: var(--dealer-good);
232
+ }
233
+
234
+ .hrd-role-badge.evil {
235
+ background: var(--dealer-glow-evil);
236
+ color: var(--dealer-evil);
237
+ }
238
+
239
+ .hrd-role-badge.neutral {
240
+ background: var(--dealer-glow-neutral);
241
+ color: var(--dealer-neutral);
242
+ }
243
+
244
+ .hrd-deal-action-panel {
245
+ display: flex;
246
+ flex-direction: column;
247
+ align-items: center;
248
+ gap: 1rem;
249
+ margin-top: 1.5rem;
250
+ border-top: 1px solid var(--dealer-border);
251
+ padding-top: 1.5rem;
252
+ }
253
+
254
+ .hrd-warning-box {
255
+ background: var(--dealer-glow-evil);
256
+ color: var(--dealer-evil);
257
+ padding: 0.75rem 1rem;
258
+ border-radius: 0.5rem;
259
+ font-size: 0.85rem;
260
+ font-weight: 600;
261
+ text-align: center;
262
+ }
263
+
264
+ .hrd-wizard-container {
265
+ display: flex;
266
+ flex-direction: column;
267
+ align-items: center;
268
+ justify-content: center;
269
+ padding: 3rem 1.5rem;
270
+ min-height: 400px;
271
+ position: relative;
272
+ overflow: hidden;
273
+ }
274
+
275
+ .hrd-pass-screen {
276
+ text-align: center;
277
+ animation: scale-in 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
278
+ }
279
+
280
+ .hrd-pass-label {
281
+ font-size: 1.25rem;
282
+ color: var(--dealer-text-muted);
283
+ margin-bottom: 0.5rem;
284
+ }
285
+
286
+ .hrd-player-highlight {
287
+ font-size: 2.25rem;
288
+ font-weight: 900;
289
+ color: var(--dealer-text-base);
290
+ margin-bottom: 2rem;
291
+ text-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
292
+ }
293
+
294
+ .hrd-hold-button-wrapper {
295
+ position: relative;
296
+ width: 200px;
297
+ height: 200px;
298
+ margin: 0 auto;
299
+ }
300
+
301
+ .hrd-hold-button {
302
+ width: 100%;
303
+ height: 100%;
304
+ border-radius: 50%;
305
+ border: none;
306
+ background: linear-gradient(135deg, #1f2937 0%, #111827 100%);
307
+ color: var(--color-white);
308
+ font-weight: 800;
309
+ font-size: 1.1rem;
310
+ cursor: pointer;
311
+ position: relative;
312
+ z-index: 2;
313
+ box-shadow: 0 10px 25px rgba(0, 0, 0, 0.3);
314
+ transition: transform 0.2s cubic-bezier(0.175, 0.885, 0.32, 1.275);
315
+ display: flex;
316
+ flex-direction: column;
317
+ align-items: center;
318
+ justify-content: center;
319
+ padding: 1.5rem;
320
+ text-align: center;
321
+ user-select: none;
322
+ -webkit-user-select: none;
323
+ }
324
+
325
+ .hrd-hold-button:active {
326
+ transform: scale(0.95);
327
+ }
328
+
329
+ .hrd-hold-progress-ring {
330
+ position: absolute;
331
+ top: -10px;
332
+ left: -10px;
333
+ width: 220px;
334
+ height: 220px;
335
+ border-radius: 50%;
336
+ border: 4px solid var(--dealer-border);
337
+ z-index: 1;
338
+ pointer-events: none;
339
+ transition: border-color 0.3s ease;
340
+ }
341
+
342
+ .hrd-hold-button-wrapper.holding .hrd-hold-progress-ring {
343
+ border-color: var(--dealer-neutral);
344
+ animation: ring-pulse 1s infinite alternate;
345
+ }
346
+
347
+ .hrd-hold-hint {
348
+ font-size: 0.8rem;
349
+ color: var(--dealer-text-muted);
350
+ margin-top: 1.5rem;
351
+ text-align: center;
352
+ }
353
+
354
+ .hrd-reveal-screen {
355
+ display: flex;
356
+ flex-direction: column;
357
+ align-items: center;
358
+ justify-content: center;
359
+ text-align: center;
360
+ animation: slide-in 0.4s cubic-bezier(0.16, 1, 0.3, 1) forwards;
361
+ width: 100%;
362
+ max-width: 450px;
363
+ margin: 0 auto;
364
+ }
365
+
366
+ .hrd-card-container {
367
+ perspective: 1200px;
368
+ margin-bottom: 2rem;
369
+ width: 100%;
370
+ display: flex;
371
+ justify-content: center;
372
+ }
373
+
374
+ .hrd-role-card {
375
+ background: var(--dealer-bg);
376
+ border: 2px solid var(--dealer-border);
377
+ border-radius: 1.5rem;
378
+ padding: 2.5rem 2rem;
379
+ box-shadow: 0 15px 35px rgba(0, 0, 0, 0.1);
380
+ transition: transform 0.4s cubic-bezier(0.175, 0.885, 0.32, 1.275), box-shadow 0.4s ease, border-color 0.4s ease;
381
+ animation: reveal-card-flip 0.8s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
382
+ backface-visibility: hidden;
383
+ transform-style: preserve-3d;
384
+ width: 100%;
385
+ }
386
+
387
+ .hrd-role-card.good {
388
+ border-color: var(--dealer-good);
389
+ box-shadow: 0 15px 35px var(--dealer-glow-good);
390
+ }
391
+
392
+ .hrd-role-card.evil {
393
+ border-color: var(--dealer-evil);
394
+ box-shadow: 0 15px 35px var(--dealer-glow-evil);
395
+ }
396
+
397
+ .hrd-role-card.neutral {
398
+ border-color: var(--dealer-neutral);
399
+ box-shadow: 0 15px 35px var(--dealer-glow-neutral);
400
+ }
401
+
402
+ .hrd-role-card-header {
403
+ margin-bottom: 1.5rem;
404
+ }
405
+
406
+ .hrd-role-team {
407
+ font-size: 0.85rem;
408
+ font-weight: 800;
409
+ text-transform: uppercase;
410
+ letter-spacing: 0.1em;
411
+ }
412
+
413
+ .hrd-role-name {
414
+ font-size: 2.25rem;
415
+ font-weight: 900;
416
+ margin: 0.5rem 0;
417
+ }
418
+
419
+ .hrd-role-card.good .hrd-role-name {
420
+ color: var(--dealer-good);
421
+ }
422
+
423
+ .hrd-role-card.evil .hrd-role-name {
424
+ color: var(--dealer-evil);
425
+ }
426
+
427
+ .hrd-role-card.neutral .hrd-role-name {
428
+ color: var(--dealer-neutral);
429
+ }
430
+
431
+ .hrd-role-desc {
432
+ font-size: 0.95rem;
433
+ color: var(--dealer-text-muted);
434
+ line-height: 1.5;
435
+ margin-bottom: 1.5rem;
436
+ }
437
+
438
+ .hrd-secret-box {
439
+ background: var(--bg-page);
440
+ border: 1px solid var(--dealer-border);
441
+ border-radius: 0.75rem;
442
+ padding: 1rem;
443
+ font-size: 0.85rem;
444
+ font-weight: 600;
445
+ color: var(--dealer-text-base);
446
+ text-align: left;
447
+ }
448
+
449
+ .hrd-complete-screen {
450
+ text-align: center;
451
+ animation: scale-in 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
452
+ }
453
+
454
+ .hrd-complete-icon {
455
+ width: 64px;
456
+ height: 64px;
457
+ margin: 0 auto 1.5rem;
458
+ color: var(--dealer-good);
459
+ }
460
+
461
+ .hrd-complete-title {
462
+ font-size: 2rem;
463
+ font-weight: 900;
464
+ color: var(--dealer-text-base);
465
+ margin-bottom: 1rem;
466
+ }
467
+
468
+ .hrd-complete-desc {
469
+ color: var(--dealer-text-muted);
470
+ margin-bottom: 2rem;
471
+ }
472
+
473
+ .hrd-role-particle {
474
+ position: absolute;
475
+ border-radius: 50%;
476
+ pointer-events: none;
477
+ animation: particle-travel 1s cubic-bezier(0.1, 0.8, 0.3, 1) forwards;
478
+ opacity: 1;
479
+ }
480
+
481
+ @keyframes ring-pulse {
482
+ 0% {
483
+ transform: scale(1);
484
+ box-shadow: 0 0 0 0 var(--dealer-glow-neutral);
485
+ }
486
+ 100% {
487
+ transform: scale(1.03);
488
+ box-shadow: 0 0 20px 8px var(--dealer-glow-neutral);
489
+ }
490
+ }
491
+
492
+ @keyframes scale-in {
493
+ from {
494
+ opacity: 0;
495
+ transform: scale(0.9);
496
+ }
497
+ to {
498
+ opacity: 1;
499
+ transform: scale(1);
500
+ }
501
+ }
502
+
503
+ @keyframes slide-in {
504
+ from {
505
+ opacity: 0;
506
+ transform: translateY(20px);
507
+ }
508
+ to {
509
+ opacity: 1;
510
+ transform: translateY(0);
511
+ }
512
+ }
513
+
514
+ @keyframes particle-travel {
515
+ 0% {
516
+ transform: translate(0, 0) scale(1);
517
+ opacity: 1;
518
+ }
519
+ 100% {
520
+ transform: translate(var(--tx), var(--ty)) scale(0);
521
+ opacity: 0;
522
+ }
523
+ }
524
+
525
+ @keyframes reveal-card-flip {
526
+ 0% {
527
+ transform: rotateY(-180deg) scale(0.8);
528
+ opacity: 0;
529
+ }
530
+ 100% {
531
+ transform: rotateY(0deg) scale(1);
532
+ opacity: 1;
533
+ }
534
+ }
535
+
536
+ .hrd-epic-secret-box {
537
+ background: var(--bg-page);
538
+ border: 2px dashed var(--dealer-good);
539
+ border-radius: 1rem;
540
+ padding: 1.5rem 1rem;
541
+ text-align: center;
542
+ box-shadow: 0 0 15px var(--dealer-glow-good);
543
+ display: flex;
544
+ flex-direction: column;
545
+ align-items: center;
546
+ gap: 0.75rem;
547
+ margin-top: 1rem;
548
+ }
549
+
550
+ .hrd-epic-secret-box.evil {
551
+ border-color: var(--dealer-evil);
552
+ box-shadow: 0 0 15px var(--dealer-glow-evil);
553
+ }
554
+
555
+ .hrd-epic-label {
556
+ font-size: 0.8rem;
557
+ font-weight: 800;
558
+ text-transform: uppercase;
559
+ color: var(--dealer-text-muted);
560
+ letter-spacing: 0.1em;
561
+ }
562
+
563
+ .hrd-epic-word {
564
+ font-size: 2rem;
565
+ font-weight: 950;
566
+ color: var(--dealer-good);
567
+ letter-spacing: 0.05em;
568
+ text-shadow: 0 0 10px var(--dealer-good);
569
+ text-transform: uppercase;
570
+ animation: hrd-epic-pulse 2s infinite alternate;
571
+ }
572
+
573
+ .hrd-epic-secret-box.evil .hrd-epic-word {
574
+ color: var(--dealer-evil);
575
+ text-shadow: 0 0 10px var(--dealer-evil);
576
+ }
577
+
578
+ @keyframes hrd-epic-pulse {
579
+ 0% {
580
+ transform: scale(1);
581
+ filter: brightness(1);
582
+ }
583
+ 100% {
584
+ transform: scale(1.05);
585
+ filter: brightness(1.2);
586
+ }
587
+ }
588
+
589
+ .hrd-role-card.hrd-compact-card {
590
+ padding: 2.5rem 1.5rem;
591
+ text-align: center;
592
+ display: flex;
593
+ flex-direction: column;
594
+ justify-content: center;
595
+ align-items: center;
596
+ gap: 1.25rem;
597
+ }
598
+
599
+ .hrd-role-card.hrd-compact-card .hrd-role-name {
600
+ margin: 0;
601
+ font-size: 2.5rem;
602
+ letter-spacing: 0.05em;
603
+ text-transform: uppercase;
604
+ }