@anker-in/headless-ui 1.0.10-temp-09034 → 1.0.10-temp-09036

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.
@@ -1,2 +1,2 @@
1
- "use strict";"use client";var C=Object.create;var w=Object.defineProperty;var j=Object.getOwnPropertyDescriptor;var q=Object.getOwnPropertyNames;var F=Object.getPrototypeOf,K=Object.prototype.hasOwnProperty;var U=(e,t)=>{for(var i in t)w(e,i,{get:t[i],enumerable:!0})},M=(e,t,i,m)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of q(t))!K.call(e,o)&&o!==i&&w(e,o,{get:()=>t[o],enumerable:!(m=j(t,o))||m.enumerable});return e};var _=(e,t,i)=>(i=e!=null?C(F(e)):{},M(t||!e||!e.__esModule?w(i,"default",{value:e,enumerable:!0}):i,e)),G=e=>M(w({},"__esModule",{value:!0}),e);var Q={};U(Q,{default:()=>J});module.exports=G(Q);var a=require("react/jsx-runtime"),n=_(require("react")),s=require("gsap"),k=require("gsap/dist/SplitText"),L=require("gsap/dist/ScrollTrigger"),R=require("../../helpers/utils.js"),$=require("../../components/index.js"),D=require("../../shared/Styles.js"),O=require("../../hooks/useExposure.js"),I=require("../../shared/trackUrlRef.js"),A=require("react-intersection-observer");const b="link",x="title",S=n.default.forwardRef(({data:e,className:t},i)=>{const{title:m,caption:o,theme:E,extensions:T}=e,v=(0,n.useRef)(null),c=(0,n.useRef)(null),p=(0,n.useRef)(null),f=(0,n.useRef)(null),{ref:V,inView:z}=(0,A.useInView)();return(0,n.useImperativeHandle)(i,()=>v.current),(0,O.useExposure)(v,{componentType:b,componentName:x,componentTitle:e?.title}),(0,n.useEffect)(()=>{if(s.gsap.registerPlugin(k.SplitText,L.ScrollTrigger),!c.current)return;let l=null,g=null,d=null;const H=()=>{if(p.current){try{p.current.revert()}catch{}p.current=null}if(l){try{l.scrollTrigger&&l.scrollTrigger.kill()}catch{}try{l.kill()}catch{}l=null}if(f.current){try{f.current.kill()}catch{}f.current=null}};function y(){const r=c.current;if(!r)return;H(),p.current=new k.SplitText(r,{type:"words",wordsClass:"word"});const u=p.current.words,N=u.length;if(!N)return;s.gsap.set(u,{opacity:0}),l=s.gsap.timeline({scrollTrigger:{trigger:r,start:"top bottom",end:"bottom top",scrub:!0,onLeave:()=>{s.gsap.set(u,{opacity:0,clearProps:"opacity"})},onLeaveBack:()=>{s.gsap.set(u,{opacity:0,clearProps:"opacity"})},onKill:()=>{s.gsap.set(u,{opacity:1,clearProps:"opacity"})}}});const P=Math.min(1,N*.05+.6),B=P;l.to(u,{opacity:1,duration:1,ease:"none",stagger:{amount:P}}),l.to(u,{opacity:0,duration:1,ease:"none",stagger:{amount:B}}),f.current=l.scrollTrigger}y();const h=()=>{d&&window.clearTimeout(d),d=window.setTimeout(()=>{y(),L.ScrollTrigger.refresh()},100)};return window.addEventListener("resize",h),window.ResizeObserver&&c.current&&(g=new ResizeObserver(h),g.observe(c.current)),()=>{if(window.removeEventListener("resize",h),g&&g.disconnect(),d&&window.clearTimeout(d),H(),c.current){const r=c.current.querySelectorAll(".word");r&&r.length&&s.gsap.set(r,{opacity:1,clearProps:"opacity"})}}},[z]),(m||o)&&(0,a.jsxs)("div",{className:"mb-6 flex items-end justify-between overflow-hidden title-box",ref:v,children:[(0,a.jsx)("div",{ref:V,className:(0,R.cn)("space-y-4 flex-1",t,{"aiui-dark":E==="dark"}),children:(0,a.jsx)($.Heading,{ref:c,as:"h1",size:4,html:o||m})}),T?.textLink&&(0,a.jsxs)("a",{className:(0,R.cn)({"aiui-dark":E==="dark"},"flex items-center text-base font-[700] leading-[1.4] text-[#777] transition-all duration-[0.4s] hover:text-[#1D1D1F]"),href:(0,I.trackUrlRef)(T?.link,`${b}_${x}`),"data-headless-type-name":`${b}#${x}`,"data-headless-title-desc-button":`${m}#${o}`,children:[T?.textLink,(0,a.jsx)("svg",{width:"24",height:"24",className:"mb-[3px]",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",children:(0,a.jsx)("path",{className:"transition-all duration-[0.4s]",d:"M10.5 8L14.5 12L10.5 16",stroke:"#777","stroke-width":"1.5","stroke-linecap":"round"})})]})]})});S.displayName="Title";var J=(0,D.withLayout)(S);
1
+ "use strict";"use client";var O=Object.create;var u=Object.defineProperty;var Q=Object.getOwnPropertyDescriptor;var W=Object.getOwnPropertyNames;var X=Object.getPrototypeOf,Y=Object.prototype.hasOwnProperty;var Z=(t,e)=>{for(var n in e)u(t,n,{get:e[n],enumerable:!0})},N=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of W(e))!Y.call(t,i)&&i!==n&&u(t,i,{get:()=>e[i],enumerable:!(s=Q(e,i))||s.enumerable});return t};var tt=(t,e,n)=>(n=t!=null?O(X(t)):{},N(e||!t||!t.__esModule?u(n,"default",{value:t,enumerable:!0}):n,t)),et=t=>N(u({},"__esModule",{value:!0}),t);var nt={};Z(nt,{default:()=>rt});module.exports=et(nt);var o=require("react/jsx-runtime"),r=tt(require("react")),p=require("gsap"),k=require("gsap/dist/SplitText"),y=require("gsap/dist/ScrollTrigger"),H=require("../../helpers/utils.js"),D=require("../../components/index.js"),S=require("../../shared/Styles.js"),B=require("../../hooks/useExposure.js"),I=require("../../shared/trackUrlRef.js"),P=require("react-intersection-observer");const T="link",b="title",$=r.default.forwardRef(({data:t,className:e},n)=>{const{title:s,caption:i,theme:M,extensions:f}=t,d=(0,r.useRef)(null),l=(0,r.useRef)(null),a=(0,r.useRef)(null),h=(0,r.useRef)(null),{ref:V,inView:R}=(0,P.useInView)();return(0,r.useImperativeHandle)(n,()=>d.current),(0,B.useExposure)(d,{componentType:T,componentName:b,componentTitle:t?.title}),(0,r.useEffect)(()=>{p.gsap.registerPlugin(k.SplitText,y.ScrollTrigger);function z(){if(!l.current)return;const C=l.current?.clientHeight||80;a.current=new k.SplitText(l.current,{type:"words",wordsClass:"word"});const g=a.current.words;p.gsap.set(g,{opacity:0}),h.current=y.ScrollTrigger.create({trigger:l.current,start:"bottom bottom-=4%",end:`bottom+=${C*1.5+60}px bottom-=4%`,scrub:!0,onUpdate:it=>{const L=l.current;if(!L)return;const w=L.getBoundingClientRect(),F=window.innerHeight||document.documentElement.clientHeight,U=Math.max(w.top,0),j=Math.min(w.bottom,F),_=Math.max(0,j-U),q=w.height||1;let v=_/q;v=Math.max(0,Math.min(1,v));const A=v,c=g.length;if(!c)return;const G=1/c,E=.5;for(let m=0;m<c;m++){const J=m/c*(1-E),K=G*(1+E);let x=(A-J)/K;x=Math.max(0,Math.min(x,1)),p.gsap.set(g[m],{opacity:x})}}})}return R&&z(),()=>{a.current&&a.current.revert(),h.current&&h.current.kill()}},[R]),(s||i)&&(0,o.jsxs)("div",{className:"mb-6 flex items-end justify-between overflow-hidden title-box",ref:d,children:[(0,o.jsx)("div",{ref:V,className:(0,H.cn)("space-y-4 flex-1",e,{"aiui-dark":M==="dark"}),children:(0,o.jsx)(D.Heading,{ref:l,as:"h1",size:4,html:i||s})}),f?.textLink&&(0,o.jsxs)("a",{className:(0,H.cn)({"aiui-dark":M==="dark"},"flex items-center text-base font-[700] leading-[1.4] text-[#777] transition-all duration-[0.4s] hover:text-[#1D1D1F]"),href:(0,I.trackUrlRef)(f?.link,`${T}_${b}`),"data-headless-type-name":`${T}#${b}`,"data-headless-title-desc-button":`${s}#${i}`,children:[f?.textLink,(0,o.jsx)("svg",{width:"24",height:"24",className:"mb-[3px]",xmlns:"http://www.w3.org/2000/svg",viewBox:"0 0 24 24",fill:"none",children:(0,o.jsx)("path",{className:"transition-all duration-[0.4s]",d:"M10.5 8L14.5 12L10.5 16",stroke:"#777","stroke-width":"1.5","stroke-linecap":"round"})})]})]})});$.displayName="Title";var rt=(0,S.withLayout)($);
2
2
  //# sourceMappingURL=index.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/biz-components/Title/index.tsx"],
4
- "sourcesContent": ["'use client'\nimport React, { useEffect, useRef, useImperativeHandle } from 'react'\nimport { gsap } from 'gsap'\nimport { SplitText } from 'gsap/dist/SplitText'\nimport { ScrollTrigger } from 'gsap/dist/ScrollTrigger'\nimport { cn } from '../../helpers/utils.js'\nimport { Heading } from '../../components/index.js'\nimport { withLayout } from '../../shared/Styles.js'\nimport type { TitleProps } from './types.js'\nimport { useExposure } from '../../hooks/useExposure.js'\nimport { trackUrlRef } from '../../shared/trackUrlRef.js'\nimport { useInView } from 'react-intersection-observer'\n\nconst componentType = 'link'\nconst componentName = 'title'\n\nconst Title = React.forwardRef<HTMLDivElement, TitleProps>(({ data, className }, ref) => {\n const { title, caption, theme, extensions } = data\n const innerRef = useRef<HTMLDivElement>(null)\n const titleRef = useRef<HTMLHeadingElement>(null)\n const splitTextInstance = useRef<SplitText | null>(null)\n const scrollTriggerRef = useRef<ScrollTrigger | null>(null)\n\n const { ref: inViewRef, inView } = useInView()\n\n useImperativeHandle(ref, () => innerRef.current as HTMLDivElement)\n\n useExposure(innerRef, {\n componentType,\n componentName,\n componentTitle: data?.title,\n })\n\n useEffect(() => {\n gsap.registerPlugin(SplitText, ScrollTrigger)\n\n if (!titleRef.current) return\n\n let tl: gsap.core.Timeline | null = null\n let resizeObserver: ResizeObserver | null = null\n let rebuildTimer: number | null = null\n\n const safeCleanup = () => {\n // revert SplitText if present\n if (splitTextInstance.current) {\n try {\n splitTextInstance.current.revert()\n } catch (e) {}\n splitTextInstance.current = null\n }\n\n // kill timeline & its scrollTrigger\n if (tl) {\n try {\n tl.scrollTrigger && tl.scrollTrigger.kill()\n } catch (e) {}\n try {\n tl.kill()\n } catch (e) {}\n tl = null\n }\n\n // kill stored single ScrollTrigger ref if any\n if (scrollTriggerRef.current) {\n try {\n scrollTriggerRef.current.kill()\n } catch (e) {}\n scrollTriggerRef.current = null\n }\n }\n\n function build() {\n const el = titleRef.current\n if (!el) return\n\n // cleanup any previous instances\n safeCleanup()\n\n // 1) split text\n splitTextInstance.current = new SplitText(el, {\n type: 'words',\n wordsClass: 'word',\n })\n const words = splitTextInstance.current.words\n const total = words.length\n if (!total) {\n // nothing to animate\n return\n }\n\n // Make sure initial state is invisible\n gsap.set(words, { opacity: 0 })\n\n // 2) choose robust start/end covering element crossing viewport\n // element enters when its top hits bottom of viewport, ends when its bottom hits top \u2014 full pass\n const start = 'top bottom'\n const end = 'bottom top'\n\n // 3) create timeline: first fade-in (0->1), then fade-out (1->0)\n // use scrub:true so ScrollTrigger maps scroll progress to tl progress\n tl = gsap.timeline({\n scrollTrigger: {\n trigger: el,\n start,\n end,\n scrub: true,\n // markers: true, // \u6253\u5F00\u8C03\u8BD5\uFF08\u5F00\u53D1\u65F6\u7528\uFF09\n onLeave: () => {\n // \u5411\u4E0B\u6EDA\u52A8\u5B8C\u5168\u79BB\u5F00\u533A\u95F4\uFF08\u5143\u7D20\u6EDA\u51FA\u5230\u4E0A\u65B9\uFF09\u65F6 -> \u4FDD\u6301\u900F\u660E\uFF08\u56E0\u4E3A\u6587\u672C\u5DF2\u79BB\u5F00\u89C6\u53E3\uFF09\n gsap.set(words, { opacity: 0, clearProps: 'opacity' })\n },\n onLeaveBack: () => {\n // \u5411\u4E0A\u6EDA\u52A8\u5B8C\u5168\u79BB\u5F00\u533A\u95F4\uFF08\u5143\u7D20\u6EDA\u51FA\u5230\u4E0B\u65B9\uFF09\u65F6 -> \u4E5F\u4FDD\u6301\u900F\u660E\n gsap.set(words, { opacity: 0, clearProps: 'opacity' })\n },\n onKill: () => {\n // trigger \u88AB kill\uFF08\u4F8B\u5982\u7EC4\u4EF6\u5378\u8F7D\u6216\u624B\u52A8 kill\uFF09\u65F6\uFF0C\u6062\u590D\u5230\u53EF\u89C1\u72B6\u6001\u4EE5\u514D\u6B8B\u7559\u9690\u85CF\n gsap.set(words, { opacity: 1, clearProps: 'opacity' })\n },\n },\n })\n\n // stagger \u914D\u7F6E\uFF1A\u4F60\u53EF\u4EE5\u8C03\u8282\u8FD9\u4E24\u4E2A\u6570\u503C\u6765\u63A7\u5236\u8282\u594F\n const staggerAmountIn = Math.min(1, total * 0.05 + 0.6) // \u8D8A\u591A\u5355\u8BCD\u9002\u5EA6\u6269\u5927\u5206\u5E03\n const staggerAmountOut = staggerAmountIn\n\n // \u7B2C\u4E00\u6BB5\uFF1Afade in\n tl.to(words, {\n opacity: 1,\n duration: 1,\n ease: 'none',\n stagger: { amount: staggerAmountIn },\n })\n\n // \u7B2C\u4E8C\u6BB5\uFF1Afade out\n tl.to(words, {\n opacity: 0,\n duration: 1,\n ease: 'none',\n stagger: { amount: staggerAmountOut },\n })\n\n // store ref for external cleanup if needed\n scrollTriggerRef.current = tl.scrollTrigger as ScrollTrigger\n }\n\n // build once when inView or always build to monitor scroll\n if (inView) {\n build()\n } else {\n // \u82E5\u4F60\u4EC5\u5728 inView \u65F6\u6784\u5EFA\uFF0C\u53EF\u6CE8\u91CA\u4E0B\u884C\uFF1B\u8FD9\u91CC\u5EFA\u8BAE\u5728 inView \u4E3A true \u65F6 build\n build()\n }\n\n // rebuild on resize / content changes (debounced)\n const debouncedRebuild = () => {\n if (rebuildTimer) window.clearTimeout(rebuildTimer)\n rebuildTimer = window.setTimeout(() => {\n build()\n ScrollTrigger.refresh()\n }, 100)\n }\n\n window.addEventListener('resize', debouncedRebuild)\n\n // ResizeObserver to catch font/content changes\n if (window.ResizeObserver && titleRef.current) {\n resizeObserver = new ResizeObserver(debouncedRebuild)\n resizeObserver.observe(titleRef.current)\n }\n\n // cleanup\n return () => {\n window.removeEventListener('resize', debouncedRebuild)\n if (resizeObserver) resizeObserver.disconnect()\n if (rebuildTimer) window.clearTimeout(rebuildTimer)\n\n safeCleanup()\n\n // final safety: ensure words visible to avoid leaving user with invisible text\n if (titleRef.current) {\n const words = titleRef.current.querySelectorAll('.word')\n if (words && words.length) {\n gsap.set(words, { opacity: 1, clearProps: 'opacity' })\n }\n }\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [inView])\n\n\n return (\n (title || caption) && (\n <div className=\"mb-6 flex items-end justify-between overflow-hidden title-box\" ref={innerRef}>\n <div ref={inViewRef} className={cn('space-y-4 flex-1', className, { 'aiui-dark': theme === 'dark' })}>\n <Heading ref={titleRef} as=\"h1\" size={4} html={caption || title} />\n </div>\n {extensions?.textLink && (\n <a\n className={cn(\n { 'aiui-dark': theme === 'dark' },\n 'flex items-center text-base font-[700] leading-[1.4] text-[#777] transition-all duration-[0.4s] hover:text-[#1D1D1F]'\n )}\n href={trackUrlRef(extensions?.link, `${componentType}_${componentName}`)}\n data-headless-type-name={`${componentType}#${componentName}`}\n data-headless-title-desc-button={`${title}#${caption}`}\n >\n {extensions?.textLink}\n <svg\n width=\"24\"\n height=\"24\"\n className=\"mb-[3px]\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <path\n className=\"transition-all duration-[0.4s]\"\n d=\"M10.5 8L14.5 12L10.5 16\"\n stroke=\"#777\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n ></path>\n </svg>\n </a>\n )}\n </div>\n )\n )\n})\n\nTitle.displayName = 'Title'\n\nexport default withLayout(Title)\n"],
5
- "mappings": "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",
6
- "names": ["Title_exports", "__export", "Title_default", "__toCommonJS", "import_jsx_runtime", "import_react", "import_gsap", "import_SplitText", "import_ScrollTrigger", "import_utils", "import_components", "import_Styles", "import_useExposure", "import_trackUrlRef", "import_react_intersection_observer", "componentType", "componentName", "Title", "React", "data", "className", "ref", "title", "caption", "theme", "extensions", "innerRef", "titleRef", "splitTextInstance", "scrollTriggerRef", "inViewRef", "inView", "tl", "resizeObserver", "rebuildTimer", "safeCleanup", "build", "el", "words", "total", "staggerAmountIn", "staggerAmountOut", "debouncedRebuild"]
4
+ "sourcesContent": ["'use client'\nimport React, { useEffect, useRef, useImperativeHandle } from 'react'\nimport { gsap } from 'gsap'\nimport { SplitText } from 'gsap/dist/SplitText'\nimport { ScrollTrigger } from 'gsap/dist/ScrollTrigger'\nimport { cn } from '../../helpers/utils.js'\nimport { Heading } from '../../components/index.js'\nimport { withLayout } from '../../shared/Styles.js'\nimport type { TitleProps } from './types.js'\nimport { useExposure } from '../../hooks/useExposure.js'\nimport { trackUrlRef } from '../../shared/trackUrlRef.js'\nimport { useInView } from 'react-intersection-observer'\n\nconst componentType = 'link'\nconst componentName = 'title'\n\nconst Title = React.forwardRef<HTMLDivElement, TitleProps>(({ data, className }, ref) => {\n const { title, caption, theme, extensions } = data\n const innerRef = useRef<HTMLDivElement>(null)\n const titleRef = useRef<HTMLHeadingElement>(null)\n const splitTextInstance = useRef<SplitText | null>(null)\n const scrollTriggerRef = useRef<ScrollTrigger | null>(null)\n\n const { ref: inViewRef, inView } = useInView()\n\n useImperativeHandle(ref, () => innerRef.current as HTMLDivElement)\n\n useExposure(innerRef, {\n componentType,\n componentName,\n componentTitle: data?.title,\n })\n\n useEffect(() => {\n gsap.registerPlugin(SplitText, ScrollTrigger)\n function gsapResize() {\n if (!titleRef.current) return\n const height = titleRef.current?.clientHeight || 80\n splitTextInstance.current = new SplitText(titleRef.current, {\n type: 'words',\n wordsClass: 'word',\n })\n const words = splitTextInstance.current.words\n gsap.set(words, { opacity: 0 })\n scrollTriggerRef.current = ScrollTrigger.create({\n trigger: titleRef.current,\n start: 'bottom bottom-=4%',\n end: `bottom+=${height * 1.5 + 60}px bottom-=4%`,\n scrub: true,\n onUpdate: (self: any) => {\n // 1) \u5148\u8BA1\u7B97\u5143\u7D20\u7684\u5B9E\u9645\u53EF\u89C1\u6BD4\u4F8B\uFF080..1\uFF09\n const el = titleRef.current\n if (!el) return\n\n const rect = el.getBoundingClientRect()\n const vh = window.innerHeight || document.documentElement.clientHeight\n\n // \u8BA1\u7B97\u4EA4\u96C6\u9AD8\u5EA6\uFF08\u5143\u7D20\u5728\u89C6\u53E3\u5185\u53EF\u89C1\u7684\u9AD8\u5EA6\uFF09\n const visibleTop = Math.max(rect.top, 0)\n const visibleBottom = Math.min(rect.bottom, vh)\n const visibleHeight = Math.max(0, visibleBottom - visibleTop)\n\n // \u4F46\u82E5\u5143\u7D20\u9AD8\u5EA6\u4E3A0\uFF08\u6216\u63A5\u8FD10\uFF09\u907F\u514D\u96640\n const elHeight = rect.height || 1\n let visibleFraction = visibleHeight / elHeight\n visibleFraction = Math.max(0, Math.min(1, visibleFraction)) // clamp\n\n // 2) \u7528 visibleFraction \u4EE3\u66FF self.progress \u53BB\u9A71\u52A8\u6BCF\u4E2A\u5355\u8BCD\u7684 opacity\n const progress = visibleFraction // 0..1\n const total = words.length\n if (!total) return\n const interval = 1 / total\n const overlap = 0.5\n\n // optional: \u7F13\u5B58 precomputed starts/width outside onUpdate for perf\n for (let i = 0; i < total; i++) {\n const start = (i / total) * (1 - overlap)\n const width = interval * (1 + overlap)\n let opacity = (progress - start) / width\n opacity = Math.max(0, Math.min(opacity, 1))\n gsap.set(words[i], { opacity })\n }\n },\n })\n }\n\n if (inView) {\n gsapResize()\n }\n\n return () => {\n splitTextInstance.current && splitTextInstance.current.revert()\n // ScrollTrigger.getAll().forEach((t: { kill: () => any }) => t.kill())\n scrollTriggerRef.current && scrollTriggerRef.current.kill()\n }\n }, [inView])\n\n return (\n (title || caption) && (\n <div className=\"mb-6 flex items-end justify-between overflow-hidden title-box\" ref={innerRef}>\n <div ref={inViewRef} className={cn('space-y-4 flex-1', className, { 'aiui-dark': theme === 'dark' })}>\n <Heading ref={titleRef} as=\"h1\" size={4} html={caption || title} />\n </div>\n {extensions?.textLink && (\n <a\n className={cn(\n { 'aiui-dark': theme === 'dark' },\n 'flex items-center text-base font-[700] leading-[1.4] text-[#777] transition-all duration-[0.4s] hover:text-[#1D1D1F]'\n )}\n href={trackUrlRef(extensions?.link, `${componentType}_${componentName}`)}\n data-headless-type-name={`${componentType}#${componentName}`}\n data-headless-title-desc-button={`${title}#${caption}`}\n >\n {extensions?.textLink}\n <svg\n width=\"24\"\n height=\"24\"\n className=\"mb-[3px]\"\n xmlns=\"http://www.w3.org/2000/svg\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n >\n <path\n className=\"transition-all duration-[0.4s]\"\n d=\"M10.5 8L14.5 12L10.5 16\"\n stroke=\"#777\"\n stroke-width=\"1.5\"\n stroke-linecap=\"round\"\n ></path>\n </svg>\n </a>\n )}\n </div>\n )\n )\n})\n\nTitle.displayName = 'Title'\n\nexport default withLayout(Title)\n"],
5
+ "mappings": "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",
6
+ "names": ["Title_exports", "__export", "Title_default", "__toCommonJS", "import_jsx_runtime", "import_react", "import_gsap", "import_SplitText", "import_ScrollTrigger", "import_utils", "import_components", "import_Styles", "import_useExposure", "import_trackUrlRef", "import_react_intersection_observer", "componentType", "componentName", "Title", "React", "data", "className", "ref", "title", "caption", "theme", "extensions", "innerRef", "titleRef", "splitTextInstance", "scrollTriggerRef", "inViewRef", "inView", "gsapResize", "height", "words", "self", "el", "rect", "vh", "visibleTop", "visibleBottom", "visibleHeight", "elHeight", "visibleFraction", "progress", "total", "interval", "overlap", "i", "start", "width", "opacity"]
7
7
  }