Sitemap: - Switch from ISR (revalidate=3600) to force-dynamic for per-request generation - Flatten into single app/sitemap.ts with inlined static entries and DB queries - NULL-safe syncStatus filter: ne(games.syncStatus, 'failed') OR isNull(games.syncStatus) - Structured JSON logging for generated URLs and DB errors - Delete lib/sitemap/* helpers and app/api/revalidate-sitemap route - Add basic vitest coverage for sitemap exports PWA & Offline: - Add @serwist/next service worker (webpack build) with runtime caching - Cache strategies: stale-while-revalidate for game pages, network-first for listings/API, cache-first for Steam CDN images - Offline fallback page (public/offline.html) - Manifest icons: 192px maskable + 512px any - Viewport meta with viewport-fit=cover, user-scalable=no - Apple mobile web app meta tags Search / Filter Refinements: - Multi-genre OR support in listing API (comma-separated genres) - Device-scoped FPS filter (min/max FPS constrained to selected device) - Client-side URL state sync via router.replace for shareable filtered views - Initialize filter state from URL params on mount - Auto-collapse filter panel on saved-filter load - Fix multi-genre saved filter parsing (comma-separated) Steam Deck / Touch / Gamepad UX: - WCAG 2.1 AA touch targets (44x44px) on all filter controls - .gamepad-focus CSS focus ring for controller navigation - useGamepadNavigation hook: D-pad/left-stick roving tabindex, A/B/X/Y actions - Integrate gamepad hook into games page (X=search, Y=toggle filters) Chore: - Bump version to 2026.0.97
38 lines
924 B
CSS
38 lines
924 B
CSS
@import "tailwindcss";
|
||
@plugin "@tailwindcss/typography";
|
||
|
||
@theme inline {
|
||
/* Colors */
|
||
--color-background: #100b14;
|
||
--color-foreground: #180161;
|
||
--color-primary: #eb3779;
|
||
--color-secondary: #571b8b;
|
||
--color-accent: #fb793c;
|
||
--color-text: #ebe4f1;
|
||
--color-border: color-mix(in srgb, var(--color-text) 20%, transparent);
|
||
--color-border-active: color-mix(
|
||
in srgb,
|
||
var(--color-text) 60%,
|
||
transparent
|
||
);
|
||
|
||
/* Defaults */
|
||
--default-transition-duration: 0.3s;
|
||
|
||
/* Fonts */
|
||
--font-sans: var(--font-lexend);
|
||
}
|
||
|
||
/* Touch targets — WCAG 2.1 AA: minimum 44×44px */
|
||
.touch-target {
|
||
min-height: 44px;
|
||
min-width: 44px;
|
||
}
|
||
|
||
/* Gamepad focus ring — visible only when gamepad navigation is active */
|
||
.gamepad-focus :focus,
|
||
.gamepad-focus:focus-visible {
|
||
outline: 2px solid var(--color-primary);
|
||
outline-offset: 2px;
|
||
border-radius: 4px;
|
||
} |