react-window 2.1.1 → 2.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/react-window.cjs +1 -1
- package/dist/react-window.cjs.map +1 -1
- package/dist/react-window.js +65 -62
- package/dist/react-window.js.map +1 -1
- package/docs/assets/{AriaRolesRoute-YProrOKU.js → AriaRolesRoute-CioRrafx.js} +2 -2
- package/docs/assets/{AriaRolesRoute-YProrOKU.js.map → AriaRolesRoute-CioRrafx.js.map} +1 -1
- package/docs/assets/{AriaRolesRoute-DrA2Z2g2.js → AriaRolesRoute-CjzrHhTE.js} +2 -2
- package/docs/assets/{AriaRolesRoute-DrA2Z2g2.js.map → AriaRolesRoute-CjzrHhTE.js.map} +1 -1
- package/docs/assets/{AriaRolesRoute-B8u4KZlN.js → AriaRolesRoute-DILWjLTS.js} +2 -2
- package/docs/assets/{AriaRolesRoute-B8u4KZlN.js.map → AriaRolesRoute-DILWjLTS.js.map} +1 -1
- package/docs/assets/CellComponent.example-uUYIhpiW.js +2 -0
- package/docs/assets/{CellComponent.example-ChzwGLAD.js.map → CellComponent.example-uUYIhpiW.js.map} +1 -1
- package/docs/assets/{Code-BJ6U_DpT.js → Code-r2plEB3N.js} +2 -2
- package/docs/assets/{Code-BJ6U_DpT.js.map → Code-r2plEB3N.js.map} +1 -1
- package/docs/assets/{ComponentProps-0JkeHmLq.js → ComponentProps-CnDy_aV8.js} +2 -2
- package/docs/assets/{ComponentProps-0JkeHmLq.js.map → ComponentProps-CnDy_aV8.js.map} +1 -1
- package/docs/assets/ContinueLink-BDXFlJ2t.js +2 -0
- package/docs/assets/{ContinueLink-Mq4XOwMu.js.map → ContinueLink-BDXFlJ2t.js.map} +1 -1
- package/docs/assets/{FixedRowHeightsRoute-DXFNDmnz.js → FixedRowHeightsRoute-CCpmgQDh.js} +2 -2
- package/docs/assets/{FixedRowHeightsRoute-DXFNDmnz.js.map → FixedRowHeightsRoute-CCpmgQDh.js.map} +1 -1
- package/docs/assets/{GettingStartedRoute-D-bI_IZb.js → GettingStartedRoute-bLneovGd.js} +2 -2
- package/docs/assets/{GettingStartedRoute-D-bI_IZb.js.map → GettingStartedRoute-bLneovGd.js.map} +1 -1
- package/docs/assets/Grid-BjC_BndR.js +2 -0
- package/docs/assets/Grid-BjC_BndR.js.map +1 -0
- package/docs/assets/{Header-DM8OHOd_.js → Header-CWpEkQSA.js} +2 -2
- package/docs/assets/{Header-DM8OHOd_.js.map → Header-CWpEkQSA.js.map} +1 -1
- package/docs/assets/HorizontalListsRoute-CIfKb2Dg.js +2 -0
- package/docs/assets/HorizontalListsRoute-CIfKb2Dg.js.map +1 -0
- package/docs/assets/ImagesRoute-jiaLWXKV.js +2 -0
- package/docs/assets/ImagesRoute-jiaLWXKV.js.map +1 -0
- package/docs/assets/{ImperativeApiRoute-BdK7xl-u.js → ImperativeApiRoute-DRVezybQ.js} +2 -2
- package/docs/assets/{ImperativeApiRoute-BdK7xl-u.js.map → ImperativeApiRoute-DRVezybQ.js.map} +1 -1
- package/docs/assets/{ImperativeApiRoute-DdlTcZ7C.js → ImperativeApiRoute-DXzOo4Dn.js} +2 -2
- package/docs/assets/{ImperativeApiRoute-DdlTcZ7C.js.map → ImperativeApiRoute-DXzOo4Dn.js.map} +1 -1
- package/docs/assets/List-CB_lBMmJ.js +2 -0
- package/docs/assets/List-CB_lBMmJ.js.map +1 -0
- package/docs/assets/{LoadingSpinner-CcA45RYo.js → LoadingSpinner-D94ZhMZx.js} +2 -2
- package/docs/assets/{LoadingSpinner-CcA45RYo.js.map → LoadingSpinner-D94ZhMZx.js.map} +1 -1
- package/docs/assets/{PageNotFound-BaiFbANH.js → PageNotFound-CZublSHx.js} +2 -2
- package/docs/assets/{PageNotFound-BaiFbANH.js.map → PageNotFound-CZublSHx.js.map} +1 -1
- package/docs/assets/{PlatformRequirementsRoute-BfE0JkzC.js → PlatformRequirementsRoute-Bq7s0cCu.js} +2 -2
- package/docs/assets/{PlatformRequirementsRoute-BfE0JkzC.js.map → PlatformRequirementsRoute-Bq7s0cCu.js.map} +1 -1
- package/docs/assets/{PropsRoute-E2EuXhKK.js → PropsRoute-DrhCHCJM.js} +2 -2
- package/docs/assets/{PropsRoute-E2EuXhKK.js.map → PropsRoute-DrhCHCJM.js.map} +1 -1
- package/docs/assets/{PropsRoute-B2tWvN5Y.js → PropsRoute-Hhqv1kyZ.js} +2 -2
- package/docs/assets/{PropsRoute-B2tWvN5Y.js.map → PropsRoute-Hhqv1kyZ.js.map} +1 -1
- package/docs/assets/RTLGridsRoute-C7t1OLVr.js +2 -0
- package/docs/assets/RTLGridsRoute-C7t1OLVr.js.map +1 -0
- package/docs/assets/{RenderingGridRoute-BvlK0VIG.js → RenderingGridRoute-Cd7Z3aKa.js} +2 -2
- package/docs/assets/{RenderingGridRoute-BvlK0VIG.js.map → RenderingGridRoute-Cd7Z3aKa.js.map} +1 -1
- package/docs/assets/ScratchpadRoute-BE3BnYuC.js +2 -0
- package/docs/assets/{ScratchpadRoute-wzxynGR2.js.map → ScratchpadRoute-BE3BnYuC.js.map} +1 -1
- package/docs/assets/{Select-BtAY4kA-.js → Select-D7Hzggtt.js} +2 -2
- package/docs/assets/{Select-BtAY4kA-.js.map → Select-D7Hzggtt.js.map} +1 -1
- package/docs/assets/{StickyRowsRoute-DUIWoMJJ.js → StickyRowsRoute-BFaLUY3R.js} +2 -2
- package/docs/assets/{StickyRowsRoute-DUIWoMJJ.js.map → StickyRowsRoute-BFaLUY3R.js.map} +1 -1
- package/docs/assets/{SupportRoute-DO1SyQwL.js → SupportRoute-DbxH2zGy.js} +2 -2
- package/docs/assets/{SupportRoute-DO1SyQwL.js.map → SupportRoute-DbxH2zGy.js.map} +1 -1
- package/docs/assets/{TabularDataRoute-DMwDahmo.js → TabularDataRoute-DI0yJsDS.js} +2 -2
- package/docs/assets/{TabularDataRoute-DMwDahmo.js.map → TabularDataRoute-DI0yJsDS.js.map} +1 -1
- package/docs/assets/{VariableRowHeightsRoute-B9mccfzh.js → VariableRowHeightsRoute-cSpZuhJh.js} +2 -2
- package/docs/assets/{VariableRowHeightsRoute-B9mccfzh.js.map → VariableRowHeightsRoute-cSpZuhJh.js.map} +1 -1
- package/docs/assets/{arePropsEqual-MBk0PiJi.js → arePropsEqual-CaQN03VG.js} +2 -2
- package/docs/assets/{arePropsEqual-MBk0PiJi.js.map → arePropsEqual-CaQN03VG.js.map} +1 -1
- package/docs/assets/index-C1XSX8kr.css +1 -0
- package/docs/assets/{index-3R9tv3eW.js → index-Cnm6lMUF.js} +3 -3
- package/docs/assets/index-Cnm6lMUF.js.map +1 -0
- package/docs/assets/{useCitiesByState-DlHLfAIQ.js → useCitiesByState-DF2_rnmt.js} +2 -2
- package/docs/assets/{useCitiesByState-DlHLfAIQ.js.map → useCitiesByState-DF2_rnmt.js.map} +1 -1
- package/docs/assets/{useContacts-C-Fuwn4U.js → useContacts-X0AOlpLx.js} +2 -2
- package/docs/assets/{useContacts-C-Fuwn4U.js.map → useContacts-X0AOlpLx.js.map} +1 -1
- package/docs/generated/code-snippets/ImageRow.json +3 -0
- package/docs/generated/code-snippets/Images.json +3 -0
- package/docs/generated/code-snippets/useImageSizeCache.json +3 -0
- package/docs/images/animal-3546613_1280.jpg +0 -0
- package/docs/images/ball-bearings-1958083_1280.jpg +0 -0
- package/docs/images/bourke-luck-potholes-163065_1280.jpg +0 -0
- package/docs/images/child-1439468_1280.jpg +0 -0
- package/docs/images/digiart-3405596_1280.jpg +0 -0
- package/docs/images/electrical-cable-mess-2654084_1280.jpg +0 -0
- package/docs/images/elephant-8608983_1280.jpg +0 -0
- package/docs/images/fema-4987740_1280.jpg +0 -0
- package/docs/images/log-3135150_1280.jpg +0 -0
- package/docs/images/man-1838330_1280.jpg +0 -0
- package/docs/images/manipulation-2735724_1280.jpg +0 -0
- package/docs/images/newborn-6467761_1280.jpg +0 -0
- package/docs/images/old-farm-house-2096642_1280.jpg +0 -0
- package/docs/images/people-2557534_1280.jpg +0 -0
- package/docs/images/photo-1516712109157-6a67f5d73fa1.jpg +0 -0
- package/docs/images/photo-1562123408-fbf8cbf92c03.jpg +0 -0
- package/docs/images/sculpture-99484_1280.jpg +0 -0
- package/docs/images/sport-4765008_1280.jpg +0 -0
- package/docs/images/styrofoam-19493_1280.jpg +0 -0
- package/docs/images/trabi-328402_1280.jpg +0 -0
- package/docs/images/trailers-5073244_1280.jpg +0 -0
- package/docs/images/tub-114349_1280.jpg +0 -0
- package/docs/images/venus-fly-trap-3684935_1280.jpg +0 -0
- package/docs/images/web-5013633_1280.jpg +0 -0
- package/docs/images/winter-1675197_1280.jpg +0 -0
- package/docs/images/woman-1838149_1280.jpg +0 -0
- package/docs/index.html +2 -2
- package/docs/stats.html +1 -1
- package/package.json +1 -1
- package/docs/assets/CellComponent.example-ChzwGLAD.js +0 -2
- package/docs/assets/ContinueLink-Mq4XOwMu.js +0 -2
- package/docs/assets/Grid-Cio8auWD.js +0 -2
- package/docs/assets/Grid-Cio8auWD.js.map +0 -1
- package/docs/assets/HorizontalListsRoute-Dk2qJcyq.js +0 -2
- package/docs/assets/HorizontalListsRoute-Dk2qJcyq.js.map +0 -1
- package/docs/assets/List-B9HC1vRM.js +0 -2
- package/docs/assets/List-B9HC1vRM.js.map +0 -1
- package/docs/assets/RTLGridsRoute-BiJ_ARQb.js +0 -2
- package/docs/assets/RTLGridsRoute-BiJ_ARQb.js.map +0 -1
- package/docs/assets/ScratchpadRoute-wzxynGR2.js +0 -2
- package/docs/assets/index-3R9tv3eW.js.map +0 -1
- package/docs/assets/index-DbmHyJV-.css +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"arePropsEqual-MBk0PiJi.js","sources":["../../src/components/Block.tsx","../../lib/utils/parseNumericStyleValue.ts","../../lib/utils/getRTLOffsetType.ts","../../lib/utils/adjustScrollOffsetForRtl.ts","../../lib/utils/assert.ts","../../lib/utils/shallowCompare.ts","../../lib/core/getEstimatedSize.ts","../../lib/core/getStartStopIndices.ts","../../lib/core/useCachedBounds.ts","../../lib/core/createCachedBounds.ts","../../lib/core/useVirtualizer.ts","../../lib/hooks/useResizeObserver.ts","../../lib/core/useItemSize.ts","../../lib/hooks/useStableCallback.ts","../../lib/core/getOffsetForIndex.ts","../../lib/hooks/useMemoizedObject.ts","../../lib/utils/arePropsEqual.ts"],"sourcesContent":["import type { HTMLAttributes, PropsWithChildren } from \"react\";\nimport { ErrorBoundary } from \"./ErrorBoundary\";\n\nexport function Block({\n children,\n className,\n ...rest\n}: PropsWithChildren<HTMLAttributes<HTMLDivElement> & { className?: string }>) {\n return (\n <ErrorBoundary>\n <div\n className={`border-lg bg-black/30 text-slate-300 rounded-lg p-2 ${className}`}\n {...rest}\n >\n {children}\n </div>\n </ErrorBoundary>\n );\n}\n","import type { CSSProperties } from \"react\";\n\nexport function parseNumericStyleValue(\n value: CSSProperties[\"height\"]\n): number | undefined {\n if (value !== undefined) {\n switch (typeof value) {\n case \"number\": {\n return value;\n }\n case \"string\": {\n if (value.endsWith(\"px\")) {\n return parseFloat(value);\n }\n break;\n }\n }\n }\n}\n","export type RTLOffsetType =\n | \"negative\"\n | \"positive-descending\"\n | \"positive-ascending\";\n\nlet cachedRTLResult: RTLOffsetType | null = null;\n\n// TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n// Chrome does not seem to adhere; its scrollLeft values are positive (measured relative to the left).\n// Safari's elastic bounce makes detecting this even more complicated wrt potential false positives.\n// The safest way to check this is to intentionally set a negative offset,\n// and then verify that the subsequent \"scroll\" event matches the negative offset.\n// If it does not match, then we can assume a non-standard RTL scroll implementation.\nexport function getRTLOffsetType(recalculate: boolean = false): RTLOffsetType {\n if (cachedRTLResult === null || recalculate) {\n const outerDiv = document.createElement(\"div\");\n const outerStyle = outerDiv.style;\n outerStyle.width = \"50px\";\n outerStyle.height = \"50px\";\n outerStyle.overflow = \"scroll\";\n outerStyle.direction = \"rtl\";\n\n const innerDiv = document.createElement(\"div\");\n const innerStyle = innerDiv.style;\n innerStyle.width = \"100px\";\n innerStyle.height = \"100px\";\n\n outerDiv.appendChild(innerDiv);\n\n document.body.appendChild(outerDiv);\n\n if (outerDiv.scrollLeft > 0) {\n cachedRTLResult = \"positive-descending\";\n } else {\n outerDiv.scrollLeft = 1;\n if (outerDiv.scrollLeft === 0) {\n cachedRTLResult = \"negative\";\n } else {\n cachedRTLResult = \"positive-ascending\";\n }\n }\n\n document.body.removeChild(outerDiv);\n\n return cachedRTLResult;\n }\n\n return cachedRTLResult;\n}\n","import type { Direction } from \"../core/types\";\nimport { getRTLOffsetType } from \"./getRTLOffsetType\";\n\nexport function adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset\n}: {\n containerElement: HTMLElement | null;\n direction: Direction;\n isRtl: boolean;\n scrollOffset: number;\n}) {\n // TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n // This is not the case for all browsers though (e.g. Chrome reports values as positive, measured relative to the left).\n // So we need to determine which browser behavior we're dealing with, and mimic it.\n if (direction === \"horizontal\") {\n if (isRtl) {\n switch (getRTLOffsetType()) {\n case \"negative\": {\n return -scrollOffset;\n }\n case \"positive-descending\": {\n if (containerElement) {\n const { clientWidth, scrollLeft, scrollWidth } = containerElement;\n return scrollWidth - clientWidth - scrollLeft;\n }\n break;\n }\n }\n }\n }\n return scrollOffset;\n}\n","export function assert(\n expectedCondition: unknown,\n message: string = \"Assertion error\"\n): asserts expectedCondition {\n if (!expectedCondition) {\n console.error(message);\n\n throw Error(message);\n }\n}\n","import { assert } from \"./assert\";\n\nexport function shallowCompare<Type extends object>(\n a: Type | undefined,\n b: Type | undefined\n) {\n if (a === b) {\n return true;\n }\n\n if (!!a !== !!b) {\n return false;\n }\n\n assert(a !== undefined);\n assert(b !== undefined);\n\n if (Object.keys(a).length !== Object.keys(b).length) {\n return false;\n }\n\n for (const key in a) {\n if (!Object.is(b[key], a[key])) {\n return false;\n }\n }\n\n return true;\n}\n","import type { CachedBounds, SizeFunction } from \"./types\";\nimport { assert } from \"../utils/assert\";\n\nexport function getEstimatedSize<Props extends object>({\n cachedBounds,\n itemCount,\n itemSize\n}: {\n cachedBounds: CachedBounds;\n itemCount: number;\n itemSize: number | SizeFunction<Props>;\n}) {\n if (itemCount === 0) {\n return 0;\n } else if (typeof itemSize === \"number\") {\n return itemCount * itemSize;\n } else {\n const bounds = cachedBounds.get(\n cachedBounds.size === 0 ? 0 : cachedBounds.size - 1\n );\n assert(bounds !== undefined, \"Unexpected bounds cache miss\");\n\n const averageItemSize =\n (bounds.scrollOffset + bounds.size) / cachedBounds.size;\n\n return itemCount * averageItemSize;\n }\n}\n","import type { CachedBounds } from \"./types\";\n\nexport function getStartStopIndices({\n cachedBounds,\n containerScrollOffset,\n containerSize,\n itemCount,\n overscanCount\n}: {\n cachedBounds: CachedBounds;\n containerScrollOffset: number;\n containerSize: number;\n itemCount: number;\n overscanCount: number;\n}): {\n startIndexVisible: number;\n stopIndexVisible: number;\n startIndexOverscan: number;\n stopIndexOverscan: number;\n} {\n const maxIndex = itemCount - 1;\n\n let startIndexVisible = 0;\n let stopIndexVisible = -1;\n let startIndexOverscan = 0;\n let stopIndexOverscan = -1;\n let currentIndex = 0;\n\n while (currentIndex < maxIndex) {\n const bounds = cachedBounds.get(currentIndex);\n\n if (bounds.scrollOffset + bounds.size > containerScrollOffset) {\n break;\n }\n\n currentIndex++;\n }\n\n startIndexVisible = currentIndex;\n startIndexOverscan = Math.max(0, startIndexVisible - overscanCount);\n\n while (currentIndex < maxIndex) {\n const bounds = cachedBounds.get(currentIndex);\n\n if (\n bounds.scrollOffset + bounds.size >=\n containerScrollOffset + containerSize\n ) {\n break;\n }\n\n currentIndex++;\n }\n\n stopIndexVisible = Math.min(maxIndex, currentIndex);\n stopIndexOverscan = Math.min(itemCount - 1, stopIndexVisible + overscanCount);\n\n if (startIndexVisible < 0) {\n startIndexVisible = 0;\n stopIndexVisible = -1;\n startIndexOverscan = 0;\n stopIndexOverscan = -1;\n }\n\n return {\n startIndexVisible,\n stopIndexVisible,\n startIndexOverscan,\n stopIndexOverscan\n };\n}\n","import { useMemo } from \"react\";\nimport { createCachedBounds } from \"./createCachedBounds\";\nimport type { CachedBounds, SizeFunction } from \"./types\";\n\nexport function useCachedBounds<Props extends object>({\n itemCount,\n itemProps,\n itemSize\n}: {\n itemCount: number;\n itemProps: Props;\n itemSize: number | SizeFunction<Props>;\n}): CachedBounds {\n return useMemo(\n () =>\n createCachedBounds({\n itemCount,\n itemProps,\n itemSize\n }),\n [itemCount, itemProps, itemSize]\n );\n}\n","import { assert } from \"../utils/assert\";\nimport type { Bounds, CachedBounds, SizeFunction } from \"./types\";\n\nexport function createCachedBounds<Props extends object>({\n itemCount,\n itemProps,\n itemSize\n}: {\n itemCount: number;\n itemProps: Props;\n itemSize: number | SizeFunction<Props>;\n}): CachedBounds {\n const cache = new Map<number, Bounds>();\n\n return {\n get(index: number) {\n assert(index < itemCount, `Invalid index ${index}`);\n\n while (cache.size - 1 < index) {\n const currentIndex = cache.size;\n\n let size: number;\n switch (typeof itemSize) {\n case \"function\": {\n size = itemSize(currentIndex, itemProps);\n break;\n }\n case \"number\": {\n size = itemSize;\n break;\n }\n }\n\n if (currentIndex === 0) {\n cache.set(currentIndex, {\n size,\n scrollOffset: 0\n });\n } else {\n const previousRowBounds = cache.get(currentIndex - 1);\n assert(\n previousRowBounds !== undefined,\n `Unexpected bounds cache miss for index ${index}`\n );\n\n cache.set(currentIndex, {\n scrollOffset:\n previousRowBounds.scrollOffset + previousRowBounds.size,\n size\n });\n }\n }\n\n const bounds = cache.get(index);\n assert(\n bounds !== undefined,\n `Unexpected bounds cache miss for index ${index}`\n );\n\n return bounds;\n },\n set(index: number, bounds: Bounds) {\n cache.set(index, bounds);\n },\n get size() {\n return cache.size;\n }\n };\n}\n","import {\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties\n} from \"react\";\nimport { useIsomorphicLayoutEffect } from \"../hooks/useIsomorphicLayoutEffect\";\nimport { useResizeObserver } from \"../hooks/useResizeObserver\";\nimport { useStableCallback } from \"../hooks/useStableCallback\";\nimport type { Align } from \"../types\";\nimport { adjustScrollOffsetForRtl } from \"../utils/adjustScrollOffsetForRtl\";\nimport { shallowCompare } from \"../utils/shallowCompare\";\nimport { getEstimatedSize as getEstimatedSizeUtil } from \"./getEstimatedSize\";\nimport { getOffsetForIndex } from \"./getOffsetForIndex\";\nimport { getStartStopIndices as getStartStopIndicesUtil } from \"./getStartStopIndices\";\nimport type { Direction, SizeFunction } from \"./types\";\nimport { useCachedBounds } from \"./useCachedBounds\";\nimport { useItemSize } from \"./useItemSize\";\n\nexport function useVirtualizer<Props extends object>({\n containerElement,\n containerStyle,\n defaultContainerSize = 0,\n direction,\n isRtl = false,\n itemCount,\n itemProps,\n itemSize: itemSizeProp,\n onResize,\n overscanCount\n}: {\n containerElement: HTMLElement | null;\n containerStyle?: CSSProperties;\n defaultContainerSize?: number;\n direction: Direction;\n isRtl?: boolean;\n itemCount: number;\n itemProps: Props;\n itemSize: number | string | SizeFunction<Props>;\n onResize:\n | ((\n size: { height: number; width: number },\n prevSize: { height: number; width: number }\n ) => void)\n | undefined;\n overscanCount: number;\n}) {\n const [indices, setIndices] = useState<{\n startIndexVisible: number;\n stopIndexVisible: number;\n startIndexOverscan: number;\n stopIndexOverscan: number;\n }>({\n startIndexVisible: 0,\n startIndexOverscan: 0,\n stopIndexVisible: -1,\n stopIndexOverscan: -1\n });\n\n // Guard against temporarily invalid indices that may occur when item count decreases\n // Cached bounds object will be re-created and a second render will restore things\n const {\n startIndexVisible,\n startIndexOverscan,\n stopIndexVisible,\n stopIndexOverscan\n } = {\n startIndexVisible: Math.min(itemCount - 1, indices.startIndexVisible),\n startIndexOverscan: Math.min(itemCount - 1, indices.startIndexOverscan),\n stopIndexVisible: Math.min(itemCount - 1, indices.stopIndexVisible),\n stopIndexOverscan: Math.min(itemCount - 1, indices.stopIndexOverscan)\n };\n\n const { height = defaultContainerSize, width = defaultContainerSize } =\n useResizeObserver({\n defaultHeight:\n direction === \"vertical\" ? defaultContainerSize : undefined,\n defaultWidth:\n direction === \"horizontal\" ? defaultContainerSize : undefined,\n element: containerElement,\n mode: direction === \"vertical\" ? \"only-height\" : \"only-width\",\n style: containerStyle\n });\n\n const prevSizeRef = useRef<{ height: number; width: number }>({\n height: 0,\n width: 0\n });\n\n const containerSize = direction === \"vertical\" ? height : width;\n\n const itemSize = useItemSize({ containerSize, itemSize: itemSizeProp });\n\n useLayoutEffect(() => {\n if (typeof onResize === \"function\") {\n const prevSize = prevSizeRef.current;\n\n if (prevSize.height !== height || prevSize.width !== width) {\n onResize({ height, width }, { ...prevSize });\n\n prevSize.height = height;\n prevSize.width = width;\n }\n }\n }, [height, onResize, width]);\n\n const cachedBounds = useCachedBounds({\n itemCount,\n itemProps,\n itemSize\n });\n\n const getCellBounds = useCallback(\n (index: number) => cachedBounds.get(index),\n [cachedBounds]\n );\n\n const getEstimatedSize = useCallback(\n () =>\n getEstimatedSizeUtil({\n cachedBounds,\n itemCount,\n itemSize\n }),\n [cachedBounds, itemCount, itemSize]\n );\n\n const getStartStopIndices = useCallback(\n (scrollOffset: number) => {\n const containerScrollOffset = adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset\n });\n\n return getStartStopIndicesUtil({\n cachedBounds,\n containerScrollOffset,\n containerSize,\n itemCount,\n overscanCount\n });\n },\n [\n cachedBounds,\n containerElement,\n containerSize,\n direction,\n isRtl,\n itemCount,\n overscanCount\n ]\n );\n\n useIsomorphicLayoutEffect(() => {\n const scrollOffset =\n (direction === \"vertical\"\n ? containerElement?.scrollTop\n : containerElement?.scrollLeft) ?? 0;\n\n setIndices(getStartStopIndices(scrollOffset));\n }, [containerElement, direction, getStartStopIndices]);\n\n useIsomorphicLayoutEffect(() => {\n if (!containerElement) {\n return;\n }\n\n const onScroll = () => {\n setIndices((prev) => {\n const { scrollLeft, scrollTop } = containerElement;\n\n const scrollOffset = adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset: direction === \"vertical\" ? scrollTop : scrollLeft\n });\n\n const next = getStartStopIndicesUtil({\n cachedBounds,\n containerScrollOffset: scrollOffset,\n containerSize,\n itemCount,\n overscanCount\n });\n\n if (shallowCompare(next, prev)) {\n return prev;\n }\n\n return next;\n });\n };\n\n containerElement.addEventListener(\"scroll\", onScroll);\n\n return () => {\n containerElement.removeEventListener(\"scroll\", onScroll);\n };\n }, [\n cachedBounds,\n containerElement,\n containerSize,\n direction,\n itemCount,\n overscanCount\n ]);\n\n const scrollToIndex = useStableCallback(\n ({\n align = \"auto\",\n containerScrollOffset,\n index\n }: {\n align?: Align;\n containerScrollOffset: number;\n index: number;\n }) => {\n let scrollOffset = getOffsetForIndex({\n align,\n cachedBounds,\n containerScrollOffset,\n containerSize,\n index,\n itemCount,\n itemSize\n });\n\n if (containerElement) {\n scrollOffset = adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset\n });\n\n if (typeof containerElement.scrollTo !== \"function\") {\n // Special case for environments like jsdom that don't implement scrollTo\n const next = getStartStopIndices(scrollOffset);\n if (!shallowCompare(indices, next)) {\n setIndices(next);\n }\n }\n\n return scrollOffset;\n }\n }\n );\n\n return {\n getCellBounds,\n getEstimatedSize,\n scrollToIndex,\n startIndexOverscan,\n startIndexVisible,\n stopIndexOverscan,\n stopIndexVisible\n };\n}\n","import { useMemo, useState, type CSSProperties } from \"react\";\nimport { parseNumericStyleValue } from \"../utils/parseNumericStyleValue\";\nimport { useIsomorphicLayoutEffect } from \"./useIsomorphicLayoutEffect\";\n\nexport function useResizeObserver({\n box,\n defaultHeight,\n defaultWidth,\n disabled: disabledProp,\n element,\n mode,\n style\n}: {\n box?: ResizeObserverBoxOptions;\n defaultHeight?: number;\n defaultWidth?: number;\n disabled?: boolean;\n element: HTMLElement | null;\n mode?: \"only-height\" | \"only-width\";\n style?: CSSProperties;\n}) {\n const { styleHeight, styleWidth } = useMemo(\n () => ({\n styleHeight: parseNumericStyleValue(style?.height),\n styleWidth: parseNumericStyleValue(style?.width)\n }),\n [style?.height, style?.width]\n );\n\n const [state, setState] = useState<{\n height: number | undefined;\n width: number | undefined;\n }>({\n height: defaultHeight,\n width: defaultWidth\n });\n\n const disabled =\n disabledProp ||\n (mode === \"only-height\" && styleHeight !== undefined) ||\n (mode === \"only-width\" && styleWidth !== undefined) ||\n (styleHeight !== undefined && styleWidth !== undefined);\n\n useIsomorphicLayoutEffect(() => {\n if (element === null || disabled) {\n return;\n }\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { contentRect, target } = entry;\n if (element === target) {\n setState((prevState) => {\n if (\n prevState.height === contentRect.height &&\n prevState.width === contentRect.width\n ) {\n return prevState;\n }\n\n return {\n height: contentRect.height,\n width: contentRect.width\n };\n });\n }\n }\n });\n resizeObserver.observe(element, { box });\n\n return () => {\n resizeObserver?.unobserve(element);\n };\n }, [box, disabled, element, styleHeight, styleWidth]);\n\n return useMemo(\n () => ({\n height: styleHeight ?? state.height,\n width: styleWidth ?? state.width\n }),\n [state, styleHeight, styleWidth]\n );\n}\n","import { assert } from \"../utils/assert\";\nimport type { SizeFunction } from \"./types\";\n\nexport function useItemSize<Props extends object>({\n containerSize,\n itemSize: itemSizeProp\n}: {\n containerSize: number;\n itemSize: number | string | SizeFunction<Props>;\n}) {\n let itemSize: number | SizeFunction<Props>;\n switch (typeof itemSizeProp) {\n case \"string\": {\n assert(\n itemSizeProp.endsWith(\"%\"),\n `Invalid item size: \"${itemSizeProp}\"; string values must be percentages (e.g. \"100%\")`\n );\n assert(\n containerSize !== undefined,\n \"Container size must be defined if a percentage item size is specified\"\n );\n\n itemSize = (containerSize * parseInt(itemSizeProp)) / 100;\n break;\n }\n default: {\n itemSize = itemSizeProp;\n break;\n }\n }\n\n return itemSize;\n}\n","import { useCallback, useRef } from \"react\";\nimport { useIsomorphicLayoutEffect } from \"./useIsomorphicLayoutEffect\";\n\n// Forked from useEventCallback (usehooks-ts)\nexport function useStableCallback<Args, Return>(\n fn: (args: Args) => Return\n): (args: Args) => Return {\n const ref = useRef<typeof fn>(() => {\n throw new Error(\"Cannot call an event handler while rendering.\");\n });\n\n useIsomorphicLayoutEffect(() => {\n ref.current = fn;\n }, [fn]);\n\n return useCallback((args: Args) => ref.current?.(args), [ref]) as (\n args: Args\n ) => Return;\n}\n","import type { Align } from \"../types\";\nimport { getEstimatedSize } from \"./getEstimatedSize\";\nimport type { CachedBounds, SizeFunction } from \"./types\";\n\nexport function getOffsetForIndex<Props extends object>({\n align,\n cachedBounds,\n index,\n itemCount,\n itemSize,\n containerScrollOffset,\n containerSize\n}: {\n align: Align;\n cachedBounds: CachedBounds;\n index: number;\n itemCount: number;\n itemSize: number | SizeFunction<Props>;\n containerScrollOffset: number;\n containerSize: number;\n}) {\n const estimatedTotalSize = getEstimatedSize({\n cachedBounds,\n itemCount,\n itemSize\n });\n\n const bounds = cachedBounds.get(index);\n const maxOffset = Math.max(\n 0,\n Math.min(estimatedTotalSize - containerSize, bounds.scrollOffset)\n );\n const minOffset = Math.max(\n 0,\n bounds.scrollOffset - containerSize + bounds.size\n );\n\n if (align === \"smart\") {\n if (\n containerScrollOffset >= minOffset &&\n containerScrollOffset <= maxOffset\n ) {\n align = \"auto\";\n } else {\n align = \"center\";\n }\n }\n\n switch (align) {\n case \"start\": {\n return maxOffset;\n }\n case \"end\": {\n return minOffset;\n }\n case \"center\": {\n if (bounds.scrollOffset <= containerSize / 2) {\n // Too near the beginning to center-align\n return 0;\n } else if (\n bounds.scrollOffset + bounds.size / 2 >=\n estimatedTotalSize - containerSize / 2\n ) {\n // Too near the end to center-align\n return estimatedTotalSize - containerSize;\n } else {\n return bounds.scrollOffset + bounds.size / 2 - containerSize / 2;\n }\n }\n case \"auto\":\n default: {\n if (\n containerScrollOffset >= minOffset &&\n containerScrollOffset <= maxOffset\n ) {\n return containerScrollOffset;\n } else if (containerScrollOffset < minOffset) {\n return minOffset;\n } else {\n return maxOffset;\n }\n }\n }\n}\n","import { useMemo } from \"react\";\n\nexport function useMemoizedObject<Type extends object>(\n unstableObject: Type\n): Type {\n return useMemo(() => {\n return unstableObject;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, Object.values(unstableObject));\n}\n","import type { CSSProperties } from \"react\";\nimport { shallowCompare } from \"./shallowCompare\";\n\n// Custom comparison function for React.memo()\n// It knows to compare individual style props and ignore the wrapper object.\n// See https://react.dev/reference/react/memo#memo\nexport function arePropsEqual(\n prevProps: { ariaAttributes: object; style: CSSProperties },\n nextProps: { ariaAttributes: object; style: CSSProperties }\n): boolean {\n const {\n ariaAttributes: prevAriaAttributes,\n style: prevStyle,\n ...prevRest\n } = prevProps;\n const {\n ariaAttributes: nextAriaAttributes,\n style: nextStyle,\n ...nextRest\n } = nextProps;\n\n return (\n shallowCompare(prevAriaAttributes, nextAriaAttributes) &&\n shallowCompare(prevStyle, nextStyle) &&\n shallowCompare(prevRest, nextRest)\n );\n}\n"],"names":["Block","children","className","rest","ErrorBoundary","jsx","parseNumericStyleValue","value","endsWith","parseFloat","cachedRTLResult","adjustScrollOffsetForRtl","containerElement","direction","isRtl","scrollOffset","recalculate","outerDiv","document","createElement","outerStyle","style","width","height","overflow","innerDiv","innerStyle","appendChild","body","scrollLeft","removeChild","getRTLOffsetType","clientWidth","scrollWidth","assert","expectedCondition","message","console","error","Error","shallowCompare","a","b","Object","keys","length","key","is","getEstimatedSize","cachedBounds","itemCount","itemSize","bounds","get","size","getStartStopIndices","containerScrollOffset","containerSize","overscanCount","maxIndex","startIndexVisible","stopIndexVisible","startIndexOverscan","stopIndexOverscan","currentIndex","Math","max","min","useCachedBounds","itemProps","useMemo","cache","Map","index","set","previousRowBounds","createCachedBounds","useVirtualizer","containerStyle","defaultContainerSize","itemSizeProp","onResize","indices","setIndices","useState","box","defaultHeight","defaultWidth","disabled","disabledProp","element","mode","styleHeight","styleWidth","state","setState","useIsomorphicLayoutEffect","resizeObserver","ResizeObserver","entries","entry","contentRect","target","prevState","observe","unobserve","useResizeObserver","prevSizeRef","useRef","parseInt","useItemSize","useLayoutEffect","prevSize","current","getCellBounds","useCallback","getEstimatedSizeUtil","getStartStopIndicesUtil","scrollTop","onScroll","prev","next","addEventListener","removeEventListener","scrollToIndex","fn","ref","args","useStableCallback","align","estimatedTotalSize","maxOffset","minOffset","getOffsetForIndex","scrollTo","useMemoizedObject","unstableObject","values","arePropsEqual","prevProps","nextProps","ariaAttributes","prevAriaAttributes","prevStyle","prevRest","nextAriaAttributes","nextStyle","nextRest"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"arePropsEqual-CaQN03VG.js","sources":["../../src/components/Block.tsx","../../lib/utils/parseNumericStyleValue.ts","../../lib/utils/getRTLOffsetType.ts","../../lib/utils/adjustScrollOffsetForRtl.ts","../../lib/utils/assert.ts","../../lib/utils/shallowCompare.ts","../../lib/core/getEstimatedSize.ts","../../lib/core/getStartStopIndices.ts","../../lib/core/useCachedBounds.ts","../../lib/core/createCachedBounds.ts","../../lib/core/useVirtualizer.ts","../../lib/hooks/useResizeObserver.ts","../../lib/core/useItemSize.ts","../../lib/hooks/useStableCallback.ts","../../lib/core/getOffsetForIndex.ts","../../lib/hooks/useMemoizedObject.ts","../../lib/utils/arePropsEqual.ts"],"sourcesContent":["import type { HTMLAttributes, PropsWithChildren } from \"react\";\nimport { ErrorBoundary } from \"./ErrorBoundary\";\n\nexport function Block({\n children,\n className,\n ...rest\n}: PropsWithChildren<HTMLAttributes<HTMLDivElement> & { className?: string }>) {\n return (\n <ErrorBoundary>\n <div\n className={`border-lg bg-black/30 text-slate-300 rounded-lg p-2 ${className}`}\n {...rest}\n >\n {children}\n </div>\n </ErrorBoundary>\n );\n}\n","import type { CSSProperties } from \"react\";\n\nexport function parseNumericStyleValue(\n value: CSSProperties[\"height\"]\n): number | undefined {\n if (value !== undefined) {\n switch (typeof value) {\n case \"number\": {\n return value;\n }\n case \"string\": {\n if (value.endsWith(\"px\")) {\n return parseFloat(value);\n }\n break;\n }\n }\n }\n}\n","export type RTLOffsetType =\n | \"negative\"\n | \"positive-descending\"\n | \"positive-ascending\";\n\nlet cachedRTLResult: RTLOffsetType | null = null;\n\n// TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n// Chrome does not seem to adhere; its scrollLeft values are positive (measured relative to the left).\n// Safari's elastic bounce makes detecting this even more complicated wrt potential false positives.\n// The safest way to check this is to intentionally set a negative offset,\n// and then verify that the subsequent \"scroll\" event matches the negative offset.\n// If it does not match, then we can assume a non-standard RTL scroll implementation.\nexport function getRTLOffsetType(recalculate: boolean = false): RTLOffsetType {\n if (cachedRTLResult === null || recalculate) {\n const outerDiv = document.createElement(\"div\");\n const outerStyle = outerDiv.style;\n outerStyle.width = \"50px\";\n outerStyle.height = \"50px\";\n outerStyle.overflow = \"scroll\";\n outerStyle.direction = \"rtl\";\n\n const innerDiv = document.createElement(\"div\");\n const innerStyle = innerDiv.style;\n innerStyle.width = \"100px\";\n innerStyle.height = \"100px\";\n\n outerDiv.appendChild(innerDiv);\n\n document.body.appendChild(outerDiv);\n\n if (outerDiv.scrollLeft > 0) {\n cachedRTLResult = \"positive-descending\";\n } else {\n outerDiv.scrollLeft = 1;\n if (outerDiv.scrollLeft === 0) {\n cachedRTLResult = \"negative\";\n } else {\n cachedRTLResult = \"positive-ascending\";\n }\n }\n\n document.body.removeChild(outerDiv);\n\n return cachedRTLResult;\n }\n\n return cachedRTLResult;\n}\n","import type { Direction } from \"../core/types\";\nimport { getRTLOffsetType } from \"./getRTLOffsetType\";\n\nexport function adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset\n}: {\n containerElement: HTMLElement | null;\n direction: Direction;\n isRtl: boolean;\n scrollOffset: number;\n}) {\n // TRICKY According to the spec, scrollLeft should be negative for RTL aligned elements.\n // This is not the case for all browsers though (e.g. Chrome reports values as positive, measured relative to the left).\n // So we need to determine which browser behavior we're dealing with, and mimic it.\n if (direction === \"horizontal\") {\n if (isRtl) {\n switch (getRTLOffsetType()) {\n case \"negative\": {\n return -scrollOffset;\n }\n case \"positive-descending\": {\n if (containerElement) {\n const { clientWidth, scrollLeft, scrollWidth } = containerElement;\n return scrollWidth - clientWidth - scrollLeft;\n }\n break;\n }\n }\n }\n }\n return scrollOffset;\n}\n","export function assert(\n expectedCondition: unknown,\n message: string = \"Assertion error\"\n): asserts expectedCondition {\n if (!expectedCondition) {\n console.error(message);\n\n throw Error(message);\n }\n}\n","import { assert } from \"./assert\";\n\nexport function shallowCompare<Type extends object>(\n a: Type | undefined,\n b: Type | undefined\n) {\n if (a === b) {\n return true;\n }\n\n if (!!a !== !!b) {\n return false;\n }\n\n assert(a !== undefined);\n assert(b !== undefined);\n\n if (Object.keys(a).length !== Object.keys(b).length) {\n return false;\n }\n\n for (const key in a) {\n if (!Object.is(b[key], a[key])) {\n return false;\n }\n }\n\n return true;\n}\n","import type { CachedBounds, SizeFunction } from \"./types\";\nimport { assert } from \"../utils/assert\";\n\nexport function getEstimatedSize<Props extends object>({\n cachedBounds,\n itemCount,\n itemSize\n}: {\n cachedBounds: CachedBounds;\n itemCount: number;\n itemSize: number | SizeFunction<Props>;\n}) {\n if (itemCount === 0) {\n return 0;\n } else if (typeof itemSize === \"number\") {\n return itemCount * itemSize;\n } else {\n const bounds = cachedBounds.get(\n cachedBounds.size === 0 ? 0 : cachedBounds.size - 1\n );\n assert(bounds !== undefined, \"Unexpected bounds cache miss\");\n\n const averageItemSize =\n (bounds.scrollOffset + bounds.size) / cachedBounds.size;\n\n return itemCount * averageItemSize;\n }\n}\n","import type { CachedBounds } from \"./types\";\n\nexport function getStartStopIndices({\n cachedBounds,\n containerScrollOffset,\n containerSize,\n itemCount,\n overscanCount\n}: {\n cachedBounds: CachedBounds;\n containerScrollOffset: number;\n containerSize: number;\n itemCount: number;\n overscanCount: number;\n}): {\n startIndexVisible: number;\n stopIndexVisible: number;\n startIndexOverscan: number;\n stopIndexOverscan: number;\n} {\n const maxIndex = itemCount - 1;\n\n let startIndexVisible = 0;\n let stopIndexVisible = -1;\n let startIndexOverscan = 0;\n let stopIndexOverscan = -1;\n let currentIndex = 0;\n\n while (currentIndex < maxIndex) {\n const bounds = cachedBounds.get(currentIndex);\n\n if (bounds.scrollOffset + bounds.size > containerScrollOffset) {\n break;\n }\n\n currentIndex++;\n }\n\n startIndexVisible = currentIndex;\n startIndexOverscan = Math.max(0, startIndexVisible - overscanCount);\n\n while (currentIndex < maxIndex) {\n const bounds = cachedBounds.get(currentIndex);\n\n if (\n bounds.scrollOffset + bounds.size >=\n containerScrollOffset + containerSize\n ) {\n break;\n }\n\n currentIndex++;\n }\n\n stopIndexVisible = Math.min(maxIndex, currentIndex);\n stopIndexOverscan = Math.min(itemCount - 1, stopIndexVisible + overscanCount);\n\n if (startIndexVisible < 0) {\n startIndexVisible = 0;\n stopIndexVisible = -1;\n startIndexOverscan = 0;\n stopIndexOverscan = -1;\n }\n\n return {\n startIndexVisible,\n stopIndexVisible,\n startIndexOverscan,\n stopIndexOverscan\n };\n}\n","import { useMemo } from \"react\";\nimport { createCachedBounds } from \"./createCachedBounds\";\nimport type { CachedBounds, SizeFunction } from \"./types\";\n\nexport function useCachedBounds<Props extends object>({\n itemCount,\n itemProps,\n itemSize\n}: {\n itemCount: number;\n itemProps: Props;\n itemSize: number | SizeFunction<Props>;\n}): CachedBounds {\n return useMemo(\n () =>\n createCachedBounds({\n itemCount,\n itemProps,\n itemSize\n }),\n [itemCount, itemProps, itemSize]\n );\n}\n","import { assert } from \"../utils/assert\";\nimport type { Bounds, CachedBounds, SizeFunction } from \"./types\";\n\nexport function createCachedBounds<Props extends object>({\n itemCount,\n itemProps,\n itemSize\n}: {\n itemCount: number;\n itemProps: Props;\n itemSize: number | SizeFunction<Props>;\n}): CachedBounds {\n const cache = new Map<number, Bounds>();\n\n return {\n get(index: number) {\n assert(index < itemCount, `Invalid index ${index}`);\n\n while (cache.size - 1 < index) {\n const currentIndex = cache.size;\n\n let size: number;\n switch (typeof itemSize) {\n case \"function\": {\n size = itemSize(currentIndex, itemProps);\n break;\n }\n case \"number\": {\n size = itemSize;\n break;\n }\n }\n\n if (currentIndex === 0) {\n cache.set(currentIndex, {\n size,\n scrollOffset: 0\n });\n } else {\n const previousRowBounds = cache.get(currentIndex - 1);\n assert(\n previousRowBounds !== undefined,\n `Unexpected bounds cache miss for index ${index}`\n );\n\n cache.set(currentIndex, {\n scrollOffset:\n previousRowBounds.scrollOffset + previousRowBounds.size,\n size\n });\n }\n }\n\n const bounds = cache.get(index);\n assert(\n bounds !== undefined,\n `Unexpected bounds cache miss for index ${index}`\n );\n\n return bounds;\n },\n set(index: number, bounds: Bounds) {\n cache.set(index, bounds);\n },\n get size() {\n return cache.size;\n }\n };\n}\n","import {\n useCallback,\n useLayoutEffect,\n useRef,\n useState,\n type CSSProperties\n} from \"react\";\nimport { useIsomorphicLayoutEffect } from \"../hooks/useIsomorphicLayoutEffect\";\nimport { useResizeObserver } from \"../hooks/useResizeObserver\";\nimport { useStableCallback } from \"../hooks/useStableCallback\";\nimport type { Align } from \"../types\";\nimport { adjustScrollOffsetForRtl } from \"../utils/adjustScrollOffsetForRtl\";\nimport { shallowCompare } from \"../utils/shallowCompare\";\nimport { getEstimatedSize as getEstimatedSizeUtil } from \"./getEstimatedSize\";\nimport { getOffsetForIndex } from \"./getOffsetForIndex\";\nimport { getStartStopIndices as getStartStopIndicesUtil } from \"./getStartStopIndices\";\nimport type { Direction, SizeFunction } from \"./types\";\nimport { useCachedBounds } from \"./useCachedBounds\";\nimport { useItemSize } from \"./useItemSize\";\n\nexport function useVirtualizer<Props extends object>({\n containerElement,\n containerStyle,\n defaultContainerSize = 0,\n direction,\n isRtl = false,\n itemCount,\n itemProps,\n itemSize: itemSizeProp,\n onResize,\n overscanCount\n}: {\n containerElement: HTMLElement | null;\n containerStyle?: CSSProperties;\n defaultContainerSize?: number;\n direction: Direction;\n isRtl?: boolean;\n itemCount: number;\n itemProps: Props;\n itemSize: number | string | SizeFunction<Props>;\n onResize:\n | ((\n size: { height: number; width: number },\n prevSize: { height: number; width: number }\n ) => void)\n | undefined;\n overscanCount: number;\n}) {\n const [indices, setIndices] = useState<{\n startIndexVisible: number;\n stopIndexVisible: number;\n startIndexOverscan: number;\n stopIndexOverscan: number;\n }>({\n startIndexVisible: 0,\n startIndexOverscan: 0,\n stopIndexVisible: -1,\n stopIndexOverscan: -1\n });\n\n // Guard against temporarily invalid indices that may occur when item count decreases\n // Cached bounds object will be re-created and a second render will restore things\n const {\n startIndexVisible,\n startIndexOverscan,\n stopIndexVisible,\n stopIndexOverscan\n } = {\n startIndexVisible: Math.min(itemCount - 1, indices.startIndexVisible),\n startIndexOverscan: Math.min(itemCount - 1, indices.startIndexOverscan),\n stopIndexVisible: Math.min(itemCount - 1, indices.stopIndexVisible),\n stopIndexOverscan: Math.min(itemCount - 1, indices.stopIndexOverscan)\n };\n\n const { height = defaultContainerSize, width = defaultContainerSize } =\n useResizeObserver({\n defaultHeight:\n direction === \"vertical\" ? defaultContainerSize : undefined,\n defaultWidth:\n direction === \"horizontal\" ? defaultContainerSize : undefined,\n element: containerElement,\n mode: direction === \"vertical\" ? \"only-height\" : \"only-width\",\n style: containerStyle\n });\n\n const prevSizeRef = useRef<{ height: number; width: number }>({\n height: 0,\n width: 0\n });\n\n const containerSize = direction === \"vertical\" ? height : width;\n\n const itemSize = useItemSize({ containerSize, itemSize: itemSizeProp });\n\n useLayoutEffect(() => {\n if (typeof onResize === \"function\") {\n const prevSize = prevSizeRef.current;\n\n if (prevSize.height !== height || prevSize.width !== width) {\n onResize({ height, width }, { ...prevSize });\n\n prevSize.height = height;\n prevSize.width = width;\n }\n }\n }, [height, onResize, width]);\n\n const cachedBounds = useCachedBounds({\n itemCount,\n itemProps,\n itemSize\n });\n\n const getCellBounds = useCallback(\n (index: number) => cachedBounds.get(index),\n [cachedBounds]\n );\n\n const getEstimatedSize = useCallback(\n () =>\n getEstimatedSizeUtil({\n cachedBounds,\n itemCount,\n itemSize\n }),\n [cachedBounds, itemCount, itemSize]\n );\n\n const getStartStopIndices = useCallback(\n (scrollOffset: number) => {\n const containerScrollOffset = adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset\n });\n\n return getStartStopIndicesUtil({\n cachedBounds,\n containerScrollOffset,\n containerSize,\n itemCount,\n overscanCount\n });\n },\n [\n cachedBounds,\n containerElement,\n containerSize,\n direction,\n isRtl,\n itemCount,\n overscanCount\n ]\n );\n\n useIsomorphicLayoutEffect(() => {\n const scrollOffset =\n (direction === \"vertical\"\n ? containerElement?.scrollTop\n : containerElement?.scrollLeft) ?? 0;\n\n setIndices(getStartStopIndices(scrollOffset));\n }, [containerElement, direction, getStartStopIndices]);\n\n useIsomorphicLayoutEffect(() => {\n if (!containerElement) {\n return;\n }\n\n const onScroll = () => {\n setIndices((prev) => {\n const { scrollLeft, scrollTop } = containerElement;\n\n const scrollOffset = adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset: direction === \"vertical\" ? scrollTop : scrollLeft\n });\n\n const next = getStartStopIndicesUtil({\n cachedBounds,\n containerScrollOffset: scrollOffset,\n containerSize,\n itemCount,\n overscanCount\n });\n\n if (shallowCompare(next, prev)) {\n return prev;\n }\n\n return next;\n });\n };\n\n containerElement.addEventListener(\"scroll\", onScroll);\n\n return () => {\n containerElement.removeEventListener(\"scroll\", onScroll);\n };\n }, [\n cachedBounds,\n containerElement,\n containerSize,\n direction,\n itemCount,\n overscanCount\n ]);\n\n const scrollToIndex = useStableCallback(\n ({\n align = \"auto\",\n containerScrollOffset,\n index\n }: {\n align?: Align;\n containerScrollOffset: number;\n index: number;\n }) => {\n let scrollOffset = getOffsetForIndex({\n align,\n cachedBounds,\n containerScrollOffset,\n containerSize,\n index,\n itemCount,\n itemSize\n });\n\n if (containerElement) {\n scrollOffset = adjustScrollOffsetForRtl({\n containerElement,\n direction,\n isRtl,\n scrollOffset\n });\n\n if (typeof containerElement.scrollTo !== \"function\") {\n // Special case for environments like jsdom that don't implement scrollTo\n const next = getStartStopIndices(scrollOffset);\n if (!shallowCompare(indices, next)) {\n setIndices(next);\n }\n }\n\n return scrollOffset;\n }\n }\n );\n\n return {\n getCellBounds,\n getEstimatedSize,\n scrollToIndex,\n startIndexOverscan,\n startIndexVisible,\n stopIndexOverscan,\n stopIndexVisible\n };\n}\n","import { useMemo, useState, type CSSProperties } from \"react\";\nimport { parseNumericStyleValue } from \"../utils/parseNumericStyleValue\";\nimport { useIsomorphicLayoutEffect } from \"./useIsomorphicLayoutEffect\";\n\nexport function useResizeObserver({\n box,\n defaultHeight,\n defaultWidth,\n disabled: disabledProp,\n element,\n mode,\n style\n}: {\n box?: ResizeObserverBoxOptions;\n defaultHeight?: number;\n defaultWidth?: number;\n disabled?: boolean;\n element: HTMLElement | null;\n mode?: \"only-height\" | \"only-width\";\n style: CSSProperties | undefined;\n}) {\n const { styleHeight, styleWidth } = useMemo(\n () => ({\n styleHeight: parseNumericStyleValue(style?.height),\n styleWidth: parseNumericStyleValue(style?.width)\n }),\n [style?.height, style?.width]\n );\n\n const [state, setState] = useState<{\n height: number | undefined;\n width: number | undefined;\n }>({\n height: defaultHeight,\n width: defaultWidth\n });\n\n const disabled =\n disabledProp ||\n (mode === \"only-height\" && styleHeight !== undefined) ||\n (mode === \"only-width\" && styleWidth !== undefined) ||\n (styleHeight !== undefined && styleWidth !== undefined);\n\n useIsomorphicLayoutEffect(() => {\n if (element === null || disabled) {\n return;\n }\n\n const resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n const { contentRect, target } = entry;\n if (element === target) {\n setState((prevState) => {\n if (\n prevState.height === contentRect.height &&\n prevState.width === contentRect.width\n ) {\n return prevState;\n }\n\n return {\n height: contentRect.height,\n width: contentRect.width\n };\n });\n }\n }\n });\n resizeObserver.observe(element, { box });\n\n return () => {\n resizeObserver?.unobserve(element);\n };\n }, [box, disabled, element, styleHeight, styleWidth]);\n\n return useMemo(\n () => ({\n height: styleHeight ?? state.height,\n width: styleWidth ?? state.width\n }),\n [state, styleHeight, styleWidth]\n );\n}\n","import { assert } from \"../utils/assert\";\nimport type { SizeFunction } from \"./types\";\n\nexport function useItemSize<Props extends object>({\n containerSize,\n itemSize: itemSizeProp\n}: {\n containerSize: number;\n itemSize: number | string | SizeFunction<Props>;\n}) {\n let itemSize: number | SizeFunction<Props>;\n switch (typeof itemSizeProp) {\n case \"string\": {\n assert(\n itemSizeProp.endsWith(\"%\"),\n `Invalid item size: \"${itemSizeProp}\"; string values must be percentages (e.g. \"100%\")`\n );\n assert(\n containerSize !== undefined,\n \"Container size must be defined if a percentage item size is specified\"\n );\n\n itemSize = (containerSize * parseInt(itemSizeProp)) / 100;\n break;\n }\n default: {\n itemSize = itemSizeProp;\n break;\n }\n }\n\n return itemSize;\n}\n","import { useCallback, useRef } from \"react\";\nimport { useIsomorphicLayoutEffect } from \"./useIsomorphicLayoutEffect\";\n\n// Forked from useEventCallback (usehooks-ts)\nexport function useStableCallback<Args, Return>(\n fn: (args: Args) => Return\n): (args: Args) => Return {\n const ref = useRef<typeof fn>(() => {\n throw new Error(\"Cannot call an event handler while rendering.\");\n });\n\n useIsomorphicLayoutEffect(() => {\n ref.current = fn;\n }, [fn]);\n\n return useCallback((args: Args) => ref.current?.(args), [ref]) as (\n args: Args\n ) => Return;\n}\n","import type { Align } from \"../types\";\nimport { getEstimatedSize } from \"./getEstimatedSize\";\nimport type { CachedBounds, SizeFunction } from \"./types\";\n\nexport function getOffsetForIndex<Props extends object>({\n align,\n cachedBounds,\n index,\n itemCount,\n itemSize,\n containerScrollOffset,\n containerSize\n}: {\n align: Align;\n cachedBounds: CachedBounds;\n index: number;\n itemCount: number;\n itemSize: number | SizeFunction<Props>;\n containerScrollOffset: number;\n containerSize: number;\n}) {\n const estimatedTotalSize = getEstimatedSize({\n cachedBounds,\n itemCount,\n itemSize\n });\n\n const bounds = cachedBounds.get(index);\n const maxOffset = Math.max(\n 0,\n Math.min(estimatedTotalSize - containerSize, bounds.scrollOffset)\n );\n const minOffset = Math.max(\n 0,\n bounds.scrollOffset - containerSize + bounds.size\n );\n\n if (align === \"smart\") {\n if (\n containerScrollOffset >= minOffset &&\n containerScrollOffset <= maxOffset\n ) {\n align = \"auto\";\n } else {\n align = \"center\";\n }\n }\n\n switch (align) {\n case \"start\": {\n return maxOffset;\n }\n case \"end\": {\n return minOffset;\n }\n case \"center\": {\n if (bounds.scrollOffset <= containerSize / 2) {\n // Too near the beginning to center-align\n return 0;\n } else if (\n bounds.scrollOffset + bounds.size / 2 >=\n estimatedTotalSize - containerSize / 2\n ) {\n // Too near the end to center-align\n return estimatedTotalSize - containerSize;\n } else {\n return bounds.scrollOffset + bounds.size / 2 - containerSize / 2;\n }\n }\n case \"auto\":\n default: {\n if (\n containerScrollOffset >= minOffset &&\n containerScrollOffset <= maxOffset\n ) {\n return containerScrollOffset;\n } else if (containerScrollOffset < minOffset) {\n return minOffset;\n } else {\n return maxOffset;\n }\n }\n }\n}\n","import { useMemo } from \"react\";\n\nexport function useMemoizedObject<Type extends object>(\n unstableObject: Type\n): Type {\n return useMemo(() => {\n return unstableObject;\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, Object.values(unstableObject));\n}\n","import type { CSSProperties } from \"react\";\nimport { shallowCompare } from \"./shallowCompare\";\n\n// Custom comparison function for React.memo()\n// It knows to compare individual style props and ignore the wrapper object.\n// See https://react.dev/reference/react/memo#memo\nexport function arePropsEqual(\n prevProps: { ariaAttributes: object; style: CSSProperties },\n nextProps: { ariaAttributes: object; style: CSSProperties }\n): boolean {\n const {\n ariaAttributes: prevAriaAttributes,\n style: prevStyle,\n ...prevRest\n } = prevProps;\n const {\n ariaAttributes: nextAriaAttributes,\n style: nextStyle,\n ...nextRest\n } = nextProps;\n\n return (\n shallowCompare(prevAriaAttributes, nextAriaAttributes) &&\n shallowCompare(prevStyle, nextStyle) &&\n shallowCompare(prevRest, nextRest)\n );\n}\n"],"names":["Block","children","className","rest","ErrorBoundary","jsx","parseNumericStyleValue","value","endsWith","parseFloat","cachedRTLResult","adjustScrollOffsetForRtl","containerElement","direction","isRtl","scrollOffset","recalculate","outerDiv","document","createElement","outerStyle","style","width","height","overflow","innerDiv","innerStyle","appendChild","body","scrollLeft","removeChild","getRTLOffsetType","clientWidth","scrollWidth","assert","expectedCondition","message","console","error","Error","shallowCompare","a","b","Object","keys","length","key","is","getEstimatedSize","cachedBounds","itemCount","itemSize","bounds","get","size","getStartStopIndices","containerScrollOffset","containerSize","overscanCount","maxIndex","startIndexVisible","stopIndexVisible","startIndexOverscan","stopIndexOverscan","currentIndex","Math","max","min","useCachedBounds","itemProps","useMemo","cache","Map","index","set","previousRowBounds","createCachedBounds","useVirtualizer","containerStyle","defaultContainerSize","itemSizeProp","onResize","indices","setIndices","useState","box","defaultHeight","defaultWidth","disabled","disabledProp","element","mode","styleHeight","styleWidth","state","setState","useIsomorphicLayoutEffect","resizeObserver","ResizeObserver","entries","entry","contentRect","target","prevState","observe","unobserve","useResizeObserver","prevSizeRef","useRef","parseInt","useItemSize","useLayoutEffect","prevSize","current","getCellBounds","useCallback","getEstimatedSizeUtil","getStartStopIndicesUtil","scrollTop","onScroll","prev","next","addEventListener","removeEventListener","scrollToIndex","fn","ref","args","useStableCallback","align","estimatedTotalSize","maxOffset","minOffset","getOffsetForIndex","scrollTo","useMemoizedObject","unstableObject","values","arePropsEqual","prevProps","nextProps","ariaAttributes","prevAriaAttributes","prevStyle","prevRest","nextAriaAttributes","nextStyle","nextRest"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
/*! tailwindcss v4.1.11 | MIT License | https://tailwindcss.com */@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-duration:initial;--tw-ease:initial;--tw-text-shadow-color:initial;--tw-text-shadow-alpha:100%}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-300:rgb(255, 163, 164);--color-red-400:rgb(255, 101, 104);--color-red-500:rgb(251, 44, 54);--color-red-800:rgb(159, 7, 18);--color-red-950:rgb(70, 8, 9);--color-amber-400:rgb(250, 188, 0);--color-amber-500:rgb(246, 158, 0);--color-amber-800:rgb(149, 61, 0);--color-amber-950:rgb(70, 25, 1);--color-emerald-200:rgb(164, 244, 207);--color-emerald-300:rgb(94, 233, 181);--color-emerald-400:rgb(0, 210, 148);--color-emerald-500:rgb(0, 185, 129);--color-emerald-800:rgb(0, 95, 70);--color-emerald-950:rgb(0, 44, 34);--color-teal-300:rgb(70, 236, 213);--color-teal-400:rgb(0, 211, 189);--color-teal-600:rgb(0, 148, 136);--color-sky-300:rgb(120, 212, 255);--color-sky-400:rgb(0, 187, 253);--color-sky-500:rgb(0, 165, 234);--color-sky-800:rgb(0, 89, 134);--color-sky-950:rgb(5, 47, 74);--color-blue-600:rgb(21, 93, 252);--color-pink-400:rgb(251, 100, 182);--color-pink-500:rgb(246, 51, 154);--color-slate-300:rgb(202, 213, 226);--color-slate-400:rgb(144, 161, 185);--color-slate-500:rgb(98, 116, 142);--color-slate-600:rgb(69, 85, 108);--color-slate-800:rgb(29, 41, 61);--color-slate-900:rgb(15, 23, 43);--color-gray-400:rgb(153, 161, 175);--color-black:#000;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-3xl:1.875rem;--text-3xl--line-height: 1.2 ;--text-7xl:4.5rem;--text-7xl--line-height:1;--text-8xl:6rem;--text-8xl--line-height:1;--font-weight-bold:700;--radius-md:.375rem;--radius-lg:.5rem;--radius-3xl:1.5rem;--drop-shadow-xs:0 1px 1px #0000000d;--drop-shadow-sm:0 1px 2px #00000026;--ease-in:cubic-bezier(.4,0,1,1);--animate-spin:spin 1s linear infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}@supports (color: color(display-p3 0 0 0%)){:root,:host{--color-red-300:color(display-p3 .95692 .65189 .64512);--color-red-400:color(display-p3 .93353 .43168 .42349);--color-amber-400:color(display-p3 .95919 .73852 .11827);--color-amber-500:color(display-p3 .93994 .62058 .05854);--color-amber-800:color(display-p3 .54753 .25606 .07283);--color-emerald-400:color(display-p3 .3347 .8196 .59158);--color-emerald-500:color(display-p3 .26711 .72685 .5084);--color-emerald-800:color(display-p3 .1354 .3714 .27756);--color-emerald-950:color(display-p3 .05491 .17043 .13484);--color-teal-400:color(display-p3 .32279 .82206 .74439);--color-teal-600:color(display-p3 .20711 .57958 .53668);--color-sky-300:color(display-p3 .54636 .82256 .99058);--color-sky-400:color(display-p3 .30598 .72501 .98017);--color-sky-500:color(display-p3 .21911 .63903 .93148);--color-sky-800:color(display-p3 .12072 .34308 .52441)}}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}}@layer components;@layer utilities{.pointer-events-none{pointer-events:none}.\!visible{visibility:visible!important}.visible{visibility:visible}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.sticky{position:sticky}.inset-y-0{inset-block:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.right-0{right:calc(var(--spacing)*0)}.left-0{left:calc(var(--spacing)*0)}.z-10{z-index:10}.z-400{z-index:400}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-2{margin-inline:calc(var(--spacing)*2)}.mx-auto{margin-inline:auto}.mt-1{margin-top:calc(var(--spacing)*1)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.ml-4{margin-left:calc(var(--spacing)*4)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline-block{display:inline-block}.table{display:table}.size-4{width:calc(var(--spacing)*4);height:calc(var(--spacing)*4)}.h-0{height:calc(var(--spacing)*0)}.h-4{height:calc(var(--spacing)*4)}.h-6{height:calc(var(--spacing)*6)}.h-7{height:calc(var(--spacing)*7)}.h-8{height:calc(var(--spacing)*8)}.h-9{height:calc(var(--spacing)*9)}.h-12{height:calc(var(--spacing)*12)}.h-20{height:calc(var(--spacing)*20)}.h-50{height:calc(var(--spacing)*50)}.h-55{height:calc(var(--spacing)*55)}.h-100{height:calc(var(--spacing)*100)}.h-150{height:calc(var(--spacing)*150)}.h-\[20px\]{height:20px}.h-full{height:100%}.max-h-50{max-height:calc(var(--spacing)*50)}.w-0{width:calc(var(--spacing)*0)}.w-4{width:calc(var(--spacing)*4)}.w-6{width:calc(var(--spacing)*6)}.w-8{width:calc(var(--spacing)*8)}.w-10{width:calc(var(--spacing)*10)}.w-fit{width:fit-content}.w-full{width:100%}.max-w-350{max-width:calc(var(--spacing)*350)}.flex-1{flex:1}.shrink{flex-shrink:1}.shrink-0{flex-shrink:0}.shrink-1{flex-shrink:1}.grow{flex-grow:1}.grow-0{flex-grow:0}.grow-1{flex-grow:1}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-spin{animation:var(--animate-spin)}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-disc{list-style-type:disc}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.items-end{align-items:flex-end}.items-start{align-items:flex-start}.items-stretch{align-items:stretch}.justify-around{justify-content:space-around}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.justify-stretch{justify-content:stretch}.gap-1{gap:calc(var(--spacing)*1)}.gap-2{gap:calc(var(--spacing)*2)}.gap-3{gap:calc(var(--spacing)*3)}.gap-4{gap:calc(var(--spacing)*4)}.gap-10{gap:calc(var(--spacing)*10)}.truncate{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.overflow-auto{overflow:auto}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius-lg)}.rounded-md{border-radius:var(--radius-md)}.rounded-t-3xl{border-top-left-radius:var(--radius-3xl);border-top-right-radius:var(--radius-3xl)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-r{border-right-style:var(--tw-border-style);border-right-width:1px}.border-none\!{--tw-border-style:none!important;border-style:none!important}.border-amber-400{border-color:var(--color-amber-400)}.border-emerald-400{border-color:var(--color-emerald-400)}.border-red-400{border-color:var(--color-red-400)}.border-sky-400{border-color:var(--color-sky-400)}.border-transparent{border-color:#0000}.border-white\/40{border-color:#fff6}@supports (color:color-mix(in lab,red,red)){.border-white\/40{border-color:color-mix(in oklab,var(--color-white)40%,transparent)}}.border-r-slate-800{border-right-color:var(--color-slate-800)}.bg-amber-400{background-color:var(--color-amber-400)}.bg-black{background-color:var(--color-black)}.bg-black\/10{background-color:#0000001a}@supports (color:color-mix(in lab,red,red)){.bg-black\/10{background-color:color-mix(in oklab,var(--color-black)10%,transparent)}}.bg-black\/30{background-color:#0000004d}@supports (color:color-mix(in lab,red,red)){.bg-black\/30{background-color:color-mix(in oklab,var(--color-black)30%,transparent)}}.bg-black\/40{background-color:#0006}@supports (color:color-mix(in lab,red,red)){.bg-black\/40{background-color:color-mix(in oklab,var(--color-black)40%,transparent)}}.bg-black\/50{background-color:#00000080}@supports (color:color-mix(in lab,red,red)){.bg-black\/50{background-color:color-mix(in oklab,var(--color-black)50%,transparent)}}.bg-black\/90{background-color:#000000e6}@supports (color:color-mix(in lab,red,red)){.bg-black\/90{background-color:color-mix(in oklab,var(--color-black)90%,transparent)}}.bg-emerald-400{background-color:var(--color-emerald-400)}.bg-red-400{background-color:var(--color-red-400)}.bg-sky-400{background-color:var(--color-sky-400)}.bg-slate-800{background-color:var(--color-slate-800)}.bg-slate-900{background-color:var(--color-slate-900)}.bg-teal-600{background-color:var(--color-teal-600)}.bg-white\/10{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.bg-white\/10{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.\[mask-image\:linear-gradient\(to_bottom\,transparent\,black_1\.5rem\)\]{-webkit-mask-image:linear-gradient(#0000,#000 1.5rem);mask-image:linear-gradient(#0000,#000 1.5rem)}.fill-blue-600{fill:var(--color-blue-600)}.fill-current{fill:currentColor}.fill-slate-600{fill:var(--color-slate-600)}.fill-white{fill:var(--color-white)}.fill-white\/60{fill:#fff9}@supports (color:color-mix(in lab,red,red)){.fill-white\/60{fill:color-mix(in oklab,var(--color-white)60%,transparent)}}.p-0\!{padding:calc(var(--spacing)*0)!important}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.p-3{padding:calc(var(--spacing)*3)}.p-4{padding:calc(var(--spacing)*4)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.py-1{padding-block:calc(var(--spacing)*1)}.py-2{padding-block:calc(var(--spacing)*2)}.py-4{padding-block:calc(var(--spacing)*4)}.pr-2{padding-right:calc(var(--spacing)*2)}.pl-4{padding-left:calc(var(--spacing)*4)}.pl-8{padding-left:calc(var(--spacing)*8)}.text-center{text-align:center}.text-left{text-align:left}.indent-\[-1rem\]{text-indent:-1rem}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-7xl{font-size:var(--text-7xl);line-height:var(--tw-leading,var(--text-7xl--line-height))}.text-8xl{font-size:var(--text-8xl);line-height:var(--tw-leading,var(--text-8xl--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-\[2\.5\]{--tw-leading:2.5;line-height:2.5}.leading-none{--tw-leading:1;line-height:1}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.whitespace-pre-wrap{white-space:pre-wrap}.text-amber-800{color:var(--color-amber-800)}.text-black{color:var(--color-black)}.text-emerald-200{color:var(--color-emerald-200)}.text-emerald-300{color:var(--color-emerald-300)}.text-emerald-800{color:var(--color-emerald-800)}.text-gray-400{color:var(--color-gray-400)}.text-red-300{color:var(--color-red-300)}.text-red-800{color:var(--color-red-800)}.text-sky-300{color:var(--color-sky-300)}.text-sky-800{color:var(--color-sky-800)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-white{color:var(--color-white)}.text-white\!{color:var(--color-white)!important}.text-white\/50{color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.text-white\/50{color:color-mix(in oklab,var(--color-white)50%,transparent)}}.text-white\/90{color:#ffffffe6}@supports (color:color-mix(in lab,red,red)){.text-white\/90{color:color-mix(in oklab,var(--color-white)90%,transparent)}}.uppercase{text-transform:uppercase}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-100{opacity:1}.shadow-lg{--tw-shadow:0 10px 15px -3px var(--tw-shadow-color,#0000001a),0 4px 6px -4px var(--tw-shadow-color,#0000001a);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.drop-shadow-sm{--tw-drop-shadow-size:drop-shadow(0 1px 2px var(--tw-drop-shadow-color,#00000026));--tw-drop-shadow:drop-shadow(var(--drop-shadow-sm));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow-xs{--tw-drop-shadow-size:drop-shadow(0 1px 1px var(--tw-drop-shadow-color,#0000000d));--tw-drop-shadow:drop-shadow(var(--drop-shadow-xs));filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.drop-shadow-black\/20{--tw-drop-shadow-color:#0003}@supports (color:color-mix(in lab,red,red)){.drop-shadow-black\/20{--tw-drop-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-black)20%,transparent)var(--tw-drop-shadow-alpha),transparent)}}.drop-shadow-black\/20{--tw-drop-shadow:var(--tw-drop-shadow-size)}.filter{filter:var(--tw-blur,)var(--tw-brightness,)var(--tw-contrast,)var(--tw-grayscale,)var(--tw-hue-rotate,)var(--tw-invert,)var(--tw-saturate,)var(--tw-sepia,)var(--tw-drop-shadow,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,visibility,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.duration-100{--tw-duration:.1s;transition-duration:.1s}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.outline-none{--tw-outline-style:none;outline-style:none}.select-none{-webkit-user-select:none;user-select:none}.text-shadow-black\/20{--tw-text-shadow-color:#0003}@supports (color:color-mix(in lab,red,red)){.text-shadow-black\/20{--tw-text-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-black)20%,transparent)var(--tw-text-shadow-alpha),transparent)}}.text-shadow-sm{text-shadow:0px 1px 0px var(--tw-text-shadow-color,#00000013),0px 1px 1px var(--tw-text-shadow-color,#00000013),0px 2px 2px var(--tw-text-shadow-color,#00000013)}.text-shadow-white\/50{--tw-text-shadow-color:#ffffff80}@supports (color:color-mix(in lab,red,red)){.text-shadow-white\/50{--tw-text-shadow-color:color-mix(in oklab,color-mix(in oklab,var(--color-white)50%,transparent)var(--tw-text-shadow-alpha),transparent)}}.text-shadow-xs{text-shadow:0px 1px 1px var(--tw-text-shadow-color,#0003)}.group-data-hover\:fill-white\/50:is(:where(.group)[data-hover] *){fill:#ffffff80}@supports (color:color-mix(in lab,red,red)){.group-data-hover\:fill-white\/50:is(:where(.group)[data-hover] *){fill:color-mix(in oklab,var(--color-white)50%,transparent)}}.group-data-open\:rotate-90:is(:where(.group)[data-open] *){rotate:90deg}.focus-within\:bg-white\/10:focus-within{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.focus-within\:bg-white\/10:focus-within{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}@media (hover:hover){.hover\:bg-amber-500:hover{background-color:var(--color-amber-500)}.hover\:bg-emerald-500:hover{background-color:var(--color-emerald-500)}.hover\:bg-red-500:hover{background-color:var(--color-red-500)}.hover\:bg-sky-500:hover{background-color:var(--color-sky-500)}.hover\:text-amber-950:hover{color:var(--color-amber-950)}.hover\:text-emerald-950:hover{color:var(--color-emerald-950)}.hover\:text-red-950:hover{color:var(--color-red-950)}.hover\:text-sky-950:hover{color:var(--color-sky-950)}.hover\:text-white:hover{color:var(--color-white)}}.focus\:border-emerald-300:focus{border-color:var(--color-emerald-300)}.focus\:border-teal-300:focus{border-color:var(--color-teal-300)}.focus\:bg-white\/10:focus{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.focus\:bg-white\/10:focus{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.focus\:text-black:focus{color:var(--color-black)}.data-active\:bg-black[data-active]{background-color:var(--color-black)}.data-active\:text-teal-300[data-active]{color:var(--color-teal-300)}.data-focus\:bg-black[data-focus]{background-color:var(--color-black)}.data-focus\:bg-white\/10[data-focus]{background-color:#ffffff1a}@supports (color:color-mix(in lab,red,red)){.data-focus\:bg-white\/10[data-focus]{background-color:color-mix(in oklab,var(--color-white)10%,transparent)}}.data-focus\:text-teal-300[data-focus]{color:var(--color-teal-300)}.data-selected\:font-bold[data-selected]{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.data-selected\:text-teal-300[data-selected]{color:var(--color-teal-300)}@media (min-width:48rem){.md\:relative{position:relative}.md\:block{display:block}.md\:flex{display:flex}.md\:hidden{display:none}.md\:w-50{width:calc(var(--spacing)*50)}.md\:w-80{width:calc(var(--spacing)*80)}.md\:bg-black\/80{background-color:#000c}@supports (color:color-mix(in lab,red,red)){.md\:bg-black\/80{background-color:color-mix(in oklab,var(--color-black)80%,transparent)}}.md\:text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}}.\[\&_code\]\:text-sky-300 code{color:var(--color-sky-300)}.\[\&_svg\]\:text-amber-400 svg{color:var(--color-amber-400)}.\[\&_svg\]\:text-emerald-400 svg{color:var(--color-emerald-400)}.\[\&_svg\]\:text-red-400 svg{color:var(--color-red-400)}.\[\&_svg\]\:text-sky-400 svg{color:var(--color-sky-400)}.\[\&_svg\]\:text-white\/60 svg{color:#fff9}@supports (color:color-mix(in lab,red,red)){.\[\&_svg\]\:text-white\/60 svg{color:color-mix(in oklab,var(--color-white)60%,transparent)}}}:root{font-family:system-ui,Avenir,Helvetica,Arial,sans-serif;font-size:12px;font-weight:400;line-height:1.5}@media only screen and (max-width:600px){:root{font-size:16px}}:root{color-scheme:dark;font-synthesis:none;text-rendering:optimizeLegibility;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}@keyframes background-gradient-animation{0%{background-position:0%}50%{background-position:100%}to{background-position:0%}}#root{background:linear-gradient(-45deg,var(--color-pink-500),var(--color-sky-500),var(--color-emerald-400));background-size:400% 400%;width:100dvw;height:100dvh;animation:20s infinite background-gradient-animation;overflow:auto}*{scrollbar-width:thin;scrollbar-color:var(--color-slate-600)transparent;outline:none;transition:color .25s,background-color .25s,border-color .25s,opacity .25s,outline-color .25s}main [data-link],main a{cursor:pointer;color:var(--color-teal-400)}:is(main [data-link],main a):hover{color:var(--color-teal-300)}[data-focus]{border:2px solid #0000}[data-focus]:focus{border:2px solid var(--color-teal-300)}[data-focus-within]{border:2px solid #0000}[data-focus-within]:focus-within{border:2px solid var(--color-teal-300)}[data-focus-within][data-focus-within=bold]{border-color:var(--color-teal-600)}[data-focus-within][data-focus-within=bold]:focus-within{border:2px solid var(--color-teal-300)}code{color:var(--color-slate-300)}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"<length>";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-duration{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@property --tw-text-shadow-color{syntax:"*";inherits:false}@property --tw-text-shadow-alpha{syntax:"<percentage>";inherits:false;initial-value:100%}@keyframes spin{to{transform:rotate(360deg)}}
|