{"version":3,"file":"CardWidget-DlG2Xkvc.mjs","names":["ScreenRenderer","DefaultScreenRenderer"],"sources":["../../widgets/src/widgets/CardWidget.tsx"],"sourcesContent":["import { ScreenRenderer as DefaultScreenRenderer } from \"../core/ScreenRenderer\";\nimport { useRegistry } from \"../contexts/RegistryContext\";\nimport { useScreenRenderer } from \"../contexts/ScreenRendererContext\";\nimport type {\n  WidgetSchema,\n  BackgroundValue,\n  BorderRadiusOptions,\n  BorderWidthOptions,\n  PaddingOptions,\n  GapOptions,\n  ColorOptions,\n  FontSizeOptions,\n} from \"@fluid-app/portal-core/types\";\nimport type React from \"react\";\nimport type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\nimport {\n  getBorderRadiusField,\n  getBorderWidthField,\n  getBorderColorField,\n  getColorField,\n  getFontSizeField,\n  getGapField,\n  getPaddingField,\n  gapValues,\n  borderWidthClasses,\n  borderColorClasses,\n} from \"../core/fields\";\n\nconst DEFAULT_BACKGROUND: BackgroundValue = {\n  type: \"solid\",\n  color: \"background\",\n};\nconst DEFAULT_CHILDREN: (WidgetSchema | null)[] = [];\n\ntype CardWidgetProps = {\n  // Header\n  headerEnabled?: boolean;\n  title?: string;\n  titleFontSize?: FontSizeOptions;\n  titleColor?: ColorOptions;\n  headerBackground?: ColorOptions;\n\n  // Footer\n  footerEnabled?: boolean;\n  footerContent?: string;\n  footerColor?: ColorOptions;\n  footerBackground?: ColorOptions;\n\n  // Styling\n  background?: BackgroundValue;\n  padding?: PaddingOptions;\n  borderRadius?: BorderRadiusOptions;\n  borderWidth?: BorderWidthOptions;\n  borderColor?: ColorOptions;\n  /** @deprecated Use borderWidth instead */\n  borderEnabled?: boolean;\n  gapSize?: GapOptions;\n\n  // Container props (children = other widgets)\n  children?: (WidgetSchema | null)[];\n\n  // Styling\n  className?: string;\n};\n\nexport function CardWidget({\n  // Header\n  headerEnabled = true,\n  title = \"Card Title\",\n  titleFontSize = \"lg\",\n  titleColor = \"foreground\",\n  headerBackground = \"transparent\",\n\n  // Footer\n  footerEnabled = false,\n  footerContent = \"\",\n  footerColor = \"muted\",\n  footerBackground = \"transparent\",\n\n  // Styling\n  background = DEFAULT_BACKGROUND,\n  padding = 6,\n  borderRadius = \"xl\",\n  borderWidth = \"thin\",\n  borderColor = \"muted\",\n  borderEnabled,\n  gapSize = \"md\",\n\n  // Container\n  children = DEFAULT_CHILDREN,\n\n  className = \"\",\n}: CardWidgetProps): React.JSX.Element {\n  // Get registry from context if not provided as prop\n  const contextRegistry = useRegistry();\n\n  // Use ScreenRenderer from context, fall back to local\n  const ContextScreenRenderer = useScreenRenderer();\n  const ScreenRenderer = ContextScreenRenderer ?? DefaultScreenRenderer;\n\n  // Extract background values\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 gapSizeValue = gapSize ? gapValues[gapSize] : 4;\n\n  // Backwards compatibility: if legacy borderEnabled prop exists, map it\n  const effectiveBorderWidth = borderEnabled === false ? \"none\" : borderWidth;\n\n  const cardClasses = [\n    \"flex flex-col gap-6\",\n    `bg-${backgroundColor}`,\n    `p-${padding}`,\n    `rounded-${borderRadius}`,\n    borderWidthClasses[effectiveBorderWidth],\n    effectiveBorderWidth !== \"none\" ? borderColorClasses[borderColor] : \"\",\n    className,\n  ]\n    .filter(Boolean)\n    .join(\" \");\n\n  const containerStyle: React.CSSProperties = {\n    backgroundImage,\n  };\n\n  // Filter out null children\n  const validChildren = children.filter(\n    (child): child is WidgetSchema => child !== null,\n  );\n\n  return (\n    <div data-slot=\"card\" className={cardClasses} style={containerStyle}>\n      {headerEnabled && (title || headerBackground !== \"transparent\") && (\n        <div\n          data-slot=\"card-header\"\n          className={\n            headerBackground !== \"transparent\"\n              ? `bg-${headerBackground} -mx-${padding} -mt-${padding} px-${padding} py-${padding} rounded-t-${borderRadius}`\n              : undefined\n          }\n        >\n          {title && (\n            <div\n              data-slot=\"card-title\"\n              className={`text-${titleFontSize} text-${titleColor} font-header leading-none font-semibold`}\n            >\n              {title}\n            </div>\n          )}\n        </div>\n      )}\n\n      <div data-slot=\"card-content\" className=\"@container flex-1\">\n        {contextRegistry ? (\n          <ScreenRenderer\n            screen={validChildren}\n            registry={contextRegistry}\n            className={`flex flex-col gap-${gapSizeValue}`}\n          />\n        ) : (\n          <div className={`flex flex-col gap-${gapSizeValue}`} />\n        )}\n      </div>\n\n      {footerEnabled && footerContent && (\n        <div\n          data-slot=\"card-footer\"\n          className={[\n            `text-sm text-${footerColor} flex items-center`,\n            footerBackground !== \"transparent\"\n              ? `bg-${footerBackground} -mx-${padding} -mb-${padding} px-${padding} py-${padding} rounded-b-${borderRadius}`\n              : \"\",\n          ]\n            .filter(Boolean)\n            .join(\" \")}\n        >\n          {footerContent}\n        </div>\n      )}\n    </div>\n  );\n}\n\nexport const cardWidgetPropertySchema: WidgetPropertySchema = {\n  widgetType: \"CardWidget\",\n  displayName: \"Card\",\n  fields: [\n    // Header\n    {\n      key: \"headerEnabled\",\n      label: \"Show Header\",\n      type: \"boolean\",\n      description: \"Toggle header visibility\",\n      defaultValue: true,\n      group: \"Header\",\n    },\n    {\n      key: \"title\",\n      label: \"Title\",\n      type: \"text\",\n      description: \"Card title text\",\n      defaultValue: \"Card Title\",\n      group: \"Header\",\n      requiresKeyToBeTrue: \"headerEnabled\",\n    },\n    getFontSizeField({\n      key: \"titleFontSize\",\n      label: \"Title Font Size\",\n      description: \"Font size for the title\",\n      defaultValue: \"lg\",\n      group: \"Header\",\n      requiresKeyToBeTrue: \"headerEnabled\",\n    }),\n    getColorField({\n      key: \"titleColor\",\n      label: \"Title Color\",\n      description: \"Color for the title\",\n      defaultValue: \"foreground\",\n      group: \"Header\",\n      requiresKeyToBeTrue: \"headerEnabled\",\n    }),\n    getColorField({\n      key: \"headerBackground\",\n      label: \"Header Background\",\n      description: \"Background color for the header\",\n      defaultValue: \"transparent\",\n      group: \"Header\",\n      requiresKeyToBeTrue: \"headerEnabled\",\n    }),\n\n    // Footer\n    {\n      key: \"footerEnabled\",\n      label: \"Show Footer\",\n      type: \"boolean\",\n      description: \"Toggle footer visibility\",\n      defaultValue: false,\n      group: \"Footer\",\n    },\n    {\n      key: \"footerContent\",\n      label: \"Footer Text\",\n      type: \"text\",\n      description: \"Footer content text\",\n      defaultValue: \"\",\n      group: \"Footer\",\n      requiresKeyToBeTrue: \"footerEnabled\",\n    },\n    getColorField({\n      key: \"footerColor\",\n      label: \"Footer Color\",\n      description: \"Color for the footer text\",\n      defaultValue: \"muted\",\n      group: \"Footer\",\n      requiresKeyToBeTrue: \"footerEnabled\",\n    }),\n    getColorField({\n      key: \"footerBackground\",\n      label: \"Footer Background\",\n      description: \"Background color for the footer\",\n      defaultValue: \"transparent\",\n      group: \"Footer\",\n      requiresKeyToBeTrue: \"footerEnabled\",\n    }),\n\n    // Design\n    {\n      type: \"background\",\n      key: \"background\",\n      label: \"Background\",\n      description: \"Background for the card\",\n      defaultValue: { type: \"solid\", color: \"background\" },\n      group: \"Design\",\n    },\n    getPaddingField({\n      key: \"padding\",\n      label: \"Padding\",\n      description: \"Card padding\",\n      defaultValue: 6,\n      group: \"Design\",\n    }),\n    getBorderRadiusField({\n      key: \"borderRadius\",\n      label: \"Border Radius\",\n      description: \"Card border radius\",\n      defaultValue: \"xl\",\n      group: \"Design\",\n    }),\n    getBorderWidthField({\n      key: \"borderWidth\",\n      label: \"Border Width\",\n      description: \"Card border width\",\n      defaultValue: \"thin\",\n      group: \"Design\",\n    }),\n    getBorderColorField({\n      key: \"borderColor\",\n      label: \"Border Color\",\n      description: \"Card border color\",\n      defaultValue: \"muted\",\n      group: \"Design\",\n    }),\n    getGapField({\n      key: \"gapSize\",\n      label: \"Gap\",\n      description: \"Gap between child widgets\",\n      defaultValue: \"md\",\n      group: \"Design\",\n    }),\n  ],\n};\n"],"mappings":"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"}