@oicl/openbridge-webcomponents 2.0.0-next.170 → 2.0.0-next.171
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/bundle/openbridge-webcomponents.bundle.js +870 -441
- package/bundle/openbridge-webcomponents.bundle.js.map +1 -1
- package/custom-elements.json +1333 -392
- package/dist/ar/poi/poi-aton.d.ts +1 -0
- package/dist/ar/poi/poi-aton.d.ts.map +1 -1
- package/dist/ar/poi/poi-aton.js +1 -0
- package/dist/ar/poi/poi-aton.js.map +1 -1
- package/dist/ar/poi/poi-base.d.ts +39 -5
- package/dist/ar/poi/poi-base.d.ts.map +1 -1
- package/dist/ar/poi/poi-base.js +108 -37
- package/dist/ar/poi/poi-base.js.map +1 -1
- package/dist/ar/poi/poi-data.d.ts +1 -0
- package/dist/ar/poi/poi-data.d.ts.map +1 -1
- package/dist/ar/poi/poi-data.js +1 -0
- package/dist/ar/poi/poi-data.js.map +1 -1
- package/dist/ar/poi/poi-vessel.d.ts +1 -0
- package/dist/ar/poi/poi-vessel.d.ts.map +1 -1
- package/dist/ar/poi/poi-vessel.js +1 -0
- package/dist/ar/poi/poi-vessel.js.map +1 -1
- package/dist/ar/poi/poi.d.ts +4 -12
- package/dist/ar/poi/poi.d.ts.map +1 -1
- package/dist/ar/poi/poi.js +6 -72
- package/dist/ar/poi/poi.js.map +1 -1
- package/dist/ar/poi-button/poi-button.d.ts +6 -2
- package/dist/ar/poi-button/poi-button.d.ts.map +1 -1
- package/dist/ar/poi-button/poi-button.js +10 -1
- package/dist/ar/poi-button/poi-button.js.map +1 -1
- package/dist/ar/poi-card/poi-card.d.ts +12 -1
- package/dist/ar/poi-card/poi-card.d.ts.map +1 -1
- package/dist/ar/poi-card/poi-card.js +4 -1
- package/dist/ar/poi-card/poi-card.js.map +1 -1
- package/dist/ar/poi-controller/poi-controller.d.ts +45 -1
- package/dist/ar/poi-controller/poi-controller.d.ts.map +1 -1
- package/dist/ar/poi-controller/poi-controller.js +72 -14
- package/dist/ar/poi-controller/poi-controller.js.map +1 -1
- package/dist/ar/poi-group/poi-group.d.ts +28 -5
- package/dist/ar/poi-group/poi-group.d.ts.map +1 -1
- package/dist/ar/poi-group/poi-group.js +50 -7
- package/dist/ar/poi-group/poi-group.js.map +1 -1
- package/dist/ar/poi-layer/poi-layer.css.js +69 -18
- package/dist/ar/poi-layer/poi-layer.css.js.map +1 -1
- package/dist/ar/poi-layer/poi-layer.d.ts +64 -5
- package/dist/ar/poi-layer/poi-layer.d.ts.map +1 -1
- package/dist/ar/poi-layer/poi-layer.js +173 -39
- package/dist/ar/poi-layer/poi-layer.js.map +1 -1
- package/dist/ar/poi-layer-stack/poi-layer-stack.d.ts +82 -7
- package/dist/ar/poi-layer-stack/poi-layer-stack.d.ts.map +1 -1
- package/dist/ar/poi-layer-stack/poi-layer-stack.js +172 -100
- package/dist/ar/poi-layer-stack/poi-layer-stack.js.map +1 -1
- package/dist/ar/poi-projection/poi-projection.d.ts +88 -0
- package/dist/ar/poi-projection/poi-projection.d.ts.map +1 -0
- package/dist/ar/poi-projection/poi-projection.js +90 -0
- package/dist/ar/poi-projection/poi-projection.js.map +1 -0
- package/package.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poi-layer.js","names":[],"sources":["../../../src/ar/poi-layer/poi-layer.ts"],"sourcesContent":["import {LitElement, PropertyValues, html, nothing, unsafeCSS} from 'lit';\nimport {property, query} from 'lit/decorators.js';\nimport {customElement} from '../../decorator.js';\nimport componentStyle from './poi-layer.css?inline';\nimport '../poi-group/poi-group.js';\nimport {PoiDataValue, PoiDataVisualRectPreference} from '../poi/poi-data.js';\nimport {Poi, isPoi, POI_ATTR} from '../poi/poi.js';\nimport {ObcPoiButtonType} from '../poi-button/poi-button.js';\nimport {\n buildAdjacencyMaps,\n buildClusters,\n type GroupingThresholds,\n} from './poi-layer-grouping-utils.js';\nimport {updateCrossingModeState} from './poi-layer-crossing-utils.js';\nimport {getEffectivePoiX} from '../poi/poi-position.js';\nimport {easeInOutQuad} from '../poi-group/animation-utils.js';\nimport {\n getCssVarAsNumber,\n getTouchTargetSize,\n getVisualTargetSize,\n} from '../poi/poi-css-vars.js';\nimport {\n applyPoiVisualState,\n clearPoiVisualState,\n} from '../poi/poi-visual-state.js';\n\nconst EXIT_DELAY_MS_VAR = '--obc-poi-layer-exit-delay-ms';\nconst GROUP_REMOVAL_DELAY_MS_VAR = '--obc-poi-layer-group-removal-delay-ms';\nconst EXIT_LOCK_DURATION_MS_VAR = '--obc-poi-layer-exit-lock-duration-ms';\nconst POI_CROSSING_MIN_GAP_VAR = '--obc-poi-layer-crossing-min-gap';\n\ninterface PoiButtonGroupElement extends HTMLElement {\n expand?: boolean;\n collapsing?: boolean;\n updatePosition?: () => void;\n refreshExpandedLayout?: (preserveCenter?: boolean) => void;\n internalSwapping?: boolean;\n}\n\nexport enum OverlapMode {\n Grouping = 'grouping',\n Crossing = 'crossing',\n}\n\n/**\n * `<obc-poi-layer>` - A POI layout container that resolves overlapping targets by grouping or crossing strategies.\n *\n * This component watches slotted POI targets, applies overlap state/visual rules, and coordinates automatic `obc-poi-group` creation when needed.\n * Use it as the main layer container when you want centralized overlap behavior plus layer height updates for parent layout systems.\n *\n * ### Features\n * - Overlap strategies: `overlapMode=\"grouping\"` builds overlap clusters; `overlapMode=\"crossing\"` continuously adjusts horizontal offsets to reduce crossings.\n * - Auto-group lifecycle: Creates/removes auto groups and preserves front/behind/pre-group states during transitions.\n * - Manual group support: Respects existing `obc-poi-group` elements and can optionally join nearby targets while a group is expanded (`joinWhileExpanded`).\n * - Dynamic observation: Reacts to slot changes, target style/position mutations, and target size changes to recompute grouping and layer height.\n * - Layer diagnostics: `debug` shows a label overlay using `label`.\n * - Selection flag: `isSelected` reflects to attribute but has no direct runtime layout logic in this class.\n * - Group ordering option: `internalSwapping` is forwarded to groups to allow expanded ordering updates based on movement.\n *\n * ### Usage Guidelines\n * - Place `obc-poi-data` targets (and optional `obc-poi-group`) in the default slot.\n * - Choose `overlapMode` based on behavior:\n * - `grouping`: best when overlaps should collapse into expandable clusters.\n * - `crossing`: best when targets stay independent but should separate horizontally.\n * - Listen for `layer-resize` to keep parent containers in sync with computed layer height.\n * - Enable `joinWhileExpanded` only when targets should be able to join an already expanded auto-group.\n * - **TODO(designer):** Confirm intended user-visible behavior for `isSelected`, since it currently reflects an attribute but is not consumed by the layer logic here.\n *\n * ### Slots\n * | Slot | Renders When... | Purpose |\n * | --- | --- | --- |\n * | default | Always | Hosts POI targets (`obc-poi-data*`) and optional manual `obc-poi-group` elements. |\n *\n * ### Events\n * - `layer-resize` - Fired when computed layer height changes. Detail: `{ height: number, label: string }`.\n *\n * ### Best Practices\n * - Keep POI targets as direct descendants when possible to reduce grouping ambiguity.\n * - Use stable `x`/`y` updates for animated scenarios so grouping and crossing calculations remain predictable.\n * - Avoid adding non-POI interactive wrappers inside the layer unless needed, as layer observers track POI-related descendants.\n *\n * ### Example\n * ```html\n * <obc-poi-layer label=\"Targets\" overlapMode=\"grouping\" debug>\n * <obc-poi-data x=\"180\" y=\"110\"></obc-poi-data>\n * <obc-poi-data x=\"205\" y=\"90\"></obc-poi-data>\n * <obc-poi-data x=\"230\" y=\"100\"></obc-poi-data>\n * </obc-poi-layer>\n * ```\n *\n * @slot - Default slot for POI targets and optional POI groups.\n * @fires {CustomEvent<{height:number,label:string}>} layer-resize - Fired when the layer height changes.\n * @fires {Event} layer-selection-changed - Fired when the layer's `isSelected` state changes. Bubbles.\n * @experimental\n */\n@customElement('obc-poi-layer')\nexport class ObcPoiLayer extends LitElement {\n @property({type: String}) label = '';\n @property({type: Boolean}) debug = false;\n @property({type: String}) overlapMode: OverlapMode = OverlapMode.Grouping;\n @property({type: Boolean, attribute: 'is-selected'})\n isSelected = false;\n @property({type: Boolean, attribute: 'join-while-expanded'})\n joinWhileExpanded = false;\n @property({type: Boolean, attribute: 'internal-swapping'})\n internalSwapping = false;\n\n @query('.wrapper') private wrapper?: HTMLElement;\n\n private resizeObserver?: ResizeObserver;\n private targetResizeObserver?: ResizeObserver;\n private lastHeight = 0;\n private isGrouping = false;\n private targetObservers = new Map<Poi, MutationObserver>();\n private targetSizeElements = new Map<Poi, HTMLElement>();\n private groupingRaf = 0;\n private heightRaf = 0;\n private groupRemovalTimers = new WeakMap<HTMLElement, number>();\n private exitLockTimers = new Map<HTMLElement, number>();\n private layerMutationObserver?: MutationObserver;\n private autoGroupCollapseTimeout = 0;\n private crossingModeRaf = 0;\n private cachedCrossingTargets: Poi[] = [];\n private crossingTargetsDirty = false;\n private crossingOrder: Poi[] = [];\n private crossingLastEffectiveX = new Map<Poi, number>();\n private previousPositions = new Map<Poi, number>();\n private lastOffsets = new Map<Poi, number>();\n private static readonly GROUP_LAYER_HOOK_ATTR = 'data-in-poi-layer';\n private handleSlotChange = () => {\n this.updateTargetObservers();\n this.scheduleGrouping();\n this.scheduleLayerHeightUpdate();\n };\n private handleCollapseFinished = () => {\n this.scheduleGrouping();\n };\n\n override connectedCallback() {\n super.connectedCallback();\n if (!this.hasUpdated) return;\n this.setupResizeObserver();\n this.setupTargetResizeObserver();\n this.setupLayerMutationObserver();\n this.updateTargetObservers();\n this.scheduleGrouping();\n this.scheduleLayerHeightUpdate();\n this.addLayerEventListeners();\n const slot = this.shadowRoot?.querySelector('slot');\n slot?.addEventListener('slotchange', this.handleSlotChange);\n }\n\n override firstUpdated() {\n this.crossingTargetsDirty = true;\n this.setupResizeObserver();\n this.setupTargetResizeObserver();\n this.setupLayerMutationObserver();\n this.updateTargetObservers();\n this.scheduleGrouping();\n this.scheduleLayerHeightUpdate();\n const slot = this.shadowRoot?.querySelector('slot');\n slot?.addEventListener('slotchange', this.handleSlotChange);\n requestAnimationFrame(() => {\n this.updateTargetObservers();\n this.scheduleLayerHeightUpdate();\n });\n this.addLayerEventListeners();\n }\n\n private handlePoiDataLayoutChange = () => {\n this.scheduleGrouping();\n this.scheduleLayerHeightUpdate();\n };\n\n private handleGroupExpand = (event: CustomEvent<{expand: boolean}>) => {\n const group = event.target as HTMLElement;\n if (!group?.tagName?.toLowerCase().includes('group')) return;\n if (group.hasAttribute('data-exiting')) return;\n\n const targets = this.getAllTargets();\n const groupedTargets = new Set<Poi>(this.getGroupTargets(group));\n if (groupedTargets.size === 0) return;\n\n if (event.detail.expand) {\n targets.forEach((target) => {\n if (!groupedTargets.has(target)) {\n const nextValue = this.resolveTargetValue(target, true);\n target.value = nextValue;\n if (nextValue === PoiDataValue.Overlapped) {\n this.applyStandaloneVisualState(target, true);\n } else {\n this.clearStandaloneVisualState(target);\n }\n }\n });\n }\n };\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.removeLayerEventListeners();\n const slot = this.shadowRoot?.querySelector('slot');\n slot?.removeEventListener('slotchange', this.handleSlotChange);\n this.resizeObserver?.disconnect();\n this.targetResizeObserver?.disconnect();\n this.layerMutationObserver?.disconnect();\n this.targetObservers.forEach((observer) => observer.disconnect());\n this.targetObservers.clear();\n this.targetSizeElements.clear();\n if (this.groupingRaf) {\n cancelAnimationFrame(this.groupingRaf);\n this.groupingRaf = 0;\n }\n if (this.crossingModeRaf) {\n cancelAnimationFrame(this.crossingModeRaf);\n this.crossingModeRaf = 0;\n }\n this.previousPositions.clear();\n if (this.heightRaf) {\n cancelAnimationFrame(this.heightRaf);\n this.heightRaf = 0;\n }\n this.exitLockTimers.forEach((timerId) => window.clearTimeout(timerId));\n this.exitLockTimers.clear();\n if (this.autoGroupCollapseTimeout) {\n window.clearTimeout(this.autoGroupCollapseTimeout);\n this.autoGroupCollapseTimeout = 0;\n }\n this.buttonOffsetXResetRaf.forEach((rafId) => cancelAnimationFrame(rafId));\n this.buttonOffsetXResetRaf.clear();\n this.lastOffsets.clear();\n this.crossingLastEffectiveX.clear();\n }\n\n private addLayerEventListeners() {\n this.addEventListener(\n 'obc-poi-data-layout-change',\n this.handlePoiDataLayoutChange as EventListener\n );\n this.addEventListener('expand', this.handleGroupExpand as EventListener);\n this.addEventListener(\n 'collapse-finished',\n this.handleCollapseFinished as EventListener\n );\n }\n\n private removeLayerEventListeners() {\n this.removeEventListener(\n 'obc-poi-data-layout-change',\n this.handlePoiDataLayoutChange as EventListener\n );\n this.removeEventListener('expand', this.handleGroupExpand as EventListener);\n this.removeEventListener(\n 'collapse-finished',\n this.handleCollapseFinished as EventListener\n );\n }\n\n private setupResizeObserver() {\n if (typeof ResizeObserver === 'undefined') return;\n this.resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n this.updateLayerHeight(entry.contentRect.height);\n }\n });\n if (this.wrapper) {\n this.resizeObserver.observe(this.wrapper);\n this.updateLayerHeight(this.wrapper.getBoundingClientRect().height);\n }\n }\n\n private setupTargetResizeObserver() {\n if (typeof ResizeObserver === 'undefined') return;\n if (this.targetResizeObserver) return;\n this.targetResizeObserver = new ResizeObserver(() =>\n this.scheduleLayerHeightUpdate()\n );\n }\n\n private scheduleLayerHeightUpdate() {\n if (this.heightRaf) return;\n this.heightRaf = requestAnimationFrame(() => {\n this.heightRaf = 0;\n this.syncLayerHeight();\n });\n }\n\n private syncLayerHeight() {\n if (!this.isConnected) return;\n const minHeight = this.getLayerMinHeight();\n const heightFloor = this.getLayerHeightFloor(minHeight);\n const targets = this.getAllTargets();\n if (targets.length === 0) {\n const nextHeight = heightFloor;\n this.style.setProperty('--obc-poi-layer-height', `${nextHeight}px`);\n this.updateLayerHeight(nextHeight);\n return;\n }\n const rects = new Map<Poi, DOMRect>();\n targets.forEach((target) => rects.set(target, this.getTargetRect(target)));\n let maxHeight = 0;\n rects.forEach((rect) => {\n const height = rect?.height ?? 0;\n if (Number.isFinite(height)) {\n maxHeight = Math.max(maxHeight, height);\n }\n });\n const nextHeight = Math.max(maxHeight, heightFloor);\n if (nextHeight <= 0) {\n this.style.setProperty('--obc-poi-layer-height', '0px');\n this.updateLayerHeight(0);\n return;\n }\n const roundedHeight = Math.round(nextHeight);\n this.style.setProperty('--obc-poi-layer-height', `${roundedHeight}px`);\n this.updateLayerHeight(roundedHeight);\n }\n\n private getLayerMinHeight(): number {\n const minHeightRaw = getComputedStyle(this).minHeight;\n const minHeight = Number.parseFloat(minHeightRaw);\n return Number.isFinite(minHeight) ? minHeight : 0;\n }\n\n private getLayerHeightFloor(minHeight: number): number {\n if (!this.hasAttribute('data-stack-inactive')) {\n return minHeight;\n }\n\n return Math.max(minHeight, this.lastHeight);\n }\n\n private updateLayerHeight(nextHeight: number) {\n const roundedHeight = Math.round(nextHeight);\n if (roundedHeight === this.lastHeight) return;\n this.lastHeight = roundedHeight;\n this.dispatchEvent(\n new CustomEvent('layer-resize', {\n detail: {\n height: roundedHeight,\n label: this.label,\n },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private updateTargetObservers() {\n const targets = this.getAllTargets();\n const targetSet = new Set(targets);\n\n this.targetObservers.forEach((observer, target) => {\n if (!targetSet.has(target)) {\n observer.disconnect();\n this.targetObservers.delete(target);\n }\n });\n\n targets.forEach((target) => {\n if (this.targetObservers.has(target)) return;\n const observer = new MutationObserver(() => {\n this.scheduleGrouping();\n this.scheduleLayerHeightUpdate();\n });\n observer.observe(target, {\n attributes: true,\n attributeFilter: ['style', 'y', 'button-y'],\n });\n this.targetObservers.set(target, observer);\n });\n this.updateTargetSizeObservers(targets, targetSet);\n }\n\n private updateTargetSizeObservers(targets: Poi[], targetSet: Set<Poi>) {\n if (!this.targetResizeObserver) return;\n this.targetSizeElements.forEach((element, target) => {\n if (!targetSet.has(target) || !element.isConnected) {\n this.targetResizeObserver?.unobserve(element);\n this.targetSizeElements.delete(target);\n }\n });\n targets.forEach((target) => {\n const sizeElement = this.getTargetSizeElement(target);\n if (!sizeElement) return;\n const existing = this.targetSizeElements.get(target);\n if (existing === sizeElement) return;\n if (existing) {\n this.targetResizeObserver?.unobserve(existing);\n }\n this.targetResizeObserver?.observe(sizeElement);\n this.targetSizeElements.set(target, sizeElement);\n });\n }\n\n private getTargetSizeElement(target: Poi): HTMLElement | null {\n return target.getVisualElement(PoiDataVisualRectPreference.Size);\n }\n\n private isPoiLayerRelevantNode(node: HTMLElement): boolean {\n if (isPoi(node) || node.tagName.toLowerCase() === 'obc-poi-group')\n return true;\n return !!node.querySelector(`[${POI_ATTR}], obc-poi-group`);\n }\n\n private setupLayerMutationObserver() {\n this.layerMutationObserver?.disconnect();\n this.layerMutationObserver = new MutationObserver((mutations) => {\n for (const mutation of mutations) {\n if (mutation.type !== 'childList') continue;\n const nodes = [...mutation.addedNodes, ...mutation.removedNodes];\n for (const node of nodes) {\n if (!(node instanceof HTMLElement)) continue;\n if (this.isPoiLayerRelevantNode(node)) {\n this.updateTargetObservers();\n this.scheduleGrouping();\n this.scheduleLayerHeightUpdate();\n this.crossingTargetsDirty = true;\n return;\n }\n }\n }\n });\n this.layerMutationObserver.observe(this, {childList: true, subtree: true});\n }\n\n public requestGroupingUpdate() {\n this.scheduleGrouping();\n this.scheduleLayerHeightUpdate();\n }\n\n private scheduleGrouping() {\n if (this.overlapMode === OverlapMode.Crossing) {\n this.scheduleCrossingMode();\n return;\n }\n if (this.groupingRaf) return;\n this.groupingRaf = requestAnimationFrame(() => {\n this.groupingRaf = 0;\n this.updateGrouping();\n });\n }\n\n private scheduleCrossingMode() {\n if (this.crossingModeRaf) return;\n this.crossingModeRaf = requestAnimationFrame(() => {\n try {\n this.crossingModeRaf = 0;\n const shouldContinue = this.updateCrossingMode();\n if (\n this.overlapMode === OverlapMode.Crossing &&\n this.isConnected &&\n shouldContinue\n ) {\n this.scheduleCrossingMode();\n }\n } catch (error) {\n console.error('[poi-layer] Error in crossing mode:', error);\n this.crossingModeRaf = 0;\n }\n });\n }\n\n private updateCrossingMode(): boolean {\n if (this.crossingTargetsDirty) {\n this.cachedCrossingTargets = this.getAllTargets();\n this.crossingTargetsDirty = false;\n }\n const targets = this.cachedCrossingTargets;\n const buttonWidth = getTouchTargetSize(this);\n const minGap = getCssVarAsNumber(\n this,\n POI_CROSSING_MIN_GAP_VAR,\n buttonWidth + 4\n );\n const next = updateCrossingModeState({\n targets,\n buttonWidth,\n minGap,\n previousPositions: this.previousPositions,\n lastOffsets: this.lastOffsets,\n crossingOrder: this.crossingOrder,\n crossingLastEffectiveX: this.crossingLastEffectiveX,\n });\n this.previousPositions = next.previousPositions;\n this.crossingOrder = next.crossingOrder;\n return next.shouldContinue;\n }\n\n private toggleGroupLayerHook(group: HTMLElement, hasTargets: boolean) {\n if (hasTargets) {\n group.setAttribute(ObcPoiLayer.GROUP_LAYER_HOOK_ATTR, '');\n } else {\n group.removeAttribute(ObcPoiLayer.GROUP_LAYER_HOOK_ATTR);\n }\n }\n\n private updateGrouping() {\n if (this.isGrouping) return;\n this.isGrouping = true;\n try {\n const manualGroups = (\n Array.from(\n this.querySelectorAll('obc-poi-group')\n ) as PoiButtonGroupElement[]\n ).filter((group) => !group.hasAttribute('data-auto-group'));\n const manualGroupedTargets = new Set<HTMLElement>();\n manualGroups.forEach((group) => {\n const groupTargets = this.getGroupTargets(group);\n this.toggleGroupLayerHook(group, groupTargets.length > 0);\n groupTargets.forEach((target) => manualGroupedTargets.add(target));\n });\n if (manualGroups.length > 0) {\n const anyExpanded = manualGroups.some(\n (group) => group.expand === true || group.collapsing === true\n );\n if (anyExpanded) {\n return;\n }\n }\n\n const targets = this.getAllTargets().filter(\n (target) =>\n !manualGroupedTargets.has(target) &&\n !target.hasAttribute('data-stack-returning')\n );\n\n const layerRect = this.getBoundingClientRect();\n const enterRaw = getComputedStyle(this).getPropertyValue(\n '--obc-poi-layer-overlap-enter'\n );\n const exitRaw = getComputedStyle(this).getPropertyValue(\n '--obc-poi-layer-overlap-exit'\n );\n const preRaw = getComputedStyle(this).getPropertyValue(\n '--obc-poi-layer-overlap-pre'\n );\n const behindRaw = getComputedStyle(this).getPropertyValue(\n '--obc-poi-layer-overlap-behind'\n );\n const enterThreshold = Number.parseFloat(enterRaw) || 0;\n const exitThreshold =\n Number.parseFloat(exitRaw) || Math.max(enterThreshold + 8, 8);\n const preThreshold = Number.parseFloat(preRaw) || enterThreshold;\n const behindThreshold = Number.parseFloat(behindRaw) || enterThreshold;\n\n const currentGroupByTarget = new Map<Poi, HTMLElement>();\n targets.forEach((target) => {\n const parent = target.parentElement;\n if (parent?.tagName.toLowerCase() === 'obc-poi-group') {\n currentGroupByTarget.set(target, parent as HTMLElement);\n }\n });\n\n const rects = new Map<Poi, DOMRect>();\n targets.forEach((target) => {\n rects.set(target, this.getTargetRectForGrouping(target, layerRect));\n });\n\n const thresholds: GroupingThresholds = {\n enterThreshold,\n exitThreshold,\n preThreshold,\n behindThreshold,\n };\n\n const {adjacency, behindAdjacency, preGrouped} = buildAdjacencyMaps(\n targets,\n rects,\n thresholds,\n currentGroupByTarget\n );\n\n const clusters = buildClusters(targets, adjacency);\n const behindClusters = buildClusters(targets, behindAdjacency);\n\n const existingGroups = Array.from(\n this.querySelectorAll('obc-poi-group[data-auto-group]')\n ) as PoiButtonGroupElement[];\n\n const frontTargets = new Set<Poi>();\n clusters.forEach((cluster) => {\n const front = this.getFrontTarget(cluster, rects);\n if (front) frontTargets.add(front);\n });\n\n const behindTargets = new Set<Poi>();\n behindClusters.forEach((cluster) => {\n const behind = this.getShortestTarget(cluster, rects);\n if (behind) behindTargets.add(behind);\n });\n\n const expandedAutoGroup = existingGroups.find(\n (group) => group.expand === true || group.collapsing === true\n );\n if (expandedAutoGroup) {\n if (this.joinWhileExpanded) {\n this.tryJoinExpandedGroup(\n expandedAutoGroup,\n targets,\n rects,\n enterThreshold\n );\n }\n return;\n }\n\n const remainingClusters = [...clusters];\n const keptGroups: HTMLElement[] = [];\n\n existingGroups.forEach((group) => {\n const children = Array.from(group.children).filter(\n (child): child is Poi => isPoi(child)\n );\n const matchIndex = remainingClusters.findIndex(\n (cluster) =>\n cluster.length === children.length &&\n cluster.every((target) => children.includes(target))\n );\n if (matchIndex >= 0) {\n keptGroups.push(group);\n group.removeAttribute('data-exiting');\n group.setAttribute('data-visible', 'true');\n remainingClusters.splice(matchIndex, 1);\n } else {\n const front = this.getFrontTarget(children, rects);\n children.forEach((child) => {\n if (front && child === front) {\n child.setAttribute('data-front', 'true');\n child.setAttribute('data-front-exit', 'true');\n } else {\n child.removeAttribute('data-front');\n }\n });\n children.forEach((child) => {\n if (!front || child !== front) {\n child.setAttribute('data-exiting', 'true');\n this.startExitLock(child);\n } else {\n child.removeAttribute('data-exiting');\n child.removeAttribute('data-exit-lock');\n }\n child.removeAttribute('data-grouped');\n this.resetTarget(child);\n });\n group.removeAttribute('data-visible');\n group.setAttribute('data-exiting', 'true');\n children.forEach((child) => this.appendChild(child));\n children.forEach((child) => {\n if (!front || child !== front) {\n child.getBoundingClientRect();\n }\n });\n const exitDelay = getCssVarAsNumber(this, EXIT_DELAY_MS_VAR, 140);\n window.setTimeout(() => {\n children.forEach((child) => {\n if (!front || child !== front) {\n child.removeAttribute('data-exiting');\n }\n });\n }, exitDelay);\n requestAnimationFrame(() => {\n this.scheduleGroupRemoval(group);\n });\n }\n });\n\n remainingClusters.forEach((cluster) => {\n const group = document.createElement('obc-poi-group');\n group.setAttribute('data-auto-group', 'true');\n group.setAttribute('data-position-mode', 'bottom');\n group.setAttribute('data-visible', 'true');\n (group as PoiButtonGroupElement).internalSwapping =\n !!this.internalSwapping;\n group.setAttribute(\n 'positionVertical',\n `${this.getGroupPositionVertical(cluster, rects, layerRect, group)}px`\n );\n cluster.forEach((target) => {\n target.removeAttribute('data-grouped');\n group.appendChild(target);\n });\n this.appendChild(group);\n requestAnimationFrame(() => {\n cluster.forEach((target) =>\n target.setAttribute('data-grouped', 'true')\n );\n });\n keptGroups.push(group);\n });\n\n const groupedTargets = new Set<Poi>();\n keptGroups.forEach((group) => {\n Array.from(group.children).forEach((child) => {\n if (isPoi(child)) groupedTargets.add(child);\n });\n });\n\n targets.forEach((target) => {\n if (!groupedTargets.has(target)) {\n const exitLocked = target.hasAttribute('data-exit-lock');\n target.removeAttribute('data-grouped');\n target.removeAttribute('data-joined-expanded');\n if (target.hasAttribute('data-front-exit')) {\n target.setAttribute('data-front', 'true');\n target.removeAttribute('data-pregrouped');\n } else if (frontTargets.has(target)) {\n target.setAttribute('data-front', 'true');\n target.removeAttribute('data-pregrouped');\n } else if (preGrouped.has(target) && !exitLocked) {\n target.removeAttribute('data-front');\n target.setAttribute('data-pregrouped', 'true');\n } else {\n target.removeAttribute('data-front');\n target.removeAttribute('data-pregrouped');\n }\n if (\n !exitLocked &&\n behindTargets.has(target) &&\n !frontTargets.has(target)\n ) {\n target.setAttribute('data-behind', 'true');\n } else {\n target.removeAttribute('data-behind');\n }\n if (exitLocked) {\n target.removeAttribute('data-pregrouped');\n target.removeAttribute('data-behind');\n }\n const isOverlapState = target.hasAttribute('data-behind');\n const nextValue = this.resolveTargetValue(target, isOverlapState);\n target.value = nextValue;\n if (nextValue === PoiDataValue.Overlapped) {\n this.applyStandaloneVisualState(target, true);\n } else {\n this.clearStandaloneVisualState(target);\n }\n this.resetTarget(target);\n } else {\n target.removeAttribute('data-behind');\n this.clearStandaloneVisualState(target);\n }\n });\n\n this.refreshGroupPositions(layerRect, rects);\n\n requestAnimationFrame(() => {\n targets.forEach((target) => target.removeAttribute('data-front-exit'));\n });\n\n this.scheduleLayerHeightUpdate();\n } finally {\n this.isGrouping = false;\n }\n }\n\n private tryJoinExpandedGroup(\n group: PoiButtonGroupElement,\n targets: Poi[],\n rects: Map<Poi, DOMRect>,\n enterThreshold: number\n ) {\n const groupTargets = this.getGroupTargets(group);\n if (groupTargets.length === 0) return;\n\n const groupTargetSet = new Set(groupTargets);\n const candidates = targets.filter(\n (target) =>\n !groupTargetSet.has(target) &&\n target.parentElement?.tagName.toLowerCase() !== 'obc-poi-group'\n );\n if (candidates.length === 0) return;\n\n const useButtonRects = group.expand === true || group.collapsing === true;\n const groupCenters = groupTargets\n .map((target) =>\n useButtonRects ? this.getTargetRect(target) : rects.get(target)\n )\n .filter((rect): rect is DOMRect => !!rect)\n .map((rect) => rect.left + rect.width / 2);\n if (groupCenters.length === 0) return;\n\n const leftMost = Math.min(...groupCenters);\n const rightMost = Math.max(...groupCenters);\n const groupCenter = (leftMost + rightMost) / 2;\n\n let bestCandidate: Poi | null = null;\n let bestGap = Number.POSITIVE_INFINITY;\n\n for (const candidate of candidates) {\n const candidateRect = useButtonRects\n ? this.getTargetRect(candidate)\n : rects.get(candidate);\n if (!candidateRect) continue;\n for (const member of groupTargets) {\n const memberRect = useButtonRects\n ? this.getTargetRect(member)\n : rects.get(member);\n if (!memberRect) continue;\n const overlapHeight =\n Math.min(candidateRect.bottom, memberRect.bottom) -\n Math.max(candidateRect.top, memberRect.top);\n if (overlapHeight <= 0) continue;\n const gap = Math.max(\n 0,\n Math.max(candidateRect.left, memberRect.left) -\n Math.min(candidateRect.right, memberRect.right)\n );\n if (gap <= enterThreshold && gap < bestGap) {\n bestGap = gap;\n bestCandidate = candidate;\n }\n }\n }\n\n if (!bestCandidate) return;\n\n bestCandidate.setAttribute('data-joined-expanded', 'true');\n\n const candidateRect = rects.get(bestCandidate);\n const candidateCenter =\n candidateRect?.left !== undefined\n ? candidateRect.left + candidateRect.width / 2\n : 0;\n const insertBefore = candidateCenter < groupCenter;\n\n if (insertBefore) {\n group.insertBefore(bestCandidate, groupTargets[0] ?? null);\n } else {\n group.appendChild(bestCandidate);\n }\n\n bestCandidate.setAttribute('data-grouped', 'true');\n bestCandidate.removeAttribute('data-behind');\n bestCandidate.removeAttribute('data-pregrouped');\n bestCandidate.value = this.resolveTargetValue(bestCandidate, false);\n this.clearStandaloneVisualState(bestCandidate);\n\n const touchRaw = getComputedStyle(group).getPropertyValue(\n '--maneuvering-components-poi-button-touch-target'\n );\n const touchSize = Number.parseFloat(touchRaw) || 0;\n if (touchSize > 0) {\n const touchTarget = `${touchSize}px`;\n bestCandidate.style.width = touchTarget;\n bestCandidate.style.minWidth = touchTarget;\n bestCandidate.style.height = touchTarget;\n }\n\n group.refreshExpandedLayout?.(true);\n }\n\n private applyStandaloneVisualState(target: Poi, overlap: boolean) {\n const isEnhanced = target.buttonType === ObcPoiButtonType.Enhanced;\n const size = getVisualTargetSize(this, isEnhanced, overlap);\n applyPoiVisualState(target, overlap, size);\n }\n\n private resolveTargetValue(target: Poi, overlap: boolean): PoiDataValue {\n if (overlap) {\n return PoiDataValue.Overlapped;\n }\n\n if (target.selected) {\n return PoiDataValue.Checked;\n }\n return PoiDataValue.Unchecked;\n }\n\n private clearStandaloneVisualState(target: HTMLElement) {\n clearPoiVisualState(target);\n }\n\n private refreshGroupPositions(\n layerRect?: DOMRect,\n rects?: Map<Poi, DOMRect>\n ) {\n const groups = Array.from(\n this.querySelectorAll('obc-poi-group')\n ) as PoiButtonGroupElement[];\n groups.forEach((group) => {\n const children = Array.from(group.children).filter(\n (child): child is Poi => isPoi(child)\n );\n this.toggleGroupLayerHook(group, children.length > 0);\n const hasPositionAttr =\n group.hasAttribute('positionvertical') ||\n group.hasAttribute('positionVertical');\n if (\n !group.hasAttribute('data-auto-group') &&\n !group.hasAttribute('data-position-mode')\n ) {\n group.setAttribute('data-position-mode', 'bottom');\n }\n const shouldSetPosition =\n group.hasAttribute('data-auto-group') || !hasPositionAttr;\n if (group.hasAttribute('data-auto-group')) {\n (group as PoiButtonGroupElement).internalSwapping =\n !!this.internalSwapping;\n }\n if (children.length > 0 && shouldSetPosition) {\n const layerBounds = layerRect ?? this.getBoundingClientRect();\n const rectMap =\n rects ??\n new Map(\n children.map((child) => [\n child,\n this.getTargetRectForGrouping(child, layerBounds),\n ])\n );\n group.setAttribute(\n 'positionVertical',\n `${this.getGroupPositionVertical(children, rectMap, layerBounds, group)}px`\n );\n }\n group.updatePosition?.();\n });\n }\n\n private getGroupPositionVertical(\n targets: Poi[],\n rects: Map<Poi, DOMRect>,\n layerRect: DOMRect,\n group?: PoiButtonGroupElement\n ) {\n let maxBottom = Number.NEGATIVE_INFINITY;\n targets.forEach((target) => {\n const rect = rects.get(target) ?? target.getBoundingClientRect();\n maxBottom = Math.max(maxBottom, rect.bottom);\n });\n const baseBottom = maxBottom - layerRect.top;\n const isAutoGroup = group?.hasAttribute('data-auto-group') ?? false;\n const offsetRaw = getComputedStyle(this).getPropertyValue(\n '--obc-poi-layer-auto-group-offset-y'\n );\n let offset = Number.parseFloat(offsetRaw) || 0;\n if (isAutoGroup && this.closest('obc-poi-layer-stack')) {\n offset = 0;\n }\n return Math.round(baseBottom + offset);\n }\n\n private resetTarget(target: Poi) {\n if (typeof target.targetOffsetX === 'number') {\n target.setRuntimeHorizontalOffsets?.(target.buttonOffsetX, 0);\n if (!target.setRuntimeHorizontalOffsets) {\n target.targetOffsetX = 0;\n }\n }\n this.animateButtonOffsetXToZero(target);\n target.style.removeProperty('--obc-poi-target-offset-x');\n target.style.removeProperty('position');\n target.style.removeProperty('width');\n target.style.removeProperty('min-width');\n target.style.removeProperty('height');\n target.style.removeProperty('transform');\n target.style.removeProperty('--obc-poi-group-overlap-height');\n target.style.removeProperty('--obc-poi-group-overlap-shift');\n }\n\n private buttonOffsetXResetRaf = new Map<Poi, number>();\n\n private animateButtonOffsetXToZero(target: Poi) {\n const start = target.buttonOffsetX;\n if (!Number.isFinite(start) || Math.abs(start) < 0.5) {\n target.setRuntimeHorizontalOffsets?.(0, target.targetOffsetX);\n if (!target.setRuntimeHorizontalOffsets) {\n target.buttonOffsetX = 0;\n }\n return;\n }\n\n const existing = this.buttonOffsetXResetRaf.get(target);\n if (existing) {\n cancelAnimationFrame(existing);\n }\n\n const duration = 100;\n const startTime = performance.now();\n const step = (now: number) => {\n try {\n if (!target.isConnected) {\n this.buttonOffsetXResetRaf.delete(target);\n return;\n }\n const t = Math.min((now - startTime) / duration, 1);\n const eased = easeInOutQuad(t);\n const nextButtonOffsetX = start + (0 - start) * eased;\n target.setRuntimeHorizontalOffsets?.(\n nextButtonOffsetX,\n target.targetOffsetX\n );\n if (!target.setRuntimeHorizontalOffsets) {\n target.buttonOffsetX = nextButtonOffsetX;\n }\n if (t < 1) {\n this.buttonOffsetXResetRaf.set(target, requestAnimationFrame(step));\n } else {\n this.buttonOffsetXResetRaf.delete(target);\n }\n } catch (error) {\n console.error('[poi-layer] Error in button offset reset:', error);\n this.buttonOffsetXResetRaf.delete(target);\n }\n };\n\n this.buttonOffsetXResetRaf.set(target, requestAnimationFrame(step));\n }\n\n private scheduleGroupRemoval(group: HTMLElement) {\n const existing = this.groupRemovalTimers.get(group);\n if (existing) {\n window.clearTimeout(existing);\n }\n group.setAttribute('data-exiting', 'true');\n const removalDelay = getCssVarAsNumber(\n this,\n GROUP_REMOVAL_DELAY_MS_VAR,\n 250\n );\n const timeoutId = window.setTimeout(() => {\n group.remove();\n this.groupRemovalTimers.delete(group);\n }, removalDelay);\n this.groupRemovalTimers.set(group, timeoutId);\n }\n\n private startExitLock(target: HTMLElement) {\n target.setAttribute('data-exit-lock', 'true');\n const existing = this.exitLockTimers.get(target);\n if (existing) window.clearTimeout(existing);\n const lockDuration = getCssVarAsNumber(\n this,\n EXIT_LOCK_DURATION_MS_VAR,\n 500\n );\n const timeoutId = window.setTimeout(() => {\n target.removeAttribute('data-exit-lock');\n this.exitLockTimers.delete(target);\n }, lockDuration);\n this.exitLockTimers.set(target, timeoutId);\n }\n\n private getFrontTarget(targets: Poi[], rects?: Map<Poi, DOMRect>) {\n if (targets.length === 0) return null;\n let front = targets[0];\n let maxHeight = this.getTargetHeight(front, rects);\n targets.forEach((target) => {\n const height = this.getTargetHeight(target, rects);\n if (height > maxHeight) {\n maxHeight = height;\n front = target;\n }\n });\n return front;\n }\n\n private getTargetRect(target: HTMLElement): DOMRect {\n if (isPoi(target)) {\n return target.getVisualRect(PoiDataVisualRectPreference.Largest);\n }\n return target.getBoundingClientRect();\n }\n\n private getTargetRectForGrouping(\n target: HTMLElement,\n layerRect: DOMRect\n ): DOMRect {\n const rect = this.getTargetRect(target);\n const leftValue = getEffectivePoiX(target);\n if (!Number.isFinite(leftValue)) return rect;\n const width = rect.width || 0;\n const height = rect.height || 0;\n const left = layerRect.left + leftValue - width / 2;\n const top = layerRect.bottom - height;\n return new DOMRect(left, top, width, height);\n }\n\n private getTargetHeight(target: Poi, rects?: Map<Poi, DOMRect>): number {\n const targetY = Number.isFinite(target.y ?? NaN) ? (target.y ?? 0) : null;\n const yAttr = target.getAttribute('y');\n const yValue = Number.parseFloat(yAttr ?? '');\n const attrTargetY = !Number.isNaN(yValue) ? yValue : null;\n const buttonY =\n typeof target.buttonY === 'number' && Number.isFinite(target.buttonY)\n ? target.buttonY\n : null;\n const buttonYAttr = target.getAttribute('button-y');\n const buttonYValue = Number.parseFloat(buttonYAttr ?? '');\n const attrButtonY = !Number.isNaN(buttonYValue) ? buttonYValue : null;\n const logicalHeight = Math.max(\n targetY ?? 0,\n attrTargetY ?? 0,\n buttonY ?? 0,\n attrButtonY ?? 0\n );\n if (logicalHeight > 0) {\n return logicalHeight;\n }\n const rect = rects?.get(target) ?? this.getTargetRect(target);\n return rect.height;\n }\n\n private getShortestTarget(targets: Poi[], rects?: Map<Poi, DOMRect>) {\n if (targets.length === 0) return null;\n let shortest = targets[0];\n let minHeight = this.getTargetHeight(shortest, rects);\n targets.forEach((target) => {\n const height = this.getTargetHeight(target, rects);\n if (height < minHeight) {\n minHeight = height;\n shortest = target;\n }\n });\n return shortest;\n }\n\n private getAllTargets(): Poi[] {\n return Array.from(this.querySelectorAll(`[${POI_ATTR}]`)).filter(\n (node): node is Poi =>\n isPoi(node) && !node.hasAttribute('data-stack-selected')\n );\n }\n\n private getGroupTargets(group: ParentNode): Poi[] {\n return Array.from(group.querySelectorAll(`[${POI_ATTR}]`)).filter(\n (node): node is Poi => isPoi(node)\n );\n }\n\n protected override updated(changedProperties: PropertyValues): void {\n if (changedProperties.has('isSelected')) {\n this.dispatchEvent(new Event('layer-selection-changed', {bubbles: true}));\n }\n }\n\n override render() {\n return html`\n <div class=\"wrapper${this.debug ? ' debug' : ''}\">\n ${\n this.debug\n ? html`<span class=\"debug-label\">${this.label || 'Layer'}</span>`\n : nothing\n }\n <slot></slot>\n </div>\n `;\n }\n\n static override styles = unsafeCSS(componentStyle);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-poi-layer': ObcPoiLayer;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"poi-layer.js","names":[],"sources":["../../../src/ar/poi-layer/poi-layer.ts"],"sourcesContent":["import {LitElement, PropertyValues, html, nothing, unsafeCSS} from 'lit';\nimport {property, query} from 'lit/decorators.js';\nimport {customElement} from '../../decorator.js';\nimport componentStyle from './poi-layer.css?inline';\nimport '../poi-group/poi-group.js';\nimport {PoiDataValue, PoiDataVisualRectPreference} from '../poi/poi-data.js';\nimport {Poi, isPoi, POI_ATTR} from '../poi/poi.js';\nimport {ObcPoiButtonType} from '../poi-button/poi-button.js';\nimport {\n buildAdjacencyMaps,\n buildClusters,\n type GroupingThresholds,\n} from './poi-layer-grouping-utils.js';\nimport {updateCrossingModeState} from './poi-layer-crossing-utils.js';\nimport {getEffectivePoiX} from '../poi/poi-position.js';\nimport {easeInOutQuad} from '../poi-group/animation-utils.js';\nimport {\n getCssVarAsNumber,\n getTouchTargetSize,\n getVisualTargetSize,\n} from '../poi/poi-css-vars.js';\nimport {\n applyPoiVisualState,\n clearPoiVisualState,\n} from '../poi/poi-visual-state.js';\n\nconst EXIT_DELAY_MS_VAR = '--obc-poi-layer-exit-delay-ms';\nconst GROUP_REMOVAL_DELAY_MS_VAR = '--obc-poi-layer-group-removal-delay-ms';\nconst EXIT_LOCK_DURATION_MS_VAR = '--obc-poi-layer-exit-lock-duration-ms';\nconst POI_CROSSING_MIN_GAP_VAR = '--obc-poi-layer-crossing-min-gap';\n\ninterface PoiButtonGroupElement extends HTMLElement {\n expand?: boolean;\n collapsing?: boolean;\n updatePosition?: () => void;\n refreshExpandedLayout?: (preserveCenter?: boolean) => void;\n internalSwapping?: boolean;\n}\n\nexport enum OverlapMode {\n Grouping = 'grouping',\n Crossing = 'crossing',\n}\n\n/**\n * `<obc-poi-layer>` - A POI layout container that resolves overlapping targets by grouping or crossing strategies.\n *\n * This component watches slotted POI targets, applies overlap state/visual rules, and coordinates automatic `obc-poi-group` creation when needed.\n * Use it as the main layer container when you want centralized overlap behavior plus layer height updates for parent layout systems.\n *\n * ### Features\n * - Overlap strategies: `overlapMode=\"grouping\"` builds overlap clusters; `overlapMode=\"crossing\"` continuously adjusts horizontal offsets to reduce crossings.\n * - Auto-group lifecycle: Creates/removes auto groups as shadow-internal chrome — the consumer's light DOM is never modified; members are placed via manual slot assignment. Reach the group elements through the `autoGroups` accessor.\n * - Manual group support: Respects existing `obc-poi-group` elements and can optionally join nearby targets while a group is expanded (`joinWhileExpanded`).\n * - Dynamic observation: Reacts to slot changes, target style/position mutations, and target size changes to recompute grouping and layer height.\n * - Layer diagnostics: `debug` shows a label overlay using `label`.\n * - Selection flag: `isSelected` reflects to attribute but has no direct runtime layout logic in this class.\n * - Group ordering option: `internalSwapping` is forwarded to groups to allow expanded ordering updates based on movement.\n *\n * ### Usage Guidelines\n * - Place `obc-poi-data` targets (and optional `obc-poi-group`) in the default slot.\n * - Choose `overlapMode` based on behavior:\n * - `grouping`: best when overlaps should collapse into expandable clusters.\n * - `crossing`: best when targets stay independent but should separate horizontally.\n * - Handle `layer-resize` only when using the layer standalone; inside `obc-poi-layer-stack` / `obc-poi-controller` the container handles height syncing. Example: `layer.addEventListener('layer-resize', (e) => { host.style.height = e.detail.height + 'px'; })`.\n * - After imperatively adding, removing, or moving POI children outside the layer's own observers, call the public `requestGroupingUpdate()` method to force a recompute; it is the supported hook for imperative DOM mutations.\n * - Set `--obc-poi-layer-min-height` when the layer starts empty, otherwise the layer collapses to 0px height until targets exist.\n * - Enable `joinWhileExpanded` only when targets should be able to join an already expanded auto-group.\n * - **TODO(designer):** Confirm intended user-visible behavior for `isSelected`, since it has no runtime layout logic in this class — it only reflects the attribute and notifies containers via `layer-selection-changed` (consumed by `obc-poi-layer-stack` to pick the selected layer).\n *\n * ### Slots\n * | Slot | Renders When... | Purpose |\n * | --- | --- | --- |\n * | default | Always | Hosts POI targets (`obc-poi-data*`) and optional manual `obc-poi-group` elements. |\n *\n * ### Events\n * - `layer-resize` - Fired when computed layer height changes. Detail: `{ height: number, label: string }`.\n * - `grouping-change` - Fired when grouping membership or front/behind/pre-group state changes. Detail: `{ clusters: Poi[][], front: Poi[], behind: Poi[], pregrouped: Poi[] }`. Subscribe to this instead of observing the layer's internal `data-*` attributes.\n *\n * ### CSS Custom Properties\n * | Property | Default | Purpose |\n * | --- | --- | --- |\n * | `--obc-poi-layer-overlap-enter` | `10px` | Max horizontal gap at which ungrouped targets start grouping. |\n * | `--obc-poi-layer-overlap-exit` | `18px` | Gap at which grouped targets leave their group. Clamped to at least the enter threshold; keep it larger than enter so jittery positions do not oscillate in and out of groups. |\n * | `--obc-poi-layer-overlap-pre` | `16px` | Gap at which targets get the pre-grouped visual state. |\n * | `--obc-poi-layer-overlap-behind` | `10px` | Gap at which the shortest target gets the behind visual state. |\n * | `--obc-poi-layer-exit-delay-ms` | `140` | Delay before exiting targets lose their exit visual state. |\n * | `--obc-poi-layer-group-removal-delay-ms` | `250` | Delay before a dissolved auto-group element is removed. |\n * | `--obc-poi-layer-exit-lock-duration-ms` | `500` | Duration a target is locked out of pre-group/behind states after leaving a group. |\n *\n * ### Best Practices\n * - Keep POI targets as direct descendants when possible to reduce grouping ambiguity.\n * - Targets may update `x`/`y` every animation frame; grouping stays stable as long as the horizontal gap between targets does not oscillate across the enter/exit band faster than the group lifecycle delays (~0.5s). Smooth noisy input coordinates or widen the enter/exit band to compensate.\n * - Avoid adding non-POI interactive wrappers inside the layer unless needed, as layer observers track POI-related descendants.\n *\n * ### Example\n * ```html\n * <obc-poi-layer label=\"Targets\" overlapMode=\"grouping\" debug>\n * <obc-poi-data x=\"180\" y=\"110\"></obc-poi-data>\n * <obc-poi-data x=\"205\" y=\"90\"></obc-poi-data>\n * <obc-poi-data x=\"230\" y=\"100\"></obc-poi-data>\n * </obc-poi-layer>\n * ```\n *\n * @slot - Default slot for POI targets and optional POI groups.\n * @fires {CustomEvent<{height:number,label:string}>} layer-resize - Fired when the layer height changes.\n * @fires {CustomEvent<{clusters:Poi[][],front:Poi[],behind:Poi[],pregrouped:Poi[]}>} grouping-change - Fired when grouping membership or overlap state changes. Bubbles and is composed.\n * @fires {Event} layer-selection-changed - Fired when the layer's `isSelected` state changes. Bubbles.\n * @experimental\n */\n@customElement('obc-poi-layer')\nexport class ObcPoiLayer extends LitElement {\n /**\n * Manual slot assignment lets the layer place consumer-owned targets into\n * shadow-internal auto-group chrome (and back) without ever re-parenting\n * them: grouping only changes which internal slot a target is assigned to.\n */\n static override shadowRootOptions: ShadowRootInit = {\n ...LitElement.shadowRootOptions,\n slotAssignment: 'manual',\n };\n\n @property({type: String}) label = '';\n @property({type: Boolean}) debug = false;\n @property({type: String}) overlapMode: OverlapMode = OverlapMode.Grouping;\n @property({type: Boolean, attribute: 'is-selected'})\n isSelected = false;\n @property({type: Boolean, attribute: 'join-while-expanded'})\n joinWhileExpanded = false;\n @property({type: Boolean, attribute: 'internal-swapping'})\n internalSwapping = false;\n\n @query('.wrapper') private wrapper?: HTMLElement;\n\n private resizeObserver?: ResizeObserver;\n private targetResizeObserver?: ResizeObserver;\n private lastHeight = 0;\n private isGrouping = false;\n private lastGroupingSignature = '';\n private groupingIds = new WeakMap<Poi, number>();\n private nextGroupingId = 1;\n private targetObservers = new Map<Poi, MutationObserver>();\n private targetSizeElements = new Map<Poi, HTMLElement>();\n private groupingRaf = 0;\n private heightRaf = 0;\n private groupRemovalTimers = new WeakMap<HTMLElement, number>();\n private exitLockTimers = new Map<HTMLElement, number>();\n private layerMutationObserver?: MutationObserver;\n private autoGroupCollapseTimeout = 0;\n private crossingModeRaf = 0;\n private cachedCrossingTargets: Poi[] = [];\n private crossingTargetsDirty = false;\n private crossingOrder: Poi[] = [];\n private crossingLastEffectiveX = new Map<Poi, number>();\n private previousPositions = new Map<Poi, number>();\n private lastOffsets = new Map<Poi, number>();\n private static readonly GROUP_LAYER_HOOK_ATTR = 'data-in-poi-layer';\n private handleSlotChange = () => {\n this.updateTargetObservers();\n this.scheduleGrouping();\n this.scheduleLayerHeightUpdate();\n };\n private handleCollapseFinished = () => {\n this.scheduleGrouping();\n };\n\n override connectedCallback() {\n super.connectedCallback();\n if (!this.hasUpdated) return;\n this.setupResizeObserver();\n this.setupTargetResizeObserver();\n this.setupLayerMutationObserver();\n this.updateTargetObservers();\n this.scheduleGrouping();\n this.scheduleLayerHeightUpdate();\n this.addLayerEventListeners();\n const slot = this.shadowRoot?.querySelector('slot');\n slot?.addEventListener('slotchange', this.handleSlotChange);\n }\n\n override firstUpdated() {\n this.crossingTargetsDirty = true;\n this.setupResizeObserver();\n this.setupTargetResizeObserver();\n this.setupLayerMutationObserver();\n this.updateTargetObservers();\n this.scheduleGrouping();\n this.scheduleLayerHeightUpdate();\n const slot = this.shadowRoot?.querySelector('slot');\n slot?.addEventListener('slotchange', this.handleSlotChange);\n requestAnimationFrame(() => {\n this.updateTargetObservers();\n this.scheduleLayerHeightUpdate();\n });\n this.addLayerEventListeners();\n }\n\n private handlePoiDataLayoutChange = () => {\n this.scheduleGrouping();\n this.scheduleLayerHeightUpdate();\n };\n\n private handleGroupExpand = (event: CustomEvent<{expand: boolean}>) => {\n const group = event.target as HTMLElement;\n if (!group?.tagName?.toLowerCase().includes('group')) return;\n if (group.hasAttribute('data-exiting')) return;\n\n const targets = this.getAllTargets();\n const groupedTargets = new Set<Poi>(this.getGroupTargets(group));\n if (groupedTargets.size === 0) return;\n\n if (event.detail.expand) {\n targets.forEach((target) => {\n if (!groupedTargets.has(target)) {\n const nextValue = this.resolveTargetValue(target, true);\n target.value = nextValue;\n if (nextValue === PoiDataValue.Overlapped) {\n this.applyStandaloneVisualState(target, true);\n } else {\n this.clearStandaloneVisualState(target);\n }\n }\n });\n }\n };\n\n override disconnectedCallback() {\n super.disconnectedCallback();\n this.removeLayerEventListeners();\n const slot = this.shadowRoot?.querySelector('slot');\n slot?.removeEventListener('slotchange', this.handleSlotChange);\n this.resizeObserver?.disconnect();\n this.targetResizeObserver?.disconnect();\n this.layerMutationObserver?.disconnect();\n this.targetObservers.forEach((observer) => observer.disconnect());\n this.targetObservers.clear();\n this.targetSizeElements.clear();\n if (this.groupingRaf) {\n cancelAnimationFrame(this.groupingRaf);\n this.groupingRaf = 0;\n }\n if (this.crossingModeRaf) {\n cancelAnimationFrame(this.crossingModeRaf);\n this.crossingModeRaf = 0;\n }\n this.previousPositions.clear();\n if (this.heightRaf) {\n cancelAnimationFrame(this.heightRaf);\n this.heightRaf = 0;\n }\n this.exitLockTimers.forEach((timerId) => window.clearTimeout(timerId));\n this.exitLockTimers.clear();\n if (this.autoGroupCollapseTimeout) {\n window.clearTimeout(this.autoGroupCollapseTimeout);\n this.autoGroupCollapseTimeout = 0;\n }\n this.buttonOffsetXResetRaf.forEach((rafId) => cancelAnimationFrame(rafId));\n this.buttonOffsetXResetRaf.clear();\n this.lastOffsets.clear();\n this.crossingLastEffectiveX.clear();\n }\n\n private addLayerEventListeners() {\n this.addEventListener(\n 'obc-poi-data-layout-change',\n this.handlePoiDataLayoutChange as EventListener\n );\n this.addEventListener('expand', this.handleGroupExpand as EventListener);\n this.addEventListener(\n 'collapse-finished',\n this.handleCollapseFinished as EventListener\n );\n }\n\n private removeLayerEventListeners() {\n this.removeEventListener(\n 'obc-poi-data-layout-change',\n this.handlePoiDataLayoutChange as EventListener\n );\n this.removeEventListener('expand', this.handleGroupExpand as EventListener);\n this.removeEventListener(\n 'collapse-finished',\n this.handleCollapseFinished as EventListener\n );\n }\n\n private setupResizeObserver() {\n if (typeof ResizeObserver === 'undefined') return;\n this.resizeObserver = new ResizeObserver((entries) => {\n for (const entry of entries) {\n this.updateLayerHeight(entry.contentRect.height);\n }\n });\n if (this.wrapper) {\n this.resizeObserver.observe(this.wrapper);\n this.updateLayerHeight(this.wrapper.getBoundingClientRect().height);\n }\n }\n\n private setupTargetResizeObserver() {\n if (typeof ResizeObserver === 'undefined') return;\n if (this.targetResizeObserver) return;\n this.targetResizeObserver = new ResizeObserver(() =>\n this.scheduleLayerHeightUpdate()\n );\n }\n\n private scheduleLayerHeightUpdate() {\n if (this.heightRaf) return;\n this.heightRaf = requestAnimationFrame(() => {\n this.heightRaf = 0;\n this.syncLayerHeight();\n });\n }\n\n private syncLayerHeight() {\n if (!this.isConnected) return;\n const minHeight = this.getLayerMinHeight();\n const heightFloor = this.getLayerHeightFloor(minHeight);\n const targets = this.getAllTargets();\n if (targets.length === 0) {\n const nextHeight = heightFloor;\n this.style.setProperty('--obc-poi-layer-height', `${nextHeight}px`);\n this.updateLayerHeight(nextHeight);\n return;\n }\n const rects = new Map<Poi, DOMRect>();\n targets.forEach((target) => rects.set(target, this.getTargetRect(target)));\n let maxHeight = 0;\n rects.forEach((rect) => {\n const height = rect?.height ?? 0;\n if (Number.isFinite(height)) {\n maxHeight = Math.max(maxHeight, height);\n }\n });\n const nextHeight = Math.max(maxHeight, heightFloor);\n if (nextHeight <= 0) {\n this.style.setProperty('--obc-poi-layer-height', '0px');\n this.updateLayerHeight(0);\n return;\n }\n const roundedHeight = Math.round(nextHeight);\n this.style.setProperty('--obc-poi-layer-height', `${roundedHeight}px`);\n this.updateLayerHeight(roundedHeight);\n }\n\n private getLayerMinHeight(): number {\n const minHeightRaw = getComputedStyle(this).minHeight;\n const minHeight = Number.parseFloat(minHeightRaw);\n return Number.isFinite(minHeight) ? minHeight : 0;\n }\n\n private getLayerHeightFloor(minHeight: number): number {\n if (!this.hasAttribute('data-stack-inactive')) {\n return minHeight;\n }\n\n return Math.max(minHeight, this.lastHeight);\n }\n\n private updateLayerHeight(nextHeight: number) {\n const roundedHeight = Math.round(nextHeight);\n if (roundedHeight === this.lastHeight) return;\n this.lastHeight = roundedHeight;\n this.dispatchEvent(\n new CustomEvent('layer-resize', {\n detail: {\n height: roundedHeight,\n label: this.label,\n },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private updateTargetObservers() {\n const targets = this.getAllTargets();\n const targetSet = new Set(targets);\n\n this.targetObservers.forEach((observer, target) => {\n if (!targetSet.has(target)) {\n observer.disconnect();\n this.targetObservers.delete(target);\n }\n });\n\n targets.forEach((target) => {\n if (this.targetObservers.has(target)) return;\n const observer = new MutationObserver(() => {\n this.scheduleGrouping();\n this.scheduleLayerHeightUpdate();\n });\n observer.observe(target, {\n attributes: true,\n attributeFilter: ['style', 'y', 'button-y'],\n });\n this.targetObservers.set(target, observer);\n });\n this.updateTargetSizeObservers(targets, targetSet);\n }\n\n private updateTargetSizeObservers(targets: Poi[], targetSet: Set<Poi>) {\n if (!this.targetResizeObserver) return;\n this.targetSizeElements.forEach((element, target) => {\n if (!targetSet.has(target) || !element.isConnected) {\n this.targetResizeObserver?.unobserve(element);\n this.targetSizeElements.delete(target);\n }\n });\n targets.forEach((target) => {\n const sizeElement = this.getTargetSizeElement(target);\n if (!sizeElement) return;\n const existing = this.targetSizeElements.get(target);\n if (existing === sizeElement) return;\n if (existing) {\n this.targetResizeObserver?.unobserve(existing);\n }\n this.targetResizeObserver?.observe(sizeElement);\n this.targetSizeElements.set(target, sizeElement);\n });\n }\n\n private getTargetSizeElement(target: Poi): HTMLElement | null {\n return target.getVisualElement(PoiDataVisualRectPreference.Size);\n }\n\n private isPoiLayerRelevantNode(node: HTMLElement): boolean {\n if (isPoi(node) || node.tagName.toLowerCase() === 'obc-poi-group')\n return true;\n return !!node.querySelector(`[${POI_ATTR}], obc-poi-group`);\n }\n\n private setupLayerMutationObserver() {\n this.layerMutationObserver?.disconnect();\n this.layerMutationObserver = new MutationObserver((mutations) => {\n let childListChanged = false;\n let relevant = false;\n for (const mutation of mutations) {\n if (mutation.type !== 'childList') continue;\n childListChanged = true;\n const nodes = [...mutation.addedNodes, ...mutation.removedNodes];\n for (const node of nodes) {\n if (\n node instanceof HTMLElement &&\n this.isPoiLayerRelevantNode(node)\n ) {\n relevant = true;\n break;\n }\n }\n if (relevant) break;\n }\n if (childListChanged) {\n this.syncSlotAssignments();\n }\n if (relevant) {\n this.updateTargetObservers();\n this.scheduleGrouping();\n this.scheduleLayerHeightUpdate();\n this.crossingTargetsDirty = true;\n }\n });\n this.layerMutationObserver.observe(this, {childList: true, subtree: true});\n }\n\n public requestGroupingUpdate() {\n this.scheduleGrouping();\n this.scheduleLayerHeightUpdate();\n }\n\n /* ---------- Manual slot assignment ---------- */\n\n private getMainSlot(): HTMLSlotElement | null {\n return (\n (this.shadowRoot?.querySelector('slot.main') as HTMLSlotElement | null) ??\n null\n );\n }\n\n /**\n * Assign every light-DOM child that is not currently placed in an\n * auto-group member slot to the main slot. With `slotAssignment: 'manual'`\n * nothing renders unless explicitly assigned, so this runs after render,\n * on child-list mutations, and after every grouping change.\n */\n private syncSlotAssignments() {\n const mainSlot = this.getMainSlot();\n if (!mainSlot) return;\n const groupAssigned = new Set<Node>();\n this.getAutoGroups().forEach((group) => {\n const slot = this.getAutoGroupMemberSlot(group);\n slot?.assignedNodes().forEach((node) => groupAssigned.add(node));\n });\n const mainNodes = Array.from(this.childNodes).filter(\n (node): node is Element | Text =>\n !groupAssigned.has(node) &&\n (node instanceof Element || node instanceof Text)\n );\n mainSlot.assign(...mainNodes);\n }\n\n /**\n * Called by an auto-created `obc-poi-group` after it removed a target from\n * its member slot, so the target immediately re-renders through the main\n * slot instead of disappearing until the next grouping pass.\n * @internal\n */\n public releaseAssignedTarget(_target: Poi) {\n this.syncSlotAssignments();\n this.requestGroupingUpdate();\n }\n\n /**\n * The auto-created `obc-poi-group` elements currently managed by this\n * layer. Auto groups are shadow-internal chrome (they never appear in the\n * consumer's light DOM); use this accessor — typically after a\n * `grouping-change` event — to reach them, e.g. to expand a group\n * programmatically.\n */\n public get autoGroups(): HTMLElement[] {\n return this.getAutoGroups();\n }\n\n private getAutoGroups(): PoiButtonGroupElement[] {\n return Array.from(\n this.shadowRoot?.querySelectorAll('obc-poi-group[data-auto-group]') ?? []\n ) as PoiButtonGroupElement[];\n }\n\n private getAutoGroupMemberSlot(group: HTMLElement): HTMLSlotElement | null {\n return group.querySelector(\n ':scope > slot.auto-group-members'\n ) as HTMLSlotElement | null;\n }\n\n /** The auto group a target is currently assigned into, if any. */\n private getAutoGroupOf(target: Poi): HTMLElement | null {\n const slot = target.assignedSlot;\n if (slot?.classList.contains('auto-group-members')) {\n return slot.parentElement;\n }\n return null;\n }\n\n /**\n * Members of a group in either mode: slot-assigned (shadow auto groups) or\n * light-DOM children (consumer-managed manual groups).\n */\n private getGroupMembers(group: ParentNode): Poi[] {\n if (group instanceof HTMLElement) {\n const slot = this.getAutoGroupMemberSlot(group);\n if (slot) {\n return slot.assignedElements().filter((el): el is Poi => isPoi(el));\n }\n }\n return Array.from(group.querySelectorAll(`[${POI_ATTR}]`)).filter(\n (node): node is Poi => isPoi(node)\n );\n }\n\n private scheduleGrouping() {\n if (this.overlapMode === OverlapMode.Crossing) {\n this.scheduleCrossingMode();\n return;\n }\n if (this.groupingRaf) return;\n this.groupingRaf = requestAnimationFrame(() => {\n this.groupingRaf = 0;\n this.updateGrouping();\n });\n }\n\n private scheduleCrossingMode() {\n if (this.crossingModeRaf) return;\n this.crossingModeRaf = requestAnimationFrame(() => {\n try {\n this.crossingModeRaf = 0;\n const shouldContinue = this.updateCrossingMode();\n if (\n this.overlapMode === OverlapMode.Crossing &&\n this.isConnected &&\n shouldContinue\n ) {\n this.scheduleCrossingMode();\n }\n } catch (error) {\n console.error('[poi-layer] Error in crossing mode:', error);\n this.crossingModeRaf = 0;\n }\n });\n }\n\n private updateCrossingMode(): boolean {\n if (this.crossingTargetsDirty) {\n this.cachedCrossingTargets = this.getAllTargets();\n this.crossingTargetsDirty = false;\n }\n const targets = this.cachedCrossingTargets;\n const buttonWidth = getTouchTargetSize(this);\n const minGap = getCssVarAsNumber(\n this,\n POI_CROSSING_MIN_GAP_VAR,\n buttonWidth + 4\n );\n const next = updateCrossingModeState({\n targets,\n buttonWidth,\n minGap,\n previousPositions: this.previousPositions,\n lastOffsets: this.lastOffsets,\n crossingOrder: this.crossingOrder,\n crossingLastEffectiveX: this.crossingLastEffectiveX,\n });\n this.previousPositions = next.previousPositions;\n this.crossingOrder = next.crossingOrder;\n return next.shouldContinue;\n }\n\n private getGroupingId(target: Poi): number {\n let id = this.groupingIds.get(target);\n if (id === undefined) {\n id = this.nextGroupingId++;\n this.groupingIds.set(target, id);\n }\n return id;\n }\n\n private notifyGroupingChange(\n clusters: Poi[][],\n frontTargets: Set<Poi>,\n behindTargets: Set<Poi>,\n preGrouped: Set<Poi>\n ) {\n const idsOf = (targets: Iterable<Poi>) =>\n Array.from(targets, (target) => this.getGroupingId(target)).sort(\n (a, b) => a - b\n );\n const signature = JSON.stringify({\n clusters: clusters.map((cluster) => idsOf(cluster)).sort(),\n front: idsOf(frontTargets),\n behind: idsOf(behindTargets),\n pre: idsOf(preGrouped),\n });\n if (signature === this.lastGroupingSignature) return;\n this.lastGroupingSignature = signature;\n this.dispatchEvent(\n new CustomEvent('grouping-change', {\n detail: {\n clusters: clusters.map((cluster) => [...cluster]),\n front: [...frontTargets],\n behind: [...behindTargets],\n pregrouped: [...preGrouped],\n },\n bubbles: true,\n composed: true,\n })\n );\n }\n\n private toggleGroupLayerHook(group: HTMLElement, hasTargets: boolean) {\n if (hasTargets) {\n group.setAttribute(ObcPoiLayer.GROUP_LAYER_HOOK_ATTR, '');\n } else {\n group.removeAttribute(ObcPoiLayer.GROUP_LAYER_HOOK_ATTR);\n }\n }\n\n private updateGrouping() {\n if (this.isGrouping) return;\n this.isGrouping = true;\n try {\n const manualGroups = (\n Array.from(\n this.querySelectorAll('obc-poi-group')\n ) as PoiButtonGroupElement[]\n ).filter((group) => !group.hasAttribute('data-auto-group'));\n const manualGroupedTargets = new Set<HTMLElement>();\n manualGroups.forEach((group) => {\n const groupTargets = this.getGroupTargets(group);\n this.toggleGroupLayerHook(group, groupTargets.length > 0);\n groupTargets.forEach((target) => manualGroupedTargets.add(target));\n });\n if (manualGroups.length > 0) {\n const anyExpanded = manualGroups.some(\n (group) => group.expand === true || group.collapsing === true\n );\n if (anyExpanded) {\n return;\n }\n }\n\n const targets = this.getAllTargets().filter(\n (target) =>\n !manualGroupedTargets.has(target) &&\n !target.hasAttribute('data-stack-returning')\n );\n\n const layerRect = this.getBoundingClientRect();\n const enterRaw = getComputedStyle(this).getPropertyValue(\n '--obc-poi-layer-overlap-enter'\n );\n const exitRaw = getComputedStyle(this).getPropertyValue(\n '--obc-poi-layer-overlap-exit'\n );\n const preRaw = getComputedStyle(this).getPropertyValue(\n '--obc-poi-layer-overlap-pre'\n );\n const behindRaw = getComputedStyle(this).getPropertyValue(\n '--obc-poi-layer-overlap-behind'\n );\n const parseThreshold = (raw: string, fallback: number): number => {\n const value = Number.parseFloat(raw);\n return Number.isFinite(value) ? value : fallback;\n };\n const enterThreshold = parseThreshold(enterRaw, 10);\n const exitThreshold = Math.max(\n parseThreshold(exitRaw, enterThreshold + 8),\n enterThreshold\n );\n const preThreshold = parseThreshold(preRaw, Math.max(enterThreshold, 16));\n const behindThreshold = parseThreshold(behindRaw, enterThreshold);\n\n const currentGroupByTarget = new Map<Poi, HTMLElement>();\n targets.forEach((target) => {\n const group = this.getAutoGroupOf(target);\n if (group) {\n currentGroupByTarget.set(target, group);\n }\n });\n\n const rects = new Map<Poi, DOMRect>();\n targets.forEach((target) => {\n rects.set(target, this.getTargetRectForGrouping(target, layerRect));\n });\n\n const thresholds: GroupingThresholds = {\n enterThreshold,\n exitThreshold,\n preThreshold,\n behindThreshold,\n };\n\n const {adjacency, behindAdjacency, preGrouped} = buildAdjacencyMaps(\n targets,\n rects,\n thresholds,\n currentGroupByTarget\n );\n\n const clusters = buildClusters(targets, adjacency);\n const behindClusters = buildClusters(targets, behindAdjacency);\n\n // Exiting groups are condemned: their members are already released and\n // a removal timer is running. Excluding them here keeps a new grouping\n // pass from re-disbanding them, which would reset the removal timer on\n // every pass and leak group chrome forever under continuous churn.\n const existingGroups = this.getAutoGroups().filter(\n (group) => !group.hasAttribute('data-exiting')\n );\n\n const frontTargets = new Set<Poi>();\n clusters.forEach((cluster) => {\n const front = this.getFrontTarget(cluster, rects);\n if (front) frontTargets.add(front);\n });\n\n const behindTargets = new Set<Poi>();\n behindClusters.forEach((cluster) => {\n const behind = this.getShortestTarget(cluster, rects);\n if (behind) behindTargets.add(behind);\n });\n\n const expandedAutoGroup = existingGroups.find(\n (group) => group.expand === true || group.collapsing === true\n );\n if (expandedAutoGroup) {\n const joined = this.joinWhileExpanded\n ? this.tryJoinExpandedGroup(\n expandedAutoGroup,\n targets,\n rects,\n enterThreshold\n )\n : null;\n if (joined) {\n // The geometric clusters predate the join; report the live groups.\n const liveClusters = existingGroups.map((group) =>\n this.getGroupMembers(group)\n );\n const liveFront = new Set<Poi>();\n liveClusters.forEach((cluster) => {\n const front = this.getFrontTarget(cluster, rects);\n if (front) liveFront.add(front);\n });\n behindTargets.delete(joined);\n preGrouped.delete(joined);\n this.notifyGroupingChange(\n liveClusters,\n liveFront,\n behindTargets,\n preGrouped\n );\n }\n return;\n }\n\n const remainingClusters = [...clusters];\n const keptGroups: HTMLElement[] = [];\n\n existingGroups.forEach((group) => {\n const children = this.getGroupMembers(group);\n const matchIndex = remainingClusters.findIndex(\n (cluster) =>\n cluster.length === children.length &&\n cluster.every((target) => children.includes(target))\n );\n if (matchIndex >= 0) {\n keptGroups.push(group);\n group.removeAttribute('data-exiting');\n group.setAttribute('data-visible', 'true');\n remainingClusters.splice(matchIndex, 1);\n } else {\n const front = this.getFrontTarget(children, rects);\n children.forEach((child) => {\n if (front && child === front) {\n child.setAttribute('data-front', 'true');\n child.setAttribute('data-front-exit', 'true');\n } else {\n child.removeAttribute('data-front');\n }\n });\n children.forEach((child) => {\n if (!front || child !== front) {\n child.setAttribute('data-exiting', 'true');\n this.startExitLock(child);\n } else {\n child.removeAttribute('data-exiting');\n child.removeAttribute('data-exit-lock');\n }\n child.removeAttribute('data-grouped');\n this.resetTarget(child);\n });\n group.removeAttribute('data-visible');\n group.setAttribute('data-exiting', 'true');\n // Release members back to the main slot — their DOM position never\n // changed, only the slot assignment does.\n this.getAutoGroupMemberSlot(group)?.assign();\n this.syncSlotAssignments();\n children.forEach((child) => {\n if (!front || child !== front) {\n child.getBoundingClientRect();\n }\n });\n const exitDelay = getCssVarAsNumber(this, EXIT_DELAY_MS_VAR, 140);\n window.setTimeout(() => {\n children.forEach((child) => {\n if (!front || child !== front) {\n child.removeAttribute('data-exiting');\n }\n });\n }, exitDelay);\n requestAnimationFrame(() => {\n this.scheduleGroupRemoval(group);\n });\n }\n });\n\n remainingClusters.forEach((cluster) => {\n const group = document.createElement('obc-poi-group');\n group.setAttribute('data-auto-group', 'true');\n group.setAttribute('data-position-mode', 'bottom');\n group.setAttribute('data-visible', 'true');\n (group as PoiButtonGroupElement).internalSwapping =\n !!this.internalSwapping;\n group.setAttribute(\n 'position-vertical',\n `${this.getGroupPositionVertical(cluster, rects, layerRect, group)}px`\n );\n const memberSlot = document.createElement('slot');\n memberSlot.className = 'auto-group-members';\n group.appendChild(memberSlot);\n cluster.forEach((target) => {\n target.removeAttribute('data-grouped');\n });\n // The group lives in the layer's shadow root; members stay in the\n // consumer's light DOM and are slot-assigned into the group.\n this.wrapper?.appendChild(group);\n memberSlot.assign(...cluster);\n this.syncSlotAssignments();\n requestAnimationFrame(() => {\n cluster.forEach((target) =>\n target.setAttribute('data-grouped', 'true')\n );\n });\n keptGroups.push(group);\n });\n\n const groupedTargets = new Set<Poi>();\n keptGroups.forEach((group) => {\n this.getGroupMembers(group).forEach((child) => {\n groupedTargets.add(child);\n });\n });\n\n targets.forEach((target) => {\n if (!groupedTargets.has(target)) {\n const exitLocked = target.hasAttribute('data-exit-lock');\n target.removeAttribute('data-grouped');\n target.removeAttribute('data-joined-expanded');\n if (target.hasAttribute('data-front-exit')) {\n target.setAttribute('data-front', 'true');\n target.removeAttribute('data-pregrouped');\n } else if (frontTargets.has(target)) {\n target.setAttribute('data-front', 'true');\n target.removeAttribute('data-pregrouped');\n } else if (preGrouped.has(target) && !exitLocked) {\n target.removeAttribute('data-front');\n target.setAttribute('data-pregrouped', 'true');\n } else {\n target.removeAttribute('data-front');\n target.removeAttribute('data-pregrouped');\n }\n if (\n !exitLocked &&\n behindTargets.has(target) &&\n !frontTargets.has(target)\n ) {\n target.setAttribute('data-behind', 'true');\n } else {\n target.removeAttribute('data-behind');\n }\n if (exitLocked) {\n target.removeAttribute('data-pregrouped');\n target.removeAttribute('data-behind');\n }\n const isOverlapState = target.hasAttribute('data-behind');\n const nextValue = this.resolveTargetValue(target, isOverlapState);\n target.value = nextValue;\n if (nextValue === PoiDataValue.Overlapped) {\n this.applyStandaloneVisualState(target, true);\n } else {\n this.clearStandaloneVisualState(target);\n }\n this.resetTarget(target);\n } else {\n target.removeAttribute('data-behind');\n this.clearStandaloneVisualState(target);\n }\n });\n\n this.refreshGroupPositions(layerRect, rects);\n this.notifyGroupingChange(\n clusters,\n frontTargets,\n behindTargets,\n preGrouped\n );\n\n requestAnimationFrame(() => {\n targets.forEach((target) => target.removeAttribute('data-front-exit'));\n });\n\n this.scheduleLayerHeightUpdate();\n } finally {\n this.isGrouping = false;\n }\n }\n\n private tryJoinExpandedGroup(\n group: PoiButtonGroupElement,\n targets: Poi[],\n rects: Map<Poi, DOMRect>,\n enterThreshold: number\n ): Poi | null {\n const groupTargets = this.getGroupTargets(group);\n if (groupTargets.length === 0) return null;\n\n const groupTargetSet = new Set(groupTargets);\n const candidates = targets.filter(\n (target) =>\n !groupTargetSet.has(target) &&\n target.parentElement?.tagName.toLowerCase() !== 'obc-poi-group' &&\n this.getAutoGroupOf(target) === null\n );\n if (candidates.length === 0) return null;\n\n const useButtonRects = group.expand === true || group.collapsing === true;\n const groupCenters = groupTargets\n .map((target) =>\n useButtonRects ? this.getTargetRect(target) : rects.get(target)\n )\n .filter((rect): rect is DOMRect => !!rect)\n .map((rect) => rect.left + rect.width / 2);\n if (groupCenters.length === 0) return null;\n\n const leftMost = Math.min(...groupCenters);\n const rightMost = Math.max(...groupCenters);\n const groupCenter = (leftMost + rightMost) / 2;\n\n let bestCandidate: Poi | null = null;\n let bestGap = Number.POSITIVE_INFINITY;\n\n for (const candidate of candidates) {\n const candidateRect = useButtonRects\n ? this.getTargetRect(candidate)\n : rects.get(candidate);\n if (!candidateRect) continue;\n for (const member of groupTargets) {\n const memberRect = useButtonRects\n ? this.getTargetRect(member)\n : rects.get(member);\n if (!memberRect) continue;\n const overlapHeight =\n Math.min(candidateRect.bottom, memberRect.bottom) -\n Math.max(candidateRect.top, memberRect.top);\n if (overlapHeight <= 0) continue;\n const gap = Math.max(\n 0,\n Math.max(candidateRect.left, memberRect.left) -\n Math.min(candidateRect.right, memberRect.right)\n );\n if (gap <= enterThreshold && gap < bestGap) {\n bestGap = gap;\n bestCandidate = candidate;\n }\n }\n }\n\n if (!bestCandidate) return null;\n\n bestCandidate.setAttribute('data-joined-expanded', 'true');\n\n const candidateRect = rects.get(bestCandidate);\n const candidateCenter =\n candidateRect?.left !== undefined\n ? candidateRect.left + candidateRect.width / 2\n : 0;\n const insertBefore = candidateCenter < groupCenter;\n\n const memberSlot =\n group instanceof HTMLElement ? this.getAutoGroupMemberSlot(group) : null;\n if (memberSlot) {\n const members = memberSlot\n .assignedElements()\n .filter((el) => el !== bestCandidate);\n memberSlot.assign(\n ...(insertBefore\n ? [bestCandidate, ...members]\n : [...members, bestCandidate])\n );\n this.syncSlotAssignments();\n } else if (insertBefore) {\n group.insertBefore(bestCandidate, groupTargets[0] ?? null);\n } else {\n group.appendChild(bestCandidate);\n }\n\n bestCandidate.setAttribute('data-grouped', 'true');\n bestCandidate.removeAttribute('data-behind');\n bestCandidate.removeAttribute('data-pregrouped');\n bestCandidate.value = this.resolveTargetValue(bestCandidate, false);\n this.clearStandaloneVisualState(bestCandidate);\n\n const touchRaw = getComputedStyle(group).getPropertyValue(\n '--maneuvering-components-poi-button-touch-target'\n );\n const touchSize = Number.parseFloat(touchRaw) || 0;\n if (touchSize > 0) {\n const touchTarget = `${touchSize}px`;\n bestCandidate.style.width = touchTarget;\n bestCandidate.style.minWidth = touchTarget;\n bestCandidate.style.height = touchTarget;\n }\n\n group.refreshExpandedLayout?.(true);\n return bestCandidate;\n }\n\n private applyStandaloneVisualState(target: Poi, overlap: boolean) {\n const isEnhanced = target.buttonType === ObcPoiButtonType.Enhanced;\n const size = getVisualTargetSize(this, isEnhanced, overlap);\n applyPoiVisualState(target, overlap, size);\n }\n\n private resolveTargetValue(target: Poi, overlap: boolean): PoiDataValue {\n if (overlap) {\n return PoiDataValue.Overlapped;\n }\n\n if (target.selected) {\n return PoiDataValue.Checked;\n }\n return PoiDataValue.Unchecked;\n }\n\n private clearStandaloneVisualState(target: HTMLElement) {\n clearPoiVisualState(target);\n }\n\n private refreshGroupPositions(\n layerRect?: DOMRect,\n rects?: Map<Poi, DOMRect>\n ) {\n const groups = [\n ...(Array.from(\n this.querySelectorAll('obc-poi-group')\n ) as PoiButtonGroupElement[]),\n ...this.getAutoGroups(),\n ];\n groups.forEach((group) => {\n const children = this.getGroupMembers(group);\n this.toggleGroupLayerHook(group, children.length > 0);\n const hasPositionAttr = group.hasAttribute('position-vertical');\n if (\n !group.hasAttribute('data-auto-group') &&\n !group.hasAttribute('data-position-mode')\n ) {\n group.setAttribute('data-position-mode', 'bottom');\n }\n const shouldSetPosition =\n group.hasAttribute('data-auto-group') || !hasPositionAttr;\n if (group.hasAttribute('data-auto-group')) {\n (group as PoiButtonGroupElement).internalSwapping =\n !!this.internalSwapping;\n }\n if (children.length > 0 && shouldSetPosition) {\n const layerBounds = layerRect ?? this.getBoundingClientRect();\n const rectMap =\n rects ??\n new Map(\n children.map((child) => [\n child,\n this.getTargetRectForGrouping(child, layerBounds),\n ])\n );\n group.setAttribute(\n 'position-vertical',\n `${this.getGroupPositionVertical(children, rectMap, layerBounds, group)}px`\n );\n }\n group.updatePosition?.();\n });\n }\n\n private getGroupPositionVertical(\n targets: Poi[],\n rects: Map<Poi, DOMRect>,\n layerRect: DOMRect,\n group?: PoiButtonGroupElement\n ) {\n let maxBottom = Number.NEGATIVE_INFINITY;\n targets.forEach((target) => {\n const rect = rects.get(target) ?? target.getBoundingClientRect();\n maxBottom = Math.max(maxBottom, rect.bottom);\n });\n const baseBottom = maxBottom - layerRect.top;\n const isAutoGroup = group?.hasAttribute('data-auto-group') ?? false;\n const offsetRaw = getComputedStyle(this).getPropertyValue(\n '--obc-poi-layer-auto-group-offset-y'\n );\n let offset = Number.parseFloat(offsetRaw) || 0;\n if (isAutoGroup && this.closest('obc-poi-layer-stack')) {\n offset = 0;\n }\n return Math.round(baseBottom + offset);\n }\n\n private resetTarget(target: Poi) {\n if (typeof target.targetOffsetX === 'number') {\n target.setRuntimeHorizontalOffsets?.(target.buttonOffsetX, 0);\n if (!target.setRuntimeHorizontalOffsets) {\n target.targetOffsetX = 0;\n }\n }\n this.animateButtonOffsetXToZero(target);\n target.style.removeProperty('--obc-poi-target-offset-x');\n target.style.removeProperty('position');\n target.style.removeProperty('width');\n target.style.removeProperty('min-width');\n target.style.removeProperty('height');\n target.style.removeProperty('transform');\n target.style.removeProperty('--obc-poi-group-overlap-height');\n target.style.removeProperty('--obc-poi-group-overlap-shift');\n }\n\n private buttonOffsetXResetRaf = new Map<Poi, number>();\n\n private animateButtonOffsetXToZero(target: Poi) {\n const start = target.buttonOffsetX;\n if (!Number.isFinite(start) || Math.abs(start) < 0.5) {\n target.setRuntimeHorizontalOffsets?.(0, target.targetOffsetX);\n if (!target.setRuntimeHorizontalOffsets) {\n target.buttonOffsetX = 0;\n }\n return;\n }\n\n const existing = this.buttonOffsetXResetRaf.get(target);\n if (existing) {\n cancelAnimationFrame(existing);\n }\n\n const duration = 100;\n const startTime = performance.now();\n const step = (now: number) => {\n try {\n if (!target.isConnected) {\n this.buttonOffsetXResetRaf.delete(target);\n return;\n }\n const t = Math.min((now - startTime) / duration, 1);\n const eased = easeInOutQuad(t);\n const nextButtonOffsetX = start + (0 - start) * eased;\n target.setRuntimeHorizontalOffsets?.(\n nextButtonOffsetX,\n target.targetOffsetX\n );\n if (!target.setRuntimeHorizontalOffsets) {\n target.buttonOffsetX = nextButtonOffsetX;\n }\n if (t < 1) {\n this.buttonOffsetXResetRaf.set(target, requestAnimationFrame(step));\n } else {\n this.buttonOffsetXResetRaf.delete(target);\n }\n } catch (error) {\n console.error('[poi-layer] Error in button offset reset:', error);\n this.buttonOffsetXResetRaf.delete(target);\n }\n };\n\n this.buttonOffsetXResetRaf.set(target, requestAnimationFrame(step));\n }\n\n private scheduleGroupRemoval(group: HTMLElement) {\n const existing = this.groupRemovalTimers.get(group);\n if (existing) {\n window.clearTimeout(existing);\n }\n group.setAttribute('data-exiting', 'true');\n const removalDelay = getCssVarAsNumber(\n this,\n GROUP_REMOVAL_DELAY_MS_VAR,\n 250\n );\n const timeoutId = window.setTimeout(() => {\n group.remove();\n this.groupRemovalTimers.delete(group);\n }, removalDelay);\n this.groupRemovalTimers.set(group, timeoutId);\n }\n\n private startExitLock(target: HTMLElement) {\n target.setAttribute('data-exit-lock', 'true');\n const existing = this.exitLockTimers.get(target);\n if (existing) window.clearTimeout(existing);\n const lockDuration = getCssVarAsNumber(\n this,\n EXIT_LOCK_DURATION_MS_VAR,\n 500\n );\n const timeoutId = window.setTimeout(() => {\n target.removeAttribute('data-exit-lock');\n this.exitLockTimers.delete(target);\n }, lockDuration);\n this.exitLockTimers.set(target, timeoutId);\n }\n\n private getFrontTarget(targets: Poi[], rects?: Map<Poi, DOMRect>) {\n if (targets.length === 0) return null;\n let front = targets[0];\n let maxHeight = this.getTargetHeight(front, rects);\n targets.forEach((target) => {\n const height = this.getTargetHeight(target, rects);\n if (height > maxHeight) {\n maxHeight = height;\n front = target;\n }\n });\n return front;\n }\n\n private getTargetRect(target: HTMLElement): DOMRect {\n if (isPoi(target)) {\n return target.getVisualRect(PoiDataVisualRectPreference.Largest);\n }\n return target.getBoundingClientRect();\n }\n\n private getTargetRectForGrouping(\n target: HTMLElement,\n layerRect: DOMRect\n ): DOMRect {\n const rect = this.getTargetRect(target);\n const leftValue = getEffectivePoiX(target);\n if (!Number.isFinite(leftValue)) return rect;\n const width = rect.width || 0;\n const height = rect.height || 0;\n const left = layerRect.left + leftValue - width / 2;\n const top = layerRect.bottom - height;\n return new DOMRect(left, top, width, height);\n }\n\n private getTargetHeight(target: Poi, rects?: Map<Poi, DOMRect>): number {\n const targetY = Number.isFinite(target.y ?? NaN) ? (target.y ?? 0) : null;\n const yAttr = target.getAttribute('y');\n const yValue = Number.parseFloat(yAttr ?? '');\n const attrTargetY = !Number.isNaN(yValue) ? yValue : null;\n const buttonY =\n typeof target.buttonY === 'number' && Number.isFinite(target.buttonY)\n ? target.buttonY\n : null;\n const buttonYAttr = target.getAttribute('button-y');\n const buttonYValue = Number.parseFloat(buttonYAttr ?? '');\n const attrButtonY = !Number.isNaN(buttonYValue) ? buttonYValue : null;\n const logicalHeight = Math.max(\n targetY ?? 0,\n attrTargetY ?? 0,\n buttonY ?? 0,\n attrButtonY ?? 0\n );\n if (logicalHeight > 0) {\n return logicalHeight;\n }\n const rect = rects?.get(target) ?? this.getTargetRect(target);\n return rect.height;\n }\n\n private getShortestTarget(targets: Poi[], rects?: Map<Poi, DOMRect>) {\n if (targets.length === 0) return null;\n let shortest = targets[0];\n let minHeight = this.getTargetHeight(shortest, rects);\n targets.forEach((target) => {\n const height = this.getTargetHeight(target, rects);\n if (height < minHeight) {\n minHeight = height;\n shortest = target;\n }\n });\n return shortest;\n }\n\n private getAllTargets(): Poi[] {\n return Array.from(this.querySelectorAll(`[${POI_ATTR}]`)).filter(\n (node): node is Poi =>\n isPoi(node) && !node.hasAttribute('data-stack-selected')\n );\n }\n\n private getGroupTargets(group: ParentNode): Poi[] {\n return this.getGroupMembers(group);\n }\n\n override render() {\n return html`\n <div class=\"wrapper${this.debug ? ' debug' : ''}\">\n ${\n this.debug\n ? html`<span class=\"debug-label\">${this.label || 'Layer'}</span>`\n : nothing\n }\n <slot class=\"main\"></slot>\n </div>\n `;\n }\n\n protected override updated(changedProperties: PropertyValues): void {\n if (changedProperties.has('isSelected')) {\n this.dispatchEvent(new Event('layer-selection-changed', {bubbles: true}));\n }\n this.syncSlotAssignments();\n }\n\n static override styles = unsafeCSS(componentStyle);\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'obc-poi-layer': ObcPoiLayer;\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { LitElement } from 'lit';
|
|
2
|
+
import { Poi } from '../poi/poi.js';
|
|
2
3
|
import '../poi-layer/poi-layer.js';
|
|
3
4
|
import '../poi-group/poi-group.js';
|
|
4
5
|
import '../poi/poi-data.js';
|
|
@@ -15,6 +16,36 @@ export declare enum PoiLayerSelectionMode {
|
|
|
15
16
|
* Use `selection-mode` to control whether targets can be selected across the
|
|
16
17
|
* stack (`none`, `single`, or `multi`).
|
|
17
18
|
*
|
|
19
|
+
* ### Required Setup
|
|
20
|
+
* 1. Place the stack in `obc-poi-controller`'s `slot="stack"`, or manage the
|
|
21
|
+
* stack's height and media geometry yourself.
|
|
22
|
+
* 2. Give exactly one child `obc-poi-layer` the `is-selected` attribute — the
|
|
23
|
+
* stack projects selected targets' buttons into it and resets all
|
|
24
|
+
* selection state if no selected layer exists.
|
|
25
|
+
* 3. Mark the background/default layer with
|
|
26
|
+
* `data-controller-layer="background"` when the stack is used inside
|
|
27
|
+
* `obc-poi-controller`.
|
|
28
|
+
* 4. Set `--obc-poi-layer-min-height` on layers that can start empty, so they
|
|
29
|
+
* do not collapse to 0px height.
|
|
30
|
+
*
|
|
31
|
+
* ### DOM Ownership
|
|
32
|
+
* The stack never moves, creates, or removes consumer-owned DOM. Selection is
|
|
33
|
+
* rendered by projecting the target's button into the selected layer via CSS
|
|
34
|
+
* custom properties (`--obc-poi-button-projection-y` /
|
|
35
|
+
* `--obc-poi-target-projection-y`); the target element stays where the
|
|
36
|
+
* consumer put it. Declarative renderers (React, Vue, Lit) can manage POI
|
|
37
|
+
* children as ordinary framework-owned elements.
|
|
38
|
+
*
|
|
39
|
+
* ### Selection API
|
|
40
|
+
* Selection state is fully reachable without DOM inspection:
|
|
41
|
+
* - `selectedTargets` — the currently selected POI targets.
|
|
42
|
+
* - `selectTarget(target, {selectionId?})` — select programmatically;
|
|
43
|
+
* `selectionId` presets the stack-managed badge id.
|
|
44
|
+
* - `deselectTarget(target)` / `clearSelection()` — deselect one/all.
|
|
45
|
+
* - `selection-change` event — fired on every selection mutation
|
|
46
|
+
* (user click, programmatic call, or bootstrap seeding) with
|
|
47
|
+
* `{selected, added, removed}` in `detail`.
|
|
48
|
+
*
|
|
18
49
|
* ### Slots
|
|
19
50
|
* - Default slot for `obc-poi-layer` elements that participate in the stack.
|
|
20
51
|
*
|
|
@@ -27,6 +58,7 @@ export declare enum PoiLayerSelectionMode {
|
|
|
27
58
|
* ```
|
|
28
59
|
*
|
|
29
60
|
* @slot - Layers participating in the stack.
|
|
61
|
+
* @fires {CustomEvent<{selected: Poi[]; added: Poi | null; removed: Poi | null}>} selection-change - Fired whenever the selection set changes (user click, programmatic call, or bootstrap seeding). Bubbles and is composed.
|
|
30
62
|
* @experimental
|
|
31
63
|
*/
|
|
32
64
|
export declare class ObcPoiLayerStack extends LitElement {
|
|
@@ -38,6 +70,13 @@ export declare class ObcPoiLayerStack extends LitElement {
|
|
|
38
70
|
private handleTargetLayoutChange;
|
|
39
71
|
private handleLayerSelectionChanged;
|
|
40
72
|
private selectionMap;
|
|
73
|
+
/**
|
|
74
|
+
* Deselected targets that live in one layer but render in another (targets
|
|
75
|
+
* authored inside the selected layer whose logical origin is a different
|
|
76
|
+
* layer). Their projections are refreshed on every placement pass so layer
|
|
77
|
+
* resizes do not leave stale pixel offsets.
|
|
78
|
+
*/
|
|
79
|
+
private displacedTargets;
|
|
41
80
|
private selectionCounter;
|
|
42
81
|
private placementRaf;
|
|
43
82
|
private mutationObserver?;
|
|
@@ -45,6 +84,27 @@ export declare class ObcPoiLayerStack extends LitElement {
|
|
|
45
84
|
firstUpdated(): void;
|
|
46
85
|
disconnectedCallback(): void;
|
|
47
86
|
private onStackClick;
|
|
87
|
+
/** Currently selected POI targets. */
|
|
88
|
+
get selectedTargets(): Poi[];
|
|
89
|
+
/**
|
|
90
|
+
* Programmatically select a target, following the same flow as a user
|
|
91
|
+
* click. `options.selectionId` presets the badge id shown in the
|
|
92
|
+
* stack-managed header; without it the id auto-increments. Returns
|
|
93
|
+
* `false` when selection is disabled, the target is mid-transition or
|
|
94
|
+
* already selected, or no layer can host the selection.
|
|
95
|
+
*/
|
|
96
|
+
selectTarget(target: Poi, options?: {
|
|
97
|
+
selectionId?: string;
|
|
98
|
+
}): boolean;
|
|
99
|
+
/**
|
|
100
|
+
* Programmatically deselect a target. Returns `false` when it is not
|
|
101
|
+
* selected.
|
|
102
|
+
*/
|
|
103
|
+
deselectTarget(target: Poi): boolean;
|
|
104
|
+
/** Deselect all targets. */
|
|
105
|
+
clearSelection(): void;
|
|
106
|
+
private performSelection;
|
|
107
|
+
private dispatchSelectionChange;
|
|
48
108
|
private getPoiTargetFromEvent;
|
|
49
109
|
private getTargetLayer;
|
|
50
110
|
private getLayerTargets;
|
|
@@ -61,9 +121,22 @@ export declare class ObcPoiLayerStack extends LitElement {
|
|
|
61
121
|
private waitForPoiRender;
|
|
62
122
|
private requestPoiRender;
|
|
63
123
|
private refreshTargetProjectionLayout;
|
|
64
|
-
private
|
|
65
|
-
|
|
66
|
-
private
|
|
124
|
+
private getInlineVarPx;
|
|
125
|
+
/** Pixel delta between two layers' bottom edges (`to.bottom - from.bottom`). */
|
|
126
|
+
private layerBottomDelta;
|
|
127
|
+
private setProjectionVar;
|
|
128
|
+
/**
|
|
129
|
+
* Render the target at the given projection offsets without touching its
|
|
130
|
+
* DOM position. When `animate` is set and an offset actually changes, the
|
|
131
|
+
* jump is FLIP-animated via the Web Animations API.
|
|
132
|
+
*/
|
|
133
|
+
private applyTargetProjection;
|
|
134
|
+
/**
|
|
135
|
+
* The group a target currently belongs to — a light-DOM parent for
|
|
136
|
+
* consumer-managed groups, or the shadow group whose member slot the
|
|
137
|
+
* target is assigned to for layer-created auto groups.
|
|
138
|
+
*/
|
|
139
|
+
private getContainingGroup;
|
|
67
140
|
private detachTargetFromCurrentGroup;
|
|
68
141
|
private applySelectedTargetProjectionState;
|
|
69
142
|
private clearTargetProjectionStyles;
|
|
@@ -77,12 +150,8 @@ export declare class ObcPoiLayerStack extends LitElement {
|
|
|
77
150
|
* After cancel(), Lit's final-state styles take over.
|
|
78
151
|
*/
|
|
79
152
|
private animateLayerJump;
|
|
80
|
-
private moveTargetIntoSelectedLayer;
|
|
81
|
-
private moveTrackedTargetToSelectedLayer;
|
|
82
|
-
private syncTargetProjection;
|
|
83
153
|
private animateTargetReturnToOrigin;
|
|
84
154
|
private setSelectedTargetInteractivity;
|
|
85
|
-
private trackSelectionTarget;
|
|
86
155
|
private activateTrackedTarget;
|
|
87
156
|
private seedSelectedLayerSelections;
|
|
88
157
|
private resetSelectionForTarget;
|
|
@@ -92,6 +161,12 @@ export declare class ObcPoiLayerStack extends LitElement {
|
|
|
92
161
|
private updateLayerInactiveState;
|
|
93
162
|
private updateLayerOrders;
|
|
94
163
|
private syncSelectedLayerTargets;
|
|
164
|
+
/**
|
|
165
|
+
* Keep deselected targets that render outside their DOM layer (targets
|
|
166
|
+
* authored in the selected layer whose logical origin is another layer)
|
|
167
|
+
* projected at up-to-date offsets across layer resizes.
|
|
168
|
+
*/
|
|
169
|
+
private refreshDisplacedTargets;
|
|
95
170
|
render(): import('lit-html').TemplateResult<1>;
|
|
96
171
|
static styles: import('lit').CSSResult;
|
|
97
172
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poi-layer-stack.d.ts","sourceRoot":"","sources":["../../../src/ar/poi-layer-stack/poi-layer-stack.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,UAAU,EAAkB,MAAM,KAAK,CAAC;AAKhD,OAAO,2BAA2B,CAAC;AACnC,OAAO,2BAA2B,CAAC;AACnC,OAAO,oBAAoB,CAAC;AAC5B,OAAO,6CAA6C,CAAC;
|
|
1
|
+
{"version":3,"file":"poi-layer-stack.d.ts","sourceRoot":"","sources":["../../../src/ar/poi-layer-stack/poi-layer-stack.ts"],"names":[],"mappings":"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"}
|