Dnsmasq/Hosts UI tweaks, test harness: down before redeploy, exclude leases from mount

- Dnsmasq page: Config (Main config, Managed file, Config set) under Service configuration; remove Paths/Leases (in Effective config DHCP); EffectiveConfigSection collapsible groups; StatusSection flex-wrap
- Hosts: HostsFileSection always shows table; 'No host entries' in tbody when empty
- Models: reorganize into sub-namespaces (Config, EffectiveConfig, Hosts, Dhcp, Status); move EffectiveConfig/Status/Logs components under Dnsmasq
- Test harness: prepare-test-mount.sh runs 'docker compose down' before mount+up so all containers (including DHCP clients) restart; exclude testdata/leases from sync (unit tests only); testdata/README
This commit is contained in:
2026-02-03 01:35:26 +10:00
parent a0863a663e
commit a8ddcdec4e
70 changed files with 542 additions and 303 deletions
@@ -0,0 +1,79 @@
/* Effective config sections – mobile-first, touch-friendly */
.ec-sections {
display: flex;
flex-direction: column;
gap: 0;
}
.ec-section {
border-bottom: 1px solid var(--bs-border-color, #dee2e6);
}
.ec-section:last-child {
border-bottom: none;
}
/* Touch-friendly header: min 44px tap target (WCAG 2.5.5) */
.ec-section-header {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
min-height: 2.75rem;
padding: 0.4rem 0;
margin: 0;
border: none;
background: transparent;
color: inherit;
text-align: left;
cursor: pointer;
font-size: inherit;
line-height: 1.3;
-webkit-tap-highlight-color: transparent;
}
.ec-section-header:hover {
color: var(--bs-primary, #0d6efd);
}
.ec-section-header:focus-visible {
outline: 2px solid var(--bs-primary, #0d6efd);
outline-offset: 2px;
}
.ec-section-title {
flex: 1;
min-width: 0;
}
.ec-section-chevron {
flex-shrink: 0;
font-size: 0.75rem;
opacity: 0.7;
margin-left: 0.25rem;
}
.ec-section-body {
padding: 0.25rem 0 0.5rem 0;
padding-left: 0.5rem;
border-left: 2px solid var(--bs-border-color-translucent, rgba(0, 0, 0, 0.075));
overflow-wrap: break-word;
word-break: break-word;
}
/* Long paths/values wrap on small screens; badges stay inline */
.ec-section-body ul {
overflow-wrap: break-word;
word-break: break-word;
}
.ec-section-body li {
overflow-wrap: break-word;
word-break: break-word;
}
@media (max-width: 767.98px) {
.ec-section-body {
padding-left: 0.35rem;
}
}