Kundenansicht neu E-Fix M7: Bewegung reduziert ohne Rest-Fahrt der Leisten-Zeilen, #fortschritt unter dem haftenden Kopf

- Die Regel der zwei Fahrstuhl-Zeilen (#kn-zeile-haupt, #kn-zeile-etage, Spezifität 1-2-0) schlug das .kn-rw { transition: none } der Reduced-Motion-
  Regel: mit "Bewegung reduzieren" glitt die alte Zeile noch 550 ms durch die neue (beide Texte überlagert). Jetzt steht im Reduced-Motion-Block
  dieselbe Selektorliste mit transition: none.
- #fortschritt (scrollIntoView block start) ließ den Abschnitt "Was wir zuletzt erledigt haben" hinter dem haftenden Kopf beginnen: scroll-margin-top
  mit Kopfhöhe, Bannerhöhe, Safe-Area und 8 px (Desktop 16 px). Die Gutschrift-Etage scrollt im Blatt, dessen Oberkante schon unter dem Kopf liegt: dort
  ist nichts nötig.
Prüfung: Werkzeug-Ansichten kn-huelle-reduziert (jetzt auch die Zeilen bei offener Etage) und kn-p2-website-fortschritt, Pins in test/knEfixCss.test.js.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
ClaudeandClaude Sonnet 5.5 committed 2026-10-16 21:46:15 +00:00
1 parent 140275022d
commit 29ca12a409
4 files changed
+14 -1

No files matched your search

+1 -1
View File
@@ -13,7 +13,7 @@ const VERBOTEN = /linear-gradient|radial-gradient|conic-gradient|backdrop-filter
test('Stil: keine verbotenen Mittel (Verläufe, Glas, Dunkelmodus, Lila, Gewicht 800), auch nicht in der Kopie des Composer-CSS', () => { for (const [n, c] of [['ansichten.css', A], ['oeffentlich.css', O], ['chat-composer.css', C]]) assert.doesNotMatch(c, VERBOTEN, n) })
test('Stil: Farbliterale nur in Custom-Property-Deklarationen, jedes benutzte Token ist definiert', () => {
for (const [n, c] of [['ansichten.css', A], ['oeffentlich.css', O]]) for (const z of c.split('\n')) if (!/^\s*--kn-[\w-]+:/.test(z)) assert.doesNotMatch(z, /#[0-9a-f]{3,8}\b|rgba?\(/i, `${n}: ${z.trim()}`)
const definiert = new Set([...(TOKENS + A + O).matchAll(/(--kn-[\w-]+)\s*:/g)].map((m) => m[1]))
const definiert = new Set([...(TOKENS + A + O + css('huelle.css')).matchAll(/(--kn-[\w-]+)\s*:/g)].map((m) => m[1])) // die Maße der Hülle (--kn-kopf-h, --kn-banner-h) stehen in huelle.css
for (const m of (A + O).matchAll(/var\((--kn-[\w-]+)/g)) assert.ok(definiert.has(m[1]), m[1])
})
test('Stil: jede kn-Klasse der P2-Module hat eine Regel', () => {
+8
View File
@@ -87,3 +87,11 @@ test('M4: der Mitarbeiter-Banner steht oben (sticky), Kopf, Menü, Blatt und Kon
const js = quelle('huelle.js')
assert.match(js, /setProperty\?\.\('--kn-banner-h'/)
})
test('M7: Bewegung reduziert nimmt auch die Fahrt der Fahrstuhl-Zeilen (Spezifität gleich, später im Blatt); #fortschritt hat scroll-margin-top für den haftenden Kopf', () => {
const reduziert = HUELLE.slice(HUELLE.indexOf('@media (prefers-reduced-motion: reduce)'))
assert.match(reduziert, /\.kn-leiste-reel\[data-etage="offen"\] #kn-zeile-haupt,\s*\.kn-leiste-reel:not\(\[data-etage="offen"\]\) #kn-zeile-etage\s*\{\s*transition:\s*none/)
const A = lies('ansichten.css')
assert.match(A, /\n\[data-abschnitt="aktivitaet"\] \{ scroll-margin-top: 16px/)
assert.match(handyTeil(A), /\[data-abschnitt="aktivitaet"\] \{ scroll-margin-top: calc\(var\(--kn-banner-h\) \+ var\(--kn-kopf-h\) \+ env\(safe-area-inset-top\) \+ 8px\)/)
})