@jjlmoya/utils-games-development 1.65.0 → 1.67.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 (77) hide show
  1. package/package.json +67 -67
  2. package/scripts/postinstall.mjs +27 -27
  3. package/src/category/GamesCategorySEO.astro +19 -19
  4. package/src/category/i18n/de.ts +15 -15
  5. package/src/category/i18n/en.ts +15 -15
  6. package/src/category/i18n/es.ts +15 -15
  7. package/src/category/i18n/fr.ts +15 -15
  8. package/src/category/i18n/id.ts +10 -10
  9. package/src/category/i18n/it.ts +10 -10
  10. package/src/category/i18n/ja.ts +10 -10
  11. package/src/category/i18n/ko.ts +10 -10
  12. package/src/category/i18n/nl.ts +10 -10
  13. package/src/category/i18n/pl.ts +10 -10
  14. package/src/category/i18n/pt.ts +10 -10
  15. package/src/category/i18n/ru.ts +10 -10
  16. package/src/category/i18n/sv.ts +10 -10
  17. package/src/category/i18n/tr.ts +10 -10
  18. package/src/category/i18n/zh.ts +10 -10
  19. package/src/category/seo.astro +15 -15
  20. package/src/components/PreviewNavSidebar.astro +116 -116
  21. package/src/components/PreviewToolbar.astro +143 -143
  22. package/src/data.ts +11 -11
  23. package/src/env.d.ts +5 -5
  24. package/src/index.ts +20 -20
  25. package/src/layouts/PreviewLayout.astro +122 -122
  26. package/src/pages/[locale]/[slug].astro +165 -165
  27. package/src/pages/[locale].astro +250 -250
  28. package/src/pages/index.astro +4 -4
  29. package/src/tests/bibliography_wellformed_export.test.ts +46 -0
  30. package/src/tests/category_seo_quality.test.ts +74 -0
  31. package/src/tests/diacritics_density.test.ts +118 -118
  32. package/src/tests/faq_count.test.ts +19 -19
  33. package/src/tests/i18n_coverage.test.ts +36 -36
  34. package/src/tests/inverted_punctuation.test.ts +84 -84
  35. package/src/tests/mocks/astro_mock.js +2 -2
  36. package/src/tests/no_en_dash.test.ts +70 -70
  37. package/src/tests/no_h1_in_components.test.ts +48 -48
  38. package/src/tests/pagespeed_best_practices.test.ts +198 -198
  39. package/src/tests/qa-test-helpers.ts +32 -32
  40. package/src/tests/qa_bibliography_links.test.ts +41 -41
  41. package/src/tests/qa_claim_evidence.test.ts +69 -69
  42. package/src/tests/qa_logic_reference_coverage.test.ts +46 -46
  43. package/src/tests/qa_runtime_i18n.test.ts +100 -100
  44. package/src/tests/schemas_fulfillment.test.ts +23 -23
  45. package/src/tests/script_density.test.ts +94 -94
  46. package/src/tests/seo_length.test.ts +23 -23
  47. package/src/tests/seo_wellformed_export.test.ts +65 -0
  48. package/src/tests/slug_language_code_format.test.ts +23 -23
  49. package/src/tests/slug_uniqueness.test.ts +80 -80
  50. package/src/tests/title_quality.test.ts +56 -56
  51. package/src/tool/audioLoopPointFinder/audio-loop-point-finder.css +322 -322
  52. package/src/tool/audioLoopPointFinder/client.ts +262 -262
  53. package/src/tool/damageFormulaLab/bibliography.astro +3 -21
  54. package/src/tool/damageFormulaLab/seo.astro +7 -5
  55. package/src/tool/gameDeltaTimeFixedTimestepLab/bibliography.astro +3 -19
  56. package/src/tool/hitboxHurtboxAnimator/hitbox-hurtbox-animator.css +614 -614
  57. package/src/tool/hitboxHurtboxAnimator/seo.astro +7 -5
  58. package/src/tool/saveFileEditor/component.astro +351 -351
  59. package/src/tool/saveFileEditor/game-save-file-editor.css +250 -250
  60. package/src/tool/spriteSheetPacker/app-client.ts +248 -248
  61. package/src/tool/spriteSheetPacker/bibliography.ts +12 -12
  62. package/src/tool/spriteSheetPacker/component.astro +229 -229
  63. package/src/tool/spriteSheetPacker/dropzone-client.ts +55 -55
  64. package/src/tool/spriteSheetPacker/entry.ts +28 -28
  65. package/src/tool/spriteSheetPacker/exporter.ts +116 -116
  66. package/src/tool/spriteSheetPacker/extractor-client.ts +127 -127
  67. package/src/tool/spriteSheetPacker/flipbook-client.ts +60 -60
  68. package/src/tool/spriteSheetPacker/logic.test.ts +155 -155
  69. package/src/tool/spriteSheetPacker/logic.ts +32 -32
  70. package/src/tool/spriteSheetPacker/packer-core.ts +121 -121
  71. package/src/tool/spriteSheetPacker/packer-ui.ts +86 -86
  72. package/src/tool/spriteSheetPacker/sprite-sheet-packer.css +578 -578
  73. package/src/tool/spriteSheetPacker/types.ts +89 -89
  74. package/src/tool/spriteSheetPacker/ui.ts +42 -42
  75. package/src/tool/steamCapsuleGenerator/index.ts +9 -9
  76. package/src/tool/steamCapsuleGenerator/validation.ts +14 -14
  77. package/src/types.ts +72 -72
@@ -1,250 +1,250 @@
1
- .save-editor-main-card {
2
- display: flex;
3
- flex-direction: column;
4
- gap: 1.5rem;
5
- padding: 1.5rem;
6
- border-radius: 1rem;
7
- background: var(--bg-surface, #fff);
8
- border: 1px solid var(--border-base, #e2e8f0);
9
- box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.05);
10
- color: var(--text-base, #0f172a);
11
- transition: background-color 0.2s, border-color 0.2s;
12
- }
13
-
14
- .theme-dark .save-editor-main-card,
15
- :global(.theme-dark) .save-editor-main-card {
16
- background: var(--bg-surface, #0f172a);
17
- border-color: var(--border-base, #1e293b);
18
- color: var(--text-base, #f8fafc);
19
- }
20
-
21
- .editor-unified-layout {
22
- display: grid;
23
- grid-template-columns: 1fr;
24
- gap: 1.5rem;
25
- }
26
-
27
- @media (min-width: 900px) {
28
- .editor-unified-layout {
29
- grid-template-columns: 1fr 1fr;
30
- }
31
- }
32
-
33
- .control-panel {
34
- display: flex;
35
- flex-direction: column;
36
- gap: 1rem;
37
- }
38
-
39
- .dropzone {
40
- border: 2px dashed var(--border-base, #cbd5e1);
41
- border-radius: 0.75rem;
42
- padding: 2rem 1rem;
43
- text-align: center;
44
- background: rgba(59, 130, 246, 0.03);
45
- cursor: pointer;
46
- transition: background-color 0.2s;
47
- }
48
-
49
- .theme-dark .dropzone,
50
- :global(.theme-dark) .dropzone {
51
- border-color: var(--border-base, #334155);
52
- background: rgba(30, 41, 59, 0.3);
53
- }
54
-
55
- .dropzone:hover {
56
- background: rgba(59, 130, 246, 0.08);
57
- }
58
-
59
- .panel-section-title {
60
- font-size: 1rem;
61
- font-weight: 700;
62
- margin: 0 0 0.25rem;
63
- color: var(--text-base, #0f172a);
64
- opacity: 0.9;
65
- }
66
-
67
- .theme-dark .panel-section-title,
68
- :global(.theme-dark) .panel-section-title {
69
- color: var(--text-base, #f8fafc);
70
- }
71
-
72
- .options-row {
73
- display: grid;
74
- grid-template-columns: 1fr;
75
- gap: 0.75rem;
76
- }
77
-
78
- @media (min-width: 500px) {
79
- .options-row {
80
- grid-template-columns: 1fr 1fr;
81
- }
82
- }
83
-
84
- .form-group {
85
- display: flex;
86
- flex-direction: column;
87
- gap: 0.35rem;
88
- }
89
-
90
- .form-label {
91
- font-size: 0.8125rem;
92
- font-weight: 600;
93
- }
94
-
95
- .input-select, .input-text, .textarea-code {
96
- width: 100%;
97
- padding: 0.6rem 0.8rem;
98
- border-radius: 0.5rem;
99
- border: 1px solid var(--border-base, #cbd5e1);
100
- background: var(--bg-surface, #fff);
101
- color: var(--text-base, #0f172a);
102
- font-size: 0.875rem;
103
- }
104
-
105
- .method-chip-group {
106
- display: flex;
107
- gap: 0.35rem;
108
- background: var(--bg-surface, #fff);
109
- padding: 0.25rem;
110
- border-radius: 0.5rem;
111
- border: 1px solid var(--border-base, #cbd5e1);
112
- }
113
-
114
- .theme-dark .method-chip-group,
115
- :global(.theme-dark) .method-chip-group {
116
- background: var(--bg-surface, #0f172a);
117
- border-color: var(--border-base, #334155);
118
- }
119
-
120
- .chip-btn {
121
- flex: 1;
122
- padding: 0.45rem 0.5rem;
123
- border-radius: 0.375rem;
124
- border: none;
125
- background: transparent;
126
- color: var(--text-base, #64748b);
127
- font-size: 0.75rem;
128
- font-weight: 600;
129
- cursor: pointer;
130
- transition: all 0.15s ease;
131
- text-align: center;
132
- white-space: nowrap;
133
- }
134
-
135
- .theme-dark .chip-btn,
136
- :global(.theme-dark) .chip-btn {
137
- color: var(--text-base, #94a3b8);
138
- }
139
-
140
- .chip-btn.active {
141
- background: var(--accent-base, #2563eb);
142
- color: var(--text-inverse, #fff);
143
- box-shadow: 0 2px 6px rgba(37, 99, 235, 0.3);
144
- }
145
-
146
- .chip-btn:hover:not(.active) {
147
- background: rgba(37, 99, 235, 0.08);
148
- color: var(--accent-base, #2563eb);
149
- }
150
-
151
- .textarea-code {
152
- min-height: 250px;
153
- resize: vertical;
154
- }
155
-
156
- .btn-primary {
157
- padding: 0.75rem 1.25rem;
158
- border-radius: 0.5rem;
159
- border: none;
160
- background: var(--accent-base, #2563eb);
161
- color: var(--text-inverse, #fff);
162
- font-weight: 700;
163
- cursor: pointer;
164
- transition: all 0.2s;
165
- }
166
-
167
- .btn-primary:hover {
168
- background: var(--accent-base, #2563eb);
169
- }
170
-
171
- .btn-secondary {
172
- padding: 0.5rem 1rem;
173
- border-radius: 0.5rem;
174
- border: 1px solid var(--border-base, #cbd5e1);
175
- background: transparent;
176
- color: inherit;
177
- font-weight: 600;
178
- font-size: 0.875rem;
179
- cursor: pointer;
180
- }
181
-
182
- .theme-dark .btn-secondary,
183
- :global(.theme-dark) .btn-secondary {
184
- border-color: var(--border-base, #334155);
185
- color: var(--text-base, #e2e8f0);
186
- }
187
-
188
- .error-banner {
189
- padding: 0.75rem 1rem;
190
- border-radius: 0.5rem;
191
- background: rgba(239, 68, 68, 0.1);
192
- border: 1px solid rgba(239, 68, 68, 0.3);
193
- color: var(--text-danger, #ef4444);
194
- font-size: 0.875rem;
195
- }
196
-
197
- .stats-grid {
198
- display: grid;
199
- grid-template-columns: repeat(3, 1fr);
200
- gap: 0.75rem;
201
- padding: 1rem;
202
- border-radius: 0.75rem;
203
- background: rgba(0, 0, 0, 0.02);
204
- }
205
-
206
- .theme-dark .stats-grid,
207
- :global(.theme-dark) .stats-grid {
208
- background: rgba(255, 255, 255, 0.02);
209
- }
210
-
211
- .stat-item {
212
- display: flex;
213
- flex-direction: column;
214
- align-items: center;
215
- text-align: center;
216
- }
217
-
218
- .stat-val {
219
- font-size: 1.125rem;
220
- font-weight: 800;
221
- color: var(--accent-base, #3b82f6);
222
- }
223
-
224
- .stat-lbl {
225
- font-size: 0.75rem;
226
- opacity: 0.7;
227
- }
228
-
229
- .copied-notice {
230
- color: var(--accent-base, #10b981);
231
- font-size: 0.875rem;
232
- }
233
-
234
- .tree-view-container {
235
- display: flex;
236
- flex-direction: column;
237
- gap: 1rem;
238
- }
239
-
240
- .tree-toolbar {
241
- display: flex;
242
- gap: 0.5rem;
243
- flex-wrap: wrap;
244
- }
245
-
246
- .tree-node {
247
- margin-left: 1rem;
248
- padding-left: 0.5rem;
249
- border-left: 1px dashed var(--border-subtle, #cbd5e1);
250
- }
1
+ .save-editor-main-card {
2
+ display: flex;
3
+ flex-direction: column;
4
+ gap: 1.5rem;
5
+ padding: 1.5rem;
6
+ border-radius: 1rem;
7
+ background: var(--bg-surface, #fff);
8
+ border: 1px solid var(--border-base, #e2e8f0);
9
+ box-shadow: 0 10px 25px -5px rgba(0, 0, 0, 0.05);
10
+ color: var(--text-base, #0f172a);
11
+ transition: background-color 0.2s, border-color 0.2s;
12
+ }
13
+
14
+ .theme-dark .save-editor-main-card,
15
+ :global(.theme-dark) .save-editor-main-card {
16
+ background: var(--bg-surface, #0f172a);
17
+ border-color: var(--border-base, #1e293b);
18
+ color: var(--text-base, #f8fafc);
19
+ }
20
+
21
+ .editor-unified-layout {
22
+ display: grid;
23
+ grid-template-columns: 1fr;
24
+ gap: 1.5rem;
25
+ }
26
+
27
+ @media (min-width: 900px) {
28
+ .editor-unified-layout {
29
+ grid-template-columns: 1fr 1fr;
30
+ }
31
+ }
32
+
33
+ .control-panel {
34
+ display: flex;
35
+ flex-direction: column;
36
+ gap: 1rem;
37
+ }
38
+
39
+ .dropzone {
40
+ border: 2px dashed var(--border-base, #cbd5e1);
41
+ border-radius: 0.75rem;
42
+ padding: 2rem 1rem;
43
+ text-align: center;
44
+ background: rgba(59, 130, 246, 0.03);
45
+ cursor: pointer;
46
+ transition: background-color 0.2s;
47
+ }
48
+
49
+ .theme-dark .dropzone,
50
+ :global(.theme-dark) .dropzone {
51
+ border-color: var(--border-base, #334155);
52
+ background: rgba(30, 41, 59, 0.3);
53
+ }
54
+
55
+ .dropzone:hover {
56
+ background: rgba(59, 130, 246, 0.08);
57
+ }
58
+
59
+ .panel-section-title {
60
+ font-size: 1rem;
61
+ font-weight: 700;
62
+ margin: 0 0 0.25rem;
63
+ color: var(--text-base, #0f172a);
64
+ opacity: 0.9;
65
+ }
66
+
67
+ .theme-dark .panel-section-title,
68
+ :global(.theme-dark) .panel-section-title {
69
+ color: var(--text-base, #f8fafc);
70
+ }
71
+
72
+ .options-row {
73
+ display: grid;
74
+ grid-template-columns: 1fr;
75
+ gap: 0.75rem;
76
+ }
77
+
78
+ @media (min-width: 500px) {
79
+ .options-row {
80
+ grid-template-columns: 1fr 1fr;
81
+ }
82
+ }
83
+
84
+ .form-group {
85
+ display: flex;
86
+ flex-direction: column;
87
+ gap: 0.35rem;
88
+ }
89
+
90
+ .form-label {
91
+ font-size: 0.8125rem;
92
+ font-weight: 600;
93
+ }
94
+
95
+ .input-select, .input-text, .textarea-code {
96
+ width: 100%;
97
+ padding: 0.6rem 0.8rem;
98
+ border-radius: 0.5rem;
99
+ border: 1px solid var(--border-base, #cbd5e1);
100
+ background: var(--bg-surface, #fff);
101
+ color: var(--text-base, #0f172a);
102
+ font-size: 0.875rem;
103
+ }
104
+
105
+ .method-chip-group {
106
+ display: flex;
107
+ gap: 0.35rem;
108
+ background: var(--bg-surface, #fff);
109
+ padding: 0.25rem;
110
+ border-radius: 0.5rem;
111
+ border: 1px solid var(--border-base, #cbd5e1);
112
+ }
113
+
114
+ .theme-dark .method-chip-group,
115
+ :global(.theme-dark) .method-chip-group {
116
+ background: var(--bg-surface, #0f172a);
117
+ border-color: var(--border-base, #334155);
118
+ }
119
+
120
+ .chip-btn {
121
+ flex: 1;
122
+ padding: 0.45rem 0.5rem;
123
+ border-radius: 0.375rem;
124
+ border: none;
125
+ background: transparent;
126
+ color: var(--text-base, #64748b);
127
+ font-size: 0.75rem;
128
+ font-weight: 600;
129
+ cursor: pointer;
130
+ transition: all 0.15s ease;
131
+ text-align: center;
132
+ white-space: nowrap;
133
+ }
134
+
135
+ .theme-dark .chip-btn,
136
+ :global(.theme-dark) .chip-btn {
137
+ color: var(--text-base, #94a3b8);
138
+ }
139
+
140
+ .chip-btn.active {
141
+ background: var(--accent-base, #2563eb);
142
+ color: var(--text-inverse, #fff);
143
+ box-shadow: 0 2px 6px rgba(37, 99, 235, 0.3);
144
+ }
145
+
146
+ .chip-btn:hover:not(.active) {
147
+ background: rgba(37, 99, 235, 0.08);
148
+ color: var(--accent-base, #2563eb);
149
+ }
150
+
151
+ .textarea-code {
152
+ min-height: 250px;
153
+ resize: vertical;
154
+ }
155
+
156
+ .btn-primary {
157
+ padding: 0.75rem 1.25rem;
158
+ border-radius: 0.5rem;
159
+ border: none;
160
+ background: var(--accent-base, #2563eb);
161
+ color: var(--text-inverse, #fff);
162
+ font-weight: 700;
163
+ cursor: pointer;
164
+ transition: all 0.2s;
165
+ }
166
+
167
+ .btn-primary:hover {
168
+ background: var(--accent-base, #2563eb);
169
+ }
170
+
171
+ .btn-secondary {
172
+ padding: 0.5rem 1rem;
173
+ border-radius: 0.5rem;
174
+ border: 1px solid var(--border-base, #cbd5e1);
175
+ background: transparent;
176
+ color: inherit;
177
+ font-weight: 600;
178
+ font-size: 0.875rem;
179
+ cursor: pointer;
180
+ }
181
+
182
+ .theme-dark .btn-secondary,
183
+ :global(.theme-dark) .btn-secondary {
184
+ border-color: var(--border-base, #334155);
185
+ color: var(--text-base, #e2e8f0);
186
+ }
187
+
188
+ .error-banner {
189
+ padding: 0.75rem 1rem;
190
+ border-radius: 0.5rem;
191
+ background: rgba(239, 68, 68, 0.1);
192
+ border: 1px solid rgba(239, 68, 68, 0.3);
193
+ color: var(--text-danger, #ef4444);
194
+ font-size: 0.875rem;
195
+ }
196
+
197
+ .stats-grid {
198
+ display: grid;
199
+ grid-template-columns: repeat(3, 1fr);
200
+ gap: 0.75rem;
201
+ padding: 1rem;
202
+ border-radius: 0.75rem;
203
+ background: rgba(0, 0, 0, 0.02);
204
+ }
205
+
206
+ .theme-dark .stats-grid,
207
+ :global(.theme-dark) .stats-grid {
208
+ background: rgba(255, 255, 255, 0.02);
209
+ }
210
+
211
+ .stat-item {
212
+ display: flex;
213
+ flex-direction: column;
214
+ align-items: center;
215
+ text-align: center;
216
+ }
217
+
218
+ .stat-val {
219
+ font-size: 1.125rem;
220
+ font-weight: 800;
221
+ color: var(--accent-base, #3b82f6);
222
+ }
223
+
224
+ .stat-lbl {
225
+ font-size: 0.75rem;
226
+ opacity: 0.7;
227
+ }
228
+
229
+ .copied-notice {
230
+ color: var(--accent-base, #10b981);
231
+ font-size: 0.875rem;
232
+ }
233
+
234
+ .tree-view-container {
235
+ display: flex;
236
+ flex-direction: column;
237
+ gap: 1rem;
238
+ }
239
+
240
+ .tree-toolbar {
241
+ display: flex;
242
+ gap: 0.5rem;
243
+ flex-wrap: wrap;
244
+ }
245
+
246
+ .tree-node {
247
+ margin-left: 1rem;
248
+ padding-left: 0.5rem;
249
+ border-left: 1px dashed var(--border-subtle, #cbd5e1);
250
+ }