nfx-ui 0.12.7 → 0.13.0
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/animations.cjs +1 -1
- package/dist/chunk-BounceLoading-C5XE8DKc.mjs.map +1 -1
- package/dist/chunk-BounceLoading-CwvDT5HF.cjs.map +1 -1
- package/dist/chunk-animations-DOdfS0n5.cjs +3 -0
- package/dist/{chunk-animations-CYs6wRF6.cjs.map → chunk-animations-DOdfS0n5.cjs.map} +1 -1
- package/dist/chunk-animations-Do1xZdGL.mjs.map +1 -1
- package/dist/chunk-i18n-BTmbcksb.cjs +3 -0
- package/dist/{chunk-i18n-rD2zjgzE.cjs.map → chunk-i18n-BTmbcksb.cjs.map} +1 -1
- package/dist/chunk-language-B8sfGadQ.mjs.map +1 -1
- package/dist/chunk-language-Bqmpuf2W.cjs.map +1 -1
- package/dist/chunk-layout-C2uqDEMJ.mjs.map +1 -1
- package/dist/chunk-layout-D728gccQ.cjs.map +1 -1
- package/dist/chunk-preference-BWEpbZgC.mjs.map +1 -1
- package/dist/chunk-preference-Dbugm0iQ.cjs.map +1 -1
- package/dist/chunk-theme-9dcwRKw8.mjs.map +1 -1
- package/dist/chunk-theme-BFvDRCYS.cjs.map +1 -1
- package/dist/components.cjs +2 -2
- package/dist/components.cjs.map +1 -1
- package/dist/components.mjs +640 -594
- package/dist/components.mjs.map +1 -1
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.mjs.map +1 -1
- package/dist/languages.cjs +1 -1
- package/dist/layouts.cjs +1 -1
- package/dist/layouts.cjs.map +1 -1
- package/dist/layouts.mjs.map +1 -1
- package/dist/pixel-blast.cjs +1 -1
- package/dist/pixel-blast.cjs.map +1 -1
- package/dist/pixel-blast.mjs.map +1 -1
- package/dist/src/designs/components/Input/index.d.ts +3 -3
- package/dist/src/designs/components/Input/index.d.ts.map +1 -1
- package/dist/src/designs/components/KeyValueEditor/index.d.ts +16 -3
- package/dist/src/designs/components/KeyValueEditor/index.d.ts.map +1 -1
- package/dist/src/designs/components/ShowFilter/index.d.ts +16 -5
- package/dist/src/designs/components/ShowFilter/index.d.ts.map +1 -1
- package/dist/src/designs/components/Slider/index.d.ts +15 -3
- package/dist/src/designs/components/Slider/index.d.ts.map +1 -1
- package/dist/src/designs/components/Suspense/index.d.ts +6 -6
- package/dist/src/designs/components/Suspense/index.d.ts.map +1 -1
- package/dist/src/designs/components/Textarea/index.d.ts +3 -3
- package/dist/src/designs/components/Textarea/index.d.ts.map +1 -1
- package/dist/src/designs/components/VirtualList/index.d.ts +3 -3
- package/dist/src/designs/components/VirtualList/index.d.ts.map +1 -1
- package/dist/src/designs/components/VirtualWindowList/index.d.ts +3 -3
- package/dist/src/designs/components/VirtualWindowList/index.d.ts.map +1 -1
- package/dist/stores.cjs.map +1 -1
- package/dist/stores.mjs.map +1 -1
- package/dist/utils.cjs +1 -1
- package/dist/utils.cjs.map +1 -1
- package/dist/utils.mjs.map +1 -1
- package/package.json +7 -29
- package/dist/chunk-animations-CYs6wRF6.cjs +0 -3
- package/dist/chunk-i18n-rD2zjgzE.cjs +0 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-animations-Do1xZdGL.mjs","names":[],"sources":["../src/designs/animations/Waves/style.module.css","../src/designs/animations/Waves/index.tsx","../src/designs/animations/Squares/style.module.css","../src/designs/animations/Squares/index.tsx","../src/designs/animations/LetterGlitch/style.module.css","../src/designs/animations/LetterGlitch/index.tsx"],"sourcesContent":[".waves {\n position: absolute;\n top: 0;\n left: 0;\n margin: 0;\n padding: 0;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n.waves::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 0.5rem;\n height: 0.5rem;\n background: var(--color-bg);\n border-radius: 50%;\n transform: translate3d(calc(var(--x) - 50%), calc(var(--y) - 50%), 0);\n will-change: transform;\n}\n\n.wavesCanvas {\n display: block;\n width: 100%;\n height: 100%;\n}\n","import React, { useEffect, useMemo, useRef } from \"react\";\nimport type { CSSProperties } from \"react\";\n\nimport { useTheme } from \"@/themes/hooks/useTheme\";\n\nimport styles from \"./style.module.css\";\n\nclass Grad {\n x: number;\n y: number;\n z: number;\n constructor(x: number, y: number, z: number) {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n dot2(x: number, y: number): number {\n return this.x * x + this.y * y;\n }\n}\n\nclass Noise {\n grad3: Grad[];\n p: number[];\n perm: number[];\n gradP: Grad[];\n\n constructor(seed = 0) {\n this.grad3 = [\n new Grad(1, 1, 0),\n new Grad(-1, 1, 0),\n new Grad(1, -1, 0),\n new Grad(-1, -1, 0),\n new Grad(1, 0, 1),\n new Grad(-1, 0, 1),\n new Grad(1, 0, -1),\n new Grad(-1, 0, -1),\n new Grad(0, 1, 1),\n new Grad(0, -1, 1),\n new Grad(0, 1, -1),\n new Grad(0, -1, -1),\n ];\n this.p = [\n 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234,\n 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139,\n 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, 1, 216, 80,\n 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, 202,\n 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221,\n 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, 193, 238, 210,\n 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150,\n 254, 138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180,\n ];\n this.perm = new Array(512);\n this.gradP = new Array(512);\n this.seed(seed);\n }\n seed(seed: number) {\n if (seed > 0 && seed < 1) seed *= 65536;\n seed = Math.floor(seed);\n if (seed < 256) seed |= seed << 8;\n for (let i = 0; i < 256; i++) {\n let v = i & 1 ? this.p[i] ^ (seed & 255) : this.p[i] ^ ((seed >> 8) & 255);\n this.perm[i] = this.perm[i + 256] = v;\n this.gradP[i] = this.gradP[i + 256] = this.grad3[v % 12];\n }\n }\n fade(t: number): number {\n return t * t * t * (t * (t * 6 - 15) + 10);\n }\n lerp(a: number, b: number, t: number): number {\n return (1 - t) * a + t * b;\n }\n perlin2(x: number, y: number): number {\n let X = Math.floor(x),\n Y = Math.floor(y);\n x -= X;\n y -= Y;\n X &= 255;\n Y &= 255;\n const n00 = this.gradP[X + this.perm[Y]].dot2(x, y);\n const n01 = this.gradP[X + this.perm[Y + 1]].dot2(x, y - 1);\n const n10 = this.gradP[X + 1 + this.perm[Y]].dot2(x - 1, y);\n const n11 = this.gradP[X + 1 + this.perm[Y + 1]].dot2(x - 1, y - 1);\n const u = this.fade(x);\n return this.lerp(this.lerp(n00, n10, u), this.lerp(n01, n11, u), this.fade(y));\n }\n}\n\ninterface Point {\n x: number;\n y: number;\n wave: { x: number; y: number };\n cursor: { x: number; y: number; vx: number; vy: number };\n}\n\ninterface Mouse {\n x: number;\n y: number;\n lx: number;\n ly: number;\n sx: number;\n sy: number;\n v: number;\n vs: number;\n a: number;\n set: boolean;\n}\n\ninterface Config {\n lineColor: string;\n waveSpeedX: number;\n waveSpeedY: number;\n waveAmpX: number;\n waveAmpY: number;\n friction: number;\n tension: number;\n maxCursorMove: number;\n xGap: number;\n yGap: number;\n}\n\ninterface WavesProps {\n lineColor?: string;\n backgroundColor?: string;\n waveSpeedX?: number;\n waveSpeedY?: number;\n waveAmpX?: number;\n waveAmpY?: number;\n xGap?: number;\n yGap?: number;\n friction?: number;\n tension?: number;\n maxCursorMove?: number;\n style?: CSSProperties;\n className?: string;\n}\n\nconst Waves: React.FC<WavesProps> = ({\n lineColor = \"black\",\n backgroundColor = \"transparent\",\n waveSpeedX = 0.0125,\n waveSpeedY = 0.005,\n waveAmpX = 32,\n waveAmpY = 16,\n xGap = 10,\n yGap = 32,\n friction = 0.925,\n tension = 0.005,\n maxCursorMove = 100,\n style = {},\n className = \"\",\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const ctxRef = useRef<CanvasRenderingContext2D | null>(null);\n const boundingRef = useRef<{\n width: number;\n height: number;\n left: number;\n top: number;\n }>({\n width: 0,\n height: 0,\n left: 0,\n top: 0,\n });\n const noiseRef = useRef(new Noise(Math.random()));\n const linesRef = useRef<Point[][]>([]);\n const mouseRef = useRef<Mouse>({\n x: -10,\n y: 0,\n lx: 0,\n ly: 0,\n sx: 0,\n sy: 0,\n v: 0,\n vs: 0,\n a: 0,\n set: false,\n });\n const configRef = useRef<Config>({\n lineColor,\n waveSpeedX,\n waveSpeedY,\n waveAmpX,\n waveAmpY,\n friction,\n tension,\n maxCursorMove,\n xGap,\n yGap,\n });\n const frameIdRef = useRef<number | null>(null);\n\n useEffect(() => {\n configRef.current = {\n lineColor,\n waveSpeedX,\n waveSpeedY,\n waveAmpX,\n waveAmpY,\n friction,\n tension,\n maxCursorMove,\n xGap,\n yGap,\n };\n }, [lineColor, waveSpeedX, waveSpeedY, waveAmpX, waveAmpY, friction, tension, maxCursorMove, xGap, yGap]);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n const container = containerRef.current;\n if (!canvas || !container) return;\n ctxRef.current = canvas.getContext(\"2d\");\n\n function setSize() {\n if (!container || !canvas) return;\n const rect = container.getBoundingClientRect();\n boundingRef.current = {\n width: rect.width,\n height: rect.height,\n left: rect.left,\n top: rect.top,\n };\n canvas.width = rect.width;\n canvas.height = rect.height;\n }\n\n function setLines() {\n const { width, height } = boundingRef.current;\n linesRef.current = [];\n const oWidth = width + 200,\n oHeight = height + 30;\n const { xGap, yGap } = configRef.current;\n const totalLines = Math.ceil(oWidth / xGap);\n const totalPoints = Math.ceil(oHeight / yGap);\n const xStart = (width - xGap * totalLines) / 2;\n const yStart = (height - yGap * totalPoints) / 2;\n for (let i = 0; i <= totalLines; i++) {\n const pts: Point[] = [];\n for (let j = 0; j <= totalPoints; j++) {\n pts.push({\n x: xStart + xGap * i,\n y: yStart + yGap * j,\n wave: { x: 0, y: 0 },\n cursor: { x: 0, y: 0, vx: 0, vy: 0 },\n });\n }\n linesRef.current.push(pts);\n }\n }\n\n function movePoints(time: number) {\n const lines = linesRef.current;\n const mouse = mouseRef.current;\n const noise = noiseRef.current;\n const { waveSpeedX, waveSpeedY, waveAmpX, waveAmpY, friction, tension, maxCursorMove } = configRef.current;\n lines.forEach((pts) => {\n pts.forEach((p) => {\n const move = noise.perlin2((p.x + time * waveSpeedX) * 0.002, (p.y + time * waveSpeedY) * 0.0015) * 12;\n p.wave.x = Math.cos(move) * waveAmpX;\n p.wave.y = Math.sin(move) * waveAmpY;\n\n const dx = p.x - mouse.sx,\n dy = p.y - mouse.sy;\n const dist = Math.hypot(dx, dy);\n const l = Math.max(175, mouse.vs);\n if (dist < l) {\n const s = 1 - dist / l;\n const f = Math.cos(dist * 0.001) * s;\n p.cursor.vx += Math.cos(mouse.a) * f * l * mouse.vs * 0.00065;\n p.cursor.vy += Math.sin(mouse.a) * f * l * mouse.vs * 0.00065;\n }\n\n p.cursor.vx += (0 - p.cursor.x) * tension;\n p.cursor.vy += (0 - p.cursor.y) * tension;\n p.cursor.vx *= friction;\n p.cursor.vy *= friction;\n p.cursor.x += p.cursor.vx * 2;\n p.cursor.y += p.cursor.vy * 2;\n p.cursor.x = Math.min(maxCursorMove, Math.max(-maxCursorMove, p.cursor.x));\n p.cursor.y = Math.min(maxCursorMove, Math.max(-maxCursorMove, p.cursor.y));\n });\n });\n }\n\n function moved(point: Point, withCursor = true): { x: number; y: number } {\n const x = point.x + point.wave.x + (withCursor ? point.cursor.x : 0);\n const y = point.y + point.wave.y + (withCursor ? point.cursor.y : 0);\n return { x: Math.round(x * 10) / 10, y: Math.round(y * 10) / 10 };\n }\n\n function drawLines() {\n const { width, height } = boundingRef.current;\n const ctx = ctxRef.current;\n if (!ctx) return;\n ctx.clearRect(0, 0, width, height);\n ctx.beginPath();\n ctx.strokeStyle = configRef.current.lineColor;\n linesRef.current.forEach((points) => {\n let p1 = moved(points[0], false);\n ctx.moveTo(p1.x, p1.y);\n points.forEach((p, idx) => {\n const isLast = idx === points.length - 1;\n p1 = moved(p, !isLast);\n const p2 = moved(points[idx + 1] || points[points.length - 1], !isLast);\n ctx.lineTo(p1.x, p1.y);\n if (isLast) ctx.moveTo(p2.x, p2.y);\n });\n });\n ctx.stroke();\n }\n\n function tick(t: number) {\n if (!container) return;\n const mouse = mouseRef.current;\n mouse.sx += (mouse.x - mouse.sx) * 0.1;\n mouse.sy += (mouse.y - mouse.sy) * 0.1;\n const dx = mouse.x - mouse.lx,\n dy = mouse.y - mouse.ly;\n const d = Math.hypot(dx, dy);\n mouse.v = d;\n mouse.vs += (d - mouse.vs) * 0.1;\n mouse.vs = Math.min(100, mouse.vs);\n mouse.lx = mouse.x;\n mouse.ly = mouse.y;\n mouse.a = Math.atan2(dy, dx);\n container.style.setProperty(\"--x\", `${mouse.sx}px`);\n container.style.setProperty(\"--y\", `${mouse.sy}px`);\n\n movePoints(t);\n drawLines();\n frameIdRef.current = requestAnimationFrame(tick);\n }\n\n function onResize() {\n setSize();\n setLines();\n }\n function onMouseMove(e: MouseEvent) {\n updateMouse(e.clientX, e.clientY);\n }\n function onTouchMove(e: TouchEvent) {\n const touch = e.touches[0];\n updateMouse(touch.clientX, touch.clientY);\n }\n function updateMouse(x: number, y: number) {\n const mouse = mouseRef.current;\n const b = boundingRef.current;\n mouse.x = x - b.left;\n mouse.y = y - b.top;\n if (!mouse.set) {\n mouse.sx = mouse.x;\n mouse.sy = mouse.y;\n mouse.lx = mouse.x;\n mouse.ly = mouse.y;\n mouse.set = true;\n }\n }\n\n setSize();\n setLines();\n frameIdRef.current = requestAnimationFrame(tick);\n window.addEventListener(\"resize\", onResize);\n window.addEventListener(\"mousemove\", onMouseMove);\n window.addEventListener(\"touchmove\", onTouchMove, { passive: false });\n\n return () => {\n window.removeEventListener(\"resize\", onResize);\n window.removeEventListener(\"mousemove\", onMouseMove);\n window.removeEventListener(\"touchmove\", onTouchMove);\n if (frameIdRef.current !== null) {\n cancelAnimationFrame(frameIdRef.current);\n }\n };\n }, []);\n\n return (\n <div\n ref={containerRef}\n className={`${styles.waves} ${className}`}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n margin: 0,\n padding: 0,\n width: \"100%\",\n height: \"100%\",\n overflow: \"hidden\",\n backgroundColor,\n ...style,\n }}\n >\n <canvas ref={canvasRef} className={styles.wavesCanvas} />\n </div>\n );\n};\n\nconst WaveBackground: React.FC<Omit<WavesProps, \"lineColor\" | \"backgroundColor\">> = (props) => {\n const { currentTheme } = useTheme();\n\n // 从主题中获取线条颜色,降低颜色深度(变浅)\n const lineColor = useMemo(() => {\n // 尝试从主题变量中获取主色,如果没有则使用默认值\n const primary = currentTheme.colors.variables.primary || \"rgb(220, 38, 38)\";\n\n // 将颜色变浅的函数:向白色混合\n const lightenColor = (r: number, g: number, b: number, factor: number = 0.4) => {\n // factor: 0 = 原色, 1 = 白色\n const newR = Math.round(r + (255 - r) * factor);\n const newG = Math.round(g + (255 - g) * factor);\n const newB = Math.round(b + (255 - b) * factor);\n return `rgb(${newR}, ${newG}, ${newB})`;\n };\n\n // 如果已经是 hex 格式,转换为 rgb 并变浅\n if (primary.startsWith(\"#\")) {\n const hex = primary.slice(1);\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n return lightenColor(r, g, b);\n }\n // 将 rgb() 格式变浅\n const match = primary.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/);\n if (match) {\n const r = parseInt(match[1], 10);\n const g = parseInt(match[2], 10);\n const b = parseInt(match[3], 10);\n return lightenColor(r, g, b);\n }\n // 如果已经是 rgba 格式,提取 RGB 并变浅\n const rgbaMatch = primary.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (rgbaMatch) {\n const r = parseInt(rgbaMatch[1], 10);\n const g = parseInt(rgbaMatch[2], 10);\n const b = parseInt(rgbaMatch[3], 10);\n return lightenColor(r, g, b);\n }\n return primary;\n }, [currentTheme]);\n\n return <Waves lineColor={lineColor} backgroundColor=\"transparent\" waveSpeedX={0.05} waveSpeedY={0.01} waveAmpX={40} waveAmpY={20} {...props} />;\n};\n\nexport default WaveBackground;\n",".squaresCanvas {\n width: 100%;\n height: 100%;\n border: none;\n display: block;\n}\n","import React, { useEffect, useMemo, useRef } from \"react\";\n\nimport { useTheme } from \"@/themes/hooks/useTheme\";\n\nimport styles from \"./style.module.css\";\n\ntype CanvasStrokeStyle = string | CanvasGradient | CanvasPattern;\n\ninterface GridOffset {\n x: number;\n y: number;\n}\n\ninterface SquaresProps {\n direction?: \"diagonal\" | \"up\" | \"right\" | \"down\" | \"left\";\n speed?: number;\n borderColor?: CanvasStrokeStyle;\n squareSize?: number;\n hoverFillColor?: CanvasStrokeStyle;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst Squares: React.FC<SquaresProps> = ({\n direction = \"right\",\n speed = 1,\n borderColor = \"#6B7280\",\n squareSize = 40,\n hoverFillColor = \"#111827\",\n className = \"\",\n style = {},\n}) => {\n const { currentTheme } = useTheme();\n const vignetteEdgeColor = currentTheme.colors.variables.fgHeading;\n\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const requestRef = useRef<number | null>(null);\n const numSquaresX = useRef<number>(0);\n const numSquaresY = useRef<number>(0);\n const gridOffset = useRef<GridOffset>({ x: 0, y: 0 });\n const hoveredSquareRef = useRef<GridOffset | null>(null);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext(\"2d\");\n\n const resizeCanvas = () => {\n canvas.width = canvas.offsetWidth;\n canvas.height = canvas.offsetHeight;\n numSquaresX.current = Math.ceil(canvas.width / squareSize) + 1;\n numSquaresY.current = Math.ceil(canvas.height / squareSize) + 1;\n };\n\n window.addEventListener(\"resize\", resizeCanvas);\n resizeCanvas();\n\n const drawGrid = () => {\n if (!ctx) return;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n const startX = Math.floor(gridOffset.current.x / squareSize) * squareSize;\n const startY = Math.floor(gridOffset.current.y / squareSize) * squareSize;\n\n for (let x = startX; x < canvas.width + squareSize; x += squareSize) {\n for (let y = startY; y < canvas.height + squareSize; y += squareSize) {\n const squareX = x - (gridOffset.current.x % squareSize);\n const squareY = y - (gridOffset.current.y % squareSize);\n\n if (\n hoveredSquareRef.current &&\n Math.floor((x - startX) / squareSize) === hoveredSquareRef.current.x &&\n Math.floor((y - startY) / squareSize) === hoveredSquareRef.current.y\n ) {\n ctx.fillStyle = hoverFillColor;\n ctx.fillRect(squareX, squareY, squareSize, squareSize);\n }\n\n ctx.strokeStyle = borderColor;\n ctx.strokeRect(squareX, squareY, squareSize, squareSize);\n }\n }\n\n const gradient = ctx.createRadialGradient(\n canvas.width / 2,\n canvas.height / 2,\n 0,\n canvas.width / 2,\n canvas.height / 2,\n Math.sqrt(canvas.width ** 2 + canvas.height ** 2) / 2,\n );\n gradient.addColorStop(0, \"rgba(0, 0, 0, 0)\");\n gradient.addColorStop(1, vignetteEdgeColor);\n\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n };\n\n const updateAnimation = () => {\n const effectiveSpeed = Math.max(speed, 0.1);\n switch (direction) {\n case \"right\":\n gridOffset.current.x = (gridOffset.current.x - effectiveSpeed + squareSize) % squareSize;\n break;\n case \"left\":\n gridOffset.current.x = (gridOffset.current.x + effectiveSpeed + squareSize) % squareSize;\n break;\n case \"up\":\n gridOffset.current.y = (gridOffset.current.y + effectiveSpeed + squareSize) % squareSize;\n break;\n case \"down\":\n gridOffset.current.y = (gridOffset.current.y - effectiveSpeed + squareSize) % squareSize;\n break;\n case \"diagonal\":\n gridOffset.current.x = (gridOffset.current.x - effectiveSpeed + squareSize) % squareSize;\n gridOffset.current.y = (gridOffset.current.y - effectiveSpeed + squareSize) % squareSize;\n break;\n default:\n break;\n }\n\n drawGrid();\n requestRef.current = requestAnimationFrame(updateAnimation);\n };\n\n const handleMouseMove = (event: MouseEvent) => {\n const rect = canvas.getBoundingClientRect();\n const mouseX = event.clientX - rect.left;\n const mouseY = event.clientY - rect.top;\n\n const startX = Math.floor(gridOffset.current.x / squareSize) * squareSize;\n const startY = Math.floor(gridOffset.current.y / squareSize) * squareSize;\n\n const hoveredSquareX = Math.floor((mouseX + gridOffset.current.x - startX) / squareSize);\n const hoveredSquareY = Math.floor((mouseY + gridOffset.current.y - startY) / squareSize);\n\n if (!hoveredSquareRef.current || hoveredSquareRef.current.x !== hoveredSquareX || hoveredSquareRef.current.y !== hoveredSquareY) {\n hoveredSquareRef.current = { x: hoveredSquareX, y: hoveredSquareY };\n }\n };\n\n const handleMouseLeave = () => {\n hoveredSquareRef.current = null;\n };\n\n canvas.addEventListener(\"mousemove\", handleMouseMove);\n canvas.addEventListener(\"mouseleave\", handleMouseLeave);\n requestRef.current = requestAnimationFrame(updateAnimation);\n\n return () => {\n window.removeEventListener(\"resize\", resizeCanvas);\n if (requestRef.current) cancelAnimationFrame(requestRef.current);\n canvas.removeEventListener(\"mousemove\", handleMouseMove);\n canvas.removeEventListener(\"mouseleave\", handleMouseLeave);\n };\n }, [direction, speed, borderColor, hoverFillColor, squareSize, vignetteEdgeColor]);\n\n return <canvas ref={canvasRef} className={`${styles.squaresCanvas} ${className}`} style={style} />;\n};\n\nconst SquareBackground: React.FC<Omit<SquaresProps, \"borderColor\" | \"hoverFillColor\">> = (props) => {\n const { currentTheme } = useTheme();\n\n // 从主题中获取边框颜色\n const borderColor = useMemo(() => {\n const borderColorValue = currentTheme.colors.variables.border5 || currentTheme.colors.variables.fg || \"#6B7280\";\n if (borderColorValue.startsWith(\"#\")) {\n return borderColorValue;\n }\n const match = borderColorValue.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/);\n if (match) {\n const r = parseInt(match[1], 10).toString(16).padStart(2, \"0\");\n const g = parseInt(match[2], 10).toString(16).padStart(2, \"0\");\n const b = parseInt(match[3], 10).toString(16).padStart(2, \"0\");\n return `#${r}${g}${b}`;\n }\n return borderColorValue;\n }, [currentTheme]);\n\n // 从主题中获取悬停填充颜色\n const hoverFillColor = useMemo(() => {\n const baseColor = currentTheme.colors.variables.bg3 || currentTheme.colors.variables.border3 || \"#F3F4F6\";\n\n const darkenColor = (r: number, g: number, b: number, factor: number = 0.3) => {\n const newR = Math.round(r * (1 - factor));\n const newG = Math.round(g * (1 - factor));\n const newB = Math.round(b * (1 - factor));\n return `rgb(${newR}, ${newG}, ${newB})`;\n };\n\n if (baseColor.startsWith(\"#\")) {\n const hex = baseColor.slice(1);\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n return darkenColor(r, g, b);\n }\n const match = baseColor.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/);\n if (match) {\n const r = parseInt(match[1], 10);\n const g = parseInt(match[2], 10);\n const b = parseInt(match[3], 10);\n return darkenColor(r, g, b);\n }\n return baseColor;\n }, [currentTheme]);\n\n return <Squares borderColor={borderColor} hoverFillColor={hoverFillColor} speed={0.5} squareSize={40} direction=\"diagonal\" {...props} />;\n};\n\nexport default SquareBackground;\n",".container {\n position: relative;\n width: 100%;\n height: 100%;\n background-color: var(--color-bg);\n overflow: hidden;\n}\n\n.canvas {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.outerVignette {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n background: radial-gradient(circle, rgba(0, 0, 0, 0) 60%, rgba(0, 0, 0, 1) 100%);\n}\n\n.centerVignette {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n background: radial-gradient(circle, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0) 60%);\n}\n","import { memo, useCallback, useEffect, useMemo, useRef } from \"react\";\n\nimport { useTheme } from \"@/themes/hooks/useTheme\";\n\nimport styles from \"./style.module.css\";\n\ninterface LetterGlitchProps {\n glitchColors?: string[];\n glitchSpeed?: number;\n centerVignette?: boolean;\n outerVignette?: boolean;\n smooth?: boolean;\n characters?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst LetterGlitch = memo(\n ({\n glitchColors = [\"#7F1D1D\", \"#16A34A\", \"#2563EB\"],\n glitchSpeed = 500, // 增加默认速度,减少更新频率\n centerVignette = false,\n outerVignette = true,\n smooth = true,\n characters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$&*()-_+=/[]{};:<>.,0123456789\",\n className = \"\",\n style = {},\n }: LetterGlitchProps) => {\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const animationRef = useRef<number | null>(null);\n const letters = useRef<\n {\n char: string;\n color: string;\n targetColor: string;\n colorProgress: number;\n }[]\n >([]);\n const grid = useRef({ columns: 0, rows: 0 });\n const context = useRef<CanvasRenderingContext2D | null>(null);\n const lastGlitchTime = useRef(Date.now());\n\n const lettersAndSymbols = useMemo(() => Array.from(characters), [characters]);\n\n // 缓存 hexToRgb 结果\n const rgbCache = useRef<Map<string, { r: number; g: number; b: number } | null>>(new Map());\n\n const fontSize = 16;\n const charWidth = 10;\n const charHeight = 20;\n\n const getRandomChar = useCallback(() => {\n return lettersAndSymbols[Math.floor(Math.random() * lettersAndSymbols.length)];\n }, [lettersAndSymbols]);\n\n const getRandomColor = useCallback(() => {\n return glitchColors[Math.floor(Math.random() * glitchColors.length)];\n }, [glitchColors]);\n\n const hexToRgb = useCallback((hex: string) => {\n // 检查缓存\n if (rgbCache.current.has(hex)) {\n return rgbCache.current.get(hex)!;\n }\n\n const shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n const normalizedHex = hex.replace(shorthandRegex, (_m, r, g, b) => {\n return r + r + g + g + b + b;\n });\n\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(normalizedHex);\n const rgb = result\n ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n }\n : null;\n\n // 缓存结果\n rgbCache.current.set(hex, rgb);\n return rgb;\n }, []);\n\n const interpolateColor = (start: { r: number; g: number; b: number }, end: { r: number; g: number; b: number }, factor: number) => {\n const result = {\n r: Math.round(start.r + (end.r - start.r) * factor),\n g: Math.round(start.g + (end.g - start.g) * factor),\n b: Math.round(start.b + (end.b - start.b) * factor),\n };\n return `rgb(${result.r}, ${result.g}, ${result.b})`;\n };\n\n const calculateGrid = (width: number, height: number) => {\n const columns = Math.ceil(width / charWidth);\n const rows = Math.ceil(height / charHeight);\n return { columns, rows };\n };\n\n const initializeLetters = (columns: number, rows: number) => {\n grid.current = { columns, rows };\n const totalLetters = columns * rows;\n letters.current = Array.from({ length: totalLetters }, () => ({\n char: getRandomChar(),\n color: getRandomColor(),\n targetColor: getRandomColor(),\n colorProgress: 1,\n }));\n };\n\n const resizeCanvas = () => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const parent = canvas.parentElement;\n if (!parent) return;\n\n const dpr = window.devicePixelRatio || 1;\n const rect = parent.getBoundingClientRect();\n\n canvas.width = rect.width * dpr;\n canvas.height = rect.height * dpr;\n\n canvas.style.width = `${rect.width}px`;\n canvas.style.height = `${rect.height}px`;\n\n if (context.current) {\n context.current.setTransform(dpr, 0, 0, dpr, 0, 0);\n }\n\n const { columns, rows } = calculateGrid(rect.width, rect.height);\n initializeLetters(columns, rows);\n drawLetters();\n };\n\n const drawLetters = useCallback(() => {\n if (!context.current || letters.current.length === 0) return;\n const ctx = context.current;\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = \"top\";\n ctx.textAlign = \"left\";\n\n // 批量绘制,减少状态切换\n letters.current.forEach((letter, index) => {\n const x = (index % grid.current.columns) * charWidth;\n const y = Math.floor(index / grid.current.columns) * charHeight;\n ctx.fillStyle = letter.color;\n ctx.fillText(letter.char, x, y);\n });\n }, []);\n\n const updateLetters = useCallback(() => {\n if (!letters.current || letters.current.length === 0) return;\n\n // 减少更新比例,从 5% 降到 2%,降低性能消耗\n const updateCount = Math.max(1, Math.floor(letters.current.length * 0.02));\n\n for (let i = 0; i < updateCount; i++) {\n const index = Math.floor(Math.random() * letters.current.length);\n if (!letters.current[index]) continue;\n\n letters.current[index].char = getRandomChar();\n letters.current[index].targetColor = getRandomColor();\n\n if (!smooth) {\n letters.current[index].color = letters.current[index].targetColor;\n letters.current[index].colorProgress = 1;\n } else {\n letters.current[index].colorProgress = 0;\n }\n }\n }, [getRandomChar, getRandomColor, smooth]);\n\n const handleSmoothTransitions = useCallback(() => {\n let needsRedraw = false;\n let activeCount = 0;\n\n // 只处理正在过渡的字母,减少不必要的计算\n letters.current.forEach((letter) => {\n if (letter.colorProgress < 1) {\n activeCount++;\n letter.colorProgress += 0.03; // 稍微降低过渡速度,减少重绘频率\n if (letter.colorProgress > 1) letter.colorProgress = 1;\n\n const startRgb = hexToRgb(letter.color);\n const endRgb = hexToRgb(letter.targetColor);\n if (startRgb && endRgb) {\n letter.color = interpolateColor(startRgb, endRgb, letter.colorProgress);\n needsRedraw = true;\n }\n }\n });\n\n // 只有在有活动过渡时才重绘\n if (needsRedraw && activeCount > 0) {\n drawLetters();\n }\n }, [hexToRgb, drawLetters]);\n\n const animate = useCallback(() => {\n const now = Date.now();\n const timeSinceLastGlitch = now - lastGlitchTime.current;\n\n // 只在需要更新时才执行\n if (timeSinceLastGlitch >= glitchSpeed) {\n updateLetters();\n drawLetters();\n lastGlitchTime.current = now;\n } else if (smooth) {\n // 只在平滑模式下才检查过渡\n handleSmoothTransitions();\n }\n\n animationRef.current = requestAnimationFrame(animate);\n }, [glitchSpeed, smooth, updateLetters, handleSmoothTransitions]);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n context.current = canvas.getContext(\"2d\");\n resizeCanvas();\n animate();\n\n let resizeTimeout: ReturnType<typeof setTimeout>;\n\n const handleResize = () => {\n clearTimeout(resizeTimeout);\n resizeTimeout = setTimeout(() => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current);\n }\n resizeCanvas();\n animate();\n }, 100);\n };\n\n window.addEventListener(\"resize\", handleResize);\n\n return () => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current);\n }\n window.removeEventListener(\"resize\", handleResize);\n clearTimeout(resizeTimeout);\n // 清理缓存\n rgbCache.current.clear();\n };\n }, [glitchSpeed, smooth, glitchColors, animate]);\n\n return (\n <div className={`${styles.container} ${className}`} style={style}>\n <canvas ref={canvasRef} className={styles.canvas} />\n {outerVignette && <div className={styles.outerVignette}></div>}\n {centerVignette && <div className={styles.centerVignette}></div>}\n </div>\n );\n },\n);\n\nconst LetterGlitchBackground: React.FC<Omit<LetterGlitchProps, \"glitchColors\">> = memo((props) => {\n const { currentTheme } = useTheme();\n\n // 从主题中获取故障颜色数组\n const glitchColors = useMemo(() => {\n const primary = currentTheme.colors.variables.primary || \"#DC2626\";\n const info = currentTheme.colors.variables.info || \"#2563EB\";\n const success = currentTheme.colors.variables.success || \"#16A34A\";\n\n const toHex = (color: string): string => {\n if (color.startsWith(\"#\")) {\n return color;\n }\n const match = color.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/);\n if (match) {\n const r = parseInt(match[1], 10).toString(16).padStart(2, \"0\");\n const g = parseInt(match[2], 10).toString(16).padStart(2, \"0\");\n const b = parseInt(match[3], 10).toString(16).padStart(2, \"0\");\n return `#${r}${g}${b}`;\n }\n return color;\n };\n\n return [toHex(primary), toHex(info), toHex(success)];\n }, [currentTheme]);\n\n return (\n <LetterGlitch\n glitchColors={glitchColors}\n glitchSpeed={300} // 增加默认速度,减少更新频率\n centerVignette={true}\n outerVignette={false}\n smooth={true}\n {...props}\n />\n );\n});\n\nLetterGlitchBackground.displayName = \"LetterGlitchBackground\";\n\nexport default LetterGlitchBackground;\n"],"mappings":";;;;;;GCOM,IAAN,MAAW;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,GAAW,GAAW,GAAW;AAC3C,SAAK,IAAI,GACT,KAAK,IAAI,GACT,KAAK,IAAI;AAAA;EAEX,KAAK,GAAW,GAAmB;AACjC,WAAO,KAAK,IAAI,IAAI,KAAK,IAAI;AAAA;GAI3B,KAAN,MAAY;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,IAAO,GAAG;AACpB,SAAK,QAAQ;AAAA,MACX,IAAI,EAAK,GAAG,GAAG,CAAA;AAAA,MACf,IAAI,EAAK,IAAI,GAAG,CAAA;AAAA,MAChB,IAAI,EAAK,GAAG,IAAI,CAAA;AAAA,MAChB,IAAI,EAAK,IAAI,IAAI,CAAA;AAAA,MACjB,IAAI,EAAK,GAAG,GAAG,CAAA;AAAA,MACf,IAAI,EAAK,IAAI,GAAG,CAAA;AAAA,MAChB,IAAI,EAAK,GAAG,GAAG,EAAA;AAAA,MACf,IAAI,EAAK,IAAI,GAAG,EAAA;AAAA,MAChB,IAAI,EAAK,GAAG,GAAG,CAAA;AAAA,MACf,IAAI,EAAK,GAAG,IAAI,CAAA;AAAA,MAChB,IAAI,EAAK,GAAG,GAAG,EAAA;AAAA,MACf,IAAI,EAAK,GAAG,IAAI,EAAA;AAAA,OAElB,KAAK,IAAI;AAAA,MACP;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAG;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAG;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAG;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MACrJ;AAAA,MAAI;AAAA,MAAG;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MACnJ;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAG;AAAA,MAAK;AAAA,MACrJ;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAG;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAG;AAAA,MACrJ;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAG;AAAA,MAA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"}
|
|
1
|
+
{"version":3,"file":"chunk-animations-Do1xZdGL.mjs","names":[],"sources":["../src/designs/animations/Waves/style.module.css","../src/designs/animations/Waves/index.tsx","../src/designs/animations/Squares/style.module.css","../src/designs/animations/Squares/index.tsx","../src/designs/animations/LetterGlitch/style.module.css","../src/designs/animations/LetterGlitch/index.tsx"],"sourcesContent":[".waves {\n position: absolute;\n top: 0;\n left: 0;\n margin: 0;\n padding: 0;\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\n.waves::before {\n content: '';\n position: absolute;\n top: 0;\n left: 0;\n width: 0.5rem;\n height: 0.5rem;\n background: var(--color-bg);\n border-radius: 50%;\n transform: translate3d(calc(var(--x) - 50%), calc(var(--y) - 50%), 0);\n will-change: transform;\n}\n\n.wavesCanvas {\n display: block;\n width: 100%;\n height: 100%;\n}\n","import React, { useEffect, useMemo, useRef } from \"react\";\nimport type { CSSProperties } from \"react\";\n\nimport { useTheme } from \"@/themes/hooks/useTheme\";\n\nimport styles from \"./style.module.css\";\n\nclass Grad {\n x: number;\n y: number;\n z: number;\n constructor(x: number, y: number, z: number) {\n this.x = x;\n this.y = y;\n this.z = z;\n }\n dot2(x: number, y: number): number {\n return this.x * x + this.y * y;\n }\n}\n\nclass Noise {\n grad3: Grad[];\n p: number[];\n perm: number[];\n gradP: Grad[];\n\n constructor(seed = 0) {\n this.grad3 = [\n new Grad(1, 1, 0),\n new Grad(-1, 1, 0),\n new Grad(1, -1, 0),\n new Grad(-1, -1, 0),\n new Grad(1, 0, 1),\n new Grad(-1, 0, 1),\n new Grad(1, 0, -1),\n new Grad(-1, 0, -1),\n new Grad(0, 1, 1),\n new Grad(0, -1, 1),\n new Grad(0, 1, -1),\n new Grad(0, -1, -1),\n ];\n this.p = [\n 151, 160, 137, 91, 90, 15, 131, 13, 201, 95, 96, 53, 194, 233, 7, 225, 140, 36, 103, 30, 69, 142, 8, 99, 37, 240, 21, 10, 23, 190, 6, 148, 247, 120, 234,\n 75, 0, 26, 197, 62, 94, 252, 219, 203, 117, 35, 11, 32, 57, 177, 33, 88, 237, 149, 56, 87, 174, 20, 125, 136, 171, 168, 68, 175, 74, 165, 71, 134, 139,\n 48, 27, 166, 77, 146, 158, 231, 83, 111, 229, 122, 60, 211, 133, 230, 220, 105, 92, 41, 55, 46, 245, 40, 244, 102, 143, 54, 65, 25, 63, 161, 1, 216, 80,\n 73, 209, 76, 132, 187, 208, 89, 18, 169, 200, 196, 135, 130, 116, 188, 159, 86, 164, 100, 109, 198, 173, 186, 3, 64, 52, 217, 226, 250, 124, 123, 5, 202,\n 38, 147, 118, 126, 255, 82, 85, 212, 207, 206, 59, 227, 47, 16, 58, 17, 182, 189, 28, 42, 223, 183, 170, 213, 119, 248, 152, 2, 44, 154, 163, 70, 221,\n 153, 101, 155, 167, 43, 172, 9, 129, 22, 39, 253, 19, 98, 108, 110, 79, 113, 224, 232, 178, 185, 112, 104, 218, 246, 97, 228, 251, 34, 242, 193, 238, 210,\n 144, 12, 191, 179, 162, 241, 81, 51, 145, 235, 249, 14, 239, 107, 49, 192, 214, 31, 181, 199, 106, 157, 184, 84, 204, 176, 115, 121, 50, 45, 127, 4, 150,\n 254, 138, 236, 205, 93, 222, 114, 67, 29, 24, 72, 243, 141, 128, 195, 78, 66, 215, 61, 156, 180,\n ];\n this.perm = new Array(512);\n this.gradP = new Array(512);\n this.seed(seed);\n }\n seed(seed: number) {\n if (seed > 0 && seed < 1) seed *= 65536;\n seed = Math.floor(seed);\n if (seed < 256) seed |= seed << 8;\n for (let i = 0; i < 256; i++) {\n let v = i & 1 ? this.p[i] ^ (seed & 255) : this.p[i] ^ ((seed >> 8) & 255);\n this.perm[i] = this.perm[i + 256] = v;\n this.gradP[i] = this.gradP[i + 256] = this.grad3[v % 12];\n }\n }\n fade(t: number): number {\n return t * t * t * (t * (t * 6 - 15) + 10);\n }\n lerp(a: number, b: number, t: number): number {\n return (1 - t) * a + t * b;\n }\n perlin2(x: number, y: number): number {\n let X = Math.floor(x),\n Y = Math.floor(y);\n x -= X;\n y -= Y;\n X &= 255;\n Y &= 255;\n const n00 = this.gradP[X + this.perm[Y]].dot2(x, y);\n const n01 = this.gradP[X + this.perm[Y + 1]].dot2(x, y - 1);\n const n10 = this.gradP[X + 1 + this.perm[Y]].dot2(x - 1, y);\n const n11 = this.gradP[X + 1 + this.perm[Y + 1]].dot2(x - 1, y - 1);\n const u = this.fade(x);\n return this.lerp(this.lerp(n00, n10, u), this.lerp(n01, n11, u), this.fade(y));\n }\n}\n\ninterface Point {\n x: number;\n y: number;\n wave: { x: number; y: number };\n cursor: { x: number; y: number; vx: number; vy: number };\n}\n\ninterface Mouse {\n x: number;\n y: number;\n lx: number;\n ly: number;\n sx: number;\n sy: number;\n v: number;\n vs: number;\n a: number;\n set: boolean;\n}\n\ninterface Config {\n lineColor: string;\n waveSpeedX: number;\n waveSpeedY: number;\n waveAmpX: number;\n waveAmpY: number;\n friction: number;\n tension: number;\n maxCursorMove: number;\n xGap: number;\n yGap: number;\n}\n\ninterface WavesProps {\n lineColor?: string;\n backgroundColor?: string;\n waveSpeedX?: number;\n waveSpeedY?: number;\n waveAmpX?: number;\n waveAmpY?: number;\n xGap?: number;\n yGap?: number;\n friction?: number;\n tension?: number;\n maxCursorMove?: number;\n style?: CSSProperties;\n className?: string;\n}\n\nconst Waves: React.FC<WavesProps> = ({\n lineColor = \"black\",\n backgroundColor = \"transparent\",\n waveSpeedX = 0.0125,\n waveSpeedY = 0.005,\n waveAmpX = 32,\n waveAmpY = 16,\n xGap = 10,\n yGap = 32,\n friction = 0.925,\n tension = 0.005,\n maxCursorMove = 100,\n style = {},\n className = \"\",\n}) => {\n const containerRef = useRef<HTMLDivElement>(null);\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const ctxRef = useRef<CanvasRenderingContext2D | null>(null);\n const boundingRef = useRef<{\n width: number;\n height: number;\n left: number;\n top: number;\n }>({\n width: 0,\n height: 0,\n left: 0,\n top: 0,\n });\n const noiseRef = useRef(new Noise(Math.random()));\n const linesRef = useRef<Point[][]>([]);\n const mouseRef = useRef<Mouse>({\n x: -10,\n y: 0,\n lx: 0,\n ly: 0,\n sx: 0,\n sy: 0,\n v: 0,\n vs: 0,\n a: 0,\n set: false,\n });\n const configRef = useRef<Config>({\n lineColor,\n waveSpeedX,\n waveSpeedY,\n waveAmpX,\n waveAmpY,\n friction,\n tension,\n maxCursorMove,\n xGap,\n yGap,\n });\n const frameIdRef = useRef<number | null>(null);\n\n useEffect(() => {\n configRef.current = {\n lineColor,\n waveSpeedX,\n waveSpeedY,\n waveAmpX,\n waveAmpY,\n friction,\n tension,\n maxCursorMove,\n xGap,\n yGap,\n };\n }, [lineColor, waveSpeedX, waveSpeedY, waveAmpX, waveAmpY, friction, tension, maxCursorMove, xGap, yGap]);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n const container = containerRef.current;\n if (!canvas || !container) return;\n ctxRef.current = canvas.getContext(\"2d\");\n\n function setSize() {\n if (!container || !canvas) return;\n const rect = container.getBoundingClientRect();\n boundingRef.current = {\n width: rect.width,\n height: rect.height,\n left: rect.left,\n top: rect.top,\n };\n canvas.width = rect.width;\n canvas.height = rect.height;\n }\n\n function setLines() {\n const { width, height } = boundingRef.current;\n linesRef.current = [];\n const oWidth = width + 200,\n oHeight = height + 30;\n const { xGap, yGap } = configRef.current;\n const totalLines = Math.ceil(oWidth / xGap);\n const totalPoints = Math.ceil(oHeight / yGap);\n const xStart = (width - xGap * totalLines) / 2;\n const yStart = (height - yGap * totalPoints) / 2;\n for (let i = 0; i <= totalLines; i++) {\n const pts: Point[] = [];\n for (let j = 0; j <= totalPoints; j++) {\n pts.push({\n x: xStart + xGap * i,\n y: yStart + yGap * j,\n wave: { x: 0, y: 0 },\n cursor: { x: 0, y: 0, vx: 0, vy: 0 },\n });\n }\n linesRef.current.push(pts);\n }\n }\n\n function movePoints(time: number) {\n const lines = linesRef.current;\n const mouse = mouseRef.current;\n const noise = noiseRef.current;\n const { waveSpeedX, waveSpeedY, waveAmpX, waveAmpY, friction, tension, maxCursorMove } = configRef.current;\n lines.forEach((pts) => {\n pts.forEach((p) => {\n const move = noise.perlin2((p.x + time * waveSpeedX) * 0.002, (p.y + time * waveSpeedY) * 0.0015) * 12;\n p.wave.x = Math.cos(move) * waveAmpX;\n p.wave.y = Math.sin(move) * waveAmpY;\n\n const dx = p.x - mouse.sx,\n dy = p.y - mouse.sy;\n const dist = Math.hypot(dx, dy);\n const l = Math.max(175, mouse.vs);\n if (dist < l) {\n const s = 1 - dist / l;\n const f = Math.cos(dist * 0.001) * s;\n p.cursor.vx += Math.cos(mouse.a) * f * l * mouse.vs * 0.00065;\n p.cursor.vy += Math.sin(mouse.a) * f * l * mouse.vs * 0.00065;\n }\n\n p.cursor.vx += (0 - p.cursor.x) * tension;\n p.cursor.vy += (0 - p.cursor.y) * tension;\n p.cursor.vx *= friction;\n p.cursor.vy *= friction;\n p.cursor.x += p.cursor.vx * 2;\n p.cursor.y += p.cursor.vy * 2;\n p.cursor.x = Math.min(maxCursorMove, Math.max(-maxCursorMove, p.cursor.x));\n p.cursor.y = Math.min(maxCursorMove, Math.max(-maxCursorMove, p.cursor.y));\n });\n });\n }\n\n function moved(point: Point, withCursor = true): { x: number; y: number } {\n const x = point.x + point.wave.x + (withCursor ? point.cursor.x : 0);\n const y = point.y + point.wave.y + (withCursor ? point.cursor.y : 0);\n return { x: Math.round(x * 10) / 10, y: Math.round(y * 10) / 10 };\n }\n\n function drawLines() {\n const { width, height } = boundingRef.current;\n const ctx = ctxRef.current;\n if (!ctx) return;\n ctx.clearRect(0, 0, width, height);\n ctx.beginPath();\n ctx.strokeStyle = configRef.current.lineColor;\n linesRef.current.forEach((points) => {\n let p1 = moved(points[0], false);\n ctx.moveTo(p1.x, p1.y);\n points.forEach((p, idx) => {\n const isLast = idx === points.length - 1;\n p1 = moved(p, !isLast);\n const p2 = moved(points[idx + 1] || points[points.length - 1], !isLast);\n ctx.lineTo(p1.x, p1.y);\n if (isLast) ctx.moveTo(p2.x, p2.y);\n });\n });\n ctx.stroke();\n }\n\n function tick(t: number) {\n if (!container) return;\n const mouse = mouseRef.current;\n mouse.sx += (mouse.x - mouse.sx) * 0.1;\n mouse.sy += (mouse.y - mouse.sy) * 0.1;\n const dx = mouse.x - mouse.lx,\n dy = mouse.y - mouse.ly;\n const d = Math.hypot(dx, dy);\n mouse.v = d;\n mouse.vs += (d - mouse.vs) * 0.1;\n mouse.vs = Math.min(100, mouse.vs);\n mouse.lx = mouse.x;\n mouse.ly = mouse.y;\n mouse.a = Math.atan2(dy, dx);\n container.style.setProperty(\"--x\", `${mouse.sx}px`);\n container.style.setProperty(\"--y\", `${mouse.sy}px`);\n\n movePoints(t);\n drawLines();\n frameIdRef.current = requestAnimationFrame(tick);\n }\n\n function onResize() {\n setSize();\n setLines();\n }\n function onMouseMove(e: MouseEvent) {\n updateMouse(e.clientX, e.clientY);\n }\n function onTouchMove(e: TouchEvent) {\n const touch = e.touches[0];\n updateMouse(touch.clientX, touch.clientY);\n }\n function updateMouse(x: number, y: number) {\n const mouse = mouseRef.current;\n const b = boundingRef.current;\n mouse.x = x - b.left;\n mouse.y = y - b.top;\n if (!mouse.set) {\n mouse.sx = mouse.x;\n mouse.sy = mouse.y;\n mouse.lx = mouse.x;\n mouse.ly = mouse.y;\n mouse.set = true;\n }\n }\n\n setSize();\n setLines();\n frameIdRef.current = requestAnimationFrame(tick);\n window.addEventListener(\"resize\", onResize);\n window.addEventListener(\"mousemove\", onMouseMove);\n window.addEventListener(\"touchmove\", onTouchMove, { passive: false });\n\n return () => {\n window.removeEventListener(\"resize\", onResize);\n window.removeEventListener(\"mousemove\", onMouseMove);\n window.removeEventListener(\"touchmove\", onTouchMove);\n if (frameIdRef.current !== null) {\n cancelAnimationFrame(frameIdRef.current);\n }\n };\n }, []);\n\n return (\n <div\n ref={containerRef}\n className={`${styles.waves} ${className}`}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n margin: 0,\n padding: 0,\n width: \"100%\",\n height: \"100%\",\n overflow: \"hidden\",\n backgroundColor,\n ...style,\n }}\n >\n <canvas ref={canvasRef} className={styles.wavesCanvas} />\n </div>\n );\n};\n\nconst WaveBackground: React.FC<Omit<WavesProps, \"lineColor\" | \"backgroundColor\">> = (props) => {\n const { currentTheme } = useTheme();\n\n // 从主题中获取线条颜色,降低颜色深度(变浅)\n const lineColor = useMemo(() => {\n // 尝试从主题变量中获取主色,如果没有则使用默认值\n const primary = currentTheme.colors.variables.primary || \"rgb(220, 38, 38)\";\n\n // 将颜色变浅的函数:向白色混合\n const lightenColor = (r: number, g: number, b: number, factor: number = 0.4) => {\n // factor: 0 = 原色, 1 = 白色\n const newR = Math.round(r + (255 - r) * factor);\n const newG = Math.round(g + (255 - g) * factor);\n const newB = Math.round(b + (255 - b) * factor);\n return `rgb(${newR}, ${newG}, ${newB})`;\n };\n\n // 如果已经是 hex 格式,转换为 rgb 并变浅\n if (primary.startsWith(\"#\")) {\n const hex = primary.slice(1);\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n return lightenColor(r, g, b);\n }\n // 将 rgb() 格式变浅\n const match = primary.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/);\n if (match) {\n const r = parseInt(match[1], 10);\n const g = parseInt(match[2], 10);\n const b = parseInt(match[3], 10);\n return lightenColor(r, g, b);\n }\n // 如果已经是 rgba 格式,提取 RGB 并变浅\n const rgbaMatch = primary.match(/rgba?\\((\\d+),\\s*(\\d+),\\s*(\\d+)/);\n if (rgbaMatch) {\n const r = parseInt(rgbaMatch[1], 10);\n const g = parseInt(rgbaMatch[2], 10);\n const b = parseInt(rgbaMatch[3], 10);\n return lightenColor(r, g, b);\n }\n return primary;\n }, [currentTheme]);\n\n return <Waves lineColor={lineColor} backgroundColor=\"transparent\" waveSpeedX={0.05} waveSpeedY={0.01} waveAmpX={40} waveAmpY={20} {...props} />;\n};\n\nexport default WaveBackground;\n",".squaresCanvas {\n width: 100%;\n height: 100%;\n border: none;\n display: block;\n}\n","import React, { useEffect, useMemo, useRef } from \"react\";\n\nimport { useTheme } from \"@/themes/hooks/useTheme\";\n\nimport styles from \"./style.module.css\";\n\ntype CanvasStrokeStyle = string | CanvasGradient | CanvasPattern;\n\ninterface GridOffset {\n x: number;\n y: number;\n}\n\ninterface SquaresProps {\n direction?: \"diagonal\" | \"up\" | \"right\" | \"down\" | \"left\";\n speed?: number;\n borderColor?: CanvasStrokeStyle;\n squareSize?: number;\n hoverFillColor?: CanvasStrokeStyle;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst Squares: React.FC<SquaresProps> = ({\n direction = \"right\",\n speed = 1,\n borderColor = \"#6B7280\",\n squareSize = 40,\n hoverFillColor = \"#111827\",\n className = \"\",\n style = {},\n}) => {\n const { currentTheme } = useTheme();\n const vignetteEdgeColor = currentTheme.colors.variables.fgHeading;\n\n const canvasRef = useRef<HTMLCanvasElement>(null);\n const requestRef = useRef<number | null>(null);\n const numSquaresX = useRef<number>(0);\n const numSquaresY = useRef<number>(0);\n const gridOffset = useRef<GridOffset>({ x: 0, y: 0 });\n const hoveredSquareRef = useRef<GridOffset | null>(null);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ctx = canvas.getContext(\"2d\");\n\n const resizeCanvas = () => {\n canvas.width = canvas.offsetWidth;\n canvas.height = canvas.offsetHeight;\n numSquaresX.current = Math.ceil(canvas.width / squareSize) + 1;\n numSquaresY.current = Math.ceil(canvas.height / squareSize) + 1;\n };\n\n window.addEventListener(\"resize\", resizeCanvas);\n resizeCanvas();\n\n const drawGrid = () => {\n if (!ctx) return;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n const startX = Math.floor(gridOffset.current.x / squareSize) * squareSize;\n const startY = Math.floor(gridOffset.current.y / squareSize) * squareSize;\n\n for (let x = startX; x < canvas.width + squareSize; x += squareSize) {\n for (let y = startY; y < canvas.height + squareSize; y += squareSize) {\n const squareX = x - (gridOffset.current.x % squareSize);\n const squareY = y - (gridOffset.current.y % squareSize);\n\n if (\n hoveredSquareRef.current &&\n Math.floor((x - startX) / squareSize) === hoveredSquareRef.current.x &&\n Math.floor((y - startY) / squareSize) === hoveredSquareRef.current.y\n ) {\n ctx.fillStyle = hoverFillColor;\n ctx.fillRect(squareX, squareY, squareSize, squareSize);\n }\n\n ctx.strokeStyle = borderColor;\n ctx.strokeRect(squareX, squareY, squareSize, squareSize);\n }\n }\n\n const gradient = ctx.createRadialGradient(\n canvas.width / 2,\n canvas.height / 2,\n 0,\n canvas.width / 2,\n canvas.height / 2,\n Math.sqrt(canvas.width ** 2 + canvas.height ** 2) / 2,\n );\n gradient.addColorStop(0, \"rgba(0, 0, 0, 0)\");\n gradient.addColorStop(1, vignetteEdgeColor);\n\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n };\n\n const updateAnimation = () => {\n const effectiveSpeed = Math.max(speed, 0.1);\n switch (direction) {\n case \"right\":\n gridOffset.current.x = (gridOffset.current.x - effectiveSpeed + squareSize) % squareSize;\n break;\n case \"left\":\n gridOffset.current.x = (gridOffset.current.x + effectiveSpeed + squareSize) % squareSize;\n break;\n case \"up\":\n gridOffset.current.y = (gridOffset.current.y + effectiveSpeed + squareSize) % squareSize;\n break;\n case \"down\":\n gridOffset.current.y = (gridOffset.current.y - effectiveSpeed + squareSize) % squareSize;\n break;\n case \"diagonal\":\n gridOffset.current.x = (gridOffset.current.x - effectiveSpeed + squareSize) % squareSize;\n gridOffset.current.y = (gridOffset.current.y - effectiveSpeed + squareSize) % squareSize;\n break;\n default:\n break;\n }\n\n drawGrid();\n requestRef.current = requestAnimationFrame(updateAnimation);\n };\n\n const handleMouseMove = (event: MouseEvent) => {\n const rect = canvas.getBoundingClientRect();\n const mouseX = event.clientX - rect.left;\n const mouseY = event.clientY - rect.top;\n\n const startX = Math.floor(gridOffset.current.x / squareSize) * squareSize;\n const startY = Math.floor(gridOffset.current.y / squareSize) * squareSize;\n\n const hoveredSquareX = Math.floor((mouseX + gridOffset.current.x - startX) / squareSize);\n const hoveredSquareY = Math.floor((mouseY + gridOffset.current.y - startY) / squareSize);\n\n if (!hoveredSquareRef.current || hoveredSquareRef.current.x !== hoveredSquareX || hoveredSquareRef.current.y !== hoveredSquareY) {\n hoveredSquareRef.current = { x: hoveredSquareX, y: hoveredSquareY };\n }\n };\n\n const handleMouseLeave = () => {\n hoveredSquareRef.current = null;\n };\n\n canvas.addEventListener(\"mousemove\", handleMouseMove);\n canvas.addEventListener(\"mouseleave\", handleMouseLeave);\n requestRef.current = requestAnimationFrame(updateAnimation);\n\n return () => {\n window.removeEventListener(\"resize\", resizeCanvas);\n if (requestRef.current) cancelAnimationFrame(requestRef.current);\n canvas.removeEventListener(\"mousemove\", handleMouseMove);\n canvas.removeEventListener(\"mouseleave\", handleMouseLeave);\n };\n }, [direction, speed, borderColor, hoverFillColor, squareSize, vignetteEdgeColor]);\n\n return <canvas ref={canvasRef} className={`${styles.squaresCanvas} ${className}`} style={style} />;\n};\n\nconst SquareBackground: React.FC<Omit<SquaresProps, \"borderColor\" | \"hoverFillColor\">> = (props) => {\n const { currentTheme } = useTheme();\n\n // 从主题中获取边框颜色\n const borderColor = useMemo(() => {\n const borderColorValue = currentTheme.colors.variables.border5 || currentTheme.colors.variables.fg || \"#6B7280\";\n if (borderColorValue.startsWith(\"#\")) {\n return borderColorValue;\n }\n const match = borderColorValue.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/);\n if (match) {\n const r = parseInt(match[1], 10).toString(16).padStart(2, \"0\");\n const g = parseInt(match[2], 10).toString(16).padStart(2, \"0\");\n const b = parseInt(match[3], 10).toString(16).padStart(2, \"0\");\n return `#${r}${g}${b}`;\n }\n return borderColorValue;\n }, [currentTheme]);\n\n // 从主题中获取悬停填充颜色\n const hoverFillColor = useMemo(() => {\n const baseColor = currentTheme.colors.variables.bg3 || currentTheme.colors.variables.border3 || \"#F3F4F6\";\n\n const darkenColor = (r: number, g: number, b: number, factor: number = 0.3) => {\n const newR = Math.round(r * (1 - factor));\n const newG = Math.round(g * (1 - factor));\n const newB = Math.round(b * (1 - factor));\n return `rgb(${newR}, ${newG}, ${newB})`;\n };\n\n if (baseColor.startsWith(\"#\")) {\n const hex = baseColor.slice(1);\n const r = parseInt(hex.slice(0, 2), 16);\n const g = parseInt(hex.slice(2, 4), 16);\n const b = parseInt(hex.slice(4, 6), 16);\n return darkenColor(r, g, b);\n }\n const match = baseColor.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/);\n if (match) {\n const r = parseInt(match[1], 10);\n const g = parseInt(match[2], 10);\n const b = parseInt(match[3], 10);\n return darkenColor(r, g, b);\n }\n return baseColor;\n }, [currentTheme]);\n\n return <Squares borderColor={borderColor} hoverFillColor={hoverFillColor} speed={0.5} squareSize={40} direction=\"diagonal\" {...props} />;\n};\n\nexport default SquareBackground;\n",".container {\n position: relative;\n width: 100%;\n height: 100%;\n background-color: var(--color-bg);\n overflow: hidden;\n}\n\n.canvas {\n display: block;\n width: 100%;\n height: 100%;\n}\n\n.outerVignette {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n background: radial-gradient(circle, rgba(0, 0, 0, 0) 60%, rgba(0, 0, 0, 1) 100%);\n}\n\n.centerVignette {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n background: radial-gradient(circle, rgba(0, 0, 0, 0.8) 0%, rgba(0, 0, 0, 0) 60%);\n}\n","import { memo, useCallback, useEffect, useMemo, useRef } from \"react\";\n\nimport { useTheme } from \"@/themes/hooks/useTheme\";\n\nimport styles from \"./style.module.css\";\n\ninterface LetterGlitchProps {\n glitchColors?: string[];\n glitchSpeed?: number;\n centerVignette?: boolean;\n outerVignette?: boolean;\n smooth?: boolean;\n characters?: string;\n className?: string;\n style?: React.CSSProperties;\n}\n\nconst LetterGlitch = memo(\n ({\n glitchColors = [\"#7F1D1D\", \"#16A34A\", \"#2563EB\"],\n glitchSpeed = 500, // 增加默认速度,减少更新频率\n centerVignette = false,\n outerVignette = true,\n smooth = true,\n characters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz!@#$&*()-_+=/[]{};:<>.,0123456789\",\n className = \"\",\n style = {},\n }: LetterGlitchProps) => {\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const animationRef = useRef<number | null>(null);\n const letters = useRef<\n {\n char: string;\n color: string;\n targetColor: string;\n colorProgress: number;\n }[]\n >([]);\n const grid = useRef({ columns: 0, rows: 0 });\n const context = useRef<CanvasRenderingContext2D | null>(null);\n const lastGlitchTime = useRef(Date.now());\n\n const lettersAndSymbols = useMemo(() => Array.from(characters), [characters]);\n\n // 缓存 hexToRgb 结果\n const rgbCache = useRef<Map<string, { r: number; g: number; b: number } | null>>(new Map());\n\n const fontSize = 16;\n const charWidth = 10;\n const charHeight = 20;\n\n const getRandomChar = useCallback(() => {\n return lettersAndSymbols[Math.floor(Math.random() * lettersAndSymbols.length)];\n }, [lettersAndSymbols]);\n\n const getRandomColor = useCallback(() => {\n return glitchColors[Math.floor(Math.random() * glitchColors.length)];\n }, [glitchColors]);\n\n const hexToRgb = useCallback((hex: string) => {\n // 检查缓存\n if (rgbCache.current.has(hex)) {\n return rgbCache.current.get(hex)!;\n }\n\n const shorthandRegex = /^#?([a-f\\d])([a-f\\d])([a-f\\d])$/i;\n const normalizedHex = hex.replace(shorthandRegex, (_m, r, g, b) => {\n return r + r + g + g + b + b;\n });\n\n const result = /^#?([a-f\\d]{2})([a-f\\d]{2})([a-f\\d]{2})$/i.exec(normalizedHex);\n const rgb = result\n ? {\n r: parseInt(result[1], 16),\n g: parseInt(result[2], 16),\n b: parseInt(result[3], 16),\n }\n : null;\n\n // 缓存结果\n rgbCache.current.set(hex, rgb);\n return rgb;\n }, []);\n\n const interpolateColor = (start: { r: number; g: number; b: number }, end: { r: number; g: number; b: number }, factor: number) => {\n const result = {\n r: Math.round(start.r + (end.r - start.r) * factor),\n g: Math.round(start.g + (end.g - start.g) * factor),\n b: Math.round(start.b + (end.b - start.b) * factor),\n };\n return `rgb(${result.r}, ${result.g}, ${result.b})`;\n };\n\n const calculateGrid = (width: number, height: number) => {\n const columns = Math.ceil(width / charWidth);\n const rows = Math.ceil(height / charHeight);\n return { columns, rows };\n };\n\n const initializeLetters = (columns: number, rows: number) => {\n grid.current = { columns, rows };\n const totalLetters = columns * rows;\n letters.current = Array.from({ length: totalLetters }, () => ({\n char: getRandomChar(),\n color: getRandomColor(),\n targetColor: getRandomColor(),\n colorProgress: 1,\n }));\n };\n\n const resizeCanvas = () => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const parent = canvas.parentElement;\n if (!parent) return;\n\n const dpr = window.devicePixelRatio || 1;\n const rect = parent.getBoundingClientRect();\n\n canvas.width = rect.width * dpr;\n canvas.height = rect.height * dpr;\n\n canvas.style.width = `${rect.width}px`;\n canvas.style.height = `${rect.height}px`;\n\n if (context.current) {\n context.current.setTransform(dpr, 0, 0, dpr, 0, 0);\n }\n\n const { columns, rows } = calculateGrid(rect.width, rect.height);\n initializeLetters(columns, rows);\n drawLetters();\n };\n\n const drawLetters = useCallback(() => {\n if (!context.current || letters.current.length === 0) return;\n const ctx = context.current;\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.font = `${fontSize}px monospace`;\n ctx.textBaseline = \"top\";\n ctx.textAlign = \"left\";\n\n // 批量绘制,减少状态切换\n letters.current.forEach((letter, index) => {\n const x = (index % grid.current.columns) * charWidth;\n const y = Math.floor(index / grid.current.columns) * charHeight;\n ctx.fillStyle = letter.color;\n ctx.fillText(letter.char, x, y);\n });\n }, []);\n\n const updateLetters = useCallback(() => {\n if (!letters.current || letters.current.length === 0) return;\n\n // 减少更新比例,从 5% 降到 2%,降低性能消耗\n const updateCount = Math.max(1, Math.floor(letters.current.length * 0.02));\n\n for (let i = 0; i < updateCount; i++) {\n const index = Math.floor(Math.random() * letters.current.length);\n if (!letters.current[index]) continue;\n\n letters.current[index].char = getRandomChar();\n letters.current[index].targetColor = getRandomColor();\n\n if (!smooth) {\n letters.current[index].color = letters.current[index].targetColor;\n letters.current[index].colorProgress = 1;\n } else {\n letters.current[index].colorProgress = 0;\n }\n }\n }, [getRandomChar, getRandomColor, smooth]);\n\n const handleSmoothTransitions = useCallback(() => {\n let needsRedraw = false;\n let activeCount = 0;\n\n // 只处理正在过渡的字母,减少不必要的计算\n letters.current.forEach((letter) => {\n if (letter.colorProgress < 1) {\n activeCount++;\n letter.colorProgress += 0.03; // 稍微降低过渡速度,减少重绘频率\n if (letter.colorProgress > 1) letter.colorProgress = 1;\n\n const startRgb = hexToRgb(letter.color);\n const endRgb = hexToRgb(letter.targetColor);\n if (startRgb && endRgb) {\n letter.color = interpolateColor(startRgb, endRgb, letter.colorProgress);\n needsRedraw = true;\n }\n }\n });\n\n // 只有在有活动过渡时才重绘\n if (needsRedraw && activeCount > 0) {\n drawLetters();\n }\n }, [hexToRgb, drawLetters]);\n\n const animate = useCallback(() => {\n const now = Date.now();\n const timeSinceLastGlitch = now - lastGlitchTime.current;\n\n // 只在需要更新时才执行\n if (timeSinceLastGlitch >= glitchSpeed) {\n updateLetters();\n drawLetters();\n lastGlitchTime.current = now;\n } else if (smooth) {\n // 只在平滑模式下才检查过渡\n handleSmoothTransitions();\n }\n\n animationRef.current = requestAnimationFrame(animate);\n }, [glitchSpeed, smooth, updateLetters, handleSmoothTransitions]);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n context.current = canvas.getContext(\"2d\");\n resizeCanvas();\n animate();\n\n let resizeTimeout: ReturnType<typeof setTimeout>;\n\n const handleResize = () => {\n clearTimeout(resizeTimeout);\n resizeTimeout = setTimeout(() => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current);\n }\n resizeCanvas();\n animate();\n }, 100);\n };\n\n window.addEventListener(\"resize\", handleResize);\n\n return () => {\n if (animationRef.current) {\n cancelAnimationFrame(animationRef.current);\n }\n window.removeEventListener(\"resize\", handleResize);\n clearTimeout(resizeTimeout);\n // 清理缓存\n rgbCache.current.clear();\n };\n }, [glitchSpeed, smooth, glitchColors, animate]);\n\n return (\n <div className={`${styles.container} ${className}`} style={style}>\n <canvas ref={canvasRef} className={styles.canvas} />\n {outerVignette && <div className={styles.outerVignette}></div>}\n {centerVignette && <div className={styles.centerVignette}></div>}\n </div>\n );\n },\n);\n\nconst LetterGlitchBackground: React.FC<Omit<LetterGlitchProps, \"glitchColors\">> = memo((props) => {\n const { currentTheme } = useTheme();\n\n // 从主题中获取故障颜色数组\n const glitchColors = useMemo(() => {\n const primary = currentTheme.colors.variables.primary || \"#DC2626\";\n const info = currentTheme.colors.variables.info || \"#2563EB\";\n const success = currentTheme.colors.variables.success || \"#16A34A\";\n\n const toHex = (color: string): string => {\n if (color.startsWith(\"#\")) {\n return color;\n }\n const match = color.match(/rgb\\((\\d+),\\s*(\\d+),\\s*(\\d+)\\)/);\n if (match) {\n const r = parseInt(match[1], 10).toString(16).padStart(2, \"0\");\n const g = parseInt(match[2], 10).toString(16).padStart(2, \"0\");\n const b = parseInt(match[3], 10).toString(16).padStart(2, \"0\");\n return `#${r}${g}${b}`;\n }\n return color;\n };\n\n return [toHex(primary), toHex(info), toHex(success)];\n }, [currentTheme]);\n\n return (\n <LetterGlitch\n glitchColors={glitchColors}\n glitchSpeed={300} // 增加默认速度,减少更新频率\n centerVignette={true}\n outerVignette={false}\n smooth={true}\n {...props}\n />\n );\n});\n\nLetterGlitchBackground.displayName = \"LetterGlitchBackground\";\n\nexport default LetterGlitchBackground;\n"],"mappings":";;;;;;GCOM,IAAN,MAAW;AAAA,EACT;AAAA,EACA;AAAA,EACA;AAAA,EACA,YAAY,GAAW,GAAW,GAAW;AAC3C,SAAK,IAAI,GACT,KAAK,IAAI,GACT,KAAK,IAAI;AAAA;EAEX,KAAK,GAAW,GAAmB;AACjC,WAAO,KAAK,IAAI,IAAI,KAAK,IAAI;AAAA;GAI3B,KAAN,MAAY;AAAA,EACV;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YAAY,IAAO,GAAG;AACpB,SAAK,QAAQ;AAAA,MACX,IAAI,EAAK,GAAG,GAAG,CAAA;AAAA,MACf,IAAI,EAAK,IAAI,GAAG,CAAA;AAAA,MAChB,IAAI,EAAK,GAAG,IAAI,CAAA;AAAA,MAChB,IAAI,EAAK,IAAI,IAAI,CAAA;AAAA,MACjB,IAAI,EAAK,GAAG,GAAG,CAAA;AAAA,MACf,IAAI,EAAK,IAAI,GAAG,CAAA;AAAA,MAChB,IAAI,EAAK,GAAG,GAAG,EAAA;AAAA,MACf,IAAI,EAAK,IAAI,GAAG,EAAA;AAAA,MAChB,IAAI,EAAK,GAAG,GAAG,CAAA;AAAA,MACf,IAAI,EAAK,GAAG,IAAI,CAAA;AAAA,MAChB,IAAI,EAAK,GAAG,GAAG,EAAA;AAAA,MACf,IAAI,EAAK,GAAG,IAAI,EAAA;AAAA,OAElB,KAAK,IAAI;AAAA,MACP;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAG;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAG;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAG;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MACrJ;AAAA,MAAI;AAAA,MAAG;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MACnJ;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAG;AAAA,MAAK;AAAA,MACrJ;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAG;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAG;AAAA,MACrJ;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAI;AAAA,MAAI;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAK;AAAA,MAAG;AAAA,MAA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"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
const _=require("./chunk-chunk-BFrxaqQT.cjs"),s=require("./chunk-lstorage-BnxLXHgH.cjs"),e=require("./chunk-language-Bqmpuf2W.cjs");let a=require("i18next");a=_.__toESM(a,1);let g=require("i18next-browser-languagedetector");g=_.__toESM(g,1);let P=require("react-i18next");var O={show:"Show Sidebar",hide:"Hide Sidebar"},G={layoutSwitcher:O},U={en:"English",zh:"Chinese",fr:"French"},$={languageSwitcher:U},R={default:"Default",ios:"iOS",android:"Android",windows:"Windows",linux:"Linux"},M={theme:"Theme",language:"Language",layout:"Layout",preferences:"Preferences"},x={baseSwitcher:R,preference:M},q={default:"Default",light:"Light",dark:"Dark",cosmic:"Cosmic",corporate:"Corporate",forest:"Forest",coffee:"Coffee",wine:"Wine",wheat:"Wheat"},F={themeSwitcher:q},j={show:"Afficher la barre latérale",hide:"Masquer la barre latérale"},k={layoutSwitcher:j},T={en:"Anglais",zh:"Chinois",fr:"Français"},D={languageSwitcher:T},I={default:"Par défaut",ios:"iOS",android:"Android",windows:"Windows",linux:"Linux"},V={theme:"Thème",language:"Langue",layout:"Disposition",preferences:"Préférences"},z={baseSwitcher:I,preference:V},B={default:"Par défaut",light:"Clair",dark:"Sombre",cosmic:"Cosmique",corporate:"Entreprise",forest:"Forêt",coffee:"Coffee",wine:"Vin",wheat:"Blé"},W={themeSwitcher:B},X={show:"显示侧边栏",hide:"隐藏侧边栏"},K={layoutSwitcher:X},Y={en:"英语",zh:"中文",fr:"法语"},H={languageSwitcher:Y},Z={default:"默认",ios:"iOS",android:"Android",windows:"Windows",linux:"Linux"},J={theme:"主题",language:"语言",layout:"布局",preferences:"偏好设置"},Q={baseSwitcher:Z,preference:J},ee={default:"默认",light:"浅色",dark:"深色",cosmic:"宇宙",corporate:"企业",forest:"森林",coffee:"咖啡",wine:"酒红",wheat:"麦田"},re={themeSwitcher:ee},m=["theme","language","layout","preference"],p={theme:"theme",language:"language",layout:"layout",preference:"preference"},te={en:{theme:F,language:$,layout:G,preference:x},zh:{theme:re,language:H,layout:K,preference:Q},fr:{theme:W,language:D,layout:k,preference:z}};function w(){return{RESOURCES:te,NAME_SPACES_MAP:p,NAME_SPACES:[...m]}}function L(){const r=s.getItem(e.LANGUAGE_STORAGE_KEY);return r==null||e.LANGUAGE_VALUES.includes(r)?r:void 0}function v(r){s.setItem(e.LANGUAGE_STORAGE_KEY,r)}function ae(){s.removeItem(e.LANGUAGE_STORAGE_KEY)}var A=!1;function ne(r){if(a.default.isInitialized)return;const d=w(),c=r.bundles,i=r.fallbackLng??e.LanguageEnum.ZH,b=[e.LanguageEnum.EN,e.LanguageEnum.ZH,e.LanguageEnum.FR].reduce((n,t)=>({...n,[t]:{...d.RESOURCES[t]??{},...c.RESOURCES[t]??{}}}),{}),S=[...c.NAME_SPACES,...d.NAME_SPACES.filter(n=>!c.NAME_SPACES.includes(n))],y=L()??i,N=n=>{const t=n.split("-")[0]?.toLowerCase()??"";e.LANGUAGE_VALUES.includes(t)&&v(t)};A||(a.default.on("languageChanged",N),A=!0),a.default.use(g.default).use(P.initReactI18next).init({compatibilityJSON:"v4",resources:b,lng:y,fallbackLng:i,supportedLngs:[...e.LANGUAGE_VALUES],load:"languageOnly",ns:S,defaultNS:S[0],interpolation:{escapeValue:!1},keySeparator:".",detection:{order:["localStorage","navigator","htmlTag","path","subdomain"],lookupLocalStorage:e.LANGUAGE_STORAGE_KEY,caches:["localStorage"]}});const h=r.onLoadExtraBundles;if(h){const n=u=>{const o=u.split("-")[0]?.toLowerCase()??"";return e.LANGUAGE_VALUES.includes(o)?o:i},t=async u=>{const o=n(u),l=await h(o);if(l==null)return;const C=Array.isArray(l)?l:[l];for(const{namespace:E,bundle:f}of C)E&&f&&typeof f=="object"&&a.default.addResourceBundle(o,E,f,!0,!0)};t(a.default.language||i),a.default.on("languageChanged",u=>{t(u)})}}var ue=a.default;Object.defineProperty(exports,"NFX_NAMESPACES",{enumerable:!0,get:function(){return m}});Object.defineProperty(exports,"NFX_NAMESPACES_MAP",{enumerable:!0,get:function(){return p}});Object.defineProperty(exports,"getDefaultNfxBundles",{enumerable:!0,get:function(){return w}});Object.defineProperty(exports,"getLanguageStorage",{enumerable:!0,get:function(){return L}});Object.defineProperty(exports,"i18n_default",{enumerable:!0,get:function(){return ue}});Object.defineProperty(exports,"initI18n",{enumerable:!0,get:function(){return ne}});Object.defineProperty(exports,"removeLanguageStorage",{enumerable:!0,get:function(){return ae}});Object.defineProperty(exports,"setLanguageStorage",{enumerable:!0,get:function(){return v}});
|
|
2
|
+
|
|
3
|
+
//# sourceMappingURL=chunk-i18n-BTmbcksb.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-i18n-rD2zjgzE.cjs","names":[],"sources":["../src/languages/resources/en/layout.json","../src/languages/resources/en/language.json","../src/languages/resources/en/preference.json","../src/languages/resources/en/theme.json","../src/languages/resources/fr/layout.json","../src/languages/resources/fr/language.json","../src/languages/resources/fr/preference.json","../src/languages/resources/fr/theme.json","../src/languages/resources/zh/layout.json","../src/languages/resources/zh/language.json","../src/languages/resources/zh/preference.json","../src/languages/resources/zh/theme.json","../src/languages/resources/index.ts","../src/languages/utils/languageStorage.ts","../src/languages/languages/i18n.ts"],"sourcesContent":["{\n \"layoutSwitcher\": {\n \"show\": \"Show Sidebar\",\n \"hide\": \"Hide Sidebar\"\n }\n}\n","{\n \"languageSwitcher\": {\n \"en\": \"English\",\n \"zh\": \"Chinese\",\n \"fr\": \"French\"\n }\n}\n","{\n \"baseSwitcher\": {\n \"default\": \"Default\",\n \"ios\": \"iOS\",\n \"android\": \"Android\",\n \"windows\": \"Windows\",\n \"linux\": \"Linux\"\n },\n \"preference\": {\n \"theme\": \"Theme\",\n \"language\": \"Language\",\n \"layout\": \"Layout\",\n \"preferences\": \"Preferences\"\n }\n}\n","{\n \"themeSwitcher\": {\n \"default\": \"Default\",\n \"light\": \"Light\",\n \"dark\": \"Dark\",\n \"cosmic\": \"Cosmic\",\n \"corporate\": \"Corporate\",\n \"forest\": \"Forest\",\n \"coffee\": \"Coffee\",\n \"wine\": \"Wine\",\n \"wheat\": \"Wheat\"\n }\n}\n","{\n \"layoutSwitcher\": {\n \"show\": \"Afficher la barre latérale\",\n \"hide\": \"Masquer la barre latérale\"\n }\n}\n","{\n \"languageSwitcher\": {\n \"en\": \"Anglais\",\n \"zh\": \"Chinois\",\n \"fr\": \"Français\"\n }\n}\n","{\n \"baseSwitcher\": {\n \"default\": \"Par défaut\",\n \"ios\": \"iOS\",\n \"android\": \"Android\",\n \"windows\": \"Windows\",\n \"linux\": \"Linux\"\n },\n \"preference\": {\n \"theme\": \"Thème\",\n \"language\": \"Langue\",\n \"layout\": \"Disposition\",\n \"preferences\": \"Préférences\"\n }\n}\n","{\n \"themeSwitcher\": {\n \"default\": \"Par défaut\",\n \"light\": \"Clair\",\n \"dark\": \"Sombre\",\n \"cosmic\": \"Cosmique\",\n \"corporate\": \"Entreprise\",\n \"forest\": \"Forêt\",\n \"coffee\": \"Coffee\",\n \"wine\": \"Vin\",\n \"wheat\": \"Blé\"\n }\n}\n","{\n \"layoutSwitcher\": {\n \"show\": \"显示侧边栏\",\n \"hide\": \"隐藏侧边栏\"\n }\n}\n","{\n \"languageSwitcher\": {\n \"en\": \"英语\",\n \"zh\": \"中文\",\n \"fr\": \"法语\"\n }\n}\n","{\n \"baseSwitcher\": {\n \"default\": \"默认\",\n \"ios\": \"iOS\",\n \"android\": \"Android\",\n \"windows\": \"Windows\",\n \"linux\": \"Linux\"\n },\n \"preference\": {\n \"theme\": \"主题\",\n \"language\": \"语言\",\n \"layout\": \"布局\",\n \"preferences\": \"偏好设置\"\n }\n}\n","{\n \"themeSwitcher\": {\n \"default\": \"默认\",\n \"light\": \"浅色\",\n \"dark\": \"深色\",\n \"cosmic\": \"宇宙\",\n \"corporate\": \"企业\",\n \"forest\": \"森林\",\n \"coffee\": \"咖啡\",\n \"wine\": \"酒红\",\n \"wheat\": \"麦田\"\n }\n}\n","/**\n * NFX-UI 内置多语言资源:theme / language / layout / preference 四个命名空间,en / zh / fr 三种语言。\n * Built-in i18n resources: namespaces theme, language, layout, preference; languages en, zh, fr.\n *\n * 使用方可在 createI18nResources 时合并此资源,使 ThemeSwitcher / LanguageSwitcher / LayoutSwitcher 使用默认翻译。\n * Consumers can merge these resources in createI18nResources so switchers use default labels.\n */\nimport type { CreateI18nResourcesResult, NameSpacesMap, Resources } from \"../types\";\n\nimport enLayout from \"./en/layout.json\";\nimport enLanguage from \"./en/language.json\";\nimport enPreference from \"./en/preference.json\";\nimport enTheme from \"./en/theme.json\";\nimport frLayout from \"./fr/layout.json\";\nimport frLanguage from \"./fr/language.json\";\nimport frPreference from \"./fr/preference.json\";\nimport frTheme from \"./fr/theme.json\";\nimport zhLayout from \"./zh/layout.json\";\nimport zhLanguage from \"./zh/language.json\";\nimport zhPreference from \"./zh/preference.json\";\nimport zhTheme from \"./zh/theme.json\";\n\nexport const NFX_NAMESPACES = [\"theme\", \"language\", \"layout\", \"preference\"] as const;\nexport const NFX_NAMESPACES_MAP: NameSpacesMap = {\n theme: \"theme\",\n language: \"language\",\n layout: \"layout\",\n preference: \"preference\",\n};\n\nconst DEFAULT_NFX_RESOURCES: Resources = {\n en: {\n theme: enTheme as Record<string, unknown>,\n language: enLanguage as Record<string, unknown>,\n layout: enLayout as Record<string, unknown>,\n preference: enPreference as Record<string, unknown>,\n },\n zh: {\n theme: zhTheme as Record<string, unknown>,\n language: zhLanguage as Record<string, unknown>,\n layout: zhLayout as Record<string, unknown>,\n preference: zhPreference as Record<string, unknown>,\n },\n fr: {\n theme: frTheme as Record<string, unknown>,\n language: frLanguage as Record<string, unknown>,\n layout: frLayout as Record<string, unknown>,\n preference: frPreference as Record<string, unknown>,\n },\n};\n\n/**\n * 返回 NFX-UI 默认文案包,可与使用方自建 resources 合并后传入 createI18nResources。\n * Returns default NFX bundles; merge with your resources and pass to createI18nResources.\n */\nexport function getDefaultNfxBundles(): CreateI18nResourcesResult {\n return {\n RESOURCES: DEFAULT_NFX_RESOURCES,\n NAME_SPACES_MAP: NFX_NAMESPACES_MAP,\n NAME_SPACES: [...NFX_NAMESPACES],\n };\n}\n","/**\n * 语言相关 localStorage 读写与移除,统一走 utils/lstorage;读写类型为 LanguageEnum。\n * Language localStorage get/set/remove via utils/lstorage; typed as LanguageEnum.\n */\nimport type { Nilable } from \"@/types/utils\";\nimport { getItem, removeItem, setItem } from \"@/utils/lstorage\";\n\nimport { LANGUAGE_STORAGE_KEY, LANGUAGE_VALUES, LanguageEnum } from \"../types\";\n\nexport function getLanguageStorage(): Nilable<LanguageEnum> {\n const raw = getItem(LANGUAGE_STORAGE_KEY);\n if (raw == null) return raw;\n return (LANGUAGE_VALUES as readonly string[]).includes(raw) ? (raw as LanguageEnum) : undefined;\n}\n\nexport function setLanguageStorage(value: LanguageEnum): void {\n setItem(LANGUAGE_STORAGE_KEY, value);\n}\n\nexport function removeLanguageStorage(): void {\n removeItem(LANGUAGE_STORAGE_KEY);\n}\n","/**\n * i18n 初始化与实例:initI18n 由 LanguageProvider 调用,changeLanguage 供外部切换语言。\n * 默认会合并 NFX-UI 自带的 theme / language / layout / preference 四个命名空间,使用方只需传入自己的 bundles。\n * i18n init and instance: initI18n called by LanguageProvider. Merges built-in theme/language/layout/preference by default.\n */\nimport type { InitI18nOptions } from \"../types\";\n\nimport i18n from \"i18next\";\nimport LanguageDetector from \"i18next-browser-languagedetector\";\nimport { initReactI18next } from \"react-i18next\";\n\nimport { getDefaultNfxBundles } from \"../resources\";\nimport { LanguageEnum, LANGUAGE_STORAGE_KEY, LANGUAGE_VALUES } from \"../types\";\nimport { getLanguageStorage, setLanguageStorage } from \"../utils/languageStorage\";\n\nlet languagePersistAttached = false;\n\n/**\n * 初始化 i18n。会先合并 NFX-UI 自带的四类 JSON(theme/language/layout/preference),再与用户传入的 bundles 合并(用户可覆盖)。\n * Init i18n. Merges built-in NFX bundles (theme, language, layout, preference) with user bundles (user overrides).\n */\nexport function initI18n(options: InitI18nOptions): void {\n /** React StrictMode remounts the provider; i18next 原单例二次 init 会弄乱资源。 */\n if (i18n.isInitialized) {\n return;\n }\n\n const nfx = getDefaultNfxBundles();\n const user = options.bundles;\n const fallbackLng = options.fallbackLng ?? LanguageEnum.ZH;\n\n const RESOURCES = ([LanguageEnum.EN, LanguageEnum.ZH, LanguageEnum.FR] as const).reduce(\n (acc, lang) => ({\n ...acc,\n [lang]: {\n ...(nfx.RESOURCES[lang] ?? {}),\n ...(user.RESOURCES[lang] ?? {}),\n },\n }),\n {} as typeof user.RESOURCES,\n );\n const NAME_SPACES = [...user.NAME_SPACES, ...nfx.NAME_SPACES.filter((n) => !user.NAME_SPACES.includes(n))];\n\n /** Same key as `lookupLocalStorage`: prefer saved choice before navigator. */\n const initialLng = getLanguageStorage() ?? fallbackLng;\n\n const persistLanguage = (lng: string) => {\n const base = lng.split(\"-\")[0]?.toLowerCase() ?? \"\";\n if ((LANGUAGE_VALUES as readonly string[]).includes(base)) {\n setLanguageStorage(base as LanguageEnum);\n }\n };\n\n if (!languagePersistAttached) {\n i18n.on(\"languageChanged\", persistLanguage);\n languagePersistAttached = true;\n }\n\n i18n\n .use(LanguageDetector)\n .use(initReactI18next)\n .init({\n compatibilityJSON: \"v4\",\n resources: RESOURCES,\n lng: initialLng,\n fallbackLng,\n /**\n * 资源只注册 en/zh/fr;.detector 或浏览器会给出 zh-CN、en-US 等,若不收敛则整语言匹配失败 → 界面全是 key。\n * Bundles are only `en` / `zh` / `fr`; normalize regional codes so namespaces resolve.\n */\n supportedLngs: [...LANGUAGE_VALUES],\n load: \"languageOnly\",\n ns: NAME_SPACES,\n defaultNS: NAME_SPACES[0],\n interpolation: { escapeValue: false },\n keySeparator: \".\",\n /**\n * Detector walks `order` and concatenates hits; first candidate wins for resolution.\n * `lookupLocalStorage` must match `getLanguageStorage` / `setLanguageStorage` (LANGUAGE_STORAGE_KEY).\n * Explicit `lng: initialLng` above mirrors that rule so behavior is obvious without reading plugin internals.\n */\n detection: {\n order: [\"localStorage\", \"navigator\", \"htmlTag\", \"path\", \"subdomain\"],\n lookupLocalStorage: LANGUAGE_STORAGE_KEY,\n caches: [\"localStorage\"],\n },\n });\n\n const onLoad = options.onLoadExtraBundles;\n if (onLoad) {\n const toSupported = (lng: string): LanguageEnum => {\n const base = lng.split(\"-\")[0]?.toLowerCase() ?? \"\";\n return (LANGUAGE_VALUES as readonly string[]).includes(base) ? (base as LanguageEnum) : fallbackLng;\n };\n const apply = async (lng: string) => {\n const code = toSupported(lng);\n const result = await onLoad(code);\n if (result == null) return;\n const items = Array.isArray(result) ? result : [result];\n for (const { namespace, bundle } of items) {\n if (namespace && bundle && typeof bundle === \"object\") {\n i18n.addResourceBundle(code, namespace, bundle, true, true);\n }\n }\n };\n void apply(i18n.language || fallbackLng);\n i18n.on(\"languageChanged\", (lng) => void apply(lng));\n }\n}\n\nexport default i18n;\n"],"mappings":"2pDYsBa,EAAiB,CAAC,QAAS,WAAY,SAAU,cACjD,EAAoC,CAC/C,MAAO,QACP,SAAU,WACV,OAAQ,SACR,WAAY,cAGR,GAAmC,CACvC,GAAI,CACF,MAAO,EACP,SAAU,EACV,OAAQ,EACR,WAAY,GAEd,GAAI,CACF,MAAO,GACP,SAAU,EACV,OAAQ,EACR,WAAY,GAEd,GAAI,CACF,MAAO,EACP,SAAU,EACV,OAAQ,EACR,WAAY,IAQhB,SAAgB,GAAkD,CAChE,MAAO,CACL,UAAW,GACX,gBAAiB,EACjB,YAAa,CAAC,GAAG,CAAA,GClDrB,SAAgB,GAA4C,CAC1D,MAAM,EAAM,EAAA,QAAQ,EAAA,oBAAA,EACpB,OAAI,GAAO,MACH,EAAA,gBAAsC,SAAS,CAAA,EAD/B,EAC8D,OAGxF,SAAgB,EAAmB,EAA2B,CAC5D,EAAA,QAAQ,EAAA,qBAAsB,CAAA,EAGhC,SAAgB,IAA8B,CAC5C,EAAA,WAAW,EAAA,oBAAA,ECLb,IAAI,EAA0B,GAM9B,SAAgB,GAAS,EAAgC,CAEvD,GAAI,EAAA,QAAK,cACP,OAGF,MAAM,EAAM,EAAA,EACN,EAAO,EAAQ,QACf,EAAc,EAAQ,aAAe,EAAA,aAAa,GAElD,EAAa,CAAC,EAAA,aAAa,GAAI,EAAA,aAAa,GAAI,EAAA,aAAa,IAAc,OAAA,CAC9E,EAAK,KAAU,CACd,GAAG,GACF,CAAA,EAAO,CACN,GAAI,EAAI,UAAU,CAAA,GAAS,CAAA,EAC3B,GAAI,EAAK,UAAU,CAAA,GAAS,CAAA,KAGhC,CAAA,CAAE,EAEE,EAAc,CAAC,GAAG,EAAK,YAAa,GAAG,EAAI,YAAY,OAAQ,GAAM,CAAC,EAAK,YAAY,SAAS,CAAA,CAAE,CAAC,EAGnG,EAAa,EAAA,GAAwB,EAErC,EAAmB,GAAgB,CACvC,MAAM,EAAO,EAAI,MAAM,GAAA,EAAK,CAAA,GAAI,YAAA,GAAiB,GAC5C,EAAA,gBAAsC,SAAS,CAAA,GAClD,EAAmB,CAAA,GAIlB,IACH,EAAA,QAAK,GAAG,kBAAmB,CAAA,EAC3B,EAA0B,IAG5B,EAAA,QACG,IAAI,EAAA,OAAA,EACJ,IAAI,EAAA,gBAAA,EACJ,KAAK,CACJ,kBAAmB,KACnB,UAAW,EACX,IAAK,EACL,YAAA,EAKA,cAAe,CAAC,GAAG,EAAA,eAAA,EACnB,KAAM,eACN,GAAI,EACJ,UAAW,EAAY,CAAA,EACvB,cAAe,CAAE,YAAa,EAAA,EAC9B,aAAc,IAMd,UAAW,CACT,MAAO,CAAC,eAAgB,YAAa,UAAW,OAAQ,aACxD,mBAAoB,EAAA,qBACpB,OAAQ,CAAC,cAAA,GAEZ,EAEH,MAAM,EAAS,EAAQ,mBACvB,GAAI,EAAQ,CACV,MAAM,EAAe,GAA8B,CACjD,MAAM,EAAO,EAAI,MAAM,GAAA,EAAK,CAAA,GAAI,YAAA,GAAiB,GACjD,OAAQ,EAAA,gBAAsC,SAAS,CAAA,EAAS,EAAwB,GAEpF,EAAQ,MAAO,GAAgB,CACnC,MAAM,EAAO,EAAY,CAAA,EACnB,EAAS,MAAM,EAAO,CAAA,EAC5B,GAAI,GAAU,KAAM,OACpB,MAAM,EAAQ,MAAM,QAAQ,CAAA,EAAU,EAAS,CAAC,CAAA,EAChD,SAAW,CAAE,UAAA,EAAW,OAAA,CAAA,IAAY,EAC9B,GAAa,GAAU,OAAO,GAAW,UAC3C,EAAA,QAAK,kBAAkB,EAAM,EAAW,EAAQ,GAAM,EAAA,GAIvD,EAAM,EAAA,QAAK,UAAY,CAAA,EAC5B,EAAA,QAAK,GAAG,kBAAoB,GAAA,CAAa,EAAM,CAAA,EAAI,GAIvD,IAAA,GAAe,EAAA"}
|
|
1
|
+
{"version":3,"file":"chunk-i18n-BTmbcksb.cjs","names":[],"sources":["../src/languages/resources/en/layout.json","../src/languages/resources/en/language.json","../src/languages/resources/en/preference.json","../src/languages/resources/en/theme.json","../src/languages/resources/fr/layout.json","../src/languages/resources/fr/language.json","../src/languages/resources/fr/preference.json","../src/languages/resources/fr/theme.json","../src/languages/resources/zh/layout.json","../src/languages/resources/zh/language.json","../src/languages/resources/zh/preference.json","../src/languages/resources/zh/theme.json","../src/languages/resources/index.ts","../src/languages/utils/languageStorage.ts","../src/languages/languages/i18n.ts"],"sourcesContent":["{\n \"layoutSwitcher\": {\n \"show\": \"Show Sidebar\",\n \"hide\": \"Hide Sidebar\"\n }\n}\n","{\n \"languageSwitcher\": {\n \"en\": \"English\",\n \"zh\": \"Chinese\",\n \"fr\": \"French\"\n }\n}\n","{\n \"baseSwitcher\": {\n \"default\": \"Default\",\n \"ios\": \"iOS\",\n \"android\": \"Android\",\n \"windows\": \"Windows\",\n \"linux\": \"Linux\"\n },\n \"preference\": {\n \"theme\": \"Theme\",\n \"language\": \"Language\",\n \"layout\": \"Layout\",\n \"preferences\": \"Preferences\"\n }\n}\n","{\n \"themeSwitcher\": {\n \"default\": \"Default\",\n \"light\": \"Light\",\n \"dark\": \"Dark\",\n \"cosmic\": \"Cosmic\",\n \"corporate\": \"Corporate\",\n \"forest\": \"Forest\",\n \"coffee\": \"Coffee\",\n \"wine\": \"Wine\",\n \"wheat\": \"Wheat\"\n }\n}\n","{\n \"layoutSwitcher\": {\n \"show\": \"Afficher la barre latérale\",\n \"hide\": \"Masquer la barre latérale\"\n }\n}\n","{\n \"languageSwitcher\": {\n \"en\": \"Anglais\",\n \"zh\": \"Chinois\",\n \"fr\": \"Français\"\n }\n}\n","{\n \"baseSwitcher\": {\n \"default\": \"Par défaut\",\n \"ios\": \"iOS\",\n \"android\": \"Android\",\n \"windows\": \"Windows\",\n \"linux\": \"Linux\"\n },\n \"preference\": {\n \"theme\": \"Thème\",\n \"language\": \"Langue\",\n \"layout\": \"Disposition\",\n \"preferences\": \"Préférences\"\n }\n}\n","{\n \"themeSwitcher\": {\n \"default\": \"Par défaut\",\n \"light\": \"Clair\",\n \"dark\": \"Sombre\",\n \"cosmic\": \"Cosmique\",\n \"corporate\": \"Entreprise\",\n \"forest\": \"Forêt\",\n \"coffee\": \"Coffee\",\n \"wine\": \"Vin\",\n \"wheat\": \"Blé\"\n }\n}\n","{\n \"layoutSwitcher\": {\n \"show\": \"显示侧边栏\",\n \"hide\": \"隐藏侧边栏\"\n }\n}\n","{\n \"languageSwitcher\": {\n \"en\": \"英语\",\n \"zh\": \"中文\",\n \"fr\": \"法语\"\n }\n}\n","{\n \"baseSwitcher\": {\n \"default\": \"默认\",\n \"ios\": \"iOS\",\n \"android\": \"Android\",\n \"windows\": \"Windows\",\n \"linux\": \"Linux\"\n },\n \"preference\": {\n \"theme\": \"主题\",\n \"language\": \"语言\",\n \"layout\": \"布局\",\n \"preferences\": \"偏好设置\"\n }\n}\n","{\n \"themeSwitcher\": {\n \"default\": \"默认\",\n \"light\": \"浅色\",\n \"dark\": \"深色\",\n \"cosmic\": \"宇宙\",\n \"corporate\": \"企业\",\n \"forest\": \"森林\",\n \"coffee\": \"咖啡\",\n \"wine\": \"酒红\",\n \"wheat\": \"麦田\"\n }\n}\n","/**\n * NFX-UI 内置多语言资源:theme / language / layout / preference 四个命名空间,en / zh / fr 三种语言。\n * Built-in i18n resources: namespaces theme, language, layout, preference; languages en, zh, fr.\n *\n * 使用方可在 createI18nResources 时合并此资源,使 ThemeSwitcher / LanguageSwitcher / LayoutSwitcher 使用默认翻译。\n * Consumers can merge these resources in createI18nResources so switchers use default labels.\n */\nimport type { CreateI18nResourcesResult, NameSpacesMap, Resources } from \"../types\";\n\nimport enLayout from \"./en/layout.json\";\nimport enLanguage from \"./en/language.json\";\nimport enPreference from \"./en/preference.json\";\nimport enTheme from \"./en/theme.json\";\nimport frLayout from \"./fr/layout.json\";\nimport frLanguage from \"./fr/language.json\";\nimport frPreference from \"./fr/preference.json\";\nimport frTheme from \"./fr/theme.json\";\nimport zhLayout from \"./zh/layout.json\";\nimport zhLanguage from \"./zh/language.json\";\nimport zhPreference from \"./zh/preference.json\";\nimport zhTheme from \"./zh/theme.json\";\n\nexport const NFX_NAMESPACES = [\"theme\", \"language\", \"layout\", \"preference\"] as const;\nexport const NFX_NAMESPACES_MAP: NameSpacesMap = {\n theme: \"theme\",\n language: \"language\",\n layout: \"layout\",\n preference: \"preference\",\n};\n\nconst DEFAULT_NFX_RESOURCES: Resources = {\n en: {\n theme: enTheme as Record<string, unknown>,\n language: enLanguage as Record<string, unknown>,\n layout: enLayout as Record<string, unknown>,\n preference: enPreference as Record<string, unknown>,\n },\n zh: {\n theme: zhTheme as Record<string, unknown>,\n language: zhLanguage as Record<string, unknown>,\n layout: zhLayout as Record<string, unknown>,\n preference: zhPreference as Record<string, unknown>,\n },\n fr: {\n theme: frTheme as Record<string, unknown>,\n language: frLanguage as Record<string, unknown>,\n layout: frLayout as Record<string, unknown>,\n preference: frPreference as Record<string, unknown>,\n },\n};\n\n/**\n * 返回 NFX-UI 默认文案包,可与使用方自建 resources 合并后传入 createI18nResources。\n * Returns default NFX bundles; merge with your resources and pass to createI18nResources.\n */\nexport function getDefaultNfxBundles(): CreateI18nResourcesResult {\n return {\n RESOURCES: DEFAULT_NFX_RESOURCES,\n NAME_SPACES_MAP: NFX_NAMESPACES_MAP,\n NAME_SPACES: [...NFX_NAMESPACES],\n };\n}\n","/**\n * 语言相关 localStorage 读写与移除,统一走 utils/lstorage;读写类型为 LanguageEnum。\n * Language localStorage get/set/remove via utils/lstorage; typed as LanguageEnum.\n */\nimport type { Nilable } from \"@/types/utils\";\nimport { getItem, removeItem, setItem } from \"@/utils/lstorage\";\n\nimport { LANGUAGE_STORAGE_KEY, LANGUAGE_VALUES, LanguageEnum } from \"../types\";\n\nexport function getLanguageStorage(): Nilable<LanguageEnum> {\n const raw = getItem(LANGUAGE_STORAGE_KEY);\n if (raw == null) return raw;\n return (LANGUAGE_VALUES as readonly string[]).includes(raw) ? (raw as LanguageEnum) : undefined;\n}\n\nexport function setLanguageStorage(value: LanguageEnum): void {\n setItem(LANGUAGE_STORAGE_KEY, value);\n}\n\nexport function removeLanguageStorage(): void {\n removeItem(LANGUAGE_STORAGE_KEY);\n}\n","/**\n * i18n 初始化与实例:initI18n 由 LanguageProvider 调用,changeLanguage 供外部切换语言。\n * 默认会合并 NFX-UI 自带的 theme / language / layout / preference 四个命名空间,使用方只需传入自己的 bundles。\n * i18n init and instance: initI18n called by LanguageProvider. Merges built-in theme/language/layout/preference by default.\n */\nimport type { InitI18nOptions } from \"../types\";\n\nimport i18n from \"i18next\";\nimport LanguageDetector from \"i18next-browser-languagedetector\";\nimport { initReactI18next } from \"react-i18next\";\n\nimport { getDefaultNfxBundles } from \"../resources\";\nimport { LanguageEnum, LANGUAGE_STORAGE_KEY, LANGUAGE_VALUES } from \"../types\";\nimport { getLanguageStorage, setLanguageStorage } from \"../utils/languageStorage\";\n\nlet languagePersistAttached = false;\n\n/**\n * 初始化 i18n。会先合并 NFX-UI 自带的四类 JSON(theme/language/layout/preference),再与用户传入的 bundles 合并(用户可覆盖)。\n * Init i18n. Merges built-in NFX bundles (theme, language, layout, preference) with user bundles (user overrides).\n */\nexport function initI18n(options: InitI18nOptions): void {\n /** React StrictMode remounts the provider; i18next 原单例二次 init 会弄乱资源。 */\n if (i18n.isInitialized) {\n return;\n }\n\n const nfx = getDefaultNfxBundles();\n const user = options.bundles;\n const fallbackLng = options.fallbackLng ?? LanguageEnum.ZH;\n\n const RESOURCES = ([LanguageEnum.EN, LanguageEnum.ZH, LanguageEnum.FR] as const).reduce(\n (acc, lang) => ({\n ...acc,\n [lang]: {\n ...(nfx.RESOURCES[lang] ?? {}),\n ...(user.RESOURCES[lang] ?? {}),\n },\n }),\n {} as typeof user.RESOURCES,\n );\n const NAME_SPACES = [...user.NAME_SPACES, ...nfx.NAME_SPACES.filter((n) => !user.NAME_SPACES.includes(n))];\n\n /** Same key as `lookupLocalStorage`: prefer saved choice before navigator. */\n const initialLng = getLanguageStorage() ?? fallbackLng;\n\n const persistLanguage = (lng: string) => {\n const base = lng.split(\"-\")[0]?.toLowerCase() ?? \"\";\n if ((LANGUAGE_VALUES as readonly string[]).includes(base)) {\n setLanguageStorage(base as LanguageEnum);\n }\n };\n\n if (!languagePersistAttached) {\n i18n.on(\"languageChanged\", persistLanguage);\n languagePersistAttached = true;\n }\n\n i18n\n .use(LanguageDetector)\n .use(initReactI18next)\n .init({\n compatibilityJSON: \"v4\",\n resources: RESOURCES,\n lng: initialLng,\n fallbackLng,\n /**\n * 资源只注册 en/zh/fr;.detector 或浏览器会给出 zh-CN、en-US 等,若不收敛则整语言匹配失败 → 界面全是 key。\n * Bundles are only `en` / `zh` / `fr`; normalize regional codes so namespaces resolve.\n */\n supportedLngs: [...LANGUAGE_VALUES],\n load: \"languageOnly\",\n ns: NAME_SPACES,\n defaultNS: NAME_SPACES[0],\n interpolation: { escapeValue: false },\n keySeparator: \".\",\n /**\n * Detector walks `order` and concatenates hits; first candidate wins for resolution.\n * `lookupLocalStorage` must match `getLanguageStorage` / `setLanguageStorage` (LANGUAGE_STORAGE_KEY).\n * Explicit `lng: initialLng` above mirrors that rule so behavior is obvious without reading plugin internals.\n */\n detection: {\n order: [\"localStorage\", \"navigator\", \"htmlTag\", \"path\", \"subdomain\"],\n lookupLocalStorage: LANGUAGE_STORAGE_KEY,\n caches: [\"localStorage\"],\n },\n });\n\n const onLoad = options.onLoadExtraBundles;\n if (onLoad) {\n const toSupported = (lng: string): LanguageEnum => {\n const base = lng.split(\"-\")[0]?.toLowerCase() ?? \"\";\n return (LANGUAGE_VALUES as readonly string[]).includes(base) ? (base as LanguageEnum) : fallbackLng;\n };\n const apply = async (lng: string) => {\n const code = toSupported(lng);\n const result = await onLoad(code);\n if (result == null) return;\n const items = Array.isArray(result) ? result : [result];\n for (const { namespace, bundle } of items) {\n if (namespace && bundle && typeof bundle === \"object\") {\n i18n.addResourceBundle(code, namespace, bundle, true, true);\n }\n }\n };\n void apply(i18n.language || fallbackLng);\n i18n.on(\"languageChanged\", (lng) => void apply(lng));\n }\n}\n\nexport default i18n;\n"],"mappings":"+pDYsBa,EAAiB,CAAC,QAAS,WAAY,SAAU,cACjD,EAAoC,CAC/C,MAAO,QACP,SAAU,WACV,OAAQ,SACR,WAAY,cAGR,GAAmC,CACvC,GAAI,CACF,MAAO,EACP,SAAU,EACV,OAAQ,EACR,WAAY,GAEd,GAAI,CACF,MAAO,GACP,SAAU,EACV,OAAQ,EACR,WAAY,GAEd,GAAI,CACF,MAAO,EACP,SAAU,EACV,OAAQ,EACR,WAAY,IAQhB,SAAgB,GAAkD,CAChE,MAAO,CACL,UAAW,GACX,gBAAiB,EACjB,YAAa,CAAC,GAAG,CAAA,GClDrB,SAAgB,GAA4C,CAC1D,MAAM,EAAM,EAAA,QAAQ,EAAA,oBAAA,EACpB,OAAI,GAAO,MACH,EAAA,gBAAsC,SAAS,CAAA,EAD/B,EAC8D,OAGxF,SAAgB,EAAmB,EAA2B,CAC5D,EAAA,QAAQ,EAAA,qBAAsB,CAAA,EAGhC,SAAgB,IAA8B,CAC5C,EAAA,WAAW,EAAA,oBAAA,ECLb,IAAI,EAA0B,GAM9B,SAAgB,GAAS,EAAgC,CAEvD,GAAI,EAAA,QAAK,cACP,OAGF,MAAM,EAAM,EAAA,EACN,EAAO,EAAQ,QACf,EAAc,EAAQ,aAAe,EAAA,aAAa,GAElD,EAAa,CAAC,EAAA,aAAa,GAAI,EAAA,aAAa,GAAI,EAAA,aAAa,IAAc,OAAA,CAC9E,EAAK,KAAU,CACd,GAAG,GACF,CAAA,EAAO,CACN,GAAI,EAAI,UAAU,CAAA,GAAS,CAAA,EAC3B,GAAI,EAAK,UAAU,CAAA,GAAS,CAAA,KAGhC,CAAA,CAAE,EAEE,EAAc,CAAC,GAAG,EAAK,YAAa,GAAG,EAAI,YAAY,OAAQ,GAAM,CAAC,EAAK,YAAY,SAAS,CAAA,CAAE,CAAC,EAGnG,EAAa,EAAA,GAAwB,EAErC,EAAmB,GAAgB,CACvC,MAAM,EAAO,EAAI,MAAM,GAAA,EAAK,CAAA,GAAI,YAAA,GAAiB,GAC5C,EAAA,gBAAsC,SAAS,CAAA,GAClD,EAAmB,CAAA,GAIlB,IACH,EAAA,QAAK,GAAG,kBAAmB,CAAA,EAC3B,EAA0B,IAG5B,EAAA,QACG,IAAI,EAAA,OAAA,EACJ,IAAI,EAAA,gBAAA,EACJ,KAAK,CACJ,kBAAmB,KACnB,UAAW,EACX,IAAK,EACL,YAAA,EAKA,cAAe,CAAC,GAAG,EAAA,eAAA,EACnB,KAAM,eACN,GAAI,EACJ,UAAW,EAAY,CAAA,EACvB,cAAe,CAAE,YAAa,EAAA,EAC9B,aAAc,IAMd,UAAW,CACT,MAAO,CAAC,eAAgB,YAAa,UAAW,OAAQ,aACxD,mBAAoB,EAAA,qBACpB,OAAQ,CAAC,cAAA,GAEZ,EAEH,MAAM,EAAS,EAAQ,mBACvB,GAAI,EAAQ,CACV,MAAM,EAAe,GAA8B,CACjD,MAAM,EAAO,EAAI,MAAM,GAAA,EAAK,CAAA,GAAI,YAAA,GAAiB,GACjD,OAAQ,EAAA,gBAAsC,SAAS,CAAA,EAAS,EAAwB,GAEpF,EAAQ,MAAO,GAAgB,CACnC,MAAM,EAAO,EAAY,CAAA,EACnB,EAAS,MAAM,EAAO,CAAA,EAC5B,GAAI,GAAU,KAAM,OACpB,MAAM,EAAQ,MAAM,QAAQ,CAAA,EAAU,EAAS,CAAC,CAAA,EAChD,SAAW,CAAE,UAAA,EAAW,OAAA,CAAA,IAAY,EAC9B,GAAa,GAAU,OAAO,GAAW,UAC3C,EAAA,QAAK,kBAAkB,EAAM,EAAW,EAAQ,GAAM,EAAA,GAIvD,EAAM,EAAA,QAAK,UAAY,CAAA,EAC5B,EAAA,QAAK,GAAG,kBAAoB,GAAA,CAAa,EAAM,CAAA,EAAI,GAIvD,IAAA,GAAe,EAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-language-B8sfGadQ.mjs","names":[],"sources":["../src/languages/types/language.ts"],"sourcesContent":["/**\n * 语言枚举与常量,不引用任何 JSON,供需要轻量引用的模块使用。\n * Language enum and constants; no JSON deps for lightweight usage.\n */\nenum LanguageEnum {\n EN = \"en\",\n ZH = \"zh\",\n FR = \"fr\",\n}\n\nconst DEFAULT_LANGUAGE = LanguageEnum.ZH;\nconst LANGUAGE_VALUES = Object.values(LanguageEnum);\nconst LANGUAGE_STORAGE_KEY = \"language-storage\";\n\nexport { LanguageEnum, DEFAULT_LANGUAGE, LANGUAGE_VALUES, LANGUAGE_STORAGE_KEY };\n"],"mappings":"AAIA,IAAK,IAAL,0BAAA,GAAA;AACE,SAAA,EAAA,
|
|
1
|
+
{"version":3,"file":"chunk-language-B8sfGadQ.mjs","names":[],"sources":["../src/languages/types/language.ts"],"sourcesContent":["/**\n * 语言枚举与常量,不引用任何 JSON,供需要轻量引用的模块使用。\n * Language enum and constants; no JSON deps for lightweight usage.\n */\nenum LanguageEnum {\n EN = \"en\",\n ZH = \"zh\",\n FR = \"fr\",\n}\n\nconst DEFAULT_LANGUAGE = LanguageEnum.ZH;\nconst LANGUAGE_VALUES = Object.values(LanguageEnum);\nconst LANGUAGE_STORAGE_KEY = \"language-storage\";\n\nexport { LanguageEnum, DEFAULT_LANGUAGE, LANGUAGE_VALUES, LANGUAGE_STORAGE_KEY };\n"],"mappings":"AAIA,IAAK,IAAL,0BAAA,GAAA;AACE,SAAA,EAAA,KAAK,MACL,EAAA,KAAK,MACL,EAAA,KAAK;GAHF,KAAA,CAAA,CAAA,GAMC,IAAmB,EAAa,IAChC,IAAkB,OAAO,OAAO,CAAA,GAChC,IAAuB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-language-Bqmpuf2W.cjs","names":[],"sources":["../src/languages/types/language.ts"],"sourcesContent":["/**\n * 语言枚举与常量,不引用任何 JSON,供需要轻量引用的模块使用。\n * Language enum and constants; no JSON deps for lightweight usage.\n */\nenum LanguageEnum {\n EN = \"en\",\n ZH = \"zh\",\n FR = \"fr\",\n}\n\nconst DEFAULT_LANGUAGE = LanguageEnum.ZH;\nconst LANGUAGE_VALUES = Object.values(LanguageEnum);\nconst LANGUAGE_STORAGE_KEY = \"language-storage\";\n\nexport { LanguageEnum, DEFAULT_LANGUAGE, LANGUAGE_VALUES, LANGUAGE_STORAGE_KEY };\n"],"mappings":"AAIA,IAAK,GAAL,SAAA,EAAA,CACE,OAAA,EAAA,
|
|
1
|
+
{"version":3,"file":"chunk-language-Bqmpuf2W.cjs","names":[],"sources":["../src/languages/types/language.ts"],"sourcesContent":["/**\n * 语言枚举与常量,不引用任何 JSON,供需要轻量引用的模块使用。\n * Language enum and constants; no JSON deps for lightweight usage.\n */\nenum LanguageEnum {\n EN = \"en\",\n ZH = \"zh\",\n FR = \"fr\",\n}\n\nconst DEFAULT_LANGUAGE = LanguageEnum.ZH;\nconst LANGUAGE_VALUES = Object.values(LanguageEnum);\nconst LANGUAGE_STORAGE_KEY = \"language-storage\";\n\nexport { LanguageEnum, DEFAULT_LANGUAGE, LANGUAGE_VALUES, LANGUAGE_STORAGE_KEY };\n"],"mappings":"AAIA,IAAK,GAAL,SAAA,EAAA,CACE,OAAA,EAAA,GAAK,KACL,EAAA,GAAK,KACL,EAAA,GAAK,SAHF,GAAA,CAAA,CAAA,EAMC,EAAmB,EAAa,GAChC,EAAkB,OAAO,OAAO,CAAA,EAChC,EAAuB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-layout-C2uqDEMJ.mjs","names":[],"sources":["../src/designs/layouts/types/layout.ts"],"sourcesContent":["/**\n * 布局模式枚举与常量。Layout mode enum and constants.\n */\nenum LayoutModeEnum {\n SHOW = \"show\",\n HIDE = \"hide\",\n}\n\nconst DEFAULT_LAYOUT_MODE = LayoutModeEnum.SHOW;\nconst LAYOUT_MODE_VALUES = Object.values(LayoutModeEnum);\nconst LAYOUT_STORAGE_KEY = \"layout-storage\";\n\nexport { LayoutModeEnum, DEFAULT_LAYOUT_MODE, LAYOUT_MODE_VALUES, LAYOUT_STORAGE_KEY };\n"],"mappings":"AAGA,IAAK,IAAL,0BAAA,GAAA;AACE,SAAA,EAAA,
|
|
1
|
+
{"version":3,"file":"chunk-layout-C2uqDEMJ.mjs","names":[],"sources":["../src/designs/layouts/types/layout.ts"],"sourcesContent":["/**\n * 布局模式枚举与常量。Layout mode enum and constants.\n */\nenum LayoutModeEnum {\n SHOW = \"show\",\n HIDE = \"hide\",\n}\n\nconst DEFAULT_LAYOUT_MODE = LayoutModeEnum.SHOW;\nconst LAYOUT_MODE_VALUES = Object.values(LayoutModeEnum);\nconst LAYOUT_STORAGE_KEY = \"layout-storage\";\n\nexport { LayoutModeEnum, DEFAULT_LAYOUT_MODE, LAYOUT_MODE_VALUES, LAYOUT_STORAGE_KEY };\n"],"mappings":"AAGA,IAAK,IAAL,0BAAA,GAAA;AACE,SAAA,EAAA,OAAO,QACP,EAAA,OAAO;GAFJ,KAAA,CAAA,CAAA,GAKC,IAAsB,EAAe,MACrC,IAAqB,OAAO,OAAO,CAAA,GACnC,IAAqB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-layout-D728gccQ.cjs","names":[],"sources":["../src/designs/layouts/types/layout.ts"],"sourcesContent":["/**\n * 布局模式枚举与常量。Layout mode enum and constants.\n */\nenum LayoutModeEnum {\n SHOW = \"show\",\n HIDE = \"hide\",\n}\n\nconst DEFAULT_LAYOUT_MODE = LayoutModeEnum.SHOW;\nconst LAYOUT_MODE_VALUES = Object.values(LayoutModeEnum);\nconst LAYOUT_STORAGE_KEY = \"layout-storage\";\n\nexport { LayoutModeEnum, DEFAULT_LAYOUT_MODE, LAYOUT_MODE_VALUES, LAYOUT_STORAGE_KEY };\n"],"mappings":"AAGA,IAAK,GAAL,SAAA,EAAA,CACE,OAAA,EAAA,
|
|
1
|
+
{"version":3,"file":"chunk-layout-D728gccQ.cjs","names":[],"sources":["../src/designs/layouts/types/layout.ts"],"sourcesContent":["/**\n * 布局模式枚举与常量。Layout mode enum and constants.\n */\nenum LayoutModeEnum {\n SHOW = \"show\",\n HIDE = \"hide\",\n}\n\nconst DEFAULT_LAYOUT_MODE = LayoutModeEnum.SHOW;\nconst LAYOUT_MODE_VALUES = Object.values(LayoutModeEnum);\nconst LAYOUT_STORAGE_KEY = \"layout-storage\";\n\nexport { LayoutModeEnum, DEFAULT_LAYOUT_MODE, LAYOUT_MODE_VALUES, LAYOUT_STORAGE_KEY };\n"],"mappings":"AAGA,IAAK,GAAL,SAAA,EAAA,CACE,OAAA,EAAA,KAAO,OACP,EAAA,KAAO,WAFJ,GAAA,CAAA,CAAA,EAKC,EAAsB,EAAe,KACrC,EAAqB,OAAO,OAAO,CAAA,EACnC,EAAqB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-preference-BWEpbZgC.mjs","names":[],"sources":["../src/preference/constants.ts","../src/preference/index.ts"],"sourcesContent":["/**\n * 用户偏好相关常量:仪表盘背景等\n * Preference-related constants: dashboard background, etc.\n */\n\nimport type { Array } from \"@/types\";\n\n/** 仪表盘背景枚举。Dashboard background enum. */\nexport enum DashboardBackgroundEnum {\n NONE = \"none\",\n WAVES = \"waves\",\n SQUARES = \"squares\",\n LETTER_GLITCH = \"letterGlitch\",\n PIXEL_BLAST = \"pixelBlast\",\n}\n\nexport const DEFAULT_DASHBOARD_BACKGROUND = DashboardBackgroundEnum.NONE;\n\n/** 仪表盘背景可选值列表。Dashboard background values list. */\nexport const DASHBOARD_BACKGROUND_VALUES: Array<DashboardBackgroundEnum> = Object.values(DashboardBackgroundEnum);\n","/**\n * 用户偏好模块:类型、解析/序列化、默认值(与后端 profile.preference JSON 约定)\n * User preference: types, parse/serialize, defaults (backend profile.preference JSON contract).\n */\nimport { LayoutModeEnum } from \"@/designs/layouts/types\";\nimport { LANGUAGE_VALUES, LanguageEnum } from \"@/languages/types\";\nimport { BASE_VALUES, BaseEnum, THEME_VALUES, ThemeEnum } from \"@/themes/types\";\n\nimport { DASHBOARD_BACKGROUND_VALUES, DashboardBackgroundEnum, DEFAULT_DASHBOARD_BACKGROUND } from \"./constants\";\n\nexport { DashboardBackgroundEnum, DEFAULT_DASHBOARD_BACKGROUND, DASHBOARD_BACKGROUND_VALUES } from \"./constants\";\n\n/** 前端统一的偏好结构;后端存为 JSON:theme, base, language, layoutMode, other.dashboardBackground */\nexport type Preference = {\n theme: ThemeEnum;\n base: BaseEnum;\n language: LanguageEnum;\n layoutMode: LayoutModeEnum;\n other?: {\n dashboardBackground: DashboardBackgroundEnum;\n };\n};\n\n/** 后端 JSON 形状(profile.preference 字符串解析后)。Internal backend shape. */\ntype PreferenceBackendShape = {\n theme?: ThemeEnum;\n base?: BaseEnum;\n language?: LanguageEnum;\n layoutMode: LayoutModeEnum;\n other?: Record<string, unknown>;\n};\n\n/**\n * 从后端 preference JSON 解析为前端 Preference,解析失败或空返回 null\n * Parse backend preference JSON to Preference; returns null on empty or parse error.\n * @param json - 后端存的 JSON 字符串\n * @returns Preference 或 null\n */\nexport function parsePreferenceJson(json: string | null | undefined): Preference | null {\n if (!json || typeof json !== \"string\") return null;\n try {\n const raw = JSON.parse(json) as PreferenceBackendShape;\n const layoutMode = raw.layoutMode === LayoutModeEnum.HIDE ? LayoutModeEnum.HIDE : LayoutModeEnum.SHOW;\n const db =\n typeof raw.other?.dashboardBackground === \"string\" && DASHBOARD_BACKGROUND_VALUES.includes(raw.other.dashboardBackground as DashboardBackgroundEnum)\n ? (raw.other.dashboardBackground as DashboardBackgroundEnum)\n : DEFAULT_DASHBOARD_BACKGROUND;\n const base = typeof raw.base === \"string\" && BASE_VALUES.includes(raw.base as BaseEnum) ? (raw.base as BaseEnum) : BaseEnum.DEFAULT;\n const language =\n typeof raw.language === \"string\" && (LANGUAGE_VALUES as string[]).includes(raw.language) ? (raw.language as LanguageEnum) : (\"zh\" as LanguageEnum);\n return {\n theme: typeof raw.theme === \"string\" && THEME_VALUES.includes(raw.theme as ThemeEnum) ? (raw.theme as ThemeEnum) : ThemeEnum.DEFAULT,\n base,\n language,\n layoutMode,\n other: { dashboardBackground: db },\n };\n } catch {\n return null;\n }\n}\n\n/**\n * 将前端 Preference 序列化为后端存的完整 JSON 字符串(每次更新都传完整 JSON)\n * Serialize Preference to backend JSON string (full payload on each update).\n * @param preference - 前端偏好对象\n * @returns JSON 字符串\n */\nexport function preferenceToJson(preference: Preference): string {\n const backend: PreferenceBackendShape = {\n theme: preference.theme || undefined,\n base: preference.base || undefined,\n language: preference.language || undefined,\n layoutMode: preference.layoutMode,\n other: preference.other ? { dashboardBackground: preference.other.dashboardBackground } : undefined,\n };\n return JSON.stringify(backend);\n}\n\n/**\n * 默认偏好(解析不到或同步时兜底):默认中文、default 主题、default base\n * Default preference (fallback when parse fails or for initial sync).\n * @returns 默认 Preference\n */\nexport function getDefaultPreference(): Preference {\n return {\n theme: ThemeEnum.DEFAULT,\n base: BaseEnum.DEFAULT,\n language: LanguageEnum.ZH,\n layoutMode: LayoutModeEnum.SHOW,\n other: { dashboardBackground: DEFAULT_DASHBOARD_BACKGROUND },\n };\n}\n"],"mappings":";;;AAQA,IAAY,IAAL,0BAAA,GAAA;AACL,SAAA,EAAA,
|
|
1
|
+
{"version":3,"file":"chunk-preference-BWEpbZgC.mjs","names":[],"sources":["../src/preference/constants.ts","../src/preference/index.ts"],"sourcesContent":["/**\n * 用户偏好相关常量:仪表盘背景等\n * Preference-related constants: dashboard background, etc.\n */\n\nimport type { Array } from \"@/types\";\n\n/** 仪表盘背景枚举。Dashboard background enum. */\nexport enum DashboardBackgroundEnum {\n NONE = \"none\",\n WAVES = \"waves\",\n SQUARES = \"squares\",\n LETTER_GLITCH = \"letterGlitch\",\n PIXEL_BLAST = \"pixelBlast\",\n}\n\nexport const DEFAULT_DASHBOARD_BACKGROUND = DashboardBackgroundEnum.NONE;\n\n/** 仪表盘背景可选值列表。Dashboard background values list. */\nexport const DASHBOARD_BACKGROUND_VALUES: Array<DashboardBackgroundEnum> = Object.values(DashboardBackgroundEnum);\n","/**\n * 用户偏好模块:类型、解析/序列化、默认值(与后端 profile.preference JSON 约定)\n * User preference: types, parse/serialize, defaults (backend profile.preference JSON contract).\n */\nimport { LayoutModeEnum } from \"@/designs/layouts/types\";\nimport { LANGUAGE_VALUES, LanguageEnum } from \"@/languages/types\";\nimport { BASE_VALUES, BaseEnum, THEME_VALUES, ThemeEnum } from \"@/themes/types\";\n\nimport { DASHBOARD_BACKGROUND_VALUES, DashboardBackgroundEnum, DEFAULT_DASHBOARD_BACKGROUND } from \"./constants\";\n\nexport { DashboardBackgroundEnum, DEFAULT_DASHBOARD_BACKGROUND, DASHBOARD_BACKGROUND_VALUES } from \"./constants\";\n\n/** 前端统一的偏好结构;后端存为 JSON:theme, base, language, layoutMode, other.dashboardBackground */\nexport type Preference = {\n theme: ThemeEnum;\n base: BaseEnum;\n language: LanguageEnum;\n layoutMode: LayoutModeEnum;\n other?: {\n dashboardBackground: DashboardBackgroundEnum;\n };\n};\n\n/** 后端 JSON 形状(profile.preference 字符串解析后)。Internal backend shape. */\ntype PreferenceBackendShape = {\n theme?: ThemeEnum;\n base?: BaseEnum;\n language?: LanguageEnum;\n layoutMode: LayoutModeEnum;\n other?: Record<string, unknown>;\n};\n\n/**\n * 从后端 preference JSON 解析为前端 Preference,解析失败或空返回 null\n * Parse backend preference JSON to Preference; returns null on empty or parse error.\n * @param json - 后端存的 JSON 字符串\n * @returns Preference 或 null\n */\nexport function parsePreferenceJson(json: string | null | undefined): Preference | null {\n if (!json || typeof json !== \"string\") return null;\n try {\n const raw = JSON.parse(json) as PreferenceBackendShape;\n const layoutMode = raw.layoutMode === LayoutModeEnum.HIDE ? LayoutModeEnum.HIDE : LayoutModeEnum.SHOW;\n const db =\n typeof raw.other?.dashboardBackground === \"string\" && DASHBOARD_BACKGROUND_VALUES.includes(raw.other.dashboardBackground as DashboardBackgroundEnum)\n ? (raw.other.dashboardBackground as DashboardBackgroundEnum)\n : DEFAULT_DASHBOARD_BACKGROUND;\n const base = typeof raw.base === \"string\" && BASE_VALUES.includes(raw.base as BaseEnum) ? (raw.base as BaseEnum) : BaseEnum.DEFAULT;\n const language =\n typeof raw.language === \"string\" && (LANGUAGE_VALUES as string[]).includes(raw.language) ? (raw.language as LanguageEnum) : (\"zh\" as LanguageEnum);\n return {\n theme: typeof raw.theme === \"string\" && THEME_VALUES.includes(raw.theme as ThemeEnum) ? (raw.theme as ThemeEnum) : ThemeEnum.DEFAULT,\n base,\n language,\n layoutMode,\n other: { dashboardBackground: db },\n };\n } catch {\n return null;\n }\n}\n\n/**\n * 将前端 Preference 序列化为后端存的完整 JSON 字符串(每次更新都传完整 JSON)\n * Serialize Preference to backend JSON string (full payload on each update).\n * @param preference - 前端偏好对象\n * @returns JSON 字符串\n */\nexport function preferenceToJson(preference: Preference): string {\n const backend: PreferenceBackendShape = {\n theme: preference.theme || undefined,\n base: preference.base || undefined,\n language: preference.language || undefined,\n layoutMode: preference.layoutMode,\n other: preference.other ? { dashboardBackground: preference.other.dashboardBackground } : undefined,\n };\n return JSON.stringify(backend);\n}\n\n/**\n * 默认偏好(解析不到或同步时兜底):默认中文、default 主题、default base\n * Default preference (fallback when parse fails or for initial sync).\n * @returns 默认 Preference\n */\nexport function getDefaultPreference(): Preference {\n return {\n theme: ThemeEnum.DEFAULT,\n base: BaseEnum.DEFAULT,\n language: LanguageEnum.ZH,\n layoutMode: LayoutModeEnum.SHOW,\n other: { dashboardBackground: DEFAULT_DASHBOARD_BACKGROUND },\n };\n}\n"],"mappings":";;;AAQA,IAAY,IAAL,0BAAA,GAAA;AACL,SAAA,EAAA,OAAO,QACP,EAAA,QAAQ,SACR,EAAA,UAAU,WACV,EAAA,gBAAgB,gBAChB,EAAA,cAAc;QAGH,IAA+B,EAAwB,MAGvD,IAA8D,OAAO,OAAO,CAAA;ACmBzF,SAAgB,EAAoB,GAAoD;AACtF,MAAI,CAAC,KAAQ,OAAO,KAAS,SAAU,QAAO;AAC9C,MAAI;AACF,UAAM,IAAM,KAAK,MAAM,CAAA,GACjB,IAAa,EAAI,eAAe,EAAe,OAAO,EAAe,OAAO,EAAe,MAC3F,IACJ,OAAO,EAAI,OAAO,uBAAwB,YAAY,EAA4B,SAAS,EAAI,MAAM,mBAAA,IAChG,EAAI,MAAM,sBACX,GACA,IAAO,OAAO,EAAI,QAAS,YAAY,EAAY,SAAS,EAAI,IAAA,IAAqB,EAAI,OAAoB,EAAS,SACtH,IACJ,OAAO,EAAI,YAAa,YAAa,EAA6B,SAAS,EAAI,QAAA,IAAa,EAAI,WAA6B;AAC/H,WAAO;AAAA,MACL,OAAO,OAAO,EAAI,SAAU,YAAY,EAAa,SAAS,EAAI,KAAA,IAAuB,EAAI,QAAsB,EAAU;AAAA,MAC7H,MAAA;AAAA,MACA,UAAA;AAAA,MACA,YAAA;AAAA,MACA,OAAO,EAAE,qBAAqB,EAAA;AAAA;UAE1B;AACN,WAAO;AAAA;;AAUX,SAAgB,EAAiB,GAAgC;AAC/D,QAAM,IAAkC;AAAA,IACtC,OAAO,EAAW,SAAS;AAAA,IAC3B,MAAM,EAAW,QAAQ;AAAA,IACzB,UAAU,EAAW,YAAY;AAAA,IACjC,YAAY,EAAW;AAAA,IACvB,OAAO,EAAW,QAAQ,EAAE,qBAAqB,EAAW,MAAM,oBAAA,IAAwB;AAAA;AAE5F,SAAO,KAAK,UAAU,CAAA;;AAQxB,SAAgB,IAAmC;AACjD,SAAO;AAAA,IACL,OAAO,EAAU;AAAA,IACjB,MAAM,EAAS;AAAA,IACf,UAAU,EAAa;AAAA,IACvB,YAAY,EAAe;AAAA,IAC3B,OAAO,EAAE,qBAAqB,EAAA;AAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-preference-Dbugm0iQ.cjs","names":[],"sources":["../src/preference/constants.ts","../src/preference/index.ts"],"sourcesContent":["/**\n * 用户偏好相关常量:仪表盘背景等\n * Preference-related constants: dashboard background, etc.\n */\n\nimport type { Array } from \"@/types\";\n\n/** 仪表盘背景枚举。Dashboard background enum. */\nexport enum DashboardBackgroundEnum {\n NONE = \"none\",\n WAVES = \"waves\",\n SQUARES = \"squares\",\n LETTER_GLITCH = \"letterGlitch\",\n PIXEL_BLAST = \"pixelBlast\",\n}\n\nexport const DEFAULT_DASHBOARD_BACKGROUND = DashboardBackgroundEnum.NONE;\n\n/** 仪表盘背景可选值列表。Dashboard background values list. */\nexport const DASHBOARD_BACKGROUND_VALUES: Array<DashboardBackgroundEnum> = Object.values(DashboardBackgroundEnum);\n","/**\n * 用户偏好模块:类型、解析/序列化、默认值(与后端 profile.preference JSON 约定)\n * User preference: types, parse/serialize, defaults (backend profile.preference JSON contract).\n */\nimport { LayoutModeEnum } from \"@/designs/layouts/types\";\nimport { LANGUAGE_VALUES, LanguageEnum } from \"@/languages/types\";\nimport { BASE_VALUES, BaseEnum, THEME_VALUES, ThemeEnum } from \"@/themes/types\";\n\nimport { DASHBOARD_BACKGROUND_VALUES, DashboardBackgroundEnum, DEFAULT_DASHBOARD_BACKGROUND } from \"./constants\";\n\nexport { DashboardBackgroundEnum, DEFAULT_DASHBOARD_BACKGROUND, DASHBOARD_BACKGROUND_VALUES } from \"./constants\";\n\n/** 前端统一的偏好结构;后端存为 JSON:theme, base, language, layoutMode, other.dashboardBackground */\nexport type Preference = {\n theme: ThemeEnum;\n base: BaseEnum;\n language: LanguageEnum;\n layoutMode: LayoutModeEnum;\n other?: {\n dashboardBackground: DashboardBackgroundEnum;\n };\n};\n\n/** 后端 JSON 形状(profile.preference 字符串解析后)。Internal backend shape. */\ntype PreferenceBackendShape = {\n theme?: ThemeEnum;\n base?: BaseEnum;\n language?: LanguageEnum;\n layoutMode: LayoutModeEnum;\n other?: Record<string, unknown>;\n};\n\n/**\n * 从后端 preference JSON 解析为前端 Preference,解析失败或空返回 null\n * Parse backend preference JSON to Preference; returns null on empty or parse error.\n * @param json - 后端存的 JSON 字符串\n * @returns Preference 或 null\n */\nexport function parsePreferenceJson(json: string | null | undefined): Preference | null {\n if (!json || typeof json !== \"string\") return null;\n try {\n const raw = JSON.parse(json) as PreferenceBackendShape;\n const layoutMode = raw.layoutMode === LayoutModeEnum.HIDE ? LayoutModeEnum.HIDE : LayoutModeEnum.SHOW;\n const db =\n typeof raw.other?.dashboardBackground === \"string\" && DASHBOARD_BACKGROUND_VALUES.includes(raw.other.dashboardBackground as DashboardBackgroundEnum)\n ? (raw.other.dashboardBackground as DashboardBackgroundEnum)\n : DEFAULT_DASHBOARD_BACKGROUND;\n const base = typeof raw.base === \"string\" && BASE_VALUES.includes(raw.base as BaseEnum) ? (raw.base as BaseEnum) : BaseEnum.DEFAULT;\n const language =\n typeof raw.language === \"string\" && (LANGUAGE_VALUES as string[]).includes(raw.language) ? (raw.language as LanguageEnum) : (\"zh\" as LanguageEnum);\n return {\n theme: typeof raw.theme === \"string\" && THEME_VALUES.includes(raw.theme as ThemeEnum) ? (raw.theme as ThemeEnum) : ThemeEnum.DEFAULT,\n base,\n language,\n layoutMode,\n other: { dashboardBackground: db },\n };\n } catch {\n return null;\n }\n}\n\n/**\n * 将前端 Preference 序列化为后端存的完整 JSON 字符串(每次更新都传完整 JSON)\n * Serialize Preference to backend JSON string (full payload on each update).\n * @param preference - 前端偏好对象\n * @returns JSON 字符串\n */\nexport function preferenceToJson(preference: Preference): string {\n const backend: PreferenceBackendShape = {\n theme: preference.theme || undefined,\n base: preference.base || undefined,\n language: preference.language || undefined,\n layoutMode: preference.layoutMode,\n other: preference.other ? { dashboardBackground: preference.other.dashboardBackground } : undefined,\n };\n return JSON.stringify(backend);\n}\n\n/**\n * 默认偏好(解析不到或同步时兜底):默认中文、default 主题、default base\n * Default preference (fallback when parse fails or for initial sync).\n * @returns 默认 Preference\n */\nexport function getDefaultPreference(): Preference {\n return {\n theme: ThemeEnum.DEFAULT,\n base: BaseEnum.DEFAULT,\n language: LanguageEnum.ZH,\n layoutMode: LayoutModeEnum.SHOW,\n other: { dashboardBackground: DEFAULT_DASHBOARD_BACKGROUND },\n };\n}\n"],"mappings":"kIAQA,IAAY,GAAL,SAAA,EAAA,CACL,OAAA,EAAA,
|
|
1
|
+
{"version":3,"file":"chunk-preference-Dbugm0iQ.cjs","names":[],"sources":["../src/preference/constants.ts","../src/preference/index.ts"],"sourcesContent":["/**\n * 用户偏好相关常量:仪表盘背景等\n * Preference-related constants: dashboard background, etc.\n */\n\nimport type { Array } from \"@/types\";\n\n/** 仪表盘背景枚举。Dashboard background enum. */\nexport enum DashboardBackgroundEnum {\n NONE = \"none\",\n WAVES = \"waves\",\n SQUARES = \"squares\",\n LETTER_GLITCH = \"letterGlitch\",\n PIXEL_BLAST = \"pixelBlast\",\n}\n\nexport const DEFAULT_DASHBOARD_BACKGROUND = DashboardBackgroundEnum.NONE;\n\n/** 仪表盘背景可选值列表。Dashboard background values list. */\nexport const DASHBOARD_BACKGROUND_VALUES: Array<DashboardBackgroundEnum> = Object.values(DashboardBackgroundEnum);\n","/**\n * 用户偏好模块:类型、解析/序列化、默认值(与后端 profile.preference JSON 约定)\n * User preference: types, parse/serialize, defaults (backend profile.preference JSON contract).\n */\nimport { LayoutModeEnum } from \"@/designs/layouts/types\";\nimport { LANGUAGE_VALUES, LanguageEnum } from \"@/languages/types\";\nimport { BASE_VALUES, BaseEnum, THEME_VALUES, ThemeEnum } from \"@/themes/types\";\n\nimport { DASHBOARD_BACKGROUND_VALUES, DashboardBackgroundEnum, DEFAULT_DASHBOARD_BACKGROUND } from \"./constants\";\n\nexport { DashboardBackgroundEnum, DEFAULT_DASHBOARD_BACKGROUND, DASHBOARD_BACKGROUND_VALUES } from \"./constants\";\n\n/** 前端统一的偏好结构;后端存为 JSON:theme, base, language, layoutMode, other.dashboardBackground */\nexport type Preference = {\n theme: ThemeEnum;\n base: BaseEnum;\n language: LanguageEnum;\n layoutMode: LayoutModeEnum;\n other?: {\n dashboardBackground: DashboardBackgroundEnum;\n };\n};\n\n/** 后端 JSON 形状(profile.preference 字符串解析后)。Internal backend shape. */\ntype PreferenceBackendShape = {\n theme?: ThemeEnum;\n base?: BaseEnum;\n language?: LanguageEnum;\n layoutMode: LayoutModeEnum;\n other?: Record<string, unknown>;\n};\n\n/**\n * 从后端 preference JSON 解析为前端 Preference,解析失败或空返回 null\n * Parse backend preference JSON to Preference; returns null on empty or parse error.\n * @param json - 后端存的 JSON 字符串\n * @returns Preference 或 null\n */\nexport function parsePreferenceJson(json: string | null | undefined): Preference | null {\n if (!json || typeof json !== \"string\") return null;\n try {\n const raw = JSON.parse(json) as PreferenceBackendShape;\n const layoutMode = raw.layoutMode === LayoutModeEnum.HIDE ? LayoutModeEnum.HIDE : LayoutModeEnum.SHOW;\n const db =\n typeof raw.other?.dashboardBackground === \"string\" && DASHBOARD_BACKGROUND_VALUES.includes(raw.other.dashboardBackground as DashboardBackgroundEnum)\n ? (raw.other.dashboardBackground as DashboardBackgroundEnum)\n : DEFAULT_DASHBOARD_BACKGROUND;\n const base = typeof raw.base === \"string\" && BASE_VALUES.includes(raw.base as BaseEnum) ? (raw.base as BaseEnum) : BaseEnum.DEFAULT;\n const language =\n typeof raw.language === \"string\" && (LANGUAGE_VALUES as string[]).includes(raw.language) ? (raw.language as LanguageEnum) : (\"zh\" as LanguageEnum);\n return {\n theme: typeof raw.theme === \"string\" && THEME_VALUES.includes(raw.theme as ThemeEnum) ? (raw.theme as ThemeEnum) : ThemeEnum.DEFAULT,\n base,\n language,\n layoutMode,\n other: { dashboardBackground: db },\n };\n } catch {\n return null;\n }\n}\n\n/**\n * 将前端 Preference 序列化为后端存的完整 JSON 字符串(每次更新都传完整 JSON)\n * Serialize Preference to backend JSON string (full payload on each update).\n * @param preference - 前端偏好对象\n * @returns JSON 字符串\n */\nexport function preferenceToJson(preference: Preference): string {\n const backend: PreferenceBackendShape = {\n theme: preference.theme || undefined,\n base: preference.base || undefined,\n language: preference.language || undefined,\n layoutMode: preference.layoutMode,\n other: preference.other ? { dashboardBackground: preference.other.dashboardBackground } : undefined,\n };\n return JSON.stringify(backend);\n}\n\n/**\n * 默认偏好(解析不到或同步时兜底):默认中文、default 主题、default base\n * Default preference (fallback when parse fails or for initial sync).\n * @returns 默认 Preference\n */\nexport function getDefaultPreference(): Preference {\n return {\n theme: ThemeEnum.DEFAULT,\n base: BaseEnum.DEFAULT,\n language: LanguageEnum.ZH,\n layoutMode: LayoutModeEnum.SHOW,\n other: { dashboardBackground: DEFAULT_DASHBOARD_BACKGROUND },\n };\n}\n"],"mappings":"kIAQA,IAAY,GAAL,SAAA,EAAA,CACL,OAAA,EAAA,KAAO,OACP,EAAA,MAAQ,QACR,EAAA,QAAU,UACV,EAAA,cAAgB,eAChB,EAAA,YAAc,qBAGH,EAA+B,EAAwB,KAGvD,EAA8D,OAAO,OAAO,CAAA,ECmBzF,SAAgB,EAAoB,EAAoD,CACtF,GAAI,CAAC,GAAQ,OAAO,GAAS,SAAU,OAAO,KAC9C,GAAI,CACF,MAAM,EAAM,KAAK,MAAM,CAAA,EACjB,EAAa,EAAI,aAAe,EAAA,eAAe,KAAO,EAAA,eAAe,KAAO,EAAA,eAAe,KAC3F,EACJ,OAAO,EAAI,OAAO,qBAAwB,UAAY,EAA4B,SAAS,EAAI,MAAM,mBAAA,EAChG,EAAI,MAAM,oBACX,EACA,EAAO,OAAO,EAAI,MAAS,UAAY,EAAA,YAAY,SAAS,EAAI,IAAA,EAAqB,EAAI,KAAoB,EAAA,SAAS,QACtH,EACJ,OAAO,EAAI,UAAa,UAAa,EAAA,gBAA6B,SAAS,EAAI,QAAA,EAAa,EAAI,SAA6B,KAC/H,MAAO,CACL,MAAO,OAAO,EAAI,OAAU,UAAY,EAAA,aAAa,SAAS,EAAI,KAAA,EAAuB,EAAI,MAAsB,EAAA,UAAU,QAC7H,KAAA,EACA,SAAA,EACA,WAAA,EACA,MAAO,CAAE,oBAAqB,CAAA,QAE1B,CACN,OAAO,MAUX,SAAgB,EAAiB,EAAgC,CAC/D,MAAM,EAAkC,CACtC,MAAO,EAAW,OAAS,OAC3B,KAAM,EAAW,MAAQ,OACzB,SAAU,EAAW,UAAY,OACjC,WAAY,EAAW,WACvB,MAAO,EAAW,MAAQ,CAAE,oBAAqB,EAAW,MAAM,mBAAA,EAAwB,QAE5F,OAAO,KAAK,UAAU,CAAA,EAQxB,SAAgB,GAAmC,CACjD,MAAO,CACL,MAAO,EAAA,UAAU,QACjB,KAAM,EAAA,SAAS,QACf,SAAU,EAAA,aAAa,GACvB,WAAY,EAAA,eAAe,KAC3B,MAAO,CAAE,oBAAqB,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-theme-9dcwRKw8.mjs","names":[],"sources":["../src/themes/types/theme.ts"],"sourcesContent":["/**\n * 主题相关类型:颜色变量、基础变量、主题枚举与常量。\n * Theme types: color/base variables, theme enums and constants.\n */\n\n/** 颜色变量(主题色、背景、边框、文字、图表等一切与颜色相关) */\nexport interface ColorVariables {\n // ─── 主色 Primary ───────────────────────────────────────────────\n\n /** 主品牌色 — 按钮、链接、激活态 | `--color-primary` */\n primary: string;\n /** 主色悬停 — 按钮 hover / ShowFilter active | `--color-primary-hover` */\n primaryHover: string;\n /** 主色浅色 — 标签底色、浅色按钮、选中态背景 | `--color-primary-light` */\n primaryLight: string;\n /** 主色极浅底 — Input/SearchInput focus 发光底、选中行底 | `--color-primary-bg` */\n primaryBg: string;\n /** 主色 RGB 三元组 — 用于 `rgba(var(--color-primary-rgb), α)` 计算 | `--color-primary-rgb` */\n primaryRgb: string;\n /** 主色半透明 — focus ring 外环、Dropdown 聚焦阴影 | `--color-primary-transparent` `--color-primary-alpha` */\n primaryTransparent: string;\n /** 主色上的前景文字 — 按钮白字 / 深色背景字 | `--color-primary-fg` */\n primaryFg: string;\n\n // ─── 语义色 Semantic ─────────────────────────────────────────────\n\n /** 成功色 — Toast 成功、状态徽标 | `--color-success` */\n success: string;\n /** 成功色浅底 — 成功 Alert 背景 | `--color-success-light` */\n successLight: string;\n /** 成功色 RGB — `rgba(var(--color-success-rgb), α)` | `--color-success-rgb` */\n successRgb: string;\n /** 信息色 — 提示 Alert、Badge | `--color-info` */\n info: string;\n /** 信息色浅底 — 信息 Alert 背景 | `--color-info-light` */\n infoLight: string;\n /** 信息色 RGB — `rgba(var(--color-info-rgb), α)` | `--color-info-rgb` */\n infoRgb: string;\n /** 警告色 — 警告 Toast、图标 | `--color-warning` */\n warning: string;\n /** 警告色浅底 — 警告 Alert 背景 | `--color-warning-light` */\n warningLight: string;\n /** 警告色 RGB — `rgba(var(--color-warning-rgb), α)` | `--color-warning-rgb` */\n warningRgb: string;\n /** 危险色 — 删除按钮、表单错误边框 | `--color-danger` `--color-error` */\n danger: string;\n /** 危险色浅底 — 危险按钮 hover、错误 Alert 底 | `--color-danger-light` */\n dangerLight: string;\n /** 危险色 RGB — Input/Textarea 错误 focus ring | `--color-danger-rgb` `--color-error-rgb` */\n dangerRgb: string;\n\n // ─── 背景 Background ────────────────────────────────────────────\n\n /** 页面底色 — html body、最外层容器 | `--color-bg` `--color-bg-1` */\n bg: string;\n /** 二级背景 — Sidebar、Footer、卡片 | `--color-bg-2` */\n bg2: string;\n /** 三级背景 — 菜单 hover、条纹行 | `--color-bg-3` */\n bg3: string;\n /** 四级背景 — 深层嵌套面板 | `--color-bg-4` */\n bg4: string;\n /** 辅助背景 — Suspense fallback 面板 | `--color-bg-secondary` */\n bgSecondary: string;\n\n // ─── 边框 Border ─────────────────────────────────────────────────\n\n /** 最浅边框 — 容器默认边框 | `--color-border` */\n border: string;\n /** 二级边框 — 分隔线 | `--color-border-2` */\n border2: string;\n /** 三级边框 — Input 非激活边、列表分隔 | `--color-border-3` */\n border3: string;\n /** 四级边框 — Input/Button 默认边框 | `--color-border-4` */\n border4: string;\n /** 五级边框(最深) — disabled Input 边框 | `--color-border-5` */\n border5: string;\n /** 悬停边框 — Suspense retry hover、ShowFilter hover | `--color-border-hover` */\n borderHover: string;\n\n // ─── 前景 / 文字 Foreground ──────────────────────────────────────\n\n /** 辅助图标色 — icon placeholder、ShowFilter 默认色 | `--color-fg` */\n fg: string;\n /** 正文文字 — 段落、表格内容 | `--color-fg-text` */\n fgText: string;\n /** 标题文字 — h1-h6、Input label | `--color-fg-heading` */\n fgHeading: string;\n /** 高亮文字 — 链接、Dropdown 选中项 | `--color-fg-highlight` */\n fgHighlight: string;\n /** 次要文字 — placeholder、hint、辅助说明 | `--color-fg-muted` */\n fgMuted: string;\n /** 主色上的文字 — primary 按钮/Badge 内文字 | `--color-fg-on-primary` */\n fgOnPrimary: string;\n /** 分隔线 — Sidebar 底部分隔、Dropdown 选项间隔 | `--color-separator` */\n separator: string;\n\n // ─── 全局效果 Effects ────────────────────────────────────────────\n\n /** 遮罩层 — Modal/Drawer 背景蒙版 | `--color-overlay` */\n overlay: string;\n /** 阴影色 — 卡片/弹出层 box-shadow 基色 | `--color-shadow` */\n shadow: string;\n /** 焦点环 — 键盘 Tab 导航 focus outline | `--color-ring` */\n ring: string;\n\n // ─── 通用图表系列 Chart Series ───────────────────────────────────\n\n /** 图表系列 1(通常=主色) — 多系列折线/柱状图第 1 组 | `--color-chart-1` */\n chart1: string;\n /** 图表系列 2 — 第 2 组数据线 | `--color-chart-2` */\n chart2: string;\n /** 图表系列 3 — 第 3 组数据线 | `--color-chart-3` */\n chart3: string;\n /** 图表系列 4 — 第 4 组数据线 | `--color-chart-4` */\n chart4: string;\n /** 图表系列 5 — 第 5 组数据线 | `--color-chart-5` */\n chart5: string;\n\n // ─── 专用图表 Specific Charts ────────────────────────────────────\n\n /** 温度计仪表盘 — 圆弧填充渐变(5 色由浅到深)、空弧、滑块 */\n temperature: {\n arcFill: string[];\n arcEmpty: string;\n thumbBg: string;\n thumbBorder: string;\n };\n\n /** 太阳能面板图 — 渐变、阴影、第二系列 */\n solar: {\n gradientLeft: string;\n gradientRight: string;\n shadowColor: string;\n secondSeriesFill: string;\n };\n\n /** 流量图 — tooltip、坐标轴、数据点、渐变 */\n traffic: {\n tooltipBg: string;\n tooltipBorderColor: string;\n tooltipTextColor: string;\n yAxisSplitLine: string;\n lineBg: string;\n itemColor: string;\n itemBorderColor: string;\n itemEmphasisBorderColor: string;\n shadowLineDarkBg: string;\n shadowLineShadow: string;\n gradFrom: string;\n gradTo: string;\n };\n\n /** 电力图 — tooltip、坐标轴、折线渐变、面积渐变 */\n electricity: {\n tooltipBg: string;\n tooltipLineColor: string;\n tooltipBorderColor: string;\n tooltipTextColor: string;\n axisLineColor: string;\n xAxisTextColor: string;\n yAxisSplitLine: string;\n itemBorderColor: string;\n lineGradFrom: string;\n lineGradTo: string;\n lineShadow: string;\n areaGradFrom: string;\n areaGradTo: string;\n shadowLineDarkBg: string;\n };\n\n /** ECharts 全局 — 画布底色、文字、坐标轴、tooltip */\n echarts: {\n bg: string;\n textColor: string;\n axisLineColor: string;\n splitLineColor: string;\n itemHoverShadowColor: string;\n tooltipBackgroundColor: string;\n };\n\n /** Chart.js 全局 — 坐标轴、文字 */\n chartjs: {\n axisLineColor: string;\n textColor: string;\n };\n}\n\n/** 非颜色变量(圆角等,可随平台不同:iOS 24 / Android|Windows 6 / Linux 4) */\nexport interface BaseVariables {\n radius: {\n button: number;\n card: number;\n input: number;\n modal: number;\n badge: number;\n avatar: number;\n };\n\n spacing: {\n xs: number;\n sm: number;\n md: number;\n lg: number;\n xl: number;\n page: number;\n card: number;\n sectionGap: number;\n gridGap: number;\n };\n\n border: {\n thin: number;\n base: number;\n thick: number;\n focusRing: number;\n };\n\n size: {\n buttonSm: number;\n buttonMd: number;\n buttonLg: number;\n inputSm: number;\n inputMd: number;\n inputLg: number;\n navbarHeight: number;\n sidebarWidth: number;\n };\n\n typography: {\n fontFamilyBase: string;\n fontFamilyHeading: string;\n fontSizeXs: number;\n fontSizeSm: number;\n fontSizeMd: number;\n fontSizeLg: number;\n fontSizeXl: number;\n fontWeightNormal: number;\n fontWeightMedium: number;\n fontWeightBold: number;\n lineHeightBase: number;\n };\n\n motion: {\n fast: number;\n base: number;\n slow: number;\n easingStandard: string;\n };\n\n zIndex: {\n dropdown: number;\n sticky: number;\n modal: number;\n toast: number;\n tooltip: number;\n };\n}\n\n/** 颜色主题:name/displayName 表示这套配色是谁 */\nexport interface ColorTheme {\n name: string;\n displayName: string;\n variables: ColorVariables;\n}\n\n/** 基础主题:name/displayName 表示这套基础规范是谁(如 iOS / Android / 默认) */\nexport interface BaseTheme {\n name: string;\n displayName: string;\n variables: BaseVariables;\n}\n\n/** 完整主题 = 颜色主题 + 基础主题 */\nexport interface Theme {\n colors: ColorTheme;\n base: BaseTheme;\n}\n\n/** 颜色主题枚举 */\nexport enum ThemeEnum {\n DEFAULT = \"default\",\n LIGHT = \"light\",\n CORPORATE = \"corporate\",\n FOREST = \"forest\",\n DARK = \"dark\",\n COSMIC = \"cosmic\",\n COFFEE = \"coffee\",\n WINE = \"wine\",\n WHEAT = \"wheat\",\n}\n\nexport const DEFAULT_THEME = ThemeEnum.DEFAULT;\nexport const THEME_VALUES = Object.values(ThemeEnum);\n\n/** 基础主题枚举(平台/圆角等,如 iOS 24 / Android|Windows 6 / Linux 4) */\nexport enum BaseEnum {\n DEFAULT = \"default\",\n IOS = \"ios\",\n ANDROID = \"android\",\n WINDOWS = \"windows\",\n LINUX = \"linux\",\n}\n\nexport const DEFAULT_BASE = BaseEnum.DEFAULT;\nexport const BASE_VALUES = Object.values(BaseEnum);\n\nexport const COLOR_STORAGE_KEY = \"theme-color\";\nexport const BASE_STORAGE_KEY = \"theme-base\";\n"],"mappings":"AAuRA,IAAY,IAAL,0BAAA,GAAA;AACL,SAAA,EAAA,
|
|
1
|
+
{"version":3,"file":"chunk-theme-9dcwRKw8.mjs","names":[],"sources":["../src/themes/types/theme.ts"],"sourcesContent":["/**\n * 主题相关类型:颜色变量、基础变量、主题枚举与常量。\n * Theme types: color/base variables, theme enums and constants.\n */\n\n/** 颜色变量(主题色、背景、边框、文字、图表等一切与颜色相关) */\nexport interface ColorVariables {\n // ─── 主色 Primary ───────────────────────────────────────────────\n\n /** 主品牌色 — 按钮、链接、激活态 | `--color-primary` */\n primary: string;\n /** 主色悬停 — 按钮 hover / ShowFilter active | `--color-primary-hover` */\n primaryHover: string;\n /** 主色浅色 — 标签底色、浅色按钮、选中态背景 | `--color-primary-light` */\n primaryLight: string;\n /** 主色极浅底 — Input/SearchInput focus 发光底、选中行底 | `--color-primary-bg` */\n primaryBg: string;\n /** 主色 RGB 三元组 — 用于 `rgba(var(--color-primary-rgb), α)` 计算 | `--color-primary-rgb` */\n primaryRgb: string;\n /** 主色半透明 — focus ring 外环、Dropdown 聚焦阴影 | `--color-primary-transparent` `--color-primary-alpha` */\n primaryTransparent: string;\n /** 主色上的前景文字 — 按钮白字 / 深色背景字 | `--color-primary-fg` */\n primaryFg: string;\n\n // ─── 语义色 Semantic ─────────────────────────────────────────────\n\n /** 成功色 — Toast 成功、状态徽标 | `--color-success` */\n success: string;\n /** 成功色浅底 — 成功 Alert 背景 | `--color-success-light` */\n successLight: string;\n /** 成功色 RGB — `rgba(var(--color-success-rgb), α)` | `--color-success-rgb` */\n successRgb: string;\n /** 信息色 — 提示 Alert、Badge | `--color-info` */\n info: string;\n /** 信息色浅底 — 信息 Alert 背景 | `--color-info-light` */\n infoLight: string;\n /** 信息色 RGB — `rgba(var(--color-info-rgb), α)` | `--color-info-rgb` */\n infoRgb: string;\n /** 警告色 — 警告 Toast、图标 | `--color-warning` */\n warning: string;\n /** 警告色浅底 — 警告 Alert 背景 | `--color-warning-light` */\n warningLight: string;\n /** 警告色 RGB — `rgba(var(--color-warning-rgb), α)` | `--color-warning-rgb` */\n warningRgb: string;\n /** 危险色 — 删除按钮、表单错误边框 | `--color-danger` `--color-error` */\n danger: string;\n /** 危险色浅底 — 危险按钮 hover、错误 Alert 底 | `--color-danger-light` */\n dangerLight: string;\n /** 危险色 RGB — Input/Textarea 错误 focus ring | `--color-danger-rgb` `--color-error-rgb` */\n dangerRgb: string;\n\n // ─── 背景 Background ────────────────────────────────────────────\n\n /** 页面底色 — html body、最外层容器 | `--color-bg` `--color-bg-1` */\n bg: string;\n /** 二级背景 — Sidebar、Footer、卡片 | `--color-bg-2` */\n bg2: string;\n /** 三级背景 — 菜单 hover、条纹行 | `--color-bg-3` */\n bg3: string;\n /** 四级背景 — 深层嵌套面板 | `--color-bg-4` */\n bg4: string;\n /** 辅助背景 — Suspense fallback 面板 | `--color-bg-secondary` */\n bgSecondary: string;\n\n // ─── 边框 Border ─────────────────────────────────────────────────\n\n /** 最浅边框 — 容器默认边框 | `--color-border` */\n border: string;\n /** 二级边框 — 分隔线 | `--color-border-2` */\n border2: string;\n /** 三级边框 — Input 非激活边、列表分隔 | `--color-border-3` */\n border3: string;\n /** 四级边框 — Input/Button 默认边框 | `--color-border-4` */\n border4: string;\n /** 五级边框(最深) — disabled Input 边框 | `--color-border-5` */\n border5: string;\n /** 悬停边框 — Suspense retry hover、ShowFilter hover | `--color-border-hover` */\n borderHover: string;\n\n // ─── 前景 / 文字 Foreground ──────────────────────────────────────\n\n /** 辅助图标色 — icon placeholder、ShowFilter 默认色 | `--color-fg` */\n fg: string;\n /** 正文文字 — 段落、表格内容 | `--color-fg-text` */\n fgText: string;\n /** 标题文字 — h1-h6、Input label | `--color-fg-heading` */\n fgHeading: string;\n /** 高亮文字 — 链接、Dropdown 选中项 | `--color-fg-highlight` */\n fgHighlight: string;\n /** 次要文字 — placeholder、hint、辅助说明 | `--color-fg-muted` */\n fgMuted: string;\n /** 主色上的文字 — primary 按钮/Badge 内文字 | `--color-fg-on-primary` */\n fgOnPrimary: string;\n /** 分隔线 — Sidebar 底部分隔、Dropdown 选项间隔 | `--color-separator` */\n separator: string;\n\n // ─── 全局效果 Effects ────────────────────────────────────────────\n\n /** 遮罩层 — Modal/Drawer 背景蒙版 | `--color-overlay` */\n overlay: string;\n /** 阴影色 — 卡片/弹出层 box-shadow 基色 | `--color-shadow` */\n shadow: string;\n /** 焦点环 — 键盘 Tab 导航 focus outline | `--color-ring` */\n ring: string;\n\n // ─── 通用图表系列 Chart Series ───────────────────────────────────\n\n /** 图表系列 1(通常=主色) — 多系列折线/柱状图第 1 组 | `--color-chart-1` */\n chart1: string;\n /** 图表系列 2 — 第 2 组数据线 | `--color-chart-2` */\n chart2: string;\n /** 图表系列 3 — 第 3 组数据线 | `--color-chart-3` */\n chart3: string;\n /** 图表系列 4 — 第 4 组数据线 | `--color-chart-4` */\n chart4: string;\n /** 图表系列 5 — 第 5 组数据线 | `--color-chart-5` */\n chart5: string;\n\n // ─── 专用图表 Specific Charts ────────────────────────────────────\n\n /** 温度计仪表盘 — 圆弧填充渐变(5 色由浅到深)、空弧、滑块 */\n temperature: {\n arcFill: string[];\n arcEmpty: string;\n thumbBg: string;\n thumbBorder: string;\n };\n\n /** 太阳能面板图 — 渐变、阴影、第二系列 */\n solar: {\n gradientLeft: string;\n gradientRight: string;\n shadowColor: string;\n secondSeriesFill: string;\n };\n\n /** 流量图 — tooltip、坐标轴、数据点、渐变 */\n traffic: {\n tooltipBg: string;\n tooltipBorderColor: string;\n tooltipTextColor: string;\n yAxisSplitLine: string;\n lineBg: string;\n itemColor: string;\n itemBorderColor: string;\n itemEmphasisBorderColor: string;\n shadowLineDarkBg: string;\n shadowLineShadow: string;\n gradFrom: string;\n gradTo: string;\n };\n\n /** 电力图 — tooltip、坐标轴、折线渐变、面积渐变 */\n electricity: {\n tooltipBg: string;\n tooltipLineColor: string;\n tooltipBorderColor: string;\n tooltipTextColor: string;\n axisLineColor: string;\n xAxisTextColor: string;\n yAxisSplitLine: string;\n itemBorderColor: string;\n lineGradFrom: string;\n lineGradTo: string;\n lineShadow: string;\n areaGradFrom: string;\n areaGradTo: string;\n shadowLineDarkBg: string;\n };\n\n /** ECharts 全局 — 画布底色、文字、坐标轴、tooltip */\n echarts: {\n bg: string;\n textColor: string;\n axisLineColor: string;\n splitLineColor: string;\n itemHoverShadowColor: string;\n tooltipBackgroundColor: string;\n };\n\n /** Chart.js 全局 — 坐标轴、文字 */\n chartjs: {\n axisLineColor: string;\n textColor: string;\n };\n}\n\n/** 非颜色变量(圆角等,可随平台不同:iOS 24 / Android|Windows 6 / Linux 4) */\nexport interface BaseVariables {\n radius: {\n button: number;\n card: number;\n input: number;\n modal: number;\n badge: number;\n avatar: number;\n };\n\n spacing: {\n xs: number;\n sm: number;\n md: number;\n lg: number;\n xl: number;\n page: number;\n card: number;\n sectionGap: number;\n gridGap: number;\n };\n\n border: {\n thin: number;\n base: number;\n thick: number;\n focusRing: number;\n };\n\n size: {\n buttonSm: number;\n buttonMd: number;\n buttonLg: number;\n inputSm: number;\n inputMd: number;\n inputLg: number;\n navbarHeight: number;\n sidebarWidth: number;\n };\n\n typography: {\n fontFamilyBase: string;\n fontFamilyHeading: string;\n fontSizeXs: number;\n fontSizeSm: number;\n fontSizeMd: number;\n fontSizeLg: number;\n fontSizeXl: number;\n fontWeightNormal: number;\n fontWeightMedium: number;\n fontWeightBold: number;\n lineHeightBase: number;\n };\n\n motion: {\n fast: number;\n base: number;\n slow: number;\n easingStandard: string;\n };\n\n zIndex: {\n dropdown: number;\n sticky: number;\n modal: number;\n toast: number;\n tooltip: number;\n };\n}\n\n/** 颜色主题:name/displayName 表示这套配色是谁 */\nexport interface ColorTheme {\n name: string;\n displayName: string;\n variables: ColorVariables;\n}\n\n/** 基础主题:name/displayName 表示这套基础规范是谁(如 iOS / Android / 默认) */\nexport interface BaseTheme {\n name: string;\n displayName: string;\n variables: BaseVariables;\n}\n\n/** 完整主题 = 颜色主题 + 基础主题 */\nexport interface Theme {\n colors: ColorTheme;\n base: BaseTheme;\n}\n\n/** 颜色主题枚举 */\nexport enum ThemeEnum {\n DEFAULT = \"default\",\n LIGHT = \"light\",\n CORPORATE = \"corporate\",\n FOREST = \"forest\",\n DARK = \"dark\",\n COSMIC = \"cosmic\",\n COFFEE = \"coffee\",\n WINE = \"wine\",\n WHEAT = \"wheat\",\n}\n\nexport const DEFAULT_THEME = ThemeEnum.DEFAULT;\nexport const THEME_VALUES = Object.values(ThemeEnum);\n\n/** 基础主题枚举(平台/圆角等,如 iOS 24 / Android|Windows 6 / Linux 4) */\nexport enum BaseEnum {\n DEFAULT = \"default\",\n IOS = \"ios\",\n ANDROID = \"android\",\n WINDOWS = \"windows\",\n LINUX = \"linux\",\n}\n\nexport const DEFAULT_BASE = BaseEnum.DEFAULT;\nexport const BASE_VALUES = Object.values(BaseEnum);\n\nexport const COLOR_STORAGE_KEY = \"theme-color\";\nexport const BASE_STORAGE_KEY = \"theme-base\";\n"],"mappings":"AAuRA,IAAY,IAAL,0BAAA,GAAA;AACL,SAAA,EAAA,UAAU,WACV,EAAA,QAAQ,SACR,EAAA,YAAY,aACZ,EAAA,SAAS,UACT,EAAA,OAAO,QACP,EAAA,SAAS,UACT,EAAA,SAAS,UACT,EAAA,OAAO,QACP,EAAA,QAAQ;QAGG,IAAgB,EAAU,SAC1B,IAAe,OAAO,OAAO,CAAA,GAG9B,IAAL,0BAAA,GAAA;AACL,SAAA,EAAA,UAAU,WACV,EAAA,MAAM,OACN,EAAA,UAAU,WACV,EAAA,UAAU,WACV,EAAA,QAAQ;QAGG,IAAe,EAAS,SACxB,IAAc,OAAO,OAAO,CAAA,GAE5B,IAAoB,eACpB,IAAmB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk-theme-BFvDRCYS.cjs","names":[],"sources":["../src/themes/types/theme.ts"],"sourcesContent":["/**\n * 主题相关类型:颜色变量、基础变量、主题枚举与常量。\n * Theme types: color/base variables, theme enums and constants.\n */\n\n/** 颜色变量(主题色、背景、边框、文字、图表等一切与颜色相关) */\nexport interface ColorVariables {\n // ─── 主色 Primary ───────────────────────────────────────────────\n\n /** 主品牌色 — 按钮、链接、激活态 | `--color-primary` */\n primary: string;\n /** 主色悬停 — 按钮 hover / ShowFilter active | `--color-primary-hover` */\n primaryHover: string;\n /** 主色浅色 — 标签底色、浅色按钮、选中态背景 | `--color-primary-light` */\n primaryLight: string;\n /** 主色极浅底 — Input/SearchInput focus 发光底、选中行底 | `--color-primary-bg` */\n primaryBg: string;\n /** 主色 RGB 三元组 — 用于 `rgba(var(--color-primary-rgb), α)` 计算 | `--color-primary-rgb` */\n primaryRgb: string;\n /** 主色半透明 — focus ring 外环、Dropdown 聚焦阴影 | `--color-primary-transparent` `--color-primary-alpha` */\n primaryTransparent: string;\n /** 主色上的前景文字 — 按钮白字 / 深色背景字 | `--color-primary-fg` */\n primaryFg: string;\n\n // ─── 语义色 Semantic ─────────────────────────────────────────────\n\n /** 成功色 — Toast 成功、状态徽标 | `--color-success` */\n success: string;\n /** 成功色浅底 — 成功 Alert 背景 | `--color-success-light` */\n successLight: string;\n /** 成功色 RGB — `rgba(var(--color-success-rgb), α)` | `--color-success-rgb` */\n successRgb: string;\n /** 信息色 — 提示 Alert、Badge | `--color-info` */\n info: string;\n /** 信息色浅底 — 信息 Alert 背景 | `--color-info-light` */\n infoLight: string;\n /** 信息色 RGB — `rgba(var(--color-info-rgb), α)` | `--color-info-rgb` */\n infoRgb: string;\n /** 警告色 — 警告 Toast、图标 | `--color-warning` */\n warning: string;\n /** 警告色浅底 — 警告 Alert 背景 | `--color-warning-light` */\n warningLight: string;\n /** 警告色 RGB — `rgba(var(--color-warning-rgb), α)` | `--color-warning-rgb` */\n warningRgb: string;\n /** 危险色 — 删除按钮、表单错误边框 | `--color-danger` `--color-error` */\n danger: string;\n /** 危险色浅底 — 危险按钮 hover、错误 Alert 底 | `--color-danger-light` */\n dangerLight: string;\n /** 危险色 RGB — Input/Textarea 错误 focus ring | `--color-danger-rgb` `--color-error-rgb` */\n dangerRgb: string;\n\n // ─── 背景 Background ────────────────────────────────────────────\n\n /** 页面底色 — html body、最外层容器 | `--color-bg` `--color-bg-1` */\n bg: string;\n /** 二级背景 — Sidebar、Footer、卡片 | `--color-bg-2` */\n bg2: string;\n /** 三级背景 — 菜单 hover、条纹行 | `--color-bg-3` */\n bg3: string;\n /** 四级背景 — 深层嵌套面板 | `--color-bg-4` */\n bg4: string;\n /** 辅助背景 — Suspense fallback 面板 | `--color-bg-secondary` */\n bgSecondary: string;\n\n // ─── 边框 Border ─────────────────────────────────────────────────\n\n /** 最浅边框 — 容器默认边框 | `--color-border` */\n border: string;\n /** 二级边框 — 分隔线 | `--color-border-2` */\n border2: string;\n /** 三级边框 — Input 非激活边、列表分隔 | `--color-border-3` */\n border3: string;\n /** 四级边框 — Input/Button 默认边框 | `--color-border-4` */\n border4: string;\n /** 五级边框(最深) — disabled Input 边框 | `--color-border-5` */\n border5: string;\n /** 悬停边框 — Suspense retry hover、ShowFilter hover | `--color-border-hover` */\n borderHover: string;\n\n // ─── 前景 / 文字 Foreground ──────────────────────────────────────\n\n /** 辅助图标色 — icon placeholder、ShowFilter 默认色 | `--color-fg` */\n fg: string;\n /** 正文文字 — 段落、表格内容 | `--color-fg-text` */\n fgText: string;\n /** 标题文字 — h1-h6、Input label | `--color-fg-heading` */\n fgHeading: string;\n /** 高亮文字 — 链接、Dropdown 选中项 | `--color-fg-highlight` */\n fgHighlight: string;\n /** 次要文字 — placeholder、hint、辅助说明 | `--color-fg-muted` */\n fgMuted: string;\n /** 主色上的文字 — primary 按钮/Badge 内文字 | `--color-fg-on-primary` */\n fgOnPrimary: string;\n /** 分隔线 — Sidebar 底部分隔、Dropdown 选项间隔 | `--color-separator` */\n separator: string;\n\n // ─── 全局效果 Effects ────────────────────────────────────────────\n\n /** 遮罩层 — Modal/Drawer 背景蒙版 | `--color-overlay` */\n overlay: string;\n /** 阴影色 — 卡片/弹出层 box-shadow 基色 | `--color-shadow` */\n shadow: string;\n /** 焦点环 — 键盘 Tab 导航 focus outline | `--color-ring` */\n ring: string;\n\n // ─── 通用图表系列 Chart Series ───────────────────────────────────\n\n /** 图表系列 1(通常=主色) — 多系列折线/柱状图第 1 组 | `--color-chart-1` */\n chart1: string;\n /** 图表系列 2 — 第 2 组数据线 | `--color-chart-2` */\n chart2: string;\n /** 图表系列 3 — 第 3 组数据线 | `--color-chart-3` */\n chart3: string;\n /** 图表系列 4 — 第 4 组数据线 | `--color-chart-4` */\n chart4: string;\n /** 图表系列 5 — 第 5 组数据线 | `--color-chart-5` */\n chart5: string;\n\n // ─── 专用图表 Specific Charts ────────────────────────────────────\n\n /** 温度计仪表盘 — 圆弧填充渐变(5 色由浅到深)、空弧、滑块 */\n temperature: {\n arcFill: string[];\n arcEmpty: string;\n thumbBg: string;\n thumbBorder: string;\n };\n\n /** 太阳能面板图 — 渐变、阴影、第二系列 */\n solar: {\n gradientLeft: string;\n gradientRight: string;\n shadowColor: string;\n secondSeriesFill: string;\n };\n\n /** 流量图 — tooltip、坐标轴、数据点、渐变 */\n traffic: {\n tooltipBg: string;\n tooltipBorderColor: string;\n tooltipTextColor: string;\n yAxisSplitLine: string;\n lineBg: string;\n itemColor: string;\n itemBorderColor: string;\n itemEmphasisBorderColor: string;\n shadowLineDarkBg: string;\n shadowLineShadow: string;\n gradFrom: string;\n gradTo: string;\n };\n\n /** 电力图 — tooltip、坐标轴、折线渐变、面积渐变 */\n electricity: {\n tooltipBg: string;\n tooltipLineColor: string;\n tooltipBorderColor: string;\n tooltipTextColor: string;\n axisLineColor: string;\n xAxisTextColor: string;\n yAxisSplitLine: string;\n itemBorderColor: string;\n lineGradFrom: string;\n lineGradTo: string;\n lineShadow: string;\n areaGradFrom: string;\n areaGradTo: string;\n shadowLineDarkBg: string;\n };\n\n /** ECharts 全局 — 画布底色、文字、坐标轴、tooltip */\n echarts: {\n bg: string;\n textColor: string;\n axisLineColor: string;\n splitLineColor: string;\n itemHoverShadowColor: string;\n tooltipBackgroundColor: string;\n };\n\n /** Chart.js 全局 — 坐标轴、文字 */\n chartjs: {\n axisLineColor: string;\n textColor: string;\n };\n}\n\n/** 非颜色变量(圆角等,可随平台不同:iOS 24 / Android|Windows 6 / Linux 4) */\nexport interface BaseVariables {\n radius: {\n button: number;\n card: number;\n input: number;\n modal: number;\n badge: number;\n avatar: number;\n };\n\n spacing: {\n xs: number;\n sm: number;\n md: number;\n lg: number;\n xl: number;\n page: number;\n card: number;\n sectionGap: number;\n gridGap: number;\n };\n\n border: {\n thin: number;\n base: number;\n thick: number;\n focusRing: number;\n };\n\n size: {\n buttonSm: number;\n buttonMd: number;\n buttonLg: number;\n inputSm: number;\n inputMd: number;\n inputLg: number;\n navbarHeight: number;\n sidebarWidth: number;\n };\n\n typography: {\n fontFamilyBase: string;\n fontFamilyHeading: string;\n fontSizeXs: number;\n fontSizeSm: number;\n fontSizeMd: number;\n fontSizeLg: number;\n fontSizeXl: number;\n fontWeightNormal: number;\n fontWeightMedium: number;\n fontWeightBold: number;\n lineHeightBase: number;\n };\n\n motion: {\n fast: number;\n base: number;\n slow: number;\n easingStandard: string;\n };\n\n zIndex: {\n dropdown: number;\n sticky: number;\n modal: number;\n toast: number;\n tooltip: number;\n };\n}\n\n/** 颜色主题:name/displayName 表示这套配色是谁 */\nexport interface ColorTheme {\n name: string;\n displayName: string;\n variables: ColorVariables;\n}\n\n/** 基础主题:name/displayName 表示这套基础规范是谁(如 iOS / Android / 默认) */\nexport interface BaseTheme {\n name: string;\n displayName: string;\n variables: BaseVariables;\n}\n\n/** 完整主题 = 颜色主题 + 基础主题 */\nexport interface Theme {\n colors: ColorTheme;\n base: BaseTheme;\n}\n\n/** 颜色主题枚举 */\nexport enum ThemeEnum {\n DEFAULT = \"default\",\n LIGHT = \"light\",\n CORPORATE = \"corporate\",\n FOREST = \"forest\",\n DARK = \"dark\",\n COSMIC = \"cosmic\",\n COFFEE = \"coffee\",\n WINE = \"wine\",\n WHEAT = \"wheat\",\n}\n\nexport const DEFAULT_THEME = ThemeEnum.DEFAULT;\nexport const THEME_VALUES = Object.values(ThemeEnum);\n\n/** 基础主题枚举(平台/圆角等,如 iOS 24 / Android|Windows 6 / Linux 4) */\nexport enum BaseEnum {\n DEFAULT = \"default\",\n IOS = \"ios\",\n ANDROID = \"android\",\n WINDOWS = \"windows\",\n LINUX = \"linux\",\n}\n\nexport const DEFAULT_BASE = BaseEnum.DEFAULT;\nexport const BASE_VALUES = Object.values(BaseEnum);\n\nexport const COLOR_STORAGE_KEY = \"theme-color\";\nexport const BASE_STORAGE_KEY = \"theme-base\";\n"],"mappings":"AAuRA,IAAY,GAAL,SAAA,EAAA,CACL,OAAA,EAAA,
|
|
1
|
+
{"version":3,"file":"chunk-theme-BFvDRCYS.cjs","names":[],"sources":["../src/themes/types/theme.ts"],"sourcesContent":["/**\n * 主题相关类型:颜色变量、基础变量、主题枚举与常量。\n * Theme types: color/base variables, theme enums and constants.\n */\n\n/** 颜色变量(主题色、背景、边框、文字、图表等一切与颜色相关) */\nexport interface ColorVariables {\n // ─── 主色 Primary ───────────────────────────────────────────────\n\n /** 主品牌色 — 按钮、链接、激活态 | `--color-primary` */\n primary: string;\n /** 主色悬停 — 按钮 hover / ShowFilter active | `--color-primary-hover` */\n primaryHover: string;\n /** 主色浅色 — 标签底色、浅色按钮、选中态背景 | `--color-primary-light` */\n primaryLight: string;\n /** 主色极浅底 — Input/SearchInput focus 发光底、选中行底 | `--color-primary-bg` */\n primaryBg: string;\n /** 主色 RGB 三元组 — 用于 `rgba(var(--color-primary-rgb), α)` 计算 | `--color-primary-rgb` */\n primaryRgb: string;\n /** 主色半透明 — focus ring 外环、Dropdown 聚焦阴影 | `--color-primary-transparent` `--color-primary-alpha` */\n primaryTransparent: string;\n /** 主色上的前景文字 — 按钮白字 / 深色背景字 | `--color-primary-fg` */\n primaryFg: string;\n\n // ─── 语义色 Semantic ─────────────────────────────────────────────\n\n /** 成功色 — Toast 成功、状态徽标 | `--color-success` */\n success: string;\n /** 成功色浅底 — 成功 Alert 背景 | `--color-success-light` */\n successLight: string;\n /** 成功色 RGB — `rgba(var(--color-success-rgb), α)` | `--color-success-rgb` */\n successRgb: string;\n /** 信息色 — 提示 Alert、Badge | `--color-info` */\n info: string;\n /** 信息色浅底 — 信息 Alert 背景 | `--color-info-light` */\n infoLight: string;\n /** 信息色 RGB — `rgba(var(--color-info-rgb), α)` | `--color-info-rgb` */\n infoRgb: string;\n /** 警告色 — 警告 Toast、图标 | `--color-warning` */\n warning: string;\n /** 警告色浅底 — 警告 Alert 背景 | `--color-warning-light` */\n warningLight: string;\n /** 警告色 RGB — `rgba(var(--color-warning-rgb), α)` | `--color-warning-rgb` */\n warningRgb: string;\n /** 危险色 — 删除按钮、表单错误边框 | `--color-danger` `--color-error` */\n danger: string;\n /** 危险色浅底 — 危险按钮 hover、错误 Alert 底 | `--color-danger-light` */\n dangerLight: string;\n /** 危险色 RGB — Input/Textarea 错误 focus ring | `--color-danger-rgb` `--color-error-rgb` */\n dangerRgb: string;\n\n // ─── 背景 Background ────────────────────────────────────────────\n\n /** 页面底色 — html body、最外层容器 | `--color-bg` `--color-bg-1` */\n bg: string;\n /** 二级背景 — Sidebar、Footer、卡片 | `--color-bg-2` */\n bg2: string;\n /** 三级背景 — 菜单 hover、条纹行 | `--color-bg-3` */\n bg3: string;\n /** 四级背景 — 深层嵌套面板 | `--color-bg-4` */\n bg4: string;\n /** 辅助背景 — Suspense fallback 面板 | `--color-bg-secondary` */\n bgSecondary: string;\n\n // ─── 边框 Border ─────────────────────────────────────────────────\n\n /** 最浅边框 — 容器默认边框 | `--color-border` */\n border: string;\n /** 二级边框 — 分隔线 | `--color-border-2` */\n border2: string;\n /** 三级边框 — Input 非激活边、列表分隔 | `--color-border-3` */\n border3: string;\n /** 四级边框 — Input/Button 默认边框 | `--color-border-4` */\n border4: string;\n /** 五级边框(最深) — disabled Input 边框 | `--color-border-5` */\n border5: string;\n /** 悬停边框 — Suspense retry hover、ShowFilter hover | `--color-border-hover` */\n borderHover: string;\n\n // ─── 前景 / 文字 Foreground ──────────────────────────────────────\n\n /** 辅助图标色 — icon placeholder、ShowFilter 默认色 | `--color-fg` */\n fg: string;\n /** 正文文字 — 段落、表格内容 | `--color-fg-text` */\n fgText: string;\n /** 标题文字 — h1-h6、Input label | `--color-fg-heading` */\n fgHeading: string;\n /** 高亮文字 — 链接、Dropdown 选中项 | `--color-fg-highlight` */\n fgHighlight: string;\n /** 次要文字 — placeholder、hint、辅助说明 | `--color-fg-muted` */\n fgMuted: string;\n /** 主色上的文字 — primary 按钮/Badge 内文字 | `--color-fg-on-primary` */\n fgOnPrimary: string;\n /** 分隔线 — Sidebar 底部分隔、Dropdown 选项间隔 | `--color-separator` */\n separator: string;\n\n // ─── 全局效果 Effects ────────────────────────────────────────────\n\n /** 遮罩层 — Modal/Drawer 背景蒙版 | `--color-overlay` */\n overlay: string;\n /** 阴影色 — 卡片/弹出层 box-shadow 基色 | `--color-shadow` */\n shadow: string;\n /** 焦点环 — 键盘 Tab 导航 focus outline | `--color-ring` */\n ring: string;\n\n // ─── 通用图表系列 Chart Series ───────────────────────────────────\n\n /** 图表系列 1(通常=主色) — 多系列折线/柱状图第 1 组 | `--color-chart-1` */\n chart1: string;\n /** 图表系列 2 — 第 2 组数据线 | `--color-chart-2` */\n chart2: string;\n /** 图表系列 3 — 第 3 组数据线 | `--color-chart-3` */\n chart3: string;\n /** 图表系列 4 — 第 4 组数据线 | `--color-chart-4` */\n chart4: string;\n /** 图表系列 5 — 第 5 组数据线 | `--color-chart-5` */\n chart5: string;\n\n // ─── 专用图表 Specific Charts ────────────────────────────────────\n\n /** 温度计仪表盘 — 圆弧填充渐变(5 色由浅到深)、空弧、滑块 */\n temperature: {\n arcFill: string[];\n arcEmpty: string;\n thumbBg: string;\n thumbBorder: string;\n };\n\n /** 太阳能面板图 — 渐变、阴影、第二系列 */\n solar: {\n gradientLeft: string;\n gradientRight: string;\n shadowColor: string;\n secondSeriesFill: string;\n };\n\n /** 流量图 — tooltip、坐标轴、数据点、渐变 */\n traffic: {\n tooltipBg: string;\n tooltipBorderColor: string;\n tooltipTextColor: string;\n yAxisSplitLine: string;\n lineBg: string;\n itemColor: string;\n itemBorderColor: string;\n itemEmphasisBorderColor: string;\n shadowLineDarkBg: string;\n shadowLineShadow: string;\n gradFrom: string;\n gradTo: string;\n };\n\n /** 电力图 — tooltip、坐标轴、折线渐变、面积渐变 */\n electricity: {\n tooltipBg: string;\n tooltipLineColor: string;\n tooltipBorderColor: string;\n tooltipTextColor: string;\n axisLineColor: string;\n xAxisTextColor: string;\n yAxisSplitLine: string;\n itemBorderColor: string;\n lineGradFrom: string;\n lineGradTo: string;\n lineShadow: string;\n areaGradFrom: string;\n areaGradTo: string;\n shadowLineDarkBg: string;\n };\n\n /** ECharts 全局 — 画布底色、文字、坐标轴、tooltip */\n echarts: {\n bg: string;\n textColor: string;\n axisLineColor: string;\n splitLineColor: string;\n itemHoverShadowColor: string;\n tooltipBackgroundColor: string;\n };\n\n /** Chart.js 全局 — 坐标轴、文字 */\n chartjs: {\n axisLineColor: string;\n textColor: string;\n };\n}\n\n/** 非颜色变量(圆角等,可随平台不同:iOS 24 / Android|Windows 6 / Linux 4) */\nexport interface BaseVariables {\n radius: {\n button: number;\n card: number;\n input: number;\n modal: number;\n badge: number;\n avatar: number;\n };\n\n spacing: {\n xs: number;\n sm: number;\n md: number;\n lg: number;\n xl: number;\n page: number;\n card: number;\n sectionGap: number;\n gridGap: number;\n };\n\n border: {\n thin: number;\n base: number;\n thick: number;\n focusRing: number;\n };\n\n size: {\n buttonSm: number;\n buttonMd: number;\n buttonLg: number;\n inputSm: number;\n inputMd: number;\n inputLg: number;\n navbarHeight: number;\n sidebarWidth: number;\n };\n\n typography: {\n fontFamilyBase: string;\n fontFamilyHeading: string;\n fontSizeXs: number;\n fontSizeSm: number;\n fontSizeMd: number;\n fontSizeLg: number;\n fontSizeXl: number;\n fontWeightNormal: number;\n fontWeightMedium: number;\n fontWeightBold: number;\n lineHeightBase: number;\n };\n\n motion: {\n fast: number;\n base: number;\n slow: number;\n easingStandard: string;\n };\n\n zIndex: {\n dropdown: number;\n sticky: number;\n modal: number;\n toast: number;\n tooltip: number;\n };\n}\n\n/** 颜色主题:name/displayName 表示这套配色是谁 */\nexport interface ColorTheme {\n name: string;\n displayName: string;\n variables: ColorVariables;\n}\n\n/** 基础主题:name/displayName 表示这套基础规范是谁(如 iOS / Android / 默认) */\nexport interface BaseTheme {\n name: string;\n displayName: string;\n variables: BaseVariables;\n}\n\n/** 完整主题 = 颜色主题 + 基础主题 */\nexport interface Theme {\n colors: ColorTheme;\n base: BaseTheme;\n}\n\n/** 颜色主题枚举 */\nexport enum ThemeEnum {\n DEFAULT = \"default\",\n LIGHT = \"light\",\n CORPORATE = \"corporate\",\n FOREST = \"forest\",\n DARK = \"dark\",\n COSMIC = \"cosmic\",\n COFFEE = \"coffee\",\n WINE = \"wine\",\n WHEAT = \"wheat\",\n}\n\nexport const DEFAULT_THEME = ThemeEnum.DEFAULT;\nexport const THEME_VALUES = Object.values(ThemeEnum);\n\n/** 基础主题枚举(平台/圆角等,如 iOS 24 / Android|Windows 6 / Linux 4) */\nexport enum BaseEnum {\n DEFAULT = \"default\",\n IOS = \"ios\",\n ANDROID = \"android\",\n WINDOWS = \"windows\",\n LINUX = \"linux\",\n}\n\nexport const DEFAULT_BASE = BaseEnum.DEFAULT;\nexport const BASE_VALUES = Object.values(BaseEnum);\n\nexport const COLOR_STORAGE_KEY = \"theme-color\";\nexport const BASE_STORAGE_KEY = \"theme-base\";\n"],"mappings":"AAuRA,IAAY,GAAL,SAAA,EAAA,CACL,OAAA,EAAA,QAAU,UACV,EAAA,MAAQ,QACR,EAAA,UAAY,YACZ,EAAA,OAAS,SACT,EAAA,KAAO,OACP,EAAA,OAAS,SACT,EAAA,OAAS,SACT,EAAA,KAAO,OACP,EAAA,MAAQ,gBAGG,EAAgB,EAAU,QAC1B,EAAe,OAAO,OAAO,CAAA,EAG9B,GAAL,SAAA,EAAA,CACL,OAAA,EAAA,QAAU,UACV,EAAA,IAAM,MACN,EAAA,QAAU,UACV,EAAA,QAAU,UACV,EAAA,MAAQ,gBAGG,EAAe,EAAS,QACxB,EAAc,OAAO,OAAO,CAAA,EAE5B,EAAoB,cACpB,EAAmB"}
|