@jjlmoya/utils-tools 1.9.0 → 1.11.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 (34) hide show
  1. package/package.json +5 -3
  2. package/scripts/postinstall.mjs +27 -0
  3. package/src/tool/date-diff-calculator/component.astro +0 -200
  4. package/src/tool/date-diff-calculator/date-difference-calculator.css +198 -0
  5. package/src/tool/drive-direct-link/component.astro +0 -173
  6. package/src/tool/drive-direct-link/google-drive-direct-download-link.css +171 -0
  7. package/src/tool/email-list-cleaner/component.astro +0 -204
  8. package/src/tool/email-list-cleaner/email-list-cleaner.css +202 -0
  9. package/src/tool/env-badge-spain/component.astro +0 -156
  10. package/src/tool/env-badge-spain/components/BadgeForm.astro +0 -151
  11. package/src/tool/env-badge-spain/components/BadgeResult.astro +0 -101
  12. package/src/tool/env-badge-spain/environmental-badge-simulator-spain.css +405 -0
  13. package/src/tool/morse-beacon/component.astro +0 -298
  14. package/src/tool/morse-beacon/morse-beacon.css +296 -0
  15. package/src/tool/password-generator/component.astro +0 -88
  16. package/src/tool/password-generator/components/Config.astro +0 -170
  17. package/src/tool/password-generator/components/Display.astro +0 -117
  18. package/src/tool/password-generator/components/Strength.astro +0 -52
  19. package/src/tool/password-generator/password-generator.css +424 -0
  20. package/src/tool/routes/component.astro +0 -254
  21. package/src/tool/routes/optimal-routes.css +252 -0
  22. package/src/tool/rule-of-three/component.astro +0 -249
  23. package/src/tool/rule-of-three/rule-of-three.css +247 -0
  24. package/src/tool/seo-content-optimizer/component.astro +0 -278
  25. package/src/tool/seo-content-optimizer/seo-content-optimizer.css +276 -0
  26. package/src/tool/speed-reader/component.astro +0 -400
  27. package/src/tool/speed-reader/speed-reader.css +398 -0
  28. package/src/tool/text-pixel-calculator/component.astro +0 -96
  29. package/src/tool/text-pixel-calculator/components/Editor.astro +0 -145
  30. package/src/tool/text-pixel-calculator/components/Preview.astro +0 -115
  31. package/src/tool/text-pixel-calculator/components/Stats.astro +0 -62
  32. package/src/tool/text-pixel-calculator/text-pixel-width-calculator.css +407 -0
  33. package/src/tool/whatsapp-link/component.astro +0 -264
  34. package/src/tool/whatsapp-link/whatsapp-link-generator.css +262 -0
@@ -0,0 +1,247 @@
1
+ .rot-root {
2
+ --rot-accent: #7c3aed;
3
+ --rot-accent-light: #8b5cf6;
4
+ --rot-purple: #9333ea;
5
+ --rot-result: #2563eb;
6
+ --rot-result-bg: #eff6ff;
7
+ --rot-result-border: #bfdbfe;
8
+ --rot-result-label: #2563eb;
9
+ --rot-field-bg: #f8fafc;
10
+ --rot-field-border: #e2e8f0;
11
+ --rot-field-hover: #bfdbfe;
12
+ --rot-field-hover-purple: #e9d5ff;
13
+ --rot-card-bg: rgba(255, 255, 255, 0.8);
14
+ --rot-card-border: rgba(255, 255, 255, 0.2);
15
+ --rot-text-main: #334155;
16
+ --rot-text-label: #64748b;
17
+ --rot-text-hint: #94a3b8;
18
+ --rot-formula-bg: #f1f5f9;
19
+ --rot-formula-text: #64748b;
20
+ --rot-sep-color: #cbd5e1;
21
+ }
22
+
23
+ :global(.theme-dark) .rot-root {
24
+ --rot-result-bg: rgba(37, 99, 235, 0.2);
25
+ --rot-result-border: rgba(37, 99, 235, 0.3);
26
+ --rot-result-label: #60a5fa;
27
+ --rot-result: #60a5fa;
28
+ --rot-field-bg: rgba(30, 41, 59, 0.5);
29
+ --rot-field-border: #334155;
30
+ --rot-field-hover: rgba(37, 99, 235, 0.3);
31
+ --rot-field-hover-purple: rgba(147, 51, 234, 0.3);
32
+ --rot-card-bg: rgba(15, 23, 42, 0.8);
33
+ --rot-card-border: rgba(51, 65, 85, 0.3);
34
+ --rot-text-main: #e2e8f0;
35
+ --rot-text-label: #94a3b8;
36
+ --rot-text-hint: #64748b;
37
+ --rot-formula-bg: #1e293b;
38
+ --rot-formula-text: #94a3b8;
39
+ --rot-sep-color: #475569;
40
+ }
41
+
42
+ .rot-card {
43
+ width: 100%;
44
+ max-width: 56rem;
45
+ margin: 0 auto;
46
+ background: var(--rot-card-bg);
47
+ border: 1px solid var(--rot-card-border);
48
+ border-radius: 1.5rem;
49
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.08);
50
+ padding: 2rem;
51
+ display: flex;
52
+ flex-direction: column;
53
+ gap: 3rem;
54
+ }
55
+
56
+ @media (min-width: 768px) {
57
+ .rot-card { padding: 3rem; }
58
+ }
59
+
60
+ .rot-grid {
61
+ display: flex;
62
+ flex-direction: column;
63
+ gap: 1.5rem;
64
+ }
65
+
66
+ .rot-row {
67
+ display: grid;
68
+ grid-template-columns: 1fr;
69
+ gap: 1.5rem;
70
+ align-items: center;
71
+ }
72
+
73
+ @media (min-width: 768px) {
74
+ .rot-row { grid-template-columns: 1fr auto 1fr; }
75
+ }
76
+
77
+ .rot-field {
78
+ background: var(--rot-field-bg);
79
+ border: 2px solid var(--rot-field-border);
80
+ border-radius: 1rem;
81
+ padding: 1.5rem;
82
+ transition: border-color 0.2s;
83
+ }
84
+
85
+ .rot-field:focus-within {
86
+ border-color: var(--rot-field-hover);
87
+ }
88
+
89
+ .rot-field-result {
90
+ background: var(--rot-result-bg);
91
+ border-color: var(--rot-result-border);
92
+ box-shadow: 0 10px 15px -3px rgba(37, 99, 235, 0.05);
93
+ }
94
+
95
+ .rot-label {
96
+ display: block;
97
+ font-size: 0.75rem;
98
+ font-weight: 700;
99
+ color: var(--rot-text-label);
100
+ text-transform: uppercase;
101
+ letter-spacing: 0.05em;
102
+ margin-bottom: 0.5rem;
103
+ }
104
+
105
+ .rot-label-result {
106
+ color: var(--rot-result-label);
107
+ }
108
+
109
+ .rot-input {
110
+ width: 100%;
111
+ text-align: center;
112
+ font-size: 1.875rem;
113
+ font-weight: 700;
114
+ background: transparent;
115
+ border: none;
116
+ outline: none;
117
+ color: var(--rot-text-main);
118
+ }
119
+
120
+ .rot-input::placeholder {
121
+ color: var(--rot-text-hint);
122
+ }
123
+
124
+ .rot-input-purple:focus {
125
+ color: var(--rot-purple);
126
+ }
127
+
128
+ .rot-input-result {
129
+ font-size: 2.25rem;
130
+ font-weight: 900;
131
+ color: var(--rot-result);
132
+ cursor: default;
133
+ }
134
+
135
+ .rot-input-result::placeholder {
136
+ color: var(--rot-result-border);
137
+ }
138
+
139
+ input[type="number"]::-webkit-inner-spin-button,
140
+ input[type="number"]::-webkit-outer-spin-button {
141
+ -webkit-appearance: none;
142
+ margin: 0;
143
+ }
144
+
145
+ input[type="number"] {
146
+ -moz-appearance: textfield;
147
+ }
148
+
149
+ .rot-hint {
150
+ font-size: 0.75rem;
151
+ text-align: center;
152
+ color: var(--rot-text-hint);
153
+ margin-top: 0.5rem;
154
+ }
155
+
156
+ .rot-hint-result {
157
+ color: rgba(37, 99, 235, 0.5);
158
+ }
159
+
160
+ .rot-result-row {
161
+ position: relative;
162
+ display: flex;
163
+ align-items: center;
164
+ }
165
+
166
+ .rot-copy-btn {
167
+ position: absolute;
168
+ right: 0;
169
+ top: 50%;
170
+ transform: translateY(-50%);
171
+ padding: 0.5rem;
172
+ background: none;
173
+ border: none;
174
+ cursor: pointer;
175
+ color: var(--rot-result);
176
+ opacity: 0.5;
177
+ transition: opacity 0.15s;
178
+ }
179
+
180
+ .rot-copy-btn:hover {
181
+ opacity: 1;
182
+ }
183
+
184
+ .rot-separator {
185
+ display: flex;
186
+ align-items: center;
187
+ justify-content: center;
188
+ gap: 0.5rem;
189
+ color: var(--rot-sep-color);
190
+ padding: 0.5rem 0;
191
+ }
192
+
193
+ .rot-sep-line {
194
+ height: 1px;
195
+ width: 1rem;
196
+ background: currentcolor;
197
+ display: none;
198
+ }
199
+
200
+ @media (min-width: 768px) {
201
+ .rot-sep-line { display: block; }
202
+ }
203
+
204
+ .rot-sep-text {
205
+ font-size: 0.875rem;
206
+ font-weight: 500;
207
+ text-transform: uppercase;
208
+ }
209
+
210
+ .rot-formula {
211
+ display: inline-block;
212
+ padding: 0.75rem 1.5rem;
213
+ background: var(--rot-formula-bg);
214
+ border-radius: 0.75rem;
215
+ font-size: 0.9rem;
216
+ color: var(--rot-formula-text);
217
+ text-align: center;
218
+ width: 100%;
219
+ }
220
+
221
+ .rot-formula-a {
222
+ font-weight: 700;
223
+ color: var(--rot-text-main);
224
+ }
225
+
226
+ .rot-formula-b {
227
+ font-weight: 700;
228
+ color: var(--rot-text-main);
229
+ }
230
+
231
+ .rot-formula-c {
232
+ font-weight: 700;
233
+ color: var(--rot-purple);
234
+ }
235
+
236
+ .rot-formula-x {
237
+ font-weight: 700;
238
+ color: var(--rot-result);
239
+ }
240
+
241
+ @keyframes rot-pop {
242
+ 0% { transform: scale(1); }
243
+ 50% { transform: scale(1.05); }
244
+ 100% { transform: scale(1); }
245
+ }
246
+
247
+ :global(.rot-pop) { animation: rot-pop 0.2s ease; }
@@ -87,284 +87,6 @@ const t = (ui ?? {}) as SeoContentOptimizerUI;
87
87
  </div>
88
88
  </div>
89
89
 
90
- <style>
91
- .sco-root {
92
- --sco-blue: #3b82f6;
93
- --sco-green: #10b981;
94
- --sco-red: #ef4444;
95
- --sco-muted: #64748b;
96
- --sco-tab-bg: rgba(255, 255, 255, 0.5);
97
- --sco-tab-active-bg: #fff;
98
- --sco-tab-active-color: #3b82f6;
99
- --sco-card-bg: rgba(255, 255, 255, 0.7);
100
- --sco-card-border: rgba(255, 255, 255, 0.3);
101
- --sco-textarea-color: #1e293b;
102
- --sco-stat-bg: #f8fafc;
103
- --sco-stat-border: rgba(0, 0, 0, 0.05);
104
- --sco-panel-bg: #fff;
105
- --sco-panel-border: #e2e8f0;
106
- --sco-check-bg: #f8fafc;
107
- --sco-keyword-bg: #f1f5f9;
108
- --sco-keyword-name: #1e293b;
109
- --sco-tech-border: #f1f5f9;
110
-
111
- width: 100%;
112
- max-width: 1200px;
113
- margin: 0 auto;
114
- display: flex;
115
- flex-direction: column;
116
- gap: 2rem;
117
- }
118
-
119
- :global(.theme-dark) .sco-root {
120
- --sco-tab-bg: rgba(15, 23, 42, 0.5);
121
- --sco-tab-active-bg: #1e293b;
122
- --sco-tab-active-color: #60a5fa;
123
- --sco-card-bg: rgba(15, 23, 42, 0.6);
124
- --sco-card-border: rgba(255, 255, 255, 0.05);
125
- --sco-textarea-color: #f1f5f9;
126
- --sco-stat-bg: #1e293b;
127
- --sco-stat-border: rgba(255, 255, 255, 0.05);
128
- --sco-panel-bg: #0f172a;
129
- --sco-panel-border: #1e293b;
130
- --sco-check-bg: #1e293b;
131
- --sco-keyword-bg: #0f172a;
132
- --sco-keyword-name: #f1f5f9;
133
- --sco-tech-border: #1e293b;
134
- }
135
-
136
- .sco-tabs {
137
- display: flex;
138
- gap: 1rem;
139
- background: var(--sco-tab-bg);
140
- backdrop-filter: blur(10px);
141
- padding: 0.5rem;
142
- border-radius: 1rem;
143
- width: fit-content;
144
- }
145
-
146
- .sco-tab {
147
- padding: 0.75rem 1.5rem;
148
- border-radius: 0.75rem;
149
- font-weight: 700;
150
- font-size: 0.9rem;
151
- cursor: pointer;
152
- border: none;
153
- transition: background 0.2s, color 0.2s;
154
- background: transparent;
155
- color: var(--sco-muted);
156
- }
157
-
158
- .sco-tab.active {
159
- background: var(--sco-tab-active-bg);
160
- color: var(--sco-tab-active-color);
161
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.05);
162
- }
163
-
164
- .sco-grid {
165
- display: grid;
166
- grid-template-columns: 1fr;
167
- gap: 1.5rem;
168
- }
169
-
170
- @media (min-width: 1024px) {
171
- .sco-grid {
172
- grid-template-columns: 1.5fr 1fr;
173
- }
174
- }
175
-
176
- .sco-input-card {
177
- background: var(--sco-card-bg);
178
- backdrop-filter: blur(20px);
179
- border: 1px solid var(--sco-card-border);
180
- border-radius: 1.5rem;
181
- padding: 1.5rem;
182
- box-shadow: 0 20px 40px rgba(0, 0, 0, 0.05);
183
- }
184
-
185
- .sco-textarea {
186
- width: 100%;
187
- min-height: 450px;
188
- background: transparent;
189
- border: none;
190
- resize: none;
191
- font-size: 1.1rem;
192
- line-height: 1.6;
193
- color: var(--sco-textarea-color);
194
- box-sizing: border-box;
195
- }
196
-
197
- .sco-textarea:focus {
198
- outline: none;
199
- }
200
-
201
- .sco-stats {
202
- display: grid;
203
- grid-template-columns: repeat(4, 1fr);
204
- gap: 1rem;
205
- margin-top: 1.5rem;
206
- padding-top: 1.5rem;
207
- border-top: 1px solid var(--sco-stat-border);
208
- }
209
-
210
- @media (max-width: 480px) {
211
- .sco-stats {
212
- grid-template-columns: repeat(2, 1fr);
213
- }
214
- }
215
-
216
- .sco-stat {
217
- text-align: center;
218
- padding: 1rem;
219
- background: var(--sco-stat-bg);
220
- border-radius: 1rem;
221
- }
222
-
223
- .sco-stat-value {
224
- display: block;
225
- font-size: 1.5rem;
226
- font-weight: 800;
227
- color: var(--sco-blue);
228
- }
229
-
230
- .sco-stat-label {
231
- font-size: 0.75rem;
232
- font-weight: 700;
233
- color: var(--sco-muted);
234
- text-transform: uppercase;
235
- }
236
-
237
- .sco-panels {
238
- display: flex;
239
- flex-direction: column;
240
- gap: 1.5rem;
241
- }
242
-
243
- .sco-panel {
244
- background: var(--sco-panel-bg);
245
- border: 1px solid var(--sco-panel-border);
246
- border-radius: 1.25rem;
247
- padding: 1.5rem;
248
- }
249
-
250
- .sco-panel-title {
251
- font-size: 0.875rem;
252
- font-weight: 800;
253
- margin: 0 0 1.25rem;
254
- text-transform: uppercase;
255
- letter-spacing: 0.05em;
256
- color: var(--sco-muted);
257
- }
258
-
259
- .sco-checklist {
260
- display: flex;
261
- flex-direction: column;
262
- gap: 0.75rem;
263
- }
264
-
265
- :global(.sco-check-item) {
266
- display: flex;
267
- gap: 0.75rem;
268
- align-items: flex-start;
269
- padding: 0.75rem;
270
- border-radius: 0.75rem;
271
- background: var(--sco-check-bg, #f8fafc);
272
- font-size: 0.85rem;
273
- font-weight: 500;
274
- color: inherit;
275
- }
276
-
277
- :global(.sco-check-status) {
278
- width: 20px;
279
- height: 20px;
280
- border-radius: 50%;
281
- flex-shrink: 0;
282
- display: flex;
283
- align-items: center;
284
- justify-content: center;
285
- font-size: 0.7rem;
286
- font-weight: 900;
287
- }
288
-
289
- :global(.sco-success) {
290
- background: #dcfce7;
291
- color: #15803d;
292
- }
293
-
294
- :global(.sco-warning) {
295
- background: #fef9c3;
296
- color: #a16207;
297
- }
298
-
299
- :global(.sco-error) {
300
- background: #fee2e2;
301
- color: #b91c1c;
302
- }
303
-
304
- .sco-keywords {
305
- display: flex;
306
- flex-direction: column;
307
- gap: 0.5rem;
308
- }
309
-
310
- :global(.sco-keyword-item) {
311
- display: flex;
312
- justify-content: space-between;
313
- padding: 0.5rem 0.75rem;
314
- background: var(--sco-keyword-bg, #f1f5f9);
315
- border-radius: 0.5rem;
316
- font-size: 0.9rem;
317
- }
318
-
319
- :global(.sco-keyword-name) {
320
- font-weight: 600;
321
- color: var(--sco-keyword-name, #1e293b);
322
- }
323
-
324
- :global(.sco-keyword-count) {
325
- font-weight: 700;
326
- }
327
-
328
- .sco-empty {
329
- font-size: 0.875rem;
330
- color: var(--sco-muted);
331
- text-align: center;
332
- padding: 0.5rem;
333
- }
334
-
335
- :global(.sco-empty-injected) {
336
- font-size: 0.875rem;
337
- color: var(--sco-muted, #64748b);
338
- text-align: center;
339
- padding: 0.5rem;
340
- }
341
-
342
- .sco-tech-stats {
343
- display: flex;
344
- flex-direction: column;
345
- gap: 1.25rem;
346
- }
347
-
348
- .sco-tech-stat {
349
- display: flex;
350
- justify-content: space-between;
351
- align-items: center;
352
- padding-bottom: 0.75rem;
353
- border-bottom: 1px solid var(--sco-tech-border);
354
- }
355
-
356
- .sco-tech-label {
357
- font-size: 0.8rem;
358
- font-weight: 700;
359
- color: var(--sco-muted);
360
- }
361
-
362
- .sco-tech-value {
363
- font-size: 0.8rem;
364
- font-weight: 600;
365
- color: var(--sco-blue);
366
- }
367
- </style>
368
90
 
369
91
  <script>
370
92
  import type { SeoContentOptimizerUI } from './ui';