@xiping/react-components 1.0.57 → 1.0.58
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/cjs/components/video-subtitle-player/VideoSubtitlePlayer.css +1 -1
- package/dist/cjs/components/video-subtitle-player/VideoSubtitlePlayer.d.ts +3 -3
- package/dist/cjs/components/video-subtitle-player/VideoSubtitlePlayer.js +1 -1
- package/dist/cjs/components/video-subtitle-player/VideoSubtitlePlayer.mobile.css +1 -0
- package/dist/cjs/components/video-subtitle-player/VideoSubtitlePlayer.pc.css +1 -0
- package/dist/cjs/components/video-subtitle-player/VideoSubtitlePlayerMobile.d.ts +20 -0
- package/dist/cjs/components/video-subtitle-player/VideoSubtitlePlayerMobile.js +1 -0
- package/dist/cjs/components/video-subtitle-player/VideoSubtitlePlayerPC.d.ts +23 -0
- package/dist/cjs/components/video-subtitle-player/VideoSubtitlePlayerPC.js +1 -0
- package/dist/cjs/components/video-subtitle-player/layouts/VideoSubtitlePlayerLayoutMobile.d.ts +8 -0
- package/dist/cjs/components/video-subtitle-player/layouts/VideoSubtitlePlayerLayoutMobile.js +1 -0
- package/dist/cjs/components/video-subtitle-player/layouts/VideoSubtitlePlayerLayoutPC.d.ts +6 -0
- package/dist/cjs/components/video-subtitle-player/layouts/VideoSubtitlePlayerLayoutPC.js +1 -0
- package/dist/cjs/components/video-subtitle-player/layouts/index.d.ts +3 -0
- package/dist/cjs/components/video-subtitle-player/layouts/types.d.ts +17 -0
- package/dist/cjs/components/video-subtitle-player/useXGPlayer.d.ts +10 -0
- package/dist/cjs/components/video-subtitle-player/useXGPlayer.js +1 -0
- package/dist/cjs/react-components.css +114 -0
- package/dist/es/components/video-subtitle-player/VideoSubtitlePlayer.css +1 -1
- package/dist/es/components/video-subtitle-player/VideoSubtitlePlayer.d.ts +3 -3
- package/dist/es/components/video-subtitle-player/VideoSubtitlePlayer.js +66 -126
- package/dist/es/components/video-subtitle-player/VideoSubtitlePlayer.mobile.css +1 -0
- package/dist/es/components/video-subtitle-player/VideoSubtitlePlayer.pc.css +1 -0
- package/dist/es/components/video-subtitle-player/VideoSubtitlePlayerMobile.d.ts +20 -0
- package/dist/es/components/video-subtitle-player/VideoSubtitlePlayerMobile.js +47 -0
- package/dist/es/components/video-subtitle-player/VideoSubtitlePlayerPC.d.ts +23 -0
- package/dist/es/components/video-subtitle-player/VideoSubtitlePlayerPC.js +75 -0
- package/dist/es/components/video-subtitle-player/layouts/VideoSubtitlePlayerLayoutMobile.d.ts +8 -0
- package/dist/es/components/video-subtitle-player/layouts/VideoSubtitlePlayerLayoutMobile.js +21 -0
- package/dist/es/components/video-subtitle-player/layouts/VideoSubtitlePlayerLayoutPC.d.ts +6 -0
- package/dist/es/components/video-subtitle-player/layouts/VideoSubtitlePlayerLayoutPC.js +50 -0
- package/dist/es/components/video-subtitle-player/layouts/index.d.ts +3 -0
- package/dist/es/components/video-subtitle-player/layouts/types.d.ts +17 -0
- package/dist/es/components/video-subtitle-player/useXGPlayer.d.ts +10 -0
- package/dist/es/components/video-subtitle-player/useXGPlayer.js +36 -0
- package/dist/es/react-components.css +114 -0
- package/package.json +9 -6
|
@@ -1 +1 @@
|
|
|
1
|
-
.xiping-video-subtitle-player{width:100%;height:100%;background:#1a1a1a;border-radius:8px;overflow:hidden;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.xiping-video-subtitle-player__video-wrapper{width:100%;height:100%;background:#000;overflow:hidden}.xiping-video-subtitle-player__video-container{position:relative;width:100%;height:100%;background:#000;overflow:hidden}.xiping-video-subtitle-player__video{position:absolute;top:0;left:0;width:100%;height:100%;padding:0}.xiping-video-subtitle-player__video-container .xgplayer{width:100%!important;height:100%!important}.xiping-video-subtitle-player__video-container .xgplayer video{-o-object-fit:fill!important;object-fit:fill!important}.xiping-video-subtitle-player__subtitle-container{width:100%;height:100%;padding:20px;overflow-y:auto;background:#0000004d}.xiping-video-subtitle-
|
|
1
|
+
.xiping-video-subtitle-player{width:100%;height:100%;background:#1a1a1a;border-radius:8px;overflow:hidden;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.xiping-video-subtitle-player__video-wrapper{width:100%;height:100%;background:#000;overflow:hidden}.xiping-video-subtitle-player__video-container{position:relative;width:100%;height:100%;background:#000;overflow:hidden}.xiping-video-subtitle-player__video{position:absolute;top:0;left:0;width:100%;height:100%;padding:0}.xiping-video-subtitle-player__video-container .xgplayer{width:100%!important;height:100%!important}.xiping-video-subtitle-player__video-container .xgplayer video{-o-object-fit:fill!important;object-fit:fill!important}.xiping-video-subtitle-player__subtitle-container{width:100%;height:100%;padding:20px;overflow-y:auto;background:#0000004d}.xiping-video-subtitle-player__right{width:100%;height:100%;background:#00000080;display:flex;flex-direction:column}.xiping-video-subtitle-player__detail{flex:1;padding:24px;overflow-y:auto;color:#fff}.xiping-video-subtitle-player__detail-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:16px;color:#ffffffb3}.xiping-video-subtitle-player__detail-loading-spinner{width:40px;height:40px;border:3px solid rgba(255,255,255,.1);border-top-color:#fbbf24;border-radius:50%;animation:xiping-vsp-spin 1s linear infinite}@keyframes xiping-vsp-spin{to{transform:rotate(360deg)}}.xiping-video-subtitle-player__detail-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:16px;color:#ffffff80;text-align:center}.xiping-video-subtitle-player__detail-empty-icon{font-size:48px;opacity:.5}.xiping-video-subtitle-player__detail-empty-text{font-size:14px;line-height:1.6}.xiping-video-subtitle-player__detail-content{display:flex;flex-direction:column;gap:20px}.xiping-video-subtitle-player__detail-word{font-size:32px;font-weight:700;color:#fbbf24;line-height:1.2;margin-bottom:8px}.xiping-video-subtitle-player__detail-pronunciation{font-size:18px;color:#ffffffb3;font-style:italic;margin-bottom:4px}.xiping-video-subtitle-player__detail-pos{display:inline-block;padding:4px 12px;background:#fbbf2433;color:#fbbf24;border-radius:4px;font-size:12px;font-weight:600;text-transform:uppercase;width:-moz-fit-content;width:fit-content;margin-bottom:8px}.xiping-video-subtitle-player__detail-label{font-size:12px;font-weight:600;color:#ffffff80;text-transform:uppercase;letter-spacing:.05em;margin-bottom:8px}.xiping-video-subtitle-player__detail-text{font-size:16px;line-height:1.6;color:#ffffffe6}.xiping-video-subtitle-player__detail-translation,.xiping-video-subtitle-player__detail-definition{padding-bottom:16px;border-bottom:1px solid rgba(255,255,255,.1)}.xiping-video-subtitle-player__detail-definition{border-bottom:none}.xiping-video-subtitle-player__detail-examples{display:flex;flex-direction:column;gap:16px}.xiping-video-subtitle-player__detail-example{padding:16px;background:#ffffff0d;border-radius:8px;border-left:3px solid #fbbf24}.xiping-video-subtitle-player__detail-example-en{font-size:15px;line-height:1.6;color:#fffffff2;margin-bottom:8px}.xiping-video-subtitle-player__detail-example-zh{font-size:14px;line-height:1.6;color:#ffffffb3;padding-left:12px;border-left:2px solid rgba(255,255,255,.2)}.xiping-video-subtitle-player__subtitle-container::-webkit-scrollbar,.xiping-video-subtitle-player__detail::-webkit-scrollbar{width:8px}.xiping-video-subtitle-player__subtitle-container::-webkit-scrollbar-track,.xiping-video-subtitle-player__detail::-webkit-scrollbar-track{background:#ffffff0d;border-radius:4px}.xiping-video-subtitle-player__subtitle-container::-webkit-scrollbar-thumb,.xiping-video-subtitle-player__detail::-webkit-scrollbar-thumb{background:#fff3;border-radius:4px}.xiping-video-subtitle-player__subtitle-container::-webkit-scrollbar-thumb:hover,.xiping-video-subtitle-player__detail::-webkit-scrollbar-thumb:hover{background:#ffffff4d}
|
|
@@ -13,11 +13,11 @@ export interface VideoSubtitlePlayerProps {
|
|
|
13
13
|
style?: React.CSSProperties;
|
|
14
14
|
/** 自定义详情获取函数,用于调用大模型API */
|
|
15
15
|
onFetchDetail?: (target: HoverTarget | null) => Promise<void>;
|
|
16
|
+
/** 强制使用布局:传入则不再做设备检测,直接使用对应布局 */
|
|
17
|
+
forceLayout?: "mobile" | "pc";
|
|
16
18
|
}
|
|
17
19
|
/**
|
|
18
|
-
*
|
|
19
|
-
* 左侧:上部分视频播放器(填充模式),下部分字幕显示
|
|
20
|
-
* 右侧:字幕详情(单词/短语的发音、解释等)
|
|
20
|
+
* 视频字幕播放器:根据设备或 forceLayout 选择 PC 或移动端视图,二者完全分离
|
|
21
21
|
*/
|
|
22
22
|
export declare const VideoSubtitlePlayer: React.FC<VideoSubtitlePlayerProps>;
|
|
23
23
|
export default VideoSubtitlePlayer;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require('./VideoSubtitlePlayer.css');
|
|
1
|
+
"use strict";Object.defineProperties(exports,{__esModule:{value:!0},[Symbol.toStringTag]:{value:"Module"}});require('./VideoSubtitlePlayer.css');const b=require("react/jsx-runtime"),o=require("react"),S=require("react-device-detect"),W=require("./useVideoSubtitleStore.js"),j=require("./useXGPlayer.js"),k=require("./VideoSubtitlePlayerPC.js"),m=require("./VideoSubtitlePlayerMobile.js");;/* empty css */const y=({videoUrl:P,subtitles:r,poster:C,className:s="",style:a,onFetchDetail:e,forceLayout:n})=>{const u=o.useRef(null),f=n!==void 0?n==="mobile":S.isMobile||S.isTablet,{currentTime:l,setCurrentTime:q,setIsPlaying:V,setSubtitles:c,currentDetail:v,isLoadingDetail:M,fetchDetail:t}=W.useVideoSubtitleStore();o.useEffect(()=>{c(r)},[r,c]),j.useXGPlayer(u,P,C,{setCurrentTime:q,setIsPlaying:V},l);const d=o.useCallback(async i=>{e?await e(i):await t(i)},[e,t]),g=o.useCallback(async i=>{e?await e(i):await t(i)},[e,t]);return f?b.jsx(m.VideoSubtitlePlayerMobile,{playerRef:u,subtitles:r,currentTime:l,onWordHoverChange:d,onWordClick:g,className:s,style:a}):b.jsx(k.VideoSubtitlePlayerPC,{playerRef:u,subtitles:r,currentTime:l,currentDetail:v,isLoadingDetail:M,onWordHoverChange:d,className:s,style:a})};exports.VideoSubtitlePlayer=y;exports.default=y;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.xiping-video-subtitle-player--mobile{display:flex;flex-direction:column;min-height:0;height:100%}.xiping-video-subtitle-player__mobile-video{flex:0 0 auto;width:100%;aspect-ratio:16 / 9;background:#000}.xiping-video-subtitle-player__mobile-video-wrapper{width:100%;height:100%;background:#000;overflow:hidden}.xiping-video-subtitle-player__mobile-video-container{position:relative;width:100%;height:100%;background-color:#a62c2c;overflow:hidden}.xiping-video-subtitle-player__mobile-video-container .xgplayer{width:100%!important;height:100%!important}.xiping-video-subtitle-player__mobile-video-container .xgplayer video{-o-object-fit:fill!important;object-fit:fill!important}.xiping-video-subtitle-player__mobile-subtitle{flex:1;min-height:0;padding:12px 16px;overflow-y:auto;background:#0000004d;-webkit-overflow-scrolling:touch}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.xiping-video-subtitle-player--pc .xiping-video-subtitle-player__panel-group,.xiping-video-subtitle-player--pc .xiping-video-subtitle-player__panel-group-inner{width:100%;height:100%}.xiping-video-subtitle-player--pc .xiping-video-subtitle-player__right{border-left:1px solid rgba(255,255,255,.1)}.xiping-video-subtitle-player__resize-handle--horizontal{position:relative;width:2px;background:#ffffff1a;cursor:col-resize;transition:background .2s ease;flex-shrink:0}.xiping-video-subtitle-player__resize-handle--horizontal:hover{background:#fbbf2480}.xiping-video-subtitle-player__resize-handle--horizontal:active{background:#fbbf24cc}.xiping-video-subtitle-player__resize-handle--horizontal:before{content:"";position:absolute;inset:0 -4px;cursor:col-resize}.xiping-video-subtitle-player__resize-handle--vertical{position:relative;height:2px;background:#ffffff1a;cursor:row-resize;transition:background .2s ease;flex-shrink:0}.xiping-video-subtitle-player__resize-handle--vertical:hover{background:#fbbf2480}.xiping-video-subtitle-player__resize-handle--vertical:active{background:#fbbf24cc}.xiping-video-subtitle-player__resize-handle--vertical:before{content:"";position:absolute;inset:-4px 0;cursor:row-resize}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { default as React, RefObject } from 'react';
|
|
2
|
+
import { SubtitleData, HoverTarget, WordClickTarget } from '../subtitle-player/SubtitlePlayer';
|
|
3
|
+
export interface VideoSubtitlePlayerMobileProps {
|
|
4
|
+
/** 播放器挂载的容器 ref */
|
|
5
|
+
playerRef: RefObject<HTMLDivElement | null>;
|
|
6
|
+
/** 字幕数据 */
|
|
7
|
+
subtitles: SubtitleData[];
|
|
8
|
+
/** 当前播放时间(秒) */
|
|
9
|
+
currentTime: number;
|
|
10
|
+
/** 单词 hover 变化时拉取/展示详情(可为弹窗等) */
|
|
11
|
+
onWordHoverChange: (target: HoverTarget | null) => void | Promise<void>;
|
|
12
|
+
/** 单词点击时拉取/展示详情(移动端主要交互) */
|
|
13
|
+
onWordClick: (target: WordClickTarget) => void | Promise<void>;
|
|
14
|
+
className?: string;
|
|
15
|
+
style?: React.CSSProperties;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 移动端视图:上下两栏(视频 + 字幕),无右侧详情区,详情后续以弹窗等形式实现
|
|
19
|
+
*/
|
|
20
|
+
export declare const VideoSubtitlePlayerMobile: React.FC<VideoSubtitlePlayerMobileProps>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const t=require("react/jsx-runtime"),o=require("react"),S=require("clsx"),P=require("../subtitle-player/SubtitlePlayer.js"),v=require("./layouts/VideoSubtitlePlayerLayoutMobile.js"),x=({playerRef:a,subtitles:r,currentTime:s,onWordHoverChange:i,onWordClick:l,className:c="",style:u})=>{const n=o.useCallback(async e=>{await i(e)},[i]),b=o.useCallback(async e=>{await l(e)},[l]),d=t.jsx("div",{ref:a,className:"xiping-video-subtitle-player__video"}),y=t.jsx(P.SubtitlePlayer,{subtitles:r,currentTime:s,mode:"lyrics",onWordHoverChange:n,onWordClick:b});return t.jsx(v.VideoSubtitlePlayerLayoutMobile,{className:S(c),style:u,videoSlot:d,subtitleSlot:y})};exports.VideoSubtitlePlayerMobile=x;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { default as React, RefObject } from 'react';
|
|
2
|
+
import { SubtitleData, HoverTarget } from '../subtitle-player/SubtitlePlayer';
|
|
3
|
+
import { SubtitleDetail } from './useVideoSubtitleStore';
|
|
4
|
+
export interface VideoSubtitlePlayerPCProps {
|
|
5
|
+
/** 播放器挂载的容器 ref */
|
|
6
|
+
playerRef: RefObject<HTMLDivElement | null>;
|
|
7
|
+
/** 字幕数据 */
|
|
8
|
+
subtitles: SubtitleData[];
|
|
9
|
+
/** 当前播放时间(秒) */
|
|
10
|
+
currentTime: number;
|
|
11
|
+
/** 当前悬停单词的详情 */
|
|
12
|
+
currentDetail: SubtitleDetail | null;
|
|
13
|
+
/** 是否正在加载详情 */
|
|
14
|
+
isLoadingDetail: boolean;
|
|
15
|
+
/** 单词 hover 变化时拉取/展示详情 */
|
|
16
|
+
onWordHoverChange: (target: HoverTarget | null) => void | Promise<void>;
|
|
17
|
+
className?: string;
|
|
18
|
+
style?: React.CSSProperties;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* PC 端视图:可拖拽分栏 + 右侧详情区,所有 PC 专属 UI 集中在此
|
|
22
|
+
*/
|
|
23
|
+
export declare const VideoSubtitlePlayerPC: React.FC<VideoSubtitlePlayerPCProps>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const e=require("react/jsx-runtime"),y=require("react"),m=require("clsx"),b=require("../subtitle-player/SubtitlePlayer.js"),u=require("./layouts/VideoSubtitlePlayerLayoutPC.js"),g=({playerRef:a,subtitles:t,currentTime:d,currentDetail:i,isLoadingDetail:n,onWordHoverChange:s,className:o="",style:p})=>{const x=y.useCallback(async l=>{await s(l)},[s]),c=e.jsx("div",{ref:a,className:"xiping-video-subtitle-player__video"}),r=e.jsx(b.SubtitlePlayer,{subtitles:t,currentTime:d,mode:"lyrics",onWordHoverChange:x}),v=e.jsx("div",{className:"xiping-video-subtitle-player__detail",children:n?e.jsxs("div",{className:"xiping-video-subtitle-player__detail-loading",children:[e.jsx("div",{className:"xiping-video-subtitle-player__detail-loading-spinner"}),e.jsx("span",{children:"加载中..."})]}):i?e.jsxs("div",{className:"xiping-video-subtitle-player__detail-content",children:[e.jsx("div",{className:"xiping-video-subtitle-player__detail-word",children:i.word}),i.pronunciation&&e.jsx("div",{className:"xiping-video-subtitle-player__detail-pronunciation",children:i.pronunciation}),i.partOfSpeech&&e.jsx("div",{className:"xiping-video-subtitle-player__detail-pos",children:i.partOfSpeech}),i.translation&&e.jsxs("div",{className:"xiping-video-subtitle-player__detail-translation",children:[e.jsx("div",{className:"xiping-video-subtitle-player__detail-label",children:"中文翻译"}),e.jsx("div",{className:"xiping-video-subtitle-player__detail-text",children:i.translation})]}),i.definition&&e.jsxs("div",{className:"xiping-video-subtitle-player__detail-definition",children:[e.jsx("div",{className:"xiping-video-subtitle-player__detail-label",children:"英文解释"}),e.jsx("div",{className:"xiping-video-subtitle-player__detail-text",children:i.definition})]}),i.examples&&i.examples.length>0&&e.jsxs("div",{className:"xiping-video-subtitle-player__detail-examples",children:[e.jsx("div",{className:"xiping-video-subtitle-player__detail-label",children:"例句"}),i.examples.map((l,_)=>e.jsxs("div",{className:"xiping-video-subtitle-player__detail-example",children:[e.jsx("div",{className:"xiping-video-subtitle-player__detail-example-en",children:l.sentence}),e.jsx("div",{className:"xiping-video-subtitle-player__detail-example-zh",children:l.translation})]},_))]})]}):e.jsxs("div",{className:"xiping-video-subtitle-player__detail-empty",children:[e.jsx("div",{className:"xiping-video-subtitle-player__detail-empty-icon",children:"📖"}),e.jsx("div",{className:"xiping-video-subtitle-player__detail-empty-text",children:"将鼠标悬停在字幕单词上查看详情"})]})});return e.jsx(u.VideoSubtitlePlayerLayoutPC,{className:m(o),style:p,videoSlot:c,subtitleSlot:r,detailSlot:v})};exports.VideoSubtitlePlayerPC=g;
|
package/dist/cjs/components/video-subtitle-player/layouts/VideoSubtitlePlayerLayoutMobile.d.ts
ADDED
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { VideoSubtitlePlayerLayoutMobileProps } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* 移动端布局:上下两栏,无拖拽
|
|
5
|
+
* - 上:视频区域(100vw 宽,16:9 占位)
|
|
6
|
+
* - 下:仅字幕区域(单词详情后续以弹窗等形式实现,此处不展示)
|
|
7
|
+
*/
|
|
8
|
+
export declare const VideoSubtitlePlayerLayoutMobile: React.FC<VideoSubtitlePlayerLayoutMobileProps>;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../VideoSubtitlePlayer.mobile.css');const e=require("react/jsx-runtime"),o=require("clsx");;/* empty css */const r=({className:i="",style:l,videoSlot:t,subtitleSlot:s})=>e.jsxs("div",{className:o("xiping-video-subtitle-player","xiping-video-subtitle-player--mobile",i),style:l,children:[e.jsx("div",{className:"xiping-video-subtitle-player__mobile-video",children:e.jsx("div",{className:"xiping-video-subtitle-player__mobile-video-wrapper",children:e.jsx("div",{className:"xiping-video-subtitle-player__mobile-video-container",children:t})})}),e.jsx("div",{className:"xiping-video-subtitle-player__mobile-subtitle",children:s})]});exports.VideoSubtitlePlayerLayoutMobile=r;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../VideoSubtitlePlayer.pc.css');const e=require("react/jsx-runtime"),i=require("react-resizable-panels"),l=require("clsx");;/* empty css */const d=({className:a="",style:r,videoSlot:t,subtitleSlot:s,detailSlot:n})=>e.jsx("div",{className:l("xiping-video-subtitle-player","xiping-video-subtitle-player--pc",a),style:r,children:e.jsxs(i.Group,{orientation:"horizontal",className:"xiping-video-subtitle-player__panel-group",children:[e.jsx(i.Panel,{defaultSize:"65",minSize:"40",children:e.jsxs(i.Group,{orientation:"vertical",className:"xiping-video-subtitle-player__panel-group-inner",children:[e.jsx(i.Panel,{defaultSize:"60",minSize:"30",children:e.jsx("div",{className:"xiping-video-subtitle-player__video-wrapper",children:e.jsx("div",{className:"xiping-video-subtitle-player__video-container",children:t})})}),e.jsx(i.Separator,{className:l("xiping-video-subtitle-player__resize-handle","xiping-video-subtitle-player__resize-handle--vertical")}),e.jsx(i.Panel,{defaultSize:"40",minSize:"20",children:e.jsx("div",{className:"xiping-video-subtitle-player__subtitle-container",children:s})})]})}),e.jsx(i.Separator,{className:l("xiping-video-subtitle-player__resize-handle","xiping-video-subtitle-player__resize-handle--horizontal")}),e.jsx(i.Panel,{defaultSize:"35",minSize:"25",maxSize:"50",children:e.jsx("div",{className:"xiping-video-subtitle-player__right",children:n})})]})});exports.VideoSubtitlePlayerLayoutPC=d;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
/** 移动端布局 props:仅视频 + 字幕,无详情区(详情后续弹窗等单独实现) */
|
|
3
|
+
export interface VideoSubtitlePlayerLayoutMobileProps {
|
|
4
|
+
className?: string;
|
|
5
|
+
style?: React.CSSProperties;
|
|
6
|
+
videoSlot: ReactNode;
|
|
7
|
+
subtitleSlot: ReactNode;
|
|
8
|
+
}
|
|
9
|
+
/** PC 端布局 props:视频 + 字幕 + 右侧详情区 */
|
|
10
|
+
export interface VideoSubtitlePlayerLayoutPCProps {
|
|
11
|
+
className?: string;
|
|
12
|
+
style?: React.CSSProperties;
|
|
13
|
+
videoSlot: ReactNode;
|
|
14
|
+
subtitleSlot: ReactNode;
|
|
15
|
+
/** 右侧详情区域 */
|
|
16
|
+
detailSlot: ReactNode;
|
|
17
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { RefObject } from 'react';
|
|
2
|
+
export interface UseXGPlayerCallbacks {
|
|
3
|
+
setCurrentTime: (time: number) => void;
|
|
4
|
+
setIsPlaying: (playing: boolean) => void;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* 封装 xgplayer 的创建、事件绑定与销毁,以及外部 currentTime 同步
|
|
8
|
+
* 调用方需渲染一个 div 并传入其 ref,播放器会挂载到该节点
|
|
9
|
+
*/
|
|
10
|
+
export declare function useXGPlayer(containerRef: RefObject<HTMLDivElement | null>, videoUrl: string, poster: string | undefined, callbacks: UseXGPlayerCallbacks, currentTime: number): void;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});require('../../node_modules/.pnpm/xgplayer@3.0.23_core-js@3.47.0/node_modules/xgplayer/dist/index.min.css');const a=require("react"),P=require("xgplayer");;/* empty css */function m(s,l,o,p,r){const u=a.useRef(null),{setCurrentTime:c,setIsPlaying:n}=p;a.useEffect(()=>{if(!s.current)return;const t=`xiping-video-subtitle-player-${Date.now()}`;s.current.id=t;const e=new P({id:t,url:l,poster:o,autoplay:!1,fluid:!1,width:"100%",height:"100%",controls:!0});u.current=e;const f=()=>{const h=e.currentTime??0;c(h)},i=()=>n(!0),d=()=>n(!1),y=()=>n(!1);return e.on("timeupdate",f),e.on("play",i),e.on("pause",d),e.on("ended",y),()=>{e.off("timeupdate",f),e.off("play",i),e.off("pause",d),e.off("ended",y),e.destroy(),u.current=null}},[l,o,c,n]),a.useEffect(()=>{const t=u.current;if(!t)return;Math.abs(t.currentTime-r)>.5&&(t.currentTime=r)},[r])}exports.useXGPlayer=m;
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/* components/button/Button.css */
|
|
2
|
+
.xiping-button{display:inline-flex;align-items:center;justify-content:center;border-radius:6px;font-weight:500;transition:all .2s ease;cursor:pointer;border:none;outline:none}.xiping-button:focus{outline:2px solid transparent;outline-offset:2px;box-shadow:0 0 0 3px #3b82f680}.xiping-button--small{padding:6px 12px;font-size:14px}.xiping-button--medium{padding:8px 16px;font-size:16px}.xiping-button--large{padding:12px 24px;font-size:18px}.xiping-button--primary{background-color:#2563eb;color:#fff}.xiping-button--primary:hover:not(:disabled){background-color:#1d4ed8}.xiping-button--primary:focus{box-shadow:0 0 0 3px #2563eb80}.xiping-button--secondary{background-color:#4b5563;color:#fff}.xiping-button--secondary:hover:not(:disabled){background-color:#374151}.xiping-button--secondary:focus{box-shadow:0 0 0 3px #4b556380}.xiping-button--outline{background-color:transparent;border:1px solid #d1d5db;color:#374151}.xiping-button--outline:hover:not(:disabled){background-color:#f9fafb}.xiping-button--outline:focus{box-shadow:0 0 0 3px #4b556380}.xiping-button--ghost{background-color:transparent;color:#374151}.xiping-button--ghost:hover:not(:disabled){background-color:#f3f4f6}.xiping-button--ghost:focus{box-shadow:0 0 0 3px #4b556380}.xiping-button--disabled{opacity:.5;cursor:not-allowed}.xiping-button--loading{cursor:wait}.xiping-button--full-width{width:100%}.xiping-button__icon-left{margin-right:8px}.xiping-button__icon-right{margin-left:8px}.xiping-button__spinner{margin-left:-4px;margin-right:8px;width:16px;height:16px;animation:xiping-spin 1s linear infinite}.xiping-button__spinner-circle{opacity:.25}.xiping-button__spinner-path{opacity:.75}@keyframes xiping-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
/* components/comic-text/ComicText.css */
|
|
6
|
+
.xiping-comic-text{-webkit-user-select:none;-moz-user-select:none;user-select:none;text-align:center}
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
/* components/dock/Duck.css */
|
|
10
|
+
.xiping-dock{margin-left:auto;margin-right:auto;margin-top:2rem;display:flex;height:58px;width:-moz-max-content;width:max-content;align-items:center;justify-content:center;gap:.5rem;border-radius:1rem;border:1px solid;padding:.5rem;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}@supports (backdrop-filter: blur(12px)){.xiping-dock{background-color:#ffffff1a}.dark .xiping-dock{background-color:#0000001a}}.xiping-dock--top{align-items:flex-start}.xiping-dock--middle{align-items:center}.xiping-dock--bottom{align-items:flex-end}.xiping-dock-icon{display:flex;aspect-ratio:1 / 1;cursor:pointer;align-items:center;justify-content:center;border-radius:9999px}
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
/* components/flip-text/FlipText.css */
|
|
14
|
+
.xiping-flip-container{display:flex;justify-content:center;gap:.5rem}.xiping-flip-char{transform-origin:center;filter:drop-shadow(0 1px 1px rgb(0 0 0 / .05))}
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
/* components/gradient-text/index.css */
|
|
18
|
+
.xiping-gradient-text{position:relative;margin:0 auto;display:flex;max-width:-moz-fit-content;max-width:fit-content;flex-direction:row;align-items:center;justify-content:center;border-radius:1.25rem;font-weight:500;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);transition:box-shadow .5s ease-out;overflow:hidden;cursor:pointer}.xiping-gradient-text__overlay{position:absolute;inset:0;background-size:300% 100%;animation:xiping-gradient linear infinite;border-radius:inherit;z-index:0;pointer-events:none}.xiping-gradient-text__overlay:before{content:"";position:absolute;border-radius:inherit;width:calc(100% - 2px);height:calc(100% - 2px);left:50%;top:50%;transform:translate(-50%,-50%);background-color:#060010;z-index:-1}@keyframes xiping-gradient{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}.xiping-gradient-text__content{display:inline-block;position:relative;z-index:2;background-size:300% 100%;background-clip:text;-webkit-background-clip:text;color:transparent;animation:xiping-gradient linear infinite}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
/* components/hyper-text/HyperText.css */
|
|
22
|
+
.xiping-hyper-container{overflow:hidden;padding-top:.5rem;padding-bottom:.5rem;font-size:2.25rem;line-height:2.5rem;font-weight:700}.xiping-hyper-char{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace}.xiping-hyper-space{width:.75rem}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
/* components/image-compare/ImageCompare.css */
|
|
26
|
+
.xiping-image-compare-container{position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;overflow:hidden;width:100%}.xiping-image-compare-label{position:absolute;top:1rem;padding:.25rem .5rem;background-color:#0009;color:#fff;font-size:.75rem;font-weight:500;border-radius:.25rem;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:10}.xiping-image-compare-label-original{right:1rem}.xiping-image-compare-label-modified{left:1rem}.xiping-image-compare-overlay{position:absolute;inset:0;height:100%;overflow:hidden}.xiping-image-compare-divider{position:absolute;top:0;bottom:0;background-color:#ffffffe6;cursor:ew-resize;box-shadow:0 0 0 1px #0000004d,0 0 0 1px #ffffff80 inset,0 0 8px #0003}.xiping-image-compare-divider-button{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:2rem;height:2rem;border-radius:50%;background-color:#fffffff2;border:2px solid rgba(0,0,0,.2);box-shadow:0 0 0 1px #fffc,0 4px 12px #0000004d,0 2px 4px #0003;display:flex;align-items:center;justify-content:center;transition:box-shadow .2s ease,transform .2s ease}.xiping-image-compare-divider-button:hover{box-shadow:0 0 0 1px #ffffffe6,0 6px 16px #0006,0 3px 6px #0000004d;transform:translate(-50%,-50%) scale(1.05)}.xiping-image-compare-divider-button:active{transform:translate(-50%,-50%) scale(.95)}.xiping-image-compare-divider-icon{width:1.5rem;height:1.5rem;color:#1f2937}.xiping-image-compare-divider-theme-dark{background-color:#000000e6;box-shadow:0 0 0 1px #ffffff4d,0 0 0 1px #00000080 inset,0 0 8px #fff3}.xiping-image-compare-divider-button-theme-dark{background-color:#000000f2;border:2px solid rgba(255,255,255,.2);box-shadow:0 0 0 1px #000c,0 4px 12px #ffffff4d,0 2px 4px #fff3}.xiping-image-compare-divider-button-theme-dark:hover{box-shadow:0 0 0 1px #000000e6,0 6px 16px #fff6,0 3px 6px #ffffff4d}.xiping-image-compare-divider-theme-dark .xiping-image-compare-divider-icon{color:#f3f4f6}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
/* components/image-viewer/ImageThumbnails.css */
|
|
30
|
+
.xiping-thumbnails-wrapper{height:6rem;background-color:#00000080;flex-shrink:0;z-index:10;padding-bottom:env(safe-area-inset-bottom);padding-left:env(safe-area-inset-left);padding-right:env(safe-area-inset-right)}.xiping-thumbnails-wrapper--hidden{display:none}.xiping-thumbnails-scroll{height:6rem;width:100vw;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;scrollbar-width:none;-ms-overflow-style:none}.xiping-thumbnails-scroll::-webkit-scrollbar{display:none}.xiping-thumbnails-container{display:flex;gap:.5rem;padding:.5rem;height:6rem;min-width:-moz-max-content;min-width:max-content}.xiping-thumbnail-item{height:100%;aspect-ratio:1 / 1;flex-shrink:0;cursor:pointer;border:2px solid transparent;transition:all .2s}.xiping-thumbnail-item--active{border-color:#fff}.xiping-thumbnail-image{width:100%;height:100%;-o-object-fit:contain;object-fit:contain}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
/* components/image-viewer/ImageViewer.css */
|
|
34
|
+
.xiping-wrapper{width:100vw;height:100vh;position:relative;display:flex;flex-direction:column;padding-top:env(safe-area-inset-top,0)}.xiping-tool-wrapper{position:absolute;top:16px;right:16px;display:flex;gap:16px;z-index:10}.xiping-close-icon,.xiping-download-icon{color:#fff;cursor:pointer}.xiping-main-content{flex:1;min-height:0;position:relative;display:flex;align-items:center;justify-content:center}.xiping-pinch-content{width:100%;height:100%}.xiping-image{width:100vw;height:100%;-o-object-fit:contain;object-fit:contain;pointer-events:none}.xiping-loading{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background-color:#00000080}.xiping-modal-content{overflow:hidden}.xiping-modal-overlay{background-color:#000000b3}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}.scrollbar-hide::-webkit-scrollbar{display:none}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
/* components/message/Message.css */
|
|
38
|
+
.xiping-message{display:flex;align-items:flex-start;max-width:80%;margin-bottom:16px}.xiping-message.user{align-self:flex-end;flex-direction:row-reverse;margin-left:auto}.xiping-message.assistant{align-self:flex-start;margin-right:auto}.xiping-message__avatar{width:36px;height:36px;border-radius:50%;overflow:hidden;margin:0 8px;background-color:#e0e0e0;display:flex;align-items:center;justify-content:center;flex-shrink:0}.xiping-message__content{background-color:#fff;padding:12px 16px;border-radius:12px;box-shadow:0 1px 2px #0000001a;position:relative;max-width:100%}.xiping-message:not(:has(.xiping-message__avatar)) .xiping-message__content{margin:0}.xiping-message.user .xiping-message__content{background-color:#007bff;color:#fff}.xiping-message__text{word-break:break-word;line-height:1.5}.xiping-message__timestamp{font-size:.75rem;color:#888;margin-top:4px;text-align:right}.xiping-message.user .xiping-message__timestamp{color:#fffc}.xiping-message__thinking{display:flex;align-items:center;margin-top:8px}.xiping-message__thinking-dots{display:flex;align-items:center;margin-right:8px}.xiping-message__thinking-dots span{width:8px;height:8px;margin:0 2px;background-color:#888;border-radius:50%;display:inline-block;animation:xiping-thinking 1.4s infinite ease-in-out both}.xiping-message__thinking-dots span:nth-child(1){animation-delay:-.32s}.xiping-message__thinking-dots span:nth-child(2){animation-delay:-.16s}.xiping-message__thinking-text{font-size:.9rem;color:#888}.xiping-message.user .xiping-message__thinking-text{color:#fffc}@keyframes xiping-thinking{0%,80%,to{transform:scale(.6)}40%{transform:scale(1)}}.xiping-message__loading{display:flex;align-items:center;justify-content:center;padding:8px}.xiping-message__loading-spinner{width:24px;height:24px;border:3px solid rgba(0,123,255,.3);border-radius:50%;border-top-color:#007bff;animation:xiping-spin 1s ease-in-out infinite}@keyframes xiping-spin{to{transform:rotate(360deg)}}.xiping-message__think{margin-top:12px;padding:8px 12px;background-color:#0000000d;border-radius:8px;font-size:.9rem}.xiping-message.user .xiping-message__think{background-color:#ffffff1a}.xiping-message__think-header{display:flex;align-items:center;gap:8px;margin-bottom:8px;font-weight:500}.xiping-message__think-toggle{background:none;border:none;padding:4px;cursor:pointer;color:#666;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:background-color .2s ease}.xiping-message__think-toggle:hover{background-color:#0000000d}.xiping-message__think-content{max-height:1000px;opacity:1;overflow:hidden;transition:all .3s ease-in-out}.xiping-message__think-content.hidden{max-height:0;opacity:0;margin:0;padding:0}.xiping-message__knowledge-sources{margin-top:8px;padding:8px;background-color:#00000008;border-radius:4px;font-size:.9em}.xiping-message__knowledge-sources-header{font-weight:500;margin-bottom:4px;color:#666}.xiping-message__knowledge-sources-list{list-style:none;padding:0;margin:0}.xiping-message__knowledge-source-item{margin-bottom:4px}.xiping-message__knowledge-source-item:last-child{margin-bottom:0}.xiping-message__knowledge-source-item a{color:#06c;text-decoration:none}.xiping-message__knowledge-source-item a:hover{text-decoration:underline}.xiping-message__knowledge-source-description{font-size:.9em;color:#666;margin-top:2px;margin-left:8px}.xiping-message__text-container{position:relative;display:flex;flex-direction:column;gap:4px}.xiping-message__copy-button{align-self:flex-end;padding:4px;background:none;border:none;cursor:pointer;color:#666;opacity:0;transition:all .2s ease;border-radius:4px;display:flex;align-items:center;justify-content:center}.xiping-message__text-container:hover .xiping-message__copy-button{opacity:1}.xiping-message__copy-button:hover{color:#333;background-color:#0000000d}.xiping-message__copy-tooltip{position:absolute;top:-24px;right:0;background-color:#333;color:#fff;padding:4px 8px;border-radius:4px;font-size:12px;white-space:nowrap;animation:xiping-fadeInOut 2s ease-in-out}@keyframes xiping-fadeInOut{0%{opacity:0;transform:translateY(4px)}10%{opacity:1;transform:translateY(0)}90%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(4px)}}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
/* components/pointer/Pointer.css */
|
|
42
|
+
.xiping-pointer{position:fixed;z-index:50;pointer-events:none;transform:translate(-50%,-50%)}.xiping-pointer-icon{transform:rotate(-70deg);stroke:#fff;color:#000}
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
/* components/scratch-to-reveal/ScratchToReveal.css */
|
|
46
|
+
.xiping-scratch-to-reveal{position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.xiping-scratch-canvas{position:absolute;left:0;top:0}
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
/* components/shimmer-button/ShimmerButton.css */
|
|
50
|
+
.xiping-shimmer-button{position:relative;z-index:0;display:flex;cursor:pointer;align-items:center;justify-content:center;overflow:hidden;white-space:nowrap;border:1px solid rgba(255,255,255,.1);padding:.75rem 1.5rem;color:#fff;background:var(--bg);border-radius:var(--radius);transform:translateZ(0);transition:transform .3s ease-in-out}.xiping-shimmer-button:active{transform:translateY(1px) translateZ(0)}@media(prefers-color-scheme:dark){.xiping-shimmer-button{color:#000}}.xiping-shimmer-button-spark-container{position:absolute;z-index:-30;inset:0;overflow:visible;filter:blur(2px);container-type:size}.xiping-shimmer-button-spark{position:absolute;inset:0;height:100cqh;aspect-ratio:1;border-radius:0;-webkit-mask:none;mask:none;animation:xiping-shimmer-slide var(--speed) ease-in-out infinite alternate}.xiping-shimmer-button-spark-before{position:absolute;inset:-100%;width:auto;transform:rotate(0);background:conic-gradient(from calc(270deg - (var(--spread) * .5)),transparent 0,var(--shimmer-color) var(--spread),transparent var(--spread));animation:xiping-spin-around calc(var(--speed) * 2) infinite linear}.xiping-shimmer-button-highlight{position:absolute;inset:0;width:100%;height:100%;border-radius:1rem;box-shadow:inset 0 -8px 10px #ffffff1f;transform:translateZ(0);transition:all .3s ease-in-out}.xiping-shimmer-button:hover .xiping-shimmer-button-highlight{box-shadow:inset 0 -6px 10px #ffffff40}.xiping-shimmer-button:active .xiping-shimmer-button-highlight{box-shadow:inset 0 -10px 10px #ffffff40}.xiping-shimmer-button-backdrop{position:absolute;z-index:-20;background:var(--bg);border-radius:var(--radius);inset:var(--cut)}@keyframes xiping-shimmer-slide{to{transform:translate(calc(100cqw - 100%))}}@keyframes xiping-spin-around{0%{transform:translateZ(0) rotate(0)}15%,35%{transform:translateZ(0) rotate(90deg)}65%,85%{transform:translateZ(0) rotate(270deg)}to{transform:translateZ(0) rotate(360deg)}}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
/* components/shiny-button/ShinyButton.css */
|
|
54
|
+
.xiping-shiny-button{position:relative;cursor:pointer;border-radius:.5rem;padding:.5rem 1.5rem;font-weight:500;-webkit-backdrop-filter:blur(24px);backdrop-filter:blur(24px);border:1px solid;transition:box-shadow .3s ease-in-out}.xiping-shiny-button:hover{box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a}@media(prefers-color-scheme:dark){.xiping-shiny-button{background:radial-gradient(circle at 50% 0%,var(--primary) 10%,transparent 60%)}.xiping-shiny-button:hover{box-shadow:0 0 20px var(--primary) / 10%}}.xiping-shiny-button-text{position:relative;display:block;width:100%;height:100%;font-size:.875rem;text-transform:uppercase;letter-spacing:.05em;color:#000000a6}@media(prefers-color-scheme:dark){.xiping-shiny-button-text{font-weight:300;color:#ffffffe5}}.xiping-shiny-button-border{position:absolute;inset:0;z-index:10;display:block;border-radius:inherit;padding:1px}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
/* components/shiny-text/ShinyText.css */
|
|
58
|
+
.shiny-text{display:inline-block}
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
/* components/sparkles-text/SparklesText.css */
|
|
62
|
+
.xiping-sparkle{pointer-events:none;position:absolute;z-index:20}.xiping-sparkles-text{font-size:3.75rem;font-weight:700}.xiping-sparkles-text-wrapper{position:relative;display:inline-block}
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
/* components/split-text/SplitText.css */
|
|
66
|
+
.xiping-split-parent{overflow:hidden;display:inline-block;white-space:normal}
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
/* components/subtitle-player/CurrentMode.css */
|
|
70
|
+
.xiping-subtitle-player__current-item{display:flex;flex-direction:column;gap:.25rem;transition:all .2s ease}.xiping-subtitle-player__current-label{font-size:.75rem;font-weight:600;color:#ffffffb3;text-transform:uppercase;letter-spacing:.05em;margin-bottom:.25rem}.xiping-subtitle-player__current-text{font-size:1rem;font-weight:500;text-shadow:0 2px 4px rgba(0,0,0,.5)}.xiping-subtitle-player__current-line{margin:.25rem 0}.xiping-subtitle-player__current-line:first-child{margin-top:0}.xiping-subtitle-player__current-line:last-child{margin-bottom:0}.xiping-subtitle-player__current-hover-layer{position:absolute;inset:0;pointer-events:none}@media(max-width:768px){.xiping-subtitle-player__current-text{font-size:.9rem}}
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
/* components/subtitle-player/LyricsMode.css */
|
|
74
|
+
.xiping-subtitle-player__lyrics-time{font-size:.7rem;font-weight:500;color:#ffffff80;font-family:Monaco,Menlo,Ubuntu Mono,monospace;margin-bottom:.25rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.xiping-subtitle-player__lyrics-item{display:flex;flex-direction:column;gap:.25rem;transition:all .2s ease}.xiping-subtitle-player__lyrics-item--active{color:#fbbf24;font-weight:600;transition:all .3s ease;position:relative}.xiping-subtitle-player__lyrics-item--active:before{content:"";position:absolute;left:-1rem;top:50%;transform:translateY(-50%);width:4px;height:92%;background:#fbbf24;border-radius:2px}.xiping-subtitle-player__lyrics-item--past{opacity:.5;color:#fff9}.xiping-subtitle-player__lyrics-label{font-size:.75rem;font-weight:600;color:#ffffffb3;text-transform:uppercase;letter-spacing:.05em;margin-bottom:.25rem}.xiping-subtitle-player__lyrics-text{font-size:1rem;font-weight:500;text-shadow:0 2px 4px rgba(0,0,0,.5)}.xiping-subtitle-player__lyrics-line{margin:.25rem 0}.xiping-subtitle-player__lyrics-line:first-child{margin-top:0}.xiping-subtitle-player__lyrics-line:last-child{margin-bottom:0}.xiping-subtitle-player__lyrics-hover-layer{position:absolute;inset:0;pointer-events:none}.xiping-subtitle-player--lyrics{max-height:600px;overflow-y:auto;gap:.5rem;scroll-behavior:smooth}.xiping-subtitle-player--lyrics::-webkit-scrollbar{width:8px}.xiping-subtitle-player--lyrics::-webkit-scrollbar-track{background:#ffffff1a;border-radius:4px}.xiping-subtitle-player--lyrics::-webkit-scrollbar-thumb{background:#ffffff4d;border-radius:4px}.xiping-subtitle-player--lyrics::-webkit-scrollbar-thumb:hover{background:#ffffff80}.xiping-subtitle-player__group{display:flex;flex-direction:column;gap:.5rem;width:100%;border-radius:.5rem;padding:.5rem;margin:-.5rem;transition:all .2s ease}.xiping-subtitle-player__group:hover{background-color:#ffffff1a}.xiping-subtitle-player__group:hover .xiping-subtitle-player__lyrics-item{transform:translate(4px)}.xiping-subtitle-player__group:hover .xiping-subtitle-player__lyrics-item--active{background-color:#fbbf2426}.xiping-subtitle-player__lyrics-item--active .xiping-subtitle-word{color:#fbbf24;font-weight:600}@media(max-width:768px){.xiping-subtitle-player__lyrics-text{font-size:.9rem}}
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
/* components/subtitle-player/SubtitlePlayer.css */
|
|
78
|
+
.xiping-subtitle-player{display:flex;flex-direction:column;gap:.75rem;padding:1rem;background:#000000bf;border-radius:.5rem;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);color:#fff;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;line-height:1.6;max-width:100%;box-sizing:border-box;position:relative}.xiping-subtitle-player__hover-overlay{position:absolute;transform:translate(-50%,.5rem);z-index:10;pointer-events:auto}.xiping-subtitle-player:has(.xiping-subtitle-player__current-item:only-child){align-items:center}.xiping-subtitle-player:has(.xiping-subtitle-player__current-item:not(:only-child)){align-items:flex-start}.xiping-subtitle-word{display:inline-block;position:relative;transition:all .2s ease;padding:0 .05em;margin:0 .05em;border-radius:2px}.xiping-subtitle-word:hover{background-color:#ffffff1a;transform:translateY(-1px)}.xiping-subtitle-word-before,.xiping-subtitle-word-after{display:inline}@media(max-width:768px){.xiping-subtitle-player{padding:.75rem;font-size:.9rem}}
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
/* components/text-animate/TextAnimate.css */
|
|
82
|
+
.xiping-text-animate{white-space:pre-wrap}.xiping-text-animate-segment{display:inline-block;white-space:pre}.xiping-text-animate-segment--line{display:block}
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
/* components/text-type/TextType.css */
|
|
86
|
+
.xiping-text-type{display:inline-block;white-space:pre-wrap}.xiping-text-type__content{display:inline-block}.xiping-text-type__cursor{margin-left:.25rem;display:inline-block;opacity:1}.xiping-text-type__cursor--hidden{display:none}
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
/* components/txt-reader/index.module.css */
|
|
90
|
+
._xiping-top-progress_rkm9f_23{position:fixed;left:0;top:0;right:0;background-color:#f08;height:10px}._xiping-container_rkm9f_33{position:relative;width:100%;height:100%;overflow-y:auto}._xiping-content_rkm9f_41{width:100%;white-space:pre-wrap;word-break:break-word}._xiping-bottom-progress_rkm9f_48{position:fixed;color:#fff;border-radius:4px;font-size:.875rem;background-color:#000000b3;padding:.25rem .5rem;right:1.25rem;bottom:1.25rem}._xiping-text-content_rkm9f_63::-webkit-scrollbar{width:8px}._xiping-text-content_rkm9f_63::-webkit-scrollbar-thumb{box-shadow:inset 0 0 5px #0003;background:#0003}._xiping-text-content_rkm9f_63::-webkit-scrollbar-track{box-shadow:inset 0 0 5px #0003;border-radius:0;background:#00000014}
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
/* components/typing-animation/index.css */
|
|
94
|
+
.xiping-typing-animation{font-size:2.25rem;font-weight:700;line-height:5rem;letter-spacing:-.02em}
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
/* components/variable-proximity/index.css */
|
|
98
|
+
.xiping-variable-proximity{font-family:Roboto Flex,Noto Sans SC,PingFang SC,Microsoft YaHei,SimHei,sans-serif}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
/* components/video-dialog/VideoDialog.css */
|
|
102
|
+
.xiping-video-dialog{position:relative}.xiping-video-dialog-container{position:relative;cursor:pointer}.xiping-video-dialog-thumbnail{width:100%;border-radius:.375rem;border:1px solid;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d;transition:all .2s ease-out}.xiping-video-dialog-container:hover .xiping-video-dialog-thumbnail{filter:brightness(.8)}.xiping-video-dialog-overlay{position:absolute;inset:0;display:flex;transform:scale(.9);align-items:center;justify-content:center;border-radius:1rem;transition:all .2s ease-out}.xiping-video-dialog-container:hover .xiping-video-dialog-overlay{transform:scale(1)}.xiping-video-dialog-play-outer{display:flex;width:7rem;height:7rem;align-items:center;justify-content:center;border-radius:9999px;background-color:hsla(var(--primary-h),var(--primary-s),var(--primary-l),.1);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.xiping-video-dialog-play-inner{position:relative;display:flex;width:5rem;height:5rem;transform:scale(1);align-items:center;justify-content:center;border-radius:9999px;background:linear-gradient(to bottom,hsla(var(--primary-h),var(--primary-s),var(--primary-l),.3),hsl(var(--primary-h),var(--primary-s),var(--primary-l)));box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -1px #0000000f;transition:all .2s ease-out}.xiping-video-dialog-container:hover .xiping-video-dialog-play-inner{transform:scale(1.2)}.xiping-video-dialog-play-icon{width:2rem;height:2rem;transform:scale(1);fill:#fff;color:#fff;transition:transform .2s ease-out;filter:drop-shadow(0 4px 3px rgb(0 0 0 / .07)) drop-shadow(0 2px 2px rgb(0 0 0 / .06))}.xiping-video-dialog-container:hover .xiping-video-dialog-play-icon{transform:scale(1.05)}.xiping-video-dialog-modal{position:fixed;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;background-color:#00000080;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.xiping-video-dialog-modal-content{position:relative;margin:0 1rem;aspect-ratio:16 / 9;width:100%;max-width:56rem}@media(min-width:768px){.xiping-video-dialog-modal-content{margin:0}}.xiping-video-dialog-close-button{position:absolute;top:-4rem;right:0;border-radius:9999px;background-color:#17171780;padding:.5rem;font-size:1.25rem;color:#fff;box-shadow:0 0 0 1px #0000001a;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}@media(prefers-color-scheme:dark){.xiping-video-dialog-close-button{background-color:#f5f5f580;color:#000}}.xiping-video-dialog-close-icon{width:1.25rem;height:1.25rem}.xiping-video-dialog-video-wrapper{position:relative;isolation:isolate;z-index:1;width:100%;height:100%;overflow:hidden;border-radius:1rem;border:2px solid white}.xiping-video-dialog-iframe{width:100%;height:100%;border-radius:1rem}:root{--primary-h: 221.2;--primary-s: 83.2%;--primary-l: 53.3%}
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
/* components/video-subtitle-player/VideoSubtitlePlayer.css */
|
|
106
|
+
.xiping-video-subtitle-player{width:100%;height:100%;background:#1a1a1a;border-radius:8px;overflow:hidden;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.xiping-video-subtitle-player__video-wrapper{width:100%;height:100%;background:#000;overflow:hidden}.xiping-video-subtitle-player__video-container{position:relative;width:100%;height:100%;background:#000;overflow:hidden}.xiping-video-subtitle-player__video{position:absolute;top:0;left:0;width:100%;height:100%;padding:0}.xiping-video-subtitle-player__video-container .xgplayer{width:100%!important;height:100%!important}.xiping-video-subtitle-player__video-container .xgplayer video{-o-object-fit:fill!important;object-fit:fill!important}.xiping-video-subtitle-player__subtitle-container{width:100%;height:100%;padding:20px;overflow-y:auto;background:#0000004d}.xiping-video-subtitle-player__right{width:100%;height:100%;background:#00000080;display:flex;flex-direction:column}.xiping-video-subtitle-player__detail{flex:1;padding:24px;overflow-y:auto;color:#fff}.xiping-video-subtitle-player__detail-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:16px;color:#ffffffb3}.xiping-video-subtitle-player__detail-loading-spinner{width:40px;height:40px;border:3px solid rgba(255,255,255,.1);border-top-color:#fbbf24;border-radius:50%;animation:xiping-vsp-spin 1s linear infinite}@keyframes xiping-vsp-spin{to{transform:rotate(360deg)}}.xiping-video-subtitle-player__detail-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:16px;color:#ffffff80;text-align:center}.xiping-video-subtitle-player__detail-empty-icon{font-size:48px;opacity:.5}.xiping-video-subtitle-player__detail-empty-text{font-size:14px;line-height:1.6}.xiping-video-subtitle-player__detail-content{display:flex;flex-direction:column;gap:20px}.xiping-video-subtitle-player__detail-word{font-size:32px;font-weight:700;color:#fbbf24;line-height:1.2;margin-bottom:8px}.xiping-video-subtitle-player__detail-pronunciation{font-size:18px;color:#ffffffb3;font-style:italic;margin-bottom:4px}.xiping-video-subtitle-player__detail-pos{display:inline-block;padding:4px 12px;background:#fbbf2433;color:#fbbf24;border-radius:4px;font-size:12px;font-weight:600;text-transform:uppercase;width:-moz-fit-content;width:fit-content;margin-bottom:8px}.xiping-video-subtitle-player__detail-label{font-size:12px;font-weight:600;color:#ffffff80;text-transform:uppercase;letter-spacing:.05em;margin-bottom:8px}.xiping-video-subtitle-player__detail-text{font-size:16px;line-height:1.6;color:#ffffffe6}.xiping-video-subtitle-player__detail-translation,.xiping-video-subtitle-player__detail-definition{padding-bottom:16px;border-bottom:1px solid rgba(255,255,255,.1)}.xiping-video-subtitle-player__detail-definition{border-bottom:none}.xiping-video-subtitle-player__detail-examples{display:flex;flex-direction:column;gap:16px}.xiping-video-subtitle-player__detail-example{padding:16px;background:#ffffff0d;border-radius:8px;border-left:3px solid #fbbf24}.xiping-video-subtitle-player__detail-example-en{font-size:15px;line-height:1.6;color:#fffffff2;margin-bottom:8px}.xiping-video-subtitle-player__detail-example-zh{font-size:14px;line-height:1.6;color:#ffffffb3;padding-left:12px;border-left:2px solid rgba(255,255,255,.2)}.xiping-video-subtitle-player__subtitle-container::-webkit-scrollbar,.xiping-video-subtitle-player__detail::-webkit-scrollbar{width:8px}.xiping-video-subtitle-player__subtitle-container::-webkit-scrollbar-track,.xiping-video-subtitle-player__detail::-webkit-scrollbar-track{background:#ffffff0d;border-radius:4px}.xiping-video-subtitle-player__subtitle-container::-webkit-scrollbar-thumb,.xiping-video-subtitle-player__detail::-webkit-scrollbar-thumb{background:#fff3;border-radius:4px}.xiping-video-subtitle-player__subtitle-container::-webkit-scrollbar-thumb:hover,.xiping-video-subtitle-player__detail::-webkit-scrollbar-thumb:hover{background:#ffffff4d}
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
/* components/video-subtitle-player/VideoSubtitlePlayer.mobile.css */
|
|
110
|
+
.xiping-video-subtitle-player--mobile{display:flex;flex-direction:column;min-height:0;height:100%}.xiping-video-subtitle-player__mobile-video{flex:0 0 auto;width:100%;aspect-ratio:16 / 9;background:#000}.xiping-video-subtitle-player__mobile-video-wrapper{width:100%;height:100%;background:#000;overflow:hidden}.xiping-video-subtitle-player__mobile-video-container{position:relative;width:100%;height:100%;background-color:#a62c2c;overflow:hidden}.xiping-video-subtitle-player__mobile-video-container .xgplayer{width:100%!important;height:100%!important}.xiping-video-subtitle-player__mobile-video-container .xgplayer video{-o-object-fit:fill!important;object-fit:fill!important}.xiping-video-subtitle-player__mobile-subtitle{flex:1;min-height:0;padding:12px 16px;overflow-y:auto;background:#0000004d;-webkit-overflow-scrolling:touch}
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
/* components/video-subtitle-player/VideoSubtitlePlayer.pc.css */
|
|
114
|
+
.xiping-video-subtitle-player--pc .xiping-video-subtitle-player__panel-group,.xiping-video-subtitle-player--pc .xiping-video-subtitle-player__panel-group-inner{width:100%;height:100%}.xiping-video-subtitle-player--pc .xiping-video-subtitle-player__right{border-left:1px solid rgba(255,255,255,.1)}.xiping-video-subtitle-player__resize-handle--horizontal{position:relative;width:2px;background:#ffffff1a;cursor:col-resize;transition:background .2s ease;flex-shrink:0}.xiping-video-subtitle-player__resize-handle--horizontal:hover{background:#fbbf2480}.xiping-video-subtitle-player__resize-handle--horizontal:active{background:#fbbf24cc}.xiping-video-subtitle-player__resize-handle--horizontal:before{content:"";position:absolute;inset:0 -4px;cursor:col-resize}.xiping-video-subtitle-player__resize-handle--vertical{position:relative;height:2px;background:#ffffff1a;cursor:row-resize;transition:background .2s ease;flex-shrink:0}.xiping-video-subtitle-player__resize-handle--vertical:hover{background:#fbbf2480}.xiping-video-subtitle-player__resize-handle--vertical:active{background:#fbbf24cc}.xiping-video-subtitle-player__resize-handle--vertical:before{content:"";position:absolute;inset:-4px 0;cursor:row-resize}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.xiping-video-subtitle-player{width:100%;height:100%;background:#1a1a1a;border-radius:8px;overflow:hidden;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.xiping-video-subtitle-player__video-wrapper{width:100%;height:100%;background:#000;overflow:hidden}.xiping-video-subtitle-player__video-container{position:relative;width:100%;height:100%;background:#000;overflow:hidden}.xiping-video-subtitle-player__video{position:absolute;top:0;left:0;width:100%;height:100%;padding:0}.xiping-video-subtitle-player__video-container .xgplayer{width:100%!important;height:100%!important}.xiping-video-subtitle-player__video-container .xgplayer video{-o-object-fit:fill!important;object-fit:fill!important}.xiping-video-subtitle-player__subtitle-container{width:100%;height:100%;padding:20px;overflow-y:auto;background:#0000004d}.xiping-video-subtitle-
|
|
1
|
+
.xiping-video-subtitle-player{width:100%;height:100%;background:#1a1a1a;border-radius:8px;overflow:hidden;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.xiping-video-subtitle-player__video-wrapper{width:100%;height:100%;background:#000;overflow:hidden}.xiping-video-subtitle-player__video-container{position:relative;width:100%;height:100%;background:#000;overflow:hidden}.xiping-video-subtitle-player__video{position:absolute;top:0;left:0;width:100%;height:100%;padding:0}.xiping-video-subtitle-player__video-container .xgplayer{width:100%!important;height:100%!important}.xiping-video-subtitle-player__video-container .xgplayer video{-o-object-fit:fill!important;object-fit:fill!important}.xiping-video-subtitle-player__subtitle-container{width:100%;height:100%;padding:20px;overflow-y:auto;background:#0000004d}.xiping-video-subtitle-player__right{width:100%;height:100%;background:#00000080;display:flex;flex-direction:column}.xiping-video-subtitle-player__detail{flex:1;padding:24px;overflow-y:auto;color:#fff}.xiping-video-subtitle-player__detail-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:16px;color:#ffffffb3}.xiping-video-subtitle-player__detail-loading-spinner{width:40px;height:40px;border:3px solid rgba(255,255,255,.1);border-top-color:#fbbf24;border-radius:50%;animation:xiping-vsp-spin 1s linear infinite}@keyframes xiping-vsp-spin{to{transform:rotate(360deg)}}.xiping-video-subtitle-player__detail-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:16px;color:#ffffff80;text-align:center}.xiping-video-subtitle-player__detail-empty-icon{font-size:48px;opacity:.5}.xiping-video-subtitle-player__detail-empty-text{font-size:14px;line-height:1.6}.xiping-video-subtitle-player__detail-content{display:flex;flex-direction:column;gap:20px}.xiping-video-subtitle-player__detail-word{font-size:32px;font-weight:700;color:#fbbf24;line-height:1.2;margin-bottom:8px}.xiping-video-subtitle-player__detail-pronunciation{font-size:18px;color:#ffffffb3;font-style:italic;margin-bottom:4px}.xiping-video-subtitle-player__detail-pos{display:inline-block;padding:4px 12px;background:#fbbf2433;color:#fbbf24;border-radius:4px;font-size:12px;font-weight:600;text-transform:uppercase;width:-moz-fit-content;width:fit-content;margin-bottom:8px}.xiping-video-subtitle-player__detail-label{font-size:12px;font-weight:600;color:#ffffff80;text-transform:uppercase;letter-spacing:.05em;margin-bottom:8px}.xiping-video-subtitle-player__detail-text{font-size:16px;line-height:1.6;color:#ffffffe6}.xiping-video-subtitle-player__detail-translation,.xiping-video-subtitle-player__detail-definition{padding-bottom:16px;border-bottom:1px solid rgba(255,255,255,.1)}.xiping-video-subtitle-player__detail-definition{border-bottom:none}.xiping-video-subtitle-player__detail-examples{display:flex;flex-direction:column;gap:16px}.xiping-video-subtitle-player__detail-example{padding:16px;background:#ffffff0d;border-radius:8px;border-left:3px solid #fbbf24}.xiping-video-subtitle-player__detail-example-en{font-size:15px;line-height:1.6;color:#fffffff2;margin-bottom:8px}.xiping-video-subtitle-player__detail-example-zh{font-size:14px;line-height:1.6;color:#ffffffb3;padding-left:12px;border-left:2px solid rgba(255,255,255,.2)}.xiping-video-subtitle-player__subtitle-container::-webkit-scrollbar,.xiping-video-subtitle-player__detail::-webkit-scrollbar{width:8px}.xiping-video-subtitle-player__subtitle-container::-webkit-scrollbar-track,.xiping-video-subtitle-player__detail::-webkit-scrollbar-track{background:#ffffff0d;border-radius:4px}.xiping-video-subtitle-player__subtitle-container::-webkit-scrollbar-thumb,.xiping-video-subtitle-player__detail::-webkit-scrollbar-thumb{background:#fff3;border-radius:4px}.xiping-video-subtitle-player__subtitle-container::-webkit-scrollbar-thumb:hover,.xiping-video-subtitle-player__detail::-webkit-scrollbar-thumb:hover{background:#ffffff4d}
|
|
@@ -13,11 +13,11 @@ export interface VideoSubtitlePlayerProps {
|
|
|
13
13
|
style?: React.CSSProperties;
|
|
14
14
|
/** 自定义详情获取函数,用于调用大模型API */
|
|
15
15
|
onFetchDetail?: (target: HoverTarget | null) => Promise<void>;
|
|
16
|
+
/** 强制使用布局:传入则不再做设备检测,直接使用对应布局 */
|
|
17
|
+
forceLayout?: "mobile" | "pc";
|
|
16
18
|
}
|
|
17
19
|
/**
|
|
18
|
-
*
|
|
19
|
-
* 左侧:上部分视频播放器(填充模式),下部分字幕显示
|
|
20
|
-
* 右侧:字幕详情(单词/短语的发音、解释等)
|
|
20
|
+
* 视频字幕播放器:根据设备或 forceLayout 选择 PC 或移动端视图,二者完全分离
|
|
21
21
|
*/
|
|
22
22
|
export declare const VideoSubtitlePlayer: React.FC<VideoSubtitlePlayerProps>;
|
|
23
23
|
export default VideoSubtitlePlayer;
|
|
@@ -1,135 +1,75 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
import { useRef as
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import {
|
|
6
|
-
import
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
1
|
+
import { jsx as u } from "react/jsx-runtime";
|
|
2
|
+
import { useRef as v, useEffect as w, useCallback as d } from "react";
|
|
3
|
+
import { isMobile as V, isTablet as g } from "react-device-detect";
|
|
4
|
+
import { useVideoSubtitleStore as k } from "./useVideoSubtitleStore.js";
|
|
5
|
+
import { useXGPlayer as H } from "./useXGPlayer.js";
|
|
6
|
+
import { VideoSubtitlePlayerPC as M } from "./VideoSubtitlePlayerPC.js";
|
|
7
|
+
import { VideoSubtitlePlayerMobile as T } from "./VideoSubtitlePlayerMobile.js";
|
|
8
|
+
import './VideoSubtitlePlayer.css';/* empty css */
|
|
9
|
+
const X = ({
|
|
10
|
+
videoUrl: p,
|
|
11
|
+
subtitles: r,
|
|
12
|
+
poster: b,
|
|
13
|
+
className: l = "",
|
|
14
|
+
style: n,
|
|
15
|
+
onFetchDetail: e,
|
|
16
|
+
forceLayout: m
|
|
17
17
|
}) => {
|
|
18
|
-
const
|
|
19
|
-
currentTime:
|
|
20
|
-
setCurrentTime:
|
|
21
|
-
setIsPlaying:
|
|
22
|
-
setSubtitles:
|
|
23
|
-
currentDetail:
|
|
24
|
-
isLoadingDetail:
|
|
25
|
-
fetchDetail:
|
|
26
|
-
} =
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
}, [
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
const x = () => {
|
|
45
|
-
const I = i.currentTime || 0;
|
|
46
|
-
_(I);
|
|
47
|
-
}, f = () => {
|
|
48
|
-
d(!0);
|
|
49
|
-
}, b = () => {
|
|
50
|
-
d(!1);
|
|
51
|
-
}, g = () => {
|
|
52
|
-
d(!1);
|
|
53
|
-
};
|
|
54
|
-
return i.on("timeupdate", x), i.on("play", f), i.on("pause", b), i.on("ended", g), () => {
|
|
55
|
-
i.off("timeupdate", x), i.off("play", f), i.off("pause", b), i.off("ended", g), i.destroy(), n.current = null;
|
|
56
|
-
};
|
|
57
|
-
}, [m, v, _, d]), u(() => {
|
|
58
|
-
if (n.current) {
|
|
59
|
-
const a = n.current;
|
|
60
|
-
Math.abs(a.currentTime - r) > 0.5 && (a.currentTime = r);
|
|
61
|
-
}
|
|
62
|
-
}, [r]);
|
|
63
|
-
const C = R(
|
|
64
|
-
async (a) => {
|
|
65
|
-
p ? await p(a) : await y(a);
|
|
18
|
+
const t = v(null), c = m !== void 0 ? m === "mobile" : V || g, {
|
|
19
|
+
currentTime: a,
|
|
20
|
+
setCurrentTime: C,
|
|
21
|
+
setIsPlaying: y,
|
|
22
|
+
setSubtitles: s,
|
|
23
|
+
currentDetail: P,
|
|
24
|
+
isLoadingDetail: S,
|
|
25
|
+
fetchDetail: i
|
|
26
|
+
} = k();
|
|
27
|
+
w(() => {
|
|
28
|
+
s(r);
|
|
29
|
+
}, [r, s]), H(
|
|
30
|
+
t,
|
|
31
|
+
p,
|
|
32
|
+
b,
|
|
33
|
+
{ setCurrentTime: C, setIsPlaying: y },
|
|
34
|
+
a
|
|
35
|
+
);
|
|
36
|
+
const f = d(
|
|
37
|
+
async (o) => {
|
|
38
|
+
e ? await e(o) : await i(o);
|
|
39
|
+
},
|
|
40
|
+
[e, i]
|
|
41
|
+
), W = d(
|
|
42
|
+
async (o) => {
|
|
43
|
+
e ? await e(o) : await i(o);
|
|
66
44
|
},
|
|
67
|
-
[
|
|
45
|
+
[e, i]
|
|
68
46
|
);
|
|
69
|
-
return /* @__PURE__ */
|
|
70
|
-
|
|
47
|
+
return c ? /* @__PURE__ */ u(
|
|
48
|
+
T,
|
|
49
|
+
{
|
|
50
|
+
playerRef: t,
|
|
51
|
+
subtitles: r,
|
|
52
|
+
currentTime: a,
|
|
53
|
+
onWordHoverChange: f,
|
|
54
|
+
onWordClick: W,
|
|
55
|
+
className: l,
|
|
56
|
+
style: n
|
|
57
|
+
}
|
|
58
|
+
) : /* @__PURE__ */ u(
|
|
59
|
+
M,
|
|
71
60
|
{
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
className: "xiping-video-subtitle-player__video"
|
|
81
|
-
}
|
|
82
|
-
) }) }) }),
|
|
83
|
-
/* @__PURE__ */ e(z, { className: "xiping-video-subtitle-player__resize-handle xiping-video-subtitle-player__resize-handle--vertical" }),
|
|
84
|
-
/* @__PURE__ */ e(s, { defaultSize: 40, minSize: 20, children: /* @__PURE__ */ e("div", { className: "xiping-video-subtitle-player__subtitle-container", children: /* @__PURE__ */ e(
|
|
85
|
-
E,
|
|
86
|
-
{
|
|
87
|
-
subtitles: o,
|
|
88
|
-
currentTime: r,
|
|
89
|
-
mode: "current",
|
|
90
|
-
onWordHoverChange: C
|
|
91
|
-
}
|
|
92
|
-
) }) })
|
|
93
|
-
] }) }),
|
|
94
|
-
/* @__PURE__ */ e(z, { className: "xiping-video-subtitle-player__resize-handle xiping-video-subtitle-player__resize-handle--horizontal" }),
|
|
95
|
-
/* @__PURE__ */ e(s, { defaultSize: 35, minSize: 25, maxSize: 50, children: /* @__PURE__ */ e("div", { className: "xiping-video-subtitle-player__right", children: /* @__PURE__ */ e("div", { className: "xiping-video-subtitle-player__detail", children: T ? /* @__PURE__ */ t("div", { className: "xiping-video-subtitle-player__detail-loading", children: [
|
|
96
|
-
/* @__PURE__ */ e("div", { className: "xiping-video-subtitle-player__detail-loading-spinner" }),
|
|
97
|
-
/* @__PURE__ */ e("span", { children: "加载中..." })
|
|
98
|
-
] }) : l ? /* @__PURE__ */ t("div", { className: "xiping-video-subtitle-player__detail-content", children: [
|
|
99
|
-
/* @__PURE__ */ e("div", { className: "xiping-video-subtitle-player__detail-word", children: l.word }),
|
|
100
|
-
l.pronunciation && /* @__PURE__ */ e("div", { className: "xiping-video-subtitle-player__detail-pronunciation", children: l.pronunciation }),
|
|
101
|
-
l.partOfSpeech && /* @__PURE__ */ e("div", { className: "xiping-video-subtitle-player__detail-pos", children: l.partOfSpeech }),
|
|
102
|
-
l.translation && /* @__PURE__ */ t("div", { className: "xiping-video-subtitle-player__detail-translation", children: [
|
|
103
|
-
/* @__PURE__ */ e("div", { className: "xiping-video-subtitle-player__detail-label", children: "中文翻译" }),
|
|
104
|
-
/* @__PURE__ */ e("div", { className: "xiping-video-subtitle-player__detail-text", children: l.translation })
|
|
105
|
-
] }),
|
|
106
|
-
l.definition && /* @__PURE__ */ t("div", { className: "xiping-video-subtitle-player__detail-definition", children: [
|
|
107
|
-
/* @__PURE__ */ e("div", { className: "xiping-video-subtitle-player__detail-label", children: "英文解释" }),
|
|
108
|
-
/* @__PURE__ */ e("div", { className: "xiping-video-subtitle-player__detail-text", children: l.definition })
|
|
109
|
-
] }),
|
|
110
|
-
l.examples && l.examples.length > 0 && /* @__PURE__ */ t("div", { className: "xiping-video-subtitle-player__detail-examples", children: [
|
|
111
|
-
/* @__PURE__ */ e("div", { className: "xiping-video-subtitle-player__detail-label", children: "例句" }),
|
|
112
|
-
l.examples.map((a, i) => /* @__PURE__ */ t(
|
|
113
|
-
"div",
|
|
114
|
-
{
|
|
115
|
-
className: "xiping-video-subtitle-player__detail-example",
|
|
116
|
-
children: [
|
|
117
|
-
/* @__PURE__ */ e("div", { className: "xiping-video-subtitle-player__detail-example-en", children: a.sentence }),
|
|
118
|
-
/* @__PURE__ */ e("div", { className: "xiping-video-subtitle-player__detail-example-zh", children: a.translation })
|
|
119
|
-
]
|
|
120
|
-
},
|
|
121
|
-
i
|
|
122
|
-
))
|
|
123
|
-
] })
|
|
124
|
-
] }) : /* @__PURE__ */ t("div", { className: "xiping-video-subtitle-player__detail-empty", children: [
|
|
125
|
-
/* @__PURE__ */ e("div", { className: "xiping-video-subtitle-player__detail-empty-icon", children: "📖" }),
|
|
126
|
-
/* @__PURE__ */ e("div", { className: "xiping-video-subtitle-player__detail-empty-text", children: "将鼠标悬停在字幕单词上查看详情" })
|
|
127
|
-
] }) }) }) })
|
|
128
|
-
] })
|
|
61
|
+
playerRef: t,
|
|
62
|
+
subtitles: r,
|
|
63
|
+
currentTime: a,
|
|
64
|
+
currentDetail: P,
|
|
65
|
+
isLoadingDetail: S,
|
|
66
|
+
onWordHoverChange: f,
|
|
67
|
+
className: l,
|
|
68
|
+
style: n
|
|
129
69
|
}
|
|
130
70
|
);
|
|
131
71
|
};
|
|
132
72
|
export {
|
|
133
|
-
|
|
134
|
-
|
|
73
|
+
X as VideoSubtitlePlayer,
|
|
74
|
+
X as default
|
|
135
75
|
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.xiping-video-subtitle-player--mobile{display:flex;flex-direction:column;min-height:0;height:100%}.xiping-video-subtitle-player__mobile-video{flex:0 0 auto;width:100%;aspect-ratio:16 / 9;background:#000}.xiping-video-subtitle-player__mobile-video-wrapper{width:100%;height:100%;background:#000;overflow:hidden}.xiping-video-subtitle-player__mobile-video-container{position:relative;width:100%;height:100%;background-color:#a62c2c;overflow:hidden}.xiping-video-subtitle-player__mobile-video-container .xgplayer{width:100%!important;height:100%!important}.xiping-video-subtitle-player__mobile-video-container .xgplayer video{-o-object-fit:fill!important;object-fit:fill!important}.xiping-video-subtitle-player__mobile-subtitle{flex:1;min-height:0;padding:12px 16px;overflow-y:auto;background:#0000004d;-webkit-overflow-scrolling:touch}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.xiping-video-subtitle-player--pc .xiping-video-subtitle-player__panel-group,.xiping-video-subtitle-player--pc .xiping-video-subtitle-player__panel-group-inner{width:100%;height:100%}.xiping-video-subtitle-player--pc .xiping-video-subtitle-player__right{border-left:1px solid rgba(255,255,255,.1)}.xiping-video-subtitle-player__resize-handle--horizontal{position:relative;width:2px;background:#ffffff1a;cursor:col-resize;transition:background .2s ease;flex-shrink:0}.xiping-video-subtitle-player__resize-handle--horizontal:hover{background:#fbbf2480}.xiping-video-subtitle-player__resize-handle--horizontal:active{background:#fbbf24cc}.xiping-video-subtitle-player__resize-handle--horizontal:before{content:"";position:absolute;inset:0 -4px;cursor:col-resize}.xiping-video-subtitle-player__resize-handle--vertical{position:relative;height:2px;background:#ffffff1a;cursor:row-resize;transition:background .2s ease;flex-shrink:0}.xiping-video-subtitle-player__resize-handle--vertical:hover{background:#fbbf2480}.xiping-video-subtitle-player__resize-handle--vertical:active{background:#fbbf24cc}.xiping-video-subtitle-player__resize-handle--vertical:before{content:"";position:absolute;inset:-4px 0;cursor:row-resize}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { default as React, RefObject } from 'react';
|
|
2
|
+
import { SubtitleData, HoverTarget, WordClickTarget } from '../subtitle-player/SubtitlePlayer';
|
|
3
|
+
export interface VideoSubtitlePlayerMobileProps {
|
|
4
|
+
/** 播放器挂载的容器 ref */
|
|
5
|
+
playerRef: RefObject<HTMLDivElement | null>;
|
|
6
|
+
/** 字幕数据 */
|
|
7
|
+
subtitles: SubtitleData[];
|
|
8
|
+
/** 当前播放时间(秒) */
|
|
9
|
+
currentTime: number;
|
|
10
|
+
/** 单词 hover 变化时拉取/展示详情(可为弹窗等) */
|
|
11
|
+
onWordHoverChange: (target: HoverTarget | null) => void | Promise<void>;
|
|
12
|
+
/** 单词点击时拉取/展示详情(移动端主要交互) */
|
|
13
|
+
onWordClick: (target: WordClickTarget) => void | Promise<void>;
|
|
14
|
+
className?: string;
|
|
15
|
+
style?: React.CSSProperties;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* 移动端视图:上下两栏(视频 + 字幕),无右侧详情区,详情后续以弹窗等形式实现
|
|
19
|
+
*/
|
|
20
|
+
export declare const VideoSubtitlePlayerMobile: React.FC<VideoSubtitlePlayerMobileProps>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback as l } from "react";
|
|
3
|
+
import u from "clsx";
|
|
4
|
+
import { SubtitlePlayer as y } from "../subtitle-player/SubtitlePlayer.js";
|
|
5
|
+
import { VideoSubtitlePlayerLayoutMobile as f } from "./layouts/VideoSubtitlePlayerLayoutMobile.js";
|
|
6
|
+
const P = ({
|
|
7
|
+
playerRef: r,
|
|
8
|
+
subtitles: a,
|
|
9
|
+
currentTime: s,
|
|
10
|
+
onWordHoverChange: t,
|
|
11
|
+
onWordClick: i,
|
|
12
|
+
className: c = "",
|
|
13
|
+
style: m
|
|
14
|
+
}) => {
|
|
15
|
+
const n = l(
|
|
16
|
+
async (o) => {
|
|
17
|
+
await t(o);
|
|
18
|
+
},
|
|
19
|
+
[t]
|
|
20
|
+
), d = l(
|
|
21
|
+
async (o) => {
|
|
22
|
+
await i(o);
|
|
23
|
+
},
|
|
24
|
+
[i]
|
|
25
|
+
), b = /* @__PURE__ */ e("div", { ref: r, className: "xiping-video-subtitle-player__video" }), p = /* @__PURE__ */ e(
|
|
26
|
+
y,
|
|
27
|
+
{
|
|
28
|
+
subtitles: a,
|
|
29
|
+
currentTime: s,
|
|
30
|
+
mode: "lyrics",
|
|
31
|
+
onWordHoverChange: n,
|
|
32
|
+
onWordClick: d
|
|
33
|
+
}
|
|
34
|
+
);
|
|
35
|
+
return /* @__PURE__ */ e(
|
|
36
|
+
f,
|
|
37
|
+
{
|
|
38
|
+
className: u(c),
|
|
39
|
+
style: m,
|
|
40
|
+
videoSlot: b,
|
|
41
|
+
subtitleSlot: p
|
|
42
|
+
}
|
|
43
|
+
);
|
|
44
|
+
};
|
|
45
|
+
export {
|
|
46
|
+
P as VideoSubtitlePlayerMobile
|
|
47
|
+
};
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { default as React, RefObject } from 'react';
|
|
2
|
+
import { SubtitleData, HoverTarget } from '../subtitle-player/SubtitlePlayer';
|
|
3
|
+
import { SubtitleDetail } from './useVideoSubtitleStore';
|
|
4
|
+
export interface VideoSubtitlePlayerPCProps {
|
|
5
|
+
/** 播放器挂载的容器 ref */
|
|
6
|
+
playerRef: RefObject<HTMLDivElement | null>;
|
|
7
|
+
/** 字幕数据 */
|
|
8
|
+
subtitles: SubtitleData[];
|
|
9
|
+
/** 当前播放时间(秒) */
|
|
10
|
+
currentTime: number;
|
|
11
|
+
/** 当前悬停单词的详情 */
|
|
12
|
+
currentDetail: SubtitleDetail | null;
|
|
13
|
+
/** 是否正在加载详情 */
|
|
14
|
+
isLoadingDetail: boolean;
|
|
15
|
+
/** 单词 hover 变化时拉取/展示详情 */
|
|
16
|
+
onWordHoverChange: (target: HoverTarget | null) => void | Promise<void>;
|
|
17
|
+
className?: string;
|
|
18
|
+
style?: React.CSSProperties;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* PC 端视图:可拖拽分栏 + 右侧详情区,所有 PC 专属 UI 集中在此
|
|
22
|
+
*/
|
|
23
|
+
export declare const VideoSubtitlePlayerPC: React.FC<VideoSubtitlePlayerPCProps>;
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { jsx as i, jsxs as l } from "react/jsx-runtime";
|
|
2
|
+
import { useCallback as y } from "react";
|
|
3
|
+
import b from "clsx";
|
|
4
|
+
import { SubtitlePlayer as h } from "../subtitle-player/SubtitlePlayer.js";
|
|
5
|
+
import { VideoSubtitlePlayerLayoutPC as g } from "./layouts/VideoSubtitlePlayerLayoutPC.js";
|
|
6
|
+
const C = ({
|
|
7
|
+
playerRef: t,
|
|
8
|
+
subtitles: s,
|
|
9
|
+
currentTime: n,
|
|
10
|
+
currentDetail: e,
|
|
11
|
+
isLoadingDetail: p,
|
|
12
|
+
onWordHoverChange: d,
|
|
13
|
+
className: o = "",
|
|
14
|
+
style: r
|
|
15
|
+
}) => {
|
|
16
|
+
const c = y(
|
|
17
|
+
async (a) => {
|
|
18
|
+
await d(a);
|
|
19
|
+
},
|
|
20
|
+
[d]
|
|
21
|
+
), v = /* @__PURE__ */ i("div", { ref: t, className: "xiping-video-subtitle-player__video" }), m = /* @__PURE__ */ i(
|
|
22
|
+
h,
|
|
23
|
+
{
|
|
24
|
+
subtitles: s,
|
|
25
|
+
currentTime: n,
|
|
26
|
+
mode: "lyrics",
|
|
27
|
+
onWordHoverChange: c
|
|
28
|
+
}
|
|
29
|
+
), _ = /* @__PURE__ */ i("div", { className: "xiping-video-subtitle-player__detail", children: p ? /* @__PURE__ */ l("div", { className: "xiping-video-subtitle-player__detail-loading", children: [
|
|
30
|
+
/* @__PURE__ */ i("div", { className: "xiping-video-subtitle-player__detail-loading-spinner" }),
|
|
31
|
+
/* @__PURE__ */ i("span", { children: "加载中..." })
|
|
32
|
+
] }) : e ? /* @__PURE__ */ l("div", { className: "xiping-video-subtitle-player__detail-content", children: [
|
|
33
|
+
/* @__PURE__ */ i("div", { className: "xiping-video-subtitle-player__detail-word", children: e.word }),
|
|
34
|
+
e.pronunciation && /* @__PURE__ */ i("div", { className: "xiping-video-subtitle-player__detail-pronunciation", children: e.pronunciation }),
|
|
35
|
+
e.partOfSpeech && /* @__PURE__ */ i("div", { className: "xiping-video-subtitle-player__detail-pos", children: e.partOfSpeech }),
|
|
36
|
+
e.translation && /* @__PURE__ */ l("div", { className: "xiping-video-subtitle-player__detail-translation", children: [
|
|
37
|
+
/* @__PURE__ */ i("div", { className: "xiping-video-subtitle-player__detail-label", children: "中文翻译" }),
|
|
38
|
+
/* @__PURE__ */ i("div", { className: "xiping-video-subtitle-player__detail-text", children: e.translation })
|
|
39
|
+
] }),
|
|
40
|
+
e.definition && /* @__PURE__ */ l("div", { className: "xiping-video-subtitle-player__detail-definition", children: [
|
|
41
|
+
/* @__PURE__ */ i("div", { className: "xiping-video-subtitle-player__detail-label", children: "英文解释" }),
|
|
42
|
+
/* @__PURE__ */ i("div", { className: "xiping-video-subtitle-player__detail-text", children: e.definition })
|
|
43
|
+
] }),
|
|
44
|
+
e.examples && e.examples.length > 0 && /* @__PURE__ */ l("div", { className: "xiping-video-subtitle-player__detail-examples", children: [
|
|
45
|
+
/* @__PURE__ */ i("div", { className: "xiping-video-subtitle-player__detail-label", children: "例句" }),
|
|
46
|
+
e.examples.map((a, x) => /* @__PURE__ */ l(
|
|
47
|
+
"div",
|
|
48
|
+
{
|
|
49
|
+
className: "xiping-video-subtitle-player__detail-example",
|
|
50
|
+
children: [
|
|
51
|
+
/* @__PURE__ */ i("div", { className: "xiping-video-subtitle-player__detail-example-en", children: a.sentence }),
|
|
52
|
+
/* @__PURE__ */ i("div", { className: "xiping-video-subtitle-player__detail-example-zh", children: a.translation })
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
x
|
|
56
|
+
))
|
|
57
|
+
] })
|
|
58
|
+
] }) : /* @__PURE__ */ l("div", { className: "xiping-video-subtitle-player__detail-empty", children: [
|
|
59
|
+
/* @__PURE__ */ i("div", { className: "xiping-video-subtitle-player__detail-empty-icon", children: "📖" }),
|
|
60
|
+
/* @__PURE__ */ i("div", { className: "xiping-video-subtitle-player__detail-empty-text", children: "将鼠标悬停在字幕单词上查看详情" })
|
|
61
|
+
] }) });
|
|
62
|
+
return /* @__PURE__ */ i(
|
|
63
|
+
g,
|
|
64
|
+
{
|
|
65
|
+
className: b(o),
|
|
66
|
+
style: r,
|
|
67
|
+
videoSlot: v,
|
|
68
|
+
subtitleSlot: m,
|
|
69
|
+
detailSlot: _
|
|
70
|
+
}
|
|
71
|
+
);
|
|
72
|
+
};
|
|
73
|
+
export {
|
|
74
|
+
C as VideoSubtitlePlayerPC
|
|
75
|
+
};
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { default as React } from 'react';
|
|
2
|
+
import { VideoSubtitlePlayerLayoutMobileProps } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* 移动端布局:上下两栏,无拖拽
|
|
5
|
+
* - 上:视频区域(100vw 宽,16:9 占位)
|
|
6
|
+
* - 下:仅字幕区域(单词详情后续以弹窗等形式实现,此处不展示)
|
|
7
|
+
*/
|
|
8
|
+
export declare const VideoSubtitlePlayerLayoutMobile: React.FC<VideoSubtitlePlayerLayoutMobileProps>;
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { jsxs as r, jsx as i } from "react/jsx-runtime";
|
|
2
|
+
import s from "clsx";
|
|
3
|
+
import '../VideoSubtitlePlayer.mobile.css';/* empty css */
|
|
4
|
+
const m = ({ className: e = "", style: l, videoSlot: o, subtitleSlot: t }) => /* @__PURE__ */ r(
|
|
5
|
+
"div",
|
|
6
|
+
{
|
|
7
|
+
className: s(
|
|
8
|
+
"xiping-video-subtitle-player",
|
|
9
|
+
"xiping-video-subtitle-player--mobile",
|
|
10
|
+
e
|
|
11
|
+
),
|
|
12
|
+
style: l,
|
|
13
|
+
children: [
|
|
14
|
+
/* @__PURE__ */ i("div", { className: "xiping-video-subtitle-player__mobile-video", children: /* @__PURE__ */ i("div", { className: "xiping-video-subtitle-player__mobile-video-wrapper", children: /* @__PURE__ */ i("div", { className: "xiping-video-subtitle-player__mobile-video-container", children: o }) }) }),
|
|
15
|
+
/* @__PURE__ */ i("div", { className: "xiping-video-subtitle-player__mobile-subtitle", children: t })
|
|
16
|
+
]
|
|
17
|
+
}
|
|
18
|
+
);
|
|
19
|
+
export {
|
|
20
|
+
m as VideoSubtitlePlayerLayoutMobile
|
|
21
|
+
};
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { jsx as i, jsxs as a } from "react/jsx-runtime";
|
|
2
|
+
import { Group as r, Panel as e, Separator as t } from "react-resizable-panels";
|
|
3
|
+
import l from "clsx";
|
|
4
|
+
import '../VideoSubtitlePlayer.pc.css';/* empty css */
|
|
5
|
+
const _ = ({ className: n = "", style: s, videoSlot: d, subtitleSlot: o, detailSlot: p }) => /* @__PURE__ */ i(
|
|
6
|
+
"div",
|
|
7
|
+
{
|
|
8
|
+
className: l(
|
|
9
|
+
"xiping-video-subtitle-player",
|
|
10
|
+
"xiping-video-subtitle-player--pc",
|
|
11
|
+
n
|
|
12
|
+
),
|
|
13
|
+
style: s,
|
|
14
|
+
children: /* @__PURE__ */ a(
|
|
15
|
+
r,
|
|
16
|
+
{
|
|
17
|
+
orientation: "horizontal",
|
|
18
|
+
className: "xiping-video-subtitle-player__panel-group",
|
|
19
|
+
children: [
|
|
20
|
+
/* @__PURE__ */ i(e, { defaultSize: "65", minSize: "40", children: /* @__PURE__ */ a(r, { orientation: "vertical", className: "xiping-video-subtitle-player__panel-group-inner", children: [
|
|
21
|
+
/* @__PURE__ */ i(e, { defaultSize: "60", minSize: "30", children: /* @__PURE__ */ i("div", { className: "xiping-video-subtitle-player__video-wrapper", children: /* @__PURE__ */ i("div", { className: "xiping-video-subtitle-player__video-container", children: d }) }) }),
|
|
22
|
+
/* @__PURE__ */ i(
|
|
23
|
+
t,
|
|
24
|
+
{
|
|
25
|
+
className: l(
|
|
26
|
+
"xiping-video-subtitle-player__resize-handle",
|
|
27
|
+
"xiping-video-subtitle-player__resize-handle--vertical"
|
|
28
|
+
)
|
|
29
|
+
}
|
|
30
|
+
),
|
|
31
|
+
/* @__PURE__ */ i(e, { defaultSize: "40", minSize: "20", children: /* @__PURE__ */ i("div", { className: "xiping-video-subtitle-player__subtitle-container", children: o }) })
|
|
32
|
+
] }) }),
|
|
33
|
+
/* @__PURE__ */ i(
|
|
34
|
+
t,
|
|
35
|
+
{
|
|
36
|
+
className: l(
|
|
37
|
+
"xiping-video-subtitle-player__resize-handle",
|
|
38
|
+
"xiping-video-subtitle-player__resize-handle--horizontal"
|
|
39
|
+
)
|
|
40
|
+
}
|
|
41
|
+
),
|
|
42
|
+
/* @__PURE__ */ i(e, { defaultSize: "35", minSize: "25", maxSize: "50", children: /* @__PURE__ */ i("div", { className: "xiping-video-subtitle-player__right", children: p }) })
|
|
43
|
+
]
|
|
44
|
+
}
|
|
45
|
+
)
|
|
46
|
+
}
|
|
47
|
+
);
|
|
48
|
+
export {
|
|
49
|
+
_ as VideoSubtitlePlayerLayoutPC
|
|
50
|
+
};
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { ReactNode } from 'react';
|
|
2
|
+
/** 移动端布局 props:仅视频 + 字幕,无详情区(详情后续弹窗等单独实现) */
|
|
3
|
+
export interface VideoSubtitlePlayerLayoutMobileProps {
|
|
4
|
+
className?: string;
|
|
5
|
+
style?: React.CSSProperties;
|
|
6
|
+
videoSlot: ReactNode;
|
|
7
|
+
subtitleSlot: ReactNode;
|
|
8
|
+
}
|
|
9
|
+
/** PC 端布局 props:视频 + 字幕 + 右侧详情区 */
|
|
10
|
+
export interface VideoSubtitlePlayerLayoutPCProps {
|
|
11
|
+
className?: string;
|
|
12
|
+
style?: React.CSSProperties;
|
|
13
|
+
videoSlot: ReactNode;
|
|
14
|
+
subtitleSlot: ReactNode;
|
|
15
|
+
/** 右侧详情区域 */
|
|
16
|
+
detailSlot: ReactNode;
|
|
17
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { RefObject } from 'react';
|
|
2
|
+
export interface UseXGPlayerCallbacks {
|
|
3
|
+
setCurrentTime: (time: number) => void;
|
|
4
|
+
setIsPlaying: (playing: boolean) => void;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* 封装 xgplayer 的创建、事件绑定与销毁,以及外部 currentTime 同步
|
|
8
|
+
* 调用方需渲染一个 div 并传入其 ref,播放器会挂载到该节点
|
|
9
|
+
*/
|
|
10
|
+
export declare function useXGPlayer(containerRef: RefObject<HTMLDivElement | null>, videoUrl: string, poster: string | undefined, callbacks: UseXGPlayerCallbacks, currentTime: number): void;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { useRef as h, useEffect as p } from "react";
|
|
2
|
+
import P from "xgplayer";
|
|
3
|
+
import '../../node_modules/.pnpm/xgplayer@3.0.23_core-js@3.47.0/node_modules/xgplayer/dist/index.min.css';/* empty css */
|
|
4
|
+
function T(o, s, u, y, r) {
|
|
5
|
+
const a = h(null), { setCurrentTime: l, setIsPlaying: n } = y;
|
|
6
|
+
p(() => {
|
|
7
|
+
if (!o.current) return;
|
|
8
|
+
const t = `xiping-video-subtitle-player-${Date.now()}`;
|
|
9
|
+
o.current.id = t;
|
|
10
|
+
const e = new P({
|
|
11
|
+
id: t,
|
|
12
|
+
url: s,
|
|
13
|
+
poster: u,
|
|
14
|
+
autoplay: !1,
|
|
15
|
+
fluid: !1,
|
|
16
|
+
width: "100%",
|
|
17
|
+
height: "100%",
|
|
18
|
+
controls: !0
|
|
19
|
+
});
|
|
20
|
+
a.current = e;
|
|
21
|
+
const f = () => {
|
|
22
|
+
const m = e.currentTime ?? 0;
|
|
23
|
+
l(m);
|
|
24
|
+
}, i = () => n(!0), c = () => n(!1), d = () => n(!1);
|
|
25
|
+
return e.on("timeupdate", f), e.on("play", i), e.on("pause", c), e.on("ended", d), () => {
|
|
26
|
+
e.off("timeupdate", f), e.off("play", i), e.off("pause", c), e.off("ended", d), e.destroy(), a.current = null;
|
|
27
|
+
};
|
|
28
|
+
}, [s, u, l, n]), p(() => {
|
|
29
|
+
const t = a.current;
|
|
30
|
+
if (!t) return;
|
|
31
|
+
Math.abs(t.currentTime - r) > 0.5 && (t.currentTime = r);
|
|
32
|
+
}, [r]);
|
|
33
|
+
}
|
|
34
|
+
export {
|
|
35
|
+
T as useXGPlayer
|
|
36
|
+
};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
/* components/button/Button.css */
|
|
2
|
+
.xiping-button{display:inline-flex;align-items:center;justify-content:center;border-radius:6px;font-weight:500;transition:all .2s ease;cursor:pointer;border:none;outline:none}.xiping-button:focus{outline:2px solid transparent;outline-offset:2px;box-shadow:0 0 0 3px #3b82f680}.xiping-button--small{padding:6px 12px;font-size:14px}.xiping-button--medium{padding:8px 16px;font-size:16px}.xiping-button--large{padding:12px 24px;font-size:18px}.xiping-button--primary{background-color:#2563eb;color:#fff}.xiping-button--primary:hover:not(:disabled){background-color:#1d4ed8}.xiping-button--primary:focus{box-shadow:0 0 0 3px #2563eb80}.xiping-button--secondary{background-color:#4b5563;color:#fff}.xiping-button--secondary:hover:not(:disabled){background-color:#374151}.xiping-button--secondary:focus{box-shadow:0 0 0 3px #4b556380}.xiping-button--outline{background-color:transparent;border:1px solid #d1d5db;color:#374151}.xiping-button--outline:hover:not(:disabled){background-color:#f9fafb}.xiping-button--outline:focus{box-shadow:0 0 0 3px #4b556380}.xiping-button--ghost{background-color:transparent;color:#374151}.xiping-button--ghost:hover:not(:disabled){background-color:#f3f4f6}.xiping-button--ghost:focus{box-shadow:0 0 0 3px #4b556380}.xiping-button--disabled{opacity:.5;cursor:not-allowed}.xiping-button--loading{cursor:wait}.xiping-button--full-width{width:100%}.xiping-button__icon-left{margin-right:8px}.xiping-button__icon-right{margin-left:8px}.xiping-button__spinner{margin-left:-4px;margin-right:8px;width:16px;height:16px;animation:xiping-spin 1s linear infinite}.xiping-button__spinner-circle{opacity:.25}.xiping-button__spinner-path{opacity:.75}@keyframes xiping-spin{0%{transform:rotate(0)}to{transform:rotate(360deg)}}
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
/* components/comic-text/ComicText.css */
|
|
6
|
+
.xiping-comic-text{-webkit-user-select:none;-moz-user-select:none;user-select:none;text-align:center}
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
/* components/dock/Duck.css */
|
|
10
|
+
.xiping-dock{margin-left:auto;margin-right:auto;margin-top:2rem;display:flex;height:58px;width:-moz-max-content;width:max-content;align-items:center;justify-content:center;gap:.5rem;border-radius:1rem;border:1px solid;padding:.5rem;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}@supports (backdrop-filter: blur(12px)){.xiping-dock{background-color:#ffffff1a}.dark .xiping-dock{background-color:#0000001a}}.xiping-dock--top{align-items:flex-start}.xiping-dock--middle{align-items:center}.xiping-dock--bottom{align-items:flex-end}.xiping-dock-icon{display:flex;aspect-ratio:1 / 1;cursor:pointer;align-items:center;justify-content:center;border-radius:9999px}
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
/* components/flip-text/FlipText.css */
|
|
14
|
+
.xiping-flip-container{display:flex;justify-content:center;gap:.5rem}.xiping-flip-char{transform-origin:center;filter:drop-shadow(0 1px 1px rgb(0 0 0 / .05))}
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
/* components/gradient-text/index.css */
|
|
18
|
+
.xiping-gradient-text{position:relative;margin:0 auto;display:flex;max-width:-moz-fit-content;max-width:fit-content;flex-direction:row;align-items:center;justify-content:center;border-radius:1.25rem;font-weight:500;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);transition:box-shadow .5s ease-out;overflow:hidden;cursor:pointer}.xiping-gradient-text__overlay{position:absolute;inset:0;background-size:300% 100%;animation:xiping-gradient linear infinite;border-radius:inherit;z-index:0;pointer-events:none}.xiping-gradient-text__overlay:before{content:"";position:absolute;border-radius:inherit;width:calc(100% - 2px);height:calc(100% - 2px);left:50%;top:50%;transform:translate(-50%,-50%);background-color:#060010;z-index:-1}@keyframes xiping-gradient{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}.xiping-gradient-text__content{display:inline-block;position:relative;z-index:2;background-size:300% 100%;background-clip:text;-webkit-background-clip:text;color:transparent;animation:xiping-gradient linear infinite}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
/* components/hyper-text/HyperText.css */
|
|
22
|
+
.xiping-hyper-container{overflow:hidden;padding-top:.5rem;padding-bottom:.5rem;font-size:2.25rem;line-height:2.5rem;font-weight:700}.xiping-hyper-char{font-family:ui-monospace,SFMono-Regular,SF Mono,Menlo,Consolas,Liberation Mono,monospace}.xiping-hyper-space{width:.75rem}
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
/* components/image-compare/ImageCompare.css */
|
|
26
|
+
.xiping-image-compare-container{position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none;overflow:hidden;width:100%}.xiping-image-compare-label{position:absolute;top:1rem;padding:.25rem .5rem;background-color:#0009;color:#fff;font-size:.75rem;font-weight:500;border-radius:.25rem;-webkit-backdrop-filter:blur(4px);backdrop-filter:blur(4px);z-index:10}.xiping-image-compare-label-original{right:1rem}.xiping-image-compare-label-modified{left:1rem}.xiping-image-compare-overlay{position:absolute;inset:0;height:100%;overflow:hidden}.xiping-image-compare-divider{position:absolute;top:0;bottom:0;background-color:#ffffffe6;cursor:ew-resize;box-shadow:0 0 0 1px #0000004d,0 0 0 1px #ffffff80 inset,0 0 8px #0003}.xiping-image-compare-divider-button{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:2rem;height:2rem;border-radius:50%;background-color:#fffffff2;border:2px solid rgba(0,0,0,.2);box-shadow:0 0 0 1px #fffc,0 4px 12px #0000004d,0 2px 4px #0003;display:flex;align-items:center;justify-content:center;transition:box-shadow .2s ease,transform .2s ease}.xiping-image-compare-divider-button:hover{box-shadow:0 0 0 1px #ffffffe6,0 6px 16px #0006,0 3px 6px #0000004d;transform:translate(-50%,-50%) scale(1.05)}.xiping-image-compare-divider-button:active{transform:translate(-50%,-50%) scale(.95)}.xiping-image-compare-divider-icon{width:1.5rem;height:1.5rem;color:#1f2937}.xiping-image-compare-divider-theme-dark{background-color:#000000e6;box-shadow:0 0 0 1px #ffffff4d,0 0 0 1px #00000080 inset,0 0 8px #fff3}.xiping-image-compare-divider-button-theme-dark{background-color:#000000f2;border:2px solid rgba(255,255,255,.2);box-shadow:0 0 0 1px #000c,0 4px 12px #ffffff4d,0 2px 4px #fff3}.xiping-image-compare-divider-button-theme-dark:hover{box-shadow:0 0 0 1px #000000e6,0 6px 16px #fff6,0 3px 6px #ffffff4d}.xiping-image-compare-divider-theme-dark .xiping-image-compare-divider-icon{color:#f3f4f6}
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
/* components/image-viewer/ImageThumbnails.css */
|
|
30
|
+
.xiping-thumbnails-wrapper{height:6rem;background-color:#00000080;flex-shrink:0;z-index:10;padding-bottom:env(safe-area-inset-bottom);padding-left:env(safe-area-inset-left);padding-right:env(safe-area-inset-right)}.xiping-thumbnails-wrapper--hidden{display:none}.xiping-thumbnails-scroll{height:6rem;width:100vw;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;scrollbar-width:none;-ms-overflow-style:none}.xiping-thumbnails-scroll::-webkit-scrollbar{display:none}.xiping-thumbnails-container{display:flex;gap:.5rem;padding:.5rem;height:6rem;min-width:-moz-max-content;min-width:max-content}.xiping-thumbnail-item{height:100%;aspect-ratio:1 / 1;flex-shrink:0;cursor:pointer;border:2px solid transparent;transition:all .2s}.xiping-thumbnail-item--active{border-color:#fff}.xiping-thumbnail-image{width:100%;height:100%;-o-object-fit:contain;object-fit:contain}
|
|
31
|
+
|
|
32
|
+
|
|
33
|
+
/* components/image-viewer/ImageViewer.css */
|
|
34
|
+
.xiping-wrapper{width:100vw;height:100vh;position:relative;display:flex;flex-direction:column;padding-top:env(safe-area-inset-top,0)}.xiping-tool-wrapper{position:absolute;top:16px;right:16px;display:flex;gap:16px;z-index:10}.xiping-close-icon,.xiping-download-icon{color:#fff;cursor:pointer}.xiping-main-content{flex:1;min-height:0;position:relative;display:flex;align-items:center;justify-content:center}.xiping-pinch-content{width:100%;height:100%}.xiping-image{width:100vw;height:100%;-o-object-fit:contain;object-fit:contain;pointer-events:none}.xiping-loading{position:absolute;inset:0;display:flex;align-items:center;justify-content:center;background-color:#00000080}.xiping-modal-content{overflow:hidden}.xiping-modal-overlay{background-color:#000000b3}.scrollbar-hide{-ms-overflow-style:none;scrollbar-width:none}.scrollbar-hide::-webkit-scrollbar{display:none}
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
/* components/message/Message.css */
|
|
38
|
+
.xiping-message{display:flex;align-items:flex-start;max-width:80%;margin-bottom:16px}.xiping-message.user{align-self:flex-end;flex-direction:row-reverse;margin-left:auto}.xiping-message.assistant{align-self:flex-start;margin-right:auto}.xiping-message__avatar{width:36px;height:36px;border-radius:50%;overflow:hidden;margin:0 8px;background-color:#e0e0e0;display:flex;align-items:center;justify-content:center;flex-shrink:0}.xiping-message__content{background-color:#fff;padding:12px 16px;border-radius:12px;box-shadow:0 1px 2px #0000001a;position:relative;max-width:100%}.xiping-message:not(:has(.xiping-message__avatar)) .xiping-message__content{margin:0}.xiping-message.user .xiping-message__content{background-color:#007bff;color:#fff}.xiping-message__text{word-break:break-word;line-height:1.5}.xiping-message__timestamp{font-size:.75rem;color:#888;margin-top:4px;text-align:right}.xiping-message.user .xiping-message__timestamp{color:#fffc}.xiping-message__thinking{display:flex;align-items:center;margin-top:8px}.xiping-message__thinking-dots{display:flex;align-items:center;margin-right:8px}.xiping-message__thinking-dots span{width:8px;height:8px;margin:0 2px;background-color:#888;border-radius:50%;display:inline-block;animation:xiping-thinking 1.4s infinite ease-in-out both}.xiping-message__thinking-dots span:nth-child(1){animation-delay:-.32s}.xiping-message__thinking-dots span:nth-child(2){animation-delay:-.16s}.xiping-message__thinking-text{font-size:.9rem;color:#888}.xiping-message.user .xiping-message__thinking-text{color:#fffc}@keyframes xiping-thinking{0%,80%,to{transform:scale(.6)}40%{transform:scale(1)}}.xiping-message__loading{display:flex;align-items:center;justify-content:center;padding:8px}.xiping-message__loading-spinner{width:24px;height:24px;border:3px solid rgba(0,123,255,.3);border-radius:50%;border-top-color:#007bff;animation:xiping-spin 1s ease-in-out infinite}@keyframes xiping-spin{to{transform:rotate(360deg)}}.xiping-message__think{margin-top:12px;padding:8px 12px;background-color:#0000000d;border-radius:8px;font-size:.9rem}.xiping-message.user .xiping-message__think{background-color:#ffffff1a}.xiping-message__think-header{display:flex;align-items:center;gap:8px;margin-bottom:8px;font-weight:500}.xiping-message__think-toggle{background:none;border:none;padding:4px;cursor:pointer;color:#666;display:flex;align-items:center;justify-content:center;border-radius:4px;transition:background-color .2s ease}.xiping-message__think-toggle:hover{background-color:#0000000d}.xiping-message__think-content{max-height:1000px;opacity:1;overflow:hidden;transition:all .3s ease-in-out}.xiping-message__think-content.hidden{max-height:0;opacity:0;margin:0;padding:0}.xiping-message__knowledge-sources{margin-top:8px;padding:8px;background-color:#00000008;border-radius:4px;font-size:.9em}.xiping-message__knowledge-sources-header{font-weight:500;margin-bottom:4px;color:#666}.xiping-message__knowledge-sources-list{list-style:none;padding:0;margin:0}.xiping-message__knowledge-source-item{margin-bottom:4px}.xiping-message__knowledge-source-item:last-child{margin-bottom:0}.xiping-message__knowledge-source-item a{color:#06c;text-decoration:none}.xiping-message__knowledge-source-item a:hover{text-decoration:underline}.xiping-message__knowledge-source-description{font-size:.9em;color:#666;margin-top:2px;margin-left:8px}.xiping-message__text-container{position:relative;display:flex;flex-direction:column;gap:4px}.xiping-message__copy-button{align-self:flex-end;padding:4px;background:none;border:none;cursor:pointer;color:#666;opacity:0;transition:all .2s ease;border-radius:4px;display:flex;align-items:center;justify-content:center}.xiping-message__text-container:hover .xiping-message__copy-button{opacity:1}.xiping-message__copy-button:hover{color:#333;background-color:#0000000d}.xiping-message__copy-tooltip{position:absolute;top:-24px;right:0;background-color:#333;color:#fff;padding:4px 8px;border-radius:4px;font-size:12px;white-space:nowrap;animation:xiping-fadeInOut 2s ease-in-out}@keyframes xiping-fadeInOut{0%{opacity:0;transform:translateY(4px)}10%{opacity:1;transform:translateY(0)}90%{opacity:1;transform:translateY(0)}to{opacity:0;transform:translateY(4px)}}
|
|
39
|
+
|
|
40
|
+
|
|
41
|
+
/* components/pointer/Pointer.css */
|
|
42
|
+
.xiping-pointer{position:fixed;z-index:50;pointer-events:none;transform:translate(-50%,-50%)}.xiping-pointer-icon{transform:rotate(-70deg);stroke:#fff;color:#000}
|
|
43
|
+
|
|
44
|
+
|
|
45
|
+
/* components/scratch-to-reveal/ScratchToReveal.css */
|
|
46
|
+
.xiping-scratch-to-reveal{position:relative;-webkit-user-select:none;-moz-user-select:none;user-select:none}.xiping-scratch-canvas{position:absolute;left:0;top:0}
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
/* components/shimmer-button/ShimmerButton.css */
|
|
50
|
+
.xiping-shimmer-button{position:relative;z-index:0;display:flex;cursor:pointer;align-items:center;justify-content:center;overflow:hidden;white-space:nowrap;border:1px solid rgba(255,255,255,.1);padding:.75rem 1.5rem;color:#fff;background:var(--bg);border-radius:var(--radius);transform:translateZ(0);transition:transform .3s ease-in-out}.xiping-shimmer-button:active{transform:translateY(1px) translateZ(0)}@media(prefers-color-scheme:dark){.xiping-shimmer-button{color:#000}}.xiping-shimmer-button-spark-container{position:absolute;z-index:-30;inset:0;overflow:visible;filter:blur(2px);container-type:size}.xiping-shimmer-button-spark{position:absolute;inset:0;height:100cqh;aspect-ratio:1;border-radius:0;-webkit-mask:none;mask:none;animation:xiping-shimmer-slide var(--speed) ease-in-out infinite alternate}.xiping-shimmer-button-spark-before{position:absolute;inset:-100%;width:auto;transform:rotate(0);background:conic-gradient(from calc(270deg - (var(--spread) * .5)),transparent 0,var(--shimmer-color) var(--spread),transparent var(--spread));animation:xiping-spin-around calc(var(--speed) * 2) infinite linear}.xiping-shimmer-button-highlight{position:absolute;inset:0;width:100%;height:100%;border-radius:1rem;box-shadow:inset 0 -8px 10px #ffffff1f;transform:translateZ(0);transition:all .3s ease-in-out}.xiping-shimmer-button:hover .xiping-shimmer-button-highlight{box-shadow:inset 0 -6px 10px #ffffff40}.xiping-shimmer-button:active .xiping-shimmer-button-highlight{box-shadow:inset 0 -10px 10px #ffffff40}.xiping-shimmer-button-backdrop{position:absolute;z-index:-20;background:var(--bg);border-radius:var(--radius);inset:var(--cut)}@keyframes xiping-shimmer-slide{to{transform:translate(calc(100cqw - 100%))}}@keyframes xiping-spin-around{0%{transform:translateZ(0) rotate(0)}15%,35%{transform:translateZ(0) rotate(90deg)}65%,85%{transform:translateZ(0) rotate(270deg)}to{transform:translateZ(0) rotate(360deg)}}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
/* components/shiny-button/ShinyButton.css */
|
|
54
|
+
.xiping-shiny-button{position:relative;cursor:pointer;border-radius:.5rem;padding:.5rem 1.5rem;font-weight:500;-webkit-backdrop-filter:blur(24px);backdrop-filter:blur(24px);border:1px solid;transition:box-shadow .3s ease-in-out}.xiping-shiny-button:hover{box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a}@media(prefers-color-scheme:dark){.xiping-shiny-button{background:radial-gradient(circle at 50% 0%,var(--primary) 10%,transparent 60%)}.xiping-shiny-button:hover{box-shadow:0 0 20px var(--primary) / 10%}}.xiping-shiny-button-text{position:relative;display:block;width:100%;height:100%;font-size:.875rem;text-transform:uppercase;letter-spacing:.05em;color:#000000a6}@media(prefers-color-scheme:dark){.xiping-shiny-button-text{font-weight:300;color:#ffffffe5}}.xiping-shiny-button-border{position:absolute;inset:0;z-index:10;display:block;border-radius:inherit;padding:1px}
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
/* components/shiny-text/ShinyText.css */
|
|
58
|
+
.shiny-text{display:inline-block}
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
/* components/sparkles-text/SparklesText.css */
|
|
62
|
+
.xiping-sparkle{pointer-events:none;position:absolute;z-index:20}.xiping-sparkles-text{font-size:3.75rem;font-weight:700}.xiping-sparkles-text-wrapper{position:relative;display:inline-block}
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
/* components/split-text/SplitText.css */
|
|
66
|
+
.xiping-split-parent{overflow:hidden;display:inline-block;white-space:normal}
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
/* components/subtitle-player/CurrentMode.css */
|
|
70
|
+
.xiping-subtitle-player__current-item{display:flex;flex-direction:column;gap:.25rem;transition:all .2s ease}.xiping-subtitle-player__current-label{font-size:.75rem;font-weight:600;color:#ffffffb3;text-transform:uppercase;letter-spacing:.05em;margin-bottom:.25rem}.xiping-subtitle-player__current-text{font-size:1rem;font-weight:500;text-shadow:0 2px 4px rgba(0,0,0,.5)}.xiping-subtitle-player__current-line{margin:.25rem 0}.xiping-subtitle-player__current-line:first-child{margin-top:0}.xiping-subtitle-player__current-line:last-child{margin-bottom:0}.xiping-subtitle-player__current-hover-layer{position:absolute;inset:0;pointer-events:none}@media(max-width:768px){.xiping-subtitle-player__current-text{font-size:.9rem}}
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
/* components/subtitle-player/LyricsMode.css */
|
|
74
|
+
.xiping-subtitle-player__lyrics-time{font-size:.7rem;font-weight:500;color:#ffffff80;font-family:Monaco,Menlo,Ubuntu Mono,monospace;margin-bottom:.25rem;-webkit-user-select:none;-moz-user-select:none;user-select:none}.xiping-subtitle-player__lyrics-item{display:flex;flex-direction:column;gap:.25rem;transition:all .2s ease}.xiping-subtitle-player__lyrics-item--active{color:#fbbf24;font-weight:600;transition:all .3s ease;position:relative}.xiping-subtitle-player__lyrics-item--active:before{content:"";position:absolute;left:-1rem;top:50%;transform:translateY(-50%);width:4px;height:92%;background:#fbbf24;border-radius:2px}.xiping-subtitle-player__lyrics-item--past{opacity:.5;color:#fff9}.xiping-subtitle-player__lyrics-label{font-size:.75rem;font-weight:600;color:#ffffffb3;text-transform:uppercase;letter-spacing:.05em;margin-bottom:.25rem}.xiping-subtitle-player__lyrics-text{font-size:1rem;font-weight:500;text-shadow:0 2px 4px rgba(0,0,0,.5)}.xiping-subtitle-player__lyrics-line{margin:.25rem 0}.xiping-subtitle-player__lyrics-line:first-child{margin-top:0}.xiping-subtitle-player__lyrics-line:last-child{margin-bottom:0}.xiping-subtitle-player__lyrics-hover-layer{position:absolute;inset:0;pointer-events:none}.xiping-subtitle-player--lyrics{max-height:600px;overflow-y:auto;gap:.5rem;scroll-behavior:smooth}.xiping-subtitle-player--lyrics::-webkit-scrollbar{width:8px}.xiping-subtitle-player--lyrics::-webkit-scrollbar-track{background:#ffffff1a;border-radius:4px}.xiping-subtitle-player--lyrics::-webkit-scrollbar-thumb{background:#ffffff4d;border-radius:4px}.xiping-subtitle-player--lyrics::-webkit-scrollbar-thumb:hover{background:#ffffff80}.xiping-subtitle-player__group{display:flex;flex-direction:column;gap:.5rem;width:100%;border-radius:.5rem;padding:.5rem;margin:-.5rem;transition:all .2s ease}.xiping-subtitle-player__group:hover{background-color:#ffffff1a}.xiping-subtitle-player__group:hover .xiping-subtitle-player__lyrics-item{transform:translate(4px)}.xiping-subtitle-player__group:hover .xiping-subtitle-player__lyrics-item--active{background-color:#fbbf2426}.xiping-subtitle-player__lyrics-item--active .xiping-subtitle-word{color:#fbbf24;font-weight:600}@media(max-width:768px){.xiping-subtitle-player__lyrics-text{font-size:.9rem}}
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
/* components/subtitle-player/SubtitlePlayer.css */
|
|
78
|
+
.xiping-subtitle-player{display:flex;flex-direction:column;gap:.75rem;padding:1rem;background:#000000bf;border-radius:.5rem;-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);color:#fff;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;line-height:1.6;max-width:100%;box-sizing:border-box;position:relative}.xiping-subtitle-player__hover-overlay{position:absolute;transform:translate(-50%,.5rem);z-index:10;pointer-events:auto}.xiping-subtitle-player:has(.xiping-subtitle-player__current-item:only-child){align-items:center}.xiping-subtitle-player:has(.xiping-subtitle-player__current-item:not(:only-child)){align-items:flex-start}.xiping-subtitle-word{display:inline-block;position:relative;transition:all .2s ease;padding:0 .05em;margin:0 .05em;border-radius:2px}.xiping-subtitle-word:hover{background-color:#ffffff1a;transform:translateY(-1px)}.xiping-subtitle-word-before,.xiping-subtitle-word-after{display:inline}@media(max-width:768px){.xiping-subtitle-player{padding:.75rem;font-size:.9rem}}
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
/* components/text-animate/TextAnimate.css */
|
|
82
|
+
.xiping-text-animate{white-space:pre-wrap}.xiping-text-animate-segment{display:inline-block;white-space:pre}.xiping-text-animate-segment--line{display:block}
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
/* components/text-type/TextType.css */
|
|
86
|
+
.xiping-text-type{display:inline-block;white-space:pre-wrap}.xiping-text-type__content{display:inline-block}.xiping-text-type__cursor{margin-left:.25rem;display:inline-block;opacity:1}.xiping-text-type__cursor--hidden{display:none}
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
/* components/txt-reader/index.module.css */
|
|
90
|
+
._xiping-top-progress_rkm9f_23{position:fixed;left:0;top:0;right:0;background-color:#f08;height:10px}._xiping-container_rkm9f_33{position:relative;width:100%;height:100%;overflow-y:auto}._xiping-content_rkm9f_41{width:100%;white-space:pre-wrap;word-break:break-word}._xiping-bottom-progress_rkm9f_48{position:fixed;color:#fff;border-radius:4px;font-size:.875rem;background-color:#000000b3;padding:.25rem .5rem;right:1.25rem;bottom:1.25rem}._xiping-text-content_rkm9f_63::-webkit-scrollbar{width:8px}._xiping-text-content_rkm9f_63::-webkit-scrollbar-thumb{box-shadow:inset 0 0 5px #0003;background:#0003}._xiping-text-content_rkm9f_63::-webkit-scrollbar-track{box-shadow:inset 0 0 5px #0003;border-radius:0;background:#00000014}
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
/* components/typing-animation/index.css */
|
|
94
|
+
.xiping-typing-animation{font-size:2.25rem;font-weight:700;line-height:5rem;letter-spacing:-.02em}
|
|
95
|
+
|
|
96
|
+
|
|
97
|
+
/* components/variable-proximity/index.css */
|
|
98
|
+
.xiping-variable-proximity{font-family:Roboto Flex,Noto Sans SC,PingFang SC,Microsoft YaHei,SimHei,sans-serif}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
/* components/video-dialog/VideoDialog.css */
|
|
102
|
+
.xiping-video-dialog{position:relative}.xiping-video-dialog-container{position:relative;cursor:pointer}.xiping-video-dialog-thumbnail{width:100%;border-radius:.375rem;border:1px solid;box-shadow:0 10px 15px -3px #0000001a,0 4px 6px -2px #0000000d;transition:all .2s ease-out}.xiping-video-dialog-container:hover .xiping-video-dialog-thumbnail{filter:brightness(.8)}.xiping-video-dialog-overlay{position:absolute;inset:0;display:flex;transform:scale(.9);align-items:center;justify-content:center;border-radius:1rem;transition:all .2s ease-out}.xiping-video-dialog-container:hover .xiping-video-dialog-overlay{transform:scale(1)}.xiping-video-dialog-play-outer{display:flex;width:7rem;height:7rem;align-items:center;justify-content:center;border-radius:9999px;background-color:hsla(var(--primary-h),var(--primary-s),var(--primary-l),.1);-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.xiping-video-dialog-play-inner{position:relative;display:flex;width:5rem;height:5rem;transform:scale(1);align-items:center;justify-content:center;border-radius:9999px;background:linear-gradient(to bottom,hsla(var(--primary-h),var(--primary-s),var(--primary-l),.3),hsl(var(--primary-h),var(--primary-s),var(--primary-l)));box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -1px #0000000f;transition:all .2s ease-out}.xiping-video-dialog-container:hover .xiping-video-dialog-play-inner{transform:scale(1.2)}.xiping-video-dialog-play-icon{width:2rem;height:2rem;transform:scale(1);fill:#fff;color:#fff;transition:transform .2s ease-out;filter:drop-shadow(0 4px 3px rgb(0 0 0 / .07)) drop-shadow(0 2px 2px rgb(0 0 0 / .06))}.xiping-video-dialog-container:hover .xiping-video-dialog-play-icon{transform:scale(1.05)}.xiping-video-dialog-modal{position:fixed;inset:0;z-index:50;display:flex;align-items:center;justify-content:center;background-color:#00000080;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}.xiping-video-dialog-modal-content{position:relative;margin:0 1rem;aspect-ratio:16 / 9;width:100%;max-width:56rem}@media(min-width:768px){.xiping-video-dialog-modal-content{margin:0}}.xiping-video-dialog-close-button{position:absolute;top:-4rem;right:0;border-radius:9999px;background-color:#17171780;padding:.5rem;font-size:1.25rem;color:#fff;box-shadow:0 0 0 1px #0000001a;-webkit-backdrop-filter:blur(12px);backdrop-filter:blur(12px)}@media(prefers-color-scheme:dark){.xiping-video-dialog-close-button{background-color:#f5f5f580;color:#000}}.xiping-video-dialog-close-icon{width:1.25rem;height:1.25rem}.xiping-video-dialog-video-wrapper{position:relative;isolation:isolate;z-index:1;width:100%;height:100%;overflow:hidden;border-radius:1rem;border:2px solid white}.xiping-video-dialog-iframe{width:100%;height:100%;border-radius:1rem}:root{--primary-h: 221.2;--primary-s: 83.2%;--primary-l: 53.3%}
|
|
103
|
+
|
|
104
|
+
|
|
105
|
+
/* components/video-subtitle-player/VideoSubtitlePlayer.css */
|
|
106
|
+
.xiping-video-subtitle-player{width:100%;height:100%;background:#1a1a1a;border-radius:8px;overflow:hidden;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif}.xiping-video-subtitle-player__video-wrapper{width:100%;height:100%;background:#000;overflow:hidden}.xiping-video-subtitle-player__video-container{position:relative;width:100%;height:100%;background:#000;overflow:hidden}.xiping-video-subtitle-player__video{position:absolute;top:0;left:0;width:100%;height:100%;padding:0}.xiping-video-subtitle-player__video-container .xgplayer{width:100%!important;height:100%!important}.xiping-video-subtitle-player__video-container .xgplayer video{-o-object-fit:fill!important;object-fit:fill!important}.xiping-video-subtitle-player__subtitle-container{width:100%;height:100%;padding:20px;overflow-y:auto;background:#0000004d}.xiping-video-subtitle-player__right{width:100%;height:100%;background:#00000080;display:flex;flex-direction:column}.xiping-video-subtitle-player__detail{flex:1;padding:24px;overflow-y:auto;color:#fff}.xiping-video-subtitle-player__detail-loading{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:16px;color:#ffffffb3}.xiping-video-subtitle-player__detail-loading-spinner{width:40px;height:40px;border:3px solid rgba(255,255,255,.1);border-top-color:#fbbf24;border-radius:50%;animation:xiping-vsp-spin 1s linear infinite}@keyframes xiping-vsp-spin{to{transform:rotate(360deg)}}.xiping-video-subtitle-player__detail-empty{display:flex;flex-direction:column;align-items:center;justify-content:center;height:100%;gap:16px;color:#ffffff80;text-align:center}.xiping-video-subtitle-player__detail-empty-icon{font-size:48px;opacity:.5}.xiping-video-subtitle-player__detail-empty-text{font-size:14px;line-height:1.6}.xiping-video-subtitle-player__detail-content{display:flex;flex-direction:column;gap:20px}.xiping-video-subtitle-player__detail-word{font-size:32px;font-weight:700;color:#fbbf24;line-height:1.2;margin-bottom:8px}.xiping-video-subtitle-player__detail-pronunciation{font-size:18px;color:#ffffffb3;font-style:italic;margin-bottom:4px}.xiping-video-subtitle-player__detail-pos{display:inline-block;padding:4px 12px;background:#fbbf2433;color:#fbbf24;border-radius:4px;font-size:12px;font-weight:600;text-transform:uppercase;width:-moz-fit-content;width:fit-content;margin-bottom:8px}.xiping-video-subtitle-player__detail-label{font-size:12px;font-weight:600;color:#ffffff80;text-transform:uppercase;letter-spacing:.05em;margin-bottom:8px}.xiping-video-subtitle-player__detail-text{font-size:16px;line-height:1.6;color:#ffffffe6}.xiping-video-subtitle-player__detail-translation,.xiping-video-subtitle-player__detail-definition{padding-bottom:16px;border-bottom:1px solid rgba(255,255,255,.1)}.xiping-video-subtitle-player__detail-definition{border-bottom:none}.xiping-video-subtitle-player__detail-examples{display:flex;flex-direction:column;gap:16px}.xiping-video-subtitle-player__detail-example{padding:16px;background:#ffffff0d;border-radius:8px;border-left:3px solid #fbbf24}.xiping-video-subtitle-player__detail-example-en{font-size:15px;line-height:1.6;color:#fffffff2;margin-bottom:8px}.xiping-video-subtitle-player__detail-example-zh{font-size:14px;line-height:1.6;color:#ffffffb3;padding-left:12px;border-left:2px solid rgba(255,255,255,.2)}.xiping-video-subtitle-player__subtitle-container::-webkit-scrollbar,.xiping-video-subtitle-player__detail::-webkit-scrollbar{width:8px}.xiping-video-subtitle-player__subtitle-container::-webkit-scrollbar-track,.xiping-video-subtitle-player__detail::-webkit-scrollbar-track{background:#ffffff0d;border-radius:4px}.xiping-video-subtitle-player__subtitle-container::-webkit-scrollbar-thumb,.xiping-video-subtitle-player__detail::-webkit-scrollbar-thumb{background:#fff3;border-radius:4px}.xiping-video-subtitle-player__subtitle-container::-webkit-scrollbar-thumb:hover,.xiping-video-subtitle-player__detail::-webkit-scrollbar-thumb:hover{background:#ffffff4d}
|
|
107
|
+
|
|
108
|
+
|
|
109
|
+
/* components/video-subtitle-player/VideoSubtitlePlayer.mobile.css */
|
|
110
|
+
.xiping-video-subtitle-player--mobile{display:flex;flex-direction:column;min-height:0;height:100%}.xiping-video-subtitle-player__mobile-video{flex:0 0 auto;width:100%;aspect-ratio:16 / 9;background:#000}.xiping-video-subtitle-player__mobile-video-wrapper{width:100%;height:100%;background:#000;overflow:hidden}.xiping-video-subtitle-player__mobile-video-container{position:relative;width:100%;height:100%;background-color:#a62c2c;overflow:hidden}.xiping-video-subtitle-player__mobile-video-container .xgplayer{width:100%!important;height:100%!important}.xiping-video-subtitle-player__mobile-video-container .xgplayer video{-o-object-fit:fill!important;object-fit:fill!important}.xiping-video-subtitle-player__mobile-subtitle{flex:1;min-height:0;padding:12px 16px;overflow-y:auto;background:#0000004d;-webkit-overflow-scrolling:touch}
|
|
111
|
+
|
|
112
|
+
|
|
113
|
+
/* components/video-subtitle-player/VideoSubtitlePlayer.pc.css */
|
|
114
|
+
.xiping-video-subtitle-player--pc .xiping-video-subtitle-player__panel-group,.xiping-video-subtitle-player--pc .xiping-video-subtitle-player__panel-group-inner{width:100%;height:100%}.xiping-video-subtitle-player--pc .xiping-video-subtitle-player__right{border-left:1px solid rgba(255,255,255,.1)}.xiping-video-subtitle-player__resize-handle--horizontal{position:relative;width:2px;background:#ffffff1a;cursor:col-resize;transition:background .2s ease;flex-shrink:0}.xiping-video-subtitle-player__resize-handle--horizontal:hover{background:#fbbf2480}.xiping-video-subtitle-player__resize-handle--horizontal:active{background:#fbbf24cc}.xiping-video-subtitle-player__resize-handle--horizontal:before{content:"";position:absolute;inset:0 -4px;cursor:col-resize}.xiping-video-subtitle-player__resize-handle--vertical{position:relative;height:2px;background:#ffffff1a;cursor:row-resize;transition:background .2s ease;flex-shrink:0}.xiping-video-subtitle-player__resize-handle--vertical:hover{background:#fbbf2480}.xiping-video-subtitle-player__resize-handle--vertical:active{background:#fbbf24cc}.xiping-video-subtitle-player__resize-handle--vertical:before{content:"";position:absolute;inset:-4px 0;cursor:row-resize}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xiping/react-components",
|
|
3
3
|
"private": false,
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.58",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/cjs/index.js",
|
|
7
7
|
"module": "./dist/es/index.js",
|
|
@@ -14,7 +14,8 @@
|
|
|
14
14
|
"types": "./dist/es/index.d.ts"
|
|
15
15
|
},
|
|
16
16
|
"./style.css": {
|
|
17
|
-
"import": "./dist/es/react-components.css"
|
|
17
|
+
"import": "./dist/es/react-components.css",
|
|
18
|
+
"require": "./dist/cjs/react-components.css"
|
|
18
19
|
}
|
|
19
20
|
},
|
|
20
21
|
"files": [
|
|
@@ -25,17 +26,18 @@
|
|
|
25
26
|
],
|
|
26
27
|
"scripts": {
|
|
27
28
|
"dev": "vite",
|
|
28
|
-
"build": "tsc && vite build",
|
|
29
|
+
"build": "tsc && vite build && node scripts/merge-css.mjs",
|
|
29
30
|
"lint": "eslint ",
|
|
30
31
|
"preview": "vite preview",
|
|
31
32
|
"storybook": "storybook dev -p 6009",
|
|
32
|
-
"build-storybook": "storybook build"
|
|
33
|
+
"build-storybook": "pnpm install && pnpm --filter \"@xiping/react-components...\" run build && storybook build"
|
|
33
34
|
},
|
|
34
35
|
"peerDependencies": {
|
|
35
36
|
"react": ">=18 || >= 19",
|
|
36
37
|
"react-dom": ">=18 || >= 19"
|
|
37
38
|
},
|
|
38
39
|
"dependencies": {
|
|
40
|
+
"@floating-ui/dom": "^1.7.5",
|
|
39
41
|
"@heroui/react": "^2.8.8",
|
|
40
42
|
"@radix-ui/react-scroll-area": "^1.2.10",
|
|
41
43
|
"@react-spring/web": "9.7.5",
|
|
@@ -57,12 +59,13 @@
|
|
|
57
59
|
"lucide-react": "^0.563.0",
|
|
58
60
|
"motion": "^12.29.0",
|
|
59
61
|
"react": "^19.2.3",
|
|
62
|
+
"react-device-detect": "^2.2.3",
|
|
60
63
|
"react-dom": "^19.2.3",
|
|
61
64
|
"react-force-graph-3d": "^1.29.0",
|
|
62
65
|
"react-hot-toast": "^2.6.0",
|
|
63
66
|
"react-icons": "^5.5.0",
|
|
64
67
|
"react-markdown": "^10.1.0",
|
|
65
|
-
"react-resizable-panels": "^4.5.
|
|
68
|
+
"react-resizable-panels": "^4.5.8",
|
|
66
69
|
"react-router-dom": "^7.13.0",
|
|
67
70
|
"xgplayer": "^3.0.23",
|
|
68
71
|
"zustand": "^5.0.11"
|
|
@@ -112,5 +115,5 @@
|
|
|
112
115
|
"engines": {
|
|
113
116
|
"node": ">=22"
|
|
114
117
|
},
|
|
115
|
-
"gitHead": "
|
|
118
|
+
"gitHead": "6689815b0a9a6b341cc0a92d6518649106ec2234"
|
|
116
119
|
}
|