kmcom-nuxt-layers 1.7.9 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/layers/animations/nuxt.config.ts +17 -0
- package/layers/animations/package.json +6 -0
- package/layers/animations/tsconfig.json +7 -0
- package/layers/canvas/app/components/ShaderCanvas.vue +125 -0
- package/layers/{shader → canvas}/app/composables/useRendererCapabilities.ts +10 -2
- package/layers/{shader → canvas}/app/composables/useShaderTime.ts +3 -3
- package/layers/canvas/app/types/renderer.ts +50 -0
- package/layers/canvas/nuxt.config.ts +189 -0
- package/layers/canvas/package.json +22 -0
- package/layers/canvas/tsconfig.json +7 -0
- package/layers/content/app/components/Blog/Article.vue +12 -6
- package/layers/content/app/components/Blog/Card.vue +24 -24
- package/layers/content/app/components/Blog/List.vue +8 -11
- package/layers/content/app/components/Gallery/AmbientImage.vue +15 -15
- package/layers/content/app/components/Gallery/Card.vue +19 -19
- package/layers/content/app/components/Gallery/Detail.vue +29 -20
- package/layers/content/app/components/Gallery/Grid.vue +8 -11
- package/layers/content/app/components/Gallery/ImageDetail.vue +18 -17
- package/layers/content/app/components/Gallery/ImagePage.vue +8 -9
- package/layers/content/app/components/Gallery/Lightbox.vue +38 -33
- package/layers/content/app/components/Gallery/Page.vue +8 -8
- package/layers/content/app/components/Gallery/SlugPage.vue +7 -8
- package/layers/content/app/components/NuxtContent/Detail.vue +29 -27
- package/layers/content/app/components/NuxtContent/List.vue +10 -9
- package/layers/content/app/components/NuxtContent/Renderer.vue +4 -4
- package/layers/content/app/components/NuxtContent/Surround.vue +3 -3
- package/layers/content/app/components/NuxtContent/Toc.vue +5 -5
- package/layers/content/app/components/Portfolio/Card.vue +17 -17
- package/layers/content/app/components/Portfolio/ColorPalette.vue +11 -11
- package/layers/content/app/components/Portfolio/Detail.vue +9 -13
- package/layers/content/app/components/Portfolio/ItemPage.vue +8 -9
- package/layers/content/app/components/Portfolio/List.vue +10 -13
- package/layers/content/app/components/Portfolio/Page.vue +8 -8
- package/layers/content/app/components/Portfolio/Typography.vue +4 -4
- package/layers/content/app/components/content/Figure.vue +14 -14
- package/layers/content/app/composables/createPortfolioComposables.ts +4 -1
- package/layers/content/app/composables/useBlogPosts.ts +3 -1
- package/layers/content/app/composables/useCollectionItem.ts +4 -1
- package/layers/content/app/composables/useCollectionSurround.ts +1 -0
- package/layers/content/app/composables/useContentPage.ts +1 -0
- package/layers/content/app/composables/useGalleryItems.ts +4 -1
- package/layers/content/app/composables/usePortfolioItems.ts +4 -1
- package/layers/content/app/types/app-config.d.ts +1 -1
- package/layers/content/app/types/content.ts +27 -30
- package/layers/content/nuxt.config.ts +4 -3
- package/layers/content/package.json +4 -4
- package/layers/core/app/components/DiagnosticsPage.vue +203 -203
- package/layers/core/app/components/ErrorBoundary.vue +51 -49
- package/layers/core/app/components/LoadingScreen.vue +112 -111
- package/layers/core/app/composables/useBrowser.ts +2 -1
- package/layers/core/app/composables/useCache.ts +4 -2
- package/layers/core/app/composables/useErrorLog.ts +7 -10
- package/layers/core/app/composables/useFeatures.ts +4 -2
- package/layers/core/app/composables/useLoading.ts +1 -0
- package/layers/core/app/composables/useNetworkInfo.ts +1 -0
- package/layers/core/app/composables/usePWAInfo.ts +4 -3
- package/layers/core/app/composables/useRendering.ts +1 -0
- package/layers/core/app/composables/useScreen.ts +1 -0
- package/layers/core/app/composables/useScrollGuard.ts +2 -1
- package/layers/core/app/pages/[...slug].vue +99 -99
- package/layers/core/app/plugins/error-handler.ts +1 -1
- package/layers/core/app/plugins/feature-detection.client.ts +2 -1
- package/layers/core/app/plugins/init.ts +8 -19
- package/layers/core/app/plugins/loading.client.ts +4 -2
- package/layers/core/app/plugins/scroll-guard.client.ts +4 -4
- package/layers/core/app/types/app-config.d.ts +5 -1
- package/layers/core/app/types/detection.ts +8 -8
- package/layers/core/app/types/index.ts +5 -4
- package/layers/core/app/types/loading.ts +3 -3
- package/layers/core/app/types/runtime-config.ts +2 -2
- package/layers/core/app/types/scroll-guard.ts +2 -2
- package/layers/core/app/types/site.ts +43 -0
- package/layers/core/app/utils/helpers.ts +4 -0
- package/layers/core/nuxt.config.ts +1 -0
- package/layers/core/package.json +1 -1
- package/layers/feeds/app/app.config.ts +23 -0
- package/layers/feeds/app/assets/css/feeds.css +66 -0
- package/layers/feeds/app/plugins/feed-head.ts +73 -0
- package/layers/feeds/nuxt.config.ts +36 -0
- package/layers/feeds/package.json +23 -0
- package/layers/feeds/tsconfig.json +7 -0
- package/layers/forms/app/components/Form/Contact.vue +1 -0
- package/layers/forms/app/components/Form/Field.vue +70 -74
- package/layers/forms/app/composables/useFormSchema.ts +2 -0
- package/layers/forms/app/config/fields.ts +1 -0
- package/layers/forms/app/types/app-config.d.ts +1 -1
- package/layers/forms/app/types/fields.ts +1 -1
- package/layers/forms/nuxt.config.ts +4 -9
- package/layers/forms/package.json +4 -9
- package/layers/layout/app/assets/css/layout/grids.css +12 -12
- package/layers/layout/app/assets/css/layout/modes/fluid.css +10 -10
- package/layers/layout/app/components/Layout/Container.vue +34 -34
- package/layers/layout/app/components/Layout/Grid/Debug.vue +55 -55
- package/layers/layout/app/components/Layout/Grid/Item.vue +239 -231
- package/layers/layout/app/components/Layout/Main.vue +27 -23
- package/layers/layout/app/components/Layout/Page/Container.vue +71 -67
- package/layers/layout/app/components/Layout/Page/Header.vue +22 -21
- package/layers/layout/app/components/Layout/Page/index.vue +1 -0
- package/layers/layout/app/components/Layout/Section/Gallery.vue +49 -48
- package/layers/layout/app/components/Layout/Section/Grid.vue +29 -29
- package/layers/layout/app/components/Layout/Section/Hero.vue +31 -29
- package/layers/layout/app/components/Layout/Section/Sidebar.vue +48 -48
- package/layers/layout/app/components/Layout/Section/Split.vue +28 -28
- package/layers/layout/app/components/Layout/Section/Stack.vue +39 -37
- package/layers/layout/app/components/Layout/Section/Title.vue +21 -20
- package/layers/layout/app/composables/GridPlacement.ts +1 -1
- package/layers/layout/app/composables/useGridConfig.ts +2 -1
- package/layers/layout/app/types/app-config.d.ts +2 -1
- package/layers/layout/app/types/layouts.ts +4 -4
- package/layers/layout/nuxt.config.ts +4 -1
- package/layers/mailer/nuxt.config.ts +26 -0
- package/layers/mailer/package.json +15 -0
- package/layers/mailer/tsconfig.json +7 -0
- package/layers/motion/app/components/Motion/index.vue +5 -5
- package/layers/motion/nuxt.config.ts +6 -22
- package/layers/motion/package.json +0 -5
- package/layers/navigation/app/app.config.ts +38 -0
- package/layers/navigation/app/assets/css/navigation.css +3 -0
- package/layers/navigation/app/components/Links/Group.vue +49 -0
- package/layers/navigation/app/components/Links/Named.vue +33 -0
- package/layers/navigation/app/components/Mast/Footer.vue +13 -0
- package/layers/{ui → navigation}/app/components/Mast/Header.vue +2 -2
- package/layers/{ui → navigation}/app/components/Mast/Nav.vue +2 -2
- package/layers/navigation/app/components/Mast/NavModal.vue +76 -0
- package/layers/{ui → navigation}/app/composables/mastNav.ts +7 -4
- package/layers/{ui → navigation}/app/composables/toast.ts +1 -0
- package/layers/{ui → navigation}/app/composables/useSite.ts +1 -0
- package/layers/navigation/app/types/nav.ts +11 -0
- package/layers/{ui → navigation}/app/utils/createModal.ts +2 -1
- package/layers/navigation/nuxt.config.ts +19 -0
- package/layers/navigation/package.json +6 -0
- package/layers/navigation/tsconfig.json +7 -0
- package/layers/page-transitions/app/app.config.ts +15 -0
- package/layers/page-transitions/app/composables/usePageTransition.ts +32 -0
- package/layers/page-transitions/app/plugins/page-transitions.client.ts +14 -0
- package/layers/page-transitions/nuxt.config.ts +17 -0
- package/layers/page-transitions/package.json +6 -0
- package/layers/page-transitions/tsconfig.json +7 -0
- package/layers/routing/app/composables/{useFeatures.ts → useFeatureFlags.ts} +1 -1
- package/layers/routing/app/composables/useRoutingConfig.ts +5 -6
- package/layers/routing/app/middleware/01.maintenance.global.ts +1 -1
- package/layers/routing/app/middleware/02.governance.global.ts +2 -2
- package/layers/routing/app/plugins/feature-flags.client.ts +4 -4
- package/layers/routing/app/plugins/scroll-routing.client.ts +4 -3
- package/layers/routing/app/types/app-config.d.ts +2 -1
- package/layers/routing/app/types/route-meta.d.ts +1 -1
- package/layers/routing/app/types/routing.ts +5 -2
- package/layers/routing/app/utils/resolveRoute.ts +2 -2
- package/layers/routing/nuxt.config.ts +6 -2
- package/layers/scripts/app/app.config.ts +44 -0
- package/layers/scripts/app/composables/useAnalytics.ts +49 -0
- package/layers/scripts/app/composables/useGtm.ts +21 -0
- package/layers/scripts/app/composables/useScriptLoader.ts +31 -0
- package/layers/scripts/app/composables/useScriptsConsent.ts +23 -0
- package/layers/scripts/app/composables/useYoutubeEmbed.ts +14 -0
- package/layers/scripts/nuxt.config.ts +22 -0
- package/layers/scripts/package.json +14 -0
- package/layers/scripts/tsconfig.json +7 -0
- package/layers/{motion/app/types/app-config.d.ts → scroll/app/app.config.ts} +16 -1
- package/layers/scroll/app/components/Motion/HorizontalScroll.vue +61 -0
- package/layers/scroll/app/components/Motion/Parallax.vue +76 -0
- package/layers/scroll/app/components/Motion/PinnedSection.vue +77 -0
- package/layers/scroll/app/components/Motion/ScrollLink.vue +50 -0
- package/layers/scroll/app/components/Motion/ScrollProgress.vue +85 -0
- package/layers/scroll/app/components/Motion/ScrollScene.vue +121 -0
- package/layers/{motion → scroll}/app/components/Motion/ScrollStats.vue +51 -50
- package/layers/scroll/app/components/Motion/ScrollStep.vue +44 -0
- package/layers/{motion → scroll}/app/composables/useGsap.ts +0 -6
- package/layers/{motion → scroll}/app/composables/useScrollSteps.ts +2 -5
- package/layers/{motion → scroll}/app/composables/useSectionProgress.ts +14 -7
- package/layers/{motion → scroll}/app/composables/useSmoothScroll.ts +6 -37
- package/layers/{motion → scroll}/app/plugins/locomotive-scroll.client.ts +3 -2
- package/layers/scroll/nuxt.config.ts +33 -0
- package/layers/scroll/package.json +11 -0
- package/layers/scroll/tsconfig.json +7 -0
- package/layers/seo/app/app.config.ts +30 -0
- package/layers/seo/app/composables/useSeoConfig.ts +14 -0
- package/layers/seo/nuxt.config.ts +34 -0
- package/layers/seo/package.json +14 -0
- package/layers/seo/tsconfig.json +7 -0
- package/layers/shader/app/components/Effect/Bloom.vue +2 -2
- package/layers/shader/app/components/Effect/ChromaticAberration.vue +2 -2
- package/layers/shader/app/components/Effect/PostProcessing.vue +14 -10
- package/layers/shader/app/components/Material/AmbientAurora.client.vue +162 -158
- package/layers/shader/app/components/Material/AmbientFlow.client.vue +165 -161
- package/layers/shader/app/components/Material/AmbientGradientMesh.client.vue +179 -162
- package/layers/shader/app/components/Material/AmbientNebula.client.vue +167 -163
- package/layers/shader/app/components/Material/AmbientOcean.client.vue +154 -150
- package/layers/shader/app/components/Material/Fresnel.client.vue +78 -75
- package/layers/shader/app/components/Material/Gradient.client.vue +175 -173
- package/layers/shader/app/components/Material/Image.client.vue +228 -225
- package/layers/shader/app/components/Material/Node.client.vue +66 -63
- package/layers/shader/app/components/Material/Noise.client.vue +128 -124
- package/layers/shader/app/components/Mesh/Plane.vue +20 -18
- package/layers/shader/app/components/Node/Color.client.vue +47 -45
- package/layers/shader/app/components/Node/Fresnel.client.vue +47 -47
- package/layers/shader/app/components/Node/Gradient.client.vue +120 -70
- package/layers/shader/app/components/Node/Mix.client.vue +41 -39
- package/layers/shader/app/components/Node/Noise.client.vue +91 -83
- package/layers/shader/app/components/Pipeline/ACESTonemap.client.vue +7 -10
- package/layers/shader/app/components/Pipeline/AddBlend.client.vue +33 -19
- package/layers/shader/app/components/Pipeline/AgedFilm.client.vue +61 -40
- package/layers/shader/app/components/Pipeline/Aurora.client.vue +92 -56
- package/layers/shader/app/components/Pipeline/BilinearGradient.client.vue +65 -34
- package/layers/shader/app/components/Pipeline/BillowNoise.client.vue +56 -32
- package/layers/shader/app/components/Pipeline/BrightnessContrast.client.vue +36 -20
- package/layers/shader/app/components/Pipeline/CellularNoise.client.vue +55 -31
- package/layers/shader/app/components/Pipeline/ChannelMixer.client.vue +62 -34
- package/layers/shader/app/components/Pipeline/ChebyshevNoiseField.client.vue +77 -50
- package/layers/shader/app/components/Pipeline/Checkerboard.client.vue +50 -31
- package/layers/shader/app/components/Pipeline/ChromaticAberration.client.vue +49 -33
- package/layers/shader/app/components/Pipeline/ChromaticScreenWaves.client.vue +61 -36
- package/layers/shader/app/components/Pipeline/Circle.client.vue +53 -30
- package/layers/shader/app/components/Pipeline/Clouds.client.vue +86 -48
- package/layers/shader/app/components/Pipeline/ColorBurnBlend.client.vue +34 -19
- package/layers/shader/app/components/Pipeline/ColorDodgeBlend.client.vue +34 -19
- package/layers/shader/app/components/Pipeline/ColourRamp.client.vue +76 -46
- package/layers/shader/app/components/Pipeline/ComplexPlaneField.client.vue +80 -50
- package/layers/shader/app/components/Pipeline/ConicGradient.client.vue +46 -28
- package/layers/shader/app/components/Pipeline/CosinePalette.client.vue +80 -53
- package/layers/shader/app/components/Pipeline/CoverageAlpha.client.vue +12 -14
- package/layers/shader/app/components/Pipeline/Cross.client.vue +66 -37
- package/layers/shader/app/components/Pipeline/CurlNoise.client.vue +58 -35
- package/layers/shader/app/components/Pipeline/DarkenBlend.client.vue +34 -19
- package/layers/shader/app/components/Pipeline/DayNightCycle.client.vue +65 -39
- package/layers/shader/app/components/Pipeline/Desaturate.client.vue +23 -16
- package/layers/shader/app/components/Pipeline/DiagonalGradient.client.vue +50 -29
- package/layers/shader/app/components/Pipeline/DiamondGradient.client.vue +47 -29
- package/layers/shader/app/components/Pipeline/DifferenceBlend.client.vue +34 -19
- package/layers/shader/app/components/Pipeline/DivideBlend.client.vue +34 -19
- package/layers/shader/app/components/Pipeline/DomainWarpedNoise.client.vue +79 -37
- package/layers/shader/app/components/Pipeline/Dots.client.vue +70 -34
- package/layers/shader/app/components/Pipeline/DuoTone.client.vue +40 -26
- package/layers/shader/app/components/Pipeline/ExclusionBlend.client.vue +38 -19
- package/layers/shader/app/components/Pipeline/ExponentialFog.client.vue +52 -35
- package/layers/shader/app/components/Pipeline/Exposure.client.vue +22 -16
- package/layers/shader/app/components/Pipeline/FBMNoise.client.vue +62 -39
- package/layers/shader/app/components/Pipeline/FilmBurn.client.vue +60 -38
- package/layers/shader/app/components/Pipeline/FilmGrain.client.vue +53 -31
- package/layers/shader/app/components/Pipeline/FisheyeRay.client.vue +39 -28
- package/layers/shader/app/components/Pipeline/Flame.client.vue +59 -35
- package/layers/shader/app/components/Pipeline/FocalGradient.client.vue +56 -33
- package/layers/shader/app/components/Pipeline/Gamma.client.vue +21 -16
- package/layers/shader/app/components/Pipeline/GodRays.client.vue +76 -42
- package/layers/shader/app/components/Pipeline/GradientNoise.client.vue +57 -32
- package/layers/shader/app/components/Pipeline/Grain.client.vue +84 -47
- package/layers/shader/app/components/Pipeline/Grid.client.vue +56 -33
- package/layers/shader/app/components/Pipeline/Halation.client.vue +52 -34
- package/layers/shader/app/components/Pipeline/Halftone.client.vue +34 -23
- package/layers/shader/app/components/Pipeline/HardLightBlend.client.vue +33 -19
- package/layers/shader/app/components/Pipeline/Haze.client.vue +57 -36
- package/layers/shader/app/components/Pipeline/Hexagon.client.vue +54 -31
- package/layers/shader/app/components/Pipeline/Hue.client.vue +20 -16
- package/layers/shader/app/components/Pipeline/Invert.client.vue +6 -10
- package/layers/shader/app/components/Pipeline/LensFlare.client.vue +56 -37
- package/layers/shader/app/components/Pipeline/LightenBlend.client.vue +31 -19
- package/layers/shader/app/components/Pipeline/LinearGradient.client.vue +36 -28
- package/layers/shader/app/components/Pipeline/LinearGradient4.client.vue +65 -43
- package/layers/shader/app/components/Pipeline/LinearToSRGB.client.vue +26 -20
- package/layers/shader/app/components/Pipeline/Marble.client.vue +97 -57
- package/layers/shader/app/components/Pipeline/MixBlend.client.vue +45 -35
- package/layers/shader/app/components/Pipeline/MonochromeTint.client.vue +40 -25
- package/layers/shader/app/components/Pipeline/MultiplyBlend.client.vue +33 -19
- package/layers/shader/app/components/Pipeline/NoisyGradient.client.vue +83 -42
- package/layers/shader/app/components/Pipeline/NoisyGradientBlend.client.vue +141 -81
- package/layers/shader/app/components/Pipeline/OverlayBlend.client.vue +33 -19
- package/layers/shader/app/components/Pipeline/PaperTexture.client.vue +47 -30
- package/layers/shader/app/components/Pipeline/Polygon.client.vue +74 -37
- package/layers/shader/app/components/Pipeline/Posterise.client.vue +21 -16
- package/layers/shader/app/components/Pipeline/RadialGradient.client.vue +45 -30
- package/layers/shader/app/components/Pipeline/RayAutoOrbit.client.vue +43 -30
- package/layers/shader/app/components/Pipeline/RayMouseOrbit.client.vue +60 -47
- package/layers/shader/app/components/Pipeline/RayRotateX.client.vue +28 -20
- package/layers/shader/app/components/Pipeline/RayRotateY.client.vue +28 -20
- package/layers/shader/app/components/Pipeline/RayRotateZ.client.vue +28 -20
- package/layers/shader/app/components/Pipeline/RayTiltBasis.client.vue +55 -34
- package/layers/shader/app/components/Pipeline/RaymarchTunnel.client.vue +132 -88
- package/layers/shader/app/components/Pipeline/Rectangle.client.vue +78 -37
- package/layers/shader/app/components/Pipeline/ReinhardTonemap.client.vue +12 -14
- package/layers/shader/app/components/Pipeline/RidgedNoise.client.vue +54 -31
- package/layers/shader/app/components/Pipeline/Ring.client.vue +69 -34
- package/layers/shader/app/components/Pipeline/RingField.client.vue +63 -43
- package/layers/shader/app/components/Pipeline/RisographGrain.client.vue +66 -32
- package/layers/shader/app/components/Pipeline/RotatedGradientBlend.client.vue +73 -48
- package/layers/shader/app/components/Pipeline/SDFColourMask.client.vue +31 -25
- package/layers/shader/app/components/Pipeline/SDFRadialMask.client.vue +31 -21
- package/layers/shader/app/components/Pipeline/SRGBToLinear.client.vue +25 -20
- package/layers/shader/app/components/Pipeline/Saturation.client.vue +22 -16
- package/layers/shader/app/components/Pipeline/Scanlines.client.vue +42 -26
- package/layers/shader/app/components/Pipeline/ScreenBlend.client.vue +33 -19
- package/layers/shader/app/components/Pipeline/ShaderDebugger.client.vue +58 -45
- package/layers/shader/app/components/Pipeline/SimplexNoise.client.vue +59 -37
- package/layers/shader/app/components/Pipeline/SkyAtmosphere.client.vue +87 -54
- package/layers/shader/app/components/Pipeline/SoftLightBlend.client.vue +33 -19
- package/layers/shader/app/components/Pipeline/SolidColour.client.vue +24 -16
- package/layers/shader/app/components/Pipeline/SplitTone.client.vue +58 -34
- package/layers/shader/app/components/Pipeline/Star.client.vue +73 -37
- package/layers/shader/app/components/Pipeline/Starfield.client.vue +68 -34
- package/layers/shader/app/components/Pipeline/Stripes.client.vue +64 -36
- package/layers/shader/app/components/Pipeline/SubtractBlend.client.vue +33 -19
- package/layers/shader/app/components/Pipeline/TanhTonemap.client.vue +25 -19
- package/layers/shader/app/components/Pipeline/Threshold.client.vue +23 -17
- package/layers/shader/app/components/Pipeline/Tint.client.vue +36 -25
- package/layers/shader/app/components/Pipeline/Triangle.client.vue +54 -31
- package/layers/shader/app/components/Pipeline/UVAspectCorrect.client.vue +5 -10
- package/layers/shader/app/components/Pipeline/UVBreath.client.vue +44 -31
- package/layers/shader/app/components/Pipeline/UVBulge.client.vue +35 -21
- package/layers/shader/app/components/Pipeline/UVClamp.client.vue +14 -14
- package/layers/shader/app/components/Pipeline/UVColumnOffset.client.vue +36 -23
- package/layers/shader/app/components/Pipeline/UVFlipX.client.vue +6 -10
- package/layers/shader/app/components/Pipeline/UVFlipXY.client.vue +6 -10
- package/layers/shader/app/components/Pipeline/UVFlipY.client.vue +6 -10
- package/layers/shader/app/components/Pipeline/UVFractBand.client.vue +31 -21
- package/layers/shader/app/components/Pipeline/UVMousePull.client.vue +41 -33
- package/layers/shader/app/components/Pipeline/UVNoiseRotate.client.vue +65 -46
- package/layers/shader/app/components/Pipeline/UVNoiseWarp.client.vue +49 -30
- package/layers/shader/app/components/Pipeline/UVOrbit.client.vue +37 -29
- package/layers/shader/app/components/Pipeline/UVParallax.client.vue +41 -33
- package/layers/shader/app/components/Pipeline/UVPixelate.client.vue +21 -16
- package/layers/shader/app/components/Pipeline/UVPulse.client.vue +41 -28
- package/layers/shader/app/components/Pipeline/UVRipple.client.vue +53 -29
- package/layers/shader/app/components/Pipeline/UVRotate.client.vue +40 -32
- package/layers/shader/app/components/Pipeline/UVScale.client.vue +33 -25
- package/layers/shader/app/components/Pipeline/UVScroll.client.vue +26 -22
- package/layers/shader/app/components/Pipeline/UVScrollX.client.vue +20 -16
- package/layers/shader/app/components/Pipeline/UVScrollY.client.vue +20 -16
- package/layers/shader/app/components/Pipeline/UVShear.client.vue +33 -20
- package/layers/shader/app/components/Pipeline/UVSineWarpXY.client.vue +58 -40
- package/layers/shader/app/components/Pipeline/UVSwapAxes.client.vue +6 -10
- package/layers/shader/app/components/Pipeline/UVTile.client.vue +26 -22
- package/layers/shader/app/components/Pipeline/UVTwirl.client.vue +31 -21
- package/layers/shader/app/components/Pipeline/UVWarp.client.vue +44 -25
- package/layers/shader/app/components/Pipeline/VHSBleed.client.vue +63 -43
- package/layers/shader/app/components/Pipeline/ValueNoise.client.vue +57 -32
- package/layers/shader/app/components/Pipeline/Vibrance.client.vue +25 -19
- package/layers/shader/app/components/Pipeline/Vignette.client.vue +35 -24
- package/layers/shader/app/components/Pipeline/VoronoiEdges.client.vue +66 -38
- package/layers/shader/app/components/Pipeline/Water.client.vue +78 -39
- package/layers/shader/app/components/Pipeline/WaveBendLayer.client.vue +74 -46
- package/layers/shader/app/components/Pipeline/WaveColourLayer.client.vue +76 -43
- package/layers/shader/app/components/Pipeline/WhiteBalance.client.vue +38 -27
- package/layers/shader/app/components/Pipeline/Wood.client.vue +85 -50
- package/layers/shader/app/components/Preset/Aurora.client.vue +69 -52
- package/layers/shader/app/components/Preset/Flow.client.vue +63 -47
- package/layers/shader/app/components/Preset/GradientMesh.client.vue +63 -47
- package/layers/shader/app/components/Preset/Nebula.client.vue +65 -47
- package/layers/shader/app/components/Preset/Ocean.client.vue +64 -47
- package/layers/shader/app/components/Preset/ThemeAurora.client.vue +107 -70
- package/layers/shader/app/components/Preset/ThemeBubble.client.vue +108 -71
- package/layers/shader/app/components/Preset/ThemeFlow.client.vue +107 -70
- package/layers/shader/app/components/Preset/ThemeGradient.client.vue +108 -71
- package/layers/shader/app/components/Preset/ThemeLavaLamp.client.vue +107 -70
- package/layers/shader/app/components/Preset/ThemePlasma.client.vue +107 -70
- package/layers/shader/app/components/Preset/ThemeWave.client.vue +107 -70
- package/layers/shader/app/components/Shader/Background.client.vue +169 -163
- package/layers/shader/app/components/Shader/Debug.vue +45 -40
- package/layers/shader/app/components/Shader/Host.client.vue +120 -121
- package/layers/shader/app/components/Shader/Material.client.vue +42 -36
- package/layers/shader/app/components/Shader/Pipeline.client.vue +55 -46
- package/layers/shader/app/components/Shader/PipelineContext.vue +12 -12
- package/layers/shader/app/components/Shader/Runtime.client.vue +42 -37
- package/layers/shader/app/composables/useAmbientMaterials.ts +316 -105
- package/layers/shader/app/composables/useCSSColourUniform.ts +7 -6
- package/layers/shader/app/composables/useCSSFloatUniform.ts +4 -5
- package/layers/shader/app/composables/useMousePosition.ts +1 -1
- package/layers/shader/app/composables/useShader.ts +5 -3
- package/layers/shader/app/composables/useShaderColor.ts +8 -1
- package/layers/shader/app/composables/useShaderFloat.ts +3 -1
- package/layers/shader/app/composables/useShaderGraph.ts +6 -3
- package/layers/shader/app/composables/useShaderPerf.ts +2 -3
- package/layers/shader/app/composables/useShaderPipeline.ts +14 -6
- package/layers/shader/app/composables/useShaderRuntime.ts +7 -4
- package/layers/shader/app/composables/useShaderVec2.ts +4 -0
- package/layers/shader/app/composables/useSunDirectionUniform.ts +7 -6
- package/layers/shader/app/composables/useTSLNodes.ts +1 -0
- package/layers/shader/app/composables/useThemeColors.ts +14 -10
- package/layers/shader/app/composables/useUniforms.ts +5 -2
- package/layers/shader/app/plugins/shader.client.ts +3 -2
- package/layers/shader/app/shaders/common/blend.ts +3 -0
- package/layers/shader/app/shaders/common/complex.ts +4 -5
- package/layers/shader/app/shaders/common/effects.ts +10 -6
- package/layers/shader/app/shaders/common/grain.ts +4 -0
- package/layers/shader/app/shaders/common/lighting.ts +4 -1
- package/layers/shader/app/shaders/common/math.ts +3 -0
- package/layers/shader/app/shaders/common/noise.ts +7 -4
- package/layers/shader/app/shaders/common/noiseHelpers.ts +2 -0
- package/layers/shader/app/shaders/common/palette.ts +6 -1
- package/layers/shader/app/shaders/common/patterns.ts +7 -4
- package/layers/shader/app/shaders/common/sdf.ts +3 -1
- package/layers/shader/app/shaders/common/shapes.ts +3 -0
- package/layers/shader/app/shaders/common/tonemapping.ts +2 -0
- package/layers/shader/app/shaders/common/uv.ts +8 -1
- package/layers/shader/app/shaders/createMaterial.ts +6 -2
- package/layers/shader/app/shaders/layers/aurora.ts +6 -3
- package/layers/shader/app/shaders/layers/meshGradient.ts +6 -3
- package/layers/shader/app/shaders/layers/paperShading.ts +6 -2
- package/layers/shader/app/shaders/layers/shaderGradient.ts +5 -0
- package/layers/shader/app/shaders/layers/stripe.ts +6 -3
- package/layers/shader/app/shaders/types.ts +1 -0
- package/layers/shader/app/types/app-config.d.ts +1 -1
- package/layers/shader/app/types/index.ts +4 -4
- package/layers/shader/app/types/materials.ts +5 -4
- package/layers/shader/app/types/renderer.ts +1 -50
- package/layers/shader/app/types/tsl.ts +4 -3
- package/layers/shader/app/types/uniforms.ts +3 -2
- package/layers/shader/app/utils/tsl/animation.ts +2 -0
- package/layers/shader/app/utils/tsl/color.ts +5 -2
- package/layers/shader/app/utils/tsl/math.ts +1 -0
- package/layers/shader/app/utils/tsl/noise.ts +2 -0
- package/layers/shader/app/utils/tsl/oklch.ts +2 -0
- package/layers/shader/app/utils/tsl/patterns.ts +2 -0
- package/layers/shader/app/utils/tsl/tween.ts +4 -2
- package/layers/shader/app/utils/tsl/uv.ts +2 -0
- package/layers/shader/nuxt.config.ts +8 -115
- package/layers/shader/package.json +3 -9
- package/layers/theme/app/assets/css/theme.css +2 -2
- package/layers/theme/app/components/ThemePicker/AccentButton.vue +32 -30
- package/layers/theme/app/components/ThemePicker/Colors.vue +6 -5
- package/layers/theme/app/components/ThemePicker/Menu.vue +23 -23
- package/layers/theme/app/composables/useAccentColor.ts +2 -1
- package/layers/theme/app/composables/useThemeContrast.ts +1 -1
- package/layers/theme/app/composables/useThemeMotion.ts +1 -1
- package/layers/theme/app/composables/useThemeTransparency.ts +1 -4
- package/layers/theme/app/plugins/theme.client.ts +33 -15
- package/layers/theme/app/types/app-config.d.ts +3 -2
- package/layers/theme/app/types/theme.ts +1 -1
- package/layers/theme/nuxt.config.ts +4 -1
- package/layers/transitions/app/components/Motion/Transition.vue +76 -0
- package/layers/transitions/nuxt.config.ts +19 -0
- package/layers/transitions/package.json +6 -0
- package/layers/transitions/tsconfig.json +7 -0
- package/layers/typography/app/components/Typography/CodeBlock.vue +44 -0
- package/layers/typography/app/components/Typography/Headline.vue +90 -0
- package/layers/typography/app/components/Typography/HeadlineScreen.vue +75 -0
- package/layers/typography/app/components/Typography/QuoteBlock.vue +21 -0
- package/layers/{ui → typography}/app/components/Typography/TextStroke.vue +33 -32
- package/layers/typography/app/components/Typography/index.vue +54 -0
- package/layers/{ui → typography}/app/composables/typography.ts +1 -0
- package/layers/{ui → typography}/app/types/typography.ts +1 -1
- package/layers/typography/nuxt.config.ts +17 -0
- package/layers/typography/package.json +6 -0
- package/layers/typography/tsconfig.json +7 -0
- package/layers/ui/app/assets/css/ui.css +0 -20
- package/layers/ui/nuxt.config.ts +5 -21
- package/layers/visual/app/app.config.ts +115 -0
- package/layers/visual/app/assets/css/visual.css +15 -0
- package/layers/visual/app/components/Accent/Blob.vue +32 -0
- package/layers/{ui → visual}/app/components/Accent/Scene.vue +26 -23
- package/layers/visual/app/components/Base/Modal.vue +123 -0
- package/layers/visual/app/components/Gradient/Background.vue +24 -0
- package/layers/visual/app/components/Gradient/Text.vue +24 -0
- package/layers/visual/app/components/Media/Picture.vue +51 -0
- package/layers/visual/app/components/Progress/Bar.vue +36 -0
- package/layers/{ui → visual}/app/components/Progress/Circular.vue +26 -25
- package/layers/visual/app/components/Tint/Overlay.vue +27 -0
- package/layers/{ui → visual}/app/composables/accent.ts +1 -0
- package/layers/{ui → visual}/app/composables/gradient.ts +3 -0
- package/layers/{ui → visual}/app/composables/picture.ts +2 -0
- package/layers/{ui → visual}/app/composables/tint.ts +3 -2
- package/layers/{ui → visual}/app/types/accent.ts +2 -2
- package/layers/{ui → visual}/app/types/gradient.ts +2 -2
- package/layers/{ui → visual}/app/types/media.ts +4 -3
- package/layers/{ui → visual}/app/types/tint.ts +1 -1
- package/layers/visual/nuxt.config.ts +19 -0
- package/layers/visual/package.json +6 -0
- package/layers/visual/tsconfig.json +7 -0
- package/package.json +32 -6
- package/layers/motion/app/app.config.ts +0 -27
- package/layers/motion/app/components/Motion/HorizontalScroll.vue +0 -61
- package/layers/motion/app/components/Motion/Parallax.vue +0 -75
- package/layers/motion/app/components/Motion/PinnedSection.vue +0 -77
- package/layers/motion/app/components/Motion/ScrollLink.vue +0 -49
- package/layers/motion/app/components/Motion/ScrollProgress.vue +0 -82
- package/layers/motion/app/components/Motion/ScrollScene.vue +0 -121
- package/layers/motion/app/components/Motion/ScrollStep.vue +0 -45
- package/layers/motion/app/components/Motion/Transition.vue +0 -76
- package/layers/shader/app/components/Shader/Canvas.vue +0 -121
- package/layers/ui/app/app.config.ts +0 -57
- package/layers/ui/app/components/Accent/Blob.vue +0 -29
- package/layers/ui/app/components/Base/Modal.vue +0 -111
- package/layers/ui/app/components/Gradient/Background.vue +0 -22
- package/layers/ui/app/components/Gradient/Text.vue +0 -22
- package/layers/ui/app/components/Links/Group.vue +0 -47
- package/layers/ui/app/components/Links/Named.vue +0 -31
- package/layers/ui/app/components/Mast/Footer.vue +0 -15
- package/layers/ui/app/components/Mast/NavModal.vue +0 -72
- package/layers/ui/app/components/Media/Picture.vue +0 -50
- package/layers/ui/app/components/Progress/Bar.vue +0 -35
- package/layers/ui/app/components/Tint/Overlay.vue +0 -25
- package/layers/ui/app/components/Typography/CodeBlock.vue +0 -42
- package/layers/ui/app/components/Typography/Headline.vue +0 -88
- package/layers/ui/app/components/Typography/HeadlineScreen.vue +0 -77
- package/layers/ui/app/components/Typography/QuoteBlock.vue +0 -20
- package/layers/ui/app/components/Typography/index.vue +0 -52
- package/layers/ui/app/types/app-config.d.ts +0 -22
- package/layers/ui/app/types/nav.ts +0 -5
- /package/layers/{motion → animations}/app/components/Motion/CountUp.vue +0 -0
- /package/layers/{motion → animations}/app/components/Motion/Cursor.vue +0 -0
- /package/layers/{motion → animations}/app/components/Motion/Magnetic.vue +0 -0
- /package/layers/{motion → animations}/app/components/Motion/Marquee.vue +0 -0
- /package/layers/{motion → animations}/app/components/Motion/MarqueeText.vue +0 -0
- /package/layers/{motion → animations}/app/components/Motion/Staggered.vue +0 -0
- /package/layers/{motion → animations}/app/components/Motion/TextReveal.vue +0 -0
- /package/layers/{motion → animations}/app/components/Motion/Tilt.vue +0 -0
- /package/layers/{motion → animations}/app/components/Motion/VelocityEffect.vue +0 -0
- /package/layers/{motion → animations}/app/composables/useCountUp.ts +0 -0
- /package/layers/{motion → animations}/app/composables/useCursorFollower.ts +0 -0
- /package/layers/{motion → animations}/app/composables/useMagneticElement.ts +0 -0
- /package/layers/{motion → animations}/app/composables/useMarqueeCopies.ts +0 -0
- /package/layers/{motion → animations}/app/composables/useMarqueeVelocity.ts +0 -0
- /package/layers/{motion → animations}/app/composables/useTiltEffect.ts +0 -0
- /package/layers/{ui → navigation}/app/components/Mast/Main.vue +0 -0
- /package/layers/{ui → navigation}/app/components/Site/Subtitle.vue +0 -0
- /package/layers/{ui → navigation}/app/components/Site/Title.vue +0 -0
- /package/layers/{ui → navigation}/app/utils/regex.ts +0 -0
- /package/layers/{motion/app/assets/css/motion.css → transitions/app/assets/css/transitions.css} +0 -0
- /package/layers/{ui → typography}/app/composables/color.ts +0 -0
- /package/layers/{ui → typography}/app/types/colors.ts +0 -0
- /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'
|
|
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
|
-
|
|
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
|
-
|
|
133
|
+
|
|
139
134
|
console.log('[Core Layer] Environment config loaded:', {
|
|
140
|
-
hasPublicConfig:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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
|
|
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
|
+
}
|
package/layers/core/package.json
CHANGED
|
@@ -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
|
+
}
|