@xiping/react-components 1.0.69 → 1.0.77
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/_virtual/_rolldown/runtime.js +1 -0
- package/dist/cjs/components/blur-fade/BlurFade.js +1 -1
- package/dist/cjs/components/blur-text/BlurText.js +1 -1
- package/dist/cjs/components/button/Button.css +1 -1
- package/dist/cjs/components/button/Button2.js +1 -0
- package/dist/cjs/components/comic-text/ComicText2.js +4 -0
- package/dist/cjs/components/confetti-button/index.js +1 -1
- package/dist/cjs/components/dock/Duck.css +1 -1
- package/dist/cjs/components/dock/Duck2.js +1 -0
- package/dist/cjs/components/flip-text/FlipText.css +1 -1
- package/dist/cjs/components/flip-text/FlipText2.js +1 -0
- package/dist/cjs/components/gradient-text/index.css +1 -1
- package/dist/cjs/components/gradient-text/index2.js +1 -0
- package/dist/cjs/components/hyper-text/HyperText.css +1 -1
- package/dist/cjs/components/hyper-text/index.js +1 -1
- package/dist/cjs/components/image-compare/ImageCompare.css +1 -1
- package/dist/cjs/components/image-compare/ImageCompare2.js +1 -0
- package/dist/cjs/components/image-viewer/ImageThumbnails.css +1 -1
- package/dist/cjs/components/image-viewer/ImageThumbnails2.js +1 -0
- package/dist/cjs/components/image-viewer/ImageViewer.css +1 -1
- package/dist/cjs/components/image-viewer/ImageViewer.d.ts +1 -1
- package/dist/cjs/components/image-viewer/ImageViewer2.js +1 -0
- package/dist/cjs/components/message/Message.css +1 -1
- package/dist/cjs/components/message/Message2.js +1 -0
- package/dist/cjs/components/pinch-content/PinchContent.js +1 -1
- package/dist/cjs/components/pinch-content/index.js +1 -1
- package/dist/cjs/components/pointer/Pointer.css +1 -1
- package/dist/cjs/components/pointer/Pointer2.js +1 -0
- package/dist/cjs/components/scratch-to-reveal/ScratchToReveal.css +1 -1
- package/dist/cjs/components/scratch-to-reveal/ScratchToReveal2.js +1 -0
- package/dist/cjs/components/shimmer-button/ShimmerButton.css +1 -1
- package/dist/cjs/components/shimmer-button/ShimmerButton2.js +1 -0
- package/dist/cjs/components/shiny-button/ShinyButton.css +1 -1
- package/dist/cjs/components/shiny-button/ShinyButton2.js +1 -0
- package/dist/cjs/components/shiny-text/ShinyText2.js +1 -0
- package/dist/cjs/components/sparkles-text/SparklesText.css +1 -1
- package/dist/cjs/components/sparkles-text/SparklesText2.js +1 -0
- package/dist/cjs/components/split-text/SplitText.css +1 -1
- package/dist/cjs/components/split-text/SplitText2.js +1 -0
- package/dist/cjs/components/subtitle-player/CurrentMode.css +1 -1
- package/dist/cjs/components/subtitle-player/CurrentMode2.js +2 -0
- package/dist/cjs/components/subtitle-player/LyricsMode.css +1 -1
- package/dist/cjs/components/subtitle-player/LyricsMode2.js +2 -0
- package/dist/cjs/components/subtitle-player/SubtitlePlayer.css +1 -1
- package/dist/cjs/components/subtitle-player/SubtitlePlayer2.js +1 -0
- package/dist/cjs/components/subtitle-player/utils.js +1 -1
- package/dist/cjs/components/text-animate/TextAnimate.css +1 -1
- package/dist/cjs/components/text-animate/TextAnimate2.js +2 -0
- package/dist/cjs/components/text-type/TextType.css +1 -1
- package/dist/cjs/components/text-type/TextType2.js +1 -0
- package/dist/cjs/components/txt-editor/TxtEditor.js +4 -4
- package/dist/cjs/components/txt-reader/TxtReader.js +1 -1
- package/dist/cjs/components/txt-reader/index.module.css +1 -1
- package/dist/cjs/components/txt-reader/index.module.js +1 -0
- package/dist/cjs/components/typing-animation/index.css +1 -1
- package/dist/cjs/components/typing-animation/index2.js +1 -0
- package/dist/cjs/components/variable-proximity/index.css +1 -1
- package/dist/cjs/components/variable-proximity/index2.js +1 -0
- package/dist/cjs/components/video-dialog/VideoDialog.css +1 -1
- package/dist/cjs/components/video-dialog/VideoDialog2.js +1 -0
- package/dist/cjs/components/video-subtitle-player/VideoSubtitlePlayer.css +1 -1
- package/dist/cjs/components/video-subtitle-player/VideoSubtitlePlayer.mobile.css +1 -1
- package/dist/cjs/components/video-subtitle-player/VideoSubtitlePlayer.pc.css +1 -1
- package/dist/cjs/components/video-subtitle-player/VideoSubtitlePlayer2.js +1 -0
- package/dist/cjs/components/video-subtitle-player/VideoSubtitlePlayerMobile.js +1 -1
- package/dist/cjs/components/video-subtitle-player/VideoSubtitlePlayerPC.js +1 -1
- package/dist/cjs/components/video-subtitle-player/layouts/VideoSubtitlePlayerLayoutMobile.js +1 -1
- package/dist/cjs/components/video-subtitle-player/layouts/VideoSubtitlePlayerLayoutPC.js +1 -1
- package/dist/cjs/components/video-subtitle-player/useVideoSubtitleStore.js +1 -1
- package/dist/cjs/components/video-subtitle-player/useXGPlayer.js +1 -1
- package/dist/cjs/hooks/useStayTimeReport.js +1 -1
- package/dist/cjs/index.js +1 -1
- package/dist/cjs/node_modules/.pnpm/xgplayer@3.0.24_core-js@3.47.0/node_modules/xgplayer/dist/index.min.css +1 -0
- package/dist/cjs/packages/subtitle/lib/index.js +1 -0
- package/dist/cjs/packages/subtitle/lib/src/json-converter.js +1 -1
- package/dist/cjs/packages/subtitle/lib/src/parser.js +5 -5
- package/dist/cjs/react-components.css +27 -27
- package/dist/es/components/blur-fade/BlurFade.js +37 -49
- package/dist/es/components/blur-text/BlurText.js +67 -76
- package/dist/es/components/button/Button.css +1 -1
- package/dist/es/components/button/Button2.js +48 -0
- package/dist/es/components/comic-text/ComicText2.js +55 -0
- package/dist/es/components/confetti-button/index.js +63 -75
- package/dist/es/components/dock/Duck.css +1 -1
- package/dist/es/components/dock/Duck2.js +60 -0
- package/dist/es/components/flip-text/FlipText.css +1 -1
- package/dist/es/components/flip-text/FlipText2.js +41 -0
- package/dist/es/components/gradient-text/index.css +1 -1
- package/dist/es/components/gradient-text/index2.js +29 -0
- package/dist/es/components/hyper-text/HyperText.css +1 -1
- package/dist/es/components/hyper-text/index.js +51 -79
- package/dist/es/components/image-compare/ImageCompare.css +1 -1
- package/dist/es/components/image-compare/ImageCompare2.js +96 -0
- package/dist/es/components/image-viewer/ImageThumbnails.css +1 -1
- package/dist/es/components/image-viewer/ImageThumbnails2.js +40 -0
- package/dist/es/components/image-viewer/ImageViewer.css +1 -1
- package/dist/es/components/image-viewer/ImageViewer.d.ts +1 -1
- package/dist/es/components/image-viewer/ImageViewer2.js +151 -0
- package/dist/es/components/message/Message.css +1 -1
- package/dist/es/components/message/Message2.js +189 -0
- package/dist/es/components/pinch-content/PinchContent.js +120 -127
- package/dist/es/components/pinch-content/index.js +5 -5
- package/dist/es/components/pointer/Pointer.css +1 -1
- package/dist/es/components/pointer/Pointer2.js +61 -0
- package/dist/es/components/react-force-graph-3d/index.js +2 -0
- package/dist/es/components/scratch-to-reveal/ScratchToReveal.css +1 -1
- package/dist/es/components/scratch-to-reveal/ScratchToReveal2.js +88 -0
- package/dist/es/components/shimmer-button/ShimmerButton.css +1 -1
- package/dist/es/components/shimmer-button/ShimmerButton2.js +33 -0
- package/dist/es/components/shiny-button/ShinyButton.css +1 -1
- package/dist/es/components/shiny-button/ShinyButton2.js +53 -0
- package/dist/es/components/shiny-text/ShinyText2.js +61 -0
- package/dist/es/components/sparkles-text/SparklesText.css +1 -1
- package/dist/es/components/sparkles-text/SparklesText2.js +90 -0
- package/dist/es/components/split-text/SplitText.css +1 -1
- package/dist/es/components/split-text/SplitText2.js +109 -0
- package/dist/es/components/subtitle-player/CurrentMode.css +1 -1
- package/dist/es/components/subtitle-player/CurrentMode2.js +44 -0
- package/dist/es/components/subtitle-player/LyricsMode.css +1 -1
- package/dist/es/components/subtitle-player/LyricsMode2.js +114 -0
- package/dist/es/components/subtitle-player/SubtitlePlayer.css +1 -1
- package/dist/es/components/subtitle-player/SubtitlePlayer2.js +169 -0
- package/dist/es/components/subtitle-player/utils.js +63 -69
- package/dist/es/components/text-animate/TextAnimate.css +1 -1
- package/dist/es/components/text-animate/TextAnimate2.js +312 -0
- package/dist/es/components/text-type/TextType.css +1 -1
- package/dist/es/components/text-type/TextType2.js +80 -0
- package/dist/es/components/txt-editor/TxtEditor.js +60 -95
- package/dist/es/components/txt-reader/TxtReader.js +45 -74
- package/dist/es/components/txt-reader/index.module.css +1 -1
- package/dist/es/components/txt-reader/index.module.js +10 -0
- package/dist/es/components/typing-animation/index.css +1 -1
- package/dist/es/components/typing-animation/index2.js +43 -0
- package/dist/es/components/variable-proximity/index.css +1 -1
- package/dist/es/components/variable-proximity/index2.js +179 -0
- package/dist/es/components/video-dialog/VideoDialog.css +1 -1
- package/dist/es/components/video-dialog/VideoDialog2.js +168 -0
- package/dist/es/components/video-subtitle-player/VideoSubtitlePlayer.css +1 -1
- package/dist/es/components/video-subtitle-player/VideoSubtitlePlayer.mobile.css +1 -1
- package/dist/es/components/video-subtitle-player/VideoSubtitlePlayer.pc.css +1 -1
- package/dist/es/components/video-subtitle-player/VideoSubtitlePlayer2.js +43 -0
- package/dist/es/components/video-subtitle-player/VideoSubtitlePlayerMobile.js +29 -46
- package/dist/es/components/video-subtitle-player/VideoSubtitlePlayerPC.js +94 -74
- package/dist/es/components/video-subtitle-player/layouts/VideoSubtitlePlayerLayoutMobile.js +24 -21
- package/dist/es/components/video-subtitle-player/layouts/VideoSubtitlePlayerLayoutPC.js +58 -50
- package/dist/es/components/video-subtitle-player/useVideoSubtitleStore.js +61 -56
- package/dist/es/components/video-subtitle-player/useXGPlayer.js +38 -35
- package/dist/es/hooks/useStayTimeReport.js +29 -29
- package/dist/es/index.js +33 -70
- package/dist/es/node_modules/.pnpm/xgplayer@3.0.24_core-js@3.47.0/node_modules/xgplayer/dist/index.min.css +1 -0
- package/dist/es/packages/subtitle/lib/index.js +2 -0
- package/dist/es/packages/subtitle/lib/src/json-converter.js +22 -23
- package/dist/es/packages/subtitle/lib/src/parser.js +41 -54
- package/dist/es/react-components.css +27 -27
- package/package.json +28 -29
- package/dist/cjs/components/button/Button.js +0 -1
- package/dist/cjs/components/comic-text/ComicText.js +0 -4
- package/dist/cjs/components/dock/Duck.js +0 -1
- package/dist/cjs/components/flip-text/FlipText.js +0 -1
- package/dist/cjs/components/gradient-text/index.js +0 -1
- package/dist/cjs/components/image-compare/ImageCompare.js +0 -1
- package/dist/cjs/components/image-viewer/ImageThumbnails.js +0 -1
- package/dist/cjs/components/image-viewer/ImageViewer.js +0 -1
- package/dist/cjs/components/message/Message.js +0 -1
- package/dist/cjs/components/pointer/Pointer.js +0 -1
- package/dist/cjs/components/scratch-to-reveal/ScratchToReveal.js +0 -1
- package/dist/cjs/components/shimmer-button/ShimmerButton.js +0 -1
- package/dist/cjs/components/shiny-button/ShinyButton.js +0 -1
- package/dist/cjs/components/shiny-text/ShinyText.js +0 -1
- package/dist/cjs/components/sparkles-text/SparklesText.js +0 -1
- package/dist/cjs/components/split-text/SplitText.js +0 -1
- package/dist/cjs/components/subtitle-player/CurrentMode.js +0 -2
- package/dist/cjs/components/subtitle-player/LyricsMode.js +0 -2
- package/dist/cjs/components/subtitle-player/SubtitlePlayer.js +0 -1
- package/dist/cjs/components/text-animate/TextAnimate.js +0 -2
- package/dist/cjs/components/text-type/TextType.js +0 -1
- package/dist/cjs/components/txt-reader/index.module.css.js +0 -1
- package/dist/cjs/components/typing-animation/index.js +0 -1
- package/dist/cjs/components/variable-proximity/index.js +0 -1
- package/dist/cjs/components/video-dialog/VideoDialog.js +0 -1
- package/dist/cjs/components/video-subtitle-player/VideoSubtitlePlayer.js +0 -1
- package/dist/cjs/node_modules/.pnpm/xgplayer@3.0.23_core-js@3.47.0/node_modules/xgplayer/dist/index.min.css +0 -1
- package/dist/es/components/button/Button.js +0 -72
- package/dist/es/components/comic-text/ComicText.js +0 -52
- package/dist/es/components/dock/Duck.js +0 -80
- package/dist/es/components/flip-text/FlipText.js +0 -38
- package/dist/es/components/gradient-text/index.js +0 -22
- package/dist/es/components/image-compare/ImageCompare.js +0 -127
- package/dist/es/components/image-viewer/ImageThumbnails.js +0 -73
- package/dist/es/components/image-viewer/ImageViewer.js +0 -141
- package/dist/es/components/message/Message.js +0 -220
- package/dist/es/components/pointer/Pointer.js +0 -75
- package/dist/es/components/scratch-to-reveal/ScratchToReveal.js +0 -97
- package/dist/es/components/shimmer-button/ShimmerButton.js +0 -42
- package/dist/es/components/shiny-button/ShinyButton.js +0 -61
- package/dist/es/components/shiny-text/ShinyText.js +0 -76
- package/dist/es/components/sparkles-text/SparklesText.js +0 -71
- package/dist/es/components/split-text/SplitText.js +0 -116
- package/dist/es/components/subtitle-player/CurrentMode.js +0 -78
- package/dist/es/components/subtitle-player/LyricsMode.js +0 -152
- package/dist/es/components/subtitle-player/SubtitlePlayer.js +0 -234
- package/dist/es/components/text-animate/TextAnimate.js +0 -310
- package/dist/es/components/text-type/TextType.js +0 -121
- package/dist/es/components/txt-reader/index.module.css.js +0 -10
- package/dist/es/components/typing-animation/index.js +0 -56
- package/dist/es/components/variable-proximity/index.js +0 -211
- package/dist/es/components/video-dialog/VideoDialog.js +0 -113
- package/dist/es/components/video-subtitle-player/VideoSubtitlePlayer.js +0 -74
- package/dist/es/node_modules/.pnpm/xgplayer@3.0.23_core-js@3.47.0/node_modules/xgplayer/dist/index.min.css +0 -1
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { renderTextWithWords as e, secondsToTimeString as t } from "./utils.js";
|
|
2
|
+
import './LyricsMode.css';/* empty css */
|
|
3
|
+
import { Fragment as n, jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
4
|
+
import { useCallback as a, useEffect as o, useMemo as s, useRef as c } from "react";
|
|
5
|
+
import l from "clsx";
|
|
6
|
+
//#region src/components/subtitle-player/LyricsMode.tsx
|
|
7
|
+
var u = ({ entry: t, label: n, endTime: o, currentTime: c, isActive: u, isFirstItem: d, timeString: f, textAlign: p, enableWordHover: m, wordHoverFactory: h, onSubtitleClick: g, itemRef: _ }) => {
|
|
8
|
+
let v = c > o, y = a((e) => {
|
|
9
|
+
g && g(e, t, n);
|
|
10
|
+
}, [
|
|
11
|
+
g,
|
|
12
|
+
t,
|
|
13
|
+
n
|
|
14
|
+
]), b = s(() => m ? h(t, n) : void 0, [
|
|
15
|
+
m,
|
|
16
|
+
h,
|
|
17
|
+
t,
|
|
18
|
+
n
|
|
19
|
+
]), x = s(() => t.text.split("\n").reduce((n, i, a) => {
|
|
20
|
+
if (!t.words || t.words.length === 0) return n.content.push(/* @__PURE__ */ r("div", {
|
|
21
|
+
className: "xiping-subtitle-player__lyrics-line",
|
|
22
|
+
children: i
|
|
23
|
+
}, a)), n;
|
|
24
|
+
let o = e(i, t.words, n.nextWordIndex, a, b);
|
|
25
|
+
return n.content.push(/* @__PURE__ */ r("div", {
|
|
26
|
+
className: "xiping-subtitle-player__lyrics-line",
|
|
27
|
+
children: o.nodes
|
|
28
|
+
}, a)), {
|
|
29
|
+
content: n.content,
|
|
30
|
+
nextWordIndex: o.nextWordIndex
|
|
31
|
+
};
|
|
32
|
+
}, {
|
|
33
|
+
content: [],
|
|
34
|
+
nextWordIndex: 0
|
|
35
|
+
}).content, [
|
|
36
|
+
t.text,
|
|
37
|
+
t.words,
|
|
38
|
+
b
|
|
39
|
+
]);
|
|
40
|
+
return /* @__PURE__ */ i("div", {
|
|
41
|
+
ref: _,
|
|
42
|
+
className: l("xiping-subtitle-player__lyrics-item", {
|
|
43
|
+
"xiping-subtitle-player__lyrics-item--active": u,
|
|
44
|
+
"xiping-subtitle-player__lyrics-item--past": v
|
|
45
|
+
}),
|
|
46
|
+
"data-label": n || void 0,
|
|
47
|
+
onClick: g ? y : void 0,
|
|
48
|
+
style: g ? { cursor: "pointer" } : void 0,
|
|
49
|
+
children: [
|
|
50
|
+
d && f && /* @__PURE__ */ r("span", {
|
|
51
|
+
className: "xiping-subtitle-player__lyrics-time",
|
|
52
|
+
children: f
|
|
53
|
+
}),
|
|
54
|
+
n && /* @__PURE__ */ r("span", {
|
|
55
|
+
className: "xiping-subtitle-player__lyrics-label",
|
|
56
|
+
children: n
|
|
57
|
+
}),
|
|
58
|
+
/* @__PURE__ */ r("div", {
|
|
59
|
+
className: "xiping-subtitle-player__lyrics-text",
|
|
60
|
+
style: { textAlign: p },
|
|
61
|
+
children: x
|
|
62
|
+
})
|
|
63
|
+
]
|
|
64
|
+
});
|
|
65
|
+
}, d = ({ groupedEntriesByTime: e, currentTime: a, wordHoverFactory: l, enableWordHover: d, overlayNode: f, containerRef: p, onSubtitleClick: m, textAlign: h = "left" }) => {
|
|
66
|
+
let g = c(null), _ = c(null), v = s(() => {
|
|
67
|
+
for (let t = 0; t < e.length; t++) {
|
|
68
|
+
let n = e[t];
|
|
69
|
+
for (let e = 0; e < n.length; e++) {
|
|
70
|
+
let { startTime: r, endTime: i } = n[e];
|
|
71
|
+
if (a >= r && a <= i) return `${t}-${e}`;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
return null;
|
|
75
|
+
}, [e, a]);
|
|
76
|
+
return o(() => {
|
|
77
|
+
if (v && v !== _.current && g.current && p.current) {
|
|
78
|
+
let e = p.current, t = g.current, n = t.offsetTop, r = e.clientHeight, i = t.clientHeight, a = n - r / 2 + i / 2;
|
|
79
|
+
e.scrollTo({
|
|
80
|
+
top: a,
|
|
81
|
+
behavior: "smooth"
|
|
82
|
+
}), _.current = v;
|
|
83
|
+
}
|
|
84
|
+
}, [v, p]), /* @__PURE__ */ i(n, { children: [e.map((e, n) => {
|
|
85
|
+
let i = e[0];
|
|
86
|
+
if (!i) return null;
|
|
87
|
+
let o = t(i.startTime);
|
|
88
|
+
return /* @__PURE__ */ r("div", {
|
|
89
|
+
className: "xiping-subtitle-player__group",
|
|
90
|
+
children: e.map(({ entry: e, label: t, startTime: i, endTime: s }, c) => {
|
|
91
|
+
let f = a >= i && a <= s, p = `${n}-${c}`;
|
|
92
|
+
return /* @__PURE__ */ r(u, {
|
|
93
|
+
entry: e,
|
|
94
|
+
label: t,
|
|
95
|
+
endTime: s,
|
|
96
|
+
currentTime: a,
|
|
97
|
+
isActive: f,
|
|
98
|
+
isFirstItem: c === 0,
|
|
99
|
+
timeString: c === 0 ? o : void 0,
|
|
100
|
+
textAlign: h,
|
|
101
|
+
enableWordHover: d,
|
|
102
|
+
wordHoverFactory: l,
|
|
103
|
+
onSubtitleClick: m,
|
|
104
|
+
itemRef: f ? g : void 0
|
|
105
|
+
}, p);
|
|
106
|
+
})
|
|
107
|
+
}, n);
|
|
108
|
+
}), d && /* @__PURE__ */ r("div", {
|
|
109
|
+
className: "xiping-subtitle-player__lyrics-hover-layer",
|
|
110
|
+
children: f
|
|
111
|
+
})] });
|
|
112
|
+
};
|
|
113
|
+
//#endregion
|
|
114
|
+
export { d as LyricsMode };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.xiping-subtitle-player{
|
|
1
|
+
.xiping-subtitle-player{-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px);color:#fff;box-sizing:border-box;background:#000000bf;border-radius:.5rem;flex-direction:column;gap:.75rem;max-width:100%;padding:1rem;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,sans-serif;line-height:1.6;display:flex;position:relative}.xiping-subtitle-player__hover-overlay{z-index:10;pointer-events:auto;position:absolute;transform:translate(-50%,.5rem)}.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{border-radius:2px;margin:0 .05em;padding:0 .05em;transition:all .2s;display:inline-block;position:relative}.xiping-subtitle-word:hover{background-color:#ffffff1a;transform:translateY(-1px)}.xiping-subtitle-word-before,.xiping-subtitle-word-after{display:inline}@media (width<=768px){.xiping-subtitle-player{padding:.75rem;font-size:.9rem}}
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
import { parseSRT as e, parseVTT as t } from "../../packages/subtitle/lib/src/parser.js";
|
|
2
|
+
import { srtToJson as n, vttToJson as r } from "../../packages/subtitle/lib/src/json-converter.js";
|
|
3
|
+
import './SubtitlePlayer.css';/* empty css */
|
|
4
|
+
import { getCurrentSubtitleEntry as i, timeStringToSeconds as a } from "./utils.js";
|
|
5
|
+
import { CurrentMode as o } from "./CurrentMode2.js";
|
|
6
|
+
import { LyricsMode as s } from "./LyricsMode2.js";
|
|
7
|
+
/* empty css */
|
|
8
|
+
import { jsx as c, jsxs as l } from "react/jsx-runtime";
|
|
9
|
+
import { useCallback as u, useEffect as d, useMemo as f, useRef as p, useState as m } from "react";
|
|
10
|
+
import h from "clsx";
|
|
11
|
+
//#region src/components/subtitle-player/SubtitlePlayer.tsx
|
|
12
|
+
var g = ({ subtitles: g, currentTime: _, mode: v = "current", textAlign: y = "left", className: b = "", style: x, onWordHoverChange: S, renderWordOverlay: C, onWordClick: w, onSubtitleClick: T }) => {
|
|
13
|
+
let E = f(() => Array.isArray(g) ? g : [g], [g]), D = p(null), [O, k] = m(null), [A, j] = m([]);
|
|
14
|
+
d(() => {
|
|
15
|
+
let i = !0;
|
|
16
|
+
async function a() {
|
|
17
|
+
try {
|
|
18
|
+
let a = await Promise.all(E.map(async (i) => {
|
|
19
|
+
try {
|
|
20
|
+
let e = i.language || "zh", t = i.type === "srt" ? await n(i.content, e) : await r(i.content, e);
|
|
21
|
+
return {
|
|
22
|
+
entries: JSON.parse(t),
|
|
23
|
+
label: i.label
|
|
24
|
+
};
|
|
25
|
+
} catch (n) {
|
|
26
|
+
return console.error("字幕解析失败:", n), {
|
|
27
|
+
entries: i.type === "srt" ? e(i.content) : t(i.content),
|
|
28
|
+
label: i.label
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
}));
|
|
32
|
+
i && j(a);
|
|
33
|
+
} catch (n) {
|
|
34
|
+
console.error("加载字幕失败:", n), i && j(E.map((n) => {
|
|
35
|
+
try {
|
|
36
|
+
return {
|
|
37
|
+
entries: n.type === "srt" ? e(n.content) : t(n.content),
|
|
38
|
+
label: n.label
|
|
39
|
+
};
|
|
40
|
+
} catch (e) {
|
|
41
|
+
return console.error("字幕解析失败:", e), {
|
|
42
|
+
entries: [],
|
|
43
|
+
label: n.label
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
}));
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return a(), () => {
|
|
50
|
+
i = !1;
|
|
51
|
+
};
|
|
52
|
+
}, [E]);
|
|
53
|
+
let M = f(() => A.length > 0 ? A : E.map((n) => {
|
|
54
|
+
try {
|
|
55
|
+
return {
|
|
56
|
+
entries: n.type === "srt" ? e(n.content) : t(n.content),
|
|
57
|
+
label: n.label
|
|
58
|
+
};
|
|
59
|
+
} catch (e) {
|
|
60
|
+
return console.error("字幕解析失败:", e), {
|
|
61
|
+
entries: [],
|
|
62
|
+
label: n.label
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
}), [A, E]), N = f(() => M.map(({ entries: e, label: t }) => ({
|
|
66
|
+
entry: i(e, _),
|
|
67
|
+
label: t,
|
|
68
|
+
entries: e
|
|
69
|
+
})), [M, _]), P = f(() => {
|
|
70
|
+
let e = [];
|
|
71
|
+
M.forEach(({ entries: t, label: n }) => {
|
|
72
|
+
t.forEach((t) => {
|
|
73
|
+
e.push({
|
|
74
|
+
entry: t,
|
|
75
|
+
label: n,
|
|
76
|
+
startTime: a(t.startTime),
|
|
77
|
+
endTime: a(t.endTime)
|
|
78
|
+
});
|
|
79
|
+
});
|
|
80
|
+
}), e.sort((e, t) => e.startTime - t.startTime);
|
|
81
|
+
let t = [], n = [];
|
|
82
|
+
for (let r of e) if (n.length === 0) n.push(r);
|
|
83
|
+
else {
|
|
84
|
+
let e = n[n.length - 1];
|
|
85
|
+
r.startTime <= e.endTime ? n.push(r) : (t.push(n), n = [r]);
|
|
86
|
+
}
|
|
87
|
+
return n.length > 0 && t.push(n), t;
|
|
88
|
+
}, [M]), F = u((e, t) => {
|
|
89
|
+
let n = e.currentTarget.getBoundingClientRect(), r = D.current?.getBoundingClientRect(), i = r === void 0 ? n : new DOMRect(n.left - r.left, n.top - r.top, n.width, n.height), a = {
|
|
90
|
+
...t,
|
|
91
|
+
rect: i,
|
|
92
|
+
element: e.currentTarget
|
|
93
|
+
};
|
|
94
|
+
k(a), S?.(a);
|
|
95
|
+
}, [S]), I = u(() => {
|
|
96
|
+
k(null), S?.(null);
|
|
97
|
+
}, [S]), L = u((e, t) => {
|
|
98
|
+
if (!w) return;
|
|
99
|
+
e.stopPropagation();
|
|
100
|
+
let n = e.currentTarget.getBoundingClientRect(), r = D.current?.getBoundingClientRect(), i = r === void 0 ? n : new DOMRect(n.left - r.left, n.top - r.top, n.width, n.height);
|
|
101
|
+
w({
|
|
102
|
+
type: "word",
|
|
103
|
+
...t,
|
|
104
|
+
rect: i,
|
|
105
|
+
element: e.currentTarget
|
|
106
|
+
});
|
|
107
|
+
}, [w]), R = u((e, t, n) => {
|
|
108
|
+
if (!T || e.target.closest(".xiping-subtitle-word")) return;
|
|
109
|
+
let r = e.currentTarget.getBoundingClientRect(), i = D.current?.getBoundingClientRect();
|
|
110
|
+
T({
|
|
111
|
+
type: "subtitle",
|
|
112
|
+
entry: t,
|
|
113
|
+
label: n,
|
|
114
|
+
rect: i === void 0 ? r : new DOMRect(r.left - i.left, r.top - i.top, r.width, r.height),
|
|
115
|
+
element: e.currentTarget
|
|
116
|
+
});
|
|
117
|
+
}, [T]), z = u((e, t) => (n, r, i) => ({
|
|
118
|
+
onMouseEnter: (a) => F(a, {
|
|
119
|
+
word: n,
|
|
120
|
+
wordIndex: r,
|
|
121
|
+
lineIndex: i,
|
|
122
|
+
entry: e,
|
|
123
|
+
label: t
|
|
124
|
+
}),
|
|
125
|
+
onMouseLeave: I,
|
|
126
|
+
onClick: (a) => L(a, {
|
|
127
|
+
word: n,
|
|
128
|
+
wordIndex: r,
|
|
129
|
+
lineIndex: i,
|
|
130
|
+
entry: e,
|
|
131
|
+
label: t
|
|
132
|
+
})
|
|
133
|
+
}), [
|
|
134
|
+
F,
|
|
135
|
+
I,
|
|
136
|
+
L
|
|
137
|
+
]), B = C && O ? /* @__PURE__ */ c("div", {
|
|
138
|
+
className: "xiping-subtitle-player__hover-overlay",
|
|
139
|
+
style: {
|
|
140
|
+
left: O.rect.x + O.rect.width / 2,
|
|
141
|
+
top: O.rect.y + O.rect.height
|
|
142
|
+
},
|
|
143
|
+
children: C(O)
|
|
144
|
+
}) : null, V = !!(C || S);
|
|
145
|
+
return /* @__PURE__ */ l("div", {
|
|
146
|
+
ref: D,
|
|
147
|
+
className: h("xiping-subtitle-player", v === "lyrics" ? "xiping-subtitle-player--lyrics" : "xiping-subtitle-player--current", b),
|
|
148
|
+
style: x,
|
|
149
|
+
children: [v === "current" && /* @__PURE__ */ c(o, {
|
|
150
|
+
currentEntries: N,
|
|
151
|
+
wordHoverFactory: z,
|
|
152
|
+
enableWordHover: V,
|
|
153
|
+
overlayNode: B,
|
|
154
|
+
onSubtitleClick: R,
|
|
155
|
+
textAlign: y
|
|
156
|
+
}), v === "lyrics" && /* @__PURE__ */ c(s, {
|
|
157
|
+
groupedEntriesByTime: P,
|
|
158
|
+
currentTime: _,
|
|
159
|
+
wordHoverFactory: z,
|
|
160
|
+
enableWordHover: V,
|
|
161
|
+
overlayNode: B,
|
|
162
|
+
containerRef: D,
|
|
163
|
+
onSubtitleClick: R,
|
|
164
|
+
textAlign: y
|
|
165
|
+
})]
|
|
166
|
+
});
|
|
167
|
+
};
|
|
168
|
+
//#endregion
|
|
169
|
+
export { g as default };
|
|
@@ -1,73 +1,67 @@
|
|
|
1
|
-
import { jsx as
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
1
|
+
import { jsx as e } from "react/jsx-runtime";
|
|
2
|
+
import "react";
|
|
3
|
+
//#region src/components/subtitle-player/utils.tsx
|
|
4
|
+
function t(e) {
|
|
5
|
+
let t = e.replace(",", ".").split(":");
|
|
6
|
+
if (t.length !== 3) return 0;
|
|
7
|
+
let n = parseInt(t[0], 10) || 0, r = parseInt(t[1], 10) || 0, i = parseFloat(t[2]) || 0;
|
|
8
|
+
return n * 3600 + r * 60 + i;
|
|
8
9
|
}
|
|
9
|
-
function
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
function n(e) {
|
|
11
|
+
let t = Math.floor(e / 3600), n = Math.floor(e % 3600 / 60), r = Math.floor(e % 60);
|
|
12
|
+
return t > 0 ? `${t.toString().padStart(2, "0")}:${n.toString().padStart(2, "0")}:${r.toString().padStart(2, "0")}` : `${n.toString().padStart(2, "0")}:${r.toString().padStart(2, "0")}`;
|
|
12
13
|
}
|
|
13
|
-
function
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
return null;
|
|
14
|
+
function r(e, n) {
|
|
15
|
+
for (let r of e) {
|
|
16
|
+
let e = t(r.startTime), i = t(r.endTime);
|
|
17
|
+
if (n >= e && n <= i) return r;
|
|
18
|
+
}
|
|
19
|
+
return null;
|
|
20
20
|
}
|
|
21
|
-
function
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
nextWordIndex: e.length
|
|
66
|
-
};
|
|
21
|
+
function i(t, n, r, i, a) {
|
|
22
|
+
if (!n || n.length === 0) return {
|
|
23
|
+
nodes: t,
|
|
24
|
+
nextWordIndex: r
|
|
25
|
+
};
|
|
26
|
+
let o = [], s = 0;
|
|
27
|
+
for (let c = r; c < n.length; c++) {
|
|
28
|
+
let r = n[c], l = t.substring(s).indexOf(r);
|
|
29
|
+
if (l === -1) return {
|
|
30
|
+
nodes: o.length > 0 ? o : t,
|
|
31
|
+
nextWordIndex: c
|
|
32
|
+
};
|
|
33
|
+
let u = s + l;
|
|
34
|
+
if (u > s) {
|
|
35
|
+
let n = t.substring(s, u);
|
|
36
|
+
n && o.push(/* @__PURE__ */ e("span", {
|
|
37
|
+
className: "xiping-subtitle-word-before",
|
|
38
|
+
children: n
|
|
39
|
+
}, `before-${i}-${c}`));
|
|
40
|
+
}
|
|
41
|
+
let d = a?.(r, c, i);
|
|
42
|
+
if (o.push(/* @__PURE__ */ e("span", {
|
|
43
|
+
className: "xiping-subtitle-word",
|
|
44
|
+
"data-word": r,
|
|
45
|
+
onMouseEnter: d?.onMouseEnter,
|
|
46
|
+
onMouseLeave: d?.onMouseLeave,
|
|
47
|
+
onClick: d?.onClick,
|
|
48
|
+
children: r
|
|
49
|
+
}, `word-${i}-${c}`)), s = u + r.length, s >= t.length) return {
|
|
50
|
+
nodes: o,
|
|
51
|
+
nextWordIndex: c + 1
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
if (s < t.length) {
|
|
55
|
+
let n = t.substring(s);
|
|
56
|
+
n && o.push(/* @__PURE__ */ e("span", {
|
|
57
|
+
className: "xiping-subtitle-word-after",
|
|
58
|
+
children: n
|
|
59
|
+
}, `after-${i}`));
|
|
60
|
+
}
|
|
61
|
+
return {
|
|
62
|
+
nodes: o.length > 0 ? o : t,
|
|
63
|
+
nextWordIndex: n.length
|
|
64
|
+
};
|
|
67
65
|
}
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
T as renderTextWithWords,
|
|
71
|
-
S as secondsToTimeString,
|
|
72
|
-
h as timeStringToSeconds
|
|
73
|
-
};
|
|
66
|
+
//#endregion
|
|
67
|
+
export { r as getCurrentSubtitleEntry, i as renderTextWithWords, n as secondsToTimeString, t as timeStringToSeconds };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
.xiping-text-animate{white-space:pre-wrap}.xiping-text-animate-segment{display:inline-block
|
|
1
|
+
.xiping-text-animate{white-space:pre-wrap}.xiping-text-animate-segment{white-space:pre;display:inline-block}.xiping-text-animate-segment--line{display:block}
|