@sumi-forge/react 0.0.0-stage → 1.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +29 -0
- package/README.md +290 -2
- package/dist-lib/components/JapaneseCalligraphy.d.ts +21 -0
- package/dist-lib/components/SumiBrushCanvas.d.ts +41 -0
- package/dist-lib/components/SumiButton.d.ts +32 -0
- package/dist-lib/components/SumiIcon.d.ts +25 -0
- package/dist-lib/components/SumiLandscape.d.ts +33 -0
- package/dist-lib/components/SumiMaskReveal.d.ts +39 -0
- package/dist-lib/components/SumiSansui.d.ts +40 -0
- package/dist-lib/components/SumiSectionPainter.d.ts +24 -0
- package/dist-lib/components/SumiStroke.d.ts +25 -0
- package/dist-lib/components/SumiVFX.d.ts +23 -0
- package/dist-lib/gifEncoder.d.ts +7 -0
- package/dist-lib/index.cjs +2 -0
- package/dist-lib/index.cjs.map +1 -0
- package/dist-lib/index.d.ts +16 -0
- package/dist-lib/index.js +5882 -0
- package/dist-lib/index.js.map +1 -0
- package/dist-lib/math.d.ts +68 -0
- package/dist-lib/presets.d.ts +21 -0
- package/dist-lib/techniques.d.ts +107 -0
- package/dist-lib/types.d.ts +129 -0
- package/dist-lib/vfxRenderer.d.ts +13 -0
- package/package.json +90 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["rough","useRef","useState","useRef","rough","useRef","useState","useCallback","useRef","useRef","useRef","rough","useRef","rough","rough","useRef","useState","useState","useRef","createPortal","_Fragment","useRef","useCallback","__create","__defProp","__getOwnPropDesc","__getOwnPropNames","__getProtoOf","__hasOwnProp","__copyProps","from","keys","i","n","key","to","except","k","desc","__toESM","mod","isNodeMode","target","react","react_jsx_runtime","react_dom","createSeededRandom","a","seed","sampleNoise2D","xi","x","yi","y","xf","yf","hash","h","ix","iy","u","v","n00","n10","n01","n11","fbmNoise2D","v1","v2","v3","sampleCubicCurve","pts","steps","t","b0","b1","b2","b3","p0","p1","p2","p3","dx","dy","len","nx","ny","jitterAmount","j","sampleQuadraticCurve","samplePolarArc","cosTilt","tiltRadians","sinTilt","ang","startAngle","endAngle","rScale","spiralFactor","lx","rx","ly","ry","cx","cy","dAng","dlx","dly","samplesToSpine","rawPoints","smoothed","prev","curr","next","totalLen","acc","maxLen","pt","hexToRgb","clean","hex","rgbaStr","r","g","b","alpha","mixHex","r1","g1","hexA","r2","g2","hexB","clamped","recolorReferenceSheetData","out","src","d","ink","config","nrg","core","boost","mode","lum","maxC","minC","chroma","wCore","wEnergy","wInk","SANSUI_THEMES","SANSUI_COMPOSITIONS","MAGIC_SCHOOLS","ARCHETYPE_CATALOG","DEFAULT_VFX_CONFIG","DEFAULT_FUJI_LAYERS","TECHNIQUES_CATALOG","makeFineRoughOptions","rp","palette","scale","seedOffset","overrides","drawSumiKasureRibbon","opts","spine","headReach","tailRetract","actualBristles","bristleCount","ctx","color","roundHeadCap","erosionProgress","pStart","capR","maxWidth","offsetNormal","bSeed","rand","dryBrushGap","bristleStartShift","bristleEndShift","activeStart","activeEnd","bristleWidthWeight","leftEdge","rightEdge","inSegment","flushSegment","localT","nVal","erosionScale","tailBias","headProfile","taperStart","tailProfile","taperEnd","envelope","convergenceStrength","spreadFactor","hookMod","hookWaves","lateralCenter","minTipHalfThick","halfThick","drawCentrifugalSplatters","splatterCount","s","birthFrame","frameNorm","life","spineIdx","nextPt","tx","ty","tLen","ux","uy","outSign","speed","splatterSpread","dist","vx","vy","vAngle","dropX","dropY","erodeNoise","baseR","stretch","colorPick","colors","drawFlamePetalTongue","rootX","rootY","ctrl1X","ctrl1Y","ctrl2X","ctrl2Y","tipX","tipY","leftPts","rightPts","bellyEnv","halfW","maxBellyWidth","polygon","px","py","idx","grad","pal","striationCount","offset","sx","sy","rc","roughStepPolygon","drawDetachedSumiFlameWisp","midX","startX","endX","endY","startY","midY","width","drawHokusaiFoamClawCluster","c","clawCount","baseAngle","radius","curlDir","baseHalfW","perpX","perpY","ctrlX","ctrlY","dropDist","dropAng","dr","drawHokusaiWaveCrest","waveEnv","startPt","endPt","isLightStripe","tip","prevTip","tipAngle","dorsal","dorsalAngle","drawUkiyoeCloudScrollVolute","maxThickness","flip","upperEdge","lowerEdge","lobeWave","lobeCount","tailEnv","upperW","lowerW","headPt","prevPt","headAng","curlCenterX","curlRadius","curlCenterY","spiralPts","drawUkiyoeCloudBank","p","puffCount","spanWidth","drawSolidOpaqueCoreSphere","cosD","dirAngle","sinD","theta","rMod","wobbleAmount","noseX","noseY","drawTarashikomiWashBlob","cosR","rotation","sinR","deform","maxR","coreColor","edgeColor","drawFacetedRoughCrystal","length","cosA","angle","sinA","shoulderDist","baseC","baseX","baseY","baseL","shoulderL","shoulderR","outerVertices","drawSakuraBlossom","pAng","w","petalColor","inkColor","sAng","sLen","drawFloatingSakuraPetal","tiltRatio","size","drawCalligraphicKoiCarp","halfL","wave1","swimPhase","wave2","finAnchor","side","finSwing","finLen","finAng","bodyLightColor","tailPt","prevTailPt","tailAng","tailLen","lobe","lAng","crimsonColor","leftBody","rightBody","maxBodyW","bodyEnv","spot1","spot2","spot3","dorsalSlice","arr","drawCornerSakuraBranch","reachProgress","swayX","swayTime","swayY","mainSpine","archDir","maxTrunkWidth","subBranches","allSpines","tFork","subReach","forkPt","subLen","baseAng","subEndX","subEndY","subSpine","count","sIdx","tPos","bloom","sp","tipTighten","bx","by","flowerR","o","e","l","f","M","m","P","S","O","L","T","A","G","E","D","$","z","F","q","V","_","Z","I","C","W","R","Q","H","N","B","J","K","U","X","Y","tt","et","st","nt","ot","at","renderVFXFrame","totalFrames","frameIndex","transparentBg","height","apexFlash","rotRad","arch","startA","endA","activeSlice","drift","flowerScale","sweep","travel","headX","headY","tailX","tailY","coreR","spread","anchorAng","backAng","growth","expand","ex","ey","phase","baseA","isScythe","sweepSpan","processed","renderCompleteSpriteSheet","rows","columns","fSize","canvas","col","row","encodeAnimatedGIF89a","bytes","writeByte","writeShort","writeAscii","str","delayCs","fps","frame","frames","indexed","data","r5","g5","b5","lzwBlocks","lzwEncode","clearCode","minCodeSize","endCode","codeSize","nextCode","dict","outBytes","bitBuffer","bitCount","subBlock","flushSubBlock","emitCode","code","prefix","indexedPixels","suffix","found","SumiMaskReveal","controlledProgress","displayCanvasRef","maskCanvasRef","compositeCacheRef","cacheKeyRef","isVisibleRef","imageRef","imageLoaded","setImageLoaded","imageError","setImageError","manualScratchMode","setManualScratchMode","choreography","userStrokeCount","setUserStrokeCount","userStrokesRef","activeStrokeRef","lastPointerPosRef","strokeVersionRef","startTimeRef","img","replayTrigger","io","entries","entry","maskCanvas","compositeCache","animId","cachedRect","ro","renderFrame","dpr","targetW","targetH","mCtx","cCtx","elapsed","now","isInteractiveOnly","autoProg","duration","prog","quantProg","currentCacheKey","maskOnlyPreview","sunP","localP","fillP","start","y0","y1","isEven","effectivePts","avgPressure","imgRatio","canvasRatio","drawW","drawH","drawX","drawY","showLiveInkAccents","triggerManualRedraw","handlePointerDown","interactiveBrush","rect","pressure","handlePointerMove","velocityPressure","handlePointerUp","className","alt","showTouchControls","SumiLandscape","customLayers","customColors","canvasRef","pointerRef","layers","sunLayerCanvas","mountainLayerCanvas","branchLayerCanvas","fullCompletedCanvas","scratchCanvas","blossomNodes","builtCacheKey","buildLayerCaches","isCompact","sunCtx","sunX","sunY","sunR","mtCtx","peakX","peakY","peakHalfW","baseLeftX","baseRightX","mAlpha","fujiGrad","randFuji","rx0","ry0","spreadX","spreadY","wAlpha","mistAlpha","kumoConfig","kx","ky","islandY","trunkSpine","pine","cyCanopy","cw","canopySpine","brCtx","bAlpha","mainTrunk","allBranchSpines","randBlossom","clusterCount","offsetDist","stainStart","fullCtx","pAlpha","node","renderScene","revealProgress","animated","cacheKey","elapsedSec","autoReveal","rawProgress","revealProgressRef","progress","time","windSpeed","ptr","targetPtrX","targetPtrY","ptrOffsetX","ptrOffsetY","sunStainP","easeSun","bleedR","stainGrad","mtStrokeP","scCtx","easeMt","maskX","maskY","maskR","mGrad","branchStrokeP","easeBr","maxSpan","currR","originY","brGrad","clampedP","easeStain","stainRad","stainAlpha","sGrad","easePetal","sunProg","randSun","halfSpan","offsetX","waterProg","randWater","wl","wy","wxCenter","wSpan","petalFade","randPetal","floatingCount","driftX","driftY","windNoise","interactive","DEFAULT_COLORS","buildStarterFujiStrokes","renderSingleRecordedStroke","stroke","effectiveWidth","mockConfig","step","maxIdx","energySecondary","inkPrimary","midPt","sporeAccent","offsetNorm","bRadius","coreGlow","pEnd","SumiBrushCanvas","completedCacheCanvasRef","completedCacheValidRef","refImageRef","refImageLoaded","setRefImageLoaded","strokesRef","starterInitializedRef","currentPointsRef","replayStateRef","invalidateCompletedCache","renderBaseAndCompletedStrokes","targetCtx","showReferenceGuide","cRatio","dw","dh","layerAlpha","layerOpacities","layerName","renderAll","cacheCanvas","cacheCtx","isReplaying","replayProg","layersOrder","totalStrokes","stStart","stEnd","reach","startReplay","onTelemetryChange","actionsRef","link","activeBrush","activeLayer","strokeThickness","dt","velocity","simulatedPressure","hardwarePressure","SumiStroke","draw","animateOnMount","variant","thickness","accentColor","SumiVFX","customConfig","frameRef","mergedConfig","drawSingleFrame","fixedFrame","paused","lastTick","interval","loop","onFrameTick","SumiSectionPainter","staticCanvasRef","staticKeyRef","startRef","theme","staticCanvas","drawStaticLayer","sCtx","schoolColors","school","vfxConfig","sCanvas","washiGrad","borderSpine","petalAlpha","hokusaiColors","hokusaiCfg","riverSpine","leftWaveSpine","rightWaveSpine","mt","ensoSpine","render","ambientMotion","rawProg","scrollProgressRef","scrollProgress","quantReach","koiAlpha","SumiIcon","effectiveSize","resolvedColor","solidOpts","name","SumiBrandEmblem","ROUGH_RECT_CACHE","getRoughRectPaths","strokeColor","innerAccentColor","cached","dummySvg","mainNode","mainPaths","accentPaths","SumiButton","rest","btnRef","dims","setDims","hovered","setHovered","el","update","nw","nh","children","fullWidth","effectiveVariant","active","bgClass","textClass","disabled","sizeClasses","SumiRoughBox","boxRef","JapaneseCalligraphy","triggerRef","coords","setCoords","tooltipPlacement","updateTooltipPosition","vw","vh","finalPlacement","top","left","onScrollOrResize","handleEnter","handleLeave","tooltipPortal","jp","romaji","handleToggleTap","isDarkHex","resolveSansuiColors","basePreset","style","cssBg","cssInk","cssWash","cssMist","cssAccent","resolved","bgOverride","inkOverride","washOverride","background","drawSansuiPineTree","lean","topX","topY","tiers","tierSpan","washColor","drawSansuiPromontoryTrees","bareX","bareY","bareH","treeIdx","th","crownX","crownY","br","isDarkBlob","renderSansuiMountainRidge","spec","maxAmplitude","ridgePts","skewU","bell","env","cap","n1","n2","noiseMod","highestPt","washAlpha","isDark","mistStop","mistDensity","topTint","strokeCount","anchor","localSlopeH","startOffsetY","lenY","centerDir","cunfaAlpha","ridgeAlpha","maxStrokeW","edgeFade","noiseThick","wSeg","treeDensity","pineCount","pineH","dotCount","hTick","drawSansuiSampanBoat","personX","rw","buildCompositionRidges","ridges","composition","totalLayers","ridgeLayers","isLeft","centerX","spanW","SumiSansui","staticMountainCacheRef","exportPng","filename","startTime","backgroundColor","nextCacheKey","fiberRand","fy","backRidges","frontRidges","ridge","waterRand","waterTopY","rippleCount","uY","wx","wLen","showBoat","boatRand","boatX","boatY","boatSize","bobY"],"sources":["../src/lib/sumi-forge/math.ts","../src/lib/sumi-forge/presets.ts","../src/lib/sumi-forge/techniques.ts","../node_modules/.pnpm/roughjs@4.6.6/node_modules/roughjs/bundled/rough.esm.js","../src/lib/sumi-forge/vfxRenderer.ts","../src/lib/sumi-forge/gifEncoder.ts","../src/lib/sumi-forge/components/SumiMaskReveal.tsx","../src/lib/sumi-forge/components/SumiLandscape.tsx","../src/lib/sumi-forge/components/SumiBrushCanvas.tsx","../src/lib/sumi-forge/components/SumiStroke.tsx","../src/lib/sumi-forge/components/SumiVFX.tsx","../src/lib/sumi-forge/components/SumiSectionPainter.tsx","../src/lib/sumi-forge/components/SumiIcon.tsx","../src/lib/sumi-forge/components/SumiButton.tsx","../src/lib/sumi-forge/components/JapaneseCalligraphy.tsx","../src/lib/sumi-forge/components/SumiSansui.tsx"],"sourcesContent":["import { Point2D, VFXConfig } from './types';\n\n/**\n * Técnica #01: PRNG Determinístico (Mulberry32)\n * Estado inteiro de 32 bits incrementado por 0x6D2B79F5 a cada chamada,\n * garantindo coerência temporal entre todos os quadros sem cintilação (flicker).\n */\nexport function createSeededRandom(seed: number): () => number {\n let a = (seed | 0) + 0x6d2b79f5;\n return function () {\n a = Math.imul(a ^ (a >>> 15), a | 1);\n a ^= a + Math.imul(a ^ (a >>> 7), a | 61);\n return ((a ^ (a >>> 14)) >>> 0) / 4294967296;\n };\n}\n\n/**\n * Técnica #01: Value Noise 2D suavizado por curva Hermite cúbica (Smoothstep)\n * u = xf² · (3 - 2·xf) e v = yf² · (3 - 2·yf)\n */\nexport function sampleNoise2D(x: number, y: number, seed: number): number {\n const xi = Math.floor(x);\n const yi = Math.floor(y);\n const xf = x - xi;\n const yf = y - yi;\n\n const hash = (ix: number, iy: number) => {\n let h = Math.imul(ix, 374761393) + Math.imul(iy, 668265263) + Math.imul(seed, 1442695041);\n h = Math.imul(h ^ (h >>> 13), 1274126177);\n return ((h ^ (h >>> 16)) >>> 0) / 4294967296;\n };\n\n const u = xf * xf * (3 - 2 * xf);\n const v = yf * yf * (3 - 2 * yf);\n\n const n00 = hash(xi, yi);\n const n10 = hash(xi + 1, yi);\n const n01 = hash(xi, yi + 1);\n const n11 = hash(xi + 1, yi + 1);\n\n return (n00 * (1 - u) + n10 * u) * (1 - v) + (n01 * (1 - u) + n11 * u) * v;\n}\n\n/**\n * Técnica #01: FBM 2D de 3 Oitavas\n * FBM(x, y, seed) = 0.55 · N(x, y, s) + 0.30 · N(2.15x + 13.7, 2.15y + 7.3, s + 101) + 0.15 · N(4.4x - 5.2, 4.4y + 19.1, s + 307)\n */\nexport function fbmNoise2D(x: number, y: number, seed: number): number {\n const v1 = sampleNoise2D(x, y, seed);\n const v2 = sampleNoise2D(x * 2.15 + 13.7, y * 2.15 + 7.3, seed + 101);\n const v3 = sampleNoise2D(x * 4.4 - 5.2, y * 4.4 + 19.1, seed + 307);\n return v1 * 0.55 + v2 * 0.3 + v3 * 0.15;\n}\n\n/**\n * Técnica #02: Amostrador de Curva Bézier Cúbica (S-Curve) com Vetores Normais Analíticos\n */\nexport function sampleCubicCurve(\n p0: { x: number; y: number },\n p1: { x: number; y: number },\n p2: { x: number; y: number },\n p3: { x: number; y: number },\n steps = 96,\n jitterAmount = 0,\n seed = 1\n): Point2D[] {\n const pts: Point2D[] = [];\n for (let i = 0; i <= steps; i++) {\n const t = i / steps;\n const u = 1 - t;\n const b0 = u * u * u;\n const b1 = 3 * u * u * t;\n const b2 = 3 * u * t * t;\n const b3 = t * t * t;\n\n let x = b0 * p0.x + b1 * p1.x + b2 * p2.x + b3 * p3.x;\n let y = b0 * p0.y + b1 * p1.y + b2 * p2.y + b3 * p3.y;\n\n const dx = 3 * u * u * (p1.x - p0.x) + 6 * u * t * (p2.x - p1.x) + 3 * t * t * (p3.x - p2.x);\n const dy = 3 * u * u * (p1.y - p0.y) + 6 * u * t * (p2.y - p1.y) + 3 * t * t * (p3.y - p2.y);\n const len = Math.hypot(dx, dy) || 1;\n const nx = -dy / len;\n const ny = dx / len;\n\n if (jitterAmount > 0) {\n const j = (sampleNoise2D(t * 12, seed * 0.29, seed) - 0.5) * jitterAmount * 7.5;\n x += nx * j;\n y += ny * j;\n }\n pts.push({ x, y, nx, ny, t });\n }\n return pts;\n}\n\n/**\n * Técnica #02: Amostrador de Curva Bézier Quadrática com Normais Analíticas\n */\nexport function sampleQuadraticCurve(\n p0: { x: number; y: number },\n p1: { x: number; y: number },\n p2: { x: number; y: number },\n steps = 72,\n jitterAmount = 0,\n seed = 1\n): Point2D[] {\n const pts: Point2D[] = [];\n for (let i = 0; i <= steps; i++) {\n const t = i / steps;\n const u = 1 - t;\n let x = u * u * p0.x + 2 * u * t * p1.x + t * t * p2.x;\n let y = u * u * p0.y + 2 * u * t * p1.y + t * t * p2.y;\n\n const dx = 2 * u * (p1.x - p0.x) + 2 * t * (p2.x - p1.x);\n const dy = 2 * u * (p1.y - p0.y) + 2 * t * (p2.y - p1.y);\n const len = Math.hypot(dx, dy) || 1;\n const nx = -dy / len;\n const ny = dx / len;\n\n if (jitterAmount > 0) {\n const j = (sampleNoise2D(t * 10, seed * 0.37, seed) - 0.5) * jitterAmount * 6.0;\n x += nx * j;\n y += ny * j;\n }\n pts.push({ x, y, nx, ny, t });\n }\n return pts;\n}\n\n/**\n * Técnica #02: Arco Polar / Elíptico com Tilt 3D e Fator Espiral\n */\nexport function samplePolarArc(\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n startAngle: number,\n endAngle: number,\n tiltRadians = 0,\n spiralFactor = 0,\n steps = 88,\n jitterAmount = 0,\n seed = 1\n): Point2D[] {\n const pts: Point2D[] = [];\n const cosTilt = Math.cos(tiltRadians);\n const sinTilt = Math.sin(tiltRadians);\n\n for (let i = 0; i <= steps; i++) {\n const t = i / steps;\n const ang = startAngle + (endAngle - startAngle) * t;\n const rScale = 1 + spiralFactor * (t - 0.5);\n\n const lx = Math.cos(ang) * rx * rScale;\n const ly = Math.sin(ang) * ry * rScale;\n\n let x = cx + lx * cosTilt - ly * sinTilt;\n let y = cy + lx * sinTilt + ly * cosTilt;\n\n const dAng = endAngle - startAngle;\n const dlx = -Math.sin(ang) * rx * rScale * dAng + Math.cos(ang) * rx * spiralFactor;\n const dly = Math.cos(ang) * ry * rScale * dAng + Math.sin(ang) * ry * spiralFactor;\n\n const dx = dlx * cosTilt - dly * sinTilt;\n const dy = dlx * sinTilt + dly * cosTilt;\n const len = Math.hypot(dx, dy) || 1;\n const nx = -dy / len;\n const ny = dx / len;\n\n if (jitterAmount > 0) {\n const j = (sampleNoise2D(t * 11, seed * 0.19, seed) - 0.5) * jitterAmount * 6.5;\n x += nx * j;\n y += ny * j;\n }\n\n pts.push({ x, y, nx, ny, t });\n }\n return pts;\n}\n\n/**\n * Converte amostras de ponteiro do usuário em uma espinha dorsal Point2D suavizada\n */\nexport function samplesToSpine(\n rawPoints: { x: number; y: number }[],\n jitterAmount = 0,\n seed = 1\n): Point2D[] {\n if (rawPoints.length < 2) return [];\n const smoothed: { x: number; y: number }[] = [rawPoints[0]];\n for (let i = 1; i < rawPoints.length - 1; i++) {\n const prev = rawPoints[i - 1];\n const curr = rawPoints[i];\n const next = rawPoints[i + 1];\n smoothed.push({\n x: prev.x * 0.2 + curr.x * 0.6 + next.x * 0.2,\n y: prev.y * 0.2 + curr.y * 0.6 + next.y * 0.2,\n });\n }\n smoothed.push(rawPoints[rawPoints.length - 1]);\n\n const totalLen: number[] = [0];\n let acc = 0;\n for (let i = 1; i < smoothed.length; i++) {\n acc += Math.hypot(smoothed[i].x - smoothed[i - 1].x, smoothed[i].y - smoothed[i - 1].y);\n totalLen.push(acc);\n }\n const maxLen = Math.max(1, acc);\n\n return smoothed.map((pt, i) => {\n const prev = smoothed[Math.max(0, i - 1)];\n const next = smoothed[Math.min(smoothed.length - 1, i + 1)];\n const dx = next.x - prev.x;\n const dy = next.y - prev.y;\n const len = Math.hypot(dx, dy) || 1;\n const nx = -dy / len;\n const ny = dx / len;\n const t = totalLen[i] / maxLen;\n let x = pt.x;\n let y = pt.y;\n if (jitterAmount > 0) {\n const j = (sampleNoise2D(t * 12, seed * 0.31, seed) - 0.5) * jitterAmount * 5;\n x += nx * j;\n y += ny * j;\n }\n return { x, y, nx, ny, t };\n });\n}\n\nexport function hexToRgb(hex: string): [number, number, number] {\n const clean = hex.replace('#', '').trim();\n if (clean.length === 3) {\n return [\n parseInt(clean[0] + clean[0], 16) || 0,\n parseInt(clean[1] + clean[1], 16) || 0,\n parseInt(clean[2] + clean[2], 16) || 0,\n ];\n }\n return [\n parseInt(clean.substring(0, 2), 16) || 0,\n parseInt(clean.substring(2, 4), 16) || 0,\n parseInt(clean.substring(4, 6), 16) || 0,\n ];\n}\n\nexport function rgbaStr(hex: string, alpha: number): string {\n const [r, g, b] = hexToRgb(hex);\n const clampedA = Math.max(0, Math.min(1, alpha));\n return `rgba(${r}, ${g}, ${b}, ${clampedA.toFixed(3)})`;\n}\n\nexport function mixHex(hexA: string, hexB: string, t: number): string {\n const [r1, g1, b1] = hexToRgb(hexA);\n const [r2, g2, b2] = hexToRgb(hexB);\n const clamped = Math.max(0, Math.min(1, t));\n const r = Math.round(r1 + (r2 - r1) * clamped);\n const g = Math.round(g1 + (g2 - g1) * clamped);\n const b = Math.round(b1 + (b2 - b1) * clamped);\n return `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;\n}\n\n/**\n * Técnica #11: Shader de Recolorização por Separação de 3 Canais (CPU ImageData & GPU Shader Equivalente)\n * L = 0.299·R + 0.587·G + 0.114·B\n * W_core = (min(R, G, B))^2.2\n * W_energy = clamp(chroma * 2.1 + max(0, L - 0.18) * (1 - W_core), 0, 1)\n * W_ink = max(0, 1 - W_energy - W_core)\n */\nexport function recolorReferenceSheetData(src: ImageData, config: VFXConfig): ImageData {\n const out = new ImageData(new Uint8ClampedArray(src.data), src.width, src.height);\n const d = out.data;\n const ink = hexToRgb(config.colors.inkPrimary);\n const nrg = hexToRgb(config.colors.energySecondary);\n const core = hexToRgb(config.colors.coreGlow);\n const boost = config.dynamics.glowIntensity;\n const mode = config.channelMode;\n\n for (let i = 0; i < d.length; i += 4) {\n const a = d[i + 3];\n if (a < 4) continue;\n const r = d[i] / 255;\n const g = d[i + 1] / 255;\n const b = d[i + 2] / 255;\n const lum = 0.299 * r + 0.587 * g + 0.114 * b;\n const maxC = Math.max(r, g, b);\n const minC = Math.min(r, g, b);\n const chroma = maxC - minC;\n\n const wCore = Math.pow(minC, 2.2);\n const wEnergy = Math.min(1, Math.max(0, (chroma * 2.1 + Math.max(0, lum - 0.18) * 0.9) * (1 - wCore)));\n const wInk = Math.max(0, 1 - wEnergy - wCore);\n\n if (mode === 'shader_rgb_mask') {\n d[i] = Math.min(255, Math.round(wInk * 255));\n d[i + 1] = Math.min(255, Math.round(wEnergy * 255));\n d[i + 2] = Math.min(255, Math.round(wCore * 255));\n } else if (mode === 'ink_only') {\n d[i] = ink[0];\n d[i + 1] = ink[1];\n d[i + 2] = ink[2];\n d[i + 3] = Math.round(a * Math.min(1, wInk * 1.4));\n } else if (mode === 'energy_only') {\n d[i] = nrg[0];\n d[i + 1] = nrg[1];\n d[i + 2] = nrg[2];\n d[i + 3] = Math.round(a * Math.min(1, (wEnergy + wCore) * 1.35));\n } else {\n d[i] = Math.min(255, Math.round(ink[0] * wInk + nrg[0] * boost * wEnergy + core[0] * wCore));\n d[i + 1] = Math.min(255, Math.round(ink[1] * wInk + nrg[1] * boost * wEnergy + core[1] * wCore));\n d[i + 2] = Math.min(255, Math.round(ink[2] * wInk + nrg[2] * boost * wEnergy + core[2] * wCore));\n }\n }\n return out;\n}\n","import {\n ArchetypeId,\n MagicSchool,\n SansuiComposition,\n SansuiThemeId,\n SansuiThemePreset,\n SchoolId,\n SumiLayerIntensities,\n TechniqueSpec,\n VFXConfig,\n} from './types';\n\nexport const SANSUI_THEMES: Record<Exclude<SansuiThemeId, 'auto'>, SansuiThemePreset> = {\n classic_washi: {\n id: 'classic_washi',\n name: 'Washi Clássico & Nanquim',\n jp: '水墨山水',\n romaji: 'Suiboku Sansui',\n subtitle: 'Papel Washi envelhecido, nanquim tradicional e aguadas de carvão',\n isDark: false,\n colors: {\n background: '#EFECE4',\n ink: '#181715',\n wash: '#524E46',\n mist: '#EFECE4',\n accent: '#C8232C',\n },\n },\n jade_mineral: {\n id: 'jade_mineral',\n name: 'Verde Mineral & Jade',\n jp: '青緑山水',\n romaji: 'Seiryoku Sansui',\n subtitle: 'Estilo imperial com pigmento mineral verde-celadon nas encostas',\n isDark: false,\n colors: {\n background: '#EDE8DC',\n ink: '#1A211E',\n wash: '#527361',\n mist: '#EDE8DC',\n accent: '#3B6E52',\n },\n },\n night_obsidian: {\n id: 'night_obsidian',\n name: 'Noite Obsidiana (Dark Mode)',\n jp: '夜行山水',\n romaji: 'Yakō Sansui',\n subtitle: 'Céu noturno em carvão profundo com cristas iluminadas em marfim',\n isDark: true,\n colors: {\n background: '#141518',\n ink: '#E8E2D5',\n wash: '#2A2D34',\n mist: '#141518',\n accent: '#C8232C',\n },\n },\n crimson_dawn: {\n id: 'crimson_dawn',\n name: 'Alvorada Carmesim',\n jp: '暁山水',\n romaji: 'Akatsuki Sansui',\n subtitle: 'Bruma matinal aquecida por aguadas de vermelhão e cinza-pedra',\n isDark: false,\n colors: {\n background: '#F2ECE4',\n ink: '#1D1817',\n wash: '#944347',\n mist: '#F2ECE4',\n accent: '#C8232C',\n },\n },\n cobalt_porcelain: {\n id: 'cobalt_porcelain',\n name: 'Azul Índigo & Porcelana',\n jp: '藍染山水',\n romaji: 'Aizome Sansui',\n subtitle: 'Tons serenos de índigo oriental sobre papel de arroz claro',\n isDark: false,\n colors: {\n background: '#EDF0F2',\n ink: '#101C29',\n wash: '#3B5C7A',\n mist: '#EDF0F2',\n accent: '#1E4E79',\n },\n },\n};\n\nexport const SANSUI_COMPOSITIONS: {\n id: SansuiComposition;\n name: string;\n jp: string;\n romaji: string;\n ptMeaning: string;\n description: string;\n}[] = [\n {\n id: 'panoramic_river',\n name: 'Horizonte Fluvial & Barco Solitário',\n jp: '江湖遠景',\n romaji: 'Kōko Enkei',\n ptMeaning: 'Águas tranquilas que se estendem até o horizonte infinito',\n description:\n 'Grande espelho d’água com ondulações calmas, ilhas distantes na neblina, promontório rochoso em primeiro plano e pescador solitário.',\n },\n {\n id: 'karst_peaks',\n name: 'Picos Escarpados & Abismo',\n jp: '奇峰聳立',\n romaji: 'Kihō Shōritsu',\n ptMeaning: 'Picos extraordinários que se erguem com majestade acima das nuvens',\n description:\n 'Torres verticais dramáticas com fissuras de rocha Cunfa, pinheiros agarrados às escarpas e silhuetas fantasmas ao fundo.',\n },\n {\n id: 'layered_valley',\n name: 'Vale das Cinco Neblinas',\n jp: '重巒畳嶂',\n romaji: 'Jūran Jōshō',\n ptMeaning: 'Cordilheiras sobrepostas em harmonia profunda entre o céu e a terra',\n description:\n 'Cinco a sete camadas de colinas e montanhas entrelaçadas com aguada mineral, matas de pinheiros nas cristas e neblina nos vales.',\n },\n {\n id: 'twin_gorges',\n name: 'Desfiladeiro Noturno & Travessia',\n jp: '峡谷孤舟',\n romaji: 'Kyōkoku Koshū',\n ptMeaning: 'A travessia serena entre grandes paredes de rocha milenar',\n description:\n 'Picos imponentes flanqueando um canal profundo com ilha de pinheiros em primeiro plano, perfeito tanto em papel claro quanto no Modo Noturno.',\n },\n];\n\nexport const MAGIC_SCHOOLS: Record<SchoolId, MagicSchool> = {\n fuji_sakura: {\n id: 'fuji_sakura',\n name: 'Monte Fuji & Sakura Carmesim',\n elementStyle: 'Sumi-e Clássico · Sol & Cerejeira',\n colors: {\n inkPrimary: '#141413',\n energySecondary: '#C8232C',\n coreGlow: '#FFF5F5',\n sporeAccent: '#E11D48',\n },\n },\n calligraphy_tide: {\n id: 'calligraphy_tide',\n name: 'Maré Caligráfica',\n elementStyle: 'Hidromancia · Tinta & Espuma',\n colors: {\n inkPrimary: '#061320',\n energySecondary: '#38BDF8',\n coreGlow: '#F0F9FF',\n sporeAccent: '#7DD3FC',\n },\n },\n fungal_emerald: {\n id: 'fungal_emerald',\n name: 'Éter Fúngico & Esmeralda',\n elementStyle: 'Bio-Arcano · Referência',\n colors: {\n inkPrimary: '#080D0A',\n energySecondary: '#8BE36A',\n coreGlow: '#F6FFF0',\n sporeAccent: '#4ADE80',\n },\n },\n toxic_venom: {\n id: 'toxic_venom',\n name: 'Veneno & Peçonha Ácida',\n elementStyle: 'Alquimia · Miasma Corrosivo',\n colors: {\n inkPrimary: '#0E1708',\n energySecondary: '#A3E635',\n coreGlow: '#ECFCCB',\n sporeAccent: '#84CC16',\n },\n },\n abyssal_curse: {\n id: 'abyssal_curse',\n name: 'Maldição & Grilhão Abissal',\n elementStyle: 'Bruxaria · Sombra & Agonia',\n colors: {\n inkPrimary: '#0F051D',\n energySecondary: '#C026D3',\n coreGlow: '#FAE8FF',\n sporeAccent: '#9333EA',\n },\n },\n blood_shadow: {\n id: 'blood_shadow',\n name: 'Sangue & Hemomancia',\n elementStyle: 'Vampírico · Corte Arterial',\n colors: {\n inkPrimary: '#190408',\n energySecondary: '#E11D48',\n coreGlow: '#FFE4E6',\n sporeAccent: '#9F1239',\n },\n },\n necro_phantom: {\n id: 'necro_phantom',\n name: 'Necromancia & Fogo-Fátuo',\n elementStyle: 'Post-Mortem · Alma & Osso',\n colors: {\n inkPrimary: '#091114',\n energySecondary: '#2DD4BF',\n coreGlow: '#F0FDFA',\n sporeAccent: '#E2E8F0',\n },\n },\n capoeira_dende: {\n id: 'capoeira_dende',\n name: 'Axé Solar & Dendê',\n elementStyle: 'Capoeira · Cinética & Fogo',\n colors: {\n inkPrimary: '#1A0E07',\n energySecondary: '#F59E0B',\n coreGlow: '#FEF9C3',\n sporeAccent: '#EA580C',\n },\n },\n abyssal_flame: {\n id: 'abyssal_flame',\n name: 'Chama Abissal & Cinza',\n elementStyle: 'Pirocinese · Brasa & Fuligem',\n colors: {\n inkPrimary: '#160706',\n energySecondary: '#FF5331',\n coreGlow: '#FFF6CC',\n sporeAccent: '#F59E0B',\n },\n },\n celestial_thunder: {\n id: 'celestial_thunder',\n name: 'Trovão Celestial',\n elementStyle: 'Eletromancia · Alta Voltagem',\n colors: {\n inkPrimary: '#0B071E',\n energySecondary: '#A855F7',\n coreGlow: '#ECFEFF',\n sporeAccent: '#22D3EE',\n },\n },\n astral_gold: {\n id: 'astral_gold',\n name: 'Luz Astral & Ouro',\n elementStyle: 'Geomancia · Ordem Divina',\n colors: {\n inkPrimary: '#171206',\n energySecondary: '#FACC15',\n coreGlow: '#FEFCE8',\n sporeAccent: '#F59E0B',\n },\n },\n};\n\nexport const ARCHETYPE_CATALOG: {\n id: ArchetypeId;\n name: string;\n category: string;\n defaultSchool: SchoolId;\n description: string;\n}[] = [\n {\n id: 'hyb_slash_great_wave_katana',\n name: 'Corte da Grande Onda (Katana Hokusai)',\n category: 'Ukiyo-e · Hokusai',\n defaultSchool: 'calligraphy_tide',\n description: 'Golpe em arco com 5 correntes listradas internas e clusters de garras de espuma na crista.',\n },\n {\n id: 'sakura_tempest_slash',\n name: 'Tempestade de Sakura & Galho Sumi-e',\n category: 'Sumi-e · Cerejeira',\n defaultSchool: 'fuji_sakura',\n description: 'Fita de nanquim Kasure acompanhada por redemoinho de flores de cerejeira e pétalas S-Curve.',\n },\n {\n id: 'hyb_slash_crimson_phoenix_arc',\n name: 'Talho da Fênix Carmesim (Odachi S-Curve)',\n category: 'Suibokuga · Fogo',\n defaultSchool: 'abyssal_flame',\n description: 'Coroa de pétalas de chama aquareladas em curva S com 5 paradas e fitas desprendidas.',\n },\n {\n id: 'hyb_slash_blood_moon_scythe',\n name: 'Ceifa da Lua de Sangue (Foice 270°)',\n category: 'Sumi-e · Kasure',\n defaultSchool: 'blood_shadow',\n description: 'Varredura ampla de 270° com 28 filamentos individuais e ranhuras de pincel seco Flying-White.',\n },\n {\n id: 'crescent',\n name: 'Meia-Lua Caligráfica Mestre',\n category: 'Sakuga · Slash',\n defaultSchool: 'fungal_emerald',\n description: 'Arquétipo mestre: aceleração explosiva nos 3 primeiros quadros e erosão celular FBM 2D.',\n },\n {\n id: 'water_slash',\n name: 'Corte d’Água & Éter Fluido',\n category: 'Sakuga · Erosão',\n defaultSchool: 'calligraphy_tide',\n description: 'Serpenteio fluido com ondas de gancho externas e gotas centrífugas alongadas pela tangente.',\n },\n {\n id: 'enso_sigil',\n name: 'Círculo Zen Ensō & Selo Solar',\n category: 'Sumi-e · Caligrafia',\n defaultSchool: 'fuji_sakura',\n description: 'Anel caligráfico traçado em gesto único de 325° com fenda orgânica onde as cerdas secam.',\n },\n {\n id: 'elem_fire_meteor_bolide',\n name: 'Cometa Carmesim & Brasa Viva',\n category: 'Suibokuga · Fogo',\n defaultSchool: 'abyssal_flame',\n description: 'Esfera incandescente envolvida por línguas de chama e nuvens orientais.',\n },\n {\n id: 'solid_ref_fumaca',\n name: 'Brisa de Nuvens & Neblina Oriental',\n category: 'Ukiyo-e · Kumo',\n defaultSchool: 'necro_phantom',\n description: 'Volutas ornamentais de neblina que serpenteiam pelo papel como vento.',\n },\n {\n id: 'elem_water_healing_fountain',\n name: 'Fonte Cristalina Tarashikomi',\n category: 'Suibokuga · Aguada',\n defaultSchool: 'fungal_emerald',\n description: 'Manchas orgânicas de aquarela japonesa com borda de sangria de pigmento e correntes ascendentes.',\n },\n {\n id: 'portal_abyssal_vortex',\n name: 'Portal & Vórtice Espiral Abissal',\n category: 'Arco Polar · Vórtice',\n defaultSchool: 'abyssal_curse',\n description: 'Braços espirais logarítmicos convergindo sobre núcleo abissal oclusivo e aguada Tarashikomi.',\n },\n];\n\nexport const DEFAULT_VFX_CONFIG: VFXConfig = {\n archetype: 'hyb_slash_great_wave_katana',\n school: 'calligraphy_tide',\n colors: {\n inkPrimary: '#081C2E',\n energySecondary: '#38BDF8',\n coreGlow: '#F0F9FF',\n sporeAccent: '#0284C7',\n },\n bgMode: 'washi',\n channelMode: 'composite',\n brush: {\n bristleCount: 24,\n strokeThickness: 1.2,\n taperStart: 0.9,\n taperEnd: 0.95,\n dryBrushGap: 0.34,\n curvature: 1,\n angle: 0,\n arcSweep: 1,\n },\n dynamics: {\n splatterCount: 28,\n splatterSpread: 1.4,\n hookWaves: 4,\n erosionStrength: 0.9,\n erosionScale: 1.1,\n glowIntensity: 1.35,\n colorOffset: 1.15,\n jitterAmount: 0.3,\n },\n rough: {\n roughness: 1,\n bowing: 0.85,\n outlineWidth: 1.5,\n fillStyle: 'solid',\n celSteps: 3,\n },\n totalFrames: 16,\n fps: 16,\n seed: 8472,\n frameSize: 128,\n};\n\nexport const DEFAULT_FUJI_LAYERS: SumiLayerIntensities = {\n sunIntensity: 1.0,\n mountainIntensity: 1.0,\n sakuraBranchIntensity: 1.0,\n sakuraPetalsIntensity: 1.0,\n waterReflectionIntensity: 1.0,\n mistKumoIntensity: 1.0,\n};\n\nexport const TECHNIQUES_CATALOG: TechniqueSpec[] = [\n {\n id: 1,\n code: 'TEC-01',\n title: 'PRNG Determinístico (Mulberry32) & Ruído Fractal FBM 2D',\n subtitle: 'Coerência temporal entre os 16 quadros sem cintilação (flicker) aleatória',\n origin: 'Fundação Matemática Procedural',\n archetype: 'crescent',\n school: 'fungal_emerald',\n equations: [\n 'Mulberry32: a = (seed | 0) + 0x6D2B79F5; distribuição uniforme em [0, 1)',\n 'Smoothstep Hermite: u = xf² · (3 - 2·xf), v = yf² · (3 - 2·yf)',\n 'FBM 3 Oitavas: 0.55·N(x,y,s) + 0.30·N(2.15x+13.7, 2.15y+7.3, s+101) + 0.15·N(4.4x-5.2, 4.4y+19.1, s+307)',\n ],\n invariantsDo: [\n 'Derivar semente deterministicamente por cerda: bristleSeed = config.seed + b * 73',\n 'Usar o mesmo seed nos 16 quadros para corroer exatamente as mesmas ilhas de tinta',\n ],\n invariantsDont: [\n 'JAMAIS chamar Math.random() dentro do loop de renderização de quadros',\n 'Proibido usar ruído de 1 única oitava para erosão de nanquim',\n ],\n description:\n 'Garante que cada cerda, gota e ilha de nanquim mantenha sua identidade física do quadro 1 ao 16 sem cintilação.',\n },\n {\n id: 2,\n code: 'TEC-02',\n title: 'Amostradores de Curvas Paramétricas (Arco Polar 3D Tilt & Bézier S-Curve)',\n subtitle: 'Geração de espinhas dorsais Point2D com vetores normais analíticos para espessura e camadas',\n origin: 'Cinemática Caligráfica & Espadas 2D',\n archetype: 'sakura_tempest_slash',\n school: 'capoeira_dende',\n equations: [\n 'Arco Polar 3D Tilt: r(t) = r0 · (1 + spiralFactor · (t - 0.5))',\n 'Bézier Cúbica: B(t) = (1-t)³P0 + 3(1-t)²tP1 + 3(1-t)t²P2 + t³P3',\n 'Vetor Normal Unitário: (nx, ny) = (-dy / ||B\\'(t)||, dx / ||B\\'(t)||)',\n ],\n invariantsDo: [\n 'Calcular derivada analítica (dx, dy) para normais contínuas sem degraus',\n 'Aplicar jitter orgânico multiplicando sampleNoise2D pelo vetor normal (nx, ny)',\n ],\n invariantsDont: ['Proibido usar ctx.arc() nativo de largura constante para golpes caligráficos'],\n description:\n 'Amostra espinhas dorsais de 60 a 110 pontos com normais analíticas que permitem separar o canal de Tinta do canal de Energia.',\n },\n {\n id: 3,\n code: 'TEC-03',\n title: 'Fita Caligráfica Multi-Cerdas Sumi-e com Efeito Kasure (Flying-White)',\n subtitle: 'Simulação de 10 a 38 filamentos individuais de pincel com pressão variável e ranhuras secas',\n origin: 'Pintura Caligráfica Japonesa Sumi-e',\n archetype: 'hyb_slash_blood_moon_scythe',\n school: 'blood_shadow',\n equations: [\n 'Posição da Cerda: u = (b / (bristleCount - 1)) * 2 - 1 ∈ [-1, 1]',\n 'Envelope de Pressão: E(t) = sin(min(1, 1.35·t) · π/2) · (1-t)^(0.35 + 1.15·taperEnd) · 1.65',\n 'Convergência na Lâmina: spread(t) = (1 - 0.72·t)^0.75',\n ],\n invariantsDo: [\n 'Construir cada segmento de cerda como polígono fechado preenchido com ctx.fill()',\n 'Incluir a gota arredondada de apoio inicial do pincel (roundHeadCap)',\n ],\n invariantsDont: ['Proibido desenhar linha grossa única com ctx.lineWidth sem subdivisão em cerdas'],\n description:\n 'Reproduz a abertura real das cerdas de bambu no golpe rápido, deixando trilhas brancas onde o papel Washi aparece.',\n },\n {\n id: 4,\n code: 'TEC-04',\n title: 'Erosão Celular Progressiva por Limiar de Ruído & Gotas Centrífugas',\n subtitle: 'Dissolução orgânica da tinta em ilhas isoladas de nanquim em vez de fade-out fantasma',\n origin: 'Animação 2D Tradicional de Efeitos (Sakuga VFX)',\n archetype: 'water_slash',\n school: 'calligraphy_tide',\n equations: [\n 'Attack Snap: headReach = min(1, 1 - (1 - frameNorm)^3.4)',\n 'Retração da Cauda: tailRetract = max(0, (frameNorm - 0.18) / 0.82)^1.55 * 0.78',\n 'Corte Celular: fbmNoise2D(...) < erosionProgress * 0.92 + tailBias - 0.18',\n ],\n invariantsDo: [\n 'Manter opacidade alta (0.85 a 1.0) enquanto corrói o polígono em ilhas orgânicas',\n 'Alongar gotas centrífugas na direção tangente + normal da velocidade',\n ],\n invariantsDont: ['NUNCA desaparecer um golpe apenas reduzindo ctx.globalAlpha de 1 para 0'],\n description:\n 'Preserva 100% de presença gráfica nos fragmentos restantes enquanto quebra a pincelada da cauda para a ponta.',\n },\n {\n id: 5,\n code: 'TEC-05',\n title: 'Pétalas de Chama Aquareladas em S-Curve com Estrias Fibrosas',\n subtitle: 'Síntese de fogo e pétalas orientais combinando línguas curvas sobrepostas e pontas saturadas',\n origin: 'Aquarela Oriental Suibokuga & Caligrafia de Fogo',\n archetype: 'hyb_slash_crimson_phoenix_arc',\n school: 'abyssal_flame',\n equations: [\n 'Envelope de Barriga: bellyEnv(t) = sin(t^0.58 · π) · (1 - t)^0.7 · 1.48',\n 'Assimetria Lateral: esquerda 1.0 · halfW, direita 0.88 · halfW',\n 'Gradiente Aquarelado de 5 Paradas: base clara (t=0) → meio energético → ponta escura nanquim (t=1)',\n ],\n invariantsDo: [\n 'Sobrepor pétalas em 2 a 3 camadas com estrias fibrosas internas',\n 'Adicionar fitas caligráficas desprendidas (wisps) subindo acima das pontas',\n ],\n invariantsDont: ['Proibido desenhar fogo usando triângulos retos ou círculos borrados com shadowBlur'],\n description:\n 'Na aquarela oriental Suibokuga, o pigmento escuro se acumula nas pontas e bordas superiores das pétalas em curva S.',\n },\n {\n id: 6,\n code: 'TEC-06',\n title: 'Cristas de Onda Ukiyo-e (Hokusai), Correntes Listradas & Garras de Espuma',\n subtitle: 'Síntese da Grande Onda de Kanagawa com faixas longitudinais e garras articuladas na crista',\n origin: 'Xilogravura Japonesa Ukiyo-e (Katsushika Hokusai)',\n archetype: 'hyb_slash_great_wave_katana',\n school: 'calligraphy_tide',\n equations: [\n 'Envelope Muscular da Vaga: waveEnv(t) = sin(t^0.55 · π · 0.92) · (1 - 0.35·t) + 0.35·(1 - t)',\n 'Correntes Longitudinais: 5 faixas paralelas em u ∈ [-0.72, +0.72] alternando coreGlow e inkPrimary',\n 'Garras de Espuma: clusters fractais na ponta (t=1.0) e no dorso (t=0.62)',\n ],\n invariantsDo: [\n 'Plantar 5 a 7 garras de espuma na crista e 3 no dorso contornadas a nanquim',\n 'Traçar as 5 faixas longitudinais internas acompanhando a barriga côncava da vaga',\n ],\n invariantsDont: ['Proibido representar água apenas como círculos azuis translúcidos sem garras e listras'],\n description:\n 'Divide qualquer efeito aquático nos 4 componentes anatômicos clássicos das xilogravuras de Hokusai.',\n },\n {\n id: 7,\n code: 'TEC-07',\n title: 'Bancos de Nuvens & Fumaça Ukiyo-e (Kumo) com Volutas em C-Hook',\n subtitle: 'Substituição total de esferas empilhadas por volutas ornamentais com cauda afilada e caracol interno',\n origin: 'Gravuras Tradicionais de Nuvens Ukiyo-e (Kumo)',\n archetype: 'solid_ref_fumaca',\n school: 'necro_phantom',\n equations: [\n 'Crista Superior Lobulada: lóbulo(t) = 0.58 + 0.42 · |sin(t · π · lobeCount)|',\n 'Envelope da Cauda Afilada: tailTaper(t) = sin(t^0.62 · π) · 1.28',\n 'Caracol Espiral C-Hook: ang = headAng + flip * (0.4 + u * π * 2.25), r = curlR * (0.92 - u * 0.76)',\n ],\n invariantsDo: [\n 'Desenhar sempre o caracol interno em C-Hook com traço mais espesso na cabeça e fino no centro',\n 'Agrupar de 3 a 6 volutas para formar bancos de neblina oriental ou fumaça vulcânica',\n ],\n invariantsDont: ['PROIBIDO usar loops de ctx.arc() ou círculos empilhados (\"cotton-ball smoke\")'],\n description:\n 'Constrói neblina do Monte Fuji e fumaça com cristas lobuladas superiores, caudas longas e caracóis internos duplos.',\n },\n {\n id: 8,\n code: 'TEC-08',\n title: 'Núcleo Sólido 100% Opaco com Oclusão Real & Línguas Envolventes',\n subtitle: 'Eliminação do aspecto de adesivo translúcido através de oclusão em 3 camadas (Cauda → Esfera → Abraço)',\n origin: 'Pintura de Projéteis & Meteoros Action RPG',\n archetype: 'elem_fire_meteor_bolide',\n school: 'abyssal_flame',\n equations: [\n 'Deformação do Núcleo: R(θ) = R0 · (1 + (fbmNoise2D(cos θ · 1.6, sin θ · 1.6, seed) - 0.5) · wobble)',\n 'Z-Order Estrito: Passo 1 (Cauda Traseira) → Passo 2 (Esfera Hex Alpha 1.0) → Passo 3 (Wrapping Tongues)',\n ],\n invariantsDo: [\n 'Garantir que todas as paradas do gradiente radial do núcleo tenham opacidade 1.0 (cores Hex puras)',\n 'Desenhar línguas frontais/laterais após a esfera opaca para abraçar o projétil',\n ],\n invariantsDont: ['Nunca deixar linhas de cauda visíveis atravessando o interior da cabeça do cometa/meteoro'],\n description:\n 'Opera em 3 passos estritos de Z-ordering para que o núcleo tenha massa sólida real integrada ao fluxo da cauda.',\n },\n {\n id: 9,\n code: 'TEC-09',\n title: 'Aguada Suibokuga (Tarashikomi) com Borda de Sangria de Pigmento',\n subtitle: 'Manchas orgânicas de aquarela japonesa onde o pigmento se concentra no anel externo úmido',\n origin: 'Pintura Rinpa & Suibokuga Japonesa (Tarashikomi)',\n archetype: 'elem_water_healing_fountain',\n school: 'fuji_sakura',\n equations: [\n 'Polígono Amebóide (32 vértices): r(θ) = rBase · (1 + (fbmNoise2D(...) - 0.5) · 0.34)',\n 'Gradiente Tarashikomi: stop 0.0 (alpha 0.42) → stop 0.68 (0.58) → stop 0.90 (0.74 pico úmido!) → stop 1.0 (0.0)',\n ],\n invariantsDo: [\n 'Aplicar a aguada Tarashikomi como camada atmosférica de base ou no disco solar carmesim',\n ],\n invariantsDont: ['Proibido usar ctx.filter = \"blur(12px)\" que degrada a performance em tempo real'],\n description:\n 'Simula o gotejamento de tinta sobre papel Washi úmido, empurrando o pigmento para a auréola externa (\"water-bloom rim\").',\n },\n {\n id: 10,\n code: 'TEC-10',\n title: 'Geometria Poligonal Sólida Hand-Made com Rough.js (Cristais & Facetas)',\n subtitle: 'Integração vetorial Rough.js para silhuetas desenhadas à mão, cristais chanfrados e hachuras',\n origin: 'Ilustração Hand-Crafted 2D & Cel-Shading Analógico',\n archetype: 'elem_water_glacial_spikes',\n school: 'calligraphy_tide',\n equations: [\n 'Bipartição Cel-Shaded: Polígono Esquerdo (coreGlow luz alta) + Polígono Direito (energySecondary sombra)',\n 'Rough.js Determinístico: seed = Math.max(1, Math.floor(config.seed + seedOffset))',\n ],\n invariantsDo: [\n 'Passar sempre seed inteiro determinístico no objeto Options do Rough.js',\n 'Permitir alternar fillStyle entre solid, hachure, cross-hatch e zigzag',\n ],\n invariantsDont: ['Jamais chamar rc.polygon() ou rc.curve() sem definir explicitamente a propriedade seed'],\n description:\n 'Cria cristais glaciais, rochas tectônicas e as facetas nevadas do Monte Fuji com traço duplo caligráfico.',\n },\n {\n id: 11,\n code: 'TEC-11',\n title: 'Shader de Recolorização por Separação de 3 Canais (Web, Godot 4 & Unity)',\n subtitle: 'Decomposição matemática em pesos de Tinta Abissal, Energia Elemental e Núcleo Branco',\n origin: 'Pipeline de Shaders para Engines de Jogos 2D',\n archetype: 'enso_sigil',\n school: 'astral_gold',\n equations: [\n 'Luminância Perceptual: L = 0.299·R + 0.587·G + 0.114·B',\n 'Pesos: W_core = (min(R,G,B))^2.2; W_energy = clamp(chroma*2.1 + max(0,L-0.18)*(1-W_core), 0, 1); W_ink = 1 - W_energy - W_core',\n 'Reconstrução: RGB_out = InkColor·W_ink + (EnergyColor·GlowBoost)·W_energy + CoreColor·W_core',\n ],\n invariantsDo: [\n 'Preservar o canal Alpha original e suportar exportação de máscara pura RGB (#FF0000, #00FF00, #0000FF)',\n ],\n invariantsDont: ['Proibido usar multiplicação simples de cor (tint multiply) que apaga o brilho sobre o nanquim'],\n description:\n 'Permite recolorir qualquer efeito ou textura instantaneamente para qualquer uma das Escolas de Magia.',\n },\n {\n id: 12,\n code: 'TEC-12',\n title: 'Pipeline de Composição Sprite Sheet 4×4 & Codificador Binário GIF89a LZW',\n subtitle: 'Renderização de grade 16 quadros com isolamento ctx.clip() e exportação GIF transparente nativa',\n origin: 'Engenharia de Exportação de Assets 2D',\n archetype: 'hyb_slash_great_wave_katana',\n school: 'calligraphy_tide',\n equations: [\n 'Mapeamento 4×4: col = frameIndex % 4, row = floor(frameIndex / 4)',\n 'Isolamento: ctx.rect(col*S, row*S, S, S) -> ctx.clip() -> ctx.translate(col*S, row*S)',\n 'GIF89a LZW: Graphics Control Extension (0x21 0xF9) com Disposal Method = 2 e índice transparente 255',\n ],\n invariantsDo: [\n 'Aplicar ctx.clip() estrito em cada célula antes de renderizar o quadro',\n 'Usar Disposal Method = 2 no GIF89a para não acumular rastro entre frames transparentes',\n ],\n invariantsDont: ['Jamais deixar respingos centrífugos invadirem a célula vizinha da Sprite Sheet'],\n description:\n 'Exporta grades 4×4 prontas para engines e GIFs animados transparentes sem dependências externas.',\n },\n];\n","import rough from 'roughjs';\nimport type { Options as RoughOptions } from 'roughjs/bin/core';\nimport { createSeededRandom, fbmNoise2D, mixHex, rgbaStr, sampleCubicCurve, sampleNoise2D, sampleQuadraticCurve } from './math';\nimport { Point2D, SumiColors, VFXConfig } from './types';\n\ntype RoughCanvasInstance = ReturnType<typeof rough.canvas>;\n\n/**\n * Técnica #10: Opções Determinísticas para Rough.js\n */\nexport function makeFineRoughOptions(\n config: VFXConfig,\n scale: number,\n seedOffset: number,\n overrides: Partial<RoughOptions> = {}\n): RoughOptions {\n const rp = config.rough;\n const palette = config.colors;\n return {\n roughness: rp.roughness * 0.65,\n bowing: rp.bowing * 0.8,\n stroke: rgbaStr(palette.inkPrimary, 0.85),\n strokeWidth: Math.max(0.45, rp.outlineWidth * 0.6 * scale),\n fillStyle: rp.fillStyle === 'solid' ? 'solid' : rp.fillStyle,\n fillWeight: Math.max(0.4, rp.outlineWidth * 0.38 * scale),\n hachureGap: Math.max(2.2, 3.5 * scale),\n seed: Math.max(1, Math.floor(config.seed + seedOffset)),\n ...overrides,\n };\n}\n\n/**\n * Técnica #03 & #04: Fita Caligráfica Multi-Cerdas Sumi-e com Efeito Kasure (Flying-White)\n * + Erosão Celular Progressiva por Limiar de Ruído FBM 2D\n */\nexport interface KasureRibbonOpts {\n spine: Point2D[];\n maxWidth: number;\n bristleCount: number;\n dryBrushGap: number;\n taperStart: number;\n taperEnd: number;\n color: string;\n alpha?: number;\n offsetNormal?: number;\n headReach?: number;\n tailRetract?: number;\n erosionProgress?: number;\n erosionScale?: number;\n hookWaves?: number;\n roundHeadCap?: boolean;\n seed: number;\n}\n\nexport function drawSumiKasureRibbon(\n ctx: CanvasRenderingContext2D,\n opts: KasureRibbonOpts\n) {\n const {\n spine,\n maxWidth,\n bristleCount,\n dryBrushGap,\n taperStart,\n taperEnd,\n color,\n alpha = 1,\n offsetNormal = 0,\n headReach = 1,\n tailRetract = 0,\n erosionProgress = 0,\n erosionScale = 1,\n hookWaves = 0,\n roundHeadCap = true,\n seed,\n } = opts;\n\n if (spine.length < 2 || headReach <= tailRetract + 0.01) return;\n\n const actualBristles = Math.max(1, Math.min(44, Math.round(bristleCount)));\n ctx.save();\n ctx.fillStyle = rgbaStr(color, alpha);\n\n // Gota inicial de apoio do pincel (roundHeadCap) nos primeiros quadros\n if (roundHeadCap && tailRetract < 0.12 && erosionProgress < 0.35) {\n const startIdx = Math.min(spine.length - 1, Math.floor(tailRetract * spine.length));\n const pStart = spine[startIdx];\n if (pStart) {\n const capR = maxWidth * 0.28 * (1 - erosionProgress * 0.6);\n ctx.beginPath();\n ctx.arc(\n pStart.x + pStart.nx * offsetNormal,\n pStart.y + pStart.ny * offsetNormal,\n Math.max(1, capR),\n 0,\n Math.PI * 2\n );\n ctx.fill();\n }\n }\n\n for (let b = 0; b < actualBristles; b++) {\n const bSeed = seed + b * 73;\n const rand = createSeededRandom(bSeed);\n const u = actualBristles === 1 ? 0 : (b / (actualBristles - 1)) * 2 - 1;\n\n // Lacuna de Pincel Seco (Kasure): omite certos filamentos intermediários\n if (Math.abs(u) > 0.18 && Math.abs(u) < 0.84 && rand() < dryBrushGap * 0.55) {\n continue;\n }\n\n const bristleStartShift = (rand() - 0.5) * 0.06;\n const bristleEndShift = (rand() - 0.5) * 0.08;\n const activeStart = Math.max(0, tailRetract + bristleStartShift);\n const activeEnd = Math.min(1, headReach + bristleEndShift);\n if (activeEnd <= activeStart + 0.02) continue;\n\n const bristleWidthWeight =\n (maxWidth / actualBristles) * (1.18 + (rand() - 0.5) * 0.45) * (1 - Math.abs(u) * 0.22);\n\n let leftEdge: { x: number; y: number }[] = [];\n let rightEdge: { x: number; y: number }[] = [];\n let inSegment = false;\n\n const flushSegment = () => {\n if (leftEdge.length >= 2) {\n ctx.beginPath();\n ctx.moveTo(leftEdge[0].x, leftEdge[0].y);\n for (let i = 1; i < leftEdge.length; i++) {\n ctx.lineTo(leftEdge[i].x, leftEdge[i].y);\n }\n for (let i = rightEdge.length - 1; i >= 0; i--) {\n ctx.lineTo(rightEdge[i].x, rightEdge[i].y);\n }\n ctx.closePath();\n ctx.fill();\n }\n leftEdge = [];\n rightEdge = [];\n inSegment = false;\n };\n\n for (let i = 0; i < spine.length; i++) {\n const pt = spine[i];\n if (pt.t < activeStart || pt.t > activeEnd) {\n if (inSegment) flushSegment();\n continue;\n }\n\n const localT = Math.max(0, Math.min(1, (pt.t - activeStart) / Math.max(0.001, activeEnd - activeStart)));\n\n // Técnica #04: Erosão Celular Progressiva por Limiar de Ruído FBM 2D\n if (erosionProgress > 0.02) {\n const nVal = fbmNoise2D(pt.t * 8.5 * erosionScale + u * 2.2, b * 0.35 + seed * 0.05, bSeed);\n const tailBias = (1 - localT) * 0.35 + Math.abs(u) * 0.18;\n if (nVal < erosionProgress * 0.92 + tailBias - 0.18) {\n if (inSegment) flushSegment();\n continue;\n }\n }\n\n // Lacunas secas ao longo da parte final do traço (Flying-White Kasure)\n if (dryBrushGap > 0.05 && localT > 0.35) {\n const streakNoise = sampleNoise2D(localT * 14, b * 1.7, bSeed + 19);\n if (streakNoise < dryBrushGap * (localT - 0.25) * 0.85) {\n if (inSegment) flushSegment();\n continue;\n }\n }\n\n // Técnica #03: Envelope Caligráfico de Pressão\n const headProfile = Math.pow(Math.min(1, localT * 4.5), Math.max(0.15, 1 - taperStart * 0.7));\n const tailProfile = Math.pow(Math.max(0, 1 - localT), 0.35 + taperEnd * 1.35);\n const envelope =\n Math.sin(Math.min(1, localT * 1.35) * Math.PI * 0.5) * tailProfile * 1.65 +\n headProfile * (1 - localT) * 0.85;\n\n // Convergência total na ponta quando taperEnd é alto (evita ponta quadrada nos galhos!)\n const convergenceStrength = 0.72 + taperEnd * 0.27;\n const spreadFactor = Math.pow(\n Math.max(0.005, 1 - localT * convergenceStrength),\n 0.75 + taperEnd * 0.65\n );\n const hookMod =\n hookWaves > 0 && u > 0.25\n ? Math.sin(localT * Math.PI * hookWaves * 2 + b * 0.4) * maxWidth * 0.16 * u * localT\n : 0;\n\n const lateralCenter =\n offsetNormal +\n u * maxWidth * 0.52 * spreadFactor +\n Math.sin(localT * Math.PI * 3 + b) * (dryBrushGap * 2.2 * spreadFactor) +\n hookMod;\n\n const minTipHalfThick = taperEnd > 0.8 ? 0.12 * (1 - localT * 0.85) : 0.4;\n const halfThick = Math.max(minTipHalfThick, bristleWidthWeight * envelope * 0.55);\n leftEdge.push({\n x: pt.x + pt.nx * (lateralCenter - halfThick),\n y: pt.y + pt.ny * (lateralCenter - halfThick),\n });\n rightEdge.push({\n x: pt.x + pt.nx * (lateralCenter + halfThick),\n y: pt.y + pt.ny * (lateralCenter + halfThick),\n });\n inSegment = true;\n }\n\n if (inSegment) flushSegment();\n }\n\n ctx.restore();\n}\n\n/**\n * Técnica #04: Gotas Centrífugas Alongadas na Direção Tangente + Normal\n */\nexport function drawCentrifugalSplatters(\n ctx: CanvasRenderingContext2D,\n spine: Point2D[],\n frameNorm: number,\n splatterCount: number,\n splatterSpread: number,\n scale: number,\n colors: SumiColors,\n seed: number\n) {\n if (spine.length < 4 || splatterCount <= 0) return;\n const rand = createSeededRandom(seed + 991);\n ctx.save();\n\n for (let s = 0; s < splatterCount; s++) {\n const birthFrame = rand() * 0.55;\n if (frameNorm < birthFrame) continue;\n const life = (frameNorm - birthFrame) / Math.max(0.1, 1 - birthFrame);\n if (life > 1) continue;\n\n const spineIdx = Math.min(\n spine.length - 2,\n Math.max(1, Math.floor(rand() * (spine.length - 2)))\n );\n const pt = spine[spineIdx];\n const nextPt = spine[spineIdx + 1];\n const tx = nextPt.x - pt.x;\n const ty = nextPt.y - pt.y;\n const tLen = Math.hypot(tx, ty) || 1;\n const ux = tx / tLen;\n const uy = ty / tLen;\n\n const outSign = rand() > 0.25 ? 1 : -1;\n const speed = (12 + rand() * 28) * splatterSpread * scale;\n const dist = Math.pow(life, 0.72) * speed;\n\n const vx = ux * 0.65 + pt.nx * outSign * (0.45 + rand() * 0.5);\n const vy = uy * 0.65 + pt.ny * outSign * (0.45 + rand() * 0.5);\n const vAngle = Math.atan2(vy, vx);\n\n const dropX = pt.x + Math.cos(vAngle) * dist;\n const dropY = pt.y + Math.sin(vAngle) * dist;\n\n // Erosão por limiar celular em vez de fade fantasma\n const erodeNoise = fbmNoise2D(s * 1.3, life * 3.5, seed + s * 17);\n if (life > 0.65 && erodeNoise < (life - 0.55) * 1.8) continue;\n\n const baseR = (1.1 + rand() * 2.4) * scale * (1 - life * 0.45);\n const stretch = 1.4 + life * 2.2 * splatterSpread;\n\n const colorPick = rand();\n ctx.fillStyle =\n colorPick < 0.52\n ? colors.inkPrimary\n : colorPick < 0.85\n ? colors.energySecondary\n : colors.coreGlow;\n\n ctx.save();\n ctx.translate(dropX, dropY);\n ctx.rotate(vAngle);\n ctx.beginPath();\n ctx.ellipse(0, 0, Math.max(0.6, baseR * stretch), Math.max(0.5, baseR * 0.65), 0, 0, Math.PI * 2);\n ctx.fill();\n ctx.restore();\n }\n\n ctx.restore();\n}\n\n/**\n * Técnica #05: Pétalas de Chama Aquareladas em S-Curve com Estrias Fibrosas & Fitas Desprendidas\n */\nexport interface FlamePetalTongueOpts {\n rootX: number;\n rootY: number;\n ctrl1X: number;\n ctrl1Y: number;\n ctrl2X: number;\n ctrl2Y: number;\n tipX: number;\n tipY: number;\n maxBellyWidth: number;\n striationCount?: number;\n alpha?: number;\n seed: number;\n}\n\nexport function drawFlamePetalTongue(\n ctx: CanvasRenderingContext2D,\n rc: RoughCanvasInstance | null,\n config: VFXConfig,\n scale: number,\n opts: FlamePetalTongueOpts\n) {\n const {\n rootX,\n rootY,\n ctrl1X,\n ctrl1Y,\n ctrl2X,\n ctrl2Y,\n tipX,\n tipY,\n maxBellyWidth,\n striationCount = 5,\n alpha = 1,\n seed,\n } = opts;\n\n const spine = sampleCubicCurve(\n { x: rootX, y: rootY },\n { x: ctrl1X, y: ctrl1Y },\n { x: ctrl2X, y: ctrl2Y },\n { x: tipX, y: tipY },\n 48,\n config.dynamics.jitterAmount * 0.18,\n seed\n );\n\n const leftPts: [number, number][] = [];\n const rightPts: [number, number][] = [];\n\n for (const pt of spine) {\n // Envelope de Barriga da Pétala: bellyEnv(t) = sin(t^0.58 · π) · (1 - t)^0.7 · 1.48\n const bellyEnv =\n Math.sin(Math.pow(pt.t, 0.58) * Math.PI) * Math.pow(Math.max(0, 1 - pt.t), 0.7) * 1.48;\n const halfW = maxBellyWidth * 0.5 * bellyEnv;\n // Assimetria Lateral: esquerda 1.0 * halfW, direita 0.88 * halfW\n leftPts.push([pt.x - pt.nx * halfW, pt.y - pt.ny * halfW * 0.92]);\n rightPts.push([pt.x + pt.nx * halfW * 0.88, pt.y + pt.ny * halfW]);\n }\n\n const polygon: [number, number][] = [...leftPts, ...rightPts.reverse()];\n\n ctx.save();\n ctx.beginPath();\n polygon.forEach(([px, py], idx) => {\n if (idx === 0) ctx.moveTo(px, py);\n else ctx.lineTo(px, py);\n });\n ctx.closePath();\n\n // Gradiente Aquarelado Suibokuga de 5 Paradas (ponta extrema acumula pigmento escuro)\n const grad = ctx.createLinearGradient(rootX, rootY, tipX, tipY);\n const pal = config.colors;\n grad.addColorStop(0.0, rgbaStr(pal.coreGlow, alpha));\n grad.addColorStop(0.28, rgbaStr(mixHex(pal.coreGlow, pal.energySecondary, 0.35), alpha));\n grad.addColorStop(0.68, rgbaStr(pal.energySecondary, alpha * 0.96));\n grad.addColorStop(0.92, rgbaStr(mixHex(pal.energySecondary, pal.inkPrimary, 0.45), alpha * 0.95));\n grad.addColorStop(1.0, rgbaStr(pal.inkPrimary, alpha));\n\n ctx.fillStyle = grad;\n ctx.fill();\n\n // Estrias Fibrosas Internas\n for (let s = 0; s < striationCount; s++) {\n const u = striationCount === 1 ? 0 : (s / (striationCount - 1)) * 2 - 1;\n ctx.beginPath();\n for (let i = 2; i < spine.length - 2; i += 2) {\n const pt = spine[i];\n const bellyEnv =\n Math.sin(Math.pow(pt.t, 0.58) * Math.PI) * Math.pow(Math.max(0, 1 - pt.t), 0.7) * 1.48;\n const offset = u * 0.36 * maxBellyWidth * bellyEnv;\n const sx = pt.x + pt.nx * offset;\n const sy = pt.y + pt.ny * offset;\n if (i === 2) ctx.moveTo(sx, sy);\n else ctx.lineTo(sx, sy);\n }\n ctx.strokeStyle = rgbaStr(\n s % 2 === 0 ? pal.coreGlow : pal.inkPrimary,\n alpha * (s % 2 === 0 ? 0.5 : 0.42)\n );\n ctx.lineWidth = Math.max(0.5, 0.75 * scale);\n ctx.stroke();\n }\n\n // Contorno Caligráfico Rough.js\n if (rc && config.rough.outlineWidth > 0.1) {\n const roughStepPolygon = polygon.filter((_, idx) => idx % 3 === 0);\n rc.polygon(\n roughStepPolygon,\n makeFineRoughOptions(config, scale, seed, {\n fill: undefined,\n stroke: rgbaStr(pal.inkPrimary, alpha * 0.85),\n })\n );\n }\n\n ctx.restore();\n}\n\nexport function drawDetachedSumiFlameWisp(\n ctx: CanvasRenderingContext2D,\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n width: number,\n color: string,\n seed: number\n) {\n const midX = (startX + endX) * 0.5 + (endY - startY) * 0.25;\n const midY = (startY + endY) * 0.5 - (endX - startX) * 0.25;\n const spine = sampleQuadraticCurve(\n { x: startX, y: startY },\n { x: midX, y: midY },\n { x: endX, y: endY },\n 28,\n 0.2,\n seed\n );\n drawSumiKasureRibbon(ctx, {\n spine,\n maxWidth: width,\n bristleCount: 6,\n dryBrushGap: 0.25,\n taperStart: 0.7,\n taperEnd: 0.95,\n color,\n roundHeadCap: false,\n seed,\n });\n}\n\n/**\n * Técnica #06: Cristas de Onda Ukiyo-e (Hokusai), 5 Correntes Listradas & Garras Fractais de Espuma\n */\nexport function drawHokusaiFoamClawCluster(\n ctx: CanvasRenderingContext2D,\n rc: RoughCanvasInstance | null,\n cx: number,\n cy: number,\n baseAngle: number,\n curlDir: 1 | -1,\n clawCount: number,\n radius: number,\n config: VFXConfig,\n scale: number,\n seed: number\n) {\n const rand = createSeededRandom(seed);\n const pal = config.colors;\n ctx.save();\n\n for (let c = 0; c < clawCount; c++) {\n const u = clawCount === 1 ? 0 : (c / (clawCount - 1)) * 2 - 1;\n const ang = baseAngle + u * 0.65 + (rand() - 0.5) * 0.18;\n const len = radius * (0.72 + (1 - Math.abs(u) * 0.35) * 0.52);\n const tipX = cx + Math.cos(ang + curlDir * 0.55) * len;\n const tipY = cy + Math.sin(ang + curlDir * 0.55) * len;\n\n const baseHalfW = Math.max(1.2, radius * 0.22);\n const perpX = -Math.sin(ang) * baseHalfW;\n const perpY = Math.cos(ang) * baseHalfW;\n\n const ctrlX = cx + Math.cos(ang) * len * 0.65;\n const ctrlY = cy + Math.sin(ang) * len * 0.65;\n\n ctx.beginPath();\n ctx.moveTo(cx - perpX, cy - perpY);\n ctx.quadraticCurveTo(ctrlX - perpX * 0.4, ctrlY - perpY * 0.4, tipX, tipY);\n ctx.quadraticCurveTo(ctrlX + perpX * 0.3, ctrlY + perpY * 0.3, cx + perpX, cy + perpY);\n ctx.closePath();\n\n ctx.fillStyle = pal.coreGlow;\n ctx.fill();\n ctx.strokeStyle = rgbaStr(pal.inkPrimary, 0.88);\n ctx.lineWidth = Math.max(0.65, 0.9 * scale * config.rough.outlineWidth * 0.65);\n ctx.stroke();\n\n if (rc && config.rough.roughness > 0.2) {\n rc.curve(\n [\n [cx - perpX, cy - perpY],\n [ctrlX, ctrlY],\n [tipX, tipY],\n ],\n makeFineRoughOptions(config, scale, seed + c * 31, {\n strokeWidth: Math.max(0.5, 0.7 * scale),\n })\n );\n }\n\n // Gotículas de spray marinho contornadas a nanquim\n if (rand() > 0.25) {\n const dropDist = len * (1.12 + rand() * 0.38);\n const dropAng = ang + curlDir * (0.5 + rand() * 0.35);\n const dx = cx + Math.cos(dropAng) * dropDist;\n const dy = cy + Math.sin(dropAng) * dropDist;\n const dr = Math.max(0.8, (1.1 + rand() * 1.4) * scale);\n ctx.beginPath();\n ctx.arc(dx, dy, dr, 0, Math.PI * 2);\n ctx.fillStyle = pal.coreGlow;\n ctx.fill();\n ctx.strokeStyle = pal.inkPrimary;\n ctx.lineWidth = Math.max(0.45, 0.6 * scale);\n ctx.stroke();\n }\n }\n\n ctx.restore();\n}\n\nexport function drawHokusaiWaveCrest(\n ctx: CanvasRenderingContext2D,\n rc: RoughCanvasInstance | null,\n spine: Point2D[],\n maxWidth: number,\n curlDir: 1 | -1,\n clawCount: number,\n config: VFXConfig,\n scale: number,\n alpha: number,\n seed: number\n) {\n if (spine.length < 6) return;\n const pal = config.colors;\n const leftEdge: [number, number][] = [];\n const rightEdge: [number, number][] = [];\n\n for (const pt of spine) {\n // Envelope Muscular da Vaga: waveEnv(t) = sin(t^0.55 · π · 0.92) · (1 - 0.35·t) + 0.35·(1 - t)\n const waveEnv =\n Math.sin(Math.pow(pt.t, 0.55) * Math.PI * 0.92) * (1 - 0.35 * pt.t) + 0.35 * (1 - pt.t);\n const halfW = maxWidth * 0.48 * waveEnv;\n leftEdge.push([pt.x - pt.nx * halfW, pt.y - pt.ny * halfW]);\n rightEdge.push([pt.x + pt.nx * halfW, pt.y + pt.ny * halfW]);\n }\n\n ctx.save();\n ctx.beginPath();\n leftEdge.forEach(([x, y], i) => (i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y)));\n for (let i = rightEdge.length - 1; i >= 0; i--) {\n ctx.lineTo(rightEdge[i][0], rightEdge[i][1]);\n }\n ctx.closePath();\n\n const startPt = spine[0];\n const endPt = spine[spine.length - 1];\n const grad = ctx.createLinearGradient(startPt.x, startPt.y, endPt.x, endPt.y);\n grad.addColorStop(0.0, rgbaStr(pal.inkPrimary, alpha * 0.95));\n grad.addColorStop(0.55, rgbaStr(pal.energySecondary, alpha * 0.92));\n grad.addColorStop(1.0, rgbaStr(pal.coreGlow, alpha * 0.98));\n ctx.fillStyle = grad;\n ctx.fill();\n\n // 5 Faixas Longitudinais Internas de Correnteza (Hokusai)\n const stripeCount = 5;\n for (let s = 0; s < stripeCount; s++) {\n const u = (s / (stripeCount - 1)) * 1.44 - 0.72;\n const isLightStripe = s % 2 === 0;\n ctx.strokeStyle = rgbaStr(isLightStripe ? pal.coreGlow : pal.inkPrimary, alpha * 0.84);\n ctx.lineWidth = Math.max(0.7, (isLightStripe ? 1.3 : 1.0) * scale);\n ctx.beginPath();\n for (let i = 1; i < spine.length - 2; i += 2) {\n const pt = spine[i];\n const waveEnv =\n Math.sin(Math.pow(pt.t, 0.55) * Math.PI * 0.92) * (1 - pt.t * 0.35) + (1 - pt.t) * 0.35;\n const offset = u * maxWidth * 0.38 * waveEnv;\n const sx = pt.x + pt.nx * offset;\n const sy = pt.y + pt.ny * offset;\n if (i === 1) ctx.moveTo(sx, sy);\n else ctx.lineTo(sx, sy);\n }\n ctx.stroke();\n }\n\n // Cluster principal de Garras de Espuma na Crista (t = 1.0) e cluster secundário no dorso (t ≈ 0.62)\n const tip = spine[spine.length - 1];\n const prevTip = spine[Math.max(0, spine.length - 3)];\n const tipAngle = Math.atan2(tip.y - prevTip.y, tip.x - prevTip.x);\n drawHokusaiFoamClawCluster(\n ctx,\n rc,\n tip.x,\n tip.y,\n tipAngle,\n curlDir,\n clawCount,\n maxWidth * 0.58,\n config,\n scale,\n seed + 101\n );\n\n const dorsalIdx = Math.floor(spine.length * 0.62);\n const dorsal = spine[dorsalIdx];\n if (dorsal) {\n const dorsalAngle = Math.atan2(dorsal.ny * curlDir, dorsal.nx * curlDir);\n drawHokusaiFoamClawCluster(\n ctx,\n rc,\n dorsal.x + dorsal.nx * curlDir * maxWidth * 0.32,\n dorsal.y + dorsal.ny * curlDir * maxWidth * 0.32,\n dorsalAngle,\n curlDir,\n Math.max(3, Math.floor(clawCount * 0.65)),\n maxWidth * 0.42,\n config,\n scale,\n seed + 203\n );\n }\n\n ctx.restore();\n}\n\n/**\n * Técnica #07: Bancos de Nuvens & Fumaça Ukiyo-e (Kumo) com Volutas em C-Hook e Caracóis Internos\n */\nexport interface KumoVoluteOpts {\n startX: number;\n startY: number;\n endX: number;\n endY: number;\n maxThickness: number;\n lobeCount?: number;\n curlRadius?: number;\n flip?: 1 | -1;\n alpha?: number;\n seed: number;\n}\n\nexport function drawUkiyoeCloudScrollVolute(\n ctx: CanvasRenderingContext2D,\n rc: RoughCanvasInstance | null,\n config: VFXConfig,\n scale: number,\n opts: KumoVoluteOpts\n) {\n const {\n startX,\n startY,\n endX,\n endY,\n maxThickness,\n lobeCount = 3,\n curlRadius = maxThickness * 0.48,\n flip = 1,\n alpha = 0.92,\n seed,\n } = opts;\n\n const dx = endX - startX;\n const dy = endY - startY;\n const ctrl1X = startX + dx * 0.32 - dy * 0.18 * flip;\n const ctrl1Y = startY + dy * 0.32 + dx * 0.18 * flip;\n const ctrl2X = startX + dx * 0.72 + dy * 0.12 * flip;\n const ctrl2Y = startY + dy * 0.72 - dx * 0.12 * flip;\n\n const spine = sampleCubicCurve(\n { x: startX, y: startY },\n { x: ctrl1X, y: ctrl1Y },\n { x: ctrl2X, y: ctrl2Y },\n { x: endX, y: endY },\n 44,\n config.dynamics.jitterAmount * 0.12,\n seed\n );\n\n const upperEdge: [number, number][] = [];\n const lowerEdge: [number, number][] = [];\n\n for (let i = 0; i < spine.length; i++) {\n const pt = spine[i];\n const t = pt.t;\n // Crista Superior Lobulada: lóbulo(t) = 0.58 + 0.42 · |sin(t · π · lobeCount)|\n const lobeWave = 0.58 + 0.42 * Math.abs(Math.sin(t * Math.PI * lobeCount));\n // Envelope da Cauda Afilada: tailTaper(t) = sin(t^0.62 · π) · 1.28\n const tailEnv = Math.sin(Math.pow(t, 0.62) * Math.PI) * 1.28;\n const upperW = maxThickness * 0.62 * lobeWave * tailEnv;\n const lowerW = maxThickness * 0.28 * Math.sin(t * Math.PI);\n\n upperEdge.push([pt.x + pt.nx * flip * upperW, pt.y + pt.ny * flip * upperW]);\n lowerEdge.push([pt.x - pt.nx * flip * lowerW, pt.y - pt.ny * flip * lowerW]);\n }\n\n const pal = config.colors;\n ctx.save();\n ctx.beginPath();\n upperEdge.forEach(([x, y], i) => (i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y)));\n for (let i = lowerEdge.length - 1; i >= 0; i--) {\n ctx.lineTo(lowerEdge[i][0], lowerEdge[i][1]);\n }\n ctx.closePath();\n\n const grad = ctx.createLinearGradient(startX, startY, endX, endY);\n grad.addColorStop(0.0, rgbaStr(pal.inkPrimary, alpha * 0.75));\n grad.addColorStop(0.55, rgbaStr(mixHex(pal.energySecondary, pal.coreGlow, 0.45), alpha * 0.88));\n grad.addColorStop(1.0, rgbaStr(pal.coreGlow, alpha * 0.95));\n ctx.fillStyle = grad;\n ctx.fill();\n\n ctx.strokeStyle = rgbaStr(pal.inkPrimary, alpha * 0.85);\n ctx.lineWidth = Math.max(0.75, 1.15 * scale * (config.rough.outlineWidth * 0.7));\n ctx.stroke();\n\n // Caracol Espiralado em C-Hook na cabeça da voluta (t -> 1.0)\n const headPt = spine[spine.length - 1];\n const prevPt = spine[spine.length - 3];\n const headAng = Math.atan2(headPt.y - prevPt.y, headPt.x - prevPt.x);\n const curlCenterX = headPt.x + headPt.nx * flip * curlRadius * 0.35;\n const curlCenterY = headPt.y + headPt.ny * flip * curlRadius * 0.35;\n\n const spiralPts: [number, number][] = [];\n for (let i = 0; i <= 22; i++) {\n const u = i / 22;\n const ang = headAng + flip * (0.4 + u * Math.PI * 2.25);\n const r = curlRadius * (0.92 - u * 0.76);\n spiralPts.push([curlCenterX + Math.cos(ang) * r, curlCenterY + Math.sin(ang) * r]);\n }\n\n ctx.beginPath();\n spiralPts.forEach(([x, y], i) => (i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y)));\n ctx.strokeStyle = rgbaStr(pal.inkPrimary, alpha * 0.92);\n ctx.lineWidth = Math.max(0.8, 1.35 * scale);\n ctx.stroke();\n\n if (rc && config.rough.outlineWidth > 0.2) {\n rc.curve(\n spiralPts.filter((_, idx) => idx % 2 === 0),\n makeFineRoughOptions(config, scale, seed + 59, {\n stroke: rgbaStr(pal.inkPrimary, alpha * 0.82),\n })\n );\n }\n\n ctx.restore();\n}\n\nexport function drawUkiyoeCloudBank(\n ctx: CanvasRenderingContext2D,\n rc: RoughCanvasInstance | null,\n cx: number,\n cy: number,\n spanWidth: number,\n puffCount: number,\n config: VFXConfig,\n scale: number,\n alpha: number,\n seed: number\n) {\n const rand = createSeededRandom(seed);\n for (let p = 0; p < puffCount; p++) {\n const u = puffCount === 1 ? 0 : (p / (puffCount - 1)) * 2 - 1;\n const flip: 1 | -1 = p % 2 === 0 ? 1 : -1;\n const sx = cx + u * spanWidth * 0.38 - flip * spanWidth * 0.22;\n const sy = cy + (rand() - 0.5) * spanWidth * 0.16;\n const ex = cx + u * spanWidth * 0.38 + flip * spanWidth * 0.26;\n const ey = sy - spanWidth * 0.06 * (1 - Math.abs(u) * 0.5);\n\n drawUkiyoeCloudScrollVolute(ctx, rc, config, scale, {\n startX: sx,\n startY: sy,\n endX: ex,\n endY: ey,\n maxThickness: spanWidth * (0.22 + (1 - Math.abs(u) * 0.3) * 0.1),\n lobeCount: 3,\n flip,\n alpha,\n seed: seed + p * 83,\n });\n }\n}\n\n/**\n * Técnica #08: Núcleo Sólido 100% Opaco com Oclusão Real (Alpha 1.0 em todas as paradas)\n */\nexport function drawSolidOpaqueCoreSphere(\n ctx: CanvasRenderingContext2D,\n rc: RoughCanvasInstance | null,\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n dirAngle: number,\n wobbleAmount: number,\n config: VFXConfig,\n scale: number,\n seed: number\n) {\n const steps = 36;\n const pts: [number, number][] = [];\n const cosD = Math.cos(dirAngle);\n const sinD = Math.sin(dirAngle);\n\n for (let i = 0; i < steps; i++) {\n const theta = (i / steps) * Math.PI * 2;\n const n = fbmNoise2D(Math.cos(theta) * 1.6, Math.sin(theta) * 1.6, seed);\n const rMod = 1 + (n - 0.5) * wobbleAmount;\n const lx = Math.cos(theta) * rx * rMod;\n const ly = Math.sin(theta) * ry * rMod;\n pts.push([cx + lx * cosD - ly * sinD, cy + lx * sinD + ly * cosD]);\n }\n\n const pal = config.colors;\n ctx.save();\n ctx.beginPath();\n pts.forEach(([x, y], i) => (i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y)));\n ctx.closePath();\n\n // Passo 1 de Oclusão: Preenchimento Hex 100% Sólido para apagar raízes traseiras\n ctx.globalAlpha = 1.0;\n ctx.fillStyle = pal.energySecondary;\n ctx.fill();\n\n // Passo 2 de Volume Radial (Alpha 1.0 em todas as paradas Hex)\n const noseX = cx + cosD * rx * 0.32;\n const noseY = cy + sinD * rx * 0.32;\n const grad = ctx.createRadialGradient(noseX, noseY, rx * 0.08, cx, cy, Math.max(rx, ry) * 1.05);\n grad.addColorStop(0.0, '#FFFFFF');\n grad.addColorStop(0.38, pal.coreGlow);\n grad.addColorStop(0.75, pal.energySecondary);\n grad.addColorStop(1.0, mixHex(pal.inkPrimary, pal.energySecondary, 0.35));\n ctx.fillStyle = grad;\n ctx.fill();\n\n ctx.strokeStyle = pal.inkPrimary;\n ctx.lineWidth = Math.max(1.0, 1.5 * scale);\n ctx.stroke();\n\n if (rc && config.rough.outlineWidth > 0.2) {\n rc.polygon(\n pts.filter((_, idx) => idx % 2 === 0),\n makeFineRoughOptions(config, scale, seed + 41, {\n fill: undefined,\n stroke: pal.inkPrimary,\n })\n );\n }\n ctx.restore();\n}\n\n/**\n * Técnica #09: Aguada Suibokuga (Tarashikomi) com Borda de Sangria de Pigmento\n */\nexport function drawTarashikomiWashBlob(\n ctx: CanvasRenderingContext2D,\n cx: number,\n cy: number,\n rx: number,\n ry: number,\n rotation: number,\n coreColor: string,\n edgeColor: string,\n alpha: number,\n seed: number\n) {\n const steps = 36;\n const cosR = Math.cos(rotation);\n const sinR = Math.sin(rotation);\n\n ctx.save();\n ctx.beginPath();\n for (let i = 0; i <= steps; i++) {\n const ang = (i / steps) * Math.PI * 2;\n const n = fbmNoise2D(Math.cos(ang) * 1.8 + seed * 0.1, Math.sin(ang) * 1.8, seed);\n const deform = 1 + (n - 0.5) * 0.34;\n const lx = Math.cos(ang) * rx * deform;\n const ly = Math.sin(ang) * ry * deform;\n const px = cx + lx * cosR - ly * sinR;\n const py = cy + lx * sinR + ly * cosR;\n if (i === 0) ctx.moveTo(px, py);\n else ctx.lineTo(px, py);\n }\n ctx.closePath();\n\n const maxR = Math.max(1, Math.max(rx, ry));\n const grad = ctx.createRadialGradient(cx, cy, Math.min(rx, ry) * 0.1, cx, cy, maxR);\n grad.addColorStop(0.0, rgbaStr(coreColor, alpha * 0.42));\n grad.addColorStop(0.68, rgbaStr(edgeColor, alpha * 0.58));\n grad.addColorStop(0.9, rgbaStr(edgeColor, alpha * 0.78)); // Borda úmida Tarashikomi (water-bloom rim)\n grad.addColorStop(1.0, rgbaStr(edgeColor, 0.0));\n ctx.fillStyle = grad;\n ctx.fill();\n ctx.restore();\n}\n\n/**\n * Técnica #10: Geometria Poligonal Sólida Hand-Made com Rough.js (Cristais Chanfrados Cel-Shaded)\n */\nexport function drawFacetedRoughCrystal(\n ctx: CanvasRenderingContext2D,\n rc: RoughCanvasInstance | null,\n baseX: number,\n baseY: number,\n angle: number,\n length: number,\n width: number,\n config: VFXConfig,\n scale: number,\n seed: number\n) {\n if (length <= 1 || width <= 1) return;\n const cosA = Math.cos(angle);\n const sinA = Math.sin(angle);\n const nx = -sinA;\n const ny = cosA;\n\n const halfW = width * 0.5;\n const shoulderDist = length * 0.72;\n\n const baseC: [number, number] = [baseX, baseY];\n const baseL: [number, number] = [baseX + nx * halfW, baseY + ny * halfW];\n const baseR: [number, number] = [baseX - nx * halfW, baseY - ny * halfW];\n const shoulderL: [number, number] = [\n baseX + cosA * shoulderDist + nx * halfW * 0.82,\n baseY + sinA * shoulderDist + ny * halfW * 0.82,\n ];\n const shoulderR: [number, number] = [\n baseX + cosA * shoulderDist - nx * halfW * 0.82,\n baseY + sinA * shoulderDist - ny * halfW * 0.82,\n ];\n const tip: [number, number] = [baseX + cosA * length, baseY + sinA * length];\n\n const pal = config.colors;\n ctx.save();\n\n // Face Esquerda Iluminada (coreGlow)\n ctx.beginPath();\n [baseC, baseL, shoulderL, tip].forEach(([x, y], i) => (i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y)));\n ctx.closePath();\n ctx.fillStyle = pal.coreGlow;\n ctx.fill();\n\n // Face Direita Sombreada (energySecondary -> inkPrimary)\n ctx.beginPath();\n [baseC, tip, shoulderR, baseR].forEach(([x, y], i) => (i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y)));\n ctx.closePath();\n ctx.fillStyle = mixHex(pal.energySecondary, pal.inkPrimary, 0.28);\n ctx.fill();\n\n // Aresta Central Iluminada\n ctx.beginPath();\n ctx.moveTo(baseC[0], baseC[1]);\n ctx.lineTo(tip[0], tip[1]);\n ctx.strokeStyle = '#FFFFFF';\n ctx.lineWidth = Math.max(0.8, 1.2 * scale);\n ctx.stroke();\n\n const outerVertices: [number, number][] = [baseL, shoulderL, tip, shoulderR, baseR];\n if (rc) {\n rc.polygon(\n outerVertices,\n makeFineRoughOptions(config, scale, seed, {\n fill: config.rough.fillStyle === 'solid' ? undefined : rgbaStr(pal.inkPrimary, 0.25),\n stroke: pal.inkPrimary,\n strokeWidth: Math.max(0.9, config.rough.outlineWidth * 0.85 * scale),\n })\n );\n } else {\n ctx.beginPath();\n outerVertices.forEach(([x, y], i) => (i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y)));\n ctx.closePath();\n ctx.strokeStyle = pal.inkPrimary;\n ctx.lineWidth = Math.max(0.9, 1.3 * scale);\n ctx.stroke();\n }\n\n ctx.restore();\n}\n\n/**\n * Flor de Sakura (Cerejeira) Aquarelada Suibokuga com 5 pétalas chanfradas e estames\n */\nexport function drawSakuraBlossom(\n ctx: CanvasRenderingContext2D,\n cx: number,\n cy: number,\n radius: number,\n rotation: number,\n petalColor: string,\n coreColor: string,\n inkColor: string,\n alpha = 1,\n seed = 1\n) {\n if (radius < 1 || alpha <= 0.01) return;\n const rand = createSeededRandom(seed);\n ctx.save();\n ctx.translate(cx, cy);\n ctx.rotate(rotation);\n\n const petalCount = 5;\n for (let p = 0; p < petalCount; p++) {\n const pAng = (p / petalCount) * Math.PI * 2 + (rand() - 0.5) * 0.08;\n ctx.save();\n ctx.rotate(pAng);\n\n // Pétala de Sakura com pequeno entalhe característico na ponta\n const r = radius * (0.88 + rand() * 0.22);\n const w = r * 0.56;\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.bezierCurveTo(-w * 0.95, -r * 0.38, -w * 0.85, -r * 0.92, -w * 0.18, -r);\n ctx.lineTo(0, -r * 0.86); // Entalhe central da pétala de cerejeira\n ctx.lineTo(w * 0.18, -r);\n ctx.bezierCurveTo(w * 0.85, -r * 0.92, w * 0.95, -r * 0.38, 0, 0);\n ctx.closePath();\n\n const grad = ctx.createRadialGradient(0, -r * 0.25, r * 0.05, 0, -r * 0.55, r * 0.95);\n grad.addColorStop(0.0, rgbaStr(coreColor, alpha * 0.95));\n grad.addColorStop(0.45, rgbaStr(petalColor, alpha * 0.94));\n grad.addColorStop(0.88, rgbaStr(mixHex(petalColor, inkColor, 0.22), alpha * 0.98));\n grad.addColorStop(1.0, rgbaStr(petalColor, alpha * 0.9));\n\n ctx.fillStyle = grad;\n ctx.fill();\n\n ctx.strokeStyle = rgbaStr(mixHex(petalColor, inkColor, 0.45), alpha * 0.55);\n ctx.lineWidth = Math.max(0.4, radius * 0.04);\n ctx.stroke();\n ctx.restore();\n }\n\n // Estames delicados no centro da flor\n const stamenCount = 7;\n for (let s = 0; s < stamenCount; s++) {\n const sAng = (s / stamenCount) * Math.PI * 2 + 0.2;\n const sLen = radius * (0.26 + (s % 2) * 0.08);\n const sx = Math.cos(sAng) * sLen;\n const sy = Math.sin(sAng) * sLen;\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.lineTo(sx, sy);\n ctx.strokeStyle = rgbaStr(coreColor, alpha * 0.85);\n ctx.lineWidth = Math.max(0.45, radius * 0.045);\n ctx.stroke();\n\n ctx.beginPath();\n ctx.arc(sx, sy, Math.max(0.6, radius * 0.055), 0, Math.PI * 2);\n ctx.fillStyle = rgbaStr(coreColor, alpha * 0.95);\n ctx.fill();\n }\n\n ctx.restore();\n}\n\n/**\n * Pétala Individual de Sakura Flutuando ao Vento\n */\nexport function drawFloatingSakuraPetal(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n size: number,\n angle: number,\n tiltRatio: number,\n color: string,\n alpha = 0.92\n) {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(angle);\n ctx.scale(1, Math.max(0.28, Math.min(1, tiltRatio)));\n\n ctx.beginPath();\n ctx.moveTo(-size * 0.5, 0);\n ctx.bezierCurveTo(-size * 0.2, -size * 0.55, size * 0.45, -size * 0.48, size * 0.6, -size * 0.12);\n ctx.lineTo(size * 0.42, 0);\n ctx.lineTo(size * 0.6, size * 0.12);\n ctx.bezierCurveTo(size * 0.45, size * 0.48, -size * 0.2, size * 0.55, -size * 0.5, 0);\n ctx.closePath();\n\n ctx.fillStyle = rgbaStr(color, alpha);\n ctx.fill();\n ctx.restore();\n}\n\n/**\n * Carpa Japonesa (Nishikigoi / Kohaku) pintada a pincel Sumi-e & Suibokuga\n * Corpo em curva S fluida, nadadeiras peitorais caligráficas, manchas vermelhas e ondulações de rio.\n */\nexport function drawCalligraphicKoiCarp(\n ctx: CanvasRenderingContext2D,\n cx: number,\n cy: number,\n length: number,\n angle: number,\n swimPhase: number,\n inkColor: string,\n crimsonColor: string,\n bodyLightColor: string,\n alpha = 0.9,\n seed = 1\n) {\n if (length < 8 || alpha <= 0.01) return;\n const rand = createSeededRandom(seed);\n ctx.save();\n ctx.translate(cx, cy);\n ctx.rotate(angle);\n\n const halfL = length * 0.5;\n const wave1 = Math.sin(swimPhase) * length * 0.11;\n const wave2 = -Math.cos(swimPhase) * length * 0.16;\n\n // Espinha S-Curve da Carpa (Cabeça em +halfL, Cauda em -halfL)\n const spine = sampleCubicCurve(\n { x: halfL, y: 0 },\n { x: halfL * 0.3, y: wave1 },\n { x: -halfL * 0.35, y: wave2 },\n { x: -halfL, y: wave1 * 0.8 },\n 44,\n 0.05,\n seed\n );\n\n // Ondulações sutis de água ao redor da carpa\n ctx.save();\n ctx.strokeStyle = rgbaStr(inkColor, alpha * 0.16);\n ctx.lineWidth = Math.max(0.8, length * 0.012);\n ctx.beginPath();\n ctx.ellipse(halfL * 0.15, 0, length * 0.62, length * 0.24, 0, 0, Math.PI * 2);\n ctx.stroke();\n ctx.restore();\n\n // Nadadeiras Peitorais e Ventrais Fluídas (Desenhadas antes do tronco)\n const finAnchor = spine[Math.floor(spine.length * 0.24)];\n if (finAnchor) {\n for (const side of [-1, 1] as const) {\n const finSwing = Math.sin(swimPhase + side * 0.6) * 0.22;\n const finLen = length * 0.28;\n const finAng = Math.atan2(finAnchor.ny * side, finAnchor.nx * side) - 0.55 + finSwing;\n ctx.save();\n ctx.translate(finAnchor.x, finAnchor.y);\n ctx.rotate(finAng);\n ctx.beginPath();\n ctx.moveTo(0, 0);\n ctx.quadraticCurveTo(finLen * 0.55, -finLen * 0.38 * side, finLen, -finLen * 0.1 * side);\n ctx.quadraticCurveTo(finLen * 0.45, finLen * 0.25 * side, 0, 0);\n ctx.closePath();\n ctx.fillStyle = rgbaStr(bodyLightColor, alpha * 0.78);\n ctx.fill();\n ctx.strokeStyle = rgbaStr(inkColor, alpha * 0.65);\n ctx.lineWidth = Math.max(0.8, length * 0.012);\n ctx.stroke();\n ctx.restore();\n }\n }\n\n // Cauda Bilobada Caligráfica (Véu de Noiva)\n const tailPt = spine[spine.length - 1];\n const prevTailPt = spine[spine.length - 4];\n if (tailPt && prevTailPt) {\n const tailAng = Math.atan2(tailPt.y - prevTailPt.y, tailPt.x - prevTailPt.x);\n const tailLen = length * 0.34;\n for (const lobe of [-1, 1] as const) {\n const lAng = tailAng + lobe * (0.38 + Math.sin(swimPhase * 1.2) * 0.12);\n ctx.beginPath();\n ctx.moveTo(tailPt.x, tailPt.y);\n ctx.quadraticCurveTo(\n tailPt.x + Math.cos(lAng) * tailLen * 0.65,\n tailPt.y + Math.sin(lAng) * tailLen * 0.65,\n tailPt.x + Math.cos(lAng - lobe * 0.25) * tailLen,\n tailPt.y + Math.sin(lAng - lobe * 0.25) * tailLen\n );\n ctx.quadraticCurveTo(\n tailPt.x + Math.cos(tailAng) * tailLen * 0.4,\n tailPt.y + Math.sin(tailAng) * tailLen * 0.4,\n tailPt.x,\n tailPt.y\n );\n ctx.fillStyle = rgbaStr(lobe === 1 ? crimsonColor : inkColor, alpha * 0.72);\n ctx.fill();\n }\n }\n\n // Corpo Muscular da Carpa\n const leftBody: [number, number][] = [];\n const rightBody: [number, number][] = [];\n const maxBodyW = length * 0.23;\n\n for (const pt of spine) {\n const t = pt.t;\n // Perfil hidrodinâmico de carpa: cabeça arredondada em t=0, ombro largo em t=0.25, afilando até a cauda em t=1\n const bodyEnv =\n t < 0.22\n ? Math.pow(t / 0.22, 0.52)\n : Math.pow(Math.max(0.06, 1 - (t - 0.22) / 0.78), 0.82);\n const halfW = maxBodyW * 0.5 * bodyEnv;\n leftBody.push([pt.x - pt.nx * halfW, pt.y - pt.ny * halfW]);\n rightBody.push([pt.x + pt.nx * halfW, pt.y + pt.ny * halfW]);\n }\n\n ctx.beginPath();\n leftBody.forEach(([x, y], i) => (i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y)));\n for (let i = rightBody.length - 1; i >= 0; i--) {\n ctx.lineTo(rightBody[i][0], rightBody[i][1]);\n }\n ctx.closePath();\n\n ctx.fillStyle = rgbaStr(bodyLightColor, alpha * 0.95);\n ctx.fill();\n\n // Manchas Tradicionais Kohaku / Sanke (Vermelhão e Nanquim recortados dentro do corpo da carpa)\n ctx.save();\n ctx.clip();\n const spot1 = spine[Math.floor(spine.length * 0.16)];\n const spot2 = spine[Math.floor(spine.length * 0.48)];\n const spot3 = spine[Math.floor(spine.length * 0.72)];\n if (spot1) {\n drawTarashikomiWashBlob(\n ctx,\n spot1.x,\n spot1.y + (rand() - 0.5) * maxBodyW * 0.25,\n maxBodyW * 0.55,\n maxBodyW * 0.42,\n 0.3,\n crimsonColor,\n crimsonColor,\n alpha * 0.95,\n seed + 11\n );\n }\n if (spot2) {\n drawTarashikomiWashBlob(\n ctx,\n spot2.x,\n spot2.y - maxBodyW * 0.12,\n maxBodyW * 0.62,\n maxBodyW * 0.45,\n -0.2,\n crimsonColor,\n crimsonColor,\n alpha * 0.9,\n seed + 23\n );\n }\n if (spot3) {\n drawTarashikomiWashBlob(\n ctx,\n spot3.x,\n spot3.y,\n maxBodyW * 0.42,\n maxBodyW * 0.35,\n 0.1,\n inkColor,\n inkColor,\n alpha * 0.85,\n seed + 37\n );\n }\n ctx.restore();\n\n // Contorno Caligráfico Sumi-e do Corpo + Nadadeira Dorsal\n ctx.beginPath();\n leftBody.forEach(([x, y], i) => (i === 0 ? ctx.moveTo(x, y) : ctx.lineTo(x, y)));\n for (let i = rightBody.length - 1; i >= 0; i--) {\n ctx.lineTo(rightBody[i][0], rightBody[i][1]);\n }\n ctx.closePath();\n ctx.strokeStyle = rgbaStr(inkColor, alpha * 0.88);\n ctx.lineWidth = Math.max(1.1, length * 0.018);\n ctx.stroke();\n\n // Fita Dorsal Caligráfica\n const dorsalSlice = spine.slice(\n Math.floor(spine.length * 0.26),\n Math.floor(spine.length * 0.76)\n );\n if (dorsalSlice.length >= 4) {\n drawSumiKasureRibbon(ctx, {\n spine: dorsalSlice.map((p, i, arr) => ({ ...p, t: i / Math.max(1, arr.length - 1) })),\n maxWidth: length * 0.065,\n bristleCount: 6,\n dryBrushGap: 0.25,\n taperStart: 0.4,\n taperEnd: 0.9,\n color: inkColor,\n alpha: alpha * 0.85,\n roundHeadCap: false,\n seed: seed + 71,\n });\n }\n\n // Barbilhões (Bigodes da Carpa) e Olhos na Cabeça\n const headPt = spine[1];\n if (headPt) {\n for (const side of [-1, 1] as const) {\n ctx.beginPath();\n ctx.arc(\n headPt.x - length * 0.03,\n headPt.y + side * maxBodyW * 0.22,\n Math.max(1.1, length * 0.016),\n 0,\n Math.PI * 2\n );\n ctx.fillStyle = rgbaStr(inkColor, alpha);\n ctx.fill();\n\n // Barbilhão curvo no focinho\n ctx.beginPath();\n ctx.moveTo(halfL * 0.96, side * maxBodyW * 0.1);\n ctx.quadraticCurveTo(\n halfL * 1.08,\n side * maxBodyW * 0.28,\n halfL * 1.02,\n side * maxBodyW * 0.42\n );\n ctx.strokeStyle = rgbaStr(inkColor, alpha * 0.78);\n ctx.lineWidth = Math.max(0.8, length * 0.011);\n ctx.stroke();\n }\n }\n\n ctx.restore();\n}\n\n/**\n * Galho Ornamental de Sakura (Cerejeira) com Sub-Ramos e Cachos de Flores\n * Usado para emoldurar cantos e seções com elegância orgânica japonesa.\n */\nexport function drawCornerSakuraBranch(\n ctx: CanvasRenderingContext2D,\n startX: number,\n startY: number,\n endX: number,\n endY: number,\n archDir: 1 | -1,\n maxTrunkWidth: number,\n reachProgress: number,\n swayTime: number,\n inkColor: string,\n petalColor: string,\n coreColor: string,\n seed: number\n) {\n if (reachProgress <= 0.02) return;\n const rand = createSeededRandom(seed);\n const dx = endX - startX;\n const dy = endY - startY;\n const swayX = Math.sin(swayTime * 0.9 + seed) * 5;\n const swayY = Math.cos(swayTime * 0.75 + seed) * 4;\n\n const mainSpine = sampleCubicCurve(\n { x: startX, y: startY },\n { x: startX + dx * 0.35 - dy * 0.18 * archDir, y: startY + dy * 0.35 + dx * 0.12 * archDir },\n {\n x: startX + dx * 0.7 + dy * 0.12 * archDir + swayX * 0.5,\n y: startY + dy * 0.7 - dx * 0.1 * archDir + swayY * 0.5,\n },\n { x: endX + swayX, y: endY + swayY },\n 68,\n 0.26,\n seed\n );\n\n drawSumiKasureRibbon(ctx, {\n spine: mainSpine,\n maxWidth: maxTrunkWidth,\n bristleCount: 22,\n dryBrushGap: 0.28,\n taperStart: 0.1,\n taperEnd: 0.99,\n color: inkColor,\n alpha: 0.94,\n headReach: reachProgress,\n roundHeadCap: true,\n seed: seed + 13,\n });\n\n // 2 Sub-ramos secundários brotando do tronco principal\n const subBranches = [0.32, 0.62];\n const allSpines = [mainSpine];\n\n subBranches.forEach((tFork, idx) => {\n if (reachProgress <= tFork + 0.08) return;\n const subReach = Math.min(1, (reachProgress - tFork) / (1 - tFork));\n const forkPt = mainSpine[Math.floor(tFork * (mainSpine.length - 1))];\n if (!forkPt) return;\n\n const side = idx % 2 === 0 ? archDir : -archDir;\n const subLen = Math.hypot(dx, dy) * (0.42 - idx * 0.08);\n const baseAng = Math.atan2(dy, dx) + side * 0.58;\n const subEndX = forkPt.x + Math.cos(baseAng) * subLen + swayX * 0.8;\n const subEndY = forkPt.y + Math.sin(baseAng) * subLen + swayY * 0.8;\n\n const subSpine = sampleQuadraticCurve(\n { x: forkPt.x, y: forkPt.y },\n {\n x: (forkPt.x + subEndX) * 0.5 + side * 14,\n y: (forkPt.y + subEndY) * 0.5 - 12,\n },\n { x: subEndX, y: subEndY },\n 40,\n 0.22,\n seed + 50 + idx * 19\n );\n\n allSpines.push(subSpine);\n drawSumiKasureRibbon(ctx, {\n spine: subSpine,\n maxWidth: maxTrunkWidth * 0.52,\n bristleCount: 12,\n dryBrushGap: 0.26,\n taperStart: 0.12,\n taperEnd: 0.99,\n color: inkColor,\n alpha: 0.92,\n headReach: subReach,\n roundHeadCap: false,\n seed: seed + 70 + idx * 19,\n });\n });\n\n // Flores de Sakura desabrochando ao longo do tronco e cobrindo também as pontas\n allSpines.forEach((sp, sIdx) => {\n const count = sIdx === 0 ? 14 : 8;\n for (let c = 0; c < count; c++) {\n const tPos = 0.14 + (c / Math.max(1, count - 1)) * 0.84;\n if (tPos > reachProgress) continue;\n const bloom = Math.min(1, (reachProgress - tPos * 0.72) * 2.8);\n if (bloom <= 0.05) continue;\n\n const pt = sp[Math.min(sp.length - 1, Math.floor(tPos * (sp.length - 1)))];\n const tipTighten = 1 - tPos * 0.55;\n const offset = (rand() - 0.45) * maxTrunkWidth * 1.1 * tipTighten;\n const bx = pt.x + pt.nx * offset + Math.sin(swayTime * 1.3 + c) * 1.5;\n const by = pt.y + pt.ny * offset + Math.cos(swayTime * 1.1 + c) * 1.5;\n const flowerR = (maxTrunkWidth * 0.42 + rand() * maxTrunkWidth * 0.34) * bloom;\n\n drawSakuraBlossom(\n ctx,\n bx,\n by,\n Math.max(4, flowerR),\n c * 0.8 + sIdx + Math.sin(swayTime + c) * 0.08,\n petalColor,\n coreColor,\n inkColor,\n 0.95,\n seed + 200 + sIdx * 50 + c\n );\n }\n });\n}\n\n","function t(t,e,s){if(t&&t.length){const[n,o]=e,a=Math.PI/180*s,h=Math.cos(a),r=Math.sin(a);for(const e of t){const[t,s]=e;e[0]=(t-n)*h-(s-o)*r+n,e[1]=(t-n)*r+(s-o)*h+o}}}function e(t,e){return t[0]===e[0]&&t[1]===e[1]}function s(s,n,o,a=1){const h=o,r=Math.max(n,.1),i=s[0]&&s[0][0]&&\"number\"==typeof s[0][0]?[s]:s,c=[0,0];if(h)for(const e of i)t(e,c,h);const l=function(t,s,n){const o=[];for(const s of t){const t=[...s];e(t[0],t[t.length-1])||t.push([t[0][0],t[0][1]]),t.length>2&&o.push(t)}const a=[];s=Math.max(s,.1);const h=[];for(const t of o)for(let e=0;e<t.length-1;e++){const s=t[e],n=t[e+1];if(s[1]!==n[1]){const t=Math.min(s[1],n[1]);h.push({ymin:t,ymax:Math.max(s[1],n[1]),x:t===s[1]?s[0]:n[0],islope:(n[0]-s[0])/(n[1]-s[1])})}}if(h.sort(((t,e)=>t.ymin<e.ymin?-1:t.ymin>e.ymin?1:t.x<e.x?-1:t.x>e.x?1:t.ymax===e.ymax?0:(t.ymax-e.ymax)/Math.abs(t.ymax-e.ymax))),!h.length)return a;let r=[],i=h[0].ymin,c=0;for(;r.length||h.length;){if(h.length){let t=-1;for(let e=0;e<h.length&&!(h[e].ymin>i);e++)t=e;h.splice(0,t+1).forEach((t=>{r.push({s:i,edge:t})}))}if(r=r.filter((t=>!(t.edge.ymax<=i))),r.sort(((t,e)=>t.edge.x===e.edge.x?0:(t.edge.x-e.edge.x)/Math.abs(t.edge.x-e.edge.x))),(1!==n||c%s==0)&&r.length>1)for(let t=0;t<r.length;t+=2){const e=t+1;if(e>=r.length)break;const s=r[t].edge,n=r[e].edge;a.push([[Math.round(s.x),i],[Math.round(n.x),i]])}i+=n,r.forEach((t=>{t.edge.x=t.edge.x+n*t.edge.islope})),c++}return a}(i,r,a);if(h){for(const e of i)t(e,c,-h);!function(e,s,n){const o=[];e.forEach((t=>o.push(...t))),t(o,s,n)}(l,c,-h)}return l}function n(t,e){var n;const o=e.hachureAngle+90;let a=e.hachureGap;a<0&&(a=4*e.strokeWidth),a=Math.round(Math.max(a,.1));let h=1;return e.roughness>=1&&((null===(n=e.randomizer)||void 0===n?void 0:n.next())||Math.random())>.7&&(h=a),s(t,a,o,h||1)}class o{constructor(t){this.helper=t}fillPolygons(t,e){return this._fillPolygons(t,e)}_fillPolygons(t,e){const s=n(t,e);return{type:\"fillSketch\",ops:this.renderLines(s,e)}}renderLines(t,e){const s=[];for(const n of t)s.push(...this.helper.doubleLineOps(n[0][0],n[0][1],n[1][0],n[1][1],e));return s}}function a(t){const e=t[0],s=t[1];return Math.sqrt(Math.pow(e[0]-s[0],2)+Math.pow(e[1]-s[1],2))}class h extends o{fillPolygons(t,e){let s=e.hachureGap;s<0&&(s=4*e.strokeWidth),s=Math.max(s,.1);const o=n(t,Object.assign({},e,{hachureGap:s})),h=Math.PI/180*e.hachureAngle,r=[],i=.5*s*Math.cos(h),c=.5*s*Math.sin(h);for(const[t,e]of o)a([t,e])&&r.push([[t[0]-i,t[1]+c],[...e]],[[t[0]+i,t[1]-c],[...e]]);return{type:\"fillSketch\",ops:this.renderLines(r,e)}}}class r extends o{fillPolygons(t,e){const s=this._fillPolygons(t,e),n=Object.assign({},e,{hachureAngle:e.hachureAngle+90}),o=this._fillPolygons(t,n);return s.ops=s.ops.concat(o.ops),s}}class i{constructor(t){this.helper=t}fillPolygons(t,e){const s=n(t,e=Object.assign({},e,{hachureAngle:0}));return this.dotsOnLines(s,e)}dotsOnLines(t,e){const s=[];let n=e.hachureGap;n<0&&(n=4*e.strokeWidth),n=Math.max(n,.1);let o=e.fillWeight;o<0&&(o=e.strokeWidth/2);const h=n/4;for(const r of t){const t=a(r),i=t/n,c=Math.ceil(i)-1,l=t-c*n,u=(r[0][0]+r[1][0])/2-n/4,p=Math.min(r[0][1],r[1][1]);for(let t=0;t<c;t++){const a=p+l+t*n,r=u-h+2*Math.random()*h,i=a-h+2*Math.random()*h,c=this.helper.ellipse(r,i,o,o,e);s.push(...c.ops)}}return{type:\"fillSketch\",ops:s}}}class c{constructor(t){this.helper=t}fillPolygons(t,e){const s=n(t,e);return{type:\"fillSketch\",ops:this.dashedLine(s,e)}}dashedLine(t,e){const s=e.dashOffset<0?e.hachureGap<0?4*e.strokeWidth:e.hachureGap:e.dashOffset,n=e.dashGap<0?e.hachureGap<0?4*e.strokeWidth:e.hachureGap:e.dashGap,o=[];return t.forEach((t=>{const h=a(t),r=Math.floor(h/(s+n)),i=(h+n-r*(s+n))/2;let c=t[0],l=t[1];c[0]>l[0]&&(c=t[1],l=t[0]);const u=Math.atan((l[1]-c[1])/(l[0]-c[0]));for(let t=0;t<r;t++){const a=t*(s+n),h=a+s,r=[c[0]+a*Math.cos(u)+i*Math.cos(u),c[1]+a*Math.sin(u)+i*Math.sin(u)],l=[c[0]+h*Math.cos(u)+i*Math.cos(u),c[1]+h*Math.sin(u)+i*Math.sin(u)];o.push(...this.helper.doubleLineOps(r[0],r[1],l[0],l[1],e))}})),o}}class l{constructor(t){this.helper=t}fillPolygons(t,e){const s=e.hachureGap<0?4*e.strokeWidth:e.hachureGap,o=e.zigzagOffset<0?s:e.zigzagOffset,a=n(t,e=Object.assign({},e,{hachureGap:s+o}));return{type:\"fillSketch\",ops:this.zigzagLines(a,o,e)}}zigzagLines(t,e,s){const n=[];return t.forEach((t=>{const o=a(t),h=Math.round(o/(2*e));let r=t[0],i=t[1];r[0]>i[0]&&(r=t[1],i=t[0]);const c=Math.atan((i[1]-r[1])/(i[0]-r[0]));for(let t=0;t<h;t++){const o=2*t*e,a=2*(t+1)*e,h=Math.sqrt(2*Math.pow(e,2)),i=[r[0]+o*Math.cos(c),r[1]+o*Math.sin(c)],l=[r[0]+a*Math.cos(c),r[1]+a*Math.sin(c)],u=[i[0]+h*Math.cos(c+Math.PI/4),i[1]+h*Math.sin(c+Math.PI/4)];n.push(...this.helper.doubleLineOps(i[0],i[1],u[0],u[1],s),...this.helper.doubleLineOps(u[0],u[1],l[0],l[1],s))}})),n}}const u={};class p{constructor(t){this.seed=t}next(){return this.seed?(2**31-1&(this.seed=Math.imul(48271,this.seed)))/2**31:Math.random()}}const f=0,d=1,g=2,M={A:7,a:7,C:6,c:6,H:1,h:1,L:2,l:2,M:2,m:2,Q:4,q:4,S:4,s:4,T:2,t:2,V:1,v:1,Z:0,z:0};function k(t,e){return t.type===e}function b(t){const e=[],s=function(t){const e=new Array;for(;\"\"!==t;)if(t.match(/^([ \\t\\r\\n,]+)/))t=t.substr(RegExp.$1.length);else if(t.match(/^([aAcChHlLmMqQsStTvVzZ])/))e[e.length]={type:f,text:RegExp.$1},t=t.substr(RegExp.$1.length);else{if(!t.match(/^(([-+]?[0-9]+(\\.[0-9]*)?|[-+]?\\.[0-9]+)([eE][-+]?[0-9]+)?)/))return[];e[e.length]={type:d,text:`${parseFloat(RegExp.$1)}`},t=t.substr(RegExp.$1.length)}return e[e.length]={type:g,text:\"\"},e}(t);let n=\"BOD\",o=0,a=s[o];for(;!k(a,g);){let h=0;const r=[];if(\"BOD\"===n){if(\"M\"!==a.text&&\"m\"!==a.text)return b(\"M0,0\"+t);o++,h=M[a.text],n=a.text}else k(a,d)?h=M[n]:(o++,h=M[a.text],n=a.text);if(!(o+h<s.length))throw new Error(\"Path data ended short\");for(let t=o;t<o+h;t++){const e=s[t];if(!k(e,d))throw new Error(\"Param not a number: \"+n+\",\"+e.text);r[r.length]=+e.text}if(\"number\"!=typeof M[n])throw new Error(\"Bad segment: \"+n);{const t={key:n,data:r};e.push(t),o+=h,a=s[o],\"M\"===n&&(n=\"L\"),\"m\"===n&&(n=\"l\")}}return e}function y(t){let e=0,s=0,n=0,o=0;const a=[];for(const{key:h,data:r}of t)switch(h){case\"M\":a.push({key:\"M\",data:[...r]}),[e,s]=r,[n,o]=r;break;case\"m\":e+=r[0],s+=r[1],a.push({key:\"M\",data:[e,s]}),n=e,o=s;break;case\"L\":a.push({key:\"L\",data:[...r]}),[e,s]=r;break;case\"l\":e+=r[0],s+=r[1],a.push({key:\"L\",data:[e,s]});break;case\"C\":a.push({key:\"C\",data:[...r]}),e=r[4],s=r[5];break;case\"c\":{const t=r.map(((t,n)=>n%2?t+s:t+e));a.push({key:\"C\",data:t}),e=t[4],s=t[5];break}case\"Q\":a.push({key:\"Q\",data:[...r]}),e=r[2],s=r[3];break;case\"q\":{const t=r.map(((t,n)=>n%2?t+s:t+e));a.push({key:\"Q\",data:t}),e=t[2],s=t[3];break}case\"A\":a.push({key:\"A\",data:[...r]}),e=r[5],s=r[6];break;case\"a\":e+=r[5],s+=r[6],a.push({key:\"A\",data:[r[0],r[1],r[2],r[3],r[4],e,s]});break;case\"H\":a.push({key:\"H\",data:[...r]}),e=r[0];break;case\"h\":e+=r[0],a.push({key:\"H\",data:[e]});break;case\"V\":a.push({key:\"V\",data:[...r]}),s=r[0];break;case\"v\":s+=r[0],a.push({key:\"V\",data:[s]});break;case\"S\":a.push({key:\"S\",data:[...r]}),e=r[2],s=r[3];break;case\"s\":{const t=r.map(((t,n)=>n%2?t+s:t+e));a.push({key:\"S\",data:t}),e=t[2],s=t[3];break}case\"T\":a.push({key:\"T\",data:[...r]}),e=r[0],s=r[1];break;case\"t\":e+=r[0],s+=r[1],a.push({key:\"T\",data:[e,s]});break;case\"Z\":case\"z\":a.push({key:\"Z\",data:[]}),e=n,s=o}return a}function m(t){const e=[];let s=\"\",n=0,o=0,a=0,h=0,r=0,i=0;for(const{key:c,data:l}of t){switch(c){case\"M\":e.push({key:\"M\",data:[...l]}),[n,o]=l,[a,h]=l;break;case\"C\":e.push({key:\"C\",data:[...l]}),n=l[4],o=l[5],r=l[2],i=l[3];break;case\"L\":e.push({key:\"L\",data:[...l]}),[n,o]=l;break;case\"H\":n=l[0],e.push({key:\"L\",data:[n,o]});break;case\"V\":o=l[0],e.push({key:\"L\",data:[n,o]});break;case\"S\":{let t=0,a=0;\"C\"===s||\"S\"===s?(t=n+(n-r),a=o+(o-i)):(t=n,a=o),e.push({key:\"C\",data:[t,a,...l]}),r=l[0],i=l[1],n=l[2],o=l[3];break}case\"T\":{const[t,a]=l;let h=0,c=0;\"Q\"===s||\"T\"===s?(h=n+(n-r),c=o+(o-i)):(h=n,c=o);const u=n+2*(h-n)/3,p=o+2*(c-o)/3,f=t+2*(h-t)/3,d=a+2*(c-a)/3;e.push({key:\"C\",data:[u,p,f,d,t,a]}),r=h,i=c,n=t,o=a;break}case\"Q\":{const[t,s,a,h]=l,c=n+2*(t-n)/3,u=o+2*(s-o)/3,p=a+2*(t-a)/3,f=h+2*(s-h)/3;e.push({key:\"C\",data:[c,u,p,f,a,h]}),r=t,i=s,n=a,o=h;break}case\"A\":{const t=Math.abs(l[0]),s=Math.abs(l[1]),a=l[2],h=l[3],r=l[4],i=l[5],c=l[6];if(0===t||0===s)e.push({key:\"C\",data:[n,o,i,c,i,c]}),n=i,o=c;else if(n!==i||o!==c){x(n,o,i,c,t,s,a,h,r).forEach((function(t){e.push({key:\"C\",data:t})})),n=i,o=c}break}case\"Z\":e.push({key:\"Z\",data:[]}),n=a,o=h}s=c}return e}function w(t,e,s){return[t*Math.cos(s)-e*Math.sin(s),t*Math.sin(s)+e*Math.cos(s)]}function x(t,e,s,n,o,a,h,r,i,c){const l=(u=h,Math.PI*u/180);var u;let p=[],f=0,d=0,g=0,M=0;if(c)[f,d,g,M]=c;else{[t,e]=w(t,e,-l),[s,n]=w(s,n,-l);const h=(t-s)/2,c=(e-n)/2;let u=h*h/(o*o)+c*c/(a*a);u>1&&(u=Math.sqrt(u),o*=u,a*=u);const p=o*o,k=a*a,b=p*k-p*c*c-k*h*h,y=p*c*c+k*h*h,m=(r===i?-1:1)*Math.sqrt(Math.abs(b/y));g=m*o*c/a+(t+s)/2,M=m*-a*h/o+(e+n)/2,f=Math.asin(parseFloat(((e-M)/a).toFixed(9))),d=Math.asin(parseFloat(((n-M)/a).toFixed(9))),t<g&&(f=Math.PI-f),s<g&&(d=Math.PI-d),f<0&&(f=2*Math.PI+f),d<0&&(d=2*Math.PI+d),i&&f>d&&(f-=2*Math.PI),!i&&d>f&&(d-=2*Math.PI)}let k=d-f;if(Math.abs(k)>120*Math.PI/180){const t=d,e=s,r=n;d=i&&d>f?f+120*Math.PI/180*1:f+120*Math.PI/180*-1,p=x(s=g+o*Math.cos(d),n=M+a*Math.sin(d),e,r,o,a,h,0,i,[d,t,g,M])}k=d-f;const b=Math.cos(f),y=Math.sin(f),m=Math.cos(d),P=Math.sin(d),v=Math.tan(k/4),S=4/3*o*v,O=4/3*a*v,L=[t,e],T=[t+S*y,e-O*b],D=[s+S*P,n-O*m],A=[s,n];if(T[0]=2*L[0]-T[0],T[1]=2*L[1]-T[1],c)return[T,D,A].concat(p);{p=[T,D,A].concat(p);const t=[];for(let e=0;e<p.length;e+=3){const s=w(p[e][0],p[e][1],l),n=w(p[e+1][0],p[e+1][1],l),o=w(p[e+2][0],p[e+2][1],l);t.push([s[0],s[1],n[0],n[1],o[0],o[1]])}return t}}const P={randOffset:function(t,e){return G(t,e)},randOffsetWithRange:function(t,e,s){return E(t,e,s)},ellipse:function(t,e,s,n,o){const a=T(s,n,o);return D(t,e,o,a).opset},doubleLineOps:function(t,e,s,n,o){return $(t,e,s,n,o,!0)}};function v(t,e,s,n,o){return{type:\"path\",ops:$(t,e,s,n,o)}}function S(t,e,s){const n=(t||[]).length;if(n>2){const o=[];for(let e=0;e<n-1;e++)o.push(...$(t[e][0],t[e][1],t[e+1][0],t[e+1][1],s));return e&&o.push(...$(t[n-1][0],t[n-1][1],t[0][0],t[0][1],s)),{type:\"path\",ops:o}}return 2===n?v(t[0][0],t[0][1],t[1][0],t[1][1],s):{type:\"path\",ops:[]}}function O(t,e,s,n,o){return function(t,e){return S(t,!0,e)}([[t,e],[t+s,e],[t+s,e+n],[t,e+n]],o)}function L(t,e){if(t.length){const s=\"number\"==typeof t[0][0]?[t]:t,n=j(s[0],1*(1+.2*e.roughness),e),o=e.disableMultiStroke?[]:j(s[0],1.5*(1+.22*e.roughness),z(e));for(let t=1;t<s.length;t++){const a=s[t];if(a.length){const t=j(a,1*(1+.2*e.roughness),e),s=e.disableMultiStroke?[]:j(a,1.5*(1+.22*e.roughness),z(e));for(const e of t)\"move\"!==e.op&&n.push(e);for(const t of s)\"move\"!==t.op&&o.push(t)}}return{type:\"path\",ops:n.concat(o)}}return{type:\"path\",ops:[]}}function T(t,e,s){const n=Math.sqrt(2*Math.PI*Math.sqrt((Math.pow(t/2,2)+Math.pow(e/2,2))/2)),o=Math.ceil(Math.max(s.curveStepCount,s.curveStepCount/Math.sqrt(200)*n)),a=2*Math.PI/o;let h=Math.abs(t/2),r=Math.abs(e/2);const i=1-s.curveFitting;return h+=G(h*i,s),r+=G(r*i,s),{increment:a,rx:h,ry:r}}function D(t,e,s,n){const[o,a]=F(n.increment,t,e,n.rx,n.ry,1,n.increment*E(.1,E(.4,1,s),s),s);let h=q(o,null,s);if(!s.disableMultiStroke&&0!==s.roughness){const[o]=F(n.increment,t,e,n.rx,n.ry,1.5,0,s),a=q(o,null,s);h=h.concat(a)}return{estimatedPoints:a,opset:{type:\"path\",ops:h}}}function A(t,e,s,n,o,a,h,r,i){const c=t,l=e;let u=Math.abs(s/2),p=Math.abs(n/2);u+=G(.01*u,i),p+=G(.01*p,i);let f=o,d=a;for(;f<0;)f+=2*Math.PI,d+=2*Math.PI;d-f>2*Math.PI&&(f=0,d=2*Math.PI);const g=2*Math.PI/i.curveStepCount,M=Math.min(g/2,(d-f)/2),k=V(M,c,l,u,p,f,d,1,i);if(!i.disableMultiStroke){const t=V(M,c,l,u,p,f,d,1.5,i);k.push(...t)}return h&&(r?k.push(...$(c,l,c+u*Math.cos(f),l+p*Math.sin(f),i),...$(c,l,c+u*Math.cos(d),l+p*Math.sin(d),i)):k.push({op:\"lineTo\",data:[c,l]},{op:\"lineTo\",data:[c+u*Math.cos(f),l+p*Math.sin(f)]})),{type:\"path\",ops:k}}function _(t,e){const s=m(y(b(t))),n=[];let o=[0,0],a=[0,0];for(const{key:t,data:h}of s)switch(t){case\"M\":a=[h[0],h[1]],o=[h[0],h[1]];break;case\"L\":n.push(...$(a[0],a[1],h[0],h[1],e)),a=[h[0],h[1]];break;case\"C\":{const[t,s,o,r,i,c]=h;n.push(...Z(t,s,o,r,i,c,a,e)),a=[i,c];break}case\"Z\":n.push(...$(a[0],a[1],o[0],o[1],e)),a=[o[0],o[1]]}return{type:\"path\",ops:n}}function I(t,e){const s=[];for(const n of t)if(n.length){const t=e.maxRandomnessOffset||0,o=n.length;if(o>2){s.push({op:\"move\",data:[n[0][0]+G(t,e),n[0][1]+G(t,e)]});for(let a=1;a<o;a++)s.push({op:\"lineTo\",data:[n[a][0]+G(t,e),n[a][1]+G(t,e)]})}}return{type:\"fillPath\",ops:s}}function C(t,e){return function(t,e){let s=t.fillStyle||\"hachure\";if(!u[s])switch(s){case\"zigzag\":u[s]||(u[s]=new h(e));break;case\"cross-hatch\":u[s]||(u[s]=new r(e));break;case\"dots\":u[s]||(u[s]=new i(e));break;case\"dashed\":u[s]||(u[s]=new c(e));break;case\"zigzag-line\":u[s]||(u[s]=new l(e));break;default:s=\"hachure\",u[s]||(u[s]=new o(e))}return u[s]}(e,P).fillPolygons(t,e)}function z(t){const e=Object.assign({},t);return e.randomizer=void 0,t.seed&&(e.seed=t.seed+1),e}function W(t){return t.randomizer||(t.randomizer=new p(t.seed||0)),t.randomizer.next()}function E(t,e,s,n=1){return s.roughness*n*(W(s)*(e-t)+t)}function G(t,e,s=1){return E(-t,t,e,s)}function $(t,e,s,n,o,a=!1){const h=a?o.disableMultiStrokeFill:o.disableMultiStroke,r=R(t,e,s,n,o,!0,!1);if(h)return r;const i=R(t,e,s,n,o,!0,!0);return r.concat(i)}function R(t,e,s,n,o,a,h){const r=Math.pow(t-s,2)+Math.pow(e-n,2),i=Math.sqrt(r);let c=1;c=i<200?1:i>500?.4:-.0016668*i+1.233334;let l=o.maxRandomnessOffset||0;l*l*100>r&&(l=i/10);const u=l/2,p=.2+.2*W(o);let f=o.bowing*o.maxRandomnessOffset*(n-e)/200,d=o.bowing*o.maxRandomnessOffset*(t-s)/200;f=G(f,o,c),d=G(d,o,c);const g=[],M=()=>G(u,o,c),k=()=>G(l,o,c),b=o.preserveVertices;return a&&(h?g.push({op:\"move\",data:[t+(b?0:M()),e+(b?0:M())]}):g.push({op:\"move\",data:[t+(b?0:G(l,o,c)),e+(b?0:G(l,o,c))]})),h?g.push({op:\"bcurveTo\",data:[f+t+(s-t)*p+M(),d+e+(n-e)*p+M(),f+t+2*(s-t)*p+M(),d+e+2*(n-e)*p+M(),s+(b?0:M()),n+(b?0:M())]}):g.push({op:\"bcurveTo\",data:[f+t+(s-t)*p+k(),d+e+(n-e)*p+k(),f+t+2*(s-t)*p+k(),d+e+2*(n-e)*p+k(),s+(b?0:k()),n+(b?0:k())]}),g}function j(t,e,s){if(!t.length)return[];const n=[];n.push([t[0][0]+G(e,s),t[0][1]+G(e,s)]),n.push([t[0][0]+G(e,s),t[0][1]+G(e,s)]);for(let o=1;o<t.length;o++)n.push([t[o][0]+G(e,s),t[o][1]+G(e,s)]),o===t.length-1&&n.push([t[o][0]+G(e,s),t[o][1]+G(e,s)]);return q(n,null,s)}function q(t,e,s){const n=t.length,o=[];if(n>3){const a=[],h=1-s.curveTightness;o.push({op:\"move\",data:[t[1][0],t[1][1]]});for(let e=1;e+2<n;e++){const s=t[e];a[0]=[s[0],s[1]],a[1]=[s[0]+(h*t[e+1][0]-h*t[e-1][0])/6,s[1]+(h*t[e+1][1]-h*t[e-1][1])/6],a[2]=[t[e+1][0]+(h*t[e][0]-h*t[e+2][0])/6,t[e+1][1]+(h*t[e][1]-h*t[e+2][1])/6],a[3]=[t[e+1][0],t[e+1][1]],o.push({op:\"bcurveTo\",data:[a[1][0],a[1][1],a[2][0],a[2][1],a[3][0],a[3][1]]})}if(e&&2===e.length){const t=s.maxRandomnessOffset;o.push({op:\"lineTo\",data:[e[0]+G(t,s),e[1]+G(t,s)]})}}else 3===n?(o.push({op:\"move\",data:[t[1][0],t[1][1]]}),o.push({op:\"bcurveTo\",data:[t[1][0],t[1][1],t[2][0],t[2][1],t[2][0],t[2][1]]})):2===n&&o.push(...R(t[0][0],t[0][1],t[1][0],t[1][1],s,!0,!0));return o}function F(t,e,s,n,o,a,h,r){const i=[],c=[];if(0===r.roughness){t/=4,c.push([e+n*Math.cos(-t),s+o*Math.sin(-t)]);for(let a=0;a<=2*Math.PI;a+=t){const t=[e+n*Math.cos(a),s+o*Math.sin(a)];i.push(t),c.push(t)}c.push([e+n*Math.cos(0),s+o*Math.sin(0)]),c.push([e+n*Math.cos(t),s+o*Math.sin(t)])}else{const l=G(.5,r)-Math.PI/2;c.push([G(a,r)+e+.9*n*Math.cos(l-t),G(a,r)+s+.9*o*Math.sin(l-t)]);const u=2*Math.PI+l-.01;for(let h=l;h<u;h+=t){const t=[G(a,r)+e+n*Math.cos(h),G(a,r)+s+o*Math.sin(h)];i.push(t),c.push(t)}c.push([G(a,r)+e+n*Math.cos(l+2*Math.PI+.5*h),G(a,r)+s+o*Math.sin(l+2*Math.PI+.5*h)]),c.push([G(a,r)+e+.98*n*Math.cos(l+h),G(a,r)+s+.98*o*Math.sin(l+h)]),c.push([G(a,r)+e+.9*n*Math.cos(l+.5*h),G(a,r)+s+.9*o*Math.sin(l+.5*h)])}return[c,i]}function V(t,e,s,n,o,a,h,r,i){const c=a+G(.1,i),l=[];l.push([G(r,i)+e+.9*n*Math.cos(c-t),G(r,i)+s+.9*o*Math.sin(c-t)]);for(let a=c;a<=h;a+=t)l.push([G(r,i)+e+n*Math.cos(a),G(r,i)+s+o*Math.sin(a)]);return l.push([e+n*Math.cos(h),s+o*Math.sin(h)]),l.push([e+n*Math.cos(h),s+o*Math.sin(h)]),q(l,null,i)}function Z(t,e,s,n,o,a,h,r){const i=[],c=[r.maxRandomnessOffset||1,(r.maxRandomnessOffset||1)+.3];let l=[0,0];const u=r.disableMultiStroke?1:2,p=r.preserveVertices;for(let f=0;f<u;f++)0===f?i.push({op:\"move\",data:[h[0],h[1]]}):i.push({op:\"move\",data:[h[0]+(p?0:G(c[0],r)),h[1]+(p?0:G(c[0],r))]}),l=p?[o,a]:[o+G(c[f],r),a+G(c[f],r)],i.push({op:\"bcurveTo\",data:[t+G(c[f],r),e+G(c[f],r),s+G(c[f],r),n+G(c[f],r),l[0],l[1]]});return i}function Q(t){return[...t]}function H(t,e=0){const s=t.length;if(s<3)throw new Error(\"A curve must have at least three points.\");const n=[];if(3===s)n.push(Q(t[0]),Q(t[1]),Q(t[2]),Q(t[2]));else{const s=[];s.push(t[0],t[0]);for(let e=1;e<t.length;e++)s.push(t[e]),e===t.length-1&&s.push(t[e]);const o=[],a=1-e;n.push(Q(s[0]));for(let t=1;t+2<s.length;t++){const e=s[t];o[0]=[e[0],e[1]],o[1]=[e[0]+(a*s[t+1][0]-a*s[t-1][0])/6,e[1]+(a*s[t+1][1]-a*s[t-1][1])/6],o[2]=[s[t+1][0]+(a*s[t][0]-a*s[t+2][0])/6,s[t+1][1]+(a*s[t][1]-a*s[t+2][1])/6],o[3]=[s[t+1][0],s[t+1][1]],n.push(o[1],o[2],o[3])}}return n}function N(t,e){return Math.pow(t[0]-e[0],2)+Math.pow(t[1]-e[1],2)}function B(t,e,s){const n=N(e,s);if(0===n)return N(t,e);let o=((t[0]-e[0])*(s[0]-e[0])+(t[1]-e[1])*(s[1]-e[1]))/n;return o=Math.max(0,Math.min(1,o)),N(t,J(e,s,o))}function J(t,e,s){return[t[0]+(e[0]-t[0])*s,t[1]+(e[1]-t[1])*s]}function K(t,e,s,n){const o=n||[];if(function(t,e){const s=t[e+0],n=t[e+1],o=t[e+2],a=t[e+3];let h=3*n[0]-2*s[0]-a[0];h*=h;let r=3*n[1]-2*s[1]-a[1];r*=r;let i=3*o[0]-2*a[0]-s[0];i*=i;let c=3*o[1]-2*a[1]-s[1];return c*=c,h<i&&(h=i),r<c&&(r=c),h+r}(t,e)<s){const s=t[e+0];if(o.length){(a=o[o.length-1],h=s,Math.sqrt(N(a,h)))>1&&o.push(s)}else o.push(s);o.push(t[e+3])}else{const n=.5,a=t[e+0],h=t[e+1],r=t[e+2],i=t[e+3],c=J(a,h,n),l=J(h,r,n),u=J(r,i,n),p=J(c,l,n),f=J(l,u,n),d=J(p,f,n);K([a,c,p,d],0,s,o),K([d,f,u,i],0,s,o)}var a,h;return o}function U(t,e){return X(t,0,t.length,e)}function X(t,e,s,n,o){const a=o||[],h=t[e],r=t[s-1];let i=0,c=1;for(let n=e+1;n<s-1;++n){const e=B(t[n],h,r);e>i&&(i=e,c=n)}return Math.sqrt(i)>n?(X(t,e,c+1,n,a),X(t,c,s,n,a)):(a.length||a.push(h),a.push(r)),a}function Y(t,e=.15,s){const n=[],o=(t.length-1)/3;for(let s=0;s<o;s++){K(t,3*s,e,n)}return s&&s>0?X(n,0,n.length,s):n}const tt=\"none\";class et{constructor(t){this.defaultOptions={maxRandomnessOffset:2,roughness:1,bowing:1,stroke:\"#000\",strokeWidth:1,curveTightness:0,curveFitting:.95,curveStepCount:9,fillStyle:\"hachure\",fillWeight:-1,hachureAngle:-41,hachureGap:-1,dashOffset:-1,dashGap:-1,zigzagOffset:-1,seed:0,disableMultiStroke:!1,disableMultiStrokeFill:!1,preserveVertices:!1,fillShapeRoughnessGain:.8},this.config=t||{},this.config.options&&(this.defaultOptions=this._o(this.config.options))}static newSeed(){return Math.floor(Math.random()*2**31)}_o(t){return t?Object.assign({},this.defaultOptions,t):this.defaultOptions}_d(t,e,s){return{shape:t,sets:e||[],options:s||this.defaultOptions}}line(t,e,s,n,o){const a=this._o(o);return this._d(\"line\",[v(t,e,s,n,a)],a)}rectangle(t,e,s,n,o){const a=this._o(o),h=[],r=O(t,e,s,n,a);if(a.fill){const o=[[t,e],[t+s,e],[t+s,e+n],[t,e+n]];\"solid\"===a.fillStyle?h.push(I([o],a)):h.push(C([o],a))}return a.stroke!==tt&&h.push(r),this._d(\"rectangle\",h,a)}ellipse(t,e,s,n,o){const a=this._o(o),h=[],r=T(s,n,a),i=D(t,e,a,r);if(a.fill)if(\"solid\"===a.fillStyle){const s=D(t,e,a,r).opset;s.type=\"fillPath\",h.push(s)}else h.push(C([i.estimatedPoints],a));return a.stroke!==tt&&h.push(i.opset),this._d(\"ellipse\",h,a)}circle(t,e,s,n){const o=this.ellipse(t,e,s,s,n);return o.shape=\"circle\",o}linearPath(t,e){const s=this._o(e);return this._d(\"linearPath\",[S(t,!1,s)],s)}arc(t,e,s,n,o,a,h=!1,r){const i=this._o(r),c=[],l=A(t,e,s,n,o,a,h,!0,i);if(h&&i.fill)if(\"solid\"===i.fillStyle){const h=Object.assign({},i);h.disableMultiStroke=!0;const r=A(t,e,s,n,o,a,!0,!1,h);r.type=\"fillPath\",c.push(r)}else c.push(function(t,e,s,n,o,a,h){const r=t,i=e;let c=Math.abs(s/2),l=Math.abs(n/2);c+=G(.01*c,h),l+=G(.01*l,h);let u=o,p=a;for(;u<0;)u+=2*Math.PI,p+=2*Math.PI;p-u>2*Math.PI&&(u=0,p=2*Math.PI);const f=(p-u)/h.curveStepCount,d=[];for(let t=u;t<=p;t+=f)d.push([r+c*Math.cos(t),i+l*Math.sin(t)]);return d.push([r+c*Math.cos(p),i+l*Math.sin(p)]),d.push([r,i]),C([d],h)}(t,e,s,n,o,a,i));return i.stroke!==tt&&c.push(l),this._d(\"arc\",c,i)}curve(t,e){const s=this._o(e),n=[],o=L(t,s);if(s.fill&&s.fill!==tt)if(\"solid\"===s.fillStyle){const e=L(t,Object.assign(Object.assign({},s),{disableMultiStroke:!0,roughness:s.roughness?s.roughness+s.fillShapeRoughnessGain:0}));n.push({type:\"fillPath\",ops:this._mergedShape(e.ops)})}else{const e=[],o=t;if(o.length){const t=\"number\"==typeof o[0][0]?[o]:o;for(const n of t)n.length<3?e.push(...n):3===n.length?e.push(...Y(H([n[0],n[0],n[1],n[2]]),10,(1+s.roughness)/2)):e.push(...Y(H(n),10,(1+s.roughness)/2))}e.length&&n.push(C([e],s))}return s.stroke!==tt&&n.push(o),this._d(\"curve\",n,s)}polygon(t,e){const s=this._o(e),n=[],o=S(t,!0,s);return s.fill&&(\"solid\"===s.fillStyle?n.push(I([t],s)):n.push(C([t],s))),s.stroke!==tt&&n.push(o),this._d(\"polygon\",n,s)}path(t,e){const s=this._o(e),n=[];if(!t)return this._d(\"path\",n,s);t=(t||\"\").replace(/\\n/g,\" \").replace(/(-\\s)/g,\"-\").replace(\"/(ss)/g\",\" \");const o=s.fill&&\"transparent\"!==s.fill&&s.fill!==tt,a=s.stroke!==tt,h=!!(s.simplification&&s.simplification<1),r=function(t,e,s){const n=m(y(b(t))),o=[];let a=[],h=[0,0],r=[];const i=()=>{r.length>=4&&a.push(...Y(r,e)),r=[]},c=()=>{i(),a.length&&(o.push(a),a=[])};for(const{key:t,data:e}of n)switch(t){case\"M\":c(),h=[e[0],e[1]],a.push(h);break;case\"L\":i(),a.push([e[0],e[1]]);break;case\"C\":if(!r.length){const t=a.length?a[a.length-1]:h;r.push([t[0],t[1]])}r.push([e[0],e[1]]),r.push([e[2],e[3]]),r.push([e[4],e[5]]);break;case\"Z\":i(),a.push([h[0],h[1]])}if(c(),!s)return o;const l=[];for(const t of o){const e=U(t,s);e.length&&l.push(e)}return l}(t,1,h?4-4*(s.simplification||1):(1+s.roughness)/2),i=_(t,s);if(o)if(\"solid\"===s.fillStyle)if(1===r.length){const e=_(t,Object.assign(Object.assign({},s),{disableMultiStroke:!0,roughness:s.roughness?s.roughness+s.fillShapeRoughnessGain:0}));n.push({type:\"fillPath\",ops:this._mergedShape(e.ops)})}else n.push(I(r,s));else n.push(C(r,s));return a&&(h?r.forEach((t=>{n.push(S(t,!1,s))})):n.push(i)),this._d(\"path\",n,s)}opsToPath(t,e){let s=\"\";for(const n of t.ops){const t=\"number\"==typeof e&&e>=0?n.data.map((t=>+t.toFixed(e))):n.data;switch(n.op){case\"move\":s+=`M${t[0]} ${t[1]} `;break;case\"bcurveTo\":s+=`C${t[0]} ${t[1]}, ${t[2]} ${t[3]}, ${t[4]} ${t[5]} `;break;case\"lineTo\":s+=`L${t[0]} ${t[1]} `}}return s.trim()}toPaths(t){const e=t.sets||[],s=t.options||this.defaultOptions,n=[];for(const t of e){let e=null;switch(t.type){case\"path\":e={d:this.opsToPath(t),stroke:s.stroke,strokeWidth:s.strokeWidth,fill:tt};break;case\"fillPath\":e={d:this.opsToPath(t),stroke:tt,strokeWidth:0,fill:s.fill||tt};break;case\"fillSketch\":e=this.fillSketch(t,s)}e&&n.push(e)}return n}fillSketch(t,e){let s=e.fillWeight;return s<0&&(s=e.strokeWidth/2),{d:this.opsToPath(t),stroke:e.fill||tt,strokeWidth:s,fill:tt}}_mergedShape(t){return t.filter(((t,e)=>0===e||\"move\"!==t.op))}}class st{constructor(t,e){this.canvas=t,this.ctx=this.canvas.getContext(\"2d\"),this.gen=new et(e)}draw(t){const e=t.sets||[],s=t.options||this.getDefaultOptions(),n=this.ctx,o=t.options.fixedDecimalPlaceDigits;for(const a of e)switch(a.type){case\"path\":n.save(),n.strokeStyle=\"none\"===s.stroke?\"transparent\":s.stroke,n.lineWidth=s.strokeWidth,s.strokeLineDash&&n.setLineDash(s.strokeLineDash),s.strokeLineDashOffset&&(n.lineDashOffset=s.strokeLineDashOffset),this._drawToContext(n,a,o),n.restore();break;case\"fillPath\":{n.save(),n.fillStyle=s.fill||\"\";const e=\"curve\"===t.shape||\"polygon\"===t.shape||\"path\"===t.shape?\"evenodd\":\"nonzero\";this._drawToContext(n,a,o,e),n.restore();break}case\"fillSketch\":this.fillSketch(n,a,s)}}fillSketch(t,e,s){let n=s.fillWeight;n<0&&(n=s.strokeWidth/2),t.save(),s.fillLineDash&&t.setLineDash(s.fillLineDash),s.fillLineDashOffset&&(t.lineDashOffset=s.fillLineDashOffset),t.strokeStyle=s.fill||\"\",t.lineWidth=n,this._drawToContext(t,e,s.fixedDecimalPlaceDigits),t.restore()}_drawToContext(t,e,s,n=\"nonzero\"){t.beginPath();for(const n of e.ops){const e=\"number\"==typeof s&&s>=0?n.data.map((t=>+t.toFixed(s))):n.data;switch(n.op){case\"move\":t.moveTo(e[0],e[1]);break;case\"bcurveTo\":t.bezierCurveTo(e[0],e[1],e[2],e[3],e[4],e[5]);break;case\"lineTo\":t.lineTo(e[0],e[1])}}\"fillPath\"===e.type?t.fill(n):t.stroke()}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}line(t,e,s,n,o){const a=this.gen.line(t,e,s,n,o);return this.draw(a),a}rectangle(t,e,s,n,o){const a=this.gen.rectangle(t,e,s,n,o);return this.draw(a),a}ellipse(t,e,s,n,o){const a=this.gen.ellipse(t,e,s,n,o);return this.draw(a),a}circle(t,e,s,n){const o=this.gen.circle(t,e,s,n);return this.draw(o),o}linearPath(t,e){const s=this.gen.linearPath(t,e);return this.draw(s),s}polygon(t,e){const s=this.gen.polygon(t,e);return this.draw(s),s}arc(t,e,s,n,o,a,h=!1,r){const i=this.gen.arc(t,e,s,n,o,a,h,r);return this.draw(i),i}curve(t,e){const s=this.gen.curve(t,e);return this.draw(s),s}path(t,e){const s=this.gen.path(t,e);return this.draw(s),s}}const nt=\"http://www.w3.org/2000/svg\";class ot{constructor(t,e){this.svg=t,this.gen=new et(e)}draw(t){const e=t.sets||[],s=t.options||this.getDefaultOptions(),n=this.svg.ownerDocument||window.document,o=n.createElementNS(nt,\"g\"),a=t.options.fixedDecimalPlaceDigits;for(const h of e){let e=null;switch(h.type){case\"path\":e=n.createElementNS(nt,\"path\"),e.setAttribute(\"d\",this.opsToPath(h,a)),e.setAttribute(\"stroke\",s.stroke),e.setAttribute(\"stroke-width\",s.strokeWidth+\"\"),e.setAttribute(\"fill\",\"none\"),s.strokeLineDash&&e.setAttribute(\"stroke-dasharray\",s.strokeLineDash.join(\" \").trim()),s.strokeLineDashOffset&&e.setAttribute(\"stroke-dashoffset\",`${s.strokeLineDashOffset}`);break;case\"fillPath\":e=n.createElementNS(nt,\"path\"),e.setAttribute(\"d\",this.opsToPath(h,a)),e.setAttribute(\"stroke\",\"none\"),e.setAttribute(\"stroke-width\",\"0\"),e.setAttribute(\"fill\",s.fill||\"\"),\"curve\"!==t.shape&&\"polygon\"!==t.shape||e.setAttribute(\"fill-rule\",\"evenodd\");break;case\"fillSketch\":e=this.fillSketch(n,h,s)}e&&o.appendChild(e)}return o}fillSketch(t,e,s){let n=s.fillWeight;n<0&&(n=s.strokeWidth/2);const o=t.createElementNS(nt,\"path\");return o.setAttribute(\"d\",this.opsToPath(e,s.fixedDecimalPlaceDigits)),o.setAttribute(\"stroke\",s.fill||\"\"),o.setAttribute(\"stroke-width\",n+\"\"),o.setAttribute(\"fill\",\"none\"),s.fillLineDash&&o.setAttribute(\"stroke-dasharray\",s.fillLineDash.join(\" \").trim()),s.fillLineDashOffset&&o.setAttribute(\"stroke-dashoffset\",`${s.fillLineDashOffset}`),o}get generator(){return this.gen}getDefaultOptions(){return this.gen.defaultOptions}opsToPath(t,e){return this.gen.opsToPath(t,e)}line(t,e,s,n,o){const a=this.gen.line(t,e,s,n,o);return this.draw(a)}rectangle(t,e,s,n,o){const a=this.gen.rectangle(t,e,s,n,o);return this.draw(a)}ellipse(t,e,s,n,o){const a=this.gen.ellipse(t,e,s,n,o);return this.draw(a)}circle(t,e,s,n){const o=this.gen.circle(t,e,s,n);return this.draw(o)}linearPath(t,e){const s=this.gen.linearPath(t,e);return this.draw(s)}polygon(t,e){const s=this.gen.polygon(t,e);return this.draw(s)}arc(t,e,s,n,o,a,h=!1,r){const i=this.gen.arc(t,e,s,n,o,a,h,r);return this.draw(i)}curve(t,e){const s=this.gen.curve(t,e);return this.draw(s)}path(t,e){const s=this.gen.path(t,e);return this.draw(s)}}var at={canvas:(t,e)=>new st(t,e),svg:(t,e)=>new ot(t,e),generator:t=>new et(t),newSeed:()=>et.newSeed()};export{at as default};\n","import rough from 'roughjs';\nimport {\n createSeededRandom,\n recolorReferenceSheetData,\n sampleCubicCurve,\n samplePolarArc,\n sampleQuadraticCurve,\n} from './math';\nimport {\n drawCentrifugalSplatters,\n drawDetachedSumiFlameWisp,\n drawFacetedRoughCrystal,\n drawFlamePetalTongue,\n drawFloatingSakuraPetal,\n drawHokusaiWaveCrest,\n drawSakuraBlossom,\n drawSolidOpaqueCoreSphere,\n drawSumiKasureRibbon,\n drawTarashikomiWashBlob,\n drawUkiyoeCloudBank,\n drawUkiyoeCloudScrollVolute,\n} from './techniques';\nimport { VFXConfig } from './types';\n\n/**\n * Renderiza um único quadro [0..15] no espaço canônico 128×128 multiplicado por scale = width / 128.\n * Segue a Cinética Não-Linear de Ataque (Sakuga Timing):\n * - Quadros 0..3 (frameNorm 0.00..0.20): Aceleração explosiva headReach = 1 - (1 - frameNorm)^3.4\n * - Quadros 4..6 (frameNorm 0.25..0.40): Ápice de impacto com núcleo branco e extensão máxima\n * - Quadros 7..15 (frameNorm 0.46..1.00): Erosão celular progressiva por FBM 2D + gotas centrífugas\n */\nexport function renderVFXFrame(\n ctx: CanvasRenderingContext2D,\n frameIndex: number,\n totalFrames: number,\n width: number,\n height: number,\n config: VFXConfig,\n transparentBg = false\n) {\n const scale = width / 128;\n const frameNorm = totalFrames <= 1 ? 0.32 : frameIndex / (totalFrames - 1);\n const seed = config.seed;\n const pal = config.colors;\n\n ctx.save();\n if (!transparentBg) {\n if (config.bgMode === 'washi') {\n ctx.fillStyle = '#F4F1EA';\n ctx.fillRect(0, 0, width, height);\n } else if (config.bgMode === 'dark') {\n ctx.fillStyle = '#111113';\n ctx.fillRect(0, 0, width, height);\n }\n }\n\n let rc: ReturnType<typeof rough.canvas> | null = null;\n try {\n rc = rough.canvas(ctx.canvas);\n } catch {\n rc = null;\n }\n\n // Sakuga Timing Curves (Técnica #04)\n const headReach = Math.min(1, 1 - Math.pow(1 - frameNorm, 3.4));\n const tailRetract =\n frameNorm < 0.18 ? 0 : Math.pow((frameNorm - 0.18) / 0.82, 1.55) * 0.78;\n const erosionProgress =\n frameNorm < 0.25\n ? 0\n : Math.pow((frameNorm - 0.25) / 0.75, 1.25) * config.dynamics.erosionStrength;\n const apexFlash =\n frameNorm >= 0.18 && frameNorm <= 0.46\n ? Math.sin(((frameNorm - 0.18) / 0.28) * Math.PI)\n : 0;\n\n const rotRad = (config.brush.angle * Math.PI) / 180;\n const cx = 64 * scale;\n const cy = 64 * scale;\n\n // Aguada Atmosférica de Fundo (Tarashikomi — Técnica #09)\n if (config.dynamics.glowIntensity > 0.2 && erosionProgress < 0.88) {\n drawTarashikomiWashBlob(\n ctx,\n cx,\n cy,\n 46 * scale * (0.7 + headReach * 0.35),\n 38 * scale * (0.7 + headReach * 0.35),\n rotRad,\n pal.coreGlow,\n pal.energySecondary,\n Math.max(0.08, (1 - erosionProgress * 0.85) * 0.32 * config.dynamics.glowIntensity),\n seed + 11\n );\n }\n\n const arch = config.archetype;\n\n if (arch === 'hyb_slash_great_wave_katana' || arch === 'water_slash') {\n const startA = -Math.PI * 0.78 * config.brush.arcSweep + rotRad;\n const endA = Math.PI * 0.68 * config.brush.arcSweep + rotRad;\n const spine = samplePolarArc(\n cx,\n cy,\n 43 * scale,\n 36 * scale * config.brush.curvature,\n startA,\n endA,\n rotRad * 0.35,\n 0.12,\n 88,\n config.dynamics.jitterAmount,\n seed\n );\n\n // 1. Corpo de Nanquim Abissal (Kasure Multi-Cerdas)\n drawSumiKasureRibbon(ctx, {\n spine,\n maxWidth: 24 * scale * config.brush.strokeThickness,\n bristleCount: config.brush.bristleCount,\n dryBrushGap: config.brush.dryBrushGap,\n taperStart: config.brush.taperStart,\n taperEnd: config.brush.taperEnd,\n color: pal.inkPrimary,\n headReach,\n tailRetract,\n erosionProgress,\n erosionScale: config.dynamics.erosionScale,\n hookWaves: config.dynamics.hookWaves,\n seed,\n });\n\n // 2. Crista de Onda Hokusai com 5 Correntes Listradas e Garras de Espuma (Técnica #06)\n const activeSlice = spine.filter(\n (pt) => pt.t >= tailRetract * 0.85 && pt.t <= headReach\n );\n if (activeSlice.length >= 6 && erosionProgress < 0.82) {\n drawHokusaiWaveCrest(\n ctx,\n rc,\n activeSlice.map((p, idx, arr) => ({ ...p, t: idx / Math.max(1, arr.length - 1) })),\n 19 * scale * config.brush.strokeThickness * (1 - erosionProgress * 0.45),\n 1,\n arch === 'hyb_slash_great_wave_katana' ? 6 : 4,\n config,\n scale,\n Math.max(0.2, 1 - erosionProgress * 0.65),\n seed + frameIndex * 7\n );\n }\n\n // 3. Núcleo Incandescente Branco no Ápice\n drawSumiKasureRibbon(ctx, {\n spine,\n maxWidth: (8 + apexFlash * 5) * scale * config.brush.strokeThickness,\n bristleCount: Math.max(6, Math.floor(config.brush.bristleCount * 0.45)),\n dryBrushGap: config.brush.dryBrushGap * 0.5,\n taperStart: 0.9,\n taperEnd: 0.95,\n color: pal.coreGlow,\n offsetNormal: 2.2 * scale * config.dynamics.colorOffset,\n headReach,\n tailRetract: Math.min(headReach, tailRetract + 0.08),\n erosionProgress: erosionProgress * 1.1,\n erosionScale: config.dynamics.erosionScale,\n seed: seed + 303,\n });\n\n drawCentrifugalSplatters(\n ctx,\n spine,\n frameNorm,\n config.dynamics.splatterCount,\n config.dynamics.splatterSpread,\n scale,\n pal,\n seed\n );\n } else if (arch === 'hyb_slash_crimson_phoenix_arc') {\n // S-Curve Odachi com Pétalas de Chama Suibokuga (Técnica #05)\n const spine = sampleCubicCurve(\n { x: 18 * scale, y: 104 * scale },\n { x: 24 * scale, y: 22 * scale * config.brush.curvature },\n { x: 104 * scale, y: 106 * scale * config.brush.curvature },\n { x: 110 * scale, y: 20 * scale },\n 92,\n config.dynamics.jitterAmount,\n seed\n );\n\n drawSumiKasureRibbon(ctx, {\n spine,\n maxWidth: 22 * scale * config.brush.strokeThickness,\n bristleCount: config.brush.bristleCount,\n dryBrushGap: config.brush.dryBrushGap,\n taperStart: config.brush.taperStart,\n taperEnd: config.brush.taperEnd,\n color: pal.inkPrimary,\n headReach,\n tailRetract,\n erosionProgress,\n erosionScale: config.dynamics.erosionScale,\n seed,\n });\n\n // Pétalas de Chama em S-Curve plantadas ao longo do arco ativo\n const petalCount = 7;\n for (let p = 0; p < petalCount; p++) {\n const u = (p + 0.5) / petalCount;\n if (u < tailRetract || u > headReach) continue;\n const idx = Math.min(spine.length - 1, Math.floor(u * (spine.length - 1)));\n const pt = spine[idx];\n const len = (22 + Math.sin(u * Math.PI) * 18) * scale * (1 - erosionProgress * 0.55);\n const ang = Math.atan2(pt.ny, pt.nx) - 0.45;\n const tipX = pt.x + Math.cos(ang) * len;\n const tipY = pt.y + Math.sin(ang) * len;\n\n drawFlamePetalTongue(ctx, rc, config, scale, {\n rootX: pt.x,\n rootY: pt.y,\n ctrl1X: pt.x + Math.cos(ang - 0.5) * len * 0.42,\n ctrl1Y: pt.y + Math.sin(ang - 0.5) * len * 0.42,\n ctrl2X: pt.x + Math.cos(ang + 0.48) * len * 0.76,\n ctrl2Y: pt.y + Math.sin(ang + 0.48) * len * 0.76,\n tipX,\n tipY,\n maxBellyWidth: 14 * scale * config.brush.strokeThickness,\n striationCount: 5,\n alpha: Math.max(0.2, 1 - erosionProgress * 0.65),\n seed: seed + p * 67,\n });\n\n if (p % 2 === 0 && erosionProgress < 0.7) {\n drawDetachedSumiFlameWisp(\n ctx,\n tipX,\n tipY,\n tipX + Math.cos(ang - 0.2) * 14 * scale,\n tipY + Math.sin(ang - 0.2) * 14 * scale,\n 3.2 * scale,\n pal.energySecondary,\n seed + p * 131\n );\n }\n }\n\n drawCentrifugalSplatters(\n ctx,\n spine,\n frameNorm,\n config.dynamics.splatterCount,\n config.dynamics.splatterSpread,\n scale,\n pal,\n seed\n );\n } else if (arch === 'sakura_tempest_slash') {\n // Golpe Caligráfico com Flores de Cerejeira e Pétalas ao Vento\n const spine = samplePolarArc(\n cx,\n cy,\n 44 * scale,\n 34 * scale * config.brush.curvature,\n -Math.PI * 0.85 + rotRad,\n Math.PI * 0.75 + rotRad,\n -0.25,\n -0.15,\n 92,\n config.dynamics.jitterAmount,\n seed\n );\n\n drawSumiKasureRibbon(ctx, {\n spine,\n maxWidth: 21 * scale * config.brush.strokeThickness,\n bristleCount: config.brush.bristleCount,\n dryBrushGap: config.brush.dryBrushGap,\n taperStart: config.brush.taperStart,\n taperEnd: config.brush.taperEnd,\n color: pal.inkPrimary,\n headReach,\n tailRetract,\n erosionProgress,\n erosionScale: config.dynamics.erosionScale,\n seed,\n });\n\n drawSumiKasureRibbon(ctx, {\n spine,\n maxWidth: 9 * scale * config.brush.strokeThickness,\n bristleCount: Math.max(8, Math.floor(config.brush.bristleCount * 0.5)),\n dryBrushGap: config.brush.dryBrushGap * 0.7,\n taperStart: 0.8,\n taperEnd: 0.9,\n color: pal.energySecondary,\n offsetNormal: 3.5 * scale,\n headReach,\n tailRetract,\n erosionProgress,\n erosionScale: config.dynamics.erosionScale,\n seed: seed + 77,\n });\n\n const rand = createSeededRandom(seed + 409);\n const blossomCount = 9;\n for (let b = 0; b < blossomCount; b++) {\n const tPos = (b + 0.4) / blossomCount;\n if (tPos > headReach) continue;\n const idx = Math.min(spine.length - 1, Math.floor(tPos * (spine.length - 1)));\n const pt = spine[idx];\n const drift = Math.max(0, frameNorm - tPos * 0.35) * 18 * scale;\n const bx = pt.x + pt.nx * ((rand() - 0.35) * 18 * scale + drift);\n const by = pt.y + pt.ny * ((rand() - 0.35) * 18 * scale - drift * 0.4);\n const flowerScale = (5.5 + (b % 3) * 2.5) * scale * (1 - erosionProgress * 0.35);\n\n if (b % 2 === 0) {\n drawSakuraBlossom(\n ctx,\n bx,\n by,\n flowerScale,\n frameNorm * 1.8 + b,\n pal.energySecondary,\n pal.coreGlow,\n pal.inkPrimary,\n Math.max(0.2, 1 - erosionProgress * 0.5),\n seed + b * 43\n );\n } else {\n drawFloatingSakuraPetal(\n ctx,\n bx,\n by,\n flowerScale * 1.1,\n frameNorm * 3.2 + b,\n 0.45 + 0.5 * Math.abs(Math.cos(frameNorm * 4 + b)),\n pal.energySecondary,\n Math.max(0.25, 1 - erosionProgress * 0.4)\n );\n }\n }\n } else if (arch === 'enso_sigil') {\n // Círculo Zen Ensō Caligráfico (310° a 340° de varredura com fenda orgânica)\n const sweep = Math.PI * 1.82 * config.brush.arcSweep;\n const spine = samplePolarArc(\n cx,\n cy,\n 41 * scale,\n 40 * scale * config.brush.curvature,\n -Math.PI * 0.85 + rotRad + frameNorm * 0.25,\n -Math.PI * 0.85 + sweep + rotRad + frameNorm * 0.25,\n 0,\n -0.06,\n 96,\n config.dynamics.jitterAmount * 0.7,\n seed\n );\n\n drawSumiKasureRibbon(ctx, {\n spine,\n maxWidth: 22 * scale * config.brush.strokeThickness,\n bristleCount: config.brush.bristleCount,\n dryBrushGap: Math.max(0.25, config.brush.dryBrushGap),\n taperStart: 0.85,\n taperEnd: 0.98,\n color: pal.inkPrimary,\n headReach,\n tailRetract: tailRetract * 0.45,\n erosionProgress: erosionProgress * 0.85,\n erosionScale: config.dynamics.erosionScale,\n roundHeadCap: true,\n seed,\n });\n\n drawSumiKasureRibbon(ctx, {\n spine,\n maxWidth: 10 * scale * config.brush.strokeThickness,\n bristleCount: Math.max(8, Math.floor(config.brush.bristleCount * 0.55)),\n dryBrushGap: config.brush.dryBrushGap,\n taperStart: 0.85,\n taperEnd: 0.98,\n color: pal.energySecondary,\n offsetNormal: 2.8 * scale * config.dynamics.colorOffset,\n headReach,\n tailRetract: tailRetract * 0.55,\n erosionProgress,\n erosionScale: config.dynamics.erosionScale,\n seed: seed + 149,\n });\n\n drawCentrifugalSplatters(\n ctx,\n spine,\n frameNorm,\n config.dynamics.splatterCount,\n config.dynamics.splatterSpread,\n scale,\n pal,\n seed\n );\n } else if (arch === 'elem_fire_meteor_bolide') {\n // Técnica #08: Bólido Meteoro de Magma com Oclusão Real em 3 Camadas\n const travel = Math.min(1, frameNorm * 1.25);\n const headX = (24 + travel * 68) * scale;\n const headY = (24 + travel * 68) * scale;\n const tailX = (10 + travel * 18) * scale;\n const tailY = (10 + travel * 18) * scale;\n const dirAngle = Math.atan2(headY - tailY, headX - tailX);\n const coreR = (16 - erosionProgress * 4) * scale * config.brush.strokeThickness;\n\n // Passo 1: Cauda Traseira de Pétalas S-Curve (nasce dentro de headX, headY)\n for (let t = 0; t < 4; t++) {\n const spread = (t - 1.5) * 14 * scale;\n drawFlamePetalTongue(ctx, rc, config, scale, {\n rootX: headX,\n rootY: headY,\n ctrl1X: (headX + tailX) * 0.55 + spread,\n ctrl1Y: (headY + tailY) * 0.55 - spread,\n ctrl2X: (headX + tailX) * 0.3 - spread * 0.8,\n ctrl2Y: (headY + tailY) * 0.3 + spread * 0.8,\n tipX: tailX + (t - 1.5) * 8 * scale,\n tipY: tailY - (t - 1.5) * 8 * scale,\n maxBellyWidth: 18 * scale * config.brush.strokeThickness,\n striationCount: 5,\n alpha: Math.max(0.25, 1 - erosionProgress * 0.6),\n seed: seed + t * 53,\n });\n }\n\n // Passo 2: Núcleo Sólido 100% Opaco (oclui totalmente as raízes da cauda!)\n if (frameNorm < 0.85) {\n drawSolidOpaqueCoreSphere(\n ctx,\n rc,\n headX,\n headY,\n coreR * 1.12,\n coreR * 0.94,\n dirAngle,\n 0.24,\n config,\n scale,\n seed + frameIndex * 13\n );\n\n // Passo 3: Línguas Envolventes (Wrapping Tongues) abraçando a esfera\n for (const side of [-1, 1] as const) {\n const anchorAng = dirAngle + side * Math.PI * 0.42;\n const rx = headX + Math.cos(anchorAng) * coreR * 0.72;\n const ry = headY + Math.sin(anchorAng) * coreR * 0.72;\n const backAng = dirAngle + Math.PI + side * 0.28;\n drawFlamePetalTongue(ctx, rc, config, scale, {\n rootX: rx,\n rootY: ry,\n ctrl1X: rx + Math.cos(anchorAng) * 10 * scale,\n ctrl1Y: ry + Math.sin(anchorAng) * 10 * scale,\n ctrl2X: rx + Math.cos(backAng) * 22 * scale,\n ctrl2Y: ry + Math.sin(backAng) * 22 * scale,\n tipX: rx + Math.cos(backAng) * 34 * scale,\n tipY: ry + Math.sin(backAng) * 34 * scale,\n maxBellyWidth: 9.5 * scale,\n striationCount: 3,\n alpha: 0.96,\n seed: seed + (side > 0 ? 311 : 419),\n });\n }\n }\n\n // Transição para Nuvens Kumo no impacto (frames finais)\n if (frameNorm > 0.55) {\n drawUkiyoeCloudBank(\n ctx,\n rc,\n headX,\n headY,\n 46 * scale * ((frameNorm - 0.5) * 1.8),\n 4,\n config,\n scale,\n Math.min(0.95, (frameNorm - 0.5) * 1.9),\n seed + 701\n );\n }\n } else if (arch === 'elem_water_glacial_spikes') {\n // Técnica #10: Cristais Glaciais Chanfrados com Rough.js\n const spikeCount = 6;\n const growth =\n frameNorm < 0.28\n ? Math.min(1.12, Math.pow(frameNorm / 0.28, 0.65) * 1.12)\n : Math.max(0.15, 1 - Math.max(0, frameNorm - 0.65) * 2.1);\n\n for (let s = 0; s < spikeCount; s++) {\n const u = (s / (spikeCount - 1)) * 2 - 1;\n const ang = -Math.PI * 0.5 + u * 0.68 + rotRad * 0.3;\n const len = (56 - Math.abs(u) * 22) * scale * growth * config.brush.strokeThickness;\n const w = (16 - Math.abs(u) * 4) * scale * config.brush.strokeThickness;\n drawFacetedRoughCrystal(\n ctx,\n rc,\n cx + u * 16 * scale,\n 104 * scale,\n ang,\n len,\n w,\n config,\n scale,\n seed + s * 97\n );\n }\n\n drawUkiyoeCloudBank(\n ctx,\n rc,\n cx,\n 104 * scale,\n 68 * scale,\n 4,\n config,\n scale,\n Math.max(0.25, 1 - erosionProgress * 0.7),\n seed + 503\n );\n } else if (arch === 'solid_ref_fumaca') {\n // Técnica #07: Bancos de Nuvens & Fumaça Ukiyo-e (Kumo) em C-Hook\n const expand = 0.65 + headReach * 0.55;\n for (let v = 0; v < 5; v++) {\n const ang = (v / 5) * Math.PI * 2 + frameNorm * 0.55 + rotRad;\n const dist = (14 + frameNorm * 24) * scale;\n const sx = cx + Math.cos(ang) * dist * 0.35;\n const sy = cy + Math.sin(ang) * dist * 0.35;\n const ex = cx + Math.cos(ang + 0.55) * (36 * scale * expand);\n const ey = cy + Math.sin(ang + 0.55) * (36 * scale * expand);\n\n drawUkiyoeCloudScrollVolute(ctx, rc, config, scale, {\n startX: sx,\n startY: sy,\n endX: ex,\n endY: ey,\n maxThickness: 20 * scale * config.brush.strokeThickness * (1 - erosionProgress * 0.45),\n lobeCount: 3,\n flip: v % 2 === 0 ? 1 : -1,\n alpha: Math.max(0.2, 1 - erosionProgress * 0.65),\n seed: seed + v * 113,\n });\n }\n } else if (arch === 'elem_water_healing_fountain') {\n // Técnica #09: Aguada Tarashikomi + Fitas Ascendentes S-Curve\n drawTarashikomiWashBlob(\n ctx,\n cx,\n 82 * scale,\n 44 * scale,\n 26 * scale,\n 0,\n pal.coreGlow,\n pal.energySecondary,\n 0.75 * (1 - erosionProgress * 0.5),\n seed + 31\n );\n\n for (let h = 0; h < 3; h++) {\n const phase = (h * Math.PI * 2) / 3 + frameNorm * Math.PI * 1.4;\n const spine = sampleCubicCurve(\n { x: cx + Math.sin(phase) * 20 * scale, y: 106 * scale },\n { x: cx - Math.sin(phase) * 32 * scale, y: 74 * scale },\n { x: cx + Math.sin(phase) * 28 * scale, y: 42 * scale },\n { x: cx - Math.sin(phase) * 14 * scale, y: 16 * scale },\n 64,\n config.dynamics.jitterAmount * 0.4,\n seed + h * 71\n );\n drawSumiKasureRibbon(ctx, {\n spine,\n maxWidth: 13 * scale * config.brush.strokeThickness,\n bristleCount: 14,\n dryBrushGap: config.brush.dryBrushGap,\n taperStart: 0.7,\n taperEnd: 0.95,\n color: h === 0 ? pal.inkPrimary : h === 1 ? pal.energySecondary : pal.coreGlow,\n headReach,\n tailRetract: tailRetract * 0.7,\n erosionProgress,\n erosionScale: config.dynamics.erosionScale,\n seed: seed + h * 89,\n });\n }\n } else if (arch === 'portal_abyssal_vortex') {\n // Vórtice Espiral Logarítmico com Núcleo Abissal Oclusivo\n const arms = 3;\n for (let a = 0; a < arms; a++) {\n const baseA = (a / arms) * Math.PI * 2 + frameNorm * Math.PI * 1.5 + rotRad;\n const spine = samplePolarArc(\n cx,\n cy,\n 45 * scale,\n 42 * scale * config.brush.curvature,\n baseA,\n baseA + Math.PI * 1.45,\n 0,\n -0.52,\n 76,\n config.dynamics.jitterAmount * 0.5,\n seed + a * 61\n );\n drawSumiKasureRibbon(ctx, {\n spine,\n maxWidth: 16 * scale * config.brush.strokeThickness,\n bristleCount: Math.max(10, Math.floor(config.brush.bristleCount * 0.7)),\n dryBrushGap: config.brush.dryBrushGap,\n taperStart: 0.6,\n taperEnd: 0.95,\n color: a % 2 === 0 ? pal.energySecondary : pal.inkPrimary,\n headReach,\n tailRetract: tailRetract * 0.4,\n erosionProgress: erosionProgress * 0.75,\n erosionScale: config.dynamics.erosionScale,\n seed: seed + a * 107,\n });\n }\n\n // Olho Abissal Oclusivo no Centro\n ctx.beginPath();\n ctx.arc(cx, cy, 13 * scale * (1 - erosionProgress * 0.35), 0, Math.PI * 2);\n ctx.fillStyle = pal.inkPrimary;\n ctx.fill();\n ctx.strokeStyle = pal.coreGlow;\n ctx.lineWidth = 1.5 * scale;\n ctx.stroke();\n } else {\n // Default / Crescent / Blood Moon Scythe (Técnicas #02, #03, #04)\n const isScythe = arch === 'hyb_slash_blood_moon_scythe';\n const sweepSpan = (isScythe ? Math.PI * 1.52 : Math.PI * 1.18) * config.brush.arcSweep;\n const spine = samplePolarArc(\n cx,\n cy,\n 44 * scale,\n (isScythe ? 42 : 34) * scale * config.brush.curvature,\n -sweepSpan * 0.55 + rotRad,\n sweepSpan * 0.55 + rotRad,\n 0.22,\n isScythe ? -0.18 : 0.08,\n 96,\n config.dynamics.jitterAmount,\n seed\n );\n\n // Canal 1: Corpo de Nanquim Abissal\n drawSumiKasureRibbon(ctx, {\n spine,\n maxWidth: (isScythe ? 28 : 23) * scale * config.brush.strokeThickness,\n bristleCount: config.brush.bristleCount,\n dryBrushGap: config.brush.dryBrushGap,\n taperStart: config.brush.taperStart,\n taperEnd: config.brush.taperEnd,\n color: pal.inkPrimary,\n headReach,\n tailRetract,\n erosionProgress,\n erosionScale: config.dynamics.erosionScale,\n hookWaves: config.dynamics.hookWaves,\n roundHeadCap: true,\n seed,\n });\n\n // Canal 2: Crista de Energia Elemental Deslocada pela Normal\n drawSumiKasureRibbon(ctx, {\n spine,\n maxWidth: 14 * scale * config.brush.strokeThickness,\n bristleCount: Math.max(8, Math.floor(config.brush.bristleCount * 0.68)),\n dryBrushGap: config.brush.dryBrushGap * 0.85,\n taperStart: config.brush.taperStart,\n taperEnd: config.brush.taperEnd,\n color: pal.energySecondary,\n offsetNormal: 3.2 * scale * config.dynamics.colorOffset,\n headReach,\n tailRetract: Math.min(headReach, tailRetract + 0.04),\n erosionProgress,\n erosionScale: config.dynamics.erosionScale,\n hookWaves: config.dynamics.hookWaves,\n roundHeadCap: false,\n seed: seed + 199,\n });\n\n // Canal 3: Núcleo Incandescente Branco no Ápice\n drawSumiKasureRibbon(ctx, {\n spine,\n maxWidth: (6.5 + apexFlash * 4.5) * scale * config.brush.strokeThickness,\n bristleCount: Math.max(5, Math.floor(config.brush.bristleCount * 0.38)),\n dryBrushGap: config.brush.dryBrushGap * 0.5,\n taperStart: 0.9,\n taperEnd: 0.95,\n color: pal.coreGlow,\n offsetNormal: 1.8 * scale * config.dynamics.colorOffset,\n headReach,\n tailRetract: Math.min(headReach, tailRetract + 0.09),\n erosionProgress: erosionProgress * 1.15,\n erosionScale: config.dynamics.erosionScale,\n roundHeadCap: false,\n seed: seed + 397,\n });\n\n drawCentrifugalSplatters(\n ctx,\n spine,\n frameNorm,\n config.dynamics.splatterCount,\n config.dynamics.splatterSpread,\n scale,\n pal,\n seed\n );\n }\n\n // Isolamento ou máscara de 3 canais (Técnica #11)\n if (config.channelMode !== 'composite') {\n const imgData = ctx.getImageData(0, 0, width, height);\n const processed = recolorReferenceSheetData(imgData, config);\n ctx.putImageData(processed, 0, 0);\n }\n\n ctx.restore();\n}\n\n/**\n * Técnica #12: Pipeline de Composição de Sprite Sheet 4×4 com Isolamento Estrito por Célula (ctx.clip)\n */\nexport function renderCompleteSpriteSheet(\n canvas: HTMLCanvasElement,\n config: VFXConfig,\n columns = 4\n) {\n const rows = Math.ceil(config.totalFrames / columns);\n const fSize = config.frameSize;\n canvas.width = fSize * columns;\n canvas.height = fSize * rows;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n\n for (let i = 0; i < config.totalFrames; i++) {\n const col = i % columns;\n const row = Math.floor(i / columns);\n ctx.save();\n ctx.beginPath();\n ctx.rect(col * fSize, row * fSize, fSize, fSize);\n ctx.clip();\n ctx.translate(col * fSize, row * fSize);\n renderVFXFrame(ctx, i, config.totalFrames, fSize, fSize, config, true);\n ctx.restore();\n }\n}\n","/**\n * Técnica #12: Codificador Binário GIF89a LZW Completo\n * Quantização de paleta 6x6x6 (216 cores) + índice dedicado de transparência (255),\n * Graphics Control Extension (0x21 0xF9) com Disposal Method = 2 (Restore to Background),\n * e compressão LZW de código variável (9 a 12 bits) sem dependências externas.\n */\nexport function encodeAnimatedGIF89a(\n frames: ImageData[],\n width: number,\n height: number,\n fps: number\n): Uint8Array {\n const bytes: number[] = [];\n const writeByte = (b: number) => bytes.push(b & 0xff);\n const writeShort = (s: number) => {\n bytes.push(s & 0xff);\n bytes.push((s >> 8) & 0xff);\n };\n const writeAscii = (str: string) => {\n for (let i = 0; i < str.length; i++) {\n bytes.push(str.charCodeAt(i) & 0xff);\n }\n };\n\n // Header GIF89a\n writeAscii('GIF89a');\n writeShort(width);\n writeShort(height);\n\n // Global Color Table Flag = 1, Color Resolution = 7, Sort = 0, Size of GCT = 7 (256 colors)\n writeByte(0xf7);\n writeByte(255); // Background color index (transparent)\n writeByte(0); // Pixel aspect ratio\n\n // Global Color Table: 6x6x6 web-safe cube (indices 0..215), rest padded to 255\n for (let i = 0; i < 256; i++) {\n if (i < 216) {\n const r = Math.floor(i / 36);\n const g = Math.floor((i % 36) / 6);\n const b = i % 6;\n writeByte(Math.round((r * 255) / 5));\n writeByte(Math.round((g * 255) / 5));\n writeByte(Math.round((b * 255) / 5));\n } else {\n writeByte(0);\n writeByte(0);\n writeByte(0);\n }\n }\n\n // Netscape 2.0 Application Extension for Infinite Looping\n writeByte(0x21);\n writeByte(0xff);\n writeByte(11);\n writeAscii('NETSCAPE2.0');\n writeByte(3);\n writeByte(1);\n writeShort(0); // Loop forever\n writeByte(0);\n\n const delayCs = Math.max(2, Math.round(100 / Math.max(1, fps)));\n\n for (const frame of frames) {\n // Graphics Control Extension (0x21 0xF9)\n writeByte(0x21);\n writeByte(0xf9);\n writeByte(4);\n // Disposal Method = 2 (Restore to Background -> 0b00001000 = 0x08) | Transparent Color Flag = 1 (0x01) => 0x09\n writeByte(0x09);\n writeShort(delayCs);\n writeByte(255); // Transparent color index\n writeByte(0);\n\n // Image Descriptor\n writeByte(0x2c);\n writeShort(0);\n writeShort(0);\n writeShort(width);\n writeShort(height);\n writeByte(0x00); // No local color table\n\n // Quantize pixels to indices [0..215] or 255 (transparent)\n const indexed = new Uint8Array(width * height);\n const data = frame.data;\n for (let p = 0; p < width * height; p++) {\n const idx = p * 4;\n const a = data[idx + 3];\n if (a < 48) {\n indexed[p] = 255;\n } else {\n const r5 = Math.min(5, Math.round((data[idx] * 5) / 255));\n const g5 = Math.min(5, Math.round((data[idx + 1] * 5) / 255));\n const b5 = Math.min(5, Math.round((data[idx + 2] * 5) / 255));\n indexed[p] = r5 * 36 + g5 * 6 + b5;\n }\n }\n\n // LZW Compression (minCodeSize = 8)\n const minCodeSize = 8;\n writeByte(minCodeSize);\n const lzwBlocks = lzwEncode(indexed, minCodeSize);\n for (let i = 0; i < lzwBlocks.length; i++) {\n writeByte(lzwBlocks[i]);\n }\n writeByte(0x00); // Block terminator\n }\n\n // Trailer\n writeByte(0x3b);\n return new Uint8Array(bytes);\n}\n\nfunction lzwEncode(indexedPixels: Uint8Array, minCodeSize: number): number[] {\n const clearCode = 1 << minCodeSize;\n const endCode = clearCode + 1;\n let codeSize = minCodeSize + 1;\n let nextCode = endCode + 1;\n\n // Dictionary mapping (prefix << 8 | suffix) -> code\n const dict = new Map<number, number>();\n const outBytes: number[] = [];\n let bitBuffer = 0;\n let bitCount = 0;\n const subBlock: number[] = [];\n\n const flushSubBlock = () => {\n if (subBlock.length > 0) {\n outBytes.push(subBlock.length);\n for (let i = 0; i < subBlock.length; i++) {\n outBytes.push(subBlock[i]);\n }\n subBlock.length = 0;\n }\n };\n\n const emitCode = (code: number) => {\n bitBuffer |= code << bitCount;\n bitCount += codeSize;\n while (bitCount >= 8) {\n subBlock.push(bitBuffer & 0xff);\n if (subBlock.length === 255) {\n flushSubBlock();\n }\n bitBuffer >>>= 8;\n bitCount -= 8;\n }\n };\n\n emitCode(clearCode);\n let prefix = indexedPixels[0];\n\n for (let i = 1; i < indexedPixels.length; i++) {\n const suffix = indexedPixels[i];\n const key = (prefix << 8) | suffix;\n const found = dict.get(key);\n if (found !== undefined) {\n prefix = found;\n } else {\n emitCode(prefix);\n if (nextCode < 4096) {\n dict.set(key, nextCode++);\n if (nextCode > 1 << codeSize && codeSize < 12) {\n codeSize++;\n }\n } else {\n emitCode(clearCode);\n dict.clear();\n codeSize = minCodeSize + 1;\n nextCode = endCode + 1;\n }\n prefix = suffix;\n }\n }\n\n emitCode(prefix);\n emitCode(endCode);\n if (bitCount > 0) {\n subBlock.push(bitBuffer & 0xff);\n }\n flushSubBlock();\n return outBytes;\n}\n","import React, { useEffect, useRef, useState } from 'react';\nimport {\n createSeededRandom,\n sampleCubicCurve,\n samplePolarArc,\n sampleQuadraticCurve,\n samplesToSpine,\n} from '../math';\nimport {\n drawFloatingSakuraPetal,\n drawSakuraBlossom,\n drawSumiKasureRibbon,\n drawTarashikomiWashBlob,\n} from '../techniques';\nimport { MaskChoreography } from '../types';\n\nexport interface SumiMaskRevealProps {\n /** URL da imagem a ser pintada/revelada com a máscara de pinceladas (padrão: obra do Monte Fuji e Sakura) */\n src?: string;\n /** Texto alternativo para acessibilidade */\n alt?: string;\n /** Coreografia das pinceladas que revelam a imagem */\n choreography?: MaskChoreography;\n /** Duração total da animação de pintura em segundos */\n duration?: number;\n /** Quantidade de cerdas de bambu por pincelada (Técnica #03) */\n bristleCount?: number;\n /** Intensidade de falha de pincel seco Kasure (0.0 a 0.85) */\n dryBrushGap?: number;\n /** Semente determinística Mulberry32 */\n seed?: number;\n /** Se verdadeiro, exibe os acentos vivos de tinta úmida e pétalas sobre a imagem revelada */\n showLiveInkAccents?: boolean;\n /** Modo Raio-X para visualizar apenas a máscara de pinceladas pura */\n maskOnlyPreview?: boolean;\n /** Progresso controlado externamente (0.0 a 1.0). Se omitido, anima automaticamente */\n progress?: number;\n /** Chave de gatilho para reiniciar a pintura do zero */\n replayTrigger?: number;\n /** Permite ao usuário pintar/revelar ainda mais com o dedo, mouse ou caneta */\n interactiveBrush?: boolean;\n /** Exibe controles rápidos flutuantes para pintar com o dedo no mobile/desktop */\n showTouchControls?: boolean;\n /** Classe CSS do container */\n className?: string;\n}\n\ninterface TouchPoint {\n x: number;\n y: number;\n pressure: number;\n}\n\n/**\n * Componente <SumiMaskReveal />\n * Realiza a pintura animada de qualquer imagem passada via prop `src` combinando máscara de pinceladas\n * Multi-Cerdas Kasure, Aguada Tarashikomi e Canvas Composite (`destination-in`), com cache offscreen\n * e suporte completo a pintura por toque no mobile (arrastar ou tocar para revelar).\n */\nexport const SumiMaskReveal: React.FC<SumiMaskRevealProps> = ({\n src = '/assets/aistudio/image_8f7809d3.png',\n alt = 'Pintura Sumi-e revelada por máscara caligráfica',\n choreography = 'fuji_masterpiece',\n duration = 3.4,\n bristleCount = 26,\n dryBrushGap = 0.28,\n seed = 8472,\n showLiveInkAccents = true,\n maskOnlyPreview = false,\n progress: controlledProgress,\n replayTrigger = 0,\n interactiveBrush = true,\n showTouchControls = true,\n className = '',\n}) => {\n const displayCanvasRef = useRef<HTMLCanvasElement | null>(null);\n const maskCanvasRef = useRef<HTMLCanvasElement | null>(null);\n const compositeCacheRef = useRef<HTMLCanvasElement | null>(null);\n const cacheKeyRef = useRef<string>('');\n const isVisibleRef = useRef<boolean>(true);\n const imageRef = useRef<HTMLImageElement | null>(null);\n const [imageLoaded, setImageLoaded] = useState(false);\n const [imageError, setImageError] = useState(false);\n\n // Modo de pintura livre com o dedo/mouse (\"scratch & paint from zero\")\n const [manualScratchMode, setManualScratchMode] = useState<boolean>(\n choreography === 'interactive_brush'\n );\n const [userStrokeCount, setUserStrokeCount] = useState<number>(0);\n\n const userStrokesRef = useRef<TouchPoint[][]>([]);\n const activeStrokeRef = useRef<TouchPoint[] | null>(null);\n const lastPointerPosRef = useRef<{ x: number; y: number; active: boolean }>({\n x: 0,\n y: 0,\n active: false,\n });\n const strokeVersionRef = useRef<number>(0);\n const startTimeRef = useRef<number>(performance.now());\n\n useEffect(() => {\n setManualScratchMode(choreography === 'interactive_brush');\n }, [choreography]);\n\n useEffect(() => {\n setImageLoaded(false);\n setImageError(false);\n cacheKeyRef.current = '';\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.onload = () => {\n imageRef.current = img;\n cacheKeyRef.current = '';\n setImageLoaded(true);\n };\n img.onerror = () => {\n setImageError(true);\n };\n img.src = src;\n }, [src]);\n\n useEffect(() => {\n startTimeRef.current = performance.now();\n userStrokesRef.current = [];\n setUserStrokeCount(0);\n strokeVersionRef.current++;\n cacheKeyRef.current = '';\n }, [replayTrigger, choreography, seed, src]);\n\n useEffect(() => {\n const canvas = displayCanvasRef.current;\n if (!canvas || typeof IntersectionObserver === 'undefined') return;\n const io = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n isVisibleRef.current = entry.isIntersecting;\n });\n },\n { rootMargin: '80px 0px', threshold: 0.01 }\n );\n io.observe(canvas);\n return () => io.disconnect();\n }, []);\n\n useEffect(() => {\n const canvas = displayCanvasRef.current;\n if (!canvas) return;\n if (!maskCanvasRef.current) {\n maskCanvasRef.current = document.createElement('canvas');\n }\n if (!compositeCacheRef.current) {\n compositeCacheRef.current = document.createElement('canvas');\n }\n const maskCanvas = maskCanvasRef.current;\n const compositeCache = compositeCacheRef.current;\n let animId = 0;\n let cachedRect = canvas.getBoundingClientRect();\n\n const ro = new ResizeObserver((entries) => {\n if (entries[0]) {\n cachedRect = entries[0].contentRect as DOMRect;\n cacheKeyRef.current = '';\n }\n });\n ro.observe(canvas);\n\n const renderFrame = (now: number) => {\n if (!isVisibleRef.current) {\n animId = requestAnimationFrame(renderFrame);\n return;\n }\n\n const dpr = Math.min(1.75, window.devicePixelRatio || 1);\n const w = Math.max(220, Math.floor(cachedRect.width || canvas.clientWidth || 500));\n const h = Math.max(160, Math.floor(cachedRect.height || canvas.clientHeight || 320));\n\n const targetW = Math.floor(w * dpr);\n const targetH = Math.floor(h * dpr);\n if (canvas.width !== targetW || canvas.height !== targetH) {\n canvas.width = targetW;\n canvas.height = targetH;\n maskCanvas.width = targetW;\n maskCanvas.height = targetH;\n compositeCache.width = targetW;\n compositeCache.height = targetH;\n cacheKeyRef.current = '';\n }\n\n const ctx = canvas.getContext('2d');\n const mCtx = maskCanvas.getContext('2d');\n const cCtx = compositeCache.getContext('2d');\n if (!ctx || !mCtx || !cCtx) return;\n\n const elapsed = (now - startTimeRef.current) / 1000;\n const isInteractiveOnly = manualScratchMode || choreography === 'interactive_brush';\n const autoProg = isInteractiveOnly\n ? 0.16\n : Math.min(1, elapsed / Math.max(0.4, duration));\n const prog = controlledProgress !== undefined ? controlledProgress : autoProg;\n const quantProg = prog >= 0.998 ? 1 : Math.round(prog * 90) / 90;\n // Escala amigável para mobile: garante que pinceladas no celular tenham largura generosa\n const scale = Math.max(0.52, Math.min(w / 920, h / 560));\n\n const currentCacheKey = `${targetW}x${targetH}:${choreography}:${isInteractiveOnly}:${quantProg}:${bristleCount}:${dryBrushGap}:${seed}:${maskOnlyPreview}:${imageLoaded}:${strokeVersionRef.current}`;\n\n if (cacheKeyRef.current !== currentCacheKey) {\n // 1. Constrói a Máscara de Pinceladas Sumi-e Kasure + Aguada Tarashikomi no maskCanvas\n mCtx.save();\n mCtx.setTransform(dpr, 0, 0, dpr, 0, 0);\n mCtx.clearRect(0, 0, w, h);\n\n if (isInteractiveOnly) {\n // No modo interativo/mobile de pintar com o dedo, cria apenas uma sutil mancha inicial\n // caso o usuário ainda não tenha tocado na tela, convidando-o a revelar o restante\n if (userStrokesRef.current.length === 0 && !activeStrokeRef.current) {\n drawTarashikomiWashBlob(\n mCtx,\n w * 0.5,\n h * 0.48,\n w * 0.14,\n h * 0.14,\n 0,\n '#000000',\n '#000000',\n 0.85,\n seed + 19\n );\n }\n } else if (choreography === 'fuji_masterpiece') {\n const sunP = Math.min(1, quantProg * 2.2);\n if (sunP > 0.01) {\n drawTarashikomiWashBlob(\n mCtx,\n w * 0.79,\n h * 0.28,\n w * 0.22 * sunP,\n w * 0.22 * sunP,\n 0,\n '#000000',\n '#000000',\n 1.0,\n seed + 11\n );\n }\n\n const fujiStrokes = [\n { x0: w * 0.74, y0: h * 0.45, x1: w * 0.34, y1: h * 0.85, w: 145 * scale, start: 0.08, end: 0.55 },\n { x0: w * 0.73, y0: h * 0.46, x1: w * 0.98, y1: h * 0.82, w: 140 * scale, start: 0.14, end: 0.62 },\n { x0: w * 0.42, y0: h * 0.84, x1: w * 0.96, y1: h * 0.88, w: 165 * scale, start: 0.22, end: 0.72 },\n ];\n fujiStrokes.forEach((st, idx) => {\n const localP = Math.max(0, Math.min(1, (quantProg - st.start) / (st.end - st.start)));\n if (localP <= 0.01) return;\n const sp = sampleQuadraticCurve(\n { x: st.x0, y: st.y0 },\n { x: (st.x0 + st.x1) * 0.5, y: (st.y0 + st.y1) * 0.5 - 24 * scale },\n { x: st.x1, y: st.y1 },\n 48,\n 0.15,\n seed + 100 + idx * 19\n );\n drawSumiKasureRibbon(mCtx, {\n spine: sp,\n maxWidth: st.w,\n bristleCount,\n dryBrushGap: dryBrushGap * 0.75,\n taperStart: 0.25,\n taperEnd: 0.45,\n color: '#000000',\n alpha: 1,\n headReach: localP,\n seed: seed + 120 + idx * 19,\n });\n });\n\n const sakuraStrokes = [\n {\n p0: { x: 0, y: h * 0.72 },\n p1: { x: w * 0.16, y: h * 0.42 },\n p2: { x: w * 0.32, y: h * 0.2 },\n p3: { x: w * 0.56, y: h * 0.04 },\n w: 195 * scale,\n start: 0.18,\n end: 0.76,\n },\n {\n p0: { x: w * 0.08, y: h * 0.48 },\n p1: { x: w * 0.28, y: h * 0.46 },\n p2: { x: w * 0.46, y: h * 0.62 },\n p3: { x: w * 0.66, y: h * 0.75 },\n w: 175 * scale,\n start: 0.28,\n end: 0.85,\n },\n {\n p0: { x: w * 0.04, y: h * 0.45 },\n p1: { x: w * 0.12, y: h * 0.24 },\n p2: { x: w * 0.28, y: h * 0.12 },\n p3: { x: w * 0.64, y: h * 0.22 },\n w: 180 * scale,\n start: 0.34,\n end: 0.9,\n },\n ];\n\n sakuraStrokes.forEach((st, idx) => {\n const localP = Math.max(0, Math.min(1, (quantProg - st.start) / (st.end - st.start)));\n if (localP <= 0.01) return;\n const sp = sampleCubicCurve(st.p0, st.p1, st.p2, st.p3, 52, 0.2, seed + 200 + idx * 29);\n drawSumiKasureRibbon(mCtx, {\n spine: sp,\n maxWidth: st.w,\n bristleCount,\n dryBrushGap: dryBrushGap * 0.65,\n taperStart: 0.15,\n taperEnd: 0.35,\n color: '#000000',\n alpha: 1,\n headReach: localP,\n seed: seed + 220 + idx * 29,\n });\n });\n\n if (quantProg > 0.55) {\n const fillP = (quantProg - 0.55) / 0.45;\n drawTarashikomiWashBlob(\n mCtx,\n w * 0.5,\n h * 0.5,\n w * 0.72 * fillP,\n h * 0.72 * fillP,\n 0,\n '#000000',\n '#000000',\n Math.min(1, fillP * 1.35),\n seed + 555\n );\n }\n } else if (choreography === 'katana_slashes') {\n const slashCount = 6;\n for (let s = 0; s < slashCount; s++) {\n const start = s * 0.11;\n const localP = Math.max(0, Math.min(1, (quantProg - start) / 0.45));\n if (localP <= 0.01) continue;\n const y0 = h * (0.12 + (s / (slashCount - 1)) * 0.78);\n const y1 = h * (0.08 + ((slashCount - 1 - s) / (slashCount - 1)) * 0.84);\n const isEven = s % 2 === 0;\n const sp = sampleQuadraticCurve(\n { x: isEven ? -w * 0.05 : w * 1.05, y: y0 },\n { x: w * 0.5, y: (y0 + y1) * 0.5 + (isEven ? -45 : 45) * scale },\n { x: isEven ? w * 1.05 : -w * 0.05, y: y1 },\n 52,\n 0.18,\n seed + s * 37\n );\n drawSumiKasureRibbon(mCtx, {\n spine: sp,\n maxWidth: 165 * scale,\n bristleCount,\n dryBrushGap,\n taperStart: 0.2,\n taperEnd: 0.35,\n color: '#000000',\n alpha: 1,\n headReach: localP,\n seed: seed + s * 73,\n });\n }\n } else if (choreography === 'enso_spiral') {\n const maxR = Math.hypot(w, h) * 0.56;\n const loops = 3;\n for (let l = 0; l < loops; l++) {\n const localP = Math.max(0, Math.min(1, (quantProg - l * 0.15) / 0.65));\n if (localP <= 0.01) continue;\n const r = maxR * ((l + 0.6) / loops);\n const sp = samplePolarArc(\n w * 0.5,\n h * 0.5,\n r,\n r * 0.82,\n -Math.PI * 0.85 + l * 1.2,\n Math.PI * 1.35 + l * 1.2,\n 0,\n 0.15,\n 68,\n 0.15,\n seed + l * 59\n );\n drawSumiKasureRibbon(mCtx, {\n spine: sp,\n maxWidth: 190 * scale,\n bristleCount,\n dryBrushGap,\n taperStart: 0.25,\n taperEnd: 0.4,\n color: '#000000',\n alpha: 1,\n headReach: localP,\n seed: seed + l * 97,\n });\n }\n } else if (choreography === 'hokusai_tide') {\n const waveRows = 5;\n for (let r = 0; r < waveRows; r++) {\n const localP = Math.max(0, Math.min(1, (quantProg - r * 0.1) / 0.55));\n if (localP <= 0.01) continue;\n const baseY = h * (0.15 + (r / (waveRows - 1)) * 0.72);\n const sp = sampleCubicCurve(\n { x: -w * 0.05, y: baseY + 30 * scale },\n { x: w * 0.32, y: baseY - 75 * scale },\n { x: w * 0.68, y: baseY + 75 * scale },\n { x: w * 1.05, y: baseY - 25 * scale },\n 56,\n 0.2,\n seed + r * 43\n );\n drawSumiKasureRibbon(mCtx, {\n spine: sp,\n maxWidth: 175 * scale,\n bristleCount,\n dryBrushGap,\n taperStart: 0.15,\n taperEnd: 0.25,\n color: '#000000',\n alpha: 1,\n headReach: localP,\n hookWaves: 4,\n seed: seed + r * 83,\n });\n }\n }\n\n const allUserStrokes = activeStrokeRef.current\n ? [...userStrokesRef.current, activeStrokeRef.current]\n : userStrokesRef.current;\n\n allUserStrokes.forEach((pts, sIdx) => {\n if (pts.length === 0) return;\n // Se foi um toque único no mobile (1 ponto), cria um golpe de pincel + mancha Tarashikomi\n const effectivePts =\n pts.length === 1\n ? [\n { x: pts[0].x - 28 * scale, y: pts[0].y + 10 * scale, pressure: 0.85 },\n { x: pts[0].x, y: pts[0].y, pressure: 0.95 },\n { x: pts[0].x + 32 * scale, y: pts[0].y - 12 * scale, pressure: 0.75 },\n ]\n : pts;\n\n const spine = samplesToSpine(effectivePts, 0.1, seed + sIdx * 17);\n const avgPressure =\n effectivePts.reduce((acc, p) => acc + p.pressure, 0) / effectivePts.length;\n\n // Mancha de base úmida no início do toque para facilitar a revelação no celular\n drawTarashikomiWashBlob(\n mCtx,\n effectivePts[0].x,\n effectivePts[0].y,\n 46 * scale,\n 38 * scale,\n sIdx * 0.7,\n '#000000',\n '#000000',\n 0.95,\n seed + 800 + sIdx * 19\n );\n\n drawSumiKasureRibbon(mCtx, {\n spine,\n maxWidth: 122 * scale * (0.75 + avgPressure * 0.85),\n bristleCount: Math.max(14, Math.floor(bristleCount * 0.85)),\n dryBrushGap: dryBrushGap * 0.65,\n taperStart: 0.18,\n taperEnd: 0.38,\n color: '#000000',\n alpha: 1,\n seed: seed + 900 + sIdx * 23,\n });\n });\n\n mCtx.restore();\n\n // 2. Compõe a imagem recortada no compositeCache\n cCtx.save();\n cCtx.setTransform(dpr, 0, 0, dpr, 0, 0);\n cCtx.clearRect(0, 0, w, h);\n\n if (maskOnlyPreview) {\n cCtx.drawImage(maskCanvas, 0, 0, w, h);\n } else if (imageLoaded && imageRef.current && !imageError) {\n const img = imageRef.current;\n const imgRatio = img.width / Math.max(1, img.height);\n const canvasRatio = w / h;\n let drawW = w;\n let drawH = h;\n let drawX = 0;\n let drawY = 0;\n\n if (canvasRatio > imgRatio) {\n drawW = w;\n drawH = w / imgRatio;\n drawY = (h - drawH) * 0.5;\n } else {\n drawH = h;\n drawW = h * imgRatio;\n drawX = (w - drawW) * 0.5;\n }\n\n cCtx.drawImage(img, drawX, drawY, drawW, drawH);\n cCtx.globalCompositeOperation = 'destination-in';\n cCtx.drawImage(maskCanvas, 0, 0, w, h);\n cCtx.globalCompositeOperation = 'source-over';\n\n // No modo de pintura manual, desenha uma silhueta Washi bem suave (12%) por baixo\n // para guiar o dedo do usuário ao revelar a pintura no mobile\n if (isInteractiveOnly) {\n cCtx.globalCompositeOperation = 'destination-over';\n cCtx.globalAlpha = 0.12;\n cCtx.drawImage(img, drawX, drawY, drawW, drawH);\n cCtx.globalAlpha = 1;\n cCtx.globalCompositeOperation = 'source-over';\n }\n } else {\n cCtx.drawImage(maskCanvas, 0, 0, w, h);\n }\n\n cCtx.restore();\n cacheKeyRef.current = currentCacheKey;\n }\n\n // 3. Desenha o compositeCache no canvas principal + acentos vivos das pinceladas do usuário\n ctx.save();\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, w, h);\n ctx.drawImage(compositeCache, 0, 0, w, h);\n\n // Desenha flores de Sakura sutis ao longo dos traços feitos pelo dedo/mouse do usuário\n // para dar resposta visual imediata mesmo quando a área já estava revelada\n if (!maskOnlyPreview) {\n const allUserStrokes = activeStrokeRef.current\n ? [...userStrokesRef.current, activeStrokeRef.current]\n : userStrokesRef.current;\n\n allUserStrokes.forEach((pts, sIdx) => {\n if (pts.length === 0) return;\n for (let i = 0; i < pts.length; i += 4) {\n const pt = pts[i];\n drawSakuraBlossom(\n ctx,\n pt.x + Math.sin(sIdx + i) * 8 * scale,\n pt.y + Math.cos(sIdx + i) * 8 * scale,\n (6.5 + (i % 3) * 2) * scale,\n (sIdx + i) * 0.7,\n '#C8232C',\n '#FFF5F5',\n '#141413',\n 0.78,\n seed + 1400 + sIdx * 31 + i\n );\n }\n });\n\n // Indicador visual tátil enquanto o dedo/cursor desliza pela tela\n if (lastPointerPosRef.current.active && activeStrokeRef.current) {\n ctx.beginPath();\n ctx.arc(\n lastPointerPosRef.current.x,\n lastPointerPosRef.current.y,\n 24 * scale,\n 0,\n Math.PI * 2\n );\n ctx.strokeStyle = 'rgba(200, 35, 44, 0.55)';\n ctx.lineWidth = 1.75;\n ctx.stroke();\n }\n }\n\n if (showLiveInkAccents && !maskOnlyPreview && prog > 0.15) {\n const rand = createSeededRandom(seed + 777);\n const livePetals = 14;\n for (let p = 0; p < livePetals; p++) {\n const bx = rand() * w * 0.72;\n const by = rand() * h * 0.78;\n const speed = 16 + rand() * 22;\n const px =\n (bx + elapsed * speed * 1.2 + Math.sin(elapsed * 1.5 + p) * 16 * scale) % (w * 0.96);\n const py =\n (by + elapsed * speed * 0.55 + Math.cos(elapsed * 1.2 + p) * 12 * scale) % (h * 0.9);\n\n if (p % 5 === 0) {\n drawSakuraBlossom(\n ctx,\n px,\n py,\n (6.5 + (p % 3) * 2) * scale,\n elapsed * 0.9 + p,\n '#C8232C',\n '#FFF5F5',\n '#141413',\n 0.85 * Math.min(1, (prog - 0.15) * 2),\n seed + p * 31\n );\n } else {\n drawFloatingSakuraPetal(\n ctx,\n px,\n py,\n (5 + (p % 4) * 2) * scale,\n elapsed * 1.8 + p,\n 0.4 + 0.55 * Math.abs(Math.sin(elapsed * 2.2 + p)),\n '#C8232C',\n 0.88 * Math.min(1, (prog - 0.15) * 2)\n );\n }\n }\n }\n\n ctx.restore();\n\n const needsMoreFrames =\n prog < 1 ||\n (showLiveInkAccents && !maskOnlyPreview) ||\n activeStrokeRef.current !== null;\n if (needsMoreFrames) {\n animId = requestAnimationFrame(renderFrame);\n }\n };\n\n animId = requestAnimationFrame(renderFrame);\n return () => {\n cancelAnimationFrame(animId);\n ro.disconnect();\n };\n }, [\n imageLoaded,\n imageError,\n choreography,\n manualScratchMode,\n duration,\n bristleCount,\n dryBrushGap,\n seed,\n showLiveInkAccents,\n maskOnlyPreview,\n controlledProgress,\n replayTrigger,\n ]);\n\n const triggerManualRedraw = () => {\n strokeVersionRef.current++;\n };\n\n const handlePointerDown = (e: React.PointerEvent<HTMLCanvasElement>) => {\n if (!interactiveBrush) return;\n try {\n e.currentTarget.setPointerCapture(e.pointerId);\n } catch {\n // Ignora caso o dispositivo não suporte pointer capture\n }\n const rect = e.currentTarget.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n const pressure = e.pressure > 0 && e.pressure !== 0.5 ? e.pressure : 0.82;\n lastPointerPosRef.current = { x, y, active: true };\n activeStrokeRef.current = [{ x, y, pressure }];\n triggerManualRedraw();\n };\n\n const handlePointerMove = (e: React.PointerEvent<HTMLCanvasElement>) => {\n if (!interactiveBrush || !activeStrokeRef.current) return;\n const rect = e.currentTarget.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n lastPointerPosRef.current = { x, y, active: true };\n const prev = activeStrokeRef.current[activeStrokeRef.current.length - 1];\n const dist = prev ? Math.hypot(x - prev.x, y - prev.y) : 0;\n if (dist < 3) return;\n const velocityPressure = Math.max(0.35, Math.min(1, 1 - dist / 68));\n const pressure = e.pressure > 0 && e.pressure !== 0.5 ? e.pressure : velocityPressure;\n activeStrokeRef.current.push({ x, y, pressure });\n triggerManualRedraw();\n };\n\n const handlePointerUp = () => {\n lastPointerPosRef.current.active = false;\n if (activeStrokeRef.current && activeStrokeRef.current.length >= 1) {\n const pts = activeStrokeRef.current;\n // Se foi um toque rápido de 1 ponto no celular, sintetiza um golpe caligráfico completo\n if (pts.length === 1) {\n const p = pts[0];\n userStrokesRef.current.push([\n { x: p.x - 26, y: p.y + 10, pressure: 0.85 },\n { x: p.x, y: p.y, pressure: 0.95 },\n { x: p.x + 28, y: p.y - 10, pressure: 0.78 },\n ]);\n } else {\n userStrokesRef.current.push(pts);\n }\n setUserStrokeCount(userStrokesRef.current.length);\n }\n activeStrokeRef.current = null;\n triggerManualRedraw();\n };\n\n const handleStartScratchPaint = (e: React.MouseEvent) => {\n e.stopPropagation();\n userStrokesRef.current = [];\n setUserStrokeCount(0);\n setManualScratchMode(true);\n triggerManualRedraw();\n };\n\n const handleReplayFull = (e: React.MouseEvent) => {\n e.stopPropagation();\n userStrokesRef.current = [];\n setUserStrokeCount(0);\n setManualScratchMode(false);\n startTimeRef.current = performance.now();\n triggerManualRedraw();\n };\n\n return (\n <div\n className={`relative w-full h-full overflow-hidden select-none ${className}`}\n aria-label={alt}\n >\n <canvas\n ref={displayCanvasRef}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n style={{ touchAction: interactiveBrush ? 'none' : 'auto' }}\n className={`block w-full h-full ${\n interactiveBrush ? 'cursor-crosshair touch-none' : ''\n }`}\n />\n\n {interactiveBrush && showTouchControls && (\n <div className=\"absolute bottom-2.5 left-2.5 right-2.5 flex flex-wrap items-center justify-between gap-1.5 pointer-events-none z-10\">\n <div className=\"inline-flex items-center gap-1.5 px-2.5 py-1 rounded-md bg-[#F8F4EC]/90 backdrop-blur-md border border-[#11100E]/20 text-[11px] font-medium text-[#11100E] shadow-xs\">\n <span className=\"w-2 h-2 rounded-full bg-[#C8232C] shrink-0\" />\n <span>\n {manualScratchMode\n ? userStrokeCount === 0\n ? 'Arraste o dedo ou toque na tela para revelar a pintura'\n : `${userStrokeCount} ${userStrokeCount === 1 ? 'pincelada aplicada' : 'pinceladas aplicadas'}`\n : 'Toque ou arraste na tela para pintar'}\n </span>\n </div>\n\n <div className=\"flex items-center gap-1.5 pointer-events-auto\">\n <button\n type=\"button\"\n onClick={handleStartScratchPaint}\n className={`px-2.5 py-1 rounded-[3px] text-[11px] font-medium border transition-colors cursor-pointer ${\n manualScratchMode\n ? 'bg-[#C8232C] text-[#FAF7F0] border-[#11100E]'\n : 'bg-[#F8F4EC]/92 text-[#11100E] border-[#11100E]/60 hover:bg-[#11100E] hover:text-[#FAF7F0]'\n }`}\n >\n {manualScratchMode ? 'Limpar & Pintar do Zero' : 'Pintar do Zero (Toque)'}\n </button>\n\n {manualScratchMode && (\n <button\n type=\"button\"\n onClick={handleReplayFull}\n className=\"px-2.5 py-1 rounded-[3px] text-[11px] font-medium bg-[#11100E] text-[#FAF7F0] border border-[#11100E] hover:bg-[#272420] transition-colors cursor-pointer\"\n >\n Auto-Revelar\n </button>\n )}\n </div>\n </div>\n )}\n </div>\n );\n};\n","import React, { useEffect, useRef } from 'react';\nimport rough from 'roughjs';\nimport {\n createSeededRandom,\n fbmNoise2D,\n mixHex,\n rgbaStr,\n sampleCubicCurve,\n samplePolarArc,\n sampleQuadraticCurve,\n} from '../math';\nimport { DEFAULT_FUJI_LAYERS, DEFAULT_VFX_CONFIG } from '../presets';\nimport {\n drawFloatingSakuraPetal,\n drawSakuraBlossom,\n drawSumiKasureRibbon,\n drawTarashikomiWashBlob,\n drawUkiyoeCloudScrollVolute,\n} from '../techniques';\nimport { SumiColors, SumiLayerIntensities } from '../types';\n\nexport interface SumiLandscapeProps {\n /** Progresso de pintura animada (0.0 a 1.0). Se omitido, anima automaticamente ao montar */\n revealProgress?: number;\n /** Referência mutável opcional para atualizar o progresso sem re-renderizar o React */\n revealProgressRef?: React.MutableRefObject<number | undefined>;\n /** Controle granular de intensidade de cada camada artística (0.0 a 1.5) */\n layers?: Partial<SumiLayerIntensities>;\n /** Paleta cromática (padrão: Monte Fuji & Sakura Carmesim da referência) */\n colors?: Partial<SumiColors>;\n /** Semente determinística Mulberry32 */\n seed?: number;\n /** Se verdadeiro, anima continuamente pétalas de Sakura ao vento e reflexos solares na água */\n animated?: boolean;\n /** Velocidade da brisa das pétalas e água */\n windSpeed?: number;\n /** Classe CSS adicional */\n className?: string;\n /** Callback ao mover o cursor na cena para paralaxe sutil */\n interactive?: boolean;\n}\n\ninterface BlossomNode {\n bx: number;\n by: number;\n radius: number;\n angle: number;\n stainStart: number;\n seed: number;\n}\n\n/**\n * Componente <SumiLandscape />\n * Recria de forma 100% procedural, responsiva e animada a obra japonesa do Monte Fuji,\n * Sol Vermelho, Galho de Sakura e Ilha de Pinheiros.\n *\n * Abertura em 3 atos fluidos a 60/120 FPS (sem engasgos):\n * 1. O Sol Vermelho surge e se espalha como uma mancha de tinta úmida (Tarashikomi) no papel Washi.\n * 2. Os traços de nanquim do Galho de Sakura, do Monte Fuji e da Ilha de Pinheiros deslizam pela tela.\n * 3. Após o traço do galho estar pintado, as flores de Sakura brotam como manchas de aquarela carmesim.\n */\nexport const SumiLandscape: React.FC<SumiLandscapeProps> = ({\n revealProgress,\n revealProgressRef,\n layers: customLayers,\n colors: customColors,\n seed = 8472,\n animated = true,\n windSpeed = 1.0,\n className = '',\n interactive = true,\n}) => {\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const isVisibleRef = useRef<boolean>(true);\n const pointerRef = useRef<{\n x: number;\n y: number;\n smoothX: number;\n smoothY: number;\n active: boolean;\n }>({\n x: 0.5,\n y: 0.5,\n smoothX: 0.5,\n smoothY: 0.5,\n active: false,\n });\n const startTimeRef = useRef<number>(performance.now());\n\n const layers: SumiLayerIntensities = {\n ...DEFAULT_FUJI_LAYERS,\n ...customLayers,\n };\n\n const colors: SumiColors = {\n inkPrimary: customColors?.inkPrimary ?? '#141413',\n energySecondary: customColors?.energySecondary ?? '#C8232C',\n coreGlow: customColors?.coreGlow ?? '#FFF7F5',\n sporeAccent: customColors?.sporeAccent ?? '#4A5559',\n };\n\n useEffect(() => {\n startTimeRef.current = performance.now();\n }, [seed]);\n\n // Pausa automaticamente a animação quando o canvas sai da viewport\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas || typeof IntersectionObserver === 'undefined') return;\n const io = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n isVisibleRef.current = entry.isIntersecting;\n });\n },\n { threshold: 0.01 }\n );\n io.observe(canvas);\n return () => io.disconnect();\n }, []);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n // Canvases offscreen pré-renderizados uma única vez para animação 100% fluida sem engasgos\n const sunLayerCanvas = document.createElement('canvas');\n const mountainLayerCanvas = document.createElement('canvas');\n const branchLayerCanvas = document.createElement('canvas');\n const fullCompletedCanvas = document.createElement('canvas');\n const scratchCanvas = document.createElement('canvas');\n\n let blossomNodes: BlossomNode[] = [];\n let builtCacheKey = '';\n let animId = 0;\n let cachedRect = canvas.getBoundingClientRect();\n\n const ro = new ResizeObserver((entries) => {\n if (entries[0]) {\n cachedRect = entries[0].contentRect as DOMRect;\n builtCacheKey = '';\n }\n });\n ro.observe(canvas);\n\n /**\n * Pré-renderiza uma única vez as camadas de tinta (Sol, Montanha/Ilha, Galhos de Nanquim e Cena Final)\n * para que a animação de abertura rode a 60/120 FPS cravados apenas revelando e manchando o papel!\n */\n const buildLayerCaches = (w: number, h: number, dpr: number) => {\n const targetW = Math.floor(w * dpr);\n const targetH = Math.floor(h * dpr);\n\n [\n sunLayerCanvas,\n mountainLayerCanvas,\n branchLayerCanvas,\n fullCompletedCanvas,\n scratchCanvas,\n ].forEach((c) => {\n c.width = targetW;\n c.height = targetH;\n });\n\n const isCompact = w < 640;\n const scale = Math.min(w / (isCompact ? 720 : 1200), h / 700);\n\n // -----------------------------------------------------------------------\n // 1. Camada do Sol Vermelho (sunLayerCanvas)\n // -----------------------------------------------------------------------\n const sunCtx = sunLayerCanvas.getContext('2d');\n if (sunCtx && layers.sunIntensity > 0.02) {\n sunCtx.save();\n sunCtx.setTransform(dpr, 0, 0, dpr, 0, 0);\n sunCtx.clearRect(0, 0, w, h);\n\n const sunX = w * (isCompact ? 0.75 : 0.795);\n const sunY = h * (isCompact ? 0.23 : 0.275);\n const sunR =\n Math.min(w, h) * (isCompact ? 0.185 : 0.165) * Math.min(1.3, layers.sunIntensity);\n\n drawTarashikomiWashBlob(\n sunCtx,\n sunX,\n sunY,\n sunR * 1.08,\n sunR * 1.05,\n 0.15,\n colors.energySecondary,\n colors.energySecondary,\n 0.88 * Math.min(1, layers.sunIntensity),\n seed + 11\n );\n\n sunCtx.save();\n sunCtx.beginPath();\n sunCtx.arc(sunX, sunY, sunR * 0.94, 0, Math.PI * 2);\n sunCtx.fillStyle = rgbaStr(colors.energySecondary, 0.94 * Math.min(1, layers.sunIntensity));\n sunCtx.fill();\n sunCtx.restore();\n\n const sunRimSpine = samplePolarArc(\n sunX,\n sunY,\n sunR * 0.92,\n sunR * 0.92,\n -Math.PI * 0.85,\n Math.PI * 0.95,\n 0,\n 0,\n 64,\n 0.12,\n seed + 23\n );\n drawSumiKasureRibbon(sunCtx, {\n spine: sunRimSpine,\n maxWidth: sunR * 0.24,\n bristleCount: 16,\n dryBrushGap: 0.46,\n taperStart: 0.5,\n taperEnd: 0.92,\n color: colors.energySecondary,\n alpha: 0.95 * Math.min(1, layers.sunIntensity),\n headReach: 1,\n seed: seed + 29,\n });\n\n sunCtx.restore();\n }\n\n // -----------------------------------------------------------------------\n // 2. Camada do Monte Fuji, Névoa Kumo e Ilha de Pinheiros (mountainLayerCanvas)\n // -----------------------------------------------------------------------\n const mtCtx = mountainLayerCanvas.getContext('2d');\n if (mtCtx) {\n mtCtx.save();\n mtCtx.setTransform(dpr, 0, 0, dpr, 0, 0);\n mtCtx.clearRect(0, 0, w, h);\n\n if (layers.mountainIntensity > 0.02) {\n const peakX = w * (isCompact ? 0.68 : 0.735);\n const peakY = h * (isCompact ? 0.52 : 0.485);\n const peakHalfW = w * (isCompact ? 0.065 : 0.046);\n const baseLeftX = w * (isCompact ? 0.16 : 0.33);\n const baseRightX = w * 0.99;\n const baseY = h * 0.79;\n const mAlpha = Math.min(1, layers.mountainIntensity);\n\n mtCtx.save();\n mtCtx.beginPath();\n mtCtx.moveTo(baseLeftX, baseY);\n mtCtx.quadraticCurveTo(\n w * (isCompact ? 0.48 : 0.58),\n h * 0.68,\n peakX - peakHalfW,\n peakY + 4 * scale\n );\n mtCtx.lineTo(peakX - peakHalfW * 0.3, peakY);\n mtCtx.lineTo(peakX + peakHalfW * 0.45, peakY + 2 * scale);\n mtCtx.lineTo(peakX + peakHalfW, peakY + 6 * scale);\n mtCtx.quadraticCurveTo(w * 0.84, h * 0.65, baseRightX, baseY - 12 * scale);\n mtCtx.closePath();\n\n const fujiGrad = mtCtx.createLinearGradient(peakX, peakY, peakX, baseY);\n fujiGrad.addColorStop(0.0, rgbaStr(colors.inkPrimary, 0.92 * mAlpha));\n fujiGrad.addColorStop(\n 0.45,\n rgbaStr(mixHex(colors.inkPrimary, colors.sporeAccent, 0.45), 0.78 * mAlpha)\n );\n fujiGrad.addColorStop(0.85, rgbaStr(colors.sporeAccent, 0.32 * mAlpha));\n fujiGrad.addColorStop(1.0, rgbaStr(colors.sporeAccent, 0.0));\n mtCtx.fillStyle = fujiGrad;\n mtCtx.fill();\n mtCtx.restore();\n\n const leftSlopeSpine = sampleQuadraticCurve(\n { x: peakX - peakHalfW, y: peakY + 4 * scale },\n { x: w * (isCompact ? 0.48 : 0.58), y: h * 0.675 },\n { x: baseLeftX, y: baseY },\n 56,\n 0.18,\n seed + 103\n );\n drawSumiKasureRibbon(mtCtx, {\n spine: leftSlopeSpine,\n maxWidth: 16 * scale,\n bristleCount: 16,\n dryBrushGap: 0.38,\n taperStart: 0.4,\n taperEnd: 0.95,\n color: colors.inkPrimary,\n alpha: 0.88 * mAlpha,\n headReach: 1,\n seed: seed + 107,\n });\n\n const rightSlopeSpine = sampleQuadraticCurve(\n { x: peakX + peakHalfW, y: peakY + 5 * scale },\n { x: w * 0.84, y: h * 0.64 },\n { x: baseRightX, y: baseY - 15 * scale },\n 48,\n 0.18,\n seed + 109\n );\n drawSumiKasureRibbon(mtCtx, {\n spine: rightSlopeSpine,\n maxWidth: 14 * scale,\n bristleCount: 14,\n dryBrushGap: 0.42,\n taperStart: 0.4,\n taperEnd: 0.95,\n color: colors.inkPrimary,\n alpha: 0.85 * mAlpha,\n headReach: 1,\n seed: seed + 113,\n });\n\n const ridgeCount = 12;\n const randFuji = createSeededRandom(seed + 151);\n for (let r = 0; r < ridgeCount; r++) {\n const u = (r / (ridgeCount - 1)) * 2 - 1;\n const rx0 = peakX + u * peakHalfW * 0.92;\n const ry0 = peakY + Math.abs(u) * 6 * scale;\n const spreadX = peakX + u * w * (0.14 + randFuji() * 0.08);\n const spreadY = peakY + h * (0.11 + randFuji() * 0.09);\n\n const ridgeSpine = sampleQuadraticCurve(\n { x: rx0, y: ry0 },\n { x: (rx0 + spreadX) * 0.5, y: (ry0 + spreadY) * 0.5 + 6 * scale },\n { x: spreadX, y: spreadY },\n 32,\n 0.22,\n seed + r * 29\n );\n\n drawSumiKasureRibbon(mtCtx, {\n spine: ridgeSpine,\n maxWidth: (r % 2 === 0 ? 15 : 9) * scale,\n bristleCount: 9,\n dryBrushGap: 0.32,\n taperStart: 0.25,\n taperEnd: 0.92,\n color: r % 2 === 0 ? '#FAF8F5' : colors.inkPrimary,\n alpha: (r % 2 === 0 ? 0.95 : 0.78) * mAlpha,\n headReach: 1,\n roundHeadCap: false,\n seed: seed + r * 53,\n });\n }\n }\n\n const wAlpha = Math.min(1, layers.waterReflectionIntensity);\n const mistAlpha = Math.min(1, layers.mistKumoIntensity);\n\n if (mistAlpha > 0.02) {\n let rc: ReturnType<typeof rough.canvas> | null = null;\n try {\n rc = rough.canvas(mountainLayerCanvas);\n } catch {\n rc = null;\n }\n const kumoConfig = {\n ...DEFAULT_VFX_CONFIG,\n colors: {\n inkPrimary: mixHex(colors.sporeAccent, '#D6D1C7', 0.6),\n energySecondary: '#EFECE4',\n coreGlow: '#FAF8F4',\n sporeAccent: colors.sporeAccent,\n },\n };\n\n for (let k = 0; k < 4; k++) {\n const kx = w * (0.45 + k * 0.14);\n const ky = h * (0.75 + (k % 2) * 0.03);\n drawUkiyoeCloudScrollVolute(mtCtx, rc, kumoConfig, scale, {\n startX: kx - 75 * scale,\n startY: ky,\n endX: kx + 75 * scale,\n endY: ky - 8 * scale,\n maxThickness: 28 * scale * mistAlpha,\n lobeCount: 3,\n flip: k % 2 === 0 ? 1 : -1,\n alpha: 0.42 * mistAlpha,\n seed: seed + 300 + k * 37,\n });\n }\n }\n\n if (wAlpha > 0.02) {\n const islandY = h * 0.845;\n const islandSpine = sampleCubicCurve(\n { x: w * (isCompact ? 0.46 : 0.56), y: islandY + 6 * scale },\n { x: w * 0.68, y: islandY - 12 * scale },\n { x: w * 0.82, y: islandY - 22 * scale },\n { x: w * 0.95, y: islandY + 4 * scale },\n 44,\n 0.25,\n seed + 509\n );\n drawSumiKasureRibbon(mtCtx, {\n spine: islandSpine,\n maxWidth: 32 * scale,\n bristleCount: 20,\n dryBrushGap: 0.22,\n taperStart: 0.75,\n taperEnd: 0.65,\n color: colors.inkPrimary,\n alpha: 0.94 * wAlpha,\n headReach: 1,\n seed: seed + 521,\n });\n\n const pines = [\n { x: w * 0.61, y: islandY - 2 * scale, h: 24 * scale },\n { x: w * 0.65, y: islandY - 4 * scale, h: 30 * scale },\n { x: w * 0.71, y: islandY - 8 * scale, h: 46 * scale },\n { x: w * 0.755, y: islandY - 12 * scale, h: 64 * scale },\n { x: w * 0.805, y: islandY - 10 * scale, h: 52 * scale },\n ];\n pines.forEach((pine, idx) => {\n const trunkSpine = sampleQuadraticCurve(\n { x: pine.x, y: pine.y },\n { x: pine.x + (idx % 2 === 0 ? -3 : 3) * scale, y: pine.y - pine.h * 0.5 },\n { x: pine.x, y: pine.y - pine.h },\n 16,\n 0.15,\n seed + 600 + idx\n );\n drawSumiKasureRibbon(mtCtx, {\n spine: trunkSpine,\n maxWidth: 4.2 * scale,\n bristleCount: 5,\n dryBrushGap: 0.15,\n taperStart: 0.2,\n taperEnd: 0.7,\n color: colors.inkPrimary,\n alpha: 0.95 * wAlpha,\n seed: seed + 610 + idx,\n });\n\n for (let c = 0; c < 3; c++) {\n const cyCanopy = pine.y - pine.h * (0.45 + c * 0.26);\n const cw = pine.h * (0.48 - c * 0.08);\n const canopySpine = sampleQuadraticCurve(\n { x: pine.x - cw, y: cyCanopy + 2 * scale },\n { x: pine.x, y: cyCanopy - 4 * scale },\n { x: pine.x + cw, y: cyCanopy + 2 * scale },\n 18,\n 0.2,\n seed + 630 + idx * 10 + c\n );\n drawSumiKasureRibbon(mtCtx, {\n spine: canopySpine,\n maxWidth: 9 * scale,\n bristleCount: 7,\n dryBrushGap: 0.3,\n taperStart: 0.7,\n taperEnd: 0.7,\n color: colors.inkPrimary,\n alpha: 0.92 * wAlpha,\n seed: seed + 650 + idx * 10 + c,\n });\n }\n });\n }\n\n mtCtx.restore();\n }\n\n // -----------------------------------------------------------------------\n // 3. Camada dos Galhos de Nanquim (branchLayerCanvas) + Posições das Flores\n // -----------------------------------------------------------------------\n blossomNodes = [];\n const brCtx = branchLayerCanvas.getContext('2d');\n if (brCtx && layers.sakuraBranchIntensity > 0.02) {\n brCtx.save();\n brCtx.setTransform(dpr, 0, 0, dpr, 0, 0);\n brCtx.clearRect(0, 0, w, h);\n\n const bAlpha = Math.min(1, layers.sakuraBranchIntensity);\n\n // Tronco Mestre de Sakura saindo da esquerda e subindo ACIMA do topo da tela (y < 0)\n const mainTrunk = sampleCubicCurve(\n { x: -24 * scale, y: h * 0.68 },\n { x: w * 0.11, y: h * 0.44 },\n { x: w * 0.25, y: h * 0.18 },\n { x: w * 0.46, y: -h * 0.08 },\n 80,\n 0.28,\n seed + 701\n );\n drawSumiKasureRibbon(brCtx, {\n spine: mainTrunk,\n maxWidth: 44 * scale * Math.min(1.25, layers.sakuraBranchIntensity),\n bristleCount: 24,\n dryBrushGap: 0.28,\n taperStart: 0.1,\n taperEnd: 0.99,\n color: colors.inkPrimary,\n alpha: 0.96 * bAlpha,\n headReach: 1,\n roundHeadCap: true,\n seed: seed + 709,\n });\n\n const subBranches = [\n {\n p0: { x: w * 0.12, y: h * 0.45 },\n p1: { x: w * 0.28, y: h * 0.44 },\n p2: { x: w * 0.44, y: h * 0.61 },\n p3: { x: w * 0.58, y: h * 0.72 },\n width: 22 * scale,\n },\n {\n p0: { x: w * 0.34, y: h * 0.52 },\n p1: { x: w * 0.44, y: h * 0.55 },\n p2: { x: w * 0.52, y: h * 0.49 },\n p3: { x: w * 0.6, y: h * 0.43 },\n width: 10 * scale,\n },\n {\n p0: { x: w * 0.1, y: h * 0.44 },\n p1: { x: w * 0.13, y: h * 0.26 },\n p2: { x: w * 0.1, y: h * 0.1 },\n p3: { x: w * 0.05, y: -h * 0.07 },\n width: 15 * scale,\n },\n {\n p0: { x: w * 0.21, y: h * 0.31 },\n p1: { x: w * 0.33, y: h * 0.3 },\n p2: { x: w * 0.46, y: h * 0.22 },\n p3: { x: w * 0.58, y: h * 0.15 },\n width: 12 * scale,\n },\n {\n p0: { x: w * 0.09, y: h * 0.53 },\n p1: { x: w * 0.16, y: h * 0.62 },\n p2: { x: w * 0.22, y: h * 0.69 },\n p3: { x: w * 0.28, y: h * 0.75 },\n width: 9 * scale,\n },\n ];\n\n const allBranchSpines = [mainTrunk];\n subBranches.forEach((b, idx) => {\n const sp = sampleCubicCurve(b.p0, b.p1, b.p2, b.p3, 48, 0.24, seed + 750 + idx * 31);\n allBranchSpines.push(sp);\n drawSumiKasureRibbon(brCtx, {\n spine: sp,\n maxWidth: b.width * Math.min(1.25, layers.sakuraBranchIntensity),\n bristleCount: 14,\n dryBrushGap: 0.26,\n taperStart: 0.12,\n taperEnd: 0.99,\n color: colors.inkPrimary,\n alpha: 0.95 * bAlpha,\n headReach: 1,\n roundHeadCap: false,\n seed: seed + 760 + idx * 31,\n });\n });\n\n // Calcula os nós das flores de Sakura que surgirão como manchas APÓS o traço do galho\n if (layers.sakuraPetalsIntensity > 0.02) {\n const randBlossom = createSeededRandom(seed + 881);\n allBranchSpines.forEach((sp, sIdx) => {\n const clusterCount = sIdx === 0 ? 18 : 11;\n for (let c = 0; c < clusterCount; c++) {\n const tPos = 0.12 + (c / Math.max(1, clusterCount - 1)) * 0.87;\n const ptIdx = Math.min(sp.length - 1, Math.floor(tPos * (sp.length - 1)));\n const pt = sp[ptIdx];\n const tipTighten = 1 - tPos * 0.55;\n const offsetDist = (randBlossom() - 0.45) * 26 * scale * tipTighten;\n const bx = pt.x + pt.nx * offsetDist;\n const by = pt.y + pt.ny * offsetDist;\n const radius =\n (8.5 + randBlossom() * 10.5) *\n scale *\n Math.min(1.25, layers.sakuraPetalsIntensity);\n\n // Cada flor surge entre progress = 0.50 e 0.86 (após o traço do galho já estar pintado!)\n const stainStart = 0.48 + tPos * 0.26 + (sIdx * 0.025) + randBlossom() * 0.05;\n blossomNodes.push({\n bx,\n by,\n radius,\n angle: c * 0.7 + sIdx * 1.3,\n stainStart: Math.min(0.84, stainStart),\n seed: seed + 900 + sIdx * 100 + c,\n });\n }\n });\n }\n\n brCtx.restore();\n }\n\n // -----------------------------------------------------------------------\n // 4. Cena Estática Completa (fullCompletedCanvas) para uso imediato após progress >= 1\n // -----------------------------------------------------------------------\n const fullCtx = fullCompletedCanvas.getContext('2d');\n if (fullCtx) {\n fullCtx.save();\n fullCtx.setTransform(1, 0, 0, 1, 0, 0);\n fullCtx.clearRect(0, 0, targetW, targetH);\n fullCtx.drawImage(sunLayerCanvas, 0, 0);\n fullCtx.drawImage(mountainLayerCanvas, 0, 0);\n fullCtx.drawImage(branchLayerCanvas, 0, 0);\n\n fullCtx.setTransform(dpr, 0, 0, dpr, 0, 0);\n const pAlpha = Math.min(1, layers.sakuraPetalsIntensity);\n blossomNodes.forEach((node) => {\n // Leve auréola de mancha aquarelada sob cada flor\n const grad = fullCtx.createRadialGradient(\n node.bx,\n node.by,\n 0,\n node.bx,\n node.by,\n node.radius * 1.45\n );\n grad.addColorStop(0, rgbaStr(colors.energySecondary, 0.22 * pAlpha));\n grad.addColorStop(0.65, rgbaStr(colors.energySecondary, 0.08 * pAlpha));\n grad.addColorStop(1, rgbaStr(colors.energySecondary, 0));\n fullCtx.fillStyle = grad;\n fullCtx.beginPath();\n fullCtx.arc(node.bx, node.by, node.radius * 1.45, 0, Math.PI * 2);\n fullCtx.fill();\n\n drawSakuraBlossom(\n fullCtx,\n node.bx,\n node.by,\n node.radius,\n node.angle,\n colors.energySecondary,\n colors.coreGlow,\n colors.inkPrimary,\n 0.95 * pAlpha,\n node.seed\n );\n });\n fullCtx.restore();\n }\n };\n\n const renderScene = (now: number) => {\n if (!isVisibleRef.current && revealProgress === 1) {\n if (animated) animId = requestAnimationFrame(renderScene);\n return;\n }\n\n const dpr = Math.min(1.75, window.devicePixelRatio || 1);\n const w = Math.max(300, Math.floor(cachedRect.width || canvas.clientWidth || 800));\n const h = Math.max(220, Math.floor(cachedRect.height || canvas.clientHeight || 500));\n\n const targetW = Math.floor(w * dpr);\n const targetH = Math.floor(h * dpr);\n if (canvas.width !== targetW || canvas.height !== targetH) {\n canvas.width = targetW;\n canvas.height = targetH;\n builtCacheKey = '';\n }\n\n const cacheKey = `${targetW}x${targetH}:${seed}:${layers.sunIntensity}:${layers.mountainIntensity}:${layers.sakuraBranchIntensity}:${layers.sakuraPetalsIntensity}:${layers.waterReflectionIntensity}:${layers.mistKumoIntensity}:${colors.inkPrimary}:${colors.energySecondary}`;\n if (builtCacheKey !== cacheKey) {\n buildLayerCaches(w, h, dpr);\n builtCacheKey = cacheKey;\n }\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const elapsedSec = (now - startTimeRef.current) / 1000;\n const autoReveal = Math.min(1, elapsedSec / 2.4);\n const rawProgress =\n revealProgressRef?.current !== undefined\n ? revealProgressRef.current\n : revealProgress !== undefined\n ? revealProgress\n : autoReveal;\n const progress = Math.max(0, Math.min(1, rawProgress));\n const time = animated ? elapsedSec * windSpeed : 1.5;\n\n // Suaviza o movimento do ponteiro\n const ptr = pointerRef.current;\n const targetPtrX = ptr.active ? ptr.x : 0.5;\n const targetPtrY = ptr.active ? ptr.y : 0.5;\n ptr.smoothX += (targetPtrX - ptr.smoothX) * 0.08;\n ptr.smoothY += (targetPtrY - ptr.smoothY) * 0.08;\n\n const isCompact = w < 640;\n const scale = Math.min(w / (isCompact ? 720 : 1200), h / 700);\n const ptrOffsetX = (ptr.smoothX - 0.5) * 14 * scale;\n const ptrOffsetY = (ptr.smoothY - 0.5) * 8 * scale;\n\n ctx.save();\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, w, h);\n\n if (progress >= 0.998) {\n // =====================================================================\n // CENA COMPLETA EM CACHE (< 0.1ms por frame, 120 FPS cravados!)\n // =====================================================================\n ctx.drawImage(fullCompletedCanvas, ptrOffsetX * 0.35, ptrOffsetY * 0.3, w, h);\n } else {\n // =====================================================================\n // CERIMÔNIA DE ABERTURA EM 3 ATOS ULTRA-FLUIDOS (ZERO ENGASGOS)\n // =====================================================================\n const sunX = w * (isCompact ? 0.75 : 0.795) + ptrOffsetX * 0.35;\n const sunY = h * (isCompact ? 0.23 : 0.275) + ptrOffsetY * 0.25;\n const sunR =\n Math.min(w, h) * (isCompact ? 0.185 : 0.165) * Math.min(1.3, layers.sunIntensity);\n\n // ATO 1 (0.00 -> 0.45): O Sol Vermelho surge como uma mancha de tinta úmida (Tarashikomi)\n const sunStainP = Math.max(0, Math.min(1, progress / 0.44));\n if (layers.sunIntensity > 0.02 && sunStainP > 0.005) {\n const easeSun = 1 - Math.pow(1 - sunStainP, 3);\n\n // Mancha de aquarela carmesim se espalhando organicamente no papel Washi\n const bleedR = sunR * (0.35 + easeSun * 0.95);\n const stainGrad = ctx.createRadialGradient(\n sunX,\n sunY,\n bleedR * 0.08,\n sunX,\n sunY,\n bleedR\n );\n stainGrad.addColorStop(0, rgbaStr(colors.energySecondary, 0.85 * easeSun));\n stainGrad.addColorStop(0.65, rgbaStr(colors.energySecondary, 0.55 * easeSun));\n stainGrad.addColorStop(0.88, rgbaStr(colors.energySecondary, 0.24 * easeSun));\n stainGrad.addColorStop(1, rgbaStr(colors.energySecondary, 0));\n\n ctx.save();\n ctx.fillStyle = stainGrad;\n ctx.beginPath();\n ctx.arc(sunX, sunY, bleedR, 0, Math.PI * 2);\n ctx.fill();\n\n // Revela suavemente a textura final do Sol sobre a mancha úmida\n ctx.globalAlpha = Math.pow(sunStainP, 1.4);\n ctx.drawImage(sunLayerCanvas, ptrOffsetX * 0.35, ptrOffsetY * 0.3, w, h);\n ctx.restore();\n }\n\n // ATO 2A (0.10 -> 0.62): Monte Fuji e Ilha de Pinheiros surgem em aguada Sumi-e\n const mtStrokeP = Math.max(0, Math.min(1, (progress - 0.1) / 0.52));\n if (mtStrokeP > 0.005) {\n const scCtx = scratchCanvas.getContext('2d');\n if (scCtx) {\n scCtx.save();\n scCtx.setTransform(1, 0, 0, 1, 0, 0);\n scCtx.clearRect(0, 0, targetW, targetH);\n scCtx.drawImage(mountainLayerCanvas, 0, 0);\n\n scCtx.setTransform(dpr, 0, 0, dpr, 0, 0);\n scCtx.globalCompositeOperation = 'destination-in';\n const easeMt = 1 - Math.pow(1 - mtStrokeP, 2.5);\n const maskX = w * 0.72;\n const maskY = h * 0.65;\n const maskR = Math.hypot(w * 0.75, h * 0.6) * easeMt;\n const mGrad = scCtx.createRadialGradient(maskX, maskY, maskR * 0.2, maskX, maskY, Math.max(10, maskR));\n mGrad.addColorStop(0, 'rgba(0,0,0,1)');\n mGrad.addColorStop(0.82, 'rgba(0,0,0,0.92)');\n mGrad.addColorStop(1, 'rgba(0,0,0,0)');\n scCtx.fillStyle = mGrad;\n scCtx.fillRect(0, 0, w, h);\n scCtx.restore();\n\n ctx.drawImage(scratchCanvas, ptrOffsetX * 0.35, ptrOffsetY * 0.3, w, h);\n }\n }\n\n // ATO 2B (0.08 -> 0.54): O Traço de Nanquim do Galho de Sakura desliza da esquerda para as pontas\n const branchStrokeP = Math.max(0, Math.min(1, (progress - 0.08) / 0.46));\n if (layers.sakuraBranchIntensity > 0.02 && branchStrokeP > 0.005) {\n const scCtx = scratchCanvas.getContext('2d');\n if (scCtx) {\n scCtx.save();\n scCtx.setTransform(1, 0, 0, 1, 0, 0);\n scCtx.clearRect(0, 0, targetW, targetH);\n scCtx.drawImage(branchLayerCanvas, 0, 0);\n\n // Máscara de pincelada contínua partindo da base esquerda do tronco (-20, h*0.68) até as pontas\n scCtx.setTransform(dpr, 0, 0, dpr, 0, 0);\n scCtx.globalCompositeOperation = 'destination-in';\n const easeBr = 1 - Math.pow(1 - branchStrokeP, 2.2);\n const maxSpan = Math.hypot(w * 0.68, h * 0.85) * 1.12;\n const currR = Math.max(12, maxSpan * easeBr);\n const originX = 0;\n const originY = h * 0.64;\n const brGrad = scCtx.createRadialGradient(\n originX,\n originY,\n currR * 0.55,\n originX,\n originY,\n currR\n );\n brGrad.addColorStop(0, 'rgba(0,0,0,1)');\n brGrad.addColorStop(0.85, 'rgba(0,0,0,1)');\n brGrad.addColorStop(1, 'rgba(0,0,0,0)');\n scCtx.fillStyle = brGrad;\n scCtx.fillRect(0, 0, w, h);\n scCtx.restore();\n\n ctx.drawImage(scratchCanvas, ptrOffsetX * 0.35, ptrOffsetY * 0.3, w, h);\n }\n }\n\n // ATO 3 (0.48 -> 1.00): As Flores de Sakura surgem como manchas de aquarela APÓS o traço do galho!\n if (layers.sakuraPetalsIntensity > 0.02 && progress > 0.48) {\n const pAlpha = Math.min(1, layers.sakuraPetalsIntensity);\n ctx.save();\n ctx.translate(ptrOffsetX * 0.35, ptrOffsetY * 0.3);\n\n for (let i = 0; i < blossomNodes.length; i++) {\n const node = blossomNodes[i];\n const localP = (progress - node.stainStart) / 0.16;\n if (localP <= 0.01) continue;\n const clampedP = Math.min(1, localP);\n const easeStain = 1 - Math.pow(1 - clampedP, 3);\n\n // 1. Mancha úmida de tinta carmesim (Tarashikomi) que brota primeiro no galho pintado\n const stainRad = node.radius * (0.4 + easeStain * 1.25);\n const stainAlpha =\n clampedP < 0.5\n ? (clampedP / 0.5) * 0.42 * pAlpha\n : (0.42 - ((clampedP - 0.5) / 0.5) * 0.2) * pAlpha;\n\n const sGrad = ctx.createRadialGradient(\n node.bx,\n node.by,\n 0,\n node.bx,\n node.by,\n stainRad\n );\n sGrad.addColorStop(0, rgbaStr(colors.energySecondary, stainAlpha * 1.3));\n sGrad.addColorStop(0.6, rgbaStr(colors.energySecondary, stainAlpha * 0.7));\n sGrad.addColorStop(1, rgbaStr(colors.energySecondary, 0));\n ctx.fillStyle = sGrad;\n ctx.beginPath();\n ctx.arc(node.bx, node.by, stainRad, 0, Math.PI * 2);\n ctx.fill();\n\n // 2. A flor de Sakura se forma de dentro da mancha carmesim\n if (clampedP > 0.18) {\n const petalP = Math.min(1, (clampedP - 0.18) / 0.82);\n const easePetal = 1 - Math.pow(1 - petalP, 2.5);\n drawSakuraBlossom(\n ctx,\n node.bx,\n node.by,\n node.radius * (0.45 + easePetal * 0.55),\n node.angle,\n colors.energySecondary,\n colors.coreGlow,\n colors.inkPrimary,\n 0.95 * pAlpha * easePetal,\n node.seed\n );\n }\n }\n\n ctx.restore();\n }\n }\n\n // =======================================================================\n // ELEMENTOS DINÂMICOS LEVES (Reflexos do Sol, Água e Pétalas ao Vento)\n // =======================================================================\n const sunProg = Math.max(0, Math.min(1, progress * 1.6));\n if (layers.sunIntensity > 0.02 && sunProg > 0.2) {\n const sunX = w * (isCompact ? 0.75 : 0.795) + ptrOffsetX * 0.35;\n const sunY = h * (isCompact ? 0.23 : 0.275) + ptrOffsetY * 0.25;\n const sunR =\n Math.min(w, h) *\n (isCompact ? 0.185 : 0.165) *\n Math.pow(sunProg, 0.45) *\n Math.min(1.3, layers.sunIntensity);\n\n const streakCount = 7;\n const randSun = createSeededRandom(seed + 47);\n for (let s = 0; s < streakCount; s++) {\n const sy = sunY + sunR * (0.58 + (s / streakCount) * 0.72);\n const halfSpan =\n sunR * (1.12 - Math.abs(s - 2.5) * 0.12 + Math.sin(time * 1.5 + s) * 0.04);\n const offsetX = (randSun() - 0.35) * sunR * 0.45;\n const streakSpine = sampleQuadraticCurve(\n { x: sunX - halfSpan + offsetX, y: sy },\n { x: sunX + offsetX, y: sy + (randSun() - 0.5) * 2 },\n { x: sunX + halfSpan + offsetX, y: sy },\n 18,\n 0.05,\n seed + s * 19\n );\n drawSumiKasureRibbon(ctx, {\n spine: streakSpine,\n maxWidth: Math.max(2.2, (5.8 - s * 0.4) * scale),\n bristleCount: 5,\n dryBrushGap: 0.48,\n taperStart: 0.85,\n taperEnd: 0.85,\n color: colors.energySecondary,\n alpha: (0.8 - s * 0.06) * Math.min(1, layers.sunIntensity) * sunProg,\n headReach: sunProg,\n roundHeadCap: false,\n seed: seed + s * 41,\n });\n }\n }\n\n const waterProg = Math.max(0, Math.min(1, (progress - 0.2) * 1.4));\n if (layers.waterReflectionIntensity > 0.02 && waterProg > 0.15) {\n const wAlpha = Math.min(1, layers.waterReflectionIntensity);\n const waterLines = 9;\n const randWater = createSeededRandom(seed + 401);\n for (let wl = 0; wl < waterLines; wl++) {\n const wy = h * (0.81 + (wl / waterLines) * 0.16);\n const wxCenter =\n w * (0.28 + randWater() * 0.62) + Math.sin(time * 0.9 + wl) * 8 * scale;\n const wSpan = w * (0.08 + randWater() * 0.16);\n const waterSpine = sampleQuadraticCurve(\n { x: wxCenter - wSpan, y: wy },\n { x: wxCenter, y: wy + Math.sin(time + wl) * 1.5 },\n { x: wxCenter + wSpan, y: wy },\n 18,\n 0.06,\n seed + wl * 23\n );\n drawSumiKasureRibbon(ctx, {\n spine: waterSpine,\n maxWidth: (4.0 + (wl % 3) * 2.0) * scale,\n bristleCount: 5,\n dryBrushGap: 0.52,\n taperStart: 0.85,\n taperEnd: 0.85,\n color: wl % 3 === 0 ? colors.inkPrimary : colors.sporeAccent,\n alpha: (0.22 + (wl % 3) * 0.11) * wAlpha * waterProg,\n headReach: waterProg,\n roundHeadCap: false,\n seed: seed + wl * 61,\n });\n }\n }\n\n // Pétalas de Sakura flutuando ao vento (surgem após as flores brotarem)\n if (layers.sakuraPetalsIntensity > 0.05 && progress > 0.62) {\n const petalFade = Math.min(1, (progress - 0.62) / 0.3);\n const randPetal = createSeededRandom(seed + 1201);\n const floatingCount = Math.round(\n (isCompact ? 14 : 22) * Math.min(1.4, layers.sakuraPetalsIntensity)\n );\n for (let p = 0; p < floatingCount; p++) {\n const baseX = randPetal() * w * 0.75;\n const baseY = randPetal() * h * 0.82;\n const speed = 18 + randPetal() * 24;\n const driftX =\n (baseX + time * speed * 1.35 + Math.sin(time * 1.5 + p) * 20 * scale) % (w * 0.95);\n const driftY =\n (baseY + time * speed * 0.65 + Math.cos(time * 1.1 + p) * 12 * scale) % (h * 0.88);\n const windNoise = fbmNoise2D(driftX * 0.005, driftY * 0.005, seed + p);\n\n drawFloatingSakuraPetal(\n ctx,\n driftX,\n driftY,\n (5.5 + (p % 4) * 2.0) * scale,\n time * (1.2 + (p % 3) * 0.4) + windNoise * Math.PI,\n 0.35 + 0.6 * Math.abs(Math.sin(time * 2.1 + p)),\n colors.energySecondary,\n 0.88 * petalFade\n );\n }\n }\n\n ctx.restore();\n\n if (animated || (revealProgress === undefined && !revealProgressRef)) {\n animId = requestAnimationFrame(renderScene);\n }\n };\n\n animId = requestAnimationFrame(renderScene);\n return () => {\n cancelAnimationFrame(animId);\n ro.disconnect();\n };\n }, [\n revealProgress,\n revealProgressRef,\n layers.sunIntensity,\n layers.mountainIntensity,\n layers.sakuraBranchIntensity,\n layers.sakuraPetalsIntensity,\n layers.waterReflectionIntensity,\n layers.mistKumoIntensity,\n colors.inkPrimary,\n colors.energySecondary,\n colors.coreGlow,\n colors.sporeAccent,\n seed,\n animated,\n windSpeed,\n ]);\n\n const handlePointerMove = (e: React.PointerEvent<HTMLCanvasElement>) => {\n if (!interactive) return;\n const rect = e.currentTarget.getBoundingClientRect();\n pointerRef.current.x = (e.clientX - rect.left) / Math.max(1, rect.width);\n pointerRef.current.y = (e.clientY - rect.top) / Math.max(1, rect.height);\n pointerRef.current.active = true;\n };\n\n const handlePointerLeave = () => {\n pointerRef.current.active = false;\n };\n\n return (\n <canvas\n ref={canvasRef}\n onPointerMove={handlePointerMove}\n onPointerLeave={handlePointerLeave}\n className={`block w-full h-full select-none ${className}`}\n />\n );\n};\n","import React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { DEFAULT_VFX_CONFIG } from '../presets';\nimport { createSeededRandom, samplesToSpine } from '../math';\nimport {\n drawFlamePetalTongue,\n drawHokusaiWaveCrest,\n drawSakuraBlossom,\n drawSumiKasureRibbon,\n drawTarashikomiWashBlob,\n drawUkiyoeCloudScrollVolute,\n} from '../techniques';\nimport {\n BrushPointSample,\n InteractiveBrushType,\n RecordedBrushStroke,\n SumiColors,\n VFXConfig,\n} from '../types';\n\nexport interface SumiBrushCanvasProps {\n /** Tipo de pincel selecionado */\n activeBrush?: InteractiveBrushType;\n /** Paleta de cores atual */\n colors?: SumiColors;\n /** Multiplicador de espessura do pincel (0.4 a 2.5) */\n strokeThickness?: number;\n /** Quantidade de cerdas de bambu (6 a 40) */\n bristleCount?: number;\n /** Intensidade de falha de pincel seco Kasure (0.0 a 0.85) */\n dryBrushGap?: number;\n /** Camada onde os novos traços serão gravados */\n activeLayer?: 'background' | 'midground' | 'foreground';\n /** Opacidade individual de cada camada */\n layerOpacities?: {\n background: number;\n midground: number;\n foreground: number;\n };\n /** Exibe o guia translúcido da obra Monte Fuji & Sakura ao fundo */\n showReferenceGuide?: boolean;\n /** Callback de telemetria de pressão e velocidade em tempo real */\n onTelemetryChange?: (telemetry: {\n pressure: number;\n velocity: number;\n strokeCount: number;\n isReplaying: boolean;\n }) => void;\n /** Referência imperativa para ações externas (replay, limpar, desfazer, exportar PNG) */\n actionsRef?: React.MutableRefObject<{\n replayStrokes: () => void;\n undoStroke: () => void;\n clearCanvas: () => void;\n loadFujiPresetStrokes: () => void;\n exportPng: () => void;\n } | null>;\n className?: string;\n}\n\nconst DEFAULT_COLORS: SumiColors = {\n inkPrimary: '#141413',\n energySecondary: '#C8232C',\n coreGlow: '#FFF5F5',\n sporeAccent: '#4A4742',\n};\n\n/**\n * Traços iniciais responsivos inspirados na obra do Monte Fuji e Sakura\n * Adaptam-se proporcionalmente à largura (w) e altura (h) do canvas em celulares, tablets e desktops\n */\nfunction buildStarterFujiStrokes(\n colors: SumiColors,\n w = 880,\n h = 460\n): RecordedBrushStroke[] {\n const sx = (x: number) => (x / 880) * w;\n const sy = (y: number) => (y / 460) * h;\n const scale = Math.max(0.55, Math.min(w / 820, h / 440));\n\n return [\n {\n id: 'preset-sun-wash',\n brushType: 'tarashikomi_wash',\n layerId: 'background',\n colors: { ...colors },\n thickness: 3.4 * scale,\n bristleCount: 22,\n dryBrushGap: 0.2,\n seed: 1011,\n points: [\n { x: sx(640), y: sy(130), pressure: 0.9, velocity: 0.12, timestamp: 0 },\n { x: sx(690), y: sy(125), pressure: 0.95, velocity: 0.1, timestamp: 40 },\n { x: sx(740), y: sy(140), pressure: 0.9, velocity: 0.12, timestamp: 80 },\n ],\n },\n {\n id: 'preset-fuji-left',\n brushType: 'sumi_kasure',\n layerId: 'midground',\n colors: { ...colors },\n thickness: 1.15 * scale,\n bristleCount: 28,\n dryBrushGap: 0.35,\n seed: 2022,\n points: [\n { x: sx(625), y: sy(185), pressure: 0.85, velocity: 0.2, timestamp: 100 },\n { x: sx(540), y: sy(245), pressure: 0.72, velocity: 0.35, timestamp: 160 },\n { x: sx(440), y: sy(305), pressure: 0.55, velocity: 0.5, timestamp: 220 },\n { x: sx(330), y: sy(345), pressure: 0.3, velocity: 0.75, timestamp: 280 },\n ],\n },\n {\n id: 'preset-fuji-right',\n brushType: 'sumi_kasure',\n layerId: 'midground',\n colors: { ...colors },\n thickness: 1.1 * scale,\n bristleCount: 26,\n dryBrushGap: 0.38,\n seed: 3033,\n points: [\n { x: sx(648), y: sy(185), pressure: 0.85, velocity: 0.2, timestamp: 300 },\n { x: sx(720), y: sy(250), pressure: 0.68, velocity: 0.42, timestamp: 360 },\n { x: sx(815), y: sy(325), pressure: 0.4, velocity: 0.68, timestamp: 420 },\n ],\n },\n {\n id: 'preset-sakura-branch-main',\n brushType: 'sakura_branch',\n layerId: 'foreground',\n colors: { ...colors },\n thickness: 1.2 * scale,\n bristleCount: 24,\n dryBrushGap: 0.28,\n seed: 4044,\n points: [\n { x: sx(35), y: sy(330), pressure: 0.95, velocity: 0.15, timestamp: 450 },\n { x: sx(135), y: sy(240), pressure: 0.82, velocity: 0.28, timestamp: 520 },\n { x: sx(235), y: sy(165), pressure: 0.68, velocity: 0.38, timestamp: 590 },\n { x: sx(345), y: sy(115), pressure: 0.52, velocity: 0.52, timestamp: 660 },\n { x: sx(460), y: sy(78), pressure: 0.35, velocity: 0.7, timestamp: 730 },\n ],\n },\n {\n id: 'preset-sakura-branch-lower',\n brushType: 'sakura_branch',\n layerId: 'foreground',\n colors: { ...colors },\n thickness: 0.95 * scale,\n bristleCount: 20,\n dryBrushGap: 0.32,\n seed: 5055,\n points: [\n { x: sx(125), y: sy(245), pressure: 0.78, velocity: 0.24, timestamp: 760 },\n { x: sx(235), y: sy(255), pressure: 0.65, velocity: 0.36, timestamp: 820 },\n { x: sx(345), y: sy(285), pressure: 0.5, velocity: 0.48, timestamp: 880 },\n { x: sx(455), y: sy(315), pressure: 0.32, velocity: 0.65, timestamp: 940 },\n ],\n },\n ];\n}\n\n/**\n * Renderiza um único traço gravado até o alcance `headReach` (0.0 a 1.0)\n */\nfunction renderSingleRecordedStroke(\n ctx: CanvasRenderingContext2D,\n stroke: RecordedBrushStroke,\n headReach = 1.0\n) {\n if (stroke.points.length < 2 || headReach <= 0.01) return;\n\n const spine = samplesToSpine(stroke.points, 0.14, stroke.seed);\n const avgPressure =\n stroke.points.reduce((acc, pt) => acc + pt.pressure, 0) / stroke.points.length;\n const effectiveWidth = 32 * stroke.thickness * (0.45 + avgPressure * 0.85);\n const { inkPrimary, energySecondary, coreGlow, sporeAccent } = stroke.colors;\n\n const mockConfig: VFXConfig = {\n ...DEFAULT_VFX_CONFIG,\n colors: stroke.colors,\n seed: stroke.seed,\n };\n\n if (stroke.brushType === 'tarashikomi_wash') {\n const step = Math.max(1, Math.floor(spine.length / 7));\n const maxIdx = Math.max(1, Math.floor(spine.length * headReach));\n for (let i = 0; i < maxIdx; i += step) {\n const pt = spine[i];\n const ang = Math.atan2(-pt.nx, pt.ny);\n drawTarashikomiWashBlob(\n ctx,\n pt.x,\n pt.y,\n effectiveWidth * 0.95 * (0.6 + avgPressure * 0.6),\n effectiveWidth * 0.82 * (0.6 + avgPressure * 0.6),\n ang,\n energySecondary,\n inkPrimary,\n 0.52,\n stroke.seed + i * 19\n );\n }\n return;\n }\n\n if (stroke.brushType === 'sumi_kasure') {\n const midPt = spine[Math.floor(spine.length * 0.45)];\n const startAngle = Math.atan2(-spine[0].nx, spine[0].ny);\n drawTarashikomiWashBlob(\n ctx,\n midPt.x,\n midPt.y,\n effectiveWidth * 1.3,\n effectiveWidth * 0.7,\n startAngle,\n sporeAccent,\n inkPrimary,\n 0.16 * headReach,\n stroke.seed + 7\n );\n\n drawSumiKasureRibbon(ctx, {\n spine,\n maxWidth: effectiveWidth,\n bristleCount: stroke.bristleCount,\n dryBrushGap: stroke.dryBrushGap,\n taperStart: 0.22,\n taperEnd: 0.58,\n color: inkPrimary,\n alpha: 0.95,\n headReach,\n seed: stroke.seed,\n });\n return;\n }\n\n if (stroke.brushType === 'sakura_branch') {\n drawSumiKasureRibbon(ctx, {\n spine,\n maxWidth: effectiveWidth * 0.82,\n bristleCount: stroke.bristleCount,\n dryBrushGap: stroke.dryBrushGap * 0.9,\n taperStart: 0.15,\n taperEnd: 0.65,\n color: inkPrimary,\n alpha: 0.96,\n headReach,\n seed: stroke.seed,\n });\n\n const rand = createSeededRandom(stroke.seed + 333);\n const maxIdx = Math.floor(spine.length * headReach);\n for (let i = 2; i < maxIdx; i += 3) {\n if (rand() < 0.22) continue;\n const pt = spine[i];\n const offsetNorm = (rand() - 0.48) * effectiveWidth * 1.15;\n const bx = pt.x + pt.nx * offsetNorm;\n const by = pt.y + pt.ny * offsetNorm;\n const bRadius = (6.5 + rand() * 8.5) * (0.7 + avgPressure * 0.5);\n\n if (rand() > 0.55) {\n drawTarashikomiWashBlob(\n ctx,\n bx,\n by,\n bRadius * 1.45,\n bRadius * 1.35,\n rand() * Math.PI,\n energySecondary,\n inkPrimary,\n 0.24,\n stroke.seed + i * 41\n );\n }\n\n drawSakuraBlossom(\n ctx,\n bx,\n by,\n bRadius,\n rand() * Math.PI * 2,\n energySecondary,\n coreGlow,\n inkPrimary,\n 0.94,\n stroke.seed + i * 29\n );\n }\n return;\n }\n\n if (stroke.brushType === 'hokusai_wave') {\n const activeSpine = spine.slice(0, Math.max(6, Math.floor(spine.length * headReach)));\n drawHokusaiWaveCrest(\n ctx,\n null,\n activeSpine,\n effectiveWidth * 1.35,\n 1,\n 6,\n mockConfig,\n 1.0,\n 0.95,\n stroke.seed\n );\n return;\n }\n\n if (stroke.brushType === 'suibokuga_flame') {\n const p0 = spine[0];\n const p1 = spine[Math.floor(spine.length * 0.33 * headReach)] || p0;\n const p2 = spine[Math.floor(spine.length * 0.66 * headReach)] || p1;\n const p3 = spine[Math.max(1, Math.floor((spine.length - 1) * headReach))] || p2;\n drawFlamePetalTongue(ctx, null, mockConfig, 1.0, {\n rootX: p0.x,\n rootY: p0.y,\n ctrl1X: p1.x,\n ctrl1Y: p1.y,\n ctrl2X: p2.x,\n ctrl2Y: p2.y,\n tipX: p3.x,\n tipY: p3.y,\n maxBellyWidth: effectiveWidth * 1.4,\n striationCount: 5,\n alpha: 0.94,\n seed: stroke.seed,\n });\n return;\n }\n\n if (stroke.brushType === 'kumo_cloud') {\n const p0 = spine[0];\n const pEnd = spine[Math.max(1, Math.floor((spine.length - 1) * headReach))] || p0;\n drawUkiyoeCloudScrollVolute(ctx, null, mockConfig, 1.0, {\n startX: p0.x,\n startY: p0.y,\n endX: pEnd.x,\n endY: pEnd.y,\n maxThickness: effectiveWidth * 1.25,\n lobeCount: 3,\n alpha: 0.92,\n seed: stroke.seed,\n });\n }\n}\n\nexport const SumiBrushCanvas: React.FC<SumiBrushCanvasProps> = ({\n activeBrush = 'sakura_branch',\n colors = DEFAULT_COLORS,\n strokeThickness = 1.25,\n bristleCount = 26,\n dryBrushGap = 0.32,\n activeLayer = 'foreground',\n layerOpacities = { background: 1, midground: 1, foreground: 1 },\n showReferenceGuide = true,\n onTelemetryChange,\n actionsRef,\n className = '',\n}) => {\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const completedCacheCanvasRef = useRef<HTMLCanvasElement | null>(null);\n const completedCacheValidRef = useRef<boolean>(false);\n const refImageRef = useRef<HTMLImageElement | null>(null);\n const [refImageLoaded, setRefImageLoaded] = useState(false);\n\n const strokesRef = useRef<RecordedBrushStroke[]>([]);\n const starterInitializedRef = useRef<boolean>(false);\n const activeStrokeRef = useRef<RecordedBrushStroke | null>(null);\n const currentPointsRef = useRef<BrushPointSample[]>([]);\n const replayStateRef = useRef<{ active: boolean; startTime: number; duration: number }>({\n active: false,\n startTime: 0,\n duration: 2600,\n });\n\n useEffect(() => {\n const img = new Image();\n img.crossOrigin = 'anonymous';\n img.onload = () => {\n refImageRef.current = img;\n completedCacheValidRef.current = false;\n setRefImageLoaded(true);\n };\n img.src = '/assets/aistudio/image_8f7809d3.png';\n }, []);\n\n const invalidateCompletedCache = useCallback(() => {\n completedCacheValidRef.current = false;\n }, []);\n\n const renderBaseAndCompletedStrokes = useCallback(\n (targetCtx: CanvasRenderingContext2D, w: number, h: number, dpr: number) => {\n targetCtx.save();\n targetCtx.setTransform(dpr, 0, 0, dpr, 0, 0);\n targetCtx.clearRect(0, 0, w, h);\n\n // 1. Papel Washi fibras sutis\n targetCtx.fillStyle = '#F4F1EA';\n targetCtx.fillRect(0, 0, w, h);\n\n // 2. Guia translúcido da obra Monte Fuji & Sakura\n if (showReferenceGuide && refImageLoaded && refImageRef.current) {\n targetCtx.save();\n targetCtx.globalAlpha = 0.14;\n const img = refImageRef.current;\n const imgRatio = img.width / Math.max(1, img.height);\n const cRatio = w / h;\n let dw = w;\n let dh = h;\n let dx = 0;\n let dy = 0;\n if (cRatio > imgRatio) {\n dw = w;\n dh = w / imgRatio;\n dy = (h - dh) * 0.5;\n } else {\n dh = h;\n dw = h * imgRatio;\n dx = (w - dw) * 0.5;\n }\n targetCtx.drawImage(img, dx, dy, dw, dh);\n targetCtx.restore();\n }\n\n const layersOrder: ('background' | 'midground' | 'foreground')[] = [\n 'background',\n 'midground',\n 'foreground',\n ];\n\n layersOrder.forEach((layerName) => {\n const layerAlpha = layerOpacities[layerName] ?? 1;\n if (layerAlpha <= 0.01) return;\n\n targetCtx.save();\n targetCtx.globalAlpha = layerAlpha;\n\n strokesRef.current.forEach((st) => {\n if (st.layerId !== layerName) return;\n renderSingleRecordedStroke(targetCtx, st, 1.0);\n });\n\n targetCtx.restore();\n });\n\n targetCtx.restore();\n },\n [layerOpacities, refImageLoaded, showReferenceGuide]\n );\n\n const renderAll = useCallback(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const dpr = Math.min(1.75, window.devicePixelRatio || 1);\n const w = Math.max(240, canvas.clientWidth || 640);\n const h = Math.max(180, canvas.clientHeight || 420);\n\n // Inicializa os traços responsivos na primeira medição real do canvas\n if (!starterInitializedRef.current && w > 0 && h > 0) {\n strokesRef.current = buildStarterFujiStrokes(colors, w, h);\n starterInitializedRef.current = true;\n completedCacheValidRef.current = false;\n }\n\n if (canvas.width !== Math.floor(w * dpr) || canvas.height !== Math.floor(h * dpr)) {\n canvas.width = Math.floor(w * dpr);\n canvas.height = Math.floor(h * dpr);\n completedCacheValidRef.current = false;\n }\n\n if (!completedCacheCanvasRef.current) {\n completedCacheCanvasRef.current = document.createElement('canvas');\n }\n const cacheCanvas = completedCacheCanvasRef.current;\n if (cacheCanvas.width !== canvas.width || cacheCanvas.height !== canvas.height) {\n cacheCanvas.width = canvas.width;\n cacheCanvas.height = canvas.height;\n completedCacheValidRef.current = false;\n }\n\n const ctx = canvas.getContext('2d');\n const cacheCtx = cacheCanvas.getContext('2d');\n if (!ctx || !cacheCtx) return;\n\n const now = performance.now();\n const isReplaying = replayStateRef.current.active;\n const replayProg = isReplaying\n ? Math.min(1, (now - replayStateRef.current.startTime) / replayStateRef.current.duration)\n : 1;\n\n if (isReplaying) {\n ctx.save();\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, w, h);\n ctx.fillStyle = '#F4F1EA';\n ctx.fillRect(0, 0, w, h);\n\n const layersOrder: ('background' | 'midground' | 'foreground')[] = [\n 'background',\n 'midground',\n 'foreground',\n ];\n const totalStrokes = Math.max(1, strokesRef.current.length);\n\n layersOrder.forEach((layerName) => {\n const layerAlpha = layerOpacities[layerName] ?? 1;\n if (layerAlpha <= 0.01) return;\n ctx.save();\n ctx.globalAlpha = layerAlpha;\n\n strokesRef.current.forEach((st, idx) => {\n if (st.layerId !== layerName) return;\n const stStart = idx / totalStrokes;\n const stEnd = (idx + 1) / totalStrokes;\n const reach = Math.max(0, Math.min(1, (replayProg - stStart) / (stEnd - stStart)));\n renderSingleRecordedStroke(ctx, st, reach);\n });\n\n ctx.restore();\n });\n\n ctx.restore();\n return;\n }\n\n // Usa o cache offscreen para os traços já finalizados (mantém 60/120 FPS ao arrastar o dedo no mobile)\n if (!completedCacheValidRef.current) {\n renderBaseAndCompletedStrokes(cacheCtx, w, h, dpr);\n completedCacheValidRef.current = true;\n }\n\n ctx.save();\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, w, h);\n ctx.drawImage(cacheCanvas, 0, 0, w, h);\n\n if (activeStrokeRef.current) {\n const layerAlpha = layerOpacities[activeStrokeRef.current.layerId] ?? 1;\n ctx.globalAlpha = layerAlpha;\n renderSingleRecordedStroke(ctx, activeStrokeRef.current, 1.0);\n }\n\n ctx.restore();\n }, [colors, layerOpacities, renderBaseAndCompletedStrokes]);\n\n useEffect(() => {\n invalidateCompletedCache();\n renderAll();\n }, [\n invalidateCompletedCache,\n renderAll,\n layerOpacities,\n showReferenceGuide,\n refImageLoaded,\n ]);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const ro = new ResizeObserver(() => {\n invalidateCompletedCache();\n renderAll();\n });\n ro.observe(canvas);\n return () => ro.disconnect();\n }, [invalidateCompletedCache, renderAll]);\n\n const startReplay = useCallback(() => {\n replayStateRef.current = {\n active: true,\n startTime: performance.now(),\n duration: Math.max(1400, strokesRef.current.length * 420),\n };\n\n const step = () => {\n if (!replayStateRef.current.active) return;\n const elapsed = performance.now() - replayStateRef.current.startTime;\n renderAll();\n if (elapsed < replayStateRef.current.duration) {\n requestAnimationFrame(step);\n } else {\n replayStateRef.current.active = false;\n invalidateCompletedCache();\n renderAll();\n onTelemetryChange?.({\n pressure: 0,\n velocity: 0,\n strokeCount: strokesRef.current.length,\n isReplaying: false,\n });\n }\n };\n onTelemetryChange?.({\n pressure: 0.75,\n velocity: 0.5,\n strokeCount: strokesRef.current.length,\n isReplaying: true,\n });\n requestAnimationFrame(step);\n }, [invalidateCompletedCache, onTelemetryChange, renderAll]);\n\n useEffect(() => {\n if (!actionsRef) return;\n actionsRef.current = {\n replayStrokes: startReplay,\n undoStroke: () => {\n strokesRef.current = strokesRef.current.slice(0, -1);\n invalidateCompletedCache();\n renderAll();\n onTelemetryChange?.({\n pressure: 0,\n velocity: 0,\n strokeCount: strokesRef.current.length,\n isReplaying: false,\n });\n },\n clearCanvas: () => {\n strokesRef.current = [];\n invalidateCompletedCache();\n renderAll();\n onTelemetryChange?.({\n pressure: 0,\n velocity: 0,\n strokeCount: 0,\n isReplaying: false,\n });\n },\n loadFujiPresetStrokes: () => {\n const canvas = canvasRef.current;\n const w = Math.max(260, canvas?.clientWidth || 880);\n const h = Math.max(200, canvas?.clientHeight || 460);\n strokesRef.current = buildStarterFujiStrokes(colors, w, h);\n invalidateCompletedCache();\n startReplay();\n },\n exportPng: () => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const link = document.createElement('a');\n link.download = `sumi-forge-painting-${Date.now()}.png`;\n link.href = canvas.toDataURL('image/png');\n link.click();\n },\n };\n }, [actionsRef, colors, invalidateCompletedCache, onTelemetryChange, renderAll, startReplay]);\n\n const handlePointerDown = (e: React.PointerEvent<HTMLCanvasElement>) => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n try {\n canvas.setPointerCapture(e.pointerId);\n } catch {\n // Ignora em navegadores que não suportam pointer capture\n }\n const rect = canvas.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n const pressure = e.pressure > 0 && e.pressure !== 0.5 ? e.pressure : 0.72;\n const now = performance.now();\n\n currentPointsRef.current = [{ x, y, pressure, velocity: 0.15, timestamp: now }];\n activeStrokeRef.current = {\n id: `stroke-${Date.now()}`,\n brushType: activeBrush,\n layerId: activeLayer,\n colors: { ...colors },\n thickness: strokeThickness,\n bristleCount,\n dryBrushGap,\n seed: Math.floor(Math.random() * 90000) + 1000,\n points: currentPointsRef.current,\n };\n\n onTelemetryChange?.({\n pressure,\n velocity: 0.15,\n strokeCount: strokesRef.current.length + 1,\n isReplaying: false,\n });\n };\n\n const handlePointerMove = (e: React.PointerEvent<HTMLCanvasElement>) => {\n if (!activeStrokeRef.current || !canvasRef.current) return;\n const rect = canvasRef.current.getBoundingClientRect();\n const x = e.clientX - rect.left;\n const y = e.clientY - rect.top;\n const now = performance.now();\n\n const prev = currentPointsRef.current[currentPointsRef.current.length - 1];\n const dist = prev ? Math.hypot(x - prev.x, y - prev.y) : 0;\n if (dist < 3.0) return;\n\n const dt = Math.max(1, now - (prev?.timestamp || now - 16));\n const velocity = Math.min(1, dist / dt / 2.2);\n const simulatedPressure = Math.max(0.22, Math.min(1, 0.94 - velocity * 0.62));\n const hardwarePressure =\n e.pressure > 0 && e.pressure !== 0.5 ? e.pressure : simulatedPressure;\n\n currentPointsRef.current.push({\n x,\n y,\n pressure: hardwarePressure,\n velocity,\n timestamp: now,\n });\n activeStrokeRef.current.points = currentPointsRef.current;\n\n renderAll();\n onTelemetryChange?.({\n pressure: hardwarePressure,\n velocity,\n strokeCount: strokesRef.current.length + 1,\n isReplaying: false,\n });\n };\n\n const handlePointerUp = () => {\n if (!activeStrokeRef.current) return;\n // Suporte a toque simples no celular: se o usuário apenas tocou 1 ponto na tela,\n // sintetiza um gesto curto para estampar a flor de Sakura, mancha Tarashikomi ou pincelada\n if (currentPointsRef.current.length === 1) {\n const p0 = currentPointsRef.current[0];\n currentPointsRef.current.push(\n {\n x: p0.x + 18,\n y: p0.y - 8,\n pressure: p0.pressure * 0.95,\n velocity: 0.18,\n timestamp: p0.timestamp + 16,\n },\n {\n x: p0.x + 36,\n y: p0.y - 14,\n pressure: p0.pressure * 0.75,\n velocity: 0.25,\n timestamp: p0.timestamp + 32,\n }\n );\n activeStrokeRef.current.points = currentPointsRef.current;\n }\n\n if (currentPointsRef.current.length >= 2) {\n strokesRef.current.push(activeStrokeRef.current);\n invalidateCompletedCache();\n }\n activeStrokeRef.current = null;\n currentPointsRef.current = [];\n renderAll();\n onTelemetryChange?.({\n pressure: 0,\n velocity: 0,\n strokeCount: strokesRef.current.length,\n isReplaying: false,\n });\n };\n\n return (\n <canvas\n ref={canvasRef}\n onPointerDown={handlePointerDown}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n style={{ touchAction: 'none' }}\n className={`block w-full h-full cursor-crosshair touch-none select-none ${className}`}\n />\n );\n};\n","import React, { useEffect, useRef } from 'react';\nimport { sampleCubicCurve, samplePolarArc, sampleQuadraticCurve } from '../math';\nimport { drawSakuraBlossom, drawSumiKasureRibbon } from '../techniques';\n\nexport interface SumiStrokeProps {\n /** Estilo da pincelada decorativa ou divisor de seção */\n variant?: 'horizontal_kasure' | 's_curve_flourish' | 'enso_seal' | 'sakura_branch_divider';\n /** Cor primária do nanquim */\n inkColor?: string;\n /** Cor secundária de acento (ex: vermelho Sakura / Hanko) */\n accentColor?: string;\n /** Quantidade de cerdas */\n bristleCount?: number;\n /** Falha de pincel seco Kasure */\n dryBrushGap?: number;\n /** Espessura máxima em pixels */\n thickness?: number;\n /** Semente determinística */\n seed?: number;\n /** Anima a pincelada ao montar */\n animateOnMount?: boolean;\n className?: string;\n}\n\n/**\n * Componente <SumiStroke /> — Pincelada caligráfica declarativa para divisores de seção,\n * sublinhados editoriais, selos Ensō e ramos ornamentais de Sakura.\n */\nexport const SumiStroke: React.FC<SumiStrokeProps> = ({\n variant = 'horizontal_kasure',\n inkColor = '#141413',\n accentColor = '#C8232C',\n bristleCount = 18,\n dryBrushGap = 0.36,\n thickness = 14,\n seed = 4096,\n animateOnMount = true,\n className = '',\n}) => {\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n let animId = 0;\n const start = performance.now();\n\n const draw = (now: number) => {\n const rect = canvas.getBoundingClientRect();\n const dpr = Math.min(2, window.devicePixelRatio || 1);\n const w = Math.max(120, Math.floor(rect.width));\n const h = Math.max(28, Math.floor(rect.height));\n\n if (canvas.width !== w * dpr || canvas.height !== h * dpr) {\n canvas.width = w * dpr;\n canvas.height = h * dpr;\n }\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n ctx.save();\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, w, h);\n\n const prog = animateOnMount ? Math.min(1, (now - start) / 950) : 1;\n const headReach = 1 - Math.pow(1 - prog, 3.2);\n\n if (variant === 'enso_seal') {\n const r = Math.min(w, h) * 0.38;\n const spine = samplePolarArc(\n w * 0.5,\n h * 0.5,\n r,\n r * 0.96,\n -Math.PI * 0.8,\n Math.PI * 0.95,\n 0,\n -0.05,\n 72,\n 0.12,\n seed\n );\n drawSumiKasureRibbon(ctx, {\n spine,\n maxWidth: thickness,\n bristleCount,\n dryBrushGap,\n taperStart: 0.85,\n taperEnd: 0.98,\n color: inkColor,\n headReach,\n seed,\n });\n } else if (variant === 's_curve_flourish') {\n const spine = sampleCubicCurve(\n { x: 12, y: h * 0.65 },\n { x: w * 0.32, y: h * 0.15 },\n { x: w * 0.68, y: h * 0.85 },\n { x: w - 12, y: h * 0.35 },\n 72,\n 0.12,\n seed\n );\n drawSumiKasureRibbon(ctx, {\n spine,\n maxWidth: thickness,\n bristleCount,\n dryBrushGap,\n taperStart: 0.75,\n taperEnd: 0.95,\n color: inkColor,\n headReach,\n seed,\n });\n } else if (variant === 'sakura_branch_divider') {\n const spine = sampleCubicCurve(\n { x: 8, y: h * 0.58 },\n { x: w * 0.35, y: h * 0.32 },\n { x: w * 0.65, y: h * 0.68 },\n { x: w - 12, y: h * 0.42 },\n 72,\n 0.18,\n seed\n );\n drawSumiKasureRibbon(ctx, {\n spine,\n maxWidth: thickness,\n bristleCount,\n dryBrushGap,\n taperStart: 0.2,\n taperEnd: 0.95,\n color: inkColor,\n headReach,\n seed,\n });\n\n const flowerPositions = [0.22, 0.46, 0.72, 0.88];\n flowerPositions.forEach((tPos, idx) => {\n if (tPos > headReach) return;\n const pt = spine[Math.floor(tPos * (spine.length - 1))];\n if (pt) {\n drawSakuraBlossom(\n ctx,\n pt.x,\n pt.y + (idx % 2 === 0 ? -4 : 4),\n Math.min(h * 0.32, thickness * 0.75),\n idx * 0.9,\n accentColor,\n '#FFF5F5',\n inkColor,\n 0.95,\n seed + idx * 31\n );\n }\n });\n } else {\n const spine = sampleQuadraticCurve(\n { x: 8, y: h * 0.55 },\n { x: w * 0.48, y: h * 0.42 },\n { x: w - 8, y: h * 0.52 },\n 64,\n 0.1,\n seed\n );\n drawSumiKasureRibbon(ctx, {\n spine,\n maxWidth: thickness,\n bristleCount,\n dryBrushGap,\n taperStart: 0.8,\n taperEnd: 0.95,\n color: inkColor,\n headReach,\n seed,\n });\n }\n\n ctx.restore();\n if (prog < 1) {\n animId = requestAnimationFrame(draw);\n }\n };\n\n animId = requestAnimationFrame(draw);\n return () => cancelAnimationFrame(animId);\n }, [variant, inkColor, accentColor, bristleCount, dryBrushGap, thickness, seed, animateOnMount]);\n\n return <canvas ref={canvasRef} className={`block w-full select-none ${className}`} />;\n};\n","import React, { useEffect, useRef } from 'react';\nimport { DEFAULT_VFX_CONFIG } from '../presets';\nimport { VFXConfig } from '../types';\nimport { renderCompleteSpriteSheet, renderVFXFrame } from '../vfxRenderer';\n\nexport interface SumiVFXProps {\n /** Configuração parcial ou completa do efeito Sakuga */\n config?: Partial<VFXConfig>;\n /** Modo de exibição: animação contínua ('player') ou folha de sprites 4x4 ('spritesheet') */\n mode?: 'player' | 'spritesheet';\n /** Quadro fixo opcional [0..15]. Se omitido, anima continuamente na taxa `fps` */\n fixedFrame?: number | null;\n /** Resolução do canvas em pixels */\n size?: number;\n /** Se verdadeiro, pausa a reprodução automática */\n paused?: boolean;\n /** Callback por frame para sincronizar UI externa */\n onFrameTick?: (frameIndex: number) => void;\n className?: string;\n}\n\n/**\n * Componente <SumiVFX />\n * Renderizador declarativo de efeitos procedurais de 16 quadros com Cinética Sakuga.\n * Redesenha apenas quando o quadro avança (ex: 16 FPS) e pausa automaticamente fora da viewport.\n */\nexport const SumiVFX: React.FC<SumiVFXProps> = ({\n config: customConfig,\n mode = 'player',\n fixedFrame = null,\n size = 256,\n paused = false,\n onFrameTick,\n className = '',\n}) => {\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const frameRef = useRef<number>(0);\n const isVisibleRef = useRef<boolean>(true);\n\n const mergedConfig: VFXConfig = {\n ...DEFAULT_VFX_CONFIG,\n ...customConfig,\n colors: { ...DEFAULT_VFX_CONFIG.colors, ...customConfig?.colors },\n brush: { ...DEFAULT_VFX_CONFIG.brush, ...customConfig?.brush },\n dynamics: { ...DEFAULT_VFX_CONFIG.dynamics, ...customConfig?.dynamics },\n rough: { ...DEFAULT_VFX_CONFIG.rough, ...customConfig?.rough },\n };\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas || typeof IntersectionObserver === 'undefined') return;\n const io = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n isVisibleRef.current = entry.isIntersecting;\n });\n },\n { rootMargin: '80px 0px', threshold: 0.01 }\n );\n io.observe(canvas);\n return () => io.disconnect();\n }, []);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n if (mode === 'spritesheet') {\n renderCompleteSpriteSheet(canvas, mergedConfig, 4);\n return;\n }\n\n canvas.width = size;\n canvas.height = size;\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n const drawSingleFrame = (f: number) => {\n ctx.clearRect(0, 0, size, size);\n renderVFXFrame(\n ctx,\n f,\n mergedConfig.totalFrames,\n size,\n size,\n mergedConfig,\n mergedConfig.bgMode === 'checker' || mergedConfig.bgMode === 'transparent'\n );\n };\n\n if (fixedFrame !== null || paused) {\n const f = fixedFrame !== null ? fixedFrame : frameRef.current;\n drawSingleFrame(f);\n return;\n }\n\n // Desenha o quadro inicial imediatamente\n drawSingleFrame(frameRef.current);\n\n let animId = 0;\n let lastTick = performance.now();\n const interval = 1000 / Math.max(1, mergedConfig.fps);\n\n const loop = (now: number) => {\n if (isVisibleRef.current && now - lastTick >= interval) {\n lastTick = now;\n frameRef.current = (frameRef.current + 1) % mergedConfig.totalFrames;\n drawSingleFrame(frameRef.current);\n onFrameTick?.(frameRef.current);\n }\n animId = requestAnimationFrame(loop);\n };\n\n animId = requestAnimationFrame(loop);\n return () => cancelAnimationFrame(animId);\n }, [mergedConfig, mode, fixedFrame, size, paused, onFrameTick]);\n\n return (\n <canvas\n ref={canvasRef}\n className={`block max-w-full h-auto select-none ${\n mergedConfig.bgMode === 'checker' ? 'checker-bg' : ''\n } ${className}`}\n />\n );\n};\n","import React, { useEffect, useRef } from 'react';\nimport rough from 'roughjs';\nimport {\n createSeededRandom,\n mixHex,\n rgbaStr,\n sampleCubicCurve,\n samplePolarArc,\n sampleQuadraticCurve,\n} from '../math';\nimport { DEFAULT_VFX_CONFIG, MAGIC_SCHOOLS } from '../presets';\nimport {\n drawCalligraphicKoiCarp,\n drawCornerSakuraBranch,\n drawFloatingSakuraPetal,\n drawHokusaiWaveCrest,\n drawSumiKasureRibbon,\n drawTarashikomiWashBlob,\n drawUkiyoeCloudBank,\n} from '../techniques';\nimport { SchoolId } from '../types';\n\nexport type SectionPaintingTheme =\n | 'header_single_stroke'\n | 'sakura_katana_canopy'\n | 'koi_river_rapids'\n | 'misty_mountains_sakura'\n | 'enso_imperial_seal';\n\nexport interface SumiSectionPainterProps {\n /** Cena artística japonesa pintada pelo pacote */\n theme: SectionPaintingTheme;\n /** Progresso de pintura controlado pelo scroll GSAP ou animação (0.0 a 1.0) */\n scrollProgress?: number;\n /** Referência mutável opcional para atualizar progresso sem re-renderizar o React */\n scrollProgressRef?: React.MutableRefObject<number>;\n /** Paleta cromática ativa */\n school?: SchoolId;\n /** Semente determinística */\n seed?: number;\n /** Movimento orgânico contínuo (vento, água, nado das carpas) */\n ambientMotion?: boolean;\n className?: string;\n}\n\n/**\n * Componente <SumiSectionPainter />\n * Pinta cenas completas de pergaminho japonês sincronizadas com o scroll.\n * Utiliza cache em canvas offscreen e IntersectionObserver para manter 60/120 FPS com uso mínimo de CPU.\n */\nexport const SumiSectionPainter: React.FC<SumiSectionPainterProps> = ({\n theme,\n scrollProgress = 1,\n scrollProgressRef,\n school = 'fuji_sakura',\n seed = 8472,\n ambientMotion = true,\n className = '',\n}) => {\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const staticCanvasRef = useRef<HTMLCanvasElement | null>(null);\n const staticKeyRef = useRef<string>('');\n const isVisibleRef = useRef<boolean>(true);\n const startRef = useRef<number>(performance.now());\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas || typeof IntersectionObserver === 'undefined') return;\n if (theme === 'header_single_stroke') {\n isVisibleRef.current = true;\n return;\n }\n const io = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n isVisibleRef.current = entry.isIntersecting;\n });\n },\n { rootMargin: '120px 0px', threshold: 0.01 }\n );\n io.observe(canvas);\n return () => io.disconnect();\n }, [theme]);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n if (!staticCanvasRef.current) {\n staticCanvasRef.current = document.createElement('canvas');\n }\n const staticCanvas = staticCanvasRef.current;\n let animId = 0;\n let cachedRect = canvas.getBoundingClientRect();\n\n const ro = new ResizeObserver((entries) => {\n if (entries[0]) {\n cachedRect = entries[0].contentRect as DOMRect;\n staticKeyRef.current = '';\n }\n });\n ro.observe(canvas);\n\n const drawStaticLayer = (\n sCtx: CanvasRenderingContext2D,\n sCanvas: HTMLCanvasElement,\n w: number,\n h: number,\n dpr: number,\n reach: number\n ) => {\n sCtx.save();\n sCtx.setTransform(dpr, 0, 0, dpr, 0, 0);\n sCtx.clearRect(0, 0, w, h);\n\n if (reach <= 0.005) {\n sCtx.restore();\n return;\n }\n\n const isCompact = w < 640;\n const scale = Math.min(w / (isCompact ? 760 : 1280), Math.max(0.62, h / 520));\n const schoolColors = MAGIC_SCHOOLS[school]?.colors ?? MAGIC_SCHOOLS.fuji_sakura.colors;\n const vfxConfig = {\n ...DEFAULT_VFX_CONFIG,\n school,\n colors: schoolColors,\n seed,\n };\n\n let rc: ReturnType<typeof rough.canvas> | null = null;\n try {\n rc = rough.canvas(sCanvas);\n } catch {\n rc = null;\n }\n\n if (theme === 'header_single_stroke') {\n const drawW = (w + 48) * reach;\n\n sCtx.save();\n sCtx.beginPath();\n sCtx.moveTo(-24, 0);\n sCtx.lineTo(drawW, 0);\n sCtx.quadraticCurveTo(drawW - 12, h * 0.62, Math.max(-24, drawW - 36), h - 4);\n sCtx.bezierCurveTo(drawW * 0.68, h - 1, drawW * 0.32, h - 6, -24, h - 3);\n sCtx.closePath();\n\n const washiGrad = sCtx.createLinearGradient(0, 0, 0, h);\n washiGrad.addColorStop(0.0, 'rgba(245, 240, 230, 0.97)');\n washiGrad.addColorStop(0.78, 'rgba(239, 232, 219, 0.95)');\n washiGrad.addColorStop(1.0, 'rgba(230, 221, 206, 0.88)');\n sCtx.fillStyle = washiGrad;\n sCtx.fill();\n sCtx.restore();\n\n const parchmentSpine = sampleCubicCurve(\n { x: -20, y: h * 0.5 },\n { x: w * 0.34, y: h * 0.46 },\n { x: w * 0.68, y: h * 0.54 },\n { x: w + 28, y: h * 0.49 },\n 60,\n 0.03,\n seed + 7\n );\n\n drawSumiKasureRibbon(sCtx, {\n spine: parchmentSpine,\n maxWidth: h * 1.15,\n bristleCount: 18,\n dryBrushGap: 0.25,\n taperStart: 0.04,\n taperEnd: 0.14,\n color: '#E5DCCB',\n alpha: 0.45,\n headReach: reach,\n roundHeadCap: true,\n seed: seed + 13,\n });\n\n const borderSpine = sampleCubicCurve(\n { x: -16, y: h - 4.5 },\n { x: w * 0.35, y: h - 6.5 },\n { x: w * 0.7, y: h - 3.0 },\n { x: w + 20, y: h - 5.0 },\n 64,\n 0.04,\n seed + 19\n );\n\n drawSumiKasureRibbon(sCtx, {\n spine: borderSpine,\n maxWidth: 5.5,\n bristleCount: 10,\n dryBrushGap: 0.28,\n taperStart: 0.08,\n taperEnd: 0.65,\n color: '#4A453E',\n alpha: 0.34,\n headReach: reach,\n roundHeadCap: true,\n seed: seed + 23,\n });\n\n drawSumiKasureRibbon(sCtx, {\n spine: borderSpine,\n maxWidth: 3.2,\n bristleCount: 7,\n dryBrushGap: 0.22,\n taperStart: 0.12,\n taperEnd: 0.78,\n color: '#C8232C',\n offsetNormal: 1.5,\n alpha: 0.72,\n headReach: Math.max(0, reach - 0.04),\n roundHeadCap: true,\n seed: seed + 29,\n });\n\n if (reach > 0.65) {\n const petalAlpha = Math.min(0.85, (reach - 0.65) * 2.5);\n drawFloatingSakuraPetal(sCtx, w * 0.88, h - 7, 5.5, 0.4, 0.7, '#C8232C', petalAlpha);\n drawFloatingSakuraPetal(sCtx, w * 0.91, h - 4, 4.2, 1.2, 0.55, '#E11D48', petalAlpha);\n }\n } else if (theme === 'sakura_katana_canopy') {\n drawTarashikomiWashBlob(\n sCtx,\n w * 0.84,\n h * 0.18,\n w * 0.15 * reach,\n w * 0.15 * reach,\n 0,\n '#FFF5F5',\n '#C8232C',\n 0.2,\n seed + 19\n );\n\n drawCornerSakuraBranch(\n sCtx,\n w + 18,\n h * 0.14,\n w * (isCompact ? 0.56 : 0.65),\n h * 0.04,\n -1,\n Math.max(16, 26 * scale),\n reach,\n 0,\n schoolColors.inkPrimary,\n schoolColors.energySecondary,\n schoolColors.coreGlow,\n seed + 101\n );\n\n drawCornerSakuraBranch(\n sCtx,\n -18,\n h * 0.94,\n w * (isCompact ? 0.36 : 0.28),\n h * 0.81,\n 1,\n Math.max(15, 24 * scale),\n reach,\n 1.5,\n schoolColors.inkPrimary,\n schoolColors.energySecondary,\n schoolColors.coreGlow,\n seed + 149\n );\n } else if (theme === 'koi_river_rapids') {\n const hokusaiColors = MAGIC_SCHOOLS.calligraphy_tide.colors;\n const hokusaiCfg = { ...vfxConfig, colors: hokusaiColors };\n\n const riverSpine = sampleCubicCurve(\n { x: -w * 0.05, y: h * 0.82 },\n { x: w * 0.34, y: h * 0.14 },\n { x: w * 0.66, y: h * 0.88 },\n { x: w * 1.05, y: h * 0.22 },\n 72,\n 0.1,\n seed + 211\n );\n\n drawSumiKasureRibbon(sCtx, {\n spine: riverSpine,\n maxWidth: Math.max(95, 185 * scale),\n bristleCount: 22,\n dryBrushGap: 0.38,\n taperStart: 0.15,\n taperEnd: 0.15,\n color: '#38BDF8',\n alpha: 0.22 * reach,\n headReach: reach,\n hookWaves: 3,\n roundHeadCap: false,\n seed: seed + 223,\n });\n\n drawSumiKasureRibbon(sCtx, {\n spine: riverSpine,\n maxWidth: Math.max(42, 82 * scale),\n bristleCount: 14,\n dryBrushGap: 0.44,\n taperStart: 0.15,\n taperEnd: 0.25,\n color: '#081C2E',\n offsetNormal: 18 * scale,\n alpha: 0.24 * reach,\n headReach: reach,\n roundHeadCap: false,\n seed: seed + 229,\n });\n\n const leftWaveSpine = sampleCubicCurve(\n { x: -w * 0.03, y: h * 0.92 },\n { x: w * 0.11, y: h * 0.78 },\n { x: w * 0.16, y: h * 0.38 },\n { x: w * 0.27, y: h * 0.2 },\n 52,\n 0.14,\n seed + 241\n ).filter((pt) => pt.t <= reach);\n\n if (leftWaveSpine.length >= 8) {\n drawHokusaiWaveCrest(\n sCtx,\n rc,\n leftWaveSpine.map((p, i, arr) => ({ ...p, t: i / Math.max(1, arr.length - 1) })),\n Math.max(34, 66 * scale),\n 1,\n 6,\n hokusaiCfg,\n Math.max(0.85, scale * 1.1),\n 0.68,\n seed + 251\n );\n }\n\n const rightWaveSpine = sampleCubicCurve(\n { x: w * 1.03, y: h * 0.88 },\n { x: w * 0.89, y: h * 0.76 },\n { x: w * 0.84, y: h * 0.44 },\n { x: w * 0.74, y: h * 0.28 },\n 52,\n 0.14,\n seed + 263\n ).filter((pt) => pt.t <= reach);\n\n if (rightWaveSpine.length >= 8) {\n drawHokusaiWaveCrest(\n sCtx,\n rc,\n rightWaveSpine.map((p, i, arr) => ({ ...p, t: i / Math.max(1, arr.length - 1) })),\n Math.max(32, 58 * scale),\n -1,\n 5,\n hokusaiCfg,\n Math.max(0.82, scale * 1.05),\n 0.64,\n seed + 271\n );\n }\n\n drawCornerSakuraBranch(\n sCtx,\n w + 14,\n h * 0.07,\n w * (isCompact ? 0.68 : 0.76),\n h * 0.16,\n 1,\n Math.max(14, 22 * scale),\n reach,\n 0,\n '#11100E',\n '#C8232C',\n '#FFF5F5',\n seed + 299\n );\n } else if (theme === 'misty_mountains_sakura') {\n const mountainPeaks = [\n {\n x0: -w * 0.02,\n xPeak: w * 0.16,\n x1: w * 0.42,\n yPeak: h * 0.56,\n yBase: h * 0.98,\n alpha: 0.2,\n },\n {\n x0: w * 0.58,\n xPeak: w * 0.84,\n x1: w * 1.03,\n yPeak: h * 0.52,\n yBase: h * 0.98,\n alpha: 0.22,\n },\n ];\n\n mountainPeaks.forEach((mt, idx) => {\n sCtx.save();\n sCtx.beginPath();\n sCtx.moveTo(mt.x0, mt.yBase);\n sCtx.quadraticCurveTo(\n (mt.x0 + mt.xPeak) * 0.5,\n (mt.yBase + mt.yPeak) * 0.52,\n mt.xPeak,\n mt.yPeak\n );\n sCtx.quadraticCurveTo(\n (mt.xPeak + mt.x1) * 0.5,\n (mt.yBase + mt.yPeak) * 0.52,\n mt.x1,\n mt.yBase\n );\n sCtx.closePath();\n\n const grad = sCtx.createLinearGradient(mt.xPeak, mt.yPeak, mt.xPeak, mt.yBase);\n grad.addColorStop(0.0, rgbaStr(schoolColors.inkPrimary, mt.alpha * reach));\n grad.addColorStop(\n 0.7,\n rgbaStr(mixHex(schoolColors.inkPrimary, '#4A5559', 0.5), mt.alpha * 0.5 * reach)\n );\n grad.addColorStop(1.0, rgbaStr(schoolColors.inkPrimary, 0.0));\n sCtx.fillStyle = grad;\n sCtx.fill();\n sCtx.restore();\n\n const ridgeSpine = sampleQuadraticCurve(\n { x: mt.xPeak, y: mt.yPeak },\n { x: (mt.x0 + mt.xPeak) * 0.5, y: (mt.yBase + mt.yPeak) * 0.52 },\n { x: mt.x0, y: mt.yBase },\n 36,\n 0.16,\n seed + 310 + idx * 17\n );\n drawSumiKasureRibbon(sCtx, {\n spine: ridgeSpine,\n maxWidth: 15 * scale,\n bristleCount: 12,\n dryBrushGap: 0.38,\n taperStart: 0.25,\n taperEnd: 0.95,\n color: schoolColors.inkPrimary,\n alpha: 0.42 * reach,\n headReach: reach,\n seed: seed + 320 + idx * 17,\n });\n });\n\n drawUkiyoeCloudBank(\n sCtx,\n rc,\n w * 0.15,\n h * 0.18,\n Math.max(140, 235 * scale * reach),\n 4,\n vfxConfig,\n Math.max(0.8, scale),\n 0.26 * reach,\n seed + 331\n );\n\n drawUkiyoeCloudBank(\n sCtx,\n rc,\n w * 0.85,\n h * 0.78,\n Math.max(150, 250 * scale * reach),\n 4,\n vfxConfig,\n Math.max(0.8, scale),\n 0.26 * reach,\n seed + 347\n );\n\n drawCornerSakuraBranch(\n sCtx,\n -14,\n h * 0.96,\n w * (isCompact ? 0.28 : 0.2),\n h * 0.76,\n 1,\n Math.max(16, 24 * scale),\n reach,\n 0,\n schoolColors.inkPrimary,\n '#C8232C',\n '#FFF5F5',\n seed + 373\n );\n\n drawCornerSakuraBranch(\n sCtx,\n w + 14,\n h * 0.96,\n w * (isCompact ? 0.72 : 0.8),\n h * 0.76,\n -1,\n Math.max(16, 24 * scale),\n reach,\n 1.2,\n schoolColors.inkPrimary,\n '#C8232C',\n '#FFF5F5',\n seed + 389\n );\n } else if (theme === 'enso_imperial_seal') {\n const cx = w * 0.5;\n const cy = h * 0.52;\n const r = Math.min(w, h) * 0.44;\n\n drawTarashikomiWashBlob(\n sCtx,\n cx,\n cy,\n r * 1.04 * reach,\n r * 1.02 * reach,\n 0.1,\n schoolColors.coreGlow,\n schoolColors.energySecondary,\n 0.18 * reach,\n seed + 401\n );\n\n const ensoSpine = samplePolarArc(\n cx,\n cy,\n r,\n r * 0.96,\n -Math.PI * 0.82,\n Math.PI * 0.96,\n 0,\n -0.06,\n 84,\n 0.16,\n seed + 419\n );\n\n drawSumiKasureRibbon(sCtx, {\n spine: ensoSpine,\n maxWidth: Math.max(20, 38 * scale),\n bristleCount: 24,\n dryBrushGap: 0.36,\n taperStart: 0.85,\n taperEnd: 0.99,\n color: schoolColors.inkPrimary,\n alpha: 0.28,\n headReach: reach,\n roundHeadCap: true,\n seed: seed + 431,\n });\n\n drawSumiKasureRibbon(sCtx, {\n spine: ensoSpine,\n maxWidth: Math.max(7, 13 * scale),\n bristleCount: 12,\n dryBrushGap: 0.42,\n taperStart: 0.85,\n taperEnd: 0.99,\n color: schoolColors.energySecondary,\n offsetNormal: 6 * scale,\n alpha: 0.34,\n headReach: Math.max(0, reach - 0.08),\n seed: seed + 449,\n });\n\n drawCornerSakuraBranch(\n sCtx,\n -12,\n h * 0.84,\n w * (isCompact ? 0.28 : 0.22),\n h * 0.52,\n 1,\n Math.max(15, 23 * scale),\n reach,\n 0,\n schoolColors.inkPrimary,\n schoolColors.energySecondary,\n schoolColors.coreGlow,\n seed + 463\n );\n\n drawCornerSakuraBranch(\n sCtx,\n w + 12,\n h * 0.22,\n w * (isCompact ? 0.72 : 0.78),\n h * 0.5,\n -1,\n Math.max(15, 23 * scale),\n reach,\n 1.1,\n schoolColors.inkPrimary,\n schoolColors.energySecondary,\n schoolColors.coreGlow,\n seed + 479\n );\n }\n\n sCtx.restore();\n };\n\n const render = (now: number) => {\n if (!isVisibleRef.current && theme !== 'header_single_stroke') {\n if (ambientMotion) animId = requestAnimationFrame(render);\n return;\n }\n\n const dpr = Math.min(1.75, window.devicePixelRatio || 1);\n const w = Math.max(240, Math.floor(cachedRect.width || canvas.clientWidth || 600));\n const h = Math.max(52, Math.floor(cachedRect.height || canvas.clientHeight || 120));\n\n const targetW = Math.floor(w * dpr);\n const targetH = Math.floor(h * dpr);\n if (canvas.width !== targetW || canvas.height !== targetH) {\n canvas.width = targetW;\n canvas.height = targetH;\n staticCanvas.width = targetW;\n staticCanvas.height = targetH;\n staticKeyRef.current = '';\n }\n\n const ctx = canvas.getContext('2d');\n const sCtx = staticCanvas.getContext('2d');\n if (!ctx || !sCtx) return;\n\n const rawProg = scrollProgressRef ? scrollProgressRef.current : scrollProgress;\n const prog = Math.max(0.0, Math.min(1, rawProg));\n\n if (theme === 'header_single_stroke' && prog <= 0.005) {\n ctx.clearRect(0, 0, targetW, targetH);\n return;\n }\n\n const reach =\n theme === 'header_single_stroke'\n ? Math.min(1, Math.pow(prog, 0.6))\n : Math.min(1, Math.pow(prog, 0.65) * 1.15);\n\n const quantReach = reach >= 0.995 ? 1 : Math.round(reach * 60) / 60;\n const cacheKey = `${theme}:${targetW}x${targetH}:${quantReach}:${school}:${seed}`;\n\n if (staticKeyRef.current !== cacheKey) {\n drawStaticLayer(sCtx, staticCanvas, w, h, dpr, quantReach);\n staticKeyRef.current = cacheKey;\n }\n\n ctx.save();\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, w, h);\n\n // 1. Copia a base estática do cache offscreen (< 0.1ms)\n ctx.drawImage(staticCanvas, 0, 0, w, h);\n\n // 2. Desenha apenas os elementos vivos animados sobre a base\n if (ambientMotion && reach > 0.1) {\n const elapsed = (now - startRef.current) / 1000;\n const isCompact = w < 640;\n const scale = Math.min(w / (isCompact ? 760 : 1280), Math.max(0.62, h / 520));\n const schoolColors = MAGIC_SCHOOLS[school]?.colors ?? MAGIC_SCHOOLS.fuji_sakura.colors;\n\n if (theme === 'sakura_katana_canopy') {\n const rand = createSeededRandom(seed + 199);\n const count = isCompact ? 10 : 15;\n for (let p = 0; p < count; p++) {\n const bx = rand() * w;\n const by = rand() * h;\n const px = (bx + elapsed * (16 + (p % 5) * 5) + Math.sin(elapsed + p) * 16) % w;\n const py = (by + elapsed * (7 + (p % 3) * 4) + Math.cos(elapsed + p) * 10) % h;\n drawFloatingSakuraPetal(\n ctx,\n px,\n py,\n (5.0 + (p % 4) * 1.8) * scale,\n elapsed * 1.4 + p,\n 0.35 + 0.55 * Math.abs(Math.sin(elapsed * 2 + p)),\n schoolColors.energySecondary,\n 0.72 * reach\n );\n }\n } else if (theme === 'koi_river_rapids' && reach > 0.15) {\n const koiAlpha = Math.min(0.95, (reach - 0.12) * 1.35);\n\n // Carpa 1: Bem visível no vão aberto superior-central do rio\n const koi1X = w * 0.56 + Math.cos(elapsed * 0.6) * 22 * scale;\n const koi1Y = h * 0.18 + Math.sin(elapsed * 0.75) * 12 * scale;\n drawCalligraphicKoiCarp(\n ctx,\n koi1X,\n koi1Y,\n Math.max(95, 160 * scale),\n -0.24 + Math.sin(elapsed * 0.7) * 0.08,\n elapsed * 3.2,\n '#11100E',\n '#C8232C',\n '#FAF8F5',\n koiAlpha,\n seed + 281\n );\n\n // Carpa 2: Subindo pela margem esquerda alta\n const koi2X = w * 0.08 + Math.sin(elapsed * 0.55) * 16 * scale;\n const koi2Y = h * 0.43 + Math.cos(elapsed * 0.7) * 18 * scale;\n drawCalligraphicKoiCarp(\n ctx,\n koi2X,\n koi2Y,\n Math.max(88, 145 * scale),\n -0.95 + Math.cos(elapsed * 0.65) * 0.08,\n elapsed * 3.0 + 1.4,\n '#11100E',\n '#E11D48',\n '#FFF7ED',\n koiAlpha,\n seed + 293\n );\n\n // Carpa 3: Nadando na correnteza inferior sob o glassmorphismo\n const koi3X = w * 0.63 + Math.sin(elapsed * 0.5) * 24 * scale;\n const koi3Y = h * 0.91 + Math.cos(elapsed * 0.6) * 10 * scale;\n drawCalligraphicKoiCarp(\n ctx,\n koi3X,\n koi3Y,\n Math.max(90, 148 * scale),\n -Math.PI + 0.28 + Math.sin(elapsed * 0.6) * 0.07,\n elapsed * 3.1 + 2.7,\n '#11100E',\n '#C8232C',\n '#FAF8F5',\n koiAlpha,\n seed + 307\n );\n } else if (theme === 'misty_mountains_sakura') {\n const rand = createSeededRandom(seed + 395);\n for (let p = 0; p < 10; p++) {\n const bx = rand() * w;\n const by = rand() * h;\n const px = (bx + elapsed * (14 + (p % 4) * 4) + Math.sin(elapsed + p) * 14) % w;\n const py = (by + elapsed * (6 + (p % 3) * 3) + Math.cos(elapsed + p) * 8) % h;\n drawFloatingSakuraPetal(\n ctx,\n px,\n py,\n (4.8 + (p % 3) * 1.6) * scale,\n elapsed * 1.2 + p,\n 0.4 + 0.5 * Math.abs(Math.sin(elapsed * 1.8 + p)),\n '#C8232C',\n 0.65 * reach\n );\n }\n } else if (theme === 'enso_imperial_seal') {\n const cx = w * 0.5;\n const cy = h * 0.52;\n const r = Math.min(w, h) * 0.44;\n const rand = createSeededRandom(seed + 499);\n for (let p = 0; p < 12; p++) {\n const ang = (p / 12) * Math.PI * 2 + elapsed * 0.22;\n const dist = r * (0.85 + (rand() - 0.3) * 0.35);\n const px = cx + Math.cos(ang) * dist;\n const py = cy + Math.sin(ang) * dist;\n drawFloatingSakuraPetal(\n ctx,\n px,\n py,\n Math.max(5, 8.0 * scale * reach),\n elapsed * 1.3 + p,\n 0.4 + 0.5 * Math.abs(Math.sin(elapsed + p)),\n schoolColors.energySecondary,\n 0.5 * reach\n );\n }\n }\n }\n\n ctx.restore();\n\n if (ambientMotion || scrollProgressRef) {\n animId = requestAnimationFrame(render);\n }\n };\n\n animId = requestAnimationFrame(render);\n return () => {\n cancelAnimationFrame(animId);\n ro.disconnect();\n };\n }, [theme, scrollProgress, scrollProgressRef, school, seed, ambientMotion]);\n\n return (\n <canvas\n ref={canvasRef}\n className={`block w-full h-full pointer-events-none select-none ${className}`}\n />\n );\n};\n","import React, { useEffect, useRef } from 'react';\nimport rough from 'roughjs';\nimport { samplePolarArc, sampleQuadraticCurve } from '../math';\nimport { drawSumiKasureRibbon } from '../techniques';\n\nexport type SumiIconName =\n | 'logo'\n | 'brush'\n | 'katana'\n | 'sakura'\n | 'koi'\n | 'mountain'\n | 'scroll'\n | 'play'\n | 'pause'\n | 'replay'\n | 'copy'\n | 'check'\n | 'download'\n | 'upload'\n | 'undo'\n | 'trash'\n | 'eye'\n | 'layers'\n | 'sliders'\n | 'chevron-down'\n | 'close'\n | 'terminal';\n\nexport interface SumiIconProps {\n name: SumiIconName;\n size?: number;\n color?: string;\n accentColor?: string;\n seed?: number;\n className?: string;\n}\n\n/**\n * Componente <SumiIcon /> — Desenha todos os ícones da interface em nanquim monocromático\n * nítido usando Rough.js (preserveVertices: true), mantendo estética orgânica de traço à mão\n * com leitura imediata.\n */\nexport const SumiIcon: React.FC<SumiIconProps> = ({\n name,\n size = 22,\n color = '#11100E',\n seed = 101,\n className = '',\n}) => {\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const effectiveSize = Math.max(20, size);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const dpr = Math.max(2, Math.min(3, window.devicePixelRatio || 2));\n canvas.width = effectiveSize * dpr;\n canvas.height = effectiveSize * dpr;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n let resolvedColor = color;\n if (color === 'currentColor' && canvas.parentElement) {\n resolvedColor = window.getComputedStyle(canvas.parentElement).color || '#11100E';\n }\n\n ctx.save();\n ctx.scale(dpr, dpr);\n ctx.clearRect(0, 0, effectiveSize, effectiveSize);\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n\n const rc = rough.canvas(canvas);\n const s = effectiveSize / 24;\n\n const opts = {\n stroke: resolvedColor,\n strokeWidth: Math.max(1.85, 2.0 * s),\n roughness: 0.22,\n bowing: 0.25,\n preserveVertices: true,\n disableMultiStroke: false,\n seed,\n };\n\n const solidOpts = {\n ...opts,\n fill: resolvedColor,\n fillStyle: 'solid' as const,\n };\n\n if (name === 'logo') {\n const enso = samplePolarArc(\n 12 * s,\n 12 * s,\n 9.2 * s,\n 9.0 * s,\n -Math.PI * 0.78,\n Math.PI * 1.05,\n 0,\n 0,\n 36,\n 0.08,\n seed\n );\n drawSumiKasureRibbon(ctx, {\n spine: enso,\n maxWidth: 3.4 * s,\n bristleCount: 10,\n dryBrushGap: 0.22,\n taperStart: 0.7,\n taperEnd: 0.98,\n color: resolvedColor,\n alpha: 0.95,\n roundHeadCap: true,\n seed,\n });\n } else if (name === 'brush') {\n // Pincel Caligráfico todo em nanquim: cabo cônico, anel de virola e cerdas curvas bem definidas\n rc.polygon(\n [\n [20.2 * s, 2.5 * s],\n [21.5 * s, 3.8 * s],\n [13.4 * s, 12.6 * s],\n [11.4 * s, 10.6 * s],\n ],\n solidOpts\n );\n // Virola / anel separador\n rc.line(9.8 * s, 11.2 * s, 12.8 * s, 14.2 * s, {\n ...opts,\n strokeWidth: Math.max(2.1, 2.3 * s),\n });\n // Tufo de cerdas com curvatura caligráfica na ponta e ranhuras de cerdas\n rc.curve(\n [\n [9.6 * s, 11.8 * s],\n [6.0 * s, 14.2 * s],\n [4.2 * s, 18.2 * s],\n [2.5 * s, 21.2 * s],\n ],\n opts\n );\n rc.curve(\n [\n [12.2 * s, 14.4 * s],\n [10.2 * s, 18.2 * s],\n [6.8 * s, 20.4 * s],\n [2.5 * s, 21.2 * s],\n ],\n opts\n );\n rc.curve(\n [\n [10.9 * s, 13.1 * s],\n [8.0 * s, 16.5 * s],\n [5.2 * s, 19.2 * s],\n [2.5 * s, 21.2 * s],\n ],\n { ...opts, strokeWidth: Math.max(1.3, 1.45 * s) }\n );\n } else if (name === 'katana') {\n rc.curve(\n [\n [7.5 * s, 16.5 * s],\n [14.0 * s, 9.5 * s],\n [21.0 * s, 3.0 * s],\n ],\n { ...opts, strokeWidth: Math.max(2.2, 2.4 * s) }\n );\n rc.line(6.0 * s, 13.5 * s, 10.5 * s, 18.0 * s, {\n ...opts,\n strokeWidth: Math.max(2.3, 2.5 * s),\n });\n rc.line(3.0 * s, 21.0 * s, 7.5 * s, 16.5 * s, {\n ...opts,\n strokeWidth: Math.max(2.4, 2.6 * s),\n });\n } else if (name === 'sakura') {\n // Flor de Sakura de 5 pétalas desenhada com Rough.js em nanquim nítido\n for (let i = 0; i < 5; i++) {\n const ang = (i / 5) * Math.PI * 2 - Math.PI / 2;\n const px = 12 * s + Math.cos(ang) * 6.2 * s;\n const py = 12 * s + Math.sin(ang) * 6.2 * s;\n rc.circle(px, py, 6.2 * s, opts);\n }\n rc.circle(12 * s, 12 * s, 3.2 * s, solidOpts);\n } else if (name === 'koi') {\n rc.curve(\n [\n [3.5 * s, 14.5 * s],\n [8.0 * s, 6.5 * s],\n [15.5 * s, 7.5 * s],\n [19.0 * s, 12.0 * s],\n ],\n opts\n );\n rc.curve(\n [\n [3.5 * s, 14.5 * s],\n [9.5 * s, 16.0 * s],\n [15.0 * s, 14.2 * s],\n [19.0 * s, 12.0 * s],\n ],\n opts\n );\n rc.circle(8.2 * s, 11.2 * s, 3.2 * s, solidOpts);\n rc.polygon(\n [\n [18.5 * s, 12.0 * s],\n [22.0 * s, 8.0 * s],\n [20.6 * s, 12.0 * s],\n [22.0 * s, 16.0 * s],\n ],\n solidOpts\n );\n } else if (name === 'mountain') {\n rc.circle(17.5 * s, 6.5 * s, 5.2 * s, opts);\n rc.polygon(\n [\n [2.0 * s, 19.5 * s],\n [8.8 * s, 7.5 * s],\n [13.2 * s, 7.5 * s],\n [20.5 * s, 19.5 * s],\n ],\n opts\n );\n rc.linearPath(\n [\n [6.8 * s, 11.5 * s],\n [9.5 * s, 10.5 * s],\n [11.0 * s, 12.0 * s],\n [12.5 * s, 10.5 * s],\n [15.2 * s, 11.5 * s],\n ],\n opts\n );\n } else if (name === 'scroll') {\n rc.rectangle(5.5 * s, 4.0 * s, 13.0 * s, 16.0 * s, opts);\n rc.line(4.0 * s, 4.0 * s, 20.0 * s, 4.0 * s, {\n ...opts,\n strokeWidth: Math.max(2.2, 2.4 * s),\n });\n rc.line(4.0 * s, 20.0 * s, 20.0 * s, 20.0 * s, {\n ...opts,\n strokeWidth: Math.max(2.2, 2.4 * s),\n });\n rc.line(8.5 * s, 9.0 * s, 15.5 * s, 9.0 * s, opts);\n rc.line(8.5 * s, 13.0 * s, 15.5 * s, 13.0 * s, opts);\n } else if (name === 'play') {\n rc.polygon(\n [\n [6.5 * s, 4.5 * s],\n [19.5 * s, 12.0 * s],\n [6.5 * s, 19.5 * s],\n ],\n solidOpts\n );\n } else if (name === 'pause') {\n rc.rectangle(6.0 * s, 4.5 * s, 4.2 * s, 15.0 * s, solidOpts);\n rc.rectangle(13.8 * s, 4.5 * s, 4.2 * s, 15.0 * s, solidOpts);\n } else if (name === 'replay') {\n rc.arc(12 * s, 12.5 * s, 14.5 * s, 14.5 * s, 0.25, Math.PI * 1.65, false, opts);\n rc.polygon(\n [\n [15.5 * s, 3.0 * s],\n [21.0 * s, 6.2 * s],\n [15.2 * s, 9.5 * s],\n ],\n solidOpts\n );\n } else if (name === 'copy') {\n rc.rectangle(8.5 * s, 8.5 * s, 11.5 * s, 11.5 * s, opts);\n rc.linearPath(\n [\n [15.5 * s, 8.5 * s],\n [15.5 * s, 4.5 * s],\n [4.5 * s, 4.5 * s],\n [4.5 * s, 15.5 * s],\n [8.5 * s, 15.5 * s],\n ],\n opts\n );\n } else if (name === 'check') {\n rc.linearPath(\n [\n [4.0 * s, 12.5 * s],\n [9.5 * s, 18.0 * s],\n [20.0 * s, 6.0 * s],\n ],\n { ...opts, strokeWidth: Math.max(2.4, 2.7 * s) }\n );\n } else if (name === 'download') {\n rc.line(12 * s, 3.5 * s, 12 * s, 15.0 * s, opts);\n rc.linearPath(\n [\n [7.0 * s, 10.5 * s],\n [12.0 * s, 15.8 * s],\n [17.0 * s, 10.5 * s],\n ],\n opts\n );\n rc.line(4.5 * s, 20.0 * s, 19.5 * s, 20.0 * s, {\n ...opts,\n strokeWidth: Math.max(2.2, 2.4 * s),\n });\n } else if (name === 'upload') {\n rc.line(12 * s, 16.0 * s, 12 * s, 4.5 * s, opts);\n rc.linearPath(\n [\n [7.0 * s, 9.5 * s],\n [12.0 * s, 4.2 * s],\n [17.0 * s, 9.5 * s],\n ],\n opts\n );\n rc.line(4.5 * s, 20.0 * s, 19.5 * s, 20.0 * s, {\n ...opts,\n strokeWidth: Math.max(2.2, 2.4 * s),\n });\n } else if (name === 'undo') {\n rc.linearPath(\n [\n [9.5 * s, 5.0 * s],\n [4.5 * s, 9.5 * s],\n [9.5 * s, 14.0 * s],\n ],\n opts\n );\n rc.curve(\n [\n [5.0 * s, 9.5 * s],\n [15.0 * s, 9.0 * s],\n [19.5 * s, 13.5 * s],\n [16.0 * s, 19.5 * s],\n ],\n opts\n );\n } else if (name === 'trash') {\n rc.line(4.0 * s, 6.5 * s, 20.0 * s, 6.5 * s, opts);\n rc.line(9.5 * s, 3.8 * s, 14.5 * s, 3.8 * s, opts);\n rc.rectangle(6.5 * s, 6.8 * s, 11.0 * s, 13.2 * s, opts);\n rc.line(10.2 * s, 10.5 * s, 10.2 * s, 16.5 * s, opts);\n rc.line(13.8 * s, 10.5 * s, 13.8 * s, 16.5 * s, opts);\n } else if (name === 'eye') {\n rc.curve(\n [\n [2.0 * s, 12.0 * s],\n [12.0 * s, 4.8 * s],\n [22.0 * s, 12.0 * s],\n ],\n opts\n );\n rc.curve(\n [\n [2.0 * s, 12.0 * s],\n [12.0 * s, 19.2 * s],\n [22.0 * s, 12.0 * s],\n ],\n opts\n );\n rc.circle(12.0 * s, 12.0 * s, 5.4 * s, solidOpts);\n } else if (name === 'layers') {\n rc.polygon(\n [\n [12.0 * s, 3.2 * s],\n [21.0 * s, 8.0 * s],\n [12.0 * s, 12.8 * s],\n [3.0 * s, 8.0 * s],\n ],\n opts\n );\n rc.linearPath(\n [\n [3.0 * s, 12.8 * s],\n [12.0 * s, 17.2 * s],\n [21.0 * s, 12.8 * s],\n ],\n opts\n );\n rc.linearPath(\n [\n [3.0 * s, 16.8 * s],\n [12.0 * s, 21.2 * s],\n [21.0 * s, 16.8 * s],\n ],\n opts\n );\n } else if (name === 'sliders') {\n rc.line(3.5 * s, 7.0 * s, 20.5 * s, 7.0 * s, opts);\n rc.circle(9.0 * s, 7.0 * s, 5.2 * s, solidOpts);\n rc.line(3.5 * s, 16.5 * s, 20.5 * s, 16.5 * s, opts);\n rc.circle(15.5 * s, 16.5 * s, 5.2 * s, solidOpts);\n } else if (name === 'chevron-down') {\n rc.linearPath(\n [\n [5.0 * s, 8.5 * s],\n [12.0 * s, 15.8 * s],\n [19.0 * s, 8.5 * s],\n ],\n { ...opts, strokeWidth: Math.max(2.1, 2.3 * s) }\n );\n } else if (name === 'close') {\n rc.line(5.5 * s, 5.5 * s, 18.5 * s, 18.5 * s, opts);\n rc.line(18.5 * s, 5.5 * s, 5.5 * s, 18.5 * s, opts);\n } else if (name === 'terminal') {\n rc.linearPath(\n [\n [4.0 * s, 6.5 * s],\n [10.5 * s, 12.0 * s],\n [4.0 * s, 17.5 * s],\n ],\n { ...opts, strokeWidth: Math.max(2.2, 2.4 * s) }\n );\n rc.line(12.0 * s, 17.5 * s, 20.0 * s, 17.5 * s, {\n ...opts,\n strokeWidth: Math.max(2.2, 2.4 * s),\n });\n }\n\n ctx.restore();\n }, [name, effectiveSize, color, seed]);\n\n return (\n <canvas\n ref={canvasRef}\n style={{ width: effectiveSize, height: effectiveSize }}\n className={`inline-block shrink-0 pointer-events-none select-none ${className}`}\n aria-hidden=\"true\"\n />\n );\n};\n\nexport interface SumiBrandEmblemProps {\n size?: number;\n className?: string;\n}\n\n/**\n * Emblema Japonês Pintado (<SumiBrandEmblem />) — Pinta o círculo Ensō em nanquim,\n * o sol carmesim e o ideograma 墨 (Sumi: Nanquim) à mão usando as técnicas da biblioteca.\n */\nexport const SumiBrandEmblem: React.FC<SumiBrandEmblemProps> = ({\n size = 36,\n className = '',\n}) => {\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n\n const dpr = Math.max(2, Math.min(3, window.devicePixelRatio || 2));\n canvas.width = size * dpr;\n canvas.height = size * dpr;\n\n const ctx = canvas.getContext('2d');\n if (!ctx) return;\n\n ctx.save();\n ctx.scale(dpr, dpr);\n ctx.clearRect(0, 0, size, size);\n\n const s = size / 40;\n const rc = rough.canvas(canvas);\n\n // 1. Disco Solar Carmesim Descentralizado\n rc.circle(25.5 * s, 14.5 * s, 14.5 * s, {\n stroke: '#C8232C',\n fill: '#C8232C',\n fillStyle: 'solid',\n roughness: 0.25,\n preserveVertices: true,\n seed: 77,\n });\n\n // 2. Círculo Zen Ensō Caligráfico em Nanquim\n const ensoSpine = samplePolarArc(\n 20 * s,\n 20 * s,\n 15.5 * s,\n 15.2 * s,\n -Math.PI * 0.82,\n Math.PI * 0.98,\n 0,\n -0.05,\n 54,\n 0.08,\n 8472\n );\n\n drawSumiKasureRibbon(ctx, {\n spine: ensoSpine,\n maxWidth: 4.8 * s,\n bristleCount: 14,\n dryBrushGap: 0.22,\n taperStart: 0.65,\n taperEnd: 0.98,\n color: '#11100E',\n alpha: 0.96,\n roundHeadCap: true,\n seed: 8472,\n });\n\n // 3. Traço Caligráfico sob o Kanji\n const baseStroke = sampleQuadraticCurve(\n { x: 10 * s, y: 29 * s },\n { x: 20 * s, y: 27 * s },\n { x: 31 * s, y: 28.5 * s },\n 24,\n 0.04,\n 99\n );\n drawSumiKasureRibbon(ctx, {\n spine: baseStroke,\n maxWidth: 2.6 * s,\n bristleCount: 8,\n dryBrushGap: 0.18,\n taperStart: 0.3,\n taperEnd: 0.9,\n color: '#C8232C',\n alpha: 0.9,\n roundHeadCap: true,\n seed: 99,\n });\n\n // 4. Ideograma Japonês 墨 (Sumi: Nanquim)\n ctx.font = `700 ${Math.round(17.5 * s)}px \"Cormorant Garamond\", Georgia, serif`;\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n ctx.fillStyle = '#11100E';\n ctx.fillText('墨', 19.5 * s, 19.5 * s);\n\n ctx.restore();\n }, [size]);\n\n return (\n <canvas\n ref={canvasRef}\n style={{ width: size, height: size }}\n className={`inline-block shrink-0 pointer-events-none select-none ${className}`}\n aria-hidden=\"true\"\n />\n );\n};\n","import React, { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport rough from 'roughjs';\n\nexport type SumiButtonVariant = 'crimson' | 'ink' | 'washi' | 'ghost' | 'outline';\nexport type SumiButtonSize = 'xs' | 'sm' | 'md' | 'lg';\n\nexport interface SumiButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n /** Estilo visual da caixa caligráfica */\n variant?: SumiButtonVariant;\n /** Tamanho e espaçamento interno */\n size?: SumiButtonSize;\n /** Estado ativo para abas e seletores */\n active?: boolean;\n /** Semente determinística para o traço Rough.js */\n seed?: number;\n /** Ocupar 100% da largura disponível */\n fullWidth?: boolean;\n children: React.ReactNode;\n}\n\n// Cache global em memória para evitar recalcular geometria Rough.js para botões de mesmo tamanho/estilo\nconst ROUGH_RECT_CACHE = new Map<string, string[]>();\n\nfunction getRoughRectPaths(\n w: number,\n h: number,\n strokeColor: string,\n innerAccentColor: string | null,\n seed: number\n): { mainPaths: string[]; accentPaths: string[] } {\n const key = `${w}x${h}:${strokeColor}:${innerAccentColor ?? 'none'}:${seed}`;\n const cached = ROUGH_RECT_CACHE.get(key);\n if (cached) {\n return {\n mainPaths: [cached[0] ?? ''],\n accentPaths: cached[1] ? [cached[1]] : [],\n };\n }\n\n if (typeof document === 'undefined' || w < 8 || h < 8) {\n return { mainPaths: [], accentPaths: [] };\n }\n\n const dummySvg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');\n const rc = rough.svg(dummySvg);\n\n // Borda principal mais reta e arquitetônica desenhada com Rough.js\n const mainNode = rc.rectangle(1.5, 1.5, Math.max(4, w - 3), Math.max(4, h - 3), {\n stroke: strokeColor,\n strokeWidth: 1.45,\n roughness: 0.36,\n bowing: 0.28,\n preserveVertices: true,\n seed,\n });\n\n const mainPaths: string[] = [];\n mainNode.querySelectorAll('path').forEach((p) => {\n const d = p.getAttribute('d');\n if (d) mainPaths.push(d);\n });\n\n const accentPaths: string[] = [];\n if (innerAccentColor && w > 24 && h > 20) {\n const innerNode = rc.rectangle(3.5, 3.5, Math.max(4, w - 7), Math.max(4, h - 7), {\n stroke: innerAccentColor,\n strokeWidth: 0.75,\n roughness: 0.25,\n bowing: 0.2,\n preserveVertices: true,\n seed: seed + 17,\n });\n innerNode.querySelectorAll('path').forEach((p) => {\n const d = p.getAttribute('d');\n if (d) accentPaths.push(d);\n });\n }\n\n ROUGH_RECT_CACHE.set(key, [mainPaths.join(' '), accentPaths.join(' ')]);\n return { mainPaths, accentPaths };\n}\n\n/**\n * Componente <SumiButton />\n * Botão retangular de bordas retas desenhadas com Rough.js, inspirado em selos e placas\n * de xilogravura japonesa, com performance instantânea via cache de caminhos SVG.\n */\nexport const SumiButton: React.FC<SumiButtonProps> = ({\n variant = 'washi',\n size = 'md',\n active = false,\n seed = 108,\n fullWidth = false,\n className = '',\n children,\n disabled,\n ...rest\n}) => {\n const btnRef = useRef<HTMLButtonElement | null>(null);\n const [dims, setDims] = useState<{ w: number; h: number }>({ w: 0, h: 0 });\n const [hovered, setHovered] = useState(false);\n\n useLayoutEffect(() => {\n const el = btnRef.current;\n if (!el) return;\n const update = () => {\n const rect = el.getBoundingClientRect();\n const nw = Math.round(rect.width);\n const nh = Math.round(rect.height);\n setDims((prev) => (prev.w === nw && prev.h === nh ? prev : { w: nw, h: nh }));\n };\n update();\n const ro = new ResizeObserver(update);\n ro.observe(el);\n return () => ro.disconnect();\n }, [children, size, fullWidth]);\n\n // Determina cores de fundo, texto e borda Rough.js conforme variante e estado ativo/hover\n const effectiveVariant: SumiButtonVariant = active\n ? variant === 'crimson'\n ? 'crimson'\n : 'ink'\n : variant;\n\n let bgClass = '';\n let textClass = '';\n let strokeColor = '#11100E';\n let innerAccentColor: string | null = null;\n\n if (effectiveVariant === 'crimson') {\n bgClass = hovered && !disabled ? 'bg-[#A81B23]' : 'bg-[#C8232C]';\n textClass = 'text-[#FAF7F0]';\n strokeColor = '#11100E';\n innerAccentColor = 'rgba(250, 247, 240, 0.35)';\n } else if (effectiveVariant === 'ink') {\n bgClass = hovered && !disabled ? 'bg-[#25221F]' : 'bg-[#11100E]';\n textClass = 'text-[#F5F0E6]';\n strokeColor = hovered || active ? '#C8232C' : '#11100E';\n innerAccentColor = 'rgba(245, 240, 230, 0.24)';\n } else if (effectiveVariant === 'washi') {\n bgClass = hovered && !disabled ? 'bg-[#F3EDE0]' : 'bg-[#FAF7F0]/92';\n textClass = 'text-[#11100E]';\n strokeColor = hovered ? '#C8232C' : '#11100E';\n innerAccentColor = hovered ? 'rgba(200, 35, 44, 0.22)' : 'rgba(17, 16, 14, 0.14)';\n } else if (effectiveVariant === 'outline') {\n bgClass = hovered && !disabled ? 'bg-[#11100E]/6' : 'bg-[#F8F4EC]/70';\n textClass = 'text-[#11100E]';\n strokeColor = hovered ? '#C8232C' : '#2C2A27';\n innerAccentColor = null;\n } else {\n // ghost\n bgClass = hovered && !disabled ? 'bg-[#11100E]/8' : 'bg-transparent';\n textClass = 'text-[#11100E]';\n strokeColor = hovered ? '#11100E' : 'rgba(17, 16, 14, 0.38)';\n innerAccentColor = null;\n }\n\n const sizeClasses: Record<SumiButtonSize, string> = {\n xs: 'px-2.5 py-1 text-[11px] gap-1.5 min-h-[28px]',\n sm: 'px-3.5 py-1.5 text-xs gap-2 min-h-[34px]',\n md: 'px-4 py-2.5 text-xs sm:text-sm gap-2.5 min-h-[40px]',\n lg: 'px-5 py-3 text-sm gap-2.5 min-h-[44px]',\n };\n\n const { mainPaths, accentPaths } =\n dims.w > 0 && dims.h > 0\n ? getRoughRectPaths(dims.w, dims.h, strokeColor, innerAccentColor, seed)\n : { mainPaths: [], accentPaths: [] };\n\n return (\n <button\n ref={btnRef}\n disabled={disabled}\n onMouseEnter={(e) => {\n setHovered(true);\n rest.onMouseEnter?.(e);\n }}\n onMouseLeave={(e) => {\n setHovered(false);\n rest.onMouseLeave?.(e);\n }}\n className={`relative inline-flex items-center justify-center font-medium rounded-[2px] transition-colors duration-150 select-none cursor-pointer disabled:opacity-50 disabled:pointer-events-none ${\n fullWidth ? 'w-full' : ' shrink-0'\n } ${bgClass} ${textClass} ${sizeClasses[size]} ${className}`}\n {...rest}\n >\n {/* Borda reta orgânica desenhada com Rough.js */}\n {dims.w > 0 && dims.h > 0 && (\n <svg\n width={dims.w}\n height={dims.h}\n viewBox={`0 0 ${dims.w} ${dims.h}`}\n className=\"absolute inset-0 w-full h-full pointer-events-none overflow-visible\"\n aria-hidden=\"true\"\n >\n {accentPaths.map((d, i) => (\n <path\n key={`acc-${i}`}\n d={d}\n fill=\"none\"\n stroke={innerAccentColor ?? strokeColor}\n strokeWidth={0.8}\n strokeLinecap=\"square\"\n />\n ))}\n {mainPaths.map((d, i) => (\n <path\n key={`main-${i}`}\n d={d}\n fill=\"none\"\n stroke={strokeColor}\n strokeWidth={1.45}\n strokeLinecap=\"square\"\n />\n ))}\n </svg>\n )}\n <span className=\"relative z-10 inline-flex items-center justify-center gap-2 whitespace-nowrap\">\n {children}\n </span>\n </button>\n );\n};\n\nexport interface SumiRoughBoxProps extends React.HTMLAttributes<HTMLDivElement> {\n strokeColor?: string;\n innerAccentColor?: string | null;\n seed?: number;\n children: React.ReactNode;\n}\n\n/**\n * Container retangular com borda reta desenhada por Rough.js (ideal para barras de comando, grupos de abas e selos).\n */\nexport const SumiRoughBox: React.FC<SumiRoughBoxProps> = ({\n strokeColor = '#11100E',\n innerAccentColor = 'rgba(17, 16, 14, 0.14)',\n seed = 303,\n className = '',\n children,\n ...rest\n}) => {\n const boxRef = useRef<HTMLDivElement | null>(null);\n const [dims, setDims] = useState<{ w: number; h: number }>({ w: 0, h: 0 });\n\n useEffect(() => {\n const el = boxRef.current;\n if (!el) return;\n const update = () => {\n const rect = el.getBoundingClientRect();\n const nw = Math.round(rect.width);\n const nh = Math.round(rect.height);\n setDims((prev) => (prev.w === nw && prev.h === nh ? prev : { w: nw, h: nh }));\n };\n update();\n const ro = new ResizeObserver(update);\n ro.observe(el);\n return () => ro.disconnect();\n }, []);\n\n const { mainPaths, accentPaths } =\n dims.w > 0 && dims.h > 0\n ? getRoughRectPaths(dims.w, dims.h, strokeColor, innerAccentColor, seed)\n : { mainPaths: [], accentPaths: [] };\n\n return (\n <div ref={boxRef} className={`relative rounded-[2px] ${className}`} {...rest}>\n {dims.w > 0 && dims.h > 0 && (\n <svg\n width={dims.w}\n height={dims.h}\n viewBox={`0 0 ${dims.w} ${dims.h}`}\n className=\"absolute inset-0 w-full h-full pointer-events-none overflow-visible z-20\"\n aria-hidden=\"true\"\n >\n {accentPaths.map((d, i) => (\n <path\n key={`acc-${i}`}\n d={d}\n fill=\"none\"\n stroke={innerAccentColor ?? strokeColor}\n strokeWidth={0.75}\n strokeLinecap=\"square\"\n />\n ))}\n {mainPaths.map((d, i) => (\n <path\n key={`main-${i}`}\n d={d}\n fill=\"none\"\n stroke={strokeColor}\n strokeWidth={1.35}\n strokeLinecap=\"square\"\n />\n ))}\n </svg>\n )}\n {children}\n </div>\n );\n};\n","import React, { useEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\n\nexport type TooltipPlacement = 'top' | 'bottom' | 'left' | 'right';\n\nexport interface JapaneseCalligraphyProps {\n /** Caracteres em Japonês (Kanji) */\n jp: string;\n /** Leitura Romaji opcional */\n romaji?: string;\n /** Significado auspicioso em Português-Brasileiro exibido no modal/tooltip ao passar o mouse */\n pt: string;\n /** Estilo visual: selo vermelho Hanko, caligrafia vertical Tategaki ou texto inline */\n variant?: 'hanko' | 'tategaki' | 'inline';\n /** Direção controlada onde o modal/tooltip de tradução deve aparecer */\n tooltipPlacement?: TooltipPlacement;\n className?: string;\n}\n\n/**\n * Componente <JapaneseCalligraphy /> — Mantém os ideogramas japoneses intactos no layout\n * e exibe a tradução em Português-Brasileiro dentro de um pequeno modal/tooltip flutuante\n * com direção controlada (top, bottom, left, right) e proteção automática contra fuga da tela.\n */\nexport const JapaneseCalligraphy: React.FC<JapaneseCalligraphyProps> = ({\n jp,\n romaji,\n pt,\n variant = 'inline',\n tooltipPlacement = 'top',\n className = '',\n}) => {\n const [hovered, setHovered] = useState(false);\n const triggerRef = useRef<HTMLSpanElement | null>(null);\n const [coords, setCoords] = useState<{\n top: number;\n left: number;\n effectivePlacement: TooltipPlacement;\n }>({\n top: 0,\n left: 0,\n effectivePlacement: tooltipPlacement,\n });\n\n const updateTooltipPosition = () => {\n const el = triggerRef.current;\n if (!el) return;\n const rect = el.getBoundingClientRect();\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n\n const modalWidth = 248;\n const modalHeight = 86;\n const gap = 10;\n const safeMargin = 12;\n\n let finalPlacement: TooltipPlacement = tooltipPlacement;\n\n // Inverte automaticamente caso o local escolhido fique fora da janela visível\n if (finalPlacement === 'top' && rect.top - modalHeight - gap < safeMargin) {\n finalPlacement = 'bottom';\n } else if (finalPlacement === 'bottom' && rect.bottom + modalHeight + gap > vh - safeMargin) {\n finalPlacement = 'top';\n } else if (finalPlacement === 'left' && rect.left - modalWidth - gap < safeMargin) {\n finalPlacement = 'right';\n } else if (finalPlacement === 'right' && rect.right + modalWidth + gap > vw - safeMargin) {\n finalPlacement = 'left';\n }\n\n let top = 0;\n let left = 0;\n\n if (finalPlacement === 'top') {\n top = rect.top - modalHeight - gap;\n left = rect.left + rect.width / 2 - modalWidth / 2;\n } else if (finalPlacement === 'bottom') {\n top = rect.bottom + gap;\n left = rect.left + rect.width / 2 - modalWidth / 2;\n } else if (finalPlacement === 'left') {\n top = rect.top + rect.height / 2 - modalHeight / 2;\n left = rect.left - modalWidth - gap;\n } else {\n top = rect.top + rect.height / 2 - modalHeight / 2;\n left = rect.right + gap;\n }\n\n // Clamping rigoroso nas bordas da tela para jamais escapar da viewport\n left = Math.max(safeMargin, Math.min(vw - modalWidth - safeMargin, left));\n top = Math.max(safeMargin, Math.min(vh - modalHeight - safeMargin, top));\n\n setCoords({ top, left, effectivePlacement: finalPlacement });\n };\n\n useEffect(() => {\n if (!hovered) return;\n updateTooltipPosition();\n const onScrollOrResize = () => updateTooltipPosition();\n window.addEventListener('scroll', onScrollOrResize, true);\n window.addEventListener('resize', onScrollOrResize);\n return () => {\n window.removeEventListener('scroll', onScrollOrResize, true);\n window.removeEventListener('resize', onScrollOrResize);\n };\n }, [hovered, tooltipPlacement]);\n\n const handleEnter = () => {\n updateTooltipPosition();\n setHovered(true);\n };\n\n const handleLeave = () => {\n setHovered(false);\n };\n\n const tooltipPortal =\n hovered && typeof document !== 'undefined'\n ? createPortal(\n <div\n role=\"tooltip\"\n style={{\n position: 'fixed',\n top: coords.top,\n left: coords.left,\n width: 248,\n zIndex: 9999,\n }}\n className=\"pointer-events-none rounded-xl border border-[#C8232C]/45 bg-[#161412]/96 backdrop-blur-md text-[#F4EFE6] p-3 shadow-xl transition-opacity duration-150\"\n >\n <div className=\"flex items-center justify-between gap-2 pb-1.5 mb-1.5 border-b border-[#F4EFE6]/12\">\n <div className=\"flex items-center gap-2\">\n <span className=\"inline-flex items-center justify-center px-1.5 py-0.5 rounded bg-[#C8232C] text-white text-xs font-editorial font-bold leading-none\">\n {jp}\n </span>\n {romaji && (\n <span className=\"text-[11px] font-medium text-[#E5B8B8] italic\">\n {romaji}\n </span>\n )}\n </div>\n <span className=\"text-[10px] text-[#A69F93] font-tabular\">PT-BR</span>\n </div>\n <p className=\"text-xs leading-snug font-sans text-[#F4EFE6]\">{pt}</p>\n </div>,\n document.body\n )\n : null;\n\n const handleToggleTap = () => {\n updateTooltipPosition();\n setHovered((prev) => !prev);\n };\n\n if (variant === 'hanko') {\n return (\n <>\n <span\n ref={triggerRef}\n onMouseEnter={handleEnter}\n onMouseLeave={handleLeave}\n onClick={handleToggleTap}\n className={`relative inline-flex items-center justify-center whitespace-nowrap shrink-0 cursor-help select-none transition-transform duration-200 ${\n hovered ? 'scale-105' : ''\n } ${className}`}\n >\n <span\n style={{\n border: '2px solid #C8232C',\n boxShadow: 'inset 0 0 0 1px rgba(200, 35, 44, 0.25)',\n letterSpacing: '0.08em',\n }}\n className={`hanko-seal px-2 py-0.5 text-xs font-bold font-editorial whitespace-nowrap transition-colors duration-200 ${\n hovered\n ? 'bg-[#C8232C] text-[#FAF8F5]'\n : 'bg-[#F2EDE2]/90 text-[#C8232C]'\n }`}\n >\n {jp}\n </span>\n </span>\n {tooltipPortal}\n </>\n );\n }\n\n if (variant === 'tategaki') {\n return (\n <>\n <span\n ref={triggerRef}\n onMouseEnter={handleEnter}\n onMouseLeave={handleLeave}\n onClick={handleToggleTap}\n className={`relative inline-flex flex-col items-center shrink-0 cursor-help select-none ${className}`}\n >\n <span\n style={{\n writingMode: 'vertical-rl',\n textOrientation: 'upright',\n }}\n className={`tategaki font-editorial tracking-widest transition-colors duration-200 px-1.5 py-2 rounded-lg border ${\n hovered\n ? 'text-[#C8232C] border-[#C8232C]/50 bg-[#C8232C]/8'\n : 'text-[#3F3D39] border-transparent'\n }`}\n >\n {jp}\n </span>\n </span>\n {tooltipPortal}\n </>\n );\n }\n\n return (\n <>\n <span\n ref={triggerRef}\n onMouseEnter={handleEnter}\n onMouseLeave={handleLeave}\n onClick={handleToggleTap}\n className={`relative inline-flex items-center gap-1 whitespace-nowrap shrink-0 border-b border-dotted border-[#C8232C]/70 cursor-help select-none transition-colors duration-200 ${\n hovered ? 'text-[#C8232C]' : ''\n } ${className}`}\n >\n <span className=\"font-editorial font-semibold text-sm whitespace-nowrap\">{jp}</span>\n </span>\n {tooltipPortal}\n </>\n );\n};\n\n","import React, { useCallback, useEffect, useRef } from 'react';\nimport { createSeededRandom, fbmNoise2D, mixHex, rgbaStr } from '../math';\nimport { SANSUI_THEMES } from '../presets';\nimport { SansuiColors, SansuiComposition, SansuiThemeId } from '../types';\n\nexport interface SumiSansuiProps {\n /** Semente determinística Mulberry32: cada número gera uma paisagem única e reproduzível */\n seed?: number;\n /** Estilo de composição clássica Sansui (山水) */\n composition?: SansuiComposition;\n /** Tema pronto de cores (inclui Modo Noturno 'night_obsidian', 'jade_mineral', 'classic_washi' ou 'auto') */\n theme?: SansuiThemeId;\n /** Sobrescrita livre de cores (permite passar as cores da marca ou do tema do usuário) */\n colors?: Partial<SansuiColors>;\n /** Atalho para cor de fundo do papel/céu */\n backgroundColor?: string;\n /** Atalho para cor principal do nanquim / traços */\n inkColor?: string;\n /** Atalho para cor da aguada mineral das montanhas */\n washColor?: string;\n /** Quantidade de planos de montanhas (3 a 8) */\n ridgeLayers?: number;\n /** Densidade de pinheiros e árvores nas encostas (0.0 a 2.0) */\n treeDensity?: number;\n /** Intensidade da neblina entre os vales (0.0 a 1.5) */\n mistDensity?: number;\n /** Exibe o pescador solitário em seu barco (sampan) */\n showBoat?: boolean;\n /** Ativa o movimento sutil da água, da neblina e do barco */\n animated?: boolean;\n /** Referência opcional para exportar a pintura gerada em PNG de alta definição */\n actionsRef?: React.MutableRefObject<{\n exportPng: (filename?: string) => void;\n } | null>;\n /** Classe CSS adicional */\n className?: string;\n}\n\ninterface MountainRidgeSpec {\n /** Posição horizontal central (0.0 a 1.0 da largura) */\n centerX: number;\n /** Largura total da base (em fração da largura w) */\n spanW: number;\n /** Altura do pico a partir do topo (0.0 = topo da tela, 1.0 = base) */\n peakY: number;\n /** Linha de base onde a montanha encontra a água ou neblina (0.0 a 1.0) */\n baseY: number;\n /** Agudeza do pico: > 1.4 cria torres Karst verticais; < 0.9 cria colinas suaves */\n sharpness: number;\n /** Achatamento de topo para ilhas distantes (0.0 a 1.0) */\n plateau?: number;\n /** Assimetria da encosta (-0.5 a +0.5) */\n skew?: number;\n /** Profundidade atmosférica: 0.0 = muito distante na neblina, 1.0 = primeiro plano nítido */\n depth: number;\n /** Densidade de hachuras Cunfa (皴法) de textura de rocha */\n cunfaDensity: number;\n /** Estilo de árvores nesta cadeia ('pines' | 'foliage' | 'distant_dots' | 'none') */\n treeStyle: 'pines' | 'foliage' | 'distant_dots' | 'none';\n /** Semente local da montanha */\n seed: number;\n}\n\nfunction isDarkHex(hex: string): boolean {\n const clean = hex.replace('#', '').trim();\n if (clean.length < 6) return false;\n const r = parseInt(clean.slice(0, 2), 16) || 0;\n const g = parseInt(clean.slice(2, 4), 16) || 0;\n const b = parseInt(clean.slice(4, 6), 16) || 0;\n const lum = (0.299 * r + 0.587 * g + 0.114 * b) / 255;\n return lum < 0.32;\n}\n\n/**\n * Resolve a paleta final combinando o tema escolhido, variáveis CSS (se 'auto') e cores customizadas\n */\nfunction resolveSansuiColors(\n theme: SansuiThemeId,\n customColors?: Partial<SansuiColors>,\n bgOverride?: string,\n inkOverride?: string,\n washOverride?: string\n): { resolved: SansuiColors; isDark: boolean } {\n let basePreset = SANSUI_THEMES.classic_washi;\n\n if (theme === 'auto' && typeof window !== 'undefined') {\n const htmlDark = document.documentElement.classList.contains('dark');\n basePreset = htmlDark ? SANSUI_THEMES.night_obsidian : SANSUI_THEMES.classic_washi;\n const style = getComputedStyle(document.documentElement);\n const cssBg = style.getPropertyValue('--sumi-bg').trim();\n const cssInk = style.getPropertyValue('--sumi-ink').trim();\n const cssWash = style.getPropertyValue('--sumi-wash').trim();\n const cssMist = style.getPropertyValue('--sumi-mist').trim();\n const cssAccent = style.getPropertyValue('--sumi-accent').trim();\n\n const resolved: SansuiColors = {\n background: bgOverride || customColors?.background || cssBg || basePreset.colors.background,\n ink: inkOverride || customColors?.ink || cssInk || basePreset.colors.ink,\n wash: washOverride || customColors?.wash || cssWash || basePreset.colors.wash,\n mist:\n customColors?.mist ||\n cssMist ||\n bgOverride ||\n customColors?.background ||\n basePreset.colors.mist,\n accent: customColors?.accent || cssAccent || basePreset.colors.accent,\n };\n return { resolved, isDark: isDarkHex(resolved.background) };\n }\n\n if (theme !== 'auto' && SANSUI_THEMES[theme]) {\n basePreset = SANSUI_THEMES[theme];\n }\n\n const background = bgOverride || customColors?.background || basePreset.colors.background;\n const ink = inkOverride || customColors?.ink || basePreset.colors.ink;\n const wash = washOverride || customColors?.wash || basePreset.colors.wash;\n const mist = customColors?.mist || bgOverride || customColors?.background || basePreset.colors.mist;\n const accent = customColors?.accent || basePreset.colors.accent;\n\n return {\n resolved: { background, ink, wash, mist, accent },\n isDark: isDarkHex(background),\n };\n}\n\n/**\n * Desenha um pinheiro oriental Sansui (松) com tronco caligráfico e patamares de agulhas horizontais\n */\nfunction drawSansuiPineTree(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n height: number,\n scale: number,\n inkColor: string,\n washColor: string,\n alpha: number,\n seed: number\n) {\n const rand = createSeededRandom(seed);\n const lean = (rand() - 0.5) * height * 0.24;\n const topX = x + lean;\n const topY = y - height;\n\n ctx.save();\n // Tronco principal\n ctx.beginPath();\n ctx.moveTo(x, y + 2 * scale);\n ctx.quadraticCurveTo(x + lean * 0.35, y - height * 0.52, topX, topY);\n ctx.strokeStyle = rgbaStr(inkColor, alpha * 0.92);\n ctx.lineWidth = Math.max(0.8, height * 0.068);\n ctx.lineCap = 'round';\n ctx.stroke();\n\n // Patamares horizontais de agulhas/folhagem\n const tiers = Math.max(3, Math.min(7, Math.floor(height / (5.5 * scale)) + 2));\n for (let t = 0; t < tiers; t++) {\n const u = t / Math.max(1, tiers - 1);\n const ty = topY + u * height * 0.68;\n const tx = topX - lean * u * 0.55 + (rand() - 0.5) * 2.5 * scale;\n const tierSpan = height * (0.24 + Math.sin(u * Math.PI * 0.85) * 0.28) * (0.8 + rand() * 0.35);\n\n // Sombra aguada suave atrás do patamar\n ctx.beginPath();\n ctx.ellipse(\n tx,\n ty,\n tierSpan * 0.58,\n Math.max(1.2, height * 0.065),\n 0,\n 0,\n Math.PI * 2\n );\n ctx.fillStyle = rgbaStr(washColor, alpha * 0.34);\n ctx.fill();\n\n // Traços caligráficos de agulhas\n ctx.beginPath();\n ctx.moveTo(tx - tierSpan * 0.55, ty + (rand() - 0.5) * 1.5 * scale);\n ctx.quadraticCurveTo(tx, ty - 1.6 * scale, tx + tierSpan * 0.55, ty + (rand() - 0.5) * 1.5 * scale);\n ctx.strokeStyle = rgbaStr(inkColor, alpha * 0.94);\n ctx.lineWidth = Math.max(0.9, height * 0.062);\n ctx.stroke();\n }\n\n ctx.restore();\n}\n\n/**\n * Desenha as árvores retorcidas de promontório com folhagem em gotas de tinta (como no canto direito da referência)\n */\nfunction drawSansuiPromontoryTrees(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n height: number,\n scale: number,\n inkColor: string,\n washColor: string,\n alpha: number,\n seed: number\n) {\n const rand = createSeededRandom(seed);\n ctx.save();\n ctx.lineCap = 'round';\n ctx.lineJoin = 'round';\n\n // 1. Árvore seca retorcida à esquerda\n const bareX = x - height * 0.32;\n const bareY = y + height * 0.06;\n const bareH = height * 0.78;\n ctx.beginPath();\n ctx.moveTo(bareX, bareY + 4 * scale);\n ctx.quadraticCurveTo(bareX - bareH * 0.12, bareY - bareH * 0.48, bareX - bareH * 0.24, bareY - bareH);\n ctx.moveTo(bareX - bareH * 0.1, bareY - bareH * 0.55);\n ctx.lineTo(bareX - bareH * 0.38, bareY - bareH * 0.78);\n ctx.moveTo(bareX - bareH * 0.14, bareY - bareH * 0.68);\n ctx.lineTo(bareX + bareH * 0.08, bareY - bareH * 0.88);\n ctx.strokeStyle = rgbaStr(inkColor, alpha * 0.92);\n ctx.lineWidth = Math.max(1.2, height * 0.048);\n ctx.stroke();\n\n // 2. Duas árvores altas com copa em manchas circulares de nanquim (Dianfa)\n for (let treeIdx = 0; treeIdx < 2; treeIdx++) {\n const tx = x + treeIdx * height * 0.28;\n const ty = y + treeIdx * height * 0.05;\n const th = height * (treeIdx === 0 ? 1.02 : 0.88);\n const crownX = tx + (treeIdx === 0 ? 0.08 : 0.15) * th;\n const crownY = ty - th;\n\n ctx.beginPath();\n ctx.moveTo(tx, ty + 5 * scale);\n ctx.quadraticCurveTo(tx - th * 0.06, ty - th * 0.5, crownX, crownY);\n ctx.strokeStyle = rgbaStr(inkColor, alpha * 0.95);\n ctx.lineWidth = Math.max(1.3, th * 0.052);\n ctx.stroke();\n\n // Galho secundário\n ctx.beginPath();\n ctx.moveTo(tx - th * 0.02, ty - th * 0.58);\n ctx.lineTo(crownX + th * 0.18, crownY + th * 0.16);\n ctx.lineWidth = Math.max(0.9, th * 0.035);\n ctx.stroke();\n\n // Manchas de folhagem em 2 tons (aguada média e nanquim denso)\n const blobCount = 7;\n for (let b = 0; b < blobCount; b++) {\n const ang = (b / blobCount) * Math.PI * 2 + rand() * 0.5;\n const dist = th * (0.06 + rand() * 0.22);\n const bx = crownX + Math.cos(ang) * dist;\n const by = crownY + Math.sin(ang) * dist * 0.68;\n const br = Math.max(1.8, th * (0.055 + rand() * 0.045));\n const isDarkBlob = b % 2 === 0;\n\n ctx.beginPath();\n ctx.arc(bx, by, br, 0, Math.PI * 2);\n ctx.fillStyle = rgbaStr(\n isDarkBlob ? inkColor : washColor,\n alpha * (isDarkBlob ? 0.86 : 0.52)\n );\n ctx.fill();\n }\n }\n\n ctx.restore();\n}\n\n/**\n * Renderiza uma massa montanhosa completa com:\n * 1. Aguada atmosférica vertical + dissolução na neblina da base\n * 2. Fissuras e hachuras internas de rocha Cunfa (皴法)\n * 3. Contorno caligráfico de largura variável na crista\n * 4. Vegetação (pinheiros, árvores de promontório ou pontos de musgo Dian-tai)\n */\nfunction renderSansuiMountainRidge(\n ctx: CanvasRenderingContext2D,\n w: number,\n h: number,\n scale: number,\n spec: MountainRidgeSpec,\n colors: SansuiColors,\n isDark: boolean,\n treeDensity: number,\n mistDensity: number\n) {\n const rand = createSeededRandom(spec.seed);\n const startX = (spec.centerX - spec.spanW * 0.5) * w;\n const endX = (spec.centerX + spec.spanW * 0.5) * w;\n const peakY = spec.peakY * h;\n const baseY = spec.baseY * h;\n const maxAmplitude = Math.max(12, baseY - peakY);\n const steps = Math.max(48, Math.min(130, Math.floor((endX - startX) / (4 * scale))));\n\n const ridgePts: { x: number; y: number; u: number; env: number }[] = [];\n\n for (let i = 0; i <= steps; i++) {\n const u = i / steps; // 0..1\n const x = startX + u * (endX - startX);\n const skewU = Math.max(0, Math.min(1, u + (spec.skew || 0) * Math.sin(u * Math.PI)));\n const bell = Math.sin(skewU * Math.PI);\n let env = Math.pow(Math.max(0, bell), spec.sharpness);\n\n if (spec.plateau && spec.plateau > 0) {\n const cap = 1 - spec.plateau * 0.42;\n env = Math.min(cap, env) / cap;\n }\n\n // Modulação fractal FBM 2D para criar sub-picos, ombros rochosos e escarpas naturais\n const n1 = fbmNoise2D(u * 3.6, spec.seed * 0.013, spec.seed);\n const n2 = fbmNoise2D(u * 9.5, spec.seed * 0.029, spec.seed + 71);\n const noiseMod = 0.72 + (n1 - 0.35) * 0.52 + (n2 - 0.5) * 0.16;\n\n const elevation = maxAmplitude * env * Math.max(0.12, noiseMod);\n const y = baseY - elevation;\n ridgePts.push({ x, y, u, env });\n }\n\n // Encontra o ponto mais alto real da crista\n let highestPt = ridgePts[0];\n for (const pt of ridgePts) {\n if (pt.y < highestPt.y) highestPt = pt;\n }\n\n ctx.save();\n\n // =========================================================================\n // PASSO 1: POLÍGONO DE AGUADA ATMOSFÉRICA & DISSOLUÇÃO EM NEBLINA NA BASE\n // =========================================================================\n ctx.beginPath();\n ctx.moveTo(startX, baseY + 6 * scale);\n for (const pt of ridgePts) {\n ctx.lineTo(pt.x, pt.y);\n }\n ctx.lineTo(endX, baseY + 6 * scale);\n ctx.closePath();\n\n const grad = ctx.createLinearGradient(0, highestPt.y, 0, baseY + 4 * scale);\n const washAlpha = (0.14 + spec.depth * 0.42) * (isDark ? 1.35 : 1.0);\n const mistStop = Math.max(0.52, Math.min(0.95, 0.92 - mistDensity * 0.18));\n\n if (isDark) {\n // No Modo Noturno (Night Obsidian), o corpo da montanha tem um leve brilho lunar no topo\n // e escurece até fundir-se à neblina noturna na base\n const topTint = mixHex(colors.wash, colors.ink, 0.16 * spec.depth);\n grad.addColorStop(0.0, rgbaStr(topTint, Math.min(0.95, washAlpha + 0.25)));\n grad.addColorStop(mistStop * 0.65, rgbaStr(colors.wash, Math.min(0.9, washAlpha * 0.85)));\n grad.addColorStop(1.0, rgbaStr(colors.mist, 0.96));\n } else {\n const topTint = mixHex(colors.wash, colors.ink, 0.18 * spec.depth);\n grad.addColorStop(0.0, rgbaStr(topTint, washAlpha));\n grad.addColorStop(mistStop * 0.6, rgbaStr(colors.wash, washAlpha * 0.58));\n grad.addColorStop(mistStop, rgbaStr(colors.mist, 0.85));\n grad.addColorStop(1.0, rgbaStr(colors.mist, 0.98));\n }\n\n ctx.fillStyle = grad;\n ctx.fill();\n\n // =========================================================================\n // PASSO 2: HACHURAS DE ROCHA CUNFA (皴法) RECORTADAS DENTRO DA MONTANHA\n // =========================================================================\n if (spec.cunfaDensity > 0.05 && spec.depth > 0.22) {\n ctx.save();\n ctx.clip();\n\n const strokeCount = Math.floor(\n (14 + spec.spanW * 28) * spec.cunfaDensity * (0.55 + spec.depth * 0.65)\n );\n\n for (let c = 0; c < strokeCount; c++) {\n const idx = Math.floor((0.08 + rand() * 0.84) * (ridgePts.length - 1));\n const anchor = ridgePts[idx];\n if (!anchor || anchor.env < 0.14) continue;\n\n const localSlopeH = baseY - anchor.y;\n if (localSlopeH < 10 * scale) continue;\n\n const startOffsetY = localSlopeH * (0.03 + rand() * 0.38);\n const sx = anchor.x + (rand() - 0.5) * 14 * scale;\n const sy = anchor.y + startOffsetY;\n const lenY = localSlopeH * (0.22 + rand() * 0.48);\n\n // Direção da fissura acompanha a inclinação da montanha em direção ao centro ou à borda\n const centerDir = anchor.u < 0.5 ? -1 : 1;\n const driftX =\n spec.sharpness > 1.35\n ? centerDir * (4 + rand() * 14) * scale\n : centerDir * (12 + rand() * 28) * scale;\n\n ctx.beginPath();\n ctx.moveTo(sx, sy);\n ctx.bezierCurveTo(\n sx + driftX * 0.35 + (rand() - 0.5) * 6 * scale,\n sy + lenY * 0.35,\n sx + driftX * 0.7 - (rand() - 0.5) * 6 * scale,\n sy + lenY * 0.72,\n sx + driftX,\n sy + lenY\n );\n\n const cunfaAlpha = (0.14 + spec.depth * 0.32) * (0.5 + rand() * 0.6);\n ctx.strokeStyle = rgbaStr(colors.ink, cunfaAlpha);\n ctx.lineWidth = (0.55 + rand() * 0.95) * scale;\n ctx.lineCap = 'round';\n ctx.stroke();\n\n // Nas montanhas mais próximas, adiciona sub-arestas internas (cristas secundárias)\n if (c % 5 === 0 && spec.depth > 0.55) {\n ctx.beginPath();\n ctx.moveTo( anchor.x, anchor.y + 1.5 * scale );\n ctx.quadraticCurveTo(\n anchor.x + driftX * 0.45,\n anchor.y + lenY * 0.42,\n anchor.x + driftX * 0.85,\n anchor.y + lenY * 0.82\n );\n ctx.strokeStyle = rgbaStr(colors.ink, cunfaAlpha * 1.25);\n ctx.lineWidth = (0.9 + rand() * 0.9) * scale;\n ctx.stroke();\n }\n }\n\n ctx.restore();\n }\n\n // =========================================================================\n // PASSO 3: CONTORNO CALIGRÁFICO DE LARGURA VARIÁVEL NA CRISTA SUPERIOR\n // =========================================================================\n if (spec.depth > 0.18) {\n const ridgeAlpha = Math.min(0.98, 0.22 + spec.depth * 0.76);\n const maxStrokeW = (1.1 + spec.depth * 2.4) * scale;\n\n for (let i = 0; i < ridgePts.length - 1; i++) {\n const p0 = ridgePts[i];\n const p1 = ridgePts[i + 1];\n // A linha de contorno desaparece suavemente ao tocar a base de neblina\n const edgeFade = Math.sin(p0.u * Math.PI);\n if (edgeFade < 0.04) continue;\n\n const noiseThick = 0.75 + 0.5 * fbmNoise2D(p0.u * 12, spec.seed * 0.07, spec.seed + 303);\n const wSeg = Math.max(0.45 * scale, maxStrokeW * Math.pow(edgeFade, 0.65) * noiseThick);\n\n ctx.beginPath();\n ctx.moveTo(p0.x, p0.y);\n ctx.lineTo(p1.x, p1.y);\n ctx.strokeStyle = rgbaStr(colors.ink, ridgeAlpha * Math.min(1, edgeFade * 1.6));\n ctx.lineWidth = wSeg;\n ctx.lineCap = 'round';\n ctx.stroke();\n }\n }\n\n // =========================================================================\n // PASSO 4: PINHEIROS, ÁRVORES DE PROMONTÓRIO & PONTOS DE MUSGO (DIANTAI)\n // =========================================================================\n if (spec.treeStyle !== 'none' && treeDensity > 0.05) {\n if (spec.treeStyle === 'foliage') {\n // Árvores grandes em primeiro plano (estilo promontório)\n const anchorIdx = Math.floor(ridgePts.length * 0.46);\n const anchor = ridgePts[anchorIdx];\n if (anchor) {\n drawSansuiPromontoryTrees(\n ctx,\n anchor.x,\n anchor.y + 8 * scale,\n Math.min(72 * scale, maxAmplitude * 1.15),\n scale,\n colors.ink,\n colors.wash,\n 0.95,\n spec.seed + 501\n );\n }\n } else if (spec.treeStyle === 'pines') {\n const pineCount = Math.max(\n 1,\n Math.floor((3 + spec.spanW * 8) * treeDensity * (0.5 + spec.depth * 0.7))\n );\n for (let p = 0; p < pineCount; p++) {\n const idx = Math.floor((0.15 + rand() * 0.7) * (ridgePts.length - 1));\n const pt = ridgePts[idx];\n if (!pt || pt.env < 0.22) continue;\n\n const pineH = (9 + rand() * 16 * spec.depth) * scale;\n drawSansuiPineTree(\n ctx,\n pt.x,\n pt.y + (rand() * 5 + 1) * scale,\n pineH,\n scale,\n colors.ink,\n colors.wash,\n Math.min(0.96, 0.45 + spec.depth * 0.55),\n spec.seed + 700 + p * 29\n );\n }\n } else if (spec.treeStyle === 'distant_dots') {\n // Pequenos arbustos e árvores distantes ao longo da crista da ilha\n const dotCount = Math.floor(12 * treeDensity);\n for (let d = 0; d < dotCount; d++) {\n const idx = Math.floor((0.18 + rand() * 0.64) * (ridgePts.length - 1));\n const pt = ridgePts[idx];\n if (!pt || pt.env < 0.25) continue;\n const hTick = (2.5 + rand() * 3.8) * scale;\n ctx.beginPath();\n ctx.moveTo(pt.x, pt.y + 0.5 * scale);\n ctx.lineTo(pt.x + (rand() - 0.5) * 1.5 * scale, pt.y - hTick);\n ctx.strokeStyle = rgbaStr(colors.ink, 0.55 * spec.depth);\n ctx.lineWidth = 0.85 * scale;\n ctx.stroke();\n\n ctx.beginPath();\n ctx.arc(pt.x, pt.y - hTick, (1.1 + rand() * 1.2) * scale, 0, Math.PI * 2);\n ctx.fillStyle = rgbaStr(colors.ink, 0.5 * spec.depth);\n ctx.fill();\n }\n }\n }\n\n ctx.restore();\n}\n\n/**\n * Desenha o barco solitário (Sampan · 孤舟) com pescador de chapéu de bambu e vara\n */\nfunction drawSansuiSampanBoat(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n size: number,\n inkColor: string,\n alpha: number\n) {\n ctx.save();\n ctx.translate(x, y);\n\n // Casco curvo caligráfico da canoa\n ctx.beginPath();\n ctx.moveTo(-size * 0.95, -size * 0.12);\n ctx.quadraticCurveTo(0, size * 0.24, size * 0.98, -size * 0.16);\n ctx.quadraticCurveTo(0, size * 0.08, -size * 0.95, -size * 0.12);\n ctx.fillStyle = rgbaStr(inkColor, alpha * 0.94);\n ctx.fill();\n\n // Pescador em pé com chapéu cônico (笠)\n const personX = -size * 0.12;\n ctx.beginPath();\n ctx.moveTo(personX, size * 0.02);\n ctx.lineTo(personX + size * 0.04, -size * 0.52);\n ctx.strokeStyle = rgbaStr(inkColor, alpha * 0.92);\n ctx.lineWidth = Math.max(1.1, size * 0.11);\n ctx.lineCap = 'round';\n ctx.stroke();\n\n // Chapéu de bambu\n ctx.beginPath();\n ctx.moveTo(personX - size * 0.2, -size * 0.48);\n ctx.lineTo(personX + size * 0.05, -size * 0.66);\n ctx.lineTo(personX + size * 0.26, -size * 0.48);\n ctx.closePath();\n ctx.fillStyle = rgbaStr(inkColor, alpha * 0.94);\n ctx.fill();\n\n // Remo / vara de bambu inclinada\n ctx.beginPath();\n ctx.moveTo(personX + size * 0.22, -size * 0.42);\n ctx.lineTo(-size * 0.48, size * 0.22);\n ctx.strokeStyle = rgbaStr(inkColor, alpha * 0.72);\n ctx.lineWidth = Math.max(0.65, size * 0.055);\n ctx.stroke();\n\n // Reflexo sutil sob o casco\n for (let r = 0; r < 2; r++) {\n const ry = size * (0.22 + r * 0.14);\n const rw = size * (0.65 - r * 0.2);\n ctx.beginPath();\n ctx.moveTo(-rw, ry);\n ctx.lineTo(rw, ry);\n ctx.strokeStyle = rgbaStr(inkColor, alpha * (0.28 - r * 0.1));\n ctx.lineWidth = Math.max(0.5, size * 0.045);\n ctx.stroke();\n }\n\n ctx.restore();\n}\n\n/**\n * Gera a lista de cadeias montanhosas de acordo com a composição escolhida e a seed\n */\nfunction buildCompositionRidges(\n composition: SansuiComposition,\n seed: number,\n ridgeLayers: number\n): MountainRidgeSpec[] {\n const rand = createSeededRandom(seed);\n const ridges: MountainRidgeSpec[] = [];\n\n if (composition === 'panoramic_river') {\n // 1. Silhuetas muito distantes na neblina ao fundo (direita e esquerda)\n ridges.push({\n centerX: 0.71 + (rand() - 0.5) * 0.06,\n spanW: 0.42,\n peakY: 0.22 + rand() * 0.05,\n baseY: 0.37,\n sharpness: 0.95,\n skew: 0.15,\n depth: 0.16,\n cunfaDensity: 0.1,\n treeStyle: 'none',\n seed: seed + 11,\n });\n ridges.push({\n centerX: 0.94,\n spanW: 0.28,\n peakY: 0.27,\n baseY: 0.38,\n sharpness: 0.85,\n depth: 0.2,\n cunfaDensity: 0.1,\n treeStyle: 'none',\n seed: seed + 23,\n });\n\n // 2. Ilhas alongadas de meio-plano (como no banner Kalpa Shan)\n ridges.push({\n centerX: 0.58 + (rand() - 0.5) * 0.05,\n spanW: 0.34,\n peakY: 0.3 + rand() * 0.03,\n baseY: 0.38,\n sharpness: 0.75,\n plateau: 0.65,\n skew: -0.2,\n depth: 0.58,\n cunfaDensity: 0.75,\n treeStyle: 'distant_dots',\n seed: seed + 37,\n });\n ridges.push({\n centerX: 0.83 + (rand() - 0.5) * 0.04,\n spanW: 0.26,\n peakY: 0.28 + rand() * 0.03,\n baseY: 0.39,\n sharpness: 1.05,\n skew: -0.1,\n depth: 0.66,\n cunfaDensity: 0.85,\n treeStyle: 'distant_dots',\n seed: seed + 53,\n });\n\n // 3. Promontório rochoso em primeiro plano no canto inferior direito com árvores expressivas\n ridges.push({\n centerX: 0.93,\n spanW: 0.29,\n peakY: 0.81,\n baseY: 1.02,\n sharpness: 0.82,\n skew: -0.15,\n depth: 0.98,\n cunfaDensity: 1.25,\n treeStyle: 'foliage',\n seed: seed + 89,\n });\n\n return ridges;\n }\n\n if (composition === 'karst_peaks') {\n // 1. Picos fantasmas distantes na bruma\n ridges.push({\n centerX: 0.57 + (rand() - 0.5) * 0.06,\n spanW: 0.36,\n peakY: 0.34,\n baseY: 0.86,\n sharpness: 1.55,\n depth: 0.18,\n cunfaDensity: 0.15,\n treeStyle: 'none',\n seed: seed + 101,\n });\n\n // 2. Pico Karst secundário à direita\n ridges.push({\n centerX: 0.9 + (rand() - 0.5) * 0.04,\n spanW: 0.32,\n peakY: 0.36 + rand() * 0.06,\n baseY: 0.93,\n sharpness: 1.85,\n skew: -0.12,\n depth: 0.68,\n cunfaDensity: 1.15,\n treeStyle: 'pines',\n seed: seed + 131,\n });\n\n // 3. Grande Torre Karst Principal (protagonista vertical)\n ridges.push({\n centerX: 0.68 + (rand() - 0.5) * 0.05,\n spanW: 0.31,\n peakY: 0.16 + rand() * 0.05,\n baseY: 0.94,\n sharpness: 2.15,\n skew: 0.08,\n depth: 0.92,\n cunfaDensity: 1.35,\n treeStyle: 'pines',\n seed: seed + 167,\n });\n\n // 4. Margem rochosa com pinheiros altos na base direita\n ridges.push({\n centerX: 0.92,\n spanW: 0.32,\n peakY: 0.86,\n baseY: 1.03,\n sharpness: 0.88,\n depth: 1.0,\n cunfaDensity: 1.2,\n treeStyle: 'pines',\n seed: seed + 199,\n });\n\n return ridges;\n }\n\n if (composition === 'twin_gorges') {\n // 1. Cordilheiras atmosféricas de fundo\n ridges.push({\n centerX: 0.18,\n spanW: 0.45,\n peakY: 0.22,\n baseY: 0.78,\n sharpness: 1.35,\n depth: 0.18,\n cunfaDensity: 0.15,\n treeStyle: 'none',\n seed: seed + 211,\n });\n ridges.push({\n centerX: 0.82,\n spanW: 0.45,\n peakY: 0.2,\n baseY: 0.78,\n sharpness: 1.4,\n depth: 0.2,\n cunfaDensity: 0.15,\n treeStyle: 'none',\n seed: seed + 223,\n });\n\n // 2. Três grandes picos escarpados (esquerda, centro-direita alto, direita)\n ridges.push({\n centerX: 0.28 + (rand() - 0.5) * 0.04,\n spanW: 0.28,\n peakY: 0.42,\n baseY: 0.9,\n sharpness: 1.9,\n depth: 0.65,\n cunfaDensity: 1.0,\n treeStyle: 'pines',\n seed: seed + 241,\n });\n ridges.push({\n centerX: 0.76 + (rand() - 0.5) * 0.04,\n spanW: 0.3,\n peakY: 0.35,\n baseY: 0.91,\n sharpness: 1.95,\n depth: 0.76,\n cunfaDensity: 1.15,\n treeStyle: 'pines',\n seed: seed + 263,\n });\n ridges.push({\n centerX: 0.55 + (rand() - 0.5) * 0.04,\n spanW: 0.34,\n peakY: 0.18 + rand() * 0.04,\n baseY: 0.93,\n sharpness: 2.1,\n skew: 0.06,\n depth: 0.94,\n cunfaDensity: 1.3,\n treeStyle: 'pines',\n seed: seed + 281,\n });\n\n // 3. Ilha rochosa com pinheiros no canto inferior esquerdo\n ridges.push({\n centerX: 0.12,\n spanW: 0.34,\n peakY: 0.85,\n baseY: 1.03,\n sharpness: 0.9,\n depth: 1.0,\n cunfaDensity: 1.2,\n treeStyle: 'pines',\n seed: seed + 307,\n });\n\n return ridges;\n }\n\n // Default: 'layered_valley' (Vale das Cinco Neblinas com múltiplas colinas entrelaçadas)\n const totalLayers = Math.max(4, Math.min(8, ridgeLayers));\n for (let l = 0; l < totalLayers; l++) {\n const u = l / Math.max(1, totalLayers - 1); // 0 (fundo) -> 1 (frente)\n const isLeft = l % 2 === 0;\n const centerX = isLeft\n ? 0.22 + (rand() - 0.4) * 0.18\n : 0.78 + (rand() - 0.6) * 0.18;\n const spanW = 0.54 + rand() * 0.22;\n const peakY = 0.16 + u * 0.48 + (rand() - 0.5) * 0.05;\n const baseY = Math.min(1.04, peakY + 0.34 + u * 0.12);\n\n ridges.push({\n centerX,\n spanW,\n peakY,\n baseY,\n sharpness: 1.05 + (rand() - 0.5) * 0.35,\n skew: isLeft ? -0.14 : 0.14,\n depth: 0.16 + Math.pow(u, 0.85) * 0.84,\n cunfaDensity: 0.35 + u * 0.95,\n treeStyle: u < 0.25 ? 'none' : 'pines',\n seed: seed + 400 + l * 43,\n });\n }\n\n return ridges;\n}\n\n/**\n * Componente <SumiSansui />\n * Motor próprio de pintura gerativa de paisagens Sansui / Shan-Shui (山水) controlado por seed,\n * com suporte a temas prontos, Modo Noturno, variáveis CSS e cores customizadas.\n */\nexport const SumiSansui: React.FC<SumiSansuiProps> = ({\n seed = 8472,\n composition = 'panoramic_river',\n theme = 'classic_washi',\n colors: customColors,\n backgroundColor,\n inkColor,\n washColor,\n ridgeLayers = 6,\n treeDensity = 1.0,\n mistDensity = 1.0,\n showBoat = true,\n animated = false,\n actionsRef,\n className = '',\n}) => {\n const canvasRef = useRef<HTMLCanvasElement | null>(null);\n const staticMountainCacheRef = useRef<HTMLCanvasElement | null>(null);\n const cacheKeyRef = useRef<string>('');\n const isVisibleRef = useRef<boolean>(true);\n\n const exportPng = useCallback(\n (filename?: string) => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n const link = document.createElement('a');\n link.download = filename || `sumi-sansui-${composition}-${seed}.png`;\n link.href = canvas.toDataURL('image/png');\n link.click();\n },\n [composition, seed]\n );\n\n useEffect(() => {\n if (!actionsRef) return;\n actionsRef.current = { exportPng };\n }, [actionsRef, exportPng]);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas || typeof IntersectionObserver === 'undefined') return;\n const io = new IntersectionObserver(\n (entries) => {\n entries.forEach((entry) => {\n isVisibleRef.current = entry.isIntersecting;\n });\n },\n { rootMargin: '100px 0px', threshold: 0.01 }\n );\n io.observe(canvas);\n return () => io.disconnect();\n }, []);\n\n useEffect(() => {\n const canvas = canvasRef.current;\n if (!canvas) return;\n if (!staticMountainCacheRef.current) {\n staticMountainCacheRef.current = document.createElement('canvas');\n }\n const cacheCanvas = staticMountainCacheRef.current;\n let animId = 0;\n let cachedRect = canvas.getBoundingClientRect();\n\n const ro = new ResizeObserver((entries) => {\n if (entries[0]) {\n cachedRect = entries[0].contentRect as DOMRect;\n cacheKeyRef.current = '';\n }\n });\n ro.observe(canvas);\n\n const startTime = performance.now();\n\n const renderFrame = (now: number) => {\n if (!isVisibleRef.current && animated) {\n animId = requestAnimationFrame(renderFrame);\n return;\n }\n\n const dpr = Math.min(2, window.devicePixelRatio || 1);\n const w = Math.max(220, Math.floor(cachedRect.width || canvas.clientWidth || 640));\n const h = Math.max(150, Math.floor(cachedRect.height || canvas.clientHeight || 360));\n const targetW = Math.floor(w * dpr);\n const targetH = Math.floor(h * dpr);\n\n if (canvas.width !== targetW || canvas.height !== targetH) {\n canvas.width = targetW;\n canvas.height = targetH;\n cacheCanvas.width = targetW;\n cacheCanvas.height = targetH;\n cacheKeyRef.current = '';\n }\n\n const { resolved: palette, isDark } = resolveSansuiColors(\n theme,\n customColors,\n backgroundColor,\n inkColor,\n washColor\n );\n\n const scale = Math.max(0.55, Math.min(w / 900, h / 460));\n const nextCacheKey = `${targetW}x${targetH}:${seed}:${composition}:${ridgeLayers}:${treeDensity}:${mistDensity}:${palette.background}:${palette.ink}:${palette.wash}:${palette.mist}:${palette.accent}`;\n\n const ctx = canvas.getContext('2d');\n const cCtx = cacheCanvas.getContext('2d');\n if (!ctx || !cCtx) return;\n\n // 1. Constrói o cache estático das cadeias de montanhas, Cunfa e árvores\n if (cacheKeyRef.current !== nextCacheKey) {\n cCtx.save();\n cCtx.setTransform(dpr, 0, 0, dpr, 0, 0);\n cCtx.clearRect(0, 0, w, h);\n\n // Fundo Papel Washi / Céu\n cCtx.fillStyle = palette.background;\n cCtx.fillRect(0, 0, w, h);\n\n // Textura sutil de fibras de papel Washi / Seda\n const fiberRand = createSeededRandom(seed + 999);\n cCtx.strokeStyle = rgbaStr(palette.ink, isDark ? 0.03 : 0.022);\n cCtx.lineWidth = 0.6;\n for (let f = 0; f < 42; f++) {\n const fy = fiberRand() * h;\n cCtx.beginPath();\n cCtx.moveTo(0, fy);\n cCtx.lineTo(w, fy + (fiberRand() - 0.5) * 4);\n cCtx.stroke();\n }\n\n const ridges = buildCompositionRidges(composition, seed, ridgeLayers);\n\n // No modo panoramic_river, desenha as cadeias distantes primeiro, depois as linhas d'água,\n // e por último o promontório em primeiro plano para sobreposição perfeita\n const backRidges = ridges.filter((r) => r.depth < 0.9);\n const frontRidges = ridges.filter((r) => r.depth >= 0.9);\n\n for (const ridge of backRidges) {\n renderSansuiMountainRidge(\n cCtx,\n w,\n h,\n scale,\n ridge,\n palette,\n isDark,\n treeDensity,\n mistDensity\n );\n }\n\n // Linhas horizontais serenas da extensão d'água (estáticas no buffer base)\n const waterRand = createSeededRandom(seed + 777);\n const waterTopY =\n composition === 'panoramic_river'\n ? h * 0.37\n : composition === 'layered_valley'\n ? h * 0.72\n : h * 0.88;\n const rippleCount =\n composition === 'panoramic_river'\n ? 58\n : composition === 'layered_valley'\n ? 18\n : 16;\n\n for (let r = 0; r < rippleCount; r++) {\n const uY = Math.pow(waterRand(), 0.85);\n const wy = waterTopY + uY * (h * 0.96 - waterTopY);\n const wx = waterRand() * w * 0.92;\n const wLen = (28 + waterRand() * 135) * scale * (0.65 + (1 - uY) * 0.5);\n\n cCtx.beginPath();\n cCtx.moveTo(wx - wLen * 0.5, wy);\n cCtx.lineTo(wx + wLen * 0.5, wy);\n cCtx.strokeStyle = rgbaStr(\n palette.ink,\n (isDark ? 0.14 : 0.18) * (0.45 + waterRand() * 0.55)\n );\n cCtx.lineWidth = Math.max(0.5, 0.75 * scale);\n cCtx.stroke();\n }\n\n for (const ridge of frontRidges) {\n renderSansuiMountainRidge(\n cCtx,\n w,\n h,\n scale,\n ridge,\n palette,\n isDark,\n treeDensity,\n mistDensity\n );\n }\n\n cCtx.restore();\n cacheKeyRef.current = nextCacheKey;\n }\n\n // 2. Desenha o buffer cacheado + barco solitário e bruma viva opcional\n ctx.save();\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0);\n ctx.clearRect(0, 0, w, h);\n ctx.drawImage(cacheCanvas, 0, 0, w, h);\n\n const elapsed = animated ? (now - startTime) / 1000 : 0;\n\n if (showBoat) {\n const boatRand = createSeededRandom(seed + 555);\n let boatX = w * 0.61;\n let boatY = h * 0.81;\n let boatSize = 15 * scale;\n\n if (composition === 'panoramic_river') {\n boatX = w * (0.58 + (boatRand() - 0.5) * 0.08);\n boatY = h * (0.76 + (boatRand() - 0.5) * 0.05);\n boatSize = 15.5 * scale;\n } else if (composition === 'karst_peaks') {\n boatX = w * (0.43 + (boatRand() - 0.5) * 0.06);\n boatY = h * 0.94;\n boatSize = 12 * scale;\n } else if (composition === 'layered_valley') {\n boatX = w * 0.51;\n boatY = h * 0.9;\n boatSize = 10.5 * scale;\n } else if (composition === 'twin_gorges') {\n boatX = w * 0.37;\n boatY = h * 0.94;\n boatSize = 11.5 * scale;\n }\n\n const driftX = animated ? Math.sin(elapsed * 0.55) * 8 * scale : 0;\n const bobY = animated ? Math.cos(elapsed * 1.1) * 1.2 * scale : 0;\n\n drawSansuiSampanBoat(\n ctx,\n boatX + driftX,\n boatY + bobY,\n Math.max(8, boatSize),\n palette.ink,\n 0.92\n );\n }\n\n ctx.restore();\n\n if (animated) {\n animId = requestAnimationFrame(renderFrame);\n }\n };\n\n animId = requestAnimationFrame(renderFrame);\n return () => {\n cancelAnimationFrame(animId);\n ro.disconnect();\n };\n }, [\n seed,\n composition,\n theme,\n customColors,\n backgroundColor,\n inkColor,\n washColor,\n ridgeLayers,\n treeDensity,\n mistDensity,\n showBoat,\n animated,\n ]);\n\n return (\n <div className={`relative w-full h-full overflow-hidden select-none ${className}`}>\n <canvas ref={canvasRef} className=\"block w-full h-full\" />\n </div>\n );\n};\n"],"ignoreList":[3],"mappings":"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"}
|