@cloudscape-design/board-components 3.0.58 → 3.0.60
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/board/internal.js.map +1 -1
- package/board/transition.js.map +1 -1
- package/board/utils/announcements.js.map +1 -1
- package/board/utils/events.js.map +1 -1
- package/board/utils/get-hovered-rect.js.map +1 -1
- package/board/utils/layout.js.map +1 -1
- package/board/utils/path.js.map +1 -1
- package/internal/debug-tools/generators.js.map +1 -1
- package/internal/debug-tools/parsers.js.map +1 -1
- package/internal/dnd-controller/__mocks__/controller.d.ts +3 -1
- package/internal/dnd-controller/__mocks__/controller.js +4 -0
- package/internal/dnd-controller/__mocks__/controller.js.map +1 -1
- package/internal/dnd-controller/controller.d.ts +1 -1
- package/internal/dnd-controller/controller.js.map +1 -1
- package/internal/dnd-controller/event-emitter.js.map +1 -1
- package/internal/drag-handle/index.js.map +1 -1
- package/internal/environment.js +1 -1
- package/internal/environment.json +1 -1
- package/internal/item-container/get-collision-rect.js.map +1 -1
- package/internal/item-container/get-next-droppable.js.map +1 -1
- package/internal/item-container/index.js.map +1 -1
- package/internal/layout-engine/engine-solution.js.map +1 -1
- package/internal/layout-engine/engine-step.js.map +1 -1
- package/internal/layout-engine/utils.js.map +1 -1
- package/internal/manifest.json +1 -1
- package/internal/utils/layout.js.map +1 -1
- package/internal/utils/rects.js.map +1 -1
- package/internal/utils/use-auto-scroll.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../../src/internal/dnd-controller/controller.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { useStableCallback } from \"@cloudscape-design/component-toolkit/internal\";\nimport { ReactNode, useEffect } from \"react\";\nimport { BoardItemDefinitionBase, ItemId, Rect } from \"../interfaces\";\nimport { Coordinates } from \"../utils/coordinates\";\nimport { EventEmitter } from \"./event-emitter\";\nimport { getHoveredDroppables } from \"./get-hovered-droppables\";\n\ntype Item = BoardItemDefinitionBase<unknown>;\n\nexport type Operation = \"reorder\" | \"resize\" | \"insert\";\n\nexport type InteractionType = \"pointer\" | \"keyboard\";\n\n/**\n * Represents the relations between droppables and draggables.\n *\n * The `scale` function transforms draggable's width/height in relative units\n * to the absolute width/height in pixels the droppable expects.\n */\nexport interface DropTargetContext {\n scale: (item: Item, size?: { width: number; height: number }) => { width: number; height: number };\n}\n\nexport interface DragAndDropData {\n operation: Operation;\n interactionType: InteractionType;\n draggableItem: Item;\n collisionRect: Rect;\n positionOffset: Coordinates;\n coordinates: Coordinates;\n collisionIds: ItemId[];\n dropTarget: null | DropTargetContext;\n}\n\nexport interface Droppable {\n element: HTMLElement;\n context: DropTargetContext;\n}\n\ninterface AcquireData {\n droppableId: ItemId;\n draggableItem: Item;\n renderAcquiredItem: () => ReactNode;\n}\n\nexport interface DragAndDropEvents {\n start: (data: DragAndDropData) => void;\n update: (data: DragAndDropData) => void;\n submit: () => void;\n discard: () => void;\n acquire: (data: AcquireData) => void;\n}\n\ninterface Transition {\n operation: Operation;\n interactionType: InteractionType;\n draggableItem: Item;\n getCollisionRect: (operation: Operation, coordinates: Coordinates, dropTarget: null | DropTargetContext) => Rect;\n startCoordinates: Coordinates;\n}\n\nclass DragAndDropController extends EventEmitter<DragAndDropEvents> {\n private droppables = new Map<ItemId, Droppable>();\n private transition: null | Transition = null;\n\n /**\n * Inits a drag transition and issues a \"start\" event.\n *\n * The method overrides the previous transition if exists (w/o a cancellation event)!\n */\n public start(transition: Transition) {\n this.transition = { ...transition };\n this.emit(\"start\", this.getDragAndDropData(transition.startCoordinates));\n }\n\n /**\n * Updates current transition with given coordinates and issues an \"update\" event.\n */\n public update(coordinates: Coordinates) {\n this.emit(\"update\", this.getDragAndDropData(coordinates));\n }\n\n /**\n * Removes transition and issues a \"submit\" event.\n */\n public submit() {\n this.emit(\"submit\");\n this.transition = null;\n }\n\n /**\n * Removes transition and issues a \"discard\" event.\n */\n public discard() {\n this.emit(\"discard\");\n this.transition = null;\n }\n\n /**\n * Issues an \"acquire\" event to notify the current transition draggable is acquired by the given droppable.\n */\n public acquire(droppableId: ItemId, renderAcquiredItem: () => ReactNode) {\n if (!this.transition) {\n throw new Error(\"Invariant violation: no transition present for acquire.\");\n }\n this.emit(\"acquire\", { droppableId, draggableItem: this.transition.draggableItem, renderAcquiredItem });\n }\n\n /**\n * Registers a droppable used for collisions check, acquire, and dropTarget provision.\n */\n public addDroppable(id: ItemId, context: DropTargetContext, element: HTMLElement) {\n this.droppables.set(id, { element, context });\n }\n\n /**\n * Un-registers the droppable - use it when component unmounts.\n */\n public removeDroppable(id: ItemId) {\n this.droppables.delete(id);\n }\n\n /**\n * Retrieves all registered droppables to run a manual match against.\n */\n public getDroppables() {\n return [...this.droppables.entries()];\n }\n\n private getDragAndDropData(coordinates: Coordinates): DragAndDropData {\n if (!this.transition) {\n throw new Error(\"Invariant violation: no transition present for interaction.\");\n }\n const positionOffset = Coordinates.cursorOffset(coordinates, this.transition.startCoordinates);\n const collisionRect = this.getCollisionRect(this.transition, coordinates);\n const { collisionIds, dropTarget } = this.getCollisions(collisionRect);\n return { ...this.transition, positionOffset, coordinates, collisionRect, collisionIds, dropTarget };\n }\n\n private getCollisionRect(transition: Transition, coordinates: Coordinates) {\n const originalCollisionRect = transition.getCollisionRect(transition.operation, coordinates, null);\n const { dropTarget } = this.getCollisions(originalCollisionRect);\n return transition.getCollisionRect(transition.operation, coordinates, dropTarget);\n }\n\n private getCollisions(collisionRect: Rect) {\n const droppableEntries = [...this.droppables.entries()];\n const droppableElements: [ItemId, HTMLElement][] = droppableEntries.map(([id, entry]) => [id, entry.element]);\n const collisionIds = getHoveredDroppables(collisionRect, droppableElements);\n if (collisionIds.length === 0) {\n return { collisionIds, dropTarget: null };\n }\n\n const matchedDroppable = droppableEntries.find(([id]) => id === collisionIds[0]);\n if (!matchedDroppable) {\n throw new Error(\"Invariant violation: no droppable matches collision.\");\n }\n return { collisionIds, dropTarget: matchedDroppable[1].context };\n }\n}\n\n// Controller is a singleton and is shared between all d&d elements.\nconst controller = new DragAndDropController();\n\nexport function useDragSubscription<K extends keyof DragAndDropEvents>(event: K, handler: DragAndDropEvents[K]) {\n const stableHandler = useStableCallback(handler);\n useEffect(() => controller.on(event, stableHandler), [event, stableHandler]);\n}\n\nexport function useDraggable({\n draggableItem,\n getCollisionRect,\n}: {\n draggableItem: Item;\n getCollisionRect: (operation: Operation, coordinates: Coordinates, dropTarget: null | DropTargetContext) => Rect;\n}) {\n return {\n start(operation: Operation, interactionType: InteractionType, startCoordinates: Coordinates) {\n controller.start({ operation, interactionType, draggableItem, getCollisionRect, startCoordinates });\n },\n updateTransition(coordinates: Coordinates) {\n controller.update(coordinates);\n },\n submitTransition() {\n controller.submit();\n },\n discardTransition() {\n controller.discard();\n },\n acquire(droppableId: ItemId, renderAcquiredItem: () => ReactNode) {\n controller.acquire(droppableId, renderAcquiredItem);\n },\n getDroppables() {\n return controller.getDroppables();\n },\n };\n}\n\nexport function useDroppable({\n itemId,\n context,\n getElement,\n}: {\n itemId: ItemId;\n context: DropTargetContext;\n getElement: () => HTMLElement;\n}) {\n useEffect(() => {\n controller.addDroppable(itemId, context, getElement());\n return () => controller.removeDroppable(itemId);\n }, [itemId, context, getElement]);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"controller.js","sourceRoot":"","sources":["../../../../src/internal/dnd-controller/controller.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { useStableCallback } from \"@cloudscape-design/component-toolkit/internal\";\nimport { ReactNode, useEffect } from \"react\";\nimport { BoardItemDefinitionBase, ItemId, Rect } from \"../interfaces\";\nimport { Coordinates } from \"../utils/coordinates\";\nimport { EventEmitter } from \"./event-emitter\";\nimport { getHoveredDroppables } from \"./get-hovered-droppables\";\n\ntype Item = BoardItemDefinitionBase<unknown>;\n\nexport type Operation = \"reorder\" | \"resize\" | \"insert\";\n\nexport type InteractionType = \"pointer\" | \"keyboard\";\n\n/**\n * Represents the relations between droppables and draggables.\n *\n * The `scale` function transforms draggable's width/height in relative units\n * to the absolute width/height in pixels the droppable expects.\n */\nexport interface DropTargetContext {\n scale: (item: Item, size?: { width: number; height: number }) => { width: number; height: number };\n}\n\nexport interface DragAndDropData {\n operation: Operation;\n interactionType: InteractionType;\n draggableItem: Item;\n collisionRect: Rect;\n positionOffset: Coordinates;\n coordinates: Coordinates;\n collisionIds: ItemId[];\n dropTarget: null | DropTargetContext;\n}\n\nexport interface Droppable {\n element: HTMLElement;\n context: DropTargetContext;\n}\n\nexport interface AcquireData {\n droppableId: ItemId;\n draggableItem: Item;\n renderAcquiredItem: () => ReactNode;\n}\n\nexport interface DragAndDropEvents {\n start: (data: DragAndDropData) => void;\n update: (data: DragAndDropData) => void;\n submit: () => void;\n discard: () => void;\n acquire: (data: AcquireData) => void;\n}\n\ninterface Transition {\n operation: Operation;\n interactionType: InteractionType;\n draggableItem: Item;\n getCollisionRect: (operation: Operation, coordinates: Coordinates, dropTarget: null | DropTargetContext) => Rect;\n startCoordinates: Coordinates;\n}\n\nclass DragAndDropController extends EventEmitter<DragAndDropEvents> {\n private droppables = new Map<ItemId, Droppable>();\n private transition: null | Transition = null;\n\n /**\n * Inits a drag transition and issues a \"start\" event.\n *\n * The method overrides the previous transition if exists (w/o a cancellation event)!\n */\n public start(transition: Transition) {\n this.transition = { ...transition };\n this.emit(\"start\", this.getDragAndDropData(transition.startCoordinates));\n }\n\n /**\n * Updates current transition with given coordinates and issues an \"update\" event.\n */\n public update(coordinates: Coordinates) {\n this.emit(\"update\", this.getDragAndDropData(coordinates));\n }\n\n /**\n * Removes transition and issues a \"submit\" event.\n */\n public submit() {\n this.emit(\"submit\");\n this.transition = null;\n }\n\n /**\n * Removes transition and issues a \"discard\" event.\n */\n public discard() {\n this.emit(\"discard\");\n this.transition = null;\n }\n\n /**\n * Issues an \"acquire\" event to notify the current transition draggable is acquired by the given droppable.\n */\n public acquire(droppableId: ItemId, renderAcquiredItem: () => ReactNode) {\n if (!this.transition) {\n throw new Error(\"Invariant violation: no transition present for acquire.\");\n }\n this.emit(\"acquire\", { droppableId, draggableItem: this.transition.draggableItem, renderAcquiredItem });\n }\n\n /**\n * Registers a droppable used for collisions check, acquire, and dropTarget provision.\n */\n public addDroppable(id: ItemId, context: DropTargetContext, element: HTMLElement) {\n this.droppables.set(id, { element, context });\n }\n\n /**\n * Un-registers the droppable - use it when component unmounts.\n */\n public removeDroppable(id: ItemId) {\n this.droppables.delete(id);\n }\n\n /**\n * Retrieves all registered droppables to run a manual match against.\n */\n public getDroppables() {\n return [...this.droppables.entries()];\n }\n\n private getDragAndDropData(coordinates: Coordinates): DragAndDropData {\n if (!this.transition) {\n throw new Error(\"Invariant violation: no transition present for interaction.\");\n }\n const positionOffset = Coordinates.cursorOffset(coordinates, this.transition.startCoordinates);\n const collisionRect = this.getCollisionRect(this.transition, coordinates);\n const { collisionIds, dropTarget } = this.getCollisions(collisionRect);\n return { ...this.transition, positionOffset, coordinates, collisionRect, collisionIds, dropTarget };\n }\n\n private getCollisionRect(transition: Transition, coordinates: Coordinates) {\n const originalCollisionRect = transition.getCollisionRect(transition.operation, coordinates, null);\n const { dropTarget } = this.getCollisions(originalCollisionRect);\n return transition.getCollisionRect(transition.operation, coordinates, dropTarget);\n }\n\n private getCollisions(collisionRect: Rect) {\n const droppableEntries = [...this.droppables.entries()];\n const droppableElements: [ItemId, HTMLElement][] = droppableEntries.map(([id, entry]) => [id, entry.element]);\n const collisionIds = getHoveredDroppables(collisionRect, droppableElements);\n if (collisionIds.length === 0) {\n return { collisionIds, dropTarget: null };\n }\n\n const matchedDroppable = droppableEntries.find(([id]) => id === collisionIds[0]);\n if (!matchedDroppable) {\n throw new Error(\"Invariant violation: no droppable matches collision.\");\n }\n return { collisionIds, dropTarget: matchedDroppable[1].context };\n }\n}\n\n// Controller is a singleton and is shared between all d&d elements.\nconst controller = new DragAndDropController();\n\nexport function useDragSubscription<K extends keyof DragAndDropEvents>(event: K, handler: DragAndDropEvents[K]) {\n const stableHandler = useStableCallback(handler);\n useEffect(() => controller.on(event, stableHandler), [event, stableHandler]);\n}\n\nexport function useDraggable({\n draggableItem,\n getCollisionRect,\n}: {\n draggableItem: Item;\n getCollisionRect: (operation: Operation, coordinates: Coordinates, dropTarget: null | DropTargetContext) => Rect;\n}) {\n return {\n start(operation: Operation, interactionType: InteractionType, startCoordinates: Coordinates) {\n controller.start({ operation, interactionType, draggableItem, getCollisionRect, startCoordinates });\n },\n updateTransition(coordinates: Coordinates) {\n controller.update(coordinates);\n },\n submitTransition() {\n controller.submit();\n },\n discardTransition() {\n controller.discard();\n },\n acquire(droppableId: ItemId, renderAcquiredItem: () => ReactNode) {\n controller.acquire(droppableId, renderAcquiredItem);\n },\n getDroppables() {\n return controller.getDroppables();\n },\n };\n}\n\nexport function useDroppable({\n itemId,\n context,\n getElement,\n}: {\n itemId: ItemId;\n context: DropTargetContext;\n getElement: () => HTMLElement;\n}) {\n useEffect(() => {\n controller.addDroppable(itemId, context, getElement());\n return () => controller.removeDroppable(itemId);\n }, [itemId, context, getElement]);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"event-emitter.js","sourceRoot":"","sources":["../../../../src/internal/dnd-controller/event-emitter.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;AAMtC,MAAM,OAAO,YAAY;IAAzB;QACU,cAAS,GAAG,IAAI,GAAG,EAA6C,CAAC;IAqB3E,CAAC;IAnBQ,EAAE,CAA6B,KAAY,EAAE,OAAsB;QACxE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;SAC/B;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEzC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,GAAG,CAChB,KAAK,EACL,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,CAC9D,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;IAES,IAAI,CAA6B,KAAY,EAAE,GAAG,IAA+B;;QACzF,KAAK,MAAM,OAAO,IAAI,MAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAI,EAAE,EAAE;YACrD,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;SAClB;IACH,CAAC;CACF","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\ntype Listeners<L> = {\n [E in keyof L]: (...args: any[]) => any;\n};\n\nexport class EventEmitter<Events extends Listeners<Events>> {\n private listeners = new Map<keyof Events, Array<Events[keyof Events]>>();\n\n public on<Event extends keyof Events>(event: Event, handler: Events[Event]) {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, []);\n }\n this.listeners.get(event)!.push(handler);\n\n return () => {\n this.listeners.set(\n event,\n this.listeners.get(event)!.filter((item) => item !== handler)
|
|
1
|
+
{"version":3,"file":"event-emitter.js","sourceRoot":"","sources":["../../../../src/internal/dnd-controller/event-emitter.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;AAMtC,MAAM,OAAO,YAAY;IAAzB;QACU,cAAS,GAAG,IAAI,GAAG,EAA6C,CAAC;IAqB3E,CAAC;IAnBQ,EAAE,CAA6B,KAAY,EAAE,OAAsB;QACxE,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YAC9B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;SAC/B;QACD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAEzC,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,SAAS,CAAC,GAAG,CAChB,KAAK,EACL,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,OAAO,CAAC,CAC9D,CAAC;QACJ,CAAC,CAAC;IACJ,CAAC;IAES,IAAI,CAA6B,KAAY,EAAE,GAAG,IAA+B;;QACzF,KAAK,MAAM,OAAO,IAAI,MAAA,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,KAAK,CAAC,mCAAI,EAAE,EAAE;YACrD,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC;SAClB;IACH,CAAC;CACF","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\ntype Listeners<L> = {\n [E in keyof L]: (...args: any[]) => any;\n};\n\nexport class EventEmitter<Events extends Listeners<Events>> {\n private listeners = new Map<keyof Events, Array<Events[keyof Events]>>();\n\n public on<Event extends keyof Events>(event: Event, handler: Events[Event]) {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, []);\n }\n this.listeners.get(event)!.push(handler);\n\n return () => {\n this.listeners.set(\n event,\n this.listeners.get(event)!.filter((item) => item !== handler),\n );\n };\n }\n\n protected emit<Event extends keyof Events>(event: Event, ...data: Parameters<Events[Event]>) {\n for (const handler of this.listeners.get(event) ?? []) {\n handler(...data);\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/internal/drag-handle/index.tsx"],"names":[],"mappings":";AAAA,qEAAqE;AACrE,sCAAsC;AACtC,OAAO,IAAI,MAAM,oCAAoC,CAAC;AACtD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAA6C,UAAU,EAAE,MAAM,OAAO,CAAC;AAE9E,OAAO,MAAM,MAAM,WAAW,CAAC;AAC/B,OAAO,MAAM,MAAM,iBAAiB,CAAC;AAUrC,SAAS,UAAU,CACjB,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAmB,EACxF,GAAoC;IAEpC,OAAO,CACL,KAAC,MAAM,IACL,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,qBACxC,cAAc,sBACb,eAAe,EACjC,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,YAEpB,KAAC,IAAI,IAAC,IAAI,EAAC,gBAAgB,GAAG,GACvB,CACV,CAAC;AACJ,CAAC;AAED,eAAe,UAAU,CAAC,UAAU,CAAC,CAAC","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport Icon from \"@cloudscape-design/components/icon\";\nimport clsx from \"clsx\";\nimport { ForwardedRef, KeyboardEvent, PointerEvent, forwardRef } from \"react\";\n\nimport Handle from \"../handle\";\nimport styles from \"./styles.css.js\";\n\nexport interface DragHandleProps {\n ariaLabelledBy: string;\n ariaDescribedBy: string;\n onPointerDown: (event: PointerEvent) => void;\n onKeyDown: (event: KeyboardEvent) => void;\n isActive: boolean;\n}\n\nfunction DragHandle(\n { ariaLabelledBy, ariaDescribedBy, onPointerDown, onKeyDown, isActive }: DragHandleProps,\n ref: ForwardedRef<HTMLButtonElement
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/internal/drag-handle/index.tsx"],"names":[],"mappings":";AAAA,qEAAqE;AACrE,sCAAsC;AACtC,OAAO,IAAI,MAAM,oCAAoC,CAAC;AACtD,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAA6C,UAAU,EAAE,MAAM,OAAO,CAAC;AAE9E,OAAO,MAAM,MAAM,WAAW,CAAC;AAC/B,OAAO,MAAM,MAAM,iBAAiB,CAAC;AAUrC,SAAS,UAAU,CACjB,EAAE,cAAc,EAAE,eAAe,EAAE,aAAa,EAAE,SAAS,EAAE,QAAQ,EAAmB,EACxF,GAAoC;IAEpC,OAAO,CACL,KAAC,MAAM,IACL,GAAG,EAAE,GAAG,EACR,SAAS,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,IAAI,MAAM,CAAC,MAAM,CAAC,qBACxC,cAAc,sBACb,eAAe,EACjC,aAAa,EAAE,aAAa,EAC5B,SAAS,EAAE,SAAS,YAEpB,KAAC,IAAI,IAAC,IAAI,EAAC,gBAAgB,GAAG,GACvB,CACV,CAAC;AACJ,CAAC;AAED,eAAe,UAAU,CAAC,UAAU,CAAC,CAAC","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport Icon from \"@cloudscape-design/components/icon\";\nimport clsx from \"clsx\";\nimport { ForwardedRef, KeyboardEvent, PointerEvent, forwardRef } from \"react\";\n\nimport Handle from \"../handle\";\nimport styles from \"./styles.css.js\";\n\nexport interface DragHandleProps {\n ariaLabelledBy: string;\n ariaDescribedBy: string;\n onPointerDown: (event: PointerEvent) => void;\n onKeyDown: (event: KeyboardEvent) => void;\n isActive: boolean;\n}\n\nfunction DragHandle(\n { ariaLabelledBy, ariaDescribedBy, onPointerDown, onKeyDown, isActive }: DragHandleProps,\n ref: ForwardedRef<HTMLButtonElement>,\n) {\n return (\n <Handle\n ref={ref}\n className={clsx(styles.handle, isActive && styles.active)}\n aria-labelledby={ariaLabelledBy}\n aria-describedby={ariaDescribedBy}\n onPointerDown={onPointerDown}\n onKeyDown={onKeyDown}\n >\n <Icon name=\"drag-indicator\" />\n </Handle>\n );\n}\n\nexport default forwardRef(DragHandle);\n"]}
|
package/internal/environment.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-collision-rect.js","sourceRoot":"","sources":["../../../../src/internal/item-container/get-collision-rect.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;AAKtC,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE3D;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAAoB,EACpB,gBAA6B,EAC7B,WAAwB,EACxB,YAAsD;;IAEtD,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;IAEhF,QAAQ,SAAS,EAAE;QACjB,KAAK,SAAS;YACZ,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,GAAG,KAAK,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC;QACnH,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QAC/E,KAAK,QAAQ;YACX,OAAO;gBACL,IAAI,EAAE,WAAW,CAAC,CAAC;gBACnB,GAAG,EAAE,WAAW,CAAC,CAAC;gBAClB,KAAK,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,MAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,mCAAI,KAAK,CAAC;gBACrD,MAAM,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,MAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,MAAM,mCAAI,MAAM,CAAC;aACzD,CAAC;KACL;AACH,CAAC","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Operation } from \"../dnd-controller/controller\";\nimport { Rect } from \"../interfaces\";\nimport { Coordinates } from \"../utils/coordinates\";\nimport { getNormalizedElementRect } from \"../utils/screen\";\n\n/**\n * Produces a rect (in coordinates) to represent the draggable item.\n */\nexport function getCollisionRect(\n operation: Operation,\n draggableElement: HTMLElement,\n coordinates: Coordinates,\n sizeOverride: null | { width: number; height: number }
|
|
1
|
+
{"version":3,"file":"get-collision-rect.js","sourceRoot":"","sources":["../../../../src/internal/item-container/get-collision-rect.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;AAKtC,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE3D;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,SAAoB,EACpB,gBAA6B,EAC7B,WAAwB,EACxB,YAAsD;;IAEtD,MAAM,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;IAEhF,QAAQ,SAAS,EAAE;QACjB,KAAK,SAAS;YACZ,OAAO,EAAE,IAAI,EAAE,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,GAAG,KAAK,EAAE,GAAG,EAAE,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,GAAG,MAAM,EAAE,CAAC;QACnH,KAAK,QAAQ;YACX,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,EAAE,CAAC;QAC/E,KAAK,QAAQ;YACX,OAAO;gBACL,IAAI,EAAE,WAAW,CAAC,CAAC;gBACnB,GAAG,EAAE,WAAW,CAAC,CAAC;gBAClB,KAAK,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,MAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,KAAK,mCAAI,KAAK,CAAC;gBACrD,MAAM,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,MAAA,YAAY,aAAZ,YAAY,uBAAZ,YAAY,CAAE,MAAM,mCAAI,MAAM,CAAC;aACzD,CAAC;KACL;AACH,CAAC","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Operation } from \"../dnd-controller/controller\";\nimport { Rect } from \"../interfaces\";\nimport { Coordinates } from \"../utils/coordinates\";\nimport { getNormalizedElementRect } from \"../utils/screen\";\n\n/**\n * Produces a rect (in coordinates) to represent the draggable item.\n */\nexport function getCollisionRect(\n operation: Operation,\n draggableElement: HTMLElement,\n coordinates: Coordinates,\n sizeOverride: null | { width: number; height: number },\n): Rect {\n const { left, top, width, height } = getNormalizedElementRect(draggableElement);\n\n switch (operation) {\n case \"reorder\":\n return { left: coordinates.x, right: coordinates.x + width, top: coordinates.y, bottom: coordinates.y + height };\n case \"resize\":\n return { left: left, top: top, right: coordinates.x, bottom: coordinates.y };\n case \"insert\":\n return {\n left: coordinates.x,\n top: coordinates.y,\n right: coordinates.x + (sizeOverride?.width ?? width),\n bottom: coordinates.y + (sizeOverride?.height ?? height),\n };\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-next-droppable.js","sourceRoot":"","sources":["../../../../src/internal/item-container/get-next-droppable.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;AAItC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE3D;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,gBAA6B,EAC7B,UAA0C,EAC1C,SAAoB;;IAEpB,MAAM,aAAa,GAAG,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAChG,MAAM,OAAO,GAAG,kBAAkB,CAAC,aAAa,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IAClF,OAAO,MAAA,OAAO,CAAC,GAAG,CAAC,OAAkB,CAAC,mCAAI,IAAI,CAAC;AACjD,CAAC","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Droppable } from \"../dnd-controller/controller\";\nimport { Direction, ItemId } from \"../interfaces\";\nimport { getClosestNeighbor } from \"../utils/rects\";\nimport { getNormalizedElementRect } from \"../utils/screen\";\n\n/**\n * Finds closest droppable to provided draggable element and direction.\n * Returns null if there is no droppable in the given direction.\n */\nexport function getNextDroppable(\n draggableElement: HTMLElement,\n droppables: readonly [ItemId, Droppable][],\n direction: Direction
|
|
1
|
+
{"version":3,"file":"get-next-droppable.js","sourceRoot":"","sources":["../../../../src/internal/item-container/get-next-droppable.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;AAItC,OAAO,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AACpD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iBAAiB,CAAC;AAE3D;;;GAGG;AACH,MAAM,UAAU,gBAAgB,CAC9B,gBAA6B,EAC7B,UAA0C,EAC1C,SAAoB;;IAEpB,MAAM,aAAa,GAAG,wBAAwB,CAAC,gBAAgB,CAAC,CAAC;IACjE,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,wBAAwB,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;IAChG,MAAM,OAAO,GAAG,kBAAkB,CAAC,aAAa,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,EAAE,SAAS,CAAC,CAAC;IAClF,OAAO,MAAA,OAAO,CAAC,GAAG,CAAC,OAAkB,CAAC,mCAAI,IAAI,CAAC;AACjD,CAAC","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Droppable } from \"../dnd-controller/controller\";\nimport { Direction, ItemId } from \"../interfaces\";\nimport { getClosestNeighbor } from \"../utils/rects\";\nimport { getNormalizedElementRect } from \"../utils/screen\";\n\n/**\n * Finds closest droppable to provided draggable element and direction.\n * Returns null if there is no droppable in the given direction.\n */\nexport function getNextDroppable(\n draggableElement: HTMLElement,\n droppables: readonly [ItemId, Droppable][],\n direction: Direction,\n): null | ItemId {\n const draggableRect = getNormalizedElementRect(draggableElement);\n const sources = new Map(droppables.map(([id, d]) => [getNormalizedElementRect(d.element), id]));\n const closest = getClosestNeighbor(draggableRect, [...sources.keys()], direction);\n return sources.get(closest as DOMRect) ?? null;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/internal/item-container/index.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { CSS as CSSUtil } from \"@dnd-kit/utilities\";\nimport clsx from \"clsx\";\nimport {\n CSSProperties,\n KeyboardEvent,\n ReactNode,\n PointerEvent as ReactPointerEvent,\n Ref,\n RefObject,\n createContext,\n forwardRef,\n useContext,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n DragAndDropData,\n DropTargetContext,\n InteractionType,\n Operation,\n useDragSubscription,\n useDraggable,\n} from \"../dnd-controller/controller\";\nimport { BoardItemDefinitionBase, Direction, ItemId, Transform } from \"../interfaces\";\nimport { Coordinates } from \"../utils/coordinates\";\nimport { getNormalizedElementRect } from \"../utils/screen\";\nimport { throttle } from \"../utils/throttle\";\nimport { getCollisionRect } from \"./get-collision-rect\";\nimport { getNextDroppable } from \"./get-next-droppable\";\nimport styles from \"./styles.css.js\";\n\nexport interface ItemContainerRef {\n focusDragHandle(): void;\n}\n\ninterface ItemContextType {\n isActive: boolean;\n dragHandle: {\n ref: RefObject<HTMLButtonElement>;\n onPointerDown(event: ReactPointerEvent): void;\n onKeyDown(event: KeyboardEvent): void;\n isActive: boolean;\n };\n resizeHandle: null | {\n onPointerDown(event: ReactPointerEvent): void;\n onKeyDown(event: KeyboardEvent): void;\n isActive: boolean;\n };\n}\n\nexport const ItemContext = createContext<ItemContextType | null>(null);\n\nexport function useItemContext() {\n const ctx = useContext(ItemContext);\n if (!ctx) {\n throw new Error(\"Unable to find BoardItem context.\");\n }\n return ctx;\n}\n\ninterface Transition {\n itemId: ItemId;\n operation: Operation;\n interactionType: InteractionType;\n sizeTransform: null | { width: number; height: number };\n positionTransform: null | { x: number; y: number };\n hasDropTarget?: boolean;\n}\n\n/**\n * Defines item's parameters and its relation with the layout.\n *\n * `item` - the unique board item base object to be used in d&d context.\n * `placed` - specifies if the item already belongs to the board.\n * `acquired` - specifies if the item is essentially a copy temporarily acquired by a droppable but not submitted yet.\n * `inTransition` - specifies if the item is currently being moved.\n * `transform` - specifies if the item's position needs to be altered.\n * `getItemSize` - item size getter that takes droppable context as argument.\n * `onKeyMove` - a callback that fires when arrow keys are pressed in drag- or resize handle.\n */\nexport interface ItemContainerProps {\n item: BoardItemDefinitionBase<unknown>;\n placed: boolean;\n acquired: boolean;\n inTransition: boolean;\n transform: Transform | undefined;\n getItemSize: (context: null | DropTargetContext) => {\n width: number;\n minWidth: number;\n maxWidth: number;\n height: number;\n minHeight: number;\n maxHeight: number;\n };\n onKeyMove?(direction: Direction): void;\n children: (hasDropTarget: boolean) => ReactNode;\n}\n\nexport const ItemContainer = forwardRef(ItemContainerComponent);\n\nfunction ItemContainerComponent(\n { item, placed, acquired, inTransition, transform, getItemSize, onKeyMove, children }: ItemContainerProps,\n ref: Ref<ItemContainerRef>\n) {\n const originalSizeRef = useRef({ width: 0, height: 0 });\n const pointerOffsetRef = useRef(new Coordinates({ x: 0, y: 0 }));\n const pointerBoundariesRef = useRef<null | Coordinates>(null);\n const [transition, setTransition] = useState<null | Transition>(null);\n const [isHidden, setIsHidden] = useState(false);\n const muteEventsRef = useRef(false);\n const itemRef = useRef<HTMLDivElement>(null);\n const draggableApi = useDraggable({\n draggableItem: item,\n getCollisionRect: (operation, coordinates, dropTarget) => {\n const sizeOverride = operation === \"insert\" && dropTarget ? getItemSize(dropTarget) : null;\n return getCollisionRect(operation, itemRef.current!, coordinates, sizeOverride);\n },\n });\n\n function updateTransition({\n operation,\n interactionType,\n draggableItem,\n collisionRect,\n coordinates,\n dropTarget,\n }: DragAndDropData) {\n if (item.id === draggableItem.id) {\n const [width, height] = [collisionRect.right - collisionRect.left, collisionRect.bottom - collisionRect.top];\n const pointerOffset = pointerOffsetRef.current;\n\n if (operation === \"resize\") {\n setTransition({\n operation,\n interactionType,\n itemId: draggableItem.id,\n sizeTransform: {\n width: Math.max(getItemSize(null).minWidth, Math.min(getItemSize(null).maxWidth, width - pointerOffset.x)),\n height: Math.max(getItemSize(null).minHeight, height - pointerOffset.y),\n },\n positionTransform: null,\n });\n } else if (operation === \"insert\" || operation === \"reorder\") {\n setTransition({\n operation,\n interactionType,\n itemId: draggableItem.id,\n sizeTransform: dropTarget ? getItemSize(dropTarget) : originalSizeRef.current,\n positionTransform: { x: coordinates.x - pointerOffset.x, y: coordinates.y - pointerOffset.y },\n hasDropTarget: !!dropTarget,\n });\n }\n }\n }\n\n useDragSubscription(\"start\", (detail) => updateTransition(detail));\n useDragSubscription(\"update\", (detail) => updateTransition(detail));\n useDragSubscription(\"submit\", () => {\n setTransition(null);\n setIsHidden(false);\n muteEventsRef.current = false;\n });\n useDragSubscription(\"discard\", () => {\n setTransition(null);\n setIsHidden(false);\n muteEventsRef.current = false;\n });\n\n // During the transition listen to pointer move and pointer up events to update/submit transition.\n const transitionInteractionType = transition?.interactionType ?? null;\n const transitionItemId = transition?.itemId ?? null;\n useEffect(() => {\n const onPointerMove = throttle((event: PointerEvent) => {\n const coordinates = Coordinates.fromEvent(event);\n draggableApi.updateTransition(\n new Coordinates({\n x: Math.max(coordinates.x, pointerBoundariesRef.current?.x ?? Number.NEGATIVE_INFINITY),\n y: Math.max(coordinates.y, pointerBoundariesRef.current?.y ?? Number.NEGATIVE_INFINITY),\n })\n );\n }, 10);\n const onPointerUp = () => {\n onPointerMove.cancel();\n draggableApi.submitTransition();\n };\n\n if (transitionInteractionType === \"pointer\" && transitionItemId === item.id) {\n window.addEventListener(\"pointermove\", onPointerMove);\n window.addEventListener(\"pointerup\", onPointerUp);\n }\n return () => {\n window.removeEventListener(\"pointermove\", onPointerMove);\n window.removeEventListener(\"pointerup\", onPointerUp);\n };\n // draggableApi is not expected to change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [item.id, transitionInteractionType, transitionItemId]);\n\n useEffect(() => {\n if (transitionInteractionType === \"keyboard\" && transitionItemId === item.id) {\n const onPointerDown = () => draggableApi.submitTransition();\n window.addEventListener(\"pointerdown\", onPointerDown, true);\n return () => {\n window.removeEventListener(\"pointerdown\", onPointerDown, true);\n };\n }\n // draggableApi is not expected to change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [item.id, transitionInteractionType, transitionItemId]);\n\n function onKeyboardTransitionToggle(operation: \"drag\" | \"resize\") {\n // The acquired item is a copy and does not have the transition state.\n // However, pressing \"Space\" or \"Enter\" on the acquired item must submit the active transition.\n if (acquired) {\n return draggableApi.submitTransition();\n }\n\n // Create new transition if missing.\n if (!transition) {\n const rect = getNormalizedElementRect(itemRef.current!);\n const coordinates = new Coordinates({\n x: operation === \"drag\" ? rect.left : rect.right,\n y: operation === \"drag\" ? rect.top : rect.bottom,\n });\n\n if (operation === \"drag\" && !placed) {\n draggableApi.start(\"insert\", \"keyboard\", coordinates);\n } else if (operation === \"drag\") {\n draggableApi.start(\"reorder\", \"keyboard\", coordinates);\n } else {\n draggableApi.start(\"resize\", \"keyboard\", coordinates);\n }\n }\n // Submit a transition if existing.\n else {\n draggableApi.submitTransition();\n }\n }\n\n function handleInsert(direction: Direction) {\n // Find the closest droppable (in the direction) to the item.\n const droppables = draggableApi.getDroppables();\n const nextDroppable = getNextDroppable(itemRef.current!, droppables, direction);\n\n if (!nextDroppable) {\n // TODO: add announcement\n // Context: the keyboard insertion only works when there is some droppable area in the specified direction.\n // That means that only some arrow keys might work which is confusing for a screen-reader user.\n // Alternatively, we can consider a multi-step insertion where the user would first explicitly select the desired board.\n return;\n }\n\n // Notify the respective droppable of the intention to insert the item in it.\n draggableApi.acquire(nextDroppable, () => children(true));\n setIsHidden(true);\n muteEventsRef.current = true;\n }\n\n function onHandleKeyDown(operation: \"drag\" | \"resize\", event: KeyboardEvent) {\n const canInsert = transition && operation === \"drag\" && !placed;\n const canNavigate = transition || operation === \"drag\";\n\n // The insert is handled by the item and the navigation is delegated to the containing layout.\n const move = (direction: Direction) => {\n if (canInsert) {\n handleInsert(direction);\n } else if (canNavigate) {\n onKeyMove?.(direction);\n }\n };\n\n const discard = () => {\n if (transition || acquired) {\n draggableApi.discardTransition();\n }\n };\n\n switch (event.key) {\n case \"ArrowUp\":\n return move(\"up\");\n case \"ArrowDown\":\n return move(\"down\");\n case \"ArrowLeft\":\n return move(\"left\");\n case \"ArrowRight\":\n return move(\"right\");\n case \" \":\n case \"Enter\":\n return onKeyboardTransitionToggle(operation);\n case \"Escape\":\n return discard();\n }\n }\n\n function onBlur() {\n // When drag- or resize handle on palette or board item loses focus the transition must be submitted with two exceptions:\n // 1. If the last interaction is not \"keyboard\" (the user clicked on another handle issuing a new transition);\n // 2. If the item is acquired by the board (in that case the focus moves to the board item which is expected, palette item is hidden and all events handlers must be muted).\n if (transition && transition.interactionType === \"keyboard\" && !muteEventsRef.current) {\n draggableApi.submitTransition();\n }\n }\n\n function onDragHandlePointerDown(event: ReactPointerEvent) {\n // Calculate the offset between item's top-left corner and the pointer landing position.\n const rect = itemRef.current!.getBoundingClientRect();\n pointerOffsetRef.current = new Coordinates({ x: event.clientX - rect.left, y: event.clientY - rect.top });\n originalSizeRef.current = { width: rect.width, height: rect.height };\n pointerBoundariesRef.current = null;\n\n draggableApi.start(!placed ? \"insert\" : \"reorder\", \"pointer\", Coordinates.fromEvent(event));\n }\n\n function onDragHandleKeyDown(event: KeyboardEvent) {\n onHandleKeyDown(\"drag\", event);\n }\n\n function onResizeHandlePointerDown(event: ReactPointerEvent) {\n // Calculate the offset between item's bottom-right corner and the pointer landing position.\n const rect = itemRef.current!.getBoundingClientRect();\n pointerOffsetRef.current = new Coordinates({ x: event.clientX - rect.right, y: event.clientY - rect.bottom });\n originalSizeRef.current = { width: rect.width, height: rect.height };\n\n // Calculate boundaries below which the cursor cannot move.\n const minWidth = getItemSize(null).minWidth;\n const minHeight = getItemSize(null).minHeight;\n pointerBoundariesRef.current = new Coordinates({\n x: event.clientX - rect.width + minWidth,\n y: event.clientY - rect.height + minHeight,\n });\n\n draggableApi.start(\"resize\", \"pointer\", Coordinates.fromEvent(event));\n }\n\n function onResizeHandleKeyDown(event: KeyboardEvent) {\n onHandleKeyDown(\"resize\", event);\n }\n\n const itemTransitionStyle: CSSProperties = {};\n const itemTransitionClassNames: string[] = [];\n\n if (inTransition) {\n itemTransitionClassNames.push(styles.inTransition);\n }\n\n if (transition && transition.interactionType === \"pointer\") {\n // Adjust the dragged/resized item to the pointer's location.\n itemTransitionClassNames.push(transition.operation === \"resize\" ? styles.resized : styles.dragged);\n itemTransitionStyle.left = transition.positionTransform?.x;\n itemTransitionStyle.top = transition.positionTransform?.y;\n itemTransitionStyle.width = transition.sizeTransform?.width;\n itemTransitionStyle.height = transition.sizeTransform?.height;\n itemTransitionStyle.pointerEvents = \"none\";\n }\n\n if (isHidden) {\n itemTransitionClassNames.push(styles.hidden);\n }\n\n if (transform) {\n // The moved items positions are altered with CSS transform.\n if (transform.type === \"move\") {\n itemTransitionClassNames.push(styles.transformed);\n itemTransitionStyle.transform = CSSUtil.Transform.toString({\n x: transform.x,\n y: transform.y,\n scaleX: 1,\n scaleY: 1,\n });\n itemTransitionStyle.width = transform.width + \"px\";\n itemTransitionStyle.height = transform.height + \"px\";\n }\n // The item is removed from the DOM after animations play.\n // During the animations the removed item is hidden with styles.\n if (transform.type === \"remove\") {\n itemTransitionClassNames.push(styles.removed);\n }\n }\n\n const dragHandleRef = useRef<HTMLButtonElement>(null);\n useImperativeHandle(ref, () => ({\n focusDragHandle: () => dragHandleRef.current?.focus(),\n }));\n\n const isActive = (!!transition && !isHidden) || !!acquired;\n const shouldUsePortal = transition?.operation === \"insert\" && transition?.interactionType === \"pointer\";\n const childrenRef = useRef<ReactNode>(null);\n if (!inTransition || isActive) {\n childrenRef.current = children(!!transition?.hasDropTarget);\n }\n\n const content = (\n <div\n ref={itemRef}\n className={clsx(styles.root, ...itemTransitionClassNames)}\n style={itemTransitionStyle}\n data-item-id={item.id}\n onBlur={onBlur}\n >\n <ItemContext.Provider\n value={{\n isActive,\n dragHandle: {\n ref: dragHandleRef,\n onPointerDown: onDragHandlePointerDown,\n onKeyDown: onDragHandleKeyDown,\n isActive: isActive && transition?.operation === \"reorder\",\n },\n resizeHandle: placed\n ? {\n onPointerDown: onResizeHandlePointerDown,\n onKeyDown: onResizeHandleKeyDown,\n isActive: isActive && transition?.operation === \"resize\",\n }\n : null,\n }}\n >\n {childrenRef.current}\n </ItemContext.Provider>\n </div>\n );\n\n return shouldUsePortal ? <div>{createPortal(content, document.body)}</div> : content;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/internal/item-container/index.tsx"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\nimport { CSS as CSSUtil } from \"@dnd-kit/utilities\";\nimport clsx from \"clsx\";\nimport {\n CSSProperties,\n KeyboardEvent,\n ReactNode,\n PointerEvent as ReactPointerEvent,\n Ref,\n RefObject,\n createContext,\n forwardRef,\n useContext,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n DragAndDropData,\n DropTargetContext,\n InteractionType,\n Operation,\n useDragSubscription,\n useDraggable,\n} from \"../dnd-controller/controller\";\nimport { BoardItemDefinitionBase, Direction, ItemId, Transform } from \"../interfaces\";\nimport { Coordinates } from \"../utils/coordinates\";\nimport { getNormalizedElementRect } from \"../utils/screen\";\nimport { throttle } from \"../utils/throttle\";\nimport { getCollisionRect } from \"./get-collision-rect\";\nimport { getNextDroppable } from \"./get-next-droppable\";\nimport styles from \"./styles.css.js\";\n\nexport interface ItemContainerRef {\n focusDragHandle(): void;\n}\n\ninterface ItemContextType {\n isActive: boolean;\n dragHandle: {\n ref: RefObject<HTMLButtonElement>;\n onPointerDown(event: ReactPointerEvent): void;\n onKeyDown(event: KeyboardEvent): void;\n isActive: boolean;\n };\n resizeHandle: null | {\n onPointerDown(event: ReactPointerEvent): void;\n onKeyDown(event: KeyboardEvent): void;\n isActive: boolean;\n };\n}\n\nexport const ItemContext = createContext<ItemContextType | null>(null);\n\nexport function useItemContext() {\n const ctx = useContext(ItemContext);\n if (!ctx) {\n throw new Error(\"Unable to find BoardItem context.\");\n }\n return ctx;\n}\n\ninterface Transition {\n itemId: ItemId;\n operation: Operation;\n interactionType: InteractionType;\n sizeTransform: null | { width: number; height: number };\n positionTransform: null | { x: number; y: number };\n hasDropTarget?: boolean;\n}\n\n/**\n * Defines item's parameters and its relation with the layout.\n *\n * `item` - the unique board item base object to be used in d&d context.\n * `placed` - specifies if the item already belongs to the board.\n * `acquired` - specifies if the item is essentially a copy temporarily acquired by a droppable but not submitted yet.\n * `inTransition` - specifies if the item is currently being moved.\n * `transform` - specifies if the item's position needs to be altered.\n * `getItemSize` - item size getter that takes droppable context as argument.\n * `onKeyMove` - a callback that fires when arrow keys are pressed in drag- or resize handle.\n */\nexport interface ItemContainerProps {\n item: BoardItemDefinitionBase<unknown>;\n placed: boolean;\n acquired: boolean;\n inTransition: boolean;\n transform: Transform | undefined;\n getItemSize: (context: null | DropTargetContext) => {\n width: number;\n minWidth: number;\n maxWidth: number;\n height: number;\n minHeight: number;\n maxHeight: number;\n };\n onKeyMove?(direction: Direction): void;\n children: (hasDropTarget: boolean) => ReactNode;\n}\n\nexport const ItemContainer = forwardRef(ItemContainerComponent);\n\nfunction ItemContainerComponent(\n { item, placed, acquired, inTransition, transform, getItemSize, onKeyMove, children }: ItemContainerProps,\n ref: Ref<ItemContainerRef>,\n) {\n const originalSizeRef = useRef({ width: 0, height: 0 });\n const pointerOffsetRef = useRef(new Coordinates({ x: 0, y: 0 }));\n const pointerBoundariesRef = useRef<null | Coordinates>(null);\n const [transition, setTransition] = useState<null | Transition>(null);\n const [isHidden, setIsHidden] = useState(false);\n const muteEventsRef = useRef(false);\n const itemRef = useRef<HTMLDivElement>(null);\n const draggableApi = useDraggable({\n draggableItem: item,\n getCollisionRect: (operation, coordinates, dropTarget) => {\n const sizeOverride = operation === \"insert\" && dropTarget ? getItemSize(dropTarget) : null;\n return getCollisionRect(operation, itemRef.current!, coordinates, sizeOverride);\n },\n });\n\n function updateTransition({\n operation,\n interactionType,\n draggableItem,\n collisionRect,\n coordinates,\n dropTarget,\n }: DragAndDropData) {\n if (item.id === draggableItem.id) {\n const [width, height] = [collisionRect.right - collisionRect.left, collisionRect.bottom - collisionRect.top];\n const pointerOffset = pointerOffsetRef.current;\n\n if (operation === \"resize\") {\n setTransition({\n operation,\n interactionType,\n itemId: draggableItem.id,\n sizeTransform: {\n width: Math.max(getItemSize(null).minWidth, Math.min(getItemSize(null).maxWidth, width - pointerOffset.x)),\n height: Math.max(getItemSize(null).minHeight, height - pointerOffset.y),\n },\n positionTransform: null,\n });\n } else if (operation === \"insert\" || operation === \"reorder\") {\n setTransition({\n operation,\n interactionType,\n itemId: draggableItem.id,\n sizeTransform: dropTarget ? getItemSize(dropTarget) : originalSizeRef.current,\n positionTransform: { x: coordinates.x - pointerOffset.x, y: coordinates.y - pointerOffset.y },\n hasDropTarget: !!dropTarget,\n });\n }\n }\n }\n\n useDragSubscription(\"start\", (detail) => updateTransition(detail));\n useDragSubscription(\"update\", (detail) => updateTransition(detail));\n useDragSubscription(\"submit\", () => {\n setTransition(null);\n setIsHidden(false);\n muteEventsRef.current = false;\n });\n useDragSubscription(\"discard\", () => {\n setTransition(null);\n setIsHidden(false);\n muteEventsRef.current = false;\n });\n\n // During the transition listen to pointer move and pointer up events to update/submit transition.\n const transitionInteractionType = transition?.interactionType ?? null;\n const transitionItemId = transition?.itemId ?? null;\n useEffect(() => {\n const onPointerMove = throttle((event: PointerEvent) => {\n const coordinates = Coordinates.fromEvent(event);\n draggableApi.updateTransition(\n new Coordinates({\n x: Math.max(coordinates.x, pointerBoundariesRef.current?.x ?? Number.NEGATIVE_INFINITY),\n y: Math.max(coordinates.y, pointerBoundariesRef.current?.y ?? Number.NEGATIVE_INFINITY),\n }),\n );\n }, 10);\n const onPointerUp = () => {\n onPointerMove.cancel();\n draggableApi.submitTransition();\n };\n\n if (transitionInteractionType === \"pointer\" && transitionItemId === item.id) {\n window.addEventListener(\"pointermove\", onPointerMove);\n window.addEventListener(\"pointerup\", onPointerUp);\n }\n return () => {\n window.removeEventListener(\"pointermove\", onPointerMove);\n window.removeEventListener(\"pointerup\", onPointerUp);\n };\n // draggableApi is not expected to change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [item.id, transitionInteractionType, transitionItemId]);\n\n useEffect(() => {\n if (transitionInteractionType === \"keyboard\" && transitionItemId === item.id) {\n const onPointerDown = () => draggableApi.submitTransition();\n window.addEventListener(\"pointerdown\", onPointerDown, true);\n return () => {\n window.removeEventListener(\"pointerdown\", onPointerDown, true);\n };\n }\n // draggableApi is not expected to change\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [item.id, transitionInteractionType, transitionItemId]);\n\n function onKeyboardTransitionToggle(operation: \"drag\" | \"resize\") {\n // The acquired item is a copy and does not have the transition state.\n // However, pressing \"Space\" or \"Enter\" on the acquired item must submit the active transition.\n if (acquired) {\n return draggableApi.submitTransition();\n }\n\n // Create new transition if missing.\n if (!transition) {\n const rect = getNormalizedElementRect(itemRef.current!);\n const coordinates = new Coordinates({\n x: operation === \"drag\" ? rect.left : rect.right,\n y: operation === \"drag\" ? rect.top : rect.bottom,\n });\n\n if (operation === \"drag\" && !placed) {\n draggableApi.start(\"insert\", \"keyboard\", coordinates);\n } else if (operation === \"drag\") {\n draggableApi.start(\"reorder\", \"keyboard\", coordinates);\n } else {\n draggableApi.start(\"resize\", \"keyboard\", coordinates);\n }\n }\n // Submit a transition if existing.\n else {\n draggableApi.submitTransition();\n }\n }\n\n function handleInsert(direction: Direction) {\n // Find the closest droppable (in the direction) to the item.\n const droppables = draggableApi.getDroppables();\n const nextDroppable = getNextDroppable(itemRef.current!, droppables, direction);\n\n if (!nextDroppable) {\n // TODO: add announcement\n // Context: the keyboard insertion only works when there is some droppable area in the specified direction.\n // That means that only some arrow keys might work which is confusing for a screen-reader user.\n // Alternatively, we can consider a multi-step insertion where the user would first explicitly select the desired board.\n return;\n }\n\n // Notify the respective droppable of the intention to insert the item in it.\n draggableApi.acquire(nextDroppable, () => children(true));\n setIsHidden(true);\n muteEventsRef.current = true;\n }\n\n function onHandleKeyDown(operation: \"drag\" | \"resize\", event: KeyboardEvent) {\n const canInsert = transition && operation === \"drag\" && !placed;\n const canNavigate = transition || operation === \"drag\";\n\n // The insert is handled by the item and the navigation is delegated to the containing layout.\n const move = (direction: Direction) => {\n if (canInsert) {\n handleInsert(direction);\n } else if (canNavigate) {\n onKeyMove?.(direction);\n }\n };\n\n const discard = () => {\n if (transition || acquired) {\n draggableApi.discardTransition();\n }\n };\n\n switch (event.key) {\n case \"ArrowUp\":\n return move(\"up\");\n case \"ArrowDown\":\n return move(\"down\");\n case \"ArrowLeft\":\n return move(\"left\");\n case \"ArrowRight\":\n return move(\"right\");\n case \" \":\n case \"Enter\":\n return onKeyboardTransitionToggle(operation);\n case \"Escape\":\n return discard();\n }\n }\n\n function onBlur() {\n // When drag- or resize handle on palette or board item loses focus the transition must be submitted with two exceptions:\n // 1. If the last interaction is not \"keyboard\" (the user clicked on another handle issuing a new transition);\n // 2. If the item is acquired by the board (in that case the focus moves to the board item which is expected, palette item is hidden and all events handlers must be muted).\n if (transition && transition.interactionType === \"keyboard\" && !muteEventsRef.current) {\n draggableApi.submitTransition();\n }\n }\n\n function onDragHandlePointerDown(event: ReactPointerEvent) {\n // Calculate the offset between item's top-left corner and the pointer landing position.\n const rect = itemRef.current!.getBoundingClientRect();\n pointerOffsetRef.current = new Coordinates({ x: event.clientX - rect.left, y: event.clientY - rect.top });\n originalSizeRef.current = { width: rect.width, height: rect.height };\n pointerBoundariesRef.current = null;\n\n draggableApi.start(!placed ? \"insert\" : \"reorder\", \"pointer\", Coordinates.fromEvent(event));\n }\n\n function onDragHandleKeyDown(event: KeyboardEvent) {\n onHandleKeyDown(\"drag\", event);\n }\n\n function onResizeHandlePointerDown(event: ReactPointerEvent) {\n // Calculate the offset between item's bottom-right corner and the pointer landing position.\n const rect = itemRef.current!.getBoundingClientRect();\n pointerOffsetRef.current = new Coordinates({ x: event.clientX - rect.right, y: event.clientY - rect.bottom });\n originalSizeRef.current = { width: rect.width, height: rect.height };\n\n // Calculate boundaries below which the cursor cannot move.\n const minWidth = getItemSize(null).minWidth;\n const minHeight = getItemSize(null).minHeight;\n pointerBoundariesRef.current = new Coordinates({\n x: event.clientX - rect.width + minWidth,\n y: event.clientY - rect.height + minHeight,\n });\n\n draggableApi.start(\"resize\", \"pointer\", Coordinates.fromEvent(event));\n }\n\n function onResizeHandleKeyDown(event: KeyboardEvent) {\n onHandleKeyDown(\"resize\", event);\n }\n\n const itemTransitionStyle: CSSProperties = {};\n const itemTransitionClassNames: string[] = [];\n\n if (inTransition) {\n itemTransitionClassNames.push(styles.inTransition);\n }\n\n if (transition && transition.interactionType === \"pointer\") {\n // Adjust the dragged/resized item to the pointer's location.\n itemTransitionClassNames.push(transition.operation === \"resize\" ? styles.resized : styles.dragged);\n itemTransitionStyle.left = transition.positionTransform?.x;\n itemTransitionStyle.top = transition.positionTransform?.y;\n itemTransitionStyle.width = transition.sizeTransform?.width;\n itemTransitionStyle.height = transition.sizeTransform?.height;\n itemTransitionStyle.pointerEvents = \"none\";\n }\n\n if (isHidden) {\n itemTransitionClassNames.push(styles.hidden);\n }\n\n if (transform) {\n // The moved items positions are altered with CSS transform.\n if (transform.type === \"move\") {\n itemTransitionClassNames.push(styles.transformed);\n itemTransitionStyle.transform = CSSUtil.Transform.toString({\n x: transform.x,\n y: transform.y,\n scaleX: 1,\n scaleY: 1,\n });\n itemTransitionStyle.width = transform.width + \"px\";\n itemTransitionStyle.height = transform.height + \"px\";\n }\n // The item is removed from the DOM after animations play.\n // During the animations the removed item is hidden with styles.\n if (transform.type === \"remove\") {\n itemTransitionClassNames.push(styles.removed);\n }\n }\n\n const dragHandleRef = useRef<HTMLButtonElement>(null);\n useImperativeHandle(ref, () => ({\n focusDragHandle: () => dragHandleRef.current?.focus(),\n }));\n\n const isActive = (!!transition && !isHidden) || !!acquired;\n const shouldUsePortal = transition?.operation === \"insert\" && transition?.interactionType === \"pointer\";\n const childrenRef = useRef<ReactNode>(null);\n if (!inTransition || isActive) {\n childrenRef.current = children(!!transition?.hasDropTarget);\n }\n\n const content = (\n <div\n ref={itemRef}\n className={clsx(styles.root, ...itemTransitionClassNames)}\n style={itemTransitionStyle}\n data-item-id={item.id}\n onBlur={onBlur}\n >\n <ItemContext.Provider\n value={{\n isActive,\n dragHandle: {\n ref: dragHandleRef,\n onPointerDown: onDragHandlePointerDown,\n onKeyDown: onDragHandleKeyDown,\n isActive: isActive && transition?.operation === \"reorder\",\n },\n resizeHandle: placed\n ? {\n onPointerDown: onResizeHandlePointerDown,\n onKeyDown: onResizeHandleKeyDown,\n isActive: isActive && transition?.operation === \"resize\",\n }\n : null,\n }}\n >\n {childrenRef.current}\n </ItemContext.Provider>\n </div>\n );\n\n return shouldUsePortal ? <div>{createPortal(content, document.body)}</div> : content;\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-solution.js","sourceRoot":"","sources":["../../../../src/internal/layout-engine/engine-solution.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Direction, GridLayoutItem, ItemId } from \"../interfaces\";\nimport { Position } from \"../utils/position\";\nimport { Conflicts } from \"./engine-state\";\nimport { LayoutEngineGrid, ReadonlyLayoutEngineGrid } from \"./grid\";\nimport { CommittedMove } from \"./interfaces\";\nimport { checkOppositeDirections, createMove, getMoveOriginalRect, getMoveRect } from \"./utils\";\n\n// All directions in which overlaps can be incrementally resolved.\nconst PRIORITY_DIRECTIONS: readonly Direction[] = [\"down\", \"right\", \"left\", \"up\"];\n\n// A valid but not yet attempted solution is a pair of the layout state so far and the next move to attempt.\n// The minimal solution score (in case the next move will resolve all overlaps) is state.score + nextMove.score.\nexport type MoveSolution = [state: MoveSolutionState, nextMove: CommittedMove];\n\n// The class represents an intermediate layout state used to find the next set of solutions for.\n// The solution is terminal when no overlaps are left and it can become the next layout state if its\n// score is smaller than that of the alternative solutions.\nexport class MoveSolutionState {\n public grid: LayoutEngineGrid;\n public moves: CommittedMove[];\n public moveIndex = 0;\n public conflicts: null | Conflicts;\n public overlaps = new Map<ItemId, ItemId>();\n public score = 0;\n\n constructor(grid: ReadonlyLayoutEngineGrid, moves: readonly CommittedMove[], conflicts: null | Conflicts) {\n this.grid = LayoutEngineGrid.clone(grid);\n this.moves = [...moves];\n this.moveIndex = moves.length;\n this.conflicts = conflicts;\n }\n\n // The solution state needs to be cloned after the move is performed in case there are overlaps left\n // so that the next solutions won't have the shared state to corrupt.\n // The conflicts never change and can be carried over w/o cloning.\n static clone({ grid, moves, moveIndex, conflicts, overlaps, score }: MoveSolutionState) {\n return {\n grid: LayoutEngineGrid.clone(grid),\n moves: [...moves],\n moveIndex,\n conflicts,\n overlaps: new Map([...overlaps]),\n score,\n };\n }\n}\n\n/**\n * Given a solution state finds a set of all possible moves each resolving a particular overlap.\n */\nexport function findNextSolutions(state: MoveSolutionState): MoveSolution[] {\n // For every overlap and direction found a move if exists that resolves the overlap.\n // A pair of the given state and the overlap resolution move is a new solution to try.\n const nextMoveSolutions: MoveSolution[] = [];\n for (const [overlapId, overlapIssuerId] of state.overlaps) {\n for (const moveDirection of PRIORITY_DIRECTIONS) {\n const move = getOverlapMove(state, overlapId, overlapIssuerId, moveDirection);\n if (move !== null) {\n nextMoveSolutions.push([MoveSolutionState.clone(state), move]);\n }\n }\n }\n return nextMoveSolutions;\n}\n\n// Returns an evaluated move to resolve the given overlap in the given direction or null if such move is not possible.\nfunction getOverlapMove(\n state: MoveSolutionState,\n overlapId: ItemId,\n overlapIssuerId: ItemId,\n moveDirection: Direction\n): null | CommittedMove {\n const userItem = state.grid.getItem(state.moves[0].itemId);\n const overlapItem = state.grid.getItem(overlapId);\n const overlapIssuerItem = state.grid.getItem(overlapIssuerId);\n const overlapMove = getMoveForDirection(overlapItem, overlapIssuerItem, moveDirection);\n\n // The move position is outside the grid boundaries.\n if (overlapMove.x < 0 || overlapMove.y < 0 || overlapMove.x + overlapMove.width > state.grid.width) {\n return null;\n }\n\n // Subsequent item overlap moves in the opposite directions do not contribute to solution.\n const prevOverlapMove = getLastSolutionMove(state, overlapItem.id);\n if (prevOverlapMove && checkOppositeDirections(prevOverlapMove.direction, moveDirection)) {\n return null;\n }\n\n const pathOverlaps = getPathOverlaps(state, overlapMove, overlapIssuerItem);\n for (const overlap of pathOverlaps) {\n // Not allowed to intersect with the user-controlled item.\n if (overlap.id === userItem.id) {\n return null;\n }\n // Not allowed to intersect with conflicting items.\n if (state.conflicts?.items.has(overlap.id)) {\n return null;\n }\n // Intersecting with items having unresolved overlaps does not contribute to solution.\n if (state.overlaps.has(overlap.id)) {\n return null;\n }\n }\n\n const lastIssuerMove = getLastSolutionMove(state, overlapIssuerItem.id);\n if (!lastIssuerMove) {\n throw new Error(\"Invariant violation: overlap issuer has no associated moves.\");\n }\n const issuerDirection = lastIssuerMove.direction;\n\n const isSwap = checkIfSwap(overlapMove, lastIssuerMove);\n const isDifferentIssuerDirection = moveDirection !== issuerDirection;\n const isOppositeIssuerDirection = checkOppositeDirections(moveDirection, issuerDirection);\n const userMoveBoundaries = getUserMoveBoundaries(state);\n const moveVector = getSolutionMovesVector(state);\n\n // Swap score penalizes non-swap overlap resolutions in case the direction does not match that of the issuer.\n const swapPenalty = isSwap ? 0 : 20;\n const differentDirectionPenalty = !isSwap && isDifferentIssuerDirection ? 10 : 0;\n const oppositeDirectionPenalty = !isSwap && isOppositeIssuerDirection ? 500 : 0;\n const swapScore = swapPenalty + differentDirectionPenalty + oppositeDirectionPenalty;\n\n // Overlaps score penalizes moves that cause additional overlaps.\n const overlapsScore = pathOverlaps.size * 50;\n\n // Boundaries score penalize movements of items that are outside the area covered by the user move.\n const moveOutsideUserTopPenalty = overlapItem.y + overlapItem.height - 1 < userMoveBoundaries.top ? 500 : 0;\n const moveOutsideUserLeftPenalty = overlapItem.x + overlapItem.width - 1 < userMoveBoundaries.left ? 50 : 0;\n const moveOutsideUserRightPenalty = overlapItem.x > userMoveBoundaries.right ? 50 : 0;\n const boundariesScore = moveOutsideUserTopPenalty + moveOutsideUserLeftPenalty + moveOutsideUserRightPenalty;\n\n // Move vector score penalize movements that are against the common move direction of other items.\n const vectorXPenalty = overlapMove.distanceX * moveVector.x < 0 ? moveVector.x * 2 : 0;\n const vectorYPenalty = overlapMove.distanceY * moveVector.y < 0 ? moveVector.y * 2 : 0;\n const moveVectorScore = vectorXPenalty + vectorYPenalty;\n\n // Score starts from 1 to avoid overlap moves having 0 score which breaks the solutions cache.\n const score = 1 + swapScore + overlapsScore + moveVectorScore + boundariesScore;\n\n return { ...overlapMove, score };\n}\n\n// Retrieves the first possible move for the given direction to resolve the overlap.\nfunction getMoveForDirection(moveTarget: GridLayoutItem, overlap: GridLayoutItem, direction: Direction): CommittedMove {\n switch (direction) {\n case \"up\":\n return createMove(\"OVERLAP\", moveTarget, new Position({ x: moveTarget.x, y: overlap.y - moveTarget.height }));\n case \"down\":\n return createMove(\"OVERLAP\", moveTarget, new Position({ x: moveTarget.x, y: overlap.y + overlap.height }));\n case \"left\":\n return createMove(\"OVERLAP\", moveTarget, new Position({ x: overlap.x - moveTarget.width, y: moveTarget.y }));\n case \"right\":\n return createMove(\"OVERLAP\", moveTarget, new Position({ x: overlap.x + overlap.width, y: moveTarget.y }));\n }\n}\n\n// Retrieves the last move if exists within the given solution.\nfunction getLastSolutionMove(state: MoveSolutionState, itemId: ItemId): null | CommittedMove {\n let lastMove: null | CommittedMove = null;\n for (let i = state.moves.length - 1; i >= state.moveIndex; i--) {\n if (state.moves[i].itemId === itemId) {\n lastMove = state.moves[i];\n break;\n }\n }\n return lastMove;\n}\n\n// Calculates vector as the amount of cell movements to either direction.\n// All moves in one direction are summarized, the opposite moves cancel each other.\n// The vector show in which direction (left / right, up / down) the most overlaps were resolved.\nfunction getSolutionMovesVector(state: MoveSolutionState): { x: number; y: number } {\n const vector = { x: 0, y: 0 };\n for (let i = state.moveIndex; i < state.moves.length; i++) {\n const move = state.moves[i];\n if (move.type === \"OVERLAP\") {\n vector.x += move.distanceX * move.height;\n vector.y += move.distanceY * move.width;\n }\n }\n return vector;\n}\n\n// Finds a rectangle within which the user-controlled item was moved (previous and current positions only).\n// The layout items outside the boundaries are not expected to be disturbed.\nfunction getUserMoveBoundaries(state: MoveSolutionState): { top: number; right: number; bottom: number; left: number } {\n const firstUserMove = state.moves[0];\n const lastUserMove = state.moves[state.moveIndex];\n if (!firstUserMove || !lastUserMove || firstUserMove.itemId !== lastUserMove.itemId) {\n throw new Error(\"Invariant violation: unexpected user move.\");\n }\n const original = getMoveOriginalRect(lastUserMove);\n const current = getMoveRect(lastUserMove);\n return {\n top: Math.min(original.top, current.top),\n right: Math.max(original.right, current.right),\n bottom: Math.max(original.bottom, current.bottom),\n left: Math.min(original.left, current.left),\n };\n}\n\n// Finds all overlaps that the move will cause along its path not considering the original location and original overlap.\nfunction getPathOverlaps(\n state: MoveSolutionState,\n move: CommittedMove,\n overlapIssuerItem: GridLayoutItem\n): Set<GridLayoutItem> {\n const { left, right, top, bottom } = getMoveOriginalRect(move);\n const startX = move.distanceX <= 0 ? move.x : right + 1;\n const endX = move.distanceX < 0 ? left - 1 : right + move.distanceX;\n const startY = move.distanceY <= 0 ? move.y : bottom + 1;\n const endY = move.distanceY < 0 ? top - 1 : bottom + move.distanceY;\n\n const pathOverlaps = new Set(\n state.grid.getOverlaps({\n id: move.itemId,\n x: startX,\n width: 1 + endX - startX,\n y: startY,\n height: 1 + endY - startY,\n })\n );\n pathOverlaps.delete(overlapIssuerItem);\n\n return pathOverlaps;\n}\n\n// Checks if the overlap move is a swap with the user-moved item.\nfunction checkIfSwap(overlapMove: CommittedMove, lastIssuerMove: CommittedMove): boolean {\n if (lastIssuerMove.type !== \"MOVE\") {\n return false;\n }\n if (!checkOppositeDirections(overlapMove.direction, lastIssuerMove.direction)) {\n return false;\n }\n const overlapRect = getMoveOriginalRect(overlapMove);\n const issuerRect = getMoveRect(lastIssuerMove);\n switch (lastIssuerMove.direction) {\n case \"up\":\n return overlapRect.top === issuerRect.top;\n case \"right\":\n return overlapRect.right === issuerRect.right;\n case \"down\":\n return overlapRect.bottom === issuerRect.bottom;\n case \"left\":\n return overlapRect.left === issuerRect.left;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"engine-solution.js","sourceRoot":"","sources":["../../../../src/internal/layout-engine/engine-solution.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;AAGtC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAE7C,OAAO,EAAE,gBAAgB,EAA4B,MAAM,QAAQ,CAAC;AAEpE,OAAO,EAAE,uBAAuB,EAAE,UAAU,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEhG,kEAAkE;AAClE,MAAM,mBAAmB,GAAyB,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AAMlF,gGAAgG;AAChG,oGAAoG;AACpG,2DAA2D;AAC3D,MAAM,OAAO,iBAAiB;IAQ5B,YAAY,IAA8B,EAAE,KAA+B,EAAE,SAA2B;QALjG,cAAS,GAAG,CAAC,CAAC;QAEd,aAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;QACrC,UAAK,GAAG,CAAC,CAAC;QAGf,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC;QACxB,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,MAAM,CAAC;QAC9B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAED,oGAAoG;IACpG,qEAAqE;IACrE,kEAAkE;IAClE,MAAM,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,KAAK,EAAqB;QACpF,OAAO;YACL,IAAI,EAAE,gBAAgB,CAAC,KAAK,CAAC,IAAI,CAAC;YAClC,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC;YACjB,SAAS;YACT,SAAS;YACT,QAAQ,EAAE,IAAI,GAAG,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC;YAChC,KAAK;SACN,CAAC;IACJ,CAAC;CACF;AAED;;GAEG;AACH,MAAM,UAAU,iBAAiB,CAAC,KAAwB;IACxD,oFAAoF;IACpF,sFAAsF;IACtF,MAAM,iBAAiB,GAAmB,EAAE,CAAC;IAC7C,KAAK,MAAM,CAAC,SAAS,EAAE,eAAe,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE;QACzD,KAAK,MAAM,aAAa,IAAI,mBAAmB,EAAE;YAC/C,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,eAAe,EAAE,aAAa,CAAC,CAAC;YAC9E,IAAI,IAAI,KAAK,IAAI,EAAE;gBACjB,iBAAiB,CAAC,IAAI,CAAC,CAAC,iBAAiB,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC;aAChE;SACF;KACF;IACD,OAAO,iBAAiB,CAAC;AAC3B,CAAC;AAED,sHAAsH;AACtH,SAAS,cAAc,CACrB,KAAwB,EACxB,SAAiB,EACjB,eAAuB,EACvB,aAAwB;;IAExB,MAAM,QAAQ,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAC3D,MAAM,WAAW,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC;IAC9D,MAAM,WAAW,GAAG,mBAAmB,CAAC,WAAW,EAAE,iBAAiB,EAAE,aAAa,CAAC,CAAC;IAEvF,oDAAoD;IACpD,IAAI,WAAW,CAAC,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE;QAClG,OAAO,IAAI,CAAC;KACb;IAED,0FAA0F;IAC1F,MAAM,eAAe,GAAG,mBAAmB,CAAC,KAAK,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC;IACnE,IAAI,eAAe,IAAI,uBAAuB,CAAC,eAAe,CAAC,SAAS,EAAE,aAAa,CAAC,EAAE;QACxF,OAAO,IAAI,CAAC;KACb;IAED,MAAM,YAAY,GAAG,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,iBAAiB,CAAC,CAAC;IAC5E,KAAK,MAAM,OAAO,IAAI,YAAY,EAAE;QAClC,0DAA0D;QAC1D,IAAI,OAAO,CAAC,EAAE,KAAK,QAAQ,CAAC,EAAE,EAAE;YAC9B,OAAO,IAAI,CAAC;SACb;QACD,mDAAmD;QACnD,IAAI,MAAA,KAAK,CAAC,SAAS,0CAAE,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;YAC1C,OAAO,IAAI,CAAC;SACb;QACD,sFAAsF;QACtF,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE;YAClC,OAAO,IAAI,CAAC;SACb;KACF;IAED,MAAM,cAAc,GAAG,mBAAmB,CAAC,KAAK,EAAE,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACxE,IAAI,CAAC,cAAc,EAAE;QACnB,MAAM,IAAI,KAAK,CAAC,8DAA8D,CAAC,CAAC;KACjF;IACD,MAAM,eAAe,GAAG,cAAc,CAAC,SAAS,CAAC;IAEjD,MAAM,MAAM,GAAG,WAAW,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;IACxD,MAAM,0BAA0B,GAAG,aAAa,KAAK,eAAe,CAAC;IACrE,MAAM,yBAAyB,GAAG,uBAAuB,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;IAC1F,MAAM,kBAAkB,GAAG,qBAAqB,CAAC,KAAK,CAAC,CAAC;IACxD,MAAM,UAAU,GAAG,sBAAsB,CAAC,KAAK,CAAC,CAAC;IAEjD,6GAA6G;IAC7G,MAAM,WAAW,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpC,MAAM,yBAAyB,GAAG,CAAC,MAAM,IAAI,0BAA0B,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACjF,MAAM,wBAAwB,GAAG,CAAC,MAAM,IAAI,yBAAyB,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAChF,MAAM,SAAS,GAAG,WAAW,GAAG,yBAAyB,GAAG,wBAAwB,CAAC;IAErF,iEAAiE;IACjE,MAAM,aAAa,GAAG,YAAY,CAAC,IAAI,GAAG,EAAE,CAAC;IAE7C,mGAAmG;IACnG,MAAM,yBAAyB,GAAG,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5G,MAAM,0BAA0B,GAAG,WAAW,CAAC,CAAC,GAAG,WAAW,CAAC,KAAK,GAAG,CAAC,GAAG,kBAAkB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5G,MAAM,2BAA2B,GAAG,WAAW,CAAC,CAAC,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACtF,MAAM,eAAe,GAAG,yBAAyB,GAAG,0BAA0B,GAAG,2BAA2B,CAAC;IAE7G,kGAAkG;IAClG,MAAM,cAAc,GAAG,WAAW,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,MAAM,cAAc,GAAG,WAAW,CAAC,SAAS,GAAG,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvF,MAAM,eAAe,GAAG,cAAc,GAAG,cAAc,CAAC;IAExD,8FAA8F;IAC9F,MAAM,KAAK,GAAG,CAAC,GAAG,SAAS,GAAG,aAAa,GAAG,eAAe,GAAG,eAAe,CAAC;IAEhF,OAAO,EAAE,GAAG,WAAW,EAAE,KAAK,EAAE,CAAC;AACnC,CAAC;AAED,oFAAoF;AACpF,SAAS,mBAAmB,CAAC,UAA0B,EAAE,OAAuB,EAAE,SAAoB;IACpG,QAAQ,SAAS,EAAE;QACjB,KAAK,IAAI;YACP,OAAO,UAAU,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,QAAQ,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAChH,KAAK,MAAM;YACT,OAAO,UAAU,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,QAAQ,CAAC,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAC7G,KAAK,MAAM;YACT,OAAO,UAAU,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,UAAU,CAAC,KAAK,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QAC/G,KAAK,OAAO;YACV,OAAO,UAAU,CAAC,SAAS,EAAE,UAAU,EAAE,IAAI,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,EAAE,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KAC7G;AACH,CAAC;AAED,+DAA+D;AAC/D,SAAS,mBAAmB,CAAC,KAAwB,EAAE,MAAc;IACnE,IAAI,QAAQ,GAAyB,IAAI,CAAC;IAC1C,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC,EAAE,EAAE;QAC9D,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,EAAE;YACpC,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;YAC1B,MAAM;SACP;KACF;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,yEAAyE;AACzE,mFAAmF;AACnF,gGAAgG;AAChG,SAAS,sBAAsB,CAAC,KAAwB;IACtD,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC;IAC9B,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,SAAS,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE;QACzD,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,EAAE;YAC3B,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;YACzC,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC;SACzC;KACF;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,2GAA2G;AAC3G,4EAA4E;AAC5E,SAAS,qBAAqB,CAAC,KAAwB;IACrD,MAAM,aAAa,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACrC,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAClD,IAAI,CAAC,aAAa,IAAI,CAAC,YAAY,IAAI,aAAa,CAAC,MAAM,KAAK,YAAY,CAAC,MAAM,EAAE;QACnF,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;KAC/D;IACD,MAAM,QAAQ,GAAG,mBAAmB,CAAC,YAAY,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,WAAW,CAAC,YAAY,CAAC,CAAC;IAC1C,OAAO;QACL,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;QACxC,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,CAAC;QAC9C,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC;QACjD,IAAI,EAAE,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC;KAC5C,CAAC;AACJ,CAAC;AAED,yHAAyH;AACzH,SAAS,eAAe,CACtB,KAAwB,EACxB,IAAmB,EACnB,iBAAiC;IAEjC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC;IAC/D,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;IACxD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC;IACpE,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;IAEpE,MAAM,YAAY,GAAG,IAAI,GAAG,CAC1B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC;QACrB,EAAE,EAAE,IAAI,CAAC,MAAM;QACf,CAAC,EAAE,MAAM;QACT,KAAK,EAAE,CAAC,GAAG,IAAI,GAAG,MAAM;QACxB,CAAC,EAAE,MAAM;QACT,MAAM,EAAE,CAAC,GAAG,IAAI,GAAG,MAAM;KAC1B,CAAC,CACH,CAAC;IACF,YAAY,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC;IAEvC,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,iEAAiE;AACjE,SAAS,WAAW,CAAC,WAA0B,EAAE,cAA6B;IAC5E,IAAI,cAAc,CAAC,IAAI,KAAK,MAAM,EAAE;QAClC,OAAO,KAAK,CAAC;KACd;IACD,IAAI,CAAC,uBAAuB,CAAC,WAAW,CAAC,SAAS,EAAE,cAAc,CAAC,SAAS,CAAC,EAAE;QAC7E,OAAO,KAAK,CAAC;KACd;IACD,MAAM,WAAW,GAAG,mBAAmB,CAAC,WAAW,CAAC,CAAC;IACrD,MAAM,UAAU,GAAG,WAAW,CAAC,cAAc,CAAC,CAAC;IAC/C,QAAQ,cAAc,CAAC,SAAS,EAAE;QAChC,KAAK,IAAI;YACP,OAAO,WAAW,CAAC,GAAG,KAAK,UAAU,CAAC,GAAG,CAAC;QAC5C,KAAK,OAAO;YACV,OAAO,WAAW,CAAC,KAAK,KAAK,UAAU,CAAC,KAAK,CAAC;QAChD,KAAK,MAAM;YACT,OAAO,WAAW,CAAC,MAAM,KAAK,UAAU,CAAC,MAAM,CAAC;QAClD,KAAK,MAAM;YACT,OAAO,WAAW,CAAC,IAAI,KAAK,UAAU,CAAC,IAAI,CAAC;KAC/C;AACH,CAAC","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Direction, GridLayoutItem, ItemId } from \"../interfaces\";\nimport { Position } from \"../utils/position\";\nimport { Conflicts } from \"./engine-state\";\nimport { LayoutEngineGrid, ReadonlyLayoutEngineGrid } from \"./grid\";\nimport { CommittedMove } from \"./interfaces\";\nimport { checkOppositeDirections, createMove, getMoveOriginalRect, getMoveRect } from \"./utils\";\n\n// All directions in which overlaps can be incrementally resolved.\nconst PRIORITY_DIRECTIONS: readonly Direction[] = [\"down\", \"right\", \"left\", \"up\"];\n\n// A valid but not yet attempted solution is a pair of the layout state so far and the next move to attempt.\n// The minimal solution score (in case the next move will resolve all overlaps) is state.score + nextMove.score.\nexport type MoveSolution = [state: MoveSolutionState, nextMove: CommittedMove];\n\n// The class represents an intermediate layout state used to find the next set of solutions for.\n// The solution is terminal when no overlaps are left and it can become the next layout state if its\n// score is smaller than that of the alternative solutions.\nexport class MoveSolutionState {\n public grid: LayoutEngineGrid;\n public moves: CommittedMove[];\n public moveIndex = 0;\n public conflicts: null | Conflicts;\n public overlaps = new Map<ItemId, ItemId>();\n public score = 0;\n\n constructor(grid: ReadonlyLayoutEngineGrid, moves: readonly CommittedMove[], conflicts: null | Conflicts) {\n this.grid = LayoutEngineGrid.clone(grid);\n this.moves = [...moves];\n this.moveIndex = moves.length;\n this.conflicts = conflicts;\n }\n\n // The solution state needs to be cloned after the move is performed in case there are overlaps left\n // so that the next solutions won't have the shared state to corrupt.\n // The conflicts never change and can be carried over w/o cloning.\n static clone({ grid, moves, moveIndex, conflicts, overlaps, score }: MoveSolutionState) {\n return {\n grid: LayoutEngineGrid.clone(grid),\n moves: [...moves],\n moveIndex,\n conflicts,\n overlaps: new Map([...overlaps]),\n score,\n };\n }\n}\n\n/**\n * Given a solution state finds a set of all possible moves each resolving a particular overlap.\n */\nexport function findNextSolutions(state: MoveSolutionState): MoveSolution[] {\n // For every overlap and direction found a move if exists that resolves the overlap.\n // A pair of the given state and the overlap resolution move is a new solution to try.\n const nextMoveSolutions: MoveSolution[] = [];\n for (const [overlapId, overlapIssuerId] of state.overlaps) {\n for (const moveDirection of PRIORITY_DIRECTIONS) {\n const move = getOverlapMove(state, overlapId, overlapIssuerId, moveDirection);\n if (move !== null) {\n nextMoveSolutions.push([MoveSolutionState.clone(state), move]);\n }\n }\n }\n return nextMoveSolutions;\n}\n\n// Returns an evaluated move to resolve the given overlap in the given direction or null if such move is not possible.\nfunction getOverlapMove(\n state: MoveSolutionState,\n overlapId: ItemId,\n overlapIssuerId: ItemId,\n moveDirection: Direction,\n): null | CommittedMove {\n const userItem = state.grid.getItem(state.moves[0].itemId);\n const overlapItem = state.grid.getItem(overlapId);\n const overlapIssuerItem = state.grid.getItem(overlapIssuerId);\n const overlapMove = getMoveForDirection(overlapItem, overlapIssuerItem, moveDirection);\n\n // The move position is outside the grid boundaries.\n if (overlapMove.x < 0 || overlapMove.y < 0 || overlapMove.x + overlapMove.width > state.grid.width) {\n return null;\n }\n\n // Subsequent item overlap moves in the opposite directions do not contribute to solution.\n const prevOverlapMove = getLastSolutionMove(state, overlapItem.id);\n if (prevOverlapMove && checkOppositeDirections(prevOverlapMove.direction, moveDirection)) {\n return null;\n }\n\n const pathOverlaps = getPathOverlaps(state, overlapMove, overlapIssuerItem);\n for (const overlap of pathOverlaps) {\n // Not allowed to intersect with the user-controlled item.\n if (overlap.id === userItem.id) {\n return null;\n }\n // Not allowed to intersect with conflicting items.\n if (state.conflicts?.items.has(overlap.id)) {\n return null;\n }\n // Intersecting with items having unresolved overlaps does not contribute to solution.\n if (state.overlaps.has(overlap.id)) {\n return null;\n }\n }\n\n const lastIssuerMove = getLastSolutionMove(state, overlapIssuerItem.id);\n if (!lastIssuerMove) {\n throw new Error(\"Invariant violation: overlap issuer has no associated moves.\");\n }\n const issuerDirection = lastIssuerMove.direction;\n\n const isSwap = checkIfSwap(overlapMove, lastIssuerMove);\n const isDifferentIssuerDirection = moveDirection !== issuerDirection;\n const isOppositeIssuerDirection = checkOppositeDirections(moveDirection, issuerDirection);\n const userMoveBoundaries = getUserMoveBoundaries(state);\n const moveVector = getSolutionMovesVector(state);\n\n // Swap score penalizes non-swap overlap resolutions in case the direction does not match that of the issuer.\n const swapPenalty = isSwap ? 0 : 20;\n const differentDirectionPenalty = !isSwap && isDifferentIssuerDirection ? 10 : 0;\n const oppositeDirectionPenalty = !isSwap && isOppositeIssuerDirection ? 500 : 0;\n const swapScore = swapPenalty + differentDirectionPenalty + oppositeDirectionPenalty;\n\n // Overlaps score penalizes moves that cause additional overlaps.\n const overlapsScore = pathOverlaps.size * 50;\n\n // Boundaries score penalize movements of items that are outside the area covered by the user move.\n const moveOutsideUserTopPenalty = overlapItem.y + overlapItem.height - 1 < userMoveBoundaries.top ? 500 : 0;\n const moveOutsideUserLeftPenalty = overlapItem.x + overlapItem.width - 1 < userMoveBoundaries.left ? 50 : 0;\n const moveOutsideUserRightPenalty = overlapItem.x > userMoveBoundaries.right ? 50 : 0;\n const boundariesScore = moveOutsideUserTopPenalty + moveOutsideUserLeftPenalty + moveOutsideUserRightPenalty;\n\n // Move vector score penalize movements that are against the common move direction of other items.\n const vectorXPenalty = overlapMove.distanceX * moveVector.x < 0 ? moveVector.x * 2 : 0;\n const vectorYPenalty = overlapMove.distanceY * moveVector.y < 0 ? moveVector.y * 2 : 0;\n const moveVectorScore = vectorXPenalty + vectorYPenalty;\n\n // Score starts from 1 to avoid overlap moves having 0 score which breaks the solutions cache.\n const score = 1 + swapScore + overlapsScore + moveVectorScore + boundariesScore;\n\n return { ...overlapMove, score };\n}\n\n// Retrieves the first possible move for the given direction to resolve the overlap.\nfunction getMoveForDirection(moveTarget: GridLayoutItem, overlap: GridLayoutItem, direction: Direction): CommittedMove {\n switch (direction) {\n case \"up\":\n return createMove(\"OVERLAP\", moveTarget, new Position({ x: moveTarget.x, y: overlap.y - moveTarget.height }));\n case \"down\":\n return createMove(\"OVERLAP\", moveTarget, new Position({ x: moveTarget.x, y: overlap.y + overlap.height }));\n case \"left\":\n return createMove(\"OVERLAP\", moveTarget, new Position({ x: overlap.x - moveTarget.width, y: moveTarget.y }));\n case \"right\":\n return createMove(\"OVERLAP\", moveTarget, new Position({ x: overlap.x + overlap.width, y: moveTarget.y }));\n }\n}\n\n// Retrieves the last move if exists within the given solution.\nfunction getLastSolutionMove(state: MoveSolutionState, itemId: ItemId): null | CommittedMove {\n let lastMove: null | CommittedMove = null;\n for (let i = state.moves.length - 1; i >= state.moveIndex; i--) {\n if (state.moves[i].itemId === itemId) {\n lastMove = state.moves[i];\n break;\n }\n }\n return lastMove;\n}\n\n// Calculates vector as the amount of cell movements to either direction.\n// All moves in one direction are summarized, the opposite moves cancel each other.\n// The vector show in which direction (left / right, up / down) the most overlaps were resolved.\nfunction getSolutionMovesVector(state: MoveSolutionState): { x: number; y: number } {\n const vector = { x: 0, y: 0 };\n for (let i = state.moveIndex; i < state.moves.length; i++) {\n const move = state.moves[i];\n if (move.type === \"OVERLAP\") {\n vector.x += move.distanceX * move.height;\n vector.y += move.distanceY * move.width;\n }\n }\n return vector;\n}\n\n// Finds a rectangle within which the user-controlled item was moved (previous and current positions only).\n// The layout items outside the boundaries are not expected to be disturbed.\nfunction getUserMoveBoundaries(state: MoveSolutionState): { top: number; right: number; bottom: number; left: number } {\n const firstUserMove = state.moves[0];\n const lastUserMove = state.moves[state.moveIndex];\n if (!firstUserMove || !lastUserMove || firstUserMove.itemId !== lastUserMove.itemId) {\n throw new Error(\"Invariant violation: unexpected user move.\");\n }\n const original = getMoveOriginalRect(lastUserMove);\n const current = getMoveRect(lastUserMove);\n return {\n top: Math.min(original.top, current.top),\n right: Math.max(original.right, current.right),\n bottom: Math.max(original.bottom, current.bottom),\n left: Math.min(original.left, current.left),\n };\n}\n\n// Finds all overlaps that the move will cause along its path not considering the original location and original overlap.\nfunction getPathOverlaps(\n state: MoveSolutionState,\n move: CommittedMove,\n overlapIssuerItem: GridLayoutItem,\n): Set<GridLayoutItem> {\n const { left, right, top, bottom } = getMoveOriginalRect(move);\n const startX = move.distanceX <= 0 ? move.x : right + 1;\n const endX = move.distanceX < 0 ? left - 1 : right + move.distanceX;\n const startY = move.distanceY <= 0 ? move.y : bottom + 1;\n const endY = move.distanceY < 0 ? top - 1 : bottom + move.distanceY;\n\n const pathOverlaps = new Set(\n state.grid.getOverlaps({\n id: move.itemId,\n x: startX,\n width: 1 + endX - startX,\n y: startY,\n height: 1 + endY - startY,\n }),\n );\n pathOverlaps.delete(overlapIssuerItem);\n\n return pathOverlaps;\n}\n\n// Checks if the overlap move is a swap with the user-moved item.\nfunction checkIfSwap(overlapMove: CommittedMove, lastIssuerMove: CommittedMove): boolean {\n if (lastIssuerMove.type !== \"MOVE\") {\n return false;\n }\n if (!checkOppositeDirections(overlapMove.direction, lastIssuerMove.direction)) {\n return false;\n }\n const overlapRect = getMoveOriginalRect(overlapMove);\n const issuerRect = getMoveRect(lastIssuerMove);\n switch (lastIssuerMove.direction) {\n case \"up\":\n return overlapRect.top === issuerRect.top;\n case \"right\":\n return overlapRect.right === issuerRect.right;\n case \"down\":\n return overlapRect.bottom === issuerRect.bottom;\n case \"left\":\n return overlapRect.left === issuerRect.left;\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine-step.js","sourceRoot":"","sources":["../../../../src/internal/layout-engine/engine-step.ts"],"names":[],"mappings":"AAAA,qEAAqE;AACrE,sCAAsC;AAEtC,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAC7C,OAAO,EAAgB,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAIvF,OAAO,EAAE,sBAAsB,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,uFAAuF;AACvF,wFAAwF;AACxF,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAE/B,sFAAsF;AACtF,sGAAsG;AACtG,uCAAuC;AACvC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAE7B;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,WAA8B,EAAE,QAAuB;IACrF,+DAA+D;IAC/D,oHAAoH;IACpH,qHAAqH;IACrH,+EAA+E;IAC/E,MAAM,SAAS,GAAG,aAAa,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IAEnF,gHAAgH;IAChH,oHAAoH;IACpH,kHAAkH;IAClH,0EAA0E;IAC1E,+GAA+G;IAC/G,MAAM,YAAY,GAAG,IAAI,iBAAiB,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC3F,MAAM,eAAe,GAAiB,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;IAE/D,uHAAuH;IACvH,mHAAmH;IACnH,yEAAyE;IACzE,sGAAsG;IACtG,MAAM,cAAc,GAAG,IAAI,GAAG,EAAwB,CAAC;IACvD,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,CAAe,EAAE,EAAE,CACrD,GAAG,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;IAEnE,IAAI,aAAa,GAAmB,CAAC,eAAe,CAAC,CAAC;IACtD,IAAI,YAAY,GAA6B,IAAI,CAAC;IAClD,IAAI,kBAAkB,GAAG,kBAAkB,CAAC;IAE5C,yFAAyF;IACzF,+FAA+F;IAC/F,qDAAqD;IACrD,2FAA2F;IAC3F,OAAO,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE;QAC/B,IAAI,aAAa,GAAmB,EAAE,CAAC;QAEvC,KAAK,IAAI,aAAa,GAAG,CAAC,EAAE,aAAa,GAAG,IAAI,CAAC,GAAG,CAAC,kBAAkB,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,aAAa,EAAE,EAAE;YAC/G,MAAM,CAAC,aAAa,EAAE,YAAY,CAAC,GAAG,aAAa,CAAC,aAAa,CAAC,CAAC;YAEnE,kHAAkH;YAClH,IAAI,YAAY,IAAI,aAAa,CAAC,KAAK,GAAG,YAAY,CAAC,KAAK,IAAI,YAAY,CAAC,KAAK,EAAE;gBAClF,SAAS;aACV;YAED,8EAA8E;YAC9E,QAAQ,CAAC,aAAa,EAAE,YAAY,CAAC,CAAC;YAEtC,gFAAgF;YAChF,wEAAwE;YACxE,IAAI,aAAa,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,EAAE;gBACrC,YAAY,GAAG,aAAa,CAAC;aAC9B;YACD,yGAAyG;YACzG,kDAAkD;iBAC7C;gBACH,KAAK,MAAM,YAAY,IAAI,iBAAiB,CAAC,aAAa,CAAC,EAAE;oBAC3D,MAAM,WAAW,GAAG,cAAc,CAAC,YAAY,CAAC,CAAC;oBACjD,MAAM,cAAc,GAAG,cAAc,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;oBACvD,IAAI,CAAC,cAAc,EAAE;wBACnB,aAAa,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;wBACjC,cAAc,CAAC,GAAG,CAAC,WAAW,EAAE,YAAY,CAAC,CAAC;qBAC/C;iBACF;aACF;SACF;QAED,yGAAyG;QACzG,aAAa,GAAG,aAAa,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACxG,aAAa,GAAG,EAAE,CAAC;QAEnB,oHAAoH;QACpH,iGAAiG;QACjG,mGAAmG;QACnG,kBAAkB,EAAE,CAAC;QACrB,IAAI,kBAAkB,IAAI,CAAC,EAAE;YAC3B,MAAM;SACP;KACF;IAED,qGAAqG;IACrG,uGAAuG;IACvG,+GAA+G;IAC/G,iHAAiH;IACjH,kHAAkH;IAClH,gHAAgH;IAChH,IAAI,CAAC,YAAY,EAAE;QACjB,YAAY,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,mBAAmB,CAAC,YAAY,CAAC,CAAC;KAC1F;IAED,+FAA+F;IAC/F,iGAAiG;IACjG,OAAO,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,WAAW,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;AACrF,CAAC;AAED,sGAAsG;AACtG,SAAS,mBAAmB,CAAC,KAAwB;IACnD,sFAAsF;IACtF,6FAA6F;IAC7F,OAAO,KAAK,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE;QAC9B,MAAM,QAAQ,GAAG,aAAa,CAAC,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACxG,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;YAC9B,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC;YACtB,OAAO,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,GAAG,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;gBAC3D,CAAC,EAAE,CAAC;aACL;YACD,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC,SAAS,EAAE,OAAO,EAAE,IAAI,QAAQ,CAAC,EAAE,CAAC,EAAE,OAAO,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;SACpF;KACF;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,wEAAwE;AACxE,SAAS,WAAW,CAAC,WAA8B,EAAE,QAAwB;IAC3E,MAAM,KAAK,GAAG,IAAI,iBAAiB,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,CAAC,KAAK,EAAE,WAAW,CAAC,SAAS,CAAC,CAAC;IAEhG,SAAS,WAAW;QAClB,IAAI,kBAAkB,GAAG,KAAK,CAAC;QAE/B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE;YACnC,+DAA+D;YAC/D,IAAI,IAAI,CAAC,EAAE,MAAK,QAAQ,aAAR,QAAQ,uBAAR,QAAQ,CAAE,MAAM,CAAA,EAAE;gBAChC,SAAS;aACV;YAED,IAAI,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC;YACnB,IAAI,IAAI,GAAyB,IAAI,CAAC;YACtC,OAAO,CAAC,IAAI,CAAC,EAAE;gBACb,MAAM,WAAW,GAAG,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,QAAQ,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;gBAC9E,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,WAAW,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;oBACtE,MAAM;iBACP;gBACD,CAAC,EAAE,CAAC;gBACJ,IAAI,GAAG,WAAW,CAAC;aACpB;YACD,IAAI,IAAI,EAAE;gBACR,QAAQ,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;gBACtB,kBAAkB,GAAG,IAAI,CAAC;aAC3B;SACF;QAED,IAAI,kBAAkB,EAAE;YACtB,WAAW,EAAE,CAAC;SACf;IACH,CAAC;IAED,WAAW,EAAE,CAAC;IAEd,OAAO,KAAK,CAAC;AACf,CAAC;AAED,kHAAkH;AAClH,SAAS,aAAa,CACpB,IAA8B,EAC9B,iBAAmC,EACnC,QAAuB;;IAEvB,+EAA+E;IAC/E,IAAI,QAAQ,CAAC,IAAI,KAAK,MAAM,EAAE;QAC5B,OAAO,IAAI,CAAC;KACb;IACD,oGAAoG;IACpG,uGAAuG;IACvG,MAAM,SAAS,GAAG,MAAA,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,SAAS,mCAAI,QAAQ,CAAC,SAAS,CAAC;IACrE,sGAAsG;IACtG,iCAAiC;IACjC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,GAAG,QAAQ,EAAE,EAAE,EAAE,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;IACxE,MAAM,SAAS,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,OAAO,EAAE,EAAE;QAC5C,QAAQ,SAAS,EAAE;YACjB,KAAK,MAAM;gBACT,OAAO,OAAO,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;YAChC,KAAK,OAAO;gBACV,OAAO,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,KAAK,GAAG,CAAC,CAAC;YACzE,KAAK,IAAI;gBACP,OAAO,OAAO,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC;YAChC,KAAK,MAAM;gBACT,OAAO,OAAO,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC,GAAG,QAAQ,CAAC,MAAM,GAAG,CAAC,CAAC;SAC5E;IACH,CAAC,CAAC,CAAC;IACH,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;QACxB,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;KACxE;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,6FAA6F;AAC7F,SAAS,QAAQ,CAAC,KAAwB,EAAE,QAAuB;IACjE,kBAAkB,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IACpC,cAAc,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAChC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3B,KAAK,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC;AAChC,CAAC;AAED,SAAS,kBAAkB,CAAC,EAAE,IAAI,EAAqB,EAAE,IAAmB;IAC1E,QAAQ,IAAI,CAAC,IAAI,EAAE;QACjB,KAAK,MAAM,CAAC;QACZ,KAAK,SAAS,CAAC;QACf,KAAK,OAAO;YACV,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC;QAChD,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QACnD,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClC,KAAK,QAAQ;YACX,OAAO,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;KAC5D;AACH,CAAC;AAED,SAAS,cAAc,CAAC,KAAwB,EAAE,IAAmB;;IACnE,0FAA0F;IAC1F,4DAA4D;IAC5D,KAAK,MAAM,UAAU,IAAI,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,GAAG,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE;QAC7E,IAAI,CAAC,CAAA,MAAA,KAAK,CAAC,SAAS,0CAAE,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA,EAAE;YAC9C,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;SAChD;KACF;IACD,+DAA+D;IAC/D,KAAK,MAAM,CAAC,SAAS,EAAE,eAAe,CAAC,IAAI,KAAK,CAAC,QAAQ,EAAE;QACzD,IAAI,CAAC,sBAAsB,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,EAAE;YAC/F,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;SAClC;KACF;AACH,CAAC","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Position } from \"../utils/position\";\nimport { MoveSolution, MoveSolutionState, findNextSolutions } from \"./engine-solution\";\nimport { Conflicts, LayoutEngineState } from \"./engine-state\";\nimport { ReadonlyLayoutEngineGrid } from \"./grid\";\nimport { CommittedMove } from \"./interfaces\";\nimport { checkItemsIntersection, sortGridItems } from \"./utils\";\nimport { createMove } from \"./utils\";\n\n// The solutions can't be searched for infinitely in case the algorithm can't converge.\n// The safety counter ensures there is going to be user feedback within reasonable time.\nconst MAX_SOLUTION_DEPTH = 100;\n\n// At any given step only a few best solutions are taken to ensure faster convergence.\n// The larger the number the better chance the most optimal solution is found for the given priorities\n// at a cost of more computations made.\nconst NUM_BEST_SOLUTIONS = 5;\n\n/**\n * The function takes the current layout state (item placements from the previous steps and all moves done so far)\n * and a user command increment that describes an item transition by one cell in some direction.\n * The function finds overlapping elements and resolves all overlaps if possible (always possible when no conflicts).\n * The result in an updated state (new item placements, additional moves, and item conflicts if any).\n */\nexport function resolveOverlaps(layoutState: LayoutEngineState, userMove: CommittedMove): LayoutEngineState {\n // For better UX the layout engine is optimized for item swaps.\n // The swapping is only preferred for the user-controlled item and it can only happen when the item overlaps another\n // item past its midpoint. When the overlap is not enough, the underlying item is considered a conflict and it is not\n // allowed to move anywhere. The user command cannot be committed at this step.\n const conflicts = findConflicts(layoutState.grid, layoutState.conflicts, userMove);\n\n // The user moves are always applied as is. When the user-controlled item overlaps with other items and there is\n // no conflict, the type=\"OVERLAP\" moves are performed to settle the grid so that no items overlap with one another.\n // For this type of move multiple solutions are often available. To ensure the best result all solutions are tried\n // and a score is given to each. The solution with the minimal score wins.\n // The process stars from the initial state and the user move. The initial score and the user move score are 0.\n const initialState = new MoveSolutionState(layoutState.grid, layoutState.moves, conflicts);\n const initialSolution: MoveSolution = [initialState, userMove];\n\n // All solutions are guaranteed to have unique move sequences but different move sequences can produce the same result.\n // As it is never expected for one item to be moved over to the same location twice the combination of the item ID,\n // item position, and solution score can uniquely represent the solution.\n // For earlier moves taking a solution from the cache can prevent hundreds of subsequent computations.\n const solutionsCache = new Map<string, MoveSolution>();\n const createCacheKey = ([state, move]: MoveSolution) =>\n `${move.itemId} ${move.x}:${move.y}:${state.score + move.score}`;\n\n let moveSolutions: MoveSolution[] = [initialSolution];\n let bestSolution: null | MoveSolutionState = null;\n let convergenceCounter = MAX_SOLUTION_DEPTH;\n\n // The resolution process continues until there is at least one reasonable solution left.\n // The repetitive, dead-end, and expensive (compared to the best so far) solutions are excluded\n // so that eventually no more variants to try remain.\n // The convergence safety counter ensures the logical errors to not cause an infinite loop.\n while (moveSolutions.length > 0) {\n let nextSolutions: MoveSolution[] = [];\n\n for (let solutionIndex = 0; solutionIndex < Math.min(NUM_BEST_SOLUTIONS, moveSolutions.length); solutionIndex++) {\n const [solutionState, solutionMove] = moveSolutions[solutionIndex];\n\n // Discard the solution before performing the move if its next score is already above the best score found so far.\n if (bestSolution && solutionState.score + solutionMove.score >= bestSolution.score) {\n continue;\n }\n\n // Perform the move by mutating the solution's state: grid, moves, score, etc.\n makeMove(solutionState, solutionMove);\n\n // If no overlaps are left the solution is considered valid and the best so far.\n // The next solutions having the same or higher score will be discarded.\n if (solutionState.overlaps.size === 0) {\n bestSolution = solutionState;\n }\n // Otherwise, the next set of solutions will be considered. There can be up to four solutions per overlap\n // (by the number of possible directions to move).\n else {\n for (const nextSolution of findNextSolutions(solutionState)) {\n const solutionKey = createCacheKey(nextSolution);\n const cachedSolution = solutionsCache.get(solutionKey);\n if (!cachedSolution) {\n nextSolutions.push(nextSolution);\n solutionsCache.set(solutionKey, nextSolution);\n }\n }\n }\n }\n\n // The solutions are ordered by the total score so that the best (so far) solutions are considered first.\n moveSolutions = nextSolutions.sort((s1, s2) => s1[0].score + s1[1].score - (s2[0].score + s2[1].score));\n nextSolutions = [];\n\n // Reaching the convergence counter might indicate an issue with the algorithm as ideally it should converge faster.\n // However, that does not necessarily mean the logical problem and no exception should be thrown.\n // Instead, the current best solution if available applies or a simple solution is offered instead.\n convergenceCounter--;\n if (convergenceCounter <= 0) {\n break;\n }\n }\n\n // If there are conflicts it might not be possible to find a solution as the items are not allowed to\n // overlap with the conflicts. In that case the initial state (with the user move applied) is returned.\n // The user can move the item further to resolve the conflicts which will also unblock the overlaps resolution.\n // Also, the solution might not be found due to the engine constraints. For example, the convergence number might\n // be reached before any solution is found or the number of best solutions constraint can filter the only possible\n // solutions away. In that case the simple solution is returned with all overlapping items pushed to the bottom.\n if (!bestSolution) {\n bestSolution = initialState.conflicts ? initialState : resolveOverlapsDown(initialState);\n }\n\n // After each step unless there are conflicts the type=\"FLOAT\" moves are performed on all items\n // but the user controlled one that can be moved to the top without overlapping with other items.\n return bestSolution.conflicts ? bestSolution : refloatGrid(bestSolution, userMove);\n}\n\n// Resolves overlaps the simple way by pushing all overlapping items to the bottom until none is left.\nfunction resolveOverlapsDown(state: MoveSolutionState): MoveSolutionState {\n // Move overlapping items to the bottom until resolved. Repeat until no overlaps left.\n // This solution always converges because there is always free space at the bottom by design.\n while (state.overlaps.size > 0) {\n const overlaps = sortGridItems([...state.overlaps].map(([overlapId]) => state.grid.getItem(overlapId)));\n for (const overlap of overlaps) {\n let y = overlap.y + 1;\n while (state.grid.getOverlaps({ ...overlap, y }).length > 0) {\n y++;\n }\n makeMove(state, createMove(\"OVERLAP\", overlap, new Position({ x: overlap.x, y })));\n }\n }\n return state;\n}\n\n// Find items that can \"float\" to the top and apply the necessary moves.\nfunction refloatGrid(layoutState: LayoutEngineState, userMove?: CommittedMove): LayoutEngineState {\n const state = new MoveSolutionState(layoutState.grid, layoutState.moves, layoutState.conflicts);\n\n function makeRefloat() {\n let needAnotherRefloat = false;\n\n for (const item of state.grid.items) {\n // The active item is skipped until the operation is committed.\n if (item.id === userMove?.itemId) {\n continue;\n }\n\n let y = item.y - 1;\n let move: null | CommittedMove = null;\n while (y >= 0) {\n const moveAttempt = createMove(\"FLOAT\", item, new Position({ x: item.x, y }));\n if (state.grid.getOverlaps({ id: item.id, ...moveAttempt }).length > 0) {\n break;\n }\n y--;\n move = moveAttempt;\n }\n if (move) {\n makeMove(state, move);\n needAnotherRefloat = true;\n }\n }\n\n if (needAnotherRefloat) {\n makeRefloat();\n }\n }\n\n makeRefloat();\n\n return state;\n}\n\n// Finds items that cannot be resolved at the current step as of being partially overlapped by the user-move item.\nfunction findConflicts(\n grid: ReadonlyLayoutEngineGrid,\n previousConflicts: null | Conflicts,\n userMove: CommittedMove\n): null | Conflicts {\n // The conflicts are only defined for MOVE command type to make swaps possible.\n if (userMove.type !== \"MOVE\") {\n return null;\n }\n // Using existing conflict direction if available so that conflicting items would swap consistently.\n // If only the current direction is considered the multi-item conflicts become difficult to comprehend.\n const direction = previousConflicts?.direction ?? userMove.direction;\n // Conflicts are partial overlaps. When the item is overlapped fully (considering the direction) it is\n // no longer treated as conflict.\n const overlaps = grid.getOverlaps({ ...userMove, id: userMove.itemId });\n const conflicts = overlaps.filter((overlap) => {\n switch (direction) {\n case \"left\":\n return overlap.x < userMove.x;\n case \"right\":\n return overlap.x + overlap.width - 1 > userMove.x + userMove.width - 1;\n case \"up\":\n return overlap.y < userMove.y;\n case \"down\":\n return overlap.y + overlap.height - 1 > userMove.y + userMove.height - 1;\n }\n });\n if (conflicts.length > 0) {\n return { direction, items: new Set(conflicts.map((item) => item.id)) };\n }\n return null;\n}\n\n// Applies given move to the solution state by updating the grid, moves, overlaps, and score.\nfunction makeMove(state: MoveSolutionState, nextMove: CommittedMove): void {\n updateGridWithMove(state, nextMove);\n updateOverlaps(state, nextMove);\n state.moves.push(nextMove);\n state.score += nextMove.score;\n}\n\nfunction updateGridWithMove({ grid }: MoveSolutionState, move: CommittedMove): void {\n switch (move.type) {\n case \"MOVE\":\n case \"OVERLAP\":\n case \"FLOAT\":\n return grid.move(move.itemId, move.x, move.y);\n case \"INSERT\":\n return grid.insert({ id: move.itemId, ...move });\n case \"REMOVE\":\n return grid.remove(move.itemId);\n case \"RESIZE\":\n return grid.resize(move.itemId, move.width, move.height);\n }\n}\n\nfunction updateOverlaps(state: MoveSolutionState, move: CommittedMove) {\n // Find and assign items that will overlap with the moved item after the move is performed\n // unless the overlapping items are considered as conflicts.\n for (const newOverlap of state.grid.getOverlaps({ ...move, id: move.itemId })) {\n if (!state.conflicts?.items.has(newOverlap.id)) {\n state.overlaps.set(newOverlap.id, move.itemId);\n }\n }\n // Remove no longer valid overlaps after the move is performed.\n for (const [overlapId, overlapIssuerId] of state.overlaps) {\n if (!checkItemsIntersection(state.grid.getItem(overlapId), state.grid.getItem(overlapIssuerId))) {\n state.overlaps.delete(overlapId);\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"engine-step.js","sourceRoot":"","sources":["../../../../src/internal/layout-engine/engine-step.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Position } from \"../utils/position\";\nimport { MoveSolution, MoveSolutionState, findNextSolutions } from \"./engine-solution\";\nimport { Conflicts, LayoutEngineState } from \"./engine-state\";\nimport { ReadonlyLayoutEngineGrid } from \"./grid\";\nimport { CommittedMove } from \"./interfaces\";\nimport { checkItemsIntersection, sortGridItems } from \"./utils\";\nimport { createMove } from \"./utils\";\n\n// The solutions can't be searched for infinitely in case the algorithm can't converge.\n// The safety counter ensures there is going to be user feedback within reasonable time.\nconst MAX_SOLUTION_DEPTH = 100;\n\n// At any given step only a few best solutions are taken to ensure faster convergence.\n// The larger the number the better chance the most optimal solution is found for the given priorities\n// at a cost of more computations made.\nconst NUM_BEST_SOLUTIONS = 5;\n\n/**\n * The function takes the current layout state (item placements from the previous steps and all moves done so far)\n * and a user command increment that describes an item transition by one cell in some direction.\n * The function finds overlapping elements and resolves all overlaps if possible (always possible when no conflicts).\n * The result in an updated state (new item placements, additional moves, and item conflicts if any).\n */\nexport function resolveOverlaps(layoutState: LayoutEngineState, userMove: CommittedMove): LayoutEngineState {\n // For better UX the layout engine is optimized for item swaps.\n // The swapping is only preferred for the user-controlled item and it can only happen when the item overlaps another\n // item past its midpoint. When the overlap is not enough, the underlying item is considered a conflict and it is not\n // allowed to move anywhere. The user command cannot be committed at this step.\n const conflicts = findConflicts(layoutState.grid, layoutState.conflicts, userMove);\n\n // The user moves are always applied as is. When the user-controlled item overlaps with other items and there is\n // no conflict, the type=\"OVERLAP\" moves are performed to settle the grid so that no items overlap with one another.\n // For this type of move multiple solutions are often available. To ensure the best result all solutions are tried\n // and a score is given to each. The solution with the minimal score wins.\n // The process stars from the initial state and the user move. The initial score and the user move score are 0.\n const initialState = new MoveSolutionState(layoutState.grid, layoutState.moves, conflicts);\n const initialSolution: MoveSolution = [initialState, userMove];\n\n // All solutions are guaranteed to have unique move sequences but different move sequences can produce the same result.\n // As it is never expected for one item to be moved over to the same location twice the combination of the item ID,\n // item position, and solution score can uniquely represent the solution.\n // For earlier moves taking a solution from the cache can prevent hundreds of subsequent computations.\n const solutionsCache = new Map<string, MoveSolution>();\n const createCacheKey = ([state, move]: MoveSolution) =>\n `${move.itemId} ${move.x}:${move.y}:${state.score + move.score}`;\n\n let moveSolutions: MoveSolution[] = [initialSolution];\n let bestSolution: null | MoveSolutionState = null;\n let convergenceCounter = MAX_SOLUTION_DEPTH;\n\n // The resolution process continues until there is at least one reasonable solution left.\n // The repetitive, dead-end, and expensive (compared to the best so far) solutions are excluded\n // so that eventually no more variants to try remain.\n // The convergence safety counter ensures the logical errors to not cause an infinite loop.\n while (moveSolutions.length > 0) {\n let nextSolutions: MoveSolution[] = [];\n\n for (let solutionIndex = 0; solutionIndex < Math.min(NUM_BEST_SOLUTIONS, moveSolutions.length); solutionIndex++) {\n const [solutionState, solutionMove] = moveSolutions[solutionIndex];\n\n // Discard the solution before performing the move if its next score is already above the best score found so far.\n if (bestSolution && solutionState.score + solutionMove.score >= bestSolution.score) {\n continue;\n }\n\n // Perform the move by mutating the solution's state: grid, moves, score, etc.\n makeMove(solutionState, solutionMove);\n\n // If no overlaps are left the solution is considered valid and the best so far.\n // The next solutions having the same or higher score will be discarded.\n if (solutionState.overlaps.size === 0) {\n bestSolution = solutionState;\n }\n // Otherwise, the next set of solutions will be considered. There can be up to four solutions per overlap\n // (by the number of possible directions to move).\n else {\n for (const nextSolution of findNextSolutions(solutionState)) {\n const solutionKey = createCacheKey(nextSolution);\n const cachedSolution = solutionsCache.get(solutionKey);\n if (!cachedSolution) {\n nextSolutions.push(nextSolution);\n solutionsCache.set(solutionKey, nextSolution);\n }\n }\n }\n }\n\n // The solutions are ordered by the total score so that the best (so far) solutions are considered first.\n moveSolutions = nextSolutions.sort((s1, s2) => s1[0].score + s1[1].score - (s2[0].score + s2[1].score));\n nextSolutions = [];\n\n // Reaching the convergence counter might indicate an issue with the algorithm as ideally it should converge faster.\n // However, that does not necessarily mean the logical problem and no exception should be thrown.\n // Instead, the current best solution if available applies or a simple solution is offered instead.\n convergenceCounter--;\n if (convergenceCounter <= 0) {\n break;\n }\n }\n\n // If there are conflicts it might not be possible to find a solution as the items are not allowed to\n // overlap with the conflicts. In that case the initial state (with the user move applied) is returned.\n // The user can move the item further to resolve the conflicts which will also unblock the overlaps resolution.\n // Also, the solution might not be found due to the engine constraints. For example, the convergence number might\n // be reached before any solution is found or the number of best solutions constraint can filter the only possible\n // solutions away. In that case the simple solution is returned with all overlapping items pushed to the bottom.\n if (!bestSolution) {\n bestSolution = initialState.conflicts ? initialState : resolveOverlapsDown(initialState);\n }\n\n // After each step unless there are conflicts the type=\"FLOAT\" moves are performed on all items\n // but the user controlled one that can be moved to the top without overlapping with other items.\n return bestSolution.conflicts ? bestSolution : refloatGrid(bestSolution, userMove);\n}\n\n// Resolves overlaps the simple way by pushing all overlapping items to the bottom until none is left.\nfunction resolveOverlapsDown(state: MoveSolutionState): MoveSolutionState {\n // Move overlapping items to the bottom until resolved. Repeat until no overlaps left.\n // This solution always converges because there is always free space at the bottom by design.\n while (state.overlaps.size > 0) {\n const overlaps = sortGridItems([...state.overlaps].map(([overlapId]) => state.grid.getItem(overlapId)));\n for (const overlap of overlaps) {\n let y = overlap.y + 1;\n while (state.grid.getOverlaps({ ...overlap, y }).length > 0) {\n y++;\n }\n makeMove(state, createMove(\"OVERLAP\", overlap, new Position({ x: overlap.x, y })));\n }\n }\n return state;\n}\n\n// Find items that can \"float\" to the top and apply the necessary moves.\nfunction refloatGrid(layoutState: LayoutEngineState, userMove?: CommittedMove): LayoutEngineState {\n const state = new MoveSolutionState(layoutState.grid, layoutState.moves, layoutState.conflicts);\n\n function makeRefloat() {\n let needAnotherRefloat = false;\n\n for (const item of state.grid.items) {\n // The active item is skipped until the operation is committed.\n if (item.id === userMove?.itemId) {\n continue;\n }\n\n let y = item.y - 1;\n let move: null | CommittedMove = null;\n while (y >= 0) {\n const moveAttempt = createMove(\"FLOAT\", item, new Position({ x: item.x, y }));\n if (state.grid.getOverlaps({ id: item.id, ...moveAttempt }).length > 0) {\n break;\n }\n y--;\n move = moveAttempt;\n }\n if (move) {\n makeMove(state, move);\n needAnotherRefloat = true;\n }\n }\n\n if (needAnotherRefloat) {\n makeRefloat();\n }\n }\n\n makeRefloat();\n\n return state;\n}\n\n// Finds items that cannot be resolved at the current step as of being partially overlapped by the user-move item.\nfunction findConflicts(\n grid: ReadonlyLayoutEngineGrid,\n previousConflicts: null | Conflicts,\n userMove: CommittedMove,\n): null | Conflicts {\n // The conflicts are only defined for MOVE command type to make swaps possible.\n if (userMove.type !== \"MOVE\") {\n return null;\n }\n // Using existing conflict direction if available so that conflicting items would swap consistently.\n // If only the current direction is considered the multi-item conflicts become difficult to comprehend.\n const direction = previousConflicts?.direction ?? userMove.direction;\n // Conflicts are partial overlaps. When the item is overlapped fully (considering the direction) it is\n // no longer treated as conflict.\n const overlaps = grid.getOverlaps({ ...userMove, id: userMove.itemId });\n const conflicts = overlaps.filter((overlap) => {\n switch (direction) {\n case \"left\":\n return overlap.x < userMove.x;\n case \"right\":\n return overlap.x + overlap.width - 1 > userMove.x + userMove.width - 1;\n case \"up\":\n return overlap.y < userMove.y;\n case \"down\":\n return overlap.y + overlap.height - 1 > userMove.y + userMove.height - 1;\n }\n });\n if (conflicts.length > 0) {\n return { direction, items: new Set(conflicts.map((item) => item.id)) };\n }\n return null;\n}\n\n// Applies given move to the solution state by updating the grid, moves, overlaps, and score.\nfunction makeMove(state: MoveSolutionState, nextMove: CommittedMove): void {\n updateGridWithMove(state, nextMove);\n updateOverlaps(state, nextMove);\n state.moves.push(nextMove);\n state.score += nextMove.score;\n}\n\nfunction updateGridWithMove({ grid }: MoveSolutionState, move: CommittedMove): void {\n switch (move.type) {\n case \"MOVE\":\n case \"OVERLAP\":\n case \"FLOAT\":\n return grid.move(move.itemId, move.x, move.y);\n case \"INSERT\":\n return grid.insert({ id: move.itemId, ...move });\n case \"REMOVE\":\n return grid.remove(move.itemId);\n case \"RESIZE\":\n return grid.resize(move.itemId, move.width, move.height);\n }\n}\n\nfunction updateOverlaps(state: MoveSolutionState, move: CommittedMove) {\n // Find and assign items that will overlap with the moved item after the move is performed\n // unless the overlapping items are considered as conflicts.\n for (const newOverlap of state.grid.getOverlaps({ ...move, id: move.itemId })) {\n if (!state.conflicts?.items.has(newOverlap.id)) {\n state.overlaps.set(newOverlap.id, move.itemId);\n }\n }\n // Remove no longer valid overlaps after the move is performed.\n for (const [overlapId, overlapIssuerId] of state.overlaps) {\n if (!checkItemsIntersection(state.grid.getItem(overlapId), state.grid.getItem(overlapIssuerId))) {\n state.overlaps.delete(overlapId);\n }\n }\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/internal/layout-engine/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Direction, GridLayoutItem } from \"../interfaces\";\nimport { Position } from \"../utils/position\";\nimport { CommittedMove } from \"./interfaces\";\n\nexport interface Rect {\n left: number;\n right: number;\n top: number;\n bottom: number;\n}\n\nexport function sortGridItems(items: GridLayoutItem[]): readonly GridLayoutItem[] {\n return items.sort((a, b) => (b.y - a.y === 0 ? b.x - a.x : b.y - a.y));\n}\n\nexport function normalizeMovePath(origin: Position, path: readonly Position[]): readonly Position[] {\n path = normalizePathOrigin(origin, path);\n\n // Store last visited indexes per position.\n const positionToLastIndex = new Map<string, number>();\n for (let index = 0; index < path.length; index++) {\n positionToLastIndex.set(`${path[index].x}:${path[index].y}`, index);\n }\n\n // Compose path from last visited indices only.\n const normalizedPath: Position[] = [];\n let index = 0;\n while (index < path.length) {\n const lastVisitedIndex = positionToLastIndex.get(`${path[index].x}:${path[index].y}`)!;\n normalizedPath.push(path[lastVisitedIndex]);\n index = lastVisitedIndex + 1;\n }\n\n return normalizePathSteps(origin, normalizedPath);\n}\n\nexport function normalizeResizePath(origin: Position, path: readonly Position[]): readonly Position[] {\n path = normalizePathOrigin(origin, path);\n\n if (path.length === 0) {\n return [];\n }\n\n const normalizedPath: Position[] = [path[path.length - 1]];\n for (let stepIndex = path.length - 2; stepIndex >= 0; stepIndex--) {\n const prev = normalizedPath[normalizedPath.length - 1];\n const current = path[stepIndex];\n if (current.x < prev.x || current.y < prev.y) {\n normalizedPath.push(current);\n }\n }\n normalizedPath.reverse();\n\n return normalizePathSteps(origin, normalizedPath);\n}\n\nexport function createMove(\n type: CommittedMove[\"type\"],\n item: GridLayoutItem,\n next: Position,\n score = 0\n): CommittedMove {\n const distanceX = type === \"RESIZE\" ? next.x - item.width : next.x - item.x;\n const distanceY = type === \"RESIZE\" ? next.y - item.height : next.y - item.y;\n return {\n type,\n itemId: item.id,\n x: type !== \"RESIZE\" ? next.x : item.x,\n y: type !== \"RESIZE\" ? next.y : item.y,\n width: type === \"RESIZE\" ? next.x : item.width,\n height: type === \"RESIZE\" ? next.y : item.height,\n direction: distanceX > 0 ? \"right\" : distanceX < 0 ? \"left\" : distanceY < 0 ? \"up\" : \"down\",\n distanceX,\n distanceY,\n score,\n };\n}\n\nexport function getMoveOriginalRect(move: CommittedMove): Rect {\n return {\n left: move.x - move.distanceX,\n right: move.x - move.distanceX + move.width - 1,\n top: move.y - move.distanceY,\n bottom: move.y - move.distanceY + move.height - 1,\n };\n}\n\nexport function getMoveRect(move: CommittedMove): Rect {\n return {\n left: move.x,\n right: move.x + move.width - 1,\n top: move.y,\n bottom: move.y + move.height - 1,\n };\n}\n\nexport function checkItemsIntersection(i1: GridLayoutItem, i2: GridLayoutItem): boolean {\n if (i1.id === i2.id) {\n return false;\n }\n return (\n i1.x <= i2.x + i2.width - 1 &&\n i2.x <= i1.x + i1.width - 1 &&\n i1.y <= i2.y + i2.height - 1 &&\n i2.y <= i1.y + i1.height - 1\n );\n}\n\nexport function checkOppositeDirections(d1: Direction, d2: Direction): boolean {\n return (\n (d1 === \"down\" && d2 === \"up\") ||\n (d1 === \"up\" && d2 === \"down\") ||\n (d1 === \"left\" && d2 === \"right\") ||\n (d1 === \"right\" && d2 === \"left\")\n );\n}\n\n// Removes path prefixes that return to the original location.\nfunction normalizePathOrigin(origin: Position, path: readonly Position[]): readonly Position[] {\n let lastOriginIndex = -1;\n for (let i = 0; i < path.length; i++) {\n if (path[i].x === origin.x && path[i].y === origin.y) {\n lastOriginIndex = i;\n }\n }\n return path.slice(lastOriginIndex + 1);\n}\n\n// Ensures path only includes single-length steps.\nfunction normalizePathSteps(origin: Position, path: readonly Position[]): readonly Position[] {\n const normalizedPath: Position[] = [];\n\n let prevX = origin.x;\n let prevY = origin.y;\n\n for (const step of path) {\n const vx = Math.sign(step.x - prevX);\n const vy = Math.sign(step.y - prevY);\n\n for (let x = prevX, y = prevY; x !== step.x || y !== step.y; ) {\n if (x !== step.x) {\n x += vx;\n } else {\n y += vy;\n }\n normalizedPath.push(new Position({ x, y }));\n }\n\n prevX = step.x;\n prevY = step.y;\n }\n\n return normalizedPath;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../src/internal/layout-engine/utils.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { Direction, GridLayoutItem } from \"../interfaces\";\nimport { Position } from \"../utils/position\";\nimport { CommittedMove } from \"./interfaces\";\n\nexport interface Rect {\n left: number;\n right: number;\n top: number;\n bottom: number;\n}\n\nexport function sortGridItems(items: GridLayoutItem[]): readonly GridLayoutItem[] {\n return items.sort((a, b) => (b.y - a.y === 0 ? b.x - a.x : b.y - a.y));\n}\n\nexport function normalizeMovePath(origin: Position, path: readonly Position[]): readonly Position[] {\n path = normalizePathOrigin(origin, path);\n\n // Store last visited indexes per position.\n const positionToLastIndex = new Map<string, number>();\n for (let index = 0; index < path.length; index++) {\n positionToLastIndex.set(`${path[index].x}:${path[index].y}`, index);\n }\n\n // Compose path from last visited indices only.\n const normalizedPath: Position[] = [];\n let index = 0;\n while (index < path.length) {\n const lastVisitedIndex = positionToLastIndex.get(`${path[index].x}:${path[index].y}`)!;\n normalizedPath.push(path[lastVisitedIndex]);\n index = lastVisitedIndex + 1;\n }\n\n return normalizePathSteps(origin, normalizedPath);\n}\n\nexport function normalizeResizePath(origin: Position, path: readonly Position[]): readonly Position[] {\n path = normalizePathOrigin(origin, path);\n\n if (path.length === 0) {\n return [];\n }\n\n const normalizedPath: Position[] = [path[path.length - 1]];\n for (let stepIndex = path.length - 2; stepIndex >= 0; stepIndex--) {\n const prev = normalizedPath[normalizedPath.length - 1];\n const current = path[stepIndex];\n if (current.x < prev.x || current.y < prev.y) {\n normalizedPath.push(current);\n }\n }\n normalizedPath.reverse();\n\n return normalizePathSteps(origin, normalizedPath);\n}\n\nexport function createMove(\n type: CommittedMove[\"type\"],\n item: GridLayoutItem,\n next: Position,\n score = 0,\n): CommittedMove {\n const distanceX = type === \"RESIZE\" ? next.x - item.width : next.x - item.x;\n const distanceY = type === \"RESIZE\" ? next.y - item.height : next.y - item.y;\n return {\n type,\n itemId: item.id,\n x: type !== \"RESIZE\" ? next.x : item.x,\n y: type !== \"RESIZE\" ? next.y : item.y,\n width: type === \"RESIZE\" ? next.x : item.width,\n height: type === \"RESIZE\" ? next.y : item.height,\n direction: distanceX > 0 ? \"right\" : distanceX < 0 ? \"left\" : distanceY < 0 ? \"up\" : \"down\",\n distanceX,\n distanceY,\n score,\n };\n}\n\nexport function getMoveOriginalRect(move: CommittedMove): Rect {\n return {\n left: move.x - move.distanceX,\n right: move.x - move.distanceX + move.width - 1,\n top: move.y - move.distanceY,\n bottom: move.y - move.distanceY + move.height - 1,\n };\n}\n\nexport function getMoveRect(move: CommittedMove): Rect {\n return {\n left: move.x,\n right: move.x + move.width - 1,\n top: move.y,\n bottom: move.y + move.height - 1,\n };\n}\n\nexport function checkItemsIntersection(i1: GridLayoutItem, i2: GridLayoutItem): boolean {\n if (i1.id === i2.id) {\n return false;\n }\n return (\n i1.x <= i2.x + i2.width - 1 &&\n i2.x <= i1.x + i1.width - 1 &&\n i1.y <= i2.y + i2.height - 1 &&\n i2.y <= i1.y + i1.height - 1\n );\n}\n\nexport function checkOppositeDirections(d1: Direction, d2: Direction): boolean {\n return (\n (d1 === \"down\" && d2 === \"up\") ||\n (d1 === \"up\" && d2 === \"down\") ||\n (d1 === \"left\" && d2 === \"right\") ||\n (d1 === \"right\" && d2 === \"left\")\n );\n}\n\n// Removes path prefixes that return to the original location.\nfunction normalizePathOrigin(origin: Position, path: readonly Position[]): readonly Position[] {\n let lastOriginIndex = -1;\n for (let i = 0; i < path.length; i++) {\n if (path[i].x === origin.x && path[i].y === origin.y) {\n lastOriginIndex = i;\n }\n }\n return path.slice(lastOriginIndex + 1);\n}\n\n// Ensures path only includes single-length steps.\nfunction normalizePathSteps(origin: Position, path: readonly Position[]): readonly Position[] {\n const normalizedPath: Position[] = [];\n\n let prevX = origin.x;\n let prevY = origin.y;\n\n for (const step of path) {\n const vx = Math.sign(step.x - prevX);\n const vy = Math.sign(step.y - prevY);\n\n for (let x = prevX, y = prevY; x !== step.x || y !== step.y; ) {\n if (x !== step.x) {\n x += vx;\n } else {\n y += vy;\n }\n normalizedPath.push(new Position({ x, y }));\n }\n\n prevX = step.x;\n prevY = step.y;\n }\n\n return normalizedPath;\n}\n"]}
|
package/internal/manifest.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../../src/internal/utils/layout.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { MIN_COL_SPAN, MIN_ROW_SPAN } from \"../constants\";\nimport { BoardItemDefinition, GridLayout, GridLayoutItem, ItemId } from \"../interfaces\";\n\ntype Item<D = unknown> = BoardItemDefinition<D>;\n\n/**\n * The function produces grid layout from board items and given number of columns.\n * The positional data is taken from the items when available or the default placement is used otherwise.\n */\nexport function interpretItems(items: readonly Item[], columns: number): GridLayout {\n const layoutItems: GridLayoutItem[] = [];\n const columnHeights = Array(columns).fill(0);\n\n function getColumnSpan(item: Item): number {\n const minColumnSpan = getMinColumnSpan(item, columns);\n const columnSpan = item.columnSpan ?? getDefaultColumnSpan(item, columns);\n return Math.min(columns, Math.max(minColumnSpan, columnSpan));\n }\n\n function getRowSpan(item: Item): number {\n const minRowSpan = getMinRowSpan(item);\n const rowSpan = item.rowSpan ?? getDefaultRowSpan(item);\n return Math.max(minRowSpan, rowSpan);\n }\n\n function getColumnOffset(item: Item, currentOffset: number): number {\n const columnSpan = getColumnSpan(item);\n const rowSpan = getRowSpan(item);\n const columnOffset = item.columnOffset?.[columns] ?? findOptimalColumnOffset(currentOffset, columnSpan, rowSpan);\n return columnOffset + columnSpan <= columns ? columnOffset : 0;\n }\n\n function findOptimalColumnOffset(currentColumnOffset: number, columnSpan: number, rowSpan: number): number {\n for (let colOffset = currentColumnOffset; colOffset + columnSpan <= columns; colOffset++) {\n if (getRowOffset(colOffset, columnSpan) + rowSpan <= getRowOffset(0, columns)) {\n return colOffset;\n }\n }\n for (let colOffset = 0; colOffset + columnSpan <= columns; colOffset++) {\n if (getRowOffset(colOffset, columnSpan) + rowSpan <= getRowOffset(0, columns)) {\n return colOffset;\n }\n }\n return currentColumnOffset;\n }\n\n function getRowOffset(columnOffset: number, columnSpan: number) {\n let rowOffset = 0;\n for (let col = columnOffset; col < columnOffset + columnSpan; col++) {\n rowOffset = Math.max(rowOffset, columnHeights[col]);\n }\n return rowOffset;\n }\n\n for (let index = 0, columnOffset = 0, rowOffset = 0; index < items.length; index++, rowOffset = 0) {\n const columnSpan = getColumnSpan(items[index]);\n const rowSpan = getRowSpan(items[index]);\n columnOffset = getColumnOffset(items[index], columnOffset);\n rowOffset = getRowOffset(columnOffset, columnSpan);\n\n layoutItems.push({ id: items[index].id, width: columnSpan, height: rowSpan, x: columnOffset, y: rowOffset });\n\n for (let col = columnOffset; col < columnOffset + columnSpan; col++) {\n columnHeights[col] = rowOffset + rowSpan;\n }\n\n columnOffset += columnSpan;\n }\n\n layoutItems.sort(itemComparator);\n\n return { items: layoutItems, columns, rows: getRowOffset(0, columns) };\n}\n\n/**\n * The function produces new items from the current state and updated grid layout.\n * The positional data for the given number of columns is preserved as is while the other layouts are partially invalidated.\n */\nexport function transformItems<D>(\n sourceItems: readonly BoardItemDefinition<D>[],\n gridLayout: GridLayout,\n resizeTarget: null | ItemId\n): readonly BoardItemDefinition<D>[] {\n const itemById = new Map(sourceItems.map((item) => [item.id, item]));\n const getItem = (itemId: ItemId) => {\n const item = itemById.get(itemId);\n if (!item) {\n throw new Error(\"Invariant violation: no matching source item found.\");\n }\n return item;\n };\n\n const sortedLayout = gridLayout.items.slice().sort(itemComparator);\n\n const items: BoardItemDefinition<D>[] = [];\n\n let changeFromIndex = sortedLayout.findIndex(({ id }, index) => id !== sourceItems[index].id || id === resizeTarget);\n changeFromIndex = changeFromIndex !== -1 ? changeFromIndex : sortedLayout.length;\n\n for (let index = 0; index < sortedLayout.length; index++) {\n const { id, x, width, height } = sortedLayout[index];\n\n const item = { ...getItem(id) };\n\n if (index >= changeFromIndex) {\n item.columnOffset = undefined;\n }\n item.columnOffset = { ...item.columnOffset, [gridLayout.columns]: x };\n\n if (item.id === resizeTarget) {\n item.columnSpan = width;\n item.rowSpan = height;\n }\n\n items.push(item);\n }\n\n return items;\n}\n\nexport function createPlaceholdersLayout(rows: number, columns: number): GridLayout {\n const layoutItems: GridLayoutItem[] = [];\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < columns; col++) {\n layoutItems.push({ id: `awsui-placeholder-${row}-${col}`, x: col, y: row, width: 1, height: 1 });\n }\n }\n\n return { items: layoutItems, columns, rows };\n}\n\nexport function getMinColumnSpan(item: Item, columns: number) {\n return Math.min(columns, Math.max(MIN_COL_SPAN, item.definition?.minColumnSpan ?? 0));\n}\n\nexport function getDefaultColumnSpan(item: Item, columns: number) {\n return Math.min(columns, Math.max(getMinColumnSpan(item, columns), item.definition?.defaultColumnSpan ?? 0));\n}\n\nexport function getMinRowSpan(item: Item) {\n return Math.max(MIN_ROW_SPAN, item.definition?.minRowSpan ?? 0);\n}\n\nexport function getDefaultRowSpan(item: Item) {\n return Math.max(getMinRowSpan(item), item.definition?.defaultRowSpan ?? 0);\n}\n\nfunction itemComparator(a: GridLayoutItem, b: GridLayoutItem) {\n if (a.y !== b.y) {\n return a.y > b.y ? 1 : -1;\n }\n return a.x > b.x ? 1 : -1;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../../../src/internal/utils/layout.ts"],"names":[],"mappings":"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","sourcesContent":["// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.\n// SPDX-License-Identifier: Apache-2.0\n\nimport { MIN_COL_SPAN, MIN_ROW_SPAN } from \"../constants\";\nimport { BoardItemDefinition, GridLayout, GridLayoutItem, ItemId } from \"../interfaces\";\n\ntype Item<D = unknown> = BoardItemDefinition<D>;\n\n/**\n * The function produces grid layout from board items and given number of columns.\n * The positional data is taken from the items when available or the default placement is used otherwise.\n */\nexport function interpretItems(items: readonly Item[], columns: number): GridLayout {\n const layoutItems: GridLayoutItem[] = [];\n const columnHeights = Array(columns).fill(0);\n\n function getColumnSpan(item: Item): number {\n const minColumnSpan = getMinColumnSpan(item, columns);\n const columnSpan = item.columnSpan ?? getDefaultColumnSpan(item, columns);\n return Math.min(columns, Math.max(minColumnSpan, columnSpan));\n }\n\n function getRowSpan(item: Item): number {\n const minRowSpan = getMinRowSpan(item);\n const rowSpan = item.rowSpan ?? getDefaultRowSpan(item);\n return Math.max(minRowSpan, rowSpan);\n }\n\n function getColumnOffset(item: Item, currentOffset: number): number {\n const columnSpan = getColumnSpan(item);\n const rowSpan = getRowSpan(item);\n const columnOffset = item.columnOffset?.[columns] ?? findOptimalColumnOffset(currentOffset, columnSpan, rowSpan);\n return columnOffset + columnSpan <= columns ? columnOffset : 0;\n }\n\n function findOptimalColumnOffset(currentColumnOffset: number, columnSpan: number, rowSpan: number): number {\n for (let colOffset = currentColumnOffset; colOffset + columnSpan <= columns; colOffset++) {\n if (getRowOffset(colOffset, columnSpan) + rowSpan <= getRowOffset(0, columns)) {\n return colOffset;\n }\n }\n for (let colOffset = 0; colOffset + columnSpan <= columns; colOffset++) {\n if (getRowOffset(colOffset, columnSpan) + rowSpan <= getRowOffset(0, columns)) {\n return colOffset;\n }\n }\n return currentColumnOffset;\n }\n\n function getRowOffset(columnOffset: number, columnSpan: number) {\n let rowOffset = 0;\n for (let col = columnOffset; col < columnOffset + columnSpan; col++) {\n rowOffset = Math.max(rowOffset, columnHeights[col]);\n }\n return rowOffset;\n }\n\n for (let index = 0, columnOffset = 0, rowOffset = 0; index < items.length; index++, rowOffset = 0) {\n const columnSpan = getColumnSpan(items[index]);\n const rowSpan = getRowSpan(items[index]);\n columnOffset = getColumnOffset(items[index], columnOffset);\n rowOffset = getRowOffset(columnOffset, columnSpan);\n\n layoutItems.push({ id: items[index].id, width: columnSpan, height: rowSpan, x: columnOffset, y: rowOffset });\n\n for (let col = columnOffset; col < columnOffset + columnSpan; col++) {\n columnHeights[col] = rowOffset + rowSpan;\n }\n\n columnOffset += columnSpan;\n }\n\n layoutItems.sort(itemComparator);\n\n return { items: layoutItems, columns, rows: getRowOffset(0, columns) };\n}\n\n/**\n * The function produces new items from the current state and updated grid layout.\n * The positional data for the given number of columns is preserved as is while the other layouts are partially invalidated.\n */\nexport function transformItems<D>(\n sourceItems: readonly BoardItemDefinition<D>[],\n gridLayout: GridLayout,\n resizeTarget: null | ItemId,\n): readonly BoardItemDefinition<D>[] {\n const itemById = new Map(sourceItems.map((item) => [item.id, item]));\n const getItem = (itemId: ItemId) => {\n const item = itemById.get(itemId);\n if (!item) {\n throw new Error(\"Invariant violation: no matching source item found.\");\n }\n return item;\n };\n\n const sortedLayout = gridLayout.items.slice().sort(itemComparator);\n\n const items: BoardItemDefinition<D>[] = [];\n\n let changeFromIndex = sortedLayout.findIndex(({ id }, index) => id !== sourceItems[index].id || id === resizeTarget);\n changeFromIndex = changeFromIndex !== -1 ? changeFromIndex : sortedLayout.length;\n\n for (let index = 0; index < sortedLayout.length; index++) {\n const { id, x, width, height } = sortedLayout[index];\n\n const item = { ...getItem(id) };\n\n if (index >= changeFromIndex) {\n item.columnOffset = undefined;\n }\n item.columnOffset = { ...item.columnOffset, [gridLayout.columns]: x };\n\n if (item.id === resizeTarget) {\n item.columnSpan = width;\n item.rowSpan = height;\n }\n\n items.push(item);\n }\n\n return items;\n}\n\nexport function createPlaceholdersLayout(rows: number, columns: number): GridLayout {\n const layoutItems: GridLayoutItem[] = [];\n\n for (let row = 0; row < rows; row++) {\n for (let col = 0; col < columns; col++) {\n layoutItems.push({ id: `awsui-placeholder-${row}-${col}`, x: col, y: row, width: 1, height: 1 });\n }\n }\n\n return { items: layoutItems, columns, rows };\n}\n\nexport function getMinColumnSpan(item: Item, columns: number) {\n return Math.min(columns, Math.max(MIN_COL_SPAN, item.definition?.minColumnSpan ?? 0));\n}\n\nexport function getDefaultColumnSpan(item: Item, columns: number) {\n return Math.min(columns, Math.max(getMinColumnSpan(item, columns), item.definition?.defaultColumnSpan ?? 0));\n}\n\nexport function getMinRowSpan(item: Item) {\n return Math.max(MIN_ROW_SPAN, item.definition?.minRowSpan ?? 0);\n}\n\nexport function getDefaultRowSpan(item: Item) {\n return Math.max(getMinRowSpan(item), item.definition?.defaultRowSpan ?? 0);\n}\n\nfunction itemComparator(a: GridLayoutItem, b: GridLayoutItem) {\n if (a.y !== b.y) {\n return a.y > b.y ? 1 : -1;\n }\n return a.x > b.x ? 1 : -1;\n}\n"]}
|