{"version":3,"sources":["webpack://@lemon8/web-seo/./client/components/campaign-carousel/item/index.tsx","webpack://@lemon8/web-seo/./client/components/campaign-carousel/index.tsx","webpack://@lemon8/web-seo/./client/components/dot-indicator/use-dots-type.ts","webpack://@lemon8/web-seo/./client/components/dot-indicator/index.tsx","webpack://@lemon8/web-seo/./client/components/section-title/index.tsx","webpack://@lemon8/web-seo/./client/components/see-more/index.tsx","webpack://@lemon8/web-seo/./client/components/step-scroll-ui/index.tsx","webpack://@lemon8/web-seo/./client/components/step-scroll/index.tsx","webpack://@lemon8/web-seo/./client/components/topic-card/topic-article-card/index.tsx","webpack://@lemon8/web-seo/./client/components/topic-card/index.tsx","webpack://@lemon8/web-seo/./client/models/current-module-rank.ts","webpack://@lemon8/web-seo/./shared/utils/format/kep-formatter.ts"],"names":["CampaignBannerItem","props","campaign","title","bannerUrl","campaignId","active","usePageActive","isBanner","handleClick","useReflowClick","clickEvent","_","bundle","_objectSpread","current_position","ClickPosition","defaultBehavior","schemaOption","pageType","categoryId","ampExtra","enter_position","enter_page_click_id","jsxs","className","onClick","children","jsx","src","alt","ArrowIcon","CampaignCarousel","campaigns","useAtomValue","$CampaignBanner","$indicator","useRef","$swiper","handleIndicatorIndexChange","useCallback","target","current","slideToLoop","handleSwiperSlides","swiper","_a","changeTo","realIndex","Swiper","slidesPerView","loop","autoplay","delay","disableOnInteraction","modules","Autoplay","onSwiper","s","onSlideChange","map","SwiperSlide","length","DotIndicator","ref","count","onChange","IndicatorDotSize","useDotsType","dotsTypeList","_range","positions","flatMap","shift","filter","i","slice","forEach","pos","center","_sum","Math","abs","forwardRef","currentIndex","setCurrentIndex","useState","indicatorDotSizes","useIndicatorDotSizes","handleDotClick","index","useImperativeHandle","cls","selected","SectionTitleWithViewMore","onClickViewMore","onShowViewMore","emojiStr","currentPageModule","useScopedAtomValue","$CurrentPageModule","prefix","$CurrentPositionPrefix","t","useTranslation","window","Tea","current_page_module","is_cta","sectionObservedRef","useViewTracking","onView","id","Boolean","ChevronRightIcon","SectionTitle","viewMore","isMobile","$UserAgent","SeeMore","onClickSeeMore","loading","Loading","variant","Fragment","ChevronDownIcon","StepScrollUI","left","right","onClickRight","onClickLeft","isPC","show","LeftIcon","RightIcon","StepScroll","scrollList","childWidth","showLeft","setShowLeft","showRight","setShowRight","useEffect","item","clientWidth","scrollLeft","scrollWidth","handleScroll","e","div","handleActionClick","type","event","preventDefault","atom","scrollBy","Children","onScroll","TopicArticleCard","_ref","topic","article","topicId","canonicalUri","articleClass","articleLikes","shortContent","largeImage","groupId","region","$Locale","formatNum","useNumFormatter","isMobileUser","$IsMobileUser","currentModuleRank","$CurrentModuleRank","hitKepHashtagPosForwardExp","$HitKepHashtagPosForwardExp","articleHref","useMemo","concat","handleArticleClick","page_click_id","inserted_position","reflowBehavior","ArticleClass","stopPropagation","hashtagArticleCardRef","Link","to","draggable","Image","url","replace","HeartIcon","VideoIcon","MIN_HASHTAG_ARTICLE_COUNT","MAX_HASHTAG_ARTICLE_COUNT","TopicCard","$PageLevelTraffic","isKEPPage","EPageType","isOnlyWord","topicHref","kepQueryFormat","topicName","isHashtagWithArticleCard","articles","currentPosition","handleHashtagClick","query","hashtagId","description","num","viewCount","hashtagRef","NumberIcon","MODULE_NOT_RANK","specialRegex","emojiRegex","char","toLowerCase","trim"],"mappings":"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","file":"602-351fb72bd19f62427193.js","sourcesContent":["import ArrowIcon from 'icon/chevron_right.svg';\nimport { CampaignBanner } from 'shared/atoms/common/campaign-banner';\nimport { usePageActive } from '~/utils/active/use-page-active';\nimport { ClickPosition } from '~/utils/click-position';\nimport useReflowClick from '~/utils/use-reflow-click';\n\nimport './style.scss';\n\ninterface CampaignBannerItemProps {\n campaign: CampaignBanner;\n}\n\nexport const CampaignBannerItem = (props: CampaignBannerItemProps): JSX.Element => {\n const { campaign } = props;\n const { title, bannerUrl, campaignId } = campaign;\n const active = usePageActive({ isBanner: true });\n\n const handleClick = useReflowClick(\n {\n clickEvent: (_, bundle) => ({\n ...bundle,\n current_position: ClickPosition.activity_banner,\n }),\n defaultBehavior: () => {\n active({\n schemaOption: {\n pageType: 'feed',\n categoryId: 0,\n },\n ampExtra: {\n enter_position: ClickPosition.activity_banner,\n enter_page_click_id: campaignId,\n },\n });\n },\n },\n [active],\n );\n\n return (\n
\n
\n {title}\n
\n
\n

{title}

\n \n
\n
\n );\n};\n","import { Swiper, SwiperClass, SwiperSlide } from 'swiper/react';\nimport { Autoplay } from 'swiper/modules';\nimport { CampaignBannerItem } from './item';\nimport { useAtomValue } from 'jotai';\nimport { $CampaignBanner } from 'shared/atoms/common/campaign-banner';\nimport { DotIndicator, DotIndicatorRef } from '~/components/dot-indicator';\nimport { useCallback, useRef } from 'react';\n\nimport './style.scss';\n\nexport const CampaignCarousel = (): JSX.Element => {\n const campaigns = useAtomValue($CampaignBanner);\n\n const $indicator = useRef(null);\n const $swiper = useRef();\n\n const handleIndicatorIndexChange = useCallback((target: number) => {\n if (!$swiper.current) {\n return;\n }\n\n $swiper.current.slideToLoop(target);\n }, []);\n\n const handleSwiperSlides = useCallback((swiper: SwiperClass) => {\n $indicator.current?.changeTo(swiper.realIndex);\n }, []);\n\n return (\n
\n ($swiper.current = s)}\n onSlideChange={handleSwiperSlides}\n >\n {campaigns.map((campaign) => (\n \n \n \n ))}\n \n {campaigns.length > 1 && (\n \n )}\n
\n );\n};\n","import _range from 'lodash/range';\nimport _sum from 'lodash/sum';\n\n/**\n * 圆点的类型\n * value 关联在 css 中\n */\nconst enum IndicatorDotSize {\n Big = 'big',\n Middle = 'middle',\n Small = 'small',\n Gone = 'gone',\n}\n\n/**\n * 计算要展示的圆点的类别\n */\nexport default function useDotsType(count: number, current: number): IndicatorDotSize[] {\n const dotsTypeList = _range(count).map((_) => IndicatorDotSize.Gone);\n\n // 计算所有需要展示的点位\n // 按照从中心到两边的顺序排列\n const positions = _range(5)\n .flatMap((shift) => {\n if (shift === 0) {\n return current;\n }\n return [current + shift, current - shift].filter((i) => i > -1 && i < count) as number[];\n })\n .slice(0, 5);\n\n // 标记大点\n positions.slice(0, 3).forEach((pos) => (dotsTypeList[pos] = IndicatorDotSize.Big));\n\n // 计算大点中心位置\n const center = _sum(positions.slice(0, 3)) / 3;\n\n // 标记中点和小点\n positions.slice(3, 5).forEach((pos) => {\n dotsTypeList[pos] = Math.abs(pos - center) < 3 ? IndicatorDotSize.Middle : IndicatorDotSize.Small;\n });\n\n return dotsTypeList;\n}\n","import { forwardRef, Ref, useImperativeHandle, useState } from 'react';\nimport useIndicatorDotSizes from './use-dots-type';\nimport cls from 'classnames';\nimport _range from 'lodash/range';\n\nimport './style.scss';\n\nexport interface DotIndicatorProps {\n className?: string;\n count: number;\n onChange: (target: number) => void;\n}\n\nexport interface DotIndicatorRef {\n changeTo: (target: number) => void;\n}\n\nexport const DotIndicator = forwardRef((props: DotIndicatorProps, ref: Ref) => {\n const { className, count, onChange } = props;\n const [currentIndex, setCurrentIndex] = useState(0);\n const indicatorDotSizes = useIndicatorDotSizes(count, currentIndex);\n\n const handleDotClick =\n (index: number): (() => void) =>\n () => {\n setCurrentIndex(index);\n onChange(index);\n };\n\n useImperativeHandle(ref, () => {\n return {\n changeTo: setCurrentIndex,\n };\n });\n\n return (\n
\n {_range(count).map((index) => (\n \n ))}\n
\n );\n});\n","import { ReactElement, useCallback } from 'react';\nimport { useAtomValue } from 'jotai';\nimport { useTranslation } from 'react-i18next';\nimport { $UserAgent } from '@lemon8/web-app-shared/atom';\nimport { useScopedAtomValue } from '@lemon8/web-app-shared/ssr';\nimport { useViewTracking } from '~/utils/use-view-tracking';\nimport { $CurrentPageModule } from '~/models/current-page-module';\nimport { $CurrentPositionPrefix } from '~/models/current-position-prefix';\nimport ChevronRightIcon from '@lemon8/design/lib/icons/icon_assets/chevron_right_fill.svg';\nimport { ClickPosition } from '~/utils/click-position';\n\nimport './style.scss';\n\ninterface SectionTitleProps {\n title: string | ReactElement;\n viewMore?: boolean;\n onClickViewMore?: () => void;\n onShowViewMore?: () => void;\n /** 在title前面显示 */\n emojiStr?: string;\n}\n\n/**\n * 通用的小标题,右侧有view more按钮\n */\nfunction SectionTitleWithViewMore(props: SectionTitleProps): JSX.Element {\n const { title, onClickViewMore, onShowViewMore, emojiStr = '' } = props;\n\n const currentPageModule = useScopedAtomValue($CurrentPageModule);\n const prefix = useScopedAtomValue($CurrentPositionPrefix);\n\n const { t } = useTranslation();\n\n const onClick = (): void => {\n window.Tea('wap_click', {\n current_page_module: currentPageModule,\n current_position: prefix + ClickPosition.view_more_button,\n is_cta: 1,\n });\n\n onClickViewMore?.();\n };\n\n const sectionObservedRef = useViewTracking({\n onView: useCallback(() => {\n window.Tea('wap_cta_show', {\n current_page_module: currentPageModule,\n current_position: prefix + ClickPosition.view_more_button,\n });\n\n onShowViewMore?.();\n }, []),\n });\n\n return (\n
\n

\n {Boolean(emojiStr) && {emojiStr}}\n {title}\n

\n
\n {t('seo_recommended_viewMore')}\n \n
\n
\n );\n}\n\n/**\n * 通用的小标题\n */\nexport default function SectionTitle(props: SectionTitleProps): JSX.Element {\n const { title, viewMore = false, emojiStr = '' } = props;\n\n const { isMobile } = useAtomValue($UserAgent);\n\n // pc端默认不展示view more按钮\n if (!viewMore || !isMobile) {\n return (\n

\n {Boolean(emojiStr) && {emojiStr}}\n {title}\n

\n );\n }\n\n return ;\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 SeeMore = (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 {t('see_more')}\n \n \n )}\n
\n );\n};\n","import { FC, PropsWithChildren, SyntheticEvent } from 'react';\nimport cls from 'classnames';\nimport LeftIcon from 'icon/chevron_left.svg';\nimport RightIcon from 'icon/chevron_right.svg';\nimport { useAtomValue } from 'jotai/index';\nimport { $UserAgent } from '@lemon8/web-app-shared/atom';\n\nimport './style.scss';\n\ntype TStepScrollUI = PropsWithChildren<{\n className?: string;\n left: boolean;\n right: boolean;\n onClickLeft: (event: SyntheticEvent) => void;\n onClickRight: (event: SyntheticEvent) => void;\n}>;\n\nexport const StepScrollUI: FC = (props) => {\n const { children, className, left, right, onClickRight, onClickLeft } = props;\n const { isMobile } = useAtomValue($UserAgent);\n\n const isPC = !isMobile;\n\n return (\n
\n {children}\n {isPC && (\n
\n
\n \n
\n
\n \n
\n
\n )}\n
\n );\n};\n","import { Children, FC, ReactNode, SyntheticEvent, useCallback, useEffect, useRef, useState } from 'react';\nimport { useAtomValue } from 'jotai';\nimport { $UserAgent } from '@lemon8/web-app-shared/atom';\nimport { StepScrollUI } from '~/components/step-scroll-ui';\n\nimport './style.scss';\n\ninterface StepScrollProps {\n className?: string;\n children?: ReactNode;\n}\n\nexport const StepScroll: FC = (props) => {\n const { children, className } = props;\n const { isMobile } = useAtomValue($UserAgent);\n\n const isPC = !isMobile;\n\n const scrollList = useRef(null);\n const childWidth = useRef(0);\n\n const [showLeft, setShowLeft] = useState(false);\n const [showRight, setShowRight] = useState(false);\n\n // children 变化时,计算第一个child的宽度作为滚动步幅\n useEffect(() => {\n if (!scrollList.current) {\n return;\n }\n const item = scrollList.current.children.item(0);\n if (item) {\n childWidth.current = item.clientWidth;\n }\n\n const { scrollLeft, scrollWidth, clientWidth } = scrollList.current;\n setShowRight(scrollLeft < scrollWidth - clientWidth);\n }, [scrollList.current, children]);\n\n // 滚动时计算是否需要展示左右进度按钮\n const handleScroll = useCallback((e: SyntheticEvent) => {\n const div = e.target as HTMLDivElement;\n const { scrollLeft, scrollWidth, clientWidth } = div;\n\n setShowLeft(scrollLeft > 0);\n setShowRight(scrollLeft < scrollWidth - clientWidth);\n }, []);\n\n const handleActionClick = useCallback(\n (type: 'left' | 'right') => (event: SyntheticEvent) => {\n event.preventDefault();\n const atom = type === 'left' ? -1 : 1;\n scrollList.current?.scrollBy({ left: atom * childWidth.current });\n },\n [],\n );\n\n if (Children.toArray(children).length === 0) {\n return null;\n }\n\n return (\n \n
\n {children}\n
\n \n );\n};\n","import { ArticleClass, Topic, TopicArticle } from 'shared/models/legacy';\nimport { Link } from '@remix-run/react';\nimport { useCallback, FC, useMemo, SyntheticEvent } from 'react';\nimport { useTranslation } from 'react-i18next';\nimport { Image } from '~/components/image';\nimport { useNumFormatter } from '~/utils/format/num-formatter';\nimport VideoIcon from 'icon/play_fill.svg';\nimport HeartIcon from 'icon/heart.svg';\nimport { useAtomValue } from 'jotai';\nimport { $Locale } from '@lemon8/web-app-shared/atom';\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 { $CurrentModuleRank } from '~/models/current-module-rank';\nimport { $HitKepHashtagPosForwardExp } from '~/utils/libra';\n\nimport './style.scss';\n\ninterface TopicArticleCardProps {\n topic: Topic;\n article: TopicArticle;\n}\n\nexport const TopicArticleCard: FC = ({ topic, article }) => {\n const { topicId } = topic;\n const { canonicalUri, articleClass, articleLikes, shortContent, title, largeImage, groupId } = article;\n const { region } = useAtomValue($Locale);\n const { t } = useTranslation();\n const formatNum = useNumFormatter();\n const active = usePageActive();\n\n const isMobileUser = useAtomValue($IsMobileUser);\n const currentPageModule = useScopedAtomValue($CurrentPageModule);\n const currentModuleRank = useScopedAtomValue($CurrentModuleRank);\n const hitKepHashtagPosForwardExp = useAtomValue($HitKepHashtagPosForwardExp);\n\n const articleHref = useMemo(() => `${canonicalUri}?region=${region}`, [region]);\n\n const handleArticleClick = useReflowClick(\n {\n clickEvent: (_, bundle) => ({\n ...bundle,\n current_position: ClickPosition.related_hashtag_article_card,\n page_click_id: groupId,\n inserted_position: hitKepHashtagPosForwardExp && currentModuleRank !== -1 ? currentModuleRank + 1 : -1,\n }),\n reflowBehavior: () => {\n active({\n schemaOption: {\n pageType: articleClass === ArticleClass.VIDEO ? 'video' : 'article',\n groupId,\n },\n ampExtra: {\n enter_position: ClickPosition.related_hashtag_article_card,\n },\n });\n },\n defaultBehavior: (event?: SyntheticEvent) => {\n event?.stopPropagation();\n },\n },\n [active, topicId, groupId],\n );\n\n const hashtagArticleCardRef = useViewTracking({\n onView: useCallback(() => {\n if (isMobileUser) {\n window.Tea('wap_cta_show', {\n current_page_module: currentPageModule,\n current_position: ClickPosition.related_hashtag_article_card,\n inserted_position: hitKepHashtagPosForwardExp && currentModuleRank !== -1 ? currentModuleRank + 1 : -1,\n });\n }\n }, [isMobileUser]),\n });\n\n return (\n \n \n
\n
\n {t('own_picture').replace('%s',\n
\n
\n
\n \n {formatNum(articleLikes)}\n
\n {articleClass === ArticleClass.VIDEO && (\n
\n \n
\n )}\n
\n
\n

{title}

\n

{shortContent}

\n
\n \n
\n );\n};\n","import { Topic } from 'shared/models/legacy';\nimport { Link } from '@remix-run/react';\nimport { FC, useMemo, useCallback } from 'react';\nimport { StepScroll } from '../step-scroll';\nimport { TopicArticleCard } from './topic-article-card';\nimport NumberIcon from '@lemon8/design/lib/icons/icon_assets/number_fill.svg';\nimport { useAtomValue } from 'jotai';\nimport { $Locale } from '@lemon8/web-app-shared/atom';\nimport { useTranslation } from 'react-i18next';\nimport { useNumFormatter } from '~/utils/format/num-formatter';\nimport { ClickPosition } from '~/utils/click-position';\nimport { usePageActive } from '~/utils/active/use-page-active';\nimport useReflowClick from '~/utils/use-reflow-click';\nimport { $PageLevelTraffic } from 'shared/atoms';\nimport { EPageType } from 'shared/models';\nimport { $IsMobileUser } from '~/utils/is-mobile-user';\nimport { useScopedAtomValue } from '@lemon8/web-app-shared/ssr';\nimport { $CurrentPageModule } from '~/models/current-page-module';\nimport { useViewTracking } from '~/utils/use-view-tracking';\nimport { kepQueryFormat } from 'shared/utils/format/kep-formatter';\nimport { $CurrentModuleRank } from '~/models/current-module-rank';\nimport { $HitKepHashtagPosForwardExp } from '~/utils/libra';\n\nimport './style.scss';\n\nexport const MIN_HASHTAG_ARTICLE_COUNT = 3;\nconst MAX_HASHTAG_ARTICLE_COUNT = 10;\n\ninterface TopicCardProps {\n topic: Topic | string;\n}\n\nexport const TopicCard: FC = ({ topic }) => {\n const { pageType } = useAtomValue($PageLevelTraffic);\n const isKEPPage = pageType === EPageType.discover;\n\n const isOnlyWord = typeof topic === 'string';\n const { t } = useTranslation();\n const { region } = useAtomValue($Locale);\n const formatNum = useNumFormatter();\n const active = usePageActive();\n\n const isMobileUser = useAtomValue($IsMobileUser);\n const hitKepHashtagPosForwardExp = useAtomValue($HitKepHashtagPosForwardExp);\n const currentPageModule = useScopedAtomValue($CurrentPageModule);\n const currentModuleRank = useScopedAtomValue($CurrentModuleRank);\n\n const topicHref = useMemo(() => {\n if (!isKEPPage || isOnlyWord) {\n return `/discover/${kepQueryFormat(isOnlyWord ? topic : topic.topicName)}?region=${region}`;\n }\n return `/topic/${topic.topicId}?region=${region}`;\n }, [topic, region, isKEPPage]);\n\n const isHashtagWithArticleCard = useMemo(() => {\n return !isOnlyWord && topic.articles && topic.articles.length >= MIN_HASHTAG_ARTICLE_COUNT;\n }, []);\n\n const currentPosition = useMemo(() => {\n return isHashtagWithArticleCard ? ClickPosition.related_hashtag_with_article_card : ClickPosition.related_hashtag;\n }, []);\n\n const handleHashtagClick = useReflowClick(\n {\n clickEvent: (_, bundle) => ({\n ...bundle,\n current_position: currentPosition,\n page_click_id: isOnlyWord ? kepQueryFormat(topic) : topic.topicId,\n inserted_position: hitKepHashtagPosForwardExp && currentModuleRank !== -1 ? currentModuleRank + 1 : -1,\n }),\n reflowBehavior: () => {\n if (isOnlyWord) {\n active({\n schemaOption: {\n pageType: 'search',\n query: kepQueryFormat(topic),\n },\n ampExtra: {\n enter_position: currentPosition,\n },\n });\n } else {\n active({\n schemaOption: {\n pageType: 'hashtag',\n hashtagId: topic.topicId,\n },\n ampExtra: {\n enter_position: currentPosition,\n },\n });\n }\n },\n },\n [active, topic, isOnlyWord],\n );\n\n const description = useMemo(() => {\n return (\n isKEPPage &&\n !isOnlyWord &&\n t('view_count_plural', { num: topic.viewCount }).replace('%d', formatNum(topic.viewCount))\n );\n }, []);\n\n const hashtagRef = useViewTracking({\n onView: useCallback(() => {\n if (isMobileUser) {\n window.Tea('wap_cta_show', {\n current_page_module: currentPageModule,\n current_position: isHashtagWithArticleCard\n ? ClickPosition.related_hashtag_with_article_card\n : ClickPosition.related_hashtag,\n inserted_position: hitKepHashtagPosForwardExp && currentModuleRank !== -1 ? currentModuleRank + 1 : -1,\n });\n }\n }, [isMobileUser]),\n });\n\n return (\n \n
\n
\n \n
\n
\n

{isOnlyWord ? topic : topic.topicName}

\n {description &&

{description}

}\n
\n
\n {!isOnlyWord && topic.articles && topic.articles.length >= MIN_HASHTAG_ARTICLE_COUNT && (\n \n {topic.articles.slice(0, MAX_HASHTAG_ARTICLE_COUNT).map((article) => (\n \n ))}\n \n )}\n \n );\n};\n","import { atom } from 'jotai';\n\nexport const MODULE_NOT_RANK = -1;\n\nexport const $CurrentModuleRank = atom(MODULE_NOT_RANK);\n","const specialRegex = /[!@&/\\\\#,+()$~%.'\":*?<>{}]/g;\nconst emojiRegex = /[\\u{1F000}-\\u{1F9FF}]/gu;\n\n/** format to url word */\nexport const kepQueryFormat = (query: string) => {\n if (!query) {\n return '';\n }\n\n const filterCharWord = query.replace(specialRegex, '');\n const filterEmojiWord = filterCharWord.replace(emojiRegex, '');\n const filterSpaceWord = filterEmojiWord.replace(/\\s+/g, ' ');\n const lowerCaseWord = filterSpaceWord.replace(/[A-Z]/g, (char) => char.toLowerCase());\n\n return lowerCaseWord.trim();\n};\n"],"sourceRoot":""}