- 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:
@@ -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;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user