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 @@
|
|
|
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 Streamable URL and extract video ID\n * Supports various Streamable URL formats:\n * - https://streamable.com/VIDEO_ID\n * - https://streamable.com/e/VIDEO_ID\n * @param url - Streamable video URL\n * @returns Video ID or null if not found\n */\nexport function parseStreamableVideoId(url: string): string | null {\n if (!url) return null;\n\n // Try different Streamable URL patterns\n const patterns = [/streamable\\.com\\/e\\/([a-zA-Z0-9]+)/, /streamable\\.com\\/([a-zA-Z0-9]+)/];\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 Streamable video thumbnail URL\n * @param videoUrl - Streamable video URL\n * @returns Thumbnail URL\n */\nexport function getStreamableThumbnail(videoUrl: string): string {\n const videoId = parseStreamableVideoId(videoUrl);\n if (!videoId) {\n throw new Error('Invalid Streamable video URL');\n }\n\n return `https://cdn-cf-east.streamable.com/image/${videoId}.jpg`;\n}\n\nexport class VistaStreamableVideo 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 || getStreamableThumbnail(url);\n image.style.width = '100%';\n image.style.height = '100%';\n image.style.objectFit = 'cover';\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://streamable.com/e/${parseStreamableVideoId(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 streamableVideo(): VistaExtension {\n return {\n name: 'streamableVideo',\n onInitializeImage: (params: VistaImageParams) => {\n const url = params.elm.config.src;\n const videoId = parseStreamableVideoId(url);\n if (!videoId) return;\n\n return new VistaStreamableVideo(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 VistaStreamableVideo) {\n v.deactivateUi(['download', 'zoomIn', 'zoomOut'], mainData);\n }\n },\n };\n}\n"],"mappings":";AAWA,SAAgB,uBAAuB,GAA4B;AACjE,KAAI,CAAC,EAAK,QAAO;AAKjB,MAAK,IAAM,KAFM,CAAC,sCAAsC,kCAAkC,EAE1D;EAC9B,IAAM,IAAQ,EAAI,MAAM,EAAQ;AAChC,MAAI,KAAS,EAAM,GACjB,QAAO,EAAM;;AAIjB,QAAO;;AAQT,SAAgB,uBAAuB,GAA0B;CAC/D,IAAM,IAAU,uBAAuB,EAAS;AAChD,KAAI,CAAC,EACH,OAAU,MAAM,+BAA+B;AAGjD,QAAO,4CAA4C,EAAQ;;AAG7D,IAAa,uBAAb,cAA0C,SAAS;CACjD;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;AAU3C,EATA,EAAI,YAAY,EAAM,EACtB,EAAM,MAAM,KAAK,QAAQ,MAAM,OAAO,uBAAuB,EAAI,EACjE,EAAM,MAAM,QAAQ,QACpB,EAAM,MAAM,SAAS,QACrB,EAAM,MAAM,YAAY,SACxB,EAAM,UAAU,IAAI,eAAe,EAEnC,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;AAc/C,GAbA,EAAO,cAAc,KACrB,EAAO,QAAQ,wBACf,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,4BAA4B,uBAAuB,EAAI,CAAC,cACrE,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,kBAAkC;AAChD,QAAO;EACL,MAAM;EACN,oBAAoB,MAA6B;GAC/C,IAAM,IAAM,EAAO,IAAI,OAAO;AACd,8BAAuB,EAAI,CAG3C,QAAO,IAAI,qBAAqB,EAAO;;EAEzC,aAAa,OAAO,GAAiB,MAAiB;GACpD,IAAM,IAAW,EAAK,OAAO,GAAI,KAAK,MAAM,EAAK,OAAO,GAAI,SAAS,EAAE;AACvE,GAAI,aAAoB,wBACtB,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[/streamable\.com\/e\/([a-zA-Z0-9]+)/,/streamable\.com\/([a-zA-Z0-9]+)/]){let n=e.match(t);if(n&&n[1])return n[1]}return null}function r(e){let t=n(e);if(!t)throw Error(`Invalid Streamable video URL`);return`https://cdn-cf-east.streamable.com/image/${t}.jpg`}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),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=`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://streamable.com/e/${n(t)}?autoplay=1`,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:`streamableVideo`,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.VistaStreamableVideo=i,e.getStreamableThumbnail=r,e.parseStreamableVideoId=n,e.streamableVideo=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 Streamable URL and extract video ID\n * Supports various Streamable URL formats:\n * - https://streamable.com/VIDEO_ID\n * - https://streamable.com/e/VIDEO_ID\n * @param url - Streamable video URL\n * @returns Video ID or null if not found\n */\nexport function parseStreamableVideoId(url: string): string | null {\n if (!url) return null;\n\n // Try different Streamable URL patterns\n const patterns = [/streamable\\.com\\/e\\/([a-zA-Z0-9]+)/, /streamable\\.com\\/([a-zA-Z0-9]+)/];\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 Streamable video thumbnail URL\n * @param videoUrl - Streamable video URL\n * @returns Thumbnail URL\n */\nexport function getStreamableThumbnail(videoUrl: string): string {\n const videoId = parseStreamableVideoId(videoUrl);\n if (!videoId) {\n throw new Error('Invalid Streamable video URL');\n }\n\n return `https://cdn-cf-east.streamable.com/image/${videoId}.jpg`;\n}\n\nexport class VistaStreamableVideo 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 || getStreamableThumbnail(url);\n image.style.width = '100%';\n image.style.height = '100%';\n image.style.objectFit = 'cover';\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://streamable.com/e/${parseStreamableVideoId(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 streamableVideo(): VistaExtension {\n return {\n name: 'streamableVideo',\n onInitializeImage: (params: VistaImageParams) => {\n const url = params.elm.config.src;\n const videoId = parseStreamableVideoId(url);\n if (!videoId) return;\n\n return new VistaStreamableVideo(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 VistaStreamableVideo) {\n v.deactivateUi(['download', 'zoomIn', 'zoomOut'], mainData);\n }\n },\n };\n}\n"],"mappings":"gRAWA,SAAgB,EAAuB,EAA4B,CACjE,GAAI,CAAC,EAAK,OAAO,KAKjB,IAAK,IAAM,IAFM,CAAC,qCAAsC,kCAAkC,CAE1D,CAC9B,IAAM,EAAQ,EAAI,MAAM,EAAQ,CAChC,GAAI,GAAS,EAAM,GACjB,OAAO,EAAM,GAIjB,OAAO,KAQT,SAAgB,EAAuB,EAA0B,CAC/D,IAAM,EAAU,EAAuB,EAAS,CAChD,GAAI,CAAC,EACH,MAAU,MAAM,+BAA+B,CAGjD,MAAO,4CAA4C,EAAQ,MAG7D,IAAa,EAAb,cAA0C,EAAA,QAAS,CACjD,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,EAAuB,EAAI,CACjE,EAAM,MAAM,MAAQ,OACpB,EAAM,MAAM,OAAS,OACrB,EAAM,MAAM,UAAY,QACxB,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,4BAA4B,EAAuB,EAAI,CAAC,aACrE,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,GAAkC,CAChD,MAAO,CACL,KAAM,kBACN,kBAAoB,GAA6B,CAC/C,IAAM,EAAM,EAAO,IAAI,OAAO,IACd,KAAuB,EAAI,CAG3C,OAAO,IAAI,EAAqB,EAAO,EAEzC,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 Twitch URL and extract video ID or channel
|
|
5
5
|
* Supports:
|
|
@@ -34,4 +34,4 @@ export declare class VistaTwitchVideo extends VistaBox {
|
|
|
34
34
|
} | undefined;
|
|
35
35
|
}
|
|
36
36
|
export declare function twitchVideo(): VistaExtension;
|
|
37
|
-
//# sourceMappingURL=
|
|
37
|
+
//# 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;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,MAAM,GACV;IAAE,IAAI,EAAE,OAAO,GAAG,SAAS,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAsBpE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAkBtD;AAED,qBAAa,gBAAiB,SAAQ,QAAQ;IAC5C,OAAO,EAAE,cAAc,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;gBAEA,GAAG,EAAE,gBAAgB;IAgEjC,SAAS,CAAC,cAAc,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAU7D,iBAAiB;;;;CAGlB;AAED,wBAAgB,WAAW,IAAI,cAAc,CAiB5C"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import { VistaBox } from "vistaview";
|
|
2
|
+
function parseTwitchUrl(e) {
|
|
3
|
+
if (!e) return null;
|
|
4
|
+
let t = e.match(/twitch\.tv\/([^\/]+)\/video\/(\d+)/);
|
|
5
|
+
if (t) return {
|
|
6
|
+
type: "video",
|
|
7
|
+
id: t[2],
|
|
8
|
+
channel: t[1]
|
|
9
|
+
};
|
|
10
|
+
let n = e.match(/twitch\.tv\/videos\/(\d+)/);
|
|
11
|
+
if (n) return {
|
|
12
|
+
type: "video",
|
|
13
|
+
id: n[1]
|
|
14
|
+
};
|
|
15
|
+
let r = e.match(/twitch\.tv\/([^/?]+)/);
|
|
16
|
+
return r && r[1] !== "videos" ? {
|
|
17
|
+
type: "channel",
|
|
18
|
+
id: r[1]
|
|
19
|
+
} : null;
|
|
20
|
+
}
|
|
21
|
+
function getTwitchThumbnail(e) {
|
|
22
|
+
let n = parseTwitchUrl(e);
|
|
23
|
+
if (!n) throw Error("Invalid Twitch URL");
|
|
24
|
+
return n.type === "channel" ? `https://static-cdn.jtvnw.net/previews-ttv/live_user_${n.id}-320x180.jpg` : n.channel ? `https://static-cdn.jtvnw.net/cf_vods/${n.channel}/${n.id}/thumb/thumb0-320x180.jpg` : `https://static-cdn.jtvnw.net/cf_vods/twitch/${n.id}/thumb/thumb0-320x180.jpg`;
|
|
25
|
+
}
|
|
26
|
+
var VistaTwitchVideo = class extends VistaBox {
|
|
27
|
+
element;
|
|
28
|
+
url;
|
|
29
|
+
constructor(e) {
|
|
30
|
+
super(e);
|
|
31
|
+
let r = e.elm.config.src;
|
|
32
|
+
this.url = r;
|
|
33
|
+
let i = document.createElement("div");
|
|
34
|
+
i.style.position = "relative";
|
|
35
|
+
let a = document.createElement("img");
|
|
36
|
+
i.appendChild(a), a.src = this.origin?.image.src || getTwitchThumbnail(r), 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");
|
|
37
|
+
let { width: o, height: s } = this.getFullSizeDim();
|
|
38
|
+
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({
|
|
39
|
+
stableSize: !1,
|
|
40
|
+
initDimension: !0
|
|
41
|
+
}), this.pos === 0) {
|
|
42
|
+
let e = document.createElement("iframe");
|
|
43
|
+
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";
|
|
44
|
+
let n = parseTwitchUrl(r);
|
|
45
|
+
n?.type === "channel" ? e.src = `https://player.twitch.tv/?channel=${n.id}&parent=${window.location.hostname}&autoplay=false` : n?.type === "video" && (e.src = `https://player.twitch.tv/?video=${n.id}&parent=${window.location.hostname}&autoplay=true`), i.appendChild(e), e.onload = () => {
|
|
46
|
+
e.style.opacity = "1", a.classList.remove("vvw--pulsing");
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
this.isLoadedResolved(!0);
|
|
50
|
+
}
|
|
51
|
+
getFullSizeDim() {
|
|
52
|
+
let e = Math.min(window.innerWidth, 800);
|
|
53
|
+
return {
|
|
54
|
+
width: e,
|
|
55
|
+
height: e * 9 / 16
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
setFinalTransform() {
|
|
59
|
+
return super.setFinalTransform({ propagateEvent: !1 });
|
|
60
|
+
}
|
|
61
|
+
};
|
|
62
|
+
function twitchVideo() {
|
|
63
|
+
return {
|
|
64
|
+
name: "twitchVideo",
|
|
65
|
+
onInitializeImage: (e) => {
|
|
66
|
+
let n = e.elm.config.src;
|
|
67
|
+
if (parseTwitchUrl(n)) return new VistaTwitchVideo(e);
|
|
68
|
+
},
|
|
69
|
+
onImageView: async (e, t) => {
|
|
70
|
+
let n = e.images.to[Math.floor(e.images.to.length / 2)];
|
|
71
|
+
n instanceof VistaTwitchVideo && t.deactivateUi([
|
|
72
|
+
"download",
|
|
73
|
+
"zoomIn",
|
|
74
|
+
"zoomOut"
|
|
75
|
+
], n);
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
export { VistaTwitchVideo, getTwitchThumbnail, parseTwitchUrl, twitchVideo };
|
|
80
|
+
|
|
81
|
+
//# 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 Twitch URL and extract video ID or channel\n * Supports:\n * - https://www.twitch.tv/CHANNEL/video/VIDEO_ID\n * - https://www.twitch.tv/videos/VIDEO_ID\n * - https://www.twitch.tv/CHANNEL\n * @param url - Twitch video or channel URL\n * @returns Object with type ('video' or 'channel'), id, and optional channel\n */\nexport function parseTwitchUrl(\n url: string\n): { type: 'video' | 'channel'; id: string; channel?: string } | null {\n if (!url) return null;\n\n // Video URL with channel: https://www.twitch.tv/CHANNEL/video/VIDEO_ID\n const channelVideoMatch = url.match(/twitch\\.tv\\/([^\\/]+)\\/video\\/(\\d+)/);\n if (channelVideoMatch) {\n return { type: 'video', id: channelVideoMatch[2], channel: channelVideoMatch[1] };\n }\n\n // Video URL: https://www.twitch.tv/videos/VIDEO_ID\n const videoMatch = url.match(/twitch\\.tv\\/videos\\/(\\d+)/);\n if (videoMatch) {\n return { type: 'video', id: videoMatch[1] };\n }\n\n // Channel URL: https://www.twitch.tv/CHANNEL\n const channelMatch = url.match(/twitch\\.tv\\/([^/?]+)/);\n if (channelMatch && channelMatch[1] !== 'videos') {\n return { type: 'channel', id: channelMatch[1] };\n }\n\n return null;\n}\n\n/**\n * Get Twitch thumbnail URL\n * @param url - Twitch URL\n * @returns Thumbnail URL\n */\nexport function getTwitchThumbnail(url: string): string {\n const parsed = parseTwitchUrl(url);\n if (!parsed) {\n throw new Error('Invalid Twitch URL');\n }\n\n if (parsed.type === 'channel') {\n // Live stream thumbnail\n return `https://static-cdn.jtvnw.net/previews-ttv/live_user_${parsed.id}-320x180.jpg`;\n } else {\n // VOD thumbnail\n if (parsed.channel) {\n return `https://static-cdn.jtvnw.net/cf_vods/${parsed.channel}/${parsed.id}/thumb/thumb0-320x180.jpg`;\n } else {\n // Fallback for videos without channel - might not work\n return `https://static-cdn.jtvnw.net/cf_vods/twitch/${parsed.id}/thumb/thumb0-320x180.jpg`;\n }\n }\n}\n\nexport class VistaTwitchVideo 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 || getTwitchThumbnail(url);\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 = '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\n const parsed = parseTwitchUrl(url);\n if (parsed?.type === 'channel') {\n iframe.src = `https://player.twitch.tv/?channel=${parsed.id}&parent=${window.location.hostname}&autoplay=false`;\n } else if (parsed?.type === 'video') {\n iframe.src = `https://player.twitch.tv/?video=${parsed.id}&parent=${window.location.hostname}&autoplay=true`;\n }\n\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 twitchVideo(): VistaExtension {\n return {\n name: 'twitchVideo',\n onInitializeImage: (params: VistaImageParams) => {\n const url = params.elm.config.src;\n const parsed = parseTwitchUrl(url);\n if (!parsed) return;\n\n return new VistaTwitchVideo(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 VistaTwitchVideo) {\n v.deactivateUi(['download', 'zoomIn', 'zoomOut'], mainData);\n }\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -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;let t=e.match(/twitch\.tv\/([^\/]+)\/video\/(\d+)/);if(t)return{type:`video`,id:t[2],channel:t[1]};let n=e.match(/twitch\.tv\/videos\/(\d+)/);if(n)return{type:`video`,id:n[1]};let r=e.match(/twitch\.tv\/([^/?]+)/);return r&&r[1]!==`videos`?{type:`channel`,id:r[1]}:null}function r(e){let t=n(e);if(!t)throw Error(`Invalid Twitch URL`);return t.type===`channel`?`https://static-cdn.jtvnw.net/previews-ttv/live_user_${t.id}-320x180.jpg`:t.channel?`https://static-cdn.jtvnw.net/cf_vods/${t.channel}/${t.id}/thumb/thumb0-320x180.jpg`:`https://static-cdn.jtvnw.net/cf_vods/twitch/${t.id}/thumb/thumb0-320x180.jpg`}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),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=`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`;let r=n(t);r?.type===`channel`?e.src=`https://player.twitch.tv/?channel=${r.id}&parent=${window.location.hostname}&autoplay=false`:r?.type===`video`&&(e.src=`https://player.twitch.tv/?video=${r.id}&parent=${window.location.hostname}&autoplay=true`),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:`twitchVideo`,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.VistaTwitchVideo=i,e.getTwitchThumbnail=r,e.parseTwitchUrl=n,e.twitchVideo=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 Twitch URL and extract video ID or channel\n * Supports:\n * - https://www.twitch.tv/CHANNEL/video/VIDEO_ID\n * - https://www.twitch.tv/videos/VIDEO_ID\n * - https://www.twitch.tv/CHANNEL\n * @param url - Twitch video or channel URL\n * @returns Object with type ('video' or 'channel'), id, and optional channel\n */\nexport function parseTwitchUrl(\n url: string\n): { type: 'video' | 'channel'; id: string; channel?: string } | null {\n if (!url) return null;\n\n // Video URL with channel: https://www.twitch.tv/CHANNEL/video/VIDEO_ID\n const channelVideoMatch = url.match(/twitch\\.tv\\/([^\\/]+)\\/video\\/(\\d+)/);\n if (channelVideoMatch) {\n return { type: 'video', id: channelVideoMatch[2], channel: channelVideoMatch[1] };\n }\n\n // Video URL: https://www.twitch.tv/videos/VIDEO_ID\n const videoMatch = url.match(/twitch\\.tv\\/videos\\/(\\d+)/);\n if (videoMatch) {\n return { type: 'video', id: videoMatch[1] };\n }\n\n // Channel URL: https://www.twitch.tv/CHANNEL\n const channelMatch = url.match(/twitch\\.tv\\/([^/?]+)/);\n if (channelMatch && channelMatch[1] !== 'videos') {\n return { type: 'channel', id: channelMatch[1] };\n }\n\n return null;\n}\n\n/**\n * Get Twitch thumbnail URL\n * @param url - Twitch URL\n * @returns Thumbnail URL\n */\nexport function getTwitchThumbnail(url: string): string {\n const parsed = parseTwitchUrl(url);\n if (!parsed) {\n throw new Error('Invalid Twitch URL');\n }\n\n if (parsed.type === 'channel') {\n // Live stream thumbnail\n return `https://static-cdn.jtvnw.net/previews-ttv/live_user_${parsed.id}-320x180.jpg`;\n } else {\n // VOD thumbnail\n if (parsed.channel) {\n return `https://static-cdn.jtvnw.net/cf_vods/${parsed.channel}/${parsed.id}/thumb/thumb0-320x180.jpg`;\n } else {\n // Fallback for videos without channel - might not work\n return `https://static-cdn.jtvnw.net/cf_vods/twitch/${parsed.id}/thumb/thumb0-320x180.jpg`;\n }\n }\n}\n\nexport class VistaTwitchVideo 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 || getTwitchThumbnail(url);\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 = '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\n const parsed = parseTwitchUrl(url);\n if (parsed?.type === 'channel') {\n iframe.src = `https://player.twitch.tv/?channel=${parsed.id}&parent=${window.location.hostname}&autoplay=false`;\n } else if (parsed?.type === 'video') {\n iframe.src = `https://player.twitch.tv/?video=${parsed.id}&parent=${window.location.hostname}&autoplay=true`;\n }\n\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 twitchVideo(): VistaExtension {\n return {\n name: 'twitchVideo',\n onInitializeImage: (params: VistaImageParams) => {\n const url = params.elm.config.src;\n const parsed = parseTwitchUrl(url);\n if (!parsed) return;\n\n return new VistaTwitchVideo(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 VistaTwitchVideo) {\n v.deactivateUi(['download', 'zoomIn', 'zoomOut'], mainData);\n }\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -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 Vidyard URL and extract video ID
|
|
5
5
|
* Supports various Vidyard URL formats:
|
|
@@ -30,4 +30,4 @@ export declare class VistaVidyardVideo extends VistaBox {
|
|
|
30
30
|
} | undefined;
|
|
31
31
|
}
|
|
32
32
|
export declare function vidyardVideo(): VistaExtension;
|
|
33
|
-
//# sourceMappingURL=
|
|
33
|
+
//# 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;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAkB9D;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAO5D;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,72 @@
|
|
|
1
|
+
import { VistaBox } from "vistaview";
|
|
2
|
+
function parseVidyardVideoId(e) {
|
|
3
|
+
if (!e) return null;
|
|
4
|
+
for (let t of [
|
|
5
|
+
/video\.vidyard\.com\/watch\/([a-zA-Z0-9]+)/,
|
|
6
|
+
/play\.vidyard\.com\/([a-zA-Z0-9]+)/,
|
|
7
|
+
/share\.vidyard\.com\/watch\/([a-zA-Z0-9]+)/
|
|
8
|
+
]) {
|
|
9
|
+
let n = e.match(t);
|
|
10
|
+
if (n && n[1]) return n[1];
|
|
11
|
+
}
|
|
12
|
+
return null;
|
|
13
|
+
}
|
|
14
|
+
function getVidyardThumbnail(e) {
|
|
15
|
+
let n = parseVidyardVideoId(e);
|
|
16
|
+
if (!n) throw Error("Invalid Vidyard video URL");
|
|
17
|
+
return `https://play.vidyard.com/${n}.jpg`;
|
|
18
|
+
}
|
|
19
|
+
var VistaVidyardVideo = class extends VistaBox {
|
|
20
|
+
element;
|
|
21
|
+
url;
|
|
22
|
+
constructor(e) {
|
|
23
|
+
super(e);
|
|
24
|
+
let r = e.elm.config.src;
|
|
25
|
+
this.url = r;
|
|
26
|
+
let i = document.createElement("div");
|
|
27
|
+
i.style.position = "relative";
|
|
28
|
+
let a = document.createElement("img");
|
|
29
|
+
i.appendChild(a), a.src = this.origin?.image.src || getVidyardThumbnail(r), 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");
|
|
30
|
+
let { width: o, height: s } = this.getFullSizeDim();
|
|
31
|
+
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({
|
|
32
|
+
stableSize: !1,
|
|
33
|
+
initDimension: !0
|
|
34
|
+
}), this.pos === 0) {
|
|
35
|
+
let e = document.createElement("iframe");
|
|
36
|
+
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://play.vidyard.com/${parseVidyardVideoId(r)}?autoplay=1`, i.appendChild(e), e.onload = () => {
|
|
37
|
+
e.style.opacity = "1", a.classList.remove("vvw--pulsing");
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
this.isLoadedResolved(!0);
|
|
41
|
+
}
|
|
42
|
+
getFullSizeDim() {
|
|
43
|
+
let e = Math.min(window.innerWidth, 800);
|
|
44
|
+
return {
|
|
45
|
+
width: e,
|
|
46
|
+
height: e * 9 / 16
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
setFinalTransform() {
|
|
50
|
+
return super.setFinalTransform({ propagateEvent: !1 });
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
function vidyardVideo() {
|
|
54
|
+
return {
|
|
55
|
+
name: "vidyardVideo",
|
|
56
|
+
onInitializeImage: (e) => {
|
|
57
|
+
let n = e.elm.config.src;
|
|
58
|
+
if (parseVidyardVideoId(n)) return new VistaVidyardVideo(e);
|
|
59
|
+
},
|
|
60
|
+
onImageView: async (e, t) => {
|
|
61
|
+
let n = e.images.to[Math.floor(e.images.to.length / 2)];
|
|
62
|
+
n instanceof VistaVidyardVideo && t.deactivateUi([
|
|
63
|
+
"download",
|
|
64
|
+
"zoomIn",
|
|
65
|
+
"zoomOut"
|
|
66
|
+
], n);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export { VistaVidyardVideo, getVidyardThumbnail, parseVidyardVideoId, vidyardVideo };
|
|
71
|
+
|
|
72
|
+
//# 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 Vidyard URL and extract video ID\n * Supports various Vidyard URL formats:\n * - https://video.vidyard.com/watch/VIDEO_ID\n * - https://play.vidyard.com/VIDEO_ID\n * - https://share.vidyard.com/watch/VIDEO_ID\n * @param url - Vidyard video URL\n * @returns Video ID or null if not found\n */\nexport function parseVidyardVideoId(url: string): string | null {\n if (!url) return null;\n\n // Try different Vidyard URL patterns\n const patterns = [\n /video\\.vidyard\\.com\\/watch\\/([a-zA-Z0-9]+)/,\n /play\\.vidyard\\.com\\/([a-zA-Z0-9]+)/,\n /share\\.vidyard\\.com\\/watch\\/([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 Vidyard video thumbnail URL\n * @param videoUrl - Vidyard video URL\n * @returns Thumbnail URL\n */\nexport function getVidyardThumbnail(videoUrl: string): string {\n const videoId = parseVidyardVideoId(videoUrl);\n if (!videoId) {\n throw new Error('Invalid Vidyard video URL');\n }\n\n return `https://play.vidyard.com/${videoId}.jpg`;\n}\n\nexport class VistaVidyardVideo 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 || getVidyardThumbnail(url);\n image.style.width = '100%';\n image.style.height = '100%';\n image.style.objectFit = 'cover';\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://play.vidyard.com/${parseVidyardVideoId(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 vidyardVideo(): VistaExtension {\n return {\n name: 'vidyardVideo',\n onInitializeImage: (params: VistaImageParams) => {\n const url = params.elm.config.src;\n const videoId = parseVidyardVideoId(url);\n if (!videoId) return;\n\n return new VistaVidyardVideo(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 VistaVidyardVideo) {\n v.deactivateUi(['download', 'zoomIn', 'zoomOut'], mainData);\n }\n },\n };\n}\n"],"mappings":";AAYA,SAAgB,oBAAoB,GAA4B;AAC9D,KAAI,CAAC,EAAK,QAAO;AASjB,MAAK,IAAM,KANM;EACf;EACA;EACA;EACD,EAE+B;EAC9B,IAAM,IAAQ,EAAI,MAAM,EAAQ;AAChC,MAAI,KAAS,EAAM,GACjB,QAAO,EAAM;;AAIjB,QAAO;;AAQT,SAAgB,oBAAoB,GAA0B;CAC5D,IAAM,IAAU,oBAAoB,EAAS;AAC7C,KAAI,CAAC,EACH,OAAU,MAAM,4BAA4B;AAG9C,QAAO,4BAA4B,EAAQ;;AAG7C,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;AAU3C,EATA,EAAI,YAAY,EAAM,EACtB,EAAM,MAAM,KAAK,QAAQ,MAAM,OAAO,oBAAoB,EAAI,EAC9D,EAAM,MAAM,QAAQ,QACpB,EAAM,MAAM,SAAS,QACrB,EAAM,MAAM,YAAY,SACxB,EAAM,UAAU,IAAI,eAAe,EAEnC,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;AAc/C,GAbA,EAAO,cAAc,KACrB,EAAO,QAAQ,wBACf,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,4BAA4B,oBAAoB,EAAI,CAAC,cAClE,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[/video\.vidyard\.com\/watch\/([a-zA-Z0-9]+)/,/play\.vidyard\.com\/([a-zA-Z0-9]+)/,/share\.vidyard\.com\/watch\/([a-zA-Z0-9]+)/]){let n=e.match(t);if(n&&n[1])return n[1]}return null}function r(e){let t=n(e);if(!t)throw Error(`Invalid Vidyard video URL`);return`https://play.vidyard.com/${t}.jpg`}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),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=`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://play.vidyard.com/${n(t)}?autoplay=1`,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:`vidyardVideo`,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.VistaVidyardVideo=i,e.getVidyardThumbnail=r,e.parseVidyardVideoId=n,e.vidyardVideo=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 Vidyard URL and extract video ID\n * Supports various Vidyard URL formats:\n * - https://video.vidyard.com/watch/VIDEO_ID\n * - https://play.vidyard.com/VIDEO_ID\n * - https://share.vidyard.com/watch/VIDEO_ID\n * @param url - Vidyard video URL\n * @returns Video ID or null if not found\n */\nexport function parseVidyardVideoId(url: string): string | null {\n if (!url) return null;\n\n // Try different Vidyard URL patterns\n const patterns = [\n /video\\.vidyard\\.com\\/watch\\/([a-zA-Z0-9]+)/,\n /play\\.vidyard\\.com\\/([a-zA-Z0-9]+)/,\n /share\\.vidyard\\.com\\/watch\\/([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 Vidyard video thumbnail URL\n * @param videoUrl - Vidyard video URL\n * @returns Thumbnail URL\n */\nexport function getVidyardThumbnail(videoUrl: string): string {\n const videoId = parseVidyardVideoId(videoUrl);\n if (!videoId) {\n throw new Error('Invalid Vidyard video URL');\n }\n\n return `https://play.vidyard.com/${videoId}.jpg`;\n}\n\nexport class VistaVidyardVideo 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 || getVidyardThumbnail(url);\n image.style.width = '100%';\n image.style.height = '100%';\n image.style.objectFit = 'cover';\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://play.vidyard.com/${parseVidyardVideoId(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 vidyardVideo(): VistaExtension {\n return {\n name: 'vidyardVideo',\n onInitializeImage: (params: VistaImageParams) => {\n const url = params.elm.config.src;\n const videoId = parseVidyardVideoId(url);\n if (!videoId) return;\n\n return new VistaVidyardVideo(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 VistaVidyardVideo) {\n v.deactivateUi(['download', 'zoomIn', 'zoomOut'], mainData);\n }\n },\n };\n}\n"],"mappings":"gRAYA,SAAgB,EAAoB,EAA4B,CAC9D,GAAI,CAAC,EAAK,OAAO,KASjB,IAAK,IAAM,IANM,CACf,6CACA,qCACA,6CACD,CAE+B,CAC9B,IAAM,EAAQ,EAAI,MAAM,EAAQ,CAChC,GAAI,GAAS,EAAM,GACjB,OAAO,EAAM,GAIjB,OAAO,KAQT,SAAgB,EAAoB,EAA0B,CAC5D,IAAM,EAAU,EAAoB,EAAS,CAC7C,GAAI,CAAC,EACH,MAAU,MAAM,4BAA4B,CAG9C,MAAO,4BAA4B,EAAQ,MAG7C,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,EAAI,CAC9D,EAAM,MAAM,MAAQ,OACpB,EAAM,MAAM,OAAS,OACrB,EAAM,MAAM,UAAY,QACxB,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,4BAA4B,EAAoB,EAAI,CAAC,aAClE,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"}
|
|
@@ -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 Vimeo URL and extract video ID
|
|
5
5
|
* Supports various Vimeo URL formats:
|
|
@@ -33,4 +33,4 @@ export declare class VistaVimeoVideo extends VistaBox {
|
|
|
33
33
|
} | undefined;
|
|
34
34
|
}
|
|
35
35
|
export declare function vimeoVideo(): VistaExtension;
|
|
36
|
-
//# sourceMappingURL=
|
|
36
|
+
//# 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;;;;;;;;;GASG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAc5D;AAED;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAS1D;AAED,qBAAa,eAAgB,SAAQ,QAAQ;IAC3C,OAAO,EAAE,cAAc,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;gBAEA,GAAG,EAAE,gBAAgB;IA2DjC,SAAS,CAAC,cAAc,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAU7D,iBAAiB;;;;CAGlB;AAED,wBAAgB,UAAU,IAAI,cAAc,CAiB3C"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { VistaBox } from "vistaview";
|
|
2
|
+
function parseVimeoVideoId(e) {
|
|
3
|
+
if (!e) return null;
|
|
4
|
+
for (let t of [/vimeo\.com\/(\d+)/, /player\.vimeo\.com\/video\/(\d+)/]) {
|
|
5
|
+
let n = e.match(t);
|
|
6
|
+
if (n && n[1]) return n[1];
|
|
7
|
+
}
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
function getVimeoThumbnail(e) {
|
|
11
|
+
let n = parseVimeoVideoId(e);
|
|
12
|
+
if (!n) throw Error("Invalid Vimeo video URL");
|
|
13
|
+
return `https://vumbnail.com/${n}.jpg`;
|
|
14
|
+
}
|
|
15
|
+
var VistaVimeoVideo = class extends VistaBox {
|
|
16
|
+
element;
|
|
17
|
+
url;
|
|
18
|
+
constructor(e) {
|
|
19
|
+
super(e);
|
|
20
|
+
let r = e.elm.config.src;
|
|
21
|
+
this.url = r;
|
|
22
|
+
let i = document.createElement("div");
|
|
23
|
+
i.style.position = "relative";
|
|
24
|
+
let a = document.createElement("img");
|
|
25
|
+
i.appendChild(a), a.src = this.origin?.image.src || getVimeoThumbnail(r), 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");
|
|
26
|
+
let { width: o, height: s } = this.getFullSizeDim();
|
|
27
|
+
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({
|
|
28
|
+
stableSize: !1,
|
|
29
|
+
initDimension: !0
|
|
30
|
+
}), this.pos === 0) {
|
|
31
|
+
let e = document.createElement("iframe");
|
|
32
|
+
e.frameBorder = "0", e.allow = "autoplay; fullscreen; picture-in-picture", 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://player.vimeo.com/video/${parseVimeoVideoId(r)}?autoplay=1`, i.appendChild(e), e.onload = () => {
|
|
33
|
+
e.style.opacity = "1", a.classList.remove("vvw--pulsing");
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
this.isLoadedResolved(!0);
|
|
37
|
+
}
|
|
38
|
+
getFullSizeDim() {
|
|
39
|
+
let e = Math.min(window.innerWidth, 800);
|
|
40
|
+
return {
|
|
41
|
+
width: e,
|
|
42
|
+
height: e * 9 / 16
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
setFinalTransform() {
|
|
46
|
+
return super.setFinalTransform({ propagateEvent: !1 });
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
function vimeoVideo() {
|
|
50
|
+
return {
|
|
51
|
+
name: "vimeoVideo",
|
|
52
|
+
onInitializeImage: (e) => {
|
|
53
|
+
let n = e.elm.config.src;
|
|
54
|
+
if (parseVimeoVideoId(n)) return new VistaVimeoVideo(e);
|
|
55
|
+
},
|
|
56
|
+
onImageView: async (e, t) => {
|
|
57
|
+
let n = e.images.to[Math.floor(e.images.to.length / 2)];
|
|
58
|
+
n instanceof VistaVimeoVideo && t.deactivateUi([
|
|
59
|
+
"download",
|
|
60
|
+
"zoomIn",
|
|
61
|
+
"zoomOut"
|
|
62
|
+
], n);
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
export { VistaVimeoVideo, getVimeoThumbnail, parseVimeoVideoId, vimeoVideo };
|
|
67
|
+
|
|
68
|
+
//# 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 Vimeo URL and extract video ID\n * Supports various Vimeo URL formats:\n * - https://vimeo.com/VIDEO_ID\n * - https://player.vimeo.com/video/VIDEO_ID\n * - https://vimeo.com/channels/CHANNEL/VIDEO_ID\n * - https://vimeo.com/groups/GROUP/videos/VIDEO_ID\n * @param url - Vimeo video URL\n * @returns Video ID or null if not found\n */\nexport function parseVimeoVideoId(url: string): string | null {\n if (!url) return null;\n\n // Try different Vimeo URL patterns\n const patterns = [/vimeo\\.com\\/(\\d+)/, /player\\.vimeo\\.com\\/video\\/(\\d+)/];\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 Vimeo video thumbnail URL\n * Note: This uses a workaround as Vimeo's official API requires authentication.\n * For production use, consider using Vimeo's oEmbed API.\n * @param videoUrl - Vimeo video URL\n * @returns Thumbnail URL (placeholder pattern)\n */\nexport function getVimeoThumbnail(videoUrl: string): string {\n const videoId = parseVimeoVideoId(videoUrl);\n if (!videoId) {\n throw new Error('Invalid Vimeo video URL');\n }\n\n // Note: Vimeo doesn't provide direct thumbnail URLs without API authentication\n // This is a placeholder - you may want to fetch from oEmbed API\n return `https://vumbnail.com/${videoId}.jpg`;\n}\n\nexport class VistaVimeoVideo 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 || getVimeoThumbnail(url);\n image.style.width = '100%';\n image.style.height = '100%';\n image.style.objectFit = 'cover';\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; picture-in-picture';\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://player.vimeo.com/video/${parseVimeoVideoId(url)}?autoplay=1`;\n div.appendChild(iframe);\n\n iframe.onload = () => {\n iframe.style.opacity = '1';\n // console.debug('Vimeo iframe loaded');\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 vimeoVideo(): VistaExtension {\n return {\n name: 'vimeoVideo',\n onInitializeImage: (params: VistaImageParams) => {\n const url = params.elm.config.src;\n const videoId = parseVimeoVideoId(url);\n if (!videoId) return;\n\n return new VistaVimeoVideo(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 VistaVimeoVideo) {\n v.deactivateUi(['download', 'zoomIn', 'zoomOut'], mainData);\n }\n },\n };\n}\n"],"mappings":";AAaA,SAAgB,kBAAkB,GAA4B;AAC5D,KAAI,CAAC,EAAK,QAAO;AAKjB,MAAK,IAAM,KAFM,CAAC,qBAAqB,mCAAmC,EAE1C;EAC9B,IAAM,IAAQ,EAAI,MAAM,EAAQ;AAChC,MAAI,KAAS,EAAM,GACjB,QAAO,EAAM;;AAIjB,QAAO;;AAUT,SAAgB,kBAAkB,GAA0B;CAC1D,IAAM,IAAU,kBAAkB,EAAS;AAC3C,KAAI,CAAC,EACH,OAAU,MAAM,0BAA0B;AAK5C,QAAO,wBAAwB,EAAQ;;AAGzC,IAAa,kBAAb,cAAqC,SAAS;CAC5C;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;AAU3C,EATA,EAAI,YAAY,EAAM,EACtB,EAAM,MAAM,KAAK,QAAQ,MAAM,OAAO,kBAAkB,EAAI,EAC5D,EAAM,MAAM,QAAQ,QACpB,EAAM,MAAM,SAAS,QACrB,EAAM,MAAM,YAAY,SACxB,EAAM,UAAU,IAAI,eAAe,EAEnC,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;AAc/C,GAbA,EAAO,cAAc,KACrB,EAAO,QAAQ,4CACf,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,kCAAkC,kBAAkB,EAAI,CAAC,cACtE,EAAI,YAAY,EAAO,EAEvB,EAAO,eAAe;AAGpB,IAFA,EAAO,MAAM,UAAU,KAEvB,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,aAA6B;AAC3C,QAAO;EACL,MAAM;EACN,oBAAoB,MAA6B;GAC/C,IAAM,IAAM,EAAO,IAAI,OAAO;AACd,yBAAkB,EAAI,CAGtC,QAAO,IAAI,gBAAgB,EAAO;;EAEpC,aAAa,OAAO,GAAiB,MAAiB;GACpD,IAAM,IAAW,EAAK,OAAO,GAAI,KAAK,MAAM,EAAK,OAAO,GAAI,SAAS,EAAE;AACvE,GAAI,aAAoB,mBACtB,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[/vimeo\.com\/(\d+)/,/player\.vimeo\.com\/video\/(\d+)/]){let n=e.match(t);if(n&&n[1])return n[1]}return null}function r(e){let t=n(e);if(!t)throw Error(`Invalid Vimeo video URL`);return`https://vumbnail.com/${t}.jpg`}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),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=`autoplay; fullscreen; picture-in-picture`,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://player.vimeo.com/video/${n(t)}?autoplay=1`,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:`vimeoVideo`,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.VistaVimeoVideo=i,e.getVimeoThumbnail=r,e.parseVimeoVideoId=n,e.vimeoVideo=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 Vimeo URL and extract video ID\n * Supports various Vimeo URL formats:\n * - https://vimeo.com/VIDEO_ID\n * - https://player.vimeo.com/video/VIDEO_ID\n * - https://vimeo.com/channels/CHANNEL/VIDEO_ID\n * - https://vimeo.com/groups/GROUP/videos/VIDEO_ID\n * @param url - Vimeo video URL\n * @returns Video ID or null if not found\n */\nexport function parseVimeoVideoId(url: string): string | null {\n if (!url) return null;\n\n // Try different Vimeo URL patterns\n const patterns = [/vimeo\\.com\\/(\\d+)/, /player\\.vimeo\\.com\\/video\\/(\\d+)/];\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 Vimeo video thumbnail URL\n * Note: This uses a workaround as Vimeo's official API requires authentication.\n * For production use, consider using Vimeo's oEmbed API.\n * @param videoUrl - Vimeo video URL\n * @returns Thumbnail URL (placeholder pattern)\n */\nexport function getVimeoThumbnail(videoUrl: string): string {\n const videoId = parseVimeoVideoId(videoUrl);\n if (!videoId) {\n throw new Error('Invalid Vimeo video URL');\n }\n\n // Note: Vimeo doesn't provide direct thumbnail URLs without API authentication\n // This is a placeholder - you may want to fetch from oEmbed API\n return `https://vumbnail.com/${videoId}.jpg`;\n}\n\nexport class VistaVimeoVideo 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 || getVimeoThumbnail(url);\n image.style.width = '100%';\n image.style.height = '100%';\n image.style.objectFit = 'cover';\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; picture-in-picture';\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://player.vimeo.com/video/${parseVimeoVideoId(url)}?autoplay=1`;\n div.appendChild(iframe);\n\n iframe.onload = () => {\n iframe.style.opacity = '1';\n // console.debug('Vimeo iframe loaded');\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 vimeoVideo(): VistaExtension {\n return {\n name: 'vimeoVideo',\n onInitializeImage: (params: VistaImageParams) => {\n const url = params.elm.config.src;\n const videoId = parseVimeoVideoId(url);\n if (!videoId) return;\n\n return new VistaVimeoVideo(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 VistaVimeoVideo) {\n v.deactivateUi(['download', 'zoomIn', 'zoomOut'], mainData);\n }\n },\n };\n}\n"],"mappings":"gRAaA,SAAgB,EAAkB,EAA4B,CAC5D,GAAI,CAAC,EAAK,OAAO,KAKjB,IAAK,IAAM,IAFM,CAAC,oBAAqB,mCAAmC,CAE1C,CAC9B,IAAM,EAAQ,EAAI,MAAM,EAAQ,CAChC,GAAI,GAAS,EAAM,GACjB,OAAO,EAAM,GAIjB,OAAO,KAUT,SAAgB,EAAkB,EAA0B,CAC1D,IAAM,EAAU,EAAkB,EAAS,CAC3C,GAAI,CAAC,EACH,MAAU,MAAM,0BAA0B,CAK5C,MAAO,wBAAwB,EAAQ,MAGzC,IAAa,EAAb,cAAqC,EAAA,QAAS,CAC5C,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,EAAkB,EAAI,CAC5D,EAAM,MAAM,MAAQ,OACpB,EAAM,MAAM,OAAS,OACrB,EAAM,MAAM,UAAY,QACxB,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,2CACf,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,kCAAkC,EAAkB,EAAI,CAAC,aACtE,EAAI,YAAY,EAAO,CAEvB,EAAO,WAAe,CACpB,EAAO,MAAM,QAAU,IAEvB,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,GAA6B,CAC3C,MAAO,CACL,KAAM,aACN,kBAAoB,GAA6B,CAC/C,IAAM,EAAM,EAAO,IAAI,OAAO,IACd,KAAkB,EAAI,CAGtC,OAAO,IAAI,EAAgB,EAAO,EAEpC,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 Wistia URL and extract video ID
|
|
5
5
|
* Supports various Wistia URL formats:
|
|
@@ -31,4 +31,4 @@ export declare class VistaWistiaVideo extends VistaBox {
|
|
|
31
31
|
} | undefined;
|
|
32
32
|
}
|
|
33
33
|
export declare function wistiaVideo(): VistaExtension;
|
|
34
|
-
//# sourceMappingURL=
|
|
34
|
+
//# 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;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAiB7D;AAED;;;;;GAKG;AACH,wBAAsB,kBAAkB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkB1E;AAED,qBAAa,gBAAiB,SAAQ,QAAQ;IAC5C,OAAO,EAAE,cAAc,CAAC;IACxB,GAAG,EAAE,MAAM,CAAC;gBAEA,GAAG,EAAE,gBAAgB;IA4DjC,SAAS,CAAC,cAAc,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE;IAU7D,iBAAiB;;;;CAGlB;AAED,wBAAgB,WAAW,IAAI,cAAc,CAiB5C"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { VistaBox } from "vistaview";
|
|
2
|
+
function parseWistiaVideoId(e) {
|
|
3
|
+
if (!e) return null;
|
|
4
|
+
for (let t of [/wistia\.com\/medias\/([a-zA-Z0-9]+)/, /wistia\.net\/embed\/iframe\/([a-zA-Z0-9]+)/]) {
|
|
5
|
+
let n = e.match(t);
|
|
6
|
+
if (n && n[1]) return n[1];
|
|
7
|
+
}
|
|
8
|
+
return null;
|
|
9
|
+
}
|
|
10
|
+
async function getWistiaThumbnail(e) {
|
|
11
|
+
let n = parseWistiaVideoId(e);
|
|
12
|
+
if (!n) throw Error("Invalid Wistia video URL");
|
|
13
|
+
try {
|
|
14
|
+
return (await (await fetch(`https://fast.wistia.com/oembed?url=https://home.wistia.com/medias/${n}`)).json()).thumbnail_url;
|
|
15
|
+
} catch (e) {
|
|
16
|
+
throw console.error("Failed to fetch Wistia thumbnail:", e), Error("Failed to fetch Wistia thumbnail");
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
var VistaWistiaVideo = class extends VistaBox {
|
|
20
|
+
element;
|
|
21
|
+
url;
|
|
22
|
+
constructor(e) {
|
|
23
|
+
super(e);
|
|
24
|
+
let n = e.elm.config.src;
|
|
25
|
+
this.url = n;
|
|
26
|
+
let r = document.createElement("div");
|
|
27
|
+
r.style.position = "relative", r.style.overflow = "hidden", r.style.borderRadius = "14px";
|
|
28
|
+
let i = document.createElement("img");
|
|
29
|
+
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");
|
|
30
|
+
let { width: a, height: o } = this.getFullSizeDim();
|
|
31
|
+
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({
|
|
32
|
+
stableSize: !1,
|
|
33
|
+
initDimension: !0
|
|
34
|
+
}), this.pos === 0) {
|
|
35
|
+
let e = document.createElement("iframe");
|
|
36
|
+
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/${parseWistiaVideoId(n)}?autoPlay=1`, r.appendChild(e), e.onload = () => {
|
|
37
|
+
e.style.opacity = "1", i.classList.remove("vvw--pulsing");
|
|
38
|
+
};
|
|
39
|
+
}
|
|
40
|
+
this.isLoadedResolved(!0);
|
|
41
|
+
}
|
|
42
|
+
getFullSizeDim() {
|
|
43
|
+
let e = Math.min(window.innerWidth, 800);
|
|
44
|
+
return {
|
|
45
|
+
width: e,
|
|
46
|
+
height: e * 9 / 16
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
setFinalTransform() {
|
|
50
|
+
return super.setFinalTransform({ propagateEvent: !1 });
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
function wistiaVideo() {
|
|
54
|
+
return {
|
|
55
|
+
name: "wistiaVideo",
|
|
56
|
+
onInitializeImage: (e) => {
|
|
57
|
+
let n = e.elm.config.src;
|
|
58
|
+
if (parseWistiaVideoId(n)) return new VistaWistiaVideo(e);
|
|
59
|
+
},
|
|
60
|
+
onImageView: async (e, t) => {
|
|
61
|
+
let n = e.images.to[Math.floor(e.images.to.length / 2)];
|
|
62
|
+
n instanceof VistaWistiaVideo && t.deactivateUi([
|
|
63
|
+
"download",
|
|
64
|
+
"zoomIn",
|
|
65
|
+
"zoomOut"
|
|
66
|
+
], n);
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
export { VistaWistiaVideo, getWistiaThumbnail, parseWistiaVideoId, wistiaVideo };
|
|
71
|
+
|
|
72
|
+
//# 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 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":";AAYA,SAAgB,mBAAmB,GAA4B;AAC7D,KAAI,CAAC,EAAK,QAAO;AAQjB,MAAK,IAAM,KALM,CACf,uCACA,6CACD,EAE+B;EAC9B,IAAM,IAAQ,EAAI,MAAM,EAAQ;AAChC,MAAI,KAAS,EAAM,GACjB,QAAO,EAAM;;AAIjB,QAAO;;AAST,eAAsB,mBAAmB,GAAmC;CAC1E,IAAM,IAAU,mBAAmB,EAAS;AAE5C,KAAI,CAAC,EACH,OAAU,MAAM,2BAA2B;AAG7C,KAAI;AAKF,UADa,OAHI,MAAM,MACrB,qEAAqE,IACtE,EAC2B,MAAM,EACtB;UACL,GAAO;AAGd,QADA,QAAQ,MAAM,qCAAqC,EAAM,EAC/C,MAAM,mCAAmC;;;AAIvD,IAAa,mBAAb,cAAsC,SAAS;CAC7C;CACA;CAEA,YAAY,GAAuB;AACjC,QAAM,EAAI;EAEV,IAAM,IAAM,EAAI,IAAI,OAAO;AAC3B,OAAK,MAAM;EAEX,IAAM,IAAM,SAAS,cAAc,MAAM;AAGzC,EAFA,EAAI,MAAM,WAAW,YACrB,EAAI,MAAM,WAAW,UACrB,EAAI,MAAM,eAAe;EACzB,IAAM,IAAQ,SAAS,cAAc,MAAM;AAU3C,EATA,EAAI,YAAY,EAAM,EACtB,EAAM,MAAM,QAAQ,QACpB,EAAM,MAAM,SAAS,QACrB,EAAM,MAAM,YAAY,SACxB,EAAM,MAAM,KAAK,QAAQ,MAAM,OAAO,IACtC,EAAM,UAAU,IAAI,eAAe,EAEnC,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;AAc/C,GAbA,EAAO,cAAc,KACrB,EAAO,QAAQ,wBACf,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,wCAAwC,mBAAmB,EAAI,CAAC,cAC7E,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,cAA8B;AAC5C,QAAO;EACL,MAAM;EACN,oBAAoB,MAA6B;GAC/C,IAAM,IAAM,EAAO,IAAI,OAAO;AACd,0BAAmB,EAAI,CAGvC,QAAO,IAAI,iBAAiB,EAAO;;EAErC,aAAa,OAAO,GAAiB,MAAiB;GACpD,IAAM,IAAW,EAAK,OAAO,GAAI,KAAK,MAAM,EAAK,OAAO,GAAI,SAAS,EAAE;AACvE,GAAI,aAAoB,oBACtB,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":""}
|