@funhub/platform 0.1.159 → 0.1.160

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,19 @@
1
+
2
+ import { BaseComponentProps } from "../../utils/types/component.mjs";
3
+ import "../../utils/index.mjs";
4
+ import { MaterialComponentMode } from "../../../../utils/schema/schema.mjs";
5
+ import "../../../../utils.mjs";
6
+ import { BasicBannerProps } from "./server.mjs";
7
+ import * as react_jsx_runtime0 from "react/jsx-runtime";
8
+
9
+ //#region components/biz/business/banner-carousel/client.d.ts
10
+ declare function BannerCarouselClient({
11
+ mode,
12
+ props: propsConfig,
13
+ styles,
14
+ events
15
+ }: BaseComponentProps<any> & {
16
+ mode?: MaterialComponentMode;
17
+ } & BasicBannerProps): react_jsx_runtime0.JSX.Element | null;
18
+ //#endregion
19
+ export { BannerCarouselClient };
@@ -1,2 +1,2 @@
1
1
 
2
- "use client";import{mergeStyles as e}from"../../utils/styles/helpers.mjs";import{Button as t}from"../../../ui/button.mjs";import{Image as n}from"../../../ui/image.mjs";import{Box as r}from"../../../ui/box.mjs";import{Carousel as i,CarouselContent as a,CarouselItem as o}from"../../../ui/carousel.mjs";import{Text as s}from"../../../ui/text.mjs";import c from"../../../ui/link.mjs";import{defaultProps as l}from"./default-props.mjs";import u from"clsx";import{useIsClient as d}from"foxact/use-is-client";import{useEffect as f,useRef as p,useState as m}from"react";import{jsx as h,jsxs as g}from"react/jsx-runtime";const _={list:[]};function v({mode:v=`renderer`,props:y=_,styles:b,events:x}){let S=v===`editor`,{autoplay:C=l.autoplay,interval:w=l.interval,loop:T=l.loop,showTitle:E=l.showTitle,showIndicator:D=l.showIndicator,list:O=[]}={...l,...y},[k,A]=m(),[j,M]=m(0),N=d(),P=p(null);if(f(()=>{if(!k||!N)return;let e=()=>{M(k.selectedScrollSnap())};return k.on(`select`,e),e(),()=>{k.off(`select`,e)}},[k,x,N]),f(()=>!C||!k||O.length<=1?void 0:(P.current=setInterval(()=>{k.canScrollNext()?k.scrollNext():T&&k.scrollTo(0)},w*1e3),()=>{P.current&&=(clearInterval(P.current),null)}),[C,k,w,T,O.length]),!O||O.length===0)return null;let F=O[j],I=b?e(b,{}):void 0;return g(r,{className:S?`relative w-full pointer-events-none`:`relative w-full`,style:I,children:[h(i,{setApi:A,opts:{align:`start`,loop:T,skipSnaps:!1,dragFree:!1},className:`w-full`,children:h(a,{className:`ml-0`,children:O.map((e,t)=>h(o,{className:`pl-0`,children:h(c,{href:e.target,className:`block relative w-full h-[242px] overflow-hidden touch-manipulation`,children:h(n,{src:e.coverUrl,alt:e.title||`Banner ${t+1}`,fill:!0,objectFit:`cover`,unoptimized:!0})})},t))})}),E&&F?.title&&h(r,{className:`absolute bottom-[8px] left-[8px]`,children:h(s,{as:`p`,className:`text-white text-[16px] line-clamp-1`,children:F.title})}),D&&O.length>1&&h(r,{className:`absolute bottom-[16px] right-[8px] flex items-center gap-[4px]`,children:O.map((e,n)=>h(t,{type:`button`,size:`xs`,className:u(`transition-all duration-300 rounded-full !p-0 px-0`,n===j?`w-[10px] h-[6px] bg-black`:`w-[6px] h-[6px] bg-white/50`),style:{padding:`0 !important`},"aria-label":`跳转到第 ${n+1} 个 Banner`},n))})]})}export{v as default};
2
+ "use client";import{mergeStyles as e}from"../../utils/styles/helpers.mjs";import{Button as t}from"../../../ui/button.mjs";import{Image as n}from"../../../ui/image.mjs";import{Box as r}from"../../../ui/box.mjs";import{Carousel as i,CarouselContent as a,CarouselItem as o}from"../../../ui/carousel.mjs";import{Text as s}from"../../../ui/text.mjs";import c from"../../../ui/link.mjs";import l from"../../../../assets/icons/detail/video_flag.mjs";import{defaultProps as u}from"./default-props.mjs";import d from"clsx";import{useIsClient as f}from"foxact/use-is-client";import{useEffect as p,useRef as m,useState as h}from"react";import{jsx as g,jsxs as _}from"react/jsx-runtime";const v={list:[]};function y(e){let t=Number(e||0);if(!Number.isFinite(t)||t<=0)return`0`;if(t>=1e4){let e=t/1e4;return`${e%1==0?e:e.toFixed(1)}万`}if(t>=1e3){let e=t/1e3;return`${e%1==0?e:e.toFixed(1)}千`}return String(Math.floor(t))}function b(e){let t=e.playCount;if(typeof t==`number`&&Number.isFinite(t))return t;let n=e.video;if(!n||typeof n!=`object`)return 0;let r=n;return Number(r.static?.browse_cnt??r.play_count??0)||0}function x({mode:x=`renderer`,props:S=v,styles:C,events:w}){let T=x===`editor`,{autoplay:E=u.autoplay,interval:D=u.interval,loop:O=u.loop,showTitle:k=u.showTitle,showIndicator:A=u.showIndicator,list:j=[]}={...u,...S},[M,N]=h(),[P,F]=h(0),I=f(),L=m(null);if(p(()=>{if(!M||!I)return;let e=()=>{F(M.selectedScrollSnap())};return M.on(`select`,e),e(),()=>{M.off(`select`,e)}},[M,w,I]),p(()=>{if(!(!E||!M||j.length<=1))return L.current=setInterval(()=>{M.canScrollNext()?M.scrollNext():O&&M.scrollTo(0)},D*1e3),()=>{L.current&&=(clearInterval(L.current),null)}},[E,M,D,O,j.length]),!j||j.length===0)return null;let R=j[P],z=C?e(C,{}):void 0,B=R?.badgeUrl||``,V=R?.showPlayCount??!0,H=R?.showEpisodeCount??!0,U=b(R),W=typeof R?.episodeInfo==`string`?R.episodeInfo.trim():``;return _(r,{className:d(`relative w-full overflow-hidden`,T&&`pointer-events-none`),style:z,children:[g(i,{setApi:N,opts:{align:`start`,loop:O,skipSnaps:!1,dragFree:!1},className:`w-full`,children:g(a,{className:`ml-0`,children:j.map((e,t)=>g(o,{className:`pl-0`,children:g(c,{href:e.target,className:`block relative w-full h-[219px] overflow-hidden touch-manipulation`,children:g(n,{src:e.coverUrl,alt:e.title||`Banner ${t+1}`,fill:!0,objectFit:`cover`,unoptimized:!0})})},t))})}),g(r,{className:`absolute inset-0 pointer-events-none flex flex-col justify-end`,style:{background:`linear-gradient(to top, rgba(0,0,0,0.5) 0%, rgba(0,0,0,0) 100%)`},children:_(r,{className:`flex items-end justify-between gap-2 p-[8px]`,children:[_(r,{className:`flex-1 min-w-0 flex flex-col gap-[4px]`,children:[k&&R?.title!=null&&g(s,{as:`p`,className:`text-white text-[16px] leading-[24px] font-bold line-clamp-1`,children:String(R.title)}),_(r,{className:`flex items-center gap-[8px]`,children:[V&&_(r,{className:`flex items-center gap-[4px] px-[4px] py-0 rounded-[4px] bg-white/10 shrink-0`,children:[g(l,{className:`w-[12px] h-[12px] text-white shrink-0`}),g(s,{as:`span`,className:`text-white text-[12px] leading-[20px]`,children:y(U)})]}),H&&W&&g(s,{as:`span`,className:`text-white text-[12px] leading-[20px] shrink-0`,children:W})]})]}),A&&j.length>1&&g(r,{className:`flex items-center gap-[4px] py-[4px] shrink-0 pointer-events-auto`,children:j.map((e,n)=>g(t,{type:`button`,size:`xs`,className:d(`transition-all duration-300 rounded-full !p-0 shrink-0`,n===P?`w-[10px] h-[6px] bg-theme5`:`w-[6px] h-[6px] bg-white/30`),style:{padding:`0 !important`},"aria-label":`跳转到第 ${n+1} 个 Banner`,onClick:()=>M?.scrollTo(n)},n))})]})}),B&&g(r,{className:`absolute top-0 right-0 overflow-hidden rounded-bl-[8px] pointer-events-none`,children:g(n,{src:B,alt:``,width:37,height:20,className:`object-contain`,unoptimized:!0})})]})}export{x as default};
@@ -1,2 +1,2 @@
1
1
 
2
- const e={autoplay:!0,interval:3,loop:!0,showTitle:!1,showIndicator:!0,list:[]};export{e as defaultProps};
2
+ const e={autoplay:!0,interval:3,loop:!0,showTitle:!0,showIndicator:!0,list:[]};export{e as defaultProps};
@@ -3,11 +3,12 @@ import { SchemaHasDefaultValue } from "../../../../utils/schema/schema.mjs";
3
3
  import { DefineMaterialOption } from "../../../../utils/schema/material.mjs";
4
4
  import "../../../../utils.mjs";
5
5
  import { BannerCarousel } from "./server.mjs";
6
+ import { BannerCarouselClient } from "./client.mjs";
6
7
  import * as zod from "zod";
7
8
  import * as zod_v4_core0 from "zod/v4/core";
8
9
 
9
10
  //#region components/biz/business/banner-carousel/material.d.ts
10
- declare const BannerCarouselMaterial: DefineMaterialOption<typeof BannerCarousel, typeof BannerCarousel, zod.ZodObject<{
11
+ declare const BannerCarouselMaterial: DefineMaterialOption<typeof BannerCarousel, typeof BannerCarouselClient, zod.ZodObject<{
11
12
  readonly interval: zod.ZodNumber & SchemaHasDefaultValue;
12
13
  readonly list: zod.ZodOptional<zod.ZodArray<zod.ZodObject<{
13
14
  contentId: zod.ZodOptional<zod.ZodNumber>;
@@ -17,6 +18,8 @@ declare const BannerCarouselMaterial: DefineMaterialOption<typeof BannerCarousel
17
18
  showPlayCount: zod.ZodOptional<zod.ZodBoolean>;
18
19
  showEpisodeCount: zod.ZodOptional<zod.ZodBoolean>;
19
20
  target: zod.ZodOptional<zod.ZodString>;
21
+ playCount: zod.ZodOptional<zod.ZodNumber>;
22
+ episodeInfo: zod.ZodOptional<zod.ZodString>;
20
23
  }, zod_v4_core0.$strip>>> & SchemaHasDefaultValue;
21
24
  } & {
22
25
  mode: zod.ZodOptional<zod.ZodEnum<{
@@ -1,2 +1,2 @@
1
1
 
2
- import{defineMaterial as e}from"../../../../utils/schema/material.mjs";import{basicBannerInspectorPropsSchema as t}from"./schema.mjs";import{BannerCarousel as n}from"./server.mjs";const r=e({type:`banner-carousel`,name:`基础轮播图`,icon:`/static/components-thumb/carousel_banner.png`,category:`内容组件`,serverComponent:n,clientComponent:n,propsSchema:t});export{r as BannerCarouselMaterial};
2
+ import{defineMaterial as e}from"../../../../utils/schema/material.mjs";import t from"./client.mjs";import{basicBannerInspectorPropsSchema as n}from"./schema.mjs";import{BannerCarousel as r}from"./server.mjs";const i=e({type:`banner-carousel`,name:`基础轮播图`,icon:`/static/components-thumb/carousel_banner.png`,category:`内容组件`,serverComponent:r,clientComponent:t,propsSchema:n});export{i as BannerCarouselMaterial};
@@ -17,6 +17,8 @@ declare const basicBannerInspectorPropsSchema: z$1.ZodObject<{
17
17
  showPlayCount: z$1.ZodOptional<z$1.ZodBoolean>;
18
18
  showEpisodeCount: z$1.ZodOptional<z$1.ZodBoolean>;
19
19
  target: z$1.ZodOptional<z$1.ZodString>;
20
+ playCount: z$1.ZodOptional<z$1.ZodNumber>;
21
+ episodeInfo: z$1.ZodOptional<z$1.ZodString>;
20
22
  }, z$1.core.$strip>>> & SchemaHasDefaultValue;
21
23
  } & {
22
24
  mode: z$1.ZodOptional<z$1.ZodEnum<{
@@ -1,2 +1,2 @@
1
1
 
2
- import{defineComponentPropsSchema as e,getSchemaDefaultProps as t}from"../../../../utils/schema/schema.mjs";import{defaultProps as n}from"./default-props.mjs";import r from"zod";const i=e(e=>({interval:e.number(n.interval,{label:`播放间隔`}),list:e.array(r.object({contentId:e.number(void 0,{label:`内容ID`,required:!1}),title:e.string(void 0,{label:`内容标题`,required:!1}),coverUrl:e.string(void 0,{label:`封面`,required:!1}),badgeUrl:e.string(void 0,{label:`角标`,required:!1}),showPlayCount:e.boolean(void 0,{fieldType:`switch`,label:`展示播放量`,required:!1}),showEpisodeCount:e.boolean(void 0,{fieldType:`switch`,label:`展示集数`,required:!1}),target:e.string(void 0,{label:`跳转地址`,required:!1})}),{required:!1,label:`list`,defaultValue:[{contentId:1,title:`视频标题一`,desc:`视频描述`,coverUrl:`/static/components-resource/banner.png`,badgeUrl:``,showPlayCount:!1,showEpisodeCount:!1,target:``},{contentId:2,title:`视频标题二`,coverUrl:`/static/components-resource/banner.png`,badgeUrl:``,showPlayCount:!1,showEpisodeCount:!1,target:``},{contentId:3,title:`视频标题三`,coverUrl:`/static/components-resource/banner.png`,badgeUrl:``,showPlayCount:!1,showEpisodeCount:!1,target:``}]})}));t(i);export{i as basicBannerInspectorPropsSchema};
2
+ import{defineComponentPropsSchema as e,getSchemaDefaultProps as t}from"../../../../utils/schema/schema.mjs";import{defaultProps as n}from"./default-props.mjs";import r from"zod";const i=e(e=>({interval:e.number(n.interval,{label:`播放间隔`}),list:e.array(r.object({contentId:e.number(void 0,{label:`内容ID`,required:!1}),title:e.string(void 0,{label:`内容标题`,required:!1}),coverUrl:e.string(void 0,{label:`封面`,required:!1}),badgeUrl:e.string(void 0,{label:`角标图片`,required:!1}),showPlayCount:e.boolean(void 0,{fieldType:`switch`,label:`展示播放量`,required:!1}),showEpisodeCount:e.boolean(void 0,{fieldType:`switch`,label:`展示集数`,required:!1}),target:e.string(void 0,{label:`跳转地址`,required:!1}),playCount:e.number(void 0,{label:`播放量`,required:!1}),episodeInfo:e.string(void 0,{label:`集数文案`,required:!1})}),{required:!1,label:`list`,defaultValue:[{contentId:1,title:`兴趣圈层up主扶持计划,启动!`,desc:`视频描述`,coverUrl:`/static/components-resource/banner.png`,badgeUrl:``,showPlayCount:!0,showEpisodeCount:!0,target:``,playCount:24e3,episodeInfo:`56集全`},{contentId:2,title:`视频标题二`,coverUrl:`/static/components-resource/banner.png`,badgeUrl:``,showPlayCount:!0,showEpisodeCount:!0,target:``},{contentId:3,title:`视频标题三`,coverUrl:`/static/components-resource/banner.png`,badgeUrl:``,showPlayCount:!0,showEpisodeCount:!0,target:``}]})}));t(i);export{i as basicBannerInspectorPropsSchema};
@@ -6,13 +6,15 @@ import * as react_jsx_runtime0 from "react/jsx-runtime";
6
6
  /** BasicBanner 物料组件 props(inspector 可编辑字段 + 可选数据) */
7
7
  type BasicBannerProps = BasicBannerInspectorProps & {
8
8
  /** 轮播数据,未传入时使用 mock 数据 */data?: {
9
+ interval?: number;
9
10
  list: Array<Record<string, unknown>>;
10
11
  };
11
12
  };
12
13
  /**
13
14
  * BasicBanner 物料组件
14
15
  * 接收 inspector 可编辑的 props,转换为 BaseComponentProps 传给 runtime client
16
+ * 对 list 中带 video.id 的项批量拉取视频详情并覆盖
15
17
  */
16
- declare function BannerCarousel(props: BasicBannerProps): react_jsx_runtime0.JSX.Element;
18
+ declare function BannerCarousel(props: BasicBannerProps): Promise<react_jsx_runtime0.JSX.Element>;
17
19
  //#endregion
18
- export { BannerCarousel };
20
+ export { BannerCarousel, BasicBannerProps };
@@ -1,2 +1,2 @@
1
1
 
2
- import{defaultProps as e}from"./default-props.mjs";import t from"./client.mjs";import{jsx as n}from"react/jsx-runtime";function r(r){let{mode:i=`renderer`,interval:a,list:o}=r;return n(t,{mode:i,props:{interval:typeof a==`string`?Number(a)||e.interval:a??e.interval,list:o}})}export{r as BannerCarousel};
2
+ import{pContentBatchGetVideoDetail as e}from"../../../../service/generated/client.mjs";import{defaultProps as t}from"./default-props.mjs";import n from"./client.mjs";import{jsx as r}from"react/jsx-runtime";function i(e){let t=[];for(let n of e){let e=n.video;if(e&&typeof e==`object`&&`id`in e){let n=e.id;typeof n==`string`&&n.trim()&&t.push(n.trim())}}return Array.from(new Set(t))}function a(e,t){let n=String(t.id||t.mid||``),r=String(t.name||``),i=String(t.img_y||t.img_x||e.coverUrl||``),a=n?`/video/${n}/${encodeURIComponent(r||``)}/episode/1`:String(e.target||``),o=!!e.showPlayCount,s=t.static,c=Number(s?.browse_cnt??t.play_count??0),l={...e,contentId:e.contentId??n,title:r||e.title,coverUrl:i||e.coverUrl,target:a||e.target,video:{...typeof e.video==`object`&&e.video?e.video:{},...t}};return o&&Number.isFinite(c)&&c>=0&&(l.playCount=c),l}async function o(t){let n=i(t);if(!n.length)return t;let r=new Map;try{let t=await e({ids:n}),i=Array.isArray(t.data?.videos)?t.data.videos:[];for(let e of i){let t=String(e.video_id||e.id||e.mid||``);t&&r.set(t,e)}}catch(e){return console.warn(`[banner-carousel] 批量获取视频详情失败,使用原始 list`,e),t}return t.map(e=>{let t=e.video;if(!t||typeof t!=`object`||!(`id`in t))return e;let n=String(t.id||``).trim();if(!n)return e;let i=r.get(n);return i?a(e,i):e})}async function s(e){let{mode:i=`renderer`,interval:a,list:s}=e,c=s??t.list;return r(n,{mode:i,interval:typeof a==`string`?Number(a)||t.interval:a??t.interval,list:Array.isArray(c)?await o(c):[]})}export{s as BannerCarousel};
@@ -1,2 +1,2 @@
1
1
 
2
- "use client";import{mergeStyles as e}from"../../utils/styles/helpers.mjs";import{Box as t}from"../../../ui/box.mjs";import n from"../../../ui/link.mjs";import{urlPrefix as r}from"../../../../constants/url-prefix.mjs";import{useSticky as i}from"../../../../hooks/use-sticky.mjs";import a from"../../../../assets/icons/filter_dark.mjs";import o,{loadHiddenChannelIdsFromStorage as s}from"./channel-filter-dialog.mjs";import{defaultProps as c}from"./default-props.mjs";import{clsx as l}from"clsx";import{useEffect as u,useMemo as d,useState as f}from"react";import{Fragment as p,jsx as m,jsxs as h}from"react/jsx-runtime";import{usePathname as g}from"next/navigation";const _={};function v(e,t){let n=`${r.DOMAIN}/`,i=t.indexOf(n),a=i!==-1,o=a?t.slice(i+n.length).split(`/`)[0]:void 0;return e.isDefault?a&&o?`${r.DOMAIN}/${o}`:`/`:a&&o?`${r.DOMAIN}/${o}/${encodeURIComponent(e.name)}`:`${r.CHANNEL}/${encodeURIComponent(e.name)}`}function y(r){let{mode:y=`renderer`,styles:b,events:x,...S}=r,C=g()??`/`,w=y===`editor`,T=S||_,E={...c,...T},[D,O]=f(!1),{isSticky:k,ref:A}=i(),[j,M]=f(!1),[N,P]=f(E.list),F=d(()=>E.list.find(e=>e.isDefault)?.name??null,[E.list]),I=d(()=>E.currentChannelId??F,[E.currentChannelId,F]);u(()=>{let e=s();P(e?.length?E.list.filter(t=>!e.includes(t.name)):E.list)},[E.list]);let L=e=>{P(e)},R=(e,t)=>{x?.onChannelChange?.(e,t)},z=b?e(b,{}):void 0;return u(()=>{let e=()=>{let e=window.scrollY??document.documentElement.scrollTop??0,t=window.innerHeight,n=document.documentElement.scrollHeight;M(e+t>=n-1)};return window.addEventListener(`scroll`,e,{passive:!0}),e(),()=>{window.removeEventListener(`scroll`,e)}},[]),h(p,{children:[k&&m(t,{className:`w-full h-11`}),m(t,{as:`nav`,ref:A,className:l(`w-full transition-all duration-200`,w&&`pointer-events-none`,!E.isFullfeed&&k&&`fixed top-0 left-0 right-0 z-50`,!E.isFullfeed&&!k&&j&&`fixed bottom-0 left-0 right-0 z-50`,E.isFullfeed&&`fixed top-[54px] left-0 z-10 w-full`,!E.isFullfeed&&`bg-bg1`),style:z,children:h(t,{className:`relative flex items-center h-[44px]`,children:[m(t,{className:`flex-1 overflow-x-auto overflow-y-hidden [&::-webkit-scrollbar]:hidden`,style:{scrollbarWidth:`none`,msOverflowStyle:`none`,WebkitOverflowScrolling:`touch`},children:m(t,{className:`flex items-center h-full pl-4 pr-4 gap-4`,children:N.map((e,t)=>{let r=I===e.name||I===null&&t===0;return m(n,{href:v(e,C),webviewNavMode:`spa`,className:l(`whitespace-nowrap cursor-pointer transition-all duration-200`,`flex items-center justify-center h-11`,`${r?`text-xl`:`text-base`}`),style:{fontWeight:r?`bold`:`normal`,color:r?`var(--color-theme5)`:`var(--color-text2)`},onClick:()=>R(e,t),children:e.name},e.name||`channel-${t}`)})})}),r.modifiable?m(t,{className:`flex items-center gap-[12px] px-[8px]`,children:m(t,{className:`flex items-center justify-center cursor-pointer w-7 h-8`,onClick:()=>{O(!0),x?.onFilterClick?.()},children:m(a,{className:`w-5 h-5`,style:{color:`var(--color-text1)`}})})}):null]})}),m(o,{open:D,onOpenChange:O,channels:E.list,currentChannelId:I,onChannelClick:R,onChannelsChange:L})]})}export{y as default};
2
+ "use client";import{mergeStyles as e}from"../../utils/styles/helpers.mjs";import{Box as t}from"../../../ui/box.mjs";import n from"../../../ui/link.mjs";import{urlPrefix as r}from"../../../../constants/url-prefix.mjs";import{useSticky as i}from"../../../../hooks/use-sticky.mjs";import a from"../../../../assets/icons/filter_dark.mjs";import o,{loadHiddenChannelIdsFromStorage as s}from"./channel-filter-dialog.mjs";import{defaultProps as c}from"./default-props.mjs";import{clsx as l}from"clsx";import{useEffect as u,useMemo as d,useState as f}from"react";import{Fragment as p,jsx as m,jsxs as h}from"react/jsx-runtime";import{usePathname as g}from"next/navigation";const _={};function v(e,t){let n=`${r.DOMAIN}/`,i=t.indexOf(n),a=i!==-1,o=a?t.slice(i+n.length).split(`/`)[0]:void 0;return e.isDefault?a&&o?`${r.DOMAIN}/${o}`:`/`:a&&o?`${r.DOMAIN}/${o}/${encodeURIComponent(e.name)}`:`${r.CHANNEL}/${encodeURIComponent(e.name)}`}function y(r){let{mode:y=`renderer`,styles:b,events:x,...S}=r,C=g()??`/`,w=y===`editor`,T=S||_,E={...c,...T},[D,O]=f(!1),{isSticky:k,ref:A}=i(),[j,M]=f(!1),[N,P]=f(E.list),F=d(()=>E.list.find(e=>e.isDefault)?.name??null,[E.list]),I=d(()=>E.currentChannelId??F,[E.currentChannelId,F]);u(()=>{let e=s();P(e?.length?E.list.filter(t=>!e.includes(t.name)):E.list)},[E.list]);let L=e=>{P(e)},R=(e,t)=>{x?.onChannelChange?.(e,t)},z=b?e(b,{}):void 0;return u(()=>{let e=()=>{let e=window.scrollY??document.documentElement.scrollTop??0,t=window.innerHeight,n=document.documentElement.scrollHeight;M(e+t>=n-1)};return window.addEventListener(`scroll`,e,{passive:!0}),e(),()=>{window.removeEventListener(`scroll`,e)}},[]),h(p,{children:[k&&m(t,{className:`w-full h-11`}),m(t,{as:`nav`,ref:A,className:l(`w-full transition-all duration-200`,w&&`pointer-events-none`,!E.isFullfeed&&`bg-bg1`),style:z,children:h(t,{className:`relative flex items-center h-[44px]`,children:[m(t,{className:`flex-1 overflow-x-auto overflow-y-hidden [&::-webkit-scrollbar]:hidden`,style:{scrollbarWidth:`none`,msOverflowStyle:`none`,WebkitOverflowScrolling:`touch`},children:m(t,{className:`flex items-center h-full pl-4 pr-4 gap-4`,children:N.map((e,t)=>{let r=I===e.name||I===null&&t===0;return m(n,{href:v(e,C),webviewNavMode:`spa`,className:l(`whitespace-nowrap cursor-pointer transition-all duration-200`,`flex items-center justify-center h-11`,`${r?`text-xl`:`text-base`}`),style:{fontWeight:r?`bold`:`normal`,color:r?`var(--color-theme5)`:`var(--color-text2)`},onClick:()=>R(e,t),children:e.name},e.name||`channel-${t}`)})})}),r.modifiable?m(t,{className:`flex items-center gap-[12px] px-[8px]`,children:m(t,{className:`flex items-center justify-center cursor-pointer w-7 h-8`,onClick:()=>{O(!0),x?.onFilterClick?.()},children:m(a,{className:`w-5 h-5`,style:{color:`var(--color-text1)`}})})}):null]})}),m(o,{open:D,onOpenChange:O,channels:E.list,currentChannelId:I,onChannelClick:R,onChannelsChange:L})]})}export{y as default};
@@ -1,2 +1,2 @@
1
1
 
2
- "use client";import{pContentGetPopularVideoList as e}from"../../../../../service/generated/client.mjs";import{useRouter as t}from"../../../../../utils/use-compatible-router.mjs";import{Image as n}from"../../../../ui/image.mjs";import{Box as r}from"../../../../ui/box.mjs";import{Text as i}from"../../../../ui/text.mjs";import a from"../../../../ui/loading.mjs";import{useGridFirstRowHeight as o,useWaterfallFirstRowHeight as s}from"../../../../../hooks/use-first-row-height.mjs";import{useMinDurationLoading as c}from"../../../../../hooks/use-min-duration-loading.mjs";import l from"../../../../../assets/icons/detail/video_flag.mjs";import{MiniThreeCard as u}from"../../../../common/cards/mini-three-card.mjs";import{HOME_RECOMMEND_DEFAULT_GRID_COLUMNS as ee,HOME_RECOMMEND_DEFAULT_GRID_ROWS as te,HOME_RECOMMEND_DEFAULT_PLAY_COUNT_DELTA as d,HOME_RECOMMEND_DEFAULT_SHOW_EPISODE as ne,HOME_RECOMMEND_DEFAULT_SHOW_PLAY_COUNT as f,HOME_RECOMMEND_MAX_GRID_COLUMNS as p,HOME_RECOMMEND_MAX_GRID_ROWS as re}from"./home-recommend-default-config.mjs";import{HOME_RECOMMEND_CARD_CONFIG_FIELD as ie}from"./home-recommend-preview.mjs";import{enrichHomeRecommendItemsWithVideoDetails as ae}from"./home-recommend-video-detail.mjs";import{useCallback as oe,useEffect as m,useLayoutEffect as se,useMemo as h,useRef as g,useState as _}from"react";import{jsx as v,jsxs as y}from"react/jsx-runtime";const ce={},le={list:[]};function b({variant:n,props:l=ce,data:u=le,mode:ie=`renderer`}){let b=ie===`editor`,S=t(),{list:C,title:pe,cursor:w}=u,T=h(()=>Array.isArray(C)?C:[],[C]),E=h(()=>Array.isArray(u.icons)?u.icons:[],[u.icons]),{rows:me,columns:he,moreLink:D,title:O,smartTagEnabled:ge,smartTagIds:k,catId:ve,showPlayCount:ye,playCountDelta:be,showEpisode:xe,enableInfinite:Se,items:j}=l,M=ge===!0,N=Se===!0&&M,P=!b&&N&&T.length>=16,F=h(()=>Array.isArray(k)?k.map(e=>String(e||``).trim()).filter(Boolean):[],[k]),I=typeof ve==`string`?ve.trim():``,L=h(()=>M||!Array.isArray(j)?``:j.map(e=>String(e?.contentId||``).trim()).filter(Boolean).join(`,`),[M,j]),[Ce,we]=_(0),[R,z]=_(T),[Te,Ee]=_(E),[B,V]=_(()=>typeof w==`string`?w:void 0),[H,De]=_(!1),U=g(null),Oe=g(null),W=g(null),ke=g([]),G=g({left:null,right:null}),Ae=g(!1),je=g(``),{isLoading:Me,show:Ne,hide:Pe}=c(600),Fe=de(me,te,re),K=de(he,ee,p),q=N?16:n===`grid`?Fe*K:16,J=h(()=>[n,M?`smart`:`manual:${L}`,F.join(`,`),I,String(q)].join(`|`),[M,L,I,q,F,n]);m(()=>{je.current!==J&&(z(T),Ee(E),V(typeof w==`string`?w:void 0))},[w,E,T,J]);let Ie=Fe*K,Le=b&&n===`grid`,Y=Le?R.slice(0,Ie):R,Re=Le?Te.slice(0,Ie):Te,ze=n===`waterfall`?6:4,X=Y.length>0?Math.max(0,Y.length-ze):-1,Be=!!B,Ve=O&&O.trim()||pe||``,He=ye??f,Ue=Number(be??d),We=xe??ne,Ge=!N,Z=Ge?ue(D):``,Ke=Ge&&!!Z,qe=o({enabled:!b&&n===`grid`,containerRef:Oe,firstRowItemRef:ke,columns:K,itemsCount:Y.length,deps:[n]}),Je=s({enabled:!b&&n===`waterfall`,containerRef:U,firstRowRef:G,deps:[n,Y.length]}),Ye=n===`grid`?qe:Je,Xe=oe(async()=>{if(!b&&je.current!==J&&(je.current=J,M||L))try{if(Ne(),!M){if(!L)return;z(await ae(R));return}let t=await e({page_size:q,tags:F.length>0?F:void 0,cat_id:I||void 0},{cache:`no-store`}),n=Array.isArray(t.data?.videos)?t.data.videos:[],r=t.data?.cursor;z(n),V(r)}catch(e){console.error(`推荐位刷新首屏失败(client)`,e)}finally{Pe()}},[Pe,b,M,L,J,I,q,F,R,Ne]);m(()=>{Xe()},[Xe]);let Ze=oe(async()=>{let t=B;if(!(!P||!t||Ae.current)){Ae.current=!0,De(!0);try{let n=await e({cursor:t,page_size:q,tags:F.length>0?F:void 0,cat_id:I||void 0}),r=Array.isArray(n.data?.videos)?n.data.videos:[],i=n.data?.cursor;r.length>0&&z(e=>e.concat(r)),V(e=>{if(!(!r.length||!i))return i===e?void 0:i})}catch(e){console.error(`推荐位加载下一页失败(client)`,e),V(void 0)}finally{Ae.current=!1,De(!1)}}},[B,I,q,F,P]),Qe=oe(()=>{if(Z){if(Z.startsWith(`http`)){window.location.href=Z;return}S.push(Z)}},[Z,S]);m(()=>{let e=W.current;if(!e||!P||!Be)return;let t=new IntersectionObserver(e=>{!e[0]?.isIntersecting||H||Ze()},{root:null,threshold:0});return t.observe(e),()=>{t.disconnect()}},[Ze,Be,H,Y.length,q,P,X]),se(()=>{let e=U.current;if(!e||n!==`waterfall`)return;let t=()=>{let t=e.clientWidth||0;we(t>0?(t-12)/2:0)};t();let r=new ResizeObserver(t);return r.observe(e),()=>{r.disconnect()}},[n]);let Q=h(()=>n===`waterfall`?_e(Y,Re,Ce):{left:[],right:[]},[Ce,Re,Y,n]);if(m(()=>{n===`waterfall`&&(Q.left.length||(G.current.left=null),Q.right.length||(G.current.right=null))},[n,Q.left.length,Q.right.length]),!Y.length)return null;let $=!b&&Me,$e=!b&&H,et=Ye>0?Ye/2:160;return y(r,{className:`w-full mt-[16px]`,children:[y(r,{className:`flex items-center justify-between px-[12px] mb-[8px]`,children:[v(i,{className:`flex-1 min-w-0 text-text1 text-[18px] leading-[26px] font-bold line-clamp-1`,children:Ve}),Ke&&v(i,{className:`text-text3 text-[12px] leading-[18px] cursor-pointer`,onClick:Qe,children:`更多`})]}),n===`grid`&&y(r,{ref:Oe,className:`w-full flex flex-wrap px-[12px] relative`,children:[Y.map((e,t)=>{let r=Re[t],i=fe(e),a=He&&(i?.showPlayCount??!0),o=i?.playCountDelta??Ue,s=i?.showEpisode??We,c=t%K,l=K>1?{paddingLeft:12*c/K,paddingRight:12*(K-c-1)/K}:void 0;return v(`div`,{ref:e=>{t===X&&(W.current=e),t<K&&(ke.current[t]=e)},className:`min-w-0`,style:{width:`${100/K}%`,...l||{}},children:v(x,{variant:n,item:e,icon:r,index:t,showPlayCount:a,playCountDelta:o,showEpisode:s,widthStyle:{width:`100%`}})},A(e,t))}),$&&v(r,{className:`absolute inset-0 z-10 bg-black/15 backdrop-blur-[1px] dark:bg-white/10`,"aria-hidden":!0}),$&&v(r,{className:`absolute left-1/2 -translate-x-1/2 -translate-y-1/2 z-20 pointer-events-none`,style:{top:et},"aria-hidden":!0,children:v(a,{size:`large`,showLabel:!1,className:`text-theme5`})})]}),n===`waterfall`&&y(r,{ref:U,className:`w-full px-[12px] flex gap-[12px] relative`,children:[v(r,{className:`flex-1 min-w-0 flex flex-col`,children:Q.left.map((e,t)=>{let r=fe(e.item),i=He&&(r?.showPlayCount??!0),a=r?.playCountDelta??Ue,o=r?.showEpisode??We;return v(`div`,{ref:n=>{e.index===X&&(W.current=n),t===0&&(G.current.left=n)},children:v(x,{variant:n,item:e.item,icon:e.icon,index:e.index,showPlayCount:i,playCountDelta:a,showEpisode:o,widthStyle:{width:`100%`}})},A(e.item,e.index))})}),v(r,{className:`flex-1 min-w-0 flex flex-col`,children:Q.right.map((e,t)=>{let r=fe(e.item),i=He&&(r?.showPlayCount??!0),a=r?.playCountDelta??Ue,o=r?.showEpisode??We;return v(`div`,{ref:n=>{e.index===X&&(W.current=n),t===0&&(G.current.right=n)},children:v(x,{variant:n,item:e.item,icon:e.icon,index:e.index,showPlayCount:i,playCountDelta:a,showEpisode:o,widthStyle:{width:`100%`}})},A(e.item,e.index))})}),$&&v(r,{className:`absolute inset-0 z-10 bg-black/15 backdrop-blur-[1px] dark:bg-white/10`,"aria-hidden":!0}),$&&v(r,{className:`absolute left-1/2 -translate-x-1/2 -translate-y-1/2 z-20 pointer-events-none`,style:{top:et},"aria-hidden":!0,children:v(a,{size:`large`,showLabel:!1,className:`text-theme5`})})]}),$e&&v(r,{className:`w-full flex justify-center py-[12px]`,children:v(a,{size:`medium`,showLabel:!1,className:`text-theme5`})})]})}function x({variant:e,item:t,icon:n,index:a,showPlayCount:o,playCountDelta:s,showEpisode:c,widthStyle:ee}){let te=pe(t),d=t.name||t?.title||``,ne=me(he(t.static?.browse_cnt??0,s)),f=T(t,c),p=ge(t,n,a);return v(u,{url:te,text:d,className:`w-full`,style:ee,topRightChild:p?v(S,{url:p}):void 0,bottomLeftChild:o?y(r,{className:`h-[20px] leading-[20px] text-[#fff] text-[12px] px-[4px] py-0 rounded-[4px] bg-[rgba(255,255,255,0.1)] ml-[4px] flex items-center gap-[4px]`,children:[v(l,{className:`w-[12px] h-[12px] text-[#fff] shrink-0`}),ne]}):null,bottomRightChild:c?f&&v(i,{className:`text-[#fff] text-[12px] leading-[18px] pr-2`,children:f}):null,textChild:v(r,{className:`py-[4px]`,children:v(i,{as:`h3`,className:`text-text1 text-[16px] leading-[24px] ${e===`waterfall`?`break-words line-clamp-3`:`line-clamp-1`}`,children:d})}),linkPath:C(t)})}function S({url:e}){return v(r,{className:`relative w-[40px] h-[20px]`,children:v(n,{src:e,alt:`corner`,width:40,height:20,className:`w-full h-auto`})})}function C(e){let t=encodeURIComponent(e.name||``);return`/video/${e.id||``}/${t}/episode/1`}function ue(e){return e?e.trim():``}function de(e,t,n){let r=Number(e);return!Number.isFinite(r)||r<=0?t:Math.min(n,Math.floor(r))}function fe(e){return e[ie]}function pe(e){return e.img_y||e.img_x||e?.coverUrl}function w(e){return typeof e==`string`?e:``}function T(e,t){if(!t)return``;if(E(e)){let t=e.update_status===`0`,n=Number(e.episode_cnt||e.links?.length||0);return n>0?`${t?`更新至`:`全`}${n}集`:``}return O(Number(e.duration||0))}function E(e){if(Number(e.type??0)===2)return!0;let t=Number(e.episode_cnt||e.links?.length||0);return Number.isFinite(t)&&t>1}function me(e){return!Number.isFinite(e)||e<=0?`0`:e>=1e6?`${D(e/1e6)}M`:e>=1e3?`${D(e/1e3)}k`:Math.floor(e).toString()}function he(e,t){let n=Number(e||0),r=Number(t||0);return!Number.isFinite(n)||!Number.isFinite(r)?0:Math.max(0,n+r)}function D(e){let t=e.toFixed(1);return t.endsWith(`.0`)?t.slice(0,-2):t}function O(e){if(!Number.isFinite(e)||e<=0)return``;let t=Math.floor(e),n=Math.floor(t/3600),r=Math.floor(t%3600/60),i=t%60,a=e=>String(e).padStart(2,`0`);return n>0?`${a(n)}:${a(r)}:${a(i)}`:`${a(r)}:${a(i)}`}function ge(e,t,n){return w(e.badge_url)||w(t?.material_url)||``}function _e(e,t,n){let r=[],i=[],a=n<=0,o=0,s=0;return e.forEach((e,c)=>{let l=t[c];if(a){c%2==0?r.push({item:e,icon:l,index:c}):i.push({item:e,icon:l,index:c});return}let u=k(n,e);o<=s?(r.push({item:e,icon:l,index:c}),o+=u):(i.push({item:e,icon:l,index:c}),s+=u)}),{left:r,right:i}}function k(e,t){if(!e)return 0;let n=e*1.3461538461538463,r=T(t,!0)?18:0;return n+20+r+6+16}function A(e,t){return e.id?`home-recommend-${e.id}`:`home-recommend-${t}`}export{b as default};
2
+ "use client";import{pContentGetPopularVideoList as e}from"../../../../../service/generated/client.mjs";import{useRouter as t}from"../../../../../utils/use-compatible-router.mjs";import{Image as n}from"../../../../ui/image.mjs";import{Box as r}from"../../../../ui/box.mjs";import{Text as i}from"../../../../ui/text.mjs";import a from"../../../../ui/loading.mjs";import{useGridFirstRowHeight as o,useWaterfallFirstRowHeight as s}from"../../../../../hooks/use-first-row-height.mjs";import{useMinDurationLoading as c}from"../../../../../hooks/use-min-duration-loading.mjs";import l from"../../../../../assets/icons/detail/video_flag.mjs";import{MiniThreeCard as u}from"../../../../common/cards/mini-three-card.mjs";import{HOME_RECOMMEND_DEFAULT_GRID_COLUMNS as ee,HOME_RECOMMEND_DEFAULT_GRID_ROWS as te,HOME_RECOMMEND_DEFAULT_PLAY_COUNT_DELTA as d,HOME_RECOMMEND_DEFAULT_SHOW_EPISODE as ne,HOME_RECOMMEND_DEFAULT_SHOW_PLAY_COUNT as f,HOME_RECOMMEND_MAX_GRID_COLUMNS as re,HOME_RECOMMEND_MAX_GRID_ROWS as ie}from"./home-recommend-default-config.mjs";import{HOME_RECOMMEND_CARD_CONFIG_FIELD as ae}from"./home-recommend-preview.mjs";import{enrichHomeRecommendItemsWithVideoDetails as oe}from"./home-recommend-video-detail.mjs";import{useCallback as p,useEffect as m,useLayoutEffect as se,useMemo as h,useRef as g,useState as _}from"react";import{jsx as v,jsxs as y}from"react/jsx-runtime";const ce={},le={list:[]},ue=new Map;function b({variant:n,props:l=ce,data:u=le,mode:ae=`renderer`}){let b=ae===`editor`,S=t(),{list:C,title:me,cursor:w}=u,T=h(()=>Array.isArray(C)?C:[],[C]),E=h(()=>Array.isArray(u.icons)?u.icons:[],[u.icons]),{rows:he,columns:ge,moreLink:_e,title:D,smartTagEnabled:ve,smartTagIds:O,catId:be,showPlayCount:xe,playCountDelta:Se,showEpisode:Ce,enableInfinite:we,items:A}=l,j=ve===!0,M=we===!0&&j,N=!b&&M&&T.length>=16,P=h(()=>Array.isArray(O)?O.map(e=>String(e||``).trim()).filter(Boolean):[],[O]),F=typeof be==`string`?be.trim():``,I=h(()=>j||!Array.isArray(A)?``:A.map(e=>String(e?.contentId||``).trim()).filter(Boolean).join(`,`),[j,A]),[Te,Ee]=_(0),[L,R]=_(T),[z,De]=_(E),[B,V]=_(()=>typeof w==`string`?w:void 0),[H,Oe]=_(!1),ke=g(null),Ae=g(null),U=g(null),je=g([]),W=g({left:null,right:null}),Me=g(!1),G=g(``),{isLoading:Ne,show:Pe,hide:Fe}=c(600),Ie=fe(he,te,ie),K=fe(ge,ee,re),q=M?16:n===`grid`?Ie*K:16,J=h(()=>[n,j?`smart`:`manual:${I}`,P.join(`,`),F,String(q)].join(`|`),[j,I,F,q,P,n]);m(()=>{let e=ue.get(J);if(e){R(e.items),De(e.icons),V(e.cursor),G.current=J;return}G.current!==J&&(R(T),De(E),V(typeof w==`string`?w:void 0))},[w,E,T,J]),m(()=>{b||ue.set(J,{items:L,icons:z,cursor:B})},[b,B,J,z,L]);let Le=Ie*K,Re=b&&n===`grid`,Y=Re?L.slice(0,Le):L,ze=Re?z.slice(0,Le):z,Be=n===`waterfall`?6:4,X=Y.length>0?Math.max(0,Y.length-Be):-1,Ve=!!B,He=D&&D.trim()||me||``,Ue=xe??f,We=Number(Se??d),Ge=Ce??ne,Ke=!M,Z=Ke?de(_e):``,qe=Ke&&!!Z,Je=o({enabled:!b&&n===`grid`,containerRef:Ae,firstRowItemRef:je,columns:K,itemsCount:Y.length,deps:[n]}),Ye=s({enabled:!b&&n===`waterfall`,containerRef:ke,firstRowRef:W,deps:[n,Y.length]}),Xe=n===`grid`?Je:Ye,Ze=p(async()=>{if(b)return;if(G.current===J){G.current=J;return}let t=j||!!I;if(G.current=J,t)try{if(Pe(),!j){if(!I)return;R(await oe(L));return}let t=await e({page_size:q,tags:P.length>0?P:void 0,cat_id:F||void 0},{cache:`no-store`}),n=Array.isArray(t.data?.videos)?t.data.videos:[],r=t.data?.cursor;R(n),V(r)}catch(e){console.error(`推荐位刷新首屏失败(client)`,e)}finally{Fe()}},[Fe,b,j,I,J,F,q,P,L,Pe]);m(()=>{Ze()},[Ze]);let Qe=p(async()=>{let t=B;if(!(!N||!t||Me.current)){Me.current=!0,Oe(!0);try{let n=await e({cursor:t,page_size:q,tags:P.length>0?P:void 0,cat_id:F||void 0}),r=Array.isArray(n.data?.videos)?n.data.videos:[],i=n.data?.cursor;r.length>0&&R(e=>e.concat(r)),V(e=>{if(!(!r.length||!i))return i===e?void 0:i})}catch(e){console.error(`推荐位加载下一页失败(client)`,e),V(void 0)}finally{Me.current=!1,Oe(!1)}}},[B,F,q,P,N]),$e=p(()=>{if(Z){if(Z.startsWith(`http`)){window.location.href=Z;return}S.push(Z)}},[Z,S]);m(()=>{let e=U.current;if(!e||!N||!Ve)return;let t=new IntersectionObserver(e=>{!e[0]?.isIntersecting||H||Qe()},{root:null,threshold:0});return t.observe(e),()=>{t.disconnect()}},[Qe,Ve,H,Y.length,q,N,X]),se(()=>{let e=ke.current;if(!e||n!==`waterfall`)return;let t=()=>{let t=e.clientWidth||0;Ee(t>0?(t-12)/2:0)};t();let r=new ResizeObserver(t);return r.observe(e),()=>{r.disconnect()}},[n]);let Q=h(()=>n===`waterfall`?ye(Y,ze,Te):{left:[],right:[]},[Te,ze,Y,n]);if(m(()=>{n===`waterfall`&&(Q.left.length||(W.current.left=null),Q.right.length||(W.current.right=null))},[n,Q.left.length,Q.right.length]),!Y.length)return null;let $=!b&&Ne,et=!b&&H,tt=Xe>0?Xe/2:160;return y(r,{className:`w-full mt-[16px]`,children:[y(r,{className:`flex items-center justify-between px-[12px] mb-[8px]`,children:[v(i,{className:`flex-1 min-w-0 text-text1 text-[18px] leading-[26px] font-bold line-clamp-1`,children:He}),qe&&v(i,{className:`text-text3 text-[12px] leading-[18px] cursor-pointer`,onClick:$e,children:`更多`})]}),n===`grid`&&y(r,{ref:Ae,className:`w-full flex flex-wrap px-[12px] relative`,children:[Y.map((e,t)=>{let r=ze[t],i=pe(e),a=Ue&&(i?.showPlayCount??!0),o=i?.playCountDelta??We,s=i?.showEpisode??Ge,c=t%K,l=K>1?{paddingLeft:12*c/K,paddingRight:12*(K-c-1)/K}:void 0;return v(`div`,{ref:e=>{t===X&&(U.current=e),t<K&&(je.current[t]=e)},className:`min-w-0`,style:{width:`${100/K}%`,...l||{}},children:v(x,{variant:n,item:e,icon:r,index:t,showPlayCount:a,playCountDelta:o,showEpisode:s,widthStyle:{width:`100%`}})},k(e,t))}),$&&v(r,{className:`absolute inset-0 z-10 bg-black/15 backdrop-blur-[1px] dark:bg-white/10`,"aria-hidden":!0}),$&&v(r,{className:`absolute left-1/2 -translate-x-1/2 -translate-y-1/2 z-20 pointer-events-none`,style:{top:tt},"aria-hidden":!0,children:v(a,{size:`large`,showLabel:!1,className:`text-theme5`})})]}),n===`waterfall`&&y(r,{ref:ke,className:`w-full px-[12px] flex gap-[12px] relative`,children:[v(r,{className:`flex-1 min-w-0 flex flex-col`,children:Q.left.map((e,t)=>{let r=pe(e.item),i=Ue&&(r?.showPlayCount??!0),a=r?.playCountDelta??We,o=r?.showEpisode??Ge;return v(`div`,{ref:n=>{e.index===X&&(U.current=n),t===0&&(W.current.left=n)},children:v(x,{variant:n,item:e.item,icon:e.icon,index:e.index,showPlayCount:i,playCountDelta:a,showEpisode:o,widthStyle:{width:`100%`}})},k(e.item,e.index))})}),v(r,{className:`flex-1 min-w-0 flex flex-col`,children:Q.right.map((e,t)=>{let r=pe(e.item),i=Ue&&(r?.showPlayCount??!0),a=r?.playCountDelta??We,o=r?.showEpisode??Ge;return v(`div`,{ref:n=>{e.index===X&&(U.current=n),t===0&&(W.current.right=n)},children:v(x,{variant:n,item:e.item,icon:e.icon,index:e.index,showPlayCount:i,playCountDelta:a,showEpisode:o,widthStyle:{width:`100%`}})},k(e.item,e.index))})}),$&&v(r,{className:`absolute inset-0 z-10 bg-black/15 backdrop-blur-[1px] dark:bg-white/10`,"aria-hidden":!0}),$&&v(r,{className:`absolute left-1/2 -translate-x-1/2 -translate-y-1/2 z-20 pointer-events-none`,style:{top:tt},"aria-hidden":!0,children:v(a,{size:`large`,showLabel:!1,className:`text-theme5`})})]}),et&&v(r,{className:`w-full flex justify-center py-[12px]`,children:v(a,{size:`medium`,showLabel:!1,className:`text-theme5`})})]})}function x({variant:e,item:t,icon:n,index:a,showPlayCount:o,playCountDelta:s,showEpisode:c,widthStyle:ee}){let te=me(t),d=t.name||t?.title||``,ne=he(ge(t.static?.browse_cnt??0,s)),f=T(t,c),re=ve(t,n,a);return v(u,{url:te,text:d,className:`w-full`,style:ee,topRightChild:re?v(S,{url:re}):void 0,bottomLeftChild:o?y(r,{className:`h-[20px] leading-[20px] text-[#fff] text-[12px] px-[4px] py-0 rounded-[4px] bg-[rgba(255,255,255,0.1)] ml-[4px] flex items-center gap-[4px]`,children:[v(l,{className:`w-[12px] h-[12px] text-[#fff] shrink-0`}),ne]}):null,bottomRightChild:c?f&&v(i,{className:`text-[#fff] text-[12px] leading-[18px] pr-2`,children:f}):null,textChild:v(r,{className:`py-[4px]`,children:v(i,{as:`h3`,className:`text-text1 text-[16px] leading-[24px] ${e===`waterfall`?`break-words line-clamp-3`:`line-clamp-1`}`,children:d})}),linkPath:C(t)})}function S({url:e}){return v(r,{className:`relative w-[40px] h-[20px]`,children:v(n,{src:e,alt:`corner`,width:40,height:20,className:`w-full h-auto`})})}function C(e){let t=encodeURIComponent(e.name||``);return`/video/${e.id||``}/${t}/episode/1`}function de(e){return e?e.trim():``}function fe(e,t,n){let r=Number(e);return!Number.isFinite(r)||r<=0?t:Math.min(n,Math.floor(r))}function pe(e){return e[ae]}function me(e){return e.img_y||e.img_x||e?.coverUrl}function w(e){return typeof e==`string`?e:``}function T(e,t){if(!t)return``;if(E(e)){let t=e.update_status===`0`,n=Number(e.episode_cnt||e.links?.length||0);return n>0?`${t?`更新至`:`全`}${n}集`:``}return D(Number(e.duration||0))}function E(e){if(Number(e.type??0)===2)return!0;let t=Number(e.episode_cnt||e.links?.length||0);return Number.isFinite(t)&&t>1}function he(e){return!Number.isFinite(e)||e<=0?`0`:e>=1e6?`${_e(e/1e6)}M`:e>=1e3?`${_e(e/1e3)}k`:Math.floor(e).toString()}function ge(e,t){let n=Number(e||0),r=Number(t||0);return!Number.isFinite(n)||!Number.isFinite(r)?0:Math.max(0,n+r)}function _e(e){let t=e.toFixed(1);return t.endsWith(`.0`)?t.slice(0,-2):t}function D(e){if(!Number.isFinite(e)||e<=0)return``;let t=Math.floor(e),n=Math.floor(t/3600),r=Math.floor(t%3600/60),i=t%60,a=e=>String(e).padStart(2,`0`);return n>0?`${a(n)}:${a(r)}:${a(i)}`:`${a(r)}:${a(i)}`}function ve(e,t,n){return w(e.badge_url)||w(t?.material_url)||``}function ye(e,t,n){let r=[],i=[],a=n<=0,o=0,s=0;return e.forEach((e,c)=>{let l=t[c];if(a){c%2==0?r.push({item:e,icon:l,index:c}):i.push({item:e,icon:l,index:c});return}let u=O(n,e);o<=s?(r.push({item:e,icon:l,index:c}),o+=u):(i.push({item:e,icon:l,index:c}),s+=u)}),{left:r,right:i}}function O(e,t){if(!e)return 0;let n=e*1.3461538461538463,r=T(t,!0)?18:0;return n+20+r+6+16}function k(e,t){return e.id?`home-recommend-${e.id}`:`home-recommend-${t}`}export{b as default};
@@ -6,7 +6,7 @@ import * as class_variance_authority_types0 from "class-variance-authority/types
6
6
  //#region components/ui/badge.d.ts
7
7
  /** badgeVariants 工具定义。 */
8
8
  declare const badgeVariants: (props?: ({
9
- variant?: "default" | "link" | "destructive" | "secondary" | "outline" | "ghost" | null | undefined;
9
+ variant?: "link" | "default" | "destructive" | "secondary" | "outline" | "ghost" | null | undefined;
10
10
  } & class_variance_authority_types0.ClassProp) | undefined) => string;
11
11
  /** Badge 组件。 */
12
12
  declare function Badge({
@@ -7,7 +7,7 @@ import * as class_variance_authority_types0 from "class-variance-authority/types
7
7
  //#region components/ui/button.d.ts
8
8
  /** buttonVariants 工具定义。 */
9
9
  declare const buttonVariants: (props?: ({
10
- variant?: "default" | "link" | "destructive" | "secondary" | "outline" | "ghost" | null | undefined;
10
+ variant?: "link" | "default" | "destructive" | "secondary" | "outline" | "ghost" | null | undefined;
11
11
  size?: "default" | "icon" | "xs" | "sm" | "lg" | "icon-xs" | "icon-sm" | "icon-lg" | null | undefined;
12
12
  } & class_variance_authority_types0.ClassProp) | undefined) => string;
13
13
  /** Button 组件属性。 */
@@ -1,11 +1,11 @@
1
1
 
2
2
  import * as React from "react";
3
3
  import * as react_jsx_runtime0 from "react/jsx-runtime";
4
- import Image from "next/image";
4
+ import NextImage from "next/image";
5
5
 
6
6
  //#region components/ui/image.d.ts
7
7
  /** BaseImageProps 属性定义。 */
8
- type BaseImageProps = Omit<React.ComponentPropsWithoutRef<typeof Image>, 'className' | 'src' | 'alt' | 'width' | 'height' | 'loading' | 'priority' | 'fill' | 'style'>;
8
+ type BaseImageProps = Omit<React.ComponentPropsWithoutRef<typeof NextImage>, 'className' | 'src' | 'alt' | 'width' | 'height' | 'loading' | 'priority' | 'fill' | 'style'>;
9
9
  type CommonImageProps = BaseImageProps & {
10
10
  /** 图片地址,支持普通 URL、默认资源路径和加密地址。 */src: string; /** 图片替代文本。 */
11
11
  alt?: string; /** 图片类名。 */
@@ -27,6 +27,6 @@ type ImagePropsWithSize = CommonImageProps & {
27
27
  /** ImageProps 属性定义。 */
28
28
  type ImageProps = ImagePropsWithFill | ImagePropsWithSize;
29
29
  /** 图片组件:支持 bnc 解密、默认资源域名拼接与错误占位。 */
30
- declare function Image$1(props: ImageProps): react_jsx_runtime0.JSX.Element;
30
+ declare function Image(props: ImageProps): react_jsx_runtime0.JSX.Element;
31
31
  //#endregion
32
- export { BaseImageProps, CommonImageProps, Image$1 as Image, ImageProps, ImagePropsWithFill, ImagePropsWithSize };
32
+ export { BaseImageProps, CommonImageProps, Image, ImageProps, ImagePropsWithFill, ImagePropsWithSize };
@@ -6,10 +6,10 @@ type InspectorFieldOption<T> = Omit<T, 'type'>;
6
6
  declare const stringInspectorFieldSchema: z.ZodObject<{
7
7
  type: z.ZodLiteral<"string">;
8
8
  fieldType: z.ZodOptional<z.ZodEnum<{
9
+ select: "select";
9
10
  input: "input";
10
11
  textarea: "textarea";
11
12
  color: "color";
12
- select: "select";
13
13
  }>>;
14
14
  defaultValue: z.ZodOptional<z.ZodString>;
15
15
  label: z.ZodOptional<z.ZodString>;
@@ -68,10 +68,10 @@ type ObjectInspectorFieldOption = InspectorFieldOption<z.infer<typeof objectInsp
68
68
  declare const componentInspectorFieldMetaSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
69
69
  type: z.ZodLiteral<"string">;
70
70
  fieldType: z.ZodOptional<z.ZodEnum<{
71
+ select: "select";
71
72
  input: "input";
72
73
  textarea: "textarea";
73
74
  color: "color";
74
- select: "select";
75
75
  }>>;
76
76
  defaultValue: z.ZodOptional<z.ZodString>;
77
77
  label: z.ZodOptional<z.ZodString>;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@funhub/platform",
3
3
  "type": "module",
4
- "version": "0.1.159",
4
+ "version": "0.1.160",
5
5
  "private": false,
6
6
  "sideEffects": [
7
7
  "**/*.css"