@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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jjlmoya/utils-tools",
3
- "version": "1.9.0",
3
+ "version": "1.11.0",
4
4
  "type": "module",
5
5
  "main": "./src/index.ts",
6
6
  "types": "./src/index.ts",
@@ -10,7 +10,8 @@
10
10
  "./entries": "./src/entries.ts"
11
11
  },
12
12
  "files": [
13
- "src"
13
+ "src",
14
+ "scripts"
14
15
  ],
15
16
  "publishConfig": {
16
17
  "access": "public"
@@ -29,7 +30,8 @@
29
30
  "postversion": "git push && git push --tags",
30
31
  "patch": "npm version patch",
31
32
  "minor": "npm version minor",
32
- "major": "npm version major"
33
+ "major": "npm version major",
34
+ "postinstall": "node scripts/postinstall.mjs"
33
35
  },
34
36
  "lint-staged": {
35
37
  "*.{ts,tsx,astro}": [
@@ -0,0 +1,27 @@
1
+ import { readFileSync, writeFileSync, mkdirSync, readdirSync } from 'fs';
2
+ import { join, dirname } from 'path';
3
+ import { fileURLToPath } from 'url';
4
+
5
+ const libDir = dirname(fileURLToPath(import.meta.url));
6
+ const toolsDir = join(libDir, '../src/tool');
7
+
8
+ const inNodeModules = libDir.includes('node_modules');
9
+ if (!inNodeModules) process.exit(0);
10
+
11
+ const projectRoot = join(libDir, '../../../..');
12
+ const categoryKey = JSON.parse(readFileSync(join(libDir, '../package.json'), 'utf8')).name.replace('@jjlmoya/utils-', '');
13
+ const destDir = join(projectRoot, `public/styles/lib/${categoryKey}`);
14
+
15
+ mkdirSync(destDir, { recursive: true });
16
+
17
+ const tools = readdirSync(toolsDir, { withFileTypes: true }).filter(d => d.isDirectory());
18
+ for (const tool of tools) {
19
+ const toolDir = join(toolsDir, tool.name);
20
+ let files;
21
+ try { files = readdirSync(toolDir).filter(f => f.endsWith('.css')); }
22
+ catch { continue; }
23
+ for (const file of files) {
24
+ writeFileSync(join(destDir, file), readFileSync(join(toolDir, file)));
25
+ console.log(`[@jjlmoya/utils-${categoryKey}] copied ${file}`);
26
+ }
27
+ }
@@ -73,206 +73,6 @@ const t = (ui ?? {}) as DateDiffCalculatorUI;
73
73
  </div>
74
74
  </div>
75
75
 
76
- <style>
77
- .dd-root {
78
- --dd-indigo: #6366f1;
79
- --dd-indigo-dark: #4f46e5;
80
- --dd-rose: #f43f5e;
81
- --dd-card-bg: #fff;
82
- --dd-card-border: rgba(0, 0, 0, 0.05);
83
- --dd-field-bg: #f8fafc;
84
- --dd-field-border: #e2e8f0;
85
- --dd-text-main: #1e293b;
86
- --dd-text-label: #64748b;
87
- --dd-result-bg: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);
88
- --dd-result-text: #fff;
89
- --dd-quick-bg: #f1f5f9;
90
- --dd-quick-color: #475569;
91
-
92
- width: 100%;
93
- max-width: 860px;
94
- margin: 0 auto;
95
- }
96
-
97
- :global(.theme-dark) .dd-root {
98
- --dd-card-bg: #1e293b;
99
- --dd-card-border: rgba(255, 255, 255, 0.05);
100
- --dd-field-bg: #0f172a;
101
- --dd-field-border: #334155;
102
- --dd-text-main: #f1f5f9;
103
- --dd-text-label: #94a3b8;
104
- --dd-quick-bg: #334155;
105
- --dd-quick-color: #e2e8f0;
106
- }
107
-
108
- .dd-card {
109
- background: var(--dd-card-bg);
110
- border: 1px solid var(--dd-card-border);
111
- border-radius: 2rem;
112
- padding: 2.5rem;
113
- box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.1);
114
- display: flex;
115
- flex-direction: column;
116
- gap: 2rem;
117
- }
118
-
119
- .dd-inputs {
120
- display: grid;
121
- grid-template-columns: 1fr 1fr;
122
- gap: 1.5rem;
123
- }
124
-
125
- .dd-field {
126
- display: flex;
127
- flex-direction: column;
128
- gap: 0.5rem;
129
- }
130
-
131
- .dd-label {
132
- font-size: 0.8125rem;
133
- font-weight: 600;
134
- color: var(--dd-text-label);
135
- text-transform: uppercase;
136
- letter-spacing: 0.05em;
137
- }
138
-
139
- .dd-input {
140
- background: var(--dd-field-bg);
141
- border: 1px solid var(--dd-field-border);
142
- border-radius: 0.75rem;
143
- padding: 0.75rem 1rem;
144
- color: var(--dd-text-main);
145
- font-size: 0.9375rem;
146
- outline: none;
147
- transition: border-color 0.2s;
148
- width: 100%;
149
- box-sizing: border-box;
150
- }
151
-
152
- .dd-input:focus {
153
- border-color: var(--dd-indigo);
154
- }
155
-
156
- .dd-quick {
157
- display: flex;
158
- gap: 0.5rem;
159
- }
160
-
161
- .dd-quick-btn {
162
- background: var(--dd-quick-bg);
163
- color: var(--dd-quick-color);
164
- border: none;
165
- border-radius: 0.5rem;
166
- padding: 0.375rem 0.75rem;
167
- font-size: 0.8125rem;
168
- font-weight: 600;
169
- cursor: pointer;
170
- transition: background 0.15s;
171
- }
172
-
173
- .dd-quick-btn:hover {
174
- background: var(--dd-indigo);
175
- color: #fff;
176
- }
177
-
178
- .dd-result {
179
- background: var(--dd-result-bg);
180
- border-radius: 1.5rem;
181
- padding: 2rem;
182
- display: flex;
183
- flex-direction: column;
184
- gap: 1.5rem;
185
- }
186
-
187
- .dd-result-header {
188
- text-align: center;
189
- }
190
-
191
- .dd-result-title {
192
- font-size: 0.875rem;
193
- font-weight: 700;
194
- color: rgba(255, 255, 255, 0.8);
195
- text-transform: uppercase;
196
- letter-spacing: 0.1em;
197
- }
198
-
199
- .dd-diff-grid {
200
- display: grid;
201
- grid-template-columns: repeat(4, 1fr);
202
- gap: 1rem;
203
- }
204
-
205
- .dd-diff-item {
206
- background: rgba(255, 255, 255, 0.15);
207
- border-radius: 1rem;
208
- padding: 1rem;
209
- display: flex;
210
- flex-direction: column;
211
- align-items: center;
212
- gap: 0.25rem;
213
- }
214
-
215
- .dd-diff-value {
216
- font-size: 2rem;
217
- font-weight: 800;
218
- color: var(--dd-result-text);
219
- line-height: 1;
220
- }
221
-
222
- .dd-diff-label {
223
- font-size: 0.75rem;
224
- font-weight: 600;
225
- color: rgba(255, 255, 255, 0.7);
226
- text-transform: uppercase;
227
- letter-spacing: 0.05em;
228
- }
229
-
230
- .dd-totals {
231
- display: grid;
232
- grid-template-columns: repeat(3, 1fr);
233
- gap: 1rem;
234
- }
235
-
236
- .dd-total-item {
237
- display: flex;
238
- flex-direction: column;
239
- align-items: center;
240
- gap: 0.2rem;
241
- }
242
-
243
- .dd-total-value {
244
- font-size: 1.125rem;
245
- font-weight: 700;
246
- color: var(--dd-result-text);
247
- }
248
-
249
- .dd-total-label {
250
- font-size: 0.6875rem;
251
- font-weight: 500;
252
- color: rgba(255, 255, 255, 0.65);
253
- text-transform: uppercase;
254
- letter-spacing: 0.04em;
255
- text-align: center;
256
- }
257
-
258
- @media (max-width: 640px) {
259
- .dd-card {
260
- padding: 1.5rem;
261
- }
262
-
263
- .dd-inputs {
264
- grid-template-columns: 1fr;
265
- }
266
-
267
- .dd-diff-grid {
268
- grid-template-columns: repeat(2, 1fr);
269
- }
270
-
271
- .dd-diff-value {
272
- font-size: 1.5rem;
273
- }
274
- }
275
- </style>
276
76
 
277
77
  <script>
278
78
  import type { DateDiffCalculatorUI } from './ui';
@@ -0,0 +1,198 @@
1
+ .dd-root {
2
+ --dd-indigo: #6366f1;
3
+ --dd-indigo-dark: #4f46e5;
4
+ --dd-rose: #f43f5e;
5
+ --dd-card-bg: #fff;
6
+ --dd-card-border: rgba(0, 0, 0, 0.05);
7
+ --dd-field-bg: #f8fafc;
8
+ --dd-field-border: #e2e8f0;
9
+ --dd-text-main: #1e293b;
10
+ --dd-text-label: #64748b;
11
+ --dd-result-bg: linear-gradient(135deg, #6366f1 0%, #8b5cf6 100%);
12
+ --dd-result-text: #fff;
13
+ --dd-quick-bg: #f1f5f9;
14
+ --dd-quick-color: #475569;
15
+
16
+ width: 100%;
17
+ max-width: 860px;
18
+ margin: 0 auto;
19
+ }
20
+
21
+ :global(.theme-dark) .dd-root {
22
+ --dd-card-bg: #1e293b;
23
+ --dd-card-border: rgba(255, 255, 255, 0.05);
24
+ --dd-field-bg: #0f172a;
25
+ --dd-field-border: #334155;
26
+ --dd-text-main: #f1f5f9;
27
+ --dd-text-label: #94a3b8;
28
+ --dd-quick-bg: #334155;
29
+ --dd-quick-color: #e2e8f0;
30
+ }
31
+
32
+ .dd-card {
33
+ background: var(--dd-card-bg);
34
+ border: 1px solid var(--dd-card-border);
35
+ border-radius: 2rem;
36
+ padding: 2.5rem;
37
+ box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.1);
38
+ display: flex;
39
+ flex-direction: column;
40
+ gap: 2rem;
41
+ }
42
+
43
+ .dd-inputs {
44
+ display: grid;
45
+ grid-template-columns: 1fr 1fr;
46
+ gap: 1.5rem;
47
+ }
48
+
49
+ .dd-field {
50
+ display: flex;
51
+ flex-direction: column;
52
+ gap: 0.5rem;
53
+ }
54
+
55
+ .dd-label {
56
+ font-size: 0.8125rem;
57
+ font-weight: 600;
58
+ color: var(--dd-text-label);
59
+ text-transform: uppercase;
60
+ letter-spacing: 0.05em;
61
+ }
62
+
63
+ .dd-input {
64
+ background: var(--dd-field-bg);
65
+ border: 1px solid var(--dd-field-border);
66
+ border-radius: 0.75rem;
67
+ padding: 0.75rem 1rem;
68
+ color: var(--dd-text-main);
69
+ font-size: 0.9375rem;
70
+ outline: none;
71
+ transition: border-color 0.2s;
72
+ width: 100%;
73
+ box-sizing: border-box;
74
+ }
75
+
76
+ .dd-input:focus {
77
+ border-color: var(--dd-indigo);
78
+ }
79
+
80
+ .dd-quick {
81
+ display: flex;
82
+ gap: 0.5rem;
83
+ }
84
+
85
+ .dd-quick-btn {
86
+ background: var(--dd-quick-bg);
87
+ color: var(--dd-quick-color);
88
+ border: none;
89
+ border-radius: 0.5rem;
90
+ padding: 0.375rem 0.75rem;
91
+ font-size: 0.8125rem;
92
+ font-weight: 600;
93
+ cursor: pointer;
94
+ transition: background 0.15s;
95
+ }
96
+
97
+ .dd-quick-btn:hover {
98
+ background: var(--dd-indigo);
99
+ color: #fff;
100
+ }
101
+
102
+ .dd-result {
103
+ background: var(--dd-result-bg);
104
+ border-radius: 1.5rem;
105
+ padding: 2rem;
106
+ display: flex;
107
+ flex-direction: column;
108
+ gap: 1.5rem;
109
+ }
110
+
111
+ .dd-result-header {
112
+ text-align: center;
113
+ }
114
+
115
+ .dd-result-title {
116
+ font-size: 0.875rem;
117
+ font-weight: 700;
118
+ color: rgba(255, 255, 255, 0.8);
119
+ text-transform: uppercase;
120
+ letter-spacing: 0.1em;
121
+ }
122
+
123
+ .dd-diff-grid {
124
+ display: grid;
125
+ grid-template-columns: repeat(4, 1fr);
126
+ gap: 1rem;
127
+ }
128
+
129
+ .dd-diff-item {
130
+ background: rgba(255, 255, 255, 0.15);
131
+ border-radius: 1rem;
132
+ padding: 1rem;
133
+ display: flex;
134
+ flex-direction: column;
135
+ align-items: center;
136
+ gap: 0.25rem;
137
+ }
138
+
139
+ .dd-diff-value {
140
+ font-size: 2rem;
141
+ font-weight: 800;
142
+ color: var(--dd-result-text);
143
+ line-height: 1;
144
+ }
145
+
146
+ .dd-diff-label {
147
+ font-size: 0.75rem;
148
+ font-weight: 600;
149
+ color: rgba(255, 255, 255, 0.7);
150
+ text-transform: uppercase;
151
+ letter-spacing: 0.05em;
152
+ }
153
+
154
+ .dd-totals {
155
+ display: grid;
156
+ grid-template-columns: repeat(3, 1fr);
157
+ gap: 1rem;
158
+ }
159
+
160
+ .dd-total-item {
161
+ display: flex;
162
+ flex-direction: column;
163
+ align-items: center;
164
+ gap: 0.2rem;
165
+ }
166
+
167
+ .dd-total-value {
168
+ font-size: 1.125rem;
169
+ font-weight: 700;
170
+ color: var(--dd-result-text);
171
+ }
172
+
173
+ .dd-total-label {
174
+ font-size: 0.6875rem;
175
+ font-weight: 500;
176
+ color: rgba(255, 255, 255, 0.65);
177
+ text-transform: uppercase;
178
+ letter-spacing: 0.04em;
179
+ text-align: center;
180
+ }
181
+
182
+ @media (max-width: 640px) {
183
+ .dd-card {
184
+ padding: 1.5rem;
185
+ }
186
+
187
+ .dd-inputs {
188
+ grid-template-columns: 1fr;
189
+ }
190
+
191
+ .dd-diff-grid {
192
+ grid-template-columns: repeat(2, 1fr);
193
+ }
194
+
195
+ .dd-diff-value {
196
+ font-size: 1.5rem;
197
+ }
198
+ }
@@ -40,179 +40,6 @@ const t = (ui ?? {}) as DriveDirectLinkUI;
40
40
  </div>
41
41
  </div>
42
42
 
43
- <style>
44
- .gdl-root {
45
- --gdl-blue: #2563eb;
46
- --gdl-blue-light: #3b82f6;
47
- --gdl-green: #10b981;
48
- --gdl-green-bg: rgba(16, 185, 129, 0.08);
49
- --gdl-green-border: rgba(16, 185, 129, 0.3);
50
- --gdl-card-bg: #fff;
51
- --gdl-card-border: #e2e8f0;
52
- --gdl-field-bg: #f8fafc;
53
- --gdl-field-border: #cbd5e1;
54
- --gdl-text-main: #1e293b;
55
- --gdl-text-label: #374151;
56
- --gdl-error-bg: rgba(239, 68, 68, 0.1);
57
- --gdl-error-border: rgba(239, 68, 68, 0.3);
58
- --gdl-divider: rgba(0, 0, 0, 0.08);
59
-
60
- width: 100%;
61
- max-width: 600px;
62
- margin: 0 auto;
63
- }
64
-
65
- :global(.theme-dark) .gdl-root {
66
- --gdl-card-bg: #1e293b;
67
- --gdl-card-border: #334155;
68
- --gdl-field-bg: #0f172a;
69
- --gdl-field-border: #475569;
70
- --gdl-text-main: #f1f5f9;
71
- --gdl-text-label: #cbd5e1;
72
- --gdl-divider: rgba(255, 255, 255, 0.08);
73
- }
74
-
75
- .gdl-card {
76
- background: var(--gdl-card-bg);
77
- border: 1px solid var(--gdl-card-border);
78
- border-radius: 1.5rem;
79
- padding: 2.5rem;
80
- display: flex;
81
- flex-direction: column;
82
- gap: 1.5rem;
83
- box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
84
- }
85
-
86
- .gdl-field {
87
- display: flex;
88
- flex-direction: column;
89
- gap: 0.75rem;
90
- }
91
-
92
- .gdl-label {
93
- font-size: 1rem;
94
- font-weight: 500;
95
- color: var(--gdl-text-label);
96
- }
97
-
98
- .gdl-input {
99
- width: 100%;
100
- padding: 1rem 1.25rem;
101
- background: var(--gdl-field-bg);
102
- border: 1px solid var(--gdl-field-border);
103
- border-radius: 0.75rem;
104
- color: var(--gdl-text-main);
105
- font-size: 1rem;
106
- outline: none;
107
- transition: border-color 0.2s, box-shadow 0.2s;
108
- box-sizing: border-box;
109
- }
110
-
111
- .gdl-input:focus {
112
- border-color: var(--gdl-blue);
113
- box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.2);
114
- background: var(--gdl-card-bg);
115
- }
116
-
117
- .gdl-btn-primary {
118
- background: linear-gradient(135deg, var(--gdl-blue-light) 0%, var(--gdl-blue) 100%);
119
- color: #fff;
120
- border: none;
121
- border-radius: 0.75rem;
122
- padding: 1rem 1.5rem;
123
- font-size: 1.0625rem;
124
- font-weight: 600;
125
- cursor: pointer;
126
- transition: transform 0.2s, box-shadow 0.2s;
127
- box-shadow: 0 4px 15px rgba(37, 99, 235, 0.4);
128
- }
129
-
130
- .gdl-btn-primary:hover {
131
- transform: translateY(-2px);
132
- box-shadow: 0 6px 20px rgba(37, 99, 235, 0.5);
133
- }
134
-
135
- .gdl-btn-primary:active {
136
- transform: translateY(0);
137
- }
138
-
139
- .gdl-result {
140
- flex-direction: column;
141
- gap: 1rem;
142
- padding-top: 1.5rem;
143
- border-top: 1px solid var(--gdl-divider);
144
- }
145
-
146
- .gdl-result-label {
147
- font-size: 0.9375rem;
148
- font-weight: 600;
149
- color: var(--gdl-green);
150
- }
151
-
152
- .gdl-output-row {
153
- display: flex;
154
- gap: 0.5rem;
155
- }
156
-
157
- .gdl-output {
158
- color: var(--gdl-green);
159
- background: var(--gdl-green-bg);
160
- border-color: var(--gdl-green-border);
161
- flex: 1;
162
- }
163
-
164
- .gdl-copy-btn {
165
- display: flex;
166
- align-items: center;
167
- justify-content: center;
168
- background: var(--gdl-green-bg);
169
- border: 1px solid var(--gdl-green-border);
170
- border-radius: 0.75rem;
171
- color: var(--gdl-green);
172
- width: 3rem;
173
- min-width: 3rem;
174
- cursor: pointer;
175
- transition: background 0.2s;
176
- }
177
-
178
- .gdl-copy-btn:hover {
179
- background: rgba(16, 185, 129, 0.2);
180
- }
181
-
182
- .gdl-test-btn {
183
- display: block;
184
- text-align: center;
185
- background: var(--gdl-green-bg);
186
- color: var(--gdl-green);
187
- border: 1px solid var(--gdl-green-border);
188
- border-radius: 0.75rem;
189
- padding: 0.75rem 1rem;
190
- font-size: 1rem;
191
- font-weight: 600;
192
- text-decoration: none;
193
- transition: background 0.2s, border-color 0.2s;
194
- }
195
-
196
- .gdl-test-btn:hover {
197
- background: rgba(16, 185, 129, 0.2);
198
- border-color: rgba(16, 185, 129, 0.5);
199
- }
200
-
201
- .gdl-error {
202
- color: #ef4444;
203
- background: var(--gdl-error-bg);
204
- border: 1px solid var(--gdl-error-border);
205
- border-radius: 0.75rem;
206
- padding: 1rem;
207
- font-size: 0.9375rem;
208
- }
209
-
210
- @media (max-width: 480px) {
211
- .gdl-card {
212
- padding: 1.5rem;
213
- }
214
- }
215
- </style>
216
43
 
217
44
  <script>
218
45
  import type { DriveDirectLinkUI } from './ui';