@xiping/react-components 1.0.70 → 1.0.78

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.
Files changed (207) hide show
  1. package/dist/cjs/_virtual/_rolldown/runtime.js +1 -0
  2. package/dist/cjs/components/blur-fade/BlurFade.js +1 -1
  3. package/dist/cjs/components/blur-text/BlurText.js +1 -1
  4. package/dist/cjs/components/button/Button.css +1 -1
  5. package/dist/cjs/components/button/Button2.js +1 -0
  6. package/dist/cjs/components/comic-text/ComicText2.js +4 -0
  7. package/dist/cjs/components/confetti-button/index.js +1 -1
  8. package/dist/cjs/components/dock/Duck.css +1 -1
  9. package/dist/cjs/components/dock/Duck2.js +1 -0
  10. package/dist/cjs/components/flip-text/FlipText.css +1 -1
  11. package/dist/cjs/components/flip-text/FlipText2.js +1 -0
  12. package/dist/cjs/components/gradient-text/index.css +1 -1
  13. package/dist/cjs/components/gradient-text/index2.js +1 -0
  14. package/dist/cjs/components/hyper-text/HyperText.css +1 -1
  15. package/dist/cjs/components/hyper-text/index.js +1 -1
  16. package/dist/cjs/components/image-compare/ImageCompare.css +1 -1
  17. package/dist/cjs/components/image-compare/ImageCompare2.js +1 -0
  18. package/dist/cjs/components/image-viewer/ImageThumbnails.css +1 -1
  19. package/dist/cjs/components/image-viewer/ImageThumbnails2.js +1 -0
  20. package/dist/cjs/components/image-viewer/ImageViewer.css +1 -1
  21. package/dist/cjs/components/image-viewer/ImageViewer.d.ts +1 -1
  22. package/dist/cjs/components/image-viewer/ImageViewer2.js +1 -0
  23. package/dist/cjs/components/message/Message.css +1 -1
  24. package/dist/cjs/components/message/Message2.js +1 -0
  25. package/dist/cjs/components/pinch-content/PinchContent.js +1 -1
  26. package/dist/cjs/components/pinch-content/index.js +1 -1
  27. package/dist/cjs/components/pointer/Pointer.css +1 -1
  28. package/dist/cjs/components/pointer/Pointer2.js +1 -0
  29. package/dist/cjs/components/scratch-to-reveal/ScratchToReveal.css +1 -1
  30. package/dist/cjs/components/scratch-to-reveal/ScratchToReveal2.js +1 -0
  31. package/dist/cjs/components/shimmer-button/ShimmerButton.css +1 -1
  32. package/dist/cjs/components/shimmer-button/ShimmerButton2.js +1 -0
  33. package/dist/cjs/components/shiny-button/ShinyButton.css +1 -1
  34. package/dist/cjs/components/shiny-button/ShinyButton2.js +1 -0
  35. package/dist/cjs/components/shiny-text/ShinyText2.js +1 -0
  36. package/dist/cjs/components/sparkles-text/SparklesText.css +1 -1
  37. package/dist/cjs/components/sparkles-text/SparklesText2.js +1 -0
  38. package/dist/cjs/components/split-text/SplitText.css +1 -1
  39. package/dist/cjs/components/split-text/SplitText2.js +1 -0
  40. package/dist/cjs/components/subtitle-player/CurrentMode.css +1 -1
  41. package/dist/cjs/components/subtitle-player/CurrentMode2.js +2 -0
  42. package/dist/cjs/components/subtitle-player/LyricsMode.css +1 -1
  43. package/dist/cjs/components/subtitle-player/LyricsMode2.js +2 -0
  44. package/dist/cjs/components/subtitle-player/SubtitlePlayer.css +1 -1
  45. package/dist/cjs/components/subtitle-player/SubtitlePlayer2.js +1 -0
  46. package/dist/cjs/components/subtitle-player/utils.js +1 -1
  47. package/dist/cjs/components/text-animate/TextAnimate.css +1 -1
  48. package/dist/cjs/components/text-animate/TextAnimate2.js +2 -0
  49. package/dist/cjs/components/text-type/TextType.css +1 -1
  50. package/dist/cjs/components/text-type/TextType2.js +1 -0
  51. package/dist/cjs/components/txt-editor/TxtEditor.js +4 -4
  52. package/dist/cjs/components/txt-reader/TxtReader.js +1 -1
  53. package/dist/cjs/components/txt-reader/index.module.css +1 -1
  54. package/dist/cjs/components/txt-reader/index.module.js +1 -0
  55. package/dist/cjs/components/typing-animation/index.css +1 -1
  56. package/dist/cjs/components/typing-animation/index2.js +1 -0
  57. package/dist/cjs/components/variable-proximity/index.css +1 -1
  58. package/dist/cjs/components/variable-proximity/index2.js +1 -0
  59. package/dist/cjs/components/video-dialog/VideoDialog.css +1 -1
  60. package/dist/cjs/components/video-dialog/VideoDialog2.js +1 -0
  61. package/dist/cjs/components/video-subtitle-player/VideoSubtitlePlayer.css +1 -1
  62. package/dist/cjs/components/video-subtitle-player/VideoSubtitlePlayer.mobile.css +1 -1
  63. package/dist/cjs/components/video-subtitle-player/VideoSubtitlePlayer.pc.css +1 -1
  64. package/dist/cjs/components/video-subtitle-player/VideoSubtitlePlayer2.js +1 -0
  65. package/dist/cjs/components/video-subtitle-player/VideoSubtitlePlayerMobile.js +1 -1
  66. package/dist/cjs/components/video-subtitle-player/VideoSubtitlePlayerPC.js +1 -1
  67. package/dist/cjs/components/video-subtitle-player/layouts/VideoSubtitlePlayerLayoutMobile.js +1 -1
  68. package/dist/cjs/components/video-subtitle-player/layouts/VideoSubtitlePlayerLayoutPC.js +1 -1
  69. package/dist/cjs/components/video-subtitle-player/useVideoSubtitleStore.js +1 -1
  70. package/dist/cjs/components/video-subtitle-player/useXGPlayer.js +1 -1
  71. package/dist/cjs/hooks/useStayTimeReport.js +1 -1
  72. package/dist/cjs/index.js +1 -1
  73. package/dist/cjs/node_modules/.pnpm/xgplayer@3.0.24_core-js@3.47.0/node_modules/xgplayer/dist/index.min.css +1 -1
  74. package/dist/cjs/packages/subtitle/lib/index.js +1 -0
  75. package/dist/cjs/packages/subtitle/lib/src/json-converter.js +1 -1
  76. package/dist/cjs/packages/subtitle/lib/src/parser.js +5 -5
  77. package/dist/cjs/react-components.css +27 -27
  78. package/dist/es/components/blur-fade/BlurFade.js +37 -49
  79. package/dist/es/components/blur-text/BlurText.js +67 -76
  80. package/dist/es/components/button/Button.css +1 -1
  81. package/dist/es/components/button/Button2.js +48 -0
  82. package/dist/es/components/comic-text/ComicText2.js +55 -0
  83. package/dist/es/components/confetti-button/index.js +63 -75
  84. package/dist/es/components/dock/Duck.css +1 -1
  85. package/dist/es/components/dock/Duck2.js +60 -0
  86. package/dist/es/components/flip-text/FlipText.css +1 -1
  87. package/dist/es/components/flip-text/FlipText2.js +41 -0
  88. package/dist/es/components/gradient-text/index.css +1 -1
  89. package/dist/es/components/gradient-text/index2.js +29 -0
  90. package/dist/es/components/hyper-text/HyperText.css +1 -1
  91. package/dist/es/components/hyper-text/index.js +51 -79
  92. package/dist/es/components/image-compare/ImageCompare.css +1 -1
  93. package/dist/es/components/image-compare/ImageCompare2.js +96 -0
  94. package/dist/es/components/image-viewer/ImageThumbnails.css +1 -1
  95. package/dist/es/components/image-viewer/ImageThumbnails2.js +40 -0
  96. package/dist/es/components/image-viewer/ImageViewer.css +1 -1
  97. package/dist/es/components/image-viewer/ImageViewer.d.ts +1 -1
  98. package/dist/es/components/image-viewer/ImageViewer2.js +151 -0
  99. package/dist/es/components/message/Message.css +1 -1
  100. package/dist/es/components/message/Message2.js +189 -0
  101. package/dist/es/components/pinch-content/PinchContent.js +120 -127
  102. package/dist/es/components/pinch-content/index.js +5 -5
  103. package/dist/es/components/pointer/Pointer.css +1 -1
  104. package/dist/es/components/pointer/Pointer2.js +61 -0
  105. package/dist/es/components/react-force-graph-3d/index.js +2 -0
  106. package/dist/es/components/scratch-to-reveal/ScratchToReveal.css +1 -1
  107. package/dist/es/components/scratch-to-reveal/ScratchToReveal2.js +88 -0
  108. package/dist/es/components/shimmer-button/ShimmerButton.css +1 -1
  109. package/dist/es/components/shimmer-button/ShimmerButton2.js +33 -0
  110. package/dist/es/components/shiny-button/ShinyButton.css +1 -1
  111. package/dist/es/components/shiny-button/ShinyButton2.js +53 -0
  112. package/dist/es/components/shiny-text/ShinyText2.js +61 -0
  113. package/dist/es/components/sparkles-text/SparklesText.css +1 -1
  114. package/dist/es/components/sparkles-text/SparklesText2.js +90 -0
  115. package/dist/es/components/split-text/SplitText.css +1 -1
  116. package/dist/es/components/split-text/SplitText2.js +109 -0
  117. package/dist/es/components/subtitle-player/CurrentMode.css +1 -1
  118. package/dist/es/components/subtitle-player/CurrentMode2.js +44 -0
  119. package/dist/es/components/subtitle-player/LyricsMode.css +1 -1
  120. package/dist/es/components/subtitle-player/LyricsMode2.js +114 -0
  121. package/dist/es/components/subtitle-player/SubtitlePlayer.css +1 -1
  122. package/dist/es/components/subtitle-player/SubtitlePlayer2.js +169 -0
  123. package/dist/es/components/subtitle-player/utils.js +63 -69
  124. package/dist/es/components/text-animate/TextAnimate.css +1 -1
  125. package/dist/es/components/text-animate/TextAnimate2.js +312 -0
  126. package/dist/es/components/text-type/TextType.css +1 -1
  127. package/dist/es/components/text-type/TextType2.js +80 -0
  128. package/dist/es/components/txt-editor/TxtEditor.js +60 -95
  129. package/dist/es/components/txt-reader/TxtReader.js +45 -74
  130. package/dist/es/components/txt-reader/index.module.css +1 -1
  131. package/dist/es/components/txt-reader/index.module.js +10 -0
  132. package/dist/es/components/typing-animation/index.css +1 -1
  133. package/dist/es/components/typing-animation/index2.js +43 -0
  134. package/dist/es/components/variable-proximity/index.css +1 -1
  135. package/dist/es/components/variable-proximity/index2.js +179 -0
  136. package/dist/es/components/video-dialog/VideoDialog.css +1 -1
  137. package/dist/es/components/video-dialog/VideoDialog2.js +168 -0
  138. package/dist/es/components/video-subtitle-player/VideoSubtitlePlayer.css +1 -1
  139. package/dist/es/components/video-subtitle-player/VideoSubtitlePlayer.mobile.css +1 -1
  140. package/dist/es/components/video-subtitle-player/VideoSubtitlePlayer.pc.css +1 -1
  141. package/dist/es/components/video-subtitle-player/VideoSubtitlePlayer2.js +43 -0
  142. package/dist/es/components/video-subtitle-player/VideoSubtitlePlayerMobile.js +29 -46
  143. package/dist/es/components/video-subtitle-player/VideoSubtitlePlayerPC.js +94 -74
  144. package/dist/es/components/video-subtitle-player/layouts/VideoSubtitlePlayerLayoutMobile.js +24 -21
  145. package/dist/es/components/video-subtitle-player/layouts/VideoSubtitlePlayerLayoutPC.js +58 -50
  146. package/dist/es/components/video-subtitle-player/useVideoSubtitleStore.js +61 -56
  147. package/dist/es/components/video-subtitle-player/useXGPlayer.js +38 -35
  148. package/dist/es/hooks/useStayTimeReport.js +29 -29
  149. package/dist/es/index.js +33 -70
  150. package/dist/es/node_modules/.pnpm/xgplayer@3.0.24_core-js@3.47.0/node_modules/xgplayer/dist/index.min.css +1 -1
  151. package/dist/es/packages/subtitle/lib/index.js +2 -0
  152. package/dist/es/packages/subtitle/lib/src/json-converter.js +22 -23
  153. package/dist/es/packages/subtitle/lib/src/parser.js +41 -54
  154. package/dist/es/react-components.css +27 -27
  155. package/package.json +25 -27
  156. package/dist/cjs/components/button/Button.js +0 -1
  157. package/dist/cjs/components/comic-text/ComicText.js +0 -4
  158. package/dist/cjs/components/dock/Duck.js +0 -1
  159. package/dist/cjs/components/flip-text/FlipText.js +0 -1
  160. package/dist/cjs/components/gradient-text/index.js +0 -1
  161. package/dist/cjs/components/image-compare/ImageCompare.js +0 -1
  162. package/dist/cjs/components/image-viewer/ImageThumbnails.js +0 -1
  163. package/dist/cjs/components/image-viewer/ImageViewer.js +0 -1
  164. package/dist/cjs/components/message/Message.js +0 -1
  165. package/dist/cjs/components/pointer/Pointer.js +0 -1
  166. package/dist/cjs/components/scratch-to-reveal/ScratchToReveal.js +0 -1
  167. package/dist/cjs/components/shimmer-button/ShimmerButton.js +0 -1
  168. package/dist/cjs/components/shiny-button/ShinyButton.js +0 -1
  169. package/dist/cjs/components/shiny-text/ShinyText.js +0 -1
  170. package/dist/cjs/components/sparkles-text/SparklesText.js +0 -1
  171. package/dist/cjs/components/split-text/SplitText.js +0 -1
  172. package/dist/cjs/components/subtitle-player/CurrentMode.js +0 -2
  173. package/dist/cjs/components/subtitle-player/LyricsMode.js +0 -2
  174. package/dist/cjs/components/subtitle-player/SubtitlePlayer.js +0 -1
  175. package/dist/cjs/components/text-animate/TextAnimate.js +0 -2
  176. package/dist/cjs/components/text-type/TextType.js +0 -1
  177. package/dist/cjs/components/txt-reader/index.module.css.js +0 -1
  178. package/dist/cjs/components/typing-animation/index.js +0 -1
  179. package/dist/cjs/components/variable-proximity/index.js +0 -1
  180. package/dist/cjs/components/video-dialog/VideoDialog.js +0 -1
  181. package/dist/cjs/components/video-subtitle-player/VideoSubtitlePlayer.js +0 -1
  182. package/dist/es/components/button/Button.js +0 -72
  183. package/dist/es/components/comic-text/ComicText.js +0 -52
  184. package/dist/es/components/dock/Duck.js +0 -80
  185. package/dist/es/components/flip-text/FlipText.js +0 -38
  186. package/dist/es/components/gradient-text/index.js +0 -22
  187. package/dist/es/components/image-compare/ImageCompare.js +0 -127
  188. package/dist/es/components/image-viewer/ImageThumbnails.js +0 -73
  189. package/dist/es/components/image-viewer/ImageViewer.js +0 -141
  190. package/dist/es/components/message/Message.js +0 -220
  191. package/dist/es/components/pointer/Pointer.js +0 -75
  192. package/dist/es/components/scratch-to-reveal/ScratchToReveal.js +0 -97
  193. package/dist/es/components/shimmer-button/ShimmerButton.js +0 -42
  194. package/dist/es/components/shiny-button/ShinyButton.js +0 -61
  195. package/dist/es/components/shiny-text/ShinyText.js +0 -76
  196. package/dist/es/components/sparkles-text/SparklesText.js +0 -71
  197. package/dist/es/components/split-text/SplitText.js +0 -116
  198. package/dist/es/components/subtitle-player/CurrentMode.js +0 -78
  199. package/dist/es/components/subtitle-player/LyricsMode.js +0 -152
  200. package/dist/es/components/subtitle-player/SubtitlePlayer.js +0 -234
  201. package/dist/es/components/text-animate/TextAnimate.js +0 -310
  202. package/dist/es/components/text-type/TextType.js +0 -121
  203. package/dist/es/components/txt-reader/index.module.css.js +0 -10
  204. package/dist/es/components/typing-animation/index.js +0 -56
  205. package/dist/es/components/variable-proximity/index.js +0 -211
  206. package/dist/es/components/video-dialog/VideoDialog.js +0 -113
  207. package/dist/es/components/video-subtitle-player/VideoSubtitlePlayer.js +0 -74
@@ -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{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}}
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 d } from "react/jsx-runtime";
2
- function h(t) {
3
- const n = t.replace(",", ".").split(":");
4
- if (n.length !== 3)
5
- return 0;
6
- const r = parseInt(n[0], 10) || 0, a = parseInt(n[1], 10) || 0, s = parseFloat(n[2]) || 0;
7
- return r * 3600 + a * 60 + s;
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 S(t) {
10
- const e = Math.floor(t / 3600), n = Math.floor(t % 3600 / 60), r = Math.floor(t % 60);
11
- return e > 0 ? `${e.toString().padStart(2, "0")}:${n.toString().padStart(2, "0")}:${r.toString().padStart(2, "0")}` : `${n.toString().padStart(2, "0")}:${r.toString().padStart(2, "0")}`;
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 x(t, e) {
14
- for (const n of t) {
15
- const r = h(n.startTime), a = h(n.endTime);
16
- if (e >= r && e <= a)
17
- return n;
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 T(t, e, n, r, a) {
22
- if (!e || e.length === 0)
23
- return { nodes: t, nextWordIndex: n };
24
- const s = [];
25
- let i = 0;
26
- for (let o = n; o < e.length; o++) {
27
- const c = e[o], f = t.substring(i).indexOf(c);
28
- if (f === -1)
29
- return {
30
- nodes: s.length > 0 ? s : t,
31
- nextWordIndex: o
32
- };
33
- const u = i + f;
34
- if (u > i) {
35
- const g = t.substring(i, u);
36
- g && s.push(
37
- /* @__PURE__ */ d("span", { className: "xiping-subtitle-word-before", children: g }, `before-${r}-${o}`)
38
- );
39
- }
40
- const l = a?.(c, o, r);
41
- if (s.push(
42
- /* @__PURE__ */ d(
43
- "span",
44
- {
45
- className: "xiping-subtitle-word",
46
- "data-word": c,
47
- onMouseEnter: l?.onMouseEnter,
48
- onMouseLeave: l?.onMouseLeave,
49
- onClick: l?.onClick,
50
- children: c
51
- },
52
- `word-${r}-${o}`
53
- )
54
- ), i = u + c.length, i >= t.length)
55
- return { nodes: s, nextWordIndex: o + 1 };
56
- }
57
- if (i < t.length) {
58
- const o = t.substring(i);
59
- o && s.push(
60
- /* @__PURE__ */ d("span", { className: "xiping-subtitle-word-after", children: o }, `after-${r}`)
61
- );
62
- }
63
- return {
64
- nodes: s.length > 0 ? s : t,
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
- export {
69
- x as getCurrentSubtitleEntry,
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;white-space:pre}.xiping-text-animate-segment--line{display: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}