body{font-family:Arial,sans-serif;margin:0;background:#f4f6f8;color:#1c2733}main{max-width:980px;margin:auto;padding:24px}.health-row{display:grid;grid-template-columns:2fr auto 3fr;gap:16px;align-items:center;background:#fff;border:1px solid #dfe5eb;border-radius:8px;padding:12px;margin:8px 0}.health-row small{display:block;color:#65717e}.status{font-weight:bold;border-radius:999px;padding:4px 10px}.status.ok,.status.success{background:#e4f6ea;color:#176b36}.status.warning{background:#fff2cc;color:#725000}.status.error,.status.critical{background:#fde4e4;color:#8b1d1d}.status.never,.status.disabled,.status.running{background:#e8edf2;color:#3f4e5c}@media(max-width:700px){.health-row{grid-template-columns:1fr auto}.health-row>small{grid-column:1/-1}}
.admin-page{max-width:1180px;margin:auto;padding:24px}.admin-nav{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:24px}.admin-nav a,.button{display:inline-block;padding:8px 12px;border-radius:6px;text-decoration:none;background:#e8edf2;color:#243443;border:0}.admin-nav a.active{font-weight:bold;background:#d7e3ee}.lead{color:#65717e}.box{background:#fff;border:1px solid #dfe5eb;border-radius:10px;padding:18px;margin:16px 0}.form-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:14px}.form-grid label{display:flex;flex-direction:column;gap:5px}.form-grid label.check{flex-direction:row;align-items:center;align-self:end;padding-bottom:8px}.form-grid input,.form-grid select{padding:9px;border:1px solid #bfc9d3;border-radius:6px;background:#fff}.form-actions{grid-column:1/-1;display:flex;gap:8px}.form-actions button,.actions button{padding:8px 12px;border:0;border-radius:6px;cursor:pointer}.secondary{background:#e8edf2}.danger{background:#b42318;color:#fff;border:0;border-radius:6px;cursor:pointer}.small{padding:6px 9px;font-size:.9rem}.table-wrap{overflow-x:auto}table{width:100%;border-collapse:collapse}th,td{text-align:left;padding:10px;border-bottom:1px solid #e1e6eb;vertical-align:top}td small{display:block;margin-top:4px}.muted{color:#65717e}.error-text{color:#8b1d1d}.actions{display:flex;gap:6px;white-space:nowrap}.actions form{display:inline}.msg{padding:11px 13px;border-radius:7px;background:#eef}.msg.success{background:#e4f6ea;color:#176b36}.msg.error{background:#fde4e4;color:#8b1d1d}.status.up{background:#e4f6ea;color:#176b36}.status.down{background:#fde4e4;color:#8b1d1d}.status.unknown{background:#e8edf2;color:#3f4e5c}@media(max-width:700px){.admin-page{padding:14px}.actions{flex-direction:column}.form-grid{grid-template-columns:1fr}}
.admin-page.wide{max-width:1500px}.section-heading{display:flex;justify-content:space-between;align-items:center;gap:16px}.section-heading h2{margin-top:0}.sensor-editor{padding:0}.sensor-editor>.section-heading{padding:16px 18px;border-bottom:1px solid #dfe5eb}.sensor-form{padding:18px}.sensor-grid{display:grid;grid-template-columns:repeat(4,minmax(180px,1fr));gap:18px}.sensor-grid label,.thresholds label{display:flex;flex-direction:column;gap:6px}.sensor-form input,.sensor-form select{padding:10px;border:1px solid #bfc9d3;border-radius:5px;background:#fff}.sensor-form input:disabled{background:#edf1f4}.toggle-row{display:flex;gap:36px;padding:20px 0;border-top:1px solid #e1e6eb;margin-top:18px}.switch-label{display:flex;align-items:center;gap:8px;font-weight:bold}.switch-label input{width:20px;height:20px}.thresholds{display:grid;grid-template-columns:repeat(3,1fr);gap:20px;border:1px solid #dfe5eb;border-radius:6px;padding:18px}.thresholds legend{font-weight:bold;padding:0 8px}.button.success,.sensor-form button,.sensor-scan button{background:#2787d9;color:#fff;border:0;border-radius:5px;padding:9px 13px;cursor:pointer;text-decoration:none}@media(max-width:1000px){.sensor-grid{grid-template-columns:repeat(2,1fr)}}@media(max-width:650px){.sensor-grid,.thresholds{grid-template-columns:1fr}.section-heading,.toggle-row{align-items:stretch;flex-direction:column}}
.graphic-nav{gap:4px;padding:8px;background:#fff;border:1px solid #dfe5eb;border-radius:7px;box-shadow:0 1px 2px rgba(20,40,60,.05)}
.graphic-nav a{display:flex;align-items:center;gap:7px;padding:9px 12px;border-radius:4px;background:#fff;border:1px solid transparent;color:#4a5967}
.graphic-nav a:hover{background:#f1f6fa;border-color:#d7e3ee}.graphic-nav a.active{background:#2787d9;color:#fff;border-color:#1874be}.graphic-nav .panel-link{margin-left:auto}.nav-icon{width:18px;text-align:center;font-size:1.05rem}
.button.primary,.icon-button.primary{background:#2787d9;color:#fff}.button.success{background:#36ad55;color:#fff}.icon-button{border:0;border-radius:4px;padding:7px 9px;cursor:pointer}.page-actions{display:flex;justify-content:flex-end;gap:10px;margin-top:18px}
.module-cards{display:grid;grid-template-columns:repeat(auto-fit,minmax(250px,1fr));gap:12px}.module-card{display:flex;flex-direction:column;gap:7px;padding:15px;border:1px solid #dfe5eb;border-radius:7px;background:#fafcfd;cursor:pointer}.module-card-title{font-weight:bold;font-size:1.02rem}.module-card input{width:18px;height:18px;vertical-align:middle}.compact-input{width:100px;padding:7px;border:1px solid #bfc9d3;border-radius:5px}.large-check{width:20px;height:20px}
.gateway-choice{display:grid;grid-template-columns:repeat(2,minmax(260px,1fr));gap:16px;margin-bottom:20px}.gateway-card{position:relative;display:grid;grid-template-columns:auto 1fr;column-gap:12px;row-gap:5px;align-items:center;padding:18px;border:2px solid #dfe5eb;border-radius:8px;background:#fafcfd;cursor:pointer}.gateway-card:has(input:checked){border-color:#2787d9;background:#eef7ff}.gateway-card input{grid-row:1/3;width:20px;height:20px}.gateway-card small{grid-column:2}.gateway-icon{font-size:1.8rem;color:#2787d9}.config-panel{border:1px solid #dfe5eb;border-radius:7px;padding:18px;margin:18px 0}.config-panel legend{font-weight:bold;padding:0 8px}.sms-common{margin:18px 0}.admin-page code{background:#eef2f5;padding:2px 5px;border-radius:4px}
@media(max-width:760px){.graphic-nav .panel-link{margin-left:0}.gateway-choice{grid-template-columns:1fr}.page-actions{justify-content:stretch}.page-actions .button{width:100%;text-align:center}}
/* Stage 9: dashboard/status page */
.dashboard-body{min-height:100vh;background:#fff;color:#252b31;padding-bottom:34px}.topbar{height:54px;display:flex;align-items:stretch;border-top:1px solid #bbb;border-bottom:1px solid #d7d7d7;background:#fafafa;box-shadow:0 1px 2px rgba(0,0,0,.05)}.brand{display:flex;align-items:center;gap:8px;padding:0 30px;text-decoration:none;font-size:24px;font-weight:800;letter-spacing:1px;color:#0583df;text-shadow:0 1px 0 #fff}.brand-eye{color:#173d64;font-size:21px}.topnav{display:flex;align-items:stretch}.topnav a{display:flex;align-items:center;gap:9px;padding:0 17px;border-left:1px solid #eee;color:#59616a;text-decoration:none;font-family:Georgia,serif}.topnav a:hover,.topnav a.active{background:#ececec;color:#2c3c4b}.topnav a.disabled-link{opacity:.65}.dashboard-page{max-width:1600px;margin:0 auto;padding:18px 28px 60px}.dashboard-grid{display:grid;grid-template-columns:1fr 1fr 1fr 1fr;gap:12px;align-items:start}.dashboard-column{display:flex;flex-direction:column;gap:12px}.status-card{border:1px solid #d5d5d5;border-radius:4px;background:#fff;overflow:hidden;box-shadow:0 1px 1px rgba(0,0,0,.03)}.status-card h2{font-size:14px;font-weight:normal;margin:0;padding:11px 14px;background:#f7f7f7;border-bottom:1px solid #d9d9d9}.card-content{padding:9px 12px;min-height:36px}.loading,.empty-state{color:#777;font-size:13px}.empty-state{margin:8px 0}.dashboard-row{display:flex;align-items:center;gap:8px;min-height:32px;border-bottom:1px dotted #e7e7e7}.dashboard-row:last-child{border-bottom:0}.dashboard-row.compact{min-height:27px}.row-icon{width:18px;color:#276fa8;text-align:center}.row-main{min-width:0;flex:1;font-size:13px}.row-main strong{display:block;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.row-main small{display:block;color:#858585;font-size:10px;margin-top:2px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.metric-badge{font-size:10px;font-weight:bold;color:#fff;border-radius:2px;padding:3px 6px;white-space:nowrap}.metric-badge.ok,.metric-badge.up{background:#4fbd62}.metric-badge.warning{background:#e7a82e}.metric-badge.error,.metric-badge.critical,.metric-badge.down{background:#e35b58}.metric-badge.unknown{background:#8b969e}.inline-error{font-size:10px;color:#b42318;margin:-4px 0 6px 26px}.plain-state{font-size:12px;font-weight:bold}.plain-state.critical{color:red}.ok-text{color:green}.diagnostic-row{display:grid;grid-template-columns:17px 1fr auto;gap:5px;align-items:center;font-size:13px;line-height:1.25;padding:2px 0}.diagnostic-row small{grid-column:2/4;color:#858585;font-size:10px}.diagnostic-icon{color:#6b7881}.diag-ok{color:green}.diag-warning{color:#d28100}.diag-error{color:red}.diag-unknown{color:#69757e}.stats-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:8px}.stats-grid div{background:#f7f7f7;border:1px solid #e2e2e2;text-align:center;padding:9px}.stats-grid strong{display:block;font-size:20px;color:#287db7}.stats-grid span{font-size:11px;color:#777}.ups-device+.ups-device{border-top:1px solid #ddd;margin-top:8px;padding-top:8px}.ups-value{display:flex;justify-content:space-between;padding:3px 0 3px 26px;font-size:12px}.dashboard-alert{margin-bottom:12px;padding:10px;border:1px solid #e0a6a6;background:#fff1f1;color:#8b1d1d}.system-footer{position:fixed;bottom:0;left:0;right:0;z-index:20;text-align:center;padding:8px 12px;background:#fafafa;border-top:1px solid #ddd;font-size:12px;color:#111}.system-footer span{margin:0 5px;color:#888}
@media(max-width:1200px){.dashboard-grid{grid-template-columns:repeat(2,1fr)}}@media(max-width:760px){.topbar{height:auto;display:block}.brand{height:54px;justify-content:center;padding:0 12px}.topnav{overflow-x:auto}.topnav a{min-height:44px;padding:0 12px;white-space:nowrap}.dashboard-page{padding:12px 10px 86px}.dashboard-grid{grid-template-columns:1fr}.system-footer{font-size:10px}.system-footer span{display:none}}
/* Stage 10: manual SMS form */
.sms-page{max-width:1080px;margin:0 auto;padding:18px 28px 70px}.sms-compose-card{border:1px solid #d5d5d5;border-radius:4px;background:#fff;overflow:hidden;min-height:260px}.sms-compose-card h1{font-size:14px;font-weight:normal;margin:0;padding:11px 15px;background:#f7f7f7;border-bottom:1px solid #d9d9d9}.sms-compose-content{padding:17px 15px 28px}.manual-sms-form{display:flex;flex-direction:column;align-items:flex-start;max-width:645px;gap:6px}.manual-sms-form label{margin-top:8px;font-size:13px}.manual-sms-form input,.manual-sms-form textarea{box-sizing:border-box;width:455px;border:1px solid #8d949a;padding:5px;font:14px Arial,sans-serif;background:#fff}.manual-sms-form textarea{min-height:112px;resize:vertical;line-height:1.45}.sms-form-meta{display:flex;justify-content:space-between;width:455px;color:#717b84;font-size:11px}.sms-send-button{margin-top:13px;border-radius:3px;padding:6px 9px;font-size:12px}.sms-send-button:disabled{opacity:.55;cursor:not-allowed}.sms-gateway-info{margin:0 0 8px;color:#65717e;font-size:12px}@media(max-width:600px){.sms-page{padding:12px 10px 70px}.manual-sms-form{max-width:none;width:100%}.manual-sms-form input,.manual-sms-form textarea,.sms-form-meta{width:100%}}
/* Stage 11: MySQL event log browser */
.logs-page{max-width:1600px;margin:0 auto;padding:18px 28px 70px}.logs-card{border:1px solid #d5d5d5;border-radius:4px;background:#fff;overflow:hidden}.logs-card>h1{font-size:14px;font-weight:normal;margin:0;padding:11px 15px;background:#f7f7f7;border-bottom:1px solid #d9d9d9}.log-filters{display:grid;grid-template-columns:repeat(5,minmax(140px,1fr));gap:10px;padding:14px 15px;border-bottom:1px solid #e1e1e1;background:#fcfcfc}.log-filters label{display:flex;flex-direction:column;gap:5px;font-size:12px;font-weight:bold}.log-filters input,.log-filters select{box-sizing:border-box;width:100%;padding:7px;border:1px solid #b9c0c6;border-radius:3px;background:#fff;font:13px Arial,sans-serif}.log-search{grid-column:span 2}.log-filter-actions{display:flex;align-items:flex-end;gap:7px}.logs-summary{padding:9px 15px;color:#66717b;font-size:12px;border-bottom:1px solid #e6e6e6}.logs-table-wrap{overflow:auto}.logs-table{min-width:1050px}.logs-table th{position:sticky;top:0;z-index:1;background:#f4f4f4;font-size:12px}.logs-table td{font-size:12px}.logs-table td small{color:#75818b}.log-date{white-space:nowrap;color:#4f5962}.log-message{min-width:280px;max-width:650px;word-break:break-word}.log-level{display:inline-block;min-width:60px;padding:3px 5px;border-radius:3px;text-align:center;color:#fff;font-size:10px;font-weight:bold}.level-debug{background:#7f8b94}.level-info{background:#2787d9}.level-warning{background:#d89015}.level-error{background:#d9534f}.level-critical{background:#8b1d1d}.log-context-cell{min-width:90px}.log-context-cell summary{cursor:pointer;color:#2577b5}.log-context-cell pre{max-width:520px;max-height:260px;overflow:auto;margin:8px 0 0;padding:9px;background:#f2f5f7;border:1px solid #dce2e7;border-radius:4px;font:11px/1.4 monospace;white-space:pre-wrap;word-break:break-word}.empty-log-row{text-align:center;color:#777;padding:28px!important}.pagination{display:flex;justify-content:center;align-items:center;gap:12px;padding:14px;border-top:1px solid #e1e1e1;font-size:12px}
@media(max-width:900px){.logs-page{padding:12px 10px 70px}.log-filters{grid-template-columns:repeat(2,minmax(130px,1fr))}.log-search{grid-column:span 2}}@media(max-width:520px){.log-filters{grid-template-columns:1fr}.log-search{grid-column:auto}.log-filter-actions{align-items:stretch}.pagination{justify-content:space-between}}
/* Stage 12: Gammu SMS history and password generator */
.sms-history-page,.password-page{max-width:1500px;margin:0 auto;padding:18px 28px 70px}.sms-history-card,.password-card{border:1px solid #d5d5d5;border-radius:4px;background:#fff;overflow:hidden}.sms-history-card>h1,.password-card>h1{font-size:14px;font-weight:normal;margin:0;padding:11px 15px;background:#f7f7f7;border-bottom:1px solid #d9d9d9}.sms-history-filters{display:grid;grid-template-columns:2fr 1fr 1fr auto;gap:10px;padding:14px 15px;border-bottom:1px solid #e1e1e1;background:#fcfcfc}.sms-history-filters label{display:flex;flex-direction:column;gap:5px;font-size:12px;font-weight:bold}.sms-history-filters input{box-sizing:border-box;width:100%;padding:7px;border:1px solid #b9c0c6;border-radius:3px;background:#fff}.sms-history-actions{display:flex;align-items:flex-end;gap:7px}.sms-history-summary{padding:9px 15px;color:#66717b;font-size:12px;border-bottom:1px solid #e6e6e6}.sms-history-message{padding:18px}.sms-history-table-wrap{overflow:auto}.sms-history-table{min-width:980px}.sms-history-table th,.sms-history-table td{font-size:12px;vertical-align:top}.sms-history-table th{background:#f4f4f4}.sms-number,.sms-date{white-space:nowrap}.sms-number{font-weight:bold;color:#285f88}.sms-content{min-width:300px;max-width:650px;white-space:normal;word-break:break-word}.sms-status{font-weight:bold}.password-content{padding:20px;max-width:700px}.password-output-row{display:flex;gap:8px;margin:16px 0 8px}.password-output-row input{flex:1;min-width:0;padding:11px;border:1px solid #9da6ad;border-radius:4px;font:18px monospace;letter-spacing:.5px}.password-options{display:grid;grid-template-columns:repeat(2,minmax(220px,1fr));gap:12px;margin:20px 0}.password-options label{display:flex;align-items:center;gap:8px;font-size:13px}.password-options input[type=number]{width:90px;padding:7px;border:1px solid #b9c0c6;border-radius:3px}.password-strength{display:grid;grid-template-columns:1fr auto;gap:10px;align-items:center;color:#69757e;font-size:12px}.password-strength span{height:6px;background:#ddd;border-radius:4px;overflow:hidden}.password-strength span:after{content:"";display:block;height:100%;width:20%;background:#c44}.strength-2 span:after{width:45%;background:#d89015}.strength-3 span:after{width:70%;background:#6da83c}.strength-4 span:after{width:100%;background:#2f9d50}.password-generate{padding:9px 15px}
@media(max-width:900px){.sms-history-page,.password-page{padding:12px 10px 70px}.sms-history-filters{grid-template-columns:1fr 1fr}.sms-history-actions{grid-column:span 2}.password-options{grid-template-columns:1fr}}@media(max-width:540px){.sms-history-filters{grid-template-columns:1fr}.sms-history-actions{grid-column:auto;flex-wrap:wrap}.password-output-row{flex-direction:column}}
/* Stage 12b: password book compatible with legacy passwords table */
.password-book-page{max-width:1760px;margin:0 auto;padding:18px 20px 70px}.password-book-page>.msg{margin:0 0 12px}.password-book-card{border:1px solid #d5d5d5;border-radius:4px;background:#fff;overflow:hidden;margin-bottom:20px}.password-book-card>h1{font-size:14px;font-weight:normal;margin:0;padding:11px 15px;background:#f7f7f7;border-bottom:1px solid #d9d9d9}.password-entry-form{margin:0}.password-entry-table-wrap{overflow-x:auto;padding-bottom:92px}.password-entry-table{width:100%;min-width:1530px;border-collapse:collapse;table-layout:fixed}.password-entry-table th{padding:8px 6px 6px;border-bottom:1px solid #d8d8d8;text-align:left;font-size:12px;white-space:nowrap;background:#fff}.password-entry-table td{padding:8px 5px;vertical-align:middle}.password-entry-table th:nth-child(1),.password-entry-table td:nth-child(1){width:11%}.password-entry-table th:nth-child(2),.password-entry-table td:nth-child(2){width:11%}.password-entry-table th:nth-child(3),.password-entry-table td:nth-child(3){width:7%}.password-entry-table th:nth-child(4),.password-entry-table td:nth-child(4){width:11%}.password-entry-table th:nth-child(5),.password-entry-table td:nth-child(5){width:11%}.password-entry-table th:nth-child(6),.password-entry-table td:nth-child(6){width:8%}.password-entry-table th:nth-child(7),.password-entry-table td:nth-child(7){width:11%}.password-entry-table th:nth-child(8),.password-entry-table td:nth-child(8){width:11%}.password-entry-table th:nth-child(9),.password-entry-table td:nth-child(9){width:7%}.password-entry-table th:nth-child(10),.password-entry-table td:nth-child(10){width:11%}.password-entry-table th:nth-child(11),.password-entry-table td:nth-child(11){width:48px}.password-entry-table input,.password-entry-table select{box-sizing:border-box;width:100%;height:34px;padding:6px;border:1px solid #c2c8cd;border-radius:3px;background:#fff;font-size:12px}.password-entry-actions{display:flex;align-items:center;gap:4px}.icon-button.add{background:#4fc064;font-size:22px;font-weight:bold}.icon-button.cancel{background:#8b949e;font-size:20px}.password-book-table-wrap{overflow:auto}.password-book-table{min-width:1530px;width:100%;border-collapse:collapse}.password-book-table th,.password-book-table td{padding:8px 7px;border-bottom:1px solid #ddd;text-align:left;font-size:12px;vertical-align:middle}.password-book-table th{background:#fff;white-space:nowrap}.password-book-table td{white-space:nowrap}.password-book-table td:nth-child(11){white-space:normal;min-width:120px}.text-active{color:#079000}.text-inactive{color:#b42318}.date-alert{color:#e10000;font-weight:bold}.password-actions{display:flex;gap:4px}.password-actions form{margin:0}.icon-button{display:inline-flex;align-items:center;justify-content:center;width:26px;height:26px;padding:0;border:0;border-radius:3px;color:#fff;text-decoration:none;font-size:15px;cursor:pointer}.icon-button.edit{background:#4fc064}.icon-button.delete{background:#ef5555}.icon-button.send{background:#287fb7}.password-sms-content{padding:16px}.password-sms-card .manual-sms-form{max-width:470px}.password-sms-card .manual-sms-form input,.password-sms-card .manual-sms-form textarea,.password-sms-card .sms-form-meta{width:455px}.generated-password{color:red;font-size:14px}.password-sms-buttons{display:flex;gap:8px;margin-top:8px}@media(max-width:1250px){.password-entry-table-wrap{padding-bottom:28px}}@media(max-width:700px){.password-book-page{padding:12px 10px 70px}.password-entry-table-wrap{padding-bottom:20px}.password-sms-card .manual-sms-form input,.password-sms-card .manual-sms-form textarea,.password-sms-card .sms-form-meta{width:100%}}

/* Stage 15: wykresy danych historycznych */
.charts-body{background:#f7f7f7}.charts-page{max-width:none;margin:0;padding:16px 6px 62px}.chart-toolbar,.chart-range-bar{display:flex;align-items:center;gap:5px;flex-wrap:wrap;margin-bottom:8px}.chart-tab,.chart-range-bar button{border:1px solid #bfc3c7;border-radius:3px;background:#fff;padding:5px 8px;font-size:12px;color:#1d252c;cursor:pointer}.chart-tab.active,.chart-range-bar button.active{background:#e7e7e7;border-color:#979da2;box-shadow:inset 0 1px 2px rgba(0,0,0,.12)}.chart-tab.disabled{color:#94999d;cursor:not-allowed}.chart-range-bar strong{font-size:13px;margin-right:3px}.chart-shell{position:relative;background:#303032;color:#fff;border:1px solid #242426;overflow:hidden}.chart-heading{text-align:center;padding:8px 60px 4px}.chart-heading h1{margin:0;font-size:16px;font-weight:normal}.chart-build-time{margin-top:3px;font-size:11px;font-weight:bold}.chart-canvas-wrap{position:relative;width:100%}.chart-canvas-wrap canvas,.chart-navigator-wrap canvas{display:block;width:100%}.chart-navigator-wrap{padding:4px 12px 0}.chart-tooltip{position:absolute;z-index:3;min-width:145px;padding:7px 9px;background:rgba(20,20,20,.94);border:1px solid #777;border-radius:3px;color:#fff;font-size:11px;line-height:1.45;pointer-events:none}.chart-legend{min-height:27px;text-align:center;padding:8px;font-size:12px}.chart-legend-line{display:inline-block;width:20px;border-top:2px solid #20a1a4;margin:0 7px 3px 0}.chart-message{padding:10px;text-align:center;font-size:12px}.chart-message.error{background:#732525;color:#fff}.chart-options{display:flex;align-items:flex-end;gap:18px;flex-wrap:wrap;padding:18px 22px;border:1px solid #d5d5d5;border-top:0;background:#fff}.chart-options label{display:flex;align-items:center;gap:8px;font-size:12px;font-weight:bold}.chart-options select{min-width:95px;padding:7px;border:1px solid #b9c0c6;border-radius:3px;background:#fff}.chart-options label:first-child select{min-width:330px}.chart-check{padding-bottom:8px}.chart-primary-button{margin-left:auto;border:1px solid #1766b2;border-radius:3px;background:#2d78d5;color:#fff;padding:9px 20px;cursor:pointer}.chart-primary-button:hover{background:#2369bc}.chart-noscript{padding:12px;background:#ffe8b4;border:1px solid #d5ae55}.charts-body .system-footer{position:fixed;bottom:0;left:0;right:0;z-index:5}
@media(max-width:800px){.charts-page{padding:10px 5px 72px}.chart-heading{padding-left:8px;padding-right:8px}.chart-options{gap:12px;padding:14px 10px}.chart-options label:first-child{width:100%}.chart-options label:first-child select{min-width:0;flex:1}.chart-primary-button{margin-left:0;width:100%}.chart-canvas-wrap canvas{min-height:360px}}

/* Stage 17: wspólna nawigacja i stopka */
.admin-body{padding-bottom:38px;background:#f7f7f7}.admin-body .admin-page{max-width:1500px;padding-top:18px}.admin-nav.graphic-nav{display:flex;align-items:stretch;gap:0;margin:0 0 20px;border:1px solid #d7d7d7;border-radius:4px;background:#fafafa;overflow-x:auto;box-shadow:0 1px 2px rgba(0,0,0,.04)}.admin-nav.graphic-nav a{display:flex;align-items:center;gap:8px;min-height:43px;padding:0 15px;border:0;border-right:1px solid #e4e4e4;border-radius:0;background:transparent;color:#59616a;font-family:Georgia,serif;white-space:nowrap}.admin-nav.graphic-nav a:hover,.admin-nav.graphic-nav a.active{background:#ececec;color:#2c3c4b;font-weight:normal}.admin-nav.graphic-nav a.active{box-shadow:inset 0 -3px 0 #2787d9}.admin-nav.graphic-nav .panel-link{margin-left:auto;border-left:1px solid #e4e4e4;border-right:0}.admin-nav.graphic-nav .nav-icon{width:18px;text-align:center;color:#276fa8;font-family:Arial,sans-serif}.admin-body .box{box-shadow:0 1px 1px rgba(0,0,0,.03)}
@media(max-width:760px){.admin-body .admin-page{padding:12px 10px 88px}.admin-nav.graphic-nav{margin-bottom:14px}.admin-nav.graphic-nav a{min-height:42px;padding:0 12px}.admin-nav.graphic-nav .panel-link{margin-left:0}.admin-body{padding-bottom:70px}}

.section-tabs{display:flex;gap:.35rem;flex-wrap:wrap;margin:1rem 0 1.2rem;padding-bottom:.7rem;border-bottom:1px solid rgba(255,255,255,.12)}
.section-tabs a{display:inline-flex;align-items:center;min-height:38px;padding:.55rem .9rem;border:1px solid rgba(255,255,255,.15);border-radius:6px;text-decoration:none;color:inherit;background:rgba(255,255,255,.035)}
.section-tabs a:hover,.section-tabs a.active{background:rgba(255,255,255,.12);border-color:rgba(255,255,255,.3)}
.settings-form{max-width:900px}.settings-row{display:grid;grid-template-columns:minmax(240px,320px) minmax(280px,1fr);gap:16px;align-items:center}.settings-row label{margin:0;font-size:14px;font-weight:bold}.settings-form input{box-sizing:border-box;width:100%;min-height:42px;padding:.55rem .65rem;border:1px solid #bfc9d3;border-radius:6px;background:#fff;font:14px Arial,sans-serif}.settings-form input:focus{outline:2px solid rgba(39,135,217,.22);border-color:#2787d9}.settings-help{margin:10px 0 0;padding-left:336px;font-size:13px;line-height:1.45}.settings-form .page-actions{margin-top:18px}.system-settings-box{padding:20px 22px}@media(max-width:700px){.settings-row{grid-template-columns:1fr;gap:7px}.settings-help{padding-left:0}.system-settings-box{padding:18px}}.sms-history-filters select{min-height:42px;padding:.55rem .65rem}

/* Stage 20: spójne przyciski filtrów i zakładek */
.filter-action-button,.sms-history-actions .filter-action-button,.log-filter-actions .filter-action-button{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;min-width:104px;height:42px;padding:0 16px;border:1px solid #1874be;border-radius:6px;background:#2787d9;color:#fff;font-size:13px;font-weight:normal;line-height:1;text-align:center;white-space:nowrap;cursor:pointer}
.filter-action-button:hover,.filter-action-button:focus{background:#1f73bd;color:#fff;border-color:#155f9e}
.section-tabs{display:flex;gap:7px;flex-wrap:wrap;margin:14px 15px 18px;padding:0 0 12px;border-bottom:1px solid #dfe5eb}
.section-tabs a{box-sizing:border-box;display:inline-flex;align-items:center;justify-content:center;min-width:112px;min-height:42px;padding:0 16px;border:1px solid #1874be;border-radius:6px;background:#2787d9;color:#fff;text-decoration:none;font-size:13px;white-space:nowrap}
.section-tabs a:hover,.section-tabs a:focus{background:#1f73bd;color:#fff;border-color:#155f9e}
.section-tabs a.active{background:#155f9e;color:#fff;border-color:#0f4e84;box-shadow:inset 0 -3px 0 rgba(255,255,255,.28)}
@media(max-width:540px){.filter-action-button,.sms-history-actions .filter-action-button,.log-filter-actions .filter-action-button{flex:1;min-width:96px}.section-tabs{margin-left:10px;margin-right:10px}.section-tabs a{flex:1;min-width:96px}}

/* Stage 22: biblioteka grafik widgetów */
.brand-logo{height:55px;object-fit:contain}.widget-image-preview,.upload-preview{display:block;max-width:160px;max-height:160px;margin-top:8px;border:1px solid #d6dde4;border-radius:6px;background:#fff;object-fit:contain}.image-library-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:12px}.image-library-card{display:grid;grid-template-columns:96px 1fr auto;gap:12px;align-items:center;padding:12px;border:1px solid #d8dee5;border-radius:7px;background:#fff}.image-library-card>img{width:96px;height:96px;object-fit:contain;background:#f4f6f8;border-radius:5px}.image-library-card small{display:block;margin-top:4px;color:#69737d}.dashboard-device-image{flex:0 0 auto;width:72px;height:72px;margin-left:10px;object-fit:contain;border-radius:6px}.dashboard-row.compact .dashboard-device-image{width:54px;height:54px}@media(max-width:620px){.image-library-card{grid-template-columns:72px 1fr}.image-library-card>img{width:72px;height:72px}.image-library-card form{grid-column:1/-1}.dashboard-device-image{width:52px;height:52px}}

/* Stage 22.1: rozbudowana biblioteka grafik */
.upload-drop-zone{position:relative;display:flex;min-height:110px;align-items:center;justify-content:center;flex-direction:column;gap:5px;padding:18px;border:2px dashed #aebbc7;border-radius:8px;background:#f8fafc;cursor:pointer;text-align:center}.upload-drop-zone.dragover{border-color:#2787d9;background:#eef7ff}.upload-drop-zone input{position:absolute;inset:0;width:100%;height:100%;opacity:0;cursor:pointer}.upload-progress-wrap{display:flex;align-items:center;gap:10px;min-width:260px}.upload-progress-wrap progress{width:220px;height:16px}.library-filters{display:flex;align-items:end;flex-wrap:wrap;gap:10px;margin:14px 0 18px}.library-filters label{display:flex;flex-direction:column;gap:5px}.library-filters input,.library-filters select{min-width:220px;padding:9px;border:1px solid #bfc9d3;border-radius:6px}.library-filters button{padding:9px 14px;border:0;border-radius:6px;background:#2787d9;color:#fff;cursor:pointer}.image-card-info{min-width:0}.usage-badge{display:inline-block;margin-top:7px;padding:4px 7px;border-radius:999px;background:#e8f1f8;color:#315b78;font-size:11px;font-weight:bold}.image-card-actions{display:flex;flex-direction:column;gap:7px;align-items:stretch}.image-card-actions details{position:relative}.image-card-actions summary{list-style:none;cursor:pointer;text-align:center}.image-card-actions details form{position:absolute;right:0;z-index:4;width:260px;padding:10px;border:1px solid #d8dee5;border-radius:7px;background:#fff;box-shadow:0 8px 20px rgba(0,0,0,.12)}.image-card-actions details input{width:100%;margin-bottom:8px}.image-card-actions button{width:100%}@media(max-width:700px){.library-filters>*{width:100%}.library-filters input,.library-filters select{width:100%;min-width:0}.upload-progress-wrap{min-width:0;width:100%}.upload-progress-wrap progress{flex:1}.image-card-actions{grid-column:1/-1;flex-direction:row}.image-card-actions details,.image-card-actions>form{flex:1}.image-card-actions details form{left:0;right:auto;width:min(260px,80vw)}}

/* Stage 22.2: małe ikony czujników, GPIO i hostów po lewej stronie */
.dashboard-small-icon{display:block;width:16px;height:16px;object-fit:contain;margin:0 auto}.row-icon{flex:0 0 18px;display:flex;align-items:center;justify-content:center}

/* Ukrywanie pustych podglądów grafik */
.widget-image-preview[hidden],.upload-preview[hidden]{display:none!important}.widget-image-preview:not([hidden]),.upload-preview:not([hidden]){display:block}

/* Stage 23.1: konfiguracja i widgety UPS */
.ups-editor{padding:0}.ups-editor>.section-heading{padding:16px 18px;border-bottom:1px solid #dfe5eb}.ups-config-grid{grid-template-columns:repeat(3,minmax(220px,1fr))}.ups-toggle-row{flex-wrap:wrap;gap:24px}.ups-recovery-note{margin:0 0 18px;padding:10px 12px;border-left:4px solid #e7a82e;background:#fff8e7;color:#654b12;font-size:13px}.ups-detection-heading form{flex:0 0 auto}.ups-detection-heading button,.ups-parameters-box button,.ups-editor button:not(.danger){padding:9px 13px;border:0;border-radius:5px;background:#2787d9;color:#fff;cursor:pointer}.ups-parameters-table{min-width:1180px}.ups-parameters-table input,.ups-parameters-table select{box-sizing:border-box;width:100%;padding:7px;border:1px solid #bfc9d3;border-radius:5px;background:#fff}.ups-parameters-table .compact-input{width:82px}.ups-parameters-table .unit-input{width:76px}.ups-parameters-table .large-check{width:20px;height:20px}.center-cell{text-align:center}.ups-icon-cell{min-width:220px}.ups-parameter-icon-preview{max-width:42px;max-height:42px;margin-top:6px}.ups-parameter-missing{opacity:.62;background:#f7f7f7}
.ups-device{padding:2px 0 8px}.ups-device+.ups-device{border-top:1px solid #ddd;margin-top:10px;padding-top:10px}.ups-device-title{margin:0 0 8px;font-size:13px;font-weight:600}.ups-widget-layout{display:flex;align-items:center;gap:10px}.ups-parameter-list{min-width:0;flex:1}.ups-parameter-row{display:grid;grid-template-columns:18px minmax(120px,1fr) auto;gap:4px;align-items:center;min-height:25px;font-size:12px}.ups-parameter-icon{display:flex;width:16px;height:16px;align-items:center;justify-content:center;color:#276fa8}.ups-parameter-icon img{display:block;width:16px;height:16px;object-fit:contain}.ups-parameter-label{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.ups-parameter-value{text-align:right;white-space:nowrap}.ups-parameter-value small{display:block;color:#888;font-size:9px}.ups-status-value.online{color:#188038}.ups-status-value.battery,.ups-status-value.offline{color:#d93025}.ups-status-value.recovering,.ups-status-value.unstable,.ups-status-value.bypass{color:#d17900}.ups-status-value.unknown{color:#6c757d}.ups-stale-value{color:#777}.ups-connection-note{margin-top:7px;padding-top:6px;border-top:1px dotted #e3e3e3;color:#777;font-size:10px}.ups-connection-note span{display:block;margin-top:2px;color:#a22}.ups-device.has-stale-data .dashboard-device-image{opacity:.45;filter:grayscale(100%)}.ups-device .dashboard-device-image{flex:0 0 96px;width:96px;height:112px;margin-left:auto;border-radius:0}.ups-device.is-battery{border-left:3px solid #d93025;padding-left:8px}.ups-device.is-recovering,.ups-device.is-unstable{border-left:3px solid #e7a82e;padding-left:8px}.ups-device.is-offline{border-left:3px solid #d93025;padding-left:8px}
@media(max-width:1000px){.ups-config-grid{grid-template-columns:repeat(2,1fr)}}@media(max-width:650px){.ups-config-grid{grid-template-columns:1fr}.ups-widget-layout{align-items:flex-start}.ups-device .dashboard-device-image{flex-basis:68px;width:68px;height:88px}.ups-parameter-row{grid-template-columns:18px 1fr}.ups-parameter-value{grid-column:2;text-align:left}.ups-detection-heading{align-items:stretch;flex-direction:column}}

/* Stage 23.2: wykresy hostów, UPS i statystyk systemu. */
.chart-source-info{min-height:18px;margin:-2px 0 8px;padding:0 2px;color:#555f66;font-size:12px;line-height:1.4}.chart-tab.disabled{opacity:.58}.chart-options #chart-series{max-width:min(560px,70vw)}
@media(max-width:800px){.chart-source-info{margin-bottom:7px}.chart-options #chart-series{max-width:none;width:100%}}

/* Stage 23.3: konfigurowalne tło strony głównej. */
.home-dashboard-body{display:flex;min-height:100vh;box-sizing:border-box;flex-direction:column;background:#fff}.home-dashboard-body .topbar{flex:0 0 auto}.dashboard-stage{box-sizing:border-box;display:block;flex:1 0 auto;width:100%;max-width:none;min-height:calc(100vh - 88px);margin:0;padding:0;background-color:#fff;background-image:none;background-position:center center;background-repeat:no-repeat;background-size:cover}.dashboard-stage .dashboard-page{box-sizing:border-box;width:100%}.dashboard-stage.has-dashboard-background{background-color:#28333d}.dashboard-stage.has-dashboard-background .status-card{border-color:rgba(205,211,216,.94);background:rgba(255,255,255,.94);box-shadow:0 2px 8px rgba(0,0,0,.12);backdrop-filter:blur(2px)}.dashboard-stage.has-dashboard-background .status-card h2{background:rgba(247,247,247,.94)}.dashboard-stage.has-dashboard-background .dashboard-alert{background:rgba(255,241,241,.96)}
.settings-row-background{align-items:start;margin-top:22px;padding-top:22px;border-top:1px solid #e1e6eb}.dashboard-background-control{min-width:0}.dashboard-background-control>input[type=file]{height:auto;min-height:42px;padding:8px}.dashboard-background-control>small{display:block;margin-top:7px;line-height:1.45}.dashboard-background-current{max-width:720px;margin:16px 0 10px}.dashboard-background-preview{display:block;box-sizing:border-box;width:100%;max-height:340px;border:1px solid #cbd4dc;border-radius:8px;background:#eef1f4;object-fit:cover}.dashboard-background-current figcaption{margin-top:7px;color:#65717e;font-size:12px}.dashboard-background-remove{display:inline-flex!important;align-items:center;gap:8px;margin-top:6px;font-size:13px;font-weight:normal!important;cursor:pointer}.settings-form .dashboard-background-remove input{width:18px;height:18px;min-height:0;margin:0}.dashboard-background-empty{margin:12px 0 0;font-size:13px}
@media(max-width:760px){.home-dashboard-body{padding-bottom:70px}.dashboard-stage{min-height:calc(100vh - 124px)}.dashboard-stage.has-dashboard-background{background-position:center top}.dashboard-background-preview{max-height:240px}}
.dashboard-background-upload-preview{display:block;box-sizing:border-box;width:100%;max-width:720px;max-height:340px;margin-top:12px;border:1px solid #cbd4dc;border-radius:8px;background:#eef1f4;object-fit:cover}.dashboard-background-upload-preview[hidden]{display:none!important}
/* Stage 23.3.1: graficzne stany zadań diagnostycznych */
.diagnostic-icon{display:flex;align-items:center;justify-content:center;width:17px;height:17px;color:inherit}
.diagnostic-state-image{display:block;width:16px;height:16px;object-fit:contain}
.diagnostic-row.is-disabled>span:nth-child(2){color:#7f878d}
.diag-disabled{color:#c62828}

/* Stage 23.3.2: tło dashboardu jest ustawiane bezpośrednio w stylu elementu, aby względny URL był rozwiązywany względem strony głównej. */

/* Stage 23.3.3: kontrolki nad wykresem i wieloseryjny wykres UPS. */
.chart-options-top{margin:0 0 10px;border:1px solid #d5d5d5;border-radius:4px;background:#fff}
.chart-options-top label:first-child select{min-width:330px}
.chart-legend{display:flex;min-height:27px;align-items:center;justify-content:center;gap:8px 18px;flex-wrap:wrap}
.chart-legend-item{display:inline-flex;align-items:center;white-space:nowrap}
.chart-legend-item .chart-legend-line{flex:0 0 20px;margin-right:7px}
.chart-tooltip{max-width:min(360px,calc(100vw - 30px))}
.chart-tooltip-color{display:inline-block;width:9px;height:9px;margin-right:5px;border-radius:50%}
.chart-tooltip-indent{display:inline-block;padding-left:14px;color:#cfd4d8}
@media(max-width:800px){.chart-options-top{align-items:stretch}.chart-options-top label:first-child select{min-width:0;width:100%}.chart-legend{justify-content:flex-start;text-align:left}.chart-legend-item{white-space:normal}}

/* Stage 23.3.5: wspólne tło interfejsu poza zakładką Wykresy. */
.site-has-background{background:#28333d}
.site-background-layer{position:fixed;z-index:0;top:55px;right:0;bottom:33px;left:0;background-color:#28333d;background-position:center center;background-repeat:no-repeat;background-size:cover;pointer-events:none}
.site-has-background>.topbar{position:relative;z-index:30}
.site-has-background>main{position:relative;z-index:1}
.site-has-background .dashboard-stage{background:transparent}
.site-has-background .status-card,
.site-has-background .box,
.site-has-background .sms-compose-card,
.site-has-background .sms-history-card,
.site-has-background .password-card,
.site-has-background .logs-card,
.site-has-background .password-book-card,
.site-has-background .graphic-nav,
.site-has-background .config-panel{border-color:rgba(205,211,216,.94);background:rgba(255,255,255,.94);box-shadow:0 2px 8px rgba(0,0,0,.14);backdrop-filter:blur(2px)}
.site-has-background .status-card h2,
.site-has-background .sms-compose-card h1,
.site-has-background .sms-history-card>h1,
.site-has-background .password-card>h1,
.site-has-background .logs-card>h1,
.site-has-background .password-book-card>h1{background:rgba(247,247,247,.95)}
.site-has-background .dashboard-alert{background:rgba(255,241,241,.97)}
@media(max-width:760px){.site-background-layer{top:99px;bottom:33px;background-position:center top}}

/* Stage 23.3.5: generator i sortowanie książki haseł. */
.password-sort-hint{padding:8px 14px;border-bottom:1px solid #e2e2e2;background:rgba(248,250,252,.95);color:#65717e;font-size:11px}
.password-sort-link{display:inline-flex;align-items:center;color:#1e5f91;text-decoration:none;font-weight:700}
.password-sort-link:hover{text-decoration:underline}
.password-generator-settings{display:flex;align-items:flex-end;gap:18px;flex-wrap:wrap;max-width:760px;margin:0 0 16px;padding:13px;border:1px solid #d8e0e7;border-radius:6px;background:#f8fafc}
.password-generator-settings>label{display:flex;flex-direction:column;gap:6px;min-width:145px}
.password-generator-settings input[type=number]{box-sizing:border-box;width:120px;height:36px;padding:6px 8px;border:1px solid #bfc9d3;border-radius:4px;background:#fff}
.password-generator-settings fieldset{display:flex;align-items:center;gap:12px;flex-wrap:wrap;margin:0;padding:8px 12px;border:1px solid #cfd7df;border-radius:5px;background:#fff}
.password-generator-settings legend{padding:0 5px;font-size:12px;font-weight:700}
.password-generator-settings fieldset label{display:inline-flex;align-items:center;gap:5px;white-space:nowrap;font-size:12px}
.password-generator-settings input[type=checkbox]{width:17px;height:17px;margin:0}
#password-generator-error{max-width:730px;margin:0 0 12px}
@media(max-width:700px){.password-generator-settings{align-items:stretch;flex-direction:column}.password-generator-settings input[type=number]{width:100%}.password-generator-settings fieldset{align-items:flex-start;flex-direction:column}}

/* Stage 23.3.6: kontrast nagłówków ustawień i poprawne linie tabel konfiguracyjnych. */
.site-has-background .admin-page > h1{
    box-sizing:border-box;
    margin:16px 0 0;
    padding:16px 20px 9px;
    border:1px solid rgba(205,211,216,.96);
    border-bottom:0;
    border-radius:10px 10px 0 0;
    background:rgba(255,255,255,.95);
    box-shadow:0 2px 8px rgba(0,0,0,.14);
    color:#202a33;
    text-shadow:none;
    backdrop-filter:blur(3px)
}
.site-has-background .admin-page > h1 + .lead{
    box-sizing:border-box;
    margin:0 0 16px;
    padding:0 20px 16px;
    border:1px solid rgba(205,211,216,.96);
    border-top:0;
    border-radius:0 0 10px 10px;
    background:rgba(255,255,255,.95);
    box-shadow:0 4px 8px rgba(0,0,0,.14);
    color:#52606d;
    line-height:1.45;
    text-shadow:none;
    backdrop-filter:blur(3px)
}
.site-has-background .admin-page > h1:not(:has(+ .lead)){
    margin-bottom:16px;
    padding-bottom:16px;
    border-bottom:1px solid rgba(205,211,216,.96);
    border-radius:10px
}
.site-has-background .admin-page > h1 + .msg{
    margin-top:0
}

/* Nie wolno zmieniać komórki TD na flex — rozrywa to geometrię wiersza i linię dolną. */
td.actions{
    display:table-cell;
    box-sizing:border-box;
    vertical-align:middle;
    white-space:nowrap
}
td.actions > a,
td.actions > form{
    display:inline-block;
    vertical-align:middle
}
td.actions > a + form,
td.actions > form + a,
td.actions > form + form{
    margin-left:6px
}
td.actions > form{margin-top:0;margin-bottom:0}
td.actions .button,
td.actions button{
    box-sizing:border-box;
    display:inline-flex;
    min-height:34px;
    align-items:center;
    justify-content:center;
    line-height:1.1
}

@media(max-width:700px){
    .site-has-background .admin-page > h1{padding:14px 16px 8px}
    .site-has-background .admin-page > h1 + .lead{padding:0 16px 14px}
    td.actions{white-space:normal}
    td.actions > a,
    td.actions > form{margin:2px 3px 2px 0}
    td.actions > a + form,
    td.actions > form + a,
    td.actions > form + form{margin-left:0}
}


/* Stage 23.3.7: nagłówki stron ustawień opakowane w element <header>. */
.site-has-background .admin-page > header{
    box-sizing:border-box;
    margin:16px 0;
    padding:16px 20px;
    border:1px solid rgba(205,211,216,.96);
    border-radius:10px;
    background:rgba(255,255,255,.95);
    box-shadow:0 4px 8px rgba(0,0,0,.14);
    color:#202a33;
    text-shadow:none;
    backdrop-filter:blur(3px)
}
.site-has-background .admin-page > header > h1{
    margin:0 0 7px;
    color:#202a33;
    text-shadow:none
}
.site-has-background .admin-page > header > .lead{
    margin:0;
    color:#52606d;
    line-height:1.45;
    text-shadow:none
}
.site-has-background .admin-page > header > .lead:last-child{margin-bottom:0}

@media(max-width:700px){
    .site-has-background .admin-page > header{padding:14px 16px}
}

/* Stage 24.1: konfiguracja domen i monitoring HTTP/HTTPS. */
.status.slow{background:#fff2cc;color:#725000}
.domain-time-ok{color:#176b36}
.domain-time-slow{color:#9a6500}
.domain-url-cell{max-width:340px}
.domain-url-cell>a,.domain-url-cell small{display:block;max-width:340px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.domain-url-cell>a{color:#17699e;text-decoration:none}
.domain-url-cell>a:hover{text-decoration:underline}
.domain-config-table td{vertical-align:middle}
@media(max-width:900px){.domain-url-cell,.domain-url-cell>a,.domain-url-cell small{max-width:240px}}

/* Stage 24.2: ważność domen i certyfikatów SSL/TLS */
.domain-config-table-expanded{min-width:1420px}
.domain-health-cell{min-width:190px}
.domain-health-cell>strong{display:block;margin-top:7px;font-size:15px}
.domain-health-badge{display:inline-flex;align-items:center;min-height:25px;padding:4px 8px;border-radius:999px;font-size:12px;font-weight:bold;line-height:1.1}
.domain-health-badge.health-ok{background:#e4f6ea;color:#176b36}
.domain-health-badge.health-warning{background:#fff2cc;color:#725000}
.domain-health-badge.health-error{background:#fde4e4;color:#8b1d1d}
.domain-health-badge.health-unknown{background:#e8edf2;color:#3f4e5c}
.domain-support-note{font-size:13px;line-height:1.5}
.domain-support-note code{white-space:nowrap}

/* Stage 24.3: monitoring domen w układzie plastra miodu. */
.domain-monitor-card{margin:0 0 14px}
.domain-monitor-card .card-content{padding:18px 16px 24px;overflow:hidden}
.domain-honeycomb{display:flex;align-items:flex-start;justify-content:center;gap:8px 4px;flex-wrap:wrap;padding:2px 0 34px}
.domain-honeycomb-item{width:196px;height:170px;filter:drop-shadow(0 3px 4px rgba(0,0,0,.18));transition:transform .15s ease,filter .15s ease}
.domain-honeycomb-item:nth-child(even){transform:translateY(34px)}
.domain-honeycomb-item:hover{filter:drop-shadow(0 5px 7px rgba(0,0,0,.24))}
.domain-honeycomb-item:nth-child(even):hover{transform:translateY(31px)}
.domain-honeycomb-item:nth-child(odd):hover{transform:translateY(-3px)}
.domain-hexagon{box-sizing:border-box;width:100%;height:100%;padding:22px 30px 18px;clip-path:polygon(25% 0,75% 0,100% 50%,75% 100%,25% 100%,0 50%);display:flex;flex-direction:column;align-items:stretch;justify-content:center;text-align:center;color:#26313a;background:#e8edf2}
.domain-honeycomb-item.state-green .domain-hexagon{background:rgba(220,244,226,.97)}
.domain-honeycomb-item.state-yellow .domain-hexagon{background:rgba(255,241,190,.98)}
.domain-honeycomb-item.state-red .domain-hexagon{background:rgba(250,216,216,.98)}
.domain-honeycomb-item.state-gray .domain-hexagon{background:rgba(225,231,236,.98)}
.domain-hex-name{max-width:140px;margin:0 auto 1px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:800;color:#17232c}
.domain-hex-label{max-width:140px;margin:0 auto 7px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:10px;color:#5c6974}
.domain-hex-metric{display:grid;grid-template-columns:48px 1fr;align-items:center;gap:5px;min-height:25px;border-top:1px solid rgba(50,65,75,.13);font-size:11px;text-align:left}
.domain-hex-metric:first-of-type{border-top:0}
.domain-hex-metric span{color:#5c6974;font-weight:700}
.domain-hex-metric strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:right;font-size:11px;color:#33414b}
.domain-hex-metric.state-green strong{color:#176b36}
.domain-hex-metric.state-yellow strong{color:#8b6500}
.domain-hex-metric.state-red strong{color:#a02020}
.domain-hex-metric.state-gray strong{color:#596874}
@media(max-width:760px){.domain-monitor-card .card-content{padding:14px 8px}.domain-honeycomb{gap:8px;padding-bottom:0}.domain-honeycomb-item{width:174px;height:151px}.domain-honeycomb-item:nth-child(even),.domain-honeycomb-item:nth-child(even):hover,.domain-honeycomb-item:nth-child(odd):hover{transform:none}.domain-hexagon{padding:18px 25px 15px}.domain-hex-name{font-size:13px}.domain-hex-label{margin-bottom:4px}.domain-hex-metric{grid-template-columns:42px 1fr;min-height:22px;font-size:10px}.domain-hex-metric strong{font-size:10px}}
@media(max-width:390px){.domain-honeycomb-item{width:160px;height:139px}.domain-hexagon{padding:16px 23px 13px}}

/* Stage 24.3.1: rozdzielenie stanu modułu od wyniku monitorowanych elementów. */
.diagnostic-row small .diag-detail-error{color:#c62828;font-weight:700}
.diagnostic-row small .diag-detail-warning{color:#a96b00;font-weight:700}
.domain-config-table td.actions .domain-refresh-button{background:#2787d9;color:#fff}


/* Stage 24.3.2: osobna strona Domeny i licznik problemów w menu. */
.topnav a .topnav-badge{display:inline-flex;align-items:center;justify-content:center;box-sizing:border-box;min-width:20px;height:20px;padding:0 5px;margin-left:1px;border-radius:999px;background:#e8edf2;color:#42515d;font-family:Arial,sans-serif;font-size:10px;font-weight:800;line-height:20px;text-align:center}
.topnav a .topnav-badge.is-empty{display:none}
.topnav a .topnav-badge.warning{background:#f2b632;color:#4d3500}
.topnav a .topnav-badge.error{background:#d94343;color:#fff}
.domain-status-page{padding-top:22px}
.domain-monitor-page-card{max-width:1500px;margin:0 auto}
.domain-page-summary{display:flex;align-items:center;justify-content:space-between;gap:16px;padding:10px 15px;border-bottom:1px solid #e1e5e8;background:rgba(249,250,251,.94);color:#68747e;font-size:12px}
.domain-page-summary-counts{display:flex;align-items:center;gap:12px;white-space:nowrap}
.domain-page-summary-counts span{display:inline-flex;align-items:center;gap:4px}
.domain-summary-warning strong{color:#9a6500}
.domain-summary-error strong{color:#b42318}
.domain-monitor-page-card .card-content{min-height:240px;padding-top:24px;padding-bottom:42px}
@media(max-width:760px){.topnav a .topnav-badge{min-width:18px;height:18px;padding:0 4px;font-size:9px;line-height:18px}.domain-status-page{padding-top:12px}.domain-page-summary{align-items:flex-start;flex-direction:column;gap:7px}.domain-page-summary-counts{gap:9px;white-space:normal}.domain-monitor-page-card .card-content{min-height:120px;padding-top:16px;padding-bottom:20px}}

/* Stage 25.1: logowanie, użytkownicy i uprawnienia. */
.auth-body{min-height:100vh;padding:0;background:linear-gradient(145deg,#eef3f7,#dce6ee);display:flex;align-items:center;justify-content:center}
.auth-shell{box-sizing:border-box;width:100%;max-width:560px;margin:0 auto;padding:28px}
.auth-card{box-sizing:border-box;width:100%;padding:28px;border:1px solid #cfd9e2;border-radius:12px;background:rgba(255,255,255,.97);box-shadow:0 12px 40px rgba(20,40,60,.16)}
.auth-card-wide{max-width:620px}.auth-logo{display:block;max-width:230px;max-height:64px;margin:0 auto 22px;object-fit:contain}.auth-card h1{margin:0 0 9px;text-align:center;font-size:24px}.auth-subtitle,.auth-card>p{text-align:center;color:#65717e}.auth-form{display:grid;gap:14px;margin-top:20px}.auth-form label{display:flex;flex-direction:column;gap:6px;font-weight:700;color:#3a4955}.auth-form input{box-sizing:border-box;width:100%;padding:11px 12px;border:1px solid #bfcbd5;border-radius:7px;background:#fff;font:inherit}.auth-form input:focus{outline:2px solid rgba(39,135,217,.22);border-color:#2787d9}.auth-submit{width:100%;padding:11px 14px;font-weight:700;cursor:pointer}.auth-command{overflow:auto;padding:12px;border-radius:7px;background:#eef2f5;text-align:left;font-size:12px}
.topbar-user{display:flex;align-items:center;gap:7px;margin-left:auto;padding:0 14px;border-left:1px solid #e6e6e6;font-family:Arial,sans-serif;white-space:nowrap}.topbar-user-name{max-width:150px;overflow:hidden;text-overflow:ellipsis;font-size:12px;font-weight:700;color:#354550}.topbar-user-role{padding:3px 6px;border-radius:999px;background:#e8edf2;color:#596874;font-size:9px;text-transform:uppercase;letter-spacing:.04em}.logout-form{margin:0}.logout-button{padding:5px 7px;border:1px solid #d5dde4;border-radius:5px;background:#fff;color:#53616d;font-size:10px;cursor:pointer}.logout-button:hover{background:#eef3f7;color:#243443}
.users-table{min-width:960px}.users-table td{vertical-align:middle}.users-table td.actions{white-space:nowrap}.table-action-buttons{display:flex;align-items:center;gap:6px}.table-action-buttons form{margin:0}.user-editor h3{margin:24px 0 8px}.permission-table-wrap{overflow-x:auto}.permission-table{max-width:820px}.permission-table th:nth-child(2),.permission-table th:nth-child(3),.permission-table td:nth-child(2),.permission-table td:nth-child(3){width:180px;text-align:center;vertical-align:middle}.permission-table td:first-child small{display:block;color:#65717e;font-weight:normal}.permission-check{display:inline-flex;align-items:center;gap:7px}.permission-check input{width:18px;height:18px}.permission-admin-only{font-size:12px;color:#8b1d1d;font-weight:700}.role-admin .permission-table{opacity:.62}.admin-readonly-banner{margin:-10px 0 18px;padding:10px 13px;border:1px solid #edcf7e;border-radius:7px;background:#fff4cf;color:#6f5200}.admin-readonly form[method="post"]{opacity:.72}.admin-readonly form[method="post"] button:disabled,.admin-readonly form[method="post"] input:disabled,.admin-readonly form[method="post"] select:disabled,.admin-readonly form[method="post"] textarea:disabled{cursor:not-allowed}
@media(max-width:1200px){.topbar-user-role{display:none}.topbar-user-name{max-width:100px}.topnav a{padding-left:12px;padding-right:12px}}
@media(max-width:760px){.auth-shell{padding:16px}.auth-card{padding:22px 18px}.topbar-user{justify-content:center;height:42px;margin-left:0;padding:0 10px;border-top:1px solid #e6e6e6;border-left:0}.topbar-user-role{display:inline-flex}.topbar-user-name{max-width:160px}.table-action-buttons{align-items:stretch;flex-direction:column}.table-action-buttons .button,.table-action-buttons button{box-sizing:border-box;width:100%;text-align:center}}
@media(max-width:760px){.site-has-background .site-background-layer{top:141px}}
.msg.warning{background:#fff2cc;color:#725000}

/* Stage 26.1: uniwersalny monitoring urządzeń SNMP. */
.dashboard-column-full{grid-column:1/-1}.snmp-dashboard-groups{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:12px}.snmp-group-card{min-width:0}.snmp-device-grid-dashboard{display:grid;grid-template-columns:repeat(2,minmax(280px,1fr));gap:10px}.snmp-device-card{padding:10px;border:1px solid #dce2e7;border-left:4px solid #8b969e;border-radius:5px;background:rgba(255,255,255,.8)}.snmp-device-card.state-ok{border-left-color:#4fbd62}.snmp-device-card.state-warning{border-left-color:#e7a82e}.snmp-device-card.state-error{border-left-color:#e35b58}.snmp-device-heading{display:flex;align-items:flex-start;justify-content:space-between;gap:10px;padding-bottom:7px;border-bottom:1px dotted #e1e5e8}.snmp-device-heading>div{min-width:0}.snmp-device-heading strong,.snmp-device-heading small{display:block}.snmp-device-heading strong{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-size:13px}.snmp-device-heading small{margin-top:2px;color:#7b8790;font-size:10px}.snmp-device-layout{display:flex;align-items:center;gap:10px;margin-top:7px}.snmp-device-values{min-width:0;flex:1}.snmp-parameter-row{display:grid;grid-template-columns:17px minmax(105px,1fr) auto;align-items:center;gap:5px;min-height:24px;border-bottom:1px dotted #eceff1;font-size:11px}.snmp-parameter-row:last-child{border-bottom:0}.snmp-parameter-icon{display:flex;width:16px;height:16px;align-items:center;justify-content:center;color:#2779aa}.snmp-parameter-icon img{display:block;width:16px;height:16px;object-fit:contain}.snmp-parameter-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.snmp-parameter-row strong{text-align:right;white-space:nowrap}.snmp-parameter-row.state-ok strong{color:#188038}.snmp-parameter-row.state-warning strong{color:#a96b00}.snmp-parameter-row.state-error strong{color:#c62828}.snmp-parameter-row.state-unknown strong{color:#6c757d}.snmp-device-card .dashboard-device-image{flex:0 0 82px;width:82px;height:106px;margin-left:auto;border-radius:0;object-fit:contain}.snmp-device-note{margin-top:7px;padding-top:6px;border-top:1px dotted #e1e5e8;color:#7a858d;font-size:9px}.snmp-device-note span{display:block;margin-top:2px;color:#a22}
.snmp-secret-warning{border-left:5px solid #c62828;background:rgba(255,240,240,.96)!important}.snmp-secret-warning p{margin:6px 0}.snmp-secret-warning code{display:inline-block;padding:6px 8px;border-radius:4px;background:#f1f3f5}.snmp-inline-editor{display:flex;align-items:flex-end;gap:10px;flex-wrap:wrap;margin:0 0 14px}.snmp-inline-editor label{display:flex;min-width:170px;flex-direction:column;gap:5px}.snmp-inline-editor label.check{min-width:auto;flex-direction:row;align-items:center;padding-bottom:8px}.snmp-inline-editor input,.snmp-inline-editor select{box-sizing:border-box;min-height:36px;padding:7px 9px;border:1px solid #bfc9d3;border-radius:5px;background:#fff}.snmp-inline-editor small{color:#6e7a84;font-size:10px}.snmp-credential-editor label:first-of-type{min-width:230px}.snmp-v3-ready{margin:0 0 13px;padding:9px 11px;border:1px solid #cfdce5;border-radius:5px;background:#f4f8fb;color:#52616c;font-size:12px}.snmp-device-grid{grid-template-columns:repeat(4,minmax(180px,1fr))}.snmp-device-table{min-width:1160px}.snmp-device-table td{vertical-align:middle}.snmp-parameters-section .section-heading>div{min-width:0}.snmp-parameters-section .section-heading h2{margin-bottom:3px}.snmp-parameter-grid{grid-template-columns:repeat(5,minmax(150px,1fr))}.snmp-status-map-field{grid-column:span 2}.snmp-status-map-field textarea{min-height:115px}.snmp-parameter-editor .widget-image-preview{max-width:42px;max-height:42px}.snmp-test-form{display:flex;align-items:flex-end;gap:9px;margin:14px 0;padding:10px;border:1px dashed #c9d2da;border-radius:5px;background:#f8fafb}.snmp-test-form label{display:flex;min-width:360px;flex-direction:column;gap:5px}.snmp-test-form input{box-sizing:border-box;width:100%;min-height:36px;padding:7px 9px;border:1px solid #bfc9d3;border-radius:5px;background:#fff}.snmp-parameter-table{min-width:1220px}.snmp-parameter-table td{vertical-align:middle}.snmp-parameter-table code{font-size:10px}.snmp-parameter-table td:nth-child(4){min-width:190px}.snmp-parameter-table .error-text{max-width:260px}
@media(max-width:1200px){.snmp-dashboard-groups{grid-template-columns:1fr}.snmp-device-grid{grid-template-columns:repeat(2,minmax(190px,1fr))}.snmp-parameter-grid{grid-template-columns:repeat(3,minmax(170px,1fr))}}
@media(max-width:760px){.dashboard-column-full{grid-column:auto}.snmp-dashboard-groups,.snmp-device-grid-dashboard{grid-template-columns:1fr}.snmp-device-grid,.snmp-parameter-grid{grid-template-columns:1fr}.snmp-status-map-field{grid-column:auto}.snmp-test-form{align-items:stretch;flex-direction:column}.snmp-test-form label{min-width:0}.snmp-device-card .dashboard-device-image{flex-basis:64px;width:64px;height:84px}.snmp-parameter-row{grid-template-columns:17px 1fr}.snmp-parameter-row strong{grid-column:2;text-align:left}}

/* Stage 26.1.1: pełniejsze typy SNMP. */
.snmp-parameter-table td small{display:block;margin-top:3px}


/* Stage 26.1.2: szerszy dashboard, przewijane urządzenia UPS/SNMP i edycja SNMP pod wybranym wierszem. */
@media(min-width:1201px){.dashboard-page{max-width:1760px}}
.snmp-dashboard-groups{display:flex;min-width:0;flex-direction:column;gap:12px}
.snmp-group-card{width:100%;min-width:0;box-sizing:border-box}
.dashboard-device-carousel{display:flex;box-sizing:border-box;width:100%;min-width:0;gap:10px;overflow-x:auto;overflow-y:hidden;padding:0 0 7px;scroll-behavior:smooth;scroll-snap-type:x mandatory;scrollbar-width:thin;overscroll-behavior-x:contain}
.dashboard-device-carousel::-webkit-scrollbar{height:8px}.dashboard-device-carousel::-webkit-scrollbar-track{border-radius:999px;background:#e9edf0}.dashboard-device-carousel::-webkit-scrollbar-thumb{border-radius:999px;background:#aeb9c2}.dashboard-device-carousel::-webkit-scrollbar-thumb:hover{background:#8997a2}
.dashboard-device-carousel>.ups-device,.dashboard-device-carousel>.snmp-device-card{box-sizing:border-box;min-width:100%;max-width:100%;flex:0 0 100%;scroll-snap-align:start;scroll-snap-stop:always}
.dashboard-device-carousel>.ups-device+.ups-device{margin-top:0;padding-top:2px;border-top:0}
.snmp-device-carousel .snmp-device-card{width:100%}.snmp-device-layout{min-width:0}.snmp-device-values{min-width:0}.snmp-device-card .dashboard-device-image{max-width:26%}
.snmp-inline-edit-row>td{padding:8px 0 12px;border-bottom:1px solid #cbd4dc;background:rgba(244,248,251,.8)}
.snmp-inline-edit-row .snmp-device-editor-section{margin:0;border-radius:6px;box-shadow:inset 0 0 0 1px rgba(39,135,217,.08)}
.snmp-inline-edit-row .snmp-parameter-editor{margin:0;padding:16px;background:#f8fbfd;border:1px solid #cbd9e3;border-radius:6px}
.snmp-editor-inline-active{animation:snmpInlineEditorIn .16s ease-out}
@keyframes snmpInlineEditorIn{from{opacity:.4;transform:translateY(-3px)}to{opacity:1;transform:none}}
@media(max-width:760px){.dashboard-device-carousel{gap:8px}.dashboard-device-carousel>.ups-device,.dashboard-device-carousel>.snmp-device-card{min-width:100%;max-width:100%}.snmp-inline-edit-row>td{padding:6px 0 10px}}

/* Stage 26.2: status dostarczenia i obsługa aktywnych błędów powiadomień. */
.notification-history-filters{grid-template-columns:minmax(260px,2fr) minmax(120px,1fr) minmax(130px,1fr) minmax(130px,1fr) auto}
.notification-flash,.notification-list-message{margin:12px 15px}
.notification-failed-table{min-width:1180px}
.notification-sent-table{min-width:1060px}
.notification-pending-table{min-width:1120px}
.notification-error-cell{min-width:220px;max-width:420px;color:#8b1d1d;white-space:normal;word-break:break-word}
.notification-actions{min-width:230px}
.notification-actions form{margin:0}
.notification-status-pending{color:#6f5200}.notification-status-processing{color:#155f9e}.notification-status-retry{color:#9a5a00}
@media(max-width:1000px){.notification-history-filters{grid-template-columns:1fr 1fr}.notification-history-filters .sms-history-actions{grid-column:1/-1}}
@media(max-width:540px){.notification-history-filters{grid-template-columns:1fr}.notification-history-filters .sms-history-actions{grid-column:auto}}

/* Stage 26.2.2: personalizacja dashboardu per użytkownik i kosmetyka widgetu SNMP. */
.snmp-parameter-row{border-bottom:0}
.dashboard-customize-bar{display:flex;justify-content:flex-end;align-items:center;min-height:36px;margin:0 0 10px}
.dashboard-customize-actions{display:flex;align-items:center;justify-content:flex-end;gap:8px;flex-wrap:wrap}
.dashboard-customize-hint{margin-right:4px;color:#596772;font-size:12px}
.dashboard-customize-bar .button{cursor:pointer}
.dashboard-layout-message{margin:0 0 10px;padding:8px 11px;border:1px solid #cbd7e0;border-radius:5px;background:rgba(246,249,251,.96);color:#4a5965;font-size:12px}
.dashboard-layout-message.success{border-color:#9ed2ac;background:rgba(235,249,239,.96);color:#176b36}
.dashboard-layout-message.error{border-color:#e2aaaa;background:rgba(255,241,241,.96);color:#8b1d1d}
.dashboard-layout-message.info{border-color:#b9d5ea;background:rgba(239,248,255,.96);color:#275d83}
.dashboard-widget.status-card>h2{display:flex;align-items:center;justify-content:space-between;gap:8px}
.dashboard-drag-handle{display:none;flex:0 0 auto;min-width:25px;padding:1px 4px;border:1px solid #b8c5cf;border-radius:4px;background:#fff;color:#4f6576;text-align:center;font-family:Arial,sans-serif;font-size:15px;font-weight:bold;line-height:20px;cursor:grab;user-select:none}
.dashboard-drag-handle:active{cursor:grabbing}
.dashboard-stack-drag-header{display:none}
.dashboard-layout-editing .dashboard-column{min-height:92px;padding:5px;box-sizing:border-box;border:1px dashed #aebdca;border-radius:6px;background:rgba(244,248,251,.38);transition:border-color .12s,background .12s}
.dashboard-layout-editing .dashboard-column.is-drop-target{border-color:#2787d9;background:rgba(39,135,217,.08)}
.dashboard-layout-editing .dashboard-drag-handle{display:inline-block}
.dashboard-layout-editing .dashboard-widget{position:relative;box-shadow:0 0 0 1px rgba(39,135,217,.08)}
.dashboard-layout-editing .dashboard-widget.is-dragging{opacity:.45;box-shadow:0 3px 12px rgba(0,0,0,.18)}
.dashboard-layout-editing .dashboard-widget-snmp{border:1px dashed #b9c7d1;border-radius:5px;background:rgba(255,255,255,.42);overflow:hidden}
.dashboard-layout-editing .dashboard-stack-drag-header{display:flex;align-items:center;justify-content:space-between;gap:8px;padding:7px 9px;border-bottom:1px dashed #c7d2da;background:rgba(247,249,250,.95);color:#465765;font-size:12px}
.dashboard-layout-editing .dashboard-widget-snmp .snmp-dashboard-groups{padding:6px}
@media(max-width:760px){.dashboard-customize-bar{justify-content:stretch}.dashboard-customize-start{width:100%;text-align:center}.dashboard-customize-actions{width:100%;justify-content:stretch}.dashboard-customize-actions .button{flex:1 1 auto;text-align:center}.dashboard-customize-hint{width:100%;margin:0 0 3px}.dashboard-layout-editing .dashboard-column{min-height:68px}}


/* Stage 26.2.3: równe kolumny, widgety bez karuzeli i dyskretna personalizacja. */
.dashboard-page{position:relative}
.dashboard-grid{grid-template-columns:repeat(4,minmax(0,1fr))}
.dashboard-column,.dashboard-widget,.dashboard-widget-snmp,.status-card,.card-content,.snmp-dashboard-groups,.snmp-group-card{min-width:0}
.dashboard-widget,.dashboard-widget-snmp,.snmp-group-card{box-sizing:border-box;width:100%;max-width:100%}

/* UPS i SNMP pokazują wszystkie urządzenia pionowo — bez przewijania poziomego. */
.dashboard-device-carousel{display:flex;box-sizing:border-box;width:100%;min-width:0;flex-direction:column;gap:10px;overflow:visible;padding:0;scroll-behavior:auto;scroll-snap-type:none;scrollbar-width:none;overscroll-behavior:auto}
.dashboard-device-carousel::-webkit-scrollbar{display:none;width:0;height:0}
.dashboard-device-carousel>.ups-device,.dashboard-device-carousel>.snmp-device-card{box-sizing:border-box;width:100%;min-width:0;max-width:100%;flex:0 0 auto;scroll-snap-align:none;scroll-snap-stop:normal}
.dashboard-device-carousel>.ups-device+.ups-device{margin-top:0;padding-top:10px;border-top:1px solid #ddd}
.snmp-device-carousel .snmp-device-card{width:100%;min-width:0;max-width:100%}
.snmp-device-layout,.snmp-device-values,.ups-widget-layout,.ups-parameter-list{min-width:0}

/* Długie wartości nie mogą rozszerzać kolumn dashboardu. */
.snmp-parameter-row{grid-template-columns:17px minmax(0,1fr) minmax(72px,42%)}
.snmp-parameter-row strong{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.ups-parameter-row{grid-template-columns:18px minmax(0,1fr) minmax(72px,42%)}
.ups-parameter-value{min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}

/* W trybie zwykłym personalizacja jest schowana pod małą zębatką. */
.dashboard-customize-bar{position:relative;z-index:16;min-height:30px;margin:0 0 6px;justify-content:flex-end}
.dashboard-customize-actions[hidden],.dashboard-customize-start[hidden]{display:none!important}
.dashboard-customize-start{position:relative;display:inline-flex;width:30px;height:30px;align-items:center;justify-content:center;box-sizing:border-box;padding:0;border:1px solid rgba(174,187,199,.9);border-radius:50%;background:rgba(248,250,252,.9);color:#536574;font-size:16px;line-height:1;box-shadow:0 1px 3px rgba(0,0,0,.09);cursor:pointer;opacity:.78;transition:opacity .12s,background .12s,border-color .12s}
.dashboard-customize-start:hover,.dashboard-customize-start:focus-visible{border-color:#8ca4b6;background:#fff;color:#287db7;opacity:1;outline:none}
.dashboard-customize-start>span{display:block;transition:transform .12s}
.dashboard-customize-start:hover>span,.dashboard-customize-start:focus-visible>span{transform:rotate(24deg)}
.dashboard-customize-start::after{content:attr(data-tooltip);position:absolute;top:50%;right:calc(100% + 8px);z-index:30;transform:translateY(-50%) translateX(3px);padding:6px 8px;border-radius:4px;background:rgba(31,42,51,.94);color:#fff;font-size:11px;font-weight:normal;line-height:1.2;white-space:nowrap;pointer-events:none;opacity:0;transition:opacity .12s,transform .12s}
.dashboard-customize-start::before{content:"";position:absolute;top:50%;right:calc(100% + 3px);z-index:31;transform:translateY(-50%);border-width:4px 0 4px 5px;border-style:solid;border-color:transparent transparent transparent rgba(31,42,51,.94);pointer-events:none;opacity:0;transition:opacity .12s}
.dashboard-customize-start:hover::after,.dashboard-customize-start:focus-visible::after,.dashboard-customize-start:hover::before,.dashboard-customize-start:focus-visible::before{opacity:1}
.dashboard-customize-start:hover::after,.dashboard-customize-start:focus-visible::after{transform:translateY(-50%) translateX(0)}

/* Po wejściu w edycję pokazujemy pełny pasek akcji nad siatką. */
.dashboard-layout-editing .dashboard-customize-bar{position:relative;min-height:36px;margin:0 0 10px;justify-content:flex-end}
.dashboard-layout-editing .dashboard-customize-actions{display:flex}

@media(max-width:1200px){.dashboard-grid{grid-template-columns:repeat(2,minmax(0,1fr))}}
@media(max-width:760px){
 .dashboard-grid{grid-template-columns:minmax(0,1fr)}
 .dashboard-customize-bar{min-height:28px;margin-bottom:5px;justify-content:flex-end}
 .dashboard-customize-start{width:28px;height:28px}
 .dashboard-layout-editing .dashboard-customize-bar{position:relative;justify-content:stretch}
 .dashboard-layout-editing .dashboard-customize-actions{width:100%;justify-content:stretch}
 .snmp-parameter-row,.ups-parameter-row{grid-template-columns:17px minmax(0,1fr)}
 .ups-parameter-row{grid-template-columns:18px minmax(0,1fr)}
 .snmp-parameter-row strong,.ups-parameter-value{grid-column:2;max-width:100%;text-align:left}
}

/* Stage 26.2.4: ukrywanie i przywracanie widgetów w personalizacji dashboardu. */
.dashboard-widget[hidden]{display:none!important}
.dashboard-widget.status-card>h2>.dashboard-drag-handle,
.dashboard-stack-drag-header>.dashboard-drag-handle{margin-left:auto}
.dashboard-widget-hide{display:none;flex:0 0 auto;align-items:center;justify-content:center;min-height:24px;padding:2px 7px;border:1px solid #c6a8a8;border-radius:4px;background:#fff;color:#8a3a3a;font:600 11px/1.2 Arial,sans-serif;cursor:pointer}
.dashboard-widget-hide:hover,.dashboard-widget-hide:focus-visible{border-color:#ba7474;background:#fff5f5;color:#761f1f;outline:none}
.dashboard-layout-editing .dashboard-widget-hide{display:inline-flex}
.dashboard-hidden-widgets[hidden]{display:none!important}
.dashboard-hidden-widgets{display:flex;align-items:center;gap:8px;box-sizing:border-box;min-height:34px;margin:-2px 0 10px;padding:6px 8px;border:1px dashed #b9c7d1;border-radius:5px;background:rgba(247,249,251,.9);color:#53616c;font-size:12px}
.dashboard-hidden-widgets-title{flex:0 0 auto;font-weight:600}
.dashboard-hidden-widgets-list{display:flex;align-items:center;gap:6px;flex-wrap:wrap;min-width:0}
.dashboard-hidden-empty{color:#7a8791;font-style:italic}
.dashboard-widget-restore{display:inline-flex;align-items:center;min-height:24px;padding:3px 8px;border:1px solid #aebfca;border-radius:12px;background:#fff;color:#315d78;font:600 11px/1.2 Arial,sans-serif;cursor:pointer}
.dashboard-widget-restore:hover,.dashboard-widget-restore:focus-visible{border-color:#75a9cb;background:#f3faff;color:#1e628d;outline:none}
@media(max-width:760px){.dashboard-hidden-widgets{align-items:flex-start;flex-direction:column}.dashboard-hidden-widgets-list{width:100%}}

/* Stage 26.2.5: wysokość pojedynczej karty SNMP zależna od parametrów lub realnej wysokości grafiki. */
.snmp-device-card .dashboard-device-image{
 flex:0 1 auto;
 width:auto;
 height:auto;
 max-width:82px;
 max-height:106px;
 margin-left:auto;
 object-fit:contain;
}
.snmp-device-layout{align-items:center}
@media(max-width:760px){
 .snmp-device-card .dashboard-device-image{
  flex-basis:auto;
  width:auto;
  height:auto;
  max-width:64px;
  max-height:84px;
 }
}

/* Stage 26.2.6: lekkie automatyczne odświeżanie dashboardu. */
.dashboard-customize-bar{gap:7px}
.dashboard-refresh-status{position:relative;display:inline-flex;min-height:24px;align-items:center;gap:5px;box-sizing:border-box;padding:3px 7px;border:1px solid rgba(174,187,199,.82);border-radius:12px;background:rgba(248,250,252,.88);color:#536574;font:600 10px/1.2 Arial,sans-serif;white-space:nowrap;cursor:default;opacity:.82;transition:opacity .12s,border-color .12s,background .12s}
.dashboard-refresh-status:hover,.dashboard-refresh-status:focus-visible{opacity:1;outline:none}
.dashboard-refresh-dot{display:block;width:6px;height:6px;border-radius:50%;background:#8e9aa3;box-shadow:0 0 0 2px rgba(142,154,163,.12)}
.dashboard-refresh-status.is-ok .dashboard-refresh-dot{background:#41aa5b;box-shadow:0 0 0 2px rgba(65,170,91,.13)}
.dashboard-refresh-status.is-starting .dashboard-refresh-dot{background:#2d87c8;box-shadow:0 0 0 2px rgba(45,135,200,.13)}
.dashboard-refresh-status.is-paused .dashboard-refresh-dot,.dashboard-refresh-status.is-off .dashboard-refresh-dot{background:#a28a55;box-shadow:0 0 0 2px rgba(162,138,85,.13)}
.dashboard-refresh-status.is-error .dashboard-refresh-dot{background:#c84c48;box-shadow:0 0 0 2px rgba(200,76,72,.13)}
.dashboard-refresh-status::after{content:attr(data-tooltip);position:absolute;top:calc(100% + 7px);right:0;z-index:40;max-width:min(420px,80vw);padding:6px 8px;border-radius:4px;background:rgba(31,42,51,.95);color:#fff;font-size:11px;font-weight:normal;line-height:1.35;white-space:nowrap;pointer-events:none;opacity:0;transform:translateY(-3px);transition:opacity .12s,transform .12s}
.dashboard-refresh-status::before{content:"";position:absolute;top:calc(100% + 3px);right:14px;z-index:41;border-width:0 4px 5px;border-style:solid;border-color:transparent transparent rgba(31,42,51,.95);pointer-events:none;opacity:0;transition:opacity .12s}
.dashboard-refresh-status:hover::after,.dashboard-refresh-status:focus-visible::after,.dashboard-refresh-status:hover::before,.dashboard-refresh-status:focus-visible::before{opacity:1}
.dashboard-refresh-status:hover::after,.dashboard-refresh-status:focus-visible::after{transform:translateY(0)}
.dashboard-refresh-setting{display:inline-flex;align-items:center;gap:5px;color:#596772;font-size:11px;font-weight:600;white-space:nowrap}
.dashboard-refresh-setting select{width:auto;min-width:96px;height:30px;min-height:30px;padding:3px 24px 3px 7px;font-size:11px}
.dashboard-value-changed{animation:dashboard-value-changed 1.05s ease-out}
@keyframes dashboard-value-changed{0%{box-shadow:0 0 0 3px rgba(39,135,217,.20);background-color:rgba(39,135,217,.14)}100%{box-shadow:0 0 0 0 rgba(39,135,217,0);background-color:transparent}}
@media(max-width:760px){.dashboard-refresh-status::after{right:-38px;white-space:normal}.dashboard-layout-editing .dashboard-refresh-setting{width:100%;justify-content:space-between}.dashboard-layout-editing .dashboard-refresh-setting select{flex:0 0 120px}}

/* Stage 26.3: konfiguracja progów i powiadomień SNMP. */
.snmp-alarm-config{grid-column:1/-1;box-sizing:border-box;padding:12px;border:1px solid #d4dde4;border-left:4px solid #2d8bd1;border-radius:5px;background:rgba(247,250,252,.94)}
.snmp-alarm-config-heading{display:flex;align-items:baseline;gap:10px;flex-wrap:wrap;margin-bottom:10px}.snmp-alarm-config-heading strong{font-size:13px}.snmp-alarm-config-heading small{color:#6c7881;font-size:10px}
.snmp-threshold-fields{display:grid;grid-template-columns:repeat(3,minmax(180px,1fr));gap:10px}.snmp-threshold-fields>label{display:flex;min-width:0;flex-direction:column;gap:5px}.snmp-threshold-pair{display:grid;grid-template-columns:86px minmax(0,1fr);gap:6px}.snmp-threshold-pair select,.snmp-threshold-pair input,.snmp-threshold-fields>label>input{box-sizing:border-box;width:100%;min-height:36px;padding:7px 9px;border:1px solid #bfc9d3;border-radius:5px;background:#fff}
.snmp-status-alert-help{margin:0;padding:8px 10px;border:1px solid #d9e4eb;border-radius:4px;background:#fff;color:#52616c;font-size:11px;line-height:1.45}.snmp-status-alert-help code{white-space:nowrap}
.snmp-parameter-table{min-width:1380px}.snmp-parameter-table td:nth-child(6){min-width:210px}.snmp-parameter-table td:nth-child(6)>small{margin-top:5px}
@media(max-width:900px){.snmp-threshold-fields{grid-template-columns:1fr}.snmp-alarm-config-heading{align-items:flex-start;flex-direction:column;gap:3px}}

.sensor-scan-form{display:flex;align-items:flex-end;gap:12px;flex-wrap:wrap;margin:0 0 16px}.sensor-scan-form label{display:flex;flex-direction:column;gap:6px;font-weight:600}.sensor-scan-form select{min-width:120px;padding:9px 10px;border:1px solid #bfc9d3;border-radius:5px;background:#fff}.sensor-scan-form button{background:#2787d9;color:#fff;border:0;border-radius:5px;padding:10px 14px;cursor:pointer}

/* Stage 26.3.3: wybór sterownika czujników i obsługa SHT30/SHT3x. */
.sensor-scan-add{display:flex;min-width:250px;align-items:center;gap:7px;flex-wrap:wrap}
.sensor-scan-add select{box-sizing:border-box;max-width:320px;min-width:210px;padding:7px 9px;border:1px solid #bfc9d3;border-radius:5px;background:#fff}
.sensor-scan-add button{white-space:nowrap}
.sensor-scan-add small{flex-basis:100%}
@media(max-width:650px){.sensor-scan-add{min-width:210px}.sensor-scan-add select{width:100%;min-width:0}}


/* Stage 26.3.4: osobny widget wilgotności i zagnieżdżone ustawienia System. */
.system-subnav{display:flex;align-items:stretch;gap:4px;margin:-12px 0 20px;padding:6px;border:1px solid #dce3e8;border-top:0;border-radius:0 0 6px 6px;background:rgba(255,255,255,.86);overflow-x:auto}
.system-subnav a{display:flex;align-items:center;gap:7px;min-height:34px;padding:0 11px;border:1px solid transparent;border-radius:4px;color:#596772;text-decoration:none;white-space:nowrap;font-size:13px}
.system-subnav a:hover{border-color:#d1dde6;background:#f3f7fa;color:#294f69}
.system-subnav a.active{border-color:#a9c9df;background:#eaf5fc;color:#176b9d;font-weight:600}
.system-subnav .nav-icon{width:17px;color:#287db7;text-align:center}
@media(max-width:760px){.system-subnav{margin:-7px 0 14px;padding:5px}.system-subnav a{min-height:33px;padding:0 10px}}

/* Stage 26.3.7: lista czujników jako główny widok oraz rozwijane sekcje dodawania i skanowania. */
.sensor-list-heading{align-items:flex-start}
.sensor-list-heading h2{margin:0 0 4px}
.sensor-list-heading p{margin:0}
.sensor-list-actions{display:flex;justify-content:flex-end;gap:8px;flex-wrap:wrap}
.sensor-list-section>.table-wrap{margin-top:14px}
.sensor-scan>.section-heading h2{margin-bottom:4px}
.sensor-scan>.section-heading p{margin:0}
.sensor-scan .msg{margin:10px 0}
@media(max-width:650px){.sensor-list-actions{width:100%;justify-content:stretch}.sensor-list-actions .button{flex:1;text-align:center}.sensor-list-heading{align-items:stretch}}
