Some checks failed
Deploy Application / deploy (push) Has been cancelled
6.0 KiB
6.0 KiB
Migration Guide: Modern Web Features
Schritt-für-Schritt Migration zu modernen Baseline-Features.
Übersicht
Dieser Guide beschreibt die Migration von Legacy-Implementierungen zu modernen Baseline-Features:
<form role="search">→<search>Element- Custom Dropdowns → Popover API
- Custom Modals → Popover API (wo anwendbar)
- Custom Transitions → View Transitions API
1. Search Element Migration
Vorher: Form mit role="search"
<form class="admin-search" role="search" action="/search" method="get">
<label for="search-input" class="admin-visually-hidden">Search</label>
<input
type="search"
id="search-input"
name="q"
class="admin-search__input"
placeholder="Search..."
/>
<button type="submit" class="admin-search__submit">Search</button>
</form>
Nachher: Search Component
<x-search
action="/search"
method="get"
name="q"
placeholder="Search..."
variant="header"
/>
CSS-Anpassungen
Vorher:
.admin-search {
/* Styles */
}
Nachher:
search.admin-search {
/* Styles bleiben gleich, aber Selektor ändert sich */
}
Breaking Changes
- CSS-Selektoren müssen von
.admin-searchzusearch.admin-searchgeändert werden - JavaScript-Selektoren müssen angepasst werden
2. Popover API Migration
Vorher: Custom Dropdown
<div class="dropdown" data-dropdown>
<button class="dropdown-trigger" data-dropdown-trigger="menu">
Menu
</button>
<ul class="dropdown-menu" data-dropdown-content="menu">
<li><a href="/item1">Item 1</a></li>
<li><a href="/item2">Item 2</a></li>
</ul>
</div>
// Custom JavaScript
document.querySelectorAll('[data-dropdown-trigger]').forEach(trigger => {
trigger.addEventListener('click', (e) => {
e.stopPropagation();
const dropdown = trigger.closest('[data-dropdown]');
const isOpen = dropdown.dataset.open === 'true';
dropdown.dataset.open = !isOpen;
});
});
.dropdown-menu {
display: none;
}
.dropdown[data-open="true"] .dropdown-menu {
display: block;
}
Nachher: Popover API
<button popovertarget="menu-popover" aria-haspopup="true" aria-expanded="false">
Menu
</button>
<x-popover id="menu-popover" type="auto" position="bottom-start">
<ul role="menu">
<li><a href="/item1">Item 1</a></li>
<li><a href="/item2">Item 2</a></li>
</ul>
</x-popover>
// Minimales JavaScript nur für aria-expanded
document.querySelectorAll('[popovertarget]').forEach(trigger => {
const popoverId = trigger.getAttribute('popovertarget');
const popover = document.getElementById(popoverId);
if (popover) {
popover.addEventListener('toggle', (e) => {
const isOpen = popover.matches(':popover-open');
trigger.setAttribute('aria-expanded', isOpen ? 'true' : 'false');
});
}
});
[popover] {
/* Popover Styles */
}
[popover]:not(:popover-open) {
display: none;
}
Breaking Changes
data-dropdownAttribute werden entfernt- Custom JavaScript für Dropdown-Management kann entfernt werden
- CSS-Selektoren ändern sich von
[data-open="true"]zu:popover-open
3. View Transitions Migration
Vorher: Custom Transitions
// Custom Transition mit setTimeout
function navigateTo(url) {
const content = document.querySelector('.content');
content.style.transition = 'opacity 0.3s';
content.style.opacity = '0';
setTimeout(() => {
window.location.href = url;
}, 300);
}
.content {
transition: opacity 0.3s;
}
Nachher: View Transitions API
// View Transitions API
import { transitionNavigation } from './modules/admin/view-transitions.js';
function navigateTo(url) {
transitionNavigation(() => {
window.location.href = url;
});
}
.content {
view-transition-name: content;
}
::view-transition-old(content),
::view-transition-new(content) {
animation: fade 0.15s ease-out;
}
Breaking Changes
- Custom Transition-Logik kann entfernt werden
- CSS-Transitions werden durch View Transitions ersetzt
Schritt-für-Schritt Migration
Schritt 1: Search Element
- Ersetze alle
<form role="search">durch<x-search>Komponente - Aktualisiere CSS-Selektoren von
.admin-searchzusearch.admin-search - Teste alle Search-Formulare
Schritt 2: Popover API
- Identifiziere alle Custom Dropdowns
- Ersetze durch
<x-popover>Komponente - Entferne Custom Dropdown-Management JavaScript
- Aktualisiere CSS-Selektoren
- Teste alle Dropdowns
Schritt 3: View Transitions
- Identifiziere alle Custom Transitions
- Ersetze durch View Transitions API
- Definiere
view-transition-namefür wichtige Bereiche - Teste alle Transitions
Fallback-Strategien
View Transitions Fallback
import { supportsViewTransitions, transitionNavigation } from './modules/admin/view-transitions.js';
function navigate(url) {
if (supportsViewTransitions()) {
transitionNavigation(() => {
window.location.href = url;
});
} else {
// Fallback ohne Transition
window.location.href = url;
}
}
Popover Fallback
Die Popover API hat keinen direkten Fallback. Für nicht unterstützende Browser sollte ein Polyfill verwendet werden oder die Custom Dropdown-Implementierung beibehalten werden.
Testing Checklist
- Alle Search-Formulare funktionieren
- Alle Dropdowns öffnen/schließen korrekt
- View Transitions funktionieren
- Keyboard-Navigation funktioniert
- Screen Reader Support funktioniert
- Mobile Responsiveness funktioniert
- Browser-Kompatibilität geprüft