@jjlmoya/utils-games-development 1.68.0 → 1.70.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 (72) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +3 -1
  3. package/src/entries.ts +8 -1
  4. package/src/index.ts +1 -0
  5. package/src/tests/locale_completeness.test.ts +9 -2
  6. package/src/tests/tool_validation.test.ts +2 -2
  7. package/src/tool/fixerEditor/auto-trim.ts +37 -0
  8. package/src/tool/fixerEditor/bibliography.astro +6 -0
  9. package/src/tool/fixerEditor/bibliography.ts +6 -0
  10. package/src/tool/fixerEditor/component.astro +114 -0
  11. package/src/tool/fixerEditor/controller.ts +275 -0
  12. package/src/tool/fixerEditor/dom-views.ts +200 -0
  13. package/src/tool/fixerEditor/entry.ts +28 -0
  14. package/src/tool/fixerEditor/evaluator.ts +17 -0
  15. package/src/tool/fixerEditor/events.ts +98 -0
  16. package/src/tool/fixerEditor/exporter.ts +42 -0
  17. package/src/tool/fixerEditor/fixer-editor.css +603 -0
  18. package/src/tool/fixerEditor/i18n/de.ts +82 -0
  19. package/src/tool/fixerEditor/i18n/en.ts +114 -0
  20. package/src/tool/fixerEditor/i18n/es.ts +82 -0
  21. package/src/tool/fixerEditor/i18n/fr.ts +82 -0
  22. package/src/tool/fixerEditor/i18n/id.ts +82 -0
  23. package/src/tool/fixerEditor/i18n/it.ts +82 -0
  24. package/src/tool/fixerEditor/i18n/ja.ts +81 -0
  25. package/src/tool/fixerEditor/i18n/ko.ts +81 -0
  26. package/src/tool/fixerEditor/i18n/localized.ts +391 -0
  27. package/src/tool/fixerEditor/i18n/nl.ts +82 -0
  28. package/src/tool/fixerEditor/i18n/pl.ts +82 -0
  29. package/src/tool/fixerEditor/i18n/pt.ts +82 -0
  30. package/src/tool/fixerEditor/i18n/ru.ts +82 -0
  31. package/src/tool/fixerEditor/i18n/sv.ts +82 -0
  32. package/src/tool/fixerEditor/i18n/tr.ts +82 -0
  33. package/src/tool/fixerEditor/i18n/zh.ts +80 -0
  34. package/src/tool/fixerEditor/index.ts +11 -0
  35. package/src/tool/fixerEditor/logic.test.ts +69 -0
  36. package/src/tool/fixerEditor/logic.ts +234 -0
  37. package/src/tool/fixerEditor/runtime.ts +88 -0
  38. package/src/tool/fixerEditor/seo.astro +15 -0
  39. package/src/tool/fixerEditor/state.ts +10 -0
  40. package/src/tool/fixerEditor/storage.ts +68 -0
  41. package/src/tool/fixerEditor/types.ts +70 -0
  42. package/src/tool/fixerEditor/ui.ts +71 -0
  43. package/src/tool/gamePixelPerUnitPlanner/bibliography.astro +6 -0
  44. package/src/tool/gamePixelPerUnitPlanner/bibliography.ts +20 -0
  45. package/src/tool/gamePixelPerUnitPlanner/component.astro +56 -0
  46. package/src/tool/gamePixelPerUnitPlanner/controller.ts +127 -0
  47. package/src/tool/gamePixelPerUnitPlanner/dom-views.ts +47 -0
  48. package/src/tool/gamePixelPerUnitPlanner/entry.ts +27 -0
  49. package/src/tool/gamePixelPerUnitPlanner/evaluator.ts +14 -0
  50. package/src/tool/gamePixelPerUnitPlanner/game-pixel-per-unit-planner.css +652 -0
  51. package/src/tool/gamePixelPerUnitPlanner/i18n/de.ts +51 -0
  52. package/src/tool/gamePixelPerUnitPlanner/i18n/en.ts +171 -0
  53. package/src/tool/gamePixelPerUnitPlanner/i18n/es.ts +53 -0
  54. package/src/tool/gamePixelPerUnitPlanner/i18n/fr.ts +33 -0
  55. package/src/tool/gamePixelPerUnitPlanner/i18n/id.ts +33 -0
  56. package/src/tool/gamePixelPerUnitPlanner/i18n/it.ts +33 -0
  57. package/src/tool/gamePixelPerUnitPlanner/i18n/ja.ts +33 -0
  58. package/src/tool/gamePixelPerUnitPlanner/i18n/ko.ts +33 -0
  59. package/src/tool/gamePixelPerUnitPlanner/i18n/nl.ts +33 -0
  60. package/src/tool/gamePixelPerUnitPlanner/i18n/pl.ts +33 -0
  61. package/src/tool/gamePixelPerUnitPlanner/i18n/pt.ts +33 -0
  62. package/src/tool/gamePixelPerUnitPlanner/i18n/ru.ts +33 -0
  63. package/src/tool/gamePixelPerUnitPlanner/i18n/sv.ts +33 -0
  64. package/src/tool/gamePixelPerUnitPlanner/i18n/tr.ts +33 -0
  65. package/src/tool/gamePixelPerUnitPlanner/i18n/zh.ts +33 -0
  66. package/src/tool/gamePixelPerUnitPlanner/index.ts +11 -0
  67. package/src/tool/gamePixelPerUnitPlanner/logic.test.ts +34 -0
  68. package/src/tool/gamePixelPerUnitPlanner/logic.ts +129 -0
  69. package/src/tool/gamePixelPerUnitPlanner/seo.astro +15 -0
  70. package/src/tool/gamePixelPerUnitPlanner/storage.ts +23 -0
  71. package/src/tool/gamePixelPerUnitPlanner/ui.ts +65 -0
  72. package/src/tools.ts +4 -0
@@ -0,0 +1,603 @@
1
+ .fe-shell {
2
+ --n-bg: #f4efe6;
3
+ --n-surface: #fffdf8;
4
+ --n-surface-alt: #eee6d8;
5
+ --n-ink: #1d2730;
6
+ --n-muted: #65727a;
7
+ --n-line: #d7cfc1;
8
+ --n-accent: #a7442f;
9
+ --n-accent-ink: #fff;
10
+ --n-gold: #c28b2c;
11
+ --n-gold-ink: #1d2730;
12
+ --n-teal: #197a78;
13
+ --n-danger: #a43d38;
14
+ --n-checker-a: #f8f5ee;
15
+ --n-checker-b: #e5ded1;
16
+
17
+ color: var(--n-ink);
18
+ display: grid;
19
+ gap: 1rem;
20
+ background: var(--n-bg);
21
+ border: 1px solid var(--n-line);
22
+ padding: 1rem;
23
+ }
24
+
25
+ .theme-dark .fe-shell {
26
+ --n-bg: #171b1d;
27
+ --n-surface: #22292b;
28
+ --n-surface-alt: #2c3537;
29
+ --n-ink: #f6f0e7;
30
+ --n-muted: #b4bbb8;
31
+ --n-line: #465154;
32
+ --n-accent: #ae432f;
33
+ --n-accent-ink: #fff;
34
+ --n-gold: #e4b54d;
35
+ --n-gold-ink: #1c1714;
36
+ --n-teal: #6fd1c0;
37
+ --n-danger: #ee8b79;
38
+ --n-checker-a: #2b3335;
39
+ --n-checker-b: #202628;
40
+ }
41
+
42
+ .fe-shell[hidden],
43
+ .fe-workbench[hidden],
44
+ .fe-output-bar[hidden] {
45
+ display: none;
46
+ }
47
+ .fe-command-rail,
48
+ .fe-output-bar {
49
+ align-items: center;
50
+ background: var(--n-surface);
51
+ border: 0;
52
+ display: flex;
53
+ gap: 0.75rem;
54
+ padding: 0 0 1rem;
55
+ }
56
+ .fe-command-rail {
57
+ border-bottom: 1px solid var(--n-line);
58
+ display: grid;
59
+ gap: 0;
60
+ grid-template-columns: 1fr;
61
+ }
62
+ .fe-upload-zone {
63
+ align-items: center;
64
+ border: 1px dashed var(--n-accent);
65
+ cursor: pointer;
66
+ display: flex;
67
+ flex-direction: column;
68
+ gap: 0.7rem;
69
+ justify-content: center;
70
+ min-height: 11rem;
71
+ padding: 1.5rem;
72
+ text-align: center;
73
+ }
74
+ .fe-upload-zone:focus-visible,
75
+ .fe-button:focus-visible,
76
+ .fe-frame-button:focus-visible,
77
+ .fe-nudge:focus-visible,
78
+ .fe-step:focus-visible,
79
+ input:focus-visible {
80
+ outline: 3px solid var(--n-gold);
81
+ outline-offset: 2px;
82
+ }
83
+ .fe-upload-zone.is-dragging {
84
+ background: var(--n-surface-alt);
85
+ }
86
+ .fe-upload-mark {
87
+ align-items: center;
88
+ background: var(--n-accent);
89
+ color: var(--n-accent-ink);
90
+ display: flex;
91
+ font-size: 1.4rem;
92
+ height: 2rem;
93
+ justify-content: center;
94
+ width: 2rem;
95
+ }
96
+ .fe-upload-copy {
97
+ display: grid;
98
+ gap: 0.15rem;
99
+ }
100
+ .fe-upload-cta {
101
+ pointer-events: none;
102
+ white-space: nowrap;
103
+ }
104
+ .fe-upload-copy small,
105
+ .fe-file-name,
106
+ .fe-status,
107
+ .fe-stage-footer,
108
+ .fe-output-copy {
109
+ color: var(--n-muted);
110
+ font-size: 0.78rem;
111
+ }
112
+
113
+ .fe-file-name {
114
+ display: flex;
115
+ flex-wrap: wrap;
116
+ gap: 0.35rem;
117
+ }
118
+
119
+ .fe-source-meta {
120
+ align-items: center;
121
+ border-top: 1px solid var(--n-line);
122
+ display: flex;
123
+ justify-content: space-between;
124
+ gap: 0.35rem;
125
+ padding: 0.65rem 0;
126
+ }
127
+
128
+ .fe-file-name strong {
129
+ color: var(--n-ink);
130
+ }
131
+ .fe-status {
132
+ text-align: right;
133
+ }
134
+ .fe-shell.has-image .fe-command-rail {
135
+ gap: 0.75rem;
136
+ grid-template-columns: minmax(0, 1fr) minmax(12rem, 18rem);
137
+ padding-bottom: 1rem;
138
+ }
139
+ .fe-shell.has-image .fe-upload-zone {
140
+ flex-direction: row;
141
+ justify-content: flex-start;
142
+ min-height: 3.4rem;
143
+ padding: 0.55rem 0.8rem;
144
+ text-align: left;
145
+ }
146
+ .fe-shell.has-image .fe-upload-cta {
147
+ margin-left: auto;
148
+ }
149
+ .fe-shell.has-image .fe-source-meta {
150
+ border-top: 0;
151
+ padding: 0.2rem 0 0.2rem 0.8rem;
152
+ }
153
+ .fe-button {
154
+ background: var(--n-surface-alt);
155
+ border: 1px solid var(--n-line);
156
+ color: var(--n-ink);
157
+ cursor: pointer;
158
+ font: inherit;
159
+ padding: 0.65rem 0.8rem;
160
+ }
161
+ .fe-button:hover,
162
+ .fe-step:hover,
163
+ .fe-nudge:hover {
164
+ border-color: var(--n-accent);
165
+ }
166
+ .fe-primary {
167
+ background: var(--n-accent);
168
+ border-color: var(--n-accent);
169
+ color: var(--n-accent-ink);
170
+ }
171
+ .fe-quiet {
172
+ background: transparent;
173
+ }
174
+ .fe-hidden {
175
+ display: none;
176
+ }
177
+ .fe-workbench {
178
+ background: var(--n-surface);
179
+ border-bottom: 1px solid var(--n-line);
180
+ border-top: 1px solid var(--n-line);
181
+ display: grid;
182
+ gap: 0;
183
+ grid-template-columns: minmax(15rem, 18rem) minmax(0, 1fr) minmax(
184
+ 16rem,
185
+ 20rem
186
+ );
187
+ }
188
+ .fe-panel,
189
+ .fe-stage-panel {
190
+ background: var(--n-surface);
191
+ border: 0;
192
+ min-width: 0;
193
+ padding: 1rem;
194
+ }
195
+ .fe-grid-panel,
196
+ .fe-inspector-panel {
197
+ border-right: 1px solid var(--n-line);
198
+ }
199
+ .fe-panel-label {
200
+ color: var(--n-accent);
201
+ font-size: 0.75rem;
202
+ font-weight: 800;
203
+ letter-spacing: 0.12em;
204
+ }
205
+ .fe-panel h2,
206
+ .fe-stage-panel h2 {
207
+ font-size: 1rem;
208
+ margin: 0.25rem 0 1rem;
209
+ }
210
+ .fe-field-grid,
211
+ .fe-crop-grid {
212
+ display: grid;
213
+ gap: 0.6rem;
214
+ grid-template-columns: repeat(2, minmax(0, 1fr));
215
+ }
216
+ .fe-field-grid label,
217
+ .fe-crop-grid label {
218
+ display: grid;
219
+ gap: 0.25rem;
220
+ }
221
+ .fe-field-grid span,
222
+ .fe-crop-grid span,
223
+ .fe-nudge-heading span,
224
+ .fe-zoom span,
225
+ .fe-fps span {
226
+ color: var(--n-muted);
227
+ font-size: 0.75rem;
228
+ text-transform: uppercase;
229
+ }
230
+ input[type="number"] {
231
+ background: var(--n-bg);
232
+ border: 1px solid var(--n-line);
233
+ color: var(--n-ink);
234
+ font: inherit;
235
+ min-width: 0;
236
+ padding: 0.48rem;
237
+ width: 100%;
238
+ }
239
+ input[type="range"] {
240
+ accent-color: var(--n-accent);
241
+ min-width: 5rem;
242
+ }
243
+ .fe-panel-actions,
244
+ .fe-inspector-actions,
245
+ .fe-output-actions,
246
+ .fe-step-buttons {
247
+ display: flex;
248
+ flex-wrap: wrap;
249
+ gap: 0.45rem;
250
+ }
251
+ .fe-panel-actions {
252
+ border-top: 1px solid var(--n-line);
253
+ margin-top: 1rem;
254
+ padding-top: 0.8rem;
255
+ }
256
+ .fe-stage-panel {
257
+ display: grid;
258
+ gap: 0.85rem;
259
+ }
260
+ .fe-stage-heading,
261
+ .fe-strip-heading,
262
+ .fe-inspector-heading,
263
+ .fe-nudge-heading {
264
+ align-items: center;
265
+ display: flex;
266
+ justify-content: space-between;
267
+ gap: 0.75rem;
268
+ }
269
+ .fe-stage-heading h2,
270
+ .fe-strip-heading h2 {
271
+ display: inline;
272
+ margin-left: 0.45rem;
273
+ }
274
+ .fe-zoom,
275
+ .fe-fps {
276
+ align-items: center;
277
+ display: flex;
278
+ gap: 0.4rem;
279
+ }
280
+ .fe-zoom output,
281
+ .fe-fps output {
282
+ color: var(--n-accent);
283
+ font-weight: 700;
284
+ min-width: 2.2rem;
285
+ }
286
+ .fe-sheet-pair {
287
+ display: grid;
288
+ gap: 0.8rem;
289
+ grid-template-columns: repeat(2, minmax(0, 1fr));
290
+ }
291
+ .fe-sheet-view {
292
+ background: var(--n-bg);
293
+ border: 1px solid var(--n-line);
294
+ margin: 0;
295
+ min-width: 0;
296
+ padding: 0.55rem;
297
+ }
298
+ .fe-sheet-view figcaption {
299
+ align-items: center;
300
+ display: flex;
301
+ font-size: 0.75rem;
302
+ font-weight: 700;
303
+ gap: 0.4rem;
304
+ margin-bottom: 0.45rem;
305
+ text-transform: uppercase;
306
+ }
307
+ .fe-source-mark,
308
+ .fe-result-mark {
309
+ background: var(--n-accent);
310
+ display: inline-block;
311
+ height: 0.55rem;
312
+ width: 0.55rem;
313
+ }
314
+ .fe-result-mark {
315
+ background: var(--n-teal);
316
+ }
317
+ .fe-canvas-wrap,
318
+ .fe-active-canvas-wrap {
319
+ align-items: center;
320
+ background-color: var(--n-checker-a);
321
+ background-image:
322
+ linear-gradient(
323
+ 45deg,
324
+ var(--n-checker-b) 25%,
325
+ transparent 25%,
326
+ transparent 75%,
327
+ var(--n-checker-b) 75%
328
+ ),
329
+ linear-gradient(
330
+ 45deg,
331
+ var(--n-checker-b) 25%,
332
+ transparent 25%,
333
+ transparent 75%,
334
+ var(--n-checker-b) 75%
335
+ );
336
+ background-position:
337
+ 0 0,
338
+ 8px 8px;
339
+ background-size: 16px 16px;
340
+ display: flex;
341
+ justify-content: center;
342
+ min-height: 12rem;
343
+ overflow: auto;
344
+ }
345
+ .fe-canvas-wrap canvas {
346
+ height: auto;
347
+ image-rendering: pixelated;
348
+ max-height: 28rem;
349
+ max-width: 100%;
350
+ transform: scale(var(--fe-zoom, 1));
351
+ transform-origin: center;
352
+ width: auto;
353
+ }
354
+ .fe-corrected-view canvas {
355
+ filter: saturate(1.12);
356
+ }
357
+ .fe-stage-footer {
358
+ display: flex;
359
+ justify-content: space-between;
360
+ gap: 0.75rem;
361
+ }
362
+ .fe-filmstrip {
363
+ align-items: start;
364
+ display: grid;
365
+ gap: 0.45rem;
366
+ grid-auto-rows: auto;
367
+ grid-template-columns: repeat(var(--fe-frame-columns, 4), minmax(0, 1fr));
368
+ overflow: visible;
369
+ padding: 0.25rem 0 0.5rem;
370
+ }
371
+ .fe-frame-button {
372
+ align-items: center;
373
+ background: var(--n-surface-alt);
374
+ border: 1px solid var(--n-line);
375
+ color: var(--n-ink);
376
+ cursor: pointer;
377
+ display: grid;
378
+ font-size: clamp(0.48rem, 0.75vw, 0.68rem);
379
+ font-variant-numeric: tabular-nums;
380
+ height: auto;
381
+ justify-items: center;
382
+ line-height: 1;
383
+ min-width: 0;
384
+ overflow: hidden;
385
+ padding: 0;
386
+ position: relative;
387
+ white-space: nowrap;
388
+ text-overflow: clip;
389
+ width: 100%;
390
+ aspect-ratio: 1;
391
+ max-width: 3rem;
392
+ }
393
+ .fe-frame-button.is-selected {
394
+ border: 2px solid var(--n-gold);
395
+ box-shadow: inset 0 -0.3rem var(--n-gold);
396
+ }
397
+ .fe-frame-button.is-modified::after {
398
+ background: var(--n-teal);
399
+ content: "";
400
+ height: 0.45rem;
401
+ position: absolute;
402
+ right: 0.3rem;
403
+ top: 0.3rem;
404
+ width: 0.45rem;
405
+ }
406
+ .fe-count {
407
+ color: var(--n-muted);
408
+ font-size: 0.8rem;
409
+ }
410
+ .fe-inspector-heading strong {
411
+ color: var(--n-accent);
412
+ font-size: 0.8rem;
413
+ }
414
+ .fe-active-canvas-wrap {
415
+ min-height: 13rem;
416
+ }
417
+ .fe-active-canvas-wrap canvas {
418
+ image-rendering: pixelated;
419
+ max-height: 13rem;
420
+ max-width: 100%;
421
+ width: min(100%, 13rem);
422
+ }
423
+ .fe-frame-state {
424
+ border-left: 0.25rem solid var(--n-teal);
425
+ color: var(--n-teal);
426
+ font-size: 0.78rem;
427
+ margin: 0.7rem 0;
428
+ padding: 0.35rem 0.5rem;
429
+ }
430
+ .fe-nudge-heading {
431
+ border-top: 1px solid var(--n-line);
432
+ margin-top: 0.8rem;
433
+ padding-top: 0.8rem;
434
+ }
435
+ .fe-step {
436
+ background: transparent;
437
+ border: 1px solid var(--n-line);
438
+ color: var(--n-muted);
439
+ cursor: pointer;
440
+ font-size: 0.75rem;
441
+ padding: 0.35rem 0.45rem;
442
+ }
443
+ .fe-step.is-active {
444
+ background: var(--n-gold);
445
+ border-color: var(--n-gold);
446
+ color: var(--n-gold-ink);
447
+ }
448
+ .fe-nudge-pad {
449
+ display: grid;
450
+ gap: 0.35rem;
451
+ grid-template-columns: repeat(3, 1fr);
452
+ margin: 0.8rem auto;
453
+ max-width: 10rem;
454
+ }
455
+ .fe-nudge {
456
+ background: var(--n-surface-alt);
457
+ border: 1px solid var(--n-line);
458
+ color: var(--n-ink);
459
+ cursor: pointer;
460
+ min-height: 2.4rem;
461
+ }
462
+ .fe-crosshair {
463
+ align-self: center;
464
+ background: var(--n-accent);
465
+ height: 0.45rem;
466
+ justify-self: center;
467
+ position: relative;
468
+ width: 0.45rem;
469
+ }
470
+ .fe-crosshair::before,
471
+ .fe-crosshair::after {
472
+ background: var(--n-accent);
473
+ content: "";
474
+ position: absolute;
475
+ }
476
+ .fe-crosshair::before {
477
+ height: 1.2rem;
478
+ left: 0.18rem;
479
+ top: -0.38rem;
480
+ width: 0.08rem;
481
+ }
482
+ .fe-crosshair::after {
483
+ height: 0.08rem;
484
+ left: -0.38rem;
485
+ top: 0.18rem;
486
+ width: 1.2rem;
487
+ }
488
+ .fe-inspector-actions {
489
+ flex-direction: column;
490
+ }
491
+ .fe-output-bar {
492
+ align-items: center;
493
+ display: grid;
494
+ gap: 1rem;
495
+ grid-template-columns: minmax(9rem, 1fr) minmax(18rem, 1.6fr) minmax(23rem, 2fr);
496
+ padding: 1rem 0 0;
497
+ }
498
+ .fe-output-copy {
499
+ align-items: center;
500
+ display: flex;
501
+ gap: 0.8rem;
502
+ }
503
+ .fe-output-copy strong {
504
+ color: var(--n-ink);
505
+ font-size: 0.8rem;
506
+ max-width: 5rem;
507
+ }
508
+ .fe-output-stat {
509
+ align-items: baseline;
510
+ display: flex;
511
+ gap: 0.35rem;
512
+ }
513
+ .fe-output-stat span:first-child {
514
+ color: var(--n-accent);
515
+ font-size: 1.4rem;
516
+ font-weight: 800;
517
+ }
518
+ .fe-output-stat span:last-child {
519
+ color: var(--n-muted);
520
+ font-size: 0.75rem;
521
+ line-height: 1.1;
522
+ max-width: 4rem;
523
+ }
524
+ .fe-playback {
525
+ align-items: center;
526
+ display: flex;
527
+ flex-wrap: wrap;
528
+ gap: 0.45rem;
529
+ }
530
+ .fe-flipbook-label {
531
+ color: var(--n-muted);
532
+ font-size: 0.75rem;
533
+ margin-right: 0.2rem;
534
+ text-transform: uppercase;
535
+ }
536
+ .fe-output-actions {
537
+ align-items: center;
538
+ display: grid;
539
+ gap: 0.45rem;
540
+ grid-template-columns: repeat(2, minmax(0, 1fr));
541
+ justify-content: flex-end;
542
+ }
543
+
544
+ @media (max-width: 1100px) {
545
+ .fe-workbench {
546
+ grid-template-columns: minmax(14rem, 16rem) minmax(0, 1fr);
547
+ }
548
+ .fe-inspector-panel {
549
+ grid-column: 1 / -1;
550
+ }
551
+ .fe-inspector-actions {
552
+ flex-direction: row;
553
+ }
554
+ }
555
+
556
+ @media (max-width: 720px) {
557
+ .fe-command-rail,
558
+ .fe-output-bar {
559
+ align-items: stretch;
560
+ flex-direction: column;
561
+ }
562
+ .fe-output-bar {
563
+ align-items: stretch;
564
+ display: grid;
565
+ grid-template-columns: 1fr;
566
+ }
567
+ .fe-command-rail {
568
+ grid-template-columns: 1fr;
569
+ }
570
+ .fe-shell.has-image .fe-command-rail {
571
+ grid-template-columns: 1fr;
572
+ }
573
+ .fe-source-meta {
574
+ padding: 0;
575
+ }
576
+ .fe-shell.has-image .fe-source-meta {
577
+ border-top: 1px solid var(--n-line);
578
+ padding: 0.65rem 0 0;
579
+ }
580
+ .fe-status {
581
+ margin-left: 0;
582
+ }
583
+ .fe-sheet-pair,
584
+ .fe-workbench {
585
+ grid-template-columns: 1fr;
586
+ }
587
+ .fe-inspector-panel {
588
+ grid-column: auto;
589
+ }
590
+ .fe-grid-panel,
591
+ .fe-inspector-panel {
592
+ border-right: 0;
593
+ }
594
+ .fe-output-actions {
595
+ justify-content: stretch;
596
+ }
597
+ .fe-output-actions .fe-button {
598
+ flex: 1 1 auto;
599
+ }
600
+ .fe-stage-footer {
601
+ flex-direction: column;
602
+ }
603
+ }
@@ -0,0 +1,82 @@
1
+ import { createLocalizedContent } from "./localized";
2
+
3
+ export const content = createLocalizedContent({
4
+ locale: "de",
5
+ slug: "sprite-sheet-reparatur-editor",
6
+ title: "Sprite Sheet Reparatur Editor",
7
+ description:
8
+ "Korrigiere Zuschnitt und Pixelausrichtung einer Sprite Sheet direkt im Browser und exportiere das Ergebnis.",
9
+ ui: {
10
+ uploadTitle: "Sprite-Sheet öffnen",
11
+ uploadHint:
12
+ "PNG oder WebP hier ablegen, um die Frames auf der Reparaturfläche zu platzieren",
13
+ chooseImage: "Bild auswählen",
14
+ sourceFile: "Quelldatei",
15
+ noImage: "Keine Sprite-Sheet geladen",
16
+ gridSettings: "Rasterregistrierung",
17
+ columns: "Spalten",
18
+ rows: "Zeilen",
19
+ cellWidth: "Zellenbreite",
20
+ cellHeight: "Zellenhöhe",
21
+ marginX: "Linker Rand",
22
+ marginY: "Oberer Rand",
23
+ gapX: "Spaltenabstand",
24
+ gapY: "Zeilenabstand",
25
+ frameTools: "Frame-Anpassung",
26
+ cropX: "Zuschnitt links",
27
+ cropY: "Zuschnitt oben",
28
+ cropWidth: "Zuschnittbreite",
29
+ cropHeight: "Zuschnitthöhe",
30
+ offsetX: "Versatz X",
31
+ offsetY: "Versatz Y",
32
+ trimTransparent: "Transparente Pixel zuschneiden",
33
+ trimAll: "Alle Frames automatisch zuschneiden",
34
+ autoDetectGrid: "Raster automatisch erkennen",
35
+ resetFrame: "Ausgewählten Frame zurücksetzen",
36
+ nudgeStep: "Verschiebeschritt",
37
+ stepOne: "Ein Pixel",
38
+ stepTwo: "Zwei Pixel",
39
+ stepFour: "Vier Pixel",
40
+ history: "Reparaturprotokoll",
41
+ undo: "Rückgängig",
42
+ redo: "Wiederholen",
43
+ resetAll: "Sheet zurücksetzen",
44
+ saveProject: "Projekt speichern",
45
+ loadProject: "Projekt laden",
46
+ exportSheet: "Korrigierte Sheet exportieren",
47
+ exportJson: "Frame-JSON exportieren",
48
+ sheetView: "Registrierungsansicht",
49
+ correctedView: "Korrigierte Sheet",
50
+ activeFrame: "Frame-Inspektor",
51
+ frameStrip: "Frame-Übersicht",
52
+ flipbook: "Flipbook",
53
+ play: "Abspielen",
54
+ pause: "Pausieren",
55
+ fps: "FPS",
56
+ zoom: "Vorschau-Zoom",
57
+ ready: "Anpassungen sind sofort sichtbar",
58
+ loaded: "Sprite-Sheet geladen",
59
+ modified: "Angepasst",
60
+ unchanged: "Originalposition",
61
+ frameCount: "Frames",
62
+ correctionCount: "Angepasste Frames",
63
+ imageSize: "Bildgröße",
64
+ statusEmpty: "Warte auf eine Sprite-Sheet",
65
+ statusSaved: "Projekt lokal gespeichert",
66
+ statusLoaded: "Projekt geladen",
67
+ statusExported: "Export bereit",
68
+ statusInvalidImage: "Dieses Bild konnte nicht geöffnet werden",
69
+ statusInvalidProject: "Diese Projektdatei ist ungültig",
70
+ statusProjectNeedsImage:
71
+ "Projekt gemerkt. Öffne die Quelldatei, um es anzuwenden",
72
+ statusImageMismatch: "Projekt mit anderer Quellgröße geladen",
73
+ metadataNote: "Transparente Pixel bleiben beim Export transparent",
74
+ sourceLabel: "Quell-Sheet",
75
+ resultLabel: "Korrigierte Sheet",
76
+ selectFrame: "Frame auswählen",
77
+ moveUp: "Frame nach oben bewegen",
78
+ moveDown: "Frame nach unten bewegen",
79
+ moveLeft: "Frame nach links bewegen",
80
+ moveRight: "Frame nach rechts bewegen",
81
+ },
82
+ });