@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.
- package/dist/components/biz/business/banner-carousel/client.d.mts +19 -0
- package/dist/components/biz/business/banner-carousel/client.mjs +1 -1
- package/dist/components/biz/business/banner-carousel/default-props.mjs +1 -1
- package/dist/components/biz/business/banner-carousel/material.d.mts +4 -1
- package/dist/components/biz/business/banner-carousel/material.mjs +1 -1
- package/dist/components/biz/business/banner-carousel/schema.d.mts +2 -0
- package/dist/components/biz/business/banner-carousel/schema.mjs +1 -1
- package/dist/components/biz/business/banner-carousel/server.d.mts +4 -2
- package/dist/components/biz/business/banner-carousel/server.mjs +1 -1
- package/dist/components/biz/business/channel-list/client.mjs +1 -1
- package/dist/components/biz/business/home-recommend/shared/home-recommend-base.mjs +1 -1
- package/dist/components/ui/badge.d.mts +1 -1
- package/dist/components/ui/button.d.mts +1 -1
- package/dist/components/ui/image.d.mts +4 -4
- package/dist/utils/schema/inspector.d.mts +2 -2
- package/package.json +1 -1
|
@@ -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
|
|
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:!
|
|
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
|
|
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
|
|
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
|
|
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{
|
|
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
|
|
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
|
|
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?: "
|
|
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?: "
|
|
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
|
|
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
|
|
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
|
|
30
|
+
declare function Image(props: ImageProps): react_jsx_runtime0.JSX.Element;
|
|
31
31
|
//#endregion
|
|
32
|
-
export { BaseImageProps, CommonImageProps, Image
|
|
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>;
|