Kundenansicht neu P1: Hülle mit Start über /api/auth/me und Modul-Lader

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-16 16:24:16 +00:00
1 parent 710c57cf87
commit 7595844170
6 files changed
+423 -2

No files matched your search

+18
View File
@@ -84,3 +84,21 @@ test('messen: Gleiter, Overlay-Gegenbewegung, Schriftstufe, Rückfall und Sichtb
r.setzeAktiv('zzz'); assert.equal(gleiter.style.width, '0px')
} finally { fx.restore() }
})
test('messen: die erste Platzierung springt, erst die folgenden Wechsel federn', () => {
const fx = installFakeDom()
try {
const r = baueReiter({ eintraege: ['a', 'b'].map((key) => ({ key, label: key })), aktiv: 'a', art: 'balken', bei: () => {} })
fx.document.body.append(r)
const gleiter = fx.finde(r, '.kn-gleiter'); const overlay = fx.finde(r, '.kn-overlay'); const basis = fx.finde(r, '.kn-balken-basis'); const tabs = fx.alle(r, '[role=tab]')
const verlauf = []
gleiter.style = new Proxy({}, { set(ziel, name, wert) { if (name === 'transition') verlauf.push(wert); ziel[name] = wert; return true } }); overlay.style = {}; gleiter.offsetWidth = 0
r.clientWidth = 200; r.scrollLeft = 0; basis.scrollWidth = 200
r.getBoundingClientRect = () => ({ left: 0, width: 200 }); basis.getBoundingClientRect = () => ({ left: 0, width: 200 })
tabs.forEach((t, i) => { t.getBoundingClientRect = () => ({ left: i * 100, width: 100 }) })
fx.alle(overlay, '.kn-t').forEach((k) => { k.getBoundingClientRect = () => ({ left: 0, width: 100 }) })
r.setzeAktiv('b'); assert.deepEqual(verlauf, ['none', '']) // erste Platzierung: ohne Übergang
r.setzeAktiv('a'); assert.deepEqual(verlauf, ['none', '']) // danach mit Übergang (die Feder des CSS läuft)
assert.equal(gleiter.style.transform, 'translateX(0px)')
} finally { fx.restore() }
})