UNPKG

@gechiui/compose

Version:
100 lines (85 loc) 2.59 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _element = require("@gechiui/element"); var _useMediaQuery = _interopRequireDefault(require("../use-media-query")); /** * GeChiUI dependencies */ /** * Internal dependencies */ /** * @typedef {"huge" | "wide" | "large" | "medium" | "small" | "mobile"} GCBreakpoint */ /** * Hash of breakpoint names with pixel width at which it becomes effective. * * @see _breakpoints.scss * * @type {Record<GCBreakpoint, number>} */ const BREAKPOINTS = { huge: 1440, wide: 1280, large: 960, medium: 782, small: 600, mobile: 480 }; /** * @typedef {">=" | "<"} GCViewportOperator */ /** * Object mapping media query operators to the condition to be used. * * @type {Record<GCViewportOperator, string>} */ const CONDITIONS = { '>=': 'min-width', '<': 'max-width' }; /** * Object mapping media query operators to a function that given a breakpointValue and a width evaluates if the operator matches the values. * * @type {Record<GCViewportOperator, (breakpointValue: number, width: number) => boolean>} */ const OPERATOR_EVALUATORS = { '>=': (breakpointValue, width) => width >= breakpointValue, '<': (breakpointValue, width) => width < breakpointValue }; const ViewportMatchWidthContext = (0, _element.createContext)( /** @type {null | number} */ null); /** * Returns true if the viewport matches the given query, or false otherwise. * * @param {GCBreakpoint} breakpoint Breakpoint size name. * @param {GCViewportOperator} [operator=">="] Viewport operator. * * @example * * ```js * useViewportMatch( 'huge', '<' ); * useViewportMatch( 'medium' ); * ``` * * @return {boolean} Whether viewport matches query. */ const useViewportMatch = function (breakpoint) { let operator = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '>='; const simulatedWidth = (0, _element.useContext)(ViewportMatchWidthContext); const mediaQuery = !simulatedWidth && `(${CONDITIONS[operator]}: ${BREAKPOINTS[breakpoint]}px)`; const mediaQueryResult = (0, _useMediaQuery.default)(mediaQuery || undefined); if (simulatedWidth) { return OPERATOR_EVALUATORS[operator](BREAKPOINTS[breakpoint], simulatedWidth); } return mediaQueryResult; }; useViewportMatch.__experimentalWidthProvider = ViewportMatchWidthContext.Provider; var _default = useViewportMatch; exports.default = _default; //# sourceMappingURL=index.js.map