mirror of
https://github.com/gesellix/Bose-SoundTouch.git
synced 2026-08-22 18:46:17 +00:00
547 lines
15 KiB
CSS
547 lines
15 KiB
CSS
:root {
|
|
/* Color Palette - Bose Inspired */
|
|
--color-primary: #000000;
|
|
--color-secondary: #666666;
|
|
--color-accent: #2196F3;
|
|
--color-accent-hover: #0d47a1;
|
|
--color-danger: #f44336;
|
|
--color-danger-hover: #d32f2f;
|
|
--color-success: #2e7d32;
|
|
--color-success-bg: #e8f5e9;
|
|
--color-warning: #fbc02d;
|
|
--color-warning-bg: #fffde7;
|
|
--color-info-bg: #e3f2fd;
|
|
--color-border: #dddddd;
|
|
--color-bg-light: #f9f9f9;
|
|
--color-text: #333333;
|
|
--color-text-muted: #666666;
|
|
--color-white: #ffffff;
|
|
|
|
/* Spacing */
|
|
--spacing-xs: 4px;
|
|
--spacing-sm: 8px;
|
|
--spacing-md: 16px;
|
|
--spacing-lg: 24px;
|
|
--spacing-xl: 32px;
|
|
|
|
/* Typography */
|
|
--font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Helvetica, Arial, sans-serif;
|
|
--font-size-base: 16px;
|
|
--font-size-sm: 14px;
|
|
--font-size-xs: 12px;
|
|
--font-size-lg: 18px;
|
|
--font-size-xl: 24px;
|
|
}
|
|
|
|
body {
|
|
font-family: var(--font-family);
|
|
line-height: 1.6;
|
|
color: var(--color-text);
|
|
margin: var(--spacing-lg);
|
|
background-color: var(--color-white);
|
|
}
|
|
|
|
h1, h2, h3, h4 {
|
|
color: var(--color-primary);
|
|
margin-bottom: var(--spacing-md);
|
|
}
|
|
|
|
.subtitle {
|
|
margin-top: calc(-1 * var(--spacing-sm));
|
|
font-style: italic;
|
|
color: var(--color-text-muted);
|
|
}
|
|
|
|
table { border-collapse: collapse; width: 100%; margin-bottom: var(--spacing-md); }
|
|
th, td { border: 1px solid var(--color-border); padding: var(--spacing-sm); text-align: left; }
|
|
th { background-color: var(--color-bg-light); font-weight: 600; }
|
|
button {
|
|
padding: var(--spacing-sm) var(--spacing-md);
|
|
cursor: pointer;
|
|
border: 1px solid var(--color-border);
|
|
border-radius: var(--spacing-xs);
|
|
background-color: var(--color-bg-light);
|
|
font-family: inherit;
|
|
transition: background-color 0.2s;
|
|
}
|
|
button:hover {
|
|
background-color: var(--color-border);
|
|
}
|
|
.status { margin-top: var(--spacing-md); padding: var(--spacing-md); border: 1px solid var(--color-border); display: none; border-radius: var(--radius-sm); }
|
|
.status.visible { display: block; }
|
|
.status-info { background-color: var(--color-info-bg); border-color: var(--color-accent); }
|
|
.status-success { background-color: var(--color-success-bg); border-color: var(--color-success); }
|
|
.status-error { background-color: #ffeef0; border-color: var(--color-danger); color: var(--color-danger); }
|
|
|
|
.hidden { display: none !important; }
|
|
.visible { display: block !important; }
|
|
.flex-visible { display: flex !important; }
|
|
|
|
.btn-loading { opacity: 0.7; cursor: not-allowed; }
|
|
.btn-success { background-color: var(--color-success) !important; color: white !important; border-color: var(--color-success) !important; }
|
|
.btn-error { background-color: var(--color-danger) !important; color: white !important; border-color: var(--color-danger) !important; }
|
|
|
|
.status-inline { display: inline-block !important; font-size: var(--font-size-xs); margin-left: var(--spacing-sm); }
|
|
.status-inline.status-info { color: var(--color-text-muted); }
|
|
.status-inline.status-success { color: var(--color-success); }
|
|
.status-inline.status-error { color: var(--color-danger); }
|
|
|
|
.summary-box { margin-top: var(--spacing-lg); padding: var(--spacing-md); border: 1px solid var(--color-border); background-color: var(--color-bg-light); border-radius: var(--spacing-xs); }
|
|
pre { background-color: #eee; padding: var(--spacing-md); overflow-x: auto; font-size: var(--font-size-xs); border-radius: var(--spacing-xs); }
|
|
|
|
.form-group {
|
|
margin-bottom: var(--spacing-md);
|
|
}
|
|
.form-group label {
|
|
display: block;
|
|
margin-bottom: var(--spacing-xs);
|
|
font-weight: 600;
|
|
}
|
|
.form-group input[type="text"],
|
|
.form-group input[type="password"],
|
|
.form-group textarea,
|
|
.form-group select {
|
|
width: 100%;
|
|
max-width: 400px;
|
|
padding: var(--spacing-sm);
|
|
border: 1px solid var(--color-border);
|
|
border-radius: var(--spacing-xs);
|
|
font-family: inherit;
|
|
}
|
|
.form-group textarea {
|
|
max-width: 600px;
|
|
font-family: monospace;
|
|
}
|
|
.form-group label.checkbox-label {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: var(--spacing-sm);
|
|
font-weight: normal;
|
|
margin-bottom: var(--spacing-xs);
|
|
}
|
|
.form-group .help-text {
|
|
display: block;
|
|
font-size: var(--font-size-xs);
|
|
color: var(--color-text-muted);
|
|
margin-top: var(--spacing-xs);
|
|
}
|
|
.form-inline {
|
|
display: flex;
|
|
align-items: center;
|
|
gap: var(--spacing-md);
|
|
flex-wrap: wrap;
|
|
}
|
|
.form-inline label {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.diff-container { display: flex; gap: 10px; }
|
|
.diff-pane pre {
|
|
background: var(--color-bg-light);
|
|
border: 1px solid var(--color-border);
|
|
padding: var(--spacing-sm);
|
|
font-size: var(--font-size-xs);
|
|
overflow-x: auto;
|
|
white-space: pre-wrap;
|
|
word-break: break-all;
|
|
border-radius: var(--spacing-xs);
|
|
}
|
|
|
|
.diff-container-columns {
|
|
display: grid;
|
|
grid-template-columns: 1fr 1fr;
|
|
gap: var(--spacing-md);
|
|
}
|
|
|
|
.diff-added {
|
|
background-color: #e6ffed !important;
|
|
text-decoration: none;
|
|
}
|
|
|
|
.diff-removed {
|
|
background-color: #ffeef0 !important;
|
|
text-decoration: line-through;
|
|
}
|
|
.list-compact {
|
|
margin-top: var(--spacing-xs);
|
|
margin-bottom: var(--spacing-xs);
|
|
}
|
|
.list-indented {
|
|
padding-left: var(--spacing-lg);
|
|
}
|
|
|
|
.col-counter { color: var(--color-text-muted); width: 40px; }
|
|
.col-timestamp { font-size: var(--font-size-xs); white-space: nowrap; width: 140px; }
|
|
.col-method code { font-weight: 600; color: var(--color-accent); }
|
|
.col-status .badge { display: inline-block; min-width: 40px; text-align: center; }
|
|
|
|
.mb-sm { margin-bottom: var(--spacing-sm); }
|
|
.mt-sm { margin-top: var(--spacing-sm); }
|
|
.mb-lg { margin-bottom: var(--spacing-lg); }
|
|
.mt-lg { margin-top: var(--spacing-lg); }
|
|
.ml-lg { margin-left: var(--spacing-lg); }
|
|
|
|
.w-100 { width: 100px; }
|
|
.w-200 { width: 200px; }
|
|
.w-250 { width: 250px; }
|
|
.w-auto { width: auto; }
|
|
|
|
.fw-bold { font-weight: bold; }
|
|
|
|
.bg-spotify { background: #1db954 !important; color: white !important; border: none !important; }
|
|
|
|
.col-data { font-size: 0.85em; font-family: monospace; max-width: 400px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
|
.col-hostname { font-weight: bold; }
|
|
.col-remote-addr { font-size: 0.8em; color: var(--color-text-muted); }
|
|
.col-bose { text-align: center; }
|
|
|
|
.config-header { display: inline-block; padding: 2px 8px; border-radius: 4px; font-weight: bold; margin-bottom: 4px; }
|
|
.config-header-local { background: var(--color-info-bg); color: var(--color-accent); }
|
|
.config-header-upstream { background: var(--color-warning-bg); color: var(--color-warning); }
|
|
|
|
footer { margin-top: var(--spacing-xl); padding: var(--spacing-lg); border-top: 1px solid var(--color-border); color: var(--color-text-muted); font-size: var(--font-size-xs); text-align: center; }
|
|
|
|
.p-sm { padding: var(--spacing-sm); }
|
|
.font-size-sm { font-size: var(--font-size-sm); }
|
|
|
|
.max-h-200 { max-height: 200px; }
|
|
.max-h-400 { max-height: 400px; }
|
|
.max-h-500 { max-height: 500px; }
|
|
|
|
.text-center { text-align: center; }
|
|
|
|
.badge-spotify { background: #1db954 !important; color: white !important; border: none !important; cursor: pointer; }
|
|
|
|
.border-p { border: 1px solid var(--color-border); padding: var(--spacing-sm); border-radius: var(--spacing-xs); }
|
|
.items-start { align-items: flex-start; }
|
|
.flex-1 { flex: 1; }
|
|
.flex-2 { flex: 2; }
|
|
.pr-md { padding-right: var(--spacing-md); }
|
|
.border-right { border-right: 1px solid var(--color-border); }
|
|
|
|
.m-0 { margin: 0; }
|
|
.flex-grow { flex-grow: 1; }
|
|
|
|
.fw-normal { font-weight: normal; }
|
|
|
|
.bg-light { background: var(--color-bg-light) !important; }
|
|
|
|
/* Tabs */
|
|
.tabs { margin-top: var(--spacing-lg); }
|
|
.tab-buttons { display: flex; border-bottom: 1px solid var(--color-border); margin-bottom: var(--spacing-lg); overflow-x: auto; }
|
|
.tab-btn {
|
|
background: var(--color-bg-light);
|
|
border: 1px solid var(--color-border);
|
|
border-bottom: none;
|
|
padding: var(--spacing-sm) var(--spacing-md);
|
|
margin-right: var(--spacing-xs);
|
|
border-top-left-radius: var(--spacing-xs);
|
|
border-top-right-radius: var(--spacing-xs);
|
|
white-space: nowrap;
|
|
}
|
|
.tab-btn:hover { background: var(--color-border); }
|
|
.tab-btn.active {
|
|
background: var(--color-white);
|
|
border-bottom: 2px solid var(--color-accent);
|
|
font-weight: bold;
|
|
}
|
|
.tab-content { display: none; padding: var(--spacing-sm); }
|
|
.tab-content.active { display: block; }
|
|
|
|
.device-selection {
|
|
margin-bottom: var(--spacing-lg);
|
|
padding: var(--spacing-md);
|
|
background-color: var(--color-info-bg);
|
|
border-radius: var(--spacing-xs);
|
|
border: 1px solid var(--color-accent);
|
|
}
|
|
.device-selection label {
|
|
font-weight: bold;
|
|
margin-right: var(--spacing-sm);
|
|
}
|
|
.device-selection select {
|
|
padding: var(--spacing-sm);
|
|
min-width: 250px;
|
|
border-radius: var(--spacing-xs);
|
|
border: 1px solid var(--color-border);
|
|
}
|
|
|
|
/* Guide & Overview styles */
|
|
.guide-steps li {
|
|
margin-bottom: var(--spacing-md);
|
|
line-height: 1.6;
|
|
}
|
|
.guide-steps strong {
|
|
color: var(--color-accent);
|
|
font-size: 1.1em;
|
|
}
|
|
.info-box {
|
|
padding: var(--spacing-md);
|
|
margin-bottom: var(--spacing-lg);
|
|
border-radius: var(--spacing-xs);
|
|
}
|
|
.prerequisite-box {
|
|
background-color: var(--color-warning-bg);
|
|
border-left: 4px solid var(--color-warning);
|
|
}
|
|
.safety-box {
|
|
background-color: var(--color-info-bg);
|
|
border-left: 4px solid var(--color-accent);
|
|
margin-top: var(--spacing-lg);
|
|
}
|
|
.info-box a {
|
|
color: var(--color-accent-hover);
|
|
font-weight: bold;
|
|
text-decoration: underline;
|
|
}
|
|
.info-box a:hover {
|
|
text-decoration: none;
|
|
}
|
|
|
|
.btn-primary {
|
|
background-color: var(--color-accent);
|
|
color: var(--color-white);
|
|
border: none;
|
|
}
|
|
.btn-primary:hover {
|
|
background-color: var(--color-accent-hover);
|
|
}
|
|
.btn-danger {
|
|
background-color: var(--color-danger);
|
|
color: var(--color-white);
|
|
border: none;
|
|
}
|
|
.btn-danger:hover {
|
|
background-color: var(--color-danger-hover);
|
|
}
|
|
|
|
.badge {
|
|
padding: 2px 6px;
|
|
border-radius: 4px;
|
|
font-size: 0.85em;
|
|
font-weight: bold;
|
|
}
|
|
.stats-list {
|
|
list-style: none;
|
|
padding: 0;
|
|
margin: 0;
|
|
}
|
|
.stats-list li {
|
|
padding: 5px 0;
|
|
border-bottom: 1px solid #f0f0f0;
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
}
|
|
.stats-list li:last-child {
|
|
border-bottom: none;
|
|
}
|
|
.category-self { background-color: #e3f2fd; color: #0d47a1; }
|
|
.category-upstream { background-color: #f3e5f5; color: #7b1fa2; }
|
|
.category-mirror { background-color: #fff3e0; color: #e65100; }
|
|
.status-success { background-color: #e8f5e9; color: #2e7d32; }
|
|
.status-error { background-color: #ffebee; color: #c62828; }
|
|
|
|
.info-toggle {
|
|
display: inline-block;
|
|
width: 18px;
|
|
height: 18px;
|
|
line-height: 18px;
|
|
text-align: center;
|
|
background-color: #607D8B;
|
|
color: white;
|
|
border-radius: 50%;
|
|
font-size: 12px;
|
|
cursor: pointer;
|
|
margin-left: 5px;
|
|
font-style: normal;
|
|
user-select: none;
|
|
}
|
|
.info-toggle:hover {
|
|
background-color: #455A64;
|
|
}
|
|
.info-details {
|
|
display: none;
|
|
background-color: #f0f7ff;
|
|
border: 1px solid #d0e0f0;
|
|
padding: 10px;
|
|
margin-top: 5px;
|
|
border-radius: 4px;
|
|
font-size: 0.85em;
|
|
color: #333;
|
|
line-height: 1.4;
|
|
max-width: 400px;
|
|
}
|
|
.info-details code {
|
|
background-color: #e3f2fd;
|
|
padding: 2px 4px;
|
|
border-radius: 3px;
|
|
font-family: monospace;
|
|
}
|
|
|
|
.badge {
|
|
padding: 2px 8px;
|
|
border-radius: 10px;
|
|
font-size: var(--font-size-xs);
|
|
font-weight: bold;
|
|
}
|
|
|
|
.flex-between {
|
|
display: flex;
|
|
justify-content: space-between;
|
|
align-items: center;
|
|
gap: var(--spacing-md);
|
|
margin-bottom: var(--spacing-md);
|
|
}
|
|
|
|
.spotify-badge {
|
|
background-color: var(--color-bg-light);
|
|
padding: var(--spacing-xs) var(--spacing-md);
|
|
border-radius: 20px;
|
|
font-size: var(--font-size-sm);
|
|
display: flex;
|
|
align-items: center;
|
|
gap: var(--spacing-sm);
|
|
border: 1px solid var(--color-border);
|
|
}
|
|
.spotify-badge-active {
|
|
border-color: #1DB954;
|
|
background-color: #e8f5e9;
|
|
}
|
|
|
|
.console-box {
|
|
font-family: monospace;
|
|
white-space: pre-wrap;
|
|
font-size: var(--font-size-xs);
|
|
max-height: 300px;
|
|
overflow-y: auto;
|
|
padding: var(--spacing-md);
|
|
border: 1px solid var(--color-border);
|
|
background: var(--color-white);
|
|
border-radius: var(--spacing-xs);
|
|
}
|
|
|
|
.test-connection-box {
|
|
margin: var(--spacing-md) 0;
|
|
padding: var(--spacing-md);
|
|
border: 1px solid var(--color-accent);
|
|
background-color: var(--color-info-bg);
|
|
border-radius: var(--spacing-xs);
|
|
}
|
|
|
|
.test-connection-box-warning {
|
|
background-color: var(--color-warning-bg);
|
|
border-color: var(--color-warning);
|
|
}
|
|
|
|
.test-connection-box-success {
|
|
background-color: var(--color-success-bg);
|
|
border-color: var(--color-success);
|
|
}
|
|
|
|
.btn-secondary {
|
|
background-color: #607d8b;
|
|
color: var(--color-white);
|
|
border: none;
|
|
}
|
|
.btn-secondary:hover {
|
|
background-color: #455a64;
|
|
}
|
|
|
|
.btn-warning {
|
|
background-color: var(--color-warning);
|
|
color: var(--color-primary);
|
|
border: none;
|
|
}
|
|
.btn-warning:hover {
|
|
background-color: #fbc02d;
|
|
filter: brightness(0.9);
|
|
}
|
|
|
|
.btn-success {
|
|
background-color: var(--color-success);
|
|
color: var(--color-white);
|
|
border: none;
|
|
}
|
|
.btn-success:hover {
|
|
background-color: #1b5e20;
|
|
}
|
|
|
|
.config-header {
|
|
display: block;
|
|
font-weight: bold;
|
|
margin-bottom: var(--spacing-xs);
|
|
color: var(--color-text-muted);
|
|
font-size: var(--font-size-sm);
|
|
}
|
|
|
|
.help-text-sm {
|
|
font-size: var(--font-size-xs);
|
|
color: var(--color-text-muted);
|
|
margin-top: var(--spacing-xs);
|
|
display: block;
|
|
}
|
|
|
|
.mt-md { margin-top: var(--spacing-md); }
|
|
.mb-md { margin-bottom: var(--spacing-md); }
|
|
|
|
.flex-row {
|
|
display: flex;
|
|
gap: var(--spacing-md);
|
|
align-items: center;
|
|
}
|
|
.flex-grow { flex: 1; }
|
|
.flex-2 { flex: 2; }
|
|
|
|
.text-right { text-align: right; }
|
|
|
|
.border-right { border-right: 1px solid var(--color-border); }
|
|
.pr-md { padding-right: var(--spacing-md); }
|
|
|
|
.scroll-y { overflow-y: auto; }
|
|
.max-h-200 { max-height: 200px; }
|
|
|
|
.filter-bar {
|
|
margin-bottom: var(--spacing-md);
|
|
display: flex;
|
|
gap: var(--spacing-md);
|
|
align-items: center;
|
|
background: var(--color-bg-light);
|
|
padding: var(--spacing-sm);
|
|
border-radius: var(--spacing-xs);
|
|
border: 1px solid var(--color-border);
|
|
}
|
|
|
|
.viewer-box {
|
|
margin-top: var(--spacing-lg);
|
|
background: #2b2b2b;
|
|
color: #a9b7c6;
|
|
padding: var(--spacing-md);
|
|
border-radius: var(--spacing-xs);
|
|
border: 1px solid #444;
|
|
}
|
|
.viewer-box h3 { color: var(--color-white); }
|
|
.viewer-box pre {
|
|
background: transparent;
|
|
color: inherit;
|
|
font-family: 'Courier New', Courier, monospace;
|
|
font-size: 0.9em;
|
|
padding: 0;
|
|
max-height: 600px;
|
|
overflow-x: auto;
|
|
}
|
|
.viewer-box button {
|
|
background: #444;
|
|
color: var(--color-white);
|
|
border: 1px solid #666;
|
|
}
|
|
|
|
.status-warning { background-color: var(--color-warning-bg); border-color: var(--color-warning); display: block; color: var(--color-text); }
|
|
|
|
.logo {
|
|
height: 40px;
|
|
vertical-align: middle;
|
|
margin-right: 10px;
|
|
margin-top: -5px;
|
|
}
|