- calculateCableSizing now selects cross-section against
designCurrentA = max(operatingCurrentA, existingProtectionRatedCurrentA)
instead of the load current alone. A breaker only trips at its own rated
current (In), so a cable sized for the actual load could overheat under
sustained current below that threshold - the standard In <= Iz rule.
Voltage-drop calculation still uses the real operating current, only the
capacity check changed. Alerts and the ok-summary now name the breaker as
the limiting factor when it is one.
- Added a manual cable type/cross-section entry in the modal itself:
running a calculation pre-fills these fields as a suggestion, but they
are the single field that actually gets applied, and stay editable -
this restores the direct manual-entry capability the modal replaced when
it took over the cableSummary/cableCrossSection cell click.
- Fixed calculator icon position from a trailing ::after (inconsistent
position depending on cell text length, easy to miss on empty cells) to
a fixed-position ::before, so it is always in the same place regardless
of whether cable data is already filled in.
- No new display for the existing protection device - it already has its
own Schutz column in this app.
Trigger now matches cableSummary OR cableCrossSection so it still
shows up regardless of which cable-related column a user has visible
(column visibility is a per-browser preference in this app, not fixed
- see docs/cable-sizing-module.md coupling note). Icon changed to a
calculator glyph.
The trigger was wired to the cableCrossSection column, which is not in
the default visible column set - the actually visible "Kabel" column
is cableSummary (a computed cableType/cableCrossSection/cableLength
join). Editing cableSummary already maps to the remark field rather
than the underlying cable data (see buildCircuitEditPatch), so this
column was effectively a read-only display already; retargeting the
trigger there loses no existing manual-edit capability. Also adds
.cell-cable-sizing-trigger styling (mirrors .cell-protection-trigger)
so the trigger is visually discoverable, which the initial version was
missing entirely.
Adds a persistent dark/light theme toggle (localStorage +
data-bs-theme on <html>) so it applies globally, including the
circuit editor route which has no visible sidebar. An inline
beforeInteractive script sets the theme before hydration to avoid a
flash of the wrong theme.
Bootstrap components pick up data-bs-theme automatically; the custom
circuit-grid CSS previously used ~150 hardcoded hex colors, all
converted to semantic tokens in globals.css with light/dark values.
Verified with a headless-browser pass across the project list, project
detail page, circuit editor, project-device drawer and a settings
modal in both themes; no console errors.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
- Gzf-Picker-Modal mit AMEV-Tabelle 3 (Planungshilfe für elektrische
Leistungsbilanzen) im Projektgerät-Modal und im globalen Geräteformular
- Docker-Deploy-Tooling (docker-start.sh, run-migrations.js) für den
produktiven Container
- Seitenleiste ist jetzt einklappbar (Icon-only, Zustand in localStorage)
Bring the Econsult-family design tokens (see design-system-econsult.md)
into leistungsbilanz-ts and add a persistent sidebar for the projects
area, mirroring elt-planung-suite / Einsatz-Orga. The sidebar lists all
projects and, inside a project, jumps to its sections; the tree editor
stays sidebar-free since it needs the full width. The projects overview
page is decluttered to a single stacked column (create/import/global
devices) now that the project list lives in the sidebar.