@jjlmoya/utils-creative 1.15.0 → 1.18.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 (29) hide show
  1. package/package.json +6 -3
  2. package/scripts/postinstall.mjs +27 -0
  3. package/src/category/index.ts +1 -16
  4. package/src/entries.ts +14 -0
  5. package/src/index.ts +17 -1
  6. package/src/tool/bead-pattern-generator/bead-pattern-generator.css +507 -0
  7. package/src/tool/bead-pattern-generator/component.astro +0 -509
  8. package/src/tool/bead-pattern-generator/entry.ts +49 -0
  9. package/src/tool/bead-pattern-generator/index.ts +3 -51
  10. package/src/tool/dice-roller/component.astro +0 -477
  11. package/src/tool/dice-roller/dice-roller.css +475 -0
  12. package/src/tool/dice-roller/entry.ts +46 -0
  13. package/src/tool/dice-roller/index.ts +3 -48
  14. package/src/tool/excuse-generator/component.astro +0 -318
  15. package/src/tool/excuse-generator/entry.ts +42 -0
  16. package/src/tool/excuse-generator/excuse-generator.css +316 -0
  17. package/src/tool/excuse-generator/index.ts +3 -44
  18. package/src/tool/fortune-cookie/component.astro +0 -345
  19. package/src/tool/fortune-cookie/entry.ts +40 -0
  20. package/src/tool/fortune-cookie/fortune-cookie.css +343 -0
  21. package/src/tool/fortune-cookie/index.ts +3 -42
  22. package/src/tool/synesthesia-painter/component.astro +0 -229
  23. package/src/tool/synesthesia-painter/entry.ts +39 -0
  24. package/src/tool/synesthesia-painter/index.ts +3 -41
  25. package/src/tool/synesthesia-painter/synesthesia-painter.css +227 -0
  26. package/src/tool/zalgo-generator/component.astro +0 -552
  27. package/src/tool/zalgo-generator/entry.ts +49 -0
  28. package/src/tool/zalgo-generator/index.ts +3 -51
  29. package/src/tool/zalgo-generator/zalgo-generator.css +550 -0
@@ -0,0 +1,343 @@
1
+ .fortune-cookie {
2
+ --fortune-cookie-bg: #fff;
3
+ --fortune-cookie-bg-muted: #fffbeb;
4
+ --fortune-cookie-text: #0f172a;
5
+ --fortune-cookie-text-muted: #475569;
6
+ --fortune-cookie-text-dim: #64748b;
7
+ --fortune-cookie-border: #fef3c7;
8
+ --fortune-cookie-shadow: rgba(0, 0, 0, 0.05);
9
+ --fortune-cookie-primary: #f59e0b;
10
+ --fortune-cookie-primary-on: #fff;
11
+ --fortune-cookie-accent: #fcd34d;
12
+ --fortune-cookie-success: #10b981;
13
+ --fortune-cookie-warning: #f59e0b;
14
+ --fortune-cookie-error: #f43f5e;
15
+ }
16
+
17
+ :global(.theme-dark) .fortune-cookie {
18
+ --fortune-cookie-bg: #0f172a;
19
+ --fortune-cookie-bg-muted: #1e293b;
20
+ --fortune-cookie-text: #f8fafc;
21
+ --fortune-cookie-text-muted: #94a3b8;
22
+ --fortune-cookie-text-dim: #64748b;
23
+ --fortune-cookie-border: #334155;
24
+ --fortune-cookie-shadow: rgba(0, 0, 0, 0.3);
25
+ --fortune-cookie-primary: #fbbf24;
26
+ --fortune-cookie-primary-on: #fff;
27
+ --fortune-cookie-accent: #fcd34d;
28
+ --fortune-cookie-success: #34d399;
29
+ --fortune-cookie-warning: #fbbf24;
30
+ --fortune-cookie-error: #fb7185;
31
+ }
32
+
33
+ .fortune-cookie-root {
34
+ width: 100%;
35
+ max-width: 64rem;
36
+ margin-left: auto;
37
+ margin-right: auto;
38
+ }
39
+
40
+ .fortune-cookie-card {
41
+ position: relative;
42
+ background-color: var(--fortune-cookie-bg);
43
+ border-radius: 1.5rem;
44
+ box-shadow: 0 25px 50px -12px var(--fortune-cookie-shadow);
45
+ overflow: hidden;
46
+ border: 1px solid var(--fortune-cookie-border);
47
+ min-height: 600px;
48
+ display: flex;
49
+ flex-direction: column;
50
+ align-items: center;
51
+ justify-content: center;
52
+ padding: 2rem;
53
+ }
54
+
55
+ .fortune-cookie-glow {
56
+ position: absolute;
57
+ inset: 0;
58
+ opacity: 0.1;
59
+ pointer-events: none;
60
+ background-image: radial-gradient(circle at center, var(--fortune-cookie-primary), transparent, transparent);
61
+ }
62
+
63
+ .fortune-cookie-content {
64
+ position: relative;
65
+ z-index: 10;
66
+ width: 100%;
67
+ display: flex;
68
+ flex-direction: column;
69
+ align-items: center;
70
+ }
71
+
72
+ .fortune-cookie-instruction {
73
+ font-size: 1.25rem;
74
+ line-height: 1.75rem;
75
+ font-weight: 700;
76
+ color: #92400e;
77
+ margin-bottom: 2rem;
78
+ text-transform: uppercase;
79
+ letter-spacing: 0.1em;
80
+ animation: fortune-cookie-pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite;
81
+ }
82
+
83
+ :global(.theme-dark) .fortune-cookie-instruction {
84
+ color: #fbbf24;
85
+ }
86
+
87
+ @keyframes fortune-cookie-pulse {
88
+ 0%, 100% { opacity: 1; }
89
+ 50% { opacity: .5; }
90
+ }
91
+
92
+ .fortune-cookie-stage {
93
+ position: relative;
94
+ width: 20rem;
95
+ height: 20rem;
96
+ cursor: pointer;
97
+ }
98
+
99
+ @media (min-width: 768px) {
100
+ .fortune-cookie-stage {
101
+ width: 24rem;
102
+ height: 24rem;
103
+ }
104
+ }
105
+
106
+ .fortune-cookie-body {
107
+ position: absolute;
108
+ inset: 2rem;
109
+ transition-property: transform;
110
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
111
+ transition-duration: 100ms;
112
+ }
113
+
114
+ @media (min-width: 768px) {
115
+ .fortune-cookie-body {
116
+ inset: 3rem;
117
+ }
118
+ }
119
+
120
+ .fortune-cookie-body:active {
121
+ transform: scale(0.95);
122
+ }
123
+
124
+ .fortune-cookie-img {
125
+ width: 100%;
126
+ height: 100%;
127
+ object-fit: contain;
128
+ z-index: 10;
129
+ position: relative;
130
+ }
131
+
132
+ .fortune-cookie-broken {
133
+ position: absolute;
134
+ inset: 2rem;
135
+ pointer-events: none;
136
+ }
137
+
138
+ .fortune-cookie-broken.hidden {
139
+ display: none;
140
+ }
141
+
142
+ @media (min-width: 768px) {
143
+ .fortune-cookie-broken {
144
+ inset: 3rem;
145
+ }
146
+ }
147
+
148
+ .fortune-cookie-half {
149
+ position: absolute;
150
+ width: 50%;
151
+ height: 100%;
152
+ object-fit: contain;
153
+ transition-property: all;
154
+ transition-timing-function: cubic-bezier(0, 0, 0.2, 1);
155
+ transition-duration: 1000ms;
156
+ }
157
+
158
+ .fortune-cookie-half-left {
159
+ left: 0;
160
+ transform-origin: bottom left;
161
+ }
162
+
163
+ .fortune-cookie-half-right {
164
+ right: 0;
165
+ transform-origin: bottom right;
166
+ }
167
+
168
+ .fortune-cookie-paper {
169
+ position: absolute;
170
+ top: 50%;
171
+ left: 50%;
172
+ transform: translate(-50%, -50%) scale(0.5);
173
+ width: 85%;
174
+ max-width: 320px;
175
+ background-color: #fff;
176
+ border-radius: 2px;
177
+ box-shadow:
178
+ 0 10px 15px -3px rgba(0, 0, 0, 0.2),
179
+ 0 4px 6px -2px rgba(0, 0, 0, 0.1),
180
+ inset 0 0 20px rgba(0, 0, 0, 0.05);
181
+ opacity: 0;
182
+ transition-property: all;
183
+ transition-timing-function: cubic-bezier(0.34, 1.56, 0.64, 1);
184
+ transition-duration: 800ms;
185
+ z-index: 0;
186
+ overflow: hidden;
187
+ }
188
+
189
+ .fortune-cookie-paper.visible {
190
+ opacity: 1;
191
+ transform: translate(-50%, -50%) scale(1) rotate(-1deg);
192
+ z-index: 20;
193
+ }
194
+
195
+ .fortune-cookie-paper-img {
196
+ width: 100%;
197
+ height: auto;
198
+ display: block;
199
+ opacity: 0.15;
200
+ pointer-events: none;
201
+ mix-blend-mode: multiply;
202
+ }
203
+
204
+ .fortune-cookie-paper-content {
205
+ position: absolute;
206
+ inset: 0;
207
+ display: flex;
208
+ flex-direction: column;
209
+ align-items: center;
210
+ justify-content: center;
211
+ padding: 1.5rem;
212
+ text-align: center;
213
+ z-index: 10;
214
+ }
215
+
216
+ .fortune-cookie-text {
217
+ color: #1e293b;
218
+ font-weight: 800;
219
+ font-size: 1.125rem;
220
+ line-height: 1.4;
221
+ transform: rotate(-1deg);
222
+ user-select: text;
223
+ margin: 0;
224
+ }
225
+
226
+ @media (min-width: 768px) {
227
+ .fortune-cookie-text {
228
+ font-size: 1.25rem;
229
+ }
230
+ }
231
+
232
+ .fortune-cookie-lucky-numbers {
233
+ margin-top: 1rem;
234
+ display: flex;
235
+ flex-wrap: wrap;
236
+ gap: 0.5rem;
237
+ justify-content: center;
238
+ transform: rotate(-1deg);
239
+ }
240
+
241
+ :global(.fortune-cookie-number) {
242
+ font-size: 0.75rem;
243
+ line-height: 1rem;
244
+ font-weight: 700;
245
+ background-color: #f1f5f9;
246
+ color: #dc2626;
247
+ padding-left: 0.5rem;
248
+ padding-right: 0.5rem;
249
+ padding-top: 0.125rem;
250
+ padding-bottom: 0.125rem;
251
+ border-radius: 0.25rem;
252
+ box-shadow: 0 1px 2px 0 rgba(0, 0, 0, 0.05);
253
+ border: 1px solid #fee2e2;
254
+ }
255
+
256
+ .fortune-cookie-particles {
257
+ position: absolute;
258
+ inset: 0;
259
+ pointer-events: none;
260
+ overflow: visible;
261
+ z-index: 20;
262
+ }
263
+
264
+ .fortune-cookie-reset {
265
+ display: none;
266
+ margin-top: 3rem;
267
+ flex-direction: column;
268
+ align-items: center;
269
+ gap: 1rem;
270
+ }
271
+
272
+ .fortune-cookie-reset.visible {
273
+ display: flex;
274
+ }
275
+
276
+ .fortune-cookie-status {
277
+ font-size: 0.875rem;
278
+ line-height: 1.25rem;
279
+ color: var(--fortune-cookie-text-dim);
280
+ }
281
+
282
+ .fortune-cookie-share-btn {
283
+ padding-left: 1.5rem;
284
+ padding-right: 1.5rem;
285
+ padding-top: 0.5rem;
286
+ padding-bottom: 0.5rem;
287
+ background-color: #f1f5f9;
288
+ color: #334155;
289
+ border-radius: 9999px;
290
+ font-size: 0.875rem;
291
+ line-height: 1.25rem;
292
+ font-weight: 700;
293
+ border: none;
294
+ cursor: pointer;
295
+ display: flex;
296
+ align-items: center;
297
+ gap: 0.5rem;
298
+ transition-property: color, background-color, border-color, text-decoration-color, fill, stroke;
299
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
300
+ transition-duration: 150ms;
301
+ }
302
+
303
+ :global(.theme-dark) .fortune-cookie-share-btn {
304
+ background-color: #1e293b;
305
+ color: #cbd5e1;
306
+ }
307
+
308
+ .fortune-cookie-share-btn:hover {
309
+ background-color: #e2e8f0;
310
+ }
311
+
312
+ :global(.theme-dark) .fortune-cookie-share-btn:hover {
313
+ background-color: #334155;
314
+ }
315
+
316
+ .fortune-cookie-shake-1 {
317
+ animation: fortune-cookie-shake 0.3s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;
318
+ }
319
+
320
+ .fortune-cookie-shake-2 {
321
+ animation: fortune-cookie-shake 0.4s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;
322
+ }
323
+
324
+ .fortune-cookie-shake-3 {
325
+ animation: fortune-cookie-shake 0.5s cubic-bezier(0.36, 0.07, 0.19, 0.97) both;
326
+ }
327
+
328
+ @keyframes fortune-cookie-shake {
329
+ 10%, 90% { transform: translate3d(-1px, 0, 0) rotate(-1deg); }
330
+ 20%, 80% { transform: translate3d(2px, 0, 0) rotate(2deg); }
331
+ 30%, 50%, 70% { transform: translate3d(-4px, 0, 0) rotate(-4deg); }
332
+ 40%, 60% { transform: translate3d(4px, 0, 0) rotate(4deg); }
333
+ }
334
+
335
+ :global(.fortune-cookie-crumb) {
336
+ position: absolute;
337
+ width: 20px;
338
+ height: 20px;
339
+ background-image: url("/images/utilities/fortune/fc-crumbs.webp");
340
+ background-size: contain;
341
+ background-repeat: no-repeat;
342
+ pointer-events: none;
343
+ }
@@ -1,45 +1,6 @@
1
- import type { CreativeToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
2
-
3
- export interface FortuneCookieUI {
4
- [key: string]: string;
5
- instruction: string;
6
- title: string;
7
- description: string;
8
- dailyStatus: string;
9
- shareBtn: string;
10
- shareTitle: string;
11
- shareText: string;
12
- copied: string;
13
- fortunes: string;
14
- faqTitle: string;
15
- bibliographyTitle: string;
16
- }
17
-
18
- export type FortuneCookieLocaleContent = ToolLocaleContent<FortuneCookieUI>;
19
-
20
- export const fortuneCookie: CreativeToolEntry<FortuneCookieUI> = {
21
- id: 'fortune-cookie',
22
- icons: { bg: 'mdi:cookie', fg: 'mdi:sparkles' },
23
- i18n: {
24
- es: () => import('./i18n/es').then((m) => m.content),
25
- en: () => import('./i18n/en').then((m) => m.content),
26
- fr: () => import('./i18n/fr').then((m) => m.content),
27
- de: () => import('./i18n/de').then((m) => m.content),
28
- id: () => import('./i18n/id').then((m) => m.content),
29
- it: () => import('./i18n/it').then((m) => m.content),
30
- ja: () => import('./i18n/ja').then((m) => m.content),
31
- ko: () => import('./i18n/ko').then((m) => m.content),
32
- nl: () => import('./i18n/nl').then((m) => m.content),
33
- pl: () => import('./i18n/pl').then((m) => m.content),
34
- pt: () => import('./i18n/pt').then((m) => m.content),
35
- ru: () => import('./i18n/ru').then((m) => m.content),
36
- sv: () => import('./i18n/sv').then((m) => m.content),
37
- tr: () => import('./i18n/tr').then((m) => m.content),
38
- zh: () => import('./i18n/zh').then((m) => m.content),
39
- },
40
- };
41
-
42
-
1
+ import type { ToolDefinition } from '../../types';
2
+ import { fortuneCookie } from './entry';
3
+ export * from './entry';
43
4
  export const FORTUNE_COOKIE_TOOL: ToolDefinition = {
44
5
  entry: fortuneCookie,
45
6
  Component: () => import('./component.astro'),
@@ -108,232 +108,3 @@ const { ui } = Astro.props;
108
108
  document.addEventListener('astro:page-load', init);
109
109
  </script>
110
110
 
111
- <style>
112
- .synesthesia-painter {
113
- --sp-bg: #fff;
114
- --sp-bg-muted: #f8fafc;
115
- --sp-text: #0f172a;
116
- --sp-text-muted: #475569;
117
- --sp-text-dim: #64748b;
118
- --sp-border: #e2e8f0;
119
- --sp-shadow: rgba(0, 0, 0, 0.08);
120
- --sp-primary: #6366f1;
121
- --sp-primary-on: #fff;
122
- --sp-header-bg: rgba(255, 255, 255, 0.92);
123
- }
124
-
125
- :global(.theme-dark) .synesthesia-painter {
126
- --sp-bg: #0f172a;
127
- --sp-bg-muted: #1e293b;
128
- --sp-text: #f8fafc;
129
- --sp-text-muted: #94a3b8;
130
- --sp-text-dim: #64748b;
131
- --sp-border: #334155;
132
- --sp-shadow: rgba(0, 0, 0, 0.35);
133
- --sp-primary: #818cf8;
134
- --sp-header-bg: rgba(30, 41, 59, 0.92);
135
- }
136
-
137
- .synesthesia-painter-card {
138
- position: relative;
139
- min-height: 420px;
140
- background-color: var(--sp-bg);
141
- border-radius: 2rem;
142
- border: 1px solid var(--sp-border);
143
- box-shadow: 0 20px 40px -8px var(--sp-shadow);
144
- display: flex;
145
- flex-direction: column;
146
- overflow: hidden;
147
- }
148
-
149
- .synesthesia-painter-header {
150
- position: absolute;
151
- top: 1rem;
152
- right: 1rem;
153
- z-index: 30;
154
- background-color: var(--sp-header-bg);
155
- backdrop-filter: blur(8px);
156
- padding: 0.3rem;
157
- border-radius: 9999px;
158
- border: 1px solid var(--sp-border);
159
- box-shadow: 0 1px 4px rgba(0, 0, 0, 0.08);
160
- display: flex;
161
- gap: 0.2rem;
162
- }
163
-
164
- .synesthesia-painter-mode-btn {
165
- padding: 0.4rem 0.875rem;
166
- border-radius: 9999px;
167
- font-size: 0.7rem;
168
- font-weight: 700;
169
- text-transform: uppercase;
170
- letter-spacing: 0.06em;
171
- transition: background 0.2s, color 0.2s;
172
- color: var(--sp-text-muted);
173
- background: none;
174
- border: none;
175
- cursor: pointer;
176
- }
177
-
178
- .synesthesia-painter-mode-btn:hover {
179
- background-color: var(--sp-bg-muted);
180
- color: var(--sp-text);
181
- }
182
-
183
- .synesthesia-painter-mode-btn.active {
184
- background-color: var(--sp-primary);
185
- color: var(--sp-primary-on);
186
- box-shadow: 0 2px 8px rgba(99, 102, 241, 0.35);
187
- }
188
-
189
- .synesthesia-painter-canvas-wrapper {
190
- position: relative;
191
- flex-grow: 1;
192
- padding: 2rem;
193
- padding-top: 5rem;
194
- cursor: text;
195
- }
196
-
197
- @media (min-width: 768px) {
198
- .synesthesia-painter-canvas-wrapper {
199
- padding: 3rem;
200
- padding-top: 5rem;
201
- }
202
- }
203
-
204
- .synesthesia-painter-viz-layer {
205
- word-break: break-all;
206
- white-space: pre-wrap;
207
- line-height: 1.625;
208
- outline: none;
209
- font-size: 2.5rem;
210
- min-height: 100%;
211
- }
212
-
213
- .synesthesia-painter-input {
214
- position: absolute;
215
- inset: 0;
216
- opacity: 0;
217
- cursor: text;
218
- z-index: -10;
219
- width: 100%;
220
- height: 100%;
221
- resize: none;
222
- border: none;
223
- background: transparent;
224
- }
225
-
226
- .synesthesia-painter-placeholder {
227
- position: absolute;
228
- top: 5rem;
229
- left: 2rem;
230
- pointer-events: none;
231
- opacity: 0.35;
232
- user-select: none;
233
- }
234
-
235
- @media (min-width: 768px) {
236
- .synesthesia-painter-placeholder {
237
- left: 3rem;
238
- }
239
- }
240
-
241
- .synesthesia-painter-placeholder-text {
242
- color: var(--sp-text-dim);
243
- font-size: 2.25rem;
244
- font-weight: 300;
245
- font-style: italic;
246
- }
247
-
248
- .synesthesia-painter-footer {
249
- background-color: var(--sp-bg-muted);
250
- border-top: 1px solid var(--sp-border);
251
- padding: 0.875rem 2rem;
252
- display: flex;
253
- align-items: center;
254
- justify-content: space-between;
255
- gap: 1rem;
256
- }
257
-
258
- .synesthesia-painter-tooltip {
259
- font-size: 0.75rem;
260
- color: var(--sp-text-muted);
261
- font-weight: 500;
262
- margin: 0;
263
- }
264
-
265
- .synesthesia-painter-clear-btn {
266
- font-size: 0.7rem;
267
- font-weight: 700;
268
- color: var(--sp-text-dim);
269
- text-transform: uppercase;
270
- letter-spacing: 0.06em;
271
- background: none;
272
- border: none;
273
- cursor: pointer;
274
- display: flex;
275
- align-items: center;
276
- gap: 0.375rem;
277
- transition: color 0.2s;
278
- white-space: nowrap;
279
- }
280
-
281
- .synesthesia-painter-clear-btn:hover {
282
- color: #ef4444;
283
- }
284
-
285
- :global(.synesthesia-painter-char) {
286
- display: inline-block;
287
- color: var(--char-color);
288
- transition: color 0.3s cubic-bezier(0.4, 0, 0.2, 1);
289
- animation: sp-fade-in 0.2s ease-out forwards;
290
- }
291
-
292
- @keyframes sp-fade-in {
293
- from {
294
- opacity: 0;
295
- transform: translateY(4px);
296
- }
297
-
298
- to {
299
- opacity: 1;
300
- transform: translateY(0);
301
- }
302
- }
303
-
304
- :global(.synesthesia-painter-viz-layer.dots .synesthesia-painter-char) {
305
- color: transparent;
306
- font-size: 0;
307
- width: 1rem;
308
- height: 1rem;
309
- border-radius: 50%;
310
- background-color: var(--char-color);
311
- margin: 0.25rem;
312
- box-shadow: 0 0 8px var(--char-color);
313
- }
314
-
315
- :global(.synesthesia-painter-viz-layer.aura .synesthesia-painter-char) {
316
- color: rgba(255, 255, 255, 0.15);
317
- text-shadow: 0 0 18px var(--char-color), 0 0 36px var(--char-color);
318
- }
319
-
320
- :global(.theme-dark .synesthesia-painter-viz-layer.aura .synesthesia-painter-char) {
321
- color: rgba(255, 255, 255, 0.85);
322
- text-shadow: 0 0 14px var(--char-color), 0 0 28px var(--char-color), 0 0 56px var(--char-color);
323
- }
324
-
325
- :global(.synesthesia-painter-cursor) {
326
- display: inline-block;
327
- width: 2px;
328
- height: 2.5rem;
329
- background-color: var(--sp-primary);
330
- animation: sp-blink 1s step-end infinite;
331
- vertical-align: text-bottom;
332
- margin-left: 2px;
333
- }
334
-
335
- @keyframes sp-blink {
336
- 0%, 100% { opacity: 1; }
337
- 50% { opacity: 0; }
338
- }
339
- </style>
@@ -0,0 +1,39 @@
1
+ import type { CreativeToolEntry, ToolLocaleContent } from '../../types';
2
+
3
+ export interface SynesthesiaPainterUI {
4
+ [key: string]: string;
5
+ title: string;
6
+ description: string;
7
+ modeLetters: string;
8
+ modeDots: string;
9
+ modeAura: string;
10
+ placeholder: string;
11
+ footerText: string;
12
+ clearBtn: string;
13
+ faqTitle: string;
14
+ bibliographyTitle: string;
15
+ }
16
+
17
+ export type SynesthesiaPainterLocaleContent = ToolLocaleContent<SynesthesiaPainterUI>;
18
+
19
+ export const synesthesiaPainter: CreativeToolEntry<SynesthesiaPainterUI> = {
20
+ id: 'synesthesia-painter',
21
+ icons: { bg: 'mdi:brush', fg: 'mdi:eye' },
22
+ i18n: {
23
+ es: () => import('./i18n/es').then((m) => m.content),
24
+ en: () => import('./i18n/en').then((m) => m.content),
25
+ fr: () => import('./i18n/fr').then((m) => m.content),
26
+ de: () => import('./i18n/de').then((m) => m.content),
27
+ id: () => import('./i18n/id').then((m) => m.content),
28
+ it: () => import('./i18n/it').then((m) => m.content),
29
+ ja: () => import('./i18n/ja').then((m) => m.content),
30
+ ko: () => import('./i18n/ko').then((m) => m.content),
31
+ nl: () => import('./i18n/nl').then((m) => m.content),
32
+ pl: () => import('./i18n/pl').then((m) => m.content),
33
+ pt: () => import('./i18n/pt').then((m) => m.content),
34
+ ru: () => import('./i18n/ru').then((m) => m.content),
35
+ sv: () => import('./i18n/sv').then((m) => m.content),
36
+ tr: () => import('./i18n/tr').then((m) => m.content),
37
+ zh: () => import('./i18n/zh').then((m) => m.content),
38
+ },
39
+ };
@@ -1,44 +1,6 @@
1
- import type { CreativeToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
2
-
3
- export interface SynesthesiaPainterUI {
4
- [key: string]: string;
5
- title: string;
6
- description: string;
7
- modeLetters: string;
8
- modeDots: string;
9
- modeAura: string;
10
- placeholder: string;
11
- footerText: string;
12
- clearBtn: string;
13
- faqTitle: string;
14
- bibliographyTitle: string;
15
- }
16
-
17
- export type SynesthesiaPainterLocaleContent = ToolLocaleContent<SynesthesiaPainterUI>;
18
-
19
- export const synesthesiaPainter: CreativeToolEntry<SynesthesiaPainterUI> = {
20
- id: 'synesthesia-painter',
21
- icons: { bg: 'mdi:brush', fg: 'mdi:eye' },
22
- i18n: {
23
- es: () => import('./i18n/es').then((m) => m.content),
24
- en: () => import('./i18n/en').then((m) => m.content),
25
- fr: () => import('./i18n/fr').then((m) => m.content),
26
- de: () => import('./i18n/de').then((m) => m.content),
27
- id: () => import('./i18n/id').then((m) => m.content),
28
- it: () => import('./i18n/it').then((m) => m.content),
29
- ja: () => import('./i18n/ja').then((m) => m.content),
30
- ko: () => import('./i18n/ko').then((m) => m.content),
31
- nl: () => import('./i18n/nl').then((m) => m.content),
32
- pl: () => import('./i18n/pl').then((m) => m.content),
33
- pt: () => import('./i18n/pt').then((m) => m.content),
34
- ru: () => import('./i18n/ru').then((m) => m.content),
35
- sv: () => import('./i18n/sv').then((m) => m.content),
36
- tr: () => import('./i18n/tr').then((m) => m.content),
37
- zh: () => import('./i18n/zh').then((m) => m.content),
38
- },
39
- };
40
-
41
-
1
+ import type { ToolDefinition } from '../../types';
2
+ import { synesthesiaPainter } from './entry';
3
+ export * from './entry';
42
4
  export const SYNESTHESIA_PAINTER_TOOL: ToolDefinition = {
43
5
  entry: synesthesiaPainter,
44
6
  Component: () => import('./component.astro'),