{"version":3,"file":"NewsTicker-CBXFOqDf.js","sources":["../../../app/javascript/src/modules/MbaExclusive/Components/NewsTicker.vue"],"sourcesContent":["<template>\n  <div class=\"newsticker\" :style=\"{ height }\">\n    <div v-show=\"enabled\" class=\"roller\" ref=\"roller\" :style=\"{ height }\">\n      <slot/>\n    </div>\n\n    <slot v-if=\"!enabled\" />\n  </div>\n</template>\n\n<script setup>\nimport { computed, ref } from 'vue'\nimport { until, useElementSize, useMounted, useRafFn, watchImmediate } from '@vueuse/core'\n\nconst MAX_ITEM = 100;\nconst props = defineProps({\n  speed: {\n    type: Number,\n    default: 1,\n  },\n  enabled: {\n    type: Boolean,\n    default: true\n  }\n});\nconst roller = ref(null);\nconst mounted = useMounted();\nconst cloning = ref(true);\nconst childrenHeights = ref([]);\nconst height = computed(() => {\n  if (!props.enabled) return 'auto';\n  const heights = childrenHeights.value.map(ch => ch.value);\n  return heights.length === 0 ? 'auto' : `${Math.max(...heights)}px`;\n});\nlet translateX = 0;\nlet midIndex = 1;\n\nwatchImmediate(() => mounted.value && props.enabled, (on) => on && pack());\n\nuntil(() => props.enabled && !cloning.value).toBeTruthy().then(roll);\n\nfunction pack() {\n  const { pause } = useRafFn(() => {\n    cloning.value = !lastItemIsFarAway();\n    cloning.value && clone();\n  });\n\n  until(cloning).toBe(false).then(() => {\n    pause();\n    childrenHeights.value = [...roller.value.children].map(useElementSize).map(size => size.height);\n  });\n}\n\nfunction clone() {\n  for (let node of [...roller.value.children]) {\n    if (roller.value.children.length >= MAX_ITEM) {\n      cloning.value = false;\n      return;\n    }\n\n    roller.value.appendChild(node.cloneNode(true));\n  }\n}\n\nfunction roll() {\n  midIndex = Math.ceil(roller.value.children.length / 2);\n\n  useRafFn(({ delta }) => {\n    translateX -= props.speed * (delta / 1000);\n    roller.value.style.transform = `translateX(${translateX}px)`;\n\n    const start = roller.value.children[0];\n    const end = roller.value.children[midIndex];\n    const startRect = start.getBoundingClientRect();\n    const endRect = end.getBoundingClientRect();\n    if (endRect.x < -endRect.width) {\n      translateX += (endRect.x - startRect.x);\n      [...roller.value.children].slice(0, midIndex).forEach(n => roller.value.appendChild(n));\n    }\n  })\n}\n\nfunction lastItemIsFarAway() {\n  const items = [...roller.value.children];\n  const screen = Math.max(window.innerWidth, 1920);\n  return items.at(-1).getBoundingClientRect().x > (screen * 2);\n}\n</script>\n\n<style lang=\"scss\" scoped>\n.newsticker {\n  width: 100%;\n  position: relative;\n  overflow-x: hidden;\n\n  .roller {\n    position: absolute;\n    left: 0;\n    display: flex;\n    align-items: center;\n  }\n}\n</style>"],"names":["MAX_ITEM","props","__props","roller","ref","mounted","useMounted","cloning","childrenHeights","height","computed","heights","ch","translateX","midIndex","watchImmediate","on","pack","until","roll","pause","useRafFn","lastItemIsFarAway","clone","useElementSize","size","node","delta","start","end","startRect","endRect","n","items","screen"],"mappings":"+MAcA,MAAMA,EAAW,4GACjB,MAAMC,EAAQC,EAURC,EAASC,EAAI,IAAI,EACjBC,EAAUC,EAAY,EACtBC,EAAUH,EAAI,EAAI,EAClBI,EAAkBJ,EAAI,EAAE,EACxBK,EAASC,EAAS,IAAM,CAC5B,GAAI,CAACT,EAAM,QAAS,MAAO,OAC3B,MAAMU,EAAUH,EAAgB,MAAM,IAAII,GAAMA,EAAG,KAAK,EACxD,OAAOD,EAAQ,SAAW,EAAI,OAAS,GAAG,KAAK,IAAI,GAAGA,CAAO,CAAC,IAChE,CAAC,EACD,IAAIE,EAAa,EACbC,EAAW,EAEfC,EAAe,IAAMV,EAAQ,OAASJ,EAAM,QAAUe,GAAOA,GAAMC,GAAM,EAEzEC,EAAM,IAAMjB,EAAM,SAAW,CAACM,EAAQ,KAAK,EAAE,WAAU,EAAG,KAAKY,CAAI,EAEnE,SAASF,GAAO,CACd,KAAM,CAAE,MAAAG,GAAUC,EAAS,IAAM,CAC/Bd,EAAQ,MAAQ,CAACe,EAAmB,EACpCf,EAAQ,OAASgB,EAAO,CAC5B,CAAG,EAEDL,EAAMX,CAAO,EAAE,KAAK,EAAK,EAAE,KAAK,IAAM,CACpCa,EAAO,EACPZ,EAAgB,MAAQ,CAAC,GAAGL,EAAO,MAAM,QAAQ,EAAE,IAAIqB,CAAc,EAAE,IAAIC,GAAQA,EAAK,MAAM,CAClG,CAAG,CACH,CAEA,SAASF,GAAQ,CACf,QAASG,IAAQ,CAAC,GAAGvB,EAAO,MAAM,QAAQ,EAAG,CAC3C,GAAIA,EAAO,MAAM,SAAS,QAAUH,EAAU,CAC5CO,EAAQ,MAAQ,GAChB,MACN,CAEIJ,EAAO,MAAM,YAAYuB,EAAK,UAAU,EAAI,CAAC,CACjD,CACA,CAEA,SAASP,GAAO,CACdL,EAAW,KAAK,KAAKX,EAAO,MAAM,SAAS,OAAS,CAAC,EAErDkB,EAAS,CAAC,CAAE,MAAAM,KAAY,CACtBd,GAAcZ,EAAM,OAAS0B,EAAQ,KACrCxB,EAAO,MAAM,MAAM,UAAY,cAAcU,CAAU,MAEvD,MAAMe,EAAQzB,EAAO,MAAM,SAAS,CAAC,EAC/B0B,EAAM1B,EAAO,MAAM,SAASW,CAAQ,EACpCgB,EAAYF,EAAM,sBAAuB,EACzCG,EAAUF,EAAI,sBAAuB,EACvCE,EAAQ,EAAI,CAACA,EAAQ,QACvBlB,GAAekB,EAAQ,EAAID,EAAU,EACrC,CAAC,GAAG3B,EAAO,MAAM,QAAQ,EAAE,MAAM,EAAGW,CAAQ,EAAE,QAAQkB,GAAK7B,EAAO,MAAM,YAAY6B,CAAC,CAAC,EAEzF,CAAA,CACH,CAEA,SAASV,GAAoB,CAC3B,MAAMW,EAAQ,CAAC,GAAG9B,EAAO,MAAM,QAAQ,EACjC+B,EAAS,KAAK,IAAI,OAAO,WAAY,IAAI,EAC/C,OAAOD,EAAM,GAAG,EAAE,EAAE,sBAAqB,EAAG,EAAKC,EAAS,CAC5D"}