{ "version": 3, "sources": [ "Modification.ts" ], "names": [ "clone", "extend", "rectUtils", "Modification", "constructor", "interaction", "this", "states", "startOffset", "left", "right", "top", "bottom", "startDelta", "result", "endResult", "edges", "createResult", "start", "phase", "pageCoords", "modifierList", "actionOptions", "interactable", "options", "prepared", "name", "actionModifiers", "modifiers", "length", "map", "type", "enabled", "methods", "_methods", "filter", "m", "getModifierList", "prepareStates", "getRectOffset", "rect", "x", "y", "arg", "preEnd", "startAll", "setAll", "fillArg", "element", "state", "skipModifiers", "unmodifiedRect", "coords", "slice", "newResult", "lastModifierCoords", "returnValue", "set", "shouldDo", "addEdges", "eventProps", "push", "delta", "rectDelta", "prevCoords", "prevRect", "rectChanged", "changed", "applyToInteraction", "curCoords", "cur", "startCoords", "curDelta", "coordsSet", "page", "client", "width", "height", "setAndApply", "modifiedCoords", "interacting", "adjustment", "beforeEnd", "event", "doPreend", "endPosition", "move", "stop", "modifierArg", "index", "restoreInteractionCoords", "modification", "coordsAndDeltas", "requireEndOnly", "endOnly", "setStart", "copyFrom", "other", "s", "destroy", "prop" ], "mappings": "OAGOA,MAAW,gCACXC,MAAY,oCACPC,MAAe,uCAsBZ,MAAMC,EASnBC,YAAaC,GAA0BC,KARvCC,OAA0B,GAQaD,KAPvCE,YAAoB,CAAEC,KAAM,EAAGC,MAAO,EAAGC,IAAK,EAAGC,OAAQ,GAOlBN,KANvCO,WAAoB,KAMmBP,KALvCQ,OAA8B,KAKSR,KAJvCS,UAAoB,KAImBT,KAHvCU,WAGuC,EAAAV,KAF9BD,iBAE8B,EACrCC,KAAKD,YAAcA,EACnBC,KAAKQ,OAASG,IAGhBC,OACEC,MAAEA,GACFC,GAEA,MAAMf,YAAEA,GAAgBC,KAClBe,EA6TV,CAA0BhB,IACxB,MAAMiB,EAAgBjB,EAAYkB,aAAaC,QAAQnB,EAAYoB,SAASC,MACtEC,EAAkBL,EAAcM,UAEtC,OAAID,GAAmBA,EAAgBE,OAC9BF,EAGF,CAAC,OAAQ,WAAY,YAAa,WAAY,gBAAiB,gBACnEG,KAAIC,IACH,MAAMP,EAAUF,EAAcS,GAE9B,OAAOP,GAAWA,EAAQQ,SAAW,CACnCR,QAAAA,EACAS,QAAST,EAAQU,aAGpBC,QAAOC,KAAOA,KA9UMC,CAAgBhC,GACrCC,KAAKgC,cAAcjB,GAEnBf,KAAKU,MAAQf,EAAO,GAAII,EAAYW,OACpCV,KAAKE,YAAc+B,cAAclC,EAAYmC,KAAMpB,GACnDd,KAAKO,WAAa,CAAE4B,EAAG,EAAGC,EAAG,GAE7B,MAAMC,EAAiB,CACrBxB,MAAAA,EACAC,WAAAA,EACAwB,QAAQ,GAQV,OALAtC,KAAKQ,OAASG,IACdX,KAAKuC,SAASF,GAECrC,KAAKQ,OAASR,KAAKwC,OAAOH,GAK3CI,QAASJ,GACP,MAAMtC,YAAEA,GAAgBC,KAExBqC,EAAItC,YAAcA,EAClBsC,EAAIpB,aAAelB,EAAYkB,aAC/BoB,EAAIK,QAAU3C,EAAY2C,QAC1BL,EAAIH,KAAOG,EAAIH,MAAQnC,EAAYmC,KACnCG,EAAI3B,MAAQV,KAAKU,MACjB2B,EAAInC,YAAcF,KAAKE,YAGzBqC,SAAUF,GACRrC,KAAKyC,QAAQJ,GAEb,IAAK,MAAMM,KAAS3C,KAAKC,OACnB0C,EAAMhB,QAAQf,QAChByB,EAAIM,MAAQA,EACZA,EAAMhB,QAAQf,MAAMyB,IAK1BG,OAAQH,GACNrC,KAAKyC,QAAQJ,GAEb,MAAMxB,MACJA,EADIyB,OAEJA,EAFIM,cAGJA,EACAV,KAAMW,GACJR,EAEJA,EAAIS,OAASnD,EAAO,GAAI0C,EAAIvB,YAC5BuB,EAAIH,KAAOvC,EAAO,GAAIkD,GAEtB,MAAM5C,EAAS2C,EACX5C,KAAKC,OAAO8C,MAAMH,GAClB5C,KAAKC,OAEH+C,EAAYrC,EAAa0B,EAAIS,OAAQT,EAAIH,MAE/C,IAAK,MAAMS,KAAS1C,EAAQ,CAC1B,MAAMiB,QAAEA,GAAYyB,EACdM,EAAqBtD,EAAO,GAAI0C,EAAIS,QAC1C,IAAII,EAAc,KAEdP,EAAMhB,QAAQwB,KAAOnD,KAAKoD,SAASlC,EAASoB,EAAQzB,KACtDwB,EAAIM,MAAQA,EACZO,EAAcP,EAAMhB,QAAQwB,IAAId,GAEhCzC,EAAUyD,SAASrD,KAAKD,YAAYW,MAAO2B,EAAIH,KAAM,CAAEC,EAAGE,EAAIS,OAAOX,EAAIc,EAAmBd,EAAGC,EAAGC,EAAIS,OAAOV,EAAIa,EAAmBb,KAGtIY,EAAUM,WAAWC,KAAKL,GAG5BF,EAAUQ,MAAMrB,EAAIE,EAAIS,OAAOX,EAAIE,EAAIvB,WAAWqB,EAClDa,EAAUQ,MAAMpB,EAAIC,EAAIS,OAAOV,EAAIC,EAAIvB,WAAWsB,EAElDY,EAAUS,UAAUtD,KAASkC,EAAIH,KAAK/B,KAAO0C,EAAe1C,KAC5D6C,EAAUS,UAAUrD,MAASiC,EAAIH,KAAK9B,MAAQyC,EAAezC,MAC7D4C,EAAUS,UAAUpD,IAASgC,EAAIH,KAAK7B,IAAMwC,EAAexC,IAC3D2C,EAAUS,UAAUnD,OAAS+B,EAAIH,KAAK5B,OAASuC,EAAevC,OAE9D,MAAMoD,EAAa1D,KAAKQ,OAAOsC,OACzBa,EAAW3D,KAAKQ,OAAO0B,KAE7B,GAAIwB,GAAcC,EAAU,CAC1B,MAAMC,EAAcZ,EAAUd,KAAK/B,OAASwD,EAASxD,MACnD6C,EAAUd,KAAK9B,QAAUuD,EAASvD,OAClC4C,EAAUd,KAAK7B,MAAQsD,EAAStD,KAChC2C,EAAUd,KAAK5B,SAAWqD,EAASrD,OAErC0C,EAAUa,QAAUD,GAClBF,EAAWvB,IAAMa,EAAUF,OAAOX,GAClCuB,EAAWtB,IAAMY,EAAUF,OAAOV,EAGtC,OAAOY,EAGTc,mBAAoBzB,GAClB,MAAMtC,YAAEA,GAAgBC,MAClBa,MAAEA,GAAUwB,EACZ0B,EAAYhE,EAAY+C,OAAOkB,IAC/BC,EAAclE,EAAY+C,OAAOlC,OACjCJ,OAAEA,EAAFD,WAAUA,GAAeP,KACzBkE,EAAW1D,EAAOgD,MAEV,UAAV3C,GACFlB,EAAOK,KAAKO,WAAYC,EAAOgD,OAGjC,IAAK,MAAOW,EAAWX,IAAU,CAAC,CAACS,EAAa1D,GAAa,CAACwD,EAAWG,IACvEC,EAAUC,KAAKjC,GAAOqB,EAAMrB,EAC5BgC,EAAUC,KAAKhC,GAAOoB,EAAMpB,EAC5B+B,EAAUE,OAAOlC,GAAKqB,EAAMrB,EAC5BgC,EAAUE,OAAOjC,GAAKoB,EAAMpB,EAG9B,MAAMqB,UAAEA,GAAczD,KAAKQ,OACrB0B,EAAOG,EAAIH,MAAQnC,EAAYmC,KAErCA,EAAK/B,MAAUsD,EAAUtD,KACzB+B,EAAK9B,OAAUqD,EAAUrD,MACzB8B,EAAK7B,KAAUoD,EAAUpD,IACzB6B,EAAK5B,QAAUmD,EAAUnD,OAEzB4B,EAAKoC,MAAQpC,EAAK9B,MAAQ8B,EAAK/B,KAC/B+B,EAAKqC,OAASrC,EAAK5B,OAAS4B,EAAK7B,IAGnCmE,YAAanC,GAMX,MAAMtC,YAAEA,GAAgBC,MAClBa,MAAEA,EAAFyB,OAASA,EAATM,cAAiBA,GAAkBP,EAEnC7B,EAASR,KAAKwC,OAAO,CACzBF,OAAAA,EACAzB,MAAAA,EACAC,WAAYuB,EAAIoC,gBAAkB1E,EAAY+C,OAAOkB,IAAII,OAO3D,GAJApE,KAAKQ,OAASA,GAITA,EAAOqD,WAAajB,GAAiBA,EAAgB5C,KAAKC,OAAOsB,SAAWxB,EAAY2E,cAC3F,OAAO,EAGT,GAAIrC,EAAIoC,eAAgB,CACtB,MAAML,KAAEA,GAASrE,EAAY+C,OAAOkB,IAC9BW,EAAa,CACjBxC,EAAGE,EAAIoC,eAAetC,EAAIiC,EAAKjC,EAC/BC,EAAGC,EAAIoC,eAAerC,EAAIgC,EAAKhC,GAGjC5B,EAAOsC,OAAOX,GAAKwC,EAAWxC,EAC9B3B,EAAOsC,OAAOV,GAAKuC,EAAWvC,EAC9B5B,EAAOgD,MAAMrB,GAAKwC,EAAWxC,EAC7B3B,EAAOgD,MAAMpB,GAAKuC,EAAWvC,EAG/BpC,KAAK8D,mBAAmBzB,GAG1BuC,UAAWvC,GACT,MAAMtC,YAAEA,EAAF8E,MAAeA,GAAUxC,EACzBpC,EAASD,KAAKC,OAEpB,IAAKA,IAAWA,EAAOsB,OACrB,OAGF,IAAIuD,GAAW,EAEf,IAAK,MAAMnC,KAAS1C,EAAQ,CAC1BoC,EAAIM,MAAQA,EACZ,MAAMzB,QAAEA,EAAFS,QAAWA,GAAYgB,EAEvBoC,EAAcpD,EAAQiD,WAAajD,EAAQiD,UAAUvC,GAE3D,GAAI0C,EAEF,OADA/E,KAAKS,UAAYsE,GACV,EAGTD,EAAWA,IAAcA,GAAY9E,KAAKoD,SAASlC,GAAS,EAAMmB,EAAIxB,OAAO,GAG3EiE,GAEF/E,EAAYiF,KAAK,CAAEH,MAAAA,EAAOvC,QAAQ,IAItC2C,KAAM5C,GACJ,MAAMtC,YAAEA,GAAgBsC,EAExB,IAAKrC,KAAKC,SAAWD,KAAKC,OAAOsB,OAC/B,OAGF,MAAM2D,EAAoCvF,EAAO,CAC/CM,OAAQD,KAAKC,OACbgB,aAAclB,EAAYkB,aAC1ByB,QAAS3C,EAAY2C,QACrBR,KAAM,MACLG,GAEHrC,KAAKyC,QAAQyC,GAEb,IAAK,MAAMvC,KAAS3C,KAAKC,OACvBiF,EAAYvC,MAAQA,EAEhBA,EAAMhB,QAAQsD,MAAQtC,EAAMhB,QAAQsD,KAAKC,GAG/ClF,KAAKC,OAAS,KACdD,KAAKS,UAAY,KAGnBuB,cAAejB,GACbf,KAAKC,OAAS,GAEd,IAAK,IAAIkF,EAAQ,EAAGA,EAAQpE,EAAaQ,OAAQ4D,IAAS,CACxD,MAAMjE,QAAEA,EAAFS,QAAWA,EAAXP,KAAoBA,GAASL,EAAaoE,GAEhDnF,KAAKC,OAAOsD,KAAK,CACfrC,QAAAA,EACAS,QAAAA,EACAwD,MAAAA,EACA/D,KAAAA,IAIJ,OAAOpB,KAAKC,OAGdmF,0BAA4BrF,aAAa+C,OAAEA,EAAFZ,KAAUA,EAAVmD,aAAgBA,KACvD,IAAKA,EAAa7E,OAAU,OAE5B,MAAMD,WAAEA,GAAe8E,GACf7B,MAAOU,EAATT,UAAmBA,GAAc4B,EAAa7E,OAE9C8E,EAAkB,CACtB,CAACxC,EAAOlC,MAAOL,GACf,CAACuC,EAAOkB,IAAKE,IAGf,IAAK,MAAOC,EAAWX,KAAU8B,EAC/BnB,EAAUC,KAAKjC,GAAKqB,EAAMrB,EAC1BgC,EAAUC,KAAKhC,GAAKoB,EAAMpB,EAC1B+B,EAAUE,OAAOlC,GAAKqB,EAAMrB,EAC5BgC,EAAUE,OAAOjC,GAAKoB,EAAMpB,EAG9BF,EAAK/B,MAAQsD,EAAUtD,KACvB+B,EAAK9B,OAASqD,EAAUrD,MACxB8B,EAAK7B,KAAOoD,EAAUpD,IACtB6B,EAAK5B,QAAUmD,EAAUnD,OAG3B8C,SAAUlC,EAASoB,EAAkBzB,EAAgB0E,GACnD,SAEIrE,IAA+B,IAApBA,EAAQQ,SAEpB6D,IAAmBrE,EAAQsE,SAE3BtE,EAAQsE,UAAYlD,GAEV,UAAVzB,IAAsBK,EAAQuE,UAQnCC,SAAUC,GACR3F,KAAKE,YAAcyF,EAAMzF,YACzBF,KAAKO,WAAaoF,EAAMpF,WACxBP,KAAKU,MAAQiF,EAAMjF,MACnBV,KAAKC,OAAS0F,EAAM1F,OAAOuB,KAAIoE,GAAKlG,EAAMkG,KAC1C5F,KAAKQ,OAASG,EAAahB,EAAO,GAAIgG,EAAMnF,OAAOsC,QAASnD,EAAO,GAAIgG,EAAMnF,OAAO0B,OAGtF2D,UACE,IAAK,MAAMC,KAAQ9F,KACjBA,KAAK8F,GAAQ,MAKnB,SAASnF,EAAcmC,EAAgBZ,GACrC,MAAO,CACLA,KAAAA,EACAY,OAAAA,EACAU,MAAO,CAAErB,EAAG,EAAGC,EAAG,GAClBqB,UAAW,CACTtD,KAAQ,EACRC,MAAQ,EACRC,IAAQ,EACRC,OAAQ,GAEVgD,WAAY,GACZO,SAAS,UAwBN,SAAS5B,cAAeC,EAAMY,GACnC,OAAOZ,EACH,CACA/B,KAAQ2C,EAAOX,EAAID,EAAK/B,KACxBE,IAAQyC,EAAOV,EAAIF,EAAK7B,IACxBD,MAAQ8B,EAAK9B,MAAS0C,EAAOX,EAC7B7B,OAAQ4B,EAAK5B,OAASwC,EAAOV,GAE7B,CACAjC,KAAQ,EACRE,IAAQ,EACRD,MAAQ,EACRE,OAAQ", "sourcesContent": [ "import { EventPhase } from '@interactjs/core/InteractEvent'\nimport Interaction, { DoAnyPhaseArg } from '@interactjs/core/Interaction'\nimport { EdgeOptions, FullRect, Point, Rect } from '@interactjs/types/index'\nimport clone from '@interactjs/utils/clone'\nimport extend from '@interactjs/utils/extend'\nimport * as rectUtils from '@interactjs/utils/rect'\n\nimport { Modifier, ModifierArg, ModifierState } from './base'\n\nexport interface ModificationResult {\n delta: Point\n rectDelta: Rect\n coords: Point\n rect: FullRect\n eventProps: any[]\n changed: boolean\n}\n\ninterface MethodArg {\n phase: EventPhase\n pageCoords?: Point\n rect?: FullRect\n coords?: Point\n preEnd?: boolean\n skipModifiers?: number\n}\n\nexport default class Modification {\n states: ModifierState[] = []\n startOffset: Rect = { left: 0, right: 0, top: 0, bottom: 0 }\n startDelta: Point = null\n result?: ModificationResult = null\n endResult?: Point = null\n edges: EdgeOptions\n readonly interaction: Readonly\n\n constructor (interaction: Interaction) {\n this.interaction = interaction\n this.result = createResult()\n }\n\n start (\n { phase }: MethodArg,\n pageCoords: Point,\n ) {\n const { interaction } = this\n const modifierList = getModifierList(interaction)\n this.prepareStates(modifierList)\n\n this.edges = extend({}, interaction.edges)\n this.startOffset = getRectOffset(interaction.rect, pageCoords)\n this.startDelta = { x: 0, y: 0 }\n\n const arg: MethodArg = {\n phase,\n pageCoords,\n preEnd: false,\n }\n\n this.result = createResult()\n this.startAll(arg)\n\n const result = this.result = this.setAll(arg)\n\n return result\n }\n\n fillArg (arg: Partial) {\n const { interaction } = this\n\n arg.interaction = interaction\n arg.interactable = interaction.interactable\n arg.element = interaction.element\n arg.rect = arg.rect || interaction.rect\n arg.edges = this.edges\n arg.startOffset = this.startOffset\n }\n\n startAll (arg: MethodArg & Partial) {\n this.fillArg(arg)\n\n for (const state of this.states) {\n if (state.methods.start) {\n arg.state = state\n state.methods.start(arg as ModifierArg)\n }\n }\n }\n\n setAll (arg: MethodArg & Partial): ModificationResult {\n this.fillArg(arg)\n\n const {\n phase,\n preEnd,\n skipModifiers,\n rect: unmodifiedRect,\n } = arg\n\n arg.coords = extend({}, arg.pageCoords)\n arg.rect = extend({}, unmodifiedRect)\n\n const states = skipModifiers\n ? this.states.slice(skipModifiers)\n : this.states\n\n const newResult = createResult(arg.coords, arg.rect)\n\n for (const state of states) {\n const { options } = state\n const lastModifierCoords = extend({}, arg.coords)\n let returnValue = null\n\n if (state.methods.set && this.shouldDo(options, preEnd, phase)) {\n arg.state = state\n returnValue = state.methods.set(arg as ModifierArg)\n\n rectUtils.addEdges(this.interaction.edges, arg.rect, { x: arg.coords.x - lastModifierCoords.x, y: arg.coords.y - lastModifierCoords.y })\n }\n\n newResult.eventProps.push(returnValue)\n }\n\n newResult.delta.x = arg.coords.x - arg.pageCoords.x\n newResult.delta.y = arg.coords.y - arg.pageCoords.y\n\n newResult.rectDelta.left = arg.rect.left - unmodifiedRect.left\n newResult.rectDelta.right = arg.rect.right - unmodifiedRect.right\n newResult.rectDelta.top = arg.rect.top - unmodifiedRect.top\n newResult.rectDelta.bottom = arg.rect.bottom - unmodifiedRect.bottom\n\n const prevCoords = this.result.coords\n const prevRect = this.result.rect\n\n if (prevCoords && prevRect) {\n const rectChanged = newResult.rect.left !== prevRect.left ||\n newResult.rect.right !== prevRect.right ||\n newResult.rect.top !== prevRect.top ||\n newResult.rect.bottom !== prevRect.bottom\n\n newResult.changed = rectChanged ||\n prevCoords.x !== newResult.coords.x ||\n prevCoords.y !== newResult.coords.y\n }\n\n return newResult\n }\n\n applyToInteraction (arg: { phase: EventPhase, rect?: Rect }) {\n const { interaction } = this\n const { phase } = arg\n const curCoords = interaction.coords.cur\n const startCoords = interaction.coords.start\n const { result, startDelta } = this\n const curDelta = result.delta\n\n if (phase === 'start') {\n extend(this.startDelta, result.delta)\n }\n\n for (const [coordsSet, delta] of [[startCoords, startDelta], [curCoords, curDelta]] as const) {\n coordsSet.page.x += delta.x\n coordsSet.page.y += delta.y\n coordsSet.client.x += delta.x\n coordsSet.client.y += delta.y\n }\n\n const { rectDelta } = this.result\n const rect = arg.rect || interaction.rect\n\n rect.left += rectDelta.left\n rect.right += rectDelta.right\n rect.top += rectDelta.top\n rect.bottom += rectDelta.bottom\n\n rect.width = rect.right - rect.left\n rect.height = rect.bottom - rect.top\n }\n\n setAndApply (arg: Partial & {\n phase: EventPhase\n preEnd?: boolean\n skipModifiers?: number\n modifiedCoords?: Point\n }): void | false {\n const { interaction } = this\n const { phase, preEnd, skipModifiers } = arg\n\n const result = this.setAll({\n preEnd,\n phase,\n pageCoords: arg.modifiedCoords || interaction.coords.cur.page,\n })\n\n this.result = result\n\n // don't fire an action move if a modifier would keep the event in the same\n // cordinates as before\n if (!result.changed && (!skipModifiers || skipModifiers < this.states.length) && interaction.interacting()) {\n return false\n }\n\n if (arg.modifiedCoords) {\n const { page } = interaction.coords.cur\n const adjustment = {\n x: arg.modifiedCoords.x - page.x,\n y: arg.modifiedCoords.y - page.y,\n }\n\n result.coords.x += adjustment.x\n result.coords.y += adjustment.y\n result.delta.x += adjustment.x\n result.delta.y += adjustment.y\n }\n\n this.applyToInteraction(arg)\n }\n\n beforeEnd (arg: Omit & { state?: ModifierState }): void | false {\n const { interaction, event } = arg\n const states = this.states\n\n if (!states || !states.length) {\n return\n }\n\n let doPreend = false\n\n for (const state of states) {\n arg.state = state\n const { options, methods } = state\n\n const endPosition = methods.beforeEnd && methods.beforeEnd(arg as unknown as ModifierArg)\n\n if (endPosition) {\n this.endResult = endPosition\n return false\n }\n\n doPreend = doPreend || (!doPreend && this.shouldDo(options, true, arg.phase, true))\n }\n\n if (doPreend) {\n // trigger a final modified move before ending\n interaction.move({ event, preEnd: true })\n }\n }\n\n stop (arg: { interaction: Interaction }) {\n const { interaction } = arg\n\n if (!this.states || !this.states.length) {\n return\n }\n\n const modifierArg: Partial = extend({\n states: this.states,\n interactable: interaction.interactable,\n element: interaction.element,\n rect: null,\n }, arg)\n\n this.fillArg(modifierArg)\n\n for (const state of this.states) {\n modifierArg.state = state\n\n if (state.methods.stop) { state.methods.stop(modifierArg as ModifierArg) }\n }\n\n this.states = null\n this.endResult = null\n }\n\n prepareStates (modifierList: Modifier[]) {\n this.states = []\n\n for (let index = 0; index < modifierList.length; index++) {\n const { options, methods, name } = modifierList[index]\n\n this.states.push({\n options,\n methods,\n index,\n name,\n })\n }\n\n return this.states\n }\n\n restoreInteractionCoords ({ interaction: { coords, rect, modification } }: { interaction: Interaction }) {\n if (!modification.result) { return }\n\n const { startDelta } = modification\n const { delta: curDelta, rectDelta } = modification.result\n\n const coordsAndDeltas = [\n [coords.start, startDelta],\n [coords.cur, curDelta],\n ]\n\n for (const [coordsSet, delta] of coordsAndDeltas as any) {\n coordsSet.page.x -= delta.x\n coordsSet.page.y -= delta.y\n coordsSet.client.x -= delta.x\n coordsSet.client.y -= delta.y\n }\n\n rect.left -= rectDelta.left\n rect.right -= rectDelta.right\n rect.top -= rectDelta.top\n rect.bottom -= rectDelta.bottom\n }\n\n shouldDo (options, preEnd?: boolean, phase?: string, requireEndOnly?: boolean) {\n if (\n // ignore disabled modifiers\n (!options || options.enabled === false) ||\n // check if we require endOnly option to fire move before end\n (requireEndOnly && !options.endOnly) ||\n // don't apply endOnly modifiers when not ending\n (options.endOnly && !preEnd) ||\n // check if modifier should run be applied on start\n (phase === 'start' && !options.setStart)\n ) {\n return false\n }\n\n return true\n }\n\n copyFrom (other: Modification) {\n this.startOffset = other.startOffset\n this.startDelta = other.startDelta\n this.edges = other.edges\n this.states = other.states.map(s => clone(s) as ModifierState)\n this.result = createResult(extend({}, other.result.coords), extend({}, other.result.rect))\n }\n\n destroy () {\n for (const prop in this) {\n this[prop] = null\n }\n }\n}\n\nfunction createResult (coords?: Point, rect?: FullRect): ModificationResult {\n return {\n rect,\n coords,\n delta: { x: 0, y: 0 },\n rectDelta: {\n left : 0,\n right : 0,\n top : 0,\n bottom: 0,\n },\n eventProps: [],\n changed: true,\n }\n}\n\nfunction getModifierList (interaction) {\n const actionOptions = interaction.interactable.options[interaction.prepared.name]\n const actionModifiers = actionOptions.modifiers\n\n if (actionModifiers && actionModifiers.length) {\n return actionModifiers\n }\n\n return ['snap', 'snapSize', 'snapEdges', 'restrict', 'restrictEdges', 'restrictSize']\n .map(type => {\n const options = actionOptions[type]\n\n return options && options.enabled && {\n options,\n methods: options._methods,\n }\n })\n .filter(m => !!m)\n}\n\nexport function getRectOffset (rect, coords) {\n return rect\n ? {\n left : coords.x - rect.left,\n top : coords.y - rect.top,\n right : rect.right - coords.x,\n bottom: rect.bottom - coords.y,\n }\n : {\n left : 0,\n top : 0,\n right : 0,\n bottom: 0,\n }\n}\n" ] }