@sumi-forge/react 1.0.0 → 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/dist/index.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","names":["rough","rough","rough","rough","rough","_Fragment","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","i","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","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","n","o","e","l","f","M","k","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","key","found","SumiMaskReveal","controlledProgress","displayCanvasRef","useRef","maskCanvasRef","compositeCacheRef","cacheKeyRef","isVisibleRef","imageRef","imageLoaded","setImageLoaded","useState","imageError","setImageError","manualScratchMode","setManualScratchMode","choreography","userStrokeCount","setUserStrokeCount","userStrokesRef","activeStrokeRef","lastPointerPosRef","strokeVersionRef","startTimeRef","useEffect","img","replayTrigger","io","entry","maskCanvas","compositeCache","animId","cachedRect","ro","entries","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","useCallback","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","createPortal","jp","romaji","handleToggleTap","Fragment"],"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"],"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 { ArchetypeId, MagicSchool, SchoolId, SumiLayerIntensities, TechniqueSpec, VFXConfig } from './types';\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"],"ignoreList":[3],"mappings":"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"}