@fluid-app/portal-sdk 0.1.492 → 0.1.494
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/dist/{AnnouncementWidget-CNP37JUB.cjs → AnnouncementWidget--nRHRrQH.cjs} +3 -3
- package/dist/{AnnouncementWidget-93a322Pl.mjs → AnnouncementWidget-BND76Ojg.mjs} +2 -2
- package/dist/{AnnouncementWidget-93a322Pl.mjs.map → AnnouncementWidget-BND76Ojg.mjs.map} +1 -1
- package/dist/{AnnouncementWidget-BIFJ7E6o.cjs → AnnouncementWidget-Dh6nKAqT.cjs} +2 -2
- package/dist/{AnnouncementWidget-BIFJ7E6o.cjs.map → AnnouncementWidget-Dh6nKAqT.cjs.map} +1 -1
- package/dist/{CarouselWidget-fft3Aibh.cjs → CarouselWidget-BETNqs_K.cjs} +3 -3
- package/dist/{CarouselWidget-fft3Aibh.cjs.map → CarouselWidget-BETNqs_K.cjs.map} +1 -1
- package/dist/{CarouselWidget-COavwXvx.mjs → CarouselWidget-CU1oj0q4.mjs} +3 -3
- package/dist/{CarouselWidget-COavwXvx.mjs.map → CarouselWidget-CU1oj0q4.mjs.map} +1 -1
- package/dist/{CarouselWidget-DDKKVEan.cjs → CarouselWidget-D3BODbpO.cjs} +3 -3
- package/dist/{CatchUpWidget-C3HdLA5t.mjs → CatchUpWidget-BtwG2-JD.mjs} +2 -2
- package/dist/{CatchUpWidget-BNEEQNcr.mjs → CatchUpWidget-CLwHp30X.mjs} +5 -4
- package/dist/CatchUpWidget-CLwHp30X.mjs.map +1 -0
- package/dist/{CatchUpWidget-G4txAfv3.cjs → CatchUpWidget-CqAHpCJP.cjs} +5 -4
- package/dist/CatchUpWidget-CqAHpCJP.cjs.map +1 -0
- package/dist/{CatchUpWidget-g9GtsvCy.cjs → CatchUpWidget-ak-oFdKY.cjs} +2 -2
- package/dist/{FluidProvider-DxwbLpfX.mjs → FluidProvider-BRgNyDk3.mjs} +3 -3
- package/dist/{FluidProvider-DxwbLpfX.mjs.map → FluidProvider-BRgNyDk3.mjs.map} +1 -1
- package/dist/{FluidProvider-B7bYw1AY.cjs → FluidProvider-XONLsJbE.cjs} +3 -3
- package/dist/{FluidProvider-B7bYw1AY.cjs.map → FluidProvider-XONLsJbE.cjs.map} +1 -1
- package/dist/{ImageWidget-B3IlWnKJ.cjs → ImageWidget-CksrA9rH.cjs} +2 -2
- package/dist/{ImageWidget-B3IlWnKJ.cjs.map → ImageWidget-CksrA9rH.cjs.map} +1 -1
- package/dist/{ImageWidget-DiWlWvKm.cjs → ImageWidget-DmO84AYo.cjs} +3 -3
- package/dist/{ImageWidget-CovwH8bp.mjs → ImageWidget-I8F34YlI.mjs} +2 -2
- package/dist/{ImageWidget-CovwH8bp.mjs.map → ImageWidget-I8F34YlI.mjs.map} +1 -1
- package/dist/{LinkWidget-StpP6gPq.mjs → LinkWidget-Dg0tHfgD.mjs} +2 -2
- package/dist/{LinkWidget-StpP6gPq.mjs.map → LinkWidget-Dg0tHfgD.mjs.map} +1 -1
- package/dist/{LinkWidget-BTIsGyc5.cjs → LinkWidget-Dvp6-Dow.cjs} +2 -2
- package/dist/{LinkWidget-BTIsGyc5.cjs.map → LinkWidget-Dvp6-Dow.cjs.map} +1 -1
- package/dist/{LinkWidget-ZVFlL178.cjs → LinkWidget-N6yz6w-U.cjs} +3 -3
- package/dist/{ListWidget-ddhJLwxZ.mjs → ListWidget-BAS3SGpD.mjs} +3 -3
- package/dist/{ListWidget-ddhJLwxZ.mjs.map → ListWidget-BAS3SGpD.mjs.map} +1 -1
- package/dist/{ListWidget-6TkLyp00.cjs → ListWidget-CH-zz3sb.cjs} +3 -3
- package/dist/{ListWidget-6TkLyp00.cjs.map → ListWidget-CH-zz3sb.cjs.map} +1 -1
- package/dist/{ListWidget-BNAED5xZ.cjs → ListWidget-vG31UVVS.cjs} +3 -3
- package/dist/{MessagingScreen-CZje-9-C.mjs → MessagingScreen-B8--eInM.mjs} +19 -19
- package/dist/{MessagingScreen-DDVflwCT.cjs → MessagingScreen-D2oC8zGg.cjs} +19 -19
- package/dist/{MessagingScreen-Q0BSmRuJ.mjs → MessagingScreen-DYjU5smt.mjs} +2 -2
- package/dist/{MessagingScreen-Q0BSmRuJ.mjs.map → MessagingScreen-DYjU5smt.mjs.map} +1 -1
- package/dist/{MessagingScreen-D7Yuy_Rn.cjs → MessagingScreen-gPqbIcFd.cjs} +2 -2
- package/dist/{MessagingScreen-D7Yuy_Rn.cjs.map → MessagingScreen-gPqbIcFd.cjs.map} +1 -1
- package/dist/{NestedWidget-orTqukJD.cjs → NestedWidget-B24yMkV4.cjs} +2 -2
- package/dist/{NestedWidget-orTqukJD.cjs.map → NestedWidget-B24yMkV4.cjs.map} +1 -1
- package/dist/{NestedWidget-DMhmCZT6.mjs → NestedWidget-D31rZhTR.mjs} +2 -2
- package/dist/{NestedWidget-DMhmCZT6.mjs.map → NestedWidget-D31rZhTR.mjs.map} +1 -1
- package/dist/{NestedWidget-BZZqukZw.cjs → NestedWidget-DqM5HGFl.cjs} +2 -2
- package/dist/{OrdersScreen-vAO6E8EM.cjs → OrdersScreen-BdLqCq1V.cjs} +19 -19
- package/dist/{OrdersScreen-CXxGN6RY.mjs → OrdersScreen-CHSqar4N.mjs} +3 -3
- package/dist/{OrdersScreen-CXxGN6RY.mjs.map → OrdersScreen-CHSqar4N.mjs.map} +1 -1
- package/dist/{OrdersScreen-DOBWnf_w.mjs → OrdersScreen-DRcdhc7y.mjs} +19 -19
- package/dist/{OrdersScreen-C0TzmZCl.cjs → OrdersScreen-Xs90dlpC.cjs} +3 -3
- package/dist/{OrdersScreen-C0TzmZCl.cjs.map → OrdersScreen-Xs90dlpC.cjs.map} +1 -1
- package/dist/{ProfileScreen-B9NHS4A_.cjs → ProfileScreen-BeaM28Qw.cjs} +20 -20
- package/dist/{ProfileScreen-DWFXnUUU.mjs → ProfileScreen-C-YfTr7l.mjs} +20 -20
- package/dist/{ProfileScreen-BGLpyuef.mjs → ProfileScreen-CpoLji_m.mjs} +3 -3
- package/dist/{ProfileScreen-BGLpyuef.mjs.map → ProfileScreen-CpoLji_m.mjs.map} +1 -1
- package/dist/{ProfileScreen-tq1DJ71b.cjs → ProfileScreen-DdCPrQUL.cjs} +3 -3
- package/dist/{ProfileScreen-tq1DJ71b.cjs.map → ProfileScreen-DdCPrQUL.cjs.map} +1 -1
- package/dist/{QuickLinksWidget-DIkDVuvE.mjs → QuickLinksWidget-BiEUvm_J.mjs} +2 -2
- package/dist/{QuickLinksWidget-DIkDVuvE.mjs.map → QuickLinksWidget-BiEUvm_J.mjs.map} +1 -1
- package/dist/{QuickLinksWidget-DDFtIKqs.cjs → QuickLinksWidget-CLBvaogv.cjs} +2 -2
- package/dist/{QuickLinksWidget-DDFtIKqs.cjs.map → QuickLinksWidget-CLBvaogv.cjs.map} +1 -1
- package/dist/{QuickLinksWidget-HvMQHOkz.cjs → QuickLinksWidget-DzAL_wuz.cjs} +3 -3
- package/dist/{QuickShareWidget-BNf1Un61.cjs → QuickShareWidget-B7mlqgW8.cjs} +2 -2
- package/dist/{QuickShareWidget-lysi8Dhh.mjs → QuickShareWidget-Dzpzis1d.mjs} +2 -2
- package/dist/{QuickShareWidget-lysi8Dhh.mjs.map → QuickShareWidget-Dzpzis1d.mjs.map} +1 -1
- package/dist/{QuickShareWidget-mxiy1zdd.cjs → QuickShareWidget-wxRcBUkf.cjs} +2 -2
- package/dist/{QuickShareWidget-mxiy1zdd.cjs.map → QuickShareWidget-wxRcBUkf.cjs.map} +1 -1
- package/dist/{RecentActivityWidget-DGtKC_9F.mjs → RecentActivityWidget-BzmV4G8e.mjs} +2 -2
- package/dist/{RecentActivityWidget-DGtKC_9F.mjs.map → RecentActivityWidget-BzmV4G8e.mjs.map} +1 -1
- package/dist/{RecentActivityWidget-DcgOzvHx.cjs → RecentActivityWidget-DQcy41-I.cjs} +2 -2
- package/dist/{RecentActivityWidget-Cr1G82Cd.cjs → RecentActivityWidget-zBOY0c_B.cjs} +2 -2
- package/dist/{RecentActivityWidget-Cr1G82Cd.cjs.map → RecentActivityWidget-zBOY0c_B.cjs.map} +1 -1
- package/dist/{ShopWidget-C5hjVwsY.cjs → ShopWidget-CCITGTSs.cjs} +2 -2
- package/dist/{ShopWidget-C5hjVwsY.cjs.map → ShopWidget-CCITGTSs.cjs.map} +1 -1
- package/dist/{ShopWidget-BYQKWyri.mjs → ShopWidget-D98tmUgG.mjs} +2 -2
- package/dist/{ShopWidget-B80w-Drk.mjs → ShopWidget-DHM86LM3.mjs} +2 -2
- package/dist/{ShopWidget-B80w-Drk.mjs.map → ShopWidget-DHM86LM3.mjs.map} +1 -1
- package/dist/{ShopWidget-CoOK6Ctd.cjs → ShopWidget-DXVsF1Jh.cjs} +2 -2
- package/dist/{SubscriptionsScreen-BwcpTAn5.mjs → SubscriptionsScreen-BOM_1txu.mjs} +20 -20
- package/dist/{SubscriptionsScreen-BEzmLp01.cjs → SubscriptionsScreen-DGIEnvLM.cjs} +20 -20
- package/dist/{SubscriptionsScreen-Cy7RtO5K.cjs → SubscriptionsScreen-DzBPA9H8.cjs} +4 -4
- package/dist/{SubscriptionsScreen-Cy7RtO5K.cjs.map → SubscriptionsScreen-DzBPA9H8.cjs.map} +1 -1
- package/dist/{SubscriptionsScreen-C7OOGlBt.mjs → SubscriptionsScreen-cAKZwpIu.mjs} +4 -4
- package/dist/{SubscriptionsScreen-C7OOGlBt.mjs.map → SubscriptionsScreen-cAKZwpIu.mjs.map} +1 -1
- package/dist/{TableWidget-lXrvBX6U.cjs → TableWidget-B8F_uQ92.cjs} +2 -2
- package/dist/{TableWidget-Bxwn3QYs.mjs → TableWidget-CDGdl71J.mjs} +2 -2
- package/dist/{TableWidget-Bxwn3QYs.mjs.map → TableWidget-CDGdl71J.mjs.map} +1 -1
- package/dist/{TableWidget-uoeYCPzf.cjs → TableWidget-DNjUA2Il.cjs} +2 -2
- package/dist/{TableWidget-uoeYCPzf.cjs.map → TableWidget-DNjUA2Il.cjs.map} +1 -1
- package/dist/{VideoWidget-D8FAjnvj.cjs → VideoWidget-UQQoRmwC.cjs} +3 -3
- package/dist/{VideoWidget-DQzYOcFF.mjs → VideoWidget-Wca2-So_.mjs} +2 -2
- package/dist/{VideoWidget-DQzYOcFF.mjs.map → VideoWidget-Wca2-So_.mjs.map} +1 -1
- package/dist/{VideoWidget-BhN4oTGG.cjs → VideoWidget-bf-gkCfx.cjs} +2 -2
- package/dist/{VideoWidget-BhN4oTGG.cjs.map → VideoWidget-bf-gkCfx.cjs.map} +1 -1
- package/dist/{WidgetInteractionContext-Bjy4P_YP.cjs → WidgetInteractionContext-D9dBJ-39.cjs} +5 -3
- package/dist/WidgetInteractionContext-D9dBJ-39.cjs.map +1 -0
- package/dist/{WidgetInteractionContext-Ba_G5sDP.mjs → WidgetInteractionContext-IsMo73Ka.mjs} +5 -3
- package/dist/WidgetInteractionContext-IsMo73Ka.mjs.map +1 -0
- package/dist/{build-widget-registry-DAOb4Muk.mjs → build-widget-registry-70KBtqiR.mjs} +27 -27
- package/dist/{build-widget-registry-DAOb4Muk.mjs.map → build-widget-registry-70KBtqiR.mjs.map} +1 -1
- package/dist/{build-widget-registry-BZeMOKCj.cjs → build-widget-registry-CWQ0YvEy.cjs} +27 -27
- package/dist/{build-widget-registry-BZeMOKCj.cjs.map → build-widget-registry-CWQ0YvEy.cjs.map} +1 -1
- package/dist/index.cjs +55 -34
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts.map +1 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +55 -34
- package/dist/index.mjs.map +1 -1
- package/dist/styles/remote-widget-shadow.css +2 -2
- package/dist/{use-internal-link-WJcYzKsi.mjs → use-internal-link-CKMpGvvs.mjs} +2 -2
- package/dist/{use-internal-link-WJcYzKsi.mjs.map → use-internal-link-CKMpGvvs.mjs.map} +1 -1
- package/dist/{use-internal-link-BTIkbJYg.cjs → use-internal-link-IcDHjPGp.cjs} +2 -2
- package/dist/{use-internal-link-BTIkbJYg.cjs.map → use-internal-link-IcDHjPGp.cjs.map} +1 -1
- package/dist/{use-link-action-C32zrsI0.mjs → use-link-action-CtVnC_2G.mjs} +2 -2
- package/dist/{use-link-action-C32zrsI0.mjs.map → use-link-action-CtVnC_2G.mjs.map} +1 -1
- package/dist/{use-link-action-rBy0j6go.cjs → use-link-action-DzA9AQsE.cjs} +2 -2
- package/dist/{use-link-action-rBy0j6go.cjs.map → use-link-action-DzA9AQsE.cjs.map} +1 -1
- package/dist/{use-portal-card-add-3ds-flow-DhfOxgMV.mjs → use-portal-card-add-3ds-flow-BMHRmeuB.mjs} +3 -3
- package/dist/{use-portal-card-add-3ds-flow-DhfOxgMV.mjs.map → use-portal-card-add-3ds-flow-BMHRmeuB.mjs.map} +1 -1
- package/dist/{use-portal-card-add-3ds-flow-DUBFzvAB.cjs → use-portal-card-add-3ds-flow-BsSH1Xks.cjs} +3 -3
- package/dist/{use-portal-card-add-3ds-flow-DUBFzvAB.cjs.map → use-portal-card-add-3ds-flow-BsSH1Xks.cjs.map} +1 -1
- package/dist/utils/build-remote-widget-plugin-manifests.cjs +17 -17
- package/dist/utils/build-remote-widget-plugin-manifests.mjs +17 -17
- package/dist/utils/build-widget-registry.cjs +17 -17
- package/dist/utils/build-widget-registry.mjs +17 -17
- package/package.json +19 -19
- package/dist/CatchUpWidget-BNEEQNcr.mjs.map +0 -1
- package/dist/CatchUpWidget-G4txAfv3.cjs.map +0 -1
- package/dist/WidgetInteractionContext-Ba_G5sDP.mjs.map +0 -1
- package/dist/WidgetInteractionContext-Bjy4P_YP.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VideoWidget-BhN4oTGG.cjs","names":["borderWidthClasses","borderColorClasses","MediaRenderer","useInternalLinks","Skeleton","getColorField","getBorderRadiusField","getBorderWidthField","getBorderColorField","getHeightField"],"sources":["../../widgets/src/lib/strip-html.ts","../../widgets/src/widgets/VideoWidget.tsx"],"sourcesContent":["const HTML_TAG_RE = /<[^>]+>/;\n\nexport function stripHtml(value: string): string {\n if (!HTML_TAG_RE.test(value)) return value;\n if (typeof DOMParser === \"undefined\") return value;\n const doc = new DOMParser().parseFromString(\n value.replace(/<[^>]*>/g, \" \"),\n \"text/html\",\n );\n return (doc.body.textContent ?? \"\").replace(/\\s+/g, \" \").trim();\n}\n","import type { ComponentProps, CSSProperties, ReactNode } from \"react\";\nimport type React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n borderColorClasses,\n borderWidthClasses,\n getBorderColorField,\n getBorderRadiusField,\n getBorderWidthField,\n getColorField,\n getHeightField,\n type WidgetPropertySchema,\n} from \"@fluid-app/portal-core/registries\";\nimport type {\n BorderRadiusOptions,\n BorderWidthOptions,\n ColorOptions,\n ShareableItem,\n} from \"@fluid-app/portal-core/types\";\nimport { Skeleton } from \"@fluid-app/ui-primitives\";\nimport { MediaRenderer } from \"../components/MediaRenderer\";\nimport { useInternalLinks } from \"../hooks/use-internal-link\";\nimport { stripHtml } from \"../lib/strip-html\";\n\nconst inlineVideoPlaybackAttributes = {\n playsInline: true,\n \"webkit-playsinline\": \"true\",\n} as const;\n\nconst VIDEO_MODAL_IFRAME_ALLOW =\n \"accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen\";\n\ntype VideoWidgetProps = ComponentProps<\"div\"> & {\n // Content\n src?: string;\n poster?: string;\n resource?: ShareableItem;\n useCustomUrl?: boolean;\n\n // Display\n displayMode?: \"inline\" | \"card\";\n borderRadius?: BorderRadiusOptions;\n borderWidth?: BorderWidthOptions;\n borderColor?: ColorOptions;\n verticalSizing?: \"auto\" | \"fixed\";\n fixedHeight?: string;\n displayFit?: \"cover\" | \"contain\";\n focusPoint?: string;\n\n // Native video behavior (inline mode)\n controls?: boolean;\n autoplay?: boolean;\n loop?: boolean;\n muted?: boolean;\n\n // Card mode — editorial frame + metadata\n editorialFrame?: boolean;\n frameColor?: ColorOptions;\n eyebrow?: string;\n tag?: string;\n title?: string;\n tagline?: string;\n duration?: string;\n author?: string;\n date?: string;\n showFullscreenPill?: boolean;\n\n // Card mode — modal CTAs\n primaryCtaText?: string;\n primaryCtaLink?: string;\n secondaryCtaText?: string;\n secondaryCtaLink?: string;\n};\n\nexport function VideoWidget({\n src = \"\",\n poster = \"\",\n resource,\n useCustomUrl,\n\n displayMode = \"inline\",\n borderRadius = \"md\",\n borderWidth = \"none\",\n borderColor = \"muted\",\n verticalSizing = \"auto\",\n fixedHeight = \"200px\",\n displayFit = \"cover\",\n focusPoint,\n\n controls = true,\n autoplay = false,\n loop = false,\n muted = true,\n\n editorialFrame = true,\n frameColor = \"foreground\",\n eyebrow,\n tag,\n title,\n tagline,\n duration,\n author,\n date,\n showFullscreenPill = true,\n\n primaryCtaText,\n primaryCtaLink,\n secondaryCtaText,\n secondaryCtaLink,\n}: VideoWidgetProps): React.JSX.Element {\n const effectiveSrc = useCustomUrl ? src : (resource?.videoUrl ?? src);\n const effectivePoster = useCustomUrl\n ? poster\n : (resource?.imageUrl ?? poster ?? undefined);\n\n if (displayMode === \"card\") {\n const resolvedTitle =\n typeof title === \"string\" && title.trim()\n ? title\n : (resource?.title ?? undefined);\n const resourceDescription =\n typeof resource?.description === \"string\"\n ? stripHtml(resource.description)\n : undefined;\n const resolvedTagline =\n typeof tagline === \"string\" && tagline.trim()\n ? tagline\n : resourceDescription;\n\n return (\n <VideoCard\n src={effectiveSrc}\n poster={effectivePoster ?? undefined}\n borderRadius={borderRadius}\n editorialFrame={editorialFrame}\n frameColor={frameColor}\n eyebrow={eyebrow}\n tag={tag}\n title={resolvedTitle}\n tagline={resolvedTagline}\n duration={duration}\n author={author}\n date={date}\n showFullscreenPill={showFullscreenPill}\n primaryCtaText={primaryCtaText}\n primaryCtaLink={primaryCtaLink}\n secondaryCtaText={secondaryCtaText}\n secondaryCtaLink={secondaryCtaLink}\n />\n );\n }\n\n const isFixed = verticalSizing === \"fixed\";\n const borderWidthClass = borderWidthClasses[borderWidth];\n const borderColorClass =\n borderWidth !== \"none\" ? borderColorClasses[borderColor] : \"\";\n\n return (\n <div\n className={`relative w-full overflow-hidden rounded-${borderRadius} ${borderWidthClass} ${borderColorClass}`}\n style={isFixed ? { height: fixedHeight } : undefined}\n >\n <MediaRenderer\n mediaType=\"video\"\n src={effectiveSrc}\n poster={effectivePoster}\n objectFit={isFixed ? displayFit : undefined}\n focusPoint={isFixed ? focusPoint : undefined}\n controls={controls}\n autoplay={autoplay}\n loop={loop}\n muted={muted}\n />\n </div>\n );\n}\n\ntype VideoCardProps = {\n src: string | undefined;\n poster: string | undefined;\n borderRadius: BorderRadiusOptions;\n editorialFrame: boolean;\n frameColor: ColorOptions;\n eyebrow: string | undefined;\n tag: string | undefined;\n title: string | undefined;\n tagline: string | undefined;\n duration: string | undefined;\n author: string | undefined;\n date: string | undefined;\n showFullscreenPill: boolean;\n primaryCtaText: string | undefined;\n primaryCtaLink: string | undefined;\n secondaryCtaText: string | undefined;\n secondaryCtaLink: string | undefined;\n};\n\nfunction useVideoPosterFallback(\n poster: string | undefined,\n embed: ParsedVideoSource,\n) {\n const resolvedPoster = poster || embed.thumbnail || \"\";\n const [posterSrc, setPosterSrc] = useState(resolvedPoster);\n\n useEffect(() => {\n setPosterSrc(resolvedPoster);\n }, [resolvedPoster]);\n\n const handlePosterError = useCallback(() => {\n if (embed.thumbnailFallback && posterSrc !== embed.thumbnailFallback) {\n setPosterSrc(embed.thumbnailFallback);\n }\n }, [embed.thumbnailFallback, posterSrc]);\n\n return { posterSrc, handlePosterError };\n}\n\nfunction VideoCard({\n src,\n poster,\n borderRadius,\n editorialFrame,\n frameColor,\n eyebrow,\n tag,\n title,\n tagline,\n duration,\n author,\n date,\n showFullscreenPill,\n primaryCtaText,\n primaryCtaLink,\n secondaryCtaText,\n secondaryCtaLink,\n}: VideoCardProps) {\n const [modalOpen, setModalOpen] = useState(false);\n const handleClose = useCallback(() => setModalOpen(false), []);\n\n const embed = parseVideoSource(src);\n const { posterSrc, handlePosterError } = useVideoPosterFallback(\n poster,\n embed,\n );\n\n const frameVar = `var(--color-${frameColor})`;\n const frameShadow = editorialFrame\n ? \"shadow-[0_1px_2px_rgba(15,23,42,0.04),0_30px_60px_-30px_rgba(15,23,42,0.4)]\"\n : \"\";\n const frameBg = editorialFrame ? `bg-${frameColor}` : \"\";\n\n const gradientTop: CSSProperties = {\n background: `linear-gradient(to top, ${frameVar}, color-mix(in oklch, ${frameVar} 55%, transparent), color-mix(in oklch, ${frameVar} 8%, transparent))`,\n };\n const gradientLeft: CSSProperties = {\n background: `linear-gradient(to right, color-mix(in oklch, ${frameVar} 70%, transparent), transparent)`,\n };\n\n return (\n <>\n <button\n type=\"button\"\n onClick={() => setModalOpen(true)}\n aria-label={title ? `Play video: ${title}` : \"Play video\"}\n className={`group relative block w-full overflow-hidden rounded-${borderRadius} ${frameBg} ${frameShadow} focus-visible:ring-primary text-left focus:outline-none focus-visible:ring-2`}\n >\n <div className=\"relative aspect-[16/9] w-full\">\n {posterSrc ? (\n <img\n src={posterSrc}\n alt={title ?? \"Video thumbnail\"}\n className=\"absolute inset-0 h-full w-full object-cover transition-transform duration-[700ms] group-hover:scale-[1.03]\"\n onError={handlePosterError}\n />\n ) : (\n <div className=\"bg-muted/30 absolute inset-0 flex items-center justify-center\">\n <PlayIcon size={40} filled />\n </div>\n )}\n\n {editorialFrame && (\n <>\n <div\n className=\"pointer-events-none absolute inset-0\"\n style={gradientTop}\n />\n <div\n className=\"pointer-events-none absolute inset-0\"\n style={gradientLeft}\n />\n </>\n )}\n\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <span\n className={`bg-${frameColor === \"foreground\" ? \"background\" : \"foreground\"} flex size-16 items-center justify-center rounded-full shadow-[0_12px_32px_-8px_rgba(255,255,255,0.35)] transition-transform duration-300 group-hover:scale-[1.08] group-active:scale-95`}\n style={{\n animation: \"fluidVideoPopIn 400ms ease-out 120ms both\",\n }}\n >\n <PlayIcon size={22} filled color={frameVar} />\n </span>\n </div>\n\n {showFullscreenPill && (\n <div className=\"absolute top-1/2 right-6 -translate-y-1/2 opacity-0 transition-opacity duration-300 group-hover:opacity-100\">\n <div\n className=\"flex items-center gap-1.5 rounded-full px-3 py-1.5 text-[11px] font-bold shadow-lg\"\n style={{\n backgroundColor: \"rgba(255,255,255,0.95)\",\n color: frameVar,\n }}\n >\n <MaximizeIcon size={12} />\n Full screen\n </div>\n </div>\n )}\n\n <div className=\"absolute inset-x-0 top-0 z-10 flex items-center justify-between p-5 sm:p-6\">\n {(eyebrow || tag) && (\n <div className=\"flex items-center gap-2\">\n <span\n className=\"flex size-5 items-center justify-center rounded-full backdrop-blur-sm\"\n style={{\n backgroundColor: \"rgba(255,255,255,0.15)\",\n boxShadow: \"inset 0 0 0 1px rgba(255,255,255,0.2)\",\n }}\n >\n <PlayIcon size={10} filled color=\"#fff\" marginLeft={1} />\n </span>\n {tag && (\n <span\n className=\"rounded-full px-2.5 py-1 text-[10px] font-bold tracking-[0.24em] text-white uppercase backdrop-blur-sm\"\n style={{\n backgroundColor: \"rgba(255,255,255,0.15)\",\n boxShadow: \"inset 0 0 0 1px rgba(255,255,255,0.2)\",\n }}\n >\n {tag}\n </span>\n )}\n {eyebrow && (\n <span\n className=\"text-[10px] font-bold tracking-[0.24em] uppercase\"\n style={{ color: \"rgba(255,255,255,0.85)\" }}\n >\n {eyebrow}\n </span>\n )}\n </div>\n )}\n\n {duration && (\n <span\n className=\"flex items-center gap-1.5 rounded-full px-2.5 py-1 font-mono text-[10px] font-bold text-white tabular-nums backdrop-blur-sm\"\n style={{\n backgroundColor: \"rgba(255,255,255,0.1)\",\n boxShadow: \"inset 0 0 0 1px rgba(255,255,255,0.15)\",\n }}\n >\n <ClockIcon size={10} />\n {duration}\n </span>\n )}\n </div>\n\n {(title || tagline || author || date) && (\n <div className=\"absolute inset-x-0 bottom-0 z-10 flex flex-col p-5 sm:p-6\">\n {title && (\n <h3 className=\"text-[22px] leading-[1.18] font-bold tracking-[-0.015em] text-white sm:text-[24px]\">\n {title}\n </h3>\n )}\n {tagline && (\n <p\n className=\"mt-1.5 max-w-[520px] text-[12.5px] leading-[1.55]\"\n style={{ color: \"rgba(255,255,255,0.7)\" }}\n >\n {tagline}\n </p>\n )}\n {(author || date) && (\n <div\n className=\"mt-3 flex items-center gap-2 text-[10px] font-bold tracking-[0.16em] uppercase\"\n style={{ color: \"rgba(255,255,255,0.6)\" }}\n >\n {author && <span>{author}</span>}\n {author && date && (\n <span\n className=\"size-0.5 rounded-full\"\n style={{ backgroundColor: \"rgba(255,255,255,0.3)\" }}\n />\n )}\n {date && <span>{date}</span>}\n </div>\n )}\n </div>\n )}\n </div>\n </button>\n\n {modalOpen && (\n <VideoModal\n src={src}\n embed={embed}\n title={title}\n frameColor={frameColor}\n onClose={handleClose}\n primaryCtaText={primaryCtaText}\n primaryCtaLink={primaryCtaLink}\n secondaryCtaText={secondaryCtaText}\n secondaryCtaLink={secondaryCtaLink}\n />\n )}\n </>\n );\n}\n\ntype VideoModalProps = {\n src: string | undefined;\n embed: ParsedVideoSource;\n title: string | undefined;\n frameColor: ColorOptions;\n onClose: () => void;\n primaryCtaText: string | undefined;\n primaryCtaLink: string | undefined;\n secondaryCtaText: string | undefined;\n secondaryCtaLink: string | undefined;\n};\n\ntype VideoModalPlaybackState = {\n loading: boolean;\n loadFailed: boolean;\n mediaKey: number;\n reloadMedia: () => void;\n handleMediaLoaded: () => void;\n handleMediaError: () => void;\n};\n\nfunction useVideoModalPlaybackState({\n src,\n embedUrl,\n isMissingDirectVideo,\n}: {\n src: string | undefined;\n embedUrl: string | undefined;\n isMissingDirectVideo: boolean;\n}): VideoModalPlaybackState {\n const [loading, setLoading] = useState(!isMissingDirectVideo);\n const [loadFailed, setLoadFailed] = useState(isMissingDirectVideo);\n const [mediaKey, setMediaKey] = useState(0);\n\n const resetLoadState = useCallback(() => {\n setLoading(!isMissingDirectVideo);\n setLoadFailed(isMissingDirectVideo);\n }, [isMissingDirectVideo]);\n\n useEffect(() => {\n resetLoadState();\n }, [resetLoadState, src, embedUrl]);\n\n const reloadMedia = useCallback(() => {\n setMediaKey((key) => key + 1);\n resetLoadState();\n }, [resetLoadState]);\n\n const handleMediaLoaded = useCallback(() => {\n setLoading(false);\n }, []);\n\n const handleMediaError = useCallback(() => {\n setLoading(false);\n setLoadFailed(true);\n }, []);\n\n return {\n loading,\n loadFailed,\n mediaKey,\n reloadMedia,\n handleMediaLoaded,\n handleMediaError,\n };\n}\n\nfunction useVideoModalLifecycle(\n onClose: () => void,\n dialogRef: React.RefObject<HTMLDivElement | null>,\n): void {\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [onClose]);\n\n useEffect(() => {\n const { overflow } = document.body.style;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = overflow;\n };\n }, []);\n\n useEffect(() => {\n const previouslyFocused =\n document.activeElement instanceof HTMLElement\n ? document.activeElement\n : null;\n dialogRef.current?.focus();\n return () => {\n previouslyFocused?.focus();\n };\n }, [dialogRef]);\n}\n\nfunction VideoModal({\n src,\n embed,\n title,\n frameColor,\n onClose,\n primaryCtaText,\n primaryCtaLink,\n secondaryCtaText,\n secondaryCtaLink,\n}: VideoModalProps) {\n const directSrc = src?.trim();\n const isMissingDirectVideo = embed.source === \"direct\" && !directSrc;\n const dialogRef = useRef<HTMLDivElement>(null);\n const {\n loading,\n loadFailed,\n mediaKey,\n reloadMedia,\n handleMediaLoaded,\n handleMediaError,\n } = useVideoModalPlaybackState({\n src,\n embedUrl: embed.embedUrl,\n isMissingDirectVideo,\n });\n\n useVideoModalLifecycle(onClose, dialogRef);\n\n const resolveInternalLink = useInternalLinks();\n const primaryCta = resolveInternalLink(primaryCtaLink);\n const secondaryCta = resolveInternalLink(secondaryCtaLink);\n\n const frameVar = `var(--color-${frameColor})`;\n const backdropStyle: CSSProperties = {\n backgroundColor: `color-mix(in oklch, ${frameVar} 85%, transparent)`,\n backdropFilter: \"blur(12px)\",\n WebkitBackdropFilter: \"blur(12px)\",\n };\n\n // Portal to document.body so the fixed-position dialog isn't clipped by\n // a transformed widget container on the live canvas (CSS transforms make\n // descendants the containing block for `position: fixed`).\n return createPortal(\n <div\n ref={dialogRef}\n tabIndex={-1}\n className=\"fixed inset-0 z-[9999] flex items-center justify-center p-4 focus:outline-none sm:p-8\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={title ?? \"Video player\"}\n >\n <div\n className=\"absolute inset-0\"\n style={backdropStyle}\n onClick={onClose}\n aria-hidden=\"true\"\n />\n\n <div\n className={`bg-${frameColor} relative z-10 flex max-h-full w-full max-w-5xl flex-col overflow-hidden rounded-2xl shadow-[0_40px_80px_-20px_rgba(0,0,0,0.6)]`}\n >\n <div\n className=\"flex items-center justify-between gap-3 px-4 py-3\"\n style={{ borderBottom: \"1px solid rgba(255,255,255,0.1)\" }}\n >\n <div className=\"flex items-center gap-3\">\n {embed.source !== \"direct\" && (\n <span\n className=\"flex size-9 items-center justify-center rounded-full\"\n style={{\n background: embed.iconGradient ?? \"var(--color-primary)\",\n }}\n >\n <PlayIcon size={16} filled color=\"#fff\" marginLeft={2} />\n </span>\n )}\n {title && (\n <span className=\"line-clamp-1 text-[13px] font-bold text-white\">\n {title}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-1\">\n <ToolbarButton label=\"Refresh\" onClick={reloadMedia}>\n <RefreshIcon size={14} />\n </ToolbarButton>\n {embed.watchUrl && (\n <ToolbarButton\n label=\"Open externally\"\n asLink\n href={embed.watchUrl}\n >\n <ExternalIcon size={14} />\n </ToolbarButton>\n )}\n <ToolbarButton label=\"Close\" onClick={onClose}>\n <CloseIcon size={14} />\n </ToolbarButton>\n </div>\n </div>\n\n <div className={`bg-${frameColor} relative w-full`}>\n <div className=\"relative aspect-video w-full\">\n {loading && (\n <Skeleton className=\"absolute inset-0 size-full rounded-none\" />\n )}\n\n {loadFailed ? (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <p\n className=\"text-sm\"\n style={{ color: \"rgba(255,255,255,0.7)\" }}\n >\n Unable to load video.\n </p>\n </div>\n ) : embed.source === \"direct\" ? (\n <video\n key={mediaKey}\n src={directSrc}\n controls\n preload=\"metadata\"\n {...inlineVideoPlaybackAttributes}\n className=\"absolute inset-0 h-full w-full\"\n onLoadedData={handleMediaLoaded}\n onError={handleMediaError}\n >\n Your browser does not support the video tag.\n </video>\n ) : embed.embedUrl ? (\n <iframe\n key={mediaKey}\n src={embed.embedUrl}\n title={title ?? \"Video\"}\n className=\"absolute inset-0 h-full w-full border-0\"\n allow={VIDEO_MODAL_IFRAME_ALLOW}\n allowFullScreen\n onLoad={handleMediaLoaded}\n />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <p\n className=\"text-sm\"\n style={{ color: \"rgba(255,255,255,0.7)\" }}\n >\n Unable to load video.\n </p>\n </div>\n )}\n </div>\n </div>\n\n {((primaryCtaText && primaryCtaLink) ||\n (secondaryCtaText && secondaryCtaLink)) && (\n <div\n className=\"flex items-center justify-end gap-3 px-4 py-3\"\n style={{ borderTop: \"1px solid rgba(255,255,255,0.1)\" }}\n >\n {secondaryCtaText && secondaryCtaLink && (\n <a\n href={secondaryCtaLink}\n onClick={(e) => {\n if (secondaryCta.followInternally(e)) onClose();\n }}\n className=\"inline-flex items-center gap-1.5 rounded-full px-4 py-2 text-[12px] font-bold transition-colors\"\n style={{ color: \"rgba(255,255,255,0.75)\" }}\n >\n {secondaryCtaText}\n </a>\n )}\n {primaryCtaText && primaryCtaLink && (\n <a\n href={primaryCtaLink}\n onClick={(e) => {\n // An in-app navigation leaves the modal covering the screen it\n // navigated to, so close it — but not when the browser is\n // taking the link somewhere else and this tab stays put.\n if (primaryCta.followInternally(e)) onClose();\n }}\n className={`text-${frameColor} inline-flex items-center gap-1.5 rounded-full bg-white px-5 py-2 text-[13px] font-bold shadow-[0_8px_22px_-8px_rgba(255,255,255,0.4)] transition-transform hover:scale-[1.02]`}\n >\n {primaryCtaText}\n <span aria-hidden=\"true\">→</span>\n </a>\n )}\n </div>\n )}\n </div>\n </div>,\n document.body,\n );\n}\n\ntype ToolbarButtonProps = {\n label: string;\n onClick?: () => void;\n asLink?: boolean;\n href?: string;\n children: ReactNode;\n};\n\nfunction ToolbarButton({\n label,\n onClick,\n asLink,\n href,\n children,\n}: ToolbarButtonProps) {\n const className =\n \"flex size-9 items-center justify-center rounded-full transition-colors hover:text-white\";\n const style: CSSProperties = { color: \"rgba(255,255,255,0.7)\" };\n\n if (asLink && href) {\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={label}\n className={className}\n style={style}\n >\n {children}\n </a>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={label}\n className={className}\n style={style}\n >\n {children}\n </button>\n );\n}\n\ntype ParsedVideoSource = {\n source: \"youtube\" | \"vimeo\" | \"direct\";\n embedUrl?: string;\n watchUrl?: string;\n thumbnail?: string;\n thumbnailFallback?: string;\n accent?: string;\n iconGradient?: string;\n};\n\nfunction parseVideoSource(src: string | undefined): ParsedVideoSource {\n if (!src) return { source: \"direct\" };\n const url = src.trim();\n\n const youtubeId = extractYouTubeId(url);\n if (youtubeId) {\n // maxresdefault only exists for videos uploaded at >=720p; hqdefault\n // always exists. Try max first, fall back via the <img> onError handler.\n return {\n source: \"youtube\",\n embedUrl: `https://www.youtube.com/embed/${youtubeId}?autoplay=0&playsinline=1&rel=0`,\n watchUrl: `https://www.youtube.com/watch?v=${youtubeId}`,\n thumbnail: `https://i.ytimg.com/vi/${youtubeId}/maxresdefault.jpg`,\n thumbnailFallback: `https://i.ytimg.com/vi/${youtubeId}/hqdefault.jpg`,\n accent: \"#FF0033\",\n iconGradient: \"linear-gradient(135deg, #FF0033 0%, #CC0022 100%)\",\n };\n }\n\n const vimeoId = extractVimeoId(url);\n if (vimeoId) {\n return {\n source: \"vimeo\",\n embedUrl: `https://player.vimeo.com/video/${vimeoId}?autoplay=0&playsinline=1`,\n watchUrl: `https://vimeo.com/${vimeoId}`,\n accent: \"#1AB7EA\",\n iconGradient: \"linear-gradient(135deg, #1AB7EA 0%, #0D8BBA 100%)\",\n };\n }\n\n return { source: \"direct\" };\n}\n\nfunction extractYouTubeId(url: string): string | undefined {\n const normalizeId = (value: string | null | undefined) =>\n value && /^[a-zA-Z0-9_-]{11}$/.test(value) ? value : undefined;\n\n try {\n const parsed = new URL(url);\n const hostname = parsed.hostname.replace(/^www\\./, \"\").toLowerCase();\n const pathParts = parsed.pathname.split(\"/\").filter(Boolean);\n\n if (hostname === \"youtu.be\") {\n return normalizeId(pathParts[0]);\n }\n\n const isYouTubeHost =\n hostname === \"youtube.com\" ||\n hostname.endsWith(\".youtube.com\") ||\n hostname === \"youtube-nocookie.com\" ||\n hostname.endsWith(\".youtube-nocookie.com\");\n\n if (isYouTubeHost) {\n const watchId = normalizeId(parsed.searchParams.get(\"v\"));\n if (watchId) return watchId;\n\n if (\n (pathParts[0] === \"embed\" || pathParts[0] === \"shorts\") &&\n pathParts[1]\n ) {\n return normalizeId(pathParts[1]);\n }\n }\n } catch {\n // Fall back to regexes for protocol-less URLs and other loose input.\n }\n\n const patterns = [\n /youtube\\.com\\/watch.*[?&]v=([a-zA-Z0-9_-]{11})/,\n /youtu\\.be\\/([a-zA-Z0-9_-]{11})/,\n /youtube\\.com\\/embed\\/([a-zA-Z0-9_-]{11})/,\n /youtube\\.com\\/shorts\\/([a-zA-Z0-9_-]{11})/,\n ];\n for (const pattern of patterns) {\n const match = pattern.exec(url);\n const youtubeId = normalizeId(match?.[1]);\n if (youtubeId) return youtubeId;\n }\n return undefined;\n}\n\nfunction extractVimeoId(url: string): string | undefined {\n const patterns = [\n /vimeo\\.com\\/(?:video\\/)?(\\d{6,})/,\n /player\\.vimeo\\.com\\/video\\/(\\d{6,})/,\n ];\n for (const pattern of patterns) {\n const match = pattern.exec(url);\n if (match?.[1]) return match[1];\n }\n return undefined;\n}\n\ntype IconProps = {\n size: number;\n color?: string;\n filled?: boolean;\n marginLeft?: number;\n};\n\nfunction PlayIcon({ size, color, filled, marginLeft }: IconProps) {\n const style: CSSProperties = {};\n if (color) style.color = color;\n if (marginLeft) style.marginLeft = `${marginLeft}px`;\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill={filled ? \"currentColor\" : \"none\"}\n stroke=\"currentColor\"\n strokeWidth={filled ? 0 : 2.5}\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n style={style}\n >\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n );\n}\n\nfunction ClockIcon({ size }: { size: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n );\n}\n\nfunction MaximizeIcon({ size }: { size: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"15 3 21 3 21 9\" />\n <polyline points=\"9 21 3 21 3 15\" />\n <line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\" />\n <line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\" />\n </svg>\n );\n}\n\nfunction RefreshIcon({ size }: { size: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"23 4 23 10 17 10\" />\n <polyline points=\"1 20 1 14 7 14\" />\n <path d=\"M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15\" />\n </svg>\n );\n}\n\nfunction ExternalIcon({ size }: { size: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n <polyline points=\"15 3 21 3 21 9\" />\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\n </svg>\n );\n}\n\nfunction CloseIcon({ size }: { size: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n\nexport const videoWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"VideoWidget\",\n displayName: \"Video\",\n tabsConfig: [\n { id: \"styling\", label: \"Styling\" },\n { id: \"behavior\", label: \"Behavior\" },\n ],\n fields: [\n // Content group\n {\n key: \"resource\",\n label: \"Select Video\",\n type: \"image\",\n accept: \"video\",\n description: \"Browse and select a video\",\n tab: \"styling\",\n group: \"Content\",\n },\n {\n key: \"useCustomUrl\",\n label: \"Use Custom URL\",\n type: \"boolean\",\n description: \"Enter a custom video URL instead of selecting media.\",\n defaultValue: false,\n tab: \"styling\",\n group: \"Content\",\n },\n {\n key: \"src\",\n label: \"Video URL\",\n type: \"text\",\n description:\n \"Direct video URL for inline mode. Card mode supports YouTube, Vimeo, and direct video URLs.\",\n defaultValue: \"\",\n tab: \"styling\",\n group: \"Content\",\n requiresKeyToBeTrue: \"useCustomUrl\",\n },\n {\n key: \"poster\",\n label: \"Poster Image URL\",\n type: \"text\",\n description:\n \"Thumbnail shown before play. Card mode can auto-derive YouTube thumbnails; add a poster for Vimeo URLs.\",\n defaultValue: \"\",\n tab: \"styling\",\n group: \"Content\",\n requiresKeyToBeTrue: \"useCustomUrl\",\n },\n\n // Display Mode group (new)\n {\n key: \"displayMode\",\n label: \"Display Mode\",\n type: \"buttonGroup\",\n description:\n \"Inline: native player embedded in the page. Card: premium thumbnail that opens a modal.\",\n options: [\n { label: \"Inline\", value: \"inline\" },\n { label: \"Card\", value: \"card\" },\n ],\n defaultValue: \"inline\",\n tab: \"styling\",\n group: \"Display Mode\",\n },\n\n // Card metadata group\n {\n key: \"title\",\n label: \"Title\",\n type: \"text\",\n description: \"Headline on the card thumbnail (card mode only).\",\n defaultValue: \"\",\n tab: \"styling\",\n group: \"Card Content\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n {\n key: \"tagline\",\n label: \"Tagline\",\n type: \"textarea\",\n description: \"Short body line under the title.\",\n defaultValue: \"\",\n rows: 2,\n tab: \"styling\",\n group: \"Card Content\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n {\n key: \"eyebrow\",\n label: \"Eyebrow\",\n type: \"text\",\n description:\n \"Small label above the card (e.g. 'Training · Fluid Academy').\",\n defaultValue: \"\",\n tab: \"styling\",\n group: \"Card Content\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n {\n key: \"tag\",\n label: \"Tag\",\n type: \"text\",\n description: \"Optional pill label.\",\n defaultValue: \"\",\n tab: \"styling\",\n group: \"Card Content\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n {\n key: \"duration\",\n label: \"Duration\",\n type: \"text\",\n description: \"Runtime (e.g. '4:52' or '1:09:30'). Shown as a chip.\",\n defaultValue: \"\",\n tab: \"styling\",\n group: \"Card Content\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n {\n key: \"author\",\n label: \"Author / Instructor\",\n type: \"text\",\n description: \"Meta line author.\",\n defaultValue: \"\",\n tab: \"styling\",\n group: \"Card Content\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n {\n key: \"date\",\n label: \"Date\",\n type: \"text\",\n description: \"Meta line date (e.g. 'Apr 12').\",\n defaultValue: \"\",\n tab: \"styling\",\n group: \"Card Content\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n\n // Card frame group\n {\n key: \"editorialFrame\",\n label: \"Editorial Frame\",\n type: \"boolean\",\n description:\n \"Premium dark canvas with layered shadow and dual gradient overlays.\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Card Frame\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n getColorField({\n defaultValue: \"foreground\",\n key: \"frameColor\",\n label: \"Frame Color\",\n description: \"Surface color for the card and modal.\",\n tab: \"styling\",\n group: \"Card Frame\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n }),\n {\n key: \"showFullscreenPill\",\n label: \"Show Fullscreen Pill\",\n type: \"boolean\",\n description: \"Show the 'Full screen' hover hint on the card.\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Card Frame\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n\n // Card modal CTAs group\n {\n key: \"primaryCtaText\",\n label: \"Primary CTA Text\",\n type: \"text\",\n description: \"Primary button in the modal footer (optional).\",\n defaultValue: \"\",\n tab: \"styling\",\n group: \"Modal CTAs\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n {\n key: \"primaryCtaLink\",\n label: \"Primary CTA Link\",\n type: \"text\",\n description: \"URL for the primary CTA.\",\n defaultValue: \"\",\n tab: \"styling\",\n group: \"Modal CTAs\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n {\n key: \"secondaryCtaText\",\n label: \"Secondary CTA Text\",\n type: \"text\",\n description: \"Secondary (ghost) button in the modal footer (optional).\",\n defaultValue: \"\",\n tab: \"styling\",\n group: \"Modal CTAs\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n {\n key: \"secondaryCtaLink\",\n label: \"Secondary CTA Link\",\n type: \"text\",\n description: \"URL for the secondary CTA.\",\n defaultValue: \"\",\n tab: \"styling\",\n group: \"Modal CTAs\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n\n // Inline design group (existing)\n getBorderRadiusField({\n key: \"borderRadius\",\n label: \"Border Radius\",\n description: \"Border radius for the video container\",\n defaultValue: \"md\",\n tab: \"styling\",\n group: \"Design\",\n }),\n getBorderWidthField({\n key: \"borderWidth\",\n label: \"Border Width\",\n description: \"Border width for the widget\",\n defaultValue: \"none\",\n tab: \"styling\",\n group: \"Design\",\n }),\n getBorderColorField({\n key: \"borderColor\",\n label: \"Border Color\",\n description: \"Border color for the widget\",\n defaultValue: \"muted\",\n tab: \"styling\",\n group: \"Design\",\n }),\n {\n key: \"verticalSizing\",\n label: \"Vertical Sizing\",\n type: \"buttonGroup\",\n description: \"How the video height is determined (inline mode only)\",\n options: [\n { label: \"Auto\", value: \"auto\" },\n { label: \"Fixed\", value: \"fixed\" },\n ],\n defaultValue: \"auto\",\n tab: \"styling\",\n group: \"Design\",\n requiresKeyValue: { key: \"displayMode\", value: \"inline\" },\n },\n getHeightField({\n key: \"fixedHeight\",\n label: \"Height\",\n description: \"Fixed height of the video container\",\n defaultValue: \"200px\",\n tab: \"styling\",\n group: \"Design\",\n requiresKeyValue: { key: \"verticalSizing\", value: \"fixed\" },\n }),\n {\n key: \"displayFit\",\n label: \"Display Fit\",\n type: \"buttonGroup\",\n description: \"How the video fills its container\",\n options: [\n { label: \"Cover\", value: \"cover\" },\n { label: \"Contain\", value: \"contain\" },\n ],\n defaultValue: \"cover\",\n tab: \"styling\",\n group: \"Design\",\n requiresKeyValue: { key: \"verticalSizing\", value: \"fixed\" },\n },\n {\n key: \"focusPoint\",\n label: \"Focus Point\",\n type: \"contentPosition\",\n description: \"The focal point of the video within its container\",\n defaultValue: \"center\",\n tab: \"styling\",\n group: \"Design\",\n requiresKeyValue: { key: \"verticalSizing\", value: \"fixed\" },\n },\n\n // Behavior tab (inline only)\n {\n key: \"controls\",\n label: \"Show Controls\",\n type: \"boolean\",\n description:\n \"Display video playback controls (inline mode only — card mode always shows controls in the modal).\",\n defaultValue: true,\n tab: \"behavior\",\n group: \"Behavior\",\n requiresKeyValue: { key: \"displayMode\", value: \"inline\" },\n },\n {\n key: \"autoplay\",\n label: \"Autoplay\",\n type: \"boolean\",\n description: \"Automatically start playing the video\",\n defaultValue: false,\n tab: \"behavior\",\n group: \"Behavior\",\n requiresKeyValue: { key: \"displayMode\", value: \"inline\" },\n },\n {\n key: \"loop\",\n label: \"Loop\",\n type: \"boolean\",\n description: \"Repeat the video when it ends\",\n defaultValue: false,\n tab: \"behavior\",\n group: \"Behavior\",\n requiresKeyValue: { key: \"displayMode\", value: \"inline\" },\n },\n {\n key: \"muted\",\n label: \"Muted\",\n type: \"boolean\",\n description: \"Start with audio muted\",\n defaultValue: true,\n tab: \"behavior\",\n group: \"Behavior\",\n requiresKeyValue: { key: \"displayMode\", value: \"inline\" },\n },\n ],\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VideoWidget-bf-gkCfx.cjs","names":["borderWidthClasses","borderColorClasses","MediaRenderer","useInternalLinks","Skeleton","getColorField","getBorderRadiusField","getBorderWidthField","getBorderColorField","getHeightField"],"sources":["../../widgets/src/lib/strip-html.ts","../../widgets/src/widgets/VideoWidget.tsx"],"sourcesContent":["const HTML_TAG_RE = /<[^>]+>/;\n\nexport function stripHtml(value: string): string {\n if (!HTML_TAG_RE.test(value)) return value;\n if (typeof DOMParser === \"undefined\") return value;\n const doc = new DOMParser().parseFromString(\n value.replace(/<[^>]*>/g, \" \"),\n \"text/html\",\n );\n return (doc.body.textContent ?? \"\").replace(/\\s+/g, \" \").trim();\n}\n","import type { ComponentProps, CSSProperties, ReactNode } from \"react\";\nimport type React from \"react\";\nimport { useCallback, useEffect, useRef, useState } from \"react\";\nimport { createPortal } from \"react-dom\";\nimport {\n borderColorClasses,\n borderWidthClasses,\n getBorderColorField,\n getBorderRadiusField,\n getBorderWidthField,\n getColorField,\n getHeightField,\n type WidgetPropertySchema,\n} from \"@fluid-app/portal-core/registries\";\nimport type {\n BorderRadiusOptions,\n BorderWidthOptions,\n ColorOptions,\n ShareableItem,\n} from \"@fluid-app/portal-core/types\";\nimport { Skeleton } from \"@fluid-app/ui-primitives\";\nimport { MediaRenderer } from \"../components/MediaRenderer\";\nimport { useInternalLinks } from \"../hooks/use-internal-link\";\nimport { stripHtml } from \"../lib/strip-html\";\n\nconst inlineVideoPlaybackAttributes = {\n playsInline: true,\n \"webkit-playsinline\": \"true\",\n} as const;\n\nconst VIDEO_MODAL_IFRAME_ALLOW =\n \"accelerometer; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen\";\n\ntype VideoWidgetProps = ComponentProps<\"div\"> & {\n // Content\n src?: string;\n poster?: string;\n resource?: ShareableItem;\n useCustomUrl?: boolean;\n\n // Display\n displayMode?: \"inline\" | \"card\";\n borderRadius?: BorderRadiusOptions;\n borderWidth?: BorderWidthOptions;\n borderColor?: ColorOptions;\n verticalSizing?: \"auto\" | \"fixed\";\n fixedHeight?: string;\n displayFit?: \"cover\" | \"contain\";\n focusPoint?: string;\n\n // Native video behavior (inline mode)\n controls?: boolean;\n autoplay?: boolean;\n loop?: boolean;\n muted?: boolean;\n\n // Card mode — editorial frame + metadata\n editorialFrame?: boolean;\n frameColor?: ColorOptions;\n eyebrow?: string;\n tag?: string;\n title?: string;\n tagline?: string;\n duration?: string;\n author?: string;\n date?: string;\n showFullscreenPill?: boolean;\n\n // Card mode — modal CTAs\n primaryCtaText?: string;\n primaryCtaLink?: string;\n secondaryCtaText?: string;\n secondaryCtaLink?: string;\n};\n\nexport function VideoWidget({\n src = \"\",\n poster = \"\",\n resource,\n useCustomUrl,\n\n displayMode = \"inline\",\n borderRadius = \"md\",\n borderWidth = \"none\",\n borderColor = \"muted\",\n verticalSizing = \"auto\",\n fixedHeight = \"200px\",\n displayFit = \"cover\",\n focusPoint,\n\n controls = true,\n autoplay = false,\n loop = false,\n muted = true,\n\n editorialFrame = true,\n frameColor = \"foreground\",\n eyebrow,\n tag,\n title,\n tagline,\n duration,\n author,\n date,\n showFullscreenPill = true,\n\n primaryCtaText,\n primaryCtaLink,\n secondaryCtaText,\n secondaryCtaLink,\n}: VideoWidgetProps): React.JSX.Element {\n const effectiveSrc = useCustomUrl ? src : (resource?.videoUrl ?? src);\n const effectivePoster = useCustomUrl\n ? poster\n : (resource?.imageUrl ?? poster ?? undefined);\n\n if (displayMode === \"card\") {\n const resolvedTitle =\n typeof title === \"string\" && title.trim()\n ? title\n : (resource?.title ?? undefined);\n const resourceDescription =\n typeof resource?.description === \"string\"\n ? stripHtml(resource.description)\n : undefined;\n const resolvedTagline =\n typeof tagline === \"string\" && tagline.trim()\n ? tagline\n : resourceDescription;\n\n return (\n <VideoCard\n src={effectiveSrc}\n poster={effectivePoster ?? undefined}\n borderRadius={borderRadius}\n editorialFrame={editorialFrame}\n frameColor={frameColor}\n eyebrow={eyebrow}\n tag={tag}\n title={resolvedTitle}\n tagline={resolvedTagline}\n duration={duration}\n author={author}\n date={date}\n showFullscreenPill={showFullscreenPill}\n primaryCtaText={primaryCtaText}\n primaryCtaLink={primaryCtaLink}\n secondaryCtaText={secondaryCtaText}\n secondaryCtaLink={secondaryCtaLink}\n />\n );\n }\n\n const isFixed = verticalSizing === \"fixed\";\n const borderWidthClass = borderWidthClasses[borderWidth];\n const borderColorClass =\n borderWidth !== \"none\" ? borderColorClasses[borderColor] : \"\";\n\n return (\n <div\n className={`relative w-full overflow-hidden rounded-${borderRadius} ${borderWidthClass} ${borderColorClass}`}\n style={isFixed ? { height: fixedHeight } : undefined}\n >\n <MediaRenderer\n mediaType=\"video\"\n src={effectiveSrc}\n poster={effectivePoster}\n objectFit={isFixed ? displayFit : undefined}\n focusPoint={isFixed ? focusPoint : undefined}\n controls={controls}\n autoplay={autoplay}\n loop={loop}\n muted={muted}\n />\n </div>\n );\n}\n\ntype VideoCardProps = {\n src: string | undefined;\n poster: string | undefined;\n borderRadius: BorderRadiusOptions;\n editorialFrame: boolean;\n frameColor: ColorOptions;\n eyebrow: string | undefined;\n tag: string | undefined;\n title: string | undefined;\n tagline: string | undefined;\n duration: string | undefined;\n author: string | undefined;\n date: string | undefined;\n showFullscreenPill: boolean;\n primaryCtaText: string | undefined;\n primaryCtaLink: string | undefined;\n secondaryCtaText: string | undefined;\n secondaryCtaLink: string | undefined;\n};\n\nfunction useVideoPosterFallback(\n poster: string | undefined,\n embed: ParsedVideoSource,\n) {\n const resolvedPoster = poster || embed.thumbnail || \"\";\n const [posterSrc, setPosterSrc] = useState(resolvedPoster);\n\n useEffect(() => {\n setPosterSrc(resolvedPoster);\n }, [resolvedPoster]);\n\n const handlePosterError = useCallback(() => {\n if (embed.thumbnailFallback && posterSrc !== embed.thumbnailFallback) {\n setPosterSrc(embed.thumbnailFallback);\n }\n }, [embed.thumbnailFallback, posterSrc]);\n\n return { posterSrc, handlePosterError };\n}\n\nfunction VideoCard({\n src,\n poster,\n borderRadius,\n editorialFrame,\n frameColor,\n eyebrow,\n tag,\n title,\n tagline,\n duration,\n author,\n date,\n showFullscreenPill,\n primaryCtaText,\n primaryCtaLink,\n secondaryCtaText,\n secondaryCtaLink,\n}: VideoCardProps) {\n const [modalOpen, setModalOpen] = useState(false);\n const handleClose = useCallback(() => setModalOpen(false), []);\n\n const embed = parseVideoSource(src);\n const { posterSrc, handlePosterError } = useVideoPosterFallback(\n poster,\n embed,\n );\n\n const frameVar = `var(--color-${frameColor})`;\n const frameShadow = editorialFrame\n ? \"shadow-[0_1px_2px_rgba(15,23,42,0.04),0_30px_60px_-30px_rgba(15,23,42,0.4)]\"\n : \"\";\n const frameBg = editorialFrame ? `bg-${frameColor}` : \"\";\n\n const gradientTop: CSSProperties = {\n background: `linear-gradient(to top, ${frameVar}, color-mix(in oklch, ${frameVar} 55%, transparent), color-mix(in oklch, ${frameVar} 8%, transparent))`,\n };\n const gradientLeft: CSSProperties = {\n background: `linear-gradient(to right, color-mix(in oklch, ${frameVar} 70%, transparent), transparent)`,\n };\n\n return (\n <>\n <button\n type=\"button\"\n onClick={() => setModalOpen(true)}\n aria-label={title ? `Play video: ${title}` : \"Play video\"}\n className={`group relative block w-full overflow-hidden rounded-${borderRadius} ${frameBg} ${frameShadow} focus-visible:ring-primary text-left focus:outline-none focus-visible:ring-2`}\n >\n <div className=\"relative aspect-[16/9] w-full\">\n {posterSrc ? (\n <img\n src={posterSrc}\n alt={title ?? \"Video thumbnail\"}\n className=\"absolute inset-0 h-full w-full object-cover transition-transform duration-[700ms] group-hover:scale-[1.03]\"\n onError={handlePosterError}\n />\n ) : (\n <div className=\"bg-muted/30 absolute inset-0 flex items-center justify-center\">\n <PlayIcon size={40} filled />\n </div>\n )}\n\n {editorialFrame && (\n <>\n <div\n className=\"pointer-events-none absolute inset-0\"\n style={gradientTop}\n />\n <div\n className=\"pointer-events-none absolute inset-0\"\n style={gradientLeft}\n />\n </>\n )}\n\n <div className=\"pointer-events-none absolute inset-0 flex items-center justify-center\">\n <span\n className={`bg-${frameColor === \"foreground\" ? \"background\" : \"foreground\"} flex size-16 items-center justify-center rounded-full shadow-[0_12px_32px_-8px_rgba(255,255,255,0.35)] transition-transform duration-300 group-hover:scale-[1.08] group-active:scale-95`}\n style={{\n animation: \"fluidVideoPopIn 400ms ease-out 120ms both\",\n }}\n >\n <PlayIcon size={22} filled color={frameVar} />\n </span>\n </div>\n\n {showFullscreenPill && (\n <div className=\"absolute top-1/2 right-6 -translate-y-1/2 opacity-0 transition-opacity duration-300 group-hover:opacity-100\">\n <div\n className=\"flex items-center gap-1.5 rounded-full px-3 py-1.5 text-[11px] font-bold shadow-lg\"\n style={{\n backgroundColor: \"rgba(255,255,255,0.95)\",\n color: frameVar,\n }}\n >\n <MaximizeIcon size={12} />\n Full screen\n </div>\n </div>\n )}\n\n <div className=\"absolute inset-x-0 top-0 z-10 flex items-center justify-between p-5 sm:p-6\">\n {(eyebrow || tag) && (\n <div className=\"flex items-center gap-2\">\n <span\n className=\"flex size-5 items-center justify-center rounded-full backdrop-blur-sm\"\n style={{\n backgroundColor: \"rgba(255,255,255,0.15)\",\n boxShadow: \"inset 0 0 0 1px rgba(255,255,255,0.2)\",\n }}\n >\n <PlayIcon size={10} filled color=\"#fff\" marginLeft={1} />\n </span>\n {tag && (\n <span\n className=\"rounded-full px-2.5 py-1 text-[10px] font-bold tracking-[0.24em] text-white uppercase backdrop-blur-sm\"\n style={{\n backgroundColor: \"rgba(255,255,255,0.15)\",\n boxShadow: \"inset 0 0 0 1px rgba(255,255,255,0.2)\",\n }}\n >\n {tag}\n </span>\n )}\n {eyebrow && (\n <span\n className=\"text-[10px] font-bold tracking-[0.24em] uppercase\"\n style={{ color: \"rgba(255,255,255,0.85)\" }}\n >\n {eyebrow}\n </span>\n )}\n </div>\n )}\n\n {duration && (\n <span\n className=\"flex items-center gap-1.5 rounded-full px-2.5 py-1 font-mono text-[10px] font-bold text-white tabular-nums backdrop-blur-sm\"\n style={{\n backgroundColor: \"rgba(255,255,255,0.1)\",\n boxShadow: \"inset 0 0 0 1px rgba(255,255,255,0.15)\",\n }}\n >\n <ClockIcon size={10} />\n {duration}\n </span>\n )}\n </div>\n\n {(title || tagline || author || date) && (\n <div className=\"absolute inset-x-0 bottom-0 z-10 flex flex-col p-5 sm:p-6\">\n {title && (\n <h3 className=\"text-[22px] leading-[1.18] font-bold tracking-[-0.015em] text-white sm:text-[24px]\">\n {title}\n </h3>\n )}\n {tagline && (\n <p\n className=\"mt-1.5 max-w-[520px] text-[12.5px] leading-[1.55]\"\n style={{ color: \"rgba(255,255,255,0.7)\" }}\n >\n {tagline}\n </p>\n )}\n {(author || date) && (\n <div\n className=\"mt-3 flex items-center gap-2 text-[10px] font-bold tracking-[0.16em] uppercase\"\n style={{ color: \"rgba(255,255,255,0.6)\" }}\n >\n {author && <span>{author}</span>}\n {author && date && (\n <span\n className=\"size-0.5 rounded-full\"\n style={{ backgroundColor: \"rgba(255,255,255,0.3)\" }}\n />\n )}\n {date && <span>{date}</span>}\n </div>\n )}\n </div>\n )}\n </div>\n </button>\n\n {modalOpen && (\n <VideoModal\n src={src}\n embed={embed}\n title={title}\n frameColor={frameColor}\n onClose={handleClose}\n primaryCtaText={primaryCtaText}\n primaryCtaLink={primaryCtaLink}\n secondaryCtaText={secondaryCtaText}\n secondaryCtaLink={secondaryCtaLink}\n />\n )}\n </>\n );\n}\n\ntype VideoModalProps = {\n src: string | undefined;\n embed: ParsedVideoSource;\n title: string | undefined;\n frameColor: ColorOptions;\n onClose: () => void;\n primaryCtaText: string | undefined;\n primaryCtaLink: string | undefined;\n secondaryCtaText: string | undefined;\n secondaryCtaLink: string | undefined;\n};\n\ntype VideoModalPlaybackState = {\n loading: boolean;\n loadFailed: boolean;\n mediaKey: number;\n reloadMedia: () => void;\n handleMediaLoaded: () => void;\n handleMediaError: () => void;\n};\n\nfunction useVideoModalPlaybackState({\n src,\n embedUrl,\n isMissingDirectVideo,\n}: {\n src: string | undefined;\n embedUrl: string | undefined;\n isMissingDirectVideo: boolean;\n}): VideoModalPlaybackState {\n const [loading, setLoading] = useState(!isMissingDirectVideo);\n const [loadFailed, setLoadFailed] = useState(isMissingDirectVideo);\n const [mediaKey, setMediaKey] = useState(0);\n\n const resetLoadState = useCallback(() => {\n setLoading(!isMissingDirectVideo);\n setLoadFailed(isMissingDirectVideo);\n }, [isMissingDirectVideo]);\n\n useEffect(() => {\n resetLoadState();\n }, [resetLoadState, src, embedUrl]);\n\n const reloadMedia = useCallback(() => {\n setMediaKey((key) => key + 1);\n resetLoadState();\n }, [resetLoadState]);\n\n const handleMediaLoaded = useCallback(() => {\n setLoading(false);\n }, []);\n\n const handleMediaError = useCallback(() => {\n setLoading(false);\n setLoadFailed(true);\n }, []);\n\n return {\n loading,\n loadFailed,\n mediaKey,\n reloadMedia,\n handleMediaLoaded,\n handleMediaError,\n };\n}\n\nfunction useVideoModalLifecycle(\n onClose: () => void,\n dialogRef: React.RefObject<HTMLDivElement | null>,\n): void {\n useEffect(() => {\n const handler = (e: KeyboardEvent) => {\n if (e.key === \"Escape\") onClose();\n };\n window.addEventListener(\"keydown\", handler);\n return () => window.removeEventListener(\"keydown\", handler);\n }, [onClose]);\n\n useEffect(() => {\n const { overflow } = document.body.style;\n document.body.style.overflow = \"hidden\";\n return () => {\n document.body.style.overflow = overflow;\n };\n }, []);\n\n useEffect(() => {\n const previouslyFocused =\n document.activeElement instanceof HTMLElement\n ? document.activeElement\n : null;\n dialogRef.current?.focus();\n return () => {\n previouslyFocused?.focus();\n };\n }, [dialogRef]);\n}\n\nfunction VideoModal({\n src,\n embed,\n title,\n frameColor,\n onClose,\n primaryCtaText,\n primaryCtaLink,\n secondaryCtaText,\n secondaryCtaLink,\n}: VideoModalProps) {\n const directSrc = src?.trim();\n const isMissingDirectVideo = embed.source === \"direct\" && !directSrc;\n const dialogRef = useRef<HTMLDivElement>(null);\n const {\n loading,\n loadFailed,\n mediaKey,\n reloadMedia,\n handleMediaLoaded,\n handleMediaError,\n } = useVideoModalPlaybackState({\n src,\n embedUrl: embed.embedUrl,\n isMissingDirectVideo,\n });\n\n useVideoModalLifecycle(onClose, dialogRef);\n\n const resolveInternalLink = useInternalLinks();\n const primaryCta = resolveInternalLink(primaryCtaLink);\n const secondaryCta = resolveInternalLink(secondaryCtaLink);\n\n const frameVar = `var(--color-${frameColor})`;\n const backdropStyle: CSSProperties = {\n backgroundColor: `color-mix(in oklch, ${frameVar} 85%, transparent)`,\n backdropFilter: \"blur(12px)\",\n WebkitBackdropFilter: \"blur(12px)\",\n };\n\n // Portal to document.body so the fixed-position dialog isn't clipped by\n // a transformed widget container on the live canvas (CSS transforms make\n // descendants the containing block for `position: fixed`).\n return createPortal(\n <div\n ref={dialogRef}\n tabIndex={-1}\n className=\"fixed inset-0 z-[9999] flex items-center justify-center p-4 focus:outline-none sm:p-8\"\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={title ?? \"Video player\"}\n >\n <div\n className=\"absolute inset-0\"\n style={backdropStyle}\n onClick={onClose}\n aria-hidden=\"true\"\n />\n\n <div\n className={`bg-${frameColor} relative z-10 flex max-h-full w-full max-w-5xl flex-col overflow-hidden rounded-2xl shadow-[0_40px_80px_-20px_rgba(0,0,0,0.6)]`}\n >\n <div\n className=\"flex items-center justify-between gap-3 px-4 py-3\"\n style={{ borderBottom: \"1px solid rgba(255,255,255,0.1)\" }}\n >\n <div className=\"flex items-center gap-3\">\n {embed.source !== \"direct\" && (\n <span\n className=\"flex size-9 items-center justify-center rounded-full\"\n style={{\n background: embed.iconGradient ?? \"var(--color-primary)\",\n }}\n >\n <PlayIcon size={16} filled color=\"#fff\" marginLeft={2} />\n </span>\n )}\n {title && (\n <span className=\"line-clamp-1 text-[13px] font-bold text-white\">\n {title}\n </span>\n )}\n </div>\n <div className=\"flex items-center gap-1\">\n <ToolbarButton label=\"Refresh\" onClick={reloadMedia}>\n <RefreshIcon size={14} />\n </ToolbarButton>\n {embed.watchUrl && (\n <ToolbarButton\n label=\"Open externally\"\n asLink\n href={embed.watchUrl}\n >\n <ExternalIcon size={14} />\n </ToolbarButton>\n )}\n <ToolbarButton label=\"Close\" onClick={onClose}>\n <CloseIcon size={14} />\n </ToolbarButton>\n </div>\n </div>\n\n <div className={`bg-${frameColor} relative w-full`}>\n <div className=\"relative aspect-video w-full\">\n {loading && (\n <Skeleton className=\"absolute inset-0 size-full rounded-none\" />\n )}\n\n {loadFailed ? (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <p\n className=\"text-sm\"\n style={{ color: \"rgba(255,255,255,0.7)\" }}\n >\n Unable to load video.\n </p>\n </div>\n ) : embed.source === \"direct\" ? (\n <video\n key={mediaKey}\n src={directSrc}\n controls\n preload=\"metadata\"\n {...inlineVideoPlaybackAttributes}\n className=\"absolute inset-0 h-full w-full\"\n onLoadedData={handleMediaLoaded}\n onError={handleMediaError}\n >\n Your browser does not support the video tag.\n </video>\n ) : embed.embedUrl ? (\n <iframe\n key={mediaKey}\n src={embed.embedUrl}\n title={title ?? \"Video\"}\n className=\"absolute inset-0 h-full w-full border-0\"\n allow={VIDEO_MODAL_IFRAME_ALLOW}\n allowFullScreen\n onLoad={handleMediaLoaded}\n />\n ) : (\n <div className=\"absolute inset-0 flex items-center justify-center\">\n <p\n className=\"text-sm\"\n style={{ color: \"rgba(255,255,255,0.7)\" }}\n >\n Unable to load video.\n </p>\n </div>\n )}\n </div>\n </div>\n\n {((primaryCtaText && primaryCtaLink) ||\n (secondaryCtaText && secondaryCtaLink)) && (\n <div\n className=\"flex items-center justify-end gap-3 px-4 py-3\"\n style={{ borderTop: \"1px solid rgba(255,255,255,0.1)\" }}\n >\n {secondaryCtaText && secondaryCtaLink && (\n <a\n href={secondaryCtaLink}\n onClick={(e) => {\n if (secondaryCta.followInternally(e)) onClose();\n }}\n className=\"inline-flex items-center gap-1.5 rounded-full px-4 py-2 text-[12px] font-bold transition-colors\"\n style={{ color: \"rgba(255,255,255,0.75)\" }}\n >\n {secondaryCtaText}\n </a>\n )}\n {primaryCtaText && primaryCtaLink && (\n <a\n href={primaryCtaLink}\n onClick={(e) => {\n // An in-app navigation leaves the modal covering the screen it\n // navigated to, so close it — but not when the browser is\n // taking the link somewhere else and this tab stays put.\n if (primaryCta.followInternally(e)) onClose();\n }}\n className={`text-${frameColor} inline-flex items-center gap-1.5 rounded-full bg-white px-5 py-2 text-[13px] font-bold shadow-[0_8px_22px_-8px_rgba(255,255,255,0.4)] transition-transform hover:scale-[1.02]`}\n >\n {primaryCtaText}\n <span aria-hidden=\"true\">→</span>\n </a>\n )}\n </div>\n )}\n </div>\n </div>,\n document.body,\n );\n}\n\ntype ToolbarButtonProps = {\n label: string;\n onClick?: () => void;\n asLink?: boolean;\n href?: string;\n children: ReactNode;\n};\n\nfunction ToolbarButton({\n label,\n onClick,\n asLink,\n href,\n children,\n}: ToolbarButtonProps) {\n const className =\n \"flex size-9 items-center justify-center rounded-full transition-colors hover:text-white\";\n const style: CSSProperties = { color: \"rgba(255,255,255,0.7)\" };\n\n if (asLink && href) {\n return (\n <a\n href={href}\n target=\"_blank\"\n rel=\"noopener noreferrer\"\n aria-label={label}\n className={className}\n style={style}\n >\n {children}\n </a>\n );\n }\n\n return (\n <button\n type=\"button\"\n onClick={onClick}\n aria-label={label}\n className={className}\n style={style}\n >\n {children}\n </button>\n );\n}\n\ntype ParsedVideoSource = {\n source: \"youtube\" | \"vimeo\" | \"direct\";\n embedUrl?: string;\n watchUrl?: string;\n thumbnail?: string;\n thumbnailFallback?: string;\n accent?: string;\n iconGradient?: string;\n};\n\nfunction parseVideoSource(src: string | undefined): ParsedVideoSource {\n if (!src) return { source: \"direct\" };\n const url = src.trim();\n\n const youtubeId = extractYouTubeId(url);\n if (youtubeId) {\n // maxresdefault only exists for videos uploaded at >=720p; hqdefault\n // always exists. Try max first, fall back via the <img> onError handler.\n return {\n source: \"youtube\",\n embedUrl: `https://www.youtube.com/embed/${youtubeId}?autoplay=0&playsinline=1&rel=0`,\n watchUrl: `https://www.youtube.com/watch?v=${youtubeId}`,\n thumbnail: `https://i.ytimg.com/vi/${youtubeId}/maxresdefault.jpg`,\n thumbnailFallback: `https://i.ytimg.com/vi/${youtubeId}/hqdefault.jpg`,\n accent: \"#FF0033\",\n iconGradient: \"linear-gradient(135deg, #FF0033 0%, #CC0022 100%)\",\n };\n }\n\n const vimeoId = extractVimeoId(url);\n if (vimeoId) {\n return {\n source: \"vimeo\",\n embedUrl: `https://player.vimeo.com/video/${vimeoId}?autoplay=0&playsinline=1`,\n watchUrl: `https://vimeo.com/${vimeoId}`,\n accent: \"#1AB7EA\",\n iconGradient: \"linear-gradient(135deg, #1AB7EA 0%, #0D8BBA 100%)\",\n };\n }\n\n return { source: \"direct\" };\n}\n\nfunction extractYouTubeId(url: string): string | undefined {\n const normalizeId = (value: string | null | undefined) =>\n value && /^[a-zA-Z0-9_-]{11}$/.test(value) ? value : undefined;\n\n try {\n const parsed = new URL(url);\n const hostname = parsed.hostname.replace(/^www\\./, \"\").toLowerCase();\n const pathParts = parsed.pathname.split(\"/\").filter(Boolean);\n\n if (hostname === \"youtu.be\") {\n return normalizeId(pathParts[0]);\n }\n\n const isYouTubeHost =\n hostname === \"youtube.com\" ||\n hostname.endsWith(\".youtube.com\") ||\n hostname === \"youtube-nocookie.com\" ||\n hostname.endsWith(\".youtube-nocookie.com\");\n\n if (isYouTubeHost) {\n const watchId = normalizeId(parsed.searchParams.get(\"v\"));\n if (watchId) return watchId;\n\n if (\n (pathParts[0] === \"embed\" || pathParts[0] === \"shorts\") &&\n pathParts[1]\n ) {\n return normalizeId(pathParts[1]);\n }\n }\n } catch {\n // Fall back to regexes for protocol-less URLs and other loose input.\n }\n\n const patterns = [\n /youtube\\.com\\/watch.*[?&]v=([a-zA-Z0-9_-]{11})/,\n /youtu\\.be\\/([a-zA-Z0-9_-]{11})/,\n /youtube\\.com\\/embed\\/([a-zA-Z0-9_-]{11})/,\n /youtube\\.com\\/shorts\\/([a-zA-Z0-9_-]{11})/,\n ];\n for (const pattern of patterns) {\n const match = pattern.exec(url);\n const youtubeId = normalizeId(match?.[1]);\n if (youtubeId) return youtubeId;\n }\n return undefined;\n}\n\nfunction extractVimeoId(url: string): string | undefined {\n const patterns = [\n /vimeo\\.com\\/(?:video\\/)?(\\d{6,})/,\n /player\\.vimeo\\.com\\/video\\/(\\d{6,})/,\n ];\n for (const pattern of patterns) {\n const match = pattern.exec(url);\n if (match?.[1]) return match[1];\n }\n return undefined;\n}\n\ntype IconProps = {\n size: number;\n color?: string;\n filled?: boolean;\n marginLeft?: number;\n};\n\nfunction PlayIcon({ size, color, filled, marginLeft }: IconProps) {\n const style: CSSProperties = {};\n if (color) style.color = color;\n if (marginLeft) style.marginLeft = `${marginLeft}px`;\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill={filled ? \"currentColor\" : \"none\"}\n stroke=\"currentColor\"\n strokeWidth={filled ? 0 : 2.5}\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n style={style}\n >\n <path d=\"M8 5v14l11-7z\" />\n </svg>\n );\n}\n\nfunction ClockIcon({ size }: { size: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <circle cx=\"12\" cy=\"12\" r=\"10\" />\n <polyline points=\"12 6 12 12 16 14\" />\n </svg>\n );\n}\n\nfunction MaximizeIcon({ size }: { size: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"15 3 21 3 21 9\" />\n <polyline points=\"9 21 3 21 3 15\" />\n <line x1=\"21\" y1=\"3\" x2=\"14\" y2=\"10\" />\n <line x1=\"3\" y1=\"21\" x2=\"10\" y2=\"14\" />\n </svg>\n );\n}\n\nfunction RefreshIcon({ size }: { size: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <polyline points=\"23 4 23 10 17 10\" />\n <polyline points=\"1 20 1 14 7 14\" />\n <path d=\"M3.51 9a9 9 0 0 1 14.85-3.36L23 10M1 14l4.64 4.36A9 9 0 0 0 20.49 15\" />\n </svg>\n );\n}\n\nfunction ExternalIcon({ size }: { size: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <path d=\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\" />\n <polyline points=\"15 3 21 3 21 9\" />\n <line x1=\"10\" y1=\"14\" x2=\"21\" y2=\"3\" />\n </svg>\n );\n}\n\nfunction CloseIcon({ size }: { size: number }) {\n return (\n <svg\n width={size}\n height={size}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth={2.5}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n aria-hidden=\"true\"\n >\n <line x1=\"18\" y1=\"6\" x2=\"6\" y2=\"18\" />\n <line x1=\"6\" y1=\"6\" x2=\"18\" y2=\"18\" />\n </svg>\n );\n}\n\nexport const videoWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"VideoWidget\",\n displayName: \"Video\",\n tabsConfig: [\n { id: \"styling\", label: \"Styling\" },\n { id: \"behavior\", label: \"Behavior\" },\n ],\n fields: [\n // Content group\n {\n key: \"resource\",\n label: \"Select Video\",\n type: \"image\",\n accept: \"video\",\n description: \"Browse and select a video\",\n tab: \"styling\",\n group: \"Content\",\n },\n {\n key: \"useCustomUrl\",\n label: \"Use Custom URL\",\n type: \"boolean\",\n description: \"Enter a custom video URL instead of selecting media.\",\n defaultValue: false,\n tab: \"styling\",\n group: \"Content\",\n },\n {\n key: \"src\",\n label: \"Video URL\",\n type: \"text\",\n description:\n \"Direct video URL for inline mode. Card mode supports YouTube, Vimeo, and direct video URLs.\",\n defaultValue: \"\",\n tab: \"styling\",\n group: \"Content\",\n requiresKeyToBeTrue: \"useCustomUrl\",\n },\n {\n key: \"poster\",\n label: \"Poster Image URL\",\n type: \"text\",\n description:\n \"Thumbnail shown before play. Card mode can auto-derive YouTube thumbnails; add a poster for Vimeo URLs.\",\n defaultValue: \"\",\n tab: \"styling\",\n group: \"Content\",\n requiresKeyToBeTrue: \"useCustomUrl\",\n },\n\n // Display Mode group (new)\n {\n key: \"displayMode\",\n label: \"Display Mode\",\n type: \"buttonGroup\",\n description:\n \"Inline: native player embedded in the page. Card: premium thumbnail that opens a modal.\",\n options: [\n { label: \"Inline\", value: \"inline\" },\n { label: \"Card\", value: \"card\" },\n ],\n defaultValue: \"inline\",\n tab: \"styling\",\n group: \"Display Mode\",\n },\n\n // Card metadata group\n {\n key: \"title\",\n label: \"Title\",\n type: \"text\",\n description: \"Headline on the card thumbnail (card mode only).\",\n defaultValue: \"\",\n tab: \"styling\",\n group: \"Card Content\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n {\n key: \"tagline\",\n label: \"Tagline\",\n type: \"textarea\",\n description: \"Short body line under the title.\",\n defaultValue: \"\",\n rows: 2,\n tab: \"styling\",\n group: \"Card Content\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n {\n key: \"eyebrow\",\n label: \"Eyebrow\",\n type: \"text\",\n description:\n \"Small label above the card (e.g. 'Training · Fluid Academy').\",\n defaultValue: \"\",\n tab: \"styling\",\n group: \"Card Content\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n {\n key: \"tag\",\n label: \"Tag\",\n type: \"text\",\n description: \"Optional pill label.\",\n defaultValue: \"\",\n tab: \"styling\",\n group: \"Card Content\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n {\n key: \"duration\",\n label: \"Duration\",\n type: \"text\",\n description: \"Runtime (e.g. '4:52' or '1:09:30'). Shown as a chip.\",\n defaultValue: \"\",\n tab: \"styling\",\n group: \"Card Content\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n {\n key: \"author\",\n label: \"Author / Instructor\",\n type: \"text\",\n description: \"Meta line author.\",\n defaultValue: \"\",\n tab: \"styling\",\n group: \"Card Content\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n {\n key: \"date\",\n label: \"Date\",\n type: \"text\",\n description: \"Meta line date (e.g. 'Apr 12').\",\n defaultValue: \"\",\n tab: \"styling\",\n group: \"Card Content\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n\n // Card frame group\n {\n key: \"editorialFrame\",\n label: \"Editorial Frame\",\n type: \"boolean\",\n description:\n \"Premium dark canvas with layered shadow and dual gradient overlays.\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Card Frame\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n getColorField({\n defaultValue: \"foreground\",\n key: \"frameColor\",\n label: \"Frame Color\",\n description: \"Surface color for the card and modal.\",\n tab: \"styling\",\n group: \"Card Frame\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n }),\n {\n key: \"showFullscreenPill\",\n label: \"Show Fullscreen Pill\",\n type: \"boolean\",\n description: \"Show the 'Full screen' hover hint on the card.\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Card Frame\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n\n // Card modal CTAs group\n {\n key: \"primaryCtaText\",\n label: \"Primary CTA Text\",\n type: \"text\",\n description: \"Primary button in the modal footer (optional).\",\n defaultValue: \"\",\n tab: \"styling\",\n group: \"Modal CTAs\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n {\n key: \"primaryCtaLink\",\n label: \"Primary CTA Link\",\n type: \"text\",\n description: \"URL for the primary CTA.\",\n defaultValue: \"\",\n tab: \"styling\",\n group: \"Modal CTAs\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n {\n key: \"secondaryCtaText\",\n label: \"Secondary CTA Text\",\n type: \"text\",\n description: \"Secondary (ghost) button in the modal footer (optional).\",\n defaultValue: \"\",\n tab: \"styling\",\n group: \"Modal CTAs\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n {\n key: \"secondaryCtaLink\",\n label: \"Secondary CTA Link\",\n type: \"text\",\n description: \"URL for the secondary CTA.\",\n defaultValue: \"\",\n tab: \"styling\",\n group: \"Modal CTAs\",\n requiresKeyValue: { key: \"displayMode\", value: \"card\" },\n },\n\n // Inline design group (existing)\n getBorderRadiusField({\n key: \"borderRadius\",\n label: \"Border Radius\",\n description: \"Border radius for the video container\",\n defaultValue: \"md\",\n tab: \"styling\",\n group: \"Design\",\n }),\n getBorderWidthField({\n key: \"borderWidth\",\n label: \"Border Width\",\n description: \"Border width for the widget\",\n defaultValue: \"none\",\n tab: \"styling\",\n group: \"Design\",\n }),\n getBorderColorField({\n key: \"borderColor\",\n label: \"Border Color\",\n description: \"Border color for the widget\",\n defaultValue: \"muted\",\n tab: \"styling\",\n group: \"Design\",\n }),\n {\n key: \"verticalSizing\",\n label: \"Vertical Sizing\",\n type: \"buttonGroup\",\n description: \"How the video height is determined (inline mode only)\",\n options: [\n { label: \"Auto\", value: \"auto\" },\n { label: \"Fixed\", value: \"fixed\" },\n ],\n defaultValue: \"auto\",\n tab: \"styling\",\n group: \"Design\",\n requiresKeyValue: { key: \"displayMode\", value: \"inline\" },\n },\n getHeightField({\n key: \"fixedHeight\",\n label: \"Height\",\n description: \"Fixed height of the video container\",\n defaultValue: \"200px\",\n tab: \"styling\",\n group: \"Design\",\n requiresKeyValue: { key: \"verticalSizing\", value: \"fixed\" },\n }),\n {\n key: \"displayFit\",\n label: \"Display Fit\",\n type: \"buttonGroup\",\n description: \"How the video fills its container\",\n options: [\n { label: \"Cover\", value: \"cover\" },\n { label: \"Contain\", value: \"contain\" },\n ],\n defaultValue: \"cover\",\n tab: \"styling\",\n group: \"Design\",\n requiresKeyValue: { key: \"verticalSizing\", value: \"fixed\" },\n },\n {\n key: \"focusPoint\",\n label: \"Focus Point\",\n type: \"contentPosition\",\n description: \"The focal point of the video within its container\",\n defaultValue: \"center\",\n tab: \"styling\",\n group: \"Design\",\n requiresKeyValue: { key: \"verticalSizing\", value: \"fixed\" },\n },\n\n // Behavior tab (inline only)\n {\n key: \"controls\",\n label: \"Show Controls\",\n type: \"boolean\",\n description:\n \"Display video playback controls (inline mode only — card mode always shows controls in the modal).\",\n defaultValue: true,\n tab: \"behavior\",\n group: \"Behavior\",\n requiresKeyValue: { key: \"displayMode\", value: \"inline\" },\n },\n {\n key: \"autoplay\",\n label: \"Autoplay\",\n type: \"boolean\",\n description: \"Automatically start playing the video\",\n defaultValue: false,\n tab: \"behavior\",\n group: \"Behavior\",\n requiresKeyValue: { key: \"displayMode\", value: \"inline\" },\n },\n {\n key: \"loop\",\n label: \"Loop\",\n type: \"boolean\",\n description: \"Repeat the video when it ends\",\n defaultValue: false,\n tab: \"behavior\",\n group: \"Behavior\",\n requiresKeyValue: { key: \"displayMode\", value: \"inline\" },\n },\n {\n key: \"muted\",\n label: \"Muted\",\n type: \"boolean\",\n description: \"Start with audio muted\",\n defaultValue: true,\n tab: \"behavior\",\n group: \"Behavior\",\n requiresKeyValue: { key: \"displayMode\", value: \"inline\" },\n },\n ],\n};\n"],"mappings":"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"}
|
package/dist/{WidgetInteractionContext-Bjy4P_YP.cjs → WidgetInteractionContext-D9dBJ-39.cjs}
RENAMED
|
@@ -4,19 +4,21 @@ react = require_chunk.__toESM(react);
|
|
|
4
4
|
let react_jsx_runtime = require("react/jsx-runtime");
|
|
5
5
|
//#region ../widgets/src/contexts/WidgetInteractionContext.tsx
|
|
6
6
|
const WidgetInteractionContext = (0, react.createContext)({});
|
|
7
|
-
function WidgetInteractionProvider({ onItemClick, onNavigate, buildHref, resolveInternalSlug, children }) {
|
|
7
|
+
function WidgetInteractionProvider({ onItemClick, onNavigate, buildHref, resolveInternalSlug, canNavigateTo, children }) {
|
|
8
8
|
const value = (0, react.useMemo)(() => {
|
|
9
9
|
const ctx = {};
|
|
10
10
|
if (onItemClick) ctx.onItemClick = onItemClick;
|
|
11
11
|
if (onNavigate) ctx.onNavigate = onNavigate;
|
|
12
12
|
if (buildHref) ctx.buildHref = buildHref;
|
|
13
13
|
if (resolveInternalSlug) ctx.resolveInternalSlug = resolveInternalSlug;
|
|
14
|
+
if (canNavigateTo) ctx.canNavigateTo = canNavigateTo;
|
|
14
15
|
return ctx;
|
|
15
16
|
}, [
|
|
16
17
|
onItemClick,
|
|
17
18
|
onNavigate,
|
|
18
19
|
buildHref,
|
|
19
|
-
resolveInternalSlug
|
|
20
|
+
resolveInternalSlug,
|
|
21
|
+
canNavigateTo
|
|
20
22
|
]);
|
|
21
23
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(WidgetInteractionContext.Provider, {
|
|
22
24
|
value,
|
|
@@ -40,4 +42,4 @@ Object.defineProperty(exports, "useWidgetInteraction", {
|
|
|
40
42
|
}
|
|
41
43
|
});
|
|
42
44
|
|
|
43
|
-
//# sourceMappingURL=WidgetInteractionContext-
|
|
45
|
+
//# sourceMappingURL=WidgetInteractionContext-D9dBJ-39.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WidgetInteractionContext-D9dBJ-39.cjs","names":[],"sources":["../../widgets/src/contexts/WidgetInteractionContext.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useMemo,\n type ReactNode,\n} from \"react\";\n\nexport interface WidgetInteractionItem {\n id: string | number;\n [key: string]: unknown;\n}\n\ninterface WidgetInteractionContextValue {\n onItemClick?: (item: WidgetInteractionItem) => void;\n /** Navigate to an internal screen by slug */\n onNavigate?: (slug: string) => void;\n /** Build a full href for a screen slug (for <a> tags) */\n buildHref?: (slug: string) => string;\n /**\n * Inverse of `buildHref`: resolve a URL-mode link that points at a screen in\n * this portal back to its slug, so it can be followed in-app rather than as\n * a document load. Returns undefined for links that leave the portal.\n */\n resolveInternalSlug?: (href: string) => string | undefined;\n /**\n * Whether navigating to `slug` would land on a real screen in this portal\n * rather than \"Page Not Found\" — opt-in screens (contacts, messages) only\n * render when their nav item is present. Widgets should not offer a deep-link\n * this returns false for. Undefined (e.g. in the builder preview) means\n * reachability is unknown, so treat every link as navigable.\n */\n canNavigateTo?: (slug: string) => boolean;\n}\n\nconst WidgetInteractionContext = createContext<WidgetInteractionContextValue>(\n {},\n);\n\nexport interface WidgetInteractionProviderProps {\n onItemClick?: (item: WidgetInteractionItem) => void;\n onNavigate?: (slug: string) => void;\n buildHref?: (slug: string) => string;\n resolveInternalSlug?: (href: string) => string | undefined;\n canNavigateTo?: (slug: string) => boolean;\n children: ReactNode;\n}\n\nexport function WidgetInteractionProvider({\n onItemClick,\n onNavigate,\n buildHref,\n resolveInternalSlug,\n canNavigateTo,\n children,\n}: WidgetInteractionProviderProps): React.JSX.Element {\n const value = useMemo(() => {\n const ctx: WidgetInteractionContextValue = {};\n if (onItemClick) ctx.onItemClick = onItemClick;\n if (onNavigate) ctx.onNavigate = onNavigate;\n if (buildHref) ctx.buildHref = buildHref;\n if (resolveInternalSlug) ctx.resolveInternalSlug = resolveInternalSlug;\n if (canNavigateTo) ctx.canNavigateTo = canNavigateTo;\n return ctx;\n }, [onItemClick, onNavigate, buildHref, resolveInternalSlug, canNavigateTo]);\n return (\n <WidgetInteractionContext.Provider value={value}>\n {children}\n </WidgetInteractionContext.Provider>\n );\n}\n\nexport function useWidgetInteraction(): WidgetInteractionContextValue {\n return useContext(WidgetInteractionContext);\n}\n"],"mappings":";;;;;AAkCA,MAAM,4BAAA,GAAA,MAAA,eACJ,EAAE,CACH;AAWD,SAAgB,0BAA0B,EACxC,aACA,YACA,WACA,qBACA,eACA,YACoD;CACpD,MAAM,SAAA,GAAA,MAAA,eAAsB;EAC1B,MAAM,MAAqC,EAAE;AAC7C,MAAI,YAAa,KAAI,cAAc;AACnC,MAAI,WAAY,KAAI,aAAa;AACjC,MAAI,UAAW,KAAI,YAAY;AAC/B,MAAI,oBAAqB,KAAI,sBAAsB;AACnD,MAAI,cAAe,KAAI,gBAAgB;AACvC,SAAO;IACN;EAAC;EAAa;EAAY;EAAW;EAAqB;EAAc,CAAC;AAC5E,QACE,iBAAA,GAAA,kBAAA,KAAC,yBAAyB,UAA1B;EAA0C;EACvC;EACiC,CAAA;;AAIxC,SAAgB,uBAAsD;AACpE,SAAA,GAAA,MAAA,YAAkB,yBAAyB"}
|
package/dist/{WidgetInteractionContext-Ba_G5sDP.mjs → WidgetInteractionContext-IsMo73Ka.mjs}
RENAMED
|
@@ -2,19 +2,21 @@ import { createContext, useContext, useMemo } from "react";
|
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
3
|
//#region ../widgets/src/contexts/WidgetInteractionContext.tsx
|
|
4
4
|
const WidgetInteractionContext = createContext({});
|
|
5
|
-
function WidgetInteractionProvider({ onItemClick, onNavigate, buildHref, resolveInternalSlug, children }) {
|
|
5
|
+
function WidgetInteractionProvider({ onItemClick, onNavigate, buildHref, resolveInternalSlug, canNavigateTo, children }) {
|
|
6
6
|
const value = useMemo(() => {
|
|
7
7
|
const ctx = {};
|
|
8
8
|
if (onItemClick) ctx.onItemClick = onItemClick;
|
|
9
9
|
if (onNavigate) ctx.onNavigate = onNavigate;
|
|
10
10
|
if (buildHref) ctx.buildHref = buildHref;
|
|
11
11
|
if (resolveInternalSlug) ctx.resolveInternalSlug = resolveInternalSlug;
|
|
12
|
+
if (canNavigateTo) ctx.canNavigateTo = canNavigateTo;
|
|
12
13
|
return ctx;
|
|
13
14
|
}, [
|
|
14
15
|
onItemClick,
|
|
15
16
|
onNavigate,
|
|
16
17
|
buildHref,
|
|
17
|
-
resolveInternalSlug
|
|
18
|
+
resolveInternalSlug,
|
|
19
|
+
canNavigateTo
|
|
18
20
|
]);
|
|
19
21
|
return /* @__PURE__ */ jsx(WidgetInteractionContext.Provider, {
|
|
20
22
|
value,
|
|
@@ -27,4 +29,4 @@ function useWidgetInteraction() {
|
|
|
27
29
|
//#endregion
|
|
28
30
|
export { useWidgetInteraction as n, WidgetInteractionProvider as t };
|
|
29
31
|
|
|
30
|
-
//# sourceMappingURL=WidgetInteractionContext-
|
|
32
|
+
//# sourceMappingURL=WidgetInteractionContext-IsMo73Ka.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"WidgetInteractionContext-IsMo73Ka.mjs","names":[],"sources":["../../widgets/src/contexts/WidgetInteractionContext.tsx"],"sourcesContent":["import React, {\n createContext,\n useContext,\n useMemo,\n type ReactNode,\n} from \"react\";\n\nexport interface WidgetInteractionItem {\n id: string | number;\n [key: string]: unknown;\n}\n\ninterface WidgetInteractionContextValue {\n onItemClick?: (item: WidgetInteractionItem) => void;\n /** Navigate to an internal screen by slug */\n onNavigate?: (slug: string) => void;\n /** Build a full href for a screen slug (for <a> tags) */\n buildHref?: (slug: string) => string;\n /**\n * Inverse of `buildHref`: resolve a URL-mode link that points at a screen in\n * this portal back to its slug, so it can be followed in-app rather than as\n * a document load. Returns undefined for links that leave the portal.\n */\n resolveInternalSlug?: (href: string) => string | undefined;\n /**\n * Whether navigating to `slug` would land on a real screen in this portal\n * rather than \"Page Not Found\" — opt-in screens (contacts, messages) only\n * render when their nav item is present. Widgets should not offer a deep-link\n * this returns false for. Undefined (e.g. in the builder preview) means\n * reachability is unknown, so treat every link as navigable.\n */\n canNavigateTo?: (slug: string) => boolean;\n}\n\nconst WidgetInteractionContext = createContext<WidgetInteractionContextValue>(\n {},\n);\n\nexport interface WidgetInteractionProviderProps {\n onItemClick?: (item: WidgetInteractionItem) => void;\n onNavigate?: (slug: string) => void;\n buildHref?: (slug: string) => string;\n resolveInternalSlug?: (href: string) => string | undefined;\n canNavigateTo?: (slug: string) => boolean;\n children: ReactNode;\n}\n\nexport function WidgetInteractionProvider({\n onItemClick,\n onNavigate,\n buildHref,\n resolveInternalSlug,\n canNavigateTo,\n children,\n}: WidgetInteractionProviderProps): React.JSX.Element {\n const value = useMemo(() => {\n const ctx: WidgetInteractionContextValue = {};\n if (onItemClick) ctx.onItemClick = onItemClick;\n if (onNavigate) ctx.onNavigate = onNavigate;\n if (buildHref) ctx.buildHref = buildHref;\n if (resolveInternalSlug) ctx.resolveInternalSlug = resolveInternalSlug;\n if (canNavigateTo) ctx.canNavigateTo = canNavigateTo;\n return ctx;\n }, [onItemClick, onNavigate, buildHref, resolveInternalSlug, canNavigateTo]);\n return (\n <WidgetInteractionContext.Provider value={value}>\n {children}\n </WidgetInteractionContext.Provider>\n );\n}\n\nexport function useWidgetInteraction(): WidgetInteractionContextValue {\n return useContext(WidgetInteractionContext);\n}\n"],"mappings":";;;AAkCA,MAAM,2BAA2B,cAC/B,EAAE,CACH;AAWD,SAAgB,0BAA0B,EACxC,aACA,YACA,WACA,qBACA,eACA,YACoD;CACpD,MAAM,QAAQ,cAAc;EAC1B,MAAM,MAAqC,EAAE;AAC7C,MAAI,YAAa,KAAI,cAAc;AACnC,MAAI,WAAY,KAAI,aAAa;AACjC,MAAI,UAAW,KAAI,YAAY;AAC/B,MAAI,oBAAqB,KAAI,sBAAsB;AACnD,MAAI,cAAe,KAAI,gBAAgB;AACvC,SAAO;IACN;EAAC;EAAa;EAAY;EAAW;EAAqB;EAAc,CAAC;AAC5E,QACE,oBAAC,yBAAyB,UAA1B;EAA0C;EACvC;EACiC,CAAA;;AAIxC,SAAgB,uBAAsD;AACpE,QAAO,WAAW,yBAAyB"}
|
|
@@ -4,7 +4,7 @@ import { n as accountKeys, o as useAccountApi, t as useAccount } from "./use-acc
|
|
|
4
4
|
import { m as useMySiteApi, t as PORTAL_MYSITE_KEYS } from "./use-mysite-portal--6Mw0jDm.mjs";
|
|
5
5
|
import { r as useCountriesApi, t as Combobox } from "./Combobox-D8ukt9Tb.mjs";
|
|
6
6
|
import { a as memberTypeName, c as usePortalContentContext, i as hasMemberPermission, n as canAccessRepSurfaces, o as memberTypeSlug, t as require_prop_types, u as CONTENT_FAVORITE_TYPES } from "./prop-types-BK4OBoZZ.mjs";
|
|
7
|
-
import { t as QuickLinksWidget } from "./QuickLinksWidget-
|
|
7
|
+
import { t as QuickLinksWidget } from "./QuickLinksWidget-BiEUvm_J.mjs";
|
|
8
8
|
import { t as SearchSort, w as usePortalProductsApi } from "./SearchSort-Bff2iTtF.mjs";
|
|
9
9
|
import { r as useShareablesApi } from "./use-share-link-mOe2vbOG.mjs";
|
|
10
10
|
import { n as useWidgetsApi } from "./widgets-api-context-6escG2w8.mjs";
|
|
@@ -12,29 +12,29 @@ import { t as PointsWidget } from "./PointsWidget-51bH9zYh.mjs";
|
|
|
12
12
|
import { t as LayoutWidget } from "./LayoutWidget-BLcrbBwm.mjs";
|
|
13
13
|
import { t as TextWidget } from "./TextWidget-CshhnCUL.mjs";
|
|
14
14
|
import { t as AlertWidget } from "./AlertWidget-DlSTpa3y.mjs";
|
|
15
|
-
import { t as AnnouncementWidget } from "./AnnouncementWidget-
|
|
15
|
+
import { t as AnnouncementWidget } from "./AnnouncementWidget-BND76Ojg.mjs";
|
|
16
16
|
import { t as BulletListWidget } from "./BulletListWidget-BqUtGDk2.mjs";
|
|
17
17
|
import { t as CalendarWidget } from "./CalendarWidget-B3bIYc5_.mjs";
|
|
18
18
|
import { t as CardWidget } from "./CardWidget-RrRS-tdW.mjs";
|
|
19
|
-
import { t as CarouselWidget } from "./CarouselWidget-
|
|
20
|
-
import { t as CatchUpWidget } from "./CatchUpWidget-
|
|
19
|
+
import { t as CarouselWidget } from "./CarouselWidget-CU1oj0q4.mjs";
|
|
20
|
+
import { t as CatchUpWidget } from "./CatchUpWidget-CLwHp30X.mjs";
|
|
21
21
|
import { t as ChartWidget } from "./ChartWidget-Bl-SQUJg.mjs";
|
|
22
22
|
import { t as ContainerWidget } from "./ContainerWidget-B3elq25T.mjs";
|
|
23
23
|
import { t as EmbedWidget } from "./EmbedWidget-DbgW5JqU.mjs";
|
|
24
|
-
import { t as ImageWidget } from "./ImageWidget-
|
|
25
|
-
import { t as LinkWidget } from "./LinkWidget-
|
|
26
|
-
import { t as ListWidget } from "./ListWidget-
|
|
24
|
+
import { t as ImageWidget } from "./ImageWidget-I8F34YlI.mjs";
|
|
25
|
+
import { t as LinkWidget } from "./LinkWidget-Dg0tHfgD.mjs";
|
|
26
|
+
import { t as ListWidget } from "./ListWidget-BAS3SGpD.mjs";
|
|
27
27
|
import { t as MySiteWidget } from "./MySiteWidget-CB3vfPZV.mjs";
|
|
28
|
-
import { t as NestedWidget } from "./NestedWidget-
|
|
28
|
+
import { t as NestedWidget } from "./NestedWidget-D31rZhTR.mjs";
|
|
29
29
|
import { t as QuoteWidget } from "./QuoteWidget-Cph8pFGq.mjs";
|
|
30
|
-
import { t as QuickShareWidget } from "./QuickShareWidget-
|
|
31
|
-
import { t as RecentActivityWidget } from "./RecentActivityWidget-
|
|
30
|
+
import { t as QuickShareWidget } from "./QuickShareWidget-Dzpzis1d.mjs";
|
|
31
|
+
import { t as RecentActivityWidget } from "./RecentActivityWidget-BzmV4G8e.mjs";
|
|
32
32
|
import { t as SeparatorWidget } from "./SeparatorWidget-CCaFxpKI.mjs";
|
|
33
33
|
import { t as SpacerWidget } from "./SpacerWidget-B6D0TsyT.mjs";
|
|
34
|
-
import { t as TableWidget } from "./TableWidget-
|
|
34
|
+
import { t as TableWidget } from "./TableWidget-CDGdl71J.mjs";
|
|
35
35
|
import { t as ToDoWidget } from "./ToDoWidget-DlCCGkHh.mjs";
|
|
36
|
-
import { t as VideoWidget } from "./VideoWidget-
|
|
37
|
-
import { t as ShopWidget } from "./ShopWidget-
|
|
36
|
+
import { t as VideoWidget } from "./VideoWidget-Wca2-So_.mjs";
|
|
37
|
+
import { t as ShopWidget } from "./ShopWidget-DHM86LM3.mjs";
|
|
38
38
|
import { r as useOptionalAppNavigation } from "./AppNavigationContext-DPwonj_1.mjs";
|
|
39
39
|
import { B as PORTAL_READ_FUNCTION_DEFINITIONS, _t as NAVIGATE_DEFINITION, b as PORTAL_CONTENT_MUTATION_FUNCTION_DEFINITIONS, bt as REQUEST_FULLSCREEN_DEFINITION, dt as ACCOUNT_DEFINITION, ft as ALLOW_ANCHOR_URL_DEFINITION, gt as FULLSCREEN_STATE_DEFINITION, ht as EXIT_FULLSCREEN_DEFINITION, mt as BUILD_HREF_DEFINITION, pt as APP_DEFINITION, t as PORTAL_SELF_FUNCTION_DEFINITIONS, vt as NAVIGATION_STATE_DEFINITION, xt as STORE_DEFINITION, yt as PROFILE_DEFINITION, z as PORTAL_ORDER_LIST_STATUSES } from "./self-xOg24kBT.mjs";
|
|
40
40
|
import { t as useStore } from "./use-store-CBV7ruvp.mjs";
|
|
@@ -2069,33 +2069,33 @@ function createWidgetFromShareable(item) {
|
|
|
2069
2069
|
//#region ../widgets/src/widgets/index.ts
|
|
2070
2070
|
const widgetPropertySchemas = {
|
|
2071
2071
|
AlertWidget: () => import("./AlertWidget-DlSTpa3y.mjs").then((n) => n.n).then((m) => m.alertWidgetPropertySchema),
|
|
2072
|
-
AnnouncementWidget: () => import("./AnnouncementWidget-
|
|
2072
|
+
AnnouncementWidget: () => import("./AnnouncementWidget-BND76Ojg.mjs").then((n) => n.n).then((m) => m.announcementWidgetPropertySchema),
|
|
2073
2073
|
BulletListWidget: () => import("./BulletListWidget-BqUtGDk2.mjs").then((n) => n.n).then((m) => m.bulletListWidgetPropertySchema),
|
|
2074
2074
|
CalendarWidget: () => import("./CalendarWidget-BNwNT1YK.mjs").then((m) => m.calendarWidgetPropertySchema),
|
|
2075
2075
|
CardWidget: () => import("./CardWidget-RrRS-tdW.mjs").then((n) => n.n).then((m) => m.cardWidgetPropertySchema),
|
|
2076
|
-
CarouselWidget: () => import("./CarouselWidget-
|
|
2077
|
-
CatchUpWidget: () => import("./CatchUpWidget-
|
|
2076
|
+
CarouselWidget: () => import("./CarouselWidget-CU1oj0q4.mjs").then((n) => n.n).then((m) => m.carouselWidgetPropertySchema),
|
|
2077
|
+
CatchUpWidget: () => import("./CatchUpWidget-BtwG2-JD.mjs").then((m) => m.catchUpWidgetPropertySchema),
|
|
2078
2078
|
ChartWidget: () => import("./ChartWidget-Bl-SQUJg.mjs").then((n) => n.n).then((m) => m.chartWidgetPropertySchema),
|
|
2079
2079
|
ContainerWidget: () => import("./ContainerWidget-B3elq25T.mjs").then((n) => n.n).then((m) => m.containerWidgetPropertySchema),
|
|
2080
2080
|
EmbedWidget: () => import("./EmbedWidget-DbgW5JqU.mjs").then((n) => n.n).then((m) => m.embedWidgetPropertySchema),
|
|
2081
|
-
ImageWidget: () => import("./ImageWidget-
|
|
2081
|
+
ImageWidget: () => import("./ImageWidget-I8F34YlI.mjs").then((n) => n.n).then((m) => m.imageWidgetPropertySchema),
|
|
2082
2082
|
LayoutWidget: () => import("./LayoutWidget-BLcrbBwm.mjs").then((n) => n.n).then((m) => m.layoutWidgetPropertySchema),
|
|
2083
|
-
LinkWidget: () => import("./LinkWidget-
|
|
2084
|
-
ListWidget: () => import("./ListWidget-
|
|
2083
|
+
LinkWidget: () => import("./LinkWidget-Dg0tHfgD.mjs").then((n) => n.n).then((m) => m.linkWidgetPropertySchema),
|
|
2084
|
+
ListWidget: () => import("./ListWidget-BAS3SGpD.mjs").then((n) => n.n).then((m) => m.listWidgetPropertySchema),
|
|
2085
2085
|
MySiteWidget: () => import("./MySiteWidget-CB3vfPZV.mjs").then((n) => n.n).then((m) => m.mySiteWidgetPropertySchema),
|
|
2086
|
-
NestedWidget: () => import("./NestedWidget-
|
|
2086
|
+
NestedWidget: () => import("./NestedWidget-D31rZhTR.mjs").then((n) => n.n).then((m) => m.nestedWidgetPropertySchema),
|
|
2087
2087
|
PointsWidget: () => import("./PointsWidget-cgsfa6AR.mjs").then((m) => m.pointsWidgetPropertySchema),
|
|
2088
2088
|
QuoteWidget: () => import("./QuoteWidget-Cph8pFGq.mjs").then((n) => n.n).then((m) => m.quoteWidgetPropertySchema),
|
|
2089
|
-
QuickLinksWidget: () => import("./QuickLinksWidget-
|
|
2090
|
-
QuickShareWidget: () => import("./QuickShareWidget-
|
|
2091
|
-
RecentActivityWidget: () => import("./RecentActivityWidget-
|
|
2089
|
+
QuickLinksWidget: () => import("./QuickLinksWidget-BiEUvm_J.mjs").then((n) => n.n).then((m) => m.quickLinksWidgetPropertySchema),
|
|
2090
|
+
QuickShareWidget: () => import("./QuickShareWidget-Dzpzis1d.mjs").then((n) => n.n).then((m) => m.quickShareWidgetPropertySchema),
|
|
2091
|
+
RecentActivityWidget: () => import("./RecentActivityWidget-BzmV4G8e.mjs").then((n) => n.n).then((m) => m.recentActivityWidgetPropertySchema),
|
|
2092
2092
|
SeparatorWidget: () => import("./SeparatorWidget-CCaFxpKI.mjs").then((n) => n.n).then((m) => m.separatorWidgetPropertySchema),
|
|
2093
|
-
ShopWidget: () => import("./ShopWidget-
|
|
2093
|
+
ShopWidget: () => import("./ShopWidget-D98tmUgG.mjs").then((m) => m.shopWidgetPropertySchema),
|
|
2094
2094
|
SpacerWidget: () => import("./SpacerWidget-B6D0TsyT.mjs").then((n) => n.n).then((m) => m.spacerWidgetPropertySchema),
|
|
2095
|
-
TableWidget: () => import("./TableWidget-
|
|
2095
|
+
TableWidget: () => import("./TableWidget-CDGdl71J.mjs").then((n) => n.n).then((m) => m.tableWidgetPropertySchema),
|
|
2096
2096
|
TextWidget: () => import("./TextWidget-CshhnCUL.mjs").then((n) => n.n).then((m) => m.textWidgetPropertySchema),
|
|
2097
2097
|
ToDoWidget: () => import("./ToDoWidget-hqNfWGhB.mjs").then((m) => m.toDoWidgetPropertySchema),
|
|
2098
|
-
VideoWidget: () => import("./VideoWidget-
|
|
2098
|
+
VideoWidget: () => import("./VideoWidget-Wca2-So_.mjs").then((n) => n.n).then((m) => m.videoWidgetPropertySchema)
|
|
2099
2099
|
};
|
|
2100
2100
|
//#endregion
|
|
2101
2101
|
//#region src/core/default-widget-registry.ts
|
|
@@ -24880,4 +24880,4 @@ function isBuiltInWidgetType(widgetType) {
|
|
|
24880
24880
|
//#endregion
|
|
24881
24881
|
export { DEFAULT_COLORS as $, isCardPaymentDescriptor as A, normalizeCardBrand as B, DEFAULT_SDK_WIDGET_REGISTRY as C, usePayApi as Ct, createWidgetFromShareable as D, deleteDatabase as Dt, createScreen as E, createPersister as Et, resolvePaymentLogo as F, applyTheme as G, usePortalTenantOrder as H, resolvePaymentMethodDisplay as I, buildThemeDefinition as J, removeAllThemes as K, GENERIC_PAYMENT_ICON_URL as L, maskedCardLabelSegments as M, normalizePaymentDescriptor as N, createWidgetRegistry as O, paymentDescriptorLabel as P, serialiseTheme as Q, brandIconUrl as R, useCompanyScopedQueryKey as S, PayApiProvider as St, widgetPropertySchemas as T, useAppDefinitionApi as Tt, useInfiniteCustomerOrders as U, formatOrderTotal as V, OrdersCoreProvider as W, transformThemes as X, getActiveThemeId as Y, deserialiseTheme as Z, transformManifestToRepAppData as _, isRemoteDomWidgetPackageDescriptor as _t, createRemoteWidgetCapabilityGrants as a, DEFAULT_THEME_NAME as at, toScreenDefinition as b, LanguagesApiProvider as bt, wrapRemoteDomRoot as c, deriveDarkVariant as ct, useOptionalScreenAreaFullscreenCoordinator as d, parseColor as dt, DEFAULT_FONT_FAMILIES as et, useScreenAreaFullscreenSnapshot as f, resolveTheme as ft, toRawManifest as g, SEMANTIC_COLOR_NAMES as gt, useFluidApp as h, RADIUS_KEYS as ht, projectRemoteWidgetPackages as i, DEFAULT_THEME_ID as it, maskCardNumber as j, buildStaticMapUrl as k, PhoneInput as l, getForegroundColor as lt, fetchRawManifest as m, FONT_SIZE_KEYS as mt, buildRemoteWidgetRegistry as n, DEFAULT_RADII as nt, isDevBuild as o, getDefaultThemeDefinition as ot, APP_DATA_QUERY_KEY as p, FONT_FAMILY_KEYS as pt, removeTheme as q, isBuiltInWidgetType as r, DEFAULT_SPACING as rt, REMOTE_DOM_COMPONENT_RENDERERS as s, generateThemeCSS as st, buildNavigateHandler as t, DEFAULT_FONT_SIZES as tt, ScreenAreaFullscreenProvider as u, mergeDarkOverrides as ut, toNavigationItem as v, AddressFieldsApiProvider as vt, isDefaultWidgetComponent as w, AppDefinitionApiProvider as wt, createCompanyQueryKey as x, useLanguagesApi as xt, normalizeComponentTree as y, useAddressFieldsApiOptional as yt, getPaymentBrandName as z };
|
|
24882
24882
|
|
|
24883
|
-
//# sourceMappingURL=build-widget-registry-
|
|
24883
|
+
//# sourceMappingURL=build-widget-registry-70KBtqiR.mjs.map
|