@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,344 @@
1
+ .jf-root {
2
+ width: 100%;
3
+ max-width: 72rem;
4
+ margin: 0 auto;
5
+ display: flex;
6
+ flex-direction: column;
7
+ gap: 1.5rem;
8
+ }
9
+
10
+ .jf-toolbar {
11
+ display: flex;
12
+ flex-wrap: wrap;
13
+ align-items: center;
14
+ justify-content: space-between;
15
+ gap: 1rem;
16
+ background: rgba(255, 255, 255, 0.5);
17
+ backdrop-filter: blur(8px);
18
+ padding: 1rem;
19
+ border-radius: 1rem;
20
+ border: 1px solid rgba(0, 0, 0, 0.08);
21
+ box-shadow: 0 1px 3px rgba(0, 0, 0, 0.04);
22
+ }
23
+
24
+ .jf-status-pill {
25
+ display: flex;
26
+ align-items: center;
27
+ gap: 0.5rem;
28
+ padding: 0.375rem 0.75rem;
29
+ background: #f1f5f9;
30
+ border-radius: 0.5rem;
31
+ font-size: 0.75rem;
32
+ text-transform: uppercase;
33
+ letter-spacing: 0.05em;
34
+ }
35
+
36
+ .jf-badge {
37
+ width: 0.5rem;
38
+ height: 0.5rem;
39
+ border-radius: 50%;
40
+ flex-shrink: 0;
41
+ transition: background 0.2s, box-shadow 0.2s;
42
+ }
43
+
44
+ .jf-status-text {
45
+ transition: color 0.2s;
46
+ }
47
+
48
+ .jf-actions {
49
+ display: flex;
50
+ flex-wrap: wrap;
51
+ align-items: center;
52
+ gap: 0.5rem;
53
+ }
54
+
55
+ .jf-btn {
56
+ display: inline-flex;
57
+ align-items: center;
58
+ gap: 0.5rem;
59
+ padding: 0.5rem 1rem;
60
+ font-size: 0.875rem;
61
+ font-weight: 500;
62
+ border: none;
63
+ border-radius: 0.5rem;
64
+ cursor: pointer;
65
+ transition: background 0.15s, transform 0.1s;
66
+ line-height: 1;
67
+ }
68
+
69
+ .jf-btn-muted {
70
+ color: #475569;
71
+ background: transparent;
72
+ }
73
+
74
+ .jf-btn-muted:hover {
75
+ background: #f1f5f9;
76
+ }
77
+
78
+ .jf-btn-amber {
79
+ color: #d97706;
80
+ background: transparent;
81
+ }
82
+
83
+ .jf-btn-amber:hover {
84
+ background: #fef3c7;
85
+ }
86
+
87
+ .jf-btn-emerald {
88
+ color: #fff;
89
+ background: #10b981;
90
+ box-shadow: 0 4px 14px rgba(16, 185, 129, 0.25);
91
+ font-weight: 700;
92
+ padding-inline: 1.5rem;
93
+ }
94
+
95
+ .jf-btn-emerald:hover {
96
+ background: #059669;
97
+ }
98
+
99
+ .jf-btn-emerald:active {
100
+ transform: scale(0.96);
101
+ }
102
+
103
+ .jf-divider {
104
+ width: 1px;
105
+ height: 2rem;
106
+ background: #e2e8f0;
107
+ margin-inline: 0.5rem;
108
+ }
109
+
110
+ .jf-grid {
111
+ display: grid;
112
+ gap: 1.5rem;
113
+ }
114
+
115
+ @media (min-width: 1024px) {
116
+ .jf-grid {
117
+ grid-template-columns: 1fr 1fr;
118
+ }
119
+ }
120
+
121
+ .jf-panel {
122
+ position: relative;
123
+ height: 600px;
124
+ display: flex;
125
+ flex-direction: column;
126
+ border-radius: 1rem;
127
+ border: 1px solid #e2e8f0;
128
+ overflow: hidden;
129
+ background: #fff;
130
+ }
131
+
132
+ .jf-panel-header {
133
+ display: flex;
134
+ justify-content: space-between;
135
+ align-items: center;
136
+ padding: 0.5rem 1rem;
137
+ background: #f8fafc;
138
+ border-bottom: 1px solid #e2e8f0;
139
+ font-size: 0.75rem;
140
+ text-transform: uppercase;
141
+ letter-spacing: 0.05em;
142
+ color: #64748b;
143
+ flex-shrink: 0;
144
+ }
145
+
146
+ .jf-size-info {
147
+ color: #94a3b8;
148
+ }
149
+
150
+ .jf-textarea {
151
+ flex: 1;
152
+ width: 100%;
153
+ padding: 1rem;
154
+ background: transparent;
155
+ font-size: 0.875rem;
156
+ line-height: 1.6;
157
+ color: #334155;
158
+ resize: none;
159
+ border: none;
160
+ outline: none;
161
+ }
162
+
163
+ .jf-textarea::placeholder {
164
+ color: #cbd5e1;
165
+ }
166
+
167
+ .jf-output {
168
+ flex: 1;
169
+ min-height: 0;
170
+ padding: 1rem;
171
+ overflow: auto;
172
+ font-size: 0.875rem;
173
+ line-height: 1.6;
174
+ color: #334155;
175
+ background: #f8fafc;
176
+ margin: 0;
177
+ white-space: pre-wrap;
178
+ overflow-wrap: break-word;
179
+ outline: none;
180
+ }
181
+
182
+ .jf-output:focus {
183
+ box-shadow: inset 0 0 0 2px rgba(168, 85, 247, 0.3);
184
+ }
185
+
186
+ .jf-toast {
187
+ position: fixed;
188
+ bottom: 2rem;
189
+ right: 2rem;
190
+ padding: 0.5rem 1rem;
191
+ background: #0f172a;
192
+ color: #fff;
193
+ border-radius: 0.5rem;
194
+ box-shadow: 0 4px 20px rgba(0, 0, 0, 0.2);
195
+ font-size: 0.875rem;
196
+ font-weight: 500;
197
+ transform: translateY(5rem);
198
+ opacity: 0;
199
+ transition: transform 0.3s, opacity 0.3s;
200
+ pointer-events: none;
201
+ z-index: 50;
202
+ }
203
+
204
+ :global(.theme-dark) .jf-toolbar {
205
+ background: rgba(15, 23, 42, 0.5);
206
+ border-color: rgba(255, 255, 255, 0.08);
207
+ }
208
+
209
+ :global(.theme-dark) .jf-status-pill {
210
+ background: #1e293b;
211
+ }
212
+
213
+ :global(.theme-dark) .jf-btn-muted {
214
+ color: #cbd5e1;
215
+ }
216
+
217
+ :global(.theme-dark) .jf-btn-muted:hover {
218
+ background: #1e293b;
219
+ }
220
+
221
+ :global(.theme-dark) .jf-btn-amber {
222
+ color: #fbbf24;
223
+ }
224
+
225
+ :global(.theme-dark) .jf-btn-amber:hover {
226
+ background: rgba(251, 191, 36, 0.1);
227
+ }
228
+
229
+ :global(.theme-dark) .jf-divider {
230
+ background: #334155;
231
+ }
232
+
233
+ :global(.theme-dark) .jf-panel {
234
+ background: #0f172a;
235
+ border-color: #1e293b;
236
+ }
237
+
238
+ :global(.theme-dark) .jf-panel-header {
239
+ background: rgba(30, 41, 59, 0.5);
240
+ border-color: #1e293b;
241
+ }
242
+
243
+ :global(.theme-dark) .jf-textarea {
244
+ color: #cbd5e1;
245
+ }
246
+
247
+ :global(.theme-dark) .jf-textarea::placeholder {
248
+ color: #334155;
249
+ }
250
+
251
+ :global(.theme-dark) .jf-output {
252
+ background: #0d1117;
253
+ color: #cbd5e1;
254
+ }
255
+
256
+ :global(.theme-dark) .jf-toast {
257
+ background: #f8fafc;
258
+ color: #0f172a;
259
+ }
260
+
261
+ :global(.jf-badge-empty) {
262
+ background: #94a3b8;
263
+ }
264
+
265
+ :global(.jf-badge-valid) {
266
+ background: #10b981;
267
+ box-shadow: 0 0 8px rgba(16, 185, 129, 0.5);
268
+ }
269
+
270
+ :global(.jf-badge-invalid) {
271
+ background: #ef4444;
272
+ box-shadow: 0 0 8px rgba(239, 68, 68, 0.5);
273
+ }
274
+
275
+ :global(.jf-text-empty) {
276
+ color: #64748b;
277
+ }
278
+
279
+ :global(.jf-text-valid) {
280
+ color: #10b981;
281
+ font-weight: 600;
282
+ }
283
+
284
+ :global(.theme-dark) :global(.jf-text-valid) {
285
+ color: #34d399;
286
+ }
287
+
288
+ :global(.jf-text-invalid) {
289
+ color: #ef4444;
290
+ font-weight: 600;
291
+ }
292
+
293
+ :global(.theme-dark) :global(.jf-text-invalid) {
294
+ color: #f87171;
295
+ }
296
+
297
+ :global(.jf-toast-visible) {
298
+ transform: translateY(0);
299
+ opacity: 1;
300
+ }
301
+
302
+ :global(.jf-token-key) {
303
+ color: #7c3aed;
304
+ }
305
+
306
+ :global(.theme-dark) :global(.jf-token-key) {
307
+ color: #a78bfa;
308
+ }
309
+
310
+ :global(.jf-token-string) {
311
+ color: #16a34a;
312
+ }
313
+
314
+ :global(.theme-dark) :global(.jf-token-string) {
315
+ color: #4ade80;
316
+ }
317
+
318
+ :global(.jf-token-number) {
319
+ color: #c2410c;
320
+ }
321
+
322
+ :global(.theme-dark) :global(.jf-token-number) {
323
+ color: #fb923c;
324
+ }
325
+
326
+ :global(.jf-token-boolean) {
327
+ color: #1d4ed8;
328
+ }
329
+
330
+ :global(.theme-dark) :global(.jf-token-boolean) {
331
+ color: #60a5fa;
332
+ }
333
+
334
+ :global(.jf-token-null) {
335
+ color: #dc2626;
336
+ }
337
+
338
+ :global(.theme-dark) :global(.jf-token-null) {
339
+ color: #f87171;
340
+ }
341
+
342
+ :global(.jf-token-error) {
343
+ color: #ef4444;
344
+ }
@@ -80,304 +80,6 @@ const modKeys = ['ctrl', 'shift', 'alt', 'meta'];
80
80
  </div>
81
81
  </div>
82
82
 
83
- <style>
84
- .kc-root {
85
- --kc-primary: #7c3aed;
86
- --kc-primary-light: #8b5cf6;
87
- --kc-success: #10b981;
88
- --kc-card-bg: #fff;
89
- --kc-bg: #f8fafc;
90
- --kc-text: #0f172a;
91
- --kc-text-muted: #64748b;
92
- --kc-border: #e2e8f0;
93
- --kc-key-border: #cbd5e1;
94
-
95
- max-width: 56rem;
96
- margin: 2rem auto;
97
- color: var(--kc-text);
98
- }
99
-
100
- :global(.theme-dark) .kc-root {
101
- --kc-card-bg: #1e293b;
102
- --kc-bg: #0f172a;
103
- --kc-text: #f1f5f9;
104
- --kc-text-muted: #94a3b8;
105
- --kc-border: #334155;
106
- --kc-key-border: #0f172a;
107
- }
108
-
109
- .kc-outer-card {
110
- background: var(--kc-card-bg);
111
- border: 1px solid var(--kc-border);
112
- border-radius: 1.5rem;
113
- box-shadow: 0 4px 24px rgba(0, 0, 0, 0.07);
114
- padding: 2rem;
115
- }
116
-
117
- .kc-initial {
118
- min-height: 360px;
119
- display: flex;
120
- flex-direction: column;
121
- align-items: center;
122
- justify-content: center;
123
- gap: 2rem;
124
- }
125
-
126
- .kc-kbd-wrap {
127
- width: 8rem;
128
- height: 8rem;
129
- background: var(--kc-bg);
130
- border-radius: 1.5rem;
131
- border: 1px solid var(--kc-border);
132
- border-bottom: 8px solid var(--kc-border);
133
- display: flex;
134
- align-items: center;
135
- justify-content: center;
136
- }
137
-
138
- .kc-kbd-icon {
139
- width: 3.5rem;
140
- height: 3.5rem;
141
- color: var(--kc-text-muted);
142
- }
143
-
144
- .kc-prompt {
145
- text-align: center;
146
- display: flex;
147
- flex-direction: column;
148
- gap: 0.5rem;
149
- }
150
-
151
- .kc-prompt-title {
152
- font-size: 2rem;
153
- font-weight: 900;
154
- color: var(--kc-text);
155
- margin: 0;
156
- letter-spacing: -0.02em;
157
- }
158
-
159
- .kc-prompt-sub {
160
- font-size: 1rem;
161
- color: var(--kc-text-muted);
162
- margin: 0;
163
- }
164
-
165
- .kc-dots {
166
- display: flex;
167
- gap: 0.5rem;
168
- opacity: 0.4;
169
- }
170
-
171
- @keyframes kc-bounce {
172
- 0%, 100% { transform: translateY(0); }
173
- 50% { transform: translateY(-6px); }
174
- }
175
-
176
- .kc-dot {
177
- width: 0.5rem;
178
- height: 0.5rem;
179
- border-radius: 50%;
180
- background: var(--kc-border);
181
- animation: kc-bounce 1s ease infinite;
182
- }
183
-
184
- .kc-active {
185
- display: flex;
186
- flex-direction: column;
187
- gap: 2rem;
188
- }
189
-
190
- .kc-key-outer {
191
- display: flex;
192
- justify-content: center;
193
- }
194
-
195
- .kc-key-display {
196
- min-width: 12rem;
197
- min-height: 12rem;
198
- padding: 2rem 3rem;
199
- background: var(--kc-bg);
200
- border-radius: 1.5rem;
201
- border: 1px solid var(--kc-border);
202
- border-bottom: 12px solid var(--kc-border);
203
- display: flex;
204
- flex-direction: column;
205
- align-items: center;
206
- justify-content: center;
207
- gap: 0.5rem;
208
- transition: transform 0.1s, border-bottom-width 0.1s, box-shadow 0.1s;
209
- }
210
-
211
- .kc-key-char {
212
- font-size: 5rem;
213
- font-weight: 900;
214
- color: var(--kc-text);
215
- line-height: 1;
216
- text-align: center;
217
- max-width: 20rem;
218
- overflow-wrap: break-word;
219
- }
220
-
221
- .kc-key-code {
222
- font-size: 0.8rem;
223
- color: var(--kc-text-muted);
224
- text-transform: uppercase;
225
- letter-spacing: 0.12em;
226
- }
227
-
228
- .kc-info-grid {
229
- display: grid;
230
- grid-template-columns: repeat(4, 1fr);
231
- gap: 0.75rem;
232
- }
233
-
234
- @media (max-width: 640px) {
235
- .kc-info-grid {
236
- grid-template-columns: repeat(2, 1fr);
237
- }
238
- }
239
-
240
- .kc-info-card {
241
- background: var(--kc-bg);
242
- border: 1px solid var(--kc-border);
243
- border-radius: 1rem;
244
- padding: 1rem 0.875rem;
245
- display: flex;
246
- flex-direction: column;
247
- align-items: center;
248
- gap: 0.5rem;
249
- min-height: 8rem;
250
- justify-content: space-between;
251
- transition: border-color 0.15s;
252
- }
253
-
254
- .kc-info-card:hover {
255
- border-color: var(--kc-primary-light);
256
- }
257
-
258
- .kc-info-label {
259
- font-size: 0.68rem;
260
- text-transform: uppercase;
261
- letter-spacing: 0.07em;
262
- color: var(--kc-text-muted);
263
- font-weight: 600;
264
- }
265
-
266
- .kc-info-value {
267
- font-size: 1.1rem;
268
- font-weight: 800;
269
- color: var(--kc-primary-light);
270
- text-align: center;
271
- overflow-wrap: break-word;
272
- max-width: 100%;
273
- }
274
-
275
- .kc-copy-btn {
276
- background: transparent;
277
- border: none;
278
- cursor: pointer;
279
- padding: 0.35rem;
280
- border-radius: 0.375rem;
281
- color: var(--kc-text-muted);
282
- display: flex;
283
- align-items: center;
284
- transition: background 0.15s, color 0.15s;
285
- }
286
-
287
- .kc-copy-btn:hover {
288
- background: rgba(139, 92, 246, 0.1);
289
- color: var(--kc-primary-light);
290
- }
291
-
292
- .kc-mods-row {
293
- display: flex;
294
- justify-content: center;
295
- gap: 0.75rem;
296
- flex-wrap: wrap;
297
- }
298
-
299
- .kc-mod-key {
300
- padding: 0.625rem 1.5rem;
301
- border: 2px solid var(--kc-border);
302
- border-radius: 0.75rem;
303
- color: var(--kc-text-muted);
304
- font-weight: 800;
305
- font-size: 0.875rem;
306
- letter-spacing: 0.05em;
307
- transition: border-color 0.15s, background 0.15s, color 0.15s, transform 0.15s;
308
- }
309
-
310
- .kc-snippets-section {
311
- border-top: 1px solid var(--kc-border);
312
- padding-top: 1.5rem;
313
- display: flex;
314
- flex-direction: column;
315
- gap: 1rem;
316
- }
317
-
318
- .kc-snippets-title {
319
- font-size: 0.7rem;
320
- text-transform: uppercase;
321
- letter-spacing: 0.1em;
322
- color: var(--kc-text-muted);
323
- margin: 0;
324
- text-align: center;
325
- font-weight: 700;
326
- }
327
-
328
- .kc-snippets-grid {
329
- display: grid;
330
- grid-template-columns: 1fr 1fr;
331
- gap: 0.625rem;
332
- }
333
-
334
- @media (max-width: 520px) {
335
- .kc-snippets-grid {
336
- grid-template-columns: 1fr;
337
- }
338
- }
339
-
340
- .kc-snippet-btn {
341
- display: flex;
342
- align-items: center;
343
- justify-content: space-between;
344
- gap: 0.5rem;
345
- padding: 0.875rem 1rem;
346
- background: var(--kc-card-bg);
347
- border: 1px solid var(--kc-border);
348
- border-radius: 0.875rem;
349
- cursor: pointer;
350
- text-align: left;
351
- transition: border-color 0.15s, background 0.15s;
352
- }
353
-
354
- .kc-snippet-btn:hover {
355
- border-color: var(--kc-primary-light);
356
- }
357
-
358
- .kc-snippet-code {
359
- font-size: 0.8rem;
360
- color: var(--kc-text);
361
- flex: 1;
362
- overflow: hidden;
363
- text-overflow: ellipsis;
364
- white-space: nowrap;
365
- }
366
-
367
- .kc-snippet-copy {
368
- font-size: 0.72rem;
369
- font-weight: 700;
370
- color: var(--kc-primary-light);
371
- opacity: 0;
372
- transition: opacity 0.15s;
373
- white-space: nowrap;
374
- flex-shrink: 0;
375
- }
376
-
377
- .kc-snippet-btn:hover .kc-snippet-copy {
378
- opacity: 1;
379
- }
380
- </style>
381
83
 
382
84
  <script>
383
85
  import type { KeycodeUI } from './ui';
@@ -0,0 +1,30 @@
1
+ import type { DeveloperToolEntry, ToolLocaleContent } from '../../types';
2
+
3
+ import type { KeycodeUI } from './ui';
4
+
5
+ export type KeycodeLocaleContent = ToolLocaleContent<KeycodeUI>;
6
+
7
+ export const keycode: DeveloperToolEntry<KeycodeUI> = {
8
+ id: 'keycode',
9
+ icons: {
10
+ bg: 'mdi:keyboard-outline',
11
+ fg: 'mdi:code-braces',
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 { KeycodeUI } from './ui';
4
-
5
- export type KeycodeLocaleContent = ToolLocaleContent<KeycodeUI>;
6
-
7
- export const keycode: DeveloperToolEntry<KeycodeUI> = {
8
- id: 'keycode',
9
- icons: {
10
- bg: 'mdi:keyboard-outline',
11
- fg: 'mdi:code-braces',
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 { keycode } from './entry';
2
+ export * from './entry';
33
3
  export const KEYCODE_TOOL: ToolDefinition = {
34
4
  entry: keycode,
35
5
  Component: () => import('./component.astro'),