{"version":3,"file":"TextWrap_Prod.Do_HiUyr.mjs","names":["useRef","useState","flushSync","useLayoutEffect","useEffect"],"sources":["https:/framerusercontent.com/modules/oQk14E8Ar7JXjnVOhZW2/n4EHdVoivTyPjnpEdXZ2/TextWrap_Prod.js"],"sourcesContent":["import{jsx as _jsx,jsxs as _jsxs}from\"react/jsx-runtime\";import{addPropertyControls,ControlType,RenderTarget}from\"framer\";import{useEffect,useLayoutEffect,useRef,useState}from\"react\";import{flushSync}from\"react-dom\";import{motion,MotionConfig,useReducedMotion}from\"framer-motion\";// Changelog 1.17: connected slots keep one vertical position with or without a text effect,\n// Per Word or Per Line, in the editor and on the published site (see InlineLayer).\n// Changelog 1.18: Per Line keeps the same settled x positions as no effect and Per Word on\n// centered and right-aligned text (see the soft-wrap space in buildEffectContent).\n// Changelog 1.19: Per Line takes its line breaks from the plain text flow at the current\n// width, so it reflows both ways on resize, font swaps, slot resizes and text edits, and\n// every line (the first included) sits where it does with no effect (see useLineGroups).\n/**\n * @framerSupportedLayoutWidth any-prefer-fixed\n * @framerSupportedLayoutHeight auto\n *\n * @framerDisableUnlink\n *\n * @framerIntrinsicWidth 450\n * @framerIntrinsicHeight auto\n */export default function TextWrap(props){const{layers=[],text=\"\",slot=\"[]\",font,color,layerGap,scale=1,layerAlign,transform,wrap=\"auto\",balance,truncate,lines,userSelect,tag=\"h1\",effects,style}=props;const Tag=tag;const isCanvas=RenderTarget.current()===RenderTarget.canvas;const fitWidth=isFitSize(style?.width);// Instances saved before 1.3 carry the removed Balance boolean: true → balance, false → auto\nconst textWrap=wrap===\"auto\"&&balance===true?\"balance\":wrap;const parts=text.split(slot);const scaledFont=scaleFont(font,scale);const containerRef=useRef(null);const{play,staticVisible,canvasLike,replayKey}=useEnterEffectTrigger(effects,containerRef,props,isCanvas);const reducedMotion=useReducedMotion();const tokenRefs=useRef([]);const tokenRefCallbacks=useRef([]);const perLine=!!effects&&effects.per===\"line\";const widthProbeRef=useRef(null);const lineIndices=useLineGroups(perLine,containerRef,tokenRefs,widthProbeRef);// When the current entrance started (Per Line only uses it to keep re-split lines settled).\nconst entranceRef=useRef({key:-1,at:0});const entrancePlaying=!!effects&&play&&!staticVisible&&!(perLine&&lineIndices===null);useIsoLayoutEffect(()=>{if(!entrancePlaying)entranceRef.current={key:-1,at:0};else if(entranceRef.current.key!==replayKey)entranceRef.current={key:replayKey,at:performance.now()};},[entrancePlaying,replayKey]);const content=effects?buildEffectContent(parts,layers,slot,layerAlign,layerGap,scale,effects,play,staticVisible,canvasLike,replayKey,reducedMotion,tokenRefs,tokenRefCallbacks,lineIndices,!fitWidth,entranceRef.current):buildPlainContent(parts,layers,slot,layerAlign,layerGap,scale);return /*#__PURE__*/_jsxs(Tag,{\"data-build\":\"text-wrap-prod-20261005-01\",ref:containerRef,// Not \"framer-text-wrap-container\": Text Wrap 1.1 and older inject a global\n// `.framer-text-wrap-container div { display: inline-block !important }`. The Framer\n// canvas is one shared document, so any older instance on the canvas would\n// restyle this one's connected layers. A distinct class keeps it out of reach.\nclassName:\"framer-text-wrap\",style:{...scaledFont,margin:0,color:color||\"#666666\",textAlign:font?.textAlign||style?.textAlign||\"left\",fontWeight:font?.fontWeight||400,userSelect:userSelect===\"none\"?\"none\":\"auto\",textWrap,textTransform:transform,whiteSpace:fitWidth?\"nowrap\":\"pre-wrap\",width:fitWidth?\"max-content\":undefined,...truncate?{display:\"-webkit-box\",WebkitLineClamp:lines,WebkitBoxOrient:\"vertical\",overflow:\"hidden\",textOverflow:\"ellipsis\"}:{display:\"block\"},...style},children:[perLine?/*#__PURE__*/_jsx(\"span\",{ref:widthProbeRef,\"aria-hidden\":\"true\",\"data-tw-width-probe\":\"\",style:WIDTH_PROBE_STYLE}):null,content]});}function scaleFont(font,scale){if(!font||scale===1)return font;const fontSize=font.fontSize;if(fontSize===undefined||fontSize===null)return font;return{...font,fontSize:typeof fontSize===\"number\"?fontSize*scale:`calc((${fontSize}) * ${scale})`};}const useIsoLayoutEffect=typeof window!==\"undefined\"?useLayoutEffect:useEffect;// Peel a trailing non-whitespace run (no spaces) for slot glue. Empty when the\n// string already ends in whitespace or is empty — meaning a real word boundary.\nfunction peelTrailingGlued(value){if(!value||!/\\S$/.test(value))return{rest:value,glued:\"\"};const m=value.match(/^(.*?)(\\S+)$/);return m?{rest:m[1],glued:m[2]}:{rest:value,glued:\"\"};}// Peel a leading non-whitespace run for slot glue. Empty when the string already\n// starts with whitespace or is empty.\nfunction peelLeadingGlued(value){if(!value||!/^\\S/.test(value))return{glued:\"\",rest:value};const m=value.match(/^(\\S+)([\\s\\S]*)$/);return m?{glued:m[1],rest:m[2]}:{glued:\"\",rest:value};}// Slot insertion with immediately-adjacent punctuation/letters glued to the slot\n// as one wrap word (e.g. `[]:` or `price[]`). A nowrap wrapper keeps balance/pretty/auto\n// from orphaning the colon onto the next line without its slot.\nfunction buildPlainContent(parts,layers,slot,layerAlign,layerGap,scale){const content=[];const partsMut=parts.slice();for(let i=0;i<partsMut.length;i++){let before=partsMut[i];if(i<partsMut.length-1){let after=partsMut[i+1];const trailed=peelTrailingGlued(before);before=trailed.rest;const prefix=trailed.glued;const led=peelLeadingGlued(after);const suffix=led.glued;partsMut[i+1]=led.rest;if(before)content.push(before);const layerNode=i<layers.length?/*#__PURE__*/_jsx(InlineLayer,{align:layerAlign,gap:layerGap,scale:scale,children:layers[i]},`layer-${i}`):slot;if(prefix||suffix){content.push(/*#__PURE__*/_jsxs(\"span\",{style:{whiteSpace:\"nowrap\"},children:[prefix,layerNode,suffix]},`glue-${i}`));}else{content.push(layerNode);}}else if(before){content.push(before);}}if(layers.length>parts.length-1){for(let i=parts.length-1;i<layers.length;i++){content.push(/*#__PURE__*/_jsx(InlineLayer,{align:layerAlign,gap:layerGap,scale:scale,children:layers[i]},`layer-${i}`));}}return content;}function tokenizeForEffects(parts,layers,slot){const units=[];const pushText=value=>{for(const piece of value.split(/(\\s+)/)){if(piece===\"\")continue;units.push(/^\\s+$/.test(piece)?{kind:\"space\",value:piece}:{kind:\"word\",value:piece});}};const partsMut=parts.slice();for(let i=0;i<partsMut.length;i++){let before=partsMut[i];if(i<partsMut.length-1){let after=partsMut[i+1];const trailed=peelTrailingGlued(before);before=trailed.rest;const prefix=trailed.glued;const led=peelLeadingGlued(after);const suffix=led.glued;partsMut[i+1]=led.rest;pushText(before);if(i<layers.length){units.push({kind:\"layer\",node:layers[i],key:`layer-${i}`,prefix,suffix});}else{pushText(`${prefix}${slot}${suffix}`);}}else{pushText(before);}}if(layers.length>parts.length-1){for(let i=parts.length-1;i<layers.length;i++){units.push({kind:\"layer\",node:layers[i],key:`layer-${i}`});}}return units;}// Per line: line blocks are display:block, so once the text is split into blocks a wider\n// container cannot pull a word back up — the blocks only ever wrap further. 1.18 measured\n// the visual lines from those blocks, so a split could only grow: widening, a web font\n// swap, a slot that changed size or a text edit left stale breaks (and stale first-line\n// x). `withPlainFlow` takes the line blocks out of the box tree (`display: contents`, also\n// for the hidden wrap spaces) for one synchronous read, which leaves exactly the Per Word /\n// no-effect text flow at the current width, then restores them. Nothing is painted in\n// between. With `contents` the read does not depend on the current split (Chrome's Wrap\n// Balance does depend on inline wrapper boxes), and enter transforms have no box to apply\n// to, so a mid-entrance read is the settled layout.\nconst LINE_ATTR=\"data-tw-line\";const GAP_ATTR=\"data-tw-gap\";function withPlainFlow(root,read){const touched=[];const unbox=el=>{touched.push([el,el.style.display]);el.style.display=\"contents\";};for(const line of Array.from(root.children)){if(!line.hasAttribute(LINE_ATTR))continue;unbox(line);const motion=line.firstElementChild;const body=motion&&motion.hasAttribute(MOTION_ATTR)?motion:line;if(body!==line)unbox(body);for(const gap of Array.from(body.children)){if(gap.hasAttribute(GAP_ATTR))unbox(gap);}}try{return read();}finally{for(let i=touched.length-1;i>=0;i--)touched[i][0].style.display=touched[i][1];}}// Visual line of every word/slot token in the plain flow. A token starts a new line when\n// its center moved down by more than half a line; a jump of n lines (blank lines from\n// \"\\n\\n\") counts n, so blank lines keep their line-height gap.\nfunction readPlainLines(root,refs){return withPlainFlow(root,()=>{const rootRect=root.getBoundingClientRect();// Framer canvas zoom is a transform on an ancestor; rects are scaled by it.\nconst zoom=root.offsetWidth?rootRect.width/root.offsetWidth||1:1;const cs=getComputedStyle(root);const rects=refs.map(el=>el.getBoundingClientRect());let lineHeight=parseFloat(cs.lineHeight);if(!(lineHeight>0))lineHeight=rects[0].height/zoom||1;const unit=lineHeight*zoom;const contentTop=rootRect.top+((parseFloat(cs.borderTopWidth)||0)+(parseFloat(cs.paddingTop)||0))*zoom;let line=0;let previous=0;return rects.map((rect,i)=>{const mid=(rect.top+rect.bottom)/2;if(i===0)line=Math.max(0,Math.floor((mid-contentTop)/unit));else if(mid-previous>unit/2)line+=Math.max(1,Math.round((mid-previous)/unit));previous=mid;return line;});});}function sameLines(a,b){return!!a&&a.length===b.length&&a.every((v,i)=>v===b[i]);}// Zero-height block that spans the text box: Per Line watches its width. The text box itself\n// changes height when the split changes, which a ResizeObserver would report again inside the\n// same frame (\"loop completed with undelivered notifications\").\nconst WIDTH_PROBE_STYLE={display:\"block\",height:0,overflow:\"hidden\",pointerEvents:\"none\"};// Real visual-line detection for `per: line`. Re-read from the plain flow (see\n// withPlainFlow) on every render, whenever the text box changes width (canvas resize, either\n// direction) or any word or slot changes size (web font swap, a connected layer resizing) —\n// both applied in the same frame, like the plain text reflows — and when fonts finish\n// loading. Runs only when `per: line` is selected.\nfunction useLineGroups(enabled,containerRef,tokenRefs,widthProbeRef){const[lineIndices,setLineIndices]=useState(null);const measureRef=useRef(()=>{});const observerRef=useRef(null);useIsoLayoutEffect(()=>{if(!enabled){measureRef.current=()=>{};observerRef.current=null;setLineIndices(prev=>prev===null?prev:null);return;}const measure=(sync=false)=>{const refs=tokenRefs.current;const root=containerRef.current;// Incomplete trees (mid remount from flat → whole-line) must not publish a\n// partial grouping — that thrash remounts forever.\nif(!root||!refs.length||refs.some(el=>!el))return;const next=readPlainLines(root,refs);const update=()=>setLineIndices(prev=>sameLines(prev,next)?prev:next);if(sync&&typeof flushSync===\"function\")flushSync(update);else update();};measureRef.current=measure;// A resize (text box width, a word or slot box) re-splits in the same frame, and once\n// more on the next frame in case layout was still settling.\nlet recheck=0;const resize=typeof ResizeObserver!==\"undefined\"?new ResizeObserver(()=>{measureRef.current(true);if(!recheck)recheck=requestAnimationFrame(()=>{recheck=0;measureRef.current();});}):null;const probe=widthProbeRef.current;const watched=new Set;if(probe&&resize){resize.observe(probe);watched.add(probe);}const state={resize,watched,frame:0};observerRef.current=state;const fonts=document.fonts;const onFonts=()=>measureRef.current();fonts?.ready?.then(onFonts);fonts?.addEventListener?.(\"loadingdone\",onFonts);// Synchronous first measurement — the words/slots are already in the DOM by this\n// point in the commit, so grouping is correct before the browser's first paint.\nmeasure();return()=>{measureRef.current=()=>{};observerRef.current=null;if(state.frame)cancelAnimationFrame(state.frame);if(recheck)cancelAnimationFrame(recheck);resize?.disconnect();fonts?.removeEventListener?.(\"loadingdone\",onFonts);};},[enabled]);// After every render: re-read the lines for this render's text/props and watch the\n// current word/slot boxes, so a size change re-reads the lines without a React render.\n// Boxes that left the DOM (a token moved to another line block) are dropped right away;\n// new boxes are watched from the next frame, so a re-split made inside a ResizeObserver\n// callback never adds observations to that same delivery.\nuseIsoLayoutEffect(()=>{measureRef.current();const observer=observerRef.current;if(!observer?.resize)return;const current=new Set(tokenRefs.current.filter(Boolean));if(widthProbeRef.current)current.add(widthProbeRef.current);for(const el of observer.watched){if(!current.has(el)){observer.resize.unobserve(el);observer.watched.delete(el);}}if(observer.frame)return;observer.frame=requestAnimationFrame(()=>{observer.frame=0;if(observerRef.current!==observer||!observer.resize)return;const now=new Set(tokenRefs.current.filter(Boolean));if(widthProbeRef.current)now.add(widthProbeRef.current);for(const el of now){if(!observer.watched.has(el)&&el.isConnected){observer.resize.observe(el);observer.watched.add(el);}}});});return lineIndices;}const ENTER_DEFAULTS={opacity:0,scale:1,blur:5,rotationMode:\"2d\",rotate2D:0,rotate3D:{x:0,y:0,z:0},offsetX:0,offsetY:10,transition:{type:\"tween\",duration:.4,delay:.05,ease:[.15,.75,.5,1]}};// Hidden/shown motion values plus the per-index stagger delay for one word/line token.\n// Transform + filter never affect layout size, so a connected layer inside a token keeps\n// its line-box placement through the whole entrance, at any opacity/scale/blur/offset/rotation.\nfunction enterMotionProps(enter,outerDelay,index,play,staticVisible,reducedMotion,entered=false){const merged={...ENTER_DEFAULTS,...enter,rotate3D:{...ENTER_DEFAULTS.rotate3D,...enter?.rotate3D}};const is3D=merged.rotationMode===\"3d\";const hidden={opacity:merged.opacity,scale:merged.scale,x:merged.offsetX,y:merged.offsetY,filter:`blur(${merged.blur}px)`,...is3D?{rotateX:merged.rotate3D.x,rotateY:merged.rotate3D.y,rotateZ:merged.rotate3D.z}:{rotate:merged.rotate2D}};const shown={opacity:1,scale:1,x:0,y:0,filter:\"blur(0px)\",...is3D?{rotateX:0,rotateY:0,rotateZ:0}:{rotate:0}};if(staticVisible||reducedMotion)return{initial:false,animate:shown,transition:{duration:0}};const{delay:stagger=0,...transitionRest}=merged.transition||{};return{// A line block that first mounts after the entrance has finished (Per Line re-split on\n// a resize) starts shown, like the rest of the already-settled text.\ninitial:entered?false:hidden,animate:play?shown:hidden,transition:{...transitionRest,delay:Math.max(0,outerDelay||0)+stagger*index}};}// Outer layout span owns the box used for wrap + line measurement. Inner motion span\n// carries every enter transform (opacity/scale/blur/2D|3D rotate/offsets) with an explicit\n// center origin; transforms never touch layout.\n// 1.17: per-word tokens are plain `inline-block`s that inherit the Font line-height, so a\n// token's one inner line box is geometrically the same line box the text has with no\n// effect (same strut, same baseline, same `vertical-align: middle` reference). Earlier\n// inline-flex tokens (with `lineHeight: normal` on the motion span) turned InlineLayer into\n// a flex item, where `vertical-align` does nothing and the strut differs — that moved\n// connected slots and nudged line heights whenever an effect was on. `nowrap` keeps\n// prefix|slot|suffix glue on one line. asLine tokens stay 1lh blocks (1.14/1.16 contract).\nconst TOKEN_LAYOUT_STYLE={display:\"inline-block\",whiteSpace:\"nowrap\",verticalAlign:\"baseline\"};function tokenMotionStyle(enter,busy,asLine=false){const is3D=enter?.rotationMode===\"3d\";return{display:asLine?\"block\":\"inline-block\",whiteSpace:asLine?undefined:\"nowrap\",width:asLine?\"100%\":undefined,// Fill the outer 1lh asLine box so 3D/2D origin stays centered on the Font\n// line box (not on tall Framer slot wrappers that paint outside it). Per-word\n// inline-blocks are exactly one Font line tall, so their origin is centered too.\nheight:asLine?\"100%\":undefined,transformOrigin:\"50% 50%\",transformPerspective:is3D?800:undefined,transformStyle:is3D?\"preserve-3d\":undefined,willChange:busy?\"transform, opacity, filter\":undefined,backfaceVisibility:is3D?\"hidden\":undefined};}// Marks the motion span so InlineLayer can lift its enter transform for one synchronous\n// measurement (see measureWithoutEnterTransforms).\nconst MOTION_ATTR=\"data-tw-motion\";function tokenLayoutStyle(asLine){// asLine blocks stack as siblings — parent line-height no longer opens gaps between\n// them. Lock each block to exactly one Font line-height (`1lh`) so Framer editor slot\n// wrappers cannot inflate some rows. Slot paint overflows visibly (overflow:visible)\n// but does not change inter-line distance — editor canvas and publish stay in parity.\nreturn asLine?{display:\"block\",width:\"100%\",lineHeight:\"inherit\",height:\"1lh\",overflow:\"visible\"}:TOKEN_LAYOUT_STYLE;}function EnterToken({enter,outerDelay,index,play,staticVisible,canvasLike,reducedMotion,innerRef,asLine=false,entered=false,children}){// Pause is a settled canvas state, not an animation state. Rendering a plain span here\n// prevents Framer Motion from completing or restarting an entrance when Playground\n// changes On canvas from Play to Pause, while keeping every token immediately visible.\nif(staticVisible){// Same plain single span as 1.10 — nothing is moving, so no motion span is needed.\nreturn /*#__PURE__*/_jsx(\"span\",{ref:innerRef,\"data-tw-effect-token\":index,\"data-tw-line\":asLine?\"1\":undefined,style:tokenLayoutStyle(asLine),children:children});}if(canvasLike){return /*#__PURE__*/_jsx(CanvasEnterToken,{enter:enter,outerDelay:outerDelay,index:index,play:play,staticVisible:staticVisible,reducedMotion:reducedMotion,innerRef:innerRef,asLine:asLine,entered:entered,children:children});}return /*#__PURE__*/_jsx(MotionEnterToken,{enter:enter,outerDelay:outerDelay,index:index,play:play,staticVisible:staticVisible,reducedMotion:reducedMotion,innerRef:innerRef,asLine:asLine,entered:entered,children:children});}// Tracks enter in-flight (for will-change only; slot placement no longer depends on it).\n// Glue prefix/suffix are siblings of InlineLayer inside this token (horizontal); the whole\n// visual line for `asLine` still lives inside the motion span so lines move as one unit.\nfunction MotionEnterToken({enter,outerDelay,index,play,staticVisible,reducedMotion,innerRef,asLine=false,entered=false,children}){// Mount-time only: a token that mounted already entered stays a settled token.\nconst[mountedEntered]=useState(()=>entered&&play);const motionProps=enterMotionProps(enter,outerDelay,index,play,staticVisible,reducedMotion,mountedEntered);// Busy while hidden or in-flight. Cleared on settle.\nconst[busy,setBusy]=useState(()=>!(staticVisible||reducedMotion||mountedEntered));const skipFirstPlay=useRef(mountedEntered);useEffect(()=>{if(staticVisible||reducedMotion){setBusy(false);return;}if(skipFirstPlay.current){skipFirstPlay.current=false;return;}// Only re-busy when play/visibility actually changes — NOT when Framer reallocates\n// `enter` / `outerDelay` object identities on every editor canvas render.\nif(play)setBusy(true);},[play,staticVisible,reducedMotion]);const layout=tokenLayoutStyle(asLine);const motionStyle=tokenMotionStyle(enter,busy,asLine);return /*#__PURE__*/_jsx(\"span\",{ref:innerRef,\"data-tw-effect-token\":index,\"data-tw-line\":asLine?\"1\":undefined,\"data-tw-busy\":busy?\"1\":undefined,style:layout,children:/*#__PURE__*/_jsx(motion.span,{[MOTION_ATTR]:\"\",style:motionStyle,...motionProps,onAnimationStart:()=>setBusy(true),onAnimationComplete:()=>{if(play)setBusy(false);},children:children})});}// Framer's editor Canvas can provide a static MotionConfig. Override only that inherited\n// static flag locally so the exact same Framer Motion easing/spring contract advances on\n// canvas-like editing surfaces. The keyed remount still supplies an exact fresh entrance.\nfunction CanvasEnterToken({enter,outerDelay,index,play,staticVisible,reducedMotion,innerRef,asLine=false,entered=false,children}){return /*#__PURE__*/_jsx(MotionConfig,{isStatic:false,children:/*#__PURE__*/_jsx(MotionEnterToken,{enter:enter,outerDelay:outerDelay,index:index,play:play,staticVisible:staticVisible,reducedMotion:reducedMotion,innerRef:innerRef,asLine:asLine,entered:entered,children:children})});}// A `motion.span` (framer-motion) only re-attaches a *changed* ref callback unreliably across\n// re-renders — a fresh inline closure per render silently stops receiving the DOM node after\n// the first render (confirmed in isolation; a stable callback identity does not have this\n// problem). So each flat token position gets one persistent callback, created once and reused\n// every render, that always writes into the CURRENT `tokenRefs.current` array by closing over\n// the stable `tokenRefs` ref object itself rather than a per-render local array.\nfunction getStableTokenRef(tokenRefs,tokenRefCallbacks,index){let cb=tokenRefCallbacks.current[index];if(!cb){cb=el=>{tokenRefs.current[index]=el;};tokenRefCallbacks.current[index]=cb;}return cb;}// Per word: each word/slot is its own EnterToken (stagger by sequential index). Slot glue\n// is prefix | InlineLayer(node) | suffix as horizontal siblings inside the token (plain\n// content / good-ref layout), so punctuation stays inline and still shares the enter\n// transform. Per line: after visual lines are measured, every word/space/slot on the same\n// rendered line is wrapped in ONE EnterToken (`asLine`) so X/Y/scale/rotate apply to the\n// whole line as a unit — not N synchronized per-word transforms. Measuring hold still\n// prevents the first Play commit from locking flat (per-word) stagger forever.\nfunction buildEffectContent(parts,layers,slot,layerAlign,layerGap,scale,effects,play,staticVisible,canvasLike,replayKey,reducedMotion,tokenRefs,tokenRefCallbacks,lineIndices,forcedBreaks,entrance){const units=tokenizeForEffects(parts,layers,slot);const perLine=effects.per===\"line\";// Canvas Play starts `play=true` on the first commit. Measuring visual lines needs the\n// tokens laid out first; if motion mounted with the interim flat (per-word) index it\n// would keep that stagger forever. Hold play and key on \"pending\" until lineIndices\n// exists, then remount once with real whole-line units.\nconst measuring=perLine&&lineIndices===null;const tokenPlay=play&&!measuring;// Flat per-word (and per-line measuring) path: one EnterToken per word/slot.\nconst renderFlat=()=>{const out=[];let wordSeq=0;for(const[ui,u]of units.entries()){if(u.kind===\"space\"){out.push(u.value);continue;}const flatIndex=wordSeq++;const setRef=getStableTokenRef(tokenRefs,tokenRefCallbacks,flatIndex);const mountKey=measuring?\"m\":\"w\";if(u.kind===\"word\"){out.push(/*#__PURE__*/_jsx(EnterToken,{innerRef:setRef,enter:effects.enter,outerDelay:effects.delay,index:flatIndex,play:tokenPlay,staticVisible:staticVisible,canvasLike:canvasLike,reducedMotion:reducedMotion,children:u.value},`w-${ui}-${replayKey}-${mountKey}`));}else{// REVERT layout path: glue as horizontal siblings of InlineLayer (plain-content\n// / good-ref era), not prefix|block-slot|suffix inside InlineLayer's flex child.\n// Nesting a block-level connected layer between text nodes inside an\n// inline-block was the vertical stack (comma under plugins). Motion still\n// wraps prefix+InlineLayer+suffix so punct animates with the slot (1.13).\nout.push(/*#__PURE__*/_jsxs(EnterToken,{innerRef:setRef,enter:effects.enter,outerDelay:effects.delay,index:flatIndex,play:tokenPlay,staticVisible:staticVisible,canvasLike:canvasLike,reducedMotion:reducedMotion,children:[u.prefix,/*#__PURE__*/_jsx(InlineLayer,{align:layerAlign,gap:layerGap,scale:scale,children:u.node}),u.suffix]},`${u.key}-${replayKey}-${mountKey}`));}}tokenRefs.current.length=wordSeq;tokenRefCallbacks.current.length=wordSeq;return out;};if(!perLine||measuring){return renderFlat();}// Whole-line units: every word/slot goes into the block of its measured visual line\n// (read from the plain flow, see useLineGroups). Every character of the text is placed\n// exactly once, in order, so with the blocks taken out of the box tree the text is the\n// plain flow again — that is what makes the next measurement independent of this split.\nconst tokenLines=[];{let last=0;let seq=0;for(const u of units){if(u.kind===\"space\")continue;// A text edit can render once with the previous text's lines before the\n// re-measure; clamp to a non-decreasing order instead of one block per token.\nconst measured=lineIndices[seq++];last=Math.max(last,measured!==undefined?measured:last);tokenLines.push(last);}}const lines=[];const put=(line,node)=>(lines[line]||(lines[line]=[])).push(node);let wordSeq=0;let current=0;for(const[ui,u]of units.entries()){if(u.kind===\"space\"){const next=tokenLines[wordSeq];if(forcedBreaks&&u.value.includes(\"\\n\")){// Typed line breaks: what precedes each \"\\n\" ends the current line (as in the\n// plain text), blank lines get their own empty line, and indentation after the\n// last \"\\n\" starts the next line.\nconst pieces=u.value.split(\"\\n\");for(let p=0;p<pieces.length-1;p++)put(current++,`${pieces[p]}\n`);const lead=pieces[pieces.length-1];if(lead)put(current,lead);}else if(next===undefined||next>current){// Soft-wrap space (or trailing space): in the plain text it hangs past the line\n// edge and takes no width. At the end of a block Chrome would keep it and shift\n// centered/right lines (1.18), so it stays in the DOM, hidden, for the\n// plain-flow read only.\nput(current,/*#__PURE__*/_jsx(\"span\",{[GAP_ATTR]:\"\",style:{display:\"none\"},children:u.value},`gap-${ui}`));}else{put(current,u.value);}continue;}const flatIndex=wordSeq++;current=Math.max(current,tokenLines[flatIndex]);const setRef=getStableTokenRef(tokenRefs,tokenRefCallbacks,flatIndex);if(u.kind===\"word\"){put(current,/*#__PURE__*/_jsx(\"span\",{ref:setRef,\"data-tw-measure\":flatIndex,style:{display:\"inline-block\"},children:u.value},`mw-${ui}`));}else{// Same horizontal glue contract as per-word: prefix | InlineLayer(node) | suffix.\nput(current,/*#__PURE__*/_jsxs(\"span\",{ref:setRef,\"data-tw-measure\":flatIndex,style:TOKEN_LAYOUT_STYLE,children:[u.prefix,/*#__PURE__*/_jsx(InlineLayer,{align:layerAlign,gap:layerGap,scale:scale,children:u.node}),u.suffix]},`${u.key}-L`));}}const linesWithTokens=new Set(tokenLines);// Has this line's entrance (delay + stagger + duration) already finished? Then a block that\n// mounts now — a new line from a narrower width — appears settled instead of replaying.\nconst transition={...ENTER_DEFAULTS.transition,...effects.enter?.transition};const runMs=(transition.type===\"spring\"?Math.max(1,transition.duration||0)+.5:transition.duration??.4)*1e3;const lineEntered=line=>!!entrance&&entrance.key===replayKey&&entrance.at>0&&performance.now()-entrance.at>(Math.max(0,effects.delay||0)+(transition.delay||0)*line)*1e3+runMs+100;const out=[];for(let line=0;line<lines.length;line++){const kids=lines[line]||[];if(!linesWithTokens.has(line)){// Blank line (typed \"\\n\\n\" or a leading \"\\n\"): one empty line-height row.\nout.push(/*#__PURE__*/_jsx(\"span\",{[LINE_ATTR]:\"\",\"data-tw-empty\":\"\",style:tokenLayoutStyle(true),children:kids},`empty-${line}`));continue;}out.push(/*#__PURE__*/_jsx(EnterToken,{asLine:true,enter:effects.enter,outerDelay:effects.delay,index:line,entered:lineEntered(line),play:tokenPlay,staticVisible:staticVisible,canvasLike:canvasLike,reducedMotion:reducedMotion,children:kids},`line-${line}-${replayKey}`));}tokenRefs.current.length=wordSeq;tokenRefCallbacks.current.length=wordSeq;return out;}// Trigger state for the whole effect: On appear plays once right after mount; Layer in view\n// plays once the chosen point (Top/Center/Bottom) crosses the viewport's bottom edge, and\n// (with Replay) resets only once the layer is fully out of view — never mid-scroll. Motion's\n// own `initial` prop already renders the hidden pose synchronously on first paint, so there is\n// no enter flash regardless of which trigger fires it.\nfunction useEnterEffectTrigger(effects,containerRef,props,isCanvas){const trigger=effects?.trigger??\"appear\";const start=effects?.start??\"top\";const replay=effects?.replay??false;const onCanvas=effects?.onCanvas??\"play\";const[mounted,setMounted]=useState(false);const[inStart,setInStart]=useState(false);const[playgroundCanvas,setPlaygroundCanvas]=useState(false);const[replayKey,setReplayKey]=useState(0);const canvasLike=isCanvas||playgroundCanvas;useEffect(()=>{setMounted(true);},[]);// Playground edit mode is not guaranteed to report Framer's Canvas RenderTarget.\n// Its standing host contract is a compatible-canvas ancestor outside the live preview.\nuseIsoLayoutEffect(()=>{const node=containerRef.current;const inCanvasHost=!!node?.closest?.(\"[data-sp-root], [data-sp-compatible-canvas]\");const inLivePreview=!!node?.closest?.(\"[data-sp-live]\");const next=inCanvasHost&&!inLivePreview;setPlaygroundCanvas(current=>current===next?current:next);});// Remount entrance tokens when designer-facing values change — not when Framer\n// reallocates prop object identities every editor canvas render (`style` / `font` /\n// `effects` / `layers` array). Identity thrash remounted tokens continuously, kept\n// them busy, and froze slot line-height neutralization (editor-only uneven gaps).\nconst enter=effects?.enter;const canvasReplayFingerprint=[onCanvas,effects?.per,effects?.trigger,effects?.start,effects?.replay?1:0,effects?.delay,enter?.opacity,enter?.scale,enter?.blur,enter?.rotationMode,enter?.rotate2D,enter?.rotate3D?.x,enter?.rotate3D?.y,enter?.rotate3D?.z,enter?.offsetX,enter?.offsetY,enter?.transition?.type,enter?.transition?.duration,enter?.transition?.delay,props.text,props.slot,Array.isArray(props.layers)?props.layers.length:0,props.font?.fontSize,props.font?.fontFamily,props.font?.fontWeight,props.font?.lineHeight,props.font?.letterSpacing,props.font?.textAlign,props.color,props.layerGap,props.scale,props.layerAlign,props.transform,props.wrap,props.balance===true?1:0,props.truncate?1:0,props.lines,props.userSelect,props.tag,props.style?.width,props.style?.height].join(\"|\");useIsoLayoutEffect(()=>{if(!effects||!canvasLike||onCanvas!==\"play\")return;setReplayKey(value=>value+1);},[canvasLike,onCanvas,canvasReplayFingerprint]);useEffect(()=>{if(!effects||trigger!==\"layer in view\")return;const node=containerRef.current;if(!node)return;if(typeof IntersectionObserver===\"undefined\"){setInStart(true);return;}const rect=node.getBoundingClientRect();const offset=start===\"top\"?0:start===\"center\"?rect.height/2:rect.height;const startObserver=new IntersectionObserver(([entry])=>{if(entry.isIntersecting)setInStart(true);},{rootMargin:`0px 0px -${Math.max(0,Math.round(offset))}px 0px`});startObserver.observe(node);let visibilityObserver=null;if(replay){visibilityObserver=new IntersectionObserver(([entry])=>{if(!entry.isIntersecting)setInStart(false);});visibilityObserver.observe(node);}return()=>{startObserver.disconnect();visibilityObserver?.disconnect();};},[effects,trigger,start,replay]);if(!effects)return{play:false,staticVisible:false,canvasLike,replayKey};if(canvasLike){return onCanvas===\"pause\"?{play:false,staticVisible:true,canvasLike,replayKey}:{play:true,staticVisible:false,canvasLike,replayKey};}return{play:trigger===\"layer in view\"?inStart:mounted,staticVisible:false,canvasLike,replayKey};}function isFitSize(value){return value===undefined||value===null||value===\"auto\"||value===\"max-content\"||value===\"fit-content\";}// Ascent share of the font's content area, per font. Used to find where a text's baseline sits inside its client rect.\nconst ascentShare={};function getAscentShare(cs){const key=`${cs.fontStyle} ${cs.fontWeight} ${cs.fontFamily}`;if(ascentShare[key]===undefined){const ctx=document.createElement(\"canvas\").getContext(\"2d\");if(!ctx)return .8;ctx.font=`${cs.fontStyle} ${cs.fontWeight} 100px ${cs.fontFamily}`;const m=ctx.measureText(\"Hxg\");ascentShare[key]=m.fontBoundingBoxAscent/(m.fontBoundingBoxAscent+m.fontBoundingBoxDescent);}return ascentShare[key];}// Baseline (viewport y) of the first visible text inside a connected layer, or null when the layer has none.\nfunction firstTextBaseline(layer){const walker=document.createTreeWalker(layer,NodeFilter.SHOW_TEXT);for(let node=walker.nextNode();node;node=walker.nextNode()){const parent=node.parentElement;const value=node.nodeValue;if(!parent||!value||!value.trim()||/^(STYLE|SCRIPT)$/.test(parent.tagName))continue;const cs=getComputedStyle(parent);if(cs.visibility===\"hidden\"||cs.display===\"none\"||parseFloat(cs.opacity)===0)continue;const range=document.createRange();range.selectNodeContents(node);const rect=range.getClientRects()[0];if(!rect||rect.width<2)continue;return rect.top+rect.height*getAscentShare(cs);}return null;}// Run `read` with every enclosing enter-effect transform lifted. Reads and restores happen in\n// the same synchronous task, so nothing is ever painted without the transform and Framer\n// Motion's next frame is untouched. This makes the measurement identical whether the slot\n// sits in plain text, a per-word token or a per-line token, mid-entrance or settled, with any\n// offset/scale/2D/3D rotation — no \"busy\" freeze and no stale value after the entrance ends.\nfunction measureWithoutEnterTransforms(node,read){const lifted=[];const root=node.closest(\".framer-text-wrap\");for(let el=node.parentElement;el&&el!==root;el=el.parentElement){if(el.hasAttribute(MOTION_ATTR)&&el.style.transform){lifted.push([el,el.style.transform]);el.style.transform=\"none\";}}try{return read();}finally{for(const[el,value]of lifted)el.style.transform=value;}}// Connected layer slot (1.17 structure).\n//\n// SPAN + INLINE-FLEX avoid the <div> nesting error. Nothing below the inner zoom span is\n// restyled, so the layer renders exactly as it was designed on the canvas.\n//\n//   anchor  inline-flex, height 0, vertical-align: middle   ← the only thing in the text line\n//   offset  the slot's box, placed relative to the anchor   ← Middle: centered; Baseline: offset\n//   zoom    inline-flex, Scale control                      ← connected layer lives here\n//\n// Line height: the anchor's margin box is zero tall and sits half an x-height above the\n// baseline — inside the Font line box — so a connected layer of any height can never grow\n// its line (1.4) and needs no measuring to get there (no first-paint flash, 1.5). The layer\n// overflows the anchor visibly and keeps its full paint and hit area.\n//\n// Vertical position is decided by CSS relative to the *text line*, never by the wrappers the\n// slot is inside: `vertical-align: middle` puts the anchor at baseline + ½ x-height of the\n// surrounding text in plain text, inside per-word inline-block tokens and inside per-line\n// blocks alike (they all inherit the same font and line-height), and in the editor or on a\n// published site alike.\n//   Middle   — the slot is centered on the anchor (`align-items: center`). Pure CSS.\n//   Baseline — the slot's first visible text baseline sits on the text baseline, whatever the\n//              order inside the layer (image first, text first, absolutely positioned label).\n//              That distance from the slot's top (`textTop`) is the only measured value; it\n//              is a property of the slot's content, not of where the line is, and it is\n//              measured with enter transforms lifted, so it is the same with or without\n//              effects. Slots without text sit with their bottom on the baseline (CSS only).\nfunction InlineLayer({children,align=\"baseline\",gap=0,scale=1}){const offsetRef=useRef(null);const zoomRef=useRef(null);const textTopRef=useRef(null);const scheduleRef=useRef(()=>{});const[textTop,setTextTop]=useState(null);const isBaseline=align===\"baseline\";textTopRef.current=textTop;useIsoLayoutEffect(()=>{const box=offsetRef.current;const zoom=zoomRef.current;if(!isBaseline||!box||!zoom){scheduleRef.current=()=>{};return;}let frame=0;const measure=()=>{frame=0;const next=measureWithoutEnterTransforms(box,()=>{const layoutH=box.offsetHeight;if(!layoutH)return null;const rect=box.getBoundingClientRect();// Uniform scale from outside the component (Framer canvas zoom).\nconst outer=rect.height/layoutH||1;const text=firstTextBaseline(zoom);if(text===null)return null;// Relative to the connected layer's own (possibly hover-transformed) box, so\n// Magnetic Hover style transforms on the layer itself are ignored.\nconst slot=zoom.firstElementChild||zoom;return Math.round((text-slot.getBoundingClientRect().top)/outer*100)/100;});const prev=textTopRef.current;if(next===null?prev!==null:prev===null||Math.abs(next-prev)>=.25){textTopRef.current=next;setTextTop(next);}};const schedule=()=>{if(!frame)frame=requestAnimationFrame(measure);};scheduleRef.current=schedule;const resize=typeof ResizeObserver!==\"undefined\"?new ResizeObserver(schedule):null;resize?.observe(box);const mutation=new MutationObserver(records=>{// Magnetic Hover rewrites a <style> every frame; that is not a layout change.\nif(records.some(r=>r.target&&r.target.nodeName!==\"STYLE\"&&!r.target.closest?.(\"style\"))){schedule();}});mutation.observe(zoom,{subtree:true,childList:true,characterData:true,attributes:true,attributeFilter:[\"style\",\"class\"]});const fonts=document.fonts;fonts?.ready?.then(schedule);fonts?.addEventListener?.(\"loadingdone\",schedule);// Synchronous first measurement: the baseline offset is committed before first paint.\nmeasure();return()=>{if(frame)cancelAnimationFrame(frame);resize?.disconnect();mutation.disconnect();fonts?.removeEventListener?.(\"loadingdone\",schedule);};},[isBaseline]);// re-measure after every render of the parent as well (props, connected layers, font changes)\nuseIsoLayoutEffect(()=>{scheduleRef.current();});const textAligned=isBaseline&&textTop!==null;return /*#__PURE__*/_jsx(\"span\",{\"data-tw-layer\":\"\",style:{display:\"inline-flex\",height:0,verticalAlign:\"middle\",alignItems:isBaseline?textAligned?\"flex-start\":\"flex-end\":\"center\",whiteSpace:\"nowrap\",marginLeft:gap,marginRight:gap},children:/*#__PURE__*/_jsx(\"span\",{ref:offsetRef,\"data-tw-slot\":isBaseline?\"baseline\":\"middle\",\"data-tw-text-top\":textAligned?textTop:undefined,style:{display:\"inline-flex\",flex:\"none\",// The anchor is ½ex above the baseline (vertical-align: middle); `ex` here\n// resolves against the same inherited font, so these land exactly on it.\nmarginTop:textAligned?`calc(0.5ex - ${textTop}px)`:undefined,marginBottom:isBaseline&&!textAligned?\"-0.5ex\":undefined},children:/*#__PURE__*/_jsx(\"span\",{ref:zoomRef,style:{display:\"inline-flex\",lineHeight:0,whiteSpace:\"pre-wrap\",zoom:scale},children:children})})});}TextWrap.displayName=\"Inline Text Embed\";addPropertyControls(TextWrap,{effects:{type:ControlType.Object,title:\"Effects\",icon:\"effect\",buttonTitle:\"Edit effects\",optional:true,controls:{onCanvas:{type:ControlType.Enum,title:\"On canvas\",defaultValue:\"play\",options:[\"play\",\"pause\"],optionTitles:[\"Play\",\"Pause\"],displaySegmentedControl:true},trigger:{type:ControlType.Enum,title:\"Trigger\",defaultValue:\"appear\",options:[\"appear\",\"layer in view\"],optionTitles:[\"On appear\",\"Layer in view\"],displaySegmentedControl:true,segmentedControlDirection:\"vertical\"},start:{type:ControlType.Enum,title:\"Start\",defaultValue:\"top\",options:[\"top\",\"center\",\"bottom\"],optionTitles:[\"Top\",\"Center\",\"Bottom\"],displaySegmentedControl:true,hidden:props=>props.trigger!==\"layer in view\"},replay:{type:ControlType.Boolean,title:\"Replay\",defaultValue:false,enabledTitle:\"Yes\",disabledTitle:\"No\",hidden:props=>props.trigger!==\"layer in view\"},per:{type:ControlType.Enum,title:\"Per\",defaultValue:\"word\",options:[\"word\",\"line\"],optionTitles:[\"Word\",\"Line\"],displaySegmentedControl:true},enter:{type:ControlType.Object,title:\"Effect\",icon:\"effect\",buttonTitle:\"Edit effect\",controls:{opacity:{type:ControlType.Number,title:\"Opacity\",defaultValue:0,min:0,max:1,step:.01},scale:{type:ControlType.Number,title:\"Scale\",defaultValue:1,min:0,max:10,step:.01},blur:{type:ControlType.Number,title:\"Blur\",defaultValue:5,min:0,max:100,step:1,unit:\"px\"},rotationMode:{type:ControlType.Enum,title:\"Rotation\",defaultValue:\"2d\",options:[\"2d\",\"3d\"],optionTitles:[\"2D\",\"3D\"],displaySegmentedControl:true},rotate2D:{type:ControlType.Number,title:\"2D rotate\",defaultValue:0,min:-360,max:360,step:1,unit:\"\\xb0\",hidden:props=>props.rotationMode!==\"2d\"},rotate3D:{type:ControlType.Object,title:\"3D rotate\",buttonTitle:\"Edit rotate\",hidden:props=>props.rotationMode!==\"3d\",controls:{x:{type:ControlType.Number,title:\"X\",defaultValue:0,min:-360,max:360,step:1,unit:\"\\xb0\"},y:{type:ControlType.Number,title:\"Y\",defaultValue:0,min:-360,max:360,step:1,unit:\"\\xb0\"},z:{type:ControlType.Number,title:\"Z\",defaultValue:0,min:-360,max:360,step:1,unit:\"\\xb0\"}},defaultValue:{x:0,y:0,z:0}},offsetX:{type:ControlType.Number,title:\"X offset\",defaultValue:0,step:1,unit:\"px\",displayStepper:true},offsetY:{type:ControlType.Number,title:\"Y offset\",defaultValue:10,step:1,unit:\"px\",displayStepper:true},transition:{type:ControlType.Transition,title:\"Transition\",defaultValue:{type:\"tween\",ease:[.15,.75,.5,1],duration:.4,delay:.05}}},defaultValue:{opacity:0,scale:1,blur:5,rotationMode:\"2d\",rotate2D:0,rotate3D:{x:0,y:0,z:0},offsetX:0,offsetY:10}},delay:{type:ControlType.Number,title:\"Delay\",defaultValue:0,min:0,step:.1,unit:\"s\",displayStepper:true}}},text:{type:ControlType.String,title:\"Text\",defaultValue:\"Embed [] elements [] your [] layers.\",displayTextArea:true},slot:{type:ControlType.String,title:\"Slot\",defaultValue:\"[]\"},layers:{type:ControlType.Array,title:\"Layers\",control:{type:ControlType.ComponentInstance}},font:{type:ControlType.Font,title:\"Font\",controls:\"extended\",defaultFontType:\"sans-serif\",displayTextAlignment:true,defaultValue:{variant:\"Medium\",fontSize:\"44px\",lineHeight:\"1.3em\",textAlign:\"left\"}},color:{type:ControlType.Color,title:\"Color\",defaultValue:\"#666666\"},layerAlign:{type:ControlType.Enum,title:\"Align\",defaultValue:\"baseline\",options:[\"baseline\",\"middle\"],optionTitles:[\"Baseline\",\"Middle\"],displaySegmentedControl:true},layerGap:{type:ControlType.Number,title:\"Layer gap\",defaultValue:0,min:0,step:1,unit:\"px\"},scale:{type:ControlType.Number,title:\"Scale\",defaultValue:1,min:.1,max:2,step:.1,unit:\"x\"},transform:{type:ControlType.Enum,title:\"Transform\",defaultValue:\"none\",options:[\"none\",\"capitalize\",\"lowercase\",\"uppercase\"],optionTitles:[\"None\",\"Capitalize\",\"Lowercase\",\"Uppercase\"]},wrap:{type:ControlType.Enum,title:\"Wrap\",defaultValue:\"auto\",options:[\"auto\",\"balance\",\"pretty\"],optionTitles:[\"Auto\",\"Balance\",\"Pretty\"]},truncate:{type:ControlType.Boolean,title:\"Truncate\",defaultValue:false,enabledTitle:\"Yes\",disabledTitle:\"No\"},lines:{type:ControlType.Number,title:\"Lines\",defaultValue:1,min:1,step:1,unit:\"L\",displayStepper:true,hidden:props=>!props.truncate},userSelect:{type:ControlType.Enum,title:\"User select\",defaultValue:\"auto\",options:[\"auto\",\"none\"],optionTitles:[\"Auto\",\"None\"],displaySegmentedControl:true},tag:{type:ControlType.Enum,title:\"Tag\",defaultValue:\"h1\",options:[\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"p\",\"span\"],description:\"More components at [Framer University](https://frameruni.link/cc).\"}});\nexport const __FramerMetadata__ = {\"exports\":{\"default\":{\"type\":\"reactComponent\",\"name\":\"TextWrap\",\"slots\":[],\"annotations\":{\"framerSupportedLayoutHeight\":\"auto\",\"framerIntrinsicHeight\":\"auto\",\"framerSupportedLayoutWidth\":\"any-prefer-fixed\",\"framerContractVersion\":\"1\",\"framerDisableUnlink\":\"*\",\"framerIntrinsicWidth\":\"450\"}},\"__FramerMetadata__\":{\"type\":\"variable\"}}}\n//# sourceMappingURL=./TextWrap_Prod.map"],"mappings":"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"}