@jjlmoya/utils-games-development 1.55.0 → 1.56.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 (38) hide show
  1. package/package.json +1 -1
  2. package/src/entries.ts +4 -1
  3. package/src/index.ts +1 -0
  4. package/src/tests/contrast_legibility.test.ts +56 -10
  5. package/src/tests/locale_completeness.test.ts +2 -2
  6. package/src/tests/tool_validation.test.ts +2 -2
  7. package/src/tool/localizationSanitizer/localization-sanitizer.css +4 -2
  8. package/src/tool/pixelArtPaletteSwapper/app-client.ts +229 -0
  9. package/src/tool/pixelArtPaletteSwapper/bibliography.astro +6 -0
  10. package/src/tool/pixelArtPaletteSwapper/bibliography.ts +16 -0
  11. package/src/tool/pixelArtPaletteSwapper/component.astro +153 -0
  12. package/src/tool/pixelArtPaletteSwapper/entry.ts +28 -0
  13. package/src/tool/pixelArtPaletteSwapper/i18n/de.ts +233 -0
  14. package/src/tool/pixelArtPaletteSwapper/i18n/en.ts +233 -0
  15. package/src/tool/pixelArtPaletteSwapper/i18n/es.ts +233 -0
  16. package/src/tool/pixelArtPaletteSwapper/i18n/fr.ts +233 -0
  17. package/src/tool/pixelArtPaletteSwapper/i18n/id.ts +233 -0
  18. package/src/tool/pixelArtPaletteSwapper/i18n/it.ts +233 -0
  19. package/src/tool/pixelArtPaletteSwapper/i18n/ja.ts +225 -0
  20. package/src/tool/pixelArtPaletteSwapper/i18n/ko.ts +225 -0
  21. package/src/tool/pixelArtPaletteSwapper/i18n/nl.ts +233 -0
  22. package/src/tool/pixelArtPaletteSwapper/i18n/pl.ts +233 -0
  23. package/src/tool/pixelArtPaletteSwapper/i18n/pt.ts +233 -0
  24. package/src/tool/pixelArtPaletteSwapper/i18n/ru.ts +233 -0
  25. package/src/tool/pixelArtPaletteSwapper/i18n/sv.ts +233 -0
  26. package/src/tool/pixelArtPaletteSwapper/i18n/tr.ts +233 -0
  27. package/src/tool/pixelArtPaletteSwapper/i18n/zh.ts +225 -0
  28. package/src/tool/pixelArtPaletteSwapper/index.ts +12 -0
  29. package/src/tool/pixelArtPaletteSwapper/logic.test.ts +43 -0
  30. package/src/tool/pixelArtPaletteSwapper/logic.ts +171 -0
  31. package/src/tool/pixelArtPaletteSwapper/pixel-art-palette-swapper.css +728 -0
  32. package/src/tool/pixelArtPaletteSwapper/seo.astro +15 -0
  33. package/src/tool/pixelArtPaletteSwapper/ui.ts +35 -0
  34. package/src/tool/retroSfxGenerator/client.ts +9 -2
  35. package/src/tool/retroSfxGenerator/logic.test.ts +21 -0
  36. package/src/tool/retroSfxGenerator/logic.ts +1 -1
  37. package/src/tool/retroSfxGenerator/retro-sfx-generator.css +10 -4
  38. package/src/tools.ts +2 -0
@@ -0,0 +1,728 @@
1
+ .pas-shell {
2
+ --pas-ink: #17151d;
3
+ --pas-muted: #55505b;
4
+ --pas-paper: #f6f3ed;
5
+ --pas-card: #fffdf9;
6
+ --pas-border: #dfd9d0;
7
+ --pas-accent: #c63d31;
8
+ --pas-accent-dark: #9d2f29;
9
+ --pas-lime: #b9d83d;
10
+ --pas-violet: #6557c8;
11
+ --pas-white: #fff;
12
+ --pas-shadow: 0 18px 40px rgba(40, 28, 35, 0.09);
13
+
14
+ color: var(--pas-ink);
15
+ font-size: 16px;
16
+ background: var(--pas-paper);
17
+ border: 1px solid var(--pas-border);
18
+ border-radius: 24px;
19
+ box-shadow: var(--pas-shadow);
20
+ overflow: hidden;
21
+ }
22
+
23
+ .pas-command-bar {
24
+ display: flex;
25
+ align-items: center;
26
+ gap: 12px;
27
+ padding: 16px 18px;
28
+ border-bottom: 1px solid var(--pas-border);
29
+ background: var(--pas-card);
30
+ }
31
+
32
+ .pas-command-bar.has-image .pas-drop-zone {
33
+ display: none;
34
+ }
35
+
36
+ .pas-drop-zone {
37
+ display: flex;
38
+ align-items: center;
39
+ gap: 10px;
40
+ min-width: 270px;
41
+ padding: 10px 14px;
42
+ border: 1px dashed #c6beb3;
43
+ border-radius: 14px;
44
+ cursor: pointer;
45
+ transition: border-color 160ms ease, background 160ms ease, transform 160ms ease;
46
+ }
47
+
48
+ .pas-drop-zone:hover,
49
+ .pas-drop-zone:focus-visible,
50
+ .pas-drop-zone.is-dragging {
51
+ border-color: var(--pas-accent);
52
+ background: #fff5f0;
53
+ outline: none;
54
+ transform: translateY(-1px);
55
+ }
56
+
57
+ .pas-drop-mark {
58
+ display: grid;
59
+ width: 30px;
60
+ height: 30px;
61
+ place-items: center;
62
+ border-radius: 8px;
63
+ background: var(--pas-ink);
64
+ color: var(--pas-paper);
65
+ font-size: 22px;
66
+ line-height: 1;
67
+ }
68
+
69
+ .pas-drop-copy {
70
+ display: grid;
71
+ gap: 2px;
72
+ }
73
+
74
+ .pas-drop-copy strong,
75
+ .pas-drop-copy small {
76
+ display: block;
77
+ }
78
+
79
+ .pas-drop-copy strong {
80
+ font-size: 13px;
81
+ letter-spacing: -0.01em;
82
+ }
83
+
84
+ .pas-drop-copy small,
85
+ .pas-file-name,
86
+ .pas-status,
87
+ .pas-preview-footer,
88
+ .pas-download-hint,
89
+ .pas-custom-block small {
90
+ color: var(--pas-muted);
91
+ font-size: 13px;
92
+ }
93
+
94
+ .pas-button {
95
+ border: 0;
96
+ border-radius: 10px;
97
+ padding: 11px 15px;
98
+ font: inherit;
99
+ font-size: 12px;
100
+ font-weight: 700;
101
+ cursor: pointer;
102
+ transition: transform 160ms ease, background 160ms ease, opacity 160ms ease;
103
+ }
104
+
105
+ .pas-button:hover:not(:disabled) {
106
+ transform: translateY(-1px);
107
+ }
108
+
109
+ .pas-button:focus-visible,
110
+ .pas-preset:focus-visible,
111
+ .pas-text-button:focus-visible,
112
+ .pas-zoom-control input:focus-visible,
113
+ .pas-toggle-row input:focus-visible,
114
+ .pas-custom-block textarea:focus-visible {
115
+ outline: 3px solid rgba(101, 87, 200, 0.25);
116
+ outline-offset: 2px;
117
+ }
118
+
119
+ .pas-button-primary {
120
+ background: var(--pas-accent);
121
+ color: var(--pas-white);
122
+ }
123
+
124
+ .pas-button-primary:hover {
125
+ background: var(--pas-accent-dark);
126
+ }
127
+
128
+ .pas-button-dark {
129
+ background: var(--pas-ink);
130
+ color: var(--pas-paper);
131
+ }
132
+
133
+ .pas-button:disabled {
134
+ cursor: not-allowed;
135
+ opacity: 0.42;
136
+ }
137
+
138
+ .pas-file-name {
139
+ max-width: 180px;
140
+ overflow: hidden;
141
+ text-overflow: ellipsis;
142
+ white-space: nowrap;
143
+ }
144
+
145
+ .pas-status {
146
+ margin-left: auto;
147
+ font-weight: 700;
148
+ }
149
+
150
+ .pas-status[data-tone='ready'] {
151
+ color: var(--pas-accent-dark);
152
+ }
153
+
154
+ .pas-status[data-tone='working'] {
155
+ color: var(--pas-violet);
156
+ }
157
+
158
+ .pas-status[data-tone='error'] {
159
+ color: var(--pas-accent-dark);
160
+ }
161
+
162
+ .pas-workbench {
163
+ display: grid;
164
+ grid-template-columns: 245px minmax(0, 1fr) 215px;
165
+ min-height: 620px;
166
+ }
167
+
168
+ .pas-panel {
169
+ padding: 24px 18px;
170
+ background: var(--pas-card);
171
+ }
172
+
173
+ .pas-palette-panel {
174
+ border-right: 1px solid var(--pas-border);
175
+ }
176
+
177
+ .pas-inspector-panel {
178
+ border-left: 1px solid var(--pas-border);
179
+ }
180
+
181
+ .pas-panel-heading {
182
+ display: flex;
183
+ align-items: baseline;
184
+ gap: 9px;
185
+ margin-bottom: 18px;
186
+ }
187
+
188
+ .pas-panel-heading h2 {
189
+ margin: 0;
190
+ font-size: 20px;
191
+ letter-spacing: -0.04em;
192
+ }
193
+
194
+ .pas-kicker {
195
+ color: var(--pas-accent);
196
+ font-size: 12px;
197
+ font-weight: 800;
198
+ letter-spacing: 0.12em;
199
+ }
200
+
201
+ .pas-preset-grid {
202
+ display: grid;
203
+ gap: 8px;
204
+ }
205
+
206
+ .pas-preset {
207
+ display: grid;
208
+ gap: 9px;
209
+ padding: 11px;
210
+ border: 1px solid var(--pas-border);
211
+ border-radius: 12px;
212
+ background: transparent;
213
+ color: var(--pas-ink);
214
+ text-align: left;
215
+ cursor: pointer;
216
+ transition: border-color 160ms ease, background 160ms ease, transform 160ms ease;
217
+ }
218
+
219
+ .pas-preset:hover,
220
+ .pas-preset.is-selected {
221
+ border-color: var(--pas-accent);
222
+ background: #fff7f2;
223
+ transform: translateX(2px);
224
+ }
225
+
226
+ .pas-preset.is-selected {
227
+ box-shadow: inset 3px 0 0 var(--pas-accent);
228
+ }
229
+
230
+ .pas-preset-name {
231
+ font-size: 13px;
232
+ font-weight: 700;
233
+ }
234
+
235
+ .pas-swatch-strip {
236
+ display: flex;
237
+ height: 13px;
238
+ overflow: hidden;
239
+ border-radius: 4px;
240
+ }
241
+
242
+ .pas-swatch-strip span {
243
+ flex: 1 1 0;
244
+ min-width: 3px;
245
+ }
246
+
247
+ .pas-custom-block {
248
+ margin-top: 24px;
249
+ padding-top: 18px;
250
+ border-top: 1px solid var(--pas-border);
251
+ }
252
+
253
+ .pas-field-heading,
254
+ .pas-inline-actions,
255
+ .pas-toggle-row,
256
+ .pas-preview-footer,
257
+ .pas-zoom-control,
258
+ .pas-stats-list div {
259
+ display: flex;
260
+ align-items: center;
261
+ justify-content: space-between;
262
+ }
263
+
264
+ .pas-field-heading {
265
+ margin-bottom: 8px;
266
+ font-size: 13px;
267
+ font-weight: 700;
268
+ }
269
+
270
+ .pas-field-heading span {
271
+ color: var(--pas-muted);
272
+ font-size: 12px;
273
+ font-weight: 500;
274
+ }
275
+
276
+ .pas-custom-block textarea {
277
+ width: 100%;
278
+ box-sizing: border-box;
279
+ resize: vertical;
280
+ border: 1px solid var(--pas-border);
281
+ border-radius: 10px;
282
+ background: var(--pas-paper);
283
+ color: var(--pas-ink);
284
+ padding: 9px;
285
+ font: 11px/1.5 SFMono-Regular, Consolas, monospace;
286
+ }
287
+
288
+ .pas-custom-block small {
289
+ display: block;
290
+ margin-top: 6px;
291
+ line-height: 1.4;
292
+ font-size: 12px;
293
+ }
294
+
295
+ .pas-inline-actions {
296
+ gap: 8px;
297
+ justify-content: flex-start;
298
+ margin-top: 11px;
299
+ }
300
+
301
+ .pas-inline-actions .pas-button {
302
+ padding: 8px 10px;
303
+ font-size: 12px;
304
+ }
305
+
306
+ .pas-text-button {
307
+ border: 0;
308
+ padding: 6px 0;
309
+ background: none;
310
+ color: var(--pas-muted);
311
+ font: inherit;
312
+ font-size: 12px;
313
+ cursor: pointer;
314
+ }
315
+
316
+ .pas-text-button:hover {
317
+ color: var(--pas-accent-dark);
318
+ }
319
+
320
+ .pas-toggle-row {
321
+ position: relative;
322
+ justify-content: flex-start;
323
+ gap: 10px;
324
+ margin-top: 24px;
325
+ color: var(--pas-muted);
326
+ font-size: 13px;
327
+ cursor: pointer;
328
+ }
329
+
330
+ .pas-toggle-row input {
331
+ position: absolute;
332
+ width: 1px;
333
+ height: 1px;
334
+ opacity: 0;
335
+ }
336
+
337
+ .pas-toggle {
338
+ position: relative;
339
+ width: 33px;
340
+ height: 19px;
341
+ margin-left: auto;
342
+ border-radius: 99px;
343
+ background: #d7d0c8;
344
+ transition: background 160ms ease;
345
+ }
346
+
347
+ .pas-toggle::after {
348
+ position: absolute;
349
+ top: 3px;
350
+ left: 3px;
351
+ width: 13px;
352
+ height: 13px;
353
+ border-radius: 50%;
354
+ background: #fff;
355
+ content: '';
356
+ transition: transform 160ms ease;
357
+ }
358
+
359
+ .pas-toggle-row input:checked + .pas-toggle {
360
+ background: var(--pas-lime);
361
+ }
362
+
363
+ .pas-toggle-row input:checked + .pas-toggle::after {
364
+ transform: translateX(14px);
365
+ }
366
+
367
+ .pas-preview-panel {
368
+ display: flex;
369
+ min-width: 0;
370
+ flex-direction: column;
371
+ padding: 24px;
372
+ background: #eeebe5;
373
+ }
374
+
375
+ .pas-preview-heading {
376
+ justify-content: space-between;
377
+ }
378
+
379
+ .pas-zoom-control {
380
+ gap: 8px;
381
+ color: var(--pas-muted);
382
+ font-size: 12px;
383
+ }
384
+
385
+ .pas-zoom-control input {
386
+ width: 72px;
387
+ accent-color: var(--pas-accent);
388
+ }
389
+
390
+ .pas-zoom-control output {
391
+ min-width: 24px;
392
+ color: var(--pas-ink);
393
+ font-size: 12px;
394
+ font-weight: 800;
395
+ }
396
+
397
+ .pas-canvas-stage {
398
+ position: relative;
399
+ display: grid;
400
+ min-height: 450px;
401
+ flex: 1;
402
+ place-items: center;
403
+ padding: 24px;
404
+ border: 1px solid #d5cec3;
405
+ border-radius: 16px;
406
+ background-color: #e1ddd6;
407
+ background-image: linear-gradient(45deg, #d6d1c9 25%, transparent 25%), linear-gradient(-45deg, #d6d1c9 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #d6d1c9 75%), linear-gradient(-45deg, transparent 75%, #d6d1c9 75%);
408
+ background-position: 0 0, 0 8px, 8px -8px, -8px 0;
409
+ background-size: 16px 16px;
410
+ overflow: auto;
411
+ }
412
+
413
+ .pas-empty-state {
414
+ display: grid;
415
+ place-items: center;
416
+ gap: 10px;
417
+ color: var(--pas-muted);
418
+ text-align: center;
419
+ }
420
+
421
+ .pas-empty-state strong {
422
+ color: var(--pas-ink);
423
+ font-size: 16px;
424
+ }
425
+
426
+ .pas-empty-state span {
427
+ max-width: 240px;
428
+ font-size: 13px;
429
+ line-height: 1.5;
430
+ }
431
+
432
+ .pas-empty-pixel {
433
+ width: 48px;
434
+ height: 48px;
435
+ background: conic-gradient(from 90deg at 50% 50%, var(--pas-accent) 0 25%, var(--pas-violet) 0 50%, var(--pas-lime) 0 75%, var(--pas-ink) 0);
436
+ image-rendering: pixelated;
437
+ box-shadow: 9px 0 0 -3px var(--pas-ink), 0 9px 0 -3px var(--pas-accent);
438
+ }
439
+
440
+ .pas-canvas-pair {
441
+ display: grid;
442
+ width: 100%;
443
+ grid-template-columns: repeat(2, minmax(0, 1fr));
444
+ align-items: center;
445
+ gap: 14px;
446
+ }
447
+
448
+ .pas-canvas-card {
449
+ min-width: 0;
450
+ margin: 0;
451
+ padding: 11px;
452
+ border: 1px solid rgba(64, 52, 54, 0.13);
453
+ border-radius: 12px;
454
+ background: rgba(255, 253, 249, 0.72);
455
+ }
456
+
457
+ .pas-canvas-card figcaption {
458
+ display: flex;
459
+ align-items: center;
460
+ gap: 6px;
461
+ margin-bottom: 9px;
462
+ color: var(--pas-muted);
463
+ font-size: 12px;
464
+ font-weight: 800;
465
+ letter-spacing: 0.04em;
466
+ text-transform: uppercase;
467
+ }
468
+
469
+ .pas-canvas-card canvas {
470
+ display: block;
471
+ max-width: 100%;
472
+ margin: 0 auto;
473
+ image-rendering: crisp-edges;
474
+ }
475
+
476
+ .pas-result-card {
477
+ border-color: rgba(101, 87, 200, 0.3);
478
+ box-shadow: 0 8px 20px rgba(101, 87, 200, 0.1);
479
+ }
480
+
481
+ .pas-dot {
482
+ width: 7px;
483
+ height: 7px;
484
+ border-radius: 50%;
485
+ }
486
+
487
+ .pas-dot-source {
488
+ background: var(--pas-accent);
489
+ }
490
+
491
+ .pas-dot-result {
492
+ background: var(--pas-violet);
493
+ }
494
+
495
+ .pas-preview-footer {
496
+ gap: 12px;
497
+ padding-top: 12px;
498
+ }
499
+
500
+ .pas-preview-footer span:last-child {
501
+ overflow: hidden;
502
+ text-overflow: ellipsis;
503
+ white-space: nowrap;
504
+ }
505
+
506
+ .pas-shortcut {
507
+ font-size: 12px;
508
+ font-weight: 700;
509
+ }
510
+
511
+ .pas-inspector-preview {
512
+ display: grid;
513
+ min-height: 156px;
514
+ place-items: center;
515
+ margin-bottom: 24px;
516
+ border: 1px solid var(--pas-border);
517
+ border-radius: 14px;
518
+ background-color: #e1ddd6;
519
+ background-image: linear-gradient(45deg, #d6d1c9 25%, transparent 25%), linear-gradient(-45deg, #d6d1c9 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #d6d1c9 75%), linear-gradient(-45deg, transparent 75%, #d6d1c9 75%);
520
+ background-position: 0 0, 0 8px, 8px -8px, -8px 0;
521
+ background-size: 16px 16px;
522
+ background-repeat: repeat, repeat, repeat, repeat;
523
+ background-origin: border-box;
524
+ background-clip: border-box;
525
+ }
526
+
527
+ .pas-inspector-preview[style*='url'] {
528
+ background-size: contain;
529
+ background-repeat: no-repeat;
530
+ }
531
+
532
+ .pas-inspector-pixel-grid {
533
+ width: 62px;
534
+ height: 62px;
535
+ opacity: 0.75;
536
+ background: repeating-conic-gradient(#d4cec4 0 25%, #eeeae4 0 50%) 50% / 12px 12px;
537
+ }
538
+
539
+ .pas-inspector-preview[style*='url'] .pas-inspector-pixel-grid {
540
+ display: none;
541
+ }
542
+
543
+ .pas-stats-list {
544
+ display: grid;
545
+ gap: 14px;
546
+ margin-bottom: 24px;
547
+ }
548
+
549
+ .pas-stats-list div {
550
+ gap: 10px;
551
+ border-bottom: 1px solid var(--pas-border);
552
+ padding-bottom: 9px;
553
+ }
554
+
555
+ .pas-stats-list span {
556
+ color: var(--pas-muted);
557
+ font-size: 12px;
558
+ }
559
+
560
+ .pas-stats-list strong {
561
+ font-size: 14px;
562
+ }
563
+
564
+ .pas-download-button {
565
+ width: 100%;
566
+ background: var(--pas-violet);
567
+ color: var(--pas-white);
568
+ }
569
+
570
+ .pas-download-button:hover:not(:disabled) {
571
+ background: #5145aa;
572
+ }
573
+
574
+ .pas-download-hint {
575
+ display: block;
576
+ margin-top: 9px;
577
+ font-size: 12px;
578
+ line-height: 1.5;
579
+ text-align: center;
580
+ }
581
+
582
+ .pas-visually-hidden {
583
+ position: absolute;
584
+ width: 1px;
585
+ height: 1px;
586
+ overflow: hidden;
587
+ clip-path: inset(50%);
588
+ white-space: nowrap;
589
+ }
590
+
591
+ .theme-dark .pas-shell {
592
+ --pas-ink: #f7f1e8;
593
+ --pas-muted: #d6ced7;
594
+ --pas-paper: #1c1a20;
595
+ --pas-card: #252229;
596
+ --pas-border: #3b3742;
597
+ --pas-shadow: 0 18px 40px rgba(0, 0, 0, 0.2);
598
+ }
599
+
600
+ .theme-dark .pas-command-bar,
601
+ .theme-dark .pas-panel {
602
+ background: var(--pas-card);
603
+ }
604
+
605
+ .theme-dark .pas-drop-zone:hover,
606
+ .theme-dark .pas-drop-zone:focus-visible,
607
+ .theme-dark .pas-drop-zone.is-dragging,
608
+ .theme-dark .pas-preset:hover,
609
+ .theme-dark .pas-preset.is-selected {
610
+ background: #30242a;
611
+ }
612
+
613
+ .theme-dark .pas-preview-panel {
614
+ background: #242127;
615
+ }
616
+
617
+ .theme-dark .pas-canvas-stage,
618
+ .theme-dark .pas-inspector-preview {
619
+ background-color: #302d35;
620
+ background-image: linear-gradient(45deg, #3b3741 25%, transparent 25%), linear-gradient(-45deg, #3b3741 25%, transparent 25%), linear-gradient(45deg, transparent 75%, #3b3741 75%), linear-gradient(-45deg, transparent 75%, #3b3741 75%);
621
+ }
622
+
623
+ .theme-dark .pas-canvas-card {
624
+ background: rgba(37, 34, 41, 0.82);
625
+ }
626
+
627
+ @media (max-width: 980px) {
628
+ .pas-workbench {
629
+ grid-template-columns: 220px minmax(0, 1fr);
630
+ }
631
+
632
+ .pas-inspector-panel {
633
+ grid-column: 1 / -1;
634
+ border-top: 1px solid var(--pas-border);
635
+ border-left: 0;
636
+ }
637
+
638
+ .pas-inspector-preview {
639
+ display: none;
640
+ }
641
+
642
+ .pas-stats-list {
643
+ grid-template-columns: repeat(4, 1fr);
644
+ }
645
+
646
+ .pas-download-button {
647
+ width: auto;
648
+ min-width: 170px;
649
+ }
650
+
651
+ .pas-download-hint {
652
+ display: inline-block;
653
+ margin-left: 12px;
654
+ }
655
+ }
656
+
657
+ @media (max-width: 680px) {
658
+ .pas-shell {
659
+ border-radius: 16px;
660
+ }
661
+
662
+ .pas-command-bar {
663
+ flex-wrap: wrap;
664
+ }
665
+
666
+ .pas-drop-zone {
667
+ min-width: 0;
668
+ flex: 1 1 100%;
669
+ }
670
+
671
+ .pas-status {
672
+ margin-left: 0;
673
+ }
674
+
675
+ .pas-workbench {
676
+ display: block;
677
+ min-height: 0;
678
+ }
679
+
680
+ .pas-palette-panel,
681
+ .pas-inspector-panel {
682
+ border: 0;
683
+ }
684
+
685
+ .pas-palette-panel {
686
+ border-bottom: 1px solid var(--pas-border);
687
+ }
688
+
689
+ .pas-preset-grid {
690
+ grid-template-columns: repeat(2, minmax(0, 1fr));
691
+ }
692
+
693
+ .pas-preview-panel {
694
+ padding: 18px 12px;
695
+ }
696
+
697
+ .pas-canvas-stage {
698
+ min-height: 310px;
699
+ padding: 12px;
700
+ }
701
+
702
+ .pas-canvas-pair {
703
+ grid-template-columns: 1fr;
704
+ }
705
+
706
+ .pas-preview-heading {
707
+ align-items: flex-start;
708
+ flex-direction: column;
709
+ }
710
+
711
+ .pas-preview-footer {
712
+ align-items: flex-start;
713
+ flex-direction: column;
714
+ }
715
+
716
+ .pas-stats-list {
717
+ grid-template-columns: repeat(2, 1fr);
718
+ }
719
+
720
+ .pas-download-button {
721
+ width: 100%;
722
+ }
723
+
724
+ .pas-download-hint {
725
+ display: block;
726
+ margin-left: 0;
727
+ }
728
+ }
@@ -0,0 +1,15 @@
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { pixelArtPaletteSwapper } from './entry';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'en' } = Astro.props;
11
+ const loader = pixelArtPaletteSwapper.i18n[locale] ?? pixelArtPaletteSwapper.i18n.en;
12
+ const content = loader ? await loader() : null;
13
+ ---
14
+
15
+ {content && content.seo.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}