vistaview 1.0.3 → 2.0.0
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/LICENSE +21 -0
- package/README.md +18 -61
- package/{dist/lib/extensions/dailymotion-video.d.ts → extensions/dailymotion-video/dist/main.d.ts} +3 -3
- package/extensions/dailymotion-video/dist/main.d.ts.map +1 -0
- package/extensions/dailymotion-video/dist/main.js +72 -0
- package/extensions/dailymotion-video/dist/main.js.map +1 -0
- package/extensions/dailymotion-video/dist/main.test.d.ts +2 -0
- package/extensions/dailymotion-video/dist/main.test.d.ts.map +1 -0
- package/extensions/dailymotion-video/dist/main.umd.cjs +2 -0
- package/extensions/dailymotion-video/dist/main.umd.cjs.map +1 -0
- package/extensions/download/dist/main.d.ts +4 -0
- package/extensions/download/dist/main.d.ts.map +1 -0
- package/extensions/download/dist/main.js +42 -0
- package/extensions/download/dist/main.js.map +1 -0
- package/extensions/download/dist/main.test.d.ts +2 -0
- package/extensions/download/dist/main.test.d.ts.map +1 -0
- package/extensions/download/dist/main.umd.cjs +2 -0
- package/extensions/download/dist/main.umd.cjs.map +1 -0
- package/{dist/lib/extensions/google-maps.d.ts → extensions/google-maps/dist/main.d.ts} +3 -3
- package/extensions/google-maps/dist/main.d.ts.map +1 -0
- package/extensions/google-maps/dist/main.js +96 -0
- package/extensions/google-maps/dist/main.js.map +1 -0
- package/extensions/google-maps/dist/main.test.d.ts +2 -0
- package/extensions/google-maps/dist/main.test.d.ts.map +1 -0
- package/extensions/google-maps/dist/main.umd.cjs +2 -0
- package/extensions/google-maps/dist/main.umd.cjs.map +1 -0
- package/extensions/image-story/dist/main.d.ts +16 -0
- package/extensions/image-story/dist/main.d.ts.map +1 -0
- package/extensions/image-story/dist/main.js +600 -0
- package/extensions/image-story/dist/main.js.map +1 -0
- package/extensions/image-story/dist/main.test.d.ts +2 -0
- package/extensions/image-story/dist/main.test.d.ts.map +1 -0
- package/extensions/image-story/dist/main.umd.cjs +3 -0
- package/extensions/image-story/dist/main.umd.cjs.map +1 -0
- package/extensions/image-story/dist/style.css +1 -0
- package/extensions/logger/dist/main.d.ts +3 -0
- package/extensions/logger/dist/main.d.ts.map +1 -0
- package/extensions/logger/dist/main.js +23 -0
- package/extensions/logger/dist/main.js.map +1 -0
- package/extensions/logger/dist/main.test.d.ts +2 -0
- package/extensions/logger/dist/main.test.d.ts.map +1 -0
- package/extensions/logger/dist/main.umd.cjs +2 -0
- package/extensions/logger/dist/main.umd.cjs.map +1 -0
- package/{dist/lib/extensions/mapbox.d.ts → extensions/mapbox/dist/main.d.ts} +3 -3
- package/extensions/mapbox/dist/main.d.ts.map +1 -0
- package/extensions/mapbox/dist/main.js +114 -0
- package/extensions/mapbox/dist/main.js.map +1 -0
- package/extensions/mapbox/dist/main.test.d.ts +2 -0
- package/extensions/mapbox/dist/main.test.d.ts.map +1 -0
- package/extensions/mapbox/dist/main.umd.cjs +2 -0
- package/extensions/mapbox/dist/main.umd.cjs.map +1 -0
- package/{dist/lib/extensions/openstreetmap.d.ts → extensions/openstreetmap/dist/main.d.ts} +3 -3
- package/extensions/openstreetmap/dist/main.d.ts.map +1 -0
- package/extensions/openstreetmap/dist/main.js +114 -0
- package/extensions/openstreetmap/dist/main.js.map +1 -0
- package/extensions/openstreetmap/dist/main.test.d.ts +2 -0
- package/extensions/openstreetmap/dist/main.test.d.ts.map +1 -0
- package/extensions/openstreetmap/dist/main.umd.cjs +2 -0
- package/extensions/openstreetmap/dist/main.umd.cjs.map +1 -0
- package/{dist/lib/extensions/select-box.d.ts → extensions/select-box/dist/main.d.ts} +2 -2
- package/extensions/select-box/dist/main.d.ts.map +1 -0
- package/extensions/select-box/dist/main.js +25 -0
- package/extensions/select-box/dist/main.js.map +1 -0
- package/extensions/select-box/dist/main.umd.cjs +2 -0
- package/extensions/select-box/dist/main.umd.cjs.map +1 -0
- package/{dist/lib/extensions/streamable-video.d.ts → extensions/streamable-video/dist/main.d.ts} +3 -3
- package/extensions/streamable-video/dist/main.d.ts.map +1 -0
- package/extensions/streamable-video/dist/main.js +68 -0
- package/extensions/streamable-video/dist/main.js.map +1 -0
- package/extensions/streamable-video/dist/main.test.d.ts +2 -0
- package/extensions/streamable-video/dist/main.test.d.ts.map +1 -0
- package/extensions/streamable-video/dist/main.umd.cjs +2 -0
- package/extensions/streamable-video/dist/main.umd.cjs.map +1 -0
- package/{dist/lib/extensions/twitch-video.d.ts → extensions/twitch-video/dist/main.d.ts} +3 -3
- package/extensions/twitch-video/dist/main.d.ts.map +1 -0
- package/extensions/twitch-video/dist/main.js +81 -0
- package/extensions/twitch-video/dist/main.js.map +1 -0
- package/extensions/twitch-video/dist/main.umd.cjs +2 -0
- package/extensions/twitch-video/dist/main.umd.cjs.map +1 -0
- package/{dist/lib/extensions/vidyard-video.d.ts → extensions/vidyard-video/dist/main.d.ts} +3 -3
- package/extensions/vidyard-video/dist/main.d.ts.map +1 -0
- package/extensions/vidyard-video/dist/main.js +72 -0
- package/extensions/vidyard-video/dist/main.js.map +1 -0
- package/extensions/vidyard-video/dist/main.test.d.ts +2 -0
- package/extensions/vidyard-video/dist/main.test.d.ts.map +1 -0
- package/extensions/vidyard-video/dist/main.umd.cjs +2 -0
- package/extensions/vidyard-video/dist/main.umd.cjs.map +1 -0
- package/{dist/lib/extensions/vimeo-video.d.ts → extensions/vimeo-video/dist/main.d.ts} +3 -3
- package/extensions/vimeo-video/dist/main.d.ts.map +1 -0
- package/extensions/vimeo-video/dist/main.js +68 -0
- package/extensions/vimeo-video/dist/main.js.map +1 -0
- package/extensions/vimeo-video/dist/main.test.d.ts +2 -0
- package/extensions/vimeo-video/dist/main.test.d.ts.map +1 -0
- package/extensions/vimeo-video/dist/main.umd.cjs +2 -0
- package/extensions/vimeo-video/dist/main.umd.cjs.map +1 -0
- package/{dist/lib/extensions/wistia-video.d.ts → extensions/wistia-video/dist/main.d.ts} +3 -3
- package/extensions/wistia-video/dist/main.d.ts.map +1 -0
- package/extensions/wistia-video/dist/main.js +72 -0
- package/extensions/wistia-video/dist/main.js.map +1 -0
- package/extensions/wistia-video/dist/main.test.d.ts +2 -0
- package/extensions/wistia-video/dist/main.test.d.ts.map +1 -0
- package/extensions/wistia-video/dist/main.umd.cjs +2 -0
- package/extensions/wistia-video/dist/main.umd.cjs.map +1 -0
- package/{dist/lib/extensions/youtube-video.d.ts → extensions/youtube-video/dist/main.d.ts} +3 -3
- package/extensions/youtube-video/dist/main.d.ts.map +1 -0
- package/extensions/youtube-video/dist/main.js +80 -0
- package/extensions/youtube-video/dist/main.js.map +1 -0
- package/extensions/youtube-video/dist/main.test.d.ts +2 -0
- package/extensions/youtube-video/dist/main.test.d.ts.map +1 -0
- package/extensions/youtube-video/dist/main.umd.cjs +2 -0
- package/extensions/youtube-video/dist/main.umd.cjs.map +1 -0
- package/frameworks/react/dist/main.d.ts +3 -0
- package/frameworks/react/dist/main.es.js +51 -0
- package/frameworks/react/dist/main.es.js.map +1 -0
- package/frameworks/react/dist/test-setup.d.ts +1 -0
- package/frameworks/react/dist/use-vistaview.d.ts +2 -0
- package/frameworks/react/dist/vistaview.d.ts +13 -0
- package/frameworks/solid/dist/dev.js +77 -0
- package/frameworks/solid/dist/dev.jsx +72 -0
- package/frameworks/solid/dist/index.d.ts +18 -0
- package/frameworks/solid/dist/index.js +76 -0
- package/frameworks/solid/dist/index.jsx +71 -0
- package/frameworks/svelte/dist/VistaView.svelte +65 -0
- package/frameworks/svelte/dist/VistaView.svelte.d.ts +46 -0
- package/frameworks/svelte/dist/index.d.ts +3 -0
- package/frameworks/svelte/dist/index.js +2 -0
- package/frameworks/svelte/dist/types.d.ts +14 -0
- package/frameworks/svelte/dist/types.js +1 -0
- package/frameworks/svelte/dist/use-vistaview.d.ts +2 -0
- package/frameworks/svelte/dist/use-vistaview.js +24 -0
- package/frameworks/svelte/dist/use-vistaview.test.d.ts +1 -0
- package/frameworks/svelte/dist/use-vistaview.test.js +115 -0
- package/frameworks/vue/dist/main.es.js +95 -0
- package/frameworks/vue/dist/main.es.js.map +1 -0
- package/{dist → main/dist}/lib/components.d.ts +1 -2
- package/main/dist/lib/components.js +107 -0
- package/main/dist/lib/defaults/close.d.ts +2 -0
- package/main/dist/lib/defaults/close.js +4 -0
- package/main/dist/lib/defaults/image-setup.d.ts +3 -0
- package/main/dist/lib/defaults/image-setup.js +4 -0
- package/main/dist/lib/defaults/init.d.ts +2 -0
- package/main/dist/lib/defaults/init.js +97 -0
- package/main/dist/lib/defaults/open.d.ts +2 -0
- package/main/dist/lib/defaults/open.js +8 -0
- package/main/dist/lib/defaults/options.d.ts +2 -0
- package/main/dist/lib/defaults/options.js +15 -0
- package/{dist → main/dist}/lib/defaults/transition.d.ts +2 -3
- package/main/dist/lib/defaults/transition.js +40 -0
- package/{dist → main/dist}/lib/main.d.ts +1 -2
- package/main/dist/lib/main.js +66 -0
- package/{dist → main/dist}/lib/throttle.d.ts +0 -1
- package/main/dist/lib/throttle.js +21 -0
- package/{dist → main/dist}/lib/types.d.ts +4 -5
- package/main/dist/lib/types.js +1 -0
- package/{dist → main/dist}/lib/utils/get-fitted-size.d.ts +0 -1
- package/main/dist/lib/utils/get-fitted-size.js +53 -0
- package/{dist → main/dist}/lib/utils/get-full-size-dim.d.ts +0 -1
- package/main/dist/lib/utils/get-full-size-dim.js +35 -0
- package/{dist → main/dist}/lib/utils/get-style.d.ts +0 -1
- package/main/dist/lib/utils/get-style.js +19 -0
- package/{dist → main/dist}/lib/utils/index.d.ts +0 -1
- package/main/dist/lib/utils/index.js +7 -0
- package/{dist → main/dist}/lib/utils/is-not-zero-css.d.ts +0 -1
- package/main/dist/lib/utils/is-not-zero-css.js +3 -0
- package/{dist → main/dist}/lib/utils/parse-element.d.ts +1 -2
- package/main/dist/lib/utils/parse-element.js +67 -0
- package/{dist → main/dist}/lib/vista-box.d.ts +3 -4
- package/main/dist/lib/vista-box.js +466 -0
- package/{dist → main/dist}/lib/vista-hires-transition.d.ts +2 -3
- package/main/dist/lib/vista-hires-transition.js +108 -0
- package/{dist → main/dist}/lib/vista-image-event.d.ts +2 -3
- package/main/dist/lib/vista-image-event.js +166 -0
- package/{dist → main/dist}/lib/vista-image.d.ts +2 -3
- package/main/dist/lib/vista-image.js +274 -0
- package/{dist → main/dist}/lib/vista-pointers.d.ts +1 -2
- package/main/dist/lib/vista-pointers.js +163 -0
- package/{dist → main/dist}/lib/vista-state.d.ts +2 -3
- package/main/dist/lib/vista-state.js +15 -0
- package/{dist → main/dist}/lib/vista-view.d.ts +2 -3
- package/main/dist/lib/vista-view.js +576 -0
- package/main/dist/style.css +1 -0
- package/main/dist/styles/autumn-amber.css +1 -0
- package/main/dist/styles/cotton-candy.css +1 -0
- package/main/dist/styles/dark-rounded.css +1 -0
- package/main/dist/styles/ember-glow.css +1 -0
- package/main/dist/styles/forest-moss.css +1 -0
- package/main/dist/styles/green-lake.css +1 -0
- package/main/dist/styles/ice-crystal.css +1 -0
- package/main/dist/styles/lavender-fields.css +1 -0
- package/main/dist/styles/midnight-gold.css +1 -0
- package/main/dist/styles/midnight-ocean.css +1 -0
- package/main/dist/styles/mint-chocolate.css +1 -0
- package/main/dist/styles/neon-nights.css +1 -0
- package/main/dist/styles/paper-light.css +1 -0
- package/main/dist/styles/retro-arcade.css +1 -0
- package/main/dist/styles/soft-neutral.css +1 -0
- package/main/dist/styles/stark-minimal.css +1 -0
- package/main/dist/styles/strawberry.css +1 -0
- package/{dist → main/dist}/vistaview.d.ts +0 -1
- package/main/dist/vistaview.js +14 -0
- package/main/dist/vistaview.umd.js +18 -0
- package/package.json +122 -67
- package/dist/extensions/dailymotion-video.d.ts +0 -2
- package/dist/extensions/dailymotion-video.js +0 -80
- package/dist/extensions/dailymotion-video.umd.js +0 -1
- package/dist/extensions/download.d.ts +0 -2
- package/dist/extensions/download.js +0 -35
- package/dist/extensions/download.umd.js +0 -1
- package/dist/extensions/google-maps.d.ts +0 -2
- package/dist/extensions/google-maps.js +0 -96
- package/dist/extensions/google-maps.umd.js +0 -1
- package/dist/extensions/image-story.d.ts +0 -2
- package/dist/extensions/image-story.js +0 -621
- package/dist/extensions/image-story.umd.js +0 -2
- package/dist/extensions/logger.d.ts +0 -2
- package/dist/extensions/logger.js +0 -23
- package/dist/extensions/logger.umd.js +0 -1
- package/dist/extensions/mapbox.d.ts +0 -2
- package/dist/extensions/mapbox.js +0 -124
- package/dist/extensions/mapbox.umd.js +0 -1
- package/dist/extensions/openstreetmap.d.ts +0 -2
- package/dist/extensions/openstreetmap.js +0 -125
- package/dist/extensions/openstreetmap.umd.js +0 -1
- package/dist/extensions/select-box.d.ts +0 -2
- package/dist/extensions/select-box.js +0 -29
- package/dist/extensions/select-box.umd.js +0 -1
- package/dist/extensions/streamable-video.d.ts +0 -2
- package/dist/extensions/streamable-video.js +0 -76
- package/dist/extensions/streamable-video.umd.js +0 -1
- package/dist/extensions/twitch-video.d.ts +0 -2
- package/dist/extensions/twitch-video.js +0 -79
- package/dist/extensions/vidyard-video.d.ts +0 -2
- package/dist/extensions/vidyard-video.js +0 -80
- package/dist/extensions/vidyard-video.umd.js +0 -1
- package/dist/extensions/vimeo-video.d.ts +0 -2
- package/dist/extensions/vimeo-video.js +0 -76
- package/dist/extensions/vimeo-video.umd.js +0 -1
- package/dist/extensions/wistia-video.d.ts +0 -2
- package/dist/extensions/wistia-video.js +0 -85
- package/dist/extensions/wistia-video.umd.js +0 -1
- package/dist/extensions/youtube-video.d.ts +0 -2
- package/dist/extensions/youtube-video.js +0 -88
- package/dist/extensions/youtube-video.umd.js +0 -1
- package/dist/lib/components.d.ts.map +0 -1
- package/dist/lib/defaults/close.d.ts +0 -3
- package/dist/lib/defaults/close.d.ts.map +0 -1
- package/dist/lib/defaults/image-setup.d.ts +0 -4
- package/dist/lib/defaults/image-setup.d.ts.map +0 -1
- package/dist/lib/defaults/init.d.ts +0 -3
- package/dist/lib/defaults/init.d.ts.map +0 -1
- package/dist/lib/defaults/open.d.ts +0 -3
- package/dist/lib/defaults/open.d.ts.map +0 -1
- package/dist/lib/defaults/options.d.ts +0 -3
- package/dist/lib/defaults/options.d.ts.map +0 -1
- package/dist/lib/defaults/transition.d.ts.map +0 -1
- package/dist/lib/extensions/dailymotion-video.d.ts.map +0 -1
- package/dist/lib/extensions/download.d.ts +0 -3
- package/dist/lib/extensions/download.d.ts.map +0 -1
- package/dist/lib/extensions/google-maps.d.ts.map +0 -1
- package/dist/lib/extensions/image-story.d.ts +0 -12
- package/dist/lib/extensions/image-story.d.ts.map +0 -1
- package/dist/lib/extensions/logger.d.ts +0 -3
- package/dist/lib/extensions/logger.d.ts.map +0 -1
- package/dist/lib/extensions/mapbox.d.ts.map +0 -1
- package/dist/lib/extensions/openstreetmap.d.ts.map +0 -1
- package/dist/lib/extensions/select-box.d.ts.map +0 -1
- package/dist/lib/extensions/streamable-video.d.ts.map +0 -1
- package/dist/lib/extensions/twitch-video.d.ts.map +0 -1
- package/dist/lib/extensions/vidyard-video.d.ts.map +0 -1
- package/dist/lib/extensions/vimeo-video.d.ts.map +0 -1
- package/dist/lib/extensions/wistia-video.d.ts.map +0 -1
- package/dist/lib/extensions/youtube-video.d.ts.map +0 -1
- package/dist/lib/main.d.ts.map +0 -1
- package/dist/lib/throttle.d.ts.map +0 -1
- package/dist/lib/types.d.ts.map +0 -1
- package/dist/lib/utils/get-fitted-size.d.ts.map +0 -1
- package/dist/lib/utils/get-full-size-dim.d.ts.map +0 -1
- package/dist/lib/utils/get-style.d.ts.map +0 -1
- package/dist/lib/utils/index.d.ts.map +0 -1
- package/dist/lib/utils/is-not-zero-css.d.ts.map +0 -1
- package/dist/lib/utils/parse-element.d.ts.map +0 -1
- package/dist/lib/vista-box.d.ts.map +0 -1
- package/dist/lib/vista-hires-transition.d.ts.map +0 -1
- package/dist/lib/vista-image-event.d.ts.map +0 -1
- package/dist/lib/vista-image.d.ts.map +0 -1
- package/dist/lib/vista-pointers.d.ts.map +0 -1
- package/dist/lib/vista-state.d.ts.map +0 -1
- package/dist/lib/vista-view.d.ts.map +0 -1
- package/dist/react.d.ts +0 -11
- package/dist/react.d.ts.map +0 -1
- package/dist/react.js +0 -69
- package/dist/solid.d.ts +0 -3
- package/dist/solid.d.ts.map +0 -1
- package/dist/solid.js +0 -24
- package/dist/style.css +0 -1
- package/dist/style.d.ts +0 -1
- package/dist/styles/autumn-amber.css +0 -1
- package/dist/styles/autumn-amber.d.ts +0 -1
- package/dist/styles/cotton-candy.css +0 -1
- package/dist/styles/cotton-candy.d.ts +0 -1
- package/dist/styles/dark-rounded.css +0 -1
- package/dist/styles/dark-rounded.d.ts +0 -1
- package/dist/styles/ember-glow.css +0 -1
- package/dist/styles/ember-glow.d.ts +0 -1
- package/dist/styles/extensions/image-story.css +0 -1
- package/dist/styles/extensions/image-story.d.ts +0 -1
- package/dist/styles/forest-moss.css +0 -1
- package/dist/styles/forest-moss.d.ts +0 -1
- package/dist/styles/green-lake.css +0 -1
- package/dist/styles/green-lake.d.ts +0 -1
- package/dist/styles/ice-crystal.css +0 -1
- package/dist/styles/ice-crystal.d.ts +0 -1
- package/dist/styles/lavender-fields.css +0 -1
- package/dist/styles/lavender-fields.d.ts +0 -1
- package/dist/styles/midnight-gold.css +0 -1
- package/dist/styles/midnight-gold.d.ts +0 -1
- package/dist/styles/midnight-ocean.css +0 -1
- package/dist/styles/midnight-ocean.d.ts +0 -1
- package/dist/styles/mint-chocolate.css +0 -1
- package/dist/styles/mint-chocolate.d.ts +0 -1
- package/dist/styles/neon-nights.css +0 -1
- package/dist/styles/neon-nights.d.ts +0 -1
- package/dist/styles/paper-light.css +0 -1
- package/dist/styles/paper-light.d.ts +0 -1
- package/dist/styles/retro-arcade.css +0 -1
- package/dist/styles/retro-arcade.d.ts +0 -1
- package/dist/styles/soft-neutral.css +0 -1
- package/dist/styles/soft-neutral.d.ts +0 -1
- package/dist/styles/stark-minimal.css +0 -1
- package/dist/styles/stark-minimal.d.ts +0 -1
- package/dist/styles/strawberry.css +0 -1
- package/dist/styles/strawberry.d.ts +0 -1
- package/dist/svelte.d.ts +0 -3
- package/dist/svelte.d.ts.map +0 -1
- package/dist/svelte.js +0 -22
- package/dist/vista-box-zG6ZgBcI.js +0 -334
- package/dist/vistaview.d.ts.map +0 -1
- package/dist/vistaview.js +0 -1013
- package/dist/vistaview.umd.js +0 -18
- package/dist/vue.d.ts +0 -25
- package/dist/vue.d.ts.map +0 -1
- package/dist/vue.js +0 -79
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`vistaview`)):typeof define==`function`&&define.amd?define([`exports`,`vistaview`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.VistaView=e.VistaView||{},e.VistaView))})(this,function(e,t){function n(e){if(!e)return null;for(let t of[/wistia\.com\/medias\/([a-zA-Z0-9]+)/,/wistia\.net\/embed\/iframe\/([a-zA-Z0-9]+)/]){let n=e.match(t);if(n&&n[1])return n[1]}return null}async function r(e){let t=n(e);if(!t)throw Error(`Invalid Wistia video URL`);try{return(await(await fetch(`https://fast.wistia.com/oembed?url=https://home.wistia.com/medias/${t}`)).json()).thumbnail_url}catch(e){throw console.error(`Failed to fetch Wistia thumbnail:`,e),Error(`Failed to fetch Wistia thumbnail`)}}var i=class extends t.VistaBox{element;url;constructor(e){super(e);let t=e.elm.config.src;this.url=t;let r=document.createElement(`div`);r.style.position=`relative`,r.style.overflow=`hidden`,r.style.borderRadius=`14px`;let i=document.createElement(`img`);r.appendChild(i),i.style.width=`100%`,i.style.height=`100%`,i.style.objectFit=`cover`,i.src=this.origin?.image.src||``,i.classList.add(`vvw--pulsing`),this.element=r,this.element.classList.add(`vvw-img-hi`);let{width:a,height:o}=this.getFullSizeDim();if(this.fullH=o,this.fullW=a,this.minW=this.fullW*.5,this.maxW=this.fullW,this.element.style.width=`${a}px`,this.element.style.height=`${o}px`,this.setSizes({stableSize:!1,initDimension:!0}),this.pos===0){let e=document.createElement(`iframe`);e.frameBorder=`0`,e.allow=`autoplay; fullscreen`,e.allowFullscreen=!0,e.width=`100%`,e.height=`100%`,e.style.position=`absolute`,e.style.top=`0`,e.style.left=`0`,e.style.opacity=`0`,e.style.transition=`opacity 333ms ease`,e.src=`https://fast.wistia.net/embed/iframe/${n(t)}?autoPlay=1`,r.appendChild(e),e.onload=()=>{e.style.opacity=`1`,i.classList.remove(`vvw--pulsing`)}}this.isLoadedResolved(!0)}getFullSizeDim(){let e=Math.min(window.innerWidth,800);return{width:e,height:e*9/16}}setFinalTransform(){return super.setFinalTransform({propagateEvent:!1})}};function a(){return{name:`wistiaVideo`,onInitializeImage:e=>{let t=e.elm.config.src;if(n(t))return new i(e)},onImageView:async(e,t)=>{let n=e.images.to[Math.floor(e.images.to.length/2)];n instanceof i&&t.deactivateUi([`download`,`zoomIn`,`zoomOut`],n)}}}e.VistaWistiaVideo=i,e.getWistiaThumbnail=r,e.parseWistiaVideoId=n,e.wistiaVideo=a});
|
|
2
|
+
//# sourceMappingURL=main.umd.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.umd.cjs","names":[],"sources":["../src/main.ts"],"sourcesContent":["import type { VistaData, VistaExtension, VistaImageParams, VistaView } from 'vistaview';\nimport { VistaBox } from 'vistaview';\n\n/**\n * Parse Wistia URL and extract video ID\n * Supports various Wistia URL formats:\n * - https://home.wistia.com/medias/VIDEO_ID\n * - https://fast.wistia.net/embed/iframe/VIDEO_ID\n * - https://ACCOUNT.wistia.com/medias/VIDEO_ID\n * @param url - Wistia video URL\n * @returns Video ID or null if not found\n */\nexport function parseWistiaVideoId(url: string): string | null {\n if (!url) return null;\n\n // Try different Wistia URL patterns\n const patterns = [\n /wistia\\.com\\/medias\\/([a-zA-Z0-9]+)/,\n /wistia\\.net\\/embed\\/iframe\\/([a-zA-Z0-9]+)/,\n ];\n\n for (const pattern of patterns) {\n const match = url.match(pattern);\n if (match && match[1]) {\n return match[1];\n }\n }\n\n return null;\n}\n\n/**\n * Get Wistia video thumbnail URL using oEmbed API\n * Note: This fetches data asynchronously from Wistia's oEmbed endpoint\n * @param videoUrl - Wistia video URL\n * @returns Promise with thumbnail URL\n */\nexport async function getWistiaThumbnail(videoUrl: string): Promise<string> {\n const videoId = parseWistiaVideoId(videoUrl);\n\n if (!videoId) {\n throw new Error('Invalid Wistia video URL');\n }\n\n try {\n const response = await fetch(\n `https://fast.wistia.com/oembed?url=https://home.wistia.com/medias/${videoId}`\n );\n const data = await response.json();\n return data.thumbnail_url;\n } catch (error) {\n // Fallback: return a placeholder or rethrow\n console.error('Failed to fetch Wistia thumbnail:', error);\n throw new Error('Failed to fetch Wistia thumbnail');\n }\n}\n\nexport class VistaWistiaVideo extends VistaBox {\n element: HTMLDivElement;\n url: string;\n\n constructor(par: VistaImageParams) {\n super(par);\n\n const url = par.elm.config.src;\n this.url = url;\n\n const div = document.createElement('div');\n div.style.position = 'relative';\n div.style.overflow = 'hidden';\n div.style.borderRadius = '14px';\n const image = document.createElement('img');\n div.appendChild(image);\n image.style.width = '100%';\n image.style.height = '100%';\n image.style.objectFit = 'cover';\n image.src = this.origin?.image.src || ''; // use existing thumbnail if available\n image.classList.add('vvw--pulsing');\n\n this.element = div;\n\n this.element.classList.add('vvw-img-hi');\n\n // set sizes\n const { width: fullWidth, height: fullHeight } = this.getFullSizeDim();\n this.fullH = fullHeight;\n this.fullW = fullWidth;\n this.minW = this.fullW * 0.5;\n this.maxW = this.fullW; // no scaling\n this.element.style.width = `${fullWidth}px`;\n this.element.style.height = `${fullHeight}px`;\n\n // trigger setSizes to setup thumb and iframe initial style\n this.setSizes({ stableSize: false, initDimension: true });\n\n if (this.pos === 0) {\n const iframe = document.createElement('iframe');\n iframe.frameBorder = '0';\n iframe.allow = 'autoplay; fullscreen';\n iframe.allowFullscreen = true;\n iframe.width = '100%';\n iframe.height = '100%';\n iframe.style.position = 'absolute';\n iframe.style.top = '0';\n iframe.style.left = '0';\n iframe.style.opacity = '0';\n iframe.style.transition = 'opacity 333ms ease';\n iframe.src = `https://fast.wistia.net/embed/iframe/${parseWistiaVideoId(url)}?autoPlay=1`;\n div.appendChild(iframe);\n\n iframe.onload = () => {\n iframe.style.opacity = '1';\n image.classList.remove('vvw--pulsing');\n };\n }\n\n this.isLoadedResolved!(true);\n }\n\n // the default full size is the scaled thumbnail size\n // so we change it to 16:9 full window width size (or max 800px)\n protected getFullSizeDim(): { width: number; height: number } {\n const maxWidth = Math.min(window.innerWidth, 800);\n return {\n width: maxWidth,\n height: (maxWidth * 9) / 16,\n };\n }\n\n // override to avoid propagating content change event\n // (because no change will happen on iframe)\n setFinalTransform() {\n return super.setFinalTransform({ propagateEvent: false });\n }\n}\n\nexport function wistiaVideo(): VistaExtension {\n return {\n name: 'wistiaVideo',\n onInitializeImage: (params: VistaImageParams) => {\n const url = params.elm.config.src;\n const videoId = parseWistiaVideoId(url);\n if (!videoId) return;\n\n return new VistaWistiaVideo(params);\n },\n onImageView: async (data: VistaData, v: VistaView) => {\n const mainData = data.images.to![Math.floor(data.images.to!.length / 2)];\n if (mainData instanceof VistaWistiaVideo) {\n v.deactivateUi(['download', 'zoomIn', 'zoomOut'], mainData);\n }\n },\n };\n}\n"],"mappings":"gRAYA,SAAgB,EAAmB,EAA4B,CAC7D,GAAI,CAAC,EAAK,OAAO,KAQjB,IAAK,IAAM,IALM,CACf,sCACA,6CACD,CAE+B,CAC9B,IAAM,EAAQ,EAAI,MAAM,EAAQ,CAChC,GAAI,GAAS,EAAM,GACjB,OAAO,EAAM,GAIjB,OAAO,KAST,eAAsB,EAAmB,EAAmC,CAC1E,IAAM,EAAU,EAAmB,EAAS,CAE5C,GAAI,CAAC,EACH,MAAU,MAAM,2BAA2B,CAG7C,GAAI,CAKF,OADa,MAHI,MAAM,MACrB,qEAAqE,IACtE,EAC2B,MAAM,EACtB,oBACL,EAAO,CAGd,MADA,QAAQ,MAAM,oCAAqC,EAAM,CAC/C,MAAM,mCAAmC,EAIvD,IAAa,EAAb,cAAsC,EAAA,QAAS,CAC7C,QACA,IAEA,YAAY,EAAuB,CACjC,MAAM,EAAI,CAEV,IAAM,EAAM,EAAI,IAAI,OAAO,IAC3B,KAAK,IAAM,EAEX,IAAM,EAAM,SAAS,cAAc,MAAM,CACzC,EAAI,MAAM,SAAW,WACrB,EAAI,MAAM,SAAW,SACrB,EAAI,MAAM,aAAe,OACzB,IAAM,EAAQ,SAAS,cAAc,MAAM,CAC3C,EAAI,YAAY,EAAM,CACtB,EAAM,MAAM,MAAQ,OACpB,EAAM,MAAM,OAAS,OACrB,EAAM,MAAM,UAAY,QACxB,EAAM,IAAM,KAAK,QAAQ,MAAM,KAAO,GACtC,EAAM,UAAU,IAAI,eAAe,CAEnC,KAAK,QAAU,EAEf,KAAK,QAAQ,UAAU,IAAI,aAAa,CAGxC,GAAM,CAAE,MAAO,EAAW,OAAQ,GAAe,KAAK,gBAAgB,CAWtE,GAVA,KAAK,MAAQ,EACb,KAAK,MAAQ,EACb,KAAK,KAAO,KAAK,MAAQ,GACzB,KAAK,KAAO,KAAK,MACjB,KAAK,QAAQ,MAAM,MAAQ,GAAG,EAAU,IACxC,KAAK,QAAQ,MAAM,OAAS,GAAG,EAAW,IAG1C,KAAK,SAAS,CAAE,WAAY,GAAO,cAAe,GAAM,CAAC,CAErD,KAAK,MAAQ,EAAG,CAClB,IAAM,EAAS,SAAS,cAAc,SAAS,CAC/C,EAAO,YAAc,IACrB,EAAO,MAAQ,uBACf,EAAO,gBAAkB,GACzB,EAAO,MAAQ,OACf,EAAO,OAAS,OAChB,EAAO,MAAM,SAAW,WACxB,EAAO,MAAM,IAAM,IACnB,EAAO,MAAM,KAAO,IACpB,EAAO,MAAM,QAAU,IACvB,EAAO,MAAM,WAAa,qBAC1B,EAAO,IAAM,wCAAwC,EAAmB,EAAI,CAAC,aAC7E,EAAI,YAAY,EAAO,CAEvB,EAAO,WAAe,CACpB,EAAO,MAAM,QAAU,IACvB,EAAM,UAAU,OAAO,eAAe,EAI1C,KAAK,iBAAkB,GAAK,CAK9B,gBAA8D,CAC5D,IAAM,EAAW,KAAK,IAAI,OAAO,WAAY,IAAI,CACjD,MAAO,CACL,MAAO,EACP,OAAS,EAAW,EAAK,GAC1B,CAKH,mBAAoB,CAClB,OAAO,MAAM,kBAAkB,CAAE,eAAgB,GAAO,CAAC,GAI7D,SAAgB,GAA8B,CAC5C,MAAO,CACL,KAAM,cACN,kBAAoB,GAA6B,CAC/C,IAAM,EAAM,EAAO,IAAI,OAAO,IACd,KAAmB,EAAI,CAGvC,OAAO,IAAI,EAAiB,EAAO,EAErC,YAAa,MAAO,EAAiB,IAAiB,CACpD,IAAM,EAAW,EAAK,OAAO,GAAI,KAAK,MAAM,EAAK,OAAO,GAAI,OAAS,EAAE,EACnE,aAAoB,GACtB,EAAE,aAAa,CAAC,WAAY,SAAU,UAAU,CAAE,EAAS,EAGhE"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { VistaExtension, VistaImageParams } from '
|
|
2
|
-
import { VistaBox } from '
|
|
1
|
+
import type { VistaExtension, VistaImageParams } from 'vistaview';
|
|
2
|
+
import { VistaBox } from 'vistaview';
|
|
3
3
|
/**
|
|
4
4
|
* Parse YouTube URL and extract video ID
|
|
5
5
|
* Supports various YouTube URL formats:
|
|
@@ -35,4 +35,4 @@ export declare class VistaYoutubeVideo extends VistaBox {
|
|
|
35
35
|
} | undefined;
|
|
36
36
|
}
|
|
37
37
|
export declare function youtubeVideo(): VistaExtension;
|
|
38
|
-
//# sourceMappingURL=
|
|
38
|
+
//# sourceMappingURL=main.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.d.ts","sourceRoot":"","sources":["../src/main.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,cAAc,EAAE,gBAAgB,EAAa,MAAM,WAAW,CAAC;AACxF,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAErC;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAoB9D;AAED;;;;;GAKG;AACH,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,MAAM,EAChB,OAAO,GAAE,QAAQ,GAAG,IAAI,GAAG,IAAI,GAAG,IAAI,GAAG,SAAgB,GACxD,MAAM,CAeR;AAED,qBAAa,iBAAkB,SAAQ,QAAQ;IAC7C,OAAO,EAAE,cAAc,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;gBAEA,GAAG,EAAE,gBAAgB;IA0DjC,SAAS,CAAC,cAAc,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAU7D,iBAAiB;;;;CAGlB;AAED,wBAAgB,YAAY,IAAI,cAAc,CAiB7C"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import { VistaBox } from "vistaview";
|
|
2
|
+
function parseYouTubeVideoId(e) {
|
|
3
|
+
if (!e) return null;
|
|
4
|
+
for (let t of [
|
|
5
|
+
/(?:youtube\.com\/watch\?v=|youtu\.be\/)([a-zA-Z0-9_-]{11})/,
|
|
6
|
+
/youtube\.com\/embed\/([a-zA-Z0-9_-]{11})/,
|
|
7
|
+
/youtube\.com\/v\/([a-zA-Z0-9_-]{11})/,
|
|
8
|
+
/youtube\.com\/live\/([a-zA-Z0-9_-]{11})/,
|
|
9
|
+
/youtube\.com\/shorts\/([a-zA-Z0-9_-]{11})/
|
|
10
|
+
]) {
|
|
11
|
+
let n = e.match(t);
|
|
12
|
+
if (n && n[1]) return n[1];
|
|
13
|
+
}
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
function getYouTubeThumbnail(e, n = "hq") {
|
|
17
|
+
let r = {
|
|
18
|
+
maxres: "maxresdefault.jpg",
|
|
19
|
+
hq: "hqdefault.jpg",
|
|
20
|
+
mq: "mqdefault.jpg",
|
|
21
|
+
sd: "sddefault.jpg",
|
|
22
|
+
default: "default.jpg"
|
|
23
|
+
}, i = parseYouTubeVideoId(e);
|
|
24
|
+
if (!i) throw Error("Invalid YouTube video URL");
|
|
25
|
+
return `https://img.youtube.com/vi/${i}/${r[n]}`;
|
|
26
|
+
}
|
|
27
|
+
var VistaYoutubeVideo = class extends VistaBox {
|
|
28
|
+
element;
|
|
29
|
+
url;
|
|
30
|
+
constructor(e) {
|
|
31
|
+
super(e);
|
|
32
|
+
let r = e.elm.config.src;
|
|
33
|
+
this.url = r;
|
|
34
|
+
let i = document.createElement("div");
|
|
35
|
+
i.style.position = "relative";
|
|
36
|
+
let a = document.createElement("img");
|
|
37
|
+
i.appendChild(a), a.src = this.origin?.image.src || getYouTubeThumbnail(r, "hq"), a.style.width = "100%", a.style.height = "100%", a.style.objectFit = "cover", a.classList.add("vvw--pulsing"), this.element = i, this.element.classList.add("vvw-img-hi");
|
|
38
|
+
let { width: o, height: s } = this.getFullSizeDim();
|
|
39
|
+
if (this.fullH = s, this.fullW = o, this.minW = this.fullW * .5, this.maxW = this.fullW, this.element.style.width = `${o}px`, this.element.style.height = `${s}px`, this.setSizes({
|
|
40
|
+
stableSize: !1,
|
|
41
|
+
initDimension: !0
|
|
42
|
+
}), this.pos === 0) {
|
|
43
|
+
let e = document.createElement("iframe");
|
|
44
|
+
e.frameBorder = "0", e.allow = "accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share", e.allowFullscreen = !0, e.width = "100%", e.height = "100%", e.style.position = "absolute", e.style.top = "0", e.style.left = "0", e.style.opacity = "0", e.style.transition = "opacity 333ms ease", e.src = `https://www.youtube.com/embed/${parseYouTubeVideoId(r)}?autoplay=1&rel=0`, i.appendChild(e), e.onload = () => {
|
|
45
|
+
e.style.opacity = "1", a.classList.remove("vvw--pulsing");
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
this.isLoadedResolved(!0);
|
|
49
|
+
}
|
|
50
|
+
getFullSizeDim() {
|
|
51
|
+
let e = Math.min(window.innerWidth, 800);
|
|
52
|
+
return {
|
|
53
|
+
width: e,
|
|
54
|
+
height: e * 9 / 16
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
setFinalTransform() {
|
|
58
|
+
return super.setFinalTransform({ propagateEvent: !1 });
|
|
59
|
+
}
|
|
60
|
+
};
|
|
61
|
+
function youtubeVideo() {
|
|
62
|
+
return {
|
|
63
|
+
name: "youtubeVideo",
|
|
64
|
+
onInitializeImage: (e) => {
|
|
65
|
+
let n = e.elm.config.src;
|
|
66
|
+
if (parseYouTubeVideoId(n)) return new VistaYoutubeVideo(e);
|
|
67
|
+
},
|
|
68
|
+
onImageView: async (e, t) => {
|
|
69
|
+
let n = e.images.to[Math.floor(e.images.to.length / 2)];
|
|
70
|
+
n instanceof VistaYoutubeVideo && t.deactivateUi([
|
|
71
|
+
"download",
|
|
72
|
+
"zoomIn",
|
|
73
|
+
"zoomOut"
|
|
74
|
+
], n);
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
export { VistaYoutubeVideo, getYouTubeThumbnail, parseYouTubeVideoId, youtubeVideo };
|
|
79
|
+
|
|
80
|
+
//# sourceMappingURL=main.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.js","names":[],"sources":["../src/main.ts"],"sourcesContent":["import type { VistaData, VistaExtension, VistaImageParams, VistaView } from 'vistaview';\nimport { VistaBox } from 'vistaview';\n\n/**\n * Parse YouTube URL and extract video ID\n * Supports various YouTube URL formats:\n * - https://www.youtube.com/watch?v=VIDEO_ID\n * - https://youtu.be/VIDEO_ID\n * - https://www.youtube.com/embed/VIDEO_ID\n * - https://m.youtube.com/watch?v=VIDEO_ID\n * - https://www.youtube.com/v/VIDEO_ID\n * - https://www.youtube.com/live/VIDEO_ID\n * - https://www.youtube.com/shorts/VIDEO_ID\n * @param url - YouTube video URL\n * @returns Video ID or null if not found\n */\nexport function parseYouTubeVideoId(url: string): string | null {\n if (!url) return null;\n\n // Try different YouTube URL patterns\n const patterns = [\n /(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/)([a-zA-Z0-9_-]{11})/,\n /youtube\\.com\\/embed\\/([a-zA-Z0-9_-]{11})/,\n /youtube\\.com\\/v\\/([a-zA-Z0-9_-]{11})/,\n /youtube\\.com\\/live\\/([a-zA-Z0-9_-]{11})/,\n /youtube\\.com\\/shorts\\/([a-zA-Z0-9_-]{11})/,\n ];\n\n for (const pattern of patterns) {\n const match = url.match(pattern);\n if (match && match[1]) {\n return match[1];\n }\n }\n\n return null;\n}\n\n/**\n * Get YouTube video thumbnail URL\n * @param videoUrl - YouTube video URL\n * @param quality - Thumbnail quality: 'maxres' | 'hq' | 'mq' | 'sd' | 'default'\n * @returns Thumbnail URL\n */\nexport function getYouTubeThumbnail(\n videoUrl: string,\n quality: 'maxres' | 'hq' | 'mq' | 'sd' | 'default' = 'hq'\n): string {\n const qualityMap = {\n maxres: 'maxresdefault.jpg',\n hq: 'hqdefault.jpg',\n mq: 'mqdefault.jpg',\n sd: 'sddefault.jpg',\n default: 'default.jpg',\n };\n\n const videoId = parseYouTubeVideoId(videoUrl);\n if (!videoId) {\n throw new Error('Invalid YouTube video URL');\n }\n\n return `https://img.youtube.com/vi/${videoId}/${qualityMap[quality]}`;\n}\n\nexport class VistaYoutubeVideo extends VistaBox {\n element: HTMLDivElement;\n url: string;\n\n constructor(par: VistaImageParams) {\n super(par);\n\n const url = par.elm.config.src;\n this.url = url;\n\n const div = document.createElement('div');\n div.style.position = 'relative';\n const image = document.createElement('img');\n div.appendChild(image);\n image.src = this.origin?.image.src || getYouTubeThumbnail(url, 'hq');\n image.style.width = '100%';\n image.style.height = '100%';\n image.style.objectFit = 'cover';\n image.classList.add('vvw--pulsing');\n this.element = div;\n\n this.element.classList.add('vvw-img-hi');\n\n // set sizes\n const { width: fullWidth, height: fullHeight } = this.getFullSizeDim();\n this.fullH = fullHeight;\n this.fullW = fullWidth;\n this.minW = this.fullW * 0.5;\n this.maxW = this.fullW; // no scaling\n this.element.style.width = `${fullWidth}px`;\n this.element.style.height = `${fullHeight}px`;\n\n // trigger setSizes to setup thumb and iframe initial style\n this.setSizes({ stableSize: false, initDimension: true });\n\n if (this.pos === 0) {\n const iframe = document.createElement('iframe');\n iframe.frameBorder = '0';\n iframe.allow =\n 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share';\n iframe.allowFullscreen = true;\n iframe.width = '100%';\n iframe.height = '100%';\n iframe.style.position = 'absolute';\n iframe.style.top = '0';\n iframe.style.left = '0';\n iframe.style.opacity = '0';\n iframe.style.transition = 'opacity 333ms ease';\n iframe.src = `https://www.youtube.com/embed/${parseYouTubeVideoId(url)}?autoplay=1&rel=0`;\n div.appendChild(iframe);\n\n iframe.onload = () => {\n iframe.style.opacity = '1';\n image.classList.remove('vvw--pulsing');\n };\n }\n\n this.isLoadedResolved!(true);\n }\n\n // the default full size is the scaled thumbnail size\n // so we change it to 16:9 full window width size (or max 800px)\n protected getFullSizeDim(): { width: number; height: number } {\n const maxWidth = Math.min(window.innerWidth, 800);\n return {\n width: maxWidth,\n height: (maxWidth * 9) / 16,\n };\n }\n\n // override to avoid propagating content change event\n // (because no change will happen on iframe)\n setFinalTransform() {\n return super.setFinalTransform({ propagateEvent: false });\n }\n}\n\nexport function youtubeVideo(): VistaExtension {\n return {\n name: 'youtubeVideo',\n onInitializeImage: (params: VistaImageParams) => {\n const url = params.elm.config.src;\n const videoId = parseYouTubeVideoId(url);\n if (!videoId) return;\n\n return new VistaYoutubeVideo(params);\n },\n onImageView: async (data: VistaData, v: VistaView) => {\n const mainData = data.images.to![Math.floor(data.images.to!.length / 2)];\n if (mainData instanceof VistaYoutubeVideo) {\n v.deactivateUi(['download', 'zoomIn', 'zoomOut'], mainData);\n }\n },\n };\n}\n"],"mappings":";AAgBA,SAAgB,oBAAoB,GAA4B;AAC9D,KAAI,CAAC,EAAK,QAAO;AAWjB,MAAK,IAAM,KARM;EACf;EACA;EACA;EACA;EACA;EACD,EAE+B;EAC9B,IAAM,IAAQ,EAAI,MAAM,EAAQ;AAChC,MAAI,KAAS,EAAM,GACjB,QAAO,EAAM;;AAIjB,QAAO;;AAST,SAAgB,oBACd,GACA,IAAqD,MAC7C;CACR,IAAM,IAAa;EACjB,QAAQ;EACR,IAAI;EACJ,IAAI;EACJ,IAAI;EACJ,SAAS;EACV,EAEK,IAAU,oBAAoB,EAAS;AAC7C,KAAI,CAAC,EACH,OAAU,MAAM,4BAA4B;AAG9C,QAAO,8BAA8B,EAAQ,GAAG,EAAW;;AAG7D,IAAa,oBAAb,cAAuC,SAAS;CAC9C;CACA;CAEA,YAAY,GAAuB;AACjC,QAAM,EAAI;EAEV,IAAM,IAAM,EAAI,IAAI,OAAO;AAC3B,OAAK,MAAM;EAEX,IAAM,IAAM,SAAS,cAAc,MAAM;AACzC,IAAI,MAAM,WAAW;EACrB,IAAM,IAAQ,SAAS,cAAc,MAAM;AAS3C,EARA,EAAI,YAAY,EAAM,EACtB,EAAM,MAAM,KAAK,QAAQ,MAAM,OAAO,oBAAoB,GAAK,KAAK,EACpE,EAAM,MAAM,QAAQ,QACpB,EAAM,MAAM,SAAS,QACrB,EAAM,MAAM,YAAY,SACxB,EAAM,UAAU,IAAI,eAAe,EACnC,KAAK,UAAU,GAEf,KAAK,QAAQ,UAAU,IAAI,aAAa;EAGxC,IAAM,EAAE,OAAO,GAAW,QAAQ,MAAe,KAAK,gBAAgB;AAWtE,MAVA,KAAK,QAAQ,GACb,KAAK,QAAQ,GACb,KAAK,OAAO,KAAK,QAAQ,IACzB,KAAK,OAAO,KAAK,OACjB,KAAK,QAAQ,MAAM,QAAQ,GAAG,EAAU,KACxC,KAAK,QAAQ,MAAM,SAAS,GAAG,EAAW,KAG1C,KAAK,SAAS;GAAE,YAAY;GAAO,eAAe;GAAM,CAAC,EAErD,KAAK,QAAQ,GAAG;GAClB,IAAM,IAAS,SAAS,cAAc,SAAS;AAe/C,GAdA,EAAO,cAAc,KACrB,EAAO,QACL,uGACF,EAAO,kBAAkB,IACzB,EAAO,QAAQ,QACf,EAAO,SAAS,QAChB,EAAO,MAAM,WAAW,YACxB,EAAO,MAAM,MAAM,KACnB,EAAO,MAAM,OAAO,KACpB,EAAO,MAAM,UAAU,KACvB,EAAO,MAAM,aAAa,sBAC1B,EAAO,MAAM,iCAAiC,oBAAoB,EAAI,CAAC,oBACvE,EAAI,YAAY,EAAO,EAEvB,EAAO,eAAe;AAEpB,IADA,EAAO,MAAM,UAAU,KACvB,EAAM,UAAU,OAAO,eAAe;;;AAI1C,OAAK,iBAAkB,GAAK;;CAK9B,iBAA8D;EAC5D,IAAM,IAAW,KAAK,IAAI,OAAO,YAAY,IAAI;AACjD,SAAO;GACL,OAAO;GACP,QAAS,IAAW,IAAK;GAC1B;;CAKH,oBAAoB;AAClB,SAAO,MAAM,kBAAkB,EAAE,gBAAgB,IAAO,CAAC;;;AAI7D,SAAgB,eAA+B;AAC7C,QAAO;EACL,MAAM;EACN,oBAAoB,MAA6B;GAC/C,IAAM,IAAM,EAAO,IAAI,OAAO;AACd,2BAAoB,EAAI,CAGxC,QAAO,IAAI,kBAAkB,EAAO;;EAEtC,aAAa,OAAO,GAAiB,MAAiB;GACpD,IAAM,IAAW,EAAK,OAAO,GAAI,KAAK,MAAM,EAAK,OAAO,GAAI,SAAS,EAAE;AACvE,GAAI,aAAoB,qBACtB,EAAE,aAAa;IAAC;IAAY;IAAU;IAAU,EAAE,EAAS;;EAGhE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.test.d.ts","sourceRoot":"","sources":["../src/main.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
(function(e,t){typeof exports==`object`&&typeof module<`u`?t(exports,require(`vistaview`)):typeof define==`function`&&define.amd?define([`exports`,`vistaview`],t):(e=typeof globalThis<`u`?globalThis:e||self,t(e.VistaView=e.VistaView||{},e.VistaView))})(this,function(e,t){function n(e){if(!e)return null;for(let t of[/(?:youtube\.com\/watch\?v=|youtu\.be\/)([a-zA-Z0-9_-]{11})/,/youtube\.com\/embed\/([a-zA-Z0-9_-]{11})/,/youtube\.com\/v\/([a-zA-Z0-9_-]{11})/,/youtube\.com\/live\/([a-zA-Z0-9_-]{11})/,/youtube\.com\/shorts\/([a-zA-Z0-9_-]{11})/]){let n=e.match(t);if(n&&n[1])return n[1]}return null}function r(e,t=`hq`){let r={maxres:`maxresdefault.jpg`,hq:`hqdefault.jpg`,mq:`mqdefault.jpg`,sd:`sddefault.jpg`,default:`default.jpg`},i=n(e);if(!i)throw Error(`Invalid YouTube video URL`);return`https://img.youtube.com/vi/${i}/${r[t]}`}var i=class extends t.VistaBox{element;url;constructor(e){super(e);let t=e.elm.config.src;this.url=t;let i=document.createElement(`div`);i.style.position=`relative`;let a=document.createElement(`img`);i.appendChild(a),a.src=this.origin?.image.src||r(t,`hq`),a.style.width=`100%`,a.style.height=`100%`,a.style.objectFit=`cover`,a.classList.add(`vvw--pulsing`),this.element=i,this.element.classList.add(`vvw-img-hi`);let{width:o,height:s}=this.getFullSizeDim();if(this.fullH=s,this.fullW=o,this.minW=this.fullW*.5,this.maxW=this.fullW,this.element.style.width=`${o}px`,this.element.style.height=`${s}px`,this.setSizes({stableSize:!1,initDimension:!0}),this.pos===0){let e=document.createElement(`iframe`);e.frameBorder=`0`,e.allow=`accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share`,e.allowFullscreen=!0,e.width=`100%`,e.height=`100%`,e.style.position=`absolute`,e.style.top=`0`,e.style.left=`0`,e.style.opacity=`0`,e.style.transition=`opacity 333ms ease`,e.src=`https://www.youtube.com/embed/${n(t)}?autoplay=1&rel=0`,i.appendChild(e),e.onload=()=>{e.style.opacity=`1`,a.classList.remove(`vvw--pulsing`)}}this.isLoadedResolved(!0)}getFullSizeDim(){let e=Math.min(window.innerWidth,800);return{width:e,height:e*9/16}}setFinalTransform(){return super.setFinalTransform({propagateEvent:!1})}};function a(){return{name:`youtubeVideo`,onInitializeImage:e=>{let t=e.elm.config.src;if(n(t))return new i(e)},onImageView:async(e,t)=>{let n=e.images.to[Math.floor(e.images.to.length/2)];n instanceof i&&t.deactivateUi([`download`,`zoomIn`,`zoomOut`],n)}}}e.VistaYoutubeVideo=i,e.getYouTubeThumbnail=r,e.parseYouTubeVideoId=n,e.youtubeVideo=a});
|
|
2
|
+
//# sourceMappingURL=main.umd.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.umd.cjs","names":[],"sources":["../src/main.ts"],"sourcesContent":["import type { VistaData, VistaExtension, VistaImageParams, VistaView } from 'vistaview';\nimport { VistaBox } from 'vistaview';\n\n/**\n * Parse YouTube URL and extract video ID\n * Supports various YouTube URL formats:\n * - https://www.youtube.com/watch?v=VIDEO_ID\n * - https://youtu.be/VIDEO_ID\n * - https://www.youtube.com/embed/VIDEO_ID\n * - https://m.youtube.com/watch?v=VIDEO_ID\n * - https://www.youtube.com/v/VIDEO_ID\n * - https://www.youtube.com/live/VIDEO_ID\n * - https://www.youtube.com/shorts/VIDEO_ID\n * @param url - YouTube video URL\n * @returns Video ID or null if not found\n */\nexport function parseYouTubeVideoId(url: string): string | null {\n if (!url) return null;\n\n // Try different YouTube URL patterns\n const patterns = [\n /(?:youtube\\.com\\/watch\\?v=|youtu\\.be\\/)([a-zA-Z0-9_-]{11})/,\n /youtube\\.com\\/embed\\/([a-zA-Z0-9_-]{11})/,\n /youtube\\.com\\/v\\/([a-zA-Z0-9_-]{11})/,\n /youtube\\.com\\/live\\/([a-zA-Z0-9_-]{11})/,\n /youtube\\.com\\/shorts\\/([a-zA-Z0-9_-]{11})/,\n ];\n\n for (const pattern of patterns) {\n const match = url.match(pattern);\n if (match && match[1]) {\n return match[1];\n }\n }\n\n return null;\n}\n\n/**\n * Get YouTube video thumbnail URL\n * @param videoUrl - YouTube video URL\n * @param quality - Thumbnail quality: 'maxres' | 'hq' | 'mq' | 'sd' | 'default'\n * @returns Thumbnail URL\n */\nexport function getYouTubeThumbnail(\n videoUrl: string,\n quality: 'maxres' | 'hq' | 'mq' | 'sd' | 'default' = 'hq'\n): string {\n const qualityMap = {\n maxres: 'maxresdefault.jpg',\n hq: 'hqdefault.jpg',\n mq: 'mqdefault.jpg',\n sd: 'sddefault.jpg',\n default: 'default.jpg',\n };\n\n const videoId = parseYouTubeVideoId(videoUrl);\n if (!videoId) {\n throw new Error('Invalid YouTube video URL');\n }\n\n return `https://img.youtube.com/vi/${videoId}/${qualityMap[quality]}`;\n}\n\nexport class VistaYoutubeVideo extends VistaBox {\n element: HTMLDivElement;\n url: string;\n\n constructor(par: VistaImageParams) {\n super(par);\n\n const url = par.elm.config.src;\n this.url = url;\n\n const div = document.createElement('div');\n div.style.position = 'relative';\n const image = document.createElement('img');\n div.appendChild(image);\n image.src = this.origin?.image.src || getYouTubeThumbnail(url, 'hq');\n image.style.width = '100%';\n image.style.height = '100%';\n image.style.objectFit = 'cover';\n image.classList.add('vvw--pulsing');\n this.element = div;\n\n this.element.classList.add('vvw-img-hi');\n\n // set sizes\n const { width: fullWidth, height: fullHeight } = this.getFullSizeDim();\n this.fullH = fullHeight;\n this.fullW = fullWidth;\n this.minW = this.fullW * 0.5;\n this.maxW = this.fullW; // no scaling\n this.element.style.width = `${fullWidth}px`;\n this.element.style.height = `${fullHeight}px`;\n\n // trigger setSizes to setup thumb and iframe initial style\n this.setSizes({ stableSize: false, initDimension: true });\n\n if (this.pos === 0) {\n const iframe = document.createElement('iframe');\n iframe.frameBorder = '0';\n iframe.allow =\n 'accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share';\n iframe.allowFullscreen = true;\n iframe.width = '100%';\n iframe.height = '100%';\n iframe.style.position = 'absolute';\n iframe.style.top = '0';\n iframe.style.left = '0';\n iframe.style.opacity = '0';\n iframe.style.transition = 'opacity 333ms ease';\n iframe.src = `https://www.youtube.com/embed/${parseYouTubeVideoId(url)}?autoplay=1&rel=0`;\n div.appendChild(iframe);\n\n iframe.onload = () => {\n iframe.style.opacity = '1';\n image.classList.remove('vvw--pulsing');\n };\n }\n\n this.isLoadedResolved!(true);\n }\n\n // the default full size is the scaled thumbnail size\n // so we change it to 16:9 full window width size (or max 800px)\n protected getFullSizeDim(): { width: number; height: number } {\n const maxWidth = Math.min(window.innerWidth, 800);\n return {\n width: maxWidth,\n height: (maxWidth * 9) / 16,\n };\n }\n\n // override to avoid propagating content change event\n // (because no change will happen on iframe)\n setFinalTransform() {\n return super.setFinalTransform({ propagateEvent: false });\n }\n}\n\nexport function youtubeVideo(): VistaExtension {\n return {\n name: 'youtubeVideo',\n onInitializeImage: (params: VistaImageParams) => {\n const url = params.elm.config.src;\n const videoId = parseYouTubeVideoId(url);\n if (!videoId) return;\n\n return new VistaYoutubeVideo(params);\n },\n onImageView: async (data: VistaData, v: VistaView) => {\n const mainData = data.images.to![Math.floor(data.images.to!.length / 2)];\n if (mainData instanceof VistaYoutubeVideo) {\n v.deactivateUi(['download', 'zoomIn', 'zoomOut'], mainData);\n }\n },\n };\n}\n"],"mappings":"gRAgBA,SAAgB,EAAoB,EAA4B,CAC9D,GAAI,CAAC,EAAK,OAAO,KAWjB,IAAK,IAAM,IARM,CACf,6DACA,2CACA,uCACA,0CACA,4CACD,CAE+B,CAC9B,IAAM,EAAQ,EAAI,MAAM,EAAQ,CAChC,GAAI,GAAS,EAAM,GACjB,OAAO,EAAM,GAIjB,OAAO,KAST,SAAgB,EACd,EACA,EAAqD,KAC7C,CACR,IAAM,EAAa,CACjB,OAAQ,oBACR,GAAI,gBACJ,GAAI,gBACJ,GAAI,gBACJ,QAAS,cACV,CAEK,EAAU,EAAoB,EAAS,CAC7C,GAAI,CAAC,EACH,MAAU,MAAM,4BAA4B,CAG9C,MAAO,8BAA8B,EAAQ,GAAG,EAAW,KAG7D,IAAa,EAAb,cAAuC,EAAA,QAAS,CAC9C,QACA,IAEA,YAAY,EAAuB,CACjC,MAAM,EAAI,CAEV,IAAM,EAAM,EAAI,IAAI,OAAO,IAC3B,KAAK,IAAM,EAEX,IAAM,EAAM,SAAS,cAAc,MAAM,CACzC,EAAI,MAAM,SAAW,WACrB,IAAM,EAAQ,SAAS,cAAc,MAAM,CAC3C,EAAI,YAAY,EAAM,CACtB,EAAM,IAAM,KAAK,QAAQ,MAAM,KAAO,EAAoB,EAAK,KAAK,CACpE,EAAM,MAAM,MAAQ,OACpB,EAAM,MAAM,OAAS,OACrB,EAAM,MAAM,UAAY,QACxB,EAAM,UAAU,IAAI,eAAe,CACnC,KAAK,QAAU,EAEf,KAAK,QAAQ,UAAU,IAAI,aAAa,CAGxC,GAAM,CAAE,MAAO,EAAW,OAAQ,GAAe,KAAK,gBAAgB,CAWtE,GAVA,KAAK,MAAQ,EACb,KAAK,MAAQ,EACb,KAAK,KAAO,KAAK,MAAQ,GACzB,KAAK,KAAO,KAAK,MACjB,KAAK,QAAQ,MAAM,MAAQ,GAAG,EAAU,IACxC,KAAK,QAAQ,MAAM,OAAS,GAAG,EAAW,IAG1C,KAAK,SAAS,CAAE,WAAY,GAAO,cAAe,GAAM,CAAC,CAErD,KAAK,MAAQ,EAAG,CAClB,IAAM,EAAS,SAAS,cAAc,SAAS,CAC/C,EAAO,YAAc,IACrB,EAAO,MACL,sGACF,EAAO,gBAAkB,GACzB,EAAO,MAAQ,OACf,EAAO,OAAS,OAChB,EAAO,MAAM,SAAW,WACxB,EAAO,MAAM,IAAM,IACnB,EAAO,MAAM,KAAO,IACpB,EAAO,MAAM,QAAU,IACvB,EAAO,MAAM,WAAa,qBAC1B,EAAO,IAAM,iCAAiC,EAAoB,EAAI,CAAC,mBACvE,EAAI,YAAY,EAAO,CAEvB,EAAO,WAAe,CACpB,EAAO,MAAM,QAAU,IACvB,EAAM,UAAU,OAAO,eAAe,EAI1C,KAAK,iBAAkB,GAAK,CAK9B,gBAA8D,CAC5D,IAAM,EAAW,KAAK,IAAI,OAAO,WAAY,IAAI,CACjD,MAAO,CACL,MAAO,EACP,OAAS,EAAW,EAAK,GAC1B,CAKH,mBAAoB,CAClB,OAAO,MAAM,kBAAkB,CAAE,eAAgB,GAAO,CAAC,GAI7D,SAAgB,GAA+B,CAC7C,MAAO,CACL,KAAM,eACN,kBAAoB,GAA6B,CAC/C,IAAM,EAAM,EAAO,IAAI,OAAO,IACd,KAAoB,EAAI,CAGxC,OAAO,IAAI,EAAkB,EAAO,EAEtC,YAAa,MAAO,EAAiB,IAAiB,CACpD,IAAM,EAAW,EAAK,OAAO,GAAI,KAAK,MAAM,EAAK,OAAO,GAAI,OAAS,EAAE,EACnE,aAAoB,GACtB,EAAE,aAAa,CAAC,WAAY,SAAU,UAAU,CAAE,EAAS,EAGhE"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
"use client";
|
|
2
|
+
import { useCallback, useEffect, useId, useImperativeHandle, useRef } from "react";
|
|
3
|
+
import { vistaView } from "vistaview";
|
|
4
|
+
import { jsx } from "react/jsx-runtime";
|
|
5
|
+
function useVistaView(a) {
|
|
6
|
+
let o = useRef(null);
|
|
7
|
+
return useEffect(() => (o.current = vistaView(a), () => {
|
|
8
|
+
o.current?.destroy(), o.current = null;
|
|
9
|
+
}), [a]), {
|
|
10
|
+
open: useCallback((e = 0) => o.current?.open(e), []),
|
|
11
|
+
close: useCallback(() => o.current?.close() ?? Promise.resolve(), []),
|
|
12
|
+
reset: useCallback(() => o.current?.reset(), []),
|
|
13
|
+
next: useCallback(() => o.current?.next(), []),
|
|
14
|
+
prev: useCallback(() => o.current?.prev(), []),
|
|
15
|
+
zoomIn: useCallback(() => o.current?.zoomIn(), []),
|
|
16
|
+
zoomOut: useCallback(() => o.current?.zoomOut(), []),
|
|
17
|
+
getCurrentIndex: useCallback(() => o.current?.getCurrentIndex() ?? -1, []),
|
|
18
|
+
view: useCallback((e) => o.current?.view(e), []),
|
|
19
|
+
destroy: useCallback(() => o.current?.destroy(), [])
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
const VistaView = (function({ children: e, selector: s = "> a", options: c, id: l, ref: u, ...d }) {
|
|
23
|
+
let f = useRef(null), p = useRef(null), m = useId(), h = l || `vvw-gallery-${m.replace(/:/g, "")}`;
|
|
24
|
+
return useImperativeHandle(u, () => ({
|
|
25
|
+
vistaView: p.current,
|
|
26
|
+
container: f.current
|
|
27
|
+
}), []), useEffect(() => {
|
|
28
|
+
if (f.current) return p.current = vistaView({
|
|
29
|
+
...c,
|
|
30
|
+
elements: `#${h} ${s}`
|
|
31
|
+
}), () => {
|
|
32
|
+
p.current?.destroy(), p.current = null;
|
|
33
|
+
};
|
|
34
|
+
}, [
|
|
35
|
+
h,
|
|
36
|
+
s,
|
|
37
|
+
c
|
|
38
|
+
]), useEffect(() => {
|
|
39
|
+
p.current?.reset();
|
|
40
|
+
}, [e]), /* @__PURE__ */ jsx("div", {
|
|
41
|
+
ref: (e) => {
|
|
42
|
+
f.current = e;
|
|
43
|
+
},
|
|
44
|
+
...d,
|
|
45
|
+
id: h,
|
|
46
|
+
children: e
|
|
47
|
+
});
|
|
48
|
+
});
|
|
49
|
+
export { VistaView, useVistaView };
|
|
50
|
+
|
|
51
|
+
//# sourceMappingURL=main.es.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"main.es.js","names":[],"sources":["../src/use-vistaview.ts","../src/vistaview.tsx"],"sourcesContent":["\nimport { useEffect, useRef, useCallback } from 'react';\nimport { vistaView } from 'vistaview';\nimport type { VistaParams, VistaInterface } from 'vistaview';\n\nexport function useVistaView(options: VistaParams): VistaInterface {\n const instance = useRef<VistaInterface | null>(null);\n\n useEffect(() => {\n instance.current = vistaView(options);\n return () => {\n instance.current?.destroy();\n instance.current = null;\n };\n }, [options]);\n\n return {\n open: useCallback((i = 0) => instance.current?.open(i), []),\n close: useCallback(() => instance.current?.close() ?? Promise.resolve(), []),\n reset: useCallback(() => instance.current?.reset(), []),\n next: useCallback(() => instance.current?.next(), []),\n prev: useCallback(() => instance.current?.prev(), []),\n zoomIn: useCallback(() => instance.current?.zoomIn(), []),\n zoomOut: useCallback(() => instance.current?.zoomOut(), []),\n getCurrentIndex: useCallback(() => instance.current?.getCurrentIndex() ?? -1, []),\n view: useCallback((i: number) => instance.current?.view(i), []),\n destroy: useCallback(() => instance.current?.destroy(), []),\n };\n}","\nimport { useEffect, useRef, useId, useImperativeHandle } from 'react';\nimport type { ReactNode } from 'react';\nimport { vistaView } from 'vistaview';\nimport type { VistaInterface, VistaOpt } from 'vistaview';\n\nexport interface VistaViewProps {\n children: ReactNode;\n selector?: string;\n options?: VistaOpt;\n ref?: React.Ref<VistaComponentRef>;\n}\n\nexport type VistaComponentRef = { vistaView: VistaInterface | null; container: HTMLDivElement | null } | null;\n\nexport const VistaView = (function VistaView(\n { children, selector = '> a', options, id, ref, ...rest }: VistaViewProps & React.HTMLAttributes<HTMLDivElement>\n) {\n const containerRefInner = useRef<HTMLDivElement | null>(null);\n const instanceRef = useRef<VistaInterface | null>(null);\n const generatedId = useId();\n const galleryId = id || `vvw-gallery-${generatedId.replace(/:/g, '')}`;\n\n // expose { vistaView, container } on the component ref\n useImperativeHandle(ref as React.Ref<VistaComponentRef>, () => ({\n vistaView: instanceRef.current,\n container: containerRefInner.current,\n }), []);\n\n useEffect(() => {\n if (!containerRefInner.current) return;\n\n instanceRef.current = vistaView({\n ...options,\n elements: `#${galleryId} ${selector}`,\n });\n\n return () => {\n instanceRef.current?.destroy();\n instanceRef.current = null;\n };\n }, [galleryId, selector, options]);\n\n useEffect(() => {\n // reset when children change\n instanceRef.current?.reset();\n }, [children]);\n\n return (\n <div ref={el => { containerRefInner.current = el }} {...rest} id={galleryId}>\n {children}\n </div>\n );\n});\n\n"],"mappings":";;;;AAKA,SAAgB,aAAa,GAAsC;CACjE,IAAM,IAAW,OAA8B,KAAK;AAUpD,QARA,iBACE,EAAS,UAAU,UAAU,EAAQ,QACxB;AAEX,EADA,EAAS,SAAS,SAAS,EAC3B,EAAS,UAAU;KAEpB,CAAC,EAAQ,CAAC,EAEN;EACL,MAAM,aAAa,IAAI,MAAM,EAAS,SAAS,KAAK,EAAE,EAAE,EAAE,CAAC;EAC3D,OAAO,kBAAkB,EAAS,SAAS,OAAO,IAAI,QAAQ,SAAS,EAAE,EAAE,CAAC;EAC5E,OAAO,kBAAkB,EAAS,SAAS,OAAO,EAAE,EAAE,CAAC;EACvD,MAAM,kBAAkB,EAAS,SAAS,MAAM,EAAE,EAAE,CAAC;EACrD,MAAM,kBAAkB,EAAS,SAAS,MAAM,EAAE,EAAE,CAAC;EACrD,QAAQ,kBAAkB,EAAS,SAAS,QAAQ,EAAE,EAAE,CAAC;EACzD,SAAS,kBAAkB,EAAS,SAAS,SAAS,EAAE,EAAE,CAAC;EAC3D,iBAAiB,kBAAkB,EAAS,SAAS,iBAAiB,IAAI,IAAI,EAAE,CAAC;EACjF,MAAM,aAAa,MAAc,EAAS,SAAS,KAAK,EAAE,EAAE,EAAE,CAAC;EAC/D,SAAS,kBAAkB,EAAS,SAAS,SAAS,EAAE,EAAE,CAAC;EAC5D;;ACZH,MAAa,aAAa,SACxB,EAAE,aAAU,cAAW,OAAO,YAAS,OAAI,QAAK,GAAG,KACnD;CACA,IAAM,IAAoB,OAA8B,KAAK,EACvD,IAAc,OAA8B,KAAK,EACjD,IAAc,OAAO,EACrB,IAAY,KAAM,eAAe,EAAY,QAAQ,MAAM,GAAG;AA2BpE,QAxBA,oBAAoB,UAA4C;EAC9D,WAAW,EAAY;EACvB,WAAW,EAAkB;EAC9B,GAAG,EAAE,CAAC,EAEP,gBAAgB;AACT,QAAkB,QAOvB,QALA,EAAY,UAAU,UAAU;GAC9B,GAAG;GACH,UAAU,IAAI,EAAU,GAAG;GAC5B,CAAC,QAEW;AAEX,GADA,EAAY,SAAS,SAAS,EAC9B,EAAY,UAAU;;IAEvB;EAAC;EAAW;EAAU;EAAQ,CAAC,EAElC,gBAAgB;AAEd,IAAY,SAAS,OAAO;IAC3B,CAAC,EAAS,CAAC,EAGZ,oBAAC,OAAA;EAAI,MAAK,MAAM;AAAE,KAAkB,UAAU;;EAAM,GAAI;EAAM,IAAI;EAC/D;GACG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import '@testing-library/jest-dom/vitest';
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { ReactNode } from 'react';
|
|
2
|
+
import type { VistaInterface, VistaOpt } from 'vistaview';
|
|
3
|
+
export interface VistaViewProps {
|
|
4
|
+
children: ReactNode;
|
|
5
|
+
selector?: string;
|
|
6
|
+
options?: VistaOpt;
|
|
7
|
+
ref?: React.Ref<VistaComponentRef>;
|
|
8
|
+
}
|
|
9
|
+
export type VistaComponentRef = {
|
|
10
|
+
vistaView: VistaInterface | null;
|
|
11
|
+
container: HTMLDivElement | null;
|
|
12
|
+
} | null;
|
|
13
|
+
export declare const VistaView: ({ children, selector, options, id, ref, ...rest }: VistaViewProps & React.HTMLAttributes<HTMLDivElement>) => import("react/jsx-runtime").JSX.Element;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import { onMount, onCleanup, splitProps, children, createEffect } from 'solid-js';
|
|
2
|
+
import { vistaView } from 'vistaview';
|
|
3
|
+
import { template, use, spread, mergeProps, insert } from 'solid-js/web';
|
|
4
|
+
|
|
5
|
+
// src/use-vistaview.ts
|
|
6
|
+
function useVistaView(options) {
|
|
7
|
+
let instance = null;
|
|
8
|
+
onMount(() => {
|
|
9
|
+
instance = vistaView(options);
|
|
10
|
+
});
|
|
11
|
+
onCleanup(() => {
|
|
12
|
+
instance?.destroy();
|
|
13
|
+
instance = null;
|
|
14
|
+
});
|
|
15
|
+
return {
|
|
16
|
+
open: (i) => instance?.open(i),
|
|
17
|
+
close: () => instance?.close() ?? Promise.resolve(),
|
|
18
|
+
reset: () => instance?.reset(),
|
|
19
|
+
next: () => instance?.next(),
|
|
20
|
+
prev: () => instance?.prev(),
|
|
21
|
+
zoomIn: () => instance?.zoomIn(),
|
|
22
|
+
zoomOut: () => instance?.zoomOut(),
|
|
23
|
+
getCurrentIndex: () => instance?.getCurrentIndex() ?? -1,
|
|
24
|
+
view: (i) => instance?.view(i),
|
|
25
|
+
destroy: () => instance?.destroy()
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
var _tmpl$ = /* @__PURE__ */ template(`<div>`);
|
|
29
|
+
function VistaView(props) {
|
|
30
|
+
let container;
|
|
31
|
+
let instance = null;
|
|
32
|
+
const [local, rest] = splitProps(props, ["selector", "options", "componentRef", "id", "children"]);
|
|
33
|
+
let galleryId = local.id || `vvw-gallery-${Math.random().toString(36).slice(2)}`;
|
|
34
|
+
const resolved = children(() => props.children);
|
|
35
|
+
createEffect(() => {
|
|
36
|
+
const nodes = resolved();
|
|
37
|
+
if (nodes && instance) {
|
|
38
|
+
instance.reset();
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
onMount(() => {
|
|
42
|
+
if (!container) {
|
|
43
|
+
console.warn("VistaView: container not yet mounted");
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const realId = container.id;
|
|
47
|
+
const selector = `#${realId} ${local.selector ?? "> a"}`;
|
|
48
|
+
const nodes = document.querySelectorAll(selector);
|
|
49
|
+
if (nodes.length > 0) {
|
|
50
|
+
instance?.destroy();
|
|
51
|
+
instance = vistaView({
|
|
52
|
+
...local.options,
|
|
53
|
+
elements: selector
|
|
54
|
+
});
|
|
55
|
+
local.componentRef?.({
|
|
56
|
+
vistaView: instance,
|
|
57
|
+
container
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
onCleanup(() => {
|
|
62
|
+
instance?.destroy();
|
|
63
|
+
local.componentRef?.(null);
|
|
64
|
+
instance = null;
|
|
65
|
+
});
|
|
66
|
+
return (() => {
|
|
67
|
+
var _el$ = _tmpl$();
|
|
68
|
+
use((el) => container = el, _el$);
|
|
69
|
+
spread(_el$, mergeProps(rest, {
|
|
70
|
+
"id": galleryId
|
|
71
|
+
}), false, true);
|
|
72
|
+
insert(_el$, () => local.children);
|
|
73
|
+
return _el$;
|
|
74
|
+
})();
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export { VistaView, useVistaView };
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
// src/use-vistaview.ts
|
|
2
|
+
import { onMount, onCleanup } from "solid-js";
|
|
3
|
+
import { vistaView } from "vistaview";
|
|
4
|
+
function useVistaView(options) {
|
|
5
|
+
let instance = null;
|
|
6
|
+
onMount(() => {
|
|
7
|
+
instance = vistaView(options);
|
|
8
|
+
});
|
|
9
|
+
onCleanup(() => {
|
|
10
|
+
instance?.destroy();
|
|
11
|
+
instance = null;
|
|
12
|
+
});
|
|
13
|
+
return {
|
|
14
|
+
open: (i) => instance?.open(i),
|
|
15
|
+
close: () => instance?.close() ?? Promise.resolve(),
|
|
16
|
+
reset: () => instance?.reset(),
|
|
17
|
+
next: () => instance?.next(),
|
|
18
|
+
prev: () => instance?.prev(),
|
|
19
|
+
zoomIn: () => instance?.zoomIn(),
|
|
20
|
+
zoomOut: () => instance?.zoomOut(),
|
|
21
|
+
getCurrentIndex: () => instance?.getCurrentIndex() ?? -1,
|
|
22
|
+
view: (i) => instance?.view(i),
|
|
23
|
+
destroy: () => instance?.destroy()
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// src/vistaview.tsx
|
|
28
|
+
import { onCleanup as onCleanup2, onMount as onMount2, splitProps } from "solid-js";
|
|
29
|
+
import { children, createEffect } from "solid-js";
|
|
30
|
+
import { vistaView as vistaView2 } from "vistaview";
|
|
31
|
+
function VistaView(props) {
|
|
32
|
+
let container;
|
|
33
|
+
let instance = null;
|
|
34
|
+
const [local, rest] = splitProps(props, ["selector", "options", "componentRef", "id", "children"]);
|
|
35
|
+
let galleryId = local.id || `vvw-gallery-${Math.random().toString(36).slice(2)}`;
|
|
36
|
+
const resolved = children(() => props.children);
|
|
37
|
+
createEffect(() => {
|
|
38
|
+
const nodes = resolved();
|
|
39
|
+
if (nodes && instance) {
|
|
40
|
+
instance.reset();
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
onMount2(() => {
|
|
44
|
+
if (!container) {
|
|
45
|
+
console.warn("VistaView: container not yet mounted");
|
|
46
|
+
return;
|
|
47
|
+
}
|
|
48
|
+
const realId = container.id;
|
|
49
|
+
const selector = `#${realId} ${local.selector ?? "> a"}`;
|
|
50
|
+
const nodes = document.querySelectorAll(selector);
|
|
51
|
+
if (nodes.length > 0) {
|
|
52
|
+
instance?.destroy();
|
|
53
|
+
instance = vistaView2({
|
|
54
|
+
...local.options,
|
|
55
|
+
elements: selector
|
|
56
|
+
});
|
|
57
|
+
local.componentRef?.({ vistaView: instance, container });
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
onCleanup2(() => {
|
|
61
|
+
instance?.destroy();
|
|
62
|
+
local.componentRef?.(null);
|
|
63
|
+
instance = null;
|
|
64
|
+
});
|
|
65
|
+
return <div ref={(el) => container = el} {...rest} id={galleryId}>
|
|
66
|
+
{local.children}
|
|
67
|
+
</div>;
|
|
68
|
+
}
|
|
69
|
+
export {
|
|
70
|
+
VistaView,
|
|
71
|
+
useVistaView
|
|
72
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { VistaParams, VistaInterface, VistaOpt } from 'vistaview';
|
|
2
|
+
import { JSX } from 'solid-js';
|
|
3
|
+
|
|
4
|
+
declare function useVistaView(options: VistaParams): VistaInterface;
|
|
5
|
+
|
|
6
|
+
interface VistaViewProps extends JSX.HTMLAttributes<HTMLDivElement> {
|
|
7
|
+
selector?: string;
|
|
8
|
+
options?: VistaOpt;
|
|
9
|
+
componentRef?: (obj: {
|
|
10
|
+
vistaView: VistaInterface | null;
|
|
11
|
+
container?: HTMLDivElement | undefined;
|
|
12
|
+
} | null) => void;
|
|
13
|
+
id?: string;
|
|
14
|
+
children?: any;
|
|
15
|
+
}
|
|
16
|
+
declare function VistaView(props: VistaViewProps): JSX.Element;
|
|
17
|
+
|
|
18
|
+
export { VistaView, type VistaViewProps, useVistaView };
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { onMount, onCleanup, splitProps, children, createEffect } from 'solid-js';
|
|
2
|
+
import { vistaView } from 'vistaview';
|
|
3
|
+
import { template, use, spread, mergeProps, insert } from 'solid-js/web';
|
|
4
|
+
|
|
5
|
+
// src/use-vistaview.ts
|
|
6
|
+
function useVistaView(options) {
|
|
7
|
+
let instance = null;
|
|
8
|
+
onMount(() => {
|
|
9
|
+
instance = vistaView(options);
|
|
10
|
+
});
|
|
11
|
+
onCleanup(() => {
|
|
12
|
+
instance?.destroy();
|
|
13
|
+
instance = null;
|
|
14
|
+
});
|
|
15
|
+
return {
|
|
16
|
+
open: (i) => instance?.open(i),
|
|
17
|
+
close: () => instance?.close() ?? Promise.resolve(),
|
|
18
|
+
reset: () => instance?.reset(),
|
|
19
|
+
next: () => instance?.next(),
|
|
20
|
+
prev: () => instance?.prev(),
|
|
21
|
+
zoomIn: () => instance?.zoomIn(),
|
|
22
|
+
zoomOut: () => instance?.zoomOut(),
|
|
23
|
+
getCurrentIndex: () => instance?.getCurrentIndex() ?? -1,
|
|
24
|
+
view: (i) => instance?.view(i),
|
|
25
|
+
destroy: () => instance?.destroy()
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
var _tmpl$ = /* @__PURE__ */ template(`<div>`);
|
|
29
|
+
function VistaView(props) {
|
|
30
|
+
let container;
|
|
31
|
+
let instance = null;
|
|
32
|
+
const [local, rest] = splitProps(props, ["selector", "options", "componentRef", "id", "children"]);
|
|
33
|
+
let galleryId = local.id || `vvw-gallery-${Math.random().toString(36).slice(2)}`;
|
|
34
|
+
const resolved = children(() => props.children);
|
|
35
|
+
createEffect(() => {
|
|
36
|
+
const nodes = resolved();
|
|
37
|
+
if (nodes && instance) {
|
|
38
|
+
instance.reset();
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
onMount(() => {
|
|
42
|
+
if (!container) {
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
const realId = container.id;
|
|
46
|
+
const selector = `#${realId} ${local.selector ?? "> a"}`;
|
|
47
|
+
const nodes = document.querySelectorAll(selector);
|
|
48
|
+
if (nodes.length > 0) {
|
|
49
|
+
instance?.destroy();
|
|
50
|
+
instance = vistaView({
|
|
51
|
+
...local.options,
|
|
52
|
+
elements: selector
|
|
53
|
+
});
|
|
54
|
+
local.componentRef?.({
|
|
55
|
+
vistaView: instance,
|
|
56
|
+
container
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
onCleanup(() => {
|
|
61
|
+
instance?.destroy();
|
|
62
|
+
local.componentRef?.(null);
|
|
63
|
+
instance = null;
|
|
64
|
+
});
|
|
65
|
+
return (() => {
|
|
66
|
+
var _el$ = _tmpl$();
|
|
67
|
+
use((el) => container = el, _el$);
|
|
68
|
+
spread(_el$, mergeProps(rest, {
|
|
69
|
+
"id": galleryId
|
|
70
|
+
}), false, true);
|
|
71
|
+
insert(_el$, () => local.children);
|
|
72
|
+
return _el$;
|
|
73
|
+
})();
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export { VistaView, useVistaView };
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
// src/use-vistaview.ts
|
|
2
|
+
import { onMount, onCleanup } from "solid-js";
|
|
3
|
+
import { vistaView } from "vistaview";
|
|
4
|
+
function useVistaView(options) {
|
|
5
|
+
let instance = null;
|
|
6
|
+
onMount(() => {
|
|
7
|
+
instance = vistaView(options);
|
|
8
|
+
});
|
|
9
|
+
onCleanup(() => {
|
|
10
|
+
instance?.destroy();
|
|
11
|
+
instance = null;
|
|
12
|
+
});
|
|
13
|
+
return {
|
|
14
|
+
open: (i) => instance?.open(i),
|
|
15
|
+
close: () => instance?.close() ?? Promise.resolve(),
|
|
16
|
+
reset: () => instance?.reset(),
|
|
17
|
+
next: () => instance?.next(),
|
|
18
|
+
prev: () => instance?.prev(),
|
|
19
|
+
zoomIn: () => instance?.zoomIn(),
|
|
20
|
+
zoomOut: () => instance?.zoomOut(),
|
|
21
|
+
getCurrentIndex: () => instance?.getCurrentIndex() ?? -1,
|
|
22
|
+
view: (i) => instance?.view(i),
|
|
23
|
+
destroy: () => instance?.destroy()
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// src/vistaview.tsx
|
|
28
|
+
import { onCleanup as onCleanup2, onMount as onMount2, splitProps } from "solid-js";
|
|
29
|
+
import { children, createEffect } from "solid-js";
|
|
30
|
+
import { vistaView as vistaView2 } from "vistaview";
|
|
31
|
+
function VistaView(props) {
|
|
32
|
+
let container;
|
|
33
|
+
let instance = null;
|
|
34
|
+
const [local, rest] = splitProps(props, ["selector", "options", "componentRef", "id", "children"]);
|
|
35
|
+
let galleryId = local.id || `vvw-gallery-${Math.random().toString(36).slice(2)}`;
|
|
36
|
+
const resolved = children(() => props.children);
|
|
37
|
+
createEffect(() => {
|
|
38
|
+
const nodes = resolved();
|
|
39
|
+
if (nodes && instance) {
|
|
40
|
+
instance.reset();
|
|
41
|
+
}
|
|
42
|
+
});
|
|
43
|
+
onMount2(() => {
|
|
44
|
+
if (!container) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
const realId = container.id;
|
|
48
|
+
const selector = `#${realId} ${local.selector ?? "> a"}`;
|
|
49
|
+
const nodes = document.querySelectorAll(selector);
|
|
50
|
+
if (nodes.length > 0) {
|
|
51
|
+
instance?.destroy();
|
|
52
|
+
instance = vistaView2({
|
|
53
|
+
...local.options,
|
|
54
|
+
elements: selector
|
|
55
|
+
});
|
|
56
|
+
local.componentRef?.({ vistaView: instance, container });
|
|
57
|
+
}
|
|
58
|
+
});
|
|
59
|
+
onCleanup2(() => {
|
|
60
|
+
instance?.destroy();
|
|
61
|
+
local.componentRef?.(null);
|
|
62
|
+
instance = null;
|
|
63
|
+
});
|
|
64
|
+
return <div ref={(el) => container = el} {...rest} id={galleryId}>
|
|
65
|
+
{local.children}
|
|
66
|
+
</div>;
|
|
67
|
+
}
|
|
68
|
+
export {
|
|
69
|
+
VistaView,
|
|
70
|
+
useVistaView
|
|
71
|
+
};
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import { onMount, onDestroy } from 'svelte';
|
|
3
|
+
import { vistaView } from 'vistaview';
|
|
4
|
+
import type { VistaOpt, VistaInterface } from 'vistaview';
|
|
5
|
+
import { tick } from 'svelte';
|
|
6
|
+
|
|
7
|
+
export let selector: string = '> a';
|
|
8
|
+
export let options: VistaOpt = {} as VistaOpt;
|
|
9
|
+
export let id: string = '';
|
|
10
|
+
export let vistaRef: ((obj: { vistaView: VistaInterface | null; container: HTMLElement | null } | null) => void) | undefined = undefined;
|
|
11
|
+
|
|
12
|
+
let container: HTMLDivElement | null = null;
|
|
13
|
+
let instance: VistaInterface | null = null;
|
|
14
|
+
const galleryId = id || `vvw-gallery-${Math.random().toString(36).slice(2)}`;
|
|
15
|
+
|
|
16
|
+
function destroyInstance() {
|
|
17
|
+
instance?.destroy();
|
|
18
|
+
instance = null;
|
|
19
|
+
vistaRef?.(null);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function initInstance() {
|
|
23
|
+
if (!container) return;
|
|
24
|
+
destroyInstance();
|
|
25
|
+
instance = vistaView({
|
|
26
|
+
...options,
|
|
27
|
+
elements: `#${galleryId} ${selector}`,
|
|
28
|
+
});
|
|
29
|
+
vistaRef?.({ vistaView: instance, container });
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// expose API via component instance
|
|
33
|
+
export function getApi() {
|
|
34
|
+
return { vistaView: instance, container };
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// re-init when props change
|
|
38
|
+
$: selector, options, async () => {
|
|
39
|
+
// wait DOM update if necessary
|
|
40
|
+
await tick();
|
|
41
|
+
initInstance();
|
|
42
|
+
};
|
|
43
|
+
|
|
44
|
+
let observer: MutationObserver | null = null;
|
|
45
|
+
onMount(() => {
|
|
46
|
+
initInstance();
|
|
47
|
+
observer = new MutationObserver(() => {
|
|
48
|
+
instance?.reset();
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
observer.observe(container!, {
|
|
52
|
+
childList: true,
|
|
53
|
+
subtree: false,
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
|
|
57
|
+
onDestroy(() => {
|
|
58
|
+
observer?.disconnect();
|
|
59
|
+
destroyInstance();
|
|
60
|
+
});
|
|
61
|
+
</script>
|
|
62
|
+
|
|
63
|
+
<div id={galleryId} bind:this={container} {...$$restProps}>
|
|
64
|
+
<slot />
|
|
65
|
+
</div>
|