{"version":3,"sources":["webpack://@lemon8/web-seo/./client/routes/$user_link_name_.$article_id/shared/atoms/related-post-carousel-show.ts","webpack://@lemon8/web-seo/./client/components/article-card/index.tsx","webpack://@lemon8/web-seo/./client/components/article-recommend-card/index.tsx","webpack://@lemon8/web-seo/./client/components/article-sar/index.tsx","webpack://@lemon8/web-seo/./client/components/comment-item-content/index.tsx","webpack://@lemon8/web-seo/./client/components/comment-item-image/use-comment-image.ts","webpack://@lemon8/web-seo/./client/components/comment-item-image/index.tsx","webpack://@lemon8/web-seo/./client/components/comment-no-permission/assets/close-comment.svg","webpack://@lemon8/web-seo/./client/components/comment-no-permission/index.tsx","webpack://@lemon8/web-seo/./client/components/masonry/index.tsx","webpack://@lemon8/web-seo/./client/components/see-more-banner/index.tsx","webpack://@lemon8/web-seo/./client/utils/px-to-rem.ts","webpack://@lemon8/web-seo/./client/components/user-auth-icon/index.tsx","webpack://@lemon8/web-seo/./client/routes/$user_link_name_.$article_id/shared/atoms/current-article-id.ts","webpack://@lemon8/web-seo/./client/routes/$user_link_name_.$article_id/shared/atoms/current-article.ts","webpack://@lemon8/web-seo/./client/routes/$user_link_name_.$article_id/shared/components/legacy-hashtag-item/index.tsx","webpack://@lemon8/web-seo/./client/routes/$user_link_name_.$article_id/shared/utils/use-active-to-current-article.ts","webpack://@lemon8/web-seo/./client/utils/active/use-active-to-current-page.ts","webpack://@lemon8/web-seo/./client/utils/pending-queue.ts","webpack://@lemon8/web-seo/./shared/utils/local-storage-util.ts","webpack://@lemon8/web-seo/../libs/lemon8-web-app-shared/dist/esm/article/ast.js","webpack://@lemon8/web-seo/../libs/lemon8-web-app-shared/dist/esm/article/components/anchor.js","webpack://@lemon8/web-seo/../libs/lemon8-web-app-shared/dist/esm/article/components/entity-word.js","webpack://@lemon8/web-seo/../libs/lemon8-web-app-shared/dist/esm/article/components/hashtag.js","webpack://@lemon8/web-seo/../libs/lemon8-web-app-shared/dist/esm/article/components/html.js","webpack://@lemon8/web-seo/../libs/lemon8-web-app-shared/dist/esm/article/components/index.js","webpack://@lemon8/web-seo/../libs/lemon8-web-app-shared/dist/esm/article/components/mentioned-user.js","webpack://@lemon8/web-seo/../libs/lemon8-web-app-shared/dist/esm/article/components/poi.js","webpack://@lemon8/web-seo/../libs/lemon8-web-app-shared/dist/esm/article/index.js"],"names":["$RelatedPostCarouselShow","atom","RELATED_ARTICLE_CAROUSEL_HIDE_RANK","ArticleCard","props","region","useAtomValue","$Locale","isBot","$UserAgent","article","imageList","articleClass","title","groupId","shortContent","largeImage","author","articleLikes","imprId","isLCP","rank","t","useTranslation","formatNum","useNumFormatter","active","usePageActive","isMobileUser","$IsMobileUser","currentPageModule","useScopedAtomValue","$CurrentPageModule","prefix","$CurrentPositionPrefix","setRelatedPostCarouselShow","useSetAtom","posterImageList","useMemo","temp","length","slice","articleHref","useSEOHref","LegacyArticleUtil","handleClickArticle","useReflowClick","clickEvent","_","bundle","_objectSpread","current_page_module","current_position","ClickPosition","page_click_id","reflowBehavior","schemaOption","pageType","EArticleClass","authorId","userId","ampExtra","enter_position","defaultBehavior","event","articleRegion","preventDefault","window","open","authorHref","handleClickAuthor","e","stopPropagation","articleCardRef","useViewTracking","onView","useCallback","Tea","group_id","media_id","article_class","impr_id","isVideo","React","createElement","Link","ref","className","cls","multi_images","onClick","to","map","image","index","key","Image","src","url","fetchpriority","PlayIcon","unescapeArticleContentChars","DivisibleStack","wrapper","divider","avatar","alt","nickName","Heart","num","replace","ArticleRecommendCard","cardObservedRef","aspectRatio","_clamp","width","height","coverUrl","video","style","paddingBottom","concat","loading","onContextMenu","PlayFill","Boolean","SAR","currentArticle","positionPrefix","ClickPositionPrefix","relatedQuery","activeToArticle","useActiveToArticle","href","kepQueryFormat","sarObservedRef","handleSarClick","SEOKeywordsItem","keyword","CommentContent","comment","richContent","text","buildSEOLink","useSEOLinkBuilder","activeToCurrentPage","useActiveToCurrentPage","handleCommentRichContentClick","commentId","richContentArray","sortedRichContent","_sortBy","cursor","end","richContentCursor","richContentEnd","res","push","substring","currentRich","start","type","ECommentRichContentCategory","rich","mentionUserId","mentionedUerHref","IMAGE_MIN_DESIGN_WIDTH","useCommentImage","Math","max","CommentImage","commentImage","handleClickImage","_path","_path2","_circle","_circle2","_circle3","_circle4","_path3","_extends","n","r","SvgCloseComment","CommentNoPermission","CloseComment","parseToNumber","val","Number","useContainerRef","setCurrentRef","useState","setRef","instance","Masonry","forwardRef","children","columnCount","childrenArray","Children","container","setContainer","containerHeight","setContainerHeight","floor","postLayoutQueue","useRef","useImperativeHandle","postLayout","func","current","heightList","setHeightList","_range","orderList","setOrderList","o","doLayout","columnHeights","Array","fill","columnItems","childOrderList","i","child","item","min","_min","minIndex","findIndex","v","getComputedStyle","join","forEach","useEffect","requestAnimationFrame","observer","ResizeObserver","observe","disconnect","maxHeight","_max","maxHeightIndex","indexOf","maxHeightCount","filter","left","top","bottom","lastIndexOf","order","marginBottom","SeeMoreBanner","onClickSeeMore","Loading","variant","Fragment","ChevronDownIcon","pxToRem","px","DEFAULT_WIDTH","DEFAULT_HEIGHT","DEFAULT_MARGIN_LEFT","UserAuthIcon","marginLeft","light","authInfo","showAuthSymbol","$CurrentArticleId","get","traffic","$PageLevelTraffic","EPageType","includes","console","log","Promise","resolve","pendingQueue","$CurrentArticle","currentArticleId","$ArticleDetail","$CurrentAvailableArticleOrNull","ArticleDetailUtil","$CurrentArticleAsAvailable","LegacyHashtagItem","hashtag","activeToCurrentArticle","useActiveToCurrentArticle","id","handleHashtagClick","name","position","categoryId","enter_page_click_id","trafficToDeepLinkBuildingProps","mediaId","poiId","hashtagId","query","standardKeyword","enterPosition","isArray","PendingQueue","constructor","_tasks","_doInterval","task","setInterval","deleteOutdatedKeys","keyPrefix","len","localStorage","keyName","removeItem","setLocalStorageStatus","storageKey","storageValue","setItem","Object","exports","value","react_1","require","htmlparser2_1","contentToAst","content","componentBuilderList","root","stack","parser","Parser","onopentag","attr","_a","_b","builder","at","ontext","data","onclosetag","pop","parseComplete","astToElement","ast","jsx_runtime_1","__1","ArticleAnchor","onLinkClick","useContext","ArticleCtx","pattern","toArray","reduce","pre","cur","test","trim","rel","URL","host","endsWith","handleClick","link","jsx","target","ArticleAnchorComponentBuilder","tag","react_2","ArticleEntityWord","buildHref","onEntityWordClick","jsxs","ArticleEntityWordComponentBuilder","ArticleHashtag","onHashtagClick","ArticleHashtagComponentBuilder","allowedTag","attrMapping","HTMLComponentBuilder","_ref","prev","next","old","html_1","entity_word_1","hashtag_1","mentioned_user_1","poi_1","anchor_1","ArticleMentionedUserComponentBuilder","ArticlePoiComponentBuilder","ArticleMentionedUser","onMentionedUserClick","ArticlePoi","onPoiClick","ast_1","components_1","createContext","Article","BuiltinComponentBuilderList","Inner","Provider"],"mappings":"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","file":"vendors/377-cea43b4a24e4a4ad1dbf-ade4ba9718be3d0b2f6b26782fbeda8b1ed36057.js","sourcesContent":["import { atom } from 'jotai';\n\nexport const $RelatedPostCarouselShow = atom(false);\n","import { useTranslation } from 'react-i18next';\nimport { Link } from '@remix-run/react';\nimport { useCallback, useMemo, JSX } from 'react';\nimport cls from 'classnames';\nimport { Article, LegacyArticleUtil } from 'shared/models/legacy';\nimport { Image } from '~/components/image';\nimport Heart from '@lemon8/design/lib/icons/icon_assets/heart.svg';\nimport PlayIcon from '@lemon8/design/lib/icons/icon_assets/play_fill.svg';\nimport { DivisibleStack } from '~/components/divisible-stack';\nimport { useNumFormatter } from '~/utils/format/num-formatter';\nimport { useAtomValue, useSetAtom } from 'jotai';\nimport { ClickPosition } from '~/utils/click-position';\nimport { usePageActive } from '~/utils/active/use-page-active';\nimport useReflowClick from '~/utils/use-reflow-click';\nimport { $IsMobileUser } from '~/utils/is-mobile-user';\nimport { useViewTracking } from '~/utils/use-view-tracking';\nimport { useScopedAtomValue } from '@lemon8/web-app-shared/ssr';\nimport { $CurrentPageModule } from '~/models/current-page-module';\nimport { $RelatedPostCarouselShow } from '@article/shared/atoms/related-post-carousel-show';\nimport { $CurrentPositionPrefix } from '~/models/current-position-prefix';\nimport { unescapeArticleContentChars } from '@lemon8/web-app-shared/util';\nimport { useSEOHref } from '~/utils/build-seo-url';\nimport { $Locale, $UserAgent } from '@lemon8/web-app-shared/atom';\nimport { EArticleClass } from 'shared/models';\n\nimport './style.scss';\n\ninterface ArticleCardProps {\n article: Article;\n isLCP?: boolean;\n\n /**\n * starts from 0\n */\n rank: number;\n}\n\nconst RELATED_ARTICLE_CAROUSEL_HIDE_RANK = 9;\n\nexport const ArticleCard = (props: ArticleCardProps): JSX.Element => {\n const { region } = useAtomValue($Locale);\n const { isBot } = useAtomValue($UserAgent);\n\n const { article } = props;\n const {\n article: { imageList, articleClass, title, groupId, shortContent, largeImage, author, articleLikes, imprId },\n isLCP = false,\n rank,\n } = props;\n const { t } = useTranslation();\n const formatNum = useNumFormatter();\n const active = usePageActive();\n const isMobileUser = useAtomValue($IsMobileUser);\n const currentPageModule = useScopedAtomValue($CurrentPageModule);\n const prefix = useScopedAtomValue($CurrentPositionPrefix);\n const setRelatedPostCarouselShow = useSetAtom($RelatedPostCarouselShow);\n\n const posterImageList = useMemo(() => {\n const temp = imageList.length ? [...imageList] : [largeImage];\n return temp.slice(0, temp.length < 3 ? 1 : 3);\n }, [largeImage, imageList]);\n\n const articleHref = useSEOHref(LegacyArticleUtil.getArticleHref(article));\n\n const handleClickArticle = useReflowClick(\n {\n clickEvent: (_, bundle) => ({\n ...bundle,\n current_page_module: currentPageModule,\n current_position: prefix + ClickPosition.related_post,\n page_click_id: groupId,\n rank,\n }),\n reflowBehavior: () => {\n active({\n schemaOption: {\n pageType: articleClass === EArticleClass.VIDEO ? 'video' : 'article',\n groupId,\n authorId: author.userId,\n },\n ampExtra: {\n enter_position: prefix + ClickPosition.related_post,\n },\n });\n },\n defaultBehavior: (event) => {\n if (article.articleRegion && article.articleRegion !== region) {\n event?.preventDefault();\n window.open(articleHref, '_blank');\n }\n },\n },\n [active, groupId, articleClass, author, article, articleHref],\n );\n\n const authorHref = useSEOHref(LegacyArticleUtil.getAuthorPath(article));\n\n const handleClickAuthor = useReflowClick(\n {\n clickEvent: (_, bundle) => ({\n ...bundle,\n current_page_module: currentPageModule,\n current_position: prefix + ClickPosition.related_post,\n page_click_id: groupId,\n rank,\n }),\n reflowBehavior: () => {\n active({\n schemaOption: {\n pageType: articleClass === EArticleClass.VIDEO ? 'video' : 'article',\n groupId,\n authorId: author.userId,\n },\n ampExtra: {\n enter_position: prefix + ClickPosition.related_post,\n },\n });\n },\n defaultBehavior: (e) => {\n e?.stopPropagation();\n },\n },\n [active, groupId, articleClass, author],\n );\n\n const articleCardRef = useViewTracking({\n onView: useCallback(() => {\n if (isMobileUser) {\n window.Tea('wap_cta_show', {\n current_page_module: currentPageModule,\n current_position: prefix + ClickPosition.related_post,\n rank,\n });\n }\n\n window.Tea('wap_related_post_show', {\n current_page_module: currentPageModule,\n current_position: prefix + ClickPosition.related_post,\n group_id: groupId,\n media_id: author.userId,\n article_class: articleClass,\n impr_id: imprId,\n rank,\n });\n if (rank >= RELATED_ARTICLE_CAROUSEL_HIDE_RANK) {\n setRelatedPostCarouselShow(false);\n }\n }, [isMobileUser]),\n });\n\n const isVideo = articleClass === 'Video';\n\n return (\n 1,\n })}\n onClick={handleClickArticle}\n to={articleHref}\n >\n
\n
\n {posterImageList.map((image, index) => (\n
\n {isLCP ? : }\n
\n ))}\n {isVideo && (\n
\n \n
\n )}\n
\n
\n {isBot ? (\n

{title}

\n ) : (\n
{title}
\n )}\n
{unescapeArticleContentChars(shortContent)}
\n
\n
\n \n \n \n {author.nickName}\n

{author.nickName}

\n \n
\n
\n \n

{t('like_count_plural', { num: articleLikes }).replace('%d', formatNum(articleLikes))}

\n
\n
\n \n );\n};\n","import { SyntheticEvent, useCallback, useMemo } from 'react';\nimport cls from 'classnames';\nimport PlayFill from 'icon/play_fill.svg';\nimport Heart from 'icon/heart.svg';\nimport _clamp from 'lodash/clamp';\nimport { Article } from 'shared/models/legacy';\nimport { useNumFormatter } from '~/utils/format';\nimport { useViewTracking } from '~/utils/use-view-tracking';\nimport { ClickPosition } from '~/utils/click-position';\nimport { useAtomValue } from 'jotai';\nimport { useScopedAtomValue } from '@lemon8/web-app-shared/ssr';\nimport { $CurrentPositionPrefix } from '~/models/current-position-prefix';\nimport { $CurrentPageModule } from '~/models/current-page-module';\nimport useReflowClick from '~/utils/use-reflow-click';\nimport { usePageActive } from '~/utils/active/use-page-active';\nimport { $IsMobileUser } from '~/utils/is-mobile-user';\nimport { EArticleClass } from 'shared/models';\n\nimport './style.scss';\n\ninterface ArticleRecommendCardProps {\n article: Article;\n rank: number;\n}\n\nexport default function ArticleRecommendCard(props: ArticleRecommendCardProps): JSX.Element {\n const formatNum = useNumFormatter();\n\n const { article, rank } = props;\n\n const { imageList, articleClass, title, groupId, largeImage, author, articleLikes, imprId } = article;\n\n const isMobileUser = useAtomValue($IsMobileUser);\n\n const prefix = useScopedAtomValue($CurrentPositionPrefix);\n\n const currentPageModule = useScopedAtomValue($CurrentPageModule);\n\n const active = usePageActive();\n\n const cardObservedRef = useViewTracking({\n onView: useCallback(() => {\n if (isMobileUser) {\n window.Tea('wap_cta_show', {\n current_page_module: currentPageModule,\n current_position: prefix + ClickPosition.related_post,\n rank,\n });\n }\n\n window.Tea('wap_related_post_show', {\n current_page_module: currentPageModule,\n current_position: prefix + ClickPosition.related_post,\n group_id: groupId,\n media_id: author.userId,\n article_class: articleClass,\n impr_id: imprId,\n rank,\n });\n }, [isMobileUser]),\n });\n\n const handleClickArticle = useReflowClick(\n {\n clickEvent: (_, bundle) => ({\n ...bundle,\n current_page_module: currentPageModule,\n current_position: prefix + ClickPosition.related_post,\n page_click_id: groupId,\n rank,\n }),\n reflowBehavior: () => {\n active({\n schemaOption: {\n pageType: articleClass === EArticleClass.VIDEO ? 'video' : 'article',\n groupId,\n authorId: author.userId,\n },\n ampExtra: {\n enter_position: prefix + ClickPosition.related_post,\n },\n });\n },\n },\n [active, groupId, articleClass, author],\n );\n\n const aspectRatio = useMemo(() => {\n switch (articleClass) {\n case EArticleClass.GALLERY:\n return _clamp(imageList[0].width / imageList[0].height, 3 / 4, 4 / 3);\n case EArticleClass.ARTICLE:\n case EArticleClass.VIDEO:\n default:\n return _clamp(largeImage.width / largeImage.height, 3 / 4, 4 / 3);\n }\n }, [article]);\n\n const coverUrl = useMemo(() => {\n switch (article.articleClass) {\n case EArticleClass.GALLERY:\n return article.imageList[0].url;\n case EArticleClass.ARTICLE:\n case EArticleClass.VIDEO:\n default:\n return article.largeImage.url;\n }\n }, [article]);\n\n return (\n
\n \n e.preventDefault()} />\n {article.articleClass === EArticleClass.VIDEO && }\n
\n
\n
{title}
\n
\n e.preventDefault()}\n />\n {article.author.nickName}\n
\n \n {Boolean(articleLikes) && {formatNum(articleLikes)}}\n
\n
\n
\n \n );\n}\n","import { FC, useCallback, useMemo } from 'react';\nimport { Link } from '@remix-run/react';\nimport { useViewTracking } from '~/utils/use-view-tracking';\nimport { ClickPosition, ClickPositionPrefix } from '~/utils/click-position';\nimport { useTranslation } from 'react-i18next';\nimport useReflowClick from '~/utils/use-reflow-click';\nimport { useActiveToArticle } from '~/utils/active/use-active-to-article';\nimport { kepQueryFormat } from 'shared/utils/format/kep-formatter';\nimport { SEOKeywordsItem } from '~/components/seo-keywords-item';\nimport { TArticleDetail } from 'shared/models';\n\nimport './style.scss';\n\ninterface IArticleSARProps {\n currentArticle: TArticleDetail;\n positionPrefix?: ClickPositionPrefix;\n}\n\nexport const SAR: FC = (props) => {\n const { t } = useTranslation();\n const { currentArticle, positionPrefix = ClickPositionPrefix.none } = props;\n const { relatedQuery = '', articleRegion } = currentArticle;\n const activeToArticle = useActiveToArticle(currentArticle);\n\n const href = useMemo(() => `/discover/${kepQueryFormat(relatedQuery)}?region=${articleRegion}`, [relatedQuery]);\n\n const sarObservedRef = useViewTracking({\n onView: useCallback(() => {\n window.Tea('wap_cta_show', {\n current_position: positionPrefix + ClickPosition.main_sar,\n group_id: currentArticle.groupId,\n });\n }, []),\n });\n\n const handleSarClick = useReflowClick(\n {\n reflowBehavior: () => {\n activeToArticle([positionPrefix, ClickPosition.main_sar]);\n },\n clickEvent: () => ({\n current_position: positionPrefix + ClickPosition.main_sar,\n page_click_id: kepQueryFormat(relatedQuery) || '',\n }),\n },\n [activeToArticle],\n );\n\n if (!relatedQuery) {\n return null;\n }\n\n return (\n \n \n
\n
\n
{t('search_sar_query')} ·
\n
\n \n
\n
\n
\n \n
\n );\n};\n","import { FC, JSX, useMemo } from 'react';\nimport _sortBy from 'lodash/sortBy';\nimport { ECommentRichContentCategory, IMentionUserRichContent, TArticleDetail, TComment } from 'shared/models';\nimport { Link } from '@remix-run/react';\nimport useReflowClick from '~/utils/use-reflow-click';\nimport { ClickPosition, ClickPositionPrefix } from '~/utils/click-position';\nimport { useSEOLinkBuilder } from '~/utils/build-seo-url';\nimport { useActiveToArticle } from '~/utils/active/use-active-to-article';\nimport { useActiveToCurrentPage } from '~/utils/active/use-active-to-current-page';\n\nimport './style.scss';\n\ninterface ICommentContentProps {\n comment: TComment;\n positionPrefix?: ClickPositionPrefix;\n // for experience page post modal\n currentArticle?: TArticleDetail;\n}\n\nexport const CommentContent: FC = (props) => {\n const { comment, currentArticle, positionPrefix = ClickPositionPrefix.none } = props;\n const { richContent, text } = comment;\n const buildSEOLink = useSEOLinkBuilder();\n const activeToCurrentPage = currentArticle ? useActiveToArticle(currentArticle) : useActiveToCurrentPage();\n\n const handleCommentRichContentClick = useReflowClick(\n {\n reflowBehavior: () => {\n activeToCurrentPage([positionPrefix, ClickPosition.comment_mentioned_user]);\n },\n clickEvent: () => ({\n current_position: positionPrefix + ClickPosition.comment_mentioned_user,\n page_click_id: comment.commentId,\n }),\n },\n [activeToCurrentPage],\n );\n\n const richContentArray = useMemo<(string | JSX.Element)[]>(() => {\n if (!richContent?.length) {\n return [];\n }\n\n const sortedRichContent = _sortBy(richContent, '.start');\n\n let cursor = 0;\n const end = text.length;\n\n let richContentCursor = 0;\n const richContentEnd = sortedRichContent.length;\n\n const res: (string | JSX.Element)[] = [];\n\n while (cursor < end) {\n if (richContentCursor < richContentEnd) {\n res.push(text.substring(cursor, end));\n cursor = end;\n break;\n }\n\n const currentRich = sortedRichContent[richContentCursor];\n\n if (cursor === currentRich.start) {\n const { start, length } = currentRich;\n if (currentRich.type === ECommentRichContentCategory.MENTION_USER) {\n const rich = currentRich as IMentionUserRichContent;\n const { mentionUserId } = rich;\n\n const mentionedUerHref = buildSEOLink(`/user/${mentionUserId}/share`);\n\n res.push(\n \n {text.substring(start, start + length)}\n ,\n );\n } else {\n res.push(text.substring(start, start + length));\n }\n\n richContentCursor += 1;\n cursor += length;\n } else {\n res.push(text.substring(cursor, currentRich.start));\n cursor = currentRich.start;\n }\n }\n\n return res;\n }, [handleCommentRichContentClick]);\n\n if (!richContent?.length) {\n return

{text}

;\n }\n\n return

{richContentArray}

;\n};\n","import _clamp from 'lodash/clamp';\nimport { TComment } from 'shared/models';\n\ninterface ICommentImage {\n width: string;\n height: string;\n src: string;\n alt: string;\n}\n\nconst IMAGE_MIN_DESIGN_WIDTH = 96;\n\nexport const useCommentImage = (comment: TComment): ICommentImage | null => {\n const { imageList } = comment;\n if (!imageList?.length) {\n return null;\n }\n\n const image = imageList[0];\n const { width, height, url } = image;\n const aspectRatio = _clamp(width / height, 3 / 4, 4 / 3);\n\n return {\n width: `${(Math.max(aspectRatio, 1) * IMAGE_MIN_DESIGN_WIDTH * 16) / 375}rem`,\n height: `${(Math.max(1 / aspectRatio, 1) * IMAGE_MIN_DESIGN_WIDTH * 16) / 375}rem`,\n src: url,\n // TODO alt\n alt: '',\n };\n};\n","import { FC } from 'react';\nimport { Image } from '~/components/image';\nimport { TArticleDetail, TComment } from 'shared/models';\nimport useReflowClick from '~/utils/use-reflow-click';\nimport { ClickPosition, ClickPositionPrefix } from '~/utils/click-position';\nimport { useActiveToCurrentPage } from '~/utils/active/use-active-to-current-page';\nimport { useActiveToArticle } from '~/utils/active/use-active-to-article';\nimport { useCommentImage } from './use-comment-image';\n\nimport './style.scss';\n\ninterface ICommentImageProps {\n comment: TComment;\n positionPrefix?: ClickPositionPrefix;\n currentArticle?: TArticleDetail;\n}\n\nexport const CommentImage: FC = (props) => {\n const { comment, currentArticle, positionPrefix = ClickPositionPrefix.none } = props;\n const commentImage = useCommentImage(comment);\n const activeToCurrentPage = currentArticle ? useActiveToArticle(currentArticle) : useActiveToCurrentPage();\n\n if (!commentImage) {\n return null;\n }\n\n const { height, width, src, alt } = commentImage;\n\n const handleClickImage = useReflowClick(\n {\n reflowBehavior: () => {\n activeToCurrentPage([positionPrefix, ClickPosition.comment_image]);\n },\n defaultBehavior: () => {\n activeToCurrentPage([positionPrefix, ClickPosition.comment_image]);\n },\n clickEvent: () => ({\n current_position: positionPrefix + ClickPosition.comment_reply,\n page_click_id: comment.commentId,\n }),\n },\n [activeToCurrentPage, comment],\n );\n\n return (\n \n {alt}\n \n );\n};\n","var _path, _path2, _circle, _circle2, _circle3, _circle4, _path3;\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nimport * as React from \"react\";\nfunction SvgCloseComment(props) {\n return /*#__PURE__*/React.createElement(\"svg\", _extends({\n width: 120,\n height: 96,\n viewBox: \"0 0 120 96\",\n fill: \"none\",\n xmlns: \"http://www.w3.org/2000/svg\"\n }, props), _path || (_path = /*#__PURE__*/React.createElement(\"path\", {\n fill: \"#fff\",\n d: \"M0 0h120v96H0z\"\n })), _path2 || (_path2 = /*#__PURE__*/React.createElement(\"path\", {\n fillRule: \"evenodd\",\n clipRule: \"evenodd\",\n d: \"M37.88 35.75c8.789-10.011 18.368-12.205 26.58-10.916 8.323 1.306 15.34 6.212 18.759 10.536 1.033 1.317 2.501 4.306 3.426 8.132.918 3.799 1.257 8.248.204 12.476a.693.693 0 00.44.815c.384.139.76.297 1.127.475.535.26 1.201.011 1.345-.565 1.202-4.83.795-9.79-.2-13.906-.988-4.087-2.6-7.518-3.983-9.28l-.004-.005c-3.855-4.88-11.533-10.21-20.649-11.642-9.23-1.448-19.835 1.12-29.3 11.902l-.002.002c-3.792 4.336-5.586 8.752-6.018 13.012-.43 4.241.5 8.223 1.99 11.698 2.589 6.04 6.935 10.714 9.198 12.887.332.319.414.818.19 1.221-1.182 2.134-3.14 5.644-4.104 7.223-.113.186-.637 1.104.035 1.993.292.386.673.544.906.61.24.07.464.082.625.082.584 0 1.339-.192 2.044-.404 1.511-.454 3.632-1.274 5.8-2.169 4.032-1.663 8.417-3.663 9.85-4.322a.996.996 0 01.402-.09 71.855 71.855 0 007.58-.501c.532-.065.906-.545.888-1.081-.01-.268-.011-.533-.007-.796.012-.65-.548-1.187-1.194-1.107-2.315.285-4.846.455-7.612.489-.33.004-.684.072-1.025.229-.995.46-5.724 2.632-10.025 4.406-.576.238-1.14.467-1.684.682-.86.341-1.644-.58-1.191-1.389.77-1.374 1.48-2.66 1.9-3.42a2.526 2.526 0 00-.527-3.1c-1.703-1.536-6.585-6.31-9.29-12.624-1.346-3.139-2.13-6.603-1.764-10.214.364-3.593 1.876-7.435 5.29-11.34z\",\n fill: \"#BDBDBD\"\n })), _circle || (_circle = /*#__PURE__*/React.createElement(\"circle\", {\n cx: 49.5,\n cy: 49.5,\n r: 3.5,\n fill: \"#BDBDBD\"\n })), _circle2 || (_circle2 = /*#__PURE__*/React.createElement(\"circle\", {\n cx: 61.5,\n cy: 49.5,\n r: 3.5,\n fill: \"#BDBDBD\"\n })), _circle3 || (_circle3 = /*#__PURE__*/React.createElement(\"circle\", {\n cx: 73.5,\n cy: 49.5,\n r: 3.5,\n fill: \"#BDBDBD\"\n })), _circle4 || (_circle4 = /*#__PURE__*/React.createElement(\"circle\", {\n cx: 80,\n cy: 71,\n r: 11.5,\n stroke: \"#BDBDBD\",\n strokeWidth: 3\n })), _path3 || (_path3 = /*#__PURE__*/React.createElement(\"path\", {\n d: \"M72 63l16 16\",\n stroke: \"#BDBDBD\",\n strokeWidth: 3,\n strokeLinecap: \"round\"\n })));\n}\nexport default SvgCloseComment;","import { FC } from 'react';\nimport cls from 'classnames';\nimport { useTranslation } from 'react-i18next';\nimport CloseComment from './assets/close-comment.svg';\n\nimport './style.scss';\n\nexport const CommentNoPermission: FC = () => {\n const { t } = useTranslation();\n\n return (\n
\n

{t('comment')}

\n
\n
\n \n
\n

{t('postPrivacy_allowComments_offStatus_other')}

\n
\n
\n );\n};\n","import React, {\n Children,\n useImperativeHandle,\n ForwardRefRenderFunction,\n PropsWithChildren,\n useCallback,\n useEffect,\n useState,\n useRef,\n forwardRef,\n ForwardedRef,\n} from 'react';\nimport _range from 'lodash/range';\nimport _min from 'lodash/min';\nimport _max from 'lodash/max';\nimport cls from 'classnames';\n\nimport './style.scss';\n\nexport const parseToNumber = (val: string) => {\n return Number(val.replace('px', ''));\n};\n\ninterface MasonryProps extends PropsWithChildren {\n className?: string;\n columnCount: number;\n}\n\nexport interface MasonryRef {\n postLayout: (func: () => void) => void;\n}\n\nfunction useContainerRef() {\n const [ref, setCurrentRef] = useState();\n\n const setRef = useCallback((instance: T) => {\n if (instance) {\n setCurrentRef(instance);\n }\n }, []);\n\n return [ref, setRef] as [T, React.RefCallback];\n}\n\nexport const Masonry = forwardRef((props: MasonryProps, ref: ForwardedRef) => {\n const { children, columnCount, className } = props;\n const childrenArray = Children.toArray(children);\n const [container, setContainer] = useContainerRef();\n const [containerHeight, setContainerHeight] = useState(\n `calc(${Math.floor(childrenArray.length / columnCount + 1)} * var(--masonry-item-default-height))`,\n );\n const postLayoutQueue = useRef<(() => void)[]>([]);\n\n useImperativeHandle(ref, () => {\n return {\n postLayout: (func) => {\n postLayoutQueue.current.push(func);\n },\n };\n });\n\n const [heightList, setHeightList] = useState(_range(childrenArray.length).map(() => 0));\n\n const [orderList, setOrderList] = useState(_range(childrenArray.length).map((o) => (o % columnCount) + 1));\n\n const doLayout = useCallback(() => {\n if (!container) {\n return;\n }\n\n const columnHeights: number[] = new Array(columnCount).fill(0);\n const columnItems: number[] = new Array(columnCount).fill(0);\n const childOrderList = [];\n for (let i = 0; i < container.children.length; i++) {\n const child = container.children.item(i);\n if (!child) {\n return;\n }\n const min = _min(columnHeights);\n const minIndex = columnHeights.findIndex((v) => v === min);\n childOrderList.push(minIndex + 1);\n const style = window.getComputedStyle(child);\n columnHeights[minIndex] += parseToNumber(style.height);\n columnItems[minIndex] += 1;\n }\n\n setHeightList(columnHeights);\n setOrderList(childOrderList);\n\n setContainerHeight(\n `max(${columnHeights\n .map(\n (_, index) =>\n `${columnHeights[index]}px + ${Math.max(\n columnItems[index] - 1,\n 0,\n )} * var(--masonry-items-horizontal-interval) + 2 * var(--masonry-padding-vertical)`,\n )\n .join(',')})`,\n );\n\n if (postLayoutQueue.current.length) {\n postLayoutQueue.current.forEach((func) => func());\n postLayoutQueue.current = [];\n }\n }, [container, columnCount]);\n\n useEffect(() => {\n if (!container) {\n return;\n }\n\n requestAnimationFrame(() => {\n doLayout();\n });\n\n const observer = new ResizeObserver(doLayout);\n observer.observe(container);\n\n for (let i = 0; i < container.children.length; i++) {\n const child = container.children.item(i);\n if (child) {\n observer.observe(child);\n }\n }\n\n return () => {\n observer.disconnect();\n };\n }, [container, doLayout, children]);\n\n const maxHeight = _max(heightList) || 0;\n const maxHeightIndex = heightList.indexOf(maxHeight) - 1;\n const maxHeightCount = orderList.filter((item) => item === maxHeightIndex + 1).length;\n\n return (\n \n {childrenArray.map((child, index) => (\n r === orderList[index]) === index,\n bottom: orderList.lastIndexOf(orderList[index]) === index,\n })}\n style={{\n order: orderList[index] || columnCount + 1,\n marginBottom:\n orderList.lastIndexOf(orderList[index]) === index\n ? `calc(${\n (maxHeight || 0) - heightList[orderList[index] - 1]\n }px + var(--masonry-padding-horizontal) * (${\n orderList.filter((item) => item === index + 1).length - maxHeightCount\n }))`\n : 0,\n }}\n >\n {child}\n \n ))}\n \n );\n});\n","import ChevronDownIcon from '@lemon8/design/lib/icons/icon_assets/chevron_down_fill.svg';\nimport { Loading } from '~/components/loading';\nimport { useTranslation } from 'react-i18next';\nimport cls from 'classnames';\nimport { ClickPosition } from '~/utils/click-position';\nimport { useScopedAtomValue } from '@lemon8/web-app-shared/ssr';\nimport { $CurrentPageModule } from '~/models/current-page-module';\nimport { $CurrentPositionPrefix } from '~/models/current-position-prefix';\n\nimport './style.scss';\n\ninterface SeeMoreProps {\n loading?: boolean;\n onClickSeeMore?: () => void;\n}\n\nexport const SeeMoreBanner = (props: SeeMoreProps): JSX.Element => {\n const { onClickSeeMore, loading = false } = props;\n const { t } = useTranslation();\n const currentPageModule = useScopedAtomValue($CurrentPageModule);\n const prefix = useScopedAtomValue($CurrentPositionPrefix);\n\n const onClick = () => {\n window.Tea('wap_click', {\n current_page_module: currentPageModule,\n current_position: prefix + ClickPosition.see_more_button,\n });\n\n onClickSeeMore?.();\n };\n\n return (\n
\n {loading ? (\n
\n \n
\n ) : (\n <>\n
\n
\n
\n
\n \n
\n
\n \n
\n
\n
{t('see_more')}
\n
\n \n )}\n
\n );\n};\n","export const pxToRem = (px: number): string => {\n return `${(px * 16) / 375}rem`;\n};\n","import { CSSProperties, FC, useMemo } from 'react';\nimport cls from 'classnames';\nimport { pxToRem } from '~/utils/px-to-rem';\nimport { IUserAuthInfo } from 'shared/models/user-auth-info';\n\nimport './index.rem.scss';\n\ninterface UserAuthIconProps {\n authInfo: IUserAuthInfo;\n width?: number | string | undefined;\n height?: number | string | undefined;\n marginLeft?: number | string | undefined;\n /** 用户认证icon显示为白色,视频详情页icon颜色为白色 */\n light?: boolean;\n}\n\nconst DEFAULT_WIDTH = pxToRem(20);\nconst DEFAULT_HEIGHT = pxToRem(20);\nconst DEFAULT_MARGIN_LEFT = pxToRem(4);\n\nexport const UserAuthIcon: FC = (props) => {\n const {\n width = DEFAULT_WIDTH,\n height = DEFAULT_HEIGHT,\n marginLeft = DEFAULT_MARGIN_LEFT,\n light = false,\n authInfo,\n } = props;\n\n const style: CSSProperties = useMemo(\n () => ({\n width: typeof width === 'number' ? pxToRem(width) : width,\n height: typeof height === 'number' ? pxToRem(height) : height,\n marginLeft: typeof marginLeft === 'number' ? pxToRem(marginLeft) : marginLeft,\n }),\n [width, height, marginLeft],\n );\n\n if (!authInfo.showAuthSymbol) {\n return null;\n }\n\n return (\n \n );\n};\n","import { atom } from 'jotai';\nimport { $PageLevelTraffic } from 'shared/atoms';\nimport { EPageType, IArticlePageTraffic, IVideoPageTraffic } from 'shared/models';\nimport { pendingQueue } from '~/utils/pending-queue';\n\nexport const $CurrentArticleId = atom((get) => {\n const traffic = get($PageLevelTraffic);\n const { pageType } = traffic;\n\n if (![EPageType.article, EPageType.video].includes(pageType)) {\n console.log('>>>>>>>', 'get current article', 'return promise');\n // eslint-disable-next-line @typescript-eslint/no-throw-literal\n throw new Promise((resolve) => pendingQueue.push(resolve));\n }\n\n const articleTraffic = traffic as IArticlePageTraffic | IVideoPageTraffic;\n\n return articleTraffic.groupId;\n});\n","import { atom } from 'jotai';\nimport { $ArticleDetail } from 'shared/atoms';\nimport { $CurrentArticleId } from '@article/shared/atoms/current-article-id';\nimport { ArticleDetailUtil, TArticleDetail } from 'shared/models';\n\nexport const $CurrentArticle = atom((get) => {\n const currentArticleId = get($CurrentArticleId);\n return get($ArticleDetail(currentArticleId));\n});\n\n/**\n * get null when current article is not available\n *\n * e.g. used for short circuit logic.\n */\nexport const $CurrentAvailableArticleOrNull = atom((get) => {\n const article = get($CurrentArticle);\n return ArticleDetailUtil.isArticleAvailable(article) ? article : null;\n});\n\n/**\n * force cast current article to TArticleDetail\n *\n * use this only when you are sure that current article is available to show\n */\nexport const $CurrentArticleAsAvailable = atom((get) => {\n return get($CurrentArticle) as TArticleDetail;\n});\n","import { FC } from 'react';\nimport { Link } from '@remix-run/react';\nimport { useActiveToCurrentArticle } from '@article/shared/utils/use-active-to-current-article';\nimport useReflowClick from '~/utils/use-reflow-click';\nimport { ClickPosition } from '~/utils/click-position';\nimport { useSEOHref } from '~/utils/build-seo-url';\n\nimport './style.scss';\n\ninterface ILegacyHashtagItemProps {\n hashtag: {\n id: string;\n name: string;\n };\n}\n\nexport const LegacyHashtagItem: FC = (props) => {\n const { hashtag } = props;\n const activeToCurrentArticle = useActiveToCurrentArticle();\n\n const to = useSEOHref(`/topic/${hashtag.id}`);\n\n const handleHashtagClick = useReflowClick(\n {\n clickEvent: () => ({\n current_position: ClickPosition.main_hashtag,\n page_click_id: hashtag.id,\n }),\n reflowBehavior: () => {\n activeToCurrentArticle(ClickPosition.main_hashtag, hashtag.id);\n },\n },\n [activeToCurrentArticle],\n );\n\n return (\n \n #{hashtag.name}\n \n );\n};\n","import { useAtomValue } from 'jotai';\nimport { $CurrentArticle } from '@article/shared/atoms/current-article';\nimport { ArticleDetailUtil, EArticleClass } from 'shared/models';\nimport { ClickPosition } from '~/utils/click-position';\nimport { usePageActive } from '~/utils/active/use-page-active';\nimport { useCallback } from 'react';\n\nexport const useActiveToCurrentArticle = (): ((position: ClickPosition, id?: string) => void) => {\n const article = useAtomValue($CurrentArticle);\n\n const active = usePageActive();\n\n return useCallback((position, id) => {\n const articleAvailable = ArticleDetailUtil.isArticleAvailable(article);\n\n if (!articleAvailable) {\n return active({\n schemaOption: {\n pageType: 'feed',\n categoryId: 0,\n },\n ampExtra: {\n enter_position: position,\n enter_page_click_id: id || null,\n },\n });\n }\n\n const {\n articleClass,\n groupId,\n author: { userId },\n } = article;\n\n active({\n schemaOption: {\n pageType: articleClass === EArticleClass.VIDEO ? 'video' : 'article',\n groupId,\n authorId: userId,\n },\n ampExtra: {\n enter_position: position,\n enter_page_click_id: id || null,\n },\n });\n }, []);\n};\n","import { ClickPosition, ClickPositionPrefix } from '~/utils/click-position';\nimport { usePageActive } from '~/utils/active/use-page-active';\nimport { useCallback } from 'react';\nimport { useAtomValue } from 'jotai';\nimport { $PageLevelTraffic } from 'shared/atoms';\nimport { DeepLinkBuildingProps } from '~/utils/active/schema';\nimport { EPageType, PageLevelTraffic } from 'shared/models';\n\nconst trafficToDeepLinkBuildingProps = (traffic: PageLevelTraffic): DeepLinkBuildingProps => {\n // TODO 404 到 feed\n if (traffic.pageType === EPageType.article) {\n // article not found - active to feed\n if (!traffic.groupId || !traffic.mediaId) {\n return {\n pageType: 'feed',\n categoryId: 0,\n };\n }\n\n return {\n pageType: 'article',\n groupId: traffic.groupId,\n authorId: traffic.mediaId,\n };\n }\n\n if (traffic.pageType === EPageType.video) {\n // video not found - active to feed\n if (!traffic.groupId || !traffic.mediaId) {\n return {\n pageType: 'feed',\n categoryId: 0,\n };\n }\n\n return {\n pageType: 'video',\n groupId: traffic.groupId,\n authorId: traffic.mediaId,\n };\n }\n\n if (traffic.pageType === EPageType.poi) {\n return {\n pageType: 'poi',\n poiId: traffic.poiId,\n };\n }\n\n if (traffic.pageType === EPageType.hashtag) {\n return {\n pageType: 'hashtag',\n hashtagId: traffic.hashtagId,\n };\n }\n\n if (\n traffic.pageType === EPageType.user ||\n traffic.pageType === EPageType.user_follow ||\n traffic.pageType === EPageType.user_topic\n ) {\n return {\n pageType: 'user',\n userId: traffic.userId,\n };\n }\n\n if (\n traffic.pageType === EPageType.discover ||\n traffic.pageType === EPageType.experience ||\n traffic.pageType === EPageType.experience_article\n ) {\n return {\n pageType: 'search',\n query: traffic.standardKeyword,\n };\n }\n\n return {\n pageType: 'feed',\n categoryId: 0,\n };\n};\n\nexport const useActiveToCurrentPage = (): ((\n position: ClickPosition | [ClickPositionPrefix, ClickPosition],\n id?: string,\n) => void) => {\n const active = usePageActive();\n const traffic = useAtomValue($PageLevelTraffic);\n\n return useCallback(\n (position, id) => {\n const enterPosition = Array.isArray(position) ? position[0] + position[1] : position;\n active({\n schemaOption: trafficToDeepLinkBuildingProps(traffic),\n ampExtra: {\n enter_position: enterPosition,\n enter_page_click_id: id || null,\n },\n });\n },\n [traffic],\n );\n};\n","export class PendingQueue {\n private _tasks: (() => void)[] = [];\n\n constructor() {\n if (__BUILD_TARGET__ === 'client') {\n setInterval(this._doInterval, 20);\n }\n }\n\n public push(task: (...args: unknown[]) => void) {\n this._tasks.push(task);\n }\n\n private _doInterval = (): void => {\n if (this._tasks.length) {\n console.log('pending tasks found, total count: %d', this._tasks.length);\n this._tasks.forEach((task) => task());\n this._tasks = [];\n }\n };\n}\n\nexport const pendingQueue = new PendingQueue();\n","export const deleteOutdatedKeys = (keyPrefix: string) => {\n const len = localStorage.length;\n for (let i = 0; i < len; i++) {\n const keyName = localStorage.key(i) || '';\n if (keyName.includes(keyPrefix)) {\n localStorage.removeItem(keyName);\n continue;\n }\n }\n};\n\nexport const setLocalStorageStatus = (keyPrefix: string, storageKey: string, storageValue: string) => {\n deleteOutdatedKeys(keyPrefix);\n window.localStorage.setItem(storageKey, storageValue);\n};\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.astToElement = exports.contentToAst = void 0;\nconst react_1 = require(\"react\");\nconst htmlparser2_1 = require(\"htmlparser2\");\nconst contentToAst = (content, componentBuilderList) => {\n const root = {\n constructor: 'article',\n props: {},\n children: [],\n };\n const stack = [root];\n const parser = new htmlparser2_1.Parser({\n onopentag: (name, attr) => {\n const child = {\n constructor: () => null,\n props: {},\n children: [],\n };\n // custom components\n for (const builder of componentBuilderList) {\n const res = builder(name, attr);\n if (res) {\n child.constructor = res.constructor;\n child.props = res.props;\n break;\n }\n }\n stack.at(-1)?.children?.push(child);\n stack.push(child);\n },\n ontext: (data) => {\n stack.at(-1)?.children?.push(data);\n },\n onclosetag: () => {\n stack.pop();\n },\n });\n parser.parseComplete(content);\n return root;\n};\nexports.contentToAst = contentToAst;\nconst astToElement = (ast) => {\n if (ast.children.length === 0) {\n if (typeof ast.constructor === 'string') {\n return (0, react_1.createElement)(ast.constructor, ast.props);\n }\n return ast.constructor(ast.props);\n }\n const children = ast.children.map((child) => {\n return typeof child === 'string' ? child : (0, exports.astToElement)(child);\n });\n if (typeof ast.constructor === 'string') {\n return (0, react_1.createElement)(ast.constructor, ast.props, ...children);\n }\n return ast.constructor({ ...ast.props, children });\n};\nexports.astToElement = astToElement;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ArticleAnchorComponentBuilder = void 0;\nconst jsx_runtime_1 = require(\"react/jsx-runtime\");\nconst react_1 = require(\"react\");\nconst __1 = require(\"..\");\nconst ArticleAnchor = (props) => {\n const { children, href } = props;\n const { onLinkClick } = (0, react_1.useContext)(__1.ArticleCtx);\n const url = (0, react_1.useMemo)(() => {\n const pattern = /^(http|https):\\/\\/[^\\s]+$/;\n /**\n * find last link\n * @see https://code.byted.org/i18n_fe/n_mono/blob/master/features/article-transcode/component/archor/index.tsx\n */\n return (react_1.Children.toArray(children) || [])\n .filter((item) => typeof item === 'string')\n .reduce((pre, cur) => (typeof cur === 'string' && pattern.test(cur.trim()) ? cur : pre), '');\n }, [href, children]);\n const rel = (0, react_1.useMemo)(() => {\n try {\n const u = new URL(url);\n return u.host.endsWith('.lemon8-app.com') ? void 0 : 'nofollow';\n }\n catch (_) {\n return 'nofollow';\n }\n }, [url]);\n const handleClick = (0, react_1.useCallback)((e) => {\n onLinkClick(e, {\n link: url,\n });\n }, [url]);\n return ((0, jsx_runtime_1.jsx)(\"a\", { target: \"_blank\", rel: rel, href: url, onClick: handleClick, children: children }));\n};\nconst ArticleAnchorComponentBuilder = (tag, attr) => {\n if (tag === 'a') {\n return {\n constructor: ArticleAnchor,\n props: {\n href: attr['href'],\n },\n };\n }\n return null;\n};\nexports.ArticleAnchorComponentBuilder = ArticleAnchorComponentBuilder;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ArticleEntityWordComponentBuilder = void 0;\nconst jsx_runtime_1 = require(\"react/jsx-runtime\");\nconst react_1 = require(\"react\");\nconst react_2 = require(\"@remix-run/react\");\nconst __1 = require(\"..\");\nconst ArticleEntityWord = (props) => {\n const { buildHref, onEntityWordClick } = (0, react_1.useContext)(__1.ArticleCtx);\n const { type, name, id } = props;\n const href = (0, react_1.useMemo)(() => buildHref(`/discover/${name}`), [buildHref, name]);\n const handleClick = (0, react_1.useCallback)((e) => {\n onEntityWordClick(e, {\n type,\n name,\n id,\n });\n }, [type, name, id]);\n return ((0, jsx_runtime_1.jsxs)(react_2.Link, { to: href, className: \"l8-entity-word\", onClick: handleClick, children: [(0, jsx_runtime_1.jsx)(\"span\", { children: name }), (0, jsx_runtime_1.jsx)(\"i\", {})] }));\n};\nconst ArticleEntityWordComponentBuilder = (tag, attr) => {\n if (tag === 'a' && attr['class']?.includes('l8-entity-word')) {\n return {\n constructor: ArticleEntityWord,\n props: {\n type: attr['data-type'],\n name: attr['data-name'],\n id: attr['data-id'],\n },\n };\n }\n return null;\n};\nexports.ArticleEntityWordComponentBuilder = ArticleEntityWordComponentBuilder;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ArticleHashtagComponentBuilder = void 0;\nconst jsx_runtime_1 = require(\"react/jsx-runtime\");\nconst react_1 = require(\"react\");\nconst __1 = require(\"..\");\nconst react_2 = require(\"@remix-run/react\");\nconst ArticleHashtag = (props) => {\n const { buildHref, onHashtagClick } = (0, react_1.useContext)(__1.ArticleCtx);\n const { id, children } = props;\n const href = (0, react_1.useMemo)(() => buildHref(`/topic/${id}`), []);\n const handleClick = (0, react_1.useCallback)((e) => {\n onHashtagClick(e, { id });\n }, [onHashtagClick, id]);\n return ((0, jsx_runtime_1.jsx)(react_2.Link, { className: \"l8editor-forum\", onClick: handleClick, to: href, children: children }));\n};\nconst ArticleHashtagComponentBuilder = (tag, attr) => {\n if (tag === 'a' && attr['class']?.includes('l8editor-forum')) {\n return {\n constructor: ArticleHashtag,\n props: {\n type: attr['data-type'],\n name: attr['data-name'],\n id: attr['data-id'],\n },\n };\n }\n return null;\n};\nexports.ArticleHashtagComponentBuilder = ArticleHashtagComponentBuilder;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.HTMLComponentBuilder = void 0;\nconst allowedTag = ['p', 'br'];\nconst attrMapping = [['class', 'className']];\nconst HTMLComponentBuilder = (tag, attr) => {\n if (allowedTag.includes(tag)) {\n const props = {};\n attrMapping.forEach(([prev, next]) => {\n const old = attr[prev];\n if (old) {\n props[next] = old;\n }\n });\n return {\n constructor: tag,\n props,\n };\n }\n return {\n constructor: () => null,\n props: {},\n };\n};\nexports.HTMLComponentBuilder = HTMLComponentBuilder;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.BuiltinComponentBuilderList = void 0;\nconst html_1 = require(\"./html\");\nconst entity_word_1 = require(\"./entity-word\");\nconst hashtag_1 = require(\"./hashtag\");\nconst mentioned_user_1 = require(\"./mentioned-user\");\nconst poi_1 = require(\"./poi\");\nconst anchor_1 = require(\"./anchor\");\nexports.BuiltinComponentBuilderList = [\n hashtag_1.ArticleHashtagComponentBuilder,\n entity_word_1.ArticleEntityWordComponentBuilder,\n mentioned_user_1.ArticleMentionedUserComponentBuilder,\n poi_1.ArticlePoiComponentBuilder,\n anchor_1.ArticleAnchorComponentBuilder,\n html_1.HTMLComponentBuilder,\n];\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ArticleMentionedUserComponentBuilder = void 0;\nconst jsx_runtime_1 = require(\"react/jsx-runtime\");\nconst react_1 = require(\"react\");\nconst __1 = require(\"..\");\nconst react_2 = require(\"@remix-run/react\");\nconst ArticleMentionedUser = (props) => {\n const { buildHref, onMentionedUserClick } = (0, react_1.useContext)(__1.ArticleCtx);\n const { id, name } = props;\n const href = (0, react_1.useMemo)(() => buildHref(`/user/${id}/share`), []);\n const handleClick = (0, react_1.useCallback)((e) => {\n onMentionedUserClick(e, { id });\n }, []);\n return ((0, jsx_runtime_1.jsx)(react_2.Link, { className: \"l8editor-mention\", to: href, onClick: handleClick, children: name }));\n};\nconst ArticleMentionedUserComponentBuilder = (tag, attr) => {\n if (tag === 'a' && attr['class']?.includes('l8editor-mention')) {\n return {\n constructor: ArticleMentionedUser,\n props: {\n type: attr['data-type'],\n name: attr['data-name'],\n id: attr['data-id'],\n },\n };\n }\n return null;\n};\nexports.ArticleMentionedUserComponentBuilder = ArticleMentionedUserComponentBuilder;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.ArticlePoiComponentBuilder = void 0;\nconst jsx_runtime_1 = require(\"react/jsx-runtime\");\nconst react_1 = require(\"react\");\nconst __1 = require(\"..\");\nconst react_2 = require(\"@remix-run/react\");\nconst ArticlePoi = (props) => {\n const { buildHref, onPoiClick } = (0, react_1.useContext)(__1.ArticleCtx);\n const { id, name } = props;\n const href = (0, react_1.useMemo)(() => buildHref(`/poi/${id}`), [buildHref, id]);\n const handleClick = (0, react_1.useCallback)((e) => {\n onPoiClick(e, { id });\n }, []);\n return ((0, jsx_runtime_1.jsxs)(react_2.Link, { className: \"l8editor-poi\", to: href, onClick: handleClick, children: [(0, jsx_runtime_1.jsx)(\"i\", {}), (0, jsx_runtime_1.jsx)(\"span\", { children: name })] }));\n};\nconst ArticlePoiComponentBuilder = (tag, attr) => {\n if (tag === 'a' && attr['class']?.includes('l8editor-poi')) {\n return {\n constructor: ArticlePoi,\n props: {\n name: attr['data-name'],\n id: attr['data-id'],\n },\n };\n }\n return null;\n};\nexports.ArticlePoiComponentBuilder = ArticlePoiComponentBuilder;\n","\"use strict\";\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.Article = exports.ArticleCtx = void 0;\nconst jsx_runtime_1 = require(\"react/jsx-runtime\");\nconst react_1 = require(\"react\");\nconst ast_1 = require(\"./ast\");\nconst components_1 = require(\"./components\");\nexports.ArticleCtx = (0, react_1.createContext)({});\nconst Article = (props) => {\n const { content } = props;\n const ast = (0, react_1.useMemo)(() => {\n return (0, ast_1.contentToAst)(content, components_1.BuiltinComponentBuilderList);\n }, [content]);\n const Inner = (0, react_1.useCallback)(() => {\n return (0, jsx_runtime_1.jsx)(jsx_runtime_1.Fragment, { children: (0, ast_1.astToElement)(ast) });\n }, [ast]);\n return ((0, jsx_runtime_1.jsx)(exports.ArticleCtx.Provider, { value: props, children: (0, jsx_runtime_1.jsx)(Inner, {}) }));\n};\nexports.Article = Article;\n"],"sourceRoot":""}