{"version":3,"file":"LinkWidget-BHfW3Z3Z.mjs","names":[],"sources":["../../widgets/src/widgets/LinkWidget.tsx"],"sourcesContent":["import type { WidgetPropertySchema } from \"@fluid-app/portal-core/registries\";\nimport type { ComponentProps } from \"react\";\nimport type React from \"react\";\nimport { Button } from \"@fluid-app/ui-primitives\";\nimport { useWidgetRenderState } from \"../contexts/WidgetRenderStateContext\";\nimport { useLinkAction } from \"../hooks/use-link-action\";\nimport type { LinkType, ShareSource } from \"../lib/link-type-utils\";\nimport {\n  getBorderRadiusCompositeField,\n  getBorderWidthField,\n  getBorderColorField,\n  borderWidthClasses,\n  borderColorClasses,\n  getButtonSizeField,\n  getFontSizeField,\n  getPaddingField,\n} from \"../core/fields\";\nimport type {\n  BorderRadiusOptions,\n  BorderWidthOptions,\n  ButtonSizeOptions,\n  ColorOptions,\n  FontSizeOptions,\n  PaddingOptions,\n} from \"@fluid-app/portal-core/types\";\nimport { AlignCenter, AlignLeft, AlignRight } from \"lucide-react\";\nimport type { ShareableItem } from \"@fluid-app/portal-core/types\";\n\ntype LinkVariant =\n  | \"default\"\n  | \"outline\"\n  | \"secondary\"\n  | \"ghost\"\n  | \"destructive\";\n\nconst borderRadiusTLClasses: Record<BorderRadiusOptions, string> = {\n  none: \"rounded-tl-none\",\n  sm: \"rounded-tl-sm\",\n  md: \"rounded-tl-md\",\n  lg: \"rounded-tl-lg\",\n  xl: \"rounded-tl-xl\",\n  full: \"rounded-tl-full\",\n};\n\nconst borderRadiusTRClasses: Record<BorderRadiusOptions, string> = {\n  none: \"rounded-tr-none\",\n  sm: \"rounded-tr-sm\",\n  md: \"rounded-tr-md\",\n  lg: \"rounded-tr-lg\",\n  xl: \"rounded-tr-xl\",\n  full: \"rounded-tr-full\",\n};\n\nconst borderRadiusBLClasses: Record<BorderRadiusOptions, string> = {\n  none: \"rounded-bl-none\",\n  sm: \"rounded-bl-sm\",\n  md: \"rounded-bl-md\",\n  lg: \"rounded-bl-lg\",\n  xl: \"rounded-bl-xl\",\n  full: \"rounded-bl-full\",\n};\n\nconst borderRadiusBRClasses: Record<BorderRadiusOptions, string> = {\n  none: \"rounded-br-none\",\n  sm: \"rounded-br-sm\",\n  md: \"rounded-br-md\",\n  lg: \"rounded-br-lg\",\n  xl: \"rounded-br-xl\",\n  full: \"rounded-br-full\",\n};\n\nexport type { LinkType, ShareSource } from \"../lib/link-type-utils\";\n\ntype LinkWidgetProps = ComponentProps<\"div\"> & {\n  text?: string;\n  linkType?: LinkType;\n  // URL mode\n  href?: string;\n  openInNewTab?: boolean;\n  // Screen mode\n  screenSlug?: string;\n  // Share mode\n  shareSource?: ShareSource;\n  shareResource?: ShareableItem;\n  shareUrl?: string;\n  // Styling\n  variant?: LinkVariant;\n  size?: ButtonSizeOptions;\n  fontSize?: FontSizeOptions;\n  alignment?: \"left\" | \"center\" | \"right\";\n  fullWidth?: boolean;\n  padding?: PaddingOptions;\n  /** @deprecated Use per-corner props instead */\n  borderRadius?: BorderRadiusOptions;\n  borderRadiusTL?: BorderRadiusOptions;\n  borderRadiusTR?: BorderRadiusOptions;\n  borderRadiusBL?: BorderRadiusOptions;\n  borderRadiusBR?: BorderRadiusOptions;\n  borderWidth?: BorderWidthOptions;\n  borderColor?: ColorOptions;\n  underline?: boolean;\n  previewMode?: boolean;\n  // Builder render state is provided by WidgetRenderStateContext.\n  editMode?: boolean;\n};\n\nconst alignmentClasses = {\n  left: \"justify-start\",\n  center: \"justify-center\",\n  right: \"justify-end\",\n} as const;\n\nexport function LinkWidget({\n  text = \"Click Here\",\n  linkType = \"url\",\n  href = \"\",\n  openInNewTab = true,\n  screenSlug,\n  shareSource,\n  shareResource,\n  shareUrl,\n  variant = \"default\",\n  size = \"default\",\n  fontSize = \"sm\",\n  alignment = \"center\",\n  fullWidth = false,\n  padding = 0,\n  borderRadius,\n  borderRadiusTL,\n  borderRadiusTR,\n  borderRadiusBL,\n  borderRadiusBR,\n  borderWidth = \"none\",\n  borderColor = \"muted\",\n  underline = false,\n  previewMode = false,\n  editMode: _editMode,\n  className,\n  ...props\n}: LinkWidgetProps): React.JSX.Element {\n  const renderState = useWidgetRenderState();\n  const editMode = _editMode ?? renderState.editMode;\n  const { resolvedHref, handleClick, anchorProps } = useLinkAction({\n    linkType,\n    href,\n    openInNewTab,\n    screenSlug,\n    shareSource,\n    shareResource,\n    shareUrl,\n  });\n  if (previewMode) {\n    return (\n      <div className={`flex justify-center p-4 ${className ?? \"\"}`} {...props}>\n        <span\n          style={{\n            display: \"inline-flex\",\n            alignItems: \"center\",\n            justifyContent: \"center\",\n            height: \"36px\",\n            padding: \"0 16px\",\n            borderRadius: \"6px\",\n            backgroundColor: \"#18181b\",\n            color: \"#ffffff\",\n            fontSize: \"14px\",\n            fontWeight: 500,\n          }}\n        >\n          {text}\n        </span>\n      </div>\n    );\n  }\n\n  const fallback = borderRadius ?? \"md\";\n  const tl = borderRadiusTL ?? fallback;\n  const tr = borderRadiusTR ?? fallback;\n  const bl = borderRadiusBL ?? fallback;\n  const br = borderRadiusBR ?? fallback;\n  const borderRadiusClasses = `rounded-none ${borderRadiusTLClasses[tl]} ${borderRadiusTRClasses[tr]} ${borderRadiusBLClasses[bl]} ${borderRadiusBRClasses[br]}`;\n  const buttonClasses = `text-${fontSize} ${borderRadiusClasses} ${fullWidth ? \"w-full\" : \"\"} ${underline ? \"underline\" : \"\"}`;\n\n  return (\n    <div\n      className={`flex ${alignmentClasses[alignment]} p-${padding} ${borderWidthClasses[borderWidth]} ${borderWidth !== \"none\" ? borderColorClasses[borderColor] : \"\"} ${className ?? \"\"}`}\n      {...props}\n    >\n      <Button asChild variant={variant} size={size} className={buttonClasses}>\n        {editMode ? (\n          <span className=\"cursor-default\">{text}</span>\n        ) : linkType === \"share\" ? (\n          <button type=\"button\" onClick={handleClick}>\n            {text}\n          </button>\n        ) : linkType === \"screen\" ? (\n          screenSlug ? (\n            <a href={resolvedHref} onClick={handleClick}>\n              {text}\n            </a>\n          ) : (\n            <span className=\"cursor-default\">{text}</span>\n          )\n        ) : (\n          // onClick matters for URLs that point back into this portal — those\n          // navigate in-app; everything else falls through to the browser.\n          <a href={resolvedHref} onClick={handleClick} {...anchorProps}>\n            {text}\n          </a>\n        )}\n      </Button>\n    </div>\n  );\n}\n\nexport const linkWidgetPropertySchema: WidgetPropertySchema = {\n  widgetType: \"LinkWidget\",\n  displayName: \"Link Button\",\n  fields: [\n    // Link Group\n    {\n      key: \"linkType\",\n      label: \"Link Type\",\n      type: \"buttonGroup\",\n      description:\n        \"Choose whether this button opens a URL, screen, or share action\",\n      options: [\n        { label: \"URL\", value: \"url\" },\n        { label: \"Screen\", value: \"screen\" },\n        { label: \"Share\", value: \"share\" },\n      ],\n      defaultValue: \"url\",\n      group: \"Link\",\n    },\n    {\n      key: \"text\",\n      label: \"Text\",\n      type: \"text\",\n      description: \"The button label text\",\n      defaultValue: \"Click Here\",\n      group: \"Link\",\n    },\n    // URL mode fields\n    {\n      key: \"href\",\n      label: \"URL\",\n      type: \"text\",\n      description: \"The destination URL\",\n      defaultValue: \"\",\n      group: \"Link\",\n      requiresKeyValue: { key: \"linkType\", value: \"url\" },\n    },\n    {\n      key: \"openInNewTab\",\n      label: \"Open in New Tab\",\n      type: \"boolean\",\n      description: \"Whether to open the link in a new tab\",\n      defaultValue: true,\n      group: \"Link\",\n      requiresKeyValue: { key: \"linkType\", value: \"url\" },\n    },\n    // Screen mode fields\n    {\n      key: \"screenSlug\",\n      label: \"Screen\",\n      type: \"screenPicker\",\n      description: \"Select a screen to navigate to\",\n      includeSystemItems: true,\n      group: \"Link\",\n      requiresKeyValue: { key: \"linkType\", value: \"screen\" },\n    },\n    // Share mode fields\n    {\n      key: \"shareSource\",\n      label: \"Share Source\",\n      type: \"buttonGroup\",\n      description: \"Choose whether the share action uses a resource or URL\",\n      options: [\n        { label: \"Resource\", value: \"resource\" },\n        { label: \"URL\", value: \"url\" },\n      ],\n      defaultValue: \"resource\",\n      group: \"Link\",\n      requiresKeyValue: { key: \"linkType\", value: \"share\" },\n    },\n    {\n      key: \"shareResource\",\n      label: \"Shareable Content\",\n      type: \"resource\",\n      description: \"Select content to share\",\n      // See link-type-schema-fields.ts — the share path has no\n      // enrollment-pack shareable type.\n      allowedTypes: [\"Product\", \"Medium\", \"Library\", \"Page\"],\n      group: \"Link\",\n      requiresKeyValue: [\n        { key: \"linkType\", value: \"share\" },\n        { key: \"shareSource\", value: \"resource\" },\n      ],\n    },\n    {\n      key: \"shareUrl\",\n      label: \"Share URL\",\n      type: \"text\",\n      description: \"The URL to share\",\n      defaultValue: \"\",\n      group: \"Link\",\n      requiresKeyValue: [\n        { key: \"linkType\", value: \"share\" },\n        { key: \"shareSource\", value: \"url\" },\n      ],\n    },\n    // Button Style Group\n    {\n      key: \"variant\",\n      label: \"Variant\",\n      type: \"select\",\n      description: \"The visual style of the button\",\n      options: [\n        { label: \"Default\", value: \"default\" },\n        { label: \"Outline\", value: \"outline\" },\n        { label: \"Secondary\", value: \"secondary\" },\n        { label: \"Ghost\", value: \"ghost\" },\n        { label: \"Destructive\", value: \"destructive\" },\n      ],\n      defaultValue: \"default\",\n      group: \"Button Style\",\n    },\n    getButtonSizeField({\n      key: \"size\",\n      label: \"Size\",\n      description: \"The size of the button\",\n      defaultValue: \"default\",\n      group: \"Button Style\",\n    }),\n    getFontSizeField({\n      key: \"fontSize\",\n      label: \"Text Size\",\n      description: \"The font size of the button text\",\n      defaultValue: \"sm\",\n      group: \"Button Style\",\n    }),\n    {\n      key: \"underline\",\n      label: \"Underline\",\n      type: \"boolean\",\n      description: \"Underline the button text\",\n      defaultValue: false,\n      group: \"Button Style\",\n    },\n    // Layout Group\n    {\n      key: \"alignment\",\n      label: \"Alignment\",\n      type: \"buttonGroup\",\n      description: \"Horizontal alignment of the button\",\n      options: [\n        { icon: AlignLeft, ariaLabel: \"Align left\", value: \"left\" },\n        { icon: AlignCenter, ariaLabel: \"Align center\", value: \"center\" },\n        { icon: AlignRight, ariaLabel: \"Align right\", value: \"right\" },\n      ],\n      defaultValue: \"center\",\n      group: \"Layout\",\n    },\n    {\n      key: \"fullWidth\",\n      label: \"Full Width\",\n      type: \"boolean\",\n      description: \"Makes the button stretch to full container width\",\n      defaultValue: false,\n      group: \"Layout\",\n    },\n    getPaddingField({\n      key: \"padding\",\n      label: \"Padding\",\n      description: \"Outer container padding\",\n      defaultValue: 0,\n      group: \"Layout\",\n    }),\n    // Design Group\n    getBorderRadiusCompositeField({\n      key: \"borderRadiusGroup\",\n      label: \"Border Radius\",\n      description: \"Corner radius of the link button\",\n      defaultValue: \"md\",\n      group: \"Design\",\n    }),\n    getBorderWidthField({\n      key: \"borderWidth\",\n      label: \"Border Width\",\n      description: \"Border width for the widget\",\n      defaultValue: \"none\",\n      group: \"Design\",\n    }),\n    getBorderColorField({\n      key: \"borderColor\",\n      label: \"Border Color\",\n      description: \"Border color for the widget\",\n      defaultValue: \"muted\",\n      group: \"Design\",\n    }),\n  ],\n};\n"],"mappings":"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"}