summaryrefslogtreecommitdiffstats
path: root/static/styles.css
diff options
context:
space:
mode:
Diffstat (limited to 'static/styles.css')
-rw-r--r--static/styles.css430
1 files changed, 406 insertions, 24 deletions
diff --git a/static/styles.css b/static/styles.css
index 96531df..36c0e15 100644
--- a/static/styles.css
+++ b/static/styles.css
@@ -1,9 +1,14 @@
:root {
- /* Fluent 2 Color Tokens */
+ /* Light theme (default) */
--color-neutral-background: #f7f7f7;
--color-neutral-background-selected: #e6e6e6;
--color-neutral-foreground: #242424;
--color-neutral-foreground-subtle: #616161;
+ --color-surface: #ffffff;
+ --border-color: #e1e1e1;
+ --shadow-color: rgba(0,0,0,0.12);
+
+ /* Brand colors remain the same */
--color-brand-background: #0078d4;
--color-brand-background-hover: #106ebe;
--color-brand-foreground: #0078d4;
@@ -13,12 +18,12 @@
--color-status-error: #d13438;
--color-status-info: #0078d4;
- /* Fluent 2 Shadows */
- --shadow-2: 0 0 2px rgba(0,0,0,0.12), 0 2px 4px rgba(0,0,0,0.14);
- --shadow-4: 0 0 2px rgba(0,0,0,0.12), 0 4px 8px rgba(0,0,0,0.14);
- --shadow-8: 0 0 2px rgba(0,0,0,0.12), 0 8px 16px rgba(0,0,0,0.14);
+ /* Shadows */
+ --shadow-2: 0 0 2px var(--shadow-color), 0 2px 4px var(--shadow-color);
+ --shadow-4: 0 0 2px var(--shadow-color), 0 4px 8px var(--shadow-color);
+ --shadow-8: 0 0 2px var(--shadow-color), 0 8px 16px var(--shadow-color);
- /* Fluent 2 Typography */
+ /* Typography */
--font-weight-regular: 400;
--font-weight-semibold: 600;
--font-weight-bold: 700;
@@ -36,26 +41,55 @@
--border-radius-large: 8px;
}
-* {
- box-sizing: border-box;
+[data-theme="dark"] {
+ --color-neutral-background: #1f1f1f;
+ --color-neutral-background-selected: #2d2d2d;
+ --color-neutral-foreground: #ffffff;
+ --color-neutral-foreground-subtle: #a0a0a0;
+ --color-surface: #2d2d2d;
+ --border-color: #404040;
+ --shadow-color: rgba(0,0,0,0.3);
}
+/* Update all color references to use theme variables */
body {
font-family: "Segoe UI", system-ui, -apple-system, sans-serif;
margin: 0;
background-color: var(--color-neutral-background);
color: var(--color-neutral-foreground);
line-height: 1.4;
+ transition: background-color 0.3s ease, color 0.3s ease;
}
-/* Header */
header {
- background: white;
+ background: var(--color-surface);
padding: var(--spacing-l) var(--spacing-xl);
- border-bottom: 1px solid #e1e1e1;
+ border-bottom: 1px solid var(--border-color);
box-shadow: var(--shadow-2);
}
+/* Add theme toggle button */
+.theme-toggle {
+ position: absolute;
+ top: var(--spacing-l);
+ right: var(--spacing-xl);
+ background: none;
+ border: none;
+ font-size: 20px;
+ cursor: pointer;
+ padding: var(--spacing-s);
+ border-radius: var(--border-radius-medium);
+ transition: background-color 0.2s ease;
+}
+
+.theme-toggle:hover {
+ background-color: var(--color-neutral-background-selected);
+}
+
+* {
+ box-sizing: border-box;
+}
+
header h2 {
margin: 0 0 var(--spacing-xs) 0;
font-weight: var(--font-weight-semibold);
@@ -78,8 +112,8 @@ main {
/* Navigation */
nav {
width: 260px;
- background: white;
- border-right: 1px solid #e1e1e1;
+ background: var(--color-surface);
+ border-right: 1px solid var(--border-color);
padding: var(--spacing-l);
display: flex;
flex-direction: column;
@@ -105,14 +139,15 @@ nav {
}
.nav-button:hover {
- background-color: var(--color-neutral-background);
- border-color: #e1e1e1;
+ background-color: var(--color-neutral-background-selected);
+ border-color: var(--border-color);
}
.nav-button.active {
background-color: var(--color-brand-background);
color: white;
font-weight: var(--font-weight-semibold);
+ border-color: var(--color-brand-background);
}
.nav-button.accent {
@@ -120,19 +155,49 @@ nav {
color: white;
font-weight: var(--font-weight-semibold);
margin-top: var(--spacing-xl);
+ border-color: var(--color-brand-background);
}
.nav-button.accent:hover {
background-color: var(--color-brand-background-hover);
+ border-color: var(--color-brand-background-hover);
}
.nav-button.warning {
background-color: var(--color-status-warning);
color: white;
+ border-color: var(--color-status-warning);
}
.nav-button.warning:hover {
background-color: #c13501;
+ border-color: #c13501;
+}
+
+/* Tips Section */
+.tips-section {
+ margin-top: auto;
+ padding-top: var(--spacing-xl);
+ border-top: 1px solid var(--border-color);
+}
+
+.tips-title {
+ font-weight: var(--font-weight-semibold);
+ font-size: 14px;
+ margin-bottom: var(--spacing-s);
+ color: var(--color-neutral-foreground);
+}
+
+.tips-list {
+ margin: 0;
+ padding-left: var(--spacing-l);
+ font-size: 13px;
+ color: var(--color-neutral-foreground-subtle);
+ line-height: 1.5;
+}
+
+.tips-list li {
+ margin-bottom: var(--spacing-xs);
}
/* Content Area */
@@ -147,14 +212,13 @@ section.active {
display: block;
}
-/* Cards/Panels */
.card {
- background: white;
+ background: var(--color-surface);
border-radius: var(--border-radius-large);
padding: var(--spacing-xl);
margin-bottom: var(--spacing-l);
box-shadow: var(--shadow-2);
- border: 1px solid #e1e1e1;
+ border: 1px solid var(--border-color);
}
.card-header {
@@ -225,11 +289,11 @@ section.active {
}
.interface-card {
- background: white;
+ background: var(--color-surface);
border-radius: var(--border-radius-large);
padding: var(--spacing-xl);
box-shadow: var(--shadow-2);
- border: 1px solid #e1e1e1;
+ border: 1px solid var(--border-color);
border-left: 4px solid var(--color-brand-background);
}
@@ -252,6 +316,7 @@ section.active {
font-weight: var(--font-weight-semibold);
font-size: 18px;
margin: 0;
+ color: var(--color-neutral-foreground);
}
.interface-type {
@@ -303,6 +368,7 @@ section.active {
}
/* Forms */
+/* Forms */
.form-group {
margin-bottom: var(--spacing-l);
}
@@ -318,11 +384,12 @@ section.active {
.select {
width: 100%;
padding: var(--spacing-m);
- border: 1px solid #e1e1e1;
+ border: 1px solid var(--border-color);
border-radius: var(--border-radius-medium);
font-family: inherit;
font-size: 14px;
- background: white;
+ background: var(--color-surface);
+ color: var(--color-neutral-foreground);
transition: border-color 0.1s ease;
}
@@ -335,13 +402,14 @@ section.active {
width: 100%;
height: 360px;
padding: var(--spacing-m);
- border: 1px solid #e1e1e1;
+ border: 1px solid var(--border-color);
border-radius: var(--border-radius-medium);
font-family: 'Consolas', 'Monaco', monospace;
font-size: 13px;
line-height: 1.5;
resize: vertical;
- background: white;
+ background: var(--color-surface);
+ color: var(--color-neutral-foreground);
transition: border-color 0.1s ease;
}
@@ -464,3 +532,317 @@ section.active {
gap: var(--spacing-m);
}
}
+
+/* Interface Tabs */
+/* Interface Tabs */
+.interface-tabs-container {
+ display: flex;
+ gap: var(--spacing-xs);
+ margin-bottom: var(--spacing-l);
+ flex-wrap: wrap;
+}
+
+.interface-tab {
+ display: flex;
+ align-items: center;
+ gap: var(--spacing-s);
+ padding: var(--spacing-m) var(--spacing-l);
+ background: var(--color-neutral-background);
+ border: 1px solid var(--border-color);
+ border-radius: var(--border-radius-medium);
+ font-family: inherit;
+ font-size: 14px;
+ font-weight: var(--font-weight-regular);
+ color: var(--color-neutral-foreground);
+ cursor: pointer;
+ transition: all 0.1s ease;
+}
+
+.interface-tab:hover {
+ background: var(--color-neutral-background-selected);
+ border-color: var(--color-brand-background);
+}
+
+.interface-tab.active {
+ background: var(--color-brand-background);
+ color: white;
+ border-color: var(--color-brand-background);
+}
+
+.interface-state {
+ font-size: 12px;
+ padding: 2px 6px;
+ border-radius: 10px;
+ background: var(--color-neutral-foreground-subtle);
+ color: white;
+}
+
+.interface-tab.active .interface-state {
+ background: rgba(255, 255, 255, 0.3);
+}
+
+/* Interface Details */
+.interface-detail-grid {
+ display: flex;
+ flex-direction: column;
+ gap: var(--spacing-s);
+ font-family: 'Monaco', 'Consolas', monospace;
+ font-size: 13px;
+}
+
+.detail-row {
+ display: flex;
+ justify-content: space-between;
+ align-items: flex-start;
+ gap: var(--spacing-l);
+ padding: var(--spacing-xs) 0;
+ border-bottom: 1px solid #f0f0f0;
+}
+
+.detail-row:last-child {
+ border-bottom: none;
+}
+
+.detail-label {
+ font-weight: var(--font-weight-semibold);
+ color: var(--color-neutral-foreground);
+ min-width: 200px;
+ flex-shrink: 0;
+}
+
+.detail-value {
+ color: var(--color-neutral-foreground-subtle);
+ text-align: right;
+ flex: 1;
+ word-break: break-word;
+}
+
+/* Address and list items */
+.address-item,
+.dns-item,
+.lease-item {
+ margin-bottom: 2px;
+ padding: 1px 0;
+}
+
+.address-item:last-child,
+.dns-item:last-child,
+.lease-item:last-child {
+ margin-bottom: 0;
+}
+
+/* State badges in details */
+.detail-value.state-up {
+ color: var(--color-status-success);
+ font-weight: var(--font-weight-semibold);
+}
+
+.detail-value.state-down {
+ color: var(--color-status-error);
+ font-weight: var(--font-weight-semibold);
+}
+
+/* Error and empty states */
+.error-message {
+ padding: var(--spacing-l);
+ background: var(--color-status-error);
+ color: white;
+ border-radius: var(--border-radius-medium);
+ text-align: center;
+}
+
+.no-interfaces {
+ padding: var(--spacing-xl);
+ text-align: center;
+ color: var(--color-neutral-foreground-subtle);
+ font-style: italic;
+}
+
+/* Validation states */
+.validation-pending {
+ color: var(--color-neutral-foreground-subtle);
+}
+
+.validation-success {
+ color: var(--color-status-success);
+ font-weight: var(--font-weight-semibold);
+}
+
+.validation-error {
+ color: var(--color-status-error);
+ font-weight: var(--font-weight-semibold);
+}
+
+.validation-result {
+ padding: var(--spacing-m);
+ border-radius: var(--border-radius-medium);
+ font-size: 14px;
+ margin-top: var(--spacing-m);
+}
+
+.validation-success {
+ background: var(--color-status-success);
+ color: white;
+ border: 1px solid var(--color-status-success);
+}
+
+.validation-error {
+ background: var(--color-status-error);
+ color: white;
+ border: 1px solid var(--color-status-error);
+}
+
+/* Responsive improvements */
+@media (max-width: 768px) {
+ .detail-row {
+ flex-direction: column;
+ gap: var(--spacing-xs);
+ align-items: stretch;
+ }
+
+ .detail-label {
+ min-width: auto;
+ font-size: 12px;
+ }
+
+ .detail-value {
+ text-align: left;
+ }
+
+ .interface-tabs-container {
+ flex-direction: column;
+ }
+
+ .interface-tab {
+ justify-content: space-between;
+ }
+}
+
+.interface-detail-grid {
+ display: grid;
+ grid-template-columns: auto 1fr;
+ gap: var(--spacing-s) var(--spacing-l);
+ font-family: 'Monaco', 'Consolas', monospace;
+ font-size: 13px;
+ align-items: start;
+}
+
+.detail-row {
+ display: contents;
+}
+
+.detail-label {
+ font-weight: var(--font-weight-semibold);
+ color: var(--color-neutral-foreground);
+ text-align: right;
+ padding: var(--spacing-xs) 0;
+ border-bottom: 1px solid var(--border-color);
+}
+
+.detail-value {
+ color: var(--color-neutral-foreground-subtle);
+ text-align: left;
+ padding: var(--spacing-xs) 0;
+ border-bottom: 1px solid var(--border-color);
+ word-break: break-word;
+}
+
+.detail-row:last-child .detail-label,
+.detail-row:last-child .detail-value {
+ border-bottom: none;
+}
+
+/* Abbreviation styling */
+abbr {
+ text-decoration: underline dotted;
+ cursor: help;
+}
+
+/* Address and list items */
+.address-item,
+.dns-item,
+.lease-item {
+ margin-bottom: 2px;
+ padding: 1px 0;
+}
+
+.address-item:last-child,
+.dns-item:last-child,
+.lease-item:last-child {
+ margin-bottom: 0;
+}
+
+/* Structured Editor Styles */
+.structured-editor {
+ margin-top: var(--spacing-l);
+}
+
+.editor-sections {
+ display: flex;
+ flex-direction: column;
+ gap: var(--spacing-l);
+}
+
+.config-section {
+ background: var(--color-surface);
+ border: 1px solid var(--border-color);
+ border-radius: var(--border-radius-medium);
+ padding: var(--spacing-l);
+}
+
+.config-section h4 {
+ margin: 0 0 var(--spacing-m) 0;
+ color: var(--color-brand-foreground);
+ font-family: monospace;
+}
+
+.config-table {
+ display: grid;
+ grid-template-columns: auto 1fr;
+ gap: var(--spacing-s) var(--spacing-m);
+ align-items: center;
+}
+
+.config-row {
+ display: contents;
+}
+
+.config-label {
+ text-align: right;
+ font-weight: var(--font-weight-semibold);
+ font-size: 13px;
+ color: var(--color-neutral-foreground);
+}
+
+.config-input,
+.config-select {
+ padding: var(--spacing-s);
+ border: 1px solid var(--border-color);
+ border-radius: var(--border-radius-medium);
+ background: var(--color-surface);
+ color: var(--color-neutral-foreground);
+ font-family: inherit;
+ font-size: 13px;
+}
+
+.config-input:focus,
+.config-select:focus {
+ outline: none;
+ border-color: var(--color-brand-background);
+}
+
+.button.small {
+ padding: var(--spacing-xs) var(--spacing-s);
+ font-size: 12px;
+ grid-column: 1 / -1;
+ justify-self: end;
+ margin-top: var(--spacing-s);
+}
+
+.editor-actions {
+ display: flex;
+ gap: var(--spacing-s);
+ margin-top: var(--spacing-l);
+ padding-top: var(--spacing-l);
+ border-top: 1px solid var(--border-color);
+}