@jjlmoya/utils-audiovisual 1.5.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.
@@ -9,7 +9,7 @@ interface Props {
9
9
  const { ui } = Astro.props;
10
10
  ---
11
11
 
12
- <div class="pq-wrapper">
12
+ <div class="pq-wrapper" id="pq-root" data-ui={JSON.stringify(ui)}>
13
13
  <div
14
14
  id="drop-zone"
15
15
  class="pq-drop-zone pq-group"
@@ -80,10 +80,10 @@ const { ui } = Astro.props;
80
80
  </div>
81
81
 
82
82
  <div class="pq-presets">
83
- <button class="pq-preset-btn" data-val="72">Pantalla (72)</button>
84
- <button class="pq-preset-btn" data-val="150">Periódico (150)</button>
85
- <button class="pq-preset-btn pq-preset-active" data-val="300">Imprenta (300)</button>
86
- <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>
87
87
  </div>
88
88
  </div>
89
89
 
@@ -135,18 +135,41 @@ const { ui } = Astro.props;
135
135
  </div>
136
136
  </div>
137
137
 
138
- <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
+
139
142
  const PAPER_FORMATS = [
140
- { name: "A6 (Postal)", w: 10.5, h: 14.8 },
141
- { name: "A5 (Cuartilla)", w: 14.8, h: 21.0 },
142
- { name: "A4 (Folio)", w: 21.0, h: 29.7 },
143
- { name: "A3 (Doble Folio)", w: 29.7, h: 42.0 },
144
- { name: "A2 (Poster Pequeño)", w: 42.0, h: 59.4 },
145
- { name: "A1 (Poster Grande)", w: 59.4, h: 84.1 },
146
- { 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 },
147
150
  ];
148
151
 
149
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
+
150
173
  const dropZone = document.getElementById("drop-zone");
151
174
  const fileInput = document.getElementById("file-input");
152
175
  const resultsArea = document.getElementById("results-area");
@@ -209,7 +232,7 @@ const { ui } = Astro.props;
209
232
  });
210
233
 
211
234
  function processFile(file) {
212
- if (!file.type.startsWith("image/")) { alert("Por favor selecciona una imagen válida"); return; }
235
+ if (!file.type.startsWith("image/")) { alert(ui.invalidImageError); return; }
213
236
  const reader = new FileReader();
214
237
  reader.onload = function(e) {
215
238
  const img = new Image();
@@ -269,30 +292,32 @@ const { ui } = Astro.props;
269
292
  function updateQualityBadge(dpi) {
270
293
  if (!qualityText || !qualityDesc || !qualityBadge) return;
271
294
  if (dpi >= 300) {
272
- qualityText.textContent = "Calidad Excelente";
273
- 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;
274
297
  qualityBadge.className = "pq-quality-badge pq-badge-green";
275
298
  } else if (dpi >= 150) {
276
- qualityText.textContent = "Calidad Buena";
277
- 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;
278
301
  qualityBadge.className = "pq-quality-badge pq-badge-yellow";
279
302
  } else if (dpi >= 72) {
280
- qualityText.textContent = "Calidad Pantalla/Baja";
281
- qualityDesc.textContent = "Adecuado solo para visualización digital o vallas publicitarias lejanas (>2 metros).";
303
+ qualityText.textContent = ui.qualityFair;
304
+ qualityDesc.textContent = ui.qualityFairDesc;
282
305
  qualityBadge.className = "pq-quality-badge pq-badge-red";
283
306
  } else {
284
- qualityText.textContent = "No Apto para impresión";
285
- 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;
286
309
  qualityBadge.className = "pq-quality-badge pq-badge-slate";
287
310
  }
288
311
  }
289
312
 
290
313
  function updateFormatsTable(cmW, cmH) {
314
+ console.log('DEBUG: updateFormatsTable called, ui.supportedText:', ui.supportedText);
291
315
  if (!formatsTableBody) return;
292
316
  formatsTableBody.innerHTML = "";
293
317
  const imgMin = Math.min(cmW, cmH);
294
318
  const imgMax = Math.max(cmW, cmH);
295
319
  PAPER_FORMATS.forEach(function(paper) {
320
+ console.log('DEBUG: Processing paper format:', paper.key);
296
321
  const paperMin = Math.min(paper.w, paper.h);
297
322
  const paperMax = Math.max(paper.w, paper.h);
298
323
  const covers = imgMin >= paperMin - 0.1 && imgMax >= paperMax - 0.1;
@@ -300,9 +325,9 @@ const { ui } = Astro.props;
300
325
  const row = document.createElement("tr");
301
326
  row.className = "pq-formats-row";
302
327
  const statusHtml = covers
303
- ? '<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>'
304
- : '<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>';
305
- 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>';
306
331
  formatsTableBody.appendChild(row);
307
332
  });
308
333
  }
@@ -333,7 +358,7 @@ const { ui } = Astro.props;
333
358
  --pq-accent: #818cf8;
334
359
  }
335
360
 
336
- .pq-wrapper {
361
+ :global(.pq-wrapper) {
337
362
  width: 100%;
338
363
  max-width: 56rem;
339
364
  margin: 0 auto;
@@ -347,7 +372,7 @@ const { ui } = Astro.props;
347
372
  display: none;
348
373
  }
349
374
 
350
- .pq-drop-zone {
375
+ :global(.pq-drop-zone) {
351
376
  position: relative;
352
377
  cursor: pointer;
353
378
  border: 2px dashed var(--pq-border);
@@ -356,15 +381,15 @@ const { ui } = Astro.props;
356
381
  transition: border-color 0.3s, background 0.3s;
357
382
  }
358
383
 
359
- :global(.theme-dark) .pq-drop-zone {
384
+ :global(.theme-dark .pq-drop-zone) {
360
385
  border-color: var(--pq-border);
361
386
  }
362
- .pq-drop-zone:hover,
363
- .pq-drop-zone.pq-drop-active {
387
+ :global(.pq-drop-zone:hover),
388
+ :global(.pq-drop-zone.pq-drop-active) {
364
389
  border-color: var(--pq-primary);
365
390
  background: rgba(99, 102, 241, 0.04);
366
391
  }
367
- .pq-drop-inner {
392
+ :global(.pq-drop-inner) {
368
393
  display: flex;
369
394
  flex-direction: column;
370
395
  align-items: center;
@@ -372,7 +397,7 @@ const { ui } = Astro.props;
372
397
  text-align: center;
373
398
  gap: 1rem;
374
399
  }
375
- .pq-upload-icon-wrap {
400
+ :global(.pq-upload-icon-wrap) {
376
401
  width: 5rem;
377
402
  height: 5rem;
378
403
  background: var(--pq-primary-light);
@@ -384,29 +409,29 @@ const { ui } = Astro.props;
384
409
  transition: transform 0.3s;
385
410
  }
386
411
 
387
- :global(.theme-dark) .pq-upload-icon-wrap {
412
+ :global(.theme-dark .pq-upload-icon-wrap) {
388
413
  background: rgba(99, 102, 241, 0.2);
389
414
  color: #818cf8;
390
415
  }
391
- .pq-drop-zone:hover .pq-upload-icon-wrap {
416
+ :global(.pq-drop-zone:hover .pq-upload-icon-wrap) {
392
417
  transform: scale(1.1);
393
418
  }
394
- .pq-drop-title {
419
+ :global(.pq-drop-title) {
395
420
  font-size: 1.25rem;
396
421
  font-weight: 700;
397
422
  color: #0f172a;
398
423
  margin: 0;
399
424
  }
400
425
 
401
- :global(.theme-dark) .pq-drop-title {
426
+ :global(.theme-dark .pq-drop-title) {
402
427
  color: #f1f5f9;
403
428
  }
404
- .pq-drop-sub {
429
+ :global(.pq-drop-sub) {
405
430
  color: #64748b;
406
431
  margin: 0.25rem 0 0;
407
432
  font-size: 0.95rem;
408
433
  }
409
- .pq-drop-overlay {
434
+ :global(.pq-drop-overlay) {
410
435
  position: absolute;
411
436
  inset: 0;
412
437
  background: linear-gradient(135deg, rgba(99,102,241,0.04), rgba(168,85,247,0.04));
@@ -415,9 +440,9 @@ const { ui } = Astro.props;
415
440
  pointer-events: none;
416
441
  transition: opacity 0.3s;
417
442
  }
418
- .pq-drop-zone:hover .pq-drop-overlay { opacity: 1; }
443
+ :global(.pq-drop-zone:hover .pq-drop-overlay) { opacity: 1; }
419
444
 
420
- .pq-results {
445
+ :global(.pq-results) {
421
446
  display: flex;
422
447
  flex-direction: column;
423
448
  gap: 2rem;
@@ -435,7 +460,7 @@ const { ui } = Astro.props;
435
460
  }
436
461
  }
437
462
 
438
- .pq-file-card {
463
+ :global(.pq-file-card) {
439
464
  background: #fff;
440
465
  border: 1px solid #e2e8f0;
441
466
  border-radius: 0.75rem;
@@ -443,29 +468,29 @@ const { ui } = Astro.props;
443
468
  padding: 1.5rem;
444
469
  }
445
470
 
446
- :global(.theme-dark) .pq-file-card {
471
+ :global(.theme-dark .pq-file-card) {
447
472
  background: #0f172a;
448
473
  border-color: #1e293b;
449
474
  }
450
- .pq-file-left {
475
+ :global(.pq-file-left) {
451
476
  display: flex;
452
477
  align-items: center;
453
478
  gap: 1.5rem;
454
479
  }
455
- .pq-preview-wrap {
480
+ :global(.pq-preview-wrap) {
456
481
  position: relative;
457
482
  width: 8rem;
458
483
  height: 8rem;
459
484
  flex-shrink: 0;
460
485
  }
461
- .pq-preview-img {
486
+ :global(.pq-preview-img) {
462
487
  width: 100%;
463
488
  height: 100%;
464
489
  object-fit: cover;
465
490
  border-radius: 0.5rem;
466
491
  box-shadow: 0 2px 8px rgba(0,0,0,0.15);
467
492
  }
468
- .pq-file-name {
493
+ :global(.pq-file-name) {
469
494
  font-weight: 700;
470
495
  color: #0f172a;
471
496
  font-size: 1rem;
@@ -476,15 +501,15 @@ const { ui } = Astro.props;
476
501
  max-width: 20rem;
477
502
  }
478
503
 
479
- :global(.theme-dark) .pq-file-name {
504
+ :global(.theme-dark .pq-file-name) {
480
505
  color: #f1f5f9;
481
506
  }
482
- .pq-file-meta {
507
+ :global(.pq-file-meta) {
483
508
  display: flex;
484
509
  flex-wrap: wrap;
485
510
  gap: 1rem;
486
511
  }
487
- .pq-meta-item {
512
+ :global(.pq-meta-item) {
488
513
  display: flex;
489
514
  align-items: center;
490
515
  gap: 0.25rem;
@@ -492,7 +517,7 @@ const { ui } = Astro.props;
492
517
  color: #64748b;
493
518
  }
494
519
 
495
- .pq-main-grid {
520
+ :global(.pq-main-grid) {
496
521
  display: grid;
497
522
  grid-template-columns: 1fr 1fr;
498
523
  gap: 2rem;
@@ -502,18 +527,18 @@ const { ui } = Astro.props;
502
527
  .pq-main-grid { grid-template-columns: 1fr; }
503
528
  }
504
529
 
505
- .pq-config-panel {
530
+ :global(.pq-config-panel) {
506
531
  background: #f8fafc;
507
532
  border: 1px solid #e2e8f0;
508
533
  border-radius: 0.75rem;
509
534
  padding: 1.5rem;
510
535
  }
511
536
 
512
- :global(.theme-dark) .pq-config-panel {
537
+ :global(.theme-dark .pq-config-panel) {
513
538
  background: rgba(30, 41, 59, 0.5);
514
539
  border-color: var(--pq-border);
515
540
  }
516
- .pq-config-label {
541
+ :global(.pq-config-label) {
517
542
  display: block;
518
543
  font-size: 0.875rem;
519
544
  font-weight: 500;
@@ -521,10 +546,10 @@ const { ui } = Astro.props;
521
546
  margin-bottom: 1rem;
522
547
  }
523
548
 
524
- :global(.theme-dark) .pq-config-label {
549
+ :global(.theme-dark .pq-config-label) {
525
550
  color: #94a3b8;
526
551
  }
527
- .pq-slider {
552
+ :global(.pq-slider) {
528
553
  width: 100%;
529
554
  height: 0.5rem;
530
555
  background: #e2e8f0;
@@ -535,16 +560,16 @@ const { ui } = Astro.props;
535
560
  margin-bottom: 1rem;
536
561
  }
537
562
 
538
- :global(.theme-dark) .pq-slider {
563
+ :global(.theme-dark .pq-slider) {
539
564
  background: #334155;
540
565
  }
541
- .pq-dpi-row {
566
+ :global(.pq-dpi-row) {
542
567
  display: flex;
543
568
  align-items: center;
544
569
  gap: 1rem;
545
570
  margin-bottom: 1.5rem;
546
571
  }
547
- .pq-dpi-number {
572
+ :global(.pq-dpi-number) {
548
573
  width: 6rem;
549
574
  border: 1px solid #e2e8f0;
550
575
  border-radius: 0.5rem;
@@ -556,23 +581,23 @@ const { ui } = Astro.props;
556
581
  padding: 0.4rem 0.5rem;
557
582
  outline: none;
558
583
  }
559
- .pq-dpi-number:focus { border-color: var(--pq-primary); }
584
+ :global(.pq-dpi-number:focus) { border-color: var(--pq-primary); }
560
585
 
561
- :global(.theme-dark) .pq-dpi-number {
586
+ :global(.theme-dark .pq-dpi-number) {
562
587
  background: #0f172a;
563
588
  border-color: var(--pq-border);
564
589
  color: #f1f5f9;
565
590
  }
566
- .pq-dpi-label {
591
+ :global(.pq-dpi-label) {
567
592
  font-size: 0.875rem;
568
593
  color: #64748b;
569
594
  }
570
- .pq-presets {
595
+ :global(.pq-presets) {
571
596
  display: flex;
572
597
  flex-wrap: wrap;
573
598
  gap: 0.5rem;
574
599
  }
575
- .pq-preset-btn {
600
+ :global(.pq-preset-btn) {
576
601
  padding: 0.25rem 0.75rem;
577
602
  font-size: 0.75rem;
578
603
  font-weight: 500;
@@ -583,31 +608,31 @@ const { ui } = Astro.props;
583
608
  cursor: pointer;
584
609
  transition: background 0.15s, color 0.15s;
585
610
  }
586
- .pq-preset-btn:hover { background: #cbd5e1; }
611
+ :global(.pq-preset-btn:hover) { background: #cbd5e1; }
587
612
 
588
- :global(.theme-dark) .pq-preset-btn {
613
+ :global(.theme-dark .pq-preset-btn) {
589
614
  background: #334155;
590
615
  color: #94a3b8;
591
616
  }
592
617
 
593
- :global(.theme-dark) .pq-preset-btn:hover {
618
+ :global(.theme-dark .pq-preset-btn:hover) {
594
619
  background: #475569;
595
620
  }
596
- .pq-preset-active {
621
+ :global(.pq-preset-active) {
597
622
  background: var(--pq-primary-light);
598
623
  color: #4338ca;
599
624
  box-shadow: 0 0 0 1px rgba(99, 102, 241, 0.2);
600
625
  }
601
626
 
602
- :global(.theme-dark) .pq-preset-active {
627
+ :global(.theme-dark .pq-preset-active) {
603
628
  background: rgba(99, 102, 241, 0.3);
604
629
  color: #a5b4fc;
605
630
  }
606
631
 
607
- .pq-output-panel {
632
+ :global(.pq-output-panel) {
608
633
  display: flex;
609
634
  }
610
- .pq-output-gradient {
635
+ :global(.pq-output-gradient) {
611
636
  flex: 1;
612
637
  display: flex;
613
638
  flex-direction: column;
@@ -620,7 +645,7 @@ const { ui } = Astro.props;
620
645
  position: relative;
621
646
  overflow: hidden;
622
647
  }
623
- .pq-output-blur-bg {
648
+ :global(.pq-output-blur-bg) {
624
649
  position: absolute;
625
650
  top: 0; right: 0;
626
651
  width: 8rem; height: 8rem;
@@ -630,7 +655,7 @@ const { ui } = Astro.props;
630
655
  transform: translate(2rem, -2rem);
631
656
  pointer-events: none;
632
657
  }
633
- .pq-output-subtitle {
658
+ :global(.pq-output-subtitle) {
634
659
  font-size: 0.75rem;
635
660
  font-weight: 500;
636
661
  text-transform: uppercase;
@@ -639,7 +664,7 @@ const { ui } = Astro.props;
639
664
  margin: 0 0 0.5rem;
640
665
  position: relative;
641
666
  }
642
- .pq-output-size {
667
+ :global(.pq-output-size) {
643
668
  display: flex;
644
669
  align-items: baseline;
645
670
  gap: 0.5rem;
@@ -648,25 +673,25 @@ const { ui } = Astro.props;
648
673
  margin-bottom: 0.25rem;
649
674
  position: relative;
650
675
  }
651
- .pq-size-sep {
676
+ :global(.pq-size-sep) {
652
677
  font-size: 1.5rem;
653
678
  opacity: 0.5;
654
679
  }
655
- .pq-size-unit {
680
+ :global(.pq-size-unit) {
656
681
  font-size: 1.5rem;
657
682
  }
658
- .pq-output-inches {
683
+ :global(.pq-output-inches) {
659
684
  color: rgba(199, 210, 254, 0.8);
660
685
  font-size: 0.875rem;
661
686
  margin-bottom: 1.5rem;
662
687
  position: relative;
663
688
  }
664
- .pq-quality-section {
689
+ :global(.pq-quality-section) {
665
690
  padding-top: 1rem;
666
691
  border-top: 1px solid rgba(255,255,255,0.2);
667
692
  position: relative;
668
693
  }
669
- .pq-quality-badge {
694
+ :global(.pq-quality-badge) {
670
695
  display: inline-flex;
671
696
  align-items: center;
672
697
  gap: 0.375rem;
@@ -678,44 +703,44 @@ const { ui } = Astro.props;
678
703
  backdrop-filter: blur(4px);
679
704
  margin-bottom: 0.5rem;
680
705
  }
681
- .pq-badge-green {
706
+ :global(.pq-badge-green) {
682
707
  background: rgba(16, 185, 129, 0.25);
683
708
  box-shadow: 0 0 0 1px rgba(52, 211, 153, 0.3);
684
709
  }
685
710
 
686
- .pq-badge-yellow {
711
+ :global(.pq-badge-yellow) {
687
712
  background: rgba(234, 179, 8, 0.25);
688
713
  box-shadow: 0 0 0 1px rgba(253, 224, 71, 0.3);
689
714
  }
690
715
 
691
- .pq-badge-red {
716
+ :global(.pq-badge-red) {
692
717
  background: rgba(239, 68, 68, 0.25);
693
718
  box-shadow: 0 0 0 1px rgba(252, 165, 165, 0.3);
694
719
  }
695
720
 
696
- .pq-badge-slate {
721
+ :global(.pq-badge-slate) {
697
722
  background: rgba(100, 116, 139, 0.25);
698
723
  box-shadow: 0 0 0 1px rgba(148, 163, 184, 0.3);
699
724
  }
700
- .pq-quality-desc {
725
+ :global(.pq-quality-desc) {
701
726
  font-size: 0.875rem;
702
727
  color: rgba(199,210,254,0.9);
703
728
  line-height: 1.4;
704
729
  margin: 0;
705
730
  }
706
731
 
707
- .pq-formats-card {
732
+ :global(.pq-formats-card) {
708
733
  background: #fff;
709
734
  border: 1px solid #e2e8f0;
710
735
  border-radius: 0.75rem;
711
736
  padding: 1.5rem;
712
737
  }
713
738
 
714
- :global(.theme-dark) .pq-formats-card {
739
+ :global(.theme-dark .pq-formats-card) {
715
740
  background: #0f172a;
716
741
  border-color: #1e293b;
717
742
  }
718
- .pq-formats-title {
743
+ :global(.pq-formats-title) {
719
744
  display: flex;
720
745
  align-items: center;
721
746
  gap: 0.5rem;
@@ -725,18 +750,18 @@ const { ui } = Astro.props;
725
750
  margin: 0 0 1rem;
726
751
  }
727
752
 
728
- :global(.theme-dark) .pq-formats-title {
753
+ :global(.theme-dark .pq-formats-title) {
729
754
  color: #f1f5f9;
730
755
  }
731
- .pq-formats-scroll {
756
+ :global(.pq-formats-scroll) {
732
757
  overflow-x: auto;
733
758
  }
734
- .pq-formats-table {
759
+ :global(.pq-formats-table) {
735
760
  width: 100%;
736
761
  border-collapse: collapse;
737
762
  font-size: 0.875rem;
738
763
  }
739
- .pq-formats-table th {
764
+ :global(.pq-formats-table th) {
740
765
  text-align: left;
741
766
  padding: 0.75rem 1rem;
742
767
  font-size: 0.75rem;
@@ -747,57 +772,57 @@ const { ui } = Astro.props;
747
772
  background: #f8fafc;
748
773
  }
749
774
 
750
- :global(.theme-dark) .pq-formats-table th {
775
+ :global(.theme-dark .pq-formats-table th) {
751
776
  background: #1e293b;
752
777
  color: #94a3b8;
753
778
  }
754
- .pq-formats-row {
779
+ :global(.pq-formats-row) {
755
780
  border-bottom: 1px solid #f1f5f9;
756
781
  transition: background 0.15s;
757
782
  }
758
783
 
759
- .pq-formats-row:hover {
784
+ :global(.pq-formats-row:hover) {
760
785
  background: #f8fafc;
761
786
  }
762
787
 
763
- :global(.theme-dark) .pq-formats-row {
788
+ :global(.theme-dark .pq-formats-row) {
764
789
  border-color: #1e293b;
765
790
  }
766
791
 
767
- :global(.theme-dark) .pq-formats-row:hover {
792
+ :global(.theme-dark .pq-formats-row:hover) {
768
793
  background: #1e293b;
769
794
  }
770
- .pq-td {
795
+ :global(.pq-td) {
771
796
  padding: 0.75rem 1rem;
772
797
  color: #475569;
773
798
  }
774
799
 
775
- :global(.theme-dark) .pq-td {
800
+ :global(.theme-dark .pq-td) {
776
801
  color: #94a3b8;
777
802
  }
778
- .pq-td-name {
803
+ :global(.pq-td-name) {
779
804
  font-weight: 600;
780
805
  color: #0f172a;
781
806
  }
782
807
 
783
- :global(.theme-dark) .pq-td-name {
808
+ :global(.theme-dark .pq-td-name) {
784
809
  color: #f1f5f9;
785
810
  }
786
- .pq-status {
811
+ :global(.pq-status) {
787
812
  display: inline-flex;
788
813
  align-items: center;
789
814
  gap: 0.35rem;
790
815
  font-weight: 600;
791
816
  font-size: 0.8rem;
792
817
  }
793
- .pq-status-ok { color: #16a34a; }
794
- .pq-status-no { color: #d97706; }
818
+ :global(.pq-status-ok) { color: #16a34a; }
819
+ :global(.pq-status-no) { color: #d97706; }
795
820
 
796
- :global(.theme-dark) .pq-status-ok {
821
+ :global(.theme-dark .pq-status-ok) {
797
822
  color: #4ade80;
798
823
  }
799
824
 
800
- :global(.theme-dark) .pq-status-no {
825
+ :global(.theme-dark .pq-status-no) {
801
826
  color: #fbbf24;
802
827
  }
803
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'] = [