Phase 5c: CSS layers and light theme
continuous-integration/drone/push Build is failing

- html/css split into tokens.css (custom properties), base.css (reset,
  typography, focus, skip link), components.css (buttons, inputs, tables,
  status cards, popups, menu, log lines) and layout.css (shell, sidebar,
  header, breakpoints); screen.css removed. Selectors and declarations
  moved as-is; three pairs of conflicting rules resolved in favour of the
  one that already won the cascade, two empty rules dropped.
- Every literal colour outside tokens.css is now a token (category badge
  borders excepted). color-scheme set so native controls follow.
- Light theme under prefers-color-scheme: light, with explicit
  data-theme="light"/"dark" overrides on :root for a future toggle.
  Body text 13.6:1, muted text 5.4:1, accent 5.1:1 on the light background.
- HTML: lang="en" everywhere, one h1 per page, maintenance page uses
  <main>, an id typo fixed.
This commit is contained in:
2026-09-26 13:34:51 +10:00
parent 0b7a54d7da
commit 3532679235
15 changed files with 1275 additions and 932 deletions
+665
View File
@@ -0,0 +1,665 @@
/*
* layout.css - shell layout (sidebar, header, content wrapper), the auth /
* wizard box pages and every responsive breakpoint. Loaded last.
*/
/* Application shell */
#layout {
display: grid;
grid-template-columns: 290px minmax(0, 1fr);
gap: 16px;
min-height: 100vh;
padding: 16px;
}
#layout-overlay {
display: none;
}
.layout-left {
min-width: 0;
border-radius: var(--radius-l);
border: 1px solid var(--line);
background:
linear-gradient(180deg, var(--panel-top) 0%, var(--panel-bottom) 100%),
radial-gradient(circle at 20% 0%, var(--panel-glow), transparent 48%);
box-shadow: var(--shadow-2);
overflow: hidden;
}
#menu-wrapper {
display: flex;
flex-direction: column;
height: 100%;
padding: 14px;
}
#logo {
width: 100%;
height: 76px;
border-radius: 12px;
border: 1px solid var(--line-soft);
background:
linear-gradient(180deg, var(--logo-tint-top), var(--logo-tint-bottom)),
url("../img/logo_w_600x200.png") center no-repeat;
background-size: contain;
margin-bottom: 12px;
}
.layout-right {
min-width: 0;
border-radius: var(--radius-l);
border: 1px solid var(--line);
background:
linear-gradient(180deg, var(--panel-top) 0%, var(--panel-bottom) 100%),
radial-gradient(circle at 100% 0%, var(--panel-glow), transparent 34%);
box-shadow: var(--shadow-2);
display: flex;
flex-direction: column;
overflow: hidden;
}
#shell-header {
display: flex;
align-items: center;
gap: 12px;
padding: 12px 14px;
border-bottom: 1px solid var(--line-soft);
background: var(--surface-0);
}
#shell-title {
margin: 0;
font-size: 1.08rem;
font-weight: 700;
color: var(--text-heading);
letter-spacing: 0.04em;
}
#menu-toggle {
display: none;
min-width: 72px;
padding: 8px 14px;
margin: 0;
font-size: 12px;
}
/* Content wrapper */
#content {
display: block;
overflow: auto;
padding: 12px;
}
#content h3 {
margin-bottom: 6px;
color: var(--text-heading);
}
#content-interaction {
margin: 0 0 12px;
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
position: relative;
}
#content-interaction .search {
width: min(260px, 100%);
margin-left: auto;
}
.mobile-only-control {
display: none;
}
/* Login, first-user, wizard and maintenance box */
#box {
width: min(680px, calc(100% - 24px));
margin: 14px auto;
border-radius: var(--radius-l);
border: 1px solid var(--line);
background: linear-gradient(180deg, var(--panel-top) 0%, var(--panel-bottom) 100%);
box-shadow: var(--shadow-2);
min-height: 430px;
display: flex;
flex-direction: column;
}
#header,
#header_config {
width: min(680px, calc(100% - 24px));
height: 84px;
margin: 24px auto 10px;
border-radius: 12px;
border: 1px solid var(--line);
background:
linear-gradient(180deg, var(--logo-tint-top), var(--logo-tint-bottom)),
url("../img/logo_w_600x200.png") center no-repeat;
background-size: 300px auto;
}
#headline {
border-bottom: 1px solid var(--line);
background: var(--surface-0);
padding: 14px;
}
#box #content {
padding: 14px;
}
#box p {
padding: 0;
}
#box-footer {
margin-top: auto;
padding: 8px 14px 16px;
display: flex;
justify-content: flex-end;
}
#box input[type=text],
#box input[type=password],
#box select {
width: 100%;
}
#box input[type=submit],
#box input[type=button] {
min-width: 120px;
}
.auth-screen {
display: flex;
flex-direction: column;
min-height: 100vh;
}
.auth-screen #clientInfo {
margin: 0;
}
.phone {
display: table-cell;
}
/* Breakpoints */
@media only screen and (max-width: 1300px) {
.dashboard-cards {
grid-template-columns: repeat(3, minmax(130px, 1fr));
}
#clientInfo {
border-spacing: 5px;
}
}
@media only screen and (max-width: 1024px) {
#layout {
grid-template-columns: 260px minmax(0, 1fr);
gap: 12px;
padding: 12px;
}
#shell-title {
font-size: 1rem;
}
#clientInfo .tdKey,
#clientInfo .tdVal {
font-size: 10px;
padding: 6px;
}
#content-interaction {
gap: 7px;
}
}
@media only screen and (max-width: 900px) {
#layout {
grid-template-columns: 1fr;
padding-top: max(10px, env(safe-area-inset-top));
}
#layout-overlay {
display: block;
position: fixed;
inset: 0;
z-index: 1000;
pointer-events: none;
background: var(--overlay-soft);
opacity: 0;
transition: opacity 0.2s ease;
}
body.menu-open #layout-overlay {
opacity: 1;
pointer-events: auto;
}
.layout-left {
position: fixed;
left: 0;
top: 0;
bottom: 0;
width: min(320px, calc(100vw - 34px));
max-width: none;
z-index: 1100;
transform: translateX(-116%);
transition: transform 0.25s ease;
border-radius: 0 16px 16px 0;
border-left: 0;
}
body.menu-open .layout-left {
transform: translateX(0);
}
#main-menu li {
min-height: 48px;
padding: 10px 12px;
}
#main-menu li p {
font-size: 13px;
}
.layout-right {
min-height: calc(100vh - 24px);
}
#shell-header {
position: sticky;
top: 0;
z-index: 8;
backdrop-filter: blur(8px);
}
#menu-toggle {
display: inline-flex;
align-items: center;
justify-content: center;
min-height: 42px;
min-width: 92px;
font-size: 13px;
}
#clientInfo,
.dashboard-cards {
padding-left: 10px;
padding-right: 10px;
}
#content {
padding: 10px;
padding-bottom: calc(14px + env(safe-area-inset-bottom));
}
#content-interaction {
position: sticky;
top: 10px;
z-index: 6;
margin-bottom: 10px;
padding: 8px;
border: 1px solid var(--line-soft);
border-radius: 12px;
background: var(--surface-solid);
backdrop-filter: blur(6px);
}
#content-interaction input[type=button],
#content-interaction select {
min-height: 42px;
}
#allStreams {
grid-template-columns: 1fr;
}
#activeStreams,
#inactiveStreams {
max-height: 96px;
}
body.menu-log-focus #clientInfo,
body.menu-log-focus .dashboard-cards,
body.menu-log-focus #myStreamsBox {
display: none;
}
body.menu-log-focus #content {
padding: 8px;
padding-bottom: calc(12px + env(safe-area-inset-bottom));
}
body.menu-log-focus #content h3 {
margin-bottom: 4px;
}
body.menu-log-focus #content-interaction {
top: 8px;
margin-bottom: 8px;
padding: 6px;
}
body.menu-log-focus #content-interaction .search {
display: none;
}
body.menu-log-focus #content-interaction input[type=button] {
min-height: 38px;
}
body.menu-log-focus #content_log {
padding: 5px;
}
body.menu-log-focus #content_log pre {
margin-bottom: 4px;
padding: 7px;
font-size: 11px;
}
.phone {
display: none;
}
}
@media only screen and (max-width: 760px) {
#shell-header {
padding: 10px 10px;
}
#clientInfo {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 8px;
border-spacing: 0;
white-space: normal;
background: var(--surface-0);
}
#clientInfo tr {
display: contents;
}
#clientInfo .tdKey {
display: none;
}
#clientInfo .tdVal {
font-size: 12px;
min-height: 54px;
display: flex;
flex-direction: column;
align-items: flex-start;
justify-content: center;
gap: 4px;
padding: 10px 9px;
background: var(--surface-2);
}
#clientInfo .tdVal::before {
content: attr(data-label);
color: var(--text-soft);
font-size: 9px;
letter-spacing: 0.07em;
text-transform: uppercase;
font-family: var(--font-sans);
line-height: 1.2;
}
.dashboard-cards {
grid-template-columns: repeat(3, minmax(0, 1fr));
}
#content_table {
display: block;
}
#content_table .content_table_header {
display: none;
}
#content_table tbody,
#content_table tr,
#content_table td {
display: block;
width: 100%;
}
#content_table tr {
border: 1px solid var(--line-soft);
border-left-width: 3px;
border-radius: 12px;
margin-bottom: 10px;
padding: 6px;
background: var(--surface-3);
}
#content_table td {
border: 0;
border-radius: 10px;
margin: 4px 0;
padding: 7px 8px;
display: grid;
grid-template-columns: minmax(92px, 36%) 1fr;
align-items: center;
gap: 8px;
background: var(--surface-2);
}
#content_table td::before {
content: attr(data-label);
color: var(--text-soft);
font-size: 10px;
letter-spacing: 0.06em;
text-transform: uppercase;
}
#content_table td[data-cell-type="checkbox"],
#content_table td[data-cell-type="image"],
#content_table td[data-cell-type="action"] {
grid-template-columns: 1fr;
justify-items: start;
}
#content_table td[data-cell-type="checkbox"]::before,
#content_table td[data-cell-type="image"]::before,
#content_table td[data-cell-type="action"]::before {
margin-bottom: 4px;
}
#content_table td[data-cell-type="image"] img {
margin-left: 0;
}
#content_table input[type=text] {
min-width: 0;
max-width: none;
width: 100%;
min-height: 40px;
}
#content_table input[type=checkbox] {
width: 24px;
height: 24px;
}
#content_table .mapping-edit-button {
min-height: 38px;
width: 100%;
}
.mobile-only-control {
display: block;
width: 100%;
}
}
@media only screen and (max-width: 620px) {
#layout {
padding: 8px;
gap: 8px;
}
.layout-right {
border-radius: 14px;
}
#shell-header {
flex-wrap: wrap;
gap: 8px;
}
#shell-title {
flex: 1 1 auto;
font-size: 0.95rem;
}
#connection-indicator {
margin-left: 0;
}
#clientInfo {
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 6px;
padding-left: 8px;
padding-right: 8px;
}
.dashboard-cards {
grid-template-columns: repeat(2, minmax(0, 1fr));
}
#content-interaction {
flex-direction: column;
align-items: stretch;
}
#content-interaction .search {
width: 100%;
margin-left: 0;
}
#content-interaction input[type=button] {
width: 100%;
margin-right: 0;
min-height: 44px;
}
#box {
width: calc(100% - 14px);
min-height: 0;
margin-top: 8px;
}
#header,
#header_config {
width: calc(100% - 14px);
margin-top: 12px;
}
#box-footer {
flex-direction: column;
align-items: stretch;
}
#box-footer input[type=button],
#box-footer input[type=submit] {
width: 100%;
margin-right: 0;
}
}
@media only screen and (max-width: 619px) {
h1 {
font-size: 1.46rem;
}
#popup {
padding: 0;
}
#popup-custom,
#mapping-detail,
#user-detail,
#file-detail {
max-width: none;
width: 100%;
height: 100%;
max-height: 100%;
border-radius: 0;
border: 0;
padding: 10px 10px calc(14px + env(safe-area-inset-bottom));
}
#popup-custom table {
border-spacing: 0 10px;
}
#popup-custom tr {
display: block;
border: 1px solid var(--line-soft);
border-radius: 10px;
padding: 8px 8px 10px;
background: var(--surface-2);
}
#popup-custom td {
display: block;
width: 100%;
padding: 4px 2px;
}
#popup-custom td.left {
width: 100%;
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.06em;
}
#popup-interaction {
position: sticky;
bottom: 0;
z-index: 5;
margin-top: 10px;
padding-top: 10px;
background: linear-gradient(180deg, var(--sticky-fade-from) 0%, var(--sticky-fade-to) 30%);
}
.interaction,
#interaction {
justify-content: stretch;
}
.interaction input[type=button],
.interaction input[type=submit],
#popup-interaction input[type=button] {
width: 100%;
min-height: 44px;
}
.popup-title h3 {
font-size: 1.02rem;
}
.popup-close {
min-width: 44px;
min-height: 44px;
}
}
@media only screen and (max-width: 430px) {
#clientInfo {
grid-template-columns: 1fr;
}
}