/* cityplanner-2026 — chunk Tailwind condiviso della famiglia geodata-download
   (PLN-011 T-04, output minificato originale — non riformattato).
   PLN-017 T-05 (DA-02) — audit di scoping: le regole PREFLIGHT su elementi
   bari che intercettavano la chrome di sistema (site.css caricato prima)
   sono ristrette alla classe radice dell'app `.geodata-app` (il wrapper
   radice che le due viste montano attorno all'intera app):
   - `html,:host{…}` + `body{margin:0;line-height:inherit}` → trasposte in
     `.geodata-app{…}` (line-height:inherit risolto al valore preflight 1.5;
     margin:0 e text-size-adjust inerti su un div, conservati per fedeltà);
   - `h1,…,h6`, `a`, `ol,ul,menu`, `img,svg,video,canvas,audio,iframe,embed,
     object` → `.geodata-app :where(…)`: `:where()` mantiene la specificità a
     (0,1,0), così le utility class (stessa specificità, più tardi nel foglio)
     continuano a vincere come nel preflight originale — un prefisso nudo
     (0,1,1) le avrebbe scavalcate, rompendo testi e colori dell'app.
   Restano globali di proposito: i blocchi `*,:before,:after`/`::backdrop`
   (custom property --tw-* e border-reset a specificità zero: servono anche ai
   toast che notification-service.js appende a document.body, e ogni classe li
   batte comunque) e le regole su elementi assenti dalla chrome di sistema
   (hr, form controls, code/pre, table, b/strong, ecc.). */
*,:before,:after{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }::backdrop{--tw-border-spacing-x: 0;--tw-border-spacing-y: 0;--tw-translate-x: 0;--tw-translate-y: 0;--tw-rotate: 0;--tw-skew-x: 0;--tw-skew-y: 0;--tw-scale-x: 1;--tw-scale-y: 1;--tw-pan-x: ;--tw-pan-y: ;--tw-pinch-zoom: ;--tw-scroll-snap-strictness: proximity;--tw-gradient-from-position: ;--tw-gradient-via-position: ;--tw-gradient-to-position: ;--tw-ordinal: ;--tw-slashed-zero: ;--tw-numeric-figure: ;--tw-numeric-spacing: ;--tw-numeric-fraction: ;--tw-ring-inset: ;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-color: rgb(59 130 246 / .5);--tw-ring-offset-shadow: 0 0 #0000;--tw-ring-shadow: 0 0 #0000;--tw-shadow: 0 0 #0000;--tw-shadow-colored: 0 0 #0000;--tw-blur: ;--tw-brightness: ;--tw-contrast: ;--tw-grayscale: ;--tw-hue-rotate: ;--tw-invert: ;--tw-saturate: ;--tw-sepia: ;--tw-drop-shadow: ;--tw-backdrop-blur: ;--tw-backdrop-brightness: ;--tw-backdrop-contrast: ;--tw-backdrop-grayscale: ;--tw-backdrop-hue-rotate: ;--tw-backdrop-invert: ;--tw-backdrop-opacity: ;--tw-backdrop-saturate: ;--tw-backdrop-sepia: ;--tw-contain-size: ;--tw-contain-layout: ;--tw-contain-paint: ;--tw-contain-style: }*,:before,:after{box-sizing:border-box;border-width:0;border-style:solid;border-color:#e5e7eb}:before,:after{--tw-content: ""}.geodata-app{line-height:1.5;-webkit-text-size-adjust:100%;-moz-tab-size:4;-o-tab-size:4;tab-size:4;font-family:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji",Segoe UI Symbol,"Noto Color Emoji";font-feature-settings:normal;font-variation-settings:normal;-webkit-tap-highlight-color:transparent;margin:0}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}.geodata-app :where(h1,h2,h3,h4,h5,h6){font-size:inherit;font-weight:inherit}.geodata-app :where(a){color:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace;font-feature-settings:normal;font-variation-settings:normal;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}button,input,optgroup,select,textarea{font-family:inherit;font-feature-settings:inherit;font-variation-settings:inherit;font-size:100%;font-weight:inherit;line-height:inherit;letter-spacing:inherit;color:inherit;margin:0;padding:0}button,select{text-transform:none}button,input:where([type=button]),input:where([type=reset]),input:where([type=submit]){-webkit-appearance:button;background-color:transparent;background-image:none}:-moz-focusring{outline:auto}:-moz-ui-invalid{box-shadow:none}progress{vertical-align:baseline}::-webkit-inner-spin-button,::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}summary{display:list-item}blockquote,dl,dd,h1,h2,h3,h4,h5,h6,hr,figure,p,pre{margin:0}fieldset{margin:0;padding:0}legend{padding:0}.geodata-app :where(ol,ul,menu){list-style:none;margin:0;padding:0}dialog{padding:0}textarea{resize:vertical}input::-moz-placeholder,textarea::-moz-placeholder{opacity:1;color:#9ca3af}input::placeholder,textarea::placeholder{opacity:1;color:#9ca3af}button,[role=button]{cursor:pointer}:disabled{cursor:default}.geodata-app :where(img,svg,video,canvas,audio,iframe,embed,object){display:block;vertical-align:middle}img,video{max-width:100%;height:auto}[hidden]:where(:not([hidden=until-found])){display:none}.container{width:100%}@media (min-width: 640px){.container{max-width:640px}}@media (min-width: 768px){.container{max-width:768px}}@media (min-width: 1024px){.container{max-width:1024px}}@media (min-width: 1280px){.container{max-width:1280px}}@media (min-width: 1536px){.container{max-width:1536px}}.pointer-events-none{pointer-events:none}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.inset-0{inset:0}.inset-y-0{top:0;bottom:0}.left-0{left:0}.right-4{right:1rem}.top-4{top:1rem}.z-50{z-index:50}.mx-4{margin-left:1rem;margin-right:1rem}.mx-auto{margin-left:auto;margin-right:auto}.-ml-1{margin-left:-.25rem}.mb-2{margin-bottom:.5rem}.mb-4{margin-bottom:1rem}.mb-6{margin-bottom:1.5rem}.ml-2{margin-left:.5rem}.mr-2{margin-right:.5rem}.mr-3{margin-right:.75rem}.mt-2{margin-top:.5rem}.block{display:block}.flex{display:flex}.inline-flex{display:inline-flex}.table{display:table}.h-16{height:4rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.min-h-screen{min-height:100vh}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-full{width:100%}.max-w-7xl{max-width:80rem}.max-w-md{max-width:28rem}.flex-1{flex:1 1 0%}.scale-100{--tw-scale-x: 1;--tw-scale-y: 1;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.scale-95{--tw-scale-x: .95;--tw-scale-y: .95;transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}.transform{transform:translate(var(--tw-translate-x),var(--tw-translate-y)) rotate(var(--tw-rotate)) skew(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y))}@keyframes spin{to{transform:rotate(360deg)}}.animate-spin{animation:spin 1s linear infinite}.flex-col{flex-direction:column}.items-center{align-items:center}.justify-center{justify-content:center}.justify-between{justify-content:space-between}.gap-4{gap:1rem}.space-x-2>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.5rem * var(--tw-space-x-reverse));margin-left:calc(.5rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-3>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(.75rem * var(--tw-space-x-reverse));margin-left:calc(.75rem * calc(1 - var(--tw-space-x-reverse)))}.space-x-4>:not([hidden])~:not([hidden]){--tw-space-x-reverse: 0;margin-right:calc(1rem * var(--tw-space-x-reverse));margin-left:calc(1rem * calc(1 - var(--tw-space-x-reverse)))}.rounded{border-radius:.25rem}.rounded-full{border-radius:9999px}.rounded-lg{border-radius:.5rem}.border{border-width:1px}.border-b{border-bottom-width:1px}.border-b-2{border-bottom-width:2px}.border-blue-500{--tw-border-opacity: 1;border-color:rgb(59 130 246 / var(--tw-border-opacity, 1))}.border-blue-700{--tw-border-opacity: 1;border-color:rgb(29 78 216 / var(--tw-border-opacity, 1))}.border-gray-600{--tw-border-opacity: 1;border-color:rgb(75 85 99 / var(--tw-border-opacity, 1))}.border-gray-700{--tw-border-opacity: 1;border-color:rgb(55 65 81 / var(--tw-border-opacity, 1))}.border-red-700{--tw-border-opacity: 1;border-color:rgb(185 28 28 / var(--tw-border-opacity, 1))}.border-yellow-700{--tw-border-opacity: 1;border-color:rgb(161 98 7 / var(--tw-border-opacity, 1))}.bg-black{--tw-bg-opacity: 1;background-color:rgb(0 0 0 / var(--tw-bg-opacity, 1))}.bg-blue-100{--tw-bg-opacity: 1;background-color:rgb(219 234 254 / var(--tw-bg-opacity, 1))}.bg-blue-600{--tw-bg-opacity: 1;background-color:rgb(37 99 235 / var(--tw-bg-opacity, 1))}.bg-blue-900{--tw-bg-opacity: 1;background-color:rgb(30 58 138 / var(--tw-bg-opacity, 1))}.bg-gray-400\/20{background-color:#9ca3af33}.bg-gray-700{--tw-bg-opacity: 1;background-color:rgb(55 65 81 / var(--tw-bg-opacity, 1))}.bg-gray-800{--tw-bg-opacity: 1;background-color:rgb(31 41 55 / var(--tw-bg-opacity, 1))}.bg-gray-900{--tw-bg-opacity: 1;background-color:rgb(17 24 39 / var(--tw-bg-opacity, 1))}.bg-green-100{--tw-bg-opacity: 1;background-color:rgb(220 252 231 / var(--tw-bg-opacity, 1))}.bg-green-600{--tw-bg-opacity: 1;background-color:rgb(22 163 74 / var(--tw-bg-opacity, 1))}.bg-lime-400\/20{background-color:#a3e63533}.bg-purple-100{--tw-bg-opacity: 1;background-color:rgb(243 232 255 / var(--tw-bg-opacity, 1))}.bg-red-400\/20{background-color:#f8717133}.bg-red-600{--tw-bg-opacity: 1;background-color:rgb(220 38 38 / var(--tw-bg-opacity, 1))}.bg-red-900{--tw-bg-opacity: 1;background-color:rgb(127 29 29 / var(--tw-bg-opacity, 1))}.bg-yellow-400\/20{background-color:#facc1533}.bg-yellow-600{--tw-bg-opacity: 1;background-color:rgb(202 138 4 / var(--tw-bg-opacity, 1))}.bg-yellow-900{--tw-bg-opacity: 1;background-color:rgb(113 63 18 / var(--tw-bg-opacity, 1))}.bg-opacity-50{--tw-bg-opacity: .5}.p-1{padding:.25rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-6{padding:1.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.px-2\.5{padding-left:.625rem;padding-right:.625rem}.px-3{padding-left:.75rem;padding-right:.75rem}.px-4{padding-left:1rem;padding-right:1rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.pb-1{padding-bottom:.25rem}.pl-10{padding-left:2.5rem}.pl-3{padding-left:.75rem}.pr-4{padding-right:1rem}.text-sm{font-size:.875rem;line-height:1.25rem}.text-xl{font-size:1.25rem;line-height:1.75rem}.text-xs{font-size:.75rem;line-height:1rem}.font-bold{font-weight:700}.font-medium{font-weight:500}.font-semibold{font-weight:600}.text-blue-200{--tw-text-opacity: 1;color:rgb(191 219 254 / var(--tw-text-opacity, 1))}.text-blue-300{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.text-blue-400{--tw-text-opacity: 1;color:rgb(96 165 250 / var(--tw-text-opacity, 1))}.text-blue-800{--tw-text-opacity: 1;color:rgb(30 64 175 / var(--tw-text-opacity, 1))}.text-gray-100{--tw-text-opacity: 1;color:rgb(243 244 246 / var(--tw-text-opacity, 1))}.text-gray-200{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.text-gray-300{--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.text-gray-400{--tw-text-opacity: 1;color:rgb(156 163 175 / var(--tw-text-opacity, 1))}.text-green-800{--tw-text-opacity: 1;color:rgb(22 101 52 / var(--tw-text-opacity, 1))}.text-lime-300{--tw-text-opacity: 1;color:rgb(190 242 100 / var(--tw-text-opacity, 1))}.text-purple-800{--tw-text-opacity: 1;color:rgb(107 33 168 / var(--tw-text-opacity, 1))}.text-red-200{--tw-text-opacity: 1;color:rgb(254 202 202 / var(--tw-text-opacity, 1))}.text-red-300{--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.text-red-400{--tw-text-opacity: 1;color:rgb(248 113 113 / var(--tw-text-opacity, 1))}.text-white{--tw-text-opacity: 1;color:rgb(255 255 255 / var(--tw-text-opacity, 1))}.text-yellow-200{--tw-text-opacity: 1;color:rgb(254 240 138 / var(--tw-text-opacity, 1))}.text-yellow-300{--tw-text-opacity: 1;color:rgb(253 224 71 / var(--tw-text-opacity, 1))}.text-yellow-400{--tw-text-opacity: 1;color:rgb(250 204 21 / var(--tw-text-opacity, 1))}.opacity-0{opacity:0}.opacity-100{opacity:1}.opacity-25{opacity:.25}.opacity-75{opacity:.75}.shadow-lg{--tw-shadow: 0 10px 15px -3px rgb(0 0 0 / .1), 0 4px 6px -4px rgb(0 0 0 / .1);--tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.shadow-xl{--tw-shadow: 0 20px 25px -5px rgb(0 0 0 / .1), 0 8px 10px -6px rgb(0 0 0 / .1);--tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color);box-shadow:var(--tw-ring-offset-shadow, 0 0 #0000),var(--tw-ring-shadow, 0 0 #0000),var(--tw-shadow)}.filter{filter:var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow)}.transition{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,-webkit-backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter;transition-property:color,background-color,border-color,text-decoration-color,fill,stroke,opacity,box-shadow,transform,filter,backdrop-filter,-webkit-backdrop-filter;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-colors{transition-property:color,background-color,border-color,text-decoration-color,fill,stroke;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.transition-opacity{transition-property:opacity;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-duration:.15s}.duration-200{transition-duration:.2s}.duration-300{transition-duration:.3s}.ease-in{transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{transition-timing-function:cubic-bezier(0,0,.2,1)}.hover\:bg-blue-700:hover{--tw-bg-opacity: 1;background-color:rgb(29 78 216 / var(--tw-bg-opacity, 1))}.hover\:bg-gray-600:hover{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity, 1))}.hover\:bg-green-700:hover{--tw-bg-opacity: 1;background-color:rgb(21 128 61 / var(--tw-bg-opacity, 1))}.hover\:bg-red-700:hover{--tw-bg-opacity: 1;background-color:rgb(185 28 28 / var(--tw-bg-opacity, 1))}.hover\:text-blue-300:hover{--tw-text-opacity: 1;color:rgb(147 197 253 / var(--tw-text-opacity, 1))}.hover\:text-gray-200:hover{--tw-text-opacity: 1;color:rgb(229 231 235 / var(--tw-text-opacity, 1))}.focus\:border-transparent:focus{border-color:transparent}.focus\:outline-none:focus{outline:2px solid transparent;outline-offset:2px}.focus\:ring-2:focus{--tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color);--tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color);box-shadow:var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow, 0 0 #0000)}.focus\:ring-blue-500:focus{--tw-ring-opacity: 1;--tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity, 1))}.disabled\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\:bg-blue-800:disabled{--tw-bg-opacity: 1;background-color:rgb(30 64 175 / var(--tw-bg-opacity, 1))}.disabled\:bg-gray-600:disabled{--tw-bg-opacity: 1;background-color:rgb(75 85 99 / var(--tw-bg-opacity, 1))}.disabled\:bg-green-800:disabled{--tw-bg-opacity: 1;background-color:rgb(22 101 52 / var(--tw-bg-opacity, 1))}.disabled\:bg-red-800:disabled{--tw-bg-opacity: 1;background-color:rgb(153 27 27 / var(--tw-bg-opacity, 1))}.dark\:bg-gray-400\/10:is(.dark *){background-color:#9ca3af1a}.dark\:bg-lime-400\/10:is(.dark *){background-color:#a3e6351a}.dark\:bg-red-400\/10:is(.dark *){background-color:#f871711a}.dark\:bg-yellow-400\/10:is(.dark *){background-color:#facc151a}.dark\:text-gray-300:is(.dark *){--tw-text-opacity: 1;color:rgb(209 213 219 / var(--tw-text-opacity, 1))}.dark\:text-lime-300:is(.dark *){--tw-text-opacity: 1;color:rgb(190 242 100 / var(--tw-text-opacity, 1))}.dark\:text-red-300:is(.dark *){--tw-text-opacity: 1;color:rgb(252 165 165 / var(--tw-text-opacity, 1))}.dark\:text-yellow-300:is(.dark *){--tw-text-opacity: 1;color:rgb(253 224 71 / var(--tw-text-opacity, 1))}@media (min-width: 640px){.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}}@media (min-width: 768px){.md\:flex-row{flex-direction:row}.md\:items-center{align-items:center}.md\:justify-between{justify-content:space-between}}@media (min-width: 1024px){.lg\:px-8{padding-left:2rem;padding-right:2rem}}

/* ======================================================================
   PLN-017 T-13 (rework dal walkthrough) — veste cream dell'app.
   L'app adotta il canvas e i token del design system di /css/site.css: le
   utility di colore del build congelato qui sopra non vengono più usate dal
   markup delle due viste, che porta invece le classi semantiche `gd-*` di
   questa sezione (build JIT congelato: nessuna utility nuova è disponibile,
   quindi ogni superficie colorata vive qui, sui soli token di sistema).
   La sezione è in coda a QUESTO file — e non in uno <style> per vista —
   perché app-bar e modale login/register sono markup condiviso verbatim tra
   indice e dettaglio: un solo punto di verità, caricato da entrambe.
   L'override di --focus-outline introdotto da T-10 per i fondi scuri è
   rimosso: sul cream vale il default --ink di site.css.

   Contratto col JS (sole stringhe di classi di presentazione):
   - main.js/detail.js `applyTabClasses()` toggla `gd-tab-active`/`gd-tab-inactive`;
   - detail.js `getStatusClass()` ritorna le varianti `gd-badge--status-*`
     sopra la base `gd-badge gd-badge--status`;
   - tabulator-config.js usa `gd-cell-strong`/`gd-cell-muted` per i testi di
     cella, `gd-chip gd-chip--*` per i chip colonna e `gd-btn gd-btn--*` per
     i bottoni della colonna Actions.
   Le tinte derivate usano color-mix in srgb sui token; ogni abbinamento
   testuale è stato verificato ≥ 4.5:1 (AA), i soli usi non testuali ≥ 3:1.
   ====================================================================== */

/* Radice: canvas dell'app sui token di sistema (vince sul preflight scoped
   qui sopra perché a pari specificità viene dopo nel file). */
.geodata-app {
  background: var(--bg);
  color: var(--ink);
  font-family: var(--font-body);
}

/* Focus visibile su ogni controllo dell'app (i markup non portano più le
   utility focus:* del build): outline inchiostro, offset fuori dal bordo —
   visibile anche sui bottoni pieni perché cade sul fondo chiaro circostante. */
.geodata-app :where(button, input, select, textarea):focus-visible {
  outline: 2px solid var(--focus-outline);
  outline-offset: 2px;
}

/* --------------------------- App bar --------------------------- */

.gd-app-bar {
  background: var(--bg-soft);
  border-bottom: 1px solid var(--rule);
}

.gd-app-title {
  font-family: var(--font-display);
  font-weight: 500;
  letter-spacing: -0.015em;
  color: var(--ink);
}

/* Micro-label mono del registro editoriale; --ink-2 e non --ink-3 perché su
   --bg-soft il tono micro-label scende sotto AA (4.18:1 misurato). */
.gd-app-subtitle {
  font-family: var(--font-mono);
  font-size: 0.71875rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-2);
}

/* ------------------------ Testi di servizio ------------------------ */

.gd-text-muted { color: var(--ink-2); }
.gd-text-strong { color: var(--ink); }
.gd-desc { color: var(--ink-2); font-style: italic; }

.gd-icon-muted { color: var(--ink-2); flex-shrink: 0; }
.gd-icon-accent { color: var(--mark); flex-shrink: 0; }

/* Micro-label dei metadati (scheda detail): idioma mono uppercase del
   design system, tono AA --ink-3 sui fondi chiari --bg/--bg-code. */
.gd-label {
  font-family: var(--font-mono);
  font-size: 0.71875rem;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--ink-3);
  margin-bottom: 0.25rem;
}

.gd-value { color: var(--ink); }

/* ----------------------------- Link ----------------------------- */
/* Stesso idioma dei link di site.css (il preflight scoped li resetta
   dentro l'app): inchiostro, hairline che si accende sull'accento. */

.gd-link {
  color: var(--ink);
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-decoration-color: var(--rule);
  text-underline-offset: 0.2em;
}

.gd-link:hover { text-decoration-color: var(--mark); }

.gd-link-wrap { word-break: break-all; }

/* ---------------------------- Bottoni ---------------------------- */

.gd-btn:disabled {
  opacity: 0.55;
  cursor: not-allowed;
}

.gd-btn--primary {
  background: var(--ink);
  color: var(--bg);
}

.gd-btn--primary:not(:disabled):hover {
  background: color-mix(in srgb, var(--ink) 80%, var(--bg));
}

.gd-btn--danger {
  background: var(--mark);
  color: var(--bg);
}

.gd-btn--danger:not(:disabled):hover {
  background: color-mix(in srgb, var(--mark) 85%, var(--ink));
}

.gd-btn--soft {
  background: var(--bg-soft);
  border: 1px solid var(--rule);
  color: var(--ink);
}

.gd-btn--soft:not(:disabled):hover { border-color: var(--mark); }

/* Bottone-icona nudo (chiusura modale): solo tono, nessuna superficie. */
.gd-icon-button { color: var(--ink-2); }
.gd-icon-button:hover { color: var(--ink); }

/* ------------------------ Modale login/register ------------------------ */

.gd-modal {
  background: var(--bg);
  border: 1px solid var(--rule);
}

.gd-tab {
  font-family: var(--font-display);
  font-weight: 500;
}

/* Stati toggolati da applyTabClasses() (main.js/detail.js). */
.gd-tab-active {
  color: var(--ink);
  border-bottom: 2px solid var(--mark);
}

.gd-tab-inactive { color: var(--ink-3); }
.gd-tab-inactive:hover { color: var(--ink); }

.gd-form-label {
  font-size: 0.875rem;
  line-height: 1.25rem;
  font-weight: 500;
  color: var(--ink);
}

.gd-input {
  background: var(--bg-code);
  border: 1px solid var(--rule);
  color: var(--ink);
}

.gd-input::placeholder {
  color: var(--ink-3);
  opacity: 1;
}

/* Box errore dei form (dentro la modale). */
.gd-alert {
  background: var(--bg-code);
  border: 1px solid var(--mark);
}

.gd-alert-text { color: var(--mark); }

/* ----------------------------- Banner ----------------------------- */
/* Superficie soft su hairline, accento a sinistra per la variante; titolo
   in inchiostro, corpo in --ink-2 (i <p> lo ereditano già da site.css). */

.gd-banner {
  background: var(--bg-soft);
  border: 1px solid var(--rule);
  border-left: 3px solid var(--ink-2);
  border-radius: 0.5rem;
}

.gd-banner--error { border-left-color: var(--mark); }
.gd-banner--warn { border-left-color: var(--mark); }
.gd-banner--info { border-left-color: var(--ink-3-decor); }

.gd-banner-title {
  font-family: var(--font-body);
  color: var(--ink);
}

/* --------------------------- Note box --------------------------- */
/* Box informativi della scheda detail (access info, update info). */

.gd-note-box {
  background: var(--bg-soft);
  border: 1px solid var(--rule-soft);
  border-radius: 0.375rem;
}

.gd-note-box--push { margin-top: 1.5rem; }

/* ----------------------- Pannelli e struttura ----------------------- */

.gd-panel {
  background: var(--bg-code);
  border: 1px solid var(--rule);
}

.gd-hairline { border-color: var(--rule); }

.gd-detail-header {
  border-bottom: 1px solid var(--rule);
  padding-bottom: 1.5rem;
}

.gd-detail-title {
  font-family: var(--font-display);
  font-weight: 500;
  letter-spacing: -0.015em;
  font-size: 1.5rem;
  line-height: 1.3;
  color: var(--ink);
}

.gd-section-title {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 1.125rem;
  line-height: 1.4;
  color: var(--ink);
  margin: 1rem 0;
}

.gd-subsection-title {
  font-family: var(--font-display);
  font-weight: 500;
  font-size: 1rem;
  color: var(--ink);
  margin-bottom: 0.75rem;
}

.gd-badge-row {
  display: flex;
  flex-wrap: wrap;
  gap: 0.5rem;
}

/* Colonne della scheda detail (il build congelato non ha le utility di
   larghezza responsive che il porting referenziava): 60/40 da 768px in su,
   con la hairline divisoria sui token. */
.gd-detail-col-left { width: 100%; }

.gd-detail-col-right {
  width: 100%;
  margin-top: 2rem;
}

@media (min-width: 768px) {
  .gd-detail-col-left {
    width: 60%;
    padding-right: 1.5rem;
  }

  .gd-detail-col-right {
    width: 40%;
    margin-top: 0;
    padding-left: 1.5rem;
    border-left: 1px solid var(--rule);
  }
}

.gd-detail-footer {
  margin-top: 2.5rem;
  padding-top: 1.5rem;
  border-top: 1px solid var(--rule);
  text-align: center;
}

/* ------------------------- Badge e chip ------------------------- */
/* Testo sempre in inchiostro (AA garantito su ogni tinta); la variante è
   comunicata dalla tinta di fondo, derivata dai token via color-mix. */

.gd-badge {
  display: inline-flex;
  align-items: center;
  padding: 0.125rem 0.625rem;
  border-radius: 0.375rem;
  font-size: 0.875rem;
  line-height: 1.25rem;
  font-weight: 500;
  color: var(--ink);
}

.gd-badge svg {
  margin-right: 0.25rem;
  flex-shrink: 0;
}

.gd-badge--cat { background: color-mix(in srgb, var(--ink) 8%, var(--bg)); }
.gd-badge--area { background: color-mix(in srgb, var(--live) 14%, var(--bg)); }
.gd-badge--license { background: color-mix(in srgb, var(--mark) 12%, var(--bg)); }

/* Base del badge di stato (detail.js STATUS_BADGE_BASE_CLASSES); il
   margin-left spinge il badge a destra nella riga, come da design legacy. */
.gd-badge--status { margin-left: auto; }

/* Varianti ritornate da getStatusClass() (detail.js). */
.gd-badge--status-ok { background: color-mix(in srgb, var(--live) 16%, var(--bg)); }
.gd-badge--status-warn { background: color-mix(in srgb, var(--mark) 12%, var(--bg)); }
.gd-badge--status-err { background: color-mix(in srgb, var(--mark) 22%, var(--bg)); }
.gd-badge--status-neutral { background: var(--bg-soft); }

/* Chip delle colonne Tabulator (formatter di tabulator-config.js). */
.gd-chip {
  display: inline-flex;
  align-items: center;
  padding: 0.125rem 0.625rem;
  border-radius: 9999px;
  font-size: 0.75rem;
  line-height: 1rem;
  font-weight: 500;
  color: var(--ink);
}

.gd-chip--cat { background: color-mix(in srgb, var(--ink) 8%, var(--bg)); }
.gd-chip--source { background: color-mix(in srgb, var(--mark) 12%, var(--bg)); }
.gd-chip--area { background: color-mix(in srgb, var(--live) 14%, var(--bg)); }

/* Testi di cella Tabulator (formatter di tabulator-config.js). */
.gd-cell-strong { color: var(--ink); }
.gd-cell-muted { color: var(--ink-2); }
