/* Hallmark · pre-emit critique: P5 H4 E5 S5 R5 V5
 * Hallmark · genre: editorial · macrostructure: Component Playground · theme: Brutal
 * audience: home printers / small photo shops · use: uniform photo-grid printing
 * tone: utilitarian · enrichment: none · nav: N9 · footer: Ft2
 * contrast: pass (40–41) · slop: pass (42–45) · honest: pass (46)
 * chrome: pass (47) · tokens: pass (48) · responsive: pass (49) · icons: pass (30)
 * mobile: pass (34, 49, 50–57)
 */
@import url("tokens.css");

*, *::before, *::after { box-sizing: border-box; scrollbar-color: var(--color-scrollbar-thumb) var(--color-scrollbar-track); scrollbar-width: thin; }
*::-webkit-scrollbar { width: var(--space-sm); height: var(--space-sm); }
*::-webkit-scrollbar-track { background: var(--color-scrollbar-track); }
*::-webkit-scrollbar-thumb { border: var(--space-3xs) solid var(--color-scrollbar-track); border-radius: var(--radius-pill); background: var(--color-scrollbar-thumb); }
html, body { min-height: 100%; margin: 0; overflow-x: clip; }
body { color: var(--color-ink); background: var(--color-desk); font-family: var(--font-body); font-size: var(--text-base); line-height: 1.5; }
button, input { font: inherit; }
button { white-space: nowrap; }
[hidden] { display: none !important; }

.app-shell { min-height: 100dvh; display: grid; grid-template-rows: auto minmax(30rem, 1fr); }
.control-rail { color-scheme: dark; background: var(--color-rail); color: var(--color-rail-ink); }
.brand { position: sticky; inset-block-start: 0; z-index: var(--z-sticky); min-height: var(--header-height); display: flex; align-items: center; gap: var(--space-sm); padding-inline: var(--space-md); border-block-end: var(--rule-thin) solid var(--color-rail-2); color: var(--color-rail-ink); background: var(--color-rail); }
.brand__mark { width: 2rem; height: 2rem; flex: 0 0 auto; color: var(--color-accent-soft); }
.brand h1 { min-width: 0; margin: 0; overflow-wrap: anywhere; font-family: var(--font-display); font-size: var(--text-lg); font-style: normal; font-weight: 800; letter-spacing: -0.03em; line-height: 1.05; }
.control-columns { padding: 0 var(--space-md) var(--space-xl); }
.control-column { min-width: 0; }
.control-section { display: grid; gap: var(--space-sm); padding-block: var(--space-lg); border-block-end: var(--rule-thin) solid var(--color-rail-2); }
.control-section h2 { margin: 0; color: var(--color-rail-muted); font-family: var(--font-body); font-size: var(--text-xs); font-style: normal; font-weight: 700; letter-spacing: 0.12em; line-height: 1.2; text-transform: uppercase; }
.section-line { display: flex; align-items: center; justify-content: space-between; gap: var(--space-sm); }
.orientation-actions { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-xs); }
.orientation-actions .btn { width: 100%; }
.chips { display: flex; flex-wrap: wrap; gap: var(--space-xs); }
.chip, .btn, .drop-zone, .text-btn { border: var(--rule-thin) solid transparent; cursor: pointer; transition: background-color var(--dur-short) var(--ease-out), color var(--dur-short) var(--ease-out), transform var(--dur-micro) var(--ease-out); }
.chip, .btn, .text-btn { line-height: 1; }
.chip { min-height: 2.75rem; padding: var(--space-xs) var(--space-sm); border-color: var(--color-rail-2); border-radius: var(--radius-pill); color: var(--color-rail-ink); background: var(--color-rail-2); font-size: var(--text-sm); }
.chip[aria-pressed="true"] { border-color: var(--color-rail-ink); color: var(--color-ink); background: var(--color-rail-ink); font-weight: 700; }
.field-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-xs); }
.field { display: grid; gap: var(--space-2xs); color: var(--color-rail-muted); font-size: var(--text-xs); }
.field-actions { display: flex; align-items: end; }
.field-actions .btn { width: 100%; }
.field input { width: 100%; height: 2.75rem; padding: 0 var(--space-sm); border: var(--rule-thin) solid var(--color-rail-2); border-radius: var(--radius-md); outline: var(--rule-strong) solid transparent; outline-offset: var(--space-3xs); color: var(--color-rail-ink); background: var(--color-ink); font-family: var(--font-outlier); font-variant-numeric: tabular-nums; }
.slider-field { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: var(--space-xs); align-items: center; color: var(--color-rail-ink); font-size: var(--text-sm); }
.slider-field output { color: var(--color-rail-muted); font-family: var(--font-outlier); font-size: var(--text-xs); font-variant-numeric: tabular-nums; }
.slider-field input { grid-column: 1 / -1; width: 100%; min-height: 2.75rem; accent-color: var(--color-accent-soft); }
.slider-field--zoom { margin-block-start: var(--space-xs); }
.toggle { min-height: 2.75rem; display: flex; align-items: center; justify-content: space-between; gap: var(--space-md); border-block-end: var(--rule-thin) solid var(--color-rail-2); color: var(--color-rail-ink); font-size: var(--text-sm); }
.toggle:last-child { border-block-end: 0; }
.toggle input { width: 1.125rem; height: 1.125rem; accent-color: var(--color-accent-soft); }
.drop-zone { width: 100%; min-height: 5.5rem; display: grid; place-items: center; gap: var(--space-2xs); padding: var(--space-md); border-color: var(--color-rail-muted); border-style: dashed; border-radius: var(--radius-lg); color: var(--color-rail-muted); background: var(--color-rail); text-align: center; white-space: normal; }
.drop-zone strong { color: var(--color-rail-ink); font-size: var(--text-sm); }
.drop-zone span { font-size: var(--text-xs); }
.drop-zone.is-over { border-color: var(--color-accent-soft); color: var(--color-rail-ink); background: var(--color-rail-2); }
.thumbs { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: var(--space-xs); }
.thumb { position: relative; min-width: 0; padding: 0; aspect-ratio: 1; overflow: hidden; border: var(--rule-strong) solid transparent; border-radius: var(--radius-sm); background: var(--color-ink); cursor: pointer; transition: transform var(--dur-micro) var(--ease-out), border-color var(--dur-short) var(--ease-out); }
.thumb[aria-pressed="true"] { border-color: var(--color-accent-soft); }
.thumb:active { transform: scale(0.98); }
.thumb img { display: block; width: 100%; height: 100%; object-fit: cover; }
.thumb__copies { position: absolute; inset: auto var(--space-2xs) var(--space-2xs) auto; min-width: var(--space-lg); padding: var(--space-3xs) var(--space-2xs); border-radius: var(--radius-sm); color: var(--color-accent-ink); background: var(--color-accent); font-size: var(--text-xs); font-weight: 700; line-height: 1.2; }
.text-btn { min-height: 2.75rem; padding-inline: var(--space-xs); color: var(--color-rail-muted); background: transparent; font-size: var(--text-xs); }
.text-btn--danger { justify-self: start; color: var(--color-accent-soft); }
.btn { min-height: 2.75rem; padding: var(--space-xs) var(--space-md); border-color: var(--color-rule); border-radius: var(--radius-md); color: var(--color-ink); background: var(--color-paper-2); font-weight: 700; }
.btn--rail { justify-self: start; border-color: var(--color-rail-muted); color: var(--color-rail-ink); background: transparent; }
.btn--primary { border-color: var(--color-accent); color: var(--color-accent-ink); background: var(--color-accent); }
.btn--icon { width: 2.75rem; padding: 0; }
.btn:active, .chip:active, .drop-zone:active, .text-btn:active { transform: translateY(1px); }
.btn:disabled, .chip:disabled, .drop-zone:disabled, .thumb:disabled, .text-btn:disabled, input:disabled { opacity: 0.5; cursor: not-allowed; }
.btn[data-state="loading"] { cursor: wait; }
.btn[data-state="loading"] .btn__label { opacity: 0; }
.btn[data-state="loading"]::after { content: ""; display: inline-block; width: 1rem; height: 1rem; margin-inline-start: calc(var(--space-md) * -1); border: var(--rule-strong) solid currentColor; border-block-start-color: transparent; border-radius: 50%; animation: spin 0.8s linear infinite; }
.btn[data-state="success"] { border-color: var(--color-success); }
#png-button[data-state="success"] .btn__label { font-size: 0; }
#png-button[data-state="success"] .btn__label::after { content: "Đã tải ✓"; font-size: var(--text-base); }
.btn[data-state="error"] { border-color: var(--color-danger); }
:focus { outline: none; }
:focus-visible { outline: var(--rule-strong) solid var(--color-focus); outline-offset: var(--space-3xs); }
.control-rail :focus-visible { outline-color: var(--color-focus-on-dark); }

.workspace { min-width: 0; min-height: 0; display: grid; grid-template-rows: auto minmax(24rem, 1fr) auto; }
.action-bar { min-height: var(--header-height); display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: var(--space-sm); padding: var(--space-xs) var(--space-md); border-block-end: var(--rule-thin) solid var(--color-rule); color: var(--color-ink); background: var(--color-paper); }
.action-bar > p { min-width: 0; margin: 0; color: var(--color-muted); font-size: var(--text-sm); }
.action-bar > p strong { color: var(--color-ink); }
.action-bar__actions, .pager { display: flex; align-items: center; gap: var(--space-xs); }
.pager { font-size: var(--text-sm); font-variant-numeric: tabular-nums; }
.desk { position: relative; min-width: 0; min-height: 24rem; overflow: auto; display: grid; place-items: center; padding: var(--space-xl); scrollbar-color: var(--color-scrollbar-thumb) var(--color-desk); background-color: var(--color-desk); background-image: linear-gradient(var(--color-grid) var(--rule-thin), transparent var(--rule-thin)), linear-gradient(90deg, var(--color-grid) var(--rule-thin), transparent var(--rule-thin)); background-size: var(--space-lg) var(--space-lg); }
.desk::-webkit-scrollbar-track { background: var(--color-desk); }
.preview-legend { display: flex; align-items: center; flex-wrap: wrap; gap: var(--space-sm); color: var(--color-muted); font-size: var(--text-xs); }
.preview-legend span { display: inline-flex; align-items: center; gap: var(--space-2xs); white-space: nowrap; }
.legend-swatch { width: var(--space-sm); height: var(--space-sm); border: var(--rule-thin) solid var(--color-rule-strong); }
.legend-swatch--margin { background: var(--color-margin-preview); }
.legend-swatch--area { background: var(--color-print-zone); }
.legend-swatch--guide { height: 0; border: 0; border-block-start: var(--rule-thin) dashed var(--color-guide); }
.stage { position: relative; }
.sheet { position: relative; overflow: hidden; transform-origin: top left; color: var(--color-muted); background: var(--color-margin-preview); box-shadow: var(--shadow-sheet); }
.sheet.is-over { box-shadow: var(--shadow-sheet), inset 0 0 0 var(--rule-strong) var(--color-accent); }
.print-zone { position: absolute; z-index: var(--z-base); background: var(--color-print-zone); }
.sheet-message { position: absolute; inset: 0; z-index: var(--z-raised); display: grid; place-items: center; padding: var(--space-lg); text-align: center; }
.cell { position: absolute; z-index: var(--z-raised); overflow: hidden; background: var(--color-paper-3); cursor: grab; touch-action: none; }
.cell:active { cursor: grabbing; }
.cell.is-empty { background: repeating-linear-gradient(-45deg, var(--color-paper-2), var(--color-paper-2) var(--space-xs), var(--color-paper-3) var(--space-xs), var(--color-paper-3) var(--space-md)); cursor: default; }
.cell.is-drop-target::after { content: "Thả ảnh"; position: absolute; inset: var(--space-xs); z-index: var(--z-guide); display: grid; place-items: center; border: var(--rule-strong) dashed var(--color-accent); color: var(--color-ink); background: var(--color-paper); font-size: var(--text-sm); font-weight: 700; line-height: 1; pointer-events: none; }
.cell img { display: block; width: 100%; height: 100%; pointer-events: none; user-select: none; }
.photo-surface { position: absolute; left: 50%; top: 50%; overflow: hidden; transform-origin: center; background: var(--color-print-paper); }
.cell:focus-visible { outline-offset: calc(-1 * var(--rule-strong)); z-index: var(--z-guide); }
.crop-mark { z-index: var(--z-guide); }
.field-hint { margin: 0; color: var(--color-rail-muted); font-size: var(--text-xs); overflow-wrap: anywhere; }
.mobile-jump { display: inline-flex; min-height: 2.75rem; align-items: center; color: inherit; font-size: var(--text-sm); white-space: nowrap; }
.brand .mobile-jump { margin-inline-start: auto; }
.cell.is-keyline { box-shadow: inset 0 0 0 0.3mm var(--color-ink); }
.crop-mark { position: absolute; width: 2mm; height: 2mm; pointer-events: none; border-color: var(--color-ink); border-style: solid; }
.crop-mark--tl { inset: 0 auto auto 0; border-width: 0.25mm 0 0 0.25mm; }
.crop-mark--tr { inset: 0 0 auto auto; border-width: 0.25mm 0.25mm 0 0; }
.crop-mark--bl { inset: auto auto 0 0; border-width: 0 0 0.25mm 0.25mm; }
.crop-mark--br { inset: auto 0 0 auto; border-width: 0 0.25mm 0.25mm 0; }
.cut-guide { position: absolute; z-index: var(--z-guide); pointer-events: none; opacity: 0.55; }
.cut-guide--vertical { width: 0; border-inline-start: 0.18mm dashed var(--color-guide); transform: translateX(-50%); }
.cut-guide--horizontal { height: 0; border-block-start: 0.18mm dashed var(--color-guide); transform: translateY(-50%); }
.status-line { display: flex; align-items: center; justify-content: space-between; gap: var(--space-md); padding: var(--space-xs) var(--space-md); border-block-start: var(--rule-thin) solid var(--color-rule); color: var(--color-muted); background: var(--color-paper); font-size: var(--text-sm); }
.status-line p { margin: 0; }
.status-line .is-warning { color: var(--color-warning); font-weight: 700; }
.status-line .is-good { color: var(--color-success); font-weight: 700; }
.toast { position: fixed; inset: auto var(--space-md) var(--space-md) auto; z-index: var(--z-toast); max-width: min(24rem, calc(100% - var(--space-xl))); padding: var(--space-sm) var(--space-md); border: var(--rule-strong) solid var(--color-danger); border-radius: var(--radius-md); color: var(--color-accent-ink); background: var(--color-ink); opacity: 0; transform: translateY(var(--space-xs)); pointer-events: none; }
.toast.is-visible { opacity: 1; transform: none; }

@keyframes spin { to { transform: rotate(360deg); } }
@media (hover: hover) and (pointer: fine) {
  .chip:hover, .btn--rail:hover, .text-btn:hover { color: var(--color-ink); background: var(--color-rail-ink); }
  .btn:not(.btn--rail):hover { background: var(--color-paper-3); }
  .btn--primary:hover { color: var(--color-accent-ink); background: var(--color-accent-2); }
  .drop-zone:hover { border-color: var(--color-accent-soft); color: var(--color-rail-ink); }
  .field input:hover { background: var(--color-rail-2); }
  .thumb:not([aria-pressed="true"]):hover { border-color: var(--color-rail-muted); }
}
@media (min-width: 40rem) {
  .control-columns { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: var(--space-xl); }
  .thumbs { grid-template-columns: repeat(5, minmax(0, 1fr)); }
}
@media (min-width: 60rem) {
  .mobile-jump { display: none; }
  .app-shell { grid-template-columns: 22rem minmax(0, 1fr); grid-template-rows: minmax(0, 100dvh); }
  .control-rail { min-height: 0; display: grid; grid-template-rows: auto minmax(0, 1fr); overflow: clip; border-inline-end: var(--rule-thin) solid var(--color-ink); }
  .control-rail .brand { position: relative; }
  .control-columns { display: block; min-height: 0; overflow-y: auto; scrollbar-gutter: stable; scrollbar-color: var(--color-scrollbar-thumb) var(--color-rail); }
  .control-columns::-webkit-scrollbar-track { background: var(--color-rail); }
  .control-columns::-webkit-scrollbar-thumb { border-color: var(--color-rail); }
  .thumbs { grid-template-columns: repeat(4, minmax(0, 1fr)); }
}
@media (min-width: 76rem) {
  .app-shell { grid-template-columns: 40rem minmax(0, 1fr); }
  .control-columns { display: grid; grid-template-columns: minmax(0, 0.92fr) minmax(0, 1.08fr); gap: var(--space-xl); }
  .control-column--extended { border-inline-start: var(--rule-thin) solid var(--color-rail-2); padding-inline-start: var(--space-xl); }
}
@media (max-width: 39.999rem) {
  .action-bar { align-items: flex-start; flex-direction: column; }
  .action-bar__actions { width: 100%; flex-wrap: wrap; }
  .action-bar__actions > .btn { flex: 1 1 auto; }
  .status-line { flex-direction: column; gap: var(--space-2xs); }
  .desk { padding: var(--space-md); }
}
@media (pointer: coarse) { .btn, .chip, .text-btn { min-height: 2.75rem; } }
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation-duration: 150ms !important; animation-iteration-count: 1 !important; transition-duration: 150ms !important; }
  .btn[data-state="loading"]::after { animation: none !important; }
}
@media print {
  .crop-mark { display: none !important; }
  .control-rail, .action-bar, .status-line, .toast, .session-tabs { display: none !important; }
  .cell.is-empty { background: transparent; }
  html, body, .app-shell, .workspace, .desk { display: block; min-height: 0; padding: 0; overflow: visible; background: var(--color-print-paper); }
  .stage { width: auto !important; height: auto !important; }
  .sheet { transform: none !important; background: var(--color-print-paper); box-shadow: none; break-after: page; }
  .print-zone { display: none; }
  .cut-guide { opacity: 0.45; }
  .cut-guide--vertical { border-inline-start-color: var(--color-guide-print); }
  .cut-guide--horizontal { border-block-start-color: var(--color-guide-print); }
}


.action-bar__actions { flex-wrap: wrap; }
.pager { flex: 0 0 auto; }
#page-label { min-width: 5rem; text-align: center; font-weight: 700; white-space: nowrap; }


.selected-file { display: flex; gap: var(--space-xs); align-items: center; min-width: 0; }
.selected-file .field-hint { flex: 1; min-width: 0; }
.selected-file .text-btn { flex: 0 0 auto; }
.session-tabs .btn { flex: 0 0 auto; }
.session-tabs [aria-pressed="true"] { color: var(--color-accent-ink); background: var(--color-accent); }


.menu-anchor { position: relative; }
.popup-panel { position: absolute; top: calc(100% + var(--space-xs)); right: 0; z-index: var(--z-sticky); min-width: 10rem; max-height: 18rem; overflow-y: auto; padding: var(--space-xs); border: var(--rule-thin) solid var(--color-rule); border-radius: var(--radius-md); background: var(--color-paper); box-shadow: var(--shadow-sheet); }
.session-tabs { left: 0; right: auto; width: 14rem; max-width: calc(100vw - var(--space-xl)); display: grid; gap: var(--space-xs); }
.session-item { position: relative; }
.session-item > .btn { width: 100%; padding-inline-end: var(--space-xl); text-align: left; }
.session-close { position: absolute; top: var(--space-2xs); right: var(--space-2xs); width: 1.25rem; height: 1.25rem; padding: 0; border: 0; border-radius: var(--radius-sm); color: var(--color-muted); background: transparent; font: inherit; font-size: var(--text-sm); line-height: 1; cursor: pointer; }
.session-close:hover { color: var(--color-accent-ink); background: var(--color-accent); }
.session-close:active { transform: translateY(1px); }
.session-close:disabled { opacity: 0.5; cursor: not-allowed; }
.download-menu { display: grid; gap: var(--space-xs); }
.spacing-section { padding-block: var(--space-md); gap: var(--space-xs); }
.spacing-section .slider-field { row-gap: var(--space-2xs); }
.spacing-section .slider-field input { min-height: 2rem; }
.size-select { width: 100%; min-width: 0; height: 2.75rem; padding-inline: var(--space-sm); border: var(--rule-thin) solid var(--color-rail-2); border-radius: var(--radius-md); color: var(--color-rail-ink); background: var(--color-ink); font: inherit; }
.size-select:disabled { opacity: 0.5; cursor: not-allowed; }
.size-select:hover:not(:disabled) { background: var(--color-rail-2); }
