{"version":3,"sources":["../src/community-posts/types.ts","../src/community-posts/LegionCommunityPosts.tsx"],"names":["LegionCommunityPosts"],"mappings":"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","file":"community-posts.mjs","sourcesContent":["/**\n * Theming props for the Community Posts Widget.\n * These map to CSS custom properties used internally.\n */\nexport interface CommunityPostsThemingProps {\n  /** Primary color */\n  postsPrimaryColor?: string;\n  /** Container background color */\n  postsBackgroundColor?: string;\n  /** Primary text color */\n  postsTextColor?: string;\n  /** Secondary text color */\n  postsSecondaryTextColor?: string;\n  /** Border color */\n  postsBorderColor?: string;\n  /** Card background */\n  postsCardBg?: string;\n  /** Card border radius */\n  postsCardRadius?: string;\n  /** Card box shadow */\n  postsCardShadow?: string;\n  /** Card padding */\n  postsCardPadding?: string;\n  /** Avatar size */\n  postsAvatarSize?: string;\n  /** Avatar border radius */\n  postsAvatarRadius?: string;\n  /** Post title font size */\n  postsTitleSize?: string;\n  /** Post title font weight */\n  postsTitleWeight?: string;\n  /** Post body font size */\n  postsBodySize?: string;\n  /** Meta text font size */\n  postsMetaSize?: string;\n  /** Font family */\n  postsFontFamily?: string;\n  /** Gap between posts */\n  postsGap?: string;\n  /** Tag background */\n  postsTagBg?: string;\n  /** Tag text color */\n  postsTagColor?: string;\n  /** Tag border radius */\n  postsTagRadius?: string;\n  /** Action button background */\n  postsActionBg?: string;\n  /** Action button text color */\n  postsActionColor?: string;\n  /** Action button hover background */\n  postsActionHoverBg?: string;\n  /** Like button color */\n  postsLikeColor?: string;\n  /** Transition duration */\n  postsTransitionDuration?: string;\n}\n\n/**\n * Core configuration props for the Community Posts Widget.\n */\nexport interface CommunityPostsWidgetProps extends CommunityPostsThemingProps {\n  /** Base URL of the Legion application (required) */\n  baseUrl: string;\n  /** JWT auth token for authenticated features */\n  authToken?: string;\n  /** Number of posts per page (5-50). Default: 10 */\n  pageSize?: number;\n  /** Filter mode. Default: \"recent\" */\n  filter?: \"recent\" | \"popular\" | \"unanswered\";\n  /** Channel/group ID to filter posts */\n  channelId?: string;\n  /** Show filter bar. Default: true */\n  showFilters?: boolean;\n  /** Show action buttons (like, comment). Default: true */\n  showActions?: boolean;\n  /** Current user ID */\n  userId?: string;\n  /** Current username */\n  username?: string;\n  /** Theme preset. Default: \"light\" */\n  theme?: \"light\" | \"dark\";\n  /** Widget height CSS value. Default: \"800px\" */\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; 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 POSTS_THEMING_PROP_TO_PARAM: Record<\n  keyof CommunityPostsThemingProps,\n  string\n> = {\n  postsPrimaryColor: \"posts-primary-color\",\n  postsBackgroundColor: \"posts-background-color\",\n  postsTextColor: \"posts-text-color\",\n  postsSecondaryTextColor: \"posts-secondary-text-color\",\n  postsBorderColor: \"posts-border-color\",\n  postsCardBg: \"posts-card-bg\",\n  postsCardRadius: \"posts-card-radius\",\n  postsCardShadow: \"posts-card-shadow\",\n  postsCardPadding: \"posts-card-padding\",\n  postsAvatarSize: \"posts-avatar-size\",\n  postsAvatarRadius: \"posts-avatar-radius\",\n  postsTitleSize: \"posts-title-size\",\n  postsTitleWeight: \"posts-title-weight\",\n  postsBodySize: \"posts-body-size\",\n  postsMetaSize: \"posts-meta-size\",\n  postsFontFamily: \"posts-font-family\",\n  postsGap: \"posts-gap\",\n  postsTagBg: \"posts-tag-bg\",\n  postsTagColor: \"posts-tag-color\",\n  postsTagRadius: \"posts-tag-radius\",\n  postsActionBg: \"posts-action-bg\",\n  postsActionColor: \"posts-action-color\",\n  postsActionHoverBg: \"posts-action-hover-bg\",\n  postsLikeColor: \"posts-like-color\",\n  postsTransitionDuration: \"posts-transition-duration\",\n};\n\n","import {\n  useRef,\n  useCallback,\n  useMemo,\n  forwardRef,\n  useImperativeHandle,\n} from \"react\";\nimport {\n  type CommunityPostsWidgetProps,\n  type CommunityPostsThemingProps,\n  POSTS_THEMING_PROP_TO_PARAM,\n} from \"./types\";\n\n/**\n * Ref handle exposed by LegionCommunityPosts for imperative control.\n */\nexport interface LegionCommunityPostsHandle {\n  /** Reload the widget iframe */\n  refresh: () => void;\n}\n\n/**\n * Build the iframe src URL from widget props.\n */\nexport function buildCommunityPostsWidgetUrl(\n  props: CommunityPostsWidgetProps\n): string {\n  const {\n    baseUrl,\n    pageSize = 10,\n    filter = \"recent\",\n    channelId,\n    showFilters = true,\n    showActions = true,\n    userId,\n    username,\n    theme = \"light\",\n  } = props;\n\n  const url = new URL(\"/widget/community-posts\", baseUrl);\n  url.searchParams.set(\"pageSize\", String(Math.min(Math.max(pageSize, 5), 50)));\n  url.searchParams.set(\"filter\", filter);\n  url.searchParams.set(\"showFilters\", String(showFilters));\n  url.searchParams.set(\"showActions\", String(showActions));\n  url.searchParams.set(\"theme\", theme);\n\n  if (channelId) url.searchParams.set(\"channelId\", channelId);\n  if (userId) url.searchParams.set(\"userId\", userId);\n  if (username) url.searchParams.set(\"username\", username);\n\n  // Append theming params\n  const themingKeys = Object.keys(POSTS_THEMING_PROP_TO_PARAM) as Array<\n    keyof CommunityPostsThemingProps\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(POSTS_THEMING_PROP_TO_PARAM[key], String(value));\n    }\n  }\n\n  return url.toString();\n}\n\n/**\n * LegionCommunityPosts – a React component that embeds the Legion\n * Community Posts widget via an iframe.\n *\n * Supports postMessage authentication for features like liking and commenting.\n */\nexport const LegionCommunityPosts = forwardRef<\n  LegionCommunityPostsHandle,\n  CommunityPostsWidgetProps\n>(function LegionCommunityPosts(props, ref) {\n  const {\n    pageSize = 10,\n    filter,\n    channelId,\n    showFilters,\n    showActions,\n    userId,\n    username,\n    authToken,\n    theme = \"light\",\n    height = \"800px\",\n    width = \"100%\",\n    className,\n    style,\n    onLoad,\n    onError,\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    () => buildCommunityPostsWidgetUrl(props),\n    [\n      baseUrl, pageSize, filter, channelId, showFilters, showActions,\n      userId, username, theme,\n      ...Object.keys(POSTS_THEMING_PROP_TO_PARAM).map(\n        (k) => rest[k as keyof typeof rest]\n      ),\n    ]\n  );\n\n  const handleLoad = useCallback(() => {\n    // Send auth token via postMessage\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?.({ widget: \"community-posts\", theme: theme ?? \"light\" });\n  }, [onLoad, theme, authToken, baseUrl]);\n\n  const handleError = useCallback(() => {\n    onError?.(\"Failed to load community posts widget\");\n  }, [onError]);\n\n  return (\n    <div\n      className={className}\n      style={{ width, height, ...style }}\n      data-testid=\"legion-community-posts\"\n    >\n      <iframe\n        ref={iframeRef}\n        src={src}\n        title=\"Community Posts 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\n"]}