@eternalheart/react-file-preview 1.5.0 → 1.5.2

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 (56) hide show
  1. package/lib/chunks/{index-CTghYlSh.mjs → index-37FMdXja.mjs} +2 -2
  2. package/lib/chunks/{index-CTghYlSh.mjs.map → index-37FMdXja.mjs.map} +1 -1
  3. package/lib/chunks/{index-Dc6q1OKl.mjs → index-7aRho9r4.mjs} +3 -3
  4. package/lib/chunks/{index-Dc6q1OKl.mjs.map → index-7aRho9r4.mjs.map} +1 -1
  5. package/lib/chunks/{index-Da3FN2-3.mjs → index-BXa7r4uK.mjs} +3 -3
  6. package/lib/chunks/{index-Da3FN2-3.mjs.map → index-BXa7r4uK.mjs.map} +1 -1
  7. package/lib/chunks/{index-CKdQL1Bk.mjs → index-BaSsmMZP.mjs} +2 -2
  8. package/lib/chunks/{index-CKdQL1Bk.mjs.map → index-BaSsmMZP.mjs.map} +1 -1
  9. package/lib/chunks/{index-DzCLf1Db.mjs → index-Bn0NJNzq.mjs} +2 -2
  10. package/lib/chunks/{index-DzCLf1Db.mjs.map → index-Bn0NJNzq.mjs.map} +1 -1
  11. package/lib/chunks/{index-CQYrhe7Z.mjs → index-Btsr3v83.mjs} +2 -2
  12. package/lib/chunks/{index-CQYrhe7Z.mjs.map → index-Btsr3v83.mjs.map} +1 -1
  13. package/lib/chunks/{index-CuWzRQZw.mjs → index-C2uu09Eb.mjs} +2 -2
  14. package/lib/chunks/{index-CuWzRQZw.mjs.map → index-C2uu09Eb.mjs.map} +1 -1
  15. package/lib/chunks/{index-CRZqNMQ7.mjs → index-C5o_T3Es.mjs} +18 -19
  16. package/lib/chunks/index-C5o_T3Es.mjs.map +1 -0
  17. package/lib/chunks/index-CMehLA91.mjs +587 -0
  18. package/lib/chunks/index-CMehLA91.mjs.map +1 -0
  19. package/lib/chunks/{index-2sX2d4iv.mjs → index-CTEgp9x8.mjs} +2 -2
  20. package/lib/chunks/{index-2sX2d4iv.mjs.map → index-CTEgp9x8.mjs.map} +1 -1
  21. package/lib/chunks/{index-Cz23v-TW.mjs → index-Cbp94jbP.mjs} +20 -20
  22. package/lib/chunks/{index-Cz23v-TW.mjs.map → index-Cbp94jbP.mjs.map} +1 -1
  23. package/lib/chunks/{index-Bdj8_B80.mjs → index-CmK5E5Oa.mjs} +3 -3
  24. package/lib/chunks/{index-Bdj8_B80.mjs.map → index-CmK5E5Oa.mjs.map} +1 -1
  25. package/lib/chunks/index-CyBXARuf.mjs +5215 -0
  26. package/lib/chunks/index-CyBXARuf.mjs.map +1 -0
  27. package/lib/chunks/{index-WLepq2g2.mjs → index-DTNdG1bB.mjs} +3 -3
  28. package/lib/chunks/{index-WLepq2g2.mjs.map → index-DTNdG1bB.mjs.map} +1 -1
  29. package/lib/chunks/{index-CCcZzLUM.mjs → index-DfzgQFfx.mjs} +2 -2
  30. package/lib/chunks/{index-CCcZzLUM.mjs.map → index-DfzgQFfx.mjs.map} +1 -1
  31. package/lib/chunks/{index-D-Is8qvU.mjs → index-DsIUJXpz.mjs} +8 -9
  32. package/lib/chunks/index-DsIUJXpz.mjs.map +1 -0
  33. package/lib/chunks/{index-OXjOFggq.mjs → index-DxUP4apX.mjs} +2 -2
  34. package/lib/chunks/{index-OXjOFggq.mjs.map → index-DxUP4apX.mjs.map} +1 -1
  35. package/lib/chunks/{index-FomaQSaL.mjs → index-HRUhzosx.mjs} +2 -2
  36. package/lib/chunks/{index-FomaQSaL.mjs.map → index-HRUhzosx.mjs.map} +1 -1
  37. package/lib/chunks/{index-_B5marES.mjs → index-VnjkEX5p.mjs} +2 -2
  38. package/lib/chunks/{index-_B5marES.mjs.map → index-VnjkEX5p.mjs.map} +1 -1
  39. package/lib/chunks/{index-CuTz7dbd.mjs → index-qWLZuYn6.mjs} +2 -2
  40. package/lib/chunks/{index-CuTz7dbd.mjs.map → index-qWLZuYn6.mjs.map} +1 -1
  41. package/lib/chunks/{useShikiHighlight-Bbs8Fbqs.mjs → useShikiHighlight-BG7pCfB5.mjs} +2 -2
  42. package/lib/chunks/{useShikiHighlight-Bbs8Fbqs.mjs.map → useShikiHighlight-BG7pCfB5.mjs.map} +1 -1
  43. package/lib/index.cjs +20 -20
  44. package/lib/index.cjs.map +1 -1
  45. package/lib/index.css +1 -1
  46. package/lib/index.mjs +1 -1
  47. package/lib/renderers/Audio/index.d.ts.map +1 -1
  48. package/lib/renderers/Csv/index.d.ts +0 -1
  49. package/lib/renderers/Csv/index.d.ts.map +1 -1
  50. package/lib/renderers/Xlsx/index.d.ts +0 -1
  51. package/lib/renderers/Xlsx/index.d.ts.map +1 -1
  52. package/package.json +1 -1
  53. package/lib/chunks/index-CRZqNMQ7.mjs.map +0 -1
  54. package/lib/chunks/index-D-Is8qvU.mjs.map +0 -1
  55. package/lib/chunks/index-DoGKcq9y.mjs +0 -531
  56. package/lib/chunks/index-DoGKcq9y.mjs.map +0 -1
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-CRZqNMQ7.mjs","sources":["../../src/renderers/Xlsx/index.tsx"],"sourcesContent":["import { useState, useEffect, useRef, useCallback, forwardRef, useImperativeHandle } from 'react';\nimport ExcelJS from 'exceljs';\nimport Spreadsheet from 'x-data-spreadsheet';\nimport 'x-data-spreadsheet/dist/xspreadsheet.css';\nimport { convertWorkbookToSpreadsheetData } from '../../utils/excelDataConverter';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\nimport { RendererError } from '../RendererError';\nimport type { RendererHandle } from '../base.types';\n\ninterface XlsxRendererProps {\n url: string;\n}\n\nexport const XlsxRenderer = forwardRef<RendererHandle, XlsxRendererProps>(({ url }, ref) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const spreadsheetRef = useRef<Spreadsheet | null>(null);\n const sheetDataRef = useRef<Record<string, unknown>[] | null>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n const resizeTimeoutRef = useRef<number | null>(null);\n const lastDimensionsRef = useRef({ width: 0, height: 0 });\n\n const calculateDimensions = useCallback(() => {\n if (!containerRef.current) return { width: 800, height: 600 };\n const rawWidth = containerRef.current.clientWidth;\n const rawHeight = containerRef.current.clientHeight;\n const width = rawWidth > 100 ? rawWidth : 800;\n const height = rawHeight > 100 ? rawHeight : 600;\n return { width, height };\n }, []);\n\n const mountSpreadsheet = useCallback(() => {\n if (!containerRef.current || !sheetDataRef.current) return;\n\n // 清空容器\n containerRef.current.innerHTML = '';\n spreadsheetRef.current = null;\n\n const { width, height } = calculateDimensions();\n const isMobile = width < 640;\n\n const s = new Spreadsheet(containerRef.current, {\n mode: 'read',\n showToolbar: false,\n showContextmenu: false,\n showGrid: true,\n row: {\n len: 100,\n height: 25,\n },\n col: {\n len: 26,\n width: isMobile ? 80 : 100,\n indexWidth: isMobile ? 40 : 60,\n minWidth: isMobile ? 40 : 60,\n },\n view: {\n height: () => height,\n width: () => width,\n },\n });\n\n s.loadData(sheetDataRef.current as unknown as Record<string, unknown>);\n spreadsheetRef.current = s;\n }, [calculateDimensions]);\n\n // 监听容器尺寸变化\n useEffect(() => {\n if (!containerRef.current) return;\n\n let isInitialRender = true;\n\n const updateDimensions = () => {\n if (isInitialRender) {\n isInitialRender = false;\n lastDimensionsRef.current = calculateDimensions();\n return;\n }\n\n const newDimensions = calculateDimensions();\n const lastDimensions = lastDimensionsRef.current;\n const widthDiff = Math.abs(lastDimensions.width - newDimensions.width);\n const heightDiff = Math.abs(lastDimensions.height - newDimensions.height);\n\n if (widthDiff < 10 && heightDiff < 10) return;\n\n lastDimensionsRef.current = newDimensions;\n\n if (resizeTimeoutRef.current) {\n clearTimeout(resizeTimeoutRef.current);\n }\n\n resizeTimeoutRef.current = window.setTimeout(() => {\n if (sheetDataRef.current) {\n mountSpreadsheet();\n }\n }, 500);\n };\n\n resizeObserverRef.current = new ResizeObserver(() => {\n updateDimensions();\n });\n\n resizeObserverRef.current.observe(containerRef.current);\n\n return () => {\n if (resizeObserverRef.current) {\n resizeObserverRef.current.disconnect();\n }\n if (resizeTimeoutRef.current) {\n clearTimeout(resizeTimeoutRef.current);\n }\n };\n }, [calculateDimensions, mountSpreadsheet]);\n\n useEffect(() => {\n // 只有 URL 有效时才加载(避免空字符串或已 revoke 的 blob URL)\n if (!url) return;\n\n let isMounted = true;\n\n const loadExcel = async () => {\n if (!containerRef.current) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const response = await fetcher(url, {\n mode: 'cors',\n credentials: 'omit',\n redirect: 'follow',\n });\n\n if (!response.ok) {\n if (response.status === 404) {\n throw new Error(t('xlsx.not_found'));\n } else if (response.status === 403) {\n throw new Error('无权限访问此文件');\n } else {\n throw new Error(`文件加载失败 (${response.status})`);\n }\n }\n\n const arrayBuffer = await response.arrayBuffer();\n\n if (arrayBuffer.byteLength === 0) {\n throw new Error('文件为空');\n }\n\n // 使用 exceljs 解析\n const workbook = new ExcelJS.Workbook();\n await workbook.xlsx.load(arrayBuffer);\n\n // 转换为 x-data-spreadsheet 数据格式\n const sheetData = convertWorkbookToSpreadsheetData(workbook);\n\n if (!isMounted) return;\n\n sheetDataRef.current = sheetData as unknown as Record<string, unknown>[];\n\n // 挂载 x-data-spreadsheet\n mountSpreadsheet();\n\n setLoading(false);\n } catch (err) {\n if (isMounted) {\n console.error('Excel 解析错误:', err);\n let errorMsg = t('xlsx.parse_failed');\n if (err instanceof Error) {\n errorMsg = err.message;\n }\n setError(errorMsg);\n setLoading(false);\n }\n }\n };\n\n const timer = setTimeout(() => {\n requestAnimationFrame(() => {\n loadExcel();\n });\n }, 100);\n\n return () => {\n isMounted = false;\n clearTimeout(timer);\n sheetDataRef.current = null;\n if (containerRef.current) {\n containerRef.current.innerHTML = '';\n }\n spreadsheetRef.current = null;\n };\n }, [url, mountSpreadsheet]);\n\n // 暴露接口给父组件\n useImperativeHandle(ref, () => ({\n getToolbarGroups: () => [],\n }), []);\n\n return (\n <div className=\"rfp-relative rfp-flex rfp-flex-col rfp-items-center rfp-w-full rfp-h-full\">\n {/* 加载状态 */}\n {loading && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-toolbar rfp-backdrop-blur-sm rfp-z-10\">\n <div className=\"rfp-text-center\">\n <div className=\"rfp-w-10 rfp-h-10 md:rfp-w-12 md:rfp-h-12 rfp-mx-auto rfp-mb-3 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n <p className=\"rfp-text-xs md:rfp-text-sm rfp-text-fg-secondary rfp-font-medium\">{t('xlsx.loading')}</p>\n </div>\n </div>\n )}\n\n {/* 错误状态 */}\n {error && !loading && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-toolbar rfp-backdrop-blur-sm rfp-z-10\">\n <RendererError message={t('xlsx.load_failed')} detail={error} />\n </div>\n )}\n\n {/* Spreadsheet 容器 */}\n {!error && (\n <div\n ref={containerRef}\n className=\"xlsx-spreadsheet-container rfp-w-full rfp-h-full\"\n style={{ opacity: loading ? 0 : 1 }}\n />\n )}\n </div>\n );\n});\n"],"names":["XlsxRenderer","forwardRef","url","ref","t","useTranslator","fetcher","useFetcher","loading","setLoading","useState","error","setError","containerRef","useRef","spreadsheetRef","sheetDataRef","resizeObserverRef","resizeTimeoutRef","lastDimensionsRef","calculateDimensions","useCallback","rawWidth","rawHeight","width","height","mountSpreadsheet","isMobile","s","Spreadsheet","useEffect","isInitialRender","updateDimensions","newDimensions","lastDimensions","widthDiff","heightDiff","isMounted","loadExcel","response","arrayBuffer","workbook","ExcelJS","sheetData","convertWorkbookToSpreadsheetData","err","errorMsg","timer","useImperativeHandle","jsxs","jsx","RendererError"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"index-D-Is8qvU.mjs","sources":["../../src/renderers/Csv/index.tsx"],"sourcesContent":["import { useState, useEffect, useRef, useCallback, forwardRef, useImperativeHandle } from 'react';\nimport Spreadsheet from 'x-data-spreadsheet';\nimport 'x-data-spreadsheet/dist/xspreadsheet.css';\nimport {\n parseCsv,\n guessCsvDelimiter,\n fetchTextUtf8,\n convertCsvToSpreadsheetData,\n} from '@eternalheart/file-preview-core';\nimport { useTranslator } from '../../i18n/LocaleContext';\nimport { useFetcher } from '../../RequestContext';\nimport { RendererError } from '../RendererError';\nimport type { RendererHandle } from '../base.types';\n\ninterface CsvRendererProps {\n url: string;\n fileName: string;\n}\n\nexport const CsvRenderer = forwardRef<RendererHandle, CsvRendererProps>(({ url, fileName }, ref) => {\n const t = useTranslator();\n const fetcher = useFetcher();\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState<string | null>(null);\n const containerRef = useRef<HTMLDivElement>(null);\n const spreadsheetRef = useRef<Spreadsheet | null>(null);\n const sheetDataRef = useRef<Record<string, unknown>[] | null>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n const resizeTimeoutRef = useRef<number | null>(null);\n const lastDimensionsRef = useRef({ width: 0, height: 0 });\n\n const calculateDimensions = useCallback(() => {\n if (!containerRef.current) return { width: 800, height: 600 };\n const rawWidth = containerRef.current.clientWidth;\n const rawHeight = containerRef.current.clientHeight;\n const width = rawWidth > 100 ? rawWidth : 800;\n const height = rawHeight > 100 ? rawHeight : 600;\n return { width, height };\n }, []);\n\n const mountSpreadsheet = useCallback(() => {\n if (!containerRef.current || !sheetDataRef.current) return;\n\n containerRef.current.innerHTML = '';\n spreadsheetRef.current = null;\n\n const { width, height } = calculateDimensions();\n const isMobile = width < 640;\n\n const s = new Spreadsheet(containerRef.current, {\n mode: 'read',\n showToolbar: false,\n showContextmenu: false,\n showGrid: true,\n row: {\n len: 100,\n height: 25,\n },\n col: {\n len: 26,\n width: isMobile ? 80 : 100,\n indexWidth: isMobile ? 40 : 60,\n minWidth: isMobile ? 40 : 60,\n },\n view: {\n height: () => height,\n width: () => width,\n },\n });\n\n s.loadData(sheetDataRef.current as unknown as Record<string, unknown>);\n spreadsheetRef.current = s;\n }, [calculateDimensions]);\n\n useEffect(() => {\n if (!containerRef.current) return;\n\n let isInitialRender = true;\n\n const updateDimensions = () => {\n if (isInitialRender) {\n isInitialRender = false;\n lastDimensionsRef.current = calculateDimensions();\n return;\n }\n\n const newDimensions = calculateDimensions();\n const lastDimensions = lastDimensionsRef.current;\n const widthDiff = Math.abs(lastDimensions.width - newDimensions.width);\n const heightDiff = Math.abs(lastDimensions.height - newDimensions.height);\n\n if (widthDiff < 10 && heightDiff < 10) return;\n\n lastDimensionsRef.current = newDimensions;\n\n if (resizeTimeoutRef.current) {\n clearTimeout(resizeTimeoutRef.current);\n }\n\n resizeTimeoutRef.current = window.setTimeout(() => {\n if (sheetDataRef.current) {\n mountSpreadsheet();\n }\n }, 500);\n };\n\n resizeObserverRef.current = new ResizeObserver(() => {\n updateDimensions();\n });\n\n resizeObserverRef.current.observe(containerRef.current);\n\n return () => {\n if (resizeObserverRef.current) {\n resizeObserverRef.current.disconnect();\n }\n if (resizeTimeoutRef.current) {\n clearTimeout(resizeTimeoutRef.current);\n }\n };\n }, [calculateDimensions, mountSpreadsheet]);\n\n useEffect(() => {\n let isMounted = true;\n const controller = new AbortController();\n\n const loadCsv = async () => {\n if (!containerRef.current) return;\n\n setLoading(true);\n setError(null);\n\n try {\n const text = await fetchTextUtf8(url, { fetcher, signal: controller.signal });\n const parsed = parseCsv(text, { delimiter: guessCsvDelimiter(fileName) });\n const sheetData = convertCsvToSpreadsheetData(parsed.header, parsed.rows, fileName);\n\n if (!isMounted) return;\n\n sheetDataRef.current = sheetData as unknown as Record<string, unknown>[];\n mountSpreadsheet();\n setLoading(false);\n } catch (err: any) {\n if (err.name === 'AbortError') return;\n if (isMounted) {\n console.error('CSV 解析错误:', err);\n setError(t('csv.load_failed'));\n setLoading(false);\n }\n }\n };\n\n const timer = setTimeout(() => {\n requestAnimationFrame(() => {\n loadCsv();\n });\n }, 100);\n\n return () => {\n isMounted = false;\n controller.abort();\n clearTimeout(timer);\n sheetDataRef.current = null;\n if (containerRef.current) {\n containerRef.current.innerHTML = '';\n }\n spreadsheetRef.current = null;\n };\n }, [url, fileName, mountSpreadsheet]);\n\n // 暴露接口给父组件\n useImperativeHandle(ref, () => ({\n getToolbarGroups: () => [],\n }), []);\n\n return (\n <div className=\"rfp-relative rfp-flex rfp-flex-col rfp-items-center rfp-w-full rfp-h-full\">\n {loading && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-toolbar rfp-backdrop-blur-sm rfp-z-10\">\n <div className=\"rfp-text-center\">\n <div className=\"rfp-w-10 rfp-h-10 md:rfp-w-12 md:rfp-h-12 rfp-mx-auto rfp-mb-3 rfp-border-4 rfp-border-line-strong rfp-border-t-spinner-head rfp-rounded-full rfp-animate-spin\" />\n <p className=\"rfp-text-xs md:rfp-text-sm rfp-text-fg-secondary rfp-font-medium\">{t('csv.loading')}</p>\n </div>\n </div>\n )}\n\n {error && !loading && (\n <div className=\"rfp-absolute rfp-inset-0 rfp-flex rfp-items-center rfp-justify-center rfp-bg-surface-toolbar rfp-backdrop-blur-sm rfp-z-10\">\n <RendererError message={error} />\n </div>\n )}\n\n {!error && (\n <div\n ref={containerRef}\n className=\"xlsx-spreadsheet-container rfp-w-full rfp-h-full\"\n style={{ opacity: loading ? 0 : 1 }}\n />\n )}\n </div>\n );\n});\n"],"names":["CsvRenderer","forwardRef","url","fileName","ref","t","useTranslator","fetcher","useFetcher","loading","setLoading","useState","error","setError","containerRef","useRef","spreadsheetRef","sheetDataRef","resizeObserverRef","resizeTimeoutRef","lastDimensionsRef","calculateDimensions","useCallback","rawWidth","rawHeight","width","height","mountSpreadsheet","isMobile","Spreadsheet","useEffect","isInitialRender","updateDimensions","newDimensions","lastDimensions","widthDiff","heightDiff","isMounted","controller","loadCsv","text","fetchTextUtf8","parsed","parseCsv","guessCsvDelimiter","sheetData","convertCsvToSpreadsheetData","err","timer","useImperativeHandle","jsxs","jsx","RendererError"],"mappings":"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"}
@@ -1,531 +0,0 @@
1
- import { jsx as r, jsxs as a } from "react/jsx-runtime";
2
- import { useRef as G, useState as p, useEffect as F, useCallback as w, forwardRef as A, useImperativeHandle as _ } from "react";
3
- import { motion as d, AnimatePresence as z } from "framer-motion";
4
- import { Repeat as B, SkipBack as q, Pause as U, Play as X, SkipForward as J, VolumeX as K, Volume1 as Q, Volume2 as Y } from "lucide-react";
5
- import { u as Z } from "./index-Cz23v-TW.mjs";
6
- import { R as ee } from "./RendererError-D5i8eSpN.mjs";
7
- function re({
8
- url: c
9
- }) {
10
- const o = G(null), [E, n] = p(!1), [N, i] = p(!0), [C, g] = p(0), [h, l] = p(0), [f, u] = p(1), [x, b] = p(!1), [k, v] = p(!1), [T, y] = p(null);
11
- F(() => {
12
- const e = o.current;
13
- if (!e) return;
14
- i(!0), y(null);
15
- const t = () => {
16
- isNaN(e.currentTime) || g(e.currentTime);
17
- }, s = () => {
18
- !isNaN(e.duration) && isFinite(e.duration) && l(e.duration);
19
- }, m = () => {
20
- i(!1), s();
21
- }, R = () => i(!0), W = () => {
22
- i(!1), n(!0);
23
- }, $ = () => n(!0), H = () => n(!1), O = () => n(!1), D = () => {
24
- y("音频加载失败"), i(!1);
25
- };
26
- return e.addEventListener("timeupdate", t), e.addEventListener("loadedmetadata", s), e.addEventListener("durationchange", s), e.addEventListener("canplay", m), e.addEventListener("waiting", R), e.addEventListener("playing", W), e.addEventListener("play", $), e.addEventListener("pause", H), e.addEventListener("ended", O), e.addEventListener("error", D), e.readyState >= 3 ? (i(!1), s()) : e.readyState >= 1 && s(), () => {
27
- e.removeEventListener("timeupdate", t), e.removeEventListener("loadedmetadata", s), e.removeEventListener("durationchange", s), e.removeEventListener("canplay", m), e.removeEventListener("waiting", R), e.removeEventListener("playing", W), e.removeEventListener("play", $), e.removeEventListener("pause", H), e.removeEventListener("ended", O), e.removeEventListener("error", D);
28
- };
29
- }, [c]);
30
- const V = w(() => {
31
- const e = o.current;
32
- e && (e.paused ? e.play().catch(() => {
33
- }) : e.pause());
34
- }, []), I = w((e) => {
35
- const t = o.current;
36
- t && (t.currentTime = e, g(e));
37
- }, []), L = w(
38
- (e) => {
39
- const t = o.current;
40
- t && (t.currentTime = Math.max(
41
- 0,
42
- Math.min(t.currentTime + e, t.duration || 1 / 0)
43
- ));
44
- },
45
- []
46
- ), M = w((e) => {
47
- const t = o.current;
48
- if (!t) return;
49
- const s = Math.max(0, Math.min(1, e));
50
- t.volume = s, u(s), s > 0 && (t.muted = !1, b(!1));
51
- }, []), S = w(() => {
52
- const e = o.current;
53
- e && (e.muted = !e.muted, b(e.muted));
54
- }, []), P = w(() => {
55
- const e = o.current;
56
- if (!e) return;
57
- const t = !e.loop;
58
- e.loop = t, v(t);
59
- }, []), j = w((e) => {
60
- if (!isFinite(e) || isNaN(e) || e < 0) return "0:00";
61
- const t = Math.floor(e / 60), s = Math.floor(e % 60);
62
- return `${t}:${s.toString().padStart(2, "0")}`;
63
- }, []);
64
- return {
65
- audioRef: o,
66
- isPlaying: E,
67
- isLoading: N,
68
- isLoop: k,
69
- currentTime: C,
70
- duration: h,
71
- volume: f,
72
- isMuted: x,
73
- error: T,
74
- togglePlay: V,
75
- seek: I,
76
- skip: L,
77
- setVolume: M,
78
- toggleMute: S,
79
- toggleLoop: P,
80
- formatTime: j
81
- };
82
- }
83
- const te = ({ text: c, className: o = "", style: E }) => {
84
- const n = G(null), N = G(null), [i, C] = p(!1), [g, h] = p(0);
85
- F(() => {
86
- const x = () => {
87
- const k = n.current, v = N.current;
88
- if (!k || !v) return;
89
- const T = k.clientWidth, y = v.scrollWidth;
90
- C(y > T), h(y);
91
- };
92
- x();
93
- const b = new ResizeObserver(x);
94
- return n.current && b.observe(n.current), () => b.disconnect();
95
- }, [c]);
96
- const l = 60, f = g + l, u = f / 40;
97
- return /* @__PURE__ */ a(
98
- "div",
99
- {
100
- ref: n,
101
- className: `rfp-overflow-hidden rfp-whitespace-nowrap ${o}`,
102
- style: E,
103
- children: [
104
- i ? /* @__PURE__ */ a(
105
- d.div,
106
- {
107
- className: "rfp-inline-flex rfp-whitespace-nowrap",
108
- animate: { x: [0, -f] },
109
- transition: { duration: u, repeat: 1 / 0, ease: "linear", repeatDelay: 1.5 },
110
- children: [
111
- /* @__PURE__ */ r("span", { children: c }),
112
- /* @__PURE__ */ r("span", { style: { width: l }, className: "rfp-inline-block" }),
113
- /* @__PURE__ */ r("span", { children: c })
114
- ]
115
- }
116
- ) : null,
117
- /* @__PURE__ */ r(
118
- "div",
119
- {
120
- ref: N,
121
- className: "rfp-whitespace-nowrap",
122
- style: i ? { position: "absolute", visibility: "hidden", pointerEvents: "none" } : void 0,
123
- children: c
124
- }
125
- )
126
- ]
127
- }
128
- );
129
- }, ae = ({ isPlaying: c }) => /* @__PURE__ */ r(
130
- d.div,
131
- {
132
- className: "rfp-absolute",
133
- style: {
134
- top: "-6px",
135
- right: "2px",
136
- width: "100px",
137
- height: "120px",
138
- transformOrigin: "76px 16px",
139
- zIndex: 5
140
- },
141
- animate: { rotate: c ? 16 : 0 },
142
- transition: { duration: 0.8, ease: [0.4, 0, 0.2, 1] },
143
- children: /* @__PURE__ */ a(
144
- "svg",
145
- {
146
- width: "100",
147
- height: "120",
148
- viewBox: "0 0 100 120",
149
- fill: "none",
150
- xmlns: "http://www.w3.org/2000/svg",
151
- children: [
152
- /* @__PURE__ */ r("circle", { cx: "76", cy: "16", r: "13", fill: "rgba(0,0,0,0.3)" }),
153
- /* @__PURE__ */ r("circle", { cx: "76", cy: "16", r: "11", fill: "url(#baseGrad)" }),
154
- /* @__PURE__ */ r("circle", { cx: "76", cy: "16", r: "6", fill: "url(#baseInnerGrad)" }),
155
- /* @__PURE__ */ r("circle", { cx: "76", cy: "16", r: "2.5", fill: "#222", stroke: "#555", strokeWidth: "0.5" }),
156
- /* @__PURE__ */ r(
157
- "path",
158
- {
159
- d: "M74 22 L56 88",
160
- stroke: "url(#armGrad)",
161
- strokeWidth: "3.5",
162
- strokeLinecap: "round"
163
- }
164
- ),
165
- /* @__PURE__ */ r(
166
- "path",
167
- {
168
- d: "M74.8 22 L56.8 88",
169
- stroke: "rgba(255,255,255,0.06)",
170
- strokeWidth: "1",
171
- strokeLinecap: "round"
172
- }
173
- ),
174
- /* @__PURE__ */ r("rect", { x: "50", y: "86", width: "12", height: "7", rx: "1.5", fill: "url(#headGrad)" }),
175
- /* @__PURE__ */ r("rect", { x: "52.5", y: "92", width: "7", height: "9", rx: "1", fill: "url(#cartridgeGrad)" }),
176
- /* @__PURE__ */ r("line", { x1: "56", y1: "101", x2: "56", y2: "105", stroke: "#bbb", strokeWidth: "1.2", strokeLinecap: "round" }),
177
- /* @__PURE__ */ r("circle", { cx: "56", cy: "105.5", r: "0.8", fill: "#ddd" }),
178
- /* @__PURE__ */ a("defs", { children: [
179
- /* @__PURE__ */ a("radialGradient", { id: "baseGrad", cx: "40%", cy: "35%", children: [
180
- /* @__PURE__ */ r("stop", { offset: "0%", stopColor: "#555" }),
181
- /* @__PURE__ */ r("stop", { offset: "100%", stopColor: "#1a1a1a" })
182
- ] }),
183
- /* @__PURE__ */ a("radialGradient", { id: "baseInnerGrad", cx: "40%", cy: "35%", children: [
184
- /* @__PURE__ */ r("stop", { offset: "0%", stopColor: "#666" }),
185
- /* @__PURE__ */ r("stop", { offset: "100%", stopColor: "#333" })
186
- ] }),
187
- /* @__PURE__ */ a("linearGradient", { id: "armGrad", x1: "0", y1: "0", x2: "0", y2: "1", children: [
188
- /* @__PURE__ */ r("stop", { offset: "0%", stopColor: "#555" }),
189
- /* @__PURE__ */ r("stop", { offset: "50%", stopColor: "#444" }),
190
- /* @__PURE__ */ r("stop", { offset: "100%", stopColor: "#333" })
191
- ] }),
192
- /* @__PURE__ */ a("linearGradient", { id: "headGrad", x1: "0", y1: "0", x2: "0", y2: "1", children: [
193
- /* @__PURE__ */ r("stop", { offset: "0%", stopColor: "#555" }),
194
- /* @__PURE__ */ r("stop", { offset: "100%", stopColor: "#333" })
195
- ] }),
196
- /* @__PURE__ */ a("linearGradient", { id: "cartridgeGrad", x1: "0", y1: "0", x2: "0", y2: "1", children: [
197
- /* @__PURE__ */ r("stop", { offset: "0%", stopColor: "#444" }),
198
- /* @__PURE__ */ r("stop", { offset: "100%", stopColor: "#222" })
199
- ] })
200
- ] })
201
- ]
202
- }
203
- )
204
- }
205
- ), pe = A(({ url: c, fileName: o }, E) => {
206
- const n = Z(), {
207
- audioRef: N,
208
- isPlaying: i,
209
- isLoading: C,
210
- isLoop: g,
211
- currentTime: h,
212
- duration: l,
213
- volume: f,
214
- isMuted: u,
215
- error: x,
216
- togglePlay: b,
217
- seek: k,
218
- skip: v,
219
- setVolume: T,
220
- toggleMute: y,
221
- toggleLoop: V,
222
- formatTime: I
223
- } = re({ url: c }), [L, M] = p(!1), S = G(null), P = G(), j = l > 0 ? h / l : 0;
224
- F(() => {
225
- const m = (R) => {
226
- S.current && !S.current.contains(R.target) && M(!1);
227
- };
228
- return L && document.addEventListener("mousedown", m), () => document.removeEventListener("mousedown", m);
229
- }, [L]);
230
- const e = () => {
231
- clearTimeout(P.current), M(!0);
232
- }, t = () => {
233
- P.current = setTimeout(() => M(!1), 300);
234
- }, s = u || f === 0 ? K : f < 0.5 ? Q : Y;
235
- return _(E, () => ({
236
- getToolbarGroups: () => []
237
- }), []), x ? /* @__PURE__ */ r(ee, { message: x }) : /* @__PURE__ */ a("div", { className: "rfp-flex rfp-flex-col rfp-items-center rfp-justify-center rfp-w-full rfp-h-full rfp-p-6 rfp-gap-6 rfp-select-none", children: [
238
- /* @__PURE__ */ a("div", { className: "rfp-relative", style: { width: "260px", height: "240px" }, children: [
239
- /* @__PURE__ */ r(
240
- d.div,
241
- {
242
- className: "rfp-absolute rfp-rounded-full",
243
- style: {
244
- width: "220px",
245
- height: "220px",
246
- top: "18px",
247
- left: "8px",
248
- background: "radial-gradient(circle, rgba(129,140,248,0.12) 0%, transparent 70%)"
249
- },
250
- animate: i ? { scale: [1, 1.08, 1], opacity: [0.5, 1, 0.5] } : { scale: 1, opacity: 0.2 },
251
- transition: i ? { duration: 3, repeat: 1 / 0, ease: "easeInOut" } : { duration: 0.5 }
252
- }
253
- ),
254
- /* @__PURE__ */ a(
255
- "div",
256
- {
257
- className: "rfp-absolute rfp-rounded-full rfp-overflow-hidden",
258
- style: {
259
- width: "200px",
260
- height: "200px",
261
- top: "28px",
262
- left: "18px",
263
- background: `
264
- radial-gradient(circle at center, transparent 95%, rgba(30,30,30,0.8) 95.5%, #111 97%),
265
- radial-gradient(circle at center, transparent 38%, rgba(50,50,50,0.5) 38.15%, transparent 38.4%),
266
- radial-gradient(circle at center, transparent 45%, rgba(50,50,50,0.3) 45.15%, transparent 45.4%),
267
- radial-gradient(circle at center, transparent 52%, rgba(50,50,50,0.5) 52.15%, transparent 52.4%),
268
- radial-gradient(circle at center, transparent 59%, rgba(50,50,50,0.3) 59.15%, transparent 59.4%),
269
- radial-gradient(circle at center, transparent 66%, rgba(50,50,50,0.5) 66.15%, transparent 66.4%),
270
- radial-gradient(circle at center, transparent 73%, rgba(50,50,50,0.3) 73.15%, transparent 73.4%),
271
- radial-gradient(circle at center, transparent 80%, rgba(50,50,50,0.4) 80.15%, transparent 80.4%),
272
- radial-gradient(circle at center, transparent 87%, rgba(50,50,50,0.3) 87.15%, transparent 87.4%),
273
- conic-gradient(from 0deg, #1c1c1c, #232323, #1a1a1a, #262626, #1c1c1c, #212121, #1a1a1a, #252525, #1c1c1c, #232323, #1a1a1a, #262626, #1c1c1c)
274
- `,
275
- boxShadow: i ? "0 0 36px rgba(129,140,248,0.1), 0 8px 32px rgba(0,0,0,0.4), inset 0 0 20px rgba(0,0,0,0.4)" : "0 8px 32px rgba(0,0,0,0.4), inset 0 0 20px rgba(0,0,0,0.4)",
276
- animation: "rfp-vinyl-spin 8s linear infinite",
277
- animationPlayState: i ? "running" : "paused"
278
- },
279
- children: [
280
- /* @__PURE__ */ a(
281
- "div",
282
- {
283
- className: "rfp-absolute rfp-rounded-full",
284
- style: {
285
- width: "34%",
286
- height: "34%",
287
- top: "33%",
288
- left: "33%",
289
- background: "radial-gradient(circle at 40% 38%, #818cf8, #6366f1, #4f46e5, #4338ca)",
290
- boxShadow: "inset 0 1px 3px rgba(255,255,255,0.25), inset 0 -1px 3px rgba(0,0,0,0.3), 0 0 8px rgba(0,0,0,0.3)"
291
- },
292
- children: [
293
- /* @__PURE__ */ r(
294
- "div",
295
- {
296
- className: "rfp-absolute rfp-inset-0 rfp-rounded-full rfp-opacity-20",
297
- style: {
298
- background: `
299
- radial-gradient(circle at center, transparent 30%, rgba(0,0,0,0.3) 31%, transparent 32%),
300
- radial-gradient(circle at center, transparent 50%, rgba(0,0,0,0.2) 51%, transparent 52%),
301
- radial-gradient(circle at center, transparent 70%, rgba(0,0,0,0.3) 71%, transparent 72%),
302
- radial-gradient(circle at center, transparent 88%, rgba(0,0,0,0.2) 89%, transparent 90%)
303
- `
304
- }
305
- }
306
- ),
307
- /* @__PURE__ */ r(
308
- "div",
309
- {
310
- className: "rfp-absolute rfp-rounded-full",
311
- style: {
312
- width: "14%",
313
- height: "14%",
314
- top: "43%",
315
- left: "43%",
316
- background: "radial-gradient(circle at 40% 40%, #333, #0d0d0d)",
317
- boxShadow: "inset 0 1px 3px rgba(0,0,0,0.9), 0 0 2px rgba(0,0,0,0.5)"
318
- }
319
- }
320
- )
321
- ]
322
- }
323
- ),
324
- C && /* @__PURE__ */ r(
325
- d.div,
326
- {
327
- className: "rfp-absolute rfp-inset-0 rfp-rounded-full",
328
- style: { border: "2px solid rgba(129,140,248,0.3)" },
329
- animate: { scale: [1, 1.02, 1], opacity: [0.3, 0.6, 0.3] },
330
- transition: { duration: 1.5, repeat: 1 / 0 }
331
- }
332
- )
333
- ]
334
- }
335
- ),
336
- /* @__PURE__ */ r(ae, { isPlaying: i })
337
- ] }),
338
- /* @__PURE__ */ a("div", { className: "rfp-text-center rfp-max-w-md rfp-px-4", children: [
339
- /* @__PURE__ */ r(
340
- te,
341
- {
342
- text: o,
343
- className: "rfp-text-lg rfp-font-medium rfp-mb-1 rfp-text-fg-primary"
344
- }
345
- ),
346
- /* @__PURE__ */ r("p", { className: "rfp-text-xs rfp-tracking-widest rfp-uppercase rfp-text-accent", children: "Audio" })
347
- ] }),
348
- /* @__PURE__ */ a(
349
- "div",
350
- {
351
- className: "rfp-w-full rfp-max-w-md rfp-rounded-2xl rfp-p-5 rfp-border rfp-bg-surface-1 rfp-border-line-weak",
352
- style: { backdropFilter: "blur(16px)" },
353
- children: [
354
- /* @__PURE__ */ a("div", { className: "rfp-mb-5", children: [
355
- /* @__PURE__ */ a("div", { className: "rfp-relative rfp-h-4 rfp-flex rfp-items-center", children: [
356
- /* @__PURE__ */ r("div", { className: "rfp-absolute rfp-w-full rfp-h-[5px] rfp-rounded-full rfp-bg-surface-2" }),
357
- /* @__PURE__ */ r(
358
- "div",
359
- {
360
- className: "rfp-absolute rfp-h-[5px] rfp-rounded-full rfp-pointer-events-none",
361
- style: {
362
- width: `${j * 100}%`,
363
- background: "linear-gradient(90deg, var(--fp-accent), var(--fp-accent-hover))",
364
- boxShadow: i ? "0 0 8px rgba(129,140,248,0.4)" : "none",
365
- transition: "width 0.1s linear"
366
- }
367
- }
368
- ),
369
- /* @__PURE__ */ r(
370
- "input",
371
- {
372
- type: "range",
373
- min: "0",
374
- max: l > 0 ? l : h || 100,
375
- step: "any",
376
- value: h,
377
- onChange: (m) => k(parseFloat(m.target.value)),
378
- disabled: l <= 0,
379
- "aria-label": n("audio.aria.progress"),
380
- className: "audio-slider rfp-absolute rfp-w-full"
381
- }
382
- )
383
- ] }),
384
- /* @__PURE__ */ a("div", { className: "rfp-flex rfp-justify-between rfp-text-xs rfp-mt-2.5 rfp-text-fg-tertiary", children: [
385
- /* @__PURE__ */ r("span", { style: { fontVariantNumeric: "tabular-nums" }, children: I(h) }),
386
- /* @__PURE__ */ r("span", { style: { fontVariantNumeric: "tabular-nums" }, children: l > 0 ? I(l) : "--:--" })
387
- ] })
388
- ] }),
389
- /* @__PURE__ */ a("div", { className: "rfp-flex rfp-items-center rfp-justify-center rfp-gap-3", children: [
390
- /* @__PURE__ */ r(
391
- d.button,
392
- {
393
- onClick: V,
394
- whileHover: { scale: 1.1 },
395
- whileTap: { scale: 0.92 },
396
- "aria-label": n(g ? "audio.aria.loop_off" : "audio.aria.loop_on"),
397
- className: `rfp-w-9 rfp-h-9 rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors ${g ? "rfp-bg-accent-soft rfp-text-accent" : "rfp-bg-surface-2 rfp-text-fg-tertiary"}`,
398
- children: /* @__PURE__ */ r(B, { className: "rfp-w-4 rfp-h-4" })
399
- }
400
- ),
401
- /* @__PURE__ */ r(
402
- d.button,
403
- {
404
- onClick: () => v(-10),
405
- whileHover: { scale: 1.1 },
406
- whileTap: { scale: 0.92 },
407
- "aria-label": n("audio.aria.backward_10"),
408
- className: "rfp-w-10 rfp-h-10 rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors rfp-bg-surface-2 rfp-text-fg-secondary",
409
- children: /* @__PURE__ */ r(q, { className: "rfp-w-[18px] rfp-h-[18px]" })
410
- }
411
- ),
412
- /* @__PURE__ */ r(
413
- d.button,
414
- {
415
- onClick: b,
416
- whileHover: { scale: 1.06 },
417
- whileTap: { scale: 0.94 },
418
- "aria-label": n(i ? "audio.aria.pause" : "audio.aria.play"),
419
- className: "rfp-w-14 rfp-h-14 rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center",
420
- style: {
421
- background: "linear-gradient(135deg, var(--fp-accent-hover), var(--fp-accent))",
422
- color: "#fff",
423
- boxShadow: "0 4px 20px rgba(99,102,241,0.35)"
424
- },
425
- children: i ? /* @__PURE__ */ r(U, { className: "rfp-w-6 rfp-h-6" }) : /* @__PURE__ */ r(X, { className: "rfp-w-6 rfp-h-6 rfp-ml-0.5" })
426
- }
427
- ),
428
- /* @__PURE__ */ r(
429
- d.button,
430
- {
431
- onClick: () => v(10),
432
- whileHover: { scale: 1.1 },
433
- whileTap: { scale: 0.92 },
434
- "aria-label": n("audio.aria.forward_10"),
435
- className: "rfp-w-10 rfp-h-10 rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors rfp-bg-surface-2 rfp-text-fg-secondary",
436
- children: /* @__PURE__ */ r(J, { className: "rfp-w-[18px] rfp-h-[18px]" })
437
- }
438
- ),
439
- /* @__PURE__ */ a(
440
- "div",
441
- {
442
- ref: S,
443
- className: "rfp-relative",
444
- onMouseEnter: e,
445
- onMouseLeave: t,
446
- children: [
447
- /* @__PURE__ */ r(
448
- d.button,
449
- {
450
- onClick: y,
451
- whileHover: { scale: 1.1 },
452
- whileTap: { scale: 0.92 },
453
- "aria-label": n(u ? "audio.aria.unmute" : "audio.aria.mute"),
454
- className: `rfp-w-9 rfp-h-9 rfp-rounded-full rfp-flex rfp-items-center rfp-justify-center rfp-transition-colors ${L ? "rfp-bg-accent-soft rfp-text-accent" : "rfp-bg-surface-2 rfp-text-fg-secondary"}`,
455
- children: /* @__PURE__ */ r(s, { className: "rfp-w-4 rfp-h-4" })
456
- }
457
- ),
458
- /* @__PURE__ */ r(z, { children: L && /* @__PURE__ */ r(
459
- d.div,
460
- {
461
- initial: { opacity: 0, scale: 0.95 },
462
- animate: { opacity: 1, scale: 1 },
463
- exit: { opacity: 0, scale: 0.95 },
464
- transition: { duration: 0.12 },
465
- className: "rfp-absolute rfp-bottom-full rfp-mb-2 rfp-rounded-xl rfp-p-3 rfp-border rfp-bg-surface-3 rfp-border-line",
466
- style: {
467
- left: "50%",
468
- marginLeft: "-27px",
469
- backdropFilter: "blur(16px)"
470
- },
471
- onMouseEnter: e,
472
- onMouseLeave: t,
473
- children: /* @__PURE__ */ a("div", { className: "rfp-flex rfp-flex-col rfp-items-center rfp-gap-2", style: { height: "100px" }, children: [
474
- /* @__PURE__ */ a("div", { className: "rfp-relative rfp-flex rfp-items-center rfp-justify-center", style: { width: "24px", height: "80px" }, children: [
475
- /* @__PURE__ */ r(
476
- "div",
477
- {
478
- className: "rfp-absolute rfp-rounded-full rfp-bg-surface-2",
479
- style: { width: "3px", height: "100%" }
480
- }
481
- ),
482
- /* @__PURE__ */ r(
483
- "div",
484
- {
485
- className: "rfp-absolute rfp-bottom-0 rfp-rounded-full rfp-pointer-events-none",
486
- style: {
487
- width: "3px",
488
- height: `${(u ? 0 : f) * 100}%`,
489
- background: "var(--fp-accent-hover)",
490
- transition: "height 0.1s linear"
491
- }
492
- }
493
- ),
494
- /* @__PURE__ */ r(
495
- "input",
496
- {
497
- type: "range",
498
- min: "0",
499
- max: "1",
500
- step: "0.01",
501
- value: u ? 0 : f,
502
- onChange: (m) => T(parseFloat(m.target.value)),
503
- "aria-label": n("audio.aria.volume"),
504
- className: "volume-slider-vertical rfp-absolute",
505
- style: {
506
- width: "80px",
507
- height: "24px",
508
- transform: "rotate(-90deg)",
509
- transformOrigin: "center center"
510
- }
511
- }
512
- )
513
- ] }),
514
- /* @__PURE__ */ r("span", { className: "rfp-text-[10px] rfp-tabular-nums rfp-text-fg-tertiary", children: Math.round((u ? 0 : f) * 100) })
515
- ] })
516
- }
517
- ) })
518
- ]
519
- }
520
- )
521
- ] })
522
- ]
523
- }
524
- ),
525
- /* @__PURE__ */ r("audio", { ref: N, src: c, className: "rfp-hidden" })
526
- ] });
527
- });
528
- export {
529
- pe as AudioRenderer
530
- };
531
- //# sourceMappingURL=index-DoGKcq9y.mjs.map