@jjlmoya/utils-games-development 1.47.0 → 1.49.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 (57) 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/tests/locale_completeness.test.ts +1 -20
  5. package/src/tests/tool_validation.test.ts +2 -3
  6. package/src/tool/itchioGameTester/client.ts +12 -23
  7. package/src/tool/itchioGameTester/component.astro +0 -7
  8. package/src/tool/itchioGameTester/i18n/de.ts +0 -2
  9. package/src/tool/itchioGameTester/i18n/en.ts +0 -2
  10. package/src/tool/itchioGameTester/i18n/es.ts +0 -2
  11. package/src/tool/itchioGameTester/i18n/fr.ts +0 -2
  12. package/src/tool/itchioGameTester/i18n/id.ts +0 -2
  13. package/src/tool/itchioGameTester/i18n/it.ts +0 -2
  14. package/src/tool/itchioGameTester/i18n/ja.ts +0 -2
  15. package/src/tool/itchioGameTester/i18n/ko.ts +0 -2
  16. package/src/tool/itchioGameTester/i18n/nl.ts +0 -2
  17. package/src/tool/itchioGameTester/i18n/pl.ts +0 -2
  18. package/src/tool/itchioGameTester/i18n/pt.ts +0 -2
  19. package/src/tool/itchioGameTester/i18n/ru.ts +0 -2
  20. package/src/tool/itchioGameTester/i18n/sv.ts +0 -2
  21. package/src/tool/itchioGameTester/i18n/tr.ts +0 -2
  22. package/src/tool/itchioGameTester/i18n/zh.ts +0 -2
  23. package/src/tool/itchioGameTester/ui.ts +0 -2
  24. package/src/tool/spriteSheetPacker/app-client.ts +248 -0
  25. package/src/tool/spriteSheetPacker/bibliography.astro +6 -0
  26. package/src/tool/spriteSheetPacker/bibliography.ts +12 -0
  27. package/src/tool/spriteSheetPacker/component.astro +229 -0
  28. package/src/tool/spriteSheetPacker/dropzone-client.ts +55 -0
  29. package/src/tool/spriteSheetPacker/entry.ts +28 -0
  30. package/src/tool/spriteSheetPacker/exporter.ts +116 -0
  31. package/src/tool/spriteSheetPacker/extractor-client.ts +127 -0
  32. package/src/tool/spriteSheetPacker/flipbook-client.ts +60 -0
  33. package/src/tool/spriteSheetPacker/i18n/de.ts +270 -0
  34. package/src/tool/spriteSheetPacker/i18n/en.ts +275 -0
  35. package/src/tool/spriteSheetPacker/i18n/es.ts +275 -0
  36. package/src/tool/spriteSheetPacker/i18n/fr.ts +270 -0
  37. package/src/tool/spriteSheetPacker/i18n/id.ts +270 -0
  38. package/src/tool/spriteSheetPacker/i18n/it.ts +270 -0
  39. package/src/tool/spriteSheetPacker/i18n/ja.ts +270 -0
  40. package/src/tool/spriteSheetPacker/i18n/ko.ts +270 -0
  41. package/src/tool/spriteSheetPacker/i18n/nl.ts +270 -0
  42. package/src/tool/spriteSheetPacker/i18n/pl.ts +270 -0
  43. package/src/tool/spriteSheetPacker/i18n/pt.ts +270 -0
  44. package/src/tool/spriteSheetPacker/i18n/ru.ts +266 -0
  45. package/src/tool/spriteSheetPacker/i18n/sv.ts +270 -0
  46. package/src/tool/spriteSheetPacker/i18n/tr.ts +270 -0
  47. package/src/tool/spriteSheetPacker/i18n/zh.ts +270 -0
  48. package/src/tool/spriteSheetPacker/index.ts +11 -0
  49. package/src/tool/spriteSheetPacker/logic.test.ts +155 -0
  50. package/src/tool/spriteSheetPacker/logic.ts +32 -0
  51. package/src/tool/spriteSheetPacker/packer-core.ts +121 -0
  52. package/src/tool/spriteSheetPacker/packer-ui.ts +86 -0
  53. package/src/tool/spriteSheetPacker/seo.astro +15 -0
  54. package/src/tool/spriteSheetPacker/sprite-sheet-packer.css +542 -0
  55. package/src/tool/spriteSheetPacker/types.ts +89 -0
  56. package/src/tool/spriteSheetPacker/ui.ts +42 -0
  57. package/src/tools.ts +2 -0
@@ -0,0 +1,542 @@
1
+ .ssp-container {
2
+ width: 100%;
3
+ max-width: 1200px;
4
+ margin: 0 auto;
5
+ color: var(--text-base, #1e293b);
6
+ position: relative;
7
+ }
8
+
9
+ .theme-dark .ssp-container {
10
+ color: var(--text-base, #f8fafc);
11
+ }
12
+
13
+ .ssp-main-card {
14
+ background: var(--bg-surface, #fff);
15
+ border: 1px solid var(--border-base, #cbd5e1);
16
+ border-radius: 16px;
17
+ overflow: hidden;
18
+ box-shadow: 0 10px 35px rgba(0, 0, 0, 0.08);
19
+ display: flex;
20
+ flex-direction: column;
21
+ position: relative;
22
+ }
23
+
24
+ .theme-dark .ssp-main-card {
25
+ background: var(--bg-surface, #090d16);
26
+ border-color: var(--border-base, #1e293b);
27
+ box-shadow: 0 10px 35px rgba(0, 0, 0, 0.4);
28
+ }
29
+
30
+ .ssp-header-tabs {
31
+ display: flex;
32
+ background: rgba(148, 163, 184, 0.08);
33
+ border-bottom: 1px solid var(--border-base, #e2e8f0);
34
+ padding: 0.5rem 0.5rem 0;
35
+ gap: 0.5rem;
36
+ }
37
+
38
+ .theme-dark .ssp-header-tabs {
39
+ background: #0f172a;
40
+ border-color: #1e293b;
41
+ }
42
+
43
+ .ssp-tab-btn {
44
+ flex: 1;
45
+ padding: 0.85rem 1.5rem;
46
+ border: none;
47
+ border-radius: 10px 10px 0 0;
48
+ background: transparent;
49
+ color: inherit;
50
+ font-weight: 600;
51
+ font-size: 0.95rem;
52
+ cursor: pointer;
53
+ transition: all 0.2s ease;
54
+ opacity: 0.65;
55
+ }
56
+
57
+ .ssp-tab-btn.active {
58
+ background: var(--bg-surface, #fff);
59
+ color: var(--color-primary, #6366f1);
60
+ opacity: 1;
61
+ border: 1px solid var(--border-base, #cbd5e1);
62
+ border-bottom: 1px solid var(--bg-surface, #fff);
63
+ margin-bottom: -1px;
64
+ }
65
+
66
+ .theme-dark .ssp-tab-btn.active {
67
+ background: var(--bg-surface, #090d16);
68
+ color: var(--color-primary-light, #818cf8);
69
+ border-color: #1e293b;
70
+ border-bottom-color: var(--bg-surface, #090d16);
71
+ }
72
+
73
+ .ssp-body-grid {
74
+ display: grid;
75
+ grid-template-columns: 1fr;
76
+ padding: 1.5rem;
77
+ gap: 1.5rem;
78
+ }
79
+
80
+ @media (min-width: 900px) {
81
+ .ssp-body-grid {
82
+ grid-template-columns: 340px 1fr;
83
+ }
84
+ }
85
+
86
+ .ssp-sidebar-section {
87
+ display: flex;
88
+ flex-direction: column;
89
+ gap: 1.25rem;
90
+ padding-right: 0;
91
+ }
92
+
93
+ @media (min-width: 900px) {
94
+ .ssp-sidebar-section {
95
+ padding-right: 1.5rem;
96
+ border-right: 1px solid var(--border-base, #e2e8f0);
97
+ }
98
+
99
+ .theme-dark .ssp-sidebar-section {
100
+ border-color: #1e293b;
101
+ }
102
+ }
103
+
104
+ .ssp-main-section {
105
+ display: flex;
106
+ flex-direction: column;
107
+ gap: 1.25rem;
108
+ }
109
+
110
+ .ssp-dropzone {
111
+ border: 2px dashed #818cf8;
112
+ border-radius: 12px;
113
+ padding: 1.5rem 1rem;
114
+ text-align: center;
115
+ background: rgba(129, 140, 248, 0.05);
116
+ cursor: pointer;
117
+ transition: all 0.2s ease;
118
+ }
119
+
120
+ .ssp-dropzone:hover,
121
+ .ssp-dropzone.dragover {
122
+ background: rgba(129, 140, 248, 0.12);
123
+ border-color: #6366f1;
124
+ }
125
+
126
+ .ssp-drop-title {
127
+ font-weight: 700;
128
+ font-size: 1rem;
129
+ margin-bottom: 0.25rem;
130
+ }
131
+
132
+ .ssp-drop-sub {
133
+ font-size: 0.8rem;
134
+ opacity: 0.7;
135
+ }
136
+
137
+ .ssp-file-input {
138
+ display: none;
139
+ }
140
+
141
+ .ssp-presets-row {
142
+ display: flex;
143
+ gap: 0.4rem;
144
+ flex-wrap: wrap;
145
+ }
146
+
147
+ .ssp-chip-btn {
148
+ flex: 1;
149
+ min-width: 85px;
150
+ padding: 0.45rem 0.6rem;
151
+ font-size: 0.75rem;
152
+ font-weight: 600;
153
+ border-radius: 6px;
154
+ border: 1px solid rgba(129, 140, 248, 0.3);
155
+ background: rgba(129, 140, 248, 0.08);
156
+ color: inherit;
157
+ cursor: pointer;
158
+ transition: all 0.15s ease;
159
+ text-align: center;
160
+ }
161
+
162
+ .ssp-chip-btn:hover {
163
+ background: rgba(129, 140, 248, 0.2);
164
+ border-color: #6366f1;
165
+ }
166
+
167
+ .ssp-chip-btn.active {
168
+ background: linear-gradient(135deg, #6366f1, #4f46e5);
169
+ color: var(--text-on-primary, #fff);
170
+ border-color: #6366f1;
171
+ box-shadow: 0 2px 8px rgba(99, 102, 241, 0.3);
172
+ }
173
+
174
+ .ssp-controls-list {
175
+ display: flex;
176
+ flex-direction: column;
177
+ gap: 1rem;
178
+ }
179
+
180
+ .ssp-control-group {
181
+ display: flex;
182
+ flex-direction: column;
183
+ gap: 0.4rem;
184
+ }
185
+
186
+ .ssp-label {
187
+ font-size: 0.85rem;
188
+ font-weight: 600;
189
+ display: flex;
190
+ justify-content: space-between;
191
+ }
192
+
193
+ .ssp-stepper-box {
194
+ display: flex;
195
+ align-items: center;
196
+ gap: 0.4rem;
197
+ width: 100%;
198
+ }
199
+
200
+ .ssp-step-btn {
201
+ width: 32px;
202
+ height: 32px;
203
+ border-radius: 6px;
204
+ border: 1px solid var(--border-base, #cbd5e1);
205
+ background: rgba(148, 163, 184, 0.1);
206
+ color: inherit;
207
+ font-weight: 700;
208
+ font-size: 1rem;
209
+ cursor: pointer;
210
+ display: flex;
211
+ align-items: center;
212
+ justify-content: center;
213
+ transition: background 0.15s ease, transform 0.1s ease;
214
+ flex-shrink: 0;
215
+ }
216
+
217
+ .theme-dark .ssp-step-btn {
218
+ border-color: #334155;
219
+ }
220
+
221
+ .ssp-step-btn:hover {
222
+ background: rgba(99, 102, 241, 0.2);
223
+ border-color: #6366f1;
224
+ }
225
+
226
+ .ssp-step-btn:active {
227
+ transform: scale(0.92);
228
+ }
229
+
230
+ .ssp-slider {
231
+ flex: 1;
232
+ accent-color: #6366f1;
233
+ }
234
+
235
+ .ssp-select,
236
+ .ssp-input {
237
+ width: 100%;
238
+ padding: 0.6rem 0.8rem;
239
+ border-radius: 8px;
240
+ border: 1px solid var(--border-base, #cbd5e1);
241
+ background: var(--bg-surface, #fff);
242
+ color: inherit;
243
+ font-size: 0.9rem;
244
+ }
245
+
246
+ .theme-dark .ssp-select,
247
+ .theme-dark .ssp-input {
248
+ background: #1e293b;
249
+ border-color: #334155;
250
+ }
251
+
252
+ .ssp-toggle-group {
253
+ display: flex;
254
+ align-items: center;
255
+ justify-content: space-between;
256
+ padding: 0.3rem 0;
257
+ }
258
+
259
+ .ssp-toggle-input {
260
+ width: 1.25rem;
261
+ height: 1.25rem;
262
+ accent-color: #6366f1;
263
+ cursor: pointer;
264
+ }
265
+
266
+ .ssp-btn-row {
267
+ display: flex;
268
+ gap: 0.5rem;
269
+ flex-wrap: wrap;
270
+ }
271
+
272
+ .ssp-btn {
273
+ flex: 1;
274
+ min-width: 110px;
275
+ padding: 0.7rem 0.9rem;
276
+ border-radius: 8px;
277
+ border: none;
278
+ font-weight: 600;
279
+ font-size: 0.88rem;
280
+ cursor: pointer;
281
+ transition: transform 0.15s ease, opacity 0.15s ease, background 0.2s ease;
282
+ display: inline-flex;
283
+ align-items: center;
284
+ justify-content: center;
285
+ gap: 0.5rem;
286
+ }
287
+
288
+ .ssp-btn:hover {
289
+ transform: translateY(-1px);
290
+ }
291
+
292
+ .ssp-btn:active {
293
+ transform: scale(0.96);
294
+ }
295
+
296
+ .ssp-btn-primary {
297
+ background: linear-gradient(135deg, #6366f1, #4f46e5);
298
+ color: var(--text-on-primary, #fff);
299
+ }
300
+
301
+ .ssp-btn-secondary {
302
+ background: rgba(148, 163, 184, 0.12);
303
+ color: inherit;
304
+ border: 1px solid var(--border-base, #cbd5e1);
305
+ }
306
+
307
+ .theme-dark .ssp-btn-secondary {
308
+ border-color: #334155;
309
+ }
310
+
311
+ .ssp-btn-danger {
312
+ background: #ef4444;
313
+ color: var(--text-on-primary, #fff);
314
+ }
315
+
316
+ .ssp-btn-success {
317
+ background: #10b981;
318
+ color: var(--text-on-primary, #fff);
319
+ border-color: #10b981;
320
+ }
321
+
322
+ .ssp-stats-grid {
323
+ display: grid;
324
+ grid-template-columns: repeat(auto-fit, minmax(110px, 1fr));
325
+ gap: 0.75rem;
326
+ }
327
+
328
+ .ssp-stat-badge {
329
+ background: rgba(99, 102, 241, 0.08);
330
+ border: 1px solid rgba(99, 102, 241, 0.2);
331
+ border-radius: 10px;
332
+ padding: 0.6rem 0.75rem;
333
+ text-align: center;
334
+ }
335
+
336
+ .ssp-stat-val {
337
+ font-size: 1.1rem;
338
+ font-weight: 700;
339
+ color: var(--color-primary, #6366f1);
340
+ }
341
+
342
+ .theme-dark .ssp-stat-val {
343
+ color: var(--color-primary-light, #818cf8);
344
+ }
345
+
346
+ .ssp-stat-lbl {
347
+ font-size: 0.75rem;
348
+ opacity: 0.8;
349
+ }
350
+
351
+ .ssp-canvas-wrapper {
352
+ width: 100%;
353
+ height: 380px;
354
+ overflow: auto;
355
+ border-radius: 12px;
356
+ background-image: linear-gradient(45deg, #cbd5e1 25%, transparent 25%),
357
+ linear-gradient(-45deg, #cbd5e1 25%, transparent 25%),
358
+ linear-gradient(45deg, transparent 75%, #cbd5e1 75%),
359
+ linear-gradient(-45deg, transparent 75%, #cbd5e1 75%);
360
+ background-size: 16px 16px;
361
+ background-position: 0 0, 0 8px, 8px -8px, -8px 0;
362
+ display: flex;
363
+ align-items: center;
364
+ justify-content: center;
365
+ padding: 1rem;
366
+ border: 1px solid var(--border-base, #e2e8f0);
367
+ box-sizing: border-box;
368
+ }
369
+
370
+ .theme-dark .ssp-canvas-wrapper {
371
+ background-image: linear-gradient(45deg, #1e293b 25%, transparent 25%),
372
+ linear-gradient(-45deg, #1e293b 25%, transparent 25%),
373
+ linear-gradient(45deg, transparent 75%, #1e293b 75%),
374
+ linear-gradient(-45deg, transparent 75%, #1e293b 75%);
375
+ border-color: #1e293b;
376
+ }
377
+
378
+ .ssp-canvas {
379
+ max-width: 100%;
380
+ max-height: 100%;
381
+ object-fit: contain;
382
+ border-radius: 4px;
383
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);
384
+ image-rendering: pixelated;
385
+ }
386
+
387
+ .ssp-flipbook-box {
388
+ display: flex;
389
+ flex-direction: column;
390
+ gap: 0.75rem;
391
+ padding: 1rem;
392
+ background: rgba(99, 102, 241, 0.04);
393
+ border-radius: 12px;
394
+ border: 1px solid rgba(99, 102, 241, 0.18);
395
+ }
396
+
397
+ .ssp-flipbook-header {
398
+ font-weight: 700;
399
+ font-size: 0.9rem;
400
+ }
401
+
402
+ .ssp-flipbook-body {
403
+ display: flex;
404
+ align-items: center;
405
+ gap: 1.25rem;
406
+ flex-wrap: wrap;
407
+ }
408
+
409
+ .ssp-flipbook-canvas {
410
+ width: 100px;
411
+ height: 100px;
412
+ image-rendering: pixelated;
413
+ background: rgba(0, 0, 0, 0.2);
414
+ border-radius: 8px;
415
+ border: 1px solid rgba(255, 255, 255, 0.1);
416
+ }
417
+
418
+ .ssp-flipbook-controls {
419
+ flex: 1;
420
+ min-width: 200px;
421
+ display: flex;
422
+ flex-direction: column;
423
+ gap: 0.75rem;
424
+ }
425
+
426
+ .ssp-code-container {
427
+ display: flex;
428
+ flex-direction: column;
429
+ border-radius: 10px;
430
+ overflow: hidden;
431
+ border: 1px solid #1e293b;
432
+ background: #090d16;
433
+ }
434
+
435
+ .ssp-code-header {
436
+ display: flex;
437
+ align-items: center;
438
+ justify-content: space-between;
439
+ background: #0f172a;
440
+ padding: 0.6rem 0.85rem;
441
+ border-bottom: 1px solid #1e293b;
442
+ }
443
+
444
+ .ssp-code-title {
445
+ font-size: 0.82rem;
446
+ font-weight: 600;
447
+ color: var(--text-muted, #94a3b8);
448
+ }
449
+
450
+ .ssp-copy-btn {
451
+ background: rgba(56, 189, 248, 0.12);
452
+ border: 1px solid rgba(56, 189, 248, 0.3);
453
+ color: var(--color-cyan, #38bdf8);
454
+ padding: 0.35rem 0.75rem;
455
+ border-radius: 6px;
456
+ font-size: 0.78rem;
457
+ font-weight: 600;
458
+ cursor: pointer;
459
+ transition: all 0.15s ease;
460
+ }
461
+
462
+ .ssp-copy-btn:hover {
463
+ background: rgba(56, 189, 248, 0.25);
464
+ }
465
+
466
+ .ssp-copy-btn:active {
467
+ transform: scale(0.95);
468
+ }
469
+
470
+ .ssp-code-block {
471
+ width: 100%;
472
+ margin: 0;
473
+ background: #070a12;
474
+ color: var(--color-cyan, #38bdf8);
475
+ font-size: 0.82rem;
476
+ padding: 0.85rem 1rem;
477
+ overflow-x: auto;
478
+ white-space: pre-wrap;
479
+ word-break: break-all;
480
+ }
481
+
482
+ .ssp-toast {
483
+ position: fixed;
484
+ bottom: 2rem;
485
+ right: 2rem;
486
+ background: #10b981;
487
+ color: var(--text-on-primary, #fff);
488
+ padding: 0.75rem 1.25rem;
489
+ border-radius: 8px;
490
+ font-weight: 600;
491
+ box-shadow: 0 4px 14px rgba(16, 185, 129, 0.4);
492
+ opacity: 0;
493
+ transform: translateY(10px);
494
+ pointer-events: none;
495
+ transition: opacity 0.3s ease, transform 0.3s ease;
496
+ z-index: 1000;
497
+ }
498
+
499
+ .ssp-toast.show {
500
+ opacity: 1;
501
+ transform: translateY(0);
502
+ }
503
+
504
+ .ssp-particle-container {
505
+ position: fixed;
506
+ top: 0;
507
+ left: 0;
508
+ width: 100vw;
509
+ height: 100vh;
510
+ pointer-events: none;
511
+ z-index: 2000;
512
+ }
513
+
514
+ .ssp-particle {
515
+ position: absolute;
516
+ font-size: 0.75rem;
517
+ font-weight: 800;
518
+ color: var(--color-cyan, #38bdf8);
519
+ background: rgba(15, 23, 42, 0.9);
520
+ border: 1px solid #38bdf8;
521
+ border-radius: 4px;
522
+ padding: 0.2rem 0.5rem;
523
+ box-shadow: 0 0 10px rgba(56, 189, 248, 0.5);
524
+ animation: ssp-particle-float 1s forwards ease-out;
525
+ }
526
+
527
+ @keyframes ssp-particle-float {
528
+ 0% {
529
+ opacity: 1;
530
+ transform: translate(-50%, -50%) scale(0.8);
531
+ }
532
+
533
+ 50% {
534
+ opacity: 1;
535
+ transform: translate(-50%, -120%) scale(1.1);
536
+ }
537
+
538
+ 100% {
539
+ opacity: 0;
540
+ transform: translate(-50%, -180%) scale(0.9);
541
+ }
542
+ }
@@ -0,0 +1,89 @@
1
+ export interface SpriteFrameInput {
2
+ id: string;
3
+ name: string;
4
+ width: number;
5
+ height: number;
6
+ x?: number;
7
+ y?: number;
8
+ trimmedX?: number;
9
+ trimmedY?: number;
10
+ originalWidth?: number;
11
+ originalHeight?: number;
12
+ pivotX?: number;
13
+ pivotY?: number;
14
+ }
15
+
16
+ export type ExportFormat =
17
+ | 'generic-json-hash'
18
+ | 'generic-json-array'
19
+ | 'unity'
20
+ | 'godot'
21
+ | 'phaser'
22
+ | 'css';
23
+
24
+ export interface PackerOptions {
25
+ padding: number;
26
+ borderExtrusion: number;
27
+ forcePowerOfTwo: boolean;
28
+ maxTextureWidth: number;
29
+ maxTextureHeight: number;
30
+ allowRotation: boolean;
31
+ trimTransparency: boolean;
32
+ format: ExportFormat;
33
+ }
34
+
35
+ export interface PackedFrame {
36
+ id: string;
37
+ name: string;
38
+ x: number;
39
+ y: number;
40
+ width: number;
41
+ height: number;
42
+ rotated: boolean;
43
+ trimmed: boolean;
44
+ spriteSourceSize: {
45
+ x: number;
46
+ y: number;
47
+ w: number;
48
+ h: number;
49
+ };
50
+ sourceSize: {
51
+ w: number;
52
+ h: number;
53
+ };
54
+ pivot: {
55
+ x: number;
56
+ y: number;
57
+ };
58
+ }
59
+
60
+ export interface PackedResult {
61
+ textureWidth: number;
62
+ textureHeight: number;
63
+ efficiency: number;
64
+ totalFrames: number;
65
+ frames: PackedFrame[];
66
+ atlasJson: string;
67
+ cssSnippet: string;
68
+ codeSnippet: string;
69
+ drawCallsBefore: number;
70
+ drawCallsAfter: number;
71
+ }
72
+
73
+ export interface ExtractionGridConfig {
74
+ imageWidth: number;
75
+ imageHeight: number;
76
+ frameWidth: number;
77
+ frameHeight: number;
78
+ margin: number;
79
+ spacing: number;
80
+ }
81
+
82
+ export interface ExtractedFrameSlice {
83
+ id: string;
84
+ index: number;
85
+ x: number;
86
+ y: number;
87
+ width: number;
88
+ height: number;
89
+ }
@@ -0,0 +1,42 @@
1
+ export interface SpriteSheetPackerUI extends Record<string, string> {
2
+ packerTab: string;
3
+ extractorTab: string;
4
+ dropZoneTitle: string;
5
+ dropZoneSubtitle: string;
6
+ selectFilesButton: string;
7
+ clearAllButton: string;
8
+ downloadZipButton: string;
9
+ copyJsonButton: string;
10
+ downloadSheetPngButton: string;
11
+ paddingLabel: string;
12
+ borderExtrusionLabel: string;
13
+ maxTextureSizeLabel: string;
14
+ powerOfTwoLabel: string;
15
+ exportFormatLabel: string;
16
+ presetPixelArt: string;
17
+ presetHdUi: string;
18
+ presetMobile: string;
19
+ formatGenericHash: string;
20
+ formatGenericArray: string;
21
+ formatUnity: string;
22
+ formatGodot: string;
23
+ formatPhaser: string;
24
+ formatCss: string;
25
+ previewTitle: string;
26
+ efficiencyBadge: string;
27
+ drawCallsBadge: string;
28
+ totalFramesBadge: string;
29
+ textureSizeBadge: string;
30
+ flipbookTitle: string;
31
+ flipbookFpsLabel: string;
32
+ playAnimation: string;
33
+ pauseAnimation: string;
34
+ frameWidthLabel: string;
35
+ frameHeightLabel: string;
36
+ marginLabel: string;
37
+ spacingLabel: string;
38
+ extractedCountLabel: string;
39
+ codeSnippetTitle: string;
40
+ copySnippetButton: string;
41
+ copiedToast: string;
42
+ }
package/src/tools.ts CHANGED
@@ -2,8 +2,10 @@ export { ALL_ENTRIES } from './entries';
2
2
  import type { ToolDefinition } from './types';
3
3
  import { STEAM_CAPSULE_GENERATOR_TOOL } from './tool/steamCapsuleGenerator';
4
4
  import { ITCHIO_GAME_TESTER_TOOL } from './tool/itchioGameTester';
5
+ import { SPRITE_SHEET_PACKER_TOOL } from './tool/spriteSheetPacker';
5
6
 
6
7
  export const ALL_TOOLS: ToolDefinition[] = [
7
8
  STEAM_CAPSULE_GENERATOR_TOOL,
8
9
  ITCHIO_GAME_TESTER_TOOL,
10
+ SPRITE_SHEET_PACKER_TOOL,
9
11
  ];