react-photo-album
Version:
Responsive photo gallery component for React
31 lines (30 loc) • 1.23 kB
JavaScript
import { useId } from "react";
import { cssClass } from "../utils/index.js";
import { jsx } from "react/jsx-runtime";
function convertBreakpoints(breakpoints) {
if (!breakpoints || breakpoints.length === 0) return [];
const allBreakpoints = [Math.min(...breakpoints) / 2, ...breakpoints];
allBreakpoints.sort((a, b) => a - b);
return allBreakpoints;
}
function useBreakpoints(prefix, breakpoints) {
const uid = `${prefix}-${useId().replace(/[«:»]/g, "")}`;
return {
containerClass: cssClass(uid),
breakpointClass: (breakpoint) => cssClass(`${uid}-${breakpoint}`),
breakpoints: convertBreakpoints(breakpoints)
};
}
function StyledBreakpoints({ breakpoints, containerClass, breakpointClass }) {
return jsx("style", { children: [
`.${containerClass}{container-type:inline-size}`,
`${breakpoints.map((breakpoint) => `.${breakpointClass(breakpoint)}`).join()}{display:none}`,
...breakpoints.map(
(breakpoint, index, array) => `@container(min-width:${index > 0 ? breakpoint : 0}px)${index < array.length - 1 ? ` and (max-width:${array[index + 1] - 1}px)` : ""}{.${breakpointClass(breakpoint)}{display:block}}`
)
].join("\n") });
}
export {
StyledBreakpoints,
useBreakpoints
};