{
  "slug": "neon-frame-orbit-drop",
  "title": "Neon frame orbit drop",
  "tagline": "Neon frame draws in, then the camera arcs across the page as every element drops into place on the same frame.",
  "description": "Neon frame draws in, then the camera arcs across the page as every element drops into place on the same frame.",
  "category": "ui-entrance",
  "tags": [
    "shotcraft",
    "remotion",
    "ui-entrance",
    "effects",
    "camera"
  ],
  "tier": "free",
  "license": "Apache-2.0",
  "spec": {
    "width": 1920,
    "height": 1080,
    "fps": 30,
    "duration": 4.6,
    "aspect": "16:9"
  },
  "kind": "remotion",
  "params_schema": {
    "type": "object",
    "properties": {}
  },
  "default_params": {},
  "preview": {
    "poster": "https://gimgs.net/motion/media/neon-frame-orbit-drop/poster-94b3b0cadc07.jpg",
    "video": "https://gimgs.net/motion/media/neon-frame-orbit-drop/video-5990c8035204.mp4"
  },
  "variants": [
    {
      "key": "neon-frame-orbit-drop",
      "label": "neon-frame-orbit-drop",
      "description": "Neon frame outlines first, then the camera arcs left→right around the page in a continuous curve while every component and piece of text on the page drops into place from above on the same frame (matching soft shadows converge in sync) — a unified, whole-page grand entrance settling into the frame.",
      "use": "",
      "video": "https://gimgs.net/motion/media/neon-frame-orbit-drop/video-5990c8035204.mp4",
      "poster": "https://gimgs.net/motion/media/neon-frame-orbit-drop/poster-94b3b0cadc07.jpg"
    }
  ],
  "credits": {
    "author": "video-shotcraft (Vincent Wei)",
    "url": "https://github.com/Vincentwei1021/video-shotcraft"
  },
  "page_url": "https://gimgs.net/motion/neon-frame-orbit-drop.html",
  "json_url": "https://gimgs.net/motion/neon-frame-orbit-drop.json",
  "template_url": "https://gimgs.net/motion/neon-frame-orbit-drop/template.html",
  "play_url": null,
  "markdown_url": "https://gimgs.net/motion/neon-frame-orbit-drop.md",
  "updated_at": "2026-09-24T07:40:08.871Z",
  "prompt": "## When to use\n\nA single-page UI's one-time grand entrance (vs. a tour/reveal-by-section); the hero reveal for dark neon-toned sequences; sister shot to neon-frame-forerun\n\n## Intention\n\nA twin variant of neon-frame-forerun: the frame still leads and content still drops in after, but here the camera is not static — it arcs continuously from a left-side view of the page to a right-side view, and while it orbits, every component drops into place from above. The critical rule is **simultaneous landing**: all components and text rise and land on the same frame, with soft shadows converging and vanishing in sync — this is the grammar of a \"unified entrance\" (precedent: a staggered-drop version was rejected — \"all components and text should drop into place from the air at the same time\"). Staggered drops belong to tour shots (graze-face-tour/runway); a one-time single-page reveal must land as one, and the rhythm semantics must not be mixed.\n\n## Duration & energy\n\n- Duration: Frame draw ~0.5s + orbit & simultaneous drop ~2.5s + settle ~1s; full shot 4–4.5s\n- Energy: Medium-high (one big one-time move, static once it settles)\n\n## Shot recipe (original Chinese — timing, easing, parameter table, known pitfalls)\n\n## 意图\nneon-frame-forerun 的孪生变体：同样框先行、内容后落，但镜头\n不是固定的——从页面左侧视角连续弧线旋转到右侧视角，旋转进行\n的同时全部组件从空中贴落。命门是**同时贴合**：所有组件和文字\n同帧起落、同帧贴合、软影同步消失——这是\"整体登场\"的语法\n（判例：错峰版被裁\"应该是所有组件和文字同时从空中往下贴合\"）。\n错峰贴落属于巡礼镜（graze-face-tour/runway），一页一次性亮相\n必须齐落，节奏语义不能混用。\n\n## 动效核心\n- 霓虹描框：渐变霓虹框 ~14f 奔画成型（同 neon-frame-forerun）\n- 视角弧线：rotateY +38° → -26° 连续弧线（透视原点 30%→64% 随动\n  近似相机环绕），贯穿全片\n- 同时贴落：全部元素统一 LAND 时刻（归一化 ~0.52）——同帧离地\n  悬空、同帧空中下降、同帧贴合；FloatWrap 同形软影（blur/offset/\n  opacity 随高度）全体同步收敛\n- 背景霓虹管框群衬场，主面板落定后让位\n\n## 参数表\n| 参数 | 典型值 | 调节手感 |\n|------|--------|----------|\n| 贴落同时性 | 全元素同帧起落（零错峰） | **命门**；任何错峰都会读成巡礼语法（判例裁决原话见上） |\n| 视角弧线 | rotateY +38°→-26°、透视原点随动 | 弧度小读作抖动；只转不落=空转 |\n| 旋转×贴落耦合 | 贴落窗口居中于旋转行程 | 旋转完才落=两段戏；落完还在转=收不了尾 |\n| 悬浮高度/软影 | 同 graze-face-tour（100–180px、影随高度） | 影不可感=没做（累计判例） |\n| 描框 | ~14f 奔画 | 同 neon-frame-forerun |\n\n## 已知坑\n- 参数经占位素材两轮调校通过，非实战定稿，首次实战须以真实素材回验\n- **贴落节奏语义判例**（本卡与 graze-face-tour 互为反例）：\n  巡礼镜=错开起点+重叠并行下落；整体登场镜=全体同帧。选错语法\n  两边都会被裁\n- 与 neon-frame-forerun 分工：那张镜头固定、错峰贴落+页面点亮\n  三层咬合；本卡镜头旋转+同帧齐落。同段落二选一，别连用（同框\n  语言重复）\n- 弧线旋转是透视原点近似而非真实 3D 相机环绕，极端角度下框辉光\n  形变略平——实战若需大角度环绕考虑真 3D 场景\n\n## 参考实现\ndemos/ui-entrance/neon-frame-orbit-drop/\n（NeonFrameForerunOrbit.tsx）\n原片出处：无对应原段\n\n## Reference implementation (Remotion)\n\n- demos/ui-entrance/neon-frame-orbit-drop/NeonFrameForerunOrbit.tsx — https://raw.githubusercontent.com/Vincentwei1021/video-shotcraft/main/demos/ui-entrance/neon-frame-orbit-drop/NeonFrameForerunOrbit.tsx\n\nThe component imports shared fixtures from `demos/_fixtures` and helpers from `assets/lib` in the repo; SKILL.md there documents the render workflow.\n",
  "flow": [
    {
      "step": "Read the recipe",
      "note": "Prompt = when to use, intention, parameter table with typical values and how each one feels, known pitfalls. Treat values as calibrated starting points."
    },
    {
      "step": "Get the code",
      "tool": "git",
      "cmd": "git clone https://github.com/Vincentwei1021/video-shotcraft && cd video-shotcraft && npm install"
    },
    {
      "step": "Register + render",
      "tool": "remotion",
      "cmd": "npx remotion render <CompositionId> out.mp4   # component: demos/ui-entrance/neon-frame-orbit-drop/NeonFrameForerunOrbit.tsx"
    },
    {
      "step": "Or re-implement",
      "note": "Port the timing/easing from the recipe to HTML + WAAPI (gimgs motion contract) or any engine; keep the same segment windows and easing."
    }
  ],
  "files": [
    {
      "path": "demos/ui-entrance/neon-frame-orbit-drop/NeonFrameForerunOrbit.tsx",
      "url": "https://raw.githubusercontent.com/Vincentwei1021/video-shotcraft/main/demos/ui-entrance/neon-frame-orbit-drop/NeonFrameForerunOrbit.tsx"
    }
  ],
  "contract": "React/Remotion composition (TSX) from the open-source video-shotcraft library (Apache-2.0). It is not a browser-playable template: clone the repo, register the component in a Remotion project and render with `npx remotion render`. The recipe (prompt) describes timing, easing and parameters so you can also re-implement the shot in any engine.",
  "render": {
    "engine": "remotion",
    "frames": 138,
    "repo": "https://github.com/Vincentwei1021/video-shotcraft",
    "files": [
      "https://raw.githubusercontent.com/Vincentwei1021/video-shotcraft/main/demos/ui-entrance/neon-frame-orbit-drop/NeonFrameForerunOrbit.tsx"
    ],
    "note": "Clone https://github.com/Vincentwei1021/video-shotcraft (npm install). The component lives under demos/{category}/{name}/ and imports shared fixtures from demos/_fixtures and helpers from assets/lib. Copy it (with those imports) into a Remotion project, register a <Composition> with the template's width/height/fps/duration in Root.tsx, then `npx remotion render <CompositionId> out.mp4`. SKILL.md in the repo documents the full Claude Code / Codex workflow. The prompt below is the shot recipe (timing, easing, parameter table, pitfalls) — enough to re-implement the shot in HTML/WAAPI or another engine if you prefer."
  },
  "source": "// ===== demos/ui-entrance/neon-frame-orbit-drop/NeonFrameForerunOrbit.tsx =====\n// neon-frame-forerun-orbit v5（批次 14 #1）。用户意见（逐字）：\n// \"这个应该是所有组件和文字同时从空中往下贴合\"\n// ——单点修正：v4 的错峰贴落改为**所有组件和文字同时**从空中往下贴合\n// （同帧起落、同帧贴合，同形软影同步收敛）。判例：整体登场镜=同时贴合，\n// 错峰是巡礼镜的语法。其余全部保留：同款霓虹渐变框+灰面板+背景霓虹管\n// 框群；镜头视角 rotateY 从左侧(+38°) 连续弧线旋到右侧(-26°)。\nimport React, { useId } from 'react';\nimport { AbsoluteFill, useCurrentFrame, interpolate, Easing } from 'remotion';\n\nconst easeFall = Easing.bezier(0.5, 0.05, 0.6, 1); // 加速下落、末端软着陆\n\n/* 悬浮 + 同形软影（对标批次11 GrazeFaceTour FloatWrap）：\n * h=悬浮高度(px)。本体向左上抬起，原位留模糊压暗同形影，h→0 重合影消失 */\nconst FloatWrap: React.FC<{ h: number; children: React.ReactNode }> = ({ h, children }) => (\n  <div style={{ position: 'relative' }}>\n    {h > 1 && (\n      <div style={{\n        position: 'absolute', inset: 0,\n        transform: `translate(${h * 0.26}px, ${h * 0.48}px) scale(${1 + h * 0.0012})`,\n        filter: `blur(${2.5 + h * 0.09}px) brightness(0.32) saturate(0.4)`,\n        opacity: Math.min(0.4, 0.16 + h * 0.005),\n        pointerEvents: 'none',\n      }}>{children}</div>\n    )}\n    <div style={{ transform: `translate(${-h * 0.36}px, ${-h * 0.82}px)` }}>{children}</div>\n  </div>\n);\n\n/* v5：所有组件和文字**同时**从空中往下贴合——统一 land 时刻 LAND，\n * 同帧起落（t=LAND-FALL）、同帧贴合（t=LAND），软影同步收敛；\n * 各组件仅悬浮高度 H 略有差异（同窗下落，速度随高度自然区分） */\nconst LAND = 0.52;\nconst liftOf = (t: number, land: number, H: number) => {\n  const FALL = 0.3;\n  const p = Math.min(1, Math.max(0, (t - (LAND - FALL)) / FALL));\n  return (1 - easeFall(p)) * H;\n};\n\nconst mulberry32 = (a: number) => () => {\n  let t = (a += 0x6d2b79f5);\n  t = Math.imul(t ^ (t >>> 15), t | 1);\n  t ^= t + Math.imul(t ^ (t >>> 7), t | 61);\n  return ((t ^ (t >>> 14)) >>> 0) / 4294967296;\n};\n\nconst ink = '#3c3c3a';\nconst mid = '#9a9a98';\nconst line = '#e3e3e1';\n\nconst PW = 1330;\nconst PH = 900;\nconst PL = 1000;\n\nconst FRAME_D = `M 0 ${PH / 2} L 0 0 L ${PW} 0 L ${PW} ${PH} L 0 ${PH} Z`;\n\nconst Chip: React.FC<{ w: number }> = ({ w }) => (\n  <div style={{\n    width: w, height: 74, background: '#fdfdfc', border: `2px solid ${line}`,\n    borderRadius: 10, padding: '12px 14px', boxSizing: 'border-box',\n    display: 'flex', flexDirection: 'column', gap: 9,\n  }}>\n    <div style={{ height: 11, width: '70%', background: '#b5b5b3', borderRadius: 5 }} />\n    <div style={{ height: 9, width: '48%', background: line, borderRadius: 5 }} />\n  </div>\n);\n\n/* 与 v3 同款灰面板；t=贴落进程，各组件错峰空中贴落（重叠并行） */\nconst GrayHome: React.FC<{ t?: number }> = ({ t = 1 }) => {\n  const L = (land: number, H = 72) => liftOf(t, land, H * 1.7);\n  return (\n  <div style={{ width: PW, height: PH, background: '#f5f5f4', borderRadius: 6, display: 'flex', overflow: 'hidden', boxSizing: 'border-box' }}>\n    <div style={{ width: 290, borderRight: `2px solid ${line}`, padding: '26px 24px', boxSizing: 'border-box' }}>\n      <FloatWrap h={L(0.24, 84)}>\n        <div style={{ display: 'flex', alignItems: 'center', gap: 10, marginBottom: 28 }}>\n          <div style={{ width: 28, height: 28, borderRadius: 8, background: ink }} />\n          <div style={{ height: 15, width: 88, background: ink, borderRadius: 7 }} />\n        </div>\n      </FloatWrap>\n      {[76, 56, 96, 110, 66, 60].map((w, i) => (\n        <FloatWrap key={i} h={L(0.3 + i * 0.045, 66)}>\n          <div style={{ display: 'flex', alignItems: 'center', gap: 11, height: 34 }}>\n            <div style={{ width: 17, height: 17, borderRadius: 5, background: mid }} />\n            <div style={{ height: 10, width: w, background: '#c7c7c5', borderRadius: 5 }} />\n          </div>\n        </FloatWrap>\n      ))}\n      <FloatWrap h={L(0.56, 62)}>\n        <div style={{ height: 11, width: 70, background: '#b0b0ae', borderRadius: 5, margin: '24px 0 12px' }} />\n      </FloatWrap>\n      {[104, 126, 96, 118, 88].map((w, i) => (\n        <FloatWrap key={i} h={L(0.62 + i * 0.05, 66)}>\n          <div style={{ display: 'flex', alignItems: 'center', gap: 11, height: 32 }}>\n            <div style={{ width: 16, height: 16, borderRadius: 4, background: '#b8b8b6' }} />\n            <div style={{ height: 10, width: w, background: '#cfcfcd', borderRadius: 5 }} />\n          </div>\n        </FloatWrap>\n      ))}\n    </div>\n    <div style={{ flex: 1, padding: '30px 40px', boxSizing: 'border-box' }}>\n      <FloatWrap h={L(0.26, 90)}>\n        <div style={{ height: 24, width: 130, background: '#565654', borderRadius: 10, marginBottom: 22 }} />\n      </FloatWrap>\n      <FloatWrap h={L(0.34, 80)}>\n        <div style={{ height: 46, border: `2px solid ${line}`, borderRadius: 12, marginBottom: 26, display: 'flex', alignItems: 'center', padding: '0 16px', background: '#f5f5f4' }}>\n          <div style={{ width: 17, height: 17, borderRadius: 9, border: `2px solid ${mid}` }} />\n          <div style={{ height: 10, width: 250, background: line, borderRadius: 5, marginLeft: 12 }} />\n        </div>\n      </FloatWrap>\n      <div style={{ display: 'flex', gap: 16, flexWrap: 'wrap', marginBottom: 30 }}>\n        {[0, 1, 2, 3, 4, 5, 6].map((i) => (\n          <FloatWrap key={i} h={L(0.42 + i * 0.04, 76)}>\n            <Chip w={222} />\n          </FloatWrap>\n        ))}\n      </div>\n      <FloatWrap h={L(0.72, 60)}>\n        <div style={{ display: 'flex', gap: 18, marginBottom: 18 }}>\n          {[54, 84, 50, 82].map((w, i) => (\n            <div key={i} style={{ height: 11, width: w, background: i === 0 ? '#8a8a88' : line, borderRadius: 5 }} />\n          ))}\n        </div>\n      </FloatWrap>\n      {[0, 1, 2, 3].map((i) => (\n        <FloatWrap key={i} h={L(0.78 + i * 0.055, 64)}>\n          <div style={{ display: 'flex', alignItems: 'center', gap: 14, height: 46, borderBottom: `2px solid ${line}` }}>\n            <div style={{ width: 13, height: 13, borderRadius: 7, background: '#c26a6a' }} />\n            <div style={{ height: 11, width: 160 + ((i * 37) % 70), background: '#b6b6b4', borderRadius: 5 }} />\n            <div style={{ marginLeft: 'auto', display: 'flex', gap: 7 }}>\n              {[0, 1, 2].map((k) => <div key={k} style={{ width: 20, height: 20, borderRadius: 10, background: '#d2d2d0' }} />)}\n            </div>\n          </div>\n        </FloatWrap>\n      ))}\n    </div>\n  </div>\n  );\n};\n\ntype BgFrame = { x: number; y: number; w: number; h: number; hue: string; phase: number; period: number; skew: number };\nconst rng = mulberry32(20260718);\nconst HUES = ['#b06af0', '#e879c9', '#f0a35c', '#6a7df0', '#e0679a', '#8a5cf0', '#c06af0'];\nconst BG_FRAMES: BgFrame[] = Array.from({ length: 18 }).map(() => ({\n  x: rng() * 2000 - 120, y: rng() * 1100 - 60,\n  w: 160 + rng() * 480, h: 70 + rng() * 220,\n  hue: HUES[Math.floor(rng() * HUES.length)],\n  phase: rng() * 90, period: 55 + rng() * 70,\n  skew: -14 + rng() * 10,\n}));\n\nexport const NeonFrameForerunOrbit: React.FC = () => {\n  const frame = useCurrentFrame();\n  // 滤镜/渐变 ID 按实例生成，多实例同场不串引（useId 的 «:» 在 url() 里非法，需清洗）\n  const uid = useId().replace(/[^a-zA-Z0-9]/g, '');\n  // 开场快速描框（同款左缘中点两头奔画，14 帧成型——样式与 v3 一致）\n  const trace = interpolate(frame, [0, 14], [0, 1], {\n    extrapolateLeft: 'clamp', extrapolateRight: 'clamp',\n    easing: Easing.bezier(0.3, 0.1, 0.3, 1),\n  });\n  // 面板早亮：本变体主角是旋转+贴落，不复刻暗转亮长过程\n  const lit = interpolate(frame, [8, 30], [0.25, 1], {\n    extrapolateLeft: 'clamp', extrapolateRight: 'clamp',\n    easing: Easing.bezier(0.35, 0, 0.3, 1),\n  });\n  const frameLine = interpolate(frame, [96, 130], [1, 0.35], {\n    extrapolateLeft: 'clamp', extrapolateRight: 'clamp',\n  });\n  const rimGlow = interpolate(frame, [0, 20, 108, 138], [0.7, 1, 0.75, 0.5], {\n    extrapolateLeft: 'clamp', extrapolateRight: 'clamp',\n  });\n  const bgLit = interpolate(frame, [0, 30, 100, 136], [0.3, 1, 0.85, 0.1], {\n    extrapolateLeft: 'clamp', extrapolateRight: 'clamp',\n  });\n  // 视角弧线：从页面左侧(+38°)连续旋到右侧(-26°)，全程不停——\n  // ease-in-out 起止柔和、中段持续转动\n  const orbit = interpolate(frame, [0, 128], [0, 1], {\n    extrapolateLeft: 'clamp', extrapolateRight: 'clamp',\n    easing: Easing.bezier(0.42, 0.05, 0.32, 1),\n  });\n  const rotY = 38 - 64 * orbit;             // +38° → -26°\n  const rotX = 6 - 2.5 * orbit;\n  const rotZ = 3 - 7.5 * orbit;             // 左视角微仰 → 右视角微俯（对齐 v3 落定姿态）\n  const scale = 0.9 + 0.1 * Math.sin(orbit * Math.PI) + 0.02 * orbit; // 弧线中段略推近\n  // 透视原点随视角横移：镜头从左绕到右\n  const pOrigin = 30 + 34 * orbit;\n  const headP = trace * (PL / 2);\n  // 贴落进程：与旋转同时进行（帧 10–118），错峰起点+重叠下落\n  const drop = interpolate(frame, [10, 118], [0, 1], {\n    extrapolateLeft: 'clamp', extrapolateRight: 'clamp',\n  });\n\n  return (\n    <AbsoluteFill style={{ background: '#060509', overflow: 'hidden' }}>\n      {/* 背景霓虹管框群（同款） */}\n      <svg width={1920} height={1080} style={{ position: 'absolute' }}>\n        <defs>\n          <filter id={`obgblur-${uid}`} x=\"-60%\" y=\"-60%\" width=\"220%\" height=\"220%\">\n            <feGaussianBlur stdDeviation={7} />\n          </filter>\n        </defs>\n        {BG_FRAMES.map((b, i) => {\n          const breath = 0.5 + 0.5 * Math.sin(((frame + b.phase) / b.period) * Math.PI * 2);\n          const op = bgLit * (0.18 + 0.4 * breath);\n          return (\n            <g key={i} transform={`translate(${b.x} ${b.y}) skewY(${b.skew * 0.4}) skewX(${b.skew})`}>\n              <rect width={b.w} height={b.h} rx={4} fill=\"none\"\n                stroke={b.hue} strokeWidth={7} filter={`url(#obgblur-${uid})`} opacity={op * 0.8} />\n              <rect width={b.w} height={b.h} rx={4} fill=\"none\"\n                stroke={b.hue} strokeWidth={2} opacity={op} />\n            </g>\n          );\n        })}\n      </svg>\n      {/* 主体：视角弧线旋转中的框+面板 */}\n      <div style={{ position: 'absolute', inset: 0, perspective: 1500, perspectiveOrigin: `${pOrigin}% 44%` }}>\n        <div style={{\n          position: 'absolute', left: (1920 - PW) / 2, top: (1080 - PH) / 2 - 10,\n          transform: `scale(${scale}) rotateY(${rotY}deg) rotateX(${rotX}deg) rotateZ(${rotZ}deg)`,\n          transformStyle: 'preserve-3d',\n        }}>\n          <div style={{ opacity: trace > 0.4 ? 1 : 0, filter: `brightness(${Math.max(0.05, lit)})` }}>\n            <GrayHome t={drop} />\n            <div style={{\n              position: 'absolute', inset: 0, borderRadius: 6,\n              background: 'linear-gradient(150deg, rgba(30,20,60,0.5), rgba(0,0,0,0.78))',\n              opacity: 1 - lit,\n            }} />\n          </div>\n          <div style={{\n            position: 'absolute', left: -10, top: -10, width: PW + 20, height: PH + 20,\n            borderRadius: 12, opacity: rimGlow * Math.min(1, trace * 1.6),\n            boxShadow: '-18px -8px 42px 6px rgba(185,95,240,0.42), 22px 24px 56px 12px rgba(240,150,90,0.30), 0 14px 80px 22px rgba(200,100,220,0.20)',\n          }} />\n          <svg width={PW + 80} height={PH + 80} viewBox={`-40 -40 ${PW + 80} ${PH + 80}`}\n            style={{ position: 'absolute', left: -40, top: -40 }}>\n            <defs>\n              <linearGradient id={`omainfg-${uid}`} gradientUnits=\"userSpaceOnUse\" x1={0} y1={0} x2={PW} y2={PH}>\n                <stop offset=\"0%\" stopColor=\"#c07af5\" />\n                <stop offset=\"38%\" stopColor=\"#e58bd8\" />\n                <stop offset=\"72%\" stopColor=\"#f0b06a\" />\n                <stop offset=\"100%\" stopColor=\"#e8925c\" />\n              </linearGradient>\n              <filter id={`ofblur-${uid}`} x=\"-40%\" y=\"-40%\" width=\"180%\" height=\"180%\">\n                <feGaussianBlur stdDeviation={10} />\n              </filter>\n              <filter id={`ofblur2-${uid}`} x=\"-40%\" y=\"-40%\" width=\"180%\" height=\"180%\">\n                <feGaussianBlur stdDeviation={3} />\n              </filter>\n            </defs>\n            {[1, -1].map((dir) => (\n              <g key={dir}>\n                <path d={FRAME_D} pathLength={PL} fill=\"none\" stroke={`url(#omainfg-${uid})`}\n                  strokeWidth={14} strokeLinecap=\"butt\" filter={`url(#ofblur-${uid})`}\n                  strokeDasharray={`${headP} ${PL}`}\n                  strokeDashoffset={dir === 1 ? 0 : -(PL - headP)}\n                  opacity={0.6 * rimGlow} />\n                <path d={FRAME_D} pathLength={PL} fill=\"none\" stroke={`url(#omainfg-${uid})`}\n                  strokeWidth={3.5} strokeLinecap=\"butt\"\n                  strokeDasharray={`${headP} ${PL}`}\n                  strokeDashoffset={dir === 1 ? 0 : -(PL - headP)}\n                  opacity={0.95 * frameLine} />\n                {trace < 1 && (\n                  <path d={FRAME_D} pathLength={PL} fill=\"none\" stroke=\"#ffffff\"\n                    strokeWidth={6} strokeLinecap=\"round\" filter={`url(#ofblur2-${uid})`}\n                    strokeDasharray={`8 ${PL}`}\n                    strokeDashoffset={dir === 1 ? -(Math.max(0, headP - 8)) : -(PL - headP)}\n                    opacity={0.95} />\n                )}\n              </g>\n            ))}\n          </svg>\n        </div>\n      </div>\n    </AbsoluteFill>\n  );\n};\n\n\n"
}