box-overflow-core
Version:
Headless UI for automatically collapsing boxes when overflow.
1 lines • 18.1 kB
Source Map (JSON)
{"version":3,"file":"index.cjs","sources":["../../src/index.ts"],"sourcesContent":["/**\n * @author shunzi <tobyzsj@gmail.com>\n * @date 2024-03-24 18:03:46\n */\n\nimport { Observer } from './observer'\nimport type { CSSProperties, SetRequired } from './types'\nimport { isElementNode, memo, notNil } from './utils'\n\nexport interface BoxOverflowOptions {\n idAttribute?: string\n maxCount?: number\n maxLine?: number\n /**\n * 排列方向\n * @default 'ltr'\n */\n direction?: 'ltr' | 'rtl'\n getContainer: () => HTMLElement\n /**\n * 显示的数量变更\n */\n onDisplayChange?: (count: OverflowItem[]) => void\n getIdByIndex?: (index: number) => string\n}\n\nexport interface OverflowItem {\n key: string\n index: number\n line: number\n left: number\n top: number\n width: number\n height: number\n}\n\ninterface SizeRect {\n width: number\n height: number\n}\n\nconst internalFixedKeys = ['rest', 'prefix', 'suffix']\n\nexport class BoxOverflow {\n options!: SetRequired<BoxOverflowOptions, 'idAttribute'>\n displayCount = 0\n isRestReady = false\n hasRest = false\n containerElement: HTMLElement | null = null\n sizeChanged: boolean = false\n sizeCache = new Map<string, SizeRect>()\n measurementsCache: OverflowItem[] = []\n measureElementCache = new Map<string, HTMLElement>()\n\n itemsObserver = Observer.createResizeObserver(this.itemMeasurer.bind(this))\n containerObserver = Observer.createResizeObserver(this.containerMeasurer.bind(this))\n childrenObserver = Observer.createMutationObserver(this.childrenChange.bind(this))\n\n itemMeasurer(element: HTMLElement,\n // entry: ResizeObserverEntry\n ) {\n this.measureElement(element)\n if (this.sizeChanged)\n this.triggerChange()\n }\n\n containerMeasurer(element: HTMLElement,\n // entry: ResizeObserverEntry\n ) {\n this.measureContainer(element)\n this.triggerChange()\n }\n\n childrenChange(mutation: MutationRecord) {\n mutation.removedNodes.forEach((node) => {\n if (isElementNode(node)) {\n const key = this.idOfElement(node)\n if (!key)\n return\n this.measureElementCache.delete(key)\n }\n })\n mutation.addedNodes.forEach((node) => {\n if (isElementNode(node)) {\n const key = this.idOfElement(node)\n if (!key)\n return\n this.measureElement(node)\n }\n })\n }\n\n constructor(options: BoxOverflowOptions) {\n this.setOptions(options)\n }\n\n setOptions(options: BoxOverflowOptions) {\n Object.entries(options).forEach(\n ([key, value]) => typeof value === 'undefined' && delete (options as any)[key],\n )\n this.options = {\n idAttribute: 'data-id',\n ...options,\n }\n\n if (this.containerElement)\n this.triggerChange()\n }\n\n onMount() {\n const container = this.options.getContainer()\n if (!container)\n return () => {}\n\n this.containerElement = container\n this.containerObserver.observe(container)\n this.childrenObserver.observe(container)\n this.measureContainer(container)\n this.measureElements()\n\n this.triggerChange()\n\n return () => {\n this.destroy()\n }\n }\n\n onUpdate() {\n const container = this.options.getContainer()\n\n if (container !== this.containerElement) {\n this.destroy()\n\n this.containerElement = container\n\n this.containerObserver.observe(container)\n this.childrenObserver.observe(container)\n this.measureContainer(container)\n this.measureElements()\n\n this.triggerChange()\n }\n }\n\n destroy() {\n this.itemsObserver.disconnect()\n this.containerObserver.disconnect()\n this.childrenObserver.disconnect()\n this.containerElement = null\n this.measureElementCache.clear()\n }\n\n triggerChange = memo (() => ([this.getMeasurements(), this.sizeCache]), (measurements) => {\n this.options.onDisplayChange?.(measurements)\n })\n\n idOfElement(node: HTMLElement) {\n const attributeName = this.options.idAttribute\n const keyStr = node.getAttribute(attributeName)\n\n if (!keyStr) {\n console.warn(\n `Missing attribute name '${attributeName}={index}' on element.`,\n )\n return ''\n }\n\n return String(keyStr)\n }\n\n measureElements() {\n const container = this.containerElement\n if (!container)\n return\n const children = Array.from(container.children)\n children.forEach((child) => {\n if (isElementNode(child)) {\n const id = this.idOfElement(child)\n if (!id)\n return\n this.measureElement(child)\n }\n })\n }\n\n measureElement(node: HTMLElement) {\n const id = this.idOfElement(node)\n\n const prevNode = this.measureElementCache.get(id)\n if (node !== prevNode) {\n if (prevNode)\n this.itemsObserver.unobserve(prevNode)\n this.itemsObserver.observe(node)\n this.measureElementCache.set(id, node)\n }\n\n const rect = node.getBoundingClientRect()\n\n const prevSize = this.sizeCache.get(id)\n\n if (!prevSize || prevSize.width !== rect.width || prevSize.height !== rect.height) {\n this.sizeChanged = true\n this.sizeCache.set(id, { width: rect.width, height: rect.height })\n }\n }\n\n measureContainer(element: HTMLElement) {\n const rect = element.getBoundingClientRect()\n const style = window.getComputedStyle(element)\n\n const width = rect.width - Number.parseFloat(style.paddingLeft) - Number.parseFloat(style.paddingRight) - Number.parseFloat(style.borderLeftWidth) - Number.parseFloat(style.borderRightWidth)\n const height = rect.height - Number.parseFloat(style.paddingTop) - Number.parseFloat(style.paddingBottom) - Number.parseFloat(style.borderTopWidth) - Number.parseFloat(style.borderBottomWidth)\n\n this.sizeCache.set('container', { width, height })\n }\n\n getRests = memo (() => ([this.displayCount, this.getItemCounts()]), (start, end) => {\n if (start >= end)\n return []\n const rests = []\n for (; start < end; start++) {\n const key = this.options.getIdByIndex?.(start)\n if (!key)\n continue\n rests.push(key)\n }\n return rests\n })\n\n private getItemCounts() {\n return Array.from(this.measureElementCache.values())\n .filter((item) => {\n const key = this.idOfElement(item)\n return !internalFixedKeys.includes(key)\n }).length\n }\n\n private getMaxCount() {\n const maxCount = this.options.maxCount\n\n if (maxCount && maxCount < 1)\n console.error('maxCount can not be less than 1')\n\n const elementLength = this.getItemCounts()\n return maxCount ? Math.min(maxCount, elementLength) : elementLength\n }\n\n private getMaxLine() {\n const maxLine = this.options.maxLine\n if (maxLine === undefined)\n return undefined\n return Math.max(maxLine - 1, 0)\n }\n\n getMeasurements() {\n const maxLine = this.getMaxLine()\n const maxCount = this.getMaxCount()\n\n const restSize = this.sizeCache.get('rest')\n const prefixSize = this.sizeCache.get('prefix')\n const suffixSize = this.sizeCache.get('suffix')\n const containerSize = this.sizeCache.get('container')!\n\n let suffixSingleLine = false\n let top = 0\n let currentLineMaxHeight = 0\n let hasRest = maxCount < this.getItemCounts()\n\n let prevOverflow: OverflowItem | null = null\n const overflows: OverflowItem[] = []\n\n if (prefixSize) {\n const prefixSize = this.sizeCache.get('prefix')!\n overflows.push((prevOverflow = {\n key: 'prefix',\n index: 0,\n line: 0,\n top: 0,\n left: 0,\n width: prefixSize.width || 0,\n height: prefixSize.height || 0,\n }))\n }\n\n if (suffixSize && suffixSize.width > containerSize.width)\n suffixSingleLine = true\n\n const genNextItem = (key: string, size?: SizeRect, nextLine?: boolean) => {\n const prevIndex = prevOverflow?.index ?? -1\n const prevLine = prevOverflow?.line || 0\n const left = nextLine ? 0 : (prevOverflow?.left || 0) + (prevOverflow?.width || 0)\n return {\n key,\n index: prevIndex + 1,\n line: nextLine ? prevLine + 1 : prevLine,\n top,\n left,\n width: size?.width || 0,\n height: size?.height || 0,\n }\n }\n\n for (let i = 0; i < maxCount; i++) {\n const key = this.options.getIdByIndex?.(i)\n const size = this.sizeCache.get(key!)\n\n if (!size && size !== null)\n break\n\n let nextLine = false\n\n const isLastOne = i === maxCount - 1\n const restWidth = isLastOne ? 0 : restSize?.width || 0\n\n const maybeMaxLine = notNil(maxLine) ? suffixSingleLine ? maxLine - 1 : maxLine : undefined\n let validWidth = containerSize.width\n if (prevOverflow)\n validWidth -= prevOverflow.left + prevOverflow.width\n\n // 最后一行\n if (notNil(maybeMaxLine) && prevOverflow?.line === maybeMaxLine) {\n validWidth -= restWidth\n\n if (!suffixSingleLine)\n validWidth -= suffixSize?.width || 0\n\n if (validWidth < size.width || 0) {\n // 没有足够的空间放下当前元素\n hasRest = true\n break\n }\n }\n else {\n if (validWidth < size.width || 0) {\n // 换行\n nextLine = true\n top += currentLineMaxHeight\n currentLineMaxHeight = 0\n }\n }\n\n overflows.push((prevOverflow = genNextItem(key!, size, nextLine)))\n\n currentLineMaxHeight = Math.max(currentLineMaxHeight, size.height)\n }\n\n if (hasRest)\n overflows.push(prevOverflow = genNextItem('rest', restSize, false))\n\n if (suffixSize)\n overflows.push(prevOverflow = genNextItem('suffix', suffixSize, suffixSingleLine))\n\n return this.updateMeasurementsCache(overflows)\n }\n\n private updateMeasurementsCache(measurements: OverflowItem[]) {\n const isSame = measurements.length === this.measurementsCache.length\n && measurements.every ((item, index) => {\n return item.key === this.measurementsCache[index]?.key\n })\n\n this.sizeChanged = false\n\n if (!isSame) {\n this.measurementsCache = measurements\n const displayCount = measurements.filter(item => !internalFixedKeys.includes(item.key)).length\n this.displayCount = displayCount\n }\n\n return this.measurementsCache\n }\n\n getContainerStyle(): Partial<CSSProperties> {\n const { direction } = this.options\n\n const style: CSSProperties = {\n display: 'flex',\n flexWrap: 'wrap',\n position: 'relative',\n }\n direction && (style.direction = direction)\n return style\n }\n\n getItemStyle(id: string): Partial<CSSProperties> {\n const item = this.measurementsCache.find(item => item.key === id)\n\n if (!item) {\n return {\n opacity: '0',\n position: 'absolute',\n top: '-9999px',\n left: '-9999px',\n }\n }\n return {\n flexShrink: '0',\n margin: '0',\n }\n }\n\n getRestStyle(): Partial<CSSProperties> {\n const rest = this.measurementsCache.find(item => item.key === 'rest')\n if (!rest) {\n return {\n opacity: '0',\n position: 'absolute',\n top: '-9999px',\n left: '-9999px',\n }\n }\n return {}\n }\n}\n"],"names":["Observer","memo","isElementNode","prefixSize","notNil","item"],"mappings":"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"}