kmcom-nuxt-layers 1.7.8 → 2.1.6

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 (520) hide show
  1. package/docs/layout-shift-causes.md +94 -0
  2. package/layers/animations/nuxt.config.ts +17 -0
  3. package/layers/animations/package.json +6 -0
  4. package/layers/animations/tsconfig.json +7 -0
  5. package/layers/canvas/app/components/ShaderCanvas.vue +125 -0
  6. package/layers/{shader → canvas}/app/composables/useRendererCapabilities.ts +10 -2
  7. package/layers/{shader → canvas}/app/composables/useShaderTime.ts +3 -3
  8. package/layers/canvas/app/types/renderer.ts +50 -0
  9. package/layers/canvas/nuxt.config.ts +189 -0
  10. package/layers/canvas/package.json +22 -0
  11. package/layers/canvas/tsconfig.json +7 -0
  12. package/layers/content/app/components/Blog/Article.vue +12 -6
  13. package/layers/content/app/components/Blog/Card.vue +24 -24
  14. package/layers/content/app/components/Blog/List.vue +8 -11
  15. package/layers/content/app/components/Gallery/AmbientImage.vue +15 -15
  16. package/layers/content/app/components/Gallery/Card.vue +19 -19
  17. package/layers/content/app/components/Gallery/Detail.vue +29 -20
  18. package/layers/content/app/components/Gallery/Grid.vue +8 -11
  19. package/layers/content/app/components/Gallery/ImageDetail.vue +18 -17
  20. package/layers/content/app/components/Gallery/ImagePage.vue +8 -9
  21. package/layers/content/app/components/Gallery/Lightbox.vue +38 -33
  22. package/layers/content/app/components/Gallery/Page.vue +8 -8
  23. package/layers/content/app/components/Gallery/SlugPage.vue +7 -8
  24. package/layers/content/app/components/NuxtContent/Detail.vue +29 -27
  25. package/layers/content/app/components/NuxtContent/List.vue +10 -9
  26. package/layers/content/app/components/NuxtContent/Renderer.vue +4 -4
  27. package/layers/content/app/components/NuxtContent/Surround.vue +3 -3
  28. package/layers/content/app/components/NuxtContent/Toc.vue +5 -5
  29. package/layers/content/app/components/Portfolio/Card.vue +17 -17
  30. package/layers/content/app/components/Portfolio/ColorPalette.vue +11 -11
  31. package/layers/content/app/components/Portfolio/Detail.vue +9 -13
  32. package/layers/content/app/components/Portfolio/ItemPage.vue +8 -9
  33. package/layers/content/app/components/Portfolio/List.vue +10 -13
  34. package/layers/content/app/components/Portfolio/Page.vue +8 -8
  35. package/layers/content/app/components/Portfolio/Typography.vue +4 -4
  36. package/layers/content/app/components/content/Figure.vue +14 -14
  37. package/layers/content/app/composables/createPortfolioComposables.ts +1 -0
  38. package/layers/content/app/composables/useCollectionItem.ts +4 -1
  39. package/layers/content/app/composables/useCollectionSurround.ts +1 -0
  40. package/layers/content/app/composables/useContentPage.ts +1 -0
  41. package/layers/content/app/composables/useGalleryItems.ts +1 -0
  42. package/layers/content/app/composables/usePortfolioItems.ts +1 -0
  43. package/layers/content/app/types/app-config.d.ts +1 -1
  44. package/layers/content/app/types/content.ts +27 -30
  45. package/layers/content/nuxt.config.ts +4 -3
  46. package/layers/content/package.json +4 -4
  47. package/layers/core/app/components/DiagnosticsPage.vue +203 -203
  48. package/layers/core/app/components/ErrorBoundary.vue +51 -49
  49. package/layers/core/app/components/LoadingScreen.vue +112 -111
  50. package/layers/core/app/composables/useBrowser.ts +2 -1
  51. package/layers/core/app/composables/useCache.ts +4 -2
  52. package/layers/core/app/composables/useErrorLog.ts +7 -10
  53. package/layers/core/app/composables/useFeatures.ts +4 -2
  54. package/layers/core/app/composables/useLoading.ts +1 -0
  55. package/layers/core/app/composables/useNetworkInfo.ts +1 -0
  56. package/layers/core/app/composables/usePWAInfo.ts +4 -3
  57. package/layers/core/app/composables/useRendering.ts +1 -0
  58. package/layers/core/app/composables/useScreen.ts +1 -0
  59. package/layers/core/app/composables/useScrollGuard.ts +2 -1
  60. package/layers/core/app/pages/[...slug].vue +99 -99
  61. package/layers/core/app/plugins/error-handler.ts +1 -1
  62. package/layers/core/app/plugins/feature-detection.client.ts +2 -1
  63. package/layers/core/app/plugins/init.ts +8 -19
  64. package/layers/core/app/plugins/loading.client.ts +4 -2
  65. package/layers/core/app/plugins/scroll-guard.client.ts +4 -4
  66. package/layers/core/app/types/app-config.d.ts +5 -1
  67. package/layers/core/app/types/detection.ts +8 -8
  68. package/layers/core/app/types/index.ts +5 -4
  69. package/layers/core/app/types/loading.ts +3 -3
  70. package/layers/core/app/types/runtime-config.ts +2 -2
  71. package/layers/core/app/types/scroll-guard.ts +2 -2
  72. package/layers/core/app/types/site.ts +43 -0
  73. package/layers/core/app/utils/helpers.ts +4 -0
  74. package/layers/core/nuxt.config.ts +1 -0
  75. package/layers/core/package.json +1 -1
  76. package/layers/feeds/app/app.config.ts +23 -0
  77. package/layers/feeds/app/assets/css/feeds.css +66 -0
  78. package/layers/feeds/app/plugins/feed-head.ts +73 -0
  79. package/layers/feeds/nuxt.config.ts +36 -0
  80. package/layers/feeds/package.json +23 -0
  81. package/layers/feeds/tsconfig.json +7 -0
  82. package/layers/forms/app/components/Form/Contact.vue +1 -0
  83. package/layers/forms/app/components/Form/Field.vue +70 -74
  84. package/layers/forms/app/composables/useFormSchema.ts +2 -0
  85. package/layers/forms/app/config/fields.ts +1 -0
  86. package/layers/forms/app/types/app-config.d.ts +1 -1
  87. package/layers/forms/app/types/fields.ts +1 -1
  88. package/layers/forms/nuxt.config.ts +4 -9
  89. package/layers/forms/package.json +4 -9
  90. package/layers/layout/app/assets/css/layout/grids.css +12 -12
  91. package/layers/layout/app/assets/css/layout/modes/fluid.css +10 -10
  92. package/layers/layout/app/components/Layout/Container.vue +34 -34
  93. package/layers/layout/app/components/Layout/Grid/Debug.vue +55 -55
  94. package/layers/layout/app/components/Layout/Grid/Item.vue +239 -231
  95. package/layers/layout/app/components/Layout/Main.vue +27 -23
  96. package/layers/layout/app/components/Layout/Page/Container.vue +71 -67
  97. package/layers/layout/app/components/Layout/Page/Header.vue +22 -21
  98. package/layers/layout/app/components/Layout/Page/index.vue +1 -0
  99. package/layers/layout/app/components/Layout/Section/Gallery.vue +49 -48
  100. package/layers/layout/app/components/Layout/Section/Grid.vue +29 -29
  101. package/layers/layout/app/components/Layout/Section/Hero.vue +31 -29
  102. package/layers/layout/app/components/Layout/Section/Sidebar.vue +48 -48
  103. package/layers/layout/app/components/Layout/Section/Split.vue +28 -28
  104. package/layers/layout/app/components/Layout/Section/Stack.vue +39 -37
  105. package/layers/layout/app/components/Layout/Section/Title.vue +21 -20
  106. package/layers/layout/app/composables/GridPlacement.ts +1 -1
  107. package/layers/layout/app/composables/useGridConfig.ts +2 -1
  108. package/layers/layout/app/types/app-config.d.ts +2 -1
  109. package/layers/layout/app/types/layouts.ts +4 -4
  110. package/layers/layout/nuxt.config.ts +4 -1
  111. package/layers/mailer/nuxt.config.ts +26 -0
  112. package/layers/mailer/package.json +15 -0
  113. package/layers/mailer/tsconfig.json +7 -0
  114. package/layers/motion/app/components/Motion/index.vue +5 -5
  115. package/layers/motion/nuxt.config.ts +6 -22
  116. package/layers/motion/package.json +0 -5
  117. package/layers/navigation/app/app.config.ts +38 -0
  118. package/layers/navigation/app/assets/css/navigation.css +3 -0
  119. package/layers/navigation/app/components/Links/Group.vue +49 -0
  120. package/layers/navigation/app/components/Links/Named.vue +33 -0
  121. package/layers/navigation/app/components/Mast/Footer.vue +13 -0
  122. package/layers/{ui → navigation}/app/components/Mast/Header.vue +2 -2
  123. package/layers/{ui → navigation}/app/components/Mast/Nav.vue +2 -2
  124. package/layers/navigation/app/components/Mast/NavModal.vue +76 -0
  125. package/layers/{ui → navigation}/app/composables/mastNav.ts +7 -4
  126. package/layers/{ui → navigation}/app/composables/toast.ts +1 -0
  127. package/layers/{ui → navigation}/app/composables/useSite.ts +1 -0
  128. package/layers/navigation/app/types/nav.ts +11 -0
  129. package/layers/{ui → navigation}/app/utils/createModal.ts +2 -1
  130. package/layers/navigation/nuxt.config.ts +19 -0
  131. package/layers/navigation/package.json +6 -0
  132. package/layers/navigation/tsconfig.json +7 -0
  133. package/layers/page-transitions/app/app.config.ts +15 -0
  134. package/layers/page-transitions/app/composables/usePageTransition.ts +32 -0
  135. package/layers/page-transitions/app/plugins/page-transitions.client.ts +14 -0
  136. package/layers/page-transitions/nuxt.config.ts +17 -0
  137. package/layers/page-transitions/package.json +6 -0
  138. package/layers/page-transitions/tsconfig.json +7 -0
  139. package/layers/routing/app/composables/{useFeatures.ts → useFeatureFlags.ts} +1 -1
  140. package/layers/routing/app/composables/useRoutingConfig.ts +5 -6
  141. package/layers/routing/app/middleware/01.maintenance.global.ts +1 -1
  142. package/layers/routing/app/middleware/02.governance.global.ts +2 -2
  143. package/layers/routing/app/plugins/feature-flags.client.ts +4 -4
  144. package/layers/routing/app/plugins/scroll-routing.client.ts +4 -3
  145. package/layers/routing/app/types/app-config.d.ts +2 -1
  146. package/layers/routing/app/types/route-meta.d.ts +1 -1
  147. package/layers/routing/app/types/routing.ts +5 -2
  148. package/layers/routing/app/utils/resolveRoute.ts +2 -2
  149. package/layers/routing/nuxt.config.ts +6 -2
  150. package/layers/scripts/app/app.config.ts +44 -0
  151. package/layers/scripts/app/composables/useAnalytics.ts +49 -0
  152. package/layers/scripts/app/composables/useGtm.ts +21 -0
  153. package/layers/scripts/app/composables/useScriptLoader.ts +31 -0
  154. package/layers/scripts/app/composables/useScriptsConsent.ts +23 -0
  155. package/layers/scripts/app/composables/useYoutubeEmbed.ts +14 -0
  156. package/layers/scripts/nuxt.config.ts +22 -0
  157. package/layers/scripts/package.json +14 -0
  158. package/layers/scripts/tsconfig.json +7 -0
  159. package/layers/{motion/app/types/app-config.d.ts → scroll/app/app.config.ts} +16 -1
  160. package/layers/scroll/app/components/Motion/HorizontalScroll.vue +61 -0
  161. package/layers/scroll/app/components/Motion/Parallax.vue +76 -0
  162. package/layers/scroll/app/components/Motion/PinnedSection.vue +77 -0
  163. package/layers/scroll/app/components/Motion/ScrollLink.vue +50 -0
  164. package/layers/scroll/app/components/Motion/ScrollProgress.vue +85 -0
  165. package/layers/scroll/app/components/Motion/ScrollScene.vue +121 -0
  166. package/layers/{motion → scroll}/app/components/Motion/ScrollStats.vue +51 -50
  167. package/layers/scroll/app/components/Motion/ScrollStep.vue +44 -0
  168. package/layers/{motion → scroll}/app/composables/useGsap.ts +0 -6
  169. package/layers/{motion → scroll}/app/composables/useScrollSteps.ts +2 -5
  170. package/layers/{motion → scroll}/app/composables/useSectionProgress.ts +14 -7
  171. package/layers/{motion → scroll}/app/composables/useSmoothScroll.ts +6 -37
  172. package/layers/{motion → scroll}/app/plugins/locomotive-scroll.client.ts +3 -2
  173. package/layers/scroll/nuxt.config.ts +33 -0
  174. package/layers/scroll/package.json +11 -0
  175. package/layers/scroll/tsconfig.json +7 -0
  176. package/layers/seo/app/app.config.ts +30 -0
  177. package/layers/seo/app/composables/useSeoConfig.ts +14 -0
  178. package/layers/seo/nuxt.config.ts +34 -0
  179. package/layers/seo/package.json +14 -0
  180. package/layers/seo/tsconfig.json +7 -0
  181. package/layers/shader/app/components/Effect/Bloom.vue +2 -2
  182. package/layers/shader/app/components/Effect/ChromaticAberration.vue +2 -2
  183. package/layers/shader/app/components/Effect/PostProcessing.vue +14 -10
  184. package/layers/shader/app/components/Material/AmbientAurora.client.vue +162 -158
  185. package/layers/shader/app/components/Material/AmbientFlow.client.vue +165 -161
  186. package/layers/shader/app/components/Material/AmbientGradientMesh.client.vue +179 -162
  187. package/layers/shader/app/components/Material/AmbientNebula.client.vue +167 -163
  188. package/layers/shader/app/components/Material/AmbientOcean.client.vue +154 -150
  189. package/layers/shader/app/components/Material/Fresnel.client.vue +78 -75
  190. package/layers/shader/app/components/Material/Gradient.client.vue +175 -173
  191. package/layers/shader/app/components/Material/Image.client.vue +228 -225
  192. package/layers/shader/app/components/Material/Node.client.vue +66 -63
  193. package/layers/shader/app/components/Material/Noise.client.vue +128 -124
  194. package/layers/shader/app/components/Mesh/Plane.vue +20 -18
  195. package/layers/shader/app/components/Node/Color.client.vue +47 -45
  196. package/layers/shader/app/components/Node/Fresnel.client.vue +47 -47
  197. package/layers/shader/app/components/Node/Gradient.client.vue +120 -70
  198. package/layers/shader/app/components/Node/Mix.client.vue +41 -39
  199. package/layers/shader/app/components/Node/Noise.client.vue +91 -83
  200. package/layers/shader/app/components/Pipeline/ACESTonemap.client.vue +7 -10
  201. package/layers/shader/app/components/Pipeline/AddBlend.client.vue +33 -19
  202. package/layers/shader/app/components/Pipeline/AgedFilm.client.vue +61 -40
  203. package/layers/shader/app/components/Pipeline/Aurora.client.vue +92 -56
  204. package/layers/shader/app/components/Pipeline/BilinearGradient.client.vue +65 -34
  205. package/layers/shader/app/components/Pipeline/BillowNoise.client.vue +56 -32
  206. package/layers/shader/app/components/Pipeline/BrightnessContrast.client.vue +36 -20
  207. package/layers/shader/app/components/Pipeline/CellularNoise.client.vue +55 -31
  208. package/layers/shader/app/components/Pipeline/ChannelMixer.client.vue +62 -34
  209. package/layers/shader/app/components/Pipeline/ChebyshevNoiseField.client.vue +77 -50
  210. package/layers/shader/app/components/Pipeline/Checkerboard.client.vue +50 -31
  211. package/layers/shader/app/components/Pipeline/ChromaticAberration.client.vue +49 -33
  212. package/layers/shader/app/components/Pipeline/ChromaticScreenWaves.client.vue +61 -36
  213. package/layers/shader/app/components/Pipeline/Circle.client.vue +53 -30
  214. package/layers/shader/app/components/Pipeline/Clouds.client.vue +86 -48
  215. package/layers/shader/app/components/Pipeline/ColorBurnBlend.client.vue +34 -19
  216. package/layers/shader/app/components/Pipeline/ColorDodgeBlend.client.vue +34 -19
  217. package/layers/shader/app/components/Pipeline/ColourRamp.client.vue +76 -46
  218. package/layers/shader/app/components/Pipeline/ComplexPlaneField.client.vue +80 -50
  219. package/layers/shader/app/components/Pipeline/ConicGradient.client.vue +46 -28
  220. package/layers/shader/app/components/Pipeline/CosinePalette.client.vue +80 -53
  221. package/layers/shader/app/components/Pipeline/CoverageAlpha.client.vue +12 -14
  222. package/layers/shader/app/components/Pipeline/Cross.client.vue +66 -37
  223. package/layers/shader/app/components/Pipeline/CurlNoise.client.vue +58 -35
  224. package/layers/shader/app/components/Pipeline/DarkenBlend.client.vue +34 -19
  225. package/layers/shader/app/components/Pipeline/DayNightCycle.client.vue +65 -39
  226. package/layers/shader/app/components/Pipeline/Desaturate.client.vue +23 -16
  227. package/layers/shader/app/components/Pipeline/DiagonalGradient.client.vue +50 -29
  228. package/layers/shader/app/components/Pipeline/DiamondGradient.client.vue +47 -29
  229. package/layers/shader/app/components/Pipeline/DifferenceBlend.client.vue +34 -19
  230. package/layers/shader/app/components/Pipeline/DivideBlend.client.vue +34 -19
  231. package/layers/shader/app/components/Pipeline/DomainWarpedNoise.client.vue +79 -37
  232. package/layers/shader/app/components/Pipeline/Dots.client.vue +70 -34
  233. package/layers/shader/app/components/Pipeline/DuoTone.client.vue +40 -26
  234. package/layers/shader/app/components/Pipeline/ExclusionBlend.client.vue +38 -19
  235. package/layers/shader/app/components/Pipeline/ExponentialFog.client.vue +52 -35
  236. package/layers/shader/app/components/Pipeline/Exposure.client.vue +22 -16
  237. package/layers/shader/app/components/Pipeline/FBMNoise.client.vue +62 -39
  238. package/layers/shader/app/components/Pipeline/FilmBurn.client.vue +60 -38
  239. package/layers/shader/app/components/Pipeline/FilmGrain.client.vue +53 -31
  240. package/layers/shader/app/components/Pipeline/FisheyeRay.client.vue +39 -28
  241. package/layers/shader/app/components/Pipeline/Flame.client.vue +59 -35
  242. package/layers/shader/app/components/Pipeline/FocalGradient.client.vue +56 -33
  243. package/layers/shader/app/components/Pipeline/Gamma.client.vue +21 -16
  244. package/layers/shader/app/components/Pipeline/GodRays.client.vue +76 -42
  245. package/layers/shader/app/components/Pipeline/GradientNoise.client.vue +57 -32
  246. package/layers/shader/app/components/Pipeline/Grain.client.vue +84 -47
  247. package/layers/shader/app/components/Pipeline/Grid.client.vue +56 -33
  248. package/layers/shader/app/components/Pipeline/Halation.client.vue +52 -34
  249. package/layers/shader/app/components/Pipeline/Halftone.client.vue +34 -23
  250. package/layers/shader/app/components/Pipeline/HardLightBlend.client.vue +33 -19
  251. package/layers/shader/app/components/Pipeline/Haze.client.vue +57 -36
  252. package/layers/shader/app/components/Pipeline/Hexagon.client.vue +54 -31
  253. package/layers/shader/app/components/Pipeline/Hue.client.vue +20 -16
  254. package/layers/shader/app/components/Pipeline/Invert.client.vue +6 -10
  255. package/layers/shader/app/components/Pipeline/LensFlare.client.vue +56 -37
  256. package/layers/shader/app/components/Pipeline/LightenBlend.client.vue +31 -19
  257. package/layers/shader/app/components/Pipeline/LinearGradient.client.vue +36 -28
  258. package/layers/shader/app/components/Pipeline/LinearGradient4.client.vue +65 -43
  259. package/layers/shader/app/components/Pipeline/LinearToSRGB.client.vue +26 -20
  260. package/layers/shader/app/components/Pipeline/Marble.client.vue +97 -57
  261. package/layers/shader/app/components/Pipeline/MixBlend.client.vue +45 -35
  262. package/layers/shader/app/components/Pipeline/MonochromeTint.client.vue +40 -25
  263. package/layers/shader/app/components/Pipeline/MultiplyBlend.client.vue +33 -19
  264. package/layers/shader/app/components/Pipeline/NoisyGradient.client.vue +83 -42
  265. package/layers/shader/app/components/Pipeline/NoisyGradientBlend.client.vue +141 -81
  266. package/layers/shader/app/components/Pipeline/OverlayBlend.client.vue +33 -19
  267. package/layers/shader/app/components/Pipeline/PaperTexture.client.vue +47 -30
  268. package/layers/shader/app/components/Pipeline/Polygon.client.vue +74 -37
  269. package/layers/shader/app/components/Pipeline/Posterise.client.vue +21 -16
  270. package/layers/shader/app/components/Pipeline/RadialGradient.client.vue +45 -30
  271. package/layers/shader/app/components/Pipeline/RayAutoOrbit.client.vue +43 -30
  272. package/layers/shader/app/components/Pipeline/RayMouseOrbit.client.vue +60 -47
  273. package/layers/shader/app/components/Pipeline/RayRotateX.client.vue +28 -20
  274. package/layers/shader/app/components/Pipeline/RayRotateY.client.vue +28 -20
  275. package/layers/shader/app/components/Pipeline/RayRotateZ.client.vue +28 -20
  276. package/layers/shader/app/components/Pipeline/RayTiltBasis.client.vue +55 -34
  277. package/layers/shader/app/components/Pipeline/RaymarchTunnel.client.vue +132 -88
  278. package/layers/shader/app/components/Pipeline/Rectangle.client.vue +78 -37
  279. package/layers/shader/app/components/Pipeline/ReinhardTonemap.client.vue +12 -14
  280. package/layers/shader/app/components/Pipeline/RidgedNoise.client.vue +54 -31
  281. package/layers/shader/app/components/Pipeline/Ring.client.vue +69 -34
  282. package/layers/shader/app/components/Pipeline/RingField.client.vue +63 -43
  283. package/layers/shader/app/components/Pipeline/RisographGrain.client.vue +66 -32
  284. package/layers/shader/app/components/Pipeline/RotatedGradientBlend.client.vue +73 -48
  285. package/layers/shader/app/components/Pipeline/SDFColourMask.client.vue +31 -25
  286. package/layers/shader/app/components/Pipeline/SDFRadialMask.client.vue +31 -21
  287. package/layers/shader/app/components/Pipeline/SRGBToLinear.client.vue +25 -20
  288. package/layers/shader/app/components/Pipeline/Saturation.client.vue +22 -16
  289. package/layers/shader/app/components/Pipeline/Scanlines.client.vue +42 -26
  290. package/layers/shader/app/components/Pipeline/ScreenBlend.client.vue +33 -19
  291. package/layers/shader/app/components/Pipeline/ShaderDebugger.client.vue +58 -45
  292. package/layers/shader/app/components/Pipeline/SimplexNoise.client.vue +59 -37
  293. package/layers/shader/app/components/Pipeline/SkyAtmosphere.client.vue +87 -54
  294. package/layers/shader/app/components/Pipeline/SoftLightBlend.client.vue +33 -19
  295. package/layers/shader/app/components/Pipeline/SolidColour.client.vue +24 -16
  296. package/layers/shader/app/components/Pipeline/SplitTone.client.vue +58 -34
  297. package/layers/shader/app/components/Pipeline/Star.client.vue +73 -37
  298. package/layers/shader/app/components/Pipeline/Starfield.client.vue +68 -34
  299. package/layers/shader/app/components/Pipeline/Stripes.client.vue +64 -36
  300. package/layers/shader/app/components/Pipeline/SubtractBlend.client.vue +33 -19
  301. package/layers/shader/app/components/Pipeline/TanhTonemap.client.vue +25 -19
  302. package/layers/shader/app/components/Pipeline/Threshold.client.vue +23 -17
  303. package/layers/shader/app/components/Pipeline/Tint.client.vue +36 -25
  304. package/layers/shader/app/components/Pipeline/Triangle.client.vue +54 -31
  305. package/layers/shader/app/components/Pipeline/UVAspectCorrect.client.vue +5 -10
  306. package/layers/shader/app/components/Pipeline/UVBreath.client.vue +44 -31
  307. package/layers/shader/app/components/Pipeline/UVBulge.client.vue +35 -21
  308. package/layers/shader/app/components/Pipeline/UVClamp.client.vue +14 -14
  309. package/layers/shader/app/components/Pipeline/UVColumnOffset.client.vue +36 -23
  310. package/layers/shader/app/components/Pipeline/UVFlipX.client.vue +6 -10
  311. package/layers/shader/app/components/Pipeline/UVFlipXY.client.vue +6 -10
  312. package/layers/shader/app/components/Pipeline/UVFlipY.client.vue +6 -10
  313. package/layers/shader/app/components/Pipeline/UVFractBand.client.vue +31 -21
  314. package/layers/shader/app/components/Pipeline/UVMousePull.client.vue +41 -33
  315. package/layers/shader/app/components/Pipeline/UVNoiseRotate.client.vue +65 -46
  316. package/layers/shader/app/components/Pipeline/UVNoiseWarp.client.vue +49 -30
  317. package/layers/shader/app/components/Pipeline/UVOrbit.client.vue +37 -29
  318. package/layers/shader/app/components/Pipeline/UVParallax.client.vue +41 -33
  319. package/layers/shader/app/components/Pipeline/UVPixelate.client.vue +21 -16
  320. package/layers/shader/app/components/Pipeline/UVPulse.client.vue +41 -28
  321. package/layers/shader/app/components/Pipeline/UVRipple.client.vue +53 -29
  322. package/layers/shader/app/components/Pipeline/UVRotate.client.vue +40 -32
  323. package/layers/shader/app/components/Pipeline/UVScale.client.vue +33 -25
  324. package/layers/shader/app/components/Pipeline/UVScroll.client.vue +26 -22
  325. package/layers/shader/app/components/Pipeline/UVScrollX.client.vue +20 -16
  326. package/layers/shader/app/components/Pipeline/UVScrollY.client.vue +20 -16
  327. package/layers/shader/app/components/Pipeline/UVShear.client.vue +33 -20
  328. package/layers/shader/app/components/Pipeline/UVSineWarpXY.client.vue +58 -40
  329. package/layers/shader/app/components/Pipeline/UVSwapAxes.client.vue +6 -10
  330. package/layers/shader/app/components/Pipeline/UVTile.client.vue +26 -22
  331. package/layers/shader/app/components/Pipeline/UVTwirl.client.vue +31 -21
  332. package/layers/shader/app/components/Pipeline/UVWarp.client.vue +44 -25
  333. package/layers/shader/app/components/Pipeline/VHSBleed.client.vue +63 -43
  334. package/layers/shader/app/components/Pipeline/ValueNoise.client.vue +57 -32
  335. package/layers/shader/app/components/Pipeline/Vibrance.client.vue +25 -19
  336. package/layers/shader/app/components/Pipeline/Vignette.client.vue +35 -24
  337. package/layers/shader/app/components/Pipeline/VoronoiEdges.client.vue +66 -38
  338. package/layers/shader/app/components/Pipeline/Water.client.vue +78 -39
  339. package/layers/shader/app/components/Pipeline/WaveBendLayer.client.vue +74 -46
  340. package/layers/shader/app/components/Pipeline/WaveColourLayer.client.vue +76 -43
  341. package/layers/shader/app/components/Pipeline/WhiteBalance.client.vue +38 -27
  342. package/layers/shader/app/components/Pipeline/Wood.client.vue +85 -50
  343. package/layers/shader/app/components/Preset/Aurora.client.vue +69 -52
  344. package/layers/shader/app/components/Preset/Flow.client.vue +63 -47
  345. package/layers/shader/app/components/Preset/GradientMesh.client.vue +63 -47
  346. package/layers/shader/app/components/Preset/Nebula.client.vue +65 -47
  347. package/layers/shader/app/components/Preset/Ocean.client.vue +64 -47
  348. package/layers/shader/app/components/Preset/ThemeAurora.client.vue +107 -70
  349. package/layers/shader/app/components/Preset/ThemeBubble.client.vue +108 -71
  350. package/layers/shader/app/components/Preset/ThemeFlow.client.vue +107 -70
  351. package/layers/shader/app/components/Preset/ThemeGradient.client.vue +108 -71
  352. package/layers/shader/app/components/Preset/ThemeLavaLamp.client.vue +107 -70
  353. package/layers/shader/app/components/Preset/ThemePlasma.client.vue +107 -70
  354. package/layers/shader/app/components/Preset/ThemeWave.client.vue +107 -70
  355. package/layers/shader/app/components/Shader/Background.client.vue +169 -163
  356. package/layers/shader/app/components/Shader/Debug.vue +45 -40
  357. package/layers/shader/app/components/Shader/Host.client.vue +120 -121
  358. package/layers/shader/app/components/Shader/Material.client.vue +42 -36
  359. package/layers/shader/app/components/Shader/Pipeline.client.vue +55 -46
  360. package/layers/shader/app/components/Shader/PipelineContext.vue +12 -12
  361. package/layers/shader/app/components/Shader/Runtime.client.vue +42 -37
  362. package/layers/shader/app/composables/useAmbientMaterials.ts +316 -105
  363. package/layers/shader/app/composables/useCSSColourUniform.ts +7 -6
  364. package/layers/shader/app/composables/useCSSFloatUniform.ts +4 -5
  365. package/layers/shader/app/composables/useMousePosition.ts +1 -1
  366. package/layers/shader/app/composables/useShader.ts +5 -3
  367. package/layers/shader/app/composables/useShaderColor.ts +8 -1
  368. package/layers/shader/app/composables/useShaderFloat.ts +3 -1
  369. package/layers/shader/app/composables/useShaderGraph.ts +6 -3
  370. package/layers/shader/app/composables/useShaderPerf.ts +2 -3
  371. package/layers/shader/app/composables/useShaderPipeline.ts +14 -6
  372. package/layers/shader/app/composables/useShaderRuntime.ts +7 -4
  373. package/layers/shader/app/composables/useShaderVec2.ts +4 -0
  374. package/layers/shader/app/composables/useSunDirectionUniform.ts +7 -6
  375. package/layers/shader/app/composables/useTSLNodes.ts +1 -0
  376. package/layers/shader/app/composables/useThemeColors.ts +14 -10
  377. package/layers/shader/app/composables/useUniforms.ts +5 -2
  378. package/layers/shader/app/plugins/shader.client.ts +3 -2
  379. package/layers/shader/app/shaders/common/blend.ts +3 -0
  380. package/layers/shader/app/shaders/common/complex.ts +4 -5
  381. package/layers/shader/app/shaders/common/effects.ts +10 -6
  382. package/layers/shader/app/shaders/common/grain.ts +4 -0
  383. package/layers/shader/app/shaders/common/lighting.ts +4 -1
  384. package/layers/shader/app/shaders/common/math.ts +3 -0
  385. package/layers/shader/app/shaders/common/noise.ts +7 -4
  386. package/layers/shader/app/shaders/common/noiseHelpers.ts +2 -0
  387. package/layers/shader/app/shaders/common/palette.ts +6 -1
  388. package/layers/shader/app/shaders/common/patterns.ts +7 -4
  389. package/layers/shader/app/shaders/common/sdf.ts +3 -1
  390. package/layers/shader/app/shaders/common/shapes.ts +3 -0
  391. package/layers/shader/app/shaders/common/tonemapping.ts +2 -0
  392. package/layers/shader/app/shaders/common/uv.ts +8 -1
  393. package/layers/shader/app/shaders/createMaterial.ts +6 -2
  394. package/layers/shader/app/shaders/layers/aurora.ts +6 -3
  395. package/layers/shader/app/shaders/layers/meshGradient.ts +6 -3
  396. package/layers/shader/app/shaders/layers/paperShading.ts +6 -2
  397. package/layers/shader/app/shaders/layers/shaderGradient.ts +5 -0
  398. package/layers/shader/app/shaders/layers/stripe.ts +6 -3
  399. package/layers/shader/app/shaders/types.ts +1 -0
  400. package/layers/shader/app/types/app-config.d.ts +1 -1
  401. package/layers/shader/app/types/index.ts +4 -4
  402. package/layers/shader/app/types/materials.ts +5 -4
  403. package/layers/shader/app/types/renderer.ts +1 -50
  404. package/layers/shader/app/types/tsl.ts +4 -3
  405. package/layers/shader/app/types/uniforms.ts +3 -2
  406. package/layers/shader/app/utils/tsl/animation.ts +2 -0
  407. package/layers/shader/app/utils/tsl/color.ts +5 -2
  408. package/layers/shader/app/utils/tsl/math.ts +1 -0
  409. package/layers/shader/app/utils/tsl/noise.ts +2 -0
  410. package/layers/shader/app/utils/tsl/oklch.ts +2 -0
  411. package/layers/shader/app/utils/tsl/patterns.ts +2 -0
  412. package/layers/shader/app/utils/tsl/tween.ts +4 -2
  413. package/layers/shader/app/utils/tsl/uv.ts +2 -0
  414. package/layers/shader/nuxt.config.ts +8 -115
  415. package/layers/shader/package.json +3 -9
  416. package/layers/theme/app/assets/css/theme.css +2 -2
  417. package/layers/theme/app/components/ThemePicker/AccentButton.vue +32 -30
  418. package/layers/theme/app/components/ThemePicker/Colors.vue +6 -5
  419. package/layers/theme/app/components/ThemePicker/Menu.vue +23 -23
  420. package/layers/theme/app/composables/useAccentColor.ts +2 -1
  421. package/layers/theme/app/composables/useThemeContrast.ts +1 -1
  422. package/layers/theme/app/composables/useThemeMotion.ts +1 -1
  423. package/layers/theme/app/composables/useThemeTransparency.ts +1 -4
  424. package/layers/theme/app/plugins/theme.client.ts +33 -15
  425. package/layers/theme/app/types/app-config.d.ts +3 -2
  426. package/layers/theme/app/types/theme.ts +1 -1
  427. package/layers/theme/nuxt.config.ts +4 -1
  428. package/layers/transitions/app/components/Motion/Transition.vue +76 -0
  429. package/layers/transitions/nuxt.config.ts +19 -0
  430. package/layers/transitions/package.json +6 -0
  431. package/layers/transitions/tsconfig.json +7 -0
  432. package/layers/typography/app/components/Typography/CodeBlock.vue +44 -0
  433. package/layers/typography/app/components/Typography/Headline.vue +90 -0
  434. package/layers/typography/app/components/Typography/HeadlineScreen.vue +75 -0
  435. package/layers/typography/app/components/Typography/QuoteBlock.vue +21 -0
  436. package/layers/{ui → typography}/app/components/Typography/TextStroke.vue +33 -32
  437. package/layers/typography/app/components/Typography/index.vue +54 -0
  438. package/layers/{ui → typography}/app/composables/typography.ts +1 -0
  439. package/layers/{ui → typography}/app/types/typography.ts +1 -1
  440. package/layers/typography/nuxt.config.ts +17 -0
  441. package/layers/typography/package.json +6 -0
  442. package/layers/typography/tsconfig.json +7 -0
  443. package/layers/ui/app/assets/css/ui.css +0 -20
  444. package/layers/ui/app/layouts/default.vue +2 -12
  445. package/layers/ui/nuxt.config.ts +5 -21
  446. package/layers/visual/app/app.config.ts +115 -0
  447. package/layers/visual/app/assets/css/visual.css +15 -0
  448. package/layers/visual/app/components/Accent/Blob.vue +32 -0
  449. package/layers/{ui → visual}/app/components/Accent/Scene.vue +26 -23
  450. package/layers/visual/app/components/Base/Modal.vue +123 -0
  451. package/layers/visual/app/components/Gradient/Background.vue +24 -0
  452. package/layers/visual/app/components/Gradient/Text.vue +24 -0
  453. package/layers/visual/app/components/Media/Picture.vue +51 -0
  454. package/layers/visual/app/components/Progress/Bar.vue +36 -0
  455. package/layers/{ui → visual}/app/components/Progress/Circular.vue +26 -25
  456. package/layers/visual/app/components/Tint/Overlay.vue +27 -0
  457. package/layers/{ui → visual}/app/composables/accent.ts +1 -0
  458. package/layers/{ui → visual}/app/composables/gradient.ts +3 -0
  459. package/layers/{ui → visual}/app/composables/picture.ts +2 -0
  460. package/layers/{ui → visual}/app/composables/tint.ts +3 -2
  461. package/layers/{ui → visual}/app/types/accent.ts +2 -2
  462. package/layers/{ui → visual}/app/types/gradient.ts +2 -2
  463. package/layers/{ui → visual}/app/types/media.ts +4 -3
  464. package/layers/{ui → visual}/app/types/tint.ts +1 -1
  465. package/layers/visual/nuxt.config.ts +19 -0
  466. package/layers/visual/package.json +6 -0
  467. package/layers/visual/tsconfig.json +7 -0
  468. package/package.json +29 -4
  469. package/layers/motion/app/app.config.ts +0 -27
  470. package/layers/motion/app/components/Motion/HorizontalScroll.vue +0 -61
  471. package/layers/motion/app/components/Motion/Parallax.vue +0 -75
  472. package/layers/motion/app/components/Motion/PinnedSection.vue +0 -77
  473. package/layers/motion/app/components/Motion/ScrollLink.vue +0 -49
  474. package/layers/motion/app/components/Motion/ScrollProgress.vue +0 -82
  475. package/layers/motion/app/components/Motion/ScrollScene.vue +0 -121
  476. package/layers/motion/app/components/Motion/ScrollStep.vue +0 -45
  477. package/layers/motion/app/components/Motion/Transition.vue +0 -76
  478. package/layers/shader/app/components/Shader/Canvas.vue +0 -121
  479. package/layers/ui/app/app.config.ts +0 -57
  480. package/layers/ui/app/components/Accent/Blob.vue +0 -29
  481. package/layers/ui/app/components/Base/Modal.vue +0 -111
  482. package/layers/ui/app/components/Gradient/Background.vue +0 -22
  483. package/layers/ui/app/components/Gradient/Text.vue +0 -22
  484. package/layers/ui/app/components/Links/Group.vue +0 -47
  485. package/layers/ui/app/components/Links/Named.vue +0 -31
  486. package/layers/ui/app/components/Mast/Footer.vue +0 -15
  487. package/layers/ui/app/components/Mast/NavModal.vue +0 -72
  488. package/layers/ui/app/components/Media/Picture.vue +0 -50
  489. package/layers/ui/app/components/Progress/Bar.vue +0 -35
  490. package/layers/ui/app/components/Tint/Overlay.vue +0 -25
  491. package/layers/ui/app/components/Typography/CodeBlock.vue +0 -42
  492. package/layers/ui/app/components/Typography/Headline.vue +0 -88
  493. package/layers/ui/app/components/Typography/HeadlineScreen.vue +0 -77
  494. package/layers/ui/app/components/Typography/QuoteBlock.vue +0 -20
  495. package/layers/ui/app/components/Typography/index.vue +0 -52
  496. package/layers/ui/app/types/app-config.d.ts +0 -22
  497. package/layers/ui/app/types/nav.ts +0 -5
  498. /package/layers/{motion → animations}/app/components/Motion/CountUp.vue +0 -0
  499. /package/layers/{motion → animations}/app/components/Motion/Cursor.vue +0 -0
  500. /package/layers/{motion → animations}/app/components/Motion/Magnetic.vue +0 -0
  501. /package/layers/{motion → animations}/app/components/Motion/Marquee.vue +0 -0
  502. /package/layers/{motion → animations}/app/components/Motion/MarqueeText.vue +0 -0
  503. /package/layers/{motion → animations}/app/components/Motion/Staggered.vue +0 -0
  504. /package/layers/{motion → animations}/app/components/Motion/TextReveal.vue +0 -0
  505. /package/layers/{motion → animations}/app/components/Motion/Tilt.vue +0 -0
  506. /package/layers/{motion → animations}/app/components/Motion/VelocityEffect.vue +0 -0
  507. /package/layers/{motion → animations}/app/composables/useCountUp.ts +0 -0
  508. /package/layers/{motion → animations}/app/composables/useCursorFollower.ts +0 -0
  509. /package/layers/{motion → animations}/app/composables/useMagneticElement.ts +0 -0
  510. /package/layers/{motion → animations}/app/composables/useMarqueeCopies.ts +0 -0
  511. /package/layers/{motion → animations}/app/composables/useMarqueeVelocity.ts +0 -0
  512. /package/layers/{motion → animations}/app/composables/useTiltEffect.ts +0 -0
  513. /package/layers/{ui → navigation}/app/components/Mast/Main.vue +0 -0
  514. /package/layers/{ui → navigation}/app/components/Site/Subtitle.vue +0 -0
  515. /package/layers/{ui → navigation}/app/components/Site/Title.vue +0 -0
  516. /package/layers/{ui → navigation}/app/utils/regex.ts +0 -0
  517. /package/layers/{motion/app/assets/css/motion.css → transitions/app/assets/css/transitions.css} +0 -0
  518. /package/layers/{ui → typography}/app/composables/color.ts +0 -0
  519. /package/layers/{ui → typography}/app/types/colors.ts +0 -0
  520. /package/layers/{ui → visual}/app/types/breakpoints.ts +0 -0
@@ -1,3 +1,7 @@
1
+ /* eslint-disable complexity */
2
+ /* eslint-disable @typescript-eslint/consistent-type-assertions */
3
+ /* eslint-disable no-restricted-syntax */
4
+ /* eslint-disable @typescript-eslint/ban-ts-comment */
1
5
  // @ts-nocheck
2
6
  /**
3
7
  * Core Layer Initialization Plugin
@@ -13,15 +17,14 @@
13
17
  export default defineNuxtPlugin((nuxtApp) => {
14
18
  const config = useAppConfig()
15
19
  // const isDev = import.meta.dev
16
- const isDev = process.env.NODE_ENV === 'development' ? true : false
20
+ const isDev = process.env.NODE_ENV === 'development'
17
21
 
18
22
  // ============================================================
19
23
  // 1. Log initialization (dev only)
20
24
  // ============================================================
21
25
  if (isDev) {
22
- // eslint-disable-next-line no-console
23
26
  console.log('🚀 [Core Layer] Initializing...')
24
- // eslint-disable-next-line no-console
27
+
25
28
  console.log('[Core Layer] Config:', config.coreLayer)
26
29
  }
27
30
 
@@ -33,7 +36,6 @@ export default defineNuxtPlugin((nuxtApp) => {
33
36
  const device = useDevice()
34
37
 
35
38
  if (isDev && device) {
36
- // eslint-disable-next-line no-console
37
39
  console.log('[Core Layer] Device detection:', {
38
40
  mobile: device.isMobile,
39
41
  desktop: device.isDesktop,
@@ -45,7 +47,6 @@ export default defineNuxtPlugin((nuxtApp) => {
45
47
  const isOnline = useOnline()
46
48
 
47
49
  if (isDev) {
48
- // eslint-disable-next-line no-console
49
50
  console.log('[Core Layer] VueUse loaded, online status:', isOnline.value)
50
51
  }
51
52
 
@@ -55,7 +56,6 @@ export default defineNuxtPlugin((nuxtApp) => {
55
56
  const { name, version, engine, os } = useBrowser()
56
57
 
57
58
  if (isDev) {
58
- // eslint-disable-next-line no-console
59
59
  console.log('[Core Layer] Browser detection:', {
60
60
  name: name.value,
61
61
  version: version.value,
@@ -68,7 +68,6 @@ export default defineNuxtPlugin((nuxtApp) => {
68
68
  const { breakpoint, isRetina, orientation } = useScreen()
69
69
 
70
70
  if (isDev) {
71
- // eslint-disable-next-line no-console
72
71
  console.log('[Core Layer] Screen detection:', {
73
72
  breakpoint: breakpoint.value,
74
73
  retina: isRetina.value,
@@ -80,7 +79,6 @@ export default defineNuxtPlugin((nuxtApp) => {
80
79
  const { connectionQuality, effectiveType, saveData } = useNetworkInfo()
81
80
 
82
81
  if (isDev) {
83
- // eslint-disable-next-line no-console
84
82
  console.log('[Core Layer] Network detection:', {
85
83
  quality: connectionQuality.value,
86
84
  type: effectiveType.value,
@@ -92,7 +90,6 @@ export default defineNuxtPlugin((nuxtApp) => {
92
90
  const { grid, subgrid, containerQueries, webGL, darkMode } = useFeatures()
93
91
 
94
92
  if (isDev) {
95
- // eslint-disable-next-line no-console
96
93
  console.log('[Core Layer] Feature detection:', {
97
94
  grid: grid.value,
98
95
  subgrid: subgrid.value,
@@ -106,7 +103,6 @@ export default defineNuxtPlugin((nuxtApp) => {
106
103
  const { offlineReady, isOnline: cacheOnline } = useCache()
107
104
 
108
105
  if (isDev) {
109
- // eslint-disable-next-line no-console
110
106
  console.log('[Core Layer] Cache status:', {
111
107
  online: cacheOnline.value,
112
108
  offlineReady: offlineReady.value,
@@ -121,7 +117,6 @@ export default defineNuxtPlugin((nuxtApp) => {
121
117
  const { mode, isServer, isClient, isHydrated } = useRendering()
122
118
 
123
119
  if (isDev) {
124
- // eslint-disable-next-line no-console
125
120
  console.log('[Core Layer] Rendering mode:', {
126
121
  mode: mode.value,
127
122
  server: isServer.value,
@@ -135,14 +130,13 @@ export default defineNuxtPlugin((nuxtApp) => {
135
130
 
136
131
  if (isDev) {
137
132
  const publicConfig = env.public as Record<string, unknown> | undefined
138
- // eslint-disable-next-line no-console
133
+
139
134
  console.log('[Core Layer] Environment config loaded:', {
140
- hasPublicConfig: !!publicConfig,
135
+ hasPublicConfig: Boolean(publicConfig),
141
136
  publicKeys: Object.keys(publicConfig ?? {}),
142
137
  })
143
138
  }
144
139
  } catch (error) {
145
- // eslint-disable-next-line no-console
146
140
  console.error('[Core Layer] Module verification failed:', error)
147
141
  }
148
142
 
@@ -151,27 +145,22 @@ export default defineNuxtPlugin((nuxtApp) => {
151
145
  // ============================================================
152
146
  if (isDev) {
153
147
  nuxtApp.hook('app:created', () => {
154
- // eslint-disable-next-line no-console
155
148
  console.log('✅ [Core Layer] App created')
156
149
  })
157
150
 
158
151
  nuxtApp.hook('app:beforeMount', () => {
159
- // eslint-disable-next-line no-console
160
152
  console.log('⏳ [Core Layer] App mounting...')
161
153
  })
162
154
 
163
155
  nuxtApp.hook('app:mounted', () => {
164
- // eslint-disable-next-line no-console
165
156
  console.log('✅ [Core Layer] App mounted')
166
157
  })
167
158
 
168
159
  nuxtApp.hook('page:start', () => {
169
- // eslint-disable-next-line no-console
170
160
  console.log('📄 [Core Layer] Page navigation started')
171
161
  })
172
162
 
173
163
  nuxtApp.hook('page:finish', () => {
174
- // eslint-disable-next-line no-console
175
164
  console.log('✅ [Core Layer] Page navigation finished')
176
165
  })
177
166
  }
@@ -1,6 +1,8 @@
1
+ /* eslint-disable @typescript-eslint/consistent-type-assertions */
2
+ /* eslint-disable no-restricted-syntax */
1
3
  // plugins/loading.client.ts
2
4
 
3
- interface LoadingConfig {
5
+ type LoadingConfig = {
4
6
  enabled?: boolean
5
7
  minDuration?: number
6
8
  maxDuration?: number
@@ -9,7 +11,7 @@ interface LoadingConfig {
9
11
  zIndex?: number
10
12
  }
11
13
 
12
- interface CoreLayerConfig {
14
+ type CoreLayerConfig = {
13
15
  loading?: LoadingConfig
14
16
  }
15
17
 
@@ -1,8 +1,11 @@
1
+ /* eslint-disable complexity */
2
+ /* eslint-disable @typescript-eslint/consistent-type-assertions */
3
+ /* eslint-disable no-restricted-syntax */
1
4
  // plugins/scroll-guard.client.ts
2
5
 
3
6
  import type { ScrollGuardConfig } from '#layers/core/app/types/scroll-guard'
4
7
 
5
- interface CoreLayerConfig {
8
+ type CoreLayerConfig = {
6
9
  scrollGuard?: Partial<ScrollGuardConfig>
7
10
  }
8
11
 
@@ -26,7 +29,6 @@ export default defineNuxtPlugin(() => {
26
29
 
27
30
  if (coreLayer?.scrollGuard?.enabled === false) {
28
31
  if (import.meta.dev) {
29
- // eslint-disable-next-line no-console
30
32
  console.log('[Scroll Guard] Disabled via config')
31
33
  }
32
34
  return
@@ -37,7 +39,6 @@ export default defineNuxtPlugin(() => {
37
39
  enable()
38
40
 
39
41
  if (import.meta.dev) {
40
- // eslint-disable-next-line no-console
41
42
  console.log('[Scroll Guard] Initialized', {
42
43
  strict: coreLayer?.scrollGuard?.strict ?? true,
43
44
  debug: coreLayer?.scrollGuard?.debug ?? false,
@@ -49,7 +50,6 @@ export default defineNuxtPlugin(() => {
49
50
 
50
51
  // Log clamped count after initial scan settles
51
52
  requestAnimationFrame(() => {
52
- // eslint-disable-next-line no-console
53
53
  console.log(`[Scroll Guard] Clamped ${clampedCount.value} element(s)`)
54
54
  })
55
55
  }
@@ -1,5 +1,9 @@
1
+ import type { SiteConfig } from './site'
2
+
1
3
  declare module '@nuxt/schema' {
2
- interface AppConfigInput {
4
+ type AppConfigInput = {
5
+ /** Shared site metadata — consumed by feeds, SEO, and any layer needing canonical site info. */
6
+ site?: SiteConfig
3
7
  coreLayer?: {
4
8
  /** Project name */
5
9
  name?: string
@@ -5,7 +5,7 @@
5
5
  * and image format detection
6
6
  */
7
7
 
8
- export interface FeatureDetection {
8
+ export type FeatureDetection = {
9
9
  // CSS Features
10
10
  grid: boolean
11
11
  subgrid: boolean
@@ -34,7 +34,7 @@ export interface FeatureDetection {
34
34
  /**
35
35
  * Device detection types
36
36
  */
37
- export interface DeviceInfo {
37
+ export type DeviceInfo = {
38
38
  isMobile: boolean
39
39
  isTablet: boolean
40
40
  isDesktop: boolean
@@ -48,7 +48,7 @@ export interface DeviceInfo {
48
48
  /**
49
49
  * Browser detection types
50
50
  */
51
- export interface BrowserInfo {
51
+ export type BrowserInfo = {
52
52
  isChrome: boolean
53
53
  isSafari: boolean
54
54
  isFirefox: boolean
@@ -61,7 +61,7 @@ export interface BrowserInfo {
61
61
  /**
62
62
  * Screen detection types
63
63
  */
64
- export interface ScreenInfo {
64
+ export type ScreenInfo = {
65
65
  breakpoint: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | '2xl'
66
66
  width: number
67
67
  height: number
@@ -73,7 +73,7 @@ export interface ScreenInfo {
73
73
  /**
74
74
  * Network information types
75
75
  */
76
- export interface NetworkInfo {
76
+ export type NetworkInfo = {
77
77
  isOnline: boolean
78
78
  connectionType: 'slow-2g' | '2g' | '3g' | '4g' | 'wifi' | 'ethernet' | 'unknown'
79
79
  effectiveType: string
@@ -89,7 +89,7 @@ export interface NetworkInfo {
89
89
  */
90
90
  export type RenderingMode = 'ssr' | 'ssg' | 'csr' | 'hybrid'
91
91
 
92
- export interface RenderingInfo {
92
+ export type RenderingInfo = {
93
93
  mode: RenderingMode
94
94
  isServer: boolean
95
95
  isClient: boolean
@@ -100,7 +100,7 @@ export interface RenderingInfo {
100
100
  /**
101
101
  * PWA types
102
102
  */
103
- export interface PWAInfo {
103
+ export type PWAInfo = {
104
104
  isInstalled: boolean
105
105
  canInstall: boolean
106
106
  needRefresh: boolean
@@ -109,7 +109,7 @@ export interface PWAInfo {
109
109
  /**
110
110
  * Cache types
111
111
  */
112
- export interface CacheInfo {
112
+ export type CacheInfo = {
113
113
  isOnline: boolean
114
114
  offlineReady: boolean
115
115
  isCached: boolean
@@ -4,7 +4,8 @@
4
4
  * Central export for all type definitions used across the core layer
5
5
  */
6
6
 
7
- export * from './detection'
8
- export * from './runtime-config'
9
- export * from './loading'
10
- export * from './scroll-guard'
7
+ export type * from './detection'
8
+ export type * from './runtime-config'
9
+ export type * from './loading'
10
+ export type * from './scroll-guard'
11
+ export type * from './site'
@@ -3,7 +3,7 @@
3
3
  /**
4
4
  * Loading screen configuration interface
5
5
  */
6
- export interface LoadingConfig {
6
+ export type LoadingConfig = {
7
7
  /** Master toggle - set to false to disable completely */
8
8
  enabled: boolean
9
9
  /** Minimum time to display loading screen (prevents flash) */
@@ -21,7 +21,7 @@ export interface LoadingConfig {
21
21
  /**
22
22
  * Loading state interface
23
23
  */
24
- export interface LoadingState {
24
+ export type LoadingState = {
25
25
  /** Current loading state */
26
26
  isLoading: boolean
27
27
  /** Progress percentage (0-100) */
@@ -31,7 +31,7 @@ export interface LoadingState {
31
31
  /**
32
32
  * Loading composable return interface
33
33
  */
34
- export interface UseLoadingReturn {
34
+ export type UseLoadingReturn = {
35
35
  /** Current loading state (readonly) */
36
36
  isLoading: Readonly<Ref<boolean>>
37
37
  /** Progress percentage 0-100 (readonly) */
@@ -5,7 +5,7 @@
5
5
  * Extends Nuxt's RuntimeConfig with core layer specifics
6
6
  */
7
7
 
8
- export interface CoreLayerRuntimeConfig {
8
+ export type CoreLayerRuntimeConfig = {
9
9
  // Server-side only (private)
10
10
  secretKey?: string
11
11
  apiSecretKey?: string
@@ -25,7 +25,7 @@ export interface CoreLayerRuntimeConfig {
25
25
  * Augment Nuxt's RuntimeConfig
26
26
  */
27
27
  declare module 'nuxt/schema' {
28
- interface RuntimeConfig extends CoreLayerRuntimeConfig {}
28
+ type RuntimeConfig = {} & CoreLayerRuntimeConfig
29
29
  }
30
30
 
31
31
  export {}
@@ -2,7 +2,7 @@
2
2
  * Horizontal Scroll Guard types
3
3
  */
4
4
 
5
- export interface ScrollGuardConfig {
5
+ export type ScrollGuardConfig = {
6
6
  /** Master toggle — set to false to disable completely */
7
7
  enabled: boolean
8
8
  /** CSS selectors for elements allowed to overflow intentionally */
@@ -17,7 +17,7 @@ export interface ScrollGuardConfig {
17
17
  debug: boolean
18
18
  }
19
19
 
20
- export interface ScrollGuardState {
20
+ export type ScrollGuardState = {
21
21
  /** Whether the guard is currently active */
22
22
  isEnabled: boolean
23
23
  /** Number of elements currently clamped */
@@ -0,0 +1,43 @@
1
+ export type Author = {
2
+ name: string
3
+ email?: string
4
+ /** URL of the author's profile or homepage */
5
+ link?: string
6
+ }
7
+
8
+ /**
9
+ * Shared site metadata. Set this in your app's `app.config.ts` under the `site` key.
10
+ * Consumed by the feeds layer for feed channel metadata and available to any other
11
+ * layer that needs canonical site information.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * // app/app.config.ts
16
+ * export default defineAppConfig({
17
+ * site: {
18
+ * title: 'Kieran Mansfield',
19
+ * description: 'Creative Full-Stack Web Developer based in London, UK.',
20
+ * url: 'https://example.com',
21
+ * author: { name: 'Kieran Mansfield', email: 'hi@example.com' },
22
+ * },
23
+ * })
24
+ * ```
25
+ */
26
+ export type SiteConfig = {
27
+ /** Display name of the site */
28
+ title?: string
29
+ /** Tagline or secondary title */
30
+ subtitle?: string
31
+ /** Short description used in feed channels and meta tags */
32
+ description?: string
33
+ /** Canonical origin URL — no trailing slash (e.g. "https://example.com") */
34
+ url?: string
35
+ /** Default author for feed items and structured data */
36
+ author?: Author
37
+ /** Absolute URL of the site's OG/social image */
38
+ image?: string
39
+ /** Path to the favicon (default: "/favicon.ico") */
40
+ favicon?: string
41
+ /** Copyright string — auto-generated from author.name + year if omitted */
42
+ copyright?: string
43
+ }
@@ -1,3 +1,7 @@
1
+ /* eslint-disable @typescript-eslint/no-explicit-any */
2
+ /* eslint-disable @typescript-eslint/consistent-type-assertions */
3
+ /* eslint-disable @typescript-eslint/no-non-null-assertion */
4
+ /* eslint-disable no-restricted-syntax */
1
5
  /**
2
6
  * Core utility helpers
3
7
  *
@@ -6,6 +6,7 @@ export default defineNuxtConfig({
6
6
 
7
7
  alias: {
8
8
  '#layers/core': import.meta.dirname,
9
+ '#layers/core/types': `${import.meta.dirname}/app/types`,
9
10
  },
10
11
 
11
12
  // Base modules (always loaded)
@@ -20,6 +20,6 @@
20
20
  "nuxiupgrade": "npx nuxi upgrade"
21
21
  },
22
22
  "devDependencies": {
23
- "@vite-pwa/nuxt": "^1.1.1"
23
+ "@vite-pwa/nuxt": "catalog:"
24
24
  }
25
25
  }
@@ -0,0 +1,23 @@
1
+ export default defineAppConfig({
2
+ feedsLayer: {
3
+ feed: {
4
+ limit: 30,
5
+ collections: ['blog'],
6
+ defaultCollection: 'blog',
7
+ },
8
+ },
9
+ })
10
+
11
+ declare module '@nuxt/schema' {
12
+ type AppConfigInput = {
13
+ feedsLayer?: {
14
+ feed?: {
15
+ limit?: number
16
+ /** Collection names to expose as feeds. Default: ['blog'] */
17
+ collections?: string[]
18
+ /** Collection used by the shorthand /feed/rss routes. Default: 'blog' */
19
+ defaultCollection?: string
20
+ }
21
+ }
22
+ }
23
+ }
@@ -0,0 +1,66 @@
1
+ /* Feed badge — inline indicator for RSS/Atom/JSON links */
2
+ .feed-badge {
3
+ display: inline-flex;
4
+ align-items: center;
5
+ gap: 0.25rem;
6
+ transition: opacity 0.15s;
7
+ border-radius: var(--ui-radius, 0.375rem);
8
+ padding: 0.125rem 0.5rem;
9
+ font-weight: 500;
10
+ font-size: 0.75rem;
11
+ line-height: 1.5;
12
+ text-decoration: none;
13
+ }
14
+
15
+ .feed-badge:hover {
16
+ opacity: 0.8;
17
+ }
18
+
19
+ .feed-badge-rss {
20
+ background-color: color-mix(in srgb, var(--color-orange-500, #f97316) 12%, transparent);
21
+ color: var(--color-orange-600, #ea580c);
22
+ }
23
+
24
+ .feed-badge-atom {
25
+ background-color: color-mix(in srgb, var(--color-purple-500, #a855f7) 12%, transparent);
26
+ color: var(--color-purple-600, #9333ea);
27
+ }
28
+
29
+ .feed-badge-json {
30
+ background-color: color-mix(in srgb, var(--color-yellow-500, #eab308) 12%, transparent);
31
+ color: var(--color-yellow-600, #ca8a04);
32
+ }
33
+
34
+ @media (prefers-color-scheme: dark) {
35
+ .feed-badge-rss {
36
+ color: var(--color-orange-400, #fb923c);
37
+ }
38
+ .feed-badge-atom {
39
+ color: var(--color-purple-400, #c084fc);
40
+ }
41
+ .feed-badge-json {
42
+ color: var(--color-yellow-400, #facc15);
43
+ }
44
+ }
45
+
46
+ /* Feed preview code block — used in playground and consuming apps */
47
+ .feed-preview {
48
+ border-radius: var(--ui-radius, 0.375rem);
49
+ background-color: var(--color-gray-950, #030712);
50
+ padding: 1rem;
51
+ max-height: 24rem;
52
+ overflow-x: auto;
53
+ overflow-y: auto;
54
+ color: var(--color-gray-100, #f3f4f6);
55
+ font-size: 0.75rem;
56
+ line-height: 1.6;
57
+ font-family: var(--font-mono, ui-monospace, monospace);
58
+ }
59
+
60
+ .feed-preview pre {
61
+ margin: 0;
62
+ white-space: pre;
63
+ }
64
+
65
+ /* Feed discovery links — add to <head> via useHead */
66
+ /* Usage: useHead({ link: [{ rel: 'alternate', type: 'application/rss+xml', title: 'RSS', href: '/feed/rss' }] }) */
@@ -0,0 +1,73 @@
1
+ /* eslint-disable @typescript-eslint/consistent-type-assertions */
2
+ /* eslint-disable no-restricted-syntax */
3
+ export default defineNuxtPlugin(() => {
4
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
5
+ const appConfig = useAppConfig() as any
6
+ const site = appConfig.site ?? {}
7
+ const feedConfig = appConfig.feedsLayer?.feed ?? {}
8
+ const collections: string[] = feedConfig.collections ?? ['blog']
9
+ const defaultCollection: string = feedConfig.defaultCollection ?? 'blog'
10
+ const siteTitle: string = site.title ?? ''
11
+
12
+ const route = useRoute()
13
+
14
+ useHead(() => {
15
+ // Derive which collection (if any) the current page belongs to
16
+ const segment = route.path.split('/').filter(Boolean)[0] ?? ''
17
+ const currentCollection = collections.includes(segment) ? segment : null
18
+
19
+ // Always present: main site feeds via the shorthand routes
20
+ const mainLinks = [
21
+ {
22
+ rel: 'alternate',
23
+ type: 'application/rss+xml',
24
+ title: `${siteTitle || 'Site'} (RSS)`,
25
+ href: '/feed/rss',
26
+ },
27
+ {
28
+ rel: 'alternate',
29
+ type: 'application/atom+xml',
30
+ title: `${siteTitle || 'Site'} (Atom)`,
31
+ href: '/feed/atom',
32
+ },
33
+ {
34
+ rel: 'alternate',
35
+ type: 'application/feed+json',
36
+ title: `${siteTitle || 'Site'} (JSON Feed)`,
37
+ href: '/feed/json',
38
+ },
39
+ ]
40
+
41
+ // Collection-specific feeds — only when on a non-default collection's pages.
42
+ // The default collection is already covered by the main shorthand links above.
43
+ const label =
44
+ currentCollection && currentCollection !== defaultCollection
45
+ ? currentCollection.charAt(0).toUpperCase() + currentCollection.slice(1)
46
+ : null
47
+
48
+ const collectionLinks = label
49
+ ? [
50
+ {
51
+ rel: 'alternate',
52
+ type: 'application/rss+xml',
53
+ title: `${label} (RSS)`,
54
+ href: `/feed/${currentCollection}/rss`,
55
+ },
56
+ {
57
+ rel: 'alternate',
58
+ type: 'application/atom+xml',
59
+ title: `${label} (Atom)`,
60
+ href: `/feed/${currentCollection}/atom`,
61
+ },
62
+ {
63
+ rel: 'alternate',
64
+ type: 'application/feed+json',
65
+ title: `${label} (JSON Feed)`,
66
+ href: `/feed/${currentCollection}/json`,
67
+ },
68
+ ]
69
+ : []
70
+
71
+ return { link: [...mainLinks, ...collectionLinks] }
72
+ })
73
+ })
@@ -0,0 +1,36 @@
1
+ // https://nuxt.com/docs/api/configuration/nuxt-config
2
+ export default defineNuxtConfig({
3
+ $meta: {
4
+ name: 'feeds',
5
+ },
6
+
7
+ extends: process.env.FEEDS_STANDALONE ? ['../core', '../content'] : [],
8
+
9
+ alias: {
10
+ '#layers/feeds': import.meta.dirname,
11
+ },
12
+
13
+ css: ['#layers/feeds/app/assets/css/feeds.css'],
14
+
15
+ nitro: {
16
+ prerender: {
17
+ // Shorthand routes (/feed/rss etc.) always map to the defaultCollection.
18
+ // These are owned by the feeds layer so we prerender them here.
19
+ // Collection-specific routes (/feed/blog/rss etc.) must be added to
20
+ // nitro.prerender.routes in the consuming app's nuxt.config.ts.
21
+ routes: [
22
+ '/feed/discovery',
23
+ '/feed/demo',
24
+ '/feed/rss',
25
+ '/feed/atom',
26
+ '/feed/json',
27
+ '/feed/rss/all',
28
+ '/feed/atom/all',
29
+ '/feed/json/all',
30
+ '/feed/style.xsl',
31
+ ],
32
+ },
33
+ },
34
+
35
+ compatibilityDate: '2025-07-15',
36
+ })
@@ -0,0 +1,23 @@
1
+ {
2
+ "name": "kmcom-layer-feeds",
3
+ "version": "0.0.1",
4
+ "type": "module",
5
+ "private": true,
6
+ "main": "./nuxt.config.ts",
7
+ "scripts": {
8
+ "typecheck": "vue-tsc --noEmit -p ../../tsconfig.typecheck.json",
9
+ "dev": "nuxi dev .playground",
10
+ "dev:prepare": "nuxt prepare .playground",
11
+ "build": "FEEDS_STANDALONE=true nuxi build",
12
+ "generate": "FEEDS_STANDALONE=true nuxi generate",
13
+ "preview": "nuxt preview .playground"
14
+ },
15
+ "dependencies": {
16
+ "feed": "catalog:"
17
+ },
18
+ "devDependencies": {
19
+ "nuxt": "catalog:",
20
+ "vue": "^3.5.35",
21
+ "vue-router": "catalog:"
22
+ }
23
+ }
@@ -0,0 +1,7 @@
1
+ {
2
+ "extends": "../../apps/playground/tsconfig.json",
3
+ "compilerOptions": {
4
+ "strict": true
5
+ },
6
+ "exclude": ["node_modules"]
7
+ }
@@ -1,3 +1,4 @@
1
+ <!-- eslint-disable @typescript-eslint/ban-ts-comment -->
1
2
  <script setup lang="ts">
2
3
  // @ts-nocheck
3
4
  import type { FormSubmitEvent } from '@nuxt/ui'