@fluid-app/portal-sdk 0.1.493 → 0.1.495
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-B7bYw1AY.cjs → FluidProvider-53Us6Wck.cjs} +3 -3
- package/dist/{FluidProvider-B7bYw1AY.cjs.map → FluidProvider-53Us6Wck.cjs.map} +1 -1
- package/dist/{FluidProvider-DxwbLpfX.mjs → FluidProvider-DP6sHwZs.mjs} +3 -3
- package/dist/{FluidProvider-DxwbLpfX.mjs.map → FluidProvider-DP6sHwZs.mjs.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-Q0BSmRuJ.mjs → MessagingScreen-BDU6-95p.mjs} +2 -2
- package/dist/{MessagingScreen-Q0BSmRuJ.mjs.map → MessagingScreen-BDU6-95p.mjs.map} +1 -1
- package/dist/{MessagingScreen-DDVflwCT.cjs → MessagingScreen-BHIdW4zb.cjs} +19 -19
- package/dist/{MessagingScreen-D7Yuy_Rn.cjs → MessagingScreen-CrlbbYnh.cjs} +2 -2
- package/dist/{MessagingScreen-D7Yuy_Rn.cjs.map → MessagingScreen-CrlbbYnh.cjs.map} +1 -1
- package/dist/{MessagingScreen-CZje-9-C.mjs → MessagingScreen-D3MBcqOK.mjs} +19 -19
- 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-CXxGN6RY.mjs → OrdersScreen-C8ObD3qC.mjs} +3 -3
- package/dist/{OrdersScreen-CXxGN6RY.mjs.map → OrdersScreen-C8ObD3qC.mjs.map} +1 -1
- package/dist/{OrdersScreen-C0TzmZCl.cjs → OrdersScreen-CPab3qey.cjs} +3 -3
- package/dist/{OrdersScreen-C0TzmZCl.cjs.map → OrdersScreen-CPab3qey.cjs.map} +1 -1
- package/dist/{OrdersScreen-vAO6E8EM.cjs → OrdersScreen-ClsetoAd.cjs} +19 -19
- package/dist/{OrdersScreen-DOBWnf_w.mjs → OrdersScreen-u0JHPiqt.mjs} +19 -19
- package/dist/{ProfileScreen-DWFXnUUU.mjs → ProfileScreen-B-n-A15K.mjs} +20 -20
- package/dist/{ProfileScreen-tq1DJ71b.cjs → ProfileScreen-BnxYqSJx.cjs} +3 -3
- package/dist/{ProfileScreen-tq1DJ71b.cjs.map → ProfileScreen-BnxYqSJx.cjs.map} +1 -1
- package/dist/{ProfileScreen-BGLpyuef.mjs → ProfileScreen-CPs27Mm9.mjs} +3 -3
- package/dist/{ProfileScreen-BGLpyuef.mjs.map → ProfileScreen-CPs27Mm9.mjs.map} +1 -1
- package/dist/{ProfileScreen-B9NHS4A_.cjs → ProfileScreen-D8GmN99O.cjs} +20 -20
- 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-Cy7RtO5K.cjs → SubscriptionsScreen--FWQpJ50.cjs} +4 -4
- package/dist/{SubscriptionsScreen-Cy7RtO5K.cjs.map → SubscriptionsScreen--FWQpJ50.cjs.map} +1 -1
- package/dist/{SubscriptionsScreen-BEzmLp01.cjs → SubscriptionsScreen-D2aqGKLC.cjs} +20 -20
- package/dist/{SubscriptionsScreen-C7OOGlBt.mjs → SubscriptionsScreen-D61Y6viw.mjs} +4 -4
- package/dist/{SubscriptionsScreen-C7OOGlBt.mjs.map → SubscriptionsScreen-D61Y6viw.mjs.map} +1 -1
- package/dist/{SubscriptionsScreen-BwcpTAn5.mjs → SubscriptionsScreen-Y8tSHKCd.mjs} +20 -20
- 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-BZeMOKCj.cjs → build-widget-registry-DpPMWfL5.cjs} +50 -28
- package/dist/build-widget-registry-DpPMWfL5.cjs.map +1 -0
- package/dist/{build-widget-registry-DAOb4Muk.mjs → build-widget-registry-m79ilpcM.mjs} +50 -28
- package/dist/build-widget-registry-m79ilpcM.mjs.map +1 -0
- 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-DUBFzvAB.cjs → use-portal-card-add-3ds-flow-BNc0Hrsk.cjs} +3 -3
- package/dist/{use-portal-card-add-3ds-flow-DUBFzvAB.cjs.map → use-portal-card-add-3ds-flow-BNc0Hrsk.cjs.map} +1 -1
- package/dist/{use-portal-card-add-3ds-flow-DhfOxgMV.mjs → use-portal-card-add-3ds-flow-DAvzNIZN.mjs} +3 -3
- package/dist/{use-portal-card-add-3ds-flow-DhfOxgMV.mjs.map → use-portal-card-add-3ds-flow-DAvzNIZN.mjs.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 +20 -20
- 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
- package/dist/build-widget-registry-BZeMOKCj.cjs.map +0 -1
- package/dist/build-widget-registry-DAOb4Muk.mjs.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 @@ const require_use_account = require("./use-account-CDm-HlHX.cjs");
|
|
|
4
4
|
const require_use_mysite_portal = require("./use-mysite-portal-B0Mrv9jq.cjs");
|
|
5
5
|
const require_Combobox = require("./Combobox-B_-Ka9B4.cjs");
|
|
6
6
|
const require_prop_types$1 = require("./prop-types-DFk57_Go.cjs");
|
|
7
|
-
const require_QuickLinksWidget = require("./QuickLinksWidget-
|
|
7
|
+
const require_QuickLinksWidget = require("./QuickLinksWidget-CLBvaogv.cjs");
|
|
8
8
|
const require_SearchSort = require("./SearchSort-BFE4vK5I.cjs");
|
|
9
9
|
const require_use_share_link = require("./use-share-link-CwfwFW1s.cjs");
|
|
10
10
|
const require_widgets_api_context = require("./widgets-api-context-CdgvPvNT.cjs");
|
|
@@ -12,30 +12,30 @@ const require_PointsWidget = require("./PointsWidget-C7-cHRHk.cjs");
|
|
|
12
12
|
const require_LayoutWidget = require("./LayoutWidget-BvGOXXEu.cjs");
|
|
13
13
|
const require_TextWidget = require("./TextWidget-CS5a4S8C.cjs");
|
|
14
14
|
const require_AlertWidget = require("./AlertWidget-DftCRqlz.cjs");
|
|
15
|
-
const require_AnnouncementWidget = require("./AnnouncementWidget-
|
|
15
|
+
const require_AnnouncementWidget = require("./AnnouncementWidget-Dh6nKAqT.cjs");
|
|
16
16
|
const require_BulletListWidget = require("./BulletListWidget-COVpUMKJ.cjs");
|
|
17
17
|
const require_CalendarWidget = require("./CalendarWidget-BzIXj7QC.cjs");
|
|
18
18
|
const require_src = require("./src-B6YzMK6y.cjs");
|
|
19
19
|
const require_CardWidget = require("./CardWidget-CLNvCUaU.cjs");
|
|
20
|
-
const require_CarouselWidget = require("./CarouselWidget-
|
|
21
|
-
const require_CatchUpWidget = require("./CatchUpWidget-
|
|
20
|
+
const require_CarouselWidget = require("./CarouselWidget-BETNqs_K.cjs");
|
|
21
|
+
const require_CatchUpWidget = require("./CatchUpWidget-CqAHpCJP.cjs");
|
|
22
22
|
const require_ChartWidget = require("./ChartWidget-BWbt8251.cjs");
|
|
23
23
|
const require_ContainerWidget = require("./ContainerWidget-D0yiDKgl.cjs");
|
|
24
24
|
const require_EmbedWidget = require("./EmbedWidget-CHeKoaGY.cjs");
|
|
25
|
-
const require_ImageWidget = require("./ImageWidget-
|
|
26
|
-
const require_LinkWidget = require("./LinkWidget-
|
|
27
|
-
const require_ListWidget = require("./ListWidget-
|
|
25
|
+
const require_ImageWidget = require("./ImageWidget-CksrA9rH.cjs");
|
|
26
|
+
const require_LinkWidget = require("./LinkWidget-Dvp6-Dow.cjs");
|
|
27
|
+
const require_ListWidget = require("./ListWidget-CH-zz3sb.cjs");
|
|
28
28
|
const require_MySiteWidget = require("./MySiteWidget-Jsvzw271.cjs");
|
|
29
|
-
const require_NestedWidget = require("./NestedWidget-
|
|
29
|
+
const require_NestedWidget = require("./NestedWidget-B24yMkV4.cjs");
|
|
30
30
|
const require_QuoteWidget = require("./QuoteWidget-C2kEZlQK.cjs");
|
|
31
|
-
const require_QuickShareWidget = require("./QuickShareWidget-
|
|
32
|
-
const require_RecentActivityWidget = require("./RecentActivityWidget-
|
|
31
|
+
const require_QuickShareWidget = require("./QuickShareWidget-wxRcBUkf.cjs");
|
|
32
|
+
const require_RecentActivityWidget = require("./RecentActivityWidget-zBOY0c_B.cjs");
|
|
33
33
|
const require_SeparatorWidget = require("./SeparatorWidget-CK5hxebb.cjs");
|
|
34
34
|
const require_SpacerWidget = require("./SpacerWidget-haCKQ_2B.cjs");
|
|
35
|
-
const require_TableWidget = require("./TableWidget-
|
|
35
|
+
const require_TableWidget = require("./TableWidget-DNjUA2Il.cjs");
|
|
36
36
|
const require_ToDoWidget = require("./ToDoWidget-KKMjWPRA.cjs");
|
|
37
|
-
const require_VideoWidget = require("./VideoWidget-
|
|
38
|
-
const require_ShopWidget = require("./ShopWidget-
|
|
37
|
+
const require_VideoWidget = require("./VideoWidget-bf-gkCfx.cjs");
|
|
38
|
+
const require_ShopWidget = require("./ShopWidget-CCITGTSs.cjs");
|
|
39
39
|
const require_AppNavigationContext = require("./AppNavigationContext-CaPjjVaF.cjs");
|
|
40
40
|
const require_self = require("./self-BOoNOwmB.cjs");
|
|
41
41
|
const require_use_store = require("./use-store-vF_7N2Ak.cjs");
|
|
@@ -308,6 +308,7 @@ const DB_NAME = "fluid_tanstack_query_cache";
|
|
|
308
308
|
const STORE_NAME = "fluid_queries";
|
|
309
309
|
const VERSION = 1;
|
|
310
310
|
let dbPromise = null;
|
|
311
|
+
let swept = false;
|
|
311
312
|
async function deleteDatabase(reason = "error") {
|
|
312
313
|
return new Promise((resolve, reject) => {
|
|
313
314
|
console.warn(`[IDB] Deleting database due to ${reason}`);
|
|
@@ -375,6 +376,12 @@ function getDb() {
|
|
|
375
376
|
});
|
|
376
377
|
return dbPromise;
|
|
377
378
|
}
|
|
379
|
+
function awaitRequest(req) {
|
|
380
|
+
return new Promise((resolve, reject) => {
|
|
381
|
+
req.onsuccess = () => resolve(req.result);
|
|
382
|
+
req.onerror = () => reject(req.error);
|
|
383
|
+
});
|
|
384
|
+
}
|
|
378
385
|
const storage = {
|
|
379
386
|
async getItem(key) {
|
|
380
387
|
try {
|
|
@@ -455,6 +462,16 @@ const storage = {
|
|
|
455
462
|
}
|
|
456
463
|
}
|
|
457
464
|
},
|
|
465
|
+
async entries() {
|
|
466
|
+
try {
|
|
467
|
+
const store = (await getDb()).transaction(STORE_NAME, "readonly").objectStore(STORE_NAME);
|
|
468
|
+
const [keys, values] = await Promise.all([awaitRequest(store.getAllKeys()), awaitRequest(store.getAll())]);
|
|
469
|
+
return keys.flatMap((key, index) => typeof key === "string" && values[index] !== void 0 ? [[key, values[index]]] : []);
|
|
470
|
+
} catch (err) {
|
|
471
|
+
console.trace("[IDB] entries error:", err);
|
|
472
|
+
return [];
|
|
473
|
+
}
|
|
474
|
+
},
|
|
458
475
|
async removeItem(key) {
|
|
459
476
|
try {
|
|
460
477
|
const db = await getDb();
|
|
@@ -496,11 +513,16 @@ const storage = {
|
|
|
496
513
|
}
|
|
497
514
|
};
|
|
498
515
|
function createPersister() {
|
|
499
|
-
|
|
516
|
+
const persister = experimental_createQueryPersister({
|
|
500
517
|
storage,
|
|
501
518
|
serialize: (persistedQuery) => persistedQuery,
|
|
502
519
|
deserialize: (cached) => cached
|
|
503
520
|
});
|
|
521
|
+
if (!swept) {
|
|
522
|
+
swept = true;
|
|
523
|
+
persister.persisterGc();
|
|
524
|
+
}
|
|
525
|
+
return persister;
|
|
504
526
|
}
|
|
505
527
|
//#endregion
|
|
506
528
|
//#region ../core/src/app-definition-api-context.ts
|
|
@@ -2086,33 +2108,33 @@ function createWidgetFromShareable(item) {
|
|
|
2086
2108
|
//#region ../widgets/src/widgets/index.ts
|
|
2087
2109
|
const widgetPropertySchemas = {
|
|
2088
2110
|
AlertWidget: () => Promise.resolve().then(() => require("./AlertWidget-DftCRqlz.cjs")).then((n) => n.AlertWidget_exports).then((m) => m.alertWidgetPropertySchema),
|
|
2089
|
-
AnnouncementWidget: () => Promise.resolve().then(() => require("./AnnouncementWidget
|
|
2111
|
+
AnnouncementWidget: () => Promise.resolve().then(() => require("./AnnouncementWidget--nRHRrQH.cjs")).then((m) => m.announcementWidgetPropertySchema),
|
|
2090
2112
|
BulletListWidget: () => Promise.resolve().then(() => require("./BulletListWidget-COVpUMKJ.cjs")).then((n) => n.BulletListWidget_exports).then((m) => m.bulletListWidgetPropertySchema),
|
|
2091
2113
|
CalendarWidget: () => Promise.resolve().then(() => require("./CalendarWidget-B_38vU4B.cjs")).then((m) => m.calendarWidgetPropertySchema),
|
|
2092
2114
|
CardWidget: () => Promise.resolve().then(() => require("./CardWidget-Ip6eCzDX.cjs")).then((m) => m.cardWidgetPropertySchema),
|
|
2093
|
-
CarouselWidget: () => Promise.resolve().then(() => require("./CarouselWidget-
|
|
2094
|
-
CatchUpWidget: () => Promise.resolve().then(() => require("./CatchUpWidget-
|
|
2115
|
+
CarouselWidget: () => Promise.resolve().then(() => require("./CarouselWidget-D3BODbpO.cjs")).then((m) => m.carouselWidgetPropertySchema),
|
|
2116
|
+
CatchUpWidget: () => Promise.resolve().then(() => require("./CatchUpWidget-ak-oFdKY.cjs")).then((m) => m.catchUpWidgetPropertySchema),
|
|
2095
2117
|
ChartWidget: () => Promise.resolve().then(() => require("./ChartWidget-UrPlnG95.cjs")).then((m) => m.chartWidgetPropertySchema),
|
|
2096
2118
|
ContainerWidget: () => Promise.resolve().then(() => require("./ContainerWidget-6eiSqojo.cjs")).then((m) => m.containerWidgetPropertySchema),
|
|
2097
2119
|
EmbedWidget: () => Promise.resolve().then(() => require("./EmbedWidget-BjadYKc4.cjs")).then((m) => m.embedWidgetPropertySchema),
|
|
2098
|
-
ImageWidget: () => Promise.resolve().then(() => require("./ImageWidget-
|
|
2120
|
+
ImageWidget: () => Promise.resolve().then(() => require("./ImageWidget-DmO84AYo.cjs")).then((m) => m.imageWidgetPropertySchema),
|
|
2099
2121
|
LayoutWidget: () => Promise.resolve().then(() => require("./LayoutWidget-DzErvkZm.cjs")).then((m) => m.layoutWidgetPropertySchema),
|
|
2100
|
-
LinkWidget: () => Promise.resolve().then(() => require("./LinkWidget-
|
|
2101
|
-
ListWidget: () => Promise.resolve().then(() => require("./ListWidget-
|
|
2122
|
+
LinkWidget: () => Promise.resolve().then(() => require("./LinkWidget-N6yz6w-U.cjs")).then((m) => m.linkWidgetPropertySchema),
|
|
2123
|
+
ListWidget: () => Promise.resolve().then(() => require("./ListWidget-vG31UVVS.cjs")).then((m) => m.listWidgetPropertySchema),
|
|
2102
2124
|
MySiteWidget: () => Promise.resolve().then(() => require("./MySiteWidget-Jsvzw271.cjs")).then((n) => n.MySiteWidget_exports).then((m) => m.mySiteWidgetPropertySchema),
|
|
2103
|
-
NestedWidget: () => Promise.resolve().then(() => require("./NestedWidget-
|
|
2125
|
+
NestedWidget: () => Promise.resolve().then(() => require("./NestedWidget-DqM5HGFl.cjs")).then((m) => m.nestedWidgetPropertySchema),
|
|
2104
2126
|
PointsWidget: () => Promise.resolve().then(() => require("./PointsWidget-CCpBlD-J.cjs")).then((m) => m.pointsWidgetPropertySchema),
|
|
2105
2127
|
QuoteWidget: () => Promise.resolve().then(() => require("./QuoteWidget-C2kEZlQK.cjs")).then((n) => n.QuoteWidget_exports).then((m) => m.quoteWidgetPropertySchema),
|
|
2106
|
-
QuickLinksWidget: () => Promise.resolve().then(() => require("./QuickLinksWidget-
|
|
2107
|
-
QuickShareWidget: () => Promise.resolve().then(() => require("./QuickShareWidget-
|
|
2108
|
-
RecentActivityWidget: () => Promise.resolve().then(() => require("./RecentActivityWidget-
|
|
2128
|
+
QuickLinksWidget: () => Promise.resolve().then(() => require("./QuickLinksWidget-DzAL_wuz.cjs")).then((m) => m.quickLinksWidgetPropertySchema),
|
|
2129
|
+
QuickShareWidget: () => Promise.resolve().then(() => require("./QuickShareWidget-B7mlqgW8.cjs")).then((m) => m.quickShareWidgetPropertySchema),
|
|
2130
|
+
RecentActivityWidget: () => Promise.resolve().then(() => require("./RecentActivityWidget-DQcy41-I.cjs")).then((m) => m.recentActivityWidgetPropertySchema),
|
|
2109
2131
|
SeparatorWidget: () => Promise.resolve().then(() => require("./SeparatorWidget-CK5hxebb.cjs")).then((n) => n.SeparatorWidget_exports).then((m) => m.separatorWidgetPropertySchema),
|
|
2110
|
-
ShopWidget: () => Promise.resolve().then(() => require("./ShopWidget-
|
|
2132
|
+
ShopWidget: () => Promise.resolve().then(() => require("./ShopWidget-DXVsF1Jh.cjs")).then((m) => m.shopWidgetPropertySchema),
|
|
2111
2133
|
SpacerWidget: () => Promise.resolve().then(() => require("./SpacerWidget-haCKQ_2B.cjs")).then((n) => n.SpacerWidget_exports).then((m) => m.spacerWidgetPropertySchema),
|
|
2112
|
-
TableWidget: () => Promise.resolve().then(() => require("./TableWidget-
|
|
2134
|
+
TableWidget: () => Promise.resolve().then(() => require("./TableWidget-B8F_uQ92.cjs")).then((m) => m.tableWidgetPropertySchema),
|
|
2113
2135
|
TextWidget: () => Promise.resolve().then(() => require("./TextWidget-CS5a4S8C.cjs")).then((n) => n.TextWidget_exports).then((m) => m.textWidgetPropertySchema),
|
|
2114
2136
|
ToDoWidget: () => Promise.resolve().then(() => require("./ToDoWidget-Bduw-f-K.cjs")).then((m) => m.toDoWidgetPropertySchema),
|
|
2115
|
-
VideoWidget: () => Promise.resolve().then(() => require("./VideoWidget-
|
|
2137
|
+
VideoWidget: () => Promise.resolve().then(() => require("./VideoWidget-UQQoRmwC.cjs")).then((m) => m.videoWidgetPropertySchema)
|
|
2116
2138
|
};
|
|
2117
2139
|
//#endregion
|
|
2118
2140
|
//#region src/core/default-widget-registry.ts
|
|
@@ -25382,4 +25404,4 @@ Object.defineProperty(exports, "wrapRemoteDomRoot", {
|
|
|
25382
25404
|
}
|
|
25383
25405
|
});
|
|
25384
25406
|
|
|
25385
|
-
//# sourceMappingURL=build-widget-registry-
|
|
25407
|
+
//# sourceMappingURL=build-widget-registry-DpPMWfL5.cjs.map
|