* feat(header): add opt-in auto-hide-on-scroll for the header New per-user header preference (default off): when enabled, the header slides away while scrolling down and reappears on scroll-up or near the top of the page. Disabled while in board edit mode, and skipped entirely while focus is inside the header. Only applies when the header is set to visible - the existing hover-to-reveal floating controls already cover the hidden-header case. * chore(api): regenerate the checked-in OpenAPI schema check:openapi was failing in CI - the schema on disk hadn't been regenerated after the header preferences gained autoHideOnScroll. Add scripts/generate-openapi-schema.mts (and a generate:openapi package script) alongside the existing check script so this is a one-command fix next time the schema drifts. * docs(users): document the header studio's visibility and auto-hide options Header customization (drag-to-arrange controls, hide/show, hover-reveal and pin, auto-hide-on-scroll) had no documentation on the user general settings page.
34 lines
977 B
TypeScript
34 lines
977 B
TypeScript
"use client";
|
|
|
|
import type { PropsWithChildren } from "react";
|
|
import { createContext, useContext, useEffect } from "react";
|
|
import { useDisclosure } from "@mantine/hooks";
|
|
|
|
const EditModeContext = createContext<ReturnType<typeof useDisclosure> | null>(null);
|
|
|
|
export const EditModeProvider = ({ children, initialOpen = false }: PropsWithChildren<{ initialOpen?: boolean }>) => {
|
|
const editModeDisclosure = useDisclosure(initialOpen);
|
|
const [, { open }] = editModeDisclosure;
|
|
|
|
useEffect(() => {
|
|
if (initialOpen) open();
|
|
}, [initialOpen, open]);
|
|
|
|
return <EditModeContext.Provider value={editModeDisclosure}>{children}</EditModeContext.Provider>;
|
|
};
|
|
|
|
export const useEditMode = () => {
|
|
const context = useContext(EditModeContext);
|
|
|
|
if (!context) {
|
|
throw new Error("EditMode is required");
|
|
}
|
|
|
|
return context;
|
|
};
|
|
|
|
export const useOptionalEditMode = (): boolean => {
|
|
const context = useContext(EditModeContext);
|
|
return context ? context[0] : false;
|
|
};
|