@design-llm/motion 1.0.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["../node_modules/react/cjs/react-jsx-runtime.production.js","../node_modules/react/cjs/react-jsx-runtime.development.js","../node_modules/react/jsx-runtime.js","../src/components/GlowCard.jsx","../src/components/BounceIn.jsx","../src/components/BlurText.jsx","../src/components/CircularText.jsx","../node_modules/gsap/SplitText.js","../node_modules/gsap/utils/strings.js","../node_modules/gsap/ScrambleTextPlugin.js","../src/components/ScrambledText.jsx","../src/components/FlowingDashedBox.jsx"],"sourcesContent":["/**\n * @license React\n * react-jsx-runtime.production.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\nvar REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\");\nfunction jsxProd(type, config, maybeKey) {\n var key = null;\n void 0 !== maybeKey && (key = \"\" + maybeKey);\n void 0 !== config.key && (key = \"\" + config.key);\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n config = maybeKey.ref;\n return {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n ref: void 0 !== config ? config : null,\n props: maybeKey\n };\n}\nexports.Fragment = REACT_FRAGMENT_TYPE;\nexports.jsx = jsxProd;\nexports.jsxs = jsxProd;\n","/**\n * @license React\n * react-jsx-runtime.development.js\n *\n * Copyright (c) Meta Platforms, Inc. and affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n\n\"use strict\";\n\"production\" !== process.env.NODE_ENV &&\n (function () {\n function getComponentNameFromType(type) {\n if (null == type) return null;\n if (\"function\" === typeof type)\n return type.$$typeof === REACT_CLIENT_REFERENCE\n ? null\n : type.displayName || type.name || null;\n if (\"string\" === typeof type) return type;\n switch (type) {\n case REACT_FRAGMENT_TYPE:\n return \"Fragment\";\n case REACT_PROFILER_TYPE:\n return \"Profiler\";\n case REACT_STRICT_MODE_TYPE:\n return \"StrictMode\";\n case REACT_SUSPENSE_TYPE:\n return \"Suspense\";\n case REACT_SUSPENSE_LIST_TYPE:\n return \"SuspenseList\";\n case REACT_ACTIVITY_TYPE:\n return \"Activity\";\n }\n if (\"object\" === typeof type)\n switch (\n (\"number\" === typeof type.tag &&\n console.error(\n \"Received an unexpected object in getComponentNameFromType(). This is likely a bug in React. Please file an issue.\"\n ),\n type.$$typeof)\n ) {\n case REACT_PORTAL_TYPE:\n return \"Portal\";\n case REACT_CONTEXT_TYPE:\n return type.displayName || \"Context\";\n case REACT_CONSUMER_TYPE:\n return (type._context.displayName || \"Context\") + \".Consumer\";\n case REACT_FORWARD_REF_TYPE:\n var innerType = type.render;\n type = type.displayName;\n type ||\n ((type = innerType.displayName || innerType.name || \"\"),\n (type = \"\" !== type ? \"ForwardRef(\" + type + \")\" : \"ForwardRef\"));\n return type;\n case REACT_MEMO_TYPE:\n return (\n (innerType = type.displayName || null),\n null !== innerType\n ? innerType\n : getComponentNameFromType(type.type) || \"Memo\"\n );\n case REACT_LAZY_TYPE:\n innerType = type._payload;\n type = type._init;\n try {\n return getComponentNameFromType(type(innerType));\n } catch (x) {}\n }\n return null;\n }\n function testStringCoercion(value) {\n return \"\" + value;\n }\n function checkKeyStringCoercion(value) {\n try {\n testStringCoercion(value);\n var JSCompiler_inline_result = !1;\n } catch (e) {\n JSCompiler_inline_result = !0;\n }\n if (JSCompiler_inline_result) {\n JSCompiler_inline_result = console;\n var JSCompiler_temp_const = JSCompiler_inline_result.error;\n var JSCompiler_inline_result$jscomp$0 =\n (\"function\" === typeof Symbol &&\n Symbol.toStringTag &&\n value[Symbol.toStringTag]) ||\n value.constructor.name ||\n \"Object\";\n JSCompiler_temp_const.call(\n JSCompiler_inline_result,\n \"The provided key is an unsupported type %s. This value must be coerced to a string before using it here.\",\n JSCompiler_inline_result$jscomp$0\n );\n return testStringCoercion(value);\n }\n }\n function getTaskName(type) {\n if (type === REACT_FRAGMENT_TYPE) return \"<>\";\n if (\n \"object\" === typeof type &&\n null !== type &&\n type.$$typeof === REACT_LAZY_TYPE\n )\n return \"<...>\";\n try {\n var name = getComponentNameFromType(type);\n return name ? \"<\" + name + \">\" : \"<...>\";\n } catch (x) {\n return \"<...>\";\n }\n }\n function getOwner() {\n var dispatcher = ReactSharedInternals.A;\n return null === dispatcher ? null : dispatcher.getOwner();\n }\n function UnknownOwner() {\n return Error(\"react-stack-top-frame\");\n }\n function hasValidKey(config) {\n if (hasOwnProperty.call(config, \"key\")) {\n var getter = Object.getOwnPropertyDescriptor(config, \"key\").get;\n if (getter && getter.isReactWarning) return !1;\n }\n return void 0 !== config.key;\n }\n function defineKeyPropWarningGetter(props, displayName) {\n function warnAboutAccessingKey() {\n specialPropKeyWarningShown ||\n ((specialPropKeyWarningShown = !0),\n console.error(\n \"%s: `key` is not a prop. Trying to access it will result in `undefined` being returned. If you need to access the same value within the child component, you should pass it as a different prop. (https://react.dev/link/special-props)\",\n displayName\n ));\n }\n warnAboutAccessingKey.isReactWarning = !0;\n Object.defineProperty(props, \"key\", {\n get: warnAboutAccessingKey,\n configurable: !0\n });\n }\n function elementRefGetterWithDeprecationWarning() {\n var componentName = getComponentNameFromType(this.type);\n didWarnAboutElementRef[componentName] ||\n ((didWarnAboutElementRef[componentName] = !0),\n console.error(\n \"Accessing element.ref was removed in React 19. ref is now a regular prop. It will be removed from the JSX Element type in a future release.\"\n ));\n componentName = this.props.ref;\n return void 0 !== componentName ? componentName : null;\n }\n function ReactElement(type, key, props, owner, debugStack, debugTask) {\n var refProp = props.ref;\n type = {\n $$typeof: REACT_ELEMENT_TYPE,\n type: type,\n key: key,\n props: props,\n _owner: owner\n };\n null !== (void 0 !== refProp ? refProp : null)\n ? Object.defineProperty(type, \"ref\", {\n enumerable: !1,\n get: elementRefGetterWithDeprecationWarning\n })\n : Object.defineProperty(type, \"ref\", { enumerable: !1, value: null });\n type._store = {};\n Object.defineProperty(type._store, \"validated\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: 0\n });\n Object.defineProperty(type, \"_debugInfo\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: null\n });\n Object.defineProperty(type, \"_debugStack\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugStack\n });\n Object.defineProperty(type, \"_debugTask\", {\n configurable: !1,\n enumerable: !1,\n writable: !0,\n value: debugTask\n });\n Object.freeze && (Object.freeze(type.props), Object.freeze(type));\n return type;\n }\n function jsxDEVImpl(\n type,\n config,\n maybeKey,\n isStaticChildren,\n debugStack,\n debugTask\n ) {\n var children = config.children;\n if (void 0 !== children)\n if (isStaticChildren)\n if (isArrayImpl(children)) {\n for (\n isStaticChildren = 0;\n isStaticChildren < children.length;\n isStaticChildren++\n )\n validateChildKeys(children[isStaticChildren]);\n Object.freeze && Object.freeze(children);\n } else\n console.error(\n \"React.jsx: Static children should always be an array. You are likely explicitly calling React.jsxs or React.jsxDEV. Use the Babel transform instead.\"\n );\n else validateChildKeys(children);\n if (hasOwnProperty.call(config, \"key\")) {\n children = getComponentNameFromType(type);\n var keys = Object.keys(config).filter(function (k) {\n return \"key\" !== k;\n });\n isStaticChildren =\n 0 < keys.length\n ? \"{key: someKey, \" + keys.join(\": ..., \") + \": ...}\"\n : \"{key: someKey}\";\n didWarnAboutKeySpread[children + isStaticChildren] ||\n ((keys =\n 0 < keys.length ? \"{\" + keys.join(\": ..., \") + \": ...}\" : \"{}\"),\n console.error(\n 'A props object containing a \"key\" prop is being spread into JSX:\\n let props = %s;\\n <%s {...props} />\\nReact keys must be passed directly to JSX without using spread:\\n let props = %s;\\n <%s key={someKey} {...props} />',\n isStaticChildren,\n children,\n keys,\n children\n ),\n (didWarnAboutKeySpread[children + isStaticChildren] = !0));\n }\n children = null;\n void 0 !== maybeKey &&\n (checkKeyStringCoercion(maybeKey), (children = \"\" + maybeKey));\n hasValidKey(config) &&\n (checkKeyStringCoercion(config.key), (children = \"\" + config.key));\n if (\"key\" in config) {\n maybeKey = {};\n for (var propName in config)\n \"key\" !== propName && (maybeKey[propName] = config[propName]);\n } else maybeKey = config;\n children &&\n defineKeyPropWarningGetter(\n maybeKey,\n \"function\" === typeof type\n ? type.displayName || type.name || \"Unknown\"\n : type\n );\n return ReactElement(\n type,\n children,\n maybeKey,\n getOwner(),\n debugStack,\n debugTask\n );\n }\n function validateChildKeys(node) {\n isValidElement(node)\n ? node._store && (node._store.validated = 1)\n : \"object\" === typeof node &&\n null !== node &&\n node.$$typeof === REACT_LAZY_TYPE &&\n (\"fulfilled\" === node._payload.status\n ? isValidElement(node._payload.value) &&\n node._payload.value._store &&\n (node._payload.value._store.validated = 1)\n : node._store && (node._store.validated = 1));\n }\n function isValidElement(object) {\n return (\n \"object\" === typeof object &&\n null !== object &&\n object.$$typeof === REACT_ELEMENT_TYPE\n );\n }\n var React = require(\"react\"),\n REACT_ELEMENT_TYPE = Symbol.for(\"react.transitional.element\"),\n REACT_PORTAL_TYPE = Symbol.for(\"react.portal\"),\n REACT_FRAGMENT_TYPE = Symbol.for(\"react.fragment\"),\n REACT_STRICT_MODE_TYPE = Symbol.for(\"react.strict_mode\"),\n REACT_PROFILER_TYPE = Symbol.for(\"react.profiler\"),\n REACT_CONSUMER_TYPE = Symbol.for(\"react.consumer\"),\n REACT_CONTEXT_TYPE = Symbol.for(\"react.context\"),\n REACT_FORWARD_REF_TYPE = Symbol.for(\"react.forward_ref\"),\n REACT_SUSPENSE_TYPE = Symbol.for(\"react.suspense\"),\n REACT_SUSPENSE_LIST_TYPE = Symbol.for(\"react.suspense_list\"),\n REACT_MEMO_TYPE = Symbol.for(\"react.memo\"),\n REACT_LAZY_TYPE = Symbol.for(\"react.lazy\"),\n REACT_ACTIVITY_TYPE = Symbol.for(\"react.activity\"),\n REACT_CLIENT_REFERENCE = Symbol.for(\"react.client.reference\"),\n ReactSharedInternals =\n React.__CLIENT_INTERNALS_DO_NOT_USE_OR_WARN_USERS_THEY_CANNOT_UPGRADE,\n hasOwnProperty = Object.prototype.hasOwnProperty,\n isArrayImpl = Array.isArray,\n createTask = console.createTask\n ? console.createTask\n : function () {\n return null;\n };\n React = {\n react_stack_bottom_frame: function (callStackForError) {\n return callStackForError();\n }\n };\n var specialPropKeyWarningShown;\n var didWarnAboutElementRef = {};\n var unknownOwnerDebugStack = React.react_stack_bottom_frame.bind(\n React,\n UnknownOwner\n )();\n var unknownOwnerDebugTask = createTask(getTaskName(UnknownOwner));\n var didWarnAboutKeySpread = {};\n exports.Fragment = REACT_FRAGMENT_TYPE;\n exports.jsx = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !1,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n exports.jsxs = function (type, config, maybeKey) {\n var trackActualOwner =\n 1e4 > ReactSharedInternals.recentlyCreatedOwnerStacks++;\n return jsxDEVImpl(\n type,\n config,\n maybeKey,\n !0,\n trackActualOwner\n ? Error(\"react-stack-top-frame\")\n : unknownOwnerDebugStack,\n trackActualOwner ? createTask(getTaskName(type)) : unknownOwnerDebugTask\n );\n };\n })();\n","'use strict';\n\nif (process.env.NODE_ENV === 'production') {\n module.exports = require('./cjs/react-jsx-runtime.production.js');\n} else {\n module.exports = require('./cjs/react-jsx-runtime.development.js');\n}\n","/**\n[PURPOSE]: 流光边框悬浮卡片组件,展示动态渐变边框和悬浮动画效果\n[INPUT]: 无props,纯展示组件\n[OUTPUT]: 带有流光边框和悬浮动画的交互式卡片\n[POS]: 位于 /src/components,作为第一个动效示例组件\n\n[PROTOCOL]:\n1. 一旦本文件逻辑变更,必须同步更新此 Header。\n2. 更新后必须上浮检查 /src/components/.folder.md 的描述是否依然准确。\n*/\n\nimport { motion } from 'framer-motion';\n\nconst GlowCard = () => {\n return (\n <motion.div\n className=\"relative w-72 h-96 rounded-2xl p-[2px] cursor-pointer group\"\n style={{\n background: 'linear-gradient(90deg, #667eea 0%, #764ba2 50%, #f093fb 100%)',\n backgroundSize: '200% 100%',\n }}\n animate={{\n backgroundPosition: ['0% 50%', '100% 50%', '0% 50%'],\n }}\n transition={{\n duration: 3,\n repeat: Infinity,\n ease: 'linear',\n }}\n whileHover={{\n scale: 1.05,\n y: -10,\n }}\n >\n {/* Inner Card */}\n <div className=\"w-full h-full bg-gray-900 rounded-2xl flex flex-col items-center justify-center p-8 relative overflow-hidden\">\n {/* Glow Effect */}\n <div className=\"absolute inset-0 bg-gradient-to-br from-indigo-500/20 via-transparent to-purple-500/20 opacity-0 group-hover:opacity-100 transition-opacity duration-500\" />\n \n {/* Content */}\n <div className=\"relative z-10 text-center\">\n <div className=\"w-20 h-20 mx-auto mb-6 rounded-full bg-gradient-to-br from-indigo-400 to-purple-500 flex items-center justify-center text-4xl animate-float\">\n ✨\n </div>\n <h4 className=\"text-2xl font-bold text-white mb-3\">流光卡片</h4>\n <p className=\"text-gray-400 text-sm leading-relaxed\">\n 悬停查看动态效果\n <br />\n 渐变边框 + 浮动动画\n </p>\n </div>\n\n {/* Bottom Decoration */}\n <div className=\"absolute bottom-0 left-0 right-0 h-1 bg-gradient-to-r from-transparent via-indigo-500 to-transparent opacity-50\" />\n </div>\n </motion.div>\n );\n};\n\n// 组件源代码字符串(用于代码展示)\nexport const glowCardCode = `import { motion } from 'framer-motion';\n\nconst GlowCard = () => {\n return (\n <motion.div\n className=\"relative w-72 h-96 rounded-2xl p-[2px] cursor-pointer group\"\n style={{\n background: 'linear-gradient(90deg, #667eea 0%, #764ba2 50%, #f093fb 100%)',\n backgroundSize: '200% 100%',\n }}\n animate={{\n backgroundPosition: ['0% 50%', '100% 50%', '0% 50%'],\n }}\n transition={{\n duration: 3,\n repeat: Infinity,\n ease: 'linear',\n }}\n whileHover={{\n scale: 1.05,\n y: -10,\n }}\n >\n <div className=\"w-full h-full bg-gray-900 rounded-2xl flex flex-col items-center justify-center p-8 relative overflow-hidden\">\n <div className=\"absolute inset-0 bg-gradient-to-br from-indigo-500/20 via-transparent to-purple-500/20 opacity-0 group-hover:opacity-100 transition-opacity duration-500\" />\n \n <div className=\"relative z-10 text-center\">\n <div className=\"w-20 h-20 mx-auto mb-6 rounded-full bg-gradient-to-br from-indigo-400 to-purple-500 flex items-center justify-center text-4xl animate-float\">\n ✨\n </div>\n <h4 className=\"text-2xl font-bold text-white mb-3\">流光卡片</h4>\n <p className=\"text-gray-400 text-sm leading-relaxed\">\n 悬停查看动态效果\n <br />\n 渐变边框 + 浮动动画\n </p>\n </div>\n\n <div className=\"absolute bottom-0 left-0 right-0 h-1 bg-gradient-to-r from-transparent via-indigo-500 to-transparent opacity-50\" />\n </div>\n </motion.div>\n );\n};\n\nexport default GlowCard;`;\n\nexport default GlowCard;\n","/**\n[PURPOSE]: 弹性入场动画组件,展示从下方滑入并弹跳的动画效果\n[INPUT]: 无props,纯展示组件\n[OUTPUT]: 带有弹性入场动画的按钮组\n[POS]: 位于 /src/components,作为第二个动效示例组件\n\n[PROTOCOL]:\n1. 一旦本文件逻辑变更,必须同步更新此 Header。\n2. 更新后必须上浮检查 /src/components/.folder.md 的描述是否依然准确。\n*/\n\nimport { motion } from 'framer-motion';\n\nconst BounceIn = () => {\n const containerVariants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: 0.1,\n },\n },\n };\n\n const itemVariants = {\n hidden: { y: 50, opacity: 0 },\n visible: {\n y: 0,\n opacity: 1,\n transition: {\n type: 'spring',\n bounce: 0.5,\n duration: 0.8,\n },\n },\n };\n\n const buttons = ['开始使用', '查看文档', '示例代码', '关于我们'];\n\n return (\n <motion.div\n className=\"flex flex-wrap gap-4 justify-center\"\n variants={containerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n >\n {buttons.map((text, index) => (\n <motion.button\n key={index}\n variants={itemVariants}\n whileHover={{ scale: 1.05 }}\n whileTap={{ scale: 0.95 }}\n className=\"px-6 py-3 bg-gradient-to-r from-pink-500 to-orange-500 text-white font-semibold rounded-lg shadow-lg hover:shadow-xl transition-shadow\"\n >\n {text}\n </motion.button>\n ))}\n </motion.div>\n );\n};\n\nexport const bounceInCode = `import { motion } from 'framer-motion';\n\nconst BounceIn = () => {\n const containerVariants = {\n hidden: { opacity: 0 },\n visible: {\n opacity: 1,\n transition: {\n staggerChildren: 0.1,\n },\n },\n };\n\n const itemVariants = {\n hidden: { y: 50, opacity: 0 },\n visible: {\n y: 0,\n opacity: 1,\n transition: {\n type: 'spring',\n bounce: 0.5,\n duration: 0.8,\n },\n },\n };\n\n const buttons = ['开始使用', '查看文档', '示例代码', '关于我们'];\n\n return (\n <motion.div\n className=\"flex flex-wrap gap-4 justify-center\"\n variants={containerVariants}\n initial=\"hidden\"\n animate=\"visible\"\n >\n {buttons.map((text, index) => (\n <motion.button\n key={index}\n variants={itemVariants}\n whileHover={{ scale: 1.05 }}\n whileTap={{ scale: 0.95 }}\n className=\"px-6 py-3 bg-gradient-to-r from-pink-500 to-orange-500 text-white font-semibold rounded-lg shadow-lg hover:shadow-xl transition-shadow\"\n >\n {text}\n </motion.button>\n ))}\n </motion.div>\n );\n};\n\nexport default BounceIn;`;\n\nexport default BounceIn;\n","/**\n[PURPOSE]: 模糊文本动画组件,文字从模糊到清晰逐个显示\n[INPUT]: (text, delay, animateBy, direction, etc.) - 文本内容、延迟、动画方式、方向等配置\n[OUTPUT]: 带有模糊渐显动画的文本组件\n[POS]: 位于 /src/components,作为文本动画示例组件\n\n[PROTOCOL]:\n1. 一旦本文件逻辑变更,必须同步更新此 Header。\n2. 更新后必须上浮检查 /src/components/.folder.md 的描述是否依然准确。\n*/\n\nimport { motion } from 'framer-motion';\nimport { useEffect, useRef, useState, useMemo } from 'react';\n\nconst buildKeyframes = (from, steps) => {\n const keys = new Set([...Object.keys(from), ...steps.flatMap(s => Object.keys(s))]);\n\n const keyframes = {};\n keys.forEach(k => {\n keyframes[k] = [from[k], ...steps.map(s => s[k])];\n });\n return keyframes;\n};\n\nconst BlurText = ({\n text = '',\n delay = 200,\n className = '',\n animateBy = 'words',\n direction = 'top',\n threshold = 0.1,\n rootMargin = '0px',\n animationFrom,\n animationTo,\n easing = t => t,\n onAnimationComplete,\n stepDuration = 0.35\n}) => {\n const elements = animateBy === 'words' ? text.split(' ') : text.split('');\n const [inView, setInView] = useState(false);\n const ref = useRef(null);\n\n useEffect(() => {\n if (!ref.current) return;\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setInView(true);\n observer.unobserve(ref.current);\n }\n },\n { threshold, rootMargin }\n );\n observer.observe(ref.current);\n return () => observer.disconnect();\n }, [threshold, rootMargin]);\n\n const defaultFrom = useMemo(\n () =>\n direction === 'top' ? { filter: 'blur(10px)', opacity: 0, y: -50 } : { filter: 'blur(10px)', opacity: 0, y: 50 },\n [direction]\n );\n\n const defaultTo = useMemo(\n () => [\n {\n filter: 'blur(5px)',\n opacity: 0.5,\n y: direction === 'top' ? 5 : -5\n },\n { filter: 'blur(0px)', opacity: 1, y: 0 }\n ],\n [direction]\n );\n\n const fromSnapshot = animationFrom ?? defaultFrom;\n const toSnapshots = animationTo ?? defaultTo;\n\n const stepCount = toSnapshots.length + 1;\n const totalDuration = stepDuration * (stepCount - 1);\n const times = Array.from({ length: stepCount }, (_, i) => (stepCount === 1 ? 0 : i / (stepCount - 1)));\n\n return (\n <p ref={ref} className={`blur-text ${className} flex flex-wrap`}>\n {elements.map((segment, index) => {\n const animateKeyframes = buildKeyframes(fromSnapshot, toSnapshots);\n\n const spanTransition = {\n duration: totalDuration,\n times,\n delay: (index * delay) / 1000\n };\n spanTransition.ease = easing;\n\n return (\n <motion.span\n className=\"inline-block will-change-[transform,filter,opacity]\"\n key={index}\n initial={fromSnapshot}\n animate={inView ? animateKeyframes : fromSnapshot}\n transition={spanTransition}\n onAnimationComplete={index === elements.length - 1 ? onAnimationComplete : undefined}\n >\n {segment === ' ' ? '\\u00A0' : segment}\n {animateBy === 'words' && index < elements.length - 1 && '\\u00A0'}\n </motion.span>\n );\n })}\n </p>\n );\n};\n\n// 示例组件用于展示\nconst BlurTextDemo = () => {\n return (\n <div className=\"space-y-8 max-w-2xl\">\n <BlurText\n text=\"Isn't this so cool?!\"\n className=\"text-4xl font-bold text-white\"\n delay={100}\n animateBy=\"words\"\n direction=\"top\"\n />\n <BlurText\n text=\"逐字显示的中文文本动画效果\"\n className=\"text-3xl font-semibold text-indigo-400\"\n delay={50}\n animateBy=\"characters\"\n direction=\"top\"\n />\n </div>\n );\n};\n\n// 组件源代码字符串\nexport const blurTextCode = `import { motion } from 'framer-motion';\nimport { useEffect, useRef, useState, useMemo } from 'react';\n\nconst buildKeyframes = (from, steps) => {\n const keys = new Set([...Object.keys(from), ...steps.flatMap(s => Object.keys(s))]);\n\n const keyframes = {};\n keys.forEach(k => {\n keyframes[k] = [from[k], ...steps.map(s => s[k])];\n });\n return keyframes;\n};\n\nconst BlurText = ({\n text = '',\n delay = 200,\n className = '',\n animateBy = 'words',\n direction = 'top',\n threshold = 0.1,\n rootMargin = '0px',\n animationFrom,\n animationTo,\n easing = t => t,\n onAnimationComplete,\n stepDuration = 0.35\n}) => {\n const elements = animateBy === 'words' ? text.split(' ') : text.split('');\n const [inView, setInView] = useState(false);\n const ref = useRef(null);\n\n useEffect(() => {\n if (!ref.current) return;\n const observer = new IntersectionObserver(\n ([entry]) => {\n if (entry.isIntersecting) {\n setInView(true);\n observer.unobserve(ref.current);\n }\n },\n { threshold, rootMargin }\n );\n observer.observe(ref.current);\n return () => observer.disconnect();\n }, [threshold, rootMargin]);\n\n const defaultFrom = useMemo(\n () =>\n direction === 'top' ? { filter: 'blur(10px)', opacity: 0, y: -50 } : { filter: 'blur(10px)', opacity: 0, y: 50 },\n [direction]\n );\n\n const defaultTo = useMemo(\n () => [\n {\n filter: 'blur(5px)',\n opacity: 0.5,\n y: direction === 'top' ? 5 : -5\n },\n { filter: 'blur(0px)', opacity: 1, y: 0 }\n ],\n [direction]\n );\n\n const fromSnapshot = animationFrom ?? defaultFrom;\n const toSnapshots = animationTo ?? defaultTo;\n\n const stepCount = toSnapshots.length + 1;\n const totalDuration = stepDuration * (stepCount - 1);\n const times = Array.from({ length: stepCount }, (_, i) => (stepCount === 1 ? 0 : i / (stepCount - 1)));\n\n return (\n <p ref={ref} className={\\`blur-text \\${className} flex flex-wrap\\`}>\n {elements.map((segment, index) => {\n const animateKeyframes = buildKeyframes(fromSnapshot, toSnapshots);\n\n const spanTransition = {\n duration: totalDuration,\n times,\n delay: (index * delay) / 1000\n };\n spanTransition.ease = easing;\n\n return (\n <motion.span\n className=\"inline-block will-change-[transform,filter,opacity]\"\n key={index}\n initial={fromSnapshot}\n animate={inView ? animateKeyframes : fromSnapshot}\n transition={spanTransition}\n onAnimationComplete={index === elements.length - 1 ? onAnimationComplete : undefined}\n >\n {segment === ' ' ? '\\\\u00A0' : segment}\n {animateBy === 'words' && index < elements.length - 1 && '\\\\u00A0'}\n </motion.span>\n );\n })}\n </p>\n );\n};\n\n// 使用示例\nconst Demo = () => (\n <div className=\"space-y-8\">\n <BlurText\n text=\"Isn't this so cool?!\"\n className=\"text-4xl font-bold text-white\"\n delay={100}\n animateBy=\"words\"\n />\n <BlurText\n text=\"逐字显示的中文文本动画效果\"\n className=\"text-3xl text-indigo-400\"\n delay={50}\n animateBy=\"characters\"\n />\n </div>\n);`;\n\nexport default BlurTextDemo;\n","/**\n[PURPOSE]: 圆形旋转文字组件,文字沿圆形路径排列并旋转\n[INPUT]: (text, spinDuration, onHover, className) - 文本内容、旋转时长、悬浮效果、自定义样式\n[OUTPUT]: 沿圆形路径排列并旋转的文字动画\n[POS]: 位于 /src/components,作为文本动画示例组件\n\n[PROTOCOL]:\n1. 一旦本文件逻辑变更,必须同步更新此 Header。\n2. 更新后必须上浮检查 /src/components/.folder.md 的描述是否依然准确。\n*/\n\nimport { useEffect } from 'react';\nimport { motion, useAnimation, useMotionValue } from 'framer-motion';\n\nconst getRotationTransition = (duration, from, loop = true) => ({\n from,\n to: from + 360,\n ease: 'linear',\n duration,\n type: 'tween',\n repeat: loop ? Infinity : 0\n});\n\nconst getTransition = (duration, from) => ({\n rotate: getRotationTransition(duration, from),\n scale: {\n type: 'spring',\n damping: 20,\n stiffness: 300\n }\n});\n\nconst CircularText = ({ text, spinDuration = 20, onHover = 'speedUp', className = '' }) => {\n const letters = Array.from(text);\n const controls = useAnimation();\n const rotation = useMotionValue(0);\n\n useEffect(() => {\n const start = rotation.get();\n controls.start({\n rotate: start + 360,\n scale: 1,\n transition: getTransition(spinDuration, start)\n });\n }, [spinDuration, text, onHover, controls, rotation]);\n\n const handleHoverStart = () => {\n const start = rotation.get();\n if (!onHover) return;\n\n let transitionConfig;\n let scaleVal = 1;\n\n switch (onHover) {\n case 'slowDown':\n transitionConfig = getTransition(spinDuration * 2, start);\n break;\n case 'speedUp':\n transitionConfig = getTransition(spinDuration / 4, start);\n break;\n case 'pause':\n transitionConfig = {\n rotate: { type: 'spring', damping: 20, stiffness: 300 },\n scale: { type: 'spring', damping: 20, stiffness: 300 }\n };\n scaleVal = 1;\n break;\n case 'goBonkers':\n transitionConfig = getTransition(spinDuration / 20, start);\n scaleVal = 0.8;\n break;\n default:\n transitionConfig = getTransition(spinDuration, start);\n }\n\n controls.start({\n rotate: start + 360,\n scale: scaleVal,\n transition: transitionConfig\n });\n };\n\n const handleHoverEnd = () => {\n const start = rotation.get();\n controls.start({\n rotate: start + 360,\n scale: 1,\n transition: getTransition(spinDuration, start)\n });\n };\n\n return (\n <motion.div\n className={`m-0 mx-auto rounded-full w-[200px] h-[200px] relative text-white font-black text-center cursor-pointer origin-center ${className}`}\n style={{ rotate: rotation }}\n initial={{ rotate: 0 }}\n animate={controls}\n onMouseEnter={handleHoverStart}\n onMouseLeave={handleHoverEnd}\n >\n {letters.map((letter, i) => {\n const rotationDeg = (360 / letters.length) * i;\n const factor = Math.PI / letters.length;\n const x = factor * i;\n const y = factor * i;\n const transform = `rotateZ(${rotationDeg}deg) translate3d(${x}px, ${y}px, 0)`;\n\n return (\n <span\n key={i}\n className=\"absolute inline-block inset-0 text-2xl transition-all duration-500 ease-[cubic-bezier(0,0,0,1)]\"\n style={{ transform, WebkitTransform: transform }}\n >\n {letter}\n </span>\n );\n })}\n </motion.div>\n );\n};\n\n// 示例组件用于展示\nconst CircularTextDemo = () => {\n return (\n <div className=\"flex flex-col items-center gap-12\">\n <div className=\"text-center space-y-4\">\n <CircularText\n text=\"REACT • FRAMER • MOTION • \"\n spinDuration={15}\n onHover=\"speedUp\"\n />\n <p className=\"text-gray-400 text-sm\">悬浮加速效果</p>\n </div>\n \n <div className=\"text-center space-y-4\">\n <CircularText\n text=\"TAILWIND • CSS • VITE • \"\n spinDuration={12}\n onHover=\"pause\"\n className=\"text-indigo-400\"\n />\n <p className=\"text-gray-400 text-sm\">悬浮暂停效果</p>\n </div>\n </div>\n );\n};\n\n// 组件源代码字符串\nexport const circularTextCode = `import { useEffect } from 'react';\nimport { motion, useAnimation, useMotionValue } from 'framer-motion';\n\nconst getRotationTransition = (duration, from, loop = true) => ({\n from,\n to: from + 360,\n ease: 'linear',\n duration,\n type: 'tween',\n repeat: loop ? Infinity : 0\n});\n\nconst getTransition = (duration, from) => ({\n rotate: getRotationTransition(duration, from),\n scale: {\n type: 'spring',\n damping: 20,\n stiffness: 300\n }\n});\n\nconst CircularText = ({ text, spinDuration = 20, onHover = 'speedUp', className = '' }) => {\n const letters = Array.from(text);\n const controls = useAnimation();\n const rotation = useMotionValue(0);\n\n useEffect(() => {\n const start = rotation.get();\n controls.start({\n rotate: start + 360,\n scale: 1,\n transition: getTransition(spinDuration, start)\n });\n }, [spinDuration, text, onHover, controls, rotation]);\n\n const handleHoverStart = () => {\n const start = rotation.get();\n if (!onHover) return;\n\n let transitionConfig;\n let scaleVal = 1;\n\n switch (onHover) {\n case 'slowDown':\n transitionConfig = getTransition(spinDuration * 2, start);\n break;\n case 'speedUp':\n transitionConfig = getTransition(spinDuration / 4, start);\n break;\n case 'pause':\n transitionConfig = {\n rotate: { type: 'spring', damping: 20, stiffness: 300 },\n scale: { type: 'spring', damping: 20, stiffness: 300 }\n };\n scaleVal = 1;\n break;\n case 'goBonkers':\n transitionConfig = getTransition(spinDuration / 20, start);\n scaleVal = 0.8;\n break;\n default:\n transitionConfig = getTransition(spinDuration, start);\n }\n\n controls.start({\n rotate: start + 360,\n scale: scaleVal,\n transition: transitionConfig\n });\n };\n\n const handleHoverEnd = () => {\n const start = rotation.get();\n controls.start({\n rotate: start + 360,\n scale: 1,\n transition: getTransition(spinDuration, start)\n });\n };\n\n return (\n <motion.div\n className={\\`m-0 mx-auto rounded-full w-[200px] h-[200px] relative text-white font-black text-center cursor-pointer origin-center \\${className}\\`}\n style={{ rotate: rotation }}\n initial={{ rotate: 0 }}\n animate={controls}\n onMouseEnter={handleHoverStart}\n onMouseLeave={handleHoverEnd}\n >\n {letters.map((letter, i) => {\n const rotationDeg = (360 / letters.length) * i;\n const factor = Math.PI / letters.length;\n const x = factor * i;\n const y = factor * i;\n const transform = \\`rotateZ(\\${rotationDeg}deg) translate3d(\\${x}px, \\${y}px, 0)\\`;\n\n return (\n <span\n key={i}\n className=\"absolute inline-block inset-0 text-2xl transition-all duration-500\"\n style={{ transform, WebkitTransform: transform }}\n >\n {letter}\n </span>\n );\n })}\n </motion.div>\n );\n};\n\n// 使用示例\nconst Demo = () => (\n <div className=\"flex gap-8\">\n <CircularText text=\"REACT • MOTION • \" onHover=\"speedUp\" />\n <CircularText text=\"TAILWIND • CSS • \" onHover=\"pause\" />\n </div>\n);`;\n\nexport default CircularTextDemo;\n","/*!\n * SplitText 3.14.2\n * https://gsap.com\n *\n * @license Copyright 2025, GreenSock. All rights reserved. Subject to the terms at https://gsap.com/standard-license.\n * @author: Jack Doyle\n */\n\nlet gsap, _fonts, _splitProp = typeof Symbol === \"function\" ? Symbol() : \"_split\", _coreInitted, _initIfNecessary = () => _coreInitted || SplitText.register(window.gsap), _charSegmenter = typeof Intl !== \"undefined\" && \"Segmenter\" in Intl ? new Intl.Segmenter() : 0, _toArray = (r) => typeof r === \"string\" ? _toArray(document.querySelectorAll(r)) : \"length\" in r ? Array.from(r).reduce((acc, cur) => {\n typeof cur === \"string\" ? acc.push(..._toArray(cur)) : acc.push(cur);\n return acc;\n}, []) : [r], _elements = (targets) => _toArray(targets).filter((e) => e instanceof HTMLElement), _emptyArray = [], _context = function() {\n}, _defaultContext = { add: (f) => f() }, _spacesRegEx = /\\s+/g, _emojiSafeRegEx = new RegExp(\"\\\\p{RI}\\\\p{RI}|\\\\p{Emoji}(\\\\p{EMod}|\\\\u{FE0F}\\\\u{20E3}?|[\\\\u{E0020}-\\\\u{E007E}]+\\\\u{E007F})?(\\\\u{200D}\\\\p{Emoji}(\\\\p{EMod}|\\\\u{FE0F}\\\\u{20E3}?|[\\\\u{E0020}-\\\\u{E007E}]+\\\\u{E007F})?)*|.\", \"gu\"), _emptyBounds = { left: 0, top: 0, width: 0, height: 0 }, _findNextValidBounds = (allBounds, startIndex) => {\n while (++startIndex < allBounds.length && allBounds[startIndex] === _emptyBounds) {\n }\n return allBounds[startIndex] || _emptyBounds;\n}, _revertOriginal = ({ element, html, ariaL, ariaH }) => {\n element.innerHTML = html;\n ariaL ? element.setAttribute(\"aria-label\", ariaL) : element.removeAttribute(\"aria-label\");\n ariaH ? element.setAttribute(\"aria-hidden\", ariaH) : element.removeAttribute(\"aria-hidden\");\n}, _stretchToFitSpecialChars = (collection, specialCharsRegEx) => {\n if (specialCharsRegEx) {\n let charsFound = new Set(collection.join(\"\").match(specialCharsRegEx) || _emptyArray), i = collection.length, slots, word, char, combined;\n if (charsFound.size) {\n while (--i > -1) {\n word = collection[i];\n for (char of charsFound) {\n if (char.startsWith(word) && char.length > word.length) {\n slots = 0;\n combined = word;\n while (char.startsWith(combined += collection[i + ++slots]) && combined.length < char.length) {\n }\n if (slots && combined.length === char.length) {\n collection[i] = char;\n collection.splice(i + 1, slots);\n break;\n }\n }\n }\n }\n }\n }\n return collection;\n}, _disallowInline = (element) => window.getComputedStyle(element).display === \"inline\" && (element.style.display = \"inline-block\"), _insertNodeBefore = (newChild, parent, existingChild) => parent.insertBefore(typeof newChild === \"string\" ? document.createTextNode(newChild) : newChild, existingChild), _getWrapper = (type, config, collection) => {\n let className = config[type + \"sClass\"] || \"\", { tag = \"div\", aria = \"auto\", propIndex = false } = config, display = type === \"line\" ? \"block\" : \"inline-block\", incrementClass = className.indexOf(\"++\") > -1, wrapper = (text) => {\n let el = document.createElement(tag), i = collection.length + 1;\n className && (el.className = className + (incrementClass ? \" \" + className + i : \"\"));\n propIndex && el.style.setProperty(\"--\" + type, i + \"\");\n aria !== \"none\" && el.setAttribute(\"aria-hidden\", \"true\");\n if (tag !== \"span\") {\n el.style.position = \"relative\";\n el.style.display = display;\n }\n el.textContent = text;\n collection.push(el);\n return el;\n };\n incrementClass && (className = className.replace(\"++\", \"\"));\n wrapper.collection = collection;\n return wrapper;\n}, _getLineWrapper = (element, nodes, config, collection) => {\n let lineWrapper = _getWrapper(\"line\", config, collection), textAlign = window.getComputedStyle(element).textAlign || \"left\";\n return (startIndex, endIndex) => {\n let newLine = lineWrapper(\"\");\n newLine.style.textAlign = textAlign;\n element.insertBefore(newLine, nodes[startIndex]);\n for (; startIndex < endIndex; startIndex++) {\n newLine.appendChild(nodes[startIndex]);\n }\n newLine.normalize();\n };\n}, _splitWordsAndCharsRecursively = (element, config, wordWrapper, charWrapper, prepForCharsOnly, deepSlice, ignore, charSplitRegEx, specialCharsRegEx, isNested) => {\n var _a;\n let nodes = Array.from(element.childNodes), i = 0, { wordDelimiter, reduceWhiteSpace = true, prepareText } = config, elementBounds = element.getBoundingClientRect(), lastBounds = elementBounds, isPreformatted = !reduceWhiteSpace && window.getComputedStyle(element).whiteSpace.substring(0, 3) === \"pre\", ignoredPreviousSibling = 0, wordsCollection = wordWrapper.collection, wordDelimIsNotSpace, wordDelimString, wordDelimSplitter, curNode, words, curWordEl, startsWithSpace, endsWithSpace, j, bounds, curWordChars, clonedNode, curSubNode, tempSubNode, curTextContent, wordText, lastWordText, k;\n if (typeof wordDelimiter === \"object\") {\n wordDelimSplitter = wordDelimiter.delimiter || wordDelimiter;\n wordDelimString = wordDelimiter.replaceWith || \"\";\n } else {\n wordDelimString = wordDelimiter === \"\" ? \"\" : wordDelimiter || \" \";\n }\n wordDelimIsNotSpace = wordDelimString !== \" \";\n for (; i < nodes.length; i++) {\n curNode = nodes[i];\n if (curNode.nodeType === 3) {\n curTextContent = curNode.textContent || \"\";\n if (reduceWhiteSpace) {\n curTextContent = curTextContent.replace(_spacesRegEx, \" \");\n } else if (isPreformatted) {\n curTextContent = curTextContent.replace(/\\n/g, wordDelimString + \"\\n\");\n }\n prepareText && (curTextContent = prepareText(curTextContent, element));\n curNode.textContent = curTextContent;\n words = wordDelimString || wordDelimSplitter ? curTextContent.split(wordDelimSplitter || wordDelimString) : curTextContent.match(charSplitRegEx) || _emptyArray;\n lastWordText = words[words.length - 1];\n endsWithSpace = wordDelimIsNotSpace ? lastWordText.slice(-1) === \" \" : !lastWordText;\n lastWordText || words.pop();\n lastBounds = elementBounds;\n startsWithSpace = wordDelimIsNotSpace ? words[0].charAt(0) === \" \" : !words[0];\n startsWithSpace && _insertNodeBefore(\" \", element, curNode);\n words[0] || words.shift();\n _stretchToFitSpecialChars(words, specialCharsRegEx);\n deepSlice && isNested || (curNode.textContent = \"\");\n for (j = 1; j <= words.length; j++) {\n wordText = words[j - 1];\n if (!reduceWhiteSpace && isPreformatted && wordText.charAt(0) === \"\\n\") {\n (_a = curNode.previousSibling) == null ? void 0 : _a.remove();\n _insertNodeBefore(document.createElement(\"br\"), element, curNode);\n wordText = wordText.slice(1);\n }\n if (!reduceWhiteSpace && wordText === \"\") {\n _insertNodeBefore(wordDelimString, element, curNode);\n } else if (wordText === \" \") {\n element.insertBefore(document.createTextNode(\" \"), curNode);\n } else {\n wordDelimIsNotSpace && wordText.charAt(0) === \" \" && _insertNodeBefore(\" \", element, curNode);\n if (ignoredPreviousSibling && j === 1 && !startsWithSpace && wordsCollection.indexOf(ignoredPreviousSibling.parentNode) > -1) {\n curWordEl = wordsCollection[wordsCollection.length - 1];\n curWordEl.appendChild(document.createTextNode(charWrapper ? \"\" : wordText));\n } else {\n curWordEl = wordWrapper(charWrapper ? \"\" : wordText);\n _insertNodeBefore(curWordEl, element, curNode);\n ignoredPreviousSibling && j === 1 && !startsWithSpace && curWordEl.insertBefore(ignoredPreviousSibling, curWordEl.firstChild);\n }\n if (charWrapper) {\n curWordChars = _charSegmenter ? _stretchToFitSpecialChars([..._charSegmenter.segment(wordText)].map((s) => s.segment), specialCharsRegEx) : wordText.match(charSplitRegEx) || _emptyArray;\n for (k = 0; k < curWordChars.length; k++) {\n curWordEl.appendChild(curWordChars[k] === \" \" ? document.createTextNode(\" \") : charWrapper(curWordChars[k]));\n }\n }\n if (deepSlice && isNested) {\n curTextContent = curNode.textContent = curTextContent.substring(wordText.length + 1, curTextContent.length);\n bounds = curWordEl.getBoundingClientRect();\n if (bounds.top > lastBounds.top && bounds.left <= lastBounds.left) {\n clonedNode = element.cloneNode();\n curSubNode = element.childNodes[0];\n while (curSubNode && curSubNode !== curWordEl) {\n tempSubNode = curSubNode;\n curSubNode = curSubNode.nextSibling;\n clonedNode.appendChild(tempSubNode);\n }\n element.parentNode.insertBefore(clonedNode, element);\n prepForCharsOnly && _disallowInline(clonedNode);\n }\n lastBounds = bounds;\n }\n if (j < words.length || endsWithSpace) {\n _insertNodeBefore(j >= words.length ? \" \" : wordDelimIsNotSpace && wordText.slice(-1) === \" \" ? \" \" + wordDelimString : wordDelimString, element, curNode);\n }\n }\n }\n element.removeChild(curNode);\n ignoredPreviousSibling = 0;\n } else if (curNode.nodeType === 1) {\n if (ignore && ignore.indexOf(curNode) > -1) {\n wordsCollection.indexOf(curNode.previousSibling) > -1 && wordsCollection[wordsCollection.length - 1].appendChild(curNode);\n ignoredPreviousSibling = curNode;\n } else {\n _splitWordsAndCharsRecursively(curNode, config, wordWrapper, charWrapper, prepForCharsOnly, deepSlice, ignore, charSplitRegEx, specialCharsRegEx, true);\n ignoredPreviousSibling = 0;\n }\n prepForCharsOnly && _disallowInline(curNode);\n }\n }\n};\nconst _SplitText = class _SplitText {\n constructor(elements, config) {\n this.isSplit = false;\n _initIfNecessary();\n this.elements = _elements(elements);\n this.chars = [];\n this.words = [];\n this.lines = [];\n this.masks = [];\n this.vars = config;\n this.elements.forEach((el) => {\n var _a;\n config.overwrite !== false && ((_a = el[_splitProp]) == null ? void 0 : _a._data.orig.filter(({ element }) => element === el).forEach(_revertOriginal));\n el[_splitProp] = this;\n });\n this._split = () => this.isSplit && this.split(this.vars);\n let orig = [], timerId, checkWidths = () => {\n let i = orig.length, o;\n while (i--) {\n o = orig[i];\n let w = o.element.offsetWidth;\n if (w !== o.width) {\n o.width = w;\n this._split();\n return;\n }\n }\n };\n this._data = { orig, obs: typeof ResizeObserver !== \"undefined\" && new ResizeObserver(() => {\n clearTimeout(timerId);\n timerId = setTimeout(checkWidths, 200);\n }) };\n _context(this);\n this.split(config);\n }\n split(config) {\n (this._ctx || _defaultContext).add(() => {\n this.isSplit && this.revert();\n this.vars = config = config || this.vars || {};\n let { type = \"chars,words,lines\", aria = \"auto\", deepSlice = true, smartWrap, onSplit, autoSplit = false, specialChars, mask } = this.vars, splitLines = type.indexOf(\"lines\") > -1, splitCharacters = type.indexOf(\"chars\") > -1, splitWords = type.indexOf(\"words\") > -1, onlySplitCharacters = splitCharacters && !splitWords && !splitLines, specialCharsRegEx = specialChars && (\"push\" in specialChars ? new RegExp(\"(?:\" + specialChars.join(\"|\") + \")\", \"gu\") : specialChars), finalCharSplitRegEx = specialCharsRegEx ? new RegExp(specialCharsRegEx.source + \"|\" + _emojiSafeRegEx.source, \"gu\") : _emojiSafeRegEx, ignore = !!config.ignore && _elements(config.ignore), { orig, animTime, obs } = this._data, onSplitResult;\n if (splitCharacters || splitWords || splitLines) {\n this.elements.forEach((element, index) => {\n orig[index] = {\n element,\n html: element.innerHTML,\n ariaL: element.getAttribute(\"aria-label\"),\n ariaH: element.getAttribute(\"aria-hidden\")\n };\n aria === \"auto\" ? element.setAttribute(\"aria-label\", (element.textContent || \"\").trim()) : aria === \"hidden\" && element.setAttribute(\"aria-hidden\", \"true\");\n let chars = [], words = [], lines = [], charWrapper = splitCharacters ? _getWrapper(\"char\", config, chars) : null, wordWrapper = _getWrapper(\"word\", config, words), i, curWord, smartWrapSpan, nextSibling;\n _splitWordsAndCharsRecursively(element, config, wordWrapper, charWrapper, onlySplitCharacters, deepSlice && (splitLines || onlySplitCharacters), ignore, finalCharSplitRegEx, specialCharsRegEx, false);\n if (splitLines) {\n let nodes = _toArray(element.childNodes), wrapLine = _getLineWrapper(element, nodes, config, lines), curNode, toRemove = [], lineStartIndex = 0, allBounds = nodes.map((n) => n.nodeType === 1 ? n.getBoundingClientRect() : _emptyBounds), lastBounds = _emptyBounds, curBounds;\n for (i = 0; i < nodes.length; i++) {\n curNode = nodes[i];\n if (curNode.nodeType === 1) {\n if (curNode.nodeName === \"BR\") {\n if (!i || nodes[i - 1].nodeName !== \"BR\") {\n toRemove.push(curNode);\n wrapLine(lineStartIndex, i + 1);\n }\n lineStartIndex = i + 1;\n lastBounds = _findNextValidBounds(allBounds, i);\n } else {\n curBounds = allBounds[i];\n if (i && curBounds.top > lastBounds.top && curBounds.left < lastBounds.left + lastBounds.width - 1) {\n wrapLine(lineStartIndex, i);\n lineStartIndex = i;\n }\n lastBounds = curBounds;\n }\n }\n }\n lineStartIndex < i && wrapLine(lineStartIndex, i);\n toRemove.forEach((el) => {\n var _a;\n return (_a = el.parentNode) == null ? void 0 : _a.removeChild(el);\n });\n }\n if (!splitWords) {\n for (i = 0; i < words.length; i++) {\n curWord = words[i];\n if (splitCharacters || !curWord.nextSibling || curWord.nextSibling.nodeType !== 3) {\n if (smartWrap && !splitLines) {\n smartWrapSpan = document.createElement(\"span\");\n smartWrapSpan.style.whiteSpace = \"nowrap\";\n while (curWord.firstChild) {\n smartWrapSpan.appendChild(curWord.firstChild);\n }\n curWord.replaceWith(smartWrapSpan);\n } else {\n curWord.replaceWith(...curWord.childNodes);\n }\n } else {\n nextSibling = curWord.nextSibling;\n if (nextSibling && nextSibling.nodeType === 3) {\n nextSibling.textContent = (curWord.textContent || \"\") + (nextSibling.textContent || \"\");\n curWord.remove();\n }\n }\n }\n words.length = 0;\n element.normalize();\n }\n this.lines.push(...lines);\n this.words.push(...words);\n this.chars.push(...chars);\n });\n mask && this[mask] && this.masks.push(...this[mask].map((el) => {\n let maskEl = el.cloneNode();\n el.replaceWith(maskEl);\n maskEl.appendChild(el);\n el.className && (maskEl.className = el.className.trim() + \"-mask\");\n maskEl.style.overflow = \"clip\";\n return maskEl;\n }));\n }\n this.isSplit = true;\n _fonts && splitLines && (autoSplit ? _fonts.addEventListener(\"loadingdone\", this._split) : _fonts.status === \"loading\" && console.warn(\"SplitText called before fonts loaded\"));\n if ((onSplitResult = onSplit && onSplit(this)) && onSplitResult.totalTime) {\n this._data.anim = animTime ? onSplitResult.totalTime(animTime) : onSplitResult;\n }\n splitLines && autoSplit && this.elements.forEach((element, index) => {\n orig[index].width = element.offsetWidth;\n obs && obs.observe(element);\n });\n });\n return this;\n }\n kill() {\n let { obs } = this._data;\n obs && obs.disconnect();\n _fonts == null ? void 0 : _fonts.removeEventListener(\"loadingdone\", this._split);\n }\n revert() {\n var _a, _b;\n if (this.isSplit) {\n let { orig, anim } = this._data;\n this.kill();\n orig.forEach(_revertOriginal);\n this.chars.length = this.words.length = this.lines.length = orig.length = this.masks.length = 0;\n this.isSplit = false;\n if (anim) {\n this._data.animTime = anim.totalTime();\n anim.revert();\n }\n (_b = (_a = this.vars).onRevert) == null ? void 0 : _b.call(_a, this);\n }\n return this;\n }\n static create(elements, config) {\n return new _SplitText(elements, config);\n }\n static register(core) {\n gsap = gsap || core || window.gsap;\n if (gsap) {\n _toArray = gsap.utils.toArray;\n _context = gsap.core.context || _context;\n }\n if (!_coreInitted && window.innerWidth > 0) {\n _fonts = document.fonts;\n _coreInitted = true;\n }\n }\n};\n_SplitText.version = \"3.14.2\";\nlet SplitText = _SplitText;\n\nexport { SplitText, SplitText as default };\n","/*!\n * strings: 3.14.2\n * https://gsap.com\n *\n * Copyright 2008-2025, GreenSock. All rights reserved.\n * Subject to the terms at https://gsap.com/standard-license\n * @author: Jack Doyle, jack@greensock.com\n*/\n\n/* eslint-disable */\nvar _trimExp = /(?:^\\s+|\\s+$)/g;\nexport var emojiExp = /([\\uD800-\\uDBFF][\\uDC00-\\uDFFF](?:[\\u200D\\uFE0F][\\uD800-\\uDBFF][\\uDC00-\\uDFFF]){2,}|\\uD83D\\uDC69(?:\\u200D(?:(?:\\uD83D\\uDC69\\u200D)?\\uD83D\\uDC67|(?:\\uD83D\\uDC69\\u200D)?\\uD83D\\uDC66)|\\uD83C[\\uDFFB-\\uDFFF])|\\uD83D\\uDC69\\u200D(?:\\uD83D\\uDC69\\u200D)?\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|\\uD83D\\uDC69\\u200D(?:\\uD83D\\uDC69\\u200D)?\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83C\\uDFF3\\uFE0F\\u200D\\uD83C\\uDF08|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2642\\u2640]\\uFE0F|\\uD83D\\uDC69(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDD27\\uDCBC\\uDD2C\\uDE80\\uDE92])|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC6F\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3C-\\uDD3E\\uDDD6-\\uDDDF])\\u200D[\\u2640\\u2642]\\uFE0F|\\uD83C\\uDDFD\\uD83C\\uDDF0|\\uD83C\\uDDF6\\uD83C\\uDDE6|\\uD83C\\uDDF4\\uD83C\\uDDF2|\\uD83C\\uDDE9(?:\\uD83C[\\uDDEA\\uDDEC\\uDDEF\\uDDF0\\uDDF2\\uDDF4\\uDDFF])|\\uD83C\\uDDF7(?:\\uD83C[\\uDDEA\\uDDF4\\uDDF8\\uDDFA\\uDDFC])|\\uD83C\\uDDE8(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDEE\\uDDF0-\\uDDF5\\uDDF7\\uDDFA-\\uDDFF])|(?:\\u26F9|\\uD83C[\\uDFCC\\uDFCB]|\\uD83D\\uDD75)(?:\\uFE0F\\u200D[\\u2640\\u2642]|(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2640\\u2642])\\uFE0F|(?:\\uD83D\\uDC41\\uFE0F\\u200D\\uD83D\\uDDE8|\\uD83D\\uDC69(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2695\\u2696\\u2708]|\\uD83D\\uDC69\\u200D[\\u2695\\u2696\\u2708]|\\uD83D\\uDC68(?:(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D[\\u2695\\u2696\\u2708]|\\u200D[\\u2695\\u2696\\u2708]))\\uFE0F|\\uD83C\\uDDF2(?:\\uD83C[\\uDDE6\\uDDE8-\\uDDED\\uDDF0-\\uDDFF])|\\uD83D\\uDC69\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]|\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D(?:\\uD83D[\\uDC68\\uDC69])|\\uD83D[\\uDC68\\uDC69]))|\\uD83C\\uDDF1(?:\\uD83C[\\uDDE6-\\uDDE8\\uDDEE\\uDDF0\\uDDF7-\\uDDFB\\uDDFE])|\\uD83C\\uDDEF(?:\\uD83C[\\uDDEA\\uDDF2\\uDDF4\\uDDF5])|\\uD83C\\uDDED(?:\\uD83C[\\uDDF0\\uDDF2\\uDDF3\\uDDF7\\uDDF9\\uDDFA])|\\uD83C\\uDDEB(?:\\uD83C[\\uDDEE-\\uDDF0\\uDDF2\\uDDF4\\uDDF7])|[#\\*0-9]\\uFE0F\\u20E3|\\uD83C\\uDDE7(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEF\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9\\uDDFB\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDE6(?:\\uD83C[\\uDDE8-\\uDDEC\\uDDEE\\uDDF1\\uDDF2\\uDDF4\\uDDF6-\\uDDFA\\uDDFC\\uDDFD\\uDDFF])|\\uD83C\\uDDFF(?:\\uD83C[\\uDDE6\\uDDF2\\uDDFC])|\\uD83C\\uDDF5(?:\\uD83C[\\uDDE6\\uDDEA-\\uDDED\\uDDF0-\\uDDF3\\uDDF7-\\uDDF9\\uDDFC\\uDDFE])|\\uD83C\\uDDFB(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDEE\\uDDF3\\uDDFA])|\\uD83C\\uDDF3(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA-\\uDDEC\\uDDEE\\uDDF1\\uDDF4\\uDDF5\\uDDF7\\uDDFA\\uDDFF])|\\uD83C\\uDFF4\\uDB40\\uDC67\\uDB40\\uDC62(?:\\uDB40\\uDC77\\uDB40\\uDC6C\\uDB40\\uDC73|\\uDB40\\uDC73\\uDB40\\uDC63\\uDB40\\uDC74|\\uDB40\\uDC65\\uDB40\\uDC6E\\uDB40\\uDC67)\\uDB40\\uDC7F|\\uD83D\\uDC68(?:\\u200D(?:\\u2764\\uFE0F\\u200D(?:\\uD83D\\uDC8B\\u200D)?\\uD83D\\uDC68|(?:(?:\\uD83D[\\uDC68\\uDC69])\\u200D)?\\uD83D\\uDC66\\u200D\\uD83D\\uDC66|(?:(?:\\uD83D[\\uDC68\\uDC69])\\u200D)?\\uD83D\\uDC67\\u200D(?:\\uD83D[\\uDC66\\uDC67])|\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92])|(?:\\uD83C[\\uDFFB-\\uDFFF])\\u200D(?:\\uD83C[\\uDF3E\\uDF73\\uDF93\\uDFA4\\uDFA8\\uDFEB\\uDFED]|\\uD83D[\\uDCBB\\uDCBC\\uDD27\\uDD2C\\uDE80\\uDE92]))|\\uD83C\\uDDF8(?:\\uD83C[\\uDDE6-\\uDDEA\\uDDEC-\\uDDF4\\uDDF7-\\uDDF9\\uDDFB\\uDDFD-\\uDDFF])|\\uD83C\\uDDF0(?:\\uD83C[\\uDDEA\\uDDEC-\\uDDEE\\uDDF2\\uDDF3\\uDDF5\\uDDF7\\uDDFC\\uDDFE\\uDDFF])|\\uD83C\\uDDFE(?:\\uD83C[\\uDDEA\\uDDF9])|\\uD83C\\uDDEE(?:\\uD83C[\\uDDE8-\\uDDEA\\uDDF1-\\uDDF4\\uDDF6-\\uDDF9])|\\uD83C\\uDDF9(?:\\uD83C[\\uDDE6\\uDDE8\\uDDE9\\uDDEB-\\uDDED\\uDDEF-\\uDDF4\\uDDF7\\uDDF9\\uDDFB\\uDDFC\\uDDFF])|\\uD83C\\uDDEC(?:\\uD83C[\\uDDE6\\uDDE7\\uDDE9-\\uDDEE\\uDDF1-\\uDDF3\\uDDF5-\\uDDFA\\uDDFC\\uDDFE])|\\uD83C\\uDDFA(?:\\uD83C[\\uDDE6\\uDDEC\\uDDF2\\uDDF3\\uDDF8\\uDDFE\\uDDFF])|\\uD83C\\uDDEA(?:\\uD83C[\\uDDE6\\uDDE8\\uDDEA\\uDDEC\\uDDED\\uDDF7-\\uDDFA])|\\uD83C\\uDDFC(?:\\uD83C[\\uDDEB\\uDDF8])|(?:\\u26F9|\\uD83C[\\uDFCB\\uDFCC]|\\uD83D\\uDD75)(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:\\uD83C[\\uDFC3\\uDFC4\\uDFCA]|\\uD83D[\\uDC6E\\uDC71\\uDC73\\uDC77\\uDC81\\uDC82\\uDC86\\uDC87\\uDE45-\\uDE47\\uDE4B\\uDE4D\\uDE4E\\uDEA3\\uDEB4-\\uDEB6]|\\uD83E[\\uDD26\\uDD37-\\uDD39\\uDD3D\\uDD3E\\uDDD6-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u261D\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2\\uDFC7]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66\\uDC67\\uDC70\\uDC72\\uDC74-\\uDC76\\uDC78\\uDC7C\\uDC83\\uDC85\\uDCAA\\uDD74\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE4C\\uDE4F\\uDEC0\\uDECC]|\\uD83E[\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD30-\\uDD36\\uDDD1-\\uDDD5])(?:\\uD83C[\\uDFFB-\\uDFFF])|\\uD83D\\uDC68(?:\\u200D(?:(?:(?:\\uD83D[\\uDC68\\uDC69])\\u200D)?\\uD83D\\uDC67|(?:(?:\\uD83D[\\uDC68\\uDC69])\\u200D)?\\uD83D\\uDC66)|\\uD83C[\\uDFFB-\\uDFFF])|(?:[\\u261D\\u26F9\\u270A-\\u270D]|\\uD83C[\\uDF85\\uDFC2-\\uDFC4\\uDFC7\\uDFCA-\\uDFCC]|\\uD83D[\\uDC42\\uDC43\\uDC46-\\uDC50\\uDC66-\\uDC69\\uDC6E\\uDC70-\\uDC78\\uDC7C\\uDC81-\\uDC83\\uDC85-\\uDC87\\uDCAA\\uDD74\\uDD75\\uDD7A\\uDD90\\uDD95\\uDD96\\uDE45-\\uDE47\\uDE4B-\\uDE4F\\uDEA3\\uDEB4-\\uDEB6\\uDEC0\\uDECC]|\\uD83E[\\uDD18-\\uDD1C\\uDD1E\\uDD1F\\uDD26\\uDD30-\\uDD39\\uDD3D\\uDD3E\\uDDD1-\\uDDDD])(?:\\uD83C[\\uDFFB-\\uDFFF])?|(?:[\\u231A\\u231B\\u23E9-\\u23EC\\u23F0\\u23F3\\u25FD\\u25FE\\u2614\\u2615\\u2648-\\u2653\\u267F\\u2693\\u26A1\\u26AA\\u26AB\\u26BD\\u26BE\\u26C4\\u26C5\\u26CE\\u26D4\\u26EA\\u26F2\\u26F3\\u26F5\\u26FA\\u26FD\\u2705\\u270A\\u270B\\u2728\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2795-\\u2797\\u27B0\\u27BF\\u2B1B\\u2B1C\\u2B50\\u2B55]|\\uD83C[\\uDC04\\uDCCF\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE1A\\uDE2F\\uDE32-\\uDE36\\uDE38-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF20\\uDF2D-\\uDF35\\uDF37-\\uDF7C\\uDF7E-\\uDF93\\uDFA0-\\uDFCA\\uDFCF-\\uDFD3\\uDFE0-\\uDFF0\\uDFF4\\uDFF8-\\uDFFF]|\\uD83D[\\uDC00-\\uDC3E\\uDC40\\uDC42-\\uDCFC\\uDCFF-\\uDD3D\\uDD4B-\\uDD4E\\uDD50-\\uDD67\\uDD7A\\uDD95\\uDD96\\uDDA4\\uDDFB-\\uDE4F\\uDE80-\\uDEC5\\uDECC\\uDED0-\\uDED2\\uDEEB\\uDEEC\\uDEF4-\\uDEF8]|\\uD83E[\\uDD10-\\uDD3A\\uDD3C-\\uDD3E\\uDD40-\\uDD45\\uDD47-\\uDD4C\\uDD50-\\uDD6B\\uDD80-\\uDD97\\uDDC0\\uDDD0-\\uDDE6])|(?:[#\\*0-9\\xA9\\xAE\\u203C\\u2049\\u2122\\u2139\\u2194-\\u2199\\u21A9\\u21AA\\u231A\\u231B\\u2328\\u23CF\\u23E9-\\u23F3\\u23F8-\\u23FA\\u24C2\\u25AA\\u25AB\\u25B6\\u25C0\\u25FB-\\u25FE\\u2600-\\u2604\\u260E\\u2611\\u2614\\u2615\\u2618\\u261D\\u2620\\u2622\\u2623\\u2626\\u262A\\u262E\\u262F\\u2638-\\u263A\\u2640\\u2642\\u2648-\\u2653\\u2660\\u2663\\u2665\\u2666\\u2668\\u267B\\u267F\\u2692-\\u2697\\u2699\\u269B\\u269C\\u26A0\\u26A1\\u26AA\\u26AB\\u26B0\\u26B1\\u26BD\\u26BE\\u26C4\\u26C5\\u26C8\\u26CE\\u26CF\\u26D1\\u26D3\\u26D4\\u26E9\\u26EA\\u26F0-\\u26F5\\u26F7-\\u26FA\\u26FD\\u2702\\u2705\\u2708-\\u270D\\u270F\\u2712\\u2714\\u2716\\u271D\\u2721\\u2728\\u2733\\u2734\\u2744\\u2747\\u274C\\u274E\\u2753-\\u2755\\u2757\\u2763\\u2764\\u2795-\\u2797\\u27A1\\u27B0\\u27BF\\u2934\\u2935\\u2B05-\\u2B07\\u2B1B\\u2B1C\\u2B50\\u2B55\\u3030\\u303D\\u3297\\u3299]|\\uD83C[\\uDC04\\uDCCF\\uDD70\\uDD71\\uDD7E\\uDD7F\\uDD8E\\uDD91-\\uDD9A\\uDDE6-\\uDDFF\\uDE01\\uDE02\\uDE1A\\uDE2F\\uDE32-\\uDE3A\\uDE50\\uDE51\\uDF00-\\uDF21\\uDF24-\\uDF93\\uDF96\\uDF97\\uDF99-\\uDF9B\\uDF9E-\\uDFF0\\uDFF3-\\uDFF5\\uDFF7-\\uDFFF]|\\uD83D[\\uDC00-\\uDCFD\\uDCFF-\\uDD3D\\uDD49-\\uDD4E\\uDD50-\\uDD67\\uDD6F\\uDD70\\uDD73-\\uDD7A\\uDD87\\uDD8A-\\uDD8D\\uDD90\\uDD95\\uDD96\\uDDA4\\uDDA5\\uDDA8\\uDDB1\\uDDB2\\uDDBC\\uDDC2-\\uDDC4\\uDDD1-\\uDDD3\\uDDDC-\\uDDDE\\uDDE1\\uDDE3\\uDDE8\\uDDEF\\uDDF3\\uDDFA-\\uDE4F\\uDE80-\\uDEC5\\uDECB-\\uDED2\\uDEE0-\\uDEE5\\uDEE9\\uDEEB\\uDEEC\\uDEF0\\uDEF3-\\uDEF8]|\\uD83E[\\uDD10-\\uDD3A\\uDD3C-\\uDD3E\\uDD40-\\uDD45\\uDD47-\\uDD4C\\uDD50-\\uDD6B\\uDD80-\\uDD97\\uDDC0\\uDDD0-\\uDDE6])\\uFE0F)/;\nexport function getText(e) {\n var type = e.nodeType,\n result = \"\";\n\n if (type === 1 || type === 9 || type === 11) {\n if (typeof e.textContent === \"string\") {\n return e.textContent;\n } else {\n for (e = e.firstChild; e; e = e.nextSibling) {\n result += getText(e);\n }\n }\n } else if (type === 3 || type === 4) {\n return e.nodeValue;\n }\n\n return result;\n}\nexport function splitInnerHTML(element, delimiter, trim, preserveSpaces, unescapedCharCodes) {\n var node = element.firstChild,\n result = [],\n s;\n\n while (node) {\n if (node.nodeType === 3) {\n s = (node.nodeValue + \"\").replace(/^\\n+/g, \"\");\n\n if (!preserveSpaces) {\n s = s.replace(/\\s+/g, \" \");\n }\n\n result.push.apply(result, emojiSafeSplit(s, delimiter, trim, preserveSpaces, unescapedCharCodes));\n } else if ((node.nodeName + \"\").toLowerCase() === \"br\") {\n result[result.length - 1] += \"<br>\";\n } else {\n result.push(node.outerHTML);\n }\n\n node = node.nextSibling;\n }\n\n if (!unescapedCharCodes) {\n s = result.length;\n\n while (s--) {\n result[s] === \"&\" && result.splice(s, 1, \"&amp;\");\n }\n }\n\n return result;\n}\n/*\n//smaller kb version that only handles the simpler emoji's, which is often perfectly adequate.\n\nlet _emoji = \"[\\uE000-\\uF8FF]|\\uD83C[\\uDC00-\\uDFFF]|\\uD83D[\\uDC00-\\uDFFF]|[\\u2694-\\u2697]|\\uD83E[\\uDD10-\\uDD5D]|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]\",\n\t_emojiExp = new RegExp(_emoji),\n\t_emojiAndCharsExp = new RegExp(_emoji + \"|.\", \"g\"),\n\t_emojiSafeSplit = (text, delimiter, trim) => {\n\t\tif (trim) {\n\t\t\ttext = text.replace(_trimExp, \"\");\n\t\t}\n\t\treturn ((delimiter === \"\" || !delimiter) && _emojiExp.test(text)) ? text.match(_emojiAndCharsExp) : text.split(delimiter || \"\");\n\t};\n */\n\nexport function emojiSafeSplit(text, delimiter, trim, preserveSpaces, unescapedCharCodes) {\n text += \"\"; // make sure it's cast as a string. Someone may pass in a number.\n\n trim && (text = text.trim ? text.trim() : text.replace(_trimExp, \"\")); // IE9 and earlier compatibility\n\n if (delimiter && delimiter !== \"\") {\n return text.replace(/>/g, \"&gt;\").replace(/</g, \"&lt;\").split(delimiter);\n }\n\n var result = [],\n l = text.length,\n i = 0,\n j,\n character;\n\n for (; i < l; i++) {\n character = text.charAt(i);\n\n if (character.charCodeAt(0) >= 0xD800 && character.charCodeAt(0) <= 0xDBFF || text.charCodeAt(i + 1) >= 0xFE00 && text.charCodeAt(i + 1) <= 0xFE0F) {\n //special emoji characters use 2 or 4 unicode characters that we must keep together.\n j = ((text.substr(i, 12).split(emojiExp) || [])[1] || \"\").length || 2;\n character = text.substr(i, j);\n result.emoji = 1;\n i += j - 1;\n }\n\n result.push(unescapedCharCodes ? character : character === \">\" ? \"&gt;\" : character === \"<\" ? \"&lt;\" : preserveSpaces && character === \" \" && (text.charAt(i - 1) === \" \" || text.charAt(i + 1) === \" \") ? \"&nbsp;\" : character);\n }\n\n return result;\n}","/*!\n * ScrambleTextPlugin 3.14.2\n * https://gsap.com\n *\n * @license Copyright 2008-2025, GreenSock. All rights reserved.\n * Subject to the terms at https://gsap.com/standard-license\n * @author: Jack Doyle, jack@greensock.com\n*/\n\n/* eslint-disable */\nimport { emojiSafeSplit, getText } from \"./utils/strings.js\";\n\nvar CharSet = /*#__PURE__*/function () {\n function CharSet(chars) {\n this.chars = emojiSafeSplit(chars);\n this.sets = [];\n this.length = 50;\n\n for (var i = 0; i < 20; i++) {\n this.sets[i] = _scrambleText(80, this.chars); //we create 20 strings that are 80 characters long, randomly chosen and pack them into an array. We then randomly choose the scrambled text from this array in order to greatly improve efficiency compared to creating new randomized text from scratch each and every time it's needed. This is a simple lookup whereas the other technique requires looping through as many times as there are characters needed, and calling Math.random() each time through the loop, building the string, etc.\n }\n }\n\n var _proto = CharSet.prototype;\n\n _proto.grow = function grow(newLength) {\n //if we encounter a tween that has more than 80 characters, we'll need to add to the character sets accordingly. Once it's cached, it'll only need to grow again if we exceed that new length. Again, this is an efficiency tactic.\n for (var i = 0; i < 20; i++) {\n this.sets[i] += _scrambleText(newLength - this.length, this.chars);\n }\n\n this.length = newLength;\n };\n\n return CharSet;\n}();\n\nvar gsap,\n _coreInitted,\n _getGSAP = function _getGSAP() {\n return gsap || typeof window !== \"undefined\" && (gsap = window.gsap) && gsap.registerPlugin && gsap;\n},\n _bonusValidated = 1,\n //<name>ScrambleTextPlugin</name>\n_spacesExp = /\\s+/g,\n _scrambleText = function _scrambleText(length, chars) {\n var l = chars.length,\n s = \"\";\n\n while (--length > -1) {\n s += chars[~~(Math.random() * l)];\n }\n\n return s;\n},\n _upper = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\",\n _lower = _upper.toLowerCase(),\n _charsLookup = {\n upperCase: new CharSet(_upper),\n lowerCase: new CharSet(_lower),\n upperAndLowerCase: new CharSet(_upper + _lower)\n},\n _initCore = function _initCore() {\n _coreInitted = gsap = _getGSAP();\n};\n\nexport var ScrambleTextPlugin = {\n version: \"3.14.2\",\n name: \"scrambleText\",\n register: function register(core, Plugin, propTween) {\n gsap = core;\n\n _initCore();\n },\n init: function init(target, value, tween, index, targets) {\n _coreInitted || _initCore();\n this.prop = \"innerHTML\" in target ? \"innerHTML\" : \"textContent\" in target ? \"textContent\" : 0; // SVG text in IE doesn't have innerHTML, but it does have textContent.\n\n if (!this.prop) {\n return;\n }\n\n this.target = target;\n\n if (typeof value !== \"object\") {\n value = {\n text: value\n };\n }\n\n var text = value.text || value.value || \"\",\n trim = value.trim !== false,\n data = this,\n delim,\n maxLength,\n charset,\n splitByChars;\n data.delimiter = delim = value.delimiter || \"\";\n data.original = emojiSafeSplit(getText(target).replace(_spacesExp, \" \").split(\"&nbsp;\").join(\"\"), delim, trim);\n\n if (text === \"{original}\" || text === true || text == null) {\n text = data.original.join(delim);\n }\n\n data.text = emojiSafeSplit((text || \"\").replace(_spacesExp, \" \"), delim, trim);\n data.hasClass = !!(value.newClass || value.oldClass);\n data.newClass = value.newClass;\n data.oldClass = value.oldClass;\n splitByChars = delim === \"\";\n data.textHasEmoji = splitByChars && !!data.text.emoji;\n data.charsHaveEmoji = !!value.chars && !!emojiSafeSplit(value.chars).emoji;\n data.length = splitByChars ? data.original.length : data.original.join(delim).length;\n data.lengthDif = (splitByChars ? data.text.length : data.text.join(delim).length) - data.length;\n data.fillChar = value.fillChar || value.chars && ~value.chars.indexOf(\" \") ? \"&nbsp;\" : \"\";\n data.charSet = charset = _charsLookup[value.chars || \"upperCase\"] || new CharSet(value.chars);\n data.speed = 0.05 / (value.speed || 1);\n data.prevScrambleTime = 0;\n data.setIndex = Math.random() * 20 | 0;\n maxLength = data.length + Math.max(data.lengthDif, 0);\n\n if (maxLength > charset.length) {\n charset.grow(maxLength);\n }\n\n data.chars = charset.sets[data.setIndex];\n data.revealDelay = value.revealDelay || 0;\n data.tweenLength = value.tweenLength !== false;\n data.tween = tween;\n data.rightToLeft = !!value.rightToLeft;\n\n data._props.push(\"scrambleText\", \"text\");\n\n return _bonusValidated;\n },\n render: function render(ratio, data) {\n var target = data.target,\n prop = data.prop,\n text = data.text,\n delimiter = data.delimiter,\n tween = data.tween,\n prevScrambleTime = data.prevScrambleTime,\n revealDelay = data.revealDelay,\n setIndex = data.setIndex,\n chars = data.chars,\n charSet = data.charSet,\n length = data.length,\n textHasEmoji = data.textHasEmoji,\n charsHaveEmoji = data.charsHaveEmoji,\n lengthDif = data.lengthDif,\n tweenLength = data.tweenLength,\n oldClass = data.oldClass,\n newClass = data.newClass,\n rightToLeft = data.rightToLeft,\n fillChar = data.fillChar,\n speed = data.speed,\n original = data.original,\n hasClass = data.hasClass,\n l = text.length,\n time = tween._time,\n timeDif = time - prevScrambleTime,\n i,\n i2,\n startText,\n endText,\n applyNew,\n applyOld,\n str,\n startClass,\n endClass,\n position,\n r;\n\n if (revealDelay) {\n if (tween._from) {\n time = tween._dur - time; //invert the time for from() tweens\n }\n\n ratio = time === 0 ? 0 : time < revealDelay ? 0.000001 : time === tween._dur ? 1 : tween._ease((time - revealDelay) / (tween._dur - revealDelay));\n }\n\n if (ratio < 0) {\n ratio = 0;\n } else if (ratio > 1) {\n ratio = 1;\n }\n\n if (rightToLeft) {\n ratio = 1 - ratio;\n }\n\n i = ~~(ratio * l + 0.5);\n\n if (ratio) {\n if (timeDif > speed || timeDif < -speed) {\n data.setIndex = setIndex = (setIndex + (Math.random() * 19 | 0)) % 20;\n data.chars = charSet.sets[setIndex];\n data.prevScrambleTime += timeDif;\n }\n\n endText = chars;\n } else {\n endText = original.join(delimiter);\n }\n\n r = tween._from ? ratio : 1 - ratio;\n position = length + (tweenLength ? tween._from ? r * r * r : 1 - r * r * r : 1) * lengthDif;\n\n if (rightToLeft) {\n if (ratio === 1 && (tween._from || tween.data === \"isFromStart\")) {\n //special case for from() tweens\n startText = \"\";\n endText = original.join(delimiter);\n } else {\n str = text.slice(i).join(delimiter);\n\n if (charsHaveEmoji) {\n startText = emojiSafeSplit(endText).slice(0, position - (textHasEmoji ? emojiSafeSplit(str) : str).length + 0.5 | 0).join(\"\");\n } else {\n startText = endText.substr(0, position - (textHasEmoji ? emojiSafeSplit(str) : str).length + 0.5 | 0);\n }\n\n endText = str;\n }\n } else {\n startText = text.slice(0, i).join(delimiter);\n i2 = (textHasEmoji ? emojiSafeSplit(startText) : startText).length;\n\n if (charsHaveEmoji) {\n endText = emojiSafeSplit(endText).slice(i2, position + 0.5 | 0).join(\"\");\n } else {\n endText = endText.substr(i2, position - i2 + 0.5 | 0);\n }\n }\n\n if (hasClass) {\n startClass = rightToLeft ? oldClass : newClass;\n endClass = rightToLeft ? newClass : oldClass;\n applyNew = startClass && i !== 0;\n applyOld = endClass && i !== l;\n str = (applyNew ? \"<span class='\" + startClass + \"'>\" : \"\") + startText + (applyNew ? \"</span>\" : \"\") + (applyOld ? \"<span class='\" + endClass + \"'>\" : \"\") + delimiter + endText + (applyOld ? \"</span>\" : \"\");\n } else {\n str = startText + delimiter + endText;\n }\n\n target[prop] = fillChar === \"&nbsp;\" && ~str.indexOf(\" \") ? str.split(\" \").join(\"&nbsp;&nbsp;\") : str;\n }\n};\nScrambleTextPlugin.emojiSafeSplit = emojiSafeSplit;\nScrambleTextPlugin.getText = getText;\n_getGSAP() && gsap.registerPlugin(ScrambleTextPlugin);\nexport { ScrambleTextPlugin as default };","/**\n[PURPOSE]: 扰动文字组件,鼠标悬停时文字字符随机变换\n[INPUT]: (radius, duration, speed, scrambleChars, children) - 影响半径、动画时长、速度、扰动字符、文本内容\n[OUTPUT]: 鼠标移动时触发字符扰动动画的文本\n[POS]: 位于 /src/components,作为文本动画示例组件\n\n[PROTOCOL]:\n1. 一旦本文件逻辑变更,必须同步更新此 Header。\n2. 更新后必须上浮检查 /src/components/.folder.md 的描述是否依然准确。\n*/\n\nimport { useEffect, useRef } from 'react';\nimport { gsap } from 'gsap';\nimport { SplitText } from 'gsap/SplitText';\nimport { ScrambleTextPlugin } from 'gsap/ScrambleTextPlugin';\n\ngsap.registerPlugin(SplitText, ScrambleTextPlugin);\n\nconst ScrambledText = ({\n radius = 100,\n duration = 1.2,\n speed = 0.5,\n scrambleChars = '.:',\n className = '',\n style = {},\n children\n}) => {\n const rootRef = useRef(null);\n\n useEffect(() => {\n if (!rootRef.current) return;\n\n const split = SplitText.create(rootRef.current.querySelector('p'), {\n type: 'chars',\n charsClass: 'inline-block will-change-transform'\n });\n\n split.chars.forEach(el => {\n const c = el;\n gsap.set(c, { attr: { 'data-content': c.innerHTML } });\n });\n\n const handleMove = e => {\n split.chars.forEach(el => {\n const c = el;\n const { left, top, width, height } = c.getBoundingClientRect();\n const dx = e.clientX - (left + width / 2);\n const dy = e.clientY - (top + height / 2);\n const dist = Math.hypot(dx, dy);\n\n if (dist < radius) {\n gsap.to(c, {\n overwrite: true,\n duration: duration * (1 - dist / radius),\n scrambleText: {\n text: c.dataset.content || '',\n chars: scrambleChars,\n speed\n },\n ease: 'none'\n });\n }\n });\n };\n\n const el = rootRef.current;\n el.addEventListener('pointermove', handleMove);\n\n return () => {\n el.removeEventListener('pointermove', handleMove);\n split.revert();\n };\n }, [radius, duration, speed, scrambleChars]);\n\n return (\n <div\n ref={rootRef}\n className={`m-[7vw] max-w-[800px] font-mono text-[clamp(14px,4vw,32px)] text-white ${className}`}\n style={style}\n >\n <p>{children}</p>\n </div>\n );\n};\n\n// 示例组件用于展示\nconst ScrambledTextDemo = () => {\n return (\n <div className=\"flex flex-col items-center gap-8 w-full\">\n <ScrambledText\n radius={120}\n duration={1.5}\n speed={0.6}\n scrambleChars=\"!<>-_\\\\/[]{}—=+*^?#________\"\n >\n Move your cursor over this text to see the scramble effect!\n </ScrambledText>\n \n <ScrambledText\n radius={100}\n duration={1.2}\n speed={0.5}\n scrambleChars=\"01\"\n className=\"text-green-400\"\n >\n Binary scramble effect with 0 and 1 characters\n </ScrambledText>\n </div>\n );\n};\n\n// 组件源代码字符串\nexport const scrambledTextCode = `import { useEffect, useRef } from 'react';\nimport { gsap } from 'gsap';\nimport { SplitText } from 'gsap/SplitText';\nimport { ScrambleTextPlugin } from 'gsap/ScrambleTextPlugin';\n\ngsap.registerPlugin(SplitText, ScrambleTextPlugin);\n\nconst ScrambledText = ({\n radius = 100,\n duration = 1.2,\n speed = 0.5,\n scrambleChars = '.:',\n className = '',\n style = {},\n children\n}) => {\n const rootRef = useRef(null);\n\n useEffect(() => {\n if (!rootRef.current) return;\n\n const split = SplitText.create(rootRef.current.querySelector('p'), {\n type: 'chars',\n charsClass: 'inline-block will-change-transform'\n });\n\n split.chars.forEach(el => {\n const c = el;\n gsap.set(c, { attr: { 'data-content': c.innerHTML } });\n });\n\n const handleMove = e => {\n split.chars.forEach(el => {\n const c = el;\n const { left, top, width, height } = c.getBoundingClientRect();\n const dx = e.clientX - (left + width / 2);\n const dy = e.clientY - (top + height / 2);\n const dist = Math.hypot(dx, dy);\n\n if (dist < radius) {\n gsap.to(c, {\n overwrite: true,\n duration: duration * (1 - dist / radius),\n scrambleText: {\n text: c.dataset.content || '',\n chars: scrambleChars,\n speed\n },\n ease: 'none'\n });\n }\n });\n };\n\n const el = rootRef.current;\n el.addEventListener('pointermove', handleMove);\n\n return () => {\n el.removeEventListener('pointermove', handleMove);\n split.revert();\n };\n }, [radius, duration, speed, scrambleChars]);\n\n return (\n <div\n ref={rootRef}\n className={\\`m-[7vw] max-w-[800px] font-mono text-white \\${className}\\`}\n style={style}\n >\n <p>{children}</p>\n </div>\n );\n};\n\n// 使用示例\nconst Demo = () => (\n <ScrambledText\n radius={120}\n duration={1.5}\n scrambleChars=\"!<>-_\\\\\\\\/[]{}—=+*^?#\"\n >\n Move your cursor to see the effect!\n </ScrambledText>\n);`;\n\nexport default ScrambledTextDemo;\n","/**\n[PURPOSE]: 流动虚线边框矩形组件,支持方向、速度、颜色和虚线样式自定义\n[INPUT]: (direction, speed, color, dashLength, gapLength, width, height, strokeWidth) - 流动方向、速度、颜色、虚线长度、间隔、尺寸、线宽\n[OUTPUT]: 带有流动虚线边框的矩形动画\n[POS]: 位于 /src/components,作为边框动画示例组件\n\n[PROTOCOL]:\n1. 一旦本文件逻辑变更,必须同步更新此 Header。\n2. 更新后必须上浮检查 /src/components/.folder.md 的描述是否依然准确。\n*/\n\nimport { useEffect, useRef, useState } from 'react';\nimport { motion } from 'framer-motion';\n\nconst FlowingDashedBox = ({\n direction = 'clockwise',\n speed = 2,\n color = '#6366f1',\n dashLength = 10,\n gapLength = 5,\n width = 300,\n height = 200,\n strokeWidth = 2,\n borderRadius = 0\n}) => {\n const pathRef = useRef(null);\n\n useEffect(() => {\n if (!pathRef.current) return;\n\n const path = pathRef.current;\n const totalLength = path.getTotalLength();\n \n // 设置初始虚线偏移\n path.style.strokeDasharray = `${dashLength} ${gapLength}`;\n path.style.strokeDashoffset = direction === 'clockwise' ? totalLength : 0;\n\n let animationId;\n let offset = direction === 'clockwise' ? totalLength : 0;\n const step = direction === 'clockwise' ? -speed : speed;\n\n const animate = () => {\n offset += step;\n \n // 循环动画\n if (direction === 'clockwise') {\n if (offset <= -(dashLength + gapLength)) {\n offset = 0;\n }\n } else {\n if (offset >= dashLength + gapLength) {\n offset = 0;\n }\n }\n \n path.style.strokeDashoffset = offset;\n animationId = requestAnimationFrame(animate);\n };\n\n animationId = requestAnimationFrame(animate);\n\n return () => {\n if (animationId) {\n cancelAnimationFrame(animationId);\n }\n };\n }, [direction, speed, dashLength, gapLength]);\n\n return (\n <svg\n width={width + strokeWidth * 2}\n height={height + strokeWidth * 2}\n className=\"overflow-visible\"\n >\n <motion.rect\n ref={pathRef}\n x={strokeWidth}\n y={strokeWidth}\n width={width}\n height={height}\n rx={borderRadius}\n ry={borderRadius}\n fill=\"transparent\"\n stroke={color}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ duration: 0.5 }}\n />\n </svg>\n );\n};\n\n// 示例组件用于展示\nconst FlowingDashedBoxDemo = () => {\n const [config, setConfig] = useState({\n direction: 'clockwise',\n speed: 2,\n color: '#6366f1',\n dashLength: 15,\n gapLength: 8,\n width: 300,\n height: 200,\n strokeWidth: 3,\n borderRadius: 20\n });\n\n const handleChange = (key, value) => {\n setConfig(prev => ({ ...prev, [key]: value }));\n };\n\n return (\n <div className=\"w-full space-y-8\">\n {/* 预览区域 */}\n <div className=\"flex items-center justify-center min-h-[300px] bg-gray-900/30 rounded-xl border border-gray-800 p-8\">\n <FlowingDashedBox {...config} />\n </div>\n\n {/* 控制面板 */}\n <div className=\"bg-gray-800/50 rounded-xl border border-gray-700 p-6 space-y-6\">\n <h3 className=\"text-lg font-semibold text-white mb-4\">参数调整</h3>\n\n {/* 方向控制 */}\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium text-gray-300\">流动方向</label>\n <div className=\"flex gap-4\">\n <button\n onClick={() => handleChange('direction', 'clockwise')}\n className={`px-4 py-2 rounded-lg font-medium transition-all ${\n config.direction === 'clockwise'\n ? 'bg-indigo-600 text-white'\n : 'bg-gray-700 text-gray-300 hover:bg-gray-600'\n }`}\n >\n 顺时针\n </button>\n <button\n onClick={() => handleChange('direction', 'counterclockwise')}\n className={`px-4 py-2 rounded-lg font-medium transition-all ${\n config.direction === 'counterclockwise'\n ? 'bg-indigo-600 text-white'\n : 'bg-gray-700 text-gray-300 hover:bg-gray-600'\n }`}\n >\n 逆时针\n </button>\n </div>\n </div>\n\n {/* 速度控制 */}\n <div className=\"space-y-2\">\n <div className=\"flex justify-between items-center\">\n <label className=\"text-sm font-medium text-gray-300\">流动速度</label>\n <input\n type=\"number\"\n value={config.speed}\n onChange={(e) => handleChange('speed', parseFloat(e.target.value))}\n className=\"w-20 px-3 py-1 bg-gray-700 text-white rounded-lg border border-gray-600 focus:border-indigo-500 focus:outline-none\"\n min=\"0.1\"\n max=\"10\"\n step=\"0.1\"\n />\n </div>\n <input\n type=\"range\"\n value={config.speed}\n onChange={(e) => handleChange('speed', parseFloat(e.target.value))}\n className=\"w-full h-2 bg-gray-700 rounded-lg appearance-none cursor-pointer accent-indigo-600\"\n min=\"0.1\"\n max=\"10\"\n step=\"0.1\"\n />\n </div>\n\n {/* 虚线长度 */}\n <div className=\"space-y-2\">\n <div className=\"flex justify-between items-center\">\n <label className=\"text-sm font-medium text-gray-300\">实线长度</label>\n <input\n type=\"number\"\n value={config.dashLength}\n onChange={(e) => handleChange('dashLength', parseInt(e.target.value))}\n className=\"w-20 px-3 py-1 bg-gray-700 text-white rounded-lg border border-gray-600 focus:border-indigo-500 focus:outline-none\"\n min=\"1\"\n max=\"50\"\n />\n </div>\n <input\n type=\"range\"\n value={config.dashLength}\n onChange={(e) => handleChange('dashLength', parseInt(e.target.value))}\n className=\"w-full h-2 bg-gray-700 rounded-lg appearance-none cursor-pointer accent-indigo-600\"\n min=\"1\"\n max=\"50\"\n />\n </div>\n\n {/* 间隔长度 */}\n <div className=\"space-y-2\">\n <div className=\"flex justify-between items-center\">\n <label className=\"text-sm font-medium text-gray-300\">间隔长度</label>\n <input\n type=\"number\"\n value={config.gapLength}\n onChange={(e) => handleChange('gapLength', parseInt(e.target.value))}\n className=\"w-20 px-3 py-1 bg-gray-700 text-white rounded-lg border border-gray-600 focus:border-indigo-500 focus:outline-none\"\n min=\"1\"\n max=\"50\"\n />\n </div>\n <input\n type=\"range\"\n value={config.gapLength}\n onChange={(e) => handleChange('gapLength', parseInt(e.target.value))}\n className=\"w-full h-2 bg-gray-700 rounded-lg appearance-none cursor-pointer accent-indigo-600\"\n min=\"1\"\n max=\"50\"\n />\n </div>\n\n {/* 线条粗细 */}\n <div className=\"space-y-2\">\n <div className=\"flex justify-between items-center\">\n <label className=\"text-sm font-medium text-gray-300\">线条粗细</label>\n <input\n type=\"number\"\n value={config.strokeWidth}\n onChange={(e) => handleChange('strokeWidth', parseInt(e.target.value))}\n className=\"w-20 px-3 py-1 bg-gray-700 text-white rounded-lg border border-gray-600 focus:border-indigo-500 focus:outline-none\"\n min=\"1\"\n max=\"10\"\n />\n </div>\n <input\n type=\"range\"\n value={config.strokeWidth}\n onChange={(e) => handleChange('strokeWidth', parseInt(e.target.value))}\n className=\"w-full h-2 bg-gray-700 rounded-lg appearance-none cursor-pointer accent-indigo-600\"\n min=\"1\"\n max=\"10\"\n />\n </div>\n\n {/* 圆角半径 */}\n <div className=\"space-y-2\">\n <div className=\"flex justify-between items-center\">\n <label className=\"text-sm font-medium text-gray-300\">圆角半径</label>\n <input\n type=\"number\"\n value={config.borderRadius}\n onChange={(e) => handleChange('borderRadius', parseInt(e.target.value))}\n className=\"w-20 px-3 py-1 bg-gray-700 text-white rounded-lg border border-gray-600 focus:border-indigo-500 focus:outline-none\"\n min=\"0\"\n max=\"100\"\n />\n </div>\n <input\n type=\"range\"\n value={config.borderRadius}\n onChange={(e) => handleChange('borderRadius', parseInt(e.target.value))}\n className=\"w-full h-2 bg-gray-700 rounded-lg appearance-none cursor-pointer accent-indigo-600\"\n min=\"0\"\n max=\"100\"\n />\n </div>\n\n {/* 尺寸控制 */}\n <div className=\"grid grid-cols-2 gap-4\">\n <div className=\"space-y-2\">\n <div className=\"flex justify-between items-center\">\n <label className=\"text-sm font-medium text-gray-300\">宽度</label>\n <input\n type=\"number\"\n value={config.width}\n onChange={(e) => handleChange('width', parseInt(e.target.value))}\n className=\"w-20 px-3 py-1 bg-gray-700 text-white rounded-lg border border-gray-600 focus:border-indigo-500 focus:outline-none\"\n min=\"50\"\n max=\"600\"\n />\n </div>\n <input\n type=\"range\"\n value={config.width}\n onChange={(e) => handleChange('width', parseInt(e.target.value))}\n className=\"w-full h-2 bg-gray-700 rounded-lg appearance-none cursor-pointer accent-indigo-600\"\n min=\"50\"\n max=\"600\"\n />\n </div>\n\n <div className=\"space-y-2\">\n <div className=\"flex justify-between items-center\">\n <label className=\"text-sm font-medium text-gray-300\">高度</label>\n <input\n type=\"number\"\n value={config.height}\n onChange={(e) => handleChange('height', parseInt(e.target.value))}\n className=\"w-20 px-3 py-1 bg-gray-700 text-white rounded-lg border border-gray-600 focus:border-indigo-500 focus:outline-none\"\n min=\"50\"\n max=\"400\"\n />\n </div>\n <input\n type=\"range\"\n value={config.height}\n onChange={(e) => handleChange('height', parseInt(e.target.value))}\n className=\"w-full h-2 bg-gray-700 rounded-lg appearance-none cursor-pointer accent-indigo-600\"\n min=\"50\"\n max=\"400\"\n />\n </div>\n </div>\n\n {/* 颜色选择 */}\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium text-gray-300\">边框颜色</label>\n <div className=\"flex gap-3 items-center\">\n <input\n type=\"color\"\n value={config.color}\n onChange={(e) => handleChange('color', e.target.value)}\n className=\"w-12 h-12 rounded-lg cursor-pointer bg-gray-700 border-2 border-gray-600\"\n />\n <input\n type=\"text\"\n value={config.color}\n onChange={(e) => handleChange('color', e.target.value)}\n className=\"flex-1 px-3 py-2 bg-gray-700 text-white rounded-lg border border-gray-600 focus:border-indigo-500 focus:outline-none font-mono\"\n placeholder=\"#6366f1\"\n />\n </div>\n </div>\n\n {/* 预设颜色 */}\n <div className=\"space-y-2\">\n <label className=\"text-sm font-medium text-gray-300\">快速选择颜色</label>\n <div className=\"flex gap-2 flex-wrap\">\n {['#6366f1', '#ec4899', '#10b981', '#f59e0b', '#8b5cf6', '#ef4444'].map(color => (\n <button\n key={color}\n onClick={() => handleChange('color', color)}\n className=\"w-10 h-10 rounded-lg border-2 transition-all hover:scale-110\"\n style={{\n backgroundColor: color,\n borderColor: config.color === color ? '#fff' : color\n }}\n />\n ))}\n </div>\n </div>\n </div>\n </div>\n );\n};\n\n// 组件源代码字符串\nexport const flowingDashedBoxCode = `import { useEffect, useRef } from 'react';\nimport { motion } from 'framer-motion';\n\nconst FlowingDashedBox = ({\n direction = 'clockwise', // 流动方向:'clockwise' | 'counterclockwise'\n speed = 2, // 流动速度\n color = '#6366f1', // 边框颜色\n dashLength = 10, // 虚线实线部分长度\n gapLength = 5, // 虚线间隔长度\n width = 300, // 矩形宽度\n height = 200, // 矩形高度\n strokeWidth = 2, // 线条粗细\n borderRadius = 0 // 圆角半径\n}) => {\n const pathRef = useRef(null);\n\n useEffect(() => {\n if (!pathRef.current) return;\n\n const path = pathRef.current;\n const totalLength = path.getTotalLength();\n \n // 设置初始虚线偏移\n path.style.strokeDasharray = \\`\\${dashLength} \\${gapLength}\\`;\n path.style.strokeDashoffset = direction === 'clockwise' ? totalLength : 0;\n\n let animationId;\n let offset = direction === 'clockwise' ? totalLength : 0;\n const step = direction === 'clockwise' ? -speed : speed;\n\n const animate = () => {\n offset += step;\n \n // 循环动画\n if (direction === 'clockwise') {\n if (offset <= -(dashLength + gapLength)) {\n offset = 0;\n }\n } else {\n if (offset >= dashLength + gapLength) {\n offset = 0;\n }\n }\n \n path.style.strokeDashoffset = offset;\n animationId = requestAnimationFrame(animate);\n };\n\n animationId = requestAnimationFrame(animate);\n\n return () => {\n if (animationId) {\n cancelAnimationFrame(animationId);\n }\n };\n }, [direction, speed, dashLength, gapLength]);\n\n return (\n <svg\n width={width + strokeWidth * 2}\n height={height + strokeWidth * 2}\n className=\"overflow-visible\"\n >\n <motion.rect\n ref={pathRef}\n x={strokeWidth}\n y={strokeWidth}\n width={width}\n height={height}\n rx={borderRadius}\n ry={borderRadius}\n fill=\"transparent\"\n stroke={color}\n strokeWidth={strokeWidth}\n strokeLinecap=\"round\"\n initial={{ opacity: 0 }}\n animate={{ opacity: 1 }}\n transition={{ duration: 0.5 }}\n />\n </svg>\n );\n};\n\n// 使用示例\nconst Demo = () => (\n <div className=\"flex gap-8\">\n <FlowingDashedBox\n direction=\"clockwise\"\n speed={3}\n color=\"#6366f1\"\n dashLength={15}\n gapLength={8}\n />\n <FlowingDashedBox\n direction=\"counterclockwise\"\n speed={2}\n color=\"#ec4899\"\n dashLength={20}\n gapLength={10}\n />\n </div>\n);\n\nexport default FlowingDashedBox;`;\n\nexport default FlowingDashedBoxDemo;\n"],"names":["REACT_ELEMENT_TYPE","REACT_FRAGMENT_TYPE","jsxProd","type","config","maybeKey","key","propName","reactJsxRuntime_production","getComponentNameFromType","REACT_CLIENT_REFERENCE","REACT_PROFILER_TYPE","REACT_STRICT_MODE_TYPE","REACT_SUSPENSE_TYPE","REACT_SUSPENSE_LIST_TYPE","REACT_ACTIVITY_TYPE","REACT_PORTAL_TYPE","REACT_CONTEXT_TYPE","REACT_CONSUMER_TYPE","REACT_FORWARD_REF_TYPE","innerType","REACT_MEMO_TYPE","REACT_LAZY_TYPE","testStringCoercion","value","checkKeyStringCoercion","JSCompiler_inline_result","JSCompiler_temp_const","JSCompiler_inline_result$jscomp$0","getTaskName","name","getOwner","dispatcher","ReactSharedInternals","UnknownOwner","hasValidKey","hasOwnProperty","getter","defineKeyPropWarningGetter","props","displayName","warnAboutAccessingKey","specialPropKeyWarningShown","elementRefGetterWithDeprecationWarning","componentName","didWarnAboutElementRef","ReactElement","owner","debugStack","debugTask","refProp","jsxDEVImpl","isStaticChildren","children","isArrayImpl","validateChildKeys","keys","k","didWarnAboutKeySpread","node","isValidElement","object","React","require$$0","createTask","callStackForError","unknownOwnerDebugStack","unknownOwnerDebugTask","reactJsxRuntime_development","trackActualOwner","jsxRuntimeModule","require$$1","GlowCard","jsx","motion","jsxs","BounceIn","containerVariants","itemVariants","buttons","text","index","buildKeyframes","from","steps","s","keyframes","BlurText","delay","className","animateBy","direction","threshold","rootMargin","animationFrom","animationTo","easing","t","onAnimationComplete","stepDuration","elements","inView","setInView","useState","ref","useRef","useEffect","observer","entry","defaultFrom","useMemo","defaultTo","fromSnapshot","toSnapshots","stepCount","totalDuration","times","_","i","segment","animateKeyframes","spanTransition","BlurTextDemo","getRotationTransition","duration","loop","getTransition","CircularText","spinDuration","onHover","letters","controls","useAnimation","rotation","useMotionValue","start","handleHoverStart","transitionConfig","scaleVal","handleHoverEnd","letter","rotationDeg","factor","x","y","transform","CircularTextDemo","gsap","_fonts","_splitProp","_coreInitted","_initIfNecessary","SplitText","_charSegmenter","_toArray","r","acc","cur","_elements","targets","e","_emptyArray","_context","_defaultContext","f","_spacesRegEx","_emojiSafeRegEx","_emptyBounds","_findNextValidBounds","allBounds","startIndex","_revertOriginal","element","html","ariaL","ariaH","_stretchToFitSpecialChars","collection","specialCharsRegEx","charsFound","slots","word","char","combined","_disallowInline","_insertNodeBefore","newChild","parent","existingChild","_getWrapper","tag","aria","propIndex","display","incrementClass","wrapper","el","_getLineWrapper","nodes","lineWrapper","textAlign","endIndex","newLine","_splitWordsAndCharsRecursively","wordWrapper","charWrapper","prepForCharsOnly","deepSlice","ignore","charSplitRegEx","isNested","_a","wordDelimiter","reduceWhiteSpace","prepareText","elementBounds","lastBounds","isPreformatted","ignoredPreviousSibling","wordsCollection","wordDelimIsNotSpace","wordDelimString","wordDelimSplitter","curNode","words","curWordEl","startsWithSpace","endsWithSpace","j","bounds","curWordChars","clonedNode","curSubNode","tempSubNode","curTextContent","wordText","lastWordText","_SplitText","orig","timerId","checkWidths","o","w","smartWrap","onSplit","autoSplit","specialChars","mask","splitLines","splitCharacters","splitWords","onlySplitCharacters","finalCharSplitRegEx","animTime","obs","onSplitResult","chars","lines","curWord","smartWrapSpan","nextSibling","wrapLine","toRemove","lineStartIndex","n","curBounds","maskEl","_b","anim","core","_trimExp","emojiExp","getText","result","emojiSafeSplit","delimiter","trim","preserveSpaces","unescapedCharCodes","l","character","CharSet","_scrambleText","_proto","newLength","_getGSAP","_bonusValidated","_spacesExp","length","_upper","_lower","_charsLookup","_initCore","ScrambleTextPlugin","Plugin","propTween","target","tween","data","delim","maxLength","charset","splitByChars","ratio","prop","prevScrambleTime","revealDelay","setIndex","charSet","textHasEmoji","charsHaveEmoji","lengthDif","tweenLength","oldClass","newClass","rightToLeft","fillChar","speed","original","hasClass","time","timeDif","i2","startText","endText","applyNew","applyOld","str","startClass","endClass","position","ScrambledText","radius","scrambleChars","style","rootRef","split","c","handleMove","left","top","width","height","dx","dy","dist","ScrambledTextDemo","FlowingDashedBox","color","dashLength","gapLength","strokeWidth","borderRadius","pathRef","path","totalLength","animationId","offset","step","animate","FlowingDashedBoxDemo","setConfig","handleChange","prev"],"mappings":"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","x_google_ignoreList":[0,1,2,7,8,9]}
package/dist/vite.svg ADDED
@@ -0,0 +1 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
package/package.json ADDED
@@ -0,0 +1,71 @@
1
+ {
2
+ "name": "@design-llm/motion",
3
+ "version": "1.0.0",
4
+ "description": "精美的 React 动效组件库 - 基于 Framer Motion 和 Tailwind CSS",
5
+ "type": "module",
6
+ "main": "./dist/index.cjs",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "require": "./dist/index.cjs"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md"
19
+ ],
20
+ "keywords": [
21
+ "react",
22
+ "animation",
23
+ "motion",
24
+ "framer-motion",
25
+ "tailwind",
26
+ "components",
27
+ "ui"
28
+ ],
29
+ "author": "design-llm",
30
+ "license": "MIT",
31
+ "repository": {
32
+ "type": "git",
33
+ "url": "git+https://github.com/design-llm/motion.git"
34
+ },
35
+ "scripts": {
36
+ "dev": "vite",
37
+ "build": "vite build",
38
+ "build:lib": "vite build --config vite.config.lib.js",
39
+ "lint": "eslint .",
40
+ "preview": "vite preview",
41
+ "prepublishOnly": "npm run build:lib"
42
+ },
43
+ "dependencies": {
44
+ "framer-motion": "^10.0.0 || ^11.0.0 || ^12.0.0",
45
+ "gsap": "^3.14.2",
46
+ "react": "^18.0.0 || ^19.0.0",
47
+ "react-dom": "^18.0.0 || ^19.0.0",
48
+ "react-syntax-highlighter": "^16.1.0"
49
+ },
50
+ "peerDependencies": {
51
+ "framer-motion": "^10.0.0 || ^11.0.0 || ^12.0.0",
52
+ "react": "^18.0.0 || ^19.0.0",
53
+ "react-dom": "^18.0.0 || ^19.0.0"
54
+ },
55
+ "devDependencies": {
56
+ "@eslint/js": "^9.39.1",
57
+ "@types/node": "^25.0.3",
58
+ "@types/react": "^19.2.7",
59
+ "@types/react-dom": "^19.2.3",
60
+ "@vitejs/plugin-react": "^5.1.1",
61
+ "autoprefixer": "^10.4.23",
62
+ "eslint": "^9.39.1",
63
+ "eslint-plugin-react-hooks": "^7.0.1",
64
+ "eslint-plugin-react-refresh": "^0.4.24",
65
+ "globals": "^16.5.0",
66
+ "postcss": "^8.5.6",
67
+ "tailwindcss": "^3.4.19",
68
+ "typescript": "^5.9.3",
69
+ "vite": "^7.2.4"
70
+ }
71
+ }