// ─── Natus (Pick Sky) overlay ──────────────────────────────────────────────── // Gaussian backdrop + centred modal, matching the gate/sig overlay pattern. // Open state: html.natus-open (added by JS on PICK SKY click). // // Layout: header / two-column body (form | wheel) / footer // Collapses to stacked single-column below 600 px. // ── Scroll-lock ─────────────────────────────────────────────────────────────── html.natus-open { overflow: hidden; #id_aperture_fill { opacity: 1; } } // ── Backdrop ────────────────────────────────────────────────────────────────── .natus-backdrop { position: fixed; inset: 0; background: rgba(0, 0, 0, 0.75); backdrop-filter: blur(5px); z-index: 100; pointer-events: none; // Hidden until html.natus-open opacity: 0; transition: opacity 0.15s ease; } html.natus-open .natus-backdrop { opacity: 1; } // ── Overlay shell (positions + scrolls the modal) ───────────────────────────── .natus-overlay { position: fixed; inset: 0; display: flex; align-items: center; justify-content: center; z-index: 120; overflow-y: auto; overscroll-behavior: contain; pointer-events: none; // Hidden until html.natus-open visibility: hidden; @media (orientation: landscape) { $sidebar-w: 4rem; left: $sidebar-w; right: $sidebar-w; } } html.natus-open .natus-overlay { visibility: visible; pointer-events: none; // modal itself is pointer-events: auto } // ── Modal panel ─────────────────────────────────────────────────────────────── // Thin wrapper: position:relative so the NVM circle can sit on the corner // without being clipped by the modal's overflow:hidden. .natus-modal-wrap { position: relative; pointer-events: none; // overlay handles pointer-events; children re-enable width: 92vw; max-width: 920px; // Fade + slide in — wraps modal AND NVM btn so both animate together opacity: 0; transform: translateY(1rem); transition: opacity 0.2s ease, transform 0.2s ease; } html.natus-open .natus-modal-wrap { opacity: 1; transform: translateY(0); } .natus-modal { pointer-events: auto; display: flex; flex-direction: column; width: 100%; // fills .natus-modal-wrap max-height: 96vh; border: 0.1rem solid rgba(var(--terUser), 0.25); border-radius: 0.5rem; overflow: hidden; } // ── Header ──────────────────────────────────────────────────────────────────── .natus-modal-header { flex-shrink: 0; padding: 0.6rem 1rem; background: rgba(var(--priUser), 1); border-bottom: 0.1rem solid rgba(var(--terUser), 0.15); display: flex; flex-direction: row; align-items: baseline; gap: 0.75rem; h2 { margin: 0; font-size: 1.1rem; letter-spacing: 0.06em; span { color: rgba(var(--secUser), 1); } } p { margin: 0; font-size: 0.7rem; opacity: 0.55; } } // ── Body: two columns ───────────────────────────────────────────────────────── .natus-modal-body { flex: 1; min-height: 0; display: flex; flex-direction: row; overflow: hidden; } // Form column — fixed width; form-main scrolls, confirm btn pinned at bottom .natus-form-col { flex: 0 0 240px; overflow: hidden; padding: 0.9rem 1rem; background: rgba(var(--priUser), 1); border-right: 0.1rem solid rgba(var(--terUser), 0.12); display: flex; flex-direction: column; gap: 0.65rem; } // Scrollable inner container (form fields + status) .natus-form-main { flex: 1; min-height: 0; overflow-y: auto; display: flex; flex-direction: column; gap: 0.65rem; } // Confirm btn inside form-col — full width, pinned at column bottom .natus-form-col > #id_natus_confirm { flex-shrink: 0; } // Wheel column — fills remaining space .natus-wheel-col { flex: 1; min-width: 0; display: flex; align-items: center; justify-content: center; padding: 0.75rem; // background: rgba(var(--duoUser), 1); position: relative; } .natus-svg { display: block; width: 100%; height: 100%; aspect-ratio: 1 / 1; max-width: 480px; max-height: 480px; } // ── Form fields ─────────────────────────────────────────────────────────────── .natus-field { display: flex; flex-direction: column; gap: 0.25rem; label { font-size: 0.6rem; text-transform: uppercase; letter-spacing: 0.1em; color: rgba(var(--quaUser), 0.8); } input { width: 100%; // inherits global input styles } small { font-size: 0.58rem; opacity: 0.45; line-height: 1.3; } } // Place search field wrapper: text input + geo button inline .natus-place-field { position: relative; } .natus-place-wrap { display: flex; gap: 0.4rem; align-items: center; input { flex: 1; min-width: 0; } .btn-sm { flex-shrink: 0; } } // Nominatim suggestion dropdown .natus-suggestions { position: absolute; left: 0; right: 0; top: calc(100% + 2px); z-index: 10; background: rgba(var(--priUser), 1); border: 0.1rem solid rgba(var(--terUser), 0.3); border-radius: 0.3rem; overflow-y: auto; max-height: 10rem; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.4); } .natus-suggestion-item { display: block; width: 100%; padding: 0.4rem 0.6rem; text-align: left; background: none; border: none; border-bottom: 0.05rem solid rgba(var(--terUser), 0.1); font-size: 0.65rem; color: rgba(var(--ninUser), 0.85); cursor: pointer; line-height: 1.35; &:last-child { border-bottom: none; } &:hover, &:focus { background: rgba(var(--terUser), 0.12); color: rgba(var(--ninUser), 1); outline: none; } } // Coords row: lat | lon (read-only, populated by place selection) .natus-coords { flex-direction: row; align-items: flex-end; gap: 0.4rem; > div { flex: 1; min-width: 0; display: flex; flex-direction: column; gap: 0.25rem; label { font-size: 0.6rem; text-transform: uppercase; letter-spacing: 0.1em; color: rgba(var(--quaUser), 0.8); } input { width: 100%; opacity: 0.6; cursor: default; } } } // ── Status line ─────────────────────────────────────────────────────────────── .natus-status { font-size: 0.65rem; opacity: 0.6; min-height: 1rem; text-align: center; &--error { opacity: 1; color: rgba(var(--priRd), 1); } } // ── NVM corner btn ──────────────────────────────────────────────────────────── // Absolutely pinned to top-right corner of .natus-modal-wrap. // transform: translate(50%,-50%) centres the circle on the corner point. // Lives outside .natus-modal so overflow:hidden doesn't clip it. #id_natus_cancel { position: absolute; top: 0; right: 0; transform: translate(50%, -50%); z-index: 10; margin: 0; pointer-events: auto; } // ── Narrow / portrait ───────────────────────────────────────────────────────── @media (max-width: 600px) { .natus-modal-wrap { width: 92vw; } .natus-modal { max-height: 96vh; } .natus-modal-body { flex-direction: column; overflow-y: auto; } // Form col stacks above wheel; internally becomes a flex-row so // form-main gets most of the width and confirm btn sits to its right. .natus-form-col { flex: 0 0 auto; flex-direction: row; align-items: flex-end; border-right: none; border-bottom: 0.1rem solid rgba(var(--terUser), 0.12); overflow: visible; // form-main handles its own scroll gap: 0.5rem; } .natus-form-main { flex: 1; min-width: 0; overflow-y: auto; max-height: 40vh; } .natus-form-col > #id_natus_confirm { flex-shrink: 0; align-self: flex-end; } .natus-wheel-col { flex: 0 0 280px; } } // ── SVG wheel element styles ────────────────────────────────────────────────── // Colors and opacity live here; geometry (cx/cy/r/font-size) stays in JS. .nw-outer-ring { fill: none; stroke: rgba(var(--quaUser), 0.6); stroke-width: 1px; } .nw-inner-disc { fill: rgba(var(--quaUser), 0.6); } // Axes (ASC / DSC / MC / IC) .nw-axis-line { stroke: rgba(var(--secUser), 1); stroke-width: 1.5px; } .nw-axis-label { fill: rgba(var(--secUser), 1); } // Sign ring — vars are RGB tuples ("R, G, B"), must be wrapped in rgba() .nw-sign--fire { fill: rgba(var(--priRd, 192, 64, 64), 0.75); stroke: rgba(var(--quaUser), 1); stroke-width: 0.5px; } .nw-sign--stone { fill: rgba(var(--priFs, 122, 96, 64), 0.75); stroke: rgba(var(--quaUser), 1); stroke-width: 0.5px; } .nw-sign--air { fill: rgba(var(--priCy, 64, 144, 176), 0.75); stroke: rgba(var(--quaUser), 1); stroke-width: 0.5px; } .nw-sign--water { fill: rgba(var(--priId, 80, 80, 160), 0.75); stroke: rgba(var(--quaUser), 1); stroke-width: 0.5px; } .nw-sign-label { fill: rgba(var(--secUser), 1); } // House ring .nw-house-cusp { stroke: rgba(var(--quaUser), 0.8); stroke-width: 0.8px; } .nw-house-num { fill: rgba(var(--quiUser), 1); } .nw-house-fill--even { fill: rgba(var(--quaUser), 0.45); } .nw-house-fill--odd { fill: rgba(var(--quiUser), 0.35); } // Planets .nw-planet-circle { fill: rgba(var(--quiUser), 1); } .nw-planet-circle--rx { fill: rgba(var(--quiUser), 1); } .nw-planet-label { fill: rgba(var(--quaUser), 1); stroke: rgba(var(--quaUser), 0.6); stroke-width: 0.4px; paint-order: stroke fill; } .nw-rx { fill: rgba(var(--terUser), 1); } // Aspects .nw-aspects { opacity: 0.8; } // Element pie .nw-element--fire { fill: rgba(var(--priRd, 192, 64, 64), 0.92); stroke: rgba(var(--quaUser), 1); stroke-width: 0.5px; } .nw-element--stone { fill: rgba(var(--priFs, 122, 96, 64), 0.92); stroke: rgba(var(--quaUser), 1); stroke-width: 0.5px; } .nw-element--air { fill: rgba(var(--priCy, 64, 144, 176), 0.92); stroke: rgba(var(--quaUser), 1); stroke-width: 0.5px; } .nw-element--water { fill: rgba(var(--priId, 80, 80, 160), 0.92); stroke: rgba(var(--quaUser), 1); stroke-width: 0.5px; } // Time / Space emergent labels .nw-element-label--time { fill: rgba(var(--priYl, 192, 160, 48), 1); } .nw-element-label--space { fill: rgba(var(--priGn, 64, 96, 64), 1); } // ── Sidebar z-index sink (landscape sidebars must go below backdrop) ─────────── @media (orientation: landscape) { html.natus-open body .container .navbar, html.natus-open body #id_footer { z-index: 90; } }