        /* Fraunces (variable 300–900) e IBM Plex Mono (400/500/700), bundled local en fonts/ */
        @font-face { font-family:'Fraunces'; font-style:normal; font-weight:300 900; font-display:swap; src:url(fonts/fraunces-latin.woff2) format('woff2'); }
        @font-face { font-family:'IBM Plex Mono'; font-style:normal; font-weight:400; font-display:swap; src:url(fonts/ibm-plex-mono-400.woff2) format('woff2'); }
        @font-face { font-family:'IBM Plex Mono'; font-style:normal; font-weight:500; font-display:swap; src:url(fonts/ibm-plex-mono-500.woff2) format('woff2'); }
        @font-face { font-family:'IBM Plex Mono'; font-style:normal; font-weight:700; font-display:swap; src:url(fonts/ibm-plex-mono-700.woff2) format('woff2'); }
        :root {
            --color-bg: #1a1a1a;
            --color-bg-secondary: #242424;
            --color-card: #252525;
            --color-text: #e8e8e8;
            --color-text-light: #a0a0a0;
            --color-accent: #ff9800;
            --color-accent-light: #ffb74d;
            --color-accent-dark: #e68900;
            --color-teal: #4fd1c5;
            --color-teal-light: #81e6d9;
            --color-border: #333333;
            --color-border-light: #444444;
            --color-shadow: rgba(0, 0, 0, 0.5);
            --font-display: 'Fraunces', serif;
            --font-mono: 'IBM Plex Mono', monospace;
            --radius: 4px;
            --transition: all 0.4s cubic-bezier(0.4, 0, 0.2, 1);
        }
        * { margin: 0; padding: 0; box-sizing: border-box; }
        body { font-family: var(--font-display); background: var(--color-bg); color: var(--color-text); min-height: 100vh; display: flex; flex-direction: column; padding: 0; line-height: 1.6; -webkit-font-smoothing: antialiased; overflow-x: clip; position: relative; }
        #stars, #stars2, #stars3 { position: fixed; top: 0; left: 0; background: transparent; z-index: 0; }
        #stars { width: 1px; height: 1px;
            box-shadow: 1472px 1656px #FFF, 501px 150px #FFF, 1200px 800px #FFF, 300px 1900px #FFF, 1800px 500px #FFF, 2500px 400px #FFF, 3100px 100px #FFF, 3800px 1200px #FFF,
            1714px 1030px #FFF, 2332px 127px #FFF, 2845px 509px #FFF, 3948px 120px #FFF, 1373px 1475px #FFF, 3251px 1195px #FFF, 3558px 1111px #FFF, 1610px 1863px #FFF,
            2928px 131px #FFF, 3269px 1024px #FFF, 109px 1184px #FFF, 2445px 584px #FFF, 3134px 1729px #FFF, 135px 440px #FFF, 3417px 1139px #FFF, 1140px 1319px #FFF,
            2062px 1410px #FFF, 2240px 1032px #FFF, 3906px 571px #FFF, 1827px 1238px #FFF, 3413px 439px #FFF, 1470px 1583px #FFF, 2715px 1236px #FFF, 3909px 1293px #FFF,
            154px 1051px #FFF, 2195px 1466px #FFF, 1232px 1083px #FFF, 3350px 1122px #FFF, 400px 200px #FFF, 2800px 1500px #FFF, 3600px 300px #FFF, 250px 1100px #FFF,
            1000px 1000px #FFF, 2350px 450px #FFF, 3850px 150px #FFF, 650px 1750px #FFF, 3100px 600px #FFF, 150px 1350px #FFF, 3950px 850px #FFF, 850px 250px #FFF,
            2472px 656px #FFF, 1501px 1150px #FFF, 2200px 1800px #FFF, 1300px 900px #FFF, 2800px 1500px #FFF, 500px 1400px #FFF, 1100px 1100px #FFF, 2800px 200px #FFF,
            714px 30px #FFF, 3332px 1127px #FFF, 845px 1509px #FFF, 948px 1120px #FFF, 373px 475px #FFF, 2251px 195px #FFF, 558px 111px #FFF, 610px 863px #FFF,
            1928px 1131px #FFF, 2269px 24px #FFF, 2109px 184px #FFF, 445px 1584px #FFF, 1134px 729px #FFF, 3135px 1440px #FFF, 417px 139px #FFF, 2140px 319px #FFF,
            62px 410px #FFF, 1240px 32px #FFF, 906px 1571px #FFF, 2827px 238px #FFF, 413px 1439px #FFF, 2470px 583px #FFF, 715px 236px #FFF, 909px 293px #FFF,
            1154px 51px #FFF, 195px 466px #FFF, 2232px 83px #FFF, 350px 122px #FFF, 2400px 1200px #FFF, 1800px 500px #FFF, 600px 1300px #FFF, 3250px 100px #FFF;
            animation: animStar 25s linear infinite; }
        #stars:after { content: " "; position: absolute; top: 2000px; width: 1px; height: 1px; background: transparent; box-shadow: inherit; }
        #stars2 { width: 2px; height: 2px;
            box-shadow: 120px 500px #FFF, 2400px 800px #FFF, 300px 1500px #FFF, 3800px 200px #FFF, 900px 1600px #FFF, 2450px 300px #FFF, 3100px 1100px #FFF, 1500px 1800px #FFF,
            2200px 100px #FFF, 3700px 1400px #FFF, 600px 700px #FFF, 3300px 400px #FFF, 100px 1900px #FFF, 3600px 1000px #FFF, 500px 1200px #FFF, 3450px 250px #FFF,
            750px 1550px #FFF, 2250px 650px #FFF, 3850px 850px #FFF, 1250px 1250px #FFF,
            1120px 1500px #FFF, 400px 1800px #FFF, 1300px 500px #FFF, 2800px 1200px #FFF, 1900px 600px #FFF, 450px 1300px #FFF, 2100px 100px #FFF, 500px 800px #FFF,
            3200px 1100px #FFF, 700px 400px #FFF, 1600px 1700px #FFF, 2300px 1400px #FFF, 1100px 900px #FFF, 600px 1000px #FFF, 1500px 200px #FFF, 450px 1250px #FFF;
            animation: animStar 50s linear infinite; }
        #stars2:after { content: " "; position: absolute; top: 2000px; width: 2px; height: 2px; background: transparent; box-shadow: inherit; }
        #stars3 { width: 3px; height: 3px;
            box-shadow: 400px 900px #FFF, 2200px 100px #FFF, 3500px 1800px #FFF, 200px 1400px #FFF, 2800px 400px #FFF, 3700px 600px #FFF, 600px 1200px #FFF, 3300px 1500px #FFF,
            50px 50px #FFF, 2100px 1900px #FFF, 3900px 100px #FFF, 300px 600px #FFF,
            1400px 1900px #FFF, 3200px 1100px #FFF, 500px 800px #FFF, 1200px 400px #FFF, 3800px 1400px #FFF, 1700px 1600px #FFF, 1600px 200px #FFF, 300px 500px #FFF;
            animation: animStar 80s linear infinite; }
        #stars3:after { content: " "; position: absolute; top: 2000px; width: 3px; height: 3px; background: transparent; box-shadow: inherit; }
        @keyframes animStar { from { transform: translateY(0px); } to { transform: translateY(-2000px); } }
        .grain-overlay { position: fixed; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 1000; opacity: 0.03;
            background-image: url("data:image/svg+xml,%3Csvg viewBox='0 0 400 400' xmlns='http://www.w3.org/2000/svg'%3E%3Cfilter id='noiseFilter'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='4' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23noiseFilter)'/%3E%3C/svg%3E"); }
        .container { max-width: 1400px; margin: 0 auto; position: relative; z-index: 1; }
        .header { background: linear-gradient(135deg, rgba(26, 26, 26, 0.98) 0%, rgba(13, 13, 13, 0.95) 100%); padding: 40px 40px 30px; border-bottom: 2px solid var(--color-accent); position: relative;
            box-shadow: 0 4px 24px rgba(0, 0, 0, 0.5), inset 0 0 30px rgba(0, 0, 0, 0.3); }
        .header h1 { font-family: var(--font-mono); font-size: 1.8em; font-weight: 900; color: var(--color-accent); letter-spacing: 3px; text-transform: uppercase;
            text-shadow: 0 0 15px rgba(255, 152, 0, 0.5), 0 0 30px rgba(255, 152, 0, 0.2); margin-bottom: 6px; }
        .header .subtitle { font-family: var(--font-display); font-size: 0.95em; color: var(--color-text-light); font-weight: 300; font-style: italic; letter-spacing: 0.02em; max-width: 900px; }
        .header .header-note { font-family: var(--font-display); font-size: 0.85em; color: var(--color-text-light); font-weight: 300; line-height: 1.65; letter-spacing: 0.01em; margin-top: 12px; max-width: 900px; text-align: justify; }
        .header .header-note strong { color: var(--color-accent); font-weight: 600; }
        .main-content { display: grid; grid-template-columns: 1fr 1fr; gap: 0; }
        .panel { background: linear-gradient(135deg, #1a1a1a 0%, #0d0d0d 100%); padding: 30px; border: 1px solid var(--color-border);
            box-shadow: inset 0 0 20px rgba(0, 0, 0, 0.5); }
        .panel h2 { font-family: var(--font-mono); font-size: 1.1em; font-weight: 900; color: var(--color-accent); letter-spacing: 2px; text-transform: uppercase; margin-bottom: 20px;
            border-bottom: 2px solid var(--color-accent); padding-bottom: 10px; text-shadow: 0 0 10px rgba(255, 152, 0, 0.4); }
        .form-group { margin-bottom: 16px; }
        .form-group label { display: block; margin-bottom: 6px; font-family: var(--font-mono); font-weight: 500; color: var(--color-text-light); font-size: 0.82em; letter-spacing: 0.5px; text-transform: uppercase; }
        .form-group input[type="text"], .form-group textarea, .form-group select {
            width: 100%; padding: 12px; border: 1px solid var(--color-border); border-radius: var(--radius); font-family: var(--font-mono); font-size: 0.92em;
            background: rgba(0, 0, 0, 0.4); color: #ffffff; transition: var(--transition); }
        .form-group input:focus, .form-group textarea:focus, .form-group select:focus { outline: none; border-color: var(--color-accent); box-shadow: 0 0 0 2px rgba(255, 152, 0, 0.15); }
        .form-group input::placeholder, .form-group textarea::placeholder { color: rgba(255, 255, 255, 0.25); font-family: var(--font-mono); }
        .form-group textarea { resize: vertical; min-height: 200px; }
        .form-group select { cursor: pointer; appearance: auto; }
        .form-group select option { background: var(--color-bg); color: var(--color-text); }
        input[type="range"] { -webkit-appearance: none; appearance: none; width: 100%; height: 6px; background: var(--color-border); border-radius: 3px; outline: none; }
        input[type="range"]::-webkit-slider-thumb { -webkit-appearance: none; appearance: none; width: 16px; height: 16px; background: var(--color-accent); border-radius: 50%; cursor: pointer; border: 2px solid var(--color-accent-dark); }
        input[type="range"]::-moz-range-thumb { width: 16px; height: 16px; background: var(--color-accent); border-radius: 50%; cursor: pointer; border: 2px solid var(--color-accent-dark); }
        .color-grid { display: grid; grid-template-columns: 1fr 1fr; gap: 10px; }
        .color-box { background: rgba(0, 0, 0, 0.3); padding: 10px 12px; border-radius: var(--radius); border: 1px solid var(--color-border); transition: var(--transition); }
        .color-box:hover { border-color: var(--color-accent); background: rgba(0, 0, 0, 0.4); }
        .color-box label { display: block; margin-bottom: 5px; font-family: var(--font-mono); font-size: 0.72em; color: var(--color-text-light); font-weight: 500; text-transform: uppercase; letter-spacing: 0.5px; }
        .color-input-wrapper { display: flex; align-items: center; gap: 8px; }
        .color-input-wrapper input[type="color"] { width: 42px; height: 30px; border: 2px solid var(--color-border); border-radius: var(--radius); cursor: pointer; padding: 1px; background: transparent; }
        .color-input-wrapper input[type="color"]:hover { border-color: var(--color-accent); }
        .color-input-wrapper span { font-family: var(--font-mono); font-size: 0.72em; font-weight: 500; color: var(--color-teal); }
        .sub-section { background: rgba(0, 0, 0, 0.3); border: 1px solid var(--color-border); border-radius: var(--radius); padding: 12px; margin-bottom: 10px; }
        .sub-section-title { font-family: var(--font-mono); font-size: 0.78em; font-weight: 700; color: var(--color-teal); margin-bottom: 10px; padding-bottom: 6px; border-bottom: 1px solid var(--color-border); text-transform: uppercase; letter-spacing: 1px; }
        .checkbox-wrapper { background: rgba(0, 0, 0, 0.4); padding: 14px; border-radius: var(--radius); border: 1px solid var(--color-border); cursor: pointer; transition: var(--transition); display: flex; align-items: center; gap: 10px; }
        .checkbox-wrapper:hover { border-color: var(--color-accent); background: rgba(255, 152, 0, 0.06); }
        .checkbox-wrapper input[type="checkbox"] { width: 20px; height: 20px; cursor: pointer; accent-color: var(--color-accent); }
        .checkbox-wrapper label { margin: 0 !important; cursor: pointer; flex: 1; font-size: 0.88em; font-family: var(--font-mono); color: var(--color-text); text-transform: uppercase; letter-spacing: 0.5px; }
        .check-inline { display: flex; align-items: center; gap: 8px; padding: 6px 0; cursor: pointer; }
        .check-inline input { width: 17px; height: 17px; accent-color: var(--color-accent); cursor: pointer; }
        .check-inline label { margin: 0 !important; font-family: var(--font-mono); font-size: 0.78em; cursor: pointer; color: var(--color-text-light); }
        .collapsible-section { margin-bottom: 10px; border: 1px solid var(--color-border); border-radius: var(--radius); overflow: hidden; }
        .collapsible-header { display: flex; align-items: center; justify-content: space-between; padding: 12px 16px; background: rgba(0, 0, 0, 0.4); cursor: pointer; user-select: none; transition: var(--transition); border-left: 3px solid var(--color-accent); }
        .collapsible-header:hover { background: rgba(255, 152, 0, 0.08); }
        .collapsible-header:focus-visible { outline: 2px solid var(--color-teal); outline-offset: -2px; }
        .collapsible-header h3 { font-family: var(--font-mono); font-size: 0.88em; font-weight: 700; color: var(--color-accent); margin: 0; letter-spacing: 1px; text-transform: uppercase; }
        .collapsible-arrow { font-size: 0.85em; color: var(--color-accent); transition: transform 0.3s; }
        .collapsible-section.collapsed .collapsible-arrow { transform: rotate(-90deg); }
        .collapsible-section.collapsed .collapsible-body { display: none; }
        .collapsible-body { padding: 16px; background: rgba(0, 0, 0, 0.15); }
        .shape-picker { display: flex; flex-wrap: wrap; gap: 5px; margin-top: 6px; }
        .shape-option { width: 48px; height: 48px; border: 1px solid var(--color-border); border-radius: var(--radius); cursor: pointer; display: flex; align-items: center; justify-content: center; background: rgba(0, 0, 0, 0.4); transition: var(--transition); position: relative; }
        .shape-option:hover { border-color: var(--color-accent); background: rgba(255, 152, 0, 0.1); transform: scale(1.08); }
        .shape-option:focus-visible { outline: 2px solid var(--color-teal); outline-offset: 2px; }
        .shape-option.selected { border-color: var(--color-accent); background: rgba(255, 152, 0, 0.15); box-shadow: 0 0 0 2px rgba(255, 152, 0, 0.3), 0 0 12px rgba(255, 152, 0, 0.15); }
        .shape-option svg { width: 32px; height: 32px; }
        .shape-option svg [fill="#222"] { fill: #e8e8e8; }
        .shape-option svg [fill="#ddd"] { fill: #444; }
        .shape-option svg [fill="#fff"] { fill: #1a1a1a; }
        .shape-option svg [stroke="#222"] { stroke: #e8e8e8; }
        .shape-option svg [stroke="#ccc"] { stroke: #666; }
        .shape-option svg [stroke="#aaa"] { stroke: #555; }
        .shape-option[title]:hover::after { content: attr(title); position: absolute; bottom: -22px; left: 50%; transform: translateX(-50%); font-family: var(--font-mono); font-size: 0.55em; white-space: nowrap; color: var(--color-teal); font-weight: 500; background: var(--color-bg); padding: 2px 6px; border-radius: var(--radius); border: 1px solid var(--color-border); z-index: 10; letter-spacing: 0.5px; }
        .shape-picker.fp .shape-option { width: 52px; height: 52px; }
        .shape-picker.fp .shape-option svg { width: 36px; height: 36px; }
        .picker-label { font-family: var(--font-mono); font-size: 0.75em; font-weight: 700; color: var(--color-teal); margin: 14px 0 4px; display: block; text-transform: uppercase; letter-spacing: 1px; }
        .ct-tabs { display: flex; gap: 4px; margin-bottom: 16px; flex-wrap: wrap; }
        .ct-tab { flex: 1 1 auto; min-width: 80px; padding: 10px 8px; border: 1px solid var(--color-border); background: rgba(0, 0, 0, 0.4); color: var(--color-text-light); font-family: var(--font-mono); font-size: 0.8em; font-weight: 700; text-transform: uppercase; letter-spacing: 0.5px; border-radius: var(--radius); cursor: pointer; transition: var(--transition); }
        .ct-tab:hover { border-color: var(--color-accent); color: var(--color-text); background: rgba(255, 152, 0, 0.08); }
        .ct-tab.active { border-color: var(--color-accent); color: #000; background: linear-gradient(135deg, #ff9800 0%, #e68900 100%); box-shadow: 0 2px 10px rgba(255, 152, 0, 0.3); }
        .capture-drop { border: 2px dashed var(--color-border); border-radius: var(--radius); padding: 28px 16px; text-align: center; cursor: pointer; transition: var(--transition); background: rgba(0, 0, 0, 0.25); }
        .capture-drop:hover, .capture-drop:focus-visible, .capture-drop.dragover { border-color: var(--color-accent); background: rgba(255, 152, 0, 0.08); outline: none; }
        .capture-icon { font-size: 2em; margin-bottom: 8px; }
        .capture-text { font-size: 0.85em; color: var(--color-text); line-height: 1.5; }
        .capture-hint { font-size: 0.72em; color: var(--color-text-light); margin-top: 6px; }
        .ct-fields { margin-bottom: 16px; }
        .ct-fields > *:last-child { margin-bottom: 0; }
        .btn { width: 100%; padding: 16px; border: none; border-radius: var(--radius); font-family: var(--font-mono); font-size: 1em; font-weight: 700; cursor: pointer; transition: var(--transition); margin-top: 12px; text-transform: uppercase; letter-spacing: 2px; }
        .btn-primary { background: linear-gradient(135deg, #ff9800 0%, #e68900 100%); color: #000; box-shadow: 0 4px 16px rgba(255, 152, 0, 0.3), inset 0 1px 0 rgba(255, 255, 255, 0.15); }
        .btn-primary:hover { transform: translateY(-2px); box-shadow: 0 8px 24px rgba(255, 152, 0, 0.4); text-shadow: 0 0 8px rgba(255, 255, 255, 0.3); }
        .btn-success { background: linear-gradient(135deg, #4fd1c5 0%, #38b2ac 100%); color: #000; box-shadow: 0 4px 16px rgba(79, 209, 197, 0.3); }
        .btn-success:hover { transform: translateY(-2px); box-shadow: 0 8px 24px rgba(79, 209, 197, 0.4); }
        .btn-download { width: auto; display: inline-block; padding: 12px 56px; font-size: 1.35em; border-radius: 14px; background: linear-gradient(135deg, #ff9800 0%, #e68900 100%); color: #000; box-shadow: 0 6px 20px rgba(255, 152, 0, 0.45); }
        .btn-download:hover { transform: translateY(-2px); box-shadow: 0 10px 28px rgba(255, 152, 0, 0.6); }
        /* Acciones del preview: ambos botones del mismo ancho (igualados al más ancho) y con separación */
        .qr-actions { display: flex; flex-direction: column; align-items: stretch; gap: 18px; width: fit-content; max-width: 100%; margin: 20px auto 0; }
        .qr-actions .btn-download { margin-top: 0; }
        /* Mientras muestra "Copiado": se ve como texto de confirmación, NO como botón */
        .qr-actions .btn-download.btn-feedback { background: none; box-shadow: none; cursor: default; transform: none; pointer-events: none; color: var(--color-teal); }
        .qr-actions .btn-download.btn-feedback.is-error { color: #ff6b6b; }
        .premium-toggle { background: rgba(255, 152, 0, 0.1); border-color: var(--color-accent) !important; border-style: dashed !important; }
        .premium-toggle:hover { background: rgba(255, 152, 0, 0.15); }
        .premium-options { display: none; margin-top: 10px; }
        .premium-options .sub-section-title { color: var(--color-accent); }
        .color-disabled { opacity: 0.25; pointer-events: none; }
        .placeholder-badge { display: inline-block; background: rgba(0, 0, 0, 0.4); color: #666; padding: 12px 20px; border-radius: var(--radius); font-family: var(--font-mono); font-size: 0.82em; font-weight: 500; border: 1px dashed var(--color-border); text-align: center; width: 100%; text-transform: uppercase; letter-spacing: 1px; }
        .conditional-options { display: none; margin-top: 10px; }
        .preview-panel { display: flex; flex-direction: column; align-items: center; justify-content: center; min-height: 600px; position: sticky; top: 16px; align-self: start; max-height: calc(100vh - 32px); overflow: auto; border-left: 1px solid var(--color-border); }
        .preview-panel h2 { border-bottom: none; padding-bottom: 0; text-align: center; }
        .preview-placeholder { text-align: center; color: var(--color-text-light); padding: 60px 40px; }
        .preview-placeholder svg { width: 120px; height: 120px; opacity: 0.15; margin-bottom: 20px; fill: var(--color-accent); }
        .preview-placeholder h3 { font-family: var(--font-mono); font-size: 1em; margin-bottom: 8px; color: var(--color-text-light); text-transform: uppercase; letter-spacing: 2px; }
        .preview-placeholder p { font-family: var(--font-mono); font-size: 0.82em; color: #555; }
        .preview-image { max-width: 100%; max-height: 500px; border-radius: var(--radius); box-shadow: 0 8px 32px rgba(0, 0, 0, 0.6), 0 0 0 1px var(--color-border); margin: 20px 0; }
        /* Indicador discreto de calidad de lectura del QR (contraste + lectura real con zxing) */
        .read-status { display: none; align-items: center; gap: 7px; font-family: var(--font-mono); font-size: 0.78em; font-weight: 500; letter-spacing: 0.3px; margin: -8px auto 4px; cursor: help; }
        .read-status.show { display: inline-flex; }
        .read-status .read-label { color: var(--color-text-light); text-transform: uppercase; font-size: 0.92em; letter-spacing: 0.5px; }
        .read-dot { width: 9px; height: 9px; border-radius: 50%; flex: 0 0 auto; background: var(--color-text-light); box-shadow: 0 0 6px currentColor; }
        .read-status.is-ok { color: var(--color-teal); }
        .read-status.is-ok .read-dot { background: var(--color-teal); }
        .read-status.is-warn { color: #ff9800; }
        .read-status.is-warn .read-dot { background: #ff9800; }
        .read-status #readMsg { color: var(--color-text); }
        .loading { display: none; text-align: center; padding: 60px; }
        .loading.active { display: block; }
        .spinner { border: 3px solid var(--color-border); border-top: 3px solid var(--color-accent); border-radius: 50%; width: 50px; height: 50px; animation: spin 0.8s linear infinite; margin: 0 auto 20px; }
        @keyframes spin { 0%{transform:rotate(0deg)} 100%{transform:rotate(360deg)} }
        .loading p { font-family: var(--font-mono); font-size: 0.92em; color: var(--color-accent); font-weight: 500; text-transform: uppercase; letter-spacing: 2px; animation: blink 1.5s infinite; }
        @keyframes blink { 0%, 50%, 100% { opacity: 1; } 25%, 75% { opacity: 0.4; } }
        .error-message { background: rgba(220, 53, 69, 0.15); color: #ff6b6b; padding: 14px; border-radius: var(--radius); margin-top: 15px; display: none; border-left: 3px solid #dc3545; font-family: var(--font-mono); font-size: 0.85em; }
        .error-message.active { display: block; }
        .file-upload { position: relative; display: block; width: 100%; }
        .file-upload input[type="file"] { position: absolute; opacity: 0; width: 100%; height: 100%; cursor: pointer; }
        .file-upload-label { display: flex; align-items: center; justify-content: center; gap: 8px; padding: 14px; background: rgba(0, 0, 0, 0.4); border: 1px dashed var(--color-border); border-radius: var(--radius); cursor: pointer; transition: var(--transition); flex-direction: column; font-family: var(--font-mono); color: var(--color-text-light); font-size: 0.85em; }
        .file-upload-label:hover { border-color: var(--color-accent); background: rgba(255, 152, 0, 0.06); }
        .file-upload-label .icon { font-size: 1.4em; }
        .file-name { display: block; margin-top: 4px; font-family: var(--font-mono); font-size: 0.75em; color: var(--color-teal); font-weight: 500; }
        .slider-value { background: var(--color-accent); color: #000; padding: 2px 7px; border-radius: 2px; font-family: var(--font-mono); font-weight: 700; font-size: 0.8em; }
        .info-box { background: rgba(79, 209, 197, 0.08); border-left: 3px solid var(--color-teal); padding: 10px 12px; border-radius: var(--radius); margin-top: 8px; font-family: var(--font-mono); font-size: 0.75em; color: var(--color-teal); }
        #logoOptions > div { background: rgba(0, 0, 0, 0.3) !important; border-color: var(--color-border) !important; }
        #logoOptions span[style*="color:#555"] { color: var(--color-teal) !important; }
        ::-webkit-scrollbar { width: 6px; }
        ::-webkit-scrollbar-track { background: rgba(0, 0, 0, 0.3); }
        ::-webkit-scrollbar-thumb { background: var(--color-accent); border-radius: 3px; }
        @media (max-width: 1024px) { .main-content { grid-template-columns: 1fr; } .preview-panel { border-left: none; border-top: 1px solid var(--color-border); position: static; max-height: none; overflow: visible; } }
        @keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
        @keyframes fadeInDown { from { opacity: 0; transform: translateY(-15px); } to { opacity: 1; transform: translateY(0); } }
        .header { animation: fadeInDown 0.8s ease-out; }
        .panel { animation: fadeIn 1s ease-out 0.3s backwards; }

        
        .header-top { display: flex; align-items: center; gap: 16px; flex-wrap: wrap; }
        .deployment-badge { font-family: var(--font-mono); font-size: 0.65em; color: var(--color-accent); text-transform: uppercase; letter-spacing: 1px; background: rgba(255, 152, 0, 0.1); padding: 4px 10px; border-radius: 2px; border: 1px solid var(--color-accent); font-weight: 700; text-shadow: 0 0 8px rgba(255, 152, 0, 0.4); animation: blink 2s infinite; }
.site-nav { background: rgba(0, 0, 0, 0.6); border-bottom: 1px solid var(--color-border); padding: 10px 40px; font-family: var(--font-mono); font-size: 0.82em; position: relative; z-index: 1; }
        .nav-content { max-width: 1400px; margin: 0 auto; display: flex; align-items: center; gap: 8px; }
        .nav-home { color: var(--color-teal); text-decoration: none; font-weight: 700; letter-spacing: 1px; text-transform: uppercase; transition: var(--transition); }
        .nav-home:hover { color: var(--color-teal-light); text-shadow: 0 0 10px rgba(79, 209, 197, 0.5); }
        .nav-sep { color: var(--color-border-light); }
        .nav-section { color: var(--color-accent); font-weight: 600; letter-spacing: 1px; text-transform: uppercase; }
        .nav-current { color: var(--color-text-light); font-weight: 500; letter-spacing: 0.5px; }
        .site-footer { background: linear-gradient(135deg, rgba(26, 26, 26, 0.98) 0%, rgba(13, 13, 13, 0.95) 100%); border-top: 1px solid var(--color-border); padding: 20px 40px; position: relative; z-index: 1; margin-top: auto; }
        .footer-content { max-width: 1400px; margin: 0 auto; display: flex; align-items: center; gap: 12px; font-family: var(--font-mono); font-size: 0.82em; }
        .footer-brand { color: var(--color-teal); font-weight: 700; letter-spacing: 2px; text-transform: uppercase; }
        .footer-sep { color: var(--color-border-light); }
        .footer-tool { color: var(--color-text-light); font-weight: 400; letter-spacing: 0.5px; }
        .footer-bottom { max-width: 1400px; margin: 0 auto; font-family: var(--font-display); font-size: 0.78em; color: var(--color-text-light); line-height: 1.6; text-align: center; }
        .footer-bottom p { margin: 2px 0; }
        .cc-license-link { color: var(--color-accent); text-decoration: none; }
        .cc-license-link:hover { text-decoration: underline; }
    
/* ═══ Clases utilitarias generadas al extraer los style="" inline (#40/#29) ═══
   Selector doblado .uN.uN: gana a las reglas de una sola clase manteniendo el
   orden natural de la cascada; SIN !important para que el JS (el.style.*) pueda
   seguir sobreescribiendo en runtime. */
.u1.u1 { font-size:0.72em;text-align:right;color:var(--color-text-light);margin-top:2px; }
.u2.u2 { display:none; }
.u3.u3 { margin-bottom:10px; }
.u4.u4 { margin-bottom:0; }
.u5.u5 { font-size:0.72em;text-align:right;color:var(--color-text-light);margin-top:4px; }
.u6.u6 { align-items:flex-end;padding-bottom:10px; }
.u7.u7 { font-size:0.72em;text-align:right;color:var(--color-text-light);margin-top:8px; }
.u8.u8 { position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0; }
.u9.u9 { margin-top:12px; }
.u10.u10 { display:none;max-width:160px;border-radius:var(--radius);margin:12px auto 0; }
.u11.u11 { display:none;margin-top:10px; }
.u12.u12 { display:none;margin-top:10px;text-align:center; }
.u13.u13 { max-width:100%;touch-action:none;cursor:crosshair;border:1px solid var(--color-border-light);border-radius:4px; }
.u14.u14 { font-size:0.75em;color:var(--color-text-light);margin-top:6px; }
.u15.u15 { display:flex;gap:10px;justify-content:center;margin-top:8px; }
.u16.u16 { font-size:0.78em;text-align:center;color:var(--color-text-light);margin-top:10px; }
.u17.u17 { font-size:0.72em;text-align:center;color:var(--color-text-light);margin-top:8px;opacity:0.8; }
.u18.u18 { margin-top:0; }
.u19.u19 { margin-bottom:12px; }
.u20.u20 { margin:10px 0; }
.u21.u21 { margin-bottom:8px; }
.u22.u22 { width:100%; }
.u23.u23 { margin-bottom:8px;display:none; }
.u24.u24 { margin-bottom:6px; }
.u25.u25 { display:block; }
.u26.u26 { margin-top:10px; }
.u27.u27 { font-size:0.85em;font-weight:600;color:var(--color-teal);margin-bottom:6px; }
.u28.u28 { background:rgba(0,0,0,0.25);border:1px solid var(--color-border);border-radius:var(--radius);padding:8px; }
.u29.u29 { background:rgba(0,0,0,0.3);border:1px solid var(--color-border);border-radius:var(--radius);padding:12px;margin-top:8px; }
.u30.u30 { display:flex;justify-content:space-between;align-items:center;margin-bottom:8px; }
.u31.u31 { font-size:0.85em;font-weight:600;color:var(--color-teal); }
.u32.u32 { background:#dc3545;color:#fff;border:none;border-radius:6px;padding:4px 12px;font-size:0.78em;cursor:pointer;font-weight:600; }
.u33.u33 { font-size:0.75em;color:var(--color-text-light); }
.u34.u34 { margin:10px 0 0; }
.u35.u35 { display:none;text-align:center;width:100%; }

/* ═══ Enlace "Instalar app" (PWA, #44) — línea discreta del pie de página, con estilo de
   enlace; nace oculto y app.js lo revela solo si el navegador permite instalar
   (beforeinstallprompt) o en iOS (instrucciones manuales al hacer clic). Ya instalada
   (standalone) no aparece nunca. Hereda fuente/tamaño de .footer-bottom. ═══ */
.install-link { display: none; margin: 0 auto 16px; padding: 0; font: inherit; color: var(--color-text-light); background: none; border: none; text-decoration: underline; text-underline-offset: 2px; cursor: pointer; transition: var(--transition); }
.install-link:hover { color: var(--color-teal); }
.install-hint { display: none; font-style: italic; }
/* Nota iOS bajo el enlace de instalar: oculta por defecto; app.js solo la revela en
   dispositivos iOS NO instalados (en Android/PC no hace falta y sería ruido).
   Más pequeña y tenue que el resto del pie para que informe sin molestar. */
.install-note { display: none; font-size: 0.9em; font-style: italic; color: var(--color-text-light); opacity: 0.75; max-width: 460px; margin: -14px auto 18px; line-height: 1.5; }

/* ═══ Toast "lista sin conexión": confirmación discreta en el 1er arranque de la app
   INSTALADA, cuando el precalentado offline (CORE + zxing + logos) ha terminado.
   Lo crea app.js por JS (CSP: sin estilos inline); .show lo desliza y desvanece. ═══ */
.offline-toast { position: fixed; left: 50%; bottom: 24px; transform: translate(-50%, 12px); background: var(--color-bg-secondary); color: var(--color-teal); border: 1px solid var(--color-border-light); padding: 10px 18px; border-radius: 999px; font-family: var(--font-mono); font-size: 0.85em; opacity: 0; transition: opacity 0.4s, transform 0.4s; z-index: 1000; pointer-events: none; box-shadow: 0 4px 16px var(--color-shadow); max-width: 90vw; text-align: center; }
.offline-toast.show { opacity: 1; transform: translate(-50%, 0); }
