@jjlmoya/utils-audiovisual 1.4.0 → 1.6.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.
@@ -1,7 +1,6 @@
1
1
  ---
2
2
  import { Icon } from 'astro-icon/components';
3
3
  import type { PrintQualityCalculatorUI } from './index';
4
- import './style.css';
5
4
 
6
5
  interface Props {
7
6
  ui: PrintQualityCalculatorUI;
@@ -10,7 +9,7 @@ interface Props {
10
9
  const { ui } = Astro.props;
11
10
  ---
12
11
 
13
- <div class="pq-wrapper">
12
+ <div class="pq-wrapper" id="pq-root" data-ui={JSON.stringify(ui)}>
14
13
  <div
15
14
  id="drop-zone"
16
15
  class="pq-drop-zone pq-group"
@@ -81,10 +80,10 @@ const { ui } = Astro.props;
81
80
  </div>
82
81
 
83
82
  <div class="pq-presets">
84
- <button class="pq-preset-btn" data-val="72">Pantalla (72)</button>
85
- <button class="pq-preset-btn" data-val="150">Periódico (150)</button>
86
- <button class="pq-preset-btn pq-preset-active" data-val="300">Imprenta (300)</button>
87
- <button class="pq-preset-btn" data-val="600">Fine Art (600)</button>
83
+ <button class="pq-preset-btn" data-val="72">{ui.dpiScreenLabel} (72)</button>
84
+ <button class="pq-preset-btn" data-val="150">{ui.dpiNewspaperLabel} (150)</button>
85
+ <button class="pq-preset-btn pq-preset-active" data-val="300">{ui.dpiPrintLabel} (300)</button>
86
+ <button class="pq-preset-btn" data-val="600">{ui.dpiFineArtLabel} (600)</button>
88
87
  </div>
89
88
  </div>
90
89
 
@@ -136,18 +135,41 @@ const { ui } = Astro.props;
136
135
  </div>
137
136
  </div>
138
137
 
139
- <script is:inline>
138
+ <script>
139
+ const root = document.currentScript?.closest('[data-ui]') || document.getElementById('pq-root');
140
+ const ui = root ? JSON.parse(root.dataset.ui || '{}') : {};
141
+
140
142
  const PAPER_FORMATS = [
141
- { name: "A6 (Postal)", w: 10.5, h: 14.8 },
142
- { name: "A5 (Cuartilla)", w: 14.8, h: 21.0 },
143
- { name: "A4 (Folio)", w: 21.0, h: 29.7 },
144
- { name: "A3 (Doble Folio)", w: 29.7, h: 42.0 },
145
- { name: "A2 (Poster Pequeño)", w: 42.0, h: 59.4 },
146
- { name: "A1 (Poster Grande)", w: 59.4, h: 84.1 },
147
- { name: "A0 (Plano)", w: 84.1, h: 118.9 },
143
+ { key: "postal", label: "A6", w: 10.5, h: 14.8 },
144
+ { key: "quartilla", label: "A5", w: 14.8, h: 21.0 },
145
+ { key: "folio", label: "A4", w: 21.0, h: 29.7 },
146
+ { key: "doubleFolio", label: "A3", w: 29.7, h: 42.0 },
147
+ { key: "smallPoster", label: "A2", w: 42.0, h: 59.4 },
148
+ { key: "largePoster", label: "A1", w: 59.4, h: 84.1 },
149
+ { key: "plane", label: "A0", w: 84.1, h: 118.9 },
148
150
  ];
149
151
 
150
152
  function initPQCalc() {
153
+ console.log('DEBUG: initPQCalc called');
154
+ console.log('DEBUG: ui object:', ui);
155
+ console.log('DEBUG: ui.formatPostal:', ui.formatPostal);
156
+
157
+ function getFormatName(format) {
158
+ const keyMap = {
159
+ postal: 'formatPostal',
160
+ quartilla: 'formatQuartilla',
161
+ folio: 'formatFolio',
162
+ doubleFolio: 'formatDoubleFolio',
163
+ smallPoster: 'formatSmallPoster',
164
+ largePoster: 'formatLargePoster',
165
+ plane: 'formatPlane'
166
+ };
167
+ const uiKey = keyMap[format.key];
168
+ const result = format.label + ' (' + (ui[uiKey] || format.key) + ')';
169
+ console.log('DEBUG: getFormatName for', format.key, '=', result, '(uiKey:', uiKey, ', ui[uiKey]:', ui[uiKey], ')');
170
+ return result;
171
+ }
172
+
151
173
  const dropZone = document.getElementById("drop-zone");
152
174
  const fileInput = document.getElementById("file-input");
153
175
  const resultsArea = document.getElementById("results-area");
@@ -210,7 +232,7 @@ const { ui } = Astro.props;
210
232
  });
211
233
 
212
234
  function processFile(file) {
213
- if (!file.type.startsWith("image/")) { alert("Por favor selecciona una imagen válida"); return; }
235
+ if (!file.type.startsWith("image/")) { alert(ui.invalidImageError); return; }
214
236
  const reader = new FileReader();
215
237
  reader.onload = function(e) {
216
238
  const img = new Image();
@@ -270,30 +292,32 @@ const { ui } = Astro.props;
270
292
  function updateQualityBadge(dpi) {
271
293
  if (!qualityText || !qualityDesc || !qualityBadge) return;
272
294
  if (dpi >= 300) {
273
- qualityText.textContent = "Calidad Excelente";
274
- qualityDesc.textContent = "Ideal para revistas de arte, libros de fotografía y visualización a menos de 30cm.";
295
+ qualityText.textContent = ui.qualityExcellent;
296
+ qualityDesc.textContent = ui.qualityExcellentDesc;
275
297
  qualityBadge.className = "pq-quality-badge pq-badge-green";
276
298
  } else if (dpi >= 150) {
277
- qualityText.textContent = "Calidad Buena";
278
- qualityDesc.textContent = "Suficiente para pósters, periódicos y visualización a más de 50cm de distancia.";
299
+ qualityText.textContent = ui.qualityGood;
300
+ qualityDesc.textContent = ui.qualityGoodDesc;
279
301
  qualityBadge.className = "pq-quality-badge pq-badge-yellow";
280
302
  } else if (dpi >= 72) {
281
- qualityText.textContent = "Calidad Pantalla/Baja";
282
- qualityDesc.textContent = "Adecuado solo para visualización digital o vallas publicitarias lejanas (>2 metros).";
303
+ qualityText.textContent = ui.qualityFair;
304
+ qualityDesc.textContent = ui.qualityFairDesc;
283
305
  qualityBadge.className = "pq-quality-badge pq-badge-red";
284
306
  } else {
285
- qualityText.textContent = "No Apto para impresión";
286
- qualityDesc.textContent = "La imagen se verá pixelada. Usar solo para iconos pequeños o vistas muy lejanas.";
307
+ qualityText.textContent = ui.qualityPoor;
308
+ qualityDesc.textContent = ui.qualityPoorDesc;
287
309
  qualityBadge.className = "pq-quality-badge pq-badge-slate";
288
310
  }
289
311
  }
290
312
 
291
313
  function updateFormatsTable(cmW, cmH) {
314
+ console.log('DEBUG: updateFormatsTable called, ui.supportedText:', ui.supportedText);
292
315
  if (!formatsTableBody) return;
293
316
  formatsTableBody.innerHTML = "";
294
317
  const imgMin = Math.min(cmW, cmH);
295
318
  const imgMax = Math.max(cmW, cmH);
296
319
  PAPER_FORMATS.forEach(function(paper) {
320
+ console.log('DEBUG: Processing paper format:', paper.key);
297
321
  const paperMin = Math.min(paper.w, paper.h);
298
322
  const paperMax = Math.max(paper.w, paper.h);
299
323
  const covers = imgMin >= paperMin - 0.1 && imgMax >= paperMax - 0.1;
@@ -301,9 +325,9 @@ const { ui } = Astro.props;
301
325
  const row = document.createElement("tr");
302
326
  row.className = "pq-formats-row";
303
327
  const statusHtml = covers
304
- ? '<span class="pq-status pq-status-ok"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"/></svg> (Cubierto)</span>'
305
- : '<span class="pq-status pq-status-no"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M12,2L1,21H23M12,6L19.53,19H4.47M11,10V14H13V10M11,16V18H13V16"/></svg> No (' + coverage.toFixed(0) + '%)</span>';
306
- row.innerHTML = '<td class="pq-td pq-td-name">' + paper.name + '</td><td class="pq-td pq-td-dim">' + paper.w + ' x ' + paper.h + '</td><td class="pq-td">' + statusHtml + '</td>';
328
+ ? '<span class="pq-status pq-status-ok"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"/></svg> ' + ui.supportedText + '</span>'
329
+ : '<span class="pq-status pq-status-no"><svg width="16" height="16" viewBox="0 0 24 24" fill="currentColor"><path d="M12,2L1,21H23M12,6L19.53,19H4.47M11,10V14H13V10M11,16V18H13V16"/></svg> ' + ui.notSupportedPrefix + coverage.toFixed(0) + '%)</span>';
330
+ row.innerHTML = '<td class="pq-td pq-td-name">' + getFormatName(paper) + '</td><td class="pq-td pq-td-dim">' + paper.w + ' x ' + paper.h + '</td><td class="pq-td">' + statusHtml + '</td>';
307
331
  formatsTableBody.appendChild(row);
308
332
  });
309
333
  }
@@ -316,3 +340,489 @@ const { ui } = Astro.props;
316
340
  }
317
341
  document.addEventListener("astro:page-load", initPQCalc);
318
342
  </script>
343
+
344
+ <style>
345
+ :root {
346
+ --pq-bg: #fff;
347
+ --pq-border: #cbd5e1;
348
+ --pq-primary: #6366f1;
349
+ --pq-primary-light: #e0e7ff;
350
+ --pq-accent: #4f46e5;
351
+ }
352
+
353
+ :global(.theme-dark) {
354
+ --pq-bg: #0f172a;
355
+ --pq-border: #334155;
356
+ --pq-primary: #6366f1;
357
+ --pq-primary-light: rgba(99, 102, 241, 0.2);
358
+ --pq-accent: #818cf8;
359
+ }
360
+
361
+ :global(.pq-wrapper) {
362
+ width: 100%;
363
+ max-width: 56rem;
364
+ margin: 0 auto;
365
+ display: flex;
366
+ flex-direction: column;
367
+ gap: 2rem;
368
+ padding: 1rem;
369
+ }
370
+
371
+ .pq-hidden {
372
+ display: none;
373
+ }
374
+
375
+ :global(.pq-drop-zone) {
376
+ position: relative;
377
+ cursor: pointer;
378
+ border: 2px dashed var(--pq-border);
379
+ border-radius: 1rem;
380
+ padding: 3rem;
381
+ transition: border-color 0.3s, background 0.3s;
382
+ }
383
+
384
+ :global(.theme-dark .pq-drop-zone) {
385
+ border-color: var(--pq-border);
386
+ }
387
+ :global(.pq-drop-zone:hover),
388
+ :global(.pq-drop-zone.pq-drop-active) {
389
+ border-color: var(--pq-primary);
390
+ background: rgba(99, 102, 241, 0.04);
391
+ }
392
+ :global(.pq-drop-inner) {
393
+ display: flex;
394
+ flex-direction: column;
395
+ align-items: center;
396
+ justify-content: center;
397
+ text-align: center;
398
+ gap: 1rem;
399
+ }
400
+ :global(.pq-upload-icon-wrap) {
401
+ width: 5rem;
402
+ height: 5rem;
403
+ background: var(--pq-primary-light);
404
+ border-radius: 50%;
405
+ display: flex;
406
+ align-items: center;
407
+ justify-content: center;
408
+ color: var(--pq-accent);
409
+ transition: transform 0.3s;
410
+ }
411
+
412
+ :global(.theme-dark .pq-upload-icon-wrap) {
413
+ background: rgba(99, 102, 241, 0.2);
414
+ color: #818cf8;
415
+ }
416
+ :global(.pq-drop-zone:hover .pq-upload-icon-wrap) {
417
+ transform: scale(1.1);
418
+ }
419
+ :global(.pq-drop-title) {
420
+ font-size: 1.25rem;
421
+ font-weight: 700;
422
+ color: #0f172a;
423
+ margin: 0;
424
+ }
425
+
426
+ :global(.theme-dark .pq-drop-title) {
427
+ color: #f1f5f9;
428
+ }
429
+ :global(.pq-drop-sub) {
430
+ color: #64748b;
431
+ margin: 0.25rem 0 0;
432
+ font-size: 0.95rem;
433
+ }
434
+ :global(.pq-drop-overlay) {
435
+ position: absolute;
436
+ inset: 0;
437
+ background: linear-gradient(135deg, rgba(99,102,241,0.04), rgba(168,85,247,0.04));
438
+ border-radius: 1rem;
439
+ opacity: 0;
440
+ pointer-events: none;
441
+ transition: opacity 0.3s;
442
+ }
443
+ :global(.pq-drop-zone:hover .pq-drop-overlay) { opacity: 1; }
444
+
445
+ :global(.pq-results) {
446
+ display: flex;
447
+ flex-direction: column;
448
+ gap: 2rem;
449
+ animation: pq-fade-up 0.5s ease-out;
450
+ }
451
+
452
+ @keyframes pq-fade-up {
453
+ from {
454
+ opacity: 0;
455
+ transform: translateY(1.25rem);
456
+ }
457
+ to {
458
+ opacity: 1;
459
+ transform: translateY(0);
460
+ }
461
+ }
462
+
463
+ :global(.pq-file-card) {
464
+ background: #fff;
465
+ border: 1px solid #e2e8f0;
466
+ border-radius: 0.75rem;
467
+ box-shadow: 0 4px 24px -8px rgba(0,0,0,0.1);
468
+ padding: 1.5rem;
469
+ }
470
+
471
+ :global(.theme-dark .pq-file-card) {
472
+ background: #0f172a;
473
+ border-color: #1e293b;
474
+ }
475
+ :global(.pq-file-left) {
476
+ display: flex;
477
+ align-items: center;
478
+ gap: 1.5rem;
479
+ }
480
+ :global(.pq-preview-wrap) {
481
+ position: relative;
482
+ width: 8rem;
483
+ height: 8rem;
484
+ flex-shrink: 0;
485
+ }
486
+ :global(.pq-preview-img) {
487
+ width: 100%;
488
+ height: 100%;
489
+ object-fit: cover;
490
+ border-radius: 0.5rem;
491
+ box-shadow: 0 2px 8px rgba(0,0,0,0.15);
492
+ }
493
+ :global(.pq-file-name) {
494
+ font-weight: 700;
495
+ color: #0f172a;
496
+ font-size: 1rem;
497
+ margin: 0 0 0.5rem;
498
+ overflow: hidden;
499
+ text-overflow: ellipsis;
500
+ white-space: nowrap;
501
+ max-width: 20rem;
502
+ }
503
+
504
+ :global(.theme-dark .pq-file-name) {
505
+ color: #f1f5f9;
506
+ }
507
+ :global(.pq-file-meta) {
508
+ display: flex;
509
+ flex-wrap: wrap;
510
+ gap: 1rem;
511
+ }
512
+ :global(.pq-meta-item) {
513
+ display: flex;
514
+ align-items: center;
515
+ gap: 0.25rem;
516
+ font-size: 0.85rem;
517
+ color: #64748b;
518
+ }
519
+
520
+ :global(.pq-main-grid) {
521
+ display: grid;
522
+ grid-template-columns: 1fr 1fr;
523
+ gap: 2rem;
524
+ }
525
+
526
+ @media (max-width: 640px) {
527
+ .pq-main-grid { grid-template-columns: 1fr; }
528
+ }
529
+
530
+ :global(.pq-config-panel) {
531
+ background: #f8fafc;
532
+ border: 1px solid #e2e8f0;
533
+ border-radius: 0.75rem;
534
+ padding: 1.5rem;
535
+ }
536
+
537
+ :global(.theme-dark .pq-config-panel) {
538
+ background: rgba(30, 41, 59, 0.5);
539
+ border-color: var(--pq-border);
540
+ }
541
+ :global(.pq-config-label) {
542
+ display: block;
543
+ font-size: 0.875rem;
544
+ font-weight: 500;
545
+ color: #475569;
546
+ margin-bottom: 1rem;
547
+ }
548
+
549
+ :global(.theme-dark .pq-config-label) {
550
+ color: #94a3b8;
551
+ }
552
+ :global(.pq-slider) {
553
+ width: 100%;
554
+ height: 0.5rem;
555
+ background: #e2e8f0;
556
+ border-radius: 0.5rem;
557
+ appearance: none;
558
+ cursor: pointer;
559
+ accent-color: #6366f1;
560
+ margin-bottom: 1rem;
561
+ }
562
+
563
+ :global(.theme-dark .pq-slider) {
564
+ background: #334155;
565
+ }
566
+ :global(.pq-dpi-row) {
567
+ display: flex;
568
+ align-items: center;
569
+ gap: 1rem;
570
+ margin-bottom: 1.5rem;
571
+ }
572
+ :global(.pq-dpi-number) {
573
+ width: 6rem;
574
+ border: 1px solid #e2e8f0;
575
+ border-radius: 0.5rem;
576
+ background: #fff;
577
+ color: #0f172a;
578
+ font-size: 1rem;
579
+ font-weight: 700;
580
+ text-align: center;
581
+ padding: 0.4rem 0.5rem;
582
+ outline: none;
583
+ }
584
+ :global(.pq-dpi-number:focus) { border-color: var(--pq-primary); }
585
+
586
+ :global(.theme-dark .pq-dpi-number) {
587
+ background: #0f172a;
588
+ border-color: var(--pq-border);
589
+ color: #f1f5f9;
590
+ }
591
+ :global(.pq-dpi-label) {
592
+ font-size: 0.875rem;
593
+ color: #64748b;
594
+ }
595
+ :global(.pq-presets) {
596
+ display: flex;
597
+ flex-wrap: wrap;
598
+ gap: 0.5rem;
599
+ }
600
+ :global(.pq-preset-btn) {
601
+ padding: 0.25rem 0.75rem;
602
+ font-size: 0.75rem;
603
+ font-weight: 500;
604
+ border-radius: 999px;
605
+ background: #e2e8f0;
606
+ color: #475569;
607
+ border: none;
608
+ cursor: pointer;
609
+ transition: background 0.15s, color 0.15s;
610
+ }
611
+ :global(.pq-preset-btn:hover) { background: #cbd5e1; }
612
+
613
+ :global(.theme-dark .pq-preset-btn) {
614
+ background: #334155;
615
+ color: #94a3b8;
616
+ }
617
+
618
+ :global(.theme-dark .pq-preset-btn:hover) {
619
+ background: #475569;
620
+ }
621
+ :global(.pq-preset-active) {
622
+ background: var(--pq-primary-light);
623
+ color: #4338ca;
624
+ box-shadow: 0 0 0 1px rgba(99, 102, 241, 0.2);
625
+ }
626
+
627
+ :global(.theme-dark .pq-preset-active) {
628
+ background: rgba(99, 102, 241, 0.3);
629
+ color: #a5b4fc;
630
+ }
631
+
632
+ :global(.pq-output-panel) {
633
+ display: flex;
634
+ }
635
+ :global(.pq-output-gradient) {
636
+ flex: 1;
637
+ display: flex;
638
+ flex-direction: column;
639
+ justify-content: center;
640
+ background: linear-gradient(135deg, #6366f1, #a855f7);
641
+ border-radius: 0.75rem;
642
+ padding: 1.5rem;
643
+ color: #fff;
644
+ box-shadow: 0 10px 40px -10px rgba(99,102,241,0.4);
645
+ position: relative;
646
+ overflow: hidden;
647
+ }
648
+ :global(.pq-output-blur-bg) {
649
+ position: absolute;
650
+ top: 0; right: 0;
651
+ width: 8rem; height: 8rem;
652
+ background: rgba(255,255,255,0.1);
653
+ border-radius: 50%;
654
+ filter: blur(2rem);
655
+ transform: translate(2rem, -2rem);
656
+ pointer-events: none;
657
+ }
658
+ :global(.pq-output-subtitle) {
659
+ font-size: 0.75rem;
660
+ font-weight: 500;
661
+ text-transform: uppercase;
662
+ letter-spacing: 0.05em;
663
+ color: rgba(224,231,255,0.9);
664
+ margin: 0 0 0.5rem;
665
+ position: relative;
666
+ }
667
+ :global(.pq-output-size) {
668
+ display: flex;
669
+ align-items: baseline;
670
+ gap: 0.5rem;
671
+ font-size: 2.5rem;
672
+ font-weight: 900;
673
+ margin-bottom: 0.25rem;
674
+ position: relative;
675
+ }
676
+ :global(.pq-size-sep) {
677
+ font-size: 1.5rem;
678
+ opacity: 0.5;
679
+ }
680
+ :global(.pq-size-unit) {
681
+ font-size: 1.5rem;
682
+ }
683
+ :global(.pq-output-inches) {
684
+ color: rgba(199, 210, 254, 0.8);
685
+ font-size: 0.875rem;
686
+ margin-bottom: 1.5rem;
687
+ position: relative;
688
+ }
689
+ :global(.pq-quality-section) {
690
+ padding-top: 1rem;
691
+ border-top: 1px solid rgba(255,255,255,0.2);
692
+ position: relative;
693
+ }
694
+ :global(.pq-quality-badge) {
695
+ display: inline-flex;
696
+ align-items: center;
697
+ gap: 0.375rem;
698
+ padding: 0.25rem 0.75rem;
699
+ border-radius: 999px;
700
+ font-size: 0.875rem;
701
+ font-weight: 700;
702
+ background: rgba(255,255,255,0.2);
703
+ backdrop-filter: blur(4px);
704
+ margin-bottom: 0.5rem;
705
+ }
706
+ :global(.pq-badge-green) {
707
+ background: rgba(16, 185, 129, 0.25);
708
+ box-shadow: 0 0 0 1px rgba(52, 211, 153, 0.3);
709
+ }
710
+
711
+ :global(.pq-badge-yellow) {
712
+ background: rgba(234, 179, 8, 0.25);
713
+ box-shadow: 0 0 0 1px rgba(253, 224, 71, 0.3);
714
+ }
715
+
716
+ :global(.pq-badge-red) {
717
+ background: rgba(239, 68, 68, 0.25);
718
+ box-shadow: 0 0 0 1px rgba(252, 165, 165, 0.3);
719
+ }
720
+
721
+ :global(.pq-badge-slate) {
722
+ background: rgba(100, 116, 139, 0.25);
723
+ box-shadow: 0 0 0 1px rgba(148, 163, 184, 0.3);
724
+ }
725
+ :global(.pq-quality-desc) {
726
+ font-size: 0.875rem;
727
+ color: rgba(199,210,254,0.9);
728
+ line-height: 1.4;
729
+ margin: 0;
730
+ }
731
+
732
+ :global(.pq-formats-card) {
733
+ background: #fff;
734
+ border: 1px solid #e2e8f0;
735
+ border-radius: 0.75rem;
736
+ padding: 1.5rem;
737
+ }
738
+
739
+ :global(.theme-dark .pq-formats-card) {
740
+ background: #0f172a;
741
+ border-color: #1e293b;
742
+ }
743
+ :global(.pq-formats-title) {
744
+ display: flex;
745
+ align-items: center;
746
+ gap: 0.5rem;
747
+ font-weight: 700;
748
+ font-size: 1rem;
749
+ color: #0f172a;
750
+ margin: 0 0 1rem;
751
+ }
752
+
753
+ :global(.theme-dark .pq-formats-title) {
754
+ color: #f1f5f9;
755
+ }
756
+ :global(.pq-formats-scroll) {
757
+ overflow-x: auto;
758
+ }
759
+ :global(.pq-formats-table) {
760
+ width: 100%;
761
+ border-collapse: collapse;
762
+ font-size: 0.875rem;
763
+ }
764
+ :global(.pq-formats-table th) {
765
+ text-align: left;
766
+ padding: 0.75rem 1rem;
767
+ font-size: 0.75rem;
768
+ font-weight: 700;
769
+ text-transform: uppercase;
770
+ letter-spacing: 0.05em;
771
+ color: #475569;
772
+ background: #f8fafc;
773
+ }
774
+
775
+ :global(.theme-dark .pq-formats-table th) {
776
+ background: #1e293b;
777
+ color: #94a3b8;
778
+ }
779
+ :global(.pq-formats-row) {
780
+ border-bottom: 1px solid #f1f5f9;
781
+ transition: background 0.15s;
782
+ }
783
+
784
+ :global(.pq-formats-row:hover) {
785
+ background: #f8fafc;
786
+ }
787
+
788
+ :global(.theme-dark .pq-formats-row) {
789
+ border-color: #1e293b;
790
+ }
791
+
792
+ :global(.theme-dark .pq-formats-row:hover) {
793
+ background: #1e293b;
794
+ }
795
+ :global(.pq-td) {
796
+ padding: 0.75rem 1rem;
797
+ color: #475569;
798
+ }
799
+
800
+ :global(.theme-dark .pq-td) {
801
+ color: #94a3b8;
802
+ }
803
+ :global(.pq-td-name) {
804
+ font-weight: 600;
805
+ color: #0f172a;
806
+ }
807
+
808
+ :global(.theme-dark .pq-td-name) {
809
+ color: #f1f5f9;
810
+ }
811
+ :global(.pq-status) {
812
+ display: inline-flex;
813
+ align-items: center;
814
+ gap: 0.35rem;
815
+ font-weight: 600;
816
+ font-size: 0.8rem;
817
+ }
818
+ :global(.pq-status-ok) { color: #16a34a; }
819
+ :global(.pq-status-no) { color: #d97706; }
820
+
821
+ :global(.theme-dark .pq-status-ok) {
822
+ color: #4ade80;
823
+ }
824
+
825
+ :global(.theme-dark .pq-status-no) {
826
+ color: #fbbf24;
827
+ }
828
+ </style>
@@ -14,7 +14,7 @@ const ui: PrintQualityCalculatorUI = {
14
14
  maxPrintTitle: "Maximum Print Size",
15
15
  standardFormatsTitle: "Supported Standard Formats",
16
16
  formatColumn: "Format",
17
- measureColumn: "Measurements (cm)",
17
+ measureColumn: "Measurements",
18
18
  supportColumn: "Supported?",
19
19
  qualityExcellent: "Excellent Quality",
20
20
  qualityGood: "Good Quality",
@@ -26,6 +26,20 @@ const ui: PrintQualityCalculatorUI = {
26
26
  qualityPoorDesc: "The image will look pixelated. Printing is not recommended.",
27
27
  unitCm: "cm",
28
28
  unitInches: "in",
29
+ dpiScreenLabel: "Screen",
30
+ dpiNewspaperLabel: "Newspaper",
31
+ dpiPrintLabel: "Printing",
32
+ dpiFineArtLabel: "Fine Art",
33
+ formatPostal: "Postcard",
34
+ formatQuartilla: "Quartilla",
35
+ formatFolio: "Folio",
36
+ formatDoubleFolio: "Double Folio",
37
+ formatSmallPoster: "Small Poster",
38
+ formatLargePoster: "Large Poster",
39
+ formatPlane: "Plane",
40
+ supportedText: "Yes (Covered)",
41
+ notSupportedPrefix: "No (",
42
+ invalidImageError: "Please select a valid image",
29
43
  faqTitle: "Frequently Asked Questions",
30
44
  bibliographyTitle: "References"
31
45
  };
@@ -14,7 +14,7 @@ const ui: PrintQualityCalculatorUI = {
14
14
  maxPrintTitle: "Tamaño Máximo de Impresión",
15
15
  standardFormatsTitle: "Formatos Estándar Soportados",
16
16
  formatColumn: "Formato",
17
- measureColumn: "Medidas (cm)",
17
+ measureColumn: "Medidas",
18
18
  supportColumn: "¿Soportado?",
19
19
  qualityExcellent: "Calidad Excelente",
20
20
  qualityGood: "Calidad Buena",
@@ -25,7 +25,21 @@ const ui: PrintQualityCalculatorUI = {
25
25
  qualityFairDesc: "Adecuado para visualización digital o vallas lejanas.",
26
26
  qualityPoorDesc: "La imagen se verá pixelada. No se recomienda imprimir.",
27
27
  unitCm: "cm",
28
- unitInches: "pulg"
28
+ unitInches: "pulg",
29
+ dpiScreenLabel: "Pantalla",
30
+ dpiNewspaperLabel: "Periódico",
31
+ dpiPrintLabel: "Imprenta",
32
+ dpiFineArtLabel: "Fine Art",
33
+ formatPostal: "Postal",
34
+ formatQuartilla: "Cuartilla",
35
+ formatFolio: "Folio",
36
+ formatDoubleFolio: "Doble Folio",
37
+ formatSmallPoster: "Poster Pequeño",
38
+ formatLargePoster: "Poster Grande",
39
+ formatPlane: "Plano",
40
+ supportedText: "Sí (Cubierto)",
41
+ notSupportedPrefix: "No (",
42
+ invalidImageError: "Por favor selecciona una imagen válida"
29
43
  };
30
44
 
31
45
  const faq: PrintQualityCalculatorLocaleContent['faq'] = [