nfx-ui 0.1.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.
Files changed (119) hide show
  1. package/README.md +235 -0
  2. package/dist/animations.cjs +3 -0
  3. package/dist/animations.d.ts +102 -0
  4. package/dist/animations.mjs +14 -0
  5. package/dist/apis.cjs +5 -0
  6. package/dist/apis.cjs.map +1 -0
  7. package/dist/apis.d.ts +7 -0
  8. package/dist/apis.mjs +18 -0
  9. package/dist/apis.mjs.map +1 -0
  10. package/dist/chunk-BounceLoading-B54QEw0n.mjs +244 -0
  11. package/dist/chunk-BounceLoading-B54QEw0n.mjs.map +1 -0
  12. package/dist/chunk-BounceLoading-C6n4BZVJ.cjs +11 -0
  13. package/dist/chunk-BounceLoading-C6n4BZVJ.cjs.map +1 -0
  14. package/dist/chunk-animations-Brp-bsaE.mjs +1243 -0
  15. package/dist/chunk-animations-Brp-bsaE.mjs.map +1 -0
  16. package/dist/chunk-animations-e2F3zuP9.cjs +190 -0
  17. package/dist/chunk-animations-e2F3zuP9.cjs.map +1 -0
  18. package/dist/chunk-chunk-BFrxaqQT.cjs +1 -0
  19. package/dist/chunk-i18n-Bp6pPM9n.mjs +207 -0
  20. package/dist/chunk-i18n-Bp6pPM9n.mjs.map +1 -0
  21. package/dist/chunk-i18n-_7W7guSV.cjs +3 -0
  22. package/dist/chunk-i18n-_7W7guSV.cjs.map +1 -0
  23. package/dist/chunk-lstorage-BVCD00Ow.mjs +27 -0
  24. package/dist/chunk-lstorage-BVCD00Ow.mjs.map +1 -0
  25. package/dist/chunk-lstorage-BnxLXHgH.cjs +3 -0
  26. package/dist/chunk-lstorage-BnxLXHgH.cjs.map +1 -0
  27. package/dist/chunk-lucide-BhgnmTNo.mjs +158 -0
  28. package/dist/chunk-lucide-BhgnmTNo.mjs.map +1 -0
  29. package/dist/chunk-lucide-CP2lvOPY.cjs +3 -0
  30. package/dist/chunk-lucide-CP2lvOPY.cjs.map +1 -0
  31. package/dist/chunk-preference-CYl68oeU.cjs +3 -0
  32. package/dist/chunk-preference-CYl68oeU.cjs.map +1 -0
  33. package/dist/chunk-preference-DImtu5jI.mjs +51 -0
  34. package/dist/chunk-preference-DImtu5jI.mjs.map +1 -0
  35. package/dist/chunk-types-BE3JCLff.cjs +3 -0
  36. package/dist/chunk-types-BE3JCLff.cjs.map +1 -0
  37. package/dist/chunk-types-BkFxelHl.mjs +20 -0
  38. package/dist/chunk-types-BkFxelHl.mjs.map +1 -0
  39. package/dist/chunk-types-C_opkZGr.cjs +3 -0
  40. package/dist/chunk-types-C_opkZGr.cjs.map +1 -0
  41. package/dist/chunk-types-CkbZrFqZ.cjs +3 -0
  42. package/dist/chunk-types-CkbZrFqZ.cjs.map +1 -0
  43. package/dist/chunk-types-DNPBKfmx.mjs +11 -0
  44. package/dist/chunk-types-DNPBKfmx.mjs.map +1 -0
  45. package/dist/chunk-types-SD4MzUGp.mjs +11 -0
  46. package/dist/chunk-types-SD4MzUGp.mjs.map +1 -0
  47. package/dist/chunk-useLayout-BAJHOIL3.cjs +3 -0
  48. package/dist/chunk-useLayout-BAJHOIL3.cjs.map +1 -0
  49. package/dist/chunk-useLayout-DPxlynT-.mjs +12 -0
  50. package/dist/chunk-useLayout-DPxlynT-.mjs.map +1 -0
  51. package/dist/chunk-useTheme-DgleVMMh.cjs +3 -0
  52. package/dist/chunk-useTheme-DgleVMMh.cjs.map +1 -0
  53. package/dist/chunk-useTheme-oHcq3d0o.mjs +13 -0
  54. package/dist/chunk-useTheme-oHcq3d0o.mjs.map +1 -0
  55. package/dist/components.cjs +8 -0
  56. package/dist/components.cjs.map +1 -0
  57. package/dist/components.d.ts +411 -0
  58. package/dist/components.mjs +1688 -0
  59. package/dist/components.mjs.map +1 -0
  60. package/dist/constants.cjs +5 -0
  61. package/dist/constants.cjs.map +1 -0
  62. package/dist/constants.d.ts +130 -0
  63. package/dist/constants.mjs +85 -0
  64. package/dist/constants.mjs.map +1 -0
  65. package/dist/events.cjs +5 -0
  66. package/dist/events.cjs.map +1 -0
  67. package/dist/events.d.ts +66 -0
  68. package/dist/events.mjs +31 -0
  69. package/dist/events.mjs.map +1 -0
  70. package/dist/hooks.cjs +5 -0
  71. package/dist/hooks.cjs.map +1 -0
  72. package/dist/hooks.d.ts +316 -0
  73. package/dist/hooks.mjs +107 -0
  74. package/dist/hooks.mjs.map +1 -0
  75. package/dist/icons.cjs +3 -0
  76. package/dist/icons.d.ts +218 -0
  77. package/dist/icons.mjs +76 -0
  78. package/dist/languages.cjs +5 -0
  79. package/dist/languages.cjs.map +1 -0
  80. package/dist/languages.d.ts +174 -0
  81. package/dist/languages.mjs +112 -0
  82. package/dist/languages.mjs.map +1 -0
  83. package/dist/layouts.cjs +5 -0
  84. package/dist/layouts.cjs.map +1 -0
  85. package/dist/layouts.d.ts +209 -0
  86. package/dist/layouts.mjs +460 -0
  87. package/dist/layouts.mjs.map +1 -0
  88. package/dist/navigations.cjs +5 -0
  89. package/dist/navigations.cjs.map +1 -0
  90. package/dist/navigations.d.ts +72 -0
  91. package/dist/navigations.mjs +30 -0
  92. package/dist/navigations.mjs.map +1 -0
  93. package/dist/preference.cjs +3 -0
  94. package/dist/preference.d.ts +94 -0
  95. package/dist/preference.mjs +14 -0
  96. package/dist/services.cjs +5 -0
  97. package/dist/services.cjs.map +1 -0
  98. package/dist/services.d.ts +8 -0
  99. package/dist/services.mjs +26 -0
  100. package/dist/services.mjs.map +1 -0
  101. package/dist/stores.cjs +5 -0
  102. package/dist/stores.cjs.map +1 -0
  103. package/dist/stores.d.ts +101 -0
  104. package/dist/stores.mjs +167 -0
  105. package/dist/stores.mjs.map +1 -0
  106. package/dist/themes.cjs +5 -0
  107. package/dist/themes.cjs.map +1 -0
  108. package/dist/themes.d.ts +229 -0
  109. package/dist/themes.mjs +894 -0
  110. package/dist/themes.mjs.map +1 -0
  111. package/dist/types.cjs +2 -0
  112. package/dist/types.d.ts +147 -0
  113. package/dist/types.mjs +2 -0
  114. package/dist/utils.cjs +5 -0
  115. package/dist/utils.cjs.map +1 -0
  116. package/dist/utils.d.ts +374 -0
  117. package/dist/utils.mjs +293 -0
  118. package/dist/utils.mjs.map +1 -0
  119. package/package.json +196 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-animations-e2F3zuP9.cjs","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","../src/designs/animations/PixelBlast/style.module.css","../src/designs/animations/PixelBlast/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: #160000;\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(59, 130, 246)\";\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 = \"#999\",\n squareSize = 40,\n hoverFillColor = \"#222\",\n className = \"\",\n style = {},\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, \"#060010\");\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]);\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 || \"#271E37\";\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 || \"#222222\";\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: #000000;\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 = [\"#2b4539\", \"#61dca3\", \"#61b3dc\"],\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 || \"#FA1E16\";\n const info = currentTheme.colors.variables.info || \"#0095ff\";\n const success = currentTheme.colors.variables.success || \"#00d68f\";\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",".container {\n width: 100%;\n height: 100%;\n position: relative;\n overflow: hidden;\n}\n","// Component inspired by github.com/zavalit/bayer-dithering-webgl-demo\n\nimport React, { memo, useEffect, useMemo, useRef } from \"react\";\nimport { Effect, EffectComposer, EffectPass, RenderPass } from \"postprocessing\";\nimport {\n Clock,\n Color,\n GLSL3,\n LinearFilter,\n Mesh,\n OrthographicCamera,\n PlaneGeometry,\n Scene,\n ShaderMaterial,\n Texture,\n Uniform,\n Vector2,\n WebGLRenderer,\n} from \"three\";\n\nimport { useTheme } from \"@/themes/hooks/useTheme\";\n\nimport styles from \"./style.module.css\";\n\ntype PixelBlastVariant = \"square\" | \"circle\" | \"triangle\" | \"diamond\";\n\ninterface TouchPoint {\n x: number;\n y: number;\n vx: number;\n vy: number;\n force: number;\n age: number;\n}\n\ninterface TouchTexture {\n canvas: HTMLCanvasElement;\n texture: Texture;\n addTouch: (norm: { x: number; y: number }) => void;\n update: () => void;\n radiusScale: number;\n size: number;\n}\n\ninterface ReinitConfig {\n antialias: boolean;\n liquid: boolean;\n noiseAmount: number;\n}\n\ntype PixelBlastProps = {\n variant?: PixelBlastVariant;\n pixelSize?: number;\n color?: string;\n className?: string;\n style?: React.CSSProperties;\n antialias?: boolean;\n patternScale?: number;\n patternDensity?: number;\n liquid?: boolean;\n liquidStrength?: number;\n liquidRadius?: number;\n pixelSizeJitter?: number;\n enableRipples?: boolean;\n rippleIntensityScale?: number;\n rippleThickness?: number;\n rippleSpeed?: number;\n liquidWobbleSpeed?: number;\n autoPauseOffscreen?: boolean;\n speed?: number;\n transparent?: boolean;\n edgeFade?: number;\n noiseAmount?: number;\n};\n\nconst createTouchTexture = (): TouchTexture => {\n const size = 64;\n const canvas = document.createElement(\"canvas\");\n canvas.width = size;\n canvas.height = size;\n const ctx = canvas.getContext(\"2d\");\n if (!ctx) throw new Error(\"2D context not available\");\n ctx.fillStyle = \"black\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n const texture = new Texture(canvas);\n texture.minFilter = LinearFilter;\n texture.magFilter = LinearFilter;\n texture.generateMipmaps = false;\n const trail: TouchPoint[] = [];\n let last: { x: number; y: number } | null = null;\n const maxAge = 64;\n let radius = 0.1 * size;\n const speed = 1 / maxAge;\n const clear = () => {\n ctx.fillStyle = \"black\";\n ctx.fillRect(0, 0, canvas.width, canvas.height);\n };\n const drawPoint = (p: TouchPoint) => {\n const pos = { x: p.x * size, y: (1 - p.y) * size };\n let intensity = 1;\n const easeOutSine = (t: number) => Math.sin((t * Math.PI) / 2);\n const easeOutQuad = (t: number) => -t * (t - 2);\n if (p.age < maxAge * 0.3) intensity = easeOutSine(p.age / (maxAge * 0.3));\n else intensity = easeOutQuad(1 - (p.age - maxAge * 0.3) / (maxAge * 0.7)) || 0;\n intensity *= p.force;\n const color = `${((p.vx + 1) / 2) * 255}, ${((p.vy + 1) / 2) * 255}, ${intensity * 255}`;\n const offset = size * 5;\n ctx.shadowOffsetX = offset;\n ctx.shadowOffsetY = offset;\n ctx.shadowBlur = radius;\n ctx.shadowColor = `rgba(${color},${0.22 * intensity})`;\n ctx.beginPath();\n ctx.fillStyle = \"rgba(255,0,0,1)\";\n ctx.arc(pos.x - offset, pos.y - offset, radius, 0, Math.PI * 2);\n ctx.fill();\n };\n const addTouch = (norm: { x: number; y: number }) => {\n let force = 0;\n let vx = 0;\n let vy = 0;\n if (last) {\n const dx = norm.x - last.x;\n const dy = norm.y - last.y;\n if (dx === 0 && dy === 0) return;\n const dd = dx * dx + dy * dy;\n const d = Math.sqrt(dd);\n vx = dx / (d || 1);\n vy = dy / (d || 1);\n force = Math.min(dd * 10000, 1);\n }\n last = { x: norm.x, y: norm.y };\n trail.push({ x: norm.x, y: norm.y, age: 0, force, vx, vy });\n };\n const update = () => {\n clear();\n for (let i = trail.length - 1; i >= 0; i--) {\n const point = trail[i];\n const f = point.force * speed * (1 - point.age / maxAge);\n point.x += point.vx * f;\n point.y += point.vy * f;\n point.age++;\n if (point.age > maxAge) trail.splice(i, 1);\n }\n for (let i = 0; i < trail.length; i++) drawPoint(trail[i]);\n texture.needsUpdate = true;\n };\n return {\n canvas,\n texture,\n addTouch,\n update,\n set radiusScale(v: number) {\n radius = 0.1 * size * v;\n },\n get radiusScale() {\n return radius / (0.1 * size);\n },\n size,\n };\n};\n\nconst createLiquidEffect = (texture: Texture, opts?: { strength?: number; freq?: number }) => {\n const fragment = `\n uniform sampler2D uTexture;\n uniform float uStrength;\n uniform float uTime;\n uniform float uFreq;\n\n void mainUv(inout vec2 uv) {\n vec4 tex = texture2D(uTexture, uv);\n float vx = tex.r * 2.0 - 1.0;\n float vy = tex.g * 2.0 - 1.0;\n float intensity = tex.b;\n\n float wave = 0.5 + 0.5 * sin(uTime * uFreq + intensity * 6.2831853);\n\n float amt = uStrength * intensity * wave;\n\n uv += vec2(vx, vy) * amt;\n }\n `;\n return new Effect(\"LiquidEffect\", fragment, {\n uniforms: new Map<string, Uniform>([\n [\"uTexture\", new Uniform(texture)],\n [\"uStrength\", new Uniform(opts?.strength ?? 0.025)],\n [\"uTime\", new Uniform(0)],\n [\"uFreq\", new Uniform(opts?.freq ?? 4.5)],\n ]),\n });\n};\n\nconst SHAPE_MAP: Record<PixelBlastVariant, number> = {\n square: 0,\n circle: 1,\n triangle: 2,\n diamond: 3,\n};\n\nconst VERTEX_SRC = `\nvoid main() {\n gl_Position = vec4(position, 1.0);\n}\n`;\n\nconst FRAGMENT_SRC = `\nprecision highp float;\n\nuniform vec3 uColor;\nuniform vec2 uResolution;\nuniform float uTime;\nuniform float uPixelSize;\nuniform float uScale;\nuniform float uDensity;\nuniform float uPixelJitter;\nuniform int uEnableRipples;\nuniform float uRippleSpeed;\nuniform float uRippleThickness;\nuniform float uRippleIntensity;\nuniform float uEdgeFade;\n\nuniform int uShapeType;\nconst int SHAPE_SQUARE = 0;\nconst int SHAPE_CIRCLE = 1;\nconst int SHAPE_TRIANGLE = 2;\nconst int SHAPE_DIAMOND = 3;\n\nconst int MAX_CLICKS = 10;\n\nuniform vec2 uClickPos [MAX_CLICKS];\nuniform float uClickTimes[MAX_CLICKS];\n\nout vec4 fragColor;\n\nfloat Bayer2(vec2 a) {\n a = floor(a);\n return fract(a.x / 2. + a.y * a.y * .75);\n}\n#define Bayer4(a) (Bayer2(.5*(a))*0.25 + Bayer2(a))\n#define Bayer8(a) (Bayer4(.5*(a))*0.25 + Bayer2(a))\n\n#define FBM_OCTAVES 5\n#define FBM_LACUNARITY 1.25\n#define FBM_GAIN 1.0\n\nfloat hash11(float n){ return fract(sin(n)*43758.5453); }\n\nfloat vnoise(vec3 p){\n vec3 ip = floor(p);\n vec3 fp = fract(p);\n float n000 = hash11(dot(ip + vec3(0.0,0.0,0.0), vec3(1.0,57.0,113.0)));\n float n100 = hash11(dot(ip + vec3(1.0,0.0,0.0), vec3(1.0,57.0,113.0)));\n float n010 = hash11(dot(ip + vec3(0.0,1.0,0.0), vec3(1.0,57.0,113.0)));\n float n110 = hash11(dot(ip + vec3(1.0,1.0,0.0), vec3(1.0,57.0,113.0)));\n float n001 = hash11(dot(ip + vec3(0.0,0.0,1.0), vec3(1.0,57.0,113.0)));\n float n101 = hash11(dot(ip + vec3(1.0,0.0,1.0), vec3(1.0,57.0,113.0)));\n float n011 = hash11(dot(ip + vec3(0.0,1.0,1.0), vec3(1.0,57.0,113.0)));\n float n111 = hash11(dot(ip + vec3(1.0,1.0,1.0), vec3(1.0,57.0,113.0)));\n vec3 w = fp*fp*fp*(fp*(fp*6.0-15.0)+10.0);\n float x00 = mix(n000, n100, w.x);\n float x10 = mix(n010, n110, w.x);\n float x01 = mix(n001, n101, w.x);\n float x11 = mix(n011, n111, w.x);\n float y0 = mix(x00, x10, w.y);\n float y1 = mix(x01, x11, w.y);\n return mix(y0, y1, w.z) * 2.0 - 1.0;\n}\n\nfloat fbm2(vec2 uv, float t){\n vec3 p = vec3(uv * uScale, t);\n float amp = 1.0;\n float freq = 1.0;\n float sum = 1.0;\n for (int i = 0; i < FBM_OCTAVES; ++i){\n sum += amp * vnoise(p * freq);\n freq *= FBM_LACUNARITY;\n amp *= FBM_GAIN;\n }\n return sum * 0.5 + 0.5;\n}\n\nfloat maskCircle(vec2 p, float cov){\n float r = sqrt(cov) * .25;\n float d = length(p - 0.5) - r;\n float aa = 0.5 * fwidth(d);\n return cov * (1.0 - smoothstep(-aa, aa, d * 2.0));\n}\n\nfloat maskTriangle(vec2 p, vec2 id, float cov){\n bool flip = mod(id.x + id.y, 2.0) > 0.5;\n if (flip) p.x = 1.0 - p.x;\n float r = sqrt(cov);\n float d = p.y - r*(1.0 - p.x);\n float aa = fwidth(d);\n return cov * clamp(0.5 - d/aa, 0.0, 1.0);\n}\n\nfloat maskDiamond(vec2 p, float cov){\n float r = sqrt(cov) * 0.564;\n return step(abs(p.x - 0.49) + abs(p.y - 0.49), r);\n}\n\nvoid main(){\n float pixelSize = uPixelSize;\n vec2 fragCoord = gl_FragCoord.xy - uResolution * .5;\n float aspectRatio = uResolution.x / uResolution.y;\n\n vec2 pixelId = floor(fragCoord / pixelSize);\n vec2 pixelUV = fract(fragCoord / pixelSize);\n\n float cellPixelSize = 8.0 * pixelSize;\n vec2 cellId = floor(fragCoord / cellPixelSize);\n vec2 cellCoord = cellId * cellPixelSize;\n vec2 uv = cellCoord / uResolution * vec2(aspectRatio, 1.0);\n\n float base = fbm2(uv, uTime * 0.05);\n base = base * 0.5 - 0.65;\n\n float feed = base + (uDensity - 0.5) * 0.3;\n\n float speed = uRippleSpeed;\n float thickness = uRippleThickness;\n const float dampT = 1.0;\n const float dampR = 10.0;\n\n if (uEnableRipples == 1) {\n for (int i = 0; i < MAX_CLICKS; ++i){\n vec2 pos = uClickPos[i];\n if (pos.x < 0.0) continue;\n float cellPixelSize = 8.0 * pixelSize;\n vec2 cuv = (((pos - uResolution * .5 - cellPixelSize * .5) / (uResolution))) * vec2(aspectRatio, 1.0);\n float t = max(uTime - uClickTimes[i], 0.0);\n float r = distance(uv, cuv);\n float waveR = speed * t;\n float ring = exp(-pow((r - waveR) / thickness, 2.0));\n float atten = exp(-dampT * t) * exp(-dampR * r);\n feed = max(feed, ring * atten * uRippleIntensity);\n }\n }\n\n float bayer = Bayer8(fragCoord / uPixelSize) - 0.5;\n float bw = step(0.5, feed + bayer);\n\n float h = fract(sin(dot(floor(fragCoord / uPixelSize), vec2(127.1, 311.7))) * 43758.5453);\n float jitterScale = 1.0 + (h - 0.5) * uPixelJitter;\n float coverage = bw * jitterScale;\n float M;\n if (uShapeType == SHAPE_CIRCLE) M = maskCircle (pixelUV, coverage);\n else if (uShapeType == SHAPE_TRIANGLE) M = maskTriangle(pixelUV, pixelId, coverage);\n else if (uShapeType == SHAPE_DIAMOND) M = maskDiamond(pixelUV, coverage);\n else M = coverage;\n\n if (uEdgeFade > 0.0) {\n vec2 norm = gl_FragCoord.xy / uResolution;\n float edge = min(min(norm.x, norm.y), min(1.0 - norm.x, 1.0 - norm.y));\n float fade = smoothstep(0.0, uEdgeFade, edge);\n M *= fade;\n }\n\n vec3 color = uColor;\n\n // sRGB gamma correction - convert linear to sRGB for accurate color output\n vec3 srgbColor = mix(\n color * 12.92,\n 1.055 * pow(color, vec3(1.0 / 2.4)) - 0.055,\n step(0.0031308, color)\n );\n\n fragColor = vec4(srgbColor, M);\n}\n`;\n\nconst MAX_CLICKS = 10;\n\nconst PixelBlast: React.FC<PixelBlastProps> = memo(\n ({\n variant = \"square\",\n pixelSize = 3,\n color = \"#B19EEF\",\n className,\n style,\n antialias = true,\n patternScale = 2,\n patternDensity = 1,\n liquid = false,\n liquidStrength = 0.1,\n liquidRadius = 1,\n pixelSizeJitter = 0,\n enableRipples = true,\n rippleIntensityScale = 1,\n rippleThickness = 0.1,\n rippleSpeed = 0.3,\n liquidWobbleSpeed = 4.5,\n autoPauseOffscreen = true,\n speed = 0.5,\n transparent = true,\n edgeFade = 0.5,\n noiseAmount = 0,\n }) => {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const visibilityRef = useRef({ visible: true });\n const speedRef = useRef(speed);\n\n const threeRef = useRef<{\n renderer: WebGLRenderer;\n scene: Scene;\n camera: OrthographicCamera;\n material: ShaderMaterial;\n clock: Clock;\n clickIx: number;\n uniforms: {\n uResolution: { value: Vector2 };\n uTime: { value: number };\n uColor: { value: Color };\n uClickPos: { value: Vector2[] };\n uClickTimes: { value: Float32Array };\n uShapeType: { value: number };\n uPixelSize: { value: number };\n uScale: { value: number };\n uDensity: { value: number };\n uPixelJitter: { value: number };\n uEnableRipples: { value: number };\n uRippleSpeed: { value: number };\n uRippleThickness: { value: number };\n uRippleIntensity: { value: number };\n uEdgeFade: { value: number };\n };\n resizeObserver?: ResizeObserver;\n raf?: number;\n quad?: Mesh<PlaneGeometry, ShaderMaterial>;\n timeOffset?: number;\n composer?: EffectComposer;\n touch?: ReturnType<typeof createTouchTexture>;\n liquidEffect?: Effect;\n } | null>(null);\n const prevConfigRef = useRef<ReinitConfig | null>(null);\n useEffect(() => {\n const container = containerRef.current;\n if (!container) return;\n speedRef.current = speed;\n const needsReinitKeys: (keyof ReinitConfig)[] = [\"antialias\", \"liquid\", \"noiseAmount\"];\n const cfg: ReinitConfig = { antialias, liquid, noiseAmount };\n let mustReinit = false;\n if (!threeRef.current) mustReinit = true;\n else if (prevConfigRef.current) {\n for (const k of needsReinitKeys)\n if (prevConfigRef.current[k] !== cfg[k]) {\n mustReinit = true;\n break;\n }\n }\n if (mustReinit) {\n if (threeRef.current) {\n const t = threeRef.current;\n t.resizeObserver?.disconnect();\n cancelAnimationFrame(t.raf!);\n t.quad?.geometry.dispose();\n t.material.dispose();\n t.composer?.dispose();\n t.renderer.dispose();\n if (t.renderer.domElement.parentElement === container) container.removeChild(t.renderer.domElement);\n threeRef.current = null;\n }\n const canvas = document.createElement(\"canvas\");\n const renderer = new WebGLRenderer({\n canvas,\n antialias,\n alpha: true,\n powerPreference: \"high-performance\",\n });\n renderer.domElement.style.width = \"100%\";\n renderer.domElement.style.height = \"100%\";\n // 降低像素比以提高性能\n renderer.setPixelRatio(Math.min(window.devicePixelRatio || 1, 1.5));\n container.appendChild(renderer.domElement);\n if (transparent) renderer.setClearAlpha(0);\n else renderer.setClearColor(0x000000, 1);\n const uniforms = {\n uResolution: { value: new Vector2(0, 0) },\n uTime: { value: 0 },\n uColor: { value: new Color(color) },\n uClickPos: {\n value: Array.from({ length: MAX_CLICKS }, () => new Vector2(-1, -1)),\n },\n uClickTimes: { value: new Float32Array(MAX_CLICKS) },\n uShapeType: { value: SHAPE_MAP[variant] ?? 0 },\n uPixelSize: { value: pixelSize * renderer.getPixelRatio() },\n uScale: { value: patternScale },\n uDensity: { value: patternDensity },\n uPixelJitter: { value: pixelSizeJitter },\n uEnableRipples: { value: enableRipples ? 1 : 0 },\n uRippleSpeed: { value: rippleSpeed },\n uRippleThickness: { value: rippleThickness },\n uRippleIntensity: { value: rippleIntensityScale },\n uEdgeFade: { value: edgeFade },\n };\n const scene = new Scene();\n const camera = new OrthographicCamera(-1, 1, 1, -1, 0, 1);\n const material = new ShaderMaterial({\n vertexShader: VERTEX_SRC,\n fragmentShader: FRAGMENT_SRC,\n uniforms,\n transparent: true,\n depthTest: false,\n depthWrite: false,\n glslVersion: GLSL3,\n });\n\n const quadGeom = new PlaneGeometry(2, 2);\n const quad = new Mesh(quadGeom, material);\n scene.add(quad);\n const clock = new Clock();\n const setSize = () => {\n const w = container.clientWidth || 1;\n const h = container.clientHeight || 1;\n renderer.setSize(w, h, false);\n uniforms.uResolution.value.set(renderer.domElement.width, renderer.domElement.height);\n if (threeRef.current?.composer) threeRef.current.composer.setSize(renderer.domElement.width, renderer.domElement.height);\n uniforms.uPixelSize.value = pixelSize * renderer.getPixelRatio();\n };\n setSize();\n const ro = new ResizeObserver(setSize);\n ro.observe(container);\n const randomFloat = (): number => {\n if (typeof window !== \"undefined\" && window.crypto?.getRandomValues) {\n const u32 = new Uint32Array(1);\n window.crypto.getRandomValues(u32);\n return u32[0] / 0xffffffff;\n }\n return Math.random();\n };\n const timeOffset = randomFloat() * 1000;\n let composer: EffectComposer | undefined;\n let touch: ReturnType<typeof createTouchTexture> | undefined;\n let liquidEffect: Effect | undefined;\n if (liquid) {\n touch = createTouchTexture();\n touch.radiusScale = liquidRadius;\n composer = new EffectComposer(renderer);\n const renderPass = new RenderPass(scene, camera);\n liquidEffect = createLiquidEffect(touch.texture, {\n strength: liquidStrength,\n freq: liquidWobbleSpeed,\n });\n const effectPass = new EffectPass(camera, liquidEffect);\n effectPass.renderToScreen = true;\n composer.addPass(renderPass);\n composer.addPass(effectPass);\n }\n if (noiseAmount > 0) {\n if (!composer) {\n composer = new EffectComposer(renderer);\n composer.addPass(new RenderPass(scene, camera));\n }\n const noiseEffect = new Effect(\n \"NoiseEffect\",\n `uniform float uTime; uniform float uAmount; float hash(vec2 p){ return fract(sin(dot(p, vec2(127.1,311.7))) * 43758.5453);} void mainUv(inout vec2 uv){} void mainImage(const in vec4 inputColor,const in vec2 uv,out vec4 outputColor){ float n=hash(floor(uv*vec2(1920.0,1080.0))+floor(uTime*60.0)); float g=(n-0.5)*uAmount; outputColor=inputColor+vec4(vec3(g),0.0);} `,\n {\n uniforms: new Map<string, Uniform>([\n [\"uTime\", new Uniform(0)],\n [\"uAmount\", new Uniform(noiseAmount)],\n ]),\n },\n );\n const noisePass = new EffectPass(camera, noiseEffect);\n noisePass.renderToScreen = true;\n if (composer && composer.passes.length > 0) {\n composer.passes.forEach((p: { renderToScreen?: boolean }) => {\n const pass = p as { renderToScreen?: boolean };\n pass.renderToScreen = false;\n });\n }\n composer.addPass(noisePass);\n }\n if (composer) composer.setSize(renderer.domElement.width, renderer.domElement.height);\n const mapToPixels = (e: PointerEvent) => {\n const rect = renderer.domElement.getBoundingClientRect();\n const scaleX = renderer.domElement.width / rect.width;\n const scaleY = renderer.domElement.height / rect.height;\n const fx = (e.clientX - rect.left) * scaleX;\n const fy = (rect.height - (e.clientY - rect.top)) * scaleY;\n return {\n fx,\n fy,\n w: renderer.domElement.width,\n h: renderer.domElement.height,\n };\n };\n const onPointerDown = (e: PointerEvent) => {\n const { fx, fy } = mapToPixels(e);\n const ix = threeRef.current?.clickIx ?? 0;\n uniforms.uClickPos.value[ix].set(fx, fy);\n uniforms.uClickTimes.value[ix] = uniforms.uTime.value;\n if (threeRef.current) threeRef.current.clickIx = (ix + 1) % MAX_CLICKS;\n };\n const onPointerMove = (e: PointerEvent) => {\n if (!touch) return;\n const { fx, fy, w, h } = mapToPixels(e);\n touch.addTouch({ x: fx / w, y: fy / h });\n };\n renderer.domElement.addEventListener(\"pointerdown\", onPointerDown, {\n passive: true,\n });\n renderer.domElement.addEventListener(\"pointermove\", onPointerMove, {\n passive: true,\n });\n let raf = 0;\n let lastFrameTime = 0;\n const targetFPS = 30; // 限制到 30 FPS 以提高性能\n const frameInterval = 1000 / targetFPS;\n\n const animate = (currentTime: number) => {\n if (autoPauseOffscreen && !visibilityRef.current.visible) {\n raf = requestAnimationFrame(animate);\n return;\n }\n\n // 帧率限制\n const elapsed = currentTime - lastFrameTime;\n if (elapsed < frameInterval) {\n raf = requestAnimationFrame(animate);\n return;\n }\n lastFrameTime = currentTime - (elapsed % frameInterval);\n\n uniforms.uTime.value = timeOffset + clock.getElapsedTime() * speedRef.current;\n if (liquidEffect) {\n const liqEffect = liquidEffect as Effect & { uniforms: Map<string, Uniform> };\n const timeUniform = liqEffect.uniforms.get(\"uTime\");\n if (timeUniform) timeUniform.value = uniforms.uTime.value;\n }\n if (composer) {\n if (touch) touch.update();\n composer.passes.forEach((p: any) => {\n const pass = p as { effects?: Array<Effect & { uniforms?: Map<string, Uniform> }> };\n if (pass.effects) {\n pass.effects.forEach((eff: Effect & { uniforms?: Map<string, Uniform> }) => {\n const timeUniform = eff.uniforms?.get(\"uTime\");\n if (timeUniform) timeUniform.value = uniforms.uTime.value;\n });\n }\n });\n composer.render();\n } else renderer.render(scene, camera);\n raf = requestAnimationFrame(animate);\n };\n raf = requestAnimationFrame((time) => {\n lastFrameTime = time;\n animate(time);\n });\n threeRef.current = {\n renderer,\n scene,\n camera,\n material,\n clock,\n clickIx: 0,\n uniforms,\n resizeObserver: ro,\n raf,\n quad,\n timeOffset,\n composer,\n touch,\n liquidEffect,\n };\n } else {\n const t = threeRef.current!;\n t.uniforms.uShapeType.value = SHAPE_MAP[variant] ?? 0;\n t.uniforms.uPixelSize.value = pixelSize * t.renderer.getPixelRatio();\n t.uniforms.uColor.value.set(color);\n t.uniforms.uScale.value = patternScale;\n t.uniforms.uDensity.value = patternDensity;\n t.uniforms.uPixelJitter.value = pixelSizeJitter;\n t.uniforms.uEnableRipples.value = enableRipples ? 1 : 0;\n t.uniforms.uRippleIntensity.value = rippleIntensityScale;\n t.uniforms.uRippleThickness.value = rippleThickness;\n t.uniforms.uRippleSpeed.value = rippleSpeed;\n t.uniforms.uEdgeFade.value = edgeFade;\n if (transparent) t.renderer.setClearAlpha(0);\n else t.renderer.setClearColor(0x000000, 1);\n if (t.liquidEffect) {\n const liqEffect = t.liquidEffect as Effect & { uniforms: Map<string, Uniform> };\n const uStrength = liqEffect.uniforms.get(\"uStrength\");\n if (uStrength) uStrength.value = liquidStrength;\n const uFreq = liqEffect.uniforms.get(\"uFreq\");\n if (uFreq) uFreq.value = liquidWobbleSpeed;\n }\n if (t.touch) t.touch.radiusScale = liquidRadius;\n }\n prevConfigRef.current = cfg;\n return () => {\n if (threeRef.current && mustReinit) return;\n if (!threeRef.current) return;\n const t = threeRef.current;\n t.resizeObserver?.disconnect();\n cancelAnimationFrame(t.raf!);\n t.quad?.geometry.dispose();\n t.material.dispose();\n t.composer?.dispose();\n t.renderer.dispose();\n if (t.renderer.domElement.parentElement === container) container.removeChild(t.renderer.domElement);\n threeRef.current = null;\n };\n }, [\n antialias,\n liquid,\n noiseAmount,\n pixelSize,\n patternScale,\n patternDensity,\n enableRipples,\n rippleIntensityScale,\n rippleThickness,\n rippleSpeed,\n pixelSizeJitter,\n edgeFade,\n transparent,\n liquidStrength,\n liquidRadius,\n liquidWobbleSpeed,\n autoPauseOffscreen,\n variant,\n color,\n speed,\n ]);\n\n return <div ref={containerRef} className={`${styles.container} ${className ?? \"\"}`} style={style} aria-label=\"PixelBlast interactive background\" />;\n },\n);\n\nPixelBlast.displayName = \"PixelBlast\";\n\nconst PixelBlastBackground: React.FC<Omit<PixelBlastProps, \"color\">> = memo((props) => {\n const { currentTheme } = useTheme();\n\n // 从主题中获取颜色\n const color = useMemo(() => {\n const primary = currentTheme.colors.variables.primary || \"#B19EEF\";\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);\n }, [currentTheme]);\n\n return (\n <PixelBlast\n color={color}\n variant=\"square\"\n pixelSize={6}\n patternScale={2}\n patternDensity={1}\n pixelSizeJitter={0}\n enableRipples\n rippleSpeed={0.3}\n rippleThickness={0.12}\n rippleIntensityScale={1.2}\n liquid={false}\n liquidStrength={0.12}\n liquidRadius={1.2}\n liquidWobbleSpeed={5}\n speed={0.3}\n edgeFade={0.25}\n transparent\n antialias={false}\n {...props}\n />\n );\n});\n\nPixelBlastBackground.displayName = \"PixelBlastBackground\";\n\nexport default PixelBlastBackground;\n"],"mappings":"oUCOM,EAAN,KAAW,CACT,EACA,EACA,EACA,YAAY,EAAW,EAAW,EAAW,CAC3C,KAAK,EAAI,EACT,KAAK,EAAI,EACT,KAAK,EAAI,EAEX,KAAK,EAAW,EAAmB,CACjC,OAAO,KAAK,EAAI,EAAI,KAAK,EAAI,IAI3B,GAAN,KAAY,CACV,MACA,EACA,KACA,MAEA,YAAY,EAAO,EAAG,CACpB,KAAK,MAAQ,CACX,IAAI,EAAK,EAAG,EAAG,CAAA,EACf,IAAI,EAAK,GAAI,EAAG,CAAA,EAChB,IAAI,EAAK,EAAG,GAAI,CAAA,EAChB,IAAI,EAAK,GAAI,GAAI,CAAA,EACjB,IAAI,EAAK,EAAG,EAAG,CAAA,EACf,IAAI,EAAK,GAAI,EAAG,CAAA,EAChB,IAAI,EAAK,EAAG,EAAG,EAAA,EACf,IAAI,EAAK,GAAI,EAAG,EAAA,EAChB,IAAI,EAAK,EAAG,EAAG,CAAA,EACf,IAAI,EAAK,EAAG,GAAI,CAAA,EAChB,IAAI,EAAK,EAAG,EAAG,EAAA,EACf,IAAI,EAAK,EAAG,GAAI,EAAA,GAElB,KAAK,EAAI,CACP,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,IAAK,EAAG,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,IAAK,EAAG,GAAI,GAAI,IAAK,GAAI,GAAI,GAAI,IAAK,EAAG,IAAK,IAAK,IAAK,IACrJ,GAAI,EAAG,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,IAAK,GAAI,IAAK,IACnJ,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,EAAG,IAAK,GACrJ,GAAI,IAAK,GAAI,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,IACrJ,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,EAAG,GAAI,IAAK,IAAK,GAAI,IAClJ,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,EAAG,IAAK,GAAI,GAAI,IAAK,GAAI,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IACtJ,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,EAAG,IACrJ,IAAK,IAAK,IAAK,IAAK,GAAI,IAAK,IAAK,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,GAAI,GAAI,IAAK,GAAI,IAAK,KAE9F,KAAK,KAAO,IAAI,MAAM,GAAA,EACtB,KAAK,MAAQ,IAAI,MAAM,GAAA,EACvB,KAAK,KAAK,CAAA,EAEZ,KAAK,EAAc,CACb,EAAO,GAAK,EAAO,IAAG,GAAQ,OAClC,EAAO,KAAK,MAAM,CAAA,EACd,EAAO,MAAK,GAAQ,GAAQ,GAChC,QAAS,EAAI,EAAG,EAAI,IAAK,IAAK,CAC5B,IAAI,EAAI,EAAI,EAAI,KAAK,EAAE,CAAA,EAAM,EAAO,IAAO,KAAK,EAAE,CAAA,EAAO,GAAQ,EAAK,IACtE,KAAK,KAAK,CAAA,EAAK,KAAK,KAAK,EAAI,GAAA,EAAO,EACpC,KAAK,MAAM,CAAA,EAAK,KAAK,MAAM,EAAI,GAAA,EAAO,KAAK,MAAM,EAAI,EAAA,GAGzD,KAAK,EAAmB,CACtB,OAAO,EAAI,EAAI,GAAK,GAAK,EAAI,EAAI,IAAM,IAEzC,KAAK,EAAW,EAAW,EAAmB,CAC5C,OAAQ,EAAI,GAAK,EAAI,EAAI,EAE3B,QAAQ,EAAW,EAAmB,CACpC,IAAI,EAAI,KAAK,MAAM,CAAA,EACjB,EAAI,KAAK,MAAM,CAAA,EACjB,GAAK,EACL,GAAK,EACL,GAAK,IACL,GAAK,IACL,MAAM,EAAM,KAAK,MAAM,EAAI,KAAK,KAAK,CAAA,CAAA,EAAI,KAAK,EAAG,CAAA,EAC3C,EAAM,KAAK,MAAM,EAAI,KAAK,KAAK,EAAI,CAAA,CAAA,EAAI,KAAK,EAAG,EAAI,CAAA,EACnD,EAAM,KAAK,MAAM,EAAI,EAAI,KAAK,KAAK,CAAA,CAAA,EAAI,KAAK,EAAI,EAAG,CAAA,EACnD,EAAM,KAAK,MAAM,EAAI,EAAI,KAAK,KAAK,EAAI,CAAA,CAAA,EAAI,KAAK,EAAI,EAAG,EAAI,CAAA,EAC3D,EAAI,KAAK,KAAK,CAAA,EACpB,OAAO,KAAK,KAAK,KAAK,KAAK,EAAK,EAAK,CAAA,EAAI,KAAK,KAAK,EAAK,EAAK,CAAA,EAAI,KAAK,KAAK,CAAA,CAAE,IAqD3E,GAAA,CAA+B,CACnC,UAAA,EAAY,QACZ,gBAAA,EAAkB,cAClB,WAAA,EAAa,MACb,WAAA,EAAa,KACb,SAAA,EAAW,GACX,SAAA,EAAW,GACX,KAAA,EAAO,GACP,KAAA,EAAO,GACP,SAAA,EAAW,KACX,QAAA,EAAU,KACV,cAAA,EAAgB,IAChB,MAAA,EAAQ,CAAA,EACR,UAAA,EAAY,EAAA,IACR,CACJ,MAAM,KAAA,EAAA,QAAsC,IAAA,EACtC,KAAA,EAAA,QAAsC,IAAA,EACtC,KAAA,EAAA,QAAiD,IAAA,EACjD,KAAA,EAAA,QAKH,CACD,MAAO,EACP,OAAQ,EACR,KAAM,EACN,IAAK,EACN,EACK,KAAA,EAAA,QAAkB,IAAI,GAAM,KAAK,OAAA,CAAQ,CAAC,EAC1C,KAAA,EAAA,QAA6B,CAAA,CAAE,EAC/B,KAAA,EAAA,QAAyB,CAC7B,EAAG,IACH,EAAG,EACH,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,GAAI,EACJ,EAAG,EACH,GAAI,EACJ,EAAG,EACH,IAAK,GACN,EACK,KAAA,EAAA,QAA2B,CAC/B,UAAA,EACA,WAAA,EACA,WAAA,EACA,SAAA,EACA,SAAA,EACA,SAAA,EACA,QAAA,EACA,cAAA,EACA,KAAA,EACA,KAAA,EACD,EACK,KAAA,EAAA,QAAmC,IAAA,EAEzC,SAAA,EAAA,WAAA,IAAgB,CACd,EAAU,QAAU,CAClB,UAAA,EACA,WAAA,EACA,WAAA,EACA,SAAA,EACA,SAAA,EACA,SAAA,EACA,QAAA,EACA,cAAA,EACA,KAAA,EACA,KAAA,IAED,CAAC,EAAW,EAAY,EAAY,EAAU,EAAU,EAAU,EAAS,EAAe,EAAM,EAAK,KAExG,EAAA,WAAA,IAAgB,CACd,MAAM,EAAS,EAAU,QACnB,EAAY,EAAa,QAC/B,GAAI,CAAC,GAAU,CAAC,EAAW,OAC3B,EAAO,QAAU,EAAO,WAAW,IAAA,EAEnC,SAAS,GAAU,CACjB,GAAI,CAAC,GAAa,CAAC,EAAQ,OAC3B,MAAM,EAAO,EAAU,sBAAA,EACvB,EAAY,QAAU,CACpB,MAAO,EAAK,MACZ,OAAQ,EAAK,OACb,KAAM,EAAK,KACX,IAAK,EAAK,KAEZ,EAAO,MAAQ,EAAK,MACpB,EAAO,OAAS,EAAK,OAGvB,SAAS,GAAW,CAClB,KAAM,CAAE,MAAA,EAAO,OAAA,CAAA,EAAW,EAAY,QACtC,EAAS,QAAU,CAAA,EACnB,MAAM,EAAS,EAAQ,IACrB,EAAU,EAAS,GACf,CAAE,KAAA,EAAM,KAAA,CAAA,EAAS,EAAU,QAC3B,EAAa,KAAK,KAAK,EAAS,CAAA,EAChC,EAAc,KAAK,KAAK,EAAU,CAAA,EAClC,GAAU,EAAQ,EAAO,GAAc,EACvC,GAAU,EAAS,EAAO,GAAe,EAC/C,QAAS,EAAI,EAAG,GAAK,EAAY,IAAK,CACpC,MAAM,GAAe,CAAA,EACrB,QAAS,EAAI,EAAG,GAAK,EAAa,IAChC,GAAI,KAAK,CACP,EAAG,EAAS,EAAO,EACnB,EAAG,EAAS,EAAO,EACnB,KAAM,CAAE,EAAG,EAAG,EAAG,GACjB,OAAQ,CAAE,EAAG,EAAG,EAAG,EAAG,GAAI,EAAG,GAAI,GAClC,EAEH,EAAS,QAAQ,KAAK,EAAA,GAI1B,SAAS,EAAW,EAAc,CAChC,MAAM,EAAQ,EAAS,QACjB,EAAQ,EAAS,QACjB,EAAQ,EAAS,QACjB,CAAE,WAAA,EAAY,WAAA,EAAY,SAAA,EAAU,SAAA,EAAU,SAAA,EAAU,QAAA,EAAS,cAAA,CAAA,EAAkB,EAAU,QACnG,EAAM,QAAS,IAAQ,CACrB,GAAI,QAAS,GAAM,CACjB,MAAM,GAAO,EAAM,SAAS,EAAE,EAAI,EAAO,GAAc,MAAQ,EAAE,EAAI,EAAO,GAAc,KAAA,EAAU,GACpG,EAAE,KAAK,EAAI,KAAK,IAAI,EAAA,EAAQ,EAC5B,EAAE,KAAK,EAAI,KAAK,IAAI,EAAA,EAAQ,EAE5B,MAAM,GAAK,EAAE,EAAI,EAAM,GACrB,GAAK,EAAE,EAAI,EAAM,GACb,GAAO,KAAK,MAAM,GAAI,EAAA,EACtB,EAAI,KAAK,IAAI,IAAK,EAAM,EAAA,EAC9B,GAAI,GAAO,EAAG,CACZ,MAAM,EAAI,EAAI,GAAO,EACf,EAAI,KAAK,IAAI,GAAO,IAAA,EAAS,EACnC,EAAE,OAAO,IAAM,KAAK,IAAI,EAAM,CAAA,EAAK,EAAI,EAAI,EAAM,GAAK,MACtD,EAAE,OAAO,IAAM,KAAK,IAAI,EAAM,CAAA,EAAK,EAAI,EAAI,EAAM,GAAK,MAGxD,EAAE,OAAO,KAAO,EAAI,EAAE,OAAO,GAAK,EAClC,EAAE,OAAO,KAAO,EAAI,EAAE,OAAO,GAAK,EAClC,EAAE,OAAO,IAAM,EACf,EAAE,OAAO,IAAM,EACf,EAAE,OAAO,GAAK,EAAE,OAAO,GAAK,EAC5B,EAAE,OAAO,GAAK,EAAE,OAAO,GAAK,EAC5B,EAAE,OAAO,EAAI,KAAK,IAAI,EAAe,KAAK,IAAI,CAAC,EAAe,EAAE,OAAO,CAAA,CAAE,EACzE,EAAE,OAAO,EAAI,KAAK,IAAI,EAAe,KAAK,IAAI,CAAC,EAAe,EAAE,OAAO,CAAA,CAAE,MAK/E,SAAS,EAAM,EAAc,EAAa,GAAgC,CACxE,MAAM,EAAI,EAAM,EAAI,EAAM,KAAK,GAAK,EAAa,EAAM,OAAO,EAAI,GAC5D,EAAI,EAAM,EAAI,EAAM,KAAK,GAAK,EAAa,EAAM,OAAO,EAAI,GAClE,MAAO,CAAE,EAAG,KAAK,MAAM,EAAI,EAAA,EAAM,GAAI,EAAG,KAAK,MAAM,EAAI,EAAA,EAAM,IAG/D,SAAS,IAAY,CACnB,KAAM,CAAE,MAAA,EAAO,OAAA,CAAA,EAAW,EAAY,QAChC,EAAM,EAAO,QACd,IACL,EAAI,UAAU,EAAG,EAAG,EAAO,CAAA,EAC3B,EAAI,UAAA,EACJ,EAAI,YAAc,EAAU,QAAQ,UACpC,EAAS,QAAQ,QAAS,GAAW,CACnC,IAAI,EAAK,EAAM,EAAO,CAAA,EAAI,EAAA,EAC1B,EAAI,OAAO,EAAG,EAAG,EAAG,CAAA,EACpB,EAAO,QAAA,CAAS,EAAG,IAAQ,CACzB,MAAM,EAAS,IAAQ,EAAO,OAAS,EACvC,EAAK,EAAM,EAAG,CAAC,CAAA,EACf,MAAM,EAAK,EAAM,EAAO,EAAM,CAAA,GAAM,EAAO,EAAO,OAAS,CAAA,EAAI,CAAC,CAAA,EAChE,EAAI,OAAO,EAAG,EAAG,EAAG,CAAA,EAChB,GAAQ,EAAI,OAAO,EAAG,EAAG,EAAG,CAAA,MAGpC,EAAI,OAAA,GAGN,SAAS,EAAK,EAAW,CACvB,GAAI,CAAC,EAAW,OAChB,MAAM,EAAQ,EAAS,QACvB,EAAM,KAAO,EAAM,EAAI,EAAM,IAAM,GACnC,EAAM,KAAO,EAAM,EAAI,EAAM,IAAM,GACnC,MAAM,EAAK,EAAM,EAAI,EAAM,GACzB,EAAK,EAAM,EAAI,EAAM,GACjB,EAAI,KAAK,MAAM,EAAI,CAAA,EACzB,EAAM,EAAI,EACV,EAAM,KAAO,EAAI,EAAM,IAAM,GAC7B,EAAM,GAAK,KAAK,IAAI,IAAK,EAAM,EAAA,EAC/B,EAAM,GAAK,EAAM,EACjB,EAAM,GAAK,EAAM,EACjB,EAAM,EAAI,KAAK,MAAM,EAAI,CAAA,EACzB,EAAU,MAAM,YAAY,MAAO,GAAG,EAAM,EAAA,IAAG,EAC/C,EAAU,MAAM,YAAY,MAAO,GAAG,EAAM,EAAA,IAAG,EAE/C,EAAW,CAAA,EACX,GAAA,EACA,EAAW,QAAU,sBAAsB,CAAA,EAG7C,SAAS,GAAW,CAClB,EAAA,EACA,EAAA,EAEF,SAAS,EAAY,EAAe,CAClC,EAAY,EAAE,QAAS,EAAE,OAAA,EAE3B,SAAS,EAAY,EAAe,CAClC,MAAM,EAAQ,EAAE,QAAQ,CAAA,EACxB,EAAY,EAAM,QAAS,EAAM,OAAA,EAEnC,SAAS,EAAY,EAAW,EAAW,CACzC,MAAM,EAAQ,EAAS,QACjB,EAAI,EAAY,QACtB,EAAM,EAAI,EAAI,EAAE,KAChB,EAAM,EAAI,EAAI,EAAE,IACX,EAAM,MACT,EAAM,GAAK,EAAM,EACjB,EAAM,GAAK,EAAM,EACjB,EAAM,GAAK,EAAM,EACjB,EAAM,GAAK,EAAM,EACjB,EAAM,IAAM,IAIhB,OAAA,EAAA,EACA,EAAA,EACA,EAAW,QAAU,sBAAsB,CAAA,EAC3C,OAAO,iBAAiB,SAAU,CAAA,EAClC,OAAO,iBAAiB,YAAa,CAAA,EACrC,OAAO,iBAAiB,YAAa,EAAa,CAAE,QAAS,EAAA,CAAO,EAEpE,IAAa,CACX,OAAO,oBAAoB,SAAU,CAAA,EACrC,OAAO,oBAAoB,YAAa,CAAA,EACxC,OAAO,oBAAoB,YAAa,CAAA,EACpC,EAAW,UAAY,MACzB,qBAAqB,EAAW,OAAA,IAGnC,CAAA,CAAE,KAEL,EAAA,KACG,MAAD,CACE,IAAK,EACL,UAAW,GAAG,GAAO,KAAA,IAAS,CAAA,GAC9B,MAAO,CACL,SAAU,WACV,IAAK,EACL,KAAM,EACN,OAAQ,EACR,QAAS,EACT,MAAO,OACP,OAAQ,OACR,SAAU,SACV,gBAAA,EACA,GAAG,sBAGJ,SAAD,CAAQ,IAAK,EAAW,UAAW,GAAO,YAAe,EACrD,GAIJ,GAA+E,GAAU,CAC7F,KAAM,CAAE,aAAA,CAAA,EAAiB,GAAA,SAAA,EA2CzB,SAAA,EAAA,KAAQ,GAAD,CAAkB,aAAA,EAAA,SAAA,IAxCO,CAE9B,MAAM,EAAU,EAAa,OAAO,UAAU,SAAW,oBAGnD,EAAA,CAAgB,EAAW,EAAW,EAAW,EAAiB,KAK/D,OAHM,KAAK,MAAM,GAAK,IAAM,GAAK,CAAA,CAAO,KAClC,KAAK,MAAM,GAAK,IAAM,GAAK,CAAA,CAAO,KAClC,KAAK,MAAM,GAAK,IAAM,GAAK,CAAA,CAAO,IAKjD,GAAI,EAAQ,WAAW,GAAA,EAAM,CAC3B,MAAM,EAAM,EAAQ,MAAM,CAAA,EAI1B,OAAO,EAHG,SAAS,EAAI,MAAM,EAAG,CAAA,EAAI,EAAA,EAC1B,SAAS,EAAI,MAAM,EAAG,CAAA,EAAI,EAAA,EAC1B,SAAS,EAAI,MAAM,EAAG,CAAA,EAAI,EAAA,CAAG,EAIzC,MAAM,EAAQ,EAAQ,MAAM,gCAAA,EAC5B,GAAI,EAIF,OAAO,EAHG,SAAS,EAAM,CAAA,EAAI,EAAA,EACnB,SAAS,EAAM,CAAA,EAAI,EAAA,EACnB,SAAS,EAAM,CAAA,EAAI,EAAA,CAAG,EAIlC,MAAM,EAAY,EAAQ,MAAM,gCAAA,EAChC,OAAI,EAIK,EAHG,SAAS,EAAU,CAAA,EAAI,EAAA,EACvB,SAAS,EAAU,CAAA,EAAI,EAAA,EACvB,SAAS,EAAU,CAAA,EAAI,EAAA,CAAG,EAG/B,GACN,CAAC,CAAA,CAAa,EAEmB,gBAAgB,cAAc,WAAY,IAAM,WAAY,IAAM,SAAU,GAAI,SAAU,GAAI,GAAI,EAAS,4EEpa3I,GAAA,CAAmC,CACvC,UAAA,EAAY,QACZ,MAAA,EAAQ,EACR,YAAA,EAAc,OACd,WAAA,EAAa,GACb,eAAA,EAAiB,OACjB,UAAA,EAAY,GACZ,MAAA,EAAQ,CAAA,CAAE,IACN,CACJ,MAAM,KAAA,EAAA,QAAsC,IAAA,EACtC,KAAA,EAAA,QAAmC,IAAA,EACnC,KAAA,EAAA,QAA6B,CAAA,EAC7B,KAAA,EAAA,QAA6B,CAAA,EAC7B,KAAA,EAAA,QAAgC,CAAE,EAAG,EAAG,EAAG,EAAG,EAC9C,KAAA,EAAA,QAA6C,IAAA,EAEnD,SAAA,EAAA,WAAA,IAAgB,CACd,MAAM,EAAS,EAAU,QACzB,GAAI,CAAC,EAAQ,OACb,MAAM,EAAM,EAAO,WAAW,IAAA,EAExB,EAAA,IAAqB,CACzB,EAAO,MAAQ,EAAO,YACtB,EAAO,OAAS,EAAO,aACvB,EAAY,QAAU,KAAK,KAAK,EAAO,MAAQ,CAAA,EAAc,EAC7D,EAAY,QAAU,KAAK,KAAK,EAAO,OAAS,CAAA,EAAc,GAGhE,OAAO,iBAAiB,SAAU,CAAA,EAClC,EAAA,EAEA,MAAM,EAAA,IAAiB,CACrB,GAAI,CAAC,EAAK,OACV,EAAI,UAAU,EAAG,EAAG,EAAO,MAAO,EAAO,MAAA,EAEzC,MAAM,EAAS,KAAK,MAAM,EAAW,QAAQ,EAAI,CAAA,EAAc,EACzD,EAAS,KAAK,MAAM,EAAW,QAAQ,EAAI,CAAA,EAAc,EAE/D,QAAS,EAAI,EAAQ,EAAI,EAAO,MAAQ,EAAY,GAAK,EACvD,QAAS,EAAI,EAAQ,EAAI,EAAO,OAAS,EAAY,GAAK,EAAY,CACpE,MAAM,EAAU,EAAK,EAAW,QAAQ,EAAI,EACtC,EAAU,EAAK,EAAW,QAAQ,EAAI,EAG1C,EAAiB,SACjB,KAAK,OAAO,EAAI,GAAU,CAAA,IAAgB,EAAiB,QAAQ,GACnE,KAAK,OAAO,EAAI,GAAU,CAAA,IAAgB,EAAiB,QAAQ,IAEnE,EAAI,UAAY,EAChB,EAAI,SAAS,EAAS,EAAS,EAAY,CAAA,GAG7C,EAAI,YAAc,EAClB,EAAI,WAAW,EAAS,EAAS,EAAY,CAAA,EAIjD,MAAM,EAAW,EAAI,qBACnB,EAAO,MAAQ,EACf,EAAO,OAAS,EAChB,EACA,EAAO,MAAQ,EACf,EAAO,OAAS,EAChB,KAAK,KAAK,EAAO,OAAS,EAAI,EAAO,QAAU,CAAA,EAAK,CAAA,EAEtD,EAAS,aAAa,EAAG,kBAAA,EACzB,EAAS,aAAa,EAAG,SAAA,EAEzB,EAAI,UAAY,EAChB,EAAI,SAAS,EAAG,EAAG,EAAO,MAAO,EAAO,MAAA,GAGpC,EAAA,IAAwB,CAC5B,MAAM,EAAiB,KAAK,IAAI,EAAO,EAAA,EACvC,OAAQ,EAAR,CACE,IAAK,QACH,EAAW,QAAQ,GAAK,EAAW,QAAQ,EAAI,EAAiB,GAAc,EAC9E,MACF,IAAK,OACH,EAAW,QAAQ,GAAK,EAAW,QAAQ,EAAI,EAAiB,GAAc,EAC9E,MACF,IAAK,KACH,EAAW,QAAQ,GAAK,EAAW,QAAQ,EAAI,EAAiB,GAAc,EAC9E,MACF,IAAK,OACH,EAAW,QAAQ,GAAK,EAAW,QAAQ,EAAI,EAAiB,GAAc,EAC9E,MACF,IAAK,WACH,EAAW,QAAQ,GAAK,EAAW,QAAQ,EAAI,EAAiB,GAAc,EAC9E,EAAW,QAAQ,GAAK,EAAW,QAAQ,EAAI,EAAiB,GAAc,EAC9E,MACF,QACE,MAGJ,EAAA,EACA,EAAW,QAAU,sBAAsB,CAAA,GAGvC,EAAmB,GAAsB,CAC7C,MAAM,EAAO,EAAO,sBAAA,EACd,EAAS,EAAM,QAAU,EAAK,KAC9B,EAAS,EAAM,QAAU,EAAK,IAE9B,EAAS,KAAK,MAAM,EAAW,QAAQ,EAAI,CAAA,EAAc,EACzD,EAAS,KAAK,MAAM,EAAW,QAAQ,EAAI,CAAA,EAAc,EAEzD,EAAiB,KAAK,OAAO,EAAS,EAAW,QAAQ,EAAI,GAAU,CAAA,EACvE,EAAiB,KAAK,OAAO,EAAS,EAAW,QAAQ,EAAI,GAAU,CAAA,GAEzE,CAAC,EAAiB,SAAW,EAAiB,QAAQ,IAAM,GAAkB,EAAiB,QAAQ,IAAM,KAC/G,EAAiB,QAAU,CAAE,EAAG,EAAgB,EAAG,KAIjD,EAAA,IAAyB,CAC7B,EAAiB,QAAU,MAG7B,OAAA,EAAO,iBAAiB,YAAa,CAAA,EACrC,EAAO,iBAAiB,aAAc,CAAA,EACtC,EAAW,QAAU,sBAAsB,CAAA,EAE3C,IAAa,CACX,OAAO,oBAAoB,SAAU,CAAA,EACjC,EAAW,SAAS,qBAAqB,EAAW,OAAA,EACxD,EAAO,oBAAoB,YAAa,CAAA,EACxC,EAAO,oBAAoB,aAAc,CAAA,IAE1C,CAAC,EAAW,EAAO,EAAa,EAAgB,EAAW,KAE9D,EAAA,KAAQ,SAAD,CAAQ,IAAK,EAAW,UAAW,GAAG,GAAO,aAAA,IAAiB,CAAA,GAAoB,MAAA,EAAS,GAG9F,GAAoF,GAAU,CAClG,KAAM,CAAE,aAAA,CAAA,EAAiB,GAAA,SAAA,EA8CzB,SAAA,EAAA,KAAQ,GAAD,CAAsB,eAAA,EAAA,SAAA,IA3CK,CAChC,MAAM,EAAmB,EAAa,OAAO,UAAU,SAAW,EAAa,OAAO,UAAU,IAAM,UACtG,GAAI,EAAiB,WAAW,GAAA,EAC9B,OAAO,EAET,MAAM,EAAQ,EAAiB,MAAM,gCAAA,EACrC,OAAI,EAIK,IAHG,SAAS,EAAM,CAAA,EAAI,EAAA,EAAI,SAAS,EAAA,EAAI,SAAS,EAAG,GAAA,CAAI,GACpD,SAAS,EAAM,CAAA,EAAI,EAAA,EAAI,SAAS,EAAA,EAAI,SAAS,EAAG,GAAA,CAAI,GACpD,SAAS,EAAM,CAAA,EAAI,EAAA,EAAI,SAAS,EAAA,EAAI,SAAS,EAAG,GAAA,CAAI,GAGzD,GACN,CAAC,CAAA,CAAa,EA8ByC,kBAAA,EAAA,SAAA,IA3BrB,CACnC,MAAM,EAAY,EAAa,OAAO,UAAU,KAAO,EAAa,OAAO,UAAU,SAAW,UAE1F,EAAA,CAAe,EAAW,EAAW,EAAW,EAAiB,KAI9D,OAHM,KAAK,MAAM,GAAK,EAAI,EAAA,CAAQ,KAC5B,KAAK,MAAM,GAAK,EAAI,EAAA,CAAQ,KAC5B,KAAK,MAAM,GAAK,EAAI,EAAA,CAAQ,IAI3C,GAAI,EAAU,WAAW,GAAA,EAAM,CAC7B,MAAM,EAAM,EAAU,MAAM,CAAA,EAI5B,OAAO,EAHG,SAAS,EAAI,MAAM,EAAG,CAAA,EAAI,EAAA,EAC1B,SAAS,EAAI,MAAM,EAAG,CAAA,EAAI,EAAA,EAC1B,SAAS,EAAI,MAAM,EAAG,CAAA,EAAI,EAAA,CAAG,EAGzC,MAAM,EAAQ,EAAU,MAAM,gCAAA,EAC9B,OAAI,EAIK,EAHG,SAAS,EAAM,CAAA,EAAI,EAAA,EACnB,SAAS,EAAM,CAAA,EAAI,EAAA,EACnB,SAAS,EAAM,CAAA,EAAI,EAAA,CAAG,EAG3B,GACN,CAAC,CAAA,CAAa,EAEyD,MAAO,GAAK,WAAY,GAAI,UAAU,WAAW,GAAI,EAAS,sOE3LpI,MAAA,EAAA,MAAA,CACH,CACC,aAAA,EAAe,CAAC,UAAW,UAAW,WACtC,YAAA,EAAc,IACd,eAAA,EAAiB,GACjB,cAAA,EAAgB,GAChB,OAAA,EAAS,GACT,WAAA,EAAa,wFACb,UAAA,EAAY,GACZ,MAAA,EAAQ,CAAA,CAAE,IACa,CACvB,MAAM,KAAA,EAAA,QAA6C,IAAA,EAC7C,KAAA,EAAA,QAAqC,IAAA,EACrC,KAAA,EAAA,QAOJ,CAAA,CAAE,EACE,KAAA,EAAA,QAAc,CAAE,QAAS,EAAG,KAAM,EAAG,EACrC,KAAA,EAAA,QAAkD,IAAA,EAClD,KAAA,EAAA,QAAwB,KAAK,IAAA,CAAK,EAElC,KAAA,EAAA,SAAA,IAAkC,MAAM,KAAK,CAAA,EAAa,CAAC,CAAA,CAAW,EAGtE,KAAA,EAAA,QAA2E,IAAI,GAAK,EAEpF,EAAW,GACX,EAAY,GACZ,EAAa,GAEb,KAAA,EAAA,aAAA,IACG,EAAkB,KAAK,MAAM,KAAK,OAAA,EAAW,EAAkB,MAAA,CAAO,EAC5E,CAAC,CAAA,CAAkB,EAEhB,KAAA,EAAA,aAAA,IACG,EAAa,KAAK,MAAM,KAAK,OAAA,EAAW,EAAa,MAAA,CAAO,EAClE,CAAC,CAAA,CAAa,EAEX,KAAA,EAAA,aAAwB,GAAgB,CAE5C,GAAI,EAAS,QAAQ,IAAI,CAAA,EACvB,OAAO,EAAS,QAAQ,IAAI,CAAA,EAI9B,MAAM,EAAgB,EAAI,QADH,mCAAA,CAC4B,EAAI,EAAG,EAAG,IACpD,EAAI,EAAI,EAAI,EAAI,EAAI,GAGvB,EAAS,4CAA4C,KAAK,CAAA,EAC1D,EAAM,EACR,CACE,EAAG,SAAS,EAAO,CAAA,EAAI,EAAA,EACvB,EAAG,SAAS,EAAO,CAAA,EAAI,EAAA,EACvB,EAAG,SAAS,EAAO,CAAA,EAAI,EAAA,GAEzB,KAGJ,OAAA,EAAS,QAAQ,IAAI,EAAK,CAAA,EACnB,GACN,CAAA,CAAE,EAEC,EAAA,CAAoB,EAA4C,EAA0C,IAAmB,CACjI,MAAM,EAAS,CACb,EAAG,KAAK,MAAM,EAAM,GAAK,EAAI,EAAI,EAAM,GAAK,CAAA,EAC5C,EAAG,KAAK,MAAM,EAAM,GAAK,EAAI,EAAI,EAAM,GAAK,CAAA,EAC5C,EAAG,KAAK,MAAM,EAAM,GAAK,EAAI,EAAI,EAAM,GAAK,CAAA,GAE9C,MAAO,OAAO,EAAO,CAAA,KAAM,EAAO,CAAA,KAAM,EAAO,CAAA,KAG3C,EAAA,CAAiB,EAAe,KAG7B,CAAE,QAFO,KAAK,KAAK,EAAQ,CAAA,EAEhB,KADL,KAAK,KAAK,EAAS,CAAA,IAI5B,EAAA,CAAqB,EAAiB,IAAiB,CAC3D,EAAK,QAAU,CAAE,QAAA,EAAS,KAAA,GAC1B,MAAM,EAAe,EAAU,EAC/B,EAAQ,QAAU,MAAM,KAAK,CAAE,OAAQ,CAAA,EAAc,KAAS,CAC5D,KAAM,EAAA,EACN,MAAO,EAAA,EACP,YAAa,EAAA,EACb,cAAe,GAChB,GAGG,EAAA,IAAqB,CACzB,MAAM,EAAS,EAAU,QACzB,GAAI,CAAC,EAAQ,OACb,MAAM,EAAS,EAAO,cACtB,GAAI,CAAC,EAAQ,OAEb,MAAM,EAAM,OAAO,kBAAoB,EACjC,EAAO,EAAO,sBAAA,EAEpB,EAAO,MAAQ,EAAK,MAAQ,EAC5B,EAAO,OAAS,EAAK,OAAS,EAE9B,EAAO,MAAM,MAAQ,GAAG,EAAK,KAAA,KAC7B,EAAO,MAAM,OAAS,GAAG,EAAK,MAAA,KAE1B,EAAQ,SACV,EAAQ,QAAQ,aAAa,EAAK,EAAG,EAAG,EAAK,EAAG,CAAA,EAGlD,KAAM,CAAE,QAAA,EAAS,KAAA,CAAA,EAAS,EAAc,EAAK,MAAO,EAAK,MAAA,EACzD,EAAkB,EAAS,CAAA,EAC3B,EAAA,GAGI,KAAA,EAAA,aAAA,IAAgC,CACpC,GAAI,CAAC,EAAQ,SAAW,EAAQ,QAAQ,SAAW,EAAG,OACtD,MAAM,EAAM,EAAQ,QACd,EAAS,EAAU,QACpB,IAEL,EAAI,UAAU,EAAG,EAAG,EAAO,MAAO,EAAO,MAAA,EACzC,EAAI,KAAO,GAAG,CAAA,eACd,EAAI,aAAe,MACnB,EAAI,UAAY,OAGhB,EAAQ,QAAQ,QAAA,CAAS,EAAQ,IAAU,CACzC,MAAM,EAAK,EAAQ,EAAK,QAAQ,QAAW,EACrC,EAAI,KAAK,MAAM,EAAQ,EAAK,QAAQ,OAAA,EAAW,EACrD,EAAI,UAAY,EAAO,MACvB,EAAI,SAAS,EAAO,KAAM,EAAG,CAAA,MAE9B,CAAA,CAAE,EAEC,KAAA,EAAA,aAAA,IAAkC,CACtC,GAAI,CAAC,EAAQ,SAAW,EAAQ,QAAQ,SAAW,EAAG,OAGtD,MAAM,EAAc,KAAK,IAAI,EAAG,KAAK,MAAM,EAAQ,QAAQ,OAAS,GAAA,CAAK,EAEzE,QAAS,EAAI,EAAG,EAAI,EAAa,IAAK,CACpC,MAAM,EAAQ,KAAK,MAAM,KAAK,OAAA,EAAW,EAAQ,QAAQ,MAAA,EACpD,EAAQ,QAAQ,CAAA,IAErB,EAAQ,QAAQ,CAAA,EAAO,KAAO,EAAA,EAC9B,EAAQ,QAAQ,CAAA,EAAO,YAAc,EAAA,EAEhC,EAIH,EAAQ,QAAQ,CAAA,EAAO,cAAgB,GAHvC,EAAQ,QAAQ,CAAA,EAAO,MAAQ,EAAQ,QAAQ,CAAA,EAAO,YACtD,EAAQ,QAAQ,CAAA,EAAO,cAAgB,MAK1C,CAAC,EAAe,EAAgB,EAAO,EAEpC,MAAA,EAAA,aAAA,IAA4C,CAChD,IAAI,EAAc,GACd,EAAc,EAGlB,EAAQ,QAAQ,QAAS,GAAW,CAClC,GAAI,EAAO,cAAgB,EAAG,CAC5B,IACA,EAAO,eAAiB,IACpB,EAAO,cAAgB,IAAG,EAAO,cAAgB,GAErD,MAAM,EAAW,EAAS,EAAO,KAAA,EAC3B,EAAS,EAAS,EAAO,WAAA,EAC3B,GAAY,IACd,EAAO,MAAQ,EAAiB,EAAU,EAAQ,EAAO,aAAA,EACzD,EAAc,OAMhB,GAAe,EAAc,GAC/B,EAAA,GAED,CAAC,EAAU,CAAA,CAAY,EAEpB,KAAA,EAAA,aAAA,IAA4B,CAChC,MAAM,EAAM,KAAK,IAAA,EACW,EAAM,EAAe,SAGtB,GACzB,EAAA,EACA,EAAA,EACA,EAAe,QAAU,GAChB,GAET,GAAA,EAGF,EAAa,QAAU,sBAAsB,CAAA,GAC5C,CAAC,EAAa,EAAQ,EAAe,GAAwB,EAEhE,SAAA,EAAA,WAAA,IAAgB,CACd,MAAM,EAAS,EAAU,QACzB,GAAI,CAAC,EAAQ,OAEb,EAAQ,QAAU,EAAO,WAAW,IAAA,EACpC,EAAA,EACA,EAAA,EAEA,IAAI,EAEJ,MAAM,EAAA,IAAqB,CACzB,aAAa,CAAA,EACb,EAAgB,WAAA,IAAiB,CAC3B,EAAa,SACf,qBAAqB,EAAa,OAAA,EAEpC,EAAA,EACA,EAAA,GACC,GAAA,GAGL,cAAO,iBAAiB,SAAU,CAAA,EAElC,IAAa,CACP,EAAa,SACf,qBAAqB,EAAa,OAAA,EAEpC,OAAO,oBAAoB,SAAU,CAAA,EACrC,aAAa,CAAA,EAEb,EAAS,QAAQ,MAAA,IAElB,CAAC,EAAa,EAAQ,EAAc,EAAQ,KAE/C,EAAA,MACG,MAAD,CAAK,UAAW,GAAG,GAAO,SAAA,IAAa,CAAA,GAAoB,MAAA,WAA3D,WACG,SAAD,CAAQ,IAAK,EAAW,UAAW,GAAO,OAAU,EACnD,MAAA,EAAA,KAAkB,MAAD,CAAK,UAAW,GAAO,aAAA,CAAqB,EAC7D,MAAA,EAAA,KAAmB,MAAD,CAAK,UAAW,GAAO,cAAA,CAAsB,OAMlE,MAAA,EAAA,MAAkF,GAAU,CAChG,KAAM,CAAE,aAAA,CAAA,EAAiB,GAAA,SAAA,EAyBzB,SAAA,EAAA,KACG,GAAD,CACgB,gBAAA,EAAA,SAAA,IAxBiB,CACjC,MAAM,EAAU,EAAa,OAAO,UAAU,SAAW,UACnD,EAAO,EAAa,OAAO,UAAU,MAAQ,UAC7C,EAAU,EAAa,OAAO,UAAU,SAAW,UAEnD,EAAS,GAA0B,CACvC,GAAI,EAAM,WAAW,GAAA,EACnB,OAAO,EAET,MAAM,EAAQ,EAAM,MAAM,gCAAA,EAC1B,OAAI,EAIK,IAHG,SAAS,EAAM,CAAA,EAAI,EAAA,EAAI,SAAS,EAAA,EAAI,SAAS,EAAG,GAAA,CAAI,GACpD,SAAS,EAAM,CAAA,EAAI,EAAA,EAAI,SAAS,EAAA,EAAI,SAAS,EAAG,GAAA,CAAI,GACpD,SAAS,EAAM,CAAA,EAAI,EAAA,EAAI,SAAS,EAAA,EAAI,SAAS,EAAG,GAAA,CAAI,GAGzD,GAGT,MAAO,CAAC,EAAM,CAAA,EAAU,EAAM,CAAA,EAAO,EAAM,CAAA,IAC1C,CAAC,CAAA,CAAa,EAKb,YAAa,IACb,eAAgB,GAChB,cAAe,GACf,OAAQ,GACR,GAAI,EACJ,IAIN,GAAuB,YAAc,0FElO/B,GAAA,IAAyC,CAE7C,MAAM,EAAS,SAAS,cAAc,QAAA,EACtC,EAAO,MAAQ,GACf,EAAO,OAAS,GAChB,MAAM,EAAM,EAAO,WAAW,IAAA,EAC9B,GAAI,CAAC,EAAK,MAAM,IAAI,MAAM,0BAAA,EAC1B,EAAI,UAAY,QAChB,EAAI,SAAS,EAAG,EAAG,EAAO,MAAO,EAAO,MAAA,EACxC,MAAM,EAAU,IAAI,EAAA,QAAQ,CAAA,EAC5B,EAAQ,UAAY,EAAA,aACpB,EAAQ,UAAY,EAAA,aACpB,EAAQ,gBAAkB,GAC1B,MAAM,EAAsB,CAAA,EAC5B,IAAI,EAAwC,KAC5C,MAAM,EAAS,GACf,IAAI,EAAS,GAAM,GACnB,MAAM,EAAQ,EAAI,EACZ,EAAA,IAAc,CAClB,EAAI,UAAY,QAChB,EAAI,SAAS,EAAG,EAAG,EAAO,MAAO,EAAO,MAAA,GAEpC,EAAa,GAAkB,CACnC,MAAM,EAAM,CAAE,EAAG,EAAE,EAAI,GAAM,GAAI,EAAI,EAAE,GAAK,IAC5C,IAAI,EAAY,EAChB,MAAM,EAAe,GAAc,KAAK,IAAK,EAAI,KAAK,GAAM,CAAA,EACtD,EAAe,GAAc,CAAC,GAAK,EAAI,GACzC,EAAE,IAAM,EAAS,GAAK,EAAY,EAAY,EAAE,KAAO,EAAS,GAAA,EAC/D,EAAY,EAAY,GAAK,EAAE,IAAM,EAAS,KAAQ,EAAS,GAAA,GAAS,EAC7E,GAAa,EAAE,MACf,MAAM,EAAQ,IAAK,EAAE,GAAK,GAAK,EAAK,GAAA,MAAU,EAAE,GAAK,GAAK,EAAK,GAAA,KAAQ,EAAY,GAAA,GAC7E,EAAS,IACf,EAAI,cAAgB,EACpB,EAAI,cAAgB,EACpB,EAAI,WAAa,EACjB,EAAI,YAAc,QAAQ,CAAA,IAAS,IAAO,CAAA,IAC1C,EAAI,UAAA,EACJ,EAAI,UAAY,kBAChB,EAAI,IAAI,EAAI,EAAI,EAAQ,EAAI,EAAI,EAAQ,EAAQ,EAAG,KAAK,GAAK,CAAA,EAC7D,EAAI,KAAA,GAgCN,MAAO,CACL,OAAA,EACA,QAAA,EACA,SAjCgB,GAAmC,CACnD,IAAI,EAAQ,EACR,EAAK,EACL,EAAK,EACT,GAAI,EAAM,CACR,MAAM,EAAK,EAAK,EAAI,EAAK,EACnB,EAAK,EAAK,EAAI,EAAK,EACzB,GAAI,IAAO,GAAK,IAAO,EAAG,OAC1B,MAAM,EAAK,EAAK,EAAK,EAAK,EACpB,EAAI,KAAK,KAAK,CAAA,EACpB,EAAK,GAAM,GAAK,GAChB,EAAK,GAAM,GAAK,GAChB,EAAQ,KAAK,IAAI,EAAK,IAAO,CAAA,EAE/B,EAAO,CAAE,EAAG,EAAK,EAAG,EAAG,EAAK,GAC5B,EAAM,KAAK,CAAE,EAAG,EAAK,EAAG,EAAG,EAAK,EAAG,IAAK,EAAG,MAAA,EAAO,GAAA,EAAI,GAAA,EAAI,GAmB1D,OAjBI,IAAe,CACnB,EAAA,EACA,QAAS,EAAI,EAAM,OAAS,EAAG,GAAK,EAAG,IAAK,CAC1C,MAAM,EAAQ,EAAM,CAAA,EACd,EAAI,EAAM,MAAQ,GAAS,EAAI,EAAM,IAAM,GACjD,EAAM,GAAK,EAAM,GAAK,EACtB,EAAM,GAAK,EAAM,GAAK,EACtB,EAAM,MACF,EAAM,IAAM,GAAQ,EAAM,OAAO,EAAG,CAAA,EAE1C,QAAS,EAAI,EAAG,EAAI,EAAM,OAAQ,IAAK,EAAU,EAAM,CAAA,CAAA,EACvD,EAAQ,YAAc,IAOtB,IAAI,YAAY,EAAW,CACzB,EAAS,GAAM,GAAO,GAExB,IAAI,aAAc,CAChB,OAAO,GAAU,GAAM,KAEzB,UAIE,GAAA,CAAsB,EAAkB,IAoBrC,IAAI,GAAA,OAAO,eAnBD;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,MAmB2B,CAC1C,SAAU,IAAI,IAAqB,CACjC,CAAC,WAAY,IAAI,EAAA,QAAQ,CAAA,CAAQ,EACjC,CAAC,YAAa,IAAI,EAAA,QAAQ,GAAM,UAAY,IAAA,CAAM,EAClD,CAAC,QAAS,IAAI,EAAA,QAAQ,CAAA,CAAE,EACxB,CAAC,QAAS,IAAI,EAAA,QAAQ,GAAM,MAAQ,GAAA,CAAI,EACzC,CAAC,CACH,EAGG,GAA+C,CACnD,OAAQ,EACR,OAAQ,EACR,SAAU,EACV,QAAS,GAGL,GAAa;AAAA;AAAA;AAAA;AAAA,EAMb,GAAe;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAuKf,GAAa,GAEb,MAAA,EAAA,MAAA,CACH,CACC,QAAA,EAAU,SACV,UAAA,EAAY,EACZ,MAAA,EAAQ,UACR,UAAA,EACA,MAAA,EACA,UAAA,EAAY,GACZ,aAAA,EAAe,EACf,eAAA,EAAiB,EACjB,OAAA,EAAS,GACT,eAAA,EAAiB,GACjB,aAAA,EAAe,EACf,gBAAA,EAAkB,EAClB,cAAA,EAAgB,GAChB,qBAAA,EAAuB,EACvB,gBAAA,EAAkB,GAClB,YAAA,EAAc,GACd,kBAAA,EAAoB,IACpB,mBAAA,EAAqB,GACrB,MAAA,EAAQ,GACR,YAAA,EAAc,GACd,SAAA,EAAW,GACX,YAAA,EAAc,CAAA,IACV,CACJ,MAAM,KAAA,EAAA,QAA6C,IAAA,EAC7C,KAAA,EAAA,QAAuB,CAAE,QAAS,EAAA,CAAM,EACxC,KAAA,EAAA,QAAkB,CAAA,EAElB,KAAA,EAAA,QA+BI,IAAA,EACJ,KAAA,EAAA,QAA4C,IAAA,EAClD,SAAA,EAAA,WAAA,IAAgB,CACd,MAAM,EAAY,EAAa,QAC/B,GAAI,CAAC,EAAW,OAChB,EAAS,QAAU,EACnB,MAAM,GAA0C,CAAC,YAAa,SAAU,eAClE,EAAoB,CAAE,UAAA,EAAW,OAAA,EAAQ,YAAA,GAC/C,IAAI,EAAa,GACjB,GAAI,CAAC,EAAS,QAAS,EAAa,WAC3B,EAAc,mBACV,KAAK,GACd,GAAI,EAAc,QAAQ,CAAA,IAAO,EAAI,CAAA,EAAI,CACvC,EAAa,GACb,OAGN,GAAI,EAAY,CACd,GAAI,EAAS,QAAS,CACpB,MAAM,EAAI,EAAS,QACnB,EAAE,gBAAgB,WAAA,EAClB,qBAAqB,EAAE,GAAA,EACvB,EAAE,MAAM,SAAS,QAAA,EACjB,EAAE,SAAS,QAAA,EACX,EAAE,UAAU,QAAA,EACZ,EAAE,SAAS,QAAA,EACP,EAAE,SAAS,WAAW,gBAAkB,GAAW,EAAU,YAAY,EAAE,SAAS,UAAA,EACxF,EAAS,QAAU,KAGrB,MAAM,EAAW,IAAI,EAAA,cAAc,CACjC,OAFa,SAAS,cAAc,QAAA,EAGpC,UAAA,EACA,MAAO,GACP,gBAAiB,mBAClB,EACD,EAAS,WAAW,MAAM,MAAQ,OAClC,EAAS,WAAW,MAAM,OAAS,OAEnC,EAAS,cAAc,KAAK,IAAI,OAAO,kBAAoB,EAAG,GAAA,CAAI,EAClE,EAAU,YAAY,EAAS,UAAA,EAC3B,EAAa,EAAS,cAAc,CAAA,EACnC,EAAS,cAAc,EAAU,CAAA,EACtC,MAAM,EAAW,CACf,YAAa,CAAE,MAAO,IAAI,EAAA,QAAQ,EAAG,CAAA,CAAE,EACvC,MAAO,CAAE,MAAO,CAAA,EAChB,OAAQ,CAAE,MAAO,IAAI,EAAA,MAAM,CAAA,CAAM,EACjC,UAAW,CACT,MAAO,MAAM,KAAK,CAAE,OAAQ,EAAA,EAAY,IAAQ,IAAI,EAAA,QAAQ,GAAI,EAAA,CAAG,CAAC,EAEtE,YAAa,CAAE,MAAO,IAAI,aAAa,EAAA,CAAW,EAClD,WAAY,CAAE,MAAO,GAAU,CAAA,GAAY,CAAA,EAC3C,WAAY,CAAE,MAAO,EAAY,EAAS,cAAA,CAAe,EACzD,OAAQ,CAAE,MAAO,CAAA,EACjB,SAAU,CAAE,MAAO,CAAA,EACnB,aAAc,CAAE,MAAO,CAAA,EACvB,eAAgB,CAAE,MAAO,EAAgB,EAAI,CAAA,EAC7C,aAAc,CAAE,MAAO,CAAA,EACvB,iBAAkB,CAAE,MAAO,CAAA,EAC3B,iBAAkB,CAAE,MAAO,CAAA,EAC3B,UAAW,CAAE,MAAO,CAAA,GAEhB,EAAQ,IAAI,EAAA,MACZ,EAAS,IAAI,EAAA,mBAAmB,GAAI,EAAG,EAAG,GAAI,EAAG,CAAA,EACjD,EAAW,IAAI,EAAA,eAAe,CAClC,aAAc,GACd,eAAgB,GAChB,SAAA,EACA,YAAa,GACb,UAAW,GACX,WAAY,GACZ,YAAa,EAAA,MACd,EAGK,EAAO,IAAI,EAAA,KADA,IAAI,EAAA,cAAc,EAAG,CAAA,EACN,CAAA,EAChC,EAAM,IAAI,CAAA,EACV,MAAM,EAAQ,IAAI,EAAA,MACZ,EAAA,IAAgB,CACpB,MAAM,EAAI,EAAU,aAAe,EAC7B,EAAI,EAAU,cAAgB,EACpC,EAAS,QAAQ,EAAG,EAAG,EAAA,EACvB,EAAS,YAAY,MAAM,IAAI,EAAS,WAAW,MAAO,EAAS,WAAW,MAAA,EAC1E,EAAS,SAAS,UAAU,EAAS,QAAQ,SAAS,QAAQ,EAAS,WAAW,MAAO,EAAS,WAAW,MAAA,EACjH,EAAS,WAAW,MAAQ,EAAY,EAAS,cAAA,GAEnD,EAAA,EACA,MAAM,EAAK,IAAI,eAAe,CAAA,EAC9B,EAAG,QAAQ,CAAA,EASX,MAAM,GARA,IAA4B,CAChC,GAAI,OAAO,OAAW,KAAe,OAAO,QAAQ,gBAAiB,CACnE,MAAM,EAAM,IAAI,YAAY,CAAA,EAC5B,cAAO,OAAO,gBAAgB,CAAA,EACvB,EAAI,CAAA,EAAK,WAElB,OAAO,KAAK,OAAA,IAEK,EAAgB,IACnC,IAAI,EACA,EACA,EACJ,GAAI,EAAQ,CACV,EAAQ,GAAA,EACR,EAAM,YAAc,EACpB,EAAW,IAAI,GAAA,eAAe,CAAA,EAC9B,MAAM,EAAa,IAAI,GAAA,WAAW,EAAO,CAAA,EACzC,EAAe,GAAmB,EAAM,QAAS,CAC/C,SAAU,EACV,KAAM,EACP,EACD,MAAM,EAAa,IAAI,GAAA,WAAW,EAAQ,CAAA,EAC1C,EAAW,eAAiB,GAC5B,EAAS,QAAQ,CAAA,EACjB,EAAS,QAAQ,CAAA,EAEnB,GAAI,EAAc,EAAG,CACd,IACH,EAAW,IAAI,GAAA,eAAe,CAAA,EAC9B,EAAS,QAAQ,IAAI,GAAA,WAAW,EAAO,CAAA,CAAO,GAYhD,MAAM,EAAY,IAAI,GAAA,WAAW,EAVb,IAAI,GAAA,OACtB,cACA,+WACA,CACE,SAAU,IAAI,IAAqB,CACjC,CAAC,QAAS,IAAI,EAAA,QAAQ,CAAA,CAAE,EACxB,CAAC,UAAW,IAAI,EAAA,QAAQ,CAAA,CAAY,CAAC,CACtC,CAAC,CACH,CACF,EAED,EAAU,eAAiB,GACvB,GAAY,EAAS,OAAO,OAAS,GACvC,EAAS,OAAO,QAAS,GAAoC,CAC3D,MAAM,EAAO,EACb,EAAK,eAAiB,KAG1B,EAAS,QAAQ,CAAA,EAEf,GAAU,EAAS,QAAQ,EAAS,WAAW,MAAO,EAAS,WAAW,MAAA,EAC9E,MAAM,GAAe,GAAoB,CACvC,MAAM,EAAO,EAAS,WAAW,sBAAA,EAC3B,EAAS,EAAS,WAAW,MAAQ,EAAK,MAC1C,EAAS,EAAS,WAAW,OAAS,EAAK,OAGjD,MAAO,CACL,IAHU,EAAE,QAAU,EAAK,MAAQ,EAInC,IAHU,EAAK,QAAU,EAAE,QAAU,EAAK,MAAQ,EAIlD,EAAG,EAAS,WAAW,MACvB,EAAG,EAAS,WAAW,SAGrB,EAAiB,GAAoB,CACzC,KAAM,CAAE,GAAA,EAAI,GAAA,CAAA,EAAO,GAAY,CAAA,EACzB,EAAK,EAAS,SAAS,SAAW,EACxC,EAAS,UAAU,MAAM,CAAA,EAAI,IAAI,EAAI,CAAA,EACrC,EAAS,YAAY,MAAM,CAAA,EAAM,EAAS,MAAM,MAC5C,EAAS,UAAS,EAAS,QAAQ,SAAW,EAAK,GAAK,KAExD,GAAiB,GAAoB,CACzC,GAAI,CAAC,EAAO,OACZ,KAAM,CAAE,GAAA,EAAI,GAAA,EAAI,EAAA,EAAG,EAAA,EAAA,EAAM,GAAY,CAAA,EACrC,EAAM,SAAS,CAAE,EAAG,EAAK,EAAG,EAAG,EAAK,GAAG,GAEzC,EAAS,WAAW,iBAAiB,cAAe,EAAe,CACjE,QAAS,EAAA,CACV,EACD,EAAS,WAAW,iBAAiB,cAAe,GAAe,CACjE,QAAS,EAAA,CACV,EACD,IAAI,GAAM,EACN,GAAgB,EAEpB,MAAM,GAAgB,IADJ,GAGZ,EAAW,GAAwB,CACvC,GAAI,GAAsB,CAAC,EAAc,QAAQ,QAAS,CACxD,GAAM,sBAAsB,CAAA,EAC5B,OAIF,MAAM,EAAU,EAAc,GAC9B,GAAI,EAAU,GAAe,CAC3B,GAAM,sBAAsB,CAAA,EAC5B,OAKF,GAHA,GAAgB,EAAe,EAAU,GAEzC,EAAS,MAAM,MAAQ,EAAa,EAAM,eAAA,EAAmB,EAAS,QAClE,EAAc,CAEhB,MAAM,EADY,EACY,SAAS,IAAI,OAAA,EACvC,IAAa,EAAY,MAAQ,EAAS,MAAM,OAElD,GACE,GAAO,EAAM,OAAA,EACjB,EAAS,OAAO,QAAS,GAAW,CAClC,MAAM,EAAO,EACT,EAAK,SACP,EAAK,QAAQ,QAAS,IAAsD,CAC1E,MAAM,GAAc,GAAI,UAAU,IAAI,OAAA,EAClC,KAAa,GAAY,MAAQ,EAAS,MAAM,WAI1D,EAAS,OAAA,GACJ,EAAS,OAAO,EAAO,CAAA,EAC9B,GAAM,sBAAsB,CAAA,GAE9B,GAAM,sBAAuB,GAAS,CACpC,GAAgB,EAChB,EAAQ,CAAA,IAEV,EAAS,QAAU,CACjB,SAAA,EACA,MAAA,EACA,OAAA,EACA,SAAA,EACA,MAAA,EACA,QAAS,EACT,SAAA,EACA,eAAgB,EAChB,IAAA,GACA,KAAA,EACA,WAAA,EACA,SAAA,EACA,MAAA,EACA,aAAA,OAEG,CACL,MAAM,EAAI,EAAS,QAcnB,GAbA,EAAE,SAAS,WAAW,MAAQ,GAAU,CAAA,GAAY,EACpD,EAAE,SAAS,WAAW,MAAQ,EAAY,EAAE,SAAS,cAAA,EACrD,EAAE,SAAS,OAAO,MAAM,IAAI,CAAA,EAC5B,EAAE,SAAS,OAAO,MAAQ,EAC1B,EAAE,SAAS,SAAS,MAAQ,EAC5B,EAAE,SAAS,aAAa,MAAQ,EAChC,EAAE,SAAS,eAAe,MAAQ,EAAgB,EAAI,EACtD,EAAE,SAAS,iBAAiB,MAAQ,EACpC,EAAE,SAAS,iBAAiB,MAAQ,EACpC,EAAE,SAAS,aAAa,MAAQ,EAChC,EAAE,SAAS,UAAU,MAAQ,EACzB,EAAa,EAAE,SAAS,cAAc,CAAA,EACrC,EAAE,SAAS,cAAc,EAAU,CAAA,EACpC,EAAE,aAAc,CAClB,MAAM,EAAY,EAAE,aACd,EAAY,EAAU,SAAS,IAAI,WAAA,EACrC,IAAW,EAAU,MAAQ,GACjC,MAAM,EAAQ,EAAU,SAAS,IAAI,OAAA,EACjC,IAAO,EAAM,MAAQ,GAEvB,EAAE,QAAO,EAAE,MAAM,YAAc,GAErC,OAAA,EAAc,QAAU,EACxB,IAAa,CAEX,GADI,EAAS,SAAW,GACpB,CAAC,EAAS,QAAS,OACvB,MAAM,EAAI,EAAS,QACnB,EAAE,gBAAgB,WAAA,EAClB,qBAAqB,EAAE,GAAA,EACvB,EAAE,MAAM,SAAS,QAAA,EACjB,EAAE,SAAS,QAAA,EACX,EAAE,UAAU,QAAA,EACZ,EAAE,SAAS,QAAA,EACP,EAAE,SAAS,WAAW,gBAAkB,GAAW,EAAU,YAAY,EAAE,SAAS,UAAA,EACxF,EAAS,QAAU,OAEpB,CACD,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACA,EACD,KAED,EAAA,KAAQ,MAAD,CAAK,IAAK,EAAc,UAAW,GAAG,GAAO,SAAA,IAAa,GAAa,EAAA,GAAa,MAAA,EAAO,aAAW,oCAAsC,IAIvJ,GAAW,YAAc,aAEzB,IAAM,MAAA,EAAA,MAAuE,GAAU,CACrF,KAAM,CAAE,aAAA,CAAA,EAAiB,GAAA,SAAA,EAuBzB,SAAA,EAAA,KACG,GAAD,CACS,SAAA,EAAA,SAAA,IAtBiB,CAC1B,MAAM,EAAU,EAAa,OAAO,UAAU,SAAW,UAgBzD,OAde,GAA0B,CACvC,GAAI,EAAM,WAAW,GAAA,EACnB,OAAO,EAET,MAAM,EAAQ,EAAM,MAAM,gCAAA,EAC1B,OAAI,EAIK,IAHG,SAAS,EAAM,CAAA,EAAI,EAAA,EAAI,SAAS,EAAA,EAAI,SAAS,EAAG,GAAA,CAAI,GACpD,SAAS,EAAM,CAAA,EAAI,EAAA,EAAI,SAAS,EAAA,EAAI,SAAS,EAAG,GAAA,CAAI,GACpD,SAAS,EAAM,CAAA,EAAI,EAAA,EAAI,SAAS,EAAA,EAAI,SAAS,EAAG,GAAA,CAAI,GAGzD,IAGI,CAAA,GACZ,CAAC,CAAA,CAAa,EAKb,QAAQ,SACR,UAAW,EACX,aAAc,EACd,eAAgB,EAChB,gBAAiB,EACjB,cAAA,GACA,YAAa,GACb,gBAAiB,IACjB,qBAAsB,IACtB,OAAQ,GACR,eAAgB,IAChB,aAAc,IACd,kBAAmB,EACnB,MAAO,GACP,SAAU,IACV,YAAA,GACA,UAAW,GACX,GAAI,EACJ,IAIN,GAAqB,YAAc"}
@@ -0,0 +1 @@
1
+ var b=Object.create,u=Object.defineProperty,c=Object.getOwnPropertyDescriptor,O=Object.getOwnPropertyNames,v=Object.getPrototypeOf,P=Object.prototype.hasOwnProperty,f=(e,r)=>{let t={};for(var a in e)u(t,a,{get:e[a],enumerable:!0});return r||u(t,Symbol.toStringTag,{value:"Module"}),t},g=(e,r,t,a)=>{if(r&&typeof r=="object"||typeof r=="function")for(var o=O(r),_=0,l=o.length,n;_<l;_++)n=o[_],!P.call(e,n)&&n!==t&&u(e,n,{get:(p=>r[p]).bind(null,n),enumerable:!(a=c(r,n))||a.enumerable});return e},i=(e,r,t)=>(t=e!=null?b(v(e)):{},g(r||!e||!e.__esModule?u(t,"default",{value:e,enumerable:!0}):t,e));Object.defineProperty(exports,"__exportAll",{enumerable:!0,get:function(){return f}});Object.defineProperty(exports,"__toESM",{enumerable:!0,get:function(){return i}});
@@ -0,0 +1,207 @@
1
+ import { i as n } from "./chunk-types-SD4MzUGp.mjs";
2
+ import t from "i18next";
3
+ import g from "i18next-browser-languagedetector";
4
+ import { initReactI18next as m } from "react-i18next";
5
+ const w = {
6
+ show: "Show Sidebar",
7
+ hide: "Hide Sidebar"
8
+ };
9
+ var p = { layoutSwitcher: w };
10
+ const E = {
11
+ en: "English",
12
+ zh: "Chinese",
13
+ fr: "French"
14
+ };
15
+ var A = { languageSwitcher: E };
16
+ const y = {
17
+ default: "Default",
18
+ ios: "iOS",
19
+ android: "Android",
20
+ windows: "Windows",
21
+ linux: "Linux"
22
+ }, _ = {
23
+ theme: "Theme",
24
+ language: "Language",
25
+ layout: "Layout",
26
+ preferences: "Preferences"
27
+ };
28
+ var C = {
29
+ baseSwitcher: y,
30
+ preference: _
31
+ };
32
+ const $ = {
33
+ default: "Default",
34
+ light: "Light",
35
+ dark: "Dark",
36
+ cosmic: "Cosmic",
37
+ corporate: "Corporate",
38
+ forest: "Forest",
39
+ coffee: "Coffee",
40
+ wine: "Wine"
41
+ };
42
+ var b = { themeSwitcher: $ };
43
+ const v = {
44
+ show: "Afficher la barre latérale",
45
+ hide: "Masquer la barre latérale"
46
+ };
47
+ var N = { layoutSwitcher: v };
48
+ const L = {
49
+ en: "Anglais",
50
+ zh: "Chinois",
51
+ fr: "Français"
52
+ };
53
+ var P = { languageSwitcher: L };
54
+ const R = {
55
+ default: "Par défaut",
56
+ ios: "iOS",
57
+ android: "Android",
58
+ windows: "Windows",
59
+ linux: "Linux"
60
+ }, x = {
61
+ theme: "Thème",
62
+ language: "Langue",
63
+ layout: "Disposition",
64
+ preferences: "Préférences"
65
+ };
66
+ var M = {
67
+ baseSwitcher: R,
68
+ preference: x
69
+ };
70
+ const F = {
71
+ default: "Par défaut",
72
+ light: "Clair",
73
+ dark: "Sombre",
74
+ cosmic: "Cosmique",
75
+ corporate: "Entreprise",
76
+ forest: "Forêt",
77
+ coffee: "Coffee",
78
+ wine: "Vin"
79
+ };
80
+ var O = { themeSwitcher: F };
81
+ const k = {
82
+ show: "显示侧边栏",
83
+ hide: "隐藏侧边栏"
84
+ };
85
+ var D = { layoutSwitcher: k };
86
+ const U = {
87
+ en: "英语",
88
+ zh: "中文",
89
+ fr: "法语"
90
+ };
91
+ var z = { languageSwitcher: U };
92
+ const T = {
93
+ default: "默认",
94
+ ios: "iOS",
95
+ android: "Android",
96
+ windows: "Windows",
97
+ linux: "Linux"
98
+ }, W = {
99
+ theme: "主题",
100
+ language: "语言",
101
+ layout: "布局",
102
+ preferences: "偏好设置"
103
+ };
104
+ var B = {
105
+ baseSwitcher: T,
106
+ preference: W
107
+ };
108
+ const H = {
109
+ default: "默认",
110
+ light: "浅色",
111
+ dark: "深色",
112
+ cosmic: "宇宙",
113
+ corporate: "企业",
114
+ forest: "森林",
115
+ coffee: "咖啡",
116
+ wine: "酒红"
117
+ };
118
+ var X = { themeSwitcher: H };
119
+ const q = [
120
+ "theme",
121
+ "language",
122
+ "layout",
123
+ "preference"
124
+ ], I = {
125
+ theme: "theme",
126
+ language: "language",
127
+ layout: "layout",
128
+ preference: "preference"
129
+ };
130
+ var V = {
131
+ en: {
132
+ theme: b,
133
+ language: A,
134
+ layout: p,
135
+ preference: C
136
+ },
137
+ zh: {
138
+ theme: X,
139
+ language: z,
140
+ layout: D,
141
+ preference: B
142
+ },
143
+ fr: {
144
+ theme: O,
145
+ language: P,
146
+ layout: N,
147
+ preference: M
148
+ }
149
+ };
150
+ function Z() {
151
+ return {
152
+ RESOURCES: V,
153
+ NAME_SPACES_MAP: I,
154
+ NAME_SPACES: [...q]
155
+ };
156
+ }
157
+ function Q(o) {
158
+ const l = Z(), i = o.bundles, c = o.fallbackLng ?? n.ZH, h = [
159
+ n.EN,
160
+ n.ZH,
161
+ n.FR
162
+ ].reduce((a, e) => ({
163
+ ...a,
164
+ [e]: {
165
+ ...l.RESOURCES[e] ?? {},
166
+ ...i.RESOURCES[e] ?? {}
167
+ }
168
+ }), {}), s = [...i.NAME_SPACES, ...l.NAME_SPACES.filter((a) => !i.NAME_SPACES.includes(a))];
169
+ t.use(g).use(m).init({
170
+ compatibilityJSON: "v4",
171
+ resources: h,
172
+ lng: c,
173
+ fallbackLng: c,
174
+ ns: s,
175
+ defaultNS: s[0],
176
+ interpolation: { escapeValue: !1 },
177
+ keySeparator: ".",
178
+ detection: { order: [
179
+ "navigator",
180
+ "htmlTag",
181
+ "path",
182
+ "subdomain"
183
+ ] }
184
+ });
185
+ const f = o.onLoadExtraBundles;
186
+ if (f) {
187
+ const a = async (e) => {
188
+ const r = await f(e);
189
+ if (r == null) return;
190
+ const S = Array.isArray(r) ? r : [r];
191
+ for (const { namespace: d, bundle: u } of S) d && u && typeof u == "object" && t.addResourceBundle(e, d, u, !0, !0);
192
+ };
193
+ a(t.language || c), t.on("languageChanged", (e) => {
194
+ a(e);
195
+ });
196
+ }
197
+ }
198
+ var Y = t;
199
+ export {
200
+ Z as a,
201
+ I as i,
202
+ Q as n,
203
+ q as r,
204
+ Y as t
205
+ };
206
+
207
+ //# sourceMappingURL=chunk-i18n-Bp6pPM9n.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-i18n-Bp6pPM9n.mjs","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/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 }\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 }\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 }\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 * 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 } from \"../types\";\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 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 i18n\n .use(LanguageDetector)\n .use(initReactI18next)\n .init({\n compatibilityJSON: \"v4\",\n resources: RESOURCES,\n lng: fallbackLng,\n fallbackLng,\n ns: NAME_SPACES,\n defaultNS: NAME_SPACES[0],\n interpolation: { escapeValue: false },\n keySeparator: \".\",\n detection: { order: [\"navigator\", \"htmlTag\", \"path\", \"subdomain\"] },\n });\n\n const onLoad = options.onLoadExtraBundles;\n if (onLoad) {\n const apply = async (lng: LanguageEnum) => {\n const result = await onLoad(lng);\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(lng, namespace, bundle, true, true);\n }\n }\n };\n void apply((i18n.language as LanguageEnum) || fallbackLng);\n i18n.on(\"languageChanged\", (lng) => void apply(lng as LanguageEnum));\n }\n}\n\nexport default i18n;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AYsBA,MAAa,IAAiB;AAAA,EAAC;AAAA,EAAS;AAAA,EAAY;AAAA,EAAU;GACjD,IAAoC;AAAA,EAC/C,OAAO;AAAA,EACP,UAAU;AAAA,EACV,QAAQ;AAAA,EACR,YAAY;;AAGd,IAAM,IAAmC;AAAA,EACvC,IAAI;AAAA,IACF,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,YAAY;AAAA;EAEd,IAAI;AAAA,IACF,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,YAAY;AAAA;EAEd,IAAI;AAAA,IACF,OAAO;AAAA,IACP,UAAU;AAAA,IACV,QAAQ;AAAA,IACR,YAAY;AAAA;;AAQhB,SAAgB,IAAkD;AAChE,SAAO;AAAA,IACL,WAAW;AAAA,IACX,iBAAiB;AAAA,IACjB,aAAa,CAAC,GAAG,CAAA;AAAA;;ACzCrB,SAAgB,EAAS,GAAgC;AACvD,QAAM,IAAM,EAAA,GACN,IAAO,EAAQ,SACf,IAAc,EAAQ,eAAe,EAAa,IAElD,IAAa;AAAA,IAAC,EAAa;AAAA,IAAI,EAAa;AAAA,IAAI,EAAa;AAAA,IAAc,OAAA,CAC9E,GAAK,OAAU;AAAA,IACd,GAAG;AAAA,KACF,CAAA,GAAO;AAAA,MACN,GAAI,EAAI,UAAU,CAAA,KAAS,CAAA;AAAA,MAC3B,GAAI,EAAK,UAAU,CAAA,KAAS,CAAA;AAAA;MAGhC,CAAA,CAAE,GAEE,IAAc,CAAC,GAAG,EAAK,aAAa,GAAG,EAAI,YAAY,OAAA,CAAQ,MAAM,CAAC,EAAK,YAAY,SAAS,CAAA,CAAE,CAAC;AAEzG,EAAA,EACG,IAAI,CAAA,EACJ,IAAI,CAAA,EACJ,KAAK;AAAA,IACJ,mBAAmB;AAAA,IACnB,WAAW;AAAA,IACX,KAAK;AAAA,IACL,aAAA;AAAA,IACA,IAAI;AAAA,IACJ,WAAW,EAAY,CAAA;AAAA,IACvB,eAAe,EAAE,aAAa,GAAA;AAAA,IAC9B,cAAc;AAAA,IACd,WAAW,EAAE,OAAO;AAAA,MAAC;AAAA,MAAa;AAAA,MAAW;AAAA,MAAQ;AAAA,MAAY;AAAA,GAClE;AAEH,QAAM,IAAS,EAAQ;AACvB,MAAI,GAAQ;AACV,UAAM,IAAQ,OAAO,MAAsB;AACzC,YAAM,IAAS,MAAM,EAAO,CAAA;AAC5B,UAAI,KAAU,KAAM;AACpB,YAAM,IAAQ,MAAM,QAAQ,CAAA,IAAU,IAAS,CAAC,CAAA;AAChD,iBAAW,EAAE,WAAA,GAAW,QAAA,EAAA,KAAY,EAClC,CAAI,KAAa,KAAU,OAAO,KAAW,YAC3C,EAAK,kBAAkB,GAAK,GAAW,GAAQ,IAAM,EAAA;AAAA;AAItD,IAAA,EAAO,EAAK,YAA6B,CAAA,GAC9C,EAAK,GAAG,mBAAA,CAAoB,MAAA;AAAQ,MAAK,EAAM,CAAA;AAAA,KAAoB;AAAA;;AAIvE,IAAA,IAAe"}
@@ -0,0 +1,3 @@
1
+ const h=require("./chunk-chunk-BFrxaqQT.cjs"),n=require("./chunk-types-BE3JCLff.cjs");let t=require("i18next");t=h.__toESM(t);let l=require("i18next-browser-languagedetector");l=h.__toESM(l);let p=require("react-i18next");const y={show:"Show Sidebar",hide:"Hide Sidebar"};var A={layoutSwitcher:y};const b={en:"English",zh:"Chinese",fr:"French"};var C={languageSwitcher:b};const P={default:"Default",ios:"iOS",android:"Android",windows:"Windows",linux:"Linux"},N={theme:"Theme",language:"Language",layout:"Layout",preferences:"Preferences"};var $={baseSwitcher:P,preference:N};const v={default:"Default",light:"Light",dark:"Dark",cosmic:"Cosmic",corporate:"Corporate",forest:"Forest",coffee:"Coffee",wine:"Wine"};var L={themeSwitcher:v};const M={show:"Afficher la barre latérale",hide:"Masquer la barre latérale"};var x={layoutSwitcher:M};const O={en:"Anglais",zh:"Chinois",fr:"Français"};var R={languageSwitcher:O};const F={default:"Par défaut",ios:"iOS",android:"Android",windows:"Windows",linux:"Linux"},q={theme:"Thème",language:"Langue",layout:"Disposition",preferences:"Préférences"};var k={baseSwitcher:F,preference:q};const D={default:"Par défaut",light:"Clair",dark:"Sombre",cosmic:"Cosmique",corporate:"Entreprise",forest:"Forêt",coffee:"Coffee",wine:"Vin"};var j={themeSwitcher:D};const U={show:"显示侧边栏",hide:"隐藏侧边栏"};var X={layoutSwitcher:U};const z={en:"英语",zh:"中文",fr:"法语"};var B={languageSwitcher:z};const T={default:"默认",ios:"iOS",android:"Android",windows:"Windows",linux:"Linux"},W={theme:"主题",language:"语言",layout:"布局",preferences:"偏好设置"};var H={baseSwitcher:T,preference:W};const I={default:"默认",light:"浅色",dark:"深色",cosmic:"宇宙",corporate:"企业",forest:"森林",coffee:"咖啡",wine:"酒红"};var V={themeSwitcher:I};const S=["theme","language","layout","preference"],E={theme:"theme",language:"language",layout:"layout",preference:"preference"};var Z={en:{theme:L,language:C,layout:A,preference:$},zh:{theme:V,language:B,layout:X,preference:H},fr:{theme:j,language:R,layout:x,preference:k}};function m(){return{RESOURCES:Z,NAME_SPACES_MAP:E,NAME_SPACES:[...S]}}function J(u){const f=m(),o=u.bundles,i=u.fallbackLng??n.LanguageEnum.ZH,w=[n.LanguageEnum.EN,n.LanguageEnum.ZH,n.LanguageEnum.FR].reduce((r,e)=>({...r,[e]:{...f.RESOURCES[e]??{},...o.RESOURCES[e]??{}}}),{}),s=[...o.NAME_SPACES,...f.NAME_SPACES.filter(r=>!o.NAME_SPACES.includes(r))];t.default.use(l.default).use(p.initReactI18next).init({compatibilityJSON:"v4",resources:w,lng:i,fallbackLng:i,ns:s,defaultNS:s[0],interpolation:{escapeValue:!1},keySeparator:".",detection:{order:["navigator","htmlTag","path","subdomain"]}});const d=u.onLoadExtraBundles;if(d){const r=async e=>{const a=await d(e);if(a==null)return;const _=Array.isArray(a)?a:[a];for(const{namespace:g,bundle:c}of _)g&&c&&typeof c=="object"&&t.default.addResourceBundle(e,g,c,!0,!0)};r(t.default.language||i),t.default.on("languageChanged",e=>{r(e)})}}var G=t.default;Object.defineProperty(exports,"NFX_NAMESPACES",{enumerable:!0,get:function(){return S}});Object.defineProperty(exports,"NFX_NAMESPACES_MAP",{enumerable:!0,get:function(){return E}});Object.defineProperty(exports,"getDefaultNfxBundles",{enumerable:!0,get:function(){return m}});Object.defineProperty(exports,"i18n_default",{enumerable:!0,get:function(){return G}});Object.defineProperty(exports,"initI18n",{enumerable:!0,get:function(){return J}});
2
+
3
+ //# sourceMappingURL=chunk-i18n-_7W7guSV.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-i18n-_7W7guSV.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/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 }\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 }\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 }\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 * 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 } from \"../types\";\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 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 i18n\n .use(LanguageDetector)\n .use(initReactI18next)\n .init({\n compatibilityJSON: \"v4\",\n resources: RESOURCES,\n lng: fallbackLng,\n fallbackLng,\n ns: NAME_SPACES,\n defaultNS: NAME_SPACES[0],\n interpolation: { escapeValue: false },\n keySeparator: \".\",\n detection: { order: [\"navigator\", \"htmlTag\", \"path\", \"subdomain\"] },\n });\n\n const onLoad = options.onLoadExtraBundles;\n if (onLoad) {\n const apply = async (lng: LanguageEnum) => {\n const result = await onLoad(lng);\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(lng, namespace, bundle, true, true);\n }\n }\n };\n void apply((i18n.language as LanguageEnum) || fallbackLng);\n i18n.on(\"languageChanged\", (lng) => void apply(lng as LanguageEnum));\n }\n}\n\nexport default i18n;\n"],"mappings":"yrDYsBA,MAAa,EAAiB,CAAC,QAAS,WAAY,SAAU,cACjD,EAAoC,CAC/C,MAAO,QACP,SAAU,WACV,OAAQ,SACR,WAAY,cAGd,IAAM,EAAmC,CACvC,GAAI,CACF,MAAO,EACP,SAAU,EACV,OAAQ,EACR,WAAY,GAEd,GAAI,CACF,MAAO,EACP,SAAU,EACV,OAAQ,EACR,WAAY,GAEd,GAAI,CACF,MAAO,EACP,SAAU,EACV,OAAQ,EACR,WAAY,IAQhB,SAAgB,GAAkD,CAChE,MAAO,CACL,UAAW,EACX,gBAAiB,EACjB,YAAa,CAAC,GAAG,CAAA,GCzCrB,SAAgB,EAAS,EAAgC,CACvD,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,EAEzG,EAAA,QACG,IAAI,EAAA,OAAA,EACJ,IAAI,EAAA,gBAAA,EACJ,KAAK,CACJ,kBAAmB,KACnB,UAAW,EACX,IAAK,EACL,YAAA,EACA,GAAI,EACJ,UAAW,EAAY,CAAA,EACvB,cAAe,CAAE,YAAa,EAAA,EAC9B,aAAc,IACd,UAAW,CAAE,MAAO,CAAC,YAAa,UAAW,OAAQ,YAAY,EAClE,EAEH,MAAM,EAAS,EAAQ,mBACvB,GAAI,EAAQ,CACV,MAAM,EAAQ,MAAO,GAAsB,CACzC,MAAM,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,EAAK,EAAW,EAAQ,GAAM,EAAA,GAItD,EAAO,EAAA,QAAK,UAA6B,CAAA,EAC9C,EAAA,QAAK,GAAG,kBAAoB,GAAA,CAAa,EAAM,CAAA,EAAoB,GAIvE,IAAA,EAAe,EAAA"}
@@ -0,0 +1,27 @@
1
+ function e(t) {
2
+ try {
3
+ return t();
4
+ } catch {
5
+ return;
6
+ }
7
+ }
8
+ function o(t) {
9
+ e(() => {
10
+ localStorage.removeItem(t);
11
+ });
12
+ }
13
+ function n(t) {
14
+ return e(() => localStorage.getItem(t));
15
+ }
16
+ function a(t, r) {
17
+ e(() => {
18
+ localStorage.setItem(t, r);
19
+ });
20
+ }
21
+ export {
22
+ o as n,
23
+ a as r,
24
+ n as t
25
+ };
26
+
27
+ //# sourceMappingURL=chunk-lstorage-BVCD00Ow.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-lstorage-BVCD00Ow.mjs","names":[],"sources":["../src/utils/lstorage.ts"],"sourcesContent":["/**\n * localStorage 安全封装,避免隐私模式等场景抛错。\n * Safe localStorage wrapper; avoids throwing in private mode etc.\n */\n\nimport type { Maybe, Nilable } from \"@/types/utils\";\n\nfunction safe<T>(fn: () => T): Maybe<T> {\n try {\n return fn();\n } catch {\n return undefined;\n }\n}\n\nexport function removeItem(key: string): void {\n safe(() => {\n localStorage.removeItem(key);\n });\n}\n\nexport function getItem(key: string): Nilable<string> {\n return safe(() => localStorage.getItem(key));\n}\n\nexport function setItem(key: string, value: string): void {\n safe(() => {\n localStorage.setItem(key, value);\n });\n}\n"],"mappings":"AAOA,SAAS,EAAQ,GAAuB;AACtC,MAAI;AACF,WAAO,EAAA;AAAA,UACD;AACN;AAAA;;AAIJ,SAAgB,EAAW,GAAmB;AAC5C,EAAA,EAAA,MAAW;AACT,iBAAa,WAAW,CAAA;AAAA;;AAI5B,SAAgB,EAAQ,GAA8B;AACpD,SAAO,EAAA,MAAW,aAAa,QAAQ,CAAA,CAAI;;AAG7C,SAAgB,EAAQ,GAAa,GAAqB;AACxD,EAAA,EAAA,MAAW;AACT,iBAAa,QAAQ,GAAK,CAAA;AAAA"}
@@ -0,0 +1,3 @@
1
+ function t(e){try{return e()}catch{return}}function n(e){t(()=>{localStorage.removeItem(e)})}function o(e){return t(()=>localStorage.getItem(e))}function u(e,r){t(()=>{localStorage.setItem(e,r)})}Object.defineProperty(exports,"getItem",{enumerable:!0,get:function(){return o}});Object.defineProperty(exports,"removeItem",{enumerable:!0,get:function(){return n}});Object.defineProperty(exports,"setItem",{enumerable:!0,get:function(){return u}});
2
+
3
+ //# sourceMappingURL=chunk-lstorage-BnxLXHgH.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunk-lstorage-BnxLXHgH.cjs","names":[],"sources":["../src/utils/lstorage.ts"],"sourcesContent":["/**\n * localStorage 安全封装,避免隐私模式等场景抛错。\n * Safe localStorage wrapper; avoids throwing in private mode etc.\n */\n\nimport type { Maybe, Nilable } from \"@/types/utils\";\n\nfunction safe<T>(fn: () => T): Maybe<T> {\n try {\n return fn();\n } catch {\n return undefined;\n }\n}\n\nexport function removeItem(key: string): void {\n safe(() => {\n localStorage.removeItem(key);\n });\n}\n\nexport function getItem(key: string): Nilable<string> {\n return safe(() => localStorage.getItem(key));\n}\n\nexport function setItem(key: string, value: string): void {\n safe(() => {\n localStorage.setItem(key, value);\n });\n}\n"],"mappings":"AAOA,SAAS,EAAQ,EAAuB,CACtC,GAAI,CACF,OAAO,EAAA,OACD,CACN,QAIJ,SAAgB,EAAW,EAAmB,CAC5C,EAAA,IAAW,CACT,aAAa,WAAW,CAAA,IAI5B,SAAgB,EAAQ,EAA8B,CACpD,OAAO,EAAA,IAAW,aAAa,QAAQ,CAAA,CAAI,EAG7C,SAAgB,EAAQ,EAAa,EAAqB,CACxD,EAAA,IAAW,CACT,aAAa,QAAQ,EAAK,CAAA"}