@import "tailwindcss"; :root { --font-sans: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif; --font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", monospace; --color-bg: #f6f5f1; --color-bg-muted: #efeee8; --color-surface: #ffffff; --color-surface-soft: #f9f8f5; --color-surface-muted: #f1f0eb; --color-border: #dedbd2; --color-border-strong: #ccc8bd; --color-text: #2f3432; --color-heading: #242927; --color-muted: #747a76; --color-primary: #7f9183; --color-primary-hover: #6f8074; --color-primary-soft: #e6ebe4; --color-accent: #a79b8e; --color-accent-soft: #ece7e1; --color-success: #7f9a86; --color-success-soft: #e7eee6; --color-warning: #b6a06f; --color-warning-soft: #f2ead8; --color-danger: #b87f7a; --color-danger-hover: #a96f6a; --color-danger-soft: #f1e1dd; --radius-sm: 8px; --radius-md: 12px; --shadow-sm: 0 1px 2px rgba(47, 52, 50, 0.05); --shadow-md: 0 8px 24px rgba(47, 52, 50, 0.08); --shadow-floating: 0 14px 34px rgba(47, 52, 50, 0.14); font-family: var(--font-sans); color: var(--color-text); background: var(--color-bg); font-synthesis: none; text-rendering: optimizeLegibility; -webkit-font-smoothing: antialiased; -moz-osx-font-smoothing: grayscale; } * { box-sizing: border-box; } body { margin: 0; background: var(--color-bg); } button, input, textarea, select { font: inherit; } button:not(:disabled) { cursor: pointer; } button:disabled { cursor: not-allowed; } a { color: var(--color-primary-hover); } .app-shell { min-height: 100vh; display: grid; grid-template-rows: auto auto 1fr auto; gap: 12px; padding: 16px; } .topbar { display: flex; align-items: center; justify-content: space-between; gap: 18px; padding: 16px 18px; border: 1px solid var(--color-border); border-radius: var(--radius-md); background: color-mix(in srgb, var(--color-surface) 94%, var(--color-bg-muted)); box-shadow: var(--shadow-sm); } .topbar-actions { display: flex; align-items: center; flex-wrap: wrap; justify-content: flex-end; gap: 10px; } .eyebrow { margin: 0 0 6px; color: var(--color-muted); text-transform: uppercase; letter-spacing: 0.12em; font-size: 12px; font-weight: 700; } h1, h2, h3, h4 { margin: 0; color: var(--color-heading); } h1 { font-size: clamp(26px, 4vw, 32px); line-height: 1.05; letter-spacing: -0.03em; } h2 { font-size: 18px; letter-spacing: -0.01em; } h3 { font-size: 14px; } .topbar button, .topbar-link, .admin-form button, .admin-actions button, .admin-button, .confirm-modal-secondary, .confirm-modal-danger, .pagination button, .map-source-icon, .map-source-option, .context-menu button, .context-menu a { transition: background-color 0.16s ease, color 0.16s ease, border-color 0.16s ease, box-shadow 0.16s ease, transform 0.16s ease; } .topbar button, .topbar-link, .admin-form button, .admin-actions button, .admin-button { border: 1px solid transparent; border-radius: var(--radius-sm); padding: 9px 16px; color: #fff; font-weight: 700; background: var(--color-primary); box-shadow: var(--shadow-sm); } .topbar button:not(:disabled):hover, .topbar-link:hover, .admin-form button:not(:disabled):hover, .admin-actions button:not(:disabled):hover, .admin-button:not(:disabled):hover { background: var(--color-primary-hover); box-shadow: var(--shadow-md); transform: translateY(-1px); } .admin-button.ghost { color: color-mix(in srgb, var(--color-primary) 76%, var(--color-heading)); border-color: color-mix(in srgb, var(--color-primary) 36%, white); background: var(--color-primary-soft); } .admin-button.secondary { background: var(--color-accent); } .admin-button.danger { background: var(--color-danger); } .admin-button.danger:not(:disabled):hover { background: var(--color-danger-hover); } .topbar-link { text-decoration: none; } .topbar button:disabled, .admin-button:disabled, .admin-form button:disabled, .admin-actions button:disabled { opacity: 0.55; } .status-pill, .counter, .badge { display: inline-flex; align-items: center; border-radius: 999px; padding: 6px 10px; color: color-mix(in srgb, var(--color-warning) 70%, var(--color-heading)); background: var(--color-warning-soft); font-size: 13px; font-weight: 700; } .status-pill.ok { color: color-mix(in srgb, var(--color-success) 68%, var(--color-heading)); background: var(--color-success-soft); } .status-pill.disabled, .counter, .badge { color: var(--color-text); background: var(--color-surface-muted); } .error, .inline-error { border: 1px solid color-mix(in srgb, var(--color-danger) 36%, white); border-radius: var(--radius-md); padding: 12px 16px; color: color-mix(in srgb, var(--color-danger) 72%, var(--color-heading)); background: var(--color-danger-soft); word-break: break-word; } .workspace { min-height: 560px; display: grid; grid-template-columns: minmax(320px, 420px) minmax(0, 1fr); gap: 12px; } .panel { position: relative; overflow: hidden; border: 1px solid var(--color-border); border-radius: var(--radius-md); background: var(--color-surface); box-shadow: var(--shadow-sm); } .panel-header { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 16px; border-bottom: 1px solid var(--color-border); background: color-mix(in srgb, var(--color-surface) 92%, var(--color-bg)); } .chat-panel { display: flex; flex-direction: column; min-height: 0; max-height: 560px; overflow-y: auto; } .chat-panel .panel-header { position: sticky; z-index: 10; top: 0; } .chat-loading, .chat-end { padding: 10px 16px; border-bottom: 1px solid var(--color-border); color: var(--color-muted); font-size: 13px; text-align: center; background: var(--color-surface-soft); } .chat-item { display: grid; gap: 6px; width: 100%; border: 0; border-bottom: 1px solid var(--color-border); padding: 14px 16px; text-align: left; color: inherit; background: transparent; transition: background-color 0.16s ease, transform 0.16s ease; } .chat-item:hover, .chat-item.selected { background: var(--color-primary-soft); } .chat-item:hover { transform: translateY(-1px); } .chat-meta { display: flex; justify-content: space-between; gap: 12px; color: var(--color-text); } .chat-meta small, .chat-host, .muted, .chat-topic { color: var(--color-muted); } .chat-topic { font-size: 12px; line-height: 1.2; word-break: break-all; } .chat-text { color: var(--color-heading); line-height: 1.45; } .message-merge-count { display: inline-flex; align-items: center; margin-left: 6px; border-radius: 999px; padding: 1px 6px; color: color-mix(in srgb, var(--color-primary) 72%, var(--color-heading)); background: var(--color-primary-soft); font-size: 12px; font-weight: 700; } .context-menu { position: fixed; z-index: 2000; min-width: 130px; border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: 6px; background: var(--color-surface); box-shadow: var(--shadow-floating); } .context-menu button, .context-menu a { display: block; width: 100%; border: 0; border-radius: var(--radius-sm); padding: 8px 10px; text-align: left; color: inherit; text-decoration: none; background: transparent; } .context-menu button:hover, .context-menu a:hover { background: var(--color-surface-muted); transform: translateY(-1px); } .context-menu button.danger { color: color-mix(in srgb, var(--color-danger) 78%, var(--color-heading)); } .modal-backdrop { position: fixed; z-index: 3000; inset: 0; display: grid; place-items: center; padding: 20px; background: rgba(47, 52, 50, 0.34); backdrop-filter: blur(3px); } .confirm-modal { width: min(460px, 100%); overflow: hidden; border: 1px solid var(--color-border); border-radius: var(--radius-md); background: var(--color-surface); box-shadow: var(--shadow-floating); } .confirm-modal-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; padding: 16px 18px; border-bottom: 1px solid var(--color-border); } .confirm-modal-header h2 { margin: 2px 0 0; } .confirm-modal-close { width: 32px; height: 32px; border: 0; border-radius: 999px; color: var(--color-muted); font-size: 24px; line-height: 1; background: var(--color-surface-muted); } .confirm-modal-close:hover { color: var(--color-heading); background: var(--color-bg-muted); transform: translateY(-1px); } .confirm-modal-body { display: grid; gap: 14px; padding: 18px; color: var(--color-text); } .confirm-modal-body p { margin: 0; line-height: 1.65; } .confirm-modal-reason { display: grid; gap: 8px; color: var(--color-text); font-size: 14px; font-weight: 700; } .confirm-modal-reason textarea, .admin-form input, .admin-table-input, .help-editor-pane textarea, .mqtt-forward-page :is(input, select), .map-source-page input { border: 1px solid var(--color-border-strong); border-radius: var(--radius-sm); padding: 10px 12px; color: var(--color-heading); background: var(--color-surface); outline: none; transition: border-color 0.16s ease, box-shadow 0.16s ease, background-color 0.16s ease; } .confirm-modal-reason textarea { min-height: 88px; resize: vertical; font-weight: 400; } .confirm-modal-reason textarea:focus, .admin-form input:focus, .admin-table-input:focus, .help-editor-pane textarea:focus { border-color: var(--color-primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary) 20%, transparent); } .confirm-modal-actions { display: flex; justify-content: flex-end; gap: 10px; padding: 14px 18px 18px; border-top: 1px solid var(--color-border); background: var(--color-surface-soft); } .confirm-modal-secondary, .confirm-modal-danger { border: 1px solid transparent; border-radius: var(--radius-sm); padding: 9px 16px; font-weight: 700; } .confirm-modal-secondary { color: var(--color-text); background: var(--color-surface-muted); } .confirm-modal-danger { color: #fff; background: var(--color-danger); } .confirm-modal-secondary:not(:disabled):hover, .confirm-modal-danger:not(:disabled):hover { transform: translateY(-1px); box-shadow: var(--shadow-md); } .confirm-modal-danger:not(:disabled):hover { background: var(--color-danger-hover); } .confirm-modal-danger:disabled { opacity: 0.45; } .map-panel { min-width: 0; } .map-header { position: absolute; z-index: 500; top: 12px; left: 12px; right: 12px; border: 1px solid color-mix(in srgb, var(--color-border) 84%, transparent); border-radius: var(--radius-md); background: color-mix(in srgb, var(--color-surface) 92%, transparent); backdrop-filter: blur(8px); } .map-container { height: 100%; min-height: 560px; } .map-source-control { position: absolute; z-index: 800; top: 12px; right: 12px; } .map-source-icon { display: inline-flex; align-items: center; justify-content: center; width: 42px; height: 42px; border: 1px solid color-mix(in srgb, var(--color-border) 88%, transparent); border-radius: var(--radius-md); color: var(--color-primary-hover); background: color-mix(in srgb, var(--color-surface) 94%, transparent); box-shadow: var(--shadow-md); backdrop-filter: blur(8px); } .map-source-icon:hover { transform: translateY(-1px); } .map-source-popover { position: absolute; top: 0; right: 0; display: grid; gap: 10px; width: min(300px, calc(100vw - 32px)); border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: 12px; background: color-mix(in srgb, var(--color-surface) 96%, var(--color-bg)); box-shadow: var(--shadow-floating); opacity: 0; pointer-events: none; transform: translateY(-6px); transform-origin: top right; transition: opacity 0.16s ease, transform 0.16s ease; backdrop-filter: blur(12px); } .map-source-control:hover .map-source-popover, .map-source-control:focus-within .map-source-popover { opacity: 1; pointer-events: auto; transform: translateY(0); } .map-source-control:hover .map-source-icon, .map-source-control:focus-within .map-source-icon { opacity: 0; } .map-source-drawer-header { display: flex; align-items: flex-start; justify-content: space-between; gap: 12px; border-bottom: 1px solid var(--color-border); padding-bottom: 9px; } .map-source-drawer-header span { color: var(--color-heading); font-size: 14px; font-weight: 900; } .map-source-drawer-header small { flex-shrink: 0; border-radius: 999px; padding: 3px 7px; color: color-mix(in srgb, var(--color-primary) 72%, var(--color-heading)); font-size: 11px; font-weight: 800; background: var(--color-primary-soft); } .map-source-options { display: grid; gap: 8px; max-height: 260px; overflow: auto; padding-right: 2px; } .map-source-option { display: flex; align-items: center; justify-content: space-between; gap: 10px; width: 100%; border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: 10px 11px; color: var(--color-text); text-align: left; background: color-mix(in srgb, var(--color-surface) 88%, transparent); box-shadow: var(--shadow-sm); } .map-source-option:hover { border-color: var(--color-primary); background: var(--color-primary-soft); box-shadow: var(--shadow-md); transform: translateY(-1px); } .map-source-option.active { border-color: var(--color-primary); color: color-mix(in srgb, var(--color-primary) 72%, var(--color-heading)); background: var(--color-primary-soft); box-shadow: inset 3px 0 0 var(--color-primary), var(--shadow-sm); } .map-source-option-name { min-width: 0; overflow: hidden; font-size: 13px; font-weight: 800; text-overflow: ellipsis; white-space: nowrap; } .map-source-option-check { flex-shrink: 0; border-radius: 999px; padding: 3px 7px; color: color-mix(in srgb, var(--color-success) 72%, var(--color-heading)); font-size: 11px; font-weight: 900; background: var(--color-success-soft); } .map-source-control-pill { max-width: 240px; overflow: hidden; color: var(--color-text); font-size: 13px; font-weight: 800; text-overflow: ellipsis; white-space: nowrap; } .map-empty { position: absolute; z-index: 450; left: 50%; top: 50%; transform: translate(-50%, -50%); padding: 10px 14px; border-radius: 999px; color: var(--color-muted); background: color-mix(in srgb, var(--color-surface) 92%, transparent); box-shadow: var(--shadow-md); } .node-marker { display: flex !important; align-items: center; justify-content: center; min-width: 34px !important; width: auto !important; height: 22px !important; padding: 0; border: 0; border-radius: 999px; color: white; background: transparent; box-shadow: 0 4px 10px rgba(47, 52, 50, 0.22); font-size: 10px; font-weight: 800; line-height: 20px; text-align: center; white-space: nowrap; } .node-marker span { display: flex; align-items: center; justify-content: center; min-width: 34px; width: 100%; height: 100%; padding: 0 4px; border: 1px solid rgba(255, 255, 255, 0.9); border-radius: inherit; background: var(--node-color, var(--color-primary)); line-height: 20px; text-align: center; } .node-marker.selected { box-shadow: 0 6px 18px color-mix(in srgb, var(--color-danger) 42%, transparent); } .node-marker.selected span { background: var(--color-danger); } .cluster-marker { display: flex !important; align-items: center; justify-content: center; border: 2px solid white; border-radius: 999px; color: white; background: var(--color-primary); box-shadow: 0 6px 16px rgba(47, 52, 50, 0.22); font-size: 13px; font-weight: 900; line-height: 1; } .cluster-marker span { display: flex; align-items: center; justify-content: center; width: 100%; height: 100%; } .cluster-medium { background: color-mix(in srgb, var(--color-primary) 82%, var(--color-accent)); } .cluster-large { background: color-mix(in srgb, var(--color-primary) 66%, var(--color-heading)); } .node-detail-panel, .node-list-panel { min-height: 180px; } .node-list-panel { min-height: 240px; } .detail-page, .help-page { display: grid; gap: 12px; width: min(1280px, 100%); margin: 0 auto; } .help-content { display: grid; gap: 18px; padding: 20px; color: var(--color-text); } .help-content section { display: grid; gap: 8px; } .help-content ul { margin: 0; padding-left: 20px; } .markdown-body { line-height: 1.7; word-break: break-word; } .markdown-body h1, .markdown-body h2, .markdown-body h3 { margin: 0.8em 0 0.4em; color: var(--color-heading); } .markdown-body h1:first-child, .markdown-body h2:first-child, .markdown-body h3:first-child { margin-top: 0; } .markdown-body p, .markdown-body ul, .markdown-body ol { margin: 0 0 0.8em; } .markdown-body ul, .markdown-body ol { padding-left: 22px; } .markdown-body a { color: var(--color-primary-hover); font-weight: 700; } .markdown-body code { border-radius: 6px; padding: 2px 5px; background: var(--color-surface-muted); font-family: var(--font-mono); } .markdown-body pre { overflow-x: auto; border-radius: var(--radius-md); padding: 12px; background: #323633; } .markdown-body pre code { padding: 0; color: #f3f0e8; background: transparent; } .detail-section-grid { display: grid; grid-template-columns: minmax(320px, 1fr) minmax(320px, 1fr); gap: 12px; } .detail-summary-grid, .metrics-grid, .admin-status-grid { display: grid; gap: 10px; padding: 16px; } .detail-summary-grid { grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); } .metrics-grid { grid-template-columns: repeat(auto-fit, minmax(130px, 1fr)); } .admin-status-grid { grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); } .detail-summary-grid div, .metric-chip, .admin-status-grid div, .status-card-link { display: grid; gap: 5px; border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: 12px; background: var(--color-surface-soft); } .metric-chip { border-radius: var(--radius-sm); padding: 8px 10px; } .detail-summary-grid span, .metric-chip span, .admin-status-grid span, .status-card-link span { color: var(--color-muted); font-size: 13px; } .metric-chip span { font-size: 12px; } .detail-summary-grid strong, .metric-chip strong, .admin-status-grid strong, .status-card-link strong { color: var(--color-heading); } .metric-chip strong { font-size: 14px; } .detail-chat-panel { min-height: 420px; } .detail-chat-history { max-height: 420px; overflow-y: auto; } .detail-chat-item { display: grid; gap: 6px; border-bottom: 1px solid var(--color-border); padding: 13px 16px; } .trajectory-toolbar { display: flex; flex-wrap: wrap; align-items: flex-end; gap: 12px; padding: 0 0 14px; } .trajectory-date-field { display: grid; gap: 6px; color: var(--color-muted); font-size: 12px; font-weight: 700; } .trajectory-date-field input { border: 1px solid var(--color-border-strong); border-radius: var(--radius-sm); padding: 9px 12px; color: var(--color-heading); background: var(--color-surface); outline: none; } .trajectory-date-field input:focus { border-color: var(--color-primary); box-shadow: 0 0 0 3px color-mix(in srgb, var(--color-primary) 20%, transparent); } .trajectory-toolbar button { border: 1px solid var(--color-border-strong); border-radius: var(--radius-sm); padding: 9px 12px; color: var(--color-heading); background: var(--color-surface); } .trajectory-toolbar button:not(:disabled):hover { border-color: var(--color-primary); color: var(--color-primary-hover); background: var(--color-primary-soft); transform: translateY(-1px); } .trajectory-toolbar button:disabled, .trajectory-date-field input:disabled { opacity: 0.6; } .trajectory-status { margin: 0 0 12px; color: var(--color-muted); } .trajectory-map-shell { position: relative; } .trajectory-map { height: 420px; min-height: 360px; } .public-key-block, .discard-raw, .discard-json { max-width: 100%; margin: 0; overflow: auto; white-space: pre-wrap; word-break: break-all; color: var(--color-heading); font-family: var(--font-mono); font-size: 12px; } .public-key-block { padding: 16px; } .discard-raw, .discard-json { max-width: 360px; max-height: 120px; } .node-table-wrap { overflow-x: auto; } .node-table { width: 100%; border-collapse: collapse; font-size: 14px; } .node-table th, .node-table td { padding: 10px 12px; border-bottom: 1px solid var(--color-border); text-align: left; white-space: nowrap; } .node-table th { color: var(--color-muted); font-size: 12px; letter-spacing: 0.06em; text-transform: uppercase; } .node-row { cursor: pointer; transition: background-color 0.16s ease; } .node-row:hover, .node-row.selected { background: var(--color-primary-soft); } .admin-loading { padding: 24px; color: var(--color-muted); } .admin-login, .admin-dashboard, .admin-session-card { max-width: 1100px; margin: 0 auto; width: 100%; } .admin-session-card { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 16px; } .admin-nav { display: flex; align-items: center; flex-wrap: wrap; gap: 8px; } .admin-nav a { border-radius: 999px; padding: 7px 10px; color: var(--color-text); text-decoration: none; font-size: 13px; font-weight: 700; background: var(--color-surface-muted); transition: background-color 0.16s ease, color 0.16s ease, transform 0.16s ease; } .admin-nav a:hover { background: var(--color-primary-soft); transform: translateY(-1px); } .admin-nav a.active { color: #fff; background: var(--color-primary); } .admin-form { display: grid; gap: 14px; padding: 18px; } .admin-user-form { grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); align-items: end; } .admin-form label { display: grid; gap: 6px; color: var(--color-text); font-size: 14px; font-weight: 700; } .help-version { margin: 12px 16px 0; } .help-editor-grid { display: grid; grid-template-columns: minmax(320px, 1fr) minmax(320px, 1fr); gap: 12px; padding: 16px; } .help-editor-pane { display: grid; gap: 8px; color: var(--color-text); font-size: 14px; font-weight: 700; } .help-editor-pane textarea { min-height: 520px; resize: vertical; font: 14px/1.5 var(--font-mono); } .help-preview-pane { min-width: 0; } .help-preview-header { display: flex; align-items: center; justify-content: space-between; gap: 12px; } .help-preview { min-height: 520px; overflow: auto; border: 1px solid var(--color-border); border-radius: var(--radius-md); padding: 12px; color: var(--color-text); font-weight: 400; background: var(--color-surface-soft); } .admin-table-input { min-width: 160px; padding: 8px 10px; } .success { margin: 0 16px 12px; border: 1px solid color-mix(in srgb, var(--color-success) 34%, white); border-radius: var(--radius-md); padding: 10px 12px; color: color-mix(in srgb, var(--color-success) 70%, var(--color-heading)); background: var(--color-success-soft); } .log-badge { display: inline-flex; border-radius: 999px; padding: 4px 8px; font-size: 12px; font-weight: 700; } .log-success { color: color-mix(in srgb, var(--color-success) 70%, var(--color-heading)); background: var(--color-success-soft); } .log-failure { color: color-mix(in srgb, var(--color-danger) 76%, var(--color-heading)); background: var(--color-danger-soft); } .admin-dashboard { display: grid; gap: 12px; } .admin-actions { display: flex; align-items: center; flex-wrap: wrap; justify-content: flex-end; gap: 10px; } .status-card-link { color: inherit; text-decoration: none; transition: background-color 0.16s ease, border-color 0.16s ease, transform 0.16s ease; } .status-card-link:hover { border-color: var(--color-primary); background: var(--color-primary-soft); transform: translateY(-1px); } .signed-calendar-panel { overflow: visible; } .signed-calendar-toolbar { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 16px; } .signed-calendar-toolbar strong { color: var(--color-heading); font-size: 18px; } .signed-calendar-grid { display: grid; grid-template-columns: repeat(7, minmax(0, 1fr)); gap: 6px; padding: 0 16px 16px; } .signed-calendar-weekday { padding: 8px 4px; color: var(--color-muted); text-align: center; font-size: 12px; font-weight: 700; } .signed-calendar-day { min-height: 74px; border: 1px solid var(--color-border); border-radius: var(--radius-sm); padding: 8px; color: var(--color-text); background: var(--color-surface-soft); text-align: left; transition: background-color 0.16s ease, border-color 0.16s ease, box-shadow 0.16s ease, transform 0.16s ease; } button.signed-calendar-day:not(:disabled):hover { border-color: var(--color-primary); background: var(--color-primary-soft); transform: translateY(-1px); } .signed-calendar-day.empty { border-color: transparent; background: transparent; } .signed-calendar-day.has-signs { border-color: color-mix(in srgb, var(--color-primary) 42%, white); background: var(--color-primary-soft); } .signed-calendar-day.today { border-color: var(--color-warning); color: color-mix(in srgb, var(--color-warning) 72%, var(--color-heading)); background: var(--color-warning-soft); box-shadow: inset 0 0 0 1px color-mix(in srgb, var(--color-warning) 36%, transparent); } .signed-calendar-day.selected { border-color: var(--color-primary); color: #fff; background: var(--color-primary); box-shadow: var(--shadow-sm); } .signed-calendar-date, .signed-calendar-count { display: block; } .signed-calendar-date { color: inherit; font-weight: 800; } .signed-calendar-count { margin-top: 8px; font-size: 12px; font-weight: 700; } .signed-filter-info { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 16px; border-top: 1px solid var(--color-border); color: var(--color-muted); } .pagination { display: flex; align-items: center; justify-content: flex-end; gap: 12px; padding: 12px 16px; border-top: 1px solid var(--color-border); color: var(--color-muted); } .pagination button { border: 1px solid var(--color-border-strong); border-radius: var(--radius-sm); padding: 8px 12px; color: var(--color-heading); background: var(--color-surface); } .pagination button:not(:disabled):hover { border-color: var(--color-primary); color: var(--color-primary-hover); background: var(--color-primary-soft); transform: translateY(-1px); } .pagination button:disabled { opacity: 0.45; } .node-detail-popup .leaflet-popup-content { width: 300px !important; max-width: 300px !important; } .node-popup { width: 100%; line-height: 1.35; white-space: normal; } .node-popup strong { display: block; margin-bottom: 8px; color: var(--color-heading); font-size: 15px; line-height: 1.3; overflow-wrap: anywhere; } .node-popup dl { display: grid; gap: 6px; margin: 0; } .node-popup dl div { display: block; } .node-popup dt { color: var(--color-muted); font-size: 11px; line-height: 1.35; margin-bottom: 2px; } .node-popup dd { margin: 0; color: var(--color-heading); font-weight: 700; line-height: 1.35; white-space: normal; overflow-wrap: anywhere; } .trajectory-point-popup .leaflet-popup-content { width: 320px !important; max-width: 320px !important; } .trajectory-popup { line-height: 1.45; white-space: nowrap; } .trajectory-popup strong { display: block; margin-bottom: 8px; color: var(--color-heading); font-size: 15px; } .trajectory-popup dl { display: grid; gap: 6px; margin: 0; } .trajectory-popup dl div { display: grid; grid-template-columns: 42px minmax(0, 1fr); gap: 8px; align-items: baseline; } .trajectory-popup dt { color: var(--color-muted); font-size: 12px; letter-spacing: 0; text-transform: none; white-space: nowrap; } .trajectory-popup dd { margin: 0; color: var(--color-heading); font-weight: 700; white-space: nowrap; } .detail-grid { display: grid; grid-template-columns: 1.2fr 1fr 1fr; gap: 16px; padding: 16px; } dl { display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 10px; margin: 0; } dt { color: var(--color-muted); font-size: 12px; text-transform: uppercase; letter-spacing: 0.06em; } dd { margin: 3px 0 0; color: var(--color-heading); font-weight: 700; overflow-wrap: anywhere; } .detail-side ul { margin: 10px 0 0; padding-left: 18px; } .detail-side li { margin-bottom: 6px; color: var(--color-text); } .empty { padding: 22px 16px; color: var(--color-muted); } .leaflet-container { font: inherit; } @media (max-width: 920px) { .app-shell { padding: 10px; } .topbar, .topbar-actions { align-items: stretch; flex-direction: column; } .workspace, .detail-grid, .detail-section-grid, .help-editor-grid { grid-template-columns: 1fr; } .workspace { min-height: auto; } .chat-panel { max-height: 420px; } .pagination, .confirm-modal-actions, .admin-session-card, .signed-filter-info { align-items: stretch; flex-direction: column; } .signed-calendar-toolbar { align-items: stretch; flex-direction: column; text-align: center; } .signed-calendar-grid { gap: 4px; } .signed-calendar-day { min-height: 56px; padding: 6px; } .map-container { min-height: 360px; } dl { grid-template-columns: 1fr; } } @media (max-width: 520px) { .app-shell { padding: 8px; } .topbar, .panel-header, .help-content, .detail-grid, .detail-summary-grid, .admin-status-grid, .admin-form, .help-editor-grid { padding-left: 12px; padding-right: 12px; } .chat-meta, .help-preview-header { flex-direction: column; align-items: flex-start; } .map-source-control { top: 10px; right: 10px; } }