{"version":3,"sources":["../src/community-groups/types.ts","../src/community-groups/LegionCommunityGroups.tsx"],"names":["LegionCommunityGroups"],"mappings":"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","file":"community-groups.mjs","sourcesContent":["/**\n * Theming props for the Community Groups Widget.\n * These map to CSS custom properties used internally.\n */\nexport interface CommunityGroupsThemingProps {\n  /** Primary color */\n  groupsPrimaryColor?: string;\n  /** Container background color */\n  groupsBackgroundColor?: string;\n  /** Primary text color */\n  groupsTextColor?: string;\n  /** Secondary text color */\n  groupsSecondaryTextColor?: string;\n  /** Border color */\n  groupsBorderColor?: string;\n  /** Card background */\n  groupsCardBg?: string;\n  /** Card border radius */\n  groupsCardRadius?: string;\n  /** Card box shadow */\n  groupsCardShadow?: string;\n  /** Card hover box shadow */\n  groupsCardHoverShadow?: string;\n  /** Card padding */\n  groupsCardPadding?: string;\n  /** Avatar size */\n  groupsAvatarSize?: string;\n  /** Avatar border radius */\n  groupsAvatarRadius?: string;\n  /** Group name font size */\n  groupsNameSize?: string;\n  /** Group name font weight */\n  groupsNameWeight?: string;\n  /** Meta text font size */\n  groupsMetaSize?: string;\n  /** Font family */\n  groupsFontFamily?: string;\n  /** Grid gap */\n  groupsGridGap?: string;\n  /** Transition duration */\n  groupsTransitionDuration?: string;\n  /** Hover scale factor */\n  groupsHoverScale?: string;\n}\n\n/**\n * Core configuration props for the Community Groups Widget.\n */\nexport interface CommunityGroupsWidgetProps\n  extends CommunityGroupsThemingProps {\n  /** Base URL of the Legion application (required) */\n  baseUrl: string;\n  /** JWT auth token for authenticated features, sent via postMessage */\n  authToken?: string;\n  /** Number of groups to display (1-20). Default: 6 */\n  count?: number;\n  /** Layout mode. Default: \"grid\" */\n  layout?: \"grid\" | \"list\";\n  /** Theme preset. Default: \"light\" */\n  theme?: \"light\" | \"dark\";\n  /** Show \"View all\" link. Default: true */\n  showViewAll?: boolean;\n  /** Community URL prefix. Default: \"/community\" */\n  communityUrl?: string;\n  /** URL for the \"View all\" link. Default: \"{communityUrl}/groups\" */\n  viewAllUrl?: string;\n  /** Sort order. Default: \"trending\" */\n  sortBy?: \"trending\" | \"popular\" | \"recent\";\n  /** Widget height CSS value. Default: \"auto\" */\n  height?: string;\n  /** Widget width CSS value. Default: \"100%\" */\n  width?: string;\n  /** Additional CSS class name for the container */\n  className?: string;\n  /** Additional inline styles for the container */\n  style?: React.CSSProperties;\n  /** Callback when the widget iframe has loaded */\n  onLoad?: (detail: { widget: string; count: number; theme: string }) => void;\n  /** Callback when the widget iframe fails to load */\n  onError?: (message: string) => void;\n}\n\n/**\n * Mapping from camelCase theming prop names to kebab-case query params.\n */\nexport const GROUPS_THEMING_PROP_TO_PARAM: Record<\n  keyof CommunityGroupsThemingProps,\n  string\n> = {\n  groupsPrimaryColor: \"groups-primary-color\",\n  groupsBackgroundColor: \"groups-background-color\",\n  groupsTextColor: \"groups-text-color\",\n  groupsSecondaryTextColor: \"groups-secondary-text-color\",\n  groupsBorderColor: \"groups-border-color\",\n  groupsCardBg: \"groups-card-bg\",\n  groupsCardRadius: \"groups-card-radius\",\n  groupsCardShadow: \"groups-card-shadow\",\n  groupsCardHoverShadow: \"groups-card-hover-shadow\",\n  groupsCardPadding: \"groups-card-padding\",\n  groupsAvatarSize: \"groups-avatar-size\",\n  groupsAvatarRadius: \"groups-avatar-radius\",\n  groupsNameSize: \"groups-name-size\",\n  groupsNameWeight: \"groups-name-weight\",\n  groupsMetaSize: \"groups-meta-size\",\n  groupsFontFamily: \"groups-font-family\",\n  groupsGridGap: \"groups-grid-gap\",\n  groupsTransitionDuration: \"groups-transition-duration\",\n  groupsHoverScale: \"groups-hover-scale\",\n};\n","import {\n  useRef,\n  useCallback,\n  useMemo,\n  forwardRef,\n  useImperativeHandle,\n} from \"react\";\nimport {\n  type CommunityGroupsWidgetProps,\n  type CommunityGroupsThemingProps,\n  GROUPS_THEMING_PROP_TO_PARAM,\n} from \"./types\";\n\n/**\n * Ref handle exposed by LegionCommunityGroups for imperative control.\n */\nexport interface LegionCommunityGroupsHandle {\n  /** Reload the widget iframe */\n  refresh: () => void;\n}\n\n/**\n * Build the iframe src URL from widget props.\n */\nexport function buildCommunityGroupsWidgetUrl(\n  props: CommunityGroupsWidgetProps\n): string {\n  const {\n    baseUrl,\n    count = 6,\n    layout = \"grid\",\n    theme = \"light\",\n    showViewAll = true,\n    communityUrl = \"/community\",\n    viewAllUrl,\n    sortBy = \"trending\",\n  } = props;\n\n  const url = new URL(\"/widget/community-groups\", baseUrl);\n  url.searchParams.set(\"count\", String(Math.min(Math.max(count, 1), 20)));\n  url.searchParams.set(\"layout\", layout);\n  url.searchParams.set(\"theme\", theme);\n  url.searchParams.set(\"showViewAll\", String(showViewAll));\n  url.searchParams.set(\"communityUrl\", communityUrl);\n  url.searchParams.set(\"viewAllUrl\", viewAllUrl || `${communityUrl}/groups`);\n  url.searchParams.set(\"sortBy\", sortBy);\n\n  // Append theming params\n  const themingKeys = Object.keys(GROUPS_THEMING_PROP_TO_PARAM) as Array<\n    keyof CommunityGroupsThemingProps\n  >;\n  for (const key of themingKeys) {\n    const value = props[key];\n    if (value !== undefined && value !== null && String(value).length > 0) {\n      url.searchParams.set(GROUPS_THEMING_PROP_TO_PARAM[key], String(value));\n    }\n  }\n\n  return url.toString();\n}\n\n/**\n * LegionCommunityGroups – a React component that embeds the Legion\n * Community Groups widget via an iframe.\n */\nexport const LegionCommunityGroups = forwardRef<\n  LegionCommunityGroupsHandle,\n  CommunityGroupsWidgetProps\n>(function LegionCommunityGroups(props, ref) {\n  const {\n    count = 6,\n    layout = \"grid\",\n    theme = \"light\",\n    showViewAll,\n    communityUrl,\n    viewAllUrl,\n    sortBy,\n    height = \"auto\",\n    width = \"100%\",\n    className,\n    style,\n    onLoad,\n    onError,\n    authToken,\n    baseUrl,\n    ...rest\n  } = props;\n\n  const iframeRef = useRef<HTMLIFrameElement>(null);\n\n  useImperativeHandle(\n    ref,\n    () => ({\n      refresh: () => {\n        const iframe = iframeRef.current;\n        if (iframe?.contentWindow) {\n          iframe.contentWindow.location.reload();\n        }\n      },\n    }),\n    []\n  );\n\n  const src = useMemo(\n    () => buildCommunityGroupsWidgetUrl(props),\n    [\n      baseUrl,\n      count,\n      layout,\n      theme,\n      showViewAll,\n      communityUrl,\n      viewAllUrl,\n      sortBy,\n      ...Object.keys(GROUPS_THEMING_PROP_TO_PARAM).map(\n        (k) => rest[k as keyof typeof rest]\n      ),\n    ]\n  );\n\n  const handleLoad = useCallback(() => {\n    const iframe = iframeRef.current;\n    if (authToken && iframe?.contentWindow) {\n      iframe.contentWindow.postMessage(\n        { type: \"AUTH_TOKEN\", token: authToken },\n        baseUrl\n      );\n    }\n    onLoad?.({\n      widget: \"community-groups\",\n      count: Math.min(Math.max(count, 1), 20),\n      theme,\n    });\n  }, [authToken, baseUrl, count, theme, onLoad]);\n\n  const handleError = useCallback(() => {\n    onError?.(\"Failed to load community groups widget\");\n  }, [onError]);\n\n  const resolvedHeight = height === \"auto\" ? \"200px\" : height;\n\n  return (\n    <div\n      className={className}\n      style={{ width, height: resolvedHeight, ...style }}\n      data-testid=\"legion-community-groups\"\n    >\n      <iframe\n        ref={iframeRef}\n        src={src}\n        title=\"Community Groups Widget\"\n        width=\"100%\"\n        height=\"100%\"\n        frameBorder=\"0\"\n        scrolling=\"no\"\n        loading=\"lazy\"\n        onLoad={handleLoad}\n        onError={handleError}\n        style={{ border: \"none\" }}\n      />\n    </div>\n  );\n});\n"]}