@fluid-app/portal-sdk 0.1.238 → 0.1.239
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/{CalendarWidget-BaGML5Xh.mjs → CalendarWidget-BXxNxHDV.mjs} +2 -2
- package/dist/{CalendarWidget-BaGML5Xh.mjs.map → CalendarWidget-BXxNxHDV.mjs.map} +1 -1
- package/dist/{CalendarWidget-oGK122s9.cjs → CalendarWidget-VjQXZW8B.cjs} +2 -2
- package/dist/{CalendarWidget-oGK122s9.cjs.map → CalendarWidget-VjQXZW8B.cjs.map} +1 -1
- package/dist/{CardWidget-CqYjGkq-.mjs → CardWidget-BNkMlxQ3.mjs} +2 -2
- package/dist/{CardWidget-CqYjGkq-.mjs.map → CardWidget-BNkMlxQ3.mjs.map} +1 -1
- package/dist/{CardWidget-CSLSlKM6.cjs → CardWidget-C3I9OwgS.cjs} +2 -2
- package/dist/{CardWidget-CSLSlKM6.cjs.map → CardWidget-C3I9OwgS.cjs.map} +1 -1
- package/dist/{CardWidget-DjhK0yr-.cjs → CardWidget-CraWMttj.cjs} +3 -3
- package/dist/{CarouselWidget-DlxYQB5j.cjs → CarouselWidget-CiKlooUF.cjs} +2 -2
- package/dist/{CarouselWidget-DlxYQB5j.cjs.map → CarouselWidget-CiKlooUF.cjs.map} +1 -1
- package/dist/{CarouselWidget-CdQhlRrW.mjs → CarouselWidget-p8Z6L-G5.mjs} +2 -2
- package/dist/{CarouselWidget-CdQhlRrW.mjs.map → CarouselWidget-p8Z6L-G5.mjs.map} +1 -1
- package/dist/{CatchUpWidget-BQjtjcGR.mjs → CatchUpWidget-B9DQlzd_.mjs} +2 -2
- package/dist/{CatchUpWidget-BQjtjcGR.mjs.map → CatchUpWidget-B9DQlzd_.mjs.map} +1 -1
- package/dist/{CatchUpWidget-B1Muaurg.cjs → CatchUpWidget-SY7hOHk6.cjs} +2 -2
- package/dist/{CatchUpWidget-B1Muaurg.cjs.map → CatchUpWidget-SY7hOHk6.cjs.map} +1 -1
- package/dist/{ContainerWidget-Cjwrq2MS.cjs → ContainerWidget-BXpdj06u.cjs} +2 -2
- package/dist/{ContainerWidget-Cjwrq2MS.cjs.map → ContainerWidget-BXpdj06u.cjs.map} +1 -1
- package/dist/{ContainerWidget-DYThUtiZ.mjs → ContainerWidget-CpwvcxFm.mjs} +2 -2
- package/dist/{ContainerWidget-DYThUtiZ.mjs.map → ContainerWidget-CpwvcxFm.mjs.map} +1 -1
- package/dist/ContainerWidget-CyfPYEAv.cjs +8 -0
- package/dist/{FluidProvider-B3DjYoUW.mjs → FluidProvider-DL5rChtj.mjs} +67 -84
- package/dist/FluidProvider-DL5rChtj.mjs.map +1 -0
- package/dist/{FluidProvider-DcpUKHrn.cjs → FluidProvider-D_PHVlUU.cjs} +67 -84
- package/dist/FluidProvider-D_PHVlUU.cjs.map +1 -0
- package/dist/{ImageWidget-xcE0sFf-.cjs → ImageWidget-CbQVxMe3.cjs} +2 -2
- package/dist/{ImageWidget-xcE0sFf-.cjs.map → ImageWidget-CbQVxMe3.cjs.map} +1 -1
- package/dist/{ImageWidget-CFTpbu8X.mjs → ImageWidget-vNWT_O1E.mjs} +2 -2
- package/dist/{ImageWidget-CFTpbu8X.mjs.map → ImageWidget-vNWT_O1E.mjs.map} +1 -1
- package/dist/{LayoutWidget-CK-SvFQL.cjs → LayoutWidget-BIfNHlVE.cjs} +2 -2
- package/dist/{LayoutWidget-CK-SvFQL.cjs.map → LayoutWidget-BIfNHlVE.cjs.map} +1 -1
- package/dist/{LayoutWidget-Cx5ZyXSU.mjs → LayoutWidget-CC3oK78H.mjs} +2 -2
- package/dist/{LayoutWidget-Cx5ZyXSU.mjs.map → LayoutWidget-CC3oK78H.mjs.map} +1 -1
- package/dist/{LayoutWidget-DuueFNAS.cjs → LayoutWidget-LdF_cKrB.cjs} +3 -3
- package/dist/{LinkWidget-B14FTQP7.cjs → LinkWidget-BoR7nVbH.cjs} +2 -2
- package/dist/{LinkWidget-B14FTQP7.cjs.map → LinkWidget-BoR7nVbH.cjs.map} +1 -1
- package/dist/{LinkWidget-CQHmKO-O.mjs → LinkWidget-CO-Cxf7Z.mjs} +2 -2
- package/dist/{LinkWidget-CQHmKO-O.mjs.map → LinkWidget-CO-Cxf7Z.mjs.map} +1 -1
- package/dist/{LinkWidget-CPmE8gpd.cjs → LinkWidget-M9YzMJT8.cjs} +2 -2
- package/dist/{ListWidget-YvCp7XDq.cjs → ListWidget-CuSjvwEw.cjs} +3 -3
- package/dist/{ListWidget-wBDnXWxa.cjs → ListWidget-CzljZ1LA.cjs} +3 -3
- package/dist/{ListWidget-wBDnXWxa.cjs.map → ListWidget-CzljZ1LA.cjs.map} +1 -1
- package/dist/{ListWidget-BnyD2Hpc.mjs → ListWidget-f88QhcGI.mjs} +3 -3
- package/dist/{ListWidget-BnyD2Hpc.mjs.map → ListWidget-f88QhcGI.mjs.map} +1 -1
- package/dist/{MediaRenderer-CfgWd0cC.cjs → MediaRenderer-CvN8Ku0i.cjs} +4 -4
- package/dist/MediaRenderer-CvN8Ku0i.cjs.map +1 -0
- package/dist/{MediaRenderer-CqUpv3St.mjs → MediaRenderer-DMdb_5xw.mjs} +4 -4
- package/dist/MediaRenderer-DMdb_5xw.mjs.map +1 -0
- package/dist/{MessagingScreen-BzWV22JZ.cjs → MessagingScreen-Dkh3Dsp7.cjs} +2 -2
- package/dist/{MessagingScreen-BzWV22JZ.cjs.map → MessagingScreen-Dkh3Dsp7.cjs.map} +1 -1
- package/dist/{MessagingScreen-CPBUg-32.cjs → MessagingScreen-Dxy2VQbO.cjs} +22 -22
- package/dist/{MessagingScreen-BBqwXPZB.mjs → MessagingScreen-mt1u3Bs1.mjs} +2 -2
- package/dist/{MessagingScreen-BBqwXPZB.mjs.map → MessagingScreen-mt1u3Bs1.mjs.map} +1 -1
- package/dist/{MySiteWidget-COj7yYQF.mjs → MySiteWidget-BnjPrQxE.mjs} +2 -2
- package/dist/{MySiteWidget-COj7yYQF.mjs.map → MySiteWidget-BnjPrQxE.mjs.map} +1 -1
- package/dist/{MySiteWidget-DRH4q_YV.cjs → MySiteWidget-C8eFWHOT.cjs} +2 -2
- package/dist/{MySiteWidget-DRH4q_YV.cjs.map → MySiteWidget-C8eFWHOT.cjs.map} +1 -1
- package/dist/{NestedWidget-C_2XwnW0.cjs → NestedWidget-CEoAO2sp.cjs} +3 -3
- package/dist/{NestedWidget-C_2XwnW0.cjs.map → NestedWidget-CEoAO2sp.cjs.map} +1 -1
- package/dist/{NestedWidget-CXIvsJdD.cjs → NestedWidget-CMCZjV6t.cjs} +3 -3
- package/dist/{NestedWidget-WJoWOFda.mjs → NestedWidget-RuyrOrFn.mjs} +3 -3
- package/dist/{NestedWidget-WJoWOFda.mjs.map → NestedWidget-RuyrOrFn.mjs.map} +1 -1
- package/dist/{PointsWidget-DoUljaNY.mjs → PointsWidget-C2KB4k48.mjs} +2 -2
- package/dist/{PointsWidget-DoUljaNY.mjs.map → PointsWidget-C2KB4k48.mjs.map} +1 -1
- package/dist/{PointsWidget-CLUWrFjZ.cjs → PointsWidget-DLp-PYus.cjs} +2 -2
- package/dist/{PointsWidget-CLUWrFjZ.cjs.map → PointsWidget-DLp-PYus.cjs.map} +1 -1
- package/dist/{ProfileScreen-C0nmvuW1.cjs → ProfileScreen-BMe-dQi7.cjs} +2 -2
- package/dist/{ProfileScreen-C0nmvuW1.cjs.map → ProfileScreen-BMe-dQi7.cjs.map} +1 -1
- package/dist/{ProfileScreen-MCfnv8eT.cjs → ProfileScreen-ChCZZ91o.cjs} +22 -22
- package/dist/{ProfileScreen-CwQr_Km7.mjs → ProfileScreen-_1GlBr7z.mjs} +2 -2
- package/dist/{ProfileScreen-CwQr_Km7.mjs.map → ProfileScreen-_1GlBr7z.mjs.map} +1 -1
- package/dist/{RecentActivityWidget-C6RwlUUw.cjs → RecentActivityWidget-BNW9aFT4.cjs} +2 -2
- package/dist/{RecentActivityWidget-C6RwlUUw.cjs.map → RecentActivityWidget-BNW9aFT4.cjs.map} +1 -1
- package/dist/{RecentActivityWidget-zQxtUECm.mjs → RecentActivityWidget-DelPdiwR.mjs} +2 -2
- package/dist/{RecentActivityWidget-zQxtUECm.mjs.map → RecentActivityWidget-DelPdiwR.mjs.map} +1 -1
- package/dist/{ScreenRenderer-Bk23YOtN.mjs → ScreenRenderer-ClYgfQf_.mjs} +2 -2
- package/dist/{ScreenRenderer-Bk23YOtN.mjs.map → ScreenRenderer-ClYgfQf_.mjs.map} +1 -1
- package/dist/{ScreenRenderer-aYfgv6mR.cjs → ScreenRenderer-Ct1w4PNu.cjs} +2 -2
- package/dist/{ScreenRenderer-aYfgv6mR.cjs.map → ScreenRenderer-Ct1w4PNu.cjs.map} +1 -1
- package/dist/{ShopScreen-D39WpS6j.mjs → ShopScreen-BBfOte5o.mjs} +2 -2
- package/dist/{ShopScreen-D39WpS6j.mjs.map → ShopScreen-BBfOte5o.mjs.map} +1 -1
- package/dist/{ShopScreen-Brw7gNMu.cjs → ShopScreen-CZ_290EP.cjs} +22 -22
- package/dist/{ShopScreen-CiGozvW4.cjs → ShopScreen-DWLGH2gt.cjs} +2 -2
- package/dist/{ShopScreen-CiGozvW4.cjs.map → ShopScreen-DWLGH2gt.cjs.map} +1 -1
- package/dist/{TableWidget-D4jQN-to.cjs → TableWidget-BIn1oRiJ.cjs} +4 -4
- package/dist/TableWidget-BIn1oRiJ.cjs.map +1 -0
- package/dist/{TableWidget-DWAYgQcl.cjs → TableWidget-C--8TSX7.cjs} +3 -3
- package/dist/{TableWidget-B0CRdzNf.mjs → TableWidget-dfUvhH0S.mjs} +4 -4
- package/dist/TableWidget-dfUvhH0S.mjs.map +1 -0
- package/dist/{ToDoWidget-BbeXt99H.cjs → ToDoWidget-Bjoan2Rm.cjs} +2 -2
- package/dist/{ToDoWidget-BbeXt99H.cjs.map → ToDoWidget-Bjoan2Rm.cjs.map} +1 -1
- package/dist/{ToDoWidget-VSaNmtWH.mjs → ToDoWidget-CYDsZA0Z.mjs} +2 -2
- package/dist/{ToDoWidget-VSaNmtWH.mjs.map → ToDoWidget-CYDsZA0Z.mjs.map} +1 -1
- package/dist/{ToDoWidget-YHmoDbVU.cjs → ToDoWidget-C_CvWdLi.cjs} +2 -2
- package/dist/{VideoWidget-Bc6ZAAaA.cjs → VideoWidget-CDcV0J5W.cjs} +2 -2
- package/dist/{VideoWidget-Bc6ZAAaA.cjs.map → VideoWidget-CDcV0J5W.cjs.map} +1 -1
- package/dist/{VideoWidget-DcWm239R.mjs → VideoWidget-Dj9wue7j.mjs} +2 -2
- package/dist/{VideoWidget-DcWm239R.mjs.map → VideoWidget-Dj9wue7j.mjs.map} +1 -1
- package/dist/WidgetInteractionContext-B1mELhQ_.mjs +28 -0
- package/dist/{WidgetInteractionContext-D0TJv70C.mjs.map → WidgetInteractionContext-B1mELhQ_.mjs.map} +1 -1
- package/dist/WidgetInteractionContext-DvPmzGqB.cjs +41 -0
- package/dist/{WidgetInteractionContext-Bs3LkFFH.cjs.map → WidgetInteractionContext-DvPmzGqB.cjs.map} +1 -1
- package/dist/index.cjs +81 -52
- 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 +81 -52
- package/dist/index.mjs.map +1 -1
- package/dist/{registry-context-BDH0vNHR.mjs → registry-context-BahYMRqn.mjs} +12 -20
- package/dist/registry-context-BahYMRqn.mjs.map +1 -0
- package/dist/{registry-context-C7-RLxVt.cjs → registry-context-bf52ZIJX.cjs} +12 -20
- package/dist/registry-context-bf52ZIJX.cjs.map +1 -0
- package/package.json +11 -11
- package/dist/ContainerWidget-NFBqSeRV.cjs +0 -8
- package/dist/FluidProvider-B3DjYoUW.mjs.map +0 -1
- package/dist/FluidProvider-DcpUKHrn.cjs.map +0 -1
- package/dist/MediaRenderer-CfgWd0cC.cjs.map +0 -1
- package/dist/MediaRenderer-CqUpv3St.mjs.map +0 -1
- package/dist/TableWidget-B0CRdzNf.mjs.map +0 -1
- package/dist/TableWidget-D4jQN-to.cjs.map +0 -1
- package/dist/WidgetInteractionContext-Bs3LkFFH.cjs +0 -18
- package/dist/WidgetInteractionContext-D0TJv70C.mjs +0 -11
- package/dist/registry-context-BDH0vNHR.mjs.map +0 -1
- package/dist/registry-context-C7-RLxVt.cjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ListWidget-wBDnXWxa.cjs","names":["MediaRenderer","DOMPurify","getImageUrl","useWidgetInteraction","gapValues","useWidgetInteraction","gapValues","borderWidthClasses","borderColorClasses","ChevronLeft","ChevronRight","useLayoutEffect","useEffect","getFontSizeField","getColorField","getPaddingField","getBorderRadiusField","getBorderWidthField","getBorderColorField","getGapField"],"sources":["../../widgets/src/widgets/list-widget/helpers.ts","../../widgets/src/widgets/list-widget/FeaturedSection.tsx","../../widgets/src/widgets/list-widget/ListItemCard.tsx","../../widgets/src/widgets/list-widget/UnorderedList.tsx","../../widgets/src/widgets/list-widget/OrderedList.tsx","../../widgets/src/widgets/ListWidget.tsx"],"sourcesContent":["import type { BorderRadiusOptions } from \"@fluid-app/portal-core/types\";\n\n/**\n * Maps the schema's BorderRadiusOptions to a Tailwind `rounded-*` class.\n * `\"full\"` is converted to `rounded-2xl` because the list item cards and\n * featured section read better as large-radius rectangles than as\n * pill-shaped containers.\n */\nexport const cardRadiusClass = (radius: BorderRadiusOptions): string =>\n radius === \"full\" ? \"rounded-2xl\" : `rounded-${radius}`;\n","import type React from \"react\";\nimport type {\n BorderRadiusOptions,\n FontSizeOptions,\n ColorOptions,\n} from \"@fluid-app/portal-core/types\";\nimport { MediaRenderer } from \"../../components/MediaRenderer\";\nimport { cardRadiusClass } from \"./helpers\";\n\ninterface FeaturedSectionProps {\n borderRadius: BorderRadiusOptions;\n titleSize: FontSizeOptions;\n featuredTitle?: string | undefined;\n featuredSubtitle?: string | undefined;\n featuredButtonText?: string | undefined;\n featuredButtonUrl?: string | undefined;\n featuredSubtitleColor: ColorOptions;\n featuredSubtitleSize: FontSizeOptions;\n asset: { url: string; isVideo: boolean };\n}\n\nexport function FeaturedSection({\n borderRadius,\n titleSize,\n featuredTitle,\n featuredSubtitle,\n featuredButtonText,\n featuredButtonUrl,\n featuredSubtitleColor,\n featuredSubtitleSize,\n asset,\n}: FeaturedSectionProps): React.JSX.Element {\n return (\n <div\n className={`group relative h-full min-h-[320px] w-full overflow-hidden ${cardRadiusClass(borderRadius)}`}\n >\n <div className=\"absolute inset-0 h-full w-full\">\n <MediaRenderer\n src={asset.url}\n mediaType={asset.isVideo ? \"video\" : \"image\"}\n alt={featuredTitle || \"Featured\"}\n objectFit=\"cover\"\n autoplay={asset.isVideo}\n loop={asset.isVideo}\n muted={asset.isVideo}\n controls={false}\n />\n </div>\n\n <div\n className=\"pointer-events-none absolute inset-0\"\n style={{\n background:\n \"linear-gradient(180deg, rgba(0,0,0,0) 45%, rgba(0,0,0,0.55) 100%)\",\n }}\n />\n\n <div className=\"absolute inset-0 flex flex-col items-start justify-end p-10\">\n {featuredTitle && (\n <h3\n className={`font-header mb-3 font-medium tracking-tight text-white text-${titleSize === \"md\" ? \"base\" : titleSize}`}\n >\n {featuredTitle}\n </h3>\n )}\n {featuredSubtitle && (\n <p\n className={`mb-6 max-w-md text-${featuredSubtitleColor}/80 text-${featuredSubtitleSize === \"md\" ? \"base\" : featuredSubtitleSize} leading-relaxed`}\n >\n {featuredSubtitle}\n </p>\n )}\n {featuredButtonText && (\n <a\n href={featuredButtonUrl || \"#\"}\n className={`text-foreground inline-flex items-center gap-2 bg-white px-6 py-3 text-sm font-medium tracking-tight transition-opacity hover:opacity-90 ${cardRadiusClass(borderRadius)}`}\n >\n {featuredButtonText}\n <span\n aria-hidden=\"true\"\n className=\"transition-transform group-hover:translate-x-0.5\"\n >\n →\n </span>\n </a>\n )}\n </div>\n </div>\n );\n}\n","import type React from \"react\";\nimport DOMPurify from \"dompurify\";\nimport type {\n ColorOptions,\n FontSizeOptions,\n PaddingOptions,\n} from \"@fluid-app/portal-core/types\";\n\ntype ListItem = {\n id: string;\n image?: string;\n imageUrl?: string;\n videoUrl?: string;\n title?: string;\n description?: string;\n price?: string;\n display_price?: string;\n originalPrice?: string;\n discount?: string;\n qv?: string;\n cv?: string;\n [key: string]: unknown;\n};\n\nfunction getStringValue(value: unknown): string {\n if (!value) return \"\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") return String(value);\n if (typeof value === \"object\" && value !== null) {\n if (\"body\" in value) {\n const body = (value as { body: unknown }).body;\n if (typeof body === \"string\") return body;\n }\n if (\"text\" in value) {\n const text = (value as { text: unknown }).text;\n if (typeof text === \"string\") return text;\n }\n if (\"value\" in value) {\n const val = (value as { value: unknown }).value;\n if (typeof val === \"string\") return val;\n if (typeof val === \"number\") return String(val);\n }\n }\n return \"\";\n}\n\nfunction stripParentheticalText(text: string): string {\n return text.replace(/\\s*\\([^)]*\\)/g, \"\").trim();\n}\n\nfunction formatPrice(value: unknown): string {\n const str = getStringValue(value);\n if (!str) return \"\";\n return stripParentheticalText(str);\n}\n\nexport interface ListItemCardContentProps {\n item: ListItem;\n padding: PaddingOptions;\n itemTitleColor: ColorOptions;\n itemTitleSize: FontSizeOptions;\n descriptionColor: ColorOptions;\n descriptionSize: FontSizeOptions;\n priceColor: ColorOptions;\n priceSize: FontSizeOptions;\n originalPriceColor: ColorOptions;\n metaTextColor: ColorOptions;\n metaTextSize: FontSizeOptions;\n showMetaText: boolean;\n}\n\nexport function ListItemCardContent({\n item,\n padding,\n itemTitleColor,\n itemTitleSize,\n descriptionColor,\n descriptionSize,\n priceColor,\n priceSize,\n originalPriceColor,\n metaTextColor,\n metaTextSize,\n showMetaText,\n}: ListItemCardContentProps): React.JSX.Element {\n const hasPrice = Boolean(item.display_price || item.price);\n const hasOriginal = Boolean(item.originalPrice);\n\n return (\n <div className={`flex flex-1 flex-col p-${padding}`}>\n {item.title && (\n <h3\n className={`text-${itemTitleColor} text-${itemTitleSize === \"md\" ? \"base\" : itemTitleSize} font-header mb-1.5 leading-snug font-medium tracking-tight`}\n >\n {getStringValue(item.title)}\n </h3>\n )}\n {item.description && (\n <div\n className={`text-${descriptionColor}/60 text-${descriptionSize === \"md\" ? \"base\" : descriptionSize} mb-3 line-clamp-2 overflow-hidden leading-relaxed`}\n dangerouslySetInnerHTML={{\n __html: DOMPurify.sanitize(item.description ?? \"\", {\n ALLOWED_TAGS: [\n \"br\",\n \"strong\",\n \"em\",\n \"b\",\n \"i\",\n \"ul\",\n \"ol\",\n \"li\",\n \"p\",\n ],\n ALLOWED_ATTR: [],\n }),\n }}\n />\n )}\n {(hasPrice || hasOriginal) && (\n <div className=\"mt-auto flex items-baseline gap-2\">\n {hasPrice && (\n <span\n className={`text-${priceColor} text-${priceSize === \"md\" ? \"base\" : priceSize} font-semibold tracking-tight tabular-nums`}\n >\n {formatPrice(item.display_price || item.price)}\n </span>\n )}\n {hasOriginal && (\n <span\n className={`text-${originalPriceColor}/50 text-${descriptionSize === \"md\" ? \"base\" : descriptionSize} tabular-nums line-through`}\n >\n {formatPrice(item.originalPrice)}\n </span>\n )}\n </div>\n )}\n {showMetaText && (item.qv || item.cv) && (\n <div\n className={`mt-2 flex gap-4 text-${metaTextColor}/70 text-${metaTextSize === \"md\" ? \"base\" : metaTextSize} font-medium tracking-wide uppercase`}\n >\n {item.qv && (\n <span>\n <span className=\"opacity-50\">QV</span>{\" \"}\n <span className=\"tabular-nums\">{getStringValue(item.qv)}</span>\n </span>\n )}\n {item.cv && (\n <span>\n <span className=\"opacity-50\">CV</span>{\" \"}\n <span className=\"tabular-nums\">{getStringValue(item.cv)}</span>\n </span>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport function DiscountBadge({\n discount,\n}: {\n discount: string;\n}): React.JSX.Element {\n return (\n <div className=\"bg-background text-foreground absolute top-3 left-3 z-10 rounded-full px-2.5 py-1 text-[10px] font-semibold tracking-[0.08em] uppercase\">\n {getStringValue(discount)}\n </div>\n );\n}\n\nexport { getStringValue };\nexport type { ListItem };\n","import type React from \"react\";\nimport type {\n ColorOptions,\n FontSizeOptions,\n BorderRadiusOptions,\n PaddingOptions,\n GapOptions,\n} from \"@fluid-app/portal-core/types\";\nimport { gapValues } from \"../../core/fields\";\nimport { useWidgetInteraction } from \"../../contexts/WidgetInteractionContext\";\nimport {\n ListItemCardContent,\n DiscountBadge,\n type ListItem,\n} from \"./ListItemCard\";\nimport { cardRadiusClass } from \"./helpers\";\n\ntype ImageAspectRatio = \"square\" | \"landscape\" | \"portrait\";\n\nconst getImageUrl = (item: ListItem): string | undefined => {\n return item.imageUrl || item.image;\n};\n\nconst getAspectRatioClass = (ratio: ImageAspectRatio): string => {\n const ratios = {\n square: \"aspect-square\",\n landscape: \"aspect-video\",\n portrait: \"aspect-[3/4]\",\n };\n return ratios[ratio];\n};\n\nconst getResponsiveGridClass = (columns: number): string => {\n const responsiveClasses: Record<number, string> = {\n 1: \"grid-cols-2 @lg:grid-cols-1\",\n 2: \"grid-cols-2 @lg:grid-cols-2\",\n 3: \"grid-cols-2 @lg:grid-cols-3\",\n 4: \"grid-cols-2 @lg:grid-cols-4\",\n 5: \"grid-cols-2 @lg:grid-cols-5\",\n 6: \"grid-cols-2 @lg:grid-cols-6\",\n };\n return responsiveClasses[columns] || \"grid-cols-2 @lg:grid-cols-3\";\n};\n\nexport interface UnorderedListProps {\n items: ListItem[];\n columns: number;\n gap: GapOptions;\n borderRadius: BorderRadiusOptions;\n imageAspectRatio: ImageAspectRatio;\n showBadge: boolean;\n padding: PaddingOptions;\n itemTitleColor: ColorOptions;\n itemTitleSize: FontSizeOptions;\n descriptionColor: ColorOptions;\n descriptionSize: FontSizeOptions;\n priceColor: ColorOptions;\n priceSize: FontSizeOptions;\n originalPriceColor: ColorOptions;\n metaTextColor: ColorOptions;\n metaTextSize: FontSizeOptions;\n showMetaText: boolean;\n}\n\nexport function UnorderedList({\n items,\n columns,\n gap,\n borderRadius,\n imageAspectRatio,\n showBadge,\n padding,\n itemTitleColor,\n itemTitleSize,\n descriptionColor,\n descriptionSize,\n priceColor,\n priceSize,\n originalPriceColor,\n metaTextColor,\n metaTextSize,\n showMetaText,\n}: UnorderedListProps): React.JSX.Element {\n const gridClass = getResponsiveGridClass(columns);\n const { onItemClick } = useWidgetInteraction();\n\n return (\n <div className={`grid ${gridClass} gap-${gapValues[gap]}`}>\n {items.map((item) => {\n const imageUrl = getImageUrl(item);\n const aspectRatioClass = getAspectRatioClass(imageAspectRatio);\n\n return (\n <div\n key={item.id}\n className={`group relative flex flex-col ${onItemClick ? \"cursor-pointer\" : \"\"}`}\n {...(onItemClick\n ? {\n role: \"button\",\n tabIndex: 0,\n onClick: () => onItemClick(item),\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onItemClick(item);\n }\n },\n }\n : {})}\n >\n {imageUrl && (\n <div\n className={`relative w-full ${aspectRatioClass} bg-muted/30 overflow-hidden ${cardRadiusClass(borderRadius)}`}\n >\n {showBadge && item.discount && (\n <DiscountBadge discount={item.discount} />\n )}\n <img\n src={imageUrl}\n alt={item.title || \"Product\"}\n className=\"h-full w-full object-cover transition-opacity duration-300 group-hover:opacity-90\"\n />\n </div>\n )}\n <div className=\"mt-4\">\n <ListItemCardContent\n item={item}\n padding={padding}\n itemTitleColor={itemTitleColor}\n itemTitleSize={itemTitleSize}\n descriptionColor={descriptionColor}\n descriptionSize={descriptionSize}\n priceColor={priceColor}\n priceSize={priceSize}\n originalPriceColor={originalPriceColor}\n metaTextColor={metaTextColor}\n metaTextSize={metaTextSize}\n showMetaText={showMetaText}\n />\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","import { useRef } from \"react\";\nimport type React from \"react\";\nimport type { RefObject } from \"react\";\nimport type {\n ColorOptions,\n FontSizeOptions,\n BorderRadiusOptions,\n PaddingOptions,\n GapOptions,\n} from \"@fluid-app/portal-core/types\";\nimport { gapValues } from \"../../core/fields\";\nimport { useWidgetInteraction } from \"../../contexts/WidgetInteractionContext\";\nimport {\n ListItemCardContent,\n DiscountBadge,\n getStringValue,\n type ListItem,\n} from \"./ListItemCard\";\nimport { cardRadiusClass } from \"./helpers\";\n\ntype ImageAspectRatio = \"square\" | \"landscape\" | \"portrait\";\ntype ScrollAxis = \"horizontal\" | \"vertical\";\n\nconst getImageUrl = (item: ListItem): string | undefined => {\n return item.imageUrl || item.image;\n};\n\nexport interface OrderedListProps {\n items: ListItem[];\n scrollAxis: ScrollAxis;\n gap: GapOptions;\n borderRadius: BorderRadiusOptions;\n imageAspectRatio: ImageAspectRatio;\n showBadge: boolean;\n padding: PaddingOptions;\n itemTitleColor: ColorOptions;\n itemTitleSize: FontSizeOptions;\n descriptionColor: ColorOptions;\n descriptionSize: FontSizeOptions;\n priceColor: ColorOptions;\n priceSize: FontSizeOptions;\n originalPriceColor: ColorOptions;\n metaTextColor: ColorOptions;\n metaTextSize: FontSizeOptions;\n numberColor: ColorOptions;\n numberSize: FontSizeOptions;\n showMetaText: boolean;\n /** Optional ref from the parent to control horizontal scroll externally */\n scrollContainerRef?: RefObject<HTMLDivElement | null> | undefined;\n}\n\nconst formatRank = (n: number): string => (n < 10 ? `0${n}` : String(n));\n\nexport function OrderedList({\n items,\n scrollAxis,\n gap,\n borderRadius,\n // imageAspectRatio is intentionally not consumed — ordered layouts use a\n // fixed aspect ratio per axis (3:4 poster horizontal, 16x16 thumb vertical)\n // by design. The schema gates this field to unordered lists.\n imageAspectRatio: _imageAspectRatio,\n showBadge,\n padding,\n itemTitleColor,\n itemTitleSize,\n descriptionColor,\n descriptionSize,\n priceColor,\n priceSize,\n originalPriceColor,\n metaTextColor,\n metaTextSize,\n numberColor,\n numberSize,\n showMetaText,\n scrollContainerRef: externalScrollRef,\n}: OrderedListProps): React.JSX.Element | null {\n const internalScrollRef = useRef<HTMLDivElement>(null);\n const scrollContainerRef = externalScrollRef ?? internalScrollRef;\n\n const { onItemClick } = useWidgetInteraction();\n\n const interactionProps = (item: ListItem) =>\n onItemClick\n ? ({\n role: \"button\" as const,\n tabIndex: 0,\n onClick: () => onItemClick(item),\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onItemClick(item);\n }\n },\n } as const)\n : {};\n\n const contentProps = {\n padding,\n itemTitleColor,\n itemTitleSize,\n descriptionColor,\n descriptionSize,\n priceColor,\n priceSize,\n originalPriceColor,\n metaTextColor,\n metaTextSize,\n showMetaText,\n };\n\n if (scrollAxis === \"horizontal\") {\n return (\n <div className=\"relative\">\n <div\n ref={scrollContainerRef}\n className={`flex gap-${gapValues[gap]} scrollbar-hide overflow-x-auto overflow-y-hidden scroll-smooth`}\n >\n {items.map((item, index) => {\n const imageUrl = getImageUrl(item);\n const rank = index + 1;\n\n return (\n <div\n key={item.id}\n className={`group relative flex flex-shrink-0 flex-col ${onItemClick ? \"cursor-pointer\" : \"\"}`}\n {...interactionProps(item)}\n >\n <div className=\"flex items-end\">\n <span className=\"sr-only\">Rank {rank}: </span>\n <span\n className={`text-${numberColor} pointer-events-none flex-shrink-0 font-black italic tabular-nums select-none`}\n style={{\n fontSize: \"11rem\",\n lineHeight: \"0.82\",\n letterSpacing: \"-0.06em\",\n }}\n aria-hidden=\"true\"\n >\n {rank}\n </span>\n {imageUrl && (\n <div\n className={`relative aspect-[3/4] w-[200px] flex-shrink-0 ${cardRadiusClass(borderRadius)} bg-muted/30 overflow-hidden`}\n >\n {showBadge && item.discount && (\n <DiscountBadge discount={item.discount} />\n )}\n <img\n src={imageUrl}\n alt={item.title || \"Product\"}\n className=\"h-full w-full object-cover\"\n />\n </div>\n )}\n </div>\n <div className=\"mt-5 ml-auto w-[200px]\">\n <ListItemCardContent item={item} {...contentProps} />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n }\n\n if (scrollAxis === \"vertical\") {\n return (\n <div className={`flex flex-col gap-${gapValues[gap]}`}>\n {items.map((item, index) => {\n const imageUrl = getImageUrl(item);\n const rank = index + 1;\n const isLast = index === items.length - 1;\n\n return (\n <div\n key={item.id}\n className={`group relative flex items-center gap-${gapValues[gap]} py-6 ${!isLast ? \"border-b\" : \"\"} ${onItemClick ? \"cursor-pointer\" : \"\"}`}\n style={\n !isLast\n ? {\n borderColor:\n \"color-mix(in oklch, var(--color-foreground) 8%, transparent)\",\n }\n : undefined\n }\n {...interactionProps(item)}\n >\n <span className=\"sr-only\">Rank {rank}: </span>\n <span\n className={`text-${numberColor} font-header w-14 flex-shrink-0 text-${numberSize === \"md\" ? \"base\" : numberSize} leading-none font-light tracking-tight italic`}\n aria-hidden=\"true\"\n >\n {formatRank(rank)}\n </span>\n {imageUrl && (\n <div\n className={`relative h-16 w-16 flex-shrink-0 overflow-hidden ${cardRadiusClass(borderRadius)} bg-muted/30`}\n >\n <img\n src={imageUrl}\n alt={item.title || \"Product\"}\n className=\"h-full w-full object-cover\"\n />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <ListItemCardContent item={item} {...contentProps} />\n </div>\n {showBadge && item.discount && (\n <span className=\"text-muted ml-2 flex-shrink-0 text-[10px] font-semibold tracking-[0.08em] uppercase\">\n {getStringValue(item.discount)}\n </span>\n )}\n </div>\n );\n })}\n </div>\n );\n }\n\n return null;\n}\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type ComponentProps,\n} from \"react\";\nimport type React from \"react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport type {\n BorderWidthOptions,\n ColorOptions,\n FontSizeOptions,\n BorderRadiusOptions,\n PaddingOptions,\n GapOptions,\n BackgroundValue,\n} from \"@fluid-app/portal-core/types\";\nimport type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\nimport {\n getBorderRadiusField,\n getBorderWidthField,\n getBorderColorField,\n borderWidthClasses,\n borderColorClasses,\n getColorField,\n getFontSizeField,\n getPaddingField,\n getGapField,\n} from \"../core/fields\";\nimport { FeaturedSection } from \"./list-widget/FeaturedSection\";\nimport { UnorderedList } from \"./list-widget/UnorderedList\";\nimport { OrderedList } from \"./list-widget/OrderedList\";\n\nconst DEFAULT_ITEMS: ListItem[] = [];\n\ntype ListItem = {\n id: string;\n image?: string;\n imageUrl?: string;\n videoUrl?: string;\n title?: string;\n description?: string;\n price?: string;\n originalPrice?: string;\n discount?: string;\n qv?: string;\n cv?: string;\n [key: string]: unknown;\n};\n\ntype ImageAspectRatio = \"square\" | \"landscape\" | \"portrait\";\ntype ListType = \"ordered\" | \"unordered\";\ntype ScrollAxis = \"horizontal\" | \"vertical\";\n\ntype ListWidgetProps = ComponentProps<\"div\"> & {\n // List configuration\n listType?: ListType;\n scrollAxis?: ScrollAxis;\n titleEnabled?: boolean;\n title?: string;\n items?: ListItem[];\n\n // Text styling\n titleColor?: ColorOptions;\n titleSize?: FontSizeOptions;\n itemTitleColor?: ColorOptions;\n itemTitleSize?: FontSizeOptions;\n descriptionColor?: ColorOptions;\n descriptionSize?: FontSizeOptions;\n priceColor?: ColorOptions;\n priceSize?: FontSizeOptions;\n originalPriceColor?: ColorOptions;\n metaTextColor?: ColorOptions;\n metaTextSize?: FontSizeOptions;\n\n // Ordered list styling\n numberColor?: ColorOptions;\n numberSize?: FontSizeOptions;\n\n // Layout\n borderRadius?: BorderRadiusOptions;\n borderWidth?: BorderWidthOptions;\n borderColor?: ColorOptions;\n padding?: PaddingOptions;\n gap?: GapOptions;\n columns?: number;\n imageAspectRatio?: ImageAspectRatio;\n background?: BackgroundValue;\n\n // Behavior\n showBadge?: boolean;\n showMetaText?: boolean;\n maxItems?: number;\n\n // Featured section\n showFeaturedSection?: boolean;\n featuredAsset?: string | { [key: string]: unknown };\n featuredTitle?: string;\n featuredSubtitle?: string;\n featuredButtonText?: string;\n featuredButtonUrl?: string;\n featuredSubtitleColor?: ColorOptions;\n featuredSubtitleSize?: FontSizeOptions;\n};\n\nfunction getFeaturedAssetUrl(\n value: string | { [key: string]: unknown } | undefined,\n): { url: string; isVideo: boolean } | undefined {\n if (!value) return undefined;\n\n // Handle string URLs\n if (typeof value === \"string\") {\n const isVideo = /\\.(mp4|webm|ogg|mov)$/i.test(value);\n return { url: value, isVideo };\n }\n\n // Handle ShareableItem objects\n if (typeof value === \"object\") {\n // Check for video URL first\n const videoUrl =\n (value.videoUrl as string) ||\n (value.video_url as string) ||\n (value.url as string);\n if (videoUrl && /\\.(mp4|webm|ogg|mov)$/i.test(videoUrl)) {\n return { url: videoUrl, isVideo: true };\n }\n\n // Fall back to image URL\n const imageUrl =\n (value.imageUrl as string) ||\n (value.image_url as string) ||\n (value.url as string);\n if (imageUrl) {\n return { url: imageUrl, isVideo: false };\n }\n }\n\n return undefined;\n}\n\nexport function ListWidget({\n listType = \"unordered\",\n scrollAxis = \"horizontal\",\n titleEnabled = true,\n title,\n items = DEFAULT_ITEMS,\n titleColor = \"foreground\",\n titleSize = \"lg\",\n itemTitleColor = \"foreground\",\n itemTitleSize = \"sm\",\n descriptionColor = \"foreground\",\n descriptionSize = \"sm\",\n priceColor = \"foreground\",\n priceSize = \"md\",\n originalPriceColor = \"muted\",\n metaTextColor = \"muted\",\n metaTextSize = \"xs\",\n numberColor = \"primary\",\n numberSize = \"2xl\",\n borderRadius = \"md\",\n borderWidth = \"none\",\n borderColor = \"muted\",\n padding = 4,\n gap = \"md\",\n columns = 3,\n imageAspectRatio = \"square\",\n background = { type: \"solid\", color: \"background\" },\n showBadge = true,\n showMetaText = true,\n maxItems = 12,\n showFeaturedSection = false,\n featuredAsset,\n featuredTitle,\n featuredSubtitle,\n featuredButtonText,\n featuredButtonUrl,\n featuredSubtitleColor = \"background\",\n featuredSubtitleSize = \"md\",\n className,\n ...props\n}: ListWidgetProps): React.JSX.Element {\n const displayItems = maxItems ? items.slice(0, maxItems) : items;\n const hasItems = displayItems.length > 0;\n\n const itemStyleProps = {\n padding,\n itemTitleColor,\n itemTitleSize,\n descriptionColor,\n descriptionSize,\n priceColor,\n priceSize,\n originalPriceColor,\n metaTextColor,\n metaTextSize,\n showMetaText,\n showBadge,\n borderRadius,\n imageAspectRatio,\n gap,\n };\n\n const hasFeaturedAsset = getFeaturedAssetUrl(featuredAsset);\n const shouldShowFeaturedSection = showFeaturedSection && hasFeaturedAsset;\n\n // Background styling\n const backgroundColor = background.color || \"background\";\n const backgroundImage =\n (background.resource?.image_url || background.resource?.imageUrl) &&\n background.type === \"image\"\n ? `url(${background.resource.image_url || background.resource.imageUrl})`\n : \"none\";\n\n const isOrderedHorizontal =\n listType === \"ordered\" && scrollAxis === \"horizontal\";\n const showScrollArrows =\n isOrderedHorizontal && hasItems && displayItems.length > 1;\n\n const { scrollContainerRef, canScrollPrev, canScrollNext, scrollByAmount } =\n useHorizontalScrollState({\n enabled: showScrollArrows,\n contentLength: displayItems.length,\n });\n\n const hasTitle = titleEnabled && title;\n const showTitleRow = hasTitle || showScrollArrows;\n\n return (\n <div\n className={`@container bg-${backgroundColor} p-${padding} rounded-${borderRadius} ${borderWidthClasses[borderWidth]} ${borderWidth !== \"none\" ? borderColorClasses[borderColor] : \"\"} ${className}`}\n style={{ backgroundImage }}\n {...props}\n >\n {showTitleRow && (\n <div className=\"mb-8 flex items-center justify-between gap-4\">\n {hasTitle ? (\n <h2\n className={`text-${titleColor} text-${titleSize === \"md\" ? \"base\" : titleSize} font-header leading-tight font-medium tracking-tight`}\n >\n {title}\n </h2>\n ) : (\n <span />\n )}\n {showScrollArrows && (\n <div className=\"flex shrink-0 items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => scrollByAmount(\"prev\")}\n disabled={!canScrollPrev}\n aria-label=\"Previous items\"\n className={`text-${numberColor} flex size-9 items-center justify-center rounded-full transition-opacity hover:opacity-60 disabled:cursor-not-allowed disabled:opacity-20`}\n style={{\n boxShadow: `inset 0 0 0 1px color-mix(in oklch, var(--color-${numberColor}) 25%, transparent)`,\n }}\n >\n <ChevronLeft aria-hidden=\"true\" className=\"size-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => scrollByAmount(\"next\")}\n disabled={!canScrollNext}\n aria-label=\"Next items\"\n className={`text-${numberColor} flex size-9 items-center justify-center rounded-full transition-opacity hover:opacity-60 disabled:cursor-not-allowed disabled:opacity-20`}\n style={{\n boxShadow: `inset 0 0 0 1px color-mix(in oklch, var(--color-${numberColor}) 25%, transparent)`,\n }}\n >\n <ChevronRight aria-hidden=\"true\" className=\"size-4\" />\n </button>\n </div>\n )}\n </div>\n )}\n {!hasItems ? (\n <div className=\"flex items-center justify-center py-20 text-center\">\n <p className=\"text-muted/70 text-sm tracking-tight\">\n No items to display\n </p>\n </div>\n ) : shouldShowFeaturedSection ? (\n <div className=\"flex flex-col gap-4 @lg:flex-row @lg:gap-6\">\n <div className=\"w-full @lg:w-[45%]\">\n <FeaturedSection\n borderRadius={borderRadius}\n titleSize={titleSize}\n featuredTitle={featuredTitle}\n featuredSubtitle={featuredSubtitle}\n featuredButtonText={featuredButtonText}\n featuredButtonUrl={featuredButtonUrl}\n featuredSubtitleColor={featuredSubtitleColor}\n featuredSubtitleSize={featuredSubtitleSize}\n asset={hasFeaturedAsset!}\n />\n </div>\n <div className=\"w-full @lg:w-[55%]\">\n {listType === \"unordered\" ? (\n <UnorderedList\n items={displayItems}\n columns={columns}\n {...itemStyleProps}\n />\n ) : (\n <OrderedList\n items={displayItems}\n scrollAxis={scrollAxis}\n numberColor={numberColor}\n numberSize={numberSize}\n scrollContainerRef={\n isOrderedHorizontal ? scrollContainerRef : undefined\n }\n {...itemStyleProps}\n />\n )}\n </div>\n </div>\n ) : listType === \"unordered\" ? (\n <UnorderedList\n items={displayItems}\n columns={columns}\n {...itemStyleProps}\n />\n ) : (\n <OrderedList\n items={displayItems}\n scrollAxis={scrollAxis}\n numberColor={numberColor}\n numberSize={numberSize}\n scrollContainerRef={\n isOrderedHorizontal ? scrollContainerRef : undefined\n }\n {...itemStyleProps}\n />\n )}\n </div>\n );\n}\n\n// ----- Hooks -----\n\nconst SCROLL_BUTTON_AMOUNT = 300;\nconst SCROLL_EDGE_TOLERANCE = 4;\nconst useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\ntype HorizontalScrollState = {\n scrollContainerRef: React.RefObject<HTMLDivElement | null>;\n canScrollPrev: boolean;\n canScrollNext: boolean;\n scrollByAmount: (direction: \"prev\" | \"next\") => void;\n};\n\n// Tracks horizontal scroll position of an external container so the parent\n// can drive prev/next arrow disabled states from a single source of truth.\n// Both edges initialize to `false` and are populated by the post-mount\n// measurement, avoiding a brief enabled-then-disabled flicker when content\n// fits entirely within the viewport.\nfunction useHorizontalScrollState({\n enabled,\n contentLength,\n}: {\n enabled: boolean;\n contentLength: number;\n}): HorizontalScrollState {\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n const [canScrollPrev, setCanScrollPrev] = useState(false);\n const [canScrollNext, setCanScrollNext] = useState(false);\n\n const resetScrollState = useCallback(() => {\n setCanScrollPrev(false);\n setCanScrollNext(false);\n }, []);\n\n const updateScrollState = useCallback(() => {\n const el = scrollContainerRef.current;\n if (!enabled || !el) {\n resetScrollState();\n return;\n }\n setCanScrollPrev(el.scrollLeft > SCROLL_EDGE_TOLERANCE);\n setCanScrollNext(\n el.scrollLeft + el.clientWidth < el.scrollWidth - SCROLL_EDGE_TOLERANCE,\n );\n }, [enabled, resetScrollState]);\n\n // Fires synchronously before paint so the arrows reflect post-layout\n // geometry without a flicker. `updateScrollState` is memoized on\n // `enabled`, so this only fires on mount and when toggling enablement —\n // not on every render.\n useIsomorphicLayoutEffect(() => {\n updateScrollState();\n }, [updateScrollState]);\n\n useEffect(() => {\n if (!enabled) {\n resetScrollState();\n return undefined;\n }\n\n const el = scrollContainerRef.current;\n if (!el) {\n resetScrollState();\n return undefined;\n }\n\n updateScrollState();\n el.addEventListener(\"scroll\", updateScrollState, { passive: true });\n const resize =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(updateScrollState)\n : undefined;\n resize?.observe(el);\n\n return () => {\n el.removeEventListener(\"scroll\", updateScrollState);\n resize?.disconnect();\n };\n }, [enabled, resetScrollState, updateScrollState, contentLength]);\n\n const scrollByAmount = useCallback((direction: \"prev\" | \"next\") => {\n const el = scrollContainerRef.current;\n if (!el) return;\n const computedGap = parseFloat(getComputedStyle(el).gap) || 0;\n const amount = SCROLL_BUTTON_AMOUNT + computedGap;\n el.scrollTo({\n left: el.scrollLeft + (direction === \"next\" ? amount : -amount),\n behavior: \"smooth\",\n });\n }, []);\n\n return { scrollContainerRef, canScrollPrev, canScrollNext, scrollByAmount };\n}\n\nexport const listWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"ListWidget\",\n displayName: \"List\",\n tabsConfig: [\n { id: \"styling\", label: \"Styling\" },\n { id: \"data\", label: \"Data\" },\n ],\n dataSourceTargetProps: [\"items\"],\n fields: [\n // Styling tab - Title group\n {\n key: \"titleEnabled\",\n label: \"Widget Title\",\n type: \"boolean\",\n description: \"Enable the title displayed above the list\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Title\",\n },\n {\n key: \"title\",\n label: \"Title\",\n type: \"text\",\n description: \"Header text for the list\",\n defaultValue: \"List\",\n tab: \"styling\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n },\n getFontSizeField({\n key: \"titleSize\",\n label: \"Title Font Size\",\n description: \"Size of the list title\",\n defaultValue: \"xl\",\n tab: \"styling\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n getColorField({\n key: \"titleColor\",\n label: \"Title Color\",\n description: \"Color for the list title\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n\n // Styling tab - Design group\n getPaddingField({\n key: \"padding\",\n label: \"Padding\",\n description: \"Padding inside the container\",\n defaultValue: 4,\n tab: \"styling\",\n group: \"Design\",\n }),\n getBorderRadiusField({\n key: \"borderRadius\",\n label: \"Border Radius\",\n description: \"Rounded corners for the container and images\",\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 getGapField({\n key: \"gap\",\n label: \"Gap\",\n description: \"Spacing between items\",\n defaultValue: \"md\",\n tab: \"styling\",\n group: \"Design\",\n }),\n {\n type: \"background\",\n defaultValue: \"background\",\n key: \"background\",\n label: \"Background\",\n description: \"Background color or image for the widget\",\n tab: \"styling\",\n group: \"Design\",\n },\n\n // Styling tab - List Configuration group\n {\n key: \"listType\",\n label: \"List Type\",\n type: \"select\",\n description: \"Type of list layout\",\n defaultValue: \"unordered\",\n options: [\n { label: \"Unordered (Grid)\", value: \"unordered\" },\n { label: \"Ordered (Numbered)\", value: \"ordered\" },\n ],\n tab: \"styling\",\n group: \"List Configuration\",\n },\n {\n key: \"maxItems\",\n label: \"Max Items\",\n type: \"number\",\n description: \"Maximum number of items to display\",\n min: 1,\n max: 100,\n step: 1,\n defaultValue: 12,\n tab: \"styling\",\n group: \"List Configuration\",\n },\n {\n key: \"imageAspectRatio\",\n label: \"Image Aspect Ratio\",\n type: \"buttonGroup\",\n description:\n \"Aspect ratio for item images (unordered list — ordered layouts use a fixed ratio per axis)\",\n defaultValue: \"square\",\n options: [\n { label: \"Square\", value: \"square\" },\n { label: \"Landscape\", value: \"landscape\" },\n { label: \"Portrait\", value: \"portrait\" },\n ],\n tab: \"styling\",\n group: \"List Configuration\",\n requiresKeyValue: { key: \"listType\", value: \"unordered\" },\n },\n {\n key: \"showBadge\",\n label: \"Show Discount Badge\",\n type: \"boolean\",\n description: \"Display discount badge on images\",\n defaultValue: true,\n tab: \"styling\",\n group: \"List Configuration\",\n },\n {\n key: \"showMetaText\",\n label: \"Show QV/CV Text\",\n type: \"boolean\",\n description: \"Display QV and CV values\",\n defaultValue: true,\n tab: \"styling\",\n group: \"List Configuration\",\n },\n\n // Styling tab - Unordered List Configuration\n {\n key: \"columns\",\n label: \"Grid Columns\",\n type: \"number\",\n description: \"Number of columns in the grid (unordered list only)\",\n min: 1,\n max: 6,\n step: 1,\n defaultValue: 3,\n tab: \"styling\",\n group: \"Unordered List Configuration\",\n requiresKeyValue: { key: \"listType\", value: \"unordered\" },\n },\n\n // Styling tab - Ordered List Configuration\n {\n key: \"scrollAxis\",\n label: \"Scroll Direction\",\n type: \"select\",\n description: \"Direction for ordered list scrolling\",\n defaultValue: \"horizontal\",\n options: [\n { label: \"Horizontal\", value: \"horizontal\" },\n { label: \"Vertical\", value: \"vertical\" },\n ],\n tab: \"styling\",\n group: \"Ordered List Configuration\",\n requiresKeyValue: { key: \"listType\", value: \"ordered\" },\n },\n getColorField({\n key: \"numberColor\",\n label: \"Number Color\",\n description: \"Color for ordered list numbers\",\n defaultValue: \"primary\",\n tab: \"styling\",\n group: \"Ordered List Configuration\",\n requiresKeyValue: { key: \"listType\", value: \"ordered\" },\n }),\n getFontSizeField({\n key: \"numberSize\",\n label: \"Number Font Size\",\n description:\n \"Size of ordered list numbers (vertical scroll only — horizontal uses a fixed editorial size)\",\n defaultValue: \"2xl\",\n tab: \"styling\",\n group: \"Ordered List Configuration\",\n requiresKeyValue: [\n { key: \"listType\", value: \"ordered\" },\n { key: \"scrollAxis\", value: \"vertical\" },\n ],\n }),\n\n // Styling tab - Item Styling group\n getColorField({\n key: \"itemTitleColor\",\n label: \"Item Title Color\",\n description: \"Color for item titles\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Item Styling\",\n }),\n getFontSizeField({\n key: \"itemTitleSize\",\n label: \"Item Title Font Size\",\n description: \"Size of item titles\",\n defaultValue: \"sm\",\n tab: \"styling\",\n group: \"Item Styling\",\n }),\n {\n key: \"separator2\",\n type: \"separator\",\n label: \"Separator\",\n tab: \"styling\",\n group: \"Item Styling\",\n },\n getColorField({\n key: \"descriptionColor\",\n label: \"Description Color\",\n description: \"Color for descriptions\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Item Styling\",\n }),\n getFontSizeField({\n key: \"descriptionSize\",\n label: \"Description Font Size\",\n description: \"Size of descriptions\",\n defaultValue: \"sm\",\n tab: \"styling\",\n group: \"Item Styling\",\n }),\n {\n key: \"separator3\",\n type: \"separator\",\n label: \"Separator\",\n tab: \"styling\",\n group: \"Item Styling\",\n },\n getColorField({\n key: \"priceColor\",\n label: \"Price Color\",\n description: \"Color for prices\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Item Styling\",\n }),\n getFontSizeField({\n key: \"priceSize\",\n label: \"Price Font Size\",\n description: \"Size of prices\",\n defaultValue: \"md\",\n tab: \"styling\",\n group: \"Item Styling\",\n }),\n getColorField({\n key: \"originalPriceColor\",\n label: \"Original Price Color\",\n description: \"Color for crossed-out original prices\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Item Styling\",\n }),\n {\n key: \"separator4\",\n type: \"separator\",\n label: \"Separator\",\n tab: \"styling\",\n group: \"Item Styling\",\n },\n getColorField({\n key: \"metaTextColor\",\n label: \"Meta Text Color\",\n description: \"Color for QV/CV text\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Item Styling\",\n }),\n getFontSizeField({\n key: \"metaTextSize\",\n label: \"Meta Text Font Size\",\n description: \"Size of QV/CV text\",\n defaultValue: \"xs\",\n tab: \"styling\",\n group: \"Item Styling\",\n }),\n\n // Styling tab - Featured Section group\n {\n key: \"showFeaturedSection\",\n label: \"Show Featured Section\",\n type: \"boolean\",\n description: \"Display a featured content section\",\n defaultValue: false,\n tab: \"styling\",\n group: \"Featured Section\",\n },\n {\n key: \"featuredAsset\",\n label: \"Featured Asset\",\n type: \"resource\",\n description:\n \"Select a single image or video resource for the featured section\",\n tab: \"styling\",\n group: \"Featured Section\",\n allowedTypes: [\"Medium\"],\n requiresKeyToBeTrue: \"showFeaturedSection\",\n },\n {\n key: \"featuredTitle\",\n label: \"Featured Title\",\n type: \"text\",\n description: \"Title for featured section\",\n tab: \"styling\",\n group: \"Featured Section\",\n requiresKeyToBeTrue: \"showFeaturedSection\",\n },\n {\n key: \"featuredSubtitle\",\n label: \"Featured Subtitle\",\n type: \"text\",\n description: \"Subtitle for featured section\",\n tab: \"styling\",\n group: \"Featured Section\",\n requiresKeyToBeTrue: \"showFeaturedSection\",\n },\n {\n key: \"featuredButtonText\",\n label: \"Featured Button Text\",\n type: \"text\",\n description: \"Text for featured section button\",\n tab: \"styling\",\n group: \"Featured Section\",\n requiresKeyToBeTrue: \"showFeaturedSection\",\n },\n {\n key: \"featuredButtonUrl\",\n label: \"Featured Button URL\",\n type: \"text\",\n description: \"URL for featured section button\",\n tab: \"styling\",\n group: \"Featured Section\",\n requiresKeyToBeTrue: \"showFeaturedSection\",\n },\n getColorField({\n key: \"featuredSubtitleColor\",\n label: \"Featured Subtitle Color\",\n description: \"Color for featured subtitle\",\n defaultValue: \"background\",\n tab: \"styling\",\n group: \"Featured Section\",\n requiresKeyToBeTrue: \"showFeaturedSection\",\n }),\n getFontSizeField({\n key: \"featuredSubtitleSize\",\n label: \"Featured Subtitle Font Size\",\n description: \"Size of featured subtitle\",\n defaultValue: \"md\",\n tab: \"styling\",\n group: \"Featured Section\",\n requiresKeyToBeTrue: \"showFeaturedSection\",\n }),\n\n // Data tab - Data Configuration\n {\n key: \"dataSource\",\n label: \"Data Source\",\n type: \"dataSource\",\n description: \"\",\n tab: \"data\",\n group: \"Data Configuration\",\n },\n ],\n itemConfigSchema: {\n description: \"Configure settings for this list item\",\n fields: [\n {\n key: \"title\",\n label: \"Custom Title\",\n type: \"text\",\n description: \"Override the item's title\",\n },\n {\n key: \"description\",\n label: \"Custom Description\",\n type: \"textarea\",\n description: \"Override the item's description\",\n rows: 3,\n },\n {\n key: \"price\",\n label: \"Price\",\n type: \"text\",\n description: \"Current price\",\n },\n {\n key: \"originalPrice\",\n label: \"Original Price\",\n type: \"text\",\n description: \"Original price (will be crossed out)\",\n },\n {\n key: \"discount\",\n label: \"Discount Badge\",\n type: \"text\",\n description: \"Discount text (e.g., '40% Off')\",\n },\n {\n key: \"qv\",\n label: \"QV Value\",\n type: \"text\",\n description: \"Qualifying Volume value\",\n },\n {\n key: \"cv\",\n label: \"CV Value\",\n type: \"text\",\n description: \"Commission Volume value\",\n },\n {\n key: \"image\",\n label: \"Image URL\",\n type: \"text\",\n description: \"Custom image URL for this item\",\n },\n ],\n },\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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ACR,CAAC;EACFD,mBAAAA,iBAAiB;GACf,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR,CAAC;EAGF;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aACE;GACF,KAAK;GACL,OAAO;GACP,cAAc,CAAC,SAAS;GACxB,qBAAqB;GACtB;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,KAAK;GACL,OAAO;GACP,qBAAqB;GACtB;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,KAAK;GACL,OAAO;GACP,qBAAqB;GACtB;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,KAAK;GACL,OAAO;GACP,qBAAqB;GACtB;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,KAAK;GACL,OAAO;GACP,qBAAqB;GACtB;EACDC,mBAAAA,cAAc;GACZ,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACP,qBAAqB;GACtB,CAAC;EACFD,mBAAAA,iBAAiB;GACf,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACP,qBAAqB;GACtB,CAAC;EAGF;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,KAAK;GACL,OAAO;GACR;EACF;CACD,kBAAkB;EAChB,aAAa;EACb,QAAQ;GACN;IACE,KAAK;IACL,OAAO;IACP,MAAM;IACN,aAAa;IACd;GACD;IACE,KAAK;IACL,OAAO;IACP,MAAM;IACN,aAAa;IACb,MAAM;IACP;GACD;IACE,KAAK;IACL,OAAO;IACP,MAAM;IACN,aAAa;IACd;GACD;IACE,KAAK;IACL,OAAO;IACP,MAAM;IACN,aAAa;IACd;GACD;IACE,KAAK;IACL,OAAO;IACP,MAAM;IACN,aAAa;IACd;GACD;IACE,KAAK;IACL,OAAO;IACP,MAAM;IACN,aAAa;IACd;GACD;IACE,KAAK;IACL,OAAO;IACP,MAAM;IACN,aAAa;IACd;GACD;IACE,KAAK;IACL,OAAO;IACP,MAAM;IACN,aAAa;IACd;GACF;EACF;CACF"}
|
|
1
|
+
{"version":3,"file":"ListWidget-CzljZ1LA.cjs","names":["MediaRenderer","DOMPurify","getImageUrl","useWidgetInteraction","gapValues","useWidgetInteraction","gapValues","borderWidthClasses","borderColorClasses","ChevronLeft","ChevronRight","useLayoutEffect","useEffect","getFontSizeField","getColorField","getPaddingField","getBorderRadiusField","getBorderWidthField","getBorderColorField","getGapField"],"sources":["../../widgets/src/widgets/list-widget/helpers.ts","../../widgets/src/widgets/list-widget/FeaturedSection.tsx","../../widgets/src/widgets/list-widget/ListItemCard.tsx","../../widgets/src/widgets/list-widget/UnorderedList.tsx","../../widgets/src/widgets/list-widget/OrderedList.tsx","../../widgets/src/widgets/ListWidget.tsx"],"sourcesContent":["import type { BorderRadiusOptions } from \"@fluid-app/portal-core/types\";\n\n/**\n * Maps the schema's BorderRadiusOptions to a Tailwind `rounded-*` class.\n * `\"full\"` is converted to `rounded-2xl` because the list item cards and\n * featured section read better as large-radius rectangles than as\n * pill-shaped containers.\n */\nexport const cardRadiusClass = (radius: BorderRadiusOptions): string =>\n radius === \"full\" ? \"rounded-2xl\" : `rounded-${radius}`;\n","import type React from \"react\";\nimport type {\n BorderRadiusOptions,\n FontSizeOptions,\n ColorOptions,\n} from \"@fluid-app/portal-core/types\";\nimport { MediaRenderer } from \"../../components/MediaRenderer\";\nimport { cardRadiusClass } from \"./helpers\";\n\ninterface FeaturedSectionProps {\n borderRadius: BorderRadiusOptions;\n titleSize: FontSizeOptions;\n featuredTitle?: string | undefined;\n featuredSubtitle?: string | undefined;\n featuredButtonText?: string | undefined;\n featuredButtonUrl?: string | undefined;\n featuredSubtitleColor: ColorOptions;\n featuredSubtitleSize: FontSizeOptions;\n asset: { url: string; isVideo: boolean };\n}\n\nexport function FeaturedSection({\n borderRadius,\n titleSize,\n featuredTitle,\n featuredSubtitle,\n featuredButtonText,\n featuredButtonUrl,\n featuredSubtitleColor,\n featuredSubtitleSize,\n asset,\n}: FeaturedSectionProps): React.JSX.Element {\n return (\n <div\n className={`group relative h-full min-h-[320px] w-full overflow-hidden ${cardRadiusClass(borderRadius)}`}\n >\n <div className=\"absolute inset-0 h-full w-full\">\n <MediaRenderer\n src={asset.url}\n mediaType={asset.isVideo ? \"video\" : \"image\"}\n alt={featuredTitle || \"Featured\"}\n objectFit=\"cover\"\n autoplay={asset.isVideo}\n loop={asset.isVideo}\n muted={asset.isVideo}\n controls={false}\n />\n </div>\n\n <div\n className=\"pointer-events-none absolute inset-0\"\n style={{\n background:\n \"linear-gradient(180deg, rgba(0,0,0,0) 45%, rgba(0,0,0,0.55) 100%)\",\n }}\n />\n\n <div className=\"absolute inset-0 flex flex-col items-start justify-end p-10\">\n {featuredTitle && (\n <h3\n className={`font-header mb-3 font-medium tracking-tight text-white text-${titleSize === \"md\" ? \"base\" : titleSize}`}\n >\n {featuredTitle}\n </h3>\n )}\n {featuredSubtitle && (\n <p\n className={`mb-6 max-w-md text-${featuredSubtitleColor}/80 text-${featuredSubtitleSize === \"md\" ? \"base\" : featuredSubtitleSize} leading-relaxed`}\n >\n {featuredSubtitle}\n </p>\n )}\n {featuredButtonText && (\n <a\n href={featuredButtonUrl || \"#\"}\n className={`text-foreground inline-flex items-center gap-2 bg-white px-6 py-3 text-sm font-medium tracking-tight transition-opacity hover:opacity-90 ${cardRadiusClass(borderRadius)}`}\n >\n {featuredButtonText}\n <span\n aria-hidden=\"true\"\n className=\"transition-transform group-hover:translate-x-0.5\"\n >\n →\n </span>\n </a>\n )}\n </div>\n </div>\n );\n}\n","import type React from \"react\";\nimport DOMPurify from \"dompurify\";\nimport type {\n ColorOptions,\n FontSizeOptions,\n PaddingOptions,\n} from \"@fluid-app/portal-core/types\";\n\ntype ListItem = {\n id: string;\n image?: string;\n imageUrl?: string;\n videoUrl?: string;\n title?: string;\n description?: string;\n price?: string;\n display_price?: string;\n originalPrice?: string;\n discount?: string;\n qv?: string;\n cv?: string;\n [key: string]: unknown;\n};\n\nfunction getStringValue(value: unknown): string {\n if (!value) return \"\";\n if (typeof value === \"string\") return value;\n if (typeof value === \"number\") return String(value);\n if (typeof value === \"object\" && value !== null) {\n if (\"body\" in value) {\n const body = (value as { body: unknown }).body;\n if (typeof body === \"string\") return body;\n }\n if (\"text\" in value) {\n const text = (value as { text: unknown }).text;\n if (typeof text === \"string\") return text;\n }\n if (\"value\" in value) {\n const val = (value as { value: unknown }).value;\n if (typeof val === \"string\") return val;\n if (typeof val === \"number\") return String(val);\n }\n }\n return \"\";\n}\n\nfunction stripParentheticalText(text: string): string {\n return text.replace(/\\s*\\([^)]*\\)/g, \"\").trim();\n}\n\nfunction formatPrice(value: unknown): string {\n const str = getStringValue(value);\n if (!str) return \"\";\n return stripParentheticalText(str);\n}\n\nexport interface ListItemCardContentProps {\n item: ListItem;\n padding: PaddingOptions;\n itemTitleColor: ColorOptions;\n itemTitleSize: FontSizeOptions;\n descriptionColor: ColorOptions;\n descriptionSize: FontSizeOptions;\n priceColor: ColorOptions;\n priceSize: FontSizeOptions;\n originalPriceColor: ColorOptions;\n metaTextColor: ColorOptions;\n metaTextSize: FontSizeOptions;\n showMetaText: boolean;\n}\n\nexport function ListItemCardContent({\n item,\n padding,\n itemTitleColor,\n itemTitleSize,\n descriptionColor,\n descriptionSize,\n priceColor,\n priceSize,\n originalPriceColor,\n metaTextColor,\n metaTextSize,\n showMetaText,\n}: ListItemCardContentProps): React.JSX.Element {\n const hasPrice = Boolean(item.display_price || item.price);\n const hasOriginal = Boolean(item.originalPrice);\n\n return (\n <div className={`flex flex-1 flex-col p-${padding}`}>\n {item.title && (\n <h3\n className={`text-${itemTitleColor} text-${itemTitleSize === \"md\" ? \"base\" : itemTitleSize} font-header mb-1.5 leading-snug font-medium tracking-tight`}\n >\n {getStringValue(item.title)}\n </h3>\n )}\n {item.description && (\n <div\n className={`text-${descriptionColor}/60 text-${descriptionSize === \"md\" ? \"base\" : descriptionSize} mb-3 line-clamp-2 overflow-hidden leading-relaxed`}\n dangerouslySetInnerHTML={{\n __html: DOMPurify.sanitize(item.description ?? \"\", {\n ALLOWED_TAGS: [\n \"br\",\n \"strong\",\n \"em\",\n \"b\",\n \"i\",\n \"ul\",\n \"ol\",\n \"li\",\n \"p\",\n ],\n ALLOWED_ATTR: [],\n }),\n }}\n />\n )}\n {(hasPrice || hasOriginal) && (\n <div className=\"mt-auto flex items-baseline gap-2\">\n {hasPrice && (\n <span\n className={`text-${priceColor} text-${priceSize === \"md\" ? \"base\" : priceSize} font-semibold tracking-tight tabular-nums`}\n >\n {formatPrice(item.display_price || item.price)}\n </span>\n )}\n {hasOriginal && (\n <span\n className={`text-${originalPriceColor}/50 text-${descriptionSize === \"md\" ? \"base\" : descriptionSize} tabular-nums line-through`}\n >\n {formatPrice(item.originalPrice)}\n </span>\n )}\n </div>\n )}\n {showMetaText && (item.qv || item.cv) && (\n <div\n className={`mt-2 flex gap-4 text-${metaTextColor}/70 text-${metaTextSize === \"md\" ? \"base\" : metaTextSize} font-medium tracking-wide uppercase`}\n >\n {item.qv && (\n <span>\n <span className=\"opacity-50\">QV</span>{\" \"}\n <span className=\"tabular-nums\">{getStringValue(item.qv)}</span>\n </span>\n )}\n {item.cv && (\n <span>\n <span className=\"opacity-50\">CV</span>{\" \"}\n <span className=\"tabular-nums\">{getStringValue(item.cv)}</span>\n </span>\n )}\n </div>\n )}\n </div>\n );\n}\n\nexport function DiscountBadge({\n discount,\n}: {\n discount: string;\n}): React.JSX.Element {\n return (\n <div className=\"bg-background text-foreground absolute top-3 left-3 z-10 rounded-full px-2.5 py-1 text-[10px] font-semibold tracking-[0.08em] uppercase\">\n {getStringValue(discount)}\n </div>\n );\n}\n\nexport { getStringValue };\nexport type { ListItem };\n","import type React from \"react\";\nimport type {\n ColorOptions,\n FontSizeOptions,\n BorderRadiusOptions,\n PaddingOptions,\n GapOptions,\n} from \"@fluid-app/portal-core/types\";\nimport { gapValues } from \"../../core/fields\";\nimport { useWidgetInteraction } from \"../../contexts/WidgetInteractionContext\";\nimport {\n ListItemCardContent,\n DiscountBadge,\n type ListItem,\n} from \"./ListItemCard\";\nimport { cardRadiusClass } from \"./helpers\";\n\ntype ImageAspectRatio = \"square\" | \"landscape\" | \"portrait\";\n\nconst getImageUrl = (item: ListItem): string | undefined => {\n return item.imageUrl || item.image;\n};\n\nconst getAspectRatioClass = (ratio: ImageAspectRatio): string => {\n const ratios = {\n square: \"aspect-square\",\n landscape: \"aspect-video\",\n portrait: \"aspect-[3/4]\",\n };\n return ratios[ratio];\n};\n\nconst getResponsiveGridClass = (columns: number): string => {\n const responsiveClasses: Record<number, string> = {\n 1: \"grid-cols-2 @lg:grid-cols-1\",\n 2: \"grid-cols-2 @lg:grid-cols-2\",\n 3: \"grid-cols-2 @lg:grid-cols-3\",\n 4: \"grid-cols-2 @lg:grid-cols-4\",\n 5: \"grid-cols-2 @lg:grid-cols-5\",\n 6: \"grid-cols-2 @lg:grid-cols-6\",\n };\n return responsiveClasses[columns] || \"grid-cols-2 @lg:grid-cols-3\";\n};\n\nexport interface UnorderedListProps {\n items: ListItem[];\n columns: number;\n gap: GapOptions;\n borderRadius: BorderRadiusOptions;\n imageAspectRatio: ImageAspectRatio;\n showBadge: boolean;\n padding: PaddingOptions;\n itemTitleColor: ColorOptions;\n itemTitleSize: FontSizeOptions;\n descriptionColor: ColorOptions;\n descriptionSize: FontSizeOptions;\n priceColor: ColorOptions;\n priceSize: FontSizeOptions;\n originalPriceColor: ColorOptions;\n metaTextColor: ColorOptions;\n metaTextSize: FontSizeOptions;\n showMetaText: boolean;\n}\n\nexport function UnorderedList({\n items,\n columns,\n gap,\n borderRadius,\n imageAspectRatio,\n showBadge,\n padding,\n itemTitleColor,\n itemTitleSize,\n descriptionColor,\n descriptionSize,\n priceColor,\n priceSize,\n originalPriceColor,\n metaTextColor,\n metaTextSize,\n showMetaText,\n}: UnorderedListProps): React.JSX.Element {\n const gridClass = getResponsiveGridClass(columns);\n const { onItemClick } = useWidgetInteraction();\n\n return (\n <div className={`grid ${gridClass} gap-${gapValues[gap]}`}>\n {items.map((item) => {\n const imageUrl = getImageUrl(item);\n const aspectRatioClass = getAspectRatioClass(imageAspectRatio);\n\n return (\n <div\n key={item.id}\n className={`group relative flex flex-col ${onItemClick ? \"cursor-pointer\" : \"\"}`}\n {...(onItemClick\n ? {\n role: \"button\",\n tabIndex: 0,\n onClick: () => onItemClick(item),\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onItemClick(item);\n }\n },\n }\n : {})}\n >\n {imageUrl && (\n <div\n className={`relative w-full ${aspectRatioClass} bg-muted/30 overflow-hidden ${cardRadiusClass(borderRadius)}`}\n >\n {showBadge && item.discount && (\n <DiscountBadge discount={item.discount} />\n )}\n <img\n src={imageUrl}\n alt={item.title || \"Product\"}\n className=\"h-full w-full object-cover transition-opacity duration-300 group-hover:opacity-90\"\n />\n </div>\n )}\n <div className=\"mt-4\">\n <ListItemCardContent\n item={item}\n padding={padding}\n itemTitleColor={itemTitleColor}\n itemTitleSize={itemTitleSize}\n descriptionColor={descriptionColor}\n descriptionSize={descriptionSize}\n priceColor={priceColor}\n priceSize={priceSize}\n originalPriceColor={originalPriceColor}\n metaTextColor={metaTextColor}\n metaTextSize={metaTextSize}\n showMetaText={showMetaText}\n />\n </div>\n </div>\n );\n })}\n </div>\n );\n}\n","import { useRef } from \"react\";\nimport type React from \"react\";\nimport type { RefObject } from \"react\";\nimport type {\n ColorOptions,\n FontSizeOptions,\n BorderRadiusOptions,\n PaddingOptions,\n GapOptions,\n} from \"@fluid-app/portal-core/types\";\nimport { gapValues } from \"../../core/fields\";\nimport { useWidgetInteraction } from \"../../contexts/WidgetInteractionContext\";\nimport {\n ListItemCardContent,\n DiscountBadge,\n getStringValue,\n type ListItem,\n} from \"./ListItemCard\";\nimport { cardRadiusClass } from \"./helpers\";\n\ntype ImageAspectRatio = \"square\" | \"landscape\" | \"portrait\";\ntype ScrollAxis = \"horizontal\" | \"vertical\";\n\nconst getImageUrl = (item: ListItem): string | undefined => {\n return item.imageUrl || item.image;\n};\n\nexport interface OrderedListProps {\n items: ListItem[];\n scrollAxis: ScrollAxis;\n gap: GapOptions;\n borderRadius: BorderRadiusOptions;\n imageAspectRatio: ImageAspectRatio;\n showBadge: boolean;\n padding: PaddingOptions;\n itemTitleColor: ColorOptions;\n itemTitleSize: FontSizeOptions;\n descriptionColor: ColorOptions;\n descriptionSize: FontSizeOptions;\n priceColor: ColorOptions;\n priceSize: FontSizeOptions;\n originalPriceColor: ColorOptions;\n metaTextColor: ColorOptions;\n metaTextSize: FontSizeOptions;\n numberColor: ColorOptions;\n numberSize: FontSizeOptions;\n showMetaText: boolean;\n /** Optional ref from the parent to control horizontal scroll externally */\n scrollContainerRef?: RefObject<HTMLDivElement | null> | undefined;\n}\n\nconst formatRank = (n: number): string => (n < 10 ? `0${n}` : String(n));\n\nexport function OrderedList({\n items,\n scrollAxis,\n gap,\n borderRadius,\n // imageAspectRatio is intentionally not consumed — ordered layouts use a\n // fixed aspect ratio per axis (3:4 poster horizontal, 16x16 thumb vertical)\n // by design. The schema gates this field to unordered lists.\n imageAspectRatio: _imageAspectRatio,\n showBadge,\n padding,\n itemTitleColor,\n itemTitleSize,\n descriptionColor,\n descriptionSize,\n priceColor,\n priceSize,\n originalPriceColor,\n metaTextColor,\n metaTextSize,\n numberColor,\n numberSize,\n showMetaText,\n scrollContainerRef: externalScrollRef,\n}: OrderedListProps): React.JSX.Element | null {\n const internalScrollRef = useRef<HTMLDivElement>(null);\n const scrollContainerRef = externalScrollRef ?? internalScrollRef;\n\n const { onItemClick } = useWidgetInteraction();\n\n const interactionProps = (item: ListItem) =>\n onItemClick\n ? ({\n role: \"button\" as const,\n tabIndex: 0,\n onClick: () => onItemClick(item),\n onKeyDown: (e: React.KeyboardEvent) => {\n if (e.key === \"Enter\" || e.key === \" \") {\n e.preventDefault();\n onItemClick(item);\n }\n },\n } as const)\n : {};\n\n const contentProps = {\n padding,\n itemTitleColor,\n itemTitleSize,\n descriptionColor,\n descriptionSize,\n priceColor,\n priceSize,\n originalPriceColor,\n metaTextColor,\n metaTextSize,\n showMetaText,\n };\n\n if (scrollAxis === \"horizontal\") {\n return (\n <div className=\"relative\">\n <div\n ref={scrollContainerRef}\n className={`flex gap-${gapValues[gap]} scrollbar-hide overflow-x-auto overflow-y-hidden scroll-smooth`}\n >\n {items.map((item, index) => {\n const imageUrl = getImageUrl(item);\n const rank = index + 1;\n\n return (\n <div\n key={item.id}\n className={`group relative flex flex-shrink-0 flex-col ${onItemClick ? \"cursor-pointer\" : \"\"}`}\n {...interactionProps(item)}\n >\n <div className=\"flex items-end\">\n <span className=\"sr-only\">Rank {rank}: </span>\n <span\n className={`text-${numberColor} pointer-events-none flex-shrink-0 font-black italic tabular-nums select-none`}\n style={{\n fontSize: \"11rem\",\n lineHeight: \"0.82\",\n letterSpacing: \"-0.06em\",\n }}\n aria-hidden=\"true\"\n >\n {rank}\n </span>\n {imageUrl && (\n <div\n className={`relative aspect-[3/4] w-[200px] flex-shrink-0 ${cardRadiusClass(borderRadius)} bg-muted/30 overflow-hidden`}\n >\n {showBadge && item.discount && (\n <DiscountBadge discount={item.discount} />\n )}\n <img\n src={imageUrl}\n alt={item.title || \"Product\"}\n className=\"h-full w-full object-cover\"\n />\n </div>\n )}\n </div>\n <div className=\"mt-5 ml-auto w-[200px]\">\n <ListItemCardContent item={item} {...contentProps} />\n </div>\n </div>\n );\n })}\n </div>\n </div>\n );\n }\n\n if (scrollAxis === \"vertical\") {\n return (\n <div className={`flex flex-col gap-${gapValues[gap]}`}>\n {items.map((item, index) => {\n const imageUrl = getImageUrl(item);\n const rank = index + 1;\n const isLast = index === items.length - 1;\n\n return (\n <div\n key={item.id}\n className={`group relative flex items-center gap-${gapValues[gap]} py-6 ${!isLast ? \"border-b\" : \"\"} ${onItemClick ? \"cursor-pointer\" : \"\"}`}\n style={\n !isLast\n ? {\n borderColor:\n \"color-mix(in oklch, var(--color-foreground) 8%, transparent)\",\n }\n : undefined\n }\n {...interactionProps(item)}\n >\n <span className=\"sr-only\">Rank {rank}: </span>\n <span\n className={`text-${numberColor} font-header w-14 flex-shrink-0 text-${numberSize === \"md\" ? \"base\" : numberSize} leading-none font-light tracking-tight italic`}\n aria-hidden=\"true\"\n >\n {formatRank(rank)}\n </span>\n {imageUrl && (\n <div\n className={`relative h-16 w-16 flex-shrink-0 overflow-hidden ${cardRadiusClass(borderRadius)} bg-muted/30`}\n >\n <img\n src={imageUrl}\n alt={item.title || \"Product\"}\n className=\"h-full w-full object-cover\"\n />\n </div>\n )}\n <div className=\"min-w-0 flex-1\">\n <ListItemCardContent item={item} {...contentProps} />\n </div>\n {showBadge && item.discount && (\n <span className=\"text-muted ml-2 flex-shrink-0 text-[10px] font-semibold tracking-[0.08em] uppercase\">\n {getStringValue(item.discount)}\n </span>\n )}\n </div>\n );\n })}\n </div>\n );\n }\n\n return null;\n}\n","import {\n useCallback,\n useEffect,\n useLayoutEffect,\n useRef,\n useState,\n type ComponentProps,\n} from \"react\";\nimport type React from \"react\";\nimport { ChevronLeft, ChevronRight } from \"lucide-react\";\nimport type {\n BorderWidthOptions,\n ColorOptions,\n FontSizeOptions,\n BorderRadiusOptions,\n PaddingOptions,\n GapOptions,\n BackgroundValue,\n} from \"@fluid-app/portal-core/types\";\nimport type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\nimport {\n getBorderRadiusField,\n getBorderWidthField,\n getBorderColorField,\n borderWidthClasses,\n borderColorClasses,\n getColorField,\n getFontSizeField,\n getPaddingField,\n getGapField,\n} from \"../core/fields\";\nimport { FeaturedSection } from \"./list-widget/FeaturedSection\";\nimport { UnorderedList } from \"./list-widget/UnorderedList\";\nimport { OrderedList } from \"./list-widget/OrderedList\";\n\nconst DEFAULT_ITEMS: ListItem[] = [];\n\ntype ListItem = {\n id: string;\n image?: string;\n imageUrl?: string;\n videoUrl?: string;\n title?: string;\n description?: string;\n price?: string;\n originalPrice?: string;\n discount?: string;\n qv?: string;\n cv?: string;\n [key: string]: unknown;\n};\n\ntype ImageAspectRatio = \"square\" | \"landscape\" | \"portrait\";\ntype ListType = \"ordered\" | \"unordered\";\ntype ScrollAxis = \"horizontal\" | \"vertical\";\n\ntype ListWidgetProps = ComponentProps<\"div\"> & {\n // List configuration\n listType?: ListType;\n scrollAxis?: ScrollAxis;\n titleEnabled?: boolean;\n title?: string;\n items?: ListItem[];\n\n // Text styling\n titleColor?: ColorOptions;\n titleSize?: FontSizeOptions;\n itemTitleColor?: ColorOptions;\n itemTitleSize?: FontSizeOptions;\n descriptionColor?: ColorOptions;\n descriptionSize?: FontSizeOptions;\n priceColor?: ColorOptions;\n priceSize?: FontSizeOptions;\n originalPriceColor?: ColorOptions;\n metaTextColor?: ColorOptions;\n metaTextSize?: FontSizeOptions;\n\n // Ordered list styling\n numberColor?: ColorOptions;\n numberSize?: FontSizeOptions;\n\n // Layout\n borderRadius?: BorderRadiusOptions;\n borderWidth?: BorderWidthOptions;\n borderColor?: ColorOptions;\n padding?: PaddingOptions;\n gap?: GapOptions;\n columns?: number;\n imageAspectRatio?: ImageAspectRatio;\n background?: BackgroundValue;\n\n // Behavior\n showBadge?: boolean;\n showMetaText?: boolean;\n maxItems?: number;\n\n // Featured section\n showFeaturedSection?: boolean;\n featuredAsset?: string | { [key: string]: unknown };\n featuredTitle?: string;\n featuredSubtitle?: string;\n featuredButtonText?: string;\n featuredButtonUrl?: string;\n featuredSubtitleColor?: ColorOptions;\n featuredSubtitleSize?: FontSizeOptions;\n};\n\nfunction getFeaturedAssetUrl(\n value: string | { [key: string]: unknown } | undefined,\n): { url: string; isVideo: boolean } | undefined {\n if (!value) return undefined;\n\n // Handle string URLs\n if (typeof value === \"string\") {\n const isVideo = /\\.(mp4|webm|ogg|mov)$/i.test(value);\n return { url: value, isVideo };\n }\n\n // Handle ShareableItem objects\n if (typeof value === \"object\") {\n // Check for video URL first\n const videoUrl =\n (value.videoUrl as string) ||\n (value.video_url as string) ||\n (value.url as string);\n if (videoUrl && /\\.(mp4|webm|ogg|mov)$/i.test(videoUrl)) {\n return { url: videoUrl, isVideo: true };\n }\n\n // Fall back to image URL\n const imageUrl =\n (value.imageUrl as string) ||\n (value.image_url as string) ||\n (value.url as string);\n if (imageUrl) {\n return { url: imageUrl, isVideo: false };\n }\n }\n\n return undefined;\n}\n\nexport function ListWidget({\n listType = \"unordered\",\n scrollAxis = \"horizontal\",\n titleEnabled = true,\n title,\n items = DEFAULT_ITEMS,\n titleColor = \"foreground\",\n titleSize = \"lg\",\n itemTitleColor = \"foreground\",\n itemTitleSize = \"sm\",\n descriptionColor = \"foreground\",\n descriptionSize = \"sm\",\n priceColor = \"foreground\",\n priceSize = \"md\",\n originalPriceColor = \"muted\",\n metaTextColor = \"muted\",\n metaTextSize = \"xs\",\n numberColor = \"primary\",\n numberSize = \"2xl\",\n borderRadius = \"md\",\n borderWidth = \"none\",\n borderColor = \"muted\",\n padding = 4,\n gap = \"md\",\n columns = 3,\n imageAspectRatio = \"square\",\n background = { type: \"solid\", color: \"background\" },\n showBadge = true,\n showMetaText = true,\n maxItems = 12,\n showFeaturedSection = false,\n featuredAsset,\n featuredTitle,\n featuredSubtitle,\n featuredButtonText,\n featuredButtonUrl,\n featuredSubtitleColor = \"background\",\n featuredSubtitleSize = \"md\",\n className,\n ...props\n}: ListWidgetProps): React.JSX.Element {\n const displayItems = maxItems ? items.slice(0, maxItems) : items;\n const hasItems = displayItems.length > 0;\n\n const itemStyleProps = {\n padding,\n itemTitleColor,\n itemTitleSize,\n descriptionColor,\n descriptionSize,\n priceColor,\n priceSize,\n originalPriceColor,\n metaTextColor,\n metaTextSize,\n showMetaText,\n showBadge,\n borderRadius,\n imageAspectRatio,\n gap,\n };\n\n const hasFeaturedAsset = getFeaturedAssetUrl(featuredAsset);\n const shouldShowFeaturedSection = showFeaturedSection && hasFeaturedAsset;\n\n // Background styling\n const backgroundColor = background.color || \"background\";\n const backgroundImage =\n (background.resource?.image_url || background.resource?.imageUrl) &&\n background.type === \"image\"\n ? `url(${background.resource.image_url || background.resource.imageUrl})`\n : \"none\";\n\n const isOrderedHorizontal =\n listType === \"ordered\" && scrollAxis === \"horizontal\";\n const showScrollArrows =\n isOrderedHorizontal && hasItems && displayItems.length > 1;\n\n const { scrollContainerRef, canScrollPrev, canScrollNext, scrollByAmount } =\n useHorizontalScrollState({\n enabled: showScrollArrows,\n contentLength: displayItems.length,\n });\n\n const hasTitle = titleEnabled && title;\n const showTitleRow = hasTitle || showScrollArrows;\n\n return (\n <div\n className={`@container bg-${backgroundColor} p-${padding} rounded-${borderRadius} ${borderWidthClasses[borderWidth]} ${borderWidth !== \"none\" ? borderColorClasses[borderColor] : \"\"} ${className}`}\n style={{ backgroundImage }}\n {...props}\n >\n {showTitleRow && (\n <div className=\"mb-8 flex items-center justify-between gap-4\">\n {hasTitle ? (\n <h2\n className={`text-${titleColor} text-${titleSize === \"md\" ? \"base\" : titleSize} font-header leading-tight font-medium tracking-tight`}\n >\n {title}\n </h2>\n ) : (\n <span />\n )}\n {showScrollArrows && (\n <div className=\"flex shrink-0 items-center gap-2\">\n <button\n type=\"button\"\n onClick={() => scrollByAmount(\"prev\")}\n disabled={!canScrollPrev}\n aria-label=\"Previous items\"\n className={`text-${numberColor} flex size-9 items-center justify-center rounded-full transition-opacity hover:opacity-60 disabled:cursor-not-allowed disabled:opacity-20`}\n style={{\n boxShadow: `inset 0 0 0 1px color-mix(in oklch, var(--color-${numberColor}) 25%, transparent)`,\n }}\n >\n <ChevronLeft aria-hidden=\"true\" className=\"size-4\" />\n </button>\n <button\n type=\"button\"\n onClick={() => scrollByAmount(\"next\")}\n disabled={!canScrollNext}\n aria-label=\"Next items\"\n className={`text-${numberColor} flex size-9 items-center justify-center rounded-full transition-opacity hover:opacity-60 disabled:cursor-not-allowed disabled:opacity-20`}\n style={{\n boxShadow: `inset 0 0 0 1px color-mix(in oklch, var(--color-${numberColor}) 25%, transparent)`,\n }}\n >\n <ChevronRight aria-hidden=\"true\" className=\"size-4\" />\n </button>\n </div>\n )}\n </div>\n )}\n {!hasItems ? (\n <div className=\"flex items-center justify-center py-20 text-center\">\n <p className=\"text-muted/70 text-sm tracking-tight\">\n No items to display\n </p>\n </div>\n ) : shouldShowFeaturedSection ? (\n <div className=\"flex flex-col gap-4 @lg:flex-row @lg:gap-6\">\n <div className=\"w-full @lg:w-[45%]\">\n <FeaturedSection\n borderRadius={borderRadius}\n titleSize={titleSize}\n featuredTitle={featuredTitle}\n featuredSubtitle={featuredSubtitle}\n featuredButtonText={featuredButtonText}\n featuredButtonUrl={featuredButtonUrl}\n featuredSubtitleColor={featuredSubtitleColor}\n featuredSubtitleSize={featuredSubtitleSize}\n asset={hasFeaturedAsset!}\n />\n </div>\n <div className=\"w-full @lg:w-[55%]\">\n {listType === \"unordered\" ? (\n <UnorderedList\n items={displayItems}\n columns={columns}\n {...itemStyleProps}\n />\n ) : (\n <OrderedList\n items={displayItems}\n scrollAxis={scrollAxis}\n numberColor={numberColor}\n numberSize={numberSize}\n scrollContainerRef={\n isOrderedHorizontal ? scrollContainerRef : undefined\n }\n {...itemStyleProps}\n />\n )}\n </div>\n </div>\n ) : listType === \"unordered\" ? (\n <UnorderedList\n items={displayItems}\n columns={columns}\n {...itemStyleProps}\n />\n ) : (\n <OrderedList\n items={displayItems}\n scrollAxis={scrollAxis}\n numberColor={numberColor}\n numberSize={numberSize}\n scrollContainerRef={\n isOrderedHorizontal ? scrollContainerRef : undefined\n }\n {...itemStyleProps}\n />\n )}\n </div>\n );\n}\n\n// ----- Hooks -----\n\nconst SCROLL_BUTTON_AMOUNT = 300;\nconst SCROLL_EDGE_TOLERANCE = 4;\nconst useIsomorphicLayoutEffect =\n typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\ntype HorizontalScrollState = {\n scrollContainerRef: React.RefObject<HTMLDivElement | null>;\n canScrollPrev: boolean;\n canScrollNext: boolean;\n scrollByAmount: (direction: \"prev\" | \"next\") => void;\n};\n\n// Tracks horizontal scroll position of an external container so the parent\n// can drive prev/next arrow disabled states from a single source of truth.\n// Both edges initialize to `false` and are populated by the post-mount\n// measurement, avoiding a brief enabled-then-disabled flicker when content\n// fits entirely within the viewport.\nfunction useHorizontalScrollState({\n enabled,\n contentLength,\n}: {\n enabled: boolean;\n contentLength: number;\n}): HorizontalScrollState {\n const scrollContainerRef = useRef<HTMLDivElement>(null);\n const [canScrollPrev, setCanScrollPrev] = useState(false);\n const [canScrollNext, setCanScrollNext] = useState(false);\n\n const resetScrollState = useCallback(() => {\n setCanScrollPrev(false);\n setCanScrollNext(false);\n }, []);\n\n const updateScrollState = useCallback(() => {\n const el = scrollContainerRef.current;\n if (!enabled || !el) {\n resetScrollState();\n return;\n }\n setCanScrollPrev(el.scrollLeft > SCROLL_EDGE_TOLERANCE);\n setCanScrollNext(\n el.scrollLeft + el.clientWidth < el.scrollWidth - SCROLL_EDGE_TOLERANCE,\n );\n }, [enabled, resetScrollState]);\n\n // Fires synchronously before paint so the arrows reflect post-layout\n // geometry without a flicker. `updateScrollState` is memoized on\n // `enabled`, so this only fires on mount and when toggling enablement —\n // not on every render.\n useIsomorphicLayoutEffect(() => {\n updateScrollState();\n }, [updateScrollState]);\n\n useEffect(() => {\n if (!enabled) {\n resetScrollState();\n return undefined;\n }\n\n const el = scrollContainerRef.current;\n if (!el) {\n resetScrollState();\n return undefined;\n }\n\n updateScrollState();\n el.addEventListener(\"scroll\", updateScrollState, { passive: true });\n const resize =\n typeof ResizeObserver !== \"undefined\"\n ? new ResizeObserver(updateScrollState)\n : undefined;\n resize?.observe(el);\n\n return () => {\n el.removeEventListener(\"scroll\", updateScrollState);\n resize?.disconnect();\n };\n }, [enabled, resetScrollState, updateScrollState, contentLength]);\n\n const scrollByAmount = useCallback((direction: \"prev\" | \"next\") => {\n const el = scrollContainerRef.current;\n if (!el) return;\n const computedGap = parseFloat(getComputedStyle(el).gap) || 0;\n const amount = SCROLL_BUTTON_AMOUNT + computedGap;\n el.scrollTo({\n left: el.scrollLeft + (direction === \"next\" ? amount : -amount),\n behavior: \"smooth\",\n });\n }, []);\n\n return { scrollContainerRef, canScrollPrev, canScrollNext, scrollByAmount };\n}\n\nexport const listWidgetPropertySchema: WidgetPropertySchema = {\n widgetType: \"ListWidget\",\n displayName: \"List\",\n tabsConfig: [\n { id: \"styling\", label: \"Styling\" },\n { id: \"data\", label: \"Data\" },\n ],\n dataSourceTargetProps: [\"items\"],\n fields: [\n // Styling tab - Title group\n {\n key: \"titleEnabled\",\n label: \"Widget Title\",\n type: \"boolean\",\n description: \"Enable the title displayed above the list\",\n defaultValue: true,\n tab: \"styling\",\n group: \"Title\",\n },\n {\n key: \"title\",\n label: \"Title\",\n type: \"text\",\n description: \"Header text for the list\",\n defaultValue: \"List\",\n tab: \"styling\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n },\n getFontSizeField({\n key: \"titleSize\",\n label: \"Title Font Size\",\n description: \"Size of the list title\",\n defaultValue: \"xl\",\n tab: \"styling\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n getColorField({\n key: \"titleColor\",\n label: \"Title Color\",\n description: \"Color for the list title\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Title\",\n requiresKeyToBeTrue: \"titleEnabled\",\n }),\n\n // Styling tab - Design group\n getPaddingField({\n key: \"padding\",\n label: \"Padding\",\n description: \"Padding inside the container\",\n defaultValue: 4,\n tab: \"styling\",\n group: \"Design\",\n }),\n getBorderRadiusField({\n key: \"borderRadius\",\n label: \"Border Radius\",\n description: \"Rounded corners for the container and images\",\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 getGapField({\n key: \"gap\",\n label: \"Gap\",\n description: \"Spacing between items\",\n defaultValue: \"md\",\n tab: \"styling\",\n group: \"Design\",\n }),\n {\n type: \"background\",\n defaultValue: \"background\",\n key: \"background\",\n label: \"Background\",\n description: \"Background color or image for the widget\",\n tab: \"styling\",\n group: \"Design\",\n },\n\n // Styling tab - List Configuration group\n {\n key: \"listType\",\n label: \"List Type\",\n type: \"select\",\n description: \"Type of list layout\",\n defaultValue: \"unordered\",\n options: [\n { label: \"Unordered (Grid)\", value: \"unordered\" },\n { label: \"Ordered (Numbered)\", value: \"ordered\" },\n ],\n tab: \"styling\",\n group: \"List Configuration\",\n },\n {\n key: \"maxItems\",\n label: \"Max Items\",\n type: \"number\",\n description: \"Maximum number of items to display\",\n min: 1,\n max: 100,\n step: 1,\n defaultValue: 12,\n tab: \"styling\",\n group: \"List Configuration\",\n },\n {\n key: \"imageAspectRatio\",\n label: \"Image Aspect Ratio\",\n type: \"buttonGroup\",\n description:\n \"Aspect ratio for item images (unordered list — ordered layouts use a fixed ratio per axis)\",\n defaultValue: \"square\",\n options: [\n { label: \"Square\", value: \"square\" },\n { label: \"Landscape\", value: \"landscape\" },\n { label: \"Portrait\", value: \"portrait\" },\n ],\n tab: \"styling\",\n group: \"List Configuration\",\n requiresKeyValue: { key: \"listType\", value: \"unordered\" },\n },\n {\n key: \"showBadge\",\n label: \"Show Discount Badge\",\n type: \"boolean\",\n description: \"Display discount badge on images\",\n defaultValue: true,\n tab: \"styling\",\n group: \"List Configuration\",\n },\n {\n key: \"showMetaText\",\n label: \"Show QV/CV Text\",\n type: \"boolean\",\n description: \"Display QV and CV values\",\n defaultValue: true,\n tab: \"styling\",\n group: \"List Configuration\",\n },\n\n // Styling tab - Unordered List Configuration\n {\n key: \"columns\",\n label: \"Grid Columns\",\n type: \"number\",\n description: \"Number of columns in the grid (unordered list only)\",\n min: 1,\n max: 6,\n step: 1,\n defaultValue: 3,\n tab: \"styling\",\n group: \"Unordered List Configuration\",\n requiresKeyValue: { key: \"listType\", value: \"unordered\" },\n },\n\n // Styling tab - Ordered List Configuration\n {\n key: \"scrollAxis\",\n label: \"Scroll Direction\",\n type: \"select\",\n description: \"Direction for ordered list scrolling\",\n defaultValue: \"horizontal\",\n options: [\n { label: \"Horizontal\", value: \"horizontal\" },\n { label: \"Vertical\", value: \"vertical\" },\n ],\n tab: \"styling\",\n group: \"Ordered List Configuration\",\n requiresKeyValue: { key: \"listType\", value: \"ordered\" },\n },\n getColorField({\n key: \"numberColor\",\n label: \"Number Color\",\n description: \"Color for ordered list numbers\",\n defaultValue: \"primary\",\n tab: \"styling\",\n group: \"Ordered List Configuration\",\n requiresKeyValue: { key: \"listType\", value: \"ordered\" },\n }),\n getFontSizeField({\n key: \"numberSize\",\n label: \"Number Font Size\",\n description:\n \"Size of ordered list numbers (vertical scroll only — horizontal uses a fixed editorial size)\",\n defaultValue: \"2xl\",\n tab: \"styling\",\n group: \"Ordered List Configuration\",\n requiresKeyValue: [\n { key: \"listType\", value: \"ordered\" },\n { key: \"scrollAxis\", value: \"vertical\" },\n ],\n }),\n\n // Styling tab - Item Styling group\n getColorField({\n key: \"itemTitleColor\",\n label: \"Item Title Color\",\n description: \"Color for item titles\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Item Styling\",\n }),\n getFontSizeField({\n key: \"itemTitleSize\",\n label: \"Item Title Font Size\",\n description: \"Size of item titles\",\n defaultValue: \"sm\",\n tab: \"styling\",\n group: \"Item Styling\",\n }),\n {\n key: \"separator2\",\n type: \"separator\",\n label: \"Separator\",\n tab: \"styling\",\n group: \"Item Styling\",\n },\n getColorField({\n key: \"descriptionColor\",\n label: \"Description Color\",\n description: \"Color for descriptions\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Item Styling\",\n }),\n getFontSizeField({\n key: \"descriptionSize\",\n label: \"Description Font Size\",\n description: \"Size of descriptions\",\n defaultValue: \"sm\",\n tab: \"styling\",\n group: \"Item Styling\",\n }),\n {\n key: \"separator3\",\n type: \"separator\",\n label: \"Separator\",\n tab: \"styling\",\n group: \"Item Styling\",\n },\n getColorField({\n key: \"priceColor\",\n label: \"Price Color\",\n description: \"Color for prices\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Item Styling\",\n }),\n getFontSizeField({\n key: \"priceSize\",\n label: \"Price Font Size\",\n description: \"Size of prices\",\n defaultValue: \"md\",\n tab: \"styling\",\n group: \"Item Styling\",\n }),\n getColorField({\n key: \"originalPriceColor\",\n label: \"Original Price Color\",\n description: \"Color for crossed-out original prices\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Item Styling\",\n }),\n {\n key: \"separator4\",\n type: \"separator\",\n label: \"Separator\",\n tab: \"styling\",\n group: \"Item Styling\",\n },\n getColorField({\n key: \"metaTextColor\",\n label: \"Meta Text Color\",\n description: \"Color for QV/CV text\",\n defaultValue: \"foreground\",\n tab: \"styling\",\n group: \"Item Styling\",\n }),\n getFontSizeField({\n key: \"metaTextSize\",\n label: \"Meta Text Font Size\",\n description: \"Size of QV/CV text\",\n defaultValue: \"xs\",\n tab: \"styling\",\n group: \"Item Styling\",\n }),\n\n // Styling tab - Featured Section group\n {\n key: \"showFeaturedSection\",\n label: \"Show Featured Section\",\n type: \"boolean\",\n description: \"Display a featured content section\",\n defaultValue: false,\n tab: \"styling\",\n group: \"Featured Section\",\n },\n {\n key: \"featuredAsset\",\n label: \"Featured Asset\",\n type: \"resource\",\n description:\n \"Select a single image or video resource for the featured section\",\n tab: \"styling\",\n group: \"Featured Section\",\n allowedTypes: [\"Medium\"],\n requiresKeyToBeTrue: \"showFeaturedSection\",\n },\n {\n key: \"featuredTitle\",\n label: \"Featured Title\",\n type: \"text\",\n description: \"Title for featured section\",\n tab: \"styling\",\n group: \"Featured Section\",\n requiresKeyToBeTrue: \"showFeaturedSection\",\n },\n {\n key: \"featuredSubtitle\",\n label: \"Featured Subtitle\",\n type: \"text\",\n description: \"Subtitle for featured section\",\n tab: \"styling\",\n group: \"Featured Section\",\n requiresKeyToBeTrue: \"showFeaturedSection\",\n },\n {\n key: \"featuredButtonText\",\n label: \"Featured Button Text\",\n type: \"text\",\n description: \"Text for featured section button\",\n tab: \"styling\",\n group: \"Featured Section\",\n requiresKeyToBeTrue: \"showFeaturedSection\",\n },\n {\n key: \"featuredButtonUrl\",\n label: \"Featured Button URL\",\n type: \"text\",\n description: \"URL for featured section button\",\n tab: \"styling\",\n group: \"Featured Section\",\n requiresKeyToBeTrue: \"showFeaturedSection\",\n },\n getColorField({\n key: \"featuredSubtitleColor\",\n label: \"Featured Subtitle Color\",\n description: \"Color for featured subtitle\",\n defaultValue: \"background\",\n tab: \"styling\",\n group: \"Featured Section\",\n requiresKeyToBeTrue: \"showFeaturedSection\",\n }),\n getFontSizeField({\n key: \"featuredSubtitleSize\",\n label: \"Featured Subtitle Font Size\",\n description: \"Size of featured subtitle\",\n defaultValue: \"md\",\n tab: \"styling\",\n group: \"Featured Section\",\n requiresKeyToBeTrue: \"showFeaturedSection\",\n }),\n\n // Data tab - Data Configuration\n {\n key: \"dataSource\",\n label: \"Data Source\",\n type: \"dataSource\",\n description: \"\",\n tab: \"data\",\n group: \"Data Configuration\",\n },\n ],\n itemConfigSchema: {\n description: \"Configure settings for this list item\",\n fields: [\n {\n key: \"title\",\n label: \"Custom Title\",\n type: \"text\",\n description: \"Override the item's title\",\n },\n {\n key: \"description\",\n label: \"Custom Description\",\n type: \"textarea\",\n description: \"Override the item's description\",\n rows: 3,\n },\n {\n key: \"price\",\n label: \"Price\",\n type: \"text\",\n description: \"Current price\",\n },\n {\n key: \"originalPrice\",\n label: \"Original Price\",\n type: \"text\",\n description: \"Original price (will be crossed out)\",\n },\n {\n key: \"discount\",\n label: \"Discount Badge\",\n type: \"text\",\n description: \"Discount text (e.g., '40% Off')\",\n },\n {\n key: \"qv\",\n label: \"QV Value\",\n type: \"text\",\n description: \"Qualifying Volume value\",\n },\n {\n key: \"cv\",\n label: \"CV Value\",\n type: \"text\",\n description: \"Commission Volume value\",\n },\n {\n key: \"image\",\n label: \"Image URL\",\n type: \"text\",\n description: \"Custom image URL for this item\",\n },\n ],\n },\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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ACR,CAAC;EACFD,mBAAAA,iBAAiB;GACf,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR,CAAC;EAGF;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACR;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aACE;GACF,KAAK;GACL,OAAO;GACP,cAAc,CAAC,SAAS;GACxB,qBAAqB;GACtB;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,KAAK;GACL,OAAO;GACP,qBAAqB;GACtB;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,KAAK;GACL,OAAO;GACP,qBAAqB;GACtB;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,KAAK;GACL,OAAO;GACP,qBAAqB;GACtB;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,KAAK;GACL,OAAO;GACP,qBAAqB;GACtB;EACDC,mBAAAA,cAAc;GACZ,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACP,qBAAqB;GACtB,CAAC;EACFD,mBAAAA,iBAAiB;GACf,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACP,qBAAqB;GACtB,CAAC;EAGF;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,KAAK;GACL,OAAO;GACR;EACF;CACD,kBAAkB;EAChB,aAAa;EACb,QAAQ;GACN;IACE,KAAK;IACL,OAAO;IACP,MAAM;IACN,aAAa;IACd;GACD;IACE,KAAK;IACL,OAAO;IACP,MAAM;IACN,aAAa;IACb,MAAM;IACP;GACD;IACE,KAAK;IACL,OAAO;IACP,MAAM;IACN,aAAa;IACd;GACD;IACE,KAAK;IACL,OAAO;IACP,MAAM;IACN,aAAa;IACd;GACD;IACE,KAAK;IACL,OAAO;IACP,MAAM;IACN,aAAa;IACd;GACD;IACE,KAAK;IACL,OAAO;IACP,MAAM;IACN,aAAa;IACd;GACD;IACE,KAAK;IACL,OAAO;IACP,MAAM;IACN,aAAa;IACd;GACD;IACE,KAAK;IACL,OAAO;IACP,MAAM;IACN,aAAa;IACd;GACF;EACF;CACF"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { r as __exportAll } from "./es-BXxGlAp6.mjs";
|
|
2
|
-
import {
|
|
2
|
+
import { n as useWidgetInteraction } from "./WidgetInteractionContext-B1mELhQ_.mjs";
|
|
3
3
|
import { f as getGapField, i as getBorderColorField, l as getColorField, m as getPaddingField, n as borderWidthClasses, o as getBorderRadiusField, r as gapValues, s as getBorderWidthField, t as borderColorClasses, u as getFontSizeField } from "./registries-Ct8o2YRe.mjs";
|
|
4
4
|
import { t as purify } from "./purify.es-DzInNL5X.mjs";
|
|
5
|
-
import { t as MediaRenderer } from "./MediaRenderer-
|
|
5
|
+
import { t as MediaRenderer } from "./MediaRenderer-DMdb_5xw.mjs";
|
|
6
6
|
import { useCallback, useEffect, useLayoutEffect, useRef, useState } from "react";
|
|
7
7
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
8
8
|
import { ChevronLeft, ChevronRight } from "lucide-react";
|
|
@@ -1044,4 +1044,4 @@ const listWidgetPropertySchema = {
|
|
|
1044
1044
|
//#endregion
|
|
1045
1045
|
export { ListWidget_exports as n, listWidgetPropertySchema as r, ListWidget as t };
|
|
1046
1046
|
|
|
1047
|
-
//# sourceMappingURL=ListWidget-
|
|
1047
|
+
//# sourceMappingURL=ListWidget-f88QhcGI.mjs.map
|