@jjlmoya/utils-tools 1.8.0 → 1.10.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 (52) hide show
  1. package/package.json +7 -4
  2. package/scripts/postinstall.mjs +27 -0
  3. package/src/entries.ts +26 -0
  4. package/src/tool/date-diff-calculator/component.astro +0 -200
  5. package/src/tool/date-diff-calculator/date-difference-calculator.css +198 -0
  6. package/src/tool/date-diff-calculator/entry.ts +24 -0
  7. package/src/tool/date-diff-calculator/index.ts +2 -25
  8. package/src/tool/drive-direct-link/component.astro +0 -173
  9. package/src/tool/drive-direct-link/entry.ts +24 -0
  10. package/src/tool/drive-direct-link/google-drive-direct-download-link.css +171 -0
  11. package/src/tool/drive-direct-link/index.ts +2 -25
  12. package/src/tool/email-list-cleaner/component.astro +0 -204
  13. package/src/tool/email-list-cleaner/email-list-cleaner.css +202 -0
  14. package/src/tool/email-list-cleaner/entry.ts +24 -0
  15. package/src/tool/email-list-cleaner/index.ts +2 -25
  16. package/src/tool/env-badge-spain/component.astro +0 -156
  17. package/src/tool/env-badge-spain/entry.ts +24 -0
  18. package/src/tool/env-badge-spain/environmental-badge-simulator-spain.css +154 -0
  19. package/src/tool/env-badge-spain/index.ts +2 -25
  20. package/src/tool/morse-beacon/component.astro +0 -298
  21. package/src/tool/morse-beacon/entry.ts +24 -0
  22. package/src/tool/morse-beacon/index.ts +2 -25
  23. package/src/tool/morse-beacon/morse-beacon.css +296 -0
  24. package/src/tool/password-generator/component.astro +0 -88
  25. package/src/tool/password-generator/entry.ts +24 -0
  26. package/src/tool/password-generator/index.ts +2 -25
  27. package/src/tool/password-generator/password-generator.css +86 -0
  28. package/src/tool/routes/component.astro +0 -254
  29. package/src/tool/routes/entry.ts +24 -0
  30. package/src/tool/routes/index.ts +2 -25
  31. package/src/tool/routes/optimal-routes.css +252 -0
  32. package/src/tool/rule-of-three/component.astro +0 -249
  33. package/src/tool/rule-of-three/entry.ts +24 -0
  34. package/src/tool/rule-of-three/index.ts +2 -25
  35. package/src/tool/rule-of-three/rule-of-three.css +247 -0
  36. package/src/tool/seo-content-optimizer/component.astro +0 -278
  37. package/src/tool/seo-content-optimizer/entry.ts +24 -0
  38. package/src/tool/seo-content-optimizer/index.ts +2 -25
  39. package/src/tool/seo-content-optimizer/seo-content-optimizer.css +276 -0
  40. package/src/tool/speed-reader/component.astro +0 -400
  41. package/src/tool/speed-reader/entry.ts +24 -0
  42. package/src/tool/speed-reader/index.ts +2 -25
  43. package/src/tool/speed-reader/speed-reader.css +398 -0
  44. package/src/tool/text-pixel-calculator/component.astro +0 -96
  45. package/src/tool/text-pixel-calculator/entry.ts +24 -0
  46. package/src/tool/text-pixel-calculator/index.ts +2 -25
  47. package/src/tool/text-pixel-calculator/text-pixel-width-calculator.css +94 -0
  48. package/src/tool/whatsapp-link/component.astro +0 -264
  49. package/src/tool/whatsapp-link/entry.ts +24 -0
  50. package/src/tool/whatsapp-link/index.ts +2 -25
  51. package/src/tool/whatsapp-link/whatsapp-link-generator.css +262 -0
  52. package/src/tools.ts +1 -1
@@ -0,0 +1,276 @@
1
+ .sco-root {
2
+ --sco-blue: #3b82f6;
3
+ --sco-green: #10b981;
4
+ --sco-red: #ef4444;
5
+ --sco-muted: #64748b;
6
+ --sco-tab-bg: rgba(255, 255, 255, 0.5);
7
+ --sco-tab-active-bg: #fff;
8
+ --sco-tab-active-color: #3b82f6;
9
+ --sco-card-bg: rgba(255, 255, 255, 0.7);
10
+ --sco-card-border: rgba(255, 255, 255, 0.3);
11
+ --sco-textarea-color: #1e293b;
12
+ --sco-stat-bg: #f8fafc;
13
+ --sco-stat-border: rgba(0, 0, 0, 0.05);
14
+ --sco-panel-bg: #fff;
15
+ --sco-panel-border: #e2e8f0;
16
+ --sco-check-bg: #f8fafc;
17
+ --sco-keyword-bg: #f1f5f9;
18
+ --sco-keyword-name: #1e293b;
19
+ --sco-tech-border: #f1f5f9;
20
+
21
+ width: 100%;
22
+ max-width: 1200px;
23
+ margin: 0 auto;
24
+ display: flex;
25
+ flex-direction: column;
26
+ gap: 2rem;
27
+ }
28
+
29
+ :global(.theme-dark) .sco-root {
30
+ --sco-tab-bg: rgba(15, 23, 42, 0.5);
31
+ --sco-tab-active-bg: #1e293b;
32
+ --sco-tab-active-color: #60a5fa;
33
+ --sco-card-bg: rgba(15, 23, 42, 0.6);
34
+ --sco-card-border: rgba(255, 255, 255, 0.05);
35
+ --sco-textarea-color: #f1f5f9;
36
+ --sco-stat-bg: #1e293b;
37
+ --sco-stat-border: rgba(255, 255, 255, 0.05);
38
+ --sco-panel-bg: #0f172a;
39
+ --sco-panel-border: #1e293b;
40
+ --sco-check-bg: #1e293b;
41
+ --sco-keyword-bg: #0f172a;
42
+ --sco-keyword-name: #f1f5f9;
43
+ --sco-tech-border: #1e293b;
44
+ }
45
+
46
+ .sco-tabs {
47
+ display: flex;
48
+ gap: 1rem;
49
+ background: var(--sco-tab-bg);
50
+ backdrop-filter: blur(10px);
51
+ padding: 0.5rem;
52
+ border-radius: 1rem;
53
+ width: fit-content;
54
+ }
55
+
56
+ .sco-tab {
57
+ padding: 0.75rem 1.5rem;
58
+ border-radius: 0.75rem;
59
+ font-weight: 700;
60
+ font-size: 0.9rem;
61
+ cursor: pointer;
62
+ border: none;
63
+ transition: background 0.2s, color 0.2s;
64
+ background: transparent;
65
+ color: var(--sco-muted);
66
+ }
67
+
68
+ .sco-tab.active {
69
+ background: var(--sco-tab-active-bg);
70
+ color: var(--sco-tab-active-color);
71
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
72
+ }
73
+
74
+ .sco-grid {
75
+ display: grid;
76
+ grid-template-columns: 1fr;
77
+ gap: 1.5rem;
78
+ }
79
+
80
+ @media (min-width: 1024px) {
81
+ .sco-grid {
82
+ grid-template-columns: 1.5fr 1fr;
83
+ }
84
+ }
85
+
86
+ .sco-input-card {
87
+ background: var(--sco-card-bg);
88
+ backdrop-filter: blur(20px);
89
+ border: 1px solid var(--sco-card-border);
90
+ border-radius: 1.5rem;
91
+ padding: 1.5rem;
92
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.05);
93
+ }
94
+
95
+ .sco-textarea {
96
+ width: 100%;
97
+ min-height: 450px;
98
+ background: transparent;
99
+ border: none;
100
+ resize: none;
101
+ font-size: 1.1rem;
102
+ line-height: 1.6;
103
+ color: var(--sco-textarea-color);
104
+ box-sizing: border-box;
105
+ }
106
+
107
+ .sco-textarea:focus {
108
+ outline: none;
109
+ }
110
+
111
+ .sco-stats {
112
+ display: grid;
113
+ grid-template-columns: repeat(4, 1fr);
114
+ gap: 1rem;
115
+ margin-top: 1.5rem;
116
+ padding-top: 1.5rem;
117
+ border-top: 1px solid var(--sco-stat-border);
118
+ }
119
+
120
+ @media (max-width: 480px) {
121
+ .sco-stats {
122
+ grid-template-columns: repeat(2, 1fr);
123
+ }
124
+ }
125
+
126
+ .sco-stat {
127
+ text-align: center;
128
+ padding: 1rem;
129
+ background: var(--sco-stat-bg);
130
+ border-radius: 1rem;
131
+ }
132
+
133
+ .sco-stat-value {
134
+ display: block;
135
+ font-size: 1.5rem;
136
+ font-weight: 800;
137
+ color: var(--sco-blue);
138
+ }
139
+
140
+ .sco-stat-label {
141
+ font-size: 0.75rem;
142
+ font-weight: 700;
143
+ color: var(--sco-muted);
144
+ text-transform: uppercase;
145
+ }
146
+
147
+ .sco-panels {
148
+ display: flex;
149
+ flex-direction: column;
150
+ gap: 1.5rem;
151
+ }
152
+
153
+ .sco-panel {
154
+ background: var(--sco-panel-bg);
155
+ border: 1px solid var(--sco-panel-border);
156
+ border-radius: 1.25rem;
157
+ padding: 1.5rem;
158
+ }
159
+
160
+ .sco-panel-title {
161
+ font-size: 0.875rem;
162
+ font-weight: 800;
163
+ margin: 0 0 1.25rem;
164
+ text-transform: uppercase;
165
+ letter-spacing: 0.05em;
166
+ color: var(--sco-muted);
167
+ }
168
+
169
+ .sco-checklist {
170
+ display: flex;
171
+ flex-direction: column;
172
+ gap: 0.75rem;
173
+ }
174
+
175
+ :global(.sco-check-item) {
176
+ display: flex;
177
+ gap: 0.75rem;
178
+ align-items: flex-start;
179
+ padding: 0.75rem;
180
+ border-radius: 0.75rem;
181
+ background: var(--sco-check-bg, #f8fafc);
182
+ font-size: 0.85rem;
183
+ font-weight: 500;
184
+ color: inherit;
185
+ }
186
+
187
+ :global(.sco-check-status) {
188
+ width: 20px;
189
+ height: 20px;
190
+ border-radius: 50%;
191
+ flex-shrink: 0;
192
+ display: flex;
193
+ align-items: center;
194
+ justify-content: center;
195
+ font-size: 0.7rem;
196
+ font-weight: 900;
197
+ }
198
+
199
+ :global(.sco-success) {
200
+ background: #dcfce7;
201
+ color: #15803d;
202
+ }
203
+
204
+ :global(.sco-warning) {
205
+ background: #fef9c3;
206
+ color: #a16207;
207
+ }
208
+
209
+ :global(.sco-error) {
210
+ background: #fee2e2;
211
+ color: #b91c1c;
212
+ }
213
+
214
+ .sco-keywords {
215
+ display: flex;
216
+ flex-direction: column;
217
+ gap: 0.5rem;
218
+ }
219
+
220
+ :global(.sco-keyword-item) {
221
+ display: flex;
222
+ justify-content: space-between;
223
+ padding: 0.5rem 0.75rem;
224
+ background: var(--sco-keyword-bg, #f1f5f9);
225
+ border-radius: 0.5rem;
226
+ font-size: 0.9rem;
227
+ }
228
+
229
+ :global(.sco-keyword-name) {
230
+ font-weight: 600;
231
+ color: var(--sco-keyword-name, #1e293b);
232
+ }
233
+
234
+ :global(.sco-keyword-count) {
235
+ font-weight: 700;
236
+ }
237
+
238
+ .sco-empty {
239
+ font-size: 0.875rem;
240
+ color: var(--sco-muted);
241
+ text-align: center;
242
+ padding: 0.5rem;
243
+ }
244
+
245
+ :global(.sco-empty-injected) {
246
+ font-size: 0.875rem;
247
+ color: var(--sco-muted, #64748b);
248
+ text-align: center;
249
+ padding: 0.5rem;
250
+ }
251
+
252
+ .sco-tech-stats {
253
+ display: flex;
254
+ flex-direction: column;
255
+ gap: 1.25rem;
256
+ }
257
+
258
+ .sco-tech-stat {
259
+ display: flex;
260
+ justify-content: space-between;
261
+ align-items: center;
262
+ padding-bottom: 0.75rem;
263
+ border-bottom: 1px solid var(--sco-tech-border);
264
+ }
265
+
266
+ .sco-tech-label {
267
+ font-size: 0.8rem;
268
+ font-weight: 700;
269
+ color: var(--sco-muted);
270
+ }
271
+
272
+ .sco-tech-value {
273
+ font-size: 0.8rem;
274
+ font-weight: 600;
275
+ color: var(--sco-blue);
276
+ }
@@ -75,406 +75,6 @@ const t = (ui ?? {}) as SpeedReaderUI;
75
75
  </div>
76
76
  </div>
77
77
 
78
- <style>
79
- .sr-root {
80
- --sr-accent: #4f46e5;
81
- --sr-accent-hover: #4338ca;
82
- --sr-violet: #7c3aed;
83
- --sr-pivot-color: #ef4444;
84
- --sr-panel-bg: #fff;
85
- --sr-panel-border: #f1f5f9;
86
- --sr-field-bg: #f8fafc;
87
- --sr-field-border: #e2e8f0;
88
- --sr-field-focus: #4f46e5;
89
- --sr-text-main: #1e293b;
90
- --sr-text-label: #64748b;
91
- --sr-text-hint: #94a3b8;
92
- --sr-text-muted: #475569;
93
- --sr-btn-shadow: rgba(79, 70, 229, 0.35);
94
- --sr-badge-bg: rgba(15, 23, 42, 0.8);
95
- --sr-badge-border: #334155;
96
- --sr-led-idle: #22c55e;
97
- --sr-led-active: #f59e0b;
98
- --sr-guide-color: rgba(71, 85, 105, 0.3);
99
- --sr-word-color: #e2e8f0;
100
- --sr-word-muted: #475569;
101
- --sr-clear-color: #f87171;
102
- --sr-clear-hover: #fee2e2;
103
-
104
- width: 100%;
105
- max-width: 56rem;
106
- margin: 0 auto;
107
- display: flex;
108
- flex-direction: column;
109
- gap: 1rem;
110
- }
111
-
112
- :global(.theme-dark) .sr-root {
113
- --sr-panel-bg: #0f172a;
114
- --sr-panel-border: #1e293b;
115
- --sr-field-bg: rgba(30, 41, 59, 0.5);
116
- --sr-field-border: #334155;
117
- --sr-text-main: #e2e8f0;
118
- --sr-text-label: #94a3b8;
119
- --sr-text-hint: #64748b;
120
- --sr-text-muted: #64748b;
121
- --sr-word-muted: #64748b;
122
- }
123
-
124
- .sr-stage {
125
- position: relative;
126
- background: #0f172a;
127
- border-radius: 1.5rem;
128
- height: 22rem;
129
- display: flex;
130
- align-items: center;
131
- justify-content: center;
132
- overflow: hidden;
133
- border: 1px solid #1e293b;
134
- box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.5);
135
- transition: transform 0.3s cubic-bezier(0.4, 0, 0.2, 1);
136
- }
137
-
138
- :global(.sr-stage-active) {
139
- transform: scale(1.02);
140
- border-color: rgba(79, 70, 229, 0.4);
141
- }
142
-
143
- .sr-badge {
144
- position: absolute;
145
- top: 1.25rem;
146
- right: 1.25rem;
147
- display: flex;
148
- align-items: center;
149
- gap: 0.375rem;
150
- background: var(--sr-badge-bg);
151
- border: 1px solid var(--sr-badge-border);
152
- border-radius: 9999px;
153
- padding: 0.25rem 0.75rem;
154
- font-size: 0.75rem;
155
- color: #cbd5e1;
156
- z-index: 20;
157
- backdrop-filter: blur(4px);
158
- }
159
-
160
- .sr-badge > span:first-child {
161
- font-weight: 700;
162
- color: #f1f5f9;
163
- }
164
-
165
- .sr-badge-label {
166
- color: #64748b;
167
- text-transform: uppercase;
168
- letter-spacing: 0.05em;
169
- }
170
-
171
- .sr-led {
172
- width: 0.5rem;
173
- height: 0.5rem;
174
- border-radius: 50%;
175
- background: var(--sr-led-idle);
176
- transition: background 0.2s;
177
- }
178
-
179
- :global(.sr-led-active) {
180
- background: var(--sr-led-active);
181
- animation: sr-pulse 1s ease-in-out infinite;
182
- }
183
-
184
- @keyframes sr-pulse {
185
- 0%, 100% { opacity: 1; }
186
- 50% { opacity: 0.5; }
187
- }
188
-
189
- .sr-guide-v {
190
- position: absolute;
191
- top: 0;
192
- bottom: 0;
193
- left: 50%;
194
- width: 1px;
195
- background: rgba(71, 85, 105, 0.25);
196
- transform: translateX(-50%);
197
- pointer-events: none;
198
- }
199
-
200
- .sr-guide-h {
201
- position: absolute;
202
- top: 50%;
203
- left: 50%;
204
- width: 18rem;
205
- height: 4.5rem;
206
- transform: translate(-50%, -60%);
207
- border-top: 1px solid rgba(71, 85, 105, 0.2);
208
- border-bottom: 1px solid rgba(71, 85, 105, 0.2);
209
- border-radius: 0.5rem;
210
- pointer-events: none;
211
- }
212
-
213
- .sr-word {
214
- position: relative;
215
- z-index: 10;
216
- display: grid;
217
- grid-template-columns: 1fr auto 1fr;
218
- align-items: center;
219
- width: 100%;
220
- max-width: 36rem;
221
- padding: 0 2rem;
222
- font-size: clamp(2rem, 6vw, 3.5rem);
223
- font-weight: 700;
224
- user-select: none;
225
- }
226
-
227
- .sr-word-left {
228
- text-align: right;
229
- color: var(--sr-word-muted);
230
- white-space: nowrap;
231
- }
232
-
233
- .sr-word-pivot {
234
- position: relative;
235
- display: flex;
236
- justify-content: center;
237
- flex-shrink: 0;
238
- min-width: 1ch;
239
- margin: 0 1px;
240
- }
241
-
242
- .sr-word-pivot > span {
243
- color: var(--sr-pivot-color);
244
- font-weight: 900;
245
- position: relative;
246
- z-index: 2;
247
- }
248
-
249
- .sr-pivot-beam {
250
- position: absolute;
251
- top: 50%;
252
- left: 50%;
253
- transform: translate(-50%, -50%);
254
- width: 2px;
255
- height: 4rem;
256
- background: rgba(239, 68, 68, 0.15);
257
- border-radius: 9999px;
258
- }
259
-
260
- .sr-word-right {
261
- text-align: left;
262
- color: var(--sr-word-muted);
263
- white-space: nowrap;
264
- }
265
-
266
- .sr-panel {
267
- background: var(--sr-panel-bg);
268
- border: 1px solid var(--sr-panel-border);
269
- border-radius: 1.5rem;
270
- padding: 1.5rem;
271
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.04);
272
- display: flex;
273
- flex-direction: column;
274
- gap: 1.5rem;
275
- }
276
-
277
- .sr-playrow {
278
- display: flex;
279
- align-items: center;
280
- gap: 1.25rem;
281
- }
282
-
283
- .sr-play-btn {
284
- flex-shrink: 0;
285
- width: 3.75rem;
286
- height: 3.75rem;
287
- background: var(--sr-accent);
288
- color: #fff;
289
- border: none;
290
- border-radius: 1rem;
291
- display: flex;
292
- align-items: center;
293
- justify-content: center;
294
- cursor: pointer;
295
- box-shadow: 0 4px 14px var(--sr-btn-shadow);
296
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
297
- }
298
-
299
- .sr-play-btn:hover {
300
- background: var(--sr-accent-hover);
301
- transform: scale(1.05);
302
- }
303
-
304
- .sr-play-btn:active {
305
- transform: scale(0.95);
306
- }
307
-
308
- :global(.sr-play-btn-active) {
309
- background: #1e293b;
310
- box-shadow: 0 4px 14px rgba(0, 0, 0, 0.3);
311
- }
312
-
313
- :global(.sr-play-btn-active):hover {
314
- background: #0f172a;
315
- }
316
-
317
- .sr-play-icon {
318
- width: 1.75rem;
319
- height: 1.75rem;
320
- }
321
-
322
- .sr-progress-wrap {
323
- flex: 1;
324
- display: flex;
325
- flex-direction: column;
326
- gap: 0.5rem;
327
- }
328
-
329
- .sr-progress-header {
330
- display: flex;
331
- justify-content: space-between;
332
- align-items: center;
333
- font-size: 0.7rem;
334
- font-weight: 700;
335
- text-transform: uppercase;
336
- letter-spacing: 0.08em;
337
- color: var(--sr-text-hint);
338
- padding: 0 0.25rem;
339
- }
340
-
341
- .sr-progress-pct {
342
- color: var(--sr-accent);
343
- }
344
-
345
- .sr-slider {
346
- width: 100%;
347
- cursor: pointer;
348
- accent-color: var(--sr-accent);
349
- }
350
-
351
- .sr-config {
352
- display: grid;
353
- grid-template-columns: 1fr;
354
- gap: 1.5rem;
355
- border-top: 1px solid var(--sr-panel-border);
356
- padding-top: 1.5rem;
357
- }
358
-
359
- @media (min-width: 640px) {
360
- .sr-config { grid-template-columns: 1fr 1fr; }
361
- }
362
-
363
- .sr-config-label {
364
- display: block;
365
- font-size: 1rem;
366
- font-weight: 900;
367
- color: var(--sr-text-main);
368
- }
369
-
370
- .sr-speed-section {
371
- display: flex;
372
- flex-direction: column;
373
- gap: 0.75rem;
374
- }
375
-
376
- .sr-speed-header {
377
- display: flex;
378
- justify-content: space-between;
379
- align-items: center;
380
- }
381
-
382
- .sr-wpm-badge {
383
- background: rgba(79, 70, 229, 0.08);
384
- color: var(--sr-accent);
385
- border: 1px solid rgba(79, 70, 229, 0.2);
386
- border-radius: 9999px;
387
- padding: 0.2rem 0.75rem;
388
- font-size: 0.8rem;
389
- font-weight: 700;
390
- }
391
-
392
- .sr-speed-labels {
393
- display: flex;
394
- justify-content: space-between;
395
- font-size: 0.7rem;
396
- font-weight: 700;
397
- color: var(--sr-text-hint);
398
- letter-spacing: 0.08em;
399
- }
400
-
401
- .sr-speed-hint {
402
- font-size: 0.8rem;
403
- color: var(--sr-text-hint);
404
- line-height: 1.5;
405
- margin: 0;
406
- }
407
-
408
- .sr-text-section {
409
- display: flex;
410
- flex-direction: column;
411
- gap: 0.5rem;
412
- }
413
-
414
- .sr-textarea-wrap {
415
- position: relative;
416
- }
417
-
418
- .sr-textarea {
419
- width: 100%;
420
- height: 9rem;
421
- background: var(--sr-field-bg);
422
- border: 1px solid var(--sr-field-border);
423
- border-radius: 0.75rem;
424
- padding: 0.875rem 1rem 2.5rem;
425
- font-size: 0.85rem;
426
- color: var(--sr-text-main);
427
- line-height: 1.6;
428
- resize: none;
429
- outline: none;
430
- transition: border-color 0.2s;
431
- box-sizing: border-box;
432
- }
433
-
434
- .sr-textarea::placeholder {
435
- color: var(--sr-text-hint);
436
- }
437
-
438
- .sr-textarea:focus {
439
- border-color: var(--sr-field-focus);
440
- }
441
-
442
- .sr-textarea-footer {
443
- position: absolute;
444
- bottom: 0.625rem;
445
- right: 0.625rem;
446
- display: flex;
447
- align-items: center;
448
- gap: 0.5rem;
449
- }
450
-
451
- .sr-word-count {
452
- font-size: 0.7rem;
453
- font-weight: 700;
454
- color: var(--sr-text-hint);
455
- background: var(--sr-panel-bg);
456
- border: 1px solid var(--sr-panel-border);
457
- padding: 0.2rem 0.5rem;
458
- border-radius: 0.375rem;
459
- }
460
-
461
- .sr-clear-btn {
462
- font-size: 0.7rem;
463
- font-weight: 700;
464
- color: var(--sr-clear-color);
465
- background: transparent;
466
- border: none;
467
- cursor: pointer;
468
- padding: 0.2rem 0.375rem;
469
- border-radius: 0.375rem;
470
- transition: background 0.15s;
471
- letter-spacing: 0.05em;
472
- }
473
-
474
- .sr-clear-btn:hover {
475
- background: var(--sr-clear-hover);
476
- }
477
- </style>
478
78
 
479
79
  <script>
480
80
  import { RSVPEngine } from './logic/RSVPEngine';
@@ -0,0 +1,24 @@
1
+ import type { ToolsToolEntry } from '../../types';
2
+ import type { SpeedReaderUI } from './ui';
3
+
4
+ export const speedReader: ToolsToolEntry<SpeedReaderUI> = {
5
+ id: 'speed-reader',
6
+ icons: { bg: 'mdi:book-open-page-variant', fg: 'mdi:lightning-bolt' },
7
+ i18n: {
8
+ es: () => import('./i18n/es').then((m) => m.content),
9
+ en: () => import('./i18n/en').then((m) => m.content),
10
+ fr: () => import('./i18n/fr').then((m) => m.content),
11
+ de: () => import('./i18n/de').then((m) => m.content),
12
+ it: () => import('./i18n/it').then((m) => m.content),
13
+ pt: () => import('./i18n/pt').then((m) => m.content),
14
+ nl: () => import('./i18n/nl').then((m) => m.content),
15
+ pl: () => import('./i18n/pl').then((m) => m.content),
16
+ tr: () => import('./i18n/tr').then((m) => m.content),
17
+ id: () => import('./i18n/id').then((m) => m.content),
18
+ sv: () => import('./i18n/sv').then((m) => m.content),
19
+ ru: () => import('./i18n/ru').then((m) => m.content),
20
+ ja: () => import('./i18n/ja').then((m) => m.content),
21
+ ko: () => import('./i18n/ko').then((m) => m.content),
22
+ zh: () => import('./i18n/zh').then((m) => m.content),
23
+ },
24
+ };