From be502a5e173459afae58c6e97d8caa9afa720d23 Mon Sep 17 00:00:00 2001 From: Patrick Balsiger Date: Wed, 27 Aug 2025 08:22:44 +0200 Subject: [PATCH] feat: improve firmware view styling --- public/styles.css | 303 +++++++++++++++++++++++++++++++++------------- 1 file changed, 222 insertions(+), 81 deletions(-) diff --git a/public/styles.css b/public/styles.css index 7b2ecb8..ae113e6 100644 --- a/public/styles.css +++ b/public/styles.css @@ -346,13 +346,20 @@ p { } .endpoint-item { - background: rgba(0, 0, 0, 0.3); + background: rgba(0, 0, 0, 0.2); padding: 0.5rem; border-radius: 6px; margin-bottom: 0.5rem; font-size: 0.8rem; font-family: 'Courier New', monospace; - border: 1px solid rgba(255, 255, 255, 0.05); + border: 1px solid rgba(255, 255, 255, 0.1); + transition: all 0.2s ease; +} + +.endpoint-item:hover { + background: rgba(0, 0, 0, 0.25); + border-color: rgba(255, 255, 255, 0.15); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); } .loading-details { @@ -538,20 +545,31 @@ p { } .upload-btn { - background: rgba(255, 255, 255, 0.1); - border: 1px solid rgba(255, 255, 255, 0.2); - color: #ecf0f1; - padding: 0.75rem 1.5rem; - border-radius: 8px; + background: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 0%, rgba(255, 255, 255, 0.05) 100%); + border: 1px solid rgba(255, 255, 255, 0.15); + color: rgba(255, 255, 255, 0.9); + padding: 0.75rem 1.25rem; + border-radius: 12px; cursor: pointer; - font-size: 1rem; - transition: all 0.3s ease; + font-size: 0.9rem; + font-weight: 500; + transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + display: flex; + align-items: center; + gap: 0.5rem; + backdrop-filter: blur(10px); margin-bottom: 1rem; } .upload-btn:hover { - background: rgba(255, 255, 255, 0.2); + background: linear-gradient(135deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.08) 100%); + border-color: rgba(255, 255, 255, 0.25); transform: translateY(-2px); + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); +} + +.upload-btn:active { + transform: translateY(0); } .upload-info { @@ -733,12 +751,12 @@ p { /* Firmware Section Styles */ .firmware-section { - background: rgba(0, 0, 0, 0.25); + background: rgba(0, 0, 0, 0.3); border-radius: 16px; - backdrop-filter: blur(15px); - box-shadow: 0 8px 24px rgba(0, 0, 0, 0.3); - border: 1px solid rgba(255, 255, 255, 0.08); - padding: 0.5rem; + backdrop-filter: blur(10px); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4); + border: 1px solid rgba(255, 255, 255, 0.1); + padding: 0.75rem; margin-bottom: 1rem; position: relative; overflow: hidden; @@ -766,11 +784,18 @@ p { .action-group { background: rgba(0, 0, 0, 0.2); - border-radius: 12px; - padding: 0.75rem; - border: 1px solid rgba(255, 255, 255, 0.06); + border-radius: 10px; + padding: 1rem; + border: 1px solid rgba(255, 255, 255, 0.1); position: relative; overflow: hidden; + transition: all 0.2s ease; +} + +.action-group:hover { + background: rgba(0, 0, 0, 0.25); + border-color: rgba(255, 255, 255, 0.15); + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); } .action-group h3 { @@ -792,16 +817,38 @@ p { display: flex; gap: 1rem; align-items: center; - padding: 0.75rem; - background: rgba(255, 255, 255, 0.03); + padding: 1rem; + background: rgba(0, 0, 0, 0.2); border: 1px solid rgba(255, 255, 255, 0.1); - border-radius: 8px; - transition: all 0.3s ease; + border-radius: 10px; + transition: all 0.2s ease; + position: relative; + cursor: pointer; +} + +.compact-upload-row::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(255, 255, 255, 0.08); + border-radius: 12px; + opacity: 0; + transition: opacity 0.2s ease; + pointer-events: none; +} + +.compact-upload-row:hover::before { + opacity: 1; } .compact-upload-row:hover { - background: rgba(255, 255, 255, 0.05); + background: rgba(0, 0, 0, 0.25); border-color: rgba(255, 255, 255, 0.15); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.2); + transform: translateY(-2px); } .file-upload-area { @@ -822,39 +869,54 @@ p { } .upload-btn-compact { - background: linear-gradient(135deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.08) 100%); - border: 1px solid rgba(255, 255, 255, 0.2); - color: #ffffff; - padding: 0.4rem 0.8rem; - border-radius: 6px; + background: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 0%, rgba(255, 255, 255, 0.05) 100%); + border: 1px solid rgba(255, 255, 255, 0.15); + color: rgba(255, 255, 255, 0.9); + padding: 0.75rem 1.25rem; + border-radius: 12px; cursor: pointer; - font-size: 0.85rem; + font-size: 0.9rem; font-weight: 500; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + display: flex; + align-items: center; + gap: 0.5rem; + backdrop-filter: blur(10px); white-space: nowrap; } .upload-btn-compact:hover { - background: linear-gradient(135deg, rgba(255, 255, 255, 0.2) 0%, rgba(255, 255, 255, 0.12) 100%); + background: linear-gradient(135deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.08) 100%); + border-color: rgba(255, 255, 255, 0.25); transform: translateY(-2px); box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); } +.upload-btn-compact:active { + transform: translateY(0); +} + .file-info { color: rgba(255, 255, 255, 0.7); - font-size: 0.8rem; + font-size: 0.9rem; font-style: italic; - transition: all 0.3s ease; - padding: 0.25rem 0.5rem; - background: rgba(255, 255, 255, 0.05); - border-radius: 4px; - border: 1px solid transparent; + transition: all 0.2s ease; + padding: 0.75rem 1.25rem; + background: rgba(0, 0, 0, 0.2); + border-radius: 6px; + border: 1px solid rgba(255, 255, 255, 0.1); white-space: nowrap; overflow: hidden; text-overflow: ellipsis; max-width: 200px; } +.file-info:hover { + background: rgba(0, 0, 0, 0.25); + border-color: rgba(255, 255, 255, 0.15); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); +} + .file-info.has-file { color: #4ade80; background: rgba(74, 222, 128, 0.1); @@ -863,6 +925,12 @@ p { font-style: normal; } +.file-info.has-file:hover { + background: rgba(74, 222, 128, 0.15); + border-color: rgba(74, 222, 128, 0.3); + box-shadow: 0 2px 8px rgba(74, 222, 128, 0.2); +} + .target-options { display: flex; gap: 0.75rem; @@ -876,24 +944,17 @@ p { gap: 0.3rem; cursor: pointer; padding: 0.3rem; - border-radius: 4px; + border-radius: 6px; transition: all 0.2s ease; -} - -.specific-node-option { - gap: 0.5rem; - align-items: center; -} - -.specific-node-option .node-select { - margin-left: 0.5rem; - visibility: hidden; - opacity: 0; - transition: opacity 0.2s ease; + background: transparent; + border: none; } .target-option:hover { - background: rgba(255, 255, 255, 0.05); + background: rgba(0, 0, 0, 0.25); + border-color: transparent; + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); + transform: translateY(-1px); } .target-option input[type="radio"] { @@ -903,17 +964,18 @@ p { .radio-custom { width: 14px; height: 14px; - border: 2px solid rgba(255, 255, 255, 0.3); + border: 2px solid rgba(255, 255, 255, 0.1); border-radius: 50%; position: relative; transition: all 0.2s ease; - background: rgba(255, 255, 255, 0.05); + background: rgba(0, 0, 0, 0.2); } .target-option input[type="radio"]:checked + .radio-custom { border-color: #667eea; background: #667eea; box-shadow: 0 0 0 2px rgba(102, 126, 234, 0.2); + transform: scale(1.05); } .target-option input[type="radio"]:checked + .radio-custom::after { @@ -942,13 +1004,13 @@ p { .target-label { color: rgba(255, 255, 255, 0.9); - font-size: 0.85rem; + font-size: 0.9rem; font-weight: 500; } .node-select { - background: linear-gradient(135deg, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0.7) 100%); - border: 1px solid rgba(255, 255, 255, 0.3); + background: rgba(0, 0, 0, 0.2); + border: 1px solid rgba(255, 255, 255, 0.1); color: #ffffff; padding: 0.3rem 0.5rem; border-radius: 6px; @@ -961,15 +1023,17 @@ p { } .node-select:hover { - border-color: rgba(255, 255, 255, 0.4); - background: linear-gradient(135deg, rgba(0, 0, 0, 0.9) 0%, rgba(0, 0, 0, 0.8) 100%); + background: rgba(0, 0, 0, 0.25); + border-color: rgba(255, 255, 255, 0.15); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); + transform: translateY(-1px); } .node-select:focus { outline: none; border-color: #667eea; box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.2); - background: linear-gradient(135deg, rgba(0, 0, 0, 1) 0%, rgba(0, 0, 0, 0.9) 100%); + background: rgba(0, 0, 0, 0.3); } /* Style the dropdown options */ @@ -1008,22 +1072,33 @@ p { margin-top: 0.25rem !important; font-style: italic !important; text-align: center; - padding: 0.25rem; - border-radius: 4px; - background: rgba(251, 191, 36, 0.1); + padding: 0.5rem 0.75rem; + border-radius: 6px; + background: rgba(0, 0, 0, 0.2); border: 1px solid rgba(251, 191, 36, 0.3); + transition: all 0.2s ease; +} + +.no-nodes-message:hover { + background: rgba(0, 0, 0, 0.25); + border-color: rgba(251, 191, 36, 0.4); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); } .deploy-btn { - background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); - border: none; - color: #ffffff; - padding: 0.5rem 1rem; - border-radius: 6px; + background: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 0%, rgba(255, 255, 255, 0.05) 100%); + border: 1px solid rgba(255, 255, 255, 0.15); + color: rgba(255, 255, 255, 0.9); + padding: 0.75rem 1.25rem; + border-radius: 12px; cursor: pointer; font-size: 0.9rem; - font-weight: 600; + font-weight: 500; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); + display: flex; + align-items: center; + gap: 0.5rem; + backdrop-filter: blur(10px); min-width: 100px; position: relative; overflow: hidden; @@ -1046,8 +1121,14 @@ p { } .deploy-btn:hover:not(:disabled) { + background: linear-gradient(135deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.08) 100%); + border-color: rgba(255, 255, 255, 0.25); transform: translateY(-2px); - box-shadow: 0 8px 25px rgba(102, 126, 234, 0.3); + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); +} + +.deploy-btn:active:not(:disabled) { + transform: translateY(0); } .deploy-btn:disabled { @@ -1211,13 +1292,21 @@ p { /* Firmware upload progress and results styling */ .firmware-upload-progress, .firmware-upload-results { - background: rgba(0, 0, 0, 0.3); + background: rgba(0, 0, 0, 0.2); border-radius: 16px; backdrop-filter: blur(10px); - box-shadow: 0 8px 32px rgba(0, 0, 0, 0.4); + box-shadow: 0 8px 24px rgba(0, 0, 0, 0.4); border: 1px solid rgba(255, 255, 255, 0.1); padding: 1.5rem; margin-top: 1rem; + transition: all 0.2s ease; +} + +.firmware-upload-progress:hover, +.firmware-upload-results:hover { + background: rgba(0, 0, 0, 0.25); + border-color: rgba(255, 255, 255, 0.15); + box-shadow: 0 8px 32px rgba(0, 0, 0, 0.5); } .progress-header, @@ -1246,20 +1335,21 @@ p { background: linear-gradient(135deg, rgba(255, 255, 255, 0.1) 0%, rgba(255, 255, 255, 0.05) 100%); border: 1px solid rgba(255, 255, 255, 0.15); color: rgba(255, 255, 255, 0.9); - padding: 0.5rem; - border-radius: 8px; + padding: 0.75rem 1.25rem; + border-radius: 12px; cursor: pointer; transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1); display: flex; align-items: center; justify-content: center; + backdrop-filter: blur(10px); } .progress-refresh-btn:hover { background: linear-gradient(135deg, rgba(255, 255, 255, 0.15) 0%, rgba(255, 255, 255, 0.08) 100%); border-color: rgba(255, 255, 255, 0.25); - transform: translateY(-1px); - box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); + transform: translateY(-2px); + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); } .progress-refresh-btn:active { @@ -1278,9 +1368,17 @@ p { .progress-info span, .results-summary span { padding: 0.25rem 0.5rem; - background: rgba(255, 255, 255, 0.05); + background: rgba(0, 0, 0, 0.2); border-radius: 6px; border: 1px solid rgba(255, 255, 255, 0.1); + transition: all 0.2s ease; +} + +.progress-info span:hover, +.results-summary span:hover { + background: rgba(0, 0, 0, 0.25); + border-color: rgba(255, 255, 255, 0.15); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.2); } .overall-progress { @@ -1317,9 +1415,16 @@ p { .progress-summary { margin-top: 0.75rem; padding: 0.5rem 0.75rem; - background: rgba(255, 255, 255, 0.05); - border-radius: 8px; + background: rgba(0, 0, 0, 0.2); + border-radius: 10px; border: 1px solid rgba(255, 255, 255, 0.1); + transition: all 0.2s ease; +} + +.progress-summary:hover { + background: rgba(0, 0, 0, 0.25); + border-color: rgba(255, 255, 255, 0.15); + box-shadow: 0 4px 15px rgba(0, 0, 0, 0.2); } .progress-summary span { @@ -1356,16 +1461,40 @@ p { justify-content: space-between; align-items: center; padding: 1rem; - background: rgba(255, 255, 255, 0.05); - border-radius: 12px; + background: rgba(0, 0, 0, 0.2); + border-radius: 10px; border: 1px solid rgba(255, 255, 255, 0.1); - transition: all 0.3s ease; + transition: all 0.2s ease; + position: relative; + cursor: pointer; +} + +.progress-item::before, +.result-item::before { + content: ''; + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(255, 255, 255, 0.08); + border-radius: 12px; + opacity: 0; + transition: opacity 0.2s ease; + pointer-events: none; +} + +.progress-item:hover::before, +.result-item:hover::before { + opacity: 1; } .progress-item:hover, .result-item:hover { - background: rgba(255, 255, 255, 0.08); + background: rgba(0, 0, 0, 0.25); border-color: rgba(255, 255, 255, 0.15); + box-shadow: 0 8px 25px rgba(0, 0, 0, 0.2); + transform: translateY(-2px); } .progress-node-info, @@ -1545,4 +1674,16 @@ p { .nav-tab.active { transform: translateY(0); +} + +.specific-node-option { + gap: 0.5rem; + align-items: center; +} + +.specific-node-option .node-select { + margin-left: 0.5rem; + visibility: hidden; + opacity: 0; + transition: opacity 0.2s ease; } \ No newline at end of file