{"version":3,"file":"ListWidget-DmrGlIBJ.mjs","names":["DOMPurify","getImageUrl"],"sources":["../../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 React from \"react\";\nimport type {\n  BorderRadiusOptions,\n  FontSizeOptions,\n  ColorOptions,\n} from \"@fluid-app/portal-core/types\";\nimport { MediaRenderer } from \"../../components/MediaRenderer\";\nimport { useInternalLinks } from \"../../hooks/use-internal-link\";\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  const featuredButtonLink = useInternalLinks()(featuredButtonUrl);\n\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            onClick={featuredButtonLink.followInternally}\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 { useCanShowVolume } from \"@fluid-app/portal-react/hooks/use-can-show-volume\";\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  const canShowVolume = useCanShowVolume();\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 is a page-builder checkbox that defaults to on, so on its\n          own it was a way to reveal volume to whoever was looking. It may now\n          only hide volume from someone entitled to it — never reveal it. */}\n      {showMetaText && canShowVolume && (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 { useRepUser } from \"../../contexts/RepUserContext\";\nimport { useWidgetRenderState } from \"../../contexts/WidgetRenderStateContext\";\nimport {\n  ListItemCardContent,\n  DiscountBadge,\n  type ListItem,\n} from \"./ListItemCard\";\nimport { cardRadiusClass, buildItemInteractionProps } 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, onNavigate, buildHref, resolveInternalSlug } =\n    useWidgetInteraction();\n  const publicId = useRepUser()?.publicId;\n  const { editMode } = useWidgetRenderState();\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        const itemProps = buildItemInteractionProps(item, {\n          onItemClick,\n          onNavigate,\n          buildHref,\n          resolveInternalSlug,\n          publicId,\n          editMode,\n        });\n\n        return (\n          <div\n            key={item.id}\n            className={`group relative flex flex-col ${Object.keys(itemProps).length > 0 ? \"cursor-pointer\" : \"\"}`}\n            {...itemProps}\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 { useRepUser } from \"../../contexts/RepUserContext\";\nimport { useWidgetRenderState } from \"../../contexts/WidgetRenderStateContext\";\nimport {\n  ListItemCardContent,\n  DiscountBadge,\n  getStringValue,\n  type ListItem,\n} from \"./ListItemCard\";\nimport { cardRadiusClass, buildItemInteractionProps } 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, onNavigate, buildHref, resolveInternalSlug } =\n    useWidgetInteraction();\n  const publicId = useRepUser()?.publicId;\n  const { editMode } = useWidgetRenderState();\n\n  const interactionProps = (item: ListItem) =>\n    buildItemInteractionProps(item, {\n      onItemClick,\n      onNavigate,\n      buildHref,\n      resolveInternalSlug,\n      publicId,\n      editMode,\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            const itemProps = interactionProps(item);\n\n            return (\n              <div\n                key={item.id}\n                className={`group relative flex flex-shrink-0 flex-col ${Object.keys(itemProps).length > 0 ? \"cursor-pointer\" : \"\"}`}\n                {...itemProps}\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          const itemProps = interactionProps(item);\n\n          return (\n            <div\n              key={item.id}\n              className={`group relative flex items-center gap-${gapValues[gap]} py-6 ${!isLast ? \"border-b\" : \"\"} ${Object.keys(itemProps).length > 0 ? \"cursor-pointer\" : \"\"}`}\n              style={\n                !isLast\n                  ? {\n                      borderColor:\n                        \"color-mix(in oklch, var(--color-foreground) 8%, transparent)\",\n                    }\n                  : undefined\n              }\n              {...itemProps}\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\";\nimport { getLinkTypeFields } from \"../lib/link-type-schema-fields\";\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    // Trust the explicit kind discriminator (set by ImageField on video picks)\n    // first — extension regex alone would miss URLs that carry a query string\n    // (`video.mp4?v=1`) since `$` anchors to end-of-string.\n    const isVideoByKind = value.kind === \"video\";\n    if (\n      videoUrl &&\n      (isVideoByKind || /\\.(mp4|webm|ogg|mov)(?:$|\\?|#)/i.test(videoUrl))\n    ) {\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  const effectivePadding =\n    padding === 0 && borderWidth !== \"none\" ? 4 : padding;\n\n  return (\n    <div\n      className={`@container bg-${backgroundColor} p-${effectivePadding} 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-foreground 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: { type: \"solid\", color: \"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: \"image\",\n      accept: \"any\",\n      description:\n        \"Select a single image or video resource for the featured section\",\n      tab: \"styling\",\n      group: \"Featured Section\",\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: \"Configure the items rendered by the list.\",\n      targetProps: [\n        {\n          key: \"items\",\n          description:\n            \"Items rendered by the list, usually supplied by a data source.\",\n        },\n      ],\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      { key: \"separator_link\", type: \"separator\", label: \"Separator\" },\n      ...getLinkTypeFields(),\n    ],\n  },\n} as const satisfies WidgetPropertySchema;\n"],"mappings":"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,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,QAAQ;GACR,aACE;GACF,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;EACD;GACE,KAAK;GACL,OAAO;GACP,MAAM;GACN,aAAa;GACb,KAAK;GACL,OAAO;GACP,qBAAqB;GACtB;EACD,cAAc;GACZ,KAAK;GACL,OAAO;GACP,aAAa;GACb,cAAc;GACd,KAAK;GACL,OAAO;GACP,qBAAqB;GACtB,CAAC;EACF,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,aAAa,CACX;IACE,KAAK;IACL,aACE;IACH,CACF;GACD,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;GACD;IAAE,KAAK;IAAkB,MAAM;IAAa,OAAO;IAAa;GAChE,GAAG,mBAAmB;GACvB;EACF;CACF"}