.location-map-page { height: calc(100dvh - 56px); min-height: 0; background: #07111d; color: #f8fafc; display: flex; flex-direction: column; overflow: hidden; } .location-map-topbar { position: relative; z-index: 25; display: grid; grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; gap: 0.75rem; padding: 0.75rem clamp(0.75rem, 2vw, 1.25rem); border-bottom: 1px solid var(--color-border-light); background: rgba(17, 28, 42, 0.94); backdrop-filter: blur(14px); } .location-map-back, .location-map-topbar button { min-height: 40px; border: 1px solid var(--color-border-light); border-radius: 8px; background: #15283b; color: #f8fafc; font-weight: 700; cursor: pointer; } .location-map-back { padding: 0 0.85rem; } .location-map-title { min-width: 0; } .location-map-title h1 { font-size: clamp(1rem, 3vw, 1.35rem); color: #f8fafc; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .location-map-title span { display: block; margin-top: 0.15rem; color: #9fb3c8; font-size: 0.86rem; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .location-map-status { min-width: 78px; padding: 0.35rem 0.6rem; border: 1px solid var(--color-border-light); border-radius: 999px; color: #f8fafc; font-size: 0.78rem; font-weight: 800; text-align: center; } .location-map-status-no-map { background: rgba(148, 163, 184, 0.16); } .location-map-status-draft { background: rgba(245, 158, 11, 0.2); border-color: rgba(245, 158, 11, 0.36); } .location-map-status-draft-preview { background: rgba(14, 165, 233, 0.2); border-color: rgba(56, 189, 248, 0.4); } .location-map-status-unsaved-draft { background: rgba(244, 114, 182, 0.2); border-color: rgba(244, 114, 182, 0.42); } .location-map-status-published { background: rgba(20, 184, 166, 0.18); border-color: rgba(20, 184, 166, 0.34); } .location-map-workspace { flex: 1; min-height: 0; min-width: 0; display: grid; grid-template-rows: auto minmax(0, 1fr) auto; overflow: hidden; } .location-map-toolbar { display: flex; justify-content: space-between; align-items: flex-start; flex-wrap: wrap; gap: 0.75rem; padding: 0.75rem clamp(0.75rem, 2vw, 1.25rem); border-bottom: 1px solid var(--color-border-light); background: rgba(11, 19, 31, 0.98); } .location-map-mode-group { display: flex; align-items: center; flex-wrap: wrap; gap: 0.55rem; min-width: 0; } .location-map-mode-buttons, .location-map-tool-buttons, .location-map-zoom-controls, .location-map-editor-actions { display: flex; align-items: center; gap: 0.45rem; } .location-map-mode-buttons button, .location-map-tool-buttons button, .location-map-zoom-controls button, .location-map-editor-actions button, .location-map-setup-actions button { min-height: 40px; padding: 0.55rem 0.8rem; border: 1px solid var(--color-border-light); border-radius: 8px; background: #15283b; color: #f8fafc; font-weight: 700; cursor: pointer; } .location-map-mode-buttons button.active, .location-map-tool-buttons button.active, .location-map-editor-actions button.primary, .location-map-setup-actions .btn-primary { border-color: var(--color-primary); background: var(--color-primary); color: #06111f; } .location-map-tool-buttons button.is-pan.active { border-color: rgba(245, 158, 11, 0.78); background: rgba(245, 158, 11, 0.22); color: #f8fafc; } .location-map-tool-buttons button.is-edit.active { border-color: rgb(45, 212, 191); background: rgba(20, 184, 166, 0.24); color: #f8fafc; } .location-map-editor-actions button.danger { border-color: rgba(248, 113, 113, 0.5); background: rgba(248, 113, 113, 0.24); } .location-map-mode-buttons button:disabled, .location-map-tool-buttons button:disabled, .location-map-zoom-controls button:disabled, .location-map-editor-actions button:disabled, .location-map-setup-actions button:disabled { opacity: 0.55; cursor: not-allowed; } .location-map-zoom-controls span { min-width: 54px; color: #cbd5e1; font-size: 0.9rem; font-weight: 700; text-align: center; } .location-map-canvas-shell { min-height: 0; min-width: 0; max-width: 100vw; overflow: hidden; padding: 0.75rem; } .location-map-scroll { position: relative; width: 100%; max-width: 100%; height: 100%; min-height: 0; overflow: auto; border: 1px solid var(--color-border-light); border-radius: 8px; background: linear-gradient(135deg, rgba(20, 184, 166, 0.08), transparent 40%), linear-gradient(180deg, rgba(15, 23, 42, 0.2), rgba(15, 23, 42, 0.04)); background-color: #101b2a; touch-action: pan-x pan-y; } .location-map-canvas-shell.is-pan-tool .location-map-scroll { cursor: grab; } .location-map-canvas-shell.is-panning .location-map-scroll { cursor: grabbing; user-select: none; } .location-map-svg { min-width: 320px; min-height: 260px; display: block; } .location-map-svg.is-editable { touch-action: none; } .location-map-background { fill: rgba(15, 23, 34, 0.92); stroke: rgba(148, 163, 184, 0.28); stroke-width: 2; } .location-map-grid { fill: url("#location-map-grid"); stroke: rgba(148, 163, 184, 0.18); stroke-width: 1; } .location-map-object rect:first-child { fill: rgba(30, 83, 124, 0.78); stroke: rgba(96, 165, 250, 0.72); stroke-width: 2; cursor: pointer; transition: fill 120ms ease, stroke 120ms ease, stroke-width 120ms ease; } .location-map-object.is-editable rect:first-child { cursor: grab; } .location-map-object.is-editable rect:first-child:active { cursor: grabbing; } .location-map-object.is-selected rect:first-child { fill: rgba(20, 184, 166, 0.34); stroke: rgb(45, 212, 191); stroke-width: 4; } .location-map-label { fill: #f8fafc; font-size: 24px; font-weight: 800; pointer-events: none; } .location-map-count { fill: rgba(226, 232, 240, 0.82); font-size: 18px; font-weight: 700; pointer-events: none; } .location-map-pin { fill: rgb(245, 158, 11); stroke: rgba(15, 23, 42, 0.9); stroke-width: 2; pointer-events: none; } .location-map-resize-handle { fill: rgb(245, 158, 11); stroke: rgba(15, 23, 42, 0.9); stroke-width: 2; cursor: nwse-resize; touch-action: none; } .location-map-empty-canvas { position: sticky; left: 50%; bottom: 1rem; width: fit-content; max-width: calc(100% - 2rem); transform: translateX(-50%); padding: 0.55rem 0.75rem; border: 1px solid var(--color-border-light); border-radius: 999px; background: rgba(17, 28, 42, 0.9); color: #cbd5e1; font-weight: 800; pointer-events: none; } .location-map-bottom-sheet { max-height: 43vh; overflow-y: auto; padding: 0.8rem clamp(0.75rem, 2vw, 1.25rem) 1rem; border-top: 1px solid var(--color-border-light); background: rgba(17, 28, 42, 0.96); box-shadow: 0 -18px 40px rgba(0, 0, 0, 0.28); } .location-map-sheet-header { display: flex; justify-content: space-between; align-items: flex-start; gap: 0.75rem; margin-bottom: 0.65rem; } .location-map-sheet-header > div { min-width: 0; } .location-map-sheet-header strong { display: block; color: #f8fafc; } .location-map-sheet-header > div span { display: block; margin-top: 0.2rem; color: #9fb3c8; font-size: 0.82rem; } .location-map-sheet-header span, .location-map-muted { color: #9fb3c8; } .location-map-layer-toggle { min-height: 40px; padding: 0.45rem 0.7rem; border: 1px solid var(--color-border-light); border-radius: 999px; background: rgba(15, 23, 34, 0.72); color: #f8fafc; font-weight: 800; cursor: pointer; } .location-map-layer-toggle.active { border-color: var(--color-primary); background: rgba(59, 130, 246, 0.22); } .location-map-display-controls { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0.4rem; margin-bottom: 0.7rem; } .location-map-display-controls label { min-height: 40px; display: flex; align-items: center; gap: 0.35rem; padding: 0.35rem 0.45rem; border: 1px solid var(--color-border-light); border-radius: 8px; background: rgba(15, 23, 34, 0.58); color: #f8fafc; font-size: 0.82rem; font-weight: 700; } .location-map-display-controls input { width: 16px; height: 16px; } .location-map-editor-actions { flex-wrap: wrap; margin-bottom: 0.75rem; } .location-map-primary-actions button { flex: 1 1 96px; } .location-map-mobile-tool-switch { display: none; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 0.45rem; margin-bottom: 0.75rem; } .location-map-mobile-tool-switch button { min-height: 40px; border: 1px solid var(--color-border-light); border-radius: 8px; background: #15283b; color: #f8fafc; font-weight: 800; } .location-map-mobile-tool-switch button.active { border-color: rgb(45, 212, 191); background: rgba(20, 184, 166, 0.24); } .location-map-object-form { display: grid; gap: 0.6rem; } .location-map-object-form label { display: grid; gap: 0.3rem; color: #9fb3c8; font-size: 0.78rem; font-weight: 800; } .location-map-object-form input, .location-map-object-form select { min-height: 40px; padding: 0.55rem 0.65rem; border: 1px solid var(--color-border-light); border-radius: 8px; background: #15283b; color: #f8fafc; } .location-map-object-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 0.45rem; } .location-map-zone-items h2 { font-size: 1rem; } .location-map-zone-items-title { display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; margin-bottom: 0.55rem; } .location-map-zone-items-title span { min-width: 58px; padding: 0.2rem 0.45rem; border-radius: 999px; background: rgba(96, 165, 250, 0.18); color: #f8fafc; font-size: 0.82rem; font-weight: 900; text-align: center; } .location-map-zone-items ul, .location-map-unmapped-list ul { display: grid; gap: 0.35rem; } .location-map-zone-items li, .location-map-unmapped-list li { min-height: 34px; display: flex; align-items: center; justify-content: space-between; gap: 0.75rem; padding: 0.35rem 0.55rem; border: 1px solid var(--color-border-light); border-radius: 8px; background: rgba(15, 23, 34, 0.56); color: #f8fafc; } .location-map-zone-items small { color: #cbd5e1; font-weight: 800; } .location-map-unmapped-list { margin-top: 0.75rem; } .location-map-unmapped-list strong { display: block; margin-bottom: 0.45rem; } .location-map-setup { align-self: center; width: min(100% - 1.5rem, 560px); margin: 3rem auto; padding: 1.15rem; border: 1px solid var(--color-border-light); border-radius: 8px; background: #111c2a; } .location-map-setup h2 { margin-bottom: 0.45rem; font-size: 1.35rem; } .location-map-setup p { margin-bottom: 1rem; color: #9fb3c8; } .location-map-setup-actions { display: grid; gap: 0.6rem; } .location-map-loading { margin: 3rem auto; color: #9fb3c8; } @media (min-width: 840px) { .location-map-workspace { grid-template-columns: minmax(0, 1fr) 360px; grid-template-rows: auto minmax(0, 1fr); } .location-map-toolbar { grid-column: 1 / -1; } .location-map-bottom-sheet { max-height: none; border-top: none; border-left: 1px solid var(--color-border-light); } } @media (max-width: 520px) { .location-map-canvas-shell { padding: 0.5rem; } .location-map-bottom-sheet { max-height: 34dvh; } .location-map-topbar { grid-template-columns: auto minmax(0, 1fr); } .location-map-status { grid-column: 2; justify-self: start; } .location-map-toolbar { flex-direction: column; align-items: stretch; } .location-map-mode-group, .location-map-mode-buttons, .location-map-tool-buttons, .location-map-zoom-controls { width: 100%; } .location-map-mode-buttons button, .location-map-tool-buttons button, .location-map-zoom-controls button { flex: 1 1 0; } .location-map-tool-buttons { display: none; } .location-map-mobile-tool-switch { display: grid; } .location-map-display-controls { grid-template-columns: repeat(2, minmax(0, 1fr)); } .location-map-object-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } }