@jjlmoya/utils-tools 1.9.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 (26) 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/environmental-badge-simulator-spain.css +154 -0
  11. package/src/tool/morse-beacon/component.astro +0 -298
  12. package/src/tool/morse-beacon/morse-beacon.css +296 -0
  13. package/src/tool/password-generator/component.astro +0 -88
  14. package/src/tool/password-generator/password-generator.css +86 -0
  15. package/src/tool/routes/component.astro +0 -254
  16. package/src/tool/routes/optimal-routes.css +252 -0
  17. package/src/tool/rule-of-three/component.astro +0 -249
  18. package/src/tool/rule-of-three/rule-of-three.css +247 -0
  19. package/src/tool/seo-content-optimizer/component.astro +0 -278
  20. package/src/tool/seo-content-optimizer/seo-content-optimizer.css +276 -0
  21. package/src/tool/speed-reader/component.astro +0 -400
  22. package/src/tool/speed-reader/speed-reader.css +398 -0
  23. package/src/tool/text-pixel-calculator/component.astro +0 -96
  24. package/src/tool/text-pixel-calculator/text-pixel-width-calculator.css +94 -0
  25. package/src/tool/whatsapp-link/component.astro +0 -264
  26. package/src/tool/whatsapp-link/whatsapp-link-generator.css +262 -0
@@ -102,270 +102,6 @@ const t = (ui ?? {}) as WhatsappLinkUI;
102
102
  </div>
103
103
  </div>
104
104
 
105
- <style>
106
- .wl-root {
107
- --wl-green: #25d366;
108
- --wl-green-dark: #128c7e;
109
- --wl-green-hover: #1da851;
110
- --wl-green-focus: rgba(37, 211, 102, 0.15);
111
- --wl-panel-bg: #fff;
112
- --wl-panel-border: #e2e8f0;
113
- --wl-field-bg: #f8fafc;
114
- --wl-field-border: #e2e8f0;
115
- --wl-field-focus: #25d366;
116
- --wl-text-main: #1e293b;
117
- --wl-text-label: #475569;
118
- --wl-text-hint: #94a3b8;
119
- --wl-text-error: #ef4444;
120
- --wl-result-bg: #f0fdf4;
121
- --wl-result-border: #bbf7d0;
122
- --wl-link-color: #065f46;
123
- --wl-action-bg: #fff;
124
- --wl-action-border: #d1fae5;
125
- --wl-action-color: #059669;
126
- --wl-action-hover: #d1fae5;
127
- --wl-btn-shadow: rgba(37, 211, 102, 0.35);
128
-
129
- width: 100%;
130
- max-width: 42rem;
131
- margin: 0 auto;
132
- display: flex;
133
- flex-direction: column;
134
- gap: 1.25rem;
135
- }
136
-
137
- :global(.theme-dark) .wl-root {
138
- --wl-panel-bg: #0f172a;
139
- --wl-panel-border: #1e293b;
140
- --wl-field-bg: rgba(30, 41, 59, 0.5);
141
- --wl-field-border: #334155;
142
- --wl-text-main: #e2e8f0;
143
- --wl-text-label: #94a3b8;
144
- --wl-text-hint: #64748b;
145
- --wl-result-bg: rgba(6, 78, 59, 0.2);
146
- --wl-result-border: #065f46;
147
- --wl-link-color: #6ee7b7;
148
- --wl-action-bg: rgba(6, 78, 59, 0.3);
149
- --wl-action-border: #065f46;
150
- --wl-action-color: #34d399;
151
- --wl-action-hover: rgba(6, 78, 59, 0.5);
152
- }
153
-
154
- .wl-form {
155
- background: var(--wl-panel-bg);
156
- border: 1px solid var(--wl-panel-border);
157
- border-radius: 1.25rem;
158
- padding: 1.5rem;
159
- display: flex;
160
- flex-direction: column;
161
- gap: 1.25rem;
162
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.04);
163
- }
164
-
165
- .wl-field {
166
- display: flex;
167
- flex-direction: column;
168
- gap: 0.5rem;
169
- }
170
-
171
- .wl-label {
172
- font-size: 0.875rem;
173
- font-weight: 700;
174
- color: var(--wl-text-label);
175
- letter-spacing: 0.02em;
176
- }
177
-
178
- .wl-phone-row {
179
- display: flex;
180
- gap: 0.5rem;
181
- }
182
-
183
- .wl-prefix-select {
184
- flex-shrink: 0;
185
- width: 7.5rem;
186
- background: var(--wl-field-bg);
187
- border: 1px solid var(--wl-field-border);
188
- border-radius: 0.75rem;
189
- padding: 0.75rem 0.625rem;
190
- font-size: 0.875rem;
191
- color: var(--wl-text-main);
192
- outline: none;
193
- cursor: pointer;
194
- transition: border-color 0.2s;
195
- }
196
-
197
- .wl-prefix-select:focus {
198
- border-color: var(--wl-field-focus);
199
- box-shadow: 0 0 0 3px var(--wl-green-focus);
200
- }
201
-
202
- .wl-phone-input {
203
- flex: 1;
204
- background: var(--wl-field-bg);
205
- border: 1px solid var(--wl-field-border);
206
- border-radius: 0.75rem;
207
- padding: 0.75rem 1rem;
208
- font-size: 0.875rem;
209
- color: var(--wl-text-main);
210
- outline: none;
211
- transition: border-color 0.2s;
212
- }
213
-
214
- .wl-phone-input::placeholder {
215
- color: var(--wl-text-hint);
216
- }
217
-
218
- .wl-phone-input:focus {
219
- border-color: var(--wl-field-focus);
220
- box-shadow: 0 0 0 3px var(--wl-green-focus);
221
- }
222
-
223
- .wl-error {
224
- font-size: 0.8rem;
225
- color: var(--wl-text-error);
226
- min-height: 1.1rem;
227
- }
228
-
229
- .wl-textarea {
230
- width: 100%;
231
- background: var(--wl-field-bg);
232
- border: 1px solid var(--wl-field-border);
233
- border-radius: 0.75rem;
234
- padding: 0.75rem 1rem;
235
- font-size: 0.875rem;
236
- color: var(--wl-text-main);
237
- line-height: 1.6;
238
- resize: vertical;
239
- outline: none;
240
- transition: border-color 0.2s;
241
- box-sizing: border-box;
242
- }
243
-
244
- .wl-textarea::placeholder {
245
- color: var(--wl-text-hint);
246
- }
247
-
248
- .wl-textarea:focus {
249
- border-color: var(--wl-field-focus);
250
- box-shadow: 0 0 0 3px var(--wl-green-focus);
251
- }
252
-
253
- .wl-generate-btn {
254
- display: flex;
255
- align-items: center;
256
- justify-content: center;
257
- gap: 0.625rem;
258
- width: 100%;
259
- background: var(--wl-green);
260
- color: #fff;
261
- border: none;
262
- border-radius: 0.875rem;
263
- padding: 0.875rem 1.5rem;
264
- font-size: 1rem;
265
- font-weight: 700;
266
- cursor: pointer;
267
- box-shadow: 0 4px 14px var(--wl-btn-shadow);
268
- transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
269
- }
270
-
271
- .wl-generate-btn:hover {
272
- background: var(--wl-green-hover);
273
- transform: translateY(-1px);
274
- box-shadow: 0 6px 20px var(--wl-btn-shadow);
275
- }
276
-
277
- .wl-generate-btn:active {
278
- transform: translateY(0);
279
- }
280
-
281
- .wl-btn-icon {
282
- width: 1.25rem;
283
- height: 1.25rem;
284
- flex-shrink: 0;
285
- }
286
-
287
- .wl-result {
288
- background: var(--wl-result-bg);
289
- border: 1px solid var(--wl-result-border);
290
- border-radius: 1.25rem;
291
- padding: 1.25rem 1.5rem;
292
- display: flex;
293
- flex-direction: column;
294
- gap: 0.75rem;
295
- }
296
-
297
- .wl-result-label {
298
- font-size: 0.75rem;
299
- font-weight: 700;
300
- text-transform: uppercase;
301
- letter-spacing: 0.08em;
302
- color: var(--wl-green-dark);
303
- }
304
-
305
- :global(.theme-dark) .wl-result-label {
306
- color: var(--wl-green);
307
- }
308
-
309
- .wl-result-row {
310
- display: flex;
311
- align-items: center;
312
- gap: 0.625rem;
313
- }
314
-
315
- .wl-link-display {
316
- flex: 1;
317
- font-size: 0.8rem;
318
- font-weight: 500;
319
- color: var(--wl-link-color);
320
- word-break: break-all;
321
- line-height: 1.5;
322
- padding: 0.5rem 0;
323
- }
324
-
325
- .wl-result-actions {
326
- display: flex;
327
- gap: 0.5rem;
328
- flex-shrink: 0;
329
- }
330
-
331
- .wl-action-btn {
332
- display: flex;
333
- align-items: center;
334
- justify-content: center;
335
- width: 2.5rem;
336
- height: 2.5rem;
337
- background: var(--wl-action-bg);
338
- border: 1px solid var(--wl-action-border);
339
- border-radius: 0.625rem;
340
- color: var(--wl-action-color);
341
- cursor: pointer;
342
- text-decoration: none;
343
- transition: background 0.15s, transform 0.15s;
344
- flex-shrink: 0;
345
- }
346
-
347
- .wl-action-btn:hover {
348
- background: var(--wl-action-hover);
349
- transform: scale(1.05);
350
- }
351
-
352
- .wl-action-btn svg {
353
- width: 1.125rem;
354
- height: 1.125rem;
355
- }
356
-
357
- .wl-qr-wrap {
358
- display: flex;
359
- justify-content: center;
360
- padding-top: 0.75rem;
361
- border-top: 1px solid var(--wl-result-border);
362
- }
363
-
364
- .wl-qr-canvas {
365
- border-radius: 0.75rem;
366
- box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
367
- }
368
- </style>
369
105
 
370
106
  <script>
371
107
  import type { WhatsappLinkUI } from './ui';
@@ -0,0 +1,262 @@
1
+ .wl-root {
2
+ --wl-green: #25d366;
3
+ --wl-green-dark: #128c7e;
4
+ --wl-green-hover: #1da851;
5
+ --wl-green-focus: rgba(37, 211, 102, 0.15);
6
+ --wl-panel-bg: #fff;
7
+ --wl-panel-border: #e2e8f0;
8
+ --wl-field-bg: #f8fafc;
9
+ --wl-field-border: #e2e8f0;
10
+ --wl-field-focus: #25d366;
11
+ --wl-text-main: #1e293b;
12
+ --wl-text-label: #475569;
13
+ --wl-text-hint: #94a3b8;
14
+ --wl-text-error: #ef4444;
15
+ --wl-result-bg: #f0fdf4;
16
+ --wl-result-border: #bbf7d0;
17
+ --wl-link-color: #065f46;
18
+ --wl-action-bg: #fff;
19
+ --wl-action-border: #d1fae5;
20
+ --wl-action-color: #059669;
21
+ --wl-action-hover: #d1fae5;
22
+ --wl-btn-shadow: rgba(37, 211, 102, 0.35);
23
+
24
+ width: 100%;
25
+ max-width: 42rem;
26
+ margin: 0 auto;
27
+ display: flex;
28
+ flex-direction: column;
29
+ gap: 1.25rem;
30
+ }
31
+
32
+ :global(.theme-dark) .wl-root {
33
+ --wl-panel-bg: #0f172a;
34
+ --wl-panel-border: #1e293b;
35
+ --wl-field-bg: rgba(30, 41, 59, 0.5);
36
+ --wl-field-border: #334155;
37
+ --wl-text-main: #e2e8f0;
38
+ --wl-text-label: #94a3b8;
39
+ --wl-text-hint: #64748b;
40
+ --wl-result-bg: rgba(6, 78, 59, 0.2);
41
+ --wl-result-border: #065f46;
42
+ --wl-link-color: #6ee7b7;
43
+ --wl-action-bg: rgba(6, 78, 59, 0.3);
44
+ --wl-action-border: #065f46;
45
+ --wl-action-color: #34d399;
46
+ --wl-action-hover: rgba(6, 78, 59, 0.5);
47
+ }
48
+
49
+ .wl-form {
50
+ background: var(--wl-panel-bg);
51
+ border: 1px solid var(--wl-panel-border);
52
+ border-radius: 1.25rem;
53
+ padding: 1.5rem;
54
+ display: flex;
55
+ flex-direction: column;
56
+ gap: 1.25rem;
57
+ box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.04);
58
+ }
59
+
60
+ .wl-field {
61
+ display: flex;
62
+ flex-direction: column;
63
+ gap: 0.5rem;
64
+ }
65
+
66
+ .wl-label {
67
+ font-size: 0.875rem;
68
+ font-weight: 700;
69
+ color: var(--wl-text-label);
70
+ letter-spacing: 0.02em;
71
+ }
72
+
73
+ .wl-phone-row {
74
+ display: flex;
75
+ gap: 0.5rem;
76
+ }
77
+
78
+ .wl-prefix-select {
79
+ flex-shrink: 0;
80
+ width: 7.5rem;
81
+ background: var(--wl-field-bg);
82
+ border: 1px solid var(--wl-field-border);
83
+ border-radius: 0.75rem;
84
+ padding: 0.75rem 0.625rem;
85
+ font-size: 0.875rem;
86
+ color: var(--wl-text-main);
87
+ outline: none;
88
+ cursor: pointer;
89
+ transition: border-color 0.2s;
90
+ }
91
+
92
+ .wl-prefix-select:focus {
93
+ border-color: var(--wl-field-focus);
94
+ box-shadow: 0 0 0 3px var(--wl-green-focus);
95
+ }
96
+
97
+ .wl-phone-input {
98
+ flex: 1;
99
+ background: var(--wl-field-bg);
100
+ border: 1px solid var(--wl-field-border);
101
+ border-radius: 0.75rem;
102
+ padding: 0.75rem 1rem;
103
+ font-size: 0.875rem;
104
+ color: var(--wl-text-main);
105
+ outline: none;
106
+ transition: border-color 0.2s;
107
+ }
108
+
109
+ .wl-phone-input::placeholder {
110
+ color: var(--wl-text-hint);
111
+ }
112
+
113
+ .wl-phone-input:focus {
114
+ border-color: var(--wl-field-focus);
115
+ box-shadow: 0 0 0 3px var(--wl-green-focus);
116
+ }
117
+
118
+ .wl-error {
119
+ font-size: 0.8rem;
120
+ color: var(--wl-text-error);
121
+ min-height: 1.1rem;
122
+ }
123
+
124
+ .wl-textarea {
125
+ width: 100%;
126
+ background: var(--wl-field-bg);
127
+ border: 1px solid var(--wl-field-border);
128
+ border-radius: 0.75rem;
129
+ padding: 0.75rem 1rem;
130
+ font-size: 0.875rem;
131
+ color: var(--wl-text-main);
132
+ line-height: 1.6;
133
+ resize: vertical;
134
+ outline: none;
135
+ transition: border-color 0.2s;
136
+ box-sizing: border-box;
137
+ }
138
+
139
+ .wl-textarea::placeholder {
140
+ color: var(--wl-text-hint);
141
+ }
142
+
143
+ .wl-textarea:focus {
144
+ border-color: var(--wl-field-focus);
145
+ box-shadow: 0 0 0 3px var(--wl-green-focus);
146
+ }
147
+
148
+ .wl-generate-btn {
149
+ display: flex;
150
+ align-items: center;
151
+ justify-content: center;
152
+ gap: 0.625rem;
153
+ width: 100%;
154
+ background: var(--wl-green);
155
+ color: #fff;
156
+ border: none;
157
+ border-radius: 0.875rem;
158
+ padding: 0.875rem 1.5rem;
159
+ font-size: 1rem;
160
+ font-weight: 700;
161
+ cursor: pointer;
162
+ box-shadow: 0 4px 14px var(--wl-btn-shadow);
163
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
164
+ }
165
+
166
+ .wl-generate-btn:hover {
167
+ background: var(--wl-green-hover);
168
+ transform: translateY(-1px);
169
+ box-shadow: 0 6px 20px var(--wl-btn-shadow);
170
+ }
171
+
172
+ .wl-generate-btn:active {
173
+ transform: translateY(0);
174
+ }
175
+
176
+ .wl-btn-icon {
177
+ width: 1.25rem;
178
+ height: 1.25rem;
179
+ flex-shrink: 0;
180
+ }
181
+
182
+ .wl-result {
183
+ background: var(--wl-result-bg);
184
+ border: 1px solid var(--wl-result-border);
185
+ border-radius: 1.25rem;
186
+ padding: 1.25rem 1.5rem;
187
+ display: flex;
188
+ flex-direction: column;
189
+ gap: 0.75rem;
190
+ }
191
+
192
+ .wl-result-label {
193
+ font-size: 0.75rem;
194
+ font-weight: 700;
195
+ text-transform: uppercase;
196
+ letter-spacing: 0.08em;
197
+ color: var(--wl-green-dark);
198
+ }
199
+
200
+ :global(.theme-dark) .wl-result-label {
201
+ color: var(--wl-green);
202
+ }
203
+
204
+ .wl-result-row {
205
+ display: flex;
206
+ align-items: center;
207
+ gap: 0.625rem;
208
+ }
209
+
210
+ .wl-link-display {
211
+ flex: 1;
212
+ font-size: 0.8rem;
213
+ font-weight: 500;
214
+ color: var(--wl-link-color);
215
+ word-break: break-all;
216
+ line-height: 1.5;
217
+ padding: 0.5rem 0;
218
+ }
219
+
220
+ .wl-result-actions {
221
+ display: flex;
222
+ gap: 0.5rem;
223
+ flex-shrink: 0;
224
+ }
225
+
226
+ .wl-action-btn {
227
+ display: flex;
228
+ align-items: center;
229
+ justify-content: center;
230
+ width: 2.5rem;
231
+ height: 2.5rem;
232
+ background: var(--wl-action-bg);
233
+ border: 1px solid var(--wl-action-border);
234
+ border-radius: 0.625rem;
235
+ color: var(--wl-action-color);
236
+ cursor: pointer;
237
+ text-decoration: none;
238
+ transition: background 0.15s, transform 0.15s;
239
+ flex-shrink: 0;
240
+ }
241
+
242
+ .wl-action-btn:hover {
243
+ background: var(--wl-action-hover);
244
+ transform: scale(1.05);
245
+ }
246
+
247
+ .wl-action-btn svg {
248
+ width: 1.125rem;
249
+ height: 1.125rem;
250
+ }
251
+
252
+ .wl-qr-wrap {
253
+ display: flex;
254
+ justify-content: center;
255
+ padding-top: 0.75rem;
256
+ border-top: 1px solid var(--wl-result-border);
257
+ }
258
+
259
+ .wl-qr-canvas {
260
+ border-radius: 0.75rem;
261
+ box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
262
+ }