kmcom-nuxt-layers 1.0.1

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.
Files changed (380) hide show
  1. package/.claude/rules/nuxt-layers.md +23 -0
  2. package/.claude/rules/typescript.md +16 -0
  3. package/.claude/rules/vue-components.md +34 -0
  4. package/.claude/settings.local.json +81 -0
  5. package/.editorconfig +27 -0
  6. package/.github/workflows/npm-publish.yml +33 -0
  7. package/.oxlintrc.json +10 -0
  8. package/.prettierignore +87 -0
  9. package/CLAUDE.md +71 -0
  10. package/apps/playground/README.md +75 -0
  11. package/apps/playground/app/app.config.ts +10 -0
  12. package/apps/playground/app/app.vue +12 -0
  13. package/apps/playground/app/components/AmbientBackground.client.vue +795 -0
  14. package/apps/playground/app/components/ShaderDemoCanvas.client.vue +636 -0
  15. package/apps/playground/app/components/ShaderImageDemo.client.vue +211 -0
  16. package/apps/playground/app/pages/ambient.vue +387 -0
  17. package/apps/playground/app/pages/content.vue +200 -0
  18. package/apps/playground/app/pages/core.vue +560 -0
  19. package/apps/playground/app/pages/forms.vue +645 -0
  20. package/apps/playground/app/pages/index.vue +257 -0
  21. package/apps/playground/app/pages/layout.vue +591 -0
  22. package/apps/playground/app/pages/locomotive-scroll.vue +738 -0
  23. package/apps/playground/app/pages/motion.vue +848 -0
  24. package/apps/playground/app/pages/shader.vue +1701 -0
  25. package/apps/playground/app/pages/theme.vue +115 -0
  26. package/apps/playground/app/pages/ui.vue +656 -0
  27. package/apps/playground/content/blog/hello-world.md +127 -0
  28. package/apps/playground/content/blog/second-post.md +99 -0
  29. package/apps/playground/content/blog/third-post.md +33 -0
  30. package/apps/playground/content/gallery/autumn-collection.md +57 -0
  31. package/apps/playground/content/gallery/summer-collection.md +52 -0
  32. package/apps/playground/content/pages/index.md +132 -0
  33. package/apps/playground/content/portfolio/project-one.md +90 -0
  34. package/apps/playground/content/portfolio/project-two.md +96 -0
  35. package/apps/playground/content.config.ts +93 -0
  36. package/apps/playground/nuxt.config.ts +99 -0
  37. package/apps/playground/package.json +17 -0
  38. package/apps/playground/public/favicon.ico +0 -0
  39. package/apps/playground/public/robots.txt +2 -0
  40. package/apps/playground/tsconfig.json +25 -0
  41. package/eslint.config.mjs +223 -0
  42. package/eslint.configCOPY.mjs +216 -0
  43. package/eslintconfigCURRENT.mjs +244 -0
  44. package/eslintconfigOLD.mjs +178 -0
  45. package/files for claude/Scroller.vue +31 -0
  46. package/files for claude/TextMarquee.vue +255 -0
  47. package/files for claude/gsap.client.ts +18 -0
  48. package/files for claude/gsap.ts +10 -0
  49. package/files for claude/scroll.ts +28 -0
  50. package/layers/content/app/assets/css/main.css +1 -0
  51. package/layers/content/app/components/Blog/Article.vue +29 -0
  52. package/layers/content/app/components/Blog/Card.vue +40 -0
  53. package/layers/content/app/components/Blog/List.vue +35 -0
  54. package/layers/content/app/components/Gallery/AmbientImage.vue +52 -0
  55. package/layers/content/app/components/Gallery/Card.vue +39 -0
  56. package/layers/content/app/components/Gallery/Detail.vue +76 -0
  57. package/layers/content/app/components/Gallery/Grid.vue +48 -0
  58. package/layers/content/app/components/Gallery/ImageDetail.vue +92 -0
  59. package/layers/content/app/components/Gallery/Lightbox.vue +102 -0
  60. package/layers/content/app/components/NuxtContent/Detail.vue +53 -0
  61. package/layers/content/app/components/NuxtContent/List.vue +21 -0
  62. package/layers/content/app/components/NuxtContent/Renderer.vue +14 -0
  63. package/layers/content/app/components/NuxtContent/Surround.vue +15 -0
  64. package/layers/content/app/components/NuxtContent/Toc.vue +18 -0
  65. package/layers/content/app/components/Portfolio/Card.vue +39 -0
  66. package/layers/content/app/components/Portfolio/ColorPalette.vue +39 -0
  67. package/layers/content/app/components/Portfolio/Detail.vue +49 -0
  68. package/layers/content/app/components/Portfolio/List.vue +44 -0
  69. package/layers/content/app/components/Portfolio/Typography.vue +37 -0
  70. package/layers/content/app/components/content/Figure.vue +31 -0
  71. package/layers/content/app/composables/useBlogPost.ts +3 -0
  72. package/layers/content/app/composables/useBlogPosts.ts +23 -0
  73. package/layers/content/app/composables/useCollectionItem.ts +5 -0
  74. package/layers/content/app/composables/useCollectionSurround.ts +9 -0
  75. package/layers/content/app/composables/useContentPage.ts +3 -0
  76. package/layers/content/app/composables/useGalleryItem.ts +3 -0
  77. package/layers/content/app/composables/useGalleryItems.ts +19 -0
  78. package/layers/content/app/composables/usePortfolioItem.ts +3 -0
  79. package/layers/content/app/composables/usePortfolioItems.ts +23 -0
  80. package/layers/content/app/pages/blog/[slug].vue +10 -0
  81. package/layers/content/app/pages/blog/index.vue +15 -0
  82. package/layers/content/app/pages/gallery/[slug]/[imageId].vue +11 -0
  83. package/layers/content/app/pages/gallery/[slug]/index.vue +10 -0
  84. package/layers/content/app/pages/gallery/index.vue +15 -0
  85. package/layers/content/app/pages/portfolio/[slug].vue +10 -0
  86. package/layers/content/app/pages/portfolio/index.vue +15 -0
  87. package/layers/content/app/types/content.ts +84 -0
  88. package/layers/content/app.config.ts +12 -0
  89. package/layers/content/content.config.ts +93 -0
  90. package/layers/content/nuxt.config.ts +31 -0
  91. package/layers/content/package.json +31 -0
  92. package/layers/content/tsconfig.json +6 -0
  93. package/layers/core/app/assets/css/base.css +88 -0
  94. package/layers/core/app/assets/css/layout.css +36 -0
  95. package/layers/core/app/assets/css/main.css +7 -0
  96. package/layers/core/app/assets/css-backup.zip +0 -0
  97. package/layers/core/app/components/ErrorBoundary.vue +102 -0
  98. package/layers/core/app/components/LoadingScreen.vue +137 -0
  99. package/layers/core/app/composables/useBrowser.ts +161 -0
  100. package/layers/core/app/composables/useCache.ts +138 -0
  101. package/layers/core/app/composables/useDevice.ts +36 -0
  102. package/layers/core/app/composables/useEnv.ts +23 -0
  103. package/layers/core/app/composables/useErrorLog.ts +158 -0
  104. package/layers/core/app/composables/useFeatures.ts +269 -0
  105. package/layers/core/app/composables/useLoading.ts +109 -0
  106. package/layers/core/app/composables/useNetworkInfo.ts +83 -0
  107. package/layers/core/app/composables/usePWAInfo.ts +104 -0
  108. package/layers/core/app/composables/useRendering.ts +97 -0
  109. package/layers/core/app/composables/useScreen.ts +95 -0
  110. package/layers/core/app/composables/useScrollGuard.ts +266 -0
  111. package/layers/core/app/error.vue +103 -0
  112. package/layers/core/app/layouts/default.vue +4 -0
  113. package/layers/core/app/pages/[...slug].vue +168 -0
  114. package/layers/core/app/pages/diagnostics.vue +228 -0
  115. package/layers/core/app/plugins/error-handler.ts +47 -0
  116. package/layers/core/app/plugins/feature-detection.client.ts +32 -0
  117. package/layers/core/app/plugins/init.ts +188 -0
  118. package/layers/core/app/plugins/loading.client.ts +54 -0
  119. package/layers/core/app/plugins/scroll-guard.client.ts +53 -0
  120. package/layers/core/app/types/detection.ts +117 -0
  121. package/layers/core/app/types/index.ts +10 -0
  122. package/layers/core/app/types/loading.ts +47 -0
  123. package/layers/core/app/types/runtime-config.ts +31 -0
  124. package/layers/core/app/types/scroll-guard.ts +25 -0
  125. package/layers/core/app/utils/helpers.ts +246 -0
  126. package/layers/core/app/utils/index.ts +8 -0
  127. package/layers/core/app/utils/regex.ts +6 -0
  128. package/layers/core/app.config.ts +193 -0
  129. package/layers/core/nuxt.config.ts +84 -0
  130. package/layers/core/package.json +25 -0
  131. package/layers/core/tailwind.config.js +28 -0
  132. package/layers/core/tsconfig.json +6 -0
  133. package/layers/forms/app/components/Form/Contact.vue +78 -0
  134. package/layers/forms/app/components/Form/Field.vue +85 -0
  135. package/layers/forms/app/composables/useFormSchema.ts +35 -0
  136. package/layers/forms/app/config/fields.ts +104 -0
  137. package/layers/forms/app/types/fields.ts +60 -0
  138. package/layers/forms/app.config.ts +12 -0
  139. package/layers/forms/nuxt.config.ts +17 -0
  140. package/layers/forms/package.json +17 -0
  141. package/layers/forms/tsconfig.json +6 -0
  142. package/layers/layout/.nuxtrc +1 -0
  143. package/layers/layout/CLAUDE.MD +186 -0
  144. package/layers/layout/GRID_SYSTEM.md +993 -0
  145. package/layers/layout/README.md +73 -0
  146. package/layers/layout/app/assets/css/layout/grids.css +180 -0
  147. package/layers/layout/app/assets/css/main.css +1 -0
  148. package/layers/layout/app/components/Layout/Grid/Debug.vue +79 -0
  149. package/layers/layout/app/components/Layout/Grid/Item.vue +180 -0
  150. package/layers/layout/app/components/Layout/Page/Container.vue +100 -0
  151. package/layers/layout/app/components/Layout/Page/Header.vue +33 -0
  152. package/layers/layout/app/components/Layout/Section/Gallery.vue +68 -0
  153. package/layers/layout/app/components/Layout/Section/Hero.vue +71 -0
  154. package/layers/layout/app/components/Layout/Section/Split.vue +56 -0
  155. package/layers/layout/app/components/Layout/Section/index.vue +39 -0
  156. package/layers/layout/app/composables/GridPlacement.ts +31 -0
  157. package/layers/layout/app/composables/useGridConfig.ts +27 -0
  158. package/layers/layout/app/types/layouts.ts +37 -0
  159. package/layers/layout/app.config.ts +97 -0
  160. package/layers/layout/nuxt.config.ts +14 -0
  161. package/layers/layout/package.json +14 -0
  162. package/layers/layout/tailwind.config.js +28 -0
  163. package/layers/layout/tsconfig.json +6 -0
  164. package/layers/motion/README.md +107 -0
  165. package/layers/motion/TASKS.MD +16 -0
  166. package/layers/motion/app/assets/css/main.css +111 -0
  167. package/layers/motion/app/components/Motion/Marquee.vue +171 -0
  168. package/layers/motion/app/components/Motion/Parallax.vue +75 -0
  169. package/layers/motion/app/components/Motion/ScrollLink.vue +49 -0
  170. package/layers/motion/app/components/Motion/ScrollProgress.vue +127 -0
  171. package/layers/motion/app/components/Motion/ScrollStats.vue +102 -0
  172. package/layers/motion/app/components/Motion/Staggered.vue +73 -0
  173. package/layers/motion/app/components/Motion/TextReveal.vue +101 -0
  174. package/layers/motion/app/components/Motion/Transition.vue +89 -0
  175. package/layers/motion/app/components/Motion/VelocityEffect.vue +139 -0
  176. package/layers/motion/app/components/Motion/index.vue +16 -0
  177. package/layers/motion/app/composables/useGsap.ts +21 -0
  178. package/layers/motion/app/composables/useMotion.ts +137 -0
  179. package/layers/motion/app/composables/useSmoothScroll.ts +154 -0
  180. package/layers/motion/app/plugins/gsap.client.ts +15 -0
  181. package/layers/motion/app/plugins/locomotive-scroll.client.ts +49 -0
  182. package/layers/motion/app/utils/gsapAnimations.ts +122 -0
  183. package/layers/motion/app.config.ts +30 -0
  184. package/layers/motion/nuxt.config.ts +19 -0
  185. package/layers/motion/package.json +17 -0
  186. package/layers/motion/tsconfig.json +6 -0
  187. package/layers/shader/AGENTS.MD +195 -0
  188. package/layers/shader/additional-modular-tsl-shaders-for-claude/.prettierignore +6 -0
  189. package/layers/shader/additional-modular-tsl-shaders-for-claude/.prettierrc +18 -0
  190. package/layers/shader/additional-modular-tsl-shaders-for-claude/LICENSE +21 -0
  191. package/layers/shader/additional-modular-tsl-shaders-for-claude/README.md +100 -0
  192. package/layers/shader/additional-modular-tsl-shaders-for-claude/index.html +13 -0
  193. package/layers/shader/additional-modular-tsl-shaders-for-claude/jsconfig.json +30 -0
  194. package/layers/shader/additional-modular-tsl-shaders-for-claude/package.json +18 -0
  195. package/layers/shader/additional-modular-tsl-shaders-for-claude/pnpm-lock.yaml +633 -0
  196. package/layers/shader/additional-modular-tsl-shaders-for-claude/public/vite.svg +1 -0
  197. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/components/sketch/webgpu_sketch.js +128 -0
  198. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/components/sketches_dropdown/index.css +87 -0
  199. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/components/sketches_dropdown/sketches_dropdown.js +169 -0
  200. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/index.css +25 -0
  201. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/main.js +93 -0
  202. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/router.js +43 -0
  203. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/sketches/flare-1.js +68 -0
  204. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/sketches/noise/dawn-1.js +56 -0
  205. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/distortion/bulge_distortion.js +35 -0
  206. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/distortion/swirl_distortion.js +35 -0
  207. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/distortion/wave_distortion.js +43 -0
  208. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/common.js +145 -0
  209. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/curl_noise_3d.js +53 -0
  210. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/curl_noise_4d.js +55 -0
  211. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/fbm.js +163 -0
  212. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/perlin_noise_3d.js +70 -0
  213. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/simplex_noise_3d.js +59 -0
  214. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/simplex_noise_4d.js +72 -0
  215. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/noise/turbulence.js +41 -0
  216. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/patterns/canvas_weave_pattern.js +26 -0
  217. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/patterns/grain_texture_pattern.js +10 -0
  218. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/patterns/led_pattern.js +45 -0
  219. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/patterns/pixellation_pattern.js +15 -0
  220. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/patterns/speckled_noise_pattern.js +34 -0
  221. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/patterns/vignette_pattern.js +21 -0
  222. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/bulge_distortion_effect.js +27 -0
  223. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/chromatic_aberration_effect.js +45 -0
  224. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/crt_scanline_effect.js +45 -0
  225. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/dither_effect.js +126 -0
  226. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/grain_texture_effect.js +21 -0
  227. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/halftone_effect.js +44 -0
  228. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/led_effect.js +31 -0
  229. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/pixellation_effect.js +29 -0
  230. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/swirl_distortion_effect.js +25 -0
  231. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/vignette_effect.js +22 -0
  232. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/post_processing/wave_distortion_effect.js +27 -0
  233. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/color/cosine_palette.js +15 -0
  234. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/color/tonemapping.js +151 -0
  235. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/function/bloom.js +13 -0
  236. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/function/bloom_edge_pattern.js +20 -0
  237. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/function/domain_index.js +11 -0
  238. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/function/median3.js +22 -0
  239. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/function/repeating_pattern.js +13 -0
  240. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/function/screen_aspect_uv.js +14 -0
  241. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/lighting.js +60 -0
  242. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/math/complex.js +86 -0
  243. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/math/coordinates.js +119 -0
  244. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/sdf/operations.js +24 -0
  245. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/tsl/utils/sdf/shapes.js +182 -0
  246. package/layers/shader/additional-modular-tsl-shaders-for-claude/src/utils/math.js +33 -0
  247. package/layers/shader/additional-modular-tsl-shaders-for-claude/vite.config.js +23 -0
  248. package/layers/shader/app/assets/css/main.css +41 -0
  249. package/layers/shader/app/components/Effect/Bloom.vue +8 -0
  250. package/layers/shader/app/components/Effect/ChromaticAberration.vue +8 -0
  251. package/layers/shader/app/components/Effect/PostProcessing.vue +20 -0
  252. package/layers/shader/app/components/Material/AmbientAurora.vue +172 -0
  253. package/layers/shader/app/components/Material/AmbientFlow.vue +175 -0
  254. package/layers/shader/app/components/Material/AmbientGradientMesh.vue +173 -0
  255. package/layers/shader/app/components/Material/AmbientNebula.vue +181 -0
  256. package/layers/shader/app/components/Material/AmbientOcean.vue +161 -0
  257. package/layers/shader/app/components/Material/Fresnel.vue +89 -0
  258. package/layers/shader/app/components/Material/Gradient.vue +185 -0
  259. package/layers/shader/app/components/Material/Image.vue +232 -0
  260. package/layers/shader/app/components/Material/Node.vue +79 -0
  261. package/layers/shader/app/components/Material/Noise.vue +141 -0
  262. package/layers/shader/app/components/Mesh/Plane.vue +27 -0
  263. package/layers/shader/app/components/Shader/Background.vue +159 -0
  264. package/layers/shader/app/components/Shader/Canvas.vue +97 -0
  265. package/layers/shader/app/components/Shader/Debug.vue +66 -0
  266. package/layers/shader/app/components/WebGPUCanvas.client.vue +245 -0
  267. package/layers/shader/app/composables/useAmbientMaterials.ts +452 -0
  268. package/layers/shader/app/composables/useMousePosition.ts +94 -0
  269. package/layers/shader/app/composables/useRendererCapabilities.ts +111 -0
  270. package/layers/shader/app/composables/useShader.ts +148 -0
  271. package/layers/shader/app/composables/useShaderTime.ts +146 -0
  272. package/layers/shader/app/composables/useTSLNodes.ts +112 -0
  273. package/layers/shader/app/composables/useUniforms.ts +188 -0
  274. package/layers/shader/app/plugins/shader.client.ts +30 -0
  275. package/layers/shader/app/shaders/common/blend.ts +255 -0
  276. package/layers/shader/app/shaders/common/effects.ts +299 -0
  277. package/layers/shader/app/shaders/common/grain.ts +453 -0
  278. package/layers/shader/app/shaders/common/index.ts +22 -0
  279. package/layers/shader/app/shaders/common/lighting.ts +146 -0
  280. package/layers/shader/app/shaders/common/math.ts +250 -0
  281. package/layers/shader/app/shaders/common/noise.ts +823 -0
  282. package/layers/shader/app/shaders/common/noiseHelpers.ts +114 -0
  283. package/layers/shader/app/shaders/common/palette.ts +319 -0
  284. package/layers/shader/app/shaders/common/patterns.ts +216 -0
  285. package/layers/shader/app/shaders/common/sdf.ts +224 -0
  286. package/layers/shader/app/shaders/common/shapes.ts +366 -0
  287. package/layers/shader/app/shaders/common/tonemapping.ts +172 -0
  288. package/layers/shader/app/shaders/common/uv.ts +396 -0
  289. package/layers/shader/app/shaders/createMaterial.ts +314 -0
  290. package/layers/shader/app/shaders/index.ts +282 -0
  291. package/layers/shader/app/shaders/layers/aurora.ts +146 -0
  292. package/layers/shader/app/shaders/layers/index.ts +19 -0
  293. package/layers/shader/app/shaders/layers/meshGradient.ts +152 -0
  294. package/layers/shader/app/shaders/layers/paperShading.ts +148 -0
  295. package/layers/shader/app/shaders/layers/shaderGradient.ts +152 -0
  296. package/layers/shader/app/shaders/layers/stripe.ts +137 -0
  297. package/layers/shader/app/shaders/types.ts +12 -0
  298. package/layers/shader/app/types/index.ts +4 -0
  299. package/layers/shader/app/types/materials.ts +45 -0
  300. package/layers/shader/app/types/renderer.ts +50 -0
  301. package/layers/shader/app/types/tsl.ts +39 -0
  302. package/layers/shader/app/types/uniforms.ts +21 -0
  303. package/layers/shader/app/utils/tsl/animation.ts +251 -0
  304. package/layers/shader/app/utils/tsl/color.ts +189 -0
  305. package/layers/shader/app/utils/tsl/index.ts +84 -0
  306. package/layers/shader/app/utils/tsl/math.ts +111 -0
  307. package/layers/shader/app/utils/tsl/noise.ts +195 -0
  308. package/layers/shader/app/utils/tsl/patterns.ts +183 -0
  309. package/layers/shader/app/utils/tsl/uv.ts +145 -0
  310. package/layers/shader/app.config.ts +18 -0
  311. package/layers/shader/modular-tsl-shaders-for-claude/common/blend.tsl +1 -0
  312. package/layers/shader/modular-tsl-shaders-for-claude/common/noise.tsl +1 -0
  313. package/layers/shader/modular-tsl-shaders-for-claude/common/shapes.tsl +1 -0
  314. package/layers/shader/modular-tsl-shaders-for-claude/common/vertexFresnel.tsl +9 -0
  315. package/layers/shader/modular-tsl-shaders-for-claude/common/vertexPlane.tsl +6 -0
  316. package/layers/shader/modular-tsl-shaders-for-claude/effects/background.tsl +1 -0
  317. package/layers/shader/modular-tsl-shaders-for-claude/effects/gradient.tsl +1 -0
  318. package/layers/shader/modular-tsl-shaders-for-claude/effects/gradientLegend.tsl +1 -0
  319. package/layers/shader/modular-tsl-shaders-for-claude/effects/simpleGradient.tsl +1 -0
  320. package/layers/shader/modular-tsl-shaders-for-claude/layers/aurora.ts +1 -0
  321. package/layers/shader/modular-tsl-shaders-for-claude/layers/fragmentsTech.ts +1 -0
  322. package/layers/shader/modular-tsl-shaders-for-claude/layers/fresnel.ts +1 -0
  323. package/layers/shader/modular-tsl-shaders-for-claude/layers/linearGradient.ts +1 -0
  324. package/layers/shader/modular-tsl-shaders-for-claude/layers/meshGradient.ts +1 -0
  325. package/layers/shader/modular-tsl-shaders-for-claude/layers/noise.ts +1 -0
  326. package/layers/shader/modular-tsl-shaders-for-claude/layers/paperShading.ts +1 -0
  327. package/layers/shader/modular-tsl-shaders-for-claude/layers/radial.ts +1 -0
  328. package/layers/shader/modular-tsl-shaders-for-claude/layers/shaderGradient.ts +1 -0
  329. package/layers/shader/modular-tsl-shaders-for-claude/layers/stripe.ts +1 -0
  330. package/layers/shader/modular-tsl-shaders-for-claude/materials/createMaterial.ts +1 -0
  331. package/layers/shader/modular-tsl-shaders-for-claude/utils/glslUtils.ts +1 -0
  332. package/layers/shader/modular-tsl-shaders-for-claude/utils/palette.ts +1 -0
  333. package/layers/shader/nuxt.config.ts +48 -0
  334. package/layers/shader/package.json +17 -0
  335. package/layers/shader/tsconfig.json +6 -0
  336. package/layers/theme/app/assets/css/theme.css +47 -0
  337. package/layers/theme/app/components/ThemePicker/AccentButton.vue +51 -0
  338. package/layers/theme/app/components/ThemePicker/Colors.vue +22 -0
  339. package/layers/theme/app/components/ThemePicker/Menu.vue +108 -0
  340. package/layers/theme/app/components/ThemePicker/MenuButton.vue +9 -0
  341. package/layers/theme/app/composables/useThemePreferences.ts +158 -0
  342. package/layers/theme/app/plugins/theme.client.ts +5 -0
  343. package/layers/theme/app/types/theme.ts +34 -0
  344. package/layers/theme/app.config.ts +14 -0
  345. package/layers/theme/nuxt.config.ts +46 -0
  346. package/layers/theme/package.json +14 -0
  347. package/layers/theme/server/plugins/theme-fouc.ts +51 -0
  348. package/layers/theme/tsconfig.json +7 -0
  349. package/layers/ui/CLAUDE.MD +325 -0
  350. package/layers/ui/app/assets/css/main.css +4 -0
  351. package/layers/ui/app/components/Links/Group.vue +38 -0
  352. package/layers/ui/app/components/Links/Named.vue +32 -0
  353. package/layers/ui/app/components/Media/Picture.vue +41 -0
  354. package/layers/ui/app/components/Site/Title.vue +15 -0
  355. package/layers/ui/app/components/Typography/CodeBlock.vue +37 -0
  356. package/layers/ui/app/components/Typography/Headline.vue +73 -0
  357. package/layers/ui/app/components/Typography/QuoteBlock.vue +13 -0
  358. package/layers/ui/app/components/Typography/TextStroke.vue +109 -0
  359. package/layers/ui/app/components/Typography/index.vue +49 -0
  360. package/layers/ui/app/composables/color.ts +36 -0
  361. package/layers/ui/app/composables/picture.ts +145 -0
  362. package/layers/ui/app/composables/typography.ts +77 -0
  363. package/layers/ui/app/layouts/default.vue +4 -0
  364. package/layers/ui/app/pages/index.vue +236 -0
  365. package/layers/ui/app/types/breakpoints.ts +179 -0
  366. package/layers/ui/app/types/colors.ts +29 -0
  367. package/layers/ui/app/types/media.ts +185 -0
  368. package/layers/ui/app/types/typography.ts +108 -0
  369. package/layers/ui/app/utils/regex.ts +6 -0
  370. package/layers/ui/app.config.ts +12 -0
  371. package/layers/ui/nuxt.config.ts +38 -0
  372. package/layers/ui/package.json +14 -0
  373. package/layers/ui/tsconfig.json +6 -0
  374. package/package.json +128 -0
  375. package/playgroundOLD/app.config.ts +5 -0
  376. package/playgroundOLD/nuxt.config.ts +12 -0
  377. package/pnpm-workspace.yaml +6 -0
  378. package/prettier.config.cjs +19 -0
  379. package/stylelint.config.mjs +111 -0
  380. package/turbo.json +16 -0
@@ -0,0 +1,111 @@
1
+ /* Motion Layer CSS */
2
+ .motion-layer {
3
+ /* Base styles for motion layer */
4
+ }
5
+
6
+ /* Transition classes */
7
+ .transition-default {
8
+ transition-duration: 300ms;
9
+ transition-property: all;
10
+ transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
11
+ }
12
+
13
+ .transition-fade {
14
+ transition-duration: 300ms;
15
+ transition-property: opacity;
16
+ transition-timing-function: ease-out;
17
+ }
18
+
19
+ .transition-slide {
20
+ transition-duration: 300ms;
21
+ transition-property: transform, opacity;
22
+ transition-timing-function: ease-out;
23
+ }
24
+
25
+ /* Animation classes */
26
+ .animate-fade-in {
27
+ animation: fadeIn 0.3s ease-out forwards;
28
+ }
29
+
30
+ .animate-fade-out {
31
+ animation: fadeOut 0.3s ease-out forwards;
32
+ }
33
+
34
+ .animate-slide-in-up {
35
+ animation: slideInUp 0.3s ease-out forwards;
36
+ }
37
+
38
+ .animate-slide-in-down {
39
+ animation: slideInDown 0.3s ease-out forwards;
40
+ }
41
+
42
+ .animate-slide-in-left {
43
+ animation: slideInLeft 0.3s ease-out forwards;
44
+ }
45
+
46
+ .animate-slide-in-right {
47
+ animation: slideInRight 0.3s ease-out forwards;
48
+ }
49
+
50
+ /* Keyframes */
51
+ @keyframes fadeIn {
52
+ from {
53
+ opacity: 0;
54
+ }
55
+ to {
56
+ opacity: 1;
57
+ }
58
+ }
59
+
60
+ @keyframes fadeOut {
61
+ from {
62
+ opacity: 1;
63
+ }
64
+ to {
65
+ opacity: 0;
66
+ }
67
+ }
68
+
69
+ @keyframes slideInUp {
70
+ from {
71
+ transform: translateY(20px);
72
+ opacity: 0;
73
+ }
74
+ to {
75
+ transform: translateY(0);
76
+ opacity: 1;
77
+ }
78
+ }
79
+
80
+ @keyframes slideInDown {
81
+ from {
82
+ transform: translateY(-20px);
83
+ opacity: 0;
84
+ }
85
+ to {
86
+ transform: translateY(0);
87
+ opacity: 1;
88
+ }
89
+ }
90
+
91
+ @keyframes slideInLeft {
92
+ from {
93
+ transform: translateX(-20px);
94
+ opacity: 0;
95
+ }
96
+ to {
97
+ transform: translateX(0);
98
+ opacity: 1;
99
+ }
100
+ }
101
+
102
+ @keyframes slideInRight {
103
+ from {
104
+ transform: translateX(20px);
105
+ opacity: 0;
106
+ }
107
+ to {
108
+ transform: translateX(0);
109
+ opacity: 1;
110
+ }
111
+ }
@@ -0,0 +1,171 @@
1
+ <script setup lang="ts">
2
+ const props = withDefaults(
3
+ defineProps<{
4
+ /**
5
+ * Base animation speed in pixels per second
6
+ */
7
+ speed?: number
8
+ /**
9
+ * Direction of scroll
10
+ */
11
+ direction?: 'left' | 'right'
12
+ /**
13
+ * Pause animation on hover
14
+ */
15
+ pauseOnHover?: boolean
16
+ /**
17
+ * Gap between repeated items
18
+ */
19
+ gap?: string
20
+ /**
21
+ * Enable velocity-based speed (scroll velocity affects marquee speed)
22
+ */
23
+ velocityBased?: boolean
24
+ /**
25
+ * How much scroll velocity affects speed (0-1)
26
+ * 0 = no effect, 1 = velocity fully controls speed
27
+ */
28
+ velocitySensitivity?: number
29
+ /**
30
+ * Reverse direction based on scroll direction
31
+ */
32
+ velocityDirection?: boolean
33
+ /**
34
+ * Minimum speed multiplier when using velocity
35
+ */
36
+ minSpeed?: number
37
+ /**
38
+ * Maximum speed multiplier when using velocity
39
+ */
40
+ maxSpeed?: number
41
+ }>(),
42
+ {
43
+ speed: 50,
44
+ direction: 'left',
45
+ pauseOnHover: true,
46
+ gap: '2rem',
47
+ velocityBased: false,
48
+ velocitySensitivity: 0.5,
49
+ velocityDirection: false,
50
+ minSpeed: 0.2,
51
+ maxSpeed: 5,
52
+ }
53
+ )
54
+
55
+ const { gsap } = useGsap()
56
+ const { velocity: scrollVelocity, direction: scrollDirection } = useSmoothScroll()
57
+
58
+ const containerRef = ref<HTMLElement | null>(null)
59
+ const contentRef = ref<HTMLElement | null>(null)
60
+ const tweenRef = ref<gsap.core.Tween | null>(null)
61
+
62
+ const isPaused = ref(false)
63
+ const currentTimeScale = ref(1)
64
+
65
+ onMounted(() => {
66
+ if (!containerRef.value || !contentRef.value) return
67
+
68
+ const content = contentRef.value
69
+ const contentWidth = content.offsetWidth
70
+
71
+ // Set up the infinite scroll animation
72
+ tweenRef.value = gsap.to(content, {
73
+ x: props.direction === 'left' ? -contentWidth / 2 : contentWidth / 2,
74
+ duration: contentWidth / props.speed,
75
+ ease: 'none',
76
+ repeat: -1,
77
+ modifiers: {
78
+ x: gsap.utils.unitize((x) => {
79
+ const mod = contentWidth / 2
80
+ return props.direction === 'left' ? parseFloat(x) % mod : -Math.abs(parseFloat(x) % mod)
81
+ }),
82
+ },
83
+ })
84
+ })
85
+
86
+ // Watch velocity changes for velocity-based animation
87
+ watch(
88
+ [scrollVelocity, scrollDirection],
89
+ ([vel, dir]) => {
90
+ if (!props.velocityBased || !tweenRef.value || isPaused.value) return
91
+
92
+ // Calculate velocity multiplier
93
+ const absVelocity = Math.abs(vel)
94
+ const velocityEffect = absVelocity * props.velocitySensitivity * 0.02
95
+
96
+ // Base multiplier from velocity magnitude
97
+ let multiplier = 1 + velocityEffect
98
+
99
+ // Clamp to min/max
100
+ multiplier = Math.max(props.minSpeed, Math.min(props.maxSpeed, multiplier))
101
+
102
+ // Optionally reverse direction based on scroll direction
103
+ if (props.velocityDirection && dir !== 0) {
104
+ const baseDirection = props.direction === 'left' ? 1 : -1
105
+ multiplier *= dir * baseDirection
106
+ }
107
+
108
+ // Smoothly interpolate to target
109
+ gsap.to(currentTimeScale, {
110
+ value: multiplier,
111
+ duration: 0.3,
112
+ ease: 'power2.out',
113
+ onUpdate: () => {
114
+ if (tweenRef.value) {
115
+ tweenRef.value.timeScale(currentTimeScale.value)
116
+ }
117
+ },
118
+ })
119
+ },
120
+ { immediate: false }
121
+ )
122
+
123
+ onUnmounted(() => {
124
+ tweenRef.value?.kill()
125
+ })
126
+
127
+ function handleMouseEnter() {
128
+ if (props.pauseOnHover && tweenRef.value) {
129
+ gsap.to(tweenRef.value, { timeScale: 0, duration: 0.5 })
130
+ isPaused.value = true
131
+ }
132
+ }
133
+
134
+ function handleMouseLeave() {
135
+ if (props.pauseOnHover && tweenRef.value) {
136
+ gsap.to(tweenRef.value, { timeScale: currentTimeScale.value, duration: 0.5 })
137
+ isPaused.value = false
138
+ }
139
+ }
140
+ </script>
141
+
142
+ <template>
143
+ <div
144
+ ref="containerRef"
145
+ class="motion-marquee"
146
+ :class="{ 'is-paused': isPaused }"
147
+ @mouseenter="handleMouseEnter"
148
+ @mouseleave="handleMouseLeave"
149
+ >
150
+ <div ref="contentRef" class="motion-marquee__content" :style="{ gap }">
151
+ <slot />
152
+ <!-- Duplicate for seamless loop -->
153
+ <slot />
154
+ </div>
155
+ </div>
156
+ </template>
157
+
158
+ <style scoped>
159
+ .motion-marquee {
160
+ width: 100%;
161
+ overflow: hidden;
162
+ }
163
+
164
+ /* stylelint-disable-next-line selector-class-pattern */
165
+ .motion-marquee__content {
166
+ display: flex;
167
+ will-change: transform;
168
+ /* stylelint-disable-next-line plugin/no-unsupported-browser-features */
169
+ width: max-content;
170
+ }
171
+ </style>
@@ -0,0 +1,75 @@
1
+ <script setup lang="ts">
2
+ const props = withDefaults(
3
+ defineProps<{
4
+ /**
5
+ * Parallax speed (-1 to 1, negative = slower than scroll)
6
+ */
7
+ speed?: number
8
+ /**
9
+ * Direction of parallax movement
10
+ */
11
+ direction?: 'vertical' | 'horizontal'
12
+ /**
13
+ * Enable rotation during parallax
14
+ */
15
+ rotate?: number
16
+ /**
17
+ * Enable scale during parallax
18
+ */
19
+ scale?: number
20
+ /**
21
+ * Scrub smoothness (0.1 = very smooth, 1 = instant)
22
+ */
23
+ scrub?: number
24
+ /**
25
+ * Tag to render as
26
+ */
27
+ as?: string
28
+ }>(),
29
+ {
30
+ speed: 0.5,
31
+ direction: 'vertical',
32
+ rotate: 0,
33
+ scale: 0,
34
+ scrub: 0.5,
35
+ as: 'div',
36
+ }
37
+ )
38
+
39
+ const { gsap, ScrollTrigger } = useGsap()
40
+
41
+ const containerRef = ref<HTMLElement | null>(null)
42
+ const contentRef = ref<HTMLElement | null>(null)
43
+
44
+ onMounted(() => {
45
+ if (!containerRef.value || !contentRef.value) return
46
+
47
+ const yAmount = props.direction === 'vertical' ? props.speed * -200 : 0
48
+ const xAmount = props.direction === 'horizontal' ? props.speed * 200 : 0
49
+
50
+ const animationProps: gsap.TweenVars = {
51
+ scrollTrigger: {
52
+ trigger: containerRef.value,
53
+ start: 'top bottom',
54
+ end: 'bottom top',
55
+ scrub: props.scrub,
56
+ },
57
+ ease: 'none',
58
+ }
59
+
60
+ if (yAmount !== 0) animationProps.y = yAmount
61
+ if (xAmount !== 0) animationProps.x = xAmount
62
+ if (props.rotate !== 0) animationProps.rotation = props.rotate
63
+ if (props.scale !== 0) animationProps.scale = 1 + props.scale
64
+
65
+ gsap.to(contentRef.value, animationProps)
66
+ })
67
+ </script>
68
+
69
+ <template>
70
+ <component :is="as" ref="containerRef" class="motion-parallax">
71
+ <div ref="contentRef" class="motion-parallax-content will-change-transform">
72
+ <slot />
73
+ </div>
74
+ </component>
75
+ </template>
@@ -0,0 +1,49 @@
1
+ <script setup lang="ts">
2
+ const props = withDefaults(
3
+ defineProps<{
4
+ /**
5
+ * Target to scroll to (selector, element, or pixel position)
6
+ */
7
+ to: string | number
8
+ /**
9
+ * Scroll duration in seconds
10
+ */
11
+ duration?: number
12
+ /**
13
+ * Offset from target (negative = above target)
14
+ */
15
+ offset?: number
16
+ /**
17
+ * Tag to render as
18
+ */
19
+ as?: string
20
+ }>(),
21
+ {
22
+ duration: 1.5,
23
+ offset: 0,
24
+ as: 'button',
25
+ }
26
+ )
27
+
28
+ const emit = defineEmits<{
29
+ scrollStart: []
30
+ scrollComplete: []
31
+ }>()
32
+
33
+ const { scrollTo } = useSmoothScroll()
34
+
35
+ function handleClick() {
36
+ emit('scrollStart')
37
+ scrollTo(props.to, {
38
+ duration: props.duration,
39
+ offset: props.offset,
40
+ onComplete: () => emit('scrollComplete'),
41
+ })
42
+ }
43
+ </script>
44
+
45
+ <template>
46
+ <component :is="as" class="motion-scroll-link" @click="handleClick">
47
+ <slot />
48
+ </component>
49
+ </template>
@@ -0,0 +1,127 @@
1
+ <script setup lang="ts">
2
+ const props = withDefaults(
3
+ defineProps<{
4
+ /**
5
+ * Display type: linear bar or circular
6
+ */
7
+ type?: 'linear' | 'circular'
8
+ /**
9
+ * Size for circular progress (px)
10
+ */
11
+ size?: number
12
+ /**
13
+ * Stroke width for circular progress
14
+ */
15
+ strokeWidth?: number
16
+ /**
17
+ * Show percentage text
18
+ */
19
+ showPercentage?: boolean
20
+ /**
21
+ * Gradient colors (start, middle, end)
22
+ */
23
+ colors?: [string, string, string]
24
+ /**
25
+ * Background color
26
+ */
27
+ bgColor?: string
28
+ /**
29
+ * Height for linear progress bar (px)
30
+ */
31
+ height?: number
32
+ }>(),
33
+ {
34
+ type: 'linear',
35
+ size: 120,
36
+ strokeWidth: 8,
37
+ showPercentage: true,
38
+ colors: () => ['var(--color-primary-500)', 'rgb(168, 85, 247)', 'rgb(236, 72, 153)'],
39
+ bgColor: 'rgb(31, 41, 55)',
40
+ height: 4,
41
+ }
42
+ )
43
+
44
+ const { progress } = useSmoothScroll()
45
+
46
+ const percentage = computed(() => Math.round(progress.value * 100))
47
+
48
+ // For circular progress
49
+ const radius = computed(() => (props.size - props.strokeWidth) / 2)
50
+ const circumference = computed(() => 2 * Math.PI * radius.value)
51
+ const strokeDasharray = computed(
52
+ () => `${progress.value * circumference.value} ${circumference.value}`
53
+ )
54
+
55
+ // Generate gradient ID
56
+ const gradientId = `scroll-progress-gradient-${Math.random().toString(36).slice(2, 9)}`
57
+ </script>
58
+
59
+ <template>
60
+ <!-- Linear Progress -->
61
+ <div v-if="type === 'linear'" class="motion-scroll-progress-linear">
62
+ <div
63
+ class="w-full rounded-full overflow-hidden"
64
+ :style="{ height: `${height}px`, backgroundColor: bgColor }"
65
+ >
66
+ <div
67
+ class="h-full rounded-full transition-[width] duration-100"
68
+ :style="{
69
+ width: `${percentage}%`,
70
+ background: `linear-gradient(to right, ${colors[0]}, ${colors[1]}, ${colors[2]})`,
71
+ }"
72
+ />
73
+ </div>
74
+ <span v-if="showPercentage" class="text-sm font-medium tabular-nums mt-2 block text-center">
75
+ {{ percentage }}%
76
+ </span>
77
+ </div>
78
+
79
+ <!-- Circular Progress -->
80
+ <div
81
+ v-else
82
+ class="motion-scroll-progress-circular relative inline-flex items-center justify-center"
83
+ >
84
+ <svg :width="size" :height="size" class="-rotate-90" :viewBox="`0 0 ${size} ${size}`">
85
+ <!-- Background circle -->
86
+ <circle
87
+ :cx="size / 2"
88
+ :cy="size / 2"
89
+ :r="radius"
90
+ fill="none"
91
+ :stroke="bgColor"
92
+ :stroke-width
93
+ />
94
+ <!-- Progress circle -->
95
+ <circle
96
+ :cx="size / 2"
97
+ :cy="size / 2"
98
+ :r="radius"
99
+ fill="none"
100
+ :stroke="`url(#${gradientId})`"
101
+ :stroke-width
102
+ stroke-linecap="round"
103
+ :stroke-dasharray
104
+ class="transition-[stroke-dasharray] duration-100"
105
+ />
106
+ <defs>
107
+ <linearGradient :id="gradientId" x1="0%" y1="0%" x2="100%" y2="0%">
108
+ <stop offset="0%" :style="`stop-color: ${colors[0]}`" />
109
+ <stop offset="50%" :style="`stop-color: ${colors[1]}`" />
110
+ <stop offset="100%" :style="`stop-color: ${colors[2]}`" />
111
+ </linearGradient>
112
+ </defs>
113
+ </svg>
114
+ <span
115
+ v-if="showPercentage"
116
+ class="absolute inset-0 flex items-center justify-center text-2xl font-bold tabular-nums"
117
+ >
118
+ {{ percentage }}%
119
+ </span>
120
+ </div>
121
+ </template>
122
+
123
+ <style scoped>
124
+ .tabular-nums {
125
+ font-variant-numeric: tabular-nums;
126
+ }
127
+ </style>
@@ -0,0 +1,102 @@
1
+ <script setup lang="ts">
2
+ const props = withDefaults(
3
+ defineProps<{
4
+ /**
5
+ * Which stats to show
6
+ */
7
+ show?: ('velocity' | 'progress' | 'direction' | 'scrollY')[]
8
+ /**
9
+ * Position on screen
10
+ */
11
+ position?: 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right'
12
+ /**
13
+ * Use compact layout
14
+ */
15
+ compact?: boolean
16
+ }>(),
17
+ {
18
+ show: () => ['velocity', 'progress', 'direction'],
19
+ position: 'bottom-right',
20
+ compact: false,
21
+ }
22
+ )
23
+
24
+ const { velocity, progress, direction, scrollY } = useSmoothScroll()
25
+
26
+ const isScrolling = computed(() => Math.abs(velocity.value) > 0.01)
27
+
28
+ const positionClasses = computed(() => {
29
+ const classes = ['fixed', 'z-50']
30
+ switch (props.position) {
31
+ case 'top-left':
32
+ classes.push('top-4', 'left-4')
33
+ break
34
+ case 'top-right':
35
+ classes.push('top-4', 'right-4')
36
+ break
37
+ case 'bottom-left':
38
+ classes.push('bottom-4', 'left-4')
39
+ break
40
+ case 'bottom-right':
41
+ default:
42
+ classes.push('bottom-4', 'right-4')
43
+ break
44
+ }
45
+ return classes
46
+ })
47
+
48
+ const directionLabel = computed(() => {
49
+ if (direction.value > 0) return 'DOWN'
50
+ if (direction.value < 0) return 'UP'
51
+ return 'IDLE'
52
+ })
53
+ </script>
54
+
55
+ <template>
56
+ <div
57
+ class="bg-black/80 backdrop-blur-sm text-white rounded-xl transition-opacity duration-300"
58
+ :class="[
59
+ ...positionClasses,
60
+ isScrolling ? 'opacity-100' : 'opacity-60',
61
+ compact ? 'px-3 py-2' : 'px-4 py-3',
62
+ ]"
63
+ >
64
+ <div class="flex items-center" :class="[compact ? 'gap-4 text-xs' : 'gap-6 text-sm']">
65
+ <!-- Scrolling indicator -->
66
+ <div
67
+ class="w-2 h-2 rounded-full transition-colors duration-100"
68
+ :class="isScrolling ? 'bg-green-500' : 'bg-gray-600'"
69
+ />
70
+
71
+ <!-- Velocity -->
72
+ <div v-if="show.includes('velocity')" class="text-center">
73
+ <div v-if="!compact" class="text-gray-500 text-xs mb-0.5">VEL</div>
74
+ <div class="font-medium tabular-nums">{{ velocity.toFixed(2) }}</div>
75
+ </div>
76
+
77
+ <!-- Progress -->
78
+ <div v-if="show.includes('progress')" class="text-center">
79
+ <div v-if="!compact" class="text-gray-500 text-xs mb-0.5">PROG</div>
80
+ <div class="font-medium tabular-nums">{{ (progress * 100).toFixed(0) }}%</div>
81
+ </div>
82
+
83
+ <!-- Direction -->
84
+ <div v-if="show.includes('direction')" class="text-center">
85
+ <div v-if="!compact" class="text-gray-500 text-xs mb-0.5">DIR</div>
86
+ <div class="font-medium">{{ directionLabel }}</div>
87
+ </div>
88
+
89
+ <!-- Scroll Y -->
90
+ <div v-if="show.includes('scrollY')" class="text-center">
91
+ <div v-if="!compact" class="text-gray-500 text-xs mb-0.5">Y</div>
92
+ <div class="font-medium tabular-nums">{{ Math.round(scrollY) }}px</div>
93
+ </div>
94
+ </div>
95
+ </div>
96
+ </template>
97
+
98
+ <style scoped>
99
+ .tabular-nums {
100
+ font-variant-numeric: tabular-nums;
101
+ }
102
+ </style>
@@ -0,0 +1,73 @@
1
+ <script setup lang="ts">
2
+ // Props
3
+ const props = withDefaults(
4
+ defineProps<{
5
+ staggerDelay?: number
6
+ initialDelay?: number
7
+ animation?: string
8
+ }>(),
9
+ {
10
+ staggerDelay: 100,
11
+ initialDelay: 0,
12
+ animation: 'fadeIn',
13
+ }
14
+ )
15
+
16
+ // State
17
+ const items = ref<HTMLElement[]>([])
18
+ const animatedItems = ref<boolean[]>([])
19
+
20
+ // Slots
21
+ const slots = useSlots()
22
+
23
+ // Methods
24
+ const setItemRef = (el: HTMLElement | null, index: number) => {
25
+ if (el) {
26
+ items.value[index] = el
27
+ animatedItems.value[index] = false
28
+ }
29
+ }
30
+
31
+ // Lifecycle
32
+ onMounted(() => {
33
+ // Animate items with staggered delay
34
+ setTimeout(() => {
35
+ items.value.forEach((item, index) => {
36
+ if (item) {
37
+ setTimeout(
38
+ () => {
39
+ animatedItems.value[index] = true
40
+ item.classList.add(`animate-${props.animation}`, 'animated')
41
+ },
42
+ props.initialDelay + index * props.staggerDelay
43
+ )
44
+ }
45
+ })
46
+ }, 100)
47
+ })
48
+ </script>
49
+
50
+ <template>
51
+ <div class="motion-staggered">
52
+ <slot
53
+ v-for="(item, index) in slots.default?.()"
54
+ :key="index"
55
+ :ref="(el: HTMLElement | null) => setItemRef(el, index)"
56
+ :class="{ animated: animatedItems[index] }"
57
+ />
58
+ </div>
59
+ </template>
60
+
61
+ <style scoped>
62
+ /* stylelint-disable selector-pseudo-class-no-unknown */
63
+ .motion-staggered :deep(.animated) {
64
+ transform: translateY(0);
65
+ opacity: 1;
66
+ }
67
+
68
+ .motion-staggered :deep(*) {
69
+ transform: translateY(20px);
70
+ opacity: 0;
71
+ transition: all 0.3s ease-out;
72
+ }
73
+ </style>