@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
@@ -187,294 +187,3 @@ const ratios = RATIO_KEYS.map((r) => ({ name: t[r.key] ?? r.key, value: r.value
187
187
  init();
188
188
  </script>
189
189
 
190
- <style>
191
- .mt-root {
192
- --mt-card-bg: #fff;
193
- --mt-border: #e2e8f0;
194
- --mt-text: #1e293b;
195
- --mt-muted: #64748b;
196
- --mt-accent: #6366f1;
197
- --mt-accent-bg: rgba(99, 102, 241, 0.08);
198
- --mt-input-bg: #f8fafc;
199
- --mt-input-border: #e2e8f0;
200
- --mt-calc-bg: rgba(99, 102, 241, 0.05);
201
- --mt-calc-border: rgba(99, 102, 241, 0.15);
202
- --mt-preview-bg: #f8fafc;
203
- --mt-base-color: #6366f1;
204
- --mt-btn-bg: #4f46e5;
205
- --mt-btn-hover: #4338ca;
206
- --mt-feedback-color: #059669;
207
- }
208
-
209
- :global(.theme-dark) .mt-root {
210
- --mt-card-bg: #1e293b;
211
- --mt-border: #334155;
212
- --mt-text: #f1f5f9;
213
- --mt-muted: #94a3b8;
214
- --mt-input-bg: #0f172a;
215
- --mt-input-border: #475569;
216
- --mt-calc-bg: rgba(99, 102, 241, 0.1);
217
- --mt-calc-border: rgba(99, 102, 241, 0.25);
218
- --mt-preview-bg: rgba(15, 23, 42, 0.5);
219
- --mt-base-color: #818cf8;
220
- --mt-btn-bg: #4f46e5;
221
- --mt-btn-hover: #6366f1;
222
- --mt-feedback-color: #34d399;
223
- }
224
-
225
- .mt-grid {
226
- display: grid;
227
- grid-template-columns: 1fr 1fr;
228
- gap: 2rem;
229
- align-items: start;
230
- }
231
-
232
- @media (max-width: 640px) {
233
- .mt-grid {
234
- grid-template-columns: 1fr;
235
- }
236
- }
237
-
238
- .mt-card {
239
- background: var(--mt-card-bg);
240
- border: 1px solid var(--mt-border);
241
- border-radius: 1rem;
242
- box-shadow: 0 4px 24px rgba(0, 0, 0, 0.06);
243
- overflow: hidden;
244
- }
245
-
246
- .mt-card-header {
247
- display: flex;
248
- align-items: center;
249
- gap: 0.75rem;
250
- padding: 1.25rem 1.5rem;
251
- border-bottom: 1px solid var(--mt-border);
252
- }
253
-
254
- .mt-card-header-preview {
255
- background: rgba(236, 72, 153, 0.04);
256
- }
257
-
258
- :global(.theme-dark) .mt-card-header-preview {
259
- background: rgba(236, 72, 153, 0.08);
260
- }
261
-
262
- .mt-card-title {
263
- font-size: 1.125rem;
264
- font-weight: 700;
265
- color: var(--mt-text);
266
- margin: 0;
267
- }
268
-
269
- .mt-card-body {
270
- padding: 1.5rem;
271
- display: flex;
272
- flex-direction: column;
273
- gap: 1.5rem;
274
- }
275
-
276
- .mt-preview-body {
277
- flex: 1;
278
- }
279
-
280
- .mt-card-preview {
281
- display: flex;
282
- flex-direction: column;
283
- }
284
-
285
- .mt-label {
286
- display: block;
287
- font-size: 0.875rem;
288
- font-weight: 600;
289
- color: var(--mt-text);
290
- margin-bottom: 0.5rem;
291
- }
292
-
293
- .mt-input-wrap {
294
- position: relative;
295
- }
296
-
297
- .mt-input,
298
- .mt-select {
299
- display: block;
300
- width: 100%;
301
- padding: 0.625rem 0.75rem;
302
- background: var(--mt-input-bg);
303
- border: 1px solid var(--mt-input-border);
304
- border-radius: 0.625rem;
305
- color: var(--mt-text);
306
- font-size: 0.875rem;
307
- box-sizing: border-box;
308
- box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
309
- transition: border-color 0.15s, box-shadow 0.15s;
310
- }
311
-
312
- .mt-input {
313
- padding-right: 2.5rem;
314
- }
315
-
316
- .mt-input:focus,
317
- .mt-select:focus {
318
- outline: 2px solid var(--mt-accent);
319
- outline-offset: 2px;
320
- border-color: var(--mt-accent);
321
- }
322
-
323
- .mt-input-suffix {
324
- position: absolute;
325
- right: 0.75rem;
326
- top: 50%;
327
- transform: translateY(-50%);
328
- font-size: 0.875rem;
329
- color: var(--mt-muted);
330
- pointer-events: none;
331
- }
332
-
333
- .mt-hint {
334
- margin: 0.375rem 0 0;
335
- font-size: 0.75rem;
336
- color: var(--mt-muted);
337
- }
338
-
339
- .mt-calc-box {
340
- background: var(--mt-calc-bg);
341
- border: 1px solid var(--mt-calc-border);
342
- border-radius: 0.75rem;
343
- padding: 1rem;
344
- }
345
-
346
- .mt-calc-title {
347
- font-size: 0.6875rem;
348
- font-weight: 700;
349
- color: var(--mt-accent);
350
- text-transform: uppercase;
351
- letter-spacing: 0.06em;
352
- margin: 0 0 0.75rem;
353
- }
354
-
355
- .mt-scale-list {
356
- display: flex;
357
- flex-direction: column;
358
- gap: 0.25rem;
359
- }
360
-
361
- :global(.mt-scale-row) {
362
- display: flex;
363
- justify-content: space-between;
364
- font-size: 0.8125rem;
365
- color: var(--mt-muted);
366
- padding: 0.125rem 0;
367
- }
368
-
369
- :global(.mt-scale-base) {
370
- color: var(--mt-base-color);
371
- font-weight: 700;
372
- background: var(--mt-accent-bg);
373
- border-radius: 0.25rem;
374
- padding: 0.125rem 0.375rem;
375
- margin: 0 -0.375rem;
376
- }
377
-
378
- .mt-preview-scroll-wrap {
379
- background: var(--mt-preview-bg);
380
- border: 1px solid var(--mt-border);
381
- border-radius: 0.75rem;
382
- height: 18rem;
383
- overflow: hidden;
384
- position: relative;
385
- }
386
-
387
- .mt-preview-scroll {
388
- position: absolute;
389
- inset: 0;
390
- padding: 1rem;
391
- overflow-y: auto;
392
- display: flex;
393
- flex-direction: column;
394
- gap: 1.5rem;
395
- }
396
-
397
- .mt-preview-scroll::-webkit-scrollbar {
398
- width: 6px;
399
- }
400
-
401
- .mt-preview-scroll::-webkit-scrollbar-track {
402
- background: transparent;
403
- }
404
-
405
- .mt-preview-scroll::-webkit-scrollbar-thumb {
406
- background: rgba(148, 163, 184, 0.3);
407
- border-radius: 9999px;
408
- }
409
-
410
- :global(.mt-prev-item) {
411
- border-bottom: 1px solid var(--mt-border);
412
- padding-bottom: 1rem;
413
- }
414
-
415
- :global(.mt-prev-meta) {
416
- display: flex;
417
- align-items: baseline;
418
- gap: 0.5rem;
419
- margin-bottom: 0.25rem;
420
- font-size: 0.75rem;
421
- color: var(--mt-muted);
422
- }
423
-
424
- :global(.mt-prev-text) {
425
- font-weight: 700;
426
- color: var(--mt-text);
427
- white-space: nowrap;
428
- overflow: hidden;
429
- text-overflow: ellipsis;
430
- margin: 0;
431
- }
432
-
433
- :global(.mt-sub) {
434
- color: var(--mt-muted);
435
- margin: 0.25rem 0 0;
436
- white-space: nowrap;
437
- overflow: hidden;
438
- text-overflow: ellipsis;
439
- line-height: 1.4;
440
- }
441
-
442
- .mt-copy-section {
443
- display: flex;
444
- flex-direction: column;
445
- gap: 0.5rem;
446
- }
447
-
448
- .mt-copy-btn {
449
- width: 100%;
450
- padding: 0.75rem 1.5rem;
451
- background: var(--mt-btn-bg);
452
- color: #fff;
453
- border: none;
454
- border-radius: 0.75rem;
455
- font-size: 0.875rem;
456
- font-weight: 700;
457
- cursor: pointer;
458
- box-shadow: 0 4px 12px rgba(79, 70, 229, 0.3);
459
- transition: background 0.15s, box-shadow 0.15s, transform 0.1s;
460
- }
461
-
462
- .mt-copy-btn:hover {
463
- background: var(--mt-btn-hover);
464
- box-shadow: 0 6px 16px rgba(79, 70, 229, 0.4);
465
- }
466
-
467
- .mt-copy-btn:active {
468
- transform: scale(0.98);
469
- }
470
-
471
- .mt-feedback {
472
- text-align: center;
473
- font-size: 0.8125rem;
474
- font-weight: 600;
475
- color: var(--mt-feedback-color);
476
- opacity: 0;
477
- transition: opacity 0.3s;
478
- margin: 0;
479
- }
480
- </style>
@@ -0,0 +1,29 @@
1
+ import type { DeveloperToolEntry, ToolLocaleContent } from '../../types';
2
+ import type { MusicalTypographyUI } from './ui';
3
+
4
+ export type MusicalTypographyLocaleContent = ToolLocaleContent<MusicalTypographyUI>;
5
+
6
+ export const musicalTypography: DeveloperToolEntry<MusicalTypographyUI> = {
7
+ id: 'musical-typography',
8
+ icons: {
9
+ bg: 'mdi:music-note',
10
+ fg: 'mdi:format-size',
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
+ };
@@ -1,34 +1,5 @@
1
- import type { DeveloperToolEntry, ToolLocaleContent, ToolDefinition } from '../../types';
2
- import type { MusicalTypographyUI } from './ui';
3
-
4
- export type MusicalTypographyLocaleContent = ToolLocaleContent<MusicalTypographyUI>;
5
-
6
- export const musicalTypography: DeveloperToolEntry<MusicalTypographyUI> = {
7
- id: 'musical-typography',
8
- icons: {
9
- bg: 'mdi:music-note',
10
- fg: 'mdi:format-size',
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 { musicalTypography } from './entry';
2
+ export * from './entry';
32
3
  export const MUSICAL_TYPOGRAPHY_TOOL: ToolDefinition = {
33
4
  entry: musicalTypography,
34
5
  Component: () => import('./component.astro'),
@@ -0,0 +1,289 @@
1
+ .mt-root {
2
+ --mt-card-bg: #fff;
3
+ --mt-border: #e2e8f0;
4
+ --mt-text: #1e293b;
5
+ --mt-muted: #64748b;
6
+ --mt-accent: #6366f1;
7
+ --mt-accent-bg: rgba(99, 102, 241, 0.08);
8
+ --mt-input-bg: #f8fafc;
9
+ --mt-input-border: #e2e8f0;
10
+ --mt-calc-bg: rgba(99, 102, 241, 0.05);
11
+ --mt-calc-border: rgba(99, 102, 241, 0.15);
12
+ --mt-preview-bg: #f8fafc;
13
+ --mt-base-color: #6366f1;
14
+ --mt-btn-bg: #4f46e5;
15
+ --mt-btn-hover: #4338ca;
16
+ --mt-feedback-color: #059669;
17
+ }
18
+
19
+ :global(.theme-dark) .mt-root {
20
+ --mt-card-bg: #1e293b;
21
+ --mt-border: #334155;
22
+ --mt-text: #f1f5f9;
23
+ --mt-muted: #94a3b8;
24
+ --mt-input-bg: #0f172a;
25
+ --mt-input-border: #475569;
26
+ --mt-calc-bg: rgba(99, 102, 241, 0.1);
27
+ --mt-calc-border: rgba(99, 102, 241, 0.25);
28
+ --mt-preview-bg: rgba(15, 23, 42, 0.5);
29
+ --mt-base-color: #818cf8;
30
+ --mt-btn-bg: #4f46e5;
31
+ --mt-btn-hover: #6366f1;
32
+ --mt-feedback-color: #34d399;
33
+ }
34
+
35
+ .mt-grid {
36
+ display: grid;
37
+ grid-template-columns: 1fr 1fr;
38
+ gap: 2rem;
39
+ align-items: start;
40
+ }
41
+
42
+ @media (max-width: 640px) {
43
+ .mt-grid {
44
+ grid-template-columns: 1fr;
45
+ }
46
+ }
47
+
48
+ .mt-card {
49
+ background: var(--mt-card-bg);
50
+ border: 1px solid var(--mt-border);
51
+ border-radius: 1rem;
52
+ box-shadow: 0 4px 24px rgba(0, 0, 0, 0.06);
53
+ overflow: hidden;
54
+ }
55
+
56
+ .mt-card-header {
57
+ display: flex;
58
+ align-items: center;
59
+ gap: 0.75rem;
60
+ padding: 1.25rem 1.5rem;
61
+ border-bottom: 1px solid var(--mt-border);
62
+ }
63
+
64
+ .mt-card-header-preview {
65
+ background: rgba(236, 72, 153, 0.04);
66
+ }
67
+
68
+ :global(.theme-dark) .mt-card-header-preview {
69
+ background: rgba(236, 72, 153, 0.08);
70
+ }
71
+
72
+ .mt-card-title {
73
+ font-size: 1.125rem;
74
+ font-weight: 700;
75
+ color: var(--mt-text);
76
+ margin: 0;
77
+ }
78
+
79
+ .mt-card-body {
80
+ padding: 1.5rem;
81
+ display: flex;
82
+ flex-direction: column;
83
+ gap: 1.5rem;
84
+ }
85
+
86
+ .mt-preview-body {
87
+ flex: 1;
88
+ }
89
+
90
+ .mt-card-preview {
91
+ display: flex;
92
+ flex-direction: column;
93
+ }
94
+
95
+ .mt-label {
96
+ display: block;
97
+ font-size: 0.875rem;
98
+ font-weight: 600;
99
+ color: var(--mt-text);
100
+ margin-bottom: 0.5rem;
101
+ }
102
+
103
+ .mt-input-wrap {
104
+ position: relative;
105
+ }
106
+
107
+ .mt-input,
108
+ .mt-select {
109
+ display: block;
110
+ width: 100%;
111
+ padding: 0.625rem 0.75rem;
112
+ background: var(--mt-input-bg);
113
+ border: 1px solid var(--mt-input-border);
114
+ border-radius: 0.625rem;
115
+ color: var(--mt-text);
116
+ font-size: 0.875rem;
117
+ box-sizing: border-box;
118
+ box-shadow: 0 1px 2px rgba(0, 0, 0, 0.04);
119
+ transition: border-color 0.15s, box-shadow 0.15s;
120
+ }
121
+
122
+ .mt-input {
123
+ padding-right: 2.5rem;
124
+ }
125
+
126
+ .mt-input:focus,
127
+ .mt-select:focus {
128
+ outline: 2px solid var(--mt-accent);
129
+ outline-offset: 2px;
130
+ border-color: var(--mt-accent);
131
+ }
132
+
133
+ .mt-input-suffix {
134
+ position: absolute;
135
+ right: 0.75rem;
136
+ top: 50%;
137
+ transform: translateY(-50%);
138
+ font-size: 0.875rem;
139
+ color: var(--mt-muted);
140
+ pointer-events: none;
141
+ }
142
+
143
+ .mt-hint {
144
+ margin: 0.375rem 0 0;
145
+ font-size: 0.75rem;
146
+ color: var(--mt-muted);
147
+ }
148
+
149
+ .mt-calc-box {
150
+ background: var(--mt-calc-bg);
151
+ border: 1px solid var(--mt-calc-border);
152
+ border-radius: 0.75rem;
153
+ padding: 1rem;
154
+ }
155
+
156
+ .mt-calc-title {
157
+ font-size: 0.6875rem;
158
+ font-weight: 700;
159
+ color: var(--mt-accent);
160
+ text-transform: uppercase;
161
+ letter-spacing: 0.06em;
162
+ margin: 0 0 0.75rem;
163
+ }
164
+
165
+ .mt-scale-list {
166
+ display: flex;
167
+ flex-direction: column;
168
+ gap: 0.25rem;
169
+ }
170
+
171
+ :global(.mt-scale-row) {
172
+ display: flex;
173
+ justify-content: space-between;
174
+ font-size: 0.8125rem;
175
+ color: var(--mt-muted);
176
+ padding: 0.125rem 0;
177
+ }
178
+
179
+ :global(.mt-scale-base) {
180
+ color: var(--mt-base-color);
181
+ font-weight: 700;
182
+ background: var(--mt-accent-bg);
183
+ border-radius: 0.25rem;
184
+ padding: 0.125rem 0.375rem;
185
+ margin: 0 -0.375rem;
186
+ }
187
+
188
+ .mt-preview-scroll-wrap {
189
+ background: var(--mt-preview-bg);
190
+ border: 1px solid var(--mt-border);
191
+ border-radius: 0.75rem;
192
+ height: 18rem;
193
+ overflow: hidden;
194
+ position: relative;
195
+ }
196
+
197
+ .mt-preview-scroll {
198
+ position: absolute;
199
+ inset: 0;
200
+ padding: 1rem;
201
+ overflow-y: auto;
202
+ display: flex;
203
+ flex-direction: column;
204
+ gap: 1.5rem;
205
+ }
206
+
207
+ .mt-preview-scroll::-webkit-scrollbar {
208
+ width: 6px;
209
+ }
210
+
211
+ .mt-preview-scroll::-webkit-scrollbar-track {
212
+ background: transparent;
213
+ }
214
+
215
+ .mt-preview-scroll::-webkit-scrollbar-thumb {
216
+ background: rgba(148, 163, 184, 0.3);
217
+ border-radius: 9999px;
218
+ }
219
+
220
+ :global(.mt-prev-item) {
221
+ border-bottom: 1px solid var(--mt-border);
222
+ padding-bottom: 1rem;
223
+ }
224
+
225
+ :global(.mt-prev-meta) {
226
+ display: flex;
227
+ align-items: baseline;
228
+ gap: 0.5rem;
229
+ margin-bottom: 0.25rem;
230
+ font-size: 0.75rem;
231
+ color: var(--mt-muted);
232
+ }
233
+
234
+ :global(.mt-prev-text) {
235
+ font-weight: 700;
236
+ color: var(--mt-text);
237
+ white-space: nowrap;
238
+ overflow: hidden;
239
+ text-overflow: ellipsis;
240
+ margin: 0;
241
+ }
242
+
243
+ :global(.mt-sub) {
244
+ color: var(--mt-muted);
245
+ margin: 0.25rem 0 0;
246
+ white-space: nowrap;
247
+ overflow: hidden;
248
+ text-overflow: ellipsis;
249
+ line-height: 1.4;
250
+ }
251
+
252
+ .mt-copy-section {
253
+ display: flex;
254
+ flex-direction: column;
255
+ gap: 0.5rem;
256
+ }
257
+
258
+ .mt-copy-btn {
259
+ width: 100%;
260
+ padding: 0.75rem 1.5rem;
261
+ background: var(--mt-btn-bg);
262
+ color: #fff;
263
+ border: none;
264
+ border-radius: 0.75rem;
265
+ font-size: 0.875rem;
266
+ font-weight: 700;
267
+ cursor: pointer;
268
+ box-shadow: 0 4px 12px rgba(79, 70, 229, 0.3);
269
+ transition: background 0.15s, box-shadow 0.15s, transform 0.1s;
270
+ }
271
+
272
+ .mt-copy-btn:hover {
273
+ background: var(--mt-btn-hover);
274
+ box-shadow: 0 6px 16px rgba(79, 70, 229, 0.4);
275
+ }
276
+
277
+ .mt-copy-btn:active {
278
+ transform: scale(0.98);
279
+ }
280
+
281
+ .mt-feedback {
282
+ text-align: center;
283
+ font-size: 0.8125rem;
284
+ font-weight: 600;
285
+ color: var(--mt-feedback-color);
286
+ opacity: 0;
287
+ transition: opacity 0.3s;
288
+ margin: 0;
289
+ }