@chrono-os/image-editor-react 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +424 -0
- package/dist/badge-BRjFgV8X.d.cts +130 -0
- package/dist/badge-BRjFgV8X.d.ts +130 -0
- package/dist/badge.cjs +56 -0
- package/dist/badge.cjs.map +1 -0
- package/dist/badge.d.cts +3 -0
- package/dist/badge.d.ts +3 -0
- package/dist/badge.js +4 -0
- package/dist/badge.js.map +1 -0
- package/dist/chunk-P77DHS6Z.js +53 -0
- package/dist/chunk-P77DHS6Z.js.map +1 -0
- package/dist/index.cjs +1989 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +163 -0
- package/dist/index.d.ts +163 -0
- package/dist/index.js +1928 -0
- package/dist/index.js.map +1 -0
- package/dist/theme.css +30 -0
- package/package.json +63 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/badge-overlay.tsx","../src/image-crop-picker.tsx","../src/image-picker.tsx","../src/slider-row.tsx","../src/badge-part-controls.tsx","../src/badge-editor-card.tsx"],"names":["jsxs","Fragment","jsx","useRef","useState","useEffect","useCallback"],"mappings":"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","file":"index.cjs","sourcesContent":["'use client'\n\n/**\n * Replica visual do badge (número + label) sobreposto a uma foto. Renderer\n * de produção pode estar em outro pacote (ex `@chrono-os/lp-react/hero`);\n * aqui usamos pra preview no admin/editor.\n *\n * Defaults em % (top-left do span dentro do container 3:4 da foto):\n * numero: left ~6% (24px em 400px W) · top ~84%\n * label: depois do numero (~36% W) · top ~88%\n *\n * Tamanho via container-query (cqw) — pai precisa `containerType:'inline-size'`.\n */\n\nimport type { BadgeData } from './types'\n\nconst BADGE_DEFAULT_POS = {\n numero: { x: 6, y: 84 },\n label: { x: 36, y: 88 },\n}\n\n/**\n * Tamanho base em % do container width (cqw). Casam com o renderer real:\n * numero: 60px em container 400px = 15% W\n * label: 14px em container 400px = 3.5% W\n * Slider 50-500% multiplica esses bases — assim qualquer tamanho de preview\n * (sm 128px, md 200px, prod 400px+) renderiza visualmente proporcional.\n */\nconst BADGE_BASE_CQW = { numero: 15, label: 3.5 }\n\nexport interface BadgeOverlayProps {\n badge?: BadgeData\n size?: 'sm' | 'md'\n}\n\nexport function BadgeOverlay({ badge }: BadgeOverlayProps) {\n if (!badge) return null\n const showNumero = !!badge.numero && badge.numeroEnabled !== false\n const showLabel = !!badge.label && badge.labelEnabled !== false\n if (!showNumero && !showLabel) return null\n // Font-size em cqw (% da width do container) — requer parent com\n // `containerType: 'inline-size'`. Proporcionalidade idêntica entre admin\n // e produção sem precisar de fator de escala.\n const numSizeCqw = BADGE_BASE_CQW.numero * ((badge.numeroSize ?? 100) / 100)\n const labelSizeCqw = BADGE_BASE_CQW.label * ((badge.labelSize ?? 100) / 100)\n const numX = badge.numeroOffsetX ?? BADGE_DEFAULT_POS.numero.x\n const numY = badge.numeroOffsetY ?? BADGE_DEFAULT_POS.numero.y\n const labelX = badge.labelOffsetX ?? BADGE_DEFAULT_POS.label.x\n const labelY = badge.labelOffsetY ?? BADGE_DEFAULT_POS.label.y\n // Default color: usa CSS var `--ie-accent` (consumer overrida via theme.css).\n const numeroColor =\n badge.numeroColor || 'var(--ie-accent, #556FFF)'\n return (\n <>\n {showNumero && (\n <span\n className=\"pointer-events-none absolute z-10 whitespace-nowrap font-extrabold leading-none tracking-tight\"\n style={{\n left: `${numX}%`,\n top: `${numY}%`,\n fontSize: `${numSizeCqw}cqw`,\n color: numeroColor,\n }}\n >\n {badge.numero}\n </span>\n )}\n {showLabel && (\n <span\n className=\"pointer-events-none absolute z-10 whitespace-pre-line font-semibold leading-tight text-white\"\n style={{\n left: `${labelX}%`,\n top: `${labelY}%`,\n fontSize: `${labelSizeCqw}cqw`,\n color: badge.labelColor || undefined,\n }}\n >\n {badge.label}\n </span>\n )}\n </>\n )\n}\n","'use client'\n\n/**\n * Editor de crop visual:\n * - Imagem fonte ocupa o painel à esquerda (aspect natural, sem barras\n * laterais).\n * - Frame branco com cantos brackets indica a REGIÃO visível no destino.\n * Drag dentro do frame → reposiciona; drag nos cantos → zoom.\n * - Sidebar: presets Topo/Centro/Base, Espelhar, leitura dos valores.\n *\n * Math:\n * Stored `position` é CSS-native (`X% Y%` no formato `object-position` /\n * `background-position`). Internamente trabalhamos com um **ponto focal**\n * (centro da região visível). Conversão acontece em focalToOp/opToFocal,\n * dependendo dos aspect ratios da fonte e do destino + o zoom (scale).\n */\n\nimport { useCallback, useEffect, useRef, useState } from 'react'\n\nimport type { CropValue } from './types'\n\nexport type { CropValue }\n\n/**\n * Constrói valor CSS `filter` baseado nas opções. Idêntico ao helper do\n * `@chrono-os/lp-react` — mantém preview e render em sincronia visual.\n */\nexport function buildImageFilter(opts: {\n grayscale?: number\n saturation?: number\n sepia?: number\n sepiaColor?: string\n}): string | undefined {\n const parts: string[] = []\n if (opts.saturation != null && opts.saturation !== 100) {\n parts.push(`saturate(${opts.saturation}%)`)\n }\n if (opts.grayscale != null && opts.grayscale > 0) {\n parts.push(`grayscale(${opts.grayscale}%)`)\n }\n if (opts.sepia != null && opts.sepia > 0) {\n parts.push(`sepia(${opts.sepia}%)`)\n if (opts.sepiaColor) {\n const hue = hexToHueDeg(opts.sepiaColor)\n const rotation = Math.round((hue - 35 + 360) % 360)\n if (rotation !== 0) parts.push(`hue-rotate(${rotation}deg)`)\n }\n }\n return parts.length ? parts.join(' ') : undefined\n}\n\nfunction hexToHueDeg(hex: string): number {\n const h = hex.replace('#', '')\n if (h.length !== 6) return 0\n const r = parseInt(h.slice(0, 2), 16) / 255\n const g = parseInt(h.slice(2, 4), 16) / 255\n const b = parseInt(h.slice(4, 6), 16) / 255\n const max = Math.max(r, g, b)\n const min = Math.min(r, g, b)\n const d = max - min\n if (d === 0) return 0\n let hDeg = 0\n if (max === r) hDeg = ((g - b) / d) % 6\n else if (max === g) hDeg = (b - r) / d + 2\n else hDeg = (r - g) / d + 4\n return (hDeg * 60 + 360) % 360\n}\n\nexport interface ImageCropPickerProps {\n imageUrl: string\n /** Aspect ratio do destino (frame). Ex: 3/4, 16/9. */\n targetAspect: number\n value: CropValue\n onChange: (next: CropValue) => void\n /**\n * Limita a altura do painel do editor (em px). Quando ausente, usa\n * `min(60vh, 520px)`. Use pra prevenir scroll quando o modal pai tem\n * altura fixa.\n */\n maxHeight?: number\n}\n\nexport const MIN_SCALE = 0.2\nexport const MAX_SCALE = 5\n\n/** Calcula a fração visível (cover) do source numa dimensão.\n * source_wider: vw_base = target/img; source_taller: vw_base = 1. */\nexport function computeVisibleBase(\n imgAspect: number,\n targetAspect: number,\n): { vwBase: number; vhBase: number } {\n if (imgAspect > targetAspect) {\n return { vwBase: targetAspect / imgAspect, vhBase: 1 }\n }\n return { vwBase: 1, vhBase: imgAspect / targetAspect }\n}\n\n/**\n * Geometria explícita do <img> dentro de container relative+overflow-hidden\n * com aspect ratio TARGET. focal = posição da imagem no container (0=left,\n * 100=right, 50=centro). Mesma math do renderer em prod — paridade total.\n */\nexport function buildImageGeometry(opts: {\n imgAspect: number\n targetAspect: number\n focalX: number\n focalY: number\n scale: number\n}): {\n width: string\n height: string\n left: string\n top: string\n renderedW: number\n renderedH: number\n} {\n const { vwBase, vhBase } = computeVisibleBase(opts.imgAspect, opts.targetAspect)\n // coverWFrac/coverHFrac: dimensões da imagem (em múltiplos do container)\n // ao cobrir o container no scale=1 cover. >= 1 no eixo dominante.\n const coverWFrac = vwBase < 1 ? 1 / vwBase : 1\n const coverHFrac = vhBase < 1 ? 1 / vhBase : 1\n const renderedW = opts.scale * coverWFrac\n const renderedH = opts.scale * coverHFrac\n const fx = clamp(opts.focalX, 0, 100)\n const fy = clamp(opts.focalY, 0, 100)\n const leftFrac = (fx / 100) * (1 - renderedW)\n const topFrac = (fy / 100) * (1 - renderedH)\n return {\n width: `${renderedW * 100}%`,\n height: `${renderedH * 100}%`,\n left: `${leftFrac * 100}%`,\n top: `${topFrac * 100}%`,\n renderedW,\n renderedH,\n }\n}\n\nexport function parsePosition(raw: string | undefined): { x: number; y: number } {\n if (!raw) return { x: 50, y: 50 }\n const trimmed = raw.trim().toLowerCase()\n const keywords: Record<string, number> = {\n left: 0,\n center: 50,\n right: 100,\n top: 0,\n bottom: 100,\n }\n const tokens = trimmed.split(/\\s+/)\n if (tokens.length !== 2) return { x: 50, y: 50 }\n function toNum(t: string, axis: 'x' | 'y'): number {\n if (t.endsWith('%')) {\n const n = parseFloat(t)\n if (!Number.isNaN(n)) return clamp(n, 0, 100)\n }\n if (t in keywords) {\n const v = keywords[t]\n if (axis === 'x' && (t === 'top' || t === 'bottom')) return 50\n if (axis === 'y' && (t === 'left' || t === 'right')) return 50\n return v\n }\n return 50\n }\n return {\n x: toNum(tokens[0], 'x'),\n y: toNum(tokens[1], 'y'),\n }\n}\n\nexport function formatPos(x: number, y: number): string {\n return `${Math.round(x)}% ${Math.round(y)}%`\n}\n\nfunction clamp(v: number, min: number, max: number) {\n return Math.max(min, Math.min(max, v))\n}\n\n/**\n * Converte um ponto focal (0-100, fração do source onde o \"centro da visão\"\n * deve ficar) em valor de CSS object-position (0-100).\n *\n * `visible` é a fração do source visível naquela dimensão DEPOIS de cover\n * crop + scale. Quando não há overflow (visible >= 1), object-position é\n * irrelevante; devolve 50 como neutro.\n */\nexport function focalToOp(focal: number, visible: number): number {\n if (visible >= 0.999) return 50\n const overflow = 1 - visible\n const op = (focal / 100 - visible / 2) / overflow\n return clamp(op * 100, 0, 100)\n}\n\n/** Inverso de focalToOp: dado object-position, devolve o focal point. */\nexport function opToFocal(op: number, visible: number): number {\n if (visible >= 0.999) return 50\n const overflow = 1 - visible\n return clamp((overflow * op + visible * 50), 0, 100)\n}\n\ntype DragMode = null | 'move' | 'nw' | 'ne' | 'sw' | 'se'\n\nexport function ImageCropPicker({\n imageUrl,\n targetAspect,\n value,\n onChange,\n maxHeight,\n}: ImageCropPickerProps) {\n const outerRef = useRef<HTMLDivElement | null>(null)\n const containerRef = useRef<HTMLDivElement | null>(null)\n const imgRef = useRef<HTMLImageElement | null>(null)\n const [imgDims, setImgDims] = useState<{ w: number; h: number } | null>(null)\n const [containerDims, setContainerDims] = useState<{ w: number; h: number } | null>(null)\n const [dragMode, setDragMode] = useState<DragMode>(null)\n /**\n * Override em pixels do frame durante corner drag ativo. Garante que o\n * canto OPOSTO (anchor) fica EXATAMENTE no mesmo pixel — bypass a math\n * de back-derivação (focal/scale/overflow) que pode drift por float.\n * Quando null, o render usa a math state-based normal.\n */\n const [liveCornerDrag, setLiveCornerDrag] = useState<{\n leftPx: number\n topPx: number\n wPx: number\n hPx: number\n } | null>(null)\n const dragStartRef = useRef<{\n pointerX: number\n pointerY: number\n focalX: number\n focalY: number\n scale: number\n overflowX: number\n overflowY: number\n /** Para corner drag: posição do canto FIXO (oposto ao arrastado) em\n * source-box px (relativo ao containerRef). */\n anchorXpx?: number\n anchorYpx?: number\n /** Para corner drag: posição original do canto ARRASTADO em source-box px.\n * Usado pra computar target_corner = start_corner + drag_delta, isolando\n * o ajuste do offset de onde dentro do handle 16x16 o user clicou. */\n cornerXpx?: number\n cornerYpx?: number\n /** Flag mutável: true após user passar do threshold inicial de drag-begin.\n * Antes disso, micro-movimentos do click são ignorados; no momento do\n * cross, pointer + corner são reposicionados pra que o primeiro evento\n * pós-threshold tenha delta=0 (sem JUMP). */\n cornerDragBegun?: boolean\n /** Histerese do snap nas bordas: 'w' ou 'h' = atualmente snapado nesse\n * eixo, undefined = livre. Engaja com tolerance 4px, desengaja com 12px\n * → previne oscilação no boundary que parecia \"rectangle resizing itself\". */\n snapEngaged?: 'w' | 'h' | undefined\n /** Distance W/H do evento anterior — permite detectar \"aproximação ativa\"\n * ao snap (dist decreasing). Só engaja se prev > engage_threshold E\n * current < engage_threshold (i.e., user moveu PARA o target). Sem isso,\n * o snap engaja no click se aspect-lock natural por acaso ficar perto. */\n prevDistW?: number\n prevDistH?: number\n } | null>(null)\n\n const { x: opX, y: opY } = parsePosition(value.position)\n const scale = clamp(value.scale ?? 1, MIN_SCALE, MAX_SCALE)\n const mirror = !!value.mirror\n const filter = buildImageFilter({\n grayscale: value.grayscale,\n saturation: value.saturation,\n sepia: value.sepia,\n sepiaColor: value.sepiaColor,\n })\n\n function onImgLoad() {\n if (!imgRef.current) return\n setImgDims({\n w: imgRef.current.naturalWidth,\n h: imgRef.current.naturalHeight,\n })\n }\n\n // Carrega imgDims via new Image() — mais confiável que checar imgRef.current.complete\n // (React 19 às vezes não tem complete=true a tempo do effect rodar mesmo em cache).\n // Sync-check pra cache hot path + onload pra network.\n useEffect(() => {\n if (!imageUrl) return\n const probe = new Image()\n let cancelled = false\n probe.onload = () => {\n if (!cancelled) {\n setImgDims({ w: probe.naturalWidth, h: probe.naturalHeight })\n }\n }\n probe.onerror = () => {\n // ignore — img tag onLoad será o fallback\n }\n probe.src = imageUrl\n if (probe.complete && probe.naturalWidth > 0) {\n setImgDims({ w: probe.naturalWidth, h: probe.naturalHeight })\n }\n return () => {\n cancelled = true\n }\n }, [imageUrl])\n\n useEffect(() => {\n function measure() {\n if (!containerRef.current) return\n const r = containerRef.current.getBoundingClientRect()\n setContainerDims({ w: r.width, h: r.height })\n }\n measure()\n const ro = new ResizeObserver(measure)\n if (containerRef.current) ro.observe(containerRef.current)\n return () => ro.disconnect()\n }, [imgDims])\n\n // focal armazenado raw 0-100 (image position semantics)\n const focalX = opX\n const focalY = opY\n const overflowX = value.overflowX ?? 0\n const overflowY = value.overflowY ?? 0\n\n // === Geometria source-with-frame ===\n // Container = source rect (aspect = imgAspect). Source img object-contain\n // preenche container. Frame = aspect targetAspect, sobrepondo source coords.\n // Math: frameWFrac_src = 1 / (scale × coverWFrac); frame_left = focal × range.\n const imgAspect = imgDims ? imgDims.w / imgDims.h : 1\n const panelAspect = imgAspect\n\n const { vwBase, vhBase } = computeVisibleBase(imgAspect, targetAspect)\n const coverWFrac = vwBase < 1 ? 1 / vwBase : 1\n const coverHFrac = vhBase < 1 ? 1 / vhBase : 1\n // Frame em source-coords (frac do source). >1 = extende além do source (zoom out).\n const frameWFracSrc = 1 / (scale * coverWFrac)\n const frameHFracSrc = 1 / (scale * coverHFrac)\n const displayFocalX = mirror ? 100 - focalX : focalX\n const displayFocalY = focalY\n const displayOverflowX = mirror ? -overflowX : overflowX\n // NEGATE: editor frame deve mover NA DIREÇÃO do drag (visualmente intuitivo).\n // Como o body drag salva overflowX negativo pra \"drag right\", precisa subtrair\n // aqui pra frame mover pra direita visualmente quando overflow é negativo.\n const frameLeftFracSrc =\n (displayFocalX / 100) * (1 - frameWFracSrc) - displayOverflowX * frameWFracSrc\n const frameTopFracSrc =\n (displayFocalY / 100) * (1 - frameHFracSrc) - overflowY * frameHFracSrc\n\n // Focal = image position 0-100 (sempre clampado no save pra alinhar com\n // o renderer pristine 0.25.0 que clampa em parsePosition + buildImageGeometry).\n // Overflow é o nosso campo aditivo (offsetX/Y) que vai pra renderer lp-react\n // via patch aditivo — sem mexer no clamp do focal.\n const applyFocal = useCallback(\n (\n newFocalX: number,\n newFocalY: number,\n newScale?: number,\n newOverflow?: { overflowX?: number; overflowY?: number },\n ) => {\n const s = clamp(newScale ?? scale, MIN_SCALE, MAX_SCALE)\n const fx = clamp(newFocalX, 0, 100)\n const fy = clamp(newFocalY, 0, 100)\n const ovX = newOverflow?.overflowX\n const ovY = newOverflow?.overflowY\n onChange({\n ...value,\n position: formatPos(fx, fy),\n scale: s,\n overflowX: ovX !== undefined && Math.abs(ovX) > 0.001 ? ovX : undefined,\n overflowY: ovY !== undefined && Math.abs(ovY) > 0.001 ? ovY : undefined,\n })\n },\n [scale, value, onChange],\n )\n\n function startDrag(mode: DragMode, e: React.PointerEvent) {\n if (!mode) return\n setDragMode(mode)\n outerRef.current?.setPointerCapture(e.pointerId)\n // Se override existe (de drag anterior), MANTÉM e atualiza durante o drag\n // novo. Senão, o frame visual divergeria do drag em curso.\n // Override é source of truth pra renderização; state é só persistência.\n let anchorXpx: number | undefined\n let anchorYpx: number | undefined\n let cornerXpx: number | undefined\n let cornerYpx: number | undefined\n if (mode !== 'move' && containerDims) {\n // CRITICAL: usar liveCornerDrag (px exato do drag anterior) em vez\n // da math state-based. Senão, drift sub-pixel entre override e\n // state-derived (round-trip parsePosition → formatPos + float math)\n // acumula a cada drag → anchor desloca 2px por click.\n const frameL = liveCornerDrag?.leftPx ?? frameLeftFracSrc * containerDims.w\n const frameT = liveCornerDrag?.topPx ?? frameTopFracSrc * containerDims.h\n const frameW = liveCornerDrag?.wPx ?? frameWFracSrc * containerDims.w\n const frameH = liveCornerDrag?.hPx ?? frameHFracSrc * containerDims.h\n // anchor = canto OPOSTO (fica fixo), corner = canto ARRASTADO (segue\n // pointer com o delta DESDE o click — isolando offset do handle).\n switch (mode) {\n case 'nw':\n anchorXpx = frameL + frameW; anchorYpx = frameT + frameH\n cornerXpx = frameL; cornerYpx = frameT\n break\n case 'ne':\n anchorXpx = frameL; anchorYpx = frameT + frameH\n cornerXpx = frameL + frameW; cornerYpx = frameT\n break\n case 'sw':\n anchorXpx = frameL + frameW; anchorYpx = frameT\n cornerXpx = frameL; cornerYpx = frameT + frameH\n break\n case 'se':\n anchorXpx = frameL; anchorYpx = frameT\n cornerXpx = frameL + frameW; cornerYpx = frameT + frameH\n break\n }\n }\n dragStartRef.current = {\n pointerX: e.clientX,\n pointerY: e.clientY,\n focalX,\n focalY,\n scale,\n overflowX,\n overflowY,\n anchorXpx,\n anchorYpx,\n cornerXpx,\n cornerYpx,\n cornerDragBegun: false,\n snapEngaged: undefined,\n }\n }\n\n function handlePointerMove(e: React.PointerEvent) {\n if (!dragMode || !dragStartRef.current || !containerDims) return\n const start = dragStartRef.current\n\n if (dragMode === 'move') {\n if (!containerDims) return\n // Frame size REAL: usar liveCornerDrag se exists (pixel-perfect do corner\n // drag anterior). Senão, math state-derived. Sem isso, snap targets\n // [0, 1 - frameH] são baseados em state-frac que pode estar 1-3px fora\n // do frame visual → snap engaja mas para no pixel errado.\n const actualFrameWSrc =\n liveCornerDrag && containerDims.w > 0\n ? liveCornerDrag.wPx / containerDims.w\n : frameWFracSrc\n const actualFrameHSrc =\n liveCornerDrag && containerDims.h > 0\n ? liveCornerDrag.hPx / containerDims.h\n : frameHFracSrc\n if (actualFrameWSrc <= 0 || actualFrameHSrc <= 0) return\n const dx = e.clientX - start.pointerX\n const dy = e.clientY - start.pointerY\n const dxTargetFrac = dx / (actualFrameWSrc * containerDims.w)\n const dyTargetFrac = dy / (actualFrameHSrc * containerDims.h)\n const adjDxTargetFrac = mirror ? -dxTargetFrac : dxTargetFrac\n let candOverflowX = start.overflowX - adjDxTargetFrac\n let candOverflowY = start.overflowY - dyTargetFrac\n\n // Soft snap: alinha frame com bordas do source (left, right, top, bottom).\n // Tolerância 4% da source dim em src frac. Snap recomputa overflow pra\n // travar exatamente no edge. Shift desabilita temporariamente (ajuste fino).\n const SOFT_SNAP_TOL = 0.04\n const snapDisabled = e.shiftKey\n const dispFocalX_b = mirror ? 100 - start.focalX : start.focalX\n const dispFocalY_b = start.focalY\n const dispOverflowX_cand = mirror ? -candOverflowX : candOverflowX\n const dispOverflowY_cand = candOverflowY\n const fLeftSrc =\n (dispFocalX_b / 100) * (1 - actualFrameWSrc) -\n dispOverflowX_cand * actualFrameWSrc\n const fTopSrc =\n (dispFocalY_b / 100) * (1 - actualFrameHSrc) -\n dispOverflowY_cand * actualFrameHSrc\n const snapTargetsX = snapDisabled ? [] : [0, 1 - actualFrameWSrc]\n const snapTargetsY = snapDisabled ? [] : [0, 1 - actualFrameHSrc]\n let snappedFLeftSrc = fLeftSrc\n let snappedFTopSrc = fTopSrc\n for (const t of snapTargetsX) {\n if (Math.abs(fLeftSrc - t) < SOFT_SNAP_TOL) {\n snappedFLeftSrc = t\n break\n }\n }\n for (const t of snapTargetsY) {\n if (Math.abs(fTopSrc - t) < SOFT_SNAP_TOL) {\n snappedFTopSrc = t\n break\n }\n }\n // Back-derive overflow from snapped frame position\n if (snappedFLeftSrc !== fLeftSrc && actualFrameWSrc > 0.001) {\n const snappedDispOverflowX =\n ((dispFocalX_b / 100) * (1 - actualFrameWSrc) - snappedFLeftSrc) /\n actualFrameWSrc\n candOverflowX = mirror ? -snappedDispOverflowX : snappedDispOverflowX\n }\n if (snappedFTopSrc !== fTopSrc && actualFrameHSrc > 0.001) {\n const snappedDispOverflowY =\n ((dispFocalY_b / 100) * (1 - actualFrameHSrc) - snappedFTopSrc) /\n actualFrameHSrc\n candOverflowY = snappedDispOverflowY\n }\n\n // Hard clamp: garantir overlap mínimo do frame com source (5%).\n const MIN_FRAME_OVERLAP = 0.05\n const dispOverflowX_clamp = mirror ? -candOverflowX : candOverflowX\n const dispOverflowY_clamp = candOverflowY\n let clampedFLeftSrc =\n (dispFocalX_b / 100) * (1 - actualFrameWSrc) -\n dispOverflowX_clamp * actualFrameWSrc\n let clampedFTopSrc =\n (dispFocalY_b / 100) * (1 - actualFrameHSrc) -\n dispOverflowY_clamp * actualFrameHSrc\n const minFLeft = -(actualFrameWSrc - MIN_FRAME_OVERLAP)\n const maxFLeft = 1 - MIN_FRAME_OVERLAP\n const minFTop = -(actualFrameHSrc - MIN_FRAME_OVERLAP)\n const maxFTop = 1 - MIN_FRAME_OVERLAP\n clampedFLeftSrc = clamp(clampedFLeftSrc, minFLeft, maxFLeft)\n clampedFTopSrc = clamp(clampedFTopSrc, minFTop, maxFTop)\n if (actualFrameWSrc > 0.001) {\n const clampedDispOverflowX =\n ((dispFocalX_b / 100) * (1 - actualFrameWSrc) - clampedFLeftSrc) /\n actualFrameWSrc\n candOverflowX = mirror ? -clampedDispOverflowX : clampedDispOverflowX\n }\n if (actualFrameHSrc > 0.001) {\n const clampedDispOverflowY =\n ((dispFocalY_b / 100) * (1 - actualFrameHSrc) - clampedFTopSrc) /\n actualFrameHSrc\n candOverflowY = clampedDispOverflowY\n }\n\n // Atualiza override em px com a posição final do frame pós-snap+clamp.\n // Mantém pixel-perfect através de body drag → corner drag → next body...\n // Frame size não muda no body drag; só leftPx/topPx.\n const finalFrameLeftPx = clampedFLeftSrc * containerDims.w\n const finalFrameTopPx = clampedFTopSrc * containerDims.h\n const frameWPxOverride =\n liveCornerDrag?.wPx ?? frameWFracSrc * containerDims.w\n const frameHPxOverride =\n liveCornerDrag?.hPx ?? frameHFracSrc * containerDims.h\n setLiveCornerDrag({\n leftPx: finalFrameLeftPx,\n topPx: finalFrameTopPx,\n wPx: frameWPxOverride,\n hPx: frameHPxOverride,\n })\n\n applyFocal(start.focalX, start.focalY, scale, {\n overflowX: candOverflowX,\n overflowY: candOverflowY,\n })\n return\n }\n\n // Corner drag: canto OPOSTO ao arrastado fica fixo. Aspect-lock no target.\n if (start.anchorXpx === undefined || start.anchorYpx === undefined) return\n if (start.cornerXpx === undefined || start.cornerYpx === undefined) return\n if (!containerRef.current) return\n\n // Drag-begin: ignora micro-movimentos (< 4px) que o browser/mão geram\n // entre click e drag real. Quando user passa do threshold, RESETA a\n // origem pra posição atual + skip esse evento → próximo evento começa\n // com delta = 0 e cresce gradualmente. Sem JUMP no momento do cross.\n if (!start.cornerDragBegun) {\n const initialDx = e.clientX - start.pointerX\n const initialDy = e.clientY - start.pointerY\n if (Math.abs(initialDx) < 4 && Math.abs(initialDy) < 4) return\n start.cornerDragBegun = true\n start.pointerX = e.clientX\n start.pointerY = e.clientY\n return\n }\n\n // Target_corner = start_corner + drag_delta. Isolamos o OFFSET do click\n // dentro do handle 16x16. Quando drag_delta = 0, target_corner =\n // start_corner EXATO → lockedW = frame_w_original → ZERO shift.\n const dragDx = e.clientX - start.pointerX\n const dragDy = e.clientY - start.pointerY\n const pointerXpx = start.cornerXpx + dragDx\n const pointerYpx = start.cornerYpx + dragDy\n\n const freeW = Math.abs(pointerXpx - start.anchorXpx)\n const freeH = Math.abs(pointerYpx - start.anchorYpx)\n if (freeW < 4 || freeH < 4) return\n\n // Aspect-lock no target — frame display aspect = targetAspect sempre.\n let lockedW: number\n let lockedH: number\n if (freeH * targetAspect <= freeW) {\n lockedH = freeH\n lockedW = freeH * targetAspect\n } else {\n lockedW = freeW\n lockedH = freeW / targetAspect\n }\n\n // Limites: minFrame = scale MAX, maxFrame = scale MIN.\n const minFrameW = containerDims.w / (MAX_SCALE * coverWFrac)\n const maxFrameW = containerDims.w / (MIN_SCALE * coverWFrac)\n if (lockedW < minFrameW) {\n lockedW = minFrameW\n lockedH = lockedW / targetAspect\n }\n if (lockedW > maxFrameW) {\n lockedW = maxFrameW\n lockedH = lockedW / targetAspect\n }\n\n // Soft snap nas BORDAS DO SOURCE com histerese (engaja 4px, desengaja 12px)\n // pra eliminar oscilação no boundary que parecia \"rectangle resizing itself\".\n // Shift desabilita temporariamente (ajuste fino) — também desengaja qualquer\n // snap ativo, pra que ao soltar shift o frame não volte pro estado snapado.\n const SNAP_ENGAGE_PX = 4\n const SNAP_DISENGAGE_PX = 12\n const cornerSnapDisabled = e.shiftKey\n const snapTargetW =\n dragMode === 'nw' || dragMode === 'sw'\n ? start.anchorXpx\n : containerDims.w - start.anchorXpx\n const snapTargetH =\n dragMode === 'nw' || dragMode === 'ne'\n ? start.anchorYpx\n : containerDims.h - start.anchorYpx\n\n const canSnapW =\n !cornerSnapDisabled &&\n snapTargetW >= minFrameW &&\n snapTargetW <= maxFrameW\n const canSnapH =\n !cornerSnapDisabled &&\n snapTargetH * targetAspect >= minFrameW &&\n snapTargetH * targetAspect <= maxFrameW\n const distW = Math.abs(lockedW - snapTargetW)\n const distH = Math.abs(lockedH - snapTargetH)\n const engageThreshold = SNAP_ENGAGE_PX\n const disengageThreshold = SNAP_DISENGAGE_PX\n\n if (cornerSnapDisabled) {\n start.snapEngaged = undefined\n } else if (start.snapEngaged === 'w') {\n if (canSnapW && distW < disengageThreshold) {\n lockedW = snapTargetW\n lockedH = lockedW / targetAspect\n } else {\n start.snapEngaged = undefined\n }\n } else if (start.snapEngaged === 'h') {\n if (canSnapH && distH < disengageThreshold) {\n lockedH = snapTargetH\n lockedW = lockedH * targetAspect\n } else {\n start.snapEngaged = undefined\n }\n } else {\n // Não snapado — engaja APENAS se user aproximou ativamente (prev > engage,\n // current < engage). Sem isso, snap engajava no click quando aspect-lock\n // natural já estava perto do target → frame congelava sem responder.\n const approachingW =\n start.prevDistW !== undefined &&\n start.prevDistW >= engageThreshold &&\n distW < engageThreshold\n const approachingH =\n start.prevDistH !== undefined &&\n start.prevDistH >= engageThreshold &&\n distH < engageThreshold\n if (canSnapW && approachingW) {\n lockedW = snapTargetW\n lockedH = lockedW / targetAspect\n start.snapEngaged = 'w'\n } else if (canSnapH && approachingH) {\n lockedH = snapTargetH\n lockedW = lockedH * targetAspect\n start.snapEngaged = 'h'\n }\n }\n // Track prev distances pra próxima iteração (depois do snap pra evitar\n // que o snap mascare o \"user aproximando\" — usamos as dists ORIGINAIS).\n start.prevDistW = distW\n start.prevDistH = distH\n\n // Frame position com anchor fixo (allow extension além do source).\n const newFrameLPx =\n pointerXpx >= start.anchorXpx ? start.anchorXpx : start.anchorXpx - lockedW\n const newFrameTPx =\n pointerYpx >= start.anchorYpx ? start.anchorYpx : start.anchorYpx - lockedH\n\n // Scale derivado do novo frame size (mesmo que antes).\n const newFrameWSrc = lockedW / containerDims.w\n const newFrameHSrc = lockedH / containerDims.h\n const newScale = clamp(\n 1 / (newFrameWSrc * coverWFrac),\n MIN_SCALE,\n MAX_SCALE,\n )\n const newFrameLSrc = newFrameLPx / containerDims.w\n const newFrameTSrc = newFrameTPx / containerDims.h\n\n // Preserva focal — body drag e corner drag separam responsabilidades.\n // Body drag mexe overflow only; corner drag mexe scale + overflow only.\n // Math da fórmula visual:\n // frame_left_src = (focal/100)*(1-fw_src) - displayOverflowX * fw_src\n // Solve pra displayOverflow (focal fixed):\n // displayOverflow = ((focal/100)*(1-fw_src) - frame_left_src) / fw_src\n const startDispFocalX = mirror ? 100 - start.focalX : start.focalX\n const startDispFocalY = start.focalY\n const newDispOverflowX =\n newFrameWSrc > 0.001\n ? ((startDispFocalX / 100) * (1 - newFrameWSrc) - newFrameLSrc) /\n newFrameWSrc\n : start.overflowX\n const newDispOverflowY =\n newFrameHSrc > 0.001\n ? ((startDispFocalY / 100) * (1 - newFrameHSrc) - newFrameTSrc) /\n newFrameHSrc\n : start.overflowY\n const newOverflowX = mirror ? -newDispOverflowX : newDispOverflowX\n const newOverflowY = newDispOverflowY\n // Hard clamp: garantir overlap mínimo do frame com source.\n const MIN_FRAME_OVERLAP_CORNER = 0.05\n const dispOverflowX_corner = mirror ? -newOverflowX : newOverflowX\n const dispOverflowY_corner = newOverflowY\n let cornerClampedFLeftSrc =\n (startDispFocalX / 100) * (1 - newFrameWSrc) -\n dispOverflowX_corner * newFrameWSrc\n let cornerClampedFTopSrc =\n (startDispFocalY / 100) * (1 - newFrameHSrc) -\n dispOverflowY_corner * newFrameHSrc\n const minFLeft_c = -(newFrameWSrc - MIN_FRAME_OVERLAP_CORNER)\n const maxFLeft_c = 1 - MIN_FRAME_OVERLAP_CORNER\n const minFTop_c = -(newFrameHSrc - MIN_FRAME_OVERLAP_CORNER)\n const maxFTop_c = 1 - MIN_FRAME_OVERLAP_CORNER\n cornerClampedFLeftSrc = clamp(cornerClampedFLeftSrc, minFLeft_c, maxFLeft_c)\n cornerClampedFTopSrc = clamp(cornerClampedFTopSrc, minFTop_c, maxFTop_c)\n let finalOverflowX = newOverflowX\n let finalOverflowY = newOverflowY\n if (newFrameWSrc > 0.001) {\n const clampedDispOverflowX_c =\n ((startDispFocalX / 100) * (1 - newFrameWSrc) - cornerClampedFLeftSrc) /\n newFrameWSrc\n finalOverflowX = mirror ? -clampedDispOverflowX_c : clampedDispOverflowX_c\n }\n if (newFrameHSrc > 0.001) {\n const clampedDispOverflowY_c =\n ((startDispFocalY / 100) * (1 - newFrameHSrc) - cornerClampedFTopSrc) /\n newFrameHSrc\n finalOverflowY = clampedDispOverflowY_c\n }\n // Live override em px — frame renderiza com EXATAMENTE estes valores,\n // bypassando a back-derivação focal/overflow → anchor fixed pixel-perfect.\n setLiveCornerDrag({\n leftPx: newFrameLPx,\n topPx: newFrameTPx,\n wPx: lockedW,\n hPx: lockedH,\n })\n applyFocal(start.focalX, start.focalY, newScale, {\n overflowX: finalOverflowX,\n overflowY: finalOverflowY,\n })\n }\n\n /**\n * Move o frame em N pixels nas direções X/Y. Reusa a math do body drag\n * (delta px → delta target frac → overflow X/Y + clamp por overlap mínimo).\n * Usado pelo keyboard nudge (arrow keys); pode ser reaproveitado pra\n * presets de alinhamento futuros.\n */\n const nudgeFrame = useCallback(\n (deltaXpx: number, deltaYpx: number) => {\n if (!containerDims) return\n const actualFrameWSrc =\n liveCornerDrag && containerDims.w > 0\n ? liveCornerDrag.wPx / containerDims.w\n : frameWFracSrc\n const actualFrameHSrc =\n liveCornerDrag && containerDims.h > 0\n ? liveCornerDrag.hPx / containerDims.h\n : frameHFracSrc\n if (actualFrameWSrc <= 0 || actualFrameHSrc <= 0) return\n const dxTargetFrac = deltaXpx / (actualFrameWSrc * containerDims.w)\n const dyTargetFrac = deltaYpx / (actualFrameHSrc * containerDims.h)\n const adjDxTargetFrac = mirror ? -dxTargetFrac : dxTargetFrac\n let candOverflowX = overflowX - adjDxTargetFrac\n let candOverflowY = overflowY - dyTargetFrac\n const MIN_FRAME_OVERLAP = 0.05\n const dispFocalX_b = mirror ? 100 - focalX : focalX\n const dispFocalY_b = focalY\n const dispOverflowX_clamp = mirror ? -candOverflowX : candOverflowX\n const dispOverflowY_clamp = candOverflowY\n let clampedFLeftSrc =\n (dispFocalX_b / 100) * (1 - actualFrameWSrc) -\n dispOverflowX_clamp * actualFrameWSrc\n let clampedFTopSrc =\n (dispFocalY_b / 100) * (1 - actualFrameHSrc) -\n dispOverflowY_clamp * actualFrameHSrc\n const minFLeft = -(actualFrameWSrc - MIN_FRAME_OVERLAP)\n const maxFLeft = 1 - MIN_FRAME_OVERLAP\n const minFTop = -(actualFrameHSrc - MIN_FRAME_OVERLAP)\n const maxFTop = 1 - MIN_FRAME_OVERLAP\n clampedFLeftSrc = clamp(clampedFLeftSrc, minFLeft, maxFLeft)\n clampedFTopSrc = clamp(clampedFTopSrc, minFTop, maxFTop)\n if (actualFrameWSrc > 0.001) {\n const clampedDispOverflowX =\n ((dispFocalX_b / 100) * (1 - actualFrameWSrc) - clampedFLeftSrc) /\n actualFrameWSrc\n candOverflowX = mirror ? -clampedDispOverflowX : clampedDispOverflowX\n }\n if (actualFrameHSrc > 0.001) {\n const clampedDispOverflowY =\n ((dispFocalY_b / 100) * (1 - actualFrameHSrc) - clampedFTopSrc) /\n actualFrameHSrc\n candOverflowY = clampedDispOverflowY\n }\n const frameWPxOverride =\n liveCornerDrag?.wPx ?? frameWFracSrc * containerDims.w\n const frameHPxOverride =\n liveCornerDrag?.hPx ?? frameHFracSrc * containerDims.h\n setLiveCornerDrag({\n leftPx: clampedFLeftSrc * containerDims.w,\n topPx: clampedFTopSrc * containerDims.h,\n wPx: frameWPxOverride,\n hPx: frameHPxOverride,\n })\n applyFocal(focalX, focalY, scale, {\n overflowX: candOverflowX,\n overflowY: candOverflowY,\n })\n },\n [\n containerDims,\n liveCornerDrag,\n frameWFracSrc,\n frameHFracSrc,\n mirror,\n overflowX,\n overflowY,\n focalX,\n focalY,\n scale,\n applyFocal,\n ],\n )\n\n // Keyboard nudge: ArrowKeys movem o frame 1px na direção; Shift+Arrow = 10px.\n // Listener global mas ignora quando foco está em input/textarea/contenteditable\n // (range sliders + color/text inputs do painel de Edição continuam funcionando\n // normalmente). PreventDefault evita scroll da página com arrow keys.\n useEffect(() => {\n if (!imageUrl) return\n function onKey(e: KeyboardEvent) {\n const ae = document.activeElement as HTMLElement | null\n if (ae) {\n const tag = ae.tagName\n if (tag === 'INPUT' || tag === 'TEXTAREA' || tag === 'SELECT' || ae.isContentEditable) {\n return\n }\n }\n const step = e.shiftKey ? 10 : 1\n switch (e.key) {\n case 'ArrowLeft':\n e.preventDefault()\n nudgeFrame(-step, 0)\n break\n case 'ArrowRight':\n e.preventDefault()\n nudgeFrame(step, 0)\n break\n case 'ArrowUp':\n e.preventDefault()\n nudgeFrame(0, -step)\n break\n case 'ArrowDown':\n e.preventDefault()\n nudgeFrame(0, step)\n break\n }\n }\n window.addEventListener('keydown', onKey)\n return () => window.removeEventListener('keydown', onKey)\n }, [imageUrl, nudgeFrame])\n\n function handlePointerUp(e: React.PointerEvent) {\n setDragMode(null)\n dragStartRef.current = null\n // NÃO limpamos liveCornerDrag aqui — manter o override permanente garante\n // que o canto oposto fica EXATAMENTE no pixel do anchor mesmo após soltar.\n // Se zerássemos, o render voltaria pra math state-based que pode ter\n // sub-pixel drift (round-trip parsePosition → formatPos, focal × fw_frac,\n // etc) → salto visível de 1-3px no momento do release.\n // State (focal/scale/overflow) continua atualizado pra persistir corretamente.\n try {\n outerRef.current?.releasePointerCapture(e.pointerId)\n } catch {\n // ignore\n }\n }\n\n if (!imageUrl) return null\n\n // Backdrop bg do editor (cor + opacity da config do user) — visível\n // no padding ao redor do source e quando frame extende além do source.\n const backdropBg = (() => {\n const c = value.backdropColor\n if (c === 'transparent') return undefined\n const op = (value.backdropOpacity ?? 100) / 100\n const hex = c && c !== 'transparent' ? c : '#13203B'\n const h = hex.replace('#', '')\n if (h.length !== 6) return hex\n const r = parseInt(h.slice(0, 2), 16)\n const g = parseInt(h.slice(2, 4), 16)\n const b = parseInt(h.slice(4, 6), 16)\n return `rgba(${r}, ${g}, ${b}, ${op})`\n })()\n\n // Layout: outer (backdrop bg + padding) > source-box (containerRef, aspect\n // = source aspect, img object-contain) > frame overlay em source-coords.\n // Padding fixo de 48px dá room pra frame extender ~25% além do source antes\n // de bater na borda do outer (= scale ~0.8 ainda totalmente visível). Em\n // zoom-out mais agressivo, frame clipa no outer mas math continua válida.\n const editorH = maxHeight ?? 520\n const PAD = 48\n // Clampa sourceBoxW pra caber no editor column do modal (~640px alocado em\n // computeEditModalSize, menos 96px do PAD = ~544px disponível). Se imagem\n // for muito wide (aspect alto), shrink ambas as dims mantendo aspect — assim\n // container renderiza com aspect correto (sem flex-shrink só na W).\n const MAX_SOURCE_BOX_W = 544\n let sourceBoxH = Math.max(120, editorH - PAD * 2)\n let sourceBoxW = sourceBoxH * panelAspect\n if (sourceBoxW > MAX_SOURCE_BOX_W) {\n sourceBoxW = MAX_SOURCE_BOX_W\n sourceBoxH = sourceBoxW / panelAspect\n }\n\n return (\n <div className=\"space-y-2\">\n <p className=\"text-[10px] font-semibold uppercase leading-snug tracking-wider text-neutral-500\">\n Arraste o quadro e puxe os cantos para posicionar\n <br />\n Setas = 1px · Shift+Setas = 10px · Shift ao arrastar = sem snap\n </p>\n <div\n ref={outerRef}\n className=\"relative mx-auto select-none rounded-md border-2 border-white/30 shadow-[0_0_0_1px_rgba(0,0,0,0.5)]\"\n style={{\n height: editorH,\n width: sourceBoxW + PAD * 2,\n maxWidth: '100%',\n padding: PAD,\n boxSizing: 'border-box',\n backgroundColor: backdropBg,\n touchAction: 'none',\n overflow: 'hidden',\n display: 'flex',\n alignItems: 'center',\n justifyContent: 'center',\n }}\n onPointerMove={handlePointerMove}\n onPointerUp={handlePointerUp}\n onPointerCancel={handlePointerUp}\n >\n <div\n ref={containerRef}\n className=\"relative\"\n style={{\n height: sourceBoxH,\n width: sourceBoxW,\n overflow: 'visible',\n boxShadow: '0 0 0 1px rgba(255,255,255,0.18)',\n }}\n >\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img\n ref={imgRef}\n src={imageUrl}\n alt=\"\"\n onLoad={onImgLoad}\n className=\"pointer-events-none absolute inset-0 h-full w-full\"\n draggable={false}\n style={{\n objectFit: 'contain',\n objectPosition: 'center',\n transform: mirror ? 'scaleX(-1)' : undefined,\n transformOrigin: 'center center',\n filter,\n }}\n />\n\n {imgDims && (\n <div\n className=\"absolute pointer-events-auto\"\n style={{\n // Durante corner drag ativo, render usa pixel ABSOLUTOS do\n // liveCornerDrag → anchor fica EXATAMENTE preso sem drift\n // da math state-based. Fora do corner drag, math normal.\n left: liveCornerDrag && containerDims\n ? `${(liveCornerDrag.leftPx / containerDims.w) * 100}%`\n : `${frameLeftFracSrc * 100}%`,\n top: liveCornerDrag && containerDims\n ? `${(liveCornerDrag.topPx / containerDims.h) * 100}%`\n : `${frameTopFracSrc * 100}%`,\n width: liveCornerDrag && containerDims\n ? `${(liveCornerDrag.wPx / containerDims.w) * 100}%`\n : `${frameWFracSrc * 100}%`,\n height: liveCornerDrag && containerDims\n ? `${(liveCornerDrag.hPx / containerDims.h) * 100}%`\n : `${frameHFracSrc * 100}%`,\n cursor: 'move',\n boxShadow:\n 'inset 0 0 0 2px white, inset 0 0 0 3px rgba(0,0,0,0.5), 0 0 8px rgba(0,0,0,0.4)',\n }}\n onPointerDown={(e) => startDrag('move', e)}\n >\n <CornerHandle pos=\"nw\" onStart={(e) => startDrag('nw', e)} />\n <CornerHandle pos=\"ne\" onStart={(e) => startDrag('ne', e)} />\n <CornerHandle pos=\"sw\" onStart={(e) => startDrag('sw', e)} />\n <CornerHandle pos=\"se\" onStart={(e) => startDrag('se', e)} />\n </div>\n )}\n </div>\n </div>\n </div>\n )\n}\n\nfunction CornerHandle({\n pos,\n onStart,\n}: {\n pos: 'nw' | 'ne' | 'sw' | 'se'\n onStart: (e: React.PointerEvent) => void\n}) {\n const offset = '-8px'\n const cornerStyle: React.CSSProperties = {\n position: 'absolute',\n width: 16,\n height: 16,\n borderRadius: 3,\n background: 'white',\n border: '1px solid rgba(0,0,0,0.55)',\n boxShadow: '0 1px 3px rgba(0,0,0,0.4)',\n touchAction: 'none',\n }\n if (pos === 'nw') {\n cornerStyle.top = offset\n cornerStyle.left = offset\n cornerStyle.cursor = 'nwse-resize'\n } else if (pos === 'ne') {\n cornerStyle.top = offset\n cornerStyle.right = offset\n cornerStyle.cursor = 'nesw-resize'\n } else if (pos === 'sw') {\n cornerStyle.bottom = offset\n cornerStyle.left = offset\n cornerStyle.cursor = 'nesw-resize'\n } else {\n cornerStyle.bottom = offset\n cornerStyle.right = offset\n cornerStyle.cursor = 'nwse-resize'\n }\n return (\n <div\n style={cornerStyle}\n onPointerDown={(e) => {\n e.stopPropagation()\n onStart(e)\n }}\n />\n )\n}\n","'use client'\n\nimport { useEffect, useRef, useState } from 'react'\n\nimport { BadgeOverlay } from './badge-overlay'\nimport {\n ImageCropPicker,\n buildImageFilter,\n parsePosition,\n formatPos,\n type CropValue,\n} from './image-crop-picker'\nimport type {\n ImagePickerProps,\n UploadItem,\n UploadAdapter,\n ImagePreset,\n BadgeData,\n} from './types'\n\nexport type { CropValue }\n\nconst DEFAULT_SEPIA_COLOR = '#704214'\n\n/**\n * Identity fallback quando `uploadAdapter.resolveUrl` não é provido.\n */\nfunction defaultResolveUrl(url: string): string {\n return url\n}\n\n/**\n * Compõe o style CSS do `<img>` posicionado absolutamente dentro de um\n * container `position: relative; overflow: hidden`.\n *\n * Semântica focal: 0-100% = POSIÇÃO DA IMAGEM no container (não source\n * point no centro). 0 = image alinhada à esquerda/topo; 100 = direita/baixo;\n * 50 = centralizada. Funciona consistente em qualquer scale:\n *\n * - Scale > 1 (overflow): focal controla qual parte do source é visível.\n * focal=0 → vê source LEFT (right cortado); focal=100 → vê source RIGHT.\n * - Scale = 1: cover exato, focal controla pequenos shifts.\n * - Scale < 1 (image cabe no container): focal controla onde a imagem sit\n * dentro do container. Backdrop visível no espaço vazio.\n *\n * Drag right da imagem → image move right → focal aumenta. Intuitivo\n * em qualquer scale.\n *\n * Requer parent com `position: relative` e `overflow: hidden`.\n */\nfunction computeImageDisplayStyle(opts: {\n position: string\n scale: number\n mirror: boolean\n imgDims: { w: number; h: number } | null\n targetAspect: number\n filter?: string\n overflowX?: number\n overflowY?: number\n}): React.CSSProperties {\n const { position, scale, mirror, imgDims, targetAspect, filter } = opts\n const overflowX = opts.overflowX ?? 0\n const overflowY = opts.overflowY ?? 0\n const focal = parsePosition(position)\n const imgAspect = imgDims ? imgDims.w / imgDims.h : 1\n\n // Cover fractions\n let coverWFrac = 1\n let coverHFrac = 1\n if (imgAspect > targetAspect) {\n coverWFrac = imgAspect / targetAspect\n } else {\n coverHFrac = targetAspect / imgAspect\n }\n\n const renderedW = scale * coverWFrac\n const renderedH = scale * coverHFrac\n\n // NEW: focal = image position in container.\n // focal=0 → image_left=0 (image at container left)\n // focal=100 → image_left = 1 - renderedW (image at container right)\n // Linear interp: image_left = focal/100 * (1 - renderedW)\n // - Scale > 1 (renderedW > 1): 1 - renderedW < 0. image_left vai de 0 a (1-renderedW)\n // (overflow); focal=0 mostra source LEFT, focal=100 mostra source RIGHT.\n // - Scale < 1 (renderedW < 1): 1 - renderedW > 0. image_left vai de 0 a (1-renderedW)\n // (image dentro do container); focal=0 = image left, focal=100 = right.\n // Overflow soma um shift adicional em target frac (idem lp-react patch\n // aditivo): leftFrac = (focal/100) * (1 - renderedW) + overflowX.\n const leftFrac = (focal.x / 100) * (1 - renderedW) + overflowX\n const topFrac = (focal.y / 100) * (1 - renderedH) + overflowY\n\n return {\n position: 'absolute',\n display: 'block',\n // Override Tailwind/normalize reset (max-width:100%; height:auto) que\n // estavam clampando a imagem em 100% do container e distorcendo o aspect.\n maxWidth: 'none',\n maxHeight: 'none',\n width: `${renderedW * 100}%`,\n height: `${renderedH * 100}%`,\n left: `${leftFrac * 100}%`,\n top: `${topFrac * 100}%`,\n transform: mirror ? 'scaleX(-1)' : undefined,\n transformOrigin: 'center center',\n filter,\n }\n}\n\n/**\n * Resolve o backgroundColor do container baseado em backdropColor +\n * backdropOpacity do crop. Mesma math usada em todos os previews + editor\n * pra garantir paridade visual. `transparent` ou ausente → undefined\n * (caller usa fallback próprio).\n */\nfunction resolveBackdropBg(crop: CropValue | undefined): string | undefined {\n if (!crop) return undefined\n const c = crop.backdropColor\n if (c === 'transparent') return undefined\n const op = (crop.backdropOpacity ?? 100) / 100\n const hex = c && c !== 'transparent' ? c : '#13203B'\n const h = hex.replace('#', '')\n if (h.length !== 6) return hex\n const r = parseInt(h.slice(0, 2), 16)\n const g = parseInt(h.slice(2, 4), 16)\n const b = parseInt(h.slice(4, 6), 16)\n return `rgba(${r}, ${g}, ${b}, ${op})`\n}\n\nconst ASPECT_RATIO: Record<NonNullable<ImagePickerProps['aspect']>, number> = {\n '1/1': 1,\n '3/4': 3 / 4,\n '16/9': 16 / 9,\n '4/3': 4 / 3,\n}\n\ntype Tab = 'images' | 'url'\ntype Panel = null | 'edit' | 'change'\n\nfunction bytesHuman(n: number): string {\n if (n < 1024) return `${n}B`\n if (n < 1024 * 1024) return `${(n / 1024).toFixed(0)}KB`\n return `${(n / (1024 * 1024)).toFixed(1)}MB`\n}\n\n/**\n * Calcula a largura ótima do modal de edição baseado no aspect ratio da\n * imagem natural + viewport disponível. Resultado fica entre 500-1100px.\n *\n * Math: o image-crop-picker mostra a imagem com `maxHeight: min(60vh,520px)`\n * e width proporcional ao aspect. A sidebar é 160px (w-40) + 12px gap.\n * Padding do modal body = 40px (p-5 em 2 lados). Header/footer não afetam W.\n */\nfunction computeEditModalSize(\n imageDims: { w: number; h: number } | null,\n targetAspect: number,\n): { style: React.CSSProperties; editorMaxHeight: number } {\n if (typeof window === 'undefined') {\n return {\n style: { width: '1100px', maxWidth: 'calc(100vw - 32px)' },\n editorMaxHeight: 480,\n }\n }\n const vw = window.innerWidth\n const vh = window.innerHeight\n // Altura útil do body do modal: 90vh - header(~50) - footer(~56) - padding(40)\n const bodyHeightAvail = Math.max(280, vh * 0.9 - 146)\n // Edição precisa de ~440px pra todos os controles sem scroll. Limita a\n // altura do editor pra coluna do meio caber abaixo desse target.\n const editorMaxHeight = Math.min(bodyHeightAvail, 520)\n // Editor source-with-frame: outer = source-box + 48px padding cada lado.\n // source-box H = editorMaxHeight - 96; source-box W = sourceH × sourceAspect.\n // outer W = source-box W + 96.\n const sourceAspect = imageDims ? imageDims.w / imageDims.h : 4 / 3\n const sourceBoxH = Math.max(120, editorMaxHeight - 96)\n const sourceBoxW = sourceBoxH * sourceAspect\n const editorWidth = Math.min(sourceBoxW + 96, 640)\n // Colunas: preview (200-240) + editor + edição (208) + 2 gaps de 16 + padding 40\n const previewColWidth = targetAspect >= 1 ? 240 : 200\n const editColWidth = 208\n const gapsAndPadding = 32 + 40\n const total = previewColWidth + editorWidth + editColWidth + gapsAndPadding\n const clamped = Math.max(720, Math.min(1300, total))\n const final = Math.min(clamped, vw - 32)\n return {\n style: { width: `${Math.round(final)}px` },\n editorMaxHeight: Math.round(editorMaxHeight),\n }\n}\n\n/**\n * Carrega as dimensões naturais de uma URL de imagem. Retorna `null` em caso\n * de falha. Não bloqueia caller — usar com await/.then.\n */\nfunction probeImageDims(\n url: string,\n): Promise<{ w: number; h: number } | null> {\n return new Promise((resolve) => {\n if (typeof window === 'undefined') {\n resolve(null)\n return\n }\n const img = new window.Image()\n img.onload = () =>\n resolve({ w: img.naturalWidth, h: img.naturalHeight })\n img.onerror = () => resolve(null)\n img.src = url\n })\n}\n\n// ─── Modal helper ────────────────────────────────────────────────────────────\n\nfunction Modal({\n open,\n onClose,\n title,\n children,\n widthClass = 'max-w-3xl w-full',\n widthStyle,\n footer,\n}: {\n open: boolean\n onClose: () => void\n title: string\n children: React.ReactNode\n /** Classes Tailwind que controlam a largura do modal (default `max-w-3xl w-full`). */\n widthClass?: string\n /** Style inline pra travar largura/dimensões (sobrepõe widthClass). */\n widthStyle?: React.CSSProperties\n /** Slot opcional pra ações (ex: botão Confirmar) no rodapé. */\n footer?: React.ReactNode\n}) {\n useEffect(() => {\n if (!open) return\n function onKey(e: KeyboardEvent) {\n if (e.key === 'Escape') onClose()\n }\n window.addEventListener('keydown', onKey)\n const prev = document.body.style.overflow\n document.body.style.overflow = 'hidden'\n return () => {\n window.removeEventListener('keydown', onKey)\n document.body.style.overflow = prev\n }\n }, [open, onClose])\n\n if (!open) return null\n return (\n <div\n className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/60 p-4\"\n onMouseDown={(e) => {\n if (e.target === e.currentTarget) onClose()\n }}\n >\n <div\n className={`${widthStyle ? '' : widthClass} flex max-h-[90vh] flex-col overflow-hidden rounded-lg bg-white shadow-2xl`}\n style={widthStyle}\n >\n <div className=\"flex shrink-0 items-center justify-between border-b border-neutral-200 px-5 py-3\">\n <h3 className=\"text-sm font-semibold uppercase tracking-wider text-neutral-700\">\n {title}\n </h3>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"rounded-full p-1 text-neutral-500 hover:bg-neutral-100 hover:text-neutral-900\"\n aria-label=\"Fechar\"\n >\n <svg width=\"18\" height=\"18\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\">\n <path d=\"M18 6L6 18M6 6l12 12\" />\n </svg>\n </button>\n </div>\n {/* Body: scroll só quando o conteúdo realmente excede a altura\n disponível. Centraliza vertical/horizontal quando cabe. */}\n <div className=\"flex flex-1 items-center justify-center overflow-auto p-5\">\n <div className=\"w-full\">{children}</div>\n </div>\n {footer && (\n <div className=\"shrink-0 border-t border-neutral-200 bg-neutral-50 px-5 py-3\">\n {footer}\n </div>\n )}\n </div>\n </div>\n )\n}\n\n// ─── Collapsible (accordion-style section) ──────────────────────────────────\n\nfunction Collapsible({\n label,\n defaultOpen = false,\n children,\n}: {\n label: string\n defaultOpen?: boolean\n children: React.ReactNode\n}) {\n const [open, setOpen] = useState(defaultOpen)\n return (\n <div className=\"rounded-md border border-neutral-200 bg-white\">\n <button\n type=\"button\"\n onClick={() => setOpen((v) => !v)}\n className=\"flex w-full items-center justify-between px-3 py-2 text-[11px] font-semibold uppercase tracking-wider text-neutral-700 hover:text-neutral-900\"\n >\n <span>{label}</span>\n <svg\n width=\"14\"\n height=\"14\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n className={`transition-transform duration-200 ${open ? 'rotate-180' : ''}`}\n >\n <polyline points=\"6 9 12 15 18 9\" />\n </svg>\n </button>\n {/* Truque do CSS grid pra animar height auto: a row tem fração 0fr\n (fechada) ou 1fr (aberta), transição na propriedade grid-template-rows.\n O wrapper interno tem overflow-hidden pra cortar o conteúdo durante\n a animação. Duração curta (180ms) ease-out pra sensação de \"rápido\". */}\n <div\n className=\"grid transition-[grid-template-rows] duration-200 ease-out\"\n style={{ gridTemplateRows: open ? '1fr' : '0fr' }}\n >\n <div className=\"overflow-hidden\">\n <div className=\"border-t border-neutral-200 p-3\">{children}</div>\n </div>\n </div>\n </div>\n )\n}\n\n// ─── EditControls ────────────────────────────────────────────────────────────\n\n/**\n * Painel \"EDIÇÃO\" — agrupa as operações da imagem:\n * - Espelhar (toggle)\n * - Cor de fundo + Filtros (collapsibles)\n *\n * Zoom é controlado direto via corner-drag no editor (sem slider redundante).\n */\nfunction EditControls({\n crop,\n onChange,\n}: {\n crop: CropValue\n onChange: (next: CropValue) => void\n}) {\n const saturation = crop.saturation ?? 100\n const sepia = crop.sepia ?? 0\n const sepiaColor = crop.sepiaColor ?? DEFAULT_SEPIA_COLOR\n const mirror = !!crop.mirror\n const backdropColor = crop.backdropColor\n const backdropOpacity = crop.backdropOpacity\n const { x: opX, y: opY } = parsePosition(crop.position)\n\n function update(patch: Partial<CropValue>) {\n onChange({ ...crop, ...patch })\n }\n\n function toggleMirror() {\n update({\n mirror: !mirror,\n position: formatPos(100 - opX, opY),\n })\n }\n\n return (\n <div className=\"space-y-3 rounded-md border border-neutral-200 bg-neutral-50 p-3\">\n <p className=\"text-[10px] font-semibold uppercase tracking-wider text-neutral-500\">\n Edição\n </p>\n\n {/* Espelhar */}\n <button\n type=\"button\"\n onClick={toggleMirror}\n className={`w-full whitespace-nowrap rounded-md border px-3 py-1.5 text-xs font-semibold transition-colors ${\n mirror\n ? 'border-[color:var(--ie-accent,#556FFF)] bg-[color:var(--ie-accent,#556FFF)] text-white'\n : 'border-neutral-300 bg-white text-neutral-700 hover:border-neutral-500'\n }`}\n >\n {mirror ? '⇆ Espelhada' : '⇆ Espelhar'}\n </button>\n\n <Collapsible label=\"Cor de fundo\" defaultOpen={true}>\n {/* Opacidade (slider) + Cor (color picker + hex input, modelo Sépia). */}\n <div>\n <div className=\"mb-1 flex items-center justify-between text-[11px] text-neutral-700\">\n <label htmlFor=\"backdrop-opacity\" className=\"font-semibold\">\n Opacidade\n </label>\n <span className=\"font-mono tabular-nums text-neutral-500\">\n {backdropOpacity ?? 100}%\n </span>\n </div>\n <input\n id=\"backdrop-opacity\"\n type=\"range\"\n min={0}\n max={100}\n step={5}\n value={backdropOpacity ?? 100}\n onChange={(e) =>\n update({ backdropOpacity: Number(e.target.value) })\n }\n className=\"w-full accent-[color:var(--ie-accent,#556FFF)]\"\n />\n </div>\n <div className=\"mt-2 flex items-center gap-2\">\n <label\n htmlFor=\"backdrop-color\"\n className=\"text-[10px] font-semibold text-neutral-700\"\n >\n Cor:\n </label>\n <input\n id=\"backdrop-color\"\n type=\"color\"\n value={\n backdropColor && backdropColor !== 'transparent'\n ? backdropColor\n : '#13203B'\n }\n onChange={(e) => update({ backdropColor: e.target.value })}\n className=\"h-6 w-8 cursor-pointer rounded border border-neutral-300 p-0\"\n aria-label=\"Cor de fundo\"\n />\n <input\n type=\"text\"\n value={\n backdropColor && backdropColor !== 'transparent'\n ? backdropColor\n : '#13203B'\n }\n onChange={(e) => {\n const v = e.target.value\n if (/^#[0-9a-fA-F]{0,6}$/.test(v)) update({ backdropColor: v })\n }}\n className=\"w-20 rounded border border-neutral-300 px-2 py-1 font-mono text-[10px] uppercase\"\n placeholder=\"#13203B\"\n />\n </div>\n <button\n type=\"button\"\n onClick={() =>\n update({ backdropColor: undefined, backdropOpacity: undefined })\n }\n className=\"mt-3 w-full rounded-md border border-neutral-300 bg-white px-3 py-1.5 text-[10px] font-semibold uppercase tracking-wider text-neutral-700 transition-colors hover:border-neutral-500\"\n >\n Resetar fundo\n </button>\n </Collapsible>\n\n <Collapsible label=\"Filtros\" defaultOpen={true}>\n {/* Saturação */}\n <div>\n <div className=\"mb-1 flex items-center justify-between text-[11px] text-neutral-700\">\n <label htmlFor=\"filter-saturation\" className=\"font-semibold\">\n Saturação\n </label>\n <span className=\"font-mono tabular-nums text-neutral-500\">\n {saturation}%\n </span>\n </div>\n <input\n id=\"filter-saturation\"\n type=\"range\"\n min={0}\n max={200}\n step={5}\n value={saturation}\n onChange={(e) => update({ saturation: Number(e.target.value) })}\n className=\"w-full accent-[color:var(--ie-accent,#556FFF)]\"\n />\n <div className=\"mt-0.5 flex justify-between text-[9px] text-neutral-400\">\n <span>Sem cor</span>\n <span>Normal</span>\n <span>Vibrante</span>\n </div>\n </div>\n\n {/* Sépia */}\n <div className=\"mt-3\">\n <div className=\"mb-1 flex items-center justify-between text-[11px] text-neutral-700\">\n <label htmlFor=\"filter-sepia\" className=\"font-semibold\">\n Sépia\n </label>\n <span className=\"font-mono tabular-nums text-neutral-500\">\n {sepia}%\n </span>\n </div>\n <input\n id=\"filter-sepia\"\n type=\"range\"\n min={0}\n max={100}\n step={5}\n value={sepia}\n onChange={(e) => update({ sepia: Number(e.target.value) })}\n className=\"w-full accent-[color:var(--ie-accent,#556FFF)]\"\n />\n <div className=\"mt-2 flex items-center gap-2\">\n <label\n htmlFor=\"filter-sepia-color\"\n className=\"text-[10px] font-semibold text-neutral-700\"\n >\n Cor:\n </label>\n <input\n id=\"filter-sepia-color\"\n type=\"color\"\n value={sepiaColor}\n onChange={(e) => update({ sepiaColor: e.target.value })}\n className=\"h-6 w-8 cursor-pointer rounded border border-neutral-300 p-0\"\n aria-label=\"Cor do tint sépia\"\n />\n <input\n type=\"text\"\n value={sepiaColor}\n onChange={(e) => {\n const v = e.target.value\n if (/^#[0-9a-fA-F]{0,6}$/.test(v)) update({ sepiaColor: v })\n }}\n className=\"w-20 rounded border border-neutral-300 px-2 py-1 font-mono text-[10px] uppercase\"\n placeholder=\"#704214\"\n />\n </div>\n </div>\n\n {/* Reset dentro do collapsible — atua só sobre os filtros visíveis. */}\n <button\n type=\"button\"\n onClick={() =>\n update({\n saturation: undefined,\n sepia: undefined,\n sepiaColor: undefined,\n })\n }\n className=\"mt-3 w-full rounded-md border border-neutral-300 bg-white px-3 py-1.5 text-[10px] font-semibold uppercase tracking-wider text-neutral-700 hover:border-neutral-500\"\n >\n Resetar filtros\n </button>\n </Collapsible>\n </div>\n )\n}\n\n// ─── ImagePicker ─────────────────────────────────────────────────────────────\n\nexport function ImagePicker({\n value,\n onChange,\n uploadAdapter,\n label = 'IMAGEM',\n hint,\n aspect = '3/4',\n crop,\n onCropChange,\n badge,\n extraCards,\n presets,\n}: ImagePickerProps) {\n const resolveUrl: NonNullable<UploadAdapter['resolveUrl']> =\n uploadAdapter.resolveUrl ?? defaultResolveUrl\n const canEdit = !!onCropChange && !!value\n const currentPos = crop?.position ?? 'center center'\n const currentScale = crop?.scale ?? 1\n const currentMirror = !!crop?.mirror\n const currentFilter = buildImageFilter({\n grayscale: crop?.grayscale,\n saturation: crop?.saturation,\n sepia: crop?.sepia,\n sepiaColor: crop?.sepiaColor,\n })\n\n const [panel, setPanel] = useState<Panel>(null)\n /**\n * Snapshot do crop no momento que o modal de edição abre. Usado pra\n * restaurar o estado original quando o usuário cancela.\n */\n const [cropSnapshot, setCropSnapshot] = useState<CropValue | null>(null)\n /**\n * Snapshot da URL + aspectRatio anteriores quando trocou imagem e o editor\n * abriu automaticamente. Permite reverter pra imagem anterior se o usuário\n * cancelar. Null = modal aberto sem trocar imagem (cancel não toca URL).\n */\n const [urlSnapshot, setUrlSnapshot] = useState<{\n url: string\n aspectRatio: number | undefined\n } | null>(null)\n /** Dimensões naturais da imagem atual — usadas pra calcular tamanho fixo\n * do modal de edição (lock de largura ao abrir). */\n const [imageDims, setImageDims] = useState<{ w: number; h: number } | null>(null)\n /** Dimensões travadas do modal de edição (set ao abrir, mantidas durante\n * toda a sessão pra evitar reflow). Inclui style do modal + maxHeight do\n * editor interno (pra evitar scroll vertical no body). */\n const [editModalSize, setEditModalSize] = useState<{\n style: React.CSSProperties\n editorMaxHeight: number\n } | null>(null)\n const [tab, setTab] = useState<Tab>('images')\n const [uploads, setUploads] = useState<UploadItem[]>([])\n const [loading, setLoading] = useState(false)\n const [error, setError] = useState<string | null>(null)\n const [progressMsg, setProgressMsg] = useState<string | null>(null)\n const fileInputRef = useRef<HTMLInputElement | null>(null)\n\n /**\n * Ref pra última versão do onCropChange — usado no cancelEdit quando precisa\n * disparar revert do crop num setTimeout(0) APÓS o parent re-renderar com\n * a URL revertida. Sem o ref, o closure captura uma versão velha do callback\n * que ainda enxerga o section com URL nova → revert do crop não funciona.\n */\n const onCropChangeRef = useRef(onCropChange)\n useEffect(() => {\n onCropChangeRef.current = onCropChange\n }, [onCropChange])\n\n // Mantém ref do uploadAdapter pra ser usado nos effects/handlers sem\n // re-dispará-los toda vez que a referência muda (consumer geralmente\n // monta inline, mudaria a cada render).\n const uploadAdapterRef = useRef(uploadAdapter)\n useEffect(() => {\n uploadAdapterRef.current = uploadAdapter\n }, [uploadAdapter])\n\n useEffect(() => {\n void refreshUploads()\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [])\n\n async function refreshUploads() {\n setLoading(true)\n try {\n const items = await uploadAdapterRef.current.list()\n setUploads(items)\n } catch {\n setUploads([])\n }\n setLoading(false)\n }\n\n async function handleFile(file: File) {\n setError(null)\n setProgressMsg(`Otimizando ${file.name}...`)\n try {\n const result = await uploadAdapterRef.current.upload(file)\n setUploads((prev) => [result, ...prev])\n const dimsTxt =\n result.width && result.height ? ` (${result.width}×${result.height} WebP)` : ''\n setProgressMsg(\n `${file.name} → ${bytesHuman(result.sizeBytes)}${dimsTxt}`,\n )\n setTab('images')\n // Mostra mensagem rápida + abre edição automática\n window.setTimeout(() => {\n setProgressMsg(null)\n void pickAndOpenEdit(result.url)\n }, 900)\n } catch (e) {\n const msg = e instanceof Error ? e.message : 'Falha ao subir imagem'\n setError(msg)\n setProgressMsg(null)\n }\n }\n\n async function handleDelete(filename: string) {\n if (!confirm(`Remover \"${filename}\"?`)) return\n const ok = await uploadAdapterRef.current.delete(filename)\n if (!ok) {\n setError('Falha ao remover')\n return\n }\n setUploads((prev) => prev.filter((u) => u.filename !== filename))\n }\n\n /**\n * Pipeline comum: nova imagem foi selecionada → mede dimensões → calcula\n * tamanho fixo do modal → abre edição. O reset do crop é responsabilidade\n * do `onChange` handler do consumer (pra evitar stale-closure de 2 calls\n * encadeados sobrescrevendo um ao outro).\n */\n async function pickAndOpenEdit(url: string) {\n // Snapshot do estado ANTERIOR (URL + aspect + crop) ANTES de propagar\n // o onChange — cancelEdit reverte tudo se o usuário desistir.\n const prevUrl = value\n const prevAspectRatio = imageDims ? imageDims.w / imageDims.h : undefined\n const prevCrop = crop ? { ...crop } : {}\n // Probe SÍNCRONO antes de propagar — assim onChange já recebe o aspect\n // ratio, e o consumer (lp-section-forms) grava no schema atomicamente.\n const dims = await probeImageDims(resolveUrl(url))\n const aspectRatio = dims ? dims.w / dims.h : undefined\n setUrlSnapshot(prevUrl ? { url: prevUrl, aspectRatio: prevAspectRatio } : null)\n setCropSnapshot(prevCrop)\n onChange(url, aspectRatio)\n if (dims) setImageDims(dims)\n setEditModalSize(computeEditModalSize(dims, ASPECT_RATIO[aspect]))\n setPanel('edit')\n }\n\n function handlePickPreset(url: string) {\n void pickAndOpenEdit(url)\n }\n\n function handlePickUpload(url: string) {\n void pickAndOpenEdit(url)\n }\n\n function openEdit() {\n // Editar imagem existente — sem mudança de URL, snapshot só do crop.\n setUrlSnapshot(null)\n setCropSnapshot(crop ?? {})\n setEditModalSize(computeEditModalSize(imageDims, ASPECT_RATIO[aspect]))\n setPanel('edit')\n }\n\n function confirmEdit() {\n setUrlSnapshot(null)\n setCropSnapshot(null)\n setEditModalSize(null)\n setPanel(null)\n }\n\n function cancelEdit() {\n // Se trocou imagem (urlSnapshot existe), reverte URL + aspectRatio pra\n // anterior. O parent (lp-section-forms.tsx) reseta TODOS os crop fields\n // dentro do onChange handler quando URL muda → chamar onCropChange\n // imediato depois bate em estado stale (React batch só aplica a última\n // chamada). setTimeout(0) deixa o parent re-renderar primeiro pra que\n // o onCropChange seguinte faça merge sobre a versão atualizada do section.\n const snapshot = cropSnapshot\n const urlSnap = urlSnapshot\n if (urlSnap && urlSnap.url !== value) {\n onChange(urlSnap.url, urlSnap.aspectRatio)\n if (snapshot) {\n // Usa ref pra pegar a versão FRESCA do onCropChange (com closure\n // sobre o section já revertido pra URL anterior).\n setTimeout(() => onCropChangeRef.current?.(snapshot), 0)\n }\n } else if (snapshot && onCropChange) {\n onCropChange(snapshot)\n }\n setUrlSnapshot(null)\n setCropSnapshot(null)\n setEditModalSize(null)\n setPanel(null)\n }\n\n const aspectClass = {\n '1/1': 'aspect-square',\n '3/4': 'aspect-[3/4]',\n '16/9': 'aspect-video',\n '4/3': 'aspect-[4/3]',\n }[aspect]\n\n const previewSrc = value ? resolveUrl(value) : null\n\n // Probe das dimensões naturais da imagem assim que `previewSrc` muda.\n useEffect(() => {\n if (!previewSrc) {\n setImageDims(null)\n return\n }\n let cancelled = false\n const img = new window.Image()\n img.onload = () => {\n if (!cancelled) {\n setImageDims({ w: img.naturalWidth, h: img.naturalHeight })\n }\n }\n img.src = previewSrc\n return () => {\n cancelled = true\n }\n }, [previewSrc])\n\n return (\n <div className=\"space-y-4 rounded-md border border-neutral-200 bg-neutral-50 p-4\">\n <div>\n <p className=\"text-xs font-semibold uppercase tracking-wider text-neutral-500\">\n {label}\n </p>\n {hint && <p className=\"mt-1 text-xs text-neutral-500\">{hint}</p>}\n </div>\n\n {/* Grid de subcards: preview+ações (largura fixa = largura da imagem +\n padding) + N extraCards (cada um 1fr — dividem o resto igualmente).\n Mobile (grid-cols-1) empilha tudo; md+ usa template via CSS var. */}\n <div\n className=\"grid grid-cols-1 gap-3 md:grid-cols-[var(--ip-cols)]\"\n style={\n {\n '--ip-cols':\n extraCards && extraCards.length > 0\n ? `220px ${Array(extraCards.length).fill('minmax(0, 1fr)').join(' ')}`\n : '1fr',\n } as React.CSSProperties\n }\n >\n {/* Subcard 1: Preview + ações (largura ~ imagem + padding) */}\n <div className=\"flex flex-col gap-3 rounded-md border border-neutral-200 bg-white p-3\">\n <div\n className={`${aspectClass} relative mx-auto w-full max-w-[180px] overflow-hidden rounded-md border border-neutral-200 bg-neutral-50`}\n style={{\n containerType: 'inline-size',\n backgroundColor: previewSrc ? resolveBackdropBg(crop) : undefined,\n }}\n >\n {previewSrc ? (\n <>\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img\n src={previewSrc}\n alt=\"\"\n style={computeImageDisplayStyle({\n position: currentPos,\n scale: currentScale,\n mirror: currentMirror,\n imgDims: imageDims,\n targetAspect: ASPECT_RATIO[aspect],\n filter: currentFilter,\n overflowX: crop?.overflowX,\n overflowY: crop?.overflowY,\n })}\n />\n <BadgeOverlay badge={badge} size=\"sm\" />\n </>\n ) : (\n <div className=\"flex h-full w-full items-center justify-center text-xs text-neutral-400\">\n sem imagem\n </div>\n )}\n </div>\n {!value && (\n <div className=\"text-center text-xs text-neutral-400\">\n Nenhuma imagem selecionada\n </div>\n )}\n <div className=\"mx-auto flex w-full max-w-[180px] flex-col gap-2\">\n {canEdit && (\n <button\n type=\"button\"\n onClick={openEdit}\n className=\"flex w-full items-center justify-center gap-2 rounded-md border border-neutral-300 bg-white px-3 py-1.5 text-xs font-semibold text-neutral-700 hover:border-[color:var(--ie-accent,#556FFF)] hover:text-[color:var(--ie-accent,#556FFF)]\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M17 3a2.85 2.83 0 1 1 4 4L7.5 20.5 2 22l1.5-5.5Z\" />\n </svg>\n Editar imagem\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => setPanel('change')}\n className=\"flex w-full items-center justify-center gap-2 rounded-md border border-neutral-300 bg-white px-3 py-1.5 text-xs font-semibold text-neutral-700 hover:border-[color:var(--ie-accent,#556FFF)] hover:text-[color:var(--ie-accent,#556FFF)]\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"m16 3 4 4-4 4\" />\n <path d=\"M20 7H4\" />\n <path d=\"m8 21-4-4 4-4\" />\n <path d=\"M4 17h16\" />\n </svg>\n {value ? 'Trocar imagem' : 'Selecionar imagem'}\n </button>\n {value && (\n <button\n type=\"button\"\n onClick={() => {\n if (confirm('Remover a imagem selecionada?')) onChange('')\n }}\n className=\"flex w-full items-center justify-center gap-2 rounded-md border border-red-300 bg-white px-3 py-1.5 text-xs font-semibold text-red-600 hover:border-red-500 hover:bg-red-50\"\n >\n <svg width=\"14\" height=\"14\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" strokeWidth=\"2\" strokeLinecap=\"round\" strokeLinejoin=\"round\" aria-hidden=\"true\">\n <path d=\"M3 6h18\" />\n <path d=\"M19 6v14a2 2 0 0 1-2 2H7a2 2 0 0 1-2-2V6\" />\n <path d=\"M8 6V4a2 2 0 0 1 2-2h4a2 2 0 0 1 2 2v2\" />\n <line x1=\"10\" x2=\"10\" y1=\"11\" y2=\"17\" />\n <line x1=\"14\" x2=\"14\" y1=\"11\" y2=\"17\" />\n </svg>\n Remover imagem\n </button>\n )}\n </div>\n </div>\n\n {extraCards?.map((card, i) => (\n <div\n key={i}\n className=\"min-w-0 rounded-md border border-neutral-200 bg-white p-4\"\n >\n {card}\n </div>\n ))}\n </div>\n\n {/* Modal: Editar (crop picker) — largura adapta ao conteúdo (que por sua\n vez depende do aspect ratio da imagem) entre 500 e 1100px. */}\n <Modal\n open={panel === 'edit'}\n onClose={cancelEdit}\n title=\"Editar imagem\"\n widthStyle={editModalSize?.style}\n footer={\n <div className=\"flex justify-end gap-2\">\n <button\n type=\"button\"\n onClick={cancelEdit}\n className=\"rounded-md border border-neutral-300 bg-white px-5 py-2 text-xs font-semibold uppercase tracking-wider text-neutral-700 hover:border-neutral-400 hover:text-neutral-900\"\n >\n Cancelar\n </button>\n <button\n type=\"button\"\n onClick={confirmEdit}\n className=\"rounded-md bg-[color:var(--ie-accent,#556FFF)] px-5 py-2 text-xs font-semibold uppercase tracking-wider text-white hover:bg-[color:var(--ie-accent-hover,#3957E2)]\"\n >\n Confirmar\n </button>\n </div>\n }\n >\n {canEdit && previewSrc && (\n <div className=\"flex flex-col gap-4 md:flex-row md:items-start\">\n {/* Coluna 1: Preview */}\n <div className=\"md:shrink-0\">\n <p className=\"text-[10px] font-semibold uppercase tracking-wider text-neutral-500\">\n Preview\n </p>\n <div\n className=\"relative mt-2 overflow-hidden rounded-md border border-neutral-200 shadow-sm\"\n style={{\n width: `${ASPECT_RATIO[aspect] >= 1 ? 240 : 200}px`,\n aspectRatio: ASPECT_RATIO[aspect],\n backgroundColor: resolveBackdropBg(crop),\n containerType: 'inline-size',\n }}\n >\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img\n src={previewSrc}\n alt=\"\"\n style={computeImageDisplayStyle({\n position: crop?.position ?? 'center center',\n scale: crop?.scale ?? 1,\n mirror: !!crop?.mirror,\n imgDims: imageDims,\n targetAspect: ASPECT_RATIO[aspect],\n filter: buildImageFilter({\n grayscale: crop?.grayscale,\n saturation: crop?.saturation,\n sepia: crop?.sepia,\n sepiaColor: crop?.sepiaColor,\n }),\n overflowX: crop?.overflowX,\n overflowY: crop?.overflowY,\n })}\n />\n <BadgeOverlay badge={badge} size=\"md\" />\n </div>\n <p className=\"mt-1 text-[10px] text-neutral-500\">\n {aspect === '16/9' ? 'Aspect 16:9 (fundo)' : 'Aspect 3:4 (foto)'}\n </p>\n </div>\n\n {/* Coluna 2: Crop editor */}\n <div className=\"min-w-0 flex-1\">\n <ImageCropPicker\n imageUrl={previewSrc}\n targetAspect={ASPECT_RATIO[aspect]}\n value={crop ?? {}}\n onChange={(next) => onCropChange?.(next)}\n maxHeight={editModalSize?.editorMaxHeight}\n />\n </div>\n\n {/* Coluna 3: Painel de Edição */}\n <div className=\"md:w-52 md:shrink-0\">\n <EditControls\n crop={crop ?? {}}\n onChange={(next) => onCropChange?.(next)}\n />\n </div>\n </div>\n )}\n </Modal>\n\n {/* Modal: Trocar (galeria + uploads + URL manual) */}\n <Modal\n open={panel === 'change'}\n onClose={() => setPanel(null)}\n title={value ? 'Trocar imagem' : 'Selecionar imagem'}\n widthClass=\"max-w-3xl w-full\"\n >\n <div className=\"space-y-4\">\n <div className=\"flex gap-1 border-b border-neutral-200\">\n {(\n [\n ['images', `Imagens (${uploads.length})`],\n ['url', 'URL manual'],\n ] as Array<[Tab, string]>\n ).map(([id, name]) => (\n <button\n key={id}\n type=\"button\"\n onClick={() => setTab(id)}\n className={`px-3 py-2 text-xs font-semibold uppercase tracking-wider transition-colors ${\n tab === id\n ? 'border-b-2 border-[color:var(--ie-accent,#556FFF)] text-[color:var(--ie-accent,#556FFF)]'\n : 'text-neutral-500 hover:text-neutral-700'\n }`}\n >\n {name}\n </button>\n ))}\n </div>\n\n {progressMsg && (\n <div className=\"rounded-md border border-blue-200 bg-blue-50 px-3 py-2 text-xs text-blue-800\">\n {progressMsg}\n </div>\n )}\n {error && (\n <div className=\"rounded-md border border-red-200 bg-red-50 px-3 py-2 text-xs text-red-800\">\n {error}\n </div>\n )}\n\n {tab === 'images' && (\n <div className=\"space-y-4\">\n {/* Dropzone de upload */}\n <div\n onDragOver={(e) => e.preventDefault()}\n onDrop={(e) => {\n e.preventDefault()\n const file = e.dataTransfer.files[0]\n if (file) void handleFile(file)\n }}\n className=\"flex flex-col items-center justify-center gap-2 rounded-md border-2 border-dashed border-neutral-300 bg-neutral-50 px-4 py-5 text-center\"\n >\n <p className=\"text-sm text-neutral-600\">\n Arraste uma imagem aqui ou\n </p>\n <button\n type=\"button\"\n onClick={() => fileInputRef.current?.click()}\n className=\"rounded-md bg-[color:var(--ie-accent,#556FFF)] px-4 py-2 text-xs font-semibold uppercase tracking-wider text-white hover:bg-[color:var(--ie-accent-hover,#3957E2)]\"\n >\n Selecionar arquivo\n </button>\n <p className=\"text-xs text-neutral-500\">\n JPG, PNG, WebP ou AVIF · Máx 15MB · Otimizado pra WebP automaticamente\n </p>\n <input\n ref={fileInputRef}\n type=\"file\"\n accept=\"image/jpeg,image/png,image/webp,image/avif,image/gif\"\n className=\"hidden\"\n onChange={(e) => {\n const file = e.target.files?.[0]\n if (file) void handleFile(file)\n e.target.value = ''\n }}\n />\n </div>\n\n {/* Subidas (uploads) — primeiro */}\n {loading && (\n <p className=\"text-xs text-neutral-500\">Carregando subidas...</p>\n )}\n {uploads.length > 0 && (\n <div>\n <p className=\"mb-2 text-[10px] font-semibold uppercase tracking-wider text-neutral-500\">\n Subidas ({uploads.length})\n </p>\n <div className=\"grid grid-cols-3 gap-2 md:grid-cols-4\">\n {uploads.map((up) => {\n const selected = value === up.url\n return (\n <div\n key={up.filename}\n className={`group relative overflow-hidden rounded-md border ${\n selected\n ? 'border-[color:var(--ie-accent,#556FFF)] ring-2 ring-[color:var(--ie-accent,#556FFF)]'\n : 'border-neutral-200'\n }`}\n >\n <button\n type=\"button\"\n onClick={() => handlePickUpload(up.url)}\n className=\"block w-full text-left\"\n title={up.filename}\n >\n <div className=\"aspect-square w-full bg-neutral-50\">\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img\n src={resolveUrl(up.url)}\n alt={up.filename}\n className=\"h-full w-full object-cover\"\n loading=\"lazy\"\n />\n </div>\n <div className=\"truncate px-2 py-1 text-[10px] text-neutral-600\">\n {bytesHuman(up.sizeBytes)}\n </div>\n </button>\n <button\n type=\"button\"\n onClick={() => void handleDelete(up.filename)}\n className=\"absolute right-1 top-1 rounded-full bg-black/60 px-2 py-0.5 text-[10px] text-white opacity-0 transition-opacity hover:bg-red-600 group-hover:opacity-100\"\n title=\"Remover\"\n >\n ✕\n </button>\n </div>\n )\n })}\n </div>\n </div>\n )}\n\n {/* Do site (presets) — abaixo. Só renderiza se consumer passou presets. */}\n {presets && presets.length > 0 && (\n <div>\n <p className=\"mb-2 text-[10px] font-semibold uppercase tracking-wider text-neutral-500\">\n Do site\n </p>\n <div className=\"grid grid-cols-3 gap-2 md:grid-cols-4\">\n {presets.map((img: ImagePreset) => (\n <button\n key={img.url}\n type=\"button\"\n onClick={() => handlePickPreset(img.url)}\n className={`group overflow-hidden rounded-md border text-left transition-all ${\n value === img.url\n ? 'border-[color:var(--ie-accent,#556FFF)] ring-2 ring-[color:var(--ie-accent,#556FFF)]'\n : 'border-neutral-200 hover:border-neutral-400'\n }`}\n title={img.label}\n >\n <div className=\"aspect-square w-full bg-neutral-50\">\n {/* eslint-disable-next-line @next/next/no-img-element */}\n <img\n src={resolveUrl(img.url)}\n alt={img.label}\n className=\"h-full w-full object-cover\"\n loading=\"lazy\"\n />\n </div>\n <div className=\"truncate px-2 py-1 text-[10px] text-neutral-600 group-hover:text-neutral-900\">\n {img.label}\n </div>\n </button>\n ))}\n </div>\n </div>\n )}\n </div>\n )}\n\n {tab === 'url' && (\n <div className=\"space-y-1\">\n <input\n type=\"text\"\n value={value}\n onChange={async (e) => {\n const url = e.target.value\n // Probe pra capturar aspect ratio quando URL muda\n if (url) {\n const dims = await probeImageDims(resolveUrl(url))\n const aspectRatio = dims ? dims.w / dims.h : undefined\n onChange(url, aspectRatio)\n } else {\n onChange(url)\n }\n }}\n placeholder=\"/uploads/...webp ou https://...\"\n className=\"w-full rounded-md border border-neutral-300 px-3 py-2 text-sm focus:border-[color:var(--ie-accent,#556FFF)] focus:outline-none\"\n />\n <p className=\"text-xs text-neutral-500\">\n Caminhos relativos buscam no domínio atual; URLs absolutas funcionam tal qual.\n </p>\n <div className=\"pt-2\">\n <button\n type=\"button\"\n onClick={() => setPanel(null)}\n className=\"rounded-md bg-[color:var(--ie-accent,#556FFF)] px-4 py-2 text-xs font-semibold uppercase tracking-wider text-white hover:bg-[color:var(--ie-accent-hover,#3957E2)]\"\n >\n Concluir\n </button>\n </div>\n </div>\n )}\n </div>\n </Modal>\n </div>\n )\n}\n\n// Re-exports usados externamente\nexport type { BadgeData, ImagePickerProps }\n","'use client'\n\n/**\n * Linha de slider padronizada usada nos controles do badge (Tamanho, Pos. X,\n * Pos. Y). Garante mesma estrutura e larguras em todas as rows:\n *\n * w-20 label · flex-1 range · w-12 valor · w-10 reset (ou spacer)\n *\n * O accent do range vem da CSS var `--ie-accent` (fallback `#556FFF`); o\n * consumer overrida via tema (`@chrono-os/image-editor-react/theme.css` ou\n * regra própria em `:root`/`.image-editor-root`).\n */\n\nexport interface SliderRowProps {\n label: string\n min: number\n max: number\n step: number\n /** Valor atual (undefined = usar `fallback` no render). */\n value: number | undefined\n /** Valor exibido quando `value` é undefined. */\n fallback: number\n /** Formatador do valor (ex `v => ${v}%`). */\n format: (v: number) => string\n /** True quando o user mexeu (mostra botão `reset`). */\n isCustom: boolean\n onChange: (v: number) => void\n onReset: () => void\n}\n\nexport function SliderRow({\n label,\n min,\n max,\n step,\n value,\n fallback,\n format,\n isCustom,\n onChange,\n onReset,\n}: SliderRowProps) {\n const current = value ?? fallback\n return (\n <div className=\"flex items-center gap-3\">\n <span className=\"w-20 shrink-0 text-xs font-semibold uppercase tracking-wider text-neutral-600\">\n {label}\n </span>\n <input\n type=\"range\"\n min={min}\n max={max}\n step={step}\n value={current}\n onChange={(e) => onChange(Number(e.target.value))}\n className=\"min-w-0 flex-1 accent-[color:var(--ie-accent,#556FFF)]\"\n />\n <span className=\"w-12 shrink-0 text-right font-mono text-xs tabular-nums text-neutral-500\">\n {format(current)}\n </span>\n {isCustom ? (\n <button\n type=\"button\"\n onClick={onReset}\n className=\"w-10 shrink-0 text-xs text-neutral-500 hover:text-neutral-900 hover:underline\"\n title=\"Resetar para o padrão\"\n >\n reset\n </button>\n ) : (\n <span className=\"w-10 shrink-0\" aria-hidden=\"true\" />\n )}\n </div>\n )\n}\n","'use client'\n\n/**\n * Controles compactos pra customizar uma parte do badge (número ou label):\n * color picker + hex text input + reset + swatches \"Recentes\" (opcional via\n * `recentColors` adapter) + 3 sliders padronizados (Tamanho 50-500%,\n * Pos. X 0-100%, Pos. Y 0-100%).\n *\n * Cada controle tem botão `reset` que volta o campo pra undefined (default\n * do pacote). `defaultPosX/Y` são os valores mostrados nos sliders quando o\n * campo é undefined (caem pra default no render real também) — usados pra\n * exibir uma posição razoável em vez de 0 quando o user nunca tocou.\n *\n * `recentColors` é o adapter opcional pra integrar com um sistema de cores\n * recentes do consumer. Quando ausente, a linha \"Recentes\" some.\n */\n\nimport type { RecentColorsAdapter } from './types'\n\nconst DEFAULT_SEED_COLORS = ['#FFFFFF', '#000000']\n\nexport interface BadgePartControlsProps {\n color: string | undefined\n defaultColor: string\n size: number | undefined\n offsetX: number | undefined\n offsetY: number | undefined\n defaultPosX: number\n defaultPosY: number\n onColorChange: (v: string | undefined) => void\n onSizeChange: (v: number | undefined) => void\n onOffsetXChange: (v: number | undefined) => void\n onOffsetYChange: (v: number | undefined) => void\n /** Adapter de cores recentes (opcional). Sem ele, sumir a linha \"Recentes\". */\n recentColors?: RecentColorsAdapter\n /** Kind de cor pra integrar com o adapter (default 'text'). */\n recentKind?: string\n /** Sementes neutras quando recentes acabam. Default: ['#FFFFFF', '#000000']. */\n seedColors?: string[]\n /** Min/max do slider de tamanho (% — default 50-500). */\n sizeMin?: number\n sizeMax?: number\n}\n\nimport { SliderRow } from './slider-row'\n\nexport function BadgePartControls({\n color,\n defaultColor,\n size,\n offsetX,\n offsetY,\n defaultPosX,\n defaultPosY,\n onColorChange,\n onSizeChange,\n onOffsetXChange,\n onOffsetYChange,\n recentColors,\n recentKind = 'text',\n seedColors = DEFAULT_SEED_COLORS,\n sizeMin = 50,\n sizeMax = 500,\n}: BadgePartControlsProps) {\n const effectiveColor = color || defaultColor\n // Recentes (do adapter, se houver) + sementes, dedup, filtra o atual.\n // 5 swatches pra caber sem poluir.\n const valueUp = effectiveColor.toUpperCase()\n const seen = new Set<string>([valueUp])\n const combined: string[] = []\n const recents = recentColors?.colors[recentKind] ?? []\n for (const hex of [...recents, ...seedColors]) {\n const up = hex.toUpperCase()\n if (!seen.has(up)) {\n seen.add(up)\n combined.push(up)\n }\n }\n const swatches = combined.slice(0, 5)\n function commitColor(): void {\n if (color && /^#[0-9a-fA-F]{6}$/.test(color)) {\n recentColors?.addColor(color, recentKind)\n }\n }\n function applySwatch(hex: string): void {\n onColorChange(hex)\n recentColors?.addColor(hex, recentKind)\n }\n return (\n <div className=\"space-y-3\">\n <div className=\"space-y-1.5\">\n <div className=\"flex items-center gap-3\">\n <span className=\"w-20 shrink-0 text-xs font-semibold uppercase tracking-wider text-neutral-600\">\n Cor\n </span>\n <input\n type=\"color\"\n value={effectiveColor}\n onChange={(e) => onColorChange(e.target.value)}\n onBlur={commitColor}\n className=\"h-8 w-10 shrink-0 cursor-pointer rounded border border-neutral-300 p-0\"\n aria-label=\"Cor\"\n />\n <input\n type=\"text\"\n value={effectiveColor}\n onChange={(e) => {\n const v = e.target.value\n if (/^#[0-9a-fA-F]{0,6}$/.test(v)) onColorChange(v)\n }}\n onBlur={commitColor}\n className=\"min-w-0 flex-1 rounded border border-neutral-300 px-2 py-1.5 font-mono text-xs uppercase\"\n placeholder={defaultColor}\n />\n {color !== undefined ? (\n <button\n type=\"button\"\n onClick={() => onColorChange(undefined)}\n className=\"w-10 shrink-0 text-xs text-neutral-500 hover:text-neutral-900 hover:underline\"\n title=\"Resetar para o padrão\"\n >\n reset\n </button>\n ) : (\n <span className=\"w-10 shrink-0\" aria-hidden=\"true\" />\n )}\n </div>\n {swatches.length > 0 && (\n <div className=\"flex flex-wrap items-center gap-1.5 pl-[92px]\">\n <span className=\"text-[10px] uppercase tracking-wider text-neutral-400\">\n Recentes\n </span>\n {swatches.map((hex) => (\n <button\n key={hex}\n type=\"button\"\n onClick={() => applySwatch(hex)}\n className=\"h-5 w-5 shrink-0 rounded border border-neutral-300 transition-transform hover:scale-125\"\n style={{ backgroundColor: hex }}\n title={hex}\n aria-label={`Aplicar ${hex}`}\n />\n ))}\n </div>\n )}\n </div>\n <SliderRow\n label=\"Tamanho\"\n min={sizeMin}\n max={sizeMax}\n step={5}\n value={size}\n fallback={100}\n format={(v) => `${v}%`}\n isCustom={size !== undefined}\n onChange={onSizeChange}\n onReset={() => onSizeChange(undefined)}\n />\n <SliderRow\n label=\"Pos. X\"\n min={0}\n max={100}\n step={0.5}\n value={offsetX}\n fallback={defaultPosX}\n format={(v) => `${v.toFixed(1)}%`}\n isCustom={offsetX !== undefined}\n onChange={onOffsetXChange}\n onReset={() => onOffsetXChange(undefined)}\n />\n <SliderRow\n label=\"Pos. Y\"\n min={0}\n max={100}\n step={0.5}\n value={offsetY}\n fallback={defaultPosY}\n format={(v) => `${v.toFixed(1)}%`}\n isCustom={offsetY !== undefined}\n onChange={onOffsetYChange}\n onReset={() => onOffsetYChange(undefined)}\n />\n </div>\n )\n}\n","'use client'\n\n/**\n * Wrapper completo de subcard pra editar uma parte do badge — embarca:\n *\n * - título uppercase (ex \"Badge — Número\")\n * - checkbox \"Exibir\" (semântica: undefined === true, false === oculto)\n * - <TextField> minimalista pra texto\n * - <BadgePartControls> com cor + sliders\n *\n * O wrapper externo (border + bg + p-4) NÃO é renderizado aqui — esse cuidado\n * fica com o `<ImagePicker>` (subcard automático no `extraCards`).\n *\n * Estado é controlado: o consumer mantém o `BadgePartState` (subset relevante)\n * e recebe a versão atualizada em cada onChange. A semântica de `enabled`:\n *\n * - `undefined` → exibe (default)\n * - `false` → oculto\n *\n * Quando o usuário desmarca, o componente emite `{enabled: false}`. Quando\n * remarca, emite `{enabled: undefined}` (limpa o campo do JSON salvo).\n */\n\nimport type { RecentColorsAdapter } from './types'\nimport { BadgePartControls } from './badge-part-controls'\n\nexport interface BadgePartState {\n enabled?: boolean\n text?: string\n color?: string\n size?: number\n offsetX?: number\n offsetY?: number\n}\n\nexport interface BadgeEditorCardProps {\n /** Título do subcard (ex \"Badge — Número\"). */\n title: string\n value: BadgePartState\n onChange: (next: BadgePartState) => void\n /** Cor default mostrada quando `value.color` é undefined. */\n defaultColor: string\n /** Posição X default exibida no slider quando `value.offsetX` é undefined. */\n defaultPosX: number\n /** Posição Y default exibida no slider quando `value.offsetY` é undefined. */\n defaultPosY: number\n /** Label da checkbox de exibir. Default \"Exibir\". */\n enabledLabel?: string\n /** Placeholder do campo Texto. */\n textPlaceholder?: string\n /** Adapter opcional de cores recentes pro `<BadgePartControls>`. */\n recentColors?: RecentColorsAdapter\n /** Kind de cor (default 'text'). */\n recentKind?: string\n /** Sementes neutras pros swatches (default ['#FFFFFF', '#000000']). */\n seedColors?: string[]\n /** Min/max do slider de tamanho (% — default 50-500). */\n sizeMin?: number\n sizeMax?: number\n}\n\n/**\n * TextField minimalista — duplicado do consumer pra não vazar dependência\n * de design system na lib. Só label uppercase + input padrão.\n */\nfunction TextField({\n label,\n value,\n onChange,\n placeholder,\n}: {\n label: string\n value: string | undefined\n onChange: (v: string) => void\n placeholder?: string\n}) {\n return (\n <label className=\"block\">\n <span className=\"block text-xs font-semibold uppercase tracking-wider text-neutral-700 mb-1\">\n {label}\n </span>\n <input\n type=\"text\"\n className=\"block w-full rounded-md border border-neutral-300 bg-white px-3 py-2 text-sm outline-none focus:border-[color:var(--ie-accent,#556FFF)] focus:ring-2 focus:ring-blue-200\"\n value={value ?? ''}\n onChange={(e) => onChange(e.target.value)}\n placeholder={placeholder}\n />\n </label>\n )\n}\n\nexport function BadgeEditorCard({\n title,\n value,\n onChange,\n defaultColor,\n defaultPosX,\n defaultPosY,\n enabledLabel = 'Exibir',\n textPlaceholder,\n recentColors,\n recentKind = 'text',\n seedColors,\n sizeMin,\n sizeMax,\n}: BadgeEditorCardProps) {\n const enabled = value.enabled !== false\n function patch(partial: Partial<BadgePartState>): void {\n onChange({ ...value, ...partial })\n }\n return (\n <div className=\"space-y-4\">\n <p className=\"text-xs font-semibold uppercase tracking-wider text-neutral-500\">\n {title}\n </p>\n <label className=\"flex cursor-pointer items-center gap-2 text-sm text-neutral-700\">\n <input\n type=\"checkbox\"\n checked={enabled}\n onChange={(e) => patch({ enabled: e.target.checked ? undefined : false })}\n className=\"h-4 w-4 accent-[color:var(--ie-accent,#556FFF)]\"\n />\n {enabledLabel}\n </label>\n <TextField\n label=\"Texto\"\n value={value.text}\n onChange={(v) => patch({ text: v })}\n placeholder={textPlaceholder}\n />\n <BadgePartControls\n color={value.color}\n defaultColor={defaultColor}\n size={value.size}\n offsetX={value.offsetX}\n offsetY={value.offsetY}\n defaultPosX={defaultPosX}\n defaultPosY={defaultPosY}\n onColorChange={(v) => patch({ color: v })}\n onSizeChange={(v) => patch({ size: v })}\n onOffsetXChange={(v) => patch({ offsetX: v })}\n onOffsetYChange={(v) => patch({ offsetY: v })}\n recentColors={recentColors}\n recentKind={recentKind}\n seedColors={seedColors}\n sizeMin={sizeMin}\n sizeMax={sizeMax}\n />\n </div>\n )\n}\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import * as react_jsx_runtime from 'react/jsx-runtime';
|
|
2
|
+
import { C as CropValue, b as ImagePickerProps, R as RecentColorsAdapter } from './badge-BRjFgV8X.cjs';
|
|
3
|
+
export { B as BadgeData, a as BadgeOverlay, I as ImagePickerAspect, c as ImagePreset, U as UploadAdapter, d as UploadItem, e as UploadedImage } from './badge-BRjFgV8X.cjs';
|
|
4
|
+
import 'react';
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Constrói valor CSS `filter` baseado nas opções. Idêntico ao helper do
|
|
8
|
+
* `@chrono-os/lp-react` — mantém preview e render em sincronia visual.
|
|
9
|
+
*/
|
|
10
|
+
declare function buildImageFilter(opts: {
|
|
11
|
+
grayscale?: number;
|
|
12
|
+
saturation?: number;
|
|
13
|
+
sepia?: number;
|
|
14
|
+
sepiaColor?: string;
|
|
15
|
+
}): string | undefined;
|
|
16
|
+
interface ImageCropPickerProps {
|
|
17
|
+
imageUrl: string;
|
|
18
|
+
/** Aspect ratio do destino (frame). Ex: 3/4, 16/9. */
|
|
19
|
+
targetAspect: number;
|
|
20
|
+
value: CropValue;
|
|
21
|
+
onChange: (next: CropValue) => void;
|
|
22
|
+
/**
|
|
23
|
+
* Limita a altura do painel do editor (em px). Quando ausente, usa
|
|
24
|
+
* `min(60vh, 520px)`. Use pra prevenir scroll quando o modal pai tem
|
|
25
|
+
* altura fixa.
|
|
26
|
+
*/
|
|
27
|
+
maxHeight?: number;
|
|
28
|
+
}
|
|
29
|
+
declare const MIN_SCALE = 0.2;
|
|
30
|
+
declare const MAX_SCALE = 5;
|
|
31
|
+
/** Calcula a fração visível (cover) do source numa dimensão.
|
|
32
|
+
* source_wider: vw_base = target/img; source_taller: vw_base = 1. */
|
|
33
|
+
declare function computeVisibleBase(imgAspect: number, targetAspect: number): {
|
|
34
|
+
vwBase: number;
|
|
35
|
+
vhBase: number;
|
|
36
|
+
};
|
|
37
|
+
/**
|
|
38
|
+
* Geometria explícita do <img> dentro de container relative+overflow-hidden
|
|
39
|
+
* com aspect ratio TARGET. focal = posição da imagem no container (0=left,
|
|
40
|
+
* 100=right, 50=centro). Mesma math do renderer em prod — paridade total.
|
|
41
|
+
*/
|
|
42
|
+
declare function buildImageGeometry(opts: {
|
|
43
|
+
imgAspect: number;
|
|
44
|
+
targetAspect: number;
|
|
45
|
+
focalX: number;
|
|
46
|
+
focalY: number;
|
|
47
|
+
scale: number;
|
|
48
|
+
}): {
|
|
49
|
+
width: string;
|
|
50
|
+
height: string;
|
|
51
|
+
left: string;
|
|
52
|
+
top: string;
|
|
53
|
+
renderedW: number;
|
|
54
|
+
renderedH: number;
|
|
55
|
+
};
|
|
56
|
+
declare function parsePosition(raw: string | undefined): {
|
|
57
|
+
x: number;
|
|
58
|
+
y: number;
|
|
59
|
+
};
|
|
60
|
+
declare function formatPos(x: number, y: number): string;
|
|
61
|
+
/**
|
|
62
|
+
* Converte um ponto focal (0-100, fração do source onde o "centro da visão"
|
|
63
|
+
* deve ficar) em valor de CSS object-position (0-100).
|
|
64
|
+
*
|
|
65
|
+
* `visible` é a fração do source visível naquela dimensão DEPOIS de cover
|
|
66
|
+
* crop + scale. Quando não há overflow (visible >= 1), object-position é
|
|
67
|
+
* irrelevante; devolve 50 como neutro.
|
|
68
|
+
*/
|
|
69
|
+
declare function focalToOp(focal: number, visible: number): number;
|
|
70
|
+
/** Inverso de focalToOp: dado object-position, devolve o focal point. */
|
|
71
|
+
declare function opToFocal(op: number, visible: number): number;
|
|
72
|
+
declare function ImageCropPicker({ imageUrl, targetAspect, value, onChange, maxHeight, }: ImageCropPickerProps): react_jsx_runtime.JSX.Element | null;
|
|
73
|
+
|
|
74
|
+
declare function ImagePicker({ value, onChange, uploadAdapter, label, hint, aspect, crop, onCropChange, badge, extraCards, presets, }: ImagePickerProps): react_jsx_runtime.JSX.Element;
|
|
75
|
+
|
|
76
|
+
interface BadgePartState {
|
|
77
|
+
enabled?: boolean;
|
|
78
|
+
text?: string;
|
|
79
|
+
color?: string;
|
|
80
|
+
size?: number;
|
|
81
|
+
offsetX?: number;
|
|
82
|
+
offsetY?: number;
|
|
83
|
+
}
|
|
84
|
+
interface BadgeEditorCardProps {
|
|
85
|
+
/** Título do subcard (ex "Badge — Número"). */
|
|
86
|
+
title: string;
|
|
87
|
+
value: BadgePartState;
|
|
88
|
+
onChange: (next: BadgePartState) => void;
|
|
89
|
+
/** Cor default mostrada quando `value.color` é undefined. */
|
|
90
|
+
defaultColor: string;
|
|
91
|
+
/** Posição X default exibida no slider quando `value.offsetX` é undefined. */
|
|
92
|
+
defaultPosX: number;
|
|
93
|
+
/** Posição Y default exibida no slider quando `value.offsetY` é undefined. */
|
|
94
|
+
defaultPosY: number;
|
|
95
|
+
/** Label da checkbox de exibir. Default "Exibir". */
|
|
96
|
+
enabledLabel?: string;
|
|
97
|
+
/** Placeholder do campo Texto. */
|
|
98
|
+
textPlaceholder?: string;
|
|
99
|
+
/** Adapter opcional de cores recentes pro `<BadgePartControls>`. */
|
|
100
|
+
recentColors?: RecentColorsAdapter;
|
|
101
|
+
/** Kind de cor (default 'text'). */
|
|
102
|
+
recentKind?: string;
|
|
103
|
+
/** Sementes neutras pros swatches (default ['#FFFFFF', '#000000']). */
|
|
104
|
+
seedColors?: string[];
|
|
105
|
+
/** Min/max do slider de tamanho (% — default 50-500). */
|
|
106
|
+
sizeMin?: number;
|
|
107
|
+
sizeMax?: number;
|
|
108
|
+
}
|
|
109
|
+
declare function BadgeEditorCard({ title, value, onChange, defaultColor, defaultPosX, defaultPosY, enabledLabel, textPlaceholder, recentColors, recentKind, seedColors, sizeMin, sizeMax, }: BadgeEditorCardProps): react_jsx_runtime.JSX.Element;
|
|
110
|
+
|
|
111
|
+
interface BadgePartControlsProps {
|
|
112
|
+
color: string | undefined;
|
|
113
|
+
defaultColor: string;
|
|
114
|
+
size: number | undefined;
|
|
115
|
+
offsetX: number | undefined;
|
|
116
|
+
offsetY: number | undefined;
|
|
117
|
+
defaultPosX: number;
|
|
118
|
+
defaultPosY: number;
|
|
119
|
+
onColorChange: (v: string | undefined) => void;
|
|
120
|
+
onSizeChange: (v: number | undefined) => void;
|
|
121
|
+
onOffsetXChange: (v: number | undefined) => void;
|
|
122
|
+
onOffsetYChange: (v: number | undefined) => void;
|
|
123
|
+
/** Adapter de cores recentes (opcional). Sem ele, sumir a linha "Recentes". */
|
|
124
|
+
recentColors?: RecentColorsAdapter;
|
|
125
|
+
/** Kind de cor pra integrar com o adapter (default 'text'). */
|
|
126
|
+
recentKind?: string;
|
|
127
|
+
/** Sementes neutras quando recentes acabam. Default: ['#FFFFFF', '#000000']. */
|
|
128
|
+
seedColors?: string[];
|
|
129
|
+
/** Min/max do slider de tamanho (% — default 50-500). */
|
|
130
|
+
sizeMin?: number;
|
|
131
|
+
sizeMax?: number;
|
|
132
|
+
}
|
|
133
|
+
declare function BadgePartControls({ color, defaultColor, size, offsetX, offsetY, defaultPosX, defaultPosY, onColorChange, onSizeChange, onOffsetXChange, onOffsetYChange, recentColors, recentKind, seedColors, sizeMin, sizeMax, }: BadgePartControlsProps): react_jsx_runtime.JSX.Element;
|
|
134
|
+
|
|
135
|
+
/**
|
|
136
|
+
* Linha de slider padronizada usada nos controles do badge (Tamanho, Pos. X,
|
|
137
|
+
* Pos. Y). Garante mesma estrutura e larguras em todas as rows:
|
|
138
|
+
*
|
|
139
|
+
* w-20 label · flex-1 range · w-12 valor · w-10 reset (ou spacer)
|
|
140
|
+
*
|
|
141
|
+
* O accent do range vem da CSS var `--ie-accent` (fallback `#556FFF`); o
|
|
142
|
+
* consumer overrida via tema (`@chrono-os/image-editor-react/theme.css` ou
|
|
143
|
+
* regra própria em `:root`/`.image-editor-root`).
|
|
144
|
+
*/
|
|
145
|
+
interface SliderRowProps {
|
|
146
|
+
label: string;
|
|
147
|
+
min: number;
|
|
148
|
+
max: number;
|
|
149
|
+
step: number;
|
|
150
|
+
/** Valor atual (undefined = usar `fallback` no render). */
|
|
151
|
+
value: number | undefined;
|
|
152
|
+
/** Valor exibido quando `value` é undefined. */
|
|
153
|
+
fallback: number;
|
|
154
|
+
/** Formatador do valor (ex `v => ${v}%`). */
|
|
155
|
+
format: (v: number) => string;
|
|
156
|
+
/** True quando o user mexeu (mostra botão `reset`). */
|
|
157
|
+
isCustom: boolean;
|
|
158
|
+
onChange: (v: number) => void;
|
|
159
|
+
onReset: () => void;
|
|
160
|
+
}
|
|
161
|
+
declare function SliderRow({ label, min, max, step, value, fallback, format, isCustom, onChange, onReset, }: SliderRowProps): react_jsx_runtime.JSX.Element;
|
|
162
|
+
|
|
163
|
+
export { BadgeEditorCard, BadgePartControls, type BadgePartState, CropValue, ImageCropPicker, ImagePicker, ImagePickerProps, MAX_SCALE, MIN_SCALE, RecentColorsAdapter, SliderRow, buildImageFilter, buildImageGeometry, computeVisibleBase, focalToOp, formatPos, opToFocal, parsePosition };
|