@jjlmoya/utils-developer 1.11.0 → 1.13.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 (100) hide show
  1. package/package.json +7 -4
  2. package/scripts/postinstall.mjs +27 -0
  3. package/src/entries.ts +74 -0
  4. package/src/tool/aspectRatio/aspect-ratio-calculator.css +276 -0
  5. package/src/tool/aspectRatio/component.astro +0 -278
  6. package/src/tool/aspectRatio/entry.ts +30 -0
  7. package/src/tool/aspectRatio/index.ts +2 -32
  8. package/src/tool/calculadoraTiempoDatos/component.astro +0 -524
  9. package/src/tool/calculadoraTiempoDatos/data-time-calculator-web-speed-impact.css +522 -0
  10. package/src/tool/calculadoraTiempoDatos/entry.ts +29 -0
  11. package/src/tool/calculadoraTiempoDatos/index.ts +2 -31
  12. package/src/tool/colorConverter/color-converter-rgb-hex-hsl.css +262 -0
  13. package/src/tool/colorConverter/component.astro +0 -264
  14. package/src/tool/colorConverter/entry.ts +29 -0
  15. package/src/tool/colorConverter/index.ts +2 -31
  16. package/src/tool/conversorExcelCsvHtml/component.astro +0 -360
  17. package/src/tool/conversorExcelCsvHtml/entry.ts +29 -0
  18. package/src/tool/conversorExcelCsvHtml/excel-csv-html-table-converter.css +358 -0
  19. package/src/tool/conversorExcelCsvHtml/index.ts +2 -31
  20. package/src/tool/cronGenerator/component.astro +0 -317
  21. package/src/tool/cronGenerator/cron.css +315 -0
  22. package/src/tool/cronGenerator/entry.ts +30 -0
  23. package/src/tool/cronGenerator/index.ts +2 -32
  24. package/src/tool/cssSpecificityCalculator/component.astro +0 -205
  25. package/src/tool/cssSpecificityCalculator/css-specificity-calculator.css +203 -0
  26. package/src/tool/cssSpecificityCalculator/entry.ts +30 -0
  27. package/src/tool/cssSpecificityCalculator/index.ts +2 -32
  28. package/src/tool/cssToInlineConverter/component.astro +0 -150
  29. package/src/tool/cssToInlineConverter/css-to-inline-converter.css +148 -0
  30. package/src/tool/cssToInlineConverter/entry.ts +30 -0
  31. package/src/tool/cssToInlineConverter/index.ts +2 -32
  32. package/src/tool/duplicateCssRemover/component.astro +0 -197
  33. package/src/tool/duplicateCssRemover/duplicate-css-remover.css +195 -0
  34. package/src/tool/duplicateCssRemover/entry.ts +30 -0
  35. package/src/tool/duplicateCssRemover/index.ts +2 -32
  36. package/src/tool/generadorSecurityTxt/component.astro +0 -231
  37. package/src/tool/generadorSecurityTxt/entry.ts +29 -0
  38. package/src/tool/generadorSecurityTxt/index.ts +2 -31
  39. package/src/tool/generadorSecurityTxt/security-txt-generator-rfc-9116.css +229 -0
  40. package/src/tool/hashGenerator/component.astro +0 -229
  41. package/src/tool/hashGenerator/entry.ts +29 -0
  42. package/src/tool/hashGenerator/hash-generator.css +227 -0
  43. package/src/tool/hashGenerator/index.ts +2 -31
  44. package/src/tool/inspectorCertificadosSsl/component.astro +0 -261
  45. package/src/tool/inspectorCertificadosSsl/entry.ts +45 -0
  46. package/src/tool/inspectorCertificadosSsl/index.ts +2 -47
  47. package/src/tool/inspectorCertificadosSsl/ssl-tls-certificate-inspector.css +259 -0
  48. package/src/tool/jsonFormatter/component.astro +0 -346
  49. package/src/tool/jsonFormatter/entry.ts +30 -0
  50. package/src/tool/jsonFormatter/index.ts +2 -32
  51. package/src/tool/jsonFormatter/json-formatter.css +344 -0
  52. package/src/tool/keycode/component.astro +0 -298
  53. package/src/tool/keycode/entry.ts +30 -0
  54. package/src/tool/keycode/index.ts +2 -32
  55. package/src/tool/keycode/keycode.css +296 -0
  56. package/src/tool/llmCostCalculator/component.astro +0 -253
  57. package/src/tool/llmCostCalculator/entry.ts +46 -0
  58. package/src/tool/llmCostCalculator/index.ts +2 -48
  59. package/src/tool/llmCostCalculator/llm-cost-calculator.css +251 -0
  60. package/src/tool/mobileMockupGenerator/component.astro +0 -906
  61. package/src/tool/mobileMockupGenerator/entry.ts +45 -0
  62. package/src/tool/mobileMockupGenerator/index.ts +2 -47
  63. package/src/tool/mobileMockupGenerator/mobile-mockup-generator.css +904 -0
  64. package/src/tool/musicalTypography/component.astro +0 -291
  65. package/src/tool/musicalTypography/entry.ts +29 -0
  66. package/src/tool/musicalTypography/index.ts +2 -31
  67. package/src/tool/musicalTypography/musical-typography.css +289 -0
  68. package/src/tool/placeholderGenerator/component.astro +0 -255
  69. package/src/tool/placeholderGenerator/entry.ts +46 -0
  70. package/src/tool/placeholderGenerator/index.ts +2 -48
  71. package/src/tool/placeholderGenerator/placeholder-image-generator.css +253 -0
  72. package/src/tool/promptLibrary/component.astro +0 -689
  73. package/src/tool/promptLibrary/entry.ts +45 -0
  74. package/src/tool/promptLibrary/index.ts +2 -47
  75. package/src/tool/promptLibrary/prompt-library.css +687 -0
  76. package/src/tool/readabilityCalculator/component.astro +0 -322
  77. package/src/tool/readabilityCalculator/entry.ts +45 -0
  78. package/src/tool/readabilityCalculator/index.ts +2 -47
  79. package/src/tool/readabilityCalculator/visual-readability-calculator-wcag-apca.css +320 -0
  80. package/src/tool/svgSanitizer/component.astro +0 -289
  81. package/src/tool/svgSanitizer/entry.ts +45 -0
  82. package/src/tool/svgSanitizer/index.ts +2 -47
  83. package/src/tool/svgSanitizer/svg-sanitizer.css +287 -0
  84. package/src/tool/svgToCss/component.astro +0 -196
  85. package/src/tool/svgToCss/entry.ts +30 -0
  86. package/src/tool/svgToCss/index.ts +2 -32
  87. package/src/tool/svgToCss/svg-to-css-converter.css +194 -0
  88. package/src/tool/urlCleaner/component.astro +0 -282
  89. package/src/tool/urlCleaner/entry.ts +45 -0
  90. package/src/tool/urlCleaner/index.ts +2 -47
  91. package/src/tool/urlCleaner/url-tracking-cleaner.css +280 -0
  92. package/src/tool/urlEncoderDecoder/component.astro +0 -168
  93. package/src/tool/urlEncoderDecoder/entry.ts +30 -0
  94. package/src/tool/urlEncoderDecoder/index.ts +2 -32
  95. package/src/tool/urlEncoderDecoder/url-encoder-decoder.css +166 -0
  96. package/src/tool/utmGenerator/component.astro +0 -156
  97. package/src/tool/utmGenerator/entry.ts +29 -0
  98. package/src/tool/utmGenerator/index.ts +2 -31
  99. package/src/tool/utmGenerator/utm-generator.css +154 -0
  100. package/src/tools.ts +1 -1
@@ -0,0 +1,280 @@
1
+ .uc-root {
2
+ width: 100%;
3
+ }
4
+
5
+ .uc-container {
6
+ max-width: 900px;
7
+ margin: 0 auto;
8
+ display: flex;
9
+ flex-direction: column;
10
+ gap: 1.5rem;
11
+ padding-bottom: 2rem;
12
+ }
13
+
14
+ .uc-input-card {
15
+ background: rgba(255, 255, 255, 0.75);
16
+ backdrop-filter: blur(14px);
17
+ -webkit-backdrop-filter: blur(14px);
18
+ border: 1px solid rgba(255, 255, 255, 0.35);
19
+ border-radius: 1.5rem;
20
+ padding: 1.5rem;
21
+ box-shadow: 0 8px 32px rgba(31, 38, 135, 0.06);
22
+ display: flex;
23
+ flex-direction: column;
24
+ gap: 1rem;
25
+ }
26
+
27
+ :global(.theme-dark) .uc-input-card {
28
+ background: rgba(15, 23, 42, 0.75);
29
+ border-color: rgba(255, 255, 255, 0.06);
30
+ }
31
+
32
+ .uc-label {
33
+ font-size: 0.875rem;
34
+ font-weight: 600;
35
+ color: rgb(100, 116, 139);
36
+ text-transform: uppercase;
37
+ letter-spacing: 0.05em;
38
+ }
39
+
40
+ :global(.theme-dark) .uc-label {
41
+ color: rgb(148, 163, 184);
42
+ }
43
+
44
+ .uc-input-group {
45
+ display: flex;
46
+ gap: 0.75rem;
47
+ }
48
+
49
+ .uc-input {
50
+ flex-grow: 1;
51
+ background: white;
52
+ border: 1px solid rgb(226, 232, 240);
53
+ border-radius: 0.75rem;
54
+ padding: 0.75rem 1rem;
55
+ font-size: 1rem;
56
+ outline: none;
57
+ transition: all 0.2s ease;
58
+ color: rgb(51, 65, 85);
59
+ }
60
+
61
+ :global(.theme-dark) .uc-input {
62
+ background: rgb(15, 23, 42);
63
+ border-color: rgb(51, 65, 85);
64
+ color: rgb(203, 213, 225);
65
+ }
66
+
67
+ .uc-input:focus {
68
+ border-color: rgb(59, 130, 246);
69
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.1);
70
+ }
71
+
72
+ .uc-btn-primary {
73
+ background: rgb(59, 130, 246);
74
+ color: white;
75
+ border: none;
76
+ border-radius: 0.75rem;
77
+ padding: 0 1.5rem;
78
+ font-weight: 600;
79
+ cursor: pointer;
80
+ display: flex;
81
+ align-items: center;
82
+ gap: 0.5rem;
83
+ transition: all 0.2s ease;
84
+ font-size: 0.875rem;
85
+ }
86
+
87
+ .uc-btn-primary:hover {
88
+ background: rgb(37, 99, 235);
89
+ transform: translateY(-1px);
90
+ }
91
+
92
+ .uc-results {
93
+ display: grid;
94
+ grid-template-columns: 1fr 1fr;
95
+ gap: 1.5rem;
96
+ }
97
+
98
+ @media (max-width: 768px) {
99
+ .uc-results {
100
+ grid-template-columns: 1fr;
101
+ }
102
+ }
103
+
104
+ .uc-result-card {
105
+ background: rgba(255, 255, 255, 0.75);
106
+ backdrop-filter: blur(14px);
107
+ -webkit-backdrop-filter: blur(14px);
108
+ border: 1px solid rgba(255, 255, 255, 0.35);
109
+ border-radius: 1.5rem;
110
+ padding: 1.5rem;
111
+ box-shadow: 0 8px 32px rgba(31, 38, 135, 0.06);
112
+ display: flex;
113
+ flex-direction: column;
114
+ gap: 1rem;
115
+ }
116
+
117
+ :global(.theme-dark) .uc-result-card {
118
+ background: rgba(15, 23, 42, 0.75);
119
+ border-color: rgba(255, 255, 255, 0.06);
120
+ }
121
+
122
+ .uc-card-header {
123
+ display: flex;
124
+ justify-content: space-between;
125
+ align-items: center;
126
+ }
127
+
128
+ .uc-card-title {
129
+ font-size: 0.875rem;
130
+ font-weight: 600;
131
+ color: rgb(51, 65, 85);
132
+ margin: 0;
133
+ text-transform: uppercase;
134
+ letter-spacing: 0.05em;
135
+ }
136
+
137
+ :global(.theme-dark) .uc-card-title {
138
+ color: rgb(203, 213, 225);
139
+ }
140
+
141
+ .uc-url-display {
142
+ word-break: break-all;
143
+ font-size: 0.875rem;
144
+ color: rgb(59, 130, 246);
145
+ background: white;
146
+ padding: 1rem;
147
+ border-radius: 0.5rem;
148
+ border: 1px solid rgba(0, 0, 0, 0.05);
149
+ }
150
+
151
+ :global(.theme-dark) .uc-url-display {
152
+ background: rgb(30, 41, 59);
153
+ border-color: rgb(51, 65, 85);
154
+ color: rgb(129, 140, 148);
155
+ }
156
+
157
+ .uc-copy-btn {
158
+ display: flex;
159
+ align-items: center;
160
+ gap: 0.35rem;
161
+ font-size: 0.75rem;
162
+ font-weight: 600;
163
+ padding: 0.4rem 0.875rem;
164
+ border-radius: 2rem;
165
+ border: 1.5px solid rgb(226, 232, 240);
166
+ background: white;
167
+ color: rgb(71, 85, 105);
168
+ cursor: pointer;
169
+ transition: all 0.2s ease;
170
+ }
171
+
172
+ :global(.theme-dark) .uc-copy-btn {
173
+ background: rgb(30, 41, 59);
174
+ border-color: rgb(51, 65, 85);
175
+ color: rgb(148, 163, 184);
176
+ }
177
+
178
+ .uc-copy-btn:hover {
179
+ border-color: rgb(59, 130, 246);
180
+ color: rgb(59, 130, 246);
181
+ }
182
+
183
+ .uc-copy-btn.uc-copied {
184
+ background: rgb(16, 185, 129);
185
+ border-color: rgb(16, 185, 129);
186
+ color: white;
187
+ }
188
+
189
+ .uc-removed-list {
190
+ display: flex;
191
+ flex-direction: column;
192
+ gap: 0.75rem;
193
+ }
194
+
195
+ .uc-removed-item {
196
+ padding: 0.75rem;
197
+ background: rgba(0, 0, 0, 0.02);
198
+ border-radius: 0.5rem;
199
+ border-left: 3px solid rgb(59, 130, 246);
200
+ }
201
+
202
+ :global(.theme-dark) .uc-removed-item {
203
+ background: rgba(255, 255, 255, 0.03);
204
+ }
205
+
206
+ .uc-item-key {
207
+ font-weight: 600;
208
+ color: rgb(51, 65, 85);
209
+ font-size: 0.875rem;
210
+ }
211
+
212
+ :global(.theme-dark) .uc-item-key {
213
+ color: rgb(203, 213, 225);
214
+ }
215
+
216
+ .uc-item-val {
217
+ font-size: 0.75rem;
218
+ color: rgb(100, 116, 139);
219
+ margin-left: 0.5rem;
220
+ }
221
+
222
+ .uc-item-desc {
223
+ font-size: 0.8rem;
224
+ color: rgb(100, 116, 139);
225
+ margin: 0.25rem 0;
226
+ }
227
+
228
+ :global(.theme-dark) .uc-item-desc {
229
+ color: rgb(148, 163, 184);
230
+ }
231
+
232
+ .uc-none-detected {
233
+ font-size: 0.875rem;
234
+ color: rgb(100, 116, 139);
235
+ font-style: italic;
236
+ }
237
+
238
+ .uc-stats-card {
239
+ background: rgba(255, 255, 255, 0.75);
240
+ backdrop-filter: blur(14px);
241
+ -webkit-backdrop-filter: blur(14px);
242
+ border: 1px solid rgba(255, 255, 255, 0.35);
243
+ border-radius: 1.5rem;
244
+ padding: 1.5rem;
245
+ box-shadow: 0 8px 32px rgba(31, 38, 135, 0.06);
246
+ display: grid;
247
+ grid-template-columns: 1fr 1fr;
248
+ gap: 1.5rem;
249
+ }
250
+
251
+ :global(.theme-dark) .uc-stats-card {
252
+ background: rgba(15, 23, 42, 0.75);
253
+ border-color: rgba(255, 255, 255, 0.06);
254
+ }
255
+
256
+ .uc-stat-item {
257
+ display: flex;
258
+ flex-direction: column;
259
+ align-items: center;
260
+ gap: 0.5rem;
261
+ text-align: center;
262
+ }
263
+
264
+ .uc-stat-value {
265
+ font-size: 1.5rem;
266
+ font-weight: 800;
267
+ color: rgb(59, 130, 246);
268
+ }
269
+
270
+ .uc-stat-label {
271
+ font-size: 0.75rem;
272
+ font-weight: 600;
273
+ text-transform: uppercase;
274
+ color: rgb(100, 116, 139);
275
+ letter-spacing: 0.04em;
276
+ }
277
+
278
+ :global(.theme-dark) .uc-stat-label {
279
+ color: rgb(148, 163, 184);
280
+ }
@@ -66,174 +66,6 @@ const t = (ui ?? {}) as UrlEncoderDecoderUI;
66
66
  </div>
67
67
  </div>
68
68
 
69
- <style>
70
- .urlc-root {
71
- --urlc-primary: #f59e0b;
72
- --urlc-primary-dark: #d97706;
73
- --urlc-secondary: #3b82f6;
74
- --urlc-secondary-dark: #2563eb;
75
- --urlc-card-bg: #fff;
76
- --urlc-bg: #f8fafc;
77
- --urlc-text: #0f172a;
78
- --urlc-text-muted: #64748b;
79
- --urlc-border: #e2e8f0;
80
- --urlc-encoded-bg: rgba(245, 158, 11, 0.03);
81
-
82
- max-width: 1000px;
83
- margin: 2rem auto;
84
- color: var(--urlc-text);
85
- }
86
-
87
- :global(.theme-dark) .urlc-root {
88
- --urlc-card-bg: #1e293b;
89
- --urlc-bg: #0f172a;
90
- --urlc-text: #f1f5f9;
91
- --urlc-text-muted: #94a3b8;
92
- --urlc-border: #334155;
93
- --urlc-encoded-bg: rgba(245, 158, 11, 0.06);
94
- }
95
-
96
- .urlc-card {
97
- background: var(--urlc-card-bg);
98
- border: 1px solid var(--urlc-border);
99
- border-radius: 1.25rem;
100
- box-shadow: 0 4px 24px rgba(0, 0, 0, 0.06);
101
- padding: 1.75rem;
102
- display: flex;
103
- flex-direction: column;
104
- gap: 1.25rem;
105
- }
106
-
107
- .urlc-field {
108
- display: flex;
109
- flex-direction: column;
110
- gap: 0.5rem;
111
- }
112
-
113
- .urlc-field-header {
114
- display: flex;
115
- justify-content: space-between;
116
- align-items: center;
117
- }
118
-
119
- .urlc-field-label {
120
- font-size: 0.8rem;
121
- font-weight: 700;
122
- color: var(--urlc-text-muted);
123
- text-transform: uppercase;
124
- letter-spacing: 0.06em;
125
- }
126
-
127
- .urlc-toolbar {
128
- display: flex;
129
- gap: 0.375rem;
130
- }
131
-
132
- .urlc-toolbar-btn {
133
- background: transparent;
134
- border: 1px solid var(--urlc-border);
135
- color: var(--urlc-text-muted);
136
- padding: 0.2rem 0.6rem;
137
- border-radius: 0.4rem;
138
- font-size: 0.75rem;
139
- font-weight: 600;
140
- cursor: pointer;
141
- transition: all 0.15s;
142
- }
143
-
144
- .urlc-toolbar-btn:hover {
145
- background: var(--urlc-bg);
146
- color: var(--urlc-text);
147
- border-color: var(--urlc-text-muted);
148
- }
149
-
150
- .urlc-textarea {
151
- width: 100%;
152
- height: 160px;
153
- padding: 1rem 1.25rem;
154
- font-size: 0.9rem;
155
- color: var(--urlc-text);
156
- background: var(--urlc-bg);
157
- border: 1px solid var(--urlc-border);
158
- border-radius: 0.875rem;
159
- resize: vertical;
160
- transition: border-color 0.2s, box-shadow 0.2s;
161
- line-height: 1.6;
162
- outline: none;
163
- }
164
-
165
- .urlc-textarea:focus {
166
- border-color: var(--urlc-secondary);
167
- box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.12);
168
- }
169
-
170
- .urlc-textarea-encoded {
171
- border-color: var(--urlc-primary);
172
- background: var(--urlc-encoded-bg);
173
- }
174
-
175
- .urlc-textarea-encoded:focus {
176
- border-color: var(--urlc-primary);
177
- box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.12);
178
- }
179
-
180
- .urlc-actions {
181
- display: flex;
182
- justify-content: center;
183
- gap: 0.875rem;
184
- }
185
-
186
- @media (max-width: 480px) {
187
- .urlc-actions {
188
- flex-direction: column;
189
- }
190
- }
191
-
192
- .urlc-btn {
193
- display: flex;
194
- align-items: center;
195
- justify-content: center;
196
- gap: 0.5rem;
197
- font-weight: 700;
198
- font-size: 0.95rem;
199
- padding: 0.75rem 1.75rem;
200
- border-radius: 0.75rem;
201
- border: none;
202
- cursor: pointer;
203
- transition: transform 0.15s, box-shadow 0.15s, background 0.15s;
204
- }
205
-
206
- .urlc-btn:hover {
207
- transform: translateY(-2px);
208
- }
209
-
210
- .urlc-btn-encode {
211
- background: var(--urlc-primary);
212
- color: #fff;
213
- box-shadow: 0 4px 12px rgba(245, 158, 11, 0.3);
214
- }
215
-
216
- .urlc-btn-encode:hover {
217
- background: var(--urlc-primary-dark);
218
- box-shadow: 0 6px 16px rgba(245, 158, 11, 0.4);
219
- }
220
-
221
- .urlc-btn-decode {
222
- background: var(--urlc-secondary);
223
- color: #fff;
224
- box-shadow: 0 4px 12px rgba(59, 130, 246, 0.3);
225
- }
226
-
227
- .urlc-btn-decode:hover {
228
- background: var(--urlc-secondary-dark);
229
- box-shadow: 0 6px 16px rgba(59, 130, 246, 0.4);
230
- }
231
-
232
- .urlc-btn-icon {
233
- width: 18px;
234
- height: 18px;
235
- }
236
- </style>
237
69
 
238
70
  <script>
239
71
  const root = document.querySelector('.urlc-root') as HTMLElement | null;
@@ -0,0 +1,30 @@
1
+ import type { DeveloperToolEntry, ToolLocaleContent } from '../../types';
2
+
3
+ import type { UrlEncoderDecoderUI } from './ui';
4
+
5
+ export type UrlEncoderDecoderLocaleContent = ToolLocaleContent<UrlEncoderDecoderUI>;
6
+
7
+ export const urlEncoderDecoder: DeveloperToolEntry<UrlEncoderDecoderUI> = {
8
+ id: 'url-encoder-decoder',
9
+ icons: {
10
+ bg: 'mdi:link-variant',
11
+ fg: 'mdi:code-brackets',
12
+ },
13
+ i18n: {
14
+ de: async () => (await import('./i18n/de')).content,
15
+ en: async () => (await import('./i18n/en')).content,
16
+ es: async () => (await import('./i18n/es')).content,
17
+ fr: async () => (await import('./i18n/fr')).content,
18
+ id: async () => (await import('./i18n/id')).content,
19
+ it: async () => (await import('./i18n/it')).content,
20
+ ja: async () => (await import('./i18n/ja')).content,
21
+ ko: async () => (await import('./i18n/ko')).content,
22
+ nl: async () => (await import('./i18n/nl')).content,
23
+ pl: async () => (await import('./i18n/pl')).content,
24
+ pt: async () => (await import('./i18n/pt')).content,
25
+ ru: async () => (await import('./i18n/ru')).content,
26
+ sv: async () => (await import('./i18n/sv')).content,
27
+ tr: async () => (await import('./i18n/tr')).content,
28
+ zh: async () => (await import('./i18n/zh')).content,
29
+ },
30
+ };
@@ -1,35 +1,5 @@
1
- import type { DeveloperToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
2
-
3
- import type { UrlEncoderDecoderUI } from './ui';
4
-
5
- export type UrlEncoderDecoderLocaleContent = ToolLocaleContent<UrlEncoderDecoderUI>;
6
-
7
- export const urlEncoderDecoder: DeveloperToolEntry<UrlEncoderDecoderUI> = {
8
- id: 'url-encoder-decoder',
9
- icons: {
10
- bg: 'mdi:link-variant',
11
- fg: 'mdi:code-brackets',
12
- },
13
- i18n: {
14
- de: async () => (await import('./i18n/de')).content,
15
- en: async () => (await import('./i18n/en')).content,
16
- es: async () => (await import('./i18n/es')).content,
17
- fr: async () => (await import('./i18n/fr')).content,
18
- id: async () => (await import('./i18n/id')).content,
19
- it: async () => (await import('./i18n/it')).content,
20
- ja: async () => (await import('./i18n/ja')).content,
21
- ko: async () => (await import('./i18n/ko')).content,
22
- nl: async () => (await import('./i18n/nl')).content,
23
- pl: async () => (await import('./i18n/pl')).content,
24
- pt: async () => (await import('./i18n/pt')).content,
25
- ru: async () => (await import('./i18n/ru')).content,
26
- sv: async () => (await import('./i18n/sv')).content,
27
- tr: async () => (await import('./i18n/tr')).content,
28
- zh: async () => (await import('./i18n/zh')).content,
29
- },
30
- };
31
-
32
-
1
+ import { urlEncoderDecoder } from './entry';
2
+ export * from './entry';
33
3
  export const URL_ENCODER_DECODER_TOOL: ToolDefinition = {
34
4
  entry: urlEncoderDecoder,
35
5
  Component: () => import('./component.astro'),
@@ -0,0 +1,166 @@
1
+ .urlc-root {
2
+ --urlc-primary: #f59e0b;
3
+ --urlc-primary-dark: #d97706;
4
+ --urlc-secondary: #3b82f6;
5
+ --urlc-secondary-dark: #2563eb;
6
+ --urlc-card-bg: #fff;
7
+ --urlc-bg: #f8fafc;
8
+ --urlc-text: #0f172a;
9
+ --urlc-text-muted: #64748b;
10
+ --urlc-border: #e2e8f0;
11
+ --urlc-encoded-bg: rgba(245, 158, 11, 0.03);
12
+
13
+ max-width: 1000px;
14
+ margin: 2rem auto;
15
+ color: var(--urlc-text);
16
+ }
17
+
18
+ :global(.theme-dark) .urlc-root {
19
+ --urlc-card-bg: #1e293b;
20
+ --urlc-bg: #0f172a;
21
+ --urlc-text: #f1f5f9;
22
+ --urlc-text-muted: #94a3b8;
23
+ --urlc-border: #334155;
24
+ --urlc-encoded-bg: rgba(245, 158, 11, 0.06);
25
+ }
26
+
27
+ .urlc-card {
28
+ background: var(--urlc-card-bg);
29
+ border: 1px solid var(--urlc-border);
30
+ border-radius: 1.25rem;
31
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.06);
32
+ padding: 1.75rem;
33
+ display: flex;
34
+ flex-direction: column;
35
+ gap: 1.25rem;
36
+ }
37
+
38
+ .urlc-field {
39
+ display: flex;
40
+ flex-direction: column;
41
+ gap: 0.5rem;
42
+ }
43
+
44
+ .urlc-field-header {
45
+ display: flex;
46
+ justify-content: space-between;
47
+ align-items: center;
48
+ }
49
+
50
+ .urlc-field-label {
51
+ font-size: 0.8rem;
52
+ font-weight: 700;
53
+ color: var(--urlc-text-muted);
54
+ text-transform: uppercase;
55
+ letter-spacing: 0.06em;
56
+ }
57
+
58
+ .urlc-toolbar {
59
+ display: flex;
60
+ gap: 0.375rem;
61
+ }
62
+
63
+ .urlc-toolbar-btn {
64
+ background: transparent;
65
+ border: 1px solid var(--urlc-border);
66
+ color: var(--urlc-text-muted);
67
+ padding: 0.2rem 0.6rem;
68
+ border-radius: 0.4rem;
69
+ font-size: 0.75rem;
70
+ font-weight: 600;
71
+ cursor: pointer;
72
+ transition: all 0.15s;
73
+ }
74
+
75
+ .urlc-toolbar-btn:hover {
76
+ background: var(--urlc-bg);
77
+ color: var(--urlc-text);
78
+ border-color: var(--urlc-text-muted);
79
+ }
80
+
81
+ .urlc-textarea {
82
+ width: 100%;
83
+ height: 160px;
84
+ padding: 1rem 1.25rem;
85
+ font-size: 0.9rem;
86
+ color: var(--urlc-text);
87
+ background: var(--urlc-bg);
88
+ border: 1px solid var(--urlc-border);
89
+ border-radius: 0.875rem;
90
+ resize: vertical;
91
+ transition: border-color 0.2s, box-shadow 0.2s;
92
+ line-height: 1.6;
93
+ outline: none;
94
+ }
95
+
96
+ .urlc-textarea:focus {
97
+ border-color: var(--urlc-secondary);
98
+ box-shadow: 0 0 0 3px rgba(59, 130, 246, 0.12);
99
+ }
100
+
101
+ .urlc-textarea-encoded {
102
+ border-color: var(--urlc-primary);
103
+ background: var(--urlc-encoded-bg);
104
+ }
105
+
106
+ .urlc-textarea-encoded:focus {
107
+ border-color: var(--urlc-primary);
108
+ box-shadow: 0 0 0 3px rgba(245, 158, 11, 0.12);
109
+ }
110
+
111
+ .urlc-actions {
112
+ display: flex;
113
+ justify-content: center;
114
+ gap: 0.875rem;
115
+ }
116
+
117
+ @media (max-width: 480px) {
118
+ .urlc-actions {
119
+ flex-direction: column;
120
+ }
121
+ }
122
+
123
+ .urlc-btn {
124
+ display: flex;
125
+ align-items: center;
126
+ justify-content: center;
127
+ gap: 0.5rem;
128
+ font-weight: 700;
129
+ font-size: 0.95rem;
130
+ padding: 0.75rem 1.75rem;
131
+ border-radius: 0.75rem;
132
+ border: none;
133
+ cursor: pointer;
134
+ transition: transform 0.15s, box-shadow 0.15s, background 0.15s;
135
+ }
136
+
137
+ .urlc-btn:hover {
138
+ transform: translateY(-2px);
139
+ }
140
+
141
+ .urlc-btn-encode {
142
+ background: var(--urlc-primary);
143
+ color: #fff;
144
+ box-shadow: 0 4px 12px rgba(245, 158, 11, 0.3);
145
+ }
146
+
147
+ .urlc-btn-encode:hover {
148
+ background: var(--urlc-primary-dark);
149
+ box-shadow: 0 6px 16px rgba(245, 158, 11, 0.4);
150
+ }
151
+
152
+ .urlc-btn-decode {
153
+ background: var(--urlc-secondary);
154
+ color: #fff;
155
+ box-shadow: 0 4px 12px rgba(59, 130, 246, 0.3);
156
+ }
157
+
158
+ .urlc-btn-decode:hover {
159
+ background: var(--urlc-secondary-dark);
160
+ box-shadow: 0 6px 16px rgba(59, 130, 246, 0.4);
161
+ }
162
+
163
+ .urlc-btn-icon {
164
+ width: 18px;
165
+ height: 18px;
166
+ }