:root { --page-bg: #; --content-bg: #; --accent: #; --accent-dark: #; --accent-light: #; --accent-text: #; --banner-drop: #; --table-head-drop: #; --content-text: #; --table-even: #; --table-odd: #; --sidebar-width: 250px; --nav-width: 226px; --sidebar-bg: #111827; --sidebar-bg-2: #0b1120; --sidebar-text: #cbd5e1; --sidebar-text-dim: #94a3b8; --sidebar-card-bg: rgba(255,255,255,0.05); --sidebar-card-strong-bg: rgba(255,255,255,0.09); --radius: 12px; --radius-sm: 8px; --card-border: rgba(15,23,42,0.07); --shadow-card: 0 1px 2px rgba(15,23,42,0.04), 0 10px 28px -14px rgba(15,23,42,0.16); } * { -webkit-font-smoothing: antialiased; } html, body { margin: 0; padding: 0; } body, font { font: 13px -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; color: #ffffff; } body { background: var(--page-bg); color: var(--content-text); } /* Outer shell: the sidebar (.header) is fixed, everything else lives in this column */ .container { width: auto; margin: 0 0 0 var(--sidebar-width); min-height: 100vh; text-align: left; background: var(--page-bg); box-shadow: none; border-radius: 0; overflow: visible; } /* The left-hand navigation rail. Same markup as before (title + link list), just presented as a fixed vertical sidebar instead of a top banner. */ .header { position: fixed; top: 0; left: 0; bottom: 0; width: var(--sidebar-width); background: linear-gradient(180deg, var(--sidebar-bg), var(--sidebar-bg-2)); color: var(--sidebar-text); font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; text-align: left; padding: 22px 16px 16px 16px; overflow-y: auto; z-index: 200; display: flex; flex-direction: column; box-sizing: border-box; } .header h1 { font-size: 1.15em; line-height: 1.3; color: #ffffff; text-shadow: none; text-align: left; margin: 0 0 4px 0; padding: 0; font-weight: 700; } .header > div[style*="font-size: 8px"] { float: none !important; text-align: left !important; color: var(--sidebar-text-dim) !important; font-size: 10.5px !important; padding: 0 !important; margin: 0 0 14px 0; } .header p { /* The historical pipe-separated link list. Collapsing the literal " | " separators to zero size turns it into a clean vertical nav without touching the markup that generates it. */ font-size: 0; margin: 6px 0; padding: 0; text-align: left !important; display: flex; flex-direction: column; gap: 2px; } .header p a, .header p a:link, .header p a:visited { display: block; font-size: 13px; font-weight: 500; color: var(--sidebar-text) !important; padding: 9px 10px; border-radius: 8px; transition: background 0.15s ease, color 0.15s ease; } .header p a:hover { background: rgba(255,255,255,0.08); color: #ffffff !important; } .header p a.active { background: var(--accent); color: var(--accent-text) !important; font-weight: 700; } .header p b { font-size: 11px; color: var(--sidebar-text-dim); display: block; margin: 10px 0 2px 2px; text-transform: uppercase; letter-spacing: 0.04em; } /* Second half of the sidebar: live status widgets (Modes/Network/Radio Info). Same dark surface as .header so the two columns read as one continuous rail, even though .nav scrolls with the page instead of staying fixed. */ /* Wraps .nav + .content so both stretch to the same height - without this, the dark .nav background only reached as far down as its own widgets and left a visible step where the fixed .header strip kept going but .nav stopped short. */ .dashboard-row { display: flex; align-items: stretch; } .nav { flex: none; display: flex; flex-direction: column; justify-content: center; box-sizing: border-box; margin: 0; padding: 20px 14px; width: var(--nav-width); background: linear-gradient(180deg, var(--sidebar-bg), var(--sidebar-bg-2)); font-weight: normal; } .nav table { width: 100%; margin: 0 0 16px 0; border-collapse: separate; border-spacing: 4px; table-layout: fixed; white-space: normal; } /* Section titles ("Modes Enabled", "Radio Info", "DMR Master"...) */ .nav table th[colspan] { background: transparent; color: var(--sidebar-text-dim); text-align: left; text-transform: uppercase; font-size: 10px; font-weight: 700; letter-spacing: 0.06em; padding: 12px 2px 6px 2px; border: none; } .nav table:first-child th[colspan] { padding-top: 0; } /* Field-label cells (Trx / Tx / Rx / RPT1 / DMR ID ...) */ .nav table th:not([colspan]) { background: var(--sidebar-card-bg); color: var(--sidebar-text-dim); text-align: left; font-size: 10.5px; font-weight: 700; letter-spacing: 0.02em; padding: 7px 8px; border: none; border-radius: var(--radius-sm); width: 30%; } /* Value / status cells. Anything with an inline background (status colour pills from showMode()/repeaterinfo.php) keeps that colour untouched - we only add shape. Explicit inline white backgrounds are swapped for a theme-matching dark surface so they don't glow against the sidebar. */ .nav table td { color: var(--sidebar-text); background: var(--sidebar-card-bg); font-size: 11px; font-weight: 600; padding: 7px 8px; border: none; border-radius: var(--radius-sm); text-overflow: ellipsis; overflow: hidden; } .nav table td[style*="fff"] { background: var(--sidebar-card-strong-bg) !important; color: var(--sidebar-text) !important; } .nav table tr:nth-child(even), .nav table tr:nth-child(odd) { background: transparent; } .nav table a { color: #ffffff; font-weight: 700; } .nav table a:hover { color: var(--accent-light); } .content { flex: 1 1 auto; min-width: 0; margin: 0 0 0 20px; padding: 24px 28px 28px 28px; color: var(--content-text); background: var(--page-bg); text-align: left; } .contentwide { padding: 24px 28px; color: var(--content-text); background: var(--page-bg); text-align: center; } .contentwide h2 { color: var(--content-text); font: 600 1.15em -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; text-align: left; padding: 0 0 10px 14px; margin: 32px 0 14px 0; border-left: 4px solid var(--accent); border-bottom: 1px solid rgba(0,0,0,0.08); } .contentwide h2:first-child { margin-top: 0; } .contentwide h3 { color: var(--content-text); font: 600 0.95em -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; text-align: left; margin: 20px 0 8px 2px; } .contentwide h3:first-of-type { margin-top: 4px; } /* Usage meter (RAM/disk bars on the SysInfo page) */ .meter { position: relative; width: 100%; max-width: 420px; height: 20px; background: var(--page-bg); border: 1px solid rgba(0,0,0,0.08); border-radius: 10px; overflow: hidden; } .meter-bar { height: 100%; background: linear-gradient(90deg, var(--accent-light), var(--accent)); } .meter-label { position: absolute; top: 0; left: 10px; line-height: 20px; font-size: 11.5px; font-weight: 600; color: var(--content-text); } /* Inline "Alert: ..." banners used across the dashboard (config warnings etc.) */ .alert-banner-table { margin: 0 0 16px 0 !important; width: 100% !important; } .alert-banner-table, .alert-banner-table tr { background: transparent !important; } .alert-cell { text-align: left !important; border-radius: 8px; padding: 12px 16px !important; font-weight: 500; border: 1px solid transparent; } .alert-warning { background: #fffbeb; color: #92400e; border-color: #fde68a; } .alert-danger { background: #fef2f2; color: #b91c1c; border-color: #fecaca; } .alert-warning a, .alert-danger a { color: inherit; text-decoration: underline; } .footer { background: transparent; text-decoration: none; color: #6b7280; font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; font-size: 10.5px; text-align: left; padding: 16px 28px 24px 28px; border-top: 1px solid rgba(0,0,0,0.07); clear: both; } .footer a { color: var(--accent) !important; } /* Modern settings form: replaces the old table-based "Setting | Value" rows. .settings-card wraps a section's fields; .field-row is one label+control pair. */ .settings-card { background: var(--content-bg); border: 1px solid rgba(0,0,0,0.08); border-radius: 12px; box-shadow: 0 1px 3px rgba(0,0,0,0.04); padding: 4px 20px; margin: 0 0 28px 0; text-align: left; } /* Legacy fragments open with a bare Title before their content - give it the same accent-dot heading treatment as the dashboard cards, wherever it shows up, without having to touch every include site. */ .settings-card > b:first-child { display: flex; align-items: center; gap: 9px; font-size: 15px; font-weight: 700; color: var(--content-text); margin: 16px 0 14px 0; padding-bottom: 12px; border-bottom: 1px solid var(--card-border); } .settings-card > b:first-child::before { content: ""; width: 9px; height: 9px; border-radius: 3px; background: var(--accent); flex: none; } .field-row { display: flex; align-items: center; flex-wrap: wrap; column-gap: 24px; row-gap: 6px; padding: 13px 0; border-bottom: 1px solid rgba(0,0,0,0.06); } .field-row:last-child { border-bottom: none; } .field-label { flex: 0 0 260px; max-width: 260px; font-weight: 500; font-size: 13px; color: var(--content-text); text-align: left; } .field-control { flex: 1 1 320px; text-align: left; color: var(--content-text); font-size: 13px; } .field-control input[type="text"], .field-control input[type="password"], .field-control input[type="number"] { padding: 5px 8px; border: 1px solid rgba(0,0,0,0.18); } .field-control select { padding: 4px 6px; border: 1px solid rgba(0,0,0,0.18); } .field-actions { display: flex; justify-content: center; align-items: center; padding: 20px 0 24px 0; } .field-actions input[type="button"], .field-actions input[type="submit"] { background: var(--accent); color: var(--accent-text); border: none; padding: 12px 48px; font-size: 14px; font-weight: 700; letter-spacing: 0.02em; border-radius: 999px; box-shadow: 0 2px 6px rgba(15,23,42,0.16), 0 8px 20px -8px rgba(15,23,42,0.28); cursor: pointer; transition: filter 0.15s ease, box-shadow 0.15s ease, transform 0.1s ease; } .field-actions input[type="button"]:hover, .field-actions input[type="submit"]:hover { filter: brightness(1.08); box-shadow: 0 4px 10px rgba(15,23,42,0.2), 0 10px 24px -8px rgba(15,23,42,0.32); transform: translateY(-1px); } .field-actions input[type="button"]:active, .field-actions input[type="submit"]:active { transform: translateY(0); filter: brightness(0.97); } .field-note { font-weight: 400; font-size: 12.5px; color: #6b7280; flex: 1 1 100% !important; max-width: none !important; } /* Big icon action buttons (power page, reboot/shutdown) */ .action-tiles { display: flex; gap: 16px; padding: 20px; } .action-tile { flex: 1 1 0; display: flex; flex-direction: column; align-items: center; gap: 10px; padding: 24px 16px; background: var(--page-bg); border: 1px solid rgba(0,0,0,0.08); border-radius: 10px; cursor: pointer; font: 500 14px -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; color: var(--content-text); transition: border-color 0.15s ease, box-shadow 0.15s ease, transform 0.1s ease; } .action-tile:hover { border-color: var(--accent); box-shadow: 0 4px 12px rgba(0,0,0,0.08); transform: translateY(-1px); } .action-tile img { width: 48px; height: 48px; } .action-tile-upload { cursor: default; } .action-tile-upload input[type="file"] { max-width: 100%; font-size: 12px; } .action-tile-upload button { margin-top: 4px; } /* Calibration tool control panels */ .cal-grid { display: flex; flex-wrap: wrap; gap: 16px; align-items: flex-start; } .cal-panel { flex: 1 1 220px; margin: 0; } .cal-panel h3 { margin-top: 0; } .cal-panel table { width: 100%; } .cal-btn-row { display: flex; align-items: center; gap: 10px; padding: 6px 0; } /* Raw config-file editors (expert "Full Edit" pages) */ .raw-editor { width: 100%; min-height: 480px; box-sizing: border-box; background: #10141a; color: #d1d5db; border: 1px solid rgba(0,0,0,0.15); border-radius: 8px; padding: 12px; font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace; font-size: 12.5px; line-height: 1.5; } .power-status { background: #10141a; color: #3ce87a; border-radius: 8px; padding: 20px; font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace; line-height: 1.7; } /* Positional fallback for field-rows whose cells weren't given explicit .field-label/.field-control classes (converted straight from table rows): first direct child reads as the label, the rest as the control area. */ .field-row > div:first-child { flex: 0 0 260px; max-width: 260px; font-weight: 500; font-size: 13px; text-align: left; } .field-row > div:not(:first-child) { flex: 1 1 280px; text-align: left; font-size: 13px; } .field-row input[type="text"], .field-row input[type="password"], .field-row input[type="number"] { padding: 5px 8px; border: 1px solid rgba(0,0,0,0.18); } .field-row select { padding: 4px 6px; border: 1px solid rgba(0,0,0,0.18); } @media (max-width: 780px) { .field-row { flex-direction: column; align-items: flex-start; } .field-label, .field-row > div:first-child { flex: 0 0 auto; max-width: none; } } #tail { height: 450px; width: 100%; max-width: 805px; overflow-y: scroll; overflow-x: scroll; color: #3ce87a; background: #10141a; border-radius: 8px; font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace; box-sizing: border-box; } #tail::-webkit-scrollbar { width: 10px; height: 10px; } #tail::-webkit-scrollbar-track { background: #10141a; } #tail::-webkit-scrollbar-thumb { background: rgba(60, 232, 122, 0.35); border-radius: 6px; } /* Dashboard widget panels: the Gateway/Local RF Activity tables (and the POCSAG Pages list) get promoted from bare Title+
| get .al instead of the whole table, or their headers would drift the opposite way. */ table.log-table th { text-align: left; } th.al { text-align: left; } table tr:nth-child(even) { background: var(--table-even); } table tr:nth-child(odd) { background: var(--table-odd); } table td { color: var(--content-text); font-family: "SFMono-Regular", Consolas, "Liberation Mono", Menlo, monospace; text-decoration: none; padding: 8px 12px; border: none; border-bottom: 1px solid var(--card-border); } table tr:last-child td { border-bottom: none; } .content table tr:hover td, .contentwide table tr:hover td { background: rgba(15,23,42,0.045); } a { text-decoration:none; } a:link, a:visited { text-decoration: none; color: var(--accent); font-weight: normal; transition: color 0.15s ease; } a:hover { color: var(--accent-dark); text-decoration: underline; } a.tooltip, a.tooltip:link, a.tooltip:visited, a.tooltip:active { text-decoration: none; position: relative; color: var(--content-text); } a.tooltip:hover { text-shadow: none; text-decoration: none; color: var(--content-text); background: transparent; } a.tooltip span { text-shadow: none; text-decoration: none; display: none; } a.tooltip:hover span { text-shadow: none; text-decoration: none; display: block; position: absolute; top: 20px; left: 0; z-index: 100; color: #000000; border: none; border-radius: 6px; box-shadow: 0 4px 16px rgba(0,0,0,0.25); background: #f7f7f7; font: 12px -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; text-align: left; white-space: nowrap; overflow: hidden; } th:last-child a.tooltip:hover span { left: auto; right: 0; } a.tooltip span b { text-shadow: none; text-decoration: none; display: block; color: #000000; margin: 0; padding: 4px 8px; font-size: 12px; font-weight: bold; border: 0px; border-bottom: 1px solid rgba(0,0,0,0.15); background: #e2e2e2; } a.tooltip2, a.tooltip2:link, a.tooltip2:visited, a.tooltip2:active { text-shadow: none; text-decoration: none; position: relative; font-weight: bold; color: #000000; } a.tooltip2:hover { text-shadow: none; text-decoration: none; color: #000000; background: transparent; } a.tooltip2 span { text-shadow: none; text-decoration: none; display: none; } a.tooltip2:hover span { text-shadow: none; text-decoration: none; display: block; position: absolute; top: 20px; left: 0; width: 202px; z-index: 100; color: #000000; border: none; border-radius: 6px; box-shadow: 0 4px 16px rgba(0,0,0,0.25); background: #f7f7f7; font: 12px -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; text-align: left; white-space: normal; overflow: hidden; } a.tooltip2 span b { text-shadow: none; text-decoration: none; display: block; color: #000000; margin: 0; padding: 4px 8px; font-size: 12px; font-weight: bold; border: 0px; border-bottom: 1px solid rgba(0,0,0,0.15); background: #e2e2e2; } ul { padding: 5px; margin: 10px 0; list-style: none; float: left; } ul li { float: left; display: inline; /*For ignore double margin in IE6*/ margin: 0 10px; } ul li a { text-decoration: none; float:left; color: #999; cursor: pointer; font: 900 14px/22px -apple-system, BlinkMacSystemFont, "Segoe UI", Helvetica, Arial, sans-serif; transition: color 0.15s ease; } ul li a span { margin: 0 10px 0 -10px; padding: 1px 8px 5px 18px; position: relative; /*To fix IE6 problem (not displaying)*/ float:left; } ul.mmenu li a.current, ul.mmenu li a:hover { background: url(/images/buttonbg.png) no-repeat top right; color: #0d5f83; } ul.mmenu li a.current span, ul.mmenu li a:hover span { background: url(/images/buttonbg.png) no-repeat top left; } h1 { text-shadow: 1px 1px 2px rgba(0,0,0,0.35); text-align: center; } /* CSS Toggle Code here */ .toggle { position: absolute; margin-left: -9999px; visibility: hidden; } .toggle + label { display: block; position: relative; cursor: pointer; outline: none; } input.toggle-round-flat + label { padding: 1px; width: 33px; height: 18px; background-color: #dddddd; border-radius: 10px; transition: background 0.4s; } input.toggle-round-flat + label:before, input.toggle-round-flat + label:after { display: block; position: absolute; content: ""; } input.toggle-round-flat + label:before { top: 1px; left: 1px; bottom: 1px; right: 1px; background-color: #fff; border-radius: 10px; transition: background 0.4s; } input.toggle-round-flat + label:after { top: 2px; left: 2px; bottom: 2px; width: 16px; background-color: #dddddd; border-radius: 12px; transition: margin 0.4s, background 0.4s; } input.toggle-round-flat:checked + label { background-color: var(--accent); } input.toggle-round-flat:checked + label:after { margin-left: 14px; background-color: var(--accent); } /* Gentle, geometry-neutral polish for form controls (no size/layout changes) */ input[type="text"], input[type="password"], input[type="number"], input[type="email"], select, textarea { border-radius: 4px; transition: box-shadow 0.15s ease, border-color 0.15s ease; } input[type="text"]:focus, input[type="password"]:focus, input[type="number"]:focus, input[type="email"]:focus, select:focus, textarea:focus { outline: none; box-shadow: 0 0 0 3px rgba(79,70,229,0.18); border-color: var(--accent); } input[type="submit"], input[type="button"], button { cursor: pointer; border-radius: 4px; transition: filter 0.15s ease, box-shadow 0.15s ease; } input[type="submit"]:hover, input[type="button"]:hover, button:hover { filter: brightness(1.06); box-shadow: 0 1px 6px rgba(0,0,0,0.25); } /* Tame Firefox Buttons */ @-moz-document url-prefix() { select, input { margin : 0; padding : 0; border-width : 1px; font : 12px -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif; } input[type="button"], button, input[type="submit"] { padding : 0px 3px 0px 3px; border-radius : 3px 3px 3px 3px; -moz-border-radius : 3px 3px 3px 3px; } } /* nice-select dropdowns */ .nice-select.small, .nice-select-dropdown li.option { height: 24px !important; min-height: 24px !important; line-height: 24px !important; } .nice-select.small ul li:nth-of-type(2) { clear: both; } /* Collapse the fixed sidebar into a top bar on narrow viewports */ @media (max-width: 780px) { .header { position: static; width: auto; height: auto; flex-direction: row; flex-wrap: wrap; align-items: center; } .header p { flex-direction: row; flex-wrap: wrap; } .container { margin-left: 0; } .dashboard-row { flex-direction: column; } .nav { width: auto; } .content { margin-left: 0; } } /* Aria CSS Here [role="checkbox"] { padding:5px; } [aria-checked="true"]::before { content: "[x]"; } [aria-checked="false"]::before { content: "[ ]"; } */ |
|---|