@vouchfor/embeds 0.0.0-experiment.2673197 → 0.0.0-experiment.2806713

Sign up to get free protection for your applications and to get access to all the features.
Files changed (41) hide show
  1. package/dist/es/embeds.js +1145 -13
  2. package/dist/es/embeds.js.map +1 -1
  3. package/dist/es/src/components/DialogEmbed/DialogOverlay.d.ts +20 -0
  4. package/dist/es/src/components/DialogEmbed/DialogPortal.d.ts +36 -0
  5. package/dist/es/src/components/DialogEmbed/index.d.ts +38 -0
  6. package/dist/es/src/components/PlayerEmbed/controllers/event-forwarder.d.ts +15 -0
  7. package/dist/es/src/components/PlayerEmbed/controllers/fetcher.d.ts +14 -0
  8. package/dist/es/src/components/PlayerEmbed/controllers/tracking/index.d.ts +36 -0
  9. package/dist/es/src/components/PlayerEmbed/controllers/tracking/utils.d.ts +17 -0
  10. package/dist/es/src/components/PlayerEmbed/index.d.ts +75 -0
  11. package/dist/es/src/components/PlayerEmbed/tests/data.d.ts +3 -0
  12. package/dist/es/src/index.d.ts +2 -0
  13. package/dist/es/src/utils/env.d.ts +12 -0
  14. package/dist/es/src/utils/events.d.ts +2 -0
  15. package/dist/iife/dialog-embed/embed.iife.js +1759 -0
  16. package/dist/iife/dialog-embed/embed.iife.js.map +1 -0
  17. package/dist/iife/embeds.iife.js +772 -364
  18. package/dist/iife/embeds.iife.js.map +1 -1
  19. package/dist/iife/player-embed/embed.iife.js +1621 -0
  20. package/dist/iife/player-embed/embed.iife.js.map +1 -0
  21. package/package.json +46 -32
  22. package/src/components/DialogEmbed/Dialog.stories.ts +91 -0
  23. package/src/components/DialogEmbed/DialogOverlay.ts +131 -0
  24. package/src/components/DialogEmbed/DialogPortal.ts +126 -0
  25. package/src/components/DialogEmbed/index.ts +97 -0
  26. package/src/components/PlayerEmbed/MultiEmbed.stories.ts +135 -0
  27. package/src/components/PlayerEmbed/PlayerEmbed.stories.ts +93 -0
  28. package/src/components/PlayerEmbed/controllers/event-forwarder.ts +48 -0
  29. package/src/components/PlayerEmbed/controllers/fetcher.ts +152 -0
  30. package/src/components/PlayerEmbed/controllers/tracking/index.ts +224 -0
  31. package/src/components/PlayerEmbed/controllers/tracking/utils.ts +95 -0
  32. package/src/components/PlayerEmbed/index.ts +256 -0
  33. package/src/components/PlayerEmbed/tests/PlayerEmbed.spec.ts +80 -0
  34. package/src/components/PlayerEmbed/tests/data.ts +183 -0
  35. package/src/index.ts +2 -1
  36. package/src/utils/env.ts +64 -0
  37. package/src/utils/events.ts +13 -0
  38. package/dist/es/components/InlineEmbed/index.d.ts +0 -17
  39. package/dist/es/index.d.ts +0 -1
  40. package/src/components/InlineEmbed/InlineEmbed.stories.ts +0 -119
  41. package/src/components/InlineEmbed/index.ts +0 -24
@@ -1 +1 @@
1
- {"version":3,"file":"embeds.js","sources":["../../src/components/InlineEmbed/index.ts"],"sourcesContent":["import { MediaPlayer } from '@vouchfor/media-player';\nimport { customElement } from 'lit/decorators.js';\n\nimport type { MediaPlayerProps } from '@vouchfor/media-player';\n\ntype InlineEmbedProps = MediaPlayerProps;\n\n@customElement('vembed-inline')\nclass InlineEmbed extends MediaPlayer {}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vembed-inline': InlineEmbed;\n }\n\n namespace JSX {\n interface IntrinsicElements {\n 'vembed-inline': InlineEmbed;\n }\n }\n}\n\nexport { InlineEmbed };\nexport type { InlineEmbedProps };\n"],"names":["InlineEmbed","MediaPlayer","__decorateClass","customElement"],"mappings":";;;;;;;AAQM,IAAAA,IAAN,cAA0BC,EAAY;AAAC;AAAjCD,IAANE,EAAA;AAAA,EADCC,EAAc,eAAe;AAAA,GACxBH,CAAA;"}
1
+ {"version":3,"file":"embeds.js","sources":["../../src/utils/events.ts","../../src/components/PlayerEmbed/controllers/event-forwarder.ts","../../src/utils/env.ts","../../src/components/PlayerEmbed/controllers/fetcher.ts","../../src/components/PlayerEmbed/controllers/tracking/utils.ts","../../src/components/PlayerEmbed/controllers/tracking/index.ts","../../src/components/PlayerEmbed/index.ts","../../src/components/DialogEmbed/DialogOverlay.ts","../../src/components/DialogEmbed/DialogPortal.ts","../../src/components/DialogEmbed/index.ts"],"sourcesContent":["function forwardEvent(type: string, fromElement: HTMLElement, toElement: HTMLElement) {\n function forwarder(event: Event) {\n toElement.dispatchEvent(new CustomEvent(event.type, event));\n }\n\n fromElement.addEventListener(type, forwarder);\n\n return () => {\n fromElement.removeEventListener(type, forwarder);\n };\n}\n\nexport { forwardEvent };\n","import { createRef, ref } from 'lit/directives/ref.js';\n\nimport type { PlayerEmbed } from '..';\nimport type { ReactiveController, ReactiveControllerHost } from 'lit';\nimport type { DirectiveResult } from 'lit/directive.js';\nimport type { Ref } from 'lit/directives/ref.js';\n\nimport { forwardEvent } from '~/utils/events';\n\ntype PlayerEmbedHost = ReactiveControllerHost & PlayerEmbed;\n\nclass EventForwardController implements ReactiveController {\n host: PlayerEmbedHost;\n\n private _events: string[] = [];\n private _cleanup: (() => void)[] = [];\n private _forwardElementRef: Ref<HTMLElement> = createRef();\n\n constructor(host: PlayerEmbedHost, events: string[]) {\n this.host = host;\n this._events = events;\n host.addController(this);\n }\n\n register(): DirectiveResult {\n return ref(this._forwardElementRef);\n }\n\n hostConnected() {\n // Guaranteed to have the element ref in the RAF callback because of how the lit lifecycle works\n requestAnimationFrame(() => {\n this._events.forEach((event) => {\n if (this._forwardElementRef.value) {\n this._cleanup.push(forwardEvent(event, this._forwardElementRef.value, this.host));\n }\n });\n });\n }\n\n hostDisconnected() {\n this._cleanup.forEach((fn) => {\n fn();\n });\n this._cleanup = [];\n }\n}\n\nexport { EventForwardController };\n","type Environment = 'local' | 'dev' | 'staging' | 'prod';\n\ntype GetEnvUrlsReturn = {\n videoUrl: string;\n publicApiUrl: string;\n embedApiUrl: string;\n};\n\nconst devVideoUrl = 'https://d2rxhdlm2q91uk.cloudfront.net';\nconst stagingVideoUrl = 'https://d1ix11aj5kfygl.cloudfront.net';\nconst prodVideoUrl = 'https://d157jlwnudd93d.cloudfront.net';\n\nconst devPublicApiUrl = 'https://bshyfw4h5a.execute-api.ap-southeast-2.amazonaws.com/dev';\nconst stagingPublicApiUrl = 'https://gyzw7rpbq3.execute-api.ap-southeast-2.amazonaws.com/staging';\nconst prodPublicApiUrl = 'https://vfcjuim1l3.execute-api.ap-southeast-2.amazonaws.com/prod';\n\nconst localEmbedApiUrl = 'http://localhost:6060/v2';\nconst devEmbedApiUrl = 'https://embed-dev.vouchfor.com/v2';\nconst stagingEmbedApiUrl = 'https://embed-staging.vouchfor.com/v2';\nconst prodEmbedApiUrl = 'https://embed.vouchfor.com/v2';\n\n// We are handling the case where env is an unknown string so the ts error is a lie\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nfunction getEnvUrls(env: Environment): GetEnvUrlsReturn {\n if (!['local', 'dev', 'staging', 'prod'].includes(env)) {\n throw new Error(`Unknown environment: ${env}`);\n }\n\n if (env === 'local') {\n return {\n videoUrl: devVideoUrl,\n publicApiUrl: devPublicApiUrl,\n embedApiUrl: localEmbedApiUrl\n };\n }\n\n if (env === 'dev') {\n return {\n videoUrl: devVideoUrl,\n publicApiUrl: devPublicApiUrl,\n embedApiUrl: devEmbedApiUrl\n };\n }\n\n if (env === 'staging') {\n return {\n videoUrl: stagingVideoUrl,\n publicApiUrl: stagingPublicApiUrl,\n embedApiUrl: stagingEmbedApiUrl\n };\n }\n\n if (env === 'prod') {\n return {\n videoUrl: prodVideoUrl,\n publicApiUrl: prodPublicApiUrl,\n embedApiUrl: prodEmbedApiUrl\n };\n }\n}\n\nexport { devEmbedApiUrl, stagingEmbedApiUrl, prodEmbedApiUrl, getEnvUrls };\nexport type { Environment };\n","import { Task } from '@lit/task';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport type { PlayerEmbed, PlayerEmbedProps } from '..';\nimport type { ReactiveControllerHost } from 'lit';\nimport type { Environment } from '~/utils/env';\n\nimport { getEnvUrls } from '~/utils/env';\n\ntype PlayerEmbedHost = ReactiveControllerHost & PlayerEmbed;\n\ntype FetchTaskDeps = [\n PlayerEmbedProps['env'],\n PlayerEmbedProps['apiKey'],\n PlayerEmbedProps['data'],\n PlayerEmbedProps['vouchId'],\n PlayerEmbedProps['templateId']\n];\n\ntype FilterTaskDeps = [PlayerEmbedProps['data'], PlayerEmbedProps['questions']];\n\nclass FetcherController {\n host: PlayerEmbedHost;\n\n private _fetching = false;\n private _vouch: PlayerEmbedProps['data'];\n\n set fetching(value) {\n if (this._fetching !== value) {\n this._fetching = value;\n this.host.requestUpdate();\n }\n }\n get fetching() {\n return this._fetching;\n }\n\n private getVouch = async (env: Environment, apiKey: string, vouchId: string) => {\n const { embedApiUrl } = getEnvUrls(env);\n\n const cacheCheck = uuidv4();\n const res = await fetch(`${embedApiUrl}/vouches/${vouchId}`, {\n method: 'GET',\n headers: [\n ['X-Api-Key', apiKey],\n ['X-Cache-Check', cacheCheck]\n ]\n });\n\n const vouch = await res.json();\n this.host.dispatchEvent(new CustomEvent('vouch:loaded', { detail: vouch?.id }));\n\n // HACK: we're currently using API Gateway caching on the embed API without any invalidation logic,\n // so to ensure that the cache stays up to date, whenever we detect a cache hit we trigger another\n // API call with the `Cache-Control` header which will re-fill the cache\n const resCacheCheck = res?.headers?.get('X-Cache-Check');\n if (resCacheCheck !== cacheCheck) {\n fetch(`${embedApiUrl}/vouches/${vouchId}`, {\n method: 'GET',\n headers: [\n ['X-Api-Key', apiKey],\n ['Cache-Control', 'max-age=0']\n ]\n });\n }\n\n return vouch;\n };\n\n private getTemplate = async (env: Environment, apiKey: string, templateId: string) => {\n const { embedApiUrl } = getEnvUrls(env);\n\n const cacheCheck = uuidv4();\n const res = await fetch(`${embedApiUrl}/templates/${templateId}`, {\n method: 'GET',\n headers: [\n ['X-Api-Key', apiKey],\n ['X-Cache-Check', cacheCheck]\n ]\n });\n const template = await res.json();\n\n // HACK: we're currently using API Gateway caching on the embed API without any invalidation logic,\n // so to ensure that the cache stays up to date, whenever we detect a cache hit we trigger another\n // API call with the `Cache-Control` header which will re-fill the cache\n const resCacheCheck = res?.headers?.get('X-Cache-Check');\n if (resCacheCheck !== cacheCheck) {\n fetch(`${embedApiUrl}/templates/${templateId}`, {\n method: 'GET',\n headers: [\n ['X-Api-Key', apiKey],\n ['Cache-Control', 'max-age=0']\n ]\n });\n }\n\n return template;\n };\n\n constructor(host: PlayerEmbedHost) {\n this.host = host;\n new Task<FetchTaskDeps, void>(\n this.host,\n async ([env, apiKey, data, vouchId, templateId]: FetchTaskDeps) => {\n try {\n host.vouch = undefined;\n host.template = undefined;\n\n if (data) {\n let template;\n if (templateId) {\n this.fetching = true;\n template = await this.getTemplate(env, apiKey, templateId);\n }\n this._vouch = data;\n host.template = template ?? data?.settings?.template?.instance;\n } else if (vouchId) {\n this.fetching = true;\n\n const [vouch, template] = await Promise.all([\n this.getVouch(env, apiKey, vouchId),\n templateId ? this.getTemplate(env, apiKey, templateId) : null\n ]);\n this._vouch = vouch;\n host.template = template ?? vouch?.settings?.template?.instance;\n }\n } finally {\n this.fetching = false;\n }\n },\n () => [host.env, host.apiKey, host.data, host.vouchId, host.templateId]\n );\n\n // This second task is to be able to filter the vouch without fetching it again if only the questions changed\n new Task<FilterTaskDeps, void>(\n this.host,\n ([vouch, questions]: FilterTaskDeps) => {\n host.vouch = vouch\n ? {\n ...vouch,\n questions: {\n items: vouch?.questions.items.filter((_, index) => !questions?.length || questions?.includes(index + 1))\n }\n }\n : undefined;\n },\n () => [this._vouch, host.questions]\n );\n }\n}\n\nexport { FetcherController };\n","import { TEMPLATE_VERSION } from '@vouchfor/canvas-video';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport type { TrackingPayload } from '.';\nimport type { Vouch } from '@vouchfor/video-utils';\nimport type { Environment } from '~/utils/env';\n\nimport packageJson from '~/../package.json';\nimport { getEnvUrls } from '~/utils/env';\n\nfunction createVisitor(env: Environment) {\n const { publicApiUrl } = getEnvUrls(env);\n const visitorId = uuidv4();\n navigator.sendBeacon(`${publicApiUrl}/api/visitor`, JSON.stringify({ visitorId }));\n return visitorId;\n}\n\nfunction getUids(env: Environment) {\n if (typeof window === 'undefined') {\n return {\n client: null,\n tab: null,\n request: uuidv4()\n };\n }\n\n // Persisted for a user for the same device + browser, so we can e.g. search for all logs related to that browser\n let visitorId = window.localStorage?.getItem?.('vouch-uid-visitor');\n // Persisted for a user for the same device + browser, so we can e.g. search for all logs related to that browser\n let clientId = window.localStorage?.getItem?.('vouch-uid-client');\n // Persisted in session storage, so we can search for everything the user has done in a specific tab\n let tabId = window.sessionStorage?.getItem?.('vouch-uid-tab');\n // Not persisted, allows us to search for any logs related to a single FE request\n // E.g. BE should pass this request ID through all other services to be able to group logs\n const requestId = uuidv4();\n\n // Cache uids\n if (!visitorId) {\n visitorId = createVisitor(env);\n window.localStorage?.setItem?.('vouch-uid-visitor', visitorId);\n }\n\n if (!clientId) {\n clientId = uuidv4();\n window.localStorage?.setItem?.('vouch-uid-client', clientId);\n }\n\n if (!tabId) {\n tabId = uuidv4();\n window.sessionStorage?.setItem?.('vouch-uid-tab', tabId);\n }\n\n return {\n client: clientId,\n tab: tabId,\n request: requestId,\n visitor: visitorId\n };\n}\n\nfunction findVouchId(payload?: TrackingPayload, vouch?: Vouch) {\n if (payload && 'vouchId' in payload) {\n return payload.vouchId;\n }\n return vouch?.id ?? null;\n}\n\nfunction getReportingMetadata(source = 'embedded_player') {\n const [country, region] = Intl.DateTimeFormat().resolvedOptions().timeZone?.split?.('/') ?? [];\n\n const utmParams: any = {};\n [...new URLSearchParams(location.search).entries()].forEach(([key, value]) => {\n if (/utm/.test(key)) {\n const param = key.toLowerCase().replace(/[-_][a-z0-9]/g, (group) => group.slice(-1).toUpperCase());\n utmParams[param] = value;\n }\n });\n\n return {\n source,\n time: new Date(),\n region,\n country,\n screenHeight: window.screen.height,\n screenWidth: window.screen.width,\n referrer: document.referrer,\n currentUrl: location.href,\n embedType: 'media-player-embed',\n embedVersion: packageJson.version,\n templateVersion: TEMPLATE_VERSION,\n ...utmParams\n };\n}\n\nexport { getUids, findVouchId, getReportingMetadata };\n","import type { PlayerEmbed } from '../..';\nimport type { VideoEventDetail } from '@vouchfor/media-player';\nimport type { ReactiveController, ReactiveControllerHost } from 'lit';\n\nimport { findVouchId, getReportingMetadata, getUids } from './utils';\nimport { getEnvUrls } from '~/utils/env';\n\nconst MINIMUM_SEND_THRESHOLD = 1;\n\ntype PlayerEmbedHost = ReactiveControllerHost & PlayerEmbed;\n\ntype TrackingEvent = 'VOUCH_LOADED' | 'VOUCH_RESPONSE_VIEWED' | 'VIDEO_PLAYED' | 'VIDEO_STREAMED';\ntype TrackingPayload = {\n vouchId?: string;\n answerId?: string;\n streamStart?: number;\n streamEnd?: number;\n};\n\ntype BatchEvent = {\n event: TrackingEvent;\n payload: TrackingPayload & {\n time: string;\n };\n};\n\ntype TimeMap = {\n [key: string]: number;\n};\n\ntype BooleanMap = {\n [key: string]: boolean;\n};\n\nclass TrackingController implements ReactiveController {\n host: PlayerEmbedHost;\n\n private _batchedEvents: BatchEvent[] = [];\n private _hasPlayed = false;\n private _hasLoaded: BooleanMap = {};\n private _answersViewed: BooleanMap = {};\n private _streamStartTime: TimeMap = {};\n private _streamLatestTime: TimeMap = {};\n private _currentlyPlayingVideo: VideoEventDetail | null = null;\n\n constructor(host: PlayerEmbedHost) {\n this.host = host;\n host.addController(this);\n }\n\n private _createTrackingEvent = (event: TrackingEvent, payload?: TrackingPayload) => {\n const vouchId = findVouchId(payload, this.host.vouch);\n\n if (!vouchId || this.host.disableTracking) {\n return;\n }\n\n this._batchedEvents.push({\n event,\n payload: {\n ...payload,\n vouchId,\n time: new Date().toISOString()\n }\n });\n };\n\n private _sendTrackingEvent = () => {\n if (this._batchedEvents.length <= 0) {\n return;\n }\n\n const { publicApiUrl } = getEnvUrls(this.host.env);\n const { client, tab, request, visitor } = getUids(this.host.env);\n\n navigator.sendBeacon(\n `${publicApiUrl}/api/batchevents`,\n JSON.stringify({\n payload: {\n events: this._batchedEvents\n },\n context: {\n 'x-uid-client': client,\n 'x-uid-tab': tab,\n 'x-uid-request': request,\n 'x-uid-visitor': visitor,\n 'x-reporting-metadata': getReportingMetadata(this.host.trackingSource)\n }\n })\n );\n\n this._batchedEvents = [];\n };\n\n private _streamEnded = () => {\n if (this._currentlyPlayingVideo) {\n const { id, key } = this._currentlyPlayingVideo;\n // Don't send a tracking event when seeking backwards\n if (this._streamLatestTime[key] > this._streamStartTime[key] + MINIMUM_SEND_THRESHOLD) {\n // Send a video streamed event any time the stream ends to capture the time between starting\n // the video and the video stopping for any reason (pausing, deleting the embed node or closing the browser)\n this._createTrackingEvent('VIDEO_STREAMED', {\n answerId: id,\n streamStart: this._streamStartTime[key],\n streamEnd: this._streamLatestTime[key]\n });\n }\n\n // Make sure these events are only sent once by deleting the start and latest times\n delete this._streamStartTime[key];\n delete this._streamLatestTime[key];\n }\n };\n\n private _handleVouchLoaded = ({ detail: vouchId }: CustomEvent<string>) => {\n if (!vouchId) {\n return;\n }\n\n // Only send loaded event once per session\n if (!this._hasLoaded[vouchId]) {\n this._createTrackingEvent('VOUCH_LOADED', { vouchId });\n this._hasLoaded[vouchId] = true;\n }\n };\n\n private _handlePlay = () => {\n // Only send the video played event once per session\n if (!this._hasPlayed) {\n this._createTrackingEvent('VIDEO_PLAYED', {\n streamStart: this.host.currentTime\n });\n this._hasPlayed = true;\n }\n };\n\n private _handleVideoPlay = ({ detail: { id, key } }: CustomEvent<VideoEventDetail>) => {\n // Only increment play count once per session\n if (!this._answersViewed[key]) {\n this._createTrackingEvent('VOUCH_RESPONSE_VIEWED', {\n answerId: id\n });\n this._answersViewed[key] = true;\n }\n };\n\n private _handleVideoTimeUpdate = ({ detail: { id, key, node } }: CustomEvent<VideoEventDetail>) => {\n if (\n // We only want to count any time that the video is actually playing\n !this.host.paused &&\n // Only update the latest time if this event fires for the currently active video\n id === this.host.scene?.video?.id\n ) {\n this._currentlyPlayingVideo = { id, key, node };\n this._streamLatestTime[key] = node.currentTime;\n\n if (!this._streamStartTime[key]) {\n this._streamStartTime[key] = node.currentTime;\n this._streamLatestTime[key] = node.currentTime;\n }\n }\n };\n\n private _handleVideoPause = ({ detail: { id, key } }: CustomEvent<VideoEventDetail>) => {\n if (this._streamLatestTime[key] > this._streamStartTime[key] + MINIMUM_SEND_THRESHOLD) {\n this._createTrackingEvent('VIDEO_STREAMED', {\n answerId: id,\n streamStart: this._streamStartTime[key],\n streamEnd: this._streamLatestTime[key]\n });\n }\n delete this._streamStartTime[key];\n delete this._streamLatestTime[key];\n };\n\n private _pageUnloading = () => {\n this._streamEnded();\n this._sendTrackingEvent();\n };\n\n private _handleVisibilityChange = () => {\n if (document.visibilityState === 'hidden') {\n this._pageUnloading();\n }\n };\n\n private _handlePageHide = () => {\n this._pageUnloading();\n };\n\n hostConnected() {\n requestAnimationFrame(() => {\n if ('onvisibilitychange' in document) {\n document.addEventListener('visibilitychange', this._handleVisibilityChange);\n } else {\n window.addEventListener('pagehide', this._handlePageHide);\n }\n this.host.addEventListener('vouch:loaded', this._handleVouchLoaded);\n this.host.mediaPlayer?.addEventListener('play', this._handlePlay);\n this.host.mediaPlayer?.addEventListener('video:play', this._handleVideoPlay);\n this.host.mediaPlayer?.addEventListener('video:pause', this._handleVideoPause);\n this.host.mediaPlayer?.addEventListener('video:timeupdate', this._handleVideoTimeUpdate);\n });\n }\n\n hostDisconnected() {\n // Send events if DOM node is destroyed\n this._pageUnloading();\n\n if ('onvisibilitychange' in document) {\n document.removeEventListener('visibilitychange', this._handleVisibilityChange);\n } else {\n window.removeEventListener('pagehide', this._handlePageHide);\n }\n this.host.removeEventListener('vouch:loaded', this._handleVouchLoaded);\n this.host.mediaPlayer?.removeEventListener('play', this._handlePlay);\n this.host.mediaPlayer?.removeEventListener('video:play', this._handleVideoPlay);\n this.host.mediaPlayer?.removeEventListener('video:pause', this._handleVideoPause);\n this.host.mediaPlayer?.removeEventListener('video:timeupdate', this._handleVideoTimeUpdate);\n }\n}\n\nexport { TrackingController };\nexport type { TrackingEvent, TrackingPayload };\n","import { css, html, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { createRef, ref } from 'lit/directives/ref.js';\n\nimport type { Scene, Scenes, TemplateInstance } from '@vouchfor/canvas-video';\nimport type { MediaPlayer, MediaPlayerProps } from '@vouchfor/media-player';\nimport type { Environment } from '~/utils/env';\n\nimport { EventForwardController } from './controllers/event-forwarder';\nimport { FetcherController } from './controllers/fetcher';\nimport { TrackingController } from './controllers/tracking';\n\nimport '@vouchfor/media-player';\n\ntype PlayerEmbedProps = Pick<\n MediaPlayerProps,\n 'data' | 'aspectRatio' | 'language' | 'preload' | 'autoplay' | 'controls'\n> & {\n env: Environment;\n apiKey: string;\n disableTracking?: boolean;\n trackingSource?: string;\n vouchId?: string;\n templateId?: string;\n // Index of the questions to include starting from 1\n questions?: number[];\n};\n\n@customElement('vouch-embed-player')\nclass PlayerEmbed extends LitElement {\n static styles = [\n css`\n :host {\n display: flex;\n }\n `\n ];\n\n @property({ type: Object }) data: PlayerEmbedProps['data'];\n @property({ type: String }) vouchId: PlayerEmbedProps['vouchId'];\n @property({ type: String }) templateId: PlayerEmbedProps['templateId'];\n @property({ type: Array }) questions: PlayerEmbedProps['questions'];\n\n @property({ type: String }) env: PlayerEmbedProps['env'] = 'prod';\n @property({ type: String }) apiKey: PlayerEmbedProps['apiKey'] = '';\n @property({ type: Boolean }) disableTracking: PlayerEmbedProps['disableTracking'] = false;\n @property({ type: String }) trackingSource: PlayerEmbedProps['trackingSource'] = 'embedded_player';\n\n @property({ type: Array }) controls: PlayerEmbedProps['controls'];\n @property({ type: String }) preload: PlayerEmbedProps['preload'] = 'auto';\n @property({ type: Boolean }) autoplay: PlayerEmbedProps['autoplay'] = false;\n @property({ type: Number }) aspectRatio: PlayerEmbedProps['aspectRatio'] = 0;\n @property({ type: String }) language?: MediaPlayerProps['language'];\n\n private eventController = new EventForwardController(this, [\n 'durationchange',\n 'ended',\n 'error',\n 'loadeddata',\n 'pause',\n 'stalled',\n 'play',\n 'playing',\n 'ratechange',\n 'scenechange',\n 'scenesupdate',\n 'seeking',\n 'seeked',\n 'timeupdate',\n 'volumechange',\n 'waiting',\n\n 'video:loadeddata',\n 'video:seeking',\n 'video:seeked',\n 'video:play',\n 'video:playing',\n 'video:pause',\n 'video:stalled',\n 'video:timeupdate',\n 'video:ended',\n 'video:error'\n ]);\n private _fetcherController = new FetcherController(this);\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n private _trackingController = new TrackingController(this);\n\n @state() vouch: PlayerEmbedProps['data'];\n @state() template: TemplateInstance | undefined;\n\n get fetching() {\n return this._fetcherController.fetching;\n }\n\n private _mediaPlayerRef = createRef<MediaPlayer>();\n\n get waiting() {\n return this._mediaPlayerRef.value?.waiting;\n }\n\n get initialised() {\n return this._mediaPlayerRef.value?.initialised;\n }\n\n get seeking() {\n return this._mediaPlayerRef.value?.seeking;\n }\n\n get paused() {\n return this._mediaPlayerRef.value?.paused;\n }\n\n get captions() {\n return this._mediaPlayerRef.value?.captions;\n }\n\n get fullscreen() {\n return this._mediaPlayerRef.value?.fullscreen;\n }\n\n get duration() {\n return this._mediaPlayerRef.value?.duration;\n }\n\n set currentTime(value: number) {\n if (this._mediaPlayerRef.value) {\n this._mediaPlayerRef.value.currentTime = value;\n }\n }\n get currentTime() {\n return this._mediaPlayerRef.value?.currentTime ?? 0;\n }\n\n set playbackRate(value: number) {\n if (this._mediaPlayerRef.value) {\n this._mediaPlayerRef.value.playbackRate = value;\n }\n }\n get playbackRate() {\n return this._mediaPlayerRef.value?.playbackRate ?? 1;\n }\n\n set volume(value: number) {\n if (this._mediaPlayerRef.value) {\n this._mediaPlayerRef.value.volume = value;\n }\n }\n get volume() {\n return this._mediaPlayerRef.value?.volume ?? 1;\n }\n\n set muted(value: boolean) {\n if (this._mediaPlayerRef.value) {\n this._mediaPlayerRef.value.muted = value;\n }\n }\n get muted() {\n return this._mediaPlayerRef.value?.muted ?? false;\n }\n\n get scene(): Scene | null {\n return this._mediaPlayerRef.value?.scene ?? null;\n }\n\n get scenes(): Scene[] {\n return this._mediaPlayerRef.value?.scenes ?? [];\n }\n\n get sceneConfig(): Scenes | null {\n return this._mediaPlayerRef.value?.sceneConfig ?? null;\n }\n\n get videoState() {\n return this._mediaPlayerRef.value?.videoState;\n }\n\n get mediaPlayer() {\n return this._mediaPlayerRef.value;\n }\n\n play() {\n this._mediaPlayerRef.value?.play();\n }\n\n pause() {\n this._mediaPlayerRef.value?.pause();\n }\n\n reset(time = 0, play = false) {\n this._mediaPlayerRef.value?.reset(time, play);\n }\n\n setScene(index: number) {\n this._mediaPlayerRef.value?.setScene(index);\n }\n\n private _renderStyles() {\n if (!this.aspectRatio) {\n return html`\n <style>\n :host {\n width: 100%;\n height: 100%;\n }\n </style>\n `;\n }\n\n if (typeof this.aspectRatio === 'number') {\n return html`\n <style>\n :host {\n aspect-ratio: ${this.aspectRatio};\n }\n </style>\n `;\n }\n\n return null;\n }\n\n render() {\n return html`\n ${this._renderStyles()}\n <vmp-media-player\n ${ref(this._mediaPlayerRef)}\n ${this.eventController.register()}\n ?autoplay=${this.autoplay}\n ?loading=${this.fetching}\n .data=${this.vouch}\n .template=${this.template}\n aspectRatio=${ifDefined(this.aspectRatio)}\n preload=${ifDefined(this.preload)}\n language=${ifDefined(this.language)}\n .controls=${this.controls}\n ></vmp-media-player>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vouch-embed-player': PlayerEmbed;\n }\n\n namespace JSX {\n interface IntrinsicElements {\n 'vouch-embed-player': PlayerEmbed;\n }\n }\n}\n\nexport { PlayerEmbed };\nexport type { PlayerEmbedProps };\n","import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { classMap } from 'lit/directives/class-map.js';\nimport { styleMap } from 'lit/directives/style-map.js';\n\nimport type { DialogEmbedProps } from '.';\n\nimport '@a11y/focus-trap';\n\n@customElement('vouch-embed-dialog-overlay')\nclass DialogOverlay extends LitElement {\n static styles = [\n css`\n :host {\n --vouch-media-player-border-radius: var(--vu-media-player-border-radius, 12px);\n --overlay-background-color: var(--vu-overlay-background-color, black);\n --overlay-background-opacity: var(--vu-overlay-background-opacity, 0.4);\n\n --dialog-width: var(--vu-dialog-width, 890px);\n --dialog-height: var(--vu-dialog-height, 500px);\n }\n\n .container {\n position: fixed;\n display: flex;\n inset: 0;\n opacity: 1;\n z-index: 2147483647;\n align-items: center;\n justify-content: center;\n transition: opacity 100ms ease-in;\n }\n\n .hidden {\n opacity: 0;\n pointer-events: none;\n }\n\n .background {\n position: absolute;\n inset: 0;\n opacity: var(--overlay-background-opacity);\n background-color: var(--overlay-background-color);\n }\n\n focus-trap {\n display: flex;\n align-items: center;\n justify-content: center;\n margin: 40px;\n width: var(--dialog-width);\n height: var(--dialog-height);\n max-width: calc(100% - 80px);\n max-height: calc(100% - 80px);\n }\n\n .video-frame {\n position: relative;\n display: flex;\n align-items: center;\n justify-content: center;\n max-width: 100%;\n max-height: 100%;\n }\n\n .video-frame.grow {\n width: 100%;\n height: 100%;\n }\n\n vmp-icon-button {\n position: absolute;\n top: 0;\n right: 0;\n margin: 10px;\n }\n `\n ];\n\n @property({ type: Boolean }) open = false;\n @property({ type: Number }) aspectRatio: DialogEmbedProps['aspectRatio'] = 0;\n\n render() {\n return html`\n <div\n class=${classMap({\n container: true,\n hidden: !this.open\n })}\n >\n <div\n class=\"background\"\n @click=${() => this.dispatchEvent(new CustomEvent('overlay:click', { bubbles: true, composed: true }))}\n ></div>\n <focus-trap>\n <div\n class=${classMap({\n 'video-frame': true,\n grow: this.aspectRatio === 0\n })}\n style=${styleMap({\n aspectRatio: this.aspectRatio\n })}\n >\n <slot></slot>\n <vmp-icon-button\n icon=\"close\"\n rounded=\"full\"\n weight=\"heavy\"\n @click=${() => this.dispatchEvent(new CustomEvent('close:click', { bubbles: true, composed: true }))}\n ></vmp-icon-button>\n </div>\n </focus-trap>\n </div>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vouch-embed-dialog-overlay': DialogOverlay;\n }\n\n namespace JSX {\n interface IntrinsicElements {\n 'vouch-embed-dialog-overlay': DialogOverlay;\n }\n }\n}\n\nexport { DialogOverlay };\n","import { html, LitElement } from 'lit';\nimport { customElement, property, state } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { createRef, ref } from 'lit/directives/ref.js';\nimport { styleMap } from 'lit/directives/style-map.js';\n\nimport type { DialogEmbedProps } from '.';\nimport type { MediaPlayer } from '@vouchfor/media-player';\n\nimport './DialogOverlay';\n\n@customElement('vouch-embed-dialog-portal')\nclass DialogPortal extends LitElement {\n @property({ type: String }) vouchId: DialogEmbedProps['vouchId'];\n @property({ type: String }) templateId: DialogEmbedProps['templateId'];\n @property({ type: Array }) questions: DialogEmbedProps['questions'];\n\n @property({ type: String }) env: DialogEmbedProps['env'] = 'prod';\n @property({ type: String }) apiKey: DialogEmbedProps['apiKey'] = '';\n @property({ type: Boolean }) disableTracking: DialogEmbedProps['disableTracking'] = false;\n @property({ type: String }) trackingSource: DialogEmbedProps['trackingSource'] = 'embedded_player';\n\n @property({ type: Array }) controls: DialogEmbedProps['controls'];\n @property({ type: String }) preload: DialogEmbedProps['preload'] = 'none';\n @property({ type: Boolean }) disableAutoplay: DialogEmbedProps['disableAutoplay'] = false;\n @property({ type: Number }) aspectRatio: DialogEmbedProps['aspectRatio'] = 0;\n\n private _mediaPlayerRef = createRef<MediaPlayer>();\n\n @state() open = false;\n\n private _handleToggle = ({ detail }: CustomEvent<string>) => {\n // Because we have to attach this listener to the document since this element is portalled outside of the button,\n // we also have to make sure that this player is actually the one we want to open and play by passing in an ID\n // from the button wrapper parent and checking against that same ID we pass as the event detail\n if (this.id === detail) {\n this.open = !this.open;\n\n if (this.open) {\n if (!this.disableAutoplay && this._mediaPlayerRef?.value) {\n this._mediaPlayerRef.value.muted = false;\n this._mediaPlayerRef.value.play();\n }\n } else {\n this._mediaPlayerRef?.value?.pause();\n }\n }\n };\n\n // We could do the same thing on close and check for the correct ID but it doesn't really matter\n private _handleClose = () => {\n this.open = false;\n this._mediaPlayerRef?.value?.pause();\n };\n\n private _handleDocumentKeyUp = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n this._handleClose();\n }\n };\n\n connectedCallback(): void {\n super.connectedCallback();\n document.addEventListener('dialogembed:click', this._handleToggle);\n document.addEventListener('keyup', this._handleDocumentKeyUp);\n document.addEventListener('close:click', this._handleClose);\n document.addEventListener('overlay:click', this._handleClose);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n document.removeEventListener('dialogembed:click', this._handleToggle);\n document.removeEventListener('keyup', this._handleDocumentKeyUp);\n document.removeEventListener('close:click', this._handleClose);\n document.removeEventListener('overlay:click', this._handleClose);\n }\n\n protected createRenderRoot(): HTMLElement | DocumentFragment {\n // We must create a new node here because portalling into the same node (document.body) causes the second\n // element to overwrite the first for some reason (not behaviour really stated in the docs)\n // I am fairly certain this function is only run once as the default behaviour creates the open shadow root\n // and returns that shadow root in this function: https://lit.dev/docs/components/shadow-dom/#implementing-createrenderroot\n const newNode = document.createElement('div');\n document.body.appendChild(newNode);\n return newNode;\n }\n\n render() {\n return html`\n <vouch-embed-dialog-overlay ?open=${this.open} aspectRatio=${this.aspectRatio}>\n <vouch-embed-player\n ${ref(this._mediaPlayerRef)}\n style=${styleMap({\n maxWidth: '100%',\n maxHeight: '100%'\n })}\n ?autoplay=${false}\n vouchId=${ifDefined(this.vouchId)}\n templateId=${ifDefined(this.templateId)}\n .questions=${this.questions}\n .controls=${this.controls}\n env=${ifDefined(this.env)}\n apiKey=${ifDefined(this.apiKey)}\n ?disableTracking=${this.disableTracking}\n trackingSource=${ifDefined(this.trackingSource)}\n preload=${ifDefined(this.preload)}\n aspectRatio=${this.aspectRatio}\n ></vouch-embed-player>\n </vouch-embed-dialog-overlay>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vouch-embed-dialog-portal': DialogPortal;\n }\n\n namespace JSX {\n interface IntrinsicElements {\n 'vouch-embed-dialog-portal': DialogPortal;\n }\n }\n}\n\nexport { DialogPortal };\n","import { css, html, LitElement } from 'lit';\nimport { customElement, property } from 'lit/decorators.js';\nimport { ifDefined } from 'lit/directives/if-defined.js';\nimport { v4 as uuidv4 } from 'uuid';\n\nimport type { PlayerEmbedProps } from '../PlayerEmbed';\n\nimport '../PlayerEmbed';\nimport './DialogPortal';\n\ntype DialogEmbedProps = Omit<PlayerEmbedProps, 'data'> & {\n disableAutoplay?: boolean;\n};\n\n@customElement('vouch-embed-dialog')\nclass DialogEmbed extends LitElement {\n static styles = [\n css`\n :host {\n --vu-button-padding: 10px 20px;\n --vu-button-background: #287179;\n --vu-button-background-hover: #4faab2;\n\n display: flex;\n width: fit-content;\n height: fit-content;\n }\n `\n ];\n\n @property({ type: String }) vouchId: DialogEmbedProps['vouchId'];\n @property({ type: String }) templateId: DialogEmbedProps['templateId'];\n @property({ type: Array }) questions: DialogEmbedProps['questions'];\n\n @property({ type: String }) env: DialogEmbedProps['env'] = 'prod';\n @property({ type: String }) apiKey: DialogEmbedProps['apiKey'] = '';\n @property({ type: Boolean }) disableTracking: DialogEmbedProps['disableTracking'] = false;\n @property({ type: String }) trackingSource: DialogEmbedProps['trackingSource'] = 'embedded_player';\n\n @property({ type: Array }) controls: DialogEmbedProps['controls'];\n @property({ type: String }) preload: DialogEmbedProps['preload'] = 'none';\n @property({ type: Boolean }) disableAutoplay: DialogEmbedProps['disableAutoplay'] = false;\n @property({ type: Number }) aspectRatio: DialogEmbedProps['aspectRatio'] = 0;\n\n private _id = uuidv4();\n\n private _handleRootClick = () => {\n this.dispatchEvent(new CustomEvent('dialogembed:click', { detail: this._id, bubbles: true, composed: true }));\n };\n\n connectedCallback(): void {\n super.connectedCallback();\n this.addEventListener('click', this._handleRootClick);\n }\n\n disconnectedCallback(): void {\n super.disconnectedCallback();\n this.removeEventListener('click', this._handleRootClick);\n }\n\n render() {\n return html`\n <slot>\n <vmp-button size=\"large\">Play</vmp-button>\n </slot>\n <vouch-embed-dialog-portal\n id=${this._id}\n ?autoplay=${false}\n vouchId=${ifDefined(this.vouchId)}\n templateId=${ifDefined(this.templateId)}\n .questions=${this.questions}\n .controls=${this.controls}\n env=${ifDefined(this.env)}\n apiKey=${ifDefined(this.apiKey)}\n ?disableTracking=${this.disableTracking}\n trackingSource=${ifDefined(this.trackingSource)}\n preload=${ifDefined(this.preload)}\n aspectRatio=${this.aspectRatio}\n ></vouch-embed-dialog-portal>\n `;\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'vouch-embed-dialog': DialogEmbed;\n }\n\n namespace JSX {\n interface IntrinsicElements {\n 'vouch-embed-dialog': DialogEmbed;\n }\n }\n}\n\nexport { DialogEmbed };\nexport type { DialogEmbedProps };\n"],"names":["type","uuidv4","__decorateClass"],"mappings":";;;;;;;;;;;AAAA,SAAS,aAAaA,OAAc,aAA0B,WAAwB;AACpF,WAAS,UAAU,OAAc;AAC/B,cAAU,cAAc,IAAI,YAAY,MAAM,MAAM,KAAK,CAAC;AAAA,EAC5D;AAEY,cAAA,iBAAiBA,OAAM,SAAS;AAE5C,SAAO,MAAM;AACC,gBAAA,oBAAoBA,OAAM,SAAS;AAAA,EAAA;AAEnD;ACCA,MAAM,uBAAqD;AAAA,EAOzD,YAAY,MAAuB,QAAkB;AAJrD,SAAQ,UAAoB;AAC5B,SAAQ,WAA2B;AACnC,SAAQ,qBAAuC;AAG7C,SAAK,OAAO;AACZ,SAAK,UAAU;AACf,SAAK,cAAc,IAAI;AAAA,EACzB;AAAA,EAEA,WAA4B;AACnB,WAAA,IAAI,KAAK,kBAAkB;AAAA,EACpC;AAAA,EAEA,gBAAgB;AAEd,0BAAsB,MAAM;AACrB,WAAA,QAAQ,QAAQ,CAAC,UAAU;AAC1B,YAAA,KAAK,mBAAmB,OAAO;AAC5B,eAAA,SAAS,KAAK,aAAa,OAAO,KAAK,mBAAmB,OAAO,KAAK,IAAI,CAAC;AAAA,QAClF;AAAA,MAAA,CACD;AAAA,IAAA,CACF;AAAA,EACH;AAAA,EAEA,mBAAmB;AACZ,SAAA,SAAS,QAAQ,CAAC,OAAO;AACzB;IAAA,CACJ;AACD,SAAK,WAAW;EAClB;AACF;ACrCA,MAAM,cAAc;AACpB,MAAM,kBAAkB;AACxB,MAAM,eAAe;AAErB,MAAM,kBAAkB;AACxB,MAAM,sBAAsB;AAC5B,MAAM,mBAAmB;AAEzB,MAAM,mBAAmB;AACzB,MAAM,iBAAiB;AACvB,MAAM,qBAAqB;AAC3B,MAAM,kBAAkB;AAKxB,SAAS,WAAW,KAAoC;AAClD,MAAA,CAAC,CAAC,SAAS,OAAO,WAAW,MAAM,EAAE,SAAS,GAAG,GAAG;AACtD,UAAM,IAAI,MAAM,wBAAwB,GAAG,EAAE;AAAA,EAC/C;AAEA,MAAI,QAAQ,SAAS;AACZ,WAAA;AAAA,MACL,UAAU;AAAA,MACV,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,EAEjB;AAEA,MAAI,QAAQ,OAAO;AACV,WAAA;AAAA,MACL,UAAU;AAAA,MACV,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,EAEjB;AAEA,MAAI,QAAQ,WAAW;AACd,WAAA;AAAA,MACL,UAAU;AAAA,MACV,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,EAEjB;AAEA,MAAI,QAAQ,QAAQ;AACX,WAAA;AAAA,MACL,UAAU;AAAA,MACV,cAAc;AAAA,MACd,aAAa;AAAA,IAAA;AAAA,EAEjB;AACF;ACvCA,MAAM,kBAAkB;AAAA,EA8EtB,YAAY,MAAuB;AA3EnC,SAAQ,YAAY;AAapB,SAAQ,WAAW,OAAO,KAAkB,QAAgB,YAAoB;;AAC9E,YAAM,EAAE,YAAA,IAAgB,WAAW,GAAG;AAEtC,YAAM,aAAaC;AACnB,YAAM,MAAM,MAAM,MAAM,GAAG,WAAW,YAAY,OAAO,IAAI;AAAA,QAC3D,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,CAAC,aAAa,MAAM;AAAA,UACpB,CAAC,iBAAiB,UAAU;AAAA,QAC9B;AAAA,MAAA,CACD;AAEK,YAAA,QAAQ,MAAM,IAAI;AACnB,WAAA,KAAK,cAAc,IAAI,YAAY,gBAAgB,EAAE,QAAQ,+BAAO,GAAI,CAAA,CAAC;AAK9E,YAAM,iBAAgB,gCAAK,YAAL,mBAAc,IAAI;AACxC,UAAI,kBAAkB,YAAY;AAChC,cAAM,GAAG,WAAW,YAAY,OAAO,IAAI;AAAA,UACzC,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,CAAC,aAAa,MAAM;AAAA,YACpB,CAAC,iBAAiB,WAAW;AAAA,UAC/B;AAAA,QAAA,CACD;AAAA,MACH;AAEO,aAAA;AAAA,IAAA;AAGT,SAAQ,cAAc,OAAO,KAAkB,QAAgB,eAAuB;;AACpF,YAAM,EAAE,YAAA,IAAgB,WAAW,GAAG;AAEtC,YAAM,aAAaA;AACnB,YAAM,MAAM,MAAM,MAAM,GAAG,WAAW,cAAc,UAAU,IAAI;AAAA,QAChE,QAAQ;AAAA,QACR,SAAS;AAAA,UACP,CAAC,aAAa,MAAM;AAAA,UACpB,CAAC,iBAAiB,UAAU;AAAA,QAC9B;AAAA,MAAA,CACD;AACK,YAAA,WAAW,MAAM,IAAI;AAK3B,YAAM,iBAAgB,gCAAK,YAAL,mBAAc,IAAI;AACxC,UAAI,kBAAkB,YAAY;AAChC,cAAM,GAAG,WAAW,cAAc,UAAU,IAAI;AAAA,UAC9C,QAAQ;AAAA,UACR,SAAS;AAAA,YACP,CAAC,aAAa,MAAM;AAAA,YACpB,CAAC,iBAAiB,WAAW;AAAA,UAC/B;AAAA,QAAA,CACD;AAAA,MACH;AAEO,aAAA;AAAA,IAAA;AAIP,SAAK,OAAO;AACR,QAAA;AAAA,MACF,KAAK;AAAA,MACL,OAAO,CAAC,KAAK,QAAQ,MAAM,SAAS,UAAU,MAAqB;;AAC7D,YAAA;AACF,eAAK,QAAQ;AACb,eAAK,WAAW;AAEhB,cAAI,MAAM;AACJ,gBAAA;AACJ,gBAAI,YAAY;AACd,mBAAK,WAAW;AAChB,yBAAW,MAAM,KAAK,YAAY,KAAK,QAAQ,UAAU;AAAA,YAC3D;AACA,iBAAK,SAAS;AACd,iBAAK,WAAW,cAAY,wCAAM,aAAN,mBAAgB,aAAhB,mBAA0B;AAAA,qBAC7C,SAAS;AAClB,iBAAK,WAAW;AAEhB,kBAAM,CAAC,OAAO,QAAQ,IAAI,MAAM,QAAQ,IAAI;AAAA,cAC1C,KAAK,SAAS,KAAK,QAAQ,OAAO;AAAA,cAClC,aAAa,KAAK,YAAY,KAAK,QAAQ,UAAU,IAAI;AAAA,YAAA,CAC1D;AACD,iBAAK,SAAS;AACd,iBAAK,WAAW,cAAY,0CAAO,aAAP,mBAAiB,aAAjB,mBAA2B;AAAA,UACzD;AAAA,QAAA,UACA;AACA,eAAK,WAAW;AAAA,QAClB;AAAA,MACF;AAAA,MACA,MAAM,CAAC,KAAK,KAAK,KAAK,QAAQ,KAAK,MAAM,KAAK,SAAS,KAAK,UAAU;AAAA,IAAA;AAIpE,QAAA;AAAA,MACF,KAAK;AAAA,MACL,CAAC,CAAC,OAAO,SAAS,MAAsB;AACtC,aAAK,QAAQ,QACT;AAAA,UACE,GAAG;AAAA,UACH,WAAW;AAAA,YACT,OAAO,+BAAO,UAAU,MAAM,OAAO,CAAC,GAAG,UAAU,EAAC,uCAAW,YAAU,uCAAW,SAAS,QAAQ;AAAA,UACvG;AAAA,QAEF,IAAA;AAAA,MACN;AAAA,MACA,MAAM,CAAC,KAAK,QAAQ,KAAK,SAAS;AAAA,IAAA;AAAA,EAEtC;AAAA,EAzHA,IAAI,SAAS,OAAO;AACd,QAAA,KAAK,cAAc,OAAO;AAC5B,WAAK,YAAY;AACjB,WAAK,KAAK;IACZ;AAAA,EACF;AAAA,EACA,IAAI,WAAW;AACb,WAAO,KAAK;AAAA,EACd;AAkHF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC3IA,SAAS,cAAc,KAAkB;AACvC,QAAM,EAAE,aAAA,IAAiB,WAAW,GAAG;AACvC,QAAM,YAAYA;AACR,YAAA,WAAW,GAAG,YAAY,gBAAgB,KAAK,UAAU,EAAE,UAAW,CAAA,CAAC;AAC1E,SAAA;AACT;AAEA,SAAS,QAAQ,KAAkB;;AAC7B,MAAA,OAAO,WAAW,aAAa;AAC1B,WAAA;AAAA,MACL,QAAQ;AAAA,MACR,KAAK;AAAA,MACL,SAASA,GAAO;AAAA,IAAA;AAAA,EAEpB;AAGA,MAAI,aAAY,kBAAO,iBAAP,mBAAqB,YAArB,4BAA+B;AAE/C,MAAI,YAAW,kBAAO,iBAAP,mBAAqB,YAArB,4BAA+B;AAE9C,MAAI,SAAQ,kBAAO,mBAAP,mBAAuB,YAAvB,4BAAiC;AAG7C,QAAM,YAAYA;AAGlB,MAAI,CAAC,WAAW;AACd,gBAAY,cAAc,GAAG;AACtB,uBAAA,iBAAA,mBAAc,YAAd,4BAAwB,qBAAqB;AAAA,EACtD;AAEA,MAAI,CAAC,UAAU;AACb,eAAWA,GAAO;AACX,uBAAA,iBAAA,mBAAc,YAAd,4BAAwB,oBAAoB;AAAA,EACrD;AAEA,MAAI,CAAC,OAAO;AACV,YAAQA,GAAO;AACR,uBAAA,mBAAA,mBAAgB,YAAhB,4BAA0B,iBAAiB;AAAA,EACpD;AAEO,SAAA;AAAA,IACL,QAAQ;AAAA,IACR,KAAK;AAAA,IACL,SAAS;AAAA,IACT,SAAS;AAAA,EAAA;AAEb;AAEA,SAAS,YAAY,SAA2B,OAAe;AACzD,MAAA,WAAW,aAAa,SAAS;AACnC,WAAO,QAAQ;AAAA,EACjB;AACA,UAAO,+BAAO,OAAM;AACtB;AAEA,SAAS,qBAAqB,SAAS,mBAAmB;;AACxD,QAAM,CAAC,SAAS,MAAM,MAAI,gBAAK,eAAA,EAAiB,gBAAA,EAAkB,aAAxC,mBAAkD,UAAlD,4BAA0D,SAAQ,CAAA;AAE5F,QAAM,YAAiB,CAAA;AACvB,GAAC,GAAG,IAAI,gBAAgB,SAAS,MAAM,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AACxE,QAAA,MAAM,KAAK,GAAG,GAAG;AACnB,YAAM,QAAQ,IAAI,YAAY,EAAE,QAAQ,iBAAiB,CAAC,UAAU,MAAM,MAAM,EAAE,EAAE,YAAa,CAAA;AACjG,gBAAU,KAAK,IAAI;AAAA,IACrB;AAAA,EAAA,CACD;AAEM,SAAA;AAAA,IACL;AAAA,IACA,0BAAU,KAAK;AAAA,IACf;AAAA,IACA;AAAA,IACA,cAAc,OAAO,OAAO;AAAA,IAC5B,aAAa,OAAO,OAAO;AAAA,IAC3B,UAAU,SAAS;AAAA,IACnB,YAAY,SAAS;AAAA,IACrB,WAAW;AAAA,IACX,cAAc,YAAY;AAAA,IAC1B,iBAAiB;AAAA,IACjB,GAAG;AAAA,EAAA;AAEP;ACrFA,MAAM,yBAAyB;AA2B/B,MAAM,mBAAiD;AAAA,EAWrD,YAAY,MAAuB;AARnC,SAAQ,iBAA+B;AACvC,SAAQ,aAAa;AACrB,SAAQ,aAAyB;AACjC,SAAQ,iBAA6B;AACrC,SAAQ,mBAA4B;AACpC,SAAQ,oBAA6B;AACrC,SAAQ,yBAAkD;AAOlD,SAAA,uBAAuB,CAAC,OAAsB,YAA8B;AAClF,YAAM,UAAU,YAAY,SAAS,KAAK,KAAK,KAAK;AAEpD,UAAI,CAAC,WAAW,KAAK,KAAK,iBAAiB;AACzC;AAAA,MACF;AAEA,WAAK,eAAe,KAAK;AAAA,QACvB;AAAA,QACA,SAAS;AAAA,UACP,GAAG;AAAA,UACH;AAAA,UACA,OAAM,oBAAI,KAAK,GAAE,YAAY;AAAA,QAC/B;AAAA,MAAA,CACD;AAAA,IAAA;AAGH,SAAQ,qBAAqB,MAAM;AAC7B,UAAA,KAAK,eAAe,UAAU,GAAG;AACnC;AAAA,MACF;AAEA,YAAM,EAAE,aAAa,IAAI,WAAW,KAAK,KAAK,GAAG;AAC3C,YAAA,EAAE,QAAQ,KAAK,SAAS,YAAY,QAAQ,KAAK,KAAK,GAAG;AAErD,gBAAA;AAAA,QACR,GAAG,YAAY;AAAA,QACf,KAAK,UAAU;AAAA,UACb,SAAS;AAAA,YACP,QAAQ,KAAK;AAAA,UACf;AAAA,UACA,SAAS;AAAA,YACP,gBAAgB;AAAA,YAChB,aAAa;AAAA,YACb,iBAAiB;AAAA,YACjB,iBAAiB;AAAA,YACjB,wBAAwB,qBAAqB,KAAK,KAAK,cAAc;AAAA,UACvE;AAAA,QAAA,CACD;AAAA,MAAA;AAGH,WAAK,iBAAiB;IAAC;AAGzB,SAAQ,eAAe,MAAM;AAC3B,UAAI,KAAK,wBAAwB;AAC/B,cAAM,EAAE,IAAI,QAAQ,KAAK;AAErB,YAAA,KAAK,kBAAkB,GAAG,IAAI,KAAK,iBAAiB,GAAG,IAAI,wBAAwB;AAGrF,eAAK,qBAAqB,kBAAkB;AAAA,YAC1C,UAAU;AAAA,YACV,aAAa,KAAK,iBAAiB,GAAG;AAAA,YACtC,WAAW,KAAK,kBAAkB,GAAG;AAAA,UAAA,CACtC;AAAA,QACH;AAGO,eAAA,KAAK,iBAAiB,GAAG;AACzB,eAAA,KAAK,kBAAkB,GAAG;AAAA,MACnC;AAAA,IAAA;AAGF,SAAQ,qBAAqB,CAAC,EAAE,QAAQ,cAAmC;AACzE,UAAI,CAAC,SAAS;AACZ;AAAA,MACF;AAGA,UAAI,CAAC,KAAK,WAAW,OAAO,GAAG;AAC7B,aAAK,qBAAqB,gBAAgB,EAAE,QAAS,CAAA;AAChD,aAAA,WAAW,OAAO,IAAI;AAAA,MAC7B;AAAA,IAAA;AAGF,SAAQ,cAAc,MAAM;AAEtB,UAAA,CAAC,KAAK,YAAY;AACpB,aAAK,qBAAqB,gBAAgB;AAAA,UACxC,aAAa,KAAK,KAAK;AAAA,QAAA,CACxB;AACD,aAAK,aAAa;AAAA,MACpB;AAAA,IAAA;AAGM,SAAA,mBAAmB,CAAC,EAAE,QAAQ,EAAE,IAAI,IAAA,QAA2C;AAErF,UAAI,CAAC,KAAK,eAAe,GAAG,GAAG;AAC7B,aAAK,qBAAqB,yBAAyB;AAAA,UACjD,UAAU;AAAA,QAAA,CACX;AACI,aAAA,eAAe,GAAG,IAAI;AAAA,MAC7B;AAAA,IAAA;AAGM,SAAA,yBAAyB,CAAC,EAAE,QAAQ,EAAE,IAAI,KAAK,KAAK,QAAuC;;AACjG;AAAA;AAAA,QAEE,CAAC,KAAK,KAAK;AAAA,QAEX,SAAO,gBAAK,KAAK,UAAV,mBAAiB,UAAjB,mBAAwB;AAAA,QAC/B;AACA,aAAK,yBAAyB,EAAE,IAAI,KAAK,KAAK;AACzC,aAAA,kBAAkB,GAAG,IAAI,KAAK;AAEnC,YAAI,CAAC,KAAK,iBAAiB,GAAG,GAAG;AAC1B,eAAA,iBAAiB,GAAG,IAAI,KAAK;AAC7B,eAAA,kBAAkB,GAAG,IAAI,KAAK;AAAA,QACrC;AAAA,MACF;AAAA,IAAA;AAGM,SAAA,oBAAoB,CAAC,EAAE,QAAQ,EAAE,IAAI,IAAA,QAA2C;AAClF,UAAA,KAAK,kBAAkB,GAAG,IAAI,KAAK,iBAAiB,GAAG,IAAI,wBAAwB;AACrF,aAAK,qBAAqB,kBAAkB;AAAA,UAC1C,UAAU;AAAA,UACV,aAAa,KAAK,iBAAiB,GAAG;AAAA,UACtC,WAAW,KAAK,kBAAkB,GAAG;AAAA,QAAA,CACtC;AAAA,MACH;AACO,aAAA,KAAK,iBAAiB,GAAG;AACzB,aAAA,KAAK,kBAAkB,GAAG;AAAA,IAAA;AAGnC,SAAQ,iBAAiB,MAAM;AAC7B,WAAK,aAAa;AAClB,WAAK,mBAAmB;AAAA,IAAA;AAG1B,SAAQ,0BAA0B,MAAM;AAClC,UAAA,SAAS,oBAAoB,UAAU;AACzC,aAAK,eAAe;AAAA,MACtB;AAAA,IAAA;AAGF,SAAQ,kBAAkB,MAAM;AAC9B,WAAK,eAAe;AAAA,IAAA;AA7IpB,SAAK,OAAO;AACZ,SAAK,cAAc,IAAI;AAAA,EACzB;AAAA,EA8IA,gBAAgB;AACd,0BAAsB,MAAM;;AAC1B,UAAI,wBAAwB,UAAU;AAC3B,iBAAA,iBAAiB,oBAAoB,KAAK,uBAAuB;AAAA,MAAA,OACrE;AACE,eAAA,iBAAiB,YAAY,KAAK,eAAe;AAAA,MAC1D;AACA,WAAK,KAAK,iBAAiB,gBAAgB,KAAK,kBAAkB;AAClE,iBAAK,KAAK,gBAAV,mBAAuB,iBAAiB,QAAQ,KAAK;AACrD,iBAAK,KAAK,gBAAV,mBAAuB,iBAAiB,cAAc,KAAK;AAC3D,iBAAK,KAAK,gBAAV,mBAAuB,iBAAiB,eAAe,KAAK;AAC5D,iBAAK,KAAK,gBAAV,mBAAuB,iBAAiB,oBAAoB,KAAK;AAAA,IAAsB,CACxF;AAAA,EACH;AAAA,EAEA,mBAAmB;;AAEjB,SAAK,eAAe;AAEpB,QAAI,wBAAwB,UAAU;AAC3B,eAAA,oBAAoB,oBAAoB,KAAK,uBAAuB;AAAA,IAAA,OACxE;AACE,aAAA,oBAAoB,YAAY,KAAK,eAAe;AAAA,IAC7D;AACA,SAAK,KAAK,oBAAoB,gBAAgB,KAAK,kBAAkB;AACrE,eAAK,KAAK,gBAAV,mBAAuB,oBAAoB,QAAQ,KAAK;AACxD,eAAK,KAAK,gBAAV,mBAAuB,oBAAoB,cAAc,KAAK;AAC9D,eAAK,KAAK,gBAAV,mBAAuB,oBAAoB,eAAe,KAAK;AAC/D,eAAK,KAAK,gBAAV,mBAAuB,oBAAoB,oBAAoB,KAAK;AAAA,EACtE;AACF;;;;;;;;;;;;AC9LM,IAAA,cAAN,cAA0B,WAAW;AAAA,EAArC,cAAA;AAAA,UAAA,GAAA,SAAA;AAc6D,SAAA,MAAA;AACM,SAAA,SAAA;AACmB,SAAA,kBAAA;AACH,SAAA,iBAAA;AAGd,SAAA,UAAA;AACG,SAAA,WAAA;AACK,SAAA,cAAA;AAGnE,SAAA,kBAAkB,IAAI,uBAAuB,MAAM;AAAA,MACzD;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MAEA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AACO,SAAA,qBAAqB,IAAI,kBAAkB,IAAI;AAG/C,SAAA,sBAAsB,IAAI,mBAAmB,IAAI;AASzD,SAAQ,kBAAkB;EAAuB;AAAA,EAJjD,IAAI,WAAW;AACb,WAAO,KAAK,mBAAmB;AAAA,EACjC;AAAA,EAIA,IAAI,UAAU;;AACL,YAAA,UAAK,gBAAgB,UAArB,mBAA4B;AAAA,EACrC;AAAA,EAEA,IAAI,cAAc;;AACT,YAAA,UAAK,gBAAgB,UAArB,mBAA4B;AAAA,EACrC;AAAA,EAEA,IAAI,UAAU;;AACL,YAAA,UAAK,gBAAgB,UAArB,mBAA4B;AAAA,EACrC;AAAA,EAEA,IAAI,SAAS;;AACJ,YAAA,UAAK,gBAAgB,UAArB,mBAA4B;AAAA,EACrC;AAAA,EAEA,IAAI,WAAW;;AACN,YAAA,UAAK,gBAAgB,UAArB,mBAA4B;AAAA,EACrC;AAAA,EAEA,IAAI,aAAa;;AACR,YAAA,UAAK,gBAAgB,UAArB,mBAA4B;AAAA,EACrC;AAAA,EAEA,IAAI,WAAW;;AACN,YAAA,UAAK,gBAAgB,UAArB,mBAA4B;AAAA,EACrC;AAAA,EAEA,IAAI,YAAY,OAAe;AACzB,QAAA,KAAK,gBAAgB,OAAO;AACzB,WAAA,gBAAgB,MAAM,cAAc;AAAA,IAC3C;AAAA,EACF;AAAA,EACA,IAAI,cAAc;;AACT,aAAA,UAAK,gBAAgB,UAArB,mBAA4B,gBAAe;AAAA,EACpD;AAAA,EAEA,IAAI,aAAa,OAAe;AAC1B,QAAA,KAAK,gBAAgB,OAAO;AACzB,WAAA,gBAAgB,MAAM,eAAe;AAAA,IAC5C;AAAA,EACF;AAAA,EACA,IAAI,eAAe;;AACV,aAAA,UAAK,gBAAgB,UAArB,mBAA4B,iBAAgB;AAAA,EACrD;AAAA,EAEA,IAAI,OAAO,OAAe;AACpB,QAAA,KAAK,gBAAgB,OAAO;AACzB,WAAA,gBAAgB,MAAM,SAAS;AAAA,IACtC;AAAA,EACF;AAAA,EACA,IAAI,SAAS;;AACJ,aAAA,UAAK,gBAAgB,UAArB,mBAA4B,WAAU;AAAA,EAC/C;AAAA,EAEA,IAAI,MAAM,OAAgB;AACpB,QAAA,KAAK,gBAAgB,OAAO;AACzB,WAAA,gBAAgB,MAAM,QAAQ;AAAA,IACrC;AAAA,EACF;AAAA,EACA,IAAI,QAAQ;;AACH,aAAA,UAAK,gBAAgB,UAArB,mBAA4B,UAAS;AAAA,EAC9C;AAAA,EAEA,IAAI,QAAsB;;AACjB,aAAA,UAAK,gBAAgB,UAArB,mBAA4B,UAAS;AAAA,EAC9C;AAAA,EAEA,IAAI,SAAkB;;AACpB,aAAO,UAAK,gBAAgB,UAArB,mBAA4B,WAAU,CAAA;AAAA,EAC/C;AAAA,EAEA,IAAI,cAA6B;;AACxB,aAAA,UAAK,gBAAgB,UAArB,mBAA4B,gBAAe;AAAA,EACpD;AAAA,EAEA,IAAI,aAAa;;AACR,YAAA,UAAK,gBAAgB,UAArB,mBAA4B;AAAA,EACrC;AAAA,EAEA,IAAI,cAAc;AAChB,WAAO,KAAK,gBAAgB;AAAA,EAC9B;AAAA,EAEA,OAAO;;AACA,eAAA,gBAAgB,UAAhB,mBAAuB;AAAA,EAC9B;AAAA,EAEA,QAAQ;;AACD,eAAA,gBAAgB,UAAhB,mBAAuB;AAAA,EAC9B;AAAA,EAEA,MAAM,OAAO,GAAG,OAAO,OAAO;;AAC5B,eAAK,gBAAgB,UAArB,mBAA4B,MAAM,MAAM;AAAA,EAC1C;AAAA,EAEA,SAAS,OAAe;;AACjB,eAAA,gBAAgB,UAAhB,mBAAuB,SAAS;AAAA,EACvC;AAAA,EAEQ,gBAAgB;AAClB,QAAA,CAAC,KAAK,aAAa;AACd,aAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAQT;AAEI,QAAA,OAAO,KAAK,gBAAgB,UAAU;AACjC,aAAA;AAAA;AAAA;AAAA,4BAGe,KAAK,WAAW;AAAA;AAAA;AAAA;AAAA,IAIxC;AAEO,WAAA;AAAA,EACT;AAAA,EAEA,SAAS;AACA,WAAA;AAAA,QACH,KAAK,eAAe;AAAA;AAAA,UAElB,IAAI,KAAK,eAAe,CAAC;AAAA,UACzB,KAAK,gBAAgB,UAAU;AAAA,oBACrB,KAAK,QAAQ;AAAA,mBACd,KAAK,QAAQ;AAAA,gBAChB,KAAK,KAAK;AAAA,oBACN,KAAK,QAAQ;AAAA,sBACX,UAAU,KAAK,WAAW,CAAC;AAAA,kBAC/B,UAAU,KAAK,OAAO,CAAC;AAAA,mBACtB,UAAU,KAAK,QAAQ,CAAC;AAAA,oBACvB,KAAK,QAAQ;AAAA;AAAA;AAAA,EAG/B;AACF;AAlNM,YACG,SAAS;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAKF;AAE4BC,kBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,QAAQ;AAAA,GATtB,YASwB,WAAA,QAAA,CAAA;AACAA,kBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,QAAQ;AAAA,GAVtB,YAUwB,WAAA,WAAA,CAAA;AACAA,kBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,QAAQ;AAAA,GAXtB,YAWwB,WAAA,cAAA,CAAA;AACDA,kBAAA;AAAA,EAA1B,SAAS,EAAE,MAAM,OAAO;AAAA,GAZrB,YAYuB,WAAA,aAAA,CAAA;AAECA,kBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,QAAQ;AAAA,GAdtB,YAcwB,WAAA,OAAA,CAAA;AACAA,kBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,QAAQ;AAAA,GAftB,YAewB,WAAA,UAAA,CAAA;AACCA,kBAAA;AAAA,EAA5B,SAAS,EAAE,MAAM,SAAS;AAAA,GAhBvB,YAgByB,WAAA,mBAAA,CAAA;AACDA,kBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,QAAQ;AAAA,GAjBtB,YAiBwB,WAAA,kBAAA,CAAA;AAEDA,kBAAA;AAAA,EAA1B,SAAS,EAAE,MAAM,OAAO;AAAA,GAnBrB,YAmBuB,WAAA,YAAA,CAAA;AACCA,kBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,QAAQ;AAAA,GApBtB,YAoBwB,WAAA,WAAA,CAAA;AACCA,kBAAA;AAAA,EAA5B,SAAS,EAAE,MAAM,SAAS;AAAA,GArBvB,YAqByB,WAAA,YAAA,CAAA;AACDA,kBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,QAAQ;AAAA,GAtBtB,YAsBwB,WAAA,eAAA,CAAA;AACAA,kBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,QAAQ;AAAA,GAvBtB,YAuBwB,WAAA,YAAA,CAAA;AAoCnBA,kBAAA;AAAA,EAAR,MAAM;AAAA,GA3DH,YA2DK,WAAA,SAAA,CAAA;AACAA,kBAAA;AAAA,EAAR,MAAM;AAAA,GA5DH,YA4DK,WAAA,YAAA,CAAA;AA5DL,cAANA,kBAAA;AAAA,EADC,cAAc,oBAAoB;AAAA,GAC7B,WAAA;;;;;;;;;;;;ACpBN,IAAM,gBAAN,cAA4B,WAAW;AAAA,EAAvC,cAAA;AAAA,UAAA,GAAA,SAAA;AAqEsC,SAAA,OAAA;AACuC,SAAA,cAAA;AAAA,EAAA;AAAA,EAE3E,SAAS;AACA,WAAA;AAAA;AAAA,gBAEK,SAAS;AAAA,MACf,WAAW;AAAA,MACX,QAAQ,CAAC,KAAK;AAAA,IAAA,CACf,CAAC;AAAA;AAAA;AAAA;AAAA,mBAIS,MAAM,KAAK,cAAc,IAAI,YAAY,iBAAiB,EAAE,SAAS,MAAM,UAAU,KAAK,CAAC,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA,oBAI5F,SAAS;AAAA,MACf,eAAe;AAAA,MACf,MAAM,KAAK,gBAAgB;AAAA,IAAA,CAC5B,CAAC;AAAA,oBACM,SAAS;AAAA,MACf,aAAa,KAAK;AAAA,IAAA,CACnB,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,uBAOS,MAAM,KAAK,cAAc,IAAI,YAAY,eAAe,EAAE,SAAS,MAAM,UAAU,KAAK,CAAC,CAAC,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAMhH;AACF;AA1GM,cACG,SAAS;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAiEF;AAE6BA,kBAAA;AAAA,EAA5B,SAAS,EAAE,MAAM,SAAS;AAAA,GArEvB,cAqEyB,WAAA,QAAA,CAAA;AACDA,kBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,QAAQ;AAAA,GAtEtB,cAsEwB,WAAA,eAAA,CAAA;AAtExB,gBAANA,kBAAA;AAAA,EADC,cAAc,4BAA4B;AAAA,GACrC,aAAA;;;;;;;;;;;;ACEN,IAAM,eAAN,cAA2B,WAAW;AAAA,EAAtC,cAAA;AAAA,UAAA,GAAA,SAAA;AAK6D,SAAA,MAAA;AACM,SAAA,SAAA;AACmB,SAAA,kBAAA;AACH,SAAA,iBAAA;AAGd,SAAA,UAAA;AACiB,SAAA,kBAAA;AACT,SAAA,cAAA;AAE3E,SAAQ,kBAAkB;AAEV,SAAA,OAAA;AAEhB,SAAQ,gBAAgB,CAAC,EAAE,aAAkC;;AAIvD,UAAA,KAAK,OAAO,QAAQ;AACjB,aAAA,OAAO,CAAC,KAAK;AAElB,YAAI,KAAK,MAAM;AACb,cAAI,CAAC,KAAK,qBAAmB,UAAK,oBAAL,mBAAsB,QAAO;AACnD,iBAAA,gBAAgB,MAAM,QAAQ;AAC9B,iBAAA,gBAAgB,MAAM;UAC7B;AAAA,QAAA,OACK;AACA,2BAAA,oBAAA,mBAAiB,UAAjB,mBAAwB;AAAA,QAC/B;AAAA,MACF;AAAA,IAAA;AAIF,SAAQ,eAAe,MAAM;;AAC3B,WAAK,OAAO;AACP,uBAAA,oBAAA,mBAAiB,UAAjB,mBAAwB;AAAA,IAAM;AAG7B,SAAA,uBAAuB,CAAC,MAAqB;AAC/C,UAAA,EAAE,QAAQ,UAAU;AACtB,aAAK,aAAa;AAAA,MACpB;AAAA,IAAA;AAAA,EACF;AAAA,EAEA,oBAA0B;AACxB,UAAM,kBAAkB;AACf,aAAA,iBAAiB,qBAAqB,KAAK,aAAa;AACxD,aAAA,iBAAiB,SAAS,KAAK,oBAAoB;AACnD,aAAA,iBAAiB,eAAe,KAAK,YAAY;AACjD,aAAA,iBAAiB,iBAAiB,KAAK,YAAY;AAAA,EAC9D;AAAA,EAEA,uBAA6B;AAC3B,UAAM,qBAAqB;AAClB,aAAA,oBAAoB,qBAAqB,KAAK,aAAa;AAC3D,aAAA,oBAAoB,SAAS,KAAK,oBAAoB;AACtD,aAAA,oBAAoB,eAAe,KAAK,YAAY;AACpD,aAAA,oBAAoB,iBAAiB,KAAK,YAAY;AAAA,EACjE;AAAA,EAEU,mBAAmD;AAKrD,UAAA,UAAU,SAAS,cAAc,KAAK;AACnC,aAAA,KAAK,YAAY,OAAO;AAC1B,WAAA;AAAA,EACT;AAAA,EAEA,SAAS;AACA,WAAA;AAAA,0CAC+B,KAAK,IAAI,gBAAgB,KAAK,WAAW;AAAA;AAAA,YAEvE,IAAI,KAAK,eAAe,CAAC;AAAA,kBACnB,SAAS;AAAA,MACf,UAAU;AAAA,MACV,WAAW;AAAA,IAAA,CACZ,CAAC;AAAA,sBACU,KAAK;AAAA,oBACP,UAAU,KAAK,OAAO,CAAC;AAAA,uBACpB,UAAU,KAAK,UAAU,CAAC;AAAA,uBAC1B,KAAK,SAAS;AAAA,sBACf,KAAK,QAAQ;AAAA,gBACnB,UAAU,KAAK,GAAG,CAAC;AAAA,mBAChB,UAAU,KAAK,MAAM,CAAC;AAAA,6BACZ,KAAK,eAAe;AAAA,2BACtB,UAAU,KAAK,cAAc,CAAC;AAAA,oBACrC,UAAU,KAAK,OAAO,CAAC;AAAA,wBACnB,KAAK,WAAW;AAAA;AAAA;AAAA;AAAA,EAItC;AACF;AAlG8BA,kBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,QAAQ;AAAA,GADtB,aACwB,WAAA,WAAA,CAAA;AACAA,kBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,QAAQ;AAAA,GAFtB,aAEwB,WAAA,cAAA,CAAA;AACDA,kBAAA;AAAA,EAA1B,SAAS,EAAE,MAAM,OAAO;AAAA,GAHrB,aAGuB,WAAA,aAAA,CAAA;AAECA,kBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,QAAQ;AAAA,GALtB,aAKwB,WAAA,OAAA,CAAA;AACAA,kBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,QAAQ;AAAA,GANtB,aAMwB,WAAA,UAAA,CAAA;AACCA,kBAAA;AAAA,EAA5B,SAAS,EAAE,MAAM,SAAS;AAAA,GAPvB,aAOyB,WAAA,mBAAA,CAAA;AACDA,kBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,QAAQ;AAAA,GARtB,aAQwB,WAAA,kBAAA,CAAA;AAEDA,kBAAA;AAAA,EAA1B,SAAS,EAAE,MAAM,OAAO;AAAA,GAVrB,aAUuB,WAAA,YAAA,CAAA;AACCA,kBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,QAAQ;AAAA,GAXtB,aAWwB,WAAA,WAAA,CAAA;AACCA,kBAAA;AAAA,EAA5B,SAAS,EAAE,MAAM,SAAS;AAAA,GAZvB,aAYyB,WAAA,mBAAA,CAAA;AACDA,kBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,QAAQ;AAAA,GAbtB,aAawB,WAAA,eAAA,CAAA;AAInBA,kBAAA;AAAA,EAAR,MAAM;AAAA,GAjBH,aAiBK,WAAA,QAAA,CAAA;AAjBL,eAANA,kBAAA;AAAA,EADC,cAAc,2BAA2B;AAAA,GACpC,YAAA;;;;;;;;;;;;ACGA,IAAA,cAAN,cAA0B,WAAW;AAAA,EAArC,cAAA;AAAA,UAAA,GAAA,SAAA;AAmB6D,SAAA,MAAA;AACM,SAAA,SAAA;AACmB,SAAA,kBAAA;AACH,SAAA,iBAAA;AAGd,SAAA,UAAA;AACiB,SAAA,kBAAA;AACT,SAAA,cAAA;AAE3E,SAAQ,MAAMD;AAEd,SAAQ,mBAAmB,MAAM;AAC/B,WAAK,cAAc,IAAI,YAAY,qBAAqB,EAAE,QAAQ,KAAK,KAAK,SAAS,MAAM,UAAU,KAAA,CAAM,CAAC;AAAA,IAAA;AAAA,EAC9G;AAAA,EAEA,oBAA0B;AACxB,UAAM,kBAAkB;AACnB,SAAA,iBAAiB,SAAS,KAAK,gBAAgB;AAAA,EACtD;AAAA,EAEA,uBAA6B;AAC3B,UAAM,qBAAqB;AACtB,SAAA,oBAAoB,SAAS,KAAK,gBAAgB;AAAA,EACzD;AAAA,EAEA,SAAS;AACA,WAAA;AAAA;AAAA;AAAA;AAAA;AAAA,aAKE,KAAK,GAAG;AAAA,oBACD,KAAK;AAAA,kBACP,UAAU,KAAK,OAAO,CAAC;AAAA,qBACpB,UAAU,KAAK,UAAU,CAAC;AAAA,qBAC1B,KAAK,SAAS;AAAA,oBACf,KAAK,QAAQ;AAAA,cACnB,UAAU,KAAK,GAAG,CAAC;AAAA,iBAChB,UAAU,KAAK,MAAM,CAAC;AAAA,2BACZ,KAAK,eAAe;AAAA,yBACtB,UAAU,KAAK,cAAc,CAAC;AAAA,kBACrC,UAAU,KAAK,OAAO,CAAC;AAAA,sBACnB,KAAK,WAAW;AAAA;AAAA;AAAA,EAGpC;AACF;AAlEM,YACG,SAAS;AAAA,EACd;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAWF;AAE4B,gBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,QAAQ;AAAA,GAftB,YAewB,WAAA,WAAA,CAAA;AACA,gBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,QAAQ;AAAA,GAhBtB,YAgBwB,WAAA,cAAA,CAAA;AACD,gBAAA;AAAA,EAA1B,SAAS,EAAE,MAAM,OAAO;AAAA,GAjBrB,YAiBuB,WAAA,aAAA,CAAA;AAEC,gBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,QAAQ;AAAA,GAnBtB,YAmBwB,WAAA,OAAA,CAAA;AACA,gBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,QAAQ;AAAA,GApBtB,YAoBwB,WAAA,UAAA,CAAA;AACC,gBAAA;AAAA,EAA5B,SAAS,EAAE,MAAM,SAAS;AAAA,GArBvB,YAqByB,WAAA,mBAAA,CAAA;AACD,gBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,QAAQ;AAAA,GAtBtB,YAsBwB,WAAA,kBAAA,CAAA;AAED,gBAAA;AAAA,EAA1B,SAAS,EAAE,MAAM,OAAO;AAAA,GAxBrB,YAwBuB,WAAA,YAAA,CAAA;AACC,gBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,QAAQ;AAAA,GAzBtB,YAyBwB,WAAA,WAAA,CAAA;AACC,gBAAA;AAAA,EAA5B,SAAS,EAAE,MAAM,SAAS;AAAA,GA1BvB,YA0ByB,WAAA,mBAAA,CAAA;AACD,gBAAA;AAAA,EAA3B,SAAS,EAAE,MAAM,QAAQ;AAAA,GA3BtB,YA2BwB,WAAA,eAAA,CAAA;AA3BxB,cAAN,gBAAA;AAAA,EADC,cAAc,oBAAoB;AAAA,GAC7B,WAAA;"}
@@ -0,0 +1,20 @@
1
+ import { LitElement } from 'lit';
2
+ import type { DialogEmbedProps } from '.';
3
+ import '@a11y/focus-trap';
4
+ declare class DialogOverlay extends LitElement {
5
+ static styles: import("lit").CSSResult[];
6
+ open: boolean;
7
+ aspectRatio: DialogEmbedProps['aspectRatio'];
8
+ render(): import("lit-html").TemplateResult<1>;
9
+ }
10
+ declare global {
11
+ interface HTMLElementTagNameMap {
12
+ 'vouch-embed-dialog-overlay': DialogOverlay;
13
+ }
14
+ namespace JSX {
15
+ interface IntrinsicElements {
16
+ 'vouch-embed-dialog-overlay': DialogOverlay;
17
+ }
18
+ }
19
+ }
20
+ export { DialogOverlay };
@@ -0,0 +1,36 @@
1
+ import { LitElement } from 'lit';
2
+ import type { DialogEmbedProps } from '.';
3
+ import './DialogOverlay';
4
+ declare class DialogPortal extends LitElement {
5
+ vouchId: DialogEmbedProps['vouchId'];
6
+ templateId: DialogEmbedProps['templateId'];
7
+ questions: DialogEmbedProps['questions'];
8
+ env: DialogEmbedProps['env'];
9
+ apiKey: DialogEmbedProps['apiKey'];
10
+ disableTracking: DialogEmbedProps['disableTracking'];
11
+ trackingSource: DialogEmbedProps['trackingSource'];
12
+ controls: DialogEmbedProps['controls'];
13
+ preload: DialogEmbedProps['preload'];
14
+ disableAutoplay: DialogEmbedProps['disableAutoplay'];
15
+ aspectRatio: DialogEmbedProps['aspectRatio'];
16
+ private _mediaPlayerRef;
17
+ open: boolean;
18
+ private _handleToggle;
19
+ private _handleClose;
20
+ private _handleDocumentKeyUp;
21
+ connectedCallback(): void;
22
+ disconnectedCallback(): void;
23
+ protected createRenderRoot(): HTMLElement | DocumentFragment;
24
+ render(): import("lit-html").TemplateResult<1>;
25
+ }
26
+ declare global {
27
+ interface HTMLElementTagNameMap {
28
+ 'vouch-embed-dialog-portal': DialogPortal;
29
+ }
30
+ namespace JSX {
31
+ interface IntrinsicElements {
32
+ 'vouch-embed-dialog-portal': DialogPortal;
33
+ }
34
+ }
35
+ }
36
+ export { DialogPortal };
@@ -0,0 +1,38 @@
1
+ import { LitElement } from 'lit';
2
+ import type { PlayerEmbedProps } from '../PlayerEmbed';
3
+ import '../PlayerEmbed';
4
+ import './DialogPortal';
5
+ type DialogEmbedProps = Omit<PlayerEmbedProps, 'data'> & {
6
+ disableAutoplay?: boolean;
7
+ };
8
+ declare class DialogEmbed extends LitElement {
9
+ static styles: import("lit").CSSResult[];
10
+ vouchId: DialogEmbedProps['vouchId'];
11
+ templateId: DialogEmbedProps['templateId'];
12
+ questions: DialogEmbedProps['questions'];
13
+ env: DialogEmbedProps['env'];
14
+ apiKey: DialogEmbedProps['apiKey'];
15
+ disableTracking: DialogEmbedProps['disableTracking'];
16
+ trackingSource: DialogEmbedProps['trackingSource'];
17
+ controls: DialogEmbedProps['controls'];
18
+ preload: DialogEmbedProps['preload'];
19
+ disableAutoplay: DialogEmbedProps['disableAutoplay'];
20
+ aspectRatio: DialogEmbedProps['aspectRatio'];
21
+ private _id;
22
+ private _handleRootClick;
23
+ connectedCallback(): void;
24
+ disconnectedCallback(): void;
25
+ render(): import("lit-html").TemplateResult<1>;
26
+ }
27
+ declare global {
28
+ interface HTMLElementTagNameMap {
29
+ 'vouch-embed-dialog': DialogEmbed;
30
+ }
31
+ namespace JSX {
32
+ interface IntrinsicElements {
33
+ 'vouch-embed-dialog': DialogEmbed;
34
+ }
35
+ }
36
+ }
37
+ export { DialogEmbed };
38
+ export type { DialogEmbedProps };
@@ -0,0 +1,15 @@
1
+ import type { PlayerEmbed } from '..';
2
+ import type { ReactiveController, ReactiveControllerHost } from 'lit';
3
+ import type { DirectiveResult } from 'lit/directive.js';
4
+ type PlayerEmbedHost = ReactiveControllerHost & PlayerEmbed;
5
+ declare class EventForwardController implements ReactiveController {
6
+ host: PlayerEmbedHost;
7
+ private _events;
8
+ private _cleanup;
9
+ private _forwardElementRef;
10
+ constructor(host: PlayerEmbedHost, events: string[]);
11
+ register(): DirectiveResult;
12
+ hostConnected(): void;
13
+ hostDisconnected(): void;
14
+ }
15
+ export { EventForwardController };
@@ -0,0 +1,14 @@
1
+ import type { PlayerEmbed } from '..';
2
+ import type { ReactiveControllerHost } from 'lit';
3
+ type PlayerEmbedHost = ReactiveControllerHost & PlayerEmbed;
4
+ declare class FetcherController {
5
+ host: PlayerEmbedHost;
6
+ private _fetching;
7
+ private _vouch;
8
+ set fetching(value: boolean);
9
+ get fetching(): boolean;
10
+ private getVouch;
11
+ private getTemplate;
12
+ constructor(host: PlayerEmbedHost);
13
+ }
14
+ export { FetcherController };
@@ -0,0 +1,36 @@
1
+ import type { PlayerEmbed } from '../..';
2
+ import type { ReactiveController, ReactiveControllerHost } from 'lit';
3
+ type PlayerEmbedHost = ReactiveControllerHost & PlayerEmbed;
4
+ type TrackingEvent = 'VOUCH_LOADED' | 'VOUCH_RESPONSE_VIEWED' | 'VIDEO_PLAYED' | 'VIDEO_STREAMED';
5
+ type TrackingPayload = {
6
+ vouchId?: string;
7
+ answerId?: string;
8
+ streamStart?: number;
9
+ streamEnd?: number;
10
+ };
11
+ declare class TrackingController implements ReactiveController {
12
+ host: PlayerEmbedHost;
13
+ private _batchedEvents;
14
+ private _hasPlayed;
15
+ private _hasLoaded;
16
+ private _answersViewed;
17
+ private _streamStartTime;
18
+ private _streamLatestTime;
19
+ private _currentlyPlayingVideo;
20
+ constructor(host: PlayerEmbedHost);
21
+ private _createTrackingEvent;
22
+ private _sendTrackingEvent;
23
+ private _streamEnded;
24
+ private _handleVouchLoaded;
25
+ private _handlePlay;
26
+ private _handleVideoPlay;
27
+ private _handleVideoTimeUpdate;
28
+ private _handleVideoPause;
29
+ private _pageUnloading;
30
+ private _handleVisibilityChange;
31
+ private _handlePageHide;
32
+ hostConnected(): void;
33
+ hostDisconnected(): void;
34
+ }
35
+ export { TrackingController };
36
+ export type { TrackingEvent, TrackingPayload };
@@ -0,0 +1,17 @@
1
+ import type { TrackingPayload } from '.';
2
+ import type { Vouch } from '@vouchfor/video-utils';
3
+ import type { Environment } from '../../../../utils/env';
4
+ declare function getUids(env: Environment): {
5
+ client: null;
6
+ tab: null;
7
+ request: string;
8
+ visitor?: undefined;
9
+ } | {
10
+ client: string;
11
+ tab: string;
12
+ request: string;
13
+ visitor: string;
14
+ };
15
+ declare function findVouchId(payload?: TrackingPayload, vouch?: Vouch): string | null | undefined;
16
+ declare function getReportingMetadata(source?: string): any;
17
+ export { getUids, findVouchId, getReportingMetadata };
@@ -0,0 +1,75 @@
1
+ import { LitElement } from 'lit';
2
+ import type { Scene, Scenes, TemplateInstance } from '@vouchfor/canvas-video';
3
+ import type { MediaPlayer, MediaPlayerProps } from '@vouchfor/media-player';
4
+ import type { Environment } from '../../utils/env';
5
+ import '@vouchfor/media-player';
6
+ type PlayerEmbedProps = Pick<MediaPlayerProps, 'data' | 'aspectRatio' | 'language' | 'preload' | 'autoplay' | 'controls'> & {
7
+ env: Environment;
8
+ apiKey: string;
9
+ disableTracking?: boolean;
10
+ trackingSource?: string;
11
+ vouchId?: string;
12
+ templateId?: string;
13
+ questions?: number[];
14
+ };
15
+ declare class PlayerEmbed extends LitElement {
16
+ static styles: import("lit").CSSResult[];
17
+ data: PlayerEmbedProps['data'];
18
+ vouchId: PlayerEmbedProps['vouchId'];
19
+ templateId: PlayerEmbedProps['templateId'];
20
+ questions: PlayerEmbedProps['questions'];
21
+ env: PlayerEmbedProps['env'];
22
+ apiKey: PlayerEmbedProps['apiKey'];
23
+ disableTracking: PlayerEmbedProps['disableTracking'];
24
+ trackingSource: PlayerEmbedProps['trackingSource'];
25
+ controls: PlayerEmbedProps['controls'];
26
+ preload: PlayerEmbedProps['preload'];
27
+ autoplay: PlayerEmbedProps['autoplay'];
28
+ aspectRatio: PlayerEmbedProps['aspectRatio'];
29
+ language?: MediaPlayerProps['language'];
30
+ private eventController;
31
+ private _fetcherController;
32
+ private _trackingController;
33
+ vouch: PlayerEmbedProps['data'];
34
+ template: TemplateInstance | undefined;
35
+ get fetching(): boolean;
36
+ private _mediaPlayerRef;
37
+ get waiting(): boolean | undefined;
38
+ get initialised(): Promise<boolean> | undefined;
39
+ get seeking(): boolean | undefined;
40
+ get paused(): boolean | undefined;
41
+ get captions(): boolean | undefined;
42
+ get fullscreen(): boolean | undefined;
43
+ get duration(): number | undefined;
44
+ set currentTime(value: number);
45
+ get currentTime(): number;
46
+ set playbackRate(value: number);
47
+ get playbackRate(): number;
48
+ set volume(value: number);
49
+ get volume(): number;
50
+ set muted(value: boolean);
51
+ get muted(): boolean;
52
+ get scene(): Scene | null;
53
+ get scenes(): Scene[];
54
+ get sceneConfig(): Scenes | null;
55
+ get videoState(): import("@vouchfor/media-player").VideoStateMap | undefined;
56
+ get mediaPlayer(): MediaPlayer | undefined;
57
+ play(): void;
58
+ pause(): void;
59
+ reset(time?: number, play?: boolean): void;
60
+ setScene(index: number): void;
61
+ private _renderStyles;
62
+ render(): import("lit-html").TemplateResult<1>;
63
+ }
64
+ declare global {
65
+ interface HTMLElementTagNameMap {
66
+ 'vouch-embed-player': PlayerEmbed;
67
+ }
68
+ namespace JSX {
69
+ interface IntrinsicElements {
70
+ 'vouch-embed-player': PlayerEmbed;
71
+ }
72
+ }
73
+ }
74
+ export { PlayerEmbed };
75
+ export type { PlayerEmbedProps };
@@ -0,0 +1,3 @@
1
+ import type { Vouch } from '@vouchfor/video-utils';
2
+ declare const data: Vouch;
3
+ export { data };
@@ -0,0 +1,2 @@
1
+ export { PlayerEmbed } from './components/PlayerEmbed';
2
+ export { DialogEmbed } from './components/DialogEmbed';
@@ -0,0 +1,12 @@
1
+ type Environment = 'local' | 'dev' | 'staging' | 'prod';
2
+ type GetEnvUrlsReturn = {
3
+ videoUrl: string;
4
+ publicApiUrl: string;
5
+ embedApiUrl: string;
6
+ };
7
+ declare const devEmbedApiUrl = "https://embed-dev.vouchfor.com/v2";
8
+ declare const stagingEmbedApiUrl = "https://embed-staging.vouchfor.com/v2";
9
+ declare const prodEmbedApiUrl = "https://embed.vouchfor.com/v2";
10
+ declare function getEnvUrls(env: Environment): GetEnvUrlsReturn;
11
+ export { devEmbedApiUrl, stagingEmbedApiUrl, prodEmbedApiUrl, getEnvUrls };
12
+ export type { Environment };
@@ -0,0 +1,2 @@
1
+ declare function forwardEvent(type: string, fromElement: HTMLElement, toElement: HTMLElement): () => void;
2
+ export { forwardEvent };