:root { font-family: Inter, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; color: #16202a; background: #f4f6f8; } * { box-sizing: border-box; } body { margin: 0; } header { display: flex; justify-content: space-between; gap: 16px; align-items: center; padding: 14px 18px; background: #101820; color: #fff; } h1 { margin: 0; font-size: 20px; } header p { margin: 4px 0 0; color: #c5d0da; font-size: 13px; } .actions { display: flex; gap: 8px; flex-wrap: wrap; } .workflow-actions, .maintenance-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 8px; } .admin-status { margin-top: 8px; font-size: 12px; line-height: 1.35; overflow-wrap: anywhere; } button { cursor: pointer; border: 1px solid #9da9b4; background: #fff; color: #16202a; border-radius: 6px; padding: 7px 10px; font-weight: 600; min-width: 0; overflow-wrap: anywhere; } button:hover { background: #edf2f7; } button.danger { border-color: #c14141; color: #a32222; } button.primary { border-color: #2f7d4f; color: #21643d; } main { display: grid; grid-template-columns: 420px 1fr; height: calc(100vh - 70px); transition: grid-template-columns .18s ease; } aside { position: relative; overflow: hidden; padding: 0; border-right: 1px solid #d4dce3; min-width: 0; background: #f4f6f8; } .sidebar-content { height: 100%; overflow: auto; padding: 12px 12px 54px; min-width: 0; transition: opacity .12s ease, visibility .12s ease; } .sidebar-collapse-handle { position: absolute; bottom: 10px; right: 8px; z-index: 40; display: grid; place-items: center; width: 28px; height: 28px; min-width: 28px; padding: 0; border-radius: 999px; border-color: #b9c4ce; background: #fff; box-shadow: 0 2px 7px rgba(15, 23, 42, .16); font-size: 20px; line-height: 1; } .sidebar-collapse-handle:hover { background: #edf2f7; } main.sidebar-collapsed { grid-template-columns: 38px 1fr; } main.sidebar-collapsed aside { overflow: hidden; padding: 0; } main.sidebar-collapsed .sidebar-content { opacity: 0; visibility: hidden; pointer-events: none; } main.sidebar-collapsed .sidebar-collapse-handle { left: 5px; right: auto; bottom: 12px; } .map-panel { position: relative; min-width: 0; } #map { width: 100%; height: 100%; background: #e4e9ee; } .route-line-label { border: 0; background: rgba(255, 255, 255, .86); color: #111827; box-shadow: 0 1px 2px rgba(15, 23, 42, .16); font-size: 11px; font-weight: 700; line-height: 1; padding: 2px 4px; } .route-line-label::before { display: none; } .card { background: #fff; border: 1px solid #d7dee6; border-radius: 8px; padding: 12px; margin-bottom: 12px; box-shadow: 0 1px 3px rgba(16, 24, 32, .05); } .card h2 { font-size: 15px; margin: 0; } .sidebar-section { padding: 0; min-width: 0; max-width: 100%; } .sidebar-section > summary, .nested-section > summary { cursor: pointer; list-style: none; display: flex; justify-content: space-between; gap: 10px; align-items: center; } .sidebar-section > summary { min-height: 42px; padding: 11px 12px; } .nested-section > summary { min-height: 34px; padding: 8px 0; } .sidebar-section > summary::-webkit-details-marker, .nested-section > summary::-webkit-details-marker { display: none; } .sidebar-section > summary::after, .nested-section > summary::after { content: ""; width: 7px; height: 7px; border: solid #607080; border-width: 0 2px 2px 0; transform: rotate(-45deg); transition: transform .15s ease; } .sidebar-section[open] > summary::after, .nested-section[open] > summary::after { transform: rotate(45deg); } .sidebar-section > summary h2, .nested-section > summary h3 { margin: 0; } .nested-section > summary h3 { color: #273646; font-size: 13px; } .sidebar-section-body { padding: 0 12px 12px; min-width: 0; max-width: 100%; } .sidebar-section[open] > summary { border-bottom: 1px solid #edf1f5; margin-bottom: 10px; } .nested-section { border-top: 1px solid #edf1f5; min-width: 0; max-width: 100%; } .nested-section:first-child { border-top: none; } .nested-section-body { display: grid; gap: 8px; padding-bottom: 10px; min-width: 0; } .nested-section[open] > summary { margin-bottom: 6px; } form { display: grid; gap: 8px; } label { display: grid; gap: 4px; font-size: 12px; color: #52606d; } input, select, textarea { border: 1px solid #c6d0d9; border-radius: 6px; padding: 7px; font: inherit; color: #16202a; min-width: 0; } textarea { resize: vertical; min-height: 52px; } input.journey-selected-location { padding-left: 31px; background-repeat: no-repeat; background-position: 8px center; background-size: 17px 17px; } input.journey-selected-address { background-image: url("data:image/svg+xml,%3Csvg width='17' height='17' viewBox='0 0 17 17' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='%232d5f7f' d='M8.5 1.4A5.1 5.1 0 0 0 3.4 6.5c0 3.7 5.1 9.1 5.1 9.1s5.1-5.4 5.1-9.1A5.1 5.1 0 0 0 8.5 1.4zm0 7.1a2 2 0 1 1 0-4 2 2 0 0 1 0 4z'/%3E%3C/svg%3E"); } input.journey-selected-stop { background-image: url("data:image/svg+xml,%3Csvg width='17' height='17' viewBox='0 0 17 17' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8.5' cy='8.5' r='6.7' fill='white' stroke='%232d5f7f' stroke-width='1.7'/%3E%3Ctext x='8.5' y='11.5' text-anchor='middle' font-family='Arial,sans-serif' font-size='8.4' font-weight='800' fill='%232d5f7f'%3EH%3C/text%3E%3C/svg%3E"); } .stats { display: grid; grid-template-columns: repeat(2, 1fr); gap: 8px; } .stat { border: 1px solid #e1e7ee; border-left-width: 4px; border-radius: 8px; padding: 8px; background: #f8fafc; } .stat.info { border-left-color: #64748b; } .stat.good { border-left-color: #23864f; background: #f5fbf7; } .stat.warn { border-left-color: #c47a12; background: #fffaf0; } .stat.bad { border-left-color: #c24141; background: #fff7f7; } .stat strong { display: block; font-size: 18px; } .stat span { font-size: 11px; color: #5a6875; } .qa-dashboard { display: grid; gap: 10px; font-size: 12px; } .qa-toolbar { display: flex; justify-content: flex-end; margin-bottom: 8px; } .qa-decision { display: grid; gap: 3px; border: 1px solid #d9e2ec; border-radius: 8px; background: #f8fafc; padding: 8px; } .qa-decision strong { color: #17212b; } .qa-decision span { color: #607080; } .qa-section { display: grid; gap: 6px; } .qa-section h3 { margin: 0; font-size: 12px; color: #273646; } .qa-grid { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px; } .qa-item { min-width: 0; border: 1px solid #e1e7ee; border-left-width: 4px; border-radius: 8px; background: #f8fafc; padding: 7px; } .qa-item.info { border-left-color: #64748b; } .qa-item.good { border-left-color: #23864f; background: #f5fbf7; } .qa-item.warn { border-left-color: #c47a12; background: #fffaf0; } .qa-item.bad { border-left-color: #c24141; background: #fff7f7; } .qa-item strong, .qa-item span { display: block; min-width: 0; overflow-wrap: anywhere; } .qa-item strong { font-size: 15px; color: #17212b; } .qa-item span { font-size: 11px; color: #5a6875; } .qa-actions { margin: 0; padding-left: 18px; color: #52606d; } .harmonization-inventory, .harmonization-feed-list, .harmonization-detail, .harmonization-review-list, .harmonization-dataset-list { display: grid; gap: 8px; min-width: 0; } .harmonization-summary { display: grid; grid-template-columns: repeat(5, minmax(0, 1fr)); gap: 5px; } .harmonization-summary div { border: 1px solid #e2e8f0; border-radius: 6px; background: #f8fafc; padding: 6px; min-width: 0; } .harmonization-summary strong, .harmonization-summary span { display: block; min-width: 0; overflow-wrap: anywhere; } .harmonization-summary strong { font-size: 13px; color: #17212b; } .harmonization-summary span { font-size: 10px; color: #5a6875; } .harmonization-feed { display: grid; gap: 6px; border-top: 1px solid #e1e7ee; padding-top: 8px; font-size: 12px; min-width: 0; } .harmonization-feed:first-child { border-top: none; } .harmonization-feed-title { display: flex; justify-content: space-between; align-items: start; gap: 8px; min-width: 0; } .harmonization-feed-title > * { min-width: 0; overflow-wrap: anywhere; } .harmonization-issues { display: flex; flex-wrap: wrap; gap: 4px; } .harmonization-inventory { max-height: 360px; overflow-x: hidden; overflow-y: auto; padding-right: 4px; } .harmonization-detail { align-content: start; padding-right: 4px; } .harmonization-review-form { display: grid; grid-template-columns: minmax(0, 1fr) minmax(140px, .45fr); gap: 8px; } .harmonization-review-form label:has(textarea), .harmonization-review-form .source-actions, .harmonization-review-form > .muted { grid-column: 1 / -1; } .harmonization-review-item { display: grid; gap: 2px; border-left: 4px solid #64748b; border-radius: 6px; background: #f8fafc; padding: 8px; min-width: 0; } .harmonization-review-item.error { border-left-color: #c24141; background: #fff7f7; } .harmonization-review-item.probable { border-left-color: #c47a12; background: #fffaf0; } .harmonization-review-item.ok { border-left-color: #23864f; background: #f5fbf7; } .harmonization-review-item strong, .harmonization-review-item span { min-width: 0; overflow-wrap: anywhere; } .harmonization-review-item span { color: #52606d; } .source, .match, .catalog-entry { border-top: 1px solid #e1e7ee; padding: 8px 0; font-size: 12px; min-width: 0; overflow-wrap: anywhere; } .source:first-child, .match:first-child, .catalog-entry:first-child { border-top: none; } .source-title, .match-title { font-weight: 700; color: #17212b; } .match-title { display: flex; flex-wrap: wrap; gap: 4px 6px; align-items: center; } .source, .catalog-entry { display: grid; gap: 7px; } .source-title, .catalog-title { display: flex; justify-content: space-between; gap: 8px; align-items: start; font-weight: 700; min-width: 0; } .catalog-title { flex-wrap: wrap; } .source-title > *, .catalog-title > *, .dataset-title > *, .dataset-result-title > *, .job-title > *, .job-progress > *, .worker-row > *, .layer-row > span { min-width: 0; overflow-wrap: anywhere; } .source-actions, .dataset-actions, .candidate-actions, .source-datasets { display: flex; gap: 6px; flex-wrap: wrap; } .source-meta, .source-update-row, .source-job-row, .source-warning, .dataset-row { display: grid; gap: 3px; } .source-warning { border: 1px solid #f0c36a; border-radius: 6px; background: #fff8e1; color: #6f4c00; padding: 7px 8px; } .dataset-row { width: 100%; border: 1px solid #e2e8f0; border-radius: 6px; background: #f8fafc; padding: 7px; min-width: 0; overflow-wrap: anywhere; } .dataset-title { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 8px; } .metric-row { display: flex; gap: 6px; flex-wrap: wrap; } .metric { border: 1px solid #dde5ee; border-radius: 999px; padding: 2px 7px; background: #fff; color: #3d4b58; font-size: 11px; max-width: 100%; min-width: 0; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .muted { color: #687683; } .badge { display: inline-block; border-radius: 999px; padding: 2px 7px; background: #e6edf5; color: #273646; font-size: 11px; margin-left: 4px; } .badge.ok, .badge.matched, .badge.accepted { background: #dff2e7; color: #145f35; } .badge.error, .badge.rejected, .badge.missing { background: #fde5e5; color: #9b1c1c; } .badge.probable { background: #fff2cc; color: #7d5700; } .badge.weak { background: #ffe8d6; color: #8a4300; } .badge.queued { background: #e6edf5; color: #273646; } .badge.running { background: #dbeafe; color: #1d4ed8; } .badge.paused { background: #ede9fe; color: #5b21b6; } .badge.completed { background: #dff2e7; color: #145f35; } .badge.failed, .badge.cancelled { background: #fde5e5; color: #9b1c1c; } .match-actions { display: flex; flex-wrap: wrap; gap: 6px; margin-top: 6px; } .filter-row { display: flex; gap: 8px; margin-bottom: 8px; min-width: 0; max-width: 100%; } .filter-row select, .filter-row input { flex: 1; } .source-catalog-card { min-width: 0; max-width: 100%; overflow: hidden; } .source-catalog-card > .nested-section-body { padding-right: 4px; min-width: 0; overflow-x: hidden; } .dataset-search-form { display: grid; gap: 8px; } .inline-check { display: flex; align-items: center; gap: 6px; color: #52606d; } .inline-check input { width: auto; } .dataset-search-results { margin-top: 8px; display: grid; gap: 8px; font-size: 12px; min-width: 0; max-height: 300px; overflow-x: hidden; overflow-y: auto; padding-right: 4px; } .dataset-result-section { display: grid; gap: 6px; } .dataset-result-section h3 { margin: 4px 0 0; font-size: 12px; color: #273646; } .dataset-result-row { display: grid; gap: 4px; border: 1px solid #e2e8f0; border-radius: 6px; background: #f8fafc; padding: 7px; } .dataset-result-row.clickable { cursor: pointer; } .dataset-result-row.clickable:hover, .dataset-result-row.clickable:focus { border-color: #74a99b; background: #eef8f5; outline: none; } .dataset-result-row.selected { border-color: #0f766e; background: #e6f5f1; box-shadow: 0 0 0 1px rgba(15, 118, 110, .18); } .dataset-result-row.no-geometry { opacity: .68; } .dataset-result-row.loading { border-color: #0f766e; } .dataset-result-title { display: flex; flex-wrap: wrap; justify-content: space-between; gap: 8px; } .geometry-badge { display: inline-flex; align-items: center; gap: 4px; border-radius: 999px; padding: 2px 7px; font-size: 11px; background: #e8eef5; color: #314151; } .geometry-badge.ok { background: #dff2e7; color: #145f35; } .geometry-badge.missing { background: #eef1f4; color: #687683; } .geometry-dot { width: 6px; height: 6px; border-radius: 50%; background: currentColor; } .source-catalog-actions { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; margin-bottom: 8px; min-width: 0; } .matches-card { overflow: visible; } .matches-card > .nested-section-body { overflow-x: hidden; padding-right: 4px; } #matches { min-width: 0; max-height: 340px; overflow-x: hidden; overflow-y: auto; padding-right: 4px; } #matches .muted, #sourceCatalog, #geofabrikResults, #mappingSources { min-width: 0; overflow-x: hidden; overflow-wrap: anywhere; } #sourceCatalog .catalog-entry, #geofabrikResults .catalog-entry { width: 100%; max-width: 100%; overflow-x: hidden; } .source-catalog-filter { display: grid; grid-template-columns: minmax(0, 1.4fr) minmax(0, .7fr) minmax(0, .9fr); gap: 8px; min-width: 0; } .source-catalog-filter > * { width: 100%; } .geofabrik-filter { display: grid; grid-template-columns: minmax(0, 1fr) auto; align-items: stretch; gap: 8px; margin-bottom: 0; } .geofabrik-filter input { width: 100%; } .geofabrik-filter button { width: auto; min-width: 74px; white-space: nowrap; } .catalog-entry .muted, .catalog-entry .metric-row, .catalog-entry .source-actions { min-width: 0; width: 100%; max-width: 100%; overflow-wrap: anywhere; } #sourceCatalog, #geofabrikResults, #sources, #mappingSources { width: 100%; max-height: 320px; min-width: 0; max-width: 100%; overflow-y: auto; padding-right: 4px; } #geofabrikResults.dataset-search-results { gap: 10px; align-content: start; min-height: 96px; margin-top: 0; } #geofabrikResults .catalog-entry { display: grid; gap: 7px; min-height: 96px; padding: 10px; border: 1px solid #e2e8f0; border-radius: 6px; background: #f8fafc; } #geofabrikResults .catalog-entry:first-child { border-top: 1px solid #e2e8f0; } .preset-row { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; margin-bottom: 10px; } .layer-controls { display: grid; gap: 8px; font-size: 12px; max-height: 360px; overflow-x: hidden; overflow-y: auto; padding-right: 4px; } .layer-group { border: 1px solid #e1e7ee; border-radius: 8px; background: #f8fafc; } .layer-group summary { cursor: pointer; list-style: none; padding: 8px; font-weight: 700; } .layer-group summary::-webkit-details-marker { display: none; } .layer-group label, .layer-row { display: flex; align-items: center; gap: 7px; color: #26323e; } .layer-group input { width: 15px; height: 15px; margin: 0; } .layer-children { display: grid; gap: 2px; padding: 0 8px 8px 24px; } .layer-row { min-height: 24px; justify-content: space-between; border-radius: 6px; padding: 1px 3px; } .layer-row.loading { background: #edf6fb; } .layer-row span:nth-child(2) { flex: 1; } .layer-count { min-width: 42px; text-align: right; color: #6b7885; font-variant-numeric: tabular-nums; } .map-status { margin-top: 8px; min-height: 16px; font-size: 12px; } .jobs { display: grid; gap: 8px; font-size: 12px; min-width: 0; max-height: 280px; overflow-x: hidden; overflow-y: auto; padding-right: 4px; } .jobs-toolbar { display: flex; flex-wrap: wrap; justify-content: flex-end; gap: 6px; min-width: 0; } .worker-list, .worker-row { display: grid; gap: 4px; } .worker-row { border: 1px solid #e1e7ee; border-radius: 6px; background: #f8fafc; padding: 7px; } .job-row { border-top: 1px solid #e1e7ee; padding-top: 8px; min-width: 0; overflow-wrap: anywhere; } .job-row:first-child { border-top: none; padding-top: 0; } .job-title, .job-progress, .job-actions { display: flex; justify-content: space-between; gap: 8px; align-items: center; min-width: 0; flex-wrap: wrap; } .job-actions { justify-content: flex-start; flex-wrap: wrap; margin-top: 6px; } .job-title { font-weight: 700; } .job-progress progress { width: min(120px, 100%); max-width: 100%; height: 9px; } .job-detail { display: grid; gap: 14px; font-size: 12px; } .job-detail section { display: grid; gap: 8px; } .job-detail h3 { margin: 0; font-size: 13px; } .job-detail pre, .job-event-row pre { max-height: 220px; overflow: auto; margin: 6px 0 0; border: 1px solid #e2e8f0; border-radius: 6px; background: #f8fafc; padding: 8px; font-size: 11px; white-space: pre-wrap; } .job-detail-summary, .job-detail-progress, .job-event-title { display: flex; justify-content: space-between; gap: 10px; align-items: center; min-width: 0; flex-wrap: wrap; } .job-detail-progress progress { flex: 1 1 180px; height: 10px; } .job-current-event { border: 1px solid #cbd5e1; border-radius: 6px; background: #f8fafc; padding: 8px; } .job-step-list, .job-event-list, .job-queue-snapshot { display: grid; gap: 8px; } .job-step, .job-event-row, .job-queue-item { display: grid; grid-template-columns: auto minmax(0, 1fr); gap: 9px; align-items: start; min-width: 0; } .job-step, .job-event-row { border: 1px solid #e2e8f0; border-radius: 6px; background: #f8fafc; padding: 8px; } .job-step-index { display: inline-grid; place-items: center; width: 24px; height: 24px; border-radius: 999px; border: 1px solid #cbd5e1; background: #fff; color: #475569; font-weight: 700; font-size: 11px; } .job-step.done .job-step-index { border-color: #16a34a; background: #ecfdf5; color: #166534; } .job-step.current { border-color: #93c5fd; background: #eff6ff; } .job-step.current .job-step-index { border-color: #2563eb; background: #dbeafe; color: #1d4ed8; } .job-step.failed, .job-step.cancelled { border-color: #fecaca; background: #fff7f7; } .job-step.pending { opacity: .72; } .job-queue-item { grid-template-columns: auto minmax(0, 1fr) auto; align-items: center; border-top: 1px solid #e2e8f0; padding-top: 6px; } .job-queue-item:first-child { border-top: none; padding-top: 0; } .job-queue-item.selected { color: #0f172a; font-weight: 700; } .spinner { display: inline-block; width: 14px; height: 14px; border: 2px solid #c8d4df; border-top-color: #2563eb; border-radius: 50%; animation: spin .8s linear infinite; vertical-align: -2px; } .spinner-small { width: 12px; height: 12px; border-width: 2px; } @keyframes spin { to { transform: rotate(360deg); } } .journey-options { display: grid; grid-template-columns: 1fr 1fr; gap: 8px; } .journey-snapshot { display: grid; gap: 2px; border: 1px solid #d8e0e8; border-radius: 6px; background: #f8fafc; padding: 7px 8px; font-size: 12px; min-width: 0; } .journey-snapshot strong, .journey-snapshot span { min-width: 0; overflow-wrap: anywhere; } .journey-snapshot strong { color: #17212b; } .journey-mode { display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; margin: 8px 0; } .journey-mode label, .journey-direct { display: flex; align-items: center; gap: 6px; font-size: 12px; } .journey-mode label { justify-content: center; min-height: 30px; border: 1px solid #d8e0e8; border-radius: 6px; background: #fff; padding: 4px 6px; } .journey-direct { margin: 8px 0; } .journey-message { display: flex; align-items: center; gap: 6px; } .journey-actions { display: grid; grid-template-columns: 1fr 1fr 1fr; gap: 8px; } .journey-swap { margin: -2px 0 4px; justify-self: start; } .stop-suggestions { display: grid; gap: 4px; margin-top: -4px; } .stop-suggestion { display: grid; grid-template-columns: 22px minmax(0, 1fr); align-items: center; gap: 6px; width: 100%; text-align: left; border: 1px solid #d8e0e8; border-radius: 6px; background: #fff; padding: 6px 8px; font-size: 12px; font-weight: 500; } .stop-suggestion-text { display: grid; min-width: 0; gap: 2px; } .stop-suggestion-text strong { overflow-wrap: anywhere; } .stop-suggestion-icon { display: inline-grid; place-items: center; width: 18px; height: 18px; color: #2d5f7f; font-size: 14px; line-height: 1; } .stop-place-icon { border: 1.5px solid #2d5f7f; border-radius: 50%; font-size: 11px; font-weight: 800; } .stop-suggestion:hover { background: #eef4f8; } .stop-suggestion-text span { color: #667482; font-size: 11px; overflow-wrap: anywhere; } .journey-results { margin-top: 8px; font-size: 12px; max-height: 260px; overflow: auto; } .itinerary-panel { margin-top: 10px; border-top: 1px solid #dbe3eb; padding-top: 9px; } .itinerary-results { display: grid; gap: 8px; margin-top: 8px; font-size: 12px; max-height: 280px; overflow: auto; } .itinerary { border: 1px solid #dbe3eb; border-radius: 8px; padding: 8px; background: #fff; } .itinerary.saved { border-color: #86efac; background: #f0fdf4; } .itinerary-leg { display: flex; justify-content: space-between; gap: 8px; align-items: center; margin-top: 5px; border-top: 1px solid #edf2f7; padding-top: 5px; } .itinerary-leg span { min-width: 0; overflow-wrap: anywhere; } .journey { border-top: 1px solid #e1e7ee; padding: 8px 0; } .journey:first-child { border-top: none; } .journey-title { display: flex; justify-content: space-between; gap: 8px; align-items: center; font-weight: 700; } .journey-leg { margin-top: 4px; color: #2f3b46; display: flex; align-items: center; flex-wrap: wrap; gap: 4px; } .journey-leg strong { color: #17212b; } .mode-icon { display: inline-grid; place-items: center; width: 20px; height: 20px; border-radius: 4px; background: #e5e7eb; color: #17212b; font-size: 10px; font-weight: 800; line-height: 1; vertical-align: middle; flex: 0 0 auto; } .mode-train { background: #ede9fe; color: #7c3aed; } .mode-light_rail, .mode-tram { background: #fee2e2; color: #dc2626; } .mode-subway { background: #fee2e2; color: #ef4444; } .mode-bus, .mode-trolleybus { background: #fef3c7; color: #ca8a04; } .mode-coach { background: #fef3c7; color: #a16207; } .mode-ferry { background: #dbeafe; color: #0284c7; } .mode-walk { background: #dcfce7; color: #16a34a; } .mode-drive, .mode-car { background: #ffedd5; color: #f97316; } .mode-monorail, .mode-funicular, .mode-aerialway { background: #ede9fe; color: #7c3aed; } .inline-link { display: inline; width: auto; padding: 0; border: none; background: transparent; color: #1d4ed8; font: inherit; text-align: left; text-decoration: underline; text-underline-offset: 2px; } .inline-link:hover { color: #0f766e; } .map-floating { position: absolute; top: 12px; right: 12px; z-index: 600; width: min(390px, calc(100% - 24px)); max-height: calc(100% - 28px); overflow: auto; background: rgba(255,255,255,.96); border: 1px solid #cfd8e2; border-radius: 8px; padding: 11px; box-shadow: 0 8px 24px rgba(16, 24, 32, .16); } .map-floating h2 { font-size: 15px; margin: 0 0 10px; } .map-loading { position: absolute; top: 12px; left: 50%; transform: translateX(-50%); z-index: 650; display: flex; align-items: center; gap: 8px; padding: 8px 11px; border: 1px solid #c7d3df; border-radius: 8px; background: rgba(255,255,255,.96); box-shadow: 0 8px 24px rgba(16, 24, 32, .14); color: #273646; font-size: 12px; font-weight: 700; } .map-loading[hidden] { display: none; } .journey-context-popup .leaflet-popup-content { margin: 9px 10px; } .journey-context-menu { display: grid; gap: 8px; min-width: 240px; font-size: 12px; } .journey-context-title { display: grid; grid-template-columns: 22px minmax(0, 1fr); gap: 7px; align-items: center; } .journey-context-title span { display: grid; gap: 2px; min-width: 0; } .journey-context-title strong, .journey-context-title small { overflow-wrap: anywhere; } .journey-context-title small { color: #667482; } .journey-context-actions { display: grid; grid-template-columns: 1fr 1fr; gap: 6px; } .journey-context-status { display: flex; align-items: center; gap: 6px; } .legend { position: absolute; right: 12px; bottom: 12px; display: grid; gap: 6px; background: rgba(255,255,255,.94); border: 1px solid #d1d8e0; border-radius: 8px; padding: 9px; font-size: 12px; z-index: 500; } .overlay { position: fixed; inset: 0; z-index: 1000; background: rgba(15, 23, 32, .34); display: grid; place-items: center; padding: 20px; } .overlay[hidden] { display: none; } .overlay.map-review { background: transparent; place-items: start end; pointer-events: none; padding: 12px; } .overlay-panel { display: flex; flex-direction: column; width: min(900px, 100%); max-height: min(680px, 84vh); overflow: hidden; background: #fff; border: 1px solid #cfd8e2; border-radius: 8px; box-shadow: 0 18px 48px rgba(16, 24, 32, .24); padding: 14px; } .overlay.map-review .overlay-panel { pointer-events: auto; width: min(560px, calc(100vw - 24px)); max-height: calc(100vh - 24px); } #overlayContent { min-height: 0; overflow: auto; padding-right: 4px; } .overlay-title { z-index: 1; display: flex; justify-content: space-between; gap: 12px; align-items: center; background: #fff; margin-bottom: 10px; padding: 0 0 10px; border-bottom: 1px solid #e2e8f0; } .overlay-title h2 { margin: 0; font-size: 16px; } .candidate { border-top: 1px solid #e2e8f0; padding: 9px 0; font-size: 12px; } .candidate:first-child { border-top: none; } .candidate.selected { margin: 0 -8px; padding: 9px 8px; border-radius: 8px; background: #fff7ed; border-top-color: transparent; box-shadow: inset 0 0 0 1px #fed7aa; } .candidate-context { display: grid; gap: 7px; margin-bottom: 8px; } .candidate-preview-legend { display: flex; flex-wrap: wrap; gap: 8px; font-size: 11px; color: #52606d; } .candidate-swatch { display: inline-block; width: 22px; height: 0; border-top: 4px solid #64748b; margin-right: 4px; vertical-align: middle; } .candidate-swatch.gtfs { border-top-color: #0f766e; border-top-style: dashed; } .candidate-swatch.selected { border-top-color: #f97316; } .candidate-title { display: flex; justify-content: space-between; gap: 8px; font-weight: 700; } .candidate-actions { margin-top: 6px; } .candidate pre { margin: 5px 0 0; padding: 7px; border-radius: 6px; background: #f7fafc; white-space: pre-wrap; overflow-wrap: anywhere; } .canonical-stop-detail { display: grid; gap: 14px; font-size: 12px; } .canonical-stop-detail h3 { margin: 0 0 6px; font-size: 13px; } .canonical-summary, .canonical-link-row, .canonical-candidate-row, .rule-row { border: 1px solid #e1e7ee; border-radius: 8px; padding: 9px; background: #fbfdff; } .canonical-summary { display: grid; gap: 3px; } .canonical-link-row, .canonical-candidate-row { display: flex; justify-content: space-between; gap: 12px; align-items: start; margin-top: 6px; } .canonical-candidates { display: grid; gap: 6px; margin-top: 8px; } .rule-row { margin-top: 6px; } .rule-row pre { margin: 6px 0 0; padding: 7px; border-radius: 6px; background: #f7fafc; white-space: pre-wrap; overflow-wrap: anywhere; } .line { display: inline-block; width: 24px; height: 0; border-top: 4px solid #555; margin-right: 6px; vertical-align: middle; } .line.osm { border-color: #6b7280; } .line.gtfs { border-color: #18864b; } .line.missing { border-color: #d03030; } .dot { display: inline-block; width: 10px; height: 10px; border-radius: 50%; background: #334155; margin-right: 6px; } @media (max-width: 900px) { main { grid-template-columns: 1fr; height: auto; } aside { height: 50vh; } main.sidebar-collapsed { grid-template-columns: 1fr; } main.sidebar-collapsed aside { height: 42px; } main.sidebar-collapsed .sidebar-collapse-handle { left: auto; right: 8px; bottom: 7px; } .map-panel { height: 50vh; } .map-floating { top: 8px; right: 8px; width: calc(100% - 16px); max-height: calc(100% - 16px); } .journey-results { max-height: 140px; } } @media (max-width: 520px) { .source-catalog-filter { grid-template-columns: 1fr; } .source-catalog-actions { grid-template-columns: 1fr; } }