marqy 1.0.3 → 1.1.1

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.
Files changed (116) hide show
  1. package/dist/core-COOoOGpB.js +21 -0
  2. package/dist/core-COOoOGpB.js.map +1 -0
  3. package/dist/core-CuZGUfsl.cjs +2 -0
  4. package/dist/core-CuZGUfsl.cjs.map +1 -0
  5. package/dist/index.cjs.js +2 -0
  6. package/dist/index.cjs.js.map +1 -0
  7. package/dist/index.d.ts +15 -0
  8. package/dist/index.esm.js +5 -0
  9. package/dist/index.esm.js.map +1 -0
  10. package/dist/marqy.css +4 -0
  11. package/dist/react.cjs.js +2 -0
  12. package/dist/react.cjs.js.map +1 -0
  13. package/dist/react.d.ts +15 -0
  14. package/dist/react.esm.js +59 -0
  15. package/dist/react.esm.js.map +1 -0
  16. package/dist/svelte.cjs.js +2 -0
  17. package/dist/svelte.cjs.js.map +1 -0
  18. package/dist/svelte.d.ts +7 -0
  19. package/dist/svelte.esm.js +47 -0
  20. package/dist/svelte.esm.js.map +1 -0
  21. package/dist/vanilla.cjs.js +2 -0
  22. package/dist/vanilla.cjs.js.map +1 -0
  23. package/dist/vanilla.d.ts +32 -0
  24. package/dist/vanilla.esm.js +93 -0
  25. package/dist/vanilla.esm.js.map +1 -0
  26. package/dist/vue.cjs.js +2 -0
  27. package/dist/vue.cjs.js.map +1 -0
  28. package/dist/vue.d.ts +45 -0
  29. package/dist/vue.esm.js +70 -0
  30. package/dist/vue.esm.js.map +1 -0
  31. package/package.json +81 -19
  32. package/.claude/settings.local.json +0 -13
  33. package/.prettierrc +0 -6
  34. package/.vscode/settings.json +0 -3
  35. package/dist/marqy.d.ts +0 -9
  36. package/dist/marqy.esm.js +0 -2
  37. package/dist/marqy.esm.js.map +0 -1
  38. package/dist/marqy.js +0 -2
  39. package/dist/marqy.js.map +0 -1
  40. package/dist/marqy.umd.js +0 -2
  41. package/dist/marqy.umd.js.map +0 -1
  42. package/examples/.astro/content-assets.mjs +0 -1
  43. package/examples/.astro/content-modules.mjs +0 -1
  44. package/examples/.astro/content.d.ts +0 -154
  45. package/examples/.astro/data-store.json +0 -1
  46. package/examples/.astro/fonts/font-akkurat-mono-500-normal-40f4e0ea0b54adc5.woff2 +0 -0
  47. package/examples/.astro/fonts/font-akkurat-mono-700-normal-b9f40f1447b587bd.woff +0 -0
  48. package/examples/.astro/fonts/font-grtsk-300-normal-8ef14ca23be6893c.woff2 +0 -0
  49. package/examples/.astro/fonts/font-grtsk-400-normal-13ba8954073ee64a.woff2 +0 -0
  50. package/examples/.astro/fonts/font-grtsk-500-normal-d214468daf16245f.woff2 +0 -0
  51. package/examples/.astro/fonts/font-grtsk-wide-500-normal-6f8c2658b9c2ba8e.woff2 +0 -0
  52. package/examples/.astro/fonts/font-grtsk-wide-700-normal-17406f09c7b68ca3.woff2 +0 -0
  53. package/examples/.astro/fonts.d.ts +0 -4
  54. package/examples/.astro/settings.json +0 -5
  55. package/examples/.astro/types.d.ts +0 -3
  56. package/examples/.yarnrc +0 -1
  57. package/examples/astro.config.mjs +0 -101
  58. package/examples/package.json +0 -30
  59. package/examples/public/apple-touch-icon.png +0 -0
  60. package/examples/public/favicon.ico +0 -0
  61. package/examples/public/favicon.svg +0 -4
  62. package/examples/public/marqy-logo.svg +0 -35
  63. package/examples/src/assets/baggu.jpg +0 -0
  64. package/examples/src/assets/bluesky.jpg +0 -0
  65. package/examples/src/assets/clams-lol.jpg +0 -0
  66. package/examples/src/assets/coconut-club-2.jpg +0 -0
  67. package/examples/src/assets/coconut-club.jpg +0 -0
  68. package/examples/src/assets/lucci.jpg +0 -0
  69. package/examples/src/assets/phila-museum.jpg +0 -0
  70. package/examples/src/assets/red-rooster.jpg +0 -0
  71. package/examples/src/assets/sanity.jpg +0 -0
  72. package/examples/src/assets/usal.jpg +0 -0
  73. package/examples/src/assets/vacation.jpg +0 -0
  74. package/examples/src/components/CopyButton.tsx +0 -26
  75. package/examples/src/components/Divider.tsx +0 -3
  76. package/examples/src/components/Footer.astro +0 -7
  77. package/examples/src/components/InUse.astro +0 -89
  78. package/examples/src/components/InUseExamples.tsx +0 -60
  79. package/examples/src/components/MarqyCredits.tsx +0 -33
  80. package/examples/src/components/MarqyHero.tsx +0 -77
  81. package/examples/src/components/MarqyInteractiveDemo.tsx +0 -46
  82. package/examples/src/components/MarqyPlayground.tsx +0 -496
  83. package/examples/src/components/MarqySpeedDemo.tsx +0 -34
  84. package/examples/src/components/MarqyVerticalDemo.tsx +0 -44
  85. package/examples/src/components/Playground.astro +0 -11
  86. package/examples/src/components/QuickStart.astro +0 -59
  87. package/examples/src/components/SectionHeadline.tsx +0 -41
  88. package/examples/src/components/Tile.tsx +0 -32
  89. package/examples/src/content.config.ts +0 -3
  90. package/examples/src/fonts/Akkurat-Mono-Bold.woff +0 -0
  91. package/examples/src/fonts/Akkurat-Mono.woff +0 -0
  92. package/examples/src/fonts/Akkurat-Mono.woff2 +0 -0
  93. package/examples/src/fonts/Grtsk-Peta-Light.woff +0 -0
  94. package/examples/src/fonts/Grtsk-Peta-Light.woff2 +0 -0
  95. package/examples/src/fonts/Grtsk-Peta-Medium.woff +0 -0
  96. package/examples/src/fonts/Grtsk-Peta-Medium.woff2 +0 -0
  97. package/examples/src/fonts/Grtsk-Peta-Regular.woff +0 -0
  98. package/examples/src/fonts/Grtsk-Peta-Regular.woff2 +0 -0
  99. package/examples/src/fonts/Grtsk-Tera-Bold.woff +0 -0
  100. package/examples/src/fonts/Grtsk-Tera-Bold.woff2 +0 -0
  101. package/examples/src/fonts/Grtsk-Tera-Medium.woff +0 -0
  102. package/examples/src/fonts/Grtsk-Tera-Medium.woff2 +0 -0
  103. package/examples/src/layouts/layout.astro +0 -107
  104. package/examples/src/lib/cn.ts +0 -16
  105. package/examples/src/lib/helpers.ts +0 -13
  106. package/examples/src/lib/hooks/useCopyText.ts +0 -47
  107. package/examples/src/pages/index.astro +0 -56
  108. package/examples/src/styles/_base.css +0 -155
  109. package/examples/src/styles/_components.css +0 -123
  110. package/examples/src/styles/_utilities.css +0 -23
  111. package/examples/src/styles/app.css +0 -397
  112. package/examples/tsconfig.json +0 -3
  113. package/examples/yarn.lock +0 -3316
  114. package/marqy.css +0 -131
  115. package/src/marqy.tsx +0 -97
  116. package/tsconfig.json +0 -9
@@ -0,0 +1,21 @@
1
+ function r(t, e) {
2
+ return e > 0 ? Math.ceil(t / e) : 1;
3
+ }
4
+ function i(t, e, n) {
5
+ return `${(t ?? 0) * e / (100 * n)}s`;
6
+ }
7
+ function o(t, e) {
8
+ const n = new ResizeObserver(
9
+ ([c]) => e({
10
+ width: c.contentRect.width,
11
+ height: c.contentRect.height
12
+ })
13
+ );
14
+ return n.observe(t), () => n.disconnect();
15
+ }
16
+ export {
17
+ r as a,
18
+ o as b,
19
+ i as c
20
+ };
21
+ //# sourceMappingURL=core-COOoOGpB.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-COOoOGpB.js","sources":["../src/core.ts"],"sourcesContent":["export type MarqyDirection = 'left' | 'right' | 'up' | 'down'\n\nexport interface MarqyDimensions {\n width: number\n height: number\n}\n\nexport function calcReps(containerSize: number, itemSize: number): number {\n return itemSize > 0 ? Math.ceil(containerSize / itemSize) : 1\n}\n\nexport function calcAnimationDuration(\n itemDimension: number,\n reps: number,\n speed: number\n): string {\n return `${((itemDimension ?? 0) * reps) / (100 * speed)}s`\n}\n\nexport function createResizeObserver(\n node: Element,\n callback: (dims: MarqyDimensions) => void\n): () => void {\n const ro = new ResizeObserver(([entry]) =>\n callback({\n width: entry.contentRect.width,\n height: entry.contentRect.height,\n })\n )\n ro.observe(node)\n return () => ro.disconnect()\n}\n"],"names":["calcReps","containerSize","itemSize","calcAnimationDuration","itemDimension","reps","speed","createResizeObserver","node","callback","ro","entry"],"mappings":"AAOO,SAASA,EAASC,GAAuBC,GAA0B;AACxE,SAAOA,IAAW,IAAI,KAAK,KAAKD,IAAgBC,CAAQ,IAAI;AAC9D;AAEO,SAASC,EACdC,GACAC,GACAC,GACQ;AACR,SAAO,IAAKF,KAAiB,KAAKC,KAAS,MAAMC,EAAM;AACzD;AAEO,SAASC,EACdC,GACAC,GACY;AACZ,QAAMC,IAAK,IAAI;AAAA,IAAe,CAAC,CAACC,CAAK,MACnCF,EAAS;AAAA,MACP,OAAOE,EAAM,YAAY;AAAA,MACzB,QAAQA,EAAM,YAAY;AAAA,IAAA,CAC3B;AAAA,EAAA;AAEH,SAAAD,EAAG,QAAQF,CAAI,GACR,MAAME,EAAG,WAAA;AAClB;"}
@@ -0,0 +1,2 @@
1
+ "use strict";function r(t,e){return e>0?Math.ceil(t/e):1}function i(t,e,c){return`${(t??0)*e/(100*c)}s`}function s(t,e){const c=new ResizeObserver(([n])=>e({width:n.contentRect.width,height:n.contentRect.height}));return c.observe(t),()=>c.disconnect()}exports.calcAnimationDuration=i;exports.calcReps=r;exports.createResizeObserver=s;
2
+ //# sourceMappingURL=core-CuZGUfsl.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"core-CuZGUfsl.cjs","sources":["../src/core.ts"],"sourcesContent":["export type MarqyDirection = 'left' | 'right' | 'up' | 'down'\n\nexport interface MarqyDimensions {\n width: number\n height: number\n}\n\nexport function calcReps(containerSize: number, itemSize: number): number {\n return itemSize > 0 ? Math.ceil(containerSize / itemSize) : 1\n}\n\nexport function calcAnimationDuration(\n itemDimension: number,\n reps: number,\n speed: number\n): string {\n return `${((itemDimension ?? 0) * reps) / (100 * speed)}s`\n}\n\nexport function createResizeObserver(\n node: Element,\n callback: (dims: MarqyDimensions) => void\n): () => void {\n const ro = new ResizeObserver(([entry]) =>\n callback({\n width: entry.contentRect.width,\n height: entry.contentRect.height,\n })\n )\n ro.observe(node)\n return () => ro.disconnect()\n}\n"],"names":["calcReps","containerSize","itemSize","calcAnimationDuration","itemDimension","reps","speed","createResizeObserver","node","callback","ro","entry"],"mappings":"aAOO,SAASA,EAASC,EAAuBC,EAA0B,CACxE,OAAOA,EAAW,EAAI,KAAK,KAAKD,EAAgBC,CAAQ,EAAI,CAC9D,CAEO,SAASC,EACdC,EACAC,EACAC,EACQ,CACR,MAAO,IAAKF,GAAiB,GAAKC,GAAS,IAAMC,EAAM,GACzD,CAEO,SAASC,EACdC,EACAC,EACY,CACZ,MAAMC,EAAK,IAAI,eAAe,CAAC,CAACC,CAAK,IACnCF,EAAS,CACP,MAAOE,EAAM,YAAY,MACzB,OAAQA,EAAM,YAAY,MAAA,CAC3B,CAAA,EAEH,OAAAD,EAAG,QAAQF,CAAI,EACR,IAAME,EAAG,WAAA,CAClB"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("./react.cjs.js");exports.Marqy=e.Marqy;
2
+ //# sourceMappingURL=index.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":""}
@@ -0,0 +1,15 @@
1
+ import * as React_2 from 'react';
2
+
3
+ export declare function Marqy({ speed, direction, pauseOnHover, manual, children, ...rest }: MarqyProps): React_2.ReactElement;
4
+
5
+ export declare type MarqyDirection = 'left' | 'right' | 'up' | 'down';
6
+
7
+ export declare interface MarqyProps extends React_2.ComponentPropsWithoutRef<'div'> {
8
+ speed?: number;
9
+ direction?: MarqyDirection;
10
+ pauseOnHover?: boolean;
11
+ manual?: boolean;
12
+ children: React_2.ReactNode;
13
+ }
14
+
15
+ export { }
@@ -0,0 +1,5 @@
1
+ import { Marqy as a } from "./react.esm.js";
2
+ export {
3
+ a as Marqy
4
+ };
5
+ //# sourceMappingURL=index.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.esm.js","sources":[],"sourcesContent":[],"names":[],"mappings":";"}
package/dist/marqy.css CHANGED
@@ -1,3 +1,7 @@
1
+ marqy-loop {
2
+ display: block;
3
+ }
4
+
1
5
  [data-marqy] {
2
6
  position: relative;
3
7
  width: 100%;
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const u=require("react/jsx-runtime"),v=require("react"),l=require("./core-CuZGUfsl.cjs");function D(e){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const n in e)if(n!=="default"){const a=Object.getOwnPropertyDescriptor(e,n);Object.defineProperty(t,n,a.get?a:{enumerable:!0,get:()=>e[n]})}}return t.default=e,Object.freeze(t)}const r=D(v);function R({speed:e=.5,direction:t="left",pauseOnHover:n,manual:a=!1,children:o,...w}){const[d,f]=r.useState(1),[j,s]=b(),[q,i]=b(),c=t==="up"||t==="down",h=r.useCallback(m=>l.calcAnimationDuration(m,d,e),[d,e]);return r.useEffect(()=>{!c&&s.width&&i.width&&f(l.calcReps(s.width,i.width)),c&&s.height&&i.height&&f(l.calcReps(s.height,i.height))},[c,s,i]),u.jsx("div",{ref:j,"data-marqy":"","data-direction":t,"data-pause-on-hover":n?"":null,...w,children:u.jsx("div",{"data-marqy-inner":"",children:new Array(2).fill(0).map((m,g)=>u.jsx("div",{"data-marqy-content":"",...a?{"data-marqy-static":h(c?i.height:i.width)}:{style:{animationDuration:h(c?i.height:i.width)}},children:new Array(d).fill(0).map((O,y)=>{const p=g===0&&y===0;return u.jsx("div",{ref:p?q:null,"aria-hidden":!p||void 0,"data-marqy-item":"",children:o},y)})},g))})})}function b(){const[e,t]=r.useState({width:0,height:0}),n=r.useRef(null);return[r.useCallback(o=>{n.current?.(),o&&(n.current=l.createResizeObserver(o,t))},[]),e]}exports.Marqy=R;
2
+ //# sourceMappingURL=react.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.cjs.js","sources":["../src/react/index.tsx"],"sourcesContent":["import * as React from 'react'\nimport {\n type MarqyDirection,\n type MarqyDimensions,\n calcReps,\n calcAnimationDuration,\n createResizeObserver,\n} from '../core'\n\nexport type { MarqyDirection }\n\nexport interface MarqyProps extends React.ComponentPropsWithoutRef<'div'> {\n speed?: number\n direction?: MarqyDirection\n pauseOnHover?: boolean\n manual?: boolean\n children: React.ReactNode\n}\n\nexport function Marqy({\n speed = 0.5,\n direction = 'left',\n pauseOnHover,\n manual = false,\n children,\n ...rest\n}: MarqyProps): React.ReactElement {\n const [reps, setReps] = React.useState(1)\n\n const [container, containerDimensions] = useDimensions()\n const [item, itemDimensions] = useDimensions()\n\n const isVertical = direction === 'up' || direction === 'down'\n\n const getAnimationDuration = React.useCallback(\n (itemDimension: number) => calcAnimationDuration(itemDimension, reps, speed),\n [reps, speed]\n )\n\n React.useEffect(() => {\n if (!isVertical && containerDimensions.width && itemDimensions.width) {\n setReps(calcReps(containerDimensions.width, itemDimensions.width))\n }\n if (isVertical && containerDimensions.height && itemDimensions.height) {\n setReps(calcReps(containerDimensions.height, itemDimensions.height))\n }\n }, [isVertical, containerDimensions, itemDimensions])\n\n return (\n <div\n ref={container}\n data-marqy=\"\"\n data-direction={direction}\n data-pause-on-hover={pauseOnHover ? '' : null}\n {...rest}\n >\n <div data-marqy-inner=\"\">\n {new Array(2).fill(0).map((_, clone) => (\n <div\n key={clone}\n data-marqy-content=\"\"\n {...(manual\n ? { 'data-marqy-static': getAnimationDuration(isVertical ? itemDimensions.height : itemDimensions.width) }\n : { style: { animationDuration: getAnimationDuration(isVertical ? itemDimensions.height : itemDimensions.width) } }\n )}\n >\n {new Array(reps).fill(0).map((_, rep) => {\n const isFirstItem = clone === 0 && rep === 0\n return (\n <div\n key={rep}\n ref={isFirstItem ? item : null}\n aria-hidden={!isFirstItem || undefined}\n data-marqy-item=\"\"\n >\n {children}\n </div>\n )\n })}\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nfunction useDimensions() {\n const [dimensions, setDimensions] = React.useState<MarqyDimensions>({ width: 0, height: 0 })\n const cleanupRef = React.useRef<(() => void) | null>(null)\n\n const ref = React.useCallback((node: HTMLElement | null) => {\n cleanupRef.current?.()\n if (!node) return\n cleanupRef.current = createResizeObserver(node, setDimensions)\n }, [])\n\n return [ref, dimensions] as const\n}\n"],"names":["Marqy","speed","direction","pauseOnHover","manual","children","rest","reps","setReps","React","container","containerDimensions","useDimensions","item","itemDimensions","isVertical","getAnimationDuration","itemDimension","calcAnimationDuration","calcReps","jsx","_","clone","rep","isFirstItem","dimensions","setDimensions","cleanupRef","node","createResizeObserver"],"mappings":"mcAmBO,SAASA,EAAM,CACpB,MAAAC,EAAQ,GACR,UAAAC,EAAY,OACZ,aAAAC,EACA,OAAAC,EAAS,GACT,SAAAC,EACA,GAAGC,CACL,EAAmC,CACjC,KAAM,CAACC,EAAMC,CAAO,EAAIC,EAAM,SAAS,CAAC,EAElC,CAACC,EAAWC,CAAmB,EAAIC,EAAA,EACnC,CAACC,EAAMC,CAAc,EAAIF,EAAA,EAEzBG,EAAab,IAAc,MAAQA,IAAc,OAEjDc,EAAuBP,EAAM,YAChCQ,GAA0BC,EAAAA,sBAAsBD,EAAeV,EAAMN,CAAK,EAC3E,CAACM,EAAMN,CAAK,CAAA,EAGdQ,OAAAA,EAAM,UAAU,IAAM,CAChB,CAACM,GAAcJ,EAAoB,OAASG,EAAe,OAC7DN,EAAQW,EAAAA,SAASR,EAAoB,MAAOG,EAAe,KAAK,CAAC,EAE/DC,GAAcJ,EAAoB,QAAUG,EAAe,QAC7DN,EAAQW,EAAAA,SAASR,EAAoB,OAAQG,EAAe,MAAM,CAAC,CAEvE,EAAG,CAACC,EAAYJ,EAAqBG,CAAc,CAAC,EAGlDM,EAAAA,IAAC,MAAA,CACC,IAAKV,EACL,aAAW,GACX,iBAAgBR,EAChB,sBAAqBC,EAAe,GAAK,KACxC,GAAGG,EAEJ,SAAAc,EAAAA,IAAC,MAAA,CAAI,mBAAiB,GACnB,aAAI,MAAM,CAAC,EAAE,KAAK,CAAC,EAAE,IAAI,CAACC,EAAGC,IAC5BF,EAAAA,IAAC,MAAA,CAEC,qBAAmB,GAClB,GAAIhB,EACD,CAAE,oBAAqBY,EAAqBD,EAAaD,EAAe,OAASA,EAAe,KAAK,CAAA,EACrG,CAAE,MAAO,CAAE,kBAAmBE,EAAqBD,EAAaD,EAAe,OAASA,EAAe,KAAK,EAAE,EAGjH,SAAA,IAAI,MAAMP,CAAI,EAAE,KAAK,CAAC,EAAE,IAAI,CAACc,EAAGE,IAAQ,CACvC,MAAMC,EAAcF,IAAU,GAAKC,IAAQ,EAC3C,OACEH,EAAAA,IAAC,MAAA,CAEC,IAAKI,EAAcX,EAAO,KAC1B,cAAa,CAACW,GAAe,OAC7B,kBAAgB,GAEf,SAAAnB,CAAA,EALIkB,CAAA,CAQX,CAAC,CAAA,EAnBID,CAAA,CAqBR,CAAA,CACH,CAAA,CAAA,CAGN,CAEA,SAASV,GAAgB,CACvB,KAAM,CAACa,EAAYC,CAAa,EAAIjB,EAAM,SAA0B,CAAE,MAAO,EAAG,OAAQ,EAAG,EACrFkB,EAAalB,EAAM,OAA4B,IAAI,EAQzD,MAAO,CANKA,EAAM,YAAamB,GAA6B,CAC1DD,EAAW,UAAA,EACNC,IACLD,EAAW,QAAUE,uBAAqBD,EAAMF,CAAa,EAC/D,EAAG,CAAA,CAAE,EAEQD,CAAU,CACzB"}
@@ -0,0 +1,15 @@
1
+ import * as React_2 from 'react';
2
+
3
+ export declare function Marqy({ speed, direction, pauseOnHover, manual, children, ...rest }: MarqyProps): React_2.ReactElement;
4
+
5
+ export declare type MarqyDirection = 'left' | 'right' | 'up' | 'down';
6
+
7
+ export declare interface MarqyProps extends React_2.ComponentPropsWithoutRef<'div'> {
8
+ speed?: number;
9
+ direction?: MarqyDirection;
10
+ pauseOnHover?: boolean;
11
+ manual?: boolean;
12
+ children: React_2.ReactNode;
13
+ }
14
+
15
+ export { }
@@ -0,0 +1,59 @@
1
+ import { jsx as c } from "react/jsx-runtime";
2
+ import * as e from "react";
3
+ import { c as R, a as y, b } from "./core-COOoOGpB.js";
4
+ function C({
5
+ speed: r = 0.5,
6
+ direction: i = "left",
7
+ pauseOnHover: s,
8
+ manual: m = !1,
9
+ children: o,
10
+ ...v
11
+ }) {
12
+ const [h, u] = e.useState(1), [D, a] = g(), [q, t] = g(), n = i === "up" || i === "down", d = e.useCallback(
13
+ (l) => R(l, h, r),
14
+ [h, r]
15
+ );
16
+ return e.useEffect(() => {
17
+ !n && a.width && t.width && u(y(a.width, t.width)), n && a.height && t.height && u(y(a.height, t.height));
18
+ }, [n, a, t]), /* @__PURE__ */ c(
19
+ "div",
20
+ {
21
+ ref: D,
22
+ "data-marqy": "",
23
+ "data-direction": i,
24
+ "data-pause-on-hover": s ? "" : null,
25
+ ...v,
26
+ children: /* @__PURE__ */ c("div", { "data-marqy-inner": "", children: new Array(2).fill(0).map((l, f) => /* @__PURE__ */ c(
27
+ "div",
28
+ {
29
+ "data-marqy-content": "",
30
+ ...m ? { "data-marqy-static": d(n ? t.height : t.width) } : { style: { animationDuration: d(n ? t.height : t.width) } },
31
+ children: new Array(h).fill(0).map((A, p) => {
32
+ const w = f === 0 && p === 0;
33
+ return /* @__PURE__ */ c(
34
+ "div",
35
+ {
36
+ ref: w ? q : null,
37
+ "aria-hidden": !w || void 0,
38
+ "data-marqy-item": "",
39
+ children: o
40
+ },
41
+ p
42
+ );
43
+ })
44
+ },
45
+ f
46
+ )) })
47
+ }
48
+ );
49
+ }
50
+ function g() {
51
+ const [r, i] = e.useState({ width: 0, height: 0 }), s = e.useRef(null);
52
+ return [e.useCallback((o) => {
53
+ s.current?.(), o && (s.current = b(o, i));
54
+ }, []), r];
55
+ }
56
+ export {
57
+ C as Marqy
58
+ };
59
+ //# sourceMappingURL=react.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.esm.js","sources":["../src/react/index.tsx"],"sourcesContent":["import * as React from 'react'\nimport {\n type MarqyDirection,\n type MarqyDimensions,\n calcReps,\n calcAnimationDuration,\n createResizeObserver,\n} from '../core'\n\nexport type { MarqyDirection }\n\nexport interface MarqyProps extends React.ComponentPropsWithoutRef<'div'> {\n speed?: number\n direction?: MarqyDirection\n pauseOnHover?: boolean\n manual?: boolean\n children: React.ReactNode\n}\n\nexport function Marqy({\n speed = 0.5,\n direction = 'left',\n pauseOnHover,\n manual = false,\n children,\n ...rest\n}: MarqyProps): React.ReactElement {\n const [reps, setReps] = React.useState(1)\n\n const [container, containerDimensions] = useDimensions()\n const [item, itemDimensions] = useDimensions()\n\n const isVertical = direction === 'up' || direction === 'down'\n\n const getAnimationDuration = React.useCallback(\n (itemDimension: number) => calcAnimationDuration(itemDimension, reps, speed),\n [reps, speed]\n )\n\n React.useEffect(() => {\n if (!isVertical && containerDimensions.width && itemDimensions.width) {\n setReps(calcReps(containerDimensions.width, itemDimensions.width))\n }\n if (isVertical && containerDimensions.height && itemDimensions.height) {\n setReps(calcReps(containerDimensions.height, itemDimensions.height))\n }\n }, [isVertical, containerDimensions, itemDimensions])\n\n return (\n <div\n ref={container}\n data-marqy=\"\"\n data-direction={direction}\n data-pause-on-hover={pauseOnHover ? '' : null}\n {...rest}\n >\n <div data-marqy-inner=\"\">\n {new Array(2).fill(0).map((_, clone) => (\n <div\n key={clone}\n data-marqy-content=\"\"\n {...(manual\n ? { 'data-marqy-static': getAnimationDuration(isVertical ? itemDimensions.height : itemDimensions.width) }\n : { style: { animationDuration: getAnimationDuration(isVertical ? itemDimensions.height : itemDimensions.width) } }\n )}\n >\n {new Array(reps).fill(0).map((_, rep) => {\n const isFirstItem = clone === 0 && rep === 0\n return (\n <div\n key={rep}\n ref={isFirstItem ? item : null}\n aria-hidden={!isFirstItem || undefined}\n data-marqy-item=\"\"\n >\n {children}\n </div>\n )\n })}\n </div>\n ))}\n </div>\n </div>\n )\n}\n\nfunction useDimensions() {\n const [dimensions, setDimensions] = React.useState<MarqyDimensions>({ width: 0, height: 0 })\n const cleanupRef = React.useRef<(() => void) | null>(null)\n\n const ref = React.useCallback((node: HTMLElement | null) => {\n cleanupRef.current?.()\n if (!node) return\n cleanupRef.current = createResizeObserver(node, setDimensions)\n }, [])\n\n return [ref, dimensions] as const\n}\n"],"names":["Marqy","speed","direction","pauseOnHover","manual","children","rest","reps","setReps","React","container","containerDimensions","useDimensions","item","itemDimensions","isVertical","getAnimationDuration","itemDimension","calcAnimationDuration","calcReps","jsx","_","clone","rep","isFirstItem","dimensions","setDimensions","cleanupRef","node","createResizeObserver"],"mappings":";;;AAmBO,SAASA,EAAM;AAAA,EACpB,OAAAC,IAAQ;AAAA,EACR,WAAAC,IAAY;AAAA,EACZ,cAAAC;AAAA,EACA,QAAAC,IAAS;AAAA,EACT,UAAAC;AAAA,EACA,GAAGC;AACL,GAAmC;AACjC,QAAM,CAACC,GAAMC,CAAO,IAAIC,EAAM,SAAS,CAAC,GAElC,CAACC,GAAWC,CAAmB,IAAIC,EAAA,GACnC,CAACC,GAAMC,CAAc,IAAIF,EAAA,GAEzBG,IAAab,MAAc,QAAQA,MAAc,QAEjDc,IAAuBP,EAAM;AAAA,IACjC,CAACQ,MAA0BC,EAAsBD,GAAeV,GAAMN,CAAK;AAAA,IAC3E,CAACM,GAAMN,CAAK;AAAA,EAAA;AAGd,SAAAQ,EAAM,UAAU,MAAM;AACpB,IAAI,CAACM,KAAcJ,EAAoB,SAASG,EAAe,SAC7DN,EAAQW,EAASR,EAAoB,OAAOG,EAAe,KAAK,CAAC,GAE/DC,KAAcJ,EAAoB,UAAUG,EAAe,UAC7DN,EAAQW,EAASR,EAAoB,QAAQG,EAAe,MAAM,CAAC;AAAA,EAEvE,GAAG,CAACC,GAAYJ,GAAqBG,CAAc,CAAC,GAGlD,gBAAAM;AAAA,IAAC;AAAA,IAAA;AAAA,MACC,KAAKV;AAAA,MACL,cAAW;AAAA,MACX,kBAAgBR;AAAA,MAChB,uBAAqBC,IAAe,KAAK;AAAA,MACxC,GAAGG;AAAA,MAEJ,UAAA,gBAAAc,EAAC,OAAA,EAAI,oBAAiB,IACnB,cAAI,MAAM,CAAC,EAAE,KAAK,CAAC,EAAE,IAAI,CAACC,GAAGC,MAC5B,gBAAAF;AAAA,QAAC;AAAA,QAAA;AAAA,UAEC,sBAAmB;AAAA,UAClB,GAAIhB,IACD,EAAE,qBAAqBY,EAAqBD,IAAaD,EAAe,SAASA,EAAe,KAAK,EAAA,IACrG,EAAE,OAAO,EAAE,mBAAmBE,EAAqBD,IAAaD,EAAe,SAASA,EAAe,KAAK,IAAE;AAAA,UAGjH,UAAA,IAAI,MAAMP,CAAI,EAAE,KAAK,CAAC,EAAE,IAAI,CAACc,GAAGE,MAAQ;AACvC,kBAAMC,IAAcF,MAAU,KAAKC,MAAQ;AAC3C,mBACE,gBAAAH;AAAA,cAAC;AAAA,cAAA;AAAA,gBAEC,KAAKI,IAAcX,IAAO;AAAA,gBAC1B,eAAa,CAACW,KAAe;AAAA,gBAC7B,mBAAgB;AAAA,gBAEf,UAAAnB;AAAA,cAAA;AAAA,cALIkB;AAAA,YAAA;AAAA,UAQX,CAAC;AAAA,QAAA;AAAA,QAnBID;AAAA,MAAA,CAqBR,EAAA,CACH;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,SAASV,IAAgB;AACvB,QAAM,CAACa,GAAYC,CAAa,IAAIjB,EAAM,SAA0B,EAAE,OAAO,GAAG,QAAQ,GAAG,GACrFkB,IAAalB,EAAM,OAA4B,IAAI;AAQzD,SAAO,CANKA,EAAM,YAAY,CAACmB,MAA6B;AAE1D,IADAD,EAAW,UAAA,GACNC,MACLD,EAAW,UAAUE,EAAqBD,GAAMF,CAAa;AAAA,EAC/D,GAAG,CAAA,CAAE,GAEQD,CAAU;AACzB;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require("svelte/internal/disclose-version");const S=require("svelte/internal/client"),v=require("./core-CuZGUfsl.cjs");function j(r){const t=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(r){for(const a in r)if(a!=="default"){const i=Object.getOwnPropertyDescriptor(r,a);Object.defineProperty(t,a,i.get?i:{enumerable:!0,get:()=>r[a]})}}return t.default=r,Object.freeze(t)}const e=j(S);var z=e.from_html('<div data-marqy-item=""><!></div>'),x=e.from_html("<div></div>"),M=e.from_html('<div><div data-marqy-inner=""></div></div>');function H(r,t){e.push(t,!0);let a=e.prop(t,"speed",3,.5),i=e.prop(t,"direction",3,"left"),y=e.prop(t,"pauseOnHover",3,!1),b=e.prop(t,"manual",3,!1),O=e.rest_props(t,["$$slots","$$events","$$legacy","speed","direction","pauseOnHover","manual","children"]),h=e.state(e.proxy({width:0,height:0})),d=e.state(e.proxy({width:0,height:0})),m=e.derived(()=>{const c=e.get(g)?e.get(h).height:e.get(h).width,n=e.get(g)?e.get(d).height:e.get(d).width;return v.calcReps(c,n)});const g=e.derived(()=>i()==="up"||i()==="down"),p=e.derived(()=>v.calcAnimationDuration(e.get(g)?e.get(d).height:e.get(d).width,e.get(m),a()));var o=M();e.attribute_effect(o,()=>({"data-marqy":"","data-direction":i(),"data-pause-on-hover":y()?"":void 0,...O}));var f=e.child(o);e.each(f,20,()=>[0,1],e.index,(c,n)=>{var u=x();e.attribute_effect(u,()=>({"data-marqy-content":"",...b()?{"data-marqy-static":e.get(p)}:{style:`animation-duration: ${e.get(p)}`}})),e.each(u,21,()=>Array.from({length:e.get(m)},(_,l)=>l),e.index,(_,l)=>{var s=z(),q=e.child(s);e.snippet(q,()=>t.children),e.reset(s),e.attach(s,()=>n===0&&e.get(l)===0?void 0:w=>v.createResizeObserver(w,D=>{e.set(d,D,!0)})),e.template_effect(()=>e.set_attribute(s,"aria-hidden",!(n===0&&e.get(l)===0)||void 0)),e.append(_,s)}),e.reset(u),e.append(c,u)}),e.reset(f),e.reset(o),e.attach(o,()=>c=>v.createResizeObserver(c,n=>{e.set(h,n,!0)})),e.append(r,o),e.pop()}exports.Marqy=H;
2
+ //# sourceMappingURL=svelte.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svelte.cjs.js","sources":["../src/svelte/Marqy.svelte"],"sourcesContent":["<script lang=\"ts\">\n import {\n type MarqyDirection,\n calcReps,\n calcAnimationDuration,\n createResizeObserver,\n } from '../core'\n import type { Snippet } from 'svelte'\n\n interface Props {\n speed?: number\n direction?: MarqyDirection\n pauseOnHover?: boolean\n manual?: boolean\n children: Snippet\n [key: string]: unknown\n }\n\n let {\n speed = 0.5,\n direction = 'left' as MarqyDirection,\n pauseOnHover = false,\n manual = false,\n children,\n ...rest\n }: Props = $props()\n\n let containerDims = $state({ width: 0, height: 0 })\n let itemDims = $state({ width: 0, height: 0 })\n\n let reps = $derived.by(() => {\n const cSize = isVertical ? containerDims.height : containerDims.width\n const iSize = isVertical ? itemDims.height : itemDims.width\n return calcReps(cSize, iSize)\n })\n\n const isVertical = $derived(direction === 'up' || direction === 'down')\n\n const animationDuration = $derived(\n calcAnimationDuration(\n isVertical ? itemDims.height : itemDims.width,\n reps,\n speed\n )\n )\n</script>\n\n<div\n {@attach (containerEl) => {\n return createResizeObserver(containerEl, (d) => {\n containerDims = d\n })\n }}\n data-marqy=\"\"\n data-direction={direction}\n data-pause-on-hover={pauseOnHover ? '' : undefined}\n {...rest}\n>\n <div data-marqy-inner=\"\">\n {#each [0, 1] as clone}\n <div\n data-marqy-content=\"\"\n {...manual\n ? { 'data-marqy-static': animationDuration }\n : { style: `animation-duration: ${animationDuration}` }}\n >\n {#each Array.from({ length: reps }, (_, i) => i) as rep}\n <div\n {@attach clone === 0 && rep === 0\n ? undefined\n : (node) => {\n return createResizeObserver(node, (d) => {\n itemDims = d\n })\n }}\n aria-hidden={!(clone === 0 && rep === 0) || undefined}\n data-marqy-item=\"\"\n >\n {@render children()}\n </div>\n {/each}\n </div>\n {/each}\n </div>\n</div>\n"],"names":["speed","direction","pauseOnHover","manual","rest","$","$$props","containerDims","itemDims","reps","cSize","isVertical","iSize","calcReps","animationDuration","calcAnimationDuration","div","root","div_1","clone","div_2","root_1","i","rep","div_3","root_2","node","createResizeObserver","d","containerEl"],"mappings":"goBAAA,cAmBI,IAAAA,qBAAQ,EAAG,EACXC,yBAAY,MAAM,EAClBC,4BAAe,EAAK,EACpBC,sBAAS,EAAK,EAEXC,EAAIC,EAAA,WAAAC,EAAA,0FAGLC,EAAgBF,QAAMA,EAAA,MAAA,CAAG,MAAO,EAAG,OAAQ,CAAC,CAAA,CAAA,EAC5CG,EAAWH,QAAMA,EAAA,MAAA,CAAG,MAAO,EAAG,OAAQ,CAAC,CAAA,CAAA,EAEvCI,gBAAyB,CACrB,MAAAC,QAAQC,CAAU,EAAGN,EAAA,IAAAE,CAAa,EAAC,OAASF,EAAA,IAAAE,CAAa,EAAC,MAC1DK,EAAKP,EAAA,IAAGM,CAAU,EAAAN,EAAA,IAAGG,CAAQ,EAAC,OAAMH,EAAA,IAAGG,CAAQ,EAAC,aAC/CK,EAAAA,SAASH,EAAOE,CAAK,CAC9B,CAAC,EAEK,MAAAD,gBAAsBV,EAAS,IAAK,MAAQA,EAAS,IAAK,MAAM,EAEhEa,EAAiBT,EAAA,QAAA,IACrBU,EAAAA,sBAAqBV,EAAA,IACnBM,CAAU,QAAGH,CAAQ,EAAC,OAAMH,EAAA,IAAGG,CAAQ,EAAC,MAAKH,EAAA,IAC7CI,CAAI,EACJT,EAAK,CAAA,CAAA,MAKVgB,EAAGC,EAAA,qBAAHD,EAAG,KAAA,kCAOcf,EAAS,wBACJC,IAAe,GAAK,UACrCE,KAEH,IAAAc,UAXFF,CAAG,EAWDX,EAAA,KAAAa,EAAG,GAAA,IAAA,CACM,EAAG,CAAC,aAAKC,IAAK,KACnBC,EAAGC,EAAA,qBAAHD,EAAG,KAAA,4BAEEjB,EAAM,EACJ,CAAA,0BAAqBW,CAAiB,CAAA,EACtC,CAAA,mCAA8BA,CAAiB,CAAA,EAAA,KAJtDT,EAAA,KAAAe,EAAG,GAAA,IAMK,MAAM,MAAO,OAAMf,EAAA,IAAEI,CAAI,GAAA,CAAK,EAAGa,IAAMA,CAAC,aAAKC,IAAG,KACpDC,EAAGC,EAAA,YAAHD,CAAG,sCAAHA,CAAG,EAAHnB,EAAA,OAAAmB,MACUL,IAAU,GAACd,EAAA,IAAIkB,CAAG,IAAK,EAC5B,OACCG,GACQC,EAAAA,qBAAqBD,EAAOE,GAAM,CACvCvB,EAAA,IAAAG,EAAWoB,EAAC,EAAA,CACd,CAAC,CACF,wCAPNJ,EAAG,cAAA,EAQaL,IAAU,SAAKI,CAAG,IAAK,IAAM,MAAS,CAAA,aARtDC,CAAG,YAPPJ,CAAG,aAAHA,CAAG,YAFPF,CAAG,UAXLF,CAAG,WAAHA,EAAG,IACQa,GACDF,EAAAA,qBAAqBE,EAAcD,GAAM,CAC9CvB,EAAA,IAAAE,EAAgBqB,EAAC,EAAA,CACnB,CAAC,CACF,aALFZ,CAAG,SAFI"}
@@ -0,0 +1,7 @@
1
+ import { SvelteComponent as Marqy } from 'svelte';
2
+
3
+ export { Marqy }
4
+
5
+ export declare type MarqyDirection = 'left' | 'right' | 'up' | 'down';
6
+
7
+ export { }
@@ -0,0 +1,47 @@
1
+ import "svelte/internal/disclose-version";
2
+ import * as e from "svelte/internal/client";
3
+ import { a as O, c as z, b as g } from "./core-COOoOGpB.js";
4
+ var H = e.from_html('<div data-marqy-item=""><!></div>'), A = e.from_html("<div></div>"), R = e.from_html('<div><div data-marqy-inner=""></div></div>');
5
+ function V(f, t) {
6
+ e.push(t, !0);
7
+ let _ = e.prop(t, "speed", 3, 0.5), c = e.prop(t, "direction", 3, "left"), y = e.prop(t, "pauseOnHover", 3, !1), q = e.prop(t, "manual", 3, !1), w = e.rest_props(t, [
8
+ "$$slots",
9
+ "$$events",
10
+ "$$legacy",
11
+ "speed",
12
+ "direction",
13
+ "pauseOnHover",
14
+ "manual",
15
+ "children"
16
+ ]), h = e.state(e.proxy({ width: 0, height: 0 })), i = e.state(e.proxy({ width: 0, height: 0 })), m = e.derived(() => {
17
+ const d = e.get(v) ? e.get(h).height : e.get(h).width, a = e.get(v) ? e.get(i).height : e.get(i).width;
18
+ return O(d, a);
19
+ });
20
+ const v = e.derived(() => c() === "up" || c() === "down"), p = e.derived(() => z(e.get(v) ? e.get(i).height : e.get(i).width, e.get(m), _()));
21
+ var r = R();
22
+ e.attribute_effect(r, () => ({
23
+ "data-marqy": "",
24
+ "data-direction": c(),
25
+ "data-pause-on-hover": y() ? "" : void 0,
26
+ ...w
27
+ }));
28
+ var u = e.child(r);
29
+ e.each(u, 20, () => [0, 1], e.index, (d, a) => {
30
+ var o = A();
31
+ e.attribute_effect(o, () => ({
32
+ "data-marqy-content": "",
33
+ ...q() ? { "data-marqy-static": e.get(p) } : { style: `animation-duration: ${e.get(p)}` }
34
+ })), e.each(o, 21, () => Array.from({ length: e.get(m) }, (l, s) => s), e.index, (l, s) => {
35
+ var n = H(), b = e.child(n);
36
+ e.snippet(b, () => t.children), e.reset(n), e.attach(n, () => a === 0 && e.get(s) === 0 ? void 0 : (x) => g(x, (D) => {
37
+ e.set(i, D, !0);
38
+ })), e.template_effect(() => e.set_attribute(n, "aria-hidden", !(a === 0 && e.get(s) === 0) || void 0)), e.append(l, n);
39
+ }), e.reset(o), e.append(d, o);
40
+ }), e.reset(u), e.reset(r), e.attach(r, () => (d) => g(d, (a) => {
41
+ e.set(h, a, !0);
42
+ })), e.append(f, r), e.pop();
43
+ }
44
+ export {
45
+ V as Marqy
46
+ };
47
+ //# sourceMappingURL=svelte.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"svelte.esm.js","sources":["../src/svelte/Marqy.svelte"],"sourcesContent":["<script lang=\"ts\">\n import {\n type MarqyDirection,\n calcReps,\n calcAnimationDuration,\n createResizeObserver,\n } from '../core'\n import type { Snippet } from 'svelte'\n\n interface Props {\n speed?: number\n direction?: MarqyDirection\n pauseOnHover?: boolean\n manual?: boolean\n children: Snippet\n [key: string]: unknown\n }\n\n let {\n speed = 0.5,\n direction = 'left' as MarqyDirection,\n pauseOnHover = false,\n manual = false,\n children,\n ...rest\n }: Props = $props()\n\n let containerDims = $state({ width: 0, height: 0 })\n let itemDims = $state({ width: 0, height: 0 })\n\n let reps = $derived.by(() => {\n const cSize = isVertical ? containerDims.height : containerDims.width\n const iSize = isVertical ? itemDims.height : itemDims.width\n return calcReps(cSize, iSize)\n })\n\n const isVertical = $derived(direction === 'up' || direction === 'down')\n\n const animationDuration = $derived(\n calcAnimationDuration(\n isVertical ? itemDims.height : itemDims.width,\n reps,\n speed\n )\n )\n</script>\n\n<div\n {@attach (containerEl) => {\n return createResizeObserver(containerEl, (d) => {\n containerDims = d\n })\n }}\n data-marqy=\"\"\n data-direction={direction}\n data-pause-on-hover={pauseOnHover ? '' : undefined}\n {...rest}\n>\n <div data-marqy-inner=\"\">\n {#each [0, 1] as clone}\n <div\n data-marqy-content=\"\"\n {...manual\n ? { 'data-marqy-static': animationDuration }\n : { style: `animation-duration: ${animationDuration}` }}\n >\n {#each Array.from({ length: reps }, (_, i) => i) as rep}\n <div\n {@attach clone === 0 && rep === 0\n ? undefined\n : (node) => {\n return createResizeObserver(node, (d) => {\n itemDims = d\n })\n }}\n aria-hidden={!(clone === 0 && rep === 0) || undefined}\n data-marqy-item=\"\"\n >\n {@render children()}\n </div>\n {/each}\n </div>\n {/each}\n </div>\n</div>\n"],"names":["speed","direction","pauseOnHover","manual","rest","$","$$props","containerDims","itemDims","reps","cSize","isVertical","iSize","calcReps","animationDuration","calcAnimationDuration","div","root","div_1","clone","div_2","root_1","_","i","rep","div_3","root_2","node","createResizeObserver","d","containerEl"],"mappings":";;;;iBAAA;;AAmBI,MAAAA,0BAAQ,GAAG,GACXC,8BAAY,MAAM,GAClBC,iCAAe,EAAK,GACpBC,2BAAS,EAAK,GAEXC,IAAIC,EAAA,WAAAC,GAAA;AAAA;;;;;;;;MAGLC,IAAgBF,QAAMA,EAAA,MAAA,EAAG,OAAO,GAAG,QAAQ,EAAC,CAAA,CAAA,GAC5CG,IAAWH,QAAMA,EAAA,MAAA,EAAG,OAAO,GAAG,QAAQ,EAAC,CAAA,CAAA,GAEvCI,oBAAyB;AACrB,UAAAC,UAAQC,CAAU,IAAGN,EAAA,IAAAE,CAAa,EAAC,SAASF,EAAA,IAAAE,CAAa,EAAC,OAC1DK,IAAKP,EAAA,IAAGM,CAAU,IAAAN,EAAA,IAAGG,CAAQ,EAAC,SAAMH,EAAA,IAAGG,CAAQ,EAAC;WAC/CK,EAASH,GAAOE,CAAK;AAAA,EAC9B,CAAC;AAEK,QAAAD,oBAAsBV,EAAS,MAAK,QAAQA,EAAS,MAAK,MAAM,GAEhEa,IAAiBT,EAAA,QAAA,MACrBU,EAAqBV,EAAA,IACnBM,CAAU,UAAGH,CAAQ,EAAC,SAAMH,EAAA,IAAGG,CAAQ,EAAC,OAAKH,EAAA,IAC7CI,CAAI,GACJT,EAAK,CAAA,CAAA;MAKVgB,IAAGC,EAAA;qBAAHD,GAAG,OAAA;AAAA;sBAOcf,EAAS;AAAA,2BACJC,MAAe,KAAK;AAAA,OACrCE;AAAA;AAEH,MAAAc,YAXFF,CAAG;AAWD,EAAAX,EAAA,KAAAa,GAAG,IAAA,MAAA,CACM,GAAG,CAAC,gBAAKC,MAAK;QACnBC,IAAGC,EAAA;uBAAHD,GAAG,OAAA;AAAA;SAEEjB,EAAM,IACJ,EAAA,2BAAqBW,CAAiB,EAAA,IACtC,EAAA,oCAA8BA,CAAiB,CAAA,GAAA;AAAA,SAJtDT,EAAA,KAAAe,GAAG,IAAA,MAMK,MAAM,OAAO,QAAMf,EAAA,IAAEI,CAAI,KAAA,CAAKa,GAAGC,MAAMA,CAAC,gBAAKC,MAAG;UACpDC,IAAGC,EAAA,eAAHD,CAAG;8CAAHA,CAAG,GAAHpB,EAAA,OAAAoB,SACUN,MAAU,KAACd,EAAA,IAAImB,CAAG,MAAK,IAC5B,SACC,CAAAG,MACQC,EAAqBD,GAAI,CAAGE,MAAM;AACvC,QAAAxB,EAAA,IAAAG,GAAWqB,GAAC,EAAA;AAAA,MACd,CAAC,CACF,2CAPNJ,GAAG,eAAA,EAQaN,MAAU,WAAKK,CAAG,MAAK,MAAM,MAAS,CAAA,eARtDC,CAAG;AAAA,gBAPPL,CAAG,eAAHA,CAAG;AAAA,cAFPF,CAAG,WAXLF,CAAG,YAAHA,GAAG,MAAA,CACQc,MACDF,EAAqBE,GAAW,CAAGD,MAAM;AAC9C,IAAAxB,EAAA,IAAAE,GAAgBsB,GAAC,EAAA;AAAA,EACnB,CAAC,CACF,eALFb,CAAG;AAFI;"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("./core-CuZGUfsl.cjs"),o=2,h=class h extends HTMLElement{constructor(){super(...arguments),this._cleanupContainer=null,this._cleanupItem=null,this._containerDims={width:0,height:0},this._itemDims={width:0,height:0},this._reps=1,this._inner=null,this._slotHTML=""}get _speed(){return parseFloat(this.getAttribute("speed")??"0.5")}get _direction(){return this.getAttribute("direction")??"left"}get _pauseOnHover(){return this.hasAttribute("pause-on-hover")}get _manual(){return this.hasAttribute("manual")}get _isVertical(){return this._direction==="up"||this._direction==="down"}connectedCallback(){this._slotHTML=this.innerHTML,this._render(),this._observeResize()}disconnectedCallback(){this._cleanup()}attributeChangedCallback(){this._inner&&this._update()}_render(){this.setAttribute("data-marqy",""),this.setAttribute("data-direction",this._direction),this._pauseOnHover?this.setAttribute("data-pause-on-hover",""):this.removeAttribute("data-pause-on-hover"),this._inner=document.createElement("div"),this._inner.setAttribute("data-marqy-inner","");for(let t=0;t<o;t++){const e=document.createElement("div");e.setAttribute("data-marqy-content",""),this._inner.appendChild(e)}this.innerHTML="",this.appendChild(this._inner),this._buildItems()}_buildItems(){if(!this._inner)return;this._inner.querySelectorAll("[data-marqy-content]").forEach((e,i)=>{e.innerHTML="";for(let a=0;a<this._reps;a++){const n=document.createElement("div");n.setAttribute("data-marqy-item",""),(i!==0||a!==0)&&n.setAttribute("aria-hidden","true"),n.innerHTML=this._slotHTML,e.appendChild(n)}}),this._applyDuration()}_observeResize(){this._cleanupContainer?.(),this._cleanupContainer=s.createResizeObserver(this,e=>{this._containerDims=e,this._recalc()});const t=this.querySelector("[data-marqy-item]");t&&(this._cleanupItem?.(),this._cleanupItem=s.createResizeObserver(t,e=>{this._itemDims=e,this._recalc()}))}_recalc(){const t=this._isVertical?this._containerDims.height:this._containerDims.width,e=this._isVertical?this._itemDims.height:this._itemDims.width,i=s.calcReps(t,e);i!==this._reps?(this._reps=i,this._buildItems(),this._reObserveItem()):this._applyDuration()}_reObserveItem(){this._cleanupItem?.();const t=this.querySelector("[data-marqy-item]");t&&(this._cleanupItem=s.createResizeObserver(t,e=>{this._itemDims=e,this._recalc()}))}_applyDuration(){if(!this._inner)return;const t=s.calcAnimationDuration(this._isVertical?this._itemDims.height:this._itemDims.width,this._reps,this._speed);this._inner.querySelectorAll("[data-marqy-content]").forEach(i=>{this._manual?(i.setAttribute("data-marqy-static",t),i.style.animationDuration=""):(i.removeAttribute("data-marqy-static"),i.style.animationDuration=t)})}_update(){this.setAttribute("data-direction",this._direction),this._pauseOnHover?this.setAttribute("data-pause-on-hover",""):this.removeAttribute("data-pause-on-hover"),this._applyDuration()}_cleanup(){this._cleanupContainer?.(),this._cleanupItem?.(),this._cleanupContainer=null,this._cleanupItem=null}};h.observedAttributes=["speed","direction","pause-on-hover","manual"];let r=h;customElements.get("marqy-loop")||customElements.define("marqy-loop",r);exports.Marqy=r;exports.MarqyElement=r;
2
+ //# sourceMappingURL=vanilla.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vanilla.cjs.js","sources":["../src/vanilla/index.ts"],"sourcesContent":["import {\n type MarqyDirection,\n calcReps,\n calcAnimationDuration,\n createResizeObserver,\n} from '../core'\n\nexport type { MarqyDirection }\n\nconst CLONES = 2\n\nexport class MarqyElement extends HTMLElement {\n static observedAttributes = ['speed', 'direction', 'pause-on-hover', 'manual']\n\n private _cleanupContainer: (() => void) | null = null\n private _cleanupItem: (() => void) | null = null\n private _containerDims = { width: 0, height: 0 }\n private _itemDims = { width: 0, height: 0 }\n private _reps = 1\n private _inner: HTMLElement | null = null\n private _slotHTML = ''\n\n private get _speed() {\n return parseFloat(this.getAttribute('speed') ?? '0.5')\n }\n\n private get _direction(): MarqyDirection {\n return (this.getAttribute('direction') as MarqyDirection) ?? 'left'\n }\n\n private get _pauseOnHover() {\n return this.hasAttribute('pause-on-hover')\n }\n\n private get _manual() {\n return this.hasAttribute('manual')\n }\n\n private get _isVertical() {\n return this._direction === 'up' || this._direction === 'down'\n }\n\n connectedCallback() {\n this._slotHTML = this.innerHTML\n this._render()\n this._observeResize()\n }\n\n disconnectedCallback() {\n this._cleanup()\n }\n\n attributeChangedCallback() {\n if (this._inner) this._update()\n }\n\n private _render() {\n this.setAttribute('data-marqy', '')\n this.setAttribute('data-direction', this._direction)\n if (this._pauseOnHover) {\n this.setAttribute('data-pause-on-hover', '')\n } else {\n this.removeAttribute('data-pause-on-hover')\n }\n\n this._inner = document.createElement('div')\n this._inner.setAttribute('data-marqy-inner', '')\n\n for (let clone = 0; clone < CLONES; clone++) {\n const content = document.createElement('div')\n content.setAttribute('data-marqy-content', '')\n this._inner.appendChild(content)\n }\n\n this.innerHTML = ''\n this.appendChild(this._inner)\n this._buildItems()\n }\n\n private _buildItems() {\n if (!this._inner) return\n const contents = this._inner.querySelectorAll<HTMLElement>('[data-marqy-content]')\n contents.forEach((content, clone) => {\n content.innerHTML = ''\n for (let rep = 0; rep < this._reps; rep++) {\n const item = document.createElement('div')\n item.setAttribute('data-marqy-item', '')\n if (clone !== 0 || rep !== 0) item.setAttribute('aria-hidden', 'true')\n item.innerHTML = this._slotHTML\n content.appendChild(item)\n }\n })\n this._applyDuration()\n }\n\n private _observeResize() {\n this._cleanupContainer?.()\n this._cleanupContainer = createResizeObserver(this, (d) => {\n this._containerDims = d\n this._recalc()\n })\n\n const firstItem = this.querySelector<HTMLElement>('[data-marqy-item]')\n if (firstItem) {\n this._cleanupItem?.()\n this._cleanupItem = createResizeObserver(firstItem, (d) => {\n this._itemDims = d\n this._recalc()\n })\n }\n }\n\n private _recalc() {\n const cSize = this._isVertical ? this._containerDims.height : this._containerDims.width\n const iSize = this._isVertical ? this._itemDims.height : this._itemDims.width\n const newReps = calcReps(cSize, iSize)\n if (newReps !== this._reps) {\n this._reps = newReps\n this._buildItems()\n this._reObserveItem()\n } else {\n this._applyDuration()\n }\n }\n\n private _reObserveItem() {\n this._cleanupItem?.()\n const firstItem = this.querySelector<HTMLElement>('[data-marqy-item]')\n if (firstItem) {\n this._cleanupItem = createResizeObserver(firstItem, (d) => {\n this._itemDims = d\n this._recalc()\n })\n }\n }\n\n private _applyDuration() {\n if (!this._inner) return\n const duration = calcAnimationDuration(\n this._isVertical ? this._itemDims.height : this._itemDims.width,\n this._reps,\n this._speed\n )\n const contents = this._inner.querySelectorAll<HTMLElement>('[data-marqy-content]')\n contents.forEach((content) => {\n if (this._manual) {\n content.setAttribute('data-marqy-static', duration)\n content.style.animationDuration = ''\n } else {\n content.removeAttribute('data-marqy-static')\n content.style.animationDuration = duration\n }\n })\n }\n\n private _update() {\n this.setAttribute('data-direction', this._direction)\n if (this._pauseOnHover) {\n this.setAttribute('data-pause-on-hover', '')\n } else {\n this.removeAttribute('data-pause-on-hover')\n }\n this._applyDuration()\n }\n\n private _cleanup() {\n this._cleanupContainer?.()\n this._cleanupItem?.()\n this._cleanupContainer = null\n this._cleanupItem = null\n }\n}\n\nif (!customElements.get('marqy-loop')) {\n customElements.define('marqy-loop', MarqyElement)\n}\n\nexport { MarqyElement as Marqy }\n"],"names":["CLONES","_MarqyElement","clone","content","rep","item","createResizeObserver","d","firstItem","cSize","iSize","newReps","calcReps","duration","calcAnimationDuration","MarqyElement"],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ export declare type MarqyDirection = 'left' | 'right' | 'up' | 'down';
2
+
3
+ declare class MarqyElement extends HTMLElement {
4
+ static observedAttributes: string[];
5
+ private _cleanupContainer;
6
+ private _cleanupItem;
7
+ private _containerDims;
8
+ private _itemDims;
9
+ private _reps;
10
+ private _inner;
11
+ private _slotHTML;
12
+ private get _speed();
13
+ private get _direction();
14
+ private get _pauseOnHover();
15
+ private get _manual();
16
+ private get _isVertical();
17
+ connectedCallback(): void;
18
+ disconnectedCallback(): void;
19
+ attributeChangedCallback(): void;
20
+ private _render;
21
+ private _buildItems;
22
+ private _observeResize;
23
+ private _recalc;
24
+ private _reObserveItem;
25
+ private _applyDuration;
26
+ private _update;
27
+ private _cleanup;
28
+ }
29
+ export { MarqyElement as Marqy }
30
+ export { MarqyElement }
31
+
32
+ export { }
@@ -0,0 +1,93 @@
1
+ import { b as r, c as o, a as c } from "./core-COOoOGpB.js";
2
+ const u = 2, h = class h extends HTMLElement {
3
+ constructor() {
4
+ super(...arguments), this._cleanupContainer = null, this._cleanupItem = null, this._containerDims = { width: 0, height: 0 }, this._itemDims = { width: 0, height: 0 }, this._reps = 1, this._inner = null, this._slotHTML = "";
5
+ }
6
+ get _speed() {
7
+ return parseFloat(this.getAttribute("speed") ?? "0.5");
8
+ }
9
+ get _direction() {
10
+ return this.getAttribute("direction") ?? "left";
11
+ }
12
+ get _pauseOnHover() {
13
+ return this.hasAttribute("pause-on-hover");
14
+ }
15
+ get _manual() {
16
+ return this.hasAttribute("manual");
17
+ }
18
+ get _isVertical() {
19
+ return this._direction === "up" || this._direction === "down";
20
+ }
21
+ connectedCallback() {
22
+ this._slotHTML = this.innerHTML, this._render(), this._observeResize();
23
+ }
24
+ disconnectedCallback() {
25
+ this._cleanup();
26
+ }
27
+ attributeChangedCallback() {
28
+ this._inner && this._update();
29
+ }
30
+ _render() {
31
+ this.setAttribute("data-marqy", ""), this.setAttribute("data-direction", this._direction), this._pauseOnHover ? this.setAttribute("data-pause-on-hover", "") : this.removeAttribute("data-pause-on-hover"), this._inner = document.createElement("div"), this._inner.setAttribute("data-marqy-inner", "");
32
+ for (let t = 0; t < u; t++) {
33
+ const e = document.createElement("div");
34
+ e.setAttribute("data-marqy-content", ""), this._inner.appendChild(e);
35
+ }
36
+ this.innerHTML = "", this.appendChild(this._inner), this._buildItems();
37
+ }
38
+ _buildItems() {
39
+ if (!this._inner) return;
40
+ this._inner.querySelectorAll("[data-marqy-content]").forEach((e, i) => {
41
+ e.innerHTML = "";
42
+ for (let n = 0; n < this._reps; n++) {
43
+ const s = document.createElement("div");
44
+ s.setAttribute("data-marqy-item", ""), (i !== 0 || n !== 0) && s.setAttribute("aria-hidden", "true"), s.innerHTML = this._slotHTML, e.appendChild(s);
45
+ }
46
+ }), this._applyDuration();
47
+ }
48
+ _observeResize() {
49
+ this._cleanupContainer?.(), this._cleanupContainer = r(this, (e) => {
50
+ this._containerDims = e, this._recalc();
51
+ });
52
+ const t = this.querySelector("[data-marqy-item]");
53
+ t && (this._cleanupItem?.(), this._cleanupItem = r(t, (e) => {
54
+ this._itemDims = e, this._recalc();
55
+ }));
56
+ }
57
+ _recalc() {
58
+ const t = this._isVertical ? this._containerDims.height : this._containerDims.width, e = this._isVertical ? this._itemDims.height : this._itemDims.width, i = c(t, e);
59
+ i !== this._reps ? (this._reps = i, this._buildItems(), this._reObserveItem()) : this._applyDuration();
60
+ }
61
+ _reObserveItem() {
62
+ this._cleanupItem?.();
63
+ const t = this.querySelector("[data-marqy-item]");
64
+ t && (this._cleanupItem = r(t, (e) => {
65
+ this._itemDims = e, this._recalc();
66
+ }));
67
+ }
68
+ _applyDuration() {
69
+ if (!this._inner) return;
70
+ const t = o(
71
+ this._isVertical ? this._itemDims.height : this._itemDims.width,
72
+ this._reps,
73
+ this._speed
74
+ );
75
+ this._inner.querySelectorAll("[data-marqy-content]").forEach((i) => {
76
+ this._manual ? (i.setAttribute("data-marqy-static", t), i.style.animationDuration = "") : (i.removeAttribute("data-marqy-static"), i.style.animationDuration = t);
77
+ });
78
+ }
79
+ _update() {
80
+ this.setAttribute("data-direction", this._direction), this._pauseOnHover ? this.setAttribute("data-pause-on-hover", "") : this.removeAttribute("data-pause-on-hover"), this._applyDuration();
81
+ }
82
+ _cleanup() {
83
+ this._cleanupContainer?.(), this._cleanupItem?.(), this._cleanupContainer = null, this._cleanupItem = null;
84
+ }
85
+ };
86
+ h.observedAttributes = ["speed", "direction", "pause-on-hover", "manual"];
87
+ let a = h;
88
+ customElements.get("marqy-loop") || customElements.define("marqy-loop", a);
89
+ export {
90
+ a as Marqy,
91
+ a as MarqyElement
92
+ };
93
+ //# sourceMappingURL=vanilla.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vanilla.esm.js","sources":["../src/vanilla/index.ts"],"sourcesContent":["import {\n type MarqyDirection,\n calcReps,\n calcAnimationDuration,\n createResizeObserver,\n} from '../core'\n\nexport type { MarqyDirection }\n\nconst CLONES = 2\n\nexport class MarqyElement extends HTMLElement {\n static observedAttributes = ['speed', 'direction', 'pause-on-hover', 'manual']\n\n private _cleanupContainer: (() => void) | null = null\n private _cleanupItem: (() => void) | null = null\n private _containerDims = { width: 0, height: 0 }\n private _itemDims = { width: 0, height: 0 }\n private _reps = 1\n private _inner: HTMLElement | null = null\n private _slotHTML = ''\n\n private get _speed() {\n return parseFloat(this.getAttribute('speed') ?? '0.5')\n }\n\n private get _direction(): MarqyDirection {\n return (this.getAttribute('direction') as MarqyDirection) ?? 'left'\n }\n\n private get _pauseOnHover() {\n return this.hasAttribute('pause-on-hover')\n }\n\n private get _manual() {\n return this.hasAttribute('manual')\n }\n\n private get _isVertical() {\n return this._direction === 'up' || this._direction === 'down'\n }\n\n connectedCallback() {\n this._slotHTML = this.innerHTML\n this._render()\n this._observeResize()\n }\n\n disconnectedCallback() {\n this._cleanup()\n }\n\n attributeChangedCallback() {\n if (this._inner) this._update()\n }\n\n private _render() {\n this.setAttribute('data-marqy', '')\n this.setAttribute('data-direction', this._direction)\n if (this._pauseOnHover) {\n this.setAttribute('data-pause-on-hover', '')\n } else {\n this.removeAttribute('data-pause-on-hover')\n }\n\n this._inner = document.createElement('div')\n this._inner.setAttribute('data-marqy-inner', '')\n\n for (let clone = 0; clone < CLONES; clone++) {\n const content = document.createElement('div')\n content.setAttribute('data-marqy-content', '')\n this._inner.appendChild(content)\n }\n\n this.innerHTML = ''\n this.appendChild(this._inner)\n this._buildItems()\n }\n\n private _buildItems() {\n if (!this._inner) return\n const contents = this._inner.querySelectorAll<HTMLElement>('[data-marqy-content]')\n contents.forEach((content, clone) => {\n content.innerHTML = ''\n for (let rep = 0; rep < this._reps; rep++) {\n const item = document.createElement('div')\n item.setAttribute('data-marqy-item', '')\n if (clone !== 0 || rep !== 0) item.setAttribute('aria-hidden', 'true')\n item.innerHTML = this._slotHTML\n content.appendChild(item)\n }\n })\n this._applyDuration()\n }\n\n private _observeResize() {\n this._cleanupContainer?.()\n this._cleanupContainer = createResizeObserver(this, (d) => {\n this._containerDims = d\n this._recalc()\n })\n\n const firstItem = this.querySelector<HTMLElement>('[data-marqy-item]')\n if (firstItem) {\n this._cleanupItem?.()\n this._cleanupItem = createResizeObserver(firstItem, (d) => {\n this._itemDims = d\n this._recalc()\n })\n }\n }\n\n private _recalc() {\n const cSize = this._isVertical ? this._containerDims.height : this._containerDims.width\n const iSize = this._isVertical ? this._itemDims.height : this._itemDims.width\n const newReps = calcReps(cSize, iSize)\n if (newReps !== this._reps) {\n this._reps = newReps\n this._buildItems()\n this._reObserveItem()\n } else {\n this._applyDuration()\n }\n }\n\n private _reObserveItem() {\n this._cleanupItem?.()\n const firstItem = this.querySelector<HTMLElement>('[data-marqy-item]')\n if (firstItem) {\n this._cleanupItem = createResizeObserver(firstItem, (d) => {\n this._itemDims = d\n this._recalc()\n })\n }\n }\n\n private _applyDuration() {\n if (!this._inner) return\n const duration = calcAnimationDuration(\n this._isVertical ? this._itemDims.height : this._itemDims.width,\n this._reps,\n this._speed\n )\n const contents = this._inner.querySelectorAll<HTMLElement>('[data-marqy-content]')\n contents.forEach((content) => {\n if (this._manual) {\n content.setAttribute('data-marqy-static', duration)\n content.style.animationDuration = ''\n } else {\n content.removeAttribute('data-marqy-static')\n content.style.animationDuration = duration\n }\n })\n }\n\n private _update() {\n this.setAttribute('data-direction', this._direction)\n if (this._pauseOnHover) {\n this.setAttribute('data-pause-on-hover', '')\n } else {\n this.removeAttribute('data-pause-on-hover')\n }\n this._applyDuration()\n }\n\n private _cleanup() {\n this._cleanupContainer?.()\n this._cleanupItem?.()\n this._cleanupContainer = null\n this._cleanupItem = null\n }\n}\n\nif (!customElements.get('marqy-loop')) {\n customElements.define('marqy-loop', MarqyElement)\n}\n\nexport { MarqyElement as Marqy }\n"],"names":["CLONES","_MarqyElement","clone","content","rep","item","createResizeObserver","d","firstItem","cSize","iSize","newReps","calcReps","duration","calcAnimationDuration","MarqyElement"],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ "use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("vue"),d=require("./core-CuZGUfsl.cjs"),g=["data-direction","data-pause-on-hover"],k={"data-marqy-inner":""},B=["aria-hidden"],q=e.defineComponent({__name:"Marqy",props:{speed:{default:.5},direction:{default:"left"},pauseOnHover:{type:Boolean,default:!1},manual:{type:Boolean,default:!1}},setup(r){const s=r,h=e.ref(null),p=e.ref(null),o=e.ref({width:0,height:0}),a=e.ref({width:0,height:0}),m=e.ref(1),i=e.computed(()=>s.direction==="up"||s.direction==="down"),y=e.computed(()=>d.calcAnimationDuration(i.value?a.value.height:a.value.width,m.value,s.speed));let l=null,c=null;return e.watch(h,t=>{l?.(),l=null,t&&(l=d.createResizeObserver(t,n=>{o.value=n}))}),e.watch(p,t=>{c?.(),c=null,t&&(c=d.createResizeObserver(t,n=>{a.value=n}))}),e.watch([o,a,i],()=>{const t=i.value?o.value.height:o.value.width,n=i.value?a.value.height:a.value.width;m.value=d.calcReps(t,n)}),e.onUnmounted(()=>{l?.(),c?.()}),(t,n)=>(e.openBlock(),e.createElementBlock("div",e.mergeProps({ref_key:"containerRef",ref:h,"data-marqy":"","data-direction":r.direction,"data-pause-on-hover":r.pauseOnHover?"":void 0},t.$attrs),[e.createElementVNode("div",k,[(e.openBlock(),e.createElementBlock(e.Fragment,null,e.renderList([0,1],v=>e.createElementVNode("div",e.mergeProps({key:v,"data-marqy-content":""},{ref_for:!0},r.manual?{"data-marqy-static":y.value}:{style:`animation-duration: ${y.value}`}),[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(Array.from({length:m.value},(u,f)=>f),u=>(e.openBlock(),e.createElementBlock("div",{key:u,ref_for:!0,ref:f=>{v===0&&u===0&&(p.value=f)},"aria-hidden":!(v===0&&u===0)||void 0,"data-marqy-item":""},[e.renderSlot(t.$slots,"default")],8,B))),128))],16)),64))])],16,g))}});exports.Marqy=q;
2
+ //# sourceMappingURL=vue.cjs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vue.cjs.js","sources":["../src/vue/Marqy.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, watch, onUnmounted } from 'vue'\nimport {\n type MarqyDirection,\n calcReps,\n calcAnimationDuration,\n createResizeObserver,\n} from '../core'\n\ninterface Props {\n speed?: number\n direction?: MarqyDirection\n pauseOnHover?: boolean\n manual?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n speed: 0.5,\n direction: 'left',\n pauseOnHover: false,\n manual: false,\n})\n\nconst containerRef = ref<HTMLElement | null>(null)\nconst itemRef = ref<HTMLElement | null>(null)\nconst containerDims = ref({ width: 0, height: 0 })\nconst itemDims = ref({ width: 0, height: 0 })\nconst reps = ref(1)\n\nconst isVertical = computed(\n () => props.direction === 'up' || props.direction === 'down'\n)\n\nconst animationDuration = computed(() =>\n calcAnimationDuration(\n isVertical.value ? itemDims.value.height : itemDims.value.width,\n reps.value,\n props.speed\n )\n)\n\nlet cleanupContainer: (() => void) | null = null\nlet cleanupItem: (() => void) | null = null\n\nwatch(containerRef, (el) => {\n cleanupContainer?.()\n cleanupContainer = null\n if (el) cleanupContainer = createResizeObserver(el, (d) => { containerDims.value = d })\n})\n\nwatch(itemRef, (el) => {\n cleanupItem?.()\n cleanupItem = null\n if (el) cleanupItem = createResizeObserver(el, (d) => { itemDims.value = d })\n})\n\nwatch([containerDims, itemDims, isVertical], () => {\n const cSize = isVertical.value ? containerDims.value.height : containerDims.value.width\n const iSize = isVertical.value ? itemDims.value.height : itemDims.value.width\n reps.value = calcReps(cSize, iSize)\n})\n\nonUnmounted(() => {\n cleanupContainer?.()\n cleanupItem?.()\n})\n</script>\n\n<template>\n <div\n ref=\"containerRef\"\n data-marqy=\"\"\n :data-direction=\"direction\"\n :data-pause-on-hover=\"pauseOnHover ? '' : undefined\"\n v-bind=\"$attrs\"\n >\n <div data-marqy-inner=\"\">\n <div\n v-for=\"clone in [0, 1]\"\n :key=\"clone\"\n data-marqy-content=\"\"\n v-bind=\"\n manual\n ? { 'data-marqy-static': animationDuration }\n : { style: `animation-duration: ${animationDuration}` }\n \"\n >\n <div\n v-for=\"rep in Array.from({ length: reps }, (_, i) => i)\"\n :key=\"rep\"\n :ref=\"(el) => { if (clone === 0 && rep === 0) itemRef = el as HTMLElement | null }\"\n :aria-hidden=\"!(clone === 0 && rep === 0) || undefined\"\n data-marqy-item=\"\"\n >\n <slot />\n </div>\n </div>\n </div>\n </div>\n</template>\n"],"names":["props","__props","containerRef","ref","itemRef","containerDims","itemDims","reps","isVertical","computed","animationDuration","calcAnimationDuration","cleanupContainer","cleanupItem","watch","el","createResizeObserver","d","cSize","iSize","calcReps","onUnmounted","_openBlock","_createElementBlock","_mergeProps","$attrs","_createElementVNode","_hoisted_2","_Fragment","_renderList","clone","_","i","rep","_renderSlot","_ctx"],"mappings":"0YAgBA,MAAMA,EAAQC,EAORC,EAAeC,EAAAA,IAAwB,IAAI,EAC3CC,EAAUD,EAAAA,IAAwB,IAAI,EACtCE,EAAgBF,EAAAA,IAAI,CAAE,MAAO,EAAG,OAAQ,EAAG,EAC3CG,EAAWH,EAAAA,IAAI,CAAE,MAAO,EAAG,OAAQ,EAAG,EACtCI,EAAOJ,EAAAA,IAAI,CAAC,EAEZK,EAAaC,EAAAA,SACjB,IAAMT,EAAM,YAAc,MAAQA,EAAM,YAAc,MAAA,EAGlDU,EAAoBD,EAAAA,SAAS,IACjCE,EAAAA,sBACEH,EAAW,MAAQF,EAAS,MAAM,OAASA,EAAS,MAAM,MAC1DC,EAAK,MACLP,EAAM,KAAA,CACR,EAGF,IAAIY,EAAwC,KACxCC,EAAmC,KAEvCC,OAAAA,QAAMZ,EAAea,GAAO,CAC1BH,IAAA,EACAA,EAAmB,KACfG,IAAIH,EAAmBI,EAAAA,qBAAqBD,EAAKE,GAAM,CAAEZ,EAAc,MAAQY,CAAE,CAAC,EACxF,CAAC,EAEDH,QAAMV,EAAUW,GAAO,CACrBF,IAAA,EACAA,EAAc,KACVE,IAAIF,EAAcG,EAAAA,qBAAqBD,EAAKE,GAAM,CAAEX,EAAS,MAAQW,CAAE,CAAC,EAC9E,CAAC,EAEDH,EAAAA,MAAM,CAACT,EAAeC,EAAUE,CAAU,EAAG,IAAM,CACjD,MAAMU,EAAQV,EAAW,MAAQH,EAAc,MAAM,OAASA,EAAc,MAAM,MAC5Ec,EAAQX,EAAW,MAAQF,EAAS,MAAM,OAASA,EAAS,MAAM,MACxEC,EAAK,MAAQa,WAASF,EAAOC,CAAK,CACpC,CAAC,EAEDE,EAAAA,YAAY,IAAM,CAChBT,IAAA,EACAC,IAAA,CACF,CAAC,UAICS,YAAA,EAAAC,qBA6BM,MA7BNC,EAAAA,WA6BM,SA5BA,eAAJ,IAAItB,EACJ,aAAW,GACV,iBAAgBD,EAAA,UAChB,sBAAqBA,EAAA,aAAY,GAAQ,MAAA,EAClCwB,EAAAA,MAAM,EAAA,CAEdC,EAAAA,mBAqBM,MArBNC,EAqBM,gBApBJJ,qBAmBMK,EAAAA,SAAA,KAAAC,aAlBY,CAAA,EAAA,CAAA,EAATC,GADTJ,EAAAA,mBAmBM,MAnBNF,EAAAA,WAmBM,CAjBH,IAAKM,EACN,qBAAmB,EAAA,eACA7B,EAAA,4BAA4CS,EAAA,KAAA,gCAAkEA,EAAA,KAAiB,EAAA,CAAA,IAMlJY,EAAAA,UAAA,EAAA,EAAAC,EAAAA,mBAQMK,EAAAA,SAAA,KAAAC,EAAAA,WAPU,MAAM,KAAI,CAAA,OAAWtB,EAAA,KAAA,EAAI,CAAKwB,EAAGC,IAAMA,CAAC,EAA/CC,kBADTV,EAAAA,mBAQM,MAAA,CANH,IAAKU,aACL,IAAMlB,GAAE,CAAWe,OAAeG,IAAG,MAAQ,MAAUlB,EAAE,EACzD,cAAW,EAAIe,IAAK,GAAUG,QAAc,OAC7C,kBAAgB,EAAA,GAEhBC,aAAQC,EAAA,OAAA,SAAA,CAAA"}
package/dist/vue.d.ts ADDED
@@ -0,0 +1,45 @@
1
+ import { ComponentOptionsMixin } from 'vue';
2
+ import { ComponentProvideOptions } from 'vue';
3
+ import { DefineComponent } from 'vue';
4
+ import { PublicProps } from 'vue';
5
+
6
+ declare const __VLS_component: DefineComponent<Props, {}, {}, {}, {}, ComponentOptionsMixin, ComponentOptionsMixin, {}, string, PublicProps, Readonly<Props> & Readonly<{}>, {
7
+ speed: number;
8
+ direction: MarqyDirection;
9
+ pauseOnHover: boolean;
10
+ manual: boolean;
11
+ }, {}, {}, {}, string, ComponentProvideOptions, false, {
12
+ containerRef: HTMLDivElement;
13
+ }, HTMLDivElement>;
14
+
15
+ declare function __VLS_template(): {
16
+ attrs: Partial<{}>;
17
+ slots: {
18
+ default?(_: {}): any;
19
+ };
20
+ refs: {
21
+ containerRef: HTMLDivElement;
22
+ };
23
+ rootEl: HTMLDivElement;
24
+ };
25
+
26
+ declare type __VLS_TemplateResult = ReturnType<typeof __VLS_template>;
27
+
28
+ declare type __VLS_WithTemplateSlots<T, S> = T & {
29
+ new (): {
30
+ $slots: S;
31
+ };
32
+ };
33
+
34
+ export declare const Marqy: __VLS_WithTemplateSlots<typeof __VLS_component, __VLS_TemplateResult["slots"]>;
35
+
36
+ export declare type MarqyDirection = 'left' | 'right' | 'up' | 'down';
37
+
38
+ declare interface Props {
39
+ speed?: number;
40
+ direction?: MarqyDirection;
41
+ pauseOnHover?: boolean;
42
+ manual?: boolean;
43
+ }
44
+
45
+ export { }
@@ -0,0 +1,70 @@
1
+ import { defineComponent as z, ref as n, computed as q, watch as p, onUnmounted as O, openBlock as s, createElementBlock as c, mergeProps as w, createElementVNode as k, Fragment as R, renderList as B, renderSlot as S } from "vue";
2
+ import { c as $, b as D, a as b } from "./core-COOoOGpB.js";
3
+ const A = ["data-direction", "data-pause-on-hover"], C = { "data-marqy-inner": "" }, E = ["aria-hidden"], V = /* @__PURE__ */ z({
4
+ __name: "Marqy",
5
+ props: {
6
+ speed: { default: 0.5 },
7
+ direction: { default: "left" },
8
+ pauseOnHover: { type: Boolean, default: !1 },
9
+ manual: { type: Boolean, default: !1 }
10
+ },
11
+ setup(i) {
12
+ const m = i, y = n(null), g = n(null), r = n({ width: 0, height: 0 }), t = n({ width: 0, height: 0 }), v = n(1), o = q(
13
+ () => m.direction === "up" || m.direction === "down"
14
+ ), _ = q(
15
+ () => $(
16
+ o.value ? t.value.height : t.value.width,
17
+ v.value,
18
+ m.speed
19
+ )
20
+ );
21
+ let l = null, u = null;
22
+ return p(y, (e) => {
23
+ l?.(), l = null, e && (l = D(e, (a) => {
24
+ r.value = a;
25
+ }));
26
+ }), p(g, (e) => {
27
+ u?.(), u = null, e && (u = D(e, (a) => {
28
+ t.value = a;
29
+ }));
30
+ }), p([r, t, o], () => {
31
+ const e = o.value ? r.value.height : r.value.width, a = o.value ? t.value.height : t.value.width;
32
+ v.value = b(e, a);
33
+ }), O(() => {
34
+ l?.(), u?.();
35
+ }), (e, a) => (s(), c("div", w({
36
+ ref_key: "containerRef",
37
+ ref: y,
38
+ "data-marqy": "",
39
+ "data-direction": i.direction,
40
+ "data-pause-on-hover": i.pauseOnHover ? "" : void 0
41
+ }, e.$attrs), [
42
+ k("div", C, [
43
+ (s(), c(R, null, B([0, 1], (f) => k("div", w(
44
+ {
45
+ key: f,
46
+ "data-marqy-content": ""
47
+ },
48
+ { ref_for: !0 },
49
+ i.manual ? { "data-marqy-static": _.value } : { style: `animation-duration: ${_.value}` }
50
+ ), [
51
+ (s(!0), c(R, null, B(Array.from({ length: v.value }, (d, h) => h), (d) => (s(), c("div", {
52
+ key: d,
53
+ ref_for: !0,
54
+ ref: (h) => {
55
+ f === 0 && d === 0 && (g.value = h);
56
+ },
57
+ "aria-hidden": !(f === 0 && d === 0) || void 0,
58
+ "data-marqy-item": ""
59
+ }, [
60
+ S(e.$slots, "default")
61
+ ], 8, E))), 128))
62
+ ], 16)), 64))
63
+ ])
64
+ ], 16, A));
65
+ }
66
+ });
67
+ export {
68
+ V as Marqy
69
+ };
70
+ //# sourceMappingURL=vue.esm.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vue.esm.js","sources":["../src/vue/Marqy.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { ref, computed, watch, onUnmounted } from 'vue'\nimport {\n type MarqyDirection,\n calcReps,\n calcAnimationDuration,\n createResizeObserver,\n} from '../core'\n\ninterface Props {\n speed?: number\n direction?: MarqyDirection\n pauseOnHover?: boolean\n manual?: boolean\n}\n\nconst props = withDefaults(defineProps<Props>(), {\n speed: 0.5,\n direction: 'left',\n pauseOnHover: false,\n manual: false,\n})\n\nconst containerRef = ref<HTMLElement | null>(null)\nconst itemRef = ref<HTMLElement | null>(null)\nconst containerDims = ref({ width: 0, height: 0 })\nconst itemDims = ref({ width: 0, height: 0 })\nconst reps = ref(1)\n\nconst isVertical = computed(\n () => props.direction === 'up' || props.direction === 'down'\n)\n\nconst animationDuration = computed(() =>\n calcAnimationDuration(\n isVertical.value ? itemDims.value.height : itemDims.value.width,\n reps.value,\n props.speed\n )\n)\n\nlet cleanupContainer: (() => void) | null = null\nlet cleanupItem: (() => void) | null = null\n\nwatch(containerRef, (el) => {\n cleanupContainer?.()\n cleanupContainer = null\n if (el) cleanupContainer = createResizeObserver(el, (d) => { containerDims.value = d })\n})\n\nwatch(itemRef, (el) => {\n cleanupItem?.()\n cleanupItem = null\n if (el) cleanupItem = createResizeObserver(el, (d) => { itemDims.value = d })\n})\n\nwatch([containerDims, itemDims, isVertical], () => {\n const cSize = isVertical.value ? containerDims.value.height : containerDims.value.width\n const iSize = isVertical.value ? itemDims.value.height : itemDims.value.width\n reps.value = calcReps(cSize, iSize)\n})\n\nonUnmounted(() => {\n cleanupContainer?.()\n cleanupItem?.()\n})\n</script>\n\n<template>\n <div\n ref=\"containerRef\"\n data-marqy=\"\"\n :data-direction=\"direction\"\n :data-pause-on-hover=\"pauseOnHover ? '' : undefined\"\n v-bind=\"$attrs\"\n >\n <div data-marqy-inner=\"\">\n <div\n v-for=\"clone in [0, 1]\"\n :key=\"clone\"\n data-marqy-content=\"\"\n v-bind=\"\n manual\n ? { 'data-marqy-static': animationDuration }\n : { style: `animation-duration: ${animationDuration}` }\n \"\n >\n <div\n v-for=\"rep in Array.from({ length: reps }, (_, i) => i)\"\n :key=\"rep\"\n :ref=\"(el) => { if (clone === 0 && rep === 0) itemRef = el as HTMLElement | null }\"\n :aria-hidden=\"!(clone === 0 && rep === 0) || undefined\"\n data-marqy-item=\"\"\n >\n <slot />\n </div>\n </div>\n </div>\n </div>\n</template>\n"],"names":["props","__props","containerRef","ref","itemRef","containerDims","itemDims","reps","isVertical","computed","animationDuration","calcAnimationDuration","cleanupContainer","cleanupItem","watch","el","createResizeObserver","d","cSize","iSize","calcReps","onUnmounted","_openBlock","_createElementBlock","_mergeProps","$attrs","_createElementVNode","_hoisted_2","_Fragment","_renderList","clone","_","i","rep","_renderSlot","_ctx"],"mappings":";;;;;;;;;;;AAgBA,UAAMA,IAAQC,GAORC,IAAeC,EAAwB,IAAI,GAC3CC,IAAUD,EAAwB,IAAI,GACtCE,IAAgBF,EAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,GAC3CG,IAAWH,EAAI,EAAE,OAAO,GAAG,QAAQ,GAAG,GACtCI,IAAOJ,EAAI,CAAC,GAEZK,IAAaC;AAAA,MACjB,MAAMT,EAAM,cAAc,QAAQA,EAAM,cAAc;AAAA,IAAA,GAGlDU,IAAoBD;AAAA,MAAS,MACjCE;AAAA,QACEH,EAAW,QAAQF,EAAS,MAAM,SAASA,EAAS,MAAM;AAAA,QAC1DC,EAAK;AAAA,QACLP,EAAM;AAAA,MAAA;AAAA,IACR;AAGF,QAAIY,IAAwC,MACxCC,IAAmC;AAEvC,WAAAC,EAAMZ,GAAc,CAACa,MAAO;AAC1B,MAAAH,IAAA,GACAA,IAAmB,MACfG,MAAIH,IAAmBI,EAAqBD,GAAI,CAACE,MAAM;AAAE,QAAAZ,EAAc,QAAQY;AAAA,MAAE,CAAC;AAAA,IACxF,CAAC,GAEDH,EAAMV,GAAS,CAACW,MAAO;AACrB,MAAAF,IAAA,GACAA,IAAc,MACVE,MAAIF,IAAcG,EAAqBD,GAAI,CAACE,MAAM;AAAE,QAAAX,EAAS,QAAQW;AAAA,MAAE,CAAC;AAAA,IAC9E,CAAC,GAEDH,EAAM,CAACT,GAAeC,GAAUE,CAAU,GAAG,MAAM;AACjD,YAAMU,IAAQV,EAAW,QAAQH,EAAc,MAAM,SAASA,EAAc,MAAM,OAC5Ec,IAAQX,EAAW,QAAQF,EAAS,MAAM,SAASA,EAAS,MAAM;AACxE,MAAAC,EAAK,QAAQa,EAASF,GAAOC,CAAK;AAAA,IACpC,CAAC,GAEDE,EAAY,MAAM;AAChB,MAAAT,IAAA,GACAC,IAAA;AAAA,IACF,CAAC,cAICS,EAAA,GAAAC,EA6BM,OA7BNC,EA6BM;AAAA,eA5BA;AAAA,MAAJ,KAAItB;AAAA,MACJ,cAAW;AAAA,MACV,kBAAgBD,EAAA;AAAA,MAChB,uBAAqBA,EAAA,eAAY,KAAQ;AAAA,IAAA,GAClCwB,EAAAA,MAAM,GAAA;AAAA,MAEdC,EAqBM,OArBNC,GAqBM;AAAA,cApBJJ,EAmBMK,GAAA,MAAAC,EAlBY,CAAA,GAAA,CAAA,GAAM,CAAfC,MADTJ,EAmBM,OAnBNF;AAAAA,UAmBM;AAAA,YAjBH,KAAKM;AAAA,YACN,sBAAmB;AAAA,UAAA;AAAA;UACA7B,EAAA,gCAA4CS,EAAA,MAAA,oCAAkEA,EAAA,KAAiB,GAAA;AAAA,QAAA;WAMlJY,EAAA,EAAA,GAAAC,EAQMK,GAAA,MAAAC,EAPU,MAAM,KAAI,EAAA,QAAWtB,EAAA,MAAA,GAAI,CAAKwB,GAAGC,MAAMA,CAAC,IAA/CC,YADTV,EAQM,OAAA;AAAA,YANH,KAAKU;AAAA;YACL,KAAG,CAAGlB,MAAE;AAAA,cAAWe,WAAeG,MAAG,QAAQ,QAAUlB;AAAA,YAAE;AAAA,YACzD,eAAW,EAAIe,MAAK,KAAUG,YAAc;AAAA,YAC7C,mBAAgB;AAAA,UAAA;YAEhBC,EAAQC,EAAA,QAAA,SAAA;AAAA,UAAA;;;;;;"}