lisn.js
Version:
Simply handle user gestures and actions. Includes widgets.
1 lines • 32.7 kB
Source Map (JSON)
{"version":3,"file":"size-watcher.cjs","names":["MC","_interopRequireWildcard","require","MH","_cssAlter","_log","_math","_size","_text","_callback","_xMap","_xResizeObserver","_debug","_interopRequireDefault","e","__esModule","default","t","WeakMap","r","n","o","i","f","__proto__","has","get","set","hasOwnProperty","call","Object","defineProperty","getOwnPropertyDescriptor","_defineProperty","_toPropertyKey","value","enumerable","configurable","writable","_toPrimitive","Symbol","toPrimitive","TypeError","String","Number","SizeWatcher","create","config","getConfig","CONSTRUCTOR_KEY","reuse","myConfig","configStrKey","objToStrKey","instance","instances","constructor","key","illegalConstructorError","logger","debug","Logger","name","logAtCreation","allSizeData","newWeakMap","allCallbacks","newXWeakMap","newMap","resizeHandler","entries","entry","processEntry","xObserver","XResizeObserver","fetchCurrentSize","target","element","fetchElement","sizeData","copyObject","newPromise","resolve","observer","newResizeObserver","getSizeData","disconnect","observe","border","S_WIDTH","S_HEIGHT","content","fetchOptions","options","_options$box","_options$dimension","_options$MC$S_DEBOUNC","box","isValidBox","usageError","dimension","isValidDimension","_element","targetOf","_box","_dimension","_threshold","toNonNegNum","threshold","_resizeThreshold","_debounceWindow","S_DEBOUNCE_WINDOW","createCallback","handler","_allCallbacks$get","remove","debug5","callback","wrapCallback","onRemove","deleteHandler","_options","sGet","setupOnResize","userOptions","isRemoved","_data","observeLater","skipInitial","invokeCallback","removeOnResize","_allCallbacks$get2","currEntry","setSizeCssProps","deleteKey","prune","debug4","unobserve","latestData","debug9","_allCallbacks$get3","values","thresholdsExceeded","hasExceededThreshold","trackSize","noTrackSize","onResize","offResize","exports","SYMBOL","resizeThreshold","lastThresholdData","dim","diff","abs","borderBox","getEntryBorderBox","contentBox","getEntryContentBox","prefix","tryGetViewportOverlay","getDocElement","props","borderWidth","borderHeight","contentWidth","contentHeight","setNumericStyleJsVars","_prefix","isElement","getWindow","fetchViewportOverlay","getDoc","invoke","catch","logError"],"sources":["../../../src/ts/watchers/size-watcher.ts"],"sourcesContent":["/**\n * @module Watchers/SizeWatcher\n */\n\nimport * as MC from \"@lisn/globals/minification-constants\";\nimport * as MH from \"@lisn/globals/minification-helpers\";\n\nimport { Box, Dimension, Size, SizeTarget } from \"@lisn/globals/types\";\n\nimport { setNumericStyleJsVars } from \"@lisn/utils/css-alter\";\nimport { logError } from \"@lisn/utils/log\";\nimport { toNonNegNum } from \"@lisn/utils/math\";\nimport {\n isValidBox,\n isValidDimension,\n getEntryBorderBox,\n getEntryContentBox,\n tryGetViewportOverlay,\n fetchViewportOverlay,\n} from \"@lisn/utils/size\";\nimport { objToStrKey } from \"@lisn/utils/text\";\n\nimport {\n CallbackHandler,\n Callback,\n wrapCallback,\n} from \"@lisn/modules/callback\";\nimport { newXWeakMap } from \"@lisn/modules/x-map\";\nimport { XResizeObserver } from \"@lisn/modules/x-resize-observer\";\n\nimport debug from \"@lisn/debug/debug\";\n\n/**\n * {@link SizeWatcher} monitors the size of a given target. It's built on top\n * of {@link https://developer.mozilla.org/en-US/docs/Web/API/ResizeObserver | ResizeObserver}.\n *\n * It manages registered callbacks globally and reuses ResizeObservers.\n *\n * Each instance of SizeWatcher manages up to two ResizeObservers: one\n * for content-box size changes and one for border-box size changes.\n */\nexport class SizeWatcher {\n /**\n * Call the given handler whenever the target's size changes.\n *\n * Unless {@link OnResizeOptions.skipInitial} is true, the handler is also\n * called (almost) immediately with the latest size data.\n *\n * **IMPORTANT:** The same handler can _not_ be added multiple times for the\n * same target, even if the options differ. If the handler has already been\n * added for this target, either using {@link onResize} or {@link trackSize},\n * then it will be removed and re-added with the current options.\n *\n * @throws {@link Errors.LisnUsageError | LisnUsageError}\n * If the target or options are invalid.\n */\n readonly onResize: (\n handler: OnResizeHandler,\n options?: OnResizeOptions,\n ) => Promise<void>;\n\n /**\n * Removes a previously added handler.\n *\n * @throws {@link Errors.LisnUsageError | LisnUsageError}\n * If the target is invalid.\n */\n readonly offResize: (handler: OnResizeHandler, target?: SizeTarget) => void;\n\n /**\n * This is the same as {@link onResize} except that if `handler` is not given,\n * then it defaults to an handler that updates a set of CSS variables on the\n * target's style:\n *\n * - If {@link OnResizeOptions.target | options.target} is not given, or is\n * `window`, the following CSS variables are set on the root (`html`)\n * element and represent the viewport size:\n * - `--lisn-js--window-border-width`\n * - `--lisn-js--window-border-height`\n * - `--lisn-js--window-content-width`\n * - `--lisn-js--window-content-height`\n *\n * - Otherwise, the following variables are set on the target itself and\n * represent its visible size:\n * - `--lisn-js--border-width`\n * - `--lisn-js--border-height`\n * - `--lisn-js--content-width`\n * - `--lisn-js--content-height`\n *\n * If `target` is `document`, then it will use `document.documentElement`.\n *\n * **IMPORTANT:** The same handler can _not_ be added multiple times for the\n * same target, even if the options differ. If the handler has already been\n * added for this target, either using {@link onResize} or {@link trackSize},\n * then it will be removed and re-added with the current options.\n *\n * @throws {@link Errors.LisnUsageError | LisnUsageError}\n * If the target or options are invalid.\n */\n readonly trackSize: (\n handler?: OnResizeHandler | null,\n options?: OnResizeOptions,\n ) => Promise<void>;\n\n /**\n * Removes a previously added handler for {@link trackSize}.\n *\n * @throws {@link Errors.LisnUsageError | LisnUsageError}\n * If the target is invalid.\n */\n readonly noTrackSize: (\n handler?: OnResizeHandler | null,\n target?: SizeTarget,\n ) => void;\n\n /**\n * Get the size of the given target. It will get the size from a\n * ResizeObserverEntry and so it's always delayed by one frame at least.\n *\n * @throws {@link Errors.LisnUsageError | LisnUsageError}\n * If the target is invalid.\n */\n readonly fetchCurrentSize: (target?: SizeTarget) => Promise<SizeData>;\n\n /**\n * Creates a new instance of SizeWatcher with the given\n * {@link SizeWatcherConfig}. It does not save it for future reuse.\n */\n static create(config?: SizeWatcherConfig) {\n return new SizeWatcher(getConfig(config), CONSTRUCTOR_KEY);\n }\n\n /**\n * Returns an existing instance of SizeWatcher with the given\n * {@link SizeWatcherConfig}, or creates a new one.\n *\n * **NOTE:** It saves it for future reuse, so don't use this for temporary\n * short-lived watchers.\n */\n static reuse(config?: SizeWatcherConfig) {\n const myConfig = getConfig(config);\n const configStrKey = objToStrKey(myConfig);\n\n let instance = instances.get(configStrKey);\n if (!instance) {\n instance = new SizeWatcher(myConfig, CONSTRUCTOR_KEY);\n instances.set(configStrKey, instance);\n }\n\n return instance;\n }\n\n private constructor(\n config: SizeWatcherConfigInternal,\n key: typeof CONSTRUCTOR_KEY,\n ) {\n if (key !== CONSTRUCTOR_KEY) {\n throw MH.illegalConstructorError(\"SizeWatcher.create\");\n }\n\n const logger = debug\n ? new debug.Logger({ name: \"SizeWatcher\", logAtCreation: config })\n : null;\n\n const allSizeData = MH.newWeakMap<Element, SizeData>();\n\n const allCallbacks = newXWeakMap<\n Element,\n Map<OnResizeHandler, CallbackEntry>\n >(() => MH.newMap());\n\n // ----------\n\n const resizeHandler = (entries: ResizeObserverEntry[]) => {\n for (const entry of entries) {\n processEntry(entry);\n }\n };\n\n // Don't debounce the observer, only callbacks.\n const xObserver = new XResizeObserver(resizeHandler);\n\n // ----------\n\n const fetchCurrentSize = async (\n target: SizeTarget | undefined,\n ): Promise<SizeData> => {\n const element = await fetchElement(target);\n const sizeData = allSizeData.get(element);\n if (sizeData) {\n return MH.copyObject(sizeData);\n }\n\n return MH.newPromise((resolve) => {\n // Use a temp ResizeObserver\n const observer = MH.newResizeObserver((entries) => {\n const sizeData = getSizeData(entries[0]);\n observer?.disconnect();\n resolve(sizeData); // no need to copy or save it\n });\n\n if (observer) {\n observer.observe(element);\n } else {\n // Warning would have already been logged by XResizeObserver\n resolve({\n border: { [MC.S_WIDTH]: 0, [MC.S_HEIGHT]: 0 },\n content: { [MC.S_WIDTH]: 0, [MC.S_HEIGHT]: 0 },\n });\n }\n });\n };\n\n // ----------\n\n const fetchOptions = async (\n options: OnResizeOptions,\n ): Promise<OnResizeOptionsInternal> => {\n const box = options.box ?? null;\n if (box && !isValidBox(box)) {\n throw MH.usageError(`Unknown box type: '${box}'`);\n }\n\n const dimension = options.dimension ?? null;\n if (dimension && !isValidDimension(dimension)) {\n throw MH.usageError(`Unknown dimension: '${dimension}'`);\n }\n\n return {\n _element: await fetchElement(MH.targetOf(options)),\n _box: box,\n _dimension: dimension,\n // If threshold is 0, internally treat as 1 (pixel)\n _threshold:\n toNonNegNum(options.threshold, config._resizeThreshold) || 1,\n _debounceWindow:\n options[MC.S_DEBOUNCE_WINDOW] ?? config._debounceWindow,\n };\n };\n\n // ----------\n\n const createCallback = (\n handler: OnResizeHandler,\n options: OnResizeOptionsInternal,\n ): CallbackEntry => {\n const element = options._element;\n MH.remove(allCallbacks.get(element)?.get(handler)?._callback);\n\n debug: logger?.debug5(\"Adding/updating handler\", options);\n const callback = wrapCallback(handler, options._debounceWindow);\n callback.onRemove(() => {\n deleteHandler(handler, options);\n });\n\n const entry = { _callback: callback, _options: options };\n allCallbacks.sGet(element).set(handler, entry);\n return entry;\n };\n\n // ----------\n\n const setupOnResize = async (\n handler: OnResizeHandler,\n userOptions: OnResizeOptions | undefined,\n ) => {\n const options = await fetchOptions(userOptions ?? {});\n const element = options._element;\n\n // Don't await for the size data before creating the callback so that\n // setupOnResize and removeOnResize have the same \"timing\" and therefore\n // calling onResize and offResize immediately without awaiting removes the\n // callback.\n const entry = createCallback(handler, options);\n const callback = entry._callback;\n const sizeData = await fetchCurrentSize(element);\n\n if (callback.isRemoved()) {\n return;\n }\n\n entry._data = sizeData;\n allSizeData.set(element, sizeData);\n\n // Always use observeLater. This is because the initial call to callback\n // shouldn't be debounced, and so we call it manually here, regardless if\n // it's a new target or not. Therefore we don't want the observer to also\n // call it in case it _is_ a new target.\n // It's ok if already observed, won't do anything.\n xObserver.observeLater(element);\n\n if (!userOptions?.skipInitial) {\n debug: logger?.debug5(\"Calling initially with\", element, sizeData);\n // Use a one-off callback that's not debounced for the initial call.\n await invokeCallback(wrapCallback(handler), element, sizeData);\n }\n };\n\n // ----------\n\n const removeOnResize = async (\n handler: OnResizeHandler,\n target: SizeTarget | undefined,\n ) => {\n const options = await fetchOptions({ target });\n const element = options._element;\n const currEntry = allCallbacks.get(element)?.get(handler);\n if (currEntry) {\n MH.remove(currEntry._callback);\n\n if (handler === setSizeCssProps) {\n // delete the properties\n setSizeCssProps(element, null);\n }\n }\n };\n\n // ----------\n\n const deleteHandler = (\n handler: OnResizeHandler,\n options: OnResizeOptionsInternal,\n ) => {\n const element = options._element;\n MH.deleteKey(allCallbacks.get(element), handler);\n allCallbacks.prune(element);\n\n if (!allCallbacks.has(element)) {\n debug: logger?.debug4(\n \"No more callbacks for target; unobserving\",\n element,\n );\n xObserver.unobserve(element);\n MH.deleteKey(allSizeData, element);\n }\n };\n\n // ----------\n\n const processEntry = (entry: ResizeObserverEntry) => {\n // In reality, it can't be just a base Element\n const element = MH.targetOf(entry);\n\n const latestData = getSizeData(entry);\n allSizeData.set(element, latestData);\n\n debug: logger?.debug9(\"New size data\", element, latestData);\n\n for (const entry of allCallbacks.get(element)?.values() || []) {\n const thresholdsExceeded = hasExceededThreshold(\n entry._options,\n latestData,\n entry._data,\n );\n\n if (!thresholdsExceeded) {\n debug: logger?.debug9(\"Threshold not exceeded\");\n continue;\n }\n\n entry._data = latestData;\n\n invokeCallback(entry._callback, element, latestData);\n }\n };\n\n // ----------\n\n this.fetchCurrentSize = fetchCurrentSize;\n\n // ----------\n\n this.trackSize = async (handler?, options?) => {\n if (!handler) {\n handler = setSizeCssProps;\n }\n\n return setupOnResize(handler, options);\n };\n\n // ----------\n\n this.noTrackSize = (handler?, target?) => {\n if (!handler) {\n handler = setSizeCssProps;\n }\n\n removeOnResize(handler, target); // no need to await\n };\n\n // ----------\n\n this.onResize = setupOnResize;\n\n // ----------\n\n this.offResize = (handler, target?) => {\n removeOnResize(handler, target); // no need to await\n };\n }\n}\n\n/**\n * @interface\n */\nexport type SizeWatcherConfig = {\n /**\n * The default value for\n * {@link OnResizeOptions.debounceWindow | debounceWindow} in calls to\n * {@link SizeWatcher.onResize}.\n *\n * @defaultValue 75\n */\n debounceWindow?: number;\n\n /**\n * The default value for\n * {@link OnResizeOptions.threshold | threshold} in calls to\n * {@link SizeWatcher.onResize}.\n *\n * @defaultValue 50\n */\n resizeThreshold?: number;\n};\n\n/**\n * @interface\n */\nexport type OnResizeOptions = {\n /**\n * If it is not given, or is `null` or `window`, then it will track the size\n * of the viewport (akin to `clientHeight` on `documentElement`).\n *\n * If it is `document`, then it will use `document.documentElement`.\n *\n * Other values of target must be an `Element` and are taken literally.\n *\n * @defaultValue undefined\n */\n target?: SizeTarget;\n\n /**\n * Specifies whether to listen for changes in content box size or border box\n * size.\n *\n * If not given, then it listens for changes in either.\n *\n * @defaultValue undefined\n */\n box?: Box;\n\n /**\n * Specifies whether to listen for changes in width or height.\n *\n * If not given, then it listens for changes in either.\n *\n * @defaultValue undefined\n */\n dimension?: Dimension;\n\n /**\n * If non-0, the handler will only be called when the target's size in the\n * observed {@link OnResizeOptions.dimension} and {@link OnResizeOptions.box}\n * type has changed at least `threshold` pixels since the last time the\n * handler was called.\n *\n * Special case when `threshold` is 0 and at least one of\n * {@link OnResizeOptions.dimension} or {@link OnResizeOptions.box} is given:\n * if there's a resize event but the size in the observed dimensions/box\n * types has not changed, the callback is _not_ called.\n *\n * @defaultValue {@link SizeWatcherConfig.resizeThreshold}\n */\n threshold?: number;\n\n /**\n * Do not call the handler until there's a future resize of the element.\n *\n * By default we call the handler (almost) immediately with the current size\n * data for the target.\n *\n * @defaultValue false\n */\n skipInitial?: boolean;\n\n /**\n * If non-0, the handler will be \"debounced\" so it's called at most\n * `debounceWindow` milliseconds.\n *\n * @defaultValue {@link SizeWatcherConfig.debounceWindow}\n */\n debounceWindow?: number;\n};\n\n/**\n * The handler is invoked with three arguments:\n *\n * - the element that has been resized: if the target you requested was the\n * viewport, then this will be a fixed positioned overlay that tracks the\n * size of the viewport\n * - the {@link SizeData} for the element\n */\nexport type OnResizeHandlerArgs = [Element, SizeData];\nexport type OnResizeCallback = Callback<OnResizeHandlerArgs>;\nexport type OnResizeHandler =\n | CallbackHandler<OnResizeHandlerArgs>\n | OnResizeCallback;\n\nexport type SizeData = Record<Box, Size>;\n\n// ----------------------------------------\n\ntype SizeWatcherConfigInternal = {\n _debounceWindow: number;\n _resizeThreshold: number;\n};\n\ntype OnResizeOptionsInternal = {\n _element: Element;\n _box: Box | null;\n _dimension: Dimension | null;\n _threshold: number;\n _debounceWindow: number;\n};\n\ntype CallbackEntry = {\n _callback: OnResizeCallback;\n _options: OnResizeOptionsInternal;\n _data?: SizeData;\n};\n\nconst CONSTRUCTOR_KEY: unique symbol = MC.SYMBOL() as typeof CONSTRUCTOR_KEY;\nconst instances = MH.newMap<string, SizeWatcher>();\n\nconst getConfig = (\n config: SizeWatcherConfig | undefined,\n): SizeWatcherConfigInternal => {\n config ??= {};\n return {\n _debounceWindow: toNonNegNum(config[MC.S_DEBOUNCE_WINDOW], 75),\n // If threshold is 0, internally treat as 1 (pixel)\n _resizeThreshold: toNonNegNum(config.resizeThreshold, 50) || 1,\n };\n};\n\n// --------------------\n\nconst hasExceededThreshold = (\n options: OnResizeOptionsInternal,\n latestData: SizeData,\n lastThresholdData: SizeData | undefined,\n): boolean => {\n if (!lastThresholdData) {\n /* istanbul ignore */\n return false;\n }\n\n let box: Box, dim: Dimension;\n for (box in latestData) {\n if (options._box && options._box !== box) {\n continue;\n }\n\n for (dim in latestData[box]) {\n if (options._dimension && options._dimension !== dim) {\n continue;\n }\n\n const diff = MH.abs(latestData[box][dim] - lastThresholdData[box][dim]);\n if (diff >= options._threshold) {\n return true;\n }\n }\n }\n\n return false;\n};\n\nconst getSizeData = (entry: ResizeObserverEntry): SizeData => {\n const borderBox = getEntryBorderBox(entry, true);\n const contentBox = getEntryContentBox(entry);\n\n return {\n border: borderBox,\n content: contentBox,\n };\n};\n\nconst setSizeCssProps = (\n element: Element,\n sizeData: SizeData | undefined | null,\n) => {\n let prefix = \"\";\n if (element === tryGetViewportOverlay()) {\n // Set the CSS vars on the root element\n element = MH.getDocElement();\n prefix = \"window-\";\n }\n\n const props = {\n borderWidth: sizeData?.border[MC.S_WIDTH],\n borderHeight: sizeData?.border[MC.S_HEIGHT],\n contentWidth: sizeData?.content[MC.S_WIDTH],\n contentHeight: sizeData?.content[MC.S_HEIGHT],\n };\n setNumericStyleJsVars(element, props, { _prefix: prefix }); // don't await here\n};\n\nconst fetchElement = async (\n target: SizeTarget | undefined,\n): Promise<Element> => {\n if (MH.isElement(target)) {\n return target;\n }\n\n if (!target || target === MH.getWindow()) {\n return fetchViewportOverlay();\n }\n\n if (target === MH.getDoc()) {\n return MH.getDocElement();\n }\n\n throw MH.usageError(\"Unsupported resize target\");\n};\n\nconst invokeCallback = (\n callback: OnResizeCallback,\n element: Element,\n sizeData: SizeData,\n) => callback.invoke(element, MH.copyObject(sizeData)).catch(logError);\n"],"mappings":"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","ignoreList":[]}