@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,358 @@
1
+ :root {
2
+ --cec-primary: rgb(139, 92, 246);
3
+ --cec-primary-hover: rgb(124, 58, 202);
4
+ --cec-border: rgb(226, 232, 240);
5
+ --cec-border-dark: rgb(51, 65, 85);
6
+ --cec-bg-light: rgb(248, 250, 252);
7
+ --cec-bg-dark: rgb(15, 23, 42);
8
+ --cec-text-primary: rgb(30, 41, 59);
9
+ --cec-text-secondary: rgb(71, 85, 105);
10
+ --cec-text-light: rgb(241, 245, 249);
11
+ }
12
+
13
+ .cec-container {
14
+ display: flex;
15
+ flex-direction: column;
16
+ gap: 2rem;
17
+ width: 100%;
18
+ max-width: 1000px;
19
+ margin: 0 auto;
20
+ }
21
+
22
+ .cec-converter-card {
23
+ background: rgba(255, 255, 255, 0.7);
24
+ backdrop-filter: blur(20px);
25
+ border: 1px solid rgba(255, 255, 255, 0.3);
26
+ border-radius: 24px;
27
+ padding: 2rem;
28
+ box-shadow: 0 20px 40px rgba(0, 0, 0, 0.05);
29
+ }
30
+
31
+ :global(.theme-dark) .cec-converter-card {
32
+ background: rgba(15, 23, 42, 0.6);
33
+ border-color: rgba(255, 255, 255, 0.05);
34
+ }
35
+
36
+ .cec-input-grid {
37
+ display: grid;
38
+ grid-template-columns: 1fr;
39
+ gap: 1.5rem;
40
+ }
41
+
42
+ @media (min-width: 768px) {
43
+ .cec-input-grid {
44
+ grid-template-columns: 1fr 1fr;
45
+ }
46
+ }
47
+
48
+ .cec-input-group {
49
+ display: flex;
50
+ flex-direction: column;
51
+ gap: 0.75rem;
52
+ }
53
+
54
+ .cec-input-label {
55
+ font-size: 0.875rem;
56
+ font-weight: 700;
57
+ color: var(--cec-text-secondary);
58
+ text-transform: uppercase;
59
+ letter-spacing: 0.05em;
60
+ }
61
+
62
+ :global(.theme-dark) .cec-input-label {
63
+ color: rgb(148, 163, 184);
64
+ }
65
+
66
+ .cec-csv-textarea {
67
+ width: 100%;
68
+ height: 200px;
69
+ background: white;
70
+ border: 1px solid var(--cec-border);
71
+ border-radius: 12px;
72
+ padding: 1rem;
73
+ font-size: 0.875rem;
74
+ color: var(--cec-text-primary);
75
+ resize: vertical;
76
+ transition: all 0.2s;
77
+ }
78
+
79
+ :global(.theme-dark) .cec-csv-textarea {
80
+ background: rgb(2, 6, 23);
81
+ border-color: rgb(30, 41, 59);
82
+ color: var(--cec-text-light);
83
+ }
84
+
85
+ .cec-csv-textarea:focus {
86
+ outline: none;
87
+ border-color: var(--cec-primary);
88
+ box-shadow: 0 0 0 4px rgba(139, 92, 246, 0.1);
89
+ }
90
+
91
+ .cec-drop-zone {
92
+ border: 2px dashed var(--cec-border);
93
+ border-radius: 12px;
94
+ height: 200px;
95
+ display: flex;
96
+ flex-direction: column;
97
+ align-items: center;
98
+ justify-content: center;
99
+ gap: 1rem;
100
+ cursor: pointer;
101
+ transition: all 0.2s;
102
+ background: rgba(248, 250, 252, 0.5);
103
+ }
104
+
105
+ :global(.theme-dark) .cec-drop-zone {
106
+ border-color: var(--cec-border-dark);
107
+ background: rgba(30, 41, 59, 0.2);
108
+ }
109
+
110
+ .cec-drop-zone:hover,
111
+ .cec-dragover {
112
+ border-color: var(--cec-primary);
113
+ background: rgba(139, 92, 246, 0.05);
114
+ }
115
+
116
+ .cec-drop-zone :global(svg) {
117
+ color: var(--cec-primary);
118
+ }
119
+
120
+ .cec-drop-zone span {
121
+ font-size: 0.875rem;
122
+ color: rgb(100, 116, 139);
123
+ font-weight: 500;
124
+ }
125
+
126
+ .cec-options-row {
127
+ display: flex;
128
+ flex-wrap: wrap;
129
+ gap: 1.5rem;
130
+ margin-top: 1rem;
131
+ padding-top: 1.5rem;
132
+ border-top: 1px solid rgba(0, 0, 0, 0.05);
133
+ }
134
+
135
+ :global(.theme-dark) .cec-options-row {
136
+ border-top-color: rgba(255, 255, 255, 0.05);
137
+ }
138
+
139
+ .cec-option-item {
140
+ display: flex;
141
+ align-items: center;
142
+ gap: 0.75rem;
143
+ cursor: pointer;
144
+ position: relative;
145
+ user-select: none;
146
+ padding: 0.5rem 0.75rem;
147
+ border-radius: 12px;
148
+ transition: background-color 0.2s;
149
+ }
150
+
151
+ .cec-option-item:hover {
152
+ background: rgba(139, 92, 246, 0.05);
153
+ }
154
+
155
+ .cec-option-item input[type="checkbox"] {
156
+ appearance: none;
157
+ width: 20px;
158
+ height: 20px;
159
+ border: 2px solid var(--cec-border);
160
+ border-radius: 6px;
161
+ background: white;
162
+ cursor: pointer;
163
+ position: relative;
164
+ transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
165
+ }
166
+
167
+ :global(.theme-dark) .cec-option-item input[type="checkbox"] {
168
+ background: rgb(15, 23, 42);
169
+ border-color: var(--cec-border-dark);
170
+ }
171
+
172
+ .cec-option-item input[type="checkbox"]:checked {
173
+ background: var(--cec-primary);
174
+ border-color: var(--cec-primary);
175
+ box-shadow: 0 4px 6px -1px rgba(139, 92, 246, 0.2);
176
+ }
177
+
178
+ .cec-option-item input[type="checkbox"]:checked::after {
179
+ content: '';
180
+ position: absolute;
181
+ left: 6px;
182
+ top: 2px;
183
+ width: 5px;
184
+ height: 10px;
185
+ border: solid white;
186
+ border-width: 0 2px 2px 0;
187
+ transform: rotate(45deg);
188
+ }
189
+
190
+ .cec-option-item span {
191
+ font-size: 0.9rem;
192
+ font-weight: 600;
193
+ color: var(--cec-text-secondary);
194
+ }
195
+
196
+ :global(.theme-dark) .cec-option-item span {
197
+ color: rgb(148, 163, 184);
198
+ }
199
+
200
+ .cec-option-item input[type="checkbox"]:checked + span {
201
+ color: rgb(88, 28, 135);
202
+ }
203
+
204
+ :global(.theme-dark) .cec-option-item input[type="checkbox"]:checked + span {
205
+ color: rgb(196, 181, 253);
206
+ }
207
+
208
+ .cec-results-section {
209
+ display: flex;
210
+ flex-direction: column;
211
+ gap: 1.5rem;
212
+ }
213
+
214
+ .cec-result-tabs {
215
+ display: flex;
216
+ gap: 0.5rem;
217
+ border-bottom: 2px solid var(--cec-border);
218
+ }
219
+
220
+ :global(.theme-dark) .cec-result-tabs {
221
+ border-bottom-color: rgb(30, 41, 59);
222
+ }
223
+
224
+ .cec-tab-btn {
225
+ padding: 0.75rem 1.5rem;
226
+ font-size: 0.875rem;
227
+ font-weight: 700;
228
+ color: rgb(100, 116, 139);
229
+ background: transparent;
230
+ border: none;
231
+ cursor: pointer;
232
+ border-bottom: 2px solid transparent;
233
+ margin-bottom: -2px;
234
+ transition: all 0.2s;
235
+ }
236
+
237
+ .cec-tab-active {
238
+ color: var(--cec-primary);
239
+ border-bottom-color: var(--cec-primary);
240
+ }
241
+
242
+ .cec-preview-container {
243
+ background: white;
244
+ border: 1px solid var(--cec-border);
245
+ border-radius: 12px;
246
+ overflow-x: auto;
247
+ max-height: 400px;
248
+ padding: 1rem;
249
+ }
250
+
251
+ :global(.theme-dark) .cec-preview-container {
252
+ background: rgb(15, 23, 42);
253
+ border-color: rgb(30, 41, 59);
254
+ }
255
+
256
+ .cec-code-container {
257
+ position: relative;
258
+ }
259
+
260
+ .cec-code-textarea {
261
+ width: 100%;
262
+ height: 300px;
263
+ background: rgb(30, 41, 59);
264
+ color: rgb(226, 232, 240);
265
+ border-radius: 12px;
266
+ padding: 1.5rem;
267
+ font-size: 0.875rem;
268
+ resize: vertical;
269
+ border: none;
270
+ }
271
+
272
+ .cec-copy-btn {
273
+ position: absolute;
274
+ top: 1rem;
275
+ right: 1rem;
276
+ background: var(--cec-primary);
277
+ color: white;
278
+ border: none;
279
+ border-radius: 8px;
280
+ padding: 0.5rem 1rem;
281
+ font-size: 0.75rem;
282
+ font-weight: 700;
283
+ cursor: pointer;
284
+ display: flex;
285
+ align-items: center;
286
+ gap: 0.5rem;
287
+ transition: all 0.2s;
288
+ }
289
+
290
+ .cec-copy-btn:hover {
291
+ background: var(--cec-primary-hover);
292
+ }
293
+
294
+ .cec-preview-container :global(table) {
295
+ width: 100%;
296
+ border-collapse: collapse;
297
+ font-size: 0.875rem;
298
+ }
299
+
300
+ .cec-preview-container :global(th) {
301
+ background: var(--cec-bg-light);
302
+ border-bottom: 2px solid var(--cec-border);
303
+ padding: 0.75rem;
304
+ text-align: left;
305
+ font-weight: 700;
306
+ color: var(--cec-text-primary);
307
+ }
308
+
309
+ :global(.theme-dark) .cec-preview-container :global(th) {
310
+ background: rgb(30, 41, 59);
311
+ border-bottom-color: var(--cec-border-dark);
312
+ color: var(--cec-text-light);
313
+ }
314
+
315
+ .cec-preview-container :global(td) {
316
+ padding: 0.75rem;
317
+ border-bottom: 1px solid rgb(241, 245, 249);
318
+ color: var(--cec-text-secondary);
319
+ }
320
+
321
+ :global(.theme-dark) .cec-preview-container :global(td) {
322
+ border-bottom-color: rgb(30, 41, 59);
323
+ color: rgb(148, 163, 184);
324
+ }
325
+
326
+ .cec-empty-state {
327
+ display: flex;
328
+ flex-direction: column;
329
+ align-items: center;
330
+ justify-content: center;
331
+ padding: 3rem;
332
+ color: rgb(148, 163, 184);
333
+ text-align: center;
334
+ gap: 1rem;
335
+ }
336
+
337
+ .cec-preview-container :global(table.bordered) {
338
+ border: 1px solid var(--cec-border);
339
+ }
340
+
341
+ .cec-preview-container :global(table.bordered th),
342
+ .cec-preview-container :global(table.bordered td) {
343
+ border: 1px solid var(--cec-border);
344
+ }
345
+
346
+ :global(.theme-dark) .cec-preview-container :global(table.bordered),
347
+ :global(.theme-dark) .cec-preview-container :global(table.bordered th),
348
+ :global(.theme-dark) .cec-preview-container :global(table.bordered td) {
349
+ border-color: var(--cec-border-dark);
350
+ }
351
+
352
+ .cec-preview-container :global(table.zebra tbody tr:nth-child(even)) {
353
+ background: var(--cec-bg-light);
354
+ }
355
+
356
+ :global(.theme-dark) .cec-preview-container :global(table.zebra tbody tr:nth-child(even)) {
357
+ background: rgba(30, 41, 59, 0.5);
358
+ }
@@ -1,34 +1,5 @@
1
- import type { DeveloperToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
2
- import type { ConversorExcelCsvHtmlUI } from './ui';
3
-
4
- export type ConversorExcelCsvHtmlLocaleContent = ToolLocaleContent<ConversorExcelCsvHtmlUI>;
5
-
6
- export const conversorExcelCsvHtml: DeveloperToolEntry<ConversorExcelCsvHtmlUI> = {
7
- id: 'conversor-excel-csv-html',
8
- icons: {
9
- bg: 'mdi:table',
10
- fg: 'mdi:file-delimited',
11
- },
12
- i18n: {
13
- de: async () => (await import('./i18n/de')).content,
14
- en: async () => (await import('./i18n/en')).content,
15
- es: async () => (await import('./i18n/es')).content,
16
- fr: async () => (await import('./i18n/fr')).content,
17
- id: async () => (await import('./i18n/id')).content,
18
- it: async () => (await import('./i18n/it')).content,
19
- ja: async () => (await import('./i18n/ja')).content,
20
- ko: async () => (await import('./i18n/ko')).content,
21
- nl: async () => (await import('./i18n/nl')).content,
22
- pl: async () => (await import('./i18n/pl')).content,
23
- pt: async () => (await import('./i18n/pt')).content,
24
- ru: async () => (await import('./i18n/ru')).content,
25
- sv: async () => (await import('./i18n/sv')).content,
26
- tr: async () => (await import('./i18n/tr')).content,
27
- zh: async () => (await import('./i18n/zh')).content,
28
- },
29
- };
30
-
31
-
1
+ import { conversorExcelCsvHtml } from './entry';
2
+ export * from './entry';
32
3
  export const CONVERSOR_EXCEL_CSV_HTML_TOOL: ToolDefinition = {
33
4
  entry: conversorExcelCsvHtml,
34
5
  Component: () => import('./component.astro'),
@@ -95,323 +95,6 @@ const advFields = [
95
95
  </div>
96
96
  </div>
97
97
 
98
- <style>
99
- .cron-root {
100
- --cron-primary: #8b5cf6;
101
- --cron-success: #10b981;
102
- --cron-card-bg: #fff;
103
- --cron-bg: #f8fafc;
104
- --cron-text: #0f172a;
105
- --cron-text-muted: #64748b;
106
- --cron-border: #e2e8f0;
107
-
108
- max-width: 900px;
109
- margin: 2rem auto;
110
- color: var(--cron-text);
111
- }
112
-
113
- :global(.theme-dark) .cron-root {
114
- --cron-card-bg: #1e293b;
115
- --cron-bg: #0f172a;
116
- --cron-text: #f1f5f9;
117
- --cron-text-muted: #94a3b8;
118
- --cron-border: #334155;
119
- }
120
-
121
- .cron-outer-card {
122
- background: var(--cron-card-bg);
123
- border: 1px solid var(--cron-border);
124
- border-radius: 1.5rem;
125
- box-shadow: 0 4px 24px rgba(0, 0, 0, 0.07);
126
- overflow: hidden;
127
- }
128
-
129
- .cron-hero {
130
- background: #0f172a;
131
- padding: 2.25rem 2rem 1.75rem;
132
- display: flex;
133
- flex-direction: column;
134
- align-items: center;
135
- gap: 1.25rem;
136
- }
137
-
138
- .cron-expr-row {
139
- display: flex;
140
- align-items: flex-start;
141
- gap: 1.25rem;
142
- flex-wrap: wrap;
143
- justify-content: center;
144
- }
145
-
146
- .cron-part-wrapper {
147
- display: flex;
148
- flex-direction: column;
149
- align-items: center;
150
- gap: 0.375rem;
151
- }
152
-
153
- .cron-disp-part {
154
- font-size: 3rem;
155
- font-weight: 800;
156
- color: #a78bfa;
157
- line-height: 1;
158
- font-variant-numeric: tabular-nums;
159
- transition: color 0.2s;
160
- }
161
-
162
- .cron-part-label {
163
- font-size: 0.65rem;
164
- font-weight: 600;
165
- color: #475569;
166
- text-transform: uppercase;
167
- letter-spacing: 0.08em;
168
- white-space: nowrap;
169
- }
170
-
171
- .cron-human-wrap {
172
- background: rgba(255, 255, 255, 0.06);
173
- border: 1px solid rgba(255, 255, 255, 0.1);
174
- border-radius: 0.75rem;
175
- padding: 0.5rem 1.25rem;
176
- }
177
-
178
- .cron-human-text {
179
- color: #cbd5e1;
180
- font-size: 0.925rem;
181
- font-weight: 500;
182
- }
183
-
184
- .cron-human-text[data-error] {
185
- color: #f87171;
186
- }
187
-
188
- .cron-body {
189
- padding: 1.5rem;
190
- display: flex;
191
- flex-direction: column;
192
- gap: 1.25rem;
193
- }
194
-
195
- .cron-grid {
196
- display: grid;
197
- grid-template-columns: 1fr 1fr;
198
- gap: 1.25rem;
199
- }
200
-
201
- @media (max-width: 700px) {
202
- .cron-grid {
203
- grid-template-columns: 1fr;
204
- }
205
- }
206
-
207
- .cron-controls {
208
- background: var(--cron-bg);
209
- border: 1px solid var(--cron-border);
210
- border-radius: 1rem;
211
- padding: 1.125rem;
212
- }
213
-
214
- .cron-tabs {
215
- display: flex;
216
- gap: 0.5rem;
217
- margin-bottom: 1.125rem;
218
- border-bottom: 1px solid var(--cron-border);
219
- padding-bottom: 0.875rem;
220
- }
221
-
222
- .cron-tab-btn {
223
- padding: 0.375rem 1rem;
224
- border-radius: 0.5rem;
225
- border: none;
226
- background: transparent;
227
- color: var(--cron-text-muted);
228
- font-size: 0.875rem;
229
- font-weight: 600;
230
- cursor: pointer;
231
- transition: background 0.15s, color 0.15s;
232
- }
233
-
234
- .cron-tab-btn[data-active] {
235
- background: rgba(139, 92, 246, 0.12);
236
- color: var(--cron-primary);
237
- }
238
-
239
- .cron-presets {
240
- display: grid;
241
- grid-template-columns: 1fr 1fr;
242
- gap: 0.5rem;
243
- }
244
-
245
- .cron-preset-btn {
246
- display: flex;
247
- flex-direction: column;
248
- align-items: flex-start;
249
- gap: 0.2rem;
250
- padding: 0.75rem;
251
- background: var(--cron-card-bg);
252
- border: 1px solid var(--cron-border);
253
- border-radius: 0.75rem;
254
- cursor: pointer;
255
- text-align: left;
256
- transition: border-color 0.15s, background 0.15s;
257
- }
258
-
259
- .cron-preset-btn:hover {
260
- border-color: var(--cron-primary);
261
- background: rgba(139, 92, 246, 0.06);
262
- }
263
-
264
- .cron-preset-label {
265
- font-size: 0.825rem;
266
- font-weight: 700;
267
- color: var(--cron-text);
268
- }
269
-
270
- .cron-preset-expr {
271
- font-size: 0.72rem;
272
- color: var(--cron-text-muted);
273
- }
274
-
275
- .cron-field {
276
- display: flex;
277
- flex-direction: column;
278
- gap: 0.3rem;
279
- margin-bottom: 0.75rem;
280
- }
281
-
282
- .cron-field:last-child {
283
- margin-bottom: 0;
284
- }
285
-
286
- .cron-field-label {
287
- font-size: 0.78rem;
288
- font-weight: 600;
289
- color: var(--cron-text-muted);
290
- }
291
-
292
- .cron-input {
293
- width: 100%;
294
- padding: 0.45rem 0.75rem;
295
- font-size: 0.875rem;
296
- background: var(--cron-card-bg);
297
- border: 1px solid var(--cron-border);
298
- border-radius: 0.5rem;
299
- color: var(--cron-text);
300
- outline: none;
301
- box-sizing: border-box;
302
- transition: border-color 0.2s, box-shadow 0.2s;
303
- }
304
-
305
- .cron-input:focus {
306
- border-color: var(--cron-primary);
307
- box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.14);
308
- }
309
-
310
- .cron-field-hint {
311
- font-size: 0.7rem;
312
- color: var(--cron-text-muted);
313
- }
314
-
315
- .cron-runs-section {
316
- background: var(--cron-bg);
317
- border: 1px solid var(--cron-border);
318
- border-radius: 1rem;
319
- padding: 1.125rem;
320
- display: flex;
321
- flex-direction: column;
322
- }
323
-
324
- .cron-runs-title {
325
- font-size: 0.8rem;
326
- font-weight: 700;
327
- color: var(--cron-text-muted);
328
- text-transform: uppercase;
329
- letter-spacing: 0.06em;
330
- margin: 0 0 0.75rem;
331
- }
332
-
333
- .cron-runs-list {
334
- list-style: none;
335
- margin: 0;
336
- padding: 0;
337
- display: flex;
338
- flex-direction: column;
339
- gap: 0.4rem;
340
- flex: 1;
341
- }
342
-
343
- .cron-run-skeleton {
344
- height: 2.25rem;
345
- background: var(--cron-card-bg);
346
- border-radius: 0.5rem;
347
- border: 1px solid var(--cron-border);
348
- }
349
-
350
- :global(.cron-run-item) {
351
- display: flex;
352
- align-items: center;
353
- justify-content: space-between;
354
- padding: 0.5rem 0.75rem;
355
- background: var(--cron-card-bg);
356
- border: 1px solid var(--cron-border);
357
- border-radius: 0.5rem;
358
- font-size: 0.825rem;
359
- }
360
-
361
- :global(.cron-run-date) {
362
- font-weight: 600;
363
- color: var(--cron-text);
364
- text-transform: capitalize;
365
- }
366
-
367
- :global(.cron-run-rel) {
368
- font-size: 0.72rem;
369
- color: var(--cron-text-muted);
370
- }
371
-
372
- :global(.cron-no-runs) {
373
- padding: 1rem;
374
- text-align: center;
375
- color: var(--cron-text-muted);
376
- font-size: 0.825rem;
377
- font-style: italic;
378
- }
379
-
380
- .cron-copy-btn {
381
- width: 100%;
382
- padding: 0.8rem;
383
- background: var(--cron-primary);
384
- color: #fff;
385
- border: none;
386
- border-radius: 0.875rem;
387
- font-size: 0.925rem;
388
- font-weight: 700;
389
- cursor: pointer;
390
- transition: background 0.2s, transform 0.1s;
391
- }
392
-
393
- .cron-copy-btn:hover {
394
- background: #7c3aed;
395
- }
396
-
397
- .cron-copy-btn:active {
398
- transform: scale(0.98);
399
- }
400
-
401
- .cron-copy-btn[data-copied] {
402
- background: var(--cron-success);
403
- }
404
-
405
- @media (max-width: 480px) {
406
- .cron-disp-part {
407
- font-size: 2rem;
408
- }
409
-
410
- .cron-presets {
411
- grid-template-columns: 1fr;
412
- }
413
- }
414
- </style>
415
98
 
416
99
  <script>
417
100
  import type { CronGeneratorUI } from './ui';