@jjlmoya/utils-games-development 1.63.0 → 1.64.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 (39) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -1
  3. package/src/entries.ts +4 -1
  4. package/src/index.ts +1 -0
  5. package/src/tests/locale_completeness.test.ts +2 -2
  6. package/src/tests/tool_validation.test.ts +2 -2
  7. package/src/tool/damageFormulaLab/bibliography.astro +24 -0
  8. package/src/tool/damageFormulaLab/bibliography.ts +10 -0
  9. package/src/tool/damageFormulaLab/component.astro +178 -0
  10. package/src/tool/damageFormulaLab/controller.ts +235 -0
  11. package/src/tool/damageFormulaLab/damage-formula-lab.css +644 -0
  12. package/src/tool/damageFormulaLab/dom-views.ts +193 -0
  13. package/src/tool/damageFormulaLab/entry.ts +28 -0
  14. package/src/tool/damageFormulaLab/evaluator.ts +84 -0
  15. package/src/tool/damageFormulaLab/expression.ts +191 -0
  16. package/src/tool/damageFormulaLab/i18n/de.ts +181 -0
  17. package/src/tool/damageFormulaLab/i18n/en.ts +231 -0
  18. package/src/tool/damageFormulaLab/i18n/es.ts +181 -0
  19. package/src/tool/damageFormulaLab/i18n/fr.ts +181 -0
  20. package/src/tool/damageFormulaLab/i18n/id.ts +181 -0
  21. package/src/tool/damageFormulaLab/i18n/it.ts +181 -0
  22. package/src/tool/damageFormulaLab/i18n/ja.ts +182 -0
  23. package/src/tool/damageFormulaLab/i18n/ko.ts +181 -0
  24. package/src/tool/damageFormulaLab/i18n/nl.ts +181 -0
  25. package/src/tool/damageFormulaLab/i18n/pl.ts +181 -0
  26. package/src/tool/damageFormulaLab/i18n/pt.ts +181 -0
  27. package/src/tool/damageFormulaLab/i18n/ru.ts +181 -0
  28. package/src/tool/damageFormulaLab/i18n/sv.ts +181 -0
  29. package/src/tool/damageFormulaLab/i18n/tr.ts +181 -0
  30. package/src/tool/damageFormulaLab/i18n/zh.ts +181 -0
  31. package/src/tool/damageFormulaLab/index.ts +11 -0
  32. package/src/tool/damageFormulaLab/logic.test.ts +138 -0
  33. package/src/tool/damageFormulaLab/logic.ts +138 -0
  34. package/src/tool/damageFormulaLab/model.ts +151 -0
  35. package/src/tool/damageFormulaLab/seo.astro +13 -0
  36. package/src/tool/damageFormulaLab/storage.ts +62 -0
  37. package/src/tool/damageFormulaLab/transfers.ts +89 -0
  38. package/src/tool/damageFormulaLab/ui.ts +62 -0
  39. package/src/tools.ts +2 -0
@@ -0,0 +1,644 @@
1
+ :root {
2
+ --n-dl-ink: #282731;
3
+ --n-dl-muted: #6f6b76;
4
+ --n-dl-paper: #f7f4ee;
5
+ --n-dl-paper-soft: #eeebe4;
6
+ --n-dl-white: #fff;
7
+ --n-dl-line: #d9d4ca;
8
+ --n-dl-a: #f06449;
9
+ --n-dl-a-soft: #ffd8cb;
10
+ --n-dl-b: #5368d9;
11
+ --n-dl-b-soft: #dce2ff;
12
+ --n-dl-ok: #43836d;
13
+ --n-dl-warn: #b86435;
14
+ --n-dl-error: #b43e52;
15
+ --n-dl-shadow: rgba(52, 45, 64, 0.1);
16
+ --n-dl-wash: rgba(240, 100, 73, 0.1);
17
+ --n-dl-grid: rgba(40, 39, 49, 0.1);
18
+ }
19
+
20
+ .theme-dark {
21
+ --n-dl-ink: #f5f0e7;
22
+ --n-dl-muted: #b6b0bd;
23
+ --n-dl-paper: #1b1b22;
24
+ --n-dl-paper-soft: #25252e;
25
+ --n-dl-white: #111117;
26
+ --n-dl-line: #3f3d48;
27
+ --n-dl-a: #ff8065;
28
+ --n-dl-a-soft: #5b2e29;
29
+ --n-dl-b: #92a0ff;
30
+ --n-dl-b-soft: #303966;
31
+ --n-dl-ok: #76bca3;
32
+ --n-dl-warn: #eca071;
33
+ --n-dl-error: #ef8291;
34
+ --n-dl-shadow: rgba(0, 0, 0, 0.24);
35
+ --n-dl-wash: rgba(240, 100, 73, 0.14);
36
+ --n-dl-grid: rgba(255, 255, 255, 0.1);
37
+ }
38
+
39
+ .damage-lab {
40
+ overflow: hidden;
41
+ color: var(--n-dl-ink);
42
+ background: var(--n-dl-paper);
43
+ border: 1px solid var(--n-dl-line);
44
+ border-radius: 1.75rem;
45
+ box-shadow: 0 1.5rem 5rem var(--n-dl-shadow);
46
+ }
47
+
48
+ .damage-lab button,
49
+ .damage-lab input {
50
+ font: inherit;
51
+ }
52
+
53
+ .damage-lab button {
54
+ color: inherit;
55
+ cursor: pointer;
56
+ }
57
+
58
+ .damage-lab-header {
59
+ display: flex;
60
+ align-items: center;
61
+ justify-content: space-between;
62
+ gap: 1rem;
63
+ padding: 1rem 1.25rem;
64
+ color: var(--n-dl-ink);
65
+ background: var(--n-dl-paper-soft);
66
+ border-bottom: 1px solid var(--n-dl-line);
67
+ }
68
+
69
+ .damage-lab-header p {
70
+ margin: 0;
71
+ max-width: 62ch;
72
+ font-weight: 700;
73
+ }
74
+
75
+ .damage-lab-header span {
76
+ font-size: 0.8rem;
77
+ color: var(--n-dl-muted);
78
+ }
79
+
80
+ .damage-lab-composer,
81
+ .damage-lab-tuning,
82
+ .damage-lab-result,
83
+ .damage-lab-pressure,
84
+ .damage-lab-diagnostics,
85
+ .damage-lab-exports {
86
+ padding: clamp(1.15rem, 3vw, 2.25rem);
87
+ }
88
+
89
+ .damage-lab-heading,
90
+ .damage-lab-result-heading,
91
+ .damage-lab-curve-heading {
92
+ display: flex;
93
+ align-items: flex-start;
94
+ justify-content: space-between;
95
+ gap: 1rem;
96
+ }
97
+
98
+ .damage-lab h2,
99
+ .damage-lab h3,
100
+ .damage-lab p {
101
+ margin-top: 0;
102
+ }
103
+
104
+ .damage-lab h2 {
105
+ margin-bottom: 0;
106
+ font-size: clamp(1.05rem, 2vw, 1.4rem);
107
+ font-weight: 650;
108
+ letter-spacing: -0.025em;
109
+ }
110
+
111
+ .damage-lab-presets,
112
+ .damage-lab-scenarios,
113
+ .damage-lab-actions {
114
+ display: flex;
115
+ flex-wrap: wrap;
116
+ gap: 0.35rem;
117
+ }
118
+
119
+ .damage-lab-presets button,
120
+ .damage-lab-scenarios button {
121
+ min-height: 2.3rem;
122
+ padding: 0.45rem 0.75rem;
123
+ color: var(--n-dl-muted);
124
+ background: transparent;
125
+ border: 0;
126
+ border-bottom: 1px solid transparent;
127
+ }
128
+
129
+ .damage-lab-presets button:hover,
130
+ .damage-lab-scenarios button:hover {
131
+ color: var(--n-dl-ink);
132
+ border-color: var(--n-dl-ink);
133
+ }
134
+
135
+ .damage-lab-formulas {
136
+ display: grid;
137
+ grid-template-columns: 1fr 1fr;
138
+ gap: clamp(1rem, 3vw, 2rem);
139
+ margin-top: 1.25rem;
140
+ }
141
+
142
+ .damage-lab-formula {
143
+ display: grid;
144
+ gap: 0.6rem;
145
+ }
146
+
147
+ .damage-lab-formula > span {
148
+ display: flex;
149
+ align-items: center;
150
+ gap: 0.55rem;
151
+ font-size: 0.78rem;
152
+ font-weight: 700;
153
+ }
154
+
155
+ .damage-lab-formula i {
156
+ width: 0.55rem;
157
+ height: 0.55rem;
158
+ background: var(--n-dl-a);
159
+ border-radius: 50%;
160
+ }
161
+
162
+ .damage-lab-formula-b i {
163
+ background: var(--n-dl-b);
164
+ }
165
+
166
+ .damage-lab-formula input {
167
+ width: 100%;
168
+ min-height: 3.5rem;
169
+ box-sizing: border-box;
170
+ padding: 0.75rem 0;
171
+ color: var(--n-dl-ink);
172
+ background: transparent;
173
+ border: 0;
174
+ border-bottom: 2px solid var(--n-dl-line);
175
+ border-radius: 0;
176
+ outline: 0;
177
+ }
178
+
179
+ .damage-lab-formula-a input:focus {
180
+ border-color: var(--n-dl-a);
181
+ }
182
+
183
+ .damage-lab-formula-b input:focus {
184
+ border-color: var(--n-dl-b);
185
+ }
186
+
187
+ .damage-lab-language,
188
+ .damage-lab-advanced {
189
+ margin-top: 1.2rem;
190
+ }
191
+
192
+ .damage-lab-language summary,
193
+ .damage-lab-advanced summary {
194
+ width: fit-content;
195
+ color: var(--n-dl-muted);
196
+ cursor: pointer;
197
+ font-size: 0.78rem;
198
+ }
199
+
200
+ .damage-lab-language p {
201
+ margin: 0.75rem 0 0;
202
+ color: var(--n-dl-muted);
203
+ font-size: 0.75rem;
204
+ line-height: 1.6;
205
+ }
206
+
207
+ .damage-lab-tuning {
208
+ background: var(--n-dl-paper-soft);
209
+ }
210
+
211
+ .damage-lab-core-inputs,
212
+ .damage-lab-advanced-grid {
213
+ display: grid;
214
+ grid-template-columns: repeat(4, minmax(0, 1fr));
215
+ gap: 0.75rem;
216
+ margin-top: 1rem;
217
+ }
218
+
219
+ .damage-lab-core-inputs label,
220
+ .damage-lab-advanced-grid label {
221
+ display: grid;
222
+ gap: 0.35rem;
223
+ }
224
+
225
+ .damage-lab-core-inputs span,
226
+ .damage-lab-advanced-grid span {
227
+ color: var(--n-dl-muted);
228
+ font-size: 0.78rem;
229
+ font-weight: 700;
230
+ }
231
+
232
+ .damage-lab-core-inputs input,
233
+ .damage-lab-advanced-grid input {
234
+ width: 100%;
235
+ min-height: 3rem;
236
+ box-sizing: border-box;
237
+ padding: 0.65rem 0.75rem;
238
+ color: var(--n-dl-ink);
239
+ font-size: 1.05rem;
240
+ font-variant-numeric: tabular-nums;
241
+ background: var(--n-dl-white);
242
+ border: 1px solid var(--n-dl-line);
243
+ border-radius: 0.65rem;
244
+ }
245
+
246
+ .damage-lab-core-inputs input:focus,
247
+ .damage-lab-advanced-grid input:focus {
248
+ border-color: var(--n-dl-b);
249
+ outline: 0.2rem solid var(--n-dl-b-soft);
250
+ }
251
+
252
+ .damage-lab-advanced {
253
+ padding-top: 0.75rem;
254
+ border-top: 1px solid var(--n-dl-line);
255
+ }
256
+
257
+ .damage-lab-advanced-grid {
258
+ grid-template-columns: repeat(3, minmax(0, 1fr));
259
+ }
260
+
261
+ .damage-lab-choice {
262
+ display: flex;
263
+ flex-wrap: wrap;
264
+ gap: 0.4rem;
265
+ margin: 1rem 0 0;
266
+ padding: 0;
267
+ border: 0;
268
+ }
269
+
270
+ .damage-lab-choice legend {
271
+ width: 100%;
272
+ margin-bottom: 0.25rem;
273
+ color: var(--n-dl-muted);
274
+ font-size: 0.78rem;
275
+ font-weight: 700;
276
+ }
277
+
278
+ .damage-lab-choice button {
279
+ min-height: 2.4rem;
280
+ padding: 0.45rem 0.75rem;
281
+ background: transparent;
282
+ border: 1px solid var(--n-dl-line);
283
+ border-radius: 0.45rem;
284
+ }
285
+
286
+ .damage-lab-choice button[data-active="true"] {
287
+ color: var(--n-dl-white);
288
+ background: var(--n-dl-ink);
289
+ border-color: var(--n-dl-ink);
290
+ }
291
+
292
+ .damage-lab-result {
293
+ position: relative;
294
+ overflow: hidden;
295
+ background: var(--n-dl-white);
296
+ }
297
+
298
+ .damage-lab-result::before {
299
+ position: absolute;
300
+ top: -10rem;
301
+ left: 50%;
302
+ width: 32rem;
303
+ height: 24rem;
304
+ background: radial-gradient(ellipse, var(--n-dl-wash), transparent 68%);
305
+ transform: translateX(-50%);
306
+ content: "";
307
+ pointer-events: none;
308
+ }
309
+
310
+ .damage-lab-result > * {
311
+ position: relative;
312
+ }
313
+
314
+ .damage-lab-result-heading span {
315
+ color: var(--n-dl-muted);
316
+ font-size: 0.75rem;
317
+ text-transform: uppercase;
318
+ letter-spacing: 0.12em;
319
+ }
320
+
321
+ .damage-lab-gap {
322
+ display: grid;
323
+ text-align: right;
324
+ }
325
+
326
+ .damage-lab-gap small {
327
+ color: var(--n-dl-muted);
328
+ }
329
+
330
+ .damage-lab-gap strong {
331
+ font-size: 1.6rem;
332
+ font-variant-numeric: tabular-nums;
333
+ }
334
+
335
+ .damage-lab-totals {
336
+ display: grid;
337
+ grid-template-columns: 1fr 1fr;
338
+ gap: clamp(2rem, 8vw, 7rem);
339
+ max-width: 46rem;
340
+ margin: 0.5rem auto 0;
341
+ }
342
+
343
+ .damage-lab-totals article:last-child {
344
+ text-align: right;
345
+ }
346
+
347
+ .damage-lab-totals article > span,
348
+ .damage-lab-totals article > small {
349
+ display: block;
350
+ color: var(--n-dl-muted);
351
+ }
352
+
353
+ .damage-lab-totals article > strong {
354
+ display: block;
355
+ min-height: 1.15em;
356
+ color: var(--n-dl-a);
357
+ font-size: clamp(3.5rem, 10vw, 7rem);
358
+ font-weight: 520;
359
+ line-height: 1;
360
+ letter-spacing: -0.08em;
361
+ font-variant-numeric: tabular-nums;
362
+ }
363
+
364
+ .damage-lab-totals article:last-child > strong {
365
+ color: var(--n-dl-b);
366
+ }
367
+
368
+ .damage-lab-totals dl {
369
+ display: flex;
370
+ gap: 1.2rem;
371
+ margin: 1rem 0 0;
372
+ }
373
+
374
+ .damage-lab-totals article:last-child dl {
375
+ justify-content: flex-end;
376
+ }
377
+
378
+ .damage-lab-totals dl div {
379
+ display: grid;
380
+ gap: 0.15rem;
381
+ }
382
+
383
+ .damage-lab-totals dt {
384
+ color: var(--n-dl-muted);
385
+ font-size: 0.75rem;
386
+ }
387
+
388
+ .damage-lab-totals dd {
389
+ margin: 0;
390
+ font-weight: 750;
391
+ white-space: nowrap;
392
+ }
393
+
394
+ .damage-lab-curve-heading {
395
+ margin-top: 2rem;
396
+ }
397
+
398
+ .damage-lab-curve-heading h3 {
399
+ margin-bottom: 0.25rem;
400
+ }
401
+
402
+ .damage-lab-curve-heading p {
403
+ max-width: 36rem;
404
+ margin-bottom: 0;
405
+ color: var(--n-dl-muted);
406
+ font-size: 0.75rem;
407
+ }
408
+
409
+ .damage-lab-curve-heading > span {
410
+ color: var(--n-dl-muted);
411
+ white-space: nowrap;
412
+ }
413
+
414
+ .damage-lab-chart {
415
+ width: 100%;
416
+ height: 9rem;
417
+ margin-top: 0.5rem;
418
+ overflow: visible;
419
+ }
420
+
421
+ .damage-lab-guide {
422
+ fill: none;
423
+ stroke: var(--n-dl-grid);
424
+ stroke-width: 0.4;
425
+ vector-effect: non-scaling-stroke;
426
+ }
427
+
428
+ .damage-lab-curve {
429
+ fill: none;
430
+ stroke-width: 2.5;
431
+ vector-effect: non-scaling-stroke;
432
+ }
433
+
434
+ .damage-lab-curve-a {
435
+ stroke: var(--n-dl-a);
436
+ }
437
+
438
+ .damage-lab-curve-b {
439
+ stroke: var(--n-dl-b);
440
+ stroke-dasharray: 6 5;
441
+ }
442
+
443
+ .damage-lab-legend {
444
+ display: flex;
445
+ gap: 1.25rem;
446
+ color: var(--n-dl-muted);
447
+ font-size: 0.78rem;
448
+ }
449
+
450
+ .damage-lab-legend span::before {
451
+ display: inline-block;
452
+ width: 1.5rem;
453
+ height: 0.15rem;
454
+ margin-right: 0.4rem;
455
+ background: var(--n-dl-a);
456
+ vertical-align: middle;
457
+ content: "";
458
+ }
459
+
460
+ .damage-lab-legend span:last-child::before {
461
+ background: var(--n-dl-b);
462
+ }
463
+
464
+ .damage-lab-notes {
465
+ display: grid;
466
+ grid-template-columns: 1.2fr 0.8fr;
467
+ border-top: 1px solid var(--n-dl-line);
468
+ }
469
+
470
+ .damage-lab-secondary,
471
+ .damage-lab-export-panel {
472
+ border-top: 1px solid var(--n-dl-line);
473
+ }
474
+
475
+ .damage-lab-secondary > summary,
476
+ .damage-lab-export-panel > summary {
477
+ padding: 1rem clamp(1.15rem, 3vw, 2.25rem);
478
+ color: var(--n-dl-muted);
479
+ cursor: pointer;
480
+ font-size: 0.8rem;
481
+ font-weight: 700;
482
+ }
483
+
484
+ .damage-lab-secondary[open] > summary,
485
+ .damage-lab-export-panel[open] > summary {
486
+ color: var(--n-dl-ink);
487
+ border-bottom: 1px solid var(--n-dl-line);
488
+ }
489
+
490
+ .damage-lab-pressure {
491
+ border-right: 1px solid var(--n-dl-line);
492
+ }
493
+
494
+ .damage-lab-pressure > p,
495
+ .damage-lab-diagnostics > p,
496
+ .damage-lab-exports p {
497
+ color: var(--n-dl-muted);
498
+ line-height: 1.5;
499
+ }
500
+
501
+ .damage-lab-axis,
502
+ .damage-lab-pressure > small {
503
+ display: block;
504
+ margin-block: 0.6rem;
505
+ color: var(--n-dl-muted);
506
+ font-size: 0.75rem;
507
+ text-align: right;
508
+ }
509
+
510
+ .damage-lab-heatmap {
511
+ display: grid;
512
+ grid-template-columns: repeat(9, minmax(1.8rem, 1fr));
513
+ gap: 0.3rem;
514
+ }
515
+
516
+ .damage-lab-heat-cell {
517
+ display: grid;
518
+ place-items: center;
519
+ min-height: 2.7rem;
520
+ color: var(--n-dl-ink);
521
+ font-size: 0.75rem;
522
+ font-weight: 750;
523
+ background: color-mix(
524
+ in srgb,
525
+ var(--n-dl-a) calc(var(--damage-intensity) * 72%),
526
+ var(--n-dl-paper-soft)
527
+ );
528
+ border-radius: 0.4rem;
529
+ }
530
+
531
+ .damage-lab-diagnostics ul {
532
+ display: grid;
533
+ gap: 0.7rem;
534
+ padding: 0;
535
+ list-style: none;
536
+ }
537
+
538
+ .damage-lab-diagnostics li {
539
+ padding-left: 0.85rem;
540
+ line-height: 1.45;
541
+ border-left: 2px solid var(--n-dl-ok);
542
+ }
543
+
544
+ .damage-lab-diagnostics ul[data-state="warning"] li {
545
+ border-color: var(--n-dl-warn);
546
+ }
547
+
548
+ .damage-lab-diagnostics ul[data-state="error"] li {
549
+ border-color: var(--n-dl-error);
550
+ }
551
+
552
+ .damage-lab-exports {
553
+ display: grid;
554
+ grid-template-columns: minmax(14rem, 1fr) 2fr;
555
+ gap: 2rem;
556
+ background: var(--n-dl-paper-soft);
557
+ }
558
+
559
+ .damage-lab-actions {
560
+ align-content: start;
561
+ justify-content: flex-end;
562
+ }
563
+
564
+ .damage-lab-actions button,
565
+ .damage-lab-actions label {
566
+ position: relative;
567
+ min-height: 2.5rem;
568
+ padding: 0.5rem 0.75rem;
569
+ color: var(--n-dl-muted);
570
+ background: transparent;
571
+ border: 0;
572
+ border-bottom: 1px solid var(--n-dl-line);
573
+ cursor: pointer;
574
+ }
575
+
576
+ .damage-lab-actions button:hover,
577
+ .damage-lab-actions label:hover {
578
+ color: var(--n-dl-ink);
579
+ border-color: var(--n-dl-ink);
580
+ }
581
+
582
+ .damage-lab-actions input {
583
+ position: absolute;
584
+ width: 1px;
585
+ height: 1px;
586
+ opacity: 0;
587
+ }
588
+
589
+ .damage-lab-status {
590
+ grid-column: 1 / -1;
591
+ min-height: 1.4rem;
592
+ margin: 0;
593
+ font-weight: 700;
594
+ }
595
+
596
+ @media (max-width: 800px) {
597
+ .damage-lab-formulas,
598
+ .damage-lab-notes,
599
+ .damage-lab-exports {
600
+ grid-template-columns: 1fr;
601
+ }
602
+
603
+ .damage-lab-pressure {
604
+ border-right: 0;
605
+ border-bottom: 1px solid var(--n-dl-line);
606
+ }
607
+
608
+ .damage-lab-core-inputs,
609
+ .damage-lab-advanced-grid {
610
+ grid-template-columns: repeat(2, minmax(0, 1fr));
611
+ }
612
+
613
+ .damage-lab-actions {
614
+ justify-content: flex-start;
615
+ }
616
+ }
617
+
618
+ @media (max-width: 540px) {
619
+ .damage-lab {
620
+ border-radius: 1rem;
621
+ }
622
+
623
+ .damage-lab-heading {
624
+ display: grid;
625
+ }
626
+
627
+ .damage-lab-core-inputs {
628
+ grid-template-columns: 1fr 1fr;
629
+ }
630
+
631
+ .damage-lab-totals {
632
+ gap: 1.5rem;
633
+ }
634
+
635
+ .damage-lab-totals dl {
636
+ display: grid;
637
+ gap: 0.5rem;
638
+ }
639
+
640
+ .damage-lab-heatmap {
641
+ overflow-x: auto;
642
+ grid-template-columns: repeat(9, 2.25rem);
643
+ }
644
+ }