Highlights: - Warehouse module: receipts, issues, reservations, inventory, reports, dashboard, master data (categories, suppliers, locations), FIFO service, integration tests - Docházka: mzda PDF counting model (Odpracováno / Vč. svátků / Přesčas / Svátek / So/Ne / Noc) with Czech weekday names and decimal hours - AttendanceAdmin/AttendanceHistory KPI cards unified to mzda formula with fund bar colored by delta, badges for Práce/Dov/Nem/Sv/Nep - Remove leave_type=holiday entirely (auto-computed from Czech public holidays) - Allow multiple work shifts per day (overlap detection only) - Pre-flight refresh in api.ts eliminates spurious 401s on fresh page loads - Prisma: company_settings gets 6 nullable columns for warehouse numbering (PRI/VYD/INV prefixes, default patterns); migration seeds defaults
25 lines
872 B
TypeScript
25 lines
872 B
TypeScript
import { useEffect, useState } from "react";
|
|
|
|
/**
|
|
* Returns true when the user has expressed a preference for reduced motion
|
|
* (OS-level setting: `prefers-reduced-motion: reduce`).
|
|
*
|
|
* SSR-safe: starts as `false` (the default state), so the first render uses
|
|
* the normal animation. The effect then reconciles with the live matchMedia
|
|
* state on the client and re-renders if needed.
|
|
*/
|
|
export default function useReducedMotion(): boolean {
|
|
const [reduced, setReduced] = useState(false);
|
|
|
|
useEffect(() => {
|
|
if (typeof window === "undefined" || !window.matchMedia) return;
|
|
const mq = window.matchMedia("(prefers-reduced-motion: reduce)");
|
|
setReduced(mq.matches);
|
|
const onChange = () => setReduced(mq.matches);
|
|
mq.addEventListener("change", onChange);
|
|
return () => mq.removeEventListener("change", onChange);
|
|
}, []);
|
|
|
|
return reduced;
|
|
}
|